<?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>200270</bug_id>
          
          <creation_ts>2019-07-30 09:20:07 -0700</creation_ts>
          <short_desc>[FTW] Refactor Direct2D code to follow Cairo&apos;s model to support modern WebKit</short_desc>
          <delta_ts>2019-07-30 15:37:19 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>Safari 10</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>161817</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Brent Fulgham">bfulgham</reporter>
          <assigned_to name="Brent Fulgham">bfulgham</assigned_to>
          <cc>achristensen</cc>
    
    <cc>bfulgham</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dino</cc>
    
    <cc>don.olmstead</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>fujii</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1556972</commentid>
    <comment_count>0</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2019-07-30 09:20:07 -0700</bug_when>
    <thetext>Refactor the Direct2D code to separate the core drawing routines into helper functions that can be used by GraphicsContext and GraphicsContextImpl.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557042</commentid>
    <comment_count>1</comment_count>
      <attachid>375169</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2019-07-30 12:34:45 -0700</bug_when>
    <thetext>Created attachment 375169
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557043</commentid>
    <comment_count>2</comment_count>
    <who name="EWS Watchlist">ews-watchlist</who>
    <bug_when>2019-07-30 12:38:26 -0700</bug_when>
    <thetext>Attachment 375169 did not pass style-queue:


ERROR: Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:68:  Should have a space between // and comment  [whitespace/comments] [4]
Total errors found: 1 in 33 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557049</commentid>
    <comment_count>3</comment_count>
      <attachid>375171</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2019-07-30 13:15:16 -0700</bug_when>
    <thetext>Created attachment 375171
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557052</commentid>
    <comment_count>4</comment_count>
      <attachid>375171</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2019-07-30 13:27:31 -0700</bug_when>
    <thetext>Comment on attachment 375171
Patch

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

rs=me assuming you don&apos;t land those settings changes.

&gt; Source/WebCore/page/Settings.yaml:148
&gt; -  initial: false
&gt; +  initial: true
&gt;    onChange: setNeedsRecalcStyleInAllFrames
&gt;  showRepaintCounter:
&gt; -  initial: false
&gt; +  initial: true
&gt;    onChange: setNeedsRecalcStyleInAllFrames
&gt;  visibleDebugOverlayRegions:
&gt;    type: DebugOverlayRegions
&gt;    initial: 0
&gt;  showTiledScrollingIndicator:
&gt; -  initial: false
&gt; +  initial: true

I really think you don&apos;t want this!!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557054</commentid>
    <comment_count>5</comment_count>
      <attachid>375172</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2019-07-30 13:32:54 -0700</bug_when>
    <thetext>Created attachment 375172
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557057</commentid>
    <comment_count>6</comment_count>
      <attachid>375172</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2019-07-30 13:41:27 -0700</bug_when>
    <thetext>Comment on attachment 375172
Patch

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

&gt; Source/WebCore/platform/graphics/win/BackingStoreBackendDirect2D.h:57
&gt; +    void* m_surfaceBackingData;

This needs a default initializer, and maybe it should go in the impl.

&gt; Source/WebCore/platform/graphics/win/BackingStoreBackendDirect2DImpl.cpp:43
&gt; +static COMPtr&lt;IWICBitmap&gt; createDirect2DImageSurfaceWithFastMalloc(const IntSize&amp; size, double deviceScaleFactor, void*&amp; backingStoreData)

I think it would be nicer if this returned a std::pair&lt;COMPtr&lt;IWICBitmap&gt;, void*&gt;

&gt; Source/WebCore/platform/graphics/win/BackingStoreBackendDirect2DImpl.h:47
&gt; +    void* m_scrollSurfaceBackingData;

{ nullptr }

&gt; Source/WebCore/platform/graphics/win/GraphicsContextPlatformPrivateDirect2D.h:78
&gt; +    PlatformContextDirect2D* platformContext() { return &amp;m_platformContext; }

Why not just return a PlatformContextDirect2D&amp; ?

&gt; Source/WebCore/platform/graphics/win/PlatformContextDirect2D.cpp:89
&gt; +\    // We must call savePlatformState at least once before we can use image masking,

You probably don&apos;t want this \

&gt; Source/WebCore/platform/graphics/win/PlatformContextDirect2D.h:123
&gt; +    State* m_state;

{ nullptr }

&gt; Source/WebCore/platform/win/DragImageWin.cpp:176
&gt; +    ASSERT(0);

notImplemented()?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557062</commentid>
    <comment_count>7</comment_count>
      <attachid>375172</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2019-07-30 14:02:24 -0700</bug_when>
    <thetext>Comment on attachment 375172
Patch

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

&gt;&gt; Source/WebCore/platform/win/DragImageWin.cpp:176
&gt;&gt; +    ASSERT(0);
&gt; 
&gt; notImplemented()?

No! This should be uncommented. I&apos;ll fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557084</commentid>
    <comment_count>8</comment_count>
      <attachid>375182</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2019-07-30 14:52:12 -0700</bug_when>
    <thetext>Created attachment 375182
Patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557102</commentid>
    <comment_count>9</comment_count>
      <attachid>375182</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-07-30 15:36:22 -0700</bug_when>
    <thetext>Comment on attachment 375182
Patch for landing

Clearing flags on attachment: 375182

Committed r248020: &lt;https://trac.webkit.org/changeset/248020&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557103</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-07-30 15:36:23 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557104</commentid>
    <comment_count>11</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2019-07-30 15:37:19 -0700</bug_when>
    <thetext>&lt;rdar://problem/53731210&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>375169</attachid>
            <date>2019-07-30 12:34:45 -0700</date>
            <delta_ts>2019-07-30 13:15:15 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-200270-20190730123441.patch</filename>
            <type>text/plain</type>
            <size>207915</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0ODAwOSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ2IEBACisyMDE5LTA3LTMwICBCcmVudCBG
dWxnaGFtICA8YmZ1bGdoYW1AYXBwbGUuY29tPgorCisgICAgICAgIFtGVFddIFJlZmFjdG9yIERp
cmVjdDJEIGNvZGUgdG8gZm9sbG93IENhaXJvJ3MgbW9kZWwgdG8gc3VwcG9ydCBtb2Rlcm4gV2Vi
S2l0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDAy
NzAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBSZWZh
Y3RvciB0aGUgRGlyZWN0MkQgY29kZSBpbiBXZWJDb3JlIHNvIHRoYXQgdGhlIGNvcmUgcm91dGlu
ZXMgY2FuIGJlIHNoYXJlZAorICAgICAgICBiZXR3ZWVuIEdyYXBoaWNzQ29udGV4dCBhbmQgR3Jh
cGhpY3NDb250ZXh0SW1wbC4gSW1wbGVtZW50IFBsYXRmb3JtQ29udGV4dCwKKyAgICAgICAgQmFj
a2luZ1N0b3JlQmFja2VuZCwgYW5kIEdyYXBoaWNzQ29udGV4dEltcGwgZm9yIHRoZSBEaXJlY3Qy
RCBlbmdpbmUuCisgICAgICAgCisgICAgICAgIFRoaXMgcGF0Y2ggZWZmZWN0aXZlbHkganVzdCBt
b3ZlcyBjb2RlIGFyb3VuZC4KKworICAgICAgICAqIFBsYXRmb3JtRlRXLmNtYWtlOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dEltcGwuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9JbWFnZVNvdXJjZS5jcHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvUGF0
dGVybi5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5
TGlzdFJlY29yZGVyLmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlz
dHMvRGlzcGxheUxpc3RSZWNvcmRlci5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2VuZERp
cmVjdDJESW1wbC5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRGly
ZWN0MkRPcGVyYXRpb25zLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0RpcmVjdDJET3BlcmF0aW9ucy5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy93aW4vRGlyZWN0MkRVdGlsaXRpZXMuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vRGlyZWN0MkRVdGlsaXRpZXMuaDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYXNjYWRlRGlyZWN0MkQuY3BwOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFkaWVudERpcmVjdDJELmNwcDoKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0RGlyZWN0MkQuY3BwOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0SW1w
bERpcmVjdDJELmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5oOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRhdGFEaXJlY3QyRC5oOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRpcmVjdDJELmNwcDoKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW4vTmF0aXZlSW1hZ2VEaXJlY3QyRC5jcHA6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL1BhdGhEaXJlY3QyRC5jcHA6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL1BhdHRlcm5EaXJlY3QyRC5jcHA6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL1BsYXRmb3JtQ29udGV4dERpcmVjdDJELmNwcDogQWRkZWQuCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BsYXRmb3JtQ29udGV4dERpcmVjdDJELmg6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwOgorICAgICAgICAqIHN2Zy9n
cmFwaGljcy9TVkdJbWFnZS5jcHA6CisKIDIwMTktMDctMzAgIE1pY2hhZWwgQ2F0YW56YXJvICA8
bWNhdGFuemFyb0BpZ2FsaWEuY29tPgogCiAgICAgICAgIFtHVEtdIENvbXBpbGF0aW9uIGVycm9y
cyB3aGVuIEdMIGlzIGRpc2FibGVkCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUZUVy5j
bWFrZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUZUVy5jbWFrZQkocmV2
aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvUGxhdGZvcm1GVFcuY21ha2UJKHdvcmtp
bmcgY29weSkKQEAgLTQ1LDYgKzQ1LDcgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9TT1VSQ0VTCiAK
ICAgICBwbGF0Zm9ybS9ncmFwaGljcy9HTENvbnRleHQuY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhp
Y3MvR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlLmNwcAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dy
YXBoaWNzQ29udGV4dEltcGwuY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvUGxhdGZvcm1EaXNw
bGF5LmNwcAogCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvZWdsL0dMQ29udGV4dEVHTC5jcHAKQEAg
LTU3LDkgKzU4LDEyIEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09VUkNFUwogCiAgICAgcGxhdGZv
cm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVVdGlsaXRpZXMuY3BwCiAKKyAgICBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbC5jcHAKICAgICBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vQ29sb3JEaXJlY3QyRC5jcHAKICAgICBwbGF0Zm9ybS9ncmFw
aGljcy93aW4vQ29tcGxleFRleHRDb250cm9sbGVyRGlyZWN0V3JpdGUuY3BwCiAgICAgcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0RJQlBpeGVsRGF0YS5jcHAKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy93
aW4vRGlyZWN0MkRPcGVyYXRpb25zLmNwcAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJl
Y3QyRFV0aWxpdGllcy5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRmxvYXRQb2ludERp
cmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9GbG9hdFJlY3REaXJlY3QyRC5j
cHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRmxvYXRTaXplRGlyZWN0MkQuY3BwCkBAIC03
Myw2ICs3Nyw3IEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09VUkNFUwogICAgIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9HcmFkaWVudERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9HcmFwaGljc0NvbnRleHQzRERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9HcmFwaGljc0NvbnRleHREaXJlY3QyRC5jcHAKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9HcmFwaGljc0NvbnRleHRXaW4uY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ljb25X
aW4uY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQnVmZmVyRGF0YURpcmVjdDJE
LmNwcApAQCAtODcsNiArOTIsNyBAQCBsaXN0KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vTmF0aXZlSW1hZ2VEaXJlY3QyRC5jcHAKICAgICBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vUGF0aERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9QYXR0ZXJuRGlyZWN0MkQuY3BwCisgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BsYXRmb3Jt
Q29udGV4dERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250
RGF0YVdpbi5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFEaXJl
Y3QyRC5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vVGV4dEFuYWx5emVySGVscGVyLmNw
cApAQCAtMTQ5LDEyICsxNTUsMTkgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9QUklWQVRFX0ZSQU1F
V09SS19IRQogCiAgICAgcGFnZS93aW4vRnJhbWVXaW4uaAogCisgICAgcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyRC5oCisgICAgcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwuaAogICAgIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9ESUJQaXhlbERhdGEuaAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJl
Y3QyRE9wZXJhdGlvbnMuaAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJlY3QyRFV0aWxp
dGllcy5oCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Z1bGxTY3JlZW5Db250cm9sbGVyLmgK
ICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRnVsbFNjcmVlbkNvbnRyb2xsZXJDbGllbnQuaAor
ICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQuaAog
ICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRhdGFEaXJlY3QyRC5oCisgICAg
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlRGVjb2RlckRpcmVjdDJELmgKICAgICBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vTG9jYWxXaW5kb3dzQ29udGV4dC5oCiAgICAgcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL01lZGlhUGxheWVyUHJpdmF0ZUZ1bGxzY3JlZW5XaW5kb3cuaAorICAgIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9QbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oCiAgICAgcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL1NoYXJlZEdESU9iamVjdC5oCiAKICAgICBwbGF0Zm9ybS93aW4vQlN0cmluZy5o
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL1NldHRpbmdzLnlhbWwKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGFnZS9TZXR0aW5ncy55YW1sCShyZXZpc2lvbiAyNDgwMDgpCisrKyBT
b3VyY2UvV2ViQ29yZS9wYWdlL1NldHRpbmdzLnlhbWwJKHdvcmtpbmcgY29weSkKQEAgLTEzNiwx
NiArMTM2LDE2IEBAIGFjY2VsZXJhdGVkQ29tcG9zaXRlZEFuaW1hdGlvbnNFbmFibGVkOgogICBp
bml0aWFsOiB0cnVlCiAgIG9uQ2hhbmdlOiBzZXROZWVkc1JlY2FsY1N0eWxlSW5BbGxGcmFtZXMK
IHNob3dEZWJ1Z0JvcmRlcnM6Ci0gIGluaXRpYWw6IGZhbHNlCisgIGluaXRpYWw6IHRydWUKICAg
b25DaGFuZ2U6IHNldE5lZWRzUmVjYWxjU3R5bGVJbkFsbEZyYW1lcwogc2hvd1JlcGFpbnRDb3Vu
dGVyOgotICBpbml0aWFsOiBmYWxzZQorICBpbml0aWFsOiB0cnVlCiAgIG9uQ2hhbmdlOiBzZXRO
ZWVkc1JlY2FsY1N0eWxlSW5BbGxGcmFtZXMKIHZpc2libGVEZWJ1Z092ZXJsYXlSZWdpb25zOgog
ICB0eXBlOiBEZWJ1Z092ZXJsYXlSZWdpb25zCiAgIGluaXRpYWw6IDAKIHNob3dUaWxlZFNjcm9s
bGluZ0luZGljYXRvcjoKLSAgaW5pdGlhbDogZmFsc2UKKyAgaW5pdGlhbDogdHJ1ZQogcmVzb3Vy
Y2VVc2FnZU92ZXJsYXlWaXNpYmxlOgogICBpbml0aWFsOiBmYWxzZQogICBvbkNoYW5nZTogcmVz
b3VyY2VVc2FnZU92ZXJsYXlWaXNpYmxlQ2hhbmdlZApAQCAtNjk0LDcgKzY5NCw3IEBAIGphdmFF
bmFibGVkRm9yTG9jYWxGaWxlczoKICMgVW5saWtlIHRoZSBpbWFnZXNFbmFibGVkIHNldHRpbmcs
IHRoaXMgb25seSBzdXBwcmVzc2VzIHRoZSBuZXR3b3JrIGxvYWQgb2YKICMgdGhlIGltYWdlIFVS
TC4gQSBjYWNoZWQgaW1hZ2Ugd2lsbCBzdGlsbCBiZSByZW5kZXJlZCBpZiByZXF1ZXN0ZWQuCiBs
b2Fkc0ltYWdlc0F1dG9tYXRpY2FsbHk6Ci0gIGluaXRpYWw6IGZhbHNlCisgIGluaXRpYWw6IHRy
dWUKICAgb25DaGFuZ2U6IGltYWdlc0VuYWJsZWRDaGFuZ2VkCiBpbWFnZXNFbmFibGVkOgogICBp
bml0aWFsOiB0cnVlCkBAIC03MDIsNyArNzAyLDcgQEAgaW1hZ2VzRW5hYmxlZDoKICAgb25DaGFu
Z2U6IGltYWdlc0VuYWJsZWRDaGFuZ2VkCiAgIGluc3BlY3Rvck92ZXJyaWRlOiB0cnVlCiBzY3Jp
cHRFbmFibGVkOgotICBpbml0aWFsOiBmYWxzZQorICBpbml0aWFsOiB0cnVlCiAgIGdldHRlcjog
aXNTY3JpcHRFbmFibGVkCiAgIGluc3BlY3Rvck92ZXJyaWRlOiB0cnVlCiBwbHVnaW5zRW5hYmxl
ZDoKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzQ29udGV4dC5oCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaAkod29ya2luZyBjb3B5KQpAQCAtNDQsNyArNDQs
MTAgQEAgaW50ZXJmYWNlIElEMkQxRENSZW5kZXJUYXJnZXQ7CiBpbnRlcmZhY2UgSUQyRDFSZW5k
ZXJUYXJnZXQ7CiBpbnRlcmZhY2UgSUQyRDFGYWN0b3J5OwogaW50ZXJmYWNlIElEMkQxU29saWRD
b2xvckJydXNoOwotdHlwZWRlZiBJRDJEMVJlbmRlclRhcmdldCBQbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dDsKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
OworfQordHlwZWRlZiBXZWJDb3JlOjpQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCBQbGF0Zm9ybUdy
YXBoaWNzQ29udGV4dDsKICNlbGlmIFVTRShDQUlSTykKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNs
YXNzIFBsYXRmb3JtQ29udGV4dENhaXJvOwpAQCAtMzQ3LDEwICszNTAsNiBAQCBwdWJsaWM6CiAg
ICAgV0VCQ09SRV9FWFBPUlQgdm9pZCBkcmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0aXZlSW1hZ2VQ
dHImLCBjb25zdCBGbG9hdFNpemUmIHNlbGZTaXplLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0
LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yID0gQ29tcG9zaXRl
U291cmNlT3ZlciwgQmxlbmRNb2RlID0gQmxlbmRNb2RlOjpOb3JtYWwsIEltYWdlT3JpZW50YXRp
b24gPSBJbWFnZU9yaWVudGF0aW9uKCkpOwogI2VuZGlmCiAKLSNpZiBVU0UoRElSRUNUMkQpCi0g
ICAgdm9pZCBkcmF3RGV2aWNlQml0bWFwKGNvbnN0IENPTVB0cjxJRDJEMUJpdG1hcD4mLCBjb25z
dCBGbG9hdFNpemUmIHNlbGZTaXplLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBG
bG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yID0gQ29tcG9zaXRlU291cmNlT3Zl
ciwgQmxlbmRNb2RlID0gQmxlbmRNb2RlOjpOb3JtYWwsIEltYWdlT3JpZW50YXRpb24gPSBJbWFn
ZU9yaWVudGF0aW9uKCkpOwotI2VuZGlmCi0KICNpZiBVU0UoQ0cpIHx8IFVTRShESVJFQ1QyRCkK
ICAgICB2b2lkIGFwcGx5U3Ryb2tlUGF0dGVybigpOwogICAgIHZvaWQgYXBwbHlGaWxsUGF0dGVy
bigpOwpAQCAtNjE5LDkgKzYxOCw3IEBAIHByaXZhdGU6CiAKICNpZiBVU0UoRElSRUNUMkQpCiAg
ICAgdm9pZCBwbGF0Zm9ybUluaXQoSERDLCBJRDJEMVJlbmRlclRhcmdldCoqLCBSRUNULCBib29s
IGhhc0FscGhhID0gZmFsc2UpOwotICAgIHZvaWQgcGxhdGZvcm1Jbml0KFBsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0KiwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUpOwotICAgIHZvaWQgZHJhd1dp
dGhvdXRTaGFkb3coY29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ1JlY3QsIGNvbnN0IFdURjo6RnVu
Y3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiYpOwotICAgIHZvaWQgZHJhd1dpdGhTaGFk
b3coY29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ1JlY3QsIGNvbnN0IFdURjo6RnVuY3Rpb248dm9p
ZChJRDJEMVJlbmRlclRhcmdldCopPiYpOworICAgIHZvaWQgcGxhdGZvcm1Jbml0KFBsYXRmb3Jt
Q29udGV4dERpcmVjdDJEKiwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUpOwogI2VuZGlmCiAK
ICAgICB2b2lkIHNhdmVQbGF0Zm9ybVN0YXRlKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHRJbXBsLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0SW1wbC5oCShyZXZpc2lv
biAyNDgwMDgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0Nv
bnRleHRJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTcxLDcgKzcxLDcgQEAgcHVibGljOgogICAg
IHZpcnR1YWwgSW1hZ2VEcmF3UmVzdWx0IGRyYXdJbWFnZShJbWFnZSYsIGNvbnN0IEZsb2F0UmVj
dCYgZGVzdGluYXRpb24sIGNvbnN0IEZsb2F0UmVjdCYgc291cmNlLCBjb25zdCBJbWFnZVBhaW50
aW5nT3B0aW9ucyYpID0gMDsKICAgICB2aXJ0dWFsIEltYWdlRHJhd1Jlc3VsdCBkcmF3VGlsZWRJ
bWFnZShJbWFnZSYsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdGluYXRpb24sIGNvbnN0IEZsb2F0UG9p
bnQmIHNvdXJjZSwgY29uc3QgRmxvYXRTaXplJiB0aWxlU2l6ZSwgY29uc3QgRmxvYXRTaXplJiBz
cGFjaW5nLCBjb25zdCBJbWFnZVBhaW50aW5nT3B0aW9ucyYpID0gMDsKICAgICB2aXJ0dWFsIElt
YWdlRHJhd1Jlc3VsdCBkcmF3VGlsZWRJbWFnZShJbWFnZSYsIGNvbnN0IEZsb2F0UmVjdCYgZGVz
dGluYXRpb24sIGNvbnN0IEZsb2F0UmVjdCYgc291cmNlLCBjb25zdCBGbG9hdFNpemUmIHRpbGVT
Y2FsZUZhY3RvciwgSW1hZ2U6OlRpbGVSdWxlIGhSdWxlLCBJbWFnZTo6VGlsZVJ1bGUgdlJ1bGUs
IGNvbnN0IEltYWdlUGFpbnRpbmdPcHRpb25zJikgPSAwOwotI2lmIFVTRShDRykgfHwgVVNFKENB
SVJPKQorI2lmIFVTRShDRykgfHwgVVNFKENBSVJPKSB8fCBVU0UoRElSRUNUMkQpCiAgICAgdmly
dHVhbCB2b2lkIGRyYXdOYXRpdmVJbWFnZShjb25zdCBOYXRpdmVJbWFnZVB0ciYsIGNvbnN0IEZs
b2F0U2l6ZSYgc2VsZlNpemUsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0
UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSwgSW1hZ2VPcmllbnRh
dGlvbikgPSAwOwogI2VuZGlmCiAgICAgdmlydHVhbCB2b2lkIGRyYXdQYXR0ZXJuKEltYWdlJiwg
Y29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25z
dCBBZmZpbmVUcmFuc2Zvcm0mLCBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgY29uc3QgRmxvYXRT
aXplJiBzcGFjaW5nLCBDb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlID0gQmxlbmRNb2RlOjpO
b3JtYWwpID0gMDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ltYWdl
U291cmNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9JbWFnZVNvdXJjZS5jcHAJKHJldmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0ltYWdlU291cmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzgsNiAr
MzgsNyBAQAogCiAjaWYgVVNFKERJUkVDVDJEKQogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5o
IgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCiAjZW5kaWYKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewpAQCAtNjYxLDcgKzY2Miw3IEBAIEltYWdlT3JpZW50YXRpb24gSW1hZ2VT
b3VyY2U6OmZyYW1lT3JpZW4KIHZvaWQgSW1hZ2VTb3VyY2U6OnNldFRhcmdldENvbnRleHQoY29u
c3QgR3JhcGhpY3NDb250ZXh0KiB0YXJnZXRDb250ZXh0KQogewogICAgIGlmIChpc0RlY29kZXJB
dmFpbGFibGUoKSAmJiB0YXJnZXRDb250ZXh0KQotICAgICAgICBtX2RlY29kZXItPnNldFRhcmdl
dENvbnRleHQodGFyZ2V0Q29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCkpOworICAgICAgICBtX2Rl
Y29kZXItPnNldFRhcmdldENvbnRleHQodGFyZ2V0Q29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCkt
PnJlbmRlclRhcmdldCgpKTsKIH0KICNlbmRpZgogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9QYXR0ZXJuLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvUGF0dGVybi5oCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9QYXR0ZXJuLmgJKHdvcmtpbmcgY29weSkKQEAgLTM4LDYg
KzM4LDEwIEBAIHR5cGVkZWYgQ0dQYXR0ZXJuUmVmIFBsYXRmb3JtUGF0dGVyblB0cjsKICNlbGlm
IFVTRShESVJFQ1QyRCkKIGludGVyZmFjZSBJRDJEMUJpdG1hcEJydXNoOwogdHlwZWRlZiBJRDJE
MUJpdG1hcEJydXNoKiBQbGF0Zm9ybVBhdHRlcm5QdHI7CituYW1lc3BhY2UgV2ViQ29yZSB7Citj
bGFzcyBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDsKK30KK3R5cGVkZWYgV2ViQ29yZTo6UGxhdGZv
cm1Db250ZXh0RGlyZWN0MkQgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQ7CiAjZWxpZiBVU0UoQ0FJ
Uk8pCiB0eXBlZGVmIHN0cnVjdCBfY2Fpcm9fcGF0dGVybiBjYWlyb19wYXR0ZXJuX3Q7CiB0eXBl
ZGVmIGNhaXJvX3BhdHRlcm5fdCogUGxhdGZvcm1QYXR0ZXJuUHRyOwpAQCAtNjIsNiArNjYsNyBA
QCBwdWJsaWM6CiAjaWYgIVVTRShESVJFQ1QyRCkKICAgICBQbGF0Zm9ybVBhdHRlcm5QdHIgY3Jl
YXRlUGxhdGZvcm1QYXR0ZXJuKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdXNlclNwYWNlVHJhbnNm
b3JtYXRpb24pIGNvbnN0OwogI2Vsc2UKKyAgICBQbGF0Zm9ybVBhdHRlcm5QdHIgY3JlYXRlUGxh
dGZvcm1QYXR0ZXJuKFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0JiwgZmxvYXQgYWxwaGEsIGNvbnN0
IEFmZmluZVRyYW5zZm9ybSYgdXNlclNwYWNlVHJhbnNmb3JtYXRpb24pIGNvbnN0OwogICAgIFBs
YXRmb3JtUGF0dGVyblB0ciBjcmVhdGVQbGF0Zm9ybVBhdHRlcm4oY29uc3QgR3JhcGhpY3NDb250
ZXh0JiwgZmxvYXQgYWxwaGEsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdXNlclNwYWNlVHJhbnNm
b3JtYXRpb24pIGNvbnN0OwogI2VuZGlmCiAgICAgdm9pZCBzZXRQYXR0ZXJuU3BhY2VUcmFuc2Zv
cm0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuU3BhY2VUcmFuc2Zvcm1hdGlvbik7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxh
eUxpc3RJdGVtcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0SXRlbXMuY3BwCShyZXZpc2lvbiAyNDgwMDgp
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxh
eUxpc3RJdGVtcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ4Niw3ICs0ODYsNyBAQCBzdGF0aWMg
VGV4dFN0cmVhbSYgb3BlcmF0b3I8PChUZXh0U3RyZWFtCiAgICAgcmV0dXJuIHRzOwogfQogCi0j
aWYgVVNFKENHKSB8fCBVU0UoQ0FJUk8pCisjaWYgVVNFKENHKSB8fCBVU0UoQ0FJUk8pIHx8IFVT
RShESVJFQ1QyRCkKIERyYXdOYXRpdmVJbWFnZTo6RHJhd05hdGl2ZUltYWdlKGNvbnN0IE5hdGl2
ZUltYWdlUHRyJiBpbWFnZSwgY29uc3QgRmxvYXRTaXplJiBpbWFnZVNpemUsIGNvbnN0IEZsb2F0
UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0
b3Igb3AsIEJsZW5kTW9kZSBibGVuZE1vZGUsIEltYWdlT3JpZW50YXRpb24gb3JpZW50YXRpb24p
CiAgICAgOiBEcmF3aW5nSXRlbShJdGVtVHlwZTo6RHJhd05hdGl2ZUltYWdlKQogI2lmIFVTRShD
RykKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9E
aXNwbGF5TGlzdEl0ZW1zLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0SXRlbXMuaAkocmV2aXNpb24gMjQ4MDA4
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rpc3Bs
YXlMaXN0SXRlbXMuaAkod29ya2luZyBjb3B5KQpAQCAtNzAsNyArNzAsNyBAQCBlbnVtIGNsYXNz
IEl0ZW1UeXBlIHsKICAgICBEcmF3SW1hZ2UsCiAgICAgRHJhd1RpbGVkSW1hZ2UsCiAgICAgRHJh
d1RpbGVkU2NhbGVkSW1hZ2UsCi0jaWYgVVNFKENHKSB8fCBVU0UoQ0FJUk8pCisjaWYgVVNFKENH
KSB8fCBVU0UoQ0FJUk8pIHx8IFVTRShESVJFQ1QyRCkKICAgICBEcmF3TmF0aXZlSW1hZ2UsCiAj
ZW5kaWYKICAgICBEcmF3UGF0dGVybiwKQEAgLTYzOCw3ICs2MzgsNyBAQCBwcml2YXRlOgogICAg
IEltYWdlUGFpbnRpbmdPcHRpb25zIG1faW1hZ2VQYWludGluZ09wdGlvbnM7CiB9OwogCi0jaWYg
VVNFKENHKSB8fCBVU0UoQ0FJUk8pCisjaWYgVVNFKENHKSB8fCBVU0UoQ0FJUk8pIHx8IFVTRShE
SVJFQ1QyRCkKIGNsYXNzIERyYXdOYXRpdmVJbWFnZSA6IHB1YmxpYyBEcmF3aW5nSXRlbSB7CiBw
dWJsaWM6CiAgICAgc3RhdGljIFJlZjxEcmF3TmF0aXZlSW1hZ2U+IGNyZWF0ZShjb25zdCBOYXRp
dmVJbWFnZVB0ciYgaW1hZ2UsIGNvbnN0IEZsb2F0U2l6ZSYgaW1hZ2VTaXplLCBjb25zdCBGbG9h
dFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJh
dG9yIG9wLCBCbGVuZE1vZGUgYmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0aW9uIG9yaWVudGF0aW9u
KQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rp
c3BsYXlMaXN0UmVjb3JkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdFJlY29yZGVyLmNwcAkocmV2aXNp
b24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxp
c3RzL0Rpc3BsYXlMaXN0UmVjb3JkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjYsNyArMTI2
LDcgQEAgSW1hZ2VEcmF3UmVzdWx0IFJlY29yZGVyOjpkcmF3VGlsZWRJbWFnZQogICAgIHJldHVy
biBJbWFnZURyYXdSZXN1bHQ6OkRpZFJlY29yZDsKIH0KIAotI2lmIFVTRShDRykgfHwgVVNFKENB
SVJPKQorI2lmIFVTRShDRykgfHwgVVNFKENBSVJPKSB8fCBVU0UoRElSRUNUMkQpCiB2b2lkIFJl
Y29yZGVyOjpkcmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0aXZlSW1hZ2VQdHImIGltYWdlLCBjb25z
dCBGbG9hdFNpemUmIGltYWdlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3Qg
RmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBvcCwgQmxlbmRNb2RlIGJsZW5k
TW9kZSwgSW1hZ2VPcmllbnRhdGlvbiBvcmllbnRhdGlvbikKIHsKICAgICBEcmF3aW5nSXRlbSYg
bmV3SXRlbSA9IGRvd25jYXN0PERyYXdpbmdJdGVtPihhcHBlbmRJdGVtKERyYXdOYXRpdmVJbWFn
ZTo6Y3JlYXRlKGltYWdlLCBpbWFnZVNpemUsIGRlc3RSZWN0LCBzcmNSZWN0LCBvcCwgYmxlbmRN
b2RlLCBvcmllbnRhdGlvbikpKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdFJlY29yZGVyLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0UmVj
b3JkZXIuaAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0UmVjb3JkZXIuaAkod29ya2luZyBjb3B5KQpA
QCAtOTEsNyArOTEsNyBAQCBwcml2YXRlOgogICAgIEltYWdlRHJhd1Jlc3VsdCBkcmF3SW1hZ2Uo
SW1hZ2UmLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RpbmF0aW9uLCBjb25zdCBGbG9hdFJlY3QmIHNv
dXJjZSwgY29uc3QgSW1hZ2VQYWludGluZ09wdGlvbnMmKSBvdmVycmlkZTsKICAgICBJbWFnZURy
YXdSZXN1bHQgZHJhd1RpbGVkSW1hZ2UoSW1hZ2UmLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RpbmF0
aW9uLCBjb25zdCBGbG9hdFBvaW50JiBzb3VyY2UsIGNvbnN0IEZsb2F0U2l6ZSYgdGlsZVNpemUs
IGNvbnN0IEZsb2F0U2l6ZSYgc3BhY2luZywgY29uc3QgSW1hZ2VQYWludGluZ09wdGlvbnMmKSBv
dmVycmlkZTsKICAgICBJbWFnZURyYXdSZXN1bHQgZHJhd1RpbGVkSW1hZ2UoSW1hZ2UmLCBjb25z
dCBGbG9hdFJlY3QmIGRlc3RpbmF0aW9uLCBjb25zdCBGbG9hdFJlY3QmIHNvdXJjZSwgY29uc3Qg
RmxvYXRTaXplJiB0aWxlU2NhbGVGYWN0b3IsIEltYWdlOjpUaWxlUnVsZSBoUnVsZSwgSW1hZ2U6
OlRpbGVSdWxlIHZSdWxlLCBjb25zdCBJbWFnZVBhaW50aW5nT3B0aW9ucyYpIG92ZXJyaWRlOwot
I2lmIFVTRShDRykgfHwgVVNFKENBSVJPKQorI2lmIFVTRShDRykgfHwgVVNFKENBSVJPKSB8fCBV
U0UoRElSRUNUMkQpCiAgICAgdm9pZCBkcmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0aXZlSW1hZ2VQ
dHImLCBjb25zdCBGbG9hdFNpemUmIHNlbGZTaXplLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0
LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUs
IEltYWdlT3JpZW50YXRpb24pIG92ZXJyaWRlOwogI2VuZGlmCiAgICAgdm9pZCBkcmF3UGF0dGVy
bihJbWFnZSYsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3Jj
UmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIGNv
bnN0IEZsb2F0U2l6ZSYgc3BhY2luZywgQ29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSA9IEJs
ZW5kTW9kZTo6Tm9ybWFsKSBvdmVycmlkZTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2Vu
ZERpcmVjdDJELmgJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyRC5oCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBVU0UoRElSRUNUMkQpCisKKyNpbmNsdWRlICJDT01Q
dHIuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSA8d2luY29kZWMuaD4KKyNpbmNs
dWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJE
IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShCYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQp
OworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHZpcnR1YWwgfkJh
Y2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyRCgpID0gZGVmYXVsdDsKKworICAgIElXSUNCaXRtYXAq
IHN1cmZhY2UoKSBjb25zdCB7IHJldHVybiBtX3N1cmZhY2UuZ2V0KCk7IH0KKyAgICBjb25zdCBJ
bnRTaXplJiBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CisKKyAgICB2aXJ0dWFsIHZv
aWQgc2Nyb2xsKGNvbnN0IEludFJlY3QmIHNjcm9sbFJlY3QsIGNvbnN0IEludFNpemUmIHNjcm9s
bE9mZnNldCkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgQmFja2luZ1N0b3JlQmFja2VuZERpcmVj
dDJEKGNvbnN0IEludFNpemUmIHNpemUpCisgICAgICAgIDogbV9zaXplKHNpemUpCisgICAgewor
ICAgIH0KKworICAgIENPTVB0cjxJV0lDQml0bWFwPiBtX3N1cmZhY2U7CisgICAgdm9pZCogbV9z
dXJmYWNlQmFja2luZ0RhdGE7CisgICAgSW50U2l6ZSBtX3NpemU7Cit9OworCisKK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShESVJFQ1QyRCkKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJ
bXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbC5jcHAJKG5vbmV4aXN0ZW50KQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmRE
aXJlY3QyREltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZUJhY2tlbmRE
aXJlY3QyREltcGwuaCIKKworI2lmIFVTRShESVJFQ1QyRCkKKworI2luY2x1ZGUgIkRpcmVjdDJE
VXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgorI2luY2x1ZGUgIkZsb2F0U2l6
ZS5oIgorI2luY2x1ZGUgIkltYWdlRGVjb2RlckRpcmVjdDJELmgiCisjaW5jbHVkZSAiSW50UmVj
dC5oIgorI2luY2x1ZGUgIkludFNpemUuaCIKKyNpbmNsdWRlIDx3aW5jb2RlYy5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBTZWNvbmRzIHNjcm9sbEh5c3RlcmVzaXNE
dXJhdGlvbiB7IDMwMF9tcyB9OworCitzdGF0aWMgQ09NUHRyPElXSUNCaXRtYXA+IGNyZWF0ZURp
cmVjdDJESW1hZ2VTdXJmYWNlV2l0aEZhc3RNYWxsb2MoY29uc3QgSW50U2l6ZSYgc2l6ZSwgZG91
YmxlIGRldmljZVNjYWxlRmFjdG9yLCB2b2lkKiYgYmFja2luZ1N0b3JlRGF0YSkKK3sKKyAgICBh
dXRvIGJ5dGVzUGVyUm93ID0gNCAqIENoZWNrZWQ8dW5zaWduZWQsIFJlY29yZE92ZXJmbG93Pihz
aXplLndpZHRoKCkpOworICAgIGlmIChieXRlc1BlclJvdy5oYXNPdmVyZmxvd2VkKCkpCisgICAg
ICAgIHJldHVybiBudWxscHRyOworCisgICAgQ2hlY2tlZDxzaXplX3QsIFJlY29yZE92ZXJmbG93
PiBudW1CeXRlcyA9IENoZWNrZWQ8dW5zaWduZWQsIFJlY29yZE92ZXJmbG93PihzaXplLmhlaWdo
dCgpKSAqIGJ5dGVzUGVyUm93OworICAgIGlmIChudW1CeXRlcy5oYXNPdmVyZmxvd2VkKCkpCisg
ICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgYmFja2luZ1N0b3JlRGF0YSA9IGZhc3RaZXJv
ZWRNYWxsb2MobnVtQnl0ZXMudW5zYWZlR2V0KCkpOworCisgICAgcmV0dXJuIERpcmVjdDJEOjpj
cmVhdGVEaXJlY3QyREltYWdlU3VyZmFjZVdpdGhEYXRhKGJhY2tpbmdTdG9yZURhdGEsIHNpemUs
IGJ5dGVzUGVyUm93LnVuc2FmZUdldCgpKTsKK30KKworQmFja2luZ1N0b3JlQmFja2VuZERpcmVj
dDJESW1wbDo6QmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbChjb25zdCBJbnRTaXplJiBz
aXplLCBmbG9hdCBkZXZpY2VTY2FsZUZhY3RvcikKKyAgICA6IEJhY2tpbmdTdG9yZUJhY2tlbmRE
aXJlY3QyRChzaXplKQorICAgICwgbV9zY3JvbGxlZEh5c3RlcmVzaXMoW3RoaXNdKFBBTDo6SHlz
dGVyZXNpc1N0YXRlIHN0YXRlKSB7CisgICAgICAgIGlmIChzdGF0ZSA9PSBQQUw6Okh5c3RlcmVz
aXNTdGF0ZTo6U3RvcHBlZCkKKyAgICAgICAgICAgIG1fc2Nyb2xsU3VyZmFjZSA9IG51bGxwdHI7
CisgICAgICAgIH0sIHNjcm9sbEh5c3RlcmVzaXNEdXJhdGlvbikKK3sKKyAgICBJbnRTaXplIHNj
YWxlZFNpemUgPSBtX3NpemU7CisgICAgc2NhbGVkU2l6ZS5zY2FsZShkZXZpY2VTY2FsZUZhY3Rv
cik7CisgICAgbV9zdXJmYWNlID0gY3JlYXRlRGlyZWN0MkRJbWFnZVN1cmZhY2VXaXRoRmFzdE1h
bGxvYyhzY2FsZWRTaXplLCBkZXZpY2VTY2FsZUZhY3RvciwgbV9zdXJmYWNlQmFja2luZ0RhdGEp
OworfQorCitCYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJbXBsOjp+QmFja2luZ1N0b3JlQmFj
a2VuZERpcmVjdDJESW1wbCgpCit7CisgICAgZmFzdEZyZWUobV9zdXJmYWNlQmFja2luZ0RhdGEp
OworICAgIGZhc3RGcmVlKG1fc2Nyb2xsU3VyZmFjZUJhY2tpbmdEYXRhKTsKK30KKwordm9pZCBC
YWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJbXBsOjpzY3JvbGwoY29uc3QgSW50UmVjdCYgc2Ny
b2xsUmVjdCwgY29uc3QgSW50U2l6ZSYgc2Nyb2xsT2Zmc2V0KQoreworICAgIEludFJlY3QgdGFy
Z2V0UmVjdCA9IHNjcm9sbFJlY3Q7CisgICAgdGFyZ2V0UmVjdC5tb3ZlKHNjcm9sbE9mZnNldCk7
CisgICAgdGFyZ2V0UmVjdC5zaGlmdE1heFhFZGdlVG8odGFyZ2V0UmVjdC5tYXhYKCkgLSBzY3Jv
bGxPZmZzZXQud2lkdGgoKSk7CisgICAgdGFyZ2V0UmVjdC5zaGlmdE1heFlFZGdlVG8odGFyZ2V0
UmVjdC5tYXhZKCkgLSBzY3JvbGxPZmZzZXQuaGVpZ2h0KCkpOworICAgIGlmICh0YXJnZXRSZWN0
LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFtX3Njcm9sbFN1cmZhY2Up
IHsKKyAgICAgICAgYXV0byBzaXplID0gRGlyZWN0MkQ6OmJpdG1hcFNpemUobV9zdXJmYWNlLmdl
dCgpKTsKKyAgICAgICAgYXV0byBzY2FsZSA9IERpcmVjdDJEOjpiaXRtYXBSZXNvbHV0aW9uKG1f
c3VyZmFjZS5nZXQoKSk7CisgICAgICAgIEFTU0VSVChzY2FsZS54KCkgPT0gc2NhbGUueSgpKTsK
KyAgICAgICAgbV9zY3JvbGxTdXJmYWNlID0gY3JlYXRlRGlyZWN0MkRJbWFnZVN1cmZhY2VXaXRo
RmFzdE1hbGxvYyhzaXplLCBzY2FsZS54KCksIG1fc2Nyb2xsU3VyZmFjZUJhY2tpbmdEYXRhKTsK
KyAgICB9CisKKyAgICBEaXJlY3QyRDo6Y29weVJlY3RGcm9tT25lU3VyZmFjZVRvQW5vdGhlciht
X3N1cmZhY2UuZ2V0KCksIG1fc2Nyb2xsU3VyZmFjZS5nZXQoKSwgc2Nyb2xsT2Zmc2V0LCB0YXJn
ZXRSZWN0KTsKKyAgICBEaXJlY3QyRDo6Y29weVJlY3RGcm9tT25lU3VyZmFjZVRvQW5vdGhlciht
X3Njcm9sbFN1cmZhY2UuZ2V0KCksIG1fc3VyZmFjZS5nZXQoKSwgSW50U2l6ZSgpLCB0YXJnZXRS
ZWN0KTsKKworICAgIG1fc2Nyb2xsZWRIeXN0ZXJlc2lzLmltcHVsc2UoKTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKERJUkVDVDJEKQpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3Qy
REltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbC5oCShub25leGlzdGVudCkKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGly
ZWN0MkRJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
IElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICog
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNwcmFnbWEgb25jZQorCisjaWYgVVNFKERJUkVDVDJEKQorCisjaW5jbHVkZSAiQmFja2luZ1N0
b3JlQmFja2VuZERpcmVjdDJELmgiCisjaW5jbHVkZSAiQ09NUHRyLmgiCisjaW5jbHVkZSA8cGFs
L0h5c3RlcmVzaXNBY3Rpdml0eS5oPgorCitpbnRlcmZhY2UgSVdJQ0JpdG1hcDsKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjbGFzcyBCYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJbXBsIGZp
bmFsIDogcHVibGljIEJhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyRCB7CitwdWJsaWM6CisgICAg
V0VCQ09SRV9FWFBPUlQgQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbChjb25zdCBJbnRT
aXplJiwgZmxvYXQgZGV2aWNlU2NhbGVGYWN0b3IpOworICAgIHZpcnR1YWwgfkJhY2tpbmdTdG9y
ZUJhY2tlbmREaXJlY3QyREltcGwoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHNjcm9sbChjb25z
dCBJbnRSZWN0JiwgY29uc3QgSW50U2l6ZSYpIG92ZXJyaWRlOworCisgICAgQ09NUHRyPElXSUNC
aXRtYXA+IG1fc2Nyb2xsU3VyZmFjZTsKKyAgICB2b2lkKiBtX3Njcm9sbFN1cmZhY2VCYWNraW5n
RGF0YTsKKworICAgIFBBTDo6SHlzdGVyZXNpc0FjdGl2aXR5IG1fc2Nyb2xsZWRIeXN0ZXJlc2lz
OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKERJUkVDVDJE
KQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0RpcmVjdDJET3Bl
cmF0aW9ucy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0RpcmVjdDJET3BlcmF0aW9ucy5jcHAJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0RpcmVjdDJET3BlcmF0aW9ucy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIw
MTkgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAw
NyBBbHAgVG9rZXIgPGFscEBhdG9rZXIuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5
IERpcmsgU2NodWx6ZSA8a3JpdEB3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IE51
YW50aSBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQnJlbnQgRnVsZ2hhbSA8YmZ1bGdoYW1A
d2Via2l0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBJZ2FsaWEgUy5MLgorICog
Q29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDEwLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiRGlyZWN0MkRPcGVyYXRpb25zLmgiCisKKyNpZiBVU0UoRElSRUNUMkQp
CisKKyNpbmNsdWRlICJEaXJlY3QyRFV0aWxpdGllcy5oIgorI2luY2x1ZGUgIkZsb2F0Q29udmVy
c2lvbi5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURpcmVjdDJELmgi
CisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUg
Ik5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGF0aC5oIgorI2luY2x1ZGUgIlBsYXRmb3Jt
Q29udGV4dERpcmVjdDJELmgiCisjaW5jbHVkZSAiU2hhZG93Qmx1ci5oIgorI2luY2x1ZGUgPGFs
Z29yaXRobT4KKyNpbmNsdWRlIDxkMmQxLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVz
cGFjZSBEaXJlY3QyRCB7CisKK2VudW0gUGF0dGVybkFkanVzdG1lbnQgeyBOb0FkanVzdG1lbnQs
IEFkanVzdFBhdHRlcm5Gb3JHbG9iYWxBbHBoYSB9OworZW51bSBBbHBoYVByZXNlcnZhdGlvbiB7
IERvTm90UHJlc2VydmVBbHBoYSwgUHJlc2VydmVBbHBoYSB9OworCisKK2NsYXNzIFBsYXRmb3Jt
Q29udGV4dFN0YXRlU2F2ZXIgeworcHVibGljOgorICAgIFBsYXRmb3JtQ29udGV4dFN0YXRlU2F2
ZXIoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIGNvbnRleHQsIGJvb2wgc2F2ZUFuZFJlc3RvcmUg
PSB0cnVlKQorICAgICAgICA6IG1fY29udGV4dChjb250ZXh0KQorICAgICAgICAsIG1fc2F2ZUFu
ZFJlc3RvcmUoc2F2ZUFuZFJlc3RvcmUpCisgICAgeworICAgICAgICBpZiAobV9zYXZlQW5kUmVz
dG9yZSkKKyAgICAgICAgICAgIG1fY29udGV4dC5zYXZlKCk7CisgICAgfQorCisgICAgflBsYXRm
b3JtQ29udGV4dFN0YXRlU2F2ZXIoKQorICAgIHsKKyAgICAgICAgaWYgKG1fc2F2ZUFuZFJlc3Rv
cmUpCisgICAgICAgICAgICBtX2NvbnRleHQucmVzdG9yZSgpOworICAgIH0KKworICAgIHZvaWQg
c2F2ZSgpCisgICAgeworICAgICAgICBBU1NFUlQoIW1fc2F2ZUFuZFJlc3RvcmUpOworICAgICAg
ICBtX2NvbnRleHQuc2F2ZSgpOworICAgICAgICBtX3NhdmVBbmRSZXN0b3JlID0gdHJ1ZTsKKyAg
ICB9CisKKyAgICB2b2lkIHJlc3RvcmUoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fc2F2ZUFu
ZFJlc3RvcmUpOworICAgICAgICBtX2NvbnRleHQucmVzdG9yZSgpOworICAgICAgICBtX3NhdmVB
bmRSZXN0b3JlID0gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBkaWRTYXZlKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBtX3NhdmVBbmRSZXN0b3JlOworICAgIH0KKworcHJpdmF0ZToK
KyAgICBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgbV9jb250ZXh0OworICAgIGJvb2wgbV9zYXZl
QW5kUmVzdG9yZSB7IGZhbHNlIH07Cit9OworCisvLyBGSVhNRTogUmVwbGFjZSBvbmNlIEdyYXBo
aWNzQ29udGV4dDo6ZGFzaGVkTGluZUNvcm5lcldpZHRoRm9yU3Ryb2tlV2lkdGgoKQorLy8gaXMg
cmVmYWN0b3JlZCBhcyBhIHN0YXRpYyBwdWJsaWMgZnVuY3Rpb24uCitzdGF0aWMgZmxvYXQgZGFz
aGVkTGluZUNvcm5lcldpZHRoRm9yU3Ryb2tlV2lkdGgoZmxvYXQgc3Ryb2tlV2lkdGgsIFN0cm9r
ZVN0eWxlIHN0cm9rZVN0eWxlLCBmbG9hdCBzdHJva2VUaGlja25lc3MpCit7CisgICAgcmV0dXJu
IHN0cm9rZVN0eWxlID09IERvdHRlZFN0cm9rZSA/IHN0cm9rZVRoaWNrbmVzcyA6IHN0ZDo6bWlu
KDIuMGYgKiBzdHJva2VUaGlja25lc3MsIHN0ZDo6bWF4KHN0cm9rZVRoaWNrbmVzcywgc3Ryb2tl
V2lkdGggLyAzLjBmKSk7Cit9CisKKy8vIEZJWE1FOiBSZXBsYWNlIG9uY2UgR3JhcGhpY3NDb250
ZXh0OjpkYXNoZWRMaW5lUGF0dGVybldpZHRoRm9yU3Ryb2tlV2lkdGgoKQorLy8gaXMgcmVmYWN0
b3JlZCBhcyBhIHN0YXRpYyBwdWJsaWMgZnVuY3Rpb24uCitzdGF0aWMgZmxvYXQgZGFzaGVkTGlu
ZVBhdHRlcm5XaWR0aEZvclN0cm9rZVdpZHRoKGZsb2F0IHN0cm9rZVdpZHRoLCBTdHJva2VTdHls
ZSBzdHJva2VTdHlsZSwgZmxvYXQgc3Ryb2tlVGhpY2tuZXNzKQoreworICAgIHJldHVybiBzdHJv
a2VTdHlsZSA9PSBEb3R0ZWRTdHJva2UgPyBzdHJva2VUaGlja25lc3MgOiBzdGQ6Om1pbigzLjBm
ICogc3Ryb2tlVGhpY2tuZXNzLCBzdGQ6Om1heChzdHJva2VUaGlja25lc3MsIHN0cm9rZVdpZHRo
IC8gMy4wZikpOworfQorCisvLyBGSVhNRTogUmVwbGFjZSBvbmNlIEdyYXBoaWNzQ29udGV4dDo6
ZGFzaGVkTGluZVBhdHRlcm5PZmZzZXRGb3JQYXR0ZXJuQW5kU3Ryb2tlV2lkdGgoKQorLy8gaXMg
cmVmYWN0b3JlZCBhcyBhIHN0YXRpYyBwdWJsaWMgZnVuY3Rpb24uCitzdGF0aWMgZmxvYXQgZGFz
aGVkTGluZVBhdHRlcm5PZmZzZXRGb3JQYXR0ZXJuQW5kU3Ryb2tlV2lkdGgoZmxvYXQgcGF0dGVy
bldpZHRoLCBmbG9hdCBzdHJva2VXaWR0aCkKK3sKKyAgICAvLyBQYXR0ZXJuIHN0YXJ0cyB3aXRo
IGZ1bGwgZmlsbCBhbmQgZW5kcyB3aXRoIHRoZSBlbXB0eSBmaWxsLgorICAgIC8vIDEuIExldCdz
IHN0YXJ0IHdpdGggdGhlIGVtcHR5IHBoYXNlIGFmdGVyIHRoZSBjb3JuZXIuCisgICAgLy8gMi4g
Q2hlY2sgaWYgd2UndmUgZ290IG9kZCBvciBldmVuIG51bWJlciBvZiBwYXR0ZXJucyBhbmQgd2hl
dGhlciB0aGV5IGZ1bGx5IGNvdmVyIHRoZSBsaW5lLgorICAgIC8vIDMuIEluIGNhc2Ugb2YgZXZl
biBudW1iZXIgb2YgcGF0dGVybnMgYW5kL29yIHJlbWFpbmRlciwgbW92ZSB0aGUgcGF0dGVybiBz
dGFydCBwb3NpdGlvbgorICAgIC8vIHNvIHRoYXQgdGhlIHBhdHRlcm4gaXMgYmFsYW5jZWQgYmV0
d2VlbiB0aGUgY29ybmVycy4KKyAgICBmbG9hdCBwYXR0ZXJuT2Zmc2V0ID0gcGF0dGVybldpZHRo
OworICAgIGludCBudW1iZXJPZlNlZ21lbnRzID0gc3RkOjpmbG9vcihzdHJva2VXaWR0aCAvIHBh
dHRlcm5XaWR0aCk7CisgICAgYm9vbCBvZGROdW1iZXJPZlNlZ21lbnRzID0gbnVtYmVyT2ZTZWdt
ZW50cyAlIDI7CisgICAgZmxvYXQgcmVtYWluZGVyID0gc3Ryb2tlV2lkdGggLSAobnVtYmVyT2ZT
ZWdtZW50cyAqIHBhdHRlcm5XaWR0aCk7CisgICAgaWYgKG9kZE51bWJlck9mU2VnbWVudHMgJiYg
cmVtYWluZGVyKQorICAgICAgICBwYXR0ZXJuT2Zmc2V0IC09IHJlbWFpbmRlciAvIDIuMGY7Cisg
ICAgZWxzZSBpZiAoIW9kZE51bWJlck9mU2VnbWVudHMpIHsKKyAgICAgICAgaWYgKHJlbWFpbmRl
cikKKyAgICAgICAgICAgIHBhdHRlcm5PZmZzZXQgKz0gcGF0dGVybk9mZnNldCAtIChwYXR0ZXJu
V2lkdGggKyByZW1haW5kZXIpIC8gMi4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGF0
dGVybk9mZnNldCArPSBwYXR0ZXJuV2lkdGggLyAyLjBmOworICAgIH0KKworICAgIHJldHVybiBw
YXR0ZXJuT2Zmc2V0OworfQorCisvLyBGSVhNRTogUmVwbGFjZSBvbmNlIEdyYXBoaWNzQ29udGV4
dDo6Y2VudGVyTGluZUFuZEN1dE9mZkNvcm5lcnMoKQorLy8gaXMgcmVmYWN0b3JlZCBhcyBhIHN0
YXRpYyBwdWJsaWMgZnVuY3Rpb24uCitzdGF0aWMgVmVjdG9yPEZsb2F0UG9pbnQ+IGNlbnRlckxp
bmVBbmRDdXRPZmZDb3JuZXJzKGJvb2wgaXNWZXJ0aWNhbExpbmUsIGZsb2F0IGNvcm5lcldpZHRo
LCBGbG9hdFBvaW50IHBvaW50MSwgRmxvYXRQb2ludCBwb2ludDIpCit7CisgICAgLy8gQ2VudGVy
IGxpbmUgYW5kIGN1dCBvZmYgY29ybmVycyBmb3IgcGF0dGVybiBwYWludGluZy4KKyAgICBpZiAo
aXNWZXJ0aWNhbExpbmUpIHsKKyAgICAgICAgZmxvYXQgY2VudGVyT2Zmc2V0ID0gKHBvaW50Mi54
KCkgLSBwb2ludDEueCgpKSAvIDIuMGY7CisgICAgICAgIHBvaW50MS5tb3ZlKGNlbnRlck9mZnNl
dCwgY29ybmVyV2lkdGgpOworICAgICAgICBwb2ludDIubW92ZSgtY2VudGVyT2Zmc2V0LCAtY29y
bmVyV2lkdGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0IGNlbnRlck9mZnNldCA9IChw
b2ludDIueSgpIC0gcG9pbnQxLnkoKSkgLyAyLjBmOworICAgICAgICBwb2ludDEubW92ZShjb3Ju
ZXJXaWR0aCwgY2VudGVyT2Zmc2V0KTsKKyAgICAgICAgcG9pbnQyLm1vdmUoLWNvcm5lcldpZHRo
LCAtY2VudGVyT2Zmc2V0KTsKKyAgICB9CisKKyAgICByZXR1cm4geyBwb2ludDEsIHBvaW50MiB9
OworfQorCisKK25hbWVzcGFjZSBTdGF0ZSB7CisKK3ZvaWQgc2V0U3Ryb2tlVGhpY2tuZXNzKFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGZsb2F0IHN0cm9rZVRoaWNr
bmVzcykKK3sKKyAgICBwbGF0Zm9ybUNvbnRleHQuc2V0U3Ryb2tlVGhpY2tuZXNzKHN0cm9rZVRo
aWNrbmVzcyk7Cit9CisKK3ZvaWQgc2V0U3Ryb2tlU3R5bGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmIHBsYXRmb3JtQ29udGV4dCwgU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUpCit7CisgICAgcGxh
dGZvcm1Db250ZXh0LnNldFN0cm9rZVN0eWxlKHN0cm9rZVN0eWxlKTsKK30KKwordm9pZCBzZXRD
b21wb3NpdGVPcGVyYXRpb24oUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4
dCwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3BlcmF0aW9uLCBCbGVuZE1vZGUgYmxlbmRN
b2RlKQoreworICAgIEQyRDFfQkxFTkRfTU9ERSB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5E
X01PREVfU0NSRUVOOworICAgIEQyRDFfQ09NUE9TSVRFX01PREUgdGFyZ2V0Q29tcG9zaXRlTW9k
ZSA9IEQyRDFfQ09NUE9TSVRFX01PREVfU09VUkNFX0FUT1A7CisKKyAgICBpZiAoYmxlbmRNb2Rl
ICE9IEJsZW5kTW9kZTo6Tm9ybWFsKSB7CisgICAgICAgIHN3aXRjaCAoYmxlbmRNb2RlKSB7Cisg
ICAgICAgIGNhc2UgQmxlbmRNb2RlOjpNdWx0aXBseToKKyAgICAgICAgICAgIHRhcmdldEJsZW5k
TW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9NVUxUSVBMWTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIEJsZW5kTW9kZTo6U2NyZWVuOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2Rl
ID0gRDJEMV9CTEVORF9NT0RFX1NDUkVFTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEJsZW5kTW9kZTo6T3ZlcmxheToKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQy
RDFfQkxFTkRfTU9ERV9PVkVSTEFZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
QmxlbmRNb2RlOjpEYXJrZW46CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JM
RU5EX01PREVfREFSS0VOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRN
b2RlOjpMaWdodGVuOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9N
T0RFX0xJR0hURU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVuZE1vZGU6
OkNvbG9yRG9kZ2U6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01P
REVfQ09MT1JfRE9ER0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVuZE1v
ZGU6OkNvbG9yQnVybjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRf
TU9ERV9DT0xPUl9CVVJOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRN
b2RlOjpIYXJkTGlnaHQ6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5E
X01PREVfSEFSRF9MSUdIVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5k
TW9kZTo6U29mdExpZ2h0OgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVO
RF9NT0RFX1NPRlRfTElHSFQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVu
ZE1vZGU6OkRpZmZlcmVuY2U6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JM
RU5EX01PREVfRElGRkVSRU5DRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJs
ZW5kTW9kZTo6RXhjbHVzaW9uOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9C
TEVORF9NT0RFX0VYQ0xVU0lPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJs
ZW5kTW9kZTo6SHVlOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9N
T0RFX0hVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9kZTo6U2F0
dXJhdGlvbjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9T
QVRVUkFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2RlOjpD
b2xvcjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DT0xP
UjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9kZTo6THVtaW5vc2l0
eToKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9MVU1JTk9T
SVRZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2RlOjpQbHVzRGFy
a2VyOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0RBUktF
Ul9DT0xPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9kZTo6UGx1
c0xpZ2h0ZXI6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVf
TElHSFRFUl9DT0xPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2gg
KGNvbXBvc2l0ZU9wZXJhdGlvbikgeworICAgICAgICBjYXNlIENvbXBvc2l0ZUNsZWFyOgorICAg
ICAgICAgICAgLy8gRklYTUU6IHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DTEVB
UjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBvc2l0ZUNvcHk6CisgICAg
ICAgICAgICAvLyBGSVhNRTogdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0NPUFk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdmVyOgor
ICAgICAgICAgICAgLy8gRklYTUU6IGtDR0JsZW5kTW9kZU5vcm1hbAorICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlU291cmNlSW46CisgICAgICAgICAgICB0YXJnZXRD
b21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9TT1VSQ0VfSU47CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdXQ6CisgICAgICAgICAgICB0
YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9TT1VSQ0VfT1VUOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlU291cmNlQXRvcDoKKyAgICAg
ICAgICAgIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX1NPVVJDRV9B
VE9QOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRp
b25PdmVyOgorICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRF
X01PREVfREVTVElOQVRJT05fT1ZFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IENvbXBvc2l0ZURlc3RpbmF0aW9uSW46CisgICAgICAgICAgICB0YXJnZXRDb21wb3NpdGVNb2Rl
ID0gRDJEMV9DT01QT1NJVEVfTU9ERV9ERVNUSU5BVElPTl9JTjsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uT3V0OgorICAgICAgICAgICAgdGFy
Z2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRFX01PREVfREVTVElOQVRJT05fT1VUOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25BdG9w
OgorICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRFX01PREVf
REVTVElOQVRJT05fQVRPUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBv
c2l0ZVhPUjoKKyAgICAgICAgICAgIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lU
RV9NT0RFX1hPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBvc2l0ZVBs
dXNEYXJrZXI6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVf
REFSS0VSX0NPTE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRl
UGx1c0xpZ2h0ZXI6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01P
REVfTElHSFRFUl9DT0xPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBv
c2l0ZURpZmZlcmVuY2U6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5E
X01PREVfRElGRkVSRU5DRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQor
CisgICAgcGxhdGZvcm1Db250ZXh0LnNldEJsZW5kTW9kZSh0YXJnZXRCbGVuZE1vZGUpOworICAg
IHBsYXRmb3JtQ29udGV4dC5zZXRDb21wb3NpdGVNb2RlKHRhcmdldENvbXBvc2l0ZU1vZGUpOwor
fQorCit2b2lkIHNldFNob3VsZEFudGlhbGlhcyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxh
dGZvcm1Db250ZXh0LCBib29sIGVuYWJsZSkKK3sKKyAgICBhdXRvIGFudGlhbGlhc01vZGUgPSBl
bmFibGUgPyBEMkQxX0FOVElBTElBU19NT0RFX1BFUl9QUklNSVRJVkUgOiBEMkQxX0FOVElBTElB
U19NT0RFX0FMSUFTRUQ7CisgICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5TZXRB
bnRpYWxpYXNNb2RlKGFudGlhbGlhc01vZGUpOworfQorCit2b2lkIHNldENUTShQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRy
YW5zZm9ybSkKK3sKKyAgICBBU1NFUlQocGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpKTsK
KyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPlNldFRyYW5zZm9ybSh0cmFuc2Zv
cm0pOworCisgICAgaWYgKGF1dG8qIGdyYXBoaWNzQ29udGV4dFByaXZhdGUgPSBwbGF0Zm9ybUNv
bnRleHQuZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICAgICBncmFwaGljc0NvbnRleHRQ
cml2YXRlLT5zZXRDVE0odHJhbnNmb3JtKTsKK30KKworQWZmaW5lVHJhbnNmb3JtIGdldENUTShQ
bGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0KQoreworICAgIEFTU0VSVChw
bGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpOworICAgIEQyRDFfTUFUUklYXzNYMl9GIGN1
cnJlbnRUcmFuc2Zvcm07CisgICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5HZXRU
cmFuc2Zvcm0oJmN1cnJlbnRUcmFuc2Zvcm0pOworICAgIHJldHVybiBjdXJyZW50VHJhbnNmb3Jt
OworfQorCitJbnRSZWN0IGdldENsaXBCb3VuZHMoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBs
YXRmb3JtQ29udGV4dCkKK3sKKyAgICBEMkQxX1NJWkVfRiBjbGlwU2l6ZTsKKyAgICBpZiAoYXV0
byBjbGlwTGF5ZXIgPSBwbGF0Zm9ybUNvbnRleHQuY2xpcExheWVyKCkpCisgICAgICAgIGNsaXBT
aXplID0gY2xpcExheWVyLT5HZXRTaXplKCk7CisgICAgZWxzZQorICAgICAgICBjbGlwU2l6ZSA9
IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+R2V0U2l6ZSgpOworCisgICAgRmxvYXRS
ZWN0IGNsaXBCb3VuZHMoSW50UG9pbnQoKSwgY2xpcFNpemUpOworCisgICAgcmV0dXJuIGVuY2xv
c2luZ0ludFJlY3QoY2xpcEJvdW5kcyk7Cit9CisKK0Zsb2F0UmVjdCByb3VuZFRvRGV2aWNlUGl4
ZWxzKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0
UmVjdCYgcmVjdCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgcmV0dXJuIHJlY3Q7
Cit9CisvKgorYm9vbCBpc0FjY2VsZXJhdGVkQ29udGV4dChQbGF0Zm9ybUNvbnRleHRDYWlybyYg
cGxhdGZvcm1Db250ZXh0KQoreworICAgIHJldHVybiBjYWlyb19zdXJmYWNlX2dldF90eXBlKGNh
aXJvX2dldF90YXJnZXQocGxhdGZvcm1Db250ZXh0LmNyKCkpKSA9PSBDQUlST19TVVJGQUNFX1RZ
UEVfR0w7Cit9CisqLworfSAvLyBuYW1lc3BhY2UgU3RhdGUKKworRmlsbFNvdXJjZTo6RmlsbFNv
dXJjZShjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYgc3RhdGUsIFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQpCisgICAgOiBnbG9iYWxBbHBoYShzdGF0ZS5hbHBoYSkK
KyAgICAsIGNvbG9yKHN0YXRlLmZpbGxDb2xvcikKKyAgICAsIGZpbGxSdWxlKHN0YXRlLmZpbGxS
dWxlKQoreworICAgIGlmIChzdGF0ZS5maWxsUGF0dGVybikgeworICAgICAgICBBZmZpbmVUcmFu
c2Zvcm0gdXNlclRvQmFzZUNUTTsgLy8gRklYTUU6IFRoaXMgaXNuJ3QgcmVhbGx5IG5lZWRlZCBv
biBXaW5kb3dzCisgICAgICAgIGJydXNoID0gc3RhdGUuZmlsbFBhdHRlcm4tPmNyZWF0ZVBsYXRm
b3JtUGF0dGVybihwbGF0Zm9ybUNvbnRleHQsIHN0YXRlLmFscGhhLCB1c2VyVG9CYXNlQ1RNKTsK
KyAgICB9IGVsc2UgaWYgKHN0YXRlLmZpbGxHcmFkaWVudCkKKyAgICAgICAgYnJ1c2ggPSBzdGF0
ZS5maWxsR3JhZGllbnQtPmNyZWF0ZVBsYXRmb3JtR3JhZGllbnRJZk5lY2Vzc2FyeShwbGF0Zm9y
bUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpOworICAgIGVsc2UKKyAgICAgICAgYnJ1c2ggPSBwbGF0
Zm9ybUNvbnRleHQuYnJ1c2hXaXRoQ29sb3IoY29sb3IpOworfQorCitTdHJva2VTb3VyY2U6OlN0
cm9rZVNvdXJjZShjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYgc3RhdGUsIFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQpCisgICAgOiBnbG9iYWxBbHBoYShzdGF0ZS5h
bHBoYSkKKyAgICAsIHRoaWNrbmVzcyhzdGF0ZS5zdHJva2VUaGlja25lc3MpCisgICAgLCBjb2xv
cihzdGF0ZS5zdHJva2VDb2xvcikKK3sKKyAgICBpZiAoc3RhdGUuc3Ryb2tlUGF0dGVybikgewor
ICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdXNlclRvQmFzZUNUTTsgLy8gRklYTUU6IFRoaXMgaXNu
J3QgcmVhbGx5IG5lZWRlZCBvbiBXaW5kb3dzCisgICAgICAgIGJydXNoID0gc3RhdGUuc3Ryb2tl
UGF0dGVybi0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKHBsYXRmb3JtQ29udGV4dCwgc3RhdGUuYWxw
aGEsIHVzZXJUb0Jhc2VDVE0pOworICAgIH0gZWxzZSBpZiAoc3RhdGUuc3Ryb2tlR3JhZGllbnQp
CisgICAgICAgIGJydXNoID0gc3RhdGUuc3Ryb2tlR3JhZGllbnQtPmNyZWF0ZVBsYXRmb3JtR3Jh
ZGllbnRJZk5lY2Vzc2FyeShwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpOworICAgIGVs
c2UKKyAgICAgICAgYnJ1c2ggPSBwbGF0Zm9ybUNvbnRleHQuYnJ1c2hXaXRoQ29sb3IoY29sb3Ip
OworfQorCitTaGFkb3dTdGF0ZTo6U2hhZG93U3RhdGUoY29uc3QgR3JhcGhpY3NDb250ZXh0U3Rh
dGUmIHN0YXRlKQorICAgIDogb2Zmc2V0KHN0YXRlLnNoYWRvd09mZnNldCkKKyAgICAsIGJsdXIo
c3RhdGUuc2hhZG93Qmx1cikKKyAgICAsIGNvbG9yKHN0YXRlLnNoYWRvd0NvbG9yKQorICAgICwg
aWdub3JlVHJhbnNmb3JtcyhzdGF0ZS5zaGFkb3dzSWdub3JlVHJhbnNmb3JtcykKKyAgICAsIGds
b2JhbEFscGhhKHN0YXRlLmFscGhhKQorICAgICwgZ2xvYmFsQ29tcG9zaXRlT3BlcmF0b3Ioc3Rh
dGUuY29tcG9zaXRlT3BlcmF0b3IpCit7Cit9CisKK2Jvb2wgU2hhZG93U3RhdGU6OmlzVmlzaWJs
ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbG9yLmlzVmlzaWJsZSgpICYmIChvZmZzZXQud2lk
dGgoKSB8fCBvZmZzZXQuaGVpZ2h0KCkgfHwgYmx1cik7Cit9CisKK2Jvb2wgU2hhZG93U3RhdGU6
OmlzUmVxdWlyZWQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCkgY29u
c3QKK3sKKyAgICAvLyBXZSBjYW4ndCBhdm9pZCBTaGFkb3dCbHVyIGlmIHRoZSBzaGFkb3cgaGFz
IGJsdXIuCisgICAgaWYgKGNvbG9yLmlzVmlzaWJsZSgpICYmIGJsdXIpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgLy8gV2UgY2FuIGF2b2lkIFNoYWRvd0JsdXIgYW5kIG9wdGltaXplLCBz
aW5jZSB3ZSdyZSBub3QgZHJhd2luZyBvbiBhCisgICAgLy8gY2FudmFzIGFuZCBib3ggc2hhZG93
cyBhcmUgYWZmZWN0ZWQgYnkgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAgICBpZiAoIWln
bm9yZVRyYW5zZm9ybXMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFdlIGNhbiBh
dm9pZCBTaGFkb3dCbHVyLCBzaW5jZSB0aGVyZSBhcmUgbm8gdHJhbnNmb3JtYXRpb25zIHRvIGFw
cGx5IHRvIHRoZSBjYW52YXMuCisgICAgaWYgKFN0YXRlOjpnZXRDVE0ocGxhdGZvcm1Db250ZXh0
KS5pc0lkZW50aXR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE90aGVyd2lz
ZSwgbm8gY2hhbmNlIGF2b2lkaW5nIFNoYWRvd0JsdXIuCisgICAgcmV0dXJuIHRydWU7Cit9CisK
K3ZvaWQgc2V0TGluZUNhcChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0
LCBMaW5lQ2FwIGxpbmVDYXApCit7CisgICAgRDJEMV9DQVBfU1RZTEUgY2FwU3R5bGUgPSBEMkQx
X0NBUF9TVFlMRV9GTEFUOworICAgIHN3aXRjaCAobGluZUNhcCkgeworICAgIGNhc2UgUm91bmRD
YXA6CisgICAgICAgIGNhcFN0eWxlID0gRDJEMV9DQVBfU1RZTEVfUk9VTkQ7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgU3F1YXJlQ2FwOgorICAgICAgICBjYXBTdHlsZSA9IEQyRDFfQ0FQX1NU
WUxFX1NRVUFSRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCdXR0Q2FwOgorICAgIGRlZmF1
bHQ6CisgICAgICAgIGNhcFN0eWxlID0gRDJEMV9DQVBfU1RZTEVfRkxBVDsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorCisgICAgcGxhdGZvcm1Db250ZXh0LnNldExpbmVDYXAoY2FwU3R5bGUpOwor
fQorCit2b2lkIHNldExpbmVEYXNoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNv
bnRleHQsIGNvbnN0IERhc2hBcnJheSYgZGFzaGVzLCBmbG9hdCBkYXNoT2Zmc2V0KQoreworICAg
IHBsYXRmb3JtQ29udGV4dC5zZXREYXNoZXMoZGFzaGVzKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQu
c2V0RGFzaE9mZnNldChkYXNoT2Zmc2V0KTsKK30KKwordm9pZCBzZXRMaW5lSm9pbihQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBMaW5lSm9pbiBsaW5lSm9pbikKK3sK
KyAgICBEMkQxX0xJTkVfSk9JTiBqb2luU3R5bGUgPSBEMkQxX0xJTkVfSk9JTl9NSVRFUjsKKyAg
ICBzd2l0Y2ggKGxpbmVKb2luKSB7CisgICAgY2FzZSBSb3VuZEpvaW46CisgICAgICAgIGpvaW5T
dHlsZSA9IEQyRDFfTElORV9KT0lOX1JPVU5EOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJl
dmVsSm9pbjoKKyAgICAgICAgam9pblN0eWxlID0gRDJEMV9MSU5FX0pPSU5fQkVWRUw7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgTWl0ZXJKb2luOgorICAgIGRlZmF1bHQ6CisgICAgICAgIGpv
aW5TdHlsZSA9IEQyRDFfTElORV9KT0lOX01JVEVSOworICAgICAgICBicmVhazsKKyAgICB9CisK
KyAgICBwbGF0Zm9ybUNvbnRleHQuc2V0TGluZUpvaW4oam9pblN0eWxlKTsKK30KKwordm9pZCBz
ZXRNaXRlckxpbWl0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGZs
b2F0IG1pdGVyTGltaXQpCit7CisgICAgcGxhdGZvcm1Db250ZXh0LnNldE1pdGVyTGltaXQobWl0
ZXJMaW1pdCk7Cit9CisKK3ZvaWQgZmlsbFJlY3QoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBs
YXRmb3JtQ29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBGaWxsU291cmNlJiBm
aWxsU291cmNlLCBjb25zdCBTaGFkb3dTdGF0ZSYgc2hhZG93U3RhdGUpCit7CisgICAgYXV0byBj
b250ZXh0ID0gcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpOworCisgICAgY29udGV4dC0+
U2V0VGFncygxLCBfX0xJTkVfXyk7CisgICAgUGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlciBzdGF0
ZVNhdmVyKHBsYXRmb3JtQ29udGV4dCk7CisgICAgRnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRh
cmdldCopPiBkcmF3RnVuY3Rpb24gPSBbJnBsYXRmb3JtQ29udGV4dCwgcmVjdCwgJmZpbGxTb3Vy
Y2VdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgY29uc3QgRDJE
MV9SRUNUX0YgZDJkUmVjdCA9IHJlY3Q7CisgICAgICAgIHJlbmRlclRhcmdldC0+RmlsbFJlY3Rh
bmdsZSgmZDJkUmVjdCwgZmlsbFNvdXJjZS5icnVzaC5nZXQoKSk7CisgICAgfTsKKworICAgIGlm
IChzaGFkb3dTdGF0ZS5pc1Zpc2libGUoKSkKKyAgICAgICAgZHJhd1dpdGhTaGFkb3cocGxhdGZv
cm1Db250ZXh0LCByZWN0LCBzaGFkb3dTdGF0ZSwgZHJhd0Z1bmN0aW9uKTsKKyAgICBlbHNlCisg
ICAgICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwgZHJhd0Z1bmN0
aW9uKTsKK30KKwordm9pZCBmaWxsUmVjdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZv
cm1Db250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvciwgY29u
c3QgU2hhZG93U3RhdGUmIHNoYWRvd1N0YXRlKQoreworICAgIGF1dG8gY29udGV4dCA9IHBsYXRm
b3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19M
SU5FX18pOworICAgIFBsYXRmb3JtQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihwbGF0Zm9y
bUNvbnRleHQpOworICAgIEZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1
bmN0aW9uID0gWyZwbGF0Zm9ybUNvbnRleHQsIGNvbG9yLCByZWN0XShJRDJEMVJlbmRlclRhcmdl
dCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSBy
ZWN0OworICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUoJmQyZFJlY3QsIHBsYXRm
b3JtQ29udGV4dC5icnVzaFdpdGhDb2xvcihjb2xvcikuZ2V0KCkpOworICAgIH07CisKKyAgICBp
ZiAoc2hhZG93U3RhdGUuaXNWaXNpYmxlKCkpCisgICAgICAgIGRyYXdXaXRoU2hhZG93KHBsYXRm
b3JtQ29udGV4dCwgcmVjdCwgc2hhZG93U3RhdGUsIGRyYXdGdW5jdGlvbik7CisgICAgZWxzZQor
ICAgICAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIHJlY3QsIGRyYXdGdW5j
dGlvbik7Cit9CisKK3ZvaWQgZmlsbFJvdW5kZWRSZWN0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
JiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmIHJlY3QsIGNvbnN0IENv
bG9yJiBjb2xvciwgY29uc3QgU2hhZG93U3RhdGUmIHNoYWRvd1N0YXRlKQoreworICAgIGF1dG8g
Y29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKTsKKyAgICBjb250ZXh0LT5T
ZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIGNvbnN0IEZsb2F0UmVjdCYgciA9IHJlY3QucmVj
dCgpOworICAgIGNvbnN0IEZsb2F0Um91bmRlZFJlY3Q6OlJhZGlpJiByYWRpaSA9IHJlY3QucmFk
aWkoKTsKKyAgICBib29sIGVxdWFsV2lkdGhzID0gKHJhZGlpLnRvcExlZnQoKS53aWR0aCgpID09
IHJhZGlpLnRvcFJpZ2h0KCkud2lkdGgoKSAmJiByYWRpaS50b3BSaWdodCgpLndpZHRoKCkgPT0g
cmFkaWkuYm90dG9tTGVmdCgpLndpZHRoKCkgJiYgcmFkaWkuYm90dG9tTGVmdCgpLndpZHRoKCkg
PT0gcmFkaWkuYm90dG9tUmlnaHQoKS53aWR0aCgpKTsKKyAgICBib29sIGVxdWFsSGVpZ2h0cyA9
IChyYWRpaS50b3BMZWZ0KCkuaGVpZ2h0KCkgPT0gcmFkaWkuYm90dG9tTGVmdCgpLmhlaWdodCgp
ICYmIHJhZGlpLmJvdHRvbUxlZnQoKS5oZWlnaHQoKSA9PSByYWRpaS50b3BSaWdodCgpLmhlaWdo
dCgpICYmIHJhZGlpLnRvcFJpZ2h0KCkuaGVpZ2h0KCkgPT0gcmFkaWkuYm90dG9tUmlnaHQoKS5o
ZWlnaHQoKSk7CisgICAgYm9vbCBoYXNDdXN0b21GaWxsID0gZmFsc2U7IC8vIEZJWE1FOiBXaHkg
aXNuJ3QgYSBGaWxsU291cmNlIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uPworICAgIGlmICghaGFz
Q3VzdG9tRmlsbCAmJiBlcXVhbFdpZHRocyAmJiBlcXVhbEhlaWdodHMgJiYgcmFkaWkudG9wTGVm
dCgpLndpZHRoKCkgKiAyID09IHIud2lkdGgoKSAmJiByYWRpaS50b3BMZWZ0KCkuaGVpZ2h0KCkg
KiAyID09IHIuaGVpZ2h0KCkpIHsKKyAgICAgICAgUGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlciBz
dGF0ZVNhdmVyKHBsYXRmb3JtQ29udGV4dCk7CisgICAgICAgIEZ1bmN0aW9uPHZvaWQoSUQyRDFS
ZW5kZXJUYXJnZXQqKT4gZHJhd0Z1bmN0aW9uID0gWyZwbGF0Zm9ybUNvbnRleHQsIGNvbG9yLCBy
ZWN0LCByYWRpaSwgcl0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgeworICAgICAg
ICAgICAgYXV0byByb3VuZGVkUmVjdCA9IEQyRDE6OlJvdW5kZWRSZWN0KHIsIHJhZGlpLnRvcExl
ZnQoKS53aWR0aCgpLCByYWRpaS50b3BMZWZ0KCkuaGVpZ2h0KCkpOworICAgICAgICAgICAgcmVu
ZGVyVGFyZ2V0LT5GaWxsUm91bmRlZFJlY3RhbmdsZSgmcm91bmRlZFJlY3QsIHBsYXRmb3JtQ29u
dGV4dC5icnVzaFdpdGhDb2xvcihjb2xvcikuZ2V0KCkpOworICAgICAgICB9OworCisgICAgICAg
IGlmIChzaGFkb3dTdGF0ZS5pc1Zpc2libGUoKSkKKyAgICAgICAgICAgIGRyYXdXaXRoU2hhZG93
KHBsYXRmb3JtQ29udGV4dCwgciwgc2hhZG93U3RhdGUsIGRyYXdGdW5jdGlvbik7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgciwg
ZHJhd0Z1bmN0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQbGF0Zm9ybUNvbnRleHRTdGF0
ZVNhdmVyIHN0YXRlU2F2ZXIocGxhdGZvcm1Db250ZXh0KTsKKyAgICAgICAgUGF0aCBwYXRoOwor
ICAgICAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJlY3QpOworICAgICAgICBmaWxsUGF0aChwbGF0
Zm9ybUNvbnRleHQsIHBhdGgsIGNvbG9yLCBzaGFkb3dTdGF0ZSk7CisgICAgfQorfQorCit2b2lk
IGZpbGxSZWN0V2l0aFJvdW5kZWRIb2xlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9y
bUNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgRmxvYXRSb3VuZGVkUmVjdCYg
cm91bmRlZEhvbGVSZWN0LCBjb25zdCBGaWxsU291cmNlJiBmaWxsU291cmNlLCBjb25zdCBTaGFk
b3dTdGF0ZSYgc2hhZG93U3RhdGUpCit7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250
ZXh0LnJlbmRlclRhcmdldCgpOworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7
CisKKyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRSZWN0KHJlY3QpOworCisgICAgaWYgKCFy
b3VuZGVkSG9sZVJlY3QucmFkaWkoKS5pc1plcm8oKSkKKyAgICAgICAgcGF0aC5hZGRSb3VuZGVk
UmVjdChyb3VuZGVkSG9sZVJlY3QpOworICAgIGVsc2UKKyAgICAgICAgcGF0aC5hZGRSZWN0KHJv
dW5kZWRIb2xlUmVjdC5yZWN0KCkpOworCisgICAgRmlsbFNvdXJjZSBmaWxsV2l0aEhvbGVTb3Vy
Y2UgPSBmaWxsU291cmNlOworICAgIGZpbGxXaXRoSG9sZVNvdXJjZS5maWxsUnVsZSA9IFdpbmRS
dWxlOjpFdmVuT2RkOworCisgICAgZmlsbFBhdGgocGxhdGZvcm1Db250ZXh0LCBwYXRoLCBmaWxs
U291cmNlLCBzaGFkb3dTdGF0ZSk7Cit9CisKK3ZvaWQgZmlsbFJlY3RXaXRoR3JhZGllbnQoUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiBy
ZWN0LCBJRDJEMUJydXNoKiBncmFkaWVudCkKK3sKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9y
bUNvbnRleHQucmVuZGVyVGFyZ2V0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElO
RV9fKTsKKyAgICBQbGF0Zm9ybUNvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIocGxhdGZvcm1D
b250ZXh0KTsKKyAgICBGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+IGRyYXdGdW5j
dGlvbiA9IFsmcGxhdGZvcm1Db250ZXh0LCByZWN0LCAmZ3JhZGllbnRdKElEMkQxUmVuZGVyVGFy
Z2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9
IHJlY3Q7CisgICAgICAgIHJlbmRlclRhcmdldC0+RmlsbFJlY3RhbmdsZSgmZDJkUmVjdCwgZ3Jh
ZGllbnQpOworICAgIH07Cit9CisKK3ZvaWQgZmlsbFBhdGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgUGF0aCYgcGF0aCwgY29uc3QgRmlsbFNvdXJjZSYg
ZmlsbFNvdXJjZSwgY29uc3QgU2hhZG93U3RhdGUmIHNoYWRvd1N0YXRlKQoreworICAgIGlmIChw
YXRoLmFjdGl2ZVBhdGgoKSkgeworICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBjbG9zZWQuIFRo
aXMgbWlnaHQgZmFpbCBpZiB0aGUgcGF0aCB3YXMgYWxyZWFkeSBjbG9zZWQsIHNvCisgICAgICAg
IC8vIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLgorICAgICAgICBwYXRoLmFjdGl2ZVBhdGgoKS0+
Q2xvc2UoKTsKKyAgICB9CisKKyAgICBQbGF0Zm9ybUNvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2
ZXIocGxhdGZvcm1Db250ZXh0KTsKKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4
dC5yZW5kZXJUYXJnZXQoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwor
CisgICAgQ09NUHRyPElEMkQxR2VvbWV0cnlHcm91cD4gcGF0aFRvRmlsbDsKKyAgICBwYXRoLmNy
ZWF0ZUdlb21ldHJ5V2l0aEZpbGxNb2RlKGZpbGxTb3VyY2UuZmlsbFJ1bGUsIHBhdGhUb0ZpbGwp
OworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAgICBGdW5jdGlvbjx2
b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+IGRyYXdGdW5jdGlvbiA9IFsmcGxhdGZvcm1Db250ZXh0
LCAmcGF0aFRvRmlsbCwgJmZpbGxTb3VyY2VdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJn
ZXQpIHsKKyAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsR2VvbWV0cnkocGF0aFRvRmlsbC5nZXQo
KSwgZmlsbFNvdXJjZS5icnVzaC5nZXQoKSk7CisgICAgfTsKKworICAgIGlmIChzaGFkb3dTdGF0
ZS5pc1Zpc2libGUoKSkgeworICAgICAgICBGbG9hdFJlY3QgYm91bmRpbmdSZWN0ID0gcGF0aC5m
YXN0Qm91bmRpbmdSZWN0KCk7CisgICAgICAgIGRyYXdXaXRoU2hhZG93KHBsYXRmb3JtQ29udGV4
dCwgYm91bmRpbmdSZWN0LCBzaGFkb3dTdGF0ZSwgZHJhd0Z1bmN0aW9uKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICBGbG9hdFJlY3QgY29udGV4dFJlY3QoRmxvYXRQb2ludCgpLCBjb250ZXh0LT5H
ZXRTaXplKCkpOworICAgICAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIGNv
bnRleHRSZWN0LCBkcmF3RnVuY3Rpb24pOworICAgIH0KKworICAgIGZsdXNoKHBsYXRmb3JtQ29u
dGV4dCk7Cit9CisKK3ZvaWQgZmlsbFBhdGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRm
b3JtQ29udGV4dCwgY29uc3QgUGF0aCYgcGF0aCwgY29uc3QgQ29sb3ImIGNvbG9yLCBjb25zdCBT
aGFkb3dTdGF0ZSYgc2hhZG93U3RhdGUpCit7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1D
b250ZXh0LnJlbmRlclRhcmdldCgpOworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVf
Xyk7CisKKyAgICBDT01QdHI8SUQyRDFHZW9tZXRyeUdyb3VwPiBwYXRoVG9GaWxsOworICAgIHBh
dGguY3JlYXRlR2VvbWV0cnlXaXRoRmlsbE1vZGUoV2luZFJ1bGU6OkV2ZW5PZGQsIHBhdGhUb0Zp
bGwpOworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAgICBGdW5jdGlv
bjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+IGRyYXdGdW5jdGlvbiA9IFsmcGxhdGZvcm1Db250
ZXh0LCAmcGF0aFRvRmlsbCwgY29sb3JdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQp
IHsKKyAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsR2VvbWV0cnkocGF0aFRvRmlsbC5nZXQoKSwg
cGxhdGZvcm1Db250ZXh0LmJydXNoV2l0aENvbG9yKGNvbG9yKS5nZXQoKSk7CisgICAgfTsKKwor
ICAgIGlmIChzaGFkb3dTdGF0ZS5pc1Zpc2libGUoKSkgeworICAgICAgICBGbG9hdFJlY3QgYm91
bmRpbmdSZWN0ID0gcGF0aC5mYXN0Qm91bmRpbmdSZWN0KCk7CisgICAgICAgIGRyYXdXaXRoU2hh
ZG93KHBsYXRmb3JtQ29udGV4dCwgYm91bmRpbmdSZWN0LCBzaGFkb3dTdGF0ZSwgZHJhd0Z1bmN0
aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBGbG9hdFJlY3QgY29udGV4dFJlY3QoRmxvYXRQ
b2ludCgpLCBjb250ZXh0LT5HZXRTaXplKCkpOworICAgICAgICBkcmF3V2l0aG91dFNoYWRvdyhw
bGF0Zm9ybUNvbnRleHQsIGNvbnRleHRSZWN0LCBkcmF3RnVuY3Rpb24pOworICAgIH0KKworICAg
IGZsdXNoKHBsYXRmb3JtQ29udGV4dCk7Cit9CisKK3ZvaWQgc3Ryb2tlUmVjdChQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGZs
b2F0IGxpbmVXaWR0aCwgY29uc3QgU3Ryb2tlU291cmNlJiBzdHJva2VTb3VyY2UsIGNvbnN0IFNo
YWRvd1N0YXRlJiBzaGFkb3dTdGF0ZSkKK3sKKyAgICBGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVy
VGFyZ2V0Kik+IGRyYXdGdW5jdGlvbiA9IFsmcGxhdGZvcm1Db250ZXh0LCAmc3Ryb2tlU291cmNl
LCByZWN0LCBsaW5lV2lkdGhdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAg
ICAgICAgcmVuZGVyVGFyZ2V0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKyAgICAgICAgY29uc3Qg
RDJEMV9SRUNUX0YgZDJkUmVjdCA9IHJlY3Q7CisgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd1Jl
Y3RhbmdsZSgmZDJkUmVjdCwgc3Ryb2tlU291cmNlLmJydXNoLmdldCgpLCBsaW5lV2lkdGgsIHBs
YXRmb3JtQ29udGV4dC5zdHJva2VTdHlsZSgpKTsKKyAgICB9OworCisgICAgaWYgKHNoYWRvd1N0
YXRlLmlzVmlzaWJsZSgpKQorICAgICAgICBkcmF3V2l0aFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQs
IHJlY3QsIHNoYWRvd1N0YXRlLCBkcmF3RnVuY3Rpb24pOworICAgIGVsc2UKKyAgICAgICAgZHJh
d1dpdGhvdXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCByZWN0LCBkcmF3RnVuY3Rpb24pOworfQor
Cit2b2lkIHN0cm9rZVBhdGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4
dCwgY29uc3QgUGF0aCYgcGF0aCwgY29uc3QgU3Ryb2tlU291cmNlJiBzdHJva2VTb3VyY2UsIGNv
bnN0IFNoYWRvd1N0YXRlJiBzaGFkb3dTdGF0ZSkKK3sKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0
Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCk7CisgICAgCisgICAgY29udGV4dC0+U2V0VGFncygx
LCBfX0xJTkVfXyk7CisKKyAgICBQbGF0Zm9ybUNvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIo
cGxhdGZvcm1Db250ZXh0KTsKKyAgICBhdXRvIGJvdW5kaW5nUmVjdCA9IHBhdGguZmFzdEJvdW5k
aW5nUmVjdCgpOworICAgIEZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1
bmN0aW9uID0gWyZwbGF0Zm9ybUNvbnRleHQsICZwYXRoLCAmc3Ryb2tlU291cmNlXShJRDJEMVJl
bmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0dl
b21ldHJ5KHBhdGgucGxhdGZvcm1QYXRoKCksIHN0cm9rZVNvdXJjZS5icnVzaC5nZXQoKSwgc3Ry
b2tlU291cmNlLnRoaWNrbmVzcywgcGxhdGZvcm1Db250ZXh0LnN0cm9rZVN0eWxlKCkpOworICAg
IH07CisKKyAgICBpZiAoc2hhZG93U3RhdGUuaXNWaXNpYmxlKCkpCisgICAgICAgIGRyYXdXaXRo
U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgYm91bmRpbmdSZWN0LCBzaGFkb3dTdGF0ZSwgZHJhd0Z1
bmN0aW9uKTsKKyAgICBlbHNlCisgICAgICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29u
dGV4dCwgYm91bmRpbmdSZWN0LCBkcmF3RnVuY3Rpb24pOworCisgICAgZmx1c2gocGxhdGZvcm1D
b250ZXh0KTsKK30KKwordm9pZCBkcmF3UGF0aChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxh
dGZvcm1Db250ZXh0LCBjb25zdCBQYXRoJiBwYXRoLCBjb25zdCBTdHJva2VTb3VyY2UmIHN0cm9r
ZVNvdXJjZSwgY29uc3QgU2hhZG93U3RhdGUmKQoreworICAgIGF1dG8gY29udGV4dCA9IHBsYXRm
b3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKTsKKworICAgIGlmIChwYXRoLmFjdGl2ZVBhdGgoKSkK
KyAgICAgICAgcGF0aC5hY3RpdmVQYXRoKCktPkNsb3NlKCk7CisKKyAgICBjb250ZXh0LT5TZXRU
YWdzKDEsIF9fTElORV9fKTsKKworICAgIGF1dG8gcmVjdCA9IHBhdGguZmFzdEJvdW5kaW5nUmVj
dCgpOworICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwgWyZwbGF0
Zm9ybUNvbnRleHQsICZzdHJva2VTb3VyY2UsICZwYXRoXShJRDJEMVJlbmRlclRhcmdldCogcmVu
ZGVyVGFyZ2V0KSB7CisgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0dlb21ldHJ5KHBhdGgucGxh
dGZvcm1QYXRoKCksIHN0cm9rZVNvdXJjZS5icnVzaC5nZXQoKSwgc3Ryb2tlU291cmNlLnRoaWNr
bmVzcywgcGxhdGZvcm1Db250ZXh0LnN0cm9rZVN0eWxlKCkpOworICAgIH0pOworCisgICAgZmx1
c2gocGxhdGZvcm1Db250ZXh0KTsKK30KKwordm9pZCBkcmF3V2l0aFNoYWRvd0hlbHBlcihJRDJE
MVJlbmRlclRhcmdldCogY29udGV4dCwgSUQyRDFCaXRtYXAqIGJpdG1hcCwgY29uc3QgQ29sb3Im
IHNoYWRvd0NvbG9yLCBjb25zdCBGbG9hdFNpemUmIHNoYWRvd09mZnNldCwgZmxvYXQgc2hhZG93
Qmx1cikKK3sKKyAgICBDT01QdHI8SUQyRDFEZXZpY2VDb250ZXh0PiBkZXZpY2VDb250ZXh0Owor
ICAgIEhSRVNVTFQgaHIgPSBjb250ZXh0LT5RdWVyeUludGVyZmFjZSgmZGV2aWNlQ29udGV4dCk7
CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisKKyAgICAvLyBDcmVhdGUgdGhl
IHNoYWRvdyBlZmZlY3QKKyAgICBDT01QdHI8SUQyRDFFZmZlY3Q+IHNoYWRvd0VmZmVjdDsKKyAg
ICBociA9IGRldmljZUNvbnRleHQtPkNyZWF0ZUVmZmVjdChDTFNJRF9EMkQxU2hhZG93LCAmc2hh
ZG93RWZmZWN0KTsKKyAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKworICAgIHNo
YWRvd0VmZmVjdC0+U2V0SW5wdXQoMCwgYml0bWFwKTsKKyAgICBzaGFkb3dFZmZlY3QtPlNldFZh
bHVlKEQyRDFfU0hBRE9XX1BST1BfQ09MT1IsIHN0YXRpY19jYXN0PEQyRDFfVkVDVE9SXzRGPihz
aGFkb3dDb2xvcikpOworICAgIHNoYWRvd0VmZmVjdC0+U2V0VmFsdWUoRDJEMV9TSEFET1dfUFJP
UF9CTFVSX1NUQU5EQVJEX0RFVklBVElPTiwgc2hhZG93Qmx1cik7CisKKyAgICBDT01QdHI8SUQy
RDFFZmZlY3Q+IHRyYW5zZm9ybUVmZmVjdDsKKyAgICBociA9IGRldmljZUNvbnRleHQtPkNyZWF0
ZUVmZmVjdChDTFNJRF9EMkQxMkRBZmZpbmVUcmFuc2Zvcm0sICZ0cmFuc2Zvcm1FZmZlY3QpOwor
ICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOworCisgICAgdHJhbnNmb3JtRWZmZWN0
LT5TZXRJbnB1dEVmZmVjdCgwLCBzaGFkb3dFZmZlY3QuZ2V0KCkpOworCisgICAgYXV0byB0cmFu
c2xhdGlvbiA9IEQyRDE6Ok1hdHJpeDN4MkY6OlRyYW5zbGF0aW9uKHNoYWRvd09mZnNldC53aWR0
aCgpLCBzaGFkb3dPZmZzZXQuaGVpZ2h0KCkpOworICAgIHRyYW5zZm9ybUVmZmVjdC0+U2V0VmFs
dWUoRDJEMV8yREFGRklORVRSQU5TRk9STV9QUk9QX1RSQU5TRk9STV9NQVRSSVgsIHRyYW5zbGF0
aW9uKTsKKworICAgIENPTVB0cjxJRDJEMUVmZmVjdD4gY29tcG9zaXRvcjsKKyAgICBociA9IGRl
dmljZUNvbnRleHQtPkNyZWF0ZUVmZmVjdChDTFNJRF9EMkQxQ29tcG9zaXRlLCAmY29tcG9zaXRv
cik7CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisKKyAgICBjb21wb3NpdG9y
LT5TZXRJbnB1dEVmZmVjdCgwLCB0cmFuc2Zvcm1FZmZlY3QuZ2V0KCkpOworICAgIGNvbXBvc2l0
b3ItPlNldElucHV0KDEsIGJpdG1hcCk7CisKKyAgICAvLyBGbGlwIHRoZSBjb250ZXh0CisgICAg
RDJEMV9NQVRSSVhfM1gyX0YgY3RtOworICAgIGRldmljZUNvbnRleHQtPkdldFRyYW5zZm9ybSgm
Y3RtKTsKKyAgICBhdXRvIHRyYW5zbGF0ZSA9IEQyRDE6Ok1hdHJpeDN4MkY6OlRyYW5zbGF0aW9u
KDAuMGYsIGRldmljZUNvbnRleHQtPkdldFNpemUoKS5oZWlnaHQpOworICAgIGF1dG8gZmxpcCA9
IEQyRDE6Ok1hdHJpeDN4MkY6OlNjYWxlKEQyRDE6OlNpemVGKDEuMGYsIC0xLjBmKSk7CisgICAg
ZGV2aWNlQ29udGV4dC0+U2V0VHJhbnNmb3JtKGN0bSAqIGZsaXAgKiB0cmFuc2xhdGUpOworCisg
ICAgZGV2aWNlQ29udGV4dC0+RHJhd0ltYWdlKGNvbXBvc2l0b3IuZ2V0KCksIEQyRDFfSU5URVJQ
T0xBVElPTl9NT0RFX0xJTkVBUik7Cit9CisKK3ZvaWQgZHJhd1dpdGhTaGFkb3coUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiBib3VuZGlu
Z1JlY3QsIGNvbnN0IFNoYWRvd1N0YXRlJiBzaGFkb3dTdGF0ZSwgY29uc3QgV1RGOjpGdW5jdGlv
bjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+JiBkcmF3Q29tbWFuZHMpCit7CisgICAgYXV0byBj
b250ZXh0ID0gcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpOworCisgICAgLy8gUmVuZGVy
IHRoZSBjdXJyZW50IGdlb21ldHJ5IHRvIGEgYml0bWFwIGNvbnRleHQKKyAgICBDT01QdHI8SUQy
RDFCaXRtYXBSZW5kZXJUYXJnZXQ+IGJpdG1hcFRhcmdldDsKKyAgICBIUkVTVUxUIGhyID0gY29u
dGV4dC0+Q3JlYXRlQ29tcGF0aWJsZVJlbmRlclRhcmdldCgmYml0bWFwVGFyZ2V0KTsKKyAgICBS
RUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKworICAgIGJpdG1hcFRhcmdldC0+QmVnaW5E
cmF3KCk7CisgICAgZHJhd0NvbW1hbmRzKGJpdG1hcFRhcmdldC5nZXQoKSk7CisgICAgaHIgPSBi
aXRtYXBUYXJnZXQtPkVuZERyYXcoKTsKKyAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIp
KTsKKworICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gYml0bWFwOworICAgIGhyID0gYml0bWFwVGFy
Z2V0LT5HZXRCaXRtYXAoJmJpdG1hcCk7CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhy
KSk7CisKKyAgICBkcmF3V2l0aFNoYWRvd0hlbHBlcihjb250ZXh0LCBiaXRtYXAuZ2V0KCksIHNo
YWRvd1N0YXRlLmNvbG9yLCBzaGFkb3dTdGF0ZS5vZmZzZXQsIHNoYWRvd1N0YXRlLmJsdXIpOwor
fQorCit2b2lkIGRyYXdXaXRob3V0U2hhZG93KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0
Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgLypib3VuZGluZ1JlY3QqLywgY29uc3QgV1RG
OjpGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+JiBkcmF3Q29tbWFuZHMpCit7Cisg
ICAgZHJhd0NvbW1hbmRzKHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKSk7Cit9CisKK3Zv
aWQgY2xlYXJSZWN0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNv
bnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNv
bnRleHQsIHJlY3QsIFsmcGxhdGZvcm1Db250ZXh0LCByZWN0XShJRDJEMVJlbmRlclRhcmdldCog
cmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIEZsb2F0UmVjdCByZW5kZXJUYXJnZXRSZWN0KEZsb2F0
UG9pbnQoKSwgcmVuZGVyVGFyZ2V0LT5HZXRTaXplKCkpOworICAgICAgICBGbG9hdFJlY3QgcmVj
dFRvQ2xlYXIocmVjdCk7CisKKyAgICAgICAgaWYgKHJlY3RUb0NsZWFyLmNvbnRhaW5zKHJlbmRl
clRhcmdldFJlY3QpKSB7CisgICAgICAgICAgICByZW5kZXJUYXJnZXQtPlNldFRhZ3MoMSwgX19M
SU5FX18pOworICAgICAgICAgICAgcmVuZGVyVGFyZ2V0LT5DbGVhcihEMkQxOjpDb2xvckYoMCwg
MCwgMCwgMCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYg
KCFyZWN0VG9DbGVhci5pbnRlcnNlY3RzKHJlbmRlclRhcmdldFJlY3QpKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIHJlbmRlclRhcmdldC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Cisg
ICAgICAgIHJlY3RUb0NsZWFyLmludGVyc2VjdChyZW5kZXJUYXJnZXRSZWN0KTsKKyAgICAgICAg
cmVuZGVyVGFyZ2V0LT5GaWxsUmVjdGFuZ2xlKHJlY3RUb0NsZWFyLCBwbGF0Zm9ybUNvbnRleHQu
YnJ1c2hXaXRoQ29sb3IoQ29sb3IoRDJEMTo6Q29sb3JGKDAsIDAsIDAsIDApKSkuZ2V0KCkpOwor
ICAgIH0pOworfQorCisvKgordm9pZCBkcmF3R2x5cGhzKFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
JiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZpbGxTb3VyY2UmIGZpbGxTb3VyY2UsIGNvbnN0IFN0
cm9rZVNvdXJjZSYgc3Ryb2tlU291cmNlLCBjb25zdCBTaGFkb3dTdGF0ZSYgc2hhZG93U3RhdGUs
IGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBEaXJlY3RXcml0ZVNjYWxlZEZvbnQqIHNjYWxlZEZv
bnQsIGRvdWJsZSBzeW50aGV0aWNCb2xkT2Zmc2V0LCBjb25zdCBWZWN0b3I8RGlyZWN0V3JpdGVH
bHlwaFR5cGU+JiBnbHlwaHMsIGZsb2F0IHhPZmZzZXQsIFRleHREcmF3aW5nTW9kZUZsYWdzIHRl
eHREcmF3aW5nTW9kZSwgZmxvYXQgc3Ryb2tlVGhpY2tuZXNzLCBjb25zdCBGbG9hdFNpemUmIHNo
YWRvd09mZnNldCwgY29uc3QgQ29sb3ImIHNoYWRvd0NvbG9yKQoreworICAgIG5vdEltcGxlbWVu
dGVkKCk7Cit9CisqLworCit2b2lkIGRyYXdOYXRpdmVJbWFnZShQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRCYgcGxhdGZvcm1Db250ZXh0LCBJV0lDQml0bWFwKiBpbWFnZSwgY29uc3QgRmxvYXRTaXpl
JiBpbWFnZVNpemUsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYg
c3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSBi
bGVuZE1vZGUsIEltYWdlT3JpZW50YXRpb24gb3JpZW50YXRpb24sIEludGVycG9sYXRpb25RdWFs
aXR5IGltYWdlSW50ZXJwb2xhdGlvblF1YWxpdHksIGZsb2F0IGdsb2JhbEFscGhhLCBjb25zdCBT
aGFkb3dTdGF0ZSYgc2hhZG93U3RhdGUpCit7CisgICAgQ09NUHRyPElEMkQxQml0bWFwPiBkZXZp
Y2VCaXRtYXA7CisgICAgSFJFU1VMVCBociA9IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQo
KS0+Q3JlYXRlQml0bWFwRnJvbVdpY0JpdG1hcChpbWFnZSwgJmRldmljZUJpdG1hcCk7CisgICAg
aWYgKCFTVUNDRUVERUQoaHIpKQorICAgICAgICByZXR1cm47CisKKyAgICBkcmF3TmF0aXZlSW1h
Z2UocGxhdGZvcm1Db250ZXh0LCBkZXZpY2VCaXRtYXAuZ2V0KCksIGltYWdlU2l6ZSwgZGVzdFJl
Y3QsIHNyY1JlY3QsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUsIG9yaWVudGF0aW9uLCBp
bWFnZUludGVycG9sYXRpb25RdWFsaXR5LCBnbG9iYWxBbHBoYSwgc2hhZG93U3RhdGUpOworfQor
Cit2b2lkIGRyYXdOYXRpdmVJbWFnZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1D
b250ZXh0LCBJRDJEMUJpdG1hcCogaW1hZ2UsIGNvbnN0IEZsb2F0U2l6ZSYgaW1hZ2VTaXplLCBj
b25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBv
c2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUgYmxlbmRNb2RlLCBJbWFn
ZU9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBJbnRlcnBvbGF0aW9uUXVhbGl0eSBpbWFnZUludGVy
cG9sYXRpb25RdWFsaXR5LCBmbG9hdCBnbG9iYWxBbHBoYSwgY29uc3QgU2hhZG93U3RhdGUmIHNo
YWRvd1N0YXRlKQoreworICAgIGF1dG8gYml0bWFwU2l6ZSA9IGltYWdlLT5HZXRTaXplKCk7CisK
KyAgICBmbG9hdCBjdXJySGVpZ2h0ID0gb3JpZW50YXRpb24udXNlc1dpZHRoQXNIZWlnaHQoKSA/
IGJpdG1hcFNpemUud2lkdGggOiBiaXRtYXBTaXplLmhlaWdodDsKKyAgICBpZiAoY3VyckhlaWdo
dCA8PSBzcmNSZWN0LnkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byBjb250ZXh0ID0g
cGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpOworCisgICAgRDJEMV9NQVRSSVhfM1gyX0Yg
Y3RtOworICAgIGNvbnRleHQtPkdldFRyYW5zZm9ybSgmY3RtKTsKKworICAgIEFmZmluZVRyYW5z
Zm9ybSB0cmFuc2Zvcm0oY3RtKTsKKworICAgIFBsYXRmb3JtQ29udGV4dFN0YXRlU2F2ZXIgc3Rh
dGVTYXZlcihwbGF0Zm9ybUNvbnRleHQpOworCisgICAgYm9vbCBzaG91bGRVc2VTdWJpbWFnZSA9
IGZhbHNlOworCisgICAgLy8gSWYgdGhlIHNvdXJjZSByZWN0IGlzIGEgc3VicG9ydGlvbiBvZiB0
aGUgaW1hZ2UsIHRoZW4gd2UgY29tcHV0ZSBhbiBpbmZsYXRlZCBkZXN0aW5hdGlvbiByZWN0IHRo
YXQgd2lsbCBob2xkIHRoZSBlbnRpcmUgaW1hZ2UKKyAgICAvLyBhbmQgdGhlbiBzZXQgYSBjbGlw
IHRvIHRoZSBwb3J0aW9uIHRoYXQgd2Ugd2FudCB0byBkaXNwbGF5LgorICAgIEZsb2F0UmVjdCBh
ZGp1c3RlZERlc3RSZWN0ID0gZGVzdFJlY3Q7CisKKyAgICBpZiAoc3JjUmVjdC5zaXplKCkgIT0g
aW1hZ2VTaXplKSB7CisgICAgICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgaW1hZ2Ugc2NhbGluZwor
ICAgICAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIH0KKworICAgIC8vIElmIHRoZSBpbWFnZSBp
cyBvbmx5IHBhcnRpYWxseSBsb2FkZWQsIHRoZW4gc2hyaW5rIHRoZSBkZXN0aW5hdGlvbiByZWN0
IHRoYXQgd2UncmUgZHJhd2luZyBpbnRvIGFjY29yZGluZ2x5LgorICAgIGlmICghc2hvdWxkVXNl
U3ViaW1hZ2UgJiYgY3VyckhlaWdodCA8IGltYWdlU2l6ZS5oZWlnaHQoKSkKKyAgICAgICAgYWRq
dXN0ZWREZXN0UmVjdC5zZXRIZWlnaHQoYWRqdXN0ZWREZXN0UmVjdC5oZWlnaHQoKSAqIGN1cnJI
ZWlnaHQgLyBpbWFnZVNpemUuaGVpZ2h0KCkpOworCisgICAgU3RhdGU6OnNldENvbXBvc2l0ZU9w
ZXJhdGlvbihwbGF0Zm9ybUNvbnRleHQsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUpOwor
CisgICAgLy8gSW1hZ2VPcmllbnRhdGlvbiBleHBlY3RzIHRoZSBvcmlnaW4gdG8gYmUgYXQgKDAs
IDApLgorICAgIHRyYW5zZm9ybS50cmFuc2xhdGUoYWRqdXN0ZWREZXN0UmVjdC54KCksIGFkanVz
dGVkRGVzdFJlY3QueSgpKTsKKyAgICBjb250ZXh0LT5TZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsK
KyAgICBhZGp1c3RlZERlc3RSZWN0LnNldExvY2F0aW9uKEZsb2F0UG9pbnQoKSk7CisKKyAgICBp
ZiAob3JpZW50YXRpb24gIT0gRGVmYXVsdEltYWdlT3JpZW50YXRpb24pIHsKKyAgICAgICAgY29u
Y2F0Q1RNKHBsYXRmb3JtQ29udGV4dCwgb3JpZW50YXRpb24udHJhbnNmb3JtRnJvbURlZmF1bHQo
YWRqdXN0ZWREZXN0UmVjdC5zaXplKCkpKTsKKyAgICAgICAgaWYgKG9yaWVudGF0aW9uLnVzZXNX
aWR0aEFzSGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBkZXN0aW5hdGlvbiByZWN0IHdp
bGwgaGF2ZSBpdCdzIHdpZHRoIGFuZCBoZWlnaHQgYWxyZWFkeSByZXZlcnNlZCBmb3IgdGhlIG9y
aWVudGF0aW9uIG9mCisgICAgICAgICAgICAvLyB0aGUgaW1hZ2UsIGFzIGl0IHdhcyBuZWVkZWQg
Zm9yIHBhZ2UgbGF5b3V0LCBzbyB3ZSBuZWVkIHRvIHJldmVyc2UgaXQgYmFjayBoZXJlLgorICAg
ICAgICAgICAgYWRqdXN0ZWREZXN0UmVjdCA9IEZsb2F0UmVjdChhZGp1c3RlZERlc3RSZWN0Lngo
KSwgYWRqdXN0ZWREZXN0UmVjdC55KCksIGFkanVzdGVkRGVzdFJlY3QuaGVpZ2h0KCksIGFkanVz
dGVkRGVzdFJlY3Qud2lkdGgoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb250ZXh0LT5T
ZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIEZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJn
ZXQqKT4gZHJhd0Z1bmN0aW9uID0gW2ltYWdlLCBhZGp1c3RlZERlc3RSZWN0LCBzcmNSZWN0XShJ
RDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIHJlbmRlclRhcmdldC0+
RHJhd0JpdG1hcChpbWFnZSwgYWRqdXN0ZWREZXN0UmVjdCwgMS4wZiwgRDJEMV9CSVRNQVBfSU5U
RVJQT0xBVElPTl9NT0RFX0xJTkVBUiwgc3RhdGljX2Nhc3Q8RDJEMV9SRUNUX0Y+KHNyY1JlY3Qp
KTsKKyAgICB9OworCisgICAgaWYgKHNoYWRvd1N0YXRlLmlzVmlzaWJsZSgpKQorICAgICAgICBk
cmF3V2l0aFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIGFkanVzdGVkRGVzdFJlY3QsIHNoYWRvd1N0
YXRlLCBkcmF3RnVuY3Rpb24pOworICAgIGVsc2UKKyAgICAgICAgZHJhd1dpdGhvdXRTaGFkb3co
cGxhdGZvcm1Db250ZXh0LCBhZGp1c3RlZERlc3RSZWN0LCBkcmF3RnVuY3Rpb24pOworCisgICAg
Zmx1c2gocGxhdGZvcm1Db250ZXh0KTsKKworICAgIGlmICghc3RhdGVTYXZlci5kaWRTYXZlKCkp
CisgICAgICAgIGNvbnRleHQtPlNldFRyYW5zZm9ybShjdG0pOworfQorCit2b2lkIGRyYXdQYXR0
ZXJuKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIElXSUNCaXRtYXAq
IHRpbGVJbWFnZSwgY29uc3QgSW50U2l6ZSYgc2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVj
dCwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0
ZXJuVHJhbnNmb3JtLCBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Ig
Y29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSBibGVuZE1vZGUpCit7CisgICAgYXV0byBjb250
ZXh0ID0gcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpOworICAgIFBsYXRmb3JtQ29udGV4
dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihwbGF0Zm9ybUNvbnRleHQpOworCisgICAgY2xpcChwbGF0
Zm9ybUNvbnRleHQsIGRlc3RSZWN0KTsKKworICAgIFN0YXRlOjpzZXRDb21wb3NpdGVPcGVyYXRp
b24ocGxhdGZvcm1Db250ZXh0LCBjb21wb3NpdGVPcGVyYXRvciwgYmxlbmRNb2RlKTsKKworICAg
IGF1dG8gYml0bWFwQnJ1c2hQcm9wZXJ0aWVzID0gRDJEMTo6Qml0bWFwQnJ1c2hQcm9wZXJ0aWVz
KCk7CisgICAgYml0bWFwQnJ1c2hQcm9wZXJ0aWVzLmV4dGVuZE1vZGVYID0gRDJEMV9FWFRFTkRf
TU9ERV9XUkFQOworICAgIGJpdG1hcEJydXNoUHJvcGVydGllcy5leHRlbmRNb2RlWSA9IEQyRDFf
RVhURU5EX01PREVfV1JBUDsKKworICAgIC8vIENyZWF0ZSBhIGJydXNoIHRyYW5zZm9ybWF0aW9u
IHNvIHdlIHBhaW50IHVzaW5nIHRoZSBzZWN0aW9uIG9mIHRoZSBpbWFnZSB3ZSBjYXJlIGFib3V0
LgorICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm1hdGlvbiA9IHBhdHRlcm5UcmFuc2Zvcm07
CisgICAgdHJhbnNmb3JtYXRpb24udHJhbnNsYXRlKGRlc3RSZWN0LmxvY2F0aW9uKCkpOworCisg
ICAgYXV0byBicnVzaFByb3BlcnRpZXMgPSBEMkQxOjpCcnVzaFByb3BlcnRpZXMoKTsKKyAgICBi
cnVzaFByb3BlcnRpZXMudHJhbnNmb3JtID0gdHJhbnNmb3JtYXRpb247CisgICAgYnJ1c2hQcm9w
ZXJ0aWVzLm9wYWNpdHkgPSAxLjBmOworCisgICAgLy8gSWYgd2Ugb25seSB3YW50IGEgc3Vic2V0
IG9mIHRoZSBiaXRtYXAsIHdlIG5lZWQgdG8gY3JlYXRlIGEgY3JvcHBlZCBiaXRtYXAgaW1hZ2Uu
IEFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbiwKKyAgICAvLyB0aGlzIGRvZXMgbm90IGFs
bG9jYXRlIG5ldyBiaXRtYXAgbWVtb3J5LgorICAgIGlmIChzaXplLndpZHRoKCkgPiBkZXN0UmVj
dC53aWR0aCgpIHx8IHNpemUuaGVpZ2h0KCkgPiBkZXN0UmVjdC5oZWlnaHQoKSkgeworICAgICAg
ICBBU1NFUlQoMCk7CisgICAgICAgIC8qCisgICAgICAgIGZsb2F0IGRwaVggPSAwOworICAgICAg
ICBmbG9hdCBkcGlZID0gMDsKKyAgICAgICAgdGlsZUltYWdlLT5HZXREcGkoJmRwaVgsICZkcGlZ
KTsKKyAgICAgICAgYXV0byBiaXRtYXBQcm9wZXJ0aWVzID0gRDJEMTo6Qml0bWFwUHJvcGVydGll
cyh0aWxlSW1hZ2UtPkdldFBpeGVsRm9ybWF0KCksIGRwaVgsIGRwaVkpOworICAgICAgICBDT01Q
dHI8SUQyRDFCaXRtYXA+IHN1YkltYWdlOworICAgICAgICBIUkVTVUxUIGhyID0gY29udGV4dC0+
Q3JlYXRlQml0bWFwKEludFNpemUodGlsZVJlY3Quc2l6ZSgpKSwgYml0bWFwUHJvcGVydGllcywg
JnN1YkltYWdlKTsKKyAgICAgICAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICAgICAgICAgIEQy
RDFfUkVDVF9VIGZpbmlzaFJlY3QgPSBJbnRSZWN0KHRpbGVSZWN0KTsKKyAgICAgICAgICAgIGhy
ID0gc3ViSW1hZ2UtPkNvcHlGcm9tQml0bWFwKG51bGxwdHIsIHRpbGVJbWFnZS5nZXQoKSwgJmZp
bmlzaFJlY3QpOworICAgICAgICAgICAgaWYgKFNVQ0NFRURFRChocikpCisgICAgICAgICAgICAg
ICAgdGlsZUltYWdlID0gc3ViSW1hZ2U7CisgICAgICAgIH0KKyAgICAgICAgKi8KKyAgICB9CisK
KyAgICBDT01QdHI8SUQyRDFCaXRtYXA+IGJpdG1hcDsKKyAgICBIUkVTVUxUIGhyID0gY29udGV4
dC0+Q3JlYXRlQml0bWFwRnJvbVdpY0JpdG1hcCh0aWxlSW1hZ2UsIG51bGxwdHIsICZiaXRtYXAp
OworICAgIGlmICghU1VDQ0VFREVEKGhyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQ09NUHRy
PElEMkQxQml0bWFwQnJ1c2g+IHBhdHRlcm5CcnVzaDsKKyAgICBociA9IGNvbnRleHQtPkNyZWF0
ZUJpdG1hcEJydXNoKGJpdG1hcC5nZXQoKSwgJmJpdG1hcEJydXNoUHJvcGVydGllcywgJmJydXNo
UHJvcGVydGllcywgJnBhdHRlcm5CcnVzaCk7CisgICAgQVNTRVJUKFNVQ0NFRURFRChocikpOwor
ICAgIGlmICghU1VDQ0VFREVEKGhyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZHJhd1dpdGhv
dXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCBkZXN0UmVjdCwgW2Rlc3RSZWN0LCBwYXR0ZXJuQnJ1
c2hdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgY29uc3QgRDJE
MV9SRUNUX0YgZDJkUmVjdCA9IGRlc3RSZWN0OworICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxS
ZWN0YW5nbGUoJmQyZFJlY3QsIHBhdHRlcm5CcnVzaC5nZXQoKSk7CisgICAgfSk7Cit9CisKK3Zv
aWQgZHJhd1JlY3QoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29u
c3QgRmxvYXRSZWN0JiByZWN0LCBmbG9hdCBib3JkZXJUaGlja25lc3MsIGNvbnN0IENvbG9yJiBm
aWxsQ29sb3IsIFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlLCBjb25zdCBDb2xvciYgc3Ryb2tlQ29s
b3IpCit7CisgICAgLy8gRklYTUU6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIHBhdHRl
cm5zIGFuZCBncmFkaWVudHMgbGlrZSBkcmF3UGF0aCBkb2VzLCBpdCBwcm9iYWJseSBzaG91bGQu
CisgICAgQVNTRVJUKCFyZWN0LmlzRW1wdHkoKSk7CisKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0
Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9f
TElORV9fKTsKKworICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwg
WyZwbGF0Zm9ybUNvbnRleHQsIHJlY3QsIGZpbGxDb2xvciwgc3Ryb2tlQ29sb3IsIHN0cm9rZVN0
eWxlXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIGNvbnN0IEQy
RDFfUkVDVF9GIGQyZFJlY3QgPSByZWN0OworICAgICAgICBhdXRvIGZpbGxCcnVzaCA9IHBsYXRm
b3JtQ29udGV4dC5icnVzaFdpdGhDb2xvcihmaWxsQ29sb3IpOworICAgICAgICByZW5kZXJUYXJn
ZXQtPkZpbGxSZWN0YW5nbGUoJmQyZFJlY3QsIGZpbGxCcnVzaC5nZXQoKSk7CisgICAgICAgIGlm
IChzdHJva2VTdHlsZSAhPSBOb1N0cm9rZSkgeworICAgICAgICAgICAgYXV0byBzdHJva2VCcnVz
aCA9IHBsYXRmb3JtQ29udGV4dC5icnVzaFdpdGhDb2xvcihzdHJva2VDb2xvcik7CisgICAgICAg
ICAgICByZW5kZXJUYXJnZXQtPkRyYXdSZWN0YW5nbGUoJmQyZFJlY3QsIHN0cm9rZUJydXNoLmdl
dCgpLCBwbGF0Zm9ybUNvbnRleHQuc3Ryb2tlVGhpY2tuZXNzKCksIHBsYXRmb3JtQ29udGV4dC5z
dHJva2VTdHlsZSgpKTsKKyAgICAgICAgfQorICAgIH0pOworfQorCit2b2lkIGRyYXdMaW5lKFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50MSwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQyLCBTdHJva2VTdHlsZSBzdHJva2VTdHls
ZSwgY29uc3QgQ29sb3ImIHN0cm9rZUNvbG9yLCBmbG9hdCBzdHJva2VUaGlja25lc3MsIGJvb2wg
c2hvdWxkQW50aWFsaWFzKQoreworICAgIGJvb2wgaXNWZXJ0aWNhbExpbmUgPSAocG9pbnQxLngo
KSArIHN0cm9rZVRoaWNrbmVzcyA9PSBwb2ludDIueCgpKTsKKyAgICBmbG9hdCBzdHJva2VXaWR0
aCA9IGlzVmVydGljYWxMaW5lID8gcG9pbnQyLnkoKSAtIHBvaW50MS55KCkgOiBwb2ludDIueCgp
IC0gcG9pbnQxLngoKTsKKyAgICBpZiAoIXN0cm9rZVRoaWNrbmVzcyB8fCAhc3Ryb2tlV2lkdGgp
CisgICAgICAgIHJldHVybjsKKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5y
ZW5kZXJUYXJnZXQoKTsKKworICAgIGZsb2F0IGNvcm5lcldpZHRoID0gMDsKKyAgICBib29sIGRy
YXdzRGFzaGVkTGluZSA9IHN0cm9rZVN0eWxlID09IERvdHRlZFN0cm9rZSB8fCBzdHJva2VTdHls
ZSA9PSBEYXNoZWRTdHJva2U7CisKKyAgICBDT01QdHI8SUQyRDFTdHJva2VTdHlsZT4gZDJkU3Ry
b2tlU3R5bGU7CisgICAgUGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKHBsYXRm
b3JtQ29udGV4dCwgZHJhd3NEYXNoZWRMaW5lKTsKKyAgICBpZiAoZHJhd3NEYXNoZWRMaW5lKSB7
CisgICAgICAgIC8vIEZpZ3VyZSBvdXQgZW5kIHBvaW50cyB0byBlbnN1cmUgd2UgYWx3YXlzIHBh
aW50IGNvcm5lcnMuCisgICAgICAgIGNvcm5lcldpZHRoID0gZGFzaGVkTGluZUNvcm5lcldpZHRo
Rm9yU3Ryb2tlV2lkdGgoc3Ryb2tlV2lkdGgsIHN0cm9rZVN0eWxlLCBzdHJva2VUaGlja25lc3Mp
OworICAgICAgICBzdHJva2VXaWR0aCAtPSAyICogY29ybmVyV2lkdGg7CisgICAgICAgIGZsb2F0
IHBhdHRlcm5XaWR0aCA9IGRhc2hlZExpbmVQYXR0ZXJuV2lkdGhGb3JTdHJva2VXaWR0aChzdHJv
a2VXaWR0aCwgc3Ryb2tlU3R5bGUsIHN0cm9rZVRoaWNrbmVzcyk7CisgICAgICAgIC8vIENoZWNr
IGlmIGNvcm5lciBkcmF3aW5nIHN1ZmZpY2llbnRseSBjb3ZlcnMgdGhlIGxpbmUuCisgICAgICAg
IGlmIChzdHJva2VXaWR0aCA8PSBwYXR0ZXJuV2lkdGggKyAxKQorICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgIGZsb2F0IHBhdHRlcm5PZmZzZXQgPSBkYXNoZWRMaW5lUGF0dGVybk9mZnNl
dEZvclBhdHRlcm5BbmRTdHJva2VXaWR0aChwYXR0ZXJuV2lkdGgsIHN0cm9rZVdpZHRoKTsKKyAg
ICAgICAgY29uc3QgZmxvYXQgZGFzaGVzWzJdID0geyBwYXR0ZXJuV2lkdGgsIHBhdHRlcm5XaWR0
aCB9OworICAgICAgICBhdXRvIHN0cm9rZVN0eWxlUHJvcGVydGllcyA9IHBsYXRmb3JtQ29udGV4
dC5zdHJva2VTdHlsZVByb3BlcnRpZXMoKTsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0OjpzeXN0
ZW1GYWN0b3J5KCktPkNyZWF0ZVN0cm9rZVN0eWxlKCZzdHJva2VTdHlsZVByb3BlcnRpZXMsIGRh
c2hlcywgQVJSQVlTSVpFKGRhc2hlcyksICZkMmRTdHJva2VTdHlsZSk7CisKKyAgICAgICAgcGxh
dGZvcm1Db250ZXh0LnNldFBhdHRlcm5XaWR0aChwYXR0ZXJuV2lkdGgpOworICAgICAgICBwbGF0
Zm9ybUNvbnRleHQuc2V0UGF0dGVybk9mZnNldChwYXR0ZXJuT2Zmc2V0KTsKKyAgICAgICAgcGxh
dGZvcm1Db250ZXh0LnNldERhc2hlcyhEYXNoQXJyYXkoMiwgcGF0dGVybldpZHRoKSk7CisKKyAg
ICAgICAgZDJkU3Ryb2tlU3R5bGUgPSBwbGF0Zm9ybUNvbnRleHQuc3Ryb2tlU3R5bGUoKTsKKyAg
ICB9CisKKyAgICBhdXRvIGNlbnRlcmVkUG9pbnRzID0gY2VudGVyTGluZUFuZEN1dE9mZkNvcm5l
cnMoaXNWZXJ0aWNhbExpbmUsIGNvcm5lcldpZHRoLCBwb2ludDEsIHBvaW50Mik7CisgICAgYXV0
byBwMSA9IGNlbnRlcmVkUG9pbnRzWzBdOworICAgIGF1dG8gcDIgPSBjZW50ZXJlZFBvaW50c1sx
XTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworCisgICAgRmxvYXRSZWN0
IGJvdW5kaW5nUmVjdChwMSwgcDIpOworCisgICAgZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1D
b250ZXh0LCBib3VuZGluZ1JlY3QsIFsmcGxhdGZvcm1Db250ZXh0LCBwMSwgcDIsIGQyZFN0cm9r
ZVN0eWxlLCBzdHJva2VDb2xvciwgc3Ryb2tlVGhpY2tuZXNzXShJRDJEMVJlbmRlclRhcmdldCog
cmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0xpbmUocDEsIHAyLCBw
bGF0Zm9ybUNvbnRleHQuYnJ1c2hXaXRoQ29sb3Ioc3Ryb2tlQ29sb3IpLmdldCgpLCBzdHJva2VU
aGlja25lc3MsIGQyZFN0cm9rZVN0eWxlLmdldCgpKTsKKyAgICB9KTsKK30KKwordm9pZCBkcmF3
TGluZXNGb3JUZXh0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRQb2ludCYs
IGZsb2F0LCBjb25zdCBEYXNoQXJyYXkmLCBib29sLCBib29sLCBjb25zdCBDb2xvciYpCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBkcmF3RG90c0ZvckRvY3VtZW50TWFya2Vy
KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0JiwgRG9jdW1lbnRNYXJr
ZXJMaW5lU3R5bGUpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBmaWxsRWxs
aXBzZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBGbG9h
dFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBmaWxsQ29sb3IsIFN0cm9rZVN0eWxlIHN0cm9rZVN0
eWxlLCBjb25zdCBDb2xvciYgc3Ryb2tlQ29sb3IsIGZsb2F0IHN0cm9rZVRoaWNrbmVzcykKK3sK
KyAgICBhdXRvIGVsbGlwc2UgPSBEMkQxOjpFbGxpcHNlKHJlY3QuY2VudGVyKCksIDAuNSAqIHJl
Y3Qud2lkdGgoKSwgMC41ICogcmVjdC5oZWlnaHQoKSk7CisKKyAgICBhdXRvIGNvbnRleHQgPSBw
bGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEs
IF9fTElORV9fKTsKKworICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVj
dCwgWyZwbGF0Zm9ybUNvbnRleHQsIGVsbGlwc2UsIGZpbGxDb2xvciwgc3Ryb2tlU3R5bGUsIHN0
cm9rZUNvbG9yLCBzdHJva2VUaGlja25lc3NdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJn
ZXQpIHsKKyAgICAgICAgYXV0byBmaWxsQnJ1c2ggPSBwbGF0Zm9ybUNvbnRleHQuYnJ1c2hXaXRo
Q29sb3IoZmlsbENvbG9yKTsKKyAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsRWxsaXBzZSgmZWxs
aXBzZSwgZmlsbEJydXNoLmdldCgpKTsKKyAgICAgICAgaWYgKHN0cm9rZVN0eWxlICE9IFN0cm9r
ZVN0eWxlOjpOb1N0cm9rZSkgeworICAgICAgICAgICAgYXV0byBzdHJva2VCcnVzaCA9IHBsYXRm
b3JtQ29udGV4dC5icnVzaFdpdGhDb2xvcihzdHJva2VDb2xvcik7CisgICAgICAgICAgICByZW5k
ZXJUYXJnZXQtPkRyYXdFbGxpcHNlKCZlbGxpcHNlLCBzdHJva2VCcnVzaC5nZXQoKSwgc3Ryb2tl
VGhpY2tuZXNzLCBwbGF0Zm9ybUNvbnRleHQuc3Ryb2tlU3R5bGUoKSk7CisgICAgICAgIH0KKyAg
ICB9KTsKK30KKwordm9pZCBkcmF3RWxsaXBzZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxh
dGZvcm1Db250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHJlY3QsIFN0cm9rZVN0eWxlIHN0cm9rZVN0
eWxlLCBjb25zdCBDb2xvciYgc3Ryb2tlQ29sb3IsIGZsb2F0IHN0cm9rZVRoaWNrbmVzcykKK3sK
KyAgICBpZiAoc3Ryb2tlU3R5bGUgPT0gU3Ryb2tlU3R5bGU6Ok5vU3Ryb2tlKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBhdXRvIGVsbGlwc2UgPSBEMkQxOjpFbGxpcHNlKHJlY3QuY2VudGVyKCks
IDAuNSAqIHJlY3Qud2lkdGgoKSwgMC41ICogcmVjdC5oZWlnaHQoKSk7CisKKyAgICBhdXRvIGNv
bnRleHQgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCk7CisKKyAgICBjb250ZXh0LT5T
ZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29u
dGV4dCwgcmVjdCwgWyZwbGF0Zm9ybUNvbnRleHQsIGVsbGlwc2UsIHN0cm9rZUNvbG9yLCBzdHJv
a2VUaGlja25lc3NdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAg
YXV0byBzdHJva2VCcnVzaCA9IHBsYXRmb3JtQ29udGV4dC5icnVzaFdpdGhDb2xvcihzdHJva2VD
b2xvcik7CisgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0VsbGlwc2UoJmVsbGlwc2UsIHN0cm9r
ZUJydXNoLmdldCgpLCBzdHJva2VUaGlja25lc3MsIHBsYXRmb3JtQ29udGV4dC5zdHJva2VTdHls
ZSgpKTsKKyAgICB9KTsKK30KKwordm9pZCBkcmF3Rm9jdXNSaW5nKFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJiwgY29uc3QgUGF0aCYsIGZsb2F0LCBjb25zdCBDb2xvciYpCit7CisgICAgbm90SW1w
bGVtZW50ZWQoKTsKK30KKwordm9pZCBkcmF3Rm9jdXNSaW5nKFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEJiwgY29uc3QgVmVjdG9yPEZsb2F0UmVjdD4mLCBmbG9hdCwgY29uc3QgQ29sb3ImKQorewor
ICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgZmx1c2goUGxhdGZvcm1Db250ZXh0RGly
ZWN0MkQmIHBsYXRmb3JtQ29udGV4dCkKK3sKKyAgICBBU1NFUlQocGxhdGZvcm1Db250ZXh0LnJl
bmRlclRhcmdldCgpKTsKKyAgICBEMkQxX1RBRyBmaXJzdCwgc2Vjb25kOworICAgIEhSRVNVTFQg
aHIgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkZsdXNoKCZmaXJzdCwgJnNlY29u
ZCk7CisKKyAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKK30KKwordm9pZCBzYXZl
KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQpCit7CisgICAgcGxhdGZv
cm1Db250ZXh0LnNhdmUoKTsKKworICAgIGlmIChhdXRvKiBncmFwaGljc0NvbnRleHRQcml2YXRl
ID0gcGxhdGZvcm1Db250ZXh0LmdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAgICAgZ3Jh
cGhpY3NDb250ZXh0UHJpdmF0ZS0+c2F2ZSgpOworfQorCit2b2lkIHJlc3RvcmUoUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCkKK3sKKyAgICBwbGF0Zm9ybUNvbnRleHQu
cmVzdG9yZSgpOworCisgICAgaWYgKGF1dG8qIGdyYXBoaWNzQ29udGV4dFByaXZhdGUgPSBwbGF0
Zm9ybUNvbnRleHQuZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICAgICBncmFwaGljc0Nv
bnRleHRQcml2YXRlLT5yZXN0b3JlKCk7Cit9CisKK3ZvaWQgdHJhbnNsYXRlKFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAg
QVNTRVJUKHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKSk7CisKKyAgICBEMkQxX01BVFJJ
WF8zWDJfRiBjdXJyZW50VHJhbnNmb3JtOworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJn
ZXQoKS0+R2V0VHJhbnNmb3JtKCZjdXJyZW50VHJhbnNmb3JtKTsKKworICAgIGF1dG8gdHJhbnNs
YXRpb24gPSBEMkQxOjpNYXRyaXgzeDJGOjpUcmFuc2xhdGlvbih4LCB5KTsKKyAgICBwbGF0Zm9y
bUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPlNldFRyYW5zZm9ybSh0cmFuc2xhdGlvbiAqIGN1cnJl
bnRUcmFuc2Zvcm0pOworCisgICAgaWYgKGF1dG8qIGdyYXBoaWNzQ29udGV4dFByaXZhdGUgPSBw
bGF0Zm9ybUNvbnRleHQuZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICAgICBncmFwaGlj
c0NvbnRleHRQcml2YXRlLT50cmFuc2xhdGUoeCwgeSk7Cit9CisKK3ZvaWQgcm90YXRlKFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGZsb2F0IGFuZ2xlSW5SYWRpYW5z
KQoreworICAgIEFTU0VSVChwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpOworCisgICAg
RDJEMV9NQVRSSVhfM1gyX0YgY3VycmVudFRyYW5zZm9ybTsKKyAgICBwbGF0Zm9ybUNvbnRleHQu
cmVuZGVyVGFyZ2V0KCktPkdldFRyYW5zZm9ybSgmY3VycmVudFRyYW5zZm9ybSk7CisKKyAgICBh
dXRvIHJvdGF0aW9uID0gRDJEMTo6TWF0cml4M3gyRjo6Um90YXRpb24ocmFkMmRlZyhhbmdsZUlu
UmFkaWFucykpOworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+U2V0VHJhbnNm
b3JtKHJvdGF0aW9uICogY3VycmVudFRyYW5zZm9ybSk7CisKKyAgICBpZiAoYXV0byogZ3JhcGhp
Y3NDb250ZXh0UHJpdmF0ZSA9IHBsYXRmb3JtQ29udGV4dC5ncmFwaGljc0NvbnRleHRQcml2YXRl
KCkpCisgICAgICAgIGdyYXBoaWNzQ29udGV4dFByaXZhdGUtPnJvdGF0ZShhbmdsZUluUmFkaWFu
cyk7Cit9CisKK3ZvaWQgc2NhbGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29u
dGV4dCwgY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIEFTU0VSVChwbGF0Zm9ybUNvbnRl
eHQucmVuZGVyVGFyZ2V0KCkpOworCisgICAgRDJEMV9NQVRSSVhfM1gyX0YgY3VycmVudFRyYW5z
Zm9ybTsKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkdldFRyYW5zZm9ybSgm
Y3VycmVudFRyYW5zZm9ybSk7CisKKyAgICBhdXRvIHNjYWxlID0gRDJEMTo6TWF0cml4M3gyRjo6
U2NhbGUoc2l6ZSk7CisgICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5TZXRUcmFu
c2Zvcm0oc2NhbGUgKiBjdXJyZW50VHJhbnNmb3JtKTsKKworICAgIGlmIChhdXRvKiBncmFwaGlj
c0NvbnRleHRQcml2YXRlID0gcGxhdGZvcm1Db250ZXh0LmdyYXBoaWNzQ29udGV4dFByaXZhdGUo
KSkKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZS0+c2NhbGUoc2l6ZSk7Cit9CisKK3Zv
aWQgY29uY2F0Q1RNKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNv
bnN0IEFmZmluZVRyYW5zZm9ybSYgYWZmaW5lVHJhbnNmb3JtKQoreworICAgIEFTU0VSVChwbGF0
Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpOworCisgICAgRDJEMV9NQVRSSVhfM1gyX0YgY3Vy
cmVudFRyYW5zZm9ybTsKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkdldFRy
YW5zZm9ybSgmY3VycmVudFRyYW5zZm9ybSk7CisKKyAgICBEMkQxX01BVFJJWF8zWDJfRiB0cmFu
c2Zvcm1Ub0NvbmNhdCA9IGFmZmluZVRyYW5zZm9ybTsKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVu
ZGVyVGFyZ2V0KCktPlNldFRyYW5zZm9ybSh0cmFuc2Zvcm1Ub0NvbmNhdCAqIGN1cnJlbnRUcmFu
c2Zvcm0pOworCisgICAgaWYgKGF1dG8qIGdyYXBoaWNzQ29udGV4dFByaXZhdGUgPSBwbGF0Zm9y
bUNvbnRleHQuZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICAgICBncmFwaGljc0NvbnRl
eHRQcml2YXRlLT5jb25jYXRDVE0oYWZmaW5lVHJhbnNmb3JtKTsKK30KKwordm9pZCBiZWdpblRy
YW5zcGFyZW5jeUxheWVyKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQs
IGZsb2F0IG9wYWNpdHkpCit7CisgICAgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OlRyYW5zcGFy
ZW5jeUxheWVyU3RhdGUgdHJhbnNwYXJlbmN5TGF5ZXI7CisgICAgdHJhbnNwYXJlbmN5TGF5ZXIu
b3BhY2l0eSA9IG9wYWNpdHk7CisKKyAgICBIUkVTVUxUIGhyID0gcGxhdGZvcm1Db250ZXh0LnJl
bmRlclRhcmdldCgpLT5DcmVhdGVDb21wYXRpYmxlUmVuZGVyVGFyZ2V0KCZ0cmFuc3BhcmVuY3lM
YXllci5yZW5kZXJUYXJnZXQpOworICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOwor
ICAgIHBsYXRmb3JtQ29udGV4dC5tX3RyYW5zcGFyZW5jeUxheWVyU3RhY2suYXBwZW5kKFdURk1v
dmUodHJhbnNwYXJlbmN5TGF5ZXIpKTsKKworICAgIHBsYXRmb3JtQ29udGV4dC5tX3RyYW5zcGFy
ZW5jeUxheWVyU3RhY2subGFzdCgpLnJlbmRlclRhcmdldC0+QmVnaW5EcmF3KCk7CisgICAgcGxh
dGZvcm1Db250ZXh0Lm1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5sYXN0KCkucmVuZGVyVGFyZ2V0
LT5DbGVhcihEMkQxOjpDb2xvckYoMCwgMCwgMCwgMCkpOworfQorCit2b2lkIGVuZFRyYW5zcGFy
ZW5jeUxheWVyKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQpCit7Cisg
ICAgYXV0byBjdXJyZW50TGF5ZXIgPSBwbGF0Zm9ybUNvbnRleHQubV90cmFuc3BhcmVuY3lMYXll
clN0YWNrLnRha2VMYXN0KCk7CisgICAgYXV0byByZW5kZXJUYXJnZXQgPSBjdXJyZW50TGF5ZXIu
cmVuZGVyVGFyZ2V0OworICAgIGlmICghcmVuZGVyVGFyZ2V0KQorICAgICAgICByZXR1cm47CisK
KyAgICBIUkVTVUxUIGhyID0gcmVuZGVyVGFyZ2V0LT5FbmREcmF3KCk7CisgICAgUkVMRUFTRV9B
U1NFUlQoU1VDQ0VFREVEKGhyKSk7CisKKyAgICBDT01QdHI8SUQyRDFCaXRtYXA+IGJpdG1hcDsK
KyAgICBociA9IHJlbmRlclRhcmdldC0+R2V0Qml0bWFwKCZiaXRtYXApOworICAgIFJFTEVBU0Vf
QVNTRVJUKFNVQ0NFRURFRChocikpOworCisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250
ZXh0LnJlbmRlclRhcmdldCgpOworCisgICAgaWYgKGN1cnJlbnRMYXllci5oYXNTaGFkb3cpCisg
ICAgICAgIGRyYXdXaXRoU2hhZG93SGVscGVyKGNvbnRleHQsIGJpdG1hcC5nZXQoKSwgY3VycmVu
dExheWVyLnNoYWRvd0NvbG9yLCBjdXJyZW50TGF5ZXIuc2hhZG93T2Zmc2V0LCBjdXJyZW50TGF5
ZXIuc2hhZG93Qmx1cik7CisgICAgZWxzZSB7CisgICAgICAgIENPTVB0cjxJRDJEMUJpdG1hcEJy
dXNoPiBiaXRtYXBCcnVzaDsKKyAgICAgICAgYXV0byBiaXRtYXBCcnVzaFByb3BlcnRpZXMgPSBE
MkQxOjpCaXRtYXBCcnVzaFByb3BlcnRpZXMoKTsKKyAgICAgICAgYXV0byBicnVzaFByb3BlcnRp
ZXMgPSBEMkQxOjpCcnVzaFByb3BlcnRpZXMoKTsKKyAgICAgICAgSFJFU1VMVCBociA9IGNvbnRl
eHQtPkNyZWF0ZUJpdG1hcEJydXNoKGJpdG1hcC5nZXQoKSwgYml0bWFwQnJ1c2hQcm9wZXJ0aWVz
LCBicnVzaFByb3BlcnRpZXMsICZiaXRtYXBCcnVzaCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KFNVQ0NFRURFRChocikpOworCisgICAgICAgIGF1dG8gc2l6ZSA9IGJpdG1hcC0+R2V0U2l6ZSgp
OworICAgICAgICBhdXRvIHJlY3RJbkRJUCA9IEQyRDE6OlJlY3RGKDAsIDAsIHNpemUud2lkdGgs
IHNpemUuaGVpZ2h0KTsKKyAgICAgICAgY29udGV4dC0+RmlsbFJlY3RhbmdsZShyZWN0SW5ESVAs
IGJpdG1hcEJydXNoLmdldCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgY2xpcChQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7Cisg
ICAgaWYgKHBsYXRmb3JtQ29udGV4dC5tX3JlbmRlclN0YXRlcy5pc0VtcHR5KCkpCisgICAgICAg
IHNhdmUocGxhdGZvcm1Db250ZXh0KTsKKworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJn
ZXQoKS0+UHVzaEF4aXNBbGlnbmVkQ2xpcChyZWN0LCBEMkQxX0FOVElBTElBU19NT0RFX1BFUl9Q
UklNSVRJVkUpOworICAgIHBsYXRmb3JtQ29udGV4dC5tX3JlbmRlclN0YXRlcy5sYXN0KCkubV9j
bGlwcy5hcHBlbmQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OkF4aXNBbGlnbmVkQ2xpcCk7CisK
KyAgICBpZiAoYXV0byogZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSA9IHBsYXRmb3JtQ29udGV4dC5n
cmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisgICAgICAgIGdyYXBoaWNzQ29udGV4dFByaXZhdGUt
PmNsaXAocmVjdCk7Cit9CisKK3ZvaWQgY2xpcE91dChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYg
cGxhdGZvcm1Db250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgUGF0aCBwYXRo
OworICAgIHBhdGguYWRkUmVjdChyZWN0KTsKKworICAgIGNsaXBPdXQocGxhdGZvcm1Db250ZXh0
LCBwYXRoKTsKK30KKwordm9pZCBjbGlwT3V0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0
Zm9ybUNvbnRleHQsIGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgLy8gVG8gY2xpcCBPdXQgd2Ug
bmVlZCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBpbmZpbml0ZQorICAgIC8vIGNsaXBwaW5nIHJl
Y3QgYW5kIHRoZSBwYXRoIHdlIGp1c3QgY3JlYXRlZC4KKyAgICBEMkQxX1NJWkVfRiByZW5kZXJl
clNpemUgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkdldFNpemUoKTsKKyAgICBG
bG9hdFJlY3QgY2xpcEJvdW5kcygwLCAwLCByZW5kZXJlclNpemUud2lkdGgsIHJlbmRlcmVyU2l6
ZS5oZWlnaHQpOworCisgICAgUGF0aCBib3VuZGluZ1JlY3Q7CisgICAgYm91bmRpbmdSZWN0LmFk
ZFJlY3QoY2xpcEJvdW5kcyk7CisgICAgYm91bmRpbmdSZWN0LmFwcGVuZEdlb21ldHJ5KHBhdGgu
cGxhdGZvcm1QYXRoKCkpOworCisgICAgQ09NUHRyPElEMkQxR2VvbWV0cnlHcm91cD4gcGF0aFRv
Q2xpcDsKKyAgICBib3VuZGluZ1JlY3QuY3JlYXRlR2VvbWV0cnlXaXRoRmlsbE1vZGUoV2luZFJ1
bGU6OkV2ZW5PZGQsIHBhdGhUb0NsaXApOworICAgIGNsaXBQYXRoKHBsYXRmb3JtQ29udGV4dCwg
cGF0aFRvQ2xpcC5nZXQoKSk7Cit9CisKK3ZvaWQgY2xpcFBhdGgoUGxhdGZvcm1Db250ZXh0RGly
ZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgUGF0aCYgcGF0aCwgV2luZFJ1bGUgY2xpcFJ1
bGUpCit7CisgICAgaWYgKHBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIERpcmVjdDJEOjpjbGlw
KHBsYXRmb3JtQ29udGV4dCwgRmxvYXRSZWN0KCkpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgQ09NUHRyPElEMkQxR2VvbWV0cnlHcm91cD4gcGF0aFRvQ2xpcDsKKyAgICBwYXRoLmNy
ZWF0ZUdlb21ldHJ5V2l0aEZpbGxNb2RlKGNsaXBSdWxlLCBwYXRoVG9DbGlwKTsKKworICAgIGNs
aXBQYXRoKHBsYXRmb3JtQ29udGV4dCwgcGF0aFRvQ2xpcC5nZXQoKSk7CisKKyAgICBpZiAoYXV0
byogZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSA9IHBsYXRmb3JtQ29udGV4dC5ncmFwaGljc0NvbnRl
eHRQcml2YXRlKCkpCisgICAgICAgIGdyYXBoaWNzQ29udGV4dFByaXZhdGUtPmNsaXAocGF0aCk7
Cit9CisKK3ZvaWQgY2xpcFBhdGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29u
dGV4dCwgSUQyRDFHZW9tZXRyeSogcGF0aCkKK3sKKyAgICBBU1NFUlQocGxhdGZvcm1Db250ZXh0
Lmhhc1NhdmVkU3RhdGUoKSk7CisgICAgaWYgKCFwbGF0Zm9ybUNvbnRleHQuaGFzU2F2ZWRTdGF0
ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBDT01QdHI8SUQyRDFMYXllcj4gY2xpcExheWVy
OworICAgIEhSRVNVTFQgaHIgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkNyZWF0
ZUxheWVyKCZjbGlwTGF5ZXIpOworICAgIEFTU0VSVChTVUNDRUVERUQoaHIpKTsKKyAgICBpZiAo
IVNVQ0NFRURFRChocikpCisgICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3JtQ29udGV4dC5y
ZW5kZXJUYXJnZXQoKS0+UHVzaExheWVyKEQyRDE6OkxheWVyUGFyYW1ldGVycyhEMkQxOjpJbmZp
bml0ZVJlY3QoKSwgcGF0aCksIGNsaXBMYXllci5nZXQoKSk7CisgICAgcGxhdGZvcm1Db250ZXh0
LnB1c2hSZW5kZXJDbGlwKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpMYXllckNsaXApOworICAg
IHBsYXRmb3JtQ29udGV4dC5zZXRBY3RpdmVMYXllcihXVEZNb3ZlKGNsaXBMYXllcikpOworfQor
Cit2b2lkIGNsaXBUb0ltYWdlQnVmZmVyKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgSUQyRDFS
ZW5kZXJUYXJnZXQqLCBjb25zdCBGbG9hdFJlY3QmKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7
Cit9CisKK30gLy8gbmFtZXNwYWNlIERpcmVjdDJECit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZiAvLyBVU0UoRElSRUNUMkQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vRGlyZWN0MkRPcGVyYXRpb25zLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0RpcmVjdDJET3BlcmF0aW9ucy5oCShub25leGlz
dGVudCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJlY3QyRE9w
ZXJhdGlvbnMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwNi0yMDE5IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHBAYXRva2VyLmNvbT4KKyAqIENvcHlyaWdo
dCAoQykgMjAwOCwgMjAwOSBEaXJrIFNjaHVsemUgPGtyaXRAd2Via2l0Lm9yZz4KKyAqIENvcHly
aWdodCAoQykgMjAwOCBOdWFudGkgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEJyZW50IEZ1
bGdoYW0gPGJmdWxnaGFtQHdlYmtpdC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEg
SWdhbGlhIFMuTC4KKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQg
MjAxMC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiwgSW50ZWwg
Q29ycG9yYXRpb24KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I3ByYWdtYSBvbmNlCisKKyNpZiBVU0UoRElSRUNUMkQpCisKKyNpbmNsdWRlICJEYXNoQXJyYXku
aCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJHcmFwaGljc1R5cGVz
LmgiCisjaW5jbHVkZSA8ZDJkMS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEFm
ZmluZVRyYW5zZm9ybTsKK2NsYXNzIENvbG9yOworY2xhc3MgRmxvYXRSZWN0OworY2xhc3MgRmxv
YXRSb3VuZGVkUmVjdDsKK2NsYXNzIEZsb2F0U2l6ZTsKK2NsYXNzIFBhdGg7CitjbGFzcyBQbGF0
Zm9ybUNvbnRleHRDYWlybzsKKworc3RydWN0IEdyYXBoaWNzQ29udGV4dFN0YXRlOworCituYW1l
c3BhY2UgRGlyZWN0MkQgeworCituYW1lc3BhY2UgU3RhdGUgeworCit2b2lkIHNldFN0cm9rZVRo
aWNrbmVzcyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGZsb2F0KTsKK3ZvaWQgc2V0U3Ryb2tl
U3R5bGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBTdHJva2VTdHlsZSk7CisKK3ZvaWQgc2V0
Q29tcG9zaXRlT3BlcmF0aW9uKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgQ29tcG9zaXRlT3Bl
cmF0b3IsIEJsZW5kTW9kZSk7Cit2b2lkIHNldFNob3VsZEFudGlhbGlhcyhQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYsIGJvb2wpOworCit2b2lkIHNldENUTShQbGF0Zm9ybUNvbnRleHREaXJlY3Qy
RCYsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYpOworQWZmaW5lVHJhbnNmb3JtIGdldENUTShQbGF0
Zm9ybUNvbnRleHREaXJlY3QyRCYpOworCitJbnRSZWN0IGdldENsaXBCb3VuZHMoUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQmKTsKK0Zsb2F0UmVjdCByb3VuZFRvRGV2aWNlUGl4ZWxzKFBsYXRmb3Jt
Q29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0Jik7CisKK2Jvb2wgaXNBY2NlbGVyYXRl
ZENvbnRleHQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmKTsKKworfSAvLyBuYW1lc3BhY2UgU3Rh
dGUKKworc3RydWN0IEZpbGxTb3VyY2UgeworICAgIEZpbGxTb3VyY2UoKSA9IGRlZmF1bHQ7Cisg
ICAgZXhwbGljaXQgRmlsbFNvdXJjZShjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYsIFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJik7CisKKyAgICBmbG9hdCBnbG9iYWxBbHBoYSB7IDAgfTsKKyAg
ICBDT01QdHI8SUQyRDFCcnVzaD4gYnJ1c2g7CisgICAgQ29sb3IgY29sb3I7CisKKyAgICBXaW5k
UnVsZSBmaWxsUnVsZSB7IFdpbmRSdWxlOjpOb25aZXJvIH07Cit9OworCitzdHJ1Y3QgU3Ryb2tl
U291cmNlIHsKKyAgICBTdHJva2VTb3VyY2UoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgU3Ry
b2tlU291cmNlKGNvbnN0IEdyYXBoaWNzQ29udGV4dFN0YXRlJiwgUGxhdGZvcm1Db250ZXh0RGly
ZWN0MkQmKTsKKworICAgIGZsb2F0IGdsb2JhbEFscGhhIHsgMCB9OworICAgIGZsb2F0IHRoaWNr
bmVzcyB7IDAgfTsKKyAgICBDT01QdHI8SUQyRDFCcnVzaD4gYnJ1c2g7CisgICAgQ29sb3IgY29s
b3I7Cit9OworCitzdHJ1Y3QgU2hhZG93U3RhdGUgeworICAgIFNoYWRvd1N0YXRlKCkgPSBkZWZh
dWx0OworICAgIFdFQkNPUkVfRVhQT1JUIGV4cGxpY2l0IFNoYWRvd1N0YXRlKGNvbnN0IEdyYXBo
aWNzQ29udGV4dFN0YXRlJik7CisKKyAgICBib29sIGlzVmlzaWJsZSgpIGNvbnN0OworICAgIGJv
b2wgaXNSZXF1aXJlZChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYpIGNvbnN0OworCisgICAgRmxv
YXRTaXplIG9mZnNldDsKKyAgICBmbG9hdCBibHVyIHsgMCB9OworICAgIENvbG9yIGNvbG9yOwor
ICAgIGJvb2wgaWdub3JlVHJhbnNmb3JtcyB7IGZhbHNlIH07CisKKyAgICBmbG9hdCBnbG9iYWxB
bHBoYSB7IDEuMCB9OworICAgIENvbXBvc2l0ZU9wZXJhdG9yIGdsb2JhbENvbXBvc2l0ZU9wZXJh
dG9yIHsgQ29tcG9zaXRlU291cmNlT3ZlciB9OworfTsKKwordm9pZCBzZXRMaW5lQ2FwKFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJiwgTGluZUNhcCk7Cit2b2lkIHNldExpbmVEYXNoKFBsYXRmb3Jt
Q29udGV4dERpcmVjdDJEJiwgY29uc3QgRGFzaEFycmF5JiwgZmxvYXQpOwordm9pZCBzZXRMaW5l
Sm9pbihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIExpbmVKb2luKTsKK3ZvaWQgc2V0TWl0ZXJM
aW1pdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGZsb2F0KTsKKwordm9pZCBmaWxsUmVjdChQ
bGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZpbGxTb3Vy
Y2UmLCBjb25zdCBTaGFkb3dTdGF0ZSYpOwordm9pZCBmaWxsUmVjdChQbGF0Zm9ybUNvbnRleHRE
aXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IENvbG9yJiwgY29uc3QgU2hhZG93U3Rh
dGUmKTsKK3ZvaWQgZmlsbFJlY3RXaXRoR3JhZGllbnQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQm
LCBjb25zdCBGbG9hdFJlY3QmLCBJRDJEMUJydXNoKik7Cit2b2lkIGZpbGxSb3VuZGVkUmVjdChQ
bGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmLCBjb25zdCBD
b2xvciYsIGNvbnN0IFNoYWRvd1N0YXRlJik7Cit2b2lkIGZpbGxSZWN0V2l0aFJvdW5kZWRIb2xl
KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRS
b3VuZGVkUmVjdCYsIGNvbnN0IEZpbGxTb3VyY2UmLCBjb25zdCBTaGFkb3dTdGF0ZSYpOwordm9p
ZCBmaWxsUGF0aChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IFBhdGgmLCBjb25zdCBG
aWxsU291cmNlJiwgY29uc3QgU2hhZG93U3RhdGUmKTsKK3ZvaWQgZmlsbFBhdGgoUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQmLCBjb25zdCBQYXRoJiwgY29uc3QgQ29sb3ImLCBjb25zdCBTaGFkb3dT
dGF0ZSYpOworCit2b2lkIHN0cm9rZVJlY3QoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25z
dCBGbG9hdFJlY3QmLCBmbG9hdCwgY29uc3QgU3Ryb2tlU291cmNlJiwgY29uc3QgU2hhZG93U3Rh
dGUmKTsKK3ZvaWQgc3Ryb2tlUGF0aChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IFBh
dGgmLCBjb25zdCBTdHJva2VTb3VyY2UmLCBjb25zdCBTaGFkb3dTdGF0ZSYpOwordm9pZCBjbGVh
clJlY3QoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJlY3QmKTsKKworLy8g
RklYTUUoSU1QTEVNRU5UKTogdm9pZCBkcmF3R2x5cGhzKFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
JiwgY29uc3QgRmlsbFNvdXJjZSYsIGNvbnN0IFN0cm9rZVNvdXJjZSYsIGNvbnN0IFNoYWRvd1N0
YXRlJiwgY29uc3QgRmxvYXRQb2ludCYsIERpcmVjdFdyaXRlU2NhbGVkRm9udCosIGRvdWJsZSwg
Y29uc3QgVmVjdG9yPERpcmVjdFdyaXRlR2x5cGhUeXBlPiYsIGZsb2F0LCBUZXh0RHJhd2luZ01v
ZGVGbGFncywgZmxvYXQsIGNvbnN0IEZsb2F0U2l6ZSYsIGNvbnN0IENvbG9yJik7CisKK3ZvaWQg
ZHJhd05hdGl2ZUltYWdlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgSVdJQ0JpdG1hcCosIGNv
bnN0IEZsb2F0U2l6ZSYgaW1hZ2VTaXplLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFJl
Y3QmLCBDb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0aW9uLCBJbnRl
cnBvbGF0aW9uUXVhbGl0eSwgZmxvYXQsIGNvbnN0IFNoYWRvd1N0YXRlJik7Cit2b2lkIGRyYXdO
YXRpdmVJbWFnZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIElEMkQxQml0bWFwKiwgY29uc3Qg
RmxvYXRTaXplJiBpbWFnZVNpemUsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZsb2F0UmVjdCYs
IENvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUsIEltYWdlT3JpZW50YXRpb24sIEludGVycG9s
YXRpb25RdWFsaXR5LCBmbG9hdCwgY29uc3QgU2hhZG93U3RhdGUmKTsKK3ZvaWQgZHJhd1BhdGgo
UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBQYXRoJiwgY29uc3QgU3Ryb2tlU291cmNl
JiwgY29uc3QgU2hhZG93U3RhdGUmKTsKK3ZvaWQgZHJhd1BhdHRlcm4oUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQmLCBJV0lDQml0bWFwKiwgY29uc3QgSW50U2l6ZSYsIGNvbnN0IEZsb2F0UmVjdCYs
IGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYsIGNvbnN0IEZsb2F0UG9p
bnQmLCBDb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlKTsKKwordm9pZCBkcmF3V2l0aG91dFNo
YWRvdyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdS
ZWN0LCBjb25zdCBXVEY6OkZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4mIGRyYXdD
b21tYW5kcyk7Cit2b2lkIGRyYXdXaXRoU2hhZG93KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwg
Y29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ1JlY3QsIGNvbnN0IFNoYWRvd1N0YXRlJiwgY29uc3Qg
V1RGOjpGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+JiBkcmF3Q29tbWFuZHMpOwor
dm9pZCBkcmF3V2l0aFNoYWRvd0hlbHBlcihJRDJEMVJlbmRlclRhcmdldCogY29udGV4dCwgSUQy
RDFCaXRtYXAqLCBjb25zdCBDb2xvciYgc2hhZG93Q29sb3IsIGNvbnN0IEZsb2F0U2l6ZSYgc2hh
ZG93T2Zmc2V0LCBmbG9hdCBzaGFkb3dCbHVyKTsKKwordm9pZCBkcmF3UmVjdChQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYsIGZsb2F0LCBjb25zdCBDb2xvciYsIFN0
cm9rZVN0eWxlLCBjb25zdCBDb2xvciYpOwordm9pZCBkcmF3TGluZShQbGF0Zm9ybUNvbnRleHRE
aXJlY3QyRCYsIGNvbnN0IEZsb2F0UG9pbnQmLCBjb25zdCBGbG9hdFBvaW50JiwgU3Ryb2tlU3R5
bGUsIGNvbnN0IENvbG9yJiwgZmxvYXQsIGJvb2wpOwordm9pZCBkcmF3TGluZXNGb3JUZXh0KFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRQb2ludCYsIGZsb2F0IHRoaWNrbmVz
cywgY29uc3QgRGFzaEFycmF5JiwgYm9vbCwgYm9vbCwgY29uc3QgQ29sb3ImKTsKK3ZvaWQgZHJh
d0RvdHNGb3JEb2N1bWVudE1hcmtlcihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZs
b2F0UmVjdCYsIERvY3VtZW50TWFya2VyTGluZVN0eWxlKTsKK3ZvaWQgZHJhd0VsbGlwc2UoUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJlY3QmLCBTdHJva2VTdHlsZSwgY29u
c3QgQ29sb3ImLCBmbG9hdCk7Cit2b2lkIGZpbGxFbGxpcHNlKFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEJiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgQ29sb3ImLCBTdHJva2VTdHlsZSwgY29uc3Qg
Q29sb3ImLCBmbG9hdCk7CisKK3ZvaWQgZHJhd0ZvY3VzUmluZyhQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRCYsIGNvbnN0IFBhdGgmLCBmbG9hdCwgY29uc3QgQ29sb3ImKTsKK3ZvaWQgZHJhd0ZvY3Vz
UmluZyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IFZlY3RvcjxGbG9hdFJlY3Q+Jiwg
ZmxvYXQsIGNvbnN0IENvbG9yJik7CisKK3ZvaWQgZmx1c2goUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmKTsKK3ZvaWQgc2F2ZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYpOwordm9pZCByZXN0b3Jl
KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJik7CisKK3ZvaWQgdHJhbnNsYXRlKFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEJiwgZmxvYXQsIGZsb2F0KTsKK3ZvaWQgcm90YXRlKFBsYXRmb3JtQ29udGV4
dERpcmVjdDJEJiwgZmxvYXQpOwordm9pZCBzY2FsZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYs
IGNvbnN0IEZsb2F0U2l6ZSYpOwordm9pZCBjb25jYXRDVE0oUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mKTsKKwordm9pZCBiZWdpblRyYW5zcGFyZW5jeUxh
eWVyKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgZmxvYXQpOwordm9pZCBlbmRUcmFuc3BhcmVu
Y3lMYXllcihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYpOworCit2b2lkIGNsaXAoUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJlY3QmKTsKKwordm9pZCBjbGlwT3V0KFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0Jik7Cit2b2lkIGNsaXBPdXQoUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBQYXRoJik7Cit2b2lkIGNsaXBQYXRoKFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgUGF0aCYsIFdpbmRSdWxlKTsKK3ZvaWQgY2xpcFBh
dGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBJRDJEMUdlb21ldHJ5KiBwYXRoKTsKKwordm9p
ZCBjbGlwVG9JbWFnZUJ1ZmZlcihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIElEMkQxUmVuZGVy
VGFyZ2V0KiwgY29uc3QgRmxvYXRSZWN0Jik7CisKK30gLy8gbmFtZXNwYWNlIERpcmVjdDJECit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoRElSRUNUMkQpCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0MkRVdGlsaXRpZXMuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJl
Y3QyRFV0aWxpdGllcy5jcHAJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0RpcmVjdDJEVXRpbGl0aWVzLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBJZ2FsaWEgUy5MLgorICog
Q29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBlbWJlZGRlZCBzeXN0ZW1zCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJEaXJlY3QyRFV0aWxpdGllcy5oIgorCisjaWYgVVNFKERJUkVDVDJEKQorCisjaW5j
bHVkZSAiQ09NUHRyLmgiCisjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgorI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkltYWdlRGVjb2RlckRpcmVjdDJELmgiCisjaW5jbHVk
ZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIkludFNpemUuaCIKKyNpbmNsdWRlIDxkMmQxLmg+Cisj
aW5jbHVkZSA8d2luY29kZWMuaD4KKworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK25hbWVzcGFj
ZSBEaXJlY3QyRCB7CisKK0ludFNpemUgYml0bWFwU2l6ZShJV0lDQml0bWFwU291cmNlKiBiaXRt
YXBTb3VyY2UpCit7CisgICAgVUlOVCB3aWR0aCwgaGVpZ2h0OworICAgIEhSRVNVTFQgaHIgPSBi
aXRtYXBTb3VyY2UtPkdldFNpemUoJndpZHRoLCAmaGVpZ2h0KTsKKyAgICBpZiAoIVNVQ0NFRURF
RChocikpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICByZXR1cm4gSW50U2l6ZSh3aWR0aCwg
aGVpZ2h0KTsKK30KKworRmxvYXRQb2ludCBiaXRtYXBSZXNvbHV0aW9uKElXSUNCaXRtYXBTb3Vy
Y2UqIGJpdG1hcFNvdXJjZSkKK3sKKyAgICBjb25zdGV4cHIgZG91YmxlIGRwaUJhc2UgPSA5Ni4w
OworCisgICAgZG91YmxlIGRwaVgsIGRwaVk7CisgICAgSFJFU1VMVCBociA9IGJpdG1hcFNvdXJj
ZS0+R2V0UmVzb2x1dGlvbigmZHBpWCwgJmRwaVkpOworICAgIGlmICghU1VDQ0VFREVEKGhyKSkK
KyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIEZsb2F0UG9pbnQgcmVzdWx0KGRwaVgsIGRwaVkp
OworICAgIHJlc3VsdC5zY2FsZSgxIC8gZHBpQmFzZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30K
KwordW5zaWduZWQgYml0c1BlclBpeGVsKEdVSUQgYml0bWFwRm9ybWF0KQoreworICAgIENPTVB0
cjxJV0lDQ29tcG9uZW50SW5mbz4gY29tcG9uZW50SW5mbzsKKyAgICBIUkVTVUxUIGhyID0gSW1h
Z2VEZWNvZGVyRGlyZWN0MkQ6OnN5c3RlbUltYWdpbmdGYWN0b3J5KCktPkNyZWF0ZUNvbXBvbmVu
dEluZm8oYml0bWFwRm9ybWF0LCAmY29tcG9uZW50SW5mbyk7CisgICAgaWYgKCFTVUNDRUVERUQo
aHIpKQorICAgICAgICByZXR1cm4gNDsKKworICAgIENPTVB0cjxJV0lDUGl4ZWxGb3JtYXRJbmZv
PiBwaXhlbEZvcm1hdDsKKyAgICBwaXhlbEZvcm1hdC5xdWVyeShjb21wb25lbnRJbmZvKTsKKyAg
ICBpZiAoIXBpeGVsRm9ybWF0KQorICAgICAgICByZXR1cm4gNDsKKworICAgIFVJTlQgYnBwID0g
MDsKKyAgICBociA9IHBpeGVsRm9ybWF0LT5HZXRCaXRzUGVyUGl4ZWwoJmJwcCk7CisgICAgaWYg
KCFTVUNDRUVERUQoaHIpKQorICAgICAgICByZXR1cm4gNDsKKworICAgIHJldHVybiBicHA7Cit9
CisKK0NPTVB0cjxJV0lDQml0bWFwPiBjcmVhdGVEaXJlY3QyREltYWdlU3VyZmFjZVdpdGhEYXRh
KHZvaWQqIGRhdGEsIGNvbnN0IEludFNpemUmIHNpemUsIHVuc2lnbmVkIHN0cmlkZSkKK3sKKyAg
ICBDaGVja2VkPHNpemVfdCwgUmVjb3JkT3ZlcmZsb3c+IG51bUJ5dGVzID0gQ2hlY2tlZDx1bnNp
Z25lZCwgUmVjb3JkT3ZlcmZsb3c+KHNpemUuaGVpZ2h0KCkpICogc3RyaWRlOworICAgIGlmIChu
dW1CeXRlcy5oYXNPdmVyZmxvd2VkKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAg
Q09NUHRyPElXSUNCaXRtYXA+IHN1cmZhY2U7CisgICAgSFJFU1VMVCBociA9IEltYWdlRGVjb2Rl
ckRpcmVjdDJEOjpzeXN0ZW1JbWFnaW5nRmFjdG9yeSgpLT5DcmVhdGVCaXRtYXBGcm9tTWVtb3J5
KHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgR1VJRF9XSUNQaXhlbEZvcm1hdDMyYnBwUEJH
UkEsIHN0cmlkZSwgc3RhdGljX2Nhc3Q8VUlOVD4obnVtQnl0ZXMudW5zYWZlR2V0KCkpLCByZWlu
dGVycHJldF9jYXN0PEJZVEUqPihkYXRhKSwgJnN1cmZhY2UpOworICAgIGlmICghU1VDQ0VFREVE
KGhyKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gc3VyZmFjZTsKK30K
KworQ09NUHRyPElEMkQxUmVuZGVyVGFyZ2V0PiBjcmVhdGVSZW5kZXJUYXJnZXRGcm9tV0lDQml0
bWFwKElXSUNCaXRtYXAqIGJpdG1hcFNvdXJjZSkKK3sKKyAgICBhdXRvIHRhcmdldFByb3BlcnRp
ZXMgPSBEMkQxOjpSZW5kZXJUYXJnZXRQcm9wZXJ0aWVzKEQyRDFfUkVOREVSX1RBUkdFVF9UWVBF
X0RFRkFVTFQsCisgICAgICAgIEQyRDE6OlBpeGVsRm9ybWF0KERYR0lfRk9STUFUX0I4RzhSOEE4
X1VOT1JNLCBEMkQxX0FMUEhBX01PREVfUFJFTVVMVElQTElFRCksCisgICAgICAgIDAsIDAsIEQy
RDFfUkVOREVSX1RBUkdFVF9VU0FHRV9OT05FLCBEMkQxX0ZFQVRVUkVfTEVWRUxfREVGQVVMVCk7
CisKKyAgICBDT01QdHI8SUQyRDFSZW5kZXJUYXJnZXQ+IGJpdG1hcENvbnRleHQ7CisgICAgSFJF
U1VMVCBociA9IEdyYXBoaWNzQ29udGV4dDo6c3lzdGVtRmFjdG9yeSgpLT5DcmVhdGVXaWNCaXRt
YXBSZW5kZXJUYXJnZXQoYml0bWFwU291cmNlLCAmdGFyZ2V0UHJvcGVydGllcywgJmJpdG1hcENv
bnRleHQpOworICAgIGlmICghYml0bWFwQ29udGV4dCB8fCAhU1VDQ0VFREVEKGhyKSkKKyAgICAg
ICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gYml0bWFwQ29udGV4dDsKK30KKwordm9p
ZCBjb3B5UmVjdEZyb21PbmVTdXJmYWNlVG9Bbm90aGVyKElXSUNCaXRtYXAqIGZyb20sIElXSUNC
aXRtYXAqIHRvLCBjb25zdCBJbnRTaXplJiBzb3VyY2VPZmZzZXQsIGNvbnN0IEludFJlY3QmIHJl
Y3QsIGNvbnN0IEludFNpemUmIGRlc3RPZmZzZXQpCit7CisgICAgLyoKKyAgICBSZWZQdHI8Y2Fp
cm9fdD4gY29udGV4dCA9IGFkb3B0UmVmKGNhaXJvX2NyZWF0ZSh0bykpOworICAgIGNhaXJvX3Ry
YW5zbGF0ZShjb250ZXh0LmdldCgpLCBkZXN0T2Zmc2V0LndpZHRoKCksIGRlc3RPZmZzZXQuaGVp
Z2h0KCkpOworICAgIGNhaXJvX3NldF9vcGVyYXRvcihjb250ZXh0LmdldCgpLCBjYWlyb09wZXJh
dG9yKTsKKyAgICBjb3B5UmVjdEZyb21DYWlyb1N1cmZhY2VUb0NvbnRleHQoZnJvbSwgY29udGV4
dC5nZXQoKSwgc291cmNlT2Zmc2V0LCByZWN0KTsKKyAgICAqLworfQorCit9IC8vIG5hbWVzcGFj
ZSBEaXJlY3QyRAorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoRElS
RUNUMkQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0
MkRVdGlsaXRpZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vRGlyZWN0MkRVdGlsaXRpZXMuaAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0MkRVdGlsaXRpZXMuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBT
LkwuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9OIGVtYmVkZGVkIHN5c3RlbXMKKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisK
KyNpZiBVU0UoRElSRUNUMkQpCisKKyNpbmNsdWRlICJDT01QdHIuaCIKKyNpbmNsdWRlICJHcmFw
aGljc1R5cGVzLmgiCisjaW5jbHVkZSAiSW50U2l6ZS5oIgorCitpbnRlcmZhY2UgSUQyRDFSZW5k
ZXJUYXJnZXQ7CitpbnRlcmZhY2UgSVdJQ0JpdG1hcFNvdXJjZTsKK2ludGVyZmFjZSBJV0lDQml0
bWFwOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEZsb2F0UG9pbnQ7CitjbGFzcyBJ
bnRSZWN0OworY2xhc3MgSW50U2l6ZTsKKworbmFtZXNwYWNlIERpcmVjdDJEIHsKKworSW50U2l6
ZSBiaXRtYXBTaXplKElXSUNCaXRtYXBTb3VyY2UqKTsKK0Zsb2F0UG9pbnQgYml0bWFwUmVzb2x1
dGlvbihJV0lDQml0bWFwU291cmNlKik7Cit1bnNpZ25lZCBiaXRzUGVyUGl4ZWwoR1VJRCk7CitD
T01QdHI8SVdJQ0JpdG1hcD4gY3JlYXRlRGlyZWN0MkRJbWFnZVN1cmZhY2VXaXRoRGF0YSh2b2lk
KiBkYXRhLCBjb25zdCBJbnRTaXplJiwgdW5zaWduZWQgc3RyaWRlKTsKK0NPTVB0cjxJRDJEMVJl
bmRlclRhcmdldD4gY3JlYXRlUmVuZGVyVGFyZ2V0RnJvbVdJQ0JpdG1hcChJV0lDQml0bWFwKik7
CisKK3ZvaWQgY29weVJlY3RGcm9tT25lU3VyZmFjZVRvQW5vdGhlcihJV0lDQml0bWFwKiBmcm9t
LCBJV0lDQml0bWFwKiB0bywgY29uc3QgSW50U2l6ZSYgc291cmNlT2Zmc2V0LCBjb25zdCBJbnRS
ZWN0JiwgY29uc3QgSW50U2l6ZSYgZGVzdE9mZnNldCA9IEludFNpemUoKSk7CisKK30gLy8gbmFt
ZXNwYWNlIERpcmVjdDJECisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVT
RShESVJFQ1QyRCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9G
b250Q2FzY2FkZURpcmVjdDJELmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vRm9udENhc2NhZGVEaXJlY3QyRC5jcHAJKHJldmlzaW9uIDI0ODAw
OCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2FzY2FkZURp
cmVjdDJELmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZURpcmVjdDJELmgiCiAjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29u
dGV4dERpcmVjdDJELmgiCiAjaW5jbHVkZSAiVW5pc2NyaWJlQ29udHJvbGxlci5oIgogI2luY2x1
ZGUgIldlYkNvcmVUZXh0UmVuZGVyZXIuaCIKICNpbmNsdWRlIDxkMmQxLmg+CkBAIC00Nyw3ICs0
OCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIHZvaWQgRm9udENhc2NhZGU6OmRyYXdHbHlwaHMo
R3JhcGhpY3NDb250ZXh0JiBncmFwaGljc0NvbnRleHQsIGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0
IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwKICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBu
dW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBGb250U21vb3RoaW5nTW9kZSBzbW9v
dGhpbmdNb2RlKQogewotICAgIGF1dG8gY29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC5wbGF0Zm9y
bUNvbnRleHQoKTsKKyAgICBhdXRvIGNvbnRleHQgPSBncmFwaGljc0NvbnRleHQucGxhdGZvcm1D
b250ZXh0KCktPnJlbmRlclRhcmdldCgpOwogICAgIGJvb2wgc2hvdWxkVXNlRm9udFNtb290aGlu
ZyA9IFdlYkNvcmVTaG91bGRVc2VGb250U21vb3RoaW5nKCk7CiAKICAgICBzd2l0Y2ggKHNtb290
aGluZ01vZGUpIHsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9H
cmFkaWVudERpcmVjdDJELmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vR3JhZGllbnREaXJlY3QyRC5jcHAJKHJldmlzaW9uIDI0ODAwOCkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFkaWVudERpcmVjdDJELmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjgsNiArMjgsNyBAQAogCiAjaW5jbHVkZSAiRmxvYXRQb2lu
dC5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29u
dGV4dERpcmVjdDJELmgiCiAjaW5jbHVkZSA8ZDJkMS5oPgogI2luY2x1ZGUgPHd0Zi9SZXRhaW5Q
dHIuaD4KIApAQCAtMTEwLDcgKzExMSw3IEBAIHZvaWQgR3JhZGllbnQ6OmdlbmVyYXRlR3JhZGll
bnQoSUQyRDFSZW4KIAogdm9pZCBHcmFkaWVudDo6ZmlsbChHcmFwaGljc0NvbnRleHQmIGNvbnRl
eHQsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKIHsKLSAgICBhdXRvIGQyZENvbnRleHQgPSBjb250
ZXh0LnBsYXRmb3JtQ29udGV4dCgpOworICAgIGF1dG8gZDJkQ29udGV4dCA9IGNvbnRleHQucGxh
dGZvcm1Db250ZXh0KCktPnJlbmRlclRhcmdldCgpOwogCiAgICAgV1RGOjpzd2l0Y2hPbihtX2Rh
dGEsCiAgICAgICAgIFsmXSAoY29uc3QgTGluZWFyRGF0YSYgZGF0YSkgewpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dERpcmVjdDJELmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3Jh
cGhpY3NDb250ZXh0RGlyZWN0MkQuY3BwCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0RGlyZWN0MkQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNi0y
MDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAx
Ni0yMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
ICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgogCiAjaW5jbHVkZSAiQ09NUHRyLmgiCisjaW5jbHVkZSAiRGlyZWN0MkRPcGVyYXRpb25z
LmgiCiAjaW5jbHVkZSAiRGlzcGxheUxpc3RSZWNvcmRlci5oIgogI2luY2x1ZGUgIkZsb2F0Um91
bmRlZFJlY3QuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJl
Y3QyRC5oIgpAQCAtMzQsNiArMzUsNyBAQAogI2luY2x1ZGUgIkltYWdlRGVjb2RlckRpcmVjdDJE
LmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisj
aW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaCIKICNpbmNsdWRlIDxkMmQxLmg+CiAj
aW5jbHVkZSA8ZDJkMWVmZmVjdHMuaD4KICNpbmNsdWRlIDxkd3JpdGUuaD4KQEAgLTYzLDEwICs2
NSwxMCBAQCBHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChIREMgaGRjCiAKICAgICAo
KnJlbmRlclRhcmdldCktPkJpbmREQyhoZGMsICZyZWN0KTsKIAotICAgIG1fZGF0YSA9IG5ldyBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKnJlbmRlclRhcmdldCwgQml0bWFwUmVuZGVy
aW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSk7CisgICAgLy9tX2RhdGEgPSBuZXcgR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlKCpyZW5kZXJUYXJnZXQsIEJpdG1hcFJlbmRlcmluZ0NvbnRl
eHRUeXBlOjpHUFVNZW1vcnkpOwogfQogCi1HcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4
dChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogcGxhdGZvcm1HcmFwaGljc0NvbnRleHQsIEJpdG1h
cFJlbmRlcmluZ0NvbnRleHRUeXBlIHJlbmRlcmVyVHlwZSkKK0dyYXBoaWNzQ29udGV4dDo6R3Jh
cGhpY3NDb250ZXh0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEKiBwbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dCwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUgcmVuZGVyZXJUeXBlKQogewogICAgIHBs
YXRmb3JtSW5pdChwbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCwgcmVuZGVyZXJUeXBlKTsKIH0KQEAg
LTEyNCw2ICsxMjYsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Jbml0KEhEQyBo
CiAgICAgaWYgKCFTVUNDRUVERUQoaHIpKQogICAgICAgICByZXR1cm47CiAKKyAgICAvKgogICAg
IG1fZGF0YSA9IG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUocmVuZGVyVGFyZ2V0
LmdldCgpLCBCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZTo6R1BVTWVtb3J5KTsKICAgICBtX2Rh
dGEtPm1faGRjID0gaGRjOwogICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBzdGFydHMgaW4g
c3luYyB3aXRoIG91ciBzdGF0ZS4KQEAgLTEzMSwxOSArMTM0LDIwIEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0OjpwbGF0Zm9ybUluaXQoSERDIGgKICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0
cm9rZUNvbG9yKCkpOwogICAgIHNldFBsYXRmb3JtU3Ryb2tlVGhpY2tuZXNzKHN0cm9rZVRoaWNr
bmVzcygpKTsKICAgICAvLyBGSVhNRTogbV9zdGF0ZS5pbWFnZUludGVycG9sYXRpb25RdWFsaXR5
ID0gY29udmVydEludGVycG9sYXRpb25RdWFsaXR5KENHQ29udGV4dEdldEludGVycG9sYXRpb25R
dWFsaXR5KHBsYXRmb3JtQ29udGV4dCgpKSk7CisgICAgKi8KIH0KIAotdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnBsYXRmb3JtSW5pdChJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KQordm9p
ZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtSW5pdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCog
cGxhdGZvcm1Db250ZXh0KQogewotICAgIHBsYXRmb3JtSW5pdChyZW5kZXJUYXJnZXQsIEJpdG1h
cFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1vcnkpOworICAgIHBsYXRmb3JtSW5pdChwbGF0
Zm9ybUNvbnRleHQsIEJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1vcnkpOwogfQog
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Jbml0KElEMkQxUmVuZGVyVGFyZ2V0KiBy
ZW5kZXJUYXJnZXQsIEJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlIHJlbmRlcmluZ1R5cGUpCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Jbml0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
KiBwbGF0Zm9ybUNvbnRleHQsIEJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlIHJlbmRlcmluZ1R5
cGUpCiB7Ci0gICAgaWYgKCFyZW5kZXJUYXJnZXQpCisgICAgaWYgKCFwbGF0Zm9ybUNvbnRleHQp
CiAgICAgICAgIHJldHVybjsKIAotICAgIG1fZGF0YSA9IG5ldyBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUocmVuZGVyVGFyZ2V0LCByZW5kZXJpbmdUeXBlKTsKKyAgICBtX2RhdGEgPSBu
ZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCpwbGF0Zm9ybUNvbnRleHQsIHJlbmRl
cmluZ1R5cGUpOwogCiAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZXh0IHN0YXJ0cyBpbiBzeW5j
IHdpdGggb3VyIHN0YXRlLgogICAgIHNldFBsYXRmb3JtRmlsbENvbG9yKGZpbGxDb2xvcigpKTsK
QEAgLTE1NywzMCArMTYxLDM1IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybURlc3Ry
b3koKQogICAgIGRlbGV0ZSBtX2RhdGE7CiB9CiAKLUlEMkQxUmVuZGVyVGFyZ2V0KiBHcmFwaGlj
c0NvbnRleHQ6OnBsYXRmb3JtQ29udGV4dCgpIGNvbnN0CitQbGF0Zm9ybUNvbnRleHREaXJlY3Qy
RCogR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybUNvbnRleHQoKSBjb25zdAogewogICAgIEFTU0VS
VCghcGFpbnRpbmdEaXNhYmxlZCgpKTsKLSAgICByZXR1cm4gbV9kYXRhLT5yZW5kZXJUYXJnZXQo
KTsKKyAgICByZXR1cm4gbV9kYXRhLT5wbGF0Zm9ybUNvbnRleHQoKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnN5bmNDb250ZXh0KFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCiBJRDJEMVJlbmRlclRhcmdl
dCogR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpyZW5kZXJUYXJnZXQoKQogewotICAg
IGlmICghbV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJu
IG1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5sYXN0KCkucmVuZGVyVGFyZ2V0LmdldCgpOworICAg
IGlmICghbV9wbGF0Zm9ybUNvbnRleHQubV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmlzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuIG1fcGxhdGZvcm1Db250ZXh0Lm1fdHJhbnNwYXJlbmN5TGF5ZXJT
dGFjay5sYXN0KCkucmVuZGVyVGFyZ2V0LmdldCgpOwogCi0gICAgcmV0dXJuIG1fcmVuZGVyVGFy
Z2V0LmdldCgpOworICAgIHJldHVybiBtX3BsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNldEFscGhhKGZsb2F0
IGFscGhhKQogewotICAgIEFTU0VSVChtX3RyYW5zcGFyZW5jeUxheWVyU3RhY2suaXNFbXB0eSgp
KTsKKyAgICBBU1NFUlQobV9wbGF0Zm9ybUNvbnRleHQubV90cmFuc3BhcmVuY3lMYXllclN0YWNr
LmlzRW1wdHkoKSk7CiAgICAgbV9hbHBoYSA9IGFscGhhOwogfQogCiBmbG9hdCBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGU6OmN1cnJlbnRHbG9iYWxBbHBoYSgpIGNvbnN0CiB7Ci0gICAg
aWYgKCFtX3RyYW5zcGFyZW5jeUxheWVyU3RhY2suaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4g
bV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmxhc3QoKS5vcGFjaXR5OworICAgIGlmICghbV9wbGF0
Zm9ybUNvbnRleHQubV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmlzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuIG1fcGxhdGZvcm1Db250ZXh0Lm1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5sYXN0KCku
b3BhY2l0eTsKIAogICAgIHJldHVybiBtX2FscGhhOwogfQpAQCAtMTkwLDkgKzE5OSw4IEBAIHZv
aWQgR3JhcGhpY3NDb250ZXh0OjpzYXZlUGxhdGZvcm1TdGF0ZSgKICAgICBBU1NFUlQoIXBhaW50
aW5nRGlzYWJsZWQoKSk7CiAgICAgQVNTRVJUKCFtX2ltcGwpOwogCi0gICAgLy8gTm90ZTogRG8g
bm90IHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiB0aGlzIGNsYXNzIGltcGxlbWVudGF0aW9uLCBz
aW5jZSB3ZSB3YW50IHRvIGF2b2lkIHRoZSBleHRyYQotICAgIC8vIHNhdmUgb2YgdGhlIHNlY29u
ZGFyeSBjb250ZXh0IChpbiBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5o
KS4KLSAgICBtX2RhdGEtPnNhdmUoKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkp
OworICAgIERpcmVjdDJEOjpzYXZlKCpwbGF0Zm9ybUNvbnRleHQoKSk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpyZXN0b3JlUGxhdGZvcm1TdGF0ZSgpCkBAIC0yMDAsOTcgKzIwOCwzMSBA
QCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhCiAgICAgQVNTRVJUKCFw
YWludGluZ0Rpc2FibGVkKCkpOwogICAgIEFTU0VSVCghbV9pbXBsKTsKIAotICAgIC8vIE5vdGU6
IERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoaW4gdGhpcyBjbGFzcyBpbXBsZW1lbnRhdGlv
biwgc2luY2Ugd2Ugd2FudCB0byBhdm9pZCB0aGUgZXh0cmEKLSAgICAvLyByZXN0b3JlIG9mIHRo
ZSBzZWNvbmRhcnkgY29udGV4dCAoaW4gR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGly
ZWN0MkQuaCkuCi0gICAgbV9kYXRhLT5yZXN0b3JlKCk7Ci0gICAgLy8gRklYTUU6IG1fZGF0YS0+
bV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eSA9IGZhbHNlOworICAgIEFT
U0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OnJlc3RvcmUoKnBsYXRm
b3JtQ29udGV4dCgpKTsKIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdOYXRpdmVJbWFn
ZShjb25zdCBDT01QdHI8SVdJQ0JpdG1hcD4mIGltYWdlLCBjb25zdCBGbG9hdFNpemUmIGltYWdl
U2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0
LCBDb21wb3NpdGVPcGVyYXRvciBvcCwgQmxlbmRNb2RlIGJsZW5kTW9kZSwgSW1hZ2VPcmllbnRh
dGlvbiBvcmllbnRhdGlvbikKLXsKLSAgICBDT01QdHI8SUQyRDFCaXRtYXA+IGRldmljZUJpdG1h
cDsKLSAgICBIUkVTVUxUIGhyID0gcGxhdGZvcm1Db250ZXh0KCktPkNyZWF0ZUJpdG1hcEZyb21X
aWNCaXRtYXAoaW1hZ2UuZ2V0KCksICZkZXZpY2VCaXRtYXApOwotICAgIGlmICghU1VDQ0VFREVE
KGhyKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZHJhd0RldmljZUJpdG1hcChkZXZpY2VCaXRt
YXAsIGltYWdlU2l6ZSwgZGVzdFJlY3QsIHNyY1JlY3QsIG9wLCBibGVuZE1vZGUsIG9yaWVudGF0
aW9uKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdEZXZpY2VCaXRtYXAoY29uc3Qg
Q09NUHRyPElEMkQxQml0bWFwPiYgaW1hZ2UsIGNvbnN0IEZsb2F0U2l6ZSYgaW1hZ2VTaXplLCBj
b25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBv
c2l0ZU9wZXJhdG9yIG9wLCBCbGVuZE1vZGUgYmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0aW9uIG9y
aWVudGF0aW9uKQordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdOYXRpdmVJbWFnZShjb25zdCBD
T01QdHI8SVdJQ0JpdG1hcD4mIGltYWdlLCBjb25zdCBGbG9hdFNpemUmIGltYWdlU2l6ZSwgY29u
c3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3Np
dGVPcGVyYXRvciBjb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlIGJsZW5kTW9kZSwgSW1hZ2VP
cmllbnRhdGlvbiBvcmllbnRhdGlvbikKIHsKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQog
ICAgICAgICByZXR1cm47CiAKICAgICBpZiAobV9pbXBsKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBJ
bXBsZW1lbnQgRGlzcGxheUxpc3RSZWNvcmRlciBzdXBwb3J0IGZvciBkcmF3TmF0aXZlSW1hZ2Uu
Ci0gICAgICAgIC8vIG1fZGlzcGxheUxpc3RSZWNvcmRlci0+ZHJhd05hdGl2ZUltYWdlKGltYWdl
LCBpbWFnZVNpemUsIGRlc3RSZWN0LCBzcmNSZWN0LCBvcCwgYmxlbmRNb2RlLCBvcmllbnRhdGlv
bik7Ci0gICAgICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgICAgIG1faW1wbC0+ZHJhd05hdGl2
ZUltYWdlKGltYWdlLCBpbWFnZVNpemUsIGRlc3RSZWN0LCBzcmNSZWN0LCBjb21wb3NpdGVPcGVy
YXRvciwgYmxlbmRNb2RlLCBvcmllbnRhdGlvbik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAK
LSAgICBhdXRvIGJpdG1hcFNpemUgPSBpbWFnZS0+R2V0U2l6ZSgpOwotCi0gICAgZmxvYXQgY3Vy
ckhlaWdodCA9IG9yaWVudGF0aW9uLnVzZXNXaWR0aEFzSGVpZ2h0KCkgPyBiaXRtYXBTaXplLndp
ZHRoIDogYml0bWFwU2l6ZS5oZWlnaHQ7Ci0gICAgaWYgKGN1cnJIZWlnaHQgPD0gc3JjUmVjdC55
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4
dCgpOwotCi0gICAgRDJEMV9NQVRSSVhfM1gyX0YgY3RtOwotICAgIGNvbnRleHQtPkdldFRyYW5z
Zm9ybSgmY3RtKTsKLQotICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0oY3RtKTsKLQotICAg
IEQyRENvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSk7Ci0KLSAgICBib29sIHNo
b3VsZFVzZVN1YmltYWdlID0gZmFsc2U7Ci0KLSAgICAvLyBJZiB0aGUgc291cmNlIHJlY3QgaXMg
YSBzdWJwb3J0aW9uIG9mIHRoZSBpbWFnZSwgdGhlbiB3ZSBjb21wdXRlIGFuIGluZmxhdGVkIGRl
c3RpbmF0aW9uIHJlY3QgdGhhdCB3aWxsIGhvbGQgdGhlIGVudGlyZSBpbWFnZQotICAgIC8vIGFu
ZCB0aGVuIHNldCBhIGNsaXAgdG8gdGhlIHBvcnRpb24gdGhhdCB3ZSB3YW50IHRvIGRpc3BsYXku
Ci0gICAgRmxvYXRSZWN0IGFkanVzdGVkRGVzdFJlY3QgPSBkZXN0UmVjdDsKLQotICAgIGlmIChz
cmNSZWN0LnNpemUoKSAhPSBpbWFnZVNpemUpIHsKLSAgICAgICAgLy8gRklYTUU6IEltcGxlbWVu
dCBpbWFnZSBzY2FsaW5nCi0gICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgfQotCi0gICAg
Ly8gSWYgdGhlIGltYWdlIGlzIG9ubHkgcGFydGlhbGx5IGxvYWRlZCwgdGhlbiBzaHJpbmsgdGhl
IGRlc3RpbmF0aW9uIHJlY3QgdGhhdCB3ZSdyZSBkcmF3aW5nIGludG8gYWNjb3JkaW5nbHkuCi0g
ICAgaWYgKCFzaG91bGRVc2VTdWJpbWFnZSAmJiBjdXJySGVpZ2h0IDwgaW1hZ2VTaXplLmhlaWdo
dCgpKQotICAgICAgICBhZGp1c3RlZERlc3RSZWN0LnNldEhlaWdodChhZGp1c3RlZERlc3RSZWN0
LmhlaWdodCgpICogY3VyckhlaWdodCAvIGltYWdlU2l6ZS5oZWlnaHQoKSk7Ci0KLSAgICBzZXRQ
bGF0Zm9ybUNvbXBvc2l0ZU9wZXJhdGlvbihvcCwgYmxlbmRNb2RlKTsKLQotICAgIC8vIEltYWdl
T3JpZW50YXRpb24gZXhwZWN0cyB0aGUgb3JpZ2luIHRvIGJlIGF0ICgwLCAwKS4KLSAgICB0cmFu
c2Zvcm0udHJhbnNsYXRlKGFkanVzdGVkRGVzdFJlY3QueCgpLCBhZGp1c3RlZERlc3RSZWN0Lnko
KSk7Ci0gICAgY29udGV4dC0+U2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0gICAgYWRqdXN0ZWRE
ZXN0UmVjdC5zZXRMb2NhdGlvbihGbG9hdFBvaW50KCkpOwotCi0gICAgaWYgKG9yaWVudGF0aW9u
ICE9IERlZmF1bHRJbWFnZU9yaWVudGF0aW9uKSB7Ci0gICAgICAgIHRoaXMtPmNvbmNhdENUTShv
cmllbnRhdGlvbi50cmFuc2Zvcm1Gcm9tRGVmYXVsdChhZGp1c3RlZERlc3RSZWN0LnNpemUoKSkp
OwotICAgICAgICBpZiAob3JpZW50YXRpb24udXNlc1dpZHRoQXNIZWlnaHQoKSkgewotICAgICAg
ICAgICAgLy8gVGhlIGRlc3RpbmF0aW9uIHJlY3Qgd2lsbCBoYXZlIGl0J3Mgd2lkdGggYW5kIGhl
aWdodCBhbHJlYWR5IHJldmVyc2VkIGZvciB0aGUgb3JpZW50YXRpb24gb2YKLSAgICAgICAgICAg
IC8vIHRoZSBpbWFnZSwgYXMgaXQgd2FzIG5lZWRlZCBmb3IgcGFnZSBsYXlvdXQsIHNvIHdlIG5l
ZWQgdG8gcmV2ZXJzZSBpdCBiYWNrIGhlcmUuCi0gICAgICAgICAgICBhZGp1c3RlZERlc3RSZWN0
ID0gRmxvYXRSZWN0KGFkanVzdGVkRGVzdFJlY3QueCgpLCBhZGp1c3RlZERlc3RSZWN0LnkoKSwg
YWRqdXN0ZWREZXN0UmVjdC5oZWlnaHQoKSwgYWRqdXN0ZWREZXN0UmVjdC53aWR0aCgpKTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotCi0g
ICAgZHJhd1dpdGhvdXRTaGFkb3coYWRqdXN0ZWREZXN0UmVjdCwgW3RoaXMsIGltYWdlLCBhZGp1
c3RlZERlc3RSZWN0LCBzcmNSZWN0XShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7
Ci0gICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0JpdG1hcChpbWFnZS5nZXQoKSwgYWRqdXN0ZWRE
ZXN0UmVjdCwgMS4wZiwgRDJEMV9CSVRNQVBfSU5URVJQT0xBVElPTl9NT0RFX0xJTkVBUiwgc3Rh
dGljX2Nhc3Q8RDJEMV9SRUNUX0Y+KHNyY1JlY3QpKTsKLSAgICB9KTsKLQotICAgIGZsdXNoKCk7
Ci0KLSAgICBpZiAoIXN0YXRlU2F2ZXIuZGlkU2F2ZSgpKQotICAgICAgICBjb250ZXh0LT5TZXRU
cmFuc2Zvcm0oY3RtKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1
dG8mIHN0YXRlID0gdGhpcy0+c3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZHJhd05hdGl2ZUltYWdl
KCpwbGF0Zm9ybUNvbnRleHQoKSwgaW1hZ2UuZ2V0KCksIGltYWdlU2l6ZSwgZGVzdFJlY3QsIHNy
Y1JlY3QsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUsIG9yaWVudGF0aW9uLCBzdGF0ZS5p
bWFnZUludGVycG9sYXRpb25RdWFsaXR5LCBzdGF0ZS5hbHBoYSwgRGlyZWN0MkQ6OlNoYWRvd1N0
YXRlKHN0YXRlKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0Nv
bnRleHQoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFC
bGVuZCkKIHsKICAgICBib29sIGNyZWF0ZWRCaXRtYXAgPSBtX2ltcGwgfHwgIW1fZGF0YS0+bV9o
ZGMgfHwgaXNJblRyYW5zcGFyZW5jeUxheWVyKCk7CiAgICAgaWYgKCFjcmVhdGVkQml0bWFwKSB7
Ci0gICAgICAgIG1fZGF0YS0+cmVzdG9yZSgpOworICAgICAgICBBU1NFUlQoaGFzUGxhdGZvcm1D
b250ZXh0KCkpOworICAgICAgICBEaXJlY3QyRDo6cmVzdG9yZSgqcGxhdGZvcm1Db250ZXh0KCkp
OwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0zMDUsMTMgKzI0NywxMyBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250CiAgICAgYXV0byBiaXRtYXBQcm9wZXJ0
aWVzID0gRDJEMTo6Qml0bWFwUHJvcGVydGllcyhEMkQxOjpQaXhlbEZvcm1hdChEWEdJX0ZPUk1B
VF9COEc4UjhBOF9VTk9STSwgRDJEMV9BTFBIQV9NT0RFX1BSRU1VTFRJUExJRUQpKTsKIAogICAg
IENPTVB0cjxJRDJEMUJpdG1hcD4gYml0bWFwOwotICAgIEhSRVNVTFQgaHIgPSBwbGF0Zm9ybUNv
bnRleHQoKS0+Q3JlYXRlQml0bWFwKHBpeGVsRGF0YS5zaXplKCksIHBpeGVsRGF0YS5idWZmZXIo
KSwgcGl4ZWxEYXRhLmJ5dGVzUGVyUm93KCksICZiaXRtYXBQcm9wZXJ0aWVzLCAmYml0bWFwKTsK
KyAgICBIUkVTVUxUIGhyID0gcGxhdGZvcm1Db250ZXh0KCktPnJlbmRlclRhcmdldCgpLT5DcmVh
dGVCaXRtYXAocGl4ZWxEYXRhLnNpemUoKSwgcGl4ZWxEYXRhLmJ1ZmZlcigpLCBwaXhlbERhdGEu
Ynl0ZXNQZXJSb3coKSwgJmJpdG1hcFByb3BlcnRpZXMsICZiaXRtYXApOwogICAgIEFTU0VSVChT
VUNDRUVERUQoaHIpKTsKIAogICAgIEQyRENvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1f
ZGF0YSk7CiAKICAgICAvLyBOb3RlOiBUaGUgY29udGVudCBpbiB0aGUgSERDIGlzIGludmVydGVk
IGNvbXBhcmVkIHRvIERpcmVjdDJELCBzbyBpdCBuZWVkcyB0byBiZSBmbGlwcGVkLgotICAgIGF1
dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOworICAgIGF1dG8gY29udGV4dCA9IHBsYXRm
b3JtQ29udGV4dCgpLT5yZW5kZXJUYXJnZXQoKTsKIAogICAgIEQyRDFfTUFUUklYXzNYMl9GIGN1
cnJlbnRUcmFuc2Zvcm07CiAgICAgY29udGV4dC0+R2V0VHJhbnNmb3JtKCZjdXJyZW50VHJhbnNm
b3JtKTsKQEAgLTM0MywxMSArMjg1LDExIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3RG90
c0ZvckRvY3VtZW4KIHsKIH0KIAotR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdl
dCwgR3JhcGhpY3NDb250ZXh0OjpCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZSByZW5kZXJpbmdU
eXBlKQotICAgIDogbV9yZW5kZXJUYXJnZXQocmVuZGVyVGFyZ2V0KQorR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgR3JhcGhpY3NDb250ZXh0OjpCaXRtYXBS
ZW5kZXJpbmdDb250ZXh0VHlwZSByZW5kZXJpbmdUeXBlKQorICAgIDogbV9wbGF0Zm9ybUNvbnRl
eHQocGxhdGZvcm1Db250ZXh0KQogICAgICwgbV9yZW5kZXJlclR5cGUocmVuZGVyaW5nVHlwZSkK
IHsKLSAgICBpZiAoIW1fcmVuZGVyVGFyZ2V0KQorICAgIGlmICghbV9wbGF0Zm9ybUNvbnRleHQu
cmVuZGVyVGFyZ2V0KCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIGlmIChtX3JlbmRlcmVyVHlw
ZSA9PSBHcmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1v
cnkpCkBAIC0zNTYsMTA2ICsyOTgsNTEgQEAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
OjpHcmFwaGljcwogCiBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6On5HcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGUoKQogewotICAgIGlmICghbV9yZW5kZXJUYXJnZXQpCisgICAg
aWYgKCFtX3BsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKSkKICAgICAgICAgcmV0dXJuOwog
CiAgICAgaWYgKGJlZ2luRHJhd0NvdW50KQogICAgICAgICBlbmREcmF3KCk7CiB9CiAKLUNPTVB0
cjxJRDJEMVNvbGlkQ29sb3JCcnVzaD4gR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpi
cnVzaFdpdGhDb2xvcihjb25zdCBEMkQxX0NPTE9SX0YmIGNvbG9yKQotewotICAgIFJHQkEzMiBj
b2xvcktleSA9IG1ha2VSR0JBMzJGcm9tRmxvYXRzKGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIs
IGNvbG9yLmEpOwotCi0gICAgaWYgKCFjb2xvcktleSkgewotICAgICAgICBpZiAoIW1femVyb0Jy
dXNoKQotICAgICAgICAgICAgbV9yZW5kZXJUYXJnZXQtPkNyZWF0ZVNvbGlkQ29sb3JCcnVzaChj
b2xvciwgJm1femVyb0JydXNoKTsKLSAgICAgICAgcmV0dXJuIG1femVyb0JydXNoOwotICAgIH0K
LQotICAgIGlmIChjb2xvcktleSA9PSAweEZGRkZGRkZGKSB7Ci0gICAgICAgIGlmICghbV93aGl0
ZUJydXNoKQotICAgICAgICAgICAgbV9yZW5kZXJUYXJnZXQtPkNyZWF0ZVNvbGlkQ29sb3JCcnVz
aChjb2xvciwgJm1fd2hpdGVCcnVzaCk7Ci0gICAgICAgIHJldHVybiBtX3doaXRlQnJ1c2g7Ci0g
ICAgfQotCi0gICAgYXV0byBleGlzdGluZ0JydXNoID0gbV9zb2xpZENvbG9yZWRCcnVzaENhY2hl
LmVuc3VyZShjb2xvcktleSwgW3RoaXMsIGNvbG9yXSB7Ci0gICAgICAgIENPTVB0cjxJRDJEMVNv
bGlkQ29sb3JCcnVzaD4gY29sb3JCcnVzaDsKLSAgICAgICAgbV9yZW5kZXJUYXJnZXQtPkNyZWF0
ZVNvbGlkQ29sb3JCcnVzaChjb2xvciwgJmNvbG9yQnJ1c2gpOwotICAgICAgICByZXR1cm4gY29s
b3JCcnVzaDsKLSAgICB9KTsKLQotICAgIHJldHVybiBleGlzdGluZ0JydXNoLml0ZXJhdG9yLT52
YWx1ZTsKLX0KLQogSUQyRDFTb2xpZENvbG9yQnJ1c2gqIEdyYXBoaWNzQ29udGV4dDo6YnJ1c2hX
aXRoQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKQogewotICAgIHJldHVybiBtX2RhdGEtPmJydXNo
V2l0aENvbG9yKGNvbG9yV2l0aEdsb2JhbEFscGhhKGNvbG9yKSkuZ2V0KCk7CisgICAgQVNTRVJU
KGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICByZXR1cm4gcGxhdGZvcm1Db250ZXh0KCktPmJy
dXNoV2l0aENvbG9yKGNvbG9yV2l0aEdsb2JhbEFscGhhKGNvbG9yKSkuZ2V0KCk7CiB9CiAKIHZv
aWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjbGlwKGNvbnN0IEZsb2F0UmVjdCYg
cmVjdCkKIHsKLSAgICBpZiAobV9yZW5kZXJTdGF0ZXMuaXNFbXB0eSgpKQotICAgICAgICBzYXZl
KCk7Ci0KLSAgICBtX3JlbmRlclRhcmdldC0+UHVzaEF4aXNBbGlnbmVkQ2xpcChyZWN0LCBEMkQx
X0FOVElBTElBU19NT0RFX1BFUl9QUklNSVRJVkUpOwotICAgIG1fcmVuZGVyU3RhdGVzLmxhc3Qo
KS5tX2NsaXBzLmFwcGVuZChHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkF4aXNBbGln
bmVkQ2xpcCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjbGlw
KGNvbnN0IFBhdGgmIHBhdGgpCiB7Ci0gICAgY2xpcChwYXRoLnBsYXRmb3JtUGF0aCgpKTsKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNsaXAoSUQyRDFHZW9tZXRy
eSogcGF0aCkKIHsKLSAgICBBU1NFUlQobV9yZW5kZXJTdGF0ZXMuc2l6ZSgpKTsKLSAgICBpZiAo
IW1fcmVuZGVyU3RhdGVzLnNpemUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ09NUHRyPElE
MkQxTGF5ZXI+IGNsaXBMYXllcjsKLSAgICBIUkVTVUxUIGhyID0gbV9yZW5kZXJUYXJnZXQtPkNy
ZWF0ZUxheWVyKCZjbGlwTGF5ZXIpOwotICAgIEFTU0VSVChTVUNDRUVERUQoaHIpKTsKLSAgICBp
ZiAoIVNVQ0NFRURFRChocikpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcmVuZGVyVGFyZ2V0
LT5QdXNoTGF5ZXIoRDJEMTo6TGF5ZXJQYXJhbWV0ZXJzKEQyRDE6OkluZmluaXRlUmVjdCgpLCBw
YXRoKSwgY2xpcExheWVyLmdldCgpKTsKLSAgICBtX3JlbmRlclN0YXRlcy5sYXN0KCkubV9jbGlw
cy5hcHBlbmQoR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpMYXllckNsaXApOwotICAg
IG1fcmVuZGVyU3RhdGVzLmxhc3QoKS5tX2FjdGl2ZUxheWVyID0gY2xpcExheWVyOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uY2F0Q1RNKGNvbnN0IEFmZmlu
ZVRyYW5zZm9ybSYgYWZmaW5lVHJhbnNmb3JtKQogewotICAgIEFTU0VSVChtX3JlbmRlclRhcmdl
dC5nZXQoKSk7Ci0KLSAgICBEMkQxX01BVFJJWF8zWDJfRiBjdXJyZW50VHJhbnNmb3JtOwotICAg
IG1fcmVuZGVyVGFyZ2V0LT5HZXRUcmFuc2Zvcm0oJmN1cnJlbnRUcmFuc2Zvcm0pOwotCi0gICAg
RDJEMV9NQVRSSVhfM1gyX0YgdHJhbnNmb3JtVG9Db25jYXQgPSBhZmZpbmVUcmFuc2Zvcm07Ci0g
ICAgbV9yZW5kZXJUYXJnZXQtPlNldFRyYW5zZm9ybSh0cmFuc2Zvcm1Ub0NvbmNhdCAqIGN1cnJl
bnRUcmFuc2Zvcm0pOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6
Zmx1c2goKQogewotICAgIEFTU0VSVChtX3JlbmRlclRhcmdldC5nZXQoKSk7Ci0gICAgRDJEMV9U
QUcgZmlyc3QsIHNlY29uZDsKLSAgICBIUkVTVUxUIGhyID0gbV9yZW5kZXJUYXJnZXQtPkZsdXNo
KCZmaXJzdCwgJnNlY29uZCk7Ci0KLSAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmJlZ2luRHJhdygpCiB7
Ci0gICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgpKTsKLSAgICBtX3JlbmRlclRhcmdldC0+
QmVnaW5EcmF3KCk7CisgICAgQVNTRVJUKG1fcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgp
KTsKKyAgICBtX3BsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+QmVnaW5EcmF3KCk7CiAg
ICAgKytiZWdpbkRyYXdDb3VudDsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGU6OmVuZERyYXcoKQogewotICAgIEFTU0VSVChtX3JlbmRlclRhcmdldC5nZXQoKSk7Cisg
ICAgQVNTRVJUKG1fcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpKTsKICAgICBEMkQxX1RB
RyBmaXJzdCwgc2Vjb25kOwotICAgIEhSRVNVTFQgaHIgPSBtX3JlbmRlclRhcmdldC0+RW5kRHJh
dygmZmlyc3QsICZzZWNvbmQpOworICAgIEhSRVNVTFQgaHIgPSBtX3BsYXRmb3JtQ29udGV4dC5y
ZW5kZXJUYXJnZXQoKS0+RW5kRHJhdygmZmlyc3QsICZzZWNvbmQpOwogCiAgICAgaWYgKCFTVUND
RUVERUQoaHIpKQogICAgICAgICBXVEZMb2dBbHdheXMoIkZhaWxlZCBpbiBHcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGU6OmVuZERyYXc6IGhyPSV4ZCwgZmlyc3Q9JWxkLCBzZWNvbmQ9JWxk
IiwgaHIsIGZpcnN0LCBzZWNvbmQpOwpAQCAtNDY1LDY4ICszNTIsMjggQEAgdm9pZCBHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmVuZAogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZTo6cmVzdG9yZSgpCiB7Ci0gICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgp
KTsKLQotICAgIGF1dG8gcmVzdG9yZVN0YXRlID0gbV9yZW5kZXJTdGF0ZXMudGFrZUxhc3QoKTsK
LSAgICBtX3JlbmRlclRhcmdldC0+UmVzdG9yZURyYXdpbmdTdGF0ZShyZXN0b3JlU3RhdGUubV9k
cmF3aW5nU3RhdGVCbG9jay5nZXQoKSk7Ci0KLSAgICBmb3IgKGF1dG8gY2xpcFR5cGUgPSByZXN0
b3JlU3RhdGUubV9jbGlwcy5yYmVnaW4oKTsgY2xpcFR5cGUgIT0gcmVzdG9yZVN0YXRlLm1fY2xp
cHMucmVuZCgpOyArK2NsaXBUeXBlKSB7Ci0gICAgICAgIGlmICgqY2xpcFR5cGUgPT0gR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpBeGlzQWxpZ25lZENsaXApCi0gICAgICAgICAgICBt
X3JlbmRlclRhcmdldC0+UG9wQXhpc0FsaWduZWRDbGlwKCk7Ci0gICAgICAgIGVsc2UKLSAgICAg
ICAgICAgIG1fcmVuZGVyVGFyZ2V0LT5Qb3BMYXllcigpOwotICAgIH0KIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNhdmUoKQogewotICAgIEFTU0VSVChtX3JlbmRl
clRhcmdldC5nZXQoKSk7Ci0KLSAgICBSZW5kZXJTdGF0ZSBjdXJyZW50U3RhdGU7Ci0gICAgR3Jh
cGhpY3NDb250ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0ZURyYXdpbmdTdGF0ZUJsb2NrKCZj
dXJyZW50U3RhdGUubV9kcmF3aW5nU3RhdGVCbG9jayk7Ci0KLSAgICBtX3JlbmRlclRhcmdldC0+
U2F2ZURyYXdpbmdTdGF0ZShjdXJyZW50U3RhdGUubV9kcmF3aW5nU3RhdGVCbG9jay5nZXQoKSk7
Ci0KLSAgICBtX3JlbmRlclN0YXRlcy5hcHBlbmQoY3VycmVudFN0YXRlKTsKIH0KIAogdm9pZCBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6
ZSkKIHsKLSAgICBBU1NFUlQobV9yZW5kZXJUYXJnZXQuZ2V0KCkpOwotCi0gICAgRDJEMV9NQVRS
SVhfM1gyX0YgY3VycmVudFRyYW5zZm9ybTsKLSAgICBtX3JlbmRlclRhcmdldC0+R2V0VHJhbnNm
b3JtKCZjdXJyZW50VHJhbnNmb3JtKTsKLQotICAgIGF1dG8gc2NhbGUgPSBEMkQxOjpNYXRyaXgz
eDJGOjpTY2FsZShzaXplKTsKLSAgICBtX3JlbmRlclRhcmdldC0+U2V0VHJhbnNmb3JtKHNjYWxl
ICogY3VycmVudFRyYW5zZm9ybSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlOjpzZXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCiB7Ci0gICAg
QVNTRVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgpKTsKLSAgICBtX3JlbmRlclRhcmdldC0+U2V0VHJh
bnNmb3JtKHRyYW5zZm9ybSk7CisgICAgQVNTRVJUKG1fcGxhdGZvcm1Db250ZXh0LnJlbmRlclRh
cmdldCgpKTsKKyAgICBtX3BsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+U2V0VHJhbnNm
b3JtKHRyYW5zZm9ybSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
Ojp0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkKIHsKLSAgICBBU1NFUlQobV9yZW5kZXJUYXJn
ZXQuZ2V0KCkpOwotCi0gICAgRDJEMV9NQVRSSVhfM1gyX0YgY3VycmVudFRyYW5zZm9ybTsKLSAg
ICBtX3JlbmRlclRhcmdldC0+R2V0VHJhbnNmb3JtKCZjdXJyZW50VHJhbnNmb3JtKTsKLQotICAg
IGF1dG8gdHJhbnNsYXRpb24gPSBEMkQxOjpNYXRyaXgzeDJGOjpUcmFuc2xhdGlvbih4LCB5KTsK
LSAgICBtX3JlbmRlclRhcmdldC0+U2V0VHJhbnNmb3JtKHRyYW5zbGF0aW9uICogY3VycmVudFRy
YW5zZm9ybSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpyb3Rh
dGUoZmxvYXQgYW5nbGUpCiB7Ci0gICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgpKTsKLQot
ICAgIEQyRDFfTUFUUklYXzNYMl9GIGN1cnJlbnRUcmFuc2Zvcm07Ci0gICAgbV9yZW5kZXJUYXJn
ZXQtPkdldFRyYW5zZm9ybSgmY3VycmVudFRyYW5zZm9ybSk7Ci0KLSAgICBhdXRvIHJvdGF0aW9u
ID0gRDJEMTo6TWF0cml4M3gyRjo6Um90YXRpb24ocmFkMmRlZyhhbmdsZSkpOwotICAgIG1fcmVu
ZGVyVGFyZ2V0LT5TZXRUcmFuc2Zvcm0ocm90YXRpb24gKiBjdXJyZW50VHJhbnNmb3JtKTsKIH0K
IAogRDJEMV9DT0xPUl9GIEdyYXBoaWNzQ29udGV4dDo6Y29sb3JXaXRoR2xvYmFsQWxwaGEoY29u
c3QgQ29sb3ImIGNvbG9yKSBjb25zdApAQCAtNTM5LDIyICszODYsMjIgQEAgRDJEMV9DT0xPUl9G
IEdyYXBoaWNzQ29udGV4dDo6Y29sb3JXaXRoRwogCiBJRDJEMUJydXNoKiBHcmFwaGljc0NvbnRl
eHQ6OnNvbGlkU3Ryb2tlQnJ1c2goKSBjb25zdAogewotICAgIHJldHVybiBtX2RhdGEtPm1fc29s
aWRTdHJva2VCcnVzaC5nZXQoKTsKKyAgICByZXR1cm4gcGxhdGZvcm1Db250ZXh0KCktPm1fc29s
aWRTdHJva2VCcnVzaC5nZXQoKTsKIH0KIAogSUQyRDFCcnVzaCogR3JhcGhpY3NDb250ZXh0Ojpz
b2xpZEZpbGxCcnVzaCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fZGF0YS0+bV9zb2xpZEZpbGxC
cnVzaC5nZXQoKTsKKyAgICByZXR1cm4gcGxhdGZvcm1Db250ZXh0KCktPm1fc29saWRGaWxsQnJ1
c2guZ2V0KCk7CiB9CiAKIElEMkQxQnJ1c2gqIEdyYXBoaWNzQ29udGV4dDo6cGF0dGVyblN0cm9r
ZUJydXNoKCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV9kYXRhLT5tX3BhdHRlcm5TdHJva2VCcnVz
aC5nZXQoKTsKKyAgICByZXR1cm4gcGxhdGZvcm1Db250ZXh0KCktPm1fcGF0dGVyblN0cm9rZUJy
dXNoLmdldCgpOwogfQogCiBJRDJEMUJydXNoKiBHcmFwaGljc0NvbnRleHQ6OnBhdHRlcm5GaWxs
QnJ1c2goKSBjb25zdAogewotICAgIHJldHVybiBtX2RhdGEtPm1fcGF0dGVybkZpbGxCcnVzaC5n
ZXQoKTsKKyAgICByZXR1cm4gcGxhdGZvcm1Db250ZXh0KCktPm1fcGF0dGVybkZpbGxCcnVzaC5n
ZXQoKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmJlZ2luRHJhdygpCkBAIC01NjksNzUg
KzQxNiwyMyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZW5kRHJhdygpCiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpmbHVzaCgpCiB7Ci0gICAgbV9kYXRhLT5mbHVzaCgpOworICAgIEFTU0VSVCho
YXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OmZsdXNoKCpwbGF0Zm9ybUNvbnRl
eHQoKSk7CiB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3UGF0dGVybihJbWFnZSYgaW1h
Z2UsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3Qs
IGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5zZm9ybSwgY29uc3QgRmxvYXRQb2lu
dCYgcGhhc2UsIGNvbnN0IEZsb2F0U2l6ZSYgc3BhY2luZywgQ29tcG9zaXRlT3BlcmF0b3Igb3As
IEJsZW5kTW9kZSBibGVuZE1vZGUpCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1BhdHRlcm4o
SW1hZ2UmIGltYWdlLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3Qm
IHRpbGVSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zvcm0sIGNvbnN0
IEZsb2F0UG9pbnQmIHBoYXNlLCBjb25zdCBGbG9hdFNpemUmIHNwYWNpbmcsIENvbXBvc2l0ZU9w
ZXJhdG9yIGNvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUgYmxlbmRNb2RlKQogewogICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkgfHwgIXBhdHRlcm5UcmFuc2Zvcm0uaXNJbnZlcnRpYmxlKCkp
CiAgICAgICAgIHJldHVybjsKIAogICAgIGlmIChtX2ltcGwpIHsKLSAgICAgICAgbV9pbXBsLT5k
cmF3UGF0dGVybihpbWFnZSwgZGVzdFJlY3QsIHRpbGVSZWN0LCBwYXR0ZXJuVHJhbnNmb3JtLCBw
aGFzZSwgc3BhY2luZywgb3AsIGJsZW5kTW9kZSk7CisgICAgICAgIG1faW1wbC0+ZHJhd1BhdHRl
cm4oaW1hZ2UsIGRlc3RSZWN0LCB0aWxlUmVjdCwgcGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIHNw
YWNpbmcsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUpOwogICAgICAgICByZXR1cm47CiAg
ICAgfQogCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0gICAgRDJEQ29u
dGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqbV9kYXRhKTsKLQotICAgIG1fZGF0YS0+Y2xpcChk
ZXN0UmVjdCk7Ci0KLSAgICBzZXRQbGF0Zm9ybUNvbXBvc2l0ZU9wZXJhdGlvbihvcCwgYmxlbmRN
b2RlKTsKLQotICAgIGF1dG8gYml0bWFwQnJ1c2hQcm9wZXJ0aWVzID0gRDJEMTo6Qml0bWFwQnJ1
c2hQcm9wZXJ0aWVzKCk7Ci0gICAgYml0bWFwQnJ1c2hQcm9wZXJ0aWVzLmV4dGVuZE1vZGVYID0g
RDJEMV9FWFRFTkRfTU9ERV9XUkFQOwotICAgIGJpdG1hcEJydXNoUHJvcGVydGllcy5leHRlbmRN
b2RlWSA9IEQyRDFfRVhURU5EX01PREVfV1JBUDsKLQotICAgIC8vIENyZWF0ZSBhIGJydXNoIHRy
YW5zZm9ybWF0aW9uIHNvIHdlIHBhaW50IHVzaW5nIHRoZSBzZWN0aW9uIG9mIHRoZSBpbWFnZSB3
ZSBjYXJlIGFib3V0LgotICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm1hdGlvbiA9IHBhdHRl
cm5UcmFuc2Zvcm07Ci0gICAgdHJhbnNmb3JtYXRpb24udHJhbnNsYXRlKGRlc3RSZWN0LmxvY2F0
aW9uKCkpOwotCi0gICAgYXV0byBicnVzaFByb3BlcnRpZXMgPSBEMkQxOjpCcnVzaFByb3BlcnRp
ZXMoKTsKLSAgICBicnVzaFByb3BlcnRpZXMudHJhbnNmb3JtID0gdHJhbnNmb3JtYXRpb247Ci0g
ICAgYnJ1c2hQcm9wZXJ0aWVzLm9wYWNpdHkgPSAxLjBmOwotCi0gICAgYXV0byB0aWxlSW1hZ2Ug
PSBpbWFnZS5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOwotCi0gICAgLy8gSWYgd2Ugb25s
eSB3YW50IGEgc3Vic2V0IG9mIHRoZSBiaXRtYXAsIHdlIG5lZWQgdG8gY3JlYXRlIGEgY3JvcHBl
ZCBiaXRtYXAgaW1hZ2UuIEFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbiwKLSAgICAvLyB0
aGlzIGRvZXMgbm90IGFsbG9jYXRlIG5ldyBiaXRtYXAgbWVtb3J5LgotICAgIGlmIChpbWFnZS53
aWR0aCgpID4gZGVzdFJlY3Qud2lkdGgoKSB8fCBpbWFnZS5oZWlnaHQoKSA+IGRlc3RSZWN0Lmhl
aWdodCgpKSB7Ci0gICAgICAgIEFTU0VSVCgwKTsKLSAgICAgICAgLyoKLSAgICAgICAgZmxvYXQg
ZHBpWCA9IDA7Ci0gICAgICAgIGZsb2F0IGRwaVkgPSAwOwotICAgICAgICB0aWxlSW1hZ2UtPkdl
dERwaSgmZHBpWCwgJmRwaVkpOwotICAgICAgICBhdXRvIGJpdG1hcFByb3BlcnRpZXMgPSBEMkQx
OjpCaXRtYXBQcm9wZXJ0aWVzKHRpbGVJbWFnZS0+R2V0UGl4ZWxGb3JtYXQoKSwgZHBpWCwgZHBp
WSk7Ci0gICAgICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gc3ViSW1hZ2U7Ci0gICAgICAgIEhSRVNV
TFQgaHIgPSBjb250ZXh0LT5DcmVhdGVCaXRtYXAoSW50U2l6ZSh0aWxlUmVjdC5zaXplKCkpLCBi
aXRtYXBQcm9wZXJ0aWVzLCAmc3ViSW1hZ2UpOwotICAgICAgICBpZiAoU1VDQ0VFREVEKGhyKSkg
ewotICAgICAgICAgICAgRDJEMV9SRUNUX1UgZmluaXNoUmVjdCA9IEludFJlY3QodGlsZVJlY3Qp
OwotICAgICAgICAgICAgaHIgPSBzdWJJbWFnZS0+Q29weUZyb21CaXRtYXAobnVsbHB0ciwgdGls
ZUltYWdlLmdldCgpLCAmZmluaXNoUmVjdCk7Ci0gICAgICAgICAgICBpZiAoU1VDQ0VFREVEKGhy
KSkKLSAgICAgICAgICAgICAgICB0aWxlSW1hZ2UgPSBzdWJJbWFnZTsKLSAgICAgICAgfQotICAg
ICAgICAqLwotICAgIH0KLQotICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gYml0bWFwOwotICAgIEhS
RVNVTFQgaHIgPSBjb250ZXh0LT5DcmVhdGVCaXRtYXBGcm9tV2ljQml0bWFwKHRpbGVJbWFnZS5n
ZXQoKSwgbnVsbHB0ciwgJmJpdG1hcCk7Ci0gICAgaWYgKCFTVUNDRUVERUQoaHIpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBDT01QdHI8SUQyRDFCaXRtYXBCcnVzaD4gcGF0dGVybkJydXNoOwot
ICAgIGhyID0gY29udGV4dC0+Q3JlYXRlQml0bWFwQnJ1c2goYml0bWFwLmdldCgpLCAmYml0bWFw
QnJ1c2hQcm9wZXJ0aWVzLCAmYnJ1c2hQcm9wZXJ0aWVzLCAmcGF0dGVybkJydXNoKTsKLSAgICBB
U1NFUlQoU1VDQ0VFREVEKGhyKSk7Ci0gICAgaWYgKCFTVUNDRUVERUQoaHIpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBkcmF3V2l0aG91dFNoYWRvdyhkZXN0UmVjdCwgW3RoaXMsIGRlc3RSZWN0
LCBwYXR0ZXJuQnJ1c2hdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAg
ICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9IGRlc3RSZWN0OwotICAgICAgICByZW5kZXJU
YXJnZXQtPkZpbGxSZWN0YW5nbGUoJmQyZFJlY3QsIHBhdHRlcm5CcnVzaC5nZXQoKSk7Ci0gICAg
fSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBpZiAoYXV0byB0aWxl
SW1hZ2UgPSBpbWFnZS5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpKQorICAgICAgICBEaXJl
Y3QyRDo6ZHJhd1BhdHRlcm4oKnBsYXRmb3JtQ29udGV4dCgpLCB0aWxlSW1hZ2UuZ2V0KCksIElu
dFNpemUoaW1hZ2Uuc2l6ZSgpKSwgZGVzdFJlY3QsIHRpbGVSZWN0LCBwYXR0ZXJuVHJhbnNmb3Jt
LCBwaGFzZSwgY29tcG9zaXRlT3BlcmF0b3IsIGJsZW5kTW9kZSk7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpjbGlwVG9JbWFnZUJ1ZmZlcihJbWFnZUJ1ZmZlciYgYnVmZmVyLCBjb25zdCBG
bG9hdFJlY3QmIGRlc3RSZWN0KQpAQCAtNjYwLDE3MiArNDU1LDYzIEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0OjpkcmF3UmVjdChjb25zdCBGbG8KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAg
IC8vIEZJWE1FOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBwYXR0ZXJucyBhbmQgZ3Jh
ZGllbnRzIGxpa2UgZHJhd1BhdGggZG9lcywgaXQgcHJvYmFibHkgc2hvdWxkLgogICAgIEFTU0VS
VCghcmVjdC5pc0VtcHR5KCkpOwotCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0
KCk7Ci0KLSAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKLQotICAgIGRyYXdXaXRo
b3V0U2hhZG93KHJlY3QsIFt0aGlzLCByZWN0XShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFy
Z2V0KSB7Ci0gICAgICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSByZWN0OwotICAgICAg
ICByZW5kZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUoJmQyZFJlY3QsIHNvbGlkRmlsbEJydXNoKCkp
OwotICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdSZWN0YW5nbGUoJmQyZFJlY3QsIHNvbGlkU3Ry
b2tlQnJ1c2goKSwgc3Ryb2tlVGhpY2tuZXNzKCksIG1fZGF0YS0+c3Ryb2tlU3R5bGUoKSk7Ci0g
ICAgfSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0
ZSA9IHRoaXMtPnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmRyYXdSZWN0KCpwbGF0Zm9ybUNvbnRl
eHQoKSwgcmVjdCwgYm9yZGVyVGhpY2tuZXNzLCBzdGF0ZS5maWxsQ29sb3IsIHN0YXRlLnN0cm9r
ZVN0eWxlLCBzdGF0ZS5zdHJva2VDb2xvcik7CiB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlOjpzZXRMaW5lQ2FwKExpbmVDYXAgY2FwKQordm9pZCBHcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGU6OnNldExpbmVDYXAoTGluZUNhcCkKIHsKLSAgICBpZiAobV9saW5l
Q2FwID09IGNhcCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRDJEMV9DQVBfU1RZTEUgY2FwU3R5
bGUgPSBEMkQxX0NBUF9TVFlMRV9GTEFUOwotICAgIHN3aXRjaCAoY2FwKSB7Ci0gICAgY2FzZSBS
b3VuZENhcDoKLSAgICAgICAgY2FwU3R5bGUgPSBEMkQxX0NBUF9TVFlMRV9ST1VORDsKLSAgICAg
ICAgYnJlYWs7Ci0gICAgY2FzZSBTcXVhcmVDYXA6Ci0gICAgICAgIGNhcFN0eWxlID0gRDJEMV9D
QVBfU1RZTEVfU1FVQVJFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEJ1dHRDYXA6Ci0gICAg
ZGVmYXVsdDoKLSAgICAgICAgY2FwU3R5bGUgPSBEMkQxX0NBUF9TVFlMRV9GTEFUOwotICAgICAg
ICBicmVhazsKLSAgICB9Ci0KLSAgICBtX2xpbmVDYXAgPSBjYXBTdHlsZTsKLSAgICBtX3N0cm9r
ZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGU6OnNldExpbmVKb2luKExpbmVKb2luIGpvaW4pCit2b2lkIEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZTo6c2V0TGluZUpvaW4oTGluZUpvaW4pCiB7Ci0gICAgaWYgKG1fbGluZUpv
aW4gPT0gam9pbikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRDJEMV9MSU5FX0pPSU4gam9pblN0
eWxlID0gRDJEMV9MSU5FX0pPSU5fTUlURVI7Ci0gICAgc3dpdGNoIChqb2luKSB7Ci0gICAgY2Fz
ZSBSb3VuZEpvaW46Ci0gICAgICAgIGpvaW5TdHlsZSA9IEQyRDFfTElORV9KT0lOX1JPVU5EOwot
ICAgICAgICBicmVhazsKLSAgICBjYXNlIEJldmVsSm9pbjoKLSAgICAgICAgam9pblN0eWxlID0g
RDJEMV9MSU5FX0pPSU5fQkVWRUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTWl0ZXJKb2lu
OgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpvaW5TdHlsZSA9IEQyRDFfTElORV9KT0lOX01JVEVS
OwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBtX2xpbmVKb2luID0gam9pblN0eWxlOwot
ICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOwogfQogCi12b2lkIEdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZTo6c2V0U3Ryb2tlU3R5bGUoU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUp
Cit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2V0U3Ryb2tlU3R5bGUoU3Ry
b2tlU3R5bGUpCiB7Ci0gICAgaWYgKG1fc3Ryb2tlU3R5bGUgPT0gc3Ryb2tlU3R5bGUpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIG1fc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZTsKLSAgICBtX3N0
cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGU6OnNldE1pdGVyTGltaXQoZmxvYXQgY2FudmFzTWl0ZXJMaW1pdCkKIHsKLSAgICAv
LyBEaXJlY3QyRCBtaXRlciBsaW1pdCBpcyBpbiB0ZXJtcyBvZiBIQUxGIHRoZSBsaW5lIHRoaWNr
bmVzcy4KLSAgICBmbG9hdCBtaXRlckxpbWl0ID0gMC41ZiAqIGNhbnZhc01pdGVyTGltaXQ7Ci0g
ICAgaWYgKFdURjo6YXJlRXNzZW50aWFsbHlFcXVhbChtaXRlckxpbWl0LCBtX21pdGVyTGltaXQp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX21pdGVyTGltaXQgPSBtaXRlckxpbWl0OwotICAg
IG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworICAgIG1fcGxhdGZvcm1Db250ZXh0LnNldERh
c2hPZmZzZXQoY2FudmFzTWl0ZXJMaW1pdCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlOjpzZXREYXNoT2Zmc2V0KGZsb2F0IGRhc2hPZmZzZXQpCiB7Ci0gICAgaWYg
KFdURjo6YXJlRXNzZW50aWFsbHlFcXVhbChkYXNoT2Zmc2V0LCBtX2Rhc2hPZmZzZXQpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBtX2Rhc2hPZmZzZXQgPSBkYXNoT2Zmc2V0OwotICAgIG1fc3Ry
b2tlU3lsZUlzRGlydHkgPSB0cnVlOworICAgIG1fcGxhdGZvcm1Db250ZXh0LnNldERhc2hPZmZz
ZXQoZGFzaE9mZnNldCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
OjpzZXRQYXR0ZXJuV2lkdGgoZmxvYXQgcGF0dGVybldpZHRoKQogewotICAgIGlmIChXVEY6OmFy
ZUVzc2VudGlhbGx5RXF1YWwocGF0dGVybldpZHRoLCBtX3BhdHRlcm5XaWR0aCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIG1fcGF0dGVybldpZHRoID0gcGF0dGVybldpZHRoOwotICAgIG1fc3Ry
b2tlU3lsZUlzRGlydHkgPSB0cnVlOworICAgIG1fcGxhdGZvcm1Db250ZXh0LnNldFBhdHRlcm5X
aWR0aChwYXR0ZXJuV2lkdGgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6c2V0UGF0dGVybk9mZnNldChmbG9hdCBwYXR0ZXJuT2Zmc2V0KQogewotICAgIGlmIChX
VEY6OmFyZUVzc2VudGlhbGx5RXF1YWwocGF0dGVybk9mZnNldCwgbV9wYXR0ZXJuT2Zmc2V0KSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wYXR0ZXJuT2Zmc2V0ID0gcGF0dGVybk9mZnNldDsK
LSAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKKyAgICBtX3BsYXRmb3JtQ29udGV4dC5z
ZXRQYXR0ZXJuT2Zmc2V0KHBhdHRlcm5PZmZzZXQpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZTo6c2V0U3Ryb2tlVGhpY2tuZXNzKGZsb2F0IHRoaWNrbmVzcykKIHsK
LSAgICBpZiAoV1RGOjphcmVFc3NlbnRpYWxseUVxdWFsKHRoaWNrbmVzcywgbV9zdHJva2VUaGlj
a25lc3MpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3N0cm9rZVRoaWNrbmVzcyA9IHRoaWNr
bmVzczsKLSAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKKyAgICBtX3BsYXRmb3JtQ29u
dGV4dC5zZXRTdHJva2VUaGlja25lc3ModGhpY2tuZXNzKTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGU6OnNldERhc2hlcyhjb25zdCBEYXNoQXJyYXkmIGRhc2hlcykK
IHsKLSAgICBpZiAobV9kYXNoZXMgPT0gZGFzaGVzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBt
X2Rhc2hlcyA9IGRhc2hlczsKLSAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKKyAgICBt
X3BsYXRmb3JtQ29udGV4dC5zZXREYXNoZXMoZGFzaGVzKTsKIH0KIAogRDJEMV9TVFJPS0VfU1RZ
TEVfUFJPUEVSVElFUyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnN0cm9rZVN0eWxl
UHJvcGVydGllcygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIEQyRDE6OlN0cm9rZVN0eWxlUHJvcGVy
dGllcyhtX2xpbmVDYXAsIG1fbGluZUNhcCwgbV9saW5lQ2FwLCBtX2xpbmVKb2luLCBtX21pdGVy
TGltaXQsIEQyRDFfREFTSF9TVFlMRV9TT0xJRCwgMC4wZik7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjpyZWNvbXB1dGVTdHJva2VTdHlsZSgpCi17Ci0gICAgaWYg
KCFtX3N0cm9rZVN5bGVJc0RpcnR5KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2QyZFN0cm9r
ZVN0eWxlID0gbnVsbHB0cjsKLQotICAgIERhc2hBcnJheSBkYXNoZXM7Ci0gICAgZmxvYXQgcGF0
dGVybk9mZnNldCA9IDA7Ci0gICAgYXV0byBkYXNoU3R5bGUgPSBEMkQxX0RBU0hfU1RZTEVfU09M
SUQ7Ci0KLSAgICBpZiAoKG1fc3Ryb2tlU3R5bGUgIT0gU29saWRTdHJva2UpICYmIChtX3N0cm9r
ZVN0eWxlICE9IE5vU3Ryb2tlKSkgewotICAgICAgICBkYXNoU3R5bGUgPSBEMkQxX0RBU0hfU1RZ
TEVfQ1VTVE9NOwotICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0gbV9wYXR0ZXJuT2Zmc2V0IC8gbV9z
dHJva2VUaGlja25lc3M7Ci0gICAgICAgIGRhc2hlcyA9IG1fZGFzaGVzOwotCi0gICAgICAgIC8v
IEluIERpcmVjdDJELCBkYXNoZXMgYW5kIGRvdHMgYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgdGhl
IHJhdGlvIG9mIHRoZSBkYXNoIGxlbmd0aCB0byB0aGUgbGluZSB0aGlja25lc3MuCi0gICAgICAg
IGZvciAoYXV0byYgZGFzaCA6IGRhc2hlcykKLSAgICAgICAgICAgIGRhc2ggLz0gbV9zdHJva2VU
aGlja25lc3M7Ci0gICAgfQotCi0gICAgYXV0byBzdHJva2VTdHlsZVByb3BlcnRpZXMgPSBEMkQx
OjpTdHJva2VTdHlsZVByb3BlcnRpZXMobV9saW5lQ2FwLCBtX2xpbmVDYXAsIG1fbGluZUNhcCwg
bV9saW5lSm9pbiwgbV9taXRlckxpbWl0LCBkYXNoU3R5bGUsIHBhdHRlcm5PZmZzZXQpOwotICAg
IEdyYXBoaWNzQ29udGV4dDo6c3lzdGVtRmFjdG9yeSgpLT5DcmVhdGVTdHJva2VTdHlsZSgmc3Ry
b2tlU3R5bGVQcm9wZXJ0aWVzLCBkYXNoZXMuZGF0YSgpLCBkYXNoZXMuc2l6ZSgpLCAmbV9kMmRT
dHJva2VTdHlsZSk7Ci0KLSAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gZmFsc2U7Ci19Ci0KLUlE
MkQxU3Ryb2tlU3R5bGUqIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c3Ryb2tlU3R5
bGUoKQotewotICAgIHJlY29tcHV0ZVN0cm9rZVN0eWxlKCk7Ci0gICAgcmV0dXJuIG1fZDJkU3Ry
b2tlU3R5bGUuZ2V0KCk7CisgICAgcmV0dXJuIEQyRDE6OlN0cm9rZVN0eWxlUHJvcGVydGllcyht
X3BsYXRmb3JtQ29udGV4dC5tX2xpbmVDYXAsIG1fcGxhdGZvcm1Db250ZXh0Lm1fbGluZUNhcCwg
bV9wbGF0Zm9ybUNvbnRleHQubV9saW5lQ2FwLCBtX3BsYXRmb3JtQ29udGV4dC5tX2xpbmVKb2lu
LCBtX3BsYXRmb3JtQ29udGV4dC5tX21pdGVyTGltaXQsIEQyRDFfREFTSF9TVFlMRV9TT0xJRCwg
MC4wZik7CiB9CiAKIElEMkQxU3Ryb2tlU3R5bGUqIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1T
dHJva2VTdHlsZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fZGF0YS0+c3Ryb2tlU3R5bGUoKTsK
KyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIHJldHVybiBwbGF0Zm9ybUNv
bnRleHQoKS0+c3Ryb2tlU3R5bGUoKTsKIH0KIAogLy8gVGhpcyBpcyBvbmx5IHVzZWQgdG8gZHJh
dyBib3JkZXJzLgpAQCAtODQyLDUyICs1MjgsOSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJh
d0xpbmUoY29uc3QgRmxvCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBmbG9hdCB0aGlj
a25lc3MgPSBzdHJva2VUaGlja25lc3MoKTsKLSAgICBib29sIGlzVmVydGljYWxMaW5lID0gKHBv
aW50MS54KCkgKyB0aGlja25lc3MgPT0gcG9pbnQyLngoKSk7Ci0gICAgZmxvYXQgc3Ryb2tlV2lk
dGggPSBpc1ZlcnRpY2FsTGluZSA/IHBvaW50Mi55KCkgLSBwb2ludDEueSgpIDogcG9pbnQyLngo
KSAtIHBvaW50MS54KCk7Ci0gICAgaWYgKCF0aGlja25lc3MgfHwgIXN0cm9rZVdpZHRoKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLQot
ICAgIFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlID0gdGhpcy0+c3Ryb2tlU3R5bGUoKTsKLSAgICBm
bG9hdCBjb3JuZXJXaWR0aCA9IDA7Ci0gICAgYm9vbCBkcmF3c0Rhc2hlZExpbmUgPSBzdHJva2VT
dHlsZSA9PSBEb3R0ZWRTdHJva2UgfHwgc3Ryb2tlU3R5bGUgPT0gRGFzaGVkU3Ryb2tlOwotCi0g
ICAgQ09NUHRyPElEMkQxU3Ryb2tlU3R5bGU+IGQyZFN0cm9rZVN0eWxlOwotICAgIEQyRENvbnRl
eHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSwgZHJhd3NEYXNoZWRMaW5lKTsKLSAgICBp
ZiAoZHJhd3NEYXNoZWRMaW5lKSB7Ci0gICAgICAgIC8vIEZpZ3VyZSBvdXQgZW5kIHBvaW50cyB0
byBlbnN1cmUgd2UgYWx3YXlzIHBhaW50IGNvcm5lcnMuCi0gICAgICAgIGNvcm5lcldpZHRoID0g
ZGFzaGVkTGluZUNvcm5lcldpZHRoRm9yU3Ryb2tlV2lkdGgoc3Ryb2tlV2lkdGgpOwotICAgICAg
ICBzdHJva2VXaWR0aCAtPSAyICogY29ybmVyV2lkdGg7Ci0gICAgICAgIGZsb2F0IHBhdHRlcm5X
aWR0aCA9IGRhc2hlZExpbmVQYXR0ZXJuV2lkdGhGb3JTdHJva2VXaWR0aChzdHJva2VXaWR0aCk7
Ci0gICAgICAgIC8vIENoZWNrIGlmIGNvcm5lciBkcmF3aW5nIHN1ZmZpY2llbnRseSBjb3ZlcnMg
dGhlIGxpbmUuCi0gICAgICAgIGlmIChzdHJva2VXaWR0aCA8PSBwYXR0ZXJuV2lkdGggKyAxKQot
ICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGZsb2F0IHBhdHRlcm5PZmZzZXQgPSBkYXNo
ZWRMaW5lUGF0dGVybk9mZnNldEZvclBhdHRlcm5BbmRTdHJva2VXaWR0aChwYXR0ZXJuV2lkdGgs
IHN0cm9rZVdpZHRoKTsKLSAgICAgICAgY29uc3QgZmxvYXQgZGFzaGVzWzJdID0geyBwYXR0ZXJu
V2lkdGgsIHBhdHRlcm5XaWR0aCB9OwotICAgICAgICBhdXRvIHN0cm9rZVN0eWxlUHJvcGVydGll
cyA9IG1fZGF0YS0+c3Ryb2tlU3R5bGVQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIEdyYXBoaWNzQ29u
dGV4dDo6c3lzdGVtRmFjdG9yeSgpLT5DcmVhdGVTdHJva2VTdHlsZSgmc3Ryb2tlU3R5bGVQcm9w
ZXJ0aWVzLCBkYXNoZXMsIEFSUkFZU0laRShkYXNoZXMpLCAmZDJkU3Ryb2tlU3R5bGUpOwotCi0g
ICAgICAgIG1fZGF0YS0+c2V0UGF0dGVybldpZHRoKHBhdHRlcm5XaWR0aCk7Ci0gICAgICAgIG1f
ZGF0YS0+c2V0UGF0dGVybk9mZnNldChwYXR0ZXJuT2Zmc2V0KTsKLSAgICAgICAgbV9kYXRhLT5z
ZXREYXNoZXMoRGFzaEFycmF5KDIsIHBhdHRlcm5XaWR0aCkpOwotCi0gICAgICAgIGQyZFN0cm9r
ZVN0eWxlID0gbV9kYXRhLT5zdHJva2VTdHlsZSgpOwotICAgIH0KLQotICAgIGF1dG8gY2VudGVy
ZWRQb2ludHMgPSBjZW50ZXJMaW5lQW5kQ3V0T2ZmQ29ybmVycyhpc1ZlcnRpY2FsTGluZSwgY29y
bmVyV2lkdGgsIHBvaW50MSwgcG9pbnQyKTsKLSAgICBhdXRvIHAxID0gY2VudGVyZWRQb2ludHNb
MF07Ci0gICAgYXV0byBwMiA9IGNlbnRlcmVkUG9pbnRzWzFdOwotCi0gICAgY29udGV4dC0+U2V0
VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAgICBGbG9hdFJlY3QgYm91bmRpbmdSZWN0KHAxLCBwMik7
Ci0KLSAgICBkcmF3V2l0aG91dFNoYWRvdyhib3VuZGluZ1JlY3QsIFt0aGlzLCBwMSwgcDIsIGQy
ZFN0cm9rZVN0eWxlXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAg
IHJlbmRlclRhcmdldC0+RHJhd0xpbmUocDEsIHAyLCBzb2xpZFN0cm9rZUJydXNoKCksIHN0cm9r
ZVRoaWNrbmVzcygpLCBkMmRTdHJva2VTdHlsZS5nZXQoKSk7Ci0gICAgfSk7CisgICAgQVNTRVJU
KGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0ZSA9IHRoaXMtPnN0YXRlKCk7
CisgICAgRGlyZWN0MkQ6OmRyYXdMaW5lKCpwbGF0Zm9ybUNvbnRleHQoKSwgcG9pbnQxLCBwb2lu
dDIsIHN0YXRlLnN0cm9rZVN0eWxlLCBzdGF0ZS5zdHJva2VDb2xvciwgc3RhdGUuc3Ryb2tlVGhp
Y2tuZXNzLCBzdGF0ZS5zaG91bGRBbnRpYWxpYXMpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDo6ZHJhd0VsbGlwc2UoY29uc3QgRmxvYXRSZWN0JiByZWN0KQpAQCAtOTAwLDE3ICs1NDMsMTAg
QEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdFbGxpcHNlKGNvbnN0CiAgICAgICAgIHJldHVy
bjsKICAgICB9CiAKLSAgICBhdXRvIGVsbGlwc2UgPSBEMkQxOjpFbGxpcHNlKHJlY3QuY2VudGVy
KCksIDAuNSAqIHJlY3Qud2lkdGgoKSwgMC41ICogcmVjdC5oZWlnaHQoKSk7CiAKLSAgICBhdXRv
IGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIGNvbnRleHQtPlNldFRhZ3MoMSwg
X19MSU5FX18pOwotCi0gICAgZHJhd1dpdGhvdXRTaGFkb3cocmVjdCwgW3RoaXMsIGVsbGlwc2Vd
KElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgcmVuZGVyVGFyZ2V0
LT5GaWxsRWxsaXBzZSgmZWxsaXBzZSwgc29saWRGaWxsQnJ1c2goKSk7Ci0KLSAgICAgICAgcmVu
ZGVyVGFyZ2V0LT5EcmF3RWxsaXBzZSgmZWxsaXBzZSwgc29saWRTdHJva2VCcnVzaCgpLCBzdHJv
a2VUaGlja25lc3MoKSwgbV9kYXRhLT5zdHJva2VTdHlsZSgpKTsKLSAgICB9KTsKKyAgICBBU1NF
UlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1dG8mIHN0YXRlID0gdGhpcy0+c3RhdGUo
KTsKKyAgICBEaXJlY3QyRDo6ZmlsbEVsbGlwc2UoKnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LCBz
dGF0ZS5maWxsQ29sb3IsIHN0YXRlLnN0cm9rZVN0eWxlLCBzdGF0ZS5zdHJva2VDb2xvciwgc3Rh
dGUuc3Ryb2tlVGhpY2tuZXNzKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmFwcGx5U3Ry
b2tlUGF0dGVybigpCkBAIC05MjIsNyArNTU4LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmFw
cGx5U3Ryb2tlUGF0dGVybgogICAgIEFmZmluZVRyYW5zZm9ybSB1c2VyVG9CYXNlQ1RNOyAvLyBG
SVhNRTogVGhpcyBpc24ndCByZWFsbHkgbmVlZGVkIG9uIFdpbmRvd3MKIAogICAgIGNvbnN0IGZs
b2F0IHBhdHRlcm5BbHBoYSA9IDE7Ci0gICAgbV9kYXRhLT5tX3BhdHRlcm5TdHJva2VCcnVzaCA9
IGFkb3B0Q09NKG1fc3RhdGUuc3Ryb2tlUGF0dGVybi0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKCp0
aGlzLCBwYXR0ZXJuQWxwaGEsIHVzZXJUb0Jhc2VDVE0pKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQo
KS0+bV9wYXR0ZXJuU3Ryb2tlQnJ1c2ggPSBhZG9wdENPTShtX3N0YXRlLnN0cm9rZVBhdHRlcm4t
PmNyZWF0ZVBsYXRmb3JtUGF0dGVybigqdGhpcywgcGF0dGVybkFscGhhLCB1c2VyVG9CYXNlQ1RN
KSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjphcHBseUZpbGxQYXR0ZXJuKCkKQEAgLTkz
NCw3ICs1NzAsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6YXBwbHlGaWxsUGF0dGVybigpCiAg
ICAgQWZmaW5lVHJhbnNmb3JtIHVzZXJUb0Jhc2VDVE07IC8vIEZJWE1FOiBUaGlzIGlzbid0IHJl
YWxseSBuZWVkZWQgb24gV2luZG93cwogCiAgICAgY29uc3QgZmxvYXQgcGF0dGVybkFscGhhID0g
MTsKLSAgICBtX2RhdGEtPm1fcGF0dGVybkZpbGxCcnVzaCA9IGFkb3B0Q09NKG1fc3RhdGUuZmls
bFBhdHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0dGVybigqdGhpcywgcGF0dGVybkFscGhhLCB1c2Vy
VG9CYXNlQ1RNKSk7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPm1fcGF0dGVybkZpbGxCcnVzaCA9
IGFkb3B0Q09NKG1fc3RhdGUuZmlsbFBhdHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0dGVybigqdGhp
cywgcGF0dGVybkFscGhhLCB1c2VyVG9CYXNlQ1RNKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0OjpkcmF3UGF0aChjb25zdCBQYXRoJiBwYXRoKQpAQCAtOTQ3LDEwMiArNTgzLDEwIEBAIHZv
aWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3UGF0aChjb25zdCBQYXQKICAgICAgICAgcmV0dXJuOwog
ICAgIH0KIAotICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotICAgIGNvbnN0
IEdyYXBoaWNzQ29udGV4dFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpZiAoc3RhdGUu
ZmlsbEdyYWRpZW50IHx8IHN0YXRlLnN0cm9rZUdyYWRpZW50KSB7Ci0gICAgICAgIC8vIFdlIGRv
bid0IGhhdmUgYW55IG9wdGltaXplZCB3YXkgdG8gZmlsbCAmIHN0cm9rZSBhIHBhdGggdXNpbmcg
Z3JhZGllbnRzCi0gICAgICAgIC8vIEZJWE1FOiBCZSBzbWFydGVyIGFib3V0IHRoaXMuCi0gICAg
ICAgIGZpbGxQYXRoKHBhdGgpOwotICAgICAgICBzdHJva2VQYXRoKHBhdGgpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHN0YXRlLmZpbGxQYXR0ZXJuKQotICAgICAgICBhcHBs
eUZpbGxQYXR0ZXJuKCk7Ci0KLSAgICBpZiAoc3RhdGUuc3Ryb2tlUGF0dGVybikKLSAgICAgICAg
YXBwbHlTdHJva2VQYXR0ZXJuKCk7Ci0KLSAgICBpZiAocGF0aC5hY3RpdmVQYXRoKCkpCi0gICAg
ICAgIHBhdGguYWN0aXZlUGF0aCgpLT5DbG9zZSgpOwotCi0gICAgY29udGV4dC0+U2V0VGFncygx
LCBfX0xJTkVfXyk7Ci0KLSAgICBhdXRvIHJlY3QgPSBwYXRoLmZhc3RCb3VuZGluZ1JlY3QoKTsK
LSAgICBkcmF3V2l0aG91dFNoYWRvdyhyZWN0LCBbdGhpcywgJnBhdGhdKElEMkQxUmVuZGVyVGFy
Z2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgYXV0byBicnVzaCA9IG1fc3RhdGUuc3Ryb2tl
UGF0dGVybiA/IHBhdHRlcm5TdHJva2VCcnVzaCgpIDogc29saWRTdHJva2VCcnVzaCgpOwotICAg
ICAgICByZW5kZXJUYXJnZXQtPkRyYXdHZW9tZXRyeShwYXRoLnBsYXRmb3JtUGF0aCgpLCBicnVz
aCwgc3Ryb2tlVGhpY2tuZXNzKCksIG1fZGF0YS0+c3Ryb2tlU3R5bGUoKSk7Ci0gICAgfSk7Ci0K
LSAgICBmbHVzaCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1dpdGhvdXRTaGFk
b3coY29uc3QgRmxvYXRSZWN0JiAvKmJvdW5kaW5nUmVjdCovLCBjb25zdCBXVEY6OkZ1bmN0aW9u
PHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4mIGRyYXdDb21tYW5kcykKLXsKLSAgICBkcmF3Q29t
bWFuZHMocGxhdGZvcm1Db250ZXh0KCkpOwotfQotCi1zdGF0aWMgdm9pZCBkcmF3V2l0aFNoYWRv
d0hlbHBlcihJRDJEMVJlbmRlclRhcmdldCogY29udGV4dCwgSUQyRDFCaXRtYXAqIGJpdG1hcCwg
Y29uc3QgQ29sb3ImIHNoYWRvd0NvbG9yLCBjb25zdCBGbG9hdFNpemUmIHNoYWRvd09mZnNldCwg
ZmxvYXQgc2hhZG93Qmx1cikKLXsKLSAgICBDT01QdHI8SUQyRDFEZXZpY2VDb250ZXh0PiBkZXZp
Y2VDb250ZXh0OwotICAgIEhSRVNVTFQgaHIgPSBjb250ZXh0LT5RdWVyeUludGVyZmFjZSgmZGV2
aWNlQ29udGV4dCk7Ci0gICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Ci0KLSAgICAv
LyBDcmVhdGUgdGhlIHNoYWRvdyBlZmZlY3QKLSAgICBDT01QdHI8SUQyRDFFZmZlY3Q+IHNoYWRv
d0VmZmVjdDsKLSAgICBociA9IGRldmljZUNvbnRleHQtPkNyZWF0ZUVmZmVjdChDTFNJRF9EMkQx
U2hhZG93LCAmc2hhZG93RWZmZWN0KTsKLSAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIp
KTsKLQotICAgIHNoYWRvd0VmZmVjdC0+U2V0SW5wdXQoMCwgYml0bWFwKTsKLSAgICBzaGFkb3dF
ZmZlY3QtPlNldFZhbHVlKEQyRDFfU0hBRE9XX1BST1BfQ09MT1IsIHN0YXRpY19jYXN0PEQyRDFf
VkVDVE9SXzRGPihzaGFkb3dDb2xvcikpOwotICAgIHNoYWRvd0VmZmVjdC0+U2V0VmFsdWUoRDJE
MV9TSEFET1dfUFJPUF9CTFVSX1NUQU5EQVJEX0RFVklBVElPTiwgc2hhZG93Qmx1cik7Ci0KLSAg
ICBDT01QdHI8SUQyRDFFZmZlY3Q+IHRyYW5zZm9ybUVmZmVjdDsKLSAgICBociA9IGRldmljZUNv
bnRleHQtPkNyZWF0ZUVmZmVjdChDTFNJRF9EMkQxMkRBZmZpbmVUcmFuc2Zvcm0sICZ0cmFuc2Zv
cm1FZmZlY3QpOwotICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOwotCi0gICAgdHJh
bnNmb3JtRWZmZWN0LT5TZXRJbnB1dEVmZmVjdCgwLCBzaGFkb3dFZmZlY3QuZ2V0KCkpOwotCi0g
ICAgYXV0byB0cmFuc2xhdGlvbiA9IEQyRDE6Ok1hdHJpeDN4MkY6OlRyYW5zbGF0aW9uKHNoYWRv
d09mZnNldC53aWR0aCgpLCBzaGFkb3dPZmZzZXQuaGVpZ2h0KCkpOwotICAgIHRyYW5zZm9ybUVm
ZmVjdC0+U2V0VmFsdWUoRDJEMV8yREFGRklORVRSQU5TRk9STV9QUk9QX1RSQU5TRk9STV9NQVRS
SVgsIHRyYW5zbGF0aW9uKTsKLQotICAgIENPTVB0cjxJRDJEMUVmZmVjdD4gY29tcG9zaXRvcjsK
LSAgICBociA9IGRldmljZUNvbnRleHQtPkNyZWF0ZUVmZmVjdChDTFNJRF9EMkQxQ29tcG9zaXRl
LCAmY29tcG9zaXRvcik7Ci0gICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Ci0KLSAg
ICBjb21wb3NpdG9yLT5TZXRJbnB1dEVmZmVjdCgwLCB0cmFuc2Zvcm1FZmZlY3QuZ2V0KCkpOwot
ICAgIGNvbXBvc2l0b3ItPlNldElucHV0KDEsIGJpdG1hcCk7Ci0KLSAgICAvLyBGbGlwIHRoZSBj
b250ZXh0Ci0gICAgRDJEMV9NQVRSSVhfM1gyX0YgY3RtOwotICAgIGRldmljZUNvbnRleHQtPkdl
dFRyYW5zZm9ybSgmY3RtKTsKLSAgICBhdXRvIHRyYW5zbGF0ZSA9IEQyRDE6Ok1hdHJpeDN4MkY6
OlRyYW5zbGF0aW9uKDAuMGYsIGRldmljZUNvbnRleHQtPkdldFNpemUoKS5oZWlnaHQpOwotICAg
IGF1dG8gZmxpcCA9IEQyRDE6Ok1hdHJpeDN4MkY6OlNjYWxlKEQyRDE6OlNpemVGKDEuMGYsIC0x
LjBmKSk7Ci0gICAgZGV2aWNlQ29udGV4dC0+U2V0VHJhbnNmb3JtKGN0bSAqIGZsaXAgKiB0cmFu
c2xhdGUpOwotCi0gICAgZGV2aWNlQ29udGV4dC0+RHJhd0ltYWdlKGNvbXBvc2l0b3IuZ2V0KCks
IEQyRDFfSU5URVJQT0xBVElPTl9NT0RFX0xJTkVBUik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0OjpkcmF3V2l0aFNoYWRvdyhjb25zdCBGbG9hdFJlY3QmIGJvdW5kaW5nUmVjdCwgY29uc3Qg
V1RGOjpGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+JiBkcmF3Q29tbWFuZHMpCi17
Ci0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0KLSAgICAvLyBSZW5kZXIg
dGhlIGN1cnJlbnQgZ2VvbWV0cnkgdG8gYSBiaXRtYXAgY29udGV4dAotICAgIENPTVB0cjxJRDJE
MUJpdG1hcFJlbmRlclRhcmdldD4gYml0bWFwVGFyZ2V0OwotICAgIEhSRVNVTFQgaHIgPSBjb250
ZXh0LT5DcmVhdGVDb21wYXRpYmxlUmVuZGVyVGFyZ2V0KCZiaXRtYXBUYXJnZXQpOwotICAgIFJF
TEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOwotCi0gICAgYml0bWFwVGFyZ2V0LT5CZWdpbkRy
YXcoKTsKLSAgICBkcmF3Q29tbWFuZHMoYml0bWFwVGFyZ2V0LmdldCgpKTsKLSAgICBociA9IGJp
dG1hcFRhcmdldC0+RW5kRHJhdygpOwotICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikp
OwotCi0gICAgQ09NUHRyPElEMkQxQml0bWFwPiBiaXRtYXA7Ci0gICAgaHIgPSBiaXRtYXBUYXJn
ZXQtPkdldEJpdG1hcCgmYml0bWFwKTsKLSAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIp
KTsKLQotICAgIGRyYXdXaXRoU2hhZG93SGVscGVyKGNvbnRleHQsIGJpdG1hcC5nZXQoKSwgbV9z
dGF0ZS5zaGFkb3dDb2xvciwgbV9zdGF0ZS5zaGFkb3dPZmZzZXQsIG1fc3RhdGUuc2hhZG93Qmx1
cik7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0ZSA9
IHRoaXMtPnN0YXRlKCk7CisgICAgYXV0byYgY29udGV4dCA9ICpwbGF0Zm9ybUNvbnRleHQoKTsK
KyAgICBEaXJlY3QyRDo6ZHJhd1BhdGgoY29udGV4dCwgcGF0aCwgRGlyZWN0MkQ6OlN0cm9rZVNv
dXJjZShzdGF0ZSwgY29udGV4dCksIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0ZSkpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgoY29uc3QgUGF0aCYgcGF0aCkKQEAgLTEw
NTUsNTAgKzU5OSwxMCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgoY29uc3QgUGF0
CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAocGF0aC5hY3RpdmVQYXRoKCkpIHsK
LSAgICAgICAgLy8gTWFrZSBzdXJlIGl0J3MgY2xvc2VkLiBUaGlzIG1pZ2h0IGZhaWwgaWYgdGhl
IHBhdGggd2FzIGFscmVhZHkgY2xvc2VkLCBzbwotICAgICAgICAvLyBpZ25vcmUgdGhlIHJldHVy
biB2YWx1ZS4KLSAgICAgICAgcGF0aC5hY3RpdmVQYXRoKCktPkNsb3NlKCk7Ci0gICAgfQotCi0g
ICAgRDJEQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqbV9kYXRhKTsKLQotICAgIGF1dG8g
Y29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgY29udGV4dC0+U2V0VGFncygxLCBf
X0xJTkVfXyk7Ci0KLSAgICBpZiAobV9zdGF0ZS5maWxsR3JhZGllbnQpIHsKLSAgICAgICAgY29u
dGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAgICAgICAgRmxvYXRSZWN0IGJvdW5kaW5n
UmVjdCA9IHBhdGguZmFzdEJvdW5kaW5nUmVjdCgpOwotICAgICAgICBXVEY6OkZ1bmN0aW9uPHZv
aWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1bmN0aW9uID0gW3RoaXMsICZwYXRoXShJRDJE
MVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAgICAgICByZW5kZXJUYXJnZXQt
PkZpbGxHZW9tZXRyeShwYXRoLnBsYXRmb3JtUGF0aCgpLCBtX3N0YXRlLmZpbGxHcmFkaWVudC0+
Y3JlYXRlUGxhdGZvcm1HcmFkaWVudElmTmVjZXNzYXJ5KHJlbmRlclRhcmdldCkpOwotICAgICAg
ICB9OwotCi0gICAgICAgIGlmIChoYXNTaGFkb3coKSkKLSAgICAgICAgICAgIGRyYXdXaXRoU2hh
ZG93KGJvdW5kaW5nUmVjdCwgZHJhd0Z1bmN0aW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgZHJhd1dpdGhvdXRTaGFkb3coYm91bmRpbmdSZWN0LCBkcmF3RnVuY3Rpb24pOwotCi0gICAg
ICAgIGZsdXNoKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobV9zdGF0ZS5m
aWxsUGF0dGVybikKLSAgICAgICAgYXBwbHlGaWxsUGF0dGVybigpOwotCi0gICAgQ09NUHRyPElE
MkQxR2VvbWV0cnlHcm91cD4gcGF0aFRvRmlsbDsKLSAgICBwYXRoLmNyZWF0ZUdlb21ldHJ5V2l0
aEZpbGxNb2RlKGZpbGxSdWxlKCksIHBhdGhUb0ZpbGwpOwotCi0gICAgY29udGV4dC0+U2V0VGFn
cygxLCBfX0xJTkVfXyk7Ci0KLSAgICBGbG9hdFJlY3QgY29udGV4dFJlY3QoRmxvYXRQb2ludCgp
LCBjb250ZXh0LT5HZXRTaXplKCkpOwotICAgIGRyYXdXaXRob3V0U2hhZG93KGNvbnRleHRSZWN0
LCBbdGhpcywgJnBhdGhUb0ZpbGxdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsK
LSAgICAgICAgYXV0byBicnVzaCA9IG1fc3RhdGUuZmlsbFBhdHRlcm4gPyBwYXR0ZXJuRmlsbEJy
dXNoKCkgOiBzb2xpZEZpbGxCcnVzaCgpOwotICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxHZW9t
ZXRyeShwYXRoVG9GaWxsLmdldCgpLCBicnVzaCk7Ci0gICAgfSk7Ci0KLSAgICBmbHVzaCgpOwor
ICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgYXV0byYgc3RhdGUgPSB0aGlz
LT5zdGF0ZSgpOworICAgIGF1dG8mIGNvbnRleHQgPSAqcGxhdGZvcm1Db250ZXh0KCk7CisgICAg
RGlyZWN0MkQ6OmZpbGxQYXRoKGNvbnRleHQsIHBhdGgsIERpcmVjdDJEOjpGaWxsU291cmNlKHN0
YXRlLCBjb250ZXh0KSwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0YXRlKSk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCkBAIC0xMTExLDQw
ICs2MTUsMTAgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVBhdGgoY29uc3QgUAogICAg
ICAgICByZXR1cm47CiAgICAgfQogCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0
KCk7Ci0gICAgCi0gICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAgICBpZiAo
bV9zdGF0ZS5zdHJva2VHcmFkaWVudCkgewotICAgICAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9f
TElORV9fKTsKLQotICAgICAgICBEMkRDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCptX2Rh
dGEpOwotICAgICAgICBhdXRvIGJvdW5kaW5nUmVjdCA9IHBhdGguZmFzdEJvdW5kaW5nUmVjdCgp
OwotICAgICAgICBXVEY6OkZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1
bmN0aW9uID0gW3RoaXMsICZwYXRoXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7
Ci0gICAgICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdHZW9tZXRyeShwYXRoLnBsYXRmb3JtUGF0
aCgpLCBtX3N0YXRlLnN0cm9rZUdyYWRpZW50LT5jcmVhdGVQbGF0Zm9ybUdyYWRpZW50SWZOZWNl
c3NhcnkocmVuZGVyVGFyZ2V0KSk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgKGhhc1NoYWRv
dygpKQotICAgICAgICAgICAgZHJhd1dpdGhTaGFkb3coYm91bmRpbmdSZWN0LCBkcmF3RnVuY3Rp
b24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkcmF3V2l0aG91dFNoYWRvdyhib3VuZGlu
Z1JlY3QsIGRyYXdGdW5jdGlvbik7Ci0KLSAgICAgICAgZmx1c2goKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIGlmIChtX3N0YXRlLnN0cm9rZVBhdHRlcm4pCi0gICAgICAgIGFwcGx5
U3Ryb2tlUGF0dGVybigpOwotCi0gICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0K
LSAgICBGbG9hdFJlY3QgY29udGV4dFJlY3QoRmxvYXRQb2ludCgpLCBjb250ZXh0LT5HZXRTaXpl
KCkpOwotICAgIGRyYXdXaXRob3V0U2hhZG93KGNvbnRleHRSZWN0LCBbdGhpcywgJnBhdGhdKElE
MkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgYXV0byBicnVzaCA9IG1f
c3RhdGUuc3Ryb2tlUGF0dGVybiA/IHBhdHRlcm5TdHJva2VCcnVzaCgpIDogc29saWRTdHJva2VC
cnVzaCgpOwotICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdHZW9tZXRyeShwYXRoLnBsYXRmb3Jt
UGF0aCgpLCBicnVzaCwgc3Ryb2tlVGhpY2tuZXNzKCksIG1fZGF0YS0+c3Ryb2tlU3R5bGUoKSk7
Ci0gICAgfSk7Ci0KLSAgICBmbHVzaCgpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQo
KSk7CisgICAgYXV0byYgc3RhdGUgPSB0aGlzLT5zdGF0ZSgpOworICAgIGF1dG8mIGNvbnRleHQg
PSAqcGxhdGZvcm1Db250ZXh0KCk7CisgICAgRGlyZWN0MkQ6OnN0cm9rZVBhdGgoY29udGV4dCwg
cGF0aCwgRGlyZWN0MkQ6OlN0cm9rZVNvdXJjZShzdGF0ZSwgY29udGV4dCksIERpcmVjdDJEOjpT
aGFkb3dTdGF0ZShzdGF0ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3Qo
Y29uc3QgRmxvYXRSZWN0JiByZWN0KQpAQCAtMTE1Nyw0MSArNjMxLDEwIEBAIHZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG8KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAot
ICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgaWYgKG1fc3RhdGUu
ZmlsbEdyYWRpZW50KSB7Ci0gICAgICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwot
ICAgICAgICBEMkRDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCptX2RhdGEpOwotICAgICAg
ICBXVEY6OkZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1bmN0aW9uID0g
W3RoaXMsIHJlY3RdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAg
ICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSByZWN0OwotICAgICAgICAgICAgcmVuZGVy
VGFyZ2V0LT5GaWxsUmVjdGFuZ2xlKCZkMmRSZWN0LCBtX3N0YXRlLmZpbGxHcmFkaWVudC0+Y3Jl
YXRlUGxhdGZvcm1HcmFkaWVudElmTmVjZXNzYXJ5KHJlbmRlclRhcmdldCkpOwotICAgICAgICB9
OwotCi0gICAgICAgIGlmIChoYXNTaGFkb3coKSkKLSAgICAgICAgICAgIGRyYXdXaXRoU2hhZG93
KHJlY3QsIGRyYXdGdW5jdGlvbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRyYXdXaXRo
b3V0U2hhZG93KHJlY3QsIGRyYXdGdW5jdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBpZiAobV9zdGF0ZS5maWxsUGF0dGVybikKLSAgICAgICAgYXBwbHlGaWxsUGF0dGVybigp
OwotCi0gICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAgICBib29sIGRyYXdP
d25TaGFkb3cgPSAhaXNBY2NlbGVyYXRlZENvbnRleHQoKSAmJiBoYXNCbHVycmVkU2hhZG93KCkg
JiYgIW1fc3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXM7IC8vIERvbid0IHVzZSBTaGFkb3dC
bHVyIGZvciBjYW52YXMgeWV0LgotICAgIGlmIChkcmF3T3duU2hhZG93KSB7Ci0gICAgICAgIC8v
IEZJWE1FOiBHZXQgU2hhZG93Qmx1ciB3b3JraW5nIG9uIERpcmVjdDJECi0gICAgICAgIC8vIFNo
YWRvd0JsdXIgY29udGV4dFNoYWRvdyhtX3N0YXRlKTsKLSAgICAgICAgLy8gY29udGV4dFNoYWRv
dy5kcmF3UmVjdFNoYWRvdygqdGhpcywgRmxvYXRSb3VuZGVkUmVjdChyZWN0KSk7Ci0gICAgICAg
IG5vdEltcGxlbWVudGVkKCk7Ci0gICAgfQotCi0gICAgZHJhd1dpdGhvdXRTaGFkb3cocmVjdCwg
W3RoaXMsIHJlY3RdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAg
Y29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9IHJlY3Q7Ci0gICAgICAgIGF1dG8gYnJ1c2ggPSBt
X3N0YXRlLmZpbGxQYXR0ZXJuID8gcGF0dGVybkZpbGxCcnVzaCgpIDogc29saWRGaWxsQnJ1c2go
KTsKLSAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsUmVjdGFuZ2xlKCZkMmRSZWN0LCBicnVzaCk7
Ci0gICAgfSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBz
dGF0ZSA9IHRoaXMtPnN0YXRlKCk7CisgICAgYXV0byYgY29udGV4dCA9ICpwbGF0Zm9ybUNvbnRl
eHQoKTsKKyAgICBEaXJlY3QyRDo6ZmlsbFJlY3QoY29udGV4dCwgcmVjdCwgRGlyZWN0MkQ6OkZp
bGxTb3VyY2Uoc3RhdGUsIGNvbnRleHQpLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoc3RhdGUpKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVj
dCwgY29uc3QgQ29sb3ImIGNvbG9yKQpAQCAtMTIwNCwyMiArNjQ3LDEwIEBAIHZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG8KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAot
ICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgYm9vbCBkcmF3T3du
U2hhZG93ID0gIWlzQWNjZWxlcmF0ZWRDb250ZXh0KCkgJiYgaGFzQmx1cnJlZFNoYWRvdygpICYm
ICFtX3N0YXRlLnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zOyAvLyBEb24ndCB1c2UgU2hhZG93Qmx1
ciBmb3IgY2FudmFzIHlldC4KLSAgICBpZiAoZHJhd093blNoYWRvdykgewotICAgICAgICAvLyBG
SVhNRTogR2V0IFNoYWRvd0JsdXIgd29ya2luZyBvbiBEaXJlY3QyRAotICAgICAgICAvLyBTaGFk
b3dCbHVyIGNvbnRleHRTaGFkb3cobV9zdGF0ZSk7Ci0gICAgICAgIC8vIGNvbnRleHRTaGFkb3cu
ZHJhd1JlY3RTaGFkb3coKnRoaXMsIEZsb2F0Um91bmRlZFJlY3QocmVjdCkpOwotICAgICAgICBu
b3RJbXBsZW1lbnRlZCgpOwotICAgIH0KLQotICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5F
X18pOwotCi0gICAgZHJhd1dpdGhvdXRTaGFkb3cocmVjdCwgW3RoaXMsIHJlY3QsIGNvbG9yXShJ
RDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAgIGNvbnN0IEQyRDFfUkVD
VF9GIGQyZFJlY3QgPSByZWN0OwotICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUo
JmQyZFJlY3QsIGJydXNoV2l0aENvbG9yKGNvbG9yKSk7Ci0gICAgfSk7CisgICAgQVNTRVJUKGhh
c1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0ZSA9IHRoaXMtPnN0YXRlKCk7Cisg
ICAgYXV0byYgY29udGV4dCA9ICpwbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBEaXJlY3QyRDo6Zmls
bFJlY3QoY29udGV4dCwgcmVjdCwgY29sb3IsIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0ZSkp
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1GaWxsUm91bmRlZFJlY3QoY29u
c3QgRmxvYXRSb3VuZGVkUmVjdCYgcmVjdCwgY29uc3QgQ29sb3ImIGNvbG9yKQpAQCAtMTIyOSwz
OCArNjYwLDkgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtRmlsbFJvdW5kZQogCiAg
ICAgQVNTRVJUKCFtX2ltcGwpOwogCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0
KCk7Ci0KLSAgICBib29sIGRyYXdPd25TaGFkb3cgPSAhaXNBY2NlbGVyYXRlZENvbnRleHQoKSAm
JiBoYXNCbHVycmVkU2hhZG93KCkgJiYgIW1fc3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXM7
IC8vIERvbid0IHVzZSBTaGFkb3dCbHVyIGZvciBjYW52YXMgeWV0LgotICAgIEQyRENvbnRleHRT
dGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSwgZHJhd093blNoYWRvdyk7Ci0gICAgaWYgKGRy
YXdPd25TaGFkb3cpIHsKLSAgICAgICAgLy8gRklYTUU6IEdldCBTaGFkb3dCbHVyIHdvcmtpbmcg
b24gRGlyZWN0MkQKLSAgICAgICAgLy8gU2hhZG93Qmx1ciBjb250ZXh0U2hhZG93KG1fc3RhdGUp
OwotICAgICAgICAvLyBjb250ZXh0U2hhZG93LmRyYXdSZWN0U2hhZG93KCp0aGlzLCByZWN0KTsK
LSAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICB9Ci0KLSAgICBjb250ZXh0LT5TZXRUYWdz
KDEsIF9fTElORV9fKTsKLQotICAgIGNvbnN0IEZsb2F0UmVjdCYgciA9IHJlY3QucmVjdCgpOwot
ICAgIGNvbnN0IEZsb2F0Um91bmRlZFJlY3Q6OlJhZGlpJiByYWRpaSA9IHJlY3QucmFkaWkoKTsK
LSAgICBib29sIGVxdWFsV2lkdGhzID0gKHJhZGlpLnRvcExlZnQoKS53aWR0aCgpID09IHJhZGlp
LnRvcFJpZ2h0KCkud2lkdGgoKSAmJiByYWRpaS50b3BSaWdodCgpLndpZHRoKCkgPT0gcmFkaWku
Ym90dG9tTGVmdCgpLndpZHRoKCkgJiYgcmFkaWkuYm90dG9tTGVmdCgpLndpZHRoKCkgPT0gcmFk
aWkuYm90dG9tUmlnaHQoKS53aWR0aCgpKTsKLSAgICBib29sIGVxdWFsSGVpZ2h0cyA9IChyYWRp
aS50b3BMZWZ0KCkuaGVpZ2h0KCkgPT0gcmFkaWkuYm90dG9tTGVmdCgpLmhlaWdodCgpICYmIHJh
ZGlpLmJvdHRvbUxlZnQoKS5oZWlnaHQoKSA9PSByYWRpaS50b3BSaWdodCgpLmhlaWdodCgpICYm
IHJhZGlpLnRvcFJpZ2h0KCkuaGVpZ2h0KCkgPT0gcmFkaWkuYm90dG9tUmlnaHQoKS5oZWlnaHQo
KSk7Ci0gICAgYm9vbCBoYXNDdXN0b21GaWxsID0gbV9zdGF0ZS5maWxsR3JhZGllbnQgfHwgbV9z
dGF0ZS5maWxsUGF0dGVybjsKLSAgICBpZiAoIWhhc0N1c3RvbUZpbGwgJiYgZXF1YWxXaWR0aHMg
JiYgZXF1YWxIZWlnaHRzICYmIHJhZGlpLnRvcExlZnQoKS53aWR0aCgpICogMiA9PSByLndpZHRo
KCkgJiYgcmFkaWkudG9wTGVmdCgpLmhlaWdodCgpICogMiA9PSByLmhlaWdodCgpKSB7Ci0gICAg
ICAgIGF1dG8gcm91bmRlZFJlY3QgPSBEMkQxOjpSb3VuZGVkUmVjdChyLCByYWRpaS50b3BMZWZ0
KCkud2lkdGgoKSwgcmFkaWkudG9wTGVmdCgpLmhlaWdodCgpKTsKLSAgICAgICAgY29udGV4dC0+
RmlsbFJvdW5kZWRSZWN0YW5nbGUocm91bmRlZFJlY3QsIGJydXNoV2l0aENvbG9yKGNvbG9yKSk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRDJEQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigq
bV9kYXRhKTsKLSAgICAgICAgc2V0RmlsbENvbG9yKGNvbG9yKTsKLQotICAgICAgICBQYXRoIHBh
dGg7Ci0gICAgICAgIHBhdGguYWRkUm91bmRlZFJlY3QocmVjdCk7Ci0gICAgICAgIGZpbGxQYXRo
KHBhdGgpOwotICAgIH0KLQotICAgIGlmIChkcmF3T3duU2hhZG93KQotICAgICAgICBzdGF0ZVNh
dmVyLnJlc3RvcmUoKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1
dG8mIHN0YXRlID0gdGhpcy0+c3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZmlsbFJvdW5kZWRSZWN0
KCpwbGF0Zm9ybUNvbnRleHQoKSwgcmVjdCwgY29sb3IsIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShz
dGF0ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3RXaXRoUm91bmRlZEhv
bGUoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiByb3VuZGVk
SG9sZVJlY3QsIGNvbnN0IENvbG9yJiBjb2xvcikKQEAgLTEyNzMsNDEgKzY3NSwxMCBAQCB2b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3RXaXRoUm91bmRlCiAgICAgICAgIHJldHVybjsKICAg
ICB9CiAKLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIGNvbnRl
eHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotCi0gICAgUGF0aCBwYXRoOwotICAgIHBhdGguYWRk
UmVjdChyZWN0KTsKLQotICAgIGlmICghcm91bmRlZEhvbGVSZWN0LnJhZGlpKCkuaXNaZXJvKCkp
Ci0gICAgICAgIHBhdGguYWRkUm91bmRlZFJlY3Qocm91bmRlZEhvbGVSZWN0KTsKLSAgICBlbHNl
Ci0gICAgICAgIHBhdGguYWRkUmVjdChyb3VuZGVkSG9sZVJlY3QucmVjdCgpKTsKLQotICAgIFdp
bmRSdWxlIG9sZEZpbGxSdWxlID0gZmlsbFJ1bGUoKTsKLSAgICBDb2xvciBvbGRGaWxsQ29sb3Ig
PSBmaWxsQ29sb3IoKTsKLQotICAgIHNldEZpbGxSdWxlKFdpbmRSdWxlOjpFdmVuT2RkKTsKLSAg
ICBzZXRGaWxsQ29sb3IoY29sb3IpOwotCi0gICAgLy8gZmlsbFJlY3RXaXRoUm91bmRlZEhvbGUo
KSBhc3N1bWVzIHRoYXQgdGhlIGVkZ2VzIG9mIHJlY3QgYXJlIGNsaXBwZWQgb3V0LCBzbyB3ZSBv
bmx5IGNhcmUgYWJvdXQgc2hhZG93cyBjYXN0IGFyb3VuZCBpbnNpZGUgdGhlIGhvbGUuCi0gICAg
Ym9vbCBkcmF3T3duU2hhZG93ID0gIWlzQWNjZWxlcmF0ZWRDb250ZXh0KCkgJiYgaGFzQmx1cnJl
ZFNoYWRvdygpICYmICFtX3N0YXRlLnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zOwotICAgIEQyRENv
bnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSwgZHJhd093blNoYWRvdyk7Ci0gICAg
aWYgKGRyYXdPd25TaGFkb3cpIHsKLSAgICAgICAgLy8gRklYTUU6IEdldCBTaGFkb3dCbHVyIHdv
cmtpbmcgb24gRGlyZWN0MkQKLSAgICAgICAgLy8gU2hhZG93Qmx1ciBjb250ZXh0U2hhZG93KG1f
c3RhdGUpOwotICAgICAgICAvLyBjb250ZXh0U2hhZG93LmRyYXdSZWN0U2hhZG93KCp0aGlzLCBy
ZWN0KTsKLSAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICB9Ci0KLSAgICBmaWxsUGF0aChw
YXRoKTsKLQotICAgIGlmIChkcmF3T3duU2hhZG93KQotICAgICAgICBzdGF0ZVNhdmVyLnJlc3Rv
cmUoKTsKLQotICAgIHNldEZpbGxSdWxlKG9sZEZpbGxSdWxlKTsKLSAgICBzZXRGaWxsQ29sb3Io
b2xkRmlsbENvbG9yKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1
dG8mIHN0YXRlID0gdGhpcy0+c3RhdGUoKTsKKyAgICBhdXRvJiBjb250ZXh0ID0gKnBsYXRmb3Jt
Q29udGV4dCgpOworICAgIERpcmVjdDJEOjpmaWxsUmVjdFdpdGhSb3VuZGVkSG9sZShjb250ZXh0
LCByZWN0LCByb3VuZGVkSG9sZVJlY3QsIERpcmVjdDJEOjpGaWxsU291cmNlKHN0YXRlLCBjb250
ZXh0KSwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0YXRlKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0OjpjbGlwKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKQEAgLTEzMjAsNyArNjkxLDggQEAg
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3QgRmxvYXRSZQogICAgICAgICByZXR1cm47
CiAgICAgfQogCi0gICAgbV9kYXRhLT5jbGlwKHJlY3QpOworICAgIEFTU0VSVChoYXNQbGF0Zm9y
bUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OmNsaXAoKnBsYXRmb3JtQ29udGV4dCgpLCByZWN0
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQoY29uc3QgRmxvYXRSZWN0JiBy
ZWN0KQpAQCAtMTMzMywxMCArNzA1LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQo
Y29uc3QgRmxvYQogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgUGF0aCBwYXRoOwotICAg
IHBhdGguYWRkUmVjdChyZWN0KTsKLQotICAgIGNsaXBPdXQocGF0aCk7CisgICAgQVNTRVJUKGhh
c1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6Y2xpcE91dCgqcGxhdGZvcm1Db250
ZXh0KCksIHJlY3QpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQ
YXRoJiBwYXRoKQpAQCAtMTM0OSwxOSArNzE5LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
aXBPdXQoY29uc3QgUGF0aAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gVG8gY2xp
cCBPdXQgd2UgbmVlZCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBpbmZpbml0ZQotICAgIC8vIGNs
aXBwaW5nIHJlY3QgYW5kIHRoZSBwYXRoIHdlIGp1c3QgY3JlYXRlZC4KLSAgICBEMkQxX1NJWkVf
RiByZW5kZXJlclNpemUgPSBwbGF0Zm9ybUNvbnRleHQoKS0+R2V0U2l6ZSgpOwotICAgIEZsb2F0
UmVjdCBjbGlwQm91bmRzKDAsIDAsIHJlbmRlcmVyU2l6ZS53aWR0aCwgcmVuZGVyZXJTaXplLmhl
aWdodCk7Ci0KLSAgICBQYXRoIGJvdW5kaW5nUmVjdDsKLSAgICBib3VuZGluZ1JlY3QuYWRkUmVj
dChjbGlwQm91bmRzKTsKLSAgICBib3VuZGluZ1JlY3QuYXBwZW5kR2VvbWV0cnkocGF0aC5wbGF0
Zm9ybVBhdGgoKSk7Ci0KLSAgICBDT01QdHI8SUQyRDFHZW9tZXRyeUdyb3VwPiBwYXRoVG9DbGlw
OwotICAgIGJvdW5kaW5nUmVjdC5jcmVhdGVHZW9tZXRyeVdpdGhGaWxsTW9kZShXaW5kUnVsZTo6
RXZlbk9kZCwgcGF0aFRvQ2xpcCk7Ci0KLSAgICBtX2RhdGEtPmNsaXAocGF0aFRvQ2xpcC5nZXQo
KSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6Y2xp
cE91dCgqcGxhdGZvcm1Db250ZXh0KCksIHBhdGgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDo6Y2xpcFBhdGgoY29uc3QgUGF0aCYgcGF0aCwgV2luZFJ1bGUgY2xpcFJ1bGUpCkBAIC0xMzc0
LDE4ICs3MzMsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFBhdGgoY29uc3QgUGF0CiAg
ICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRl
eHQoKTsKLSAgICBpZiAocGF0aC5pc0VtcHR5KCkpIHsKLSAgICAgICAgbV9kYXRhLT5jbGlwKEZs
b2F0UmVjdCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFTU0VSVCghcGF0aC5h
Y3RpdmVQYXRoKCkpOwotCi0gICAgQ09NUHRyPElEMkQxR2VvbWV0cnlHcm91cD4gcGF0aFRvQ2xp
cDsKLSAgICBwYXRoLmNyZWF0ZUdlb21ldHJ5V2l0aEZpbGxNb2RlKGNsaXBSdWxlLCBwYXRoVG9D
bGlwKTsKLQotICAgIG1fZGF0YS0+Y2xpcChwYXRoVG9DbGlwLmdldCgpKTsKKyAgICBBU1NFUlQo
aGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpjbGlwUGF0aCgqcGxhdGZvcm1D
b250ZXh0KCksIHBhdGgsIGNsaXBSdWxlKTsKIH0KIAogSW50UmVjdCBHcmFwaGljc0NvbnRleHQ6
OmNsaXBCb3VuZHMoKSBjb25zdApAQCAtMTM5MywzMyArNzQyLDE1IEBAIEludFJlY3QgR3JhcGhp
Y3NDb250ZXh0OjpjbGlwQm91bmRzKCkgY28KICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQog
ICAgICAgICByZXR1cm4gSW50UmVjdCgpOwogCi0gICAgaWYgKG1faW1wbCkgewotICAgICAgICBX
VEZMb2dBbHdheXMoIkdldHRpbmcgdGhlIGNsaXAgYm91bmRzIG5vdCB5ZXQgc3VwcG9ydGVkIHdp
dGggZGlzcGxheSBsaXN0cyIpOwotICAgICAgICByZXR1cm4gSW50UmVjdCgtMjA0OCwgLTIwNDgs
IDQwOTYsIDQwOTYpOyAvLyBGSVhNRTogZGlzcGxheSBsaXN0cy4KLSAgICB9Ci0KLSAgICBEMkQx
X1NJWkVfRiBjbGlwU2l6ZTsKLSAgICBpZiAoYXV0byBjbGlwTGF5ZXIgPSBtX2RhdGEtPmNsaXBM
YXllcigpKQotICAgICAgICBjbGlwU2l6ZSA9IGNsaXBMYXllci0+R2V0U2l6ZSgpOwotICAgIGVs
c2UKLSAgICAgICAgY2xpcFNpemUgPSBwbGF0Zm9ybUNvbnRleHQoKS0+R2V0U2l6ZSgpOwotCi0g
ICAgRmxvYXRSZWN0IGNsaXBCb3VuZHMoSW50UG9pbnQoKSwgY2xpcFNpemUpOworICAgIGlmICht
X2ltcGwpCisgICAgICAgIHJldHVybiBtX2ltcGwtPmNsaXBCb3VuZHMoKTsKIAotICAgIHJldHVy
biBlbmNsb3NpbmdJbnRSZWN0KGNsaXBCb3VuZHMpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNv
bnRleHQoKSk7CisgICAgcmV0dXJuIERpcmVjdDJEOjpTdGF0ZTo6Z2V0Q2xpcEJvdW5kcygqcGxh
dGZvcm1Db250ZXh0KCkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZTo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9hdCBvcGFjaXR5KQogewotICAgIFRyYW5zcGFy
ZW5jeUxheWVyU3RhdGUgdHJhbnNwYXJlbmN5TGF5ZXI7Ci0gICAgdHJhbnNwYXJlbmN5TGF5ZXIu
b3BhY2l0eSA9IG9wYWNpdHk7Ci0KLSAgICBIUkVTVUxUIGhyID0gbV9yZW5kZXJUYXJnZXQtPkNy
ZWF0ZUNvbXBhdGlibGVSZW5kZXJUYXJnZXQoJnRyYW5zcGFyZW5jeUxheWVyLnJlbmRlclRhcmdl
dCk7Ci0gICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Ci0gICAgbV90cmFuc3BhcmVu
Y3lMYXllclN0YWNrLmFwcGVuZChXVEZNb3ZlKHRyYW5zcGFyZW5jeUxheWVyKSk7Ci0KLSAgICBt
X3RyYW5zcGFyZW5jeUxheWVyU3RhY2subGFzdCgpLnJlbmRlclRhcmdldC0+QmVnaW5EcmF3KCk7
Ci0gICAgbV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmxhc3QoKS5yZW5kZXJUYXJnZXQtPkNsZWFy
KEQyRDE6OkNvbG9yRigwLCAwLCAwLCAwKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpi
ZWdpblBsYXRmb3JtVHJhbnNwYXJlbmN5TGF5ZXIoZmxvYXQgb3BhY2l0eSkKQEAgLTE0MzMsMzgg
Kzc2NCwxMiBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5QbGF0Zm9ybVRyYW5zCiAKICAg
ICBtX3N0YXRlLmFscGhhID0gb3BhY2l0eTsKIAotICAgIG1fZGF0YS0+YmVnaW5UcmFuc3BhcmVu
Y3lMYXllcihvcGFjaXR5KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAg
IERpcmVjdDJEOjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKCpwbGF0Zm9ybUNvbnRleHQoKSwgb3Bh
Y2l0eSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjplbmRUcmFu
c3BhcmVuY3lMYXllcigpCiB7Ci0gICAgYXV0byBjdXJyZW50TGF5ZXIgPSBtX3RyYW5zcGFyZW5j
eUxheWVyU3RhY2sudGFrZUxhc3QoKTsKLSAgICBhdXRvIHJlbmRlclRhcmdldCA9IGN1cnJlbnRM
YXllci5yZW5kZXJUYXJnZXQ7Ci0gICAgaWYgKCFyZW5kZXJUYXJnZXQpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIEhSRVNVTFQgaHIgPSByZW5kZXJUYXJnZXQtPkVuZERyYXcoKTsKLSAgICBSRUxF
QVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKLQotICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gYml0
bWFwOwotICAgIGhyID0gcmVuZGVyVGFyZ2V0LT5HZXRCaXRtYXAoJmJpdG1hcCk7Ci0gICAgUkVM
RUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Ci0KLSAgICBhdXRvIGNvbnRleHQgPSB0aGlzLT5y
ZW5kZXJUYXJnZXQoKTsKLQotICAgIGlmIChjdXJyZW50TGF5ZXIuaGFzU2hhZG93KQotICAgICAg
ICBkcmF3V2l0aFNoYWRvd0hlbHBlcihjb250ZXh0LCBiaXRtYXAuZ2V0KCksIGN1cnJlbnRMYXll
ci5zaGFkb3dDb2xvciwgY3VycmVudExheWVyLnNoYWRvd09mZnNldCwgY3VycmVudExheWVyLnNo
YWRvd0JsdXIpOwotICAgIGVsc2UgewotICAgICAgICBDT01QdHI8SUQyRDFCaXRtYXBCcnVzaD4g
Yml0bWFwQnJ1c2g7Ci0gICAgICAgIGF1dG8gYml0bWFwQnJ1c2hQcm9wZXJ0aWVzID0gRDJEMTo6
Qml0bWFwQnJ1c2hQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGF1dG8gYnJ1c2hQcm9wZXJ0aWVzID0g
RDJEMTo6QnJ1c2hQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIEhSRVNVTFQgaHIgPSBjb250ZXh0LT5D
cmVhdGVCaXRtYXBCcnVzaChiaXRtYXAuZ2V0KCksIGJpdG1hcEJydXNoUHJvcGVydGllcywgYnJ1
c2hQcm9wZXJ0aWVzLCAmYml0bWFwQnJ1c2gpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVChTVUND
RUVERUQoaHIpKTsKLQotICAgICAgICBhdXRvIHNpemUgPSBiaXRtYXAtPkdldFNpemUoKTsKLSAg
ICAgICAgYXV0byByZWN0SW5ESVAgPSBEMkQxOjpSZWN0RigwLCAwLCBzaXplLndpZHRoLCBzaXpl
LmhlaWdodCk7Ci0gICAgICAgIGNvbnRleHQtPkZpbGxSZWN0YW5nbGUocmVjdEluRElQLCBiaXRt
YXBCcnVzaC5nZXQoKSk7Ci0gICAgfQogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZW5kUGxh
dGZvcm1UcmFuc3BhcmVuY3lMYXllcigpCkBAIC0xNDcyLDcgKzc3Nyw4IEBAIHZvaWQgR3JhcGhp
Y3NDb250ZXh0OjplbmRQbGF0Zm9ybVRyYW5zcGEKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQogICAgICAgICByZXR1cm47CiAKLSAgICBtX2RhdGEtPmVuZFRyYW5zcGFyZW5jeUxheWVyKCk7
CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6ZW5kVHJh
bnNwYXJlbmN5TGF5ZXIoKnBsYXRmb3JtQ29udGV4dCgpKTsKIAogICAgIEFTU0VSVCghbV9pbXBs
KTsKIApAQCAtMTUwNiw3ICs4MTIsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZv
cm1TdHJva2VTCiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAgICAgcmV0dXJuOwog
Ci0gICAgbV9kYXRhLT5zZXRTdHJva2VTdHlsZShzdHlsZSk7CisgICAgQVNTRVJUKGhhc1BsYXRm
b3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6U3RhdGU6OnNldFN0cm9rZVN0eWxlKCpwbGF0
Zm9ybUNvbnRleHQoKSwgc3R5bGUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TWl0
ZXJMaW1pdChmbG9hdCBsaW1pdCkKQEAgLTE1MjAsNyArODI3LDggQEAgdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnNldE1pdGVyTGltaXQoZmxvYQogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAg
bV9kYXRhLT5zZXRNaXRlckxpbWl0KGxpbWl0KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250
ZXh0KCkpOworICAgIERpcmVjdDJEOjpzZXRNaXRlckxpbWl0KCpwbGF0Zm9ybUNvbnRleHQoKSwg
bGltaXQpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJSZWN0KGNvbnN0IEZsb2F0
UmVjdCYgcmVjdCkKQEAgLTE1MzMsMjMgKzg0MSw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpj
bGVhclJlY3QoY29uc3QgRmwKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGRyYXdXaXRo
b3V0U2hhZG93KHJlY3QsIFt0aGlzLCByZWN0XShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFy
Z2V0KSB7Ci0gICAgICAgIEZsb2F0UmVjdCByZW5kZXJUYXJnZXRSZWN0KEZsb2F0UG9pbnQoKSwg
cmVuZGVyVGFyZ2V0LT5HZXRTaXplKCkpOwotICAgICAgICBGbG9hdFJlY3QgcmVjdFRvQ2xlYXIo
cmVjdCk7Ci0KLSAgICAgICAgaWYgKHJlY3RUb0NsZWFyLmNvbnRhaW5zKHJlbmRlclRhcmdldFJl
Y3QpKSB7Ci0gICAgICAgICAgICByZW5kZXJUYXJnZXQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwot
ICAgICAgICAgICAgcmVuZGVyVGFyZ2V0LT5DbGVhcihEMkQxOjpDb2xvckYoMCwgMCwgMCwgMCkp
OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyZWN0VG9D
bGVhci5pbnRlcnNlY3RzKHJlbmRlclRhcmdldFJlY3QpKQotICAgICAgICAgICAgcmV0dXJuOwot
Ci0gICAgICAgIHJlbmRlclRhcmdldC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0gICAgICAgIHJl
Y3RUb0NsZWFyLmludGVyc2VjdChyZW5kZXJUYXJnZXRSZWN0KTsKLSAgICAgICAgcmVuZGVyVGFy
Z2V0LT5GaWxsUmVjdGFuZ2xlKHJlY3RUb0NsZWFyLCBicnVzaFdpdGhDb2xvcihDb2xvcihEMkQx
OjpDb2xvckYoMCwgMCwgMCwgMCkpKSk7Ci0gICAgfSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3Jt
Q29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6Y2xlYXJSZWN0KCpwbGF0Zm9ybUNvbnRleHQoKSwg
cmVjdCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VSZWN0KGNvbnN0IEZsb2F0
UmVjdCYgcmVjdCwgZmxvYXQgbGluZVdpZHRoKQpAQCAtMTU2MiwyOSArODU1LDEwIEBAIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpzdHJva2VSZWN0KGNvbnN0IEYKICAgICAgICAgcmV0dXJuOwogICAg
IH0KIAotICAgIGlmIChtX3N0YXRlLnN0cm9rZUdyYWRpZW50KSB7Ci0gICAgICAgIFdURjo6RnVu
Y3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiBkcmF3RnVuY3Rpb24gPSBbdGhpcywgcmVj
dCwgbGluZVdpZHRoXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAg
ICAgICByZW5kZXJUYXJnZXQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotICAgICAgICAgICAgY29u
c3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9IHJlY3Q7Ci0gICAgICAgICAgICByZW5kZXJUYXJnZXQt
PkRyYXdSZWN0YW5nbGUoJmQyZFJlY3QsIG1fc3RhdGUuc3Ryb2tlR3JhZGllbnQtPmNyZWF0ZVBs
YXRmb3JtR3JhZGllbnRJZk5lY2Vzc2FyeShyZW5kZXJUYXJnZXQpLCBsaW5lV2lkdGgsIG1fZGF0
YS0+c3Ryb2tlU3R5bGUoKSk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgKGhhc1NoYWRvdygp
KQotICAgICAgICAgICAgZHJhd1dpdGhTaGFkb3cocmVjdCwgZHJhd0Z1bmN0aW9uKTsKLSAgICAg
ICAgZWxzZQotICAgICAgICAgICAgZHJhd1dpdGhvdXRTaGFkb3cocmVjdCwgZHJhd0Z1bmN0aW9u
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtX3N0YXRlLnN0cm9rZVBhdHRl
cm4pCi0gICAgICAgIGFwcGx5U3Ryb2tlUGF0dGVybigpOwotCi0gICAgZHJhd1dpdGhvdXRTaGFk
b3cocmVjdCwgW3RoaXMsIHJlY3QsIGxpbmVXaWR0aF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRl
clRhcmdldCkgewotICAgICAgICByZW5kZXJUYXJnZXQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwot
ICAgICAgICBjb25zdCBEMkQxX1JFQ1RfRiBkMmRSZWN0ID0gcmVjdDsKLSAgICAgICAgYXV0byBi
cnVzaCA9IG1fc3RhdGUuc3Ryb2tlUGF0dGVybiA/IHBhdHRlcm5TdHJva2VCcnVzaCgpIDogc29s
aWRTdHJva2VCcnVzaCgpOwotICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdSZWN0YW5nbGUoJmQy
ZFJlY3QsIGJydXNoLCBsaW5lV2lkdGgsIG1fZGF0YS0+c3Ryb2tlU3R5bGUoKSk7Ci0gICAgfSk7
CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0ZSA9IHRo
aXMtPnN0YXRlKCk7CisgICAgYXV0byYgY29udGV4dCA9ICpwbGF0Zm9ybUNvbnRleHQoKTsKKyAg
ICBEaXJlY3QyRDo6c3Ryb2tlUmVjdChjb250ZXh0LCByZWN0LCBsaW5lV2lkdGgsIERpcmVjdDJE
OjpTdHJva2VTb3VyY2Uoc3RhdGUsIGNvbnRleHQpLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoc3Rh
dGUpKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExpbmVDYXAoTGluZUNhcCBjYXAp
CkBAIC0xNTk3LDcgKzg3MSw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lQ2FwKExp
bmVDYXAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1fZGF0YS0+c2V0TGluZUNhcChj
YXApOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OnNl
dExpbmVDYXAoKnBsYXRmb3JtQ29udGV4dCgpLCBjYXApOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2V0TGluZURhc2goY29uc3QgRGFzaEFycmF5JiBkYXNoZXMsIGZsb2F0IGRhc2hPZmZz
ZXQpCkBAIC0xNjE4LDggKzg5Myw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lRGFz
aChjb25zdAogICAgICAgICAgICAgZGFzaE9mZnNldCA9IGZtb2QoZGFzaE9mZnNldCwgbGVuZ3Ro
KSArIGxlbmd0aDsKICAgICB9CiAKLSAgICBtX2RhdGEtPnNldERhc2hlcyhkYXNoZXMpOwotICAg
IG1fZGF0YS0+c2V0RGFzaE9mZnNldChkYXNoT2Zmc2V0KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZv
cm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpzZXRMaW5lRGFzaCgqcGxhdGZvcm1Db250ZXh0
KCksIGRhc2hlcywgZGFzaE9mZnNldCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRM
aW5lSm9pbihMaW5lSm9pbiBqb2luKQpAQCAtMTYzMiw3ICs5MDcsOCBAQCB2b2lkIEdyYXBoaWNz
Q29udGV4dDo6c2V0TGluZUpvaW4oTGluZUpvCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAg
ICBtX2RhdGEtPnNldExpbmVKb2luKGpvaW4pOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRl
eHQoKSk7CisgICAgRGlyZWN0MkQ6OnNldExpbmVKb2luKCpwbGF0Zm9ybUNvbnRleHQoKSwgam9p
bik7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpjYW52YXNDbGlwKGNvbnN0IFBhdGgmIHBh
dGgsIFdpbmRSdWxlIGZpbGxSdWxlKQpAQCAtMTY1MCw3ICs5MjYsOCBAQCB2b2lkIEdyYXBoaWNz
Q29udGV4dDo6c2NhbGUoY29uc3QgRmxvYXRTCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAg
ICBtX2RhdGEtPnNjYWxlKHNpemUpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7
CisgICAgRGlyZWN0MkQ6OnNjYWxlKCpwbGF0Zm9ybUNvbnRleHQoKSwgc2l6ZSk7CiAgICAgLy8g
RklYTUU6IG1fZGF0YS0+bV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eSA9
IGZhbHNlOwogfQogCkBAIC0xNjY0LDcgKzk0MSw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpy
b3RhdGUoZmxvYXQgYW5nbGUKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1fZGF0YS0+
cm90YXRlKGFuZ2xlKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERp
cmVjdDJEOjpyb3RhdGUoKnBsYXRmb3JtQ29udGV4dCgpLCBhbmdsZSk7CiAgICAgLy8gRklYTUU6
IG1fZGF0YS0+bV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eSA9IGZhbHNl
OwogfQogCkBAIC0xNjc4LDcgKzk1Niw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xh
dGUoZmxvYXQgeCwKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1fZGF0YS0+dHJhbnNs
YXRlKHgsIHkpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0
MkQ6OnRyYW5zbGF0ZSgqcGxhdGZvcm1Db250ZXh0KCksIHgsIHkpOwogICAgIC8vIEZJWE1FOiBt
X2RhdGEtPm1fdXNlclRvRGV2aWNlVHJhbnNmb3JtS25vd25Ub0JlSWRlbnRpdHkgPSBmYWxzZTsK
IH0KIApAQCAtMTY5Miw3ICs5NzEsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RN
KGNvbnN0IEFmCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtX2RhdGEtPmNvbmNhdENU
TSh0cmFuc2Zvcm0pOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGly
ZWN0MkQ6OmNvbmNhdENUTSgqcGxhdGZvcm1Db250ZXh0KCksIHRyYW5zZm9ybSk7CiAgICAgLy8g
RklYTUU6IG1fZGF0YS0+bV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eSA9
IGZhbHNlOwogfQogCkBAIC0xNzA2LDcgKzk4Niw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpz
ZXRDVE0oY29uc3QgQWZmaW4KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1fZGF0YS0+
c2V0Q1RNKHRyYW5zZm9ybSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAg
ICBEaXJlY3QyRDo6U3RhdGU6OnNldENUTSgqcGxhdGZvcm1Db250ZXh0KCksIHRyYW5zZm9ybSk7
CiAgICAgLy8gRklYTUU6IG1fZGF0YS0+bV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJ
ZGVudGl0eSA9IGZhbHNlOwogfQogCkBAIC0xNzE1LDE0ICs5OTYsMTEgQEAgQWZmaW5lVHJhbnNm
b3JtIEdyYXBoaWNzQ29udGV4dDo6Z2V0Q1RNKAogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CiAgICAgICAgIHJldHVybiBBZmZpbmVUcmFuc2Zvcm0oKTsKIAotICAgIGlmIChtX2ltcGwpIHsK
LSAgICAgICAgV1RGTG9nQWx3YXlzKCJHcmFwaGljc0NvbnRleHQ6OmdldENUTSgpIGlzIG5vdCB5
ZXQgY29tcGF0aWJsZSB3aXRoIHJlY29yZGluZyBjb250ZXh0cy4iKTsKLSAgICAgICAgcmV0dXJu
IEFmZmluZVRyYW5zZm9ybSgpOwotICAgIH0KKyAgICBpZiAobV9pbXBsKQorICAgICAgICByZXR1
cm4gbV9pbXBsLT5nZXRDVE0oaW5jbHVkZVNjYWxlKTsKIAotICAgIEQyRDFfTUFUUklYXzNYMl9G
IGN1cnJlbnRUcmFuc2Zvcm07Ci0gICAgcGxhdGZvcm1Db250ZXh0KCktPkdldFRyYW5zZm9ybSgm
Y3VycmVudFRyYW5zZm9ybSk7Ci0gICAgcmV0dXJuIGN1cnJlbnRUcmFuc2Zvcm07CisgICAgQVNT
RVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICByZXR1cm4gRGlyZWN0MkQ6OlN0YXRlOjpn
ZXRDVE0oKnBsYXRmb3JtQ29udGV4dCgpKTsKIH0KIAogRmxvYXRSZWN0IEdyYXBoaWNzQ29udGV4
dDo6cm91bmRUb0RldmljZVBpeGVscyhjb25zdCBGbG9hdFJlY3QmIHJlY3QsIFJvdW5kaW5nTW9k
ZSByb3VuZGluZ01vZGUpCkBAIC0xNzMwLDE0ICsxMDA4LDEwIEBAIEZsb2F0UmVjdCBHcmFwaGlj
c0NvbnRleHQ6OnJvdW5kVG9EZXZpY2UKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAg
ICAgICByZXR1cm4gcmVjdDsKIAotICAgIGlmIChtX2ltcGwpIHsKLSAgICAgICAgV1RGTG9nQWx3
YXlzKCJHcmFwaGljc0NvbnRleHQ6OnJvdW5kVG9EZXZpY2VQaXhlbHMoKSBpcyBub3QgeWV0IGNv
bXBhdGlibGUgd2l0aCByZWNvcmRpbmcgY29udGV4dHMuIik7Ci0gICAgICAgIHJldHVybiByZWN0
OwotICAgIH0KLQotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgaWYgKG1faW1wbCkKKyAgICAg
ICAgcmV0dXJuIG1faW1wbC0+cm91bmRUb0RldmljZVBpeGVscyhyZWN0LCByb3VuZGluZ01vZGUp
OwogCi0gICAgcmV0dXJuIHJlY3Q7CisgICAgcmV0dXJuIERpcmVjdDJEOjpTdGF0ZTo6cm91bmRU
b0RldmljZVBpeGVscygqcGxhdGZvcm1Db250ZXh0KCksIHJlY3QpOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JUZXh0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgYm9vbCBw
cmludGluZywgYm9vbCBkb3VibGVMaW5lcywgU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUpCkBAIC0x
NzQ4LDE5ICsxMDIyLDIxIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvclRleHQo
Y28KICAgICBkcmF3TGluZXNGb3JUZXh0KHJlY3QubG9jYXRpb24oKSwgcmVjdC5oZWlnaHQoKSwg
d2lkdGhzLCBwcmludGluZywgZG91YmxlTGluZXMsIHN0cm9rZVN0eWxlKTsKIH0KIAotdm9pZCBH
cmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lc0ZvclRleHQoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQs
IGZsb2F0IHRoaWNrbmVzcywgY29uc3QgRGFzaEFycmF5JiB3aWR0aHMsIGJvb2wgcHJpbnRpbmcs
IGJvb2wgZG91YmxlTGluZXMsIFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlKQordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmRyYXdMaW5lc0ZvclRleHQoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGZsb2F0
IHRoaWNrbmVzcywgY29uc3QgRGFzaEFycmF5JiB3aWR0aHMsIGJvb2wgcHJpbnRpbmcsIGJvb2wg
ZG91YmxlVW5kZXJsaW5lcywgU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUpCiB7CiAgICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOwogCiAgICAgaWYgKCF3aWR0aHMuc2l6
ZSgpKQogICAgICAgICByZXR1cm47CiAKICAgICBpZiAobV9pbXBsKSB7Ci0gICAgICAgIG1faW1w
bC0+ZHJhd0xpbmVzRm9yVGV4dChwb2ludCwgdGhpY2tuZXNzLCB3aWR0aHMsIHByaW50aW5nLCBk
b3VibGVMaW5lcyk7CisgICAgICAgIG1faW1wbC0+ZHJhd0xpbmVzRm9yVGV4dChwb2ludCwgdGhp
Y2tuZXNzLCB3aWR0aHMsIHByaW50aW5nLCBkb3VibGVVbmRlcmxpbmVzKTsKICAgICAgICAgcmV0
dXJuOwogICAgIH0KIAotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgQVNTRVJUKGhhc1BsYXRm
b3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6ZHJhd0xpbmVzRm9yVGV4dCgqcGxhdGZvcm1D
b250ZXh0KCksIHBvaW50LCB0aGlja25lc3MsIHdpZHRocywgcHJpbnRpbmcsIGRvdWJsZVVuZGVy
bGluZXMsIG1fc3RhdGUuc3Ryb2tlQ29sb3IpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0VVJMRm9yUmVjdChjb25zdCBVUkwmIGxpbmssIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3Qp
CkBAIC0xODYzLDEwICsxMTM5LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3Jt
VGV4dERyYQogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlQ29sb3IoY29u
c3QgQ29sb3ImIGNvbG9yKQogewogICAgIEFTU0VSVChtX3N0YXRlLnN0cm9rZUNvbG9yID09IGNv
bG9yKTsKLQotICAgIG1fZGF0YS0+bV9zb2xpZFN0cm9rZUJydXNoID0gbnVsbHB0cjsKLQotICAg
IG1fZGF0YS0+bV9zb2xpZFN0cm9rZUJydXNoID0gYnJ1c2hXaXRoQ29sb3Ioc3Ryb2tlQ29sb3Io
KSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBwbGF0Zm9ybUNvbnRl
eHQoKS0+bV9zb2xpZFN0cm9rZUJydXNoID0gYnJ1c2hXaXRoQ29sb3Ioc3Ryb2tlQ29sb3IoKSk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9rZVRoaWNrbmVzcyhm
bG9hdCB0aGlja25lc3MpCkBAIC0xODc4LDEwICsxMTUyLDggQEAgdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OnNldFBsYXRmb3JtU3Ryb2tlVAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3Jt
RmlsbENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKIHsKICAgICBBU1NFUlQobV9zdGF0ZS5maWxs
Q29sb3IgPT0gY29sb3IpOwotCi0gICAgbV9kYXRhLT5tX3NvbGlkRmlsbEJydXNoID0gbnVsbHB0
cjsKLQotICAgIG1fZGF0YS0+bV9zb2xpZEZpbGxCcnVzaCA9IGJydXNoV2l0aENvbG9yKGZpbGxD
b2xvcigpKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIHBsYXRmb3Jt
Q29udGV4dCgpLT5tX3NvbGlkRmlsbEJydXNoID0gYnJ1c2hXaXRoQ29sb3IoZmlsbENvbG9yKCkp
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TaG91bGRBbnRpYWxpYXMo
Ym9vbCBlbmFibGUpCkBAIC0xODkwLDkgKzExNjIsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0UGxhdGZvcm1TaG91bGRBCiAgICAgICAgIHJldHVybjsKIAogICAgIEFTU0VSVCghbV9pbXBs
KTsKLQotICAgIGF1dG8gYW50aWFsaWFzTW9kZSA9IGVuYWJsZSA/IEQyRDFfQU5USUFMSUFTX01P
REVfUEVSX1BSSU1JVElWRSA6IEQyRDFfQU5USUFMSUFTX01PREVfQUxJQVNFRDsKLSAgICBwbGF0
Zm9ybUNvbnRleHQoKS0+U2V0QW50aWFsaWFzTW9kZShhbnRpYWxpYXNNb2RlKTsKKyAgICBBU1NF
UlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpTdGF0ZTo6c2V0U2hvdWxk
QW50aWFsaWFzKCpwbGF0Zm9ybUNvbnRleHQoKSwgZW5hYmxlKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldFBsYXRmb3JtU2hvdWxkU21vb3RoRm9udHMoYm9vbCBlbmFibGUpCkBAIC0x
OTAzLDcgKzExNzQsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TaG91bGRT
CiAgICAgQVNTRVJUKCFtX2ltcGwpOwogCiAgICAgYXV0byBmb250U21vb3RoaW5nTW9kZSA9IGVu
YWJsZSA/IEQyRDFfVEVYVF9BTlRJQUxJQVNfTU9ERV9DTEVBUlRZUEUgOiBEMkQxX1RFWFRfQU5U
SUFMSUFTX01PREVfQUxJQVNFRDsKLSAgICBwbGF0Zm9ybUNvbnRleHQoKS0+U2V0VGV4dEFudGlh
bGlhc01vZGUoZm9udFNtb290aGluZ01vZGUpOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5yZW5k
ZXJUYXJnZXQoKS0+U2V0VGV4dEFudGlhbGlhc01vZGUoZm9udFNtb290aGluZ01vZGUpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1BbHBoYShmbG9hdCBhbHBoYSkKQEAg
LTE5MTUsMTIxICsxMTg2LDE1IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybUFs
cGhhKGYKICAgICBtX2RhdGEtPnNldEFscGhhKGFscGhhKTsKIH0KIAotdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnNldFBsYXRmb3JtQ29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJhdG9yIG1v
ZGUsIEJsZW5kTW9kZSBibGVuZE1vZGUpCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZv
cm1Db21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3BlcmF0b3Is
IEJsZW5kTW9kZSBibGVuZE1vZGUpCiB7CiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAg
ICAgICAgcmV0dXJuOwogCiAgICAgQVNTRVJUKCFtX2ltcGwpOwogCi0gICAgRDJEMV9CTEVORF9N
T0RFIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9TQ1JFRU47Ci0gICAgRDJEMV9D
T01QT1NJVEVfTU9ERSB0YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9T
T1VSQ0VfQVRPUDsgLy8gPz8/Ci0KLSAgICBpZiAoYmxlbmRNb2RlICE9IEJsZW5kTW9kZTo6Tm9y
bWFsKSB7Ci0gICAgICAgIHN3aXRjaCAoYmxlbmRNb2RlKSB7Ci0gICAgICAgIGNhc2UgQmxlbmRN
b2RlOjpNdWx0aXBseToKLSAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRf
TU9ERV9NVUxUSVBMWTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9k
ZTo6U2NyZWVuOgotICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RF
X1NDUkVFTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6T3Zl
cmxheToKLSAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9PVkVS
TEFZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpEYXJrZW46
Ci0gICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfREFSS0VOOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpMaWdodGVuOgotICAg
ICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0xJR0hURU47Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OkNvbG9yRG9kZ2U6Ci0gICAg
ICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfQ09MT1JfRE9ER0U7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OkNvbG9yQnVybjoKLSAg
ICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DT0xPUl9CVVJOOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpIYXJkTGlnaHQ6Ci0g
ICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfSEFSRF9MSUdIVDsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6U29mdExpZ2h0Ogot
ICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX1NPRlRfTElHSFQ7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OkRpZmZlcmVuY2U6
Ci0gICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfRElGRkVSRU5D
RTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6RXhjbHVzaW9u
OgotICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0VYQ0xVU0lP
TjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6SHVlOgotICAg
ICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0hVRTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6U2F0dXJhdGlvbjoKLSAgICAgICAg
ICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9TQVRVUkFUSU9OOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpDb2xvcjoKLSAgICAgICAgICAg
IHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DT0xPUjsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6THVtaW5vc2l0eToKLSAgICAgICAgICAgIHRh
cmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9MVU1JTk9TSVRZOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpQbHVzRGFya2VyOgotICAgICAgICAgICAg
dGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0RBUktFUl9DT0xPUjsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6UGx1c0xpZ2h0ZXI6Ci0gICAgICAg
ICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfTElHSFRFUl9DT0xPUjsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgICAg
Y2FzZSBDb21wb3NpdGVDbGVhcjoKLSAgICAgICAgICAgIC8vIEZJWE1FOiB0YXJnZXRCbGVuZE1v
ZGUgPSBEMkQxX0JMRU5EX01PREVfQ0xFQVI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
Y2FzZSBDb21wb3NpdGVDb3B5OgotICAgICAgICAgICAgLy8gRklYTUU6IHRhcmdldEJsZW5kTW9k
ZSA9IEQyRDFfQkxFTkRfTU9ERV9DT1BZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNh
c2UgQ29tcG9zaXRlU291cmNlT3ZlcjoKLSAgICAgICAgICAgIC8vIEZJWE1FOiBrQ0dCbGVuZE1v
ZGVOb3JtYWwKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJj
ZUluOgotICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRFX01P
REVfU09VUkNFX0lOOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRl
U291cmNlT3V0OgotICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9T
SVRFX01PREVfU09VUkNFX09VVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENv
bXBvc2l0ZVNvdXJjZUF0b3A6Ci0gICAgICAgICAgICB0YXJnZXRDb21wb3NpdGVNb2RlID0gRDJE
MV9DT01QT1NJVEVfTU9ERV9TT1VSQ0VfQVRPUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uT3ZlcjoKLSAgICAgICAgICAgIHRhcmdldENvbXBv
c2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX0RFU1RJTkFUSU9OX09WRVI7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbkluOgotICAgICAg
ICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRFX01PREVfREVTVElOQVRJ
T05fSU47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5h
dGlvbk91dDoKLSAgICAgICAgICAgIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lU
RV9NT0RFX0RFU1RJTkFUSU9OX09VVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IENvbXBvc2l0ZURlc3RpbmF0aW9uQXRvcDoKLSAgICAgICAgICAgIHRhcmdldENvbXBvc2l0ZU1v
ZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX0RFU1RJTkFUSU9OX0FUT1A7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVYT1I6Ci0gICAgICAgICAgICB0YXJnZXRDb21w
b3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9YT1I7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBDb21wb3NpdGVQbHVzRGFya2VyOgotICAgICAgICAgICAgdGFyZ2V0Qmxl
bmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0RBUktFUl9DT0xPUjsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIENvbXBvc2l0ZVBsdXNMaWdodGVyOgotICAgICAgICAgICAgdGFyZ2V0
QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0xJR0hURVJfQ09MT1I7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEaWZmZXJlbmNlOgotICAgICAgICAgICAgdGFy
Z2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0RJRkZFUkVOQ0U7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fZGF0YS0+bV9ibGVuZE1vZGUgPSB0YXJn
ZXRCbGVuZE1vZGU7Ci0gICAgbV9kYXRhLT5tX2NvbXBvc2l0ZU1vZGUgPSB0YXJnZXRDb21wb3Np
dGVNb2RlOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6
OlN0YXRlOjpzZXRDb21wb3NpdGVPcGVyYXRpb24oKnBsYXRmb3JtQ29udGV4dCgpLCBjb21wb3Np
dGVPcGVyYXRvciwgYmxlbmRNb2RlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRm
b3JtQXBwbHlEZXZpY2VTY2FsZUZhY3RvcihmbG9hdCBkZXZpY2VTY2FsZUZhY3RvcikKQEAgLTIw
NTAsMTMgKzEyMTUsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1GaWxsRWxsaXBz
CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBhdXRvIGQyZEVsbGlwc2UgPSBEMkQxOjpF
bGxpcHNlKGVsbGlwc2UuY2VudGVyKCksIDAuNSAqIGVsbGlwc2Uud2lkdGgoKSwgMC41ICogZWxs
aXBzZS5oZWlnaHQoKSk7Ci0KLSAgICBwbGF0Zm9ybUNvbnRleHQoKS0+U2V0VGFncygxLCBfX0xJ
TkVfXyk7Ci0KLSAgICBkcmF3V2l0aG91dFNoYWRvdyhlbGxpcHNlLCBbdGhpcywgZDJkRWxsaXBz
ZV0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewotICAgICAgICByZW5kZXJUYXJn
ZXQtPkZpbGxFbGxpcHNlKCZkMmRFbGxpcHNlLCBzb2xpZEZpbGxCcnVzaCgpKTsKLSAgICB9KTsK
KyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpmaWxsRWxs
aXBzZSgqcGxhdGZvcm1Db250ZXh0KCksIGVsbGlwc2UsIG1fc3RhdGUuZmlsbENvbG9yLCBtX3N0
YXRlLnN0cm9rZVN0eWxlLCBtX3N0YXRlLnN0cm9rZUNvbG9yLCBtX3N0YXRlLnN0cm9rZVRoaWNr
bmVzcyk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybVN0cm9rZUVsbGlwc2Uo
Y29uc3QgRmxvYXRSZWN0JiBlbGxpcHNlKQpAQCAtMjA3MiwxMyArMTIzMiw4IEBAIHZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpwbGF0Zm9ybVN0cm9rZUVsbGkKICAgICAgICAgcmV0dXJuOwogICAgIH0K
IAotICAgIGF1dG8gZDJkRWxsaXBzZSA9IEQyRDE6OkVsbGlwc2UoZWxsaXBzZS5jZW50ZXIoKSwg
MC41ICogZWxsaXBzZS53aWR0aCgpLCAwLjUgKiBlbGxpcHNlLmhlaWdodCgpKTsKLQotICAgIHBs
YXRmb3JtQ29udGV4dCgpLT5TZXRUYWdzKDEsIF9fTElORV9fKTsKLQotICAgIGRyYXdXaXRob3V0
U2hhZG93KGVsbGlwc2UsIFt0aGlzLCBkMmRFbGxpcHNlXShJRDJEMVJlbmRlclRhcmdldCogcmVu
ZGVyVGFyZ2V0KSB7Ci0gICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0VsbGlwc2UoJmQyZEVsbGlw
c2UsIHNvbGlkU3Ryb2tlQnJ1c2goKSwgc3Ryb2tlVGhpY2tuZXNzKCksIG1fZGF0YS0+c3Ryb2tl
U3R5bGUoKSk7Ci0gICAgfSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAg
ICBEaXJlY3QyRDo6ZHJhd0VsbGlwc2UoKnBsYXRmb3JtQ29udGV4dCgpLCBlbGxpcHNlLCBtX3N0
YXRlLnN0cm9rZVN0eWxlLCBtX3N0YXRlLnN0cm9rZUNvbG9yLCBtX3N0YXRlLnN0cm9rZVRoaWNr
bmVzcyk7CiB9CiAKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQu
Y3BwCShub25leGlzdGVudCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0
MkQuaCIKKworI2lmIFVTRShESVJFQ1QyRCkKKworI2luY2x1ZGUgIkRpcmVjdDJET3BlcmF0aW9u
cy5oIgorI2luY2x1ZGUgIkZsb2F0Um91bmRlZFJlY3QuaCIKKyNpbmNsdWRlICJGb250LmgiCisj
aW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5oIgorI2luY2x1
ZGUgIkltYWdlQnVmZmVyLmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIk5vdElt
cGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaCIKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dEltcGxG
YWN0b3J5IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6Y3JlYXRlRmFjdG9yeShQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0KQoreworICAgIHJldHVybiBHcmFwaGlj
c0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dEltcGxGYWN0b3J5KAorICAgICAgICBbJnBsYXRmb3Jt
Q29udGV4dF0oR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAg
ICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ+KGNv
bnRleHQsIHBsYXRmb3JtQ29udGV4dCk7CisgICAgICAgIH0pOworfQorCitHcmFwaGljc0NvbnRl
eHQ6OkdyYXBoaWNzQ29udGV4dEltcGxGYWN0b3J5IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3Qy
RDo6Y3JlYXRlRmFjdG9yeShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KQoreworICAg
IHJldHVybiBHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dEltcGxGYWN0b3J5KAorICAg
ICAgICBbcmVuZGVyVGFyZ2V0XShHcmFwaGljc0NvbnRleHQmIGNvbnRleHQpCisgICAgICAgIHsK
KyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEdyYXBoaWNzQ29udGV4dEltcGxE
aXJlY3QyRD4oY29udGV4dCwgcmVuZGVyVGFyZ2V0KTsKKyAgICAgICAgfSk7Cit9CisKK0dyYXBo
aWNzQ29udGV4dEltcGxEaXJlY3QyRDo6R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEKEdyYXBo
aWNzQ29udGV4dCYgY29udGV4dCwgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29u
dGV4dCkKKyAgICA6IEdyYXBoaWNzQ29udGV4dEltcGwoY29udGV4dCwgRmxvYXRSZWN0IHsgfSwg
QWZmaW5lVHJhbnNmb3JtIHsgfSkKKyAgICAsIG1fcGxhdGZvcm1Db250ZXh0KHBsYXRmb3JtQ29u
dGV4dCkKKyAgICAsIG1fcHJpdmF0ZShzdGQ6Om1ha2VfdW5pcXVlPEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZT4obV9wbGF0Zm9ybUNvbnRleHQsIEdyYXBoaWNzQ29udGV4dDo6Qml0bWFw
UmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSkpCit7CisgICAgbV9wbGF0Zm9ybUNvbnRl
eHQuc2V0R3JhcGhpY3NDb250ZXh0UHJpdmF0ZShtX3ByaXZhdGUuZ2V0KCkpOworICAgIG1fcHJp
dmF0ZS0+c3luY0NvbnRleHQobV9wbGF0Zm9ybUNvbnRleHQpOworfQorCitHcmFwaGljc0NvbnRl
eHRJbXBsRGlyZWN0MkQ6OkdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRChHcmFwaGljc0NvbnRl
eHQmIGNvbnRleHQsIElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpCisgICAgOiBHcmFw
aGljc0NvbnRleHRJbXBsKGNvbnRleHQsIEZsb2F0UmVjdCB7IH0sIEFmZmluZVRyYW5zZm9ybSB7
IH0pCisgICAgLCBtX293bmVkUGxhdGZvcm1Db250ZXh0KHN0ZDo6bWFrZV91bmlxdWU8UGxhdGZv
cm1Db250ZXh0RGlyZWN0MkQ+KHJlbmRlclRhcmdldCkpCisgICAgLCBtX3BsYXRmb3JtQ29udGV4
dCgqbV9vd25lZFBsYXRmb3JtQ29udGV4dCkKKyAgICAsIG1fcHJpdmF0ZShzdGQ6Om1ha2VfdW5p
cXVlPEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZT4obV9wbGF0Zm9ybUNvbnRleHQsIEdy
YXBoaWNzQ29udGV4dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSkpCit7
CisgICAgbV9wbGF0Zm9ybUNvbnRleHQuc2V0R3JhcGhpY3NDb250ZXh0UHJpdmF0ZShtX3ByaXZh
dGUuZ2V0KCkpOworICAgIG1fcHJpdmF0ZS0+c3luY0NvbnRleHQobV9wbGF0Zm9ybUNvbnRleHQp
OworfQorCitHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6On5HcmFwaGljc0NvbnRleHRJbXBs
RGlyZWN0MkQoKQoreworICAgIG1fcGxhdGZvcm1Db250ZXh0LnNldEdyYXBoaWNzQ29udGV4dFBy
aXZhdGUobnVsbHB0cik7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpo
YXNQbGF0Zm9ybUNvbnRleHQoKSBjb25zdAoreworICAgIHJldHVybiB0cnVlOworfQorCitQbGF0
Zm9ybUNvbnRleHREaXJlY3QyRCogR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpwbGF0Zm9y
bUNvbnRleHQoKSBjb25zdAoreworICAgIHJldHVybiAmbV9wbGF0Zm9ybUNvbnRleHQ7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjp1cGRhdGVTdGF0ZShjb25zdCBHcmFw
aGljc0NvbnRleHRTdGF0ZSYgc3RhdGUsIEdyYXBoaWNzQ29udGV4dFN0YXRlOjpTdGF0ZUNoYW5n
ZUZsYWdzIGZsYWdzKQoreworICAgIGlmIChmbGFncyAmIEdyYXBoaWNzQ29udGV4dFN0YXRlOjpT
dHJva2VUaGlja25lc3NDaGFuZ2UpCisgICAgICAgIERpcmVjdDJEOjpTdGF0ZTo6c2V0U3Ryb2tl
VGhpY2tuZXNzKG1fcGxhdGZvcm1Db250ZXh0LCBzdGF0ZS5zdHJva2VUaGlja25lc3MpOworCisg
ICAgaWYgKGZsYWdzICYgR3JhcGhpY3NDb250ZXh0U3RhdGU6OlN0cm9rZVN0eWxlQ2hhbmdlKQor
ICAgICAgICBEaXJlY3QyRDo6U3RhdGU6OnNldFN0cm9rZVN0eWxlKG1fcGxhdGZvcm1Db250ZXh0
LCBzdGF0ZS5zdHJva2VTdHlsZSk7CisKKyAgICBpZiAoZmxhZ3MgJiBHcmFwaGljc0NvbnRleHRT
dGF0ZTo6U2hhZG93Q2hhbmdlKSB7CisgICAgICAgIGlmIChzdGF0ZS5zaGFkb3dzSWdub3JlVHJh
bnNmb3JtcykgeworICAgICAgICAgICAgLy8gTWVhbmluZyB0aGF0IHRoaXMgZ3JhcGhpY3MgY29u
dGV4dCBpcyBhc3NvY2lhdGVkIHdpdGggYSBDYW52YXNSZW5kZXJpbmdDb250ZXh0CisgICAgICAg
ICAgICAvLyBXZSBmbGlwIHRoZSBoZWlnaHQgc2luY2UgQ0cgYW5kIEhUTUw1IENhbnZhcyBoYXZl
IG9wcG9zaXRlIFkgYXhpcworICAgICAgICAgICAgYXV0byYgbXV0YWJsZVN0YXRlID0gY29uc3Rf
Y2FzdDxHcmFwaGljc0NvbnRleHRTdGF0ZSY+KGdyYXBoaWNzQ29udGV4dCgpLnN0YXRlKCkpOwor
ICAgICAgICAgICAgYXV0byYgc2hhZG93T2Zmc2V0ID0gc3RhdGUuc2hhZG93T2Zmc2V0OworICAg
ICAgICAgICAgbXV0YWJsZVN0YXRlLnNoYWRvd09mZnNldCA9IHsgc2hhZG93T2Zmc2V0LndpZHRo
KCksIC1zaGFkb3dPZmZzZXQuaGVpZ2h0KCkgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlm
IChmbGFncyAmIEdyYXBoaWNzQ29udGV4dFN0YXRlOjpDb21wb3NpdGVPcGVyYXRpb25DaGFuZ2Up
CisgICAgICAgIERpcmVjdDJEOjpTdGF0ZTo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKG1fcGxhdGZv
cm1Db250ZXh0LCBzdGF0ZS5jb21wb3NpdGVPcGVyYXRvciwgc3RhdGUuYmxlbmRNb2RlKTsKKwor
ICAgIGlmIChmbGFncyAmIEdyYXBoaWNzQ29udGV4dFN0YXRlOjpTaG91bGRBbnRpYWxpYXNDaGFu
Z2UpCisgICAgICAgIERpcmVjdDJEOjpTdGF0ZTo6c2V0U2hvdWxkQW50aWFsaWFzKG1fcGxhdGZv
cm1Db250ZXh0LCBzdGF0ZS5zaG91bGRBbnRpYWxpYXMpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dEltcGxEaXJlY3QyRDo6Y2xlYXJTaGFkb3coKQoreworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dEltcGxEaXJlY3QyRDo6c2V0TGluZUNhcChMaW5lQ2FwIGxpbmVDYXApCit7CisgICAgRGly
ZWN0MkQ6OnNldExpbmVDYXAobV9wbGF0Zm9ybUNvbnRleHQsIGxpbmVDYXApOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6c2V0TGluZURhc2goY29uc3QgRGFzaEFycmF5
JiBkYXNoZXMsIGZsb2F0IGRhc2hPZmZzZXQpCit7CisgICAgRGlyZWN0MkQ6OnNldExpbmVEYXNo
KG1fcGxhdGZvcm1Db250ZXh0LCBkYXNoZXMsIGRhc2hPZmZzZXQpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dEltcGxEaXJlY3QyRDo6c2V0TGluZUpvaW4oTGluZUpvaW4gbGluZUpvaW4pCit7
CisgICAgRGlyZWN0MkQ6OnNldExpbmVKb2luKG1fcGxhdGZvcm1Db250ZXh0LCBsaW5lSm9pbik7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpzZXRNaXRlckxpbWl0KGZs
b2F0IG1pdGVyTGltaXQpCit7CisgICAgRGlyZWN0MkQ6OnNldE1pdGVyTGltaXQobV9wbGF0Zm9y
bUNvbnRleHQsIG1pdGVyTGltaXQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJl
Y3QyRDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIGF1dG8mIHN0YXRl
ID0gZ3JhcGhpY3NDb250ZXh0KCkuc3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZmlsbFJlY3QobV9w
bGF0Zm9ybUNvbnRleHQsIHJlY3QsIERpcmVjdDJEOjpGaWxsU291cmNlKHN0YXRlLCBtX3BsYXRm
b3JtQ29udGV4dCksIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0ZSkpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0
LCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgRGlyZWN0MkQ6OmZpbGxSZWN0KG1fcGxhdGZv
cm1Db250ZXh0LCByZWN0LCBjb2xvciwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKGdyYXBoaWNzQ29u
dGV4dCgpLnN0YXRlKCkpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6
OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgR3JhZGllbnQmIGdyYWRpZW50KQorewor
ICAgIGF1dG8gcGxhdGZvcm1HcmFkaWVudCA9IGFkb3B0Q09NKGdyYWRpZW50LmNyZWF0ZVBsYXRm
b3JtR3JhZGllbnRJZk5lY2Vzc2FyeShtX3BsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKSkp
OworICAgIGlmICghcGxhdGZvcm1HcmFkaWVudCkKKyAgICAgICAgcmV0dXJuOworCisgICAgRGly
ZWN0MkQ6OnNhdmUobV9wbGF0Zm9ybUNvbnRleHQpOworICAgIERpcmVjdDJEOjpmaWxsUmVjdFdp
dGhHcmFkaWVudChtX3BsYXRmb3JtQ29udGV4dCwgcmVjdCwgcGxhdGZvcm1HcmFkaWVudC5nZXQo
KSk7CisgICAgRGlyZWN0MkQ6OnJlc3RvcmUobV9wbGF0Zm9ybUNvbnRleHQpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiBy
ZWN0LCBjb25zdCBDb2xvciYgY29sb3IsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wZXJh
dG9yLCBCbGVuZE1vZGUgYmxlbmRNb2RlKQoreworICAgIGF1dG8mIHN0YXRlID0gZ3JhcGhpY3ND
b250ZXh0KCkuc3RhdGUoKTsKKyAgICBDb21wb3NpdGVPcGVyYXRvciBwcmV2aW91c09wZXJhdG9y
ID0gc3RhdGUuY29tcG9zaXRlT3BlcmF0b3I7CisKKyAgICBEaXJlY3QyRDo6U3RhdGU6OnNldENv
bXBvc2l0ZU9wZXJhdGlvbihtX3BsYXRmb3JtQ29udGV4dCwgY29tcG9zaXRlT3BlcmF0b3IsIGJs
ZW5kTW9kZSk7CisgICAgRGlyZWN0MkQ6OmZpbGxSZWN0KG1fcGxhdGZvcm1Db250ZXh0LCByZWN0
LCBjb2xvciwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0YXRlKSk7CisgICAgRGlyZWN0MkQ6OlN0
YXRlOjpzZXRDb21wb3NpdGVPcGVyYXRpb24obV9wbGF0Zm9ybUNvbnRleHQsIHByZXZpb3VzT3Bl
cmF0b3IsIEJsZW5kTW9kZTo6Tm9ybWFsKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBs
RGlyZWN0MkQ6OmZpbGxSb3VuZGVkUmVjdChjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiByZWN0LCBj
b25zdCBDb2xvciYgY29sb3IsIEJsZW5kTW9kZSBibGVuZE1vZGUpCit7CisgICAgYXV0byYgc3Rh
dGUgPSBncmFwaGljc0NvbnRleHQoKS5zdGF0ZSgpOworCisgICAgQ29tcG9zaXRlT3BlcmF0b3Ig
cHJldmlvdXNPcGVyYXRvciA9IHN0YXRlLmNvbXBvc2l0ZU9wZXJhdG9yOworICAgIERpcmVjdDJE
OjpTdGF0ZTo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKG1fcGxhdGZvcm1Db250ZXh0LCBwcmV2aW91
c09wZXJhdG9yLCBibGVuZE1vZGUpOworCisgICAgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlIHNoYWRv
d1N0YXRlKHN0YXRlKTsKKyAgICBpZiAocmVjdC5pc1JvdW5kZWQoKSkKKyAgICAgICAgRGlyZWN0
MkQ6OmZpbGxSb3VuZGVkUmVjdChtX3BsYXRmb3JtQ29udGV4dCwgcmVjdCwgY29sb3IsIHNoYWRv
d1N0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIERpcmVjdDJEOjpmaWxsUmVjdChtX3BsYXRmb3Jt
Q29udGV4dCwgcmVjdC5yZWN0KCksIGNvbG9yLCBzaGFkb3dTdGF0ZSk7CisKKyAgICBEaXJlY3Qy
RDo6U3RhdGU6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihtX3BsYXRmb3JtQ29udGV4dCwgcHJldmlv
dXNPcGVyYXRvciwgQmxlbmRNb2RlOjpOb3JtYWwpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dEltcGxEaXJlY3QyRDo6ZmlsbFJlY3RXaXRoUm91bmRlZEhvbGUoY29uc3QgRmxvYXRSZWN0JiBy
ZWN0LCBjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiByb3VuZGVkSG9sZVJlY3QsIGNvbnN0IENvbG9y
JikKK3sKKyAgICBEaXJlY3QyRDo6ZmlsbFJlY3RXaXRoUm91bmRlZEhvbGUobV9wbGF0Zm9ybUNv
bnRleHQsIHJlY3QsIHJvdW5kZWRIb2xlUmVjdCwgeyB9LCBEaXJlY3QyRDo6U2hhZG93U3RhdGUo
Z3JhcGhpY3NDb250ZXh0KCkuc3RhdGUoKSkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dElt
cGxEaXJlY3QyRDo6ZmlsbFBhdGgoY29uc3QgUGF0aCYgcGF0aCkKK3sKKyAgICBhdXRvJiBzdGF0
ZSA9IGdyYXBoaWNzQ29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmZpbGxQYXRoKG1f
cGxhdGZvcm1Db250ZXh0LCBwYXRoLCBEaXJlY3QyRDo6RmlsbFNvdXJjZShzdGF0ZSwgbV9wbGF0
Zm9ybUNvbnRleHQpLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoc3RhdGUpKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmZpbGxFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYg
cmVjdCkKK3sKKyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRFbGxpcHNlKHJlY3QpOworICAg
IGZpbGxQYXRoKHBhdGgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6
c3Ryb2tlUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGZsb2F0IGxpbmVXaWR0aCkKK3sKKyAg
ICBhdXRvJiBzdGF0ZSA9IGdyYXBoaWNzQ29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6
OnN0cm9rZVJlY3QobV9wbGF0Zm9ybUNvbnRleHQsIHJlY3QsIGxpbmVXaWR0aCwgRGlyZWN0MkQ6
OlN0cm9rZVNvdXJjZShzdGF0ZSwgbV9wbGF0Zm9ybUNvbnRleHQpLCBEaXJlY3QyRDo6U2hhZG93
U3RhdGUoc3RhdGUpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnN0
cm9rZVBhdGgoY29uc3QgUGF0aCYgcGF0aCkKK3sKKyAgICBhdXRvJiBzdGF0ZSA9IGdyYXBoaWNz
Q29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OnN0cm9rZVBhdGgobV9wbGF0Zm9ybUNv
bnRleHQsIHBhdGgsIERpcmVjdDJEOjpTdHJva2VTb3VyY2Uoc3RhdGUsIG1fcGxhdGZvcm1Db250
ZXh0KSwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0YXRlKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0SW1wbERpcmVjdDJEOjpzdHJva2VFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkK
K3sKKyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRFbGxpcHNlKHJlY3QpOworICAgIHN0cm9r
ZVBhdGgocGF0aCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpjbGVh
clJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIERpcmVjdDJEOjpjbGVhclJlY3Qo
bV9wbGF0Zm9ybUNvbnRleHQsIHJlY3QpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxE
aXJlY3QyRDo6ZHJhd0dseXBocyhjb25zdCBGb250JiBmb250LCBjb25zdCBHbHlwaEJ1ZmZlciYg
Z2x5cGhCdWZmZXIsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIG51bUdseXBocywgY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQsIEZvbnRTbW9vdGhpbmdNb2RlIGZvbnRTbW9vdGhpbmcpCit7CisgICAg
VU5VU0VEX1BBUkFNKGZvbnRTbW9vdGhpbmcpOworICAgIGlmICghZm9udC5wbGF0Zm9ybURhdGEo
KS5zaXplKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisK
K0ltYWdlRHJhd1Jlc3VsdCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdJbWFnZShJ
bWFnZSYgaW1hZ2UsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdGluYXRpb24sIGNvbnN0IEZsb2F0UmVj
dCYgc291cmNlLCBjb25zdCBJbWFnZVBhaW50aW5nT3B0aW9ucyYgaW1hZ2VQYWludGluZ09wdGlv
bnMpCit7CisgICAgcmV0dXJuIEdyYXBoaWNzQ29udGV4dEltcGw6OmRyYXdJbWFnZUltcGwoZ3Jh
cGhpY3NDb250ZXh0KCksIGltYWdlLCBkZXN0aW5hdGlvbiwgc291cmNlLCBpbWFnZVBhaW50aW5n
T3B0aW9ucyk7Cit9CisKK0ltYWdlRHJhd1Jlc3VsdCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0
MkQ6OmRyYXdUaWxlZEltYWdlKEltYWdlJiBpbWFnZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0aW5h
dGlvbiwgY29uc3QgRmxvYXRQb2ludCYgc291cmNlLCBjb25zdCBGbG9hdFNpemUmIHRpbGVTaXpl
LCBjb25zdCBGbG9hdFNpemUmIHNwYWNpbmcsIGNvbnN0IEltYWdlUGFpbnRpbmdPcHRpb25zJiBp
bWFnZVBhaW50aW5nT3B0aW9ucykKK3sKKyAgICByZXR1cm4gR3JhcGhpY3NDb250ZXh0SW1wbDo6
ZHJhd1RpbGVkSW1hZ2VJbXBsKGdyYXBoaWNzQ29udGV4dCgpLCBpbWFnZSwgZGVzdGluYXRpb24s
IHNvdXJjZSwgdGlsZVNpemUsIHNwYWNpbmcsIGltYWdlUGFpbnRpbmdPcHRpb25zKTsKK30KKwor
SW1hZ2VEcmF3UmVzdWx0IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZHJhd1RpbGVkSW1h
Z2UoSW1hZ2UmIGltYWdlLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RpbmF0aW9uLCBjb25zdCBGbG9h
dFJlY3QmIHNvdXJjZSwgY29uc3QgRmxvYXRTaXplJiB0aWxlU2NhbGVGYWN0b3IsIEltYWdlOjpU
aWxlUnVsZSBoUnVsZSwgSW1hZ2U6OlRpbGVSdWxlIHZSdWxlLCBjb25zdCBJbWFnZVBhaW50aW5n
T3B0aW9ucyYgaW1hZ2VQYWludGluZ09wdGlvbnMpCit7CisgICAgcmV0dXJuIEdyYXBoaWNzQ29u
dGV4dEltcGw6OmRyYXdUaWxlZEltYWdlSW1wbChncmFwaGljc0NvbnRleHQoKSwgaW1hZ2UsIGRl
c3RpbmF0aW9uLCBzb3VyY2UsIHRpbGVTY2FsZUZhY3RvciwgaFJ1bGUsIHZSdWxlLCBpbWFnZVBh
aW50aW5nT3B0aW9ucyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpk
cmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0aXZlSW1hZ2VQdHImIGltYWdlLCBjb25zdCBGbG9hdFNp
emUmIGltYWdlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0
JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2Rl
IGJsZW5kTW9kZSwgSW1hZ2VPcmllbnRhdGlvbiBvcmllbnRhdGlvbikKK3sKKyAgICBhdXRvJiBz
dGF0ZSA9IGdyYXBoaWNzQ29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmRyYXdOYXRp
dmVJbWFnZShtX3BsYXRmb3JtQ29udGV4dCwgaW1hZ2UuZ2V0KCksIGltYWdlU2l6ZSwgZGVzdFJl
Y3QsIHNyY1JlY3QsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUsIG9yaWVudGF0aW9uLCBz
dGF0ZS5pbWFnZUludGVycG9sYXRpb25RdWFsaXR5LCBzdGF0ZS5hbHBoYSwgRGlyZWN0MkQ6OlNo
YWRvd1N0YXRlKHN0YXRlKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJE
OjpkcmF3UGF0dGVybihJbWFnZSYgaW1hZ2UsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNv
bnN0IEZsb2F0UmVjdCYgdGlsZVJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRy
YW5zZm9ybSwgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIGNvbnN0IEZsb2F0U2l6ZSYsIENvbXBv
c2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUgYmxlbmRNb2RlKQorewor
ICAgIGlmIChhdXRvIHN1cmZhY2UgPSBpbWFnZS5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgp
KQorICAgICAgICBEaXJlY3QyRDo6ZHJhd1BhdHRlcm4obV9wbGF0Zm9ybUNvbnRleHQsIHN1cmZh
Y2UuZ2V0KCksIEludFNpemUoaW1hZ2Uuc2l6ZSgpKSwgZGVzdFJlY3QsIHRpbGVSZWN0LCBwYXR0
ZXJuVHJhbnNmb3JtLCBwaGFzZSwgY29tcG9zaXRlT3BlcmF0b3IsIGJsZW5kTW9kZSk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpkcmF3UmVjdChjb25zdCBGbG9hdFJl
Y3QmIHJlY3QsIGZsb2F0IGJvcmRlclRoaWNrbmVzcykKK3sKKyAgICBhdXRvJiBzdGF0ZSA9IGdy
YXBoaWNzQ29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmRyYXdSZWN0KG1fcGxhdGZv
cm1Db250ZXh0LCByZWN0LCBib3JkZXJUaGlja25lc3MsIHN0YXRlLmZpbGxDb2xvciwgc3RhdGUu
c3Ryb2tlU3R5bGUsIHN0YXRlLnN0cm9rZUNvbG9yKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHRJbXBsRGlyZWN0MkQ6OmRyYXdMaW5lKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50MSwgY29uc3Qg
RmxvYXRQb2ludCYgcG9pbnQyKQoreworICAgIGF1dG8mIHN0YXRlID0gZ3JhcGhpY3NDb250ZXh0
KCkuc3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZHJhd0xpbmUobV9wbGF0Zm9ybUNvbnRleHQsIHBv
aW50MSwgcG9pbnQyLCBzdGF0ZS5zdHJva2VTdHlsZSwgc3RhdGUuc3Ryb2tlQ29sb3IsIHN0YXRl
LnN0cm9rZVRoaWNrbmVzcywgc3RhdGUuc2hvdWxkQW50aWFsaWFzKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdMaW5lc0ZvclRleHQoY29uc3QgRmxvYXRQb2lu
dCYgcG9pbnQsIGZsb2F0IHRoaWNrbmVzcywgY29uc3QgRGFzaEFycmF5JiB3aWR0aHMsIGJvb2wg
cHJpbnRpbmcsIGJvb2wgZG91YmxlVW5kZXJsaW5lcykKK3sKKyAgICBhdXRvJiBzdGF0ZSA9IGdy
YXBoaWNzQ29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmRyYXdMaW5lc0ZvclRleHQo
bV9wbGF0Zm9ybUNvbnRleHQsIHBvaW50LCB0aGlja25lc3MsIHdpZHRocywgcHJpbnRpbmcsIGRv
dWJsZVVuZGVybGluZXMsIHN0YXRlLnN0cm9rZUNvbG9yKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdEb3RzRm9yRG9jdW1lbnRNYXJrZXIoY29uc3QgRmxvYXRS
ZWN0JiByZWN0LCBEb2N1bWVudE1hcmtlckxpbmVTdHlsZSBzdHlsZSkKK3sKKyAgICBEaXJlY3Qy
RDo6ZHJhd0RvdHNGb3JEb2N1bWVudE1hcmtlcihtX3BsYXRmb3JtQ29udGV4dCwgcmVjdCwgc3R5
bGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZHJhd0VsbGlwc2Uo
Y29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIGF1dG8mIHN0YXRlID0gZ3JhcGhpY3NDb250
ZXh0KCkuc3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZmlsbEVsbGlwc2UoKnBsYXRmb3JtQ29udGV4
dCgpLCByZWN0LCBzdGF0ZS5maWxsQ29sb3IsIHN0YXRlLnN0cm9rZVN0eWxlLCBzdGF0ZS5zdHJv
a2VDb2xvciwgc3RhdGUuc3Ryb2tlVGhpY2tuZXNzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHRJbXBsRGlyZWN0MkQ6OmRyYXdQYXRoKGNvbnN0IFBhdGgmKQoreworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBQYXRoJiBwYXRoLCBm
bG9hdCB3aWR0aCwgZmxvYXQgb2Zmc2V0LCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgVU5V
U0VEX1BBUkFNKG9mZnNldCk7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgVmVjdG9yPEZsb2F0
UmVjdD4mIHJlY3RzLCBmbG9hdCB3aWR0aCwgZmxvYXQgb2Zmc2V0LCBjb25zdCBDb2xvciYgY29s
b3IpCit7CisgICAgVU5VU0VEX1BBUkFNKG9mZnNldCk7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnNhdmUoKQoreworICAgIERp
cmVjdDJEOjpzYXZlKG1fcGxhdGZvcm1Db250ZXh0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHRJbXBsRGlyZWN0MkQ6OnJlc3RvcmUoKQoreworICAgIERpcmVjdDJEOjpyZXN0b3JlKG1fcGxh
dGZvcm1Db250ZXh0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnRy
YW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIERpcmVjdDJEOjp0cmFuc2xhdGUobV9w
bGF0Zm9ybUNvbnRleHQsIHgsIHkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJl
Y3QyRDo6cm90YXRlKGZsb2F0IGFuZ2xlSW5SYWRpYW5zKQoreworICAgIERpcmVjdDJEOjpyb3Rh
dGUobV9wbGF0Zm9ybUNvbnRleHQsIGFuZ2xlSW5SYWRpYW5zKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHRJbXBsRGlyZWN0MkQ6OnNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAg
ICBEaXJlY3QyRDo6c2NhbGUobV9wbGF0Zm9ybUNvbnRleHQsIHNpemUpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9y
bSYgdHJhbnNmb3JtKQoreworICAgIERpcmVjdDJEOjpjb25jYXRDVE0obV9wbGF0Zm9ybUNvbnRl
eHQsIHRyYW5zZm9ybSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpz
ZXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCit7CisgICAgRGlyZWN0MkQ6
OlN0YXRlOjpzZXRDVE0obV9wbGF0Zm9ybUNvbnRleHQsIHRyYW5zZm9ybSk7Cit9CisKK0FmZmlu
ZVRyYW5zZm9ybSBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmdldENUTShHcmFwaGljc0Nv
bnRleHQ6OkluY2x1ZGVEZXZpY2VTY2FsZSkKK3sKKyAgICByZXR1cm4gRGlyZWN0MkQ6OlN0YXRl
OjpnZXRDVE0obV9wbGF0Zm9ybUNvbnRleHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dElt
cGxEaXJlY3QyRDo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9hdCBvcGFjaXR5KQoreworICAg
IERpcmVjdDJEOjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKG1fcGxhdGZvcm1Db250ZXh0LCBvcGFj
aXR5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmVuZFRyYW5zcGFy
ZW5jeUxheWVyKCkKK3sKKyAgICBEaXJlY3QyRDo6ZW5kVHJhbnNwYXJlbmN5TGF5ZXIobV9wbGF0
Zm9ybUNvbnRleHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6Y2xp
cChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgRGlyZWN0MkQ6OmNsaXAobV9wbGF0Zm9y
bUNvbnRleHQsIHJlY3QpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6
Y2xpcE91dChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgRGlyZWN0MkQ6OmNsaXBPdXQo
bV9wbGF0Zm9ybUNvbnRleHQsIHJlY3QpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxE
aXJlY3QyRDo6Y2xpcE91dChjb25zdCBQYXRoJiBwYXRoKQoreworICAgIERpcmVjdDJEOjpjbGlw
T3V0KG1fcGxhdGZvcm1Db250ZXh0LCBwYXRoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJ
bXBsRGlyZWN0MkQ6OmNsaXBQYXRoKGNvbnN0IFBhdGgmIHBhdGgsIFdpbmRSdWxlIGNsaXBSdWxl
KQoreworICAgIERpcmVjdDJEOjpjbGlwUGF0aChtX3BsYXRmb3JtQ29udGV4dCwgcGF0aCwgY2xp
cFJ1bGUpOworfQorCitJbnRSZWN0IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6Y2xpcEJv
dW5kcygpCit7CisgICAgcmV0dXJuIERpcmVjdDJEOjpTdGF0ZTo6Z2V0Q2xpcEJvdW5kcyhtX3Bs
YXRmb3JtQ29udGV4dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpj
bGlwVG9JbWFnZUJ1ZmZlcihJbWFnZUJ1ZmZlciYgYnVmZmVyLCBjb25zdCBGbG9hdFJlY3QmIGRl
c3RSZWN0KQoreworICAgIFJlZlB0cjxJbWFnZT4gaW1hZ2UgPSBidWZmZXIuY29weUltYWdlKERv
bnRDb3B5QmFja2luZ1N0b3JlKTsKKyAgICBpZiAoIWltYWdlKQorICAgICAgICByZXR1cm47CisK
KworICAgIGlmIChhdXRvIHN1cmZhY2UgPSBpbWFnZS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJh
bWUoKSkKKyAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHRJbXBsRGlyZWN0MkQ6OmFwcGx5RGV2aWNlU2NhbGVGYWN0b3IoZmxvYXQpCit7Cit9CisKK0Zs
b2F0UmVjdCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnJvdW5kVG9EZXZpY2VQaXhlbHMo
Y29uc3QgRmxvYXRSZWN0JiByZWN0LCBHcmFwaGljc0NvbnRleHQ6OlJvdW5kaW5nTW9kZSkKK3sK
KyAgICByZXR1cm4gRGlyZWN0MkQ6OlN0YXRlOjpyb3VuZFRvRGV2aWNlUGl4ZWxzKG1fcGxhdGZv
cm1Db250ZXh0LCByZWN0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gVVNFKERJUkVDVDJEKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0dyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQu
aAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI3By
YWdtYSBvbmNlCisKKyNpZiBVU0UoRElSRUNUMkQpCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHRJbXBsLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQ7CisKK2NsYXNzIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRCBmaW5hbCA6IHB1
YmxpYyBHcmFwaGljc0NvbnRleHRJbXBsIHsKK3B1YmxpYzoKKyAgICBXRUJDT1JFX0VYUE9SVCBz
dGF0aWMgR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHRJbXBsRmFjdG9yeSBjcmVhdGVG
YWN0b3J5KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJik7CisgICAgV0VCQ09SRV9FWFBPUlQgc3Rh
dGljIEdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0SW1wbEZhY3RvcnkgY3JlYXRlRmFj
dG9yeShJRDJEMVJlbmRlclRhcmdldCopOworCisgICAgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVj
dDJEKEdyYXBoaWNzQ29udGV4dCYsIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJik7CisgICAgR3Jh
cGhpY3NDb250ZXh0SW1wbERpcmVjdDJEKEdyYXBoaWNzQ29udGV4dCYsIElEMkQxUmVuZGVyVGFy
Z2V0Kik7CisgICAgdmlydHVhbCB+R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEKCk7CisKKyAg
ICBib29sIGhhc1BsYXRmb3JtQ29udGV4dCgpIGNvbnN0IG92ZXJyaWRlOworICAgIFBsYXRmb3Jt
Q29udGV4dERpcmVjdDJEKiBwbGF0Zm9ybUNvbnRleHQoKSBjb25zdCBvdmVycmlkZTsKKworICAg
IHZvaWQgdXBkYXRlU3RhdGUoY29uc3QgR3JhcGhpY3NDb250ZXh0U3RhdGUmLCBHcmFwaGljc0Nv
bnRleHRTdGF0ZTo6U3RhdGVDaGFuZ2VGbGFncykgb3ZlcnJpZGU7CisgICAgdm9pZCBjbGVhclNo
YWRvdygpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRMaW5lQ2FwKExpbmVDYXApIG92ZXJyaWRl
OworICAgIHZvaWQgc2V0TGluZURhc2goY29uc3QgRGFzaEFycmF5JiwgZmxvYXQpIG92ZXJyaWRl
OworICAgIHZvaWQgc2V0TGluZUpvaW4oTGluZUpvaW4pIG92ZXJyaWRlOworICAgIHZvaWQgc2V0
TWl0ZXJMaW1pdChmbG9hdCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGZpbGxSZWN0KGNvbnN0IEZs
b2F0UmVjdCYpIG92ZXJyaWRlOworICAgIHZvaWQgZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0Jiwg
Y29uc3QgQ29sb3ImKSBvdmVycmlkZTsKKyAgICB2b2lkIGZpbGxSZWN0KGNvbnN0IEZsb2F0UmVj
dCYsIEdyYWRpZW50Jikgb3ZlcnJpZGU7CisgICAgdm9pZCBmaWxsUmVjdChjb25zdCBGbG9hdFJl
Y3QmLCBjb25zdCBDb2xvciYsIENvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUpIG92ZXJyaWRl
OworICAgIHZvaWQgZmlsbFJvdW5kZWRSZWN0KGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmLCBjb25z
dCBDb2xvciYsIEJsZW5kTW9kZSkgb3ZlcnJpZGU7CisgICAgdm9pZCBmaWxsUmVjdFdpdGhSb3Vu
ZGVkSG9sZShjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiwgY29uc3Qg
Q29sb3ImKSBvdmVycmlkZTsKKyAgICB2b2lkIGZpbGxQYXRoKGNvbnN0IFBhdGgmKSBvdmVycmlk
ZTsKKyAgICB2b2lkIGZpbGxFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYpIG92ZXJyaWRlOworICAg
IHZvaWQgc3Ryb2tlUmVjdChjb25zdCBGbG9hdFJlY3QmLCBmbG9hdCkgb3ZlcnJpZGU7CisgICAg
dm9pZCBzdHJva2VQYXRoKGNvbnN0IFBhdGgmKSBvdmVycmlkZTsKKyAgICB2b2lkIHN0cm9rZUVs
bGlwc2UoY29uc3QgRmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisgICAgdm9pZCBjbGVhclJlY3QoY29u
c3QgRmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGRyYXdHbHlwaHMoY29uc3QgRm9u
dCYsIGNvbnN0IEdseXBoQnVmZmVyJiwgdW5zaWduZWQsIHVuc2lnbmVkLCBjb25zdCBGbG9hdFBv
aW50JiwgRm9udFNtb290aGluZ01vZGUpIG92ZXJyaWRlOworCisgICAgSW1hZ2VEcmF3UmVzdWx0
IGRyYXdJbWFnZShJbWFnZSYsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZsb2F0UmVjdCYsIGNv
bnN0IEltYWdlUGFpbnRpbmdPcHRpb25zJikgb3ZlcnJpZGU7CisgICAgSW1hZ2VEcmF3UmVzdWx0
IGRyYXdUaWxlZEltYWdlKEltYWdlJiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRQb2lu
dCYsIGNvbnN0IEZsb2F0U2l6ZSYsIGNvbnN0IEZsb2F0U2l6ZSYsIGNvbnN0IEltYWdlUGFpbnRp
bmdPcHRpb25zJikgb3ZlcnJpZGU7CisgICAgSW1hZ2VEcmF3UmVzdWx0IGRyYXdUaWxlZEltYWdl
KEltYWdlJiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRT
aXplJiwgSW1hZ2U6OlRpbGVSdWxlLCBJbWFnZTo6VGlsZVJ1bGUsIGNvbnN0IEltYWdlUGFpbnRp
bmdPcHRpb25zJikgb3ZlcnJpZGU7CisgICAgdm9pZCBkcmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0
aXZlSW1hZ2VQdHImLCBjb25zdCBGbG9hdFNpemUmLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBG
bG9hdFJlY3QmLCBDb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0aW9u
KSBvdmVycmlkZTsKKyAgICB2b2lkIGRyYXdQYXR0ZXJuKEltYWdlJiwgY29uc3QgRmxvYXRSZWN0
JiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgY29uc3QgRmxvYXRQ
b2ludCYsIGNvbnN0IEZsb2F0U2l6ZSYsIENvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUgPSBC
bGVuZE1vZGU6Ok5vcm1hbCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGRyYXdSZWN0KGNvbnN0IEZs
b2F0UmVjdCYsIGZsb2F0KSBvdmVycmlkZTsKKyAgICB2b2lkIGRyYXdMaW5lKGNvbnN0IEZsb2F0
UG9pbnQmLCBjb25zdCBGbG9hdFBvaW50Jikgb3ZlcnJpZGU7CisgICAgdm9pZCBkcmF3TGluZXNG
b3JUZXh0KGNvbnN0IEZsb2F0UG9pbnQmLCBmbG9hdCB0aGlja25lc3MsIGNvbnN0IERhc2hBcnJh
eSYsIGJvb2wsIGJvb2wpIG92ZXJyaWRlOworICAgIHZvaWQgZHJhd0RvdHNGb3JEb2N1bWVudE1h
cmtlcihjb25zdCBGbG9hdFJlY3QmLCBEb2N1bWVudE1hcmtlckxpbmVTdHlsZSkgb3ZlcnJpZGU7
CisgICAgdm9pZCBkcmF3RWxsaXBzZShjb25zdCBGbG9hdFJlY3QmKSBvdmVycmlkZTsKKyAgICB2
b2lkIGRyYXdQYXRoKGNvbnN0IFBhdGgmKSBvdmVycmlkZTsKKworICAgIHZvaWQgZHJhd0ZvY3Vz
UmluZyhjb25zdCBQYXRoJiwgZmxvYXQsIGZsb2F0LCBjb25zdCBDb2xvciYpIG92ZXJyaWRlOwor
ICAgIHZvaWQgZHJhd0ZvY3VzUmluZyhjb25zdCBWZWN0b3I8RmxvYXRSZWN0PiYsIGZsb2F0LCBm
bG9hdCwgY29uc3QgQ29sb3ImKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2F2ZSgpIG92ZXJyaWRl
OworICAgIHZvaWQgcmVzdG9yZSgpIG92ZXJyaWRlOworCisgICAgdm9pZCB0cmFuc2xhdGUoZmxv
YXQsIGZsb2F0KSBvdmVycmlkZTsKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCkgb3ZlcnJpZGU7Cisg
ICAgdm9pZCBzY2FsZShjb25zdCBGbG9hdFNpemUmKSBvdmVycmlkZTsKKyAgICB2b2lkIGNvbmNh
dENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mKSBvdmVycmlkZTsKKyAgICB2b2lkIHNldENUTShj
b25zdCBBZmZpbmVUcmFuc2Zvcm0mKSBvdmVycmlkZTsKKyAgICBBZmZpbmVUcmFuc2Zvcm0gZ2V0
Q1RNKEdyYXBoaWNzQ29udGV4dDo6SW5jbHVkZURldmljZVNjYWxlKSBvdmVycmlkZTsKKworICAg
IHZvaWQgYmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9hdCkgb3ZlcnJpZGU7CisgICAgdm9pZCBl
bmRUcmFuc3BhcmVuY3lMYXllcigpIG92ZXJyaWRlOworCisgICAgdm9pZCBjbGlwKGNvbnN0IEZs
b2F0UmVjdCYpIG92ZXJyaWRlOworICAgIHZvaWQgY2xpcE91dChjb25zdCBGbG9hdFJlY3QmKSBv
dmVycmlkZTsKKyAgICB2b2lkIGNsaXBPdXQoY29uc3QgUGF0aCYpIG92ZXJyaWRlOworICAgIHZv
aWQgY2xpcFBhdGgoY29uc3QgUGF0aCYsIFdpbmRSdWxlKSBvdmVycmlkZTsKKyAgICBJbnRSZWN0
IGNsaXBCb3VuZHMoKSBvdmVycmlkZTsKKyAgICB2b2lkIGNsaXBUb0ltYWdlQnVmZmVyKEltYWdl
QnVmZmVyJiwgY29uc3QgRmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisgICAgCisgICAgdm9pZCBhcHBs
eURldmljZVNjYWxlRmFjdG9yKGZsb2F0KSBvdmVycmlkZTsKKworICAgIEZsb2F0UmVjdCByb3Vu
ZFRvRGV2aWNlUGl4ZWxzKGNvbnN0IEZsb2F0UmVjdCYsIEdyYXBoaWNzQ29udGV4dDo6Um91bmRp
bmdNb2RlKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UGxhdGZv
cm1Db250ZXh0RGlyZWN0MkQ+IG1fb3duZWRQbGF0Zm9ybUNvbnRleHQ7CisgICAgUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQmIG1fcGxhdGZvcm1Db250ZXh0OworCisgICAgc3RkOjp1bmlxdWVfcHRy
PEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZT4gbV9wcml2YXRlOworfTsKKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKERJUkVDVDJEKQpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZURpcmVjdDJELmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURpcmVjdDJELmgJKHJldmlz
aW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
Nyw2ICsyNyw3IEBACiAKICNpbmNsdWRlICJDT01QdHIuaCIKICNpbmNsdWRlICJDb2xvci5oIgor
I2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCiAjaW5jbHVkZSA8ZDJkMS5oPgog
I2luY2x1ZGUgPGQyZDFfMS5oPgogI2luY2x1ZGUgPGQyZDFlZmZlY3RzLmg+CkBAIC0zOSwxMCAr
NDAsMTAgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlIHsKICAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKIHB1YmxpYzoKLSAgICBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoSUQyRDFSZW5kZXJUYXJnZXQqLCBHcmFwaGlj
c0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlKTsKKyAgICBHcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBHcmFwaGljc0NvbnRl
eHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlKTsKICAgICB+R3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlKCk7CiAKLSAgICBlbnVtIERpcmVjdDJETGF5ZXJUeXBlIHsgQXhpc0FsaWdu
ZWRDbGlwLCBMYXllckNsaXAgfTsKKyAgICB2b2lkIHN5bmNDb250ZXh0KFBsYXRmb3JtQ29udGV4
dERpcmVjdDJEJik7CiAKICAgICB2b2lkIGJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoZmxvYXQgb3Bh
Y2l0eSk7CiAgICAgdm9pZCBlbmRUcmFuc3BhcmVuY3lMYXllcigpOwpAQCAtNzMsMjIgKzc0LDEx
IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldERhc2hlcyhjb25zdCBEYXNoQXJyYXkmKTsKICAgICB2
b2lkIHNldEFscGhhKGZsb2F0KTsKIAorICAgIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEKiBwbGF0
Zm9ybUNvbnRleHQoKSB7IHJldHVybiAmbV9wbGF0Zm9ybUNvbnRleHQ7IH0KICAgICBJRDJEMVJl
bmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KCk7Ci0gICAgSUQyRDFMYXllciogY2xpcExheWVyKCkg
Y29uc3QgeyByZXR1cm4gbV9yZW5kZXJTdGF0ZXMubGFzdCgpLm1fYWN0aXZlTGF5ZXIuZ2V0KCk7
IH0KLSAgICBJRDJEMVN0cm9rZVN0eWxlKiBzdHJva2VTdHlsZSgpOwotCi0gICAgQ09NUHRyPElE
MkQxU29saWRDb2xvckJydXNoPiBicnVzaFdpdGhDb2xvcihjb25zdCBEMkQxX0NPTE9SX0YmKTsK
IAogICAgIEhEQyBtX2hkYyB7IG51bGxwdHIgfTsKLSAgICBEMkQxX0JMRU5EX01PREUgbV9ibGVu
ZE1vZGUgeyBEMkQxX0JMRU5EX01PREVfTVVMVElQTFkgfTsKLSAgICBEMkQxX0NPTVBPU0lURV9N
T0RFIG1fY29tcG9zaXRlTW9kZSB7IEQyRDFfQ09NUE9TSVRFX01PREVfU09VUkNFX09WRVIgfTsK
ICAgICBib29sIG1fc2hvdWxkSW5jbHVkZUNoaWxkV2luZG93cyB7IGZhbHNlIH07Ci0gICAgYm9v
bCBtX3N0cm9rZVN5bGVJc0RpcnR5IHsgZmFsc2UgfTsKLQotICAgIENPTVB0cjxJRDJEMVNvbGlk
Q29sb3JCcnVzaD4gbV9zb2xpZFN0cm9rZUJydXNoOwotICAgIENPTVB0cjxJRDJEMVNvbGlkQ29s
b3JCcnVzaD4gbV9zb2xpZEZpbGxCcnVzaDsKLSAgICBDT01QdHI8SUQyRDFCaXRtYXBCcnVzaD4g
bV9wYXR0ZXJuU3Ryb2tlQnJ1c2g7Ci0gICAgQ09NUHRyPElEMkQxQml0bWFwQnJ1c2g+IG1fcGF0
dGVybkZpbGxCcnVzaDsKIAogICAgIGZsb2F0IGN1cnJlbnRHbG9iYWxBbHBoYSgpIGNvbnN0Owog
CkBAIC05Nyw0NCArODcsMTUgQEAgcHVibGljOgogcHJpdmF0ZToKICAgICB2b2lkIHJlY29tcHV0
ZVN0cm9rZVN0eWxlKCk7CiAKKyAgICBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgbV9wbGF0Zm9y
bUNvbnRleHQ7CiAgICAgQ09NUHRyPElEMkQxUmVuZGVyVGFyZ2V0PiBtX3JlbmRlclRhcmdldDsK
ICAgICBjb25zdCBHcmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlIG1f
cmVuZGVyZXJUeXBlOwotICAgIEhhc2hNYXA8dWludDMyX3QsIENPTVB0cjxJRDJEMVNvbGlkQ29s
b3JCcnVzaD4+IG1fc29saWRDb2xvcmVkQnJ1c2hDYWNoZTsKLSAgICBDT01QdHI8SUQyRDFTb2xp
ZENvbG9yQnJ1c2g+IG1fd2hpdGVCcnVzaDsKLSAgICBDT01QdHI8SUQyRDFTb2xpZENvbG9yQnJ1
c2g+IG1femVyb0JydXNoOwotICAgIENPTVB0cjxJRDJEMVN0cm9rZVN0eWxlPiBtX2QyZFN0cm9r
ZVN0eWxlOwotCi0gICAgc3RydWN0IFJlbmRlclN0YXRlIHsKLSAgICAgICAgQ09NUHRyPElEMkQx
RHJhd2luZ1N0YXRlQmxvY2s+IG1fZHJhd2luZ1N0YXRlQmxvY2s7Ci0gICAgICAgIENPTVB0cjxJ
RDJEMUxheWVyPiBtX2FjdGl2ZUxheWVyOwotICAgICAgICBWZWN0b3I8RGlyZWN0MkRMYXllclR5
cGU+IG1fY2xpcHM7Ci0gICAgfTsKLQotICAgIFZlY3RvcjxSZW5kZXJTdGF0ZT4gbV9yZW5kZXJT
dGF0ZXM7Ci0KLSAgICBzdHJ1Y3QgVHJhbnNwYXJlbmN5TGF5ZXJTdGF0ZSB7Ci0gICAgICAgIENP
TVB0cjxJRDJEMUJpdG1hcFJlbmRlclRhcmdldD4gcmVuZGVyVGFyZ2V0OwotICAgICAgICBDb2xv
ciBzaGFkb3dDb2xvcjsKLSAgICAgICAgRmxvYXRTaXplIHNoYWRvd09mZnNldDsKLSAgICAgICAg
ZmxvYXQgb3BhY2l0eSB7IDEuMCB9OwotICAgICAgICBmbG9hdCBzaGFkb3dCbHVyIHsgMCB9Owot
ICAgICAgICBib29sIGhhc1NoYWRvdyB7IGZhbHNlIH07Ci0gICAgfTsKLSAgICBWZWN0b3I8VHJh
bnNwYXJlbmN5TGF5ZXJTdGF0ZT4gbV90cmFuc3BhcmVuY3lMYXllclN0YWNrOwotCi0gICAgRDJE
MV9DQVBfU1RZTEUgbV9saW5lQ2FwIHsgRDJEMV9DQVBfU1RZTEVfRkxBVCB9OwotICAgIEQyRDFf
TElORV9KT0lOIG1fbGluZUpvaW4geyBEMkQxX0xJTkVfSk9JTl9NSVRFUiB9OwotICAgIFN0cm9r
ZVN0eWxlIG1fc3Ryb2tlU3R5bGUgeyBTb2xpZFN0cm9rZSB9OwotICAgIERhc2hBcnJheSBtX2Rh
c2hlczsKIAogICAgIHVuc2lnbmVkIGJlZ2luRHJhd0NvdW50IHsgMCB9OwogCi0gICAgZmxvYXQg
bV9taXRlckxpbWl0IHsgMTAuMGYgfTsKLSAgICBmbG9hdCBtX2Rhc2hPZmZzZXQgeyAwIH07Ci0g
ICAgZmxvYXQgbV9wYXR0ZXJuV2lkdGggeyAxLjBmIH07Ci0gICAgZmxvYXQgbV9wYXR0ZXJuT2Zm
c2V0IHsgMCB9OwotICAgIGZsb2F0IG1fc3Ryb2tlVGhpY2tuZXNzIHsgMCB9OwogICAgIGZsb2F0
IG1fYWxwaGEgeyAxLjAgfTsKKworICAgIGZyaWVuZCBjbGFzcyBEMkRDb250ZXh0U3RhdGVTYXZl
cjsKIH07CiAKIGNsYXNzIEQyRENvbnRleHRTdGF0ZVNhdmVyIHsKQEAgLTE0NCwyNiArMTA1LDI2
IEBAIHB1YmxpYzoKICAgICAgICAgLCBtX3NhdmVBbmRSZXN0b3JlKHNhdmVBbmRSZXN0b3JlKQog
ICAgIHsKICAgICAgICAgaWYgKG1fc2F2ZUFuZFJlc3RvcmUpCi0gICAgICAgICAgICBtX2NvbnRl
eHQuc2F2ZSgpOworICAgICAgICAgICAgbV9jb250ZXh0Lm1fcGxhdGZvcm1Db250ZXh0LnNhdmUo
KTsKICAgICB9CiAKICAgICB+RDJEQ29udGV4dFN0YXRlU2F2ZXIoKQogICAgIHsKICAgICAgICAg
aWYgKG1fc2F2ZUFuZFJlc3RvcmUpCi0gICAgICAgICAgICBtX2NvbnRleHQucmVzdG9yZSgpOwor
ICAgICAgICAgICAgbV9jb250ZXh0Lm1fcGxhdGZvcm1Db250ZXh0LnJlc3RvcmUoKTsKICAgICB9
CiAKICAgICB2b2lkIHNhdmUoKQogICAgIHsKICAgICAgICAgQVNTRVJUKCFtX3NhdmVBbmRSZXN0
b3JlKTsKLSAgICAgICAgbV9jb250ZXh0LnNhdmUoKTsKKyAgICAgICAgbV9jb250ZXh0Lm1fcGxh
dGZvcm1Db250ZXh0LnNhdmUoKTsKICAgICAgICAgbV9zYXZlQW5kUmVzdG9yZSA9IHRydWU7CiAg
ICAgfQogCiAgICAgdm9pZCByZXN0b3JlKCkKICAgICB7CiAgICAgICAgIEFTU0VSVChtX3NhdmVB
bmRSZXN0b3JlKTsKLSAgICAgICAgbV9jb250ZXh0LnJlc3RvcmUoKTsKKyAgICAgICAgbV9jb250
ZXh0Lm1fcGxhdGZvcm1Db250ZXh0LnJlc3RvcmUoKTsKICAgICAgICAgbV9zYXZlQW5kUmVzdG9y
ZSA9IGZhbHNlOwogICAgIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ltYWdlQnVmZmVyRGF0YURpcmVjdDJELmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQnVmZmVyRGF0YURpcmVjdDJELmgJKHJl
dmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9J
bWFnZUJ1ZmZlckRhdGFEaXJlY3QyRC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMiwxNiArMzIsMTcg
QEAKICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CiAjaW5jbHVkZSA8d3RmL1JldGFpblB0ci5oPgog
Ci1pbnRlcmZhY2UgSUQyRDFSZW5kZXJUYXJnZXQ7Ci0KIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAor
Y2xhc3MgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ7CisKIHN0cnVjdCBJbWFnZUJ1ZmZlckRhdGEg
ewogICAgIEludFNpemUgYmFja2luZ1N0b3JlU2l6ZTsKICAgICBDaGVja2VkPHVuc2lnbmVkLCBS
ZWNvcmRPdmVyZmxvdz4gYnl0ZXNQZXJSb3c7CiAKICAgICAvLyBPbmx5IGZvciBzb2Z0d2FyZSBJ
bWFnZUJ1ZmZlcnMuCiAgICAgVmVjdG9yPGNoYXI+IGRhdGE7CisgICAgc3RkOjp1bmlxdWVfcHRy
PFBsYXRmb3JtQ29udGV4dERpcmVjdDJEPiBwbGF0Zm9ybUNvbnRleHQ7CiAgICAgc3RkOjp1bmlx
dWVfcHRyPEdyYXBoaWNzQ29udGV4dD4gY29udGV4dDsKICAgICBDT01QdHI8SVdJQ0JpdG1hcD4g
Yml0bWFwU291cmNlOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vSW1hZ2VCdWZmZXJEaXJlY3QyRC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQnVmZmVyRGlyZWN0MkQuY3BwCShyZXZpc2lvbiAy
NDgwMDgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VCdWZm
ZXJEaXJlY3QyRC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29w
eXJpZ2h0IChDKSAyMDE2LTIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog
Q29weXJpZ2h0IChDKSAyMDE2LTIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgog
ICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zMCwxMiArMzAsMTQgQEAKIAogI2lu
Y2x1ZGUgIkJpdG1hcEltYWdlLmgiCiAjaW5jbHVkZSAiQ09NUHRyLmgiCisjaW5jbHVkZSAiRGly
ZWN0MkRVdGlsaXRpZXMuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRl
ICJJbWFnZURhdGEuaCIKICNpbmNsdWRlICJJbWFnZURlY29kZXJEaXJlY3QyRC5oIgogI2luY2x1
ZGUgIkludFJlY3QuaCIKICNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAi
Tm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oIgog
I2luY2x1ZGUgPGQyZDEuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8d2luY29kZWMu
aD4KQEAgLTEwMSwyMSArMTAzLDE3IEBAIEltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlcihjb25zdCBG
bG9hdFNpemUKIAogICAgIG1fZGF0YS5kYXRhID0gVmVjdG9yPGNoYXI+KG51bUJ5dGVzLnVuc2Fm
ZUdldCgpLCAwKTsKIAotICAgIEhSRVNVTFQgaHIgPSBJbWFnZURlY29kZXJEaXJlY3QyRDo6c3lz
dGVtSW1hZ2luZ0ZhY3RvcnkoKS0+Q3JlYXRlQml0bWFwRnJvbU1lbW9yeShtX3NpemUud2lkdGgo
KSwgbV9zaXplLmhlaWdodCgpLCBHVUlEX1dJQ1BpeGVsRm9ybWF0MzJicHBQQkdSQSwgc3RhdGlj
X2Nhc3Q8VUlOVD4obV9kYXRhLmJ5dGVzUGVyUm93LnVuc2FmZUdldCgpKSwgc3RhdGljX2Nhc3Q8
VUlOVD4obnVtQnl0ZXMudW5zYWZlR2V0KCkpLCByZWludGVycHJldF9jYXN0PEJZVEUqPihtX2Rh
dGEuZGF0YS5kYXRhKCkpLCAmbV9kYXRhLmJpdG1hcFNvdXJjZSk7Ci0gICAgaWYgKCFTVUNDRUVE
RUQoaHIpKQorICAgIG1fZGF0YS5iaXRtYXBTb3VyY2UgPSBEaXJlY3QyRDo6Y3JlYXRlRGlyZWN0
MkRJbWFnZVN1cmZhY2VXaXRoRGF0YShtX2RhdGEuZGF0YS5kYXRhKCksIG1fc2l6ZSwgbV9kYXRh
LmJ5dGVzUGVyUm93LnVuc2FmZUdldCgpKTsKKyAgICBpZiAoIW1fZGF0YS5iaXRtYXBTb3VyY2Up
CiAgICAgICAgIHJldHVybjsKIAotICAgIGF1dG8gdGFyZ2V0UHJvcGVydGllcyA9IEQyRDE6OlJl
bmRlclRhcmdldFByb3BlcnRpZXMoRDJEMV9SRU5ERVJfVEFSR0VUX1RZUEVfREVGQVVMVCwKLSAg
ICAgICAgRDJEMTo6UGl4ZWxGb3JtYXQoRFhHSV9GT1JNQVRfQjhHOFI4QThfVU5PUk0sIEQyRDFf
QUxQSEFfTU9ERV9QUkVNVUxUSVBMSUVEKSwKLSAgICAgICAgMCwgMCwgRDJEMV9SRU5ERVJfVEFS
R0VUX1VTQUdFX05PTkUsIEQyRDFfRkVBVFVSRV9MRVZFTF9ERUZBVUxUKTsKLQotICAgIENPTVB0
cjxJRDJEMVJlbmRlclRhcmdldD4gYml0bWFwQ29udGV4dDsKLSAgICBociA9IEdyYXBoaWNzQ29u
dGV4dDo6c3lzdGVtRmFjdG9yeSgpLT5DcmVhdGVXaWNCaXRtYXBSZW5kZXJUYXJnZXQobV9kYXRh
LmJpdG1hcFNvdXJjZS5nZXQoKSwgJnRhcmdldFByb3BlcnRpZXMsICZiaXRtYXBDb250ZXh0KTsK
LSAgICBpZiAoIWJpdG1hcENvbnRleHQgfHwgIVNVQ0NFRURFRChocikpCisgICAgQ09NUHRyPElE
MkQxUmVuZGVyVGFyZ2V0PiBiaXRtYXBDb250ZXh0ID0gRGlyZWN0MkQ6OmNyZWF0ZVJlbmRlclRh
cmdldEZyb21XSUNCaXRtYXAobV9kYXRhLmJpdG1hcFNvdXJjZS5nZXQoKSk7CisgICAgaWYgKCFi
aXRtYXBDb250ZXh0KQogICAgICAgICByZXR1cm47CiAKICAgICAvLyBOb3RlOiBUaGlzIHBsYWNl
cyB0aGUgYml0bWFwY29udGV4dCBpbnRvIGEgbG9ja2VkIHN0YXRlIGJlY2F1c2Ugb2YgdGhlIEJl
Z2luRHJhdyBjYWxsIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICBtX2RhdGEuY29udGV4dCA9IHN0
ZDo6bWFrZV91bmlxdWU8R3JhcGhpY3NDb250ZXh0PihiaXRtYXBDb250ZXh0LmdldCgpKTsKKyAg
ICBtX2RhdGEucGxhdGZvcm1Db250ZXh0ID0gc3RkOjptYWtlX3VuaXF1ZTxQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRD4oYml0bWFwQ29udGV4dC5nZXQoKSk7CisgICAgbV9kYXRhLmNvbnRleHQgPSBz
dGQ6Om1ha2VfdW5pcXVlPEdyYXBoaWNzQ29udGV4dD4obV9kYXRhLnBsYXRmb3JtQ29udGV4dC5n
ZXQoKSwgR3JhcGhpY3NDb250ZXh0OjpCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZTo6R1BVTWVt
b3J5KTsKIAogICAgIHN1Y2Nlc3MgPSB0cnVlOwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL05hdGl2ZUltYWdlRGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9OYXRpdmVJbWFnZURpcmVjdDJE
LmNwcAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL05hdGl2ZUltYWdlRGlyZWN0MkQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICsz
Miw3IEBACiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSW50U2l6ZS5o
IgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQuaCIKICNpbmNsdWRlIDxkMmQxLmg+CiAjaW5jbHVkZSA8d2luY29kZWMuaD4KIApA
QCAtMTE2LDExICsxMTcsMTEgQEAgdm9pZCBkcmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0aXZlSW1h
Z2VQdAogICAgIGZsb2F0IG9wYWNpdHkgPSAxLjBmOwogCiAgICAgQ09NUHRyPElEMkQxQml0bWFw
PiBiaXRtYXA7Ci0gICAgSFJFU1VMVCBociA9IHBsYXRmb3JtQ29udGV4dC0+Q3JlYXRlQml0bWFw
RnJvbVdpY0JpdG1hcChpbWFnZS5nZXQoKSwgJmJpdG1hcCk7CisgICAgSFJFU1VMVCBociA9IHBs
YXRmb3JtQ29udGV4dC0+cmVuZGVyVGFyZ2V0KCktPkNyZWF0ZUJpdG1hcEZyb21XaWNCaXRtYXAo
aW1hZ2UuZ2V0KCksICZiaXRtYXApOwogICAgIGlmICghU1VDQ0VFREVEKGhyKSkKICAgICAgICAg
cmV0dXJuOwogCi0gICAgcGxhdGZvcm1Db250ZXh0LT5EcmF3Qml0bWFwKGJpdG1hcC5nZXQoKSwg
ZGVzdFJlY3QsIG9wYWNpdHksIEQyRDFfQklUTUFQX0lOVEVSUE9MQVRJT05fTU9ERV9ORUFSRVNU
X05FSUdIQk9SLCBhZGp1c3RlZFNyY1JlY3QpOworICAgIHBsYXRmb3JtQ29udGV4dC0+cmVuZGVy
VGFyZ2V0KCktPkRyYXdCaXRtYXAoYml0bWFwLmdldCgpLCBkZXN0UmVjdCwgb3BhY2l0eSwgRDJE
MV9CSVRNQVBfSU5URVJQT0xBVElPTl9NT0RFX05FQVJFU1RfTkVJR0hCT1IsIGFkanVzdGVkU3Jj
UmVjdCk7CiAgICAgY29udGV4dC5mbHVzaCgpOwogfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vUGF0aERpcmVjdDJELmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUGF0aERpcmVjdDJELmNwcAkocmV2aXNp
b24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BhdGhE
aXJlY3QyRC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJJbnRSZWN0LmgiCiAjaW5jbHVkZSAiTm90SW1w
bGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oIgogI2luY2x1
ZGUgIlN0cm9rZVN0eWxlQXBwbGllci5oIgogI2luY2x1ZGUgPGQyZDEuaD4KICNpbmNsdWRlIDx3
dGYvTWF0aEV4dHJhcy5oPgpAQCAtMjQ5LDcgKzI1MCw4IEBAIGJvb2wgUGF0aDo6c3Ryb2tlQ29u
dGFpbnMoU3Ryb2tlU3R5bGVBcHAKIAogICAgIEFTU0VSVChhcHBsaWVyKTsKIAotICAgIEdyYXBo
aWNzQ29udGV4dCBzY3JhdGNoQ29udGV4dChzY3JhdGNoUmVuZGVyVGFyZ2V0KCksIEdyYXBoaWNz
Q29udGV4dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSk7CisgICAgUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQgc2NyYXRjaENvbnRleHREMkQoc2NyYXRjaFJlbmRlclRhcmdl
dCgpKTsKKyAgICBHcmFwaGljc0NvbnRleHQgc2NyYXRjaENvbnRleHQoJnNjcmF0Y2hDb250ZXh0
RDJELCBHcmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1v
cnkpOwogICAgIGFwcGxpZXItPnN0cm9rZVN0eWxlKCZzY3JhdGNoQ29udGV4dCk7CiAKICAgICBC
T09MIGNvbnRhaW5zUG9pbnQgPSBmYWxzZTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9QYXR0ZXJuRGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9QYXR0ZXJuRGlyZWN0MkQuY3BwCShyZXZpc2lv
biAyNDgwMDgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUGF0dGVy
bkRpcmVjdDJELmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVk
ZSAiQWZmaW5lVHJhbnNmb3JtLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaCIKICNpbmNsdWRlIDxkMmQxLmg+CiAjaW5j
bHVkZSA8d3RmL01haW5UaHJlYWQuaD4KIApAQCAtMzgsNiArMzksMTQgQEAgbmFtZXNwYWNlIFdl
YkNvcmUgewogCiBJRDJEMUJpdG1hcEJydXNoKiBQYXR0ZXJuOjpjcmVhdGVQbGF0Zm9ybVBhdHRl
cm4oY29uc3QgR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0LCBmbG9hdCBhbHBoYSwgY29uc3QgQWZm
aW5lVHJhbnNmb3JtJiB1c2VyU3BhY2VUcmFuc2Zvcm1hdGlvbikgY29uc3QKIHsKKyAgICBhdXRv
IHBsYXRmb3JtQ29udGV4dCA9IGNvbnRleHQucGxhdGZvcm1Db250ZXh0KCk7CisgICAgUkVMRUFT
RV9BU1NFUlQocGxhdGZvcm1Db250ZXh0KTsKKworICAgIHJldHVybiBjcmVhdGVQbGF0Zm9ybVBh
dHRlcm4oKnBsYXRmb3JtQ29udGV4dCwgYWxwaGEsIHVzZXJTcGFjZVRyYW5zZm9ybWF0aW9uKTsK
K30KKworSUQyRDFCaXRtYXBCcnVzaCogUGF0dGVybjo6Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKFBs
YXRmb3JtR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0LCBmbG9hdCBhbHBoYSwgY29uc3QgQWZmaW5l
VHJhbnNmb3JtJiB1c2VyU3BhY2VUcmFuc2Zvcm1hdGlvbikgY29uc3QKK3sKICAgICBBZmZpbmVU
cmFuc2Zvcm0gcGF0dGVyblRyYW5zZm9ybSA9IHVzZXJTcGFjZVRyYW5zZm9ybWF0aW9uICogbV9w
YXR0ZXJuU3BhY2VUcmFuc2Zvcm1hdGlvbjsKICAgICBhdXRvIGJpdG1hcEJydXNoUHJvcGVydGll
cyA9IEQyRDE6OkJpdG1hcEJydXNoUHJvcGVydGllcygpOwogICAgIGJpdG1hcEJydXNoUHJvcGVy
dGllcy5leHRlbmRNb2RlWCA9IG1fcmVwZWF0WCA/IEQyRDFfRVhURU5EX01PREVfV1JBUCA6IEQy
RDFfRVhURU5EX01PREVfQ0xBTVA7CkBAIC00OCwxOSArNTcsMTUgQEAgSUQyRDFCaXRtYXBCcnVz
aCogUGF0dGVybjo6Y3JlYXRlUGxhdGZvcgogICAgIGJydXNoUHJvcGVydGllcy5vcGFjaXR5ID0g
YWxwaGE7CiAKICAgICBhdXRvJiBwYXR0ZXJuSW1hZ2UgPSB0aWxlSW1hZ2UoKTsKLQotICAgIGF1
dG8gcGxhdGZvcm1Db250ZXh0ID0gY29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKTsKLSAgICBSRUxF
QVNFX0FTU0VSVChwbGF0Zm9ybUNvbnRleHQpOwotCi0gICAgYXV0byBuYXRpdmVJbWFnZSA9IHBh
dHRlcm5JbWFnZS5uYXRpdmVJbWFnZSgmY29udGV4dCk7CisgICAgYXV0byBuYXRpdmVJbWFnZSA9
IHBhdHRlcm5JbWFnZS5uYXRpdmVJbWFnZShudWxscHRyKTsKIAogICAgIENPTVB0cjxJRDJEMUJp
dG1hcD4gYml0bWFwOwotICAgIEhSRVNVTFQgaHIgPSBwbGF0Zm9ybUNvbnRleHQtPkNyZWF0ZUJp
dG1hcEZyb21XaWNCaXRtYXAobmF0aXZlSW1hZ2UuZ2V0KCksICZiaXRtYXApOworICAgIEhSRVNV
TFQgaHIgPSBjb250ZXh0LnJlbmRlclRhcmdldCgpLT5DcmVhdGVCaXRtYXBGcm9tV2ljQml0bWFw
KG5hdGl2ZUltYWdlLmdldCgpLCAmYml0bWFwKTsKICAgICBpZiAoIVNVQ0NFRURFRChocikpCiAg
ICAgICAgIHJldHVybiBudWxscHRyOwogCiAgICAgSUQyRDFCaXRtYXBCcnVzaCogcGF0dGVybkJy
dXNoID0gbnVsbHB0cjsKLSAgICBociA9IHBsYXRmb3JtQ29udGV4dC0+Q3JlYXRlQml0bWFwQnJ1
c2goYml0bWFwLmdldCgpLCAmYml0bWFwQnJ1c2hQcm9wZXJ0aWVzLCAmYnJ1c2hQcm9wZXJ0aWVz
LCAmcGF0dGVybkJydXNoKTsKKyAgICBociA9IGNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkNyZWF0
ZUJpdG1hcEJydXNoKGJpdG1hcC5nZXQoKSwgJmJpdG1hcEJydXNoUHJvcGVydGllcywgJmJydXNo
UHJvcGVydGllcywgJnBhdHRlcm5CcnVzaCk7CiAgICAgQVNTRVJUKFNVQ0NFRURFRChocikpOwog
ICAgIHJldHVybiBwYXR0ZXJuQnJ1c2g7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9QbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRC5jcHAJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL1BsYXRmb3JtQ29udGV4dERpcmVjdDJELmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDI2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQu
aCIKKworI2lmIFVTRShESVJFQ1QyRCkKKworI2luY2x1ZGUgIkRpcmVjdDJET3BlcmF0aW9ucy5o
IgorI2luY2x1ZGUgPGQyZDEuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBFbmNhcHN1
bGF0ZXMgdGhlIGFkZGl0aW9uYWwgcGFpbnRpbmcgc3RhdGUgaW5mb3JtYXRpb24gd2Ugc3RvcmUg
Zm9yIGVhY2gKKy8vIHB1c2hlZCBncmFwaGljcyBzdGF0ZS4KK2NsYXNzIFBsYXRmb3JtQ29udGV4
dERpcmVjdDJEOjpTdGF0ZSB7CitwdWJsaWM6CisgICAgU3RhdGUoKSA9IGRlZmF1bHQ7Cit9Owor
CitQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQoSUQyRDFS
ZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkKKyAgICA6IG1fcmVuZGVyVGFyZ2V0KHJlbmRlclRh
cmdldCkKK3sKKyAgICBtX3N0YXRlU3RhY2suYXBwZW5kKFN0YXRlKCkpOworICAgIG1fc3RhdGUg
PSAmbV9zdGF0ZVN0YWNrLmxhc3QoKTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3Qy
RDo6cmVzdG9yZSgpCit7CisgICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0KTsKKworICAgIGF1dG8g
cmVzdG9yZVN0YXRlID0gbV9yZW5kZXJTdGF0ZXMudGFrZUxhc3QoKTsKKyAgICBtX3JlbmRlclRh
cmdldC0+UmVzdG9yZURyYXdpbmdTdGF0ZShyZXN0b3JlU3RhdGUubV9kcmF3aW5nU3RhdGVCbG9j
ay5nZXQoKSk7CisKKyAgICBmb3IgKGF1dG8gY2xpcFR5cGUgPSByZXN0b3JlU3RhdGUubV9jbGlw
cy5yYmVnaW4oKTsgY2xpcFR5cGUgIT0gcmVzdG9yZVN0YXRlLm1fY2xpcHMucmVuZCgpOyArK2Ns
aXBUeXBlKSB7CisgICAgICAgIGlmICgqY2xpcFR5cGUgPT0gQXhpc0FsaWduZWRDbGlwKQorICAg
ICAgICAgICAgbV9yZW5kZXJUYXJnZXQtPlBvcEF4aXNBbGlnbmVkQ2xpcCgpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBtX3JlbmRlclRhcmdldC0+UG9wTGF5ZXIoKTsKKyAgICB9CisKKyAg
ICBtX3N0YXRlU3RhY2sucmVtb3ZlTGFzdCgpOworICAgIEFTU0VSVCghbV9zdGF0ZVN0YWNrLmlz
RW1wdHkoKSk7CisgICAgbV9zdGF0ZSA9ICZtX3N0YXRlU3RhY2subGFzdCgpOworfQorCitQbGF0
Zm9ybUNvbnRleHREaXJlY3QyRDo6flBsYXRmb3JtQ29udGV4dERpcmVjdDJEKCkgPSBkZWZhdWx0
OworCit2b2lkIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpzYXZlKCkKK3sKKyAgICBBU1NFUlQo
bV9yZW5kZXJUYXJnZXQpOworCisgICAgbV9zdGF0ZVN0YWNrLmFwcGVuZChTdGF0ZSgpKTsKKyAg
ICBtX3N0YXRlID0gJm1fc3RhdGVTdGFjay5sYXN0KCk7CisKKyAgICBSZW5kZXJTdGF0ZSBjdXJy
ZW50U3RhdGU7CisgICAgR3JhcGhpY3NDb250ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0ZURy
YXdpbmdTdGF0ZUJsb2NrKCZjdXJyZW50U3RhdGUubV9kcmF3aW5nU3RhdGVCbG9jayk7CisKKyAg
ICBtX3JlbmRlclRhcmdldC0+U2F2ZURyYXdpbmdTdGF0ZShjdXJyZW50U3RhdGUubV9kcmF3aW5n
U3RhdGVCbG9jay5nZXQoKSk7CisKKyAgICBtX3JlbmRlclN0YXRlcy5hcHBlbmQoY3VycmVudFN0
YXRlKTsKK30KKworLyoKK3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnB1c2hJbWFnZU1h
c2soY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlLCBjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7Citc
ICAgIC8vIFdlIG11c3QgY2FsbCBzYXZlUGxhdGZvcm1TdGF0ZSBhdCBsZWFzdCBvbmNlIGJlZm9y
ZSB3ZSBjYW4gdXNlIGltYWdlIG1hc2tpbmcsCisgICAgLy8gc2luY2Ugd2UgYWN0dWFsbHkgYXBw
bHkgdGhlIG1hc2sgaW4gcmVzdG9yZVBsYXRmb3JtU3RhdGUuCisgICAgQVNTRVJUKCFtX3N0YXRl
U3RhY2suaXNFbXB0eSgpKTsKKyAgICBtX3N0YXRlLT5tX21hc2sucGF0dGVybiA9IGFkb3B0UmVm
KGNhaXJvX3BhdHRlcm5fY3JlYXRlX2Zvcl9zdXJmYWNlKHN1cmZhY2UpKTsKKyAgICBjYWlyb19n
ZXRfbWF0cml4KG1fY3IuZ2V0KCksICZtX3N0YXRlLT5tX21hc2subWF0cml4KTsKKworICAgIGNh
aXJvX21hdHJpeF90IG1hdHJpeDsKKyAgICBjYWlyb19tYXRyaXhfaW5pdF90cmFuc2xhdGUoJm1h
dHJpeCwgLXJlY3QueCgpLCAtcmVjdC55KCkpOworICAgIGNhaXJvX3BhdHRlcm5fc2V0X21hdHJp
eChtX3N0YXRlLT5tX21hc2sucGF0dGVybi5nZXQoKSwgJm1hdHJpeCk7CisKKyAgICBjYWlyb19w
dXNoX2dyb3VwKG1fY3IuZ2V0KCkpOworfQorKi8KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRDo6cHVzaFJlbmRlckNsaXAoRGlyZWN0MkRMYXllclR5cGUgY2xpcFR5cGUpCit7CisgICAg
QVNTRVJUKGhhc1NhdmVkU3RhdGUoKSk7CisgICAgbV9yZW5kZXJTdGF0ZXMubGFzdCgpLm1fY2xp
cHMuYXBwZW5kKGNsaXBUeXBlKTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6
c2V0QWN0aXZlTGF5ZXIoQ09NUHRyPElEMkQxTGF5ZXI+JiYgbGF5ZXIpCit7CisgICAgQVNTRVJU
KGhhc1NhdmVkU3RhdGUoKSk7CisgICAgbV9yZW5kZXJTdGF0ZXMubGFzdCgpLm1fYWN0aXZlTGF5
ZXIgPSBsYXllcjsKK30KKworQ09NUHRyPElEMkQxU29saWRDb2xvckJydXNoPiBQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRDo6YnJ1c2hXaXRoQ29sb3IoY29uc3QgRDJEMV9DT0xPUl9GJiBjb2xvcikK
K3sKKyAgICBSR0JBMzIgY29sb3JLZXkgPSBtYWtlUkdCQTMyRnJvbUZsb2F0cyhjb2xvci5yLCBj
b2xvci5nLCBjb2xvci5iLCBjb2xvci5hKTsKKworICAgIGlmICghY29sb3JLZXkpIHsKKyAgICAg
ICAgaWYgKCFtX3plcm9CcnVzaCkKKyAgICAgICAgICAgIG1fcmVuZGVyVGFyZ2V0LT5DcmVhdGVT
b2xpZENvbG9yQnJ1c2goY29sb3IsICZtX3plcm9CcnVzaCk7CisgICAgICAgIHJldHVybiBtX3pl
cm9CcnVzaDsKKyAgICB9CisKKyAgICBpZiAoY29sb3JLZXkgPT0gMHhGRkZGRkZGRikgeworICAg
ICAgICBpZiAoIW1fd2hpdGVCcnVzaCkKKyAgICAgICAgICAgIG1fcmVuZGVyVGFyZ2V0LT5DcmVh
dGVTb2xpZENvbG9yQnJ1c2goY29sb3IsICZtX3doaXRlQnJ1c2gpOworICAgICAgICByZXR1cm4g
bV93aGl0ZUJydXNoOworICAgIH0KKworICAgIGF1dG8gZXhpc3RpbmdCcnVzaCA9IG1fc29saWRD
b2xvcmVkQnJ1c2hDYWNoZS5lbnN1cmUoY29sb3JLZXksIFt0aGlzLCBjb2xvcl0geworICAgICAg
ICBDT01QdHI8SUQyRDFTb2xpZENvbG9yQnJ1c2g+IGNvbG9yQnJ1c2g7CisgICAgICAgIG1fcmVu
ZGVyVGFyZ2V0LT5DcmVhdGVTb2xpZENvbG9yQnJ1c2goY29sb3IsICZjb2xvckJydXNoKTsKKyAg
ICAgICAgcmV0dXJuIGNvbG9yQnJ1c2g7CisgICAgfSk7CisKKyAgICByZXR1cm4gZXhpc3RpbmdC
cnVzaC5pdGVyYXRvci0+dmFsdWU7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6
OnJlY29tcHV0ZVN0cm9rZVN0eWxlKCkKK3sKKyAgICBpZiAoIW1fc3Ryb2tlU3lsZUlzRGlydHkp
CisgICAgICAgIHJldHVybjsKKworICAgIG1fZDJkU3Ryb2tlU3R5bGUgPSBudWxscHRyOworCisg
ICAgRGFzaEFycmF5IGRhc2hlczsKKyAgICBmbG9hdCBwYXR0ZXJuT2Zmc2V0ID0gMDsKKyAgICBh
dXRvIGRhc2hTdHlsZSA9IEQyRDFfREFTSF9TVFlMRV9TT0xJRDsKKworICAgIGlmICgobV9zdHJv
a2VTdHlsZSAhPSBTb2xpZFN0cm9rZSkgJiYgKG1fc3Ryb2tlU3R5bGUgIT0gTm9TdHJva2UpKSB7
CisgICAgICAgIGRhc2hTdHlsZSA9IEQyRDFfREFTSF9TVFlMRV9DVVNUT007CisgICAgICAgIHBh
dHRlcm5PZmZzZXQgPSBtX3BhdHRlcm5PZmZzZXQgLyBtX3N0cm9rZVRoaWNrbmVzczsKKyAgICAg
ICAgZGFzaGVzID0gbV9kYXNoZXM7CisKKyAgICAgICAgLy8gSW4gRGlyZWN0MkQsIGRhc2hlcyBh
bmQgZG90cyBhcmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiB0aGUgcmF0aW8gb2YgdGhlIGRhc2ggbGVu
Z3RoIHRvIHRoZSBsaW5lIHRoaWNrbmVzcy4KKyAgICAgICAgZm9yIChhdXRvJiBkYXNoIDogZGFz
aGVzKQorICAgICAgICAgICAgZGFzaCAvPSBtX3N0cm9rZVRoaWNrbmVzczsKKyAgICB9CisKKyAg
ICBhdXRvIHN0cm9rZVN0eWxlUHJvcGVydGllcyA9IEQyRDE6OlN0cm9rZVN0eWxlUHJvcGVydGll
cyhtX2xpbmVDYXAsIG1fbGluZUNhcCwgbV9saW5lQ2FwLCBtX2xpbmVKb2luLCBtX21pdGVyTGlt
aXQsIGRhc2hTdHlsZSwgcGF0dGVybk9mZnNldCk7CisgICAgR3JhcGhpY3NDb250ZXh0OjpzeXN0
ZW1GYWN0b3J5KCktPkNyZWF0ZVN0cm9rZVN0eWxlKCZzdHJva2VTdHlsZVByb3BlcnRpZXMsIGRh
c2hlcy5kYXRhKCksIGRhc2hlcy5zaXplKCksICZtX2QyZFN0cm9rZVN0eWxlKTsKKworICAgIG1f
c3Ryb2tlU3lsZUlzRGlydHkgPSBmYWxzZTsKK30KKworSUQyRDFTdHJva2VTdHlsZSogUGxhdGZv
cm1Db250ZXh0RGlyZWN0MkQ6OnN0cm9rZVN0eWxlKCkKK3sKKyAgICByZWNvbXB1dGVTdHJva2VT
dHlsZSgpOworICAgIHJldHVybiBtX2QyZFN0cm9rZVN0eWxlLmdldCgpOworfQorCitEMkQxX1NU
Uk9LRV9TVFlMRV9QUk9QRVJUSUVTIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpzdHJva2VTdHls
ZVByb3BlcnRpZXMoKSBjb25zdAoreworICAgIHJldHVybiBEMkQxOjpTdHJva2VTdHlsZVByb3Bl
cnRpZXMobV9saW5lQ2FwLCBtX2xpbmVDYXAsIG1fbGluZUNhcCwgbV9saW5lSm9pbiwgbV9taXRl
ckxpbWl0LCBEMkQxX0RBU0hfU1RZTEVfU09MSUQsIDAuMGYpOworfQorCit2b2lkIFBsYXRmb3Jt
Q29udGV4dERpcmVjdDJEOjpzZXRMaW5lQ2FwKEQyRDFfQ0FQX1NUWUxFIGxpbmVDYXApCit7Cisg
ICAgaWYgKG1fbGluZUNhcCA9PSBsaW5lQ2FwKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2xp
bmVDYXAgPSBsaW5lQ2FwOworICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworfQorCit2
b2lkIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpzZXRMaW5lSm9pbihEMkQxX0xJTkVfSk9JTiBq
b2luKQoreworICAgIGlmIChtX2xpbmVKb2luID09IGpvaW4pCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fbGluZUpvaW4gPSBqb2luOworICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOwor
fQorCit2b2lkIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpzZXRTdHJva2VTdHlsZShTdHJva2VT
dHlsZSBzdHJva2VTdHlsZSkKK3sKKyAgICBpZiAobV9zdHJva2VTdHlsZSA9PSBzdHJva2VTdHls
ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9zdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlOwor
ICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4
dERpcmVjdDJEOjpzZXRTdHJva2VUaGlja25lc3MoZmxvYXQgdGhpY2tuZXNzKQoreworICAgIGlm
IChXVEY6OmFyZUVzc2VudGlhbGx5RXF1YWwodGhpY2tuZXNzLCBtX3N0cm9rZVRoaWNrbmVzcykp
CisgICAgICAgIHJldHVybjsKKworICAgIG1fc3Ryb2tlVGhpY2tuZXNzID0gdGhpY2tuZXNzOwor
ICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4
dERpcmVjdDJEOjpzZXRNaXRlckxpbWl0KGZsb2F0IGNhbnZhc01pdGVyTGltaXQpCit7CisgICAg
Ly8gRGlyZWN0MkQgbWl0ZXIgbGltaXQgaXMgaW4gdGVybXMgb2YgSEFMRiB0aGUgbGluZSB0aGlj
a25lc3MuCisgICAgZmxvYXQgbWl0ZXJMaW1pdCA9IDAuNWYgKiBjYW52YXNNaXRlckxpbWl0Owor
ICAgIGlmIChXVEY6OmFyZUVzc2VudGlhbGx5RXF1YWwobWl0ZXJMaW1pdCwgbV9taXRlckxpbWl0
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9taXRlckxpbWl0ID0gbWl0ZXJMaW1pdDsKKyAg
ICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRE
aXJlY3QyRDo6c2V0RGFzaE9mZnNldChmbG9hdCBkYXNoT2Zmc2V0KQoreworICAgIGlmIChXVEY6
OmFyZUVzc2VudGlhbGx5RXF1YWwoZGFzaE9mZnNldCwgbV9kYXNoT2Zmc2V0KSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV9kYXNoT2Zmc2V0ID0gZGFzaE9mZnNldDsKKyAgICBtX3N0cm9rZVN5
bGVJc0RpcnR5ID0gdHJ1ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6c2V0
RGFzaGVzKGNvbnN0IERhc2hBcnJheSYgZGFzaGVzKQoreworICAgIGlmIChtX2Rhc2hlcyA9PSBk
YXNoZXMpCisgICAgICAgIHJldHVybjsKKworICAgIG1fZGFzaGVzID0gZGFzaGVzOworICAgIG1f
c3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEOjpzZXRQYXR0ZXJuV2lkdGgoZmxvYXQgcGF0dGVybldpZHRoKQoreworICAgIGlmIChXVEY6
OmFyZUVzc2VudGlhbGx5RXF1YWwocGF0dGVybldpZHRoLCBtX3BhdHRlcm5XaWR0aCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fcGF0dGVybldpZHRoID0gcGF0dGVybldpZHRoOworICAgIG1f
c3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEOjpzZXRQYXR0ZXJuT2Zmc2V0KGZsb2F0IHBhdHRlcm5PZmZzZXQpCit7CisgICAgaWYgKFdU
Rjo6YXJlRXNzZW50aWFsbHlFcXVhbChwYXR0ZXJuT2Zmc2V0LCBtX3BhdHRlcm5PZmZzZXQpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBtX3BhdHRlcm5PZmZzZXQgPSBwYXR0ZXJuT2Zmc2V0Owor
ICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBVU0UoRElSRUNUMkQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUGxhdGZvcm1Db250ZXh0RGly
ZWN0MkQuaAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
cHJhZ21hIG9uY2UKKworI2lmIFVTRShESVJFQ1QyRCkKKworI2luY2x1ZGUgIkNPTVB0ci5oIgor
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgPGQyZDEuaD4KKyNpbmNsdWRl
IDxkMmQxXzEuaD4KKyNpbmNsdWRlIDxkMmQxZWZmZWN0cy5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2NsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTsKK3N0cnVjdCBHcmFw
aGljc0NvbnRleHRTdGF0ZTsKKworbmFtZXNwYWNlIERpcmVjdDJEIHsKK3N0cnVjdCBGaWxsU291
cmNlOworc3RydWN0IFN0cm9rZVNvdXJjZTsKK3N0cnVjdCBTaGFkb3dTdGF0ZTsKK30KKworY2xh
c3MgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEKTsKK3B1YmxpYzoKKyAgICBQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRChJRDJEMVJlbmRlclRhcmdldCopOworICAgIH5QbGF0Zm9ybUNvbnRleHREaXJlY3QyRCgp
OworCisgICAgSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCgpIHsgcmV0dXJuIG1fcmVu
ZGVyVGFyZ2V0LmdldCgpOyB9CisgICAgdm9pZCBzZXRSZW5kZXJUYXJnZXQoSUQyRDFSZW5kZXJU
YXJnZXQqIHJlbmRlclRhcmdldCkgeyBtX3JlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDsgfQor
CisgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKiBncmFwaGljc0NvbnRleHRQcml2
YXRlKCkgeyByZXR1cm4gbV9ncmFwaGljc0NvbnRleHRQcml2YXRlOyB9CisgICAgdm9pZCBzZXRH
cmFwaGljc0NvbnRleHRQcml2YXRlKEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSogZ3Jh
cGhpY3NDb250ZXh0UHJpdmF0ZSkgeyBtX2dyYXBoaWNzQ29udGV4dFByaXZhdGUgPSBncmFwaGlj
c0NvbnRleHRQcml2YXRlOyB9CisKKyAgICBJRDJEMUxheWVyKiBjbGlwTGF5ZXIoKSBjb25zdCB7
IHJldHVybiBtX3JlbmRlclN0YXRlcy5sYXN0KCkubV9hY3RpdmVMYXllci5nZXQoKTsgfQorICAg
IElEMkQxU3Ryb2tlU3R5bGUqIHN0cm9rZVN0eWxlKCk7CisgICAgRDJEMV9TVFJPS0VfU1RZTEVf
UFJPUEVSVElFUyBzdHJva2VTdHlsZVByb3BlcnRpZXMoKSBjb25zdDsKKyAgICBJRDJEMVN0cm9r
ZVN0eWxlKiBwbGF0Zm9ybVN0cm9rZVN0eWxlKCkgY29uc3Q7CisKKyAgICBDT01QdHI8SUQyRDFT
b2xpZENvbG9yQnJ1c2g+IGJydXNoV2l0aENvbG9yKGNvbnN0IEQyRDFfQ09MT1JfRiYpOworCisg
ICAgdm9pZCBzYXZlKCk7CisgICAgdm9pZCByZXN0b3JlKCk7CisKKyAgICBib29sIGhhc1NhdmVk
U3RhdGUoKSBjb25zdCB7IHJldHVybiAhbV9yZW5kZXJTdGF0ZXMuaXNFbXB0eSgpOyB9CisKKyAg
ICBlbnVtIERpcmVjdDJETGF5ZXJUeXBlIHsgQXhpc0FsaWduZWRDbGlwLCBMYXllckNsaXAgfTsK
KyAgICB2b2lkIHB1c2hSZW5kZXJDbGlwKERpcmVjdDJETGF5ZXJUeXBlKTsKKyAgICB2b2lkIHNl
dEFjdGl2ZUxheWVyKENPTVB0cjxJRDJEMUxheWVyPiYmKTsKKworICAgIHZvaWQgcmVjb21wdXRl
U3Ryb2tlU3R5bGUoKTsKKyAgICBmbG9hdCBzdHJva2VUaGlja25lc3MoKSBjb25zdCB7IHJldHVy
biBtX3N0cm9rZVRoaWNrbmVzczsgfQorCisgICAgc3RydWN0IFJlbmRlclN0YXRlIHsKKyAgICAg
ICAgQ09NUHRyPElEMkQxRHJhd2luZ1N0YXRlQmxvY2s+IG1fZHJhd2luZ1N0YXRlQmxvY2s7Cisg
ICAgICAgIENPTVB0cjxJRDJEMUxheWVyPiBtX2FjdGl2ZUxheWVyOworICAgICAgICBWZWN0b3I8
RGlyZWN0MkRMYXllclR5cGU+IG1fY2xpcHM7CisgICAgfTsKKyAgICBWZWN0b3I8UmVuZGVyU3Rh
dGU+IG1fcmVuZGVyU3RhdGVzOworCisgICAgc3RydWN0IFRyYW5zcGFyZW5jeUxheWVyU3RhdGUg
eworICAgICAgICBDT01QdHI8SUQyRDFCaXRtYXBSZW5kZXJUYXJnZXQ+IHJlbmRlclRhcmdldDsK
KyAgICAgICAgQ29sb3Igc2hhZG93Q29sb3I7CisgICAgICAgIEZsb2F0U2l6ZSBzaGFkb3dPZmZz
ZXQ7CisgICAgICAgIGZsb2F0IG9wYWNpdHkgeyAxLjAgfTsKKyAgICAgICAgZmxvYXQgc2hhZG93
Qmx1ciB7IDAgfTsKKyAgICAgICAgYm9vbCBoYXNTaGFkb3cgeyBmYWxzZSB9OworICAgIH07Cisg
ICAgVmVjdG9yPFRyYW5zcGFyZW5jeUxheWVyU3RhdGU+IG1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFj
azsKKworICAgIHZvaWQgc2V0TGluZUNhcChEMkQxX0NBUF9TVFlMRSk7CisgICAgdm9pZCBzZXRM
aW5lSm9pbihEMkQxX0xJTkVfSk9JTik7CisgICAgdm9pZCBzZXRTdHJva2VTdHlsZShTdHJva2VT
dHlsZSk7CisgICAgdm9pZCBzZXRNaXRlckxpbWl0KGZsb2F0KTsKKyAgICB2b2lkIHNldERhc2hP
ZmZzZXQoZmxvYXQpOworICAgIHZvaWQgc2V0UGF0dGVybldpZHRoKGZsb2F0KTsKKyAgICB2b2lk
IHNldFBhdHRlcm5PZmZzZXQoZmxvYXQpOworICAgIHZvaWQgc2V0U3Ryb2tlVGhpY2tuZXNzKGZs
b2F0KTsKKyAgICB2b2lkIHNldERhc2hlcyhjb25zdCBEYXNoQXJyYXkmKTsKKworICAgIHZvaWQg
c2V0QmxlbmRNb2RlKEQyRDFfQkxFTkRfTU9ERSBtb2RlKSB7IG1fYmxlbmRNb2RlID0gbW9kZTsg
fQorICAgIHZvaWQgc2V0Q29tcG9zaXRlTW9kZShEMkQxX0NPTVBPU0lURV9NT0RFIG1vZGUpIHsg
bV9jb21wb3NpdGVNb2RlID0gbW9kZTsgfQorCitwcml2YXRlOgorICAgIEdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZSogbV9ncmFwaGljc0NvbnRleHRQcml2YXRlIHsgbnVsbHB0ciB9Owor
CisgICAgQ09NUHRyPElEMkQxUmVuZGVyVGFyZ2V0PiBtX3JlbmRlclRhcmdldDsKKyAgICBDT01Q
dHI8SUQyRDFTdHJva2VTdHlsZT4gbV9kMmRTdHJva2VTdHlsZTsKKworICAgIEhhc2hNYXA8dWlu
dDMyX3QsIENPTVB0cjxJRDJEMVNvbGlkQ29sb3JCcnVzaD4+IG1fc29saWRDb2xvcmVkQnJ1c2hD
YWNoZTsKKyAgICBDT01QdHI8SUQyRDFTb2xpZENvbG9yQnJ1c2g+IG1fd2hpdGVCcnVzaDsKKyAg
ICBDT01QdHI8SUQyRDFTb2xpZENvbG9yQnJ1c2g+IG1femVyb0JydXNoOworICAgIENPTVB0cjxJ
RDJEMVNvbGlkQ29sb3JCcnVzaD4gbV9zb2xpZFN0cm9rZUJydXNoOworICAgIENPTVB0cjxJRDJE
MVNvbGlkQ29sb3JCcnVzaD4gbV9zb2xpZEZpbGxCcnVzaDsKKyAgICBDT01QdHI8SUQyRDFCaXRt
YXBCcnVzaD4gbV9wYXR0ZXJuU3Ryb2tlQnJ1c2g7CisgICAgQ09NUHRyPElEMkQxQml0bWFwQnJ1
c2g+IG1fcGF0dGVybkZpbGxCcnVzaDsKKworICAgIGNsYXNzIFN0YXRlOworICAgIFN0YXRlKiBt
X3N0YXRlOworICAgIFZlY3RvcjxTdGF0ZT4gbV9zdGF0ZVN0YWNrOworCisgICAgRDJEMV9DQVBf
U1RZTEUgbV9saW5lQ2FwIHsgRDJEMV9DQVBfU1RZTEVfRkxBVCB9OworICAgIEQyRDFfTElORV9K
T0lOIG1fbGluZUpvaW4geyBEMkQxX0xJTkVfSk9JTl9NSVRFUiB9OworICAgIFN0cm9rZVN0eWxl
IG1fc3Ryb2tlU3R5bGUgeyBTb2xpZFN0cm9rZSB9OworICAgIERhc2hBcnJheSBtX2Rhc2hlczsK
KworICAgIGZsb2F0IG1fbWl0ZXJMaW1pdCB7IDEwLjBmIH07CisgICAgZmxvYXQgbV9kYXNoT2Zm
c2V0IHsgMCB9OworICAgIGZsb2F0IG1fcGF0dGVybldpZHRoIHsgMS4wZiB9OworICAgIGZsb2F0
IG1fcGF0dGVybk9mZnNldCB7IDAgfTsKKyAgICBmbG9hdCBtX3N0cm9rZVRoaWNrbmVzcyB7IDAg
fTsKKyAgICBmbG9hdCBtX2FscGhhIHsgMS4wIH07CisKKyAgICBib29sIG1fc3Ryb2tlU3lsZUlz
RGlydHkgeyBmYWxzZSB9OworCisgICAgRDJEMV9CTEVORF9NT0RFIG1fYmxlbmRNb2RlIHsgRDJE
MV9CTEVORF9NT0RFX01VTFRJUExZIH07CisgICAgRDJEMV9DT01QT1NJVEVfTU9ERSBtX2NvbXBv
c2l0ZU1vZGUgeyBEMkQxX0NPTVBPU0lURV9NT0RFX1NPVVJDRV9PVkVSIH07CisKKyAgICBmcmll
bmQgY2xhc3MgR3JhcGhpY3NDb250ZXh0OworICAgIGZyaWVuZCBjbGFzcyBHcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRp
ZiAvLyBVU0UoRElSRUNUMkQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJh
Z0ltYWdlV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4v
RHJhZ0ltYWdlV2luLmNwcAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3Myw2ICsxNzMs
OCBAQCBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayhFbGVtCiAgICAgICAgICAg
ICBpbWFnZVNpemUuc2V0V2lkdGgoc3RkOjptYXgobGFiZWxTaXplLndpZHRoKCksIHVybFN0cmlu
Z1NpemUud2lkdGgoKSkgKyBEcmFnTGFiZWxCb3JkZXJYICogMik7CiAgICAgfQogCisgICAgQVNT
RVJUKDApOworICAgIC8qCiAgICAgLy8gV2Ugbm93IGtub3cgaG93IGJpZyB0aGUgaW1hZ2UgbmVl
ZHMgdG8gYmUsIHNvIHdlIGNyZWF0ZSBhbmQKICAgICAvLyBmaWxsIHRoZSBiYWNrZ3JvdW5kCiAg
ICAgSFduZERDIGRjKDApOwpAQCAtMjEyLDYgKzIxNCw4IEBAIERyYWdJbWFnZVJlZiBjcmVhdGVE
cmFnSW1hZ2VGb3JMaW5rKEVsZW0KIAogICAgIGRlYWxsb2NDb250ZXh0KGNvbnRleHRSZWYpOwog
ICAgIHJldHVybiBpbWFnZS5sZWFrKCk7CisgICAgKi8KKyAgICByZXR1cm4gbnVsbHB0cjsKIH0K
IAogfQpJbmRleDogU291cmNlL1dlYkNvcmUvc3ZnL2dyYXBoaWNzL1NWR0ltYWdlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9zdmcvZ3JhcGhpY3MvU1ZHSW1hZ2UuY3BwCShyZXZp
c2lvbiAyNDgwMDgpCisrKyBTb3VyY2UvV2ViQ29yZS9zdmcvZ3JhcGhpY3MvU1ZHSW1hZ2UuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAw
NiBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIw
MDksIDIwMTUtMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmln
aHQgKEMpIDIwMDgtMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5
cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTEuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC02OCw3ICs2OCw5IEBACiAKICNpZiBVU0UoRElS
RUNUMkQpCiAjaW5jbHVkZSAiQ09NUHRyLmgiCisjaW5jbHVkZSAiRGlyZWN0MkRVdGlsaXRpZXMu
aCIKICNpbmNsdWRlICJJbWFnZURlY29kZXJEaXJlY3QyRC5oIgorI2luY2x1ZGUgIlBsYXRmb3Jt
Q29udGV4dERpcmVjdDJELmgiCiAjaW5jbHVkZSA8ZDJkMS5oPgogI2VuZGlmCiAKQEAgLTIzOCwx
NyArMjQwLDEyIEBAIE5hdGl2ZUltYWdlUHRyIFNWR0ltYWdlOjpuYXRpdmVJbWFnZShjb24KICAg
ICBpZiAoIVNVQ0NFRURFRChocikpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgYXV0
byB0YXJnZXRQcm9wZXJ0aWVzID0gRDJEMTo6UmVuZGVyVGFyZ2V0UHJvcGVydGllcyhEMkQxX1JF
TkRFUl9UQVJHRVRfVFlQRV9ERUZBVUxULAotICAgICAgICBEMkQxOjpQaXhlbEZvcm1hdChEWEdJ
X0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgRDJEMV9BTFBIQV9NT0RFX1BSRU1VTFRJUExJRUQpLAot
ICAgICAgICAwLCAwLCBEMkQxX1JFTkRFUl9UQVJHRVRfVVNBR0VfTk9ORSwgRDJEMV9GRUFUVVJF
X0xFVkVMX0RFRkFVTFQpOwotCi0gICAgLy8gRHJhdyB0aGUgU1ZHIGludG8gYSBiaXRtYXAuCi0g
ICAgQ09NUHRyPElEMkQxUmVuZGVyVGFyZ2V0PiBuYXRpdmVJbWFnZVRhcmdldDsKLSAgICBociA9
IEdyYXBoaWNzQ29udGV4dDo6c3lzdGVtRmFjdG9yeSgpLT5DcmVhdGVXaWNCaXRtYXBSZW5kZXJU
YXJnZXQobmF0aXZlSW1hZ2UuZ2V0KCksICZ0YXJnZXRQcm9wZXJ0aWVzLCAmbmF0aXZlSW1hZ2VU
YXJnZXQpOwotICAgIGlmICghbmF0aXZlSW1hZ2VUYXJnZXQgfHwgIVNVQ0NFRURFRChocikpCisg
ICAgQ09NUHRyPElEMkQxUmVuZGVyVGFyZ2V0PiBuYXRpdmVJbWFnZVRhcmdldCA9IERpcmVjdDJE
OjpjcmVhdGVSZW5kZXJUYXJnZXRGcm9tV0lDQml0bWFwKG5hdGl2ZUltYWdlLmdldCgpKTsKKyAg
ICBpZiAoIW5hdGl2ZUltYWdlVGFyZ2V0KQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAg
IEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQobmF0aXZlSW1hZ2VUYXJnZXQuZ2V0KCksIEdy
YXBoaWNzQ29udGV4dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkNQVU1lbW9yeSk7Cisg
ICAgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQgcGxhdGZvcm1Db250ZXh0KG5hdGl2ZUltYWdlVGFy
Z2V0LmdldCgpKTsKKyAgICBHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KCZwbGF0Zm9ybUNv
bnRleHQsIEdyYXBoaWNzQ29udGV4dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1l
bW9yeSk7CiAKICAgICBkcmF3KGxvY2FsQ29udGV4dCwgcmVjdCgpLCByZWN0KCksIENvbXBvc2l0
ZVNvdXJjZU92ZXIsIEJsZW5kTW9kZTo6Tm9ybWFsLCBEZWNvZGluZ01vZGU6OlN5bmNocm9ub3Vz
LCBJbWFnZU9yaWVudGF0aW9uRGVzY3JpcHRpb24oKSk7CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>375171</attachid>
            <date>2019-07-30 13:15:16 -0700</date>
            <delta_ts>2019-07-30 13:32:53 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-200270-20190730131512.patch</filename>
            <type>text/plain</type>
            <size>209775</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0ODAwOSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ2IEBACisyMDE5LTA3LTMwICBCcmVudCBG
dWxnaGFtICA8YmZ1bGdoYW1AYXBwbGUuY29tPgorCisgICAgICAgIFtGVFddIFJlZmFjdG9yIERp
cmVjdDJEIGNvZGUgdG8gZm9sbG93IENhaXJvJ3MgbW9kZWwgdG8gc3VwcG9ydCBtb2Rlcm4gV2Vi
S2l0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDAy
NzAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBSZWZh
Y3RvciB0aGUgRGlyZWN0MkQgY29kZSBpbiBXZWJDb3JlIHNvIHRoYXQgdGhlIGNvcmUgcm91dGlu
ZXMgY2FuIGJlIHNoYXJlZAorICAgICAgICBiZXR3ZWVuIEdyYXBoaWNzQ29udGV4dCBhbmQgR3Jh
cGhpY3NDb250ZXh0SW1wbC4gSW1wbGVtZW50IFBsYXRmb3JtQ29udGV4dCwKKyAgICAgICAgQmFj
a2luZ1N0b3JlQmFja2VuZCwgYW5kIEdyYXBoaWNzQ29udGV4dEltcGwgZm9yIHRoZSBEaXJlY3Qy
RCBlbmdpbmUuCisgICAgICAgCisgICAgICAgIFRoaXMgcGF0Y2ggZWZmZWN0aXZlbHkganVzdCBt
b3ZlcyBjb2RlIGFyb3VuZC4KKworICAgICAgICAqIFBsYXRmb3JtRlRXLmNtYWtlOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dEltcGwuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9JbWFnZVNvdXJjZS5jcHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvUGF0
dGVybi5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5
TGlzdFJlY29yZGVyLmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlz
dHMvRGlzcGxheUxpc3RSZWNvcmRlci5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2VuZERp
cmVjdDJESW1wbC5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRGly
ZWN0MkRPcGVyYXRpb25zLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0RpcmVjdDJET3BlcmF0aW9ucy5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy93aW4vRGlyZWN0MkRVdGlsaXRpZXMuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vRGlyZWN0MkRVdGlsaXRpZXMuaDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYXNjYWRlRGlyZWN0MkQuY3BwOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFkaWVudERpcmVjdDJELmNwcDoKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0RGlyZWN0MkQuY3BwOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0SW1w
bERpcmVjdDJELmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5oOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRhdGFEaXJlY3QyRC5oOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRpcmVjdDJELmNwcDoKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW4vTmF0aXZlSW1hZ2VEaXJlY3QyRC5jcHA6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL1BhdGhEaXJlY3QyRC5jcHA6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL1BhdHRlcm5EaXJlY3QyRC5jcHA6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL1BsYXRmb3JtQ29udGV4dERpcmVjdDJELmNwcDogQWRkZWQuCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BsYXRmb3JtQ29udGV4dERpcmVjdDJELmg6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwOgorICAgICAgICAqIHN2Zy9n
cmFwaGljcy9TVkdJbWFnZS5jcHA6CisKIDIwMTktMDctMzAgIE1pY2hhZWwgQ2F0YW56YXJvICA8
bWNhdGFuemFyb0BpZ2FsaWEuY29tPgogCiAgICAgICAgIFtHVEtdIENvbXBpbGF0aW9uIGVycm9y
cyB3aGVuIEdMIGlzIGRpc2FibGVkCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUZUVy5j
bWFrZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUZUVy5jbWFrZQkocmV2
aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvUGxhdGZvcm1GVFcuY21ha2UJKHdvcmtp
bmcgY29weSkKQEAgLTQ1LDYgKzQ1LDcgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9TT1VSQ0VTCiAK
ICAgICBwbGF0Zm9ybS9ncmFwaGljcy9HTENvbnRleHQuY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhp
Y3MvR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlLmNwcAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dy
YXBoaWNzQ29udGV4dEltcGwuY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvUGxhdGZvcm1EaXNw
bGF5LmNwcAogCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvZWdsL0dMQ29udGV4dEVHTC5jcHAKQEAg
LTU3LDkgKzU4LDEyIEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09VUkNFUwogCiAgICAgcGxhdGZv
cm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVVdGlsaXRpZXMuY3BwCiAKKyAgICBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbC5jcHAKICAgICBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vQ29sb3JEaXJlY3QyRC5jcHAKICAgICBwbGF0Zm9ybS9ncmFw
aGljcy93aW4vQ29tcGxleFRleHRDb250cm9sbGVyRGlyZWN0V3JpdGUuY3BwCiAgICAgcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0RJQlBpeGVsRGF0YS5jcHAKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy93
aW4vRGlyZWN0MkRPcGVyYXRpb25zLmNwcAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJl
Y3QyRFV0aWxpdGllcy5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRmxvYXRQb2ludERp
cmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9GbG9hdFJlY3REaXJlY3QyRC5j
cHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRmxvYXRTaXplRGlyZWN0MkQuY3BwCkBAIC03
Myw2ICs3Nyw3IEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09VUkNFUwogICAgIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9HcmFkaWVudERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9HcmFwaGljc0NvbnRleHQzRERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9HcmFwaGljc0NvbnRleHREaXJlY3QyRC5jcHAKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9HcmFwaGljc0NvbnRleHRXaW4uY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ljb25X
aW4uY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQnVmZmVyRGF0YURpcmVjdDJE
LmNwcApAQCAtODcsNiArOTIsNyBAQCBsaXN0KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vTmF0aXZlSW1hZ2VEaXJlY3QyRC5jcHAKICAgICBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vUGF0aERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9QYXR0ZXJuRGlyZWN0MkQuY3BwCisgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BsYXRmb3Jt
Q29udGV4dERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250
RGF0YVdpbi5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFEaXJl
Y3QyRC5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vVGV4dEFuYWx5emVySGVscGVyLmNw
cApAQCAtMTQ5LDEyICsxNTUsMTkgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9QUklWQVRFX0ZSQU1F
V09SS19IRQogCiAgICAgcGFnZS93aW4vRnJhbWVXaW4uaAogCisgICAgcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyRC5oCisgICAgcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwuaAogICAgIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9ESUJQaXhlbERhdGEuaAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJl
Y3QyRE9wZXJhdGlvbnMuaAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJlY3QyRFV0aWxp
dGllcy5oCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Z1bGxTY3JlZW5Db250cm9sbGVyLmgK
ICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRnVsbFNjcmVlbkNvbnRyb2xsZXJDbGllbnQuaAor
ICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQuaAog
ICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRhdGFEaXJlY3QyRC5oCisgICAg
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlRGVjb2RlckRpcmVjdDJELmgKICAgICBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vTG9jYWxXaW5kb3dzQ29udGV4dC5oCiAgICAgcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL01lZGlhUGxheWVyUHJpdmF0ZUZ1bGxzY3JlZW5XaW5kb3cuaAorICAgIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9QbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oCiAgICAgcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL1NoYXJlZEdESU9iamVjdC5oCiAKICAgICBwbGF0Zm9ybS93aW4vQlN0cmluZy5o
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL1NldHRpbmdzLnlhbWwKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGFnZS9TZXR0aW5ncy55YW1sCShyZXZpc2lvbiAyNDgwMDgpCisrKyBT
b3VyY2UvV2ViQ29yZS9wYWdlL1NldHRpbmdzLnlhbWwJKHdvcmtpbmcgY29weSkKQEAgLTEzNiwx
NiArMTM2LDE2IEBAIGFjY2VsZXJhdGVkQ29tcG9zaXRlZEFuaW1hdGlvbnNFbmFibGVkOgogICBp
bml0aWFsOiB0cnVlCiAgIG9uQ2hhbmdlOiBzZXROZWVkc1JlY2FsY1N0eWxlSW5BbGxGcmFtZXMK
IHNob3dEZWJ1Z0JvcmRlcnM6Ci0gIGluaXRpYWw6IGZhbHNlCisgIGluaXRpYWw6IHRydWUKICAg
b25DaGFuZ2U6IHNldE5lZWRzUmVjYWxjU3R5bGVJbkFsbEZyYW1lcwogc2hvd1JlcGFpbnRDb3Vu
dGVyOgotICBpbml0aWFsOiBmYWxzZQorICBpbml0aWFsOiB0cnVlCiAgIG9uQ2hhbmdlOiBzZXRO
ZWVkc1JlY2FsY1N0eWxlSW5BbGxGcmFtZXMKIHZpc2libGVEZWJ1Z092ZXJsYXlSZWdpb25zOgog
ICB0eXBlOiBEZWJ1Z092ZXJsYXlSZWdpb25zCiAgIGluaXRpYWw6IDAKIHNob3dUaWxlZFNjcm9s
bGluZ0luZGljYXRvcjoKLSAgaW5pdGlhbDogZmFsc2UKKyAgaW5pdGlhbDogdHJ1ZQogcmVzb3Vy
Y2VVc2FnZU92ZXJsYXlWaXNpYmxlOgogICBpbml0aWFsOiBmYWxzZQogICBvbkNoYW5nZTogcmVz
b3VyY2VVc2FnZU92ZXJsYXlWaXNpYmxlQ2hhbmdlZApAQCAtNjk0LDcgKzY5NCw3IEBAIGphdmFF
bmFibGVkRm9yTG9jYWxGaWxlczoKICMgVW5saWtlIHRoZSBpbWFnZXNFbmFibGVkIHNldHRpbmcs
IHRoaXMgb25seSBzdXBwcmVzc2VzIHRoZSBuZXR3b3JrIGxvYWQgb2YKICMgdGhlIGltYWdlIFVS
TC4gQSBjYWNoZWQgaW1hZ2Ugd2lsbCBzdGlsbCBiZSByZW5kZXJlZCBpZiByZXF1ZXN0ZWQuCiBs
b2Fkc0ltYWdlc0F1dG9tYXRpY2FsbHk6Ci0gIGluaXRpYWw6IGZhbHNlCisgIGluaXRpYWw6IHRy
dWUKICAgb25DaGFuZ2U6IGltYWdlc0VuYWJsZWRDaGFuZ2VkCiBpbWFnZXNFbmFibGVkOgogICBp
bml0aWFsOiB0cnVlCkBAIC03MDIsNyArNzAyLDcgQEAgaW1hZ2VzRW5hYmxlZDoKICAgb25DaGFu
Z2U6IGltYWdlc0VuYWJsZWRDaGFuZ2VkCiAgIGluc3BlY3Rvck92ZXJyaWRlOiB0cnVlCiBzY3Jp
cHRFbmFibGVkOgotICBpbml0aWFsOiBmYWxzZQorICBpbml0aWFsOiB0cnVlCiAgIGdldHRlcjog
aXNTY3JpcHRFbmFibGVkCiAgIGluc3BlY3Rvck92ZXJyaWRlOiB0cnVlCiBwbHVnaW5zRW5hYmxl
ZDoKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzQ29udGV4dC5oCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaAkod29ya2luZyBjb3B5KQpAQCAtNDQsNyArNDQs
MTAgQEAgaW50ZXJmYWNlIElEMkQxRENSZW5kZXJUYXJnZXQ7CiBpbnRlcmZhY2UgSUQyRDFSZW5k
ZXJUYXJnZXQ7CiBpbnRlcmZhY2UgSUQyRDFGYWN0b3J5OwogaW50ZXJmYWNlIElEMkQxU29saWRD
b2xvckJydXNoOwotdHlwZWRlZiBJRDJEMVJlbmRlclRhcmdldCBQbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dDsKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
OworfQordHlwZWRlZiBXZWJDb3JlOjpQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCBQbGF0Zm9ybUdy
YXBoaWNzQ29udGV4dDsKICNlbGlmIFVTRShDQUlSTykKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNs
YXNzIFBsYXRmb3JtQ29udGV4dENhaXJvOwpAQCAtMzQ3LDEwICszNTAsNiBAQCBwdWJsaWM6CiAg
ICAgV0VCQ09SRV9FWFBPUlQgdm9pZCBkcmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0aXZlSW1hZ2VQ
dHImLCBjb25zdCBGbG9hdFNpemUmIHNlbGZTaXplLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0
LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yID0gQ29tcG9zaXRl
U291cmNlT3ZlciwgQmxlbmRNb2RlID0gQmxlbmRNb2RlOjpOb3JtYWwsIEltYWdlT3JpZW50YXRp
b24gPSBJbWFnZU9yaWVudGF0aW9uKCkpOwogI2VuZGlmCiAKLSNpZiBVU0UoRElSRUNUMkQpCi0g
ICAgdm9pZCBkcmF3RGV2aWNlQml0bWFwKGNvbnN0IENPTVB0cjxJRDJEMUJpdG1hcD4mLCBjb25z
dCBGbG9hdFNpemUmIHNlbGZTaXplLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBG
bG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yID0gQ29tcG9zaXRlU291cmNlT3Zl
ciwgQmxlbmRNb2RlID0gQmxlbmRNb2RlOjpOb3JtYWwsIEltYWdlT3JpZW50YXRpb24gPSBJbWFn
ZU9yaWVudGF0aW9uKCkpOwotI2VuZGlmCi0KICNpZiBVU0UoQ0cpIHx8IFVTRShESVJFQ1QyRCkK
ICAgICB2b2lkIGFwcGx5U3Ryb2tlUGF0dGVybigpOwogICAgIHZvaWQgYXBwbHlGaWxsUGF0dGVy
bigpOwpAQCAtNjE5LDkgKzYxOCw3IEBAIHByaXZhdGU6CiAKICNpZiBVU0UoRElSRUNUMkQpCiAg
ICAgdm9pZCBwbGF0Zm9ybUluaXQoSERDLCBJRDJEMVJlbmRlclRhcmdldCoqLCBSRUNULCBib29s
IGhhc0FscGhhID0gZmFsc2UpOwotICAgIHZvaWQgcGxhdGZvcm1Jbml0KFBsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0KiwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUpOwotICAgIHZvaWQgZHJhd1dp
dGhvdXRTaGFkb3coY29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ1JlY3QsIGNvbnN0IFdURjo6RnVu
Y3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiYpOwotICAgIHZvaWQgZHJhd1dpdGhTaGFk
b3coY29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ1JlY3QsIGNvbnN0IFdURjo6RnVuY3Rpb248dm9p
ZChJRDJEMVJlbmRlclRhcmdldCopPiYpOworICAgIHZvaWQgcGxhdGZvcm1Jbml0KFBsYXRmb3Jt
Q29udGV4dERpcmVjdDJEKiwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUpOwogI2VuZGlmCiAK
ICAgICB2b2lkIHNhdmVQbGF0Zm9ybVN0YXRlKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHRJbXBsLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0SW1wbC5oCShyZXZpc2lv
biAyNDgwMDgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0Nv
bnRleHRJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTcxLDcgKzcxLDcgQEAgcHVibGljOgogICAg
IHZpcnR1YWwgSW1hZ2VEcmF3UmVzdWx0IGRyYXdJbWFnZShJbWFnZSYsIGNvbnN0IEZsb2F0UmVj
dCYgZGVzdGluYXRpb24sIGNvbnN0IEZsb2F0UmVjdCYgc291cmNlLCBjb25zdCBJbWFnZVBhaW50
aW5nT3B0aW9ucyYpID0gMDsKICAgICB2aXJ0dWFsIEltYWdlRHJhd1Jlc3VsdCBkcmF3VGlsZWRJ
bWFnZShJbWFnZSYsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdGluYXRpb24sIGNvbnN0IEZsb2F0UG9p
bnQmIHNvdXJjZSwgY29uc3QgRmxvYXRTaXplJiB0aWxlU2l6ZSwgY29uc3QgRmxvYXRTaXplJiBz
cGFjaW5nLCBjb25zdCBJbWFnZVBhaW50aW5nT3B0aW9ucyYpID0gMDsKICAgICB2aXJ0dWFsIElt
YWdlRHJhd1Jlc3VsdCBkcmF3VGlsZWRJbWFnZShJbWFnZSYsIGNvbnN0IEZsb2F0UmVjdCYgZGVz
dGluYXRpb24sIGNvbnN0IEZsb2F0UmVjdCYgc291cmNlLCBjb25zdCBGbG9hdFNpemUmIHRpbGVT
Y2FsZUZhY3RvciwgSW1hZ2U6OlRpbGVSdWxlIGhSdWxlLCBJbWFnZTo6VGlsZVJ1bGUgdlJ1bGUs
IGNvbnN0IEltYWdlUGFpbnRpbmdPcHRpb25zJikgPSAwOwotI2lmIFVTRShDRykgfHwgVVNFKENB
SVJPKQorI2lmIFVTRShDRykgfHwgVVNFKENBSVJPKSB8fCBVU0UoRElSRUNUMkQpCiAgICAgdmly
dHVhbCB2b2lkIGRyYXdOYXRpdmVJbWFnZShjb25zdCBOYXRpdmVJbWFnZVB0ciYsIGNvbnN0IEZs
b2F0U2l6ZSYgc2VsZlNpemUsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0
UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSwgSW1hZ2VPcmllbnRh
dGlvbikgPSAwOwogI2VuZGlmCiAgICAgdmlydHVhbCB2b2lkIGRyYXdQYXR0ZXJuKEltYWdlJiwg
Y29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25z
dCBBZmZpbmVUcmFuc2Zvcm0mLCBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgY29uc3QgRmxvYXRT
aXplJiBzcGFjaW5nLCBDb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlID0gQmxlbmRNb2RlOjpO
b3JtYWwpID0gMDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ltYWdl
U291cmNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9JbWFnZVNvdXJjZS5jcHAJKHJldmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0ltYWdlU291cmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzgsNiAr
MzgsNyBAQAogCiAjaWYgVVNFKERJUkVDVDJEKQogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5o
IgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCiAjZW5kaWYKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewpAQCAtNjYxLDcgKzY2Miw3IEBAIEltYWdlT3JpZW50YXRpb24gSW1hZ2VT
b3VyY2U6OmZyYW1lT3JpZW4KIHZvaWQgSW1hZ2VTb3VyY2U6OnNldFRhcmdldENvbnRleHQoY29u
c3QgR3JhcGhpY3NDb250ZXh0KiB0YXJnZXRDb250ZXh0KQogewogICAgIGlmIChpc0RlY29kZXJB
dmFpbGFibGUoKSAmJiB0YXJnZXRDb250ZXh0KQotICAgICAgICBtX2RlY29kZXItPnNldFRhcmdl
dENvbnRleHQodGFyZ2V0Q29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCkpOworICAgICAgICBtX2Rl
Y29kZXItPnNldFRhcmdldENvbnRleHQodGFyZ2V0Q29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCkt
PnJlbmRlclRhcmdldCgpKTsKIH0KICNlbmRpZgogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9QYXR0ZXJuLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvUGF0dGVybi5oCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9QYXR0ZXJuLmgJKHdvcmtpbmcgY29weSkKQEAgLTM4LDYg
KzM4LDEwIEBAIHR5cGVkZWYgQ0dQYXR0ZXJuUmVmIFBsYXRmb3JtUGF0dGVyblB0cjsKICNlbGlm
IFVTRShESVJFQ1QyRCkKIGludGVyZmFjZSBJRDJEMUJpdG1hcEJydXNoOwogdHlwZWRlZiBJRDJE
MUJpdG1hcEJydXNoKiBQbGF0Zm9ybVBhdHRlcm5QdHI7CituYW1lc3BhY2UgV2ViQ29yZSB7Citj
bGFzcyBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDsKK30KK3R5cGVkZWYgV2ViQ29yZTo6UGxhdGZv
cm1Db250ZXh0RGlyZWN0MkQgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQ7CiAjZWxpZiBVU0UoQ0FJ
Uk8pCiB0eXBlZGVmIHN0cnVjdCBfY2Fpcm9fcGF0dGVybiBjYWlyb19wYXR0ZXJuX3Q7CiB0eXBl
ZGVmIGNhaXJvX3BhdHRlcm5fdCogUGxhdGZvcm1QYXR0ZXJuUHRyOwpAQCAtNjIsNiArNjYsNyBA
QCBwdWJsaWM6CiAjaWYgIVVTRShESVJFQ1QyRCkKICAgICBQbGF0Zm9ybVBhdHRlcm5QdHIgY3Jl
YXRlUGxhdGZvcm1QYXR0ZXJuKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdXNlclNwYWNlVHJhbnNm
b3JtYXRpb24pIGNvbnN0OwogI2Vsc2UKKyAgICBQbGF0Zm9ybVBhdHRlcm5QdHIgY3JlYXRlUGxh
dGZvcm1QYXR0ZXJuKFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0JiwgZmxvYXQgYWxwaGEsIGNvbnN0
IEFmZmluZVRyYW5zZm9ybSYgdXNlclNwYWNlVHJhbnNmb3JtYXRpb24pIGNvbnN0OwogICAgIFBs
YXRmb3JtUGF0dGVyblB0ciBjcmVhdGVQbGF0Zm9ybVBhdHRlcm4oY29uc3QgR3JhcGhpY3NDb250
ZXh0JiwgZmxvYXQgYWxwaGEsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdXNlclNwYWNlVHJhbnNm
b3JtYXRpb24pIGNvbnN0OwogI2VuZGlmCiAgICAgdm9pZCBzZXRQYXR0ZXJuU3BhY2VUcmFuc2Zv
cm0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuU3BhY2VUcmFuc2Zvcm1hdGlvbik7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxh
eUxpc3RJdGVtcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0SXRlbXMuY3BwCShyZXZpc2lvbiAyNDgwMDgp
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxh
eUxpc3RJdGVtcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ4Niw3ICs0ODYsNyBAQCBzdGF0aWMg
VGV4dFN0cmVhbSYgb3BlcmF0b3I8PChUZXh0U3RyZWFtCiAgICAgcmV0dXJuIHRzOwogfQogCi0j
aWYgVVNFKENHKSB8fCBVU0UoQ0FJUk8pCisjaWYgVVNFKENHKSB8fCBVU0UoQ0FJUk8pIHx8IFVT
RShESVJFQ1QyRCkKIERyYXdOYXRpdmVJbWFnZTo6RHJhd05hdGl2ZUltYWdlKGNvbnN0IE5hdGl2
ZUltYWdlUHRyJiBpbWFnZSwgY29uc3QgRmxvYXRTaXplJiBpbWFnZVNpemUsIGNvbnN0IEZsb2F0
UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0
b3Igb3AsIEJsZW5kTW9kZSBibGVuZE1vZGUsIEltYWdlT3JpZW50YXRpb24gb3JpZW50YXRpb24p
CiAgICAgOiBEcmF3aW5nSXRlbShJdGVtVHlwZTo6RHJhd05hdGl2ZUltYWdlKQogI2lmIFVTRShD
RykKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9E
aXNwbGF5TGlzdEl0ZW1zLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0SXRlbXMuaAkocmV2aXNpb24gMjQ4MDA4
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rpc3Bs
YXlMaXN0SXRlbXMuaAkod29ya2luZyBjb3B5KQpAQCAtNzAsNyArNzAsNyBAQCBlbnVtIGNsYXNz
IEl0ZW1UeXBlIHsKICAgICBEcmF3SW1hZ2UsCiAgICAgRHJhd1RpbGVkSW1hZ2UsCiAgICAgRHJh
d1RpbGVkU2NhbGVkSW1hZ2UsCi0jaWYgVVNFKENHKSB8fCBVU0UoQ0FJUk8pCisjaWYgVVNFKENH
KSB8fCBVU0UoQ0FJUk8pIHx8IFVTRShESVJFQ1QyRCkKICAgICBEcmF3TmF0aXZlSW1hZ2UsCiAj
ZW5kaWYKICAgICBEcmF3UGF0dGVybiwKQEAgLTYzOCw3ICs2MzgsNyBAQCBwcml2YXRlOgogICAg
IEltYWdlUGFpbnRpbmdPcHRpb25zIG1faW1hZ2VQYWludGluZ09wdGlvbnM7CiB9OwogCi0jaWYg
VVNFKENHKSB8fCBVU0UoQ0FJUk8pCisjaWYgVVNFKENHKSB8fCBVU0UoQ0FJUk8pIHx8IFVTRShE
SVJFQ1QyRCkKIGNsYXNzIERyYXdOYXRpdmVJbWFnZSA6IHB1YmxpYyBEcmF3aW5nSXRlbSB7CiBw
dWJsaWM6CiAgICAgc3RhdGljIFJlZjxEcmF3TmF0aXZlSW1hZ2U+IGNyZWF0ZShjb25zdCBOYXRp
dmVJbWFnZVB0ciYgaW1hZ2UsIGNvbnN0IEZsb2F0U2l6ZSYgaW1hZ2VTaXplLCBjb25zdCBGbG9h
dFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJh
dG9yIG9wLCBCbGVuZE1vZGUgYmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0aW9uIG9yaWVudGF0aW9u
KQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rp
c3BsYXlMaXN0UmVjb3JkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdFJlY29yZGVyLmNwcAkocmV2aXNp
b24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxp
c3RzL0Rpc3BsYXlMaXN0UmVjb3JkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjYsNyArMTI2
LDcgQEAgSW1hZ2VEcmF3UmVzdWx0IFJlY29yZGVyOjpkcmF3VGlsZWRJbWFnZQogICAgIHJldHVy
biBJbWFnZURyYXdSZXN1bHQ6OkRpZFJlY29yZDsKIH0KIAotI2lmIFVTRShDRykgfHwgVVNFKENB
SVJPKQorI2lmIFVTRShDRykgfHwgVVNFKENBSVJPKSB8fCBVU0UoRElSRUNUMkQpCiB2b2lkIFJl
Y29yZGVyOjpkcmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0aXZlSW1hZ2VQdHImIGltYWdlLCBjb25z
dCBGbG9hdFNpemUmIGltYWdlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3Qg
RmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBvcCwgQmxlbmRNb2RlIGJsZW5k
TW9kZSwgSW1hZ2VPcmllbnRhdGlvbiBvcmllbnRhdGlvbikKIHsKICAgICBEcmF3aW5nSXRlbSYg
bmV3SXRlbSA9IGRvd25jYXN0PERyYXdpbmdJdGVtPihhcHBlbmRJdGVtKERyYXdOYXRpdmVJbWFn
ZTo6Y3JlYXRlKGltYWdlLCBpbWFnZVNpemUsIGRlc3RSZWN0LCBzcmNSZWN0LCBvcCwgYmxlbmRN
b2RlLCBvcmllbnRhdGlvbikpKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdFJlY29yZGVyLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0UmVj
b3JkZXIuaAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0UmVjb3JkZXIuaAkod29ya2luZyBjb3B5KQpA
QCAtOTEsNyArOTEsNyBAQCBwcml2YXRlOgogICAgIEltYWdlRHJhd1Jlc3VsdCBkcmF3SW1hZ2Uo
SW1hZ2UmLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RpbmF0aW9uLCBjb25zdCBGbG9hdFJlY3QmIHNv
dXJjZSwgY29uc3QgSW1hZ2VQYWludGluZ09wdGlvbnMmKSBvdmVycmlkZTsKICAgICBJbWFnZURy
YXdSZXN1bHQgZHJhd1RpbGVkSW1hZ2UoSW1hZ2UmLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RpbmF0
aW9uLCBjb25zdCBGbG9hdFBvaW50JiBzb3VyY2UsIGNvbnN0IEZsb2F0U2l6ZSYgdGlsZVNpemUs
IGNvbnN0IEZsb2F0U2l6ZSYgc3BhY2luZywgY29uc3QgSW1hZ2VQYWludGluZ09wdGlvbnMmKSBv
dmVycmlkZTsKICAgICBJbWFnZURyYXdSZXN1bHQgZHJhd1RpbGVkSW1hZ2UoSW1hZ2UmLCBjb25z
dCBGbG9hdFJlY3QmIGRlc3RpbmF0aW9uLCBjb25zdCBGbG9hdFJlY3QmIHNvdXJjZSwgY29uc3Qg
RmxvYXRTaXplJiB0aWxlU2NhbGVGYWN0b3IsIEltYWdlOjpUaWxlUnVsZSBoUnVsZSwgSW1hZ2U6
OlRpbGVSdWxlIHZSdWxlLCBjb25zdCBJbWFnZVBhaW50aW5nT3B0aW9ucyYpIG92ZXJyaWRlOwot
I2lmIFVTRShDRykgfHwgVVNFKENBSVJPKQorI2lmIFVTRShDRykgfHwgVVNFKENBSVJPKSB8fCBV
U0UoRElSRUNUMkQpCiAgICAgdm9pZCBkcmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0aXZlSW1hZ2VQ
dHImLCBjb25zdCBGbG9hdFNpemUmIHNlbGZTaXplLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0
LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUs
IEltYWdlT3JpZW50YXRpb24pIG92ZXJyaWRlOwogI2VuZGlmCiAgICAgdm9pZCBkcmF3UGF0dGVy
bihJbWFnZSYsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3Jj
UmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIGNv
bnN0IEZsb2F0U2l6ZSYgc3BhY2luZywgQ29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSA9IEJs
ZW5kTW9kZTo6Tm9ybWFsKSBvdmVycmlkZTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2Vu
ZERpcmVjdDJELmgJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyRC5oCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBVU0UoRElSRUNUMkQpCisKKyNpbmNsdWRlICJDT01Q
dHIuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSA8d2luY29kZWMuaD4KKyNpbmNs
dWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJE
IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShCYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQp
OworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHZpcnR1YWwgfkJh
Y2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyRCgpID0gZGVmYXVsdDsKKworICAgIElXSUNCaXRtYXAq
IHN1cmZhY2UoKSBjb25zdCB7IHJldHVybiBtX3N1cmZhY2UuZ2V0KCk7IH0KKyAgICBjb25zdCBJ
bnRTaXplJiBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CisKKyAgICB2aXJ0dWFsIHZv
aWQgc2Nyb2xsKGNvbnN0IEludFJlY3QmIHNjcm9sbFJlY3QsIGNvbnN0IEludFNpemUmIHNjcm9s
bE9mZnNldCkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgQmFja2luZ1N0b3JlQmFja2VuZERpcmVj
dDJEKGNvbnN0IEludFNpemUmIHNpemUpCisgICAgICAgIDogbV9zaXplKHNpemUpCisgICAgewor
ICAgIH0KKworICAgIENPTVB0cjxJV0lDQml0bWFwPiBtX3N1cmZhY2U7CisgICAgdm9pZCogbV9z
dXJmYWNlQmFja2luZ0RhdGE7CisgICAgSW50U2l6ZSBtX3NpemU7Cit9OworCisKK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShESVJFQ1QyRCkKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJ
bXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbC5jcHAJKG5vbmV4aXN0ZW50KQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmRE
aXJlY3QyREltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZUJhY2tlbmRE
aXJlY3QyREltcGwuaCIKKworI2lmIFVTRShESVJFQ1QyRCkKKworI2luY2x1ZGUgIkRpcmVjdDJE
VXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgorI2luY2x1ZGUgIkZsb2F0U2l6
ZS5oIgorI2luY2x1ZGUgIkltYWdlRGVjb2RlckRpcmVjdDJELmgiCisjaW5jbHVkZSAiSW50UmVj
dC5oIgorI2luY2x1ZGUgIkludFNpemUuaCIKKyNpbmNsdWRlIDx3aW5jb2RlYy5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBTZWNvbmRzIHNjcm9sbEh5c3RlcmVzaXNE
dXJhdGlvbiB7IDMwMF9tcyB9OworCitzdGF0aWMgQ09NUHRyPElXSUNCaXRtYXA+IGNyZWF0ZURp
cmVjdDJESW1hZ2VTdXJmYWNlV2l0aEZhc3RNYWxsb2MoY29uc3QgSW50U2l6ZSYgc2l6ZSwgZG91
YmxlIGRldmljZVNjYWxlRmFjdG9yLCB2b2lkKiYgYmFja2luZ1N0b3JlRGF0YSkKK3sKKyAgICBh
dXRvIGJ5dGVzUGVyUm93ID0gNCAqIENoZWNrZWQ8dW5zaWduZWQsIFJlY29yZE92ZXJmbG93Pihz
aXplLndpZHRoKCkpOworICAgIGlmIChieXRlc1BlclJvdy5oYXNPdmVyZmxvd2VkKCkpCisgICAg
ICAgIHJldHVybiBudWxscHRyOworCisgICAgQ2hlY2tlZDxzaXplX3QsIFJlY29yZE92ZXJmbG93
PiBudW1CeXRlcyA9IENoZWNrZWQ8dW5zaWduZWQsIFJlY29yZE92ZXJmbG93PihzaXplLmhlaWdo
dCgpKSAqIGJ5dGVzUGVyUm93OworICAgIGlmIChudW1CeXRlcy5oYXNPdmVyZmxvd2VkKCkpCisg
ICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgYmFja2luZ1N0b3JlRGF0YSA9IGZhc3RaZXJv
ZWRNYWxsb2MobnVtQnl0ZXMudW5zYWZlR2V0KCkpOworCisgICAgcmV0dXJuIERpcmVjdDJEOjpj
cmVhdGVEaXJlY3QyREltYWdlU3VyZmFjZVdpdGhEYXRhKGJhY2tpbmdTdG9yZURhdGEsIHNpemUs
IGJ5dGVzUGVyUm93LnVuc2FmZUdldCgpKTsKK30KKworQmFja2luZ1N0b3JlQmFja2VuZERpcmVj
dDJESW1wbDo6QmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbChjb25zdCBJbnRTaXplJiBz
aXplLCBmbG9hdCBkZXZpY2VTY2FsZUZhY3RvcikKKyAgICA6IEJhY2tpbmdTdG9yZUJhY2tlbmRE
aXJlY3QyRChzaXplKQorICAgICwgbV9zY3JvbGxlZEh5c3RlcmVzaXMoW3RoaXNdKFBBTDo6SHlz
dGVyZXNpc1N0YXRlIHN0YXRlKSB7CisgICAgICAgIGlmIChzdGF0ZSA9PSBQQUw6Okh5c3RlcmVz
aXNTdGF0ZTo6U3RvcHBlZCkKKyAgICAgICAgICAgIG1fc2Nyb2xsU3VyZmFjZSA9IG51bGxwdHI7
CisgICAgICAgIH0sIHNjcm9sbEh5c3RlcmVzaXNEdXJhdGlvbikKK3sKKyAgICBJbnRTaXplIHNj
YWxlZFNpemUgPSBtX3NpemU7CisgICAgc2NhbGVkU2l6ZS5zY2FsZShkZXZpY2VTY2FsZUZhY3Rv
cik7CisgICAgbV9zdXJmYWNlID0gY3JlYXRlRGlyZWN0MkRJbWFnZVN1cmZhY2VXaXRoRmFzdE1h
bGxvYyhzY2FsZWRTaXplLCBkZXZpY2VTY2FsZUZhY3RvciwgbV9zdXJmYWNlQmFja2luZ0RhdGEp
OworfQorCitCYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJbXBsOjp+QmFja2luZ1N0b3JlQmFj
a2VuZERpcmVjdDJESW1wbCgpCit7CisgICAgZmFzdEZyZWUobV9zdXJmYWNlQmFja2luZ0RhdGEp
OworICAgIGZhc3RGcmVlKG1fc2Nyb2xsU3VyZmFjZUJhY2tpbmdEYXRhKTsKK30KKwordm9pZCBC
YWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJbXBsOjpzY3JvbGwoY29uc3QgSW50UmVjdCYgc2Ny
b2xsUmVjdCwgY29uc3QgSW50U2l6ZSYgc2Nyb2xsT2Zmc2V0KQoreworICAgIEludFJlY3QgdGFy
Z2V0UmVjdCA9IHNjcm9sbFJlY3Q7CisgICAgdGFyZ2V0UmVjdC5tb3ZlKHNjcm9sbE9mZnNldCk7
CisgICAgdGFyZ2V0UmVjdC5zaGlmdE1heFhFZGdlVG8odGFyZ2V0UmVjdC5tYXhYKCkgLSBzY3Jv
bGxPZmZzZXQud2lkdGgoKSk7CisgICAgdGFyZ2V0UmVjdC5zaGlmdE1heFlFZGdlVG8odGFyZ2V0
UmVjdC5tYXhZKCkgLSBzY3JvbGxPZmZzZXQuaGVpZ2h0KCkpOworICAgIGlmICh0YXJnZXRSZWN0
LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFtX3Njcm9sbFN1cmZhY2Up
IHsKKyAgICAgICAgYXV0byBzaXplID0gRGlyZWN0MkQ6OmJpdG1hcFNpemUobV9zdXJmYWNlLmdl
dCgpKTsKKyAgICAgICAgYXV0byBzY2FsZSA9IERpcmVjdDJEOjpiaXRtYXBSZXNvbHV0aW9uKG1f
c3VyZmFjZS5nZXQoKSk7CisgICAgICAgIEFTU0VSVChzY2FsZS54KCkgPT0gc2NhbGUueSgpKTsK
KyAgICAgICAgbV9zY3JvbGxTdXJmYWNlID0gY3JlYXRlRGlyZWN0MkRJbWFnZVN1cmZhY2VXaXRo
RmFzdE1hbGxvYyhzaXplLCBzY2FsZS54KCksIG1fc2Nyb2xsU3VyZmFjZUJhY2tpbmdEYXRhKTsK
KyAgICB9CisKKyAgICBEaXJlY3QyRDo6Y29weVJlY3RGcm9tT25lU3VyZmFjZVRvQW5vdGhlciht
X3N1cmZhY2UuZ2V0KCksIG1fc2Nyb2xsU3VyZmFjZS5nZXQoKSwgc2Nyb2xsT2Zmc2V0LCB0YXJn
ZXRSZWN0KTsKKyAgICBEaXJlY3QyRDo6Y29weVJlY3RGcm9tT25lU3VyZmFjZVRvQW5vdGhlciht
X3Njcm9sbFN1cmZhY2UuZ2V0KCksIG1fc3VyZmFjZS5nZXQoKSwgSW50U2l6ZSgpLCB0YXJnZXRS
ZWN0KTsKKworICAgIG1fc2Nyb2xsZWRIeXN0ZXJlc2lzLmltcHVsc2UoKTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKERJUkVDVDJEKQpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3Qy
REltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbC5oCShub25leGlzdGVudCkKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGly
ZWN0MkRJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
IElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICog
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNwcmFnbWEgb25jZQorCisjaWYgVVNFKERJUkVDVDJEKQorCisjaW5jbHVkZSAiQmFja2luZ1N0
b3JlQmFja2VuZERpcmVjdDJELmgiCisjaW5jbHVkZSAiQ09NUHRyLmgiCisjaW5jbHVkZSA8cGFs
L0h5c3RlcmVzaXNBY3Rpdml0eS5oPgorCitpbnRlcmZhY2UgSVdJQ0JpdG1hcDsKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjbGFzcyBCYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJbXBsIGZp
bmFsIDogcHVibGljIEJhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyRCB7CitwdWJsaWM6CisgICAg
V0VCQ09SRV9FWFBPUlQgQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbChjb25zdCBJbnRT
aXplJiwgZmxvYXQgZGV2aWNlU2NhbGVGYWN0b3IpOworICAgIHZpcnR1YWwgfkJhY2tpbmdTdG9y
ZUJhY2tlbmREaXJlY3QyREltcGwoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHNjcm9sbChjb25z
dCBJbnRSZWN0JiwgY29uc3QgSW50U2l6ZSYpIG92ZXJyaWRlOworCisgICAgQ09NUHRyPElXSUNC
aXRtYXA+IG1fc2Nyb2xsU3VyZmFjZTsKKyAgICB2b2lkKiBtX3Njcm9sbFN1cmZhY2VCYWNraW5n
RGF0YTsKKworICAgIFBBTDo6SHlzdGVyZXNpc0FjdGl2aXR5IG1fc2Nyb2xsZWRIeXN0ZXJlc2lz
OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKERJUkVDVDJE
KQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0RpcmVjdDJET3Bl
cmF0aW9ucy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0RpcmVjdDJET3BlcmF0aW9ucy5jcHAJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0RpcmVjdDJET3BlcmF0aW9ucy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxMjAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIw
MTkgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAw
NyBBbHAgVG9rZXIgPGFscEBhdG9rZXIuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5
IERpcmsgU2NodWx6ZSA8a3JpdEB3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IE51
YW50aSBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQnJlbnQgRnVsZ2hhbSA8YmZ1bGdoYW1A
d2Via2l0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBJZ2FsaWEgUy5MLgorICog
Q29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDEwLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiRGlyZWN0MkRPcGVyYXRpb25zLmgiCisKKyNpZiBVU0UoRElSRUNUMkQp
CisKKyNpbmNsdWRlICJEaXJlY3QyRFV0aWxpdGllcy5oIgorI2luY2x1ZGUgIkZsb2F0Q29udmVy
c2lvbi5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURpcmVjdDJELmgi
CisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUg
Ik5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGF0aC5oIgorI2luY2x1ZGUgIlBsYXRmb3Jt
Q29udGV4dERpcmVjdDJELmgiCisjaW5jbHVkZSAiU2hhZG93Qmx1ci5oIgorI2luY2x1ZGUgPGFs
Z29yaXRobT4KKyNpbmNsdWRlIDxkMmQxLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVz
cGFjZSBEaXJlY3QyRCB7CisKK2VudW0gUGF0dGVybkFkanVzdG1lbnQgeyBOb0FkanVzdG1lbnQs
IEFkanVzdFBhdHRlcm5Gb3JHbG9iYWxBbHBoYSB9OworZW51bSBBbHBoYVByZXNlcnZhdGlvbiB7
IERvTm90UHJlc2VydmVBbHBoYSwgUHJlc2VydmVBbHBoYSB9OworCisKK2NsYXNzIFBsYXRmb3Jt
Q29udGV4dFN0YXRlU2F2ZXIgeworcHVibGljOgorICAgIFBsYXRmb3JtQ29udGV4dFN0YXRlU2F2
ZXIoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIGNvbnRleHQsIGJvb2wgc2F2ZUFuZFJlc3RvcmUg
PSB0cnVlKQorICAgICAgICA6IG1fY29udGV4dChjb250ZXh0KQorICAgICAgICAsIG1fc2F2ZUFu
ZFJlc3RvcmUoc2F2ZUFuZFJlc3RvcmUpCisgICAgeworICAgICAgICBpZiAobV9zYXZlQW5kUmVz
dG9yZSkKKyAgICAgICAgICAgIG1fY29udGV4dC5zYXZlKCk7CisgICAgfQorCisgICAgflBsYXRm
b3JtQ29udGV4dFN0YXRlU2F2ZXIoKQorICAgIHsKKyAgICAgICAgaWYgKG1fc2F2ZUFuZFJlc3Rv
cmUpCisgICAgICAgICAgICBtX2NvbnRleHQucmVzdG9yZSgpOworICAgIH0KKworICAgIHZvaWQg
c2F2ZSgpCisgICAgeworICAgICAgICBBU1NFUlQoIW1fc2F2ZUFuZFJlc3RvcmUpOworICAgICAg
ICBtX2NvbnRleHQuc2F2ZSgpOworICAgICAgICBtX3NhdmVBbmRSZXN0b3JlID0gdHJ1ZTsKKyAg
ICB9CisKKyAgICB2b2lkIHJlc3RvcmUoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fc2F2ZUFu
ZFJlc3RvcmUpOworICAgICAgICBtX2NvbnRleHQucmVzdG9yZSgpOworICAgICAgICBtX3NhdmVB
bmRSZXN0b3JlID0gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBkaWRTYXZlKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBtX3NhdmVBbmRSZXN0b3JlOworICAgIH0KKworcHJpdmF0ZToK
KyAgICBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgbV9jb250ZXh0OworICAgIGJvb2wgbV9zYXZl
QW5kUmVzdG9yZSB7IGZhbHNlIH07Cit9OworCisvLyBGSVhNRTogUmVwbGFjZSBvbmNlIEdyYXBo
aWNzQ29udGV4dDo6ZGFzaGVkTGluZUNvcm5lcldpZHRoRm9yU3Ryb2tlV2lkdGgoKQorLy8gaXMg
cmVmYWN0b3JlZCBhcyBhIHN0YXRpYyBwdWJsaWMgZnVuY3Rpb24uCitzdGF0aWMgZmxvYXQgZGFz
aGVkTGluZUNvcm5lcldpZHRoRm9yU3Ryb2tlV2lkdGgoZmxvYXQgc3Ryb2tlV2lkdGgsIFN0cm9r
ZVN0eWxlIHN0cm9rZVN0eWxlLCBmbG9hdCBzdHJva2VUaGlja25lc3MpCit7CisgICAgcmV0dXJu
IHN0cm9rZVN0eWxlID09IERvdHRlZFN0cm9rZSA/IHN0cm9rZVRoaWNrbmVzcyA6IHN0ZDo6bWlu
KDIuMGYgKiBzdHJva2VUaGlja25lc3MsIHN0ZDo6bWF4KHN0cm9rZVRoaWNrbmVzcywgc3Ryb2tl
V2lkdGggLyAzLjBmKSk7Cit9CisKKy8vIEZJWE1FOiBSZXBsYWNlIG9uY2UgR3JhcGhpY3NDb250
ZXh0OjpkYXNoZWRMaW5lUGF0dGVybldpZHRoRm9yU3Ryb2tlV2lkdGgoKQorLy8gaXMgcmVmYWN0
b3JlZCBhcyBhIHN0YXRpYyBwdWJsaWMgZnVuY3Rpb24uCitzdGF0aWMgZmxvYXQgZGFzaGVkTGlu
ZVBhdHRlcm5XaWR0aEZvclN0cm9rZVdpZHRoKGZsb2F0IHN0cm9rZVdpZHRoLCBTdHJva2VTdHls
ZSBzdHJva2VTdHlsZSwgZmxvYXQgc3Ryb2tlVGhpY2tuZXNzKQoreworICAgIHJldHVybiBzdHJv
a2VTdHlsZSA9PSBEb3R0ZWRTdHJva2UgPyBzdHJva2VUaGlja25lc3MgOiBzdGQ6Om1pbigzLjBm
ICogc3Ryb2tlVGhpY2tuZXNzLCBzdGQ6Om1heChzdHJva2VUaGlja25lc3MsIHN0cm9rZVdpZHRo
IC8gMy4wZikpOworfQorCisvLyBGSVhNRTogUmVwbGFjZSBvbmNlIEdyYXBoaWNzQ29udGV4dDo6
ZGFzaGVkTGluZVBhdHRlcm5PZmZzZXRGb3JQYXR0ZXJuQW5kU3Ryb2tlV2lkdGgoKQorLy8gaXMg
cmVmYWN0b3JlZCBhcyBhIHN0YXRpYyBwdWJsaWMgZnVuY3Rpb24uCitzdGF0aWMgZmxvYXQgZGFz
aGVkTGluZVBhdHRlcm5PZmZzZXRGb3JQYXR0ZXJuQW5kU3Ryb2tlV2lkdGgoZmxvYXQgcGF0dGVy
bldpZHRoLCBmbG9hdCBzdHJva2VXaWR0aCkKK3sKKyAgICAvLyBQYXR0ZXJuIHN0YXJ0cyB3aXRo
IGZ1bGwgZmlsbCBhbmQgZW5kcyB3aXRoIHRoZSBlbXB0eSBmaWxsLgorICAgIC8vIDEuIExldCdz
IHN0YXJ0IHdpdGggdGhlIGVtcHR5IHBoYXNlIGFmdGVyIHRoZSBjb3JuZXIuCisgICAgLy8gMi4g
Q2hlY2sgaWYgd2UndmUgZ290IG9kZCBvciBldmVuIG51bWJlciBvZiBwYXR0ZXJucyBhbmQgd2hl
dGhlciB0aGV5IGZ1bGx5IGNvdmVyIHRoZSBsaW5lLgorICAgIC8vIDMuIEluIGNhc2Ugb2YgZXZl
biBudW1iZXIgb2YgcGF0dGVybnMgYW5kL29yIHJlbWFpbmRlciwgbW92ZSB0aGUgcGF0dGVybiBz
dGFydCBwb3NpdGlvbgorICAgIC8vIHNvIHRoYXQgdGhlIHBhdHRlcm4gaXMgYmFsYW5jZWQgYmV0
d2VlbiB0aGUgY29ybmVycy4KKyAgICBmbG9hdCBwYXR0ZXJuT2Zmc2V0ID0gcGF0dGVybldpZHRo
OworICAgIGludCBudW1iZXJPZlNlZ21lbnRzID0gc3RkOjpmbG9vcihzdHJva2VXaWR0aCAvIHBh
dHRlcm5XaWR0aCk7CisgICAgYm9vbCBvZGROdW1iZXJPZlNlZ21lbnRzID0gbnVtYmVyT2ZTZWdt
ZW50cyAlIDI7CisgICAgZmxvYXQgcmVtYWluZGVyID0gc3Ryb2tlV2lkdGggLSAobnVtYmVyT2ZT
ZWdtZW50cyAqIHBhdHRlcm5XaWR0aCk7CisgICAgaWYgKG9kZE51bWJlck9mU2VnbWVudHMgJiYg
cmVtYWluZGVyKQorICAgICAgICBwYXR0ZXJuT2Zmc2V0IC09IHJlbWFpbmRlciAvIDIuMGY7Cisg
ICAgZWxzZSBpZiAoIW9kZE51bWJlck9mU2VnbWVudHMpIHsKKyAgICAgICAgaWYgKHJlbWFpbmRl
cikKKyAgICAgICAgICAgIHBhdHRlcm5PZmZzZXQgKz0gcGF0dGVybk9mZnNldCAtIChwYXR0ZXJu
V2lkdGggKyByZW1haW5kZXIpIC8gMi4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGF0
dGVybk9mZnNldCArPSBwYXR0ZXJuV2lkdGggLyAyLjBmOworICAgIH0KKworICAgIHJldHVybiBw
YXR0ZXJuT2Zmc2V0OworfQorCisvLyBGSVhNRTogUmVwbGFjZSBvbmNlIEdyYXBoaWNzQ29udGV4
dDo6Y2VudGVyTGluZUFuZEN1dE9mZkNvcm5lcnMoKQorLy8gaXMgcmVmYWN0b3JlZCBhcyBhIHN0
YXRpYyBwdWJsaWMgZnVuY3Rpb24uCitzdGF0aWMgVmVjdG9yPEZsb2F0UG9pbnQ+IGNlbnRlckxp
bmVBbmRDdXRPZmZDb3JuZXJzKGJvb2wgaXNWZXJ0aWNhbExpbmUsIGZsb2F0IGNvcm5lcldpZHRo
LCBGbG9hdFBvaW50IHBvaW50MSwgRmxvYXRQb2ludCBwb2ludDIpCit7CisgICAgLy8gQ2VudGVy
IGxpbmUgYW5kIGN1dCBvZmYgY29ybmVycyBmb3IgcGF0dGVybiBwYWludGluZy4KKyAgICBpZiAo
aXNWZXJ0aWNhbExpbmUpIHsKKyAgICAgICAgZmxvYXQgY2VudGVyT2Zmc2V0ID0gKHBvaW50Mi54
KCkgLSBwb2ludDEueCgpKSAvIDIuMGY7CisgICAgICAgIHBvaW50MS5tb3ZlKGNlbnRlck9mZnNl
dCwgY29ybmVyV2lkdGgpOworICAgICAgICBwb2ludDIubW92ZSgtY2VudGVyT2Zmc2V0LCAtY29y
bmVyV2lkdGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0IGNlbnRlck9mZnNldCA9IChw
b2ludDIueSgpIC0gcG9pbnQxLnkoKSkgLyAyLjBmOworICAgICAgICBwb2ludDEubW92ZShjb3Ju
ZXJXaWR0aCwgY2VudGVyT2Zmc2V0KTsKKyAgICAgICAgcG9pbnQyLm1vdmUoLWNvcm5lcldpZHRo
LCAtY2VudGVyT2Zmc2V0KTsKKyAgICB9CisKKyAgICByZXR1cm4geyBwb2ludDEsIHBvaW50MiB9
OworfQorCisKK25hbWVzcGFjZSBTdGF0ZSB7CisKK3ZvaWQgc2V0U3Ryb2tlVGhpY2tuZXNzKFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGZsb2F0IHN0cm9rZVRoaWNr
bmVzcykKK3sKKyAgICBwbGF0Zm9ybUNvbnRleHQuc2V0U3Ryb2tlVGhpY2tuZXNzKHN0cm9rZVRo
aWNrbmVzcyk7Cit9CisKK3ZvaWQgc2V0U3Ryb2tlU3R5bGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmIHBsYXRmb3JtQ29udGV4dCwgU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUpCit7CisgICAgcGxh
dGZvcm1Db250ZXh0LnNldFN0cm9rZVN0eWxlKHN0cm9rZVN0eWxlKTsKK30KKwordm9pZCBzZXRD
b21wb3NpdGVPcGVyYXRpb24oUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4
dCwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3BlcmF0aW9uLCBCbGVuZE1vZGUgYmxlbmRN
b2RlKQoreworICAgIEQyRDFfQkxFTkRfTU9ERSB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5E
X01PREVfU0NSRUVOOworICAgIEQyRDFfQ09NUE9TSVRFX01PREUgdGFyZ2V0Q29tcG9zaXRlTW9k
ZSA9IEQyRDFfQ09NUE9TSVRFX01PREVfU09VUkNFX0FUT1A7CisKKyAgICBpZiAoYmxlbmRNb2Rl
ICE9IEJsZW5kTW9kZTo6Tm9ybWFsKSB7CisgICAgICAgIHN3aXRjaCAoYmxlbmRNb2RlKSB7Cisg
ICAgICAgIGNhc2UgQmxlbmRNb2RlOjpNdWx0aXBseToKKyAgICAgICAgICAgIHRhcmdldEJsZW5k
TW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9NVUxUSVBMWTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIEJsZW5kTW9kZTo6U2NyZWVuOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2Rl
ID0gRDJEMV9CTEVORF9NT0RFX1NDUkVFTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEJsZW5kTW9kZTo6T3ZlcmxheToKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQy
RDFfQkxFTkRfTU9ERV9PVkVSTEFZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
QmxlbmRNb2RlOjpEYXJrZW46CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JM
RU5EX01PREVfREFSS0VOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRN
b2RlOjpMaWdodGVuOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9N
T0RFX0xJR0hURU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVuZE1vZGU6
OkNvbG9yRG9kZ2U6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01P
REVfQ09MT1JfRE9ER0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVuZE1v
ZGU6OkNvbG9yQnVybjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRf
TU9ERV9DT0xPUl9CVVJOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRN
b2RlOjpIYXJkTGlnaHQ6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5E
X01PREVfSEFSRF9MSUdIVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5k
TW9kZTo6U29mdExpZ2h0OgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVO
RF9NT0RFX1NPRlRfTElHSFQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVu
ZE1vZGU6OkRpZmZlcmVuY2U6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JM
RU5EX01PREVfRElGRkVSRU5DRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJs
ZW5kTW9kZTo6RXhjbHVzaW9uOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9C
TEVORF9NT0RFX0VYQ0xVU0lPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJs
ZW5kTW9kZTo6SHVlOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9N
T0RFX0hVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9kZTo6U2F0
dXJhdGlvbjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9T
QVRVUkFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2RlOjpD
b2xvcjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DT0xP
UjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9kZTo6THVtaW5vc2l0
eToKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9MVU1JTk9T
SVRZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2RlOjpQbHVzRGFy
a2VyOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0RBUktF
Ul9DT0xPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9kZTo6UGx1
c0xpZ2h0ZXI6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVf
TElHSFRFUl9DT0xPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2gg
KGNvbXBvc2l0ZU9wZXJhdGlvbikgeworICAgICAgICBjYXNlIENvbXBvc2l0ZUNsZWFyOgorICAg
ICAgICAgICAgLy8gRklYTUU6IHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DTEVB
UjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBvc2l0ZUNvcHk6CisgICAg
ICAgICAgICAvLyBGSVhNRTogdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0NPUFk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdmVyOgor
ICAgICAgICAgICAgLy8gRklYTUU6IGtDR0JsZW5kTW9kZU5vcm1hbAorICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlU291cmNlSW46CisgICAgICAgICAgICB0YXJnZXRD
b21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9TT1VSQ0VfSU47CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdXQ6CisgICAgICAgICAgICB0
YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9TT1VSQ0VfT1VUOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlU291cmNlQXRvcDoKKyAgICAg
ICAgICAgIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX1NPVVJDRV9B
VE9QOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRp
b25PdmVyOgorICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRF
X01PREVfREVTVElOQVRJT05fT1ZFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IENvbXBvc2l0ZURlc3RpbmF0aW9uSW46CisgICAgICAgICAgICB0YXJnZXRDb21wb3NpdGVNb2Rl
ID0gRDJEMV9DT01QT1NJVEVfTU9ERV9ERVNUSU5BVElPTl9JTjsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uT3V0OgorICAgICAgICAgICAgdGFy
Z2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRFX01PREVfREVTVElOQVRJT05fT1VUOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25BdG9w
OgorICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRFX01PREVf
REVTVElOQVRJT05fQVRPUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBv
c2l0ZVhPUjoKKyAgICAgICAgICAgIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lU
RV9NT0RFX1hPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBvc2l0ZVBs
dXNEYXJrZXI6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVf
REFSS0VSX0NPTE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRl
UGx1c0xpZ2h0ZXI6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01P
REVfTElHSFRFUl9DT0xPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBv
c2l0ZURpZmZlcmVuY2U6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5E
X01PREVfRElGRkVSRU5DRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQor
CisgICAgcGxhdGZvcm1Db250ZXh0LnNldEJsZW5kTW9kZSh0YXJnZXRCbGVuZE1vZGUpOworICAg
IHBsYXRmb3JtQ29udGV4dC5zZXRDb21wb3NpdGVNb2RlKHRhcmdldENvbXBvc2l0ZU1vZGUpOwor
fQorCit2b2lkIHNldFNob3VsZEFudGlhbGlhcyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxh
dGZvcm1Db250ZXh0LCBib29sIGVuYWJsZSkKK3sKKyAgICBhdXRvIGFudGlhbGlhc01vZGUgPSBl
bmFibGUgPyBEMkQxX0FOVElBTElBU19NT0RFX1BFUl9QUklNSVRJVkUgOiBEMkQxX0FOVElBTElB
U19NT0RFX0FMSUFTRUQ7CisgICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5TZXRB
bnRpYWxpYXNNb2RlKGFudGlhbGlhc01vZGUpOworfQorCit2b2lkIHNldENUTShQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRy
YW5zZm9ybSkKK3sKKyAgICBBU1NFUlQocGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpKTsK
KyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPlNldFRyYW5zZm9ybSh0cmFuc2Zv
cm0pOworCisgICAgaWYgKGF1dG8qIGdyYXBoaWNzQ29udGV4dFByaXZhdGUgPSBwbGF0Zm9ybUNv
bnRleHQuZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICAgICBncmFwaGljc0NvbnRleHRQ
cml2YXRlLT5zZXRDVE0odHJhbnNmb3JtKTsKK30KKworQWZmaW5lVHJhbnNmb3JtIGdldENUTShQ
bGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0KQoreworICAgIEFTU0VSVChw
bGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpOworICAgIEQyRDFfTUFUUklYXzNYMl9GIGN1
cnJlbnRUcmFuc2Zvcm07CisgICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5HZXRU
cmFuc2Zvcm0oJmN1cnJlbnRUcmFuc2Zvcm0pOworICAgIHJldHVybiBjdXJyZW50VHJhbnNmb3Jt
OworfQorCitJbnRSZWN0IGdldENsaXBCb3VuZHMoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBs
YXRmb3JtQ29udGV4dCkKK3sKKyAgICBEMkQxX1NJWkVfRiBjbGlwU2l6ZTsKKyAgICBpZiAoYXV0
byBjbGlwTGF5ZXIgPSBwbGF0Zm9ybUNvbnRleHQuY2xpcExheWVyKCkpCisgICAgICAgIGNsaXBT
aXplID0gY2xpcExheWVyLT5HZXRTaXplKCk7CisgICAgZWxzZQorICAgICAgICBjbGlwU2l6ZSA9
IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+R2V0U2l6ZSgpOworCisgICAgRmxvYXRS
ZWN0IGNsaXBCb3VuZHMoSW50UG9pbnQoKSwgY2xpcFNpemUpOworCisgICAgcmV0dXJuIGVuY2xv
c2luZ0ludFJlY3QoY2xpcEJvdW5kcyk7Cit9CisKK0Zsb2F0UmVjdCByb3VuZFRvRGV2aWNlUGl4
ZWxzKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0
UmVjdCYgcmVjdCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgcmV0dXJuIHJlY3Q7
Cit9CisKK2Jvb2wgaXNBY2NlbGVyYXRlZENvbnRleHQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQm
IHBsYXRmb3JtQ29udGV4dCkKK3sKKyAgICBhdXRvIHJlbmRlclByb3BlcnRpZXMgPSBEMkQxOjpS
ZW5kZXJUYXJnZXRQcm9wZXJ0aWVzKCk7CisgICAgcmVuZGVyUHJvcGVydGllcy50eXBlID0gRDJE
MV9SRU5ERVJfVEFSR0VUX1RZUEVfSEFSRFdBUkU7CisgICAgcmV0dXJuIHBsYXRmb3JtQ29udGV4
dC5yZW5kZXJUYXJnZXQoKS0+SXNTdXBwb3J0ZWQoJnJlbmRlclByb3BlcnRpZXMpOworfQorCit9
IC8vIG5hbWVzcGFjZSBTdGF0ZQorCitGaWxsU291cmNlOjpGaWxsU291cmNlKGNvbnN0IEdyYXBo
aWNzQ29udGV4dFN0YXRlJiBzdGF0ZSwgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3Jt
Q29udGV4dCkKKyAgICA6IGdsb2JhbEFscGhhKHN0YXRlLmFscGhhKQorICAgICwgY29sb3Ioc3Rh
dGUuZmlsbENvbG9yKQorICAgICwgZmlsbFJ1bGUoc3RhdGUuZmlsbFJ1bGUpCit7CisgICAgaWYg
KHN0YXRlLmZpbGxQYXR0ZXJuKSB7CisgICAgICAgIEFmZmluZVRyYW5zZm9ybSB1c2VyVG9CYXNl
Q1RNOyAvLyBGSVhNRTogVGhpcyBpc24ndCByZWFsbHkgbmVlZGVkIG9uIFdpbmRvd3MKKyAgICAg
ICAgYnJ1c2ggPSBzdGF0ZS5maWxsUGF0dGVybi0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKHBsYXRm
b3JtQ29udGV4dCwgc3RhdGUuYWxwaGEsIHVzZXJUb0Jhc2VDVE0pOworICAgIH0gZWxzZSBpZiAo
c3RhdGUuZmlsbEdyYWRpZW50KQorICAgICAgICBicnVzaCA9IHN0YXRlLmZpbGxHcmFkaWVudC0+
Y3JlYXRlUGxhdGZvcm1HcmFkaWVudElmTmVjZXNzYXJ5KHBsYXRmb3JtQ29udGV4dC5yZW5kZXJU
YXJnZXQoKSk7CisgICAgZWxzZQorICAgICAgICBicnVzaCA9IHBsYXRmb3JtQ29udGV4dC5icnVz
aFdpdGhDb2xvcihjb2xvcik7Cit9CisKK1N0cm9rZVNvdXJjZTo6U3Ryb2tlU291cmNlKGNvbnN0
IEdyYXBoaWNzQ29udGV4dFN0YXRlJiBzdGF0ZSwgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBs
YXRmb3JtQ29udGV4dCkKKyAgICA6IGdsb2JhbEFscGhhKHN0YXRlLmFscGhhKQorICAgICwgdGhp
Y2tuZXNzKHN0YXRlLnN0cm9rZVRoaWNrbmVzcykKKyAgICAsIGNvbG9yKHN0YXRlLnN0cm9rZUNv
bG9yKQoreworICAgIGlmIChzdGF0ZS5zdHJva2VQYXR0ZXJuKSB7CisgICAgICAgIEFmZmluZVRy
YW5zZm9ybSB1c2VyVG9CYXNlQ1RNOyAvLyBGSVhNRTogVGhpcyBpc24ndCByZWFsbHkgbmVlZGVk
IG9uIFdpbmRvd3MKKyAgICAgICAgYnJ1c2ggPSBzdGF0ZS5zdHJva2VQYXR0ZXJuLT5jcmVhdGVQ
bGF0Zm9ybVBhdHRlcm4ocGxhdGZvcm1Db250ZXh0LCBzdGF0ZS5hbHBoYSwgdXNlclRvQmFzZUNU
TSk7CisgICAgfSBlbHNlIGlmIChzdGF0ZS5zdHJva2VHcmFkaWVudCkKKyAgICAgICAgYnJ1c2gg
PSBzdGF0ZS5zdHJva2VHcmFkaWVudC0+Y3JlYXRlUGxhdGZvcm1HcmFkaWVudElmTmVjZXNzYXJ5
KHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKSk7CisgICAgZWxzZQorICAgICAgICBicnVz
aCA9IHBsYXRmb3JtQ29udGV4dC5icnVzaFdpdGhDb2xvcihjb2xvcik7Cit9CisKK1NoYWRvd1N0
YXRlOjpTaGFkb3dTdGF0ZShjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYgc3RhdGUpCisgICAg
OiBvZmZzZXQoc3RhdGUuc2hhZG93T2Zmc2V0KQorICAgICwgYmx1cihzdGF0ZS5zaGFkb3dCbHVy
KQorICAgICwgY29sb3Ioc3RhdGUuc2hhZG93Q29sb3IpCisgICAgLCBpZ25vcmVUcmFuc2Zvcm1z
KHN0YXRlLnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zKQorICAgICwgZ2xvYmFsQWxwaGEoc3RhdGUu
YWxwaGEpCisgICAgLCBnbG9iYWxDb21wb3NpdGVPcGVyYXRvcihzdGF0ZS5jb21wb3NpdGVPcGVy
YXRvcikKK3sKK30KKworYm9vbCBTaGFkb3dTdGF0ZTo6aXNWaXNpYmxlKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gY29sb3IuaXNWaXNpYmxlKCkgJiYgKG9mZnNldC53aWR0aCgpIHx8IG9mZnNldC5o
ZWlnaHQoKSB8fCBibHVyKTsKK30KKworYm9vbCBTaGFkb3dTdGF0ZTo6aXNSZXF1aXJlZChQbGF0
Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0KSBjb25zdAoreworICAgIC8vIFdl
IGNhbid0IGF2b2lkIFNoYWRvd0JsdXIgaWYgdGhlIHNoYWRvdyBoYXMgYmx1ci4KKyAgICBpZiAo
Y29sb3IuaXNWaXNpYmxlKCkgJiYgYmx1cikKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAv
LyBXZSBjYW4gYXZvaWQgU2hhZG93Qmx1ciBhbmQgb3B0aW1pemUsIHNpbmNlIHdlJ3JlIG5vdCBk
cmF3aW5nIG9uIGEKKyAgICAvLyBjYW52YXMgYW5kIGJveCBzaGFkb3dzIGFyZSBhZmZlY3RlZCBi
eSB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgIGlmICghaWdub3JlVHJhbnNmb3JtcykK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gV2UgY2FuIGF2b2lkIFNoYWRvd0JsdXIs
IHNpbmNlIHRoZXJlIGFyZSBubyB0cmFuc2Zvcm1hdGlvbnMgdG8gYXBwbHkgdG8gdGhlIGNhbnZh
cy4KKyAgICBpZiAoU3RhdGU6OmdldENUTShwbGF0Zm9ybUNvbnRleHQpLmlzSWRlbnRpdHkoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gT3RoZXJ3aXNlLCBubyBjaGFuY2UgYXZv
aWRpbmcgU2hhZG93Qmx1ci4KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBzZXRMaW5lQ2Fw
KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIExpbmVDYXAgbGluZUNh
cCkKK3sKKyAgICBEMkQxX0NBUF9TVFlMRSBjYXBTdHlsZSA9IEQyRDFfQ0FQX1NUWUxFX0ZMQVQ7
CisgICAgc3dpdGNoIChsaW5lQ2FwKSB7CisgICAgY2FzZSBSb3VuZENhcDoKKyAgICAgICAgY2Fw
U3R5bGUgPSBEMkQxX0NBUF9TVFlMRV9ST1VORDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBT
cXVhcmVDYXA6CisgICAgICAgIGNhcFN0eWxlID0gRDJEMV9DQVBfU1RZTEVfU1FVQVJFOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIEJ1dHRDYXA6CisgICAgZGVmYXVsdDoKKyAgICAgICAgY2Fw
U3R5bGUgPSBEMkQxX0NBUF9TVFlMRV9GTEFUOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAg
ICBwbGF0Zm9ybUNvbnRleHQuc2V0TGluZUNhcChjYXBTdHlsZSk7Cit9CisKK3ZvaWQgc2V0TGlu
ZURhc2goUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgRGFz
aEFycmF5JiBkYXNoZXMsIGZsb2F0IGRhc2hPZmZzZXQpCit7CisgICAgcGxhdGZvcm1Db250ZXh0
LnNldERhc2hlcyhkYXNoZXMpOworICAgIHBsYXRmb3JtQ29udGV4dC5zZXREYXNoT2Zmc2V0KGRh
c2hPZmZzZXQpOworfQorCit2b2lkIHNldExpbmVKb2luKFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
JiBwbGF0Zm9ybUNvbnRleHQsIExpbmVKb2luIGxpbmVKb2luKQoreworICAgIEQyRDFfTElORV9K
T0lOIGpvaW5TdHlsZSA9IEQyRDFfTElORV9KT0lOX01JVEVSOworICAgIHN3aXRjaCAobGluZUpv
aW4pIHsKKyAgICBjYXNlIFJvdW5kSm9pbjoKKyAgICAgICAgam9pblN0eWxlID0gRDJEMV9MSU5F
X0pPSU5fUk9VTkQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQmV2ZWxKb2luOgorICAgICAg
ICBqb2luU3R5bGUgPSBEMkQxX0xJTkVfSk9JTl9CRVZFTDsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBNaXRlckpvaW46CisgICAgZGVmYXVsdDoKKyAgICAgICAgam9pblN0eWxlID0gRDJEMV9M
SU5FX0pPSU5fTUlURVI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHBsYXRmb3JtQ29u
dGV4dC5zZXRMaW5lSm9pbihqb2luU3R5bGUpOworfQorCit2b2lkIHNldE1pdGVyTGltaXQoUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgZmxvYXQgbWl0ZXJMaW1pdCkK
K3sKKyAgICBwbGF0Zm9ybUNvbnRleHQuc2V0TWl0ZXJMaW1pdChtaXRlckxpbWl0KTsKK30KKwor
dm9pZCBmaWxsUmVjdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBj
b25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IEZpbGxTb3VyY2UmIGZpbGxTb3VyY2UsIGNvbnN0
IFNoYWRvd1N0YXRlJiBzaGFkb3dTdGF0ZSkKK3sKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9y
bUNvbnRleHQucmVuZGVyVGFyZ2V0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElO
RV9fKTsKKyAgICBQbGF0Zm9ybUNvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIocGxhdGZvcm1D
b250ZXh0KTsKKyAgICBGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+IGRyYXdGdW5j
dGlvbiA9IFsmcGxhdGZvcm1Db250ZXh0LCByZWN0LCAmZmlsbFNvdXJjZV0oSUQyRDFSZW5kZXJU
YXJnZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICBjb25zdCBEMkQxX1JFQ1RfRiBkMmRSZWN0
ID0gcmVjdDsKKyAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsUmVjdGFuZ2xlKCZkMmRSZWN0LCBm
aWxsU291cmNlLmJydXNoLmdldCgpKTsKKyAgICB9OworCisgICAgaWYgKHNoYWRvd1N0YXRlLmlz
VmlzaWJsZSgpKQorICAgICAgICBkcmF3V2l0aFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIHJlY3Qs
IHNoYWRvd1N0YXRlLCBkcmF3RnVuY3Rpb24pOworICAgIGVsc2UKKyAgICAgICAgZHJhd1dpdGhv
dXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCByZWN0LCBkcmF3RnVuY3Rpb24pOworfQorCit2b2lk
IGZpbGxSZWN0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0
IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgQ29sb3ImIGNvbG9yLCBjb25zdCBTaGFkb3dTdGF0ZSYg
c2hhZG93U3RhdGUpCit7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0LnJlbmRl
clRhcmdldCgpOworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisgICAgUGxh
dGZvcm1Db250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKHBsYXRmb3JtQ29udGV4dCk7CisgICAg
RnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiBkcmF3RnVuY3Rpb24gPSBbJnBsYXRm
b3JtQ29udGV4dCwgY29sb3IsIHJlY3RdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQp
IHsKKyAgICAgICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9IHJlY3Q7CisgICAgICAgIHJl
bmRlclRhcmdldC0+RmlsbFJlY3RhbmdsZSgmZDJkUmVjdCwgcGxhdGZvcm1Db250ZXh0LmJydXNo
V2l0aENvbG9yKGNvbG9yKS5nZXQoKSk7CisgICAgfTsKKworICAgIGlmIChzaGFkb3dTdGF0ZS5p
c1Zpc2libGUoKSkKKyAgICAgICAgZHJhd1dpdGhTaGFkb3cocGxhdGZvcm1Db250ZXh0LCByZWN0
LCBzaGFkb3dTdGF0ZSwgZHJhd0Z1bmN0aW9uKTsKKyAgICBlbHNlCisgICAgICAgIGRyYXdXaXRo
b3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwgZHJhd0Z1bmN0aW9uKTsKK30KKwordm9p
ZCBmaWxsUm91bmRlZFJlY3QoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4
dCwgY29uc3QgRmxvYXRSb3VuZGVkUmVjdCYgcmVjdCwgY29uc3QgQ29sb3ImIGNvbG9yLCBjb25z
dCBTaGFkb3dTdGF0ZSYgc2hhZG93U3RhdGUpCit7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZv
cm1Db250ZXh0LnJlbmRlclRhcmdldCgpOworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5F
X18pOworCisgICAgY29uc3QgRmxvYXRSZWN0JiByID0gcmVjdC5yZWN0KCk7CisgICAgY29uc3Qg
RmxvYXRSb3VuZGVkUmVjdDo6UmFkaWkmIHJhZGlpID0gcmVjdC5yYWRpaSgpOworICAgIGJvb2wg
ZXF1YWxXaWR0aHMgPSAocmFkaWkudG9wTGVmdCgpLndpZHRoKCkgPT0gcmFkaWkudG9wUmlnaHQo
KS53aWR0aCgpICYmIHJhZGlpLnRvcFJpZ2h0KCkud2lkdGgoKSA9PSByYWRpaS5ib3R0b21MZWZ0
KCkud2lkdGgoKSAmJiByYWRpaS5ib3R0b21MZWZ0KCkud2lkdGgoKSA9PSByYWRpaS5ib3R0b21S
aWdodCgpLndpZHRoKCkpOworICAgIGJvb2wgZXF1YWxIZWlnaHRzID0gKHJhZGlpLnRvcExlZnQo
KS5oZWlnaHQoKSA9PSByYWRpaS5ib3R0b21MZWZ0KCkuaGVpZ2h0KCkgJiYgcmFkaWkuYm90dG9t
TGVmdCgpLmhlaWdodCgpID09IHJhZGlpLnRvcFJpZ2h0KCkuaGVpZ2h0KCkgJiYgcmFkaWkudG9w
UmlnaHQoKS5oZWlnaHQoKSA9PSByYWRpaS5ib3R0b21SaWdodCgpLmhlaWdodCgpKTsKKyAgICBi
b29sIGhhc0N1c3RvbUZpbGwgPSBmYWxzZTsgLy8gRklYTUU6IFdoeSBpc24ndCBhIEZpbGxTb3Vy
Y2UgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24/CisgICAgaWYgKCFoYXNDdXN0b21GaWxsICYmIGVx
dWFsV2lkdGhzICYmIGVxdWFsSGVpZ2h0cyAmJiByYWRpaS50b3BMZWZ0KCkud2lkdGgoKSAqIDIg
PT0gci53aWR0aCgpICYmIHJhZGlpLnRvcExlZnQoKS5oZWlnaHQoKSAqIDIgPT0gci5oZWlnaHQo
KSkgeworICAgICAgICBQbGF0Zm9ybUNvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIocGxhdGZv
cm1Db250ZXh0KTsKKyAgICAgICAgRnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiBk
cmF3RnVuY3Rpb24gPSBbJnBsYXRmb3JtQ29udGV4dCwgY29sb3IsIHJlY3QsIHJhZGlpLCByXShJ
RDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgICAgICBhdXRvIHJvdW5k
ZWRSZWN0ID0gRDJEMTo6Um91bmRlZFJlY3QociwgcmFkaWkudG9wTGVmdCgpLndpZHRoKCksIHJh
ZGlpLnRvcExlZnQoKS5oZWlnaHQoKSk7CisgICAgICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxS
b3VuZGVkUmVjdGFuZ2xlKCZyb3VuZGVkUmVjdCwgcGxhdGZvcm1Db250ZXh0LmJydXNoV2l0aENv
bG9yKGNvbG9yKS5nZXQoKSk7CisgICAgICAgIH07CisKKyAgICAgICAgaWYgKHNoYWRvd1N0YXRl
LmlzVmlzaWJsZSgpKQorICAgICAgICAgICAgZHJhd1dpdGhTaGFkb3cocGxhdGZvcm1Db250ZXh0
LCByLCBzaGFkb3dTdGF0ZSwgZHJhd0Z1bmN0aW9uKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCByLCBkcmF3RnVuY3Rpb24pOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIFBsYXRmb3JtQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZl
cihwbGF0Zm9ybUNvbnRleHQpOworICAgICAgICBQYXRoIHBhdGg7CisgICAgICAgIHBhdGguYWRk
Um91bmRlZFJlY3QocmVjdCk7CisgICAgICAgIGZpbGxQYXRoKHBsYXRmb3JtQ29udGV4dCwgcGF0
aCwgY29sb3IsIHNoYWRvd1N0YXRlKTsKKyAgICB9Cit9CisKK3ZvaWQgZmlsbFJlY3RXaXRoUm91
bmRlZEhvbGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3Qg
RmxvYXRSZWN0JiByZWN0LCBjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiByb3VuZGVkSG9sZVJlY3Qs
IGNvbnN0IEZpbGxTb3VyY2UmIGZpbGxTb3VyY2UsIGNvbnN0IFNoYWRvd1N0YXRlJiBzaGFkb3dT
dGF0ZSkKK3sKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0
KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIFBhdGggcGF0
aDsKKyAgICBwYXRoLmFkZFJlY3QocmVjdCk7CisKKyAgICBpZiAoIXJvdW5kZWRIb2xlUmVjdC5y
YWRpaSgpLmlzWmVybygpKQorICAgICAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJvdW5kZWRIb2xl
UmVjdCk7CisgICAgZWxzZQorICAgICAgICBwYXRoLmFkZFJlY3Qocm91bmRlZEhvbGVSZWN0LnJl
Y3QoKSk7CisKKyAgICBGaWxsU291cmNlIGZpbGxXaXRoSG9sZVNvdXJjZSA9IGZpbGxTb3VyY2U7
CisgICAgZmlsbFdpdGhIb2xlU291cmNlLmZpbGxSdWxlID0gV2luZFJ1bGU6OkV2ZW5PZGQ7CisK
KyAgICBmaWxsUGF0aChwbGF0Zm9ybUNvbnRleHQsIHBhdGgsIGZpbGxTb3VyY2UsIHNoYWRvd1N0
YXRlKTsKK30KKwordm9pZCBmaWxsUmVjdFdpdGhHcmFkaWVudChQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHJlY3QsIElEMkQxQnJ1c2gq
IGdyYWRpZW50KQoreworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJU
YXJnZXQoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworICAgIFBsYXRm
b3JtQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihwbGF0Zm9ybUNvbnRleHQpOworICAgIEZ1
bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1bmN0aW9uID0gWyZwbGF0Zm9y
bUNvbnRleHQsIHJlY3QsICZncmFkaWVudF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdl
dCkgeworICAgICAgICBjb25zdCBEMkQxX1JFQ1RfRiBkMmRSZWN0ID0gcmVjdDsKKyAgICAgICAg
cmVuZGVyVGFyZ2V0LT5GaWxsUmVjdGFuZ2xlKCZkMmRSZWN0LCBncmFkaWVudCk7CisgICAgfTsK
K30KKwordm9pZCBmaWxsUGF0aChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250
ZXh0LCBjb25zdCBQYXRoJiBwYXRoLCBjb25zdCBGaWxsU291cmNlJiBmaWxsU291cmNlLCBjb25z
dCBTaGFkb3dTdGF0ZSYgc2hhZG93U3RhdGUpCit7CisgICAgaWYgKHBhdGguYWN0aXZlUGF0aCgp
KSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIGNsb3NlZC4gVGhpcyBtaWdodCBmYWlsIGlm
IHRoZSBwYXRoIHdhcyBhbHJlYWR5IGNsb3NlZCwgc28KKyAgICAgICAgLy8gaWdub3JlIHRoZSBy
ZXR1cm4gdmFsdWUuCisgICAgICAgIHBhdGguYWN0aXZlUGF0aCgpLT5DbG9zZSgpOworICAgIH0K
KworICAgIFBsYXRmb3JtQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihwbGF0Zm9ybUNvbnRl
eHQpOworCisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgp
OworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAgICBDT01QdHI8SUQy
RDFHZW9tZXRyeUdyb3VwPiBwYXRoVG9GaWxsOworICAgIHBhdGguY3JlYXRlR2VvbWV0cnlXaXRo
RmlsbE1vZGUoZmlsbFNvdXJjZS5maWxsUnVsZSwgcGF0aFRvRmlsbCk7CisKKyAgICBjb250ZXh0
LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIEZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJU
YXJnZXQqKT4gZHJhd0Z1bmN0aW9uID0gWyZwbGF0Zm9ybUNvbnRleHQsICZwYXRoVG9GaWxsLCAm
ZmlsbFNvdXJjZV0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICBy
ZW5kZXJUYXJnZXQtPkZpbGxHZW9tZXRyeShwYXRoVG9GaWxsLmdldCgpLCBmaWxsU291cmNlLmJy
dXNoLmdldCgpKTsKKyAgICB9OworCisgICAgaWYgKHNoYWRvd1N0YXRlLmlzVmlzaWJsZSgpKSB7
CisgICAgICAgIEZsb2F0UmVjdCBib3VuZGluZ1JlY3QgPSBwYXRoLmZhc3RCb3VuZGluZ1JlY3Qo
KTsKKyAgICAgICAgZHJhd1dpdGhTaGFkb3cocGxhdGZvcm1Db250ZXh0LCBib3VuZGluZ1JlY3Qs
IHNoYWRvd1N0YXRlLCBkcmF3RnVuY3Rpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIEZsb2F0
UmVjdCBjb250ZXh0UmVjdChGbG9hdFBvaW50KCksIGNvbnRleHQtPkdldFNpemUoKSk7CisgICAg
ICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgY29udGV4dFJlY3QsIGRyYXdG
dW5jdGlvbik7CisgICAgfQorCisgICAgZmx1c2gocGxhdGZvcm1Db250ZXh0KTsKK30KKwordm9p
ZCBmaWxsUGF0aChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25z
dCBQYXRoJiBwYXRoLCBjb25zdCBDb2xvciYgY29sb3IsIGNvbnN0IFNoYWRvd1N0YXRlJiBzaGFk
b3dTdGF0ZSkKK3sKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFy
Z2V0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIENPTVB0
cjxJRDJEMUdlb21ldHJ5R3JvdXA+IHBhdGhUb0ZpbGw7CisgICAgcGF0aC5jcmVhdGVHZW9tZXRy
eVdpdGhGaWxsTW9kZShXaW5kUnVsZTo6RXZlbk9kZCwgcGF0aFRvRmlsbCk7CisKKyAgICBjb250
ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIEZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5k
ZXJUYXJnZXQqKT4gZHJhd0Z1bmN0aW9uID0gWyZwbGF0Zm9ybUNvbnRleHQsICZwYXRoVG9GaWxs
LCBjb2xvcl0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICByZW5k
ZXJUYXJnZXQtPkZpbGxHZW9tZXRyeShwYXRoVG9GaWxsLmdldCgpLCBwbGF0Zm9ybUNvbnRleHQu
YnJ1c2hXaXRoQ29sb3IoY29sb3IpLmdldCgpKTsKKyAgICB9OworCisgICAgaWYgKHNoYWRvd1N0
YXRlLmlzVmlzaWJsZSgpKSB7CisgICAgICAgIEZsb2F0UmVjdCBib3VuZGluZ1JlY3QgPSBwYXRo
LmZhc3RCb3VuZGluZ1JlY3QoKTsKKyAgICAgICAgZHJhd1dpdGhTaGFkb3cocGxhdGZvcm1Db250
ZXh0LCBib3VuZGluZ1JlY3QsIHNoYWRvd1N0YXRlLCBkcmF3RnVuY3Rpb24pOworICAgIH0gZWxz
ZSB7CisgICAgICAgIEZsb2F0UmVjdCBjb250ZXh0UmVjdChGbG9hdFBvaW50KCksIGNvbnRleHQt
PkdldFNpemUoKSk7CisgICAgICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwg
Y29udGV4dFJlY3QsIGRyYXdGdW5jdGlvbik7CisgICAgfQorCisgICAgZmx1c2gocGxhdGZvcm1D
b250ZXh0KTsKK30KKwordm9pZCBzdHJva2VSZWN0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBw
bGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgZmxvYXQgbGluZVdpZHRoLCBj
b25zdCBTdHJva2VTb3VyY2UmIHN0cm9rZVNvdXJjZSwgY29uc3QgU2hhZG93U3RhdGUmIHNoYWRv
d1N0YXRlKQoreworICAgIEZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1
bmN0aW9uID0gWyZwbGF0Zm9ybUNvbnRleHQsICZzdHJva2VTb3VyY2UsIHJlY3QsIGxpbmVXaWR0
aF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICByZW5kZXJUYXJn
ZXQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworICAgICAgICBjb25zdCBEMkQxX1JFQ1RfRiBkMmRS
ZWN0ID0gcmVjdDsKKyAgICAgICAgcmVuZGVyVGFyZ2V0LT5EcmF3UmVjdGFuZ2xlKCZkMmRSZWN0
LCBzdHJva2VTb3VyY2UuYnJ1c2guZ2V0KCksIGxpbmVXaWR0aCwgcGxhdGZvcm1Db250ZXh0LnN0
cm9rZVN0eWxlKCkpOworICAgIH07CisKKyAgICBpZiAoc2hhZG93U3RhdGUuaXNWaXNpYmxlKCkp
CisgICAgICAgIGRyYXdXaXRoU2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwgc2hhZG93U3Rh
dGUsIGRyYXdGdW5jdGlvbik7CisgICAgZWxzZQorICAgICAgICBkcmF3V2l0aG91dFNoYWRvdyhw
bGF0Zm9ybUNvbnRleHQsIHJlY3QsIGRyYXdGdW5jdGlvbik7Cit9CisKK3ZvaWQgc3Ryb2tlUGF0
aChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBQYXRoJiBw
YXRoLCBjb25zdCBTdHJva2VTb3VyY2UmIHN0cm9rZVNvdXJjZSwgY29uc3QgU2hhZG93U3RhdGUm
IHNoYWRvd1N0YXRlKQoreworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5yZW5k
ZXJUYXJnZXQoKTsKKyAgICAKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKwor
ICAgIFBsYXRmb3JtQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihwbGF0Zm9ybUNvbnRleHQp
OworICAgIGF1dG8gYm91bmRpbmdSZWN0ID0gcGF0aC5mYXN0Qm91bmRpbmdSZWN0KCk7CisgICAg
RnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiBkcmF3RnVuY3Rpb24gPSBbJnBsYXRm
b3JtQ29udGV4dCwgJnBhdGgsICZzdHJva2VTb3VyY2VdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5k
ZXJUYXJnZXQpIHsKKyAgICAgICAgcmVuZGVyVGFyZ2V0LT5EcmF3R2VvbWV0cnkocGF0aC5wbGF0
Zm9ybVBhdGgoKSwgc3Ryb2tlU291cmNlLmJydXNoLmdldCgpLCBzdHJva2VTb3VyY2UudGhpY2tu
ZXNzLCBwbGF0Zm9ybUNvbnRleHQuc3Ryb2tlU3R5bGUoKSk7CisgICAgfTsKKworICAgIGlmIChz
aGFkb3dTdGF0ZS5pc1Zpc2libGUoKSkKKyAgICAgICAgZHJhd1dpdGhTaGFkb3cocGxhdGZvcm1D
b250ZXh0LCBib3VuZGluZ1JlY3QsIHNoYWRvd1N0YXRlLCBkcmF3RnVuY3Rpb24pOworICAgIGVs
c2UKKyAgICAgICAgZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCBib3VuZGluZ1Jl
Y3QsIGRyYXdGdW5jdGlvbik7CisKKyAgICBmbHVzaChwbGF0Zm9ybUNvbnRleHQpOworfQorCit2
b2lkIGRyYXdQYXRoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNv
bnN0IFBhdGgmIHBhdGgsIGNvbnN0IFN0cm9rZVNvdXJjZSYgc3Ryb2tlU291cmNlLCBjb25zdCBT
aGFkb3dTdGF0ZSYpCit7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0LnJlbmRl
clRhcmdldCgpOworCisgICAgaWYgKHBhdGguYWN0aXZlUGF0aCgpKQorICAgICAgICBwYXRoLmFj
dGl2ZVBhdGgoKS0+Q2xvc2UoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18p
OworCisgICAgYXV0byByZWN0ID0gcGF0aC5mYXN0Qm91bmRpbmdSZWN0KCk7CisgICAgZHJhd1dp
dGhvdXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCByZWN0LCBbJnBsYXRmb3JtQ29udGV4dCwgJnN0
cm9rZVNvdXJjZSwgJnBhdGhdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAg
ICAgICAgcmVuZGVyVGFyZ2V0LT5EcmF3R2VvbWV0cnkocGF0aC5wbGF0Zm9ybVBhdGgoKSwgc3Ry
b2tlU291cmNlLmJydXNoLmdldCgpLCBzdHJva2VTb3VyY2UudGhpY2tuZXNzLCBwbGF0Zm9ybUNv
bnRleHQuc3Ryb2tlU3R5bGUoKSk7CisgICAgfSk7CisKKyAgICBmbHVzaChwbGF0Zm9ybUNvbnRl
eHQpOworfQorCit2b2lkIGRyYXdXaXRoU2hhZG93SGVscGVyKElEMkQxUmVuZGVyVGFyZ2V0KiBj
b250ZXh0LCBJRDJEMUJpdG1hcCogYml0bWFwLCBjb25zdCBDb2xvciYgc2hhZG93Q29sb3IsIGNv
bnN0IEZsb2F0U2l6ZSYgc2hhZG93T2Zmc2V0LCBmbG9hdCBzaGFkb3dCbHVyKQoreworICAgIENP
TVB0cjxJRDJEMURldmljZUNvbnRleHQ+IGRldmljZUNvbnRleHQ7CisgICAgSFJFU1VMVCBociA9
IGNvbnRleHQtPlF1ZXJ5SW50ZXJmYWNlKCZkZXZpY2VDb250ZXh0KTsKKyAgICBSRUxFQVNFX0FT
U0VSVChTVUNDRUVERUQoaHIpKTsKKworICAgIC8vIENyZWF0ZSB0aGUgc2hhZG93IGVmZmVjdAor
ICAgIENPTVB0cjxJRDJEMUVmZmVjdD4gc2hhZG93RWZmZWN0OworICAgIGhyID0gZGV2aWNlQ29u
dGV4dC0+Q3JlYXRlRWZmZWN0KENMU0lEX0QyRDFTaGFkb3csICZzaGFkb3dFZmZlY3QpOworICAg
IFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOworCisgICAgc2hhZG93RWZmZWN0LT5TZXRJ
bnB1dCgwLCBiaXRtYXApOworICAgIHNoYWRvd0VmZmVjdC0+U2V0VmFsdWUoRDJEMV9TSEFET1df
UFJPUF9DT0xPUiwgc3RhdGljX2Nhc3Q8RDJEMV9WRUNUT1JfNEY+KHNoYWRvd0NvbG9yKSk7Cisg
ICAgc2hhZG93RWZmZWN0LT5TZXRWYWx1ZShEMkQxX1NIQURPV19QUk9QX0JMVVJfU1RBTkRBUkRf
REVWSUFUSU9OLCBzaGFkb3dCbHVyKTsKKworICAgIENPTVB0cjxJRDJEMUVmZmVjdD4gdHJhbnNm
b3JtRWZmZWN0OworICAgIGhyID0gZGV2aWNlQ29udGV4dC0+Q3JlYXRlRWZmZWN0KENMU0lEX0Qy
RDEyREFmZmluZVRyYW5zZm9ybSwgJnRyYW5zZm9ybUVmZmVjdCk7CisgICAgUkVMRUFTRV9BU1NF
UlQoU1VDQ0VFREVEKGhyKSk7CisKKyAgICB0cmFuc2Zvcm1FZmZlY3QtPlNldElucHV0RWZmZWN0
KDAsIHNoYWRvd0VmZmVjdC5nZXQoKSk7CisKKyAgICBhdXRvIHRyYW5zbGF0aW9uID0gRDJEMTo6
TWF0cml4M3gyRjo6VHJhbnNsYXRpb24oc2hhZG93T2Zmc2V0LndpZHRoKCksIHNoYWRvd09mZnNl
dC5oZWlnaHQoKSk7CisgICAgdHJhbnNmb3JtRWZmZWN0LT5TZXRWYWx1ZShEMkQxXzJEQUZGSU5F
VFJBTlNGT1JNX1BST1BfVFJBTlNGT1JNX01BVFJJWCwgdHJhbnNsYXRpb24pOworCisgICAgQ09N
UHRyPElEMkQxRWZmZWN0PiBjb21wb3NpdG9yOworICAgIGhyID0gZGV2aWNlQ29udGV4dC0+Q3Jl
YXRlRWZmZWN0KENMU0lEX0QyRDFDb21wb3NpdGUsICZjb21wb3NpdG9yKTsKKyAgICBSRUxFQVNF
X0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKworICAgIGNvbXBvc2l0b3ItPlNldElucHV0RWZmZWN0
KDAsIHRyYW5zZm9ybUVmZmVjdC5nZXQoKSk7CisgICAgY29tcG9zaXRvci0+U2V0SW5wdXQoMSwg
Yml0bWFwKTsKKworICAgIC8vIEZsaXAgdGhlIGNvbnRleHQKKyAgICBEMkQxX01BVFJJWF8zWDJf
RiBjdG07CisgICAgZGV2aWNlQ29udGV4dC0+R2V0VHJhbnNmb3JtKCZjdG0pOworICAgIGF1dG8g
dHJhbnNsYXRlID0gRDJEMTo6TWF0cml4M3gyRjo6VHJhbnNsYXRpb24oMC4wZiwgZGV2aWNlQ29u
dGV4dC0+R2V0U2l6ZSgpLmhlaWdodCk7CisgICAgYXV0byBmbGlwID0gRDJEMTo6TWF0cml4M3gy
Rjo6U2NhbGUoRDJEMTo6U2l6ZUYoMS4wZiwgLTEuMGYpKTsKKyAgICBkZXZpY2VDb250ZXh0LT5T
ZXRUcmFuc2Zvcm0oY3RtICogZmxpcCAqIHRyYW5zbGF0ZSk7CisKKyAgICBkZXZpY2VDb250ZXh0
LT5EcmF3SW1hZ2UoY29tcG9zaXRvci5nZXQoKSwgRDJEMV9JTlRFUlBPTEFUSU9OX01PREVfTElO
RUFSKTsKK30KKwordm9pZCBkcmF3V2l0aFNoYWRvdyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYg
cGxhdGZvcm1Db250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIGJvdW5kaW5nUmVjdCwgY29uc3QgU2hh
ZG93U3RhdGUmIHNoYWRvd1N0YXRlLCBjb25zdCBXVEY6OkZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5k
ZXJUYXJnZXQqKT4mIGRyYXdDb21tYW5kcykKK3sKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9y
bUNvbnRleHQucmVuZGVyVGFyZ2V0KCk7CisKKyAgICAvLyBSZW5kZXIgdGhlIGN1cnJlbnQgZ2Vv
bWV0cnkgdG8gYSBiaXRtYXAgY29udGV4dAorICAgIENPTVB0cjxJRDJEMUJpdG1hcFJlbmRlclRh
cmdldD4gYml0bWFwVGFyZ2V0OworICAgIEhSRVNVTFQgaHIgPSBjb250ZXh0LT5DcmVhdGVDb21w
YXRpYmxlUmVuZGVyVGFyZ2V0KCZiaXRtYXBUYXJnZXQpOworICAgIFJFTEVBU0VfQVNTRVJUKFNV
Q0NFRURFRChocikpOworCisgICAgYml0bWFwVGFyZ2V0LT5CZWdpbkRyYXcoKTsKKyAgICBkcmF3
Q29tbWFuZHMoYml0bWFwVGFyZ2V0LmdldCgpKTsKKyAgICBociA9IGJpdG1hcFRhcmdldC0+RW5k
RHJhdygpOworICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOworCisgICAgQ09NUHRy
PElEMkQxQml0bWFwPiBiaXRtYXA7CisgICAgaHIgPSBiaXRtYXBUYXJnZXQtPkdldEJpdG1hcCgm
Yml0bWFwKTsKKyAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKworICAgIGRyYXdX
aXRoU2hhZG93SGVscGVyKGNvbnRleHQsIGJpdG1hcC5nZXQoKSwgc2hhZG93U3RhdGUuY29sb3Is
IHNoYWRvd1N0YXRlLm9mZnNldCwgc2hhZG93U3RhdGUuYmx1cik7Cit9CisKK3ZvaWQgZHJhd1dp
dGhvdXRTaGFkb3coUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29u
c3QgRmxvYXRSZWN0JiAvKmJvdW5kaW5nUmVjdCovLCBjb25zdCBXVEY6OkZ1bmN0aW9uPHZvaWQo
SUQyRDFSZW5kZXJUYXJnZXQqKT4mIGRyYXdDb21tYW5kcykKK3sKKyAgICBkcmF3Q29tbWFuZHMo
cGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpKTsKK30KKwordm9pZCBjbGVhclJlY3QoUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiBy
ZWN0KQoreworICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwgWyZw
bGF0Zm9ybUNvbnRleHQsIHJlY3RdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsK
KyAgICAgICAgRmxvYXRSZWN0IHJlbmRlclRhcmdldFJlY3QoRmxvYXRQb2ludCgpLCByZW5kZXJU
YXJnZXQtPkdldFNpemUoKSk7CisgICAgICAgIEZsb2F0UmVjdCByZWN0VG9DbGVhcihyZWN0KTsK
KworICAgICAgICBpZiAocmVjdFRvQ2xlYXIuY29udGFpbnMocmVuZGVyVGFyZ2V0UmVjdCkpIHsK
KyAgICAgICAgICAgIHJlbmRlclRhcmdldC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisgICAgICAg
ICAgICByZW5kZXJUYXJnZXQtPkNsZWFyKEQyRDE6OkNvbG9yRigwLCAwLCAwLCAwKSk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJlY3RUb0NsZWFyLmlu
dGVyc2VjdHMocmVuZGVyVGFyZ2V0UmVjdCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAg
ICAgcmVuZGVyVGFyZ2V0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKyAgICAgICAgcmVjdFRvQ2xl
YXIuaW50ZXJzZWN0KHJlbmRlclRhcmdldFJlY3QpOworICAgICAgICByZW5kZXJUYXJnZXQtPkZp
bGxSZWN0YW5nbGUocmVjdFRvQ2xlYXIsIHBsYXRmb3JtQ29udGV4dC5icnVzaFdpdGhDb2xvcihD
b2xvcihEMkQxOjpDb2xvckYoMCwgMCwgMCwgMCkpKS5nZXQoKSk7CisgICAgfSk7Cit9CisKKy8q
Cit2b2lkIGRyYXdHbHlwaHMoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4
dCwgY29uc3QgRmlsbFNvdXJjZSYgZmlsbFNvdXJjZSwgY29uc3QgU3Ryb2tlU291cmNlJiBzdHJv
a2VTb3VyY2UsIGNvbnN0IFNoYWRvd1N0YXRlJiBzaGFkb3dTdGF0ZSwgY29uc3QgRmxvYXRQb2lu
dCYgcG9pbnQsIERpcmVjdFdyaXRlU2NhbGVkRm9udCogc2NhbGVkRm9udCwgZG91YmxlIHN5bnRo
ZXRpY0JvbGRPZmZzZXQsIGNvbnN0IFZlY3RvcjxEaXJlY3RXcml0ZUdseXBoVHlwZT4mIGdseXBo
cywgZmxvYXQgeE9mZnNldCwgVGV4dERyYXdpbmdNb2RlRmxhZ3MgdGV4dERyYXdpbmdNb2RlLCBm
bG9hdCBzdHJva2VUaGlja25lc3MsIGNvbnN0IEZsb2F0U2l6ZSYgc2hhZG93T2Zmc2V0LCBjb25z
dCBDb2xvciYgc2hhZG93Q29sb3IpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKyovCisK
K3ZvaWQgZHJhd05hdGl2ZUltYWdlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNv
bnRleHQsIElXSUNCaXRtYXAqIGltYWdlLCBjb25zdCBGbG9hdFNpemUmIGltYWdlU2l6ZSwgY29u
c3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3Np
dGVPcGVyYXRvciBjb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlIGJsZW5kTW9kZSwgSW1hZ2VP
cmllbnRhdGlvbiBvcmllbnRhdGlvbiwgSW50ZXJwb2xhdGlvblF1YWxpdHkgaW1hZ2VJbnRlcnBv
bGF0aW9uUXVhbGl0eSwgZmxvYXQgZ2xvYmFsQWxwaGEsIGNvbnN0IFNoYWRvd1N0YXRlJiBzaGFk
b3dTdGF0ZSkKK3sKKyAgICBDT01QdHI8SUQyRDFCaXRtYXA+IGRldmljZUJpdG1hcDsKKyAgICBI
UkVTVUxUIGhyID0gcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5DcmVhdGVCaXRtYXBG
cm9tV2ljQml0bWFwKGltYWdlLCAmZGV2aWNlQml0bWFwKTsKKyAgICBpZiAoIVNVQ0NFRURFRCho
cikpCisgICAgICAgIHJldHVybjsKKworICAgIGRyYXdOYXRpdmVJbWFnZShwbGF0Zm9ybUNvbnRl
eHQsIGRldmljZUJpdG1hcC5nZXQoKSwgaW1hZ2VTaXplLCBkZXN0UmVjdCwgc3JjUmVjdCwgY29t
cG9zaXRlT3BlcmF0b3IsIGJsZW5kTW9kZSwgb3JpZW50YXRpb24sIGltYWdlSW50ZXJwb2xhdGlv
blF1YWxpdHksIGdsb2JhbEFscGhhLCBzaGFkb3dTdGF0ZSk7Cit9CisKK3ZvaWQgZHJhd05hdGl2
ZUltYWdlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIElEMkQxQml0
bWFwKiBpbWFnZSwgY29uc3QgRmxvYXRTaXplJiBpbWFnZVNpemUsIGNvbnN0IEZsb2F0UmVjdCYg
ZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgY29t
cG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSBibGVuZE1vZGUsIEltYWdlT3JpZW50YXRpb24gb3Jp
ZW50YXRpb24sIEludGVycG9sYXRpb25RdWFsaXR5IGltYWdlSW50ZXJwb2xhdGlvblF1YWxpdHks
IGZsb2F0IGdsb2JhbEFscGhhLCBjb25zdCBTaGFkb3dTdGF0ZSYgc2hhZG93U3RhdGUpCit7Cisg
ICAgYXV0byBiaXRtYXBTaXplID0gaW1hZ2UtPkdldFNpemUoKTsKKworICAgIGZsb2F0IGN1cnJI
ZWlnaHQgPSBvcmllbnRhdGlvbi51c2VzV2lkdGhBc0hlaWdodCgpID8gYml0bWFwU2l6ZS53aWR0
aCA6IGJpdG1hcFNpemUuaGVpZ2h0OworICAgIGlmIChjdXJySGVpZ2h0IDw9IHNyY1JlY3QueSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQu
cmVuZGVyVGFyZ2V0KCk7CisKKyAgICBEMkQxX01BVFJJWF8zWDJfRiBjdG07CisgICAgY29udGV4
dC0+R2V0VHJhbnNmb3JtKCZjdG0pOworCisgICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybShj
dG0pOworCisgICAgUGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKHBsYXRmb3Jt
Q29udGV4dCk7CisKKyAgICBib29sIHNob3VsZFVzZVN1YmltYWdlID0gZmFsc2U7CisKKyAgICAv
LyBJZiB0aGUgc291cmNlIHJlY3QgaXMgYSBzdWJwb3J0aW9uIG9mIHRoZSBpbWFnZSwgdGhlbiB3
ZSBjb21wdXRlIGFuIGluZmxhdGVkIGRlc3RpbmF0aW9uIHJlY3QgdGhhdCB3aWxsIGhvbGQgdGhl
IGVudGlyZSBpbWFnZQorICAgIC8vIGFuZCB0aGVuIHNldCBhIGNsaXAgdG8gdGhlIHBvcnRpb24g
dGhhdCB3ZSB3YW50IHRvIGRpc3BsYXkuCisgICAgRmxvYXRSZWN0IGFkanVzdGVkRGVzdFJlY3Qg
PSBkZXN0UmVjdDsKKworICAgIGlmIChzcmNSZWN0LnNpemUoKSAhPSBpbWFnZVNpemUpIHsKKyAg
ICAgICAgLy8gRklYTUU6IEltcGxlbWVudCBpbWFnZSBzY2FsaW5nCisgICAgICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIGltYWdlIGlzIG9ubHkgcGFydGlhbGx5
IGxvYWRlZCwgdGhlbiBzaHJpbmsgdGhlIGRlc3RpbmF0aW9uIHJlY3QgdGhhdCB3ZSdyZSBkcmF3
aW5nIGludG8gYWNjb3JkaW5nbHkuCisgICAgaWYgKCFzaG91bGRVc2VTdWJpbWFnZSAmJiBjdXJy
SGVpZ2h0IDwgaW1hZ2VTaXplLmhlaWdodCgpKQorICAgICAgICBhZGp1c3RlZERlc3RSZWN0LnNl
dEhlaWdodChhZGp1c3RlZERlc3RSZWN0LmhlaWdodCgpICogY3VyckhlaWdodCAvIGltYWdlU2l6
ZS5oZWlnaHQoKSk7CisKKyAgICBTdGF0ZTo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKHBsYXRmb3Jt
Q29udGV4dCwgY29tcG9zaXRlT3BlcmF0b3IsIGJsZW5kTW9kZSk7CisKKyAgICAvLyBJbWFnZU9y
aWVudGF0aW9uIGV4cGVjdHMgdGhlIG9yaWdpbiB0byBiZSBhdCAoMCwgMCkuCisgICAgdHJhbnNm
b3JtLnRyYW5zbGF0ZShhZGp1c3RlZERlc3RSZWN0LngoKSwgYWRqdXN0ZWREZXN0UmVjdC55KCkp
OworICAgIGNvbnRleHQtPlNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAgIGFkanVzdGVkRGVz
dFJlY3Quc2V0TG9jYXRpb24oRmxvYXRQb2ludCgpKTsKKworICAgIGlmIChvcmllbnRhdGlvbiAh
PSBEZWZhdWx0SW1hZ2VPcmllbnRhdGlvbikgeworICAgICAgICBjb25jYXRDVE0ocGxhdGZvcm1D
b250ZXh0LCBvcmllbnRhdGlvbi50cmFuc2Zvcm1Gcm9tRGVmYXVsdChhZGp1c3RlZERlc3RSZWN0
LnNpemUoKSkpOworICAgICAgICBpZiAob3JpZW50YXRpb24udXNlc1dpZHRoQXNIZWlnaHQoKSkg
eworICAgICAgICAgICAgLy8gVGhlIGRlc3RpbmF0aW9uIHJlY3Qgd2lsbCBoYXZlIGl0J3Mgd2lk
dGggYW5kIGhlaWdodCBhbHJlYWR5IHJldmVyc2VkIGZvciB0aGUgb3JpZW50YXRpb24gb2YKKyAg
ICAgICAgICAgIC8vIHRoZSBpbWFnZSwgYXMgaXQgd2FzIG5lZWRlZCBmb3IgcGFnZSBsYXlvdXQs
IHNvIHdlIG5lZWQgdG8gcmV2ZXJzZSBpdCBiYWNrIGhlcmUuCisgICAgICAgICAgICBhZGp1c3Rl
ZERlc3RSZWN0ID0gRmxvYXRSZWN0KGFkanVzdGVkRGVzdFJlY3QueCgpLCBhZGp1c3RlZERlc3RS
ZWN0LnkoKSwgYWRqdXN0ZWREZXN0UmVjdC5oZWlnaHQoKSwgYWRqdXN0ZWREZXN0UmVjdC53aWR0
aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5F
X18pOworCisgICAgRnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiBkcmF3RnVuY3Rp
b24gPSBbaW1hZ2UsIGFkanVzdGVkRGVzdFJlY3QsIHNyY1JlY3RdKElEMkQxUmVuZGVyVGFyZ2V0
KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgcmVuZGVyVGFyZ2V0LT5EcmF3Qml0bWFwKGltYWdl
LCBhZGp1c3RlZERlc3RSZWN0LCAxLjBmLCBEMkQxX0JJVE1BUF9JTlRFUlBPTEFUSU9OX01PREVf
TElORUFSLCBzdGF0aWNfY2FzdDxEMkQxX1JFQ1RfRj4oc3JjUmVjdCkpOworICAgIH07CisKKyAg
ICBpZiAoc2hhZG93U3RhdGUuaXNWaXNpYmxlKCkpCisgICAgICAgIGRyYXdXaXRoU2hhZG93KHBs
YXRmb3JtQ29udGV4dCwgYWRqdXN0ZWREZXN0UmVjdCwgc2hhZG93U3RhdGUsIGRyYXdGdW5jdGlv
bik7CisgICAgZWxzZQorICAgICAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQs
IGFkanVzdGVkRGVzdFJlY3QsIGRyYXdGdW5jdGlvbik7CisKKyAgICBmbHVzaChwbGF0Zm9ybUNv
bnRleHQpOworCisgICAgaWYgKCFzdGF0ZVNhdmVyLmRpZFNhdmUoKSkKKyAgICAgICAgY29udGV4
dC0+U2V0VHJhbnNmb3JtKGN0bSk7Cit9CisKK3ZvaWQgZHJhd1BhdHRlcm4oUGxhdGZvcm1Db250
ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgSVdJQ0JpdG1hcCogdGlsZUltYWdlLCBjb25z
dCBJbnRTaXplJiBzaXplLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJl
Y3QmIHRpbGVSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zvcm0sIGNv
bnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcGVyYXRv
ciwgQmxlbmRNb2RlIGJsZW5kTW9kZSkKK3sKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNv
bnRleHQucmVuZGVyVGFyZ2V0KCk7CisgICAgUGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlciBzdGF0
ZVNhdmVyKHBsYXRmb3JtQ29udGV4dCk7CisKKyAgICBjbGlwKHBsYXRmb3JtQ29udGV4dCwgZGVz
dFJlY3QpOworCisgICAgU3RhdGU6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihwbGF0Zm9ybUNvbnRl
eHQsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUpOworCisgICAgYXV0byBiaXRtYXBCcnVz
aFByb3BlcnRpZXMgPSBEMkQxOjpCaXRtYXBCcnVzaFByb3BlcnRpZXMoKTsKKyAgICBiaXRtYXBC
cnVzaFByb3BlcnRpZXMuZXh0ZW5kTW9kZVggPSBEMkQxX0VYVEVORF9NT0RFX1dSQVA7CisgICAg
Yml0bWFwQnJ1c2hQcm9wZXJ0aWVzLmV4dGVuZE1vZGVZID0gRDJEMV9FWFRFTkRfTU9ERV9XUkFQ
OworCisgICAgLy8gQ3JlYXRlIGEgYnJ1c2ggdHJhbnNmb3JtYXRpb24gc28gd2UgcGFpbnQgdXNp
bmcgdGhlIHNlY3Rpb24gb2YgdGhlIGltYWdlIHdlIGNhcmUgYWJvdXQuCisgICAgQWZmaW5lVHJh
bnNmb3JtIHRyYW5zZm9ybWF0aW9uID0gcGF0dGVyblRyYW5zZm9ybTsKKyAgICB0cmFuc2Zvcm1h
dGlvbi50cmFuc2xhdGUoZGVzdFJlY3QubG9jYXRpb24oKSk7CisKKyAgICBhdXRvIGJydXNoUHJv
cGVydGllcyA9IEQyRDE6OkJydXNoUHJvcGVydGllcygpOworICAgIGJydXNoUHJvcGVydGllcy50
cmFuc2Zvcm0gPSB0cmFuc2Zvcm1hdGlvbjsKKyAgICBicnVzaFByb3BlcnRpZXMub3BhY2l0eSA9
IDEuMGY7CisKKyAgICAvLyBJZiB3ZSBvbmx5IHdhbnQgYSBzdWJzZXQgb2YgdGhlIGJpdG1hcCwg
d2UgbmVlZCB0byBjcmVhdGUgYSBjcm9wcGVkIGJpdG1hcCBpbWFnZS4gQWNjb3JkaW5nIHRvIHRo
ZSBkb2N1bWVudGF0aW9uLAorICAgIC8vIHRoaXMgZG9lcyBub3QgYWxsb2NhdGUgbmV3IGJpdG1h
cCBtZW1vcnkuCisgICAgaWYgKHNpemUud2lkdGgoKSA+IGRlc3RSZWN0LndpZHRoKCkgfHwgc2l6
ZS5oZWlnaHQoKSA+IGRlc3RSZWN0LmhlaWdodCgpKSB7CisgICAgICAgIEFTU0VSVCgwKTsKKyAg
ICAgICAgLyoKKyAgICAgICAgZmxvYXQgZHBpWCA9IDA7CisgICAgICAgIGZsb2F0IGRwaVkgPSAw
OworICAgICAgICB0aWxlSW1hZ2UtPkdldERwaSgmZHBpWCwgJmRwaVkpOworICAgICAgICBhdXRv
IGJpdG1hcFByb3BlcnRpZXMgPSBEMkQxOjpCaXRtYXBQcm9wZXJ0aWVzKHRpbGVJbWFnZS0+R2V0
UGl4ZWxGb3JtYXQoKSwgZHBpWCwgZHBpWSk7CisgICAgICAgIENPTVB0cjxJRDJEMUJpdG1hcD4g
c3ViSW1hZ2U7CisgICAgICAgIEhSRVNVTFQgaHIgPSBjb250ZXh0LT5DcmVhdGVCaXRtYXAoSW50
U2l6ZSh0aWxlUmVjdC5zaXplKCkpLCBiaXRtYXBQcm9wZXJ0aWVzLCAmc3ViSW1hZ2UpOworICAg
ICAgICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgICAgICAgICAgRDJEMV9SRUNUX1UgZmluaXNo
UmVjdCA9IEludFJlY3QodGlsZVJlY3QpOworICAgICAgICAgICAgaHIgPSBzdWJJbWFnZS0+Q29w
eUZyb21CaXRtYXAobnVsbHB0ciwgdGlsZUltYWdlLmdldCgpLCAmZmluaXNoUmVjdCk7CisgICAg
ICAgICAgICBpZiAoU1VDQ0VFREVEKGhyKSkKKyAgICAgICAgICAgICAgICB0aWxlSW1hZ2UgPSBz
dWJJbWFnZTsKKyAgICAgICAgfQorICAgICAgICAqLworICAgIH0KKworICAgIENPTVB0cjxJRDJE
MUJpdG1hcD4gYml0bWFwOworICAgIEhSRVNVTFQgaHIgPSBjb250ZXh0LT5DcmVhdGVCaXRtYXBG
cm9tV2ljQml0bWFwKHRpbGVJbWFnZSwgbnVsbHB0ciwgJmJpdG1hcCk7CisgICAgaWYgKCFTVUND
RUVERUQoaHIpKQorICAgICAgICByZXR1cm47CisKKyAgICBDT01QdHI8SUQyRDFCaXRtYXBCcnVz
aD4gcGF0dGVybkJydXNoOworICAgIGhyID0gY29udGV4dC0+Q3JlYXRlQml0bWFwQnJ1c2goYml0
bWFwLmdldCgpLCAmYml0bWFwQnJ1c2hQcm9wZXJ0aWVzLCAmYnJ1c2hQcm9wZXJ0aWVzLCAmcGF0
dGVybkJydXNoKTsKKyAgICBBU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisgICAgaWYgKCFTVUNDRUVE
RUQoaHIpKQorICAgICAgICByZXR1cm47CisKKyAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9y
bUNvbnRleHQsIGRlc3RSZWN0LCBbZGVzdFJlY3QsIHBhdHRlcm5CcnVzaF0oSUQyRDFSZW5kZXJU
YXJnZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICBjb25zdCBEMkQxX1JFQ1RfRiBkMmRSZWN0
ID0gZGVzdFJlY3Q7CisgICAgICAgIHJlbmRlclRhcmdldC0+RmlsbFJlY3RhbmdsZSgmZDJkUmVj
dCwgcGF0dGVybkJydXNoLmdldCgpKTsKKyAgICB9KTsKK30KKwordm9pZCBkcmF3UmVjdChQbGF0
Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHJl
Y3QsIGZsb2F0IGJvcmRlclRoaWNrbmVzcywgY29uc3QgQ29sb3ImIGZpbGxDb2xvciwgU3Ryb2tl
U3R5bGUgc3Ryb2tlU3R5bGUsIGNvbnN0IENvbG9yJiBzdHJva2VDb2xvcikKK3sKKyAgICAvLyBG
SVhNRTogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYW5kbGUgcGF0dGVybnMgYW5kIGdyYWRpZW50
cyBsaWtlIGRyYXdQYXRoIGRvZXMsIGl0IHByb2JhYmx5IHNob3VsZC4KKyAgICBBU1NFUlQoIXJl
Y3QuaXNFbXB0eSgpKTsKKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5yZW5k
ZXJUYXJnZXQoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworCisgICAg
ZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCByZWN0LCBbJnBsYXRmb3JtQ29udGV4
dCwgcmVjdCwgZmlsbENvbG9yLCBzdHJva2VDb2xvciwgc3Ryb2tlU3R5bGVdKElEMkQxUmVuZGVy
VGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVj
dCA9IHJlY3Q7CisgICAgICAgIGF1dG8gZmlsbEJydXNoID0gcGxhdGZvcm1Db250ZXh0LmJydXNo
V2l0aENvbG9yKGZpbGxDb2xvcik7CisgICAgICAgIHJlbmRlclRhcmdldC0+RmlsbFJlY3Rhbmds
ZSgmZDJkUmVjdCwgZmlsbEJydXNoLmdldCgpKTsKKyAgICAgICAgaWYgKHN0cm9rZVN0eWxlICE9
IE5vU3Ryb2tlKSB7CisgICAgICAgICAgICBhdXRvIHN0cm9rZUJydXNoID0gcGxhdGZvcm1Db250
ZXh0LmJydXNoV2l0aENvbG9yKHN0cm9rZUNvbG9yKTsKKyAgICAgICAgICAgIHJlbmRlclRhcmdl
dC0+RHJhd1JlY3RhbmdsZSgmZDJkUmVjdCwgc3Ryb2tlQnJ1c2guZ2V0KCksIHBsYXRmb3JtQ29u
dGV4dC5zdHJva2VUaGlja25lc3MoKSwgcGxhdGZvcm1Db250ZXh0LnN0cm9rZVN0eWxlKCkpOwor
ICAgICAgICB9CisgICAgfSk7Cit9CisKK3ZvaWQgZHJhd0xpbmUoUGxhdGZvcm1Db250ZXh0RGly
ZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQxLCBjb25zdCBG
bG9hdFBvaW50JiBwb2ludDIsIFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlLCBjb25zdCBDb2xvciYg
c3Ryb2tlQ29sb3IsIGZsb2F0IHN0cm9rZVRoaWNrbmVzcywgYm9vbCBzaG91bGRBbnRpYWxpYXMp
Cit7CisgICAgYm9vbCBpc1ZlcnRpY2FsTGluZSA9IChwb2ludDEueCgpICsgc3Ryb2tlVGhpY2tu
ZXNzID09IHBvaW50Mi54KCkpOworICAgIGZsb2F0IHN0cm9rZVdpZHRoID0gaXNWZXJ0aWNhbExp
bmUgPyBwb2ludDIueSgpIC0gcG9pbnQxLnkoKSA6IHBvaW50Mi54KCkgLSBwb2ludDEueCgpOwor
ICAgIGlmICghc3Ryb2tlVGhpY2tuZXNzIHx8ICFzdHJva2VXaWR0aCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpOwor
CisgICAgZmxvYXQgY29ybmVyV2lkdGggPSAwOworICAgIGJvb2wgZHJhd3NEYXNoZWRMaW5lID0g
c3Ryb2tlU3R5bGUgPT0gRG90dGVkU3Ryb2tlIHx8IHN0cm9rZVN0eWxlID09IERhc2hlZFN0cm9r
ZTsKKworICAgIENPTVB0cjxJRDJEMVN0cm9rZVN0eWxlPiBkMmRTdHJva2VTdHlsZTsKKyAgICBQ
bGF0Zm9ybUNvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIocGxhdGZvcm1Db250ZXh0LCBkcmF3
c0Rhc2hlZExpbmUpOworICAgIGlmIChkcmF3c0Rhc2hlZExpbmUpIHsKKyAgICAgICAgLy8gRmln
dXJlIG91dCBlbmQgcG9pbnRzIHRvIGVuc3VyZSB3ZSBhbHdheXMgcGFpbnQgY29ybmVycy4KKyAg
ICAgICAgY29ybmVyV2lkdGggPSBkYXNoZWRMaW5lQ29ybmVyV2lkdGhGb3JTdHJva2VXaWR0aChz
dHJva2VXaWR0aCwgc3Ryb2tlU3R5bGUsIHN0cm9rZVRoaWNrbmVzcyk7CisgICAgICAgIHN0cm9r
ZVdpZHRoIC09IDIgKiBjb3JuZXJXaWR0aDsKKyAgICAgICAgZmxvYXQgcGF0dGVybldpZHRoID0g
ZGFzaGVkTGluZVBhdHRlcm5XaWR0aEZvclN0cm9rZVdpZHRoKHN0cm9rZVdpZHRoLCBzdHJva2VT
dHlsZSwgc3Ryb2tlVGhpY2tuZXNzKTsKKyAgICAgICAgLy8gQ2hlY2sgaWYgY29ybmVyIGRyYXdp
bmcgc3VmZmljaWVudGx5IGNvdmVycyB0aGUgbGluZS4KKyAgICAgICAgaWYgKHN0cm9rZVdpZHRo
IDw9IHBhdHRlcm5XaWR0aCArIDEpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZmxv
YXQgcGF0dGVybk9mZnNldCA9IGRhc2hlZExpbmVQYXR0ZXJuT2Zmc2V0Rm9yUGF0dGVybkFuZFN0
cm9rZVdpZHRoKHBhdHRlcm5XaWR0aCwgc3Ryb2tlV2lkdGgpOworICAgICAgICBjb25zdCBmbG9h
dCBkYXNoZXNbMl0gPSB7IHBhdHRlcm5XaWR0aCwgcGF0dGVybldpZHRoIH07CisgICAgICAgIGF1
dG8gc3Ryb2tlU3R5bGVQcm9wZXJ0aWVzID0gcGxhdGZvcm1Db250ZXh0LnN0cm9rZVN0eWxlUHJv
cGVydGllcygpOworICAgICAgICBHcmFwaGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+Q3Jl
YXRlU3Ryb2tlU3R5bGUoJnN0cm9rZVN0eWxlUHJvcGVydGllcywgZGFzaGVzLCBBUlJBWVNJWkUo
ZGFzaGVzKSwgJmQyZFN0cm9rZVN0eWxlKTsKKworICAgICAgICBwbGF0Zm9ybUNvbnRleHQuc2V0
UGF0dGVybldpZHRoKHBhdHRlcm5XaWR0aCk7CisgICAgICAgIHBsYXRmb3JtQ29udGV4dC5zZXRQ
YXR0ZXJuT2Zmc2V0KHBhdHRlcm5PZmZzZXQpOworICAgICAgICBwbGF0Zm9ybUNvbnRleHQuc2V0
RGFzaGVzKERhc2hBcnJheSgyLCBwYXR0ZXJuV2lkdGgpKTsKKworICAgICAgICBkMmRTdHJva2VT
dHlsZSA9IHBsYXRmb3JtQ29udGV4dC5zdHJva2VTdHlsZSgpOworICAgIH0KKworICAgIGF1dG8g
Y2VudGVyZWRQb2ludHMgPSBjZW50ZXJMaW5lQW5kQ3V0T2ZmQ29ybmVycyhpc1ZlcnRpY2FsTGlu
ZSwgY29ybmVyV2lkdGgsIHBvaW50MSwgcG9pbnQyKTsKKyAgICBhdXRvIHAxID0gY2VudGVyZWRQ
b2ludHNbMF07CisgICAgYXV0byBwMiA9IGNlbnRlcmVkUG9pbnRzWzFdOworCisgICAgY29udGV4
dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAgICBGbG9hdFJlY3QgYm91bmRpbmdSZWN0KHAx
LCBwMik7CisKKyAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIGJvdW5kaW5n
UmVjdCwgWyZwbGF0Zm9ybUNvbnRleHQsIHAxLCBwMiwgZDJkU3Ryb2tlU3R5bGUsIHN0cm9rZUNv
bG9yLCBzdHJva2VUaGlja25lc3NdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsK
KyAgICAgICAgcmVuZGVyVGFyZ2V0LT5EcmF3TGluZShwMSwgcDIsIHBsYXRmb3JtQ29udGV4dC5i
cnVzaFdpdGhDb2xvcihzdHJva2VDb2xvcikuZ2V0KCksIHN0cm9rZVRoaWNrbmVzcywgZDJkU3Ry
b2tlU3R5bGUuZ2V0KCkpOworICAgIH0pOworfQorCit2b2lkIGRyYXdMaW5lc0ZvclRleHQoUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9hdFBvaW50JiwgZmxvYXQsIGNvbnN0IERh
c2hBcnJheSYsIGJvb2wsIGJvb2wsIGNvbnN0IENvbG9yJikKK3sKKyAgICBub3RJbXBsZW1lbnRl
ZCgpOworfQorCit2b2lkIGRyYXdEb3RzRm9yRG9jdW1lbnRNYXJrZXIoUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJlY3QmLCBEb2N1bWVudE1hcmtlckxpbmVTdHlsZSkKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIGZpbGxFbGxpcHNlKFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29u
c3QgQ29sb3ImIGZpbGxDb2xvciwgU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUsIGNvbnN0IENvbG9y
JiBzdHJva2VDb2xvciwgZmxvYXQgc3Ryb2tlVGhpY2tuZXNzKQoreworICAgIGF1dG8gZWxsaXBz
ZSA9IEQyRDE6OkVsbGlwc2UocmVjdC5jZW50ZXIoKSwgMC41ICogcmVjdC53aWR0aCgpLCAwLjUg
KiByZWN0LmhlaWdodCgpKTsKKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5y
ZW5kZXJUYXJnZXQoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworCisg
ICAgZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCByZWN0LCBbJnBsYXRmb3JtQ29u
dGV4dCwgZWxsaXBzZSwgZmlsbENvbG9yLCBzdHJva2VTdHlsZSwgc3Ryb2tlQ29sb3IsIHN0cm9r
ZVRoaWNrbmVzc10oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICBh
dXRvIGZpbGxCcnVzaCA9IHBsYXRmb3JtQ29udGV4dC5icnVzaFdpdGhDb2xvcihmaWxsQ29sb3Ip
OworICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxFbGxpcHNlKCZlbGxpcHNlLCBmaWxsQnJ1c2gu
Z2V0KCkpOworICAgICAgICBpZiAoc3Ryb2tlU3R5bGUgIT0gU3Ryb2tlU3R5bGU6Ok5vU3Ryb2tl
KSB7CisgICAgICAgICAgICBhdXRvIHN0cm9rZUJydXNoID0gcGxhdGZvcm1Db250ZXh0LmJydXNo
V2l0aENvbG9yKHN0cm9rZUNvbG9yKTsKKyAgICAgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0Vs
bGlwc2UoJmVsbGlwc2UsIHN0cm9rZUJydXNoLmdldCgpLCBzdHJva2VUaGlja25lc3MsIHBsYXRm
b3JtQ29udGV4dC5zdHJva2VTdHlsZSgpKTsKKyAgICAgICAgfQorICAgIH0pOworfQorCit2b2lk
IGRyYXdFbGxpcHNlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNv
bnN0IEZsb2F0UmVjdCYgcmVjdCwgU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUsIGNvbnN0IENvbG9y
JiBzdHJva2VDb2xvciwgZmxvYXQgc3Ryb2tlVGhpY2tuZXNzKQoreworICAgIGlmIChzdHJva2VT
dHlsZSA9PSBTdHJva2VTdHlsZTo6Tm9TdHJva2UpCisgICAgICAgIHJldHVybjsKKworICAgIGF1
dG8gZWxsaXBzZSA9IEQyRDE6OkVsbGlwc2UocmVjdC5jZW50ZXIoKSwgMC41ICogcmVjdC53aWR0
aCgpLCAwLjUgKiByZWN0LmhlaWdodCgpKTsKKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3Jt
Q29udGV4dC5yZW5kZXJUYXJnZXQoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5F
X18pOworCisgICAgZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCByZWN0LCBbJnBs
YXRmb3JtQ29udGV4dCwgZWxsaXBzZSwgc3Ryb2tlQ29sb3IsIHN0cm9rZVRoaWNrbmVzc10oSUQy
RDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICBhdXRvIHN0cm9rZUJydXNo
ID0gcGxhdGZvcm1Db250ZXh0LmJydXNoV2l0aENvbG9yKHN0cm9rZUNvbG9yKTsKKyAgICAgICAg
cmVuZGVyVGFyZ2V0LT5EcmF3RWxsaXBzZSgmZWxsaXBzZSwgc3Ryb2tlQnJ1c2guZ2V0KCksIHN0
cm9rZVRoaWNrbmVzcywgcGxhdGZvcm1Db250ZXh0LnN0cm9rZVN0eWxlKCkpOworICAgIH0pOwor
fQorCit2b2lkIGRyYXdGb2N1c1JpbmcoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBQ
YXRoJiwgZmxvYXQsIGNvbnN0IENvbG9yJikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQor
Cit2b2lkIGRyYXdGb2N1c1JpbmcoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBWZWN0
b3I8RmxvYXRSZWN0PiYsIGZsb2F0LCBjb25zdCBDb2xvciYpCit7CisgICAgbm90SW1wbGVtZW50
ZWQoKTsKK30KKwordm9pZCBmbHVzaChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1D
b250ZXh0KQoreworICAgIEFTU0VSVChwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpOwor
ICAgIEQyRDFfVEFHIGZpcnN0LCBzZWNvbmQ7CisgICAgSFJFU1VMVCBociA9IHBsYXRmb3JtQ29u
dGV4dC5yZW5kZXJUYXJnZXQoKS0+Rmx1c2goJmZpcnN0LCAmc2Vjb25kKTsKKworICAgIFJFTEVB
U0VfQVNTRVJUKFNVQ0NFRURFRChocikpOworfQorCit2b2lkIHNhdmUoUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCkKK3sKKyAgICBwbGF0Zm9ybUNvbnRleHQuc2F2ZSgp
OworCisgICAgaWYgKGF1dG8qIGdyYXBoaWNzQ29udGV4dFByaXZhdGUgPSBwbGF0Zm9ybUNvbnRl
eHQuZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICAgICBncmFwaGljc0NvbnRleHRQcml2
YXRlLT5zYXZlKCk7Cit9CisKK3ZvaWQgcmVzdG9yZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYg
cGxhdGZvcm1Db250ZXh0KQoreworICAgIHBsYXRmb3JtQ29udGV4dC5yZXN0b3JlKCk7CisKKyAg
ICBpZiAoYXV0byogZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSA9IHBsYXRmb3JtQ29udGV4dC5ncmFw
aGljc0NvbnRleHRQcml2YXRlKCkpCisgICAgICAgIGdyYXBoaWNzQ29udGV4dFByaXZhdGUtPnJl
c3RvcmUoKTsKK30KKwordm9pZCB0cmFuc2xhdGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBs
YXRmb3JtQ29udGV4dCwgZmxvYXQgeCwgZmxvYXQgeSkKK3sKKyAgICBBU1NFUlQocGxhdGZvcm1D
b250ZXh0LnJlbmRlclRhcmdldCgpKTsKKworICAgIEQyRDFfTUFUUklYXzNYMl9GIGN1cnJlbnRU
cmFuc2Zvcm07CisgICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5HZXRUcmFuc2Zv
cm0oJmN1cnJlbnRUcmFuc2Zvcm0pOworCisgICAgYXV0byB0cmFuc2xhdGlvbiA9IEQyRDE6Ok1h
dHJpeDN4MkY6OlRyYW5zbGF0aW9uKHgsIHkpOworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJU
YXJnZXQoKS0+U2V0VHJhbnNmb3JtKHRyYW5zbGF0aW9uICogY3VycmVudFRyYW5zZm9ybSk7CisK
KyAgICBpZiAoYXV0byogZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSA9IHBsYXRmb3JtQ29udGV4dC5n
cmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisgICAgICAgIGdyYXBoaWNzQ29udGV4dFByaXZhdGUt
PnRyYW5zbGF0ZSh4LCB5KTsKK30KKwordm9pZCByb3RhdGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmIHBsYXRmb3JtQ29udGV4dCwgZmxvYXQgYW5nbGVJblJhZGlhbnMpCit7CisgICAgQVNTRVJU
KHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKSk7CisKKyAgICBEMkQxX01BVFJJWF8zWDJf
RiBjdXJyZW50VHJhbnNmb3JtOworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+
R2V0VHJhbnNmb3JtKCZjdXJyZW50VHJhbnNmb3JtKTsKKworICAgIGF1dG8gcm90YXRpb24gPSBE
MkQxOjpNYXRyaXgzeDJGOjpSb3RhdGlvbihyYWQyZGVnKGFuZ2xlSW5SYWRpYW5zKSk7CisgICAg
cGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5TZXRUcmFuc2Zvcm0ocm90YXRpb24gKiBj
dXJyZW50VHJhbnNmb3JtKTsKKworICAgIGlmIChhdXRvKiBncmFwaGljc0NvbnRleHRQcml2YXRl
ID0gcGxhdGZvcm1Db250ZXh0LmdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAgICAgZ3Jh
cGhpY3NDb250ZXh0UHJpdmF0ZS0+cm90YXRlKGFuZ2xlSW5SYWRpYW5zKTsKK30KKwordm9pZCBz
Y2FsZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBGbG9h
dFNpemUmIHNpemUpCit7CisgICAgQVNTRVJUKHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQo
KSk7CisKKyAgICBEMkQxX01BVFJJWF8zWDJfRiBjdXJyZW50VHJhbnNmb3JtOworICAgIHBsYXRm
b3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+R2V0VHJhbnNmb3JtKCZjdXJyZW50VHJhbnNmb3Jt
KTsKKworICAgIGF1dG8gc2NhbGUgPSBEMkQxOjpNYXRyaXgzeDJGOjpTY2FsZShzaXplKTsKKyAg
ICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPlNldFRyYW5zZm9ybShzY2FsZSAqIGN1
cnJlbnRUcmFuc2Zvcm0pOworCisgICAgaWYgKGF1dG8qIGdyYXBoaWNzQ29udGV4dFByaXZhdGUg
PSBwbGF0Zm9ybUNvbnRleHQuZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICAgICBncmFw
aGljc0NvbnRleHRQcml2YXRlLT5zY2FsZShzaXplKTsKK30KKwordm9pZCBjb25jYXRDVE0oUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgQWZmaW5lVHJhbnNm
b3JtJiBhZmZpbmVUcmFuc2Zvcm0pCit7CisgICAgQVNTRVJUKHBsYXRmb3JtQ29udGV4dC5yZW5k
ZXJUYXJnZXQoKSk7CisKKyAgICBEMkQxX01BVFJJWF8zWDJfRiBjdXJyZW50VHJhbnNmb3JtOwor
ICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+R2V0VHJhbnNmb3JtKCZjdXJyZW50
VHJhbnNmb3JtKTsKKworICAgIEQyRDFfTUFUUklYXzNYMl9GIHRyYW5zZm9ybVRvQ29uY2F0ID0g
YWZmaW5lVHJhbnNmb3JtOworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+U2V0
VHJhbnNmb3JtKHRyYW5zZm9ybVRvQ29uY2F0ICogY3VycmVudFRyYW5zZm9ybSk7CisKKyAgICBp
ZiAoYXV0byogZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSA9IHBsYXRmb3JtQ29udGV4dC5ncmFwaGlj
c0NvbnRleHRQcml2YXRlKCkpCisgICAgICAgIGdyYXBoaWNzQ29udGV4dFByaXZhdGUtPmNvbmNh
dENUTShhZmZpbmVUcmFuc2Zvcm0pOworfQorCit2b2lkIGJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIo
UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgZmxvYXQgb3BhY2l0eSkK
K3sKKyAgICBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6VHJhbnNwYXJlbmN5TGF5ZXJTdGF0ZSB0
cmFuc3BhcmVuY3lMYXllcjsKKyAgICB0cmFuc3BhcmVuY3lMYXllci5vcGFjaXR5ID0gb3BhY2l0
eTsKKworICAgIEhSRVNVTFQgaHIgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkNy
ZWF0ZUNvbXBhdGlibGVSZW5kZXJUYXJnZXQoJnRyYW5zcGFyZW5jeUxheWVyLnJlbmRlclRhcmdl
dCk7CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisgICAgcGxhdGZvcm1Db250
ZXh0Lm1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5hcHBlbmQoV1RGTW92ZSh0cmFuc3BhcmVuY3lM
YXllcikpOworCisgICAgcGxhdGZvcm1Db250ZXh0Lm1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5s
YXN0KCkucmVuZGVyVGFyZ2V0LT5CZWdpbkRyYXcoKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQubV90
cmFuc3BhcmVuY3lMYXllclN0YWNrLmxhc3QoKS5yZW5kZXJUYXJnZXQtPkNsZWFyKEQyRDE6OkNv
bG9yRigwLCAwLCAwLCAwKSk7Cit9CisKK3ZvaWQgZW5kVHJhbnNwYXJlbmN5TGF5ZXIoUGxhdGZv
cm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCkKK3sKKyAgICBhdXRvIGN1cnJlbnRM
YXllciA9IHBsYXRmb3JtQ29udGV4dC5tX3RyYW5zcGFyZW5jeUxheWVyU3RhY2sudGFrZUxhc3Qo
KTsKKyAgICBhdXRvIHJlbmRlclRhcmdldCA9IGN1cnJlbnRMYXllci5yZW5kZXJUYXJnZXQ7Cisg
ICAgaWYgKCFyZW5kZXJUYXJnZXQpCisgICAgICAgIHJldHVybjsKKworICAgIEhSRVNVTFQgaHIg
PSByZW5kZXJUYXJnZXQtPkVuZERyYXcoKTsKKyAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQo
aHIpKTsKKworICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gYml0bWFwOworICAgIGhyID0gcmVuZGVy
VGFyZ2V0LT5HZXRCaXRtYXAoJmJpdG1hcCk7CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVE
KGhyKSk7CisKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0
KCk7CisKKyAgICBpZiAoY3VycmVudExheWVyLmhhc1NoYWRvdykKKyAgICAgICAgZHJhd1dpdGhT
aGFkb3dIZWxwZXIoY29udGV4dCwgYml0bWFwLmdldCgpLCBjdXJyZW50TGF5ZXIuc2hhZG93Q29s
b3IsIGN1cnJlbnRMYXllci5zaGFkb3dPZmZzZXQsIGN1cnJlbnRMYXllci5zaGFkb3dCbHVyKTsK
KyAgICBlbHNlIHsKKyAgICAgICAgQ09NUHRyPElEMkQxQml0bWFwQnJ1c2g+IGJpdG1hcEJydXNo
OworICAgICAgICBhdXRvIGJpdG1hcEJydXNoUHJvcGVydGllcyA9IEQyRDE6OkJpdG1hcEJydXNo
UHJvcGVydGllcygpOworICAgICAgICBhdXRvIGJydXNoUHJvcGVydGllcyA9IEQyRDE6OkJydXNo
UHJvcGVydGllcygpOworICAgICAgICBIUkVTVUxUIGhyID0gY29udGV4dC0+Q3JlYXRlQml0bWFw
QnJ1c2goYml0bWFwLmdldCgpLCBiaXRtYXBCcnVzaFByb3BlcnRpZXMsIGJydXNoUHJvcGVydGll
cywgJmJpdG1hcEJydXNoKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7
CisKKyAgICAgICAgYXV0byBzaXplID0gYml0bWFwLT5HZXRTaXplKCk7CisgICAgICAgIGF1dG8g
cmVjdEluRElQID0gRDJEMTo6UmVjdEYoMCwgMCwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOwor
ICAgICAgICBjb250ZXh0LT5GaWxsUmVjdGFuZ2xlKHJlY3RJbkRJUCwgYml0bWFwQnJ1c2guZ2V0
KCkpOworICAgIH0KK30KKwordm9pZCBjbGlwKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0
Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGxhdGZvcm1D
b250ZXh0Lm1fcmVuZGVyU3RhdGVzLmlzRW1wdHkoKSkKKyAgICAgICAgc2F2ZShwbGF0Zm9ybUNv
bnRleHQpOworCisgICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5QdXNoQXhpc0Fs
aWduZWRDbGlwKHJlY3QsIEQyRDFfQU5USUFMSUFTX01PREVfUEVSX1BSSU1JVElWRSk7CisgICAg
cGxhdGZvcm1Db250ZXh0Lm1fcmVuZGVyU3RhdGVzLmxhc3QoKS5tX2NsaXBzLmFwcGVuZChQbGF0
Zm9ybUNvbnRleHREaXJlY3QyRDo6QXhpc0FsaWduZWRDbGlwKTsKKworICAgIGlmIChhdXRvKiBn
cmFwaGljc0NvbnRleHRQcml2YXRlID0gcGxhdGZvcm1Db250ZXh0LmdyYXBoaWNzQ29udGV4dFBy
aXZhdGUoKSkKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZS0+Y2xpcChyZWN0KTsKK30K
Kwordm9pZCBjbGlwT3V0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQs
IGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRS
ZWN0KHJlY3QpOworCisgICAgY2xpcE91dChwbGF0Zm9ybUNvbnRleHQsIHBhdGgpOworfQorCit2
b2lkIGNsaXBPdXQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29u
c3QgUGF0aCYgcGF0aCkKK3sKKyAgICAvLyBUbyBjbGlwIE91dCB3ZSBuZWVkIHRoZSBpbnRlcnNl
Y3Rpb24gb2YgdGhlIGluZmluaXRlCisgICAgLy8gY2xpcHBpbmcgcmVjdCBhbmQgdGhlIHBhdGgg
d2UganVzdCBjcmVhdGVkLgorICAgIEQyRDFfU0laRV9GIHJlbmRlcmVyU2l6ZSA9IHBsYXRmb3Jt
Q29udGV4dC5yZW5kZXJUYXJnZXQoKS0+R2V0U2l6ZSgpOworICAgIEZsb2F0UmVjdCBjbGlwQm91
bmRzKDAsIDAsIHJlbmRlcmVyU2l6ZS53aWR0aCwgcmVuZGVyZXJTaXplLmhlaWdodCk7CisKKyAg
ICBQYXRoIGJvdW5kaW5nUmVjdDsKKyAgICBib3VuZGluZ1JlY3QuYWRkUmVjdChjbGlwQm91bmRz
KTsKKyAgICBib3VuZGluZ1JlY3QuYXBwZW5kR2VvbWV0cnkocGF0aC5wbGF0Zm9ybVBhdGgoKSk7
CisKKyAgICBDT01QdHI8SUQyRDFHZW9tZXRyeUdyb3VwPiBwYXRoVG9DbGlwOworICAgIGJvdW5k
aW5nUmVjdC5jcmVhdGVHZW9tZXRyeVdpdGhGaWxsTW9kZShXaW5kUnVsZTo6RXZlbk9kZCwgcGF0
aFRvQ2xpcCk7CisgICAgY2xpcFBhdGgocGxhdGZvcm1Db250ZXh0LCBwYXRoVG9DbGlwLmdldCgp
KTsKK30KKwordm9pZCBjbGlwUGF0aChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1D
b250ZXh0LCBjb25zdCBQYXRoJiBwYXRoLCBXaW5kUnVsZSBjbGlwUnVsZSkKK3sKKyAgICBpZiAo
cGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgRGlyZWN0MkQ6OmNsaXAocGxhdGZvcm1Db250ZXh0
LCBGbG9hdFJlY3QoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDT01QdHI8SUQy
RDFHZW9tZXRyeUdyb3VwPiBwYXRoVG9DbGlwOworICAgIHBhdGguY3JlYXRlR2VvbWV0cnlXaXRo
RmlsbE1vZGUoY2xpcFJ1bGUsIHBhdGhUb0NsaXApOworCisgICAgY2xpcFBhdGgocGxhdGZvcm1D
b250ZXh0LCBwYXRoVG9DbGlwLmdldCgpKTsKKworICAgIGlmIChhdXRvKiBncmFwaGljc0NvbnRl
eHRQcml2YXRlID0gcGxhdGZvcm1Db250ZXh0LmdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAg
ICAgICAgZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZS0+Y2xpcChwYXRoKTsKK30KKwordm9pZCBjbGlw
UGF0aChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBJRDJEMUdlb21l
dHJ5KiBwYXRoKQoreworICAgIEFTU0VSVChwbGF0Zm9ybUNvbnRleHQuaGFzU2F2ZWRTdGF0ZSgp
KTsKKyAgICBpZiAoIXBsYXRmb3JtQ29udGV4dC5oYXNTYXZlZFN0YXRlKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIENPTVB0cjxJRDJEMUxheWVyPiBjbGlwTGF5ZXI7CisgICAgSFJFU1VMVCBo
ciA9IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+Q3JlYXRlTGF5ZXIoJmNsaXBMYXll
cik7CisgICAgQVNTRVJUKFNVQ0NFRURFRChocikpOworICAgIGlmICghU1VDQ0VFREVEKGhyKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5Q
dXNoTGF5ZXIoRDJEMTo6TGF5ZXJQYXJhbWV0ZXJzKEQyRDE6OkluZmluaXRlUmVjdCgpLCBwYXRo
KSwgY2xpcExheWVyLmdldCgpKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQucHVzaFJlbmRlckNsaXAo
UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OkxheWVyQ2xpcCk7CisgICAgcGxhdGZvcm1Db250ZXh0
LnNldEFjdGl2ZUxheWVyKFdURk1vdmUoY2xpcExheWVyKSk7Cit9CisKK3ZvaWQgY2xpcFRvSW1h
Z2VCdWZmZXIoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBJRDJEMVJlbmRlclRhcmdldCosIGNv
bnN0IEZsb2F0UmVjdCYpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworfSAvLyBuYW1l
c3BhY2UgRGlyZWN0MkQKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShE
SVJFQ1QyRCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJl
Y3QyRE9wZXJhdGlvbnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vRGlyZWN0MkRPcGVyYXRpb25zLmgJKG5vbmV4aXN0ZW50KQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0RpcmVjdDJET3BlcmF0aW9ucy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIw
MTkgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAw
NyBBbHAgVG9rZXIgPGFscEBhdG9rZXIuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5
IERpcmsgU2NodWx6ZSA8a3JpdEB3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IE51
YW50aSBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQnJlbnQgRnVsZ2hhbSA8YmZ1bGdoYW1A
d2Via2l0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBJZ2FsaWEgUy5MLgorICog
Q29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDEwLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKwor
I2lmIFVTRShESVJFQ1QyRCkKKworI2luY2x1ZGUgIkRhc2hBcnJheS5oIgorI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzVHlwZXMuaCIKKyNpbmNsdWRlIDxk
MmQxLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQWZmaW5lVHJhbnNmb3JtOwor
Y2xhc3MgQ29sb3I7CitjbGFzcyBGbG9hdFJlY3Q7CitjbGFzcyBGbG9hdFJvdW5kZWRSZWN0Owor
Y2xhc3MgRmxvYXRTaXplOworY2xhc3MgUGF0aDsKK2NsYXNzIFBsYXRmb3JtQ29udGV4dENhaXJv
OworCitzdHJ1Y3QgR3JhcGhpY3NDb250ZXh0U3RhdGU7CisKK25hbWVzcGFjZSBEaXJlY3QyRCB7
CisKK25hbWVzcGFjZSBTdGF0ZSB7CisKK3ZvaWQgc2V0U3Ryb2tlVGhpY2tuZXNzKFBsYXRmb3Jt
Q29udGV4dERpcmVjdDJEJiwgZmxvYXQpOwordm9pZCBzZXRTdHJva2VTdHlsZShQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRCYsIFN0cm9rZVN0eWxlKTsKKwordm9pZCBzZXRDb21wb3NpdGVPcGVyYXRp
b24oUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBDb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2Rl
KTsKK3ZvaWQgc2V0U2hvdWxkQW50aWFsaWFzKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgYm9v
bCk7CisKK3ZvaWQgc2V0Q1RNKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgQWZmaW5l
VHJhbnNmb3JtJik7CitBZmZpbmVUcmFuc2Zvcm0gZ2V0Q1RNKFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEJik7CisKK0ludFJlY3QgZ2V0Q2xpcEJvdW5kcyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYp
OworRmxvYXRSZWN0IHJvdW5kVG9EZXZpY2VQaXhlbHMoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQm
LCBjb25zdCBGbG9hdFJlY3QmKTsKKworYm9vbCBpc0FjY2VsZXJhdGVkQ29udGV4dChQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRCYpOworCit9IC8vIG5hbWVzcGFjZSBTdGF0ZQorCitzdHJ1Y3QgRmls
bFNvdXJjZSB7CisgICAgRmlsbFNvdXJjZSgpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBGaWxs
U291cmNlKGNvbnN0IEdyYXBoaWNzQ29udGV4dFN0YXRlJiwgUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmKTsKKworICAgIGZsb2F0IGdsb2JhbEFscGhhIHsgMCB9OworICAgIENPTVB0cjxJRDJEMUJy
dXNoPiBicnVzaDsKKyAgICBDb2xvciBjb2xvcjsKKworICAgIFdpbmRSdWxlIGZpbGxSdWxlIHsg
V2luZFJ1bGU6Ok5vblplcm8gfTsKK307CisKK3N0cnVjdCBTdHJva2VTb3VyY2UgeworICAgIFN0
cm9rZVNvdXJjZSgpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBTdHJva2VTb3VyY2UoY29uc3Qg
R3JhcGhpY3NDb250ZXh0U3RhdGUmLCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYpOworCisgICAg
ZmxvYXQgZ2xvYmFsQWxwaGEgeyAwIH07CisgICAgZmxvYXQgdGhpY2tuZXNzIHsgMCB9OworICAg
IENPTVB0cjxJRDJEMUJydXNoPiBicnVzaDsKKyAgICBDb2xvciBjb2xvcjsKK307CisKK3N0cnVj
dCBTaGFkb3dTdGF0ZSB7CisgICAgU2hhZG93U3RhdGUoKSA9IGRlZmF1bHQ7CisgICAgV0VCQ09S
RV9FWFBPUlQgZXhwbGljaXQgU2hhZG93U3RhdGUoY29uc3QgR3JhcGhpY3NDb250ZXh0U3RhdGUm
KTsKKworICAgIGJvb2wgaXNWaXNpYmxlKCkgY29uc3Q7CisgICAgYm9vbCBpc1JlcXVpcmVkKFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEJikgY29uc3Q7CisKKyAgICBGbG9hdFNpemUgb2Zmc2V0Owor
ICAgIGZsb2F0IGJsdXIgeyAwIH07CisgICAgQ29sb3IgY29sb3I7CisgICAgYm9vbCBpZ25vcmVU
cmFuc2Zvcm1zIHsgZmFsc2UgfTsKKworICAgIGZsb2F0IGdsb2JhbEFscGhhIHsgMS4wIH07Cisg
ICAgQ29tcG9zaXRlT3BlcmF0b3IgZ2xvYmFsQ29tcG9zaXRlT3BlcmF0b3IgeyBDb21wb3NpdGVT
b3VyY2VPdmVyIH07Cit9OworCit2b2lkIHNldExpbmVDYXAoUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmLCBMaW5lQ2FwKTsKK3ZvaWQgc2V0TGluZURhc2goUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQm
LCBjb25zdCBEYXNoQXJyYXkmLCBmbG9hdCk7Cit2b2lkIHNldExpbmVKb2luKFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEJiwgTGluZUpvaW4pOwordm9pZCBzZXRNaXRlckxpbWl0KFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEJiwgZmxvYXQpOworCit2b2lkIGZpbGxSZWN0KFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmlsbFNvdXJjZSYsIGNvbnN0IFNoYWRv
d1N0YXRlJik7Cit2b2lkIGZpbGxSZWN0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3Qg
RmxvYXRSZWN0JiwgY29uc3QgQ29sb3ImLCBjb25zdCBTaGFkb3dTdGF0ZSYpOwordm9pZCBmaWxs
UmVjdFdpdGhHcmFkaWVudChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVj
dCYsIElEMkQxQnJ1c2gqKTsKK3ZvaWQgZmlsbFJvdW5kZWRSZWN0KFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJiwgY29uc3QgRmxvYXRSb3VuZGVkUmVjdCYsIGNvbnN0IENvbG9yJiwgY29uc3QgU2hh
ZG93U3RhdGUmKTsKK3ZvaWQgZmlsbFJlY3RXaXRoUm91bmRlZEhvbGUoUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiwgY29u
c3QgRmlsbFNvdXJjZSYsIGNvbnN0IFNoYWRvd1N0YXRlJik7Cit2b2lkIGZpbGxQYXRoKFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgUGF0aCYsIGNvbnN0IEZpbGxTb3VyY2UmLCBjb25z
dCBTaGFkb3dTdGF0ZSYpOwordm9pZCBmaWxsUGF0aChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYs
IGNvbnN0IFBhdGgmLCBjb25zdCBDb2xvciYsIGNvbnN0IFNoYWRvd1N0YXRlJik7CisKK3ZvaWQg
c3Ryb2tlUmVjdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYsIGZs
b2F0LCBjb25zdCBTdHJva2VTb3VyY2UmLCBjb25zdCBTaGFkb3dTdGF0ZSYpOwordm9pZCBzdHJv
a2VQYXRoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgUGF0aCYsIGNvbnN0IFN0cm9r
ZVNvdXJjZSYsIGNvbnN0IFNoYWRvd1N0YXRlJik7Cit2b2lkIGNsZWFyUmVjdChQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYpOworCisvLyBGSVhNRShJTVBMRU1FTlQp
OiB2b2lkIGRyYXdHbHlwaHMoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBGaWxsU291
cmNlJiwgY29uc3QgU3Ryb2tlU291cmNlJiwgY29uc3QgU2hhZG93U3RhdGUmLCBjb25zdCBGbG9h
dFBvaW50JiwgRGlyZWN0V3JpdGVTY2FsZWRGb250KiwgZG91YmxlLCBjb25zdCBWZWN0b3I8RGly
ZWN0V3JpdGVHbHlwaFR5cGU+JiwgZmxvYXQsIFRleHREcmF3aW5nTW9kZUZsYWdzLCBmbG9hdCwg
Y29uc3QgRmxvYXRTaXplJiwgY29uc3QgQ29sb3ImKTsKKwordm9pZCBkcmF3TmF0aXZlSW1hZ2Uo
UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBJV0lDQml0bWFwKiwgY29uc3QgRmxvYXRTaXplJiBp
bWFnZVNpemUsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZsb2F0UmVjdCYsIENvbXBvc2l0ZU9w
ZXJhdG9yLCBCbGVuZE1vZGUsIEltYWdlT3JpZW50YXRpb24sIEludGVycG9sYXRpb25RdWFsaXR5
LCBmbG9hdCwgY29uc3QgU2hhZG93U3RhdGUmKTsKK3ZvaWQgZHJhd05hdGl2ZUltYWdlKFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJiwgSUQyRDFCaXRtYXAqLCBjb25zdCBGbG9hdFNpemUmIGltYWdl
U2l6ZSwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRSZWN0JiwgQ29tcG9zaXRlT3BlcmF0
b3IsIEJsZW5kTW9kZSwgSW1hZ2VPcmllbnRhdGlvbiwgSW50ZXJwb2xhdGlvblF1YWxpdHksIGZs
b2F0LCBjb25zdCBTaGFkb3dTdGF0ZSYpOwordm9pZCBkcmF3UGF0aChQbGF0Zm9ybUNvbnRleHRE
aXJlY3QyRCYsIGNvbnN0IFBhdGgmLCBjb25zdCBTdHJva2VTb3VyY2UmLCBjb25zdCBTaGFkb3dT
dGF0ZSYpOwordm9pZCBkcmF3UGF0dGVybihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIElXSUNC
aXRtYXAqLCBjb25zdCBJbnRTaXplJiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRSZWN0
JiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgY29uc3QgRmxvYXRQb2ludCYsIENvbXBvc2l0ZU9w
ZXJhdG9yLCBCbGVuZE1vZGUpOworCit2b2lkIGRyYXdXaXRob3V0U2hhZG93KFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ1JlY3QsIGNvbnN0IFdURjo6
RnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiYgZHJhd0NvbW1hbmRzKTsKK3ZvaWQg
ZHJhd1dpdGhTaGFkb3coUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJlY3Qm
IGJvdW5kaW5nUmVjdCwgY29uc3QgU2hhZG93U3RhdGUmLCBjb25zdCBXVEY6OkZ1bmN0aW9uPHZv
aWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4mIGRyYXdDb21tYW5kcyk7Cit2b2lkIGRyYXdXaXRoU2hh
ZG93SGVscGVyKElEMkQxUmVuZGVyVGFyZ2V0KiBjb250ZXh0LCBJRDJEMUJpdG1hcCosIGNvbnN0
IENvbG9yJiBzaGFkb3dDb2xvciwgY29uc3QgRmxvYXRTaXplJiBzaGFkb3dPZmZzZXQsIGZsb2F0
IHNoYWRvd0JsdXIpOworCit2b2lkIGRyYXdSZWN0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwg
Y29uc3QgRmxvYXRSZWN0JiwgZmxvYXQsIGNvbnN0IENvbG9yJiwgU3Ryb2tlU3R5bGUsIGNvbnN0
IENvbG9yJik7Cit2b2lkIGRyYXdMaW5lKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3Qg
RmxvYXRQb2ludCYsIGNvbnN0IEZsb2F0UG9pbnQmLCBTdHJva2VTdHlsZSwgY29uc3QgQ29sb3Im
LCBmbG9hdCwgYm9vbCk7Cit2b2lkIGRyYXdMaW5lc0ZvclRleHQoUGxhdGZvcm1Db250ZXh0RGly
ZWN0MkQmLCBjb25zdCBGbG9hdFBvaW50JiwgZmxvYXQgdGhpY2tuZXNzLCBjb25zdCBEYXNoQXJy
YXkmLCBib29sLCBib29sLCBjb25zdCBDb2xvciYpOwordm9pZCBkcmF3RG90c0ZvckRvY3VtZW50
TWFya2VyKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0JiwgRG9jdW1l
bnRNYXJrZXJMaW5lU3R5bGUpOwordm9pZCBkcmF3RWxsaXBzZShQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYsIFN0cm9rZVN0eWxlLCBjb25zdCBDb2xvciYsIGZsb2F0
KTsKK3ZvaWQgZmlsbEVsbGlwc2UoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9h
dFJlY3QmLCBjb25zdCBDb2xvciYsIFN0cm9rZVN0eWxlLCBjb25zdCBDb2xvciYsIGZsb2F0KTsK
Kwordm9pZCBkcmF3Rm9jdXNSaW5nKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgUGF0
aCYsIGZsb2F0LCBjb25zdCBDb2xvciYpOwordm9pZCBkcmF3Rm9jdXNSaW5nKFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEJiwgY29uc3QgVmVjdG9yPEZsb2F0UmVjdD4mLCBmbG9hdCwgY29uc3QgQ29s
b3ImKTsKKwordm9pZCBmbHVzaChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYpOwordm9pZCBzYXZl
KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJik7Cit2b2lkIHJlc3RvcmUoUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQmKTsKKwordm9pZCB0cmFuc2xhdGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBm
bG9hdCwgZmxvYXQpOwordm9pZCByb3RhdGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBmbG9h
dCk7Cit2b2lkIHNjYWxlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRTaXpl
Jik7Cit2b2lkIGNvbmNhdENUTShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEFmZmlu
ZVRyYW5zZm9ybSYpOworCit2b2lkIGJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoUGxhdGZvcm1Db250
ZXh0RGlyZWN0MkQmLCBmbG9hdCk7Cit2b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVyKFBsYXRmb3Jt
Q29udGV4dERpcmVjdDJEJik7CisKK3ZvaWQgY2xpcChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYs
IGNvbnN0IEZsb2F0UmVjdCYpOworCit2b2lkIGNsaXBPdXQoUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmLCBjb25zdCBGbG9hdFJlY3QmKTsKK3ZvaWQgY2xpcE91dChQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRCYsIGNvbnN0IFBhdGgmKTsKK3ZvaWQgY2xpcFBhdGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmLCBjb25zdCBQYXRoJiwgV2luZFJ1bGUpOwordm9pZCBjbGlwUGF0aChQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYsIElEMkQxR2VvbWV0cnkqIHBhdGgpOworCit2b2lkIGNsaXBUb0ltYWdlQnVm
ZmVyKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgSUQyRDFSZW5kZXJUYXJnZXQqLCBjb25zdCBG
bG9hdFJlY3QmKTsKKworfSAvLyBuYW1lc3BhY2UgRGlyZWN0MkQKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKKworI2VuZGlmIC8vIFVTRShESVJFQ1QyRCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJlY3QyRFV0aWxpdGllcy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0RpcmVjdDJEVXRpbGl0aWVzLmNw
cAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
RGlyZWN0MkRVdGlsaXRpZXMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTMyIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBTLkwuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTEgUHJvRlVTSU9OIGVtYmVkZGVkIHN5c3RlbXMKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRpcmVjdDJE
VXRpbGl0aWVzLmgiCisKKyNpZiBVU0UoRElSRUNUMkQpCisKKyNpbmNsdWRlICJDT01QdHIuaCIK
KyNpbmNsdWRlICJGbG9hdFBvaW50LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisj
aW5jbHVkZSAiSW1hZ2VEZWNvZGVyRGlyZWN0MkQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisj
aW5jbHVkZSAiSW50U2l6ZS5oIgorI2luY2x1ZGUgPGQyZDEuaD4KKyNpbmNsdWRlIDx3aW5jb2Rl
Yy5oPgorCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIERpcmVjdDJEIHsKKwor
SW50U2l6ZSBiaXRtYXBTaXplKElXSUNCaXRtYXBTb3VyY2UqIGJpdG1hcFNvdXJjZSkKK3sKKyAg
ICBVSU5UIHdpZHRoLCBoZWlnaHQ7CisgICAgSFJFU1VMVCBociA9IGJpdG1hcFNvdXJjZS0+R2V0
U2l6ZSgmd2lkdGgsICZoZWlnaHQpOworICAgIGlmICghU1VDQ0VFREVEKGhyKSkKKyAgICAgICAg
cmV0dXJuIHsgfTsKKworICAgIHJldHVybiBJbnRTaXplKHdpZHRoLCBoZWlnaHQpOworfQorCitG
bG9hdFBvaW50IGJpdG1hcFJlc29sdXRpb24oSVdJQ0JpdG1hcFNvdXJjZSogYml0bWFwU291cmNl
KQoreworICAgIGNvbnN0ZXhwciBkb3VibGUgZHBpQmFzZSA9IDk2LjA7CisKKyAgICBkb3VibGUg
ZHBpWCwgZHBpWTsKKyAgICBIUkVTVUxUIGhyID0gYml0bWFwU291cmNlLT5HZXRSZXNvbHV0aW9u
KCZkcGlYLCAmZHBpWSk7CisgICAgaWYgKCFTVUNDRUVERUQoaHIpKQorICAgICAgICByZXR1cm4g
eyB9OworCisgICAgRmxvYXRQb2ludCByZXN1bHQoZHBpWCwgZHBpWSk7CisgICAgcmVzdWx0LnNj
YWxlKDEgLyBkcGlCYXNlKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1bnNpZ25lZCBiaXRz
UGVyUGl4ZWwoR1VJRCBiaXRtYXBGb3JtYXQpCit7CisgICAgQ09NUHRyPElXSUNDb21wb25lbnRJ
bmZvPiBjb21wb25lbnRJbmZvOworICAgIEhSRVNVTFQgaHIgPSBJbWFnZURlY29kZXJEaXJlY3Qy
RDo6c3lzdGVtSW1hZ2luZ0ZhY3RvcnkoKS0+Q3JlYXRlQ29tcG9uZW50SW5mbyhiaXRtYXBGb3Jt
YXQsICZjb21wb25lbnRJbmZvKTsKKyAgICBpZiAoIVNVQ0NFRURFRChocikpCisgICAgICAgIHJl
dHVybiA0OworCisgICAgQ09NUHRyPElXSUNQaXhlbEZvcm1hdEluZm8+IHBpeGVsRm9ybWF0Owor
ICAgIHBpeGVsRm9ybWF0LnF1ZXJ5KGNvbXBvbmVudEluZm8pOworICAgIGlmICghcGl4ZWxGb3Jt
YXQpCisgICAgICAgIHJldHVybiA0OworCisgICAgVUlOVCBicHAgPSAwOworICAgIGhyID0gcGl4
ZWxGb3JtYXQtPkdldEJpdHNQZXJQaXhlbCgmYnBwKTsKKyAgICBpZiAoIVNVQ0NFRURFRChocikp
CisgICAgICAgIHJldHVybiA0OworCisgICAgcmV0dXJuIGJwcDsKK30KKworQ09NUHRyPElXSUNC
aXRtYXA+IGNyZWF0ZURpcmVjdDJESW1hZ2VTdXJmYWNlV2l0aERhdGEodm9pZCogZGF0YSwgY29u
c3QgSW50U2l6ZSYgc2l6ZSwgdW5zaWduZWQgc3RyaWRlKQoreworICAgIENoZWNrZWQ8c2l6ZV90
LCBSZWNvcmRPdmVyZmxvdz4gbnVtQnl0ZXMgPSBDaGVja2VkPHVuc2lnbmVkLCBSZWNvcmRPdmVy
Zmxvdz4oc2l6ZS5oZWlnaHQoKSkgKiBzdHJpZGU7CisgICAgaWYgKG51bUJ5dGVzLmhhc092ZXJm
bG93ZWQoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBDT01QdHI8SVdJQ0JpdG1h
cD4gc3VyZmFjZTsKKyAgICBIUkVTVUxUIGhyID0gSW1hZ2VEZWNvZGVyRGlyZWN0MkQ6OnN5c3Rl
bUltYWdpbmdGYWN0b3J5KCktPkNyZWF0ZUJpdG1hcEZyb21NZW1vcnkoc2l6ZS53aWR0aCgpLCBz
aXplLmhlaWdodCgpLCBHVUlEX1dJQ1BpeGVsRm9ybWF0MzJicHBQQkdSQSwgc3RyaWRlLCBzdGF0
aWNfY2FzdDxVSU5UPihudW1CeXRlcy51bnNhZmVHZXQoKSksIHJlaW50ZXJwcmV0X2Nhc3Q8QllU
RSo+KGRhdGEpLCAmc3VyZmFjZSk7CisgICAgaWYgKCFTVUNDRUVERUQoaHIpKQorICAgICAgICBy
ZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVybiBzdXJmYWNlOworfQorCitDT01QdHI8SUQyRDFS
ZW5kZXJUYXJnZXQ+IGNyZWF0ZVJlbmRlclRhcmdldEZyb21XSUNCaXRtYXAoSVdJQ0JpdG1hcCog
Yml0bWFwU291cmNlKQoreworICAgIGF1dG8gdGFyZ2V0UHJvcGVydGllcyA9IEQyRDE6OlJlbmRl
clRhcmdldFByb3BlcnRpZXMoRDJEMV9SRU5ERVJfVEFSR0VUX1RZUEVfREVGQVVMVCwKKyAgICAg
ICAgRDJEMTo6UGl4ZWxGb3JtYXQoRFhHSV9GT1JNQVRfQjhHOFI4QThfVU5PUk0sIEQyRDFfQUxQ
SEFfTU9ERV9QUkVNVUxUSVBMSUVEKSwKKyAgICAgICAgMCwgMCwgRDJEMV9SRU5ERVJfVEFSR0VU
X1VTQUdFX05PTkUsIEQyRDFfRkVBVFVSRV9MRVZFTF9ERUZBVUxUKTsKKworICAgIENPTVB0cjxJ
RDJEMVJlbmRlclRhcmdldD4gYml0bWFwQ29udGV4dDsKKyAgICBIUkVTVUxUIGhyID0gR3JhcGhp
Y3NDb250ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0ZVdpY0JpdG1hcFJlbmRlclRhcmdldChi
aXRtYXBTb3VyY2UsICZ0YXJnZXRQcm9wZXJ0aWVzLCAmYml0bWFwQ29udGV4dCk7CisgICAgaWYg
KCFiaXRtYXBDb250ZXh0IHx8ICFTVUNDRUVERUQoaHIpKQorICAgICAgICByZXR1cm4gbnVsbHB0
cjsKKworICAgIHJldHVybiBiaXRtYXBDb250ZXh0OworfQorCit2b2lkIGNvcHlSZWN0RnJvbU9u
ZVN1cmZhY2VUb0Fub3RoZXIoSVdJQ0JpdG1hcCogZnJvbSwgSVdJQ0JpdG1hcCogdG8sIGNvbnN0
IEludFNpemUmIHNvdXJjZU9mZnNldCwgY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgSW50U2l6
ZSYgZGVzdE9mZnNldCkKK3sKKyAgICAvKgorICAgIFJlZlB0cjxjYWlyb190PiBjb250ZXh0ID0g
YWRvcHRSZWYoY2Fpcm9fY3JlYXRlKHRvKSk7CisgICAgY2Fpcm9fdHJhbnNsYXRlKGNvbnRleHQu
Z2V0KCksIGRlc3RPZmZzZXQud2lkdGgoKSwgZGVzdE9mZnNldC5oZWlnaHQoKSk7CisgICAgY2Fp
cm9fc2V0X29wZXJhdG9yKGNvbnRleHQuZ2V0KCksIGNhaXJvT3BlcmF0b3IpOworICAgIGNvcHlS
ZWN0RnJvbUNhaXJvU3VyZmFjZVRvQ29udGV4dChmcm9tLCBjb250ZXh0LmdldCgpLCBzb3VyY2VP
ZmZzZXQsIHJlY3QpOworICAgICovCit9CisKK30gLy8gbmFtZXNwYWNlIERpcmVjdDJECisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShESVJFQ1QyRCkKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJlY3QyRFV0aWxpdGllcy5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJlY3Qy
RFV0aWxpdGllcy5oCShub25leGlzdGVudCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9EaXJlY3QyRFV0aWxpdGllcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqIENvcHlyaWdo
dCAoQykgMjAxMSBQcm9GVVNJT04gZW1iZWRkZWQgc3lzdGVtcworICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIFVTRShESVJFQ1Qy
RCkKKworI2luY2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1ZGUgIkdyYXBoaWNzVHlwZXMuaCIKKyNp
bmNsdWRlICJJbnRTaXplLmgiCisKK2ludGVyZmFjZSBJRDJEMVJlbmRlclRhcmdldDsKK2ludGVy
ZmFjZSBJV0lDQml0bWFwU291cmNlOworaW50ZXJmYWNlIElXSUNCaXRtYXA7CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworY2xhc3MgRmxvYXRQb2ludDsKK2NsYXNzIEludFJlY3Q7CitjbGFzcyBJ
bnRTaXplOworCituYW1lc3BhY2UgRGlyZWN0MkQgeworCitJbnRTaXplIGJpdG1hcFNpemUoSVdJ
Q0JpdG1hcFNvdXJjZSopOworRmxvYXRQb2ludCBiaXRtYXBSZXNvbHV0aW9uKElXSUNCaXRtYXBT
b3VyY2UqKTsKK3Vuc2lnbmVkIGJpdHNQZXJQaXhlbChHVUlEKTsKK0NPTVB0cjxJV0lDQml0bWFw
PiBjcmVhdGVEaXJlY3QyREltYWdlU3VyZmFjZVdpdGhEYXRhKHZvaWQqIGRhdGEsIGNvbnN0IElu
dFNpemUmLCB1bnNpZ25lZCBzdHJpZGUpOworQ09NUHRyPElEMkQxUmVuZGVyVGFyZ2V0PiBjcmVh
dGVSZW5kZXJUYXJnZXRGcm9tV0lDQml0bWFwKElXSUNCaXRtYXAqKTsKKwordm9pZCBjb3B5UmVj
dEZyb21PbmVTdXJmYWNlVG9Bbm90aGVyKElXSUNCaXRtYXAqIGZyb20sIElXSUNCaXRtYXAqIHRv
LCBjb25zdCBJbnRTaXplJiBzb3VyY2VPZmZzZXQsIGNvbnN0IEludFJlY3QmLCBjb25zdCBJbnRT
aXplJiBkZXN0T2Zmc2V0ID0gSW50U2l6ZSgpKTsKKworfSAvLyBuYW1lc3BhY2UgRGlyZWN0MkQK
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKERJUkVDVDJEKQpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYXNjYWRlRGlyZWN0
MkQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9Gb250Q2FzY2FkZURpcmVjdDJELmNwcAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYXNjYWRlRGlyZWN0MkQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGlyZWN0MkQuaCIKICNp
bmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaCIK
ICNpbmNsdWRlICJVbmlzY3JpYmVDb250cm9sbGVyLmgiCiAjaW5jbHVkZSAiV2ViQ29yZVRleHRS
ZW5kZXJlci5oIgogI2luY2x1ZGUgPGQyZDEuaD4KQEAgLTQ3LDcgKzQ4LDcgQEAgbmFtZXNwYWNl
IFdlYkNvcmUgewogdm9pZCBGb250Q2FzY2FkZTo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQm
IGdyYXBoaWNzQ29udGV4dCwgY29uc3QgRm9udCYgZm9udCwgY29uc3QgR2x5cGhCdWZmZXImIGds
eXBoQnVmZmVyLAogICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIG51bUdseXBocywgY29uc3Qg
RmxvYXRQb2ludCYgcG9pbnQsIEZvbnRTbW9vdGhpbmdNb2RlIHNtb290aGluZ01vZGUpCiB7Ci0g
ICAgYXV0byBjb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LnBsYXRmb3JtQ29udGV4dCgpOworICAg
IGF1dG8gY29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKS0+cmVuZGVy
VGFyZ2V0KCk7CiAgICAgYm9vbCBzaG91bGRVc2VGb250U21vb3RoaW5nID0gV2ViQ29yZVNob3Vs
ZFVzZUZvbnRTbW9vdGhpbmcoKTsKIAogICAgIHN3aXRjaCAoc21vb3RoaW5nTW9kZSkgewpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYWRpZW50RGlyZWN0MkQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9H
cmFkaWVudERpcmVjdDJELmNwcAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYWRpZW50RGlyZWN0MkQuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yOCw2ICsyOCw3IEBACiAKICNpbmNsdWRlICJGbG9hdFBvaW50LmgiCiAjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaCIK
ICNpbmNsdWRlIDxkMmQxLmg+CiAjaW5jbHVkZSA8d3RmL1JldGFpblB0ci5oPgogCkBAIC0xMTAs
NyArMTExLDcgQEAgdm9pZCBHcmFkaWVudDo6Z2VuZXJhdGVHcmFkaWVudChJRDJEMVJlbgogCiB2
b2lkIEdyYWRpZW50OjpmaWxsKEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwgY29uc3QgRmxvYXRS
ZWN0JiByZWN0KQogewotICAgIGF1dG8gZDJkQ29udGV4dCA9IGNvbnRleHQucGxhdGZvcm1Db250
ZXh0KCk7CisgICAgYXV0byBkMmRDb250ZXh0ID0gY29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKS0+
cmVuZGVyVGFyZ2V0KCk7CiAKICAgICBXVEY6OnN3aXRjaE9uKG1fZGF0YSwKICAgICAgICAgWyZd
IChjb25zdCBMaW5lYXJEYXRhJiBkYXRhKSB7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0RGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHREaXJl
Y3QyRC5jcHAJKHJldmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHREaXJlY3QyRC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE2LTIwMTggQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE2LTIwMTkgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBA
IC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAKICNpbmNsdWRl
ICJDT01QdHIuaCIKKyNpbmNsdWRlICJEaXJlY3QyRE9wZXJhdGlvbnMuaCIKICNpbmNsdWRlICJE
aXNwbGF5TGlzdFJlY29yZGVyLmgiCiAjaW5jbHVkZSAiRmxvYXRSb3VuZGVkUmVjdC5oIgogI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURpcmVjdDJELmgiCkBAIC0zNCw2
ICszNSw3IEBACiAjaW5jbHVkZSAiSW1hZ2VEZWNvZGVyRGlyZWN0MkQuaCIKICNpbmNsdWRlICJM
b2dnaW5nLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRC5oIgogI2luY2x1ZGUgPGQyZDEuaD4KICNpbmNsdWRlIDxkMmQxZWZm
ZWN0cy5oPgogI2luY2x1ZGUgPGR3cml0ZS5oPgpAQCAtNjMsMTAgKzY1LDExIEBAIEdyYXBoaWNz
Q29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBoZGMKIAogICAgICgqcmVuZGVyVGFyZ2V0KS0+
QmluZERDKGhkYywgJnJlY3QpOwogCi0gICAgbV9kYXRhID0gbmV3IEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZSgqcmVuZGVyVGFyZ2V0LCBCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZTo6
R1BVTWVtb3J5KTsKKyAgICBhdXRvIG93bmVkUGxhdGZvcm1Db250ZXh0ID0gc3RkOjptYWtlX3Vu
aXF1ZTxQbGF0Zm9ybUNvbnRleHREaXJlY3QyRD4oKnJlbmRlclRhcmdldCk7CisgICAgbV9kYXRh
ID0gbmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZShXVEZNb3ZlKG93bmVkUGxhdGZv
cm1Db250ZXh0KSwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSk7CiB9CiAK
LUdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0
KiBwbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUgcmVu
ZGVyZXJUeXBlKQorR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoUGxhdGZvcm1Db250
ZXh0RGlyZWN0MkQqIHBsYXRmb3JtR3JhcGhpY3NDb250ZXh0LCBCaXRtYXBSZW5kZXJpbmdDb250
ZXh0VHlwZSByZW5kZXJlclR5cGUpCiB7CiAgICAgcGxhdGZvcm1Jbml0KHBsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0LCByZW5kZXJlclR5cGUpOwogfQpAQCAtMTI0LDggKzEyNywxMCBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Jbml0KEhEQyBoCiAgICAgaWYgKCFTVUNDRUVERUQoaHIp
KQogICAgICAgICByZXR1cm47CiAKLSAgICBtX2RhdGEgPSBuZXcgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlKHJlbmRlclRhcmdldC5nZXQoKSwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5
cGU6OkdQVU1lbW9yeSk7CisgICAgYXV0byBvd25lZFBsYXRmb3JtQ29udGV4dCA9IHN0ZDo6bWFr
ZV91bmlxdWU8UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ+KHJlbmRlclRhcmdldC5nZXQoKSk7Cisg
ICAgbV9kYXRhID0gbmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZShXVEZNb3ZlKG93
bmVkUGxhdGZvcm1Db250ZXh0KSwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1lbW9y
eSk7CiAgICAgbV9kYXRhLT5tX2hkYyA9IGhkYzsKKwogICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29u
dGV4dCBzdGFydHMgaW4gc3luYyB3aXRoIG91ciBzdGF0ZS4KICAgICBzZXRQbGF0Zm9ybUZpbGxD
b2xvcihmaWxsQ29sb3IoKSk7CiAgICAgc2V0UGxhdGZvcm1TdHJva2VDb2xvcihzdHJva2VDb2xv
cigpKTsKQEAgLTEzMywxNyArMTM4LDE3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9y
bUluaXQoSERDIGgKICAgICAvLyBGSVhNRTogbV9zdGF0ZS5pbWFnZUludGVycG9sYXRpb25RdWFs
aXR5ID0gY29udmVydEludGVycG9sYXRpb25RdWFsaXR5KENHQ29udGV4dEdldEludGVycG9sYXRp
b25RdWFsaXR5KHBsYXRmb3JtQ29udGV4dCgpKSk7CiB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0
OjpwbGF0Zm9ybUluaXQoSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpwbGF0Zm9ybUluaXQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQqIHBsYXRm
b3JtQ29udGV4dCkKIHsKLSAgICBwbGF0Zm9ybUluaXQocmVuZGVyVGFyZ2V0LCBCaXRtYXBSZW5k
ZXJpbmdDb250ZXh0VHlwZTo6R1BVTWVtb3J5KTsKKyAgICBwbGF0Zm9ybUluaXQocGxhdGZvcm1D
b250ZXh0LCBCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZTo6R1BVTWVtb3J5KTsKIH0KIAotdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtSW5pdChJRDJEMVJlbmRlclRhcmdldCogcmVuZGVy
VGFyZ2V0LCBCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZSByZW5kZXJpbmdUeXBlKQordm9pZCBH
cmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtSW5pdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCogcGxh
dGZvcm1Db250ZXh0LCBCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZSByZW5kZXJpbmdUeXBlKQog
ewotICAgIGlmICghcmVuZGVyVGFyZ2V0KQorICAgIGlmICghcGxhdGZvcm1Db250ZXh0KQogICAg
ICAgICByZXR1cm47CiAKLSAgICBtX2RhdGEgPSBuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlKHJlbmRlclRhcmdldCwgcmVuZGVyaW5nVHlwZSk7CisgICAgbV9kYXRhID0gbmV3IEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgqcGxhdGZvcm1Db250ZXh0LCByZW5kZXJpbmdU
eXBlKTsKIAogICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBzdGFydHMgaW4gc3luYyB3aXRo
IG91ciBzdGF0ZS4KICAgICBzZXRQbGF0Zm9ybUZpbGxDb2xvcihmaWxsQ29sb3IoKSk7CkBAIC0x
NTcsMzAgKzE2MiwzNSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1EZXN0cm95KCkK
ICAgICBkZWxldGUgbV9kYXRhOwogfQogCi1JRDJEMVJlbmRlclRhcmdldCogR3JhcGhpY3NDb250
ZXh0OjpwbGF0Zm9ybUNvbnRleHQoKSBjb25zdAorUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQqIEdy
YXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Db250ZXh0KCkgY29uc3QKIHsKICAgICBBU1NFUlQoIXBh
aW50aW5nRGlzYWJsZWQoKSk7Ci0gICAgcmV0dXJuIG1fZGF0YS0+cmVuZGVyVGFyZ2V0KCk7Cisg
ICAgcmV0dXJuIG1fZGF0YS0+cGxhdGZvcm1Db250ZXh0KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzeW5jQ29udGV4dChQbGF0Zm9ybUNvbnRleHREaXJlY3Qy
RCYpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAogSUQyRDFSZW5kZXJUYXJnZXQqIEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cmVuZGVyVGFyZ2V0KCkKIHsKLSAgICBpZiAo
IW1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBtX3Ry
YW5zcGFyZW5jeUxheWVyU3RhY2subGFzdCgpLnJlbmRlclRhcmdldC5nZXQoKTsKKyAgICBpZiAo
IW1fcGxhdGZvcm1Db250ZXh0Lm1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiBtX3BsYXRmb3JtQ29udGV4dC5tX3RyYW5zcGFyZW5jeUxheWVyU3RhY2su
bGFzdCgpLnJlbmRlclRhcmdldC5nZXQoKTsKIAotICAgIHJldHVybiBtX3JlbmRlclRhcmdldC5n
ZXQoKTsKKyAgICByZXR1cm4gbV9wbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzZXRBbHBoYShmbG9hdCBhbHBo
YSkKIHsKLSAgICBBU1NFUlQobV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmlzRW1wdHkoKSk7Cisg
ICAgQVNTRVJUKG1fcGxhdGZvcm1Db250ZXh0Lm1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5pc0Vt
cHR5KCkpOwogICAgIG1fYWxwaGEgPSBhbHBoYTsKIH0KIAogZmxvYXQgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjpjdXJyZW50R2xvYmFsQWxwaGEoKSBjb25zdAogewotICAgIGlmICgh
bV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIG1fdHJh
bnNwYXJlbmN5TGF5ZXJTdGFjay5sYXN0KCkub3BhY2l0eTsKKyAgICBpZiAoIW1fcGxhdGZvcm1D
b250ZXh0Lm1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5pc0VtcHR5KCkpCisgICAgICAgIHJldHVy
biBtX3BsYXRmb3JtQ29udGV4dC5tX3RyYW5zcGFyZW5jeUxheWVyU3RhY2subGFzdCgpLm9wYWNp
dHk7CiAKICAgICByZXR1cm4gbV9hbHBoYTsKIH0KQEAgLTE5MCw5ICsyMDAsOCBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDo6c2F2ZVBsYXRmb3JtU3RhdGUoCiAgICAgQVNTRVJUKCFwYWludGluZ0Rp
c2FibGVkKCkpOwogICAgIEFTU0VSVCghbV9pbXBsKTsKIAotICAgIC8vIE5vdGU6IERvIG5vdCB1
c2UgdGhpcyBmdW5jdGlvbiB3aXRoaW4gdGhpcyBjbGFzcyBpbXBsZW1lbnRhdGlvbiwgc2luY2Ug
d2Ugd2FudCB0byBhdm9pZCB0aGUgZXh0cmEKLSAgICAvLyBzYXZlIG9mIHRoZSBzZWNvbmRhcnkg
Y29udGV4dCAoaW4gR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGlyZWN0MkQuaCkuCi0g
ICAgbV9kYXRhLT5zYXZlKCk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAg
ICBEaXJlY3QyRDo6c2F2ZSgqcGxhdGZvcm1Db250ZXh0KCkpOwogfQogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUoKQpAQCAtMjAwLDk3ICsyMDksMzEgQEAgdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0YQogICAgIEFTU0VSVCghcGFpbnRp
bmdEaXNhYmxlZCgpKTsKICAgICBBU1NFUlQoIW1faW1wbCk7CiAKLSAgICAvLyBOb3RlOiBEbyBu
b3QgdXNlIHRoaXMgZnVuY3Rpb24gd2l0aGluIHRoaXMgY2xhc3MgaW1wbGVtZW50YXRpb24sIHNp
bmNlIHdlIHdhbnQgdG8gYXZvaWQgdGhlIGV4dHJhCi0gICAgLy8gcmVzdG9yZSBvZiB0aGUgc2Vj
b25kYXJ5IGNvbnRleHQgKGluIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURpcmVjdDJE
LmgpLgotICAgIG1fZGF0YS0+cmVzdG9yZSgpOwotICAgIC8vIEZJWE1FOiBtX2RhdGEtPm1fdXNl
clRvRGV2aWNlVHJhbnNmb3JtS25vd25Ub0JlSWRlbnRpdHkgPSBmYWxzZTsKKyAgICBBU1NFUlQo
aGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpyZXN0b3JlKCpwbGF0Zm9ybUNv
bnRleHQoKSk7CiB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TmF0aXZlSW1hZ2UoY29u
c3QgQ09NUHRyPElXSUNCaXRtYXA+JiBpbWFnZSwgY29uc3QgRmxvYXRTaXplJiBpbWFnZVNpemUs
IGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgQ29t
cG9zaXRlT3BlcmF0b3Igb3AsIEJsZW5kTW9kZSBibGVuZE1vZGUsIEltYWdlT3JpZW50YXRpb24g
b3JpZW50YXRpb24pCi17Ci0gICAgQ09NUHRyPElEMkQxQml0bWFwPiBkZXZpY2VCaXRtYXA7Ci0g
ICAgSFJFU1VMVCBociA9IHBsYXRmb3JtQ29udGV4dCgpLT5DcmVhdGVCaXRtYXBGcm9tV2ljQml0
bWFwKGltYWdlLmdldCgpLCAmZGV2aWNlQml0bWFwKTsKLSAgICBpZiAoIVNVQ0NFRURFRChocikp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGRyYXdEZXZpY2VCaXRtYXAoZGV2aWNlQml0bWFwLCBp
bWFnZVNpemUsIGRlc3RSZWN0LCBzcmNSZWN0LCBvcCwgYmxlbmRNb2RlLCBvcmllbnRhdGlvbik7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3RGV2aWNlQml0bWFwKGNvbnN0IENPTVB0
cjxJRDJEMUJpdG1hcD4mIGltYWdlLCBjb25zdCBGbG9hdFNpemUmIGltYWdlU2l6ZSwgY29uc3Qg
RmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVP
cGVyYXRvciBvcCwgQmxlbmRNb2RlIGJsZW5kTW9kZSwgSW1hZ2VPcmllbnRhdGlvbiBvcmllbnRh
dGlvbikKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TmF0aXZlSW1hZ2UoY29uc3QgQ09NUHRy
PElXSUNCaXRtYXA+JiBpbWFnZSwgY29uc3QgRmxvYXRTaXplJiBpbWFnZVNpemUsIGNvbnN0IEZs
b2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3Bl
cmF0b3IgY29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSBibGVuZE1vZGUsIEltYWdlT3JpZW50
YXRpb24gb3JpZW50YXRpb24pCiB7CiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAg
ICAgcmV0dXJuOwogCiAgICAgaWYgKG1faW1wbCkgewotICAgICAgICAvLyBGSVhNRTogSW1wbGVt
ZW50IERpc3BsYXlMaXN0UmVjb3JkZXIgc3VwcG9ydCBmb3IgZHJhd05hdGl2ZUltYWdlLgotICAg
ICAgICAvLyBtX2Rpc3BsYXlMaXN0UmVjb3JkZXItPmRyYXdOYXRpdmVJbWFnZShpbWFnZSwgaW1h
Z2VTaXplLCBkZXN0UmVjdCwgc3JjUmVjdCwgb3AsIGJsZW5kTW9kZSwgb3JpZW50YXRpb24pOwot
ICAgICAgICBub3RJbXBsZW1lbnRlZCgpOworICAgICAgICBtX2ltcGwtPmRyYXdOYXRpdmVJbWFn
ZShpbWFnZSwgaW1hZ2VTaXplLCBkZXN0UmVjdCwgc3JjUmVjdCwgY29tcG9zaXRlT3BlcmF0b3Is
IGJsZW5kTW9kZSwgb3JpZW50YXRpb24pOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAg
YXV0byBiaXRtYXBTaXplID0gaW1hZ2UtPkdldFNpemUoKTsKLQotICAgIGZsb2F0IGN1cnJIZWln
aHQgPSBvcmllbnRhdGlvbi51c2VzV2lkdGhBc0hlaWdodCgpID8gYml0bWFwU2l6ZS53aWR0aCA6
IGJpdG1hcFNpemUuaGVpZ2h0OwotICAgIGlmIChjdXJySGVpZ2h0IDw9IHNyY1JlY3QueSgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsK
LQotICAgIEQyRDFfTUFUUklYXzNYMl9GIGN0bTsKLSAgICBjb250ZXh0LT5HZXRUcmFuc2Zvcm0o
JmN0bSk7Ci0KLSAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtKGN0bSk7Ci0KLSAgICBEMkRD
b250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCptX2RhdGEpOwotCi0gICAgYm9vbCBzaG91bGRV
c2VTdWJpbWFnZSA9IGZhbHNlOwotCi0gICAgLy8gSWYgdGhlIHNvdXJjZSByZWN0IGlzIGEgc3Vi
cG9ydGlvbiBvZiB0aGUgaW1hZ2UsIHRoZW4gd2UgY29tcHV0ZSBhbiBpbmZsYXRlZCBkZXN0aW5h
dGlvbiByZWN0IHRoYXQgd2lsbCBob2xkIHRoZSBlbnRpcmUgaW1hZ2UKLSAgICAvLyBhbmQgdGhl
biBzZXQgYSBjbGlwIHRvIHRoZSBwb3J0aW9uIHRoYXQgd2Ugd2FudCB0byBkaXNwbGF5LgotICAg
IEZsb2F0UmVjdCBhZGp1c3RlZERlc3RSZWN0ID0gZGVzdFJlY3Q7Ci0KLSAgICBpZiAoc3JjUmVj
dC5zaXplKCkgIT0gaW1hZ2VTaXplKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgaW1h
Z2Ugc2NhbGluZwotICAgICAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIH0KLQotICAgIC8vIElm
IHRoZSBpbWFnZSBpcyBvbmx5IHBhcnRpYWxseSBsb2FkZWQsIHRoZW4gc2hyaW5rIHRoZSBkZXN0
aW5hdGlvbiByZWN0IHRoYXQgd2UncmUgZHJhd2luZyBpbnRvIGFjY29yZGluZ2x5LgotICAgIGlm
ICghc2hvdWxkVXNlU3ViaW1hZ2UgJiYgY3VyckhlaWdodCA8IGltYWdlU2l6ZS5oZWlnaHQoKSkK
LSAgICAgICAgYWRqdXN0ZWREZXN0UmVjdC5zZXRIZWlnaHQoYWRqdXN0ZWREZXN0UmVjdC5oZWln
aHQoKSAqIGN1cnJIZWlnaHQgLyBpbWFnZVNpemUuaGVpZ2h0KCkpOwotCi0gICAgc2V0UGxhdGZv
cm1Db21wb3NpdGVPcGVyYXRpb24ob3AsIGJsZW5kTW9kZSk7Ci0KLSAgICAvLyBJbWFnZU9yaWVu
dGF0aW9uIGV4cGVjdHMgdGhlIG9yaWdpbiB0byBiZSBhdCAoMCwgMCkuCi0gICAgdHJhbnNmb3Jt
LnRyYW5zbGF0ZShhZGp1c3RlZERlc3RSZWN0LngoKSwgYWRqdXN0ZWREZXN0UmVjdC55KCkpOwot
ICAgIGNvbnRleHQtPlNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotICAgIGFkanVzdGVkRGVzdFJl
Y3Quc2V0TG9jYXRpb24oRmxvYXRQb2ludCgpKTsKLQotICAgIGlmIChvcmllbnRhdGlvbiAhPSBE
ZWZhdWx0SW1hZ2VPcmllbnRhdGlvbikgewotICAgICAgICB0aGlzLT5jb25jYXRDVE0ob3JpZW50
YXRpb24udHJhbnNmb3JtRnJvbURlZmF1bHQoYWRqdXN0ZWREZXN0UmVjdC5zaXplKCkpKTsKLSAg
ICAgICAgaWYgKG9yaWVudGF0aW9uLnVzZXNXaWR0aEFzSGVpZ2h0KCkpIHsKLSAgICAgICAgICAg
IC8vIFRoZSBkZXN0aW5hdGlvbiByZWN0IHdpbGwgaGF2ZSBpdCdzIHdpZHRoIGFuZCBoZWlnaHQg
YWxyZWFkeSByZXZlcnNlZCBmb3IgdGhlIG9yaWVudGF0aW9uIG9mCi0gICAgICAgICAgICAvLyB0
aGUgaW1hZ2UsIGFzIGl0IHdhcyBuZWVkZWQgZm9yIHBhZ2UgbGF5b3V0LCBzbyB3ZSBuZWVkIHRv
IHJldmVyc2UgaXQgYmFjayBoZXJlLgotICAgICAgICAgICAgYWRqdXN0ZWREZXN0UmVjdCA9IEZs
b2F0UmVjdChhZGp1c3RlZERlc3RSZWN0LngoKSwgYWRqdXN0ZWREZXN0UmVjdC55KCksIGFkanVz
dGVkRGVzdFJlY3QuaGVpZ2h0KCksIGFkanVzdGVkRGVzdFJlY3Qud2lkdGgoKSk7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKLQotICAgIGRy
YXdXaXRob3V0U2hhZG93KGFkanVzdGVkRGVzdFJlY3QsIFt0aGlzLCBpbWFnZSwgYWRqdXN0ZWRE
ZXN0UmVjdCwgc3JjUmVjdF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewotICAg
ICAgICByZW5kZXJUYXJnZXQtPkRyYXdCaXRtYXAoaW1hZ2UuZ2V0KCksIGFkanVzdGVkRGVzdFJl
Y3QsIDEuMGYsIEQyRDFfQklUTUFQX0lOVEVSUE9MQVRJT05fTU9ERV9MSU5FQVIsIHN0YXRpY19j
YXN0PEQyRDFfUkVDVF9GPihzcmNSZWN0KSk7Ci0gICAgfSk7Ci0KLSAgICBmbHVzaCgpOwotCi0g
ICAgaWYgKCFzdGF0ZVNhdmVyLmRpZFNhdmUoKSkKLSAgICAgICAgY29udGV4dC0+U2V0VHJhbnNm
b3JtKGN0bSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBz
dGF0ZSA9IHRoaXMtPnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmRyYXdOYXRpdmVJbWFnZSgqcGxh
dGZvcm1Db250ZXh0KCksIGltYWdlLmdldCgpLCBpbWFnZVNpemUsIGRlc3RSZWN0LCBzcmNSZWN0
LCBjb21wb3NpdGVPcGVyYXRvciwgYmxlbmRNb2RlLCBvcmllbnRhdGlvbiwgc3RhdGUuaW1hZ2VJ
bnRlcnBvbGF0aW9uUXVhbGl0eSwgc3RhdGUuYWxwaGEsIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShz
dGF0ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250ZXh0
KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQp
CiB7CiAgICAgYm9vbCBjcmVhdGVkQml0bWFwID0gbV9pbXBsIHx8ICFtX2RhdGEtPm1faGRjIHx8
IGlzSW5UcmFuc3BhcmVuY3lMYXllcigpOwogICAgIGlmICghY3JlYXRlZEJpdG1hcCkgewotICAg
ICAgICBtX2RhdGEtPnJlc3RvcmUoKTsKKyAgICAgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4
dCgpKTsKKyAgICAgICAgRGlyZWN0MkQ6OnJlc3RvcmUoKnBsYXRmb3JtQ29udGV4dCgpKTsKICAg
ICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMzA1LDEzICsyNDgsMTMgQEAgdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udAogICAgIGF1dG8gYml0bWFwUHJvcGVydGllcyA9
IEQyRDE6OkJpdG1hcFByb3BlcnRpZXMoRDJEMTo6UGl4ZWxGb3JtYXQoRFhHSV9GT1JNQVRfQjhH
OFI4QThfVU5PUk0sIEQyRDFfQUxQSEFfTU9ERV9QUkVNVUxUSVBMSUVEKSk7CiAKICAgICBDT01Q
dHI8SUQyRDFCaXRtYXA+IGJpdG1hcDsKLSAgICBIUkVTVUxUIGhyID0gcGxhdGZvcm1Db250ZXh0
KCktPkNyZWF0ZUJpdG1hcChwaXhlbERhdGEuc2l6ZSgpLCBwaXhlbERhdGEuYnVmZmVyKCksIHBp
eGVsRGF0YS5ieXRlc1BlclJvdygpLCAmYml0bWFwUHJvcGVydGllcywgJmJpdG1hcCk7CisgICAg
SFJFU1VMVCBociA9IHBsYXRmb3JtQ29udGV4dCgpLT5yZW5kZXJUYXJnZXQoKS0+Q3JlYXRlQml0
bWFwKHBpeGVsRGF0YS5zaXplKCksIHBpeGVsRGF0YS5idWZmZXIoKSwgcGl4ZWxEYXRhLmJ5dGVz
UGVyUm93KCksICZiaXRtYXBQcm9wZXJ0aWVzLCAmYml0bWFwKTsKICAgICBBU1NFUlQoU1VDQ0VF
REVEKGhyKSk7CiAKICAgICBEMkRDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCptX2RhdGEp
OwogCiAgICAgLy8gTm90ZTogVGhlIGNvbnRlbnQgaW4gdGhlIEhEQyBpcyBpbnZlcnRlZCBjb21w
YXJlZCB0byBEaXJlY3QyRCwgc28gaXQgbmVlZHMgdG8gYmUgZmxpcHBlZC4KLSAgICBhdXRvIGNv
bnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNv
bnRleHQoKS0+cmVuZGVyVGFyZ2V0KCk7CiAKICAgICBEMkQxX01BVFJJWF8zWDJfRiBjdXJyZW50
VHJhbnNmb3JtOwogICAgIGNvbnRleHQtPkdldFRyYW5zZm9ybSgmY3VycmVudFRyYW5zZm9ybSk7
CkBAIC0zNDMsMTE5ICsyODYsNzYgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdEb3RzRm9y
RG9jdW1lbgogewogfQogCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0LCBH
cmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlIHJlbmRlcmluZ1R5cGUp
Ci0gICAgOiBtX3JlbmRlclRhcmdldChyZW5kZXJUYXJnZXQpCitHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZShQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBHcmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRl
cmluZ0NvbnRleHRUeXBlIHJlbmRlcmluZ1R5cGUpCisgICAgOiBtX3BsYXRmb3JtQ29udGV4dChw
bGF0Zm9ybUNvbnRleHQpCiAgICAgLCBtX3JlbmRlcmVyVHlwZShyZW5kZXJpbmdUeXBlKQogewot
ICAgIGlmICghbV9yZW5kZXJUYXJnZXQpCisgICAgaWYgKCFtX3BsYXRmb3JtQ29udGV4dC5yZW5k
ZXJUYXJnZXQoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgaWYgKG1fcmVuZGVyZXJUeXBlID09
IEdyYXBoaWNzQ29udGV4dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSkK
ICAgICAgICAgYmVnaW5EcmF3KCk7CiB9CiAKLUdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZTo6fkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCitHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZShzdGQ6OnVuaXF1ZV9w
dHI8UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ+JiYgb3duZWRQbGF0Zm9ybUNvbnRleHQsIEdyYXBo
aWNzQ29udGV4dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUgcmVuZGVyaW5nVHlwZSkKKyAg
ICA6IG1fb3duZWRQbGF0Zm9ybUNvbnRleHQoV1RGTW92ZShvd25lZFBsYXRmb3JtQ29udGV4dCkp
CisgICAgLCBtX3BsYXRmb3JtQ29udGV4dCgqb3duZWRQbGF0Zm9ybUNvbnRleHQpCisgICAgLCBt
X3JlbmRlcmVyVHlwZShyZW5kZXJpbmdUeXBlKQogewotICAgIGlmICghbV9yZW5kZXJUYXJnZXQp
CisgICAgaWYgKCFtX3BsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKSkKICAgICAgICAgcmV0
dXJuOwogCi0gICAgaWYgKGJlZ2luRHJhd0NvdW50KQotICAgICAgICBlbmREcmF3KCk7CisgICAg
aWYgKG1fcmVuZGVyZXJUeXBlID09IEdyYXBoaWNzQ29udGV4dDo6Qml0bWFwUmVuZGVyaW5nQ29u
dGV4dFR5cGU6OkdQVU1lbW9yeSkKKyAgICAgICAgYmVnaW5EcmF3KCk7CiB9CiAKLUNPTVB0cjxJ
RDJEMVNvbGlkQ29sb3JCcnVzaD4gR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpicnVz
aFdpdGhDb2xvcihjb25zdCBEMkQxX0NPTE9SX0YmIGNvbG9yKQorR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlOjp+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCkKIHsKLSAgICBS
R0JBMzIgY29sb3JLZXkgPSBtYWtlUkdCQTMyRnJvbUZsb2F0cyhjb2xvci5yLCBjb2xvci5nLCBj
b2xvci5iLCBjb2xvci5hKTsKLQotICAgIGlmICghY29sb3JLZXkpIHsKLSAgICAgICAgaWYgKCFt
X3plcm9CcnVzaCkKLSAgICAgICAgICAgIG1fcmVuZGVyVGFyZ2V0LT5DcmVhdGVTb2xpZENvbG9y
QnJ1c2goY29sb3IsICZtX3plcm9CcnVzaCk7Ci0gICAgICAgIHJldHVybiBtX3plcm9CcnVzaDsK
LSAgICB9Ci0KLSAgICBpZiAoY29sb3JLZXkgPT0gMHhGRkZGRkZGRikgewotICAgICAgICBpZiAo
IW1fd2hpdGVCcnVzaCkKLSAgICAgICAgICAgIG1fcmVuZGVyVGFyZ2V0LT5DcmVhdGVTb2xpZENv
bG9yQnJ1c2goY29sb3IsICZtX3doaXRlQnJ1c2gpOwotICAgICAgICByZXR1cm4gbV93aGl0ZUJy
dXNoOwotICAgIH0KLQotICAgIGF1dG8gZXhpc3RpbmdCcnVzaCA9IG1fc29saWRDb2xvcmVkQnJ1
c2hDYWNoZS5lbnN1cmUoY29sb3JLZXksIFt0aGlzLCBjb2xvcl0gewotICAgICAgICBDT01QdHI8
SUQyRDFTb2xpZENvbG9yQnJ1c2g+IGNvbG9yQnJ1c2g7Ci0gICAgICAgIG1fcmVuZGVyVGFyZ2V0
LT5DcmVhdGVTb2xpZENvbG9yQnJ1c2goY29sb3IsICZjb2xvckJydXNoKTsKLSAgICAgICAgcmV0
dXJuIGNvbG9yQnJ1c2g7Ci0gICAgfSk7CisgICAgaWYgKCFtX3BsYXRmb3JtQ29udGV4dC5yZW5k
ZXJUYXJnZXQoKSkKKyAgICAgICAgcmV0dXJuOwogCi0gICAgcmV0dXJuIGV4aXN0aW5nQnJ1c2gu
aXRlcmF0b3ItPnZhbHVlOworICAgIGlmIChiZWdpbkRyYXdDb3VudCkKKyAgICAgICAgZW5kRHJh
dygpOwogfQogCiBJRDJEMVNvbGlkQ29sb3JCcnVzaCogR3JhcGhpY3NDb250ZXh0OjpicnVzaFdp
dGhDb2xvcihjb25zdCBDb2xvciYgY29sb3IpCiB7Ci0gICAgcmV0dXJuIG1fZGF0YS0+YnJ1c2hX
aXRoQ29sb3IoY29sb3JXaXRoR2xvYmFsQWxwaGEoY29sb3IpKS5nZXQoKTsKKyAgICBBU1NFUlQo
aGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIHJldHVybiBwbGF0Zm9ybUNvbnRleHQoKS0+YnJ1
c2hXaXRoQ29sb3IoY29sb3JXaXRoR2xvYmFsQWxwaGEoY29sb3IpKS5nZXQoKTsKIH0KIAogdm9p
ZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNsaXAoY29uc3QgRmxvYXRSZWN0JiBy
ZWN0KQogewotICAgIGlmIChtX3JlbmRlclN0YXRlcy5pc0VtcHR5KCkpCi0gICAgICAgIHNhdmUo
KTsKLQotICAgIG1fcmVuZGVyVGFyZ2V0LT5QdXNoQXhpc0FsaWduZWRDbGlwKHJlY3QsIEQyRDFf
QU5USUFMSUFTX01PREVfUEVSX1BSSU1JVElWRSk7Ci0gICAgbV9yZW5kZXJTdGF0ZXMubGFzdCgp
Lm1fY2xpcHMuYXBwZW5kKEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6QXhpc0FsaWdu
ZWRDbGlwKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNsaXAo
Y29uc3QgUGF0aCYgcGF0aCkKIHsKLSAgICBjbGlwKHBhdGgucGxhdGZvcm1QYXRoKCkpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChJRDJEMUdlb21ldHJ5
KiBwYXRoKQogewotICAgIEFTU0VSVChtX3JlbmRlclN0YXRlcy5zaXplKCkpOwotICAgIGlmICgh
bV9yZW5kZXJTdGF0ZXMuc2l6ZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBDT01QdHI8SUQy
RDFMYXllcj4gY2xpcExheWVyOwotICAgIEhSRVNVTFQgaHIgPSBtX3JlbmRlclRhcmdldC0+Q3Jl
YXRlTGF5ZXIoJmNsaXBMYXllcik7Ci0gICAgQVNTRVJUKFNVQ0NFRURFRChocikpOwotICAgIGlm
ICghU1VDQ0VFREVEKGhyKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9yZW5kZXJUYXJnZXQt
PlB1c2hMYXllcihEMkQxOjpMYXllclBhcmFtZXRlcnMoRDJEMTo6SW5maW5pdGVSZWN0KCksIHBh
dGgpLCBjbGlwTGF5ZXIuZ2V0KCkpOwotICAgIG1fcmVuZGVyU3RhdGVzLmxhc3QoKS5tX2NsaXBz
LmFwcGVuZChHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkxheWVyQ2xpcCk7Ci0gICAg
bV9yZW5kZXJTdGF0ZXMubGFzdCgpLm1fYWN0aXZlTGF5ZXIgPSBjbGlwTGF5ZXI7CiB9CiAKIHZv
aWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb25jYXRDVE0oY29uc3QgQWZmaW5l
VHJhbnNmb3JtJiBhZmZpbmVUcmFuc2Zvcm0pCiB7Ci0gICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0
LmdldCgpKTsKLQotICAgIEQyRDFfTUFUUklYXzNYMl9GIGN1cnJlbnRUcmFuc2Zvcm07Ci0gICAg
bV9yZW5kZXJUYXJnZXQtPkdldFRyYW5zZm9ybSgmY3VycmVudFRyYW5zZm9ybSk7Ci0KLSAgICBE
MkQxX01BVFJJWF8zWDJfRiB0cmFuc2Zvcm1Ub0NvbmNhdCA9IGFmZmluZVRyYW5zZm9ybTsKLSAg
ICBtX3JlbmRlclRhcmdldC0+U2V0VHJhbnNmb3JtKHRyYW5zZm9ybVRvQ29uY2F0ICogY3VycmVu
dFRyYW5zZm9ybSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpm
bHVzaCgpCiB7Ci0gICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgpKTsKLSAgICBEMkQxX1RB
RyBmaXJzdCwgc2Vjb25kOwotICAgIEhSRVNVTFQgaHIgPSBtX3JlbmRlclRhcmdldC0+Rmx1c2go
JmZpcnN0LCAmc2Vjb25kKTsKLQotICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6YmVnaW5EcmF3KCkKIHsK
LSAgICBBU1NFUlQobV9yZW5kZXJUYXJnZXQuZ2V0KCkpOwotICAgIG1fcmVuZGVyVGFyZ2V0LT5C
ZWdpbkRyYXcoKTsKKyAgICBBU1NFUlQobV9wbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkp
OworICAgIG1fcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5CZWdpbkRyYXcoKTsKICAg
ICArK2JlZ2luRHJhd0NvdW50OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6ZW5kRHJhdygpCiB7Ci0gICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgpKTsKKyAg
ICBBU1NFUlQobV9wbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpOwogICAgIEQyRDFfVEFH
IGZpcnN0LCBzZWNvbmQ7Ci0gICAgSFJFU1VMVCBociA9IG1fcmVuZGVyVGFyZ2V0LT5FbmREcmF3
KCZmaXJzdCwgJnNlY29uZCk7CisgICAgSFJFU1VMVCBociA9IG1fcGxhdGZvcm1Db250ZXh0LnJl
bmRlclRhcmdldCgpLT5FbmREcmF3KCZmaXJzdCwgJnNlY29uZCk7CiAKICAgICBpZiAoIVNVQ0NF
RURFRChocikpCiAgICAgICAgIFdURkxvZ0Fsd2F5cygiRmFpbGVkIGluIEdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZTo6ZW5kRHJhdzogaHI9JXhkLCBmaXJzdD0lbGQsIHNlY29uZD0lbGQi
LCBociwgZmlyc3QsIHNlY29uZCk7CkBAIC00NjUsNjggKzM2NSwyOCBAQCB2b2lkIEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6ZW5kCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjpyZXN0b3JlKCkKIHsKLSAgICBBU1NFUlQobV9yZW5kZXJUYXJnZXQuZ2V0KCkp
OwotCi0gICAgYXV0byByZXN0b3JlU3RhdGUgPSBtX3JlbmRlclN0YXRlcy50YWtlTGFzdCgpOwot
ICAgIG1fcmVuZGVyVGFyZ2V0LT5SZXN0b3JlRHJhd2luZ1N0YXRlKHJlc3RvcmVTdGF0ZS5tX2Ry
YXdpbmdTdGF0ZUJsb2NrLmdldCgpKTsKLQotICAgIGZvciAoYXV0byBjbGlwVHlwZSA9IHJlc3Rv
cmVTdGF0ZS5tX2NsaXBzLnJiZWdpbigpOyBjbGlwVHlwZSAhPSByZXN0b3JlU3RhdGUubV9jbGlw
cy5yZW5kKCk7ICsrY2xpcFR5cGUpIHsKLSAgICAgICAgaWYgKCpjbGlwVHlwZSA9PSBHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkF4aXNBbGlnbmVkQ2xpcCkKLSAgICAgICAgICAgIG1f
cmVuZGVyVGFyZ2V0LT5Qb3BBeGlzQWxpZ25lZENsaXAoKTsKLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgbV9yZW5kZXJUYXJnZXQtPlBvcExheWVyKCk7Ci0gICAgfQogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2F2ZSgpCiB7Ci0gICAgQVNTRVJUKG1fcmVuZGVy
VGFyZ2V0LmdldCgpKTsKLQotICAgIFJlbmRlclN0YXRlIGN1cnJlbnRTdGF0ZTsKLSAgICBHcmFw
aGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+Q3JlYXRlRHJhd2luZ1N0YXRlQmxvY2soJmN1
cnJlbnRTdGF0ZS5tX2RyYXdpbmdTdGF0ZUJsb2NrKTsKLQotICAgIG1fcmVuZGVyVGFyZ2V0LT5T
YXZlRHJhd2luZ1N0YXRlKGN1cnJlbnRTdGF0ZS5tX2RyYXdpbmdTdGF0ZUJsb2NrLmdldCgpKTsK
LQotICAgIG1fcmVuZGVyU3RhdGVzLmFwcGVuZChjdXJyZW50U3RhdGUpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXpl
KQogewotICAgIEFTU0VSVChtX3JlbmRlclRhcmdldC5nZXQoKSk7Ci0KLSAgICBEMkQxX01BVFJJ
WF8zWDJfRiBjdXJyZW50VHJhbnNmb3JtOwotICAgIG1fcmVuZGVyVGFyZ2V0LT5HZXRUcmFuc2Zv
cm0oJmN1cnJlbnRUcmFuc2Zvcm0pOwotCi0gICAgYXV0byBzY2FsZSA9IEQyRDE6Ok1hdHJpeDN4
MkY6OlNjYWxlKHNpemUpOwotICAgIG1fcmVuZGVyVGFyZ2V0LT5TZXRUcmFuc2Zvcm0oc2NhbGUg
KiBjdXJyZW50VHJhbnNmb3JtKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGU6OnNldENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKIHsKLSAgICBB
U1NFUlQobV9yZW5kZXJUYXJnZXQuZ2V0KCkpOwotICAgIG1fcmVuZGVyVGFyZ2V0LT5TZXRUcmFu
c2Zvcm0odHJhbnNmb3JtKTsKKyAgICBBU1NFUlQobV9wbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFy
Z2V0KCkpOworICAgIG1fcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5TZXRUcmFuc2Zv
cm0odHJhbnNmb3JtKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6
OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQogewotICAgIEFTU0VSVChtX3JlbmRlclRhcmdl
dC5nZXQoKSk7Ci0KLSAgICBEMkQxX01BVFJJWF8zWDJfRiBjdXJyZW50VHJhbnNmb3JtOwotICAg
IG1fcmVuZGVyVGFyZ2V0LT5HZXRUcmFuc2Zvcm0oJmN1cnJlbnRUcmFuc2Zvcm0pOwotCi0gICAg
YXV0byB0cmFuc2xhdGlvbiA9IEQyRDE6Ok1hdHJpeDN4MkY6OlRyYW5zbGF0aW9uKHgsIHkpOwot
ICAgIG1fcmVuZGVyVGFyZ2V0LT5TZXRUcmFuc2Zvcm0odHJhbnNsYXRpb24gKiBjdXJyZW50VHJh
bnNmb3JtKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnJvdGF0
ZShmbG9hdCBhbmdsZSkKIHsKLSAgICBBU1NFUlQobV9yZW5kZXJUYXJnZXQuZ2V0KCkpOwotCi0g
ICAgRDJEMV9NQVRSSVhfM1gyX0YgY3VycmVudFRyYW5zZm9ybTsKLSAgICBtX3JlbmRlclRhcmdl
dC0+R2V0VHJhbnNmb3JtKCZjdXJyZW50VHJhbnNmb3JtKTsKLQotICAgIGF1dG8gcm90YXRpb24g
PSBEMkQxOjpNYXRyaXgzeDJGOjpSb3RhdGlvbihyYWQyZGVnKGFuZ2xlKSk7Ci0gICAgbV9yZW5k
ZXJUYXJnZXQtPlNldFRyYW5zZm9ybShyb3RhdGlvbiAqIGN1cnJlbnRUcmFuc2Zvcm0pOwogfQog
CiBEMkQxX0NPTE9SX0YgR3JhcGhpY3NDb250ZXh0Ojpjb2xvcldpdGhHbG9iYWxBbHBoYShjb25z
dCBDb2xvciYgY29sb3IpIGNvbnN0CkBAIC01MzksMjIgKzM5OSwyMiBAQCBEMkQxX0NPTE9SX0Yg
R3JhcGhpY3NDb250ZXh0Ojpjb2xvcldpdGhHCiAKIElEMkQxQnJ1c2gqIEdyYXBoaWNzQ29udGV4
dDo6c29saWRTdHJva2VCcnVzaCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fZGF0YS0+bV9zb2xp
ZFN0cm9rZUJydXNoLmdldCgpOworICAgIHJldHVybiBwbGF0Zm9ybUNvbnRleHQoKS0+bV9zb2xp
ZFN0cm9rZUJydXNoLmdldCgpOwogfQogCiBJRDJEMUJydXNoKiBHcmFwaGljc0NvbnRleHQ6OnNv
bGlkRmlsbEJydXNoKCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV9kYXRhLT5tX3NvbGlkRmlsbEJy
dXNoLmdldCgpOworICAgIHJldHVybiBwbGF0Zm9ybUNvbnRleHQoKS0+bV9zb2xpZEZpbGxCcnVz
aC5nZXQoKTsKIH0KIAogSUQyRDFCcnVzaCogR3JhcGhpY3NDb250ZXh0OjpwYXR0ZXJuU3Ryb2tl
QnJ1c2goKSBjb25zdAogewotICAgIHJldHVybiBtX2RhdGEtPm1fcGF0dGVyblN0cm9rZUJydXNo
LmdldCgpOworICAgIHJldHVybiBwbGF0Zm9ybUNvbnRleHQoKS0+bV9wYXR0ZXJuU3Ryb2tlQnJ1
c2guZ2V0KCk7CiB9CiAKIElEMkQxQnJ1c2gqIEdyYXBoaWNzQ29udGV4dDo6cGF0dGVybkZpbGxC
cnVzaCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fZGF0YS0+bV9wYXR0ZXJuRmlsbEJydXNoLmdl
dCgpOworICAgIHJldHVybiBwbGF0Zm9ybUNvbnRleHQoKS0+bV9wYXR0ZXJuRmlsbEJydXNoLmdl
dCgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5EcmF3KCkKQEAgLTU2OSw3NSAr
NDI5LDIzIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjplbmREcmF3KCkKIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmZsdXNoKCkKIHsKLSAgICBtX2RhdGEtPmZsdXNoKCk7CisgICAgQVNTRVJUKGhh
c1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6Zmx1c2goKnBsYXRmb3JtQ29udGV4
dCgpKTsKIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdQYXR0ZXJuKEltYWdlJiBpbWFn
ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdCwg
Y29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3JtLCBjb25zdCBGbG9hdFBvaW50
JiBwaGFzZSwgY29uc3QgRmxvYXRTaXplJiBzcGFjaW5nLCBDb21wb3NpdGVPcGVyYXRvciBvcCwg
QmxlbmRNb2RlIGJsZW5kTW9kZSkKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3UGF0dGVybihJ
bWFnZSYgaW1hZ2UsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYg
dGlsZVJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5zZm9ybSwgY29uc3Qg
RmxvYXRQb2ludCYgcGhhc2UsIGNvbnN0IEZsb2F0U2l6ZSYgc3BhY2luZywgQ29tcG9zaXRlT3Bl
cmF0b3IgY29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSBibGVuZE1vZGUpCiB7CiAgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSB8fCAhcGF0dGVyblRyYW5zZm9ybS5pc0ludmVydGlibGUoKSkK
ICAgICAgICAgcmV0dXJuOwogCiAgICAgaWYgKG1faW1wbCkgewotICAgICAgICBtX2ltcGwtPmRy
YXdQYXR0ZXJuKGltYWdlLCBkZXN0UmVjdCwgdGlsZVJlY3QsIHBhdHRlcm5UcmFuc2Zvcm0sIHBo
YXNlLCBzcGFjaW5nLCBvcCwgYmxlbmRNb2RlKTsKKyAgICAgICAgbV9pbXBsLT5kcmF3UGF0dGVy
bihpbWFnZSwgZGVzdFJlY3QsIHRpbGVSZWN0LCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgc3Bh
Y2luZywgY29tcG9zaXRlT3BlcmF0b3IsIGJsZW5kTW9kZSk7CiAgICAgICAgIHJldHVybjsKICAg
ICB9CiAKLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLSAgICBEMkRDb250
ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCptX2RhdGEpOwotCi0gICAgbV9kYXRhLT5jbGlwKGRl
c3RSZWN0KTsKLQotICAgIHNldFBsYXRmb3JtQ29tcG9zaXRlT3BlcmF0aW9uKG9wLCBibGVuZE1v
ZGUpOwotCi0gICAgYXV0byBiaXRtYXBCcnVzaFByb3BlcnRpZXMgPSBEMkQxOjpCaXRtYXBCcnVz
aFByb3BlcnRpZXMoKTsKLSAgICBiaXRtYXBCcnVzaFByb3BlcnRpZXMuZXh0ZW5kTW9kZVggPSBE
MkQxX0VYVEVORF9NT0RFX1dSQVA7Ci0gICAgYml0bWFwQnJ1c2hQcm9wZXJ0aWVzLmV4dGVuZE1v
ZGVZID0gRDJEMV9FWFRFTkRfTU9ERV9XUkFQOwotCi0gICAgLy8gQ3JlYXRlIGEgYnJ1c2ggdHJh
bnNmb3JtYXRpb24gc28gd2UgcGFpbnQgdXNpbmcgdGhlIHNlY3Rpb24gb2YgdGhlIGltYWdlIHdl
IGNhcmUgYWJvdXQuCi0gICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybWF0aW9uID0gcGF0dGVy
blRyYW5zZm9ybTsKLSAgICB0cmFuc2Zvcm1hdGlvbi50cmFuc2xhdGUoZGVzdFJlY3QubG9jYXRp
b24oKSk7Ci0KLSAgICBhdXRvIGJydXNoUHJvcGVydGllcyA9IEQyRDE6OkJydXNoUHJvcGVydGll
cygpOwotICAgIGJydXNoUHJvcGVydGllcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1hdGlvbjsKLSAg
ICBicnVzaFByb3BlcnRpZXMub3BhY2l0eSA9IDEuMGY7Ci0KLSAgICBhdXRvIHRpbGVJbWFnZSA9
IGltYWdlLm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7Ci0KLSAgICAvLyBJZiB3ZSBvbmx5
IHdhbnQgYSBzdWJzZXQgb2YgdGhlIGJpdG1hcCwgd2UgbmVlZCB0byBjcmVhdGUgYSBjcm9wcGVk
IGJpdG1hcCBpbWFnZS4gQWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudGF0aW9uLAotICAgIC8vIHRo
aXMgZG9lcyBub3QgYWxsb2NhdGUgbmV3IGJpdG1hcCBtZW1vcnkuCi0gICAgaWYgKGltYWdlLndp
ZHRoKCkgPiBkZXN0UmVjdC53aWR0aCgpIHx8IGltYWdlLmhlaWdodCgpID4gZGVzdFJlY3QuaGVp
Z2h0KCkpIHsKLSAgICAgICAgQVNTRVJUKDApOwotICAgICAgICAvKgotICAgICAgICBmbG9hdCBk
cGlYID0gMDsKLSAgICAgICAgZmxvYXQgZHBpWSA9IDA7Ci0gICAgICAgIHRpbGVJbWFnZS0+R2V0
RHBpKCZkcGlYLCAmZHBpWSk7Ci0gICAgICAgIGF1dG8gYml0bWFwUHJvcGVydGllcyA9IEQyRDE6
OkJpdG1hcFByb3BlcnRpZXModGlsZUltYWdlLT5HZXRQaXhlbEZvcm1hdCgpLCBkcGlYLCBkcGlZ
KTsKLSAgICAgICAgQ09NUHRyPElEMkQxQml0bWFwPiBzdWJJbWFnZTsKLSAgICAgICAgSFJFU1VM
VCBociA9IGNvbnRleHQtPkNyZWF0ZUJpdG1hcChJbnRTaXplKHRpbGVSZWN0LnNpemUoKSksIGJp
dG1hcFByb3BlcnRpZXMsICZzdWJJbWFnZSk7Ci0gICAgICAgIGlmIChTVUNDRUVERUQoaHIpKSB7
Ci0gICAgICAgICAgICBEMkQxX1JFQ1RfVSBmaW5pc2hSZWN0ID0gSW50UmVjdCh0aWxlUmVjdCk7
Ci0gICAgICAgICAgICBociA9IHN1YkltYWdlLT5Db3B5RnJvbUJpdG1hcChudWxscHRyLCB0aWxl
SW1hZ2UuZ2V0KCksICZmaW5pc2hSZWN0KTsKLSAgICAgICAgICAgIGlmIChTVUNDRUVERUQoaHIp
KQotICAgICAgICAgICAgICAgIHRpbGVJbWFnZSA9IHN1YkltYWdlOwotICAgICAgICB9Ci0gICAg
ICAgICovCi0gICAgfQotCi0gICAgQ09NUHRyPElEMkQxQml0bWFwPiBiaXRtYXA7Ci0gICAgSFJF
U1VMVCBociA9IGNvbnRleHQtPkNyZWF0ZUJpdG1hcEZyb21XaWNCaXRtYXAodGlsZUltYWdlLmdl
dCgpLCBudWxscHRyLCAmYml0bWFwKTsKLSAgICBpZiAoIVNVQ0NFRURFRChocikpCi0gICAgICAg
IHJldHVybjsKLQotICAgIENPTVB0cjxJRDJEMUJpdG1hcEJydXNoPiBwYXR0ZXJuQnJ1c2g7Ci0g
ICAgaHIgPSBjb250ZXh0LT5DcmVhdGVCaXRtYXBCcnVzaChiaXRtYXAuZ2V0KCksICZiaXRtYXBC
cnVzaFByb3BlcnRpZXMsICZicnVzaFByb3BlcnRpZXMsICZwYXR0ZXJuQnJ1c2gpOwotICAgIEFT
U0VSVChTVUNDRUVERUQoaHIpKTsKLSAgICBpZiAoIVNVQ0NFRURFRChocikpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIGRyYXdXaXRob3V0U2hhZG93KGRlc3RSZWN0LCBbdGhpcywgZGVzdFJlY3Qs
IHBhdHRlcm5CcnVzaF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewotICAgICAg
ICBjb25zdCBEMkQxX1JFQ1RfRiBkMmRSZWN0ID0gZGVzdFJlY3Q7Ci0gICAgICAgIHJlbmRlclRh
cmdldC0+RmlsbFJlY3RhbmdsZSgmZDJkUmVjdCwgcGF0dGVybkJydXNoLmdldCgpKTsKLSAgICB9
KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGlmIChhdXRvIHRpbGVJ
bWFnZSA9IGltYWdlLm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCkpCisgICAgICAgIERpcmVj
dDJEOjpkcmF3UGF0dGVybigqcGxhdGZvcm1Db250ZXh0KCksIHRpbGVJbWFnZS5nZXQoKSwgSW50
U2l6ZShpbWFnZS5zaXplKCkpLCBkZXN0UmVjdCwgdGlsZVJlY3QsIHBhdHRlcm5UcmFuc2Zvcm0s
IHBoYXNlLCBjb21wb3NpdGVPcGVyYXRvciwgYmxlbmRNb2RlKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmNsaXBUb0ltYWdlQnVmZmVyKEltYWdlQnVmZmVyJiBidWZmZXIsIGNvbnN0IEZs
b2F0UmVjdCYgZGVzdFJlY3QpCkBAIC02NjAsMTcyICs0NjgsNjMgQEAgdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmRyYXdSZWN0KGNvbnN0IEZsbwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAg
Ly8gRklYTUU6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIHBhdHRlcm5zIGFuZCBncmFk
aWVudHMgbGlrZSBkcmF3UGF0aCBkb2VzLCBpdCBwcm9iYWJseSBzaG91bGQuCiAgICAgQVNTRVJU
KCFyZWN0LmlzRW1wdHkoKSk7Ci0KLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQo
KTsKLQotICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotCi0gICAgZHJhd1dpdGhv
dXRTaGFkb3cocmVjdCwgW3RoaXMsIHJlY3RdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJn
ZXQpIHsKLSAgICAgICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9IHJlY3Q7Ci0gICAgICAg
IHJlbmRlclRhcmdldC0+RmlsbFJlY3RhbmdsZSgmZDJkUmVjdCwgc29saWRGaWxsQnJ1c2goKSk7
Ci0gICAgICAgIHJlbmRlclRhcmdldC0+RHJhd1JlY3RhbmdsZSgmZDJkUmVjdCwgc29saWRTdHJv
a2VCcnVzaCgpLCBzdHJva2VUaGlja25lc3MoKSwgbV9kYXRhLT5zdHJva2VTdHlsZSgpKTsKLSAg
ICB9KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1dG8mIHN0YXRl
ID0gdGhpcy0+c3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZHJhd1JlY3QoKnBsYXRmb3JtQ29udGV4
dCgpLCByZWN0LCBib3JkZXJUaGlja25lc3MsIHN0YXRlLmZpbGxDb2xvciwgc3RhdGUuc3Ryb2tl
U3R5bGUsIHN0YXRlLnN0cm9rZUNvbG9yKTsKIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OnNldExpbmVDYXAoTGluZUNhcCBjYXApCit2b2lkIEdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZTo6c2V0TGluZUNhcChMaW5lQ2FwKQogewotICAgIGlmIChtX2xpbmVD
YXAgPT0gY2FwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBEMkQxX0NBUF9TVFlMRSBjYXBTdHls
ZSA9IEQyRDFfQ0FQX1NUWUxFX0ZMQVQ7Ci0gICAgc3dpdGNoIChjYXApIHsKLSAgICBjYXNlIFJv
dW5kQ2FwOgotICAgICAgICBjYXBTdHlsZSA9IEQyRDFfQ0FQX1NUWUxFX1JPVU5EOwotICAgICAg
ICBicmVhazsKLSAgICBjYXNlIFNxdWFyZUNhcDoKLSAgICAgICAgY2FwU3R5bGUgPSBEMkQxX0NB
UF9TVFlMRV9TUVVBUkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQnV0dENhcDoKLSAgICBk
ZWZhdWx0OgotICAgICAgICBjYXBTdHlsZSA9IEQyRDFfQ0FQX1NUWUxFX0ZMQVQ7Ci0gICAgICAg
IGJyZWFrOwotICAgIH0KLQotICAgIG1fbGluZUNhcCA9IGNhcFN0eWxlOwotICAgIG1fc3Ryb2tl
U3lsZUlzRGlydHkgPSB0cnVlOwogfQogCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6c2V0TGluZUpvaW4oTGluZUpvaW4gam9pbikKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlOjpzZXRMaW5lSm9pbihMaW5lSm9pbikKIHsKLSAgICBpZiAobV9saW5lSm9p
biA9PSBqb2luKQotICAgICAgICByZXR1cm47Ci0KLSAgICBEMkQxX0xJTkVfSk9JTiBqb2luU3R5
bGUgPSBEMkQxX0xJTkVfSk9JTl9NSVRFUjsKLSAgICBzd2l0Y2ggKGpvaW4pIHsKLSAgICBjYXNl
IFJvdW5kSm9pbjoKLSAgICAgICAgam9pblN0eWxlID0gRDJEMV9MSU5FX0pPSU5fUk9VTkQ7Ci0g
ICAgICAgIGJyZWFrOwotICAgIGNhc2UgQmV2ZWxKb2luOgotICAgICAgICBqb2luU3R5bGUgPSBE
MkQxX0xJTkVfSk9JTl9CRVZFTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNaXRlckpvaW46
Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgam9pblN0eWxlID0gRDJEMV9MSU5FX0pPSU5fTUlURVI7
Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIG1fbGluZUpvaW4gPSBqb2luU3R5bGU7Ci0g
ICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7CiB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjpzZXRTdHJva2VTdHlsZShTdHJva2VTdHlsZSBzdHJva2VTdHlsZSkK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzZXRTdHJva2VTdHlsZShTdHJv
a2VTdHlsZSkKIHsKLSAgICBpZiAobV9zdHJva2VTdHlsZSA9PSBzdHJva2VTdHlsZSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgbV9zdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlOwotICAgIG1fc3Ry
b2tlU3lsZUlzRGlydHkgPSB0cnVlOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZTo6c2V0TWl0ZXJMaW1pdChmbG9hdCBjYW52YXNNaXRlckxpbWl0KQogewotICAgIC8v
IERpcmVjdDJEIG1pdGVyIGxpbWl0IGlzIGluIHRlcm1zIG9mIEhBTEYgdGhlIGxpbmUgdGhpY2tu
ZXNzLgotICAgIGZsb2F0IG1pdGVyTGltaXQgPSAwLjVmICogY2FudmFzTWl0ZXJMaW1pdDsKLSAg
ICBpZiAoV1RGOjphcmVFc3NlbnRpYWxseUVxdWFsKG1pdGVyTGltaXQsIG1fbWl0ZXJMaW1pdCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIG1fbWl0ZXJMaW1pdCA9IG1pdGVyTGltaXQ7Ci0gICAg
bV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7CisgICAgbV9wbGF0Zm9ybUNvbnRleHQuc2V0RGFz
aE9mZnNldChjYW52YXNNaXRlckxpbWl0KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OnNldERhc2hPZmZzZXQoZmxvYXQgZGFzaE9mZnNldCkKIHsKLSAgICBpZiAo
V1RGOjphcmVFc3NlbnRpYWxseUVxdWFsKGRhc2hPZmZzZXQsIG1fZGFzaE9mZnNldCkpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIG1fZGFzaE9mZnNldCA9IGRhc2hPZmZzZXQ7Ci0gICAgbV9zdHJv
a2VTeWxlSXNEaXJ0eSA9IHRydWU7CisgICAgbV9wbGF0Zm9ybUNvbnRleHQuc2V0RGFzaE9mZnNl
dChkYXNoT2Zmc2V0KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6
OnNldFBhdHRlcm5XaWR0aChmbG9hdCBwYXR0ZXJuV2lkdGgpCiB7Ci0gICAgaWYgKFdURjo6YXJl
RXNzZW50aWFsbHlFcXVhbChwYXR0ZXJuV2lkdGgsIG1fcGF0dGVybldpZHRoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgbV9wYXR0ZXJuV2lkdGggPSBwYXR0ZXJuV2lkdGg7Ci0gICAgbV9zdHJv
a2VTeWxlSXNEaXJ0eSA9IHRydWU7CisgICAgbV9wbGF0Zm9ybUNvbnRleHQuc2V0UGF0dGVybldp
ZHRoKHBhdHRlcm5XaWR0aCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlOjpzZXRQYXR0ZXJuT2Zmc2V0KGZsb2F0IHBhdHRlcm5PZmZzZXQpCiB7Ci0gICAgaWYgKFdU
Rjo6YXJlRXNzZW50aWFsbHlFcXVhbChwYXR0ZXJuT2Zmc2V0LCBtX3BhdHRlcm5PZmZzZXQpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBtX3BhdHRlcm5PZmZzZXQgPSBwYXR0ZXJuT2Zmc2V0Owot
ICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworICAgIG1fcGxhdGZvcm1Db250ZXh0LnNl
dFBhdHRlcm5PZmZzZXQocGF0dGVybk9mZnNldCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjpzZXRTdHJva2VUaGlja25lc3MoZmxvYXQgdGhpY2tuZXNzKQogewot
ICAgIGlmIChXVEY6OmFyZUVzc2VudGlhbGx5RXF1YWwodGhpY2tuZXNzLCBtX3N0cm9rZVRoaWNr
bmVzcykpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fc3Ryb2tlVGhpY2tuZXNzID0gdGhpY2tu
ZXNzOwotICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworICAgIG1fcGxhdGZvcm1Db250
ZXh0LnNldFN0cm9rZVRoaWNrbmVzcyh0aGlja25lc3MpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2V0RGFzaGVzKGNvbnN0IERhc2hBcnJheSYgZGFzaGVzKQog
ewotICAgIGlmIChtX2Rhc2hlcyA9PSBkYXNoZXMpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1f
ZGFzaGVzID0gZGFzaGVzOwotICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworICAgIG1f
cGxhdGZvcm1Db250ZXh0LnNldERhc2hlcyhkYXNoZXMpOwogfQogCiBEMkQxX1NUUk9LRV9TVFlM
RV9QUk9QRVJUSUVTIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c3Ryb2tlU3R5bGVQ
cm9wZXJ0aWVzKCkgY29uc3QKIHsKLSAgICByZXR1cm4gRDJEMTo6U3Ryb2tlU3R5bGVQcm9wZXJ0
aWVzKG1fbGluZUNhcCwgbV9saW5lQ2FwLCBtX2xpbmVDYXAsIG1fbGluZUpvaW4sIG1fbWl0ZXJM
aW1pdCwgRDJEMV9EQVNIX1NUWUxFX1NPTElELCAwLjBmKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGU6OnJlY29tcHV0ZVN0cm9rZVN0eWxlKCkKLXsKLSAgICBpZiAo
IW1fc3Ryb2tlU3lsZUlzRGlydHkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fZDJkU3Ryb2tl
U3R5bGUgPSBudWxscHRyOwotCi0gICAgRGFzaEFycmF5IGRhc2hlczsKLSAgICBmbG9hdCBwYXR0
ZXJuT2Zmc2V0ID0gMDsKLSAgICBhdXRvIGRhc2hTdHlsZSA9IEQyRDFfREFTSF9TVFlMRV9TT0xJ
RDsKLQotICAgIGlmICgobV9zdHJva2VTdHlsZSAhPSBTb2xpZFN0cm9rZSkgJiYgKG1fc3Ryb2tl
U3R5bGUgIT0gTm9TdHJva2UpKSB7Ci0gICAgICAgIGRhc2hTdHlsZSA9IEQyRDFfREFTSF9TVFlM
RV9DVVNUT007Ci0gICAgICAgIHBhdHRlcm5PZmZzZXQgPSBtX3BhdHRlcm5PZmZzZXQgLyBtX3N0
cm9rZVRoaWNrbmVzczsKLSAgICAgICAgZGFzaGVzID0gbV9kYXNoZXM7Ci0KLSAgICAgICAgLy8g
SW4gRGlyZWN0MkQsIGRhc2hlcyBhbmQgZG90cyBhcmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiB0aGUg
cmF0aW8gb2YgdGhlIGRhc2ggbGVuZ3RoIHRvIHRoZSBsaW5lIHRoaWNrbmVzcy4KLSAgICAgICAg
Zm9yIChhdXRvJiBkYXNoIDogZGFzaGVzKQotICAgICAgICAgICAgZGFzaCAvPSBtX3N0cm9rZVRo
aWNrbmVzczsKLSAgICB9Ci0KLSAgICBhdXRvIHN0cm9rZVN0eWxlUHJvcGVydGllcyA9IEQyRDE6
OlN0cm9rZVN0eWxlUHJvcGVydGllcyhtX2xpbmVDYXAsIG1fbGluZUNhcCwgbV9saW5lQ2FwLCBt
X2xpbmVKb2luLCBtX21pdGVyTGltaXQsIGRhc2hTdHlsZSwgcGF0dGVybk9mZnNldCk7Ci0gICAg
R3JhcGhpY3NDb250ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0ZVN0cm9rZVN0eWxlKCZzdHJv
a2VTdHlsZVByb3BlcnRpZXMsIGRhc2hlcy5kYXRhKCksIGRhc2hlcy5zaXplKCksICZtX2QyZFN0
cm9rZVN0eWxlKTsKLQotICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSBmYWxzZTsKLX0KLQotSUQy
RDFTdHJva2VTdHlsZSogR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzdHJva2VTdHls
ZSgpCi17Ci0gICAgcmVjb21wdXRlU3Ryb2tlU3R5bGUoKTsKLSAgICByZXR1cm4gbV9kMmRTdHJv
a2VTdHlsZS5nZXQoKTsKKyAgICByZXR1cm4gRDJEMTo6U3Ryb2tlU3R5bGVQcm9wZXJ0aWVzKG1f
cGxhdGZvcm1Db250ZXh0Lm1fbGluZUNhcCwgbV9wbGF0Zm9ybUNvbnRleHQubV9saW5lQ2FwLCBt
X3BsYXRmb3JtQ29udGV4dC5tX2xpbmVDYXAsIG1fcGxhdGZvcm1Db250ZXh0Lm1fbGluZUpvaW4s
IG1fcGxhdGZvcm1Db250ZXh0Lm1fbWl0ZXJMaW1pdCwgRDJEMV9EQVNIX1NUWUxFX1NPTElELCAw
LjBmKTsKIH0KIAogSUQyRDFTdHJva2VTdHlsZSogR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybVN0
cm9rZVN0eWxlKCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV9kYXRhLT5zdHJva2VTdHlsZSgpOwor
ICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgcmV0dXJuIHBsYXRmb3JtQ29u
dGV4dCgpLT5zdHJva2VTdHlsZSgpOwogfQogCiAvLyBUaGlzIGlzIG9ubHkgdXNlZCB0byBkcmF3
IGJvcmRlcnMuCkBAIC04NDIsNTIgKzU0MSw5IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3
TGluZShjb25zdCBGbG8KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGZsb2F0IHRoaWNr
bmVzcyA9IHN0cm9rZVRoaWNrbmVzcygpOwotICAgIGJvb2wgaXNWZXJ0aWNhbExpbmUgPSAocG9p
bnQxLngoKSArIHRoaWNrbmVzcyA9PSBwb2ludDIueCgpKTsKLSAgICBmbG9hdCBzdHJva2VXaWR0
aCA9IGlzVmVydGljYWxMaW5lID8gcG9pbnQyLnkoKSAtIHBvaW50MS55KCkgOiBwb2ludDIueCgp
IC0gcG9pbnQxLngoKTsKLSAgICBpZiAoIXRoaWNrbmVzcyB8fCAhc3Ryb2tlV2lkdGgpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotCi0g
ICAgU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUgPSB0aGlzLT5zdHJva2VTdHlsZSgpOwotICAgIGZs
b2F0IGNvcm5lcldpZHRoID0gMDsKLSAgICBib29sIGRyYXdzRGFzaGVkTGluZSA9IHN0cm9rZVN0
eWxlID09IERvdHRlZFN0cm9rZSB8fCBzdHJva2VTdHlsZSA9PSBEYXNoZWRTdHJva2U7Ci0KLSAg
ICBDT01QdHI8SUQyRDFTdHJva2VTdHlsZT4gZDJkU3Ryb2tlU3R5bGU7Ci0gICAgRDJEQ29udGV4
dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqbV9kYXRhLCBkcmF3c0Rhc2hlZExpbmUpOwotICAgIGlm
IChkcmF3c0Rhc2hlZExpbmUpIHsKLSAgICAgICAgLy8gRmlndXJlIG91dCBlbmQgcG9pbnRzIHRv
IGVuc3VyZSB3ZSBhbHdheXMgcGFpbnQgY29ybmVycy4KLSAgICAgICAgY29ybmVyV2lkdGggPSBk
YXNoZWRMaW5lQ29ybmVyV2lkdGhGb3JTdHJva2VXaWR0aChzdHJva2VXaWR0aCk7Ci0gICAgICAg
IHN0cm9rZVdpZHRoIC09IDIgKiBjb3JuZXJXaWR0aDsKLSAgICAgICAgZmxvYXQgcGF0dGVybldp
ZHRoID0gZGFzaGVkTGluZVBhdHRlcm5XaWR0aEZvclN0cm9rZVdpZHRoKHN0cm9rZVdpZHRoKTsK
LSAgICAgICAgLy8gQ2hlY2sgaWYgY29ybmVyIGRyYXdpbmcgc3VmZmljaWVudGx5IGNvdmVycyB0
aGUgbGluZS4KLSAgICAgICAgaWYgKHN0cm9rZVdpZHRoIDw9IHBhdHRlcm5XaWR0aCArIDEpCi0g
ICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgZmxvYXQgcGF0dGVybk9mZnNldCA9IGRhc2hl
ZExpbmVQYXR0ZXJuT2Zmc2V0Rm9yUGF0dGVybkFuZFN0cm9rZVdpZHRoKHBhdHRlcm5XaWR0aCwg
c3Ryb2tlV2lkdGgpOwotICAgICAgICBjb25zdCBmbG9hdCBkYXNoZXNbMl0gPSB7IHBhdHRlcm5X
aWR0aCwgcGF0dGVybldpZHRoIH07Ci0gICAgICAgIGF1dG8gc3Ryb2tlU3R5bGVQcm9wZXJ0aWVz
ID0gbV9kYXRhLT5zdHJva2VTdHlsZVByb3BlcnRpZXMoKTsKLSAgICAgICAgR3JhcGhpY3NDb250
ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0ZVN0cm9rZVN0eWxlKCZzdHJva2VTdHlsZVByb3Bl
cnRpZXMsIGRhc2hlcywgQVJSQVlTSVpFKGRhc2hlcyksICZkMmRTdHJva2VTdHlsZSk7Ci0KLSAg
ICAgICAgbV9kYXRhLT5zZXRQYXR0ZXJuV2lkdGgocGF0dGVybldpZHRoKTsKLSAgICAgICAgbV9k
YXRhLT5zZXRQYXR0ZXJuT2Zmc2V0KHBhdHRlcm5PZmZzZXQpOwotICAgICAgICBtX2RhdGEtPnNl
dERhc2hlcyhEYXNoQXJyYXkoMiwgcGF0dGVybldpZHRoKSk7Ci0KLSAgICAgICAgZDJkU3Ryb2tl
U3R5bGUgPSBtX2RhdGEtPnN0cm9rZVN0eWxlKCk7Ci0gICAgfQotCi0gICAgYXV0byBjZW50ZXJl
ZFBvaW50cyA9IGNlbnRlckxpbmVBbmRDdXRPZmZDb3JuZXJzKGlzVmVydGljYWxMaW5lLCBjb3Ju
ZXJXaWR0aCwgcG9pbnQxLCBwb2ludDIpOwotICAgIGF1dG8gcDEgPSBjZW50ZXJlZFBvaW50c1sw
XTsKLSAgICBhdXRvIHAyID0gY2VudGVyZWRQb2ludHNbMV07Ci0KLSAgICBjb250ZXh0LT5TZXRU
YWdzKDEsIF9fTElORV9fKTsKLQotICAgIEZsb2F0UmVjdCBib3VuZGluZ1JlY3QocDEsIHAyKTsK
LQotICAgIGRyYXdXaXRob3V0U2hhZG93KGJvdW5kaW5nUmVjdCwgW3RoaXMsIHAxLCBwMiwgZDJk
U3Ryb2tlU3R5bGVdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAg
cmVuZGVyVGFyZ2V0LT5EcmF3TGluZShwMSwgcDIsIHNvbGlkU3Ryb2tlQnJ1c2goKSwgc3Ryb2tl
VGhpY2tuZXNzKCksIGQyZFN0cm9rZVN0eWxlLmdldCgpKTsKLSAgICB9KTsKKyAgICBBU1NFUlQo
aGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1dG8mIHN0YXRlID0gdGhpcy0+c3RhdGUoKTsK
KyAgICBEaXJlY3QyRDo6ZHJhd0xpbmUoKnBsYXRmb3JtQ29udGV4dCgpLCBwb2ludDEsIHBvaW50
Miwgc3RhdGUuc3Ryb2tlU3R5bGUsIHN0YXRlLnN0cm9rZUNvbG9yLCBzdGF0ZS5zdHJva2VUaGlj
a25lc3MsIHN0YXRlLnNob3VsZEFudGlhbGlhcyk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
OjpkcmF3RWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHJlY3QpCkBAIC05MDAsMTcgKzU1NiwxMCBA
QCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0VsbGlwc2UoY29uc3QKICAgICAgICAgcmV0dXJu
OwogICAgIH0KIAotICAgIGF1dG8gZWxsaXBzZSA9IEQyRDE6OkVsbGlwc2UocmVjdC5jZW50ZXIo
KSwgMC41ICogcmVjdC53aWR0aCgpLCAwLjUgKiByZWN0LmhlaWdodCgpKTsKIAotICAgIGF1dG8g
Y29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgY29udGV4dC0+U2V0VGFncygxLCBf
X0xJTkVfXyk7Ci0KLSAgICBkcmF3V2l0aG91dFNoYWRvdyhyZWN0LCBbdGhpcywgZWxsaXBzZV0o
SUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewotICAgICAgICByZW5kZXJUYXJnZXQt
PkZpbGxFbGxpcHNlKCZlbGxpcHNlLCBzb2xpZEZpbGxCcnVzaCgpKTsKLQotICAgICAgICByZW5k
ZXJUYXJnZXQtPkRyYXdFbGxpcHNlKCZlbGxpcHNlLCBzb2xpZFN0cm9rZUJydXNoKCksIHN0cm9r
ZVRoaWNrbmVzcygpLCBtX2RhdGEtPnN0cm9rZVN0eWxlKCkpOwotICAgIH0pOworICAgIEFTU0VS
VChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgYXV0byYgc3RhdGUgPSB0aGlzLT5zdGF0ZSgp
OworICAgIERpcmVjdDJEOjpmaWxsRWxsaXBzZSgqcGxhdGZvcm1Db250ZXh0KCksIHJlY3QsIHN0
YXRlLmZpbGxDb2xvciwgc3RhdGUuc3Ryb2tlU3R5bGUsIHN0YXRlLnN0cm9rZUNvbG9yLCBzdGF0
ZS5zdHJva2VUaGlja25lc3MpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6YXBwbHlTdHJv
a2VQYXR0ZXJuKCkKQEAgLTkyMiw3ICs1NzEsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6YXBw
bHlTdHJva2VQYXR0ZXJuCiAgICAgQWZmaW5lVHJhbnNmb3JtIHVzZXJUb0Jhc2VDVE07IC8vIEZJ
WE1FOiBUaGlzIGlzbid0IHJlYWxseSBuZWVkZWQgb24gV2luZG93cwogCiAgICAgY29uc3QgZmxv
YXQgcGF0dGVybkFscGhhID0gMTsKLSAgICBtX2RhdGEtPm1fcGF0dGVyblN0cm9rZUJydXNoID0g
YWRvcHRDT00obV9zdGF0ZS5zdHJva2VQYXR0ZXJuLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oKnRo
aXMsIHBhdHRlcm5BbHBoYSwgdXNlclRvQmFzZUNUTSkpOworICAgIHBsYXRmb3JtQ29udGV4dCgp
LT5tX3BhdHRlcm5TdHJva2VCcnVzaCA9IGFkb3B0Q09NKG1fc3RhdGUuc3Ryb2tlUGF0dGVybi0+
Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKCp0aGlzLCBwYXR0ZXJuQWxwaGEsIHVzZXJUb0Jhc2VDVE0p
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmFwcGx5RmlsbFBhdHRlcm4oKQpAQCAtOTM0
LDcgKzU4Myw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjphcHBseUZpbGxQYXR0ZXJuKCkKICAg
ICBBZmZpbmVUcmFuc2Zvcm0gdXNlclRvQmFzZUNUTTsgLy8gRklYTUU6IFRoaXMgaXNuJ3QgcmVh
bGx5IG5lZWRlZCBvbiBXaW5kb3dzCiAKICAgICBjb25zdCBmbG9hdCBwYXR0ZXJuQWxwaGEgPSAx
OwotICAgIG1fZGF0YS0+bV9wYXR0ZXJuRmlsbEJydXNoID0gYWRvcHRDT00obV9zdGF0ZS5maWxs
UGF0dGVybi0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKCp0aGlzLCBwYXR0ZXJuQWxwaGEsIHVzZXJU
b0Jhc2VDVE0pKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+bV9wYXR0ZXJuRmlsbEJydXNoID0g
YWRvcHRDT00obV9zdGF0ZS5maWxsUGF0dGVybi0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKCp0aGlz
LCBwYXR0ZXJuQWxwaGEsIHVzZXJUb0Jhc2VDVE0pKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmRyYXdQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCkBAIC05NDcsMTAyICs1OTYsMTAgQEAgdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdQYXRoKGNvbnN0IFBhdAogICAgICAgICByZXR1cm47CiAg
ICAgfQogCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0gICAgY29uc3Qg
R3JhcGhpY3NDb250ZXh0U3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLQotICAgIGlmIChzdGF0ZS5m
aWxsR3JhZGllbnQgfHwgc3RhdGUuc3Ryb2tlR3JhZGllbnQpIHsKLSAgICAgICAgLy8gV2UgZG9u
J3QgaGF2ZSBhbnkgb3B0aW1pemVkIHdheSB0byBmaWxsICYgc3Ryb2tlIGEgcGF0aCB1c2luZyBn
cmFkaWVudHMKLSAgICAgICAgLy8gRklYTUU6IEJlIHNtYXJ0ZXIgYWJvdXQgdGhpcy4KLSAgICAg
ICAgZmlsbFBhdGgocGF0aCk7Ci0gICAgICAgIHN0cm9rZVBhdGgocGF0aCk7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdGUuZmlsbFBhdHRlcm4pCi0gICAgICAgIGFwcGx5
RmlsbFBhdHRlcm4oKTsKLQotICAgIGlmIChzdGF0ZS5zdHJva2VQYXR0ZXJuKQotICAgICAgICBh
cHBseVN0cm9rZVBhdHRlcm4oKTsKLQotICAgIGlmIChwYXRoLmFjdGl2ZVBhdGgoKSkKLSAgICAg
ICAgcGF0aC5hY3RpdmVQYXRoKCktPkNsb3NlKCk7Ci0KLSAgICBjb250ZXh0LT5TZXRUYWdzKDEs
IF9fTElORV9fKTsKLQotICAgIGF1dG8gcmVjdCA9IHBhdGguZmFzdEJvdW5kaW5nUmVjdCgpOwot
ICAgIGRyYXdXaXRob3V0U2hhZG93KHJlY3QsIFt0aGlzLCAmcGF0aF0oSUQyRDFSZW5kZXJUYXJn
ZXQqIHJlbmRlclRhcmdldCkgewotICAgICAgICBhdXRvIGJydXNoID0gbV9zdGF0ZS5zdHJva2VQ
YXR0ZXJuID8gcGF0dGVyblN0cm9rZUJydXNoKCkgOiBzb2xpZFN0cm9rZUJydXNoKCk7Ci0gICAg
ICAgIHJlbmRlclRhcmdldC0+RHJhd0dlb21ldHJ5KHBhdGgucGxhdGZvcm1QYXRoKCksIGJydXNo
LCBzdHJva2VUaGlja25lc3MoKSwgbV9kYXRhLT5zdHJva2VTdHlsZSgpKTsKLSAgICB9KTsKLQot
ICAgIGZsdXNoKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3V2l0aG91dFNoYWRv
dyhjb25zdCBGbG9hdFJlY3QmIC8qYm91bmRpbmdSZWN0Ki8sIGNvbnN0IFdURjo6RnVuY3Rpb248
dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiYgZHJhd0NvbW1hbmRzKQotewotICAgIGRyYXdDb21t
YW5kcyhwbGF0Zm9ybUNvbnRleHQoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRyYXdXaXRoU2hhZG93
SGVscGVyKElEMkQxUmVuZGVyVGFyZ2V0KiBjb250ZXh0LCBJRDJEMUJpdG1hcCogYml0bWFwLCBj
b25zdCBDb2xvciYgc2hhZG93Q29sb3IsIGNvbnN0IEZsb2F0U2l6ZSYgc2hhZG93T2Zmc2V0LCBm
bG9hdCBzaGFkb3dCbHVyKQotewotICAgIENPTVB0cjxJRDJEMURldmljZUNvbnRleHQ+IGRldmlj
ZUNvbnRleHQ7Ci0gICAgSFJFU1VMVCBociA9IGNvbnRleHQtPlF1ZXJ5SW50ZXJmYWNlKCZkZXZp
Y2VDb250ZXh0KTsKLSAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKLQotICAgIC8v
IENyZWF0ZSB0aGUgc2hhZG93IGVmZmVjdAotICAgIENPTVB0cjxJRDJEMUVmZmVjdD4gc2hhZG93
RWZmZWN0OwotICAgIGhyID0gZGV2aWNlQ29udGV4dC0+Q3JlYXRlRWZmZWN0KENMU0lEX0QyRDFT
aGFkb3csICZzaGFkb3dFZmZlY3QpOwotICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikp
OwotCi0gICAgc2hhZG93RWZmZWN0LT5TZXRJbnB1dCgwLCBiaXRtYXApOwotICAgIHNoYWRvd0Vm
ZmVjdC0+U2V0VmFsdWUoRDJEMV9TSEFET1dfUFJPUF9DT0xPUiwgc3RhdGljX2Nhc3Q8RDJEMV9W
RUNUT1JfNEY+KHNoYWRvd0NvbG9yKSk7Ci0gICAgc2hhZG93RWZmZWN0LT5TZXRWYWx1ZShEMkQx
X1NIQURPV19QUk9QX0JMVVJfU1RBTkRBUkRfREVWSUFUSU9OLCBzaGFkb3dCbHVyKTsKLQotICAg
IENPTVB0cjxJRDJEMUVmZmVjdD4gdHJhbnNmb3JtRWZmZWN0OwotICAgIGhyID0gZGV2aWNlQ29u
dGV4dC0+Q3JlYXRlRWZmZWN0KENMU0lEX0QyRDEyREFmZmluZVRyYW5zZm9ybSwgJnRyYW5zZm9y
bUVmZmVjdCk7Ci0gICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Ci0KLSAgICB0cmFu
c2Zvcm1FZmZlY3QtPlNldElucHV0RWZmZWN0KDAsIHNoYWRvd0VmZmVjdC5nZXQoKSk7Ci0KLSAg
ICBhdXRvIHRyYW5zbGF0aW9uID0gRDJEMTo6TWF0cml4M3gyRjo6VHJhbnNsYXRpb24oc2hhZG93
T2Zmc2V0LndpZHRoKCksIHNoYWRvd09mZnNldC5oZWlnaHQoKSk7Ci0gICAgdHJhbnNmb3JtRWZm
ZWN0LT5TZXRWYWx1ZShEMkQxXzJEQUZGSU5FVFJBTlNGT1JNX1BST1BfVFJBTlNGT1JNX01BVFJJ
WCwgdHJhbnNsYXRpb24pOwotCi0gICAgQ09NUHRyPElEMkQxRWZmZWN0PiBjb21wb3NpdG9yOwot
ICAgIGhyID0gZGV2aWNlQ29udGV4dC0+Q3JlYXRlRWZmZWN0KENMU0lEX0QyRDFDb21wb3NpdGUs
ICZjb21wb3NpdG9yKTsKLSAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKLQotICAg
IGNvbXBvc2l0b3ItPlNldElucHV0RWZmZWN0KDAsIHRyYW5zZm9ybUVmZmVjdC5nZXQoKSk7Ci0g
ICAgY29tcG9zaXRvci0+U2V0SW5wdXQoMSwgYml0bWFwKTsKLQotICAgIC8vIEZsaXAgdGhlIGNv
bnRleHQKLSAgICBEMkQxX01BVFJJWF8zWDJfRiBjdG07Ci0gICAgZGV2aWNlQ29udGV4dC0+R2V0
VHJhbnNmb3JtKCZjdG0pOwotICAgIGF1dG8gdHJhbnNsYXRlID0gRDJEMTo6TWF0cml4M3gyRjo6
VHJhbnNsYXRpb24oMC4wZiwgZGV2aWNlQ29udGV4dC0+R2V0U2l6ZSgpLmhlaWdodCk7Ci0gICAg
YXV0byBmbGlwID0gRDJEMTo6TWF0cml4M3gyRjo6U2NhbGUoRDJEMTo6U2l6ZUYoMS4wZiwgLTEu
MGYpKTsKLSAgICBkZXZpY2VDb250ZXh0LT5TZXRUcmFuc2Zvcm0oY3RtICogZmxpcCAqIHRyYW5z
bGF0ZSk7Ci0KLSAgICBkZXZpY2VDb250ZXh0LT5EcmF3SW1hZ2UoY29tcG9zaXRvci5nZXQoKSwg
RDJEMV9JTlRFUlBPTEFUSU9OX01PREVfTElORUFSKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmRyYXdXaXRoU2hhZG93KGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdSZWN0LCBjb25zdCBX
VEY6OkZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4mIGRyYXdDb21tYW5kcykKLXsK
LSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIC8vIFJlbmRlciB0
aGUgY3VycmVudCBnZW9tZXRyeSB0byBhIGJpdG1hcCBjb250ZXh0Ci0gICAgQ09NUHRyPElEMkQx
Qml0bWFwUmVuZGVyVGFyZ2V0PiBiaXRtYXBUYXJnZXQ7Ci0gICAgSFJFU1VMVCBociA9IGNvbnRl
eHQtPkNyZWF0ZUNvbXBhdGlibGVSZW5kZXJUYXJnZXQoJmJpdG1hcFRhcmdldCk7Ci0gICAgUkVM
RUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Ci0KLSAgICBiaXRtYXBUYXJnZXQtPkJlZ2luRHJh
dygpOwotICAgIGRyYXdDb21tYW5kcyhiaXRtYXBUYXJnZXQuZ2V0KCkpOwotICAgIGhyID0gYml0
bWFwVGFyZ2V0LT5FbmREcmF3KCk7Ci0gICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7
Ci0KLSAgICBDT01QdHI8SUQyRDFCaXRtYXA+IGJpdG1hcDsKLSAgICBociA9IGJpdG1hcFRhcmdl
dC0+R2V0Qml0bWFwKCZiaXRtYXApOwotICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikp
OwotCi0gICAgZHJhd1dpdGhTaGFkb3dIZWxwZXIoY29udGV4dCwgYml0bWFwLmdldCgpLCBtX3N0
YXRlLnNoYWRvd0NvbG9yLCBtX3N0YXRlLnNoYWRvd09mZnNldCwgbV9zdGF0ZS5zaGFkb3dCbHVy
KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1dG8mIHN0YXRlID0g
dGhpcy0+c3RhdGUoKTsKKyAgICBhdXRvJiBjb250ZXh0ID0gKnBsYXRmb3JtQ29udGV4dCgpOwor
ICAgIERpcmVjdDJEOjpkcmF3UGF0aChjb250ZXh0LCBwYXRoLCBEaXJlY3QyRDo6U3Ryb2tlU291
cmNlKHN0YXRlLCBjb250ZXh0KSwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0YXRlKSk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUGF0aChjb25zdCBQYXRoJiBwYXRoKQpAQCAtMTA1
NSw1MCArNjEyLDEwIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUGF0aChjb25zdCBQYXQK
ICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChwYXRoLmFjdGl2ZVBhdGgoKSkgewot
ICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBjbG9zZWQuIFRoaXMgbWlnaHQgZmFpbCBpZiB0aGUg
cGF0aCB3YXMgYWxyZWFkeSBjbG9zZWQsIHNvCi0gICAgICAgIC8vIGlnbm9yZSB0aGUgcmV0dXJu
IHZhbHVlLgotICAgICAgICBwYXRoLmFjdGl2ZVBhdGgoKS0+Q2xvc2UoKTsKLSAgICB9Ci0KLSAg
ICBEMkRDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCptX2RhdGEpOwotCi0gICAgYXV0byBj
b250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0KLSAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9f
TElORV9fKTsKLQotICAgIGlmIChtX3N0YXRlLmZpbGxHcmFkaWVudCkgewotICAgICAgICBjb250
ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKLQotICAgICAgICBGbG9hdFJlY3QgYm91bmRpbmdS
ZWN0ID0gcGF0aC5mYXN0Qm91bmRpbmdSZWN0KCk7Ci0gICAgICAgIFdURjo6RnVuY3Rpb248dm9p
ZChJRDJEMVJlbmRlclRhcmdldCopPiBkcmF3RnVuY3Rpb24gPSBbdGhpcywgJnBhdGhdKElEMkQx
UmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgICAgIHJlbmRlclRhcmdldC0+
RmlsbEdlb21ldHJ5KHBhdGgucGxhdGZvcm1QYXRoKCksIG1fc3RhdGUuZmlsbEdyYWRpZW50LT5j
cmVhdGVQbGF0Zm9ybUdyYWRpZW50SWZOZWNlc3NhcnkocmVuZGVyVGFyZ2V0KSk7Ci0gICAgICAg
IH07Ci0KLSAgICAgICAgaWYgKGhhc1NoYWRvdygpKQotICAgICAgICAgICAgZHJhd1dpdGhTaGFk
b3coYm91bmRpbmdSZWN0LCBkcmF3RnVuY3Rpb24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBkcmF3V2l0aG91dFNoYWRvdyhib3VuZGluZ1JlY3QsIGRyYXdGdW5jdGlvbik7Ci0KLSAgICAg
ICAgZmx1c2goKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtX3N0YXRlLmZp
bGxQYXR0ZXJuKQotICAgICAgICBhcHBseUZpbGxQYXR0ZXJuKCk7Ci0KLSAgICBDT01QdHI8SUQy
RDFHZW9tZXRyeUdyb3VwPiBwYXRoVG9GaWxsOwotICAgIHBhdGguY3JlYXRlR2VvbWV0cnlXaXRo
RmlsbE1vZGUoZmlsbFJ1bGUoKSwgcGF0aFRvRmlsbCk7Ci0KLSAgICBjb250ZXh0LT5TZXRUYWdz
KDEsIF9fTElORV9fKTsKLQotICAgIEZsb2F0UmVjdCBjb250ZXh0UmVjdChGbG9hdFBvaW50KCks
IGNvbnRleHQtPkdldFNpemUoKSk7Ci0gICAgZHJhd1dpdGhvdXRTaGFkb3coY29udGV4dFJlY3Qs
IFt0aGlzLCAmcGF0aFRvRmlsbF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewot
ICAgICAgICBhdXRvIGJydXNoID0gbV9zdGF0ZS5maWxsUGF0dGVybiA/IHBhdHRlcm5GaWxsQnJ1
c2goKSA6IHNvbGlkRmlsbEJydXNoKCk7Ci0gICAgICAgIHJlbmRlclRhcmdldC0+RmlsbEdlb21l
dHJ5KHBhdGhUb0ZpbGwuZ2V0KCksIGJydXNoKTsKLSAgICB9KTsKLQotICAgIGZsdXNoKCk7Cisg
ICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0ZSA9IHRoaXMt
PnN0YXRlKCk7CisgICAgYXV0byYgY29udGV4dCA9ICpwbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBE
aXJlY3QyRDo6ZmlsbFBhdGgoY29udGV4dCwgcGF0aCwgRGlyZWN0MkQ6OkZpbGxTb3VyY2Uoc3Rh
dGUsIGNvbnRleHQpLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoc3RhdGUpKTsKIH0KIAogdm9pZCBH
cmFwaGljc0NvbnRleHQ6OnN0cm9rZVBhdGgoY29uc3QgUGF0aCYgcGF0aCkKQEAgLTExMTEsNDAg
KzYyOCwxMCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUGF0aChjb25zdCBQCiAgICAg
ICAgIHJldHVybjsKICAgICB9CiAKLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQo
KTsKLSAgICAKLSAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKLQotICAgIGlmICht
X3N0YXRlLnN0cm9rZUdyYWRpZW50KSB7Ci0gICAgICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19M
SU5FX18pOwotCi0gICAgICAgIEQyRENvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0
YSk7Ci0gICAgICAgIGF1dG8gYm91bmRpbmdSZWN0ID0gcGF0aC5mYXN0Qm91bmRpbmdSZWN0KCk7
Ci0gICAgICAgIFdURjo6RnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiBkcmF3RnVu
Y3Rpb24gPSBbdGhpcywgJnBhdGhdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsK
LSAgICAgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0dlb21ldHJ5KHBhdGgucGxhdGZvcm1QYXRo
KCksIG1fc3RhdGUuc3Ryb2tlR3JhZGllbnQtPmNyZWF0ZVBsYXRmb3JtR3JhZGllbnRJZk5lY2Vz
c2FyeShyZW5kZXJUYXJnZXQpKTsKLSAgICAgICAgfTsKLQotICAgICAgICBpZiAoaGFzU2hhZG93
KCkpCi0gICAgICAgICAgICBkcmF3V2l0aFNoYWRvdyhib3VuZGluZ1JlY3QsIGRyYXdGdW5jdGlv
bik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRyYXdXaXRob3V0U2hhZG93KGJvdW5kaW5n
UmVjdCwgZHJhd0Z1bmN0aW9uKTsKLQotICAgICAgICBmbHVzaCgpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgaWYgKG1fc3RhdGUuc3Ryb2tlUGF0dGVybikKLSAgICAgICAgYXBwbHlT
dHJva2VQYXR0ZXJuKCk7Ci0KLSAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKLQot
ICAgIEZsb2F0UmVjdCBjb250ZXh0UmVjdChGbG9hdFBvaW50KCksIGNvbnRleHQtPkdldFNpemUo
KSk7Ci0gICAgZHJhd1dpdGhvdXRTaGFkb3coY29udGV4dFJlY3QsIFt0aGlzLCAmcGF0aF0oSUQy
RDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewotICAgICAgICBhdXRvIGJydXNoID0gbV9z
dGF0ZS5zdHJva2VQYXR0ZXJuID8gcGF0dGVyblN0cm9rZUJydXNoKCkgOiBzb2xpZFN0cm9rZUJy
dXNoKCk7Ci0gICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0dlb21ldHJ5KHBhdGgucGxhdGZvcm1Q
YXRoKCksIGJydXNoLCBzdHJva2VUaGlja25lc3MoKSwgbV9kYXRhLT5zdHJva2VTdHlsZSgpKTsK
LSAgICB9KTsKLQotICAgIGZsdXNoKCk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgp
KTsKKyAgICBhdXRvJiBzdGF0ZSA9IHRoaXMtPnN0YXRlKCk7CisgICAgYXV0byYgY29udGV4dCA9
ICpwbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBEaXJlY3QyRDo6c3Ryb2tlUGF0aChjb250ZXh0LCBw
YXRoLCBEaXJlY3QyRDo6U3Ryb2tlU291cmNlKHN0YXRlLCBjb250ZXh0KSwgRGlyZWN0MkQ6OlNo
YWRvd1N0YXRlKHN0YXRlKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChj
b25zdCBGbG9hdFJlY3QmIHJlY3QpCkBAIC0xMTU3LDQxICs2NDQsMTAgQEAgdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsbwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0g
ICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0KLSAgICBpZiAobV9zdGF0ZS5m
aWxsR3JhZGllbnQpIHsKLSAgICAgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0g
ICAgICAgIEQyRENvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSk7Ci0gICAgICAg
IFdURjo6RnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiBkcmF3RnVuY3Rpb24gPSBb
dGhpcywgcmVjdF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewotICAgICAgICAg
ICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9IHJlY3Q7Ci0gICAgICAgICAgICByZW5kZXJU
YXJnZXQtPkZpbGxSZWN0YW5nbGUoJmQyZFJlY3QsIG1fc3RhdGUuZmlsbEdyYWRpZW50LT5jcmVh
dGVQbGF0Zm9ybUdyYWRpZW50SWZOZWNlc3NhcnkocmVuZGVyVGFyZ2V0KSk7Ci0gICAgICAgIH07
Ci0KLSAgICAgICAgaWYgKGhhc1NoYWRvdygpKQotICAgICAgICAgICAgZHJhd1dpdGhTaGFkb3co
cmVjdCwgZHJhd0Z1bmN0aW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZHJhd1dpdGhv
dXRTaGFkb3cocmVjdCwgZHJhd0Z1bmN0aW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIGlmIChtX3N0YXRlLmZpbGxQYXR0ZXJuKQotICAgICAgICBhcHBseUZpbGxQYXR0ZXJuKCk7
Ci0KLSAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKLQotICAgIGJvb2wgZHJhd093
blNoYWRvdyA9ICFpc0FjY2VsZXJhdGVkQ29udGV4dCgpICYmIGhhc0JsdXJyZWRTaGFkb3coKSAm
JiAhbV9zdGF0ZS5zaGFkb3dzSWdub3JlVHJhbnNmb3JtczsgLy8gRG9uJ3QgdXNlIFNoYWRvd0Js
dXIgZm9yIGNhbnZhcyB5ZXQuCi0gICAgaWYgKGRyYXdPd25TaGFkb3cpIHsKLSAgICAgICAgLy8g
RklYTUU6IEdldCBTaGFkb3dCbHVyIHdvcmtpbmcgb24gRGlyZWN0MkQKLSAgICAgICAgLy8gU2hh
ZG93Qmx1ciBjb250ZXh0U2hhZG93KG1fc3RhdGUpOwotICAgICAgICAvLyBjb250ZXh0U2hhZG93
LmRyYXdSZWN0U2hhZG93KCp0aGlzLCBGbG9hdFJvdW5kZWRSZWN0KHJlY3QpKTsKLSAgICAgICAg
bm90SW1wbGVtZW50ZWQoKTsKLSAgICB9Ci0KLSAgICBkcmF3V2l0aG91dFNoYWRvdyhyZWN0LCBb
dGhpcywgcmVjdF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewotICAgICAgICBj
b25zdCBEMkQxX1JFQ1RfRiBkMmRSZWN0ID0gcmVjdDsKLSAgICAgICAgYXV0byBicnVzaCA9IG1f
c3RhdGUuZmlsbFBhdHRlcm4gPyBwYXR0ZXJuRmlsbEJydXNoKCkgOiBzb2xpZEZpbGxCcnVzaCgp
OwotICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUoJmQyZFJlY3QsIGJydXNoKTsK
LSAgICB9KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1dG8mIHN0
YXRlID0gdGhpcy0+c3RhdGUoKTsKKyAgICBhdXRvJiBjb250ZXh0ID0gKnBsYXRmb3JtQ29udGV4
dCgpOworICAgIERpcmVjdDJEOjpmaWxsUmVjdChjb250ZXh0LCByZWN0LCBEaXJlY3QyRDo6Rmls
bFNvdXJjZShzdGF0ZSwgY29udGV4dCksIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0ZSkpOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0
LCBjb25zdCBDb2xvciYgY29sb3IpCkBAIC0xMjA0LDIyICs2NjAsMTAgQEAgdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsbwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0g
ICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0KLSAgICBib29sIGRyYXdPd25T
aGFkb3cgPSAhaXNBY2NlbGVyYXRlZENvbnRleHQoKSAmJiBoYXNCbHVycmVkU2hhZG93KCkgJiYg
IW1fc3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXM7IC8vIERvbid0IHVzZSBTaGFkb3dCbHVy
IGZvciBjYW52YXMgeWV0LgotICAgIGlmIChkcmF3T3duU2hhZG93KSB7Ci0gICAgICAgIC8vIEZJ
WE1FOiBHZXQgU2hhZG93Qmx1ciB3b3JraW5nIG9uIERpcmVjdDJECi0gICAgICAgIC8vIFNoYWRv
d0JsdXIgY29udGV4dFNoYWRvdyhtX3N0YXRlKTsKLSAgICAgICAgLy8gY29udGV4dFNoYWRvdy5k
cmF3UmVjdFNoYWRvdygqdGhpcywgRmxvYXRSb3VuZGVkUmVjdChyZWN0KSk7Ci0gICAgICAgIG5v
dEltcGxlbWVudGVkKCk7Ci0gICAgfQotCi0gICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVf
Xyk7Ci0KLSAgICBkcmF3V2l0aG91dFNoYWRvdyhyZWN0LCBbdGhpcywgcmVjdCwgY29sb3JdKElE
MkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgY29uc3QgRDJEMV9SRUNU
X0YgZDJkUmVjdCA9IHJlY3Q7Ci0gICAgICAgIHJlbmRlclRhcmdldC0+RmlsbFJlY3RhbmdsZSgm
ZDJkUmVjdCwgYnJ1c2hXaXRoQ29sb3IoY29sb3IpKTsKLSAgICB9KTsKKyAgICBBU1NFUlQoaGFz
UGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1dG8mIHN0YXRlID0gdGhpcy0+c3RhdGUoKTsKKyAg
ICBhdXRvJiBjb250ZXh0ID0gKnBsYXRmb3JtQ29udGV4dCgpOworICAgIERpcmVjdDJEOjpmaWxs
UmVjdChjb250ZXh0LCByZWN0LCBjb2xvciwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0YXRlKSk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybUZpbGxSb3VuZGVkUmVjdChjb25z
dCBGbG9hdFJvdW5kZWRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCkBAIC0xMjI5LDM4
ICs2NzMsOSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1GaWxsUm91bmRlCiAKICAg
ICBBU1NFUlQoIW1faW1wbCk7CiAKLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQo
KTsKLQotICAgIGJvb2wgZHJhd093blNoYWRvdyA9ICFpc0FjY2VsZXJhdGVkQ29udGV4dCgpICYm
IGhhc0JsdXJyZWRTaGFkb3coKSAmJiAhbV9zdGF0ZS5zaGFkb3dzSWdub3JlVHJhbnNmb3Jtczsg
Ly8gRG9uJ3QgdXNlIFNoYWRvd0JsdXIgZm9yIGNhbnZhcyB5ZXQuCi0gICAgRDJEQ29udGV4dFN0
YXRlU2F2ZXIgc3RhdGVTYXZlcigqbV9kYXRhLCBkcmF3T3duU2hhZG93KTsKLSAgICBpZiAoZHJh
d093blNoYWRvdykgewotICAgICAgICAvLyBGSVhNRTogR2V0IFNoYWRvd0JsdXIgd29ya2luZyBv
biBEaXJlY3QyRAotICAgICAgICAvLyBTaGFkb3dCbHVyIGNvbnRleHRTaGFkb3cobV9zdGF0ZSk7
Ci0gICAgICAgIC8vIGNvbnRleHRTaGFkb3cuZHJhd1JlY3RTaGFkb3coKnRoaXMsIHJlY3QpOwot
ICAgICAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIH0KLQotICAgIGNvbnRleHQtPlNldFRhZ3Mo
MSwgX19MSU5FX18pOwotCi0gICAgY29uc3QgRmxvYXRSZWN0JiByID0gcmVjdC5yZWN0KCk7Ci0g
ICAgY29uc3QgRmxvYXRSb3VuZGVkUmVjdDo6UmFkaWkmIHJhZGlpID0gcmVjdC5yYWRpaSgpOwot
ICAgIGJvb2wgZXF1YWxXaWR0aHMgPSAocmFkaWkudG9wTGVmdCgpLndpZHRoKCkgPT0gcmFkaWku
dG9wUmlnaHQoKS53aWR0aCgpICYmIHJhZGlpLnRvcFJpZ2h0KCkud2lkdGgoKSA9PSByYWRpaS5i
b3R0b21MZWZ0KCkud2lkdGgoKSAmJiByYWRpaS5ib3R0b21MZWZ0KCkud2lkdGgoKSA9PSByYWRp
aS5ib3R0b21SaWdodCgpLndpZHRoKCkpOwotICAgIGJvb2wgZXF1YWxIZWlnaHRzID0gKHJhZGlp
LnRvcExlZnQoKS5oZWlnaHQoKSA9PSByYWRpaS5ib3R0b21MZWZ0KCkuaGVpZ2h0KCkgJiYgcmFk
aWkuYm90dG9tTGVmdCgpLmhlaWdodCgpID09IHJhZGlpLnRvcFJpZ2h0KCkuaGVpZ2h0KCkgJiYg
cmFkaWkudG9wUmlnaHQoKS5oZWlnaHQoKSA9PSByYWRpaS5ib3R0b21SaWdodCgpLmhlaWdodCgp
KTsKLSAgICBib29sIGhhc0N1c3RvbUZpbGwgPSBtX3N0YXRlLmZpbGxHcmFkaWVudCB8fCBtX3N0
YXRlLmZpbGxQYXR0ZXJuOwotICAgIGlmICghaGFzQ3VzdG9tRmlsbCAmJiBlcXVhbFdpZHRocyAm
JiBlcXVhbEhlaWdodHMgJiYgcmFkaWkudG9wTGVmdCgpLndpZHRoKCkgKiAyID09IHIud2lkdGgo
KSAmJiByYWRpaS50b3BMZWZ0KCkuaGVpZ2h0KCkgKiAyID09IHIuaGVpZ2h0KCkpIHsKLSAgICAg
ICAgYXV0byByb3VuZGVkUmVjdCA9IEQyRDE6OlJvdW5kZWRSZWN0KHIsIHJhZGlpLnRvcExlZnQo
KS53aWR0aCgpLCByYWRpaS50b3BMZWZ0KCkuaGVpZ2h0KCkpOwotICAgICAgICBjb250ZXh0LT5G
aWxsUm91bmRlZFJlY3RhbmdsZShyb3VuZGVkUmVjdCwgYnJ1c2hXaXRoQ29sb3IoY29sb3IpKTsK
LSAgICB9IGVsc2UgewotICAgICAgICBEMkRDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpt
X2RhdGEpOwotICAgICAgICBzZXRGaWxsQ29sb3IoY29sb3IpOwotCi0gICAgICAgIFBhdGggcGF0
aDsKLSAgICAgICAgcGF0aC5hZGRSb3VuZGVkUmVjdChyZWN0KTsKLSAgICAgICAgZmlsbFBhdGgo
cGF0aCk7Ci0gICAgfQotCi0gICAgaWYgKGRyYXdPd25TaGFkb3cpCi0gICAgICAgIHN0YXRlU2F2
ZXIucmVzdG9yZSgpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgYXV0
byYgc3RhdGUgPSB0aGlzLT5zdGF0ZSgpOworICAgIERpcmVjdDJEOjpmaWxsUm91bmRlZFJlY3Qo
KnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LCBjb2xvciwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0
YXRlKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdFdpdGhSb3VuZGVkSG9s
ZShjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmIHJvdW5kZWRI
b2xlUmVjdCwgY29uc3QgQ29sb3ImIGNvbG9yKQpAQCAtMTI3Myw0MSArNjg4LDEwIEBAIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdFdpdGhSb3VuZGUKICAgICAgICAgcmV0dXJuOwogICAg
IH0KIAotICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgY29udGV4
dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAgICBQYXRoIHBhdGg7Ci0gICAgcGF0aC5hZGRS
ZWN0KHJlY3QpOwotCi0gICAgaWYgKCFyb3VuZGVkSG9sZVJlY3QucmFkaWkoKS5pc1plcm8oKSkK
LSAgICAgICAgcGF0aC5hZGRSb3VuZGVkUmVjdChyb3VuZGVkSG9sZVJlY3QpOwotICAgIGVsc2UK
LSAgICAgICAgcGF0aC5hZGRSZWN0KHJvdW5kZWRIb2xlUmVjdC5yZWN0KCkpOwotCi0gICAgV2lu
ZFJ1bGUgb2xkRmlsbFJ1bGUgPSBmaWxsUnVsZSgpOwotICAgIENvbG9yIG9sZEZpbGxDb2xvciA9
IGZpbGxDb2xvcigpOwotCi0gICAgc2V0RmlsbFJ1bGUoV2luZFJ1bGU6OkV2ZW5PZGQpOwotICAg
IHNldEZpbGxDb2xvcihjb2xvcik7Ci0KLSAgICAvLyBmaWxsUmVjdFdpdGhSb3VuZGVkSG9sZSgp
IGFzc3VtZXMgdGhhdCB0aGUgZWRnZXMgb2YgcmVjdCBhcmUgY2xpcHBlZCBvdXQsIHNvIHdlIG9u
bHkgY2FyZSBhYm91dCBzaGFkb3dzIGNhc3QgYXJvdW5kIGluc2lkZSB0aGUgaG9sZS4KLSAgICBi
b29sIGRyYXdPd25TaGFkb3cgPSAhaXNBY2NlbGVyYXRlZENvbnRleHQoKSAmJiBoYXNCbHVycmVk
U2hhZG93KCkgJiYgIW1fc3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXM7Ci0gICAgRDJEQ29u
dGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqbV9kYXRhLCBkcmF3T3duU2hhZG93KTsKLSAgICBp
ZiAoZHJhd093blNoYWRvdykgewotICAgICAgICAvLyBGSVhNRTogR2V0IFNoYWRvd0JsdXIgd29y
a2luZyBvbiBEaXJlY3QyRAotICAgICAgICAvLyBTaGFkb3dCbHVyIGNvbnRleHRTaGFkb3cobV9z
dGF0ZSk7Ci0gICAgICAgIC8vIGNvbnRleHRTaGFkb3cuZHJhd1JlY3RTaGFkb3coKnRoaXMsIHJl
Y3QpOwotICAgICAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIH0KLQotICAgIGZpbGxQYXRoKHBh
dGgpOwotCi0gICAgaWYgKGRyYXdPd25TaGFkb3cpCi0gICAgICAgIHN0YXRlU2F2ZXIucmVzdG9y
ZSgpOwotCi0gICAgc2V0RmlsbFJ1bGUob2xkRmlsbFJ1bGUpOwotICAgIHNldEZpbGxDb2xvcihv
bGRGaWxsQ29sb3IpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgYXV0
byYgc3RhdGUgPSB0aGlzLT5zdGF0ZSgpOworICAgIGF1dG8mIGNvbnRleHQgPSAqcGxhdGZvcm1D
b250ZXh0KCk7CisgICAgRGlyZWN0MkQ6OmZpbGxSZWN0V2l0aFJvdW5kZWRIb2xlKGNvbnRleHQs
IHJlY3QsIHJvdW5kZWRIb2xlUmVjdCwgRGlyZWN0MkQ6OkZpbGxTb3VyY2Uoc3RhdGUsIGNvbnRl
eHQpLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoc3RhdGUpKTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmNsaXAoY29uc3QgRmxvYXRSZWN0JiByZWN0KQpAQCAtMTMyMCw3ICs3MDQsOCBAQCB2
b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBGbG9hdFJlCiAgICAgICAgIHJldHVybjsK
ICAgICB9CiAKLSAgICBtX2RhdGEtPmNsaXAocmVjdCk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3Jt
Q29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6Y2xpcCgqcGxhdGZvcm1Db250ZXh0KCksIHJlY3Qp
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBGbG9hdFJlY3QmIHJl
Y3QpCkBAIC0xMzMzLDEwICs3MTgsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChj
b25zdCBGbG9hCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBQYXRoIHBhdGg7Ci0gICAg
cGF0aC5hZGRSZWN0KHJlY3QpOwotCi0gICAgY2xpcE91dChwYXRoKTsKKyAgICBBU1NFUlQoaGFz
UGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpjbGlwT3V0KCpwbGF0Zm9ybUNvbnRl
eHQoKSwgcmVjdCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KGNvbnN0IFBh
dGgmIHBhdGgpCkBAIC0xMzQ5LDE5ICs3MzIsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xp
cE91dChjb25zdCBQYXRoCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBUbyBjbGlw
IE91dCB3ZSBuZWVkIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGluZmluaXRlCi0gICAgLy8gY2xp
cHBpbmcgcmVjdCBhbmQgdGhlIHBhdGggd2UganVzdCBjcmVhdGVkLgotICAgIEQyRDFfU0laRV9G
IHJlbmRlcmVyU2l6ZSA9IHBsYXRmb3JtQ29udGV4dCgpLT5HZXRTaXplKCk7Ci0gICAgRmxvYXRS
ZWN0IGNsaXBCb3VuZHMoMCwgMCwgcmVuZGVyZXJTaXplLndpZHRoLCByZW5kZXJlclNpemUuaGVp
Z2h0KTsKLQotICAgIFBhdGggYm91bmRpbmdSZWN0OwotICAgIGJvdW5kaW5nUmVjdC5hZGRSZWN0
KGNsaXBCb3VuZHMpOwotICAgIGJvdW5kaW5nUmVjdC5hcHBlbmRHZW9tZXRyeShwYXRoLnBsYXRm
b3JtUGF0aCgpKTsKLQotICAgIENPTVB0cjxJRDJEMUdlb21ldHJ5R3JvdXA+IHBhdGhUb0NsaXA7
Ci0gICAgYm91bmRpbmdSZWN0LmNyZWF0ZUdlb21ldHJ5V2l0aEZpbGxNb2RlKFdpbmRSdWxlOjpF
dmVuT2RkLCBwYXRoVG9DbGlwKTsKLQotICAgIG1fZGF0YS0+Y2xpcChwYXRoVG9DbGlwLmdldCgp
KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpjbGlw
T3V0KCpwbGF0Zm9ybUNvbnRleHQoKSwgcGF0aCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
OjpjbGlwUGF0aChjb25zdCBQYXRoJiBwYXRoLCBXaW5kUnVsZSBjbGlwUnVsZSkKQEAgLTEzNzQs
MTggKzc0Niw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwUGF0aChjb25zdCBQYXQKICAg
ICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4
dCgpOwotICAgIGlmIChwYXRoLmlzRW1wdHkoKSkgewotICAgICAgICBtX2RhdGEtPmNsaXAoRmxv
YXRSZWN0KCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQVNTRVJUKCFwYXRoLmFj
dGl2ZVBhdGgoKSk7Ci0KLSAgICBDT01QdHI8SUQyRDFHZW9tZXRyeUdyb3VwPiBwYXRoVG9DbGlw
OwotICAgIHBhdGguY3JlYXRlR2VvbWV0cnlXaXRoRmlsbE1vZGUoY2xpcFJ1bGUsIHBhdGhUb0Ns
aXApOwotCi0gICAgbV9kYXRhLT5jbGlwKHBhdGhUb0NsaXAuZ2V0KCkpOworICAgIEFTU0VSVCho
YXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OmNsaXBQYXRoKCpwbGF0Zm9ybUNv
bnRleHQoKSwgcGF0aCwgY2xpcFJ1bGUpOwogfQogCiBJbnRSZWN0IEdyYXBoaWNzQ29udGV4dDo6
Y2xpcEJvdW5kcygpIGNvbnN0CkBAIC0xMzkzLDMzICs3NTUsMTUgQEAgSW50UmVjdCBHcmFwaGlj
c0NvbnRleHQ6OmNsaXBCb3VuZHMoKSBjbwogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAg
ICAgICAgIHJldHVybiBJbnRSZWN0KCk7CiAKLSAgICBpZiAobV9pbXBsKSB7Ci0gICAgICAgIFdU
RkxvZ0Fsd2F5cygiR2V0dGluZyB0aGUgY2xpcCBib3VuZHMgbm90IHlldCBzdXBwb3J0ZWQgd2l0
aCBkaXNwbGF5IGxpc3RzIik7Ci0gICAgICAgIHJldHVybiBJbnRSZWN0KC0yMDQ4LCAtMjA0OCwg
NDA5NiwgNDA5Nik7IC8vIEZJWE1FOiBkaXNwbGF5IGxpc3RzLgotICAgIH0KLQotICAgIEQyRDFf
U0laRV9GIGNsaXBTaXplOwotICAgIGlmIChhdXRvIGNsaXBMYXllciA9IG1fZGF0YS0+Y2xpcExh
eWVyKCkpCi0gICAgICAgIGNsaXBTaXplID0gY2xpcExheWVyLT5HZXRTaXplKCk7Ci0gICAgZWxz
ZQotICAgICAgICBjbGlwU2l6ZSA9IHBsYXRmb3JtQ29udGV4dCgpLT5HZXRTaXplKCk7Ci0KLSAg
ICBGbG9hdFJlY3QgY2xpcEJvdW5kcyhJbnRQb2ludCgpLCBjbGlwU2l6ZSk7CisgICAgaWYgKG1f
aW1wbCkKKyAgICAgICAgcmV0dXJuIG1faW1wbC0+Y2xpcEJvdW5kcygpOwogCi0gICAgcmV0dXJu
IGVuY2xvc2luZ0ludFJlY3QoY2xpcEJvdW5kcyk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29u
dGV4dCgpKTsKKyAgICByZXR1cm4gRGlyZWN0MkQ6OlN0YXRlOjpnZXRDbGlwQm91bmRzKCpwbGF0
Zm9ybUNvbnRleHQoKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
OjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKGZsb2F0IG9wYWNpdHkpCiB7Ci0gICAgVHJhbnNwYXJl
bmN5TGF5ZXJTdGF0ZSB0cmFuc3BhcmVuY3lMYXllcjsKLSAgICB0cmFuc3BhcmVuY3lMYXllci5v
cGFjaXR5ID0gb3BhY2l0eTsKLQotICAgIEhSRVNVTFQgaHIgPSBtX3JlbmRlclRhcmdldC0+Q3Jl
YXRlQ29tcGF0aWJsZVJlbmRlclRhcmdldCgmdHJhbnNwYXJlbmN5TGF5ZXIucmVuZGVyVGFyZ2V0
KTsKLSAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKLSAgICBtX3RyYW5zcGFyZW5j
eUxheWVyU3RhY2suYXBwZW5kKFdURk1vdmUodHJhbnNwYXJlbmN5TGF5ZXIpKTsKLQotICAgIG1f
dHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5sYXN0KCkucmVuZGVyVGFyZ2V0LT5CZWdpbkRyYXcoKTsK
LSAgICBtX3RyYW5zcGFyZW5jeUxheWVyU3RhY2subGFzdCgpLnJlbmRlclRhcmdldC0+Q2xlYXIo
RDJEMTo6Q29sb3JGKDAsIDAsIDAsIDApKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmJl
Z2luUGxhdGZvcm1UcmFuc3BhcmVuY3lMYXllcihmbG9hdCBvcGFjaXR5KQpAQCAtMTQzMywzOCAr
Nzc3LDEyIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdpblBsYXRmb3JtVHJhbnMKIAogICAg
IG1fc3RhdGUuYWxwaGEgPSBvcGFjaXR5OwogCi0gICAgbV9kYXRhLT5iZWdpblRyYW5zcGFyZW5j
eUxheWVyKG9wYWNpdHkpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAg
RGlyZWN0MkQ6OmJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoKnBsYXRmb3JtQ29udGV4dCgpLCBvcGFj
aXR5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmVuZFRyYW5z
cGFyZW5jeUxheWVyKCkKIHsKLSAgICBhdXRvIGN1cnJlbnRMYXllciA9IG1fdHJhbnNwYXJlbmN5
TGF5ZXJTdGFjay50YWtlTGFzdCgpOwotICAgIGF1dG8gcmVuZGVyVGFyZ2V0ID0gY3VycmVudExh
eWVyLnJlbmRlclRhcmdldDsKLSAgICBpZiAoIXJlbmRlclRhcmdldCkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgSFJFU1VMVCBociA9IHJlbmRlclRhcmdldC0+RW5kRHJhdygpOwotICAgIFJFTEVB
U0VfQVNTRVJUKFNVQ0NFRURFRChocikpOwotCi0gICAgQ09NUHRyPElEMkQxQml0bWFwPiBiaXRt
YXA7Ci0gICAgaHIgPSByZW5kZXJUYXJnZXQtPkdldEJpdG1hcCgmYml0bWFwKTsKLSAgICBSRUxF
QVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKLQotICAgIGF1dG8gY29udGV4dCA9IHRoaXMtPnJl
bmRlclRhcmdldCgpOwotCi0gICAgaWYgKGN1cnJlbnRMYXllci5oYXNTaGFkb3cpCi0gICAgICAg
IGRyYXdXaXRoU2hhZG93SGVscGVyKGNvbnRleHQsIGJpdG1hcC5nZXQoKSwgY3VycmVudExheWVy
LnNoYWRvd0NvbG9yLCBjdXJyZW50TGF5ZXIuc2hhZG93T2Zmc2V0LCBjdXJyZW50TGF5ZXIuc2hh
ZG93Qmx1cik7Ci0gICAgZWxzZSB7Ci0gICAgICAgIENPTVB0cjxJRDJEMUJpdG1hcEJydXNoPiBi
aXRtYXBCcnVzaDsKLSAgICAgICAgYXV0byBiaXRtYXBCcnVzaFByb3BlcnRpZXMgPSBEMkQxOjpC
aXRtYXBCcnVzaFByb3BlcnRpZXMoKTsKLSAgICAgICAgYXV0byBicnVzaFByb3BlcnRpZXMgPSBE
MkQxOjpCcnVzaFByb3BlcnRpZXMoKTsKLSAgICAgICAgSFJFU1VMVCBociA9IGNvbnRleHQtPkNy
ZWF0ZUJpdG1hcEJydXNoKGJpdG1hcC5nZXQoKSwgYml0bWFwQnJ1c2hQcm9wZXJ0aWVzLCBicnVz
aFByb3BlcnRpZXMsICZiaXRtYXBCcnVzaCk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NF
RURFRChocikpOwotCi0gICAgICAgIGF1dG8gc2l6ZSA9IGJpdG1hcC0+R2V0U2l6ZSgpOwotICAg
ICAgICBhdXRvIHJlY3RJbkRJUCA9IEQyRDE6OlJlY3RGKDAsIDAsIHNpemUud2lkdGgsIHNpemUu
aGVpZ2h0KTsKLSAgICAgICAgY29udGV4dC0+RmlsbFJlY3RhbmdsZShyZWN0SW5ESVAsIGJpdG1h
cEJydXNoLmdldCgpKTsKLSAgICB9CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjplbmRQbGF0
Zm9ybVRyYW5zcGFyZW5jeUxheWVyKCkKQEAgLTE0NzIsNyArNzkwLDggQEAgdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmVuZFBsYXRmb3JtVHJhbnNwYQogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CiAgICAgICAgIHJldHVybjsKIAotICAgIG1fZGF0YS0+ZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKTsK
KyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjplbmRUcmFu
c3BhcmVuY3lMYXllcigqcGxhdGZvcm1Db250ZXh0KCkpOwogCiAgICAgQVNTRVJUKCFtX2ltcGwp
OwogCkBAIC0xNTA2LDcgKzgyNSw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9y
bVN0cm9rZVMKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1cm47CiAK
LSAgICBtX2RhdGEtPnNldFN0cm9rZVN0eWxlKHN0eWxlKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZv
cm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpTdGF0ZTo6c2V0U3Ryb2tlU3R5bGUoKnBsYXRm
b3JtQ29udGV4dCgpLCBzdHlsZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRNaXRl
ckxpbWl0KGZsb2F0IGxpbWl0KQpAQCAtMTUyMCw3ICs4NDAsOCBAQCB2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2V0TWl0ZXJMaW1pdChmbG9hCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBt
X2RhdGEtPnNldE1pdGVyTGltaXQobGltaXQpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRl
eHQoKSk7CisgICAgRGlyZWN0MkQ6OnNldE1pdGVyTGltaXQoKnBsYXRmb3JtQ29udGV4dCgpLCBs
aW1pdCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGVhclJlY3QoY29uc3QgRmxvYXRS
ZWN0JiByZWN0KQpAQCAtMTUzMywyMyArODU0LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
ZWFyUmVjdChjb25zdCBGbAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgZHJhd1dpdGhv
dXRTaGFkb3cocmVjdCwgW3RoaXMsIHJlY3RdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJn
ZXQpIHsKLSAgICAgICAgRmxvYXRSZWN0IHJlbmRlclRhcmdldFJlY3QoRmxvYXRQb2ludCgpLCBy
ZW5kZXJUYXJnZXQtPkdldFNpemUoKSk7Ci0gICAgICAgIEZsb2F0UmVjdCByZWN0VG9DbGVhcihy
ZWN0KTsKLQotICAgICAgICBpZiAocmVjdFRvQ2xlYXIuY29udGFpbnMocmVuZGVyVGFyZ2V0UmVj
dCkpIHsKLSAgICAgICAgICAgIHJlbmRlclRhcmdldC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0g
ICAgICAgICAgICByZW5kZXJUYXJnZXQtPkNsZWFyKEQyRDE6OkNvbG9yRigwLCAwLCAwLCAwKSk7
Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXJlY3RUb0Ns
ZWFyLmludGVyc2VjdHMocmVuZGVyVGFyZ2V0UmVjdCkpCi0gICAgICAgICAgICByZXR1cm47Ci0K
LSAgICAgICAgcmVuZGVyVGFyZ2V0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKLSAgICAgICAgcmVj
dFRvQ2xlYXIuaW50ZXJzZWN0KHJlbmRlclRhcmdldFJlY3QpOwotICAgICAgICByZW5kZXJUYXJn
ZXQtPkZpbGxSZWN0YW5nbGUocmVjdFRvQ2xlYXIsIGJydXNoV2l0aENvbG9yKENvbG9yKEQyRDE6
OkNvbG9yRigwLCAwLCAwLCAwKSkpKTsKLSAgICB9KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1D
b250ZXh0KCkpOworICAgIERpcmVjdDJEOjpjbGVhclJlY3QoKnBsYXRmb3JtQ29udGV4dCgpLCBy
ZWN0KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVJlY3QoY29uc3QgRmxvYXRS
ZWN0JiByZWN0LCBmbG9hdCBsaW5lV2lkdGgpCkBAIC0xNTYyLDI5ICs4NjgsMTAgQEAgdm9pZCBH
cmFwaGljc0NvbnRleHQ6OnN0cm9rZVJlY3QoY29uc3QgRgogICAgICAgICByZXR1cm47CiAgICAg
fQogCi0gICAgaWYgKG1fc3RhdGUuc3Ryb2tlR3JhZGllbnQpIHsKLSAgICAgICAgV1RGOjpGdW5j
dGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+IGRyYXdGdW5jdGlvbiA9IFt0aGlzLCByZWN0
LCBsaW5lV2lkdGhdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAg
ICAgIHJlbmRlclRhcmdldC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICBjb25z
dCBEMkQxX1JFQ1RfRiBkMmRSZWN0ID0gcmVjdDsKLSAgICAgICAgICAgIHJlbmRlclRhcmdldC0+
RHJhd1JlY3RhbmdsZSgmZDJkUmVjdCwgbV9zdGF0ZS5zdHJva2VHcmFkaWVudC0+Y3JlYXRlUGxh
dGZvcm1HcmFkaWVudElmTmVjZXNzYXJ5KHJlbmRlclRhcmdldCksIGxpbmVXaWR0aCwgbV9kYXRh
LT5zdHJva2VTdHlsZSgpKTsKLSAgICAgICAgfTsKLQotICAgICAgICBpZiAoaGFzU2hhZG93KCkp
Ci0gICAgICAgICAgICBkcmF3V2l0aFNoYWRvdyhyZWN0LCBkcmF3RnVuY3Rpb24pOwotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICBkcmF3V2l0aG91dFNoYWRvdyhyZWN0LCBkcmF3RnVuY3Rpb24p
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1fc3RhdGUuc3Ryb2tlUGF0dGVy
bikKLSAgICAgICAgYXBwbHlTdHJva2VQYXR0ZXJuKCk7Ci0KLSAgICBkcmF3V2l0aG91dFNoYWRv
dyhyZWN0LCBbdGhpcywgcmVjdCwgbGluZVdpZHRoXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVy
VGFyZ2V0KSB7Ci0gICAgICAgIHJlbmRlclRhcmdldC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0g
ICAgICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSByZWN0OwotICAgICAgICBhdXRvIGJy
dXNoID0gbV9zdGF0ZS5zdHJva2VQYXR0ZXJuID8gcGF0dGVyblN0cm9rZUJydXNoKCkgOiBzb2xp
ZFN0cm9rZUJydXNoKCk7Ci0gICAgICAgIHJlbmRlclRhcmdldC0+RHJhd1JlY3RhbmdsZSgmZDJk
UmVjdCwgYnJ1c2gsIGxpbmVXaWR0aCwgbV9kYXRhLT5zdHJva2VTdHlsZSgpKTsKLSAgICB9KTsK
KyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1dG8mIHN0YXRlID0gdGhp
cy0+c3RhdGUoKTsKKyAgICBhdXRvJiBjb250ZXh0ID0gKnBsYXRmb3JtQ29udGV4dCgpOworICAg
IERpcmVjdDJEOjpzdHJva2VSZWN0KGNvbnRleHQsIHJlY3QsIGxpbmVXaWR0aCwgRGlyZWN0MkQ6
OlN0cm9rZVNvdXJjZShzdGF0ZSwgY29udGV4dCksIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0
ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUNhcChMaW5lQ2FwIGNhcCkK
QEAgLTE1OTcsNyArODg0LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExpbmVDYXAoTGlu
ZUNhcAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbV9kYXRhLT5zZXRMaW5lQ2FwKGNh
cCk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6c2V0
TGluZUNhcCgqcGxhdGZvcm1Db250ZXh0KCksIGNhcCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0OjpzZXRMaW5lRGFzaChjb25zdCBEYXNoQXJyYXkmIGRhc2hlcywgZmxvYXQgZGFzaE9mZnNl
dCkKQEAgLTE2MTgsOCArOTA2LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExpbmVEYXNo
KGNvbnN0CiAgICAgICAgICAgICBkYXNoT2Zmc2V0ID0gZm1vZChkYXNoT2Zmc2V0LCBsZW5ndGgp
ICsgbGVuZ3RoOwogICAgIH0KIAotICAgIG1fZGF0YS0+c2V0RGFzaGVzKGRhc2hlcyk7Ci0gICAg
bV9kYXRhLT5zZXREYXNoT2Zmc2V0KGRhc2hPZmZzZXQpOworICAgIEFTU0VSVChoYXNQbGF0Zm9y
bUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OnNldExpbmVEYXNoKCpwbGF0Zm9ybUNvbnRleHQo
KSwgZGFzaGVzLCBkYXNoT2Zmc2V0KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExp
bmVKb2luKExpbmVKb2luIGpvaW4pCkBAIC0xNjMyLDcgKzkyMCw4IEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0OjpzZXRMaW5lSm9pbihMaW5lSm8KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAg
IG1fZGF0YS0+c2V0TGluZUpvaW4oam9pbik7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4
dCgpKTsKKyAgICBEaXJlY3QyRDo6c2V0TGluZUpvaW4oKnBsYXRmb3JtQ29udGV4dCgpLCBqb2lu
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNhbnZhc0NsaXAoY29uc3QgUGF0aCYgcGF0
aCwgV2luZFJ1bGUgZmlsbFJ1bGUpCkBAIC0xNjUwLDcgKzkzOSw4IEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0OjpzY2FsZShjb25zdCBGbG9hdFMKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAg
IG1fZGF0YS0+c2NhbGUoc2l6ZSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsK
KyAgICBEaXJlY3QyRDo6c2NhbGUoKnBsYXRmb3JtQ29udGV4dCgpLCBzaXplKTsKICAgICAvLyBG
SVhNRTogbV9kYXRhLT5tX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5ID0g
ZmFsc2U7CiB9CiAKQEAgLTE2NjQsNyArOTU0LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJv
dGF0ZShmbG9hdCBhbmdsZQogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbV9kYXRhLT5y
b3RhdGUoYW5nbGUpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGly
ZWN0MkQ6OnJvdGF0ZSgqcGxhdGZvcm1Db250ZXh0KCksIGFuZ2xlKTsKICAgICAvLyBGSVhNRTog
bV9kYXRhLT5tX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5ID0gZmFsc2U7
CiB9CiAKQEAgLTE2NzgsNyArOTY5LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnRyYW5zbGF0
ZShmbG9hdCB4LAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbV9kYXRhLT50cmFuc2xh
dGUoeCwgeSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3Qy
RDo6dHJhbnNsYXRlKCpwbGF0Zm9ybUNvbnRleHQoKSwgeCwgeSk7CiAgICAgLy8gRklYTUU6IG1f
ZGF0YS0+bV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eSA9IGZhbHNlOwog
fQogCkBAIC0xNjkyLDcgKzk4NCw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpjb25jYXRDVE0o
Y29uc3QgQWYKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1fZGF0YS0+Y29uY2F0Q1RN
KHRyYW5zZm9ybSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJl
Y3QyRDo6Y29uY2F0Q1RNKCpwbGF0Zm9ybUNvbnRleHQoKSwgdHJhbnNmb3JtKTsKICAgICAvLyBG
SVhNRTogbV9kYXRhLT5tX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5ID0g
ZmFsc2U7CiB9CiAKQEAgLTE3MDYsNyArOTk5LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNl
dENUTShjb25zdCBBZmZpbgogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbV9kYXRhLT5z
ZXRDVE0odHJhbnNmb3JtKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAg
IERpcmVjdDJEOjpTdGF0ZTo6c2V0Q1RNKCpwbGF0Zm9ybUNvbnRleHQoKSwgdHJhbnNmb3JtKTsK
ICAgICAvLyBGSVhNRTogbV9kYXRhLT5tX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlk
ZW50aXR5ID0gZmFsc2U7CiB9CiAKQEAgLTE3MTUsMTQgKzEwMDksMTEgQEAgQWZmaW5lVHJhbnNm
b3JtIEdyYXBoaWNzQ29udGV4dDo6Z2V0Q1RNKAogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CiAgICAgICAgIHJldHVybiBBZmZpbmVUcmFuc2Zvcm0oKTsKIAotICAgIGlmIChtX2ltcGwpIHsK
LSAgICAgICAgV1RGTG9nQWx3YXlzKCJHcmFwaGljc0NvbnRleHQ6OmdldENUTSgpIGlzIG5vdCB5
ZXQgY29tcGF0aWJsZSB3aXRoIHJlY29yZGluZyBjb250ZXh0cy4iKTsKLSAgICAgICAgcmV0dXJu
IEFmZmluZVRyYW5zZm9ybSgpOwotICAgIH0KKyAgICBpZiAobV9pbXBsKQorICAgICAgICByZXR1
cm4gbV9pbXBsLT5nZXRDVE0oaW5jbHVkZVNjYWxlKTsKIAotICAgIEQyRDFfTUFUUklYXzNYMl9G
IGN1cnJlbnRUcmFuc2Zvcm07Ci0gICAgcGxhdGZvcm1Db250ZXh0KCktPkdldFRyYW5zZm9ybSgm
Y3VycmVudFRyYW5zZm9ybSk7Ci0gICAgcmV0dXJuIGN1cnJlbnRUcmFuc2Zvcm07CisgICAgQVNT
RVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICByZXR1cm4gRGlyZWN0MkQ6OlN0YXRlOjpn
ZXRDVE0oKnBsYXRmb3JtQ29udGV4dCgpKTsKIH0KIAogRmxvYXRSZWN0IEdyYXBoaWNzQ29udGV4
dDo6cm91bmRUb0RldmljZVBpeGVscyhjb25zdCBGbG9hdFJlY3QmIHJlY3QsIFJvdW5kaW5nTW9k
ZSByb3VuZGluZ01vZGUpCkBAIC0xNzMwLDE0ICsxMDIxLDEwIEBAIEZsb2F0UmVjdCBHcmFwaGlj
c0NvbnRleHQ6OnJvdW5kVG9EZXZpY2UKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAg
ICAgICByZXR1cm4gcmVjdDsKIAotICAgIGlmIChtX2ltcGwpIHsKLSAgICAgICAgV1RGTG9nQWx3
YXlzKCJHcmFwaGljc0NvbnRleHQ6OnJvdW5kVG9EZXZpY2VQaXhlbHMoKSBpcyBub3QgeWV0IGNv
bXBhdGlibGUgd2l0aCByZWNvcmRpbmcgY29udGV4dHMuIik7Ci0gICAgICAgIHJldHVybiByZWN0
OwotICAgIH0KLQotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgaWYgKG1faW1wbCkKKyAgICAg
ICAgcmV0dXJuIG1faW1wbC0+cm91bmRUb0RldmljZVBpeGVscyhyZWN0LCByb3VuZGluZ01vZGUp
OwogCi0gICAgcmV0dXJuIHJlY3Q7CisgICAgcmV0dXJuIERpcmVjdDJEOjpTdGF0ZTo6cm91bmRU
b0RldmljZVBpeGVscygqcGxhdGZvcm1Db250ZXh0KCksIHJlY3QpOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JUZXh0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgYm9vbCBw
cmludGluZywgYm9vbCBkb3VibGVMaW5lcywgU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUpCkBAIC0x
NzQ4LDE5ICsxMDM1LDIxIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvclRleHQo
Y28KICAgICBkcmF3TGluZXNGb3JUZXh0KHJlY3QubG9jYXRpb24oKSwgcmVjdC5oZWlnaHQoKSwg
d2lkdGhzLCBwcmludGluZywgZG91YmxlTGluZXMsIHN0cm9rZVN0eWxlKTsKIH0KIAotdm9pZCBH
cmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lc0ZvclRleHQoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQs
IGZsb2F0IHRoaWNrbmVzcywgY29uc3QgRGFzaEFycmF5JiB3aWR0aHMsIGJvb2wgcHJpbnRpbmcs
IGJvb2wgZG91YmxlTGluZXMsIFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlKQordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmRyYXdMaW5lc0ZvclRleHQoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGZsb2F0
IHRoaWNrbmVzcywgY29uc3QgRGFzaEFycmF5JiB3aWR0aHMsIGJvb2wgcHJpbnRpbmcsIGJvb2wg
ZG91YmxlVW5kZXJsaW5lcywgU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUpCiB7CiAgICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOwogCiAgICAgaWYgKCF3aWR0aHMuc2l6
ZSgpKQogICAgICAgICByZXR1cm47CiAKICAgICBpZiAobV9pbXBsKSB7Ci0gICAgICAgIG1faW1w
bC0+ZHJhd0xpbmVzRm9yVGV4dChwb2ludCwgdGhpY2tuZXNzLCB3aWR0aHMsIHByaW50aW5nLCBk
b3VibGVMaW5lcyk7CisgICAgICAgIG1faW1wbC0+ZHJhd0xpbmVzRm9yVGV4dChwb2ludCwgdGhp
Y2tuZXNzLCB3aWR0aHMsIHByaW50aW5nLCBkb3VibGVVbmRlcmxpbmVzKTsKICAgICAgICAgcmV0
dXJuOwogICAgIH0KIAotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgQVNTRVJUKGhhc1BsYXRm
b3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6ZHJhd0xpbmVzRm9yVGV4dCgqcGxhdGZvcm1D
b250ZXh0KCksIHBvaW50LCB0aGlja25lc3MsIHdpZHRocywgcHJpbnRpbmcsIGRvdWJsZVVuZGVy
bGluZXMsIG1fc3RhdGUuc3Ryb2tlQ29sb3IpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0VVJMRm9yUmVjdChjb25zdCBVUkwmIGxpbmssIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3Qp
CkBAIC0xODQ1LDEzICsxMTM0LDggQEAgYm9vbCBHcmFwaGljc0NvbnRleHQ6OmlzQWNjZWxlcmF0
ZWRDb250ZQogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHJldHVybiBmYWxz
ZTsKIAotICAgIC8vIEZJWE1FCi0gICAgaWYgKG1faW1wbCkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBwcm9iYWJhbHkgbm90IG5lZWRlZC4KLSAgICBu
b3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiBmYWxzZTsKKyAgICBBU1NFUlQoaGFzUGxhdGZv
cm1Db250ZXh0KCkpOworICAgIHJldHVybiBEaXJlY3QyRDo6U3RhdGU6OmlzQWNjZWxlcmF0ZWRD
b250ZXh0KCpwbGF0Zm9ybUNvbnRleHQoKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpz
ZXRQbGF0Zm9ybVRleHREcmF3aW5nTW9kZShUZXh0RHJhd2luZ01vZGVGbGFncyBtb2RlKQpAQCAt
MTg2MywxMCArMTE0Nyw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVRleHRE
cmEKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKGNvbnN0IENv
bG9yJiBjb2xvcikKIHsKICAgICBBU1NFUlQobV9zdGF0ZS5zdHJva2VDb2xvciA9PSBjb2xvcik7
Ci0KLSAgICBtX2RhdGEtPm1fc29saWRTdHJva2VCcnVzaCA9IG51bGxwdHI7Ci0KLSAgICBtX2Rh
dGEtPm1fc29saWRTdHJva2VCcnVzaCA9IGJydXNoV2l0aENvbG9yKHN0cm9rZUNvbG9yKCkpOwor
ICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgcGxhdGZvcm1Db250ZXh0KCkt
Pm1fc29saWRTdHJva2VCcnVzaCA9IGJydXNoV2l0aENvbG9yKHN0cm9rZUNvbG9yKCkpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VUaGlja25lc3MoZmxvYXQg
dGhpY2tuZXNzKQpAQCAtMTg3OCwxMCArMTE2MCw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpz
ZXRQbGF0Zm9ybVN0cm9rZVQKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybUZpbGxD
b2xvcihjb25zdCBDb2xvciYgY29sb3IpCiB7CiAgICAgQVNTRVJUKG1fc3RhdGUuZmlsbENvbG9y
ID09IGNvbG9yKTsKLQotICAgIG1fZGF0YS0+bV9zb2xpZEZpbGxCcnVzaCA9IG51bGxwdHI7Ci0K
LSAgICBtX2RhdGEtPm1fc29saWRGaWxsQnJ1c2ggPSBicnVzaFdpdGhDb2xvcihmaWxsQ29sb3Io
KSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBwbGF0Zm9ybUNvbnRl
eHQoKS0+bV9zb2xpZEZpbGxCcnVzaCA9IGJydXNoV2l0aENvbG9yKGZpbGxDb2xvcigpKTsKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU2hvdWxkQW50aWFsaWFzKGJvb2wg
ZW5hYmxlKQpAQCAtMTg5MCw5ICsxMTcwLDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBs
YXRmb3JtU2hvdWxkQQogICAgICAgICByZXR1cm47CiAKICAgICBBU1NFUlQoIW1faW1wbCk7Ci0K
LSAgICBhdXRvIGFudGlhbGlhc01vZGUgPSBlbmFibGUgPyBEMkQxX0FOVElBTElBU19NT0RFX1BF
Ul9QUklNSVRJVkUgOiBEMkQxX0FOVElBTElBU19NT0RFX0FMSUFTRUQ7Ci0gICAgcGxhdGZvcm1D
b250ZXh0KCktPlNldEFudGlhbGlhc01vZGUoYW50aWFsaWFzTW9kZSk7CisgICAgQVNTRVJUKGhh
c1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6U3RhdGU6OnNldFNob3VsZEFudGlh
bGlhcygqcGxhdGZvcm1Db250ZXh0KCksIGVuYWJsZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0OjpzZXRQbGF0Zm9ybVNob3VsZFNtb290aEZvbnRzKGJvb2wgZW5hYmxlKQpAQCAtMTkwMyw3
ICsxMTgyLDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU2hvdWxkUwogICAg
IEFTU0VSVCghbV9pbXBsKTsKIAogICAgIGF1dG8gZm9udFNtb290aGluZ01vZGUgPSBlbmFibGUg
PyBEMkQxX1RFWFRfQU5USUFMSUFTX01PREVfQ0xFQVJUWVBFIDogRDJEMV9URVhUX0FOVElBTElB
U19NT0RFX0FMSUFTRUQ7Ci0gICAgcGxhdGZvcm1Db250ZXh0KCktPlNldFRleHRBbnRpYWxpYXNN
b2RlKGZvbnRTbW9vdGhpbmdNb2RlKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+cmVuZGVyVGFy
Z2V0KCktPlNldFRleHRBbnRpYWxpYXNNb2RlKGZvbnRTbW9vdGhpbmdNb2RlKTsKIH0KIAogdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtQWxwaGEoZmxvYXQgYWxwaGEpCkBAIC0xOTE1
LDEyMSArMTE5NCwxNSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1BbHBoYShm
CiAgICAgbV9kYXRhLT5zZXRBbHBoYShhbHBoYSk7CiB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0
OjpzZXRQbGF0Zm9ybUNvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvciBtb2RlLCBC
bGVuZE1vZGUgYmxlbmRNb2RlKQordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtQ29t
cG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wZXJhdG9yLCBCbGVu
ZE1vZGUgYmxlbmRNb2RlKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAg
IHJldHVybjsKIAogICAgIEFTU0VSVCghbV9pbXBsKTsKIAotICAgIEQyRDFfQkxFTkRfTU9ERSB0
YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfU0NSRUVOOwotICAgIEQyRDFfQ09NUE9T
SVRFX01PREUgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRFX01PREVfU09VUkNF
X0FUT1A7IC8vID8/PwotCi0gICAgaWYgKGJsZW5kTW9kZSAhPSBCbGVuZE1vZGU6Ok5vcm1hbCkg
ewotICAgICAgICBzd2l0Y2ggKGJsZW5kTW9kZSkgewotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6
TXVsdGlwbHk6Ci0gICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVf
TVVMVElQTFk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OlNj
cmVlbjoKLSAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9TQ1JF
RU47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6Ok92ZXJsYXk6
Ci0gICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfT1ZFUkxBWTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6RGFya2VuOgotICAg
ICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0RBUktFTjsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6TGlnaHRlbjoKLSAgICAgICAg
ICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9MSUdIVEVOOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpDb2xvckRvZGdlOgotICAgICAgICAg
ICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0NPTE9SX0RPREdFOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpDb2xvckJ1cm46Ci0gICAgICAg
ICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfQ09MT1JfQlVSTjsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6SGFyZExpZ2h0OgotICAgICAg
ICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0hBUkRfTElHSFQ7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OlNvZnRMaWdodDoKLSAgICAg
ICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9TT0ZUX0xJR0hUOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpEaWZmZXJlbmNlOgotICAg
ICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0RJRkZFUkVOQ0U7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OkV4Y2x1c2lvbjoKLSAg
ICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9FWENMVVNJT047Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6Okh1ZToKLSAgICAgICAg
ICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9IVUU7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OlNhdHVyYXRpb246Ci0gICAgICAgICAgICB0
YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfU0FUVVJBVElPTjsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6Q29sb3I6Ci0gICAgICAgICAgICB0YXJn
ZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfQ09MT1I7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBCbGVuZE1vZGU6Okx1bWlub3NpdHk6Ci0gICAgICAgICAgICB0YXJnZXRC
bGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfTFVNSU5PU0lUWTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6UGx1c0RhcmtlcjoKLSAgICAgICAgICAgIHRhcmdl
dEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9EQVJLRVJfQ09MT1I7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OlBsdXNMaWdodGVyOgotICAgICAgICAgICAg
dGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0xJR0hURVJfQ09MT1I7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgIGNhc2Ug
Q29tcG9zaXRlQ2xlYXI6Ci0gICAgICAgICAgICAvLyBGSVhNRTogdGFyZ2V0QmxlbmRNb2RlID0g
RDJEMV9CTEVORF9NT0RFX0NMRUFSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ug
Q29tcG9zaXRlQ29weToKLSAgICAgICAgICAgIC8vIEZJWE1FOiB0YXJnZXRCbGVuZE1vZGUgPSBE
MkQxX0JMRU5EX01PREVfQ09QWTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENv
bXBvc2l0ZVNvdXJjZU92ZXI6Ci0gICAgICAgICAgICAvLyBGSVhNRToga0NHQmxlbmRNb2RlTm9y
bWFsCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VJbjoK
LSAgICAgICAgICAgIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX1NP
VVJDRV9JTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJj
ZU91dDoKLSAgICAgICAgICAgIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9N
T0RFX1NPVVJDRV9PVVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb21wb3Np
dGVTb3VyY2VBdG9wOgotICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09N
UE9TSVRFX01PREVfU09VUkNFX0FUT1A7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2Fz
ZSBDb21wb3NpdGVEZXN0aW5hdGlvbk92ZXI6Ci0gICAgICAgICAgICB0YXJnZXRDb21wb3NpdGVN
b2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9ERVNUSU5BVElPTl9PVkVSOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25JbjoKLSAgICAgICAgICAg
IHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX0RFU1RJTkFUSU9OX0lO
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25P
dXQ6Ci0gICAgICAgICAgICB0YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9E
RV9ERVNUSU5BVElPTl9PVVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb21w
b3NpdGVEZXN0aW5hdGlvbkF0b3A6Ci0gICAgICAgICAgICB0YXJnZXRDb21wb3NpdGVNb2RlID0g
RDJEMV9DT01QT1NJVEVfTU9ERV9ERVNUSU5BVElPTl9BVE9QOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlWE9SOgotICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRl
TW9kZSA9IEQyRDFfQ09NUE9TSVRFX01PREVfWE9SOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgQ29tcG9zaXRlUGx1c0RhcmtlcjoKLSAgICAgICAgICAgIHRhcmdldEJsZW5kTW9k
ZSA9IEQyRDFfQkxFTkRfTU9ERV9EQVJLRVJfQ09MT1I7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBDb21wb3NpdGVQbHVzTGlnaHRlcjoKLSAgICAgICAgICAgIHRhcmdldEJsZW5k
TW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9MSUdIVEVSX0NPTE9SOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlRGlmZmVyZW5jZToKLSAgICAgICAgICAgIHRhcmdldEJs
ZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9ESUZGRVJFTkNFOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtX2RhdGEtPm1fYmxlbmRNb2RlID0gdGFyZ2V0Qmxl
bmRNb2RlOwotICAgIG1fZGF0YS0+bV9jb21wb3NpdGVNb2RlID0gdGFyZ2V0Q29tcG9zaXRlTW9k
ZTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpTdGF0
ZTo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKCpwbGF0Zm9ybUNvbnRleHQoKSwgY29tcG9zaXRlT3Bl
cmF0b3IsIGJsZW5kTW9kZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybUFw
cGx5RGV2aWNlU2NhbGVGYWN0b3IoZmxvYXQgZGV2aWNlU2NhbGVGYWN0b3IpCkBAIC0yMDUwLDEz
ICsxMjIzLDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtRmlsbEVsbGlwcwogICAg
ICAgICByZXR1cm47CiAgICAgfQogCi0gICAgYXV0byBkMmRFbGxpcHNlID0gRDJEMTo6RWxsaXBz
ZShlbGxpcHNlLmNlbnRlcigpLCAwLjUgKiBlbGxpcHNlLndpZHRoKCksIDAuNSAqIGVsbGlwc2Uu
aGVpZ2h0KCkpOwotCi0gICAgcGxhdGZvcm1Db250ZXh0KCktPlNldFRhZ3MoMSwgX19MSU5FX18p
OwotCi0gICAgZHJhd1dpdGhvdXRTaGFkb3coZWxsaXBzZSwgW3RoaXMsIGQyZEVsbGlwc2VdKElE
MkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgcmVuZGVyVGFyZ2V0LT5G
aWxsRWxsaXBzZSgmZDJkRWxsaXBzZSwgc29saWRGaWxsQnJ1c2goKSk7Ci0gICAgfSk7CisgICAg
QVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6ZmlsbEVsbGlwc2Uo
KnBsYXRmb3JtQ29udGV4dCgpLCBlbGxpcHNlLCBtX3N0YXRlLmZpbGxDb2xvciwgbV9zdGF0ZS5z
dHJva2VTdHlsZSwgbV9zdGF0ZS5zdHJva2VDb2xvciwgbV9zdGF0ZS5zdHJva2VUaGlja25lc3Mp
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1TdHJva2VFbGxpcHNlKGNvbnN0
IEZsb2F0UmVjdCYgZWxsaXBzZSkKQEAgLTIwNzIsMTMgKzEyNDAsOCBAQCB2b2lkIEdyYXBoaWNz
Q29udGV4dDo6cGxhdGZvcm1TdHJva2VFbGxpCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAg
ICBhdXRvIGQyZEVsbGlwc2UgPSBEMkQxOjpFbGxpcHNlKGVsbGlwc2UuY2VudGVyKCksIDAuNSAq
IGVsbGlwc2Uud2lkdGgoKSwgMC41ICogZWxsaXBzZS5oZWlnaHQoKSk7Ci0KLSAgICBwbGF0Zm9y
bUNvbnRleHQoKS0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAgICBkcmF3V2l0aG91dFNoYWRv
dyhlbGxpcHNlLCBbdGhpcywgZDJkRWxsaXBzZV0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRh
cmdldCkgewotICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdFbGxpcHNlKCZkMmRFbGxpcHNlLCBz
b2xpZFN0cm9rZUJydXNoKCksIHN0cm9rZVRoaWNrbmVzcygpLCBtX2RhdGEtPnN0cm9rZVN0eWxl
KCkpOwotICAgIH0pOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGly
ZWN0MkQ6OmRyYXdFbGxpcHNlKCpwbGF0Zm9ybUNvbnRleHQoKSwgZWxsaXBzZSwgbV9zdGF0ZS5z
dHJva2VTdHlsZSwgbV9zdGF0ZS5zdHJva2VDb2xvciwgbV9zdGF0ZS5zdHJva2VUaGlja25lc3Mp
OwogfQogCiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3Jh
cGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmNwcAko
bm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3Jh
cGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQx
MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmgi
CisKKyNpZiBVU0UoRElSRUNUMkQpCisKKyNpbmNsdWRlICJEaXJlY3QyRE9wZXJhdGlvbnMuaCIK
KyNpbmNsdWRlICJGbG9hdFJvdW5kZWRSZWN0LmgiCisjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1
ZGUgIkdseXBoQnVmZmVyLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVk
ZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGlyZWN0MkQuaCIKKyNpbmNsdWRlICJJ
bWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1l
bnRlZC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHRJbXBsRmFjdG9y
eSBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmNyZWF0ZUZhY3RvcnkoUGxhdGZvcm1Db250
ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCkKK3sKKyAgICByZXR1cm4gR3JhcGhpY3NDb250
ZXh0OjpHcmFwaGljc0NvbnRleHRJbXBsRmFjdG9yeSgKKyAgICAgICAgWyZwbGF0Zm9ybUNvbnRl
eHRdKEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0
dXJuIHN0ZDo6bWFrZV91bmlxdWU8R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEPihjb250ZXh0
LCBwbGF0Zm9ybUNvbnRleHQpOworICAgICAgICB9KTsKK30KKworR3JhcGhpY3NDb250ZXh0OjpH
cmFwaGljc0NvbnRleHRJbXBsRmFjdG9yeSBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmNy
ZWF0ZUZhY3RvcnkoSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkKK3sKKyAgICByZXR1
cm4gR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHRJbXBsRmFjdG9yeSgKKyAgICAgICAg
W3JlbmRlclRhcmdldF0oR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0KQorICAgICAgICB7CisgICAg
ICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0
MkQ+KGNvbnRleHQsIHJlbmRlclRhcmdldCk7CisgICAgICAgIH0pOworfQorCitHcmFwaGljc0Nv
bnRleHRJbXBsRGlyZWN0MkQ6OkdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRChHcmFwaGljc0Nv
bnRleHQmIGNvbnRleHQsIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQp
CisgICAgOiBHcmFwaGljc0NvbnRleHRJbXBsKGNvbnRleHQsIEZsb2F0UmVjdCB7IH0sIEFmZmlu
ZVRyYW5zZm9ybSB7IH0pCisgICAgLCBtX3BsYXRmb3JtQ29udGV4dChwbGF0Zm9ybUNvbnRleHQp
CisgICAgLCBtX3ByaXZhdGUoc3RkOjptYWtlX3VuaXF1ZTxHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGU+KG1fcGxhdGZvcm1Db250ZXh0LCBHcmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRl
cmluZ0NvbnRleHRUeXBlOjpHUFVNZW1vcnkpKQoreworICAgIG1fcGxhdGZvcm1Db250ZXh0LnNl
dEdyYXBoaWNzQ29udGV4dFByaXZhdGUobV9wcml2YXRlLmdldCgpKTsKKyAgICBtX3ByaXZhdGUt
PnN5bmNDb250ZXh0KG1fcGxhdGZvcm1Db250ZXh0KTsKK30KKworR3JhcGhpY3NDb250ZXh0SW1w
bERpcmVjdDJEOjpHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQoR3JhcGhpY3NDb250ZXh0JiBj
b250ZXh0LCBJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KQorICAgIDogR3JhcGhpY3ND
b250ZXh0SW1wbChjb250ZXh0LCBGbG9hdFJlY3QgeyB9LCBBZmZpbmVUcmFuc2Zvcm0geyB9KQor
ICAgICwgbV9vd25lZFBsYXRmb3JtQ29udGV4dChzdGQ6Om1ha2VfdW5pcXVlPFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEPihyZW5kZXJUYXJnZXQpKQorICAgICwgbV9wbGF0Zm9ybUNvbnRleHQoKm1f
b3duZWRQbGF0Zm9ybUNvbnRleHQpCisgICAgLCBtX3ByaXZhdGUoc3RkOjptYWtlX3VuaXF1ZTxH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU+KG1fcGxhdGZvcm1Db250ZXh0LCBHcmFwaGlj
c0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1vcnkpKQoreworICAg
IG1fcGxhdGZvcm1Db250ZXh0LnNldEdyYXBoaWNzQ29udGV4dFByaXZhdGUobV9wcml2YXRlLmdl
dCgpKTsKKyAgICBtX3ByaXZhdGUtPnN5bmNDb250ZXh0KG1fcGxhdGZvcm1Db250ZXh0KTsKK30K
KworR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjp+R3JhcGhpY3NDb250ZXh0SW1wbERpcmVj
dDJEKCkKK3sKKyAgICBtX3BsYXRmb3JtQ29udGV4dC5zZXRHcmFwaGljc0NvbnRleHRQcml2YXRl
KG51bGxwdHIpOworfQorCitib29sIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6aGFzUGxh
dGZvcm1Db250ZXh0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQqIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6cGxhdGZvcm1Db250
ZXh0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gJm1fcGxhdGZvcm1Db250ZXh0OworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6dXBkYXRlU3RhdGUoY29uc3QgR3JhcGhpY3ND
b250ZXh0U3RhdGUmIHN0YXRlLCBHcmFwaGljc0NvbnRleHRTdGF0ZTo6U3RhdGVDaGFuZ2VGbGFn
cyBmbGFncykKK3sKKyAgICBpZiAoZmxhZ3MgJiBHcmFwaGljc0NvbnRleHRTdGF0ZTo6U3Ryb2tl
VGhpY2tuZXNzQ2hhbmdlKQorICAgICAgICBEaXJlY3QyRDo6U3RhdGU6OnNldFN0cm9rZVRoaWNr
bmVzcyhtX3BsYXRmb3JtQ29udGV4dCwgc3RhdGUuc3Ryb2tlVGhpY2tuZXNzKTsKKworICAgIGlm
IChmbGFncyAmIEdyYXBoaWNzQ29udGV4dFN0YXRlOjpTdHJva2VTdHlsZUNoYW5nZSkKKyAgICAg
ICAgRGlyZWN0MkQ6OlN0YXRlOjpzZXRTdHJva2VTdHlsZShtX3BsYXRmb3JtQ29udGV4dCwgc3Rh
dGUuc3Ryb2tlU3R5bGUpOworCisgICAgaWYgKGZsYWdzICYgR3JhcGhpY3NDb250ZXh0U3RhdGU6
OlNoYWRvd0NoYW5nZSkgeworICAgICAgICBpZiAoc3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9y
bXMpIHsKKyAgICAgICAgICAgIC8vIE1lYW5pbmcgdGhhdCB0aGlzIGdyYXBoaWNzIGNvbnRleHQg
aXMgYXNzb2NpYXRlZCB3aXRoIGEgQ2FudmFzUmVuZGVyaW5nQ29udGV4dAorICAgICAgICAgICAg
Ly8gV2UgZmxpcCB0aGUgaGVpZ2h0IHNpbmNlIENHIGFuZCBIVE1MNSBDYW52YXMgaGF2ZSBvcHBv
c2l0ZSBZIGF4aXMKKyAgICAgICAgICAgIGF1dG8mIG11dGFibGVTdGF0ZSA9IGNvbnN0X2Nhc3Q8
R3JhcGhpY3NDb250ZXh0U3RhdGUmPihncmFwaGljc0NvbnRleHQoKS5zdGF0ZSgpKTsKKyAgICAg
ICAgICAgIGF1dG8mIHNoYWRvd09mZnNldCA9IHN0YXRlLnNoYWRvd09mZnNldDsKKyAgICAgICAg
ICAgIG11dGFibGVTdGF0ZS5zaGFkb3dPZmZzZXQgPSB7IHNoYWRvd09mZnNldC53aWR0aCgpLCAt
c2hhZG93T2Zmc2V0LmhlaWdodCgpIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmxh
Z3MgJiBHcmFwaGljc0NvbnRleHRTdGF0ZTo6Q29tcG9zaXRlT3BlcmF0aW9uQ2hhbmdlKQorICAg
ICAgICBEaXJlY3QyRDo6U3RhdGU6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihtX3BsYXRmb3JtQ29u
dGV4dCwgc3RhdGUuY29tcG9zaXRlT3BlcmF0b3IsIHN0YXRlLmJsZW5kTW9kZSk7CisKKyAgICBp
ZiAoZmxhZ3MgJiBHcmFwaGljc0NvbnRleHRTdGF0ZTo6U2hvdWxkQW50aWFsaWFzQ2hhbmdlKQor
ICAgICAgICBEaXJlY3QyRDo6U3RhdGU6OnNldFNob3VsZEFudGlhbGlhcyhtX3BsYXRmb3JtQ29u
dGV4dCwgc3RhdGUuc2hvdWxkQW50aWFsaWFzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJ
bXBsRGlyZWN0MkQ6OmNsZWFyU2hhZG93KCkKK3sKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJ
bXBsRGlyZWN0MkQ6OnNldExpbmVDYXAoTGluZUNhcCBsaW5lQ2FwKQoreworICAgIERpcmVjdDJE
OjpzZXRMaW5lQ2FwKG1fcGxhdGZvcm1Db250ZXh0LCBsaW5lQ2FwKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnNldExpbmVEYXNoKGNvbnN0IERhc2hBcnJheSYgZGFz
aGVzLCBmbG9hdCBkYXNoT2Zmc2V0KQoreworICAgIERpcmVjdDJEOjpzZXRMaW5lRGFzaChtX3Bs
YXRmb3JtQ29udGV4dCwgZGFzaGVzLCBkYXNoT2Zmc2V0KTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHRJbXBsRGlyZWN0MkQ6OnNldExpbmVKb2luKExpbmVKb2luIGxpbmVKb2luKQoreworICAg
IERpcmVjdDJEOjpzZXRMaW5lSm9pbihtX3BsYXRmb3JtQ29udGV4dCwgbGluZUpvaW4pOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6c2V0TWl0ZXJMaW1pdChmbG9hdCBt
aXRlckxpbWl0KQoreworICAgIERpcmVjdDJEOjpzZXRNaXRlckxpbWl0KG1fcGxhdGZvcm1Db250
ZXh0LCBtaXRlckxpbWl0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6
OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBhdXRvJiBzdGF0ZSA9IGdy
YXBoaWNzQ29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmZpbGxSZWN0KG1fcGxhdGZv
cm1Db250ZXh0LCByZWN0LCBEaXJlY3QyRDo6RmlsbFNvdXJjZShzdGF0ZSwgbV9wbGF0Zm9ybUNv
bnRleHQpLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoc3RhdGUpKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHRJbXBsRGlyZWN0MkQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29u
c3QgQ29sb3ImIGNvbG9yKQoreworICAgIERpcmVjdDJEOjpmaWxsUmVjdChtX3BsYXRmb3JtQ29u
dGV4dCwgcmVjdCwgY29sb3IsIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShncmFwaGljc0NvbnRleHQo
KS5zdGF0ZSgpKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpmaWxs
UmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIEdyYWRpZW50JiBncmFkaWVudCkKK3sKKyAgICBh
dXRvIHBsYXRmb3JtR3JhZGllbnQgPSBhZG9wdENPTShncmFkaWVudC5jcmVhdGVQbGF0Zm9ybUdy
YWRpZW50SWZOZWNlc3NhcnkobV9wbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpKTsKKyAg
ICBpZiAoIXBsYXRmb3JtR3JhZGllbnQpCisgICAgICAgIHJldHVybjsKKworICAgIERpcmVjdDJE
OjpzYXZlKG1fcGxhdGZvcm1Db250ZXh0KTsKKyAgICBEaXJlY3QyRDo6ZmlsbFJlY3RXaXRoR3Jh
ZGllbnQobV9wbGF0Zm9ybUNvbnRleHQsIHJlY3QsIHBsYXRmb3JtR3JhZGllbnQuZ2V0KCkpOwor
ICAgIERpcmVjdDJEOjpyZXN0b3JlKG1fcGxhdGZvcm1Db250ZXh0KTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwg
Y29uc3QgQ29sb3ImIGNvbG9yLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcGVyYXRvciwg
QmxlbmRNb2RlIGJsZW5kTW9kZSkKK3sKKyAgICBhdXRvJiBzdGF0ZSA9IGdyYXBoaWNzQ29udGV4
dCgpLnN0YXRlKCk7CisgICAgQ29tcG9zaXRlT3BlcmF0b3IgcHJldmlvdXNPcGVyYXRvciA9IHN0
YXRlLmNvbXBvc2l0ZU9wZXJhdG9yOworCisgICAgRGlyZWN0MkQ6OlN0YXRlOjpzZXRDb21wb3Np
dGVPcGVyYXRpb24obV9wbGF0Zm9ybUNvbnRleHQsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1v
ZGUpOworICAgIERpcmVjdDJEOjpmaWxsUmVjdChtX3BsYXRmb3JtQ29udGV4dCwgcmVjdCwgY29s
b3IsIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0ZSkpOworICAgIERpcmVjdDJEOjpTdGF0ZTo6
c2V0Q29tcG9zaXRlT3BlcmF0aW9uKG1fcGxhdGZvcm1Db250ZXh0LCBwcmV2aW91c09wZXJhdG9y
LCBCbGVuZE1vZGU6Ok5vcm1hbCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVj
dDJEOjpmaWxsUm91bmRlZFJlY3QoY29uc3QgRmxvYXRSb3VuZGVkUmVjdCYgcmVjdCwgY29uc3Qg
Q29sb3ImIGNvbG9yLCBCbGVuZE1vZGUgYmxlbmRNb2RlKQoreworICAgIGF1dG8mIHN0YXRlID0g
Z3JhcGhpY3NDb250ZXh0KCkuc3RhdGUoKTsKKworICAgIENvbXBvc2l0ZU9wZXJhdG9yIHByZXZp
b3VzT3BlcmF0b3IgPSBzdGF0ZS5jb21wb3NpdGVPcGVyYXRvcjsKKyAgICBEaXJlY3QyRDo6U3Rh
dGU6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihtX3BsYXRmb3JtQ29udGV4dCwgcHJldmlvdXNPcGVy
YXRvciwgYmxlbmRNb2RlKTsKKworICAgIERpcmVjdDJEOjpTaGFkb3dTdGF0ZSBzaGFkb3dTdGF0
ZShzdGF0ZSk7CisgICAgaWYgKHJlY3QuaXNSb3VuZGVkKCkpCisgICAgICAgIERpcmVjdDJEOjpm
aWxsUm91bmRlZFJlY3QobV9wbGF0Zm9ybUNvbnRleHQsIHJlY3QsIGNvbG9yLCBzaGFkb3dTdGF0
ZSk7CisgICAgZWxzZQorICAgICAgICBEaXJlY3QyRDo6ZmlsbFJlY3QobV9wbGF0Zm9ybUNvbnRl
eHQsIHJlY3QucmVjdCgpLCBjb2xvciwgc2hhZG93U3RhdGUpOworCisgICAgRGlyZWN0MkQ6OlN0
YXRlOjpzZXRDb21wb3NpdGVPcGVyYXRpb24obV9wbGF0Zm9ybUNvbnRleHQsIHByZXZpb3VzT3Bl
cmF0b3IsIEJsZW5kTW9kZTo6Tm9ybWFsKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBs
RGlyZWN0MkQ6OmZpbGxSZWN0V2l0aFJvdW5kZWRIb2xlKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwg
Y29uc3QgRmxvYXRSb3VuZGVkUmVjdCYgcm91bmRlZEhvbGVSZWN0LCBjb25zdCBDb2xvciYpCit7
CisgICAgRGlyZWN0MkQ6OmZpbGxSZWN0V2l0aFJvdW5kZWRIb2xlKG1fcGxhdGZvcm1Db250ZXh0
LCByZWN0LCByb3VuZGVkSG9sZVJlY3QsIHsgfSwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKGdyYXBo
aWNzQ29udGV4dCgpLnN0YXRlKCkpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGly
ZWN0MkQ6OmZpbGxQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgYXV0byYgc3RhdGUgPSBn
cmFwaGljc0NvbnRleHQoKS5zdGF0ZSgpOworICAgIERpcmVjdDJEOjpmaWxsUGF0aChtX3BsYXRm
b3JtQ29udGV4dCwgcGF0aCwgRGlyZWN0MkQ6OkZpbGxTb3VyY2Uoc3RhdGUsIG1fcGxhdGZvcm1D
b250ZXh0KSwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0YXRlKSk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0SW1wbERpcmVjdDJEOjpmaWxsRWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHJlY3Qp
Cit7CisgICAgUGF0aCBwYXRoOworICAgIHBhdGguYWRkRWxsaXBzZShyZWN0KTsKKyAgICBmaWxs
UGF0aChwYXRoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnN0cm9r
ZVJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBmbG9hdCBsaW5lV2lkdGgpCit7CisgICAgYXV0
byYgc3RhdGUgPSBncmFwaGljc0NvbnRleHQoKS5zdGF0ZSgpOworICAgIERpcmVjdDJEOjpzdHJv
a2VSZWN0KG1fcGxhdGZvcm1Db250ZXh0LCByZWN0LCBsaW5lV2lkdGgsIERpcmVjdDJEOjpTdHJv
a2VTb3VyY2Uoc3RhdGUsIG1fcGxhdGZvcm1Db250ZXh0KSwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRl
KHN0YXRlKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpzdHJva2VQ
YXRoKGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgYXV0byYgc3RhdGUgPSBncmFwaGljc0NvbnRl
eHQoKS5zdGF0ZSgpOworICAgIERpcmVjdDJEOjpzdHJva2VQYXRoKG1fcGxhdGZvcm1Db250ZXh0
LCBwYXRoLCBEaXJlY3QyRDo6U3Ryb2tlU291cmNlKHN0YXRlLCBtX3BsYXRmb3JtQ29udGV4dCks
IERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0ZSkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dEltcGxEaXJlY3QyRDo6c3Ryb2tlRWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7Cisg
ICAgUGF0aCBwYXRoOworICAgIHBhdGguYWRkRWxsaXBzZShyZWN0KTsKKyAgICBzdHJva2VQYXRo
KHBhdGgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6Y2xlYXJSZWN0
KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBEaXJlY3QyRDo6Y2xlYXJSZWN0KG1fcGxh
dGZvcm1Db250ZXh0LCByZWN0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0
MkQ6OmRyYXdHbHlwaHMoY29uc3QgRm9udCYgZm9udCwgY29uc3QgR2x5cGhCdWZmZXImIGdseXBo
QnVmZmVyLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9p
bnQmIHBvaW50LCBGb250U21vb3RoaW5nTW9kZSBmb250U21vb3RoaW5nKQoreworICAgIFVOVVNF
RF9QQVJBTShmb250U21vb3RoaW5nKTsKKyAgICBpZiAoIWZvbnQucGxhdGZvcm1EYXRhKCkuc2l6
ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitJbWFn
ZURyYXdSZXN1bHQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpkcmF3SW1hZ2UoSW1hZ2Um
IGltYWdlLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RpbmF0aW9uLCBjb25zdCBGbG9hdFJlY3QmIHNv
dXJjZSwgY29uc3QgSW1hZ2VQYWludGluZ09wdGlvbnMmIGltYWdlUGFpbnRpbmdPcHRpb25zKQor
eworICAgIHJldHVybiBHcmFwaGljc0NvbnRleHRJbXBsOjpkcmF3SW1hZ2VJbXBsKGdyYXBoaWNz
Q29udGV4dCgpLCBpbWFnZSwgZGVzdGluYXRpb24sIHNvdXJjZSwgaW1hZ2VQYWludGluZ09wdGlv
bnMpOworfQorCitJbWFnZURyYXdSZXN1bHQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpk
cmF3VGlsZWRJbWFnZShJbWFnZSYgaW1hZ2UsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdGluYXRpb24s
IGNvbnN0IEZsb2F0UG9pbnQmIHNvdXJjZSwgY29uc3QgRmxvYXRTaXplJiB0aWxlU2l6ZSwgY29u
c3QgRmxvYXRTaXplJiBzcGFjaW5nLCBjb25zdCBJbWFnZVBhaW50aW5nT3B0aW9ucyYgaW1hZ2VQ
YWludGluZ09wdGlvbnMpCit7CisgICAgcmV0dXJuIEdyYXBoaWNzQ29udGV4dEltcGw6OmRyYXdU
aWxlZEltYWdlSW1wbChncmFwaGljc0NvbnRleHQoKSwgaW1hZ2UsIGRlc3RpbmF0aW9uLCBzb3Vy
Y2UsIHRpbGVTaXplLCBzcGFjaW5nLCBpbWFnZVBhaW50aW5nT3B0aW9ucyk7Cit9CisKK0ltYWdl
RHJhd1Jlc3VsdCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdUaWxlZEltYWdlKElt
YWdlJiBpbWFnZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0aW5hdGlvbiwgY29uc3QgRmxvYXRSZWN0
JiBzb3VyY2UsIGNvbnN0IEZsb2F0U2l6ZSYgdGlsZVNjYWxlRmFjdG9yLCBJbWFnZTo6VGlsZVJ1
bGUgaFJ1bGUsIEltYWdlOjpUaWxlUnVsZSB2UnVsZSwgY29uc3QgSW1hZ2VQYWludGluZ09wdGlv
bnMmIGltYWdlUGFpbnRpbmdPcHRpb25zKQoreworICAgIHJldHVybiBHcmFwaGljc0NvbnRleHRJ
bXBsOjpkcmF3VGlsZWRJbWFnZUltcGwoZ3JhcGhpY3NDb250ZXh0KCksIGltYWdlLCBkZXN0aW5h
dGlvbiwgc291cmNlLCB0aWxlU2NhbGVGYWN0b3IsIGhSdWxlLCB2UnVsZSwgaW1hZ2VQYWludGlu
Z09wdGlvbnMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZHJhd05h
dGl2ZUltYWdlKGNvbnN0IE5hdGl2ZUltYWdlUHRyJiBpbWFnZSwgY29uc3QgRmxvYXRTaXplJiBp
bWFnZVNpemUsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3Jj
UmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSBibGVu
ZE1vZGUsIEltYWdlT3JpZW50YXRpb24gb3JpZW50YXRpb24pCit7CisgICAgYXV0byYgc3RhdGUg
PSBncmFwaGljc0NvbnRleHQoKS5zdGF0ZSgpOworICAgIERpcmVjdDJEOjpkcmF3TmF0aXZlSW1h
Z2UobV9wbGF0Zm9ybUNvbnRleHQsIGltYWdlLmdldCgpLCBpbWFnZVNpemUsIGRlc3RSZWN0LCBz
cmNSZWN0LCBjb21wb3NpdGVPcGVyYXRvciwgYmxlbmRNb2RlLCBvcmllbnRhdGlvbiwgc3RhdGUu
aW1hZ2VJbnRlcnBvbGF0aW9uUXVhbGl0eSwgc3RhdGUuYWxwaGEsIERpcmVjdDJEOjpTaGFkb3dT
dGF0ZShzdGF0ZSkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZHJh
d1BhdHRlcm4oSW1hZ2UmIGltYWdlLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBG
bG9hdFJlY3QmIHRpbGVSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zv
cm0sIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBjb25zdCBGbG9hdFNpemUmLCBDb21wb3NpdGVP
cGVyYXRvciBjb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlIGJsZW5kTW9kZSkKK3sKKyAgICBp
ZiAoYXV0byBzdXJmYWNlID0gaW1hZ2UubmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKSkKKyAg
ICAgICAgRGlyZWN0MkQ6OmRyYXdQYXR0ZXJuKG1fcGxhdGZvcm1Db250ZXh0LCBzdXJmYWNlLmdl
dCgpLCBJbnRTaXplKGltYWdlLnNpemUoKSksIGRlc3RSZWN0LCB0aWxlUmVjdCwgcGF0dGVyblRy
YW5zZm9ybSwgcGhhc2UsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZHJhd1JlY3QoY29uc3QgRmxvYXRSZWN0JiBy
ZWN0LCBmbG9hdCBib3JkZXJUaGlja25lc3MpCit7CisgICAgYXV0byYgc3RhdGUgPSBncmFwaGlj
c0NvbnRleHQoKS5zdGF0ZSgpOworICAgIERpcmVjdDJEOjpkcmF3UmVjdChtX3BsYXRmb3JtQ29u
dGV4dCwgcmVjdCwgYm9yZGVyVGhpY2tuZXNzLCBzdGF0ZS5maWxsQ29sb3IsIHN0YXRlLnN0cm9r
ZVN0eWxlLCBzdGF0ZS5zdHJva2VDb2xvcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1w
bERpcmVjdDJEOjpkcmF3TGluZShjb25zdCBGbG9hdFBvaW50JiBwb2ludDEsIGNvbnN0IEZsb2F0
UG9pbnQmIHBvaW50MikKK3sKKyAgICBhdXRvJiBzdGF0ZSA9IGdyYXBoaWNzQ29udGV4dCgpLnN0
YXRlKCk7CisgICAgRGlyZWN0MkQ6OmRyYXdMaW5lKG1fcGxhdGZvcm1Db250ZXh0LCBwb2ludDEs
IHBvaW50Miwgc3RhdGUuc3Ryb2tlU3R5bGUsIHN0YXRlLnN0cm9rZUNvbG9yLCBzdGF0ZS5zdHJv
a2VUaGlja25lc3MsIHN0YXRlLnNob3VsZEFudGlhbGlhcyk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0SW1wbERpcmVjdDJEOjpkcmF3TGluZXNGb3JUZXh0KGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50LCBmbG9hdCB0aGlja25lc3MsIGNvbnN0IERhc2hBcnJheSYgd2lkdGhzLCBib29sIHByaW50
aW5nLCBib29sIGRvdWJsZVVuZGVybGluZXMpCit7CisgICAgYXV0byYgc3RhdGUgPSBncmFwaGlj
c0NvbnRleHQoKS5zdGF0ZSgpOworICAgIERpcmVjdDJEOjpkcmF3TGluZXNGb3JUZXh0KG1fcGxh
dGZvcm1Db250ZXh0LCBwb2ludCwgdGhpY2tuZXNzLCB3aWR0aHMsIHByaW50aW5nLCBkb3VibGVV
bmRlcmxpbmVzLCBzdGF0ZS5zdHJva2VDb2xvcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
SW1wbERpcmVjdDJEOjpkcmF3RG90c0ZvckRvY3VtZW50TWFya2VyKGNvbnN0IEZsb2F0UmVjdCYg
cmVjdCwgRG9jdW1lbnRNYXJrZXJMaW5lU3R5bGUgc3R5bGUpCit7CisgICAgRGlyZWN0MkQ6OmRy
YXdEb3RzRm9yRG9jdW1lbnRNYXJrZXIobV9wbGF0Zm9ybUNvbnRleHQsIHJlY3QsIHN0eWxlKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdFbGxpcHNlKGNvbnN0
IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBhdXRvJiBzdGF0ZSA9IGdyYXBoaWNzQ29udGV4dCgp
LnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmZpbGxFbGxpcHNlKCpwbGF0Zm9ybUNvbnRleHQoKSwg
cmVjdCwgc3RhdGUuZmlsbENvbG9yLCBzdGF0ZS5zdHJva2VTdHlsZSwgc3RhdGUuc3Ryb2tlQ29s
b3IsIHN0YXRlLnN0cm9rZVRoaWNrbmVzcyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1w
bERpcmVjdDJEOjpkcmF3UGF0aChjb25zdCBQYXRoJikKK3sKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgUGF0aCYgcGF0aCwgZmxvYXQg
d2lkdGgsIGZsb2F0IG9mZnNldCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIFVOVVNFRF9Q
QVJBTShvZmZzZXQpOworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0SW1wbERpcmVjdDJEOjpkcmF3Rm9jdXNSaW5nKGNvbnN0IFZlY3RvcjxGbG9hdFJlY3Q+
JiByZWN0cywgZmxvYXQgd2lkdGgsIGZsb2F0IG9mZnNldCwgY29uc3QgQ29sb3ImIGNvbG9yKQor
eworICAgIFVOVVNFRF9QQVJBTShvZmZzZXQpOworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpzYXZlKCkKK3sKKyAgICBEaXJlY3Qy
RDo6c2F2ZShtX3BsYXRmb3JtQ29udGV4dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1w
bERpcmVjdDJEOjpyZXN0b3JlKCkKK3sKKyAgICBEaXJlY3QyRDo6cmVzdG9yZShtX3BsYXRmb3Jt
Q29udGV4dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjp0cmFuc2xh
dGUoZmxvYXQgeCwgZmxvYXQgeSkKK3sKKyAgICBEaXJlY3QyRDo6dHJhbnNsYXRlKG1fcGxhdGZv
cm1Db250ZXh0LCB4LCB5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6
OnJvdGF0ZShmbG9hdCBhbmdsZUluUmFkaWFucykKK3sKKyAgICBEaXJlY3QyRDo6cm90YXRlKG1f
cGxhdGZvcm1Db250ZXh0LCBhbmdsZUluUmFkaWFucyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0SW1wbERpcmVjdDJEOjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7CisgICAgRGly
ZWN0MkQ6OnNjYWxlKG1fcGxhdGZvcm1Db250ZXh0LCBzaXplKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHRJbXBsRGlyZWN0MkQ6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRy
YW5zZm9ybSkKK3sKKyAgICBEaXJlY3QyRDo6Y29uY2F0Q1RNKG1fcGxhdGZvcm1Db250ZXh0LCB0
cmFuc2Zvcm0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6c2V0Q1RN
KGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQoreworICAgIERpcmVjdDJEOjpTdGF0
ZTo6c2V0Q1RNKG1fcGxhdGZvcm1Db250ZXh0LCB0cmFuc2Zvcm0pOworfQorCitBZmZpbmVUcmFu
c2Zvcm0gR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpnZXRDVE0oR3JhcGhpY3NDb250ZXh0
OjpJbmNsdWRlRGV2aWNlU2NhbGUpCit7CisgICAgcmV0dXJuIERpcmVjdDJEOjpTdGF0ZTo6Z2V0
Q1RNKG1fcGxhdGZvcm1Db250ZXh0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGly
ZWN0MkQ6OmJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoZmxvYXQgb3BhY2l0eSkKK3sKKyAgICBEaXJl
Y3QyRDo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcihtX3BsYXRmb3JtQ29udGV4dCwgb3BhY2l0eSk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjplbmRUcmFuc3BhcmVuY3lM
YXllcigpCit7CisgICAgRGlyZWN0MkQ6OmVuZFRyYW5zcGFyZW5jeUxheWVyKG1fcGxhdGZvcm1D
b250ZXh0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmNsaXAoY29u
c3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIERpcmVjdDJEOjpjbGlwKG1fcGxhdGZvcm1Db250
ZXh0LCByZWN0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmNsaXBP
dXQoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIERpcmVjdDJEOjpjbGlwT3V0KG1fcGxh
dGZvcm1Db250ZXh0LCByZWN0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0
MkQ6OmNsaXBPdXQoY29uc3QgUGF0aCYgcGF0aCkKK3sKKyAgICBEaXJlY3QyRDo6Y2xpcE91dCht
X3BsYXRmb3JtQ29udGV4dCwgcGF0aCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERp
cmVjdDJEOjpjbGlwUGF0aChjb25zdCBQYXRoJiBwYXRoLCBXaW5kUnVsZSBjbGlwUnVsZSkKK3sK
KyAgICBEaXJlY3QyRDo6Y2xpcFBhdGgobV9wbGF0Zm9ybUNvbnRleHQsIHBhdGgsIGNsaXBSdWxl
KTsKK30KKworSW50UmVjdCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmNsaXBCb3VuZHMo
KQoreworICAgIHJldHVybiBEaXJlY3QyRDo6U3RhdGU6OmdldENsaXBCb3VuZHMobV9wbGF0Zm9y
bUNvbnRleHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6Y2xpcFRv
SW1hZ2VCdWZmZXIoSW1hZ2VCdWZmZXImIGJ1ZmZlciwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVj
dCkKK3sKKyAgICBSZWZQdHI8SW1hZ2U+IGltYWdlID0gYnVmZmVyLmNvcHlJbWFnZShEb250Q29w
eUJhY2tpbmdTdG9yZSk7CisgICAgaWYgKCFpbWFnZSkKKyAgICAgICAgcmV0dXJuOworCisKKyAg
ICBpZiAoYXV0byBzdXJmYWNlID0gaW1hZ2UtPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCkp
CisgICAgICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1w
bERpcmVjdDJEOjphcHBseURldmljZVNjYWxlRmFjdG9yKGZsb2F0KQoreworfQorCitGbG9hdFJl
Y3QgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpyb3VuZFRvRGV2aWNlUGl4ZWxzKGNvbnN0
IEZsb2F0UmVjdCYgcmVjdCwgR3JhcGhpY3NDb250ZXh0OjpSb3VuZGluZ01vZGUpCit7CisgICAg
cmV0dXJuIERpcmVjdDJEOjpTdGF0ZTo6cm91bmRUb0RldmljZVBpeGVscyhtX3BsYXRmb3JtQ29u
dGV4dCwgcmVjdCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVT
RShESVJFQ1QyRCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9H
cmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmgJKG5v
bmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBo
aWNzQ29udGV4dEltcGxEaXJlY3QyRC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNwcmFnbWEg
b25jZQorCisjaWYgVVNFKERJUkVDVDJEKQorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0SW1w
bC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEOworCitjbGFzcyBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQgZmluYWwgOiBwdWJsaWMg
R3JhcGhpY3NDb250ZXh0SW1wbCB7CitwdWJsaWM6CisgICAgV0VCQ09SRV9FWFBPUlQgc3RhdGlj
IEdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0SW1wbEZhY3RvcnkgY3JlYXRlRmFjdG9y
eShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYpOworICAgIFdFQkNPUkVfRVhQT1JUIHN0YXRpYyBH
cmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dEltcGxGYWN0b3J5IGNyZWF0ZUZhY3Rvcnko
SUQyRDFSZW5kZXJUYXJnZXQqKTsKKworICAgIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRChH
cmFwaGljc0NvbnRleHQmLCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYpOworICAgIEdyYXBoaWNz
Q29udGV4dEltcGxEaXJlY3QyRChHcmFwaGljc0NvbnRleHQmLCBJRDJEMVJlbmRlclRhcmdldCop
OworICAgIHZpcnR1YWwgfkdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRCgpOworCisgICAgYm9v
bCBoYXNQbGF0Zm9ybUNvbnRleHQoKSBjb25zdCBvdmVycmlkZTsKKyAgICBQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCogcGxhdGZvcm1Db250ZXh0KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2b2lk
IHVwZGF0ZVN0YXRlKGNvbnN0IEdyYXBoaWNzQ29udGV4dFN0YXRlJiwgR3JhcGhpY3NDb250ZXh0
U3RhdGU6OlN0YXRlQ2hhbmdlRmxhZ3MpIG92ZXJyaWRlOworICAgIHZvaWQgY2xlYXJTaGFkb3co
KSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0TGluZUNhcChMaW5lQ2FwKSBvdmVycmlkZTsKKyAg
ICB2b2lkIHNldExpbmVEYXNoKGNvbnN0IERhc2hBcnJheSYsIGZsb2F0KSBvdmVycmlkZTsKKyAg
ICB2b2lkIHNldExpbmVKb2luKExpbmVKb2luKSBvdmVycmlkZTsKKyAgICB2b2lkIHNldE1pdGVy
TGltaXQoZmxvYXQpIG92ZXJyaWRlOworCisgICAgdm9pZCBmaWxsUmVjdChjb25zdCBGbG9hdFJl
Y3QmKSBvdmVycmlkZTsKKyAgICB2b2lkIGZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0
IENvbG9yJikgb3ZlcnJpZGU7CisgICAgdm9pZCBmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmLCBH
cmFkaWVudCYpIG92ZXJyaWRlOworICAgIHZvaWQgZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0Jiwg
Y29uc3QgQ29sb3ImLCBDb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlKSBvdmVycmlkZTsKKyAg
ICB2b2lkIGZpbGxSb3VuZGVkUmVjdChjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiwgY29uc3QgQ29s
b3ImLCBCbGVuZE1vZGUpIG92ZXJyaWRlOworICAgIHZvaWQgZmlsbFJlY3RXaXRoUm91bmRlZEhv
bGUoY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRSb3VuZGVkUmVjdCYsIGNvbnN0IENvbG9y
Jikgb3ZlcnJpZGU7CisgICAgdm9pZCBmaWxsUGF0aChjb25zdCBQYXRoJikgb3ZlcnJpZGU7Cisg
ICAgdm9pZCBmaWxsRWxsaXBzZShjb25zdCBGbG9hdFJlY3QmKSBvdmVycmlkZTsKKyAgICB2b2lk
IHN0cm9rZVJlY3QoY29uc3QgRmxvYXRSZWN0JiwgZmxvYXQpIG92ZXJyaWRlOworICAgIHZvaWQg
c3Ryb2tlUGF0aChjb25zdCBQYXRoJikgb3ZlcnJpZGU7CisgICAgdm9pZCBzdHJva2VFbGxpcHNl
KGNvbnN0IEZsb2F0UmVjdCYpIG92ZXJyaWRlOworICAgIHZvaWQgY2xlYXJSZWN0KGNvbnN0IEZs
b2F0UmVjdCYpIG92ZXJyaWRlOworCisgICAgdm9pZCBkcmF3R2x5cGhzKGNvbnN0IEZvbnQmLCBj
b25zdCBHbHlwaEJ1ZmZlciYsIHVuc2lnbmVkLCB1bnNpZ25lZCwgY29uc3QgRmxvYXRQb2ludCYs
IEZvbnRTbW9vdGhpbmdNb2RlKSBvdmVycmlkZTsKKworICAgIEltYWdlRHJhd1Jlc3VsdCBkcmF3
SW1hZ2UoSW1hZ2UmLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBJ
bWFnZVBhaW50aW5nT3B0aW9ucyYpIG92ZXJyaWRlOworICAgIEltYWdlRHJhd1Jlc3VsdCBkcmF3
VGlsZWRJbWFnZShJbWFnZSYsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZsb2F0UG9pbnQmLCBj
b25zdCBGbG9hdFNpemUmLCBjb25zdCBGbG9hdFNpemUmLCBjb25zdCBJbWFnZVBhaW50aW5nT3B0
aW9ucyYpIG92ZXJyaWRlOworICAgIEltYWdlRHJhd1Jlc3VsdCBkcmF3VGlsZWRJbWFnZShJbWFn
ZSYsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZsb2F0U2l6ZSYs
IEltYWdlOjpUaWxlUnVsZSwgSW1hZ2U6OlRpbGVSdWxlLCBjb25zdCBJbWFnZVBhaW50aW5nT3B0
aW9ucyYpIG92ZXJyaWRlOworICAgIHZvaWQgZHJhd05hdGl2ZUltYWdlKGNvbnN0IE5hdGl2ZUlt
YWdlUHRyJiwgY29uc3QgRmxvYXRTaXplJiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRS
ZWN0JiwgQ29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSwgSW1hZ2VPcmllbnRhdGlvbikgb3Zl
cnJpZGU7CisgICAgdm9pZCBkcmF3UGF0dGVybihJbWFnZSYsIGNvbnN0IEZsb2F0UmVjdCYsIGNv
bnN0IEZsb2F0UmVjdCYsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYsIGNvbnN0IEZsb2F0UG9pbnQm
LCBjb25zdCBGbG9hdFNpemUmLCBDb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlID0gQmxlbmRN
b2RlOjpOb3JtYWwpIG92ZXJyaWRlOworCisgICAgdm9pZCBkcmF3UmVjdChjb25zdCBGbG9hdFJl
Y3QmLCBmbG9hdCkgb3ZlcnJpZGU7CisgICAgdm9pZCBkcmF3TGluZShjb25zdCBGbG9hdFBvaW50
JiwgY29uc3QgRmxvYXRQb2ludCYpIG92ZXJyaWRlOworICAgIHZvaWQgZHJhd0xpbmVzRm9yVGV4
dChjb25zdCBGbG9hdFBvaW50JiwgZmxvYXQgdGhpY2tuZXNzLCBjb25zdCBEYXNoQXJyYXkmLCBi
b29sLCBib29sKSBvdmVycmlkZTsKKyAgICB2b2lkIGRyYXdEb3RzRm9yRG9jdW1lbnRNYXJrZXIo
Y29uc3QgRmxvYXRSZWN0JiwgRG9jdW1lbnRNYXJrZXJMaW5lU3R5bGUpIG92ZXJyaWRlOworICAg
IHZvaWQgZHJhd0VsbGlwc2UoY29uc3QgRmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisgICAgdm9pZCBk
cmF3UGF0aChjb25zdCBQYXRoJikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGRyYXdGb2N1c1Jpbmco
Y29uc3QgUGF0aCYsIGZsb2F0LCBmbG9hdCwgY29uc3QgQ29sb3ImKSBvdmVycmlkZTsKKyAgICB2
b2lkIGRyYXdGb2N1c1JpbmcoY29uc3QgVmVjdG9yPEZsb2F0UmVjdD4mLCBmbG9hdCwgZmxvYXQs
IGNvbnN0IENvbG9yJikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNhdmUoKSBvdmVycmlkZTsKKyAg
ICB2b2lkIHJlc3RvcmUoKSBvdmVycmlkZTsKKworICAgIHZvaWQgdHJhbnNsYXRlKGZsb2F0LCBm
bG9hdCkgb3ZlcnJpZGU7CisgICAgdm9pZCByb3RhdGUoZmxvYXQpIG92ZXJyaWRlOworICAgIHZv
aWQgc2NhbGUoY29uc3QgRmxvYXRTaXplJikgb3ZlcnJpZGU7CisgICAgdm9pZCBjb25jYXRDVE0o
Y29uc3QgQWZmaW5lVHJhbnNmb3JtJikgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRDVE0oY29uc3Qg
QWZmaW5lVHJhbnNmb3JtJikgb3ZlcnJpZGU7CisgICAgQWZmaW5lVHJhbnNmb3JtIGdldENUTShH
cmFwaGljc0NvbnRleHQ6OkluY2x1ZGVEZXZpY2VTY2FsZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lk
IGJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoZmxvYXQpIG92ZXJyaWRlOworICAgIHZvaWQgZW5kVHJh
bnNwYXJlbmN5TGF5ZXIoKSBvdmVycmlkZTsKKworICAgIHZvaWQgY2xpcChjb25zdCBGbG9hdFJl
Y3QmKSBvdmVycmlkZTsKKyAgICB2b2lkIGNsaXBPdXQoY29uc3QgRmxvYXRSZWN0Jikgb3ZlcnJp
ZGU7CisgICAgdm9pZCBjbGlwT3V0KGNvbnN0IFBhdGgmKSBvdmVycmlkZTsKKyAgICB2b2lkIGNs
aXBQYXRoKGNvbnN0IFBhdGgmLCBXaW5kUnVsZSkgb3ZlcnJpZGU7CisgICAgSW50UmVjdCBjbGlw
Qm91bmRzKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBjbGlwVG9JbWFnZUJ1ZmZlcihJbWFnZUJ1ZmZl
ciYsIGNvbnN0IEZsb2F0UmVjdCYpIG92ZXJyaWRlOworICAgIAorICAgIHZvaWQgYXBwbHlEZXZp
Y2VTY2FsZUZhY3RvcihmbG9hdCkgb3ZlcnJpZGU7CisKKyAgICBGbG9hdFJlY3Qgcm91bmRUb0Rl
dmljZVBpeGVscyhjb25zdCBGbG9hdFJlY3QmLCBHcmFwaGljc0NvbnRleHQ6OlJvdW5kaW5nTW9k
ZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEPiBtX293bmVkUGxhdGZvcm1Db250ZXh0OworICAgIFBsYXRmb3JtQ29udGV4
dERpcmVjdDJEJiBtX3BsYXRmb3JtQ29udGV4dDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU+IG1fcHJpdmF0ZTsKK307CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShESVJFQ1QyRCkKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVE
aXJlY3QyRC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5oCShyZXZpc2lvbiAy
NDgwMDgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlRGlyZWN0MkQuaAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiAr
MjcsNyBAQAogCiAjaW5jbHVkZSAiQ09NUHRyLmgiCiAjaW5jbHVkZSAiQ29sb3IuaCIKKyNpbmNs
dWRlICJQbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oIgogI2luY2x1ZGUgPGQyZDEuaD4KICNpbmNs
dWRlIDxkMmQxXzEuaD4KICNpbmNsdWRlIDxkMmQxZWZmZWN0cy5oPgpAQCAtMzksMTAgKzQwLDEx
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZSB7CiAgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CiBwdWJsaWM6Ci0gICAgR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKElEMkQxUmVuZGVyVGFyZ2V0KiwgR3JhcGhpY3NDb250
ZXh0OjpCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZSk7CisgICAgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgR3JhcGhpY3NDb250ZXh0OjpC
aXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZSk7CisgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlKHN0ZDo6dW5pcXVlX3B0cjxQbGF0Zm9ybUNvbnRleHREaXJlY3QyRD4mJiwgR3JhcGhp
Y3NDb250ZXh0OjpCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZSk7CiAgICAgfkdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZSgpOwogCi0gICAgZW51bSBEaXJlY3QyRExheWVyVHlwZSB7IEF4
aXNBbGlnbmVkQ2xpcCwgTGF5ZXJDbGlwIH07CisgICAgdm9pZCBzeW5jQ29udGV4dChQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRCYpOwogCiAgICAgdm9pZCBiZWdpblRyYW5zcGFyZW5jeUxheWVyKGZs
b2F0IG9wYWNpdHkpOwogICAgIHZvaWQgZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKTsKQEAgLTczLDY4
ICs3NSwyNiBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXREYXNoZXMoY29uc3QgRGFzaEFycmF5Jik7
CiAgICAgdm9pZCBzZXRBbHBoYShmbG9hdCk7CiAKKyAgICBQbGF0Zm9ybUNvbnRleHREaXJlY3Qy
RCogcGxhdGZvcm1Db250ZXh0KCkgeyByZXR1cm4gJm1fcGxhdGZvcm1Db250ZXh0OyB9CiAgICAg
SUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCgpOwotICAgIElEMkQxTGF5ZXIqIGNsaXBM
YXllcigpIGNvbnN0IHsgcmV0dXJuIG1fcmVuZGVyU3RhdGVzLmxhc3QoKS5tX2FjdGl2ZUxheWVy
LmdldCgpOyB9Ci0gICAgSUQyRDFTdHJva2VTdHlsZSogc3Ryb2tlU3R5bGUoKTsKLQotICAgIENP
TVB0cjxJRDJEMVNvbGlkQ29sb3JCcnVzaD4gYnJ1c2hXaXRoQ29sb3IoY29uc3QgRDJEMV9DT0xP
Ul9GJik7CiAKICAgICBIREMgbV9oZGMgeyBudWxscHRyIH07Ci0gICAgRDJEMV9CTEVORF9NT0RF
IG1fYmxlbmRNb2RlIHsgRDJEMV9CTEVORF9NT0RFX01VTFRJUExZIH07Ci0gICAgRDJEMV9DT01Q
T1NJVEVfTU9ERSBtX2NvbXBvc2l0ZU1vZGUgeyBEMkQxX0NPTVBPU0lURV9NT0RFX1NPVVJDRV9P
VkVSIH07CiAgICAgYm9vbCBtX3Nob3VsZEluY2x1ZGVDaGlsZFdpbmRvd3MgeyBmYWxzZSB9Owot
ICAgIGJvb2wgbV9zdHJva2VTeWxlSXNEaXJ0eSB7IGZhbHNlIH07Ci0KLSAgICBDT01QdHI8SUQy
RDFTb2xpZENvbG9yQnJ1c2g+IG1fc29saWRTdHJva2VCcnVzaDsKLSAgICBDT01QdHI8SUQyRDFT
b2xpZENvbG9yQnJ1c2g+IG1fc29saWRGaWxsQnJ1c2g7Ci0gICAgQ09NUHRyPElEMkQxQml0bWFw
QnJ1c2g+IG1fcGF0dGVyblN0cm9rZUJydXNoOwotICAgIENPTVB0cjxJRDJEMUJpdG1hcEJydXNo
PiBtX3BhdHRlcm5GaWxsQnJ1c2g7CiAKICAgICBmbG9hdCBjdXJyZW50R2xvYmFsQWxwaGEoKSBj
b25zdDsKIAogICAgIEQyRDFfU1RST0tFX1NUWUxFX1BST1BFUlRJRVMgc3Ryb2tlU3R5bGVQcm9w
ZXJ0aWVzKCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgdm9pZCByZWNvbXB1dGVTdHJva2VTdHls
ZSgpOwotCi0gICAgQ09NUHRyPElEMkQxUmVuZGVyVGFyZ2V0PiBtX3JlbmRlclRhcmdldDsKKyAg
ICBzdGQ6OnVuaXF1ZV9wdHI8UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ+IG1fb3duZWRQbGF0Zm9y
bUNvbnRleHQ7CisgICAgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIG1fcGxhdGZvcm1Db250ZXh0
OwogICAgIGNvbnN0IEdyYXBoaWNzQ29udGV4dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUg
bV9yZW5kZXJlclR5cGU7Ci0gICAgSGFzaE1hcDx1aW50MzJfdCwgQ09NUHRyPElEMkQxU29saWRD
b2xvckJydXNoPj4gbV9zb2xpZENvbG9yZWRCcnVzaENhY2hlOwotICAgIENPTVB0cjxJRDJEMVNv
bGlkQ29sb3JCcnVzaD4gbV93aGl0ZUJydXNoOwotICAgIENPTVB0cjxJRDJEMVNvbGlkQ29sb3JC
cnVzaD4gbV96ZXJvQnJ1c2g7Ci0gICAgQ09NUHRyPElEMkQxU3Ryb2tlU3R5bGU+IG1fZDJkU3Ry
b2tlU3R5bGU7Ci0KLSAgICBzdHJ1Y3QgUmVuZGVyU3RhdGUgewotICAgICAgICBDT01QdHI8SUQy
RDFEcmF3aW5nU3RhdGVCbG9jaz4gbV9kcmF3aW5nU3RhdGVCbG9jazsKLSAgICAgICAgQ09NUHRy
PElEMkQxTGF5ZXI+IG1fYWN0aXZlTGF5ZXI7Ci0gICAgICAgIFZlY3RvcjxEaXJlY3QyRExheWVy
VHlwZT4gbV9jbGlwczsKLSAgICB9OwotCi0gICAgVmVjdG9yPFJlbmRlclN0YXRlPiBtX3JlbmRl
clN0YXRlczsKLQotICAgIHN0cnVjdCBUcmFuc3BhcmVuY3lMYXllclN0YXRlIHsKLSAgICAgICAg
Q09NUHRyPElEMkQxQml0bWFwUmVuZGVyVGFyZ2V0PiByZW5kZXJUYXJnZXQ7Ci0gICAgICAgIENv
bG9yIHNoYWRvd0NvbG9yOwotICAgICAgICBGbG9hdFNpemUgc2hhZG93T2Zmc2V0OwotICAgICAg
ICBmbG9hdCBvcGFjaXR5IHsgMS4wIH07Ci0gICAgICAgIGZsb2F0IHNoYWRvd0JsdXIgeyAwIH07
Ci0gICAgICAgIGJvb2wgaGFzU2hhZG93IHsgZmFsc2UgfTsKLSAgICB9OwotICAgIFZlY3RvcjxU
cmFuc3BhcmVuY3lMYXllclN0YXRlPiBtX3RyYW5zcGFyZW5jeUxheWVyU3RhY2s7Ci0KLSAgICBE
MkQxX0NBUF9TVFlMRSBtX2xpbmVDYXAgeyBEMkQxX0NBUF9TVFlMRV9GTEFUIH07Ci0gICAgRDJE
MV9MSU5FX0pPSU4gbV9saW5lSm9pbiB7IEQyRDFfTElORV9KT0lOX01JVEVSIH07Ci0gICAgU3Ry
b2tlU3R5bGUgbV9zdHJva2VTdHlsZSB7IFNvbGlkU3Ryb2tlIH07Ci0gICAgRGFzaEFycmF5IG1f
ZGFzaGVzOwogCiAgICAgdW5zaWduZWQgYmVnaW5EcmF3Q291bnQgeyAwIH07CiAKLSAgICBmbG9h
dCBtX21pdGVyTGltaXQgeyAxMC4wZiB9OwotICAgIGZsb2F0IG1fZGFzaE9mZnNldCB7IDAgfTsK
LSAgICBmbG9hdCBtX3BhdHRlcm5XaWR0aCB7IDEuMGYgfTsKLSAgICBmbG9hdCBtX3BhdHRlcm5P
ZmZzZXQgeyAwIH07Ci0gICAgZmxvYXQgbV9zdHJva2VUaGlja25lc3MgeyAwIH07CiAgICAgZmxv
YXQgbV9hbHBoYSB7IDEuMCB9OworCisgICAgZnJpZW5kIGNsYXNzIEQyRENvbnRleHRTdGF0ZVNh
dmVyOwogfTsKIAogY2xhc3MgRDJEQ29udGV4dFN0YXRlU2F2ZXIgewpAQCAtMTQ0LDI2ICsxMDQs
MjYgQEAgcHVibGljOgogICAgICAgICAsIG1fc2F2ZUFuZFJlc3RvcmUoc2F2ZUFuZFJlc3RvcmUp
CiAgICAgewogICAgICAgICBpZiAobV9zYXZlQW5kUmVzdG9yZSkKLSAgICAgICAgICAgIG1fY29u
dGV4dC5zYXZlKCk7CisgICAgICAgICAgICBtX2NvbnRleHQubV9wbGF0Zm9ybUNvbnRleHQuc2F2
ZSgpOwogICAgIH0KIAogICAgIH5EMkRDb250ZXh0U3RhdGVTYXZlcigpCiAgICAgewogICAgICAg
ICBpZiAobV9zYXZlQW5kUmVzdG9yZSkKLSAgICAgICAgICAgIG1fY29udGV4dC5yZXN0b3JlKCk7
CisgICAgICAgICAgICBtX2NvbnRleHQubV9wbGF0Zm9ybUNvbnRleHQucmVzdG9yZSgpOwogICAg
IH0KIAogICAgIHZvaWQgc2F2ZSgpCiAgICAgewogICAgICAgICBBU1NFUlQoIW1fc2F2ZUFuZFJl
c3RvcmUpOwotICAgICAgICBtX2NvbnRleHQuc2F2ZSgpOworICAgICAgICBtX2NvbnRleHQubV9w
bGF0Zm9ybUNvbnRleHQuc2F2ZSgpOwogICAgICAgICBtX3NhdmVBbmRSZXN0b3JlID0gdHJ1ZTsK
ICAgICB9CiAKICAgICB2b2lkIHJlc3RvcmUoKQogICAgIHsKICAgICAgICAgQVNTRVJUKG1fc2F2
ZUFuZFJlc3RvcmUpOwotICAgICAgICBtX2NvbnRleHQucmVzdG9yZSgpOworICAgICAgICBtX2Nv
bnRleHQubV9wbGF0Zm9ybUNvbnRleHQucmVzdG9yZSgpOwogICAgICAgICBtX3NhdmVBbmRSZXN0
b3JlID0gZmFsc2U7CiAgICAgfQogCkBAIC0xNzMsNiArMTMzLDcgQEAgcHVibGljOgogICAgIH0K
IAogcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ+
IG93bmVkUGxhdGZvcm1Db250ZXh0OwogICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZSYgbV9jb250ZXh0OwogICAgIGJvb2wgbV9zYXZlQW5kUmVzdG9yZSB7IGZhbHNlIH07CiB9OwpJ
bmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQnVmZmVyRGF0
YURpcmVjdDJELmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ltYWdlQnVmZmVyRGF0YURpcmVjdDJELmgJKHJldmlzaW9uIDI0ODAwOCkKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRhdGFEaXJlY3Qy
RC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMiwxNiArMzIsMTcgQEAKICNpbmNsdWRlIDx3dGYvUmVm
UHRyLmg+CiAjaW5jbHVkZSA8d3RmL1JldGFpblB0ci5oPgogCi1pbnRlcmZhY2UgSUQyRDFSZW5k
ZXJUYXJnZXQ7Ci0KIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3MgUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQ7CisKIHN0cnVjdCBJbWFnZUJ1ZmZlckRhdGEgewogICAgIEludFNpemUgYmFja2lu
Z1N0b3JlU2l6ZTsKICAgICBDaGVja2VkPHVuc2lnbmVkLCBSZWNvcmRPdmVyZmxvdz4gYnl0ZXNQ
ZXJSb3c7CiAKICAgICAvLyBPbmx5IGZvciBzb2Z0d2FyZSBJbWFnZUJ1ZmZlcnMuCiAgICAgVmVj
dG9yPGNoYXI+IGRhdGE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEPiBwbGF0Zm9ybUNvbnRleHQ7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEdyYXBoaWNzQ29udGV4
dD4gY29udGV4dDsKICAgICBDT01QdHI8SVdJQ0JpdG1hcD4gYml0bWFwU291cmNlOwogCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VCdWZmZXJEaXJlY3Qy
RC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ltYWdlQnVmZmVyRGlyZWN0MkQuY3BwCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VCdWZmZXJEaXJlY3QyRC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE2LTIwMTgg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE2LTIw
MTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0zMCwxMiArMzAsMTQgQEAKIAogI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgi
CiAjaW5jbHVkZSAiQ09NUHRyLmgiCisjaW5jbHVkZSAiRGlyZWN0MkRVdGlsaXRpZXMuaCIKICNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJJbWFnZURhdGEuaCIKICNpbmNs
dWRlICJJbWFnZURlY29kZXJEaXJlY3QyRC5oIgogI2luY2x1ZGUgIkludFJlY3QuaCIKICNpbmNs
dWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNp
bmNsdWRlICJQbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oIgogI2luY2x1ZGUgPGQyZDEuaD4KICNp
bmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8d2luY29kZWMuaD4KQEAgLTEwMSwyMSArMTAzLDE3
IEBAIEltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlcihjb25zdCBGbG9hdFNpemUKIAogICAgIG1fZGF0
YS5kYXRhID0gVmVjdG9yPGNoYXI+KG51bUJ5dGVzLnVuc2FmZUdldCgpLCAwKTsKIAotICAgIEhS
RVNVTFQgaHIgPSBJbWFnZURlY29kZXJEaXJlY3QyRDo6c3lzdGVtSW1hZ2luZ0ZhY3RvcnkoKS0+
Q3JlYXRlQml0bWFwRnJvbU1lbW9yeShtX3NpemUud2lkdGgoKSwgbV9zaXplLmhlaWdodCgpLCBH
VUlEX1dJQ1BpeGVsRm9ybWF0MzJicHBQQkdSQSwgc3RhdGljX2Nhc3Q8VUlOVD4obV9kYXRhLmJ5
dGVzUGVyUm93LnVuc2FmZUdldCgpKSwgc3RhdGljX2Nhc3Q8VUlOVD4obnVtQnl0ZXMudW5zYWZl
R2V0KCkpLCByZWludGVycHJldF9jYXN0PEJZVEUqPihtX2RhdGEuZGF0YS5kYXRhKCkpLCAmbV9k
YXRhLmJpdG1hcFNvdXJjZSk7Ci0gICAgaWYgKCFTVUNDRUVERUQoaHIpKQorICAgIG1fZGF0YS5i
aXRtYXBTb3VyY2UgPSBEaXJlY3QyRDo6Y3JlYXRlRGlyZWN0MkRJbWFnZVN1cmZhY2VXaXRoRGF0
YShtX2RhdGEuZGF0YS5kYXRhKCksIG1fc2l6ZSwgbV9kYXRhLmJ5dGVzUGVyUm93LnVuc2FmZUdl
dCgpKTsKKyAgICBpZiAoIW1fZGF0YS5iaXRtYXBTb3VyY2UpCiAgICAgICAgIHJldHVybjsKIAot
ICAgIGF1dG8gdGFyZ2V0UHJvcGVydGllcyA9IEQyRDE6OlJlbmRlclRhcmdldFByb3BlcnRpZXMo
RDJEMV9SRU5ERVJfVEFSR0VUX1RZUEVfREVGQVVMVCwKLSAgICAgICAgRDJEMTo6UGl4ZWxGb3Jt
YXQoRFhHSV9GT1JNQVRfQjhHOFI4QThfVU5PUk0sIEQyRDFfQUxQSEFfTU9ERV9QUkVNVUxUSVBM
SUVEKSwKLSAgICAgICAgMCwgMCwgRDJEMV9SRU5ERVJfVEFSR0VUX1VTQUdFX05PTkUsIEQyRDFf
RkVBVFVSRV9MRVZFTF9ERUZBVUxUKTsKLQotICAgIENPTVB0cjxJRDJEMVJlbmRlclRhcmdldD4g
Yml0bWFwQ29udGV4dDsKLSAgICBociA9IEdyYXBoaWNzQ29udGV4dDo6c3lzdGVtRmFjdG9yeSgp
LT5DcmVhdGVXaWNCaXRtYXBSZW5kZXJUYXJnZXQobV9kYXRhLmJpdG1hcFNvdXJjZS5nZXQoKSwg
JnRhcmdldFByb3BlcnRpZXMsICZiaXRtYXBDb250ZXh0KTsKLSAgICBpZiAoIWJpdG1hcENvbnRl
eHQgfHwgIVNVQ0NFRURFRChocikpCisgICAgQ09NUHRyPElEMkQxUmVuZGVyVGFyZ2V0PiBiaXRt
YXBDb250ZXh0ID0gRGlyZWN0MkQ6OmNyZWF0ZVJlbmRlclRhcmdldEZyb21XSUNCaXRtYXAobV9k
YXRhLmJpdG1hcFNvdXJjZS5nZXQoKSk7CisgICAgaWYgKCFiaXRtYXBDb250ZXh0KQogICAgICAg
ICByZXR1cm47CiAKICAgICAvLyBOb3RlOiBUaGlzIHBsYWNlcyB0aGUgYml0bWFwY29udGV4dCBp
bnRvIGEgbG9ja2VkIHN0YXRlIGJlY2F1c2Ugb2YgdGhlIEJlZ2luRHJhdyBjYWxsIGluIHRoZSBj
b25zdHJ1Y3Rvci4KLSAgICBtX2RhdGEuY29udGV4dCA9IHN0ZDo6bWFrZV91bmlxdWU8R3JhcGhp
Y3NDb250ZXh0PihiaXRtYXBDb250ZXh0LmdldCgpKTsKKyAgICBtX2RhdGEucGxhdGZvcm1Db250
ZXh0ID0gc3RkOjptYWtlX3VuaXF1ZTxQbGF0Zm9ybUNvbnRleHREaXJlY3QyRD4oYml0bWFwQ29u
dGV4dC5nZXQoKSk7CisgICAgbV9kYXRhLmNvbnRleHQgPSBzdGQ6Om1ha2VfdW5pcXVlPEdyYXBo
aWNzQ29udGV4dD4obV9kYXRhLnBsYXRmb3JtQ29udGV4dC5nZXQoKSwgR3JhcGhpY3NDb250ZXh0
OjpCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZTo6R1BVTWVtb3J5KTsKIAogICAgIHN1Y2Nlc3Mg
PSB0cnVlOwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL05h
dGl2ZUltYWdlRGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9OYXRpdmVJbWFnZURpcmVjdDJELmNwcAkocmV2aXNpb24gMjQ4MDA4
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL05hdGl2ZUltYWdlRGly
ZWN0MkQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiR3Jh
cGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSW50U2l6ZS5oIgogI2luY2x1ZGUgIk5vdEltcGxl
bWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaCIKICNpbmNsdWRl
IDxkMmQxLmg+CiAjaW5jbHVkZSA8d2luY29kZWMuaD4KIApAQCAtMTE2LDExICsxMTcsMTEgQEAg
dm9pZCBkcmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0aXZlSW1hZ2VQdAogICAgIGZsb2F0IG9wYWNp
dHkgPSAxLjBmOwogCiAgICAgQ09NUHRyPElEMkQxQml0bWFwPiBiaXRtYXA7Ci0gICAgSFJFU1VM
VCBociA9IHBsYXRmb3JtQ29udGV4dC0+Q3JlYXRlQml0bWFwRnJvbVdpY0JpdG1hcChpbWFnZS5n
ZXQoKSwgJmJpdG1hcCk7CisgICAgSFJFU1VMVCBociA9IHBsYXRmb3JtQ29udGV4dC0+cmVuZGVy
VGFyZ2V0KCktPkNyZWF0ZUJpdG1hcEZyb21XaWNCaXRtYXAoaW1hZ2UuZ2V0KCksICZiaXRtYXAp
OwogICAgIGlmICghU1VDQ0VFREVEKGhyKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgcGxhdGZv
cm1Db250ZXh0LT5EcmF3Qml0bWFwKGJpdG1hcC5nZXQoKSwgZGVzdFJlY3QsIG9wYWNpdHksIEQy
RDFfQklUTUFQX0lOVEVSUE9MQVRJT05fTU9ERV9ORUFSRVNUX05FSUdIQk9SLCBhZGp1c3RlZFNy
Y1JlY3QpOworICAgIHBsYXRmb3JtQ29udGV4dC0+cmVuZGVyVGFyZ2V0KCktPkRyYXdCaXRtYXAo
Yml0bWFwLmdldCgpLCBkZXN0UmVjdCwgb3BhY2l0eSwgRDJEMV9CSVRNQVBfSU5URVJQT0xBVElP
Tl9NT0RFX05FQVJFU1RfTkVJR0hCT1IsIGFkanVzdGVkU3JjUmVjdCk7CiAgICAgY29udGV4dC5m
bHVzaCgpOwogfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
UGF0aERpcmVjdDJELmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vUGF0aERpcmVjdDJELmNwcAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BhdGhEaXJlY3QyRC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNp
bmNsdWRlICJJbnRSZWN0LmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRl
ICJQbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oIgogI2luY2x1ZGUgIlN0cm9rZVN0eWxlQXBwbGll
ci5oIgogI2luY2x1ZGUgPGQyZDEuaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgpAQCAt
MjQ5LDcgKzI1MCw4IEBAIGJvb2wgUGF0aDo6c3Ryb2tlQ29udGFpbnMoU3Ryb2tlU3R5bGVBcHAK
IAogICAgIEFTU0VSVChhcHBsaWVyKTsKIAotICAgIEdyYXBoaWNzQ29udGV4dCBzY3JhdGNoQ29u
dGV4dChzY3JhdGNoUmVuZGVyVGFyZ2V0KCksIEdyYXBoaWNzQ29udGV4dDo6Qml0bWFwUmVuZGVy
aW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSk7CisgICAgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQg
c2NyYXRjaENvbnRleHREMkQoc2NyYXRjaFJlbmRlclRhcmdldCgpKTsKKyAgICBHcmFwaGljc0Nv
bnRleHQgc2NyYXRjaENvbnRleHQoJnNjcmF0Y2hDb250ZXh0RDJELCBHcmFwaGljc0NvbnRleHQ6
OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1vcnkpOwogICAgIGFwcGxpZXItPnN0
cm9rZVN0eWxlKCZzY3JhdGNoQ29udGV4dCk7CiAKICAgICBCT09MIGNvbnRhaW5zUG9pbnQgPSBm
YWxzZTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9QYXR0ZXJu
RGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9QYXR0ZXJuRGlyZWN0MkQuY3BwCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUGF0dGVybkRpcmVjdDJELmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgi
CiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQuaCIKICNpbmNsdWRlIDxkMmQxLmg+CiAjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQu
aD4KIApAQCAtMzgsNiArMzksMTQgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBJRDJEMUJpdG1h
cEJydXNoKiBQYXR0ZXJuOjpjcmVhdGVQbGF0Zm9ybVBhdHRlcm4oY29uc3QgR3JhcGhpY3NDb250
ZXh0JiBjb250ZXh0LCBmbG9hdCBhbHBoYSwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB1c2VyU3Bh
Y2VUcmFuc2Zvcm1hdGlvbikgY29uc3QKIHsKKyAgICBhdXRvIHBsYXRmb3JtQ29udGV4dCA9IGNv
bnRleHQucGxhdGZvcm1Db250ZXh0KCk7CisgICAgUkVMRUFTRV9BU1NFUlQocGxhdGZvcm1Db250
ZXh0KTsKKworICAgIHJldHVybiBjcmVhdGVQbGF0Zm9ybVBhdHRlcm4oKnBsYXRmb3JtQ29udGV4
dCwgYWxwaGEsIHVzZXJTcGFjZVRyYW5zZm9ybWF0aW9uKTsKK30KKworSUQyRDFCaXRtYXBCcnVz
aCogUGF0dGVybjo6Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0
JiBjb250ZXh0LCBmbG9hdCBhbHBoYSwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB1c2VyU3BhY2VU
cmFuc2Zvcm1hdGlvbikgY29uc3QKK3sKICAgICBBZmZpbmVUcmFuc2Zvcm0gcGF0dGVyblRyYW5z
Zm9ybSA9IHVzZXJTcGFjZVRyYW5zZm9ybWF0aW9uICogbV9wYXR0ZXJuU3BhY2VUcmFuc2Zvcm1h
dGlvbjsKICAgICBhdXRvIGJpdG1hcEJydXNoUHJvcGVydGllcyA9IEQyRDE6OkJpdG1hcEJydXNo
UHJvcGVydGllcygpOwogICAgIGJpdG1hcEJydXNoUHJvcGVydGllcy5leHRlbmRNb2RlWCA9IG1f
cmVwZWF0WCA/IEQyRDFfRVhURU5EX01PREVfV1JBUCA6IEQyRDFfRVhURU5EX01PREVfQ0xBTVA7
CkBAIC00OCwxOSArNTcsMTUgQEAgSUQyRDFCaXRtYXBCcnVzaCogUGF0dGVybjo6Y3JlYXRlUGxh
dGZvcgogICAgIGJydXNoUHJvcGVydGllcy5vcGFjaXR5ID0gYWxwaGE7CiAKICAgICBhdXRvJiBw
YXR0ZXJuSW1hZ2UgPSB0aWxlSW1hZ2UoKTsKLQotICAgIGF1dG8gcGxhdGZvcm1Db250ZXh0ID0g
Y29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKTsKLSAgICBSRUxFQVNFX0FTU0VSVChwbGF0Zm9ybUNv
bnRleHQpOwotCi0gICAgYXV0byBuYXRpdmVJbWFnZSA9IHBhdHRlcm5JbWFnZS5uYXRpdmVJbWFn
ZSgmY29udGV4dCk7CisgICAgYXV0byBuYXRpdmVJbWFnZSA9IHBhdHRlcm5JbWFnZS5uYXRpdmVJ
bWFnZShudWxscHRyKTsKIAogICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gYml0bWFwOwotICAgIEhS
RVNVTFQgaHIgPSBwbGF0Zm9ybUNvbnRleHQtPkNyZWF0ZUJpdG1hcEZyb21XaWNCaXRtYXAobmF0
aXZlSW1hZ2UuZ2V0KCksICZiaXRtYXApOworICAgIEhSRVNVTFQgaHIgPSBjb250ZXh0LnJlbmRl
clRhcmdldCgpLT5DcmVhdGVCaXRtYXBGcm9tV2ljQml0bWFwKG5hdGl2ZUltYWdlLmdldCgpLCAm
Yml0bWFwKTsKICAgICBpZiAoIVNVQ0NFRURFRChocikpCiAgICAgICAgIHJldHVybiBudWxscHRy
OwogCiAgICAgSUQyRDFCaXRtYXBCcnVzaCogcGF0dGVybkJydXNoID0gbnVsbHB0cjsKLSAgICBo
ciA9IHBsYXRmb3JtQ29udGV4dC0+Q3JlYXRlQml0bWFwQnJ1c2goYml0bWFwLmdldCgpLCAmYml0
bWFwQnJ1c2hQcm9wZXJ0aWVzLCAmYnJ1c2hQcm9wZXJ0aWVzLCAmcGF0dGVybkJydXNoKTsKKyAg
ICBociA9IGNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkNyZWF0ZUJpdG1hcEJydXNoKGJpdG1hcC5n
ZXQoKSwgJmJpdG1hcEJydXNoUHJvcGVydGllcywgJmJydXNoUHJvcGVydGllcywgJnBhdHRlcm5C
cnVzaCk7CiAgICAgQVNTRVJUKFNVQ0NFRURFRChocikpOwogICAgIHJldHVybiBwYXR0ZXJuQnJ1
c2g7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUGxhdGZv
cm1Db250ZXh0RGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9QbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5jcHAJKG5vbmV4aXN0ZW50
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BsYXRmb3JtQ29udGV4
dERpcmVjdDJELmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaCIKKworI2lmIFVTRShESVJFQ1Qy
RCkKKworI2luY2x1ZGUgIkRpcmVjdDJET3BlcmF0aW9ucy5oIgorI2luY2x1ZGUgPGQyZDEuaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBFbmNhcHN1bGF0ZXMgdGhlIGFkZGl0aW9uYWwg
cGFpbnRpbmcgc3RhdGUgaW5mb3JtYXRpb24gd2Ugc3RvcmUgZm9yIGVhY2gKKy8vIHB1c2hlZCBn
cmFwaGljcyBzdGF0ZS4KK2NsYXNzIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpTdGF0ZSB7Citw
dWJsaWM6CisgICAgU3RhdGUoKSA9IGRlZmF1bHQ7Cit9OworCitQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRDo6UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQoSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRh
cmdldCkKKyAgICA6IG1fcmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCkKK3sKKyAgICBtX3N0YXRl
U3RhY2suYXBwZW5kKFN0YXRlKCkpOworICAgIG1fc3RhdGUgPSAmbV9zdGF0ZVN0YWNrLmxhc3Qo
KTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6cmVzdG9yZSgpCit7CisgICAg
QVNTRVJUKG1fcmVuZGVyVGFyZ2V0KTsKKworICAgIGF1dG8gcmVzdG9yZVN0YXRlID0gbV9yZW5k
ZXJTdGF0ZXMudGFrZUxhc3QoKTsKKyAgICBtX3JlbmRlclRhcmdldC0+UmVzdG9yZURyYXdpbmdT
dGF0ZShyZXN0b3JlU3RhdGUubV9kcmF3aW5nU3RhdGVCbG9jay5nZXQoKSk7CisKKyAgICBmb3Ig
KGF1dG8gY2xpcFR5cGUgPSByZXN0b3JlU3RhdGUubV9jbGlwcy5yYmVnaW4oKTsgY2xpcFR5cGUg
IT0gcmVzdG9yZVN0YXRlLm1fY2xpcHMucmVuZCgpOyArK2NsaXBUeXBlKSB7CisgICAgICAgIGlm
ICgqY2xpcFR5cGUgPT0gQXhpc0FsaWduZWRDbGlwKQorICAgICAgICAgICAgbV9yZW5kZXJUYXJn
ZXQtPlBvcEF4aXNBbGlnbmVkQ2xpcCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX3Jl
bmRlclRhcmdldC0+UG9wTGF5ZXIoKTsKKyAgICB9CisKKyAgICBtX3N0YXRlU3RhY2sucmVtb3Zl
TGFzdCgpOworICAgIEFTU0VSVCghbV9zdGF0ZVN0YWNrLmlzRW1wdHkoKSk7CisgICAgbV9zdGF0
ZSA9ICZtX3N0YXRlU3RhY2subGFzdCgpOworfQorCitQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6
flBsYXRmb3JtQ29udGV4dERpcmVjdDJEKCkgPSBkZWZhdWx0OworCit2b2lkIFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEOjpzYXZlKCkKK3sKKyAgICBBU1NFUlQobV9yZW5kZXJUYXJnZXQpOworCisg
ICAgbV9zdGF0ZVN0YWNrLmFwcGVuZChTdGF0ZSgpKTsKKyAgICBtX3N0YXRlID0gJm1fc3RhdGVT
dGFjay5sYXN0KCk7CisKKyAgICBSZW5kZXJTdGF0ZSBjdXJyZW50U3RhdGU7CisgICAgR3JhcGhp
Y3NDb250ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0ZURyYXdpbmdTdGF0ZUJsb2NrKCZjdXJy
ZW50U3RhdGUubV9kcmF3aW5nU3RhdGVCbG9jayk7CisKKyAgICBtX3JlbmRlclRhcmdldC0+U2F2
ZURyYXdpbmdTdGF0ZShjdXJyZW50U3RhdGUubV9kcmF3aW5nU3RhdGVCbG9jay5nZXQoKSk7CisK
KyAgICBtX3JlbmRlclN0YXRlcy5hcHBlbmQoY3VycmVudFN0YXRlKTsKK30KKworLyoKK3ZvaWQg
UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnB1c2hJbWFnZU1hc2soY2Fpcm9fc3VyZmFjZV90KiBz
dXJmYWNlLCBjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CitcICAgIC8vIFdlIG11c3QgY2FsbCBz
YXZlUGxhdGZvcm1TdGF0ZSBhdCBsZWFzdCBvbmNlIGJlZm9yZSB3ZSBjYW4gdXNlIGltYWdlIG1h
c2tpbmcsCisgICAgLy8gc2luY2Ugd2UgYWN0dWFsbHkgYXBwbHkgdGhlIG1hc2sgaW4gcmVzdG9y
ZVBsYXRmb3JtU3RhdGUuCisgICAgQVNTRVJUKCFtX3N0YXRlU3RhY2suaXNFbXB0eSgpKTsKKyAg
ICBtX3N0YXRlLT5tX21hc2sucGF0dGVybiA9IGFkb3B0UmVmKGNhaXJvX3BhdHRlcm5fY3JlYXRl
X2Zvcl9zdXJmYWNlKHN1cmZhY2UpKTsKKyAgICBjYWlyb19nZXRfbWF0cml4KG1fY3IuZ2V0KCks
ICZtX3N0YXRlLT5tX21hc2subWF0cml4KTsKKworICAgIGNhaXJvX21hdHJpeF90IG1hdHJpeDsK
KyAgICBjYWlyb19tYXRyaXhfaW5pdF90cmFuc2xhdGUoJm1hdHJpeCwgLXJlY3QueCgpLCAtcmVj
dC55KCkpOworICAgIGNhaXJvX3BhdHRlcm5fc2V0X21hdHJpeChtX3N0YXRlLT5tX21hc2sucGF0
dGVybi5nZXQoKSwgJm1hdHJpeCk7CisKKyAgICBjYWlyb19wdXNoX2dyb3VwKG1fY3IuZ2V0KCkp
OworfQorKi8KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6cHVzaFJlbmRlckNsaXAo
RGlyZWN0MkRMYXllclR5cGUgY2xpcFR5cGUpCit7CisgICAgQVNTRVJUKGhhc1NhdmVkU3RhdGUo
KSk7CisgICAgbV9yZW5kZXJTdGF0ZXMubGFzdCgpLm1fY2xpcHMuYXBwZW5kKGNsaXBUeXBlKTsK
K30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6c2V0QWN0aXZlTGF5ZXIoQ09NUHRy
PElEMkQxTGF5ZXI+JiYgbGF5ZXIpCit7CisgICAgQVNTRVJUKGhhc1NhdmVkU3RhdGUoKSk7Cisg
ICAgbV9yZW5kZXJTdGF0ZXMubGFzdCgpLm1fYWN0aXZlTGF5ZXIgPSBsYXllcjsKK30KKworQ09N
UHRyPElEMkQxU29saWRDb2xvckJydXNoPiBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6YnJ1c2hX
aXRoQ29sb3IoY29uc3QgRDJEMV9DT0xPUl9GJiBjb2xvcikKK3sKKyAgICBSR0JBMzIgY29sb3JL
ZXkgPSBtYWtlUkdCQTMyRnJvbUZsb2F0cyhjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLCBjb2xv
ci5hKTsKKworICAgIGlmICghY29sb3JLZXkpIHsKKyAgICAgICAgaWYgKCFtX3plcm9CcnVzaCkK
KyAgICAgICAgICAgIG1fcmVuZGVyVGFyZ2V0LT5DcmVhdGVTb2xpZENvbG9yQnJ1c2goY29sb3Is
ICZtX3plcm9CcnVzaCk7CisgICAgICAgIHJldHVybiBtX3plcm9CcnVzaDsKKyAgICB9CisKKyAg
ICBpZiAoY29sb3JLZXkgPT0gMHhGRkZGRkZGRikgeworICAgICAgICBpZiAoIW1fd2hpdGVCcnVz
aCkKKyAgICAgICAgICAgIG1fcmVuZGVyVGFyZ2V0LT5DcmVhdGVTb2xpZENvbG9yQnJ1c2goY29s
b3IsICZtX3doaXRlQnJ1c2gpOworICAgICAgICByZXR1cm4gbV93aGl0ZUJydXNoOworICAgIH0K
KworICAgIGF1dG8gZXhpc3RpbmdCcnVzaCA9IG1fc29saWRDb2xvcmVkQnJ1c2hDYWNoZS5lbnN1
cmUoY29sb3JLZXksIFt0aGlzLCBjb2xvcl0geworICAgICAgICBDT01QdHI8SUQyRDFTb2xpZENv
bG9yQnJ1c2g+IGNvbG9yQnJ1c2g7CisgICAgICAgIG1fcmVuZGVyVGFyZ2V0LT5DcmVhdGVTb2xp
ZENvbG9yQnJ1c2goY29sb3IsICZjb2xvckJydXNoKTsKKyAgICAgICAgcmV0dXJuIGNvbG9yQnJ1
c2g7CisgICAgfSk7CisKKyAgICByZXR1cm4gZXhpc3RpbmdCcnVzaC5pdGVyYXRvci0+dmFsdWU7
Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnJlY29tcHV0ZVN0cm9rZVN0eWxl
KCkKK3sKKyAgICBpZiAoIW1fc3Ryb2tlU3lsZUlzRGlydHkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fZDJkU3Ryb2tlU3R5bGUgPSBudWxscHRyOworCisgICAgRGFzaEFycmF5IGRhc2hlczsK
KyAgICBmbG9hdCBwYXR0ZXJuT2Zmc2V0ID0gMDsKKyAgICBhdXRvIGRhc2hTdHlsZSA9IEQyRDFf
REFTSF9TVFlMRV9TT0xJRDsKKworICAgIGlmICgobV9zdHJva2VTdHlsZSAhPSBTb2xpZFN0cm9r
ZSkgJiYgKG1fc3Ryb2tlU3R5bGUgIT0gTm9TdHJva2UpKSB7CisgICAgICAgIGRhc2hTdHlsZSA9
IEQyRDFfREFTSF9TVFlMRV9DVVNUT007CisgICAgICAgIHBhdHRlcm5PZmZzZXQgPSBtX3BhdHRl
cm5PZmZzZXQgLyBtX3N0cm9rZVRoaWNrbmVzczsKKyAgICAgICAgZGFzaGVzID0gbV9kYXNoZXM7
CisKKyAgICAgICAgLy8gSW4gRGlyZWN0MkQsIGRhc2hlcyBhbmQgZG90cyBhcmUgZGVmaW5lZCBp
biB0ZXJtcyBvZiB0aGUgcmF0aW8gb2YgdGhlIGRhc2ggbGVuZ3RoIHRvIHRoZSBsaW5lIHRoaWNr
bmVzcy4KKyAgICAgICAgZm9yIChhdXRvJiBkYXNoIDogZGFzaGVzKQorICAgICAgICAgICAgZGFz
aCAvPSBtX3N0cm9rZVRoaWNrbmVzczsKKyAgICB9CisKKyAgICBhdXRvIHN0cm9rZVN0eWxlUHJv
cGVydGllcyA9IEQyRDE6OlN0cm9rZVN0eWxlUHJvcGVydGllcyhtX2xpbmVDYXAsIG1fbGluZUNh
cCwgbV9saW5lQ2FwLCBtX2xpbmVKb2luLCBtX21pdGVyTGltaXQsIGRhc2hTdHlsZSwgcGF0dGVy
bk9mZnNldCk7CisgICAgR3JhcGhpY3NDb250ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0ZVN0
cm9rZVN0eWxlKCZzdHJva2VTdHlsZVByb3BlcnRpZXMsIGRhc2hlcy5kYXRhKCksIGRhc2hlcy5z
aXplKCksICZtX2QyZFN0cm9rZVN0eWxlKTsKKworICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSBm
YWxzZTsKK30KKworSUQyRDFTdHJva2VTdHlsZSogUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnN0
cm9rZVN0eWxlKCkKK3sKKyAgICByZWNvbXB1dGVTdHJva2VTdHlsZSgpOworICAgIHJldHVybiBt
X2QyZFN0cm9rZVN0eWxlLmdldCgpOworfQorCitEMkQxX1NUUk9LRV9TVFlMRV9QUk9QRVJUSUVT
IFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpzdHJva2VTdHlsZVByb3BlcnRpZXMoKSBjb25zdAor
eworICAgIHJldHVybiBEMkQxOjpTdHJva2VTdHlsZVByb3BlcnRpZXMobV9saW5lQ2FwLCBtX2xp
bmVDYXAsIG1fbGluZUNhcCwgbV9saW5lSm9pbiwgbV9taXRlckxpbWl0LCBEMkQxX0RBU0hfU1RZ
TEVfU09MSUQsIDAuMGYpOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpzZXRM
aW5lQ2FwKEQyRDFfQ0FQX1NUWUxFIGxpbmVDYXApCit7CisgICAgaWYgKG1fbGluZUNhcCA9PSBs
aW5lQ2FwKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2xpbmVDYXAgPSBsaW5lQ2FwOworICAg
IG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEOjpzZXRMaW5lSm9pbihEMkQxX0xJTkVfSk9JTiBqb2luKQoreworICAgIGlmIChtX2xp
bmVKb2luID09IGpvaW4pCisgICAgICAgIHJldHVybjsKKworICAgIG1fbGluZUpvaW4gPSBqb2lu
OworICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworfQorCit2b2lkIFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEOjpzZXRTdHJva2VTdHlsZShTdHJva2VTdHlsZSBzdHJva2VTdHlsZSkKK3sK
KyAgICBpZiAobV9zdHJva2VTdHlsZSA9PSBzdHJva2VTdHlsZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV9zdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlOworICAgIG1fc3Ryb2tlU3lsZUlzRGly
dHkgPSB0cnVlOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpzZXRTdHJva2VU
aGlja25lc3MoZmxvYXQgdGhpY2tuZXNzKQoreworICAgIGlmIChXVEY6OmFyZUVzc2VudGlhbGx5
RXF1YWwodGhpY2tuZXNzLCBtX3N0cm9rZVRoaWNrbmVzcykpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fc3Ryb2tlVGhpY2tuZXNzID0gdGhpY2tuZXNzOworICAgIG1fc3Ryb2tlU3lsZUlzRGly
dHkgPSB0cnVlOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpzZXRNaXRlckxp
bWl0KGZsb2F0IGNhbnZhc01pdGVyTGltaXQpCit7CisgICAgLy8gRGlyZWN0MkQgbWl0ZXIgbGlt
aXQgaXMgaW4gdGVybXMgb2YgSEFMRiB0aGUgbGluZSB0aGlja25lc3MuCisgICAgZmxvYXQgbWl0
ZXJMaW1pdCA9IDAuNWYgKiBjYW52YXNNaXRlckxpbWl0OworICAgIGlmIChXVEY6OmFyZUVzc2Vu
dGlhbGx5RXF1YWwobWl0ZXJMaW1pdCwgbV9taXRlckxpbWl0KSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV9taXRlckxpbWl0ID0gbWl0ZXJMaW1pdDsKKyAgICBtX3N0cm9rZVN5bGVJc0RpcnR5
ID0gdHJ1ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6c2V0RGFzaE9mZnNl
dChmbG9hdCBkYXNoT2Zmc2V0KQoreworICAgIGlmIChXVEY6OmFyZUVzc2VudGlhbGx5RXF1YWwo
ZGFzaE9mZnNldCwgbV9kYXNoT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9kYXNo
T2Zmc2V0ID0gZGFzaE9mZnNldDsKKyAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKK30K
Kwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6c2V0RGFzaGVzKGNvbnN0IERhc2hBcnJh
eSYgZGFzaGVzKQoreworICAgIGlmIChtX2Rhc2hlcyA9PSBkYXNoZXMpCisgICAgICAgIHJldHVy
bjsKKworICAgIG1fZGFzaGVzID0gZGFzaGVzOworICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0
cnVlOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpzZXRQYXR0ZXJuV2lkdGgo
ZmxvYXQgcGF0dGVybldpZHRoKQoreworICAgIGlmIChXVEY6OmFyZUVzc2VudGlhbGx5RXF1YWwo
cGF0dGVybldpZHRoLCBtX3BhdHRlcm5XaWR0aCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
cGF0dGVybldpZHRoID0gcGF0dGVybldpZHRoOworICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0
cnVlOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpzZXRQYXR0ZXJuT2Zmc2V0
KGZsb2F0IHBhdHRlcm5PZmZzZXQpCit7CisgICAgaWYgKFdURjo6YXJlRXNzZW50aWFsbHlFcXVh
bChwYXR0ZXJuT2Zmc2V0LCBtX3BhdHRlcm5PZmZzZXQpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBtX3BhdHRlcm5PZmZzZXQgPSBwYXR0ZXJuT2Zmc2V0OworICAgIG1fc3Ryb2tlU3lsZUlzRGly
dHkgPSB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0Uo
RElSRUNUMkQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaAkobm9uZXhpc3RlbnQp
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIFVT
RShESVJFQ1QyRCkKKworI2luY2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dC5oIgorI2luY2x1ZGUgPGQyZDEuaD4KKyNpbmNsdWRlIDxkMmQxXzEuaD4KKyNpbmNsdWRl
IDxkMmQxZWZmZWN0cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZTsKK3N0cnVjdCBHcmFwaGljc0NvbnRleHRTdGF0ZTsKKwor
bmFtZXNwYWNlIERpcmVjdDJEIHsKK3N0cnVjdCBGaWxsU291cmNlOworc3RydWN0IFN0cm9rZVNv
dXJjZTsKK3N0cnVjdCBTaGFkb3dTdGF0ZTsKK30KKworY2xhc3MgUGxhdGZvcm1Db250ZXh0RGly
ZWN0MkQgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
KTsKK3B1YmxpYzoKKyAgICBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRChJRDJEMVJlbmRlclRhcmdl
dCopOworICAgIH5QbGF0Zm9ybUNvbnRleHREaXJlY3QyRCgpOworCisgICAgSUQyRDFSZW5kZXJU
YXJnZXQqIHJlbmRlclRhcmdldCgpIHsgcmV0dXJuIG1fcmVuZGVyVGFyZ2V0LmdldCgpOyB9Cisg
ICAgdm9pZCBzZXRSZW5kZXJUYXJnZXQoSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkg
eyBtX3JlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDsgfQorCisgICAgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlKiBncmFwaGljc0NvbnRleHRQcml2YXRlKCkgeyByZXR1cm4gbV9ncmFw
aGljc0NvbnRleHRQcml2YXRlOyB9CisgICAgdm9pZCBzZXRHcmFwaGljc0NvbnRleHRQcml2YXRl
KEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSogZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSkg
eyBtX2dyYXBoaWNzQ29udGV4dFByaXZhdGUgPSBncmFwaGljc0NvbnRleHRQcml2YXRlOyB9CisK
KyAgICBJRDJEMUxheWVyKiBjbGlwTGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX3JlbmRlclN0YXRl
cy5sYXN0KCkubV9hY3RpdmVMYXllci5nZXQoKTsgfQorICAgIElEMkQxU3Ryb2tlU3R5bGUqIHN0
cm9rZVN0eWxlKCk7CisgICAgRDJEMV9TVFJPS0VfU1RZTEVfUFJPUEVSVElFUyBzdHJva2VTdHls
ZVByb3BlcnRpZXMoKSBjb25zdDsKKyAgICBJRDJEMVN0cm9rZVN0eWxlKiBwbGF0Zm9ybVN0cm9r
ZVN0eWxlKCkgY29uc3Q7CisKKyAgICBDT01QdHI8SUQyRDFTb2xpZENvbG9yQnJ1c2g+IGJydXNo
V2l0aENvbG9yKGNvbnN0IEQyRDFfQ09MT1JfRiYpOworCisgICAgdm9pZCBzYXZlKCk7CisgICAg
dm9pZCByZXN0b3JlKCk7CisKKyAgICBib29sIGhhc1NhdmVkU3RhdGUoKSBjb25zdCB7IHJldHVy
biAhbV9yZW5kZXJTdGF0ZXMuaXNFbXB0eSgpOyB9CisKKyAgICBlbnVtIERpcmVjdDJETGF5ZXJU
eXBlIHsgQXhpc0FsaWduZWRDbGlwLCBMYXllckNsaXAgfTsKKyAgICB2b2lkIHB1c2hSZW5kZXJD
bGlwKERpcmVjdDJETGF5ZXJUeXBlKTsKKyAgICB2b2lkIHNldEFjdGl2ZUxheWVyKENPTVB0cjxJ
RDJEMUxheWVyPiYmKTsKKworICAgIHZvaWQgcmVjb21wdXRlU3Ryb2tlU3R5bGUoKTsKKyAgICBm
bG9hdCBzdHJva2VUaGlja25lc3MoKSBjb25zdCB7IHJldHVybiBtX3N0cm9rZVRoaWNrbmVzczsg
fQorCisgICAgc3RydWN0IFJlbmRlclN0YXRlIHsKKyAgICAgICAgQ09NUHRyPElEMkQxRHJhd2lu
Z1N0YXRlQmxvY2s+IG1fZHJhd2luZ1N0YXRlQmxvY2s7CisgICAgICAgIENPTVB0cjxJRDJEMUxh
eWVyPiBtX2FjdGl2ZUxheWVyOworICAgICAgICBWZWN0b3I8RGlyZWN0MkRMYXllclR5cGU+IG1f
Y2xpcHM7CisgICAgfTsKKyAgICBWZWN0b3I8UmVuZGVyU3RhdGU+IG1fcmVuZGVyU3RhdGVzOwor
CisgICAgc3RydWN0IFRyYW5zcGFyZW5jeUxheWVyU3RhdGUgeworICAgICAgICBDT01QdHI8SUQy
RDFCaXRtYXBSZW5kZXJUYXJnZXQ+IHJlbmRlclRhcmdldDsKKyAgICAgICAgQ29sb3Igc2hhZG93
Q29sb3I7CisgICAgICAgIEZsb2F0U2l6ZSBzaGFkb3dPZmZzZXQ7CisgICAgICAgIGZsb2F0IG9w
YWNpdHkgeyAxLjAgfTsKKyAgICAgICAgZmxvYXQgc2hhZG93Qmx1ciB7IDAgfTsKKyAgICAgICAg
Ym9vbCBoYXNTaGFkb3cgeyBmYWxzZSB9OworICAgIH07CisgICAgVmVjdG9yPFRyYW5zcGFyZW5j
eUxheWVyU3RhdGU+IG1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjazsKKworICAgIHZvaWQgc2V0TGlu
ZUNhcChEMkQxX0NBUF9TVFlMRSk7CisgICAgdm9pZCBzZXRMaW5lSm9pbihEMkQxX0xJTkVfSk9J
Tik7CisgICAgdm9pZCBzZXRTdHJva2VTdHlsZShTdHJva2VTdHlsZSk7CisgICAgdm9pZCBzZXRN
aXRlckxpbWl0KGZsb2F0KTsKKyAgICB2b2lkIHNldERhc2hPZmZzZXQoZmxvYXQpOworICAgIHZv
aWQgc2V0UGF0dGVybldpZHRoKGZsb2F0KTsKKyAgICB2b2lkIHNldFBhdHRlcm5PZmZzZXQoZmxv
YXQpOworICAgIHZvaWQgc2V0U3Ryb2tlVGhpY2tuZXNzKGZsb2F0KTsKKyAgICB2b2lkIHNldERh
c2hlcyhjb25zdCBEYXNoQXJyYXkmKTsKKworICAgIHZvaWQgc2V0QmxlbmRNb2RlKEQyRDFfQkxF
TkRfTU9ERSBtb2RlKSB7IG1fYmxlbmRNb2RlID0gbW9kZTsgfQorICAgIHZvaWQgc2V0Q29tcG9z
aXRlTW9kZShEMkQxX0NPTVBPU0lURV9NT0RFIG1vZGUpIHsgbV9jb21wb3NpdGVNb2RlID0gbW9k
ZTsgfQorCitwcml2YXRlOgorICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSogbV9n
cmFwaGljc0NvbnRleHRQcml2YXRlIHsgbnVsbHB0ciB9OworCisgICAgQ09NUHRyPElEMkQxUmVu
ZGVyVGFyZ2V0PiBtX3JlbmRlclRhcmdldDsKKyAgICBDT01QdHI8SUQyRDFTdHJva2VTdHlsZT4g
bV9kMmRTdHJva2VTdHlsZTsKKworICAgIEhhc2hNYXA8dWludDMyX3QsIENPTVB0cjxJRDJEMVNv
bGlkQ29sb3JCcnVzaD4+IG1fc29saWRDb2xvcmVkQnJ1c2hDYWNoZTsKKyAgICBDT01QdHI8SUQy
RDFTb2xpZENvbG9yQnJ1c2g+IG1fd2hpdGVCcnVzaDsKKyAgICBDT01QdHI8SUQyRDFTb2xpZENv
bG9yQnJ1c2g+IG1femVyb0JydXNoOworICAgIENPTVB0cjxJRDJEMVNvbGlkQ29sb3JCcnVzaD4g
bV9zb2xpZFN0cm9rZUJydXNoOworICAgIENPTVB0cjxJRDJEMVNvbGlkQ29sb3JCcnVzaD4gbV9z
b2xpZEZpbGxCcnVzaDsKKyAgICBDT01QdHI8SUQyRDFCaXRtYXBCcnVzaD4gbV9wYXR0ZXJuU3Ry
b2tlQnJ1c2g7CisgICAgQ09NUHRyPElEMkQxQml0bWFwQnJ1c2g+IG1fcGF0dGVybkZpbGxCcnVz
aDsKKworICAgIGNsYXNzIFN0YXRlOworICAgIFN0YXRlKiBtX3N0YXRlOworICAgIFZlY3RvcjxT
dGF0ZT4gbV9zdGF0ZVN0YWNrOworCisgICAgRDJEMV9DQVBfU1RZTEUgbV9saW5lQ2FwIHsgRDJE
MV9DQVBfU1RZTEVfRkxBVCB9OworICAgIEQyRDFfTElORV9KT0lOIG1fbGluZUpvaW4geyBEMkQx
X0xJTkVfSk9JTl9NSVRFUiB9OworICAgIFN0cm9rZVN0eWxlIG1fc3Ryb2tlU3R5bGUgeyBTb2xp
ZFN0cm9rZSB9OworICAgIERhc2hBcnJheSBtX2Rhc2hlczsKKworICAgIGZsb2F0IG1fbWl0ZXJM
aW1pdCB7IDEwLjBmIH07CisgICAgZmxvYXQgbV9kYXNoT2Zmc2V0IHsgMCB9OworICAgIGZsb2F0
IG1fcGF0dGVybldpZHRoIHsgMS4wZiB9OworICAgIGZsb2F0IG1fcGF0dGVybk9mZnNldCB7IDAg
fTsKKyAgICBmbG9hdCBtX3N0cm9rZVRoaWNrbmVzcyB7IDAgfTsKKyAgICBmbG9hdCBtX2FscGhh
IHsgMS4wIH07CisKKyAgICBib29sIG1fc3Ryb2tlU3lsZUlzRGlydHkgeyBmYWxzZSB9OworCisg
ICAgRDJEMV9CTEVORF9NT0RFIG1fYmxlbmRNb2RlIHsgRDJEMV9CTEVORF9NT0RFX01VTFRJUExZ
IH07CisgICAgRDJEMV9DT01QT1NJVEVfTU9ERSBtX2NvbXBvc2l0ZU1vZGUgeyBEMkQxX0NPTVBP
U0lURV9NT0RFX1NPVVJDRV9PVkVSIH07CisKKyAgICBmcmllbmQgY2xhc3MgR3JhcGhpY3NDb250
ZXh0OworICAgIGZyaWVuZCBjbGFzcyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU7Cit9
OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoRElSRUNUMkQpCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcAkocmV2
aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdp
bi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3Myw2ICsxNzMsOCBAQCBEcmFnSW1hZ2VSZWYgY3Jl
YXRlRHJhZ0ltYWdlRm9yTGluayhFbGVtCiAgICAgICAgICAgICBpbWFnZVNpemUuc2V0V2lkdGgo
c3RkOjptYXgobGFiZWxTaXplLndpZHRoKCksIHVybFN0cmluZ1NpemUud2lkdGgoKSkgKyBEcmFn
TGFiZWxCb3JkZXJYICogMik7CiAgICAgfQogCisgICAgQVNTRVJUKDApOworICAgIC8qCiAgICAg
Ly8gV2Ugbm93IGtub3cgaG93IGJpZyB0aGUgaW1hZ2UgbmVlZHMgdG8gYmUsIHNvIHdlIGNyZWF0
ZSBhbmQKICAgICAvLyBmaWxsIHRoZSBiYWNrZ3JvdW5kCiAgICAgSFduZERDIGRjKDApOwpAQCAt
MjEyLDYgKzIxNCw4IEBAIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGb3JMaW5rKEVsZW0K
IAogICAgIGRlYWxsb2NDb250ZXh0KGNvbnRleHRSZWYpOwogICAgIHJldHVybiBpbWFnZS5sZWFr
KCk7CisgICAgKi8KKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAogfQpJbmRleDogU291cmNlL1dl
YkNvcmUvc3ZnL2dyYXBoaWNzL1NWR0ltYWdlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9zdmcvZ3JhcGhpY3MvU1ZHSW1hZ2UuY3BwCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9zdmcvZ3JhcGhpY3MvU1ZHSW1hZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwNiBFcmljIFNlaWRlbCA8ZXJpY0B3
ZWJraXQub3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDksIDIwMTUtMjAxNiBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxOSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIElu
IE1vdGlvbiBMaW1pdGVkIDIwMTEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CkBAIC02OCw3ICs2OCw5IEBACiAKICNpZiBVU0UoRElSRUNUMkQpCiAjaW5jbHVkZSAiQ09N
UHRyLmgiCisjaW5jbHVkZSAiRGlyZWN0MkRVdGlsaXRpZXMuaCIKICNpbmNsdWRlICJJbWFnZURl
Y29kZXJEaXJlY3QyRC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCiAj
aW5jbHVkZSA8ZDJkMS5oPgogI2VuZGlmCiAKQEAgLTIzOCwxNyArMjQwLDEyIEBAIE5hdGl2ZUlt
YWdlUHRyIFNWR0ltYWdlOjpuYXRpdmVJbWFnZShjb24KICAgICBpZiAoIVNVQ0NFRURFRChocikp
CiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgYXV0byB0YXJnZXRQcm9wZXJ0aWVzID0g
RDJEMTo6UmVuZGVyVGFyZ2V0UHJvcGVydGllcyhEMkQxX1JFTkRFUl9UQVJHRVRfVFlQRV9ERUZB
VUxULAotICAgICAgICBEMkQxOjpQaXhlbEZvcm1hdChEWEdJX0ZPUk1BVF9COEc4UjhBOF9VTk9S
TSwgRDJEMV9BTFBIQV9NT0RFX1BSRU1VTFRJUExJRUQpLAotICAgICAgICAwLCAwLCBEMkQxX1JF
TkRFUl9UQVJHRVRfVVNBR0VfTk9ORSwgRDJEMV9GRUFUVVJFX0xFVkVMX0RFRkFVTFQpOwotCi0g
ICAgLy8gRHJhdyB0aGUgU1ZHIGludG8gYSBiaXRtYXAuCi0gICAgQ09NUHRyPElEMkQxUmVuZGVy
VGFyZ2V0PiBuYXRpdmVJbWFnZVRhcmdldDsKLSAgICBociA9IEdyYXBoaWNzQ29udGV4dDo6c3lz
dGVtRmFjdG9yeSgpLT5DcmVhdGVXaWNCaXRtYXBSZW5kZXJUYXJnZXQobmF0aXZlSW1hZ2UuZ2V0
KCksICZ0YXJnZXRQcm9wZXJ0aWVzLCAmbmF0aXZlSW1hZ2VUYXJnZXQpOwotICAgIGlmICghbmF0
aXZlSW1hZ2VUYXJnZXQgfHwgIVNVQ0NFRURFRChocikpCisgICAgQ09NUHRyPElEMkQxUmVuZGVy
VGFyZ2V0PiBuYXRpdmVJbWFnZVRhcmdldCA9IERpcmVjdDJEOjpjcmVhdGVSZW5kZXJUYXJnZXRG
cm9tV0lDQml0bWFwKG5hdGl2ZUltYWdlLmdldCgpKTsKKyAgICBpZiAoIW5hdGl2ZUltYWdlVGFy
Z2V0KQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIEdyYXBoaWNzQ29udGV4dCBsb2Nh
bENvbnRleHQobmF0aXZlSW1hZ2VUYXJnZXQuZ2V0KCksIEdyYXBoaWNzQ29udGV4dDo6Qml0bWFw
UmVuZGVyaW5nQ29udGV4dFR5cGU6OkNQVU1lbW9yeSk7CisgICAgUGxhdGZvcm1Db250ZXh0RGly
ZWN0MkQgcGxhdGZvcm1Db250ZXh0KG5hdGl2ZUltYWdlVGFyZ2V0LmdldCgpKTsKKyAgICBHcmFw
aGljc0NvbnRleHQgbG9jYWxDb250ZXh0KCZwbGF0Zm9ybUNvbnRleHQsIEdyYXBoaWNzQ29udGV4
dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSk7CiAKICAgICBkcmF3KGxv
Y2FsQ29udGV4dCwgcmVjdCgpLCByZWN0KCksIENvbXBvc2l0ZVNvdXJjZU92ZXIsIEJsZW5kTW9k
ZTo6Tm9ybWFsLCBEZWNvZGluZ01vZGU6OlN5bmNocm9ub3VzLCBJbWFnZU9yaWVudGF0aW9uRGVz
Y3JpcHRpb24oKSk7CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>375172</attachid>
            <date>2019-07-30 13:32:54 -0700</date>
            <delta_ts>2019-07-30 14:51:48 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-200270-20190730133250.patch</filename>
            <type>text/plain</type>
            <size>208462</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0ODAwOSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ2IEBACisyMDE5LTA3LTMwICBCcmVudCBG
dWxnaGFtICA8YmZ1bGdoYW1AYXBwbGUuY29tPgorCisgICAgICAgIFtGVFddIFJlZmFjdG9yIERp
cmVjdDJEIGNvZGUgdG8gZm9sbG93IENhaXJvJ3MgbW9kZWwgdG8gc3VwcG9ydCBtb2Rlcm4gV2Vi
S2l0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDAy
NzAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBSZWZh
Y3RvciB0aGUgRGlyZWN0MkQgY29kZSBpbiBXZWJDb3JlIHNvIHRoYXQgdGhlIGNvcmUgcm91dGlu
ZXMgY2FuIGJlIHNoYXJlZAorICAgICAgICBiZXR3ZWVuIEdyYXBoaWNzQ29udGV4dCBhbmQgR3Jh
cGhpY3NDb250ZXh0SW1wbC4gSW1wbGVtZW50IFBsYXRmb3JtQ29udGV4dCwKKyAgICAgICAgQmFj
a2luZ1N0b3JlQmFja2VuZCwgYW5kIEdyYXBoaWNzQ29udGV4dEltcGwgZm9yIHRoZSBEaXJlY3Qy
RCBlbmdpbmUuCisgICAgICAgCisgICAgICAgIFRoaXMgcGF0Y2ggZWZmZWN0aXZlbHkganVzdCBt
b3ZlcyBjb2RlIGFyb3VuZC4KKworICAgICAgICAqIFBsYXRmb3JtRlRXLmNtYWtlOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dEltcGwuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9JbWFnZVNvdXJjZS5jcHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvUGF0
dGVybi5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5
TGlzdFJlY29yZGVyLmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlz
dHMvRGlzcGxheUxpc3RSZWNvcmRlci5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2VuZERp
cmVjdDJESW1wbC5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRGly
ZWN0MkRPcGVyYXRpb25zLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0RpcmVjdDJET3BlcmF0aW9ucy5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy93aW4vRGlyZWN0MkRVdGlsaXRpZXMuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vRGlyZWN0MkRVdGlsaXRpZXMuaDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYXNjYWRlRGlyZWN0MkQuY3BwOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFkaWVudERpcmVjdDJELmNwcDoKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0RGlyZWN0MkQuY3BwOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0SW1w
bERpcmVjdDJELmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5oOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRhdGFEaXJlY3QyRC5oOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRpcmVjdDJELmNwcDoKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW4vTmF0aXZlSW1hZ2VEaXJlY3QyRC5jcHA6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL1BhdGhEaXJlY3QyRC5jcHA6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL1BhdHRlcm5EaXJlY3QyRC5jcHA6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL1BsYXRmb3JtQ29udGV4dERpcmVjdDJELmNwcDogQWRkZWQuCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BsYXRmb3JtQ29udGV4dERpcmVjdDJELmg6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwOgorICAgICAgICAqIHN2Zy9n
cmFwaGljcy9TVkdJbWFnZS5jcHA6CisKIDIwMTktMDctMzAgIE1pY2hhZWwgQ2F0YW56YXJvICA8
bWNhdGFuemFyb0BpZ2FsaWEuY29tPgogCiAgICAgICAgIFtHVEtdIENvbXBpbGF0aW9uIGVycm9y
cyB3aGVuIEdMIGlzIGRpc2FibGVkCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUZUVy5j
bWFrZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUZUVy5jbWFrZQkocmV2
aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvUGxhdGZvcm1GVFcuY21ha2UJKHdvcmtp
bmcgY29weSkKQEAgLTQ1LDYgKzQ1LDcgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9TT1VSQ0VTCiAK
ICAgICBwbGF0Zm9ybS9ncmFwaGljcy9HTENvbnRleHQuY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhp
Y3MvR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlLmNwcAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dy
YXBoaWNzQ29udGV4dEltcGwuY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvUGxhdGZvcm1EaXNw
bGF5LmNwcAogCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvZWdsL0dMQ29udGV4dEVHTC5jcHAKQEAg
LTU3LDkgKzU4LDEyIEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09VUkNFUwogCiAgICAgcGxhdGZv
cm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVVdGlsaXRpZXMuY3BwCiAKKyAgICBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbC5jcHAKICAgICBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vQ29sb3JEaXJlY3QyRC5jcHAKICAgICBwbGF0Zm9ybS9ncmFw
aGljcy93aW4vQ29tcGxleFRleHRDb250cm9sbGVyRGlyZWN0V3JpdGUuY3BwCiAgICAgcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0RJQlBpeGVsRGF0YS5jcHAKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy93
aW4vRGlyZWN0MkRPcGVyYXRpb25zLmNwcAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJl
Y3QyRFV0aWxpdGllcy5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRmxvYXRQb2ludERp
cmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9GbG9hdFJlY3REaXJlY3QyRC5j
cHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRmxvYXRTaXplRGlyZWN0MkQuY3BwCkBAIC03
Myw2ICs3Nyw3IEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09VUkNFUwogICAgIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9HcmFkaWVudERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9HcmFwaGljc0NvbnRleHQzRERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9HcmFwaGljc0NvbnRleHREaXJlY3QyRC5jcHAKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9HcmFwaGljc0NvbnRleHRXaW4uY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ljb25X
aW4uY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQnVmZmVyRGF0YURpcmVjdDJE
LmNwcApAQCAtODcsNiArOTIsNyBAQCBsaXN0KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vTmF0aXZlSW1hZ2VEaXJlY3QyRC5jcHAKICAgICBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vUGF0aERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9QYXR0ZXJuRGlyZWN0MkQuY3BwCisgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BsYXRmb3Jt
Q29udGV4dERpcmVjdDJELmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250
RGF0YVdpbi5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFEaXJl
Y3QyRC5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vVGV4dEFuYWx5emVySGVscGVyLmNw
cApAQCAtMTQ5LDEyICsxNTUsMTkgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9QUklWQVRFX0ZSQU1F
V09SS19IRQogCiAgICAgcGFnZS93aW4vRnJhbWVXaW4uaAogCisgICAgcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyRC5oCisgICAgcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwuaAogICAgIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9ESUJQaXhlbERhdGEuaAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJl
Y3QyRE9wZXJhdGlvbnMuaAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJlY3QyRFV0aWxp
dGllcy5oCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Z1bGxTY3JlZW5Db250cm9sbGVyLmgK
ICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRnVsbFNjcmVlbkNvbnRyb2xsZXJDbGllbnQuaAor
ICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQuaAog
ICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRhdGFEaXJlY3QyRC5oCisgICAg
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlRGVjb2RlckRpcmVjdDJELmgKICAgICBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vTG9jYWxXaW5kb3dzQ29udGV4dC5oCiAgICAgcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL01lZGlhUGxheWVyUHJpdmF0ZUZ1bGxzY3JlZW5XaW5kb3cuaAorICAgIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9QbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oCiAgICAgcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL1NoYXJlZEdESU9iamVjdC5oCiAKICAgICBwbGF0Zm9ybS93aW4vQlN0cmluZy5o
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGlj
c0NvbnRleHQuaAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmgJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDcgKzQ0LDEw
IEBAIGludGVyZmFjZSBJRDJEMURDUmVuZGVyVGFyZ2V0OwogaW50ZXJmYWNlIElEMkQxUmVuZGVy
VGFyZ2V0OwogaW50ZXJmYWNlIElEMkQxRmFjdG9yeTsKIGludGVyZmFjZSBJRDJEMVNvbGlkQ29s
b3JCcnVzaDsKLXR5cGVkZWYgSUQyRDFSZW5kZXJUYXJnZXQgUGxhdGZvcm1HcmFwaGljc0NvbnRl
eHQ7CituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDsK
K30KK3R5cGVkZWYgV2ViQ29yZTo6UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQgUGxhdGZvcm1HcmFw
aGljc0NvbnRleHQ7CiAjZWxpZiBVU0UoQ0FJUk8pCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFz
cyBQbGF0Zm9ybUNvbnRleHRDYWlybzsKQEAgLTM0NywxMCArMzUwLDYgQEAgcHVibGljOgogICAg
IFdFQkNPUkVfRVhQT1JUIHZvaWQgZHJhd05hdGl2ZUltYWdlKGNvbnN0IE5hdGl2ZUltYWdlUHRy
JiwgY29uc3QgRmxvYXRTaXplJiBzZWxmU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwg
Y29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciA9IENvbXBvc2l0ZVNv
dXJjZU92ZXIsIEJsZW5kTW9kZSA9IEJsZW5kTW9kZTo6Tm9ybWFsLCBJbWFnZU9yaWVudGF0aW9u
ID0gSW1hZ2VPcmllbnRhdGlvbigpKTsKICNlbmRpZgogCi0jaWYgVVNFKERJUkVDVDJEKQotICAg
IHZvaWQgZHJhd0RldmljZUJpdG1hcChjb25zdCBDT01QdHI8SUQyRDFCaXRtYXA+JiwgY29uc3Qg
RmxvYXRTaXplJiBzZWxmU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxv
YXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciA9IENvbXBvc2l0ZVNvdXJjZU92ZXIs
IEJsZW5kTW9kZSA9IEJsZW5kTW9kZTo6Tm9ybWFsLCBJbWFnZU9yaWVudGF0aW9uID0gSW1hZ2VP
cmllbnRhdGlvbigpKTsKLSNlbmRpZgotCiAjaWYgVVNFKENHKSB8fCBVU0UoRElSRUNUMkQpCiAg
ICAgdm9pZCBhcHBseVN0cm9rZVBhdHRlcm4oKTsKICAgICB2b2lkIGFwcGx5RmlsbFBhdHRlcm4o
KTsKQEAgLTYxOSw5ICs2MTgsNyBAQCBwcml2YXRlOgogCiAjaWYgVVNFKERJUkVDVDJEKQogICAg
IHZvaWQgcGxhdGZvcm1Jbml0KEhEQywgSUQyRDFSZW5kZXJUYXJnZXQqKiwgUkVDVCwgYm9vbCBo
YXNBbHBoYSA9IGZhbHNlKTsKLSAgICB2b2lkIHBsYXRmb3JtSW5pdChQbGF0Zm9ybUdyYXBoaWNz
Q29udGV4dCosIEJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlKTsKLSAgICB2b2lkIGRyYXdXaXRo
b3V0U2hhZG93KGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdSZWN0LCBjb25zdCBXVEY6OkZ1bmN0
aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4mKTsKLSAgICB2b2lkIGRyYXdXaXRoU2hhZG93
KGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdSZWN0LCBjb25zdCBXVEY6OkZ1bmN0aW9uPHZvaWQo
SUQyRDFSZW5kZXJUYXJnZXQqKT4mKTsKKyAgICB2b2lkIHBsYXRmb3JtSW5pdChQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRCosIEJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlKTsKICNlbmRpZgogCiAg
ICAgdm9pZCBzYXZlUGxhdGZvcm1TdGF0ZSgpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0SW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dEltcGwuaAkocmV2aXNpb24g
MjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250
ZXh0SW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC03MSw3ICs3MSw3IEBAIHB1YmxpYzoKICAgICB2
aXJ0dWFsIEltYWdlRHJhd1Jlc3VsdCBkcmF3SW1hZ2UoSW1hZ2UmLCBjb25zdCBGbG9hdFJlY3Qm
IGRlc3RpbmF0aW9uLCBjb25zdCBGbG9hdFJlY3QmIHNvdXJjZSwgY29uc3QgSW1hZ2VQYWludGlu
Z09wdGlvbnMmKSA9IDA7CiAgICAgdmlydHVhbCBJbWFnZURyYXdSZXN1bHQgZHJhd1RpbGVkSW1h
Z2UoSW1hZ2UmLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RpbmF0aW9uLCBjb25zdCBGbG9hdFBvaW50
JiBzb3VyY2UsIGNvbnN0IEZsb2F0U2l6ZSYgdGlsZVNpemUsIGNvbnN0IEZsb2F0U2l6ZSYgc3Bh
Y2luZywgY29uc3QgSW1hZ2VQYWludGluZ09wdGlvbnMmKSA9IDA7CiAgICAgdmlydHVhbCBJbWFn
ZURyYXdSZXN1bHQgZHJhd1RpbGVkSW1hZ2UoSW1hZ2UmLCBjb25zdCBGbG9hdFJlY3QmIGRlc3Rp
bmF0aW9uLCBjb25zdCBGbG9hdFJlY3QmIHNvdXJjZSwgY29uc3QgRmxvYXRTaXplJiB0aWxlU2Nh
bGVGYWN0b3IsIEltYWdlOjpUaWxlUnVsZSBoUnVsZSwgSW1hZ2U6OlRpbGVSdWxlIHZSdWxlLCBj
b25zdCBJbWFnZVBhaW50aW5nT3B0aW9ucyYpID0gMDsKLSNpZiBVU0UoQ0cpIHx8IFVTRShDQUlS
TykKKyNpZiBVU0UoQ0cpIHx8IFVTRShDQUlSTykgfHwgVVNFKERJUkVDVDJEKQogICAgIHZpcnR1
YWwgdm9pZCBkcmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0aXZlSW1hZ2VQdHImLCBjb25zdCBGbG9h
dFNpemUmIHNlbGZTaXplLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJl
Y3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUsIEltYWdlT3JpZW50YXRp
b24pID0gMDsKICNlbmRpZgogICAgIHZpcnR1YWwgdm9pZCBkcmF3UGF0dGVybihJbWFnZSYsIGNv
bnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3Qg
QWZmaW5lVHJhbnNmb3JtJiwgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIGNvbnN0IEZsb2F0U2l6
ZSYgc3BhY2luZywgQ29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSA9IEJsZW5kTW9kZTo6Tm9y
bWFsKSA9IDA7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9JbWFnZVNv
dXJjZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
SW1hZ2VTb3VyY2UuY3BwCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9JbWFnZVNvdXJjZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM4LDYgKzM4
LDcgQEAKIAogI2lmIFVTRShESVJFQ1QyRCkKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
KyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oIgogI2VuZGlmCiAKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKQEAgLTY2MSw3ICs2NjIsNyBAQCBJbWFnZU9yaWVudGF0aW9uIEltYWdlU291
cmNlOjpmcmFtZU9yaWVuCiB2b2lkIEltYWdlU291cmNlOjpzZXRUYXJnZXRDb250ZXh0KGNvbnN0
IEdyYXBoaWNzQ29udGV4dCogdGFyZ2V0Q29udGV4dCkKIHsKICAgICBpZiAoaXNEZWNvZGVyQXZh
aWxhYmxlKCkgJiYgdGFyZ2V0Q29udGV4dCkKLSAgICAgICAgbV9kZWNvZGVyLT5zZXRUYXJnZXRD
b250ZXh0KHRhcmdldENvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICAgICAgbV9kZWNv
ZGVyLT5zZXRUYXJnZXRDb250ZXh0KHRhcmdldENvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5y
ZW5kZXJUYXJnZXQoKSk7CiB9CiAjZW5kaWYKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvUGF0dGVybi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL1BhdHRlcm4uaAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0dGVybi5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw2ICsz
OCwxMCBAQCB0eXBlZGVmIENHUGF0dGVyblJlZiBQbGF0Zm9ybVBhdHRlcm5QdHI7CiAjZWxpZiBV
U0UoRElSRUNUMkQpCiBpbnRlcmZhY2UgSUQyRDFCaXRtYXBCcnVzaDsKIHR5cGVkZWYgSUQyRDFC
aXRtYXBCcnVzaCogUGxhdGZvcm1QYXR0ZXJuUHRyOworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xh
c3MgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ7Cit9Cit0eXBlZGVmIFdlYkNvcmU6OlBsYXRmb3Jt
Q29udGV4dERpcmVjdDJEIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0OwogI2VsaWYgVVNFKENBSVJP
KQogdHlwZWRlZiBzdHJ1Y3QgX2NhaXJvX3BhdHRlcm4gY2Fpcm9fcGF0dGVybl90OwogdHlwZWRl
ZiBjYWlyb19wYXR0ZXJuX3QqIFBsYXRmb3JtUGF0dGVyblB0cjsKQEAgLTYyLDYgKzY2LDcgQEAg
cHVibGljOgogI2lmICFVU0UoRElSRUNUMkQpCiAgICAgUGxhdGZvcm1QYXR0ZXJuUHRyIGNyZWF0
ZVBsYXRmb3JtUGF0dGVybihjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHVzZXJTcGFjZVRyYW5zZm9y
bWF0aW9uKSBjb25zdDsKICNlbHNlCisgICAgUGxhdGZvcm1QYXR0ZXJuUHRyIGNyZWF0ZVBsYXRm
b3JtUGF0dGVybihQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCYsIGZsb2F0IGFscGhhLCBjb25zdCBB
ZmZpbmVUcmFuc2Zvcm0mIHVzZXJTcGFjZVRyYW5zZm9ybWF0aW9uKSBjb25zdDsKICAgICBQbGF0
Zm9ybVBhdHRlcm5QdHIgY3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGNvbnN0IEdyYXBoaWNzQ29udGV4
dCYsIGZsb2F0IGFscGhhLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHVzZXJTcGFjZVRyYW5zZm9y
bWF0aW9uKSBjb25zdDsKICNlbmRpZgogICAgIHZvaWQgc2V0UGF0dGVyblNwYWNlVHJhbnNmb3Jt
KGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblNwYWNlVHJhbnNmb3JtYXRpb24pOwpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlM
aXN0SXRlbXMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdEl0ZW1zLmNwcAkocmV2aXNpb24gMjQ4MDA4KQor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlM
aXN0SXRlbXMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00ODYsNyArNDg2LDcgQEAgc3RhdGljIFRl
eHRTdHJlYW0mIG9wZXJhdG9yPDwoVGV4dFN0cmVhbQogICAgIHJldHVybiB0czsKIH0KIAotI2lm
IFVTRShDRykgfHwgVVNFKENBSVJPKQorI2lmIFVTRShDRykgfHwgVVNFKENBSVJPKSB8fCBVU0Uo
RElSRUNUMkQpCiBEcmF3TmF0aXZlSW1hZ2U6OkRyYXdOYXRpdmVJbWFnZShjb25zdCBOYXRpdmVJ
bWFnZVB0ciYgaW1hZ2UsIGNvbnN0IEZsb2F0U2l6ZSYgaW1hZ2VTaXplLCBjb25zdCBGbG9hdFJl
Y3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9y
IG9wLCBCbGVuZE1vZGUgYmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0aW9uIG9yaWVudGF0aW9uKQog
ICAgIDogRHJhd2luZ0l0ZW0oSXRlbVR5cGU6OkRyYXdOYXRpdmVJbWFnZSkKICNpZiBVU0UoQ0cp
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlz
cGxheUxpc3RJdGVtcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdEl0ZW1zLmgJKHJldmlzaW9uIDI0ODAwOCkK
KysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5
TGlzdEl0ZW1zLmgJKHdvcmtpbmcgY29weSkKQEAgLTcwLDcgKzcwLDcgQEAgZW51bSBjbGFzcyBJ
dGVtVHlwZSB7CiAgICAgRHJhd0ltYWdlLAogICAgIERyYXdUaWxlZEltYWdlLAogICAgIERyYXdU
aWxlZFNjYWxlZEltYWdlLAotI2lmIFVTRShDRykgfHwgVVNFKENBSVJPKQorI2lmIFVTRShDRykg
fHwgVVNFKENBSVJPKSB8fCBVU0UoRElSRUNUMkQpCiAgICAgRHJhd05hdGl2ZUltYWdlLAogI2Vu
ZGlmCiAgICAgRHJhd1BhdHRlcm4sCkBAIC02MzgsNyArNjM4LDcgQEAgcHJpdmF0ZToKICAgICBJ
bWFnZVBhaW50aW5nT3B0aW9ucyBtX2ltYWdlUGFpbnRpbmdPcHRpb25zOwogfTsKIAotI2lmIFVT
RShDRykgfHwgVVNFKENBSVJPKQorI2lmIFVTRShDRykgfHwgVVNFKENBSVJPKSB8fCBVU0UoRElS
RUNUMkQpCiBjbGFzcyBEcmF3TmF0aXZlSW1hZ2UgOiBwdWJsaWMgRHJhd2luZ0l0ZW0gewogcHVi
bGljOgogICAgIHN0YXRpYyBSZWY8RHJhd05hdGl2ZUltYWdlPiBjcmVhdGUoY29uc3QgTmF0aXZl
SW1hZ2VQdHImIGltYWdlLCBjb25zdCBGbG9hdFNpemUmIGltYWdlU2l6ZSwgY29uc3QgRmxvYXRS
ZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRv
ciBvcCwgQmxlbmRNb2RlIGJsZW5kTW9kZSwgSW1hZ2VPcmllbnRhdGlvbiBvcmllbnRhdGlvbikK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNw
bGF5TGlzdFJlY29yZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxheUxpc3RSZWNvcmRlci5jcHAJKHJldmlzaW9u
IDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0
cy9EaXNwbGF5TGlzdFJlY29yZGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTI2LDcgKzEyNiw3
IEBAIEltYWdlRHJhd1Jlc3VsdCBSZWNvcmRlcjo6ZHJhd1RpbGVkSW1hZ2UKICAgICByZXR1cm4g
SW1hZ2VEcmF3UmVzdWx0OjpEaWRSZWNvcmQ7CiB9CiAKLSNpZiBVU0UoQ0cpIHx8IFVTRShDQUlS
TykKKyNpZiBVU0UoQ0cpIHx8IFVTRShDQUlSTykgfHwgVVNFKERJUkVDVDJEKQogdm9pZCBSZWNv
cmRlcjo6ZHJhd05hdGl2ZUltYWdlKGNvbnN0IE5hdGl2ZUltYWdlUHRyJiBpbWFnZSwgY29uc3Qg
RmxvYXRTaXplJiBpbWFnZVNpemUsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZs
b2F0UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIEJsZW5kTW9kZSBibGVuZE1v
ZGUsIEltYWdlT3JpZW50YXRpb24gb3JpZW50YXRpb24pCiB7CiAgICAgRHJhd2luZ0l0ZW0mIG5l
d0l0ZW0gPSBkb3duY2FzdDxEcmF3aW5nSXRlbT4oYXBwZW5kSXRlbShEcmF3TmF0aXZlSW1hZ2U6
OmNyZWF0ZShpbWFnZSwgaW1hZ2VTaXplLCBkZXN0UmVjdCwgc3JjUmVjdCwgb3AsIGJsZW5kTW9k
ZSwgb3JpZW50YXRpb24pKSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9kaXNwbGF5bGlzdHMvRGlzcGxheUxpc3RSZWNvcmRlci5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdFJlY29y
ZGVyLmgJKHJldmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdFJlY29yZGVyLmgJKHdvcmtpbmcgY29weSkKQEAg
LTkxLDcgKzkxLDcgQEAgcHJpdmF0ZToKICAgICBJbWFnZURyYXdSZXN1bHQgZHJhd0ltYWdlKElt
YWdlJiwgY29uc3QgRmxvYXRSZWN0JiBkZXN0aW5hdGlvbiwgY29uc3QgRmxvYXRSZWN0JiBzb3Vy
Y2UsIGNvbnN0IEltYWdlUGFpbnRpbmdPcHRpb25zJikgb3ZlcnJpZGU7CiAgICAgSW1hZ2VEcmF3
UmVzdWx0IGRyYXdUaWxlZEltYWdlKEltYWdlJiwgY29uc3QgRmxvYXRSZWN0JiBkZXN0aW5hdGlv
biwgY29uc3QgRmxvYXRQb2ludCYgc291cmNlLCBjb25zdCBGbG9hdFNpemUmIHRpbGVTaXplLCBj
b25zdCBGbG9hdFNpemUmIHNwYWNpbmcsIGNvbnN0IEltYWdlUGFpbnRpbmdPcHRpb25zJikgb3Zl
cnJpZGU7CiAgICAgSW1hZ2VEcmF3UmVzdWx0IGRyYXdUaWxlZEltYWdlKEltYWdlJiwgY29uc3Qg
RmxvYXRSZWN0JiBkZXN0aW5hdGlvbiwgY29uc3QgRmxvYXRSZWN0JiBzb3VyY2UsIGNvbnN0IEZs
b2F0U2l6ZSYgdGlsZVNjYWxlRmFjdG9yLCBJbWFnZTo6VGlsZVJ1bGUgaFJ1bGUsIEltYWdlOjpU
aWxlUnVsZSB2UnVsZSwgY29uc3QgSW1hZ2VQYWludGluZ09wdGlvbnMmKSBvdmVycmlkZTsKLSNp
ZiBVU0UoQ0cpIHx8IFVTRShDQUlSTykKKyNpZiBVU0UoQ0cpIHx8IFVTRShDQUlSTykgfHwgVVNF
KERJUkVDVDJEKQogICAgIHZvaWQgZHJhd05hdGl2ZUltYWdlKGNvbnN0IE5hdGl2ZUltYWdlUHRy
JiwgY29uc3QgRmxvYXRTaXplJiBzZWxmU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwg
Y29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlLCBJ
bWFnZU9yaWVudGF0aW9uKSBvdmVycmlkZTsKICNlbmRpZgogICAgIHZvaWQgZHJhd1BhdHRlcm4o
SW1hZ2UmLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1Jl
Y3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYsIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBjb25z
dCBGbG9hdFNpemUmIHNwYWNpbmcsIENvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUgPSBCbGVu
ZE1vZGU6Ok5vcm1hbCkgb3ZlcnJpZGU7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJELmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmRE
aXJlY3QyRC5oCShub25leGlzdGVudCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNwcmFnbWEgb25jZQorCisjaWYgVVNFKERJUkVDVDJEKQorCisjaW5jbHVkZSAiQ09NUHRy
LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgPHdpbmNvZGVjLmg+CisjaW5jbHVk
ZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKworCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEJhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyRCB7
CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJEKTsK
KyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5CYWNr
aW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQoKSA9IGRlZmF1bHQ7CisKKyAgICBJV0lDQml0bWFwKiBz
dXJmYWNlKCkgY29uc3QgeyByZXR1cm4gbV9zdXJmYWNlLmdldCgpOyB9CisgICAgY29uc3QgSW50
U2l6ZSYgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQorCisgICAgdmlydHVhbCB2b2lk
IHNjcm9sbChjb25zdCBJbnRSZWN0JiBzY3JvbGxSZWN0LCBjb25zdCBJbnRTaXplJiBzY3JvbGxP
ZmZzZXQpID0gMDsKKworcHJvdGVjdGVkOgorICAgIEJhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3Qy
RChjb25zdCBJbnRTaXplJiBzaXplKQorICAgICAgICA6IG1fc2l6ZShzaXplKQorICAgIHsKKyAg
ICB9CisKKyAgICBDT01QdHI8SVdJQ0JpdG1hcD4gbV9zdXJmYWNlOworICAgIHZvaWQqIG1fc3Vy
ZmFjZUJhY2tpbmdEYXRhOworICAgIEludFNpemUgbV9zaXplOworfTsKKworCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoRElSRUNUMkQpCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1w
bC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwuY3BwCShub25leGlzdGVudCkKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGly
ZWN0MkRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisg
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQor
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCYWNraW5nU3RvcmVCYWNrZW5kRGly
ZWN0MkRJbXBsLmgiCisKKyNpZiBVU0UoRElSRUNUMkQpCisKKyNpbmNsdWRlICJEaXJlY3QyRFV0
aWxpdGllcy5oIgorI2luY2x1ZGUgIkZsb2F0UG9pbnQuaCIKKyNpbmNsdWRlICJGbG9hdFNpemUu
aCIKKyNpbmNsdWRlICJJbWFnZURlY29kZXJEaXJlY3QyRC5oIgorI2luY2x1ZGUgIkludFJlY3Qu
aCIKKyNpbmNsdWRlICJJbnRTaXplLmgiCisjaW5jbHVkZSA8d2luY29kZWMuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3QgU2Vjb25kcyBzY3JvbGxIeXN0ZXJlc2lzRHVy
YXRpb24geyAzMDBfbXMgfTsKKworc3RhdGljIENPTVB0cjxJV0lDQml0bWFwPiBjcmVhdGVEaXJl
Y3QyREltYWdlU3VyZmFjZVdpdGhGYXN0TWFsbG9jKGNvbnN0IEludFNpemUmIHNpemUsIGRvdWJs
ZSBkZXZpY2VTY2FsZUZhY3Rvciwgdm9pZComIGJhY2tpbmdTdG9yZURhdGEpCit7CisgICAgYXV0
byBieXRlc1BlclJvdyA9IDQgKiBDaGVja2VkPHVuc2lnbmVkLCBSZWNvcmRPdmVyZmxvdz4oc2l6
ZS53aWR0aCgpKTsKKyAgICBpZiAoYnl0ZXNQZXJSb3cuaGFzT3ZlcmZsb3dlZCgpKQorICAgICAg
ICByZXR1cm4gbnVsbHB0cjsKKworICAgIENoZWNrZWQ8c2l6ZV90LCBSZWNvcmRPdmVyZmxvdz4g
bnVtQnl0ZXMgPSBDaGVja2VkPHVuc2lnbmVkLCBSZWNvcmRPdmVyZmxvdz4oc2l6ZS5oZWlnaHQo
KSkgKiBieXRlc1BlclJvdzsKKyAgICBpZiAobnVtQnl0ZXMuaGFzT3ZlcmZsb3dlZCgpKQorICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGJhY2tpbmdTdG9yZURhdGEgPSBmYXN0WmVyb2Vk
TWFsbG9jKG51bUJ5dGVzLnVuc2FmZUdldCgpKTsKKworICAgIHJldHVybiBEaXJlY3QyRDo6Y3Jl
YXRlRGlyZWN0MkRJbWFnZVN1cmZhY2VXaXRoRGF0YShiYWNraW5nU3RvcmVEYXRhLCBzaXplLCBi
eXRlc1BlclJvdy51bnNhZmVHZXQoKSk7Cit9CisKK0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3Qy
REltcGw6OkJhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwoY29uc3QgSW50U2l6ZSYgc2l6
ZSwgZmxvYXQgZGV2aWNlU2NhbGVGYWN0b3IpCisgICAgOiBCYWNraW5nU3RvcmVCYWNrZW5kRGly
ZWN0MkQoc2l6ZSkKKyAgICAsIG1fc2Nyb2xsZWRIeXN0ZXJlc2lzKFt0aGlzXShQQUw6Okh5c3Rl
cmVzaXNTdGF0ZSBzdGF0ZSkgeworICAgICAgICBpZiAoc3RhdGUgPT0gUEFMOjpIeXN0ZXJlc2lz
U3RhdGU6OlN0b3BwZWQpCisgICAgICAgICAgICBtX3Njcm9sbFN1cmZhY2UgPSBudWxscHRyOwor
ICAgICAgICB9LCBzY3JvbGxIeXN0ZXJlc2lzRHVyYXRpb24pCit7CisgICAgSW50U2l6ZSBzY2Fs
ZWRTaXplID0gbV9zaXplOworICAgIHNjYWxlZFNpemUuc2NhbGUoZGV2aWNlU2NhbGVGYWN0b3Ip
OworICAgIG1fc3VyZmFjZSA9IGNyZWF0ZURpcmVjdDJESW1hZ2VTdXJmYWNlV2l0aEZhc3RNYWxs
b2Moc2NhbGVkU2l6ZSwgZGV2aWNlU2NhbGVGYWN0b3IsIG1fc3VyZmFjZUJhY2tpbmdEYXRhKTsK
K30KKworQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbDo6fkJhY2tpbmdTdG9yZUJhY2tl
bmREaXJlY3QyREltcGwoKQoreworICAgIGZhc3RGcmVlKG1fc3VyZmFjZUJhY2tpbmdEYXRhKTsK
KyAgICBmYXN0RnJlZShtX3Njcm9sbFN1cmZhY2VCYWNraW5nRGF0YSk7Cit9CisKK3ZvaWQgQmFj
a2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbDo6c2Nyb2xsKGNvbnN0IEludFJlY3QmIHNjcm9s
bFJlY3QsIGNvbnN0IEludFNpemUmIHNjcm9sbE9mZnNldCkKK3sKKyAgICBJbnRSZWN0IHRhcmdl
dFJlY3QgPSBzY3JvbGxSZWN0OworICAgIHRhcmdldFJlY3QubW92ZShzY3JvbGxPZmZzZXQpOwor
ICAgIHRhcmdldFJlY3Quc2hpZnRNYXhYRWRnZVRvKHRhcmdldFJlY3QubWF4WCgpIC0gc2Nyb2xs
T2Zmc2V0LndpZHRoKCkpOworICAgIHRhcmdldFJlY3Quc2hpZnRNYXhZRWRnZVRvKHRhcmdldFJl
Y3QubWF4WSgpIC0gc2Nyb2xsT2Zmc2V0LmhlaWdodCgpKTsKKyAgICBpZiAodGFyZ2V0UmVjdC5p
c0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9zY3JvbGxTdXJmYWNlKSB7
CisgICAgICAgIGF1dG8gc2l6ZSA9IERpcmVjdDJEOjpiaXRtYXBTaXplKG1fc3VyZmFjZS5nZXQo
KSk7CisgICAgICAgIGF1dG8gc2NhbGUgPSBEaXJlY3QyRDo6Yml0bWFwUmVzb2x1dGlvbihtX3N1
cmZhY2UuZ2V0KCkpOworICAgICAgICBBU1NFUlQoc2NhbGUueCgpID09IHNjYWxlLnkoKSk7Cisg
ICAgICAgIG1fc2Nyb2xsU3VyZmFjZSA9IGNyZWF0ZURpcmVjdDJESW1hZ2VTdXJmYWNlV2l0aEZh
c3RNYWxsb2Moc2l6ZSwgc2NhbGUueCgpLCBtX3Njcm9sbFN1cmZhY2VCYWNraW5nRGF0YSk7Cisg
ICAgfQorCisgICAgRGlyZWN0MkQ6OmNvcHlSZWN0RnJvbU9uZVN1cmZhY2VUb0Fub3RoZXIobV9z
dXJmYWNlLmdldCgpLCBtX3Njcm9sbFN1cmZhY2UuZ2V0KCksIHNjcm9sbE9mZnNldCwgdGFyZ2V0
UmVjdCk7CisgICAgRGlyZWN0MkQ6OmNvcHlSZWN0RnJvbU9uZVN1cmZhY2VUb0Fub3RoZXIobV9z
Y3JvbGxTdXJmYWNlLmdldCgpLCBtX3N1cmZhY2UuZ2V0KCksIEludFNpemUoKSwgdGFyZ2V0UmVj
dCk7CisKKyAgICBtX3Njcm9sbGVkSHlzdGVyZXNpcy5pbXB1bHNlKCk7Cit9CisKK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShESVJFQ1QyRCkKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJ
bXBsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwuaAkobm9uZXhpc3RlbnQpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2VuZERpcmVj
dDJESW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
cHJhZ21hIG9uY2UKKworI2lmIFVTRShESVJFQ1QyRCkKKworI2luY2x1ZGUgIkJhY2tpbmdTdG9y
ZUJhY2tlbmREaXJlY3QyRC5oIgorI2luY2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1ZGUgPHBhbC9I
eXN0ZXJlc2lzQWN0aXZpdHkuaD4KKworaW50ZXJmYWNlIElXSUNCaXRtYXA7CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworY2xhc3MgQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1wbCBmaW5h
bCA6IHB1YmxpYyBCYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQgeworcHVibGljOgorICAgIFdF
QkNPUkVfRVhQT1JUIEJhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwoY29uc3QgSW50U2l6
ZSYsIGZsb2F0IGRldmljZVNjYWxlRmFjdG9yKTsKKyAgICB2aXJ0dWFsIH5CYWNraW5nU3RvcmVC
YWNrZW5kRGlyZWN0MkRJbXBsKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBzY3JvbGwoY29uc3Qg
SW50UmVjdCYsIGNvbnN0IEludFNpemUmKSBvdmVycmlkZTsKKworICAgIENPTVB0cjxJV0lDQml0
bWFwPiBtX3Njcm9sbFN1cmZhY2U7CisgICAgdm9pZCogbV9zY3JvbGxTdXJmYWNlQmFja2luZ0Rh
dGE7CisKKyAgICBQQUw6Okh5c3RlcmVzaXNBY3Rpdml0eSBtX3Njcm9sbGVkSHlzdGVyZXNpczsK
K307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShESVJFQ1QyRCkK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJlY3QyRE9wZXJh
dGlvbnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9EaXJlY3QyRE9wZXJhdGlvbnMuY3BwCShub25leGlzdGVudCkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJlY3QyRE9wZXJhdGlvbnMuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMTIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDE5
IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcg
QWxwIFRva2VyIDxhbHBAYXRva2VyLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBE
aXJrIFNjaHVsemUgPGtyaXRAd2Via2l0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBOdWFu
dGkgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEJyZW50IEZ1bGdoYW0gPGJmdWxnaGFtQHdl
YmtpdC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEgSWdhbGlhIFMuTC4KKyAqIENv
cHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMC4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkRpcmVjdDJET3BlcmF0aW9ucy5oIgorCisjaWYgVVNFKERJUkVDVDJEKQor
CisjaW5jbHVkZSAiRGlyZWN0MkRVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJGbG9hdENvbnZlcnNp
b24uaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQu
aCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5oIgor
I2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIKKyNpbmNsdWRlICJO
b3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBhdGguaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRC5oIgorI2luY2x1ZGUgIlNoYWRvd0JsdXIuaCIKKyNpbmNsdWRlIDxhbGdv
cml0aG0+CisjaW5jbHVkZSA8ZDJkMS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3Bh
Y2UgRGlyZWN0MkQgeworCitlbnVtIFBhdHRlcm5BZGp1c3RtZW50IHsgTm9BZGp1c3RtZW50LCBB
ZGp1c3RQYXR0ZXJuRm9yR2xvYmFsQWxwaGEgfTsKK2VudW0gQWxwaGFQcmVzZXJ2YXRpb24geyBE
b05vdFByZXNlcnZlQWxwaGEsIFByZXNlcnZlQWxwaGEgfTsKKworCitjbGFzcyBQbGF0Zm9ybUNv
bnRleHRTdGF0ZVNhdmVyIHsKK3B1YmxpYzoKKyAgICBQbGF0Zm9ybUNvbnRleHRTdGF0ZVNhdmVy
KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBjb250ZXh0LCBib29sIHNhdmVBbmRSZXN0b3JlID0g
dHJ1ZSkKKyAgICAgICAgOiBtX2NvbnRleHQoY29udGV4dCkKKyAgICAgICAgLCBtX3NhdmVBbmRS
ZXN0b3JlKHNhdmVBbmRSZXN0b3JlKQorICAgIHsKKyAgICAgICAgaWYgKG1fc2F2ZUFuZFJlc3Rv
cmUpCisgICAgICAgICAgICBtX2NvbnRleHQuc2F2ZSgpOworICAgIH0KKworICAgIH5QbGF0Zm9y
bUNvbnRleHRTdGF0ZVNhdmVyKCkKKyAgICB7CisgICAgICAgIGlmIChtX3NhdmVBbmRSZXN0b3Jl
KQorICAgICAgICAgICAgbV9jb250ZXh0LnJlc3RvcmUoKTsKKyAgICB9CisKKyAgICB2b2lkIHNh
dmUoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKCFtX3NhdmVBbmRSZXN0b3JlKTsKKyAgICAgICAg
bV9jb250ZXh0LnNhdmUoKTsKKyAgICAgICAgbV9zYXZlQW5kUmVzdG9yZSA9IHRydWU7CisgICAg
fQorCisgICAgdm9pZCByZXN0b3JlKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX3NhdmVBbmRS
ZXN0b3JlKTsKKyAgICAgICAgbV9jb250ZXh0LnJlc3RvcmUoKTsKKyAgICAgICAgbV9zYXZlQW5k
UmVzdG9yZSA9IGZhbHNlOworICAgIH0KKworICAgIGJvb2wgZGlkU2F2ZSgpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gbV9zYXZlQW5kUmVzdG9yZTsKKyAgICB9CisKK3ByaXZhdGU6Cisg
ICAgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIG1fY29udGV4dDsKKyAgICBib29sIG1fc2F2ZUFu
ZFJlc3RvcmUgeyBmYWxzZSB9OworfTsKKworLy8gRklYTUU6IFJlcGxhY2Ugb25jZSBHcmFwaGlj
c0NvbnRleHQ6OmRhc2hlZExpbmVDb3JuZXJXaWR0aEZvclN0cm9rZVdpZHRoKCkKKy8vIGlzIHJl
ZmFjdG9yZWQgYXMgYSBzdGF0aWMgcHVibGljIGZ1bmN0aW9uLgorc3RhdGljIGZsb2F0IGRhc2hl
ZExpbmVDb3JuZXJXaWR0aEZvclN0cm9rZVdpZHRoKGZsb2F0IHN0cm9rZVdpZHRoLCBTdHJva2VT
dHlsZSBzdHJva2VTdHlsZSwgZmxvYXQgc3Ryb2tlVGhpY2tuZXNzKQoreworICAgIHJldHVybiBz
dHJva2VTdHlsZSA9PSBEb3R0ZWRTdHJva2UgPyBzdHJva2VUaGlja25lc3MgOiBzdGQ6Om1pbigy
LjBmICogc3Ryb2tlVGhpY2tuZXNzLCBzdGQ6Om1heChzdHJva2VUaGlja25lc3MsIHN0cm9rZVdp
ZHRoIC8gMy4wZikpOworfQorCisvLyBGSVhNRTogUmVwbGFjZSBvbmNlIEdyYXBoaWNzQ29udGV4
dDo6ZGFzaGVkTGluZVBhdHRlcm5XaWR0aEZvclN0cm9rZVdpZHRoKCkKKy8vIGlzIHJlZmFjdG9y
ZWQgYXMgYSBzdGF0aWMgcHVibGljIGZ1bmN0aW9uLgorc3RhdGljIGZsb2F0IGRhc2hlZExpbmVQ
YXR0ZXJuV2lkdGhGb3JTdHJva2VXaWR0aChmbG9hdCBzdHJva2VXaWR0aCwgU3Ryb2tlU3R5bGUg
c3Ryb2tlU3R5bGUsIGZsb2F0IHN0cm9rZVRoaWNrbmVzcykKK3sKKyAgICByZXR1cm4gc3Ryb2tl
U3R5bGUgPT0gRG90dGVkU3Ryb2tlID8gc3Ryb2tlVGhpY2tuZXNzIDogc3RkOjptaW4oMy4wZiAq
IHN0cm9rZVRoaWNrbmVzcywgc3RkOjptYXgoc3Ryb2tlVGhpY2tuZXNzLCBzdHJva2VXaWR0aCAv
IDMuMGYpKTsKK30KKworLy8gRklYTUU6IFJlcGxhY2Ugb25jZSBHcmFwaGljc0NvbnRleHQ6OmRh
c2hlZExpbmVQYXR0ZXJuT2Zmc2V0Rm9yUGF0dGVybkFuZFN0cm9rZVdpZHRoKCkKKy8vIGlzIHJl
ZmFjdG9yZWQgYXMgYSBzdGF0aWMgcHVibGljIGZ1bmN0aW9uLgorc3RhdGljIGZsb2F0IGRhc2hl
ZExpbmVQYXR0ZXJuT2Zmc2V0Rm9yUGF0dGVybkFuZFN0cm9rZVdpZHRoKGZsb2F0IHBhdHRlcm5X
aWR0aCwgZmxvYXQgc3Ryb2tlV2lkdGgpCit7CisgICAgLy8gUGF0dGVybiBzdGFydHMgd2l0aCBm
dWxsIGZpbGwgYW5kIGVuZHMgd2l0aCB0aGUgZW1wdHkgZmlsbC4KKyAgICAvLyAxLiBMZXQncyBz
dGFydCB3aXRoIHRoZSBlbXB0eSBwaGFzZSBhZnRlciB0aGUgY29ybmVyLgorICAgIC8vIDIuIENo
ZWNrIGlmIHdlJ3ZlIGdvdCBvZGQgb3IgZXZlbiBudW1iZXIgb2YgcGF0dGVybnMgYW5kIHdoZXRo
ZXIgdGhleSBmdWxseSBjb3ZlciB0aGUgbGluZS4KKyAgICAvLyAzLiBJbiBjYXNlIG9mIGV2ZW4g
bnVtYmVyIG9mIHBhdHRlcm5zIGFuZC9vciByZW1haW5kZXIsIG1vdmUgdGhlIHBhdHRlcm4gc3Rh
cnQgcG9zaXRpb24KKyAgICAvLyBzbyB0aGF0IHRoZSBwYXR0ZXJuIGlzIGJhbGFuY2VkIGJldHdl
ZW4gdGhlIGNvcm5lcnMuCisgICAgZmxvYXQgcGF0dGVybk9mZnNldCA9IHBhdHRlcm5XaWR0aDsK
KyAgICBpbnQgbnVtYmVyT2ZTZWdtZW50cyA9IHN0ZDo6Zmxvb3Ioc3Ryb2tlV2lkdGggLyBwYXR0
ZXJuV2lkdGgpOworICAgIGJvb2wgb2RkTnVtYmVyT2ZTZWdtZW50cyA9IG51bWJlck9mU2VnbWVu
dHMgJSAyOworICAgIGZsb2F0IHJlbWFpbmRlciA9IHN0cm9rZVdpZHRoIC0gKG51bWJlck9mU2Vn
bWVudHMgKiBwYXR0ZXJuV2lkdGgpOworICAgIGlmIChvZGROdW1iZXJPZlNlZ21lbnRzICYmIHJl
bWFpbmRlcikKKyAgICAgICAgcGF0dGVybk9mZnNldCAtPSByZW1haW5kZXIgLyAyLjBmOworICAg
IGVsc2UgaWYgKCFvZGROdW1iZXJPZlNlZ21lbnRzKSB7CisgICAgICAgIGlmIChyZW1haW5kZXIp
CisgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9IHBhdHRlcm5PZmZzZXQgLSAocGF0dGVybldp
ZHRoICsgcmVtYWluZGVyKSAvIDIuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhdHRl
cm5PZmZzZXQgKz0gcGF0dGVybldpZHRoIC8gMi4wZjsKKyAgICB9CisKKyAgICByZXR1cm4gcGF0
dGVybk9mZnNldDsKK30KKworLy8gRklYTUU6IFJlcGxhY2Ugb25jZSBHcmFwaGljc0NvbnRleHQ6
OmNlbnRlckxpbmVBbmRDdXRPZmZDb3JuZXJzKCkKKy8vIGlzIHJlZmFjdG9yZWQgYXMgYSBzdGF0
aWMgcHVibGljIGZ1bmN0aW9uLgorc3RhdGljIFZlY3RvcjxGbG9hdFBvaW50PiBjZW50ZXJMaW5l
QW5kQ3V0T2ZmQ29ybmVycyhib29sIGlzVmVydGljYWxMaW5lLCBmbG9hdCBjb3JuZXJXaWR0aCwg
RmxvYXRQb2ludCBwb2ludDEsIEZsb2F0UG9pbnQgcG9pbnQyKQoreworICAgIC8vIENlbnRlciBs
aW5lIGFuZCBjdXQgb2ZmIGNvcm5lcnMgZm9yIHBhdHRlcm4gcGFpbnRpbmcuCisgICAgaWYgKGlz
VmVydGljYWxMaW5lKSB7CisgICAgICAgIGZsb2F0IGNlbnRlck9mZnNldCA9IChwb2ludDIueCgp
IC0gcG9pbnQxLngoKSkgLyAyLjBmOworICAgICAgICBwb2ludDEubW92ZShjZW50ZXJPZmZzZXQs
IGNvcm5lcldpZHRoKTsKKyAgICAgICAgcG9pbnQyLm1vdmUoLWNlbnRlck9mZnNldCwgLWNvcm5l
cldpZHRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbG9hdCBjZW50ZXJPZmZzZXQgPSAocG9p
bnQyLnkoKSAtIHBvaW50MS55KCkpIC8gMi4wZjsKKyAgICAgICAgcG9pbnQxLm1vdmUoY29ybmVy
V2lkdGgsIGNlbnRlck9mZnNldCk7CisgICAgICAgIHBvaW50Mi5tb3ZlKC1jb3JuZXJXaWR0aCwg
LWNlbnRlck9mZnNldCk7CisgICAgfQorCisgICAgcmV0dXJuIHsgcG9pbnQxLCBwb2ludDIgfTsK
K30KKworCituYW1lc3BhY2UgU3RhdGUgeworCit2b2lkIHNldFN0cm9rZVRoaWNrbmVzcyhQbGF0
Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBmbG9hdCBzdHJva2VUaGlja25l
c3MpCit7CisgICAgcGxhdGZvcm1Db250ZXh0LnNldFN0cm9rZVRoaWNrbmVzcyhzdHJva2VUaGlj
a25lc3MpOworfQorCit2b2lkIHNldFN0cm9rZVN0eWxlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
JiBwbGF0Zm9ybUNvbnRleHQsIFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlKQoreworICAgIHBsYXRm
b3JtQ29udGV4dC5zZXRTdHJva2VTdHlsZShzdHJva2VTdHlsZSk7Cit9CisKK3ZvaWQgc2V0Q29t
cG9zaXRlT3BlcmF0aW9uKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQs
IENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wZXJhdGlvbiwgQmxlbmRNb2RlIGJsZW5kTW9k
ZSkKK3sKKyAgICBEMkQxX0JMRU5EX01PREUgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9N
T0RFX1NDUkVFTjsKKyAgICBEMkQxX0NPTVBPU0lURV9NT0RFIHRhcmdldENvbXBvc2l0ZU1vZGUg
PSBEMkQxX0NPTVBPU0lURV9NT0RFX1NPVVJDRV9BVE9QOworCisgICAgaWYgKGJsZW5kTW9kZSAh
PSBCbGVuZE1vZGU6Ok5vcm1hbCkgeworICAgICAgICBzd2l0Y2ggKGJsZW5kTW9kZSkgeworICAg
ICAgICBjYXNlIEJsZW5kTW9kZTo6TXVsdGlwbHk6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1v
ZGUgPSBEMkQxX0JMRU5EX01PREVfTVVMVElQTFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBCbGVuZE1vZGU6OlNjcmVlbjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9
IEQyRDFfQkxFTkRfTU9ERV9TQ1JFRU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBCbGVuZE1vZGU6Ok92ZXJsYXk6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQx
X0JMRU5EX01PREVfT1ZFUkxBWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJs
ZW5kTW9kZTo6RGFya2VuOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVO
RF9NT0RFX0RBUktFTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9k
ZTo6TGlnaHRlbjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9E
RV9MSUdIVEVOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2RlOjpD
b2xvckRvZGdlOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RF
X0NPTE9SX0RPREdFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2Rl
OjpDb2xvckJ1cm46CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01P
REVfQ09MT1JfQlVSTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9k
ZTo6SGFyZExpZ2h0OgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9N
T0RFX0hBUkRfTElHSFQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVuZE1v
ZGU6OlNvZnRMaWdodDoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRf
TU9ERV9TT0ZUX0xJR0hUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRN
b2RlOjpEaWZmZXJlbmNlOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVO
RF9NT0RFX0RJRkZFUkVOQ0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVu
ZE1vZGU6OkV4Y2x1c2lvbjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxF
TkRfTU9ERV9FWENMVVNJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVu
ZE1vZGU6Okh1ZToKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9E
RV9IVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVuZE1vZGU6OlNhdHVy
YXRpb246CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfU0FU
VVJBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9kZTo6Q29s
b3I6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfQ09MT1I7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVuZE1vZGU6Okx1bWlub3NpdHk6
CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfTFVNSU5PU0lU
WTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9kZTo6UGx1c0Rhcmtl
cjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9EQVJLRVJf
Q09MT1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVuZE1vZGU6OlBsdXNM
aWdodGVyOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0xJ
R0hURVJfQ09MT1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChj
b21wb3NpdGVPcGVyYXRpb24pIHsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVDbGVhcjoKKyAgICAg
ICAgICAgIC8vIEZJWE1FOiB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfQ0xFQVI7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVDb3B5OgorICAgICAg
ICAgICAgLy8gRklYTUU6IHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DT1BZOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlU291cmNlT3ZlcjoKKyAg
ICAgICAgICAgIC8vIEZJWE1FOiBrQ0dCbGVuZE1vZGVOb3JtYWwKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZUluOgorICAgICAgICAgICAgdGFyZ2V0Q29t
cG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRFX01PREVfU09VUkNFX0lOOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlU291cmNlT3V0OgorICAgICAgICAgICAgdGFy
Z2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRFX01PREVfU09VUkNFX09VVDsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZUF0b3A6CisgICAgICAg
ICAgICB0YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9TT1VSQ0VfQVRP
UDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9u
T3ZlcjoKKyAgICAgICAgICAgIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9N
T0RFX0RFU1RJTkFUSU9OX09WRVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBD
b21wb3NpdGVEZXN0aW5hdGlvbkluOgorICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9
IEQyRDFfQ09NUE9TSVRFX01PREVfREVTVElOQVRJT05fSU47CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk91dDoKKyAgICAgICAgICAgIHRhcmdl
dENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX0RFU1RJTkFUSU9OX09VVDsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uQXRvcDoK
KyAgICAgICAgICAgIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX0RF
U1RJTkFUSU9OX0FUT1A7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb21wb3Np
dGVYT1I6CisgICAgICAgICAgICB0YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVf
TU9ERV9YT1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVQbHVz
RGFya2VyOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0RB
UktFUl9DT0xPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBvc2l0ZVBs
dXNMaWdodGVyOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RF
X0xJR0hURVJfQ09MT1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb21wb3Np
dGVEaWZmZXJlbmNlOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9N
T0RFX0RJRkZFUkVOQ0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIHBsYXRmb3JtQ29udGV4dC5zZXRCbGVuZE1vZGUodGFyZ2V0QmxlbmRNb2RlKTsKKyAgICBw
bGF0Zm9ybUNvbnRleHQuc2V0Q29tcG9zaXRlTW9kZSh0YXJnZXRDb21wb3NpdGVNb2RlKTsKK30K
Kwordm9pZCBzZXRTaG91bGRBbnRpYWxpYXMoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRm
b3JtQ29udGV4dCwgYm9vbCBlbmFibGUpCit7CisgICAgYXV0byBhbnRpYWxpYXNNb2RlID0gZW5h
YmxlID8gRDJEMV9BTlRJQUxJQVNfTU9ERV9QRVJfUFJJTUlUSVZFIDogRDJEMV9BTlRJQUxJQVNf
TU9ERV9BTElBU0VEOworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+U2V0QW50
aWFsaWFzTW9kZShhbnRpYWxpYXNNb2RlKTsKK30KKwordm9pZCBzZXRDVE0oUGxhdGZvcm1Db250
ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFu
c2Zvcm0pCit7CisgICAgQVNTRVJUKHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKSk7Cisg
ICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5TZXRUcmFuc2Zvcm0odHJhbnNmb3Jt
KTsKKworICAgIGlmIChhdXRvKiBncmFwaGljc0NvbnRleHRQcml2YXRlID0gcGxhdGZvcm1Db250
ZXh0LmdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0UHJp
dmF0ZS0+c2V0Q1RNKHRyYW5zZm9ybSk7Cit9CisKK0FmZmluZVRyYW5zZm9ybSBnZXRDVE0oUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCkKK3sKKyAgICBBU1NFUlQocGxh
dGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpKTsKKyAgICBEMkQxX01BVFJJWF8zWDJfRiBjdXJy
ZW50VHJhbnNmb3JtOworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+R2V0VHJh
bnNmb3JtKCZjdXJyZW50VHJhbnNmb3JtKTsKKyAgICByZXR1cm4gY3VycmVudFRyYW5zZm9ybTsK
K30KKworSW50UmVjdCBnZXRDbGlwQm91bmRzKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0
Zm9ybUNvbnRleHQpCit7CisgICAgRDJEMV9TSVpFX0YgY2xpcFNpemU7CisgICAgaWYgKGF1dG8g
Y2xpcExheWVyID0gcGxhdGZvcm1Db250ZXh0LmNsaXBMYXllcigpKQorICAgICAgICBjbGlwU2l6
ZSA9IGNsaXBMYXllci0+R2V0U2l6ZSgpOworICAgIGVsc2UKKyAgICAgICAgY2xpcFNpemUgPSBw
bGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkdldFNpemUoKTsKKworICAgIEZsb2F0UmVj
dCBjbGlwQm91bmRzKEludFBvaW50KCksIGNsaXBTaXplKTsKKworICAgIHJldHVybiBlbmNsb3Np
bmdJbnRSZWN0KGNsaXBCb3VuZHMpOworfQorCitGbG9hdFJlY3Qgcm91bmRUb0RldmljZVBpeGVs
cyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBGbG9hdFJl
Y3QmIHJlY3QpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKworICAgIHJldHVybiByZWN0Owor
fQorCitib29sIGlzQWNjZWxlcmF0ZWRDb250ZXh0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBw
bGF0Zm9ybUNvbnRleHQpCit7CisgICAgYXV0byByZW5kZXJQcm9wZXJ0aWVzID0gRDJEMTo6UmVu
ZGVyVGFyZ2V0UHJvcGVydGllcygpOworICAgIHJlbmRlclByb3BlcnRpZXMudHlwZSA9IEQyRDFf
UkVOREVSX1RBUkdFVF9UWVBFX0hBUkRXQVJFOworICAgIHJldHVybiBwbGF0Zm9ybUNvbnRleHQu
cmVuZGVyVGFyZ2V0KCktPklzU3VwcG9ydGVkKCZyZW5kZXJQcm9wZXJ0aWVzKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgU3RhdGUKKworRmlsbFNvdXJjZTo6RmlsbFNvdXJjZShjb25zdCBHcmFwaGlj
c0NvbnRleHRTdGF0ZSYgc3RhdGUsIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNv
bnRleHQpCisgICAgOiBnbG9iYWxBbHBoYShzdGF0ZS5hbHBoYSkKKyAgICAsIGNvbG9yKHN0YXRl
LmZpbGxDb2xvcikKKyAgICAsIGZpbGxSdWxlKHN0YXRlLmZpbGxSdWxlKQoreworICAgIGlmIChz
dGF0ZS5maWxsUGF0dGVybikgeworICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdXNlclRvQmFzZUNU
TTsgLy8gRklYTUU6IFRoaXMgaXNuJ3QgcmVhbGx5IG5lZWRlZCBvbiBXaW5kb3dzCisgICAgICAg
IGJydXNoID0gc3RhdGUuZmlsbFBhdHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihwbGF0Zm9y
bUNvbnRleHQsIHN0YXRlLmFscGhhLCB1c2VyVG9CYXNlQ1RNKTsKKyAgICB9IGVsc2UgaWYgKHN0
YXRlLmZpbGxHcmFkaWVudCkKKyAgICAgICAgYnJ1c2ggPSBzdGF0ZS5maWxsR3JhZGllbnQtPmNy
ZWF0ZVBsYXRmb3JtR3JhZGllbnRJZk5lY2Vzc2FyeShwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFy
Z2V0KCkpOworICAgIGVsc2UKKyAgICAgICAgYnJ1c2ggPSBwbGF0Zm9ybUNvbnRleHQuYnJ1c2hX
aXRoQ29sb3IoY29sb3IpOworfQorCitTdHJva2VTb3VyY2U6OlN0cm9rZVNvdXJjZShjb25zdCBH
cmFwaGljc0NvbnRleHRTdGF0ZSYgc3RhdGUsIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0
Zm9ybUNvbnRleHQpCisgICAgOiBnbG9iYWxBbHBoYShzdGF0ZS5hbHBoYSkKKyAgICAsIHRoaWNr
bmVzcyhzdGF0ZS5zdHJva2VUaGlja25lc3MpCisgICAgLCBjb2xvcihzdGF0ZS5zdHJva2VDb2xv
cikKK3sKKyAgICBpZiAoc3RhdGUuc3Ryb2tlUGF0dGVybikgeworICAgICAgICBBZmZpbmVUcmFu
c2Zvcm0gdXNlclRvQmFzZUNUTTsgLy8gRklYTUU6IFRoaXMgaXNuJ3QgcmVhbGx5IG5lZWRlZCBv
biBXaW5kb3dzCisgICAgICAgIGJydXNoID0gc3RhdGUuc3Ryb2tlUGF0dGVybi0+Y3JlYXRlUGxh
dGZvcm1QYXR0ZXJuKHBsYXRmb3JtQ29udGV4dCwgc3RhdGUuYWxwaGEsIHVzZXJUb0Jhc2VDVE0p
OworICAgIH0gZWxzZSBpZiAoc3RhdGUuc3Ryb2tlR3JhZGllbnQpCisgICAgICAgIGJydXNoID0g
c3RhdGUuc3Ryb2tlR3JhZGllbnQtPmNyZWF0ZVBsYXRmb3JtR3JhZGllbnRJZk5lY2Vzc2FyeShw
bGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpOworICAgIGVsc2UKKyAgICAgICAgYnJ1c2gg
PSBwbGF0Zm9ybUNvbnRleHQuYnJ1c2hXaXRoQ29sb3IoY29sb3IpOworfQorCitTaGFkb3dTdGF0
ZTo6U2hhZG93U3RhdGUoY29uc3QgR3JhcGhpY3NDb250ZXh0U3RhdGUmIHN0YXRlKQorICAgIDog
b2Zmc2V0KHN0YXRlLnNoYWRvd09mZnNldCkKKyAgICAsIGJsdXIoc3RhdGUuc2hhZG93Qmx1cikK
KyAgICAsIGNvbG9yKHN0YXRlLnNoYWRvd0NvbG9yKQorICAgICwgaWdub3JlVHJhbnNmb3Jtcyhz
dGF0ZS5zaGFkb3dzSWdub3JlVHJhbnNmb3JtcykKKyAgICAsIGdsb2JhbEFscGhhKHN0YXRlLmFs
cGhhKQorICAgICwgZ2xvYmFsQ29tcG9zaXRlT3BlcmF0b3Ioc3RhdGUuY29tcG9zaXRlT3BlcmF0
b3IpCit7Cit9CisKK2Jvb2wgU2hhZG93U3RhdGU6OmlzVmlzaWJsZSgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGNvbG9yLmlzVmlzaWJsZSgpICYmIChvZmZzZXQud2lkdGgoKSB8fCBvZmZzZXQuaGVp
Z2h0KCkgfHwgYmx1cik7Cit9CisKK2Jvb2wgU2hhZG93U3RhdGU6OmlzUmVxdWlyZWQoUGxhdGZv
cm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCkgY29uc3QKK3sKKyAgICAvLyBXZSBj
YW4ndCBhdm9pZCBTaGFkb3dCbHVyIGlmIHRoZSBzaGFkb3cgaGFzIGJsdXIuCisgICAgaWYgKGNv
bG9yLmlzVmlzaWJsZSgpICYmIGJsdXIpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8g
V2UgY2FuIGF2b2lkIFNoYWRvd0JsdXIgYW5kIG9wdGltaXplLCBzaW5jZSB3ZSdyZSBub3QgZHJh
d2luZyBvbiBhCisgICAgLy8gY2FudmFzIGFuZCBib3ggc2hhZG93cyBhcmUgYWZmZWN0ZWQgYnkg
dGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAgICBpZiAoIWlnbm9yZVRyYW5zZm9ybXMpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFdlIGNhbiBhdm9pZCBTaGFkb3dCbHVyLCBz
aW5jZSB0aGVyZSBhcmUgbm8gdHJhbnNmb3JtYXRpb25zIHRvIGFwcGx5IHRvIHRoZSBjYW52YXMu
CisgICAgaWYgKFN0YXRlOjpnZXRDVE0ocGxhdGZvcm1Db250ZXh0KS5pc0lkZW50aXR5KCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE90aGVyd2lzZSwgbm8gY2hhbmNlIGF2b2lk
aW5nIFNoYWRvd0JsdXIuCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgc2V0TGluZUNhcChQ
bGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBMaW5lQ2FwIGxpbmVDYXAp
Cit7CisgICAgRDJEMV9DQVBfU1RZTEUgY2FwU3R5bGUgPSBEMkQxX0NBUF9TVFlMRV9GTEFUOwor
ICAgIHN3aXRjaCAobGluZUNhcCkgeworICAgIGNhc2UgUm91bmRDYXA6CisgICAgICAgIGNhcFN0
eWxlID0gRDJEMV9DQVBfU1RZTEVfUk9VTkQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU3F1
YXJlQ2FwOgorICAgICAgICBjYXBTdHlsZSA9IEQyRDFfQ0FQX1NUWUxFX1NRVUFSRTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBCdXR0Q2FwOgorICAgIGRlZmF1bHQ6CisgICAgICAgIGNhcFN0
eWxlID0gRDJEMV9DQVBfU1RZTEVfRkxBVDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAg
cGxhdGZvcm1Db250ZXh0LnNldExpbmVDYXAoY2FwU3R5bGUpOworfQorCit2b2lkIHNldExpbmVE
YXNoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IERhc2hB
cnJheSYgZGFzaGVzLCBmbG9hdCBkYXNoT2Zmc2V0KQoreworICAgIHBsYXRmb3JtQ29udGV4dC5z
ZXREYXNoZXMoZGFzaGVzKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQuc2V0RGFzaE9mZnNldChkYXNo
T2Zmc2V0KTsKK30KKwordm9pZCBzZXRMaW5lSm9pbihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYg
cGxhdGZvcm1Db250ZXh0LCBMaW5lSm9pbiBsaW5lSm9pbikKK3sKKyAgICBEMkQxX0xJTkVfSk9J
TiBqb2luU3R5bGUgPSBEMkQxX0xJTkVfSk9JTl9NSVRFUjsKKyAgICBzd2l0Y2ggKGxpbmVKb2lu
KSB7CisgICAgY2FzZSBSb3VuZEpvaW46CisgICAgICAgIGpvaW5TdHlsZSA9IEQyRDFfTElORV9K
T0lOX1JPVU5EOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJldmVsSm9pbjoKKyAgICAgICAg
am9pblN0eWxlID0gRDJEMV9MSU5FX0pPSU5fQkVWRUw7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgTWl0ZXJKb2luOgorICAgIGRlZmF1bHQ6CisgICAgICAgIGpvaW5TdHlsZSA9IEQyRDFfTElO
RV9KT0lOX01JVEVSOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBwbGF0Zm9ybUNvbnRl
eHQuc2V0TGluZUpvaW4oam9pblN0eWxlKTsKK30KKwordm9pZCBzZXRNaXRlckxpbWl0KFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGZsb2F0IG1pdGVyTGltaXQpCit7
CisgICAgcGxhdGZvcm1Db250ZXh0LnNldE1pdGVyTGltaXQobWl0ZXJMaW1pdCk7Cit9CisKK3Zv
aWQgZmlsbFJlY3QoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29u
c3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBGaWxsU291cmNlJiBmaWxsU291cmNlLCBjb25zdCBT
aGFkb3dTdGF0ZSYgc2hhZG93U3RhdGUpCit7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1D
b250ZXh0LnJlbmRlclRhcmdldCgpOworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVf
Xyk7CisgICAgUGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKHBsYXRmb3JtQ29u
dGV4dCk7CisgICAgRnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiBkcmF3RnVuY3Rp
b24gPSBbJnBsYXRmb3JtQ29udGV4dCwgcmVjdCwgJmZpbGxTb3VyY2VdKElEMkQxUmVuZGVyVGFy
Z2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9
IHJlY3Q7CisgICAgICAgIHJlbmRlclRhcmdldC0+RmlsbFJlY3RhbmdsZSgmZDJkUmVjdCwgZmls
bFNvdXJjZS5icnVzaC5nZXQoKSk7CisgICAgfTsKKworICAgIGlmIChzaGFkb3dTdGF0ZS5pc1Zp
c2libGUoKSkKKyAgICAgICAgZHJhd1dpdGhTaGFkb3cocGxhdGZvcm1Db250ZXh0LCByZWN0LCBz
aGFkb3dTdGF0ZSwgZHJhd0Z1bmN0aW9uKTsKKyAgICBlbHNlCisgICAgICAgIGRyYXdXaXRob3V0
U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwgZHJhd0Z1bmN0aW9uKTsKK30KKwordm9pZCBm
aWxsUmVjdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBG
bG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvciwgY29uc3QgU2hhZG93U3RhdGUmIHNo
YWRvd1N0YXRlKQoreworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJU
YXJnZXQoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworICAgIFBsYXRm
b3JtQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihwbGF0Zm9ybUNvbnRleHQpOworICAgIEZ1
bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1bmN0aW9uID0gWyZwbGF0Zm9y
bUNvbnRleHQsIGNvbG9yLCByZWN0XShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7
CisgICAgICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSByZWN0OworICAgICAgICByZW5k
ZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUoJmQyZFJlY3QsIHBsYXRmb3JtQ29udGV4dC5icnVzaFdp
dGhDb2xvcihjb2xvcikuZ2V0KCkpOworICAgIH07CisKKyAgICBpZiAoc2hhZG93U3RhdGUuaXNW
aXNpYmxlKCkpCisgICAgICAgIGRyYXdXaXRoU2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwg
c2hhZG93U3RhdGUsIGRyYXdGdW5jdGlvbik7CisgICAgZWxzZQorICAgICAgICBkcmF3V2l0aG91
dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIHJlY3QsIGRyYXdGdW5jdGlvbik7Cit9CisKK3ZvaWQg
ZmlsbFJvdW5kZWRSZWN0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQs
IGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvciwgY29uc3Qg
U2hhZG93U3RhdGUmIHNoYWRvd1N0YXRlKQoreworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3Jt
Q29udGV4dC5yZW5kZXJUYXJnZXQoKTsKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9f
KTsKKworICAgIGNvbnN0IEZsb2F0UmVjdCYgciA9IHJlY3QucmVjdCgpOworICAgIGNvbnN0IEZs
b2F0Um91bmRlZFJlY3Q6OlJhZGlpJiByYWRpaSA9IHJlY3QucmFkaWkoKTsKKyAgICBib29sIGVx
dWFsV2lkdGhzID0gKHJhZGlpLnRvcExlZnQoKS53aWR0aCgpID09IHJhZGlpLnRvcFJpZ2h0KCku
d2lkdGgoKSAmJiByYWRpaS50b3BSaWdodCgpLndpZHRoKCkgPT0gcmFkaWkuYm90dG9tTGVmdCgp
LndpZHRoKCkgJiYgcmFkaWkuYm90dG9tTGVmdCgpLndpZHRoKCkgPT0gcmFkaWkuYm90dG9tUmln
aHQoKS53aWR0aCgpKTsKKyAgICBib29sIGVxdWFsSGVpZ2h0cyA9IChyYWRpaS50b3BMZWZ0KCku
aGVpZ2h0KCkgPT0gcmFkaWkuYm90dG9tTGVmdCgpLmhlaWdodCgpICYmIHJhZGlpLmJvdHRvbUxl
ZnQoKS5oZWlnaHQoKSA9PSByYWRpaS50b3BSaWdodCgpLmhlaWdodCgpICYmIHJhZGlpLnRvcFJp
Z2h0KCkuaGVpZ2h0KCkgPT0gcmFkaWkuYm90dG9tUmlnaHQoKS5oZWlnaHQoKSk7CisgICAgYm9v
bCBoYXNDdXN0b21GaWxsID0gZmFsc2U7IC8vIEZJWE1FOiBXaHkgaXNuJ3QgYSBGaWxsU291cmNl
IHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uPworICAgIGlmICghaGFzQ3VzdG9tRmlsbCAmJiBlcXVh
bFdpZHRocyAmJiBlcXVhbEhlaWdodHMgJiYgcmFkaWkudG9wTGVmdCgpLndpZHRoKCkgKiAyID09
IHIud2lkdGgoKSAmJiByYWRpaS50b3BMZWZ0KCkuaGVpZ2h0KCkgKiAyID09IHIuaGVpZ2h0KCkp
IHsKKyAgICAgICAgUGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKHBsYXRmb3Jt
Q29udGV4dCk7CisgICAgICAgIEZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJh
d0Z1bmN0aW9uID0gWyZwbGF0Zm9ybUNvbnRleHQsIGNvbG9yLCByZWN0LCByYWRpaSwgcl0oSUQy
RDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICAgICAgYXV0byByb3VuZGVk
UmVjdCA9IEQyRDE6OlJvdW5kZWRSZWN0KHIsIHJhZGlpLnRvcExlZnQoKS53aWR0aCgpLCByYWRp
aS50b3BMZWZ0KCkuaGVpZ2h0KCkpOworICAgICAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsUm91
bmRlZFJlY3RhbmdsZSgmcm91bmRlZFJlY3QsIHBsYXRmb3JtQ29udGV4dC5icnVzaFdpdGhDb2xv
cihjb2xvcikuZ2V0KCkpOworICAgICAgICB9OworCisgICAgICAgIGlmIChzaGFkb3dTdGF0ZS5p
c1Zpc2libGUoKSkKKyAgICAgICAgICAgIGRyYXdXaXRoU2hhZG93KHBsYXRmb3JtQ29udGV4dCwg
ciwgc2hhZG93U3RhdGUsIGRyYXdGdW5jdGlvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgciwgZHJhd0Z1bmN0aW9uKTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBQbGF0Zm9ybUNvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIo
cGxhdGZvcm1Db250ZXh0KTsKKyAgICAgICAgUGF0aCBwYXRoOworICAgICAgICBwYXRoLmFkZFJv
dW5kZWRSZWN0KHJlY3QpOworICAgICAgICBmaWxsUGF0aChwbGF0Zm9ybUNvbnRleHQsIHBhdGgs
IGNvbG9yLCBzaGFkb3dTdGF0ZSk7CisgICAgfQorfQorCit2b2lkIGZpbGxSZWN0V2l0aFJvdW5k
ZWRIb2xlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZs
b2F0UmVjdCYgcmVjdCwgY29uc3QgRmxvYXRSb3VuZGVkUmVjdCYgcm91bmRlZEhvbGVSZWN0LCBj
b25zdCBGaWxsU291cmNlJiBmaWxsU291cmNlLCBjb25zdCBTaGFkb3dTdGF0ZSYgc2hhZG93U3Rh
dGUpCit7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgp
OworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAgICBQYXRoIHBhdGg7
CisgICAgcGF0aC5hZGRSZWN0KHJlY3QpOworCisgICAgaWYgKCFyb3VuZGVkSG9sZVJlY3QucmFk
aWkoKS5pc1plcm8oKSkKKyAgICAgICAgcGF0aC5hZGRSb3VuZGVkUmVjdChyb3VuZGVkSG9sZVJl
Y3QpOworICAgIGVsc2UKKyAgICAgICAgcGF0aC5hZGRSZWN0KHJvdW5kZWRIb2xlUmVjdC5yZWN0
KCkpOworCisgICAgRmlsbFNvdXJjZSBmaWxsV2l0aEhvbGVTb3VyY2UgPSBmaWxsU291cmNlOwor
ICAgIGZpbGxXaXRoSG9sZVNvdXJjZS5maWxsUnVsZSA9IFdpbmRSdWxlOjpFdmVuT2RkOworCisg
ICAgZmlsbFBhdGgocGxhdGZvcm1Db250ZXh0LCBwYXRoLCBmaWxsU291cmNlLCBzaGFkb3dTdGF0
ZSk7Cit9CisKK3ZvaWQgZmlsbFJlY3RXaXRoR3JhZGllbnQoUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiByZWN0LCBJRDJEMUJydXNoKiBn
cmFkaWVudCkKK3sKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFy
Z2V0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKyAgICBQbGF0Zm9y
bUNvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIocGxhdGZvcm1Db250ZXh0KTsKKyAgICBGdW5j
dGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+IGRyYXdGdW5jdGlvbiA9IFsmcGxhdGZvcm1D
b250ZXh0LCByZWN0LCAmZ3JhZGllbnRdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQp
IHsKKyAgICAgICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9IHJlY3Q7CisgICAgICAgIHJl
bmRlclRhcmdldC0+RmlsbFJlY3RhbmdsZSgmZDJkUmVjdCwgZ3JhZGllbnQpOworICAgIH07Cit9
CisKK3ZvaWQgZmlsbFBhdGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4
dCwgY29uc3QgUGF0aCYgcGF0aCwgY29uc3QgRmlsbFNvdXJjZSYgZmlsbFNvdXJjZSwgY29uc3Qg
U2hhZG93U3RhdGUmIHNoYWRvd1N0YXRlKQoreworICAgIGlmIChwYXRoLmFjdGl2ZVBhdGgoKSkg
eworICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBjbG9zZWQuIFRoaXMgbWlnaHQgZmFpbCBpZiB0
aGUgcGF0aCB3YXMgYWxyZWFkeSBjbG9zZWQsIHNvCisgICAgICAgIC8vIGlnbm9yZSB0aGUgcmV0
dXJuIHZhbHVlLgorICAgICAgICBwYXRoLmFjdGl2ZVBhdGgoKS0+Q2xvc2UoKTsKKyAgICB9CisK
KyAgICBQbGF0Zm9ybUNvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIocGxhdGZvcm1Db250ZXh0
KTsKKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKTsK
KworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworCisgICAgQ09NUHRyPElEMkQx
R2VvbWV0cnlHcm91cD4gcGF0aFRvRmlsbDsKKyAgICBwYXRoLmNyZWF0ZUdlb21ldHJ5V2l0aEZp
bGxNb2RlKGZpbGxTb3VyY2UuZmlsbFJ1bGUsIHBhdGhUb0ZpbGwpOworCisgICAgY29udGV4dC0+
U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAgICBGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFy
Z2V0Kik+IGRyYXdGdW5jdGlvbiA9IFsmcGxhdGZvcm1Db250ZXh0LCAmcGF0aFRvRmlsbCwgJmZp
bGxTb3VyY2VdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgcmVu
ZGVyVGFyZ2V0LT5GaWxsR2VvbWV0cnkocGF0aFRvRmlsbC5nZXQoKSwgZmlsbFNvdXJjZS5icnVz
aC5nZXQoKSk7CisgICAgfTsKKworICAgIGlmIChzaGFkb3dTdGF0ZS5pc1Zpc2libGUoKSkgewor
ICAgICAgICBGbG9hdFJlY3QgYm91bmRpbmdSZWN0ID0gcGF0aC5mYXN0Qm91bmRpbmdSZWN0KCk7
CisgICAgICAgIGRyYXdXaXRoU2hhZG93KHBsYXRmb3JtQ29udGV4dCwgYm91bmRpbmdSZWN0LCBz
aGFkb3dTdGF0ZSwgZHJhd0Z1bmN0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBGbG9hdFJl
Y3QgY29udGV4dFJlY3QoRmxvYXRQb2ludCgpLCBjb250ZXh0LT5HZXRTaXplKCkpOworICAgICAg
ICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIGNvbnRleHRSZWN0LCBkcmF3RnVu
Y3Rpb24pOworICAgIH0KKworICAgIGZsdXNoKHBsYXRmb3JtQ29udGV4dCk7Cit9CisKK3ZvaWQg
ZmlsbFBhdGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3Qg
UGF0aCYgcGF0aCwgY29uc3QgQ29sb3ImIGNvbG9yLCBjb25zdCBTaGFkb3dTdGF0ZSYgc2hhZG93
U3RhdGUpCit7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdl
dCgpOworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAgICBDT01QdHI8
SUQyRDFHZW9tZXRyeUdyb3VwPiBwYXRoVG9GaWxsOworICAgIHBhdGguY3JlYXRlR2VvbWV0cnlX
aXRoRmlsbE1vZGUoV2luZFJ1bGU6OkV2ZW5PZGQsIHBhdGhUb0ZpbGwpOworCisgICAgY29udGV4
dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAgICBGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVy
VGFyZ2V0Kik+IGRyYXdGdW5jdGlvbiA9IFsmcGxhdGZvcm1Db250ZXh0LCAmcGF0aFRvRmlsbCwg
Y29sb3JdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgcmVuZGVy
VGFyZ2V0LT5GaWxsR2VvbWV0cnkocGF0aFRvRmlsbC5nZXQoKSwgcGxhdGZvcm1Db250ZXh0LmJy
dXNoV2l0aENvbG9yKGNvbG9yKS5nZXQoKSk7CisgICAgfTsKKworICAgIGlmIChzaGFkb3dTdGF0
ZS5pc1Zpc2libGUoKSkgeworICAgICAgICBGbG9hdFJlY3QgYm91bmRpbmdSZWN0ID0gcGF0aC5m
YXN0Qm91bmRpbmdSZWN0KCk7CisgICAgICAgIGRyYXdXaXRoU2hhZG93KHBsYXRmb3JtQ29udGV4
dCwgYm91bmRpbmdSZWN0LCBzaGFkb3dTdGF0ZSwgZHJhd0Z1bmN0aW9uKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICBGbG9hdFJlY3QgY29udGV4dFJlY3QoRmxvYXRQb2ludCgpLCBjb250ZXh0LT5H
ZXRTaXplKCkpOworICAgICAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIGNv
bnRleHRSZWN0LCBkcmF3RnVuY3Rpb24pOworICAgIH0KKworICAgIGZsdXNoKHBsYXRmb3JtQ29u
dGV4dCk7Cit9CisKK3ZvaWQgc3Ryb2tlUmVjdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxh
dGZvcm1Db250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGZsb2F0IGxpbmVXaWR0aCwgY29u
c3QgU3Ryb2tlU291cmNlJiBzdHJva2VTb3VyY2UsIGNvbnN0IFNoYWRvd1N0YXRlJiBzaGFkb3dT
dGF0ZSkKK3sKKyAgICBGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+IGRyYXdGdW5j
dGlvbiA9IFsmcGxhdGZvcm1Db250ZXh0LCAmc3Ryb2tlU291cmNlLCByZWN0LCBsaW5lV2lkdGhd
KElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgcmVuZGVyVGFyZ2V0
LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKyAgICAgICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVj
dCA9IHJlY3Q7CisgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd1JlY3RhbmdsZSgmZDJkUmVjdCwg
c3Ryb2tlU291cmNlLmJydXNoLmdldCgpLCBsaW5lV2lkdGgsIHBsYXRmb3JtQ29udGV4dC5zdHJv
a2VTdHlsZSgpKTsKKyAgICB9OworCisgICAgaWYgKHNoYWRvd1N0YXRlLmlzVmlzaWJsZSgpKQor
ICAgICAgICBkcmF3V2l0aFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIHJlY3QsIHNoYWRvd1N0YXRl
LCBkcmF3RnVuY3Rpb24pOworICAgIGVsc2UKKyAgICAgICAgZHJhd1dpdGhvdXRTaGFkb3cocGxh
dGZvcm1Db250ZXh0LCByZWN0LCBkcmF3RnVuY3Rpb24pOworfQorCit2b2lkIHN0cm9rZVBhdGgo
UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgUGF0aCYgcGF0
aCwgY29uc3QgU3Ryb2tlU291cmNlJiBzdHJva2VTb3VyY2UsIGNvbnN0IFNoYWRvd1N0YXRlJiBz
aGFkb3dTdGF0ZSkKK3sKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVy
VGFyZ2V0KCk7CisgICAgCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAg
ICBQbGF0Zm9ybUNvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIocGxhdGZvcm1Db250ZXh0KTsK
KyAgICBhdXRvIGJvdW5kaW5nUmVjdCA9IHBhdGguZmFzdEJvdW5kaW5nUmVjdCgpOworICAgIEZ1
bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1bmN0aW9uID0gWyZwbGF0Zm9y
bUNvbnRleHQsICZwYXRoLCAmc3Ryb2tlU291cmNlXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVy
VGFyZ2V0KSB7CisgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0dlb21ldHJ5KHBhdGgucGxhdGZv
cm1QYXRoKCksIHN0cm9rZVNvdXJjZS5icnVzaC5nZXQoKSwgc3Ryb2tlU291cmNlLnRoaWNrbmVz
cywgcGxhdGZvcm1Db250ZXh0LnN0cm9rZVN0eWxlKCkpOworICAgIH07CisKKyAgICBpZiAoc2hh
ZG93U3RhdGUuaXNWaXNpYmxlKCkpCisgICAgICAgIGRyYXdXaXRoU2hhZG93KHBsYXRmb3JtQ29u
dGV4dCwgYm91bmRpbmdSZWN0LCBzaGFkb3dTdGF0ZSwgZHJhd0Z1bmN0aW9uKTsKKyAgICBlbHNl
CisgICAgICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgYm91bmRpbmdSZWN0
LCBkcmF3RnVuY3Rpb24pOworCisgICAgZmx1c2gocGxhdGZvcm1Db250ZXh0KTsKK30KKwordm9p
ZCBkcmF3UGF0aChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25z
dCBQYXRoJiBwYXRoLCBjb25zdCBTdHJva2VTb3VyY2UmIHN0cm9rZVNvdXJjZSwgY29uc3QgU2hh
ZG93U3RhdGUmKQoreworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJU
YXJnZXQoKTsKKworICAgIGlmIChwYXRoLmFjdGl2ZVBhdGgoKSkKKyAgICAgICAgcGF0aC5hY3Rp
dmVQYXRoKCktPkNsb3NlKCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsK
KworICAgIGF1dG8gcmVjdCA9IHBhdGguZmFzdEJvdW5kaW5nUmVjdCgpOworICAgIGRyYXdXaXRo
b3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwgWyZwbGF0Zm9ybUNvbnRleHQsICZzdHJv
a2VTb3VyY2UsICZwYXRoXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAg
ICAgIHJlbmRlclRhcmdldC0+RHJhd0dlb21ldHJ5KHBhdGgucGxhdGZvcm1QYXRoKCksIHN0cm9r
ZVNvdXJjZS5icnVzaC5nZXQoKSwgc3Ryb2tlU291cmNlLnRoaWNrbmVzcywgcGxhdGZvcm1Db250
ZXh0LnN0cm9rZVN0eWxlKCkpOworICAgIH0pOworCisgICAgZmx1c2gocGxhdGZvcm1Db250ZXh0
KTsKK30KKwordm9pZCBkcmF3V2l0aFNoYWRvd0hlbHBlcihJRDJEMVJlbmRlclRhcmdldCogY29u
dGV4dCwgSUQyRDFCaXRtYXAqIGJpdG1hcCwgY29uc3QgQ29sb3ImIHNoYWRvd0NvbG9yLCBjb25z
dCBGbG9hdFNpemUmIHNoYWRvd09mZnNldCwgZmxvYXQgc2hhZG93Qmx1cikKK3sKKyAgICBDT01Q
dHI8SUQyRDFEZXZpY2VDb250ZXh0PiBkZXZpY2VDb250ZXh0OworICAgIEhSRVNVTFQgaHIgPSBj
b250ZXh0LT5RdWVyeUludGVyZmFjZSgmZGV2aWNlQ29udGV4dCk7CisgICAgUkVMRUFTRV9BU1NF
UlQoU1VDQ0VFREVEKGhyKSk7CisKKyAgICAvLyBDcmVhdGUgdGhlIHNoYWRvdyBlZmZlY3QKKyAg
ICBDT01QdHI8SUQyRDFFZmZlY3Q+IHNoYWRvd0VmZmVjdDsKKyAgICBociA9IGRldmljZUNvbnRl
eHQtPkNyZWF0ZUVmZmVjdChDTFNJRF9EMkQxU2hhZG93LCAmc2hhZG93RWZmZWN0KTsKKyAgICBS
RUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKworICAgIHNoYWRvd0VmZmVjdC0+U2V0SW5w
dXQoMCwgYml0bWFwKTsKKyAgICBzaGFkb3dFZmZlY3QtPlNldFZhbHVlKEQyRDFfU0hBRE9XX1BS
T1BfQ09MT1IsIHN0YXRpY19jYXN0PEQyRDFfVkVDVE9SXzRGPihzaGFkb3dDb2xvcikpOworICAg
IHNoYWRvd0VmZmVjdC0+U2V0VmFsdWUoRDJEMV9TSEFET1dfUFJPUF9CTFVSX1NUQU5EQVJEX0RF
VklBVElPTiwgc2hhZG93Qmx1cik7CisKKyAgICBDT01QdHI8SUQyRDFFZmZlY3Q+IHRyYW5zZm9y
bUVmZmVjdDsKKyAgICBociA9IGRldmljZUNvbnRleHQtPkNyZWF0ZUVmZmVjdChDTFNJRF9EMkQx
MkRBZmZpbmVUcmFuc2Zvcm0sICZ0cmFuc2Zvcm1FZmZlY3QpOworICAgIFJFTEVBU0VfQVNTRVJU
KFNVQ0NFRURFRChocikpOworCisgICAgdHJhbnNmb3JtRWZmZWN0LT5TZXRJbnB1dEVmZmVjdCgw
LCBzaGFkb3dFZmZlY3QuZ2V0KCkpOworCisgICAgYXV0byB0cmFuc2xhdGlvbiA9IEQyRDE6Ok1h
dHJpeDN4MkY6OlRyYW5zbGF0aW9uKHNoYWRvd09mZnNldC53aWR0aCgpLCBzaGFkb3dPZmZzZXQu
aGVpZ2h0KCkpOworICAgIHRyYW5zZm9ybUVmZmVjdC0+U2V0VmFsdWUoRDJEMV8yREFGRklORVRS
QU5TRk9STV9QUk9QX1RSQU5TRk9STV9NQVRSSVgsIHRyYW5zbGF0aW9uKTsKKworICAgIENPTVB0
cjxJRDJEMUVmZmVjdD4gY29tcG9zaXRvcjsKKyAgICBociA9IGRldmljZUNvbnRleHQtPkNyZWF0
ZUVmZmVjdChDTFNJRF9EMkQxQ29tcG9zaXRlLCAmY29tcG9zaXRvcik7CisgICAgUkVMRUFTRV9B
U1NFUlQoU1VDQ0VFREVEKGhyKSk7CisKKyAgICBjb21wb3NpdG9yLT5TZXRJbnB1dEVmZmVjdCgw
LCB0cmFuc2Zvcm1FZmZlY3QuZ2V0KCkpOworICAgIGNvbXBvc2l0b3ItPlNldElucHV0KDEsIGJp
dG1hcCk7CisKKyAgICAvLyBGbGlwIHRoZSBjb250ZXh0CisgICAgRDJEMV9NQVRSSVhfM1gyX0Yg
Y3RtOworICAgIGRldmljZUNvbnRleHQtPkdldFRyYW5zZm9ybSgmY3RtKTsKKyAgICBhdXRvIHRy
YW5zbGF0ZSA9IEQyRDE6Ok1hdHJpeDN4MkY6OlRyYW5zbGF0aW9uKDAuMGYsIGRldmljZUNvbnRl
eHQtPkdldFNpemUoKS5oZWlnaHQpOworICAgIGF1dG8gZmxpcCA9IEQyRDE6Ok1hdHJpeDN4MkY6
OlNjYWxlKEQyRDE6OlNpemVGKDEuMGYsIC0xLjBmKSk7CisgICAgZGV2aWNlQ29udGV4dC0+U2V0
VHJhbnNmb3JtKGN0bSAqIGZsaXAgKiB0cmFuc2xhdGUpOworCisgICAgZGV2aWNlQ29udGV4dC0+
RHJhd0ltYWdlKGNvbXBvc2l0b3IuZ2V0KCksIEQyRDFfSU5URVJQT0xBVElPTl9NT0RFX0xJTkVB
Uik7Cit9CisKK3ZvaWQgZHJhd1dpdGhTaGFkb3coUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBs
YXRmb3JtQ29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ1JlY3QsIGNvbnN0IFNoYWRv
d1N0YXRlJiBzaGFkb3dTdGF0ZSwgY29uc3QgV1RGOjpGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVy
VGFyZ2V0Kik+JiBkcmF3Q29tbWFuZHMpCit7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1D
b250ZXh0LnJlbmRlclRhcmdldCgpOworCisgICAgLy8gUmVuZGVyIHRoZSBjdXJyZW50IGdlb21l
dHJ5IHRvIGEgYml0bWFwIGNvbnRleHQKKyAgICBDT01QdHI8SUQyRDFCaXRtYXBSZW5kZXJUYXJn
ZXQ+IGJpdG1hcFRhcmdldDsKKyAgICBIUkVTVUxUIGhyID0gY29udGV4dC0+Q3JlYXRlQ29tcGF0
aWJsZVJlbmRlclRhcmdldCgmYml0bWFwVGFyZ2V0KTsKKyAgICBSRUxFQVNFX0FTU0VSVChTVUND
RUVERUQoaHIpKTsKKworICAgIGJpdG1hcFRhcmdldC0+QmVnaW5EcmF3KCk7CisgICAgZHJhd0Nv
bW1hbmRzKGJpdG1hcFRhcmdldC5nZXQoKSk7CisgICAgaHIgPSBiaXRtYXBUYXJnZXQtPkVuZERy
YXcoKTsKKyAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKworICAgIENPTVB0cjxJ
RDJEMUJpdG1hcD4gYml0bWFwOworICAgIGhyID0gYml0bWFwVGFyZ2V0LT5HZXRCaXRtYXAoJmJp
dG1hcCk7CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisKKyAgICBkcmF3V2l0
aFNoYWRvd0hlbHBlcihjb250ZXh0LCBiaXRtYXAuZ2V0KCksIHNoYWRvd1N0YXRlLmNvbG9yLCBz
aGFkb3dTdGF0ZS5vZmZzZXQsIHNoYWRvd1N0YXRlLmJsdXIpOworfQorCit2b2lkIGRyYXdXaXRo
b3V0U2hhZG93KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0
IEZsb2F0UmVjdCYgLypib3VuZGluZ1JlY3QqLywgY29uc3QgV1RGOjpGdW5jdGlvbjx2b2lkKElE
MkQxUmVuZGVyVGFyZ2V0Kik+JiBkcmF3Q29tbWFuZHMpCit7CisgICAgZHJhd0NvbW1hbmRzKHBs
YXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKSk7Cit9CisKK3ZvaWQgY2xlYXJSZWN0KFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgcmVj
dCkKK3sKKyAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIHJlY3QsIFsmcGxh
dGZvcm1Db250ZXh0LCByZWN0XShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Cisg
ICAgICAgIEZsb2F0UmVjdCByZW5kZXJUYXJnZXRSZWN0KEZsb2F0UG9pbnQoKSwgcmVuZGVyVGFy
Z2V0LT5HZXRTaXplKCkpOworICAgICAgICBGbG9hdFJlY3QgcmVjdFRvQ2xlYXIocmVjdCk7CisK
KyAgICAgICAgaWYgKHJlY3RUb0NsZWFyLmNvbnRhaW5zKHJlbmRlclRhcmdldFJlY3QpKSB7Cisg
ICAgICAgICAgICByZW5kZXJUYXJnZXQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworICAgICAgICAg
ICAgcmVuZGVyVGFyZ2V0LT5DbGVhcihEMkQxOjpDb2xvckYoMCwgMCwgMCwgMCkpOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFyZWN0VG9DbGVhci5pbnRl
cnNlY3RzKHJlbmRlclRhcmdldFJlY3QpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAg
IHJlbmRlclRhcmdldC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisgICAgICAgIHJlY3RUb0NsZWFy
LmludGVyc2VjdChyZW5kZXJUYXJnZXRSZWN0KTsKKyAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxs
UmVjdGFuZ2xlKHJlY3RUb0NsZWFyLCBwbGF0Zm9ybUNvbnRleHQuYnJ1c2hXaXRoQ29sb3IoQ29s
b3IoRDJEMTo6Q29sb3JGKDAsIDAsIDAsIDApKSkuZ2V0KCkpOworICAgIH0pOworfQorCisvKgor
dm9pZCBkcmF3R2x5cGhzKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQs
IGNvbnN0IEZpbGxTb3VyY2UmIGZpbGxTb3VyY2UsIGNvbnN0IFN0cm9rZVNvdXJjZSYgc3Ryb2tl
U291cmNlLCBjb25zdCBTaGFkb3dTdGF0ZSYgc2hhZG93U3RhdGUsIGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50LCBEaXJlY3RXcml0ZVNjYWxlZEZvbnQqIHNjYWxlZEZvbnQsIGRvdWJsZSBzeW50aGV0
aWNCb2xkT2Zmc2V0LCBjb25zdCBWZWN0b3I8RGlyZWN0V3JpdGVHbHlwaFR5cGU+JiBnbHlwaHMs
IGZsb2F0IHhPZmZzZXQsIFRleHREcmF3aW5nTW9kZUZsYWdzIHRleHREcmF3aW5nTW9kZSwgZmxv
YXQgc3Ryb2tlVGhpY2tuZXNzLCBjb25zdCBGbG9hdFNpemUmIHNoYWRvd09mZnNldCwgY29uc3Qg
Q29sb3ImIHNoYWRvd0NvbG9yKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisqLworCit2
b2lkIGRyYXdOYXRpdmVJbWFnZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250
ZXh0LCBJV0lDQml0bWFwKiBpbWFnZSwgY29uc3QgRmxvYXRTaXplJiBpbWFnZVNpemUsIGNvbnN0
IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRl
T3BlcmF0b3IgY29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSBibGVuZE1vZGUsIEltYWdlT3Jp
ZW50YXRpb24gb3JpZW50YXRpb24sIEludGVycG9sYXRpb25RdWFsaXR5IGltYWdlSW50ZXJwb2xh
dGlvblF1YWxpdHksIGZsb2F0IGdsb2JhbEFscGhhLCBjb25zdCBTaGFkb3dTdGF0ZSYgc2hhZG93
U3RhdGUpCit7CisgICAgQ09NUHRyPElEMkQxQml0bWFwPiBkZXZpY2VCaXRtYXA7CisgICAgSFJF
U1VMVCBociA9IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+Q3JlYXRlQml0bWFwRnJv
bVdpY0JpdG1hcChpbWFnZSwgJmRldmljZUJpdG1hcCk7CisgICAgaWYgKCFTVUNDRUVERUQoaHIp
KQorICAgICAgICByZXR1cm47CisKKyAgICBkcmF3TmF0aXZlSW1hZ2UocGxhdGZvcm1Db250ZXh0
LCBkZXZpY2VCaXRtYXAuZ2V0KCksIGltYWdlU2l6ZSwgZGVzdFJlY3QsIHNyY1JlY3QsIGNvbXBv
c2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUsIG9yaWVudGF0aW9uLCBpbWFnZUludGVycG9sYXRpb25R
dWFsaXR5LCBnbG9iYWxBbHBoYSwgc2hhZG93U3RhdGUpOworfQorCit2b2lkIGRyYXdOYXRpdmVJ
bWFnZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBJRDJEMUJpdG1h
cCogaW1hZ2UsIGNvbnN0IEZsb2F0U2l6ZSYgaW1hZ2VTaXplLCBjb25zdCBGbG9hdFJlY3QmIGRl
c3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBv
c2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUgYmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0aW9uIG9yaWVu
dGF0aW9uLCBJbnRlcnBvbGF0aW9uUXVhbGl0eSBpbWFnZUludGVycG9sYXRpb25RdWFsaXR5LCBm
bG9hdCBnbG9iYWxBbHBoYSwgY29uc3QgU2hhZG93U3RhdGUmIHNoYWRvd1N0YXRlKQoreworICAg
IGF1dG8gYml0bWFwU2l6ZSA9IGltYWdlLT5HZXRTaXplKCk7CisKKyAgICBmbG9hdCBjdXJySGVp
Z2h0ID0gb3JpZW50YXRpb24udXNlc1dpZHRoQXNIZWlnaHQoKSA/IGJpdG1hcFNpemUud2lkdGgg
OiBiaXRtYXBTaXplLmhlaWdodDsKKyAgICBpZiAoY3VyckhlaWdodCA8PSBzcmNSZWN0LnkoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0LnJl
bmRlclRhcmdldCgpOworCisgICAgRDJEMV9NQVRSSVhfM1gyX0YgY3RtOworICAgIGNvbnRleHQt
PkdldFRyYW5zZm9ybSgmY3RtKTsKKworICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0oY3Rt
KTsKKworICAgIFBsYXRmb3JtQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihwbGF0Zm9ybUNv
bnRleHQpOworCisgICAgYm9vbCBzaG91bGRVc2VTdWJpbWFnZSA9IGZhbHNlOworCisgICAgLy8g
SWYgdGhlIHNvdXJjZSByZWN0IGlzIGEgc3VicG9ydGlvbiBvZiB0aGUgaW1hZ2UsIHRoZW4gd2Ug
Y29tcHV0ZSBhbiBpbmZsYXRlZCBkZXN0aW5hdGlvbiByZWN0IHRoYXQgd2lsbCBob2xkIHRoZSBl
bnRpcmUgaW1hZ2UKKyAgICAvLyBhbmQgdGhlbiBzZXQgYSBjbGlwIHRvIHRoZSBwb3J0aW9uIHRo
YXQgd2Ugd2FudCB0byBkaXNwbGF5LgorICAgIEZsb2F0UmVjdCBhZGp1c3RlZERlc3RSZWN0ID0g
ZGVzdFJlY3Q7CisKKyAgICBpZiAoc3JjUmVjdC5zaXplKCkgIT0gaW1hZ2VTaXplKSB7CisgICAg
ICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgaW1hZ2Ugc2NhbGluZworICAgICAgICBub3RJbXBsZW1l
bnRlZCgpOworICAgIH0KKworICAgIC8vIElmIHRoZSBpbWFnZSBpcyBvbmx5IHBhcnRpYWxseSBs
b2FkZWQsIHRoZW4gc2hyaW5rIHRoZSBkZXN0aW5hdGlvbiByZWN0IHRoYXQgd2UncmUgZHJhd2lu
ZyBpbnRvIGFjY29yZGluZ2x5LgorICAgIGlmICghc2hvdWxkVXNlU3ViaW1hZ2UgJiYgY3Vyckhl
aWdodCA8IGltYWdlU2l6ZS5oZWlnaHQoKSkKKyAgICAgICAgYWRqdXN0ZWREZXN0UmVjdC5zZXRI
ZWlnaHQoYWRqdXN0ZWREZXN0UmVjdC5oZWlnaHQoKSAqIGN1cnJIZWlnaHQgLyBpbWFnZVNpemUu
aGVpZ2h0KCkpOworCisgICAgU3RhdGU6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihwbGF0Zm9ybUNv
bnRleHQsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUpOworCisgICAgLy8gSW1hZ2VPcmll
bnRhdGlvbiBleHBlY3RzIHRoZSBvcmlnaW4gdG8gYmUgYXQgKDAsIDApLgorICAgIHRyYW5zZm9y
bS50cmFuc2xhdGUoYWRqdXN0ZWREZXN0UmVjdC54KCksIGFkanVzdGVkRGVzdFJlY3QueSgpKTsK
KyAgICBjb250ZXh0LT5TZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKKyAgICBhZGp1c3RlZERlc3RS
ZWN0LnNldExvY2F0aW9uKEZsb2F0UG9pbnQoKSk7CisKKyAgICBpZiAob3JpZW50YXRpb24gIT0g
RGVmYXVsdEltYWdlT3JpZW50YXRpb24pIHsKKyAgICAgICAgY29uY2F0Q1RNKHBsYXRmb3JtQ29u
dGV4dCwgb3JpZW50YXRpb24udHJhbnNmb3JtRnJvbURlZmF1bHQoYWRqdXN0ZWREZXN0UmVjdC5z
aXplKCkpKTsKKyAgICAgICAgaWYgKG9yaWVudGF0aW9uLnVzZXNXaWR0aEFzSGVpZ2h0KCkpIHsK
KyAgICAgICAgICAgIC8vIFRoZSBkZXN0aW5hdGlvbiByZWN0IHdpbGwgaGF2ZSBpdCdzIHdpZHRo
IGFuZCBoZWlnaHQgYWxyZWFkeSByZXZlcnNlZCBmb3IgdGhlIG9yaWVudGF0aW9uIG9mCisgICAg
ICAgICAgICAvLyB0aGUgaW1hZ2UsIGFzIGl0IHdhcyBuZWVkZWQgZm9yIHBhZ2UgbGF5b3V0LCBz
byB3ZSBuZWVkIHRvIHJldmVyc2UgaXQgYmFjayBoZXJlLgorICAgICAgICAgICAgYWRqdXN0ZWRE
ZXN0UmVjdCA9IEZsb2F0UmVjdChhZGp1c3RlZERlc3RSZWN0LngoKSwgYWRqdXN0ZWREZXN0UmVj
dC55KCksIGFkanVzdGVkRGVzdFJlY3QuaGVpZ2h0KCksIGFkanVzdGVkRGVzdFJlY3Qud2lkdGgo
KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9f
KTsKKworICAgIEZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1bmN0aW9u
ID0gW2ltYWdlLCBhZGp1c3RlZERlc3RSZWN0LCBzcmNSZWN0XShJRDJEMVJlbmRlclRhcmdldCog
cmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0JpdG1hcChpbWFnZSwg
YWRqdXN0ZWREZXN0UmVjdCwgMS4wZiwgRDJEMV9CSVRNQVBfSU5URVJQT0xBVElPTl9NT0RFX0xJ
TkVBUiwgc3RhdGljX2Nhc3Q8RDJEMV9SRUNUX0Y+KHNyY1JlY3QpKTsKKyAgICB9OworCisgICAg
aWYgKHNoYWRvd1N0YXRlLmlzVmlzaWJsZSgpKQorICAgICAgICBkcmF3V2l0aFNoYWRvdyhwbGF0
Zm9ybUNvbnRleHQsIGFkanVzdGVkRGVzdFJlY3QsIHNoYWRvd1N0YXRlLCBkcmF3RnVuY3Rpb24p
OworICAgIGVsc2UKKyAgICAgICAgZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCBh
ZGp1c3RlZERlc3RSZWN0LCBkcmF3RnVuY3Rpb24pOworCisgICAgZmx1c2gocGxhdGZvcm1Db250
ZXh0KTsKKworICAgIGlmICghc3RhdGVTYXZlci5kaWRTYXZlKCkpCisgICAgICAgIGNvbnRleHQt
PlNldFRyYW5zZm9ybShjdG0pOworfQorCit2b2lkIGRyYXdQYXR0ZXJuKFBsYXRmb3JtQ29udGV4
dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIElXSUNCaXRtYXAqIHRpbGVJbWFnZSwgY29uc3Qg
SW50U2l6ZSYgc2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0
JiB0aWxlUmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3JtLCBjb25z
dCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3BlcmF0b3Is
IEJsZW5kTW9kZSBibGVuZE1vZGUpCit7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250
ZXh0LnJlbmRlclRhcmdldCgpOworICAgIFBsYXRmb3JtQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVT
YXZlcihwbGF0Zm9ybUNvbnRleHQpOworCisgICAgY2xpcChwbGF0Zm9ybUNvbnRleHQsIGRlc3RS
ZWN0KTsKKworICAgIFN0YXRlOjpzZXRDb21wb3NpdGVPcGVyYXRpb24ocGxhdGZvcm1Db250ZXh0
LCBjb21wb3NpdGVPcGVyYXRvciwgYmxlbmRNb2RlKTsKKworICAgIGF1dG8gYml0bWFwQnJ1c2hQ
cm9wZXJ0aWVzID0gRDJEMTo6Qml0bWFwQnJ1c2hQcm9wZXJ0aWVzKCk7CisgICAgYml0bWFwQnJ1
c2hQcm9wZXJ0aWVzLmV4dGVuZE1vZGVYID0gRDJEMV9FWFRFTkRfTU9ERV9XUkFQOworICAgIGJp
dG1hcEJydXNoUHJvcGVydGllcy5leHRlbmRNb2RlWSA9IEQyRDFfRVhURU5EX01PREVfV1JBUDsK
KworICAgIC8vIENyZWF0ZSBhIGJydXNoIHRyYW5zZm9ybWF0aW9uIHNvIHdlIHBhaW50IHVzaW5n
IHRoZSBzZWN0aW9uIG9mIHRoZSBpbWFnZSB3ZSBjYXJlIGFib3V0LgorICAgIEFmZmluZVRyYW5z
Zm9ybSB0cmFuc2Zvcm1hdGlvbiA9IHBhdHRlcm5UcmFuc2Zvcm07CisgICAgdHJhbnNmb3JtYXRp
b24udHJhbnNsYXRlKGRlc3RSZWN0LmxvY2F0aW9uKCkpOworCisgICAgYXV0byBicnVzaFByb3Bl
cnRpZXMgPSBEMkQxOjpCcnVzaFByb3BlcnRpZXMoKTsKKyAgICBicnVzaFByb3BlcnRpZXMudHJh
bnNmb3JtID0gdHJhbnNmb3JtYXRpb247CisgICAgYnJ1c2hQcm9wZXJ0aWVzLm9wYWNpdHkgPSAx
LjBmOworCisgICAgLy8gSWYgd2Ugb25seSB3YW50IGEgc3Vic2V0IG9mIHRoZSBiaXRtYXAsIHdl
IG5lZWQgdG8gY3JlYXRlIGEgY3JvcHBlZCBiaXRtYXAgaW1hZ2UuIEFjY29yZGluZyB0byB0aGUg
ZG9jdW1lbnRhdGlvbiwKKyAgICAvLyB0aGlzIGRvZXMgbm90IGFsbG9jYXRlIG5ldyBiaXRtYXAg
bWVtb3J5LgorICAgIGlmIChzaXplLndpZHRoKCkgPiBkZXN0UmVjdC53aWR0aCgpIHx8IHNpemUu
aGVpZ2h0KCkgPiBkZXN0UmVjdC5oZWlnaHQoKSkgeworICAgICAgICBBU1NFUlQoMCk7CisgICAg
ICAgIC8qCisgICAgICAgIGZsb2F0IGRwaVggPSAwOworICAgICAgICBmbG9hdCBkcGlZID0gMDsK
KyAgICAgICAgdGlsZUltYWdlLT5HZXREcGkoJmRwaVgsICZkcGlZKTsKKyAgICAgICAgYXV0byBi
aXRtYXBQcm9wZXJ0aWVzID0gRDJEMTo6Qml0bWFwUHJvcGVydGllcyh0aWxlSW1hZ2UtPkdldFBp
eGVsRm9ybWF0KCksIGRwaVgsIGRwaVkpOworICAgICAgICBDT01QdHI8SUQyRDFCaXRtYXA+IHN1
YkltYWdlOworICAgICAgICBIUkVTVUxUIGhyID0gY29udGV4dC0+Q3JlYXRlQml0bWFwKEludFNp
emUodGlsZVJlY3Quc2l6ZSgpKSwgYml0bWFwUHJvcGVydGllcywgJnN1YkltYWdlKTsKKyAgICAg
ICAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICAgICAgICAgIEQyRDFfUkVDVF9VIGZpbmlzaFJl
Y3QgPSBJbnRSZWN0KHRpbGVSZWN0KTsKKyAgICAgICAgICAgIGhyID0gc3ViSW1hZ2UtPkNvcHlG
cm9tQml0bWFwKG51bGxwdHIsIHRpbGVJbWFnZS5nZXQoKSwgJmZpbmlzaFJlY3QpOworICAgICAg
ICAgICAgaWYgKFNVQ0NFRURFRChocikpCisgICAgICAgICAgICAgICAgdGlsZUltYWdlID0gc3Vi
SW1hZ2U7CisgICAgICAgIH0KKyAgICAgICAgKi8KKyAgICB9CisKKyAgICBDT01QdHI8SUQyRDFC
aXRtYXA+IGJpdG1hcDsKKyAgICBIUkVTVUxUIGhyID0gY29udGV4dC0+Q3JlYXRlQml0bWFwRnJv
bVdpY0JpdG1hcCh0aWxlSW1hZ2UsIG51bGxwdHIsICZiaXRtYXApOworICAgIGlmICghU1VDQ0VF
REVEKGhyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQ09NUHRyPElEMkQxQml0bWFwQnJ1c2g+
IHBhdHRlcm5CcnVzaDsKKyAgICBociA9IGNvbnRleHQtPkNyZWF0ZUJpdG1hcEJydXNoKGJpdG1h
cC5nZXQoKSwgJmJpdG1hcEJydXNoUHJvcGVydGllcywgJmJydXNoUHJvcGVydGllcywgJnBhdHRl
cm5CcnVzaCk7CisgICAgQVNTRVJUKFNVQ0NFRURFRChocikpOworICAgIGlmICghU1VDQ0VFREVE
KGhyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1D
b250ZXh0LCBkZXN0UmVjdCwgW2Rlc3RSZWN0LCBwYXR0ZXJuQnJ1c2hdKElEMkQxUmVuZGVyVGFy
Z2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9
IGRlc3RSZWN0OworICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUoJmQyZFJlY3Qs
IHBhdHRlcm5CcnVzaC5nZXQoKSk7CisgICAgfSk7Cit9CisKK3ZvaWQgZHJhd1JlY3QoUGxhdGZv
cm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiByZWN0
LCBmbG9hdCBib3JkZXJUaGlja25lc3MsIGNvbnN0IENvbG9yJiBmaWxsQ29sb3IsIFN0cm9rZVN0
eWxlIHN0cm9rZVN0eWxlLCBjb25zdCBDb2xvciYgc3Ryb2tlQ29sb3IpCit7CisgICAgLy8gRklY
TUU6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIHBhdHRlcm5zIGFuZCBncmFkaWVudHMg
bGlrZSBkcmF3UGF0aCBkb2VzLCBpdCBwcm9iYWJseSBzaG91bGQuCisgICAgQVNTRVJUKCFyZWN0
LmlzRW1wdHkoKSk7CisKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVy
VGFyZ2V0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIGRy
YXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwgWyZwbGF0Zm9ybUNvbnRleHQs
IHJlY3QsIGZpbGxDb2xvciwgc3Ryb2tlQ29sb3IsIHN0cm9rZVN0eWxlXShJRDJEMVJlbmRlclRh
cmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3Qg
PSByZWN0OworICAgICAgICBhdXRvIGZpbGxCcnVzaCA9IHBsYXRmb3JtQ29udGV4dC5icnVzaFdp
dGhDb2xvcihmaWxsQ29sb3IpOworICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUo
JmQyZFJlY3QsIGZpbGxCcnVzaC5nZXQoKSk7CisgICAgICAgIGlmIChzdHJva2VTdHlsZSAhPSBO
b1N0cm9rZSkgeworICAgICAgICAgICAgYXV0byBzdHJva2VCcnVzaCA9IHBsYXRmb3JtQ29udGV4
dC5icnVzaFdpdGhDb2xvcihzdHJva2VDb2xvcik7CisgICAgICAgICAgICByZW5kZXJUYXJnZXQt
PkRyYXdSZWN0YW5nbGUoJmQyZFJlY3QsIHN0cm9rZUJydXNoLmdldCgpLCBwbGF0Zm9ybUNvbnRl
eHQuc3Ryb2tlVGhpY2tuZXNzKCksIHBsYXRmb3JtQ29udGV4dC5zdHJva2VTdHlsZSgpKTsKKyAg
ICAgICAgfQorICAgIH0pOworfQorCit2b2lkIGRyYXdMaW5lKFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50MSwgY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQyLCBTdHJva2VTdHlsZSBzdHJva2VTdHlsZSwgY29uc3QgQ29sb3ImIHN0
cm9rZUNvbG9yLCBmbG9hdCBzdHJva2VUaGlja25lc3MsIGJvb2wgc2hvdWxkQW50aWFsaWFzKQor
eworICAgIGJvb2wgaXNWZXJ0aWNhbExpbmUgPSAocG9pbnQxLngoKSArIHN0cm9rZVRoaWNrbmVz
cyA9PSBwb2ludDIueCgpKTsKKyAgICBmbG9hdCBzdHJva2VXaWR0aCA9IGlzVmVydGljYWxMaW5l
ID8gcG9pbnQyLnkoKSAtIHBvaW50MS55KCkgOiBwb2ludDIueCgpIC0gcG9pbnQxLngoKTsKKyAg
ICBpZiAoIXN0cm9rZVRoaWNrbmVzcyB8fCAhc3Ryb2tlV2lkdGgpCisgICAgICAgIHJldHVybjsK
KworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKTsKKwor
ICAgIGZsb2F0IGNvcm5lcldpZHRoID0gMDsKKyAgICBib29sIGRyYXdzRGFzaGVkTGluZSA9IHN0
cm9rZVN0eWxlID09IERvdHRlZFN0cm9rZSB8fCBzdHJva2VTdHlsZSA9PSBEYXNoZWRTdHJva2U7
CisKKyAgICBDT01QdHI8SUQyRDFTdHJva2VTdHlsZT4gZDJkU3Ryb2tlU3R5bGU7CisgICAgUGxh
dGZvcm1Db250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKHBsYXRmb3JtQ29udGV4dCwgZHJhd3NE
YXNoZWRMaW5lKTsKKyAgICBpZiAoZHJhd3NEYXNoZWRMaW5lKSB7CisgICAgICAgIC8vIEZpZ3Vy
ZSBvdXQgZW5kIHBvaW50cyB0byBlbnN1cmUgd2UgYWx3YXlzIHBhaW50IGNvcm5lcnMuCisgICAg
ICAgIGNvcm5lcldpZHRoID0gZGFzaGVkTGluZUNvcm5lcldpZHRoRm9yU3Ryb2tlV2lkdGgoc3Ry
b2tlV2lkdGgsIHN0cm9rZVN0eWxlLCBzdHJva2VUaGlja25lc3MpOworICAgICAgICBzdHJva2VX
aWR0aCAtPSAyICogY29ybmVyV2lkdGg7CisgICAgICAgIGZsb2F0IHBhdHRlcm5XaWR0aCA9IGRh
c2hlZExpbmVQYXR0ZXJuV2lkdGhGb3JTdHJva2VXaWR0aChzdHJva2VXaWR0aCwgc3Ryb2tlU3R5
bGUsIHN0cm9rZVRoaWNrbmVzcyk7CisgICAgICAgIC8vIENoZWNrIGlmIGNvcm5lciBkcmF3aW5n
IHN1ZmZpY2llbnRseSBjb3ZlcnMgdGhlIGxpbmUuCisgICAgICAgIGlmIChzdHJva2VXaWR0aCA8
PSBwYXR0ZXJuV2lkdGggKyAxKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZsb2F0
IHBhdHRlcm5PZmZzZXQgPSBkYXNoZWRMaW5lUGF0dGVybk9mZnNldEZvclBhdHRlcm5BbmRTdHJv
a2VXaWR0aChwYXR0ZXJuV2lkdGgsIHN0cm9rZVdpZHRoKTsKKyAgICAgICAgY29uc3QgZmxvYXQg
ZGFzaGVzWzJdID0geyBwYXR0ZXJuV2lkdGgsIHBhdHRlcm5XaWR0aCB9OworICAgICAgICBhdXRv
IHN0cm9rZVN0eWxlUHJvcGVydGllcyA9IHBsYXRmb3JtQ29udGV4dC5zdHJva2VTdHlsZVByb3Bl
cnRpZXMoKTsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0
ZVN0cm9rZVN0eWxlKCZzdHJva2VTdHlsZVByb3BlcnRpZXMsIGRhc2hlcywgQVJSQVlTSVpFKGRh
c2hlcyksICZkMmRTdHJva2VTdHlsZSk7CisKKyAgICAgICAgcGxhdGZvcm1Db250ZXh0LnNldFBh
dHRlcm5XaWR0aChwYXR0ZXJuV2lkdGgpOworICAgICAgICBwbGF0Zm9ybUNvbnRleHQuc2V0UGF0
dGVybk9mZnNldChwYXR0ZXJuT2Zmc2V0KTsKKyAgICAgICAgcGxhdGZvcm1Db250ZXh0LnNldERh
c2hlcyhEYXNoQXJyYXkoMiwgcGF0dGVybldpZHRoKSk7CisKKyAgICAgICAgZDJkU3Ryb2tlU3R5
bGUgPSBwbGF0Zm9ybUNvbnRleHQuc3Ryb2tlU3R5bGUoKTsKKyAgICB9CisKKyAgICBhdXRvIGNl
bnRlcmVkUG9pbnRzID0gY2VudGVyTGluZUFuZEN1dE9mZkNvcm5lcnMoaXNWZXJ0aWNhbExpbmUs
IGNvcm5lcldpZHRoLCBwb2ludDEsIHBvaW50Mik7CisgICAgYXV0byBwMSA9IGNlbnRlcmVkUG9p
bnRzWzBdOworICAgIGF1dG8gcDIgPSBjZW50ZXJlZFBvaW50c1sxXTsKKworICAgIGNvbnRleHQt
PlNldFRhZ3MoMSwgX19MSU5FX18pOworCisgICAgRmxvYXRSZWN0IGJvdW5kaW5nUmVjdChwMSwg
cDIpOworCisgICAgZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCBib3VuZGluZ1Jl
Y3QsIFsmcGxhdGZvcm1Db250ZXh0LCBwMSwgcDIsIGQyZFN0cm9rZVN0eWxlLCBzdHJva2VDb2xv
ciwgc3Ryb2tlVGhpY2tuZXNzXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Cisg
ICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0xpbmUocDEsIHAyLCBwbGF0Zm9ybUNvbnRleHQuYnJ1
c2hXaXRoQ29sb3Ioc3Ryb2tlQ29sb3IpLmdldCgpLCBzdHJva2VUaGlja25lc3MsIGQyZFN0cm9r
ZVN0eWxlLmdldCgpKTsKKyAgICB9KTsKK30KKwordm9pZCBkcmF3TGluZXNGb3JUZXh0KFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRQb2ludCYsIGZsb2F0LCBjb25zdCBEYXNo
QXJyYXkmLCBib29sLCBib29sLCBjb25zdCBDb2xvciYpCit7CisgICAgbm90SW1wbGVtZW50ZWQo
KTsKK30KKwordm9pZCBkcmF3RG90c0ZvckRvY3VtZW50TWFya2VyKFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0JiwgRG9jdW1lbnRNYXJrZXJMaW5lU3R5bGUpCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBmaWxsRWxsaXBzZShQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0
IENvbG9yJiBmaWxsQ29sb3IsIFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlLCBjb25zdCBDb2xvciYg
c3Ryb2tlQ29sb3IsIGZsb2F0IHN0cm9rZVRoaWNrbmVzcykKK3sKKyAgICBhdXRvIGVsbGlwc2Ug
PSBEMkQxOjpFbGxpcHNlKHJlY3QuY2VudGVyKCksIDAuNSAqIHJlY3Qud2lkdGgoKSwgMC41ICog
cmVjdC5oZWlnaHQoKSk7CisKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQucmVu
ZGVyVGFyZ2V0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAg
IGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwgWyZwbGF0Zm9ybUNvbnRl
eHQsIGVsbGlwc2UsIGZpbGxDb2xvciwgc3Ryb2tlU3R5bGUsIHN0cm9rZUNvbG9yLCBzdHJva2VU
aGlja25lc3NdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgYXV0
byBmaWxsQnJ1c2ggPSBwbGF0Zm9ybUNvbnRleHQuYnJ1c2hXaXRoQ29sb3IoZmlsbENvbG9yKTsK
KyAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsRWxsaXBzZSgmZWxsaXBzZSwgZmlsbEJydXNoLmdl
dCgpKTsKKyAgICAgICAgaWYgKHN0cm9rZVN0eWxlICE9IFN0cm9rZVN0eWxlOjpOb1N0cm9rZSkg
eworICAgICAgICAgICAgYXV0byBzdHJva2VCcnVzaCA9IHBsYXRmb3JtQ29udGV4dC5icnVzaFdp
dGhDb2xvcihzdHJva2VDb2xvcik7CisgICAgICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdFbGxp
cHNlKCZlbGxpcHNlLCBzdHJva2VCcnVzaC5nZXQoKSwgc3Ryb2tlVGhpY2tuZXNzLCBwbGF0Zm9y
bUNvbnRleHQuc3Ryb2tlU3R5bGUoKSk7CisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBk
cmF3RWxsaXBzZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25z
dCBGbG9hdFJlY3QmIHJlY3QsIFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlLCBjb25zdCBDb2xvciYg
c3Ryb2tlQ29sb3IsIGZsb2F0IHN0cm9rZVRoaWNrbmVzcykKK3sKKyAgICBpZiAoc3Ryb2tlU3R5
bGUgPT0gU3Ryb2tlU3R5bGU6Ok5vU3Ryb2tlKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRv
IGVsbGlwc2UgPSBEMkQxOjpFbGxpcHNlKHJlY3QuY2VudGVyKCksIDAuNSAqIHJlY3Qud2lkdGgo
KSwgMC41ICogcmVjdC5oZWlnaHQoKSk7CisKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNv
bnRleHQucmVuZGVyVGFyZ2V0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9f
KTsKKworICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwgWyZwbGF0
Zm9ybUNvbnRleHQsIGVsbGlwc2UsIHN0cm9rZUNvbG9yLCBzdHJva2VUaGlja25lc3NdKElEMkQx
UmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgYXV0byBzdHJva2VCcnVzaCA9
IHBsYXRmb3JtQ29udGV4dC5icnVzaFdpdGhDb2xvcihzdHJva2VDb2xvcik7CisgICAgICAgIHJl
bmRlclRhcmdldC0+RHJhd0VsbGlwc2UoJmVsbGlwc2UsIHN0cm9rZUJydXNoLmdldCgpLCBzdHJv
a2VUaGlja25lc3MsIHBsYXRmb3JtQ29udGV4dC5zdHJva2VTdHlsZSgpKTsKKyAgICB9KTsKK30K
Kwordm9pZCBkcmF3Rm9jdXNSaW5nKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgUGF0
aCYsIGZsb2F0LCBjb25zdCBDb2xvciYpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwor
dm9pZCBkcmF3Rm9jdXNSaW5nKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgVmVjdG9y
PEZsb2F0UmVjdD4mLCBmbG9hdCwgY29uc3QgQ29sb3ImKQoreworICAgIG5vdEltcGxlbWVudGVk
KCk7Cit9CisKK3ZvaWQgZmx1c2goUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29u
dGV4dCkKK3sKKyAgICBBU1NFUlQocGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpKTsKKyAg
ICBEMkQxX1RBRyBmaXJzdCwgc2Vjb25kOworICAgIEhSRVNVTFQgaHIgPSBwbGF0Zm9ybUNvbnRl
eHQucmVuZGVyVGFyZ2V0KCktPkZsdXNoKCZmaXJzdCwgJnNlY29uZCk7CisKKyAgICBSRUxFQVNF
X0FTU0VSVChTVUNDRUVERUQoaHIpKTsKK30KKwordm9pZCBzYXZlKFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQpCit7CisgICAgcGxhdGZvcm1Db250ZXh0LnNhdmUoKTsK
KworICAgIGlmIChhdXRvKiBncmFwaGljc0NvbnRleHRQcml2YXRlID0gcGxhdGZvcm1Db250ZXh0
LmdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0UHJpdmF0
ZS0+c2F2ZSgpOworfQorCit2b2lkIHJlc3RvcmUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBs
YXRmb3JtQ29udGV4dCkKK3sKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVzdG9yZSgpOworCisgICAg
aWYgKGF1dG8qIGdyYXBoaWNzQ29udGV4dFByaXZhdGUgPSBwbGF0Zm9ybUNvbnRleHQuZ3JhcGhp
Y3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICAgICBncmFwaGljc0NvbnRleHRQcml2YXRlLT5yZXN0
b3JlKCk7Cit9CisKK3ZvaWQgdHJhbnNsYXRlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0
Zm9ybUNvbnRleHQsIGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgQVNTRVJUKHBsYXRmb3JtQ29u
dGV4dC5yZW5kZXJUYXJnZXQoKSk7CisKKyAgICBEMkQxX01BVFJJWF8zWDJfRiBjdXJyZW50VHJh
bnNmb3JtOworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+R2V0VHJhbnNmb3Jt
KCZjdXJyZW50VHJhbnNmb3JtKTsKKworICAgIGF1dG8gdHJhbnNsYXRpb24gPSBEMkQxOjpNYXRy
aXgzeDJGOjpUcmFuc2xhdGlvbih4LCB5KTsKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFy
Z2V0KCktPlNldFRyYW5zZm9ybSh0cmFuc2xhdGlvbiAqIGN1cnJlbnRUcmFuc2Zvcm0pOworCisg
ICAgaWYgKGF1dG8qIGdyYXBoaWNzQ29udGV4dFByaXZhdGUgPSBwbGF0Zm9ybUNvbnRleHQuZ3Jh
cGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICAgICBncmFwaGljc0NvbnRleHRQcml2YXRlLT50
cmFuc2xhdGUoeCwgeSk7Cit9CisKK3ZvaWQgcm90YXRlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
JiBwbGF0Zm9ybUNvbnRleHQsIGZsb2F0IGFuZ2xlSW5SYWRpYW5zKQoreworICAgIEFTU0VSVChw
bGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpOworCisgICAgRDJEMV9NQVRSSVhfM1gyX0Yg
Y3VycmVudFRyYW5zZm9ybTsKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkdl
dFRyYW5zZm9ybSgmY3VycmVudFRyYW5zZm9ybSk7CisKKyAgICBhdXRvIHJvdGF0aW9uID0gRDJE
MTo6TWF0cml4M3gyRjo6Um90YXRpb24ocmFkMmRlZyhhbmdsZUluUmFkaWFucykpOworICAgIHBs
YXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+U2V0VHJhbnNmb3JtKHJvdGF0aW9uICogY3Vy
cmVudFRyYW5zZm9ybSk7CisKKyAgICBpZiAoYXV0byogZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSA9
IHBsYXRmb3JtQ29udGV4dC5ncmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisgICAgICAgIGdyYXBo
aWNzQ29udGV4dFByaXZhdGUtPnJvdGF0ZShhbmdsZUluUmFkaWFucyk7Cit9CisKK3ZvaWQgc2Nh
bGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgRmxvYXRT
aXplJiBzaXplKQoreworICAgIEFTU0VSVChwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkp
OworCisgICAgRDJEMV9NQVRSSVhfM1gyX0YgY3VycmVudFRyYW5zZm9ybTsKKyAgICBwbGF0Zm9y
bUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkdldFRyYW5zZm9ybSgmY3VycmVudFRyYW5zZm9ybSk7
CisKKyAgICBhdXRvIHNjYWxlID0gRDJEMTo6TWF0cml4M3gyRjo6U2NhbGUoc2l6ZSk7CisgICAg
cGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5TZXRUcmFuc2Zvcm0oc2NhbGUgKiBjdXJy
ZW50VHJhbnNmb3JtKTsKKworICAgIGlmIChhdXRvKiBncmFwaGljc0NvbnRleHRQcml2YXRlID0g
cGxhdGZvcm1Db250ZXh0LmdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAgICAgZ3JhcGhp
Y3NDb250ZXh0UHJpdmF0ZS0+c2NhbGUoc2l6ZSk7Cit9CisKK3ZvaWQgY29uY2F0Q1RNKFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEFmZmluZVRyYW5zZm9y
bSYgYWZmaW5lVHJhbnNmb3JtKQoreworICAgIEFTU0VSVChwbGF0Zm9ybUNvbnRleHQucmVuZGVy
VGFyZ2V0KCkpOworCisgICAgRDJEMV9NQVRSSVhfM1gyX0YgY3VycmVudFRyYW5zZm9ybTsKKyAg
ICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkdldFRyYW5zZm9ybSgmY3VycmVudFRy
YW5zZm9ybSk7CisKKyAgICBEMkQxX01BVFJJWF8zWDJfRiB0cmFuc2Zvcm1Ub0NvbmNhdCA9IGFm
ZmluZVRyYW5zZm9ybTsKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPlNldFRy
YW5zZm9ybSh0cmFuc2Zvcm1Ub0NvbmNhdCAqIGN1cnJlbnRUcmFuc2Zvcm0pOworCisgICAgaWYg
KGF1dG8qIGdyYXBoaWNzQ29udGV4dFByaXZhdGUgPSBwbGF0Zm9ybUNvbnRleHQuZ3JhcGhpY3ND
b250ZXh0UHJpdmF0ZSgpKQorICAgICAgICBncmFwaGljc0NvbnRleHRQcml2YXRlLT5jb25jYXRD
VE0oYWZmaW5lVHJhbnNmb3JtKTsKK30KKwordm9pZCBiZWdpblRyYW5zcGFyZW5jeUxheWVyKFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGZsb2F0IG9wYWNpdHkpCit7
CisgICAgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OlRyYW5zcGFyZW5jeUxheWVyU3RhdGUgdHJh
bnNwYXJlbmN5TGF5ZXI7CisgICAgdHJhbnNwYXJlbmN5TGF5ZXIub3BhY2l0eSA9IG9wYWNpdHk7
CisKKyAgICBIUkVTVUxUIGhyID0gcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5DcmVh
dGVDb21wYXRpYmxlUmVuZGVyVGFyZ2V0KCZ0cmFuc3BhcmVuY3lMYXllci5yZW5kZXJUYXJnZXQp
OworICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOworICAgIHBsYXRmb3JtQ29udGV4
dC5tX3RyYW5zcGFyZW5jeUxheWVyU3RhY2suYXBwZW5kKFdURk1vdmUodHJhbnNwYXJlbmN5TGF5
ZXIpKTsKKworICAgIHBsYXRmb3JtQ29udGV4dC5tX3RyYW5zcGFyZW5jeUxheWVyU3RhY2subGFz
dCgpLnJlbmRlclRhcmdldC0+QmVnaW5EcmF3KCk7CisgICAgcGxhdGZvcm1Db250ZXh0Lm1fdHJh
bnNwYXJlbmN5TGF5ZXJTdGFjay5sYXN0KCkucmVuZGVyVGFyZ2V0LT5DbGVhcihEMkQxOjpDb2xv
ckYoMCwgMCwgMCwgMCkpOworfQorCit2b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVyKFBsYXRmb3Jt
Q29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQpCit7CisgICAgYXV0byBjdXJyZW50TGF5
ZXIgPSBwbGF0Zm9ybUNvbnRleHQubV90cmFuc3BhcmVuY3lMYXllclN0YWNrLnRha2VMYXN0KCk7
CisgICAgYXV0byByZW5kZXJUYXJnZXQgPSBjdXJyZW50TGF5ZXIucmVuZGVyVGFyZ2V0OworICAg
IGlmICghcmVuZGVyVGFyZ2V0KQorICAgICAgICByZXR1cm47CisKKyAgICBIUkVTVUxUIGhyID0g
cmVuZGVyVGFyZ2V0LT5FbmREcmF3KCk7CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhy
KSk7CisKKyAgICBDT01QdHI8SUQyRDFCaXRtYXA+IGJpdG1hcDsKKyAgICBociA9IHJlbmRlclRh
cmdldC0+R2V0Qml0bWFwKCZiaXRtYXApOworICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRCho
cikpOworCisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgp
OworCisgICAgaWYgKGN1cnJlbnRMYXllci5oYXNTaGFkb3cpCisgICAgICAgIGRyYXdXaXRoU2hh
ZG93SGVscGVyKGNvbnRleHQsIGJpdG1hcC5nZXQoKSwgY3VycmVudExheWVyLnNoYWRvd0NvbG9y
LCBjdXJyZW50TGF5ZXIuc2hhZG93T2Zmc2V0LCBjdXJyZW50TGF5ZXIuc2hhZG93Qmx1cik7Cisg
ICAgZWxzZSB7CisgICAgICAgIENPTVB0cjxJRDJEMUJpdG1hcEJydXNoPiBiaXRtYXBCcnVzaDsK
KyAgICAgICAgYXV0byBiaXRtYXBCcnVzaFByb3BlcnRpZXMgPSBEMkQxOjpCaXRtYXBCcnVzaFBy
b3BlcnRpZXMoKTsKKyAgICAgICAgYXV0byBicnVzaFByb3BlcnRpZXMgPSBEMkQxOjpCcnVzaFBy
b3BlcnRpZXMoKTsKKyAgICAgICAgSFJFU1VMVCBociA9IGNvbnRleHQtPkNyZWF0ZUJpdG1hcEJy
dXNoKGJpdG1hcC5nZXQoKSwgYml0bWFwQnJ1c2hQcm9wZXJ0aWVzLCBicnVzaFByb3BlcnRpZXMs
ICZiaXRtYXBCcnVzaCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOwor
CisgICAgICAgIGF1dG8gc2l6ZSA9IGJpdG1hcC0+R2V0U2l6ZSgpOworICAgICAgICBhdXRvIHJl
Y3RJbkRJUCA9IEQyRDE6OlJlY3RGKDAsIDAsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTsKKyAg
ICAgICAgY29udGV4dC0+RmlsbFJlY3RhbmdsZShyZWN0SW5ESVAsIGJpdG1hcEJydXNoLmdldCgp
KTsKKyAgICB9Cit9CisKK3ZvaWQgY2xpcChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZv
cm1Db250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBsYXRmb3JtQ29u
dGV4dC5tX3JlbmRlclN0YXRlcy5pc0VtcHR5KCkpCisgICAgICAgIHNhdmUocGxhdGZvcm1Db250
ZXh0KTsKKworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+UHVzaEF4aXNBbGln
bmVkQ2xpcChyZWN0LCBEMkQxX0FOVElBTElBU19NT0RFX1BFUl9QUklNSVRJVkUpOworICAgIHBs
YXRmb3JtQ29udGV4dC5tX3JlbmRlclN0YXRlcy5sYXN0KCkubV9jbGlwcy5hcHBlbmQoUGxhdGZv
cm1Db250ZXh0RGlyZWN0MkQ6OkF4aXNBbGlnbmVkQ2xpcCk7CisKKyAgICBpZiAoYXV0byogZ3Jh
cGhpY3NDb250ZXh0UHJpdmF0ZSA9IHBsYXRmb3JtQ29udGV4dC5ncmFwaGljc0NvbnRleHRQcml2
YXRlKCkpCisgICAgICAgIGdyYXBoaWNzQ29udGV4dFByaXZhdGUtPmNsaXAocmVjdCk7Cit9CisK
K3ZvaWQgY2xpcE91dChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBj
b25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgUGF0aCBwYXRoOworICAgIHBhdGguYWRkUmVj
dChyZWN0KTsKKworICAgIGNsaXBPdXQocGxhdGZvcm1Db250ZXh0LCBwYXRoKTsKK30KKwordm9p
ZCBjbGlwT3V0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0
IFBhdGgmIHBhdGgpCit7CisgICAgLy8gVG8gY2xpcCBPdXQgd2UgbmVlZCB0aGUgaW50ZXJzZWN0
aW9uIG9mIHRoZSBpbmZpbml0ZQorICAgIC8vIGNsaXBwaW5nIHJlY3QgYW5kIHRoZSBwYXRoIHdl
IGp1c3QgY3JlYXRlZC4KKyAgICBEMkQxX1NJWkVfRiByZW5kZXJlclNpemUgPSBwbGF0Zm9ybUNv
bnRleHQucmVuZGVyVGFyZ2V0KCktPkdldFNpemUoKTsKKyAgICBGbG9hdFJlY3QgY2xpcEJvdW5k
cygwLCAwLCByZW5kZXJlclNpemUud2lkdGgsIHJlbmRlcmVyU2l6ZS5oZWlnaHQpOworCisgICAg
UGF0aCBib3VuZGluZ1JlY3Q7CisgICAgYm91bmRpbmdSZWN0LmFkZFJlY3QoY2xpcEJvdW5kcyk7
CisgICAgYm91bmRpbmdSZWN0LmFwcGVuZEdlb21ldHJ5KHBhdGgucGxhdGZvcm1QYXRoKCkpOwor
CisgICAgQ09NUHRyPElEMkQxR2VvbWV0cnlHcm91cD4gcGF0aFRvQ2xpcDsKKyAgICBib3VuZGlu
Z1JlY3QuY3JlYXRlR2VvbWV0cnlXaXRoRmlsbE1vZGUoV2luZFJ1bGU6OkV2ZW5PZGQsIHBhdGhU
b0NsaXApOworICAgIGNsaXBQYXRoKHBsYXRmb3JtQ29udGV4dCwgcGF0aFRvQ2xpcC5nZXQoKSk7
Cit9CisKK3ZvaWQgY2xpcFBhdGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29u
dGV4dCwgY29uc3QgUGF0aCYgcGF0aCwgV2luZFJ1bGUgY2xpcFJ1bGUpCit7CisgICAgaWYgKHBh
dGguaXNFbXB0eSgpKSB7CisgICAgICAgIERpcmVjdDJEOjpjbGlwKHBsYXRmb3JtQ29udGV4dCwg
RmxvYXRSZWN0KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ09NUHRyPElEMkQx
R2VvbWV0cnlHcm91cD4gcGF0aFRvQ2xpcDsKKyAgICBwYXRoLmNyZWF0ZUdlb21ldHJ5V2l0aEZp
bGxNb2RlKGNsaXBSdWxlLCBwYXRoVG9DbGlwKTsKKworICAgIGNsaXBQYXRoKHBsYXRmb3JtQ29u
dGV4dCwgcGF0aFRvQ2xpcC5nZXQoKSk7CisKKyAgICBpZiAoYXV0byogZ3JhcGhpY3NDb250ZXh0
UHJpdmF0ZSA9IHBsYXRmb3JtQ29udGV4dC5ncmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisgICAg
ICAgIGdyYXBoaWNzQ29udGV4dFByaXZhdGUtPmNsaXAocGF0aCk7Cit9CisKK3ZvaWQgY2xpcFBh
dGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgSUQyRDFHZW9tZXRy
eSogcGF0aCkKK3sKKyAgICBBU1NFUlQocGxhdGZvcm1Db250ZXh0Lmhhc1NhdmVkU3RhdGUoKSk7
CisgICAgaWYgKCFwbGF0Zm9ybUNvbnRleHQuaGFzU2F2ZWRTdGF0ZSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBDT01QdHI8SUQyRDFMYXllcj4gY2xpcExheWVyOworICAgIEhSRVNVTFQgaHIg
PSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkNyZWF0ZUxheWVyKCZjbGlwTGF5ZXIp
OworICAgIEFTU0VSVChTVUNDRUVERUQoaHIpKTsKKyAgICBpZiAoIVNVQ0NFRURFRChocikpCisg
ICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+UHVz
aExheWVyKEQyRDE6OkxheWVyUGFyYW1ldGVycyhEMkQxOjpJbmZpbml0ZVJlY3QoKSwgcGF0aCks
IGNsaXBMYXllci5nZXQoKSk7CisgICAgcGxhdGZvcm1Db250ZXh0LnB1c2hSZW5kZXJDbGlwKFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEOjpMYXllckNsaXApOworICAgIHBsYXRmb3JtQ29udGV4dC5z
ZXRBY3RpdmVMYXllcihXVEZNb3ZlKGNsaXBMYXllcikpOworfQorCit2b2lkIGNsaXBUb0ltYWdl
QnVmZmVyKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgSUQyRDFSZW5kZXJUYXJnZXQqLCBjb25z
dCBGbG9hdFJlY3QmKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30gLy8gbmFtZXNw
YWNlIERpcmVjdDJECit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoRElS
RUNUMkQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0
MkRPcGVyYXRpb25zLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0RpcmVjdDJET3BlcmF0aW9ucy5oCShub25leGlzdGVudCkKKysrIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJlY3QyRE9wZXJhdGlvbnMuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDE5
IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcg
QWxwIFRva2VyIDxhbHBAYXRva2VyLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBE
aXJrIFNjaHVsemUgPGtyaXRAd2Via2l0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBOdWFu
dGkgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEJyZW50IEZ1bGdoYW0gPGJmdWxnaGFtQHdl
YmtpdC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEgSWdhbGlhIFMuTC4KKyAqIENv
cHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMC4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNp
ZiBVU0UoRElSRUNUMkQpCisKKyNpbmNsdWRlICJEYXNoQXJyYXkuaCIKKyNpbmNsdWRlICJHcmFw
aGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJHcmFwaGljc1R5cGVzLmgiCisjaW5jbHVkZSA8ZDJk
MS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEFmZmluZVRyYW5zZm9ybTsKK2Ns
YXNzIENvbG9yOworY2xhc3MgRmxvYXRSZWN0OworY2xhc3MgRmxvYXRSb3VuZGVkUmVjdDsKK2Ns
YXNzIEZsb2F0U2l6ZTsKK2NsYXNzIFBhdGg7CitjbGFzcyBQbGF0Zm9ybUNvbnRleHRDYWlybzsK
Kworc3RydWN0IEdyYXBoaWNzQ29udGV4dFN0YXRlOworCituYW1lc3BhY2UgRGlyZWN0MkQgewor
CituYW1lc3BhY2UgU3RhdGUgeworCit2b2lkIHNldFN0cm9rZVRoaWNrbmVzcyhQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRCYsIGZsb2F0KTsKK3ZvaWQgc2V0U3Ryb2tlU3R5bGUoUGxhdGZvcm1Db250
ZXh0RGlyZWN0MkQmLCBTdHJva2VTdHlsZSk7CisKK3ZvaWQgc2V0Q29tcG9zaXRlT3BlcmF0aW9u
KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgQ29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSk7
Cit2b2lkIHNldFNob3VsZEFudGlhbGlhcyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGJvb2wp
OworCit2b2lkIHNldENUTShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEFmZmluZVRy
YW5zZm9ybSYpOworQWZmaW5lVHJhbnNmb3JtIGdldENUTShQbGF0Zm9ybUNvbnRleHREaXJlY3Qy
RCYpOworCitJbnRSZWN0IGdldENsaXBCb3VuZHMoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmKTsK
K0Zsb2F0UmVjdCByb3VuZFRvRGV2aWNlUGl4ZWxzKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwg
Y29uc3QgRmxvYXRSZWN0Jik7CisKK2Jvb2wgaXNBY2NlbGVyYXRlZENvbnRleHQoUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQmKTsKKworfSAvLyBuYW1lc3BhY2UgU3RhdGUKKworc3RydWN0IEZpbGxT
b3VyY2UgeworICAgIEZpbGxTb3VyY2UoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgRmlsbFNv
dXJjZShjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYsIFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
Jik7CisKKyAgICBmbG9hdCBnbG9iYWxBbHBoYSB7IDAgfTsKKyAgICBDT01QdHI8SUQyRDFCcnVz
aD4gYnJ1c2g7CisgICAgQ29sb3IgY29sb3I7CisKKyAgICBXaW5kUnVsZSBmaWxsUnVsZSB7IFdp
bmRSdWxlOjpOb25aZXJvIH07Cit9OworCitzdHJ1Y3QgU3Ryb2tlU291cmNlIHsKKyAgICBTdHJv
a2VTb3VyY2UoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgU3Ryb2tlU291cmNlKGNvbnN0IEdy
YXBoaWNzQ29udGV4dFN0YXRlJiwgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmKTsKKworICAgIGZs
b2F0IGdsb2JhbEFscGhhIHsgMCB9OworICAgIGZsb2F0IHRoaWNrbmVzcyB7IDAgfTsKKyAgICBD
T01QdHI8SUQyRDFCcnVzaD4gYnJ1c2g7CisgICAgQ29sb3IgY29sb3I7Cit9OworCitzdHJ1Y3Qg
U2hhZG93U3RhdGUgeworICAgIFNoYWRvd1N0YXRlKCkgPSBkZWZhdWx0OworICAgIFdFQkNPUkVf
RVhQT1JUIGV4cGxpY2l0IFNoYWRvd1N0YXRlKGNvbnN0IEdyYXBoaWNzQ29udGV4dFN0YXRlJik7
CisKKyAgICBib29sIGlzVmlzaWJsZSgpIGNvbnN0OworICAgIGJvb2wgaXNSZXF1aXJlZChQbGF0
Zm9ybUNvbnRleHREaXJlY3QyRCYpIGNvbnN0OworCisgICAgRmxvYXRTaXplIG9mZnNldDsKKyAg
ICBmbG9hdCBibHVyIHsgMCB9OworICAgIENvbG9yIGNvbG9yOworICAgIGJvb2wgaWdub3JlVHJh
bnNmb3JtcyB7IGZhbHNlIH07CisKKyAgICBmbG9hdCBnbG9iYWxBbHBoYSB7IDEuMCB9OworICAg
IENvbXBvc2l0ZU9wZXJhdG9yIGdsb2JhbENvbXBvc2l0ZU9wZXJhdG9yIHsgQ29tcG9zaXRlU291
cmNlT3ZlciB9OworfTsKKwordm9pZCBzZXRMaW5lQ2FwKFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
JiwgTGluZUNhcCk7Cit2b2lkIHNldExpbmVEYXNoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwg
Y29uc3QgRGFzaEFycmF5JiwgZmxvYXQpOwordm9pZCBzZXRMaW5lSm9pbihQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYsIExpbmVKb2luKTsKK3ZvaWQgc2V0TWl0ZXJMaW1pdChQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYsIGZsb2F0KTsKKwordm9pZCBmaWxsUmVjdChQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZpbGxTb3VyY2UmLCBjb25zdCBTaGFkb3dT
dGF0ZSYpOwordm9pZCBmaWxsUmVjdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZs
b2F0UmVjdCYsIGNvbnN0IENvbG9yJiwgY29uc3QgU2hhZG93U3RhdGUmKTsKK3ZvaWQgZmlsbFJl
Y3RXaXRoR3JhZGllbnQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJlY3Qm
LCBJRDJEMUJydXNoKik7Cit2b2lkIGZpbGxSb3VuZGVkUmVjdChQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRCYsIGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmLCBjb25zdCBDb2xvciYsIGNvbnN0IFNoYWRv
d1N0YXRlJik7Cit2b2lkIGZpbGxSZWN0V2l0aFJvdW5kZWRIb2xlKFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRSb3VuZGVkUmVjdCYsIGNvbnN0
IEZpbGxTb3VyY2UmLCBjb25zdCBTaGFkb3dTdGF0ZSYpOwordm9pZCBmaWxsUGF0aChQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IFBhdGgmLCBjb25zdCBGaWxsU291cmNlJiwgY29uc3Qg
U2hhZG93U3RhdGUmKTsKK3ZvaWQgZmlsbFBhdGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBj
b25zdCBQYXRoJiwgY29uc3QgQ29sb3ImLCBjb25zdCBTaGFkb3dTdGF0ZSYpOworCit2b2lkIHN0
cm9rZVJlY3QoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJlY3QmLCBmbG9h
dCwgY29uc3QgU3Ryb2tlU291cmNlJiwgY29uc3QgU2hhZG93U3RhdGUmKTsKK3ZvaWQgc3Ryb2tl
UGF0aChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IFBhdGgmLCBjb25zdCBTdHJva2VT
b3VyY2UmLCBjb25zdCBTaGFkb3dTdGF0ZSYpOwordm9pZCBjbGVhclJlY3QoUGxhdGZvcm1Db250
ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJlY3QmKTsKKworLy8gRklYTUUoSU1QTEVNRU5UKTog
dm9pZCBkcmF3R2x5cGhzKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmlsbFNvdXJj
ZSYsIGNvbnN0IFN0cm9rZVNvdXJjZSYsIGNvbnN0IFNoYWRvd1N0YXRlJiwgY29uc3QgRmxvYXRQ
b2ludCYsIERpcmVjdFdyaXRlU2NhbGVkRm9udCosIGRvdWJsZSwgY29uc3QgVmVjdG9yPERpcmVj
dFdyaXRlR2x5cGhUeXBlPiYsIGZsb2F0LCBUZXh0RHJhd2luZ01vZGVGbGFncywgZmxvYXQsIGNv
bnN0IEZsb2F0U2l6ZSYsIGNvbnN0IENvbG9yJik7CisKK3ZvaWQgZHJhd05hdGl2ZUltYWdlKFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEJiwgSVdJQ0JpdG1hcCosIGNvbnN0IEZsb2F0U2l6ZSYgaW1h
Z2VTaXplLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFJlY3QmLCBDb21wb3NpdGVPcGVy
YXRvciwgQmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0aW9uLCBJbnRlcnBvbGF0aW9uUXVhbGl0eSwg
ZmxvYXQsIGNvbnN0IFNoYWRvd1N0YXRlJik7Cit2b2lkIGRyYXdOYXRpdmVJbWFnZShQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRCYsIElEMkQxQml0bWFwKiwgY29uc3QgRmxvYXRTaXplJiBpbWFnZVNp
emUsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZsb2F0UmVjdCYsIENvbXBvc2l0ZU9wZXJhdG9y
LCBCbGVuZE1vZGUsIEltYWdlT3JpZW50YXRpb24sIEludGVycG9sYXRpb25RdWFsaXR5LCBmbG9h
dCwgY29uc3QgU2hhZG93U3RhdGUmKTsKK3ZvaWQgZHJhd1BhdGgoUGxhdGZvcm1Db250ZXh0RGly
ZWN0MkQmLCBjb25zdCBQYXRoJiwgY29uc3QgU3Ryb2tlU291cmNlJiwgY29uc3QgU2hhZG93U3Rh
dGUmKTsKK3ZvaWQgZHJhd1BhdHRlcm4oUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBJV0lDQml0
bWFwKiwgY29uc3QgSW50U2l6ZSYsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZsb2F0UmVjdCYs
IGNvbnN0IEFmZmluZVRyYW5zZm9ybSYsIGNvbnN0IEZsb2F0UG9pbnQmLCBDb21wb3NpdGVPcGVy
YXRvciwgQmxlbmRNb2RlKTsKKwordm9pZCBkcmF3V2l0aG91dFNoYWRvdyhQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdSZWN0LCBjb25zdCBXVEY6OkZ1
bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4mIGRyYXdDb21tYW5kcyk7Cit2b2lkIGRy
YXdXaXRoU2hhZG93KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0JiBi
b3VuZGluZ1JlY3QsIGNvbnN0IFNoYWRvd1N0YXRlJiwgY29uc3QgV1RGOjpGdW5jdGlvbjx2b2lk
KElEMkQxUmVuZGVyVGFyZ2V0Kik+JiBkcmF3Q29tbWFuZHMpOwordm9pZCBkcmF3V2l0aFNoYWRv
d0hlbHBlcihJRDJEMVJlbmRlclRhcmdldCogY29udGV4dCwgSUQyRDFCaXRtYXAqLCBjb25zdCBD
b2xvciYgc2hhZG93Q29sb3IsIGNvbnN0IEZsb2F0U2l6ZSYgc2hhZG93T2Zmc2V0LCBmbG9hdCBz
aGFkb3dCbHVyKTsKKwordm9pZCBkcmF3UmVjdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNv
bnN0IEZsb2F0UmVjdCYsIGZsb2F0LCBjb25zdCBDb2xvciYsIFN0cm9rZVN0eWxlLCBjb25zdCBD
b2xvciYpOwordm9pZCBkcmF3TGluZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZs
b2F0UG9pbnQmLCBjb25zdCBGbG9hdFBvaW50JiwgU3Ryb2tlU3R5bGUsIGNvbnN0IENvbG9yJiwg
ZmxvYXQsIGJvb2wpOwordm9pZCBkcmF3TGluZXNGb3JUZXh0KFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEJiwgY29uc3QgRmxvYXRQb2ludCYsIGZsb2F0IHRoaWNrbmVzcywgY29uc3QgRGFzaEFycmF5
JiwgYm9vbCwgYm9vbCwgY29uc3QgQ29sb3ImKTsKK3ZvaWQgZHJhd0RvdHNGb3JEb2N1bWVudE1h
cmtlcihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYsIERvY3VtZW50
TWFya2VyTGluZVN0eWxlKTsKK3ZvaWQgZHJhd0VsbGlwc2UoUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmLCBjb25zdCBGbG9hdFJlY3QmLCBTdHJva2VTdHlsZSwgY29uc3QgQ29sb3ImLCBmbG9hdCk7
Cit2b2lkIGZpbGxFbGxpcHNlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRS
ZWN0JiwgY29uc3QgQ29sb3ImLCBTdHJva2VTdHlsZSwgY29uc3QgQ29sb3ImLCBmbG9hdCk7CisK
K3ZvaWQgZHJhd0ZvY3VzUmluZyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IFBhdGgm
LCBmbG9hdCwgY29uc3QgQ29sb3ImKTsKK3ZvaWQgZHJhd0ZvY3VzUmluZyhQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYsIGNvbnN0IFZlY3RvcjxGbG9hdFJlY3Q+JiwgZmxvYXQsIGNvbnN0IENvbG9y
Jik7CisKK3ZvaWQgZmx1c2goUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmKTsKK3ZvaWQgc2F2ZShQ
bGF0Zm9ybUNvbnRleHREaXJlY3QyRCYpOwordm9pZCByZXN0b3JlKFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJik7CisKK3ZvaWQgdHJhbnNsYXRlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgZmxv
YXQsIGZsb2F0KTsKK3ZvaWQgcm90YXRlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgZmxvYXQp
Owordm9pZCBzY2FsZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0U2l6ZSYp
Owordm9pZCBjb25jYXRDVE0oUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBBZmZpbmVU
cmFuc2Zvcm0mKTsKKwordm9pZCBiZWdpblRyYW5zcGFyZW5jeUxheWVyKFBsYXRmb3JtQ29udGV4
dERpcmVjdDJEJiwgZmxvYXQpOwordm9pZCBlbmRUcmFuc3BhcmVuY3lMYXllcihQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRCYpOworCit2b2lkIGNsaXAoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBj
b25zdCBGbG9hdFJlY3QmKTsKKwordm9pZCBjbGlwT3V0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
JiwgY29uc3QgRmxvYXRSZWN0Jik7Cit2b2lkIGNsaXBPdXQoUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmLCBjb25zdCBQYXRoJik7Cit2b2lkIGNsaXBQYXRoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
JiwgY29uc3QgUGF0aCYsIFdpbmRSdWxlKTsKK3ZvaWQgY2xpcFBhdGgoUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQmLCBJRDJEMUdlb21ldHJ5KiBwYXRoKTsKKwordm9pZCBjbGlwVG9JbWFnZUJ1ZmZl
cihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIElEMkQxUmVuZGVyVGFyZ2V0KiwgY29uc3QgRmxv
YXRSZWN0Jik7CisKK30gLy8gbmFtZXNwYWNlIERpcmVjdDJECit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBVU0UoRElSRUNUMkQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0MkRVdGlsaXRpZXMuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJlY3QyRFV0aWxpdGllcy5jcHAJ
KG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Rp
cmVjdDJEVXRpbGl0aWVzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEzMiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMCBJZ2FsaWEgUy5MLgorICogQ29weXJpZ2h0IChDKSAyMDEx
IFByb0ZVU0lPTiBlbWJlZGRlZCBzeXN0ZW1zCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEaXJlY3QyRFV0
aWxpdGllcy5oIgorCisjaWYgVVNFKERJUkVDVDJEKQorCisjaW5jbHVkZSAiQ09NUHRyLmgiCisj
aW5jbHVkZSAiRmxvYXRQb2ludC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2lu
Y2x1ZGUgIkltYWdlRGVjb2RlckRpcmVjdDJELmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2lu
Y2x1ZGUgIkludFNpemUuaCIKKyNpbmNsdWRlIDxkMmQxLmg+CisjaW5jbHVkZSA8d2luY29kZWMu
aD4KKworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK25hbWVzcGFjZSBEaXJlY3QyRCB7CisKK0lu
dFNpemUgYml0bWFwU2l6ZShJV0lDQml0bWFwU291cmNlKiBiaXRtYXBTb3VyY2UpCit7CisgICAg
VUlOVCB3aWR0aCwgaGVpZ2h0OworICAgIEhSRVNVTFQgaHIgPSBiaXRtYXBTb3VyY2UtPkdldFNp
emUoJndpZHRoLCAmaGVpZ2h0KTsKKyAgICBpZiAoIVNVQ0NFRURFRChocikpCisgICAgICAgIHJl
dHVybiB7IH07CisKKyAgICByZXR1cm4gSW50U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKK30KKworRmxv
YXRQb2ludCBiaXRtYXBSZXNvbHV0aW9uKElXSUNCaXRtYXBTb3VyY2UqIGJpdG1hcFNvdXJjZSkK
K3sKKyAgICBjb25zdGV4cHIgZG91YmxlIGRwaUJhc2UgPSA5Ni4wOworCisgICAgZG91YmxlIGRw
aVgsIGRwaVk7CisgICAgSFJFU1VMVCBociA9IGJpdG1hcFNvdXJjZS0+R2V0UmVzb2x1dGlvbigm
ZHBpWCwgJmRwaVkpOworICAgIGlmICghU1VDQ0VFREVEKGhyKSkKKyAgICAgICAgcmV0dXJuIHsg
fTsKKworICAgIEZsb2F0UG9pbnQgcmVzdWx0KGRwaVgsIGRwaVkpOworICAgIHJlc3VsdC5zY2Fs
ZSgxIC8gZHBpQmFzZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordW5zaWduZWQgYml0c1Bl
clBpeGVsKEdVSUQgYml0bWFwRm9ybWF0KQoreworICAgIENPTVB0cjxJV0lDQ29tcG9uZW50SW5m
bz4gY29tcG9uZW50SW5mbzsKKyAgICBIUkVTVUxUIGhyID0gSW1hZ2VEZWNvZGVyRGlyZWN0MkQ6
OnN5c3RlbUltYWdpbmdGYWN0b3J5KCktPkNyZWF0ZUNvbXBvbmVudEluZm8oYml0bWFwRm9ybWF0
LCAmY29tcG9uZW50SW5mbyk7CisgICAgaWYgKCFTVUNDRUVERUQoaHIpKQorICAgICAgICByZXR1
cm4gNDsKKworICAgIENPTVB0cjxJV0lDUGl4ZWxGb3JtYXRJbmZvPiBwaXhlbEZvcm1hdDsKKyAg
ICBwaXhlbEZvcm1hdC5xdWVyeShjb21wb25lbnRJbmZvKTsKKyAgICBpZiAoIXBpeGVsRm9ybWF0
KQorICAgICAgICByZXR1cm4gNDsKKworICAgIFVJTlQgYnBwID0gMDsKKyAgICBociA9IHBpeGVs
Rm9ybWF0LT5HZXRCaXRzUGVyUGl4ZWwoJmJwcCk7CisgICAgaWYgKCFTVUNDRUVERUQoaHIpKQor
ICAgICAgICByZXR1cm4gNDsKKworICAgIHJldHVybiBicHA7Cit9CisKK0NPTVB0cjxJV0lDQml0
bWFwPiBjcmVhdGVEaXJlY3QyREltYWdlU3VyZmFjZVdpdGhEYXRhKHZvaWQqIGRhdGEsIGNvbnN0
IEludFNpemUmIHNpemUsIHVuc2lnbmVkIHN0cmlkZSkKK3sKKyAgICBDaGVja2VkPHNpemVfdCwg
UmVjb3JkT3ZlcmZsb3c+IG51bUJ5dGVzID0gQ2hlY2tlZDx1bnNpZ25lZCwgUmVjb3JkT3ZlcmZs
b3c+KHNpemUuaGVpZ2h0KCkpICogc3RyaWRlOworICAgIGlmIChudW1CeXRlcy5oYXNPdmVyZmxv
d2VkKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgQ09NUHRyPElXSUNCaXRtYXA+
IHN1cmZhY2U7CisgICAgSFJFU1VMVCBociA9IEltYWdlRGVjb2RlckRpcmVjdDJEOjpzeXN0ZW1J
bWFnaW5nRmFjdG9yeSgpLT5DcmVhdGVCaXRtYXBGcm9tTWVtb3J5KHNpemUud2lkdGgoKSwgc2l6
ZS5oZWlnaHQoKSwgR1VJRF9XSUNQaXhlbEZvcm1hdDMyYnBwUEJHUkEsIHN0cmlkZSwgc3RhdGlj
X2Nhc3Q8VUlOVD4obnVtQnl0ZXMudW5zYWZlR2V0KCkpLCByZWludGVycHJldF9jYXN0PEJZVEUq
PihkYXRhKSwgJnN1cmZhY2UpOworICAgIGlmICghU1VDQ0VFREVEKGhyKSkKKyAgICAgICAgcmV0
dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gc3VyZmFjZTsKK30KKworQ09NUHRyPElEMkQxUmVu
ZGVyVGFyZ2V0PiBjcmVhdGVSZW5kZXJUYXJnZXRGcm9tV0lDQml0bWFwKElXSUNCaXRtYXAqIGJp
dG1hcFNvdXJjZSkKK3sKKyAgICBhdXRvIHRhcmdldFByb3BlcnRpZXMgPSBEMkQxOjpSZW5kZXJU
YXJnZXRQcm9wZXJ0aWVzKEQyRDFfUkVOREVSX1RBUkdFVF9UWVBFX0RFRkFVTFQsCisgICAgICAg
IEQyRDE6OlBpeGVsRm9ybWF0KERYR0lfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBEMkQxX0FMUEhB
X01PREVfUFJFTVVMVElQTElFRCksCisgICAgICAgIDAsIDAsIEQyRDFfUkVOREVSX1RBUkdFVF9V
U0FHRV9OT05FLCBEMkQxX0ZFQVRVUkVfTEVWRUxfREVGQVVMVCk7CisKKyAgICBDT01QdHI8SUQy
RDFSZW5kZXJUYXJnZXQ+IGJpdG1hcENvbnRleHQ7CisgICAgSFJFU1VMVCBociA9IEdyYXBoaWNz
Q29udGV4dDo6c3lzdGVtRmFjdG9yeSgpLT5DcmVhdGVXaWNCaXRtYXBSZW5kZXJUYXJnZXQoYml0
bWFwU291cmNlLCAmdGFyZ2V0UHJvcGVydGllcywgJmJpdG1hcENvbnRleHQpOworICAgIGlmICgh
Yml0bWFwQ29udGV4dCB8fCAhU1VDQ0VFREVEKGhyKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7
CisKKyAgICByZXR1cm4gYml0bWFwQ29udGV4dDsKK30KKwordm9pZCBjb3B5UmVjdEZyb21PbmVT
dXJmYWNlVG9Bbm90aGVyKElXSUNCaXRtYXAqIGZyb20sIElXSUNCaXRtYXAqIHRvLCBjb25zdCBJ
bnRTaXplJiBzb3VyY2VPZmZzZXQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IEludFNpemUm
IGRlc3RPZmZzZXQpCit7CisgICAgLyoKKyAgICBSZWZQdHI8Y2Fpcm9fdD4gY29udGV4dCA9IGFk
b3B0UmVmKGNhaXJvX2NyZWF0ZSh0bykpOworICAgIGNhaXJvX3RyYW5zbGF0ZShjb250ZXh0Lmdl
dCgpLCBkZXN0T2Zmc2V0LndpZHRoKCksIGRlc3RPZmZzZXQuaGVpZ2h0KCkpOworICAgIGNhaXJv
X3NldF9vcGVyYXRvcihjb250ZXh0LmdldCgpLCBjYWlyb09wZXJhdG9yKTsKKyAgICBjb3B5UmVj
dEZyb21DYWlyb1N1cmZhY2VUb0NvbnRleHQoZnJvbSwgY29udGV4dC5nZXQoKSwgc291cmNlT2Zm
c2V0LCByZWN0KTsKKyAgICAqLworfQorCit9IC8vIG5hbWVzcGFjZSBEaXJlY3QyRAorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoRElSRUNUMkQpCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0MkRVdGlsaXRpZXMuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0MkRV
dGlsaXRpZXMuaAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vRGlyZWN0MkRVdGlsaXRpZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBTLkwuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTEgUHJvRlVTSU9OIGVtYmVkZGVkIHN5c3RlbXMKKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBVU0UoRElSRUNUMkQp
CisKKyNpbmNsdWRlICJDT01QdHIuaCIKKyNpbmNsdWRlICJHcmFwaGljc1R5cGVzLmgiCisjaW5j
bHVkZSAiSW50U2l6ZS5oIgorCitpbnRlcmZhY2UgSUQyRDFSZW5kZXJUYXJnZXQ7CitpbnRlcmZh
Y2UgSVdJQ0JpdG1hcFNvdXJjZTsKK2ludGVyZmFjZSBJV0lDQml0bWFwOworCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK2NsYXNzIEZsb2F0UG9pbnQ7CitjbGFzcyBJbnRSZWN0OworY2xhc3MgSW50
U2l6ZTsKKworbmFtZXNwYWNlIERpcmVjdDJEIHsKKworSW50U2l6ZSBiaXRtYXBTaXplKElXSUNC
aXRtYXBTb3VyY2UqKTsKK0Zsb2F0UG9pbnQgYml0bWFwUmVzb2x1dGlvbihJV0lDQml0bWFwU291
cmNlKik7Cit1bnNpZ25lZCBiaXRzUGVyUGl4ZWwoR1VJRCk7CitDT01QdHI8SVdJQ0JpdG1hcD4g
Y3JlYXRlRGlyZWN0MkRJbWFnZVN1cmZhY2VXaXRoRGF0YSh2b2lkKiBkYXRhLCBjb25zdCBJbnRT
aXplJiwgdW5zaWduZWQgc3RyaWRlKTsKK0NPTVB0cjxJRDJEMVJlbmRlclRhcmdldD4gY3JlYXRl
UmVuZGVyVGFyZ2V0RnJvbVdJQ0JpdG1hcChJV0lDQml0bWFwKik7CisKK3ZvaWQgY29weVJlY3RG
cm9tT25lU3VyZmFjZVRvQW5vdGhlcihJV0lDQml0bWFwKiBmcm9tLCBJV0lDQml0bWFwKiB0bywg
Y29uc3QgSW50U2l6ZSYgc291cmNlT2Zmc2V0LCBjb25zdCBJbnRSZWN0JiwgY29uc3QgSW50U2l6
ZSYgZGVzdE9mZnNldCA9IEludFNpemUoKSk7CisKK30gLy8gbmFtZXNwYWNlIERpcmVjdDJECisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShESVJFQ1QyRCkKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2FzY2FkZURpcmVjdDJE
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
Rm9udENhc2NhZGVEaXJlY3QyRC5jcHAJKHJldmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2FzY2FkZURpcmVjdDJELmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgog
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURpcmVjdDJELmgiCiAjaW5j
bHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCiAj
aW5jbHVkZSAiVW5pc2NyaWJlQ29udHJvbGxlci5oIgogI2luY2x1ZGUgIldlYkNvcmVUZXh0UmVu
ZGVyZXIuaCIKICNpbmNsdWRlIDxkMmQxLmg+CkBAIC00Nyw3ICs0OCw3IEBAIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIHZvaWQgRm9udENhc2NhZGU6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0JiBn
cmFwaGljc0NvbnRleHQsIGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlw
aEJ1ZmZlciwKICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBudW1HbHlwaHMsIGNvbnN0IEZs
b2F0UG9pbnQmIHBvaW50LCBGb250U21vb3RoaW5nTW9kZSBzbW9vdGhpbmdNb2RlKQogewotICAg
IGF1dG8gY29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBh
dXRvIGNvbnRleHQgPSBncmFwaGljc0NvbnRleHQucGxhdGZvcm1Db250ZXh0KCktPnJlbmRlclRh
cmdldCgpOwogICAgIGJvb2wgc2hvdWxkVXNlRm9udFNtb290aGluZyA9IFdlYkNvcmVTaG91bGRV
c2VGb250U21vb3RoaW5nKCk7CiAKICAgICBzd2l0Y2ggKHNtb290aGluZ01vZGUpIHsKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFkaWVudERpcmVjdDJELmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3Jh
ZGllbnREaXJlY3QyRC5jcHAJKHJldmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFkaWVudERpcmVjdDJELmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjgsNiArMjgsNyBAQAogCiAjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgogI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCiAj
aW5jbHVkZSA8ZDJkMS5oPgogI2luY2x1ZGUgPHd0Zi9SZXRhaW5QdHIuaD4KIApAQCAtMTEwLDcg
KzExMSw3IEBAIHZvaWQgR3JhZGllbnQ6OmdlbmVyYXRlR3JhZGllbnQoSUQyRDFSZW4KIAogdm9p
ZCBHcmFkaWVudDo6ZmlsbChHcmFwaGljc0NvbnRleHQmIGNvbnRleHQsIGNvbnN0IEZsb2F0UmVj
dCYgcmVjdCkKIHsKLSAgICBhdXRvIGQyZENvbnRleHQgPSBjb250ZXh0LnBsYXRmb3JtQ29udGV4
dCgpOworICAgIGF1dG8gZDJkQ29udGV4dCA9IGNvbnRleHQucGxhdGZvcm1Db250ZXh0KCktPnJl
bmRlclRhcmdldCgpOwogCiAgICAgV1RGOjpzd2l0Y2hPbihtX2RhdGEsCiAgICAgICAgIFsmXSAo
Y29uc3QgTGluZWFyRGF0YSYgZGF0YSkgewpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dERpcmVjdDJELmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0RGlyZWN0
MkQuY3BwCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vR3JhcGhpY3NDb250ZXh0RGlyZWN0MkQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNi0yMDE4IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNi0yMDE5IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAt
MjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogCiAjaW5jbHVkZSAi
Q09NUHRyLmgiCisjaW5jbHVkZSAiRGlyZWN0MkRPcGVyYXRpb25zLmgiCiAjaW5jbHVkZSAiRGlz
cGxheUxpc3RSZWNvcmRlci5oIgogI2luY2x1ZGUgIkZsb2F0Um91bmRlZFJlY3QuaCIKICNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5oIgpAQCAtMzQsNiAr
MzUsNyBAQAogI2luY2x1ZGUgIkltYWdlRGVjb2RlckRpcmVjdDJELmgiCiAjaW5jbHVkZSAiTG9n
Z2luZy5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQuaCIKICNpbmNsdWRlIDxkMmQxLmg+CiAjaW5jbHVkZSA8ZDJkMWVmZmVj
dHMuaD4KICNpbmNsdWRlIDxkd3JpdGUuaD4KQEAgLTYzLDEwICs2NSwxMSBAQCBHcmFwaGljc0Nv
bnRleHQ6OkdyYXBoaWNzQ29udGV4dChIREMgaGRjCiAKICAgICAoKnJlbmRlclRhcmdldCktPkJp
bmREQyhoZGMsICZyZWN0KTsKIAotICAgIG1fZGF0YSA9IG5ldyBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUoKnJlbmRlclRhcmdldCwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQ
VU1lbW9yeSk7CisgICAgYXV0byBvd25lZFBsYXRmb3JtQ29udGV4dCA9IHN0ZDo6bWFrZV91bmlx
dWU8UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ+KCpyZW5kZXJUYXJnZXQpOworICAgIG1fZGF0YSA9
IG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoV1RGTW92ZShvd25lZFBsYXRmb3Jt
Q29udGV4dCksIEJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1vcnkpOwogfQogCi1H
cmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCog
cGxhdGZvcm1HcmFwaGljc0NvbnRleHQsIEJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlIHJlbmRl
cmVyVHlwZSkKK0dyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KFBsYXRmb3JtQ29udGV4
dERpcmVjdDJEKiBwbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCwgQml0bWFwUmVuZGVyaW5nQ29udGV4
dFR5cGUgcmVuZGVyZXJUeXBlKQogewogICAgIHBsYXRmb3JtSW5pdChwbGF0Zm9ybUdyYXBoaWNz
Q29udGV4dCwgcmVuZGVyZXJUeXBlKTsKIH0KQEAgLTEyNCw4ICsxMjcsMTAgQEAgdm9pZCBHcmFw
aGljc0NvbnRleHQ6OnBsYXRmb3JtSW5pdChIREMgaAogICAgIGlmICghU1VDQ0VFREVEKGhyKSkK
ICAgICAgICAgcmV0dXJuOwogCi0gICAgbV9kYXRhID0gbmV3IEdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZShyZW5kZXJUYXJnZXQuZ2V0KCksIEJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBl
OjpHUFVNZW1vcnkpOworICAgIGF1dG8gb3duZWRQbGF0Zm9ybUNvbnRleHQgPSBzdGQ6Om1ha2Vf
dW5pcXVlPFBsYXRmb3JtQ29udGV4dERpcmVjdDJEPihyZW5kZXJUYXJnZXQuZ2V0KCkpOworICAg
IG1fZGF0YSA9IG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoV1RGTW92ZShvd25l
ZFBsYXRmb3JtQ29udGV4dCksIEJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1vcnkp
OwogICAgIG1fZGF0YS0+bV9oZGMgPSBoZGM7CisKICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRl
eHQgc3RhcnRzIGluIHN5bmMgd2l0aCBvdXIgc3RhdGUuCiAgICAgc2V0UGxhdGZvcm1GaWxsQ29s
b3IoZmlsbENvbG9yKCkpOwogICAgIHNldFBsYXRmb3JtU3Ryb2tlQ29sb3Ioc3Ryb2tlQ29sb3Io
KSk7CkBAIC0xMzMsMTcgKzEzOCwxNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1J
bml0KEhEQyBoCiAgICAgLy8gRklYTUU6IG1fc3RhdGUuaW1hZ2VJbnRlcnBvbGF0aW9uUXVhbGl0
eSA9IGNvbnZlcnRJbnRlcnBvbGF0aW9uUXVhbGl0eShDR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9u
UXVhbGl0eShwbGF0Zm9ybUNvbnRleHQoKSkpOwogfQogCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6
cGxhdGZvcm1Jbml0KElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6cGxhdGZvcm1Jbml0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEKiBwbGF0Zm9y
bUNvbnRleHQpCiB7Ci0gICAgcGxhdGZvcm1Jbml0KHJlbmRlclRhcmdldCwgQml0bWFwUmVuZGVy
aW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSk7CisgICAgcGxhdGZvcm1Jbml0KHBsYXRmb3JtQ29u
dGV4dCwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSk7CiB9CiAKLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybUluaXQoSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRh
cmdldCwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUgcmVuZGVyaW5nVHlwZSkKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpwbGF0Zm9ybUluaXQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQqIHBsYXRm
b3JtQ29udGV4dCwgQml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUgcmVuZGVyaW5nVHlwZSkKIHsK
LSAgICBpZiAoIXJlbmRlclRhcmdldCkKKyAgICBpZiAoIXBsYXRmb3JtQ29udGV4dCkKICAgICAg
ICAgcmV0dXJuOwogCi0gICAgbV9kYXRhID0gbmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZShyZW5kZXJUYXJnZXQsIHJlbmRlcmluZ1R5cGUpOworICAgIG1fZGF0YSA9IG5ldyBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKnBsYXRmb3JtQ29udGV4dCwgcmVuZGVyaW5nVHlw
ZSk7CiAKICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRleHQgc3RhcnRzIGluIHN5bmMgd2l0aCBv
dXIgc3RhdGUuCiAgICAgc2V0UGxhdGZvcm1GaWxsQ29sb3IoZmlsbENvbG9yKCkpOwpAQCAtMTU3
LDMwICsxNjIsMzUgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtRGVzdHJveSgpCiAg
ICAgZGVsZXRlIG1fZGF0YTsKIH0KIAotSUQyRDFSZW5kZXJUYXJnZXQqIEdyYXBoaWNzQ29udGV4
dDo6cGxhdGZvcm1Db250ZXh0KCkgY29uc3QKK1BsYXRmb3JtQ29udGV4dERpcmVjdDJEKiBHcmFw
aGljc0NvbnRleHQ6OnBsYXRmb3JtQ29udGV4dCgpIGNvbnN0CiB7CiAgICAgQVNTRVJUKCFwYWlu
dGluZ0Rpc2FibGVkKCkpOwotICAgIHJldHVybiBtX2RhdGEtPnJlbmRlclRhcmdldCgpOworICAg
IHJldHVybiBtX2RhdGEtPnBsYXRmb3JtQ29udGV4dCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6c3luY0NvbnRleHQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQm
KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKIElEMkQxUmVuZGVyVGFyZ2V0KiBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnJlbmRlclRhcmdldCgpCiB7Ci0gICAgaWYgKCFt
X3RyYW5zcGFyZW5jeUxheWVyU3RhY2suaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gbV90cmFu
c3BhcmVuY3lMYXllclN0YWNrLmxhc3QoKS5yZW5kZXJUYXJnZXQuZ2V0KCk7CisgICAgaWYgKCFt
X3BsYXRmb3JtQ29udGV4dC5tX3RyYW5zcGFyZW5jeUxheWVyU3RhY2suaXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm4gbV9wbGF0Zm9ybUNvbnRleHQubV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmxh
c3QoKS5yZW5kZXJUYXJnZXQuZ2V0KCk7CiAKLSAgICByZXR1cm4gbV9yZW5kZXJUYXJnZXQuZ2V0
KCk7CisgICAgcmV0dXJuIG1fcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2V0QWxwaGEoZmxvYXQgYWxwaGEp
CiB7Ci0gICAgQVNTRVJUKG1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5pc0VtcHR5KCkpOworICAg
IEFTU0VSVChtX3BsYXRmb3JtQ29udGV4dC5tX3RyYW5zcGFyZW5jeUxheWVyU3RhY2suaXNFbXB0
eSgpKTsKICAgICBtX2FscGhhID0gYWxwaGE7CiB9CiAKIGZsb2F0IEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZTo6Y3VycmVudEdsb2JhbEFscGhhKCkgY29uc3QKIHsKLSAgICBpZiAoIW1f
dHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBtX3RyYW5z
cGFyZW5jeUxheWVyU3RhY2subGFzdCgpLm9wYWNpdHk7CisgICAgaWYgKCFtX3BsYXRmb3JtQ29u
dGV4dC5tX3RyYW5zcGFyZW5jeUxheWVyU3RhY2suaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
bV9wbGF0Zm9ybUNvbnRleHQubV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmxhc3QoKS5vcGFjaXR5
OwogCiAgICAgcmV0dXJuIG1fYWxwaGE7CiB9CkBAIC0xOTAsOSArMjAwLDggQEAgdm9pZCBHcmFw
aGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9ybVN0YXRlKAogICAgIEFTU0VSVCghcGFpbnRpbmdEaXNh
YmxlZCgpKTsKICAgICBBU1NFUlQoIW1faW1wbCk7CiAKLSAgICAvLyBOb3RlOiBEbyBub3QgdXNl
IHRoaXMgZnVuY3Rpb24gd2l0aGluIHRoaXMgY2xhc3MgaW1wbGVtZW50YXRpb24sIHNpbmNlIHdl
IHdhbnQgdG8gYXZvaWQgdGhlIGV4dHJhCi0gICAgLy8gc2F2ZSBvZiB0aGUgc2Vjb25kYXJ5IGNv
bnRleHQgKGluIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURpcmVjdDJELmgpLgotICAg
IG1fZGF0YS0+c2F2ZSgpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAg
RGlyZWN0MkQ6OnNhdmUoKnBsYXRmb3JtQ29udGV4dCgpKTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0YXRlKCkKQEAgLTIwMCw5NyArMjA5LDMxIEBAIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpyZXN0b3JlUGxhdGZvcm1TdGEKICAgICBBU1NFUlQoIXBhaW50aW5n
RGlzYWJsZWQoKSk7CiAgICAgQVNTRVJUKCFtX2ltcGwpOwogCi0gICAgLy8gTm90ZTogRG8gbm90
IHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiB0aGlzIGNsYXNzIGltcGxlbWVudGF0aW9uLCBzaW5j
ZSB3ZSB3YW50IHRvIGF2b2lkIHRoZSBleHRyYQotICAgIC8vIHJlc3RvcmUgb2YgdGhlIHNlY29u
ZGFyeSBjb250ZXh0IChpbiBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5o
KS4KLSAgICBtX2RhdGEtPnJlc3RvcmUoKTsKLSAgICAvLyBGSVhNRTogbV9kYXRhLT5tX3VzZXJU
b0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5ID0gZmFsc2U7CisgICAgQVNTRVJUKGhh
c1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6cmVzdG9yZSgqcGxhdGZvcm1Db250
ZXh0KCkpOwogfQogCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd05hdGl2ZUltYWdlKGNvbnN0
IENPTVB0cjxJV0lDQml0bWFwPiYgaW1hZ2UsIGNvbnN0IEZsb2F0U2l6ZSYgaW1hZ2VTaXplLCBj
b25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBv
c2l0ZU9wZXJhdG9yIG9wLCBCbGVuZE1vZGUgYmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0aW9uIG9y
aWVudGF0aW9uKQotewotICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gZGV2aWNlQml0bWFwOwotICAg
IEhSRVNVTFQgaHIgPSBwbGF0Zm9ybUNvbnRleHQoKS0+Q3JlYXRlQml0bWFwRnJvbVdpY0JpdG1h
cChpbWFnZS5nZXQoKSwgJmRldmljZUJpdG1hcCk7Ci0gICAgaWYgKCFTVUNDRUVERUQoaHIpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBkcmF3RGV2aWNlQml0bWFwKGRldmljZUJpdG1hcCwgaW1h
Z2VTaXplLCBkZXN0UmVjdCwgc3JjUmVjdCwgb3AsIGJsZW5kTW9kZSwgb3JpZW50YXRpb24pOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0RldmljZUJpdG1hcChjb25zdCBDT01QdHI8
SUQyRDFCaXRtYXA+JiBpbWFnZSwgY29uc3QgRmxvYXRTaXplJiBpbWFnZVNpemUsIGNvbnN0IEZs
b2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3Bl
cmF0b3Igb3AsIEJsZW5kTW9kZSBibGVuZE1vZGUsIEltYWdlT3JpZW50YXRpb24gb3JpZW50YXRp
b24pCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd05hdGl2ZUltYWdlKGNvbnN0IENPTVB0cjxJ
V0lDQml0bWFwPiYgaW1hZ2UsIGNvbnN0IEZsb2F0U2l6ZSYgaW1hZ2VTaXplLCBjb25zdCBGbG9h
dFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJh
dG9yIGNvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUgYmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0
aW9uIG9yaWVudGF0aW9uKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAg
IHJldHVybjsKIAogICAgIGlmIChtX2ltcGwpIHsKLSAgICAgICAgLy8gRklYTUU6IEltcGxlbWVu
dCBEaXNwbGF5TGlzdFJlY29yZGVyIHN1cHBvcnQgZm9yIGRyYXdOYXRpdmVJbWFnZS4KLSAgICAg
ICAgLy8gbV9kaXNwbGF5TGlzdFJlY29yZGVyLT5kcmF3TmF0aXZlSW1hZ2UoaW1hZ2UsIGltYWdl
U2l6ZSwgZGVzdFJlY3QsIHNyY1JlY3QsIG9wLCBibGVuZE1vZGUsIG9yaWVudGF0aW9uKTsKLSAg
ICAgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICAgICAgbV9pbXBsLT5kcmF3TmF0aXZlSW1hZ2Uo
aW1hZ2UsIGltYWdlU2l6ZSwgZGVzdFJlY3QsIHNyY1JlY3QsIGNvbXBvc2l0ZU9wZXJhdG9yLCBi
bGVuZE1vZGUsIG9yaWVudGF0aW9uKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGF1
dG8gYml0bWFwU2l6ZSA9IGltYWdlLT5HZXRTaXplKCk7Ci0KLSAgICBmbG9hdCBjdXJySGVpZ2h0
ID0gb3JpZW50YXRpb24udXNlc1dpZHRoQXNIZWlnaHQoKSA/IGJpdG1hcFNpemUud2lkdGggOiBi
aXRtYXBTaXplLmhlaWdodDsKLSAgICBpZiAoY3VyckhlaWdodCA8PSBzcmNSZWN0LnkoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0K
LSAgICBEMkQxX01BVFJJWF8zWDJfRiBjdG07Ci0gICAgY29udGV4dC0+R2V0VHJhbnNmb3JtKCZj
dG0pOwotCi0gICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybShjdG0pOwotCi0gICAgRDJEQ29u
dGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqbV9kYXRhKTsKLQotICAgIGJvb2wgc2hvdWxkVXNl
U3ViaW1hZ2UgPSBmYWxzZTsKLQotICAgIC8vIElmIHRoZSBzb3VyY2UgcmVjdCBpcyBhIHN1YnBv
cnRpb24gb2YgdGhlIGltYWdlLCB0aGVuIHdlIGNvbXB1dGUgYW4gaW5mbGF0ZWQgZGVzdGluYXRp
b24gcmVjdCB0aGF0IHdpbGwgaG9sZCB0aGUgZW50aXJlIGltYWdlCi0gICAgLy8gYW5kIHRoZW4g
c2V0IGEgY2xpcCB0byB0aGUgcG9ydGlvbiB0aGF0IHdlIHdhbnQgdG8gZGlzcGxheS4KLSAgICBG
bG9hdFJlY3QgYWRqdXN0ZWREZXN0UmVjdCA9IGRlc3RSZWN0OwotCi0gICAgaWYgKHNyY1JlY3Qu
c2l6ZSgpICE9IGltYWdlU2l6ZSkgewotICAgICAgICAvLyBGSVhNRTogSW1wbGVtZW50IGltYWdl
IHNjYWxpbmcKLSAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0
aGUgaW1hZ2UgaXMgb25seSBwYXJ0aWFsbHkgbG9hZGVkLCB0aGVuIHNocmluayB0aGUgZGVzdGlu
YXRpb24gcmVjdCB0aGF0IHdlJ3JlIGRyYXdpbmcgaW50byBhY2NvcmRpbmdseS4KLSAgICBpZiAo
IXNob3VsZFVzZVN1YmltYWdlICYmIGN1cnJIZWlnaHQgPCBpbWFnZVNpemUuaGVpZ2h0KCkpCi0g
ICAgICAgIGFkanVzdGVkRGVzdFJlY3Quc2V0SGVpZ2h0KGFkanVzdGVkRGVzdFJlY3QuaGVpZ2h0
KCkgKiBjdXJySGVpZ2h0IC8gaW1hZ2VTaXplLmhlaWdodCgpKTsKLQotICAgIHNldFBsYXRmb3Jt
Q29tcG9zaXRlT3BlcmF0aW9uKG9wLCBibGVuZE1vZGUpOwotCi0gICAgLy8gSW1hZ2VPcmllbnRh
dGlvbiBleHBlY3RzIHRoZSBvcmlnaW4gdG8gYmUgYXQgKDAsIDApLgotICAgIHRyYW5zZm9ybS50
cmFuc2xhdGUoYWRqdXN0ZWREZXN0UmVjdC54KCksIGFkanVzdGVkRGVzdFJlY3QueSgpKTsKLSAg
ICBjb250ZXh0LT5TZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLSAgICBhZGp1c3RlZERlc3RSZWN0
LnNldExvY2F0aW9uKEZsb2F0UG9pbnQoKSk7Ci0KLSAgICBpZiAob3JpZW50YXRpb24gIT0gRGVm
YXVsdEltYWdlT3JpZW50YXRpb24pIHsKLSAgICAgICAgdGhpcy0+Y29uY2F0Q1RNKG9yaWVudGF0
aW9uLnRyYW5zZm9ybUZyb21EZWZhdWx0KGFkanVzdGVkRGVzdFJlY3Quc2l6ZSgpKSk7Ci0gICAg
ICAgIGlmIChvcmllbnRhdGlvbi51c2VzV2lkdGhBc0hlaWdodCgpKSB7Ci0gICAgICAgICAgICAv
LyBUaGUgZGVzdGluYXRpb24gcmVjdCB3aWxsIGhhdmUgaXQncyB3aWR0aCBhbmQgaGVpZ2h0IGFs
cmVhZHkgcmV2ZXJzZWQgZm9yIHRoZSBvcmllbnRhdGlvbiBvZgotICAgICAgICAgICAgLy8gdGhl
IGltYWdlLCBhcyBpdCB3YXMgbmVlZGVkIGZvciBwYWdlIGxheW91dCwgc28gd2UgbmVlZCB0byBy
ZXZlcnNlIGl0IGJhY2sgaGVyZS4KLSAgICAgICAgICAgIGFkanVzdGVkRGVzdFJlY3QgPSBGbG9h
dFJlY3QoYWRqdXN0ZWREZXN0UmVjdC54KCksIGFkanVzdGVkRGVzdFJlY3QueSgpLCBhZGp1c3Rl
ZERlc3RSZWN0LmhlaWdodCgpLCBhZGp1c3RlZERlc3RSZWN0LndpZHRoKCkpOwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAgICBkcmF3
V2l0aG91dFNoYWRvdyhhZGp1c3RlZERlc3RSZWN0LCBbdGhpcywgaW1hZ2UsIGFkanVzdGVkRGVz
dFJlY3QsIHNyY1JlY3RdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAg
ICAgcmVuZGVyVGFyZ2V0LT5EcmF3Qml0bWFwKGltYWdlLmdldCgpLCBhZGp1c3RlZERlc3RSZWN0
LCAxLjBmLCBEMkQxX0JJVE1BUF9JTlRFUlBPTEFUSU9OX01PREVfTElORUFSLCBzdGF0aWNfY2Fz
dDxEMkQxX1JFQ1RfRj4oc3JjUmVjdCkpOwotICAgIH0pOwotCi0gICAgZmx1c2goKTsKLQotICAg
IGlmICghc3RhdGVTYXZlci5kaWRTYXZlKCkpCi0gICAgICAgIGNvbnRleHQtPlNldFRyYW5zZm9y
bShjdG0pOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgYXV0byYgc3Rh
dGUgPSB0aGlzLT5zdGF0ZSgpOworICAgIERpcmVjdDJEOjpkcmF3TmF0aXZlSW1hZ2UoKnBsYXRm
b3JtQ29udGV4dCgpLCBpbWFnZS5nZXQoKSwgaW1hZ2VTaXplLCBkZXN0UmVjdCwgc3JjUmVjdCwg
Y29tcG9zaXRlT3BlcmF0b3IsIGJsZW5kTW9kZSwgb3JpZW50YXRpb24sIHN0YXRlLmltYWdlSW50
ZXJwb2xhdGlvblF1YWxpdHksIHN0YXRlLmFscGhhLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoc3Rh
dGUpKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dChI
REMgaGRjLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQog
ewogICAgIGJvb2wgY3JlYXRlZEJpdG1hcCA9IG1faW1wbCB8fCAhbV9kYXRhLT5tX2hkYyB8fCBp
c0luVHJhbnNwYXJlbmN5TGF5ZXIoKTsKICAgICBpZiAoIWNyZWF0ZWRCaXRtYXApIHsKLSAgICAg
ICAgbV9kYXRhLT5yZXN0b3JlKCk7CisgICAgICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQo
KSk7CisgICAgICAgIERpcmVjdDJEOjpyZXN0b3JlKCpwbGF0Zm9ybUNvbnRleHQoKSk7CiAgICAg
ICAgIHJldHVybjsKICAgICB9CiAKQEAgLTMwNSwxMyArMjQ4LDEzIEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnQKICAgICBhdXRvIGJpdG1hcFByb3BlcnRpZXMgPSBE
MkQxOjpCaXRtYXBQcm9wZXJ0aWVzKEQyRDE6OlBpeGVsRm9ybWF0KERYR0lfRk9STUFUX0I4RzhS
OEE4X1VOT1JNLCBEMkQxX0FMUEhBX01PREVfUFJFTVVMVElQTElFRCkpOwogCiAgICAgQ09NUHRy
PElEMkQxQml0bWFwPiBiaXRtYXA7Ci0gICAgSFJFU1VMVCBociA9IHBsYXRmb3JtQ29udGV4dCgp
LT5DcmVhdGVCaXRtYXAocGl4ZWxEYXRhLnNpemUoKSwgcGl4ZWxEYXRhLmJ1ZmZlcigpLCBwaXhl
bERhdGEuYnl0ZXNQZXJSb3coKSwgJmJpdG1hcFByb3BlcnRpZXMsICZiaXRtYXApOworICAgIEhS
RVNVTFQgaHIgPSBwbGF0Zm9ybUNvbnRleHQoKS0+cmVuZGVyVGFyZ2V0KCktPkNyZWF0ZUJpdG1h
cChwaXhlbERhdGEuc2l6ZSgpLCBwaXhlbERhdGEuYnVmZmVyKCksIHBpeGVsRGF0YS5ieXRlc1Bl
clJvdygpLCAmYml0bWFwUHJvcGVydGllcywgJmJpdG1hcCk7CiAgICAgQVNTRVJUKFNVQ0NFRURF
RChocikpOwogCiAgICAgRDJEQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqbV9kYXRhKTsK
IAogICAgIC8vIE5vdGU6IFRoZSBjb250ZW50IGluIHRoZSBIREMgaXMgaW52ZXJ0ZWQgY29tcGFy
ZWQgdG8gRGlyZWN0MkQsIHNvIGl0IG5lZWRzIHRvIGJlIGZsaXBwZWQuCi0gICAgYXV0byBjb250
ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250
ZXh0KCktPnJlbmRlclRhcmdldCgpOwogCiAgICAgRDJEMV9NQVRSSVhfM1gyX0YgY3VycmVudFRy
YW5zZm9ybTsKICAgICBjb250ZXh0LT5HZXRUcmFuc2Zvcm0oJmN1cnJlbnRUcmFuc2Zvcm0pOwpA
QCAtMzQzLDExOSArMjg2LDc2IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3RG90c0ZvckRv
Y3VtZW4KIHsKIH0KIAotR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGUoSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCwgR3Jh
cGhpY3NDb250ZXh0OjpCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZSByZW5kZXJpbmdUeXBlKQot
ICAgIDogbV9yZW5kZXJUYXJnZXQocmVuZGVyVGFyZ2V0KQorR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgR3JhcGhpY3NDb250ZXh0OjpCaXRtYXBSZW5kZXJp
bmdDb250ZXh0VHlwZSByZW5kZXJpbmdUeXBlKQorICAgIDogbV9wbGF0Zm9ybUNvbnRleHQocGxh
dGZvcm1Db250ZXh0KQogICAgICwgbV9yZW5kZXJlclR5cGUocmVuZGVyaW5nVHlwZSkKIHsKLSAg
ICBpZiAoIW1fcmVuZGVyVGFyZ2V0KQorICAgIGlmICghbV9wbGF0Zm9ybUNvbnRleHQucmVuZGVy
VGFyZ2V0KCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIGlmIChtX3JlbmRlcmVyVHlwZSA9PSBH
cmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1vcnkpCiAg
ICAgICAgIGJlZ2luRHJhdygpOwogfQogCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6
On5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQorR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoc3RkOjp1bmlxdWVfcHRy
PFBsYXRmb3JtQ29udGV4dERpcmVjdDJEPiYmIG93bmVkUGxhdGZvcm1Db250ZXh0LCBHcmFwaGlj
c0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlIHJlbmRlcmluZ1R5cGUpCisgICAg
OiBtX293bmVkUGxhdGZvcm1Db250ZXh0KFdURk1vdmUob3duZWRQbGF0Zm9ybUNvbnRleHQpKQor
ICAgICwgbV9wbGF0Zm9ybUNvbnRleHQoKm93bmVkUGxhdGZvcm1Db250ZXh0KQorICAgICwgbV9y
ZW5kZXJlclR5cGUocmVuZGVyaW5nVHlwZSkKIHsKLSAgICBpZiAoIW1fcmVuZGVyVGFyZ2V0KQor
ICAgIGlmICghbV9wbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpCiAgICAgICAgIHJldHVy
bjsKIAotICAgIGlmIChiZWdpbkRyYXdDb3VudCkKLSAgICAgICAgZW5kRHJhdygpOworICAgIGlm
IChtX3JlbmRlcmVyVHlwZSA9PSBHcmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRl
eHRUeXBlOjpHUFVNZW1vcnkpCisgICAgICAgIGJlZ2luRHJhdygpOwogfQogCi1DT01QdHI8SUQy
RDFTb2xpZENvbG9yQnJ1c2g+IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6YnJ1c2hX
aXRoQ29sb3IoY29uc3QgRDJEMV9DT0xPUl9GJiBjb2xvcikKK0dyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZTo6fkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCiB7Ci0gICAgUkdC
QTMyIGNvbG9yS2V5ID0gbWFrZVJHQkEzMkZyb21GbG9hdHMoY29sb3IuciwgY29sb3IuZywgY29s
b3IuYiwgY29sb3IuYSk7Ci0KLSAgICBpZiAoIWNvbG9yS2V5KSB7Ci0gICAgICAgIGlmICghbV96
ZXJvQnJ1c2gpCi0gICAgICAgICAgICBtX3JlbmRlclRhcmdldC0+Q3JlYXRlU29saWRDb2xvckJy
dXNoKGNvbG9yLCAmbV96ZXJvQnJ1c2gpOwotICAgICAgICByZXR1cm4gbV96ZXJvQnJ1c2g7Ci0g
ICAgfQotCi0gICAgaWYgKGNvbG9yS2V5ID09IDB4RkZGRkZGRkYpIHsKLSAgICAgICAgaWYgKCFt
X3doaXRlQnJ1c2gpCi0gICAgICAgICAgICBtX3JlbmRlclRhcmdldC0+Q3JlYXRlU29saWRDb2xv
ckJydXNoKGNvbG9yLCAmbV93aGl0ZUJydXNoKTsKLSAgICAgICAgcmV0dXJuIG1fd2hpdGVCcnVz
aDsKLSAgICB9Ci0KLSAgICBhdXRvIGV4aXN0aW5nQnJ1c2ggPSBtX3NvbGlkQ29sb3JlZEJydXNo
Q2FjaGUuZW5zdXJlKGNvbG9yS2V5LCBbdGhpcywgY29sb3JdIHsKLSAgICAgICAgQ09NUHRyPElE
MkQxU29saWRDb2xvckJydXNoPiBjb2xvckJydXNoOwotICAgICAgICBtX3JlbmRlclRhcmdldC0+
Q3JlYXRlU29saWRDb2xvckJydXNoKGNvbG9yLCAmY29sb3JCcnVzaCk7Ci0gICAgICAgIHJldHVy
biBjb2xvckJydXNoOwotICAgIH0pOworICAgIGlmICghbV9wbGF0Zm9ybUNvbnRleHQucmVuZGVy
VGFyZ2V0KCkpCisgICAgICAgIHJldHVybjsKIAotICAgIHJldHVybiBleGlzdGluZ0JydXNoLml0
ZXJhdG9yLT52YWx1ZTsKKyAgICBpZiAoYmVnaW5EcmF3Q291bnQpCisgICAgICAgIGVuZERyYXco
KTsKIH0KIAogSUQyRDFTb2xpZENvbG9yQnJ1c2gqIEdyYXBoaWNzQ29udGV4dDo6YnJ1c2hXaXRo
Q29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKQogewotICAgIHJldHVybiBtX2RhdGEtPmJydXNoV2l0
aENvbG9yKGNvbG9yV2l0aEdsb2JhbEFscGhhKGNvbG9yKSkuZ2V0KCk7CisgICAgQVNTRVJUKGhh
c1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICByZXR1cm4gcGxhdGZvcm1Db250ZXh0KCktPmJydXNo
V2l0aENvbG9yKGNvbG9yV2l0aEdsb2JhbEFscGhhKGNvbG9yKSkuZ2V0KCk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjbGlwKGNvbnN0IEZsb2F0UmVjdCYgcmVj
dCkKIHsKLSAgICBpZiAobV9yZW5kZXJTdGF0ZXMuaXNFbXB0eSgpKQotICAgICAgICBzYXZlKCk7
Ci0KLSAgICBtX3JlbmRlclRhcmdldC0+UHVzaEF4aXNBbGlnbmVkQ2xpcChyZWN0LCBEMkQxX0FO
VElBTElBU19NT0RFX1BFUl9QUklNSVRJVkUpOwotICAgIG1fcmVuZGVyU3RhdGVzLmxhc3QoKS5t
X2NsaXBzLmFwcGVuZChHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkF4aXNBbGlnbmVk
Q2xpcCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjbGlwKGNv
bnN0IFBhdGgmIHBhdGgpCiB7Ci0gICAgY2xpcChwYXRoLnBsYXRmb3JtUGF0aCgpKTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNsaXAoSUQyRDFHZW9tZXRyeSog
cGF0aCkKIHsKLSAgICBBU1NFUlQobV9yZW5kZXJTdGF0ZXMuc2l6ZSgpKTsKLSAgICBpZiAoIW1f
cmVuZGVyU3RhdGVzLnNpemUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ09NUHRyPElEMkQx
TGF5ZXI+IGNsaXBMYXllcjsKLSAgICBIUkVTVUxUIGhyID0gbV9yZW5kZXJUYXJnZXQtPkNyZWF0
ZUxheWVyKCZjbGlwTGF5ZXIpOwotICAgIEFTU0VSVChTVUNDRUVERUQoaHIpKTsKLSAgICBpZiAo
IVNVQ0NFRURFRChocikpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcmVuZGVyVGFyZ2V0LT5Q
dXNoTGF5ZXIoRDJEMTo6TGF5ZXJQYXJhbWV0ZXJzKEQyRDE6OkluZmluaXRlUmVjdCgpLCBwYXRo
KSwgY2xpcExheWVyLmdldCgpKTsKLSAgICBtX3JlbmRlclN0YXRlcy5sYXN0KCkubV9jbGlwcy5h
cHBlbmQoR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpMYXllckNsaXApOwotICAgIG1f
cmVuZGVyU3RhdGVzLmxhc3QoKS5tX2FjdGl2ZUxheWVyID0gY2xpcExheWVyOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRy
YW5zZm9ybSYgYWZmaW5lVHJhbnNmb3JtKQogewotICAgIEFTU0VSVChtX3JlbmRlclRhcmdldC5n
ZXQoKSk7Ci0KLSAgICBEMkQxX01BVFJJWF8zWDJfRiBjdXJyZW50VHJhbnNmb3JtOwotICAgIG1f
cmVuZGVyVGFyZ2V0LT5HZXRUcmFuc2Zvcm0oJmN1cnJlbnRUcmFuc2Zvcm0pOwotCi0gICAgRDJE
MV9NQVRSSVhfM1gyX0YgdHJhbnNmb3JtVG9Db25jYXQgPSBhZmZpbmVUcmFuc2Zvcm07Ci0gICAg
bV9yZW5kZXJUYXJnZXQtPlNldFRyYW5zZm9ybSh0cmFuc2Zvcm1Ub0NvbmNhdCAqIGN1cnJlbnRU
cmFuc2Zvcm0pOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Zmx1
c2goKQogewotICAgIEFTU0VSVChtX3JlbmRlclRhcmdldC5nZXQoKSk7Ci0gICAgRDJEMV9UQUcg
Zmlyc3QsIHNlY29uZDsKLSAgICBIUkVTVUxUIGhyID0gbV9yZW5kZXJUYXJnZXQtPkZsdXNoKCZm
aXJzdCwgJnNlY29uZCk7Ci0KLSAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmJlZ2luRHJhdygpCiB7Ci0g
ICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgpKTsKLSAgICBtX3JlbmRlclRhcmdldC0+QmVn
aW5EcmF3KCk7CisgICAgQVNTRVJUKG1fcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpKTsK
KyAgICBtX3BsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+QmVnaW5EcmF3KCk7CiAgICAg
KytiZWdpbkRyYXdDb3VudDsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGU6OmVuZERyYXcoKQogewotICAgIEFTU0VSVChtX3JlbmRlclRhcmdldC5nZXQoKSk7CisgICAg
QVNTRVJUKG1fcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpKTsKICAgICBEMkQxX1RBRyBm
aXJzdCwgc2Vjb25kOwotICAgIEhSRVNVTFQgaHIgPSBtX3JlbmRlclRhcmdldC0+RW5kRHJhdygm
Zmlyc3QsICZzZWNvbmQpOworICAgIEhSRVNVTFQgaHIgPSBtX3BsYXRmb3JtQ29udGV4dC5yZW5k
ZXJUYXJnZXQoKS0+RW5kRHJhdygmZmlyc3QsICZzZWNvbmQpOwogCiAgICAgaWYgKCFTVUNDRUVE
RUQoaHIpKQogICAgICAgICBXVEZMb2dBbHdheXMoIkZhaWxlZCBpbiBHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGU6OmVuZERyYXc6IGhyPSV4ZCwgZmlyc3Q9JWxkLCBzZWNvbmQ9JWxkIiwg
aHIsIGZpcnN0LCBzZWNvbmQpOwpAQCAtNDY1LDY4ICszNjUsMjggQEAgdm9pZCBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGU6OmVuZAogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZTo6cmVzdG9yZSgpCiB7Ci0gICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgpKTsK
LQotICAgIGF1dG8gcmVzdG9yZVN0YXRlID0gbV9yZW5kZXJTdGF0ZXMudGFrZUxhc3QoKTsKLSAg
ICBtX3JlbmRlclRhcmdldC0+UmVzdG9yZURyYXdpbmdTdGF0ZShyZXN0b3JlU3RhdGUubV9kcmF3
aW5nU3RhdGVCbG9jay5nZXQoKSk7Ci0KLSAgICBmb3IgKGF1dG8gY2xpcFR5cGUgPSByZXN0b3Jl
U3RhdGUubV9jbGlwcy5yYmVnaW4oKTsgY2xpcFR5cGUgIT0gcmVzdG9yZVN0YXRlLm1fY2xpcHMu
cmVuZCgpOyArK2NsaXBUeXBlKSB7Ci0gICAgICAgIGlmICgqY2xpcFR5cGUgPT0gR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjpBeGlzQWxpZ25lZENsaXApCi0gICAgICAgICAgICBtX3Jl
bmRlclRhcmdldC0+UG9wQXhpc0FsaWduZWRDbGlwKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAg
ICAgIG1fcmVuZGVyVGFyZ2V0LT5Qb3BMYXllcigpOwotICAgIH0KIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNhdmUoKQogewotICAgIEFTU0VSVChtX3JlbmRlclRh
cmdldC5nZXQoKSk7Ci0KLSAgICBSZW5kZXJTdGF0ZSBjdXJyZW50U3RhdGU7Ci0gICAgR3JhcGhp
Y3NDb250ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0ZURyYXdpbmdTdGF0ZUJsb2NrKCZjdXJy
ZW50U3RhdGUubV9kcmF3aW5nU3RhdGVCbG9jayk7Ci0KLSAgICBtX3JlbmRlclRhcmdldC0+U2F2
ZURyYXdpbmdTdGF0ZShjdXJyZW50U3RhdGUubV9kcmF3aW5nU3RhdGVCbG9jay5nZXQoKSk7Ci0K
LSAgICBtX3JlbmRlclN0YXRlcy5hcHBlbmQoY3VycmVudFN0YXRlKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkK
IHsKLSAgICBBU1NFUlQobV9yZW5kZXJUYXJnZXQuZ2V0KCkpOwotCi0gICAgRDJEMV9NQVRSSVhf
M1gyX0YgY3VycmVudFRyYW5zZm9ybTsKLSAgICBtX3JlbmRlclRhcmdldC0+R2V0VHJhbnNmb3Jt
KCZjdXJyZW50VHJhbnNmb3JtKTsKLQotICAgIGF1dG8gc2NhbGUgPSBEMkQxOjpNYXRyaXgzeDJG
OjpTY2FsZShzaXplKTsKLSAgICBtX3JlbmRlclRhcmdldC0+U2V0VHJhbnNmb3JtKHNjYWxlICog
Y3VycmVudFRyYW5zZm9ybSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlOjpzZXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCiB7Ci0gICAgQVNT
RVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgpKTsKLSAgICBtX3JlbmRlclRhcmdldC0+U2V0VHJhbnNm
b3JtKHRyYW5zZm9ybSk7CisgICAgQVNTRVJUKG1fcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdl
dCgpKTsKKyAgICBtX3BsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+U2V0VHJhbnNmb3Jt
KHRyYW5zZm9ybSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjp0
cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkKIHsKLSAgICBBU1NFUlQobV9yZW5kZXJUYXJnZXQu
Z2V0KCkpOwotCi0gICAgRDJEMV9NQVRSSVhfM1gyX0YgY3VycmVudFRyYW5zZm9ybTsKLSAgICBt
X3JlbmRlclRhcmdldC0+R2V0VHJhbnNmb3JtKCZjdXJyZW50VHJhbnNmb3JtKTsKLQotICAgIGF1
dG8gdHJhbnNsYXRpb24gPSBEMkQxOjpNYXRyaXgzeDJGOjpUcmFuc2xhdGlvbih4LCB5KTsKLSAg
ICBtX3JlbmRlclRhcmdldC0+U2V0VHJhbnNmb3JtKHRyYW5zbGF0aW9uICogY3VycmVudFRyYW5z
Zm9ybSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpyb3RhdGUo
ZmxvYXQgYW5nbGUpCiB7Ci0gICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgpKTsKLQotICAg
IEQyRDFfTUFUUklYXzNYMl9GIGN1cnJlbnRUcmFuc2Zvcm07Ci0gICAgbV9yZW5kZXJUYXJnZXQt
PkdldFRyYW5zZm9ybSgmY3VycmVudFRyYW5zZm9ybSk7Ci0KLSAgICBhdXRvIHJvdGF0aW9uID0g
RDJEMTo6TWF0cml4M3gyRjo6Um90YXRpb24ocmFkMmRlZyhhbmdsZSkpOwotICAgIG1fcmVuZGVy
VGFyZ2V0LT5TZXRUcmFuc2Zvcm0ocm90YXRpb24gKiBjdXJyZW50VHJhbnNmb3JtKTsKIH0KIAog
RDJEMV9DT0xPUl9GIEdyYXBoaWNzQ29udGV4dDo6Y29sb3JXaXRoR2xvYmFsQWxwaGEoY29uc3Qg
Q29sb3ImIGNvbG9yKSBjb25zdApAQCAtNTM5LDIyICszOTksMjIgQEAgRDJEMV9DT0xPUl9GIEdy
YXBoaWNzQ29udGV4dDo6Y29sb3JXaXRoRwogCiBJRDJEMUJydXNoKiBHcmFwaGljc0NvbnRleHQ6
OnNvbGlkU3Ryb2tlQnJ1c2goKSBjb25zdAogewotICAgIHJldHVybiBtX2RhdGEtPm1fc29saWRT
dHJva2VCcnVzaC5nZXQoKTsKKyAgICByZXR1cm4gcGxhdGZvcm1Db250ZXh0KCktPm1fc29saWRT
dHJva2VCcnVzaC5nZXQoKTsKIH0KIAogSUQyRDFCcnVzaCogR3JhcGhpY3NDb250ZXh0Ojpzb2xp
ZEZpbGxCcnVzaCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fZGF0YS0+bV9zb2xpZEZpbGxCcnVz
aC5nZXQoKTsKKyAgICByZXR1cm4gcGxhdGZvcm1Db250ZXh0KCktPm1fc29saWRGaWxsQnJ1c2gu
Z2V0KCk7CiB9CiAKIElEMkQxQnJ1c2gqIEdyYXBoaWNzQ29udGV4dDo6cGF0dGVyblN0cm9rZUJy
dXNoKCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV9kYXRhLT5tX3BhdHRlcm5TdHJva2VCcnVzaC5n
ZXQoKTsKKyAgICByZXR1cm4gcGxhdGZvcm1Db250ZXh0KCktPm1fcGF0dGVyblN0cm9rZUJydXNo
LmdldCgpOwogfQogCiBJRDJEMUJydXNoKiBHcmFwaGljc0NvbnRleHQ6OnBhdHRlcm5GaWxsQnJ1
c2goKSBjb25zdAogewotICAgIHJldHVybiBtX2RhdGEtPm1fcGF0dGVybkZpbGxCcnVzaC5nZXQo
KTsKKyAgICByZXR1cm4gcGxhdGZvcm1Db250ZXh0KCktPm1fcGF0dGVybkZpbGxCcnVzaC5nZXQo
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmJlZ2luRHJhdygpCkBAIC01NjksNzUgKzQy
OSwyMyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZW5kRHJhdygpCiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0OjpmbHVzaCgpCiB7Ci0gICAgbV9kYXRhLT5mbHVzaCgpOworICAgIEFTU0VSVChoYXNQ
bGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OmZsdXNoKCpwbGF0Zm9ybUNvbnRleHQo
KSk7CiB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3UGF0dGVybihJbWFnZSYgaW1hZ2Us
IGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3QsIGNv
bnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5zZm9ybSwgY29uc3QgRmxvYXRQb2ludCYg
cGhhc2UsIGNvbnN0IEZsb2F0U2l6ZSYgc3BhY2luZywgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIEJs
ZW5kTW9kZSBibGVuZE1vZGUpCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1BhdHRlcm4oSW1h
Z2UmIGltYWdlLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHRp
bGVSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zvcm0sIGNvbnN0IEZs
b2F0UG9pbnQmIHBoYXNlLCBjb25zdCBGbG9hdFNpemUmIHNwYWNpbmcsIENvbXBvc2l0ZU9wZXJh
dG9yIGNvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUgYmxlbmRNb2RlKQogewogICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkgfHwgIXBhdHRlcm5UcmFuc2Zvcm0uaXNJbnZlcnRpYmxlKCkpCiAg
ICAgICAgIHJldHVybjsKIAogICAgIGlmIChtX2ltcGwpIHsKLSAgICAgICAgbV9pbXBsLT5kcmF3
UGF0dGVybihpbWFnZSwgZGVzdFJlY3QsIHRpbGVSZWN0LCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFz
ZSwgc3BhY2luZywgb3AsIGJsZW5kTW9kZSk7CisgICAgICAgIG1faW1wbC0+ZHJhd1BhdHRlcm4o
aW1hZ2UsIGRlc3RSZWN0LCB0aWxlUmVjdCwgcGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIHNwYWNp
bmcsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUpOwogICAgICAgICByZXR1cm47CiAgICAg
fQogCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0gICAgRDJEQ29udGV4
dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqbV9kYXRhKTsKLQotICAgIG1fZGF0YS0+Y2xpcChkZXN0
UmVjdCk7Ci0KLSAgICBzZXRQbGF0Zm9ybUNvbXBvc2l0ZU9wZXJhdGlvbihvcCwgYmxlbmRNb2Rl
KTsKLQotICAgIGF1dG8gYml0bWFwQnJ1c2hQcm9wZXJ0aWVzID0gRDJEMTo6Qml0bWFwQnJ1c2hQ
cm9wZXJ0aWVzKCk7Ci0gICAgYml0bWFwQnJ1c2hQcm9wZXJ0aWVzLmV4dGVuZE1vZGVYID0gRDJE
MV9FWFRFTkRfTU9ERV9XUkFQOwotICAgIGJpdG1hcEJydXNoUHJvcGVydGllcy5leHRlbmRNb2Rl
WSA9IEQyRDFfRVhURU5EX01PREVfV1JBUDsKLQotICAgIC8vIENyZWF0ZSBhIGJydXNoIHRyYW5z
Zm9ybWF0aW9uIHNvIHdlIHBhaW50IHVzaW5nIHRoZSBzZWN0aW9uIG9mIHRoZSBpbWFnZSB3ZSBj
YXJlIGFib3V0LgotICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm1hdGlvbiA9IHBhdHRlcm5U
cmFuc2Zvcm07Ci0gICAgdHJhbnNmb3JtYXRpb24udHJhbnNsYXRlKGRlc3RSZWN0LmxvY2F0aW9u
KCkpOwotCi0gICAgYXV0byBicnVzaFByb3BlcnRpZXMgPSBEMkQxOjpCcnVzaFByb3BlcnRpZXMo
KTsKLSAgICBicnVzaFByb3BlcnRpZXMudHJhbnNmb3JtID0gdHJhbnNmb3JtYXRpb247Ci0gICAg
YnJ1c2hQcm9wZXJ0aWVzLm9wYWNpdHkgPSAxLjBmOwotCi0gICAgYXV0byB0aWxlSW1hZ2UgPSBp
bWFnZS5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOwotCi0gICAgLy8gSWYgd2Ugb25seSB3
YW50IGEgc3Vic2V0IG9mIHRoZSBiaXRtYXAsIHdlIG5lZWQgdG8gY3JlYXRlIGEgY3JvcHBlZCBi
aXRtYXAgaW1hZ2UuIEFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbiwKLSAgICAvLyB0aGlz
IGRvZXMgbm90IGFsbG9jYXRlIG5ldyBiaXRtYXAgbWVtb3J5LgotICAgIGlmIChpbWFnZS53aWR0
aCgpID4gZGVzdFJlY3Qud2lkdGgoKSB8fCBpbWFnZS5oZWlnaHQoKSA+IGRlc3RSZWN0LmhlaWdo
dCgpKSB7Ci0gICAgICAgIEFTU0VSVCgwKTsKLSAgICAgICAgLyoKLSAgICAgICAgZmxvYXQgZHBp
WCA9IDA7Ci0gICAgICAgIGZsb2F0IGRwaVkgPSAwOwotICAgICAgICB0aWxlSW1hZ2UtPkdldERw
aSgmZHBpWCwgJmRwaVkpOwotICAgICAgICBhdXRvIGJpdG1hcFByb3BlcnRpZXMgPSBEMkQxOjpC
aXRtYXBQcm9wZXJ0aWVzKHRpbGVJbWFnZS0+R2V0UGl4ZWxGb3JtYXQoKSwgZHBpWCwgZHBpWSk7
Ci0gICAgICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gc3ViSW1hZ2U7Ci0gICAgICAgIEhSRVNVTFQg
aHIgPSBjb250ZXh0LT5DcmVhdGVCaXRtYXAoSW50U2l6ZSh0aWxlUmVjdC5zaXplKCkpLCBiaXRt
YXBQcm9wZXJ0aWVzLCAmc3ViSW1hZ2UpOwotICAgICAgICBpZiAoU1VDQ0VFREVEKGhyKSkgewot
ICAgICAgICAgICAgRDJEMV9SRUNUX1UgZmluaXNoUmVjdCA9IEludFJlY3QodGlsZVJlY3QpOwot
ICAgICAgICAgICAgaHIgPSBzdWJJbWFnZS0+Q29weUZyb21CaXRtYXAobnVsbHB0ciwgdGlsZUlt
YWdlLmdldCgpLCAmZmluaXNoUmVjdCk7Ci0gICAgICAgICAgICBpZiAoU1VDQ0VFREVEKGhyKSkK
LSAgICAgICAgICAgICAgICB0aWxlSW1hZ2UgPSBzdWJJbWFnZTsKLSAgICAgICAgfQotICAgICAg
ICAqLwotICAgIH0KLQotICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gYml0bWFwOwotICAgIEhSRVNV
TFQgaHIgPSBjb250ZXh0LT5DcmVhdGVCaXRtYXBGcm9tV2ljQml0bWFwKHRpbGVJbWFnZS5nZXQo
KSwgbnVsbHB0ciwgJmJpdG1hcCk7Ci0gICAgaWYgKCFTVUNDRUVERUQoaHIpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBDT01QdHI8SUQyRDFCaXRtYXBCcnVzaD4gcGF0dGVybkJydXNoOwotICAg
IGhyID0gY29udGV4dC0+Q3JlYXRlQml0bWFwQnJ1c2goYml0bWFwLmdldCgpLCAmYml0bWFwQnJ1
c2hQcm9wZXJ0aWVzLCAmYnJ1c2hQcm9wZXJ0aWVzLCAmcGF0dGVybkJydXNoKTsKLSAgICBBU1NF
UlQoU1VDQ0VFREVEKGhyKSk7Ci0gICAgaWYgKCFTVUNDRUVERUQoaHIpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBkcmF3V2l0aG91dFNoYWRvdyhkZXN0UmVjdCwgW3RoaXMsIGRlc3RSZWN0LCBw
YXR0ZXJuQnJ1c2hdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAg
Y29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9IGRlc3RSZWN0OwotICAgICAgICByZW5kZXJUYXJn
ZXQtPkZpbGxSZWN0YW5nbGUoJmQyZFJlY3QsIHBhdHRlcm5CcnVzaC5nZXQoKSk7Ci0gICAgfSk7
CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBpZiAoYXV0byB0aWxlSW1h
Z2UgPSBpbWFnZS5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpKQorICAgICAgICBEaXJlY3Qy
RDo6ZHJhd1BhdHRlcm4oKnBsYXRmb3JtQ29udGV4dCgpLCB0aWxlSW1hZ2UuZ2V0KCksIEludFNp
emUoaW1hZ2Uuc2l6ZSgpKSwgZGVzdFJlY3QsIHRpbGVSZWN0LCBwYXR0ZXJuVHJhbnNmb3JtLCBw
aGFzZSwgY29tcG9zaXRlT3BlcmF0b3IsIGJsZW5kTW9kZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0OjpjbGlwVG9JbWFnZUJ1ZmZlcihJbWFnZUJ1ZmZlciYgYnVmZmVyLCBjb25zdCBGbG9h
dFJlY3QmIGRlc3RSZWN0KQpAQCAtNjYwLDE3MiArNDY4LDYzIEBAIHZvaWQgR3JhcGhpY3NDb250
ZXh0OjpkcmF3UmVjdChjb25zdCBGbG8KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8v
IEZJWE1FOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBwYXR0ZXJucyBhbmQgZ3JhZGll
bnRzIGxpa2UgZHJhd1BhdGggZG9lcywgaXQgcHJvYmFibHkgc2hvdWxkLgogICAgIEFTU0VSVCgh
cmVjdC5pc0VtcHR5KCkpOwotCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7
Ci0KLSAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKLQotICAgIGRyYXdXaXRob3V0
U2hhZG93KHJlY3QsIFt0aGlzLCByZWN0XShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0
KSB7Ci0gICAgICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSByZWN0OwotICAgICAgICBy
ZW5kZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUoJmQyZFJlY3QsIHNvbGlkRmlsbEJydXNoKCkpOwot
ICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdSZWN0YW5nbGUoJmQyZFJlY3QsIHNvbGlkU3Ryb2tl
QnJ1c2goKSwgc3Ryb2tlVGhpY2tuZXNzKCksIG1fZGF0YS0+c3Ryb2tlU3R5bGUoKSk7Ci0gICAg
fSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0ZSA9
IHRoaXMtPnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmRyYXdSZWN0KCpwbGF0Zm9ybUNvbnRleHQo
KSwgcmVjdCwgYm9yZGVyVGhpY2tuZXNzLCBzdGF0ZS5maWxsQ29sb3IsIHN0YXRlLnN0cm9rZVN0
eWxlLCBzdGF0ZS5zdHJva2VDb2xvcik7CiB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjpzZXRMaW5lQ2FwKExpbmVDYXAgY2FwKQordm9pZCBHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGU6OnNldExpbmVDYXAoTGluZUNhcCkKIHsKLSAgICBpZiAobV9saW5lQ2Fw
ID09IGNhcCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRDJEMV9DQVBfU1RZTEUgY2FwU3R5bGUg
PSBEMkQxX0NBUF9TVFlMRV9GTEFUOwotICAgIHN3aXRjaCAoY2FwKSB7Ci0gICAgY2FzZSBSb3Vu
ZENhcDoKLSAgICAgICAgY2FwU3R5bGUgPSBEMkQxX0NBUF9TVFlMRV9ST1VORDsKLSAgICAgICAg
YnJlYWs7Ci0gICAgY2FzZSBTcXVhcmVDYXA6Ci0gICAgICAgIGNhcFN0eWxlID0gRDJEMV9DQVBf
U1RZTEVfU1FVQVJFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEJ1dHRDYXA6Ci0gICAgZGVm
YXVsdDoKLSAgICAgICAgY2FwU3R5bGUgPSBEMkQxX0NBUF9TVFlMRV9GTEFUOwotICAgICAgICBi
cmVhazsKLSAgICB9Ci0KLSAgICBtX2xpbmVDYXAgPSBjYXBTdHlsZTsKLSAgICBtX3N0cm9rZVN5
bGVJc0RpcnR5ID0gdHJ1ZTsKIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGU6OnNldExpbmVKb2luKExpbmVKb2luIGpvaW4pCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZTo6c2V0TGluZUpvaW4oTGluZUpvaW4pCiB7Ci0gICAgaWYgKG1fbGluZUpvaW4g
PT0gam9pbikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRDJEMV9MSU5FX0pPSU4gam9pblN0eWxl
ID0gRDJEMV9MSU5FX0pPSU5fTUlURVI7Ci0gICAgc3dpdGNoIChqb2luKSB7Ci0gICAgY2FzZSBS
b3VuZEpvaW46Ci0gICAgICAgIGpvaW5TdHlsZSA9IEQyRDFfTElORV9KT0lOX1JPVU5EOwotICAg
ICAgICBicmVhazsKLSAgICBjYXNlIEJldmVsSm9pbjoKLSAgICAgICAgam9pblN0eWxlID0gRDJE
MV9MSU5FX0pPSU5fQkVWRUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTWl0ZXJKb2luOgot
ICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpvaW5TdHlsZSA9IEQyRDFfTElORV9KT0lOX01JVEVSOwot
ICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBtX2xpbmVKb2luID0gam9pblN0eWxlOwotICAg
IG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOwogfQogCi12b2lkIEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZTo6c2V0U3Ryb2tlU3R5bGUoU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUpCit2
b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2V0U3Ryb2tlU3R5bGUoU3Ryb2tl
U3R5bGUpCiB7Ci0gICAgaWYgKG1fc3Ryb2tlU3R5bGUgPT0gc3Ryb2tlU3R5bGUpCi0gICAgICAg
IHJldHVybjsKLQotICAgIG1fc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZTsKLSAgICBtX3N0cm9r
ZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGU6OnNldE1pdGVyTGltaXQoZmxvYXQgY2FudmFzTWl0ZXJMaW1pdCkKIHsKLSAgICAvLyBE
aXJlY3QyRCBtaXRlciBsaW1pdCBpcyBpbiB0ZXJtcyBvZiBIQUxGIHRoZSBsaW5lIHRoaWNrbmVz
cy4KLSAgICBmbG9hdCBtaXRlckxpbWl0ID0gMC41ZiAqIGNhbnZhc01pdGVyTGltaXQ7Ci0gICAg
aWYgKFdURjo6YXJlRXNzZW50aWFsbHlFcXVhbChtaXRlckxpbWl0LCBtX21pdGVyTGltaXQpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBtX21pdGVyTGltaXQgPSBtaXRlckxpbWl0OwotICAgIG1f
c3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworICAgIG1fcGxhdGZvcm1Db250ZXh0LnNldERhc2hP
ZmZzZXQoY2FudmFzTWl0ZXJMaW1pdCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjpzZXREYXNoT2Zmc2V0KGZsb2F0IGRhc2hPZmZzZXQpCiB7Ci0gICAgaWYgKFdU
Rjo6YXJlRXNzZW50aWFsbHlFcXVhbChkYXNoT2Zmc2V0LCBtX2Rhc2hPZmZzZXQpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBtX2Rhc2hPZmZzZXQgPSBkYXNoT2Zmc2V0OwotICAgIG1fc3Ryb2tl
U3lsZUlzRGlydHkgPSB0cnVlOworICAgIG1fcGxhdGZvcm1Db250ZXh0LnNldERhc2hPZmZzZXQo
ZGFzaE9mZnNldCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpz
ZXRQYXR0ZXJuV2lkdGgoZmxvYXQgcGF0dGVybldpZHRoKQogewotICAgIGlmIChXVEY6OmFyZUVz
c2VudGlhbGx5RXF1YWwocGF0dGVybldpZHRoLCBtX3BhdHRlcm5XaWR0aCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIG1fcGF0dGVybldpZHRoID0gcGF0dGVybldpZHRoOwotICAgIG1fc3Ryb2tl
U3lsZUlzRGlydHkgPSB0cnVlOworICAgIG1fcGxhdGZvcm1Db250ZXh0LnNldFBhdHRlcm5XaWR0
aChwYXR0ZXJuV2lkdGgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZTo6c2V0UGF0dGVybk9mZnNldChmbG9hdCBwYXR0ZXJuT2Zmc2V0KQogewotICAgIGlmIChXVEY6
OmFyZUVzc2VudGlhbGx5RXF1YWwocGF0dGVybk9mZnNldCwgbV9wYXR0ZXJuT2Zmc2V0KSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgbV9wYXR0ZXJuT2Zmc2V0ID0gcGF0dGVybk9mZnNldDsKLSAg
ICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKKyAgICBtX3BsYXRmb3JtQ29udGV4dC5zZXRQ
YXR0ZXJuT2Zmc2V0KHBhdHRlcm5PZmZzZXQpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZTo6c2V0U3Ryb2tlVGhpY2tuZXNzKGZsb2F0IHRoaWNrbmVzcykKIHsKLSAg
ICBpZiAoV1RGOjphcmVFc3NlbnRpYWxseUVxdWFsKHRoaWNrbmVzcywgbV9zdHJva2VUaGlja25l
c3MpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3N0cm9rZVRoaWNrbmVzcyA9IHRoaWNrbmVz
czsKLSAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKKyAgICBtX3BsYXRmb3JtQ29udGV4
dC5zZXRTdHJva2VUaGlja25lc3ModGhpY2tuZXNzKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGU6OnNldERhc2hlcyhjb25zdCBEYXNoQXJyYXkmIGRhc2hlcykKIHsK
LSAgICBpZiAobV9kYXNoZXMgPT0gZGFzaGVzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2Rh
c2hlcyA9IGRhc2hlczsKLSAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKKyAgICBtX3Bs
YXRmb3JtQ29udGV4dC5zZXREYXNoZXMoZGFzaGVzKTsKIH0KIAogRDJEMV9TVFJPS0VfU1RZTEVf
UFJPUEVSVElFUyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnN0cm9rZVN0eWxlUHJv
cGVydGllcygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIEQyRDE6OlN0cm9rZVN0eWxlUHJvcGVydGll
cyhtX2xpbmVDYXAsIG1fbGluZUNhcCwgbV9saW5lQ2FwLCBtX2xpbmVKb2luLCBtX21pdGVyTGlt
aXQsIEQyRDFfREFTSF9TVFlMRV9TT0xJRCwgMC4wZik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0UGxhdGZvcm1Qcml2YXRlOjpyZWNvbXB1dGVTdHJva2VTdHlsZSgpCi17Ci0gICAgaWYgKCFt
X3N0cm9rZVN5bGVJc0RpcnR5KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2QyZFN0cm9rZVN0
eWxlID0gbnVsbHB0cjsKLQotICAgIERhc2hBcnJheSBkYXNoZXM7Ci0gICAgZmxvYXQgcGF0dGVy
bk9mZnNldCA9IDA7Ci0gICAgYXV0byBkYXNoU3R5bGUgPSBEMkQxX0RBU0hfU1RZTEVfU09MSUQ7
Ci0KLSAgICBpZiAoKG1fc3Ryb2tlU3R5bGUgIT0gU29saWRTdHJva2UpICYmIChtX3N0cm9rZVN0
eWxlICE9IE5vU3Ryb2tlKSkgewotICAgICAgICBkYXNoU3R5bGUgPSBEMkQxX0RBU0hfU1RZTEVf
Q1VTVE9NOwotICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0gbV9wYXR0ZXJuT2Zmc2V0IC8gbV9zdHJv
a2VUaGlja25lc3M7Ci0gICAgICAgIGRhc2hlcyA9IG1fZGFzaGVzOwotCi0gICAgICAgIC8vIElu
IERpcmVjdDJELCBkYXNoZXMgYW5kIGRvdHMgYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgdGhlIHJh
dGlvIG9mIHRoZSBkYXNoIGxlbmd0aCB0byB0aGUgbGluZSB0aGlja25lc3MuCi0gICAgICAgIGZv
ciAoYXV0byYgZGFzaCA6IGRhc2hlcykKLSAgICAgICAgICAgIGRhc2ggLz0gbV9zdHJva2VUaGlj
a25lc3M7Ci0gICAgfQotCi0gICAgYXV0byBzdHJva2VTdHlsZVByb3BlcnRpZXMgPSBEMkQxOjpT
dHJva2VTdHlsZVByb3BlcnRpZXMobV9saW5lQ2FwLCBtX2xpbmVDYXAsIG1fbGluZUNhcCwgbV9s
aW5lSm9pbiwgbV9taXRlckxpbWl0LCBkYXNoU3R5bGUsIHBhdHRlcm5PZmZzZXQpOwotICAgIEdy
YXBoaWNzQ29udGV4dDo6c3lzdGVtRmFjdG9yeSgpLT5DcmVhdGVTdHJva2VTdHlsZSgmc3Ryb2tl
U3R5bGVQcm9wZXJ0aWVzLCBkYXNoZXMuZGF0YSgpLCBkYXNoZXMuc2l6ZSgpLCAmbV9kMmRTdHJv
a2VTdHlsZSk7Ci0KLSAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gZmFsc2U7Ci19Ci0KLUlEMkQx
U3Ryb2tlU3R5bGUqIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c3Ryb2tlU3R5bGUo
KQotewotICAgIHJlY29tcHV0ZVN0cm9rZVN0eWxlKCk7Ci0gICAgcmV0dXJuIG1fZDJkU3Ryb2tl
U3R5bGUuZ2V0KCk7CisgICAgcmV0dXJuIEQyRDE6OlN0cm9rZVN0eWxlUHJvcGVydGllcyhtX3Bs
YXRmb3JtQ29udGV4dC5tX2xpbmVDYXAsIG1fcGxhdGZvcm1Db250ZXh0Lm1fbGluZUNhcCwgbV9w
bGF0Zm9ybUNvbnRleHQubV9saW5lQ2FwLCBtX3BsYXRmb3JtQ29udGV4dC5tX2xpbmVKb2luLCBt
X3BsYXRmb3JtQ29udGV4dC5tX21pdGVyTGltaXQsIEQyRDFfREFTSF9TVFlMRV9TT0xJRCwgMC4w
Zik7CiB9CiAKIElEMkQxU3Ryb2tlU3R5bGUqIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1TdHJv
a2VTdHlsZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fZGF0YS0+c3Ryb2tlU3R5bGUoKTsKKyAg
ICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIHJldHVybiBwbGF0Zm9ybUNvbnRl
eHQoKS0+c3Ryb2tlU3R5bGUoKTsKIH0KIAogLy8gVGhpcyBpcyBvbmx5IHVzZWQgdG8gZHJhdyBi
b3JkZXJzLgpAQCAtODQyLDUyICs1NDEsOSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xp
bmUoY29uc3QgRmxvCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBmbG9hdCB0aGlja25l
c3MgPSBzdHJva2VUaGlja25lc3MoKTsKLSAgICBib29sIGlzVmVydGljYWxMaW5lID0gKHBvaW50
MS54KCkgKyB0aGlja25lc3MgPT0gcG9pbnQyLngoKSk7Ci0gICAgZmxvYXQgc3Ryb2tlV2lkdGgg
PSBpc1ZlcnRpY2FsTGluZSA/IHBvaW50Mi55KCkgLSBwb2ludDEueSgpIDogcG9pbnQyLngoKSAt
IHBvaW50MS54KCk7Ci0gICAgaWYgKCF0aGlja25lc3MgfHwgIXN0cm9rZVdpZHRoKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLQotICAg
IFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlID0gdGhpcy0+c3Ryb2tlU3R5bGUoKTsKLSAgICBmbG9h
dCBjb3JuZXJXaWR0aCA9IDA7Ci0gICAgYm9vbCBkcmF3c0Rhc2hlZExpbmUgPSBzdHJva2VTdHls
ZSA9PSBEb3R0ZWRTdHJva2UgfHwgc3Ryb2tlU3R5bGUgPT0gRGFzaGVkU3Ryb2tlOwotCi0gICAg
Q09NUHRyPElEMkQxU3Ryb2tlU3R5bGU+IGQyZFN0cm9rZVN0eWxlOwotICAgIEQyRENvbnRleHRT
dGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSwgZHJhd3NEYXNoZWRMaW5lKTsKLSAgICBpZiAo
ZHJhd3NEYXNoZWRMaW5lKSB7Ci0gICAgICAgIC8vIEZpZ3VyZSBvdXQgZW5kIHBvaW50cyB0byBl
bnN1cmUgd2UgYWx3YXlzIHBhaW50IGNvcm5lcnMuCi0gICAgICAgIGNvcm5lcldpZHRoID0gZGFz
aGVkTGluZUNvcm5lcldpZHRoRm9yU3Ryb2tlV2lkdGgoc3Ryb2tlV2lkdGgpOwotICAgICAgICBz
dHJva2VXaWR0aCAtPSAyICogY29ybmVyV2lkdGg7Ci0gICAgICAgIGZsb2F0IHBhdHRlcm5XaWR0
aCA9IGRhc2hlZExpbmVQYXR0ZXJuV2lkdGhGb3JTdHJva2VXaWR0aChzdHJva2VXaWR0aCk7Ci0g
ICAgICAgIC8vIENoZWNrIGlmIGNvcm5lciBkcmF3aW5nIHN1ZmZpY2llbnRseSBjb3ZlcnMgdGhl
IGxpbmUuCi0gICAgICAgIGlmIChzdHJva2VXaWR0aCA8PSBwYXR0ZXJuV2lkdGggKyAxKQotICAg
ICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGZsb2F0IHBhdHRlcm5PZmZzZXQgPSBkYXNoZWRM
aW5lUGF0dGVybk9mZnNldEZvclBhdHRlcm5BbmRTdHJva2VXaWR0aChwYXR0ZXJuV2lkdGgsIHN0
cm9rZVdpZHRoKTsKLSAgICAgICAgY29uc3QgZmxvYXQgZGFzaGVzWzJdID0geyBwYXR0ZXJuV2lk
dGgsIHBhdHRlcm5XaWR0aCB9OwotICAgICAgICBhdXRvIHN0cm9rZVN0eWxlUHJvcGVydGllcyA9
IG1fZGF0YS0+c3Ryb2tlU3R5bGVQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIEdyYXBoaWNzQ29udGV4
dDo6c3lzdGVtRmFjdG9yeSgpLT5DcmVhdGVTdHJva2VTdHlsZSgmc3Ryb2tlU3R5bGVQcm9wZXJ0
aWVzLCBkYXNoZXMsIEFSUkFZU0laRShkYXNoZXMpLCAmZDJkU3Ryb2tlU3R5bGUpOwotCi0gICAg
ICAgIG1fZGF0YS0+c2V0UGF0dGVybldpZHRoKHBhdHRlcm5XaWR0aCk7Ci0gICAgICAgIG1fZGF0
YS0+c2V0UGF0dGVybk9mZnNldChwYXR0ZXJuT2Zmc2V0KTsKLSAgICAgICAgbV9kYXRhLT5zZXRE
YXNoZXMoRGFzaEFycmF5KDIsIHBhdHRlcm5XaWR0aCkpOwotCi0gICAgICAgIGQyZFN0cm9rZVN0
eWxlID0gbV9kYXRhLT5zdHJva2VTdHlsZSgpOwotICAgIH0KLQotICAgIGF1dG8gY2VudGVyZWRQ
b2ludHMgPSBjZW50ZXJMaW5lQW5kQ3V0T2ZmQ29ybmVycyhpc1ZlcnRpY2FsTGluZSwgY29ybmVy
V2lkdGgsIHBvaW50MSwgcG9pbnQyKTsKLSAgICBhdXRvIHAxID0gY2VudGVyZWRQb2ludHNbMF07
Ci0gICAgYXV0byBwMiA9IGNlbnRlcmVkUG9pbnRzWzFdOwotCi0gICAgY29udGV4dC0+U2V0VGFn
cygxLCBfX0xJTkVfXyk7Ci0KLSAgICBGbG9hdFJlY3QgYm91bmRpbmdSZWN0KHAxLCBwMik7Ci0K
LSAgICBkcmF3V2l0aG91dFNoYWRvdyhib3VuZGluZ1JlY3QsIFt0aGlzLCBwMSwgcDIsIGQyZFN0
cm9rZVN0eWxlXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAgIHJl
bmRlclRhcmdldC0+RHJhd0xpbmUocDEsIHAyLCBzb2xpZFN0cm9rZUJydXNoKCksIHN0cm9rZVRo
aWNrbmVzcygpLCBkMmRTdHJva2VTdHlsZS5nZXQoKSk7Ci0gICAgfSk7CisgICAgQVNTRVJUKGhh
c1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0ZSA9IHRoaXMtPnN0YXRlKCk7Cisg
ICAgRGlyZWN0MkQ6OmRyYXdMaW5lKCpwbGF0Zm9ybUNvbnRleHQoKSwgcG9pbnQxLCBwb2ludDIs
IHN0YXRlLnN0cm9rZVN0eWxlLCBzdGF0ZS5zdHJva2VDb2xvciwgc3RhdGUuc3Ryb2tlVGhpY2tu
ZXNzLCBzdGF0ZS5zaG91bGRBbnRpYWxpYXMpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6
ZHJhd0VsbGlwc2UoY29uc3QgRmxvYXRSZWN0JiByZWN0KQpAQCAtOTAwLDE3ICs1NTYsMTAgQEAg
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdFbGxpcHNlKGNvbnN0CiAgICAgICAgIHJldHVybjsK
ICAgICB9CiAKLSAgICBhdXRvIGVsbGlwc2UgPSBEMkQxOjpFbGxpcHNlKHJlY3QuY2VudGVyKCks
IDAuNSAqIHJlY3Qud2lkdGgoKSwgMC41ICogcmVjdC5oZWlnaHQoKSk7CiAKLSAgICBhdXRvIGNv
bnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19M
SU5FX18pOwotCi0gICAgZHJhd1dpdGhvdXRTaGFkb3cocmVjdCwgW3RoaXMsIGVsbGlwc2VdKElE
MkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgcmVuZGVyVGFyZ2V0LT5G
aWxsRWxsaXBzZSgmZWxsaXBzZSwgc29saWRGaWxsQnJ1c2goKSk7Ci0KLSAgICAgICAgcmVuZGVy
VGFyZ2V0LT5EcmF3RWxsaXBzZSgmZWxsaXBzZSwgc29saWRTdHJva2VCcnVzaCgpLCBzdHJva2VU
aGlja25lc3MoKSwgbV9kYXRhLT5zdHJva2VTdHlsZSgpKTsKLSAgICB9KTsKKyAgICBBU1NFUlQo
aGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1dG8mIHN0YXRlID0gdGhpcy0+c3RhdGUoKTsK
KyAgICBEaXJlY3QyRDo6ZmlsbEVsbGlwc2UoKnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LCBzdGF0
ZS5maWxsQ29sb3IsIHN0YXRlLnN0cm9rZVN0eWxlLCBzdGF0ZS5zdHJva2VDb2xvciwgc3RhdGUu
c3Ryb2tlVGhpY2tuZXNzKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmFwcGx5U3Ryb2tl
UGF0dGVybigpCkBAIC05MjIsNyArNTcxLDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmFwcGx5
U3Ryb2tlUGF0dGVybgogICAgIEFmZmluZVRyYW5zZm9ybSB1c2VyVG9CYXNlQ1RNOyAvLyBGSVhN
RTogVGhpcyBpc24ndCByZWFsbHkgbmVlZGVkIG9uIFdpbmRvd3MKIAogICAgIGNvbnN0IGZsb2F0
IHBhdHRlcm5BbHBoYSA9IDE7Ci0gICAgbV9kYXRhLT5tX3BhdHRlcm5TdHJva2VCcnVzaCA9IGFk
b3B0Q09NKG1fc3RhdGUuc3Ryb2tlUGF0dGVybi0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKCp0aGlz
LCBwYXR0ZXJuQWxwaGEsIHVzZXJUb0Jhc2VDVE0pKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+
bV9wYXR0ZXJuU3Ryb2tlQnJ1c2ggPSBhZG9wdENPTShtX3N0YXRlLnN0cm9rZVBhdHRlcm4tPmNy
ZWF0ZVBsYXRmb3JtUGF0dGVybigqdGhpcywgcGF0dGVybkFscGhhLCB1c2VyVG9CYXNlQ1RNKSk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjphcHBseUZpbGxQYXR0ZXJuKCkKQEAgLTkzNCw3
ICs1ODMsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6YXBwbHlGaWxsUGF0dGVybigpCiAgICAg
QWZmaW5lVHJhbnNmb3JtIHVzZXJUb0Jhc2VDVE07IC8vIEZJWE1FOiBUaGlzIGlzbid0IHJlYWxs
eSBuZWVkZWQgb24gV2luZG93cwogCiAgICAgY29uc3QgZmxvYXQgcGF0dGVybkFscGhhID0gMTsK
LSAgICBtX2RhdGEtPm1fcGF0dGVybkZpbGxCcnVzaCA9IGFkb3B0Q09NKG1fc3RhdGUuZmlsbFBh
dHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0dGVybigqdGhpcywgcGF0dGVybkFscGhhLCB1c2VyVG9C
YXNlQ1RNKSk7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPm1fcGF0dGVybkZpbGxCcnVzaCA9IGFk
b3B0Q09NKG1fc3RhdGUuZmlsbFBhdHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0dGVybigqdGhpcywg
cGF0dGVybkFscGhhLCB1c2VyVG9CYXNlQ1RNKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
OjpkcmF3UGF0aChjb25zdCBQYXRoJiBwYXRoKQpAQCAtOTQ3LDEwMiArNTk2LDEwIEBAIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpkcmF3UGF0aChjb25zdCBQYXQKICAgICAgICAgcmV0dXJuOwogICAg
IH0KIAotICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotICAgIGNvbnN0IEdy
YXBoaWNzQ29udGV4dFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpZiAoc3RhdGUuZmls
bEdyYWRpZW50IHx8IHN0YXRlLnN0cm9rZUdyYWRpZW50KSB7Ci0gICAgICAgIC8vIFdlIGRvbid0
IGhhdmUgYW55IG9wdGltaXplZCB3YXkgdG8gZmlsbCAmIHN0cm9rZSBhIHBhdGggdXNpbmcgZ3Jh
ZGllbnRzCi0gICAgICAgIC8vIEZJWE1FOiBCZSBzbWFydGVyIGFib3V0IHRoaXMuCi0gICAgICAg
IGZpbGxQYXRoKHBhdGgpOwotICAgICAgICBzdHJva2VQYXRoKHBhdGgpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgaWYgKHN0YXRlLmZpbGxQYXR0ZXJuKQotICAgICAgICBhcHBseUZp
bGxQYXR0ZXJuKCk7Ci0KLSAgICBpZiAoc3RhdGUuc3Ryb2tlUGF0dGVybikKLSAgICAgICAgYXBw
bHlTdHJva2VQYXR0ZXJuKCk7Ci0KLSAgICBpZiAocGF0aC5hY3RpdmVQYXRoKCkpCi0gICAgICAg
IHBhdGguYWN0aXZlUGF0aCgpLT5DbG9zZSgpOwotCi0gICAgY29udGV4dC0+U2V0VGFncygxLCBf
X0xJTkVfXyk7Ci0KLSAgICBhdXRvIHJlY3QgPSBwYXRoLmZhc3RCb3VuZGluZ1JlY3QoKTsKLSAg
ICBkcmF3V2l0aG91dFNoYWRvdyhyZWN0LCBbdGhpcywgJnBhdGhdKElEMkQxUmVuZGVyVGFyZ2V0
KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgYXV0byBicnVzaCA9IG1fc3RhdGUuc3Ryb2tlUGF0
dGVybiA/IHBhdHRlcm5TdHJva2VCcnVzaCgpIDogc29saWRTdHJva2VCcnVzaCgpOwotICAgICAg
ICByZW5kZXJUYXJnZXQtPkRyYXdHZW9tZXRyeShwYXRoLnBsYXRmb3JtUGF0aCgpLCBicnVzaCwg
c3Ryb2tlVGhpY2tuZXNzKCksIG1fZGF0YS0+c3Ryb2tlU3R5bGUoKSk7Ci0gICAgfSk7Ci0KLSAg
ICBmbHVzaCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1dpdGhvdXRTaGFkb3co
Y29uc3QgRmxvYXRSZWN0JiAvKmJvdW5kaW5nUmVjdCovLCBjb25zdCBXVEY6OkZ1bmN0aW9uPHZv
aWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4mIGRyYXdDb21tYW5kcykKLXsKLSAgICBkcmF3Q29tbWFu
ZHMocGxhdGZvcm1Db250ZXh0KCkpOwotfQotCi1zdGF0aWMgdm9pZCBkcmF3V2l0aFNoYWRvd0hl
bHBlcihJRDJEMVJlbmRlclRhcmdldCogY29udGV4dCwgSUQyRDFCaXRtYXAqIGJpdG1hcCwgY29u
c3QgQ29sb3ImIHNoYWRvd0NvbG9yLCBjb25zdCBGbG9hdFNpemUmIHNoYWRvd09mZnNldCwgZmxv
YXQgc2hhZG93Qmx1cikKLXsKLSAgICBDT01QdHI8SUQyRDFEZXZpY2VDb250ZXh0PiBkZXZpY2VD
b250ZXh0OwotICAgIEhSRVNVTFQgaHIgPSBjb250ZXh0LT5RdWVyeUludGVyZmFjZSgmZGV2aWNl
Q29udGV4dCk7Ci0gICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Ci0KLSAgICAvLyBD
cmVhdGUgdGhlIHNoYWRvdyBlZmZlY3QKLSAgICBDT01QdHI8SUQyRDFFZmZlY3Q+IHNoYWRvd0Vm
ZmVjdDsKLSAgICBociA9IGRldmljZUNvbnRleHQtPkNyZWF0ZUVmZmVjdChDTFNJRF9EMkQxU2hh
ZG93LCAmc2hhZG93RWZmZWN0KTsKLSAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsK
LQotICAgIHNoYWRvd0VmZmVjdC0+U2V0SW5wdXQoMCwgYml0bWFwKTsKLSAgICBzaGFkb3dFZmZl
Y3QtPlNldFZhbHVlKEQyRDFfU0hBRE9XX1BST1BfQ09MT1IsIHN0YXRpY19jYXN0PEQyRDFfVkVD
VE9SXzRGPihzaGFkb3dDb2xvcikpOwotICAgIHNoYWRvd0VmZmVjdC0+U2V0VmFsdWUoRDJEMV9T
SEFET1dfUFJPUF9CTFVSX1NUQU5EQVJEX0RFVklBVElPTiwgc2hhZG93Qmx1cik7Ci0KLSAgICBD
T01QdHI8SUQyRDFFZmZlY3Q+IHRyYW5zZm9ybUVmZmVjdDsKLSAgICBociA9IGRldmljZUNvbnRl
eHQtPkNyZWF0ZUVmZmVjdChDTFNJRF9EMkQxMkRBZmZpbmVUcmFuc2Zvcm0sICZ0cmFuc2Zvcm1F
ZmZlY3QpOwotICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOwotCi0gICAgdHJhbnNm
b3JtRWZmZWN0LT5TZXRJbnB1dEVmZmVjdCgwLCBzaGFkb3dFZmZlY3QuZ2V0KCkpOwotCi0gICAg
YXV0byB0cmFuc2xhdGlvbiA9IEQyRDE6Ok1hdHJpeDN4MkY6OlRyYW5zbGF0aW9uKHNoYWRvd09m
ZnNldC53aWR0aCgpLCBzaGFkb3dPZmZzZXQuaGVpZ2h0KCkpOwotICAgIHRyYW5zZm9ybUVmZmVj
dC0+U2V0VmFsdWUoRDJEMV8yREFGRklORVRSQU5TRk9STV9QUk9QX1RSQU5TRk9STV9NQVRSSVgs
IHRyYW5zbGF0aW9uKTsKLQotICAgIENPTVB0cjxJRDJEMUVmZmVjdD4gY29tcG9zaXRvcjsKLSAg
ICBociA9IGRldmljZUNvbnRleHQtPkNyZWF0ZUVmZmVjdChDTFNJRF9EMkQxQ29tcG9zaXRlLCAm
Y29tcG9zaXRvcik7Ci0gICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Ci0KLSAgICBj
b21wb3NpdG9yLT5TZXRJbnB1dEVmZmVjdCgwLCB0cmFuc2Zvcm1FZmZlY3QuZ2V0KCkpOwotICAg
IGNvbXBvc2l0b3ItPlNldElucHV0KDEsIGJpdG1hcCk7Ci0KLSAgICAvLyBGbGlwIHRoZSBjb250
ZXh0Ci0gICAgRDJEMV9NQVRSSVhfM1gyX0YgY3RtOwotICAgIGRldmljZUNvbnRleHQtPkdldFRy
YW5zZm9ybSgmY3RtKTsKLSAgICBhdXRvIHRyYW5zbGF0ZSA9IEQyRDE6Ok1hdHJpeDN4MkY6OlRy
YW5zbGF0aW9uKDAuMGYsIGRldmljZUNvbnRleHQtPkdldFNpemUoKS5oZWlnaHQpOwotICAgIGF1
dG8gZmxpcCA9IEQyRDE6Ok1hdHJpeDN4MkY6OlNjYWxlKEQyRDE6OlNpemVGKDEuMGYsIC0xLjBm
KSk7Ci0gICAgZGV2aWNlQ29udGV4dC0+U2V0VHJhbnNmb3JtKGN0bSAqIGZsaXAgKiB0cmFuc2xh
dGUpOwotCi0gICAgZGV2aWNlQ29udGV4dC0+RHJhd0ltYWdlKGNvbXBvc2l0b3IuZ2V0KCksIEQy
RDFfSU5URVJQT0xBVElPTl9NT0RFX0xJTkVBUik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
OjpkcmF3V2l0aFNoYWRvdyhjb25zdCBGbG9hdFJlY3QmIGJvdW5kaW5nUmVjdCwgY29uc3QgV1RG
OjpGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+JiBkcmF3Q29tbWFuZHMpCi17Ci0g
ICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0KLSAgICAvLyBSZW5kZXIgdGhl
IGN1cnJlbnQgZ2VvbWV0cnkgdG8gYSBiaXRtYXAgY29udGV4dAotICAgIENPTVB0cjxJRDJEMUJp
dG1hcFJlbmRlclRhcmdldD4gYml0bWFwVGFyZ2V0OwotICAgIEhSRVNVTFQgaHIgPSBjb250ZXh0
LT5DcmVhdGVDb21wYXRpYmxlUmVuZGVyVGFyZ2V0KCZiaXRtYXBUYXJnZXQpOwotICAgIFJFTEVB
U0VfQVNTRVJUKFNVQ0NFRURFRChocikpOwotCi0gICAgYml0bWFwVGFyZ2V0LT5CZWdpbkRyYXco
KTsKLSAgICBkcmF3Q29tbWFuZHMoYml0bWFwVGFyZ2V0LmdldCgpKTsKLSAgICBociA9IGJpdG1h
cFRhcmdldC0+RW5kRHJhdygpOwotICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOwot
Ci0gICAgQ09NUHRyPElEMkQxQml0bWFwPiBiaXRtYXA7Ci0gICAgaHIgPSBiaXRtYXBUYXJnZXQt
PkdldEJpdG1hcCgmYml0bWFwKTsKLSAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsK
LQotICAgIGRyYXdXaXRoU2hhZG93SGVscGVyKGNvbnRleHQsIGJpdG1hcC5nZXQoKSwgbV9zdGF0
ZS5zaGFkb3dDb2xvciwgbV9zdGF0ZS5zaGFkb3dPZmZzZXQsIG1fc3RhdGUuc2hhZG93Qmx1cik7
CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0ZSA9IHRo
aXMtPnN0YXRlKCk7CisgICAgYXV0byYgY29udGV4dCA9ICpwbGF0Zm9ybUNvbnRleHQoKTsKKyAg
ICBEaXJlY3QyRDo6ZHJhd1BhdGgoY29udGV4dCwgcGF0aCwgRGlyZWN0MkQ6OlN0cm9rZVNvdXJj
ZShzdGF0ZSwgY29udGV4dCksIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0ZSkpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgoY29uc3QgUGF0aCYgcGF0aCkKQEAgLTEwNTUs
NTAgKzYxMiwxMCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgoY29uc3QgUGF0CiAg
ICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAocGF0aC5hY3RpdmVQYXRoKCkpIHsKLSAg
ICAgICAgLy8gTWFrZSBzdXJlIGl0J3MgY2xvc2VkLiBUaGlzIG1pZ2h0IGZhaWwgaWYgdGhlIHBh
dGggd2FzIGFscmVhZHkgY2xvc2VkLCBzbwotICAgICAgICAvLyBpZ25vcmUgdGhlIHJldHVybiB2
YWx1ZS4KLSAgICAgICAgcGF0aC5hY3RpdmVQYXRoKCktPkNsb3NlKCk7Ci0gICAgfQotCi0gICAg
RDJEQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqbV9kYXRhKTsKLQotICAgIGF1dG8gY29u
dGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJ
TkVfXyk7Ci0KLSAgICBpZiAobV9zdGF0ZS5maWxsR3JhZGllbnQpIHsKLSAgICAgICAgY29udGV4
dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAgICAgICAgRmxvYXRSZWN0IGJvdW5kaW5nUmVj
dCA9IHBhdGguZmFzdEJvdW5kaW5nUmVjdCgpOwotICAgICAgICBXVEY6OkZ1bmN0aW9uPHZvaWQo
SUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1bmN0aW9uID0gW3RoaXMsICZwYXRoXShJRDJEMVJl
bmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAgICAgICByZW5kZXJUYXJnZXQtPkZp
bGxHZW9tZXRyeShwYXRoLnBsYXRmb3JtUGF0aCgpLCBtX3N0YXRlLmZpbGxHcmFkaWVudC0+Y3Jl
YXRlUGxhdGZvcm1HcmFkaWVudElmTmVjZXNzYXJ5KHJlbmRlclRhcmdldCkpOwotICAgICAgICB9
OwotCi0gICAgICAgIGlmIChoYXNTaGFkb3coKSkKLSAgICAgICAgICAgIGRyYXdXaXRoU2hhZG93
KGJvdW5kaW5nUmVjdCwgZHJhd0Z1bmN0aW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAg
ZHJhd1dpdGhvdXRTaGFkb3coYm91bmRpbmdSZWN0LCBkcmF3RnVuY3Rpb24pOwotCi0gICAgICAg
IGZsdXNoKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobV9zdGF0ZS5maWxs
UGF0dGVybikKLSAgICAgICAgYXBwbHlGaWxsUGF0dGVybigpOwotCi0gICAgQ09NUHRyPElEMkQx
R2VvbWV0cnlHcm91cD4gcGF0aFRvRmlsbDsKLSAgICBwYXRoLmNyZWF0ZUdlb21ldHJ5V2l0aEZp
bGxNb2RlKGZpbGxSdWxlKCksIHBhdGhUb0ZpbGwpOwotCi0gICAgY29udGV4dC0+U2V0VGFncygx
LCBfX0xJTkVfXyk7Ci0KLSAgICBGbG9hdFJlY3QgY29udGV4dFJlY3QoRmxvYXRQb2ludCgpLCBj
b250ZXh0LT5HZXRTaXplKCkpOwotICAgIGRyYXdXaXRob3V0U2hhZG93KGNvbnRleHRSZWN0LCBb
dGhpcywgJnBhdGhUb0ZpbGxdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAg
ICAgICAgYXV0byBicnVzaCA9IG1fc3RhdGUuZmlsbFBhdHRlcm4gPyBwYXR0ZXJuRmlsbEJydXNo
KCkgOiBzb2xpZEZpbGxCcnVzaCgpOwotICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxHZW9tZXRy
eShwYXRoVG9GaWxsLmdldCgpLCBicnVzaCk7Ci0gICAgfSk7Ci0KLSAgICBmbHVzaCgpOworICAg
IEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgYXV0byYgc3RhdGUgPSB0aGlzLT5z
dGF0ZSgpOworICAgIGF1dG8mIGNvbnRleHQgPSAqcGxhdGZvcm1Db250ZXh0KCk7CisgICAgRGly
ZWN0MkQ6OmZpbGxQYXRoKGNvbnRleHQsIHBhdGgsIERpcmVjdDJEOjpGaWxsU291cmNlKHN0YXRl
LCBjb250ZXh0KSwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0YXRlKSk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCkBAIC0xMTExLDQwICs2
MjgsMTAgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVBhdGgoY29uc3QgUAogICAgICAg
ICByZXR1cm47CiAgICAgfQogCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7
Ci0gICAgCi0gICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAgICBpZiAobV9z
dGF0ZS5zdHJva2VHcmFkaWVudCkgewotICAgICAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElO
RV9fKTsKLQotICAgICAgICBEMkRDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCptX2RhdGEp
OwotICAgICAgICBhdXRvIGJvdW5kaW5nUmVjdCA9IHBhdGguZmFzdEJvdW5kaW5nUmVjdCgpOwot
ICAgICAgICBXVEY6OkZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1bmN0
aW9uID0gW3RoaXMsICZwYXRoXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0g
ICAgICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdHZW9tZXRyeShwYXRoLnBsYXRmb3JtUGF0aCgp
LCBtX3N0YXRlLnN0cm9rZUdyYWRpZW50LT5jcmVhdGVQbGF0Zm9ybUdyYWRpZW50SWZOZWNlc3Nh
cnkocmVuZGVyVGFyZ2V0KSk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgKGhhc1NoYWRvdygp
KQotICAgICAgICAgICAgZHJhd1dpdGhTaGFkb3coYm91bmRpbmdSZWN0LCBkcmF3RnVuY3Rpb24p
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkcmF3V2l0aG91dFNoYWRvdyhib3VuZGluZ1Jl
Y3QsIGRyYXdGdW5jdGlvbik7Ci0KLSAgICAgICAgZmx1c2goKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIGlmIChtX3N0YXRlLnN0cm9rZVBhdHRlcm4pCi0gICAgICAgIGFwcGx5U3Ry
b2tlUGF0dGVybigpOwotCi0gICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAg
ICBGbG9hdFJlY3QgY29udGV4dFJlY3QoRmxvYXRQb2ludCgpLCBjb250ZXh0LT5HZXRTaXplKCkp
OwotICAgIGRyYXdXaXRob3V0U2hhZG93KGNvbnRleHRSZWN0LCBbdGhpcywgJnBhdGhdKElEMkQx
UmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgYXV0byBicnVzaCA9IG1fc3Rh
dGUuc3Ryb2tlUGF0dGVybiA/IHBhdHRlcm5TdHJva2VCcnVzaCgpIDogc29saWRTdHJva2VCcnVz
aCgpOwotICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdHZW9tZXRyeShwYXRoLnBsYXRmb3JtUGF0
aCgpLCBicnVzaCwgc3Ryb2tlVGhpY2tuZXNzKCksIG1fZGF0YS0+c3Ryb2tlU3R5bGUoKSk7Ci0g
ICAgfSk7Ci0KLSAgICBmbHVzaCgpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7
CisgICAgYXV0byYgc3RhdGUgPSB0aGlzLT5zdGF0ZSgpOworICAgIGF1dG8mIGNvbnRleHQgPSAq
cGxhdGZvcm1Db250ZXh0KCk7CisgICAgRGlyZWN0MkQ6OnN0cm9rZVBhdGgoY29udGV4dCwgcGF0
aCwgRGlyZWN0MkQ6OlN0cm9rZVNvdXJjZShzdGF0ZSwgY29udGV4dCksIERpcmVjdDJEOjpTaGFk
b3dTdGF0ZShzdGF0ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29u
c3QgRmxvYXRSZWN0JiByZWN0KQpAQCAtMTE1Nyw0MSArNjQ0LDEwIEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG8KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAg
IGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgaWYgKG1fc3RhdGUuZmls
bEdyYWRpZW50KSB7Ci0gICAgICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotICAg
ICAgICBEMkRDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCptX2RhdGEpOwotICAgICAgICBX
VEY6OkZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1bmN0aW9uID0gW3Ro
aXMsIHJlY3RdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgICAg
IGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSByZWN0OwotICAgICAgICAgICAgcmVuZGVyVGFy
Z2V0LT5GaWxsUmVjdGFuZ2xlKCZkMmRSZWN0LCBtX3N0YXRlLmZpbGxHcmFkaWVudC0+Y3JlYXRl
UGxhdGZvcm1HcmFkaWVudElmTmVjZXNzYXJ5KHJlbmRlclRhcmdldCkpOwotICAgICAgICB9Owot
Ci0gICAgICAgIGlmIChoYXNTaGFkb3coKSkKLSAgICAgICAgICAgIGRyYXdXaXRoU2hhZG93KHJl
Y3QsIGRyYXdGdW5jdGlvbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRyYXdXaXRob3V0
U2hhZG93KHJlY3QsIGRyYXdGdW5jdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAg
ICBpZiAobV9zdGF0ZS5maWxsUGF0dGVybikKLSAgICAgICAgYXBwbHlGaWxsUGF0dGVybigpOwot
Ci0gICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAgICBib29sIGRyYXdPd25T
aGFkb3cgPSAhaXNBY2NlbGVyYXRlZENvbnRleHQoKSAmJiBoYXNCbHVycmVkU2hhZG93KCkgJiYg
IW1fc3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXM7IC8vIERvbid0IHVzZSBTaGFkb3dCbHVy
IGZvciBjYW52YXMgeWV0LgotICAgIGlmIChkcmF3T3duU2hhZG93KSB7Ci0gICAgICAgIC8vIEZJ
WE1FOiBHZXQgU2hhZG93Qmx1ciB3b3JraW5nIG9uIERpcmVjdDJECi0gICAgICAgIC8vIFNoYWRv
d0JsdXIgY29udGV4dFNoYWRvdyhtX3N0YXRlKTsKLSAgICAgICAgLy8gY29udGV4dFNoYWRvdy5k
cmF3UmVjdFNoYWRvdygqdGhpcywgRmxvYXRSb3VuZGVkUmVjdChyZWN0KSk7Ci0gICAgICAgIG5v
dEltcGxlbWVudGVkKCk7Ci0gICAgfQotCi0gICAgZHJhd1dpdGhvdXRTaGFkb3cocmVjdCwgW3Ro
aXMsIHJlY3RdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgY29u
c3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9IHJlY3Q7Ci0gICAgICAgIGF1dG8gYnJ1c2ggPSBtX3N0
YXRlLmZpbGxQYXR0ZXJuID8gcGF0dGVybkZpbGxCcnVzaCgpIDogc29saWRGaWxsQnJ1c2goKTsK
LSAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsUmVjdGFuZ2xlKCZkMmRSZWN0LCBicnVzaCk7Ci0g
ICAgfSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0
ZSA9IHRoaXMtPnN0YXRlKCk7CisgICAgYXV0byYgY29udGV4dCA9ICpwbGF0Zm9ybUNvbnRleHQo
KTsKKyAgICBEaXJlY3QyRDo6ZmlsbFJlY3QoY29udGV4dCwgcmVjdCwgRGlyZWN0MkQ6OkZpbGxT
b3VyY2Uoc3RhdGUsIGNvbnRleHQpLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoc3RhdGUpKTsKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwg
Y29uc3QgQ29sb3ImIGNvbG9yKQpAQCAtMTIwNCwyMiArNjYwLDEwIEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG8KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAg
IGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgYm9vbCBkcmF3T3duU2hh
ZG93ID0gIWlzQWNjZWxlcmF0ZWRDb250ZXh0KCkgJiYgaGFzQmx1cnJlZFNoYWRvdygpICYmICFt
X3N0YXRlLnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zOyAvLyBEb24ndCB1c2UgU2hhZG93Qmx1ciBm
b3IgY2FudmFzIHlldC4KLSAgICBpZiAoZHJhd093blNoYWRvdykgewotICAgICAgICAvLyBGSVhN
RTogR2V0IFNoYWRvd0JsdXIgd29ya2luZyBvbiBEaXJlY3QyRAotICAgICAgICAvLyBTaGFkb3dC
bHVyIGNvbnRleHRTaGFkb3cobV9zdGF0ZSk7Ci0gICAgICAgIC8vIGNvbnRleHRTaGFkb3cuZHJh
d1JlY3RTaGFkb3coKnRoaXMsIEZsb2F0Um91bmRlZFJlY3QocmVjdCkpOwotICAgICAgICBub3RJ
bXBsZW1lbnRlZCgpOwotICAgIH0KLQotICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18p
OwotCi0gICAgZHJhd1dpdGhvdXRTaGFkb3cocmVjdCwgW3RoaXMsIHJlY3QsIGNvbG9yXShJRDJE
MVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAgIGNvbnN0IEQyRDFfUkVDVF9G
IGQyZFJlY3QgPSByZWN0OwotICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUoJmQy
ZFJlY3QsIGJydXNoV2l0aENvbG9yKGNvbG9yKSk7Ci0gICAgfSk7CisgICAgQVNTRVJUKGhhc1Bs
YXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0ZSA9IHRoaXMtPnN0YXRlKCk7CisgICAg
YXV0byYgY29udGV4dCA9ICpwbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBEaXJlY3QyRDo6ZmlsbFJl
Y3QoY29udGV4dCwgcmVjdCwgY29sb3IsIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0ZSkpOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1GaWxsUm91bmRlZFJlY3QoY29uc3Qg
RmxvYXRSb3VuZGVkUmVjdCYgcmVjdCwgY29uc3QgQ29sb3ImIGNvbG9yKQpAQCAtMTIyOSwzOCAr
NjczLDkgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtRmlsbFJvdW5kZQogCiAgICAg
QVNTRVJUKCFtX2ltcGwpOwogCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7
Ci0KLSAgICBib29sIGRyYXdPd25TaGFkb3cgPSAhaXNBY2NlbGVyYXRlZENvbnRleHQoKSAmJiBo
YXNCbHVycmVkU2hhZG93KCkgJiYgIW1fc3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXM7IC8v
IERvbid0IHVzZSBTaGFkb3dCbHVyIGZvciBjYW52YXMgeWV0LgotICAgIEQyRENvbnRleHRTdGF0
ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSwgZHJhd093blNoYWRvdyk7Ci0gICAgaWYgKGRyYXdP
d25TaGFkb3cpIHsKLSAgICAgICAgLy8gRklYTUU6IEdldCBTaGFkb3dCbHVyIHdvcmtpbmcgb24g
RGlyZWN0MkQKLSAgICAgICAgLy8gU2hhZG93Qmx1ciBjb250ZXh0U2hhZG93KG1fc3RhdGUpOwot
ICAgICAgICAvLyBjb250ZXh0U2hhZG93LmRyYXdSZWN0U2hhZG93KCp0aGlzLCByZWN0KTsKLSAg
ICAgICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICB9Ci0KLSAgICBjb250ZXh0LT5TZXRUYWdzKDEs
IF9fTElORV9fKTsKLQotICAgIGNvbnN0IEZsb2F0UmVjdCYgciA9IHJlY3QucmVjdCgpOwotICAg
IGNvbnN0IEZsb2F0Um91bmRlZFJlY3Q6OlJhZGlpJiByYWRpaSA9IHJlY3QucmFkaWkoKTsKLSAg
ICBib29sIGVxdWFsV2lkdGhzID0gKHJhZGlpLnRvcExlZnQoKS53aWR0aCgpID09IHJhZGlpLnRv
cFJpZ2h0KCkud2lkdGgoKSAmJiByYWRpaS50b3BSaWdodCgpLndpZHRoKCkgPT0gcmFkaWkuYm90
dG9tTGVmdCgpLndpZHRoKCkgJiYgcmFkaWkuYm90dG9tTGVmdCgpLndpZHRoKCkgPT0gcmFkaWku
Ym90dG9tUmlnaHQoKS53aWR0aCgpKTsKLSAgICBib29sIGVxdWFsSGVpZ2h0cyA9IChyYWRpaS50
b3BMZWZ0KCkuaGVpZ2h0KCkgPT0gcmFkaWkuYm90dG9tTGVmdCgpLmhlaWdodCgpICYmIHJhZGlp
LmJvdHRvbUxlZnQoKS5oZWlnaHQoKSA9PSByYWRpaS50b3BSaWdodCgpLmhlaWdodCgpICYmIHJh
ZGlpLnRvcFJpZ2h0KCkuaGVpZ2h0KCkgPT0gcmFkaWkuYm90dG9tUmlnaHQoKS5oZWlnaHQoKSk7
Ci0gICAgYm9vbCBoYXNDdXN0b21GaWxsID0gbV9zdGF0ZS5maWxsR3JhZGllbnQgfHwgbV9zdGF0
ZS5maWxsUGF0dGVybjsKLSAgICBpZiAoIWhhc0N1c3RvbUZpbGwgJiYgZXF1YWxXaWR0aHMgJiYg
ZXF1YWxIZWlnaHRzICYmIHJhZGlpLnRvcExlZnQoKS53aWR0aCgpICogMiA9PSByLndpZHRoKCkg
JiYgcmFkaWkudG9wTGVmdCgpLmhlaWdodCgpICogMiA9PSByLmhlaWdodCgpKSB7Ci0gICAgICAg
IGF1dG8gcm91bmRlZFJlY3QgPSBEMkQxOjpSb3VuZGVkUmVjdChyLCByYWRpaS50b3BMZWZ0KCku
d2lkdGgoKSwgcmFkaWkudG9wTGVmdCgpLmhlaWdodCgpKTsKLSAgICAgICAgY29udGV4dC0+Rmls
bFJvdW5kZWRSZWN0YW5nbGUocm91bmRlZFJlY3QsIGJydXNoV2l0aENvbG9yKGNvbG9yKSk7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgRDJEQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqbV9k
YXRhKTsKLSAgICAgICAgc2V0RmlsbENvbG9yKGNvbG9yKTsKLQotICAgICAgICBQYXRoIHBhdGg7
Ci0gICAgICAgIHBhdGguYWRkUm91bmRlZFJlY3QocmVjdCk7Ci0gICAgICAgIGZpbGxQYXRoKHBh
dGgpOwotICAgIH0KLQotICAgIGlmIChkcmF3T3duU2hhZG93KQotICAgICAgICBzdGF0ZVNhdmVy
LnJlc3RvcmUoKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1dG8m
IHN0YXRlID0gdGhpcy0+c3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZmlsbFJvdW5kZWRSZWN0KCpw
bGF0Zm9ybUNvbnRleHQoKSwgcmVjdCwgY29sb3IsIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0
ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3RXaXRoUm91bmRlZEhvbGUo
Y29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiByb3VuZGVkSG9s
ZVJlY3QsIGNvbnN0IENvbG9yJiBjb2xvcikKQEAgLTEyNzMsNDEgKzY4OCwxMCBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZmlsbFJlY3RXaXRoUm91bmRlCiAgICAgICAgIHJldHVybjsKICAgICB9
CiAKLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIGNvbnRleHQt
PlNldFRhZ3MoMSwgX19MSU5FX18pOwotCi0gICAgUGF0aCBwYXRoOwotICAgIHBhdGguYWRkUmVj
dChyZWN0KTsKLQotICAgIGlmICghcm91bmRlZEhvbGVSZWN0LnJhZGlpKCkuaXNaZXJvKCkpCi0g
ICAgICAgIHBhdGguYWRkUm91bmRlZFJlY3Qocm91bmRlZEhvbGVSZWN0KTsKLSAgICBlbHNlCi0g
ICAgICAgIHBhdGguYWRkUmVjdChyb3VuZGVkSG9sZVJlY3QucmVjdCgpKTsKLQotICAgIFdpbmRS
dWxlIG9sZEZpbGxSdWxlID0gZmlsbFJ1bGUoKTsKLSAgICBDb2xvciBvbGRGaWxsQ29sb3IgPSBm
aWxsQ29sb3IoKTsKLQotICAgIHNldEZpbGxSdWxlKFdpbmRSdWxlOjpFdmVuT2RkKTsKLSAgICBz
ZXRGaWxsQ29sb3IoY29sb3IpOwotCi0gICAgLy8gZmlsbFJlY3RXaXRoUm91bmRlZEhvbGUoKSBh
c3N1bWVzIHRoYXQgdGhlIGVkZ2VzIG9mIHJlY3QgYXJlIGNsaXBwZWQgb3V0LCBzbyB3ZSBvbmx5
IGNhcmUgYWJvdXQgc2hhZG93cyBjYXN0IGFyb3VuZCBpbnNpZGUgdGhlIGhvbGUuCi0gICAgYm9v
bCBkcmF3T3duU2hhZG93ID0gIWlzQWNjZWxlcmF0ZWRDb250ZXh0KCkgJiYgaGFzQmx1cnJlZFNo
YWRvdygpICYmICFtX3N0YXRlLnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zOwotICAgIEQyRENvbnRl
eHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSwgZHJhd093blNoYWRvdyk7Ci0gICAgaWYg
KGRyYXdPd25TaGFkb3cpIHsKLSAgICAgICAgLy8gRklYTUU6IEdldCBTaGFkb3dCbHVyIHdvcmtp
bmcgb24gRGlyZWN0MkQKLSAgICAgICAgLy8gU2hhZG93Qmx1ciBjb250ZXh0U2hhZG93KG1fc3Rh
dGUpOwotICAgICAgICAvLyBjb250ZXh0U2hhZG93LmRyYXdSZWN0U2hhZG93KCp0aGlzLCByZWN0
KTsKLSAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICB9Ci0KLSAgICBmaWxsUGF0aChwYXRo
KTsKLQotICAgIGlmIChkcmF3T3duU2hhZG93KQotICAgICAgICBzdGF0ZVNhdmVyLnJlc3RvcmUo
KTsKLQotICAgIHNldEZpbGxSdWxlKG9sZEZpbGxSdWxlKTsKLSAgICBzZXRGaWxsQ29sb3Iob2xk
RmlsbENvbG9yKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1dG8m
IHN0YXRlID0gdGhpcy0+c3RhdGUoKTsKKyAgICBhdXRvJiBjb250ZXh0ID0gKnBsYXRmb3JtQ29u
dGV4dCgpOworICAgIERpcmVjdDJEOjpmaWxsUmVjdFdpdGhSb3VuZGVkSG9sZShjb250ZXh0LCBy
ZWN0LCByb3VuZGVkSG9sZVJlY3QsIERpcmVjdDJEOjpGaWxsU291cmNlKHN0YXRlLCBjb250ZXh0
KSwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0YXRlKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0OjpjbGlwKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKQEAgLTEzMjAsNyArNzA0LDggQEAgdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3QgRmxvYXRSZQogICAgICAgICByZXR1cm47CiAg
ICAgfQogCi0gICAgbV9kYXRhLT5jbGlwKHJlY3QpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNv
bnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OmNsaXAoKnBsYXRmb3JtQ29udGV4dCgpLCByZWN0KTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQoY29uc3QgRmxvYXRSZWN0JiByZWN0
KQpAQCAtMTMzMywxMCArNzE4LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQoY29u
c3QgRmxvYQogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgUGF0aCBwYXRoOwotICAgIHBh
dGguYWRkUmVjdChyZWN0KTsKLQotICAgIGNsaXBPdXQocGF0aCk7CisgICAgQVNTRVJUKGhhc1Bs
YXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6Y2xpcE91dCgqcGxhdGZvcm1Db250ZXh0
KCksIHJlY3QpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQYXRo
JiBwYXRoKQpAQCAtMTM0OSwxOSArNzMyLDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBP
dXQoY29uc3QgUGF0aAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gVG8gY2xpcCBP
dXQgd2UgbmVlZCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBpbmZpbml0ZQotICAgIC8vIGNsaXBw
aW5nIHJlY3QgYW5kIHRoZSBwYXRoIHdlIGp1c3QgY3JlYXRlZC4KLSAgICBEMkQxX1NJWkVfRiBy
ZW5kZXJlclNpemUgPSBwbGF0Zm9ybUNvbnRleHQoKS0+R2V0U2l6ZSgpOwotICAgIEZsb2F0UmVj
dCBjbGlwQm91bmRzKDAsIDAsIHJlbmRlcmVyU2l6ZS53aWR0aCwgcmVuZGVyZXJTaXplLmhlaWdo
dCk7Ci0KLSAgICBQYXRoIGJvdW5kaW5nUmVjdDsKLSAgICBib3VuZGluZ1JlY3QuYWRkUmVjdChj
bGlwQm91bmRzKTsKLSAgICBib3VuZGluZ1JlY3QuYXBwZW5kR2VvbWV0cnkocGF0aC5wbGF0Zm9y
bVBhdGgoKSk7Ci0KLSAgICBDT01QdHI8SUQyRDFHZW9tZXRyeUdyb3VwPiBwYXRoVG9DbGlwOwot
ICAgIGJvdW5kaW5nUmVjdC5jcmVhdGVHZW9tZXRyeVdpdGhGaWxsTW9kZShXaW5kUnVsZTo6RXZl
bk9kZCwgcGF0aFRvQ2xpcCk7Ci0KLSAgICBtX2RhdGEtPmNsaXAocGF0aFRvQ2xpcC5nZXQoKSk7
CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6Y2xpcE91
dCgqcGxhdGZvcm1Db250ZXh0KCksIHBhdGgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6
Y2xpcFBhdGgoY29uc3QgUGF0aCYgcGF0aCwgV2luZFJ1bGUgY2xpcFJ1bGUpCkBAIC0xMzc0LDE4
ICs3NDYsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFBhdGgoY29uc3QgUGF0CiAgICAg
ICAgIHJldHVybjsKICAgICB9CiAKLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQo
KTsKLSAgICBpZiAocGF0aC5pc0VtcHR5KCkpIHsKLSAgICAgICAgbV9kYXRhLT5jbGlwKEZsb2F0
UmVjdCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFTU0VSVCghcGF0aC5hY3Rp
dmVQYXRoKCkpOwotCi0gICAgQ09NUHRyPElEMkQxR2VvbWV0cnlHcm91cD4gcGF0aFRvQ2xpcDsK
LSAgICBwYXRoLmNyZWF0ZUdlb21ldHJ5V2l0aEZpbGxNb2RlKGNsaXBSdWxlLCBwYXRoVG9DbGlw
KTsKLQotICAgIG1fZGF0YS0+Y2xpcChwYXRoVG9DbGlwLmdldCgpKTsKKyAgICBBU1NFUlQoaGFz
UGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpjbGlwUGF0aCgqcGxhdGZvcm1Db250
ZXh0KCksIHBhdGgsIGNsaXBSdWxlKTsKIH0KIAogSW50UmVjdCBHcmFwaGljc0NvbnRleHQ6OmNs
aXBCb3VuZHMoKSBjb25zdApAQCAtMTM5MywzMyArNzU1LDE1IEBAIEludFJlY3QgR3JhcGhpY3ND
b250ZXh0OjpjbGlwQm91bmRzKCkgY28KICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAg
ICAgICByZXR1cm4gSW50UmVjdCgpOwogCi0gICAgaWYgKG1faW1wbCkgewotICAgICAgICBXVEZM
b2dBbHdheXMoIkdldHRpbmcgdGhlIGNsaXAgYm91bmRzIG5vdCB5ZXQgc3VwcG9ydGVkIHdpdGgg
ZGlzcGxheSBsaXN0cyIpOwotICAgICAgICByZXR1cm4gSW50UmVjdCgtMjA0OCwgLTIwNDgsIDQw
OTYsIDQwOTYpOyAvLyBGSVhNRTogZGlzcGxheSBsaXN0cy4KLSAgICB9Ci0KLSAgICBEMkQxX1NJ
WkVfRiBjbGlwU2l6ZTsKLSAgICBpZiAoYXV0byBjbGlwTGF5ZXIgPSBtX2RhdGEtPmNsaXBMYXll
cigpKQotICAgICAgICBjbGlwU2l6ZSA9IGNsaXBMYXllci0+R2V0U2l6ZSgpOwotICAgIGVsc2UK
LSAgICAgICAgY2xpcFNpemUgPSBwbGF0Zm9ybUNvbnRleHQoKS0+R2V0U2l6ZSgpOwotCi0gICAg
RmxvYXRSZWN0IGNsaXBCb3VuZHMoSW50UG9pbnQoKSwgY2xpcFNpemUpOworICAgIGlmIChtX2lt
cGwpCisgICAgICAgIHJldHVybiBtX2ltcGwtPmNsaXBCb3VuZHMoKTsKIAotICAgIHJldHVybiBl
bmNsb3NpbmdJbnRSZWN0KGNsaXBCb3VuZHMpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRl
eHQoKSk7CisgICAgcmV0dXJuIERpcmVjdDJEOjpTdGF0ZTo6Z2V0Q2xpcEJvdW5kcygqcGxhdGZv
cm1Db250ZXh0KCkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6
YmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9hdCBvcGFjaXR5KQogewotICAgIFRyYW5zcGFyZW5j
eUxheWVyU3RhdGUgdHJhbnNwYXJlbmN5TGF5ZXI7Ci0gICAgdHJhbnNwYXJlbmN5TGF5ZXIub3Bh
Y2l0eSA9IG9wYWNpdHk7Ci0KLSAgICBIUkVTVUxUIGhyID0gbV9yZW5kZXJUYXJnZXQtPkNyZWF0
ZUNvbXBhdGlibGVSZW5kZXJUYXJnZXQoJnRyYW5zcGFyZW5jeUxheWVyLnJlbmRlclRhcmdldCk7
Ci0gICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Ci0gICAgbV90cmFuc3BhcmVuY3lM
YXllclN0YWNrLmFwcGVuZChXVEZNb3ZlKHRyYW5zcGFyZW5jeUxheWVyKSk7Ci0KLSAgICBtX3Ry
YW5zcGFyZW5jeUxheWVyU3RhY2subGFzdCgpLnJlbmRlclRhcmdldC0+QmVnaW5EcmF3KCk7Ci0g
ICAgbV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmxhc3QoKS5yZW5kZXJUYXJnZXQtPkNsZWFyKEQy
RDE6OkNvbG9yRigwLCAwLCAwLCAwKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdp
blBsYXRmb3JtVHJhbnNwYXJlbmN5TGF5ZXIoZmxvYXQgb3BhY2l0eSkKQEAgLTE0MzMsMzggKzc3
NywxMiBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5QbGF0Zm9ybVRyYW5zCiAKICAgICBt
X3N0YXRlLmFscGhhID0gb3BhY2l0eTsKIAotICAgIG1fZGF0YS0+YmVnaW5UcmFuc3BhcmVuY3lM
YXllcihvcGFjaXR5KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERp
cmVjdDJEOjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKCpwbGF0Zm9ybUNvbnRleHQoKSwgb3BhY2l0
eSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjplbmRUcmFuc3Bh
cmVuY3lMYXllcigpCiB7Ci0gICAgYXV0byBjdXJyZW50TGF5ZXIgPSBtX3RyYW5zcGFyZW5jeUxh
eWVyU3RhY2sudGFrZUxhc3QoKTsKLSAgICBhdXRvIHJlbmRlclRhcmdldCA9IGN1cnJlbnRMYXll
ci5yZW5kZXJUYXJnZXQ7Ci0gICAgaWYgKCFyZW5kZXJUYXJnZXQpCi0gICAgICAgIHJldHVybjsK
LQotICAgIEhSRVNVTFQgaHIgPSByZW5kZXJUYXJnZXQtPkVuZERyYXcoKTsKLSAgICBSRUxFQVNF
X0FTU0VSVChTVUNDRUVERUQoaHIpKTsKLQotICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gYml0bWFw
OwotICAgIGhyID0gcmVuZGVyVGFyZ2V0LT5HZXRCaXRtYXAoJmJpdG1hcCk7Ci0gICAgUkVMRUFT
RV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Ci0KLSAgICBhdXRvIGNvbnRleHQgPSB0aGlzLT5yZW5k
ZXJUYXJnZXQoKTsKLQotICAgIGlmIChjdXJyZW50TGF5ZXIuaGFzU2hhZG93KQotICAgICAgICBk
cmF3V2l0aFNoYWRvd0hlbHBlcihjb250ZXh0LCBiaXRtYXAuZ2V0KCksIGN1cnJlbnRMYXllci5z
aGFkb3dDb2xvciwgY3VycmVudExheWVyLnNoYWRvd09mZnNldCwgY3VycmVudExheWVyLnNoYWRv
d0JsdXIpOwotICAgIGVsc2UgewotICAgICAgICBDT01QdHI8SUQyRDFCaXRtYXBCcnVzaD4gYml0
bWFwQnJ1c2g7Ci0gICAgICAgIGF1dG8gYml0bWFwQnJ1c2hQcm9wZXJ0aWVzID0gRDJEMTo6Qml0
bWFwQnJ1c2hQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGF1dG8gYnJ1c2hQcm9wZXJ0aWVzID0gRDJE
MTo6QnJ1c2hQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIEhSRVNVTFQgaHIgPSBjb250ZXh0LT5DcmVh
dGVCaXRtYXBCcnVzaChiaXRtYXAuZ2V0KCksIGJpdG1hcEJydXNoUHJvcGVydGllcywgYnJ1c2hQ
cm9wZXJ0aWVzLCAmYml0bWFwQnJ1c2gpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVE
RUQoaHIpKTsKLQotICAgICAgICBhdXRvIHNpemUgPSBiaXRtYXAtPkdldFNpemUoKTsKLSAgICAg
ICAgYXV0byByZWN0SW5ESVAgPSBEMkQxOjpSZWN0RigwLCAwLCBzaXplLndpZHRoLCBzaXplLmhl
aWdodCk7Ci0gICAgICAgIGNvbnRleHQtPkZpbGxSZWN0YW5nbGUocmVjdEluRElQLCBiaXRtYXBC
cnVzaC5nZXQoKSk7Ci0gICAgfQogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZW5kUGxhdGZv
cm1UcmFuc3BhcmVuY3lMYXllcigpCkBAIC0xNDcyLDcgKzc5MCw4IEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0OjplbmRQbGF0Zm9ybVRyYW5zcGEKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQog
ICAgICAgICByZXR1cm47CiAKLSAgICBtX2RhdGEtPmVuZFRyYW5zcGFyZW5jeUxheWVyKCk7Cisg
ICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6ZW5kVHJhbnNw
YXJlbmN5TGF5ZXIoKnBsYXRmb3JtQ29udGV4dCgpKTsKIAogICAgIEFTU0VSVCghbV9pbXBsKTsK
IApAQCAtMTUwNiw3ICs4MjUsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1T
dHJva2VTCiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAgICAgcmV0dXJuOwogCi0g
ICAgbV9kYXRhLT5zZXRTdHJva2VTdHlsZShzdHlsZSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3Jt
Q29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6U3RhdGU6OnNldFN0cm9rZVN0eWxlKCpwbGF0Zm9y
bUNvbnRleHQoKSwgc3R5bGUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TWl0ZXJM
aW1pdChmbG9hdCBsaW1pdCkKQEAgLTE1MjAsNyArODQwLDggQEAgdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OnNldE1pdGVyTGltaXQoZmxvYQogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbV9k
YXRhLT5zZXRNaXRlckxpbWl0KGxpbWl0KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0
KCkpOworICAgIERpcmVjdDJEOjpzZXRNaXRlckxpbWl0KCpwbGF0Zm9ybUNvbnRleHQoKSwgbGlt
aXQpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJSZWN0KGNvbnN0IEZsb2F0UmVj
dCYgcmVjdCkKQEAgLTE1MzMsMjMgKzg1NCw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGVh
clJlY3QoY29uc3QgRmwKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGRyYXdXaXRob3V0
U2hhZG93KHJlY3QsIFt0aGlzLCByZWN0XShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0
KSB7Ci0gICAgICAgIEZsb2F0UmVjdCByZW5kZXJUYXJnZXRSZWN0KEZsb2F0UG9pbnQoKSwgcmVu
ZGVyVGFyZ2V0LT5HZXRTaXplKCkpOwotICAgICAgICBGbG9hdFJlY3QgcmVjdFRvQ2xlYXIocmVj
dCk7Ci0KLSAgICAgICAgaWYgKHJlY3RUb0NsZWFyLmNvbnRhaW5zKHJlbmRlclRhcmdldFJlY3Qp
KSB7Ci0gICAgICAgICAgICByZW5kZXJUYXJnZXQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotICAg
ICAgICAgICAgcmVuZGVyVGFyZ2V0LT5DbGVhcihEMkQxOjpDb2xvckYoMCwgMCwgMCwgMCkpOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyZWN0VG9DbGVh
ci5pbnRlcnNlY3RzKHJlbmRlclRhcmdldFJlY3QpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0g
ICAgICAgIHJlbmRlclRhcmdldC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0gICAgICAgIHJlY3RU
b0NsZWFyLmludGVyc2VjdChyZW5kZXJUYXJnZXRSZWN0KTsKLSAgICAgICAgcmVuZGVyVGFyZ2V0
LT5GaWxsUmVjdGFuZ2xlKHJlY3RUb0NsZWFyLCBicnVzaFdpdGhDb2xvcihDb2xvcihEMkQxOjpD
b2xvckYoMCwgMCwgMCwgMCkpKSk7Ci0gICAgfSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29u
dGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6Y2xlYXJSZWN0KCpwbGF0Zm9ybUNvbnRleHQoKSwgcmVj
dCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VSZWN0KGNvbnN0IEZsb2F0UmVj
dCYgcmVjdCwgZmxvYXQgbGluZVdpZHRoKQpAQCAtMTU2MiwyOSArODY4LDEwIEBAIHZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpzdHJva2VSZWN0KGNvbnN0IEYKICAgICAgICAgcmV0dXJuOwogICAgIH0K
IAotICAgIGlmIChtX3N0YXRlLnN0cm9rZUdyYWRpZW50KSB7Ci0gICAgICAgIFdURjo6RnVuY3Rp
b248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiBkcmF3RnVuY3Rpb24gPSBbdGhpcywgcmVjdCwg
bGluZVdpZHRoXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAgICAg
ICByZW5kZXJUYXJnZXQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotICAgICAgICAgICAgY29uc3Qg
RDJEMV9SRUNUX0YgZDJkUmVjdCA9IHJlY3Q7Ci0gICAgICAgICAgICByZW5kZXJUYXJnZXQtPkRy
YXdSZWN0YW5nbGUoJmQyZFJlY3QsIG1fc3RhdGUuc3Ryb2tlR3JhZGllbnQtPmNyZWF0ZVBsYXRm
b3JtR3JhZGllbnRJZk5lY2Vzc2FyeShyZW5kZXJUYXJnZXQpLCBsaW5lV2lkdGgsIG1fZGF0YS0+
c3Ryb2tlU3R5bGUoKSk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgKGhhc1NoYWRvdygpKQot
ICAgICAgICAgICAgZHJhd1dpdGhTaGFkb3cocmVjdCwgZHJhd0Z1bmN0aW9uKTsKLSAgICAgICAg
ZWxzZQotICAgICAgICAgICAgZHJhd1dpdGhvdXRTaGFkb3cocmVjdCwgZHJhd0Z1bmN0aW9uKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtX3N0YXRlLnN0cm9rZVBhdHRlcm4p
Ci0gICAgICAgIGFwcGx5U3Ryb2tlUGF0dGVybigpOwotCi0gICAgZHJhd1dpdGhvdXRTaGFkb3co
cmVjdCwgW3RoaXMsIHJlY3QsIGxpbmVXaWR0aF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRh
cmdldCkgewotICAgICAgICByZW5kZXJUYXJnZXQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotICAg
ICAgICBjb25zdCBEMkQxX1JFQ1RfRiBkMmRSZWN0ID0gcmVjdDsKLSAgICAgICAgYXV0byBicnVz
aCA9IG1fc3RhdGUuc3Ryb2tlUGF0dGVybiA/IHBhdHRlcm5TdHJva2VCcnVzaCgpIDogc29saWRT
dHJva2VCcnVzaCgpOwotICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdSZWN0YW5nbGUoJmQyZFJl
Y3QsIGJydXNoLCBsaW5lV2lkdGgsIG1fZGF0YS0+c3Ryb2tlU3R5bGUoKSk7Ci0gICAgfSk7Cisg
ICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0ZSA9IHRoaXMt
PnN0YXRlKCk7CisgICAgYXV0byYgY29udGV4dCA9ICpwbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBE
aXJlY3QyRDo6c3Ryb2tlUmVjdChjb250ZXh0LCByZWN0LCBsaW5lV2lkdGgsIERpcmVjdDJEOjpT
dHJva2VTb3VyY2Uoc3RhdGUsIGNvbnRleHQpLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoc3RhdGUp
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExpbmVDYXAoTGluZUNhcCBjYXApCkBA
IC0xNTk3LDcgKzg4NCw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lQ2FwKExpbmVD
YXAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1fZGF0YS0+c2V0TGluZUNhcChjYXAp
OworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OnNldExp
bmVDYXAoKnBsYXRmb3JtQ29udGV4dCgpLCBjYXApOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDo6c2V0TGluZURhc2goY29uc3QgRGFzaEFycmF5JiBkYXNoZXMsIGZsb2F0IGRhc2hPZmZzZXQp
CkBAIC0xNjE4LDggKzkwNiw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lRGFzaChj
b25zdAogICAgICAgICAgICAgZGFzaE9mZnNldCA9IGZtb2QoZGFzaE9mZnNldCwgbGVuZ3RoKSAr
IGxlbmd0aDsKICAgICB9CiAKLSAgICBtX2RhdGEtPnNldERhc2hlcyhkYXNoZXMpOwotICAgIG1f
ZGF0YS0+c2V0RGFzaE9mZnNldChkYXNoT2Zmc2V0KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1D
b250ZXh0KCkpOworICAgIERpcmVjdDJEOjpzZXRMaW5lRGFzaCgqcGxhdGZvcm1Db250ZXh0KCks
IGRhc2hlcywgZGFzaE9mZnNldCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5l
Sm9pbihMaW5lSm9pbiBqb2luKQpAQCAtMTYzMiw3ICs5MjAsOCBAQCB2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2V0TGluZUpvaW4oTGluZUpvCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBt
X2RhdGEtPnNldExpbmVKb2luKGpvaW4pOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQo
KSk7CisgICAgRGlyZWN0MkQ6OnNldExpbmVKb2luKCpwbGF0Zm9ybUNvbnRleHQoKSwgam9pbik7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpjYW52YXNDbGlwKGNvbnN0IFBhdGgmIHBhdGgs
IFdpbmRSdWxlIGZpbGxSdWxlKQpAQCAtMTY1MCw3ICs5MzksOCBAQCB2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2NhbGUoY29uc3QgRmxvYXRTCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBt
X2RhdGEtPnNjYWxlKHNpemUpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7Cisg
ICAgRGlyZWN0MkQ6OnNjYWxlKCpwbGF0Zm9ybUNvbnRleHQoKSwgc2l6ZSk7CiAgICAgLy8gRklY
TUU6IG1fZGF0YS0+bV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eSA9IGZh
bHNlOwogfQogCkBAIC0xNjY0LDcgKzk1NCw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpyb3Rh
dGUoZmxvYXQgYW5nbGUKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1fZGF0YS0+cm90
YXRlKGFuZ2xlKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVj
dDJEOjpyb3RhdGUoKnBsYXRmb3JtQ29udGV4dCgpLCBhbmdsZSk7CiAgICAgLy8gRklYTUU6IG1f
ZGF0YS0+bV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eSA9IGZhbHNlOwog
fQogCkBAIC0xNjc4LDcgKzk2OSw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGUo
ZmxvYXQgeCwKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1fZGF0YS0+dHJhbnNsYXRl
KHgsIHkpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6
OnRyYW5zbGF0ZSgqcGxhdGZvcm1Db250ZXh0KCksIHgsIHkpOwogICAgIC8vIEZJWE1FOiBtX2Rh
dGEtPm1fdXNlclRvRGV2aWNlVHJhbnNmb3JtS25vd25Ub0JlSWRlbnRpdHkgPSBmYWxzZTsKIH0K
IApAQCAtMTY5Miw3ICs5ODQsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNv
bnN0IEFmCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtX2RhdGEtPmNvbmNhdENUTSh0
cmFuc2Zvcm0pOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0
MkQ6OmNvbmNhdENUTSgqcGxhdGZvcm1Db250ZXh0KCksIHRyYW5zZm9ybSk7CiAgICAgLy8gRklY
TUU6IG1fZGF0YS0+bV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eSA9IGZh
bHNlOwogfQogCkBAIC0xNzA2LDcgKzk5OSw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRD
VE0oY29uc3QgQWZmaW4KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1fZGF0YS0+c2V0
Q1RNKHRyYW5zZm9ybSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBE
aXJlY3QyRDo6U3RhdGU6OnNldENUTSgqcGxhdGZvcm1Db250ZXh0KCksIHRyYW5zZm9ybSk7CiAg
ICAgLy8gRklYTUU6IG1fZGF0YS0+bV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVu
dGl0eSA9IGZhbHNlOwogfQogCkBAIC0xNzE1LDE0ICsxMDA5LDExIEBAIEFmZmluZVRyYW5zZm9y
bSBHcmFwaGljc0NvbnRleHQ6OmdldENUTSgKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQog
ICAgICAgICByZXR1cm4gQWZmaW5lVHJhbnNmb3JtKCk7CiAKLSAgICBpZiAobV9pbXBsKSB7Ci0g
ICAgICAgIFdURkxvZ0Fsd2F5cygiR3JhcGhpY3NDb250ZXh0OjpnZXRDVE0oKSBpcyBub3QgeWV0
IGNvbXBhdGlibGUgd2l0aCByZWNvcmRpbmcgY29udGV4dHMuIik7Ci0gICAgICAgIHJldHVybiBB
ZmZpbmVUcmFuc2Zvcm0oKTsKLSAgICB9CisgICAgaWYgKG1faW1wbCkKKyAgICAgICAgcmV0dXJu
IG1faW1wbC0+Z2V0Q1RNKGluY2x1ZGVTY2FsZSk7CiAKLSAgICBEMkQxX01BVFJJWF8zWDJfRiBj
dXJyZW50VHJhbnNmb3JtOwotICAgIHBsYXRmb3JtQ29udGV4dCgpLT5HZXRUcmFuc2Zvcm0oJmN1
cnJlbnRUcmFuc2Zvcm0pOwotICAgIHJldHVybiBjdXJyZW50VHJhbnNmb3JtOworICAgIEFTU0VS
VChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgcmV0dXJuIERpcmVjdDJEOjpTdGF0ZTo6Z2V0
Q1RNKCpwbGF0Zm9ybUNvbnRleHQoKSk7CiB9CiAKIEZsb2F0UmVjdCBHcmFwaGljc0NvbnRleHQ6
OnJvdW5kVG9EZXZpY2VQaXhlbHMoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBSb3VuZGluZ01vZGUg
cm91bmRpbmdNb2RlKQpAQCAtMTczMCwxNCArMTAyMSwxMCBAQCBGbG9hdFJlY3QgR3JhcGhpY3ND
b250ZXh0Ojpyb3VuZFRvRGV2aWNlCiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAg
ICAgcmV0dXJuIHJlY3Q7CiAKLSAgICBpZiAobV9pbXBsKSB7Ci0gICAgICAgIFdURkxvZ0Fsd2F5
cygiR3JhcGhpY3NDb250ZXh0Ojpyb3VuZFRvRGV2aWNlUGl4ZWxzKCkgaXMgbm90IHlldCBjb21w
YXRpYmxlIHdpdGggcmVjb3JkaW5nIGNvbnRleHRzLiIpOwotICAgICAgICByZXR1cm4gcmVjdDsK
LSAgICB9Ci0KLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIGlmIChtX2ltcGwpCisgICAgICAg
IHJldHVybiBtX2ltcGwtPnJvdW5kVG9EZXZpY2VQaXhlbHMocmVjdCwgcm91bmRpbmdNb2RlKTsK
IAotICAgIHJldHVybiByZWN0OworICAgIHJldHVybiBEaXJlY3QyRDo6U3RhdGU6OnJvdW5kVG9E
ZXZpY2VQaXhlbHMoKnBsYXRmb3JtQ29udGV4dCgpLCByZWN0KTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmRyYXdMaW5lRm9yVGV4dChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGJvb2wgcHJp
bnRpbmcsIGJvb2wgZG91YmxlTGluZXMsIFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlKQpAQCAtMTc0
OCwxOSArMTAzNSwyMSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JUZXh0KGNv
CiAgICAgZHJhd0xpbmVzRm9yVGV4dChyZWN0LmxvY2F0aW9uKCksIHJlY3QuaGVpZ2h0KCksIHdp
ZHRocywgcHJpbnRpbmcsIGRvdWJsZUxpbmVzLCBzdHJva2VTdHlsZSk7CiB9CiAKLXZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpkcmF3TGluZXNGb3JUZXh0KGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBm
bG9hdCB0aGlja25lc3MsIGNvbnN0IERhc2hBcnJheSYgd2lkdGhzLCBib29sIHByaW50aW5nLCBi
b29sIGRvdWJsZUxpbmVzLCBTdHJva2VTdHlsZSBzdHJva2VTdHlsZSkKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpkcmF3TGluZXNGb3JUZXh0KGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBmbG9hdCB0
aGlja25lc3MsIGNvbnN0IERhc2hBcnJheSYgd2lkdGhzLCBib29sIHByaW50aW5nLCBib29sIGRv
dWJsZVVuZGVybGluZXMsIFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlKQogewogICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKIAogICAgIGlmICghd2lkdGhzLnNpemUo
KSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgaWYgKG1faW1wbCkgewotICAgICAgICBtX2ltcGwt
PmRyYXdMaW5lc0ZvclRleHQocG9pbnQsIHRoaWNrbmVzcywgd2lkdGhzLCBwcmludGluZywgZG91
YmxlTGluZXMpOworICAgICAgICBtX2ltcGwtPmRyYXdMaW5lc0ZvclRleHQocG9pbnQsIHRoaWNr
bmVzcywgd2lkdGhzLCBwcmludGluZywgZG91YmxlVW5kZXJsaW5lcyk7CiAgICAgICAgIHJldHVy
bjsKICAgICB9CiAKLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIEFTU0VSVChoYXNQbGF0Zm9y
bUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OmRyYXdMaW5lc0ZvclRleHQoKnBsYXRmb3JtQ29u
dGV4dCgpLCBwb2ludCwgdGhpY2tuZXNzLCB3aWR0aHMsIHByaW50aW5nLCBkb3VibGVVbmRlcmxp
bmVzLCBtX3N0YXRlLnN0cm9rZUNvbG9yKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNl
dFVSTEZvclJlY3QoY29uc3QgVVJMJiBsaW5rLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0KQpA
QCAtMTg0NSwxMyArMTEzNCw4IEBAIGJvb2wgR3JhcGhpY3NDb250ZXh0Ojppc0FjY2VsZXJhdGVk
Q29udGUKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1cm4gZmFsc2U7
CiAKLSAgICAvLyBGSVhNRQotICAgIGlmIChtX2ltcGwpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgcHJvYmFiYWx5IG5vdCBuZWVkZWQuCi0gICAgbm90
SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgQVNTRVJUKGhhc1BsYXRmb3Jt
Q29udGV4dCgpKTsKKyAgICByZXR1cm4gRGlyZWN0MkQ6OlN0YXRlOjppc0FjY2VsZXJhdGVkQ29u
dGV4dCgqcGxhdGZvcm1Db250ZXh0KCkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0
UGxhdGZvcm1UZXh0RHJhd2luZ01vZGUoVGV4dERyYXdpbmdNb2RlRmxhZ3MgbW9kZSkKQEAgLTE4
NjMsMTAgKzExNDcsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1UZXh0RHJh
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VDb2xvcihjb25zdCBDb2xv
ciYgY29sb3IpCiB7CiAgICAgQVNTRVJUKG1fc3RhdGUuc3Ryb2tlQ29sb3IgPT0gY29sb3IpOwot
Ci0gICAgbV9kYXRhLT5tX3NvbGlkU3Ryb2tlQnJ1c2ggPSBudWxscHRyOwotCi0gICAgbV9kYXRh
LT5tX3NvbGlkU3Ryb2tlQnJ1c2ggPSBicnVzaFdpdGhDb2xvcihzdHJva2VDb2xvcigpKTsKKyAg
ICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5t
X3NvbGlkU3Ryb2tlQnJ1c2ggPSBicnVzaFdpdGhDb2xvcihzdHJva2VDb2xvcigpKTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlVGhpY2tuZXNzKGZsb2F0IHRo
aWNrbmVzcykKQEAgLTE4NzgsMTAgKzExNjAsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0
UGxhdGZvcm1TdHJva2VUCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1GaWxsQ29s
b3IoY29uc3QgQ29sb3ImIGNvbG9yKQogewogICAgIEFTU0VSVChtX3N0YXRlLmZpbGxDb2xvciA9
PSBjb2xvcik7Ci0KLSAgICBtX2RhdGEtPm1fc29saWRGaWxsQnJ1c2ggPSBudWxscHRyOwotCi0g
ICAgbV9kYXRhLT5tX3NvbGlkRmlsbEJydXNoID0gYnJ1c2hXaXRoQ29sb3IoZmlsbENvbG9yKCkp
OworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgcGxhdGZvcm1Db250ZXh0
KCktPm1fc29saWRGaWxsQnJ1c2ggPSBicnVzaFdpdGhDb2xvcihmaWxsQ29sb3IoKSk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNob3VsZEFudGlhbGlhcyhib29sIGVu
YWJsZSkKQEAgLTE4OTAsOSArMTE3MCw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0
Zm9ybVNob3VsZEEKICAgICAgICAgcmV0dXJuOwogCiAgICAgQVNTRVJUKCFtX2ltcGwpOwotCi0g
ICAgYXV0byBhbnRpYWxpYXNNb2RlID0gZW5hYmxlID8gRDJEMV9BTlRJQUxJQVNfTU9ERV9QRVJf
UFJJTUlUSVZFIDogRDJEMV9BTlRJQUxJQVNfTU9ERV9BTElBU0VEOwotICAgIHBsYXRmb3JtQ29u
dGV4dCgpLT5TZXRBbnRpYWxpYXNNb2RlKGFudGlhbGlhc01vZGUpOworICAgIEFTU0VSVChoYXNQ
bGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OlN0YXRlOjpzZXRTaG91bGRBbnRpYWxp
YXMoKnBsYXRmb3JtQ29udGV4dCgpLCBlbmFibGUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDo6c2V0UGxhdGZvcm1TaG91bGRTbW9vdGhGb250cyhib29sIGVuYWJsZSkKQEAgLTE5MDMsNyAr
MTE4Miw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNob3VsZFMKICAgICBB
U1NFUlQoIW1faW1wbCk7CiAKICAgICBhdXRvIGZvbnRTbW9vdGhpbmdNb2RlID0gZW5hYmxlID8g
RDJEMV9URVhUX0FOVElBTElBU19NT0RFX0NMRUFSVFlQRSA6IEQyRDFfVEVYVF9BTlRJQUxJQVNf
TU9ERV9BTElBU0VEOwotICAgIHBsYXRmb3JtQ29udGV4dCgpLT5TZXRUZXh0QW50aWFsaWFzTW9k
ZShmb250U21vb3RoaW5nTW9kZSk7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPnJlbmRlclRhcmdl
dCgpLT5TZXRUZXh0QW50aWFsaWFzTW9kZShmb250U21vb3RoaW5nTW9kZSk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybUFscGhhKGZsb2F0IGFscGhhKQpAQCAtMTkxNSwx
MjEgKzExOTQsMTUgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtQWxwaGEoZgog
ICAgIG1fZGF0YS0+c2V0QWxwaGEoYWxwaGEpOwogfQogCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0UGxhdGZvcm1Db21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRlT3BlcmF0b3IgbW9kZSwgQmxl
bmRNb2RlIGJsZW5kTW9kZSkKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybUNvbXBv
c2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcGVyYXRvciwgQmxlbmRN
b2RlIGJsZW5kTW9kZSkKIHsKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICBy
ZXR1cm47CiAKICAgICBBU1NFUlQoIW1faW1wbCk7CiAKLSAgICBEMkQxX0JMRU5EX01PREUgdGFy
Z2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX1NDUkVFTjsKLSAgICBEMkQxX0NPTVBPU0lU
RV9NT0RFIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX1NPVVJDRV9B
VE9QOyAvLyA/Pz8KLQotICAgIGlmIChibGVuZE1vZGUgIT0gQmxlbmRNb2RlOjpOb3JtYWwpIHsK
LSAgICAgICAgc3dpdGNoIChibGVuZE1vZGUpIHsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6Ok11
bHRpcGx5OgotICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX01V
TFRJUExZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpTY3Jl
ZW46Ci0gICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfU0NSRUVO
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpPdmVybGF5Ogot
ICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX09WRVJMQVk7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OkRhcmtlbjoKLSAgICAg
ICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9EQVJLRU47Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OkxpZ2h0ZW46Ci0gICAgICAgICAg
ICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfTElHSFRFTjsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6Q29sb3JEb2RnZToKLSAgICAgICAgICAg
IHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DT0xPUl9ET0RHRTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6Q29sb3JCdXJuOgotICAgICAgICAg
ICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0NPTE9SX0JVUk47Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OkhhcmRMaWdodDoKLSAgICAgICAg
ICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9IQVJEX0xJR0hUOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpTb2Z0TGlnaHQ6Ci0gICAgICAg
ICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfU09GVF9MSUdIVDsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6RGlmZmVyZW5jZToKLSAgICAg
ICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9ESUZGRVJFTkNFOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpFeGNsdXNpb246Ci0gICAg
ICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfRVhDTFVTSU9OOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpIdWU6Ci0gICAgICAgICAg
ICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfSFVFOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpTYXR1cmF0aW9uOgotICAgICAgICAgICAgdGFy
Z2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX1NBVFVSQVRJT047Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OkNvbG9yOgotICAgICAgICAgICAgdGFyZ2V0
QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0NPTE9SOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgQmxlbmRNb2RlOjpMdW1pbm9zaXR5OgotICAgICAgICAgICAgdGFyZ2V0Qmxl
bmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0xVTUlOT1NJVFk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OlBsdXNEYXJrZXI6Ci0gICAgICAgICAgICB0YXJnZXRC
bGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfREFSS0VSX0NPTE9SOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpQbHVzTGlnaHRlcjoKLSAgICAgICAgICAgIHRh
cmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9MSUdIVEVSX0NPTE9SOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
fQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIENv
bXBvc2l0ZUNsZWFyOgotICAgICAgICAgICAgLy8gRklYTUU6IHRhcmdldEJsZW5kTW9kZSA9IEQy
RDFfQkxFTkRfTU9ERV9DTEVBUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENv
bXBvc2l0ZUNvcHk6Ci0gICAgICAgICAgICAvLyBGSVhNRTogdGFyZ2V0QmxlbmRNb2RlID0gRDJE
MV9CTEVORF9NT0RFX0NPUFk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb21w
b3NpdGVTb3VyY2VPdmVyOgotICAgICAgICAgICAgLy8gRklYTUU6IGtDR0JsZW5kTW9kZU5vcm1h
bAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlU291cmNlSW46Ci0g
ICAgICAgICAgICB0YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9TT1VS
Q0VfSU47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VP
dXQ6Ci0gICAgICAgICAgICB0YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9E
RV9TT1VSQ0VfT1VUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRl
U291cmNlQXRvcDoKLSAgICAgICAgICAgIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBP
U0lURV9NT0RFX1NPVVJDRV9BVE9QOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ug
Q29tcG9zaXRlRGVzdGluYXRpb25PdmVyOgotICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9k
ZSA9IEQyRDFfQ09NUE9TSVRFX01PREVfREVTVElOQVRJT05fT1ZFUjsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uSW46Ci0gICAgICAgICAgICB0
YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9ERVNUSU5BVElPTl9JTjsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uT3V0
OgotICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRFX01PREVf
REVTVElOQVRJT05fT1VUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29tcG9z
aXRlRGVzdGluYXRpb25BdG9wOgotICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQy
RDFfQ09NUE9TSVRFX01PREVfREVTVElOQVRJT05fQVRPUDsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIENvbXBvc2l0ZVhPUjoKLSAgICAgICAgICAgIHRhcmdldENvbXBvc2l0ZU1v
ZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX1hPUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlIENvbXBvc2l0ZVBsdXNEYXJrZXI6Ci0gICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUg
PSBEMkQxX0JMRU5EX01PREVfREFSS0VSX0NPTE9SOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgQ29tcG9zaXRlUGx1c0xpZ2h0ZXI6Ci0gICAgICAgICAgICB0YXJnZXRCbGVuZE1v
ZGUgPSBEMkQxX0JMRU5EX01PREVfTElHSFRFUl9DT0xPUjsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIENvbXBvc2l0ZURpZmZlcmVuY2U6Ci0gICAgICAgICAgICB0YXJnZXRCbGVu
ZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfRElGRkVSRU5DRTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgbV9kYXRhLT5tX2JsZW5kTW9kZSA9IHRhcmdldEJsZW5k
TW9kZTsKLSAgICBtX2RhdGEtPm1fY29tcG9zaXRlTW9kZSA9IHRhcmdldENvbXBvc2l0ZU1vZGU7
CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6U3RhdGU6
OnNldENvbXBvc2l0ZU9wZXJhdGlvbigqcGxhdGZvcm1Db250ZXh0KCksIGNvbXBvc2l0ZU9wZXJh
dG9yLCBibGVuZE1vZGUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1BcHBs
eURldmljZVNjYWxlRmFjdG9yKGZsb2F0IGRldmljZVNjYWxlRmFjdG9yKQpAQCAtMjA1MCwxMyAr
MTIyMyw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybUZpbGxFbGxpcHMKICAgICAg
ICAgcmV0dXJuOwogICAgIH0KIAotICAgIGF1dG8gZDJkRWxsaXBzZSA9IEQyRDE6OkVsbGlwc2Uo
ZWxsaXBzZS5jZW50ZXIoKSwgMC41ICogZWxsaXBzZS53aWR0aCgpLCAwLjUgKiBlbGxpcHNlLmhl
aWdodCgpKTsKLQotICAgIHBsYXRmb3JtQ29udGV4dCgpLT5TZXRUYWdzKDEsIF9fTElORV9fKTsK
LQotICAgIGRyYXdXaXRob3V0U2hhZG93KGVsbGlwc2UsIFt0aGlzLCBkMmRFbGxpcHNlXShJRDJE
MVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAgIHJlbmRlclRhcmdldC0+Rmls
bEVsbGlwc2UoJmQyZEVsbGlwc2UsIHNvbGlkRmlsbEJydXNoKCkpOwotICAgIH0pOworICAgIEFT
U0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OmZpbGxFbGxpcHNlKCpw
bGF0Zm9ybUNvbnRleHQoKSwgZWxsaXBzZSwgbV9zdGF0ZS5maWxsQ29sb3IsIG1fc3RhdGUuc3Ry
b2tlU3R5bGUsIG1fc3RhdGUuc3Ryb2tlQ29sb3IsIG1fc3RhdGUuc3Ryb2tlVGhpY2tuZXNzKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtU3Ryb2tlRWxsaXBzZShjb25zdCBG
bG9hdFJlY3QmIGVsbGlwc2UpCkBAIC0yMDcyLDEzICsxMjQwLDggQEAgdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnBsYXRmb3JtU3Ryb2tlRWxsaQogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAg
YXV0byBkMmRFbGxpcHNlID0gRDJEMTo6RWxsaXBzZShlbGxpcHNlLmNlbnRlcigpLCAwLjUgKiBl
bGxpcHNlLndpZHRoKCksIDAuNSAqIGVsbGlwc2UuaGVpZ2h0KCkpOwotCi0gICAgcGxhdGZvcm1D
b250ZXh0KCktPlNldFRhZ3MoMSwgX19MSU5FX18pOwotCi0gICAgZHJhd1dpdGhvdXRTaGFkb3co
ZWxsaXBzZSwgW3RoaXMsIGQyZEVsbGlwc2VdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJn
ZXQpIHsKLSAgICAgICAgcmVuZGVyVGFyZ2V0LT5EcmF3RWxsaXBzZSgmZDJkRWxsaXBzZSwgc29s
aWRTdHJva2VCcnVzaCgpLCBzdHJva2VUaGlja25lc3MoKSwgbV9kYXRhLT5zdHJva2VTdHlsZSgp
KTsKLSAgICB9KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVj
dDJEOjpkcmF3RWxsaXBzZSgqcGxhdGZvcm1Db250ZXh0KCksIGVsbGlwc2UsIG1fc3RhdGUuc3Ry
b2tlU3R5bGUsIG1fc3RhdGUuc3Ryb2tlQ29sb3IsIG1fc3RhdGUuc3Ryb2tlVGhpY2tuZXNzKTsK
IH0KIAogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBo
aWNzQ29udGV4dEltcGxEaXJlY3QyRC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRC5jcHAJKG5v
bmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBo
aWNzQ29udGV4dEltcGxEaXJlY3QyRC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MTMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRC5oIgor
CisjaWYgVVNFKERJUkVDVDJEKQorCisjaW5jbHVkZSAiRGlyZWN0MkRPcGVyYXRpb25zLmgiCisj
aW5jbHVkZSAiRmxvYXRSb3VuZGVkUmVjdC5oIgorI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRl
ICJHbHlwaEJ1ZmZlci5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUg
IkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURpcmVjdDJELmgiCisjaW5jbHVkZSAiSW1h
Z2VCdWZmZXIuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50
ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK0dyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0SW1wbEZhY3Rvcnkg
R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpjcmVhdGVGYWN0b3J5KFBsYXRmb3JtQ29udGV4
dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQpCit7CisgICAgcmV0dXJuIEdyYXBoaWNzQ29udGV4
dDo6R3JhcGhpY3NDb250ZXh0SW1wbEZhY3RvcnkoCisgICAgICAgIFsmcGxhdGZvcm1Db250ZXh0
XShHcmFwaGljc0NvbnRleHQmIGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVy
biBzdGQ6Om1ha2VfdW5pcXVlPEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRD4oY29udGV4dCwg
cGxhdGZvcm1Db250ZXh0KTsKKyAgICAgICAgfSk7Cit9CisKK0dyYXBoaWNzQ29udGV4dDo6R3Jh
cGhpY3NDb250ZXh0SW1wbEZhY3RvcnkgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpjcmVh
dGVGYWN0b3J5KElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpCit7CisgICAgcmV0dXJu
IEdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0SW1wbEZhY3RvcnkoCisgICAgICAgIFty
ZW5kZXJUYXJnZXRdKEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCkKKyAgICAgICAgeworICAgICAg
ICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJE
Pihjb250ZXh0LCByZW5kZXJUYXJnZXQpOworICAgICAgICB9KTsKK30KKworR3JhcGhpY3NDb250
ZXh0SW1wbERpcmVjdDJEOjpHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQoR3JhcGhpY3NDb250
ZXh0JiBjb250ZXh0LCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0KQor
ICAgIDogR3JhcGhpY3NDb250ZXh0SW1wbChjb250ZXh0LCBGbG9hdFJlY3QgeyB9LCBBZmZpbmVU
cmFuc2Zvcm0geyB9KQorICAgICwgbV9wbGF0Zm9ybUNvbnRleHQocGxhdGZvcm1Db250ZXh0KQor
ICAgICwgbV9wcml2YXRlKHN0ZDo6bWFrZV91bmlxdWU8R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlPihtX3BsYXRmb3JtQ29udGV4dCwgR3JhcGhpY3NDb250ZXh0OjpCaXRtYXBSZW5kZXJp
bmdDb250ZXh0VHlwZTo6R1BVTWVtb3J5KSkKK3sKKyAgICBtX3BsYXRmb3JtQ29udGV4dC5zZXRH
cmFwaGljc0NvbnRleHRQcml2YXRlKG1fcHJpdmF0ZS5nZXQoKSk7CisgICAgbV9wcml2YXRlLT5z
eW5jQ29udGV4dChtX3BsYXRmb3JtQ29udGV4dCk7Cit9CisKK0dyYXBoaWNzQ29udGV4dEltcGxE
aXJlY3QyRDo6R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEKEdyYXBoaWNzQ29udGV4dCYgY29u
dGV4dCwgSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkKKyAgICA6IEdyYXBoaWNzQ29u
dGV4dEltcGwoY29udGV4dCwgRmxvYXRSZWN0IHsgfSwgQWZmaW5lVHJhbnNmb3JtIHsgfSkKKyAg
ICAsIG1fb3duZWRQbGF0Zm9ybUNvbnRleHQoc3RkOjptYWtlX3VuaXF1ZTxQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRD4ocmVuZGVyVGFyZ2V0KSkKKyAgICAsIG1fcGxhdGZvcm1Db250ZXh0KCptX293
bmVkUGxhdGZvcm1Db250ZXh0KQorICAgICwgbV9wcml2YXRlKHN0ZDo6bWFrZV91bmlxdWU8R3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlPihtX3BsYXRmb3JtQ29udGV4dCwgR3JhcGhpY3ND
b250ZXh0OjpCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZTo6R1BVTWVtb3J5KSkKK3sKKyAgICBt
X3BsYXRmb3JtQ29udGV4dC5zZXRHcmFwaGljc0NvbnRleHRQcml2YXRlKG1fcHJpdmF0ZS5nZXQo
KSk7CisgICAgbV9wcml2YXRlLT5zeW5jQ29udGV4dChtX3BsYXRmb3JtQ29udGV4dCk7Cit9CisK
K0dyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6fkdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3Qy
RCgpCit7CisgICAgbV9wbGF0Zm9ybUNvbnRleHQuc2V0R3JhcGhpY3NDb250ZXh0UHJpdmF0ZShu
dWxscHRyKTsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6Omhhc1BsYXRm
b3JtQ29udGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1BsYXRmb3JtQ29u
dGV4dERpcmVjdDJEKiBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnBsYXRmb3JtQ29udGV4
dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuICZtX3BsYXRmb3JtQ29udGV4dDsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnVwZGF0ZVN0YXRlKGNvbnN0IEdyYXBoaWNzQ29u
dGV4dFN0YXRlJiBzdGF0ZSwgR3JhcGhpY3NDb250ZXh0U3RhdGU6OlN0YXRlQ2hhbmdlRmxhZ3Mg
ZmxhZ3MpCit7CisgICAgaWYgKGZsYWdzICYgR3JhcGhpY3NDb250ZXh0U3RhdGU6OlN0cm9rZVRo
aWNrbmVzc0NoYW5nZSkKKyAgICAgICAgRGlyZWN0MkQ6OlN0YXRlOjpzZXRTdHJva2VUaGlja25l
c3MobV9wbGF0Zm9ybUNvbnRleHQsIHN0YXRlLnN0cm9rZVRoaWNrbmVzcyk7CisKKyAgICBpZiAo
ZmxhZ3MgJiBHcmFwaGljc0NvbnRleHRTdGF0ZTo6U3Ryb2tlU3R5bGVDaGFuZ2UpCisgICAgICAg
IERpcmVjdDJEOjpTdGF0ZTo6c2V0U3Ryb2tlU3R5bGUobV9wbGF0Zm9ybUNvbnRleHQsIHN0YXRl
LnN0cm9rZVN0eWxlKTsKKworICAgIGlmIChmbGFncyAmIEdyYXBoaWNzQ29udGV4dFN0YXRlOjpT
aGFkb3dDaGFuZ2UpIHsKKyAgICAgICAgaWYgKHN0YXRlLnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1z
KSB7CisgICAgICAgICAgICAvLyBNZWFuaW5nIHRoYXQgdGhpcyBncmFwaGljcyBjb250ZXh0IGlz
IGFzc29jaWF0ZWQgd2l0aCBhIENhbnZhc1JlbmRlcmluZ0NvbnRleHQKKyAgICAgICAgICAgIC8v
IFdlIGZsaXAgdGhlIGhlaWdodCBzaW5jZSBDRyBhbmQgSFRNTDUgQ2FudmFzIGhhdmUgb3Bwb3Np
dGUgWSBheGlzCisgICAgICAgICAgICBhdXRvJiBtdXRhYmxlU3RhdGUgPSBjb25zdF9jYXN0PEdy
YXBoaWNzQ29udGV4dFN0YXRlJj4oZ3JhcGhpY3NDb250ZXh0KCkuc3RhdGUoKSk7CisgICAgICAg
ICAgICBhdXRvJiBzaGFkb3dPZmZzZXQgPSBzdGF0ZS5zaGFkb3dPZmZzZXQ7CisgICAgICAgICAg
ICBtdXRhYmxlU3RhdGUuc2hhZG93T2Zmc2V0ID0geyBzaGFkb3dPZmZzZXQud2lkdGgoKSwgLXNo
YWRvd09mZnNldC5oZWlnaHQoKSB9OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZsYWdz
ICYgR3JhcGhpY3NDb250ZXh0U3RhdGU6OkNvbXBvc2l0ZU9wZXJhdGlvbkNoYW5nZSkKKyAgICAg
ICAgRGlyZWN0MkQ6OlN0YXRlOjpzZXRDb21wb3NpdGVPcGVyYXRpb24obV9wbGF0Zm9ybUNvbnRl
eHQsIHN0YXRlLmNvbXBvc2l0ZU9wZXJhdG9yLCBzdGF0ZS5ibGVuZE1vZGUpOworCisgICAgaWYg
KGZsYWdzICYgR3JhcGhpY3NDb250ZXh0U3RhdGU6OlNob3VsZEFudGlhbGlhc0NoYW5nZSkKKyAg
ICAgICAgRGlyZWN0MkQ6OlN0YXRlOjpzZXRTaG91bGRBbnRpYWxpYXMobV9wbGF0Zm9ybUNvbnRl
eHQsIHN0YXRlLnNob3VsZEFudGlhbGlhcyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1w
bERpcmVjdDJEOjpjbGVhclNoYWRvdygpCit7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1w
bERpcmVjdDJEOjpzZXRMaW5lQ2FwKExpbmVDYXAgbGluZUNhcCkKK3sKKyAgICBEaXJlY3QyRDo6
c2V0TGluZUNhcChtX3BsYXRmb3JtQ29udGV4dCwgbGluZUNhcCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0SW1wbERpcmVjdDJEOjpzZXRMaW5lRGFzaChjb25zdCBEYXNoQXJyYXkmIGRhc2hl
cywgZmxvYXQgZGFzaE9mZnNldCkKK3sKKyAgICBEaXJlY3QyRDo6c2V0TGluZURhc2gobV9wbGF0
Zm9ybUNvbnRleHQsIGRhc2hlcywgZGFzaE9mZnNldCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0SW1wbERpcmVjdDJEOjpzZXRMaW5lSm9pbihMaW5lSm9pbiBsaW5lSm9pbikKK3sKKyAgICBE
aXJlY3QyRDo6c2V0TGluZUpvaW4obV9wbGF0Zm9ybUNvbnRleHQsIGxpbmVKb2luKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnNldE1pdGVyTGltaXQoZmxvYXQgbWl0
ZXJMaW1pdCkKK3sKKyAgICBEaXJlY3QyRDo6c2V0TWl0ZXJMaW1pdChtX3BsYXRmb3JtQ29udGV4
dCwgbWl0ZXJMaW1pdCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpm
aWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgYXV0byYgc3RhdGUgPSBncmFw
aGljc0NvbnRleHQoKS5zdGF0ZSgpOworICAgIERpcmVjdDJEOjpmaWxsUmVjdChtX3BsYXRmb3Jt
Q29udGV4dCwgcmVjdCwgRGlyZWN0MkQ6OkZpbGxTb3VyY2Uoc3RhdGUsIG1fcGxhdGZvcm1Db250
ZXh0KSwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0YXRlKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0SW1wbERpcmVjdDJEOjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0
IENvbG9yJiBjb2xvcikKK3sKKyAgICBEaXJlY3QyRDo6ZmlsbFJlY3QobV9wbGF0Zm9ybUNvbnRl
eHQsIHJlY3QsIGNvbG9yLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoZ3JhcGhpY3NDb250ZXh0KCku
c3RhdGUoKSkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZmlsbFJl
Y3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBHcmFkaWVudCYgZ3JhZGllbnQpCit7CisgICAgYXV0
byBwbGF0Zm9ybUdyYWRpZW50ID0gYWRvcHRDT00oZ3JhZGllbnQuY3JlYXRlUGxhdGZvcm1HcmFk
aWVudElmTmVjZXNzYXJ5KG1fcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpKSk7CisgICAg
aWYgKCFwbGF0Zm9ybUdyYWRpZW50KQorICAgICAgICByZXR1cm47CisKKyAgICBEaXJlY3QyRDo6
c2F2ZShtX3BsYXRmb3JtQ29udGV4dCk7CisgICAgRGlyZWN0MkQ6OmZpbGxSZWN0V2l0aEdyYWRp
ZW50KG1fcGxhdGZvcm1Db250ZXh0LCByZWN0LCBwbGF0Zm9ybUdyYWRpZW50LmdldCgpKTsKKyAg
ICBEaXJlY3QyRDo6cmVzdG9yZShtX3BsYXRmb3JtQ29udGV4dCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0SW1wbERpcmVjdDJEOjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNv
bnN0IENvbG9yJiBjb2xvciwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3BlcmF0b3IsIEJs
ZW5kTW9kZSBibGVuZE1vZGUpCit7CisgICAgYXV0byYgc3RhdGUgPSBncmFwaGljc0NvbnRleHQo
KS5zdGF0ZSgpOworICAgIENvbXBvc2l0ZU9wZXJhdG9yIHByZXZpb3VzT3BlcmF0b3IgPSBzdGF0
ZS5jb21wb3NpdGVPcGVyYXRvcjsKKworICAgIERpcmVjdDJEOjpTdGF0ZTo6c2V0Q29tcG9zaXRl
T3BlcmF0aW9uKG1fcGxhdGZvcm1Db250ZXh0LCBjb21wb3NpdGVPcGVyYXRvciwgYmxlbmRNb2Rl
KTsKKyAgICBEaXJlY3QyRDo6ZmlsbFJlY3QobV9wbGF0Zm9ybUNvbnRleHQsIHJlY3QsIGNvbG9y
LCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoc3RhdGUpKTsKKyAgICBEaXJlY3QyRDo6U3RhdGU6OnNl
dENvbXBvc2l0ZU9wZXJhdGlvbihtX3BsYXRmb3JtQ29udGV4dCwgcHJldmlvdXNPcGVyYXRvciwg
QmxlbmRNb2RlOjpOb3JtYWwpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3Qy
RDo6ZmlsbFJvdW5kZWRSZWN0KGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmIHJlY3QsIGNvbnN0IENv
bG9yJiBjb2xvciwgQmxlbmRNb2RlIGJsZW5kTW9kZSkKK3sKKyAgICBhdXRvJiBzdGF0ZSA9IGdy
YXBoaWNzQ29udGV4dCgpLnN0YXRlKCk7CisKKyAgICBDb21wb3NpdGVPcGVyYXRvciBwcmV2aW91
c09wZXJhdG9yID0gc3RhdGUuY29tcG9zaXRlT3BlcmF0b3I7CisgICAgRGlyZWN0MkQ6OlN0YXRl
OjpzZXRDb21wb3NpdGVPcGVyYXRpb24obV9wbGF0Zm9ybUNvbnRleHQsIHByZXZpb3VzT3BlcmF0
b3IsIGJsZW5kTW9kZSk7CisKKyAgICBEaXJlY3QyRDo6U2hhZG93U3RhdGUgc2hhZG93U3RhdGUo
c3RhdGUpOworICAgIGlmIChyZWN0LmlzUm91bmRlZCgpKQorICAgICAgICBEaXJlY3QyRDo6Zmls
bFJvdW5kZWRSZWN0KG1fcGxhdGZvcm1Db250ZXh0LCByZWN0LCBjb2xvciwgc2hhZG93U3RhdGUp
OworICAgIGVsc2UKKyAgICAgICAgRGlyZWN0MkQ6OmZpbGxSZWN0KG1fcGxhdGZvcm1Db250ZXh0
LCByZWN0LnJlY3QoKSwgY29sb3IsIHNoYWRvd1N0YXRlKTsKKworICAgIERpcmVjdDJEOjpTdGF0
ZTo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKG1fcGxhdGZvcm1Db250ZXh0LCBwcmV2aW91c09wZXJh
dG9yLCBCbGVuZE1vZGU6Ok5vcm1hbCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERp
cmVjdDJEOjpmaWxsUmVjdFdpdGhSb3VuZGVkSG9sZShjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNv
bnN0IEZsb2F0Um91bmRlZFJlY3QmIHJvdW5kZWRIb2xlUmVjdCwgY29uc3QgQ29sb3ImKQorewor
ICAgIERpcmVjdDJEOjpmaWxsUmVjdFdpdGhSb3VuZGVkSG9sZShtX3BsYXRmb3JtQ29udGV4dCwg
cmVjdCwgcm91bmRlZEhvbGVSZWN0LCB7IH0sIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShncmFwaGlj
c0NvbnRleHQoKS5zdGF0ZSgpKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVj
dDJEOjpmaWxsUGF0aChjb25zdCBQYXRoJiBwYXRoKQoreworICAgIGF1dG8mIHN0YXRlID0gZ3Jh
cGhpY3NDb250ZXh0KCkuc3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZmlsbFBhdGgobV9wbGF0Zm9y
bUNvbnRleHQsIHBhdGgsIERpcmVjdDJEOjpGaWxsU291cmNlKHN0YXRlLCBtX3BsYXRmb3JtQ29u
dGV4dCksIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0ZSkpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dEltcGxEaXJlY3QyRDo6ZmlsbEVsbGlwc2UoY29uc3QgRmxvYXRSZWN0JiByZWN0KQor
eworICAgIFBhdGggcGF0aDsKKyAgICBwYXRoLmFkZEVsbGlwc2UocmVjdCk7CisgICAgZmlsbFBh
dGgocGF0aCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpzdHJva2VS
ZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgZmxvYXQgbGluZVdpZHRoKQoreworICAgIGF1dG8m
IHN0YXRlID0gZ3JhcGhpY3NDb250ZXh0KCkuc3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6c3Ryb2tl
UmVjdChtX3BsYXRmb3JtQ29udGV4dCwgcmVjdCwgbGluZVdpZHRoLCBEaXJlY3QyRDo6U3Ryb2tl
U291cmNlKHN0YXRlLCBtX3BsYXRmb3JtQ29udGV4dCksIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShz
dGF0ZSkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6c3Ryb2tlUGF0
aChjb25zdCBQYXRoJiBwYXRoKQoreworICAgIGF1dG8mIHN0YXRlID0gZ3JhcGhpY3NDb250ZXh0
KCkuc3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6c3Ryb2tlUGF0aChtX3BsYXRmb3JtQ29udGV4dCwg
cGF0aCwgRGlyZWN0MkQ6OlN0cm9rZVNvdXJjZShzdGF0ZSwgbV9wbGF0Zm9ybUNvbnRleHQpLCBE
aXJlY3QyRDo6U2hhZG93U3RhdGUoc3RhdGUpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJ
bXBsRGlyZWN0MkQ6OnN0cm9rZUVsbGlwc2UoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAg
IFBhdGggcGF0aDsKKyAgICBwYXRoLmFkZEVsbGlwc2UocmVjdCk7CisgICAgc3Ryb2tlUGF0aChw
YXRoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmNsZWFyUmVjdChj
b25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgRGlyZWN0MkQ6OmNsZWFyUmVjdChtX3BsYXRm
b3JtQ29udGV4dCwgcmVjdCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJE
OjpkcmF3R2x5cGhzKGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1
ZmZlciwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50
JiBwb2ludCwgRm9udFNtb290aGluZ01vZGUgZm9udFNtb290aGluZykKK3sKKyAgICBVTlVTRURf
UEFSQU0oZm9udFNtb290aGluZyk7CisgICAgaWYgKCFmb250LnBsYXRmb3JtRGF0YSgpLnNpemUo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworSW1hZ2VE
cmF3UmVzdWx0IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZHJhd0ltYWdlKEltYWdlJiBp
bWFnZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0aW5hdGlvbiwgY29uc3QgRmxvYXRSZWN0JiBzb3Vy
Y2UsIGNvbnN0IEltYWdlUGFpbnRpbmdPcHRpb25zJiBpbWFnZVBhaW50aW5nT3B0aW9ucykKK3sK
KyAgICByZXR1cm4gR3JhcGhpY3NDb250ZXh0SW1wbDo6ZHJhd0ltYWdlSW1wbChncmFwaGljc0Nv
bnRleHQoKSwgaW1hZ2UsIGRlc3RpbmF0aW9uLCBzb3VyY2UsIGltYWdlUGFpbnRpbmdPcHRpb25z
KTsKK30KKworSW1hZ2VEcmF3UmVzdWx0IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZHJh
d1RpbGVkSW1hZ2UoSW1hZ2UmIGltYWdlLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RpbmF0aW9uLCBj
b25zdCBGbG9hdFBvaW50JiBzb3VyY2UsIGNvbnN0IEZsb2F0U2l6ZSYgdGlsZVNpemUsIGNvbnN0
IEZsb2F0U2l6ZSYgc3BhY2luZywgY29uc3QgSW1hZ2VQYWludGluZ09wdGlvbnMmIGltYWdlUGFp
bnRpbmdPcHRpb25zKQoreworICAgIHJldHVybiBHcmFwaGljc0NvbnRleHRJbXBsOjpkcmF3VGls
ZWRJbWFnZUltcGwoZ3JhcGhpY3NDb250ZXh0KCksIGltYWdlLCBkZXN0aW5hdGlvbiwgc291cmNl
LCB0aWxlU2l6ZSwgc3BhY2luZywgaW1hZ2VQYWludGluZ09wdGlvbnMpOworfQorCitJbWFnZURy
YXdSZXN1bHQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpkcmF3VGlsZWRJbWFnZShJbWFn
ZSYgaW1hZ2UsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdGluYXRpb24sIGNvbnN0IEZsb2F0UmVjdCYg
c291cmNlLCBjb25zdCBGbG9hdFNpemUmIHRpbGVTY2FsZUZhY3RvciwgSW1hZ2U6OlRpbGVSdWxl
IGhSdWxlLCBJbWFnZTo6VGlsZVJ1bGUgdlJ1bGUsIGNvbnN0IEltYWdlUGFpbnRpbmdPcHRpb25z
JiBpbWFnZVBhaW50aW5nT3B0aW9ucykKK3sKKyAgICByZXR1cm4gR3JhcGhpY3NDb250ZXh0SW1w
bDo6ZHJhd1RpbGVkSW1hZ2VJbXBsKGdyYXBoaWNzQ29udGV4dCgpLCBpbWFnZSwgZGVzdGluYXRp
b24sIHNvdXJjZSwgdGlsZVNjYWxlRmFjdG9yLCBoUnVsZSwgdlJ1bGUsIGltYWdlUGFpbnRpbmdP
cHRpb25zKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdOYXRp
dmVJbWFnZShjb25zdCBOYXRpdmVJbWFnZVB0ciYgaW1hZ2UsIGNvbnN0IEZsb2F0U2l6ZSYgaW1h
Z2VTaXplLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1Jl
Y3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUgYmxlbmRN
b2RlLCBJbWFnZU9yaWVudGF0aW9uIG9yaWVudGF0aW9uKQoreworICAgIGF1dG8mIHN0YXRlID0g
Z3JhcGhpY3NDb250ZXh0KCkuc3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZHJhd05hdGl2ZUltYWdl
KG1fcGxhdGZvcm1Db250ZXh0LCBpbWFnZS5nZXQoKSwgaW1hZ2VTaXplLCBkZXN0UmVjdCwgc3Jj
UmVjdCwgY29tcG9zaXRlT3BlcmF0b3IsIGJsZW5kTW9kZSwgb3JpZW50YXRpb24sIHN0YXRlLmlt
YWdlSW50ZXJwb2xhdGlvblF1YWxpdHksIHN0YXRlLmFscGhhLCBEaXJlY3QyRDo6U2hhZG93U3Rh
dGUoc3RhdGUpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdQ
YXR0ZXJuKEltYWdlJiBpbWFnZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxv
YXRSZWN0JiB0aWxlUmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3Jt
LCBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgY29uc3QgRmxvYXRTaXplJiwgQ29tcG9zaXRlT3Bl
cmF0b3IgY29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSBibGVuZE1vZGUpCit7CisgICAgaWYg
KGF1dG8gc3VyZmFjZSA9IGltYWdlLm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCkpCisgICAg
ICAgIERpcmVjdDJEOjpkcmF3UGF0dGVybihtX3BsYXRmb3JtQ29udGV4dCwgc3VyZmFjZS5nZXQo
KSwgSW50U2l6ZShpbWFnZS5zaXplKCkpLCBkZXN0UmVjdCwgdGlsZVJlY3QsIHBhdHRlcm5UcmFu
c2Zvcm0sIHBoYXNlLCBjb21wb3NpdGVPcGVyYXRvciwgYmxlbmRNb2RlKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVj
dCwgZmxvYXQgYm9yZGVyVGhpY2tuZXNzKQoreworICAgIGF1dG8mIHN0YXRlID0gZ3JhcGhpY3ND
b250ZXh0KCkuc3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZHJhd1JlY3QobV9wbGF0Zm9ybUNvbnRl
eHQsIHJlY3QsIGJvcmRlclRoaWNrbmVzcywgc3RhdGUuZmlsbENvbG9yLCBzdGF0ZS5zdHJva2VT
dHlsZSwgc3RhdGUuc3Ryb2tlQ29sb3IpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxE
aXJlY3QyRDo6ZHJhd0xpbmUoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQxLCBjb25zdCBGbG9hdFBv
aW50JiBwb2ludDIpCit7CisgICAgYXV0byYgc3RhdGUgPSBncmFwaGljc0NvbnRleHQoKS5zdGF0
ZSgpOworICAgIERpcmVjdDJEOjpkcmF3TGluZShtX3BsYXRmb3JtQ29udGV4dCwgcG9pbnQxLCBw
b2ludDIsIHN0YXRlLnN0cm9rZVN0eWxlLCBzdGF0ZS5zdHJva2VDb2xvciwgc3RhdGUuc3Ryb2tl
VGhpY2tuZXNzLCBzdGF0ZS5zaG91bGRBbnRpYWxpYXMpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dEltcGxEaXJlY3QyRDo6ZHJhd0xpbmVzRm9yVGV4dChjb25zdCBGbG9hdFBvaW50JiBwb2lu
dCwgZmxvYXQgdGhpY2tuZXNzLCBjb25zdCBEYXNoQXJyYXkmIHdpZHRocywgYm9vbCBwcmludGlu
ZywgYm9vbCBkb3VibGVVbmRlcmxpbmVzKQoreworICAgIGF1dG8mIHN0YXRlID0gZ3JhcGhpY3ND
b250ZXh0KCkuc3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZHJhd0xpbmVzRm9yVGV4dChtX3BsYXRm
b3JtQ29udGV4dCwgcG9pbnQsIHRoaWNrbmVzcywgd2lkdGhzLCBwcmludGluZywgZG91YmxlVW5k
ZXJsaW5lcywgc3RhdGUuc3Ryb2tlQ29sb3IpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dElt
cGxEaXJlY3QyRDo6ZHJhd0RvdHNGb3JEb2N1bWVudE1hcmtlcihjb25zdCBGbG9hdFJlY3QmIHJl
Y3QsIERvY3VtZW50TWFya2VyTGluZVN0eWxlIHN0eWxlKQoreworICAgIERpcmVjdDJEOjpkcmF3
RG90c0ZvckRvY3VtZW50TWFya2VyKG1fcGxhdGZvcm1Db250ZXh0LCByZWN0LCBzdHlsZSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpkcmF3RWxsaXBzZShjb25zdCBG
bG9hdFJlY3QmIHJlY3QpCit7CisgICAgYXV0byYgc3RhdGUgPSBncmFwaGljc0NvbnRleHQoKS5z
dGF0ZSgpOworICAgIERpcmVjdDJEOjpmaWxsRWxsaXBzZSgqcGxhdGZvcm1Db250ZXh0KCksIHJl
Y3QsIHN0YXRlLmZpbGxDb2xvciwgc3RhdGUuc3Ryb2tlU3R5bGUsIHN0YXRlLnN0cm9rZUNvbG9y
LCBzdGF0ZS5zdHJva2VUaGlja25lc3MpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxE
aXJlY3QyRDo6ZHJhd1BhdGgoY29uc3QgUGF0aCYpCit7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0SW1wbERpcmVjdDJEOjpkcmF3Rm9jdXNSaW5nKGNvbnN0IFBhdGgmIHBhdGgsIGZsb2F0IHdp
ZHRoLCBmbG9hdCBvZmZzZXQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBVTlVTRURfUEFS
QU0ob2Zmc2V0KTsKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dEltcGxEaXJlY3QyRDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBWZWN0b3I8RmxvYXRSZWN0PiYg
cmVjdHMsIGZsb2F0IHdpZHRoLCBmbG9hdCBvZmZzZXQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sK
KyAgICBVTlVTRURfUEFSQU0ob2Zmc2V0KTsKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6c2F2ZSgpCit7CisgICAgRGlyZWN0MkQ6
OnNhdmUobV9wbGF0Zm9ybUNvbnRleHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxE
aXJlY3QyRDo6cmVzdG9yZSgpCit7CisgICAgRGlyZWN0MkQ6OnJlc3RvcmUobV9wbGF0Zm9ybUNv
bnRleHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6dHJhbnNsYXRl
KGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgRGlyZWN0MkQ6OnRyYW5zbGF0ZShtX3BsYXRmb3Jt
Q29udGV4dCwgeCwgeSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpy
b3RhdGUoZmxvYXQgYW5nbGVJblJhZGlhbnMpCit7CisgICAgRGlyZWN0MkQ6OnJvdGF0ZShtX3Bs
YXRmb3JtQ29udGV4dCwgYW5nbGVJblJhZGlhbnMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dEltcGxEaXJlY3QyRDo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIERpcmVj
dDJEOjpzY2FsZShtX3BsYXRmb3JtQ29udGV4dCwgc2l6ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0SW1wbERpcmVjdDJEOjpjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFu
c2Zvcm0pCit7CisgICAgRGlyZWN0MkQ6OmNvbmNhdENUTShtX3BsYXRmb3JtQ29udGV4dCwgdHJh
bnNmb3JtKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnNldENUTShj
b25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBEaXJlY3QyRDo6U3RhdGU6
OnNldENUTShtX3BsYXRmb3JtQ29udGV4dCwgdHJhbnNmb3JtKTsKK30KKworQWZmaW5lVHJhbnNm
b3JtIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6Z2V0Q1RNKEdyYXBoaWNzQ29udGV4dDo6
SW5jbHVkZURldmljZVNjYWxlKQoreworICAgIHJldHVybiBEaXJlY3QyRDo6U3RhdGU6OmdldENU
TShtX3BsYXRmb3JtQ29udGV4dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVj
dDJEOjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKGZsb2F0IG9wYWNpdHkpCit7CisgICAgRGlyZWN0
MkQ6OmJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIobV9wbGF0Zm9ybUNvbnRleHQsIG9wYWNpdHkpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZW5kVHJhbnNwYXJlbmN5TGF5
ZXIoKQoreworICAgIERpcmVjdDJEOjplbmRUcmFuc3BhcmVuY3lMYXllcihtX3BsYXRmb3JtQ29u
dGV4dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpjbGlwKGNvbnN0
IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBEaXJlY3QyRDo6Y2xpcChtX3BsYXRmb3JtQ29udGV4
dCwgcmVjdCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpjbGlwT3V0
KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBEaXJlY3QyRDo6Y2xpcE91dChtX3BsYXRm
b3JtQ29udGV4dCwgcmVjdCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJE
OjpjbGlwT3V0KGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgRGlyZWN0MkQ6OmNsaXBPdXQobV9w
bGF0Zm9ybUNvbnRleHQsIHBhdGgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJl
Y3QyRDo6Y2xpcFBhdGgoY29uc3QgUGF0aCYgcGF0aCwgV2luZFJ1bGUgY2xpcFJ1bGUpCit7Cisg
ICAgRGlyZWN0MkQ6OmNsaXBQYXRoKG1fcGxhdGZvcm1Db250ZXh0LCBwYXRoLCBjbGlwUnVsZSk7
Cit9CisKK0ludFJlY3QgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpjbGlwQm91bmRzKCkK
K3sKKyAgICByZXR1cm4gRGlyZWN0MkQ6OlN0YXRlOjpnZXRDbGlwQm91bmRzKG1fcGxhdGZvcm1D
b250ZXh0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmNsaXBUb0lt
YWdlQnVmZmVyKEltYWdlQnVmZmVyJiBidWZmZXIsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3Qp
Cit7CisgICAgUmVmUHRyPEltYWdlPiBpbWFnZSA9IGJ1ZmZlci5jb3B5SW1hZ2UoRG9udENvcHlC
YWNraW5nU3RvcmUpOworICAgIGlmICghaW1hZ2UpCisgICAgICAgIHJldHVybjsKKworCisgICAg
aWYgKGF1dG8gc3VyZmFjZSA9IGltYWdlLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpKQor
ICAgICAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxE
aXJlY3QyRDo6YXBwbHlEZXZpY2VTY2FsZUZhY3RvcihmbG9hdCkKK3sKK30KKworRmxvYXRSZWN0
IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6cm91bmRUb0RldmljZVBpeGVscyhjb25zdCBG
bG9hdFJlY3QmIHJlY3QsIEdyYXBoaWNzQ29udGV4dDo6Um91bmRpbmdNb2RlKQoreworICAgIHJl
dHVybiBEaXJlY3QyRDo6U3RhdGU6OnJvdW5kVG9EZXZpY2VQaXhlbHMobV9wbGF0Zm9ybUNvbnRl
eHQsIHJlY3QpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0Uo
RElSRUNUMkQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3Jh
cGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRC5oCShub25l
eGlzdGVudCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGlj
c0NvbnRleHRJbXBsRGlyZWN0MkQuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjcHJhZ21hIG9u
Y2UKKworI2lmIFVTRShESVJFQ1QyRCkKKworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dEltcGwu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBQbGF0Zm9ybUNvbnRleHREaXJlY3Qy
RDsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEIGZpbmFsIDogcHVibGljIEdy
YXBoaWNzQ29udGV4dEltcGwgeworcHVibGljOgorICAgIFdFQkNPUkVfRVhQT1JUIHN0YXRpYyBH
cmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dEltcGxGYWN0b3J5IGNyZWF0ZUZhY3Rvcnko
UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmKTsKKyAgICBXRUJDT1JFX0VYUE9SVCBzdGF0aWMgR3Jh
cGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHRJbXBsRmFjdG9yeSBjcmVhdGVGYWN0b3J5KElE
MkQxUmVuZGVyVGFyZ2V0Kik7CisKKyAgICBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQoR3Jh
cGhpY3NDb250ZXh0JiwgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmKTsKKyAgICBHcmFwaGljc0Nv
bnRleHRJbXBsRGlyZWN0MkQoR3JhcGhpY3NDb250ZXh0JiwgSUQyRDFSZW5kZXJUYXJnZXQqKTsK
KyAgICB2aXJ0dWFsIH5HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQoKTsKKworICAgIGJvb2wg
aGFzUGxhdGZvcm1Db250ZXh0KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQqIHBsYXRmb3JtQ29udGV4dCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9pZCB1
cGRhdGVTdGF0ZShjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYsIEdyYXBoaWNzQ29udGV4dFN0
YXRlOjpTdGF0ZUNoYW5nZUZsYWdzKSBvdmVycmlkZTsKKyAgICB2b2lkIGNsZWFyU2hhZG93KCkg
b3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldExpbmVDYXAoTGluZUNhcCkgb3ZlcnJpZGU7CisgICAg
dm9pZCBzZXRMaW5lRGFzaChjb25zdCBEYXNoQXJyYXkmLCBmbG9hdCkgb3ZlcnJpZGU7CisgICAg
dm9pZCBzZXRMaW5lSm9pbihMaW5lSm9pbikgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRNaXRlckxp
bWl0KGZsb2F0KSBvdmVycmlkZTsKKworICAgIHZvaWQgZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0
Jikgb3ZlcnJpZGU7CisgICAgdm9pZCBmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBD
b2xvciYpIG92ZXJyaWRlOworICAgIHZvaWQgZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiwgR3Jh
ZGllbnQmKSBvdmVycmlkZTsKKyAgICB2b2lkIGZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYsIGNv
bnN0IENvbG9yJiwgQ29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSkgb3ZlcnJpZGU7CisgICAg
dm9pZCBmaWxsUm91bmRlZFJlY3QoY29uc3QgRmxvYXRSb3VuZGVkUmVjdCYsIGNvbnN0IENvbG9y
JiwgQmxlbmRNb2RlKSBvdmVycmlkZTsKKyAgICB2b2lkIGZpbGxSZWN0V2l0aFJvdW5kZWRIb2xl
KGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmLCBjb25zdCBDb2xvciYp
IG92ZXJyaWRlOworICAgIHZvaWQgZmlsbFBhdGgoY29uc3QgUGF0aCYpIG92ZXJyaWRlOworICAg
IHZvaWQgZmlsbEVsbGlwc2UoY29uc3QgRmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisgICAgdm9pZCBz
dHJva2VSZWN0KGNvbnN0IEZsb2F0UmVjdCYsIGZsb2F0KSBvdmVycmlkZTsKKyAgICB2b2lkIHN0
cm9rZVBhdGgoY29uc3QgUGF0aCYpIG92ZXJyaWRlOworICAgIHZvaWQgc3Ryb2tlRWxsaXBzZShj
b25zdCBGbG9hdFJlY3QmKSBvdmVycmlkZTsKKyAgICB2b2lkIGNsZWFyUmVjdChjb25zdCBGbG9h
dFJlY3QmKSBvdmVycmlkZTsKKworICAgIHZvaWQgZHJhd0dseXBocyhjb25zdCBGb250JiwgY29u
c3QgR2x5cGhCdWZmZXImLCB1bnNpZ25lZCwgdW5zaWduZWQsIGNvbnN0IEZsb2F0UG9pbnQmLCBG
b250U21vb3RoaW5nTW9kZSkgb3ZlcnJpZGU7CisKKyAgICBJbWFnZURyYXdSZXN1bHQgZHJhd0lt
YWdlKEltYWdlJiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgSW1h
Z2VQYWludGluZ09wdGlvbnMmKSBvdmVycmlkZTsKKyAgICBJbWFnZURyYXdSZXN1bHQgZHJhd1Rp
bGVkSW1hZ2UoSW1hZ2UmLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFBvaW50JiwgY29u
c3QgRmxvYXRTaXplJiwgY29uc3QgRmxvYXRTaXplJiwgY29uc3QgSW1hZ2VQYWludGluZ09wdGlv
bnMmKSBvdmVycmlkZTsKKyAgICBJbWFnZURyYXdSZXN1bHQgZHJhd1RpbGVkSW1hZ2UoSW1hZ2Um
LCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFNpemUmLCBJ
bWFnZTo6VGlsZVJ1bGUsIEltYWdlOjpUaWxlUnVsZSwgY29uc3QgSW1hZ2VQYWludGluZ09wdGlv
bnMmKSBvdmVycmlkZTsKKyAgICB2b2lkIGRyYXdOYXRpdmVJbWFnZShjb25zdCBOYXRpdmVJbWFn
ZVB0ciYsIGNvbnN0IEZsb2F0U2l6ZSYsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZsb2F0UmVj
dCYsIENvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUsIEltYWdlT3JpZW50YXRpb24pIG92ZXJy
aWRlOworICAgIHZvaWQgZHJhd1BhdHRlcm4oSW1hZ2UmLCBjb25zdCBGbG9hdFJlY3QmLCBjb25z
dCBGbG9hdFJlY3QmLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mLCBjb25zdCBGbG9hdFBvaW50Jiwg
Y29uc3QgRmxvYXRTaXplJiwgQ29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSA9IEJsZW5kTW9k
ZTo6Tm9ybWFsKSBvdmVycmlkZTsKKworICAgIHZvaWQgZHJhd1JlY3QoY29uc3QgRmxvYXRSZWN0
JiwgZmxvYXQpIG92ZXJyaWRlOworICAgIHZvaWQgZHJhd0xpbmUoY29uc3QgRmxvYXRQb2ludCYs
IGNvbnN0IEZsb2F0UG9pbnQmKSBvdmVycmlkZTsKKyAgICB2b2lkIGRyYXdMaW5lc0ZvclRleHQo
Y29uc3QgRmxvYXRQb2ludCYsIGZsb2F0IHRoaWNrbmVzcywgY29uc3QgRGFzaEFycmF5JiwgYm9v
bCwgYm9vbCkgb3ZlcnJpZGU7CisgICAgdm9pZCBkcmF3RG90c0ZvckRvY3VtZW50TWFya2VyKGNv
bnN0IEZsb2F0UmVjdCYsIERvY3VtZW50TWFya2VyTGluZVN0eWxlKSBvdmVycmlkZTsKKyAgICB2
b2lkIGRyYXdFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYpIG92ZXJyaWRlOworICAgIHZvaWQgZHJh
d1BhdGgoY29uc3QgUGF0aCYpIG92ZXJyaWRlOworCisgICAgdm9pZCBkcmF3Rm9jdXNSaW5nKGNv
bnN0IFBhdGgmLCBmbG9hdCwgZmxvYXQsIGNvbnN0IENvbG9yJikgb3ZlcnJpZGU7CisgICAgdm9p
ZCBkcmF3Rm9jdXNSaW5nKGNvbnN0IFZlY3RvcjxGbG9hdFJlY3Q+JiwgZmxvYXQsIGZsb2F0LCBj
b25zdCBDb2xvciYpIG92ZXJyaWRlOworCisgICAgdm9pZCBzYXZlKCkgb3ZlcnJpZGU7CisgICAg
dm9pZCByZXN0b3JlKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCwgZmxv
YXQpIG92ZXJyaWRlOworICAgIHZvaWQgcm90YXRlKGZsb2F0KSBvdmVycmlkZTsKKyAgICB2b2lk
IHNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYpIG92ZXJyaWRlOworICAgIHZvaWQgY29uY2F0Q1RNKGNv
bnN0IEFmZmluZVRyYW5zZm9ybSYpIG92ZXJyaWRlOworICAgIHZvaWQgc2V0Q1RNKGNvbnN0IEFm
ZmluZVRyYW5zZm9ybSYpIG92ZXJyaWRlOworICAgIEFmZmluZVRyYW5zZm9ybSBnZXRDVE0oR3Jh
cGhpY3NDb250ZXh0OjpJbmNsdWRlRGV2aWNlU2NhbGUpIG92ZXJyaWRlOworCisgICAgdm9pZCBi
ZWdpblRyYW5zcGFyZW5jeUxheWVyKGZsb2F0KSBvdmVycmlkZTsKKyAgICB2b2lkIGVuZFRyYW5z
cGFyZW5jeUxheWVyKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGNsaXAoY29uc3QgRmxvYXRSZWN0
Jikgb3ZlcnJpZGU7CisgICAgdm9pZCBjbGlwT3V0KGNvbnN0IEZsb2F0UmVjdCYpIG92ZXJyaWRl
OworICAgIHZvaWQgY2xpcE91dChjb25zdCBQYXRoJikgb3ZlcnJpZGU7CisgICAgdm9pZCBjbGlw
UGF0aChjb25zdCBQYXRoJiwgV2luZFJ1bGUpIG92ZXJyaWRlOworICAgIEludFJlY3QgY2xpcEJv
dW5kcygpIG92ZXJyaWRlOworICAgIHZvaWQgY2xpcFRvSW1hZ2VCdWZmZXIoSW1hZ2VCdWZmZXIm
LCBjb25zdCBGbG9hdFJlY3QmKSBvdmVycmlkZTsKKyAgICAKKyAgICB2b2lkIGFwcGx5RGV2aWNl
U2NhbGVGYWN0b3IoZmxvYXQpIG92ZXJyaWRlOworCisgICAgRmxvYXRSZWN0IHJvdW5kVG9EZXZp
Y2VQaXhlbHMoY29uc3QgRmxvYXRSZWN0JiwgR3JhcGhpY3NDb250ZXh0OjpSb3VuZGluZ01vZGUp
IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRD4gbV9vd25lZFBsYXRmb3JtQ29udGV4dDsKKyAgICBQbGF0Zm9ybUNvbnRleHRE
aXJlY3QyRCYgbV9wbGF0Zm9ybUNvbnRleHQ7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8R3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlPiBtX3ByaXZhdGU7Cit9OworCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoRElSRUNUMkQpCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGly
ZWN0MkQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGlyZWN0MkQuaAkocmV2aXNpb24gMjQ4
MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZURpcmVjdDJELmgJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3
LDcgQEAKIAogI2luY2x1ZGUgIkNPTVB0ci5oIgogI2luY2x1ZGUgIkNvbG9yLmgiCisjaW5jbHVk
ZSAiUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaCIKICNpbmNsdWRlIDxkMmQxLmg+CiAjaW5jbHVk
ZSA8ZDJkMV8xLmg+CiAjaW5jbHVkZSA8ZDJkMWVmZmVjdHMuaD4KQEAgLTM5LDEwICs0MCwxMSBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUgewogICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwogcHVibGljOgotICAgIEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZShJRDJEMVJlbmRlclRhcmdldCosIEdyYXBoaWNzQ29udGV4
dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUpOworICAgIEdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIEdyYXBoaWNzQ29udGV4dDo6Qml0
bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUpOworICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZShzdGQ6OnVuaXF1ZV9wdHI8UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ+JiYsIEdyYXBoaWNz
Q29udGV4dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUpOwogICAgIH5HcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGUoKTsKIAotICAgIGVudW0gRGlyZWN0MkRMYXllclR5cGUgeyBBeGlz
QWxpZ25lZENsaXAsIExheWVyQ2xpcCB9OworICAgIHZvaWQgc3luY0NvbnRleHQoUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQmKTsKIAogICAgIHZvaWQgYmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9h
dCBvcGFjaXR5KTsKICAgICB2b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVyKCk7CkBAIC03Myw2OCAr
NzUsMjYgQEAgcHVibGljOgogICAgIHZvaWQgc2V0RGFzaGVzKGNvbnN0IERhc2hBcnJheSYpOwog
ICAgIHZvaWQgc2V0QWxwaGEoZmxvYXQpOwogCisgICAgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQq
IHBsYXRmb3JtQ29udGV4dCgpIHsgcmV0dXJuICZtX3BsYXRmb3JtQ29udGV4dDsgfQogICAgIElE
MkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQoKTsKLSAgICBJRDJEMUxheWVyKiBjbGlwTGF5
ZXIoKSBjb25zdCB7IHJldHVybiBtX3JlbmRlclN0YXRlcy5sYXN0KCkubV9hY3RpdmVMYXllci5n
ZXQoKTsgfQotICAgIElEMkQxU3Ryb2tlU3R5bGUqIHN0cm9rZVN0eWxlKCk7Ci0KLSAgICBDT01Q
dHI8SUQyRDFTb2xpZENvbG9yQnJ1c2g+IGJydXNoV2l0aENvbG9yKGNvbnN0IEQyRDFfQ09MT1Jf
RiYpOwogCiAgICAgSERDIG1faGRjIHsgbnVsbHB0ciB9OwotICAgIEQyRDFfQkxFTkRfTU9ERSBt
X2JsZW5kTW9kZSB7IEQyRDFfQkxFTkRfTU9ERV9NVUxUSVBMWSB9OwotICAgIEQyRDFfQ09NUE9T
SVRFX01PREUgbV9jb21wb3NpdGVNb2RlIHsgRDJEMV9DT01QT1NJVEVfTU9ERV9TT1VSQ0VfT1ZF
UiB9OwogICAgIGJvb2wgbV9zaG91bGRJbmNsdWRlQ2hpbGRXaW5kb3dzIHsgZmFsc2UgfTsKLSAg
ICBib29sIG1fc3Ryb2tlU3lsZUlzRGlydHkgeyBmYWxzZSB9OwotCi0gICAgQ09NUHRyPElEMkQx
U29saWRDb2xvckJydXNoPiBtX3NvbGlkU3Ryb2tlQnJ1c2g7Ci0gICAgQ09NUHRyPElEMkQxU29s
aWRDb2xvckJydXNoPiBtX3NvbGlkRmlsbEJydXNoOwotICAgIENPTVB0cjxJRDJEMUJpdG1hcEJy
dXNoPiBtX3BhdHRlcm5TdHJva2VCcnVzaDsKLSAgICBDT01QdHI8SUQyRDFCaXRtYXBCcnVzaD4g
bV9wYXR0ZXJuRmlsbEJydXNoOwogCiAgICAgZmxvYXQgY3VycmVudEdsb2JhbEFscGhhKCkgY29u
c3Q7CiAKICAgICBEMkQxX1NUUk9LRV9TVFlMRV9QUk9QRVJUSUVTIHN0cm9rZVN0eWxlUHJvcGVy
dGllcygpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIHZvaWQgcmVjb21wdXRlU3Ryb2tlU3R5bGUo
KTsKLQotICAgIENPTVB0cjxJRDJEMVJlbmRlclRhcmdldD4gbV9yZW5kZXJUYXJnZXQ7CisgICAg
c3RkOjp1bmlxdWVfcHRyPFBsYXRmb3JtQ29udGV4dERpcmVjdDJEPiBtX293bmVkUGxhdGZvcm1D
b250ZXh0OworICAgIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBtX3BsYXRmb3JtQ29udGV4dDsK
ICAgICBjb25zdCBHcmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlIG1f
cmVuZGVyZXJUeXBlOwotICAgIEhhc2hNYXA8dWludDMyX3QsIENPTVB0cjxJRDJEMVNvbGlkQ29s
b3JCcnVzaD4+IG1fc29saWRDb2xvcmVkQnJ1c2hDYWNoZTsKLSAgICBDT01QdHI8SUQyRDFTb2xp
ZENvbG9yQnJ1c2g+IG1fd2hpdGVCcnVzaDsKLSAgICBDT01QdHI8SUQyRDFTb2xpZENvbG9yQnJ1
c2g+IG1femVyb0JydXNoOwotICAgIENPTVB0cjxJRDJEMVN0cm9rZVN0eWxlPiBtX2QyZFN0cm9r
ZVN0eWxlOwotCi0gICAgc3RydWN0IFJlbmRlclN0YXRlIHsKLSAgICAgICAgQ09NUHRyPElEMkQx
RHJhd2luZ1N0YXRlQmxvY2s+IG1fZHJhd2luZ1N0YXRlQmxvY2s7Ci0gICAgICAgIENPTVB0cjxJ
RDJEMUxheWVyPiBtX2FjdGl2ZUxheWVyOwotICAgICAgICBWZWN0b3I8RGlyZWN0MkRMYXllclR5
cGU+IG1fY2xpcHM7Ci0gICAgfTsKLQotICAgIFZlY3RvcjxSZW5kZXJTdGF0ZT4gbV9yZW5kZXJT
dGF0ZXM7Ci0KLSAgICBzdHJ1Y3QgVHJhbnNwYXJlbmN5TGF5ZXJTdGF0ZSB7Ci0gICAgICAgIENP
TVB0cjxJRDJEMUJpdG1hcFJlbmRlclRhcmdldD4gcmVuZGVyVGFyZ2V0OwotICAgICAgICBDb2xv
ciBzaGFkb3dDb2xvcjsKLSAgICAgICAgRmxvYXRTaXplIHNoYWRvd09mZnNldDsKLSAgICAgICAg
ZmxvYXQgb3BhY2l0eSB7IDEuMCB9OwotICAgICAgICBmbG9hdCBzaGFkb3dCbHVyIHsgMCB9Owot
ICAgICAgICBib29sIGhhc1NoYWRvdyB7IGZhbHNlIH07Ci0gICAgfTsKLSAgICBWZWN0b3I8VHJh
bnNwYXJlbmN5TGF5ZXJTdGF0ZT4gbV90cmFuc3BhcmVuY3lMYXllclN0YWNrOwotCi0gICAgRDJE
MV9DQVBfU1RZTEUgbV9saW5lQ2FwIHsgRDJEMV9DQVBfU1RZTEVfRkxBVCB9OwotICAgIEQyRDFf
TElORV9KT0lOIG1fbGluZUpvaW4geyBEMkQxX0xJTkVfSk9JTl9NSVRFUiB9OwotICAgIFN0cm9r
ZVN0eWxlIG1fc3Ryb2tlU3R5bGUgeyBTb2xpZFN0cm9rZSB9OwotICAgIERhc2hBcnJheSBtX2Rh
c2hlczsKIAogICAgIHVuc2lnbmVkIGJlZ2luRHJhd0NvdW50IHsgMCB9OwogCi0gICAgZmxvYXQg
bV9taXRlckxpbWl0IHsgMTAuMGYgfTsKLSAgICBmbG9hdCBtX2Rhc2hPZmZzZXQgeyAwIH07Ci0g
ICAgZmxvYXQgbV9wYXR0ZXJuV2lkdGggeyAxLjBmIH07Ci0gICAgZmxvYXQgbV9wYXR0ZXJuT2Zm
c2V0IHsgMCB9OwotICAgIGZsb2F0IG1fc3Ryb2tlVGhpY2tuZXNzIHsgMCB9OwogICAgIGZsb2F0
IG1fYWxwaGEgeyAxLjAgfTsKKworICAgIGZyaWVuZCBjbGFzcyBEMkRDb250ZXh0U3RhdGVTYXZl
cjsKIH07CiAKIGNsYXNzIEQyRENvbnRleHRTdGF0ZVNhdmVyIHsKQEAgLTE0NCwyNiArMTA0LDI2
IEBAIHB1YmxpYzoKICAgICAgICAgLCBtX3NhdmVBbmRSZXN0b3JlKHNhdmVBbmRSZXN0b3JlKQog
ICAgIHsKICAgICAgICAgaWYgKG1fc2F2ZUFuZFJlc3RvcmUpCi0gICAgICAgICAgICBtX2NvbnRl
eHQuc2F2ZSgpOworICAgICAgICAgICAgbV9jb250ZXh0Lm1fcGxhdGZvcm1Db250ZXh0LnNhdmUo
KTsKICAgICB9CiAKICAgICB+RDJEQ29udGV4dFN0YXRlU2F2ZXIoKQogICAgIHsKICAgICAgICAg
aWYgKG1fc2F2ZUFuZFJlc3RvcmUpCi0gICAgICAgICAgICBtX2NvbnRleHQucmVzdG9yZSgpOwor
ICAgICAgICAgICAgbV9jb250ZXh0Lm1fcGxhdGZvcm1Db250ZXh0LnJlc3RvcmUoKTsKICAgICB9
CiAKICAgICB2b2lkIHNhdmUoKQogICAgIHsKICAgICAgICAgQVNTRVJUKCFtX3NhdmVBbmRSZXN0
b3JlKTsKLSAgICAgICAgbV9jb250ZXh0LnNhdmUoKTsKKyAgICAgICAgbV9jb250ZXh0Lm1fcGxh
dGZvcm1Db250ZXh0LnNhdmUoKTsKICAgICAgICAgbV9zYXZlQW5kUmVzdG9yZSA9IHRydWU7CiAg
ICAgfQogCiAgICAgdm9pZCByZXN0b3JlKCkKICAgICB7CiAgICAgICAgIEFTU0VSVChtX3NhdmVB
bmRSZXN0b3JlKTsKLSAgICAgICAgbV9jb250ZXh0LnJlc3RvcmUoKTsKKyAgICAgICAgbV9jb250
ZXh0Lm1fcGxhdGZvcm1Db250ZXh0LnJlc3RvcmUoKTsKICAgICAgICAgbV9zYXZlQW5kUmVzdG9y
ZSA9IGZhbHNlOwogICAgIH0KIApAQCAtMTczLDYgKzEzMyw3IEBAIHB1YmxpYzoKICAgICB9CiAK
IHByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPFBsYXRmb3JtQ29udGV4dERpcmVjdDJEPiBv
d25lZFBsYXRmb3JtQ29udGV4dDsKICAgICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUm
IG1fY29udGV4dDsKICAgICBib29sIG1fc2F2ZUFuZFJlc3RvcmUgeyBmYWxzZSB9OwogfTsKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRhdGFE
aXJlY3QyRC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9JbWFnZUJ1ZmZlckRhdGFEaXJlY3QyRC5oCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VCdWZmZXJEYXRhRGlyZWN0MkQu
aAkod29ya2luZyBjb3B5KQpAQCAtMzIsMTYgKzMyLDE3IEBACiAjaW5jbHVkZSA8d3RmL1JlZlB0
ci5oPgogI2luY2x1ZGUgPHd0Zi9SZXRhaW5QdHIuaD4KIAotaW50ZXJmYWNlIElEMkQxUmVuZGVy
VGFyZ2V0OwotCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2NsYXNzIFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEOworCiBzdHJ1Y3QgSW1hZ2VCdWZmZXJEYXRhIHsKICAgICBJbnRTaXplIGJhY2tpbmdT
dG9yZVNpemU7CiAgICAgQ2hlY2tlZDx1bnNpZ25lZCwgUmVjb3JkT3ZlcmZsb3c+IGJ5dGVzUGVy
Um93OwogCiAgICAgLy8gT25seSBmb3Igc29mdHdhcmUgSW1hZ2VCdWZmZXJzLgogICAgIFZlY3Rv
cjxjaGFyPiBkYXRhOworICAgIHN0ZDo6dW5pcXVlX3B0cjxQbGF0Zm9ybUNvbnRleHREaXJlY3Qy
RD4gcGxhdGZvcm1Db250ZXh0OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxHcmFwaGljc0NvbnRleHQ+
IGNvbnRleHQ7CiAgICAgQ09NUHRyPElXSUNCaXRtYXA+IGJpdG1hcFNvdXJjZTsKIApJbmRleDog
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQnVmZmVyRGlyZWN0MkQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9J
bWFnZUJ1ZmZlckRpcmVjdDJELmNwcAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQnVmZmVyRGlyZWN0MkQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNi0yMDE4IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNi0yMDE5
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwpAQCAtMzAsMTIgKzMwLDE0IEBACiAKICNpbmNsdWRlICJCaXRtYXBJbWFnZS5oIgog
I2luY2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1ZGUgIkRpcmVjdDJEVXRpbGl0aWVzLmgiCiAjaW5j
bHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSW1hZ2VEYXRhLmgiCiAjaW5jbHVk
ZSAiSW1hZ2VEZWNvZGVyRGlyZWN0MkQuaCIKICNpbmNsdWRlICJJbnRSZWN0LmgiCiAjaW5jbHVk
ZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaCIKICNpbmNsdWRlIDxkMmQxLmg+CiAjaW5j
bHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHdpbmNvZGVjLmg+CkBAIC0xMDEsMjEgKzEwMywxNyBA
QCBJbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIoY29uc3QgRmxvYXRTaXplCiAKICAgICBtX2RhdGEu
ZGF0YSA9IFZlY3RvcjxjaGFyPihudW1CeXRlcy51bnNhZmVHZXQoKSwgMCk7CiAKLSAgICBIUkVT
VUxUIGhyID0gSW1hZ2VEZWNvZGVyRGlyZWN0MkQ6OnN5c3RlbUltYWdpbmdGYWN0b3J5KCktPkNy
ZWF0ZUJpdG1hcEZyb21NZW1vcnkobV9zaXplLndpZHRoKCksIG1fc2l6ZS5oZWlnaHQoKSwgR1VJ
RF9XSUNQaXhlbEZvcm1hdDMyYnBwUEJHUkEsIHN0YXRpY19jYXN0PFVJTlQ+KG1fZGF0YS5ieXRl
c1BlclJvdy51bnNhZmVHZXQoKSksIHN0YXRpY19jYXN0PFVJTlQ+KG51bUJ5dGVzLnVuc2FmZUdl
dCgpKSwgcmVpbnRlcnByZXRfY2FzdDxCWVRFKj4obV9kYXRhLmRhdGEuZGF0YSgpKSwgJm1fZGF0
YS5iaXRtYXBTb3VyY2UpOwotICAgIGlmICghU1VDQ0VFREVEKGhyKSkKKyAgICBtX2RhdGEuYml0
bWFwU291cmNlID0gRGlyZWN0MkQ6OmNyZWF0ZURpcmVjdDJESW1hZ2VTdXJmYWNlV2l0aERhdGEo
bV9kYXRhLmRhdGEuZGF0YSgpLCBtX3NpemUsIG1fZGF0YS5ieXRlc1BlclJvdy51bnNhZmVHZXQo
KSk7CisgICAgaWYgKCFtX2RhdGEuYml0bWFwU291cmNlKQogICAgICAgICByZXR1cm47CiAKLSAg
ICBhdXRvIHRhcmdldFByb3BlcnRpZXMgPSBEMkQxOjpSZW5kZXJUYXJnZXRQcm9wZXJ0aWVzKEQy
RDFfUkVOREVSX1RBUkdFVF9UWVBFX0RFRkFVTFQsCi0gICAgICAgIEQyRDE6OlBpeGVsRm9ybWF0
KERYR0lfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCBEMkQxX0FMUEhBX01PREVfUFJFTVVMVElQTElF
RCksCi0gICAgICAgIDAsIDAsIEQyRDFfUkVOREVSX1RBUkdFVF9VU0FHRV9OT05FLCBEMkQxX0ZF
QVRVUkVfTEVWRUxfREVGQVVMVCk7Ci0KLSAgICBDT01QdHI8SUQyRDFSZW5kZXJUYXJnZXQ+IGJp
dG1hcENvbnRleHQ7Ci0gICAgaHIgPSBHcmFwaGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+
Q3JlYXRlV2ljQml0bWFwUmVuZGVyVGFyZ2V0KG1fZGF0YS5iaXRtYXBTb3VyY2UuZ2V0KCksICZ0
YXJnZXRQcm9wZXJ0aWVzLCAmYml0bWFwQ29udGV4dCk7Ci0gICAgaWYgKCFiaXRtYXBDb250ZXh0
IHx8ICFTVUNDRUVERUQoaHIpKQorICAgIENPTVB0cjxJRDJEMVJlbmRlclRhcmdldD4gYml0bWFw
Q29udGV4dCA9IERpcmVjdDJEOjpjcmVhdGVSZW5kZXJUYXJnZXRGcm9tV0lDQml0bWFwKG1fZGF0
YS5iaXRtYXBTb3VyY2UuZ2V0KCkpOworICAgIGlmICghYml0bWFwQ29udGV4dCkKICAgICAgICAg
cmV0dXJuOwogCiAgICAgLy8gTm90ZTogVGhpcyBwbGFjZXMgdGhlIGJpdG1hcGNvbnRleHQgaW50
byBhIGxvY2tlZCBzdGF0ZSBiZWNhdXNlIG9mIHRoZSBCZWdpbkRyYXcgY2FsbCBpbiB0aGUgY29u
c3RydWN0b3IuCi0gICAgbV9kYXRhLmNvbnRleHQgPSBzdGQ6Om1ha2VfdW5pcXVlPEdyYXBoaWNz
Q29udGV4dD4oYml0bWFwQ29udGV4dC5nZXQoKSk7CisgICAgbV9kYXRhLnBsYXRmb3JtQ29udGV4
dCA9IHN0ZDo6bWFrZV91bmlxdWU8UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ+KGJpdG1hcENvbnRl
eHQuZ2V0KCkpOworICAgIG1fZGF0YS5jb250ZXh0ID0gc3RkOjptYWtlX3VuaXF1ZTxHcmFwaGlj
c0NvbnRleHQ+KG1fZGF0YS5wbGF0Zm9ybUNvbnRleHQuZ2V0KCksIEdyYXBoaWNzQ29udGV4dDo6
Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSk7CiAKICAgICBzdWNjZXNzID0g
dHJ1ZTsKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9OYXRp
dmVJbWFnZURpcmVjdDJELmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vTmF0aXZlSW1hZ2VEaXJlY3QyRC5jcHAJKHJldmlzaW9uIDI0ODAwOCkK
KysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9OYXRpdmVJbWFnZURpcmVj
dDJELmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIkludFNpemUuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1l
bnRlZC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCiAjaW5jbHVkZSA8
ZDJkMS5oPgogI2luY2x1ZGUgPHdpbmNvZGVjLmg+CiAKQEAgLTExNiwxMSArMTE3LDExIEBAIHZv
aWQgZHJhd05hdGl2ZUltYWdlKGNvbnN0IE5hdGl2ZUltYWdlUHQKICAgICBmbG9hdCBvcGFjaXR5
ID0gMS4wZjsKIAogICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gYml0bWFwOwotICAgIEhSRVNVTFQg
aHIgPSBwbGF0Zm9ybUNvbnRleHQtPkNyZWF0ZUJpdG1hcEZyb21XaWNCaXRtYXAoaW1hZ2UuZ2V0
KCksICZiaXRtYXApOworICAgIEhSRVNVTFQgaHIgPSBwbGF0Zm9ybUNvbnRleHQtPnJlbmRlclRh
cmdldCgpLT5DcmVhdGVCaXRtYXBGcm9tV2ljQml0bWFwKGltYWdlLmdldCgpLCAmYml0bWFwKTsK
ICAgICBpZiAoIVNVQ0NFRURFRChocikpCiAgICAgICAgIHJldHVybjsKIAotICAgIHBsYXRmb3Jt
Q29udGV4dC0+RHJhd0JpdG1hcChiaXRtYXAuZ2V0KCksIGRlc3RSZWN0LCBvcGFjaXR5LCBEMkQx
X0JJVE1BUF9JTlRFUlBPTEFUSU9OX01PREVfTkVBUkVTVF9ORUlHSEJPUiwgYWRqdXN0ZWRTcmNS
ZWN0KTsKKyAgICBwbGF0Zm9ybUNvbnRleHQtPnJlbmRlclRhcmdldCgpLT5EcmF3Qml0bWFwKGJp
dG1hcC5nZXQoKSwgZGVzdFJlY3QsIG9wYWNpdHksIEQyRDFfQklUTUFQX0lOVEVSUE9MQVRJT05f
TU9ERV9ORUFSRVNUX05FSUdIQk9SLCBhZGp1c3RlZFNyY1JlY3QpOwogICAgIGNvbnRleHQuZmx1
c2goKTsKIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1Bh
dGhEaXJlY3QyRC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL1BhdGhEaXJlY3QyRC5jcHAJKHJldmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9QYXRoRGlyZWN0MkQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5j
bHVkZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAi
UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaCIKICNpbmNsdWRlICJTdHJva2VTdHlsZUFwcGxpZXIu
aCIKICNpbmNsdWRlIDxkMmQxLmg+CiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KQEAgLTI0
OSw3ICsyNTAsOCBAQCBib29sIFBhdGg6OnN0cm9rZUNvbnRhaW5zKFN0cm9rZVN0eWxlQXBwCiAK
ICAgICBBU1NFUlQoYXBwbGllcik7CiAKLSAgICBHcmFwaGljc0NvbnRleHQgc2NyYXRjaENvbnRl
eHQoc2NyYXRjaFJlbmRlclRhcmdldCgpLCBHcmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRlcmlu
Z0NvbnRleHRUeXBlOjpHUFVNZW1vcnkpOworICAgIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEIHNj
cmF0Y2hDb250ZXh0RDJEKHNjcmF0Y2hSZW5kZXJUYXJnZXQoKSk7CisgICAgR3JhcGhpY3NDb250
ZXh0IHNjcmF0Y2hDb250ZXh0KCZzY3JhdGNoQ29udGV4dEQyRCwgR3JhcGhpY3NDb250ZXh0OjpC
aXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZTo6R1BVTWVtb3J5KTsKICAgICBhcHBsaWVyLT5zdHJv
a2VTdHlsZSgmc2NyYXRjaENvbnRleHQpOwogCiAgICAgQk9PTCBjb250YWluc1BvaW50ID0gZmFs
c2U7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUGF0dGVybkRp
cmVjdDJELmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vUGF0dGVybkRpcmVjdDJELmNwcAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BhdHRlcm5EaXJlY3QyRC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgog
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERp
cmVjdDJELmgiCiAjaW5jbHVkZSA8ZDJkMS5oPgogI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+
CiAKQEAgLTM4LDYgKzM5LDE0IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogSUQyRDFCaXRtYXBC
cnVzaCogUGF0dGVybjo6Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGNvbnN0IEdyYXBoaWNzQ29udGV4
dCYgY29udGV4dCwgZmxvYXQgYWxwaGEsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdXNlclNwYWNl
VHJhbnNmb3JtYXRpb24pIGNvbnN0CiB7CisgICAgYXV0byBwbGF0Zm9ybUNvbnRleHQgPSBjb250
ZXh0LnBsYXRmb3JtQ29udGV4dCgpOworICAgIFJFTEVBU0VfQVNTRVJUKHBsYXRmb3JtQ29udGV4
dCk7CisKKyAgICByZXR1cm4gY3JlYXRlUGxhdGZvcm1QYXR0ZXJuKCpwbGF0Zm9ybUNvbnRleHQs
IGFscGhhLCB1c2VyU3BhY2VUcmFuc2Zvcm1hdGlvbik7Cit9CisKK0lEMkQxQml0bWFwQnJ1c2gq
IFBhdHRlcm46OmNyZWF0ZVBsYXRmb3JtUGF0dGVybihQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCYg
Y29udGV4dCwgZmxvYXQgYWxwaGEsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdXNlclNwYWNlVHJh
bnNmb3JtYXRpb24pIGNvbnN0Cit7CiAgICAgQWZmaW5lVHJhbnNmb3JtIHBhdHRlcm5UcmFuc2Zv
cm0gPSB1c2VyU3BhY2VUcmFuc2Zvcm1hdGlvbiAqIG1fcGF0dGVyblNwYWNlVHJhbnNmb3JtYXRp
b247CiAgICAgYXV0byBiaXRtYXBCcnVzaFByb3BlcnRpZXMgPSBEMkQxOjpCaXRtYXBCcnVzaFBy
b3BlcnRpZXMoKTsKICAgICBiaXRtYXBCcnVzaFByb3BlcnRpZXMuZXh0ZW5kTW9kZVggPSBtX3Jl
cGVhdFggPyBEMkQxX0VYVEVORF9NT0RFX1dSQVAgOiBEMkQxX0VYVEVORF9NT0RFX0NMQU1QOwpA
QCAtNDgsMTkgKzU3LDE1IEBAIElEMkQxQml0bWFwQnJ1c2gqIFBhdHRlcm46OmNyZWF0ZVBsYXRm
b3IKICAgICBicnVzaFByb3BlcnRpZXMub3BhY2l0eSA9IGFscGhhOwogCiAgICAgYXV0byYgcGF0
dGVybkltYWdlID0gdGlsZUltYWdlKCk7Ci0KLSAgICBhdXRvIHBsYXRmb3JtQ29udGV4dCA9IGNv
bnRleHQucGxhdGZvcm1Db250ZXh0KCk7Ci0gICAgUkVMRUFTRV9BU1NFUlQocGxhdGZvcm1Db250
ZXh0KTsKLQotICAgIGF1dG8gbmF0aXZlSW1hZ2UgPSBwYXR0ZXJuSW1hZ2UubmF0aXZlSW1hZ2Uo
JmNvbnRleHQpOworICAgIGF1dG8gbmF0aXZlSW1hZ2UgPSBwYXR0ZXJuSW1hZ2UubmF0aXZlSW1h
Z2UobnVsbHB0cik7CiAKICAgICBDT01QdHI8SUQyRDFCaXRtYXA+IGJpdG1hcDsKLSAgICBIUkVT
VUxUIGhyID0gcGxhdGZvcm1Db250ZXh0LT5DcmVhdGVCaXRtYXBGcm9tV2ljQml0bWFwKG5hdGl2
ZUltYWdlLmdldCgpLCAmYml0bWFwKTsKKyAgICBIUkVTVUxUIGhyID0gY29udGV4dC5yZW5kZXJU
YXJnZXQoKS0+Q3JlYXRlQml0bWFwRnJvbVdpY0JpdG1hcChuYXRpdmVJbWFnZS5nZXQoKSwgJmJp
dG1hcCk7CiAgICAgaWYgKCFTVUNDRUVERUQoaHIpKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsK
IAogICAgIElEMkQxQml0bWFwQnJ1c2gqIHBhdHRlcm5CcnVzaCA9IG51bGxwdHI7Ci0gICAgaHIg
PSBwbGF0Zm9ybUNvbnRleHQtPkNyZWF0ZUJpdG1hcEJydXNoKGJpdG1hcC5nZXQoKSwgJmJpdG1h
cEJydXNoUHJvcGVydGllcywgJmJydXNoUHJvcGVydGllcywgJnBhdHRlcm5CcnVzaCk7CisgICAg
aHIgPSBjb250ZXh0LnJlbmRlclRhcmdldCgpLT5DcmVhdGVCaXRtYXBCcnVzaChiaXRtYXAuZ2V0
KCksICZiaXRtYXBCcnVzaFByb3BlcnRpZXMsICZicnVzaFByb3BlcnRpZXMsICZwYXR0ZXJuQnJ1
c2gpOwogICAgIEFTU0VSVChTVUNDRUVERUQoaHIpKTsKICAgICByZXR1cm4gcGF0dGVybkJydXNo
OwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BsYXRmb3Jt
Q29udGV4dERpcmVjdDJELmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuY3BwCShub25leGlzdGVudCkK
KysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9QbGF0Zm9ybUNvbnRleHRE
aXJlY3QyRC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCisKKyNpZiBVU0UoRElSRUNUMkQp
CisKKyNpbmNsdWRlICJEaXJlY3QyRE9wZXJhdGlvbnMuaCIKKyNpbmNsdWRlIDxkMmQxLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gRW5jYXBzdWxhdGVzIHRoZSBhZGRpdGlvbmFsIHBh
aW50aW5nIHN0YXRlIGluZm9ybWF0aW9uIHdlIHN0b3JlIGZvciBlYWNoCisvLyBwdXNoZWQgZ3Jh
cGhpY3Mgc3RhdGUuCitjbGFzcyBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6U3RhdGUgeworcHVi
bGljOgorICAgIFN0YXRlKCkgPSBkZWZhdWx0OworfTsKKworUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQ6OlBsYXRmb3JtQ29udGV4dERpcmVjdDJEKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJn
ZXQpCisgICAgOiBtX3JlbmRlclRhcmdldChyZW5kZXJUYXJnZXQpCit7CisgICAgbV9zdGF0ZVN0
YWNrLmFwcGVuZChTdGF0ZSgpKTsKKyAgICBtX3N0YXRlID0gJm1fc3RhdGVTdGFjay5sYXN0KCk7
Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnJlc3RvcmUoKQoreworICAgIEFT
U0VSVChtX3JlbmRlclRhcmdldCk7CisKKyAgICBhdXRvIHJlc3RvcmVTdGF0ZSA9IG1fcmVuZGVy
U3RhdGVzLnRha2VMYXN0KCk7CisgICAgbV9yZW5kZXJUYXJnZXQtPlJlc3RvcmVEcmF3aW5nU3Rh
dGUocmVzdG9yZVN0YXRlLm1fZHJhd2luZ1N0YXRlQmxvY2suZ2V0KCkpOworCisgICAgZm9yIChh
dXRvIGNsaXBUeXBlID0gcmVzdG9yZVN0YXRlLm1fY2xpcHMucmJlZ2luKCk7IGNsaXBUeXBlICE9
IHJlc3RvcmVTdGF0ZS5tX2NsaXBzLnJlbmQoKTsgKytjbGlwVHlwZSkgeworICAgICAgICBpZiAo
KmNsaXBUeXBlID09IEF4aXNBbGlnbmVkQ2xpcCkKKyAgICAgICAgICAgIG1fcmVuZGVyVGFyZ2V0
LT5Qb3BBeGlzQWxpZ25lZENsaXAoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV9yZW5k
ZXJUYXJnZXQtPlBvcExheWVyKCk7CisgICAgfQorCisgICAgbV9zdGF0ZVN0YWNrLnJlbW92ZUxh
c3QoKTsKKyAgICBBU1NFUlQoIW1fc3RhdGVTdGFjay5pc0VtcHR5KCkpOworICAgIG1fc3RhdGUg
PSAmbV9zdGF0ZVN0YWNrLmxhc3QoKTsKK30KKworUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6On5Q
bGF0Zm9ybUNvbnRleHREaXJlY3QyRCgpID0gZGVmYXVsdDsKKwordm9pZCBQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRDo6c2F2ZSgpCit7CisgICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0KTsKKworICAg
IG1fc3RhdGVTdGFjay5hcHBlbmQoU3RhdGUoKSk7CisgICAgbV9zdGF0ZSA9ICZtX3N0YXRlU3Rh
Y2subGFzdCgpOworCisgICAgUmVuZGVyU3RhdGUgY3VycmVudFN0YXRlOworICAgIEdyYXBoaWNz
Q29udGV4dDo6c3lzdGVtRmFjdG9yeSgpLT5DcmVhdGVEcmF3aW5nU3RhdGVCbG9jaygmY3VycmVu
dFN0YXRlLm1fZHJhd2luZ1N0YXRlQmxvY2spOworCisgICAgbV9yZW5kZXJUYXJnZXQtPlNhdmVE
cmF3aW5nU3RhdGUoY3VycmVudFN0YXRlLm1fZHJhd2luZ1N0YXRlQmxvY2suZ2V0KCkpOworCisg
ICAgbV9yZW5kZXJTdGF0ZXMuYXBwZW5kKGN1cnJlbnRTdGF0ZSk7Cit9CisKKy8qCit2b2lkIFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEOjpwdXNoSW1hZ2VNYXNrKGNhaXJvX3N1cmZhY2VfdCogc3Vy
ZmFjZSwgY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworXCAgICAvLyBXZSBtdXN0IGNhbGwgc2F2
ZVBsYXRmb3JtU3RhdGUgYXQgbGVhc3Qgb25jZSBiZWZvcmUgd2UgY2FuIHVzZSBpbWFnZSBtYXNr
aW5nLAorICAgIC8vIHNpbmNlIHdlIGFjdHVhbGx5IGFwcGx5IHRoZSBtYXNrIGluIHJlc3RvcmVQ
bGF0Zm9ybVN0YXRlLgorICAgIEFTU0VSVCghbV9zdGF0ZVN0YWNrLmlzRW1wdHkoKSk7CisgICAg
bV9zdGF0ZS0+bV9tYXNrLnBhdHRlcm4gPSBhZG9wdFJlZihjYWlyb19wYXR0ZXJuX2NyZWF0ZV9m
b3Jfc3VyZmFjZShzdXJmYWNlKSk7CisgICAgY2Fpcm9fZ2V0X21hdHJpeChtX2NyLmdldCgpLCAm
bV9zdGF0ZS0+bV9tYXNrLm1hdHJpeCk7CisKKyAgICBjYWlyb19tYXRyaXhfdCBtYXRyaXg7Cisg
ICAgY2Fpcm9fbWF0cml4X2luaXRfdHJhbnNsYXRlKCZtYXRyaXgsIC1yZWN0LngoKSwgLXJlY3Qu
eSgpKTsKKyAgICBjYWlyb19wYXR0ZXJuX3NldF9tYXRyaXgobV9zdGF0ZS0+bV9tYXNrLnBhdHRl
cm4uZ2V0KCksICZtYXRyaXgpOworCisgICAgY2Fpcm9fcHVzaF9ncm91cChtX2NyLmdldCgpKTsK
K30KKyovCisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnB1c2hSZW5kZXJDbGlwKERp
cmVjdDJETGF5ZXJUeXBlIGNsaXBUeXBlKQoreworICAgIEFTU0VSVChoYXNTYXZlZFN0YXRlKCkp
OworICAgIG1fcmVuZGVyU3RhdGVzLmxhc3QoKS5tX2NsaXBzLmFwcGVuZChjbGlwVHlwZSk7Cit9
CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnNldEFjdGl2ZUxheWVyKENPTVB0cjxJ
RDJEMUxheWVyPiYmIGxheWVyKQoreworICAgIEFTU0VSVChoYXNTYXZlZFN0YXRlKCkpOworICAg
IG1fcmVuZGVyU3RhdGVzLmxhc3QoKS5tX2FjdGl2ZUxheWVyID0gbGF5ZXI7Cit9CisKK0NPTVB0
cjxJRDJEMVNvbGlkQ29sb3JCcnVzaD4gUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OmJydXNoV2l0
aENvbG9yKGNvbnN0IEQyRDFfQ09MT1JfRiYgY29sb3IpCit7CisgICAgUkdCQTMyIGNvbG9yS2V5
ID0gbWFrZVJHQkEzMkZyb21GbG9hdHMoY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwgY29sb3Iu
YSk7CisKKyAgICBpZiAoIWNvbG9yS2V5KSB7CisgICAgICAgIGlmICghbV96ZXJvQnJ1c2gpCisg
ICAgICAgICAgICBtX3JlbmRlclRhcmdldC0+Q3JlYXRlU29saWRDb2xvckJydXNoKGNvbG9yLCAm
bV96ZXJvQnJ1c2gpOworICAgICAgICByZXR1cm4gbV96ZXJvQnJ1c2g7CisgICAgfQorCisgICAg
aWYgKGNvbG9yS2V5ID09IDB4RkZGRkZGRkYpIHsKKyAgICAgICAgaWYgKCFtX3doaXRlQnJ1c2gp
CisgICAgICAgICAgICBtX3JlbmRlclRhcmdldC0+Q3JlYXRlU29saWRDb2xvckJydXNoKGNvbG9y
LCAmbV93aGl0ZUJydXNoKTsKKyAgICAgICAgcmV0dXJuIG1fd2hpdGVCcnVzaDsKKyAgICB9CisK
KyAgICBhdXRvIGV4aXN0aW5nQnJ1c2ggPSBtX3NvbGlkQ29sb3JlZEJydXNoQ2FjaGUuZW5zdXJl
KGNvbG9yS2V5LCBbdGhpcywgY29sb3JdIHsKKyAgICAgICAgQ09NUHRyPElEMkQxU29saWRDb2xv
ckJydXNoPiBjb2xvckJydXNoOworICAgICAgICBtX3JlbmRlclRhcmdldC0+Q3JlYXRlU29saWRD
b2xvckJydXNoKGNvbG9yLCAmY29sb3JCcnVzaCk7CisgICAgICAgIHJldHVybiBjb2xvckJydXNo
OworICAgIH0pOworCisgICAgcmV0dXJuIGV4aXN0aW5nQnJ1c2guaXRlcmF0b3ItPnZhbHVlOwor
fQorCit2b2lkIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpyZWNvbXB1dGVTdHJva2VTdHlsZSgp
Cit7CisgICAgaWYgKCFtX3N0cm9rZVN5bGVJc0RpcnR5KQorICAgICAgICByZXR1cm47CisKKyAg
ICBtX2QyZFN0cm9rZVN0eWxlID0gbnVsbHB0cjsKKworICAgIERhc2hBcnJheSBkYXNoZXM7Cisg
ICAgZmxvYXQgcGF0dGVybk9mZnNldCA9IDA7CisgICAgYXV0byBkYXNoU3R5bGUgPSBEMkQxX0RB
U0hfU1RZTEVfU09MSUQ7CisKKyAgICBpZiAoKG1fc3Ryb2tlU3R5bGUgIT0gU29saWRTdHJva2Up
ICYmIChtX3N0cm9rZVN0eWxlICE9IE5vU3Ryb2tlKSkgeworICAgICAgICBkYXNoU3R5bGUgPSBE
MkQxX0RBU0hfU1RZTEVfQ1VTVE9NOworICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0gbV9wYXR0ZXJu
T2Zmc2V0IC8gbV9zdHJva2VUaGlja25lc3M7CisgICAgICAgIGRhc2hlcyA9IG1fZGFzaGVzOwor
CisgICAgICAgIC8vIEluIERpcmVjdDJELCBkYXNoZXMgYW5kIGRvdHMgYXJlIGRlZmluZWQgaW4g
dGVybXMgb2YgdGhlIHJhdGlvIG9mIHRoZSBkYXNoIGxlbmd0aCB0byB0aGUgbGluZSB0aGlja25l
c3MuCisgICAgICAgIGZvciAoYXV0byYgZGFzaCA6IGRhc2hlcykKKyAgICAgICAgICAgIGRhc2gg
Lz0gbV9zdHJva2VUaGlja25lc3M7CisgICAgfQorCisgICAgYXV0byBzdHJva2VTdHlsZVByb3Bl
cnRpZXMgPSBEMkQxOjpTdHJva2VTdHlsZVByb3BlcnRpZXMobV9saW5lQ2FwLCBtX2xpbmVDYXAs
IG1fbGluZUNhcCwgbV9saW5lSm9pbiwgbV9taXRlckxpbWl0LCBkYXNoU3R5bGUsIHBhdHRlcm5P
ZmZzZXQpOworICAgIEdyYXBoaWNzQ29udGV4dDo6c3lzdGVtRmFjdG9yeSgpLT5DcmVhdGVTdHJv
a2VTdHlsZSgmc3Ryb2tlU3R5bGVQcm9wZXJ0aWVzLCBkYXNoZXMuZGF0YSgpLCBkYXNoZXMuc2l6
ZSgpLCAmbV9kMmRTdHJva2VTdHlsZSk7CisKKyAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gZmFs
c2U7Cit9CisKK0lEMkQxU3Ryb2tlU3R5bGUqIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpzdHJv
a2VTdHlsZSgpCit7CisgICAgcmVjb21wdXRlU3Ryb2tlU3R5bGUoKTsKKyAgICByZXR1cm4gbV9k
MmRTdHJva2VTdHlsZS5nZXQoKTsKK30KKworRDJEMV9TVFJPS0VfU1RZTEVfUFJPUEVSVElFUyBQ
bGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6c3Ryb2tlU3R5bGVQcm9wZXJ0aWVzKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gRDJEMTo6U3Ryb2tlU3R5bGVQcm9wZXJ0aWVzKG1fbGluZUNhcCwgbV9saW5l
Q2FwLCBtX2xpbmVDYXAsIG1fbGluZUpvaW4sIG1fbWl0ZXJMaW1pdCwgRDJEMV9EQVNIX1NUWUxF
X1NPTElELCAwLjBmKTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6c2V0TGlu
ZUNhcChEMkQxX0NBUF9TVFlMRSBsaW5lQ2FwKQoreworICAgIGlmIChtX2xpbmVDYXAgPT0gbGlu
ZUNhcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9saW5lQ2FwID0gbGluZUNhcDsKKyAgICBt
X3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRDo6c2V0TGluZUpvaW4oRDJEMV9MSU5FX0pPSU4gam9pbikKK3sKKyAgICBpZiAobV9saW5l
Sm9pbiA9PSBqb2luKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2xpbmVKb2luID0gam9pbjsK
KyAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRDo6c2V0U3Ryb2tlU3R5bGUoU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUpCit7Cisg
ICAgaWYgKG1fc3Ryb2tlU3R5bGUgPT0gc3Ryb2tlU3R5bGUpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZTsKKyAgICBtX3N0cm9rZVN5bGVJc0RpcnR5
ID0gdHJ1ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6c2V0U3Ryb2tlVGhp
Y2tuZXNzKGZsb2F0IHRoaWNrbmVzcykKK3sKKyAgICBpZiAoV1RGOjphcmVFc3NlbnRpYWxseUVx
dWFsKHRoaWNrbmVzcywgbV9zdHJva2VUaGlja25lc3MpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBtX3N0cm9rZVRoaWNrbmVzcyA9IHRoaWNrbmVzczsKKyAgICBtX3N0cm9rZVN5bGVJc0RpcnR5
ID0gdHJ1ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6c2V0TWl0ZXJMaW1p
dChmbG9hdCBjYW52YXNNaXRlckxpbWl0KQoreworICAgIC8vIERpcmVjdDJEIG1pdGVyIGxpbWl0
IGlzIGluIHRlcm1zIG9mIEhBTEYgdGhlIGxpbmUgdGhpY2tuZXNzLgorICAgIGZsb2F0IG1pdGVy
TGltaXQgPSAwLjVmICogY2FudmFzTWl0ZXJMaW1pdDsKKyAgICBpZiAoV1RGOjphcmVFc3NlbnRp
YWxseUVxdWFsKG1pdGVyTGltaXQsIG1fbWl0ZXJMaW1pdCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fbWl0ZXJMaW1pdCA9IG1pdGVyTGltaXQ7CisgICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9
IHRydWU7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnNldERhc2hPZmZzZXQo
ZmxvYXQgZGFzaE9mZnNldCkKK3sKKyAgICBpZiAoV1RGOjphcmVFc3NlbnRpYWxseUVxdWFsKGRh
c2hPZmZzZXQsIG1fZGFzaE9mZnNldCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fZGFzaE9m
ZnNldCA9IGRhc2hPZmZzZXQ7CisgICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7Cit9CisK
K3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnNldERhc2hlcyhjb25zdCBEYXNoQXJyYXkm
IGRhc2hlcykKK3sKKyAgICBpZiAobV9kYXNoZXMgPT0gZGFzaGVzKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX2Rhc2hlcyA9IGRhc2hlczsKKyAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1
ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6c2V0UGF0dGVybldpZHRoKGZs
b2F0IHBhdHRlcm5XaWR0aCkKK3sKKyAgICBpZiAoV1RGOjphcmVFc3NlbnRpYWxseUVxdWFsKHBh
dHRlcm5XaWR0aCwgbV9wYXR0ZXJuV2lkdGgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Bh
dHRlcm5XaWR0aCA9IHBhdHRlcm5XaWR0aDsKKyAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1
ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6c2V0UGF0dGVybk9mZnNldChm
bG9hdCBwYXR0ZXJuT2Zmc2V0KQoreworICAgIGlmIChXVEY6OmFyZUVzc2VudGlhbGx5RXF1YWwo
cGF0dGVybk9mZnNldCwgbV9wYXR0ZXJuT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
bV9wYXR0ZXJuT2Zmc2V0ID0gcGF0dGVybk9mZnNldDsKKyAgICBtX3N0cm9rZVN5bGVJc0RpcnR5
ID0gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKERJ
UkVDVDJEKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BsYXRm
b3JtQ29udGV4dERpcmVjdDJELmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL1BsYXRmb3JtQ29udGV4dERpcmVjdDJELmgJKG5vbmV4aXN0ZW50KQor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BsYXRmb3JtQ29udGV4dERp
cmVjdDJELmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBVU0Uo
RElSRUNUMkQpCisKKyNpbmNsdWRlICJDT01QdHIuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlIDxkMmQxLmg+CisjaW5jbHVkZSA8ZDJkMV8xLmg+CisjaW5jbHVkZSA8
ZDJkMWVmZmVjdHMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGU7CitzdHJ1Y3QgR3JhcGhpY3NDb250ZXh0U3RhdGU7CisKK25h
bWVzcGFjZSBEaXJlY3QyRCB7CitzdHJ1Y3QgRmlsbFNvdXJjZTsKK3N0cnVjdCBTdHJva2VTb3Vy
Y2U7CitzdHJ1Y3QgU2hhZG93U3RhdGU7Cit9CisKK2NsYXNzIFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCk7
CitwdWJsaWM6CisgICAgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQoSUQyRDFSZW5kZXJUYXJnZXQq
KTsKKyAgICB+UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQoKTsKKworICAgIElEMkQxUmVuZGVyVGFy
Z2V0KiByZW5kZXJUYXJnZXQoKSB7IHJldHVybiBtX3JlbmRlclRhcmdldC5nZXQoKTsgfQorICAg
IHZvaWQgc2V0UmVuZGVyVGFyZ2V0KElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsg
bV9yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7IH0KKworICAgIEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZSogZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpIHsgcmV0dXJuIG1fZ3JhcGhp
Y3NDb250ZXh0UHJpdmF0ZTsgfQorICAgIHZvaWQgc2V0R3JhcGhpY3NDb250ZXh0UHJpdmF0ZShH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUqIGdyYXBoaWNzQ29udGV4dFByaXZhdGUpIHsg
bV9ncmFwaGljc0NvbnRleHRQcml2YXRlID0gZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZTsgfQorCisg
ICAgSUQyRDFMYXllciogY2xpcExheWVyKCkgY29uc3QgeyByZXR1cm4gbV9yZW5kZXJTdGF0ZXMu
bGFzdCgpLm1fYWN0aXZlTGF5ZXIuZ2V0KCk7IH0KKyAgICBJRDJEMVN0cm9rZVN0eWxlKiBzdHJv
a2VTdHlsZSgpOworICAgIEQyRDFfU1RST0tFX1NUWUxFX1BST1BFUlRJRVMgc3Ryb2tlU3R5bGVQ
cm9wZXJ0aWVzKCkgY29uc3Q7CisgICAgSUQyRDFTdHJva2VTdHlsZSogcGxhdGZvcm1TdHJva2VT
dHlsZSgpIGNvbnN0OworCisgICAgQ09NUHRyPElEMkQxU29saWRDb2xvckJydXNoPiBicnVzaFdp
dGhDb2xvcihjb25zdCBEMkQxX0NPTE9SX0YmKTsKKworICAgIHZvaWQgc2F2ZSgpOworICAgIHZv
aWQgcmVzdG9yZSgpOworCisgICAgYm9vbCBoYXNTYXZlZFN0YXRlKCkgY29uc3QgeyByZXR1cm4g
IW1fcmVuZGVyU3RhdGVzLmlzRW1wdHkoKTsgfQorCisgICAgZW51bSBEaXJlY3QyRExheWVyVHlw
ZSB7IEF4aXNBbGlnbmVkQ2xpcCwgTGF5ZXJDbGlwIH07CisgICAgdm9pZCBwdXNoUmVuZGVyQ2xp
cChEaXJlY3QyRExheWVyVHlwZSk7CisgICAgdm9pZCBzZXRBY3RpdmVMYXllcihDT01QdHI8SUQy
RDFMYXllcj4mJik7CisKKyAgICB2b2lkIHJlY29tcHV0ZVN0cm9rZVN0eWxlKCk7CisgICAgZmxv
YXQgc3Ryb2tlVGhpY2tuZXNzKCkgY29uc3QgeyByZXR1cm4gbV9zdHJva2VUaGlja25lc3M7IH0K
KworICAgIHN0cnVjdCBSZW5kZXJTdGF0ZSB7CisgICAgICAgIENPTVB0cjxJRDJEMURyYXdpbmdT
dGF0ZUJsb2NrPiBtX2RyYXdpbmdTdGF0ZUJsb2NrOworICAgICAgICBDT01QdHI8SUQyRDFMYXll
cj4gbV9hY3RpdmVMYXllcjsKKyAgICAgICAgVmVjdG9yPERpcmVjdDJETGF5ZXJUeXBlPiBtX2Ns
aXBzOworICAgIH07CisgICAgVmVjdG9yPFJlbmRlclN0YXRlPiBtX3JlbmRlclN0YXRlczsKKwor
ICAgIHN0cnVjdCBUcmFuc3BhcmVuY3lMYXllclN0YXRlIHsKKyAgICAgICAgQ09NUHRyPElEMkQx
Qml0bWFwUmVuZGVyVGFyZ2V0PiByZW5kZXJUYXJnZXQ7CisgICAgICAgIENvbG9yIHNoYWRvd0Nv
bG9yOworICAgICAgICBGbG9hdFNpemUgc2hhZG93T2Zmc2V0OworICAgICAgICBmbG9hdCBvcGFj
aXR5IHsgMS4wIH07CisgICAgICAgIGZsb2F0IHNoYWRvd0JsdXIgeyAwIH07CisgICAgICAgIGJv
b2wgaGFzU2hhZG93IHsgZmFsc2UgfTsKKyAgICB9OworICAgIFZlY3RvcjxUcmFuc3BhcmVuY3lM
YXllclN0YXRlPiBtX3RyYW5zcGFyZW5jeUxheWVyU3RhY2s7CisKKyAgICB2b2lkIHNldExpbmVD
YXAoRDJEMV9DQVBfU1RZTEUpOworICAgIHZvaWQgc2V0TGluZUpvaW4oRDJEMV9MSU5FX0pPSU4p
OworICAgIHZvaWQgc2V0U3Ryb2tlU3R5bGUoU3Ryb2tlU3R5bGUpOworICAgIHZvaWQgc2V0TWl0
ZXJMaW1pdChmbG9hdCk7CisgICAgdm9pZCBzZXREYXNoT2Zmc2V0KGZsb2F0KTsKKyAgICB2b2lk
IHNldFBhdHRlcm5XaWR0aChmbG9hdCk7CisgICAgdm9pZCBzZXRQYXR0ZXJuT2Zmc2V0KGZsb2F0
KTsKKyAgICB2b2lkIHNldFN0cm9rZVRoaWNrbmVzcyhmbG9hdCk7CisgICAgdm9pZCBzZXREYXNo
ZXMoY29uc3QgRGFzaEFycmF5Jik7CisKKyAgICB2b2lkIHNldEJsZW5kTW9kZShEMkQxX0JMRU5E
X01PREUgbW9kZSkgeyBtX2JsZW5kTW9kZSA9IG1vZGU7IH0KKyAgICB2b2lkIHNldENvbXBvc2l0
ZU1vZGUoRDJEMV9DT01QT1NJVEVfTU9ERSBtb2RlKSB7IG1fY29tcG9zaXRlTW9kZSA9IG1vZGU7
IH0KKworcHJpdmF0ZToKKyAgICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUqIG1fZ3Jh
cGhpY3NDb250ZXh0UHJpdmF0ZSB7IG51bGxwdHIgfTsKKworICAgIENPTVB0cjxJRDJEMVJlbmRl
clRhcmdldD4gbV9yZW5kZXJUYXJnZXQ7CisgICAgQ09NUHRyPElEMkQxU3Ryb2tlU3R5bGU+IG1f
ZDJkU3Ryb2tlU3R5bGU7CisKKyAgICBIYXNoTWFwPHVpbnQzMl90LCBDT01QdHI8SUQyRDFTb2xp
ZENvbG9yQnJ1c2g+PiBtX3NvbGlkQ29sb3JlZEJydXNoQ2FjaGU7CisgICAgQ09NUHRyPElEMkQx
U29saWRDb2xvckJydXNoPiBtX3doaXRlQnJ1c2g7CisgICAgQ09NUHRyPElEMkQxU29saWRDb2xv
ckJydXNoPiBtX3plcm9CcnVzaDsKKyAgICBDT01QdHI8SUQyRDFTb2xpZENvbG9yQnJ1c2g+IG1f
c29saWRTdHJva2VCcnVzaDsKKyAgICBDT01QdHI8SUQyRDFTb2xpZENvbG9yQnJ1c2g+IG1fc29s
aWRGaWxsQnJ1c2g7CisgICAgQ09NUHRyPElEMkQxQml0bWFwQnJ1c2g+IG1fcGF0dGVyblN0cm9r
ZUJydXNoOworICAgIENPTVB0cjxJRDJEMUJpdG1hcEJydXNoPiBtX3BhdHRlcm5GaWxsQnJ1c2g7
CisKKyAgICBjbGFzcyBTdGF0ZTsKKyAgICBTdGF0ZSogbV9zdGF0ZTsKKyAgICBWZWN0b3I8U3Rh
dGU+IG1fc3RhdGVTdGFjazsKKworICAgIEQyRDFfQ0FQX1NUWUxFIG1fbGluZUNhcCB7IEQyRDFf
Q0FQX1NUWUxFX0ZMQVQgfTsKKyAgICBEMkQxX0xJTkVfSk9JTiBtX2xpbmVKb2luIHsgRDJEMV9M
SU5FX0pPSU5fTUlURVIgfTsKKyAgICBTdHJva2VTdHlsZSBtX3N0cm9rZVN0eWxlIHsgU29saWRT
dHJva2UgfTsKKyAgICBEYXNoQXJyYXkgbV9kYXNoZXM7CisKKyAgICBmbG9hdCBtX21pdGVyTGlt
aXQgeyAxMC4wZiB9OworICAgIGZsb2F0IG1fZGFzaE9mZnNldCB7IDAgfTsKKyAgICBmbG9hdCBt
X3BhdHRlcm5XaWR0aCB7IDEuMGYgfTsKKyAgICBmbG9hdCBtX3BhdHRlcm5PZmZzZXQgeyAwIH07
CisgICAgZmxvYXQgbV9zdHJva2VUaGlja25lc3MgeyAwIH07CisgICAgZmxvYXQgbV9hbHBoYSB7
IDEuMCB9OworCisgICAgYm9vbCBtX3N0cm9rZVN5bGVJc0RpcnR5IHsgZmFsc2UgfTsKKworICAg
IEQyRDFfQkxFTkRfTU9ERSBtX2JsZW5kTW9kZSB7IEQyRDFfQkxFTkRfTU9ERV9NVUxUSVBMWSB9
OworICAgIEQyRDFfQ09NUE9TSVRFX01PREUgbV9jb21wb3NpdGVNb2RlIHsgRDJEMV9DT01QT1NJ
VEVfTU9ERV9TT1VSQ0VfT1ZFUiB9OworCisgICAgZnJpZW5kIGNsYXNzIEdyYXBoaWNzQ29udGV4
dDsKKyAgICBmcmllbmQgY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOworfTsK
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKERJUkVDVDJEKQpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAJKHJldmlz
aW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNzMsNiArMTczLDggQEAgRHJhZ0ltYWdlUmVmIGNyZWF0
ZURyYWdJbWFnZUZvckxpbmsoRWxlbQogICAgICAgICAgICAgaW1hZ2VTaXplLnNldFdpZHRoKHN0
ZDo6bWF4KGxhYmVsU2l6ZS53aWR0aCgpLCB1cmxTdHJpbmdTaXplLndpZHRoKCkpICsgRHJhZ0xh
YmVsQm9yZGVyWCAqIDIpOwogICAgIH0KIAorICAgIEFTU0VSVCgwKTsKKyAgICAvKgogICAgIC8v
IFdlIG5vdyBrbm93IGhvdyBiaWcgdGhlIGltYWdlIG5lZWRzIHRvIGJlLCBzbyB3ZSBjcmVhdGUg
YW5kCiAgICAgLy8gZmlsbCB0aGUgYmFja2dyb3VuZAogICAgIEhXbmREQyBkYygwKTsKQEAgLTIx
Miw2ICsyMTQsOCBAQCBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayhFbGVtCiAK
ICAgICBkZWFsbG9jQ29udGV4dChjb250ZXh0UmVmKTsKICAgICByZXR1cm4gaW1hZ2UubGVhaygp
OworICAgICovCisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIH0KSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3N2Zy9ncmFwaGljcy9TVkdJbWFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvc3ZnL2dyYXBoaWNzL1NWR0ltYWdlLmNwcAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNl
L1dlYkNvcmUvc3ZnL2dyYXBoaWNzL1NWR0ltYWdlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw2
ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRXJpYyBTZWlkZWwgPGVyaWNAd2Vi
a2l0Lm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5LCAyMDE1LTIwMTYgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTkgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBN
b3Rpb24gTGltaXRlZCAyMDExLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dApAQCAtNjgsNyArNjgsOSBAQAogCiAjaWYgVVNFKERJUkVDVDJEKQogI2luY2x1ZGUgIkNPTVB0
ci5oIgorI2luY2x1ZGUgIkRpcmVjdDJEVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAiSW1hZ2VEZWNv
ZGVyRGlyZWN0MkQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oIgogI2lu
Y2x1ZGUgPGQyZDEuaD4KICNlbmRpZgogCkBAIC0yMzgsMTcgKzI0MCwxMiBAQCBOYXRpdmVJbWFn
ZVB0ciBTVkdJbWFnZTo6bmF0aXZlSW1hZ2UoY29uCiAgICAgaWYgKCFTVUNDRUVERUQoaHIpKQog
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIGF1dG8gdGFyZ2V0UHJvcGVydGllcyA9IEQy
RDE6OlJlbmRlclRhcmdldFByb3BlcnRpZXMoRDJEMV9SRU5ERVJfVEFSR0VUX1RZUEVfREVGQVVM
VCwKLSAgICAgICAgRDJEMTo6UGl4ZWxGb3JtYXQoRFhHSV9GT1JNQVRfQjhHOFI4QThfVU5PUk0s
IEQyRDFfQUxQSEFfTU9ERV9QUkVNVUxUSVBMSUVEKSwKLSAgICAgICAgMCwgMCwgRDJEMV9SRU5E
RVJfVEFSR0VUX1VTQUdFX05PTkUsIEQyRDFfRkVBVFVSRV9MRVZFTF9ERUZBVUxUKTsKLQotICAg
IC8vIERyYXcgdGhlIFNWRyBpbnRvIGEgYml0bWFwLgotICAgIENPTVB0cjxJRDJEMVJlbmRlclRh
cmdldD4gbmF0aXZlSW1hZ2VUYXJnZXQ7Ci0gICAgaHIgPSBHcmFwaGljc0NvbnRleHQ6OnN5c3Rl
bUZhY3RvcnkoKS0+Q3JlYXRlV2ljQml0bWFwUmVuZGVyVGFyZ2V0KG5hdGl2ZUltYWdlLmdldCgp
LCAmdGFyZ2V0UHJvcGVydGllcywgJm5hdGl2ZUltYWdlVGFyZ2V0KTsKLSAgICBpZiAoIW5hdGl2
ZUltYWdlVGFyZ2V0IHx8ICFTVUNDRUVERUQoaHIpKQorICAgIENPTVB0cjxJRDJEMVJlbmRlclRh
cmdldD4gbmF0aXZlSW1hZ2VUYXJnZXQgPSBEaXJlY3QyRDo6Y3JlYXRlUmVuZGVyVGFyZ2V0RnJv
bVdJQ0JpdG1hcChuYXRpdmVJbWFnZS5nZXQoKSk7CisgICAgaWYgKCFuYXRpdmVJbWFnZVRhcmdl
dCkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICBHcmFwaGljc0NvbnRleHQgbG9jYWxD
b250ZXh0KG5hdGl2ZUltYWdlVGFyZ2V0LmdldCgpLCBHcmFwaGljc0NvbnRleHQ6OkJpdG1hcFJl
bmRlcmluZ0NvbnRleHRUeXBlOjpDUFVNZW1vcnkpOworICAgIFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEIHBsYXRmb3JtQ29udGV4dChuYXRpdmVJbWFnZVRhcmdldC5nZXQoKSk7CisgICAgR3JhcGhp
Y3NDb250ZXh0IGxvY2FsQ29udGV4dCgmcGxhdGZvcm1Db250ZXh0LCBHcmFwaGljc0NvbnRleHQ6
OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1vcnkpOwogCiAgICAgZHJhdyhsb2Nh
bENvbnRleHQsIHJlY3QoKSwgcmVjdCgpLCBDb21wb3NpdGVTb3VyY2VPdmVyLCBCbGVuZE1vZGU6
Ok5vcm1hbCwgRGVjb2RpbmdNb2RlOjpTeW5jaHJvbm91cywgSW1hZ2VPcmllbnRhdGlvbkRlc2Ny
aXB0aW9uKCkpOwogCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>375182</attachid>
            <date>2019-07-30 14:52:12 -0700</date>
            <delta_ts>2019-07-30 15:36:22 -0700</delta_ts>
            <desc>Patch for landing</desc>
            <filename>bug-200270-20190730145207.patch</filename>
            <type>text/plain</type>
            <size>208891</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0ODAwOSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ2IEBACisyMDE5LTA3LTMwICBCcmVudCBG
dWxnaGFtICA8YmZ1bGdoYW1AYXBwbGUuY29tPgorCisgICAgICAgIFtGVFddIFJlZmFjdG9yIERp
cmVjdDJEIGNvZGUgdG8gZm9sbG93IENhaXJvJ3MgbW9kZWwgdG8gc3VwcG9ydCBtb2Rlcm4gV2Vi
S2l0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDAy
NzAKKworICAgICAgICBSZXZpZXdlZCBieSBEZWFuIEphY2tzb24uCisKKyAgICAgICAgUmVmYWN0
b3IgdGhlIERpcmVjdDJEIGNvZGUgaW4gV2ViQ29yZSBzbyB0aGF0IHRoZSBjb3JlIHJvdXRpbmVz
IGNhbiBiZSBzaGFyZWQKKyAgICAgICAgYmV0d2VlbiBHcmFwaGljc0NvbnRleHQgYW5kIEdyYXBo
aWNzQ29udGV4dEltcGwuIEltcGxlbWVudCBQbGF0Zm9ybUNvbnRleHQsCisgICAgICAgIEJhY2tp
bmdTdG9yZUJhY2tlbmQsIGFuZCBHcmFwaGljc0NvbnRleHRJbXBsIGZvciB0aGUgRGlyZWN0MkQg
ZW5naW5lLgorICAgICAgIAorICAgICAgICBUaGlzIHBhdGNoIGVmZmVjdGl2ZWx5IGp1c3QgbW92
ZXMgY29kZSBhcm91bmQuCisKKyAgICAgICAgKiBQbGF0Zm9ybUZUVy5jbWFrZToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaDoKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHRJbXBsLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvSW1hZ2VTb3VyY2UuY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1BhdHRl
cm4uaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxheUxp
c3RSZWNvcmRlci5jcHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3Rz
L0Rpc3BsYXlMaXN0UmVjb3JkZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4v
QmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJELmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJbXBsLmNwcDogQWRkZWQu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJl
Y3QyREltcGwuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0RpcmVj
dDJET3BlcmF0aW9ucy5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9EaXJlY3QyRE9wZXJhdGlvbnMuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0RpcmVjdDJEVXRpbGl0aWVzLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0RpcmVjdDJEVXRpbGl0aWVzLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL3dpbi9Gb250Q2FzY2FkZURpcmVjdDJELmNwcDoKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW4vR3JhZGllbnREaXJlY3QyRC5jcHA6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dERpcmVjdDJELmNwcDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmNwcDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dEltcGxE
aXJlY3QyRC5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGlyZWN0MkQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy93aW4vSW1hZ2VCdWZmZXJEYXRhRGlyZWN0MkQuaDoKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vSW1hZ2VCdWZmZXJEaXJlY3QyRC5jcHA6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL05hdGl2ZUltYWdlRGlyZWN0MkQuY3BwOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL3dpbi9QYXRoRGlyZWN0MkQuY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9QYXR0ZXJuRGlyZWN0MkQuY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL3dpbi9QbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5jcHA6IEFkZGVkLgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbi9QbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcDoKKyAgICAgICAgKiBzdmcvZ3Jh
cGhpY3MvU1ZHSW1hZ2UuY3BwOgorCiAyMDE5LTA3LTMwICBNaWNoYWVsIENhdGFuemFybyAgPG1j
YXRhbnphcm9AaWdhbGlhLmNvbT4KIAogICAgICAgICBbR1RLXSBDb21waWxhdGlvbiBlcnJvcnMg
d2hlbiBHTCBpcyBkaXNhYmxlZApJbmRleDogU291cmNlL1dlYkNvcmUvUGxhdGZvcm1GVFcuY21h
a2UKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvUGxhdGZvcm1GVFcuY21ha2UJKHJldmlz
aW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL1BsYXRmb3JtRlRXLmNtYWtlCSh3b3JraW5n
IGNvcHkpCkBAIC00NSw2ICs0NSw3IEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09VUkNFUwogCiAg
ICAgcGxhdGZvcm0vZ3JhcGhpY3MvR0xDb250ZXh0LmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNz
L0dyYXBoaWNzQ29udGV4dDNEUHJpdmF0ZS5jcHAKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy9HcmFw
aGljc0NvbnRleHRJbXBsLmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL1BsYXRmb3JtRGlzcGxh
eS5jcHAKIAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL2VnbC9HTENvbnRleHRFR0wuY3BwCkBAIC01
Nyw5ICs1OCwxMiBAQCBsaXN0KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKIAogICAgIHBsYXRmb3Jt
L2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVXRpbGl0aWVzLmNwcAogCisgICAgcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwuY3BwCiAgICAgcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0NvbG9yRGlyZWN0MkQuY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0NvbXBsZXhUZXh0Q29udHJvbGxlckRpcmVjdFdyaXRlLmNwcAogICAgIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9ESUJQaXhlbERhdGEuY3BwCisgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0RpcmVjdDJET3BlcmF0aW9ucy5jcHAKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0
MkRVdGlsaXRpZXMuY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Zsb2F0UG9pbnREaXJl
Y3QyRC5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRmxvYXRSZWN0RGlyZWN0MkQuY3Bw
CiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Zsb2F0U2l6ZURpcmVjdDJELmNwcApAQCAtNzMs
NiArNzcsNyBAQCBsaXN0KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICBwbGF0Zm9ybS9ncmFw
aGljcy93aW4vR3JhZGllbnREaXJlY3QyRC5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NDb250ZXh0M0REaXJlY3QyRC5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NDb250ZXh0RGlyZWN0MkQuY3BwCisgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dy
YXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRC5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NDb250ZXh0V2luLmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9JY29uV2lu
LmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRhdGFEaXJlY3QyRC5j
cHAKQEAgLTg3LDYgKzkyLDcgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9TT1VSQ0VTCiAgICAgcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL05hdGl2ZUltYWdlRGlyZWN0MkQuY3BwCiAgICAgcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL1BhdGhEaXJlY3QyRC5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4v
UGF0dGVybkRpcmVjdDJELmNwcAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9QbGF0Zm9ybUNv
bnRleHREaXJlY3QyRC5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERh
dGFXaW4uY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhRGlyZWN0
MkQuY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1RleHRBbmFseXplckhlbHBlci5jcHAK
QEAgLTE0OSwxMiArMTU1LDE5IEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfUFJJVkFURV9GUkFNRVdP
UktfSEUKIAogICAgIHBhZ2Uvd2luL0ZyYW1lV2luLmgKIAorICAgIHBsYXRmb3JtL2dyYXBoaWNz
L3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQuaAorICAgIHBsYXRmb3JtL2dyYXBoaWNz
L3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJbXBsLmgKICAgICBwbGF0Zm9ybS9ncmFw
aGljcy93aW4vRElCUGl4ZWxEYXRhLmgKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0
MkRPcGVyYXRpb25zLmgKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0MkRVdGlsaXRp
ZXMuaAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9GdWxsU2NyZWVuQ29udHJvbGxlci5oCiAg
ICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Z1bGxTY3JlZW5Db250cm9sbGVyQ2xpZW50LmgKKyAg
ICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmgKICAg
ICBwbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VCdWZmZXJEYXRhRGlyZWN0MkQuaAorICAgIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZURlY29kZXJEaXJlY3QyRC5oCiAgICAgcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0xvY2FsV2luZG93c0NvbnRleHQuaAogICAgIHBsYXRmb3JtL2dyYXBoaWNz
L3dpbi9NZWRpYVBsYXllclByaXZhdGVGdWxsc2NyZWVuV2luZG93LmgKKyAgICBwbGF0Zm9ybS9n
cmFwaGljcy93aW4vUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaAogICAgIHBsYXRmb3JtL2dyYXBo
aWNzL3dpbi9TaGFyZWRHRElPYmplY3QuaAogCiAgICAgcGxhdGZvcm0vd2luL0JTdHJpbmcuaApJ
bmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR0xDb250ZXh0LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR0xDb250ZXh0LmgJKHJl
dmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dMQ29u
dGV4dC5oCSh3b3JraW5nIGNvcHkpCkBAIC00Miw2ICs0Miw4IEBAIHR5cGVkZWYgc3RydWN0IF9j
YWlyb19kZXZpY2UgY2Fpcm9fZGV2aWMKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCitjbGFzcyBJ
bnRTaXplOworCiBjbGFzcyBHTENvbnRleHQgewogICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEdM
Q29udGV4dCk7IFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwogcHVibGljOgpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmgJKHJl
dmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzQ29udGV4dC5oCSh3b3JraW5nIGNvcHkpCkBAIC00NCw3ICs0NCwxMCBAQCBpbnRlcmZhY2Ug
SUQyRDFEQ1JlbmRlclRhcmdldDsKIGludGVyZmFjZSBJRDJEMVJlbmRlclRhcmdldDsKIGludGVy
ZmFjZSBJRDJEMUZhY3Rvcnk7CiBpbnRlcmZhY2UgSUQyRDFTb2xpZENvbG9yQnJ1c2g7Ci10eXBl
ZGVmIElEMkQxUmVuZGVyVGFyZ2V0IFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0OworbmFtZXNwYWNl
IFdlYkNvcmUgeworY2xhc3MgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ7Cit9Cit0eXBlZGVmIFdl
YkNvcmU6OlBsYXRmb3JtQ29udGV4dERpcmVjdDJEIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0Owog
I2VsaWYgVVNFKENBSVJPKQogbmFtZXNwYWNlIFdlYkNvcmUgewogY2xhc3MgUGxhdGZvcm1Db250
ZXh0Q2Fpcm87CkBAIC0zNDcsMTAgKzM1MCw2IEBAIHB1YmxpYzoKICAgICBXRUJDT1JFX0VYUE9S
VCB2b2lkIGRyYXdOYXRpdmVJbWFnZShjb25zdCBOYXRpdmVJbWFnZVB0ciYsIGNvbnN0IEZsb2F0
U2l6ZSYgc2VsZlNpemUsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVj
dCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgPSBDb21wb3NpdGVTb3VyY2VPdmVyLCBCbGVu
ZE1vZGUgPSBCbGVuZE1vZGU6Ok5vcm1hbCwgSW1hZ2VPcmllbnRhdGlvbiA9IEltYWdlT3JpZW50
YXRpb24oKSk7CiAjZW5kaWYKIAotI2lmIFVTRShESVJFQ1QyRCkKLSAgICB2b2lkIGRyYXdEZXZp
Y2VCaXRtYXAoY29uc3QgQ09NUHRyPElEMkQxQml0bWFwPiYsIGNvbnN0IEZsb2F0U2l6ZSYgc2Vs
ZlNpemUsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVj
dCwgQ29tcG9zaXRlT3BlcmF0b3IgPSBDb21wb3NpdGVTb3VyY2VPdmVyLCBCbGVuZE1vZGUgPSBC
bGVuZE1vZGU6Ok5vcm1hbCwgSW1hZ2VPcmllbnRhdGlvbiA9IEltYWdlT3JpZW50YXRpb24oKSk7
Ci0jZW5kaWYKLQogI2lmIFVTRShDRykgfHwgVVNFKERJUkVDVDJEKQogICAgIHZvaWQgYXBwbHlT
dHJva2VQYXR0ZXJuKCk7CiAgICAgdm9pZCBhcHBseUZpbGxQYXR0ZXJuKCk7CkBAIC02MTksOSAr
NjE4LDcgQEAgcHJpdmF0ZToKIAogI2lmIFVTRShESVJFQ1QyRCkKICAgICB2b2lkIHBsYXRmb3Jt
SW5pdChIREMsIElEMkQxUmVuZGVyVGFyZ2V0KiosIFJFQ1QsIGJvb2wgaGFzQWxwaGEgPSBmYWxz
ZSk7Ci0gICAgdm9pZCBwbGF0Zm9ybUluaXQoUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqLCBCaXRt
YXBSZW5kZXJpbmdDb250ZXh0VHlwZSk7Ci0gICAgdm9pZCBkcmF3V2l0aG91dFNoYWRvdyhjb25z
dCBGbG9hdFJlY3QmIGJvdW5kaW5nUmVjdCwgY29uc3QgV1RGOjpGdW5jdGlvbjx2b2lkKElEMkQx
UmVuZGVyVGFyZ2V0Kik+Jik7Ci0gICAgdm9pZCBkcmF3V2l0aFNoYWRvdyhjb25zdCBGbG9hdFJl
Y3QmIGJvdW5kaW5nUmVjdCwgY29uc3QgV1RGOjpGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFy
Z2V0Kik+Jik7CisgICAgdm9pZCBwbGF0Zm9ybUluaXQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQq
LCBCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZSk7CiAjZW5kaWYKIAogICAgIHZvaWQgc2F2ZVBs
YXRmb3JtU3RhdGUoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dy
YXBoaWNzQ29udGV4dEltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHRJbXBsLmgJKHJldmlzaW9uIDI0ODAwOCkKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dEltcGwuaAkod29y
a2luZyBjb3B5KQpAQCAtNzEsNyArNzEsNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBJbWFnZURy
YXdSZXN1bHQgZHJhd0ltYWdlKEltYWdlJiwgY29uc3QgRmxvYXRSZWN0JiBkZXN0aW5hdGlvbiwg
Y29uc3QgRmxvYXRSZWN0JiBzb3VyY2UsIGNvbnN0IEltYWdlUGFpbnRpbmdPcHRpb25zJikgPSAw
OwogICAgIHZpcnR1YWwgSW1hZ2VEcmF3UmVzdWx0IGRyYXdUaWxlZEltYWdlKEltYWdlJiwgY29u
c3QgRmxvYXRSZWN0JiBkZXN0aW5hdGlvbiwgY29uc3QgRmxvYXRQb2ludCYgc291cmNlLCBjb25z
dCBGbG9hdFNpemUmIHRpbGVTaXplLCBjb25zdCBGbG9hdFNpemUmIHNwYWNpbmcsIGNvbnN0IElt
YWdlUGFpbnRpbmdPcHRpb25zJikgPSAwOwogICAgIHZpcnR1YWwgSW1hZ2VEcmF3UmVzdWx0IGRy
YXdUaWxlZEltYWdlKEltYWdlJiwgY29uc3QgRmxvYXRSZWN0JiBkZXN0aW5hdGlvbiwgY29uc3Qg
RmxvYXRSZWN0JiBzb3VyY2UsIGNvbnN0IEZsb2F0U2l6ZSYgdGlsZVNjYWxlRmFjdG9yLCBJbWFn
ZTo6VGlsZVJ1bGUgaFJ1bGUsIEltYWdlOjpUaWxlUnVsZSB2UnVsZSwgY29uc3QgSW1hZ2VQYWlu
dGluZ09wdGlvbnMmKSA9IDA7Ci0jaWYgVVNFKENHKSB8fCBVU0UoQ0FJUk8pCisjaWYgVVNFKENH
KSB8fCBVU0UoQ0FJUk8pIHx8IFVTRShESVJFQ1QyRCkKICAgICB2aXJ0dWFsIHZvaWQgZHJhd05h
dGl2ZUltYWdlKGNvbnN0IE5hdGl2ZUltYWdlUHRyJiwgY29uc3QgRmxvYXRTaXplJiBzZWxmU2l6
ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBD
b21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0aW9uKSA9IDA7CiAjZW5k
aWYKICAgICB2aXJ0dWFsIHZvaWQgZHJhd1BhdHRlcm4oSW1hZ2UmLCBjb25zdCBGbG9hdFJlY3Qm
IGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9y
bSYsIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBjb25zdCBGbG9hdFNpemUmIHNwYWNpbmcsIENv
bXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUgPSBCbGVuZE1vZGU6Ok5vcm1hbCkgPSAwOwpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2VTb3VyY2UuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ltYWdlU291cmNlLmNw
cAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
SW1hZ2VTb3VyY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw2ICszOCw3IEBACiAKICNpZiBV
U0UoRElSRUNUMkQpCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQuaCIKICNlbmRpZgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBA
IC02NjEsNyArNjYyLDcgQEAgSW1hZ2VPcmllbnRhdGlvbiBJbWFnZVNvdXJjZTo6ZnJhbWVPcmll
bgogdm9pZCBJbWFnZVNvdXJjZTo6c2V0VGFyZ2V0Q29udGV4dChjb25zdCBHcmFwaGljc0NvbnRl
eHQqIHRhcmdldENvbnRleHQpCiB7CiAgICAgaWYgKGlzRGVjb2RlckF2YWlsYWJsZSgpICYmIHRh
cmdldENvbnRleHQpCi0gICAgICAgIG1fZGVjb2Rlci0+c2V0VGFyZ2V0Q29udGV4dCh0YXJnZXRD
b250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgICAgIG1fZGVjb2Rlci0+c2V0VGFyZ2V0
Q29udGV4dCh0YXJnZXRDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+cmVuZGVyVGFyZ2V0KCkp
OwogfQogI2VuZGlmCiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1Bh
dHRlcm4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Q
YXR0ZXJuLmgJKHJldmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL1BhdHRlcm4uaAkod29ya2luZyBjb3B5KQpAQCAtMzgsNiArMzgsMTAgQEAgdHlwZWRl
ZiBDR1BhdHRlcm5SZWYgUGxhdGZvcm1QYXR0ZXJuUHRyOwogI2VsaWYgVVNFKERJUkVDVDJEKQog
aW50ZXJmYWNlIElEMkQxQml0bWFwQnJ1c2g7CiB0eXBlZGVmIElEMkQxQml0bWFwQnJ1c2gqIFBs
YXRmb3JtUGF0dGVyblB0cjsKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEOworfQordHlwZWRlZiBXZWJDb3JlOjpQbGF0Zm9ybUNvbnRleHREaXJlY3Qy
RCBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDsKICNlbGlmIFVTRShDQUlSTykKIHR5cGVkZWYgc3Ry
dWN0IF9jYWlyb19wYXR0ZXJuIGNhaXJvX3BhdHRlcm5fdDsKIHR5cGVkZWYgY2Fpcm9fcGF0dGVy
bl90KiBQbGF0Zm9ybVBhdHRlcm5QdHI7CkBAIC02Miw2ICs2Niw3IEBAIHB1YmxpYzoKICNpZiAh
VVNFKERJUkVDVDJEKQogICAgIFBsYXRmb3JtUGF0dGVyblB0ciBjcmVhdGVQbGF0Zm9ybVBhdHRl
cm4oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB1c2VyU3BhY2VUcmFuc2Zvcm1hdGlvbikgY29uc3Q7
CiAjZWxzZQorICAgIFBsYXRmb3JtUGF0dGVyblB0ciBjcmVhdGVQbGF0Zm9ybVBhdHRlcm4oUGxh
dGZvcm1HcmFwaGljc0NvbnRleHQmLCBmbG9hdCBhbHBoYSwgY29uc3QgQWZmaW5lVHJhbnNmb3Jt
JiB1c2VyU3BhY2VUcmFuc2Zvcm1hdGlvbikgY29uc3Q7CiAgICAgUGxhdGZvcm1QYXR0ZXJuUHRy
IGNyZWF0ZVBsYXRmb3JtUGF0dGVybihjb25zdCBHcmFwaGljc0NvbnRleHQmLCBmbG9hdCBhbHBo
YSwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB1c2VyU3BhY2VUcmFuc2Zvcm1hdGlvbikgY29uc3Q7
CiAjZW5kaWYKICAgICB2b2lkIHNldFBhdHRlcm5TcGFjZVRyYW5zZm9ybShjb25zdCBBZmZpbmVU
cmFuc2Zvcm0mIHBhdHRlcm5TcGFjZVRyYW5zZm9ybWF0aW9uKTsKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdEl0ZW1zLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlz
dHMvRGlzcGxheUxpc3RJdGVtcy5jcHAJKHJldmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdEl0ZW1zLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNDg2LDcgKzQ4Niw3IEBAIHN0YXRpYyBUZXh0U3RyZWFtJiBvcGVy
YXRvcjw8KFRleHRTdHJlYW0KICAgICByZXR1cm4gdHM7CiB9CiAKLSNpZiBVU0UoQ0cpIHx8IFVT
RShDQUlSTykKKyNpZiBVU0UoQ0cpIHx8IFVTRShDQUlSTykgfHwgVVNFKERJUkVDVDJEKQogRHJh
d05hdGl2ZUltYWdlOjpEcmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0aXZlSW1hZ2VQdHImIGltYWdl
LCBjb25zdCBGbG9hdFNpemUmIGltYWdlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwg
Y29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBvcCwgQmxlbmRNb2Rl
IGJsZW5kTW9kZSwgSW1hZ2VPcmllbnRhdGlvbiBvcmllbnRhdGlvbikKICAgICA6IERyYXdpbmdJ
dGVtKEl0ZW1UeXBlOjpEcmF3TmF0aXZlSW1hZ2UpCiAjaWYgVVNFKENHKQpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0SXRlbXMu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5
bGlzdHMvRGlzcGxheUxpc3RJdGVtcy5oCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxheUxpc3RJdGVtcy5oCSh3
b3JraW5nIGNvcHkpCkBAIC03MCw3ICs3MCw3IEBAIGVudW0gY2xhc3MgSXRlbVR5cGUgewogICAg
IERyYXdJbWFnZSwKICAgICBEcmF3VGlsZWRJbWFnZSwKICAgICBEcmF3VGlsZWRTY2FsZWRJbWFn
ZSwKLSNpZiBVU0UoQ0cpIHx8IFVTRShDQUlSTykKKyNpZiBVU0UoQ0cpIHx8IFVTRShDQUlSTykg
fHwgVVNFKERJUkVDVDJEKQogICAgIERyYXdOYXRpdmVJbWFnZSwKICNlbmRpZgogICAgIERyYXdQ
YXR0ZXJuLApAQCAtNjM4LDcgKzYzOCw3IEBAIHByaXZhdGU6CiAgICAgSW1hZ2VQYWludGluZ09w
dGlvbnMgbV9pbWFnZVBhaW50aW5nT3B0aW9uczsKIH07CiAKLSNpZiBVU0UoQ0cpIHx8IFVTRShD
QUlSTykKKyNpZiBVU0UoQ0cpIHx8IFVTRShDQUlSTykgfHwgVVNFKERJUkVDVDJEKQogY2xhc3Mg
RHJhd05hdGl2ZUltYWdlIDogcHVibGljIERyYXdpbmdJdGVtIHsKIHB1YmxpYzoKICAgICBzdGF0
aWMgUmVmPERyYXdOYXRpdmVJbWFnZT4gY3JlYXRlKGNvbnN0IE5hdGl2ZUltYWdlUHRyJiBpbWFn
ZSwgY29uc3QgRmxvYXRTaXplJiBpbWFnZVNpemUsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3Qs
IGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIEJsZW5kTW9k
ZSBibGVuZE1vZGUsIEltYWdlT3JpZW50YXRpb24gb3JpZW50YXRpb24pCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxheUxpc3RSZWNvcmRl
ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlz
cGxheWxpc3RzL0Rpc3BsYXlMaXN0UmVjb3JkZXIuY3BwCShyZXZpc2lvbiAyNDgwMDgpCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxheUxpc3RS
ZWNvcmRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyNiw3ICsxMjYsNyBAQCBJbWFnZURyYXdS
ZXN1bHQgUmVjb3JkZXI6OmRyYXdUaWxlZEltYWdlCiAgICAgcmV0dXJuIEltYWdlRHJhd1Jlc3Vs
dDo6RGlkUmVjb3JkOwogfQogCi0jaWYgVVNFKENHKSB8fCBVU0UoQ0FJUk8pCisjaWYgVVNFKENH
KSB8fCBVU0UoQ0FJUk8pIHx8IFVTRShESVJFQ1QyRCkKIHZvaWQgUmVjb3JkZXI6OmRyYXdOYXRp
dmVJbWFnZShjb25zdCBOYXRpdmVJbWFnZVB0ciYgaW1hZ2UsIGNvbnN0IEZsb2F0U2l6ZSYgaW1h
Z2VTaXplLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1Jl
Y3QsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBCbGVuZE1vZGUgYmxlbmRNb2RlLCBJbWFnZU9yaWVu
dGF0aW9uIG9yaWVudGF0aW9uKQogewogICAgIERyYXdpbmdJdGVtJiBuZXdJdGVtID0gZG93bmNh
c3Q8RHJhd2luZ0l0ZW0+KGFwcGVuZEl0ZW0oRHJhd05hdGl2ZUltYWdlOjpjcmVhdGUoaW1hZ2Us
IGltYWdlU2l6ZSwgZGVzdFJlY3QsIHNyY1JlY3QsIG9wLCBibGVuZE1vZGUsIG9yaWVudGF0aW9u
KSkpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3Rz
L0Rpc3BsYXlMaXN0UmVjb3JkZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxheUxpc3RSZWNvcmRlci5oCShyZXZpc2lv
biAyNDgwMDgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlz
dHMvRGlzcGxheUxpc3RSZWNvcmRlci5oCSh3b3JraW5nIGNvcHkpCkBAIC05MSw3ICs5MSw3IEBA
IHByaXZhdGU6CiAgICAgSW1hZ2VEcmF3UmVzdWx0IGRyYXdJbWFnZShJbWFnZSYsIGNvbnN0IEZs
b2F0UmVjdCYgZGVzdGluYXRpb24sIGNvbnN0IEZsb2F0UmVjdCYgc291cmNlLCBjb25zdCBJbWFn
ZVBhaW50aW5nT3B0aW9ucyYpIG92ZXJyaWRlOwogICAgIEltYWdlRHJhd1Jlc3VsdCBkcmF3VGls
ZWRJbWFnZShJbWFnZSYsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdGluYXRpb24sIGNvbnN0IEZsb2F0
UG9pbnQmIHNvdXJjZSwgY29uc3QgRmxvYXRTaXplJiB0aWxlU2l6ZSwgY29uc3QgRmxvYXRTaXpl
JiBzcGFjaW5nLCBjb25zdCBJbWFnZVBhaW50aW5nT3B0aW9ucyYpIG92ZXJyaWRlOwogICAgIElt
YWdlRHJhd1Jlc3VsdCBkcmF3VGlsZWRJbWFnZShJbWFnZSYsIGNvbnN0IEZsb2F0UmVjdCYgZGVz
dGluYXRpb24sIGNvbnN0IEZsb2F0UmVjdCYgc291cmNlLCBjb25zdCBGbG9hdFNpemUmIHRpbGVT
Y2FsZUZhY3RvciwgSW1hZ2U6OlRpbGVSdWxlIGhSdWxlLCBJbWFnZTo6VGlsZVJ1bGUgdlJ1bGUs
IGNvbnN0IEltYWdlUGFpbnRpbmdPcHRpb25zJikgb3ZlcnJpZGU7Ci0jaWYgVVNFKENHKSB8fCBV
U0UoQ0FJUk8pCisjaWYgVVNFKENHKSB8fCBVU0UoQ0FJUk8pIHx8IFVTRShESVJFQ1QyRCkKICAg
ICB2b2lkIGRyYXdOYXRpdmVJbWFnZShjb25zdCBOYXRpdmVJbWFnZVB0ciYsIGNvbnN0IEZsb2F0
U2l6ZSYgc2VsZlNpemUsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVj
dCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSwgSW1hZ2VPcmllbnRhdGlv
bikgb3ZlcnJpZGU7CiAjZW5kaWYKICAgICB2b2lkIGRyYXdQYXR0ZXJuKEltYWdlJiwgY29uc3Qg
RmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBBZmZp
bmVUcmFuc2Zvcm0mLCBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgY29uc3QgRmxvYXRTaXplJiBz
cGFjaW5nLCBDb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlID0gQmxlbmRNb2RlOjpOb3JtYWwp
IG92ZXJyaWRlOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Jh
Y2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyRC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9CYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQuaAkobm9u
ZXhpc3RlbnQpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vQmFja2lu
Z1N0b3JlQmFja2VuZERpcmVjdDJELmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjcHJhZ21hIG9u
Y2UKKworI2lmIFVTRShESVJFQ1QyRCkKKworI2luY2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1ZGUg
IkludFJlY3QuaCIKKyNpbmNsdWRlIDx3aW5jb2RlYy5oPgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFs
bG9jLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitjbGFzcyBCYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQgeworICAgIFdURl9NQUtF
X05PTkNPUFlBQkxFKEJhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyRCk7CisgICAgV1RGX01BS0Vf
RkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QmFja2luZ1N0b3JlQmFja2Vu
ZERpcmVjdDJEKCkgPSBkZWZhdWx0OworCisgICAgSVdJQ0JpdG1hcCogc3VyZmFjZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc3VyZmFjZS5nZXQoKTsgfQorICAgIGNvbnN0IEludFNpemUmIHNpemUoKSBj
b25zdCB7IHJldHVybiBtX3NpemU7IH0KKworICAgIHZpcnR1YWwgdm9pZCBzY3JvbGwoY29uc3Qg
SW50UmVjdCYgc2Nyb2xsUmVjdCwgY29uc3QgSW50U2l6ZSYgc2Nyb2xsT2Zmc2V0KSA9IDA7CisK
K3Byb3RlY3RlZDoKKyAgICBCYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkQoY29uc3QgSW50U2l6
ZSYgc2l6ZSkKKyAgICAgICAgOiBtX3NpemUoc2l6ZSkKKyAgICB7CisgICAgfQorCisgICAgQ09N
UHRyPElXSUNCaXRtYXA+IG1fc3VyZmFjZTsKKyAgICB2b2lkKiBtX3N1cmZhY2VCYWNraW5nRGF0
YSB7IG51bGxwdHIgfTsKKyAgICBJbnRTaXplIG1fc2l6ZTsKK307CisKKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKERJUkVDVDJEKQpJbmRleDogU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9C
YWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJbXBsLmNwcAkobm9uZXhpc3RlbnQpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2VuZERpcmVj
dDJESW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAq
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlQmFja2VuZERpcmVj
dDJESW1wbC5oIgorCisjaWYgVVNFKERJUkVDVDJEKQorCisjaW5jbHVkZSAiRGlyZWN0MkRVdGls
aXRpZXMuaCIKKyNpbmNsdWRlICJGbG9hdFBvaW50LmgiCisjaW5jbHVkZSAiRmxvYXRTaXplLmgi
CisjaW5jbHVkZSAiSW1hZ2VEZWNvZGVyRGlyZWN0MkQuaCIKKyNpbmNsdWRlICJJbnRSZWN0Lmgi
CisjaW5jbHVkZSAiSW50U2l6ZS5oIgorI2luY2x1ZGUgPHdpbmNvZGVjLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworc3RhdGljIGNvbnN0IFNlY29uZHMgc2Nyb2xsSHlzdGVyZXNpc0R1cmF0
aW9uIHsgMzAwX21zIH07CisKK3N0YXRpYyBDT01QdHI8SVdJQ0JpdG1hcD4gY3JlYXRlRGlyZWN0
MkRJbWFnZVN1cmZhY2VXaXRoRmFzdE1hbGxvYyhjb25zdCBJbnRTaXplJiBzaXplLCBkb3VibGUg
ZGV2aWNlU2NhbGVGYWN0b3IsIHZvaWQqJiBiYWNraW5nU3RvcmVEYXRhKQoreworICAgIGF1dG8g
Ynl0ZXNQZXJSb3cgPSA0ICogQ2hlY2tlZDx1bnNpZ25lZCwgUmVjb3JkT3ZlcmZsb3c+KHNpemUu
d2lkdGgoKSk7CisgICAgaWYgKGJ5dGVzUGVyUm93Lmhhc092ZXJmbG93ZWQoKSkKKyAgICAgICAg
cmV0dXJuIG51bGxwdHI7CisKKyAgICBDaGVja2VkPHNpemVfdCwgUmVjb3JkT3ZlcmZsb3c+IG51
bUJ5dGVzID0gQ2hlY2tlZDx1bnNpZ25lZCwgUmVjb3JkT3ZlcmZsb3c+KHNpemUuaGVpZ2h0KCkp
ICogYnl0ZXNQZXJSb3c7CisgICAgaWYgKG51bUJ5dGVzLmhhc092ZXJmbG93ZWQoKSkKKyAgICAg
ICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBiYWNraW5nU3RvcmVEYXRhID0gZmFzdFplcm9lZE1h
bGxvYyhudW1CeXRlcy51bnNhZmVHZXQoKSk7CisKKyAgICByZXR1cm4gRGlyZWN0MkQ6OmNyZWF0
ZURpcmVjdDJESW1hZ2VTdXJmYWNlV2l0aERhdGEoYmFja2luZ1N0b3JlRGF0YSwgc2l6ZSwgYnl0
ZXNQZXJSb3cudW5zYWZlR2V0KCkpOworfQorCitCYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJ
bXBsOjpCYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJbXBsKGNvbnN0IEludFNpemUmIHNpemUs
IGZsb2F0IGRldmljZVNjYWxlRmFjdG9yKQorICAgIDogQmFja2luZ1N0b3JlQmFja2VuZERpcmVj
dDJEKHNpemUpCisgICAgLCBtX3Njcm9sbGVkSHlzdGVyZXNpcyhbdGhpc10oUEFMOjpIeXN0ZXJl
c2lzU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgaWYgKHN0YXRlID09IFBBTDo6SHlzdGVyZXNpc1N0
YXRlOjpTdG9wcGVkKQorICAgICAgICAgICAgbV9zY3JvbGxTdXJmYWNlID0gbnVsbHB0cjsKKyAg
ICAgICAgfSwgc2Nyb2xsSHlzdGVyZXNpc0R1cmF0aW9uKQoreworICAgIEludFNpemUgc2NhbGVk
U2l6ZSA9IG1fc2l6ZTsKKyAgICBzY2FsZWRTaXplLnNjYWxlKGRldmljZVNjYWxlRmFjdG9yKTsK
KyAgICBtX3N1cmZhY2UgPSBjcmVhdGVEaXJlY3QyREltYWdlU3VyZmFjZVdpdGhGYXN0TWFsbG9j
KHNjYWxlZFNpemUsIGRldmljZVNjYWxlRmFjdG9yLCBtX3N1cmZhY2VCYWNraW5nRGF0YSk7Cit9
CisKK0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGw6On5CYWNraW5nU3RvcmVCYWNrZW5k
RGlyZWN0MkRJbXBsKCkKK3sKKyAgICBmYXN0RnJlZShtX3N1cmZhY2VCYWNraW5nRGF0YSk7Cisg
ICAgZmFzdEZyZWUobV9zY3JvbGxTdXJmYWNlQmFja2luZ0RhdGEpOworfQorCit2b2lkIEJhY2tp
bmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGw6OnNjcm9sbChjb25zdCBJbnRSZWN0JiBzY3JvbGxS
ZWN0LCBjb25zdCBJbnRTaXplJiBzY3JvbGxPZmZzZXQpCit7CisgICAgSW50UmVjdCB0YXJnZXRS
ZWN0ID0gc2Nyb2xsUmVjdDsKKyAgICB0YXJnZXRSZWN0Lm1vdmUoc2Nyb2xsT2Zmc2V0KTsKKyAg
ICB0YXJnZXRSZWN0LnNoaWZ0TWF4WEVkZ2VUbyh0YXJnZXRSZWN0Lm1heFgoKSAtIHNjcm9sbE9m
ZnNldC53aWR0aCgpKTsKKyAgICB0YXJnZXRSZWN0LnNoaWZ0TWF4WUVkZ2VUbyh0YXJnZXRSZWN0
Lm1heFkoKSAtIHNjcm9sbE9mZnNldC5oZWlnaHQoKSk7CisgICAgaWYgKHRhcmdldFJlY3QuaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1fc2Nyb2xsU3VyZmFjZSkgewor
ICAgICAgICBhdXRvIHNpemUgPSBEaXJlY3QyRDo6Yml0bWFwU2l6ZShtX3N1cmZhY2UuZ2V0KCkp
OworICAgICAgICBhdXRvIHNjYWxlID0gRGlyZWN0MkQ6OmJpdG1hcFJlc29sdXRpb24obV9zdXJm
YWNlLmdldCgpKTsKKyAgICAgICAgQVNTRVJUKHNjYWxlLngoKSA9PSBzY2FsZS55KCkpOworICAg
ICAgICBtX3Njcm9sbFN1cmZhY2UgPSBjcmVhdGVEaXJlY3QyREltYWdlU3VyZmFjZVdpdGhGYXN0
TWFsbG9jKHNpemUsIHNjYWxlLngoKSwgbV9zY3JvbGxTdXJmYWNlQmFja2luZ0RhdGEpOworICAg
IH0KKworICAgIERpcmVjdDJEOjpjb3B5UmVjdEZyb21PbmVTdXJmYWNlVG9Bbm90aGVyKG1fc3Vy
ZmFjZS5nZXQoKSwgbV9zY3JvbGxTdXJmYWNlLmdldCgpLCBzY3JvbGxPZmZzZXQsIHRhcmdldFJl
Y3QpOworICAgIERpcmVjdDJEOjpjb3B5UmVjdEZyb21PbmVTdXJmYWNlVG9Bbm90aGVyKG1fc2Ny
b2xsU3VyZmFjZS5nZXQoKSwgbV9zdXJmYWNlLmdldCgpLCBJbnRTaXplKCksIHRhcmdldFJlY3Qp
OworCisgICAgbV9zY3JvbGxlZEh5c3RlcmVzaXMuaW1wdWxzZSgpOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoRElSRUNUMkQpCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJESW1w
bC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9C
YWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJbXBsLmgJKG5vbmV4aXN0ZW50KQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0JhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3Qy
REltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3By
YWdtYSBvbmNlCisKKyNpZiBVU0UoRElSRUNUMkQpCisKKyNpbmNsdWRlICJCYWNraW5nU3RvcmVC
YWNrZW5kRGlyZWN0MkQuaCIKKyNpbmNsdWRlICJDT01QdHIuaCIKKyNpbmNsdWRlIDxwYWwvSHlz
dGVyZXNpc0FjdGl2aXR5Lmg+CisKK2ludGVyZmFjZSBJV0lDQml0bWFwOworCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK2NsYXNzIEJhY2tpbmdTdG9yZUJhY2tlbmREaXJlY3QyREltcGwgZmluYWwg
OiBwdWJsaWMgQmFja2luZ1N0b3JlQmFja2VuZERpcmVjdDJEIHsKK3B1YmxpYzoKKyAgICBXRUJD
T1JFX0VYUE9SVCBCYWNraW5nU3RvcmVCYWNrZW5kRGlyZWN0MkRJbXBsKGNvbnN0IEludFNpemUm
LCBmbG9hdCBkZXZpY2VTY2FsZUZhY3Rvcik7CisgICAgdmlydHVhbCB+QmFja2luZ1N0b3JlQmFj
a2VuZERpcmVjdDJESW1wbCgpOworCitwcml2YXRlOgorICAgIHZvaWQgc2Nyb2xsKGNvbnN0IElu
dFJlY3QmLCBjb25zdCBJbnRTaXplJikgb3ZlcnJpZGU7CisKKyAgICBDT01QdHI8SVdJQ0JpdG1h
cD4gbV9zY3JvbGxTdXJmYWNlOworICAgIHZvaWQqIG1fc2Nyb2xsU3VyZmFjZUJhY2tpbmdEYXRh
IHsgbnVsbHB0ciB9OworCisgICAgUEFMOjpIeXN0ZXJlc2lzQWN0aXZpdHkgbV9zY3JvbGxlZEh5
c3RlcmVzaXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0Uo
RElSRUNUMkQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRGly
ZWN0MkRPcGVyYXRpb25zLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vRGlyZWN0MkRPcGVyYXRpb25zLmNwcAkobm9uZXhpc3RlbnQpCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0MkRPcGVyYXRpb25zLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYtMjAxOSBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIw
MDgsIDIwMDkgRGlyayBTY2h1bHplIDxrcml0QHdlYmtpdC5vcmc+CisgKiBDb3B5cmlnaHQgKEMp
IDIwMDggTnVhbnRpIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBCcmVudCBGdWxnaGFtIDxi
ZnVsZ2hhbUB3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExIElnYWxpYSBT
LkwuCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIsIEludGVsIENvcnBvcmF0
aW9uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJEaXJlY3QyRE9wZXJhdGlvbnMuaCIKKworI2lmIFVTRShE
SVJFQ1QyRCkKKworI2luY2x1ZGUgIkRpcmVjdDJEVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiRmxv
YXRDb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGly
ZWN0MkQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIkltYWdlQnVmZmVyLmgiCisj
aW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVkZSAi
UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaCIKKyNpbmNsdWRlICJTaGFkb3dCbHVyLmgiCisjaW5j
bHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGQyZDEuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworbmFtZXNwYWNlIERpcmVjdDJEIHsKKworZW51bSBQYXR0ZXJuQWRqdXN0bWVudCB7IE5vQWRq
dXN0bWVudCwgQWRqdXN0UGF0dGVybkZvckdsb2JhbEFscGhhIH07CitlbnVtIEFscGhhUHJlc2Vy
dmF0aW9uIHsgRG9Ob3RQcmVzZXJ2ZUFscGhhLCBQcmVzZXJ2ZUFscGhhIH07CisKKworY2xhc3Mg
UGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlciB7CitwdWJsaWM6CisgICAgUGxhdGZvcm1Db250ZXh0
U3RhdGVTYXZlcihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgY29udGV4dCwgYm9vbCBzYXZlQW5k
UmVzdG9yZSA9IHRydWUpCisgICAgICAgIDogbV9jb250ZXh0KGNvbnRleHQpCisgICAgICAgICwg
bV9zYXZlQW5kUmVzdG9yZShzYXZlQW5kUmVzdG9yZSkKKyAgICB7CisgICAgICAgIGlmIChtX3Nh
dmVBbmRSZXN0b3JlKQorICAgICAgICAgICAgbV9jb250ZXh0LnNhdmUoKTsKKyAgICB9CisKKyAg
ICB+UGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlcigpCisgICAgeworICAgICAgICBpZiAobV9zYXZl
QW5kUmVzdG9yZSkKKyAgICAgICAgICAgIG1fY29udGV4dC5yZXN0b3JlKCk7CisgICAgfQorCisg
ICAgdm9pZCBzYXZlKCkKKyAgICB7CisgICAgICAgIEFTU0VSVCghbV9zYXZlQW5kUmVzdG9yZSk7
CisgICAgICAgIG1fY29udGV4dC5zYXZlKCk7CisgICAgICAgIG1fc2F2ZUFuZFJlc3RvcmUgPSB0
cnVlOworICAgIH0KKworICAgIHZvaWQgcmVzdG9yZSgpCisgICAgeworICAgICAgICBBU1NFUlQo
bV9zYXZlQW5kUmVzdG9yZSk7CisgICAgICAgIG1fY29udGV4dC5yZXN0b3JlKCk7CisgICAgICAg
IG1fc2F2ZUFuZFJlc3RvcmUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGRpZFNhdmUoKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fc2F2ZUFuZFJlc3RvcmU7CisgICAgfQorCitw
cml2YXRlOgorICAgIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBtX2NvbnRleHQ7CisgICAgYm9v
bCBtX3NhdmVBbmRSZXN0b3JlIHsgZmFsc2UgfTsKK307CisKKy8vIEZJWE1FOiBSZXBsYWNlIG9u
Y2UgR3JhcGhpY3NDb250ZXh0OjpkYXNoZWRMaW5lQ29ybmVyV2lkdGhGb3JTdHJva2VXaWR0aCgp
CisvLyBpcyByZWZhY3RvcmVkIGFzIGEgc3RhdGljIHB1YmxpYyBmdW5jdGlvbi4KK3N0YXRpYyBm
bG9hdCBkYXNoZWRMaW5lQ29ybmVyV2lkdGhGb3JTdHJva2VXaWR0aChmbG9hdCBzdHJva2VXaWR0
aCwgU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUsIGZsb2F0IHN0cm9rZVRoaWNrbmVzcykKK3sKKyAg
ICByZXR1cm4gc3Ryb2tlU3R5bGUgPT0gRG90dGVkU3Ryb2tlID8gc3Ryb2tlVGhpY2tuZXNzIDog
c3RkOjptaW4oMi4wZiAqIHN0cm9rZVRoaWNrbmVzcywgc3RkOjptYXgoc3Ryb2tlVGhpY2tuZXNz
LCBzdHJva2VXaWR0aCAvIDMuMGYpKTsKK30KKworLy8gRklYTUU6IFJlcGxhY2Ugb25jZSBHcmFw
aGljc0NvbnRleHQ6OmRhc2hlZExpbmVQYXR0ZXJuV2lkdGhGb3JTdHJva2VXaWR0aCgpCisvLyBp
cyByZWZhY3RvcmVkIGFzIGEgc3RhdGljIHB1YmxpYyBmdW5jdGlvbi4KK3N0YXRpYyBmbG9hdCBk
YXNoZWRMaW5lUGF0dGVybldpZHRoRm9yU3Ryb2tlV2lkdGgoZmxvYXQgc3Ryb2tlV2lkdGgsIFN0
cm9rZVN0eWxlIHN0cm9rZVN0eWxlLCBmbG9hdCBzdHJva2VUaGlja25lc3MpCit7CisgICAgcmV0
dXJuIHN0cm9rZVN0eWxlID09IERvdHRlZFN0cm9rZSA/IHN0cm9rZVRoaWNrbmVzcyA6IHN0ZDo6
bWluKDMuMGYgKiBzdHJva2VUaGlja25lc3MsIHN0ZDo6bWF4KHN0cm9rZVRoaWNrbmVzcywgc3Ry
b2tlV2lkdGggLyAzLjBmKSk7Cit9CisKKy8vIEZJWE1FOiBSZXBsYWNlIG9uY2UgR3JhcGhpY3ND
b250ZXh0OjpkYXNoZWRMaW5lUGF0dGVybk9mZnNldEZvclBhdHRlcm5BbmRTdHJva2VXaWR0aCgp
CisvLyBpcyByZWZhY3RvcmVkIGFzIGEgc3RhdGljIHB1YmxpYyBmdW5jdGlvbi4KK3N0YXRpYyBm
bG9hdCBkYXNoZWRMaW5lUGF0dGVybk9mZnNldEZvclBhdHRlcm5BbmRTdHJva2VXaWR0aChmbG9h
dCBwYXR0ZXJuV2lkdGgsIGZsb2F0IHN0cm9rZVdpZHRoKQoreworICAgIC8vIFBhdHRlcm4gc3Rh
cnRzIHdpdGggZnVsbCBmaWxsIGFuZCBlbmRzIHdpdGggdGhlIGVtcHR5IGZpbGwuCisgICAgLy8g
MS4gTGV0J3Mgc3RhcnQgd2l0aCB0aGUgZW1wdHkgcGhhc2UgYWZ0ZXIgdGhlIGNvcm5lci4KKyAg
ICAvLyAyLiBDaGVjayBpZiB3ZSd2ZSBnb3Qgb2RkIG9yIGV2ZW4gbnVtYmVyIG9mIHBhdHRlcm5z
IGFuZCB3aGV0aGVyIHRoZXkgZnVsbHkgY292ZXIgdGhlIGxpbmUuCisgICAgLy8gMy4gSW4gY2Fz
ZSBvZiBldmVuIG51bWJlciBvZiBwYXR0ZXJucyBhbmQvb3IgcmVtYWluZGVyLCBtb3ZlIHRoZSBw
YXR0ZXJuIHN0YXJ0IHBvc2l0aW9uCisgICAgLy8gc28gdGhhdCB0aGUgcGF0dGVybiBpcyBiYWxh
bmNlZCBiZXR3ZWVuIHRoZSBjb3JuZXJzLgorICAgIGZsb2F0IHBhdHRlcm5PZmZzZXQgPSBwYXR0
ZXJuV2lkdGg7CisgICAgaW50IG51bWJlck9mU2VnbWVudHMgPSBzdGQ6OmZsb29yKHN0cm9rZVdp
ZHRoIC8gcGF0dGVybldpZHRoKTsKKyAgICBib29sIG9kZE51bWJlck9mU2VnbWVudHMgPSBudW1i
ZXJPZlNlZ21lbnRzICUgMjsKKyAgICBmbG9hdCByZW1haW5kZXIgPSBzdHJva2VXaWR0aCAtIChu
dW1iZXJPZlNlZ21lbnRzICogcGF0dGVybldpZHRoKTsKKyAgICBpZiAob2RkTnVtYmVyT2ZTZWdt
ZW50cyAmJiByZW1haW5kZXIpCisgICAgICAgIHBhdHRlcm5PZmZzZXQgLT0gcmVtYWluZGVyIC8g
Mi4wZjsKKyAgICBlbHNlIGlmICghb2RkTnVtYmVyT2ZTZWdtZW50cykgeworICAgICAgICBpZiAo
cmVtYWluZGVyKQorICAgICAgICAgICAgcGF0dGVybk9mZnNldCArPSBwYXR0ZXJuT2Zmc2V0IC0g
KHBhdHRlcm5XaWR0aCArIHJlbWFpbmRlcikgLyAyLjBmOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICBwYXR0ZXJuT2Zmc2V0ICs9IHBhdHRlcm5XaWR0aCAvIDIuMGY7CisgICAgfQorCisgICAg
cmV0dXJuIHBhdHRlcm5PZmZzZXQ7Cit9CisKKy8vIEZJWE1FOiBSZXBsYWNlIG9uY2UgR3JhcGhp
Y3NDb250ZXh0OjpjZW50ZXJMaW5lQW5kQ3V0T2ZmQ29ybmVycygpCisvLyBpcyByZWZhY3RvcmVk
IGFzIGEgc3RhdGljIHB1YmxpYyBmdW5jdGlvbi4KK3N0YXRpYyBWZWN0b3I8RmxvYXRQb2ludD4g
Y2VudGVyTGluZUFuZEN1dE9mZkNvcm5lcnMoYm9vbCBpc1ZlcnRpY2FsTGluZSwgZmxvYXQgY29y
bmVyV2lkdGgsIEZsb2F0UG9pbnQgcG9pbnQxLCBGbG9hdFBvaW50IHBvaW50MikKK3sKKyAgICAv
LyBDZW50ZXIgbGluZSBhbmQgY3V0IG9mZiBjb3JuZXJzIGZvciBwYXR0ZXJuIHBhaW50aW5nLgor
ICAgIGlmIChpc1ZlcnRpY2FsTGluZSkgeworICAgICAgICBmbG9hdCBjZW50ZXJPZmZzZXQgPSAo
cG9pbnQyLngoKSAtIHBvaW50MS54KCkpIC8gMi4wZjsKKyAgICAgICAgcG9pbnQxLm1vdmUoY2Vu
dGVyT2Zmc2V0LCBjb3JuZXJXaWR0aCk7CisgICAgICAgIHBvaW50Mi5tb3ZlKC1jZW50ZXJPZmZz
ZXQsIC1jb3JuZXJXaWR0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmxvYXQgY2VudGVyT2Zm
c2V0ID0gKHBvaW50Mi55KCkgLSBwb2ludDEueSgpKSAvIDIuMGY7CisgICAgICAgIHBvaW50MS5t
b3ZlKGNvcm5lcldpZHRoLCBjZW50ZXJPZmZzZXQpOworICAgICAgICBwb2ludDIubW92ZSgtY29y
bmVyV2lkdGgsIC1jZW50ZXJPZmZzZXQpOworICAgIH0KKworICAgIHJldHVybiB7IHBvaW50MSwg
cG9pbnQyIH07Cit9CisKKworbmFtZXNwYWNlIFN0YXRlIHsKKwordm9pZCBzZXRTdHJva2VUaGlj
a25lc3MoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgZmxvYXQgc3Ry
b2tlVGhpY2tuZXNzKQoreworICAgIHBsYXRmb3JtQ29udGV4dC5zZXRTdHJva2VUaGlja25lc3Mo
c3Ryb2tlVGhpY2tuZXNzKTsKK30KKwordm9pZCBzZXRTdHJva2VTdHlsZShQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBTdHJva2VTdHlsZSBzdHJva2VTdHlsZSkKK3sK
KyAgICBwbGF0Zm9ybUNvbnRleHQuc2V0U3Ryb2tlU3R5bGUoc3Ryb2tlU3R5bGUpOworfQorCit2
b2lkIHNldENvbXBvc2l0ZU9wZXJhdGlvbihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZv
cm1Db250ZXh0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcGVyYXRpb24sIEJsZW5kTW9k
ZSBibGVuZE1vZGUpCit7CisgICAgRDJEMV9CTEVORF9NT0RFIHRhcmdldEJsZW5kTW9kZSA9IEQy
RDFfQkxFTkRfTU9ERV9TQ1JFRU47CisgICAgRDJEMV9DT01QT1NJVEVfTU9ERSB0YXJnZXRDb21w
b3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9TT1VSQ0VfQVRPUDsKKworICAgIGlmIChi
bGVuZE1vZGUgIT0gQmxlbmRNb2RlOjpOb3JtYWwpIHsKKyAgICAgICAgc3dpdGNoIChibGVuZE1v
ZGUpIHsKKyAgICAgICAgY2FzZSBCbGVuZE1vZGU6Ok11bHRpcGx5OgorICAgICAgICAgICAgdGFy
Z2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX01VTFRJUExZOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2RlOjpTY3JlZW46CisgICAgICAgICAgICB0YXJnZXRC
bGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfU0NSRUVOOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgQmxlbmRNb2RlOjpPdmVybGF5OgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRN
b2RlID0gRDJEMV9CTEVORF9NT0RFX09WRVJMQVk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBCbGVuZE1vZGU6OkRhcmtlbjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9
IEQyRDFfQkxFTkRfTU9ERV9EQVJLRU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBCbGVuZE1vZGU6OkxpZ2h0ZW46CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQx
X0JMRU5EX01PREVfTElHSFRFTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJs
ZW5kTW9kZTo6Q29sb3JEb2RnZToKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFf
QkxFTkRfTU9ERV9DT0xPUl9ET0RHRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IEJsZW5kTW9kZTo6Q29sb3JCdXJuOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJE
MV9CTEVORF9NT0RFX0NPTE9SX0JVUk47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBCbGVuZE1vZGU6OkhhcmRMaWdodDoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQy
RDFfQkxFTkRfTU9ERV9IQVJEX0xJR0hUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgQmxlbmRNb2RlOjpTb2Z0TGlnaHQ6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBE
MkQxX0JMRU5EX01PREVfU09GVF9MSUdIVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEJsZW5kTW9kZTo6RGlmZmVyZW5jZToKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9
IEQyRDFfQkxFTkRfTU9ERV9ESUZGRVJFTkNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgQmxlbmRNb2RlOjpFeGNsdXNpb246CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUg
PSBEMkQxX0JMRU5EX01PREVfRVhDTFVTSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgQmxlbmRNb2RlOjpIdWU6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQx
X0JMRU5EX01PREVfSFVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRN
b2RlOjpTYXR1cmF0aW9uOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVO
RF9NT0RFX1NBVFVSQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVu
ZE1vZGU6OkNvbG9yOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9N
T0RFX0NPTE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2RlOjpM
dW1pbm9zaXR5OgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RF
X0xVTUlOT1NJVFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVuZE1vZGU6
OlBsdXNEYXJrZXI6CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01P
REVfREFSS0VSX0NPTE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRN
b2RlOjpQbHVzTGlnaHRlcjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxF
TkRfTU9ERV9MSUdIVEVSX0NPTE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1
bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAg
IHN3aXRjaCAoY29tcG9zaXRlT3BlcmF0aW9uKSB7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlQ2xl
YXI6CisgICAgICAgICAgICAvLyBGSVhNRTogdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9N
T0RFX0NMRUFSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlQ29w
eToKKyAgICAgICAgICAgIC8vIEZJWE1FOiB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01P
REVfQ09QWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJj
ZU92ZXI6CisgICAgICAgICAgICAvLyBGSVhNRToga0NHQmxlbmRNb2RlTm9ybWFsCisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VJbjoKKyAgICAgICAgICAg
IHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX1NPVVJDRV9JTjsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZU91dDoKKyAgICAg
ICAgICAgIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX1NPVVJDRV9P
VVQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VBdG9w
OgorICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRFX01PREVf
U09VUkNFX0FUT1A7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVE
ZXN0aW5hdGlvbk92ZXI6CisgICAgICAgICAgICB0YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9D
T01QT1NJVEVfTU9ERV9ERVNUSU5BVElPTl9PVkVSOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25JbjoKKyAgICAgICAgICAgIHRhcmdldENvbXBv
c2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX0RFU1RJTkFUSU9OX0lOOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25PdXQ6CisgICAgICAg
ICAgICB0YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9ERVNUSU5BVElP
Tl9PVVQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5h
dGlvbkF0b3A6CisgICAgICAgICAgICB0YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJ
VEVfTU9ERV9ERVNUSU5BVElPTl9BVE9QOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgQ29tcG9zaXRlWE9SOgorICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFf
Q09NUE9TSVRFX01PREVfWE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29t
cG9zaXRlUGx1c0RhcmtlcjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxF
TkRfTU9ERV9EQVJLRVJfQ09MT1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBD
b21wb3NpdGVQbHVzTGlnaHRlcjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFf
QkxFTkRfTU9ERV9MSUdIVEVSX0NPTE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgQ29tcG9zaXRlRGlmZmVyZW5jZToKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQy
RDFfQkxFTkRfTU9ERV9ESUZGRVJFTkNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBwbGF0Zm9ybUNvbnRleHQuc2V0QmxlbmRNb2RlKHRhcmdldEJsZW5kTW9k
ZSk7CisgICAgcGxhdGZvcm1Db250ZXh0LnNldENvbXBvc2l0ZU1vZGUodGFyZ2V0Q29tcG9zaXRl
TW9kZSk7Cit9CisKK3ZvaWQgc2V0U2hvdWxkQW50aWFsaWFzKFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEJiBwbGF0Zm9ybUNvbnRleHQsIGJvb2wgZW5hYmxlKQoreworICAgIGF1dG8gYW50aWFsaWFz
TW9kZSA9IGVuYWJsZSA/IEQyRDFfQU5USUFMSUFTX01PREVfUEVSX1BSSU1JVElWRSA6IEQyRDFf
QU5USUFMSUFTX01PREVfQUxJQVNFRDsKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0
KCktPlNldEFudGlhbGlhc01vZGUoYW50aWFsaWFzTW9kZSk7Cit9CisKK3ZvaWQgc2V0Q1RNKFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEFmZmluZVRyYW5z
Zm9ybSYgdHJhbnNmb3JtKQoreworICAgIEFTU0VSVChwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFy
Z2V0KCkpOworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+U2V0VHJhbnNmb3Jt
KHRyYW5zZm9ybSk7CisKKyAgICBpZiAoYXV0byogZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSA9IHBs
YXRmb3JtQ29udGV4dC5ncmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisgICAgICAgIGdyYXBoaWNz
Q29udGV4dFByaXZhdGUtPnNldENUTSh0cmFuc2Zvcm0pOworfQorCitBZmZpbmVUcmFuc2Zvcm0g
Z2V0Q1RNKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQpCit7CisgICAg
QVNTRVJUKHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKSk7CisgICAgRDJEMV9NQVRSSVhf
M1gyX0YgY3VycmVudFRyYW5zZm9ybTsKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0
KCktPkdldFRyYW5zZm9ybSgmY3VycmVudFRyYW5zZm9ybSk7CisgICAgcmV0dXJuIGN1cnJlbnRU
cmFuc2Zvcm07Cit9CisKK0ludFJlY3QgZ2V0Q2xpcEJvdW5kcyhQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRCYgcGxhdGZvcm1Db250ZXh0KQoreworICAgIEQyRDFfU0laRV9GIGNsaXBTaXplOworICAg
IGlmIChhdXRvIGNsaXBMYXllciA9IHBsYXRmb3JtQ29udGV4dC5jbGlwTGF5ZXIoKSkKKyAgICAg
ICAgY2xpcFNpemUgPSBjbGlwTGF5ZXItPkdldFNpemUoKTsKKyAgICBlbHNlCisgICAgICAgIGNs
aXBTaXplID0gcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5HZXRTaXplKCk7CisKKyAg
ICBGbG9hdFJlY3QgY2xpcEJvdW5kcyhJbnRQb2ludCgpLCBjbGlwU2l6ZSk7CisKKyAgICByZXR1
cm4gZW5jbG9zaW5nSW50UmVjdChjbGlwQm91bmRzKTsKK30KKworRmxvYXRSZWN0IHJvdW5kVG9E
ZXZpY2VQaXhlbHMoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29u
c3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisKKyAgICByZXR1
cm4gcmVjdDsKK30KKworYm9vbCBpc0FjY2VsZXJhdGVkQ29udGV4dChQbGF0Zm9ybUNvbnRleHRE
aXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0KQoreworICAgIGF1dG8gcmVuZGVyUHJvcGVydGllcyA9
IEQyRDE6OlJlbmRlclRhcmdldFByb3BlcnRpZXMoKTsKKyAgICByZW5kZXJQcm9wZXJ0aWVzLnR5
cGUgPSBEMkQxX1JFTkRFUl9UQVJHRVRfVFlQRV9IQVJEV0FSRTsKKyAgICByZXR1cm4gcGxhdGZv
cm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5Jc1N1cHBvcnRlZCgmcmVuZGVyUHJvcGVydGllcyk7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFN0YXRlCisKK0ZpbGxTb3VyY2U6OkZpbGxTb3VyY2UoY29u
c3QgR3JhcGhpY3NDb250ZXh0U3RhdGUmIHN0YXRlLCBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYg
cGxhdGZvcm1Db250ZXh0KQorICAgIDogZ2xvYmFsQWxwaGEoc3RhdGUuYWxwaGEpCisgICAgLCBj
b2xvcihzdGF0ZS5maWxsQ29sb3IpCisgICAgLCBmaWxsUnVsZShzdGF0ZS5maWxsUnVsZSkKK3sK
KyAgICBpZiAoc3RhdGUuZmlsbFBhdHRlcm4pIHsKKyAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHVz
ZXJUb0Jhc2VDVE07IC8vIEZJWE1FOiBUaGlzIGlzbid0IHJlYWxseSBuZWVkZWQgb24gV2luZG93
cworICAgICAgICBicnVzaCA9IHN0YXRlLmZpbGxQYXR0ZXJuLT5jcmVhdGVQbGF0Zm9ybVBhdHRl
cm4ocGxhdGZvcm1Db250ZXh0LCBzdGF0ZS5hbHBoYSwgdXNlclRvQmFzZUNUTSk7CisgICAgfSBl
bHNlIGlmIChzdGF0ZS5maWxsR3JhZGllbnQpCisgICAgICAgIGJydXNoID0gc3RhdGUuZmlsbEdy
YWRpZW50LT5jcmVhdGVQbGF0Zm9ybUdyYWRpZW50SWZOZWNlc3NhcnkocGxhdGZvcm1Db250ZXh0
LnJlbmRlclRhcmdldCgpKTsKKyAgICBlbHNlCisgICAgICAgIGJydXNoID0gcGxhdGZvcm1Db250
ZXh0LmJydXNoV2l0aENvbG9yKGNvbG9yKTsKK30KKworU3Ryb2tlU291cmNlOjpTdHJva2VTb3Vy
Y2UoY29uc3QgR3JhcGhpY3NDb250ZXh0U3RhdGUmIHN0YXRlLCBQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRCYgcGxhdGZvcm1Db250ZXh0KQorICAgIDogZ2xvYmFsQWxwaGEoc3RhdGUuYWxwaGEpCisg
ICAgLCB0aGlja25lc3Moc3RhdGUuc3Ryb2tlVGhpY2tuZXNzKQorICAgICwgY29sb3Ioc3RhdGUu
c3Ryb2tlQ29sb3IpCit7CisgICAgaWYgKHN0YXRlLnN0cm9rZVBhdHRlcm4pIHsKKyAgICAgICAg
QWZmaW5lVHJhbnNmb3JtIHVzZXJUb0Jhc2VDVE07IC8vIEZJWE1FOiBUaGlzIGlzbid0IHJlYWxs
eSBuZWVkZWQgb24gV2luZG93cworICAgICAgICBicnVzaCA9IHN0YXRlLnN0cm9rZVBhdHRlcm4t
PmNyZWF0ZVBsYXRmb3JtUGF0dGVybihwbGF0Zm9ybUNvbnRleHQsIHN0YXRlLmFscGhhLCB1c2Vy
VG9CYXNlQ1RNKTsKKyAgICB9IGVsc2UgaWYgKHN0YXRlLnN0cm9rZUdyYWRpZW50KQorICAgICAg
ICBicnVzaCA9IHN0YXRlLnN0cm9rZUdyYWRpZW50LT5jcmVhdGVQbGF0Zm9ybUdyYWRpZW50SWZO
ZWNlc3NhcnkocGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpKTsKKyAgICBlbHNlCisgICAg
ICAgIGJydXNoID0gcGxhdGZvcm1Db250ZXh0LmJydXNoV2l0aENvbG9yKGNvbG9yKTsKK30KKwor
U2hhZG93U3RhdGU6OlNoYWRvd1N0YXRlKGNvbnN0IEdyYXBoaWNzQ29udGV4dFN0YXRlJiBzdGF0
ZSkKKyAgICA6IG9mZnNldChzdGF0ZS5zaGFkb3dPZmZzZXQpCisgICAgLCBibHVyKHN0YXRlLnNo
YWRvd0JsdXIpCisgICAgLCBjb2xvcihzdGF0ZS5zaGFkb3dDb2xvcikKKyAgICAsIGlnbm9yZVRy
YW5zZm9ybXMoc3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXMpCisgICAgLCBnbG9iYWxBbHBo
YShzdGF0ZS5hbHBoYSkKKyAgICAsIGdsb2JhbENvbXBvc2l0ZU9wZXJhdG9yKHN0YXRlLmNvbXBv
c2l0ZU9wZXJhdG9yKQoreworfQorCitib29sIFNoYWRvd1N0YXRlOjppc1Zpc2libGUoKSBjb25z
dAoreworICAgIHJldHVybiBjb2xvci5pc1Zpc2libGUoKSAmJiAob2Zmc2V0LndpZHRoKCkgfHwg
b2Zmc2V0LmhlaWdodCgpIHx8IGJsdXIpOworfQorCitib29sIFNoYWRvd1N0YXRlOjppc1JlcXVp
cmVkKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQpIGNvbnN0Cit7Cisg
ICAgLy8gV2UgY2FuJ3QgYXZvaWQgU2hhZG93Qmx1ciBpZiB0aGUgc2hhZG93IGhhcyBibHVyLgor
ICAgIGlmIChjb2xvci5pc1Zpc2libGUoKSAmJiBibHVyKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIC8vIFdlIGNhbiBhdm9pZCBTaGFkb3dCbHVyIGFuZCBvcHRpbWl6ZSwgc2luY2Ugd2Un
cmUgbm90IGRyYXdpbmcgb24gYQorICAgIC8vIGNhbnZhcyBhbmQgYm94IHNoYWRvd3MgYXJlIGFm
ZmVjdGVkIGJ5IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgaWYgKCFpZ25vcmVUcmFu
c2Zvcm1zKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBXZSBjYW4gYXZvaWQgU2hh
ZG93Qmx1ciwgc2luY2UgdGhlcmUgYXJlIG5vIHRyYW5zZm9ybWF0aW9ucyB0byBhcHBseSB0byB0
aGUgY2FudmFzLgorICAgIGlmIChTdGF0ZTo6Z2V0Q1RNKHBsYXRmb3JtQ29udGV4dCkuaXNJZGVu
dGl0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBPdGhlcndpc2UsIG5vIGNo
YW5jZSBhdm9pZGluZyBTaGFkb3dCbHVyLgorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIHNl
dExpbmVDYXAoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgTGluZUNh
cCBsaW5lQ2FwKQoreworICAgIEQyRDFfQ0FQX1NUWUxFIGNhcFN0eWxlID0gRDJEMV9DQVBfU1RZ
TEVfRkxBVDsKKyAgICBzd2l0Y2ggKGxpbmVDYXApIHsKKyAgICBjYXNlIFJvdW5kQ2FwOgorICAg
ICAgICBjYXBTdHlsZSA9IEQyRDFfQ0FQX1NUWUxFX1JPVU5EOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFNxdWFyZUNhcDoKKyAgICAgICAgY2FwU3R5bGUgPSBEMkQxX0NBUF9TVFlMRV9TUVVB
UkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQnV0dENhcDoKKyAgICBkZWZhdWx0OgorICAg
ICAgICBjYXBTdHlsZSA9IEQyRDFfQ0FQX1NUWUxFX0ZMQVQ7CisgICAgICAgIGJyZWFrOworICAg
IH0KKworICAgIHBsYXRmb3JtQ29udGV4dC5zZXRMaW5lQ2FwKGNhcFN0eWxlKTsKK30KKwordm9p
ZCBzZXRMaW5lRGFzaChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBj
b25zdCBEYXNoQXJyYXkmIGRhc2hlcywgZmxvYXQgZGFzaE9mZnNldCkKK3sKKyAgICBwbGF0Zm9y
bUNvbnRleHQuc2V0RGFzaGVzKGRhc2hlcyk7CisgICAgcGxhdGZvcm1Db250ZXh0LnNldERhc2hP
ZmZzZXQoZGFzaE9mZnNldCk7Cit9CisKK3ZvaWQgc2V0TGluZUpvaW4oUGxhdGZvcm1Db250ZXh0
RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgTGluZUpvaW4gbGluZUpvaW4pCit7CisgICAgRDJE
MV9MSU5FX0pPSU4gam9pblN0eWxlID0gRDJEMV9MSU5FX0pPSU5fTUlURVI7CisgICAgc3dpdGNo
IChsaW5lSm9pbikgeworICAgIGNhc2UgUm91bmRKb2luOgorICAgICAgICBqb2luU3R5bGUgPSBE
MkQxX0xJTkVfSk9JTl9ST1VORDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCZXZlbEpvaW46
CisgICAgICAgIGpvaW5TdHlsZSA9IEQyRDFfTElORV9KT0lOX0JFVkVMOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIE1pdGVySm9pbjoKKyAgICBkZWZhdWx0OgorICAgICAgICBqb2luU3R5bGUg
PSBEMkQxX0xJTkVfSk9JTl9NSVRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcGxh
dGZvcm1Db250ZXh0LnNldExpbmVKb2luKGpvaW5TdHlsZSk7Cit9CisKK3ZvaWQgc2V0TWl0ZXJM
aW1pdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBmbG9hdCBtaXRl
ckxpbWl0KQoreworICAgIHBsYXRmb3JtQ29udGV4dC5zZXRNaXRlckxpbWl0KG1pdGVyTGltaXQp
OworfQorCit2b2lkIGZpbGxSZWN0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNv
bnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgRmlsbFNvdXJjZSYgZmlsbFNvdXJj
ZSwgY29uc3QgU2hhZG93U3RhdGUmIHNoYWRvd1N0YXRlKQoreworICAgIGF1dG8gY29udGV4dCA9
IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3Mo
MSwgX19MSU5FX18pOworICAgIFBsYXRmb3JtQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihw
bGF0Zm9ybUNvbnRleHQpOworICAgIEZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4g
ZHJhd0Z1bmN0aW9uID0gWyZwbGF0Zm9ybUNvbnRleHQsIHJlY3QsICZmaWxsU291cmNlXShJRDJE
MVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIGNvbnN0IEQyRDFfUkVDVF9G
IGQyZFJlY3QgPSByZWN0OworICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUoJmQy
ZFJlY3QsIGZpbGxTb3VyY2UuYnJ1c2guZ2V0KCkpOworICAgIH07CisKKyAgICBpZiAoc2hhZG93
U3RhdGUuaXNWaXNpYmxlKCkpCisgICAgICAgIGRyYXdXaXRoU2hhZG93KHBsYXRmb3JtQ29udGV4
dCwgcmVjdCwgc2hhZG93U3RhdGUsIGRyYXdGdW5jdGlvbik7CisgICAgZWxzZQorICAgICAgICBk
cmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIHJlY3QsIGRyYXdGdW5jdGlvbik7Cit9
CisKK3ZvaWQgZmlsbFJlY3QoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4
dCwgY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IsIGNvbnN0IFNoYWRv
d1N0YXRlJiBzaGFkb3dTdGF0ZSkKK3sKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRl
eHQucmVuZGVyVGFyZ2V0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsK
KyAgICBQbGF0Zm9ybUNvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIocGxhdGZvcm1Db250ZXh0
KTsKKyAgICBGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+IGRyYXdGdW5jdGlvbiA9
IFsmcGxhdGZvcm1Db250ZXh0LCBjb2xvciwgcmVjdF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRl
clRhcmdldCkgeworICAgICAgICBjb25zdCBEMkQxX1JFQ1RfRiBkMmRSZWN0ID0gcmVjdDsKKyAg
ICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsUmVjdGFuZ2xlKCZkMmRSZWN0LCBwbGF0Zm9ybUNvbnRl
eHQuYnJ1c2hXaXRoQ29sb3IoY29sb3IpLmdldCgpKTsKKyAgICB9OworCisgICAgaWYgKHNoYWRv
d1N0YXRlLmlzVmlzaWJsZSgpKQorICAgICAgICBkcmF3V2l0aFNoYWRvdyhwbGF0Zm9ybUNvbnRl
eHQsIHJlY3QsIHNoYWRvd1N0YXRlLCBkcmF3RnVuY3Rpb24pOworICAgIGVsc2UKKyAgICAgICAg
ZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCByZWN0LCBkcmF3RnVuY3Rpb24pOwor
fQorCit2b2lkIGZpbGxSb3VuZGVkUmVjdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZv
cm1Db250ZXh0LCBjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29s
b3IsIGNvbnN0IFNoYWRvd1N0YXRlJiBzaGFkb3dTdGF0ZSkKK3sKKyAgICBhdXRvIGNvbnRleHQg
PSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCk7CisgICAgY29udGV4dC0+U2V0VGFncygx
LCBfX0xJTkVfXyk7CisKKyAgICBjb25zdCBGbG9hdFJlY3QmIHIgPSByZWN0LnJlY3QoKTsKKyAg
ICBjb25zdCBGbG9hdFJvdW5kZWRSZWN0OjpSYWRpaSYgcmFkaWkgPSByZWN0LnJhZGlpKCk7Cisg
ICAgYm9vbCBlcXVhbFdpZHRocyA9IChyYWRpaS50b3BMZWZ0KCkud2lkdGgoKSA9PSByYWRpaS50
b3BSaWdodCgpLndpZHRoKCkgJiYgcmFkaWkudG9wUmlnaHQoKS53aWR0aCgpID09IHJhZGlpLmJv
dHRvbUxlZnQoKS53aWR0aCgpICYmIHJhZGlpLmJvdHRvbUxlZnQoKS53aWR0aCgpID09IHJhZGlp
LmJvdHRvbVJpZ2h0KCkud2lkdGgoKSk7CisgICAgYm9vbCBlcXVhbEhlaWdodHMgPSAocmFkaWku
dG9wTGVmdCgpLmhlaWdodCgpID09IHJhZGlpLmJvdHRvbUxlZnQoKS5oZWlnaHQoKSAmJiByYWRp
aS5ib3R0b21MZWZ0KCkuaGVpZ2h0KCkgPT0gcmFkaWkudG9wUmlnaHQoKS5oZWlnaHQoKSAmJiBy
YWRpaS50b3BSaWdodCgpLmhlaWdodCgpID09IHJhZGlpLmJvdHRvbVJpZ2h0KCkuaGVpZ2h0KCkp
OworICAgIGJvb2wgaGFzQ3VzdG9tRmlsbCA9IGZhbHNlOyAvLyBGSVhNRTogV2h5IGlzbid0IGEg
RmlsbFNvdXJjZSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbj8KKyAgICBpZiAoIWhhc0N1c3RvbUZp
bGwgJiYgZXF1YWxXaWR0aHMgJiYgZXF1YWxIZWlnaHRzICYmIHJhZGlpLnRvcExlZnQoKS53aWR0
aCgpICogMiA9PSByLndpZHRoKCkgJiYgcmFkaWkudG9wTGVmdCgpLmhlaWdodCgpICogMiA9PSBy
LmhlaWdodCgpKSB7CisgICAgICAgIFBsYXRmb3JtQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZl
cihwbGF0Zm9ybUNvbnRleHQpOworICAgICAgICBGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFy
Z2V0Kik+IGRyYXdGdW5jdGlvbiA9IFsmcGxhdGZvcm1Db250ZXh0LCBjb2xvciwgcmVjdCwgcmFk
aWksIHJdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgICAgIGF1
dG8gcm91bmRlZFJlY3QgPSBEMkQxOjpSb3VuZGVkUmVjdChyLCByYWRpaS50b3BMZWZ0KCkud2lk
dGgoKSwgcmFkaWkudG9wTGVmdCgpLmhlaWdodCgpKTsKKyAgICAgICAgICAgIHJlbmRlclRhcmdl
dC0+RmlsbFJvdW5kZWRSZWN0YW5nbGUoJnJvdW5kZWRSZWN0LCBwbGF0Zm9ybUNvbnRleHQuYnJ1
c2hXaXRoQ29sb3IoY29sb3IpLmdldCgpKTsKKyAgICAgICAgfTsKKworICAgICAgICBpZiAoc2hh
ZG93U3RhdGUuaXNWaXNpYmxlKCkpCisgICAgICAgICAgICBkcmF3V2l0aFNoYWRvdyhwbGF0Zm9y
bUNvbnRleHQsIHIsIHNoYWRvd1N0YXRlLCBkcmF3RnVuY3Rpb24pOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIHIsIGRyYXdGdW5j
dGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlciBz
dGF0ZVNhdmVyKHBsYXRmb3JtQ29udGV4dCk7CisgICAgICAgIFBhdGggcGF0aDsKKyAgICAgICAg
cGF0aC5hZGRSb3VuZGVkUmVjdChyZWN0KTsKKyAgICAgICAgZmlsbFBhdGgocGxhdGZvcm1Db250
ZXh0LCBwYXRoLCBjb2xvciwgc2hhZG93U3RhdGUpOworICAgIH0KK30KKwordm9pZCBmaWxsUmVj
dFdpdGhSb3VuZGVkSG9sZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0
LCBjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmIHJvdW5kZWRI
b2xlUmVjdCwgY29uc3QgRmlsbFNvdXJjZSYgZmlsbFNvdXJjZSwgY29uc3QgU2hhZG93U3RhdGUm
IHNoYWRvd1N0YXRlKQoreworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5yZW5k
ZXJUYXJnZXQoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworCisgICAg
UGF0aCBwYXRoOworICAgIHBhdGguYWRkUmVjdChyZWN0KTsKKworICAgIGlmICghcm91bmRlZEhv
bGVSZWN0LnJhZGlpKCkuaXNaZXJvKCkpCisgICAgICAgIHBhdGguYWRkUm91bmRlZFJlY3Qocm91
bmRlZEhvbGVSZWN0KTsKKyAgICBlbHNlCisgICAgICAgIHBhdGguYWRkUmVjdChyb3VuZGVkSG9s
ZVJlY3QucmVjdCgpKTsKKworICAgIEZpbGxTb3VyY2UgZmlsbFdpdGhIb2xlU291cmNlID0gZmls
bFNvdXJjZTsKKyAgICBmaWxsV2l0aEhvbGVTb3VyY2UuZmlsbFJ1bGUgPSBXaW5kUnVsZTo6RXZl
bk9kZDsKKworICAgIGZpbGxQYXRoKHBsYXRmb3JtQ29udGV4dCwgcGF0aCwgZmlsbFNvdXJjZSwg
c2hhZG93U3RhdGUpOworfQorCit2b2lkIGZpbGxSZWN0V2l0aEdyYWRpZW50KFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgSUQy
RDFCcnVzaCogZ3JhZGllbnQpCit7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0
LnJlbmRlclRhcmdldCgpOworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Cisg
ICAgUGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKHBsYXRmb3JtQ29udGV4dCk7
CisgICAgRnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiBkcmF3RnVuY3Rpb24gPSBb
JnBsYXRmb3JtQ29udGV4dCwgcmVjdCwgJmdyYWRpZW50XShJRDJEMVJlbmRlclRhcmdldCogcmVu
ZGVyVGFyZ2V0KSB7CisgICAgICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSByZWN0Owor
ICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUoJmQyZFJlY3QsIGdyYWRpZW50KTsK
KyAgICB9OworfQorCit2b2lkIGZpbGxQYXRoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0
Zm9ybUNvbnRleHQsIGNvbnN0IFBhdGgmIHBhdGgsIGNvbnN0IEZpbGxTb3VyY2UmIGZpbGxTb3Vy
Y2UsIGNvbnN0IFNoYWRvd1N0YXRlJiBzaGFkb3dTdGF0ZSkKK3sKKyAgICBpZiAocGF0aC5hY3Rp
dmVQYXRoKCkpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIGl0J3MgY2xvc2VkLiBUaGlzIG1pZ2h0
IGZhaWwgaWYgdGhlIHBhdGggd2FzIGFscmVhZHkgY2xvc2VkLCBzbworICAgICAgICAvLyBpZ25v
cmUgdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgICAgcGF0aC5hY3RpdmVQYXRoKCktPkNsb3NlKCk7
CisgICAgfQorCisgICAgUGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKHBsYXRm
b3JtQ29udGV4dCk7CisKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVy
VGFyZ2V0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIENP
TVB0cjxJRDJEMUdlb21ldHJ5R3JvdXA+IHBhdGhUb0ZpbGw7CisgICAgcGF0aC5jcmVhdGVHZW9t
ZXRyeVdpdGhGaWxsTW9kZShmaWxsU291cmNlLmZpbGxSdWxlLCBwYXRoVG9GaWxsKTsKKworICAg
IGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworCisgICAgRnVuY3Rpb248dm9pZChJRDJE
MVJlbmRlclRhcmdldCopPiBkcmF3RnVuY3Rpb24gPSBbJnBsYXRmb3JtQ29udGV4dCwgJnBhdGhU
b0ZpbGwsICZmaWxsU291cmNlXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Cisg
ICAgICAgIHJlbmRlclRhcmdldC0+RmlsbEdlb21ldHJ5KHBhdGhUb0ZpbGwuZ2V0KCksIGZpbGxT
b3VyY2UuYnJ1c2guZ2V0KCkpOworICAgIH07CisKKyAgICBpZiAoc2hhZG93U3RhdGUuaXNWaXNp
YmxlKCkpIHsKKyAgICAgICAgRmxvYXRSZWN0IGJvdW5kaW5nUmVjdCA9IHBhdGguZmFzdEJvdW5k
aW5nUmVjdCgpOworICAgICAgICBkcmF3V2l0aFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIGJvdW5k
aW5nUmVjdCwgc2hhZG93U3RhdGUsIGRyYXdGdW5jdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgRmxvYXRSZWN0IGNvbnRleHRSZWN0KEZsb2F0UG9pbnQoKSwgY29udGV4dC0+R2V0U2l6ZSgp
KTsKKyAgICAgICAgZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCBjb250ZXh0UmVj
dCwgZHJhd0Z1bmN0aW9uKTsKKyAgICB9CisKKyAgICBmbHVzaChwbGF0Zm9ybUNvbnRleHQpOwor
fQorCit2b2lkIGZpbGxQYXRoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRl
eHQsIGNvbnN0IFBhdGgmIHBhdGgsIGNvbnN0IENvbG9yJiBjb2xvciwgY29uc3QgU2hhZG93U3Rh
dGUmIHNoYWRvd1N0YXRlKQoreworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5y
ZW5kZXJUYXJnZXQoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworCisg
ICAgQ09NUHRyPElEMkQxR2VvbWV0cnlHcm91cD4gcGF0aFRvRmlsbDsKKyAgICBwYXRoLmNyZWF0
ZUdlb21ldHJ5V2l0aEZpbGxNb2RlKFdpbmRSdWxlOjpFdmVuT2RkLCBwYXRoVG9GaWxsKTsKKwor
ICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworCisgICAgRnVuY3Rpb248dm9pZChJ
RDJEMVJlbmRlclRhcmdldCopPiBkcmF3RnVuY3Rpb24gPSBbJnBsYXRmb3JtQ29udGV4dCwgJnBh
dGhUb0ZpbGwsIGNvbG9yXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAg
ICAgIHJlbmRlclRhcmdldC0+RmlsbEdlb21ldHJ5KHBhdGhUb0ZpbGwuZ2V0KCksIHBsYXRmb3Jt
Q29udGV4dC5icnVzaFdpdGhDb2xvcihjb2xvcikuZ2V0KCkpOworICAgIH07CisKKyAgICBpZiAo
c2hhZG93U3RhdGUuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgRmxvYXRSZWN0IGJvdW5kaW5nUmVj
dCA9IHBhdGguZmFzdEJvdW5kaW5nUmVjdCgpOworICAgICAgICBkcmF3V2l0aFNoYWRvdyhwbGF0
Zm9ybUNvbnRleHQsIGJvdW5kaW5nUmVjdCwgc2hhZG93U3RhdGUsIGRyYXdGdW5jdGlvbik7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgRmxvYXRSZWN0IGNvbnRleHRSZWN0KEZsb2F0UG9pbnQoKSwg
Y29udGV4dC0+R2V0U2l6ZSgpKTsKKyAgICAgICAgZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1D
b250ZXh0LCBjb250ZXh0UmVjdCwgZHJhd0Z1bmN0aW9uKTsKKyAgICB9CisKKyAgICBmbHVzaChw
bGF0Zm9ybUNvbnRleHQpOworfQorCit2b2lkIHN0cm9rZVJlY3QoUGxhdGZvcm1Db250ZXh0RGly
ZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiByZWN0LCBmbG9hdCBsaW5l
V2lkdGgsIGNvbnN0IFN0cm9rZVNvdXJjZSYgc3Ryb2tlU291cmNlLCBjb25zdCBTaGFkb3dTdGF0
ZSYgc2hhZG93U3RhdGUpCit7CisgICAgRnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCop
PiBkcmF3RnVuY3Rpb24gPSBbJnBsYXRmb3JtQ29udGV4dCwgJnN0cm9rZVNvdXJjZSwgcmVjdCwg
bGluZVdpZHRoXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIHJl
bmRlclRhcmdldC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisgICAgICAgIGNvbnN0IEQyRDFfUkVD
VF9GIGQyZFJlY3QgPSByZWN0OworICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdSZWN0YW5nbGUo
JmQyZFJlY3QsIHN0cm9rZVNvdXJjZS5icnVzaC5nZXQoKSwgbGluZVdpZHRoLCBwbGF0Zm9ybUNv
bnRleHQuc3Ryb2tlU3R5bGUoKSk7CisgICAgfTsKKworICAgIGlmIChzaGFkb3dTdGF0ZS5pc1Zp
c2libGUoKSkKKyAgICAgICAgZHJhd1dpdGhTaGFkb3cocGxhdGZvcm1Db250ZXh0LCByZWN0LCBz
aGFkb3dTdGF0ZSwgZHJhd0Z1bmN0aW9uKTsKKyAgICBlbHNlCisgICAgICAgIGRyYXdXaXRob3V0
U2hhZG93KHBsYXRmb3JtQ29udGV4dCwgcmVjdCwgZHJhd0Z1bmN0aW9uKTsKK30KKwordm9pZCBz
dHJva2VQYXRoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0
IFBhdGgmIHBhdGgsIGNvbnN0IFN0cm9rZVNvdXJjZSYgc3Ryb2tlU291cmNlLCBjb25zdCBTaGFk
b3dTdGF0ZSYgc2hhZG93U3RhdGUpCit7CisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250
ZXh0LnJlbmRlclRhcmdldCgpOworICAgIAorICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5F
X18pOworCisgICAgUGxhdGZvcm1Db250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKHBsYXRmb3Jt
Q29udGV4dCk7CisgICAgYXV0byBib3VuZGluZ1JlY3QgPSBwYXRoLmZhc3RCb3VuZGluZ1JlY3Qo
KTsKKyAgICBGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+IGRyYXdGdW5jdGlvbiA9
IFsmcGxhdGZvcm1Db250ZXh0LCAmcGF0aCwgJnN0cm9rZVNvdXJjZV0oSUQyRDFSZW5kZXJUYXJn
ZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdHZW9tZXRyeShw
YXRoLnBsYXRmb3JtUGF0aCgpLCBzdHJva2VTb3VyY2UuYnJ1c2guZ2V0KCksIHN0cm9rZVNvdXJj
ZS50aGlja25lc3MsIHBsYXRmb3JtQ29udGV4dC5zdHJva2VTdHlsZSgpKTsKKyAgICB9OworCisg
ICAgaWYgKHNoYWRvd1N0YXRlLmlzVmlzaWJsZSgpKQorICAgICAgICBkcmF3V2l0aFNoYWRvdyhw
bGF0Zm9ybUNvbnRleHQsIGJvdW5kaW5nUmVjdCwgc2hhZG93U3RhdGUsIGRyYXdGdW5jdGlvbik7
CisgICAgZWxzZQorICAgICAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIGJv
dW5kaW5nUmVjdCwgZHJhd0Z1bmN0aW9uKTsKKworICAgIGZsdXNoKHBsYXRmb3JtQ29udGV4dCk7
Cit9CisKK3ZvaWQgZHJhd1BhdGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29u
dGV4dCwgY29uc3QgUGF0aCYgcGF0aCwgY29uc3QgU3Ryb2tlU291cmNlJiBzdHJva2VTb3VyY2Us
IGNvbnN0IFNoYWRvd1N0YXRlJikKK3sKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRl
eHQucmVuZGVyVGFyZ2V0KCk7CisKKyAgICBpZiAocGF0aC5hY3RpdmVQYXRoKCkpCisgICAgICAg
IHBhdGguYWN0aXZlUGF0aCgpLT5DbG9zZSgpOworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBf
X0xJTkVfXyk7CisKKyAgICBhdXRvIHJlY3QgPSBwYXRoLmZhc3RCb3VuZGluZ1JlY3QoKTsKKyAg
ICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIHJlY3QsIFsmcGxhdGZvcm1Db250
ZXh0LCAmc3Ryb2tlU291cmNlLCAmcGF0aF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdl
dCkgeworICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdHZW9tZXRyeShwYXRoLnBsYXRmb3JtUGF0
aCgpLCBzdHJva2VTb3VyY2UuYnJ1c2guZ2V0KCksIHN0cm9rZVNvdXJjZS50aGlja25lc3MsIHBs
YXRmb3JtQ29udGV4dC5zdHJva2VTdHlsZSgpKTsKKyAgICB9KTsKKworICAgIGZsdXNoKHBsYXRm
b3JtQ29udGV4dCk7Cit9CisKK3ZvaWQgZHJhd1dpdGhTaGFkb3dIZWxwZXIoSUQyRDFSZW5kZXJU
YXJnZXQqIGNvbnRleHQsIElEMkQxQml0bWFwKiBiaXRtYXAsIGNvbnN0IENvbG9yJiBzaGFkb3dD
b2xvciwgY29uc3QgRmxvYXRTaXplJiBzaGFkb3dPZmZzZXQsIGZsb2F0IHNoYWRvd0JsdXIpCit7
CisgICAgQ09NUHRyPElEMkQxRGV2aWNlQ29udGV4dD4gZGV2aWNlQ29udGV4dDsKKyAgICBIUkVT
VUxUIGhyID0gY29udGV4dC0+UXVlcnlJbnRlcmZhY2UoJmRldmljZUNvbnRleHQpOworICAgIFJF
TEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOworCisgICAgLy8gQ3JlYXRlIHRoZSBzaGFkb3cg
ZWZmZWN0CisgICAgQ09NUHRyPElEMkQxRWZmZWN0PiBzaGFkb3dFZmZlY3Q7CisgICAgaHIgPSBk
ZXZpY2VDb250ZXh0LT5DcmVhdGVFZmZlY3QoQ0xTSURfRDJEMVNoYWRvdywgJnNoYWRvd0VmZmVj
dCk7CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisKKyAgICBzaGFkb3dFZmZl
Y3QtPlNldElucHV0KDAsIGJpdG1hcCk7CisgICAgc2hhZG93RWZmZWN0LT5TZXRWYWx1ZShEMkQx
X1NIQURPV19QUk9QX0NPTE9SLCBzdGF0aWNfY2FzdDxEMkQxX1ZFQ1RPUl80Rj4oc2hhZG93Q29s
b3IpKTsKKyAgICBzaGFkb3dFZmZlY3QtPlNldFZhbHVlKEQyRDFfU0hBRE9XX1BST1BfQkxVUl9T
VEFOREFSRF9ERVZJQVRJT04sIHNoYWRvd0JsdXIpOworCisgICAgQ09NUHRyPElEMkQxRWZmZWN0
PiB0cmFuc2Zvcm1FZmZlY3Q7CisgICAgaHIgPSBkZXZpY2VDb250ZXh0LT5DcmVhdGVFZmZlY3Qo
Q0xTSURfRDJEMTJEQWZmaW5lVHJhbnNmb3JtLCAmdHJhbnNmb3JtRWZmZWN0KTsKKyAgICBSRUxF
QVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKworICAgIHRyYW5zZm9ybUVmZmVjdC0+U2V0SW5w
dXRFZmZlY3QoMCwgc2hhZG93RWZmZWN0LmdldCgpKTsKKworICAgIGF1dG8gdHJhbnNsYXRpb24g
PSBEMkQxOjpNYXRyaXgzeDJGOjpUcmFuc2xhdGlvbihzaGFkb3dPZmZzZXQud2lkdGgoKSwgc2hh
ZG93T2Zmc2V0LmhlaWdodCgpKTsKKyAgICB0cmFuc2Zvcm1FZmZlY3QtPlNldFZhbHVlKEQyRDFf
MkRBRkZJTkVUUkFOU0ZPUk1fUFJPUF9UUkFOU0ZPUk1fTUFUUklYLCB0cmFuc2xhdGlvbik7CisK
KyAgICBDT01QdHI8SUQyRDFFZmZlY3Q+IGNvbXBvc2l0b3I7CisgICAgaHIgPSBkZXZpY2VDb250
ZXh0LT5DcmVhdGVFZmZlY3QoQ0xTSURfRDJEMUNvbXBvc2l0ZSwgJmNvbXBvc2l0b3IpOworICAg
IFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOworCisgICAgY29tcG9zaXRvci0+U2V0SW5w
dXRFZmZlY3QoMCwgdHJhbnNmb3JtRWZmZWN0LmdldCgpKTsKKyAgICBjb21wb3NpdG9yLT5TZXRJ
bnB1dCgxLCBiaXRtYXApOworCisgICAgLy8gRmxpcCB0aGUgY29udGV4dAorICAgIEQyRDFfTUFU
UklYXzNYMl9GIGN0bTsKKyAgICBkZXZpY2VDb250ZXh0LT5HZXRUcmFuc2Zvcm0oJmN0bSk7Cisg
ICAgYXV0byB0cmFuc2xhdGUgPSBEMkQxOjpNYXRyaXgzeDJGOjpUcmFuc2xhdGlvbigwLjBmLCBk
ZXZpY2VDb250ZXh0LT5HZXRTaXplKCkuaGVpZ2h0KTsKKyAgICBhdXRvIGZsaXAgPSBEMkQxOjpN
YXRyaXgzeDJGOjpTY2FsZShEMkQxOjpTaXplRigxLjBmLCAtMS4wZikpOworICAgIGRldmljZUNv
bnRleHQtPlNldFRyYW5zZm9ybShjdG0gKiBmbGlwICogdHJhbnNsYXRlKTsKKworICAgIGRldmlj
ZUNvbnRleHQtPkRyYXdJbWFnZShjb21wb3NpdG9yLmdldCgpLCBEMkQxX0lOVEVSUE9MQVRJT05f
TU9ERV9MSU5FQVIpOworfQorCit2b2lkIGRyYXdXaXRoU2hhZG93KFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdSZWN0LCBj
b25zdCBTaGFkb3dTdGF0ZSYgc2hhZG93U3RhdGUsIGNvbnN0IFdURjo6RnVuY3Rpb248dm9pZChJ
RDJEMVJlbmRlclRhcmdldCopPiYgZHJhd0NvbW1hbmRzKQoreworICAgIGF1dG8gY29udGV4dCA9
IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKTsKKworICAgIC8vIFJlbmRlciB0aGUgY3Vy
cmVudCBnZW9tZXRyeSB0byBhIGJpdG1hcCBjb250ZXh0CisgICAgQ09NUHRyPElEMkQxQml0bWFw
UmVuZGVyVGFyZ2V0PiBiaXRtYXBUYXJnZXQ7CisgICAgSFJFU1VMVCBociA9IGNvbnRleHQtPkNy
ZWF0ZUNvbXBhdGlibGVSZW5kZXJUYXJnZXQoJmJpdG1hcFRhcmdldCk7CisgICAgUkVMRUFTRV9B
U1NFUlQoU1VDQ0VFREVEKGhyKSk7CisKKyAgICBiaXRtYXBUYXJnZXQtPkJlZ2luRHJhdygpOwor
ICAgIGRyYXdDb21tYW5kcyhiaXRtYXBUYXJnZXQuZ2V0KCkpOworICAgIGhyID0gYml0bWFwVGFy
Z2V0LT5FbmREcmF3KCk7CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisKKyAg
ICBDT01QdHI8SUQyRDFCaXRtYXA+IGJpdG1hcDsKKyAgICBociA9IGJpdG1hcFRhcmdldC0+R2V0
Qml0bWFwKCZiaXRtYXApOworICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOworCisg
ICAgZHJhd1dpdGhTaGFkb3dIZWxwZXIoY29udGV4dCwgYml0bWFwLmdldCgpLCBzaGFkb3dTdGF0
ZS5jb2xvciwgc2hhZG93U3RhdGUub2Zmc2V0LCBzaGFkb3dTdGF0ZS5ibHVyKTsKK30KKwordm9p
ZCBkcmF3V2l0aG91dFNoYWRvdyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250
ZXh0LCBjb25zdCBGbG9hdFJlY3QmIC8qYm91bmRpbmdSZWN0Ki8sIGNvbnN0IFdURjo6RnVuY3Rp
b248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiYgZHJhd0NvbW1hbmRzKQoreworICAgIGRyYXdD
b21tYW5kcyhwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpOworfQorCit2b2lkIGNsZWFy
UmVjdChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBGbG9h
dFJlY3QmIHJlY3QpCit7CisgICAgZHJhd1dpdGhvdXRTaGFkb3cocGxhdGZvcm1Db250ZXh0LCBy
ZWN0LCBbJnBsYXRmb3JtQ29udGV4dCwgcmVjdF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRh
cmdldCkgeworICAgICAgICBGbG9hdFJlY3QgcmVuZGVyVGFyZ2V0UmVjdChGbG9hdFBvaW50KCks
IHJlbmRlclRhcmdldC0+R2V0U2l6ZSgpKTsKKyAgICAgICAgRmxvYXRSZWN0IHJlY3RUb0NsZWFy
KHJlY3QpOworCisgICAgICAgIGlmIChyZWN0VG9DbGVhci5jb250YWlucyhyZW5kZXJUYXJnZXRS
ZWN0KSkgeworICAgICAgICAgICAgcmVuZGVyVGFyZ2V0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsK
KyAgICAgICAgICAgIHJlbmRlclRhcmdldC0+Q2xlYXIoRDJEMTo6Q29sb3JGKDAsIDAsIDAsIDAp
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmVjdFRv
Q2xlYXIuaW50ZXJzZWN0cyhyZW5kZXJUYXJnZXRSZWN0KSkKKyAgICAgICAgICAgIHJldHVybjsK
KworICAgICAgICByZW5kZXJUYXJnZXQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworICAgICAgICBy
ZWN0VG9DbGVhci5pbnRlcnNlY3QocmVuZGVyVGFyZ2V0UmVjdCk7CisgICAgICAgIHJlbmRlclRh
cmdldC0+RmlsbFJlY3RhbmdsZShyZWN0VG9DbGVhciwgcGxhdGZvcm1Db250ZXh0LmJydXNoV2l0
aENvbG9yKENvbG9yKEQyRDE6OkNvbG9yRigwLCAwLCAwLCAwKSkpLmdldCgpKTsKKyAgICB9KTsK
K30KKworLyoKK3ZvaWQgZHJhd0dseXBocyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZv
cm1Db250ZXh0LCBjb25zdCBGaWxsU291cmNlJiBmaWxsU291cmNlLCBjb25zdCBTdHJva2VTb3Vy
Y2UmIHN0cm9rZVNvdXJjZSwgY29uc3QgU2hhZG93U3RhdGUmIHNoYWRvd1N0YXRlLCBjb25zdCBG
bG9hdFBvaW50JiBwb2ludCwgRGlyZWN0V3JpdGVTY2FsZWRGb250KiBzY2FsZWRGb250LCBkb3Vi
bGUgc3ludGhldGljQm9sZE9mZnNldCwgY29uc3QgVmVjdG9yPERpcmVjdFdyaXRlR2x5cGhUeXBl
PiYgZ2x5cGhzLCBmbG9hdCB4T2Zmc2V0LCBUZXh0RHJhd2luZ01vZGVGbGFncyB0ZXh0RHJhd2lu
Z01vZGUsIGZsb2F0IHN0cm9rZVRoaWNrbmVzcywgY29uc3QgRmxvYXRTaXplJiBzaGFkb3dPZmZz
ZXQsIGNvbnN0IENvbG9yJiBzaGFkb3dDb2xvcikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
fQorKi8KKwordm9pZCBkcmF3TmF0aXZlSW1hZ2UoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBs
YXRmb3JtQ29udGV4dCwgSVdJQ0JpdG1hcCogaW1hZ2UsIGNvbnN0IEZsb2F0U2l6ZSYgaW1hZ2VT
aXplLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3Qs
IENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUgYmxlbmRNb2Rl
LCBJbWFnZU9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBJbnRlcnBvbGF0aW9uUXVhbGl0eSBpbWFn
ZUludGVycG9sYXRpb25RdWFsaXR5LCBmbG9hdCBnbG9iYWxBbHBoYSwgY29uc3QgU2hhZG93U3Rh
dGUmIHNoYWRvd1N0YXRlKQoreworICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gZGV2aWNlQml0bWFw
OworICAgIEhSRVNVTFQgaHIgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkNyZWF0
ZUJpdG1hcEZyb21XaWNCaXRtYXAoaW1hZ2UsICZkZXZpY2VCaXRtYXApOworICAgIGlmICghU1VD
Q0VFREVEKGhyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZHJhd05hdGl2ZUltYWdlKHBsYXRm
b3JtQ29udGV4dCwgZGV2aWNlQml0bWFwLmdldCgpLCBpbWFnZVNpemUsIGRlc3RSZWN0LCBzcmNS
ZWN0LCBjb21wb3NpdGVPcGVyYXRvciwgYmxlbmRNb2RlLCBvcmllbnRhdGlvbiwgaW1hZ2VJbnRl
cnBvbGF0aW9uUXVhbGl0eSwgZ2xvYmFsQWxwaGEsIHNoYWRvd1N0YXRlKTsKK30KKwordm9pZCBk
cmF3TmF0aXZlSW1hZ2UoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwg
SUQyRDFCaXRtYXAqIGltYWdlLCBjb25zdCBGbG9hdFNpemUmIGltYWdlU2l6ZSwgY29uc3QgRmxv
YXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVy
YXRvciBjb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlIGJsZW5kTW9kZSwgSW1hZ2VPcmllbnRh
dGlvbiBvcmllbnRhdGlvbiwgSW50ZXJwb2xhdGlvblF1YWxpdHkgaW1hZ2VJbnRlcnBvbGF0aW9u
UXVhbGl0eSwgZmxvYXQgZ2xvYmFsQWxwaGEsIGNvbnN0IFNoYWRvd1N0YXRlJiBzaGFkb3dTdGF0
ZSkKK3sKKyAgICBhdXRvIGJpdG1hcFNpemUgPSBpbWFnZS0+R2V0U2l6ZSgpOworCisgICAgZmxv
YXQgY3VyckhlaWdodCA9IG9yaWVudGF0aW9uLnVzZXNXaWR0aEFzSGVpZ2h0KCkgPyBiaXRtYXBT
aXplLndpZHRoIDogYml0bWFwU2l6ZS5oZWlnaHQ7CisgICAgaWYgKGN1cnJIZWlnaHQgPD0gc3Jj
UmVjdC55KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3Jt
Q29udGV4dC5yZW5kZXJUYXJnZXQoKTsKKworICAgIEQyRDFfTUFUUklYXzNYMl9GIGN0bTsKKyAg
ICBjb250ZXh0LT5HZXRUcmFuc2Zvcm0oJmN0bSk7CisKKyAgICBBZmZpbmVUcmFuc2Zvcm0gdHJh
bnNmb3JtKGN0bSk7CisKKyAgICBQbGF0Zm9ybUNvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIo
cGxhdGZvcm1Db250ZXh0KTsKKworICAgIGJvb2wgc2hvdWxkVXNlU3ViaW1hZ2UgPSBmYWxzZTsK
KworICAgIC8vIElmIHRoZSBzb3VyY2UgcmVjdCBpcyBhIHN1YnBvcnRpb24gb2YgdGhlIGltYWdl
LCB0aGVuIHdlIGNvbXB1dGUgYW4gaW5mbGF0ZWQgZGVzdGluYXRpb24gcmVjdCB0aGF0IHdpbGwg
aG9sZCB0aGUgZW50aXJlIGltYWdlCisgICAgLy8gYW5kIHRoZW4gc2V0IGEgY2xpcCB0byB0aGUg
cG9ydGlvbiB0aGF0IHdlIHdhbnQgdG8gZGlzcGxheS4KKyAgICBGbG9hdFJlY3QgYWRqdXN0ZWRE
ZXN0UmVjdCA9IGRlc3RSZWN0OworCisgICAgaWYgKHNyY1JlY3Quc2l6ZSgpICE9IGltYWdlU2l6
ZSkgeworICAgICAgICAvLyBGSVhNRTogSW1wbGVtZW50IGltYWdlIHNjYWxpbmcKKyAgICAgICAg
bm90SW1wbGVtZW50ZWQoKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgaW1hZ2UgaXMgb25seSBw
YXJ0aWFsbHkgbG9hZGVkLCB0aGVuIHNocmluayB0aGUgZGVzdGluYXRpb24gcmVjdCB0aGF0IHdl
J3JlIGRyYXdpbmcgaW50byBhY2NvcmRpbmdseS4KKyAgICBpZiAoIXNob3VsZFVzZVN1YmltYWdl
ICYmIGN1cnJIZWlnaHQgPCBpbWFnZVNpemUuaGVpZ2h0KCkpCisgICAgICAgIGFkanVzdGVkRGVz
dFJlY3Quc2V0SGVpZ2h0KGFkanVzdGVkRGVzdFJlY3QuaGVpZ2h0KCkgKiBjdXJySGVpZ2h0IC8g
aW1hZ2VTaXplLmhlaWdodCgpKTsKKworICAgIFN0YXRlOjpzZXRDb21wb3NpdGVPcGVyYXRpb24o
cGxhdGZvcm1Db250ZXh0LCBjb21wb3NpdGVPcGVyYXRvciwgYmxlbmRNb2RlKTsKKworICAgIC8v
IEltYWdlT3JpZW50YXRpb24gZXhwZWN0cyB0aGUgb3JpZ2luIHRvIGJlIGF0ICgwLCAwKS4KKyAg
ICB0cmFuc2Zvcm0udHJhbnNsYXRlKGFkanVzdGVkRGVzdFJlY3QueCgpLCBhZGp1c3RlZERlc3RS
ZWN0LnkoKSk7CisgICAgY29udGV4dC0+U2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7CisgICAgYWRq
dXN0ZWREZXN0UmVjdC5zZXRMb2NhdGlvbihGbG9hdFBvaW50KCkpOworCisgICAgaWYgKG9yaWVu
dGF0aW9uICE9IERlZmF1bHRJbWFnZU9yaWVudGF0aW9uKSB7CisgICAgICAgIGNvbmNhdENUTShw
bGF0Zm9ybUNvbnRleHQsIG9yaWVudGF0aW9uLnRyYW5zZm9ybUZyb21EZWZhdWx0KGFkanVzdGVk
RGVzdFJlY3Quc2l6ZSgpKSk7CisgICAgICAgIGlmIChvcmllbnRhdGlvbi51c2VzV2lkdGhBc0hl
aWdodCgpKSB7CisgICAgICAgICAgICAvLyBUaGUgZGVzdGluYXRpb24gcmVjdCB3aWxsIGhhdmUg
aXQncyB3aWR0aCBhbmQgaGVpZ2h0IGFscmVhZHkgcmV2ZXJzZWQgZm9yIHRoZSBvcmllbnRhdGlv
biBvZgorICAgICAgICAgICAgLy8gdGhlIGltYWdlLCBhcyBpdCB3YXMgbmVlZGVkIGZvciBwYWdl
IGxheW91dCwgc28gd2UgbmVlZCB0byByZXZlcnNlIGl0IGJhY2sgaGVyZS4KKyAgICAgICAgICAg
IGFkanVzdGVkRGVzdFJlY3QgPSBGbG9hdFJlY3QoYWRqdXN0ZWREZXN0UmVjdC54KCksIGFkanVz
dGVkRGVzdFJlY3QueSgpLCBhZGp1c3RlZERlc3RSZWN0LmhlaWdodCgpLCBhZGp1c3RlZERlc3RS
ZWN0LndpZHRoKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgY29udGV4dC0+U2V0VGFncygx
LCBfX0xJTkVfXyk7CisKKyAgICBGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+IGRy
YXdGdW5jdGlvbiA9IFtpbWFnZSwgYWRqdXN0ZWREZXN0UmVjdCwgc3JjUmVjdF0oSUQyRDFSZW5k
ZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdCaXRt
YXAoaW1hZ2UsIGFkanVzdGVkRGVzdFJlY3QsIDEuMGYsIEQyRDFfQklUTUFQX0lOVEVSUE9MQVRJ
T05fTU9ERV9MSU5FQVIsIHN0YXRpY19jYXN0PEQyRDFfUkVDVF9GPihzcmNSZWN0KSk7CisgICAg
fTsKKworICAgIGlmIChzaGFkb3dTdGF0ZS5pc1Zpc2libGUoKSkKKyAgICAgICAgZHJhd1dpdGhT
aGFkb3cocGxhdGZvcm1Db250ZXh0LCBhZGp1c3RlZERlc3RSZWN0LCBzaGFkb3dTdGF0ZSwgZHJh
d0Z1bmN0aW9uKTsKKyAgICBlbHNlCisgICAgICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3Jt
Q29udGV4dCwgYWRqdXN0ZWREZXN0UmVjdCwgZHJhd0Z1bmN0aW9uKTsKKworICAgIGZsdXNoKHBs
YXRmb3JtQ29udGV4dCk7CisKKyAgICBpZiAoIXN0YXRlU2F2ZXIuZGlkU2F2ZSgpKQorICAgICAg
ICBjb250ZXh0LT5TZXRUcmFuc2Zvcm0oY3RtKTsKK30KKwordm9pZCBkcmF3UGF0dGVybihQbGF0
Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBJV0lDQml0bWFwKiB0aWxlSW1h
Z2UsIGNvbnN0IEludFNpemUmIHNpemUsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0
IEZsb2F0UmVjdCYgdGlsZVJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5z
Zm9ybSwgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0
ZU9wZXJhdG9yLCBCbGVuZE1vZGUgYmxlbmRNb2RlKQoreworICAgIGF1dG8gY29udGV4dCA9IHBs
YXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKTsKKyAgICBQbGF0Zm9ybUNvbnRleHRTdGF0ZVNh
dmVyIHN0YXRlU2F2ZXIocGxhdGZvcm1Db250ZXh0KTsKKworICAgIGNsaXAocGxhdGZvcm1Db250
ZXh0LCBkZXN0UmVjdCk7CisKKyAgICBTdGF0ZTo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKHBsYXRm
b3JtQ29udGV4dCwgY29tcG9zaXRlT3BlcmF0b3IsIGJsZW5kTW9kZSk7CisKKyAgICBhdXRvIGJp
dG1hcEJydXNoUHJvcGVydGllcyA9IEQyRDE6OkJpdG1hcEJydXNoUHJvcGVydGllcygpOworICAg
IGJpdG1hcEJydXNoUHJvcGVydGllcy5leHRlbmRNb2RlWCA9IEQyRDFfRVhURU5EX01PREVfV1JB
UDsKKyAgICBiaXRtYXBCcnVzaFByb3BlcnRpZXMuZXh0ZW5kTW9kZVkgPSBEMkQxX0VYVEVORF9N
T0RFX1dSQVA7CisKKyAgICAvLyBDcmVhdGUgYSBicnVzaCB0cmFuc2Zvcm1hdGlvbiBzbyB3ZSBw
YWludCB1c2luZyB0aGUgc2VjdGlvbiBvZiB0aGUgaW1hZ2Ugd2UgY2FyZSBhYm91dC4KKyAgICBB
ZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtYXRpb24gPSBwYXR0ZXJuVHJhbnNmb3JtOworICAgIHRy
YW5zZm9ybWF0aW9uLnRyYW5zbGF0ZShkZXN0UmVjdC5sb2NhdGlvbigpKTsKKworICAgIGF1dG8g
YnJ1c2hQcm9wZXJ0aWVzID0gRDJEMTo6QnJ1c2hQcm9wZXJ0aWVzKCk7CisgICAgYnJ1c2hQcm9w
ZXJ0aWVzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybWF0aW9uOworICAgIGJydXNoUHJvcGVydGllcy5v
cGFjaXR5ID0gMS4wZjsKKworICAgIC8vIElmIHdlIG9ubHkgd2FudCBhIHN1YnNldCBvZiB0aGUg
Yml0bWFwLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIGNyb3BwZWQgYml0bWFwIGltYWdlLiBBY2NvcmRp
bmcgdG8gdGhlIGRvY3VtZW50YXRpb24sCisgICAgLy8gdGhpcyBkb2VzIG5vdCBhbGxvY2F0ZSBu
ZXcgYml0bWFwIG1lbW9yeS4KKyAgICBpZiAoc2l6ZS53aWR0aCgpID4gZGVzdFJlY3Qud2lkdGgo
KSB8fCBzaXplLmhlaWdodCgpID4gZGVzdFJlY3QuaGVpZ2h0KCkpIHsKKyAgICAgICAgQVNTRVJU
KDApOworICAgICAgICAvKgorICAgICAgICBmbG9hdCBkcGlYID0gMDsKKyAgICAgICAgZmxvYXQg
ZHBpWSA9IDA7CisgICAgICAgIHRpbGVJbWFnZS0+R2V0RHBpKCZkcGlYLCAmZHBpWSk7CisgICAg
ICAgIGF1dG8gYml0bWFwUHJvcGVydGllcyA9IEQyRDE6OkJpdG1hcFByb3BlcnRpZXModGlsZUlt
YWdlLT5HZXRQaXhlbEZvcm1hdCgpLCBkcGlYLCBkcGlZKTsKKyAgICAgICAgQ09NUHRyPElEMkQx
Qml0bWFwPiBzdWJJbWFnZTsKKyAgICAgICAgSFJFU1VMVCBociA9IGNvbnRleHQtPkNyZWF0ZUJp
dG1hcChJbnRTaXplKHRpbGVSZWN0LnNpemUoKSksIGJpdG1hcFByb3BlcnRpZXMsICZzdWJJbWFn
ZSk7CisgICAgICAgIGlmIChTVUNDRUVERUQoaHIpKSB7CisgICAgICAgICAgICBEMkQxX1JFQ1Rf
VSBmaW5pc2hSZWN0ID0gSW50UmVjdCh0aWxlUmVjdCk7CisgICAgICAgICAgICBociA9IHN1Yklt
YWdlLT5Db3B5RnJvbUJpdG1hcChudWxscHRyLCB0aWxlSW1hZ2UuZ2V0KCksICZmaW5pc2hSZWN0
KTsKKyAgICAgICAgICAgIGlmIChTVUNDRUVERUQoaHIpKQorICAgICAgICAgICAgICAgIHRpbGVJ
bWFnZSA9IHN1YkltYWdlOworICAgICAgICB9CisgICAgICAgICovCisgICAgfQorCisgICAgQ09N
UHRyPElEMkQxQml0bWFwPiBiaXRtYXA7CisgICAgSFJFU1VMVCBociA9IGNvbnRleHQtPkNyZWF0
ZUJpdG1hcEZyb21XaWNCaXRtYXAodGlsZUltYWdlLCBudWxscHRyLCAmYml0bWFwKTsKKyAgICBp
ZiAoIVNVQ0NFRURFRChocikpCisgICAgICAgIHJldHVybjsKKworICAgIENPTVB0cjxJRDJEMUJp
dG1hcEJydXNoPiBwYXR0ZXJuQnJ1c2g7CisgICAgaHIgPSBjb250ZXh0LT5DcmVhdGVCaXRtYXBC
cnVzaChiaXRtYXAuZ2V0KCksICZiaXRtYXBCcnVzaFByb3BlcnRpZXMsICZicnVzaFByb3BlcnRp
ZXMsICZwYXR0ZXJuQnJ1c2gpOworICAgIEFTU0VSVChTVUNDRUVERUQoaHIpKTsKKyAgICBpZiAo
IVNVQ0NFRURFRChocikpCisgICAgICAgIHJldHVybjsKKworICAgIGRyYXdXaXRob3V0U2hhZG93
KHBsYXRmb3JtQ29udGV4dCwgZGVzdFJlY3QsIFtkZXN0UmVjdCwgcGF0dGVybkJydXNoXShJRDJE
MVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIGNvbnN0IEQyRDFfUkVDVF9G
IGQyZFJlY3QgPSBkZXN0UmVjdDsKKyAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsUmVjdGFuZ2xl
KCZkMmRSZWN0LCBwYXR0ZXJuQnJ1c2guZ2V0KCkpOworICAgIH0pOworfQorCit2b2lkIGRyYXdS
ZWN0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IEZsb2F0
UmVjdCYgcmVjdCwgZmxvYXQgYm9yZGVyVGhpY2tuZXNzLCBjb25zdCBDb2xvciYgZmlsbENvbG9y
LCBTdHJva2VTdHlsZSBzdHJva2VTdHlsZSwgY29uc3QgQ29sb3ImIHN0cm9rZUNvbG9yKQorewor
ICAgIC8vIEZJWE1FOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBwYXR0ZXJucyBhbmQg
Z3JhZGllbnRzIGxpa2UgZHJhd1BhdGggZG9lcywgaXQgcHJvYmFibHkgc2hvdWxkLgorICAgIEFT
U0VSVCghcmVjdC5pc0VtcHR5KCkpOworCisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250
ZXh0LnJlbmRlclRhcmdldCgpOworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7
CisKKyAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIHJlY3QsIFsmcGxhdGZv
cm1Db250ZXh0LCByZWN0LCBmaWxsQ29sb3IsIHN0cm9rZUNvbG9yLCBzdHJva2VTdHlsZV0oSUQy
RDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICBjb25zdCBEMkQxX1JFQ1Rf
RiBkMmRSZWN0ID0gcmVjdDsKKyAgICAgICAgYXV0byBmaWxsQnJ1c2ggPSBwbGF0Zm9ybUNvbnRl
eHQuYnJ1c2hXaXRoQ29sb3IoZmlsbENvbG9yKTsKKyAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxs
UmVjdGFuZ2xlKCZkMmRSZWN0LCBmaWxsQnJ1c2guZ2V0KCkpOworICAgICAgICBpZiAoc3Ryb2tl
U3R5bGUgIT0gTm9TdHJva2UpIHsKKyAgICAgICAgICAgIGF1dG8gc3Ryb2tlQnJ1c2ggPSBwbGF0
Zm9ybUNvbnRleHQuYnJ1c2hXaXRoQ29sb3Ioc3Ryb2tlQ29sb3IpOworICAgICAgICAgICAgcmVu
ZGVyVGFyZ2V0LT5EcmF3UmVjdGFuZ2xlKCZkMmRSZWN0LCBzdHJva2VCcnVzaC5nZXQoKSwgcGxh
dGZvcm1Db250ZXh0LnN0cm9rZVRoaWNrbmVzcygpLCBwbGF0Zm9ybUNvbnRleHQuc3Ryb2tlU3R5
bGUoKSk7CisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBkcmF3TGluZShQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBGbG9hdFBvaW50JiBwb2ludDEs
IGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50MiwgU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUsIGNvbnN0
IENvbG9yJiBzdHJva2VDb2xvciwgZmxvYXQgc3Ryb2tlVGhpY2tuZXNzLCBib29sIHNob3VsZEFu
dGlhbGlhcykKK3sKKyAgICBib29sIGlzVmVydGljYWxMaW5lID0gKHBvaW50MS54KCkgKyBzdHJv
a2VUaGlja25lc3MgPT0gcG9pbnQyLngoKSk7CisgICAgZmxvYXQgc3Ryb2tlV2lkdGggPSBpc1Zl
cnRpY2FsTGluZSA/IHBvaW50Mi55KCkgLSBwb2ludDEueSgpIDogcG9pbnQyLngoKSAtIHBvaW50
MS54KCk7CisgICAgaWYgKCFzdHJva2VUaGlja25lc3MgfHwgIXN0cm9rZVdpZHRoKQorICAgICAg
ICByZXR1cm47CisKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFy
Z2V0KCk7CisKKyAgICBmbG9hdCBjb3JuZXJXaWR0aCA9IDA7CisgICAgYm9vbCBkcmF3c0Rhc2hl
ZExpbmUgPSBzdHJva2VTdHlsZSA9PSBEb3R0ZWRTdHJva2UgfHwgc3Ryb2tlU3R5bGUgPT0gRGFz
aGVkU3Ryb2tlOworCisgICAgQ09NUHRyPElEMkQxU3Ryb2tlU3R5bGU+IGQyZFN0cm9rZVN0eWxl
OworICAgIFBsYXRmb3JtQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihwbGF0Zm9ybUNvbnRl
eHQsIGRyYXdzRGFzaGVkTGluZSk7CisgICAgaWYgKGRyYXdzRGFzaGVkTGluZSkgeworICAgICAg
ICAvLyBGaWd1cmUgb3V0IGVuZCBwb2ludHMgdG8gZW5zdXJlIHdlIGFsd2F5cyBwYWludCBjb3Ju
ZXJzLgorICAgICAgICBjb3JuZXJXaWR0aCA9IGRhc2hlZExpbmVDb3JuZXJXaWR0aEZvclN0cm9r
ZVdpZHRoKHN0cm9rZVdpZHRoLCBzdHJva2VTdHlsZSwgc3Ryb2tlVGhpY2tuZXNzKTsKKyAgICAg
ICAgc3Ryb2tlV2lkdGggLT0gMiAqIGNvcm5lcldpZHRoOworICAgICAgICBmbG9hdCBwYXR0ZXJu
V2lkdGggPSBkYXNoZWRMaW5lUGF0dGVybldpZHRoRm9yU3Ryb2tlV2lkdGgoc3Ryb2tlV2lkdGgs
IHN0cm9rZVN0eWxlLCBzdHJva2VUaGlja25lc3MpOworICAgICAgICAvLyBDaGVjayBpZiBjb3Ju
ZXIgZHJhd2luZyBzdWZmaWNpZW50bHkgY292ZXJzIHRoZSBsaW5lLgorICAgICAgICBpZiAoc3Ry
b2tlV2lkdGggPD0gcGF0dGVybldpZHRoICsgMSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAg
ICAgICBmbG9hdCBwYXR0ZXJuT2Zmc2V0ID0gZGFzaGVkTGluZVBhdHRlcm5PZmZzZXRGb3JQYXR0
ZXJuQW5kU3Ryb2tlV2lkdGgocGF0dGVybldpZHRoLCBzdHJva2VXaWR0aCk7CisgICAgICAgIGNv
bnN0IGZsb2F0IGRhc2hlc1syXSA9IHsgcGF0dGVybldpZHRoLCBwYXR0ZXJuV2lkdGggfTsKKyAg
ICAgICAgYXV0byBzdHJva2VTdHlsZVByb3BlcnRpZXMgPSBwbGF0Zm9ybUNvbnRleHQuc3Ryb2tl
U3R5bGVQcm9wZXJ0aWVzKCk7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dDo6c3lzdGVtRmFjdG9y
eSgpLT5DcmVhdGVTdHJva2VTdHlsZSgmc3Ryb2tlU3R5bGVQcm9wZXJ0aWVzLCBkYXNoZXMsIEFS
UkFZU0laRShkYXNoZXMpLCAmZDJkU3Ryb2tlU3R5bGUpOworCisgICAgICAgIHBsYXRmb3JtQ29u
dGV4dC5zZXRQYXR0ZXJuV2lkdGgocGF0dGVybldpZHRoKTsKKyAgICAgICAgcGxhdGZvcm1Db250
ZXh0LnNldFBhdHRlcm5PZmZzZXQocGF0dGVybk9mZnNldCk7CisgICAgICAgIHBsYXRmb3JtQ29u
dGV4dC5zZXREYXNoZXMoRGFzaEFycmF5KDIsIHBhdHRlcm5XaWR0aCkpOworCisgICAgICAgIGQy
ZFN0cm9rZVN0eWxlID0gcGxhdGZvcm1Db250ZXh0LnN0cm9rZVN0eWxlKCk7CisgICAgfQorCisg
ICAgYXV0byBjZW50ZXJlZFBvaW50cyA9IGNlbnRlckxpbmVBbmRDdXRPZmZDb3JuZXJzKGlzVmVy
dGljYWxMaW5lLCBjb3JuZXJXaWR0aCwgcG9pbnQxLCBwb2ludDIpOworICAgIGF1dG8gcDEgPSBj
ZW50ZXJlZFBvaW50c1swXTsKKyAgICBhdXRvIHAyID0gY2VudGVyZWRQb2ludHNbMV07CisKKyAg
ICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIEZsb2F0UmVjdCBib3VuZGlu
Z1JlY3QocDEsIHAyKTsKKworICAgIGRyYXdXaXRob3V0U2hhZG93KHBsYXRmb3JtQ29udGV4dCwg
Ym91bmRpbmdSZWN0LCBbJnBsYXRmb3JtQ29udGV4dCwgcDEsIHAyLCBkMmRTdHJva2VTdHlsZSwg
c3Ryb2tlQ29sb3IsIHN0cm9rZVRoaWNrbmVzc10oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRh
cmdldCkgeworICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdMaW5lKHAxLCBwMiwgcGxhdGZvcm1D
b250ZXh0LmJydXNoV2l0aENvbG9yKHN0cm9rZUNvbG9yKS5nZXQoKSwgc3Ryb2tlVGhpY2tuZXNz
LCBkMmRTdHJva2VTdHlsZS5nZXQoKSk7CisgICAgfSk7Cit9CisKK3ZvaWQgZHJhd0xpbmVzRm9y
VGV4dChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UG9pbnQmLCBmbG9hdCwg
Y29uc3QgRGFzaEFycmF5JiwgYm9vbCwgYm9vbCwgY29uc3QgQ29sb3ImKQoreworICAgIG5vdElt
cGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgZHJhd0RvdHNGb3JEb2N1bWVudE1hcmtlcihQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYsIERvY3VtZW50TWFya2VyTGluZVN0
eWxlKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgZmlsbEVsbGlwc2UoUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiBy
ZWN0LCBjb25zdCBDb2xvciYgZmlsbENvbG9yLCBTdHJva2VTdHlsZSBzdHJva2VTdHlsZSwgY29u
c3QgQ29sb3ImIHN0cm9rZUNvbG9yLCBmbG9hdCBzdHJva2VUaGlja25lc3MpCit7CisgICAgYXV0
byBlbGxpcHNlID0gRDJEMTo6RWxsaXBzZShyZWN0LmNlbnRlcigpLCAwLjUgKiByZWN0LndpZHRo
KCksIDAuNSAqIHJlY3QuaGVpZ2h0KCkpOworCisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1D
b250ZXh0LnJlbmRlclRhcmdldCgpOworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVf
Xyk7CisKKyAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIHJlY3QsIFsmcGxh
dGZvcm1Db250ZXh0LCBlbGxpcHNlLCBmaWxsQ29sb3IsIHN0cm9rZVN0eWxlLCBzdHJva2VDb2xv
ciwgc3Ryb2tlVGhpY2tuZXNzXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Cisg
ICAgICAgIGF1dG8gZmlsbEJydXNoID0gcGxhdGZvcm1Db250ZXh0LmJydXNoV2l0aENvbG9yKGZp
bGxDb2xvcik7CisgICAgICAgIHJlbmRlclRhcmdldC0+RmlsbEVsbGlwc2UoJmVsbGlwc2UsIGZp
bGxCcnVzaC5nZXQoKSk7CisgICAgICAgIGlmIChzdHJva2VTdHlsZSAhPSBTdHJva2VTdHlsZTo6
Tm9TdHJva2UpIHsKKyAgICAgICAgICAgIGF1dG8gc3Ryb2tlQnJ1c2ggPSBwbGF0Zm9ybUNvbnRl
eHQuYnJ1c2hXaXRoQ29sb3Ioc3Ryb2tlQ29sb3IpOworICAgICAgICAgICAgcmVuZGVyVGFyZ2V0
LT5EcmF3RWxsaXBzZSgmZWxsaXBzZSwgc3Ryb2tlQnJ1c2guZ2V0KCksIHN0cm9rZVRoaWNrbmVz
cywgcGxhdGZvcm1Db250ZXh0LnN0cm9rZVN0eWxlKCkpOworICAgICAgICB9CisgICAgfSk7Cit9
CisKK3ZvaWQgZHJhd0VsbGlwc2UoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3JtQ29u
dGV4dCwgY29uc3QgRmxvYXRSZWN0JiByZWN0LCBTdHJva2VTdHlsZSBzdHJva2VTdHlsZSwgY29u
c3QgQ29sb3ImIHN0cm9rZUNvbG9yLCBmbG9hdCBzdHJva2VUaGlja25lc3MpCit7CisgICAgaWYg
KHN0cm9rZVN0eWxlID09IFN0cm9rZVN0eWxlOjpOb1N0cm9rZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgYXV0byBlbGxpcHNlID0gRDJEMTo6RWxsaXBzZShyZWN0LmNlbnRlcigpLCAwLjUgKiBy
ZWN0LndpZHRoKCksIDAuNSAqIHJlY3QuaGVpZ2h0KCkpOworCisgICAgYXV0byBjb250ZXh0ID0g
cGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpOworCisgICAgY29udGV4dC0+U2V0VGFncygx
LCBfX0xJTkVfXyk7CisKKyAgICBkcmF3V2l0aG91dFNoYWRvdyhwbGF0Zm9ybUNvbnRleHQsIHJl
Y3QsIFsmcGxhdGZvcm1Db250ZXh0LCBlbGxpcHNlLCBzdHJva2VDb2xvciwgc3Ryb2tlVGhpY2tu
ZXNzXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIGF1dG8gc3Ry
b2tlQnJ1c2ggPSBwbGF0Zm9ybUNvbnRleHQuYnJ1c2hXaXRoQ29sb3Ioc3Ryb2tlQ29sb3IpOwor
ICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdFbGxpcHNlKCZlbGxpcHNlLCBzdHJva2VCcnVzaC5n
ZXQoKSwgc3Ryb2tlVGhpY2tuZXNzLCBwbGF0Zm9ybUNvbnRleHQuc3Ryb2tlU3R5bGUoKSk7Cisg
ICAgfSk7Cit9CisKK3ZvaWQgZHJhd0ZvY3VzUmluZyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYs
IGNvbnN0IFBhdGgmLCBmbG9hdCwgY29uc3QgQ29sb3ImKQoreworICAgIG5vdEltcGxlbWVudGVk
KCk7Cit9CisKK3ZvaWQgZHJhd0ZvY3VzUmluZyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNv
bnN0IFZlY3RvcjxGbG9hdFJlY3Q+JiwgZmxvYXQsIGNvbnN0IENvbG9yJikKK3sKKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworfQorCit2b2lkIGZsdXNoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBw
bGF0Zm9ybUNvbnRleHQpCit7CisgICAgQVNTRVJUKHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJn
ZXQoKSk7CisgICAgRDJEMV9UQUcgZmlyc3QsIHNlY29uZDsKKyAgICBIUkVTVUxUIGhyID0gcGxh
dGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5GbHVzaCgmZmlyc3QsICZzZWNvbmQpOworCisg
ICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Cit9CisKK3ZvaWQgc2F2ZShQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0KQoreworICAgIHBsYXRmb3JtQ29udGV4
dC5zYXZlKCk7CisKKyAgICBpZiAoYXV0byogZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSA9IHBsYXRm
b3JtQ29udGV4dC5ncmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisgICAgICAgIGdyYXBoaWNzQ29u
dGV4dFByaXZhdGUtPnNhdmUoKTsKK30KKwordm9pZCByZXN0b3JlKFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQpCit7CisgICAgcGxhdGZvcm1Db250ZXh0LnJlc3RvcmUo
KTsKKworICAgIGlmIChhdXRvKiBncmFwaGljc0NvbnRleHRQcml2YXRlID0gcGxhdGZvcm1Db250
ZXh0LmdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0UHJp
dmF0ZS0+cmVzdG9yZSgpOworfQorCit2b2lkIHRyYW5zbGF0ZShQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRCYgcGxhdGZvcm1Db250ZXh0LCBmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIEFTU0VSVChw
bGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCkpOworCisgICAgRDJEMV9NQVRSSVhfM1gyX0Yg
Y3VycmVudFRyYW5zZm9ybTsKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkdl
dFRyYW5zZm9ybSgmY3VycmVudFRyYW5zZm9ybSk7CisKKyAgICBhdXRvIHRyYW5zbGF0aW9uID0g
RDJEMTo6TWF0cml4M3gyRjo6VHJhbnNsYXRpb24oeCwgeSk7CisgICAgcGxhdGZvcm1Db250ZXh0
LnJlbmRlclRhcmdldCgpLT5TZXRUcmFuc2Zvcm0odHJhbnNsYXRpb24gKiBjdXJyZW50VHJhbnNm
b3JtKTsKKworICAgIGlmIChhdXRvKiBncmFwaGljc0NvbnRleHRQcml2YXRlID0gcGxhdGZvcm1D
b250ZXh0LmdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0
UHJpdmF0ZS0+dHJhbnNsYXRlKHgsIHkpOworfQorCit2b2lkIHJvdGF0ZShQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBmbG9hdCBhbmdsZUluUmFkaWFucykKK3sKKyAg
ICBBU1NFUlQocGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpKTsKKworICAgIEQyRDFfTUFU
UklYXzNYMl9GIGN1cnJlbnRUcmFuc2Zvcm07CisgICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRh
cmdldCgpLT5HZXRUcmFuc2Zvcm0oJmN1cnJlbnRUcmFuc2Zvcm0pOworCisgICAgYXV0byByb3Rh
dGlvbiA9IEQyRDE6Ok1hdHJpeDN4MkY6OlJvdGF0aW9uKHJhZDJkZWcoYW5nbGVJblJhZGlhbnMp
KTsKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPlNldFRyYW5zZm9ybShyb3Rh
dGlvbiAqIGN1cnJlbnRUcmFuc2Zvcm0pOworCisgICAgaWYgKGF1dG8qIGdyYXBoaWNzQ29udGV4
dFByaXZhdGUgPSBwbGF0Zm9ybUNvbnRleHQuZ3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAg
ICAgICBncmFwaGljc0NvbnRleHRQcml2YXRlLT5yb3RhdGUoYW5nbGVJblJhZGlhbnMpOworfQor
Cit2b2lkIHNjYWxlKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIGNv
bnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBBU1NFUlQocGxhdGZvcm1Db250ZXh0LnJlbmRl
clRhcmdldCgpKTsKKworICAgIEQyRDFfTUFUUklYXzNYMl9GIGN1cnJlbnRUcmFuc2Zvcm07Cisg
ICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5HZXRUcmFuc2Zvcm0oJmN1cnJlbnRU
cmFuc2Zvcm0pOworCisgICAgYXV0byBzY2FsZSA9IEQyRDE6Ok1hdHJpeDN4MkY6OlNjYWxlKHNp
emUpOworICAgIHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKS0+U2V0VHJhbnNmb3JtKHNj
YWxlICogY3VycmVudFRyYW5zZm9ybSk7CisKKyAgICBpZiAoYXV0byogZ3JhcGhpY3NDb250ZXh0
UHJpdmF0ZSA9IHBsYXRmb3JtQ29udGV4dC5ncmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisgICAg
ICAgIGdyYXBoaWNzQ29udGV4dFByaXZhdGUtPnNjYWxlKHNpemUpOworfQorCit2b2lkIGNvbmNh
dENUTShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBjb25zdCBBZmZp
bmVUcmFuc2Zvcm0mIGFmZmluZVRyYW5zZm9ybSkKK3sKKyAgICBBU1NFUlQocGxhdGZvcm1Db250
ZXh0LnJlbmRlclRhcmdldCgpKTsKKworICAgIEQyRDFfTUFUUklYXzNYMl9GIGN1cnJlbnRUcmFu
c2Zvcm07CisgICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5HZXRUcmFuc2Zvcm0o
JmN1cnJlbnRUcmFuc2Zvcm0pOworCisgICAgRDJEMV9NQVRSSVhfM1gyX0YgdHJhbnNmb3JtVG9D
b25jYXQgPSBhZmZpbmVUcmFuc2Zvcm07CisgICAgcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdl
dCgpLT5TZXRUcmFuc2Zvcm0odHJhbnNmb3JtVG9Db25jYXQgKiBjdXJyZW50VHJhbnNmb3JtKTsK
KworICAgIGlmIChhdXRvKiBncmFwaGljc0NvbnRleHRQcml2YXRlID0gcGxhdGZvcm1Db250ZXh0
LmdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0UHJpdmF0
ZS0+Y29uY2F0Q1RNKGFmZmluZVRyYW5zZm9ybSk7Cit9CisKK3ZvaWQgYmVnaW5UcmFuc3BhcmVu
Y3lMYXllcihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0LCBmbG9hdCBv
cGFjaXR5KQoreworICAgIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpUcmFuc3BhcmVuY3lMYXll
clN0YXRlIHRyYW5zcGFyZW5jeUxheWVyOworICAgIHRyYW5zcGFyZW5jeUxheWVyLm9wYWNpdHkg
PSBvcGFjaXR5OworCisgICAgSFJFU1VMVCBociA9IHBsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJn
ZXQoKS0+Q3JlYXRlQ29tcGF0aWJsZVJlbmRlclRhcmdldCgmdHJhbnNwYXJlbmN5TGF5ZXIucmVu
ZGVyVGFyZ2V0KTsKKyAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKyAgICBwbGF0
Zm9ybUNvbnRleHQubV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmFwcGVuZChXVEZNb3ZlKHRyYW5z
cGFyZW5jeUxheWVyKSk7CisKKyAgICBwbGF0Zm9ybUNvbnRleHQubV90cmFuc3BhcmVuY3lMYXll
clN0YWNrLmxhc3QoKS5yZW5kZXJUYXJnZXQtPkJlZ2luRHJhdygpOworICAgIHBsYXRmb3JtQ29u
dGV4dC5tX3RyYW5zcGFyZW5jeUxheWVyU3RhY2subGFzdCgpLnJlbmRlclRhcmdldC0+Q2xlYXIo
RDJEMTo6Q29sb3JGKDAsIDAsIDAsIDApKTsKK30KKwordm9pZCBlbmRUcmFuc3BhcmVuY3lMYXll
cihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0KQoreworICAgIGF1dG8g
Y3VycmVudExheWVyID0gcGxhdGZvcm1Db250ZXh0Lm1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay50
YWtlTGFzdCgpOworICAgIGF1dG8gcmVuZGVyVGFyZ2V0ID0gY3VycmVudExheWVyLnJlbmRlclRh
cmdldDsKKyAgICBpZiAoIXJlbmRlclRhcmdldCkKKyAgICAgICAgcmV0dXJuOworCisgICAgSFJF
U1VMVCBociA9IHJlbmRlclRhcmdldC0+RW5kRHJhdygpOworICAgIFJFTEVBU0VfQVNTRVJUKFNV
Q0NFRURFRChocikpOworCisgICAgQ09NUHRyPElEMkQxQml0bWFwPiBiaXRtYXA7CisgICAgaHIg
PSByZW5kZXJUYXJnZXQtPkdldEJpdG1hcCgmYml0bWFwKTsKKyAgICBSRUxFQVNFX0FTU0VSVChT
VUNDRUVERUQoaHIpKTsKKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dC5yZW5k
ZXJUYXJnZXQoKTsKKworICAgIGlmIChjdXJyZW50TGF5ZXIuaGFzU2hhZG93KQorICAgICAgICBk
cmF3V2l0aFNoYWRvd0hlbHBlcihjb250ZXh0LCBiaXRtYXAuZ2V0KCksIGN1cnJlbnRMYXllci5z
aGFkb3dDb2xvciwgY3VycmVudExheWVyLnNoYWRvd09mZnNldCwgY3VycmVudExheWVyLnNoYWRv
d0JsdXIpOworICAgIGVsc2UgeworICAgICAgICBDT01QdHI8SUQyRDFCaXRtYXBCcnVzaD4gYml0
bWFwQnJ1c2g7CisgICAgICAgIGF1dG8gYml0bWFwQnJ1c2hQcm9wZXJ0aWVzID0gRDJEMTo6Qml0
bWFwQnJ1c2hQcm9wZXJ0aWVzKCk7CisgICAgICAgIGF1dG8gYnJ1c2hQcm9wZXJ0aWVzID0gRDJE
MTo6QnJ1c2hQcm9wZXJ0aWVzKCk7CisgICAgICAgIEhSRVNVTFQgaHIgPSBjb250ZXh0LT5DcmVh
dGVCaXRtYXBCcnVzaChiaXRtYXAuZ2V0KCksIGJpdG1hcEJydXNoUHJvcGVydGllcywgYnJ1c2hQ
cm9wZXJ0aWVzLCAmYml0bWFwQnJ1c2gpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVE
RUQoaHIpKTsKKworICAgICAgICBhdXRvIHNpemUgPSBiaXRtYXAtPkdldFNpemUoKTsKKyAgICAg
ICAgYXV0byByZWN0SW5ESVAgPSBEMkQxOjpSZWN0RigwLCAwLCBzaXplLndpZHRoLCBzaXplLmhl
aWdodCk7CisgICAgICAgIGNvbnRleHQtPkZpbGxSZWN0YW5nbGUocmVjdEluRElQLCBiaXRtYXBC
cnVzaC5nZXQoKSk7CisgICAgfQorfQorCit2b2lkIGNsaXAoUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIGlmIChw
bGF0Zm9ybUNvbnRleHQubV9yZW5kZXJTdGF0ZXMuaXNFbXB0eSgpKQorICAgICAgICBzYXZlKHBs
YXRmb3JtQ29udGV4dCk7CisKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPlB1
c2hBeGlzQWxpZ25lZENsaXAocmVjdCwgRDJEMV9BTlRJQUxJQVNfTU9ERV9QRVJfUFJJTUlUSVZF
KTsKKyAgICBwbGF0Zm9ybUNvbnRleHQubV9yZW5kZXJTdGF0ZXMubGFzdCgpLm1fY2xpcHMuYXBw
ZW5kKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpBeGlzQWxpZ25lZENsaXApOworCisgICAgaWYg
KGF1dG8qIGdyYXBoaWNzQ29udGV4dFByaXZhdGUgPSBwbGF0Zm9ybUNvbnRleHQuZ3JhcGhpY3ND
b250ZXh0UHJpdmF0ZSgpKQorICAgICAgICBncmFwaGljc0NvbnRleHRQcml2YXRlLT5jbGlwKHJl
Y3QpOworfQorCit2b2lkIGNsaXBPdXQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3Jt
Q29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIFBhdGggcGF0aDsKKyAgICBw
YXRoLmFkZFJlY3QocmVjdCk7CisKKyAgICBjbGlwT3V0KHBsYXRmb3JtQ29udGV4dCwgcGF0aCk7
Cit9CisKK3ZvaWQgY2xpcE91dChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250
ZXh0LCBjb25zdCBQYXRoJiBwYXRoKQoreworICAgIC8vIFRvIGNsaXAgT3V0IHdlIG5lZWQgdGhl
IGludGVyc2VjdGlvbiBvZiB0aGUgaW5maW5pdGUKKyAgICAvLyBjbGlwcGluZyByZWN0IGFuZCB0
aGUgcGF0aCB3ZSBqdXN0IGNyZWF0ZWQuCisgICAgRDJEMV9TSVpFX0YgcmVuZGVyZXJTaXplID0g
cGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5HZXRTaXplKCk7CisgICAgRmxvYXRSZWN0
IGNsaXBCb3VuZHMoMCwgMCwgcmVuZGVyZXJTaXplLndpZHRoLCByZW5kZXJlclNpemUuaGVpZ2h0
KTsKKworICAgIFBhdGggYm91bmRpbmdSZWN0OworICAgIGJvdW5kaW5nUmVjdC5hZGRSZWN0KGNs
aXBCb3VuZHMpOworICAgIGJvdW5kaW5nUmVjdC5hcHBlbmRHZW9tZXRyeShwYXRoLnBsYXRmb3Jt
UGF0aCgpKTsKKworICAgIENPTVB0cjxJRDJEMUdlb21ldHJ5R3JvdXA+IHBhdGhUb0NsaXA7Cisg
ICAgYm91bmRpbmdSZWN0LmNyZWF0ZUdlb21ldHJ5V2l0aEZpbGxNb2RlKFdpbmRSdWxlOjpFdmVu
T2RkLCBwYXRoVG9DbGlwKTsKKyAgICBjbGlwUGF0aChwbGF0Zm9ybUNvbnRleHQsIHBhdGhUb0Ns
aXAuZ2V0KCkpOworfQorCit2b2lkIGNsaXBQYXRoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBw
bGF0Zm9ybUNvbnRleHQsIGNvbnN0IFBhdGgmIHBhdGgsIFdpbmRSdWxlIGNsaXBSdWxlKQorewor
ICAgIGlmIChwYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBEaXJlY3QyRDo6Y2xpcChwbGF0Zm9y
bUNvbnRleHQsIEZsb2F0UmVjdCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENP
TVB0cjxJRDJEMUdlb21ldHJ5R3JvdXA+IHBhdGhUb0NsaXA7CisgICAgcGF0aC5jcmVhdGVHZW9t
ZXRyeVdpdGhGaWxsTW9kZShjbGlwUnVsZSwgcGF0aFRvQ2xpcCk7CisKKyAgICBjbGlwUGF0aChw
bGF0Zm9ybUNvbnRleHQsIHBhdGhUb0NsaXAuZ2V0KCkpOworCisgICAgaWYgKGF1dG8qIGdyYXBo
aWNzQ29udGV4dFByaXZhdGUgPSBwbGF0Zm9ybUNvbnRleHQuZ3JhcGhpY3NDb250ZXh0UHJpdmF0
ZSgpKQorICAgICAgICBncmFwaGljc0NvbnRleHRQcml2YXRlLT5jbGlwKHBhdGgpOworfQorCit2
b2lkIGNsaXBQYXRoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIElE
MkQxR2VvbWV0cnkqIHBhdGgpCit7CisgICAgQVNTRVJUKHBsYXRmb3JtQ29udGV4dC5oYXNTYXZl
ZFN0YXRlKCkpOworICAgIGlmICghcGxhdGZvcm1Db250ZXh0Lmhhc1NhdmVkU3RhdGUoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgQ09NUHRyPElEMkQxTGF5ZXI+IGNsaXBMYXllcjsKKyAgICBI
UkVTVUxUIGhyID0gcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpLT5DcmVhdGVMYXllcigm
Y2xpcExheWVyKTsKKyAgICBBU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisgICAgaWYgKCFTVUNDRUVE
RUQoaHIpKQorICAgICAgICByZXR1cm47CisKKyAgICBwbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFy
Z2V0KCktPlB1c2hMYXllcihEMkQxOjpMYXllclBhcmFtZXRlcnMoRDJEMTo6SW5maW5pdGVSZWN0
KCksIHBhdGgpLCBjbGlwTGF5ZXIuZ2V0KCkpOworICAgIHBsYXRmb3JtQ29udGV4dC5wdXNoUmVu
ZGVyQ2xpcChQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6TGF5ZXJDbGlwKTsKKyAgICBwbGF0Zm9y
bUNvbnRleHQuc2V0QWN0aXZlTGF5ZXIoV1RGTW92ZShjbGlwTGF5ZXIpKTsKK30KKwordm9pZCBj
bGlwVG9JbWFnZUJ1ZmZlcihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIElEMkQxUmVuZGVyVGFy
Z2V0KiwgY29uc3QgRmxvYXRSZWN0JikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9
IC8vIG5hbWVzcGFjZSBEaXJlY3QyRAorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gVVNFKERJUkVDVDJEKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0RpcmVjdDJET3BlcmF0aW9ucy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9EaXJlY3QyRE9wZXJhdGlvbnMuaAkobm9uZXhpc3RlbnQpCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0MkRPcGVyYXRpb25z
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYtMjAxOSBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIw
MDgsIDIwMDkgRGlyayBTY2h1bHplIDxrcml0QHdlYmtpdC5vcmc+CisgKiBDb3B5cmlnaHQgKEMp
IDIwMDggTnVhbnRpIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBCcmVudCBGdWxnaGFtIDxi
ZnVsZ2hhbUB3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExIElnYWxpYSBT
LkwuCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIsIEludGVsIENvcnBvcmF0
aW9uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEg
b25jZQorCisjaWYgVVNFKERJUkVDVDJEKQorCisjaW5jbHVkZSAiRGFzaEFycmF5LmgiCisjaW5j
bHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NUeXBlcy5oIgorI2lu
Y2x1ZGUgPGQyZDEuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBZmZpbmVUcmFu
c2Zvcm07CitjbGFzcyBDb2xvcjsKK2NsYXNzIEZsb2F0UmVjdDsKK2NsYXNzIEZsb2F0Um91bmRl
ZFJlY3Q7CitjbGFzcyBGbG9hdFNpemU7CitjbGFzcyBQYXRoOworY2xhc3MgUGxhdGZvcm1Db250
ZXh0Q2Fpcm87CisKK3N0cnVjdCBHcmFwaGljc0NvbnRleHRTdGF0ZTsKKworbmFtZXNwYWNlIERp
cmVjdDJEIHsKKworbmFtZXNwYWNlIFN0YXRlIHsKKwordm9pZCBzZXRTdHJva2VUaGlja25lc3Mo
UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBmbG9hdCk7Cit2b2lkIHNldFN0cm9rZVN0eWxlKFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEJiwgU3Ryb2tlU3R5bGUpOworCit2b2lkIHNldENvbXBvc2l0
ZU9wZXJhdGlvbihQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIENvbXBvc2l0ZU9wZXJhdG9yLCBC
bGVuZE1vZGUpOwordm9pZCBzZXRTaG91bGRBbnRpYWxpYXMoUGxhdGZvcm1Db250ZXh0RGlyZWN0
MkQmLCBib29sKTsKKwordm9pZCBzZXRDVE0oUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25z
dCBBZmZpbmVUcmFuc2Zvcm0mKTsKK0FmZmluZVRyYW5zZm9ybSBnZXRDVE0oUGxhdGZvcm1Db250
ZXh0RGlyZWN0MkQmKTsKKworSW50UmVjdCBnZXRDbGlwQm91bmRzKFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJik7CitGbG9hdFJlY3Qgcm91bmRUb0RldmljZVBpeGVscyhQbGF0Zm9ybUNvbnRleHRE
aXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYpOworCitib29sIGlzQWNjZWxlcmF0ZWRDb250ZXh0
KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJik7CisKK30gLy8gbmFtZXNwYWNlIFN0YXRlCisKK3N0
cnVjdCBGaWxsU291cmNlIHsKKyAgICBGaWxsU291cmNlKCkgPSBkZWZhdWx0OworICAgIGV4cGxp
Y2l0IEZpbGxTb3VyY2UoY29uc3QgR3JhcGhpY3NDb250ZXh0U3RhdGUmLCBQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYpOworCisgICAgZmxvYXQgZ2xvYmFsQWxwaGEgeyAwIH07CisgICAgQ09NUHRy
PElEMkQxQnJ1c2g+IGJydXNoOworICAgIENvbG9yIGNvbG9yOworCisgICAgV2luZFJ1bGUgZmls
bFJ1bGUgeyBXaW5kUnVsZTo6Tm9uWmVybyB9OworfTsKKworc3RydWN0IFN0cm9rZVNvdXJjZSB7
CisgICAgU3Ryb2tlU291cmNlKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IFN0cm9rZVNvdXJj
ZShjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYsIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJik7
CisKKyAgICBmbG9hdCBnbG9iYWxBbHBoYSB7IDAgfTsKKyAgICBmbG9hdCB0aGlja25lc3MgeyAw
IH07CisgICAgQ09NUHRyPElEMkQxQnJ1c2g+IGJydXNoOworICAgIENvbG9yIGNvbG9yOworfTsK
Kworc3RydWN0IFNoYWRvd1N0YXRlIHsKKyAgICBTaGFkb3dTdGF0ZSgpID0gZGVmYXVsdDsKKyAg
ICBXRUJDT1JFX0VYUE9SVCBleHBsaWNpdCBTaGFkb3dTdGF0ZShjb25zdCBHcmFwaGljc0NvbnRl
eHRTdGF0ZSYpOworCisgICAgYm9vbCBpc1Zpc2libGUoKSBjb25zdDsKKyAgICBib29sIGlzUmVx
dWlyZWQoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmKSBjb25zdDsKKworICAgIEZsb2F0U2l6ZSBv
ZmZzZXQ7CisgICAgZmxvYXQgYmx1ciB7IDAgfTsKKyAgICBDb2xvciBjb2xvcjsKKyAgICBib29s
IGlnbm9yZVRyYW5zZm9ybXMgeyBmYWxzZSB9OworCisgICAgZmxvYXQgZ2xvYmFsQWxwaGEgeyAx
LjAgfTsKKyAgICBDb21wb3NpdGVPcGVyYXRvciBnbG9iYWxDb21wb3NpdGVPcGVyYXRvciB7IENv
bXBvc2l0ZVNvdXJjZU92ZXIgfTsKK307CisKK3ZvaWQgc2V0TGluZUNhcChQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYsIExpbmVDYXApOwordm9pZCBzZXRMaW5lRGFzaChQbGF0Zm9ybUNvbnRleHRE
aXJlY3QyRCYsIGNvbnN0IERhc2hBcnJheSYsIGZsb2F0KTsKK3ZvaWQgc2V0TGluZUpvaW4oUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmLCBMaW5lSm9pbik7Cit2b2lkIHNldE1pdGVyTGltaXQoUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmLCBmbG9hdCk7CisKK3ZvaWQgZmlsbFJlY3QoUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGaWxsU291cmNlJiwgY29u
c3QgU2hhZG93U3RhdGUmKTsKK3ZvaWQgZmlsbFJlY3QoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQm
LCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBDb2xvciYsIGNvbnN0IFNoYWRvd1N0YXRlJik7Cit2
b2lkIGZpbGxSZWN0V2l0aEdyYWRpZW50KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3Qg
RmxvYXRSZWN0JiwgSUQyRDFCcnVzaCopOwordm9pZCBmaWxsUm91bmRlZFJlY3QoUGxhdGZvcm1D
b250ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiwgY29uc3QgQ29sb3ImLCBj
b25zdCBTaGFkb3dTdGF0ZSYpOwordm9pZCBmaWxsUmVjdFdpdGhSb3VuZGVkSG9sZShQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZsb2F0Um91bmRlZFJl
Y3QmLCBjb25zdCBGaWxsU291cmNlJiwgY29uc3QgU2hhZG93U3RhdGUmKTsKK3ZvaWQgZmlsbFBh
dGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBQYXRoJiwgY29uc3QgRmlsbFNvdXJj
ZSYsIGNvbnN0IFNoYWRvd1N0YXRlJik7Cit2b2lkIGZpbGxQYXRoKFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJiwgY29uc3QgUGF0aCYsIGNvbnN0IENvbG9yJiwgY29uc3QgU2hhZG93U3RhdGUmKTsK
Kwordm9pZCBzdHJva2VSZWN0KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRS
ZWN0JiwgZmxvYXQsIGNvbnN0IFN0cm9rZVNvdXJjZSYsIGNvbnN0IFNoYWRvd1N0YXRlJik7Cit2
b2lkIHN0cm9rZVBhdGgoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBQYXRoJiwgY29u
c3QgU3Ryb2tlU291cmNlJiwgY29uc3QgU2hhZG93U3RhdGUmKTsKK3ZvaWQgY2xlYXJSZWN0KFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0Jik7CisKKy8vIEZJWE1FKElN
UExFTUVOVCk6IHZvaWQgZHJhd0dseXBocyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0
IEZpbGxTb3VyY2UmLCBjb25zdCBTdHJva2VTb3VyY2UmLCBjb25zdCBTaGFkb3dTdGF0ZSYsIGNv
bnN0IEZsb2F0UG9pbnQmLCBEaXJlY3RXcml0ZVNjYWxlZEZvbnQqLCBkb3VibGUsIGNvbnN0IFZl
Y3RvcjxEaXJlY3RXcml0ZUdseXBoVHlwZT4mLCBmbG9hdCwgVGV4dERyYXdpbmdNb2RlRmxhZ3Ms
IGZsb2F0LCBjb25zdCBGbG9hdFNpemUmLCBjb25zdCBDb2xvciYpOworCit2b2lkIGRyYXdOYXRp
dmVJbWFnZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIElXSUNCaXRtYXAqLCBjb25zdCBGbG9h
dFNpemUmIGltYWdlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRSZWN0JiwgQ29t
cG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSwgSW1hZ2VPcmllbnRhdGlvbiwgSW50ZXJwb2xhdGlv
blF1YWxpdHksIGZsb2F0LCBjb25zdCBTaGFkb3dTdGF0ZSYpOwordm9pZCBkcmF3TmF0aXZlSW1h
Z2UoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBJRDJEMUJpdG1hcCosIGNvbnN0IEZsb2F0U2l6
ZSYgaW1hZ2VTaXplLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFJlY3QmLCBDb21wb3Np
dGVPcGVyYXRvciwgQmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0aW9uLCBJbnRlcnBvbGF0aW9uUXVh
bGl0eSwgZmxvYXQsIGNvbnN0IFNoYWRvd1N0YXRlJik7Cit2b2lkIGRyYXdQYXRoKFBsYXRmb3Jt
Q29udGV4dERpcmVjdDJEJiwgY29uc3QgUGF0aCYsIGNvbnN0IFN0cm9rZVNvdXJjZSYsIGNvbnN0
IFNoYWRvd1N0YXRlJik7Cit2b2lkIGRyYXdQYXR0ZXJuKFBsYXRmb3JtQ29udGV4dERpcmVjdDJE
JiwgSVdJQ0JpdG1hcCosIGNvbnN0IEludFNpemUmLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBG
bG9hdFJlY3QmLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mLCBjb25zdCBGbG9hdFBvaW50JiwgQ29t
cG9zaXRlT3BlcmF0b3IsIEJsZW5kTW9kZSk7CisKK3ZvaWQgZHJhd1dpdGhvdXRTaGFkb3coUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJlY3QmIGJvdW5kaW5nUmVjdCwgY29u
c3QgV1RGOjpGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+JiBkcmF3Q29tbWFuZHMp
Owordm9pZCBkcmF3V2l0aFNoYWRvdyhQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNvbnN0IEZs
b2F0UmVjdCYgYm91bmRpbmdSZWN0LCBjb25zdCBTaGFkb3dTdGF0ZSYsIGNvbnN0IFdURjo6RnVu
Y3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiYgZHJhd0NvbW1hbmRzKTsKK3ZvaWQgZHJh
d1dpdGhTaGFkb3dIZWxwZXIoSUQyRDFSZW5kZXJUYXJnZXQqIGNvbnRleHQsIElEMkQxQml0bWFw
KiwgY29uc3QgQ29sb3ImIHNoYWRvd0NvbG9yLCBjb25zdCBGbG9hdFNpemUmIHNoYWRvd09mZnNl
dCwgZmxvYXQgc2hhZG93Qmx1cik7CisKK3ZvaWQgZHJhd1JlY3QoUGxhdGZvcm1Db250ZXh0RGly
ZWN0MkQmLCBjb25zdCBGbG9hdFJlY3QmLCBmbG9hdCwgY29uc3QgQ29sb3ImLCBTdHJva2VTdHls
ZSwgY29uc3QgQ29sb3ImKTsKK3ZvaWQgZHJhd0xpbmUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQm
LCBjb25zdCBGbG9hdFBvaW50JiwgY29uc3QgRmxvYXRQb2ludCYsIFN0cm9rZVN0eWxlLCBjb25z
dCBDb2xvciYsIGZsb2F0LCBib29sKTsKK3ZvaWQgZHJhd0xpbmVzRm9yVGV4dChQbGF0Zm9ybUNv
bnRleHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UG9pbnQmLCBmbG9hdCB0aGlja25lc3MsIGNvbnN0
IERhc2hBcnJheSYsIGJvb2wsIGJvb2wsIGNvbnN0IENvbG9yJik7Cit2b2lkIGRyYXdEb3RzRm9y
RG9jdW1lbnRNYXJrZXIoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBGbG9hdFJlY3Qm
LCBEb2N1bWVudE1hcmtlckxpbmVTdHlsZSk7Cit2b2lkIGRyYXdFbGxpcHNlKFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0JiwgU3Ryb2tlU3R5bGUsIGNvbnN0IENvbG9y
JiwgZmxvYXQpOwordm9pZCBmaWxsRWxsaXBzZShQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYsIGNv
bnN0IEZsb2F0UmVjdCYsIGNvbnN0IENvbG9yJiwgU3Ryb2tlU3R5bGUsIGNvbnN0IENvbG9yJiwg
ZmxvYXQpOworCit2b2lkIGRyYXdGb2N1c1JpbmcoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBj
b25zdCBQYXRoJiwgZmxvYXQsIGNvbnN0IENvbG9yJik7Cit2b2lkIGRyYXdGb2N1c1JpbmcoUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBWZWN0b3I8RmxvYXRSZWN0PiYsIGZsb2F0LCBj
b25zdCBDb2xvciYpOworCit2b2lkIGZsdXNoKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJik7Cit2
b2lkIHNhdmUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmKTsKK3ZvaWQgcmVzdG9yZShQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRCYpOworCit2b2lkIHRyYW5zbGF0ZShQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRCYsIGZsb2F0LCBmbG9hdCk7Cit2b2lkIHJvdGF0ZShQbGF0Zm9ybUNvbnRleHREaXJlY3Qy
RCYsIGZsb2F0KTsKK3ZvaWQgc2NhbGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBjb25zdCBG
bG9hdFNpemUmKTsKK3ZvaWQgY29uY2F0Q1RNKFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJiwgY29u
c3QgQWZmaW5lVHJhbnNmb3JtJik7CisKK3ZvaWQgYmVnaW5UcmFuc3BhcmVuY3lMYXllcihQbGF0
Zm9ybUNvbnRleHREaXJlY3QyRCYsIGZsb2F0KTsKK3ZvaWQgZW5kVHJhbnNwYXJlbmN5TGF5ZXIo
UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmKTsKKwordm9pZCBjbGlwKFBsYXRmb3JtQ29udGV4dERp
cmVjdDJEJiwgY29uc3QgRmxvYXRSZWN0Jik7CisKK3ZvaWQgY2xpcE91dChQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYsIGNvbnN0IEZsb2F0UmVjdCYpOwordm9pZCBjbGlwT3V0KFBsYXRmb3JtQ29u
dGV4dERpcmVjdDJEJiwgY29uc3QgUGF0aCYpOwordm9pZCBjbGlwUGF0aChQbGF0Zm9ybUNvbnRl
eHREaXJlY3QyRCYsIGNvbnN0IFBhdGgmLCBXaW5kUnVsZSk7Cit2b2lkIGNsaXBQYXRoKFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJiwgSUQyRDFHZW9tZXRyeSogcGF0aCk7CisKK3ZvaWQgY2xpcFRv
SW1hZ2VCdWZmZXIoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBJRDJEMVJlbmRlclRhcmdldCos
IGNvbnN0IEZsb2F0UmVjdCYpOworCit9IC8vIG5hbWVzcGFjZSBEaXJlY3QyRAorfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKERJUkVDVDJEKQpJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0RpcmVjdDJEVXRpbGl0aWVzLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRGlyZWN0MkRVdGls
aXRpZXMuY3BwCShub25leGlzdGVudCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9EaXJlY3QyRFV0aWxpdGllcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqIENvcHlyaWdo
dCAoQykgMjAxMSBQcm9GVVNJT04gZW1iZWRkZWQgc3lzdGVtcworICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
RGlyZWN0MkRVdGlsaXRpZXMuaCIKKworI2lmIFVTRShESVJFQ1QyRCkKKworI2luY2x1ZGUgIkNP
TVB0ci5oIgorI2luY2x1ZGUgIkZsb2F0UG9pbnQuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlICJJbWFnZURlY29kZXJEaXJlY3QyRC5oIgorI2luY2x1ZGUgIkludFJl
Y3QuaCIKKyNpbmNsdWRlICJJbnRTaXplLmgiCisjaW5jbHVkZSA8ZDJkMS5oPgorI2luY2x1ZGUg
PHdpbmNvZGVjLmg+CisKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCituYW1lc3BhY2UgRGlyZWN0
MkQgeworCitJbnRTaXplIGJpdG1hcFNpemUoSVdJQ0JpdG1hcFNvdXJjZSogYml0bWFwU291cmNl
KQoreworICAgIFVJTlQgd2lkdGgsIGhlaWdodDsKKyAgICBIUkVTVUxUIGhyID0gYml0bWFwU291
cmNlLT5HZXRTaXplKCZ3aWR0aCwgJmhlaWdodCk7CisgICAgaWYgKCFTVUNDRUVERUQoaHIpKQor
ICAgICAgICByZXR1cm4geyB9OworCisgICAgcmV0dXJuIEludFNpemUod2lkdGgsIGhlaWdodCk7
Cit9CisKK0Zsb2F0UG9pbnQgYml0bWFwUmVzb2x1dGlvbihJV0lDQml0bWFwU291cmNlKiBiaXRt
YXBTb3VyY2UpCit7CisgICAgY29uc3RleHByIGRvdWJsZSBkcGlCYXNlID0gOTYuMDsKKworICAg
IGRvdWJsZSBkcGlYLCBkcGlZOworICAgIEhSRVNVTFQgaHIgPSBiaXRtYXBTb3VyY2UtPkdldFJl
c29sdXRpb24oJmRwaVgsICZkcGlZKTsKKyAgICBpZiAoIVNVQ0NFRURFRChocikpCisgICAgICAg
IHJldHVybiB7IH07CisKKyAgICBGbG9hdFBvaW50IHJlc3VsdChkcGlYLCBkcGlZKTsKKyAgICBy
ZXN1bHQuc2NhbGUoMSAvIGRwaUJhc2UpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Vuc2ln
bmVkIGJpdHNQZXJQaXhlbChHVUlEIGJpdG1hcEZvcm1hdCkKK3sKKyAgICBDT01QdHI8SVdJQ0Nv
bXBvbmVudEluZm8+IGNvbXBvbmVudEluZm87CisgICAgSFJFU1VMVCBociA9IEltYWdlRGVjb2Rl
ckRpcmVjdDJEOjpzeXN0ZW1JbWFnaW5nRmFjdG9yeSgpLT5DcmVhdGVDb21wb25lbnRJbmZvKGJp
dG1hcEZvcm1hdCwgJmNvbXBvbmVudEluZm8pOworICAgIGlmICghU1VDQ0VFREVEKGhyKSkKKyAg
ICAgICAgcmV0dXJuIDQ7CisKKyAgICBDT01QdHI8SVdJQ1BpeGVsRm9ybWF0SW5mbz4gcGl4ZWxG
b3JtYXQ7CisgICAgcGl4ZWxGb3JtYXQucXVlcnkoY29tcG9uZW50SW5mbyk7CisgICAgaWYgKCFw
aXhlbEZvcm1hdCkKKyAgICAgICAgcmV0dXJuIDQ7CisKKyAgICBVSU5UIGJwcCA9IDA7CisgICAg
aHIgPSBwaXhlbEZvcm1hdC0+R2V0Qml0c1BlclBpeGVsKCZicHApOworICAgIGlmICghU1VDQ0VF
REVEKGhyKSkKKyAgICAgICAgcmV0dXJuIDQ7CisKKyAgICByZXR1cm4gYnBwOworfQorCitDT01Q
dHI8SVdJQ0JpdG1hcD4gY3JlYXRlRGlyZWN0MkRJbWFnZVN1cmZhY2VXaXRoRGF0YSh2b2lkKiBk
YXRhLCBjb25zdCBJbnRTaXplJiBzaXplLCB1bnNpZ25lZCBzdHJpZGUpCit7CisgICAgQ2hlY2tl
ZDxzaXplX3QsIFJlY29yZE92ZXJmbG93PiBudW1CeXRlcyA9IENoZWNrZWQ8dW5zaWduZWQsIFJl
Y29yZE92ZXJmbG93PihzaXplLmhlaWdodCgpKSAqIHN0cmlkZTsKKyAgICBpZiAobnVtQnl0ZXMu
aGFzT3ZlcmZsb3dlZCgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIENPTVB0cjxJ
V0lDQml0bWFwPiBzdXJmYWNlOworICAgIEhSRVNVTFQgaHIgPSBJbWFnZURlY29kZXJEaXJlY3Qy
RDo6c3lzdGVtSW1hZ2luZ0ZhY3RvcnkoKS0+Q3JlYXRlQml0bWFwRnJvbU1lbW9yeShzaXplLndp
ZHRoKCksIHNpemUuaGVpZ2h0KCksIEdVSURfV0lDUGl4ZWxGb3JtYXQzMmJwcFBCR1JBLCBzdHJp
ZGUsIHN0YXRpY19jYXN0PFVJTlQ+KG51bUJ5dGVzLnVuc2FmZUdldCgpKSwgcmVpbnRlcnByZXRf
Y2FzdDxCWVRFKj4oZGF0YSksICZzdXJmYWNlKTsKKyAgICBpZiAoIVNVQ0NFRURFRChocikpCisg
ICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKK0NPTVB0
cjxJRDJEMVJlbmRlclRhcmdldD4gY3JlYXRlUmVuZGVyVGFyZ2V0RnJvbVdJQ0JpdG1hcChJV0lD
Qml0bWFwKiBiaXRtYXBTb3VyY2UpCit7CisgICAgYXV0byB0YXJnZXRQcm9wZXJ0aWVzID0gRDJE
MTo6UmVuZGVyVGFyZ2V0UHJvcGVydGllcyhEMkQxX1JFTkRFUl9UQVJHRVRfVFlQRV9ERUZBVUxU
LAorICAgICAgICBEMkQxOjpQaXhlbEZvcm1hdChEWEdJX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwg
RDJEMV9BTFBIQV9NT0RFX1BSRU1VTFRJUExJRUQpLAorICAgICAgICAwLCAwLCBEMkQxX1JFTkRF
Ul9UQVJHRVRfVVNBR0VfTk9ORSwgRDJEMV9GRUFUVVJFX0xFVkVMX0RFRkFVTFQpOworCisgICAg
Q09NUHRyPElEMkQxUmVuZGVyVGFyZ2V0PiBiaXRtYXBDb250ZXh0OworICAgIEhSRVNVTFQgaHIg
PSBHcmFwaGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+Q3JlYXRlV2ljQml0bWFwUmVuZGVy
VGFyZ2V0KGJpdG1hcFNvdXJjZSwgJnRhcmdldFByb3BlcnRpZXMsICZiaXRtYXBDb250ZXh0KTsK
KyAgICBpZiAoIWJpdG1hcENvbnRleHQgfHwgIVNVQ0NFRURFRChocikpCisgICAgICAgIHJldHVy
biBudWxscHRyOworCisgICAgcmV0dXJuIGJpdG1hcENvbnRleHQ7Cit9CisKK3ZvaWQgY29weVJl
Y3RGcm9tT25lU3VyZmFjZVRvQW5vdGhlcihJV0lDQml0bWFwKiBmcm9tLCBJV0lDQml0bWFwKiB0
bywgY29uc3QgSW50U2l6ZSYgc291cmNlT2Zmc2V0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBjb25z
dCBJbnRTaXplJiBkZXN0T2Zmc2V0KQoreworICAgIC8qCisgICAgUmVmUHRyPGNhaXJvX3Q+IGNv
bnRleHQgPSBhZG9wdFJlZihjYWlyb19jcmVhdGUodG8pKTsKKyAgICBjYWlyb190cmFuc2xhdGUo
Y29udGV4dC5nZXQoKSwgZGVzdE9mZnNldC53aWR0aCgpLCBkZXN0T2Zmc2V0LmhlaWdodCgpKTsK
KyAgICBjYWlyb19zZXRfb3BlcmF0b3IoY29udGV4dC5nZXQoKSwgY2Fpcm9PcGVyYXRvcik7Cisg
ICAgY29weVJlY3RGcm9tQ2Fpcm9TdXJmYWNlVG9Db250ZXh0KGZyb20sIGNvbnRleHQuZ2V0KCks
IHNvdXJjZU9mZnNldCwgcmVjdCk7CisgICAgKi8KK30KKworfSAvLyBuYW1lc3BhY2UgRGlyZWN0
MkQKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKERJUkVDVDJEKQpJ
bmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0RpcmVjdDJEVXRpbGl0
aWVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0RpcmVjdDJEVXRpbGl0aWVzLmgJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0RpcmVjdDJEVXRpbGl0aWVzLmgJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBJZ2FsaWEgUy5MLgorICog
Q29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBlbWJlZGRlZCBzeXN0ZW1zCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgVVNF
KERJUkVDVDJEKQorCisjaW5jbHVkZSAiQ09NUHRyLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NUeXBl
cy5oIgorI2luY2x1ZGUgIkludFNpemUuaCIKKworaW50ZXJmYWNlIElEMkQxUmVuZGVyVGFyZ2V0
OworaW50ZXJmYWNlIElXSUNCaXRtYXBTb3VyY2U7CitpbnRlcmZhY2UgSVdJQ0JpdG1hcDsKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBGbG9hdFBvaW50OworY2xhc3MgSW50UmVjdDsK
K2NsYXNzIEludFNpemU7CisKK25hbWVzcGFjZSBEaXJlY3QyRCB7CisKK0ludFNpemUgYml0bWFw
U2l6ZShJV0lDQml0bWFwU291cmNlKik7CitGbG9hdFBvaW50IGJpdG1hcFJlc29sdXRpb24oSVdJ
Q0JpdG1hcFNvdXJjZSopOwordW5zaWduZWQgYml0c1BlclBpeGVsKEdVSUQpOworQ09NUHRyPElX
SUNCaXRtYXA+IGNyZWF0ZURpcmVjdDJESW1hZ2VTdXJmYWNlV2l0aERhdGEodm9pZCogZGF0YSwg
Y29uc3QgSW50U2l6ZSYsIHVuc2lnbmVkIHN0cmlkZSk7CitDT01QdHI8SUQyRDFSZW5kZXJUYXJn
ZXQ+IGNyZWF0ZVJlbmRlclRhcmdldEZyb21XSUNCaXRtYXAoSVdJQ0JpdG1hcCopOworCit2b2lk
IGNvcHlSZWN0RnJvbU9uZVN1cmZhY2VUb0Fub3RoZXIoSVdJQ0JpdG1hcCogZnJvbSwgSVdJQ0Jp
dG1hcCogdG8sIGNvbnN0IEludFNpemUmIHNvdXJjZU9mZnNldCwgY29uc3QgSW50UmVjdCYsIGNv
bnN0IEludFNpemUmIGRlc3RPZmZzZXQgPSBJbnRTaXplKCkpOworCit9IC8vIG5hbWVzcGFjZSBE
aXJlY3QyRAorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoRElSRUNU
MkQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENhc2Nh
ZGVEaXJlY3QyRC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0ZvbnRDYXNjYWRlRGlyZWN0MkQuY3BwCShyZXZpc2lvbiAyNDgwMDgpCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENhc2NhZGVEaXJlY3QyRC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlICJHcmFwaGljc0Nv
bnRleHQuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3Qy
RC5oIgogI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRC5oIgogI2luY2x1ZGUgIlVuaXNjcmliZUNvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJXZWJD
b3JlVGV4dFJlbmRlcmVyLmgiCiAjaW5jbHVkZSA8ZDJkMS5oPgpAQCAtNDcsNyArNDgsNyBAQCBu
YW1lc3BhY2UgV2ViQ29yZSB7CiB2b2lkIEZvbnRDYXNjYWRlOjpkcmF3R2x5cGhzKEdyYXBoaWNz
Q29udGV4dCYgZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBGb250JiBmb250LCBjb25zdCBHbHlwaEJ1
ZmZlciYgZ2x5cGhCdWZmZXIsCiAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbnVtR2x5cGhz
LCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgRm9udFNtb290aGluZ01vZGUgc21vb3RoaW5nTW9k
ZSkKIHsKLSAgICBhdXRvIGNvbnRleHQgPSBncmFwaGljc0NvbnRleHQucGxhdGZvcm1Db250ZXh0
KCk7CisgICAgYXV0byBjb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LnBsYXRmb3JtQ29udGV4dCgp
LT5yZW5kZXJUYXJnZXQoKTsKICAgICBib29sIHNob3VsZFVzZUZvbnRTbW9vdGhpbmcgPSBXZWJD
b3JlU2hvdWxkVXNlRm9udFNtb290aGluZygpOwogCiAgICAgc3dpdGNoIChzbW9vdGhpbmdNb2Rl
KSB7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhZGllbnRE
aXJlY3QyRC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0dyYWRpZW50RGlyZWN0MkQuY3BwCShyZXZpc2lvbiAyNDgwMDgpCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhZGllbnREaXJlY3QyRC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgIkZsb2F0UG9pbnQuaCIKICNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRC5oIgogI2luY2x1ZGUgPGQyZDEuaD4KICNpbmNsdWRlIDx3dGYvUmV0YWluUHRyLmg+CiAK
QEAgLTExMCw3ICsxMTEsNyBAQCB2b2lkIEdyYWRpZW50OjpnZW5lcmF0ZUdyYWRpZW50KElEMkQx
UmVuCiAKIHZvaWQgR3JhZGllbnQ6OmZpbGwoR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0LCBjb25z
dCBGbG9hdFJlY3QmIHJlY3QpCiB7Ci0gICAgYXV0byBkMmRDb250ZXh0ID0gY29udGV4dC5wbGF0
Zm9ybUNvbnRleHQoKTsKKyAgICBhdXRvIGQyZENvbnRleHQgPSBjb250ZXh0LnBsYXRmb3JtQ29u
dGV4dCgpLT5yZW5kZXJUYXJnZXQoKTsKIAogICAgIFdURjo6c3dpdGNoT24obV9kYXRhLAogICAg
ICAgICBbJl0gKGNvbnN0IExpbmVhckRhdGEmIGRhdGEpIHsKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHREaXJlY3QyRC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29u
dGV4dERpcmVjdDJELmNwcAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dERpcmVjdDJELmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYtMjAxOCBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYtMjAxOSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKIAog
I2luY2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1ZGUgIkRpcmVjdDJET3BlcmF0aW9ucy5oIgogI2lu
Y2x1ZGUgIkRpc3BsYXlMaXN0UmVjb3JkZXIuaCIKICNpbmNsdWRlICJGbG9hdFJvdW5kZWRSZWN0
LmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGlyZWN0MkQuaCIK
QEAgLTM0LDYgKzM1LDcgQEAKICNpbmNsdWRlICJJbWFnZURlY29kZXJEaXJlY3QyRC5oIgogI2lu
Y2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUg
IlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCiAjaW5jbHVkZSA8ZDJkMS5oPgogI2luY2x1ZGUg
PGQyZDFlZmZlY3RzLmg+CiAjaW5jbHVkZSA8ZHdyaXRlLmg+CkBAIC02MywxMCArNjUsMTEgQEAg
R3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoSERDIGhkYwogCiAgICAgKCpyZW5kZXJU
YXJnZXQpLT5CaW5kREMoaGRjLCAmcmVjdCk7CiAKLSAgICBtX2RhdGEgPSBuZXcgR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlKCpyZW5kZXJUYXJnZXQsIEJpdG1hcFJlbmRlcmluZ0NvbnRl
eHRUeXBlOjpHUFVNZW1vcnkpOworICAgIGF1dG8gb3duZWRQbGF0Zm9ybUNvbnRleHQgPSBzdGQ6
Om1ha2VfdW5pcXVlPFBsYXRmb3JtQ29udGV4dERpcmVjdDJEPigqcmVuZGVyVGFyZ2V0KTsKKyAg
ICBtX2RhdGEgPSBuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKFdURk1vdmUob3du
ZWRQbGF0Zm9ybUNvbnRleHQpLCBCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZTo6R1BVTWVtb3J5
KTsKIH0KIAotR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoUGxhdGZvcm1HcmFwaGlj
c0NvbnRleHQqIHBsYXRmb3JtR3JhcGhpY3NDb250ZXh0LCBCaXRtYXBSZW5kZXJpbmdDb250ZXh0
VHlwZSByZW5kZXJlclR5cGUpCitHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChQbGF0
Zm9ybUNvbnRleHREaXJlY3QyRCogcGxhdGZvcm1HcmFwaGljc0NvbnRleHQsIEJpdG1hcFJlbmRl
cmluZ0NvbnRleHRUeXBlIHJlbmRlcmVyVHlwZSkKIHsKICAgICBwbGF0Zm9ybUluaXQocGxhdGZv
cm1HcmFwaGljc0NvbnRleHQsIHJlbmRlcmVyVHlwZSk7CiB9CkBAIC0xMjQsOCArMTI3LDEwIEBA
IHZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybUluaXQoSERDIGgKICAgICBpZiAoIVNVQ0NF
RURFRChocikpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1fZGF0YSA9IG5ldyBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGUocmVuZGVyVGFyZ2V0LmdldCgpLCBCaXRtYXBSZW5kZXJpbmdD
b250ZXh0VHlwZTo6R1BVTWVtb3J5KTsKKyAgICBhdXRvIG93bmVkUGxhdGZvcm1Db250ZXh0ID0g
c3RkOjptYWtlX3VuaXF1ZTxQbGF0Zm9ybUNvbnRleHREaXJlY3QyRD4ocmVuZGVyVGFyZ2V0Lmdl
dCgpKTsKKyAgICBtX2RhdGEgPSBuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKFdU
Rk1vdmUob3duZWRQbGF0Zm9ybUNvbnRleHQpLCBCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZTo6
R1BVTWVtb3J5KTsKICAgICBtX2RhdGEtPm1faGRjID0gaGRjOworCiAgICAgLy8gTWFrZSBzdXJl
IHRoZSBjb250ZXh0IHN0YXJ0cyBpbiBzeW5jIHdpdGggb3VyIHN0YXRlLgogICAgIHNldFBsYXRm
b3JtRmlsbENvbG9yKGZpbGxDb2xvcigpKTsKICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0
cm9rZUNvbG9yKCkpOwpAQCAtMTMzLDE3ICsxMzgsMTcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6
OnBsYXRmb3JtSW5pdChIREMgaAogICAgIC8vIEZJWE1FOiBtX3N0YXRlLmltYWdlSW50ZXJwb2xh
dGlvblF1YWxpdHkgPSBjb252ZXJ0SW50ZXJwb2xhdGlvblF1YWxpdHkoQ0dDb250ZXh0R2V0SW50
ZXJwb2xhdGlvblF1YWxpdHkocGxhdGZvcm1Db250ZXh0KCkpKTsKIH0KIAotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnBsYXRmb3JtSW5pdChJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KQor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtSW5pdChQbGF0Zm9ybUNvbnRleHREaXJlY3Qy
RCogcGxhdGZvcm1Db250ZXh0KQogewotICAgIHBsYXRmb3JtSW5pdChyZW5kZXJUYXJnZXQsIEJp
dG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1vcnkpOworICAgIHBsYXRmb3JtSW5pdChw
bGF0Zm9ybUNvbnRleHQsIEJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1vcnkpOwog
fQogCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Jbml0KElEMkQxUmVuZGVyVGFyZ2V0
KiByZW5kZXJUYXJnZXQsIEJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlIHJlbmRlcmluZ1R5cGUp
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Jbml0KFBsYXRmb3JtQ29udGV4dERpcmVj
dDJEKiBwbGF0Zm9ybUNvbnRleHQsIEJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlIHJlbmRlcmlu
Z1R5cGUpCiB7Ci0gICAgaWYgKCFyZW5kZXJUYXJnZXQpCisgICAgaWYgKCFwbGF0Zm9ybUNvbnRl
eHQpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1fZGF0YSA9IG5ldyBHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGUocmVuZGVyVGFyZ2V0LCByZW5kZXJpbmdUeXBlKTsKKyAgICBtX2RhdGEg
PSBuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCpwbGF0Zm9ybUNvbnRleHQsIHJl
bmRlcmluZ1R5cGUpOwogCiAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZXh0IHN0YXJ0cyBpbiBz
eW5jIHdpdGggb3VyIHN0YXRlLgogICAgIHNldFBsYXRmb3JtRmlsbENvbG9yKGZpbGxDb2xvcigp
KTsKQEAgLTE1NywzMCArMTYyLDM1IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybURl
c3Ryb3koKQogICAgIGRlbGV0ZSBtX2RhdGE7CiB9CiAKLUlEMkQxUmVuZGVyVGFyZ2V0KiBHcmFw
aGljc0NvbnRleHQ6OnBsYXRmb3JtQ29udGV4dCgpIGNvbnN0CitQbGF0Zm9ybUNvbnRleHREaXJl
Y3QyRCogR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybUNvbnRleHQoKSBjb25zdAogewogICAgIEFT
U0VSVCghcGFpbnRpbmdEaXNhYmxlZCgpKTsKLSAgICByZXR1cm4gbV9kYXRhLT5yZW5kZXJUYXJn
ZXQoKTsKKyAgICByZXR1cm4gbV9kYXRhLT5wbGF0Zm9ybUNvbnRleHQoKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnN5bmNDb250ZXh0KFBsYXRmb3JtQ29udGV4
dERpcmVjdDJEJikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCiBJRDJEMVJlbmRlclRh
cmdldCogR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpyZW5kZXJUYXJnZXQoKQogewot
ICAgIGlmICghbV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0
dXJuIG1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5sYXN0KCkucmVuZGVyVGFyZ2V0LmdldCgpOwor
ICAgIGlmICghbV9wbGF0Zm9ybUNvbnRleHQubV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuIG1fcGxhdGZvcm1Db250ZXh0Lm1fdHJhbnNwYXJlbmN5TGF5
ZXJTdGFjay5sYXN0KCkucmVuZGVyVGFyZ2V0LmdldCgpOwogCi0gICAgcmV0dXJuIG1fcmVuZGVy
VGFyZ2V0LmdldCgpOworICAgIHJldHVybiBtX3BsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQo
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNldEFscGhhKGZs
b2F0IGFscGhhKQogewotICAgIEFTU0VSVChtX3RyYW5zcGFyZW5jeUxheWVyU3RhY2suaXNFbXB0
eSgpKTsKKyAgICBBU1NFUlQobV9wbGF0Zm9ybUNvbnRleHQubV90cmFuc3BhcmVuY3lMYXllclN0
YWNrLmlzRW1wdHkoKSk7CiAgICAgbV9hbHBoYSA9IGFscGhhOwogfQogCiBmbG9hdCBHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmN1cnJlbnRHbG9iYWxBbHBoYSgpIGNvbnN0CiB7Ci0g
ICAgaWYgKCFtX3RyYW5zcGFyZW5jeUxheWVyU3RhY2suaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm4gbV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmxhc3QoKS5vcGFjaXR5OworICAgIGlmICghbV9w
bGF0Zm9ybUNvbnRleHQubV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuIG1fcGxhdGZvcm1Db250ZXh0Lm1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5sYXN0
KCkub3BhY2l0eTsKIAogICAgIHJldHVybiBtX2FscGhhOwogfQpAQCAtMTkwLDkgKzIwMCw4IEBA
IHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzYXZlUGxhdGZvcm1TdGF0ZSgKICAgICBBU1NFUlQoIXBh
aW50aW5nRGlzYWJsZWQoKSk7CiAgICAgQVNTRVJUKCFtX2ltcGwpOwogCi0gICAgLy8gTm90ZTog
RG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiB0aGlzIGNsYXNzIGltcGxlbWVudGF0aW9u
LCBzaW5jZSB3ZSB3YW50IHRvIGF2b2lkIHRoZSBleHRyYQotICAgIC8vIHNhdmUgb2YgdGhlIHNl
Y29uZGFyeSBjb250ZXh0IChpbiBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3Qy
RC5oKS4KLSAgICBtX2RhdGEtPnNhdmUoKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0
KCkpOworICAgIERpcmVjdDJEOjpzYXZlKCpwbGF0Zm9ybUNvbnRleHQoKSk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpyZXN0b3JlUGxhdGZvcm1TdGF0ZSgpCkBAIC0yMDAsOTcgKzIwOSwz
MSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhCiAgICAgQVNTRVJU
KCFwYWludGluZ0Rpc2FibGVkKCkpOwogICAgIEFTU0VSVCghbV9pbXBsKTsKIAotICAgIC8vIE5v
dGU6IERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoaW4gdGhpcyBjbGFzcyBpbXBsZW1lbnRh
dGlvbiwgc2luY2Ugd2Ugd2FudCB0byBhdm9pZCB0aGUgZXh0cmEKLSAgICAvLyByZXN0b3JlIG9m
IHRoZSBzZWNvbmRhcnkgY29udGV4dCAoaW4gR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
RGlyZWN0MkQuaCkuCi0gICAgbV9kYXRhLT5yZXN0b3JlKCk7Ci0gICAgLy8gRklYTUU6IG1fZGF0
YS0+bV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eSA9IGZhbHNlOworICAg
IEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OnJlc3RvcmUoKnBs
YXRmb3JtQ29udGV4dCgpKTsKIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdOYXRpdmVJ
bWFnZShjb25zdCBDT01QdHI8SVdJQ0JpdG1hcD4mIGltYWdlLCBjb25zdCBGbG9hdFNpemUmIGlt
YWdlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNS
ZWN0LCBDb21wb3NpdGVPcGVyYXRvciBvcCwgQmxlbmRNb2RlIGJsZW5kTW9kZSwgSW1hZ2VPcmll
bnRhdGlvbiBvcmllbnRhdGlvbikKLXsKLSAgICBDT01QdHI8SUQyRDFCaXRtYXA+IGRldmljZUJp
dG1hcDsKLSAgICBIUkVTVUxUIGhyID0gcGxhdGZvcm1Db250ZXh0KCktPkNyZWF0ZUJpdG1hcEZy
b21XaWNCaXRtYXAoaW1hZ2UuZ2V0KCksICZkZXZpY2VCaXRtYXApOwotICAgIGlmICghU1VDQ0VF
REVEKGhyKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZHJhd0RldmljZUJpdG1hcChkZXZpY2VC
aXRtYXAsIGltYWdlU2l6ZSwgZGVzdFJlY3QsIHNyY1JlY3QsIG9wLCBibGVuZE1vZGUsIG9yaWVu
dGF0aW9uKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdEZXZpY2VCaXRtYXAoY29u
c3QgQ09NUHRyPElEMkQxQml0bWFwPiYgaW1hZ2UsIGNvbnN0IEZsb2F0U2l6ZSYgaW1hZ2VTaXpl
LCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENv
bXBvc2l0ZU9wZXJhdG9yIG9wLCBCbGVuZE1vZGUgYmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0aW9u
IG9yaWVudGF0aW9uKQordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdOYXRpdmVJbWFnZShjb25z
dCBDT01QdHI8SVdJQ0JpdG1hcD4mIGltYWdlLCBjb25zdCBGbG9hdFNpemUmIGltYWdlU2l6ZSwg
Y29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21w
b3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlIGJsZW5kTW9kZSwgSW1h
Z2VPcmllbnRhdGlvbiBvcmllbnRhdGlvbikKIHsKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQogICAgICAgICByZXR1cm47CiAKICAgICBpZiAobV9pbXBsKSB7Ci0gICAgICAgIC8vIEZJWE1F
OiBJbXBsZW1lbnQgRGlzcGxheUxpc3RSZWNvcmRlciBzdXBwb3J0IGZvciBkcmF3TmF0aXZlSW1h
Z2UuCi0gICAgICAgIC8vIG1fZGlzcGxheUxpc3RSZWNvcmRlci0+ZHJhd05hdGl2ZUltYWdlKGlt
YWdlLCBpbWFnZVNpemUsIGRlc3RSZWN0LCBzcmNSZWN0LCBvcCwgYmxlbmRNb2RlLCBvcmllbnRh
dGlvbik7Ci0gICAgICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgICAgIG1faW1wbC0+ZHJhd05h
dGl2ZUltYWdlKGltYWdlLCBpbWFnZVNpemUsIGRlc3RSZWN0LCBzcmNSZWN0LCBjb21wb3NpdGVP
cGVyYXRvciwgYmxlbmRNb2RlLCBvcmllbnRhdGlvbik7CiAgICAgICAgIHJldHVybjsKICAgICB9
CiAKLSAgICBhdXRvIGJpdG1hcFNpemUgPSBpbWFnZS0+R2V0U2l6ZSgpOwotCi0gICAgZmxvYXQg
Y3VyckhlaWdodCA9IG9yaWVudGF0aW9uLnVzZXNXaWR0aEFzSGVpZ2h0KCkgPyBiaXRtYXBTaXpl
LndpZHRoIDogYml0bWFwU2l6ZS5oZWlnaHQ7Ci0gICAgaWYgKGN1cnJIZWlnaHQgPD0gc3JjUmVj
dC55KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29u
dGV4dCgpOwotCi0gICAgRDJEMV9NQVRSSVhfM1gyX0YgY3RtOwotICAgIGNvbnRleHQtPkdldFRy
YW5zZm9ybSgmY3RtKTsKLQotICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0oY3RtKTsKLQot
ICAgIEQyRENvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSk7Ci0KLSAgICBib29s
IHNob3VsZFVzZVN1YmltYWdlID0gZmFsc2U7Ci0KLSAgICAvLyBJZiB0aGUgc291cmNlIHJlY3Qg
aXMgYSBzdWJwb3J0aW9uIG9mIHRoZSBpbWFnZSwgdGhlbiB3ZSBjb21wdXRlIGFuIGluZmxhdGVk
IGRlc3RpbmF0aW9uIHJlY3QgdGhhdCB3aWxsIGhvbGQgdGhlIGVudGlyZSBpbWFnZQotICAgIC8v
IGFuZCB0aGVuIHNldCBhIGNsaXAgdG8gdGhlIHBvcnRpb24gdGhhdCB3ZSB3YW50IHRvIGRpc3Bs
YXkuCi0gICAgRmxvYXRSZWN0IGFkanVzdGVkRGVzdFJlY3QgPSBkZXN0UmVjdDsKLQotICAgIGlm
IChzcmNSZWN0LnNpemUoKSAhPSBpbWFnZVNpemUpIHsKLSAgICAgICAgLy8gRklYTUU6IEltcGxl
bWVudCBpbWFnZSBzY2FsaW5nCi0gICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgfQotCi0g
ICAgLy8gSWYgdGhlIGltYWdlIGlzIG9ubHkgcGFydGlhbGx5IGxvYWRlZCwgdGhlbiBzaHJpbmsg
dGhlIGRlc3RpbmF0aW9uIHJlY3QgdGhhdCB3ZSdyZSBkcmF3aW5nIGludG8gYWNjb3JkaW5nbHku
Ci0gICAgaWYgKCFzaG91bGRVc2VTdWJpbWFnZSAmJiBjdXJySGVpZ2h0IDwgaW1hZ2VTaXplLmhl
aWdodCgpKQotICAgICAgICBhZGp1c3RlZERlc3RSZWN0LnNldEhlaWdodChhZGp1c3RlZERlc3RS
ZWN0LmhlaWdodCgpICogY3VyckhlaWdodCAvIGltYWdlU2l6ZS5oZWlnaHQoKSk7Ci0KLSAgICBz
ZXRQbGF0Zm9ybUNvbXBvc2l0ZU9wZXJhdGlvbihvcCwgYmxlbmRNb2RlKTsKLQotICAgIC8vIElt
YWdlT3JpZW50YXRpb24gZXhwZWN0cyB0aGUgb3JpZ2luIHRvIGJlIGF0ICgwLCAwKS4KLSAgICB0
cmFuc2Zvcm0udHJhbnNsYXRlKGFkanVzdGVkRGVzdFJlY3QueCgpLCBhZGp1c3RlZERlc3RSZWN0
LnkoKSk7Ci0gICAgY29udGV4dC0+U2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0gICAgYWRqdXN0
ZWREZXN0UmVjdC5zZXRMb2NhdGlvbihGbG9hdFBvaW50KCkpOwotCi0gICAgaWYgKG9yaWVudGF0
aW9uICE9IERlZmF1bHRJbWFnZU9yaWVudGF0aW9uKSB7Ci0gICAgICAgIHRoaXMtPmNvbmNhdENU
TShvcmllbnRhdGlvbi50cmFuc2Zvcm1Gcm9tRGVmYXVsdChhZGp1c3RlZERlc3RSZWN0LnNpemUo
KSkpOwotICAgICAgICBpZiAob3JpZW50YXRpb24udXNlc1dpZHRoQXNIZWlnaHQoKSkgewotICAg
ICAgICAgICAgLy8gVGhlIGRlc3RpbmF0aW9uIHJlY3Qgd2lsbCBoYXZlIGl0J3Mgd2lkdGggYW5k
IGhlaWdodCBhbHJlYWR5IHJldmVyc2VkIGZvciB0aGUgb3JpZW50YXRpb24gb2YKLSAgICAgICAg
ICAgIC8vIHRoZSBpbWFnZSwgYXMgaXQgd2FzIG5lZWRlZCBmb3IgcGFnZSBsYXlvdXQsIHNvIHdl
IG5lZWQgdG8gcmV2ZXJzZSBpdCBiYWNrIGhlcmUuCi0gICAgICAgICAgICBhZGp1c3RlZERlc3RS
ZWN0ID0gRmxvYXRSZWN0KGFkanVzdGVkRGVzdFJlY3QueCgpLCBhZGp1c3RlZERlc3RSZWN0Lnko
KSwgYWRqdXN0ZWREZXN0UmVjdC5oZWlnaHQoKSwgYWRqdXN0ZWREZXN0UmVjdC53aWR0aCgpKTsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwot
Ci0gICAgZHJhd1dpdGhvdXRTaGFkb3coYWRqdXN0ZWREZXN0UmVjdCwgW3RoaXMsIGltYWdlLCBh
ZGp1c3RlZERlc3RSZWN0LCBzcmNSZWN0XShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0
KSB7Ci0gICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0JpdG1hcChpbWFnZS5nZXQoKSwgYWRqdXN0
ZWREZXN0UmVjdCwgMS4wZiwgRDJEMV9CSVRNQVBfSU5URVJQT0xBVElPTl9NT0RFX0xJTkVBUiwg
c3RhdGljX2Nhc3Q8RDJEMV9SRUNUX0Y+KHNyY1JlY3QpKTsKLSAgICB9KTsKLQotICAgIGZsdXNo
KCk7Ci0KLSAgICBpZiAoIXN0YXRlU2F2ZXIuZGlkU2F2ZSgpKQotICAgICAgICBjb250ZXh0LT5T
ZXRUcmFuc2Zvcm0oY3RtKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAg
IGF1dG8mIHN0YXRlID0gdGhpcy0+c3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZHJhd05hdGl2ZUlt
YWdlKCpwbGF0Zm9ybUNvbnRleHQoKSwgaW1hZ2UuZ2V0KCksIGltYWdlU2l6ZSwgZGVzdFJlY3Qs
IHNyY1JlY3QsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUsIG9yaWVudGF0aW9uLCBzdGF0
ZS5pbWFnZUludGVycG9sYXRpb25RdWFsaXR5LCBzdGF0ZS5hbHBoYSwgRGlyZWN0MkQ6OlNoYWRv
d1N0YXRlKHN0YXRlKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93
c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxw
aGFCbGVuZCkKIHsKICAgICBib29sIGNyZWF0ZWRCaXRtYXAgPSBtX2ltcGwgfHwgIW1fZGF0YS0+
bV9oZGMgfHwgaXNJblRyYW5zcGFyZW5jeUxheWVyKCk7CiAgICAgaWYgKCFjcmVhdGVkQml0bWFw
KSB7Ci0gICAgICAgIG1fZGF0YS0+cmVzdG9yZSgpOworICAgICAgICBBU1NFUlQoaGFzUGxhdGZv
cm1Db250ZXh0KCkpOworICAgICAgICBEaXJlY3QyRDo6cmVzdG9yZSgqcGxhdGZvcm1Db250ZXh0
KCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0zMDUsMTMgKzI0OCwxMyBAQCB2b2lk
IEdyYXBoaWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250CiAgICAgYXV0byBiaXRtYXBQcm9w
ZXJ0aWVzID0gRDJEMTo6Qml0bWFwUHJvcGVydGllcyhEMkQxOjpQaXhlbEZvcm1hdChEWEdJX0ZP
Uk1BVF9COEc4UjhBOF9VTk9STSwgRDJEMV9BTFBIQV9NT0RFX1BSRU1VTFRJUExJRUQpKTsKIAog
ICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gYml0bWFwOwotICAgIEhSRVNVTFQgaHIgPSBwbGF0Zm9y
bUNvbnRleHQoKS0+Q3JlYXRlQml0bWFwKHBpeGVsRGF0YS5zaXplKCksIHBpeGVsRGF0YS5idWZm
ZXIoKSwgcGl4ZWxEYXRhLmJ5dGVzUGVyUm93KCksICZiaXRtYXBQcm9wZXJ0aWVzLCAmYml0bWFw
KTsKKyAgICBIUkVTVUxUIGhyID0gcGxhdGZvcm1Db250ZXh0KCktPnJlbmRlclRhcmdldCgpLT5D
cmVhdGVCaXRtYXAocGl4ZWxEYXRhLnNpemUoKSwgcGl4ZWxEYXRhLmJ1ZmZlcigpLCBwaXhlbERh
dGEuYnl0ZXNQZXJSb3coKSwgJmJpdG1hcFByb3BlcnRpZXMsICZiaXRtYXApOwogICAgIEFTU0VS
VChTVUNDRUVERUQoaHIpKTsKIAogICAgIEQyRENvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIo
Km1fZGF0YSk7CiAKICAgICAvLyBOb3RlOiBUaGUgY29udGVudCBpbiB0aGUgSERDIGlzIGludmVy
dGVkIGNvbXBhcmVkIHRvIERpcmVjdDJELCBzbyBpdCBuZWVkcyB0byBiZSBmbGlwcGVkLgotICAg
IGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOworICAgIGF1dG8gY29udGV4dCA9IHBs
YXRmb3JtQ29udGV4dCgpLT5yZW5kZXJUYXJnZXQoKTsKIAogICAgIEQyRDFfTUFUUklYXzNYMl9G
IGN1cnJlbnRUcmFuc2Zvcm07CiAgICAgY29udGV4dC0+R2V0VHJhbnNmb3JtKCZjdXJyZW50VHJh
bnNmb3JtKTsKQEAgLTM0MywxMTkgKzI4Niw3NiBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJh
d0RvdHNGb3JEb2N1bWVuCiB7CiB9CiAKLUdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJU
YXJnZXQsIEdyYXBoaWNzQ29udGV4dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUgcmVuZGVy
aW5nVHlwZSkKLSAgICA6IG1fcmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCkKK0dyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEJiBwbGF0Zm9ybUNvbnRleHQsIEdyYXBoaWNzQ29udGV4dDo6Qml0
bWFwUmVuZGVyaW5nQ29udGV4dFR5cGUgcmVuZGVyaW5nVHlwZSkKKyAgICA6IG1fcGxhdGZvcm1D
b250ZXh0KHBsYXRmb3JtQ29udGV4dCkKICAgICAsIG1fcmVuZGVyZXJUeXBlKHJlbmRlcmluZ1R5
cGUpCiB7Ci0gICAgaWYgKCFtX3JlbmRlclRhcmdldCkKKyAgICBpZiAoIW1fcGxhdGZvcm1Db250
ZXh0LnJlbmRlclRhcmdldCgpKQogICAgICAgICByZXR1cm47CiAKICAgICBpZiAobV9yZW5kZXJl
clR5cGUgPT0gR3JhcGhpY3NDb250ZXh0OjpCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZTo6R1BV
TWVtb3J5KQogICAgICAgICBiZWdpbkRyYXcoKTsKIH0KIAotR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjp+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCkKK0dyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKHN0ZDo6
dW5pcXVlX3B0cjxQbGF0Zm9ybUNvbnRleHREaXJlY3QyRD4mJiBvd25lZFBsYXRmb3JtQ29udGV4
dCwgR3JhcGhpY3NDb250ZXh0OjpCaXRtYXBSZW5kZXJpbmdDb250ZXh0VHlwZSByZW5kZXJpbmdU
eXBlKQorICAgIDogbV9vd25lZFBsYXRmb3JtQ29udGV4dChXVEZNb3ZlKG93bmVkUGxhdGZvcm1D
b250ZXh0KSkKKyAgICAsIG1fcGxhdGZvcm1Db250ZXh0KCpvd25lZFBsYXRmb3JtQ29udGV4dCkK
KyAgICAsIG1fcmVuZGVyZXJUeXBlKHJlbmRlcmluZ1R5cGUpCiB7Ci0gICAgaWYgKCFtX3JlbmRl
clRhcmdldCkKKyAgICBpZiAoIW1fcGxhdGZvcm1Db250ZXh0LnJlbmRlclRhcmdldCgpKQogICAg
ICAgICByZXR1cm47CiAKLSAgICBpZiAoYmVnaW5EcmF3Q291bnQpCi0gICAgICAgIGVuZERyYXco
KTsKKyAgICBpZiAobV9yZW5kZXJlclR5cGUgPT0gR3JhcGhpY3NDb250ZXh0OjpCaXRtYXBSZW5k
ZXJpbmdDb250ZXh0VHlwZTo6R1BVTWVtb3J5KQorICAgICAgICBiZWdpbkRyYXcoKTsKIH0KIAot
Q09NUHRyPElEMkQxU29saWRDb2xvckJydXNoPiBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGU6OmJydXNoV2l0aENvbG9yKGNvbnN0IEQyRDFfQ09MT1JfRiYgY29sb3IpCitHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGU6On5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQog
ewotICAgIFJHQkEzMiBjb2xvcktleSA9IG1ha2VSR0JBMzJGcm9tRmxvYXRzKGNvbG9yLnIsIGNv
bG9yLmcsIGNvbG9yLmIsIGNvbG9yLmEpOwotCi0gICAgaWYgKCFjb2xvcktleSkgewotICAgICAg
ICBpZiAoIW1femVyb0JydXNoKQotICAgICAgICAgICAgbV9yZW5kZXJUYXJnZXQtPkNyZWF0ZVNv
bGlkQ29sb3JCcnVzaChjb2xvciwgJm1femVyb0JydXNoKTsKLSAgICAgICAgcmV0dXJuIG1femVy
b0JydXNoOwotICAgIH0KLQotICAgIGlmIChjb2xvcktleSA9PSAweEZGRkZGRkZGKSB7Ci0gICAg
ICAgIGlmICghbV93aGl0ZUJydXNoKQotICAgICAgICAgICAgbV9yZW5kZXJUYXJnZXQtPkNyZWF0
ZVNvbGlkQ29sb3JCcnVzaChjb2xvciwgJm1fd2hpdGVCcnVzaCk7Ci0gICAgICAgIHJldHVybiBt
X3doaXRlQnJ1c2g7Ci0gICAgfQotCi0gICAgYXV0byBleGlzdGluZ0JydXNoID0gbV9zb2xpZENv
bG9yZWRCcnVzaENhY2hlLmVuc3VyZShjb2xvcktleSwgW3RoaXMsIGNvbG9yXSB7Ci0gICAgICAg
IENPTVB0cjxJRDJEMVNvbGlkQ29sb3JCcnVzaD4gY29sb3JCcnVzaDsKLSAgICAgICAgbV9yZW5k
ZXJUYXJnZXQtPkNyZWF0ZVNvbGlkQ29sb3JCcnVzaChjb2xvciwgJmNvbG9yQnJ1c2gpOwotICAg
ICAgICByZXR1cm4gY29sb3JCcnVzaDsKLSAgICB9KTsKKyAgICBpZiAoIW1fcGxhdGZvcm1Db250
ZXh0LnJlbmRlclRhcmdldCgpKQorICAgICAgICByZXR1cm47CiAKLSAgICByZXR1cm4gZXhpc3Rp
bmdCcnVzaC5pdGVyYXRvci0+dmFsdWU7CisgICAgaWYgKGJlZ2luRHJhd0NvdW50KQorICAgICAg
ICBlbmREcmF3KCk7CiB9CiAKIElEMkQxU29saWRDb2xvckJydXNoKiBHcmFwaGljc0NvbnRleHQ6
OmJydXNoV2l0aENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKIHsKLSAgICByZXR1cm4gbV9kYXRh
LT5icnVzaFdpdGhDb2xvcihjb2xvcldpdGhHbG9iYWxBbHBoYShjb2xvcikpLmdldCgpOworICAg
IEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgcmV0dXJuIHBsYXRmb3JtQ29udGV4
dCgpLT5icnVzaFdpdGhDb2xvcihjb2xvcldpdGhHbG9iYWxBbHBoYShjb2xvcikpLmdldCgpOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChjb25zdCBGbG9h
dFJlY3QmIHJlY3QpCiB7Ci0gICAgaWYgKG1fcmVuZGVyU3RhdGVzLmlzRW1wdHkoKSkKLSAgICAg
ICAgc2F2ZSgpOwotCi0gICAgbV9yZW5kZXJUYXJnZXQtPlB1c2hBeGlzQWxpZ25lZENsaXAocmVj
dCwgRDJEMV9BTlRJQUxJQVNfTU9ERV9QRVJfUFJJTUlUSVZFKTsKLSAgICBtX3JlbmRlclN0YXRl
cy5sYXN0KCkubV9jbGlwcy5hcHBlbmQoR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpB
eGlzQWxpZ25lZENsaXApOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZTo6Y2xpcChjb25zdCBQYXRoJiBwYXRoKQogewotICAgIGNsaXAocGF0aC5wbGF0Zm9ybVBhdGgo
KSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjbGlwKElEMkQx
R2VvbWV0cnkqIHBhdGgpCiB7Ci0gICAgQVNTRVJUKG1fcmVuZGVyU3RhdGVzLnNpemUoKSk7Ci0g
ICAgaWYgKCFtX3JlbmRlclN0YXRlcy5zaXplKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIENP
TVB0cjxJRDJEMUxheWVyPiBjbGlwTGF5ZXI7Ci0gICAgSFJFU1VMVCBociA9IG1fcmVuZGVyVGFy
Z2V0LT5DcmVhdGVMYXllcigmY2xpcExheWVyKTsKLSAgICBBU1NFUlQoU1VDQ0VFREVEKGhyKSk7
Ci0gICAgaWYgKCFTVUNDRUVERUQoaHIpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3JlbmRl
clRhcmdldC0+UHVzaExheWVyKEQyRDE6OkxheWVyUGFyYW1ldGVycyhEMkQxOjpJbmZpbml0ZVJl
Y3QoKSwgcGF0aCksIGNsaXBMYXllci5nZXQoKSk7Ci0gICAgbV9yZW5kZXJTdGF0ZXMubGFzdCgp
Lm1fY2xpcHMuYXBwZW5kKEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6TGF5ZXJDbGlw
KTsKLSAgICBtX3JlbmRlclN0YXRlcy5sYXN0KCkubV9hY3RpdmVMYXllciA9IGNsaXBMYXllcjsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTShjb25z
dCBBZmZpbmVUcmFuc2Zvcm0mIGFmZmluZVRyYW5zZm9ybSkKIHsKLSAgICBBU1NFUlQobV9yZW5k
ZXJUYXJnZXQuZ2V0KCkpOwotCi0gICAgRDJEMV9NQVRSSVhfM1gyX0YgY3VycmVudFRyYW5zZm9y
bTsKLSAgICBtX3JlbmRlclRhcmdldC0+R2V0VHJhbnNmb3JtKCZjdXJyZW50VHJhbnNmb3JtKTsK
LQotICAgIEQyRDFfTUFUUklYXzNYMl9GIHRyYW5zZm9ybVRvQ29uY2F0ID0gYWZmaW5lVHJhbnNm
b3JtOwotICAgIG1fcmVuZGVyVGFyZ2V0LT5TZXRUcmFuc2Zvcm0odHJhbnNmb3JtVG9Db25jYXQg
KiBjdXJyZW50VHJhbnNmb3JtKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGU6OmZsdXNoKCkKIHsKLSAgICBBU1NFUlQobV9yZW5kZXJUYXJnZXQuZ2V0KCkpOwotICAg
IEQyRDFfVEFHIGZpcnN0LCBzZWNvbmQ7Ci0gICAgSFJFU1VMVCBociA9IG1fcmVuZGVyVGFyZ2V0
LT5GbHVzaCgmZmlyc3QsICZzZWNvbmQpOwotCi0gICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVE
KGhyKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpiZWdpbkRy
YXcoKQogewotICAgIEFTU0VSVChtX3JlbmRlclRhcmdldC5nZXQoKSk7Ci0gICAgbV9yZW5kZXJU
YXJnZXQtPkJlZ2luRHJhdygpOworICAgIEFTU0VSVChtX3BsYXRmb3JtQ29udGV4dC5yZW5kZXJU
YXJnZXQoKSk7CisgICAgbV9wbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPkJlZ2luRHJh
dygpOwogICAgICsrYmVnaW5EcmF3Q291bnQ7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlOjplbmREcmF3KCkKIHsKLSAgICBBU1NFUlQobV9yZW5kZXJUYXJnZXQuZ2V0
KCkpOworICAgIEFTU0VSVChtX3BsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQoKSk7CiAgICAg
RDJEMV9UQUcgZmlyc3QsIHNlY29uZDsKLSAgICBIUkVTVUxUIGhyID0gbV9yZW5kZXJUYXJnZXQt
PkVuZERyYXcoJmZpcnN0LCAmc2Vjb25kKTsKKyAgICBIUkVTVUxUIGhyID0gbV9wbGF0Zm9ybUNv
bnRleHQucmVuZGVyVGFyZ2V0KCktPkVuZERyYXcoJmZpcnN0LCAmc2Vjb25kKTsKIAogICAgIGlm
ICghU1VDQ0VFREVEKGhyKSkKICAgICAgICAgV1RGTG9nQWx3YXlzKCJGYWlsZWQgaW4gR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjplbmREcmF3OiBocj0leGQsIGZpcnN0PSVsZCwgc2Vj
b25kPSVsZCIsIGhyLCBmaXJzdCwgc2Vjb25kKTsKQEAgLTQ2NSw2OCArMzY1LDI4IEBAIHZvaWQg
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjplbmQKIAogdm9pZCBHcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGU6OnJlc3RvcmUoKQogewotICAgIEFTU0VSVChtX3JlbmRlclRhcmdl
dC5nZXQoKSk7Ci0KLSAgICBhdXRvIHJlc3RvcmVTdGF0ZSA9IG1fcmVuZGVyU3RhdGVzLnRha2VM
YXN0KCk7Ci0gICAgbV9yZW5kZXJUYXJnZXQtPlJlc3RvcmVEcmF3aW5nU3RhdGUocmVzdG9yZVN0
YXRlLm1fZHJhd2luZ1N0YXRlQmxvY2suZ2V0KCkpOwotCi0gICAgZm9yIChhdXRvIGNsaXBUeXBl
ID0gcmVzdG9yZVN0YXRlLm1fY2xpcHMucmJlZ2luKCk7IGNsaXBUeXBlICE9IHJlc3RvcmVTdGF0
ZS5tX2NsaXBzLnJlbmQoKTsgKytjbGlwVHlwZSkgewotICAgICAgICBpZiAoKmNsaXBUeXBlID09
IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6QXhpc0FsaWduZWRDbGlwKQotICAgICAg
ICAgICAgbV9yZW5kZXJUYXJnZXQtPlBvcEF4aXNBbGlnbmVkQ2xpcCgpOwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBtX3JlbmRlclRhcmdldC0+UG9wTGF5ZXIoKTsKLSAgICB9CiB9CiAKIHZv
aWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzYXZlKCkKIHsKLSAgICBBU1NFUlQo
bV9yZW5kZXJUYXJnZXQuZ2V0KCkpOwotCi0gICAgUmVuZGVyU3RhdGUgY3VycmVudFN0YXRlOwot
ICAgIEdyYXBoaWNzQ29udGV4dDo6c3lzdGVtRmFjdG9yeSgpLT5DcmVhdGVEcmF3aW5nU3RhdGVC
bG9jaygmY3VycmVudFN0YXRlLm1fZHJhd2luZ1N0YXRlQmxvY2spOwotCi0gICAgbV9yZW5kZXJU
YXJnZXQtPlNhdmVEcmF3aW5nU3RhdGUoY3VycmVudFN0YXRlLm1fZHJhd2luZ1N0YXRlQmxvY2su
Z2V0KCkpOwotCi0gICAgbV9yZW5kZXJTdGF0ZXMuYXBwZW5kKGN1cnJlbnRTdGF0ZSk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzY2FsZShjb25zdCBGbG9hdFNp
emUmIHNpemUpCiB7Ci0gICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgpKTsKLQotICAgIEQy
RDFfTUFUUklYXzNYMl9GIGN1cnJlbnRUcmFuc2Zvcm07Ci0gICAgbV9yZW5kZXJUYXJnZXQtPkdl
dFRyYW5zZm9ybSgmY3VycmVudFRyYW5zZm9ybSk7Ci0KLSAgICBhdXRvIHNjYWxlID0gRDJEMTo6
TWF0cml4M3gyRjo6U2NhbGUoc2l6ZSk7Ci0gICAgbV9yZW5kZXJUYXJnZXQtPlNldFRyYW5zZm9y
bShzY2FsZSAqIGN1cnJlbnRUcmFuc2Zvcm0pOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZTo6c2V0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQog
ewotICAgIEFTU0VSVChtX3JlbmRlclRhcmdldC5nZXQoKSk7Ci0gICAgbV9yZW5kZXJUYXJnZXQt
PlNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAgIEFTU0VSVChtX3BsYXRmb3JtQ29udGV4dC5y
ZW5kZXJUYXJnZXQoKSk7CisgICAgbV9wbGF0Zm9ybUNvbnRleHQucmVuZGVyVGFyZ2V0KCktPlNl
dFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZTo6dHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHkpCiB7Ci0gICAgQVNTRVJUKG1fcmVu
ZGVyVGFyZ2V0LmdldCgpKTsKLQotICAgIEQyRDFfTUFUUklYXzNYMl9GIGN1cnJlbnRUcmFuc2Zv
cm07Ci0gICAgbV9yZW5kZXJUYXJnZXQtPkdldFRyYW5zZm9ybSgmY3VycmVudFRyYW5zZm9ybSk7
Ci0KLSAgICBhdXRvIHRyYW5zbGF0aW9uID0gRDJEMTo6TWF0cml4M3gyRjo6VHJhbnNsYXRpb24o
eCwgeSk7Ci0gICAgbV9yZW5kZXJUYXJnZXQtPlNldFRyYW5zZm9ybSh0cmFuc2xhdGlvbiAqIGN1
cnJlbnRUcmFuc2Zvcm0pOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZTo6cm90YXRlKGZsb2F0IGFuZ2xlKQogewotICAgIEFTU0VSVChtX3JlbmRlclRhcmdldC5nZXQo
KSk7Ci0KLSAgICBEMkQxX01BVFJJWF8zWDJfRiBjdXJyZW50VHJhbnNmb3JtOwotICAgIG1fcmVu
ZGVyVGFyZ2V0LT5HZXRUcmFuc2Zvcm0oJmN1cnJlbnRUcmFuc2Zvcm0pOwotCi0gICAgYXV0byBy
b3RhdGlvbiA9IEQyRDE6Ok1hdHJpeDN4MkY6OlJvdGF0aW9uKHJhZDJkZWcoYW5nbGUpKTsKLSAg
ICBtX3JlbmRlclRhcmdldC0+U2V0VHJhbnNmb3JtKHJvdGF0aW9uICogY3VycmVudFRyYW5zZm9y
bSk7CiB9CiAKIEQyRDFfQ09MT1JfRiBHcmFwaGljc0NvbnRleHQ6OmNvbG9yV2l0aEdsb2JhbEFs
cGhhKGNvbnN0IENvbG9yJiBjb2xvcikgY29uc3QKQEAgLTUzOSwyMiArMzk5LDIyIEBAIEQyRDFf
Q09MT1JfRiBHcmFwaGljc0NvbnRleHQ6OmNvbG9yV2l0aEcKIAogSUQyRDFCcnVzaCogR3JhcGhp
Y3NDb250ZXh0Ojpzb2xpZFN0cm9rZUJydXNoKCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV9kYXRh
LT5tX3NvbGlkU3Ryb2tlQnJ1c2guZ2V0KCk7CisgICAgcmV0dXJuIHBsYXRmb3JtQ29udGV4dCgp
LT5tX3NvbGlkU3Ryb2tlQnJ1c2guZ2V0KCk7CiB9CiAKIElEMkQxQnJ1c2gqIEdyYXBoaWNzQ29u
dGV4dDo6c29saWRGaWxsQnJ1c2goKSBjb25zdAogewotICAgIHJldHVybiBtX2RhdGEtPm1fc29s
aWRGaWxsQnJ1c2guZ2V0KCk7CisgICAgcmV0dXJuIHBsYXRmb3JtQ29udGV4dCgpLT5tX3NvbGlk
RmlsbEJydXNoLmdldCgpOwogfQogCiBJRDJEMUJydXNoKiBHcmFwaGljc0NvbnRleHQ6OnBhdHRl
cm5TdHJva2VCcnVzaCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fZGF0YS0+bV9wYXR0ZXJuU3Ry
b2tlQnJ1c2guZ2V0KCk7CisgICAgcmV0dXJuIHBsYXRmb3JtQ29udGV4dCgpLT5tX3BhdHRlcm5T
dHJva2VCcnVzaC5nZXQoKTsKIH0KIAogSUQyRDFCcnVzaCogR3JhcGhpY3NDb250ZXh0OjpwYXR0
ZXJuRmlsbEJydXNoKCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV9kYXRhLT5tX3BhdHRlcm5GaWxs
QnJ1c2guZ2V0KCk7CisgICAgcmV0dXJuIHBsYXRmb3JtQ29udGV4dCgpLT5tX3BhdHRlcm5GaWxs
QnJ1c2guZ2V0KCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdpbkRyYXcoKQpAQCAt
NTY5LDc1ICs0MjksMjMgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmVuZERyYXcoKQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDo6Zmx1c2goKQogewotICAgIG1fZGF0YS0+Zmx1c2goKTsKKyAgICBB
U1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpmbHVzaCgqcGxhdGZv
cm1Db250ZXh0KCkpOwogfQogCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1BhdHRlcm4oSW1h
Z2UmIGltYWdlLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHRp
bGVSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zvcm0sIGNvbnN0IEZs
b2F0UG9pbnQmIHBoYXNlLCBjb25zdCBGbG9hdFNpemUmIHNwYWNpbmcsIENvbXBvc2l0ZU9wZXJh
dG9yIG9wLCBCbGVuZE1vZGUgYmxlbmRNb2RlKQordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdQ
YXR0ZXJuKEltYWdlJiBpbWFnZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxv
YXRSZWN0JiB0aWxlUmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3Jt
LCBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgY29uc3QgRmxvYXRTaXplJiBzcGFjaW5nLCBDb21w
b3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlIGJsZW5kTW9kZSkKIHsK
ICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpIHx8ICFwYXR0ZXJuVHJhbnNmb3JtLmlzSW52ZXJ0
aWJsZSgpKQogICAgICAgICByZXR1cm47CiAKICAgICBpZiAobV9pbXBsKSB7Ci0gICAgICAgIG1f
aW1wbC0+ZHJhd1BhdHRlcm4oaW1hZ2UsIGRlc3RSZWN0LCB0aWxlUmVjdCwgcGF0dGVyblRyYW5z
Zm9ybSwgcGhhc2UsIHNwYWNpbmcsIG9wLCBibGVuZE1vZGUpOworICAgICAgICBtX2ltcGwtPmRy
YXdQYXR0ZXJuKGltYWdlLCBkZXN0UmVjdCwgdGlsZVJlY3QsIHBhdHRlcm5UcmFuc2Zvcm0sIHBo
YXNlLCBzcGFjaW5nLCBjb21wb3NpdGVPcGVyYXRvciwgYmxlbmRNb2RlKTsKICAgICAgICAgcmV0
dXJuOwogICAgIH0KIAotICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotICAg
IEQyRENvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSk7Ci0KLSAgICBtX2RhdGEt
PmNsaXAoZGVzdFJlY3QpOwotCi0gICAgc2V0UGxhdGZvcm1Db21wb3NpdGVPcGVyYXRpb24ob3As
IGJsZW5kTW9kZSk7Ci0KLSAgICBhdXRvIGJpdG1hcEJydXNoUHJvcGVydGllcyA9IEQyRDE6OkJp
dG1hcEJydXNoUHJvcGVydGllcygpOwotICAgIGJpdG1hcEJydXNoUHJvcGVydGllcy5leHRlbmRN
b2RlWCA9IEQyRDFfRVhURU5EX01PREVfV1JBUDsKLSAgICBiaXRtYXBCcnVzaFByb3BlcnRpZXMu
ZXh0ZW5kTW9kZVkgPSBEMkQxX0VYVEVORF9NT0RFX1dSQVA7Ci0KLSAgICAvLyBDcmVhdGUgYSBi
cnVzaCB0cmFuc2Zvcm1hdGlvbiBzbyB3ZSBwYWludCB1c2luZyB0aGUgc2VjdGlvbiBvZiB0aGUg
aW1hZ2Ugd2UgY2FyZSBhYm91dC4KLSAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtYXRpb24g
PSBwYXR0ZXJuVHJhbnNmb3JtOwotICAgIHRyYW5zZm9ybWF0aW9uLnRyYW5zbGF0ZShkZXN0UmVj
dC5sb2NhdGlvbigpKTsKLQotICAgIGF1dG8gYnJ1c2hQcm9wZXJ0aWVzID0gRDJEMTo6QnJ1c2hQ
cm9wZXJ0aWVzKCk7Ci0gICAgYnJ1c2hQcm9wZXJ0aWVzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybWF0
aW9uOwotICAgIGJydXNoUHJvcGVydGllcy5vcGFjaXR5ID0gMS4wZjsKLQotICAgIGF1dG8gdGls
ZUltYWdlID0gaW1hZ2UubmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKLQotICAgIC8vIElm
IHdlIG9ubHkgd2FudCBhIHN1YnNldCBvZiB0aGUgYml0bWFwLCB3ZSBuZWVkIHRvIGNyZWF0ZSBh
IGNyb3BwZWQgYml0bWFwIGltYWdlLiBBY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50YXRpb24sCi0g
ICAgLy8gdGhpcyBkb2VzIG5vdCBhbGxvY2F0ZSBuZXcgYml0bWFwIG1lbW9yeS4KLSAgICBpZiAo
aW1hZ2Uud2lkdGgoKSA+IGRlc3RSZWN0LndpZHRoKCkgfHwgaW1hZ2UuaGVpZ2h0KCkgPiBkZXN0
UmVjdC5oZWlnaHQoKSkgewotICAgICAgICBBU1NFUlQoMCk7Ci0gICAgICAgIC8qCi0gICAgICAg
IGZsb2F0IGRwaVggPSAwOwotICAgICAgICBmbG9hdCBkcGlZID0gMDsKLSAgICAgICAgdGlsZUlt
YWdlLT5HZXREcGkoJmRwaVgsICZkcGlZKTsKLSAgICAgICAgYXV0byBiaXRtYXBQcm9wZXJ0aWVz
ID0gRDJEMTo6Qml0bWFwUHJvcGVydGllcyh0aWxlSW1hZ2UtPkdldFBpeGVsRm9ybWF0KCksIGRw
aVgsIGRwaVkpOwotICAgICAgICBDT01QdHI8SUQyRDFCaXRtYXA+IHN1YkltYWdlOwotICAgICAg
ICBIUkVTVUxUIGhyID0gY29udGV4dC0+Q3JlYXRlQml0bWFwKEludFNpemUodGlsZVJlY3Quc2l6
ZSgpKSwgYml0bWFwUHJvcGVydGllcywgJnN1YkltYWdlKTsKLSAgICAgICAgaWYgKFNVQ0NFRURF
RChocikpIHsKLSAgICAgICAgICAgIEQyRDFfUkVDVF9VIGZpbmlzaFJlY3QgPSBJbnRSZWN0KHRp
bGVSZWN0KTsKLSAgICAgICAgICAgIGhyID0gc3ViSW1hZ2UtPkNvcHlGcm9tQml0bWFwKG51bGxw
dHIsIHRpbGVJbWFnZS5nZXQoKSwgJmZpbmlzaFJlY3QpOwotICAgICAgICAgICAgaWYgKFNVQ0NF
RURFRChocikpCi0gICAgICAgICAgICAgICAgdGlsZUltYWdlID0gc3ViSW1hZ2U7Ci0gICAgICAg
IH0KLSAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBDT01QdHI8SUQyRDFCaXRtYXA+IGJpdG1hcDsK
LSAgICBIUkVTVUxUIGhyID0gY29udGV4dC0+Q3JlYXRlQml0bWFwRnJvbVdpY0JpdG1hcCh0aWxl
SW1hZ2UuZ2V0KCksIG51bGxwdHIsICZiaXRtYXApOwotICAgIGlmICghU1VDQ0VFREVEKGhyKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgQ09NUHRyPElEMkQxQml0bWFwQnJ1c2g+IHBhdHRlcm5C
cnVzaDsKLSAgICBociA9IGNvbnRleHQtPkNyZWF0ZUJpdG1hcEJydXNoKGJpdG1hcC5nZXQoKSwg
JmJpdG1hcEJydXNoUHJvcGVydGllcywgJmJydXNoUHJvcGVydGllcywgJnBhdHRlcm5CcnVzaCk7
Ci0gICAgQVNTRVJUKFNVQ0NFRURFRChocikpOwotICAgIGlmICghU1VDQ0VFREVEKGhyKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgZHJhd1dpdGhvdXRTaGFkb3coZGVzdFJlY3QsIFt0aGlzLCBk
ZXN0UmVjdCwgcGF0dGVybkJydXNoXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7
Ci0gICAgICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSBkZXN0UmVjdDsKLSAgICAgICAg
cmVuZGVyVGFyZ2V0LT5GaWxsUmVjdGFuZ2xlKCZkMmRSZWN0LCBwYXR0ZXJuQnJ1c2guZ2V0KCkp
OwotICAgIH0pOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgaWYgKGF1
dG8gdGlsZUltYWdlID0gaW1hZ2UubmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKSkKKyAgICAg
ICAgRGlyZWN0MkQ6OmRyYXdQYXR0ZXJuKCpwbGF0Zm9ybUNvbnRleHQoKSwgdGlsZUltYWdlLmdl
dCgpLCBJbnRTaXplKGltYWdlLnNpemUoKSksIGRlc3RSZWN0LCB0aWxlUmVjdCwgcGF0dGVyblRy
YW5zZm9ybSwgcGhhc2UsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDo6Y2xpcFRvSW1hZ2VCdWZmZXIoSW1hZ2VCdWZmZXImIGJ1ZmZlciwg
Y29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCkKQEAgLTY2MCwxNzIgKzQ2OCw2MyBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZHJhd1JlY3QoY29uc3QgRmxvCiAgICAgICAgIHJldHVybjsKICAgICB9
CiAKLSAgICAvLyBGSVhNRTogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYW5kbGUgcGF0dGVybnMg
YW5kIGdyYWRpZW50cyBsaWtlIGRyYXdQYXRoIGRvZXMsIGl0IHByb2JhYmx5IHNob3VsZC4KICAg
ICBBU1NFUlQoIXJlY3QuaXNFbXB0eSgpKTsKLQotICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3Jt
Q29udGV4dCgpOwotCi0gICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAgICBk
cmF3V2l0aG91dFNoYWRvdyhyZWN0LCBbdGhpcywgcmVjdF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJl
bmRlclRhcmdldCkgewotICAgICAgICBjb25zdCBEMkQxX1JFQ1RfRiBkMmRSZWN0ID0gcmVjdDsK
LSAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsUmVjdGFuZ2xlKCZkMmRSZWN0LCBzb2xpZEZpbGxC
cnVzaCgpKTsKLSAgICAgICAgcmVuZGVyVGFyZ2V0LT5EcmF3UmVjdGFuZ2xlKCZkMmRSZWN0LCBz
b2xpZFN0cm9rZUJydXNoKCksIHN0cm9rZVRoaWNrbmVzcygpLCBtX2RhdGEtPnN0cm9rZVN0eWxl
KCkpOwotICAgIH0pOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgYXV0
byYgc3RhdGUgPSB0aGlzLT5zdGF0ZSgpOworICAgIERpcmVjdDJEOjpkcmF3UmVjdCgqcGxhdGZv
cm1Db250ZXh0KCksIHJlY3QsIGJvcmRlclRoaWNrbmVzcywgc3RhdGUuZmlsbENvbG9yLCBzdGF0
ZS5zdHJva2VTdHlsZSwgc3RhdGUuc3Ryb2tlQ29sb3IpOwogfQogCi12b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2V0TGluZUNhcChMaW5lQ2FwIGNhcCkKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzZXRMaW5lQ2FwKExpbmVDYXApCiB7Ci0gICAgaWYg
KG1fbGluZUNhcCA9PSBjYXApCi0gICAgICAgIHJldHVybjsKLQotICAgIEQyRDFfQ0FQX1NUWUxF
IGNhcFN0eWxlID0gRDJEMV9DQVBfU1RZTEVfRkxBVDsKLSAgICBzd2l0Y2ggKGNhcCkgewotICAg
IGNhc2UgUm91bmRDYXA6Ci0gICAgICAgIGNhcFN0eWxlID0gRDJEMV9DQVBfU1RZTEVfUk9VTkQ7
Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU3F1YXJlQ2FwOgotICAgICAgICBjYXBTdHlsZSA9
IEQyRDFfQ0FQX1NUWUxFX1NRVUFSRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCdXR0Q2Fw
OgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNhcFN0eWxlID0gRDJEMV9DQVBfU1RZTEVfRkxBVDsK
LSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbV9saW5lQ2FwID0gY2FwU3R5bGU7Ci0gICAg
bV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7CiB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlOjpzZXRMaW5lSm9pbihMaW5lSm9pbiBqb2luKQordm9pZCBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGU6OnNldExpbmVKb2luKExpbmVKb2luKQogewotICAgIGlmICht
X2xpbmVKb2luID09IGpvaW4pCi0gICAgICAgIHJldHVybjsKLQotICAgIEQyRDFfTElORV9KT0lO
IGpvaW5TdHlsZSA9IEQyRDFfTElORV9KT0lOX01JVEVSOwotICAgIHN3aXRjaCAoam9pbikgewot
ICAgIGNhc2UgUm91bmRKb2luOgotICAgICAgICBqb2luU3R5bGUgPSBEMkQxX0xJTkVfSk9JTl9S
T1VORDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCZXZlbEpvaW46Ci0gICAgICAgIGpvaW5T
dHlsZSA9IEQyRDFfTElORV9KT0lOX0JFVkVMOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1p
dGVySm9pbjoKLSAgICBkZWZhdWx0OgotICAgICAgICBqb2luU3R5bGUgPSBEMkQxX0xJTkVfSk9J
Tl9NSVRFUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbV9saW5lSm9pbiA9IGpvaW5T
dHlsZTsKLSAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKIH0KIAotdm9pZCBHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNldFN0cm9rZVN0eWxlKFN0cm9rZVN0eWxlIHN0cm9r
ZVN0eWxlKQordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNldFN0cm9rZVN0
eWxlKFN0cm9rZVN0eWxlKQogewotICAgIGlmIChtX3N0cm9rZVN0eWxlID09IHN0cm9rZVN0eWxl
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3N0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGU7Ci0g
ICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjpzZXRNaXRlckxpbWl0KGZsb2F0IGNhbnZhc01pdGVyTGltaXQpCiB7
Ci0gICAgLy8gRGlyZWN0MkQgbWl0ZXIgbGltaXQgaXMgaW4gdGVybXMgb2YgSEFMRiB0aGUgbGlu
ZSB0aGlja25lc3MuCi0gICAgZmxvYXQgbWl0ZXJMaW1pdCA9IDAuNWYgKiBjYW52YXNNaXRlckxp
bWl0OwotICAgIGlmIChXVEY6OmFyZUVzc2VudGlhbGx5RXF1YWwobWl0ZXJMaW1pdCwgbV9taXRl
ckxpbWl0KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9taXRlckxpbWl0ID0gbWl0ZXJMaW1p
dDsKLSAgICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKKyAgICBtX3BsYXRmb3JtQ29udGV4
dC5zZXREYXNoT2Zmc2V0KGNhbnZhc01pdGVyTGltaXQpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2V0RGFzaE9mZnNldChmbG9hdCBkYXNoT2Zmc2V0KQogewot
ICAgIGlmIChXVEY6OmFyZUVzc2VudGlhbGx5RXF1YWwoZGFzaE9mZnNldCwgbV9kYXNoT2Zmc2V0
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9kYXNoT2Zmc2V0ID0gZGFzaE9mZnNldDsKLSAg
ICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKKyAgICBtX3BsYXRmb3JtQ29udGV4dC5zZXRE
YXNoT2Zmc2V0KGRhc2hPZmZzZXQpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZTo6c2V0UGF0dGVybldpZHRoKGZsb2F0IHBhdHRlcm5XaWR0aCkKIHsKLSAgICBpZiAo
V1RGOjphcmVFc3NlbnRpYWxseUVxdWFsKHBhdHRlcm5XaWR0aCwgbV9wYXR0ZXJuV2lkdGgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBtX3BhdHRlcm5XaWR0aCA9IHBhdHRlcm5XaWR0aDsKLSAg
ICBtX3N0cm9rZVN5bGVJc0RpcnR5ID0gdHJ1ZTsKKyAgICBtX3BsYXRmb3JtQ29udGV4dC5zZXRQ
YXR0ZXJuV2lkdGgocGF0dGVybldpZHRoKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OnNldFBhdHRlcm5PZmZzZXQoZmxvYXQgcGF0dGVybk9mZnNldCkKIHsKLSAg
ICBpZiAoV1RGOjphcmVFc3NlbnRpYWxseUVxdWFsKHBhdHRlcm5PZmZzZXQsIG1fcGF0dGVybk9m
ZnNldCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcGF0dGVybk9mZnNldCA9IHBhdHRlcm5P
ZmZzZXQ7Ci0gICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7CisgICAgbV9wbGF0Zm9ybUNv
bnRleHQuc2V0UGF0dGVybk9mZnNldChwYXR0ZXJuT2Zmc2V0KTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNldFN0cm9rZVRoaWNrbmVzcyhmbG9hdCB0aGlja25l
c3MpCiB7Ci0gICAgaWYgKFdURjo6YXJlRXNzZW50aWFsbHlFcXVhbCh0aGlja25lc3MsIG1fc3Ry
b2tlVGhpY2tuZXNzKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9zdHJva2VUaGlja25lc3Mg
PSB0aGlja25lc3M7Ci0gICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7CisgICAgbV9wbGF0
Zm9ybUNvbnRleHQuc2V0U3Ryb2tlVGhpY2tuZXNzKHRoaWNrbmVzcyk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzZXREYXNoZXMoY29uc3QgRGFzaEFycmF5JiBk
YXNoZXMpCiB7Ci0gICAgaWYgKG1fZGFzaGVzID09IGRhc2hlcykKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgbV9kYXNoZXMgPSBkYXNoZXM7Ci0gICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7
CisgICAgbV9wbGF0Zm9ybUNvbnRleHQuc2V0RGFzaGVzKGRhc2hlcyk7CiB9CiAKIEQyRDFfU1RS
T0tFX1NUWUxFX1BST1BFUlRJRVMgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzdHJv
a2VTdHlsZVByb3BlcnRpZXMoKSBjb25zdAogewotICAgIHJldHVybiBEMkQxOjpTdHJva2VTdHls
ZVByb3BlcnRpZXMobV9saW5lQ2FwLCBtX2xpbmVDYXAsIG1fbGluZUNhcCwgbV9saW5lSm9pbiwg
bV9taXRlckxpbWl0LCBEMkQxX0RBU0hfU1RZTEVfU09MSUQsIDAuMGYpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cmVjb21wdXRlU3Ryb2tlU3R5bGUoKQotewot
ICAgIGlmICghbV9zdHJva2VTeWxlSXNEaXJ0eSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9k
MmRTdHJva2VTdHlsZSA9IG51bGxwdHI7Ci0KLSAgICBEYXNoQXJyYXkgZGFzaGVzOwotICAgIGZs
b2F0IHBhdHRlcm5PZmZzZXQgPSAwOwotICAgIGF1dG8gZGFzaFN0eWxlID0gRDJEMV9EQVNIX1NU
WUxFX1NPTElEOwotCi0gICAgaWYgKChtX3N0cm9rZVN0eWxlICE9IFNvbGlkU3Ryb2tlKSAmJiAo
bV9zdHJva2VTdHlsZSAhPSBOb1N0cm9rZSkpIHsKLSAgICAgICAgZGFzaFN0eWxlID0gRDJEMV9E
QVNIX1NUWUxFX0NVU1RPTTsKLSAgICAgICAgcGF0dGVybk9mZnNldCA9IG1fcGF0dGVybk9mZnNl
dCAvIG1fc3Ryb2tlVGhpY2tuZXNzOwotICAgICAgICBkYXNoZXMgPSBtX2Rhc2hlczsKLQotICAg
ICAgICAvLyBJbiBEaXJlY3QyRCwgZGFzaGVzIGFuZCBkb3RzIGFyZSBkZWZpbmVkIGluIHRlcm1z
IG9mIHRoZSByYXRpbyBvZiB0aGUgZGFzaCBsZW5ndGggdG8gdGhlIGxpbmUgdGhpY2tuZXNzLgot
ICAgICAgICBmb3IgKGF1dG8mIGRhc2ggOiBkYXNoZXMpCi0gICAgICAgICAgICBkYXNoIC89IG1f
c3Ryb2tlVGhpY2tuZXNzOwotICAgIH0KLQotICAgIGF1dG8gc3Ryb2tlU3R5bGVQcm9wZXJ0aWVz
ID0gRDJEMTo6U3Ryb2tlU3R5bGVQcm9wZXJ0aWVzKG1fbGluZUNhcCwgbV9saW5lQ2FwLCBtX2xp
bmVDYXAsIG1fbGluZUpvaW4sIG1fbWl0ZXJMaW1pdCwgZGFzaFN0eWxlLCBwYXR0ZXJuT2Zmc2V0
KTsKLSAgICBHcmFwaGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+Q3JlYXRlU3Ryb2tlU3R5
bGUoJnN0cm9rZVN0eWxlUHJvcGVydGllcywgZGFzaGVzLmRhdGEoKSwgZGFzaGVzLnNpemUoKSwg
Jm1fZDJkU3Ryb2tlU3R5bGUpOwotCi0gICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IGZhbHNlOwot
fQotCi1JRDJEMVN0cm9rZVN0eWxlKiBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnN0
cm9rZVN0eWxlKCkKLXsKLSAgICByZWNvbXB1dGVTdHJva2VTdHlsZSgpOwotICAgIHJldHVybiBt
X2QyZFN0cm9rZVN0eWxlLmdldCgpOworICAgIHJldHVybiBEMkQxOjpTdHJva2VTdHlsZVByb3Bl
cnRpZXMobV9wbGF0Zm9ybUNvbnRleHQubV9saW5lQ2FwLCBtX3BsYXRmb3JtQ29udGV4dC5tX2xp
bmVDYXAsIG1fcGxhdGZvcm1Db250ZXh0Lm1fbGluZUNhcCwgbV9wbGF0Zm9ybUNvbnRleHQubV9s
aW5lSm9pbiwgbV9wbGF0Zm9ybUNvbnRleHQubV9taXRlckxpbWl0LCBEMkQxX0RBU0hfU1RZTEVf
U09MSUQsIDAuMGYpOwogfQogCiBJRDJEMVN0cm9rZVN0eWxlKiBHcmFwaGljc0NvbnRleHQ6OnBs
YXRmb3JtU3Ryb2tlU3R5bGUoKSBjb25zdAogewotICAgIHJldHVybiBtX2RhdGEtPnN0cm9rZVN0
eWxlKCk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICByZXR1cm4gcGxh
dGZvcm1Db250ZXh0KCktPnN0cm9rZVN0eWxlKCk7CiB9CiAKIC8vIFRoaXMgaXMgb25seSB1c2Vk
IHRvIGRyYXcgYm9yZGVycy4KQEAgLTg0Miw1MiArNTQxLDkgQEAgdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmRyYXdMaW5lKGNvbnN0IEZsbwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgZmxv
YXQgdGhpY2tuZXNzID0gc3Ryb2tlVGhpY2tuZXNzKCk7Ci0gICAgYm9vbCBpc1ZlcnRpY2FsTGlu
ZSA9IChwb2ludDEueCgpICsgdGhpY2tuZXNzID09IHBvaW50Mi54KCkpOwotICAgIGZsb2F0IHN0
cm9rZVdpZHRoID0gaXNWZXJ0aWNhbExpbmUgPyBwb2ludDIueSgpIC0gcG9pbnQxLnkoKSA6IHBv
aW50Mi54KCkgLSBwb2ludDEueCgpOwotICAgIGlmICghdGhpY2tuZXNzIHx8ICFzdHJva2VXaWR0
aCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0
KCk7Ci0KLSAgICBTdHJva2VTdHlsZSBzdHJva2VTdHlsZSA9IHRoaXMtPnN0cm9rZVN0eWxlKCk7
Ci0gICAgZmxvYXQgY29ybmVyV2lkdGggPSAwOwotICAgIGJvb2wgZHJhd3NEYXNoZWRMaW5lID0g
c3Ryb2tlU3R5bGUgPT0gRG90dGVkU3Ryb2tlIHx8IHN0cm9rZVN0eWxlID09IERhc2hlZFN0cm9r
ZTsKLQotICAgIENPTVB0cjxJRDJEMVN0cm9rZVN0eWxlPiBkMmRTdHJva2VTdHlsZTsKLSAgICBE
MkRDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCptX2RhdGEsIGRyYXdzRGFzaGVkTGluZSk7
Ci0gICAgaWYgKGRyYXdzRGFzaGVkTGluZSkgewotICAgICAgICAvLyBGaWd1cmUgb3V0IGVuZCBw
b2ludHMgdG8gZW5zdXJlIHdlIGFsd2F5cyBwYWludCBjb3JuZXJzLgotICAgICAgICBjb3JuZXJX
aWR0aCA9IGRhc2hlZExpbmVDb3JuZXJXaWR0aEZvclN0cm9rZVdpZHRoKHN0cm9rZVdpZHRoKTsK
LSAgICAgICAgc3Ryb2tlV2lkdGggLT0gMiAqIGNvcm5lcldpZHRoOwotICAgICAgICBmbG9hdCBw
YXR0ZXJuV2lkdGggPSBkYXNoZWRMaW5lUGF0dGVybldpZHRoRm9yU3Ryb2tlV2lkdGgoc3Ryb2tl
V2lkdGgpOwotICAgICAgICAvLyBDaGVjayBpZiBjb3JuZXIgZHJhd2luZyBzdWZmaWNpZW50bHkg
Y292ZXJzIHRoZSBsaW5lLgotICAgICAgICBpZiAoc3Ryb2tlV2lkdGggPD0gcGF0dGVybldpZHRo
ICsgMSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBmbG9hdCBwYXR0ZXJuT2Zmc2V0
ID0gZGFzaGVkTGluZVBhdHRlcm5PZmZzZXRGb3JQYXR0ZXJuQW5kU3Ryb2tlV2lkdGgocGF0dGVy
bldpZHRoLCBzdHJva2VXaWR0aCk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IGRhc2hlc1syXSA9IHsg
cGF0dGVybldpZHRoLCBwYXR0ZXJuV2lkdGggfTsKLSAgICAgICAgYXV0byBzdHJva2VTdHlsZVBy
b3BlcnRpZXMgPSBtX2RhdGEtPnN0cm9rZVN0eWxlUHJvcGVydGllcygpOwotICAgICAgICBHcmFw
aGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+Q3JlYXRlU3Ryb2tlU3R5bGUoJnN0cm9rZVN0
eWxlUHJvcGVydGllcywgZGFzaGVzLCBBUlJBWVNJWkUoZGFzaGVzKSwgJmQyZFN0cm9rZVN0eWxl
KTsKLQotICAgICAgICBtX2RhdGEtPnNldFBhdHRlcm5XaWR0aChwYXR0ZXJuV2lkdGgpOwotICAg
ICAgICBtX2RhdGEtPnNldFBhdHRlcm5PZmZzZXQocGF0dGVybk9mZnNldCk7Ci0gICAgICAgIG1f
ZGF0YS0+c2V0RGFzaGVzKERhc2hBcnJheSgyLCBwYXR0ZXJuV2lkdGgpKTsKLQotICAgICAgICBk
MmRTdHJva2VTdHlsZSA9IG1fZGF0YS0+c3Ryb2tlU3R5bGUoKTsKLSAgICB9Ci0KLSAgICBhdXRv
IGNlbnRlcmVkUG9pbnRzID0gY2VudGVyTGluZUFuZEN1dE9mZkNvcm5lcnMoaXNWZXJ0aWNhbExp
bmUsIGNvcm5lcldpZHRoLCBwb2ludDEsIHBvaW50Mik7Ci0gICAgYXV0byBwMSA9IGNlbnRlcmVk
UG9pbnRzWzBdOwotICAgIGF1dG8gcDIgPSBjZW50ZXJlZFBvaW50c1sxXTsKLQotICAgIGNvbnRl
eHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotCi0gICAgRmxvYXRSZWN0IGJvdW5kaW5nUmVjdChw
MSwgcDIpOwotCi0gICAgZHJhd1dpdGhvdXRTaGFkb3coYm91bmRpbmdSZWN0LCBbdGhpcywgcDEs
IHAyLCBkMmRTdHJva2VTdHlsZV0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewot
ICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdMaW5lKHAxLCBwMiwgc29saWRTdHJva2VCcnVzaCgp
LCBzdHJva2VUaGlja25lc3MoKSwgZDJkU3Ryb2tlU3R5bGUuZ2V0KCkpOwotICAgIH0pOworICAg
IEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgYXV0byYgc3RhdGUgPSB0aGlzLT5z
dGF0ZSgpOworICAgIERpcmVjdDJEOjpkcmF3TGluZSgqcGxhdGZvcm1Db250ZXh0KCksIHBvaW50
MSwgcG9pbnQyLCBzdGF0ZS5zdHJva2VTdHlsZSwgc3RhdGUuc3Ryb2tlQ29sb3IsIHN0YXRlLnN0
cm9rZVRoaWNrbmVzcywgc3RhdGUuc2hvdWxkQW50aWFsaWFzKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmRyYXdFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKQEAgLTkwMCwxNyAr
NTU2LDEwIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3RWxsaXBzZShjb25zdAogICAgICAg
ICByZXR1cm47CiAgICAgfQogCi0gICAgYXV0byBlbGxpcHNlID0gRDJEMTo6RWxsaXBzZShyZWN0
LmNlbnRlcigpLCAwLjUgKiByZWN0LndpZHRoKCksIDAuNSAqIHJlY3QuaGVpZ2h0KCkpOwogCi0g
ICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0KLSAgICBjb250ZXh0LT5TZXRU
YWdzKDEsIF9fTElORV9fKTsKLQotICAgIGRyYXdXaXRob3V0U2hhZG93KHJlY3QsIFt0aGlzLCBl
bGxpcHNlXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAgIHJlbmRl
clRhcmdldC0+RmlsbEVsbGlwc2UoJmVsbGlwc2UsIHNvbGlkRmlsbEJydXNoKCkpOwotCi0gICAg
ICAgIHJlbmRlclRhcmdldC0+RHJhd0VsbGlwc2UoJmVsbGlwc2UsIHNvbGlkU3Ryb2tlQnJ1c2go
KSwgc3Ryb2tlVGhpY2tuZXNzKCksIG1fZGF0YS0+c3Ryb2tlU3R5bGUoKSk7Ci0gICAgfSk7Cisg
ICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBhdXRvJiBzdGF0ZSA9IHRoaXMt
PnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmZpbGxFbGxpcHNlKCpwbGF0Zm9ybUNvbnRleHQoKSwg
cmVjdCwgc3RhdGUuZmlsbENvbG9yLCBzdGF0ZS5zdHJva2VTdHlsZSwgc3RhdGUuc3Ryb2tlQ29s
b3IsIHN0YXRlLnN0cm9rZVRoaWNrbmVzcyk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojph
cHBseVN0cm9rZVBhdHRlcm4oKQpAQCAtOTIyLDcgKzU3MSw3IEBAIHZvaWQgR3JhcGhpY3NDb250
ZXh0OjphcHBseVN0cm9rZVBhdHRlcm4KICAgICBBZmZpbmVUcmFuc2Zvcm0gdXNlclRvQmFzZUNU
TTsgLy8gRklYTUU6IFRoaXMgaXNuJ3QgcmVhbGx5IG5lZWRlZCBvbiBXaW5kb3dzCiAKICAgICBj
b25zdCBmbG9hdCBwYXR0ZXJuQWxwaGEgPSAxOwotICAgIG1fZGF0YS0+bV9wYXR0ZXJuU3Ryb2tl
QnJ1c2ggPSBhZG9wdENPTShtX3N0YXRlLnN0cm9rZVBhdHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0
dGVybigqdGhpcywgcGF0dGVybkFscGhhLCB1c2VyVG9CYXNlQ1RNKSk7CisgICAgcGxhdGZvcm1D
b250ZXh0KCktPm1fcGF0dGVyblN0cm9rZUJydXNoID0gYWRvcHRDT00obV9zdGF0ZS5zdHJva2VQ
YXR0ZXJuLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oKnRoaXMsIHBhdHRlcm5BbHBoYSwgdXNlclRv
QmFzZUNUTSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6YXBwbHlGaWxsUGF0dGVybigp
CkBAIC05MzQsNyArNTgzLDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmFwcGx5RmlsbFBhdHRl
cm4oKQogICAgIEFmZmluZVRyYW5zZm9ybSB1c2VyVG9CYXNlQ1RNOyAvLyBGSVhNRTogVGhpcyBp
c24ndCByZWFsbHkgbmVlZGVkIG9uIFdpbmRvd3MKIAogICAgIGNvbnN0IGZsb2F0IHBhdHRlcm5B
bHBoYSA9IDE7Ci0gICAgbV9kYXRhLT5tX3BhdHRlcm5GaWxsQnJ1c2ggPSBhZG9wdENPTShtX3N0
YXRlLmZpbGxQYXR0ZXJuLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oKnRoaXMsIHBhdHRlcm5BbHBo
YSwgdXNlclRvQmFzZUNUTSkpOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5tX3BhdHRlcm5GaWxs
QnJ1c2ggPSBhZG9wdENPTShtX3N0YXRlLmZpbGxQYXR0ZXJuLT5jcmVhdGVQbGF0Zm9ybVBhdHRl
cm4oKnRoaXMsIHBhdHRlcm5BbHBoYSwgdXNlclRvQmFzZUNUTSkpOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd1BhdGgoY29uc3QgUGF0aCYgcGF0aCkKQEAgLTk0NywxMDIgKzU5Niwx
MCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1BhdGgoY29uc3QgUGF0CiAgICAgICAgIHJl
dHVybjsKICAgICB9CiAKLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLSAg
ICBjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotCi0gICAgaWYg
KHN0YXRlLmZpbGxHcmFkaWVudCB8fCBzdGF0ZS5zdHJva2VHcmFkaWVudCkgewotICAgICAgICAv
LyBXZSBkb24ndCBoYXZlIGFueSBvcHRpbWl6ZWQgd2F5IHRvIGZpbGwgJiBzdHJva2UgYSBwYXRo
IHVzaW5nIGdyYWRpZW50cwotICAgICAgICAvLyBGSVhNRTogQmUgc21hcnRlciBhYm91dCB0aGlz
LgotICAgICAgICBmaWxsUGF0aChwYXRoKTsKLSAgICAgICAgc3Ryb2tlUGF0aChwYXRoKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChzdGF0ZS5maWxsUGF0dGVybikKLSAgICAg
ICAgYXBwbHlGaWxsUGF0dGVybigpOwotCi0gICAgaWYgKHN0YXRlLnN0cm9rZVBhdHRlcm4pCi0g
ICAgICAgIGFwcGx5U3Ryb2tlUGF0dGVybigpOwotCi0gICAgaWYgKHBhdGguYWN0aXZlUGF0aCgp
KQotICAgICAgICBwYXRoLmFjdGl2ZVBhdGgoKS0+Q2xvc2UoKTsKLQotICAgIGNvbnRleHQtPlNl
dFRhZ3MoMSwgX19MSU5FX18pOwotCi0gICAgYXV0byByZWN0ID0gcGF0aC5mYXN0Qm91bmRpbmdS
ZWN0KCk7Ci0gICAgZHJhd1dpdGhvdXRTaGFkb3cocmVjdCwgW3RoaXMsICZwYXRoXShJRDJEMVJl
bmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAgIGF1dG8gYnJ1c2ggPSBtX3N0YXRl
LnN0cm9rZVBhdHRlcm4gPyBwYXR0ZXJuU3Ryb2tlQnJ1c2goKSA6IHNvbGlkU3Ryb2tlQnJ1c2go
KTsKLSAgICAgICAgcmVuZGVyVGFyZ2V0LT5EcmF3R2VvbWV0cnkocGF0aC5wbGF0Zm9ybVBhdGgo
KSwgYnJ1c2gsIHN0cm9rZVRoaWNrbmVzcygpLCBtX2RhdGEtPnN0cm9rZVN0eWxlKCkpOwotICAg
IH0pOwotCi0gICAgZmx1c2goKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdXaXRo
b3V0U2hhZG93KGNvbnN0IEZsb2F0UmVjdCYgLypib3VuZGluZ1JlY3QqLywgY29uc3QgV1RGOjpG
dW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+JiBkcmF3Q29tbWFuZHMpCi17Ci0gICAg
ZHJhd0NvbW1hbmRzKHBsYXRmb3JtQ29udGV4dCgpKTsKLX0KLQotc3RhdGljIHZvaWQgZHJhd1dp
dGhTaGFkb3dIZWxwZXIoSUQyRDFSZW5kZXJUYXJnZXQqIGNvbnRleHQsIElEMkQxQml0bWFwKiBi
aXRtYXAsIGNvbnN0IENvbG9yJiBzaGFkb3dDb2xvciwgY29uc3QgRmxvYXRTaXplJiBzaGFkb3dP
ZmZzZXQsIGZsb2F0IHNoYWRvd0JsdXIpCi17Ci0gICAgQ09NUHRyPElEMkQxRGV2aWNlQ29udGV4
dD4gZGV2aWNlQ29udGV4dDsKLSAgICBIUkVTVUxUIGhyID0gY29udGV4dC0+UXVlcnlJbnRlcmZh
Y2UoJmRldmljZUNvbnRleHQpOwotICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOwot
Ci0gICAgLy8gQ3JlYXRlIHRoZSBzaGFkb3cgZWZmZWN0Ci0gICAgQ09NUHRyPElEMkQxRWZmZWN0
PiBzaGFkb3dFZmZlY3Q7Ci0gICAgaHIgPSBkZXZpY2VDb250ZXh0LT5DcmVhdGVFZmZlY3QoQ0xT
SURfRDJEMVNoYWRvdywgJnNoYWRvd0VmZmVjdCk7Ci0gICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VF
REVEKGhyKSk7Ci0KLSAgICBzaGFkb3dFZmZlY3QtPlNldElucHV0KDAsIGJpdG1hcCk7Ci0gICAg
c2hhZG93RWZmZWN0LT5TZXRWYWx1ZShEMkQxX1NIQURPV19QUk9QX0NPTE9SLCBzdGF0aWNfY2Fz
dDxEMkQxX1ZFQ1RPUl80Rj4oc2hhZG93Q29sb3IpKTsKLSAgICBzaGFkb3dFZmZlY3QtPlNldFZh
bHVlKEQyRDFfU0hBRE9XX1BST1BfQkxVUl9TVEFOREFSRF9ERVZJQVRJT04sIHNoYWRvd0JsdXIp
OwotCi0gICAgQ09NUHRyPElEMkQxRWZmZWN0PiB0cmFuc2Zvcm1FZmZlY3Q7Ci0gICAgaHIgPSBk
ZXZpY2VDb250ZXh0LT5DcmVhdGVFZmZlY3QoQ0xTSURfRDJEMTJEQWZmaW5lVHJhbnNmb3JtLCAm
dHJhbnNmb3JtRWZmZWN0KTsKLSAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKLQot
ICAgIHRyYW5zZm9ybUVmZmVjdC0+U2V0SW5wdXRFZmZlY3QoMCwgc2hhZG93RWZmZWN0LmdldCgp
KTsKLQotICAgIGF1dG8gdHJhbnNsYXRpb24gPSBEMkQxOjpNYXRyaXgzeDJGOjpUcmFuc2xhdGlv
bihzaGFkb3dPZmZzZXQud2lkdGgoKSwgc2hhZG93T2Zmc2V0LmhlaWdodCgpKTsKLSAgICB0cmFu
c2Zvcm1FZmZlY3QtPlNldFZhbHVlKEQyRDFfMkRBRkZJTkVUUkFOU0ZPUk1fUFJPUF9UUkFOU0ZP
Uk1fTUFUUklYLCB0cmFuc2xhdGlvbik7Ci0KLSAgICBDT01QdHI8SUQyRDFFZmZlY3Q+IGNvbXBv
c2l0b3I7Ci0gICAgaHIgPSBkZXZpY2VDb250ZXh0LT5DcmVhdGVFZmZlY3QoQ0xTSURfRDJEMUNv
bXBvc2l0ZSwgJmNvbXBvc2l0b3IpOwotICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikp
OwotCi0gICAgY29tcG9zaXRvci0+U2V0SW5wdXRFZmZlY3QoMCwgdHJhbnNmb3JtRWZmZWN0Lmdl
dCgpKTsKLSAgICBjb21wb3NpdG9yLT5TZXRJbnB1dCgxLCBiaXRtYXApOwotCi0gICAgLy8gRmxp
cCB0aGUgY29udGV4dAotICAgIEQyRDFfTUFUUklYXzNYMl9GIGN0bTsKLSAgICBkZXZpY2VDb250
ZXh0LT5HZXRUcmFuc2Zvcm0oJmN0bSk7Ci0gICAgYXV0byB0cmFuc2xhdGUgPSBEMkQxOjpNYXRy
aXgzeDJGOjpUcmFuc2xhdGlvbigwLjBmLCBkZXZpY2VDb250ZXh0LT5HZXRTaXplKCkuaGVpZ2h0
KTsKLSAgICBhdXRvIGZsaXAgPSBEMkQxOjpNYXRyaXgzeDJGOjpTY2FsZShEMkQxOjpTaXplRigx
LjBmLCAtMS4wZikpOwotICAgIGRldmljZUNvbnRleHQtPlNldFRyYW5zZm9ybShjdG0gKiBmbGlw
ICogdHJhbnNsYXRlKTsKLQotICAgIGRldmljZUNvbnRleHQtPkRyYXdJbWFnZShjb21wb3NpdG9y
LmdldCgpLCBEMkQxX0lOVEVSUE9MQVRJT05fTU9ERV9MSU5FQVIpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd1dpdGhTaGFkb3coY29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ1JlY3Qs
IGNvbnN0IFdURjo6RnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRhcmdldCopPiYgZHJhd0NvbW1h
bmRzKQotewotICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgLy8g
UmVuZGVyIHRoZSBjdXJyZW50IGdlb21ldHJ5IHRvIGEgYml0bWFwIGNvbnRleHQKLSAgICBDT01Q
dHI8SUQyRDFCaXRtYXBSZW5kZXJUYXJnZXQ+IGJpdG1hcFRhcmdldDsKLSAgICBIUkVTVUxUIGhy
ID0gY29udGV4dC0+Q3JlYXRlQ29tcGF0aWJsZVJlbmRlclRhcmdldCgmYml0bWFwVGFyZ2V0KTsK
LSAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKLQotICAgIGJpdG1hcFRhcmdldC0+
QmVnaW5EcmF3KCk7Ci0gICAgZHJhd0NvbW1hbmRzKGJpdG1hcFRhcmdldC5nZXQoKSk7Ci0gICAg
aHIgPSBiaXRtYXBUYXJnZXQtPkVuZERyYXcoKTsKLSAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVE
RUQoaHIpKTsKLQotICAgIENPTVB0cjxJRDJEMUJpdG1hcD4gYml0bWFwOwotICAgIGhyID0gYml0
bWFwVGFyZ2V0LT5HZXRCaXRtYXAoJmJpdG1hcCk7Ci0gICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VF
REVEKGhyKSk7Ci0KLSAgICBkcmF3V2l0aFNoYWRvd0hlbHBlcihjb250ZXh0LCBiaXRtYXAuZ2V0
KCksIG1fc3RhdGUuc2hhZG93Q29sb3IsIG1fc3RhdGUuc2hhZG93T2Zmc2V0LCBtX3N0YXRlLnNo
YWRvd0JsdXIpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgYXV0byYg
c3RhdGUgPSB0aGlzLT5zdGF0ZSgpOworICAgIGF1dG8mIGNvbnRleHQgPSAqcGxhdGZvcm1Db250
ZXh0KCk7CisgICAgRGlyZWN0MkQ6OmRyYXdQYXRoKGNvbnRleHQsIHBhdGgsIERpcmVjdDJEOjpT
dHJva2VTb3VyY2Uoc3RhdGUsIGNvbnRleHQpLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoc3RhdGUp
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxQYXRoKGNvbnN0IFBhdGgmIHBhdGgp
CkBAIC0xMDU1LDUwICs2MTIsMTAgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxQYXRoKGNv
bnN0IFBhdAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKHBhdGguYWN0aXZlUGF0
aCgpKSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIGNsb3NlZC4gVGhpcyBtaWdodCBmYWls
IGlmIHRoZSBwYXRoIHdhcyBhbHJlYWR5IGNsb3NlZCwgc28KLSAgICAgICAgLy8gaWdub3JlIHRo
ZSByZXR1cm4gdmFsdWUuCi0gICAgICAgIHBhdGguYWN0aXZlUGF0aCgpLT5DbG9zZSgpOwotICAg
IH0KLQotICAgIEQyRENvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSk7Ci0KLSAg
ICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIGNvbnRleHQtPlNldFRh
Z3MoMSwgX19MSU5FX18pOwotCi0gICAgaWYgKG1fc3RhdGUuZmlsbEdyYWRpZW50KSB7Ci0gICAg
ICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotCi0gICAgICAgIEZsb2F0UmVjdCBi
b3VuZGluZ1JlY3QgPSBwYXRoLmZhc3RCb3VuZGluZ1JlY3QoKTsKLSAgICAgICAgV1RGOjpGdW5j
dGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+IGRyYXdGdW5jdGlvbiA9IFt0aGlzLCAmcGF0
aF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewotICAgICAgICAgICAgcmVuZGVy
VGFyZ2V0LT5GaWxsR2VvbWV0cnkocGF0aC5wbGF0Zm9ybVBhdGgoKSwgbV9zdGF0ZS5maWxsR3Jh
ZGllbnQtPmNyZWF0ZVBsYXRmb3JtR3JhZGllbnRJZk5lY2Vzc2FyeShyZW5kZXJUYXJnZXQpKTsK
LSAgICAgICAgfTsKLQotICAgICAgICBpZiAoaGFzU2hhZG93KCkpCi0gICAgICAgICAgICBkcmF3
V2l0aFNoYWRvdyhib3VuZGluZ1JlY3QsIGRyYXdGdW5jdGlvbik7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIGRyYXdXaXRob3V0U2hhZG93KGJvdW5kaW5nUmVjdCwgZHJhd0Z1bmN0aW9uKTsK
LQotICAgICAgICBmbHVzaCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1f
c3RhdGUuZmlsbFBhdHRlcm4pCi0gICAgICAgIGFwcGx5RmlsbFBhdHRlcm4oKTsKLQotICAgIENP
TVB0cjxJRDJEMUdlb21ldHJ5R3JvdXA+IHBhdGhUb0ZpbGw7Ci0gICAgcGF0aC5jcmVhdGVHZW9t
ZXRyeVdpdGhGaWxsTW9kZShmaWxsUnVsZSgpLCBwYXRoVG9GaWxsKTsKLQotICAgIGNvbnRleHQt
PlNldFRhZ3MoMSwgX19MSU5FX18pOwotCi0gICAgRmxvYXRSZWN0IGNvbnRleHRSZWN0KEZsb2F0
UG9pbnQoKSwgY29udGV4dC0+R2V0U2l6ZSgpKTsKLSAgICBkcmF3V2l0aG91dFNoYWRvdyhjb250
ZXh0UmVjdCwgW3RoaXMsICZwYXRoVG9GaWxsXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFy
Z2V0KSB7Ci0gICAgICAgIGF1dG8gYnJ1c2ggPSBtX3N0YXRlLmZpbGxQYXR0ZXJuID8gcGF0dGVy
bkZpbGxCcnVzaCgpIDogc29saWRGaWxsQnJ1c2goKTsKLSAgICAgICAgcmVuZGVyVGFyZ2V0LT5G
aWxsR2VvbWV0cnkocGF0aFRvRmlsbC5nZXQoKSwgYnJ1c2gpOwotICAgIH0pOwotCi0gICAgZmx1
c2goKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIGF1dG8mIHN0YXRl
ID0gdGhpcy0+c3RhdGUoKTsKKyAgICBhdXRvJiBjb250ZXh0ID0gKnBsYXRmb3JtQ29udGV4dCgp
OworICAgIERpcmVjdDJEOjpmaWxsUGF0aChjb250ZXh0LCBwYXRoLCBEaXJlY3QyRDo6RmlsbFNv
dXJjZShzdGF0ZSwgY29udGV4dCksIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0ZSkpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUGF0aChjb25zdCBQYXRoJiBwYXRoKQpAQCAt
MTExMSw0MCArNjI4LDEwIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKGNvbnN0
IFAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3Jt
Q29udGV4dCgpOwotICAgIAotICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotCi0g
ICAgaWYgKG1fc3RhdGUuc3Ryb2tlR3JhZGllbnQpIHsKLSAgICAgICAgY29udGV4dC0+U2V0VGFn
cygxLCBfX0xJTkVfXyk7Ci0KLSAgICAgICAgRDJEQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZl
cigqbV9kYXRhKTsKLSAgICAgICAgYXV0byBib3VuZGluZ1JlY3QgPSBwYXRoLmZhc3RCb3VuZGlu
Z1JlY3QoKTsKLSAgICAgICAgV1RGOjpGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+
IGRyYXdGdW5jdGlvbiA9IFt0aGlzLCAmcGF0aF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRh
cmdldCkgewotICAgICAgICAgICAgcmVuZGVyVGFyZ2V0LT5EcmF3R2VvbWV0cnkocGF0aC5wbGF0
Zm9ybVBhdGgoKSwgbV9zdGF0ZS5zdHJva2VHcmFkaWVudC0+Y3JlYXRlUGxhdGZvcm1HcmFkaWVu
dElmTmVjZXNzYXJ5KHJlbmRlclRhcmdldCkpOwotICAgICAgICB9OwotCi0gICAgICAgIGlmICho
YXNTaGFkb3coKSkKLSAgICAgICAgICAgIGRyYXdXaXRoU2hhZG93KGJvdW5kaW5nUmVjdCwgZHJh
d0Z1bmN0aW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZHJhd1dpdGhvdXRTaGFkb3co
Ym91bmRpbmdSZWN0LCBkcmF3RnVuY3Rpb24pOwotCi0gICAgICAgIGZsdXNoKCk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobV9zdGF0ZS5zdHJva2VQYXR0ZXJuKQotICAgICAg
ICBhcHBseVN0cm9rZVBhdHRlcm4oKTsKLQotICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5F
X18pOwotCi0gICAgRmxvYXRSZWN0IGNvbnRleHRSZWN0KEZsb2F0UG9pbnQoKSwgY29udGV4dC0+
R2V0U2l6ZSgpKTsKLSAgICBkcmF3V2l0aG91dFNoYWRvdyhjb250ZXh0UmVjdCwgW3RoaXMsICZw
YXRoXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAgIGF1dG8gYnJ1
c2ggPSBtX3N0YXRlLnN0cm9rZVBhdHRlcm4gPyBwYXR0ZXJuU3Ryb2tlQnJ1c2goKSA6IHNvbGlk
U3Ryb2tlQnJ1c2goKTsKLSAgICAgICAgcmVuZGVyVGFyZ2V0LT5EcmF3R2VvbWV0cnkocGF0aC5w
bGF0Zm9ybVBhdGgoKSwgYnJ1c2gsIHN0cm9rZVRoaWNrbmVzcygpLCBtX2RhdGEtPnN0cm9rZVN0
eWxlKCkpOwotICAgIH0pOwotCi0gICAgZmx1c2goKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1D
b250ZXh0KCkpOworICAgIGF1dG8mIHN0YXRlID0gdGhpcy0+c3RhdGUoKTsKKyAgICBhdXRvJiBj
b250ZXh0ID0gKnBsYXRmb3JtQ29udGV4dCgpOworICAgIERpcmVjdDJEOjpzdHJva2VQYXRoKGNv
bnRleHQsIHBhdGgsIERpcmVjdDJEOjpTdHJva2VTb3VyY2Uoc3RhdGUsIGNvbnRleHQpLCBEaXJl
Y3QyRDo6U2hhZG93U3RhdGUoc3RhdGUpKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZp
bGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKQEAgLTExNTcsNDEgKzY0NCwxMCBAQCB2b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvCiAgICAgICAgIHJldHVybjsKICAg
ICB9CiAKLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIGlmICht
X3N0YXRlLmZpbGxHcmFkaWVudCkgewotICAgICAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElO
RV9fKTsKLSAgICAgICAgRDJEQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqbV9kYXRhKTsK
LSAgICAgICAgV1RGOjpGdW5jdGlvbjx2b2lkKElEMkQxUmVuZGVyVGFyZ2V0Kik+IGRyYXdGdW5j
dGlvbiA9IFt0aGlzLCByZWN0XShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0g
ICAgICAgICAgICBjb25zdCBEMkQxX1JFQ1RfRiBkMmRSZWN0ID0gcmVjdDsKLSAgICAgICAgICAg
IHJlbmRlclRhcmdldC0+RmlsbFJlY3RhbmdsZSgmZDJkUmVjdCwgbV9zdGF0ZS5maWxsR3JhZGll
bnQtPmNyZWF0ZVBsYXRmb3JtR3JhZGllbnRJZk5lY2Vzc2FyeShyZW5kZXJUYXJnZXQpKTsKLSAg
ICAgICAgfTsKLQotICAgICAgICBpZiAoaGFzU2hhZG93KCkpCi0gICAgICAgICAgICBkcmF3V2l0
aFNoYWRvdyhyZWN0LCBkcmF3RnVuY3Rpb24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBk
cmF3V2l0aG91dFNoYWRvdyhyZWN0LCBkcmF3RnVuY3Rpb24pOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgaWYgKG1fc3RhdGUuZmlsbFBhdHRlcm4pCi0gICAgICAgIGFwcGx5RmlsbFBh
dHRlcm4oKTsKLQotICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotCi0gICAgYm9v
bCBkcmF3T3duU2hhZG93ID0gIWlzQWNjZWxlcmF0ZWRDb250ZXh0KCkgJiYgaGFzQmx1cnJlZFNo
YWRvdygpICYmICFtX3N0YXRlLnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zOyAvLyBEb24ndCB1c2Ug
U2hhZG93Qmx1ciBmb3IgY2FudmFzIHlldC4KLSAgICBpZiAoZHJhd093blNoYWRvdykgewotICAg
ICAgICAvLyBGSVhNRTogR2V0IFNoYWRvd0JsdXIgd29ya2luZyBvbiBEaXJlY3QyRAotICAgICAg
ICAvLyBTaGFkb3dCbHVyIGNvbnRleHRTaGFkb3cobV9zdGF0ZSk7Ci0gICAgICAgIC8vIGNvbnRl
eHRTaGFkb3cuZHJhd1JlY3RTaGFkb3coKnRoaXMsIEZsb2F0Um91bmRlZFJlY3QocmVjdCkpOwot
ICAgICAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIH0KLQotICAgIGRyYXdXaXRob3V0U2hhZG93
KHJlY3QsIFt0aGlzLCByZWN0XShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7Ci0g
ICAgICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSByZWN0OwotICAgICAgICBhdXRvIGJy
dXNoID0gbV9zdGF0ZS5maWxsUGF0dGVybiA/IHBhdHRlcm5GaWxsQnJ1c2goKSA6IHNvbGlkRmls
bEJydXNoKCk7Ci0gICAgICAgIHJlbmRlclRhcmdldC0+RmlsbFJlY3RhbmdsZSgmZDJkUmVjdCwg
YnJ1c2gpOwotICAgIH0pOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAg
YXV0byYgc3RhdGUgPSB0aGlzLT5zdGF0ZSgpOworICAgIGF1dG8mIGNvbnRleHQgPSAqcGxhdGZv
cm1Db250ZXh0KCk7CisgICAgRGlyZWN0MkQ6OmZpbGxSZWN0KGNvbnRleHQsIHJlY3QsIERpcmVj
dDJEOjpGaWxsU291cmNlKHN0YXRlLCBjb250ZXh0KSwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0
YXRlKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG9hdFJl
Y3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvcikKQEAgLTEyMDQsMjIgKzY2MCwxMCBAQCB2b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvCiAgICAgICAgIHJldHVybjsKICAg
ICB9CiAKLSAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIGJvb2wg
ZHJhd093blNoYWRvdyA9ICFpc0FjY2VsZXJhdGVkQ29udGV4dCgpICYmIGhhc0JsdXJyZWRTaGFk
b3coKSAmJiAhbV9zdGF0ZS5zaGFkb3dzSWdub3JlVHJhbnNmb3JtczsgLy8gRG9uJ3QgdXNlIFNo
YWRvd0JsdXIgZm9yIGNhbnZhcyB5ZXQuCi0gICAgaWYgKGRyYXdPd25TaGFkb3cpIHsKLSAgICAg
ICAgLy8gRklYTUU6IEdldCBTaGFkb3dCbHVyIHdvcmtpbmcgb24gRGlyZWN0MkQKLSAgICAgICAg
Ly8gU2hhZG93Qmx1ciBjb250ZXh0U2hhZG93KG1fc3RhdGUpOwotICAgICAgICAvLyBjb250ZXh0
U2hhZG93LmRyYXdSZWN0U2hhZG93KCp0aGlzLCBGbG9hdFJvdW5kZWRSZWN0KHJlY3QpKTsKLSAg
ICAgICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICB9Ci0KLSAgICBjb250ZXh0LT5TZXRUYWdzKDEs
IF9fTElORV9fKTsKLQotICAgIGRyYXdXaXRob3V0U2hhZG93KHJlY3QsIFt0aGlzLCByZWN0LCBj
b2xvcl0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewotICAgICAgICBjb25zdCBE
MkQxX1JFQ1RfRiBkMmRSZWN0ID0gcmVjdDsKLSAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsUmVj
dGFuZ2xlKCZkMmRSZWN0LCBicnVzaFdpdGhDb2xvcihjb2xvcikpOwotICAgIH0pOworICAgIEFT
U0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgYXV0byYgc3RhdGUgPSB0aGlzLT5zdGF0
ZSgpOworICAgIGF1dG8mIGNvbnRleHQgPSAqcGxhdGZvcm1Db250ZXh0KCk7CisgICAgRGlyZWN0
MkQ6OmZpbGxSZWN0KGNvbnRleHQsIHJlY3QsIGNvbG9yLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUo
c3RhdGUpKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtRmlsbFJvdW5kZWRS
ZWN0KGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvcikKQEAg
LTEyMjksMzggKzY3Myw5IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybUZpbGxSb3Vu
ZGUKIAogICAgIEFTU0VSVCghbV9pbXBsKTsKIAotICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3Jt
Q29udGV4dCgpOwotCi0gICAgYm9vbCBkcmF3T3duU2hhZG93ID0gIWlzQWNjZWxlcmF0ZWRDb250
ZXh0KCkgJiYgaGFzQmx1cnJlZFNoYWRvdygpICYmICFtX3N0YXRlLnNoYWRvd3NJZ25vcmVUcmFu
c2Zvcm1zOyAvLyBEb24ndCB1c2UgU2hhZG93Qmx1ciBmb3IgY2FudmFzIHlldC4KLSAgICBEMkRD
b250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCptX2RhdGEsIGRyYXdPd25TaGFkb3cpOwotICAg
IGlmIChkcmF3T3duU2hhZG93KSB7Ci0gICAgICAgIC8vIEZJWE1FOiBHZXQgU2hhZG93Qmx1ciB3
b3JraW5nIG9uIERpcmVjdDJECi0gICAgICAgIC8vIFNoYWRvd0JsdXIgY29udGV4dFNoYWRvdyht
X3N0YXRlKTsKLSAgICAgICAgLy8gY29udGV4dFNoYWRvdy5kcmF3UmVjdFNoYWRvdygqdGhpcywg
cmVjdCk7Ci0gICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgfQotCi0gICAgY29udGV4dC0+
U2V0VGFncygxLCBfX0xJTkVfXyk7Ci0KLSAgICBjb25zdCBGbG9hdFJlY3QmIHIgPSByZWN0LnJl
Y3QoKTsKLSAgICBjb25zdCBGbG9hdFJvdW5kZWRSZWN0OjpSYWRpaSYgcmFkaWkgPSByZWN0LnJh
ZGlpKCk7Ci0gICAgYm9vbCBlcXVhbFdpZHRocyA9IChyYWRpaS50b3BMZWZ0KCkud2lkdGgoKSA9
PSByYWRpaS50b3BSaWdodCgpLndpZHRoKCkgJiYgcmFkaWkudG9wUmlnaHQoKS53aWR0aCgpID09
IHJhZGlpLmJvdHRvbUxlZnQoKS53aWR0aCgpICYmIHJhZGlpLmJvdHRvbUxlZnQoKS53aWR0aCgp
ID09IHJhZGlpLmJvdHRvbVJpZ2h0KCkud2lkdGgoKSk7Ci0gICAgYm9vbCBlcXVhbEhlaWdodHMg
PSAocmFkaWkudG9wTGVmdCgpLmhlaWdodCgpID09IHJhZGlpLmJvdHRvbUxlZnQoKS5oZWlnaHQo
KSAmJiByYWRpaS5ib3R0b21MZWZ0KCkuaGVpZ2h0KCkgPT0gcmFkaWkudG9wUmlnaHQoKS5oZWln
aHQoKSAmJiByYWRpaS50b3BSaWdodCgpLmhlaWdodCgpID09IHJhZGlpLmJvdHRvbVJpZ2h0KCku
aGVpZ2h0KCkpOwotICAgIGJvb2wgaGFzQ3VzdG9tRmlsbCA9IG1fc3RhdGUuZmlsbEdyYWRpZW50
IHx8IG1fc3RhdGUuZmlsbFBhdHRlcm47Ci0gICAgaWYgKCFoYXNDdXN0b21GaWxsICYmIGVxdWFs
V2lkdGhzICYmIGVxdWFsSGVpZ2h0cyAmJiByYWRpaS50b3BMZWZ0KCkud2lkdGgoKSAqIDIgPT0g
ci53aWR0aCgpICYmIHJhZGlpLnRvcExlZnQoKS5oZWlnaHQoKSAqIDIgPT0gci5oZWlnaHQoKSkg
ewotICAgICAgICBhdXRvIHJvdW5kZWRSZWN0ID0gRDJEMTo6Um91bmRlZFJlY3QociwgcmFkaWku
dG9wTGVmdCgpLndpZHRoKCksIHJhZGlpLnRvcExlZnQoKS5oZWlnaHQoKSk7Ci0gICAgICAgIGNv
bnRleHQtPkZpbGxSb3VuZGVkUmVjdGFuZ2xlKHJvdW5kZWRSZWN0LCBicnVzaFdpdGhDb2xvcihj
b2xvcikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEQyRENvbnRleHRTdGF0ZVNhdmVyIHN0YXRl
U2F2ZXIoKm1fZGF0YSk7Ci0gICAgICAgIHNldEZpbGxDb2xvcihjb2xvcik7Ci0KLSAgICAgICAg
UGF0aCBwYXRoOwotICAgICAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJlY3QpOwotICAgICAgICBm
aWxsUGF0aChwYXRoKTsKLSAgICB9Ci0KLSAgICBpZiAoZHJhd093blNoYWRvdykKLSAgICAgICAg
c3RhdGVTYXZlci5yZXN0b3JlKCk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsK
KyAgICBhdXRvJiBzdGF0ZSA9IHRoaXMtPnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmZpbGxSb3Vu
ZGVkUmVjdCgqcGxhdGZvcm1Db250ZXh0KCksIHJlY3QsIGNvbG9yLCBEaXJlY3QyRDo6U2hhZG93
U3RhdGUoc3RhdGUpKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0V2l0aFJv
dW5kZWRIb2xlKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgRmxvYXRSb3VuZGVkUmVjdCYg
cm91bmRlZEhvbGVSZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCkBAIC0xMjczLDQxICs2ODgsMTAg
QEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0V2l0aFJvdW5kZQogICAgICAgICByZXR1
cm47CiAgICAgfQogCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0KLSAg
ICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKLQotICAgIFBhdGggcGF0aDsKLSAgICBw
YXRoLmFkZFJlY3QocmVjdCk7Ci0KLSAgICBpZiAoIXJvdW5kZWRIb2xlUmVjdC5yYWRpaSgpLmlz
WmVybygpKQotICAgICAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJvdW5kZWRIb2xlUmVjdCk7Ci0g
ICAgZWxzZQotICAgICAgICBwYXRoLmFkZFJlY3Qocm91bmRlZEhvbGVSZWN0LnJlY3QoKSk7Ci0K
LSAgICBXaW5kUnVsZSBvbGRGaWxsUnVsZSA9IGZpbGxSdWxlKCk7Ci0gICAgQ29sb3Igb2xkRmls
bENvbG9yID0gZmlsbENvbG9yKCk7Ci0KLSAgICBzZXRGaWxsUnVsZShXaW5kUnVsZTo6RXZlbk9k
ZCk7Ci0gICAgc2V0RmlsbENvbG9yKGNvbG9yKTsKLQotICAgIC8vIGZpbGxSZWN0V2l0aFJvdW5k
ZWRIb2xlKCkgYXNzdW1lcyB0aGF0IHRoZSBlZGdlcyBvZiByZWN0IGFyZSBjbGlwcGVkIG91dCwg
c28gd2Ugb25seSBjYXJlIGFib3V0IHNoYWRvd3MgY2FzdCBhcm91bmQgaW5zaWRlIHRoZSBob2xl
LgotICAgIGJvb2wgZHJhd093blNoYWRvdyA9ICFpc0FjY2VsZXJhdGVkQ29udGV4dCgpICYmIGhh
c0JsdXJyZWRTaGFkb3coKSAmJiAhbV9zdGF0ZS5zaGFkb3dzSWdub3JlVHJhbnNmb3JtczsKLSAg
ICBEMkRDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCptX2RhdGEsIGRyYXdPd25TaGFkb3cp
OwotICAgIGlmIChkcmF3T3duU2hhZG93KSB7Ci0gICAgICAgIC8vIEZJWE1FOiBHZXQgU2hhZG93
Qmx1ciB3b3JraW5nIG9uIERpcmVjdDJECi0gICAgICAgIC8vIFNoYWRvd0JsdXIgY29udGV4dFNo
YWRvdyhtX3N0YXRlKTsKLSAgICAgICAgLy8gY29udGV4dFNoYWRvdy5kcmF3UmVjdFNoYWRvdygq
dGhpcywgcmVjdCk7Ci0gICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgfQotCi0gICAgZmls
bFBhdGgocGF0aCk7Ci0KLSAgICBpZiAoZHJhd093blNoYWRvdykKLSAgICAgICAgc3RhdGVTYXZl
ci5yZXN0b3JlKCk7Ci0KLSAgICBzZXRGaWxsUnVsZShvbGRGaWxsUnVsZSk7Ci0gICAgc2V0Rmls
bENvbG9yKG9sZEZpbGxDb2xvcik7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsK
KyAgICBhdXRvJiBzdGF0ZSA9IHRoaXMtPnN0YXRlKCk7CisgICAgYXV0byYgY29udGV4dCA9ICpw
bGF0Zm9ybUNvbnRleHQoKTsKKyAgICBEaXJlY3QyRDo6ZmlsbFJlY3RXaXRoUm91bmRlZEhvbGUo
Y29udGV4dCwgcmVjdCwgcm91bmRlZEhvbGVSZWN0LCBEaXJlY3QyRDo6RmlsbFNvdXJjZShzdGF0
ZSwgY29udGV4dCksIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0ZSkpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCkBAIC0xMzIwLDcgKzcw
NCw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IEZsb2F0UmUKICAgICAgICAg
cmV0dXJuOwogICAgIH0KIAotICAgIG1fZGF0YS0+Y2xpcChyZWN0KTsKKyAgICBBU1NFUlQoaGFz
UGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpjbGlwKCpwbGF0Zm9ybUNvbnRleHQo
KSwgcmVjdCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KGNvbnN0IEZsb2F0
UmVjdCYgcmVjdCkKQEAgLTEzMzMsMTAgKzcxOCw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpj
bGlwT3V0KGNvbnN0IEZsb2EKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIFBhdGggcGF0
aDsKLSAgICBwYXRoLmFkZFJlY3QocmVjdCk7Ci0KLSAgICBjbGlwT3V0KHBhdGgpOworICAgIEFT
U0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OmNsaXBPdXQoKnBsYXRm
b3JtQ29udGV4dCgpLCByZWN0KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQo
Y29uc3QgUGF0aCYgcGF0aCkKQEAgLTEzNDksMTkgKzczMiw4IEBAIHZvaWQgR3JhcGhpY3NDb250
ZXh0OjpjbGlwT3V0KGNvbnN0IFBhdGgKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8v
IFRvIGNsaXAgT3V0IHdlIG5lZWQgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgaW5maW5pdGUKLSAg
ICAvLyBjbGlwcGluZyByZWN0IGFuZCB0aGUgcGF0aCB3ZSBqdXN0IGNyZWF0ZWQuCi0gICAgRDJE
MV9TSVpFX0YgcmVuZGVyZXJTaXplID0gcGxhdGZvcm1Db250ZXh0KCktPkdldFNpemUoKTsKLSAg
ICBGbG9hdFJlY3QgY2xpcEJvdW5kcygwLCAwLCByZW5kZXJlclNpemUud2lkdGgsIHJlbmRlcmVy
U2l6ZS5oZWlnaHQpOwotCi0gICAgUGF0aCBib3VuZGluZ1JlY3Q7Ci0gICAgYm91bmRpbmdSZWN0
LmFkZFJlY3QoY2xpcEJvdW5kcyk7Ci0gICAgYm91bmRpbmdSZWN0LmFwcGVuZEdlb21ldHJ5KHBh
dGgucGxhdGZvcm1QYXRoKCkpOwotCi0gICAgQ09NUHRyPElEMkQxR2VvbWV0cnlHcm91cD4gcGF0
aFRvQ2xpcDsKLSAgICBib3VuZGluZ1JlY3QuY3JlYXRlR2VvbWV0cnlXaXRoRmlsbE1vZGUoV2lu
ZFJ1bGU6OkV2ZW5PZGQsIHBhdGhUb0NsaXApOwotCi0gICAgbV9kYXRhLT5jbGlwKHBhdGhUb0Ns
aXAuZ2V0KCkpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0
MkQ6OmNsaXBPdXQoKnBsYXRmb3JtQ29udGV4dCgpLCBwYXRoKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmNsaXBQYXRoKGNvbnN0IFBhdGgmIHBhdGgsIFdpbmRSdWxlIGNsaXBSdWxlKQpA
QCAtMTM3NCwxOCArNzQ2LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBQYXRoKGNvbnN0
IFBhdAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgYXV0byBjb250ZXh0ID0gcGxhdGZv
cm1Db250ZXh0KCk7Ci0gICAgaWYgKHBhdGguaXNFbXB0eSgpKSB7Ci0gICAgICAgIG1fZGF0YS0+
Y2xpcChGbG9hdFJlY3QoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBU1NFUlQo
IXBhdGguYWN0aXZlUGF0aCgpKTsKLQotICAgIENPTVB0cjxJRDJEMUdlb21ldHJ5R3JvdXA+IHBh
dGhUb0NsaXA7Ci0gICAgcGF0aC5jcmVhdGVHZW9tZXRyeVdpdGhGaWxsTW9kZShjbGlwUnVsZSwg
cGF0aFRvQ2xpcCk7Ci0KLSAgICBtX2RhdGEtPmNsaXAocGF0aFRvQ2xpcC5nZXQoKSk7CisgICAg
QVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6Y2xpcFBhdGgoKnBs
YXRmb3JtQ29udGV4dCgpLCBwYXRoLCBjbGlwUnVsZSk7CiB9CiAKIEludFJlY3QgR3JhcGhpY3ND
b250ZXh0OjpjbGlwQm91bmRzKCkgY29uc3QKQEAgLTEzOTMsMzMgKzc1NSwxNSBAQCBJbnRSZWN0
IEdyYXBoaWNzQ29udGV4dDo6Y2xpcEJvdW5kcygpIGNvCiAgICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKICAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKIAotICAgIGlmIChtX2ltcGwpIHsKLSAg
ICAgICAgV1RGTG9nQWx3YXlzKCJHZXR0aW5nIHRoZSBjbGlwIGJvdW5kcyBub3QgeWV0IHN1cHBv
cnRlZCB3aXRoIGRpc3BsYXkgbGlzdHMiKTsKLSAgICAgICAgcmV0dXJuIEludFJlY3QoLTIwNDgs
IC0yMDQ4LCA0MDk2LCA0MDk2KTsgLy8gRklYTUU6IGRpc3BsYXkgbGlzdHMuCi0gICAgfQotCi0g
ICAgRDJEMV9TSVpFX0YgY2xpcFNpemU7Ci0gICAgaWYgKGF1dG8gY2xpcExheWVyID0gbV9kYXRh
LT5jbGlwTGF5ZXIoKSkKLSAgICAgICAgY2xpcFNpemUgPSBjbGlwTGF5ZXItPkdldFNpemUoKTsK
LSAgICBlbHNlCi0gICAgICAgIGNsaXBTaXplID0gcGxhdGZvcm1Db250ZXh0KCktPkdldFNpemUo
KTsKLQotICAgIEZsb2F0UmVjdCBjbGlwQm91bmRzKEludFBvaW50KCksIGNsaXBTaXplKTsKKyAg
ICBpZiAobV9pbXBsKQorICAgICAgICByZXR1cm4gbV9pbXBsLT5jbGlwQm91bmRzKCk7CiAKLSAg
ICByZXR1cm4gZW5jbG9zaW5nSW50UmVjdChjbGlwQm91bmRzKTsKKyAgICBBU1NFUlQoaGFzUGxh
dGZvcm1Db250ZXh0KCkpOworICAgIHJldHVybiBEaXJlY3QyRDo6U3RhdGU6OmdldENsaXBCb3Vu
ZHMoKnBsYXRmb3JtQ29udGV4dCgpKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGU6OmJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoZmxvYXQgb3BhY2l0eSkKIHsKLSAgICBU
cmFuc3BhcmVuY3lMYXllclN0YXRlIHRyYW5zcGFyZW5jeUxheWVyOwotICAgIHRyYW5zcGFyZW5j
eUxheWVyLm9wYWNpdHkgPSBvcGFjaXR5OwotCi0gICAgSFJFU1VMVCBociA9IG1fcmVuZGVyVGFy
Z2V0LT5DcmVhdGVDb21wYXRpYmxlUmVuZGVyVGFyZ2V0KCZ0cmFuc3BhcmVuY3lMYXllci5yZW5k
ZXJUYXJnZXQpOwotICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOwotICAgIG1fdHJh
bnNwYXJlbmN5TGF5ZXJTdGFjay5hcHBlbmQoV1RGTW92ZSh0cmFuc3BhcmVuY3lMYXllcikpOwot
Ci0gICAgbV90cmFuc3BhcmVuY3lMYXllclN0YWNrLmxhc3QoKS5yZW5kZXJUYXJnZXQtPkJlZ2lu
RHJhdygpOwotICAgIG1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjay5sYXN0KCkucmVuZGVyVGFyZ2V0
LT5DbGVhcihEMkQxOjpDb2xvckYoMCwgMCwgMCwgMCkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6YmVnaW5QbGF0Zm9ybVRyYW5zcGFyZW5jeUxheWVyKGZsb2F0IG9wYWNpdHkpCkBAIC0x
NDMzLDM4ICs3NzcsMTIgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmJlZ2luUGxhdGZvcm1UcmFu
cwogCiAgICAgbV9zdGF0ZS5hbHBoYSA9IG9wYWNpdHk7CiAKLSAgICBtX2RhdGEtPmJlZ2luVHJh
bnNwYXJlbmN5TGF5ZXIob3BhY2l0eSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgp
KTsKKyAgICBEaXJlY3QyRDo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcigqcGxhdGZvcm1Db250ZXh0
KCksIG9wYWNpdHkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6
ZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKQogewotICAgIGF1dG8gY3VycmVudExheWVyID0gbV90cmFu
c3BhcmVuY3lMYXllclN0YWNrLnRha2VMYXN0KCk7Ci0gICAgYXV0byByZW5kZXJUYXJnZXQgPSBj
dXJyZW50TGF5ZXIucmVuZGVyVGFyZ2V0OwotICAgIGlmICghcmVuZGVyVGFyZ2V0KQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBIUkVTVUxUIGhyID0gcmVuZGVyVGFyZ2V0LT5FbmREcmF3KCk7Ci0g
ICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Ci0KLSAgICBDT01QdHI8SUQyRDFCaXRt
YXA+IGJpdG1hcDsKLSAgICBociA9IHJlbmRlclRhcmdldC0+R2V0Qml0bWFwKCZiaXRtYXApOwot
ICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOwotCi0gICAgYXV0byBjb250ZXh0ID0g
dGhpcy0+cmVuZGVyVGFyZ2V0KCk7Ci0KLSAgICBpZiAoY3VycmVudExheWVyLmhhc1NoYWRvdykK
LSAgICAgICAgZHJhd1dpdGhTaGFkb3dIZWxwZXIoY29udGV4dCwgYml0bWFwLmdldCgpLCBjdXJy
ZW50TGF5ZXIuc2hhZG93Q29sb3IsIGN1cnJlbnRMYXllci5zaGFkb3dPZmZzZXQsIGN1cnJlbnRM
YXllci5zaGFkb3dCbHVyKTsKLSAgICBlbHNlIHsKLSAgICAgICAgQ09NUHRyPElEMkQxQml0bWFw
QnJ1c2g+IGJpdG1hcEJydXNoOwotICAgICAgICBhdXRvIGJpdG1hcEJydXNoUHJvcGVydGllcyA9
IEQyRDE6OkJpdG1hcEJydXNoUHJvcGVydGllcygpOwotICAgICAgICBhdXRvIGJydXNoUHJvcGVy
dGllcyA9IEQyRDE6OkJydXNoUHJvcGVydGllcygpOwotICAgICAgICBIUkVTVUxUIGhyID0gY29u
dGV4dC0+Q3JlYXRlQml0bWFwQnJ1c2goYml0bWFwLmdldCgpLCBiaXRtYXBCcnVzaFByb3BlcnRp
ZXMsIGJydXNoUHJvcGVydGllcywgJmJpdG1hcEJydXNoKTsKLSAgICAgICAgUkVMRUFTRV9BU1NF
UlQoU1VDQ0VFREVEKGhyKSk7Ci0KLSAgICAgICAgYXV0byBzaXplID0gYml0bWFwLT5HZXRTaXpl
KCk7Ci0gICAgICAgIGF1dG8gcmVjdEluRElQID0gRDJEMTo6UmVjdEYoMCwgMCwgc2l6ZS53aWR0
aCwgc2l6ZS5oZWlnaHQpOwotICAgICAgICBjb250ZXh0LT5GaWxsUmVjdGFuZ2xlKHJlY3RJbkRJ
UCwgYml0bWFwQnJ1c2guZ2V0KCkpOwotICAgIH0KIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6
OmVuZFBsYXRmb3JtVHJhbnNwYXJlbmN5TGF5ZXIoKQpAQCAtMTQ3Miw3ICs3OTAsOCBAQCB2b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZW5kUGxhdGZvcm1UcmFuc3BhCiAgICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgbV9kYXRhLT5lbmRUcmFuc3BhcmVuY3lM
YXllcigpOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6
OmVuZFRyYW5zcGFyZW5jeUxheWVyKCpwbGF0Zm9ybUNvbnRleHQoKSk7CiAKICAgICBBU1NFUlQo
IW1faW1wbCk7CiAKQEAgLTE1MDYsNyArODI1LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNl
dFBsYXRmb3JtU3Ryb2tlUwogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHJl
dHVybjsKIAotICAgIG1fZGF0YS0+c2V0U3Ryb2tlU3R5bGUoc3R5bGUpOworICAgIEFTU0VSVCho
YXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OlN0YXRlOjpzZXRTdHJva2VTdHls
ZSgqcGxhdGZvcm1Db250ZXh0KCksIHN0eWxlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6
OnNldE1pdGVyTGltaXQoZmxvYXQgbGltaXQpCkBAIC0xNTIwLDcgKzg0MCw4IEBAIHZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpzZXRNaXRlckxpbWl0KGZsb2EKICAgICAgICAgcmV0dXJuOwogICAgIH0K
IAotICAgIG1fZGF0YS0+c2V0TWl0ZXJMaW1pdChsaW1pdCk7CisgICAgQVNTRVJUKGhhc1BsYXRm
b3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6c2V0TWl0ZXJMaW1pdCgqcGxhdGZvcm1Db250
ZXh0KCksIGxpbWl0KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyUmVjdChjb25z
dCBGbG9hdFJlY3QmIHJlY3QpCkBAIC0xNTMzLDIzICs4NTQsOCBAQCB2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6Y2xlYXJSZWN0KGNvbnN0IEZsCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBk
cmF3V2l0aG91dFNoYWRvdyhyZWN0LCBbdGhpcywgcmVjdF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJl
bmRlclRhcmdldCkgewotICAgICAgICBGbG9hdFJlY3QgcmVuZGVyVGFyZ2V0UmVjdChGbG9hdFBv
aW50KCksIHJlbmRlclRhcmdldC0+R2V0U2l6ZSgpKTsKLSAgICAgICAgRmxvYXRSZWN0IHJlY3RU
b0NsZWFyKHJlY3QpOwotCi0gICAgICAgIGlmIChyZWN0VG9DbGVhci5jb250YWlucyhyZW5kZXJU
YXJnZXRSZWN0KSkgewotICAgICAgICAgICAgcmVuZGVyVGFyZ2V0LT5TZXRUYWdzKDEsIF9fTElO
RV9fKTsKLSAgICAgICAgICAgIHJlbmRlclRhcmdldC0+Q2xlYXIoRDJEMTo6Q29sb3JGKDAsIDAs
IDAsIDApKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgh
cmVjdFRvQ2xlYXIuaW50ZXJzZWN0cyhyZW5kZXJUYXJnZXRSZWN0KSkKLSAgICAgICAgICAgIHJl
dHVybjsKLQotICAgICAgICByZW5kZXJUYXJnZXQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwotICAg
ICAgICByZWN0VG9DbGVhci5pbnRlcnNlY3QocmVuZGVyVGFyZ2V0UmVjdCk7Ci0gICAgICAgIHJl
bmRlclRhcmdldC0+RmlsbFJlY3RhbmdsZShyZWN0VG9DbGVhciwgYnJ1c2hXaXRoQ29sb3IoQ29s
b3IoRDJEMTo6Q29sb3JGKDAsIDAsIDAsIDApKSkpOwotICAgIH0pOworICAgIEFTU0VSVChoYXNQ
bGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0MkQ6OmNsZWFyUmVjdCgqcGxhdGZvcm1Db250
ZXh0KCksIHJlY3QpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChjb25z
dCBGbG9hdFJlY3QmIHJlY3QsIGZsb2F0IGxpbmVXaWR0aCkKQEAgLTE1NjIsMjkgKzg2OCwxMCBA
QCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChjb25zdCBGCiAgICAgICAgIHJldHVy
bjsKICAgICB9CiAKLSAgICBpZiAobV9zdGF0ZS5zdHJva2VHcmFkaWVudCkgewotICAgICAgICBX
VEY6OkZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4gZHJhd0Z1bmN0aW9uID0gW3Ro
aXMsIHJlY3QsIGxpbmVXaWR0aF0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewot
ICAgICAgICAgICAgcmVuZGVyVGFyZ2V0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKLSAgICAgICAg
ICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSByZWN0OwotICAgICAgICAgICAgcmVuZGVy
VGFyZ2V0LT5EcmF3UmVjdGFuZ2xlKCZkMmRSZWN0LCBtX3N0YXRlLnN0cm9rZUdyYWRpZW50LT5j
cmVhdGVQbGF0Zm9ybUdyYWRpZW50SWZOZWNlc3NhcnkocmVuZGVyVGFyZ2V0KSwgbGluZVdpZHRo
LCBtX2RhdGEtPnN0cm9rZVN0eWxlKCkpOwotICAgICAgICB9OwotCi0gICAgICAgIGlmIChoYXNT
aGFkb3coKSkKLSAgICAgICAgICAgIGRyYXdXaXRoU2hhZG93KHJlY3QsIGRyYXdGdW5jdGlvbik7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRyYXdXaXRob3V0U2hhZG93KHJlY3QsIGRyYXdG
dW5jdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobV9zdGF0ZS5zdHJv
a2VQYXR0ZXJuKQotICAgICAgICBhcHBseVN0cm9rZVBhdHRlcm4oKTsKLQotICAgIGRyYXdXaXRo
b3V0U2hhZG93KHJlY3QsIFt0aGlzLCByZWN0LCBsaW5lV2lkdGhdKElEMkQxUmVuZGVyVGFyZ2V0
KiByZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgcmVuZGVyVGFyZ2V0LT5TZXRUYWdzKDEsIF9fTElO
RV9fKTsKLSAgICAgICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9IHJlY3Q7Ci0gICAgICAg
IGF1dG8gYnJ1c2ggPSBtX3N0YXRlLnN0cm9rZVBhdHRlcm4gPyBwYXR0ZXJuU3Ryb2tlQnJ1c2go
KSA6IHNvbGlkU3Ryb2tlQnJ1c2goKTsKLSAgICAgICAgcmVuZGVyVGFyZ2V0LT5EcmF3UmVjdGFu
Z2xlKCZkMmRSZWN0LCBicnVzaCwgbGluZVdpZHRoLCBtX2RhdGEtPnN0cm9rZVN0eWxlKCkpOwot
ICAgIH0pOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgYXV0byYgc3Rh
dGUgPSB0aGlzLT5zdGF0ZSgpOworICAgIGF1dG8mIGNvbnRleHQgPSAqcGxhdGZvcm1Db250ZXh0
KCk7CisgICAgRGlyZWN0MkQ6OnN0cm9rZVJlY3QoY29udGV4dCwgcmVjdCwgbGluZVdpZHRoLCBE
aXJlY3QyRDo6U3Ryb2tlU291cmNlKHN0YXRlLCBjb250ZXh0KSwgRGlyZWN0MkQ6OlNoYWRvd1N0
YXRlKHN0YXRlKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lQ2FwKExpbmVD
YXAgY2FwKQpAQCAtMTU5Nyw3ICs4ODQsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGlu
ZUNhcChMaW5lQ2FwCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtX2RhdGEtPnNldExp
bmVDYXAoY2FwKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVj
dDJEOjpzZXRMaW5lQ2FwKCpwbGF0Zm9ybUNvbnRleHQoKSwgY2FwKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQ6OnNldExpbmVEYXNoKGNvbnN0IERhc2hBcnJheSYgZGFzaGVzLCBmbG9hdCBk
YXNoT2Zmc2V0KQpAQCAtMTYxOCw4ICs5MDYsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0
TGluZURhc2goY29uc3QKICAgICAgICAgICAgIGRhc2hPZmZzZXQgPSBmbW9kKGRhc2hPZmZzZXQs
IGxlbmd0aCkgKyBsZW5ndGg7CiAgICAgfQogCi0gICAgbV9kYXRhLT5zZXREYXNoZXMoZGFzaGVz
KTsKLSAgICBtX2RhdGEtPnNldERhc2hPZmZzZXQoZGFzaE9mZnNldCk7CisgICAgQVNTRVJUKGhh
c1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBEaXJlY3QyRDo6c2V0TGluZURhc2goKnBsYXRmb3Jt
Q29udGV4dCgpLCBkYXNoZXMsIGRhc2hPZmZzZXQpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDo6c2V0TGluZUpvaW4oTGluZUpvaW4gam9pbikKQEAgLTE2MzIsNyArOTIwLDggQEAgdm9pZCBH
cmFwaGljc0NvbnRleHQ6OnNldExpbmVKb2luKExpbmVKbwogICAgICAgICByZXR1cm47CiAgICAg
fQogCi0gICAgbV9kYXRhLT5zZXRMaW5lSm9pbihqb2luKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZv
cm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpzZXRMaW5lSm9pbigqcGxhdGZvcm1Db250ZXh0
KCksIGpvaW4pOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2FudmFzQ2xpcChjb25zdCBQ
YXRoJiBwYXRoLCBXaW5kUnVsZSBmaWxsUnVsZSkKQEAgLTE2NTAsNyArOTM5LDggQEAgdm9pZCBH
cmFwaGljc0NvbnRleHQ6OnNjYWxlKGNvbnN0IEZsb2F0UwogICAgICAgICByZXR1cm47CiAgICAg
fQogCi0gICAgbV9kYXRhLT5zY2FsZShzaXplKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250
ZXh0KCkpOworICAgIERpcmVjdDJEOjpzY2FsZSgqcGxhdGZvcm1Db250ZXh0KCksIHNpemUpOwog
ICAgIC8vIEZJWE1FOiBtX2RhdGEtPm1fdXNlclRvRGV2aWNlVHJhbnNmb3JtS25vd25Ub0JlSWRl
bnRpdHkgPSBmYWxzZTsKIH0KIApAQCAtMTY2NCw3ICs5NTQsOCBAQCB2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6cm90YXRlKGZsb2F0IGFuZ2xlCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBt
X2RhdGEtPnJvdGF0ZShhbmdsZSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsK
KyAgICBEaXJlY3QyRDo6cm90YXRlKCpwbGF0Zm9ybUNvbnRleHQoKSwgYW5nbGUpOwogICAgIC8v
IEZJWE1FOiBtX2RhdGEtPm1fdXNlclRvRGV2aWNlVHJhbnNmb3JtS25vd25Ub0JlSWRlbnRpdHkg
PSBmYWxzZTsKIH0KIApAQCAtMTY3OCw3ICs5NjksOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6
dHJhbnNsYXRlKGZsb2F0IHgsCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtX2RhdGEt
PnRyYW5zbGF0ZSh4LCB5KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAg
IERpcmVjdDJEOjp0cmFuc2xhdGUoKnBsYXRmb3JtQ29udGV4dCgpLCB4LCB5KTsKICAgICAvLyBG
SVhNRTogbV9kYXRhLT5tX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5ID0g
ZmFsc2U7CiB9CiAKQEAgLTE2OTIsNyArOTg0LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNv
bmNhdENUTShjb25zdCBBZgogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbV9kYXRhLT5j
b25jYXRDVE0odHJhbnNmb3JtKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOwor
ICAgIERpcmVjdDJEOjpjb25jYXRDVE0oKnBsYXRmb3JtQ29udGV4dCgpLCB0cmFuc2Zvcm0pOwog
ICAgIC8vIEZJWE1FOiBtX2RhdGEtPm1fdXNlclRvRGV2aWNlVHJhbnNmb3JtS25vd25Ub0JlSWRl
bnRpdHkgPSBmYWxzZTsKIH0KIApAQCAtMTcwNiw3ICs5OTksOCBAQCB2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2V0Q1RNKGNvbnN0IEFmZmluCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBt
X2RhdGEtPnNldENUTSh0cmFuc2Zvcm0pOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQo
KSk7CisgICAgRGlyZWN0MkQ6OlN0YXRlOjpzZXRDVE0oKnBsYXRmb3JtQ29udGV4dCgpLCB0cmFu
c2Zvcm0pOwogICAgIC8vIEZJWE1FOiBtX2RhdGEtPm1fdXNlclRvRGV2aWNlVHJhbnNmb3JtS25v
d25Ub0JlSWRlbnRpdHkgPSBmYWxzZTsKIH0KIApAQCAtMTcxNSwxNCArMTAwOSwxMSBAQCBBZmZp
bmVUcmFuc2Zvcm0gR3JhcGhpY3NDb250ZXh0OjpnZXRDVE0oCiAgICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKICAgICAgICAgcmV0dXJuIEFmZmluZVRyYW5zZm9ybSgpOwogCi0gICAgaWYgKG1f
aW1wbCkgewotICAgICAgICBXVEZMb2dBbHdheXMoIkdyYXBoaWNzQ29udGV4dDo6Z2V0Q1RNKCkg
aXMgbm90IHlldCBjb21wYXRpYmxlIHdpdGggcmVjb3JkaW5nIGNvbnRleHRzLiIpOwotICAgICAg
ICByZXR1cm4gQWZmaW5lVHJhbnNmb3JtKCk7Ci0gICAgfQorICAgIGlmIChtX2ltcGwpCisgICAg
ICAgIHJldHVybiBtX2ltcGwtPmdldENUTShpbmNsdWRlU2NhbGUpOwogCi0gICAgRDJEMV9NQVRS
SVhfM1gyX0YgY3VycmVudFRyYW5zZm9ybTsKLSAgICBwbGF0Zm9ybUNvbnRleHQoKS0+R2V0VHJh
bnNmb3JtKCZjdXJyZW50VHJhbnNmb3JtKTsKLSAgICByZXR1cm4gY3VycmVudFRyYW5zZm9ybTsK
KyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIHJldHVybiBEaXJlY3QyRDo6
U3RhdGU6OmdldENUTSgqcGxhdGZvcm1Db250ZXh0KCkpOwogfQogCiBGbG9hdFJlY3QgR3JhcGhp
Y3NDb250ZXh0Ojpyb3VuZFRvRGV2aWNlUGl4ZWxzKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgUm91
bmRpbmdNb2RlIHJvdW5kaW5nTW9kZSkKQEAgLTE3MzAsMTQgKzEwMjEsMTAgQEAgRmxvYXRSZWN0
IEdyYXBoaWNzQ29udGV4dDo6cm91bmRUb0RldmljZQogICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCiAgICAgICAgIHJldHVybiByZWN0OwogCi0gICAgaWYgKG1faW1wbCkgewotICAgICAgICBX
VEZMb2dBbHdheXMoIkdyYXBoaWNzQ29udGV4dDo6cm91bmRUb0RldmljZVBpeGVscygpIGlzIG5v
dCB5ZXQgY29tcGF0aWJsZSB3aXRoIHJlY29yZGluZyBjb250ZXh0cy4iKTsKLSAgICAgICAgcmV0
dXJuIHJlY3Q7Ci0gICAgfQotCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBpZiAobV9pbXBs
KQorICAgICAgICByZXR1cm4gbV9pbXBsLT5yb3VuZFRvRGV2aWNlUGl4ZWxzKHJlY3QsIHJvdW5k
aW5nTW9kZSk7CiAKLSAgICByZXR1cm4gcmVjdDsKKyAgICByZXR1cm4gRGlyZWN0MkQ6OlN0YXRl
Ojpyb3VuZFRvRGV2aWNlUGl4ZWxzKCpwbGF0Zm9ybUNvbnRleHQoKSwgcmVjdCk7CiB9CiAKIHZv
aWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvclRleHQoY29uc3QgRmxvYXRSZWN0JiByZWN0
LCBib29sIHByaW50aW5nLCBib29sIGRvdWJsZUxpbmVzLCBTdHJva2VTdHlsZSBzdHJva2VTdHls
ZSkKQEAgLTE3NDgsMTkgKzEwMzUsMjEgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5l
Rm9yVGV4dChjbwogICAgIGRyYXdMaW5lc0ZvclRleHQocmVjdC5sb2NhdGlvbigpLCByZWN0Lmhl
aWdodCgpLCB3aWR0aHMsIHByaW50aW5nLCBkb3VibGVMaW5lcywgc3Ryb2tlU3R5bGUpOwogfQog
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVzRm9yVGV4dChjb25zdCBGbG9hdFBvaW50
JiBwb2ludCwgZmxvYXQgdGhpY2tuZXNzLCBjb25zdCBEYXNoQXJyYXkmIHdpZHRocywgYm9vbCBw
cmludGluZywgYm9vbCBkb3VibGVMaW5lcywgU3Ryb2tlU3R5bGUgc3Ryb2tlU3R5bGUpCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVzRm9yVGV4dChjb25zdCBGbG9hdFBvaW50JiBwb2lu
dCwgZmxvYXQgdGhpY2tuZXNzLCBjb25zdCBEYXNoQXJyYXkmIHdpZHRocywgYm9vbCBwcmludGlu
ZywgYm9vbCBkb3VibGVVbmRlcmxpbmVzLCBTdHJva2VTdHlsZSBzdHJva2VTdHlsZSkKIHsKICAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CiAKICAgICBpZiAoIXdp
ZHRocy5zaXplKCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIGlmIChtX2ltcGwpIHsKLSAgICAg
ICAgbV9pbXBsLT5kcmF3TGluZXNGb3JUZXh0KHBvaW50LCB0aGlja25lc3MsIHdpZHRocywgcHJp
bnRpbmcsIGRvdWJsZUxpbmVzKTsKKyAgICAgICAgbV9pbXBsLT5kcmF3TGluZXNGb3JUZXh0KHBv
aW50LCB0aGlja25lc3MsIHdpZHRocywgcHJpbnRpbmcsIGRvdWJsZVVuZGVybGluZXMpOwogICAg
ICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBBU1NFUlQo
aGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpkcmF3TGluZXNGb3JUZXh0KCpw
bGF0Zm9ybUNvbnRleHQoKSwgcG9pbnQsIHRoaWNrbmVzcywgd2lkdGhzLCBwcmludGluZywgZG91
YmxlVW5kZXJsaW5lcywgbV9zdGF0ZS5zdHJva2VDb2xvcik7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0OjpzZXRVUkxGb3JSZWN0KGNvbnN0IFVSTCYgbGluaywgY29uc3QgRmxvYXRSZWN0JiBk
ZXN0UmVjdCkKQEAgLTE4NDUsMTMgKzExMzQsOCBAQCBib29sIEdyYXBoaWNzQ29udGV4dDo6aXNB
Y2NlbGVyYXRlZENvbnRlCiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAgICAgcmV0
dXJuIGZhbHNlOwogCi0gICAgLy8gRklYTUUKLSAgICBpZiAobV9pbXBsKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHByb2JhYmFseSBub3QgbmVlZGVk
LgotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIEFTU0VSVCho
YXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgcmV0dXJuIERpcmVjdDJEOjpTdGF0ZTo6aXNBY2Nl
bGVyYXRlZENvbnRleHQoKnBsYXRmb3JtQ29udGV4dCgpKTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnNldFBsYXRmb3JtVGV4dERyYXdpbmdNb2RlKFRleHREcmF3aW5nTW9kZUZsYWdzIG1v
ZGUpCkBAIC0xODYzLDEwICsxMTQ3LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRm
b3JtVGV4dERyYQogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlQ29sb3Io
Y29uc3QgQ29sb3ImIGNvbG9yKQogewogICAgIEFTU0VSVChtX3N0YXRlLnN0cm9rZUNvbG9yID09
IGNvbG9yKTsKLQotICAgIG1fZGF0YS0+bV9zb2xpZFN0cm9rZUJydXNoID0gbnVsbHB0cjsKLQot
ICAgIG1fZGF0YS0+bV9zb2xpZFN0cm9rZUJydXNoID0gYnJ1c2hXaXRoQ29sb3Ioc3Ryb2tlQ29s
b3IoKSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBwbGF0Zm9ybUNv
bnRleHQoKS0+bV9zb2xpZFN0cm9rZUJydXNoID0gYnJ1c2hXaXRoQ29sb3Ioc3Ryb2tlQ29sb3Io
KSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9rZVRoaWNrbmVz
cyhmbG9hdCB0aGlja25lc3MpCkBAIC0xODc4LDEwICsxMTYwLDggQEAgdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlVAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRm
b3JtRmlsbENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKIHsKICAgICBBU1NFUlQobV9zdGF0ZS5m
aWxsQ29sb3IgPT0gY29sb3IpOwotCi0gICAgbV9kYXRhLT5tX3NvbGlkRmlsbEJydXNoID0gbnVs
bHB0cjsKLQotICAgIG1fZGF0YS0+bV9zb2xpZEZpbGxCcnVzaCA9IGJydXNoV2l0aENvbG9yKGZp
bGxDb2xvcigpKTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIHBsYXRm
b3JtQ29udGV4dCgpLT5tX3NvbGlkRmlsbEJydXNoID0gYnJ1c2hXaXRoQ29sb3IoZmlsbENvbG9y
KCkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TaG91bGRBbnRpYWxp
YXMoYm9vbCBlbmFibGUpCkBAIC0xODkwLDkgKzExNzAsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4
dDo6c2V0UGxhdGZvcm1TaG91bGRBCiAgICAgICAgIHJldHVybjsKIAogICAgIEFTU0VSVCghbV9p
bXBsKTsKLQotICAgIGF1dG8gYW50aWFsaWFzTW9kZSA9IGVuYWJsZSA/IEQyRDFfQU5USUFMSUFT
X01PREVfUEVSX1BSSU1JVElWRSA6IEQyRDFfQU5USUFMSUFTX01PREVfQUxJQVNFRDsKLSAgICBw
bGF0Zm9ybUNvbnRleHQoKS0+U2V0QW50aWFsaWFzTW9kZShhbnRpYWxpYXNNb2RlKTsKKyAgICBB
U1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpTdGF0ZTo6c2V0U2hv
dWxkQW50aWFsaWFzKCpwbGF0Zm9ybUNvbnRleHQoKSwgZW5hYmxlKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU2hvdWxkU21vb3RoRm9udHMoYm9vbCBlbmFibGUpCkBA
IC0xOTAzLDcgKzExODIsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TaG91
bGRTCiAgICAgQVNTRVJUKCFtX2ltcGwpOwogCiAgICAgYXV0byBmb250U21vb3RoaW5nTW9kZSA9
IGVuYWJsZSA/IEQyRDFfVEVYVF9BTlRJQUxJQVNfTU9ERV9DTEVBUlRZUEUgOiBEMkQxX1RFWFRf
QU5USUFMSUFTX01PREVfQUxJQVNFRDsKLSAgICBwbGF0Zm9ybUNvbnRleHQoKS0+U2V0VGV4dEFu
dGlhbGlhc01vZGUoZm9udFNtb290aGluZ01vZGUpOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5y
ZW5kZXJUYXJnZXQoKS0+U2V0VGV4dEFudGlhbGlhc01vZGUoZm9udFNtb290aGluZ01vZGUpOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1BbHBoYShmbG9hdCBhbHBoYSkK
QEAgLTE5MTUsMTIxICsxMTk0LDE1IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9y
bUFscGhhKGYKICAgICBtX2RhdGEtPnNldEFscGhhKGFscGhhKTsKIH0KIAotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldFBsYXRmb3JtQ29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJhdG9y
IG1vZGUsIEJsZW5kTW9kZSBibGVuZE1vZGUpCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxh
dGZvcm1Db21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3BlcmF0
b3IsIEJsZW5kTW9kZSBibGVuZE1vZGUpCiB7CiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
ICAgICAgICAgcmV0dXJuOwogCiAgICAgQVNTRVJUKCFtX2ltcGwpOwogCi0gICAgRDJEMV9CTEVO
RF9NT0RFIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9TQ1JFRU47Ci0gICAgRDJE
MV9DT01QT1NJVEVfTU9ERSB0YXJnZXRDb21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9E
RV9TT1VSQ0VfQVRPUDsgLy8gPz8/Ci0KLSAgICBpZiAoYmxlbmRNb2RlICE9IEJsZW5kTW9kZTo6
Tm9ybWFsKSB7Ci0gICAgICAgIHN3aXRjaCAoYmxlbmRNb2RlKSB7Ci0gICAgICAgIGNhc2UgQmxl
bmRNb2RlOjpNdWx0aXBseToKLSAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxF
TkRfTU9ERV9NVUxUSVBMWTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5k
TW9kZTo6U2NyZWVuOgotICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9N
T0RFX1NDUkVFTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6
T3ZlcmxheToKLSAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9P
VkVSTEFZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpEYXJr
ZW46Ci0gICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfREFSS0VO
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpMaWdodGVuOgot
ICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0xJR0hURU47Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OkNvbG9yRG9kZ2U6Ci0g
ICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfQ09MT1JfRE9ER0U7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OkNvbG9yQnVybjoK
LSAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DT0xPUl9CVVJO
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpIYXJkTGlnaHQ6
Ci0gICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfSEFSRF9MSUdI
VDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6U29mdExpZ2h0
OgotICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX1NPRlRfTElH
SFQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCbGVuZE1vZGU6OkRpZmZlcmVu
Y2U6Ci0gICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfRElGRkVS
RU5DRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6RXhjbHVz
aW9uOgotICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0VYQ0xV
U0lPTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6SHVlOgot
ICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0hVRTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6U2F0dXJhdGlvbjoKLSAgICAg
ICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9TQVRVUkFUSU9OOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpDb2xvcjoKLSAgICAgICAg
ICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DT0xPUjsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6THVtaW5vc2l0eToKLSAgICAgICAgICAg
IHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9MVU1JTk9TSVRZOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmxlbmRNb2RlOjpQbHVzRGFya2VyOgotICAgICAgICAg
ICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0RBUktFUl9DT0xPUjsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsZW5kTW9kZTo6UGx1c0xpZ2h0ZXI6Ci0gICAg
ICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfTElHSFRFUl9DT0xPUjsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAg
ICAgY2FzZSBDb21wb3NpdGVDbGVhcjoKLSAgICAgICAgICAgIC8vIEZJWE1FOiB0YXJnZXRCbGVu
ZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfQ0xFQVI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgY2FzZSBDb21wb3NpdGVDb3B5OgotICAgICAgICAgICAgLy8gRklYTUU6IHRhcmdldEJsZW5k
TW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DT1BZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgQ29tcG9zaXRlU291cmNlT3ZlcjoKLSAgICAgICAgICAgIC8vIEZJWE1FOiBrQ0dCbGVu
ZE1vZGVOb3JtYWwKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENvbXBvc2l0ZVNv
dXJjZUluOgotICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRF
X01PREVfU09VUkNFX0lOOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29tcG9z
aXRlU291cmNlT3V0OgotICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09N
UE9TSVRFX01PREVfU09VUkNFX09VVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IENvbXBvc2l0ZVNvdXJjZUF0b3A6Ci0gICAgICAgICAgICB0YXJnZXRDb21wb3NpdGVNb2RlID0g
RDJEMV9DT01QT1NJVEVfTU9ERV9TT1VSQ0VfQVRPUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uT3ZlcjoKLSAgICAgICAgICAgIHRhcmdldENv
bXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX0RFU1RJTkFUSU9OX09WRVI7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbkluOgotICAg
ICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQyRDFfQ09NUE9TSVRFX01PREVfREVTVElO
QVRJT05fSU47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0
aW5hdGlvbk91dDoKLSAgICAgICAgICAgIHRhcmdldENvbXBvc2l0ZU1vZGUgPSBEMkQxX0NPTVBP
U0lURV9NT0RFX0RFU1RJTkFUSU9OX09VVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uQXRvcDoKLSAgICAgICAgICAgIHRhcmdldENvbXBvc2l0
ZU1vZGUgPSBEMkQxX0NPTVBPU0lURV9NT0RFX0RFU1RJTkFUSU9OX0FUT1A7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVYT1I6Ci0gICAgICAgICAgICB0YXJnZXRD
b21wb3NpdGVNb2RlID0gRDJEMV9DT01QT1NJVEVfTU9ERV9YT1I7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVQbHVzRGFya2VyOgotICAgICAgICAgICAgdGFyZ2V0
QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0RBUktFUl9DT0xPUjsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIENvbXBvc2l0ZVBsdXNMaWdodGVyOgotICAgICAgICAgICAgdGFy
Z2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0xJR0hURVJfQ09MT1I7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEaWZmZXJlbmNlOgotICAgICAgICAgICAg
dGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0RJRkZFUkVOQ0U7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fZGF0YS0+bV9ibGVuZE1vZGUgPSB0
YXJnZXRCbGVuZE1vZGU7Ci0gICAgbV9kYXRhLT5tX2NvbXBvc2l0ZU1vZGUgPSB0YXJnZXRDb21w
b3NpdGVNb2RlOworICAgIEFTU0VSVChoYXNQbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgRGlyZWN0
MkQ6OlN0YXRlOjpzZXRDb21wb3NpdGVPcGVyYXRpb24oKnBsYXRmb3JtQ29udGV4dCgpLCBjb21w
b3NpdGVPcGVyYXRvciwgYmxlbmRNb2RlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnBs
YXRmb3JtQXBwbHlEZXZpY2VTY2FsZUZhY3RvcihmbG9hdCBkZXZpY2VTY2FsZUZhY3RvcikKQEAg
LTIwNTAsMTMgKzEyMjMsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1GaWxsRWxs
aXBzCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBhdXRvIGQyZEVsbGlwc2UgPSBEMkQx
OjpFbGxpcHNlKGVsbGlwc2UuY2VudGVyKCksIDAuNSAqIGVsbGlwc2Uud2lkdGgoKSwgMC41ICog
ZWxsaXBzZS5oZWlnaHQoKSk7Ci0KLSAgICBwbGF0Zm9ybUNvbnRleHQoKS0+U2V0VGFncygxLCBf
X0xJTkVfXyk7Ci0KLSAgICBkcmF3V2l0aG91dFNoYWRvdyhlbGxpcHNlLCBbdGhpcywgZDJkRWxs
aXBzZV0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgewotICAgICAgICByZW5kZXJU
YXJnZXQtPkZpbGxFbGxpcHNlKCZkMmRFbGxpcHNlLCBzb2xpZEZpbGxCcnVzaCgpKTsKLSAgICB9
KTsKKyAgICBBU1NFUlQoaGFzUGxhdGZvcm1Db250ZXh0KCkpOworICAgIERpcmVjdDJEOjpmaWxs
RWxsaXBzZSgqcGxhdGZvcm1Db250ZXh0KCksIGVsbGlwc2UsIG1fc3RhdGUuZmlsbENvbG9yLCBt
X3N0YXRlLnN0cm9rZVN0eWxlLCBtX3N0YXRlLnN0cm9rZUNvbG9yLCBtX3N0YXRlLnN0cm9rZVRo
aWNrbmVzcyk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybVN0cm9rZUVsbGlw
c2UoY29uc3QgRmxvYXRSZWN0JiBlbGxpcHNlKQpAQCAtMjA3MiwxMyArMTI0MCw4IEBAIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybVN0cm9rZUVsbGkKICAgICAgICAgcmV0dXJuOwogICAg
IH0KIAotICAgIGF1dG8gZDJkRWxsaXBzZSA9IEQyRDE6OkVsbGlwc2UoZWxsaXBzZS5jZW50ZXIo
KSwgMC41ICogZWxsaXBzZS53aWR0aCgpLCAwLjUgKiBlbGxpcHNlLmhlaWdodCgpKTsKLQotICAg
IHBsYXRmb3JtQ29udGV4dCgpLT5TZXRUYWdzKDEsIF9fTElORV9fKTsKLQotICAgIGRyYXdXaXRo
b3V0U2hhZG93KGVsbGlwc2UsIFt0aGlzLCBkMmRFbGxpcHNlXShJRDJEMVJlbmRlclRhcmdldCog
cmVuZGVyVGFyZ2V0KSB7Ci0gICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0VsbGlwc2UoJmQyZEVs
bGlwc2UsIHNvbGlkU3Ryb2tlQnJ1c2goKSwgc3Ryb2tlVGhpY2tuZXNzKCksIG1fZGF0YS0+c3Ry
b2tlU3R5bGUoKSk7Ci0gICAgfSk7CisgICAgQVNTRVJUKGhhc1BsYXRmb3JtQ29udGV4dCgpKTsK
KyAgICBEaXJlY3QyRDo6ZHJhd0VsbGlwc2UoKnBsYXRmb3JtQ29udGV4dCgpLCBlbGxpcHNlLCBt
X3N0YXRlLnN0cm9rZVN0eWxlLCBtX3N0YXRlLnN0cm9rZUNvbG9yLCBtX3N0YXRlLnN0cm9rZVRo
aWNrbmVzcyk7CiB9CiAKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0
MkQuY3BwCShub25leGlzdGVudCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRJbXBsRGly
ZWN0MkQuaCIKKworI2lmIFVTRShESVJFQ1QyRCkKKworI2luY2x1ZGUgIkRpcmVjdDJET3BlcmF0
aW9ucy5oIgorI2luY2x1ZGUgIkZsb2F0Um91bmRlZFJlY3QuaCIKKyNpbmNsdWRlICJGb250Lmgi
CisjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
KyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5oIgorI2lu
Y2x1ZGUgIkltYWdlQnVmZmVyLmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIk5v
dEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dElt
cGxGYWN0b3J5IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6Y3JlYXRlRmFjdG9yeShQbGF0
Zm9ybUNvbnRleHREaXJlY3QyRCYgcGxhdGZvcm1Db250ZXh0KQoreworICAgIHJldHVybiBHcmFw
aGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dEltcGxGYWN0b3J5KAorICAgICAgICBbJnBsYXRm
b3JtQ29udGV4dF0oR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0KQorICAgICAgICB7CisgICAgICAg
ICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ+
KGNvbnRleHQsIHBsYXRmb3JtQ29udGV4dCk7CisgICAgICAgIH0pOworfQorCitHcmFwaGljc0Nv
bnRleHQ6OkdyYXBoaWNzQ29udGV4dEltcGxGYWN0b3J5IEdyYXBoaWNzQ29udGV4dEltcGxEaXJl
Y3QyRDo6Y3JlYXRlRmFjdG9yeShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KQorewor
ICAgIHJldHVybiBHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dEltcGxGYWN0b3J5KAor
ICAgICAgICBbcmVuZGVyVGFyZ2V0XShHcmFwaGljc0NvbnRleHQmIGNvbnRleHQpCisgICAgICAg
IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEdyYXBoaWNzQ29udGV4dElt
cGxEaXJlY3QyRD4oY29udGV4dCwgcmVuZGVyVGFyZ2V0KTsKKyAgICAgICAgfSk7Cit9CisKK0dy
YXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEKEdy
YXBoaWNzQ29udGV4dCYgY29udGV4dCwgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmIHBsYXRmb3Jt
Q29udGV4dCkKKyAgICA6IEdyYXBoaWNzQ29udGV4dEltcGwoY29udGV4dCwgRmxvYXRSZWN0IHsg
fSwgQWZmaW5lVHJhbnNmb3JtIHsgfSkKKyAgICAsIG1fcGxhdGZvcm1Db250ZXh0KHBsYXRmb3Jt
Q29udGV4dCkKKyAgICAsIG1fcHJpdmF0ZShzdGQ6Om1ha2VfdW5pcXVlPEdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZT4obV9wbGF0Zm9ybUNvbnRleHQsIEdyYXBoaWNzQ29udGV4dDo6Qml0
bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSkpCit7CisgICAgbV9wbGF0Zm9ybUNv
bnRleHQuc2V0R3JhcGhpY3NDb250ZXh0UHJpdmF0ZShtX3ByaXZhdGUuZ2V0KCkpOworICAgIG1f
cHJpdmF0ZS0+c3luY0NvbnRleHQobV9wbGF0Zm9ybUNvbnRleHQpOworfQorCitHcmFwaGljc0Nv
bnRleHRJbXBsRGlyZWN0MkQ6OkdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRChHcmFwaGljc0Nv
bnRleHQmIGNvbnRleHQsIElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpCisgICAgOiBH
cmFwaGljc0NvbnRleHRJbXBsKGNvbnRleHQsIEZsb2F0UmVjdCB7IH0sIEFmZmluZVRyYW5zZm9y
bSB7IH0pCisgICAgLCBtX293bmVkUGxhdGZvcm1Db250ZXh0KHN0ZDo6bWFrZV91bmlxdWU8UGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQ+KHJlbmRlclRhcmdldCkpCisgICAgLCBtX3BsYXRmb3JtQ29u
dGV4dCgqbV9vd25lZFBsYXRmb3JtQ29udGV4dCkKKyAgICAsIG1fcHJpdmF0ZShzdGQ6Om1ha2Vf
dW5pcXVlPEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZT4obV9wbGF0Zm9ybUNvbnRleHQs
IEdyYXBoaWNzQ29udGV4dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSkp
Cit7CisgICAgbV9wbGF0Zm9ybUNvbnRleHQuc2V0R3JhcGhpY3NDb250ZXh0UHJpdmF0ZShtX3By
aXZhdGUuZ2V0KCkpOworICAgIG1fcHJpdmF0ZS0+c3luY0NvbnRleHQobV9wbGF0Zm9ybUNvbnRl
eHQpOworfQorCitHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6On5HcmFwaGljc0NvbnRleHRJ
bXBsRGlyZWN0MkQoKQoreworICAgIG1fcGxhdGZvcm1Db250ZXh0LnNldEdyYXBoaWNzQ29udGV4
dFByaXZhdGUobnVsbHB0cik7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJE
OjpoYXNQbGF0Zm9ybUNvbnRleHQoKSBjb25zdAoreworICAgIHJldHVybiB0cnVlOworfQorCitQ
bGF0Zm9ybUNvbnRleHREaXJlY3QyRCogR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpwbGF0
Zm9ybUNvbnRleHQoKSBjb25zdAoreworICAgIHJldHVybiAmbV9wbGF0Zm9ybUNvbnRleHQ7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjp1cGRhdGVTdGF0ZShjb25zdCBH
cmFwaGljc0NvbnRleHRTdGF0ZSYgc3RhdGUsIEdyYXBoaWNzQ29udGV4dFN0YXRlOjpTdGF0ZUNo
YW5nZUZsYWdzIGZsYWdzKQoreworICAgIGlmIChmbGFncyAmIEdyYXBoaWNzQ29udGV4dFN0YXRl
OjpTdHJva2VUaGlja25lc3NDaGFuZ2UpCisgICAgICAgIERpcmVjdDJEOjpTdGF0ZTo6c2V0U3Ry
b2tlVGhpY2tuZXNzKG1fcGxhdGZvcm1Db250ZXh0LCBzdGF0ZS5zdHJva2VUaGlja25lc3MpOwor
CisgICAgaWYgKGZsYWdzICYgR3JhcGhpY3NDb250ZXh0U3RhdGU6OlN0cm9rZVN0eWxlQ2hhbmdl
KQorICAgICAgICBEaXJlY3QyRDo6U3RhdGU6OnNldFN0cm9rZVN0eWxlKG1fcGxhdGZvcm1Db250
ZXh0LCBzdGF0ZS5zdHJva2VTdHlsZSk7CisKKyAgICBpZiAoZmxhZ3MgJiBHcmFwaGljc0NvbnRl
eHRTdGF0ZTo6U2hhZG93Q2hhbmdlKSB7CisgICAgICAgIGlmIChzdGF0ZS5zaGFkb3dzSWdub3Jl
VHJhbnNmb3JtcykgeworICAgICAgICAgICAgLy8gTWVhbmluZyB0aGF0IHRoaXMgZ3JhcGhpY3Mg
Y29udGV4dCBpcyBhc3NvY2lhdGVkIHdpdGggYSBDYW52YXNSZW5kZXJpbmdDb250ZXh0CisgICAg
ICAgICAgICAvLyBXZSBmbGlwIHRoZSBoZWlnaHQgc2luY2UgQ0cgYW5kIEhUTUw1IENhbnZhcyBo
YXZlIG9wcG9zaXRlIFkgYXhpcworICAgICAgICAgICAgYXV0byYgbXV0YWJsZVN0YXRlID0gY29u
c3RfY2FzdDxHcmFwaGljc0NvbnRleHRTdGF0ZSY+KGdyYXBoaWNzQ29udGV4dCgpLnN0YXRlKCkp
OworICAgICAgICAgICAgYXV0byYgc2hhZG93T2Zmc2V0ID0gc3RhdGUuc2hhZG93T2Zmc2V0Owor
ICAgICAgICAgICAgbXV0YWJsZVN0YXRlLnNoYWRvd09mZnNldCA9IHsgc2hhZG93T2Zmc2V0Lndp
ZHRoKCksIC1zaGFkb3dPZmZzZXQuaGVpZ2h0KCkgfTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGlmIChmbGFncyAmIEdyYXBoaWNzQ29udGV4dFN0YXRlOjpDb21wb3NpdGVPcGVyYXRpb25DaGFu
Z2UpCisgICAgICAgIERpcmVjdDJEOjpTdGF0ZTo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKG1fcGxh
dGZvcm1Db250ZXh0LCBzdGF0ZS5jb21wb3NpdGVPcGVyYXRvciwgc3RhdGUuYmxlbmRNb2RlKTsK
KworICAgIGlmIChmbGFncyAmIEdyYXBoaWNzQ29udGV4dFN0YXRlOjpTaG91bGRBbnRpYWxpYXND
aGFuZ2UpCisgICAgICAgIERpcmVjdDJEOjpTdGF0ZTo6c2V0U2hvdWxkQW50aWFsaWFzKG1fcGxh
dGZvcm1Db250ZXh0LCBzdGF0ZS5zaG91bGRBbnRpYWxpYXMpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dEltcGxEaXJlY3QyRDo6Y2xlYXJTaGFkb3coKQoreworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dEltcGxEaXJlY3QyRDo6c2V0TGluZUNhcChMaW5lQ2FwIGxpbmVDYXApCit7CisgICAg
RGlyZWN0MkQ6OnNldExpbmVDYXAobV9wbGF0Zm9ybUNvbnRleHQsIGxpbmVDYXApOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6c2V0TGluZURhc2goY29uc3QgRGFzaEFy
cmF5JiBkYXNoZXMsIGZsb2F0IGRhc2hPZmZzZXQpCit7CisgICAgRGlyZWN0MkQ6OnNldExpbmVE
YXNoKG1fcGxhdGZvcm1Db250ZXh0LCBkYXNoZXMsIGRhc2hPZmZzZXQpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6c2V0TGluZUpvaW4oTGluZUpvaW4gbGluZUpvaW4p
Cit7CisgICAgRGlyZWN0MkQ6OnNldExpbmVKb2luKG1fcGxhdGZvcm1Db250ZXh0LCBsaW5lSm9p
bik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpzZXRNaXRlckxpbWl0
KGZsb2F0IG1pdGVyTGltaXQpCit7CisgICAgRGlyZWN0MkQ6OnNldE1pdGVyTGltaXQobV9wbGF0
Zm9ybUNvbnRleHQsIG1pdGVyTGltaXQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxE
aXJlY3QyRDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIGF1dG8mIHN0
YXRlID0gZ3JhcGhpY3NDb250ZXh0KCkuc3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZmlsbFJlY3Qo
bV9wbGF0Zm9ybUNvbnRleHQsIHJlY3QsIERpcmVjdDJEOjpGaWxsU291cmNlKHN0YXRlLCBtX3Bs
YXRmb3JtQ29udGV4dCksIERpcmVjdDJEOjpTaGFkb3dTdGF0ZShzdGF0ZSkpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiBy
ZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgRGlyZWN0MkQ6OmZpbGxSZWN0KG1fcGxh
dGZvcm1Db250ZXh0LCByZWN0LCBjb2xvciwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKGdyYXBoaWNz
Q29udGV4dCgpLnN0YXRlKCkpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0
MkQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgR3JhZGllbnQmIGdyYWRpZW50KQor
eworICAgIGF1dG8gcGxhdGZvcm1HcmFkaWVudCA9IGFkb3B0Q09NKGdyYWRpZW50LmNyZWF0ZVBs
YXRmb3JtR3JhZGllbnRJZk5lY2Vzc2FyeShtX3BsYXRmb3JtQ29udGV4dC5yZW5kZXJUYXJnZXQo
KSkpOworICAgIGlmICghcGxhdGZvcm1HcmFkaWVudCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
RGlyZWN0MkQ6OnNhdmUobV9wbGF0Zm9ybUNvbnRleHQpOworICAgIERpcmVjdDJEOjpmaWxsUmVj
dFdpdGhHcmFkaWVudChtX3BsYXRmb3JtQ29udGV4dCwgcmVjdCwgcGxhdGZvcm1HcmFkaWVudC5n
ZXQoKSk7CisgICAgRGlyZWN0MkQ6OnJlc3RvcmUobV9wbGF0Zm9ybUNvbnRleHQpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0
JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9w
ZXJhdG9yLCBCbGVuZE1vZGUgYmxlbmRNb2RlKQoreworICAgIGF1dG8mIHN0YXRlID0gZ3JhcGhp
Y3NDb250ZXh0KCkuc3RhdGUoKTsKKyAgICBDb21wb3NpdGVPcGVyYXRvciBwcmV2aW91c09wZXJh
dG9yID0gc3RhdGUuY29tcG9zaXRlT3BlcmF0b3I7CisKKyAgICBEaXJlY3QyRDo6U3RhdGU6OnNl
dENvbXBvc2l0ZU9wZXJhdGlvbihtX3BsYXRmb3JtQ29udGV4dCwgY29tcG9zaXRlT3BlcmF0b3Is
IGJsZW5kTW9kZSk7CisgICAgRGlyZWN0MkQ6OmZpbGxSZWN0KG1fcGxhdGZvcm1Db250ZXh0LCBy
ZWN0LCBjb2xvciwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0YXRlKSk7CisgICAgRGlyZWN0MkQ6
OlN0YXRlOjpzZXRDb21wb3NpdGVPcGVyYXRpb24obV9wbGF0Zm9ybUNvbnRleHQsIHByZXZpb3Vz
T3BlcmF0b3IsIEJsZW5kTW9kZTo6Tm9ybWFsKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJ
bXBsRGlyZWN0MkQ6OmZpbGxSb3VuZGVkUmVjdChjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiByZWN0
LCBjb25zdCBDb2xvciYgY29sb3IsIEJsZW5kTW9kZSBibGVuZE1vZGUpCit7CisgICAgYXV0byYg
c3RhdGUgPSBncmFwaGljc0NvbnRleHQoKS5zdGF0ZSgpOworCisgICAgQ29tcG9zaXRlT3BlcmF0
b3IgcHJldmlvdXNPcGVyYXRvciA9IHN0YXRlLmNvbXBvc2l0ZU9wZXJhdG9yOworICAgIERpcmVj
dDJEOjpTdGF0ZTo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKG1fcGxhdGZvcm1Db250ZXh0LCBwcmV2
aW91c09wZXJhdG9yLCBibGVuZE1vZGUpOworCisgICAgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlIHNo
YWRvd1N0YXRlKHN0YXRlKTsKKyAgICBpZiAocmVjdC5pc1JvdW5kZWQoKSkKKyAgICAgICAgRGly
ZWN0MkQ6OmZpbGxSb3VuZGVkUmVjdChtX3BsYXRmb3JtQ29udGV4dCwgcmVjdCwgY29sb3IsIHNo
YWRvd1N0YXRlKTsKKyAgICBlbHNlCisgICAgICAgIERpcmVjdDJEOjpmaWxsUmVjdChtX3BsYXRm
b3JtQ29udGV4dCwgcmVjdC5yZWN0KCksIGNvbG9yLCBzaGFkb3dTdGF0ZSk7CisKKyAgICBEaXJl
Y3QyRDo6U3RhdGU6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihtX3BsYXRmb3JtQ29udGV4dCwgcHJl
dmlvdXNPcGVyYXRvciwgQmxlbmRNb2RlOjpOb3JtYWwpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dEltcGxEaXJlY3QyRDo6ZmlsbFJlY3RXaXRoUm91bmRlZEhvbGUoY29uc3QgRmxvYXRSZWN0
JiByZWN0LCBjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiByb3VuZGVkSG9sZVJlY3QsIGNvbnN0IENv
bG9yJikKK3sKKyAgICBEaXJlY3QyRDo6ZmlsbFJlY3RXaXRoUm91bmRlZEhvbGUobV9wbGF0Zm9y
bUNvbnRleHQsIHJlY3QsIHJvdW5kZWRIb2xlUmVjdCwgeyB9LCBEaXJlY3QyRDo6U2hhZG93U3Rh
dGUoZ3JhcGhpY3NDb250ZXh0KCkuc3RhdGUoKSkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dEltcGxEaXJlY3QyRDo6ZmlsbFBhdGgoY29uc3QgUGF0aCYgcGF0aCkKK3sKKyAgICBhdXRvJiBz
dGF0ZSA9IGdyYXBoaWNzQ29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmZpbGxQYXRo
KG1fcGxhdGZvcm1Db250ZXh0LCBwYXRoLCBEaXJlY3QyRDo6RmlsbFNvdXJjZShzdGF0ZSwgbV9w
bGF0Zm9ybUNvbnRleHQpLCBEaXJlY3QyRDo6U2hhZG93U3RhdGUoc3RhdGUpKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmZpbGxFbGxpcHNlKGNvbnN0IEZsb2F0UmVj
dCYgcmVjdCkKK3sKKyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRFbGxpcHNlKHJlY3QpOwor
ICAgIGZpbGxQYXRoKHBhdGgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3Qy
RDo6c3Ryb2tlUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGZsb2F0IGxpbmVXaWR0aCkKK3sK
KyAgICBhdXRvJiBzdGF0ZSA9IGdyYXBoaWNzQ29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0
MkQ6OnN0cm9rZVJlY3QobV9wbGF0Zm9ybUNvbnRleHQsIHJlY3QsIGxpbmVXaWR0aCwgRGlyZWN0
MkQ6OlN0cm9rZVNvdXJjZShzdGF0ZSwgbV9wbGF0Zm9ybUNvbnRleHQpLCBEaXJlY3QyRDo6U2hh
ZG93U3RhdGUoc3RhdGUpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6
OnN0cm9rZVBhdGgoY29uc3QgUGF0aCYgcGF0aCkKK3sKKyAgICBhdXRvJiBzdGF0ZSA9IGdyYXBo
aWNzQ29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OnN0cm9rZVBhdGgobV9wbGF0Zm9y
bUNvbnRleHQsIHBhdGgsIERpcmVjdDJEOjpTdHJva2VTb3VyY2Uoc3RhdGUsIG1fcGxhdGZvcm1D
b250ZXh0KSwgRGlyZWN0MkQ6OlNoYWRvd1N0YXRlKHN0YXRlKSk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0SW1wbERpcmVjdDJEOjpzdHJva2VFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYgcmVj
dCkKK3sKKyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRFbGxpcHNlKHJlY3QpOworICAgIHN0
cm9rZVBhdGgocGF0aCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpj
bGVhclJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIERpcmVjdDJEOjpjbGVhclJl
Y3QobV9wbGF0Zm9ybUNvbnRleHQsIHJlY3QpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dElt
cGxEaXJlY3QyRDo6ZHJhd0dseXBocyhjb25zdCBGb250JiBmb250LCBjb25zdCBHbHlwaEJ1ZmZl
ciYgZ2x5cGhCdWZmZXIsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIG51bUdseXBocywgY29uc3Qg
RmxvYXRQb2ludCYgcG9pbnQsIEZvbnRTbW9vdGhpbmdNb2RlIGZvbnRTbW9vdGhpbmcpCit7Cisg
ICAgVU5VU0VEX1BBUkFNKGZvbnRTbW9vdGhpbmcpOworICAgIGlmICghZm9udC5wbGF0Zm9ybURh
dGEoKS5zaXplKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9
CisKK0ltYWdlRHJhd1Jlc3VsdCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdJbWFn
ZShJbWFnZSYgaW1hZ2UsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdGluYXRpb24sIGNvbnN0IEZsb2F0
UmVjdCYgc291cmNlLCBjb25zdCBJbWFnZVBhaW50aW5nT3B0aW9ucyYgaW1hZ2VQYWludGluZ09w
dGlvbnMpCit7CisgICAgcmV0dXJuIEdyYXBoaWNzQ29udGV4dEltcGw6OmRyYXdJbWFnZUltcGwo
Z3JhcGhpY3NDb250ZXh0KCksIGltYWdlLCBkZXN0aW5hdGlvbiwgc291cmNlLCBpbWFnZVBhaW50
aW5nT3B0aW9ucyk7Cit9CisKK0ltYWdlRHJhd1Jlc3VsdCBHcmFwaGljc0NvbnRleHRJbXBsRGly
ZWN0MkQ6OmRyYXdUaWxlZEltYWdlKEltYWdlJiBpbWFnZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0
aW5hdGlvbiwgY29uc3QgRmxvYXRQb2ludCYgc291cmNlLCBjb25zdCBGbG9hdFNpemUmIHRpbGVT
aXplLCBjb25zdCBGbG9hdFNpemUmIHNwYWNpbmcsIGNvbnN0IEltYWdlUGFpbnRpbmdPcHRpb25z
JiBpbWFnZVBhaW50aW5nT3B0aW9ucykKK3sKKyAgICByZXR1cm4gR3JhcGhpY3NDb250ZXh0SW1w
bDo6ZHJhd1RpbGVkSW1hZ2VJbXBsKGdyYXBoaWNzQ29udGV4dCgpLCBpbWFnZSwgZGVzdGluYXRp
b24sIHNvdXJjZSwgdGlsZVNpemUsIHNwYWNpbmcsIGltYWdlUGFpbnRpbmdPcHRpb25zKTsKK30K
KworSW1hZ2VEcmF3UmVzdWx0IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZHJhd1RpbGVk
SW1hZ2UoSW1hZ2UmIGltYWdlLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RpbmF0aW9uLCBjb25zdCBG
bG9hdFJlY3QmIHNvdXJjZSwgY29uc3QgRmxvYXRTaXplJiB0aWxlU2NhbGVGYWN0b3IsIEltYWdl
OjpUaWxlUnVsZSBoUnVsZSwgSW1hZ2U6OlRpbGVSdWxlIHZSdWxlLCBjb25zdCBJbWFnZVBhaW50
aW5nT3B0aW9ucyYgaW1hZ2VQYWludGluZ09wdGlvbnMpCit7CisgICAgcmV0dXJuIEdyYXBoaWNz
Q29udGV4dEltcGw6OmRyYXdUaWxlZEltYWdlSW1wbChncmFwaGljc0NvbnRleHQoKSwgaW1hZ2Us
IGRlc3RpbmF0aW9uLCBzb3VyY2UsIHRpbGVTY2FsZUZhY3RvciwgaFJ1bGUsIHZSdWxlLCBpbWFn
ZVBhaW50aW5nT3B0aW9ucyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJE
OjpkcmF3TmF0aXZlSW1hZ2UoY29uc3QgTmF0aXZlSW1hZ2VQdHImIGltYWdlLCBjb25zdCBGbG9h
dFNpemUmIGltYWdlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRS
ZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcGVyYXRvciwgQmxlbmRN
b2RlIGJsZW5kTW9kZSwgSW1hZ2VPcmllbnRhdGlvbiBvcmllbnRhdGlvbikKK3sKKyAgICBhdXRv
JiBzdGF0ZSA9IGdyYXBoaWNzQ29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmRyYXdO
YXRpdmVJbWFnZShtX3BsYXRmb3JtQ29udGV4dCwgaW1hZ2UuZ2V0KCksIGltYWdlU2l6ZSwgZGVz
dFJlY3QsIHNyY1JlY3QsIGNvbXBvc2l0ZU9wZXJhdG9yLCBibGVuZE1vZGUsIG9yaWVudGF0aW9u
LCBzdGF0ZS5pbWFnZUludGVycG9sYXRpb25RdWFsaXR5LCBzdGF0ZS5hbHBoYSwgRGlyZWN0MkQ6
OlNoYWRvd1N0YXRlKHN0YXRlKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVj
dDJEOjpkcmF3UGF0dGVybihJbWFnZSYgaW1hZ2UsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3Qs
IGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVy
blRyYW5zZm9ybSwgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIGNvbnN0IEZsb2F0U2l6ZSYsIENv
bXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUgYmxlbmRNb2RlKQor
eworICAgIGlmIChhdXRvIHN1cmZhY2UgPSBpbWFnZS5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFt
ZSgpKQorICAgICAgICBEaXJlY3QyRDo6ZHJhd1BhdHRlcm4obV9wbGF0Zm9ybUNvbnRleHQsIHN1
cmZhY2UuZ2V0KCksIEludFNpemUoaW1hZ2Uuc2l6ZSgpKSwgZGVzdFJlY3QsIHRpbGVSZWN0LCBw
YXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgY29tcG9zaXRlT3BlcmF0b3IsIGJsZW5kTW9kZSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEOjpkcmF3UmVjdChjb25zdCBGbG9h
dFJlY3QmIHJlY3QsIGZsb2F0IGJvcmRlclRoaWNrbmVzcykKK3sKKyAgICBhdXRvJiBzdGF0ZSA9
IGdyYXBoaWNzQ29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmRyYXdSZWN0KG1fcGxh
dGZvcm1Db250ZXh0LCByZWN0LCBib3JkZXJUaGlja25lc3MsIHN0YXRlLmZpbGxDb2xvciwgc3Rh
dGUuc3Ryb2tlU3R5bGUsIHN0YXRlLnN0cm9rZUNvbG9yKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdMaW5lKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50MSwgY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQyKQoreworICAgIGF1dG8mIHN0YXRlID0gZ3JhcGhpY3NDb250
ZXh0KCkuc3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZHJhd0xpbmUobV9wbGF0Zm9ybUNvbnRleHQs
IHBvaW50MSwgcG9pbnQyLCBzdGF0ZS5zdHJva2VTdHlsZSwgc3RhdGUuc3Ryb2tlQ29sb3IsIHN0
YXRlLnN0cm9rZVRoaWNrbmVzcywgc3RhdGUuc2hvdWxkQW50aWFsaWFzKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdMaW5lc0ZvclRleHQoY29uc3QgRmxvYXRQ
b2ludCYgcG9pbnQsIGZsb2F0IHRoaWNrbmVzcywgY29uc3QgRGFzaEFycmF5JiB3aWR0aHMsIGJv
b2wgcHJpbnRpbmcsIGJvb2wgZG91YmxlVW5kZXJsaW5lcykKK3sKKyAgICBhdXRvJiBzdGF0ZSA9
IGdyYXBoaWNzQ29udGV4dCgpLnN0YXRlKCk7CisgICAgRGlyZWN0MkQ6OmRyYXdMaW5lc0ZvclRl
eHQobV9wbGF0Zm9ybUNvbnRleHQsIHBvaW50LCB0aGlja25lc3MsIHdpZHRocywgcHJpbnRpbmcs
IGRvdWJsZVVuZGVybGluZXMsIHN0YXRlLnN0cm9rZUNvbG9yKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdEb3RzRm9yRG9jdW1lbnRNYXJrZXIoY29uc3QgRmxv
YXRSZWN0JiByZWN0LCBEb2N1bWVudE1hcmtlckxpbmVTdHlsZSBzdHlsZSkKK3sKKyAgICBEaXJl
Y3QyRDo6ZHJhd0RvdHNGb3JEb2N1bWVudE1hcmtlcihtX3BsYXRmb3JtQ29udGV4dCwgcmVjdCwg
c3R5bGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZHJhd0VsbGlw
c2UoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIGF1dG8mIHN0YXRlID0gZ3JhcGhpY3ND
b250ZXh0KCkuc3RhdGUoKTsKKyAgICBEaXJlY3QyRDo6ZmlsbEVsbGlwc2UoKnBsYXRmb3JtQ29u
dGV4dCgpLCByZWN0LCBzdGF0ZS5maWxsQ29sb3IsIHN0YXRlLnN0cm9rZVN0eWxlLCBzdGF0ZS5z
dHJva2VDb2xvciwgc3RhdGUuc3Ryb2tlVGhpY2tuZXNzKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdQYXRoKGNvbnN0IFBhdGgmKQoreworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBQYXRoJiBwYXRo
LCBmbG9hdCB3aWR0aCwgZmxvYXQgb2Zmc2V0LCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAg
VU5VU0VEX1BBUkFNKG9mZnNldCk7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgVmVjdG9yPEZs
b2F0UmVjdD4mIHJlY3RzLCBmbG9hdCB3aWR0aCwgZmxvYXQgb2Zmc2V0LCBjb25zdCBDb2xvciYg
Y29sb3IpCit7CisgICAgVU5VU0VEX1BBUkFNKG9mZnNldCk7CisgICAgbm90SW1wbGVtZW50ZWQo
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnNhdmUoKQoreworICAg
IERpcmVjdDJEOjpzYXZlKG1fcGxhdGZvcm1Db250ZXh0KTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHRJbXBsRGlyZWN0MkQ6OnJlc3RvcmUoKQoreworICAgIERpcmVjdDJEOjpyZXN0b3JlKG1f
cGxhdGZvcm1Db250ZXh0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6
OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIERpcmVjdDJEOjp0cmFuc2xhdGUo
bV9wbGF0Zm9ybUNvbnRleHQsIHgsIHkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxE
aXJlY3QyRDo6cm90YXRlKGZsb2F0IGFuZ2xlSW5SYWRpYW5zKQoreworICAgIERpcmVjdDJEOjpy
b3RhdGUobV9wbGF0Zm9ybUNvbnRleHQsIGFuZ2xlSW5SYWRpYW5zKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sK
KyAgICBEaXJlY3QyRDo6c2NhbGUobV9wbGF0Zm9ybUNvbnRleHQsIHNpemUpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5z
Zm9ybSYgdHJhbnNmb3JtKQoreworICAgIERpcmVjdDJEOjpjb25jYXRDVE0obV9wbGF0Zm9ybUNv
bnRleHQsIHRyYW5zZm9ybSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJE
OjpzZXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCit7CisgICAgRGlyZWN0
MkQ6OlN0YXRlOjpzZXRDVE0obV9wbGF0Zm9ybUNvbnRleHQsIHRyYW5zZm9ybSk7Cit9CisKK0Fm
ZmluZVRyYW5zZm9ybSBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmdldENUTShHcmFwaGlj
c0NvbnRleHQ6OkluY2x1ZGVEZXZpY2VTY2FsZSkKK3sKKyAgICByZXR1cm4gRGlyZWN0MkQ6OlN0
YXRlOjpnZXRDVE0obV9wbGF0Zm9ybUNvbnRleHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dEltcGxEaXJlY3QyRDo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9hdCBvcGFjaXR5KQorewor
ICAgIERpcmVjdDJEOjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKG1fcGxhdGZvcm1Db250ZXh0LCBv
cGFjaXR5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OmVuZFRyYW5z
cGFyZW5jeUxheWVyKCkKK3sKKyAgICBEaXJlY3QyRDo6ZW5kVHJhbnNwYXJlbmN5TGF5ZXIobV9w
bGF0Zm9ybUNvbnRleHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6
Y2xpcChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgRGlyZWN0MkQ6OmNsaXAobV9wbGF0
Zm9ybUNvbnRleHQsIHJlY3QpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3Qy
RDo6Y2xpcE91dChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgRGlyZWN0MkQ6OmNsaXBP
dXQobV9wbGF0Zm9ybUNvbnRleHQsIHJlY3QpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dElt
cGxEaXJlY3QyRDo6Y2xpcE91dChjb25zdCBQYXRoJiBwYXRoKQoreworICAgIERpcmVjdDJEOjpj
bGlwT3V0KG1fcGxhdGZvcm1Db250ZXh0LCBwYXRoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHRJbXBsRGlyZWN0MkQ6OmNsaXBQYXRoKGNvbnN0IFBhdGgmIHBhdGgsIFdpbmRSdWxlIGNsaXBS
dWxlKQoreworICAgIERpcmVjdDJEOjpjbGlwUGF0aChtX3BsYXRmb3JtQ29udGV4dCwgcGF0aCwg
Y2xpcFJ1bGUpOworfQorCitJbnRSZWN0IEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRDo6Y2xp
cEJvdW5kcygpCit7CisgICAgcmV0dXJuIERpcmVjdDJEOjpTdGF0ZTo6Z2V0Q2xpcEJvdW5kcyht
X3BsYXRmb3JtQ29udGV4dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJE
OjpjbGlwVG9JbWFnZUJ1ZmZlcihJbWFnZUJ1ZmZlciYgYnVmZmVyLCBjb25zdCBGbG9hdFJlY3Qm
IGRlc3RSZWN0KQoreworICAgIFJlZlB0cjxJbWFnZT4gaW1hZ2UgPSBidWZmZXIuY29weUltYWdl
KERvbnRDb3B5QmFja2luZ1N0b3JlKTsKKyAgICBpZiAoIWltYWdlKQorICAgICAgICByZXR1cm47
CisKKworICAgIGlmIChhdXRvIHN1cmZhY2UgPSBpbWFnZS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50
RnJhbWUoKSkKKyAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHRJbXBsRGlyZWN0MkQ6OmFwcGx5RGV2aWNlU2NhbGVGYWN0b3IoZmxvYXQpCit7Cit9CisK
K0Zsb2F0UmVjdCBHcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0MkQ6OnJvdW5kVG9EZXZpY2VQaXhl
bHMoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBHcmFwaGljc0NvbnRleHQ6OlJvdW5kaW5nTW9kZSkK
K3sKKyAgICByZXR1cm4gRGlyZWN0MkQ6OlN0YXRlOjpyb3VuZFRvRGV2aWNlUGl4ZWxzKG1fcGxh
dGZvcm1Db250ZXh0LCByZWN0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5k
aWYgLy8gVVNFKERJUkVDVDJEKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0dyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRJbXBsRGlyZWN0
MkQuaAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vR3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJELmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I3ByYWdtYSBvbmNlCisKKyNpZiBVU0UoRElSRUNUMkQpCisKKyNpbmNsdWRlICJHcmFwaGljc0Nv
bnRleHRJbXBsLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUGxhdGZvcm1Db250
ZXh0RGlyZWN0MkQ7CisKK2NsYXNzIEdyYXBoaWNzQ29udGV4dEltcGxEaXJlY3QyRCBmaW5hbCA6
IHB1YmxpYyBHcmFwaGljc0NvbnRleHRJbXBsIHsKK3B1YmxpYzoKKyAgICBXRUJDT1JFX0VYUE9S
VCBzdGF0aWMgR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHRJbXBsRmFjdG9yeSBjcmVh
dGVGYWN0b3J5KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJik7CisgICAgV0VCQ09SRV9FWFBPUlQg
c3RhdGljIEdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0SW1wbEZhY3RvcnkgY3JlYXRl
RmFjdG9yeShJRDJEMVJlbmRlclRhcmdldCopOworCisgICAgR3JhcGhpY3NDb250ZXh0SW1wbERp
cmVjdDJEKEdyYXBoaWNzQ29udGV4dCYsIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJik7CisgICAg
R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEKEdyYXBoaWNzQ29udGV4dCYsIElEMkQxUmVuZGVy
VGFyZ2V0Kik7CisgICAgdmlydHVhbCB+R3JhcGhpY3NDb250ZXh0SW1wbERpcmVjdDJEKCk7CisK
KyAgICBib29sIGhhc1BsYXRmb3JtQ29udGV4dCgpIGNvbnN0IG92ZXJyaWRlOworICAgIFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEKiBwbGF0Zm9ybUNvbnRleHQoKSBjb25zdCBvdmVycmlkZTsKKwor
ICAgIHZvaWQgdXBkYXRlU3RhdGUoY29uc3QgR3JhcGhpY3NDb250ZXh0U3RhdGUmLCBHcmFwaGlj
c0NvbnRleHRTdGF0ZTo6U3RhdGVDaGFuZ2VGbGFncykgb3ZlcnJpZGU7CisgICAgdm9pZCBjbGVh
clNoYWRvdygpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRMaW5lQ2FwKExpbmVDYXApIG92ZXJy
aWRlOworICAgIHZvaWQgc2V0TGluZURhc2goY29uc3QgRGFzaEFycmF5JiwgZmxvYXQpIG92ZXJy
aWRlOworICAgIHZvaWQgc2V0TGluZUpvaW4oTGluZUpvaW4pIG92ZXJyaWRlOworICAgIHZvaWQg
c2V0TWl0ZXJMaW1pdChmbG9hdCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGZpbGxSZWN0KGNvbnN0
IEZsb2F0UmVjdCYpIG92ZXJyaWRlOworICAgIHZvaWQgZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0
JiwgY29uc3QgQ29sb3ImKSBvdmVycmlkZTsKKyAgICB2b2lkIGZpbGxSZWN0KGNvbnN0IEZsb2F0
UmVjdCYsIEdyYWRpZW50Jikgb3ZlcnJpZGU7CisgICAgdm9pZCBmaWxsUmVjdChjb25zdCBGbG9h
dFJlY3QmLCBjb25zdCBDb2xvciYsIENvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUpIG92ZXJy
aWRlOworICAgIHZvaWQgZmlsbFJvdW5kZWRSZWN0KGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmLCBj
b25zdCBDb2xvciYsIEJsZW5kTW9kZSkgb3ZlcnJpZGU7CisgICAgdm9pZCBmaWxsUmVjdFdpdGhS
b3VuZGVkSG9sZShjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiwgY29u
c3QgQ29sb3ImKSBvdmVycmlkZTsKKyAgICB2b2lkIGZpbGxQYXRoKGNvbnN0IFBhdGgmKSBvdmVy
cmlkZTsKKyAgICB2b2lkIGZpbGxFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYpIG92ZXJyaWRlOwor
ICAgIHZvaWQgc3Ryb2tlUmVjdChjb25zdCBGbG9hdFJlY3QmLCBmbG9hdCkgb3ZlcnJpZGU7Cisg
ICAgdm9pZCBzdHJva2VQYXRoKGNvbnN0IFBhdGgmKSBvdmVycmlkZTsKKyAgICB2b2lkIHN0cm9r
ZUVsbGlwc2UoY29uc3QgRmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisgICAgdm9pZCBjbGVhclJlY3Qo
Y29uc3QgRmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGRyYXdHbHlwaHMoY29uc3Qg
Rm9udCYsIGNvbnN0IEdseXBoQnVmZmVyJiwgdW5zaWduZWQsIHVuc2lnbmVkLCBjb25zdCBGbG9h
dFBvaW50JiwgRm9udFNtb290aGluZ01vZGUpIG92ZXJyaWRlOworCisgICAgSW1hZ2VEcmF3UmVz
dWx0IGRyYXdJbWFnZShJbWFnZSYsIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IEZsb2F0UmVjdCYs
IGNvbnN0IEltYWdlUGFpbnRpbmdPcHRpb25zJikgb3ZlcnJpZGU7CisgICAgSW1hZ2VEcmF3UmVz
dWx0IGRyYXdUaWxlZEltYWdlKEltYWdlJiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRQ
b2ludCYsIGNvbnN0IEZsb2F0U2l6ZSYsIGNvbnN0IEZsb2F0U2l6ZSYsIGNvbnN0IEltYWdlUGFp
bnRpbmdPcHRpb25zJikgb3ZlcnJpZGU7CisgICAgSW1hZ2VEcmF3UmVzdWx0IGRyYXdUaWxlZElt
YWdlKEltYWdlJiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxv
YXRTaXplJiwgSW1hZ2U6OlRpbGVSdWxlLCBJbWFnZTo6VGlsZVJ1bGUsIGNvbnN0IEltYWdlUGFp
bnRpbmdPcHRpb25zJikgb3ZlcnJpZGU7CisgICAgdm9pZCBkcmF3TmF0aXZlSW1hZ2UoY29uc3Qg
TmF0aXZlSW1hZ2VQdHImLCBjb25zdCBGbG9hdFNpemUmLCBjb25zdCBGbG9hdFJlY3QmLCBjb25z
dCBGbG9hdFJlY3QmLCBDb21wb3NpdGVPcGVyYXRvciwgQmxlbmRNb2RlLCBJbWFnZU9yaWVudGF0
aW9uKSBvdmVycmlkZTsKKyAgICB2b2lkIGRyYXdQYXR0ZXJuKEltYWdlJiwgY29uc3QgRmxvYXRS
ZWN0JiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgY29uc3QgRmxv
YXRQb2ludCYsIGNvbnN0IEZsb2F0U2l6ZSYsIENvbXBvc2l0ZU9wZXJhdG9yLCBCbGVuZE1vZGUg
PSBCbGVuZE1vZGU6Ok5vcm1hbCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGRyYXdSZWN0KGNvbnN0
IEZsb2F0UmVjdCYsIGZsb2F0KSBvdmVycmlkZTsKKyAgICB2b2lkIGRyYXdMaW5lKGNvbnN0IEZs
b2F0UG9pbnQmLCBjb25zdCBGbG9hdFBvaW50Jikgb3ZlcnJpZGU7CisgICAgdm9pZCBkcmF3TGlu
ZXNGb3JUZXh0KGNvbnN0IEZsb2F0UG9pbnQmLCBmbG9hdCB0aGlja25lc3MsIGNvbnN0IERhc2hB
cnJheSYsIGJvb2wsIGJvb2wpIG92ZXJyaWRlOworICAgIHZvaWQgZHJhd0RvdHNGb3JEb2N1bWVu
dE1hcmtlcihjb25zdCBGbG9hdFJlY3QmLCBEb2N1bWVudE1hcmtlckxpbmVTdHlsZSkgb3ZlcnJp
ZGU7CisgICAgdm9pZCBkcmF3RWxsaXBzZShjb25zdCBGbG9hdFJlY3QmKSBvdmVycmlkZTsKKyAg
ICB2b2lkIGRyYXdQYXRoKGNvbnN0IFBhdGgmKSBvdmVycmlkZTsKKworICAgIHZvaWQgZHJhd0Zv
Y3VzUmluZyhjb25zdCBQYXRoJiwgZmxvYXQsIGZsb2F0LCBjb25zdCBDb2xvciYpIG92ZXJyaWRl
OworICAgIHZvaWQgZHJhd0ZvY3VzUmluZyhjb25zdCBWZWN0b3I8RmxvYXRSZWN0PiYsIGZsb2F0
LCBmbG9hdCwgY29uc3QgQ29sb3ImKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2F2ZSgpIG92ZXJy
aWRlOworICAgIHZvaWQgcmVzdG9yZSgpIG92ZXJyaWRlOworCisgICAgdm9pZCB0cmFuc2xhdGUo
ZmxvYXQsIGZsb2F0KSBvdmVycmlkZTsKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCkgb3ZlcnJpZGU7
CisgICAgdm9pZCBzY2FsZShjb25zdCBGbG9hdFNpemUmKSBvdmVycmlkZTsKKyAgICB2b2lkIGNv
bmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mKSBvdmVycmlkZTsKKyAgICB2b2lkIHNldENU
TShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mKSBvdmVycmlkZTsKKyAgICBBZmZpbmVUcmFuc2Zvcm0g
Z2V0Q1RNKEdyYXBoaWNzQ29udGV4dDo6SW5jbHVkZURldmljZVNjYWxlKSBvdmVycmlkZTsKKwor
ICAgIHZvaWQgYmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9hdCkgb3ZlcnJpZGU7CisgICAgdm9p
ZCBlbmRUcmFuc3BhcmVuY3lMYXllcigpIG92ZXJyaWRlOworCisgICAgdm9pZCBjbGlwKGNvbnN0
IEZsb2F0UmVjdCYpIG92ZXJyaWRlOworICAgIHZvaWQgY2xpcE91dChjb25zdCBGbG9hdFJlY3Qm
KSBvdmVycmlkZTsKKyAgICB2b2lkIGNsaXBPdXQoY29uc3QgUGF0aCYpIG92ZXJyaWRlOworICAg
IHZvaWQgY2xpcFBhdGgoY29uc3QgUGF0aCYsIFdpbmRSdWxlKSBvdmVycmlkZTsKKyAgICBJbnRS
ZWN0IGNsaXBCb3VuZHMoKSBvdmVycmlkZTsKKyAgICB2b2lkIGNsaXBUb0ltYWdlQnVmZmVyKElt
YWdlQnVmZmVyJiwgY29uc3QgRmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisgICAgCisgICAgdm9pZCBh
cHBseURldmljZVNjYWxlRmFjdG9yKGZsb2F0KSBvdmVycmlkZTsKKworICAgIEZsb2F0UmVjdCBy
b3VuZFRvRGV2aWNlUGl4ZWxzKGNvbnN0IEZsb2F0UmVjdCYsIEdyYXBoaWNzQ29udGV4dDo6Um91
bmRpbmdNb2RlKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQ+IG1fb3duZWRQbGF0Zm9ybUNvbnRleHQ7CisgICAgUGxhdGZv
cm1Db250ZXh0RGlyZWN0MkQmIG1fcGxhdGZvcm1Db250ZXh0OworCisgICAgc3RkOjp1bmlxdWVf
cHRyPEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZT4gbV9wcml2YXRlOworfTsKKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKERJUkVDVDJEKQpJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZURpcmVjdDJELmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURpcmVjdDJELmgJKHJl
dmlzaW9uIDI0ODAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9H
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5oCSh3b3JraW5nIGNvcHkpCkBA
IC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlICJDT01QdHIuaCIKICNpbmNsdWRlICJDb2xvci5o
IgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCiAjaW5jbHVkZSA8ZDJkMS5o
PgogI2luY2x1ZGUgPGQyZDFfMS5oPgogI2luY2x1ZGUgPGQyZDFlZmZlY3RzLmg+CkBAIC0zOSwx
MCArNDAsMTEgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlIHsKICAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKIHB1YmxpYzoKLSAg
ICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoSUQyRDFSZW5kZXJUYXJnZXQqLCBHcmFw
aGljc0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlKTsKKyAgICBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQmLCBHcmFwaGljc0Nv
bnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlKTsKKyAgICBHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGUoc3RkOjp1bmlxdWVfcHRyPFBsYXRmb3JtQ29udGV4dERpcmVjdDJEPiYm
LCBHcmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlKTsKICAgICB+R3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCk7CiAKLSAgICBlbnVtIERpcmVjdDJETGF5ZXJU
eXBlIHsgQXhpc0FsaWduZWRDbGlwLCBMYXllckNsaXAgfTsKKyAgICB2b2lkIHN5bmNDb250ZXh0
KFBsYXRmb3JtQ29udGV4dERpcmVjdDJEJik7CiAKICAgICB2b2lkIGJlZ2luVHJhbnNwYXJlbmN5
TGF5ZXIoZmxvYXQgb3BhY2l0eSk7CiAgICAgdm9pZCBlbmRUcmFuc3BhcmVuY3lMYXllcigpOwpA
QCAtNzMsNjggKzc1LDI2IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldERhc2hlcyhjb25zdCBEYXNo
QXJyYXkmKTsKICAgICB2b2lkIHNldEFscGhhKGZsb2F0KTsKIAorICAgIFBsYXRmb3JtQ29udGV4
dERpcmVjdDJEKiBwbGF0Zm9ybUNvbnRleHQoKSB7IHJldHVybiAmbV9wbGF0Zm9ybUNvbnRleHQ7
IH0KICAgICBJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KCk7Ci0gICAgSUQyRDFMYXll
ciogY2xpcExheWVyKCkgY29uc3QgeyByZXR1cm4gbV9yZW5kZXJTdGF0ZXMubGFzdCgpLm1fYWN0
aXZlTGF5ZXIuZ2V0KCk7IH0KLSAgICBJRDJEMVN0cm9rZVN0eWxlKiBzdHJva2VTdHlsZSgpOwot
Ci0gICAgQ09NUHRyPElEMkQxU29saWRDb2xvckJydXNoPiBicnVzaFdpdGhDb2xvcihjb25zdCBE
MkQxX0NPTE9SX0YmKTsKIAogICAgIEhEQyBtX2hkYyB7IG51bGxwdHIgfTsKLSAgICBEMkQxX0JM
RU5EX01PREUgbV9ibGVuZE1vZGUgeyBEMkQxX0JMRU5EX01PREVfTVVMVElQTFkgfTsKLSAgICBE
MkQxX0NPTVBPU0lURV9NT0RFIG1fY29tcG9zaXRlTW9kZSB7IEQyRDFfQ09NUE9TSVRFX01PREVf
U09VUkNFX09WRVIgfTsKICAgICBib29sIG1fc2hvdWxkSW5jbHVkZUNoaWxkV2luZG93cyB7IGZh
bHNlIH07Ci0gICAgYm9vbCBtX3N0cm9rZVN5bGVJc0RpcnR5IHsgZmFsc2UgfTsKLQotICAgIENP
TVB0cjxJRDJEMVNvbGlkQ29sb3JCcnVzaD4gbV9zb2xpZFN0cm9rZUJydXNoOwotICAgIENPTVB0
cjxJRDJEMVNvbGlkQ29sb3JCcnVzaD4gbV9zb2xpZEZpbGxCcnVzaDsKLSAgICBDT01QdHI8SUQy
RDFCaXRtYXBCcnVzaD4gbV9wYXR0ZXJuU3Ryb2tlQnJ1c2g7Ci0gICAgQ09NUHRyPElEMkQxQml0
bWFwQnJ1c2g+IG1fcGF0dGVybkZpbGxCcnVzaDsKIAogICAgIGZsb2F0IGN1cnJlbnRHbG9iYWxB
bHBoYSgpIGNvbnN0OwogCiAgICAgRDJEMV9TVFJPS0VfU1RZTEVfUFJPUEVSVElFUyBzdHJva2VT
dHlsZVByb3BlcnRpZXMoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICB2b2lkIHJlY29tcHV0ZVN0
cm9rZVN0eWxlKCk7Ci0KLSAgICBDT01QdHI8SUQyRDFSZW5kZXJUYXJnZXQ+IG1fcmVuZGVyVGFy
Z2V0OworICAgIHN0ZDo6dW5pcXVlX3B0cjxQbGF0Zm9ybUNvbnRleHREaXJlY3QyRD4gbV9vd25l
ZFBsYXRmb3JtQ29udGV4dDsKKyAgICBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCYgbV9wbGF0Zm9y
bUNvbnRleHQ7CiAgICAgY29uc3QgR3JhcGhpY3NDb250ZXh0OjpCaXRtYXBSZW5kZXJpbmdDb250
ZXh0VHlwZSBtX3JlbmRlcmVyVHlwZTsKLSAgICBIYXNoTWFwPHVpbnQzMl90LCBDT01QdHI8SUQy
RDFTb2xpZENvbG9yQnJ1c2g+PiBtX3NvbGlkQ29sb3JlZEJydXNoQ2FjaGU7Ci0gICAgQ09NUHRy
PElEMkQxU29saWRDb2xvckJydXNoPiBtX3doaXRlQnJ1c2g7Ci0gICAgQ09NUHRyPElEMkQxU29s
aWRDb2xvckJydXNoPiBtX3plcm9CcnVzaDsKLSAgICBDT01QdHI8SUQyRDFTdHJva2VTdHlsZT4g
bV9kMmRTdHJva2VTdHlsZTsKLQotICAgIHN0cnVjdCBSZW5kZXJTdGF0ZSB7Ci0gICAgICAgIENP
TVB0cjxJRDJEMURyYXdpbmdTdGF0ZUJsb2NrPiBtX2RyYXdpbmdTdGF0ZUJsb2NrOwotICAgICAg
ICBDT01QdHI8SUQyRDFMYXllcj4gbV9hY3RpdmVMYXllcjsKLSAgICAgICAgVmVjdG9yPERpcmVj
dDJETGF5ZXJUeXBlPiBtX2NsaXBzOwotICAgIH07Ci0KLSAgICBWZWN0b3I8UmVuZGVyU3RhdGU+
IG1fcmVuZGVyU3RhdGVzOwotCi0gICAgc3RydWN0IFRyYW5zcGFyZW5jeUxheWVyU3RhdGUgewot
ICAgICAgICBDT01QdHI8SUQyRDFCaXRtYXBSZW5kZXJUYXJnZXQ+IHJlbmRlclRhcmdldDsKLSAg
ICAgICAgQ29sb3Igc2hhZG93Q29sb3I7Ci0gICAgICAgIEZsb2F0U2l6ZSBzaGFkb3dPZmZzZXQ7
Ci0gICAgICAgIGZsb2F0IG9wYWNpdHkgeyAxLjAgfTsKLSAgICAgICAgZmxvYXQgc2hhZG93Qmx1
ciB7IDAgfTsKLSAgICAgICAgYm9vbCBoYXNTaGFkb3cgeyBmYWxzZSB9OwotICAgIH07Ci0gICAg
VmVjdG9yPFRyYW5zcGFyZW5jeUxheWVyU3RhdGU+IG1fdHJhbnNwYXJlbmN5TGF5ZXJTdGFjazsK
LQotICAgIEQyRDFfQ0FQX1NUWUxFIG1fbGluZUNhcCB7IEQyRDFfQ0FQX1NUWUxFX0ZMQVQgfTsK
LSAgICBEMkQxX0xJTkVfSk9JTiBtX2xpbmVKb2luIHsgRDJEMV9MSU5FX0pPSU5fTUlURVIgfTsK
LSAgICBTdHJva2VTdHlsZSBtX3N0cm9rZVN0eWxlIHsgU29saWRTdHJva2UgfTsKLSAgICBEYXNo
QXJyYXkgbV9kYXNoZXM7CiAKICAgICB1bnNpZ25lZCBiZWdpbkRyYXdDb3VudCB7IDAgfTsKIAot
ICAgIGZsb2F0IG1fbWl0ZXJMaW1pdCB7IDEwLjBmIH07Ci0gICAgZmxvYXQgbV9kYXNoT2Zmc2V0
IHsgMCB9OwotICAgIGZsb2F0IG1fcGF0dGVybldpZHRoIHsgMS4wZiB9OwotICAgIGZsb2F0IG1f
cGF0dGVybk9mZnNldCB7IDAgfTsKLSAgICBmbG9hdCBtX3N0cm9rZVRoaWNrbmVzcyB7IDAgfTsK
ICAgICBmbG9hdCBtX2FscGhhIHsgMS4wIH07CisKKyAgICBmcmllbmQgY2xhc3MgRDJEQ29udGV4
dFN0YXRlU2F2ZXI7CiB9OwogCiBjbGFzcyBEMkRDb250ZXh0U3RhdGVTYXZlciB7CkBAIC0xNDQs
MjYgKzEwNCwyNiBAQCBwdWJsaWM6CiAgICAgICAgICwgbV9zYXZlQW5kUmVzdG9yZShzYXZlQW5k
UmVzdG9yZSkKICAgICB7CiAgICAgICAgIGlmIChtX3NhdmVBbmRSZXN0b3JlKQotICAgICAgICAg
ICAgbV9jb250ZXh0LnNhdmUoKTsKKyAgICAgICAgICAgIG1fY29udGV4dC5tX3BsYXRmb3JtQ29u
dGV4dC5zYXZlKCk7CiAgICAgfQogCiAgICAgfkQyRENvbnRleHRTdGF0ZVNhdmVyKCkKICAgICB7
CiAgICAgICAgIGlmIChtX3NhdmVBbmRSZXN0b3JlKQotICAgICAgICAgICAgbV9jb250ZXh0LnJl
c3RvcmUoKTsKKyAgICAgICAgICAgIG1fY29udGV4dC5tX3BsYXRmb3JtQ29udGV4dC5yZXN0b3Jl
KCk7CiAgICAgfQogCiAgICAgdm9pZCBzYXZlKCkKICAgICB7CiAgICAgICAgIEFTU0VSVCghbV9z
YXZlQW5kUmVzdG9yZSk7Ci0gICAgICAgIG1fY29udGV4dC5zYXZlKCk7CisgICAgICAgIG1fY29u
dGV4dC5tX3BsYXRmb3JtQ29udGV4dC5zYXZlKCk7CiAgICAgICAgIG1fc2F2ZUFuZFJlc3RvcmUg
PSB0cnVlOwogICAgIH0KIAogICAgIHZvaWQgcmVzdG9yZSgpCiAgICAgewogICAgICAgICBBU1NF
UlQobV9zYXZlQW5kUmVzdG9yZSk7Ci0gICAgICAgIG1fY29udGV4dC5yZXN0b3JlKCk7CisgICAg
ICAgIG1fY29udGV4dC5tX3BsYXRmb3JtQ29udGV4dC5yZXN0b3JlKCk7CiAgICAgICAgIG1fc2F2
ZUFuZFJlc3RvcmUgPSBmYWxzZTsKICAgICB9CiAKQEAgLTE3Myw2ICsxMzMsNyBAQCBwdWJsaWM6
CiAgICAgfQogCiBwcml2YXRlOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxQbGF0Zm9ybUNvbnRleHRE
aXJlY3QyRD4gb3duZWRQbGF0Zm9ybUNvbnRleHQ7CiAgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlJiBtX2NvbnRleHQ7CiAgICAgYm9vbCBtX3NhdmVBbmRSZXN0b3JlIHsgZmFsc2Ug
fTsKIH07CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VC
dWZmZXJEYXRhRGlyZWN0MkQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vSW1hZ2VCdWZmZXJEYXRhRGlyZWN0MkQuaAkocmV2aXNpb24gMjQ4MDA4
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQnVmZmVyRGF0
YURpcmVjdDJELmgJKHdvcmtpbmcgY29weSkKQEAgLTMyLDE2ICszMiwxNyBAQAogI2luY2x1ZGUg
PHd0Zi9SZWZQdHIuaD4KICNpbmNsdWRlIDx3dGYvUmV0YWluUHRyLmg+CiAKLWludGVyZmFjZSBJ
RDJEMVJlbmRlclRhcmdldDsKLQogbmFtZXNwYWNlIFdlYkNvcmUgewogCitjbGFzcyBQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRDsKKwogc3RydWN0IEltYWdlQnVmZmVyRGF0YSB7CiAgICAgSW50U2l6
ZSBiYWNraW5nU3RvcmVTaXplOwogICAgIENoZWNrZWQ8dW5zaWduZWQsIFJlY29yZE92ZXJmbG93
PiBieXRlc1BlclJvdzsKIAogICAgIC8vIE9ubHkgZm9yIHNvZnR3YXJlIEltYWdlQnVmZmVycy4K
ICAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UGxhdGZvcm1Db250
ZXh0RGlyZWN0MkQ+IHBsYXRmb3JtQ29udGV4dDsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8R3JhcGhp
Y3NDb250ZXh0PiBjb250ZXh0OwogICAgIENPTVB0cjxJV0lDQml0bWFwPiBiaXRtYXBTb3VyY2U7
CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZl
ckRpcmVjdDJELmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vSW1hZ2VCdWZmZXJEaXJlY3QyRC5jcHAJKHJldmlzaW9uIDI0ODAwOCkKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUJ1ZmZlckRpcmVjdDJELmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MTYtMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTYtMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKQEAgLTMwLDEyICszMCwxNCBAQAogCiAjaW5jbHVkZSAiQml0bWFw
SW1hZ2UuaCIKICNpbmNsdWRlICJDT01QdHIuaCIKKyNpbmNsdWRlICJEaXJlY3QyRFV0aWxpdGll
cy5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIkltYWdlRGF0YS5o
IgogI2luY2x1ZGUgIkltYWdlRGVjb2RlckRpcmVjdDJELmgiCiAjaW5jbHVkZSAiSW50UmVjdC5o
IgogI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRl
ZC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCiAjaW5jbHVkZSA8ZDJk
MS5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDx3aW5jb2RlYy5oPgpAQCAtMTAxLDIx
ICsxMDMsMTcgQEAgSW1hZ2VCdWZmZXI6OkltYWdlQnVmZmVyKGNvbnN0IEZsb2F0U2l6ZQogCiAg
ICAgbV9kYXRhLmRhdGEgPSBWZWN0b3I8Y2hhcj4obnVtQnl0ZXMudW5zYWZlR2V0KCksIDApOwog
Ci0gICAgSFJFU1VMVCBociA9IEltYWdlRGVjb2RlckRpcmVjdDJEOjpzeXN0ZW1JbWFnaW5nRmFj
dG9yeSgpLT5DcmVhdGVCaXRtYXBGcm9tTWVtb3J5KG1fc2l6ZS53aWR0aCgpLCBtX3NpemUuaGVp
Z2h0KCksIEdVSURfV0lDUGl4ZWxGb3JtYXQzMmJwcFBCR1JBLCBzdGF0aWNfY2FzdDxVSU5UPiht
X2RhdGEuYnl0ZXNQZXJSb3cudW5zYWZlR2V0KCkpLCBzdGF0aWNfY2FzdDxVSU5UPihudW1CeXRl
cy51bnNhZmVHZXQoKSksIHJlaW50ZXJwcmV0X2Nhc3Q8QllURSo+KG1fZGF0YS5kYXRhLmRhdGEo
KSksICZtX2RhdGEuYml0bWFwU291cmNlKTsKLSAgICBpZiAoIVNVQ0NFRURFRChocikpCisgICAg
bV9kYXRhLmJpdG1hcFNvdXJjZSA9IERpcmVjdDJEOjpjcmVhdGVEaXJlY3QyREltYWdlU3VyZmFj
ZVdpdGhEYXRhKG1fZGF0YS5kYXRhLmRhdGEoKSwgbV9zaXplLCBtX2RhdGEuYnl0ZXNQZXJSb3cu
dW5zYWZlR2V0KCkpOworICAgIGlmICghbV9kYXRhLmJpdG1hcFNvdXJjZSkKICAgICAgICAgcmV0
dXJuOwogCi0gICAgYXV0byB0YXJnZXRQcm9wZXJ0aWVzID0gRDJEMTo6UmVuZGVyVGFyZ2V0UHJv
cGVydGllcyhEMkQxX1JFTkRFUl9UQVJHRVRfVFlQRV9ERUZBVUxULAotICAgICAgICBEMkQxOjpQ
aXhlbEZvcm1hdChEWEdJX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgRDJEMV9BTFBIQV9NT0RFX1BS
RU1VTFRJUExJRUQpLAotICAgICAgICAwLCAwLCBEMkQxX1JFTkRFUl9UQVJHRVRfVVNBR0VfTk9O
RSwgRDJEMV9GRUFUVVJFX0xFVkVMX0RFRkFVTFQpOwotCi0gICAgQ09NUHRyPElEMkQxUmVuZGVy
VGFyZ2V0PiBiaXRtYXBDb250ZXh0OwotICAgIGhyID0gR3JhcGhpY3NDb250ZXh0OjpzeXN0ZW1G
YWN0b3J5KCktPkNyZWF0ZVdpY0JpdG1hcFJlbmRlclRhcmdldChtX2RhdGEuYml0bWFwU291cmNl
LmdldCgpLCAmdGFyZ2V0UHJvcGVydGllcywgJmJpdG1hcENvbnRleHQpOwotICAgIGlmICghYml0
bWFwQ29udGV4dCB8fCAhU1VDQ0VFREVEKGhyKSkKKyAgICBDT01QdHI8SUQyRDFSZW5kZXJUYXJn
ZXQ+IGJpdG1hcENvbnRleHQgPSBEaXJlY3QyRDo6Y3JlYXRlUmVuZGVyVGFyZ2V0RnJvbVdJQ0Jp
dG1hcChtX2RhdGEuYml0bWFwU291cmNlLmdldCgpKTsKKyAgICBpZiAoIWJpdG1hcENvbnRleHQp
CiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIE5vdGU6IFRoaXMgcGxhY2VzIHRoZSBiaXRtYXBj
b250ZXh0IGludG8gYSBsb2NrZWQgc3RhdGUgYmVjYXVzZSBvZiB0aGUgQmVnaW5EcmF3IGNhbGwg
aW4gdGhlIGNvbnN0cnVjdG9yLgotICAgIG1fZGF0YS5jb250ZXh0ID0gc3RkOjptYWtlX3VuaXF1
ZTxHcmFwaGljc0NvbnRleHQ+KGJpdG1hcENvbnRleHQuZ2V0KCkpOworICAgIG1fZGF0YS5wbGF0
Zm9ybUNvbnRleHQgPSBzdGQ6Om1ha2VfdW5pcXVlPFBsYXRmb3JtQ29udGV4dERpcmVjdDJEPihi
aXRtYXBDb250ZXh0LmdldCgpKTsKKyAgICBtX2RhdGEuY29udGV4dCA9IHN0ZDo6bWFrZV91bmlx
dWU8R3JhcGhpY3NDb250ZXh0PihtX2RhdGEucGxhdGZvcm1Db250ZXh0LmdldCgpLCBHcmFwaGlj
c0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpHUFVNZW1vcnkpOwogCiAgICAg
c3VjY2VzcyA9IHRydWU7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vTmF0aXZlSW1hZ2VEaXJlY3QyRC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL05hdGl2ZUltYWdlRGlyZWN0MkQuY3BwCShyZXZpc2lv
biAyNDgwMDgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vTmF0aXZl
SW1hZ2VEaXJlY3QyRC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJJbnRTaXplLmgiCiAjaW5jbHVkZSAi
Tm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oIgog
I2luY2x1ZGUgPGQyZDEuaD4KICNpbmNsdWRlIDx3aW5jb2RlYy5oPgogCkBAIC0xMTYsMTEgKzEx
NywxMSBAQCB2b2lkIGRyYXdOYXRpdmVJbWFnZShjb25zdCBOYXRpdmVJbWFnZVB0CiAgICAgZmxv
YXQgb3BhY2l0eSA9IDEuMGY7CiAKICAgICBDT01QdHI8SUQyRDFCaXRtYXA+IGJpdG1hcDsKLSAg
ICBIUkVTVUxUIGhyID0gcGxhdGZvcm1Db250ZXh0LT5DcmVhdGVCaXRtYXBGcm9tV2ljQml0bWFw
KGltYWdlLmdldCgpLCAmYml0bWFwKTsKKyAgICBIUkVTVUxUIGhyID0gcGxhdGZvcm1Db250ZXh0
LT5yZW5kZXJUYXJnZXQoKS0+Q3JlYXRlQml0bWFwRnJvbVdpY0JpdG1hcChpbWFnZS5nZXQoKSwg
JmJpdG1hcCk7CiAgICAgaWYgKCFTVUNDRUVERUQoaHIpKQogICAgICAgICByZXR1cm47CiAKLSAg
ICBwbGF0Zm9ybUNvbnRleHQtPkRyYXdCaXRtYXAoYml0bWFwLmdldCgpLCBkZXN0UmVjdCwgb3Bh
Y2l0eSwgRDJEMV9CSVRNQVBfSU5URVJQT0xBVElPTl9NT0RFX05FQVJFU1RfTkVJR0hCT1IsIGFk
anVzdGVkU3JjUmVjdCk7CisgICAgcGxhdGZvcm1Db250ZXh0LT5yZW5kZXJUYXJnZXQoKS0+RHJh
d0JpdG1hcChiaXRtYXAuZ2V0KCksIGRlc3RSZWN0LCBvcGFjaXR5LCBEMkQxX0JJVE1BUF9JTlRF
UlBPTEFUSU9OX01PREVfTkVBUkVTVF9ORUlHSEJPUiwgYWRqdXN0ZWRTcmNSZWN0KTsKICAgICBj
b250ZXh0LmZsdXNoKCk7CiB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9QYXRoRGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9QYXRoRGlyZWN0MkQuY3BwCShyZXZpc2lvbiAyNDgwMDgpCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUGF0aERpcmVjdDJELmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgogI2luY2x1ZGUgIkludFJlY3QuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgor
I2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dERpcmVjdDJELmgiCiAjaW5jbHVkZSAiU3Ryb2tlU3R5
bGVBcHBsaWVyLmgiCiAjaW5jbHVkZSA8ZDJkMS5oPgogI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFz
Lmg+CkBAIC0yNDksNyArMjUwLDggQEAgYm9vbCBQYXRoOjpzdHJva2VDb250YWlucyhTdHJva2VT
dHlsZUFwcAogCiAgICAgQVNTRVJUKGFwcGxpZXIpOwogCi0gICAgR3JhcGhpY3NDb250ZXh0IHNj
cmF0Y2hDb250ZXh0KHNjcmF0Y2hSZW5kZXJUYXJnZXQoKSwgR3JhcGhpY3NDb250ZXh0OjpCaXRt
YXBSZW5kZXJpbmdDb250ZXh0VHlwZTo6R1BVTWVtb3J5KTsKKyAgICBQbGF0Zm9ybUNvbnRleHRE
aXJlY3QyRCBzY3JhdGNoQ29udGV4dEQyRChzY3JhdGNoUmVuZGVyVGFyZ2V0KCkpOworICAgIEdy
YXBoaWNzQ29udGV4dCBzY3JhdGNoQ29udGV4dCgmc2NyYXRjaENvbnRleHREMkQsIEdyYXBoaWNz
Q29udGV4dDo6Qml0bWFwUmVuZGVyaW5nQ29udGV4dFR5cGU6OkdQVU1lbW9yeSk7CiAgICAgYXBw
bGllci0+c3Ryb2tlU3R5bGUoJnNjcmF0Y2hDb250ZXh0KTsKIAogICAgIEJPT0wgY29udGFpbnNQ
b2ludCA9IGZhbHNlOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L1BhdHRlcm5EaXJlY3QyRC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL1BhdHRlcm5EaXJlY3QyRC5jcHAJKHJldmlzaW9uIDI0ODAwOCkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9QYXR0ZXJuRGlyZWN0MkQuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlICJBZmZpbmVUcmFu
c2Zvcm0uaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJQbGF0Zm9y
bUNvbnRleHREaXJlY3QyRC5oIgogI2luY2x1ZGUgPGQyZDEuaD4KICNpbmNsdWRlIDx3dGYvTWFp
blRocmVhZC5oPgogCkBAIC0zOCw2ICszOSwxNCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIElE
MkQxQml0bWFwQnJ1c2gqIFBhdHRlcm46OmNyZWF0ZVBsYXRmb3JtUGF0dGVybihjb25zdCBHcmFw
aGljc0NvbnRleHQmIGNvbnRleHQsIGZsb2F0IGFscGhhLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0m
IHVzZXJTcGFjZVRyYW5zZm9ybWF0aW9uKSBjb25zdAogeworICAgIGF1dG8gcGxhdGZvcm1Db250
ZXh0ID0gY29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBSRUxFQVNFX0FTU0VSVChwbGF0
Zm9ybUNvbnRleHQpOworCisgICAgcmV0dXJuIGNyZWF0ZVBsYXRmb3JtUGF0dGVybigqcGxhdGZv
cm1Db250ZXh0LCBhbHBoYSwgdXNlclNwYWNlVHJhbnNmb3JtYXRpb24pOworfQorCitJRDJEMUJp
dG1hcEJydXNoKiBQYXR0ZXJuOjpjcmVhdGVQbGF0Zm9ybVBhdHRlcm4oUGxhdGZvcm1HcmFwaGlj
c0NvbnRleHQmIGNvbnRleHQsIGZsb2F0IGFscGhhLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHVz
ZXJTcGFjZVRyYW5zZm9ybWF0aW9uKSBjb25zdAorewogICAgIEFmZmluZVRyYW5zZm9ybSBwYXR0
ZXJuVHJhbnNmb3JtID0gdXNlclNwYWNlVHJhbnNmb3JtYXRpb24gKiBtX3BhdHRlcm5TcGFjZVRy
YW5zZm9ybWF0aW9uOwogICAgIGF1dG8gYml0bWFwQnJ1c2hQcm9wZXJ0aWVzID0gRDJEMTo6Qml0
bWFwQnJ1c2hQcm9wZXJ0aWVzKCk7CiAgICAgYml0bWFwQnJ1c2hQcm9wZXJ0aWVzLmV4dGVuZE1v
ZGVYID0gbV9yZXBlYXRYID8gRDJEMV9FWFRFTkRfTU9ERV9XUkFQIDogRDJEMV9FWFRFTkRfTU9E
RV9DTEFNUDsKQEAgLTQ4LDE5ICs1NywxNSBAQCBJRDJEMUJpdG1hcEJydXNoKiBQYXR0ZXJuOjpj
cmVhdGVQbGF0Zm9yCiAgICAgYnJ1c2hQcm9wZXJ0aWVzLm9wYWNpdHkgPSBhbHBoYTsKIAogICAg
IGF1dG8mIHBhdHRlcm5JbWFnZSA9IHRpbGVJbWFnZSgpOwotCi0gICAgYXV0byBwbGF0Zm9ybUNv
bnRleHQgPSBjb250ZXh0LnBsYXRmb3JtQ29udGV4dCgpOwotICAgIFJFTEVBU0VfQVNTRVJUKHBs
YXRmb3JtQ29udGV4dCk7Ci0KLSAgICBhdXRvIG5hdGl2ZUltYWdlID0gcGF0dGVybkltYWdlLm5h
dGl2ZUltYWdlKCZjb250ZXh0KTsKKyAgICBhdXRvIG5hdGl2ZUltYWdlID0gcGF0dGVybkltYWdl
Lm5hdGl2ZUltYWdlKG51bGxwdHIpOwogCiAgICAgQ09NUHRyPElEMkQxQml0bWFwPiBiaXRtYXA7
Ci0gICAgSFJFU1VMVCBociA9IHBsYXRmb3JtQ29udGV4dC0+Q3JlYXRlQml0bWFwRnJvbVdpY0Jp
dG1hcChuYXRpdmVJbWFnZS5nZXQoKSwgJmJpdG1hcCk7CisgICAgSFJFU1VMVCBociA9IGNvbnRl
eHQucmVuZGVyVGFyZ2V0KCktPkNyZWF0ZUJpdG1hcEZyb21XaWNCaXRtYXAobmF0aXZlSW1hZ2Uu
Z2V0KCksICZiaXRtYXApOwogICAgIGlmICghU1VDQ0VFREVEKGhyKSkKICAgICAgICAgcmV0dXJu
IG51bGxwdHI7CiAKICAgICBJRDJEMUJpdG1hcEJydXNoKiBwYXR0ZXJuQnJ1c2ggPSBudWxscHRy
OwotICAgIGhyID0gcGxhdGZvcm1Db250ZXh0LT5DcmVhdGVCaXRtYXBCcnVzaChiaXRtYXAuZ2V0
KCksICZiaXRtYXBCcnVzaFByb3BlcnRpZXMsICZicnVzaFByb3BlcnRpZXMsICZwYXR0ZXJuQnJ1
c2gpOworICAgIGhyID0gY29udGV4dC5yZW5kZXJUYXJnZXQoKS0+Q3JlYXRlQml0bWFwQnJ1c2go
Yml0bWFwLmdldCgpLCAmYml0bWFwQnJ1c2hQcm9wZXJ0aWVzLCAmYnJ1c2hQcm9wZXJ0aWVzLCAm
cGF0dGVybkJydXNoKTsKICAgICBBU1NFUlQoU1VDQ0VFREVEKGhyKSk7CiAgICAgcmV0dXJuIHBh
dHRlcm5CcnVzaDsKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9QbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1BsYXRmb3JtQ29udGV4dERpcmVjdDJELmNwcAkobm9u
ZXhpc3RlbnQpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUGxhdGZv
cm1Db250ZXh0RGlyZWN0MkQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjQ2IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oIgorCisjaWYgVVNF
KERJUkVDVDJEKQorCisjaW5jbHVkZSAiRGlyZWN0MkRPcGVyYXRpb25zLmgiCisjaW5jbHVkZSA8
ZDJkMS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIEVuY2Fwc3VsYXRlcyB0aGUgYWRk
aXRpb25hbCBwYWludGluZyBzdGF0ZSBpbmZvcm1hdGlvbiB3ZSBzdG9yZSBmb3IgZWFjaAorLy8g
cHVzaGVkIGdyYXBoaWNzIHN0YXRlLgorY2xhc3MgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OlN0
YXRlIHsKK3B1YmxpYzoKKyAgICBTdGF0ZSgpID0gZGVmYXVsdDsKK307CisKK1BsYXRmb3JtQ29u
dGV4dERpcmVjdDJEOjpQbGF0Zm9ybUNvbnRleHREaXJlY3QyRChJRDJEMVJlbmRlclRhcmdldCog
cmVuZGVyVGFyZ2V0KQorICAgIDogbV9yZW5kZXJUYXJnZXQocmVuZGVyVGFyZ2V0KQoreworICAg
IG1fc3RhdGVTdGFjay5hcHBlbmQoU3RhdGUoKSk7CisgICAgbV9zdGF0ZSA9ICZtX3N0YXRlU3Rh
Y2subGFzdCgpOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpyZXN0b3JlKCkK
K3sKKyAgICBBU1NFUlQobV9yZW5kZXJUYXJnZXQpOworCisgICAgYXV0byByZXN0b3JlU3RhdGUg
PSBtX3JlbmRlclN0YXRlcy50YWtlTGFzdCgpOworICAgIG1fcmVuZGVyVGFyZ2V0LT5SZXN0b3Jl
RHJhd2luZ1N0YXRlKHJlc3RvcmVTdGF0ZS5tX2RyYXdpbmdTdGF0ZUJsb2NrLmdldCgpKTsKKwor
ICAgIGZvciAoYXV0byBjbGlwVHlwZSA9IHJlc3RvcmVTdGF0ZS5tX2NsaXBzLnJiZWdpbigpOyBj
bGlwVHlwZSAhPSByZXN0b3JlU3RhdGUubV9jbGlwcy5yZW5kKCk7ICsrY2xpcFR5cGUpIHsKKyAg
ICAgICAgaWYgKCpjbGlwVHlwZSA9PSBBeGlzQWxpZ25lZENsaXApCisgICAgICAgICAgICBtX3Jl
bmRlclRhcmdldC0+UG9wQXhpc0FsaWduZWRDbGlwKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIG1fcmVuZGVyVGFyZ2V0LT5Qb3BMYXllcigpOworICAgIH0KKworICAgIG1fc3RhdGVTdGFj
ay5yZW1vdmVMYXN0KCk7CisgICAgQVNTRVJUKCFtX3N0YXRlU3RhY2suaXNFbXB0eSgpKTsKKyAg
ICBtX3N0YXRlID0gJm1fc3RhdGVTdGFjay5sYXN0KCk7Cit9CisKK1BsYXRmb3JtQ29udGV4dERp
cmVjdDJEOjp+UGxhdGZvcm1Db250ZXh0RGlyZWN0MkQoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgUGxh
dGZvcm1Db250ZXh0RGlyZWN0MkQ6OnNhdmUoKQoreworICAgIEFTU0VSVChtX3JlbmRlclRhcmdl
dCk7CisKKyAgICBtX3N0YXRlU3RhY2suYXBwZW5kKFN0YXRlKCkpOworICAgIG1fc3RhdGUgPSAm
bV9zdGF0ZVN0YWNrLmxhc3QoKTsKKworICAgIFJlbmRlclN0YXRlIGN1cnJlbnRTdGF0ZTsKKyAg
ICBHcmFwaGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+Q3JlYXRlRHJhd2luZ1N0YXRlQmxv
Y2soJmN1cnJlbnRTdGF0ZS5tX2RyYXdpbmdTdGF0ZUJsb2NrKTsKKworICAgIG1fcmVuZGVyVGFy
Z2V0LT5TYXZlRHJhd2luZ1N0YXRlKGN1cnJlbnRTdGF0ZS5tX2RyYXdpbmdTdGF0ZUJsb2NrLmdl
dCgpKTsKKworICAgIG1fcmVuZGVyU3RhdGVzLmFwcGVuZChjdXJyZW50U3RhdGUpOworfQorCit2
b2lkIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpwdXNoUmVuZGVyQ2xpcChEaXJlY3QyRExheWVy
VHlwZSBjbGlwVHlwZSkKK3sKKyAgICBBU1NFUlQoaGFzU2F2ZWRTdGF0ZSgpKTsKKyAgICBtX3Jl
bmRlclN0YXRlcy5sYXN0KCkubV9jbGlwcy5hcHBlbmQoY2xpcFR5cGUpOworfQorCit2b2lkIFBs
YXRmb3JtQ29udGV4dERpcmVjdDJEOjpzZXRBY3RpdmVMYXllcihDT01QdHI8SUQyRDFMYXllcj4m
JiBsYXllcikKK3sKKyAgICBBU1NFUlQoaGFzU2F2ZWRTdGF0ZSgpKTsKKyAgICBtX3JlbmRlclN0
YXRlcy5sYXN0KCkubV9hY3RpdmVMYXllciA9IGxheWVyOworfQorCitDT01QdHI8SUQyRDFTb2xp
ZENvbG9yQnJ1c2g+IFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpicnVzaFdpdGhDb2xvcihjb25z
dCBEMkQxX0NPTE9SX0YmIGNvbG9yKQoreworICAgIFJHQkEzMiBjb2xvcktleSA9IG1ha2VSR0JB
MzJGcm9tRmxvYXRzKGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIsIGNvbG9yLmEpOworCisgICAg
aWYgKCFjb2xvcktleSkgeworICAgICAgICBpZiAoIW1femVyb0JydXNoKQorICAgICAgICAgICAg
bV9yZW5kZXJUYXJnZXQtPkNyZWF0ZVNvbGlkQ29sb3JCcnVzaChjb2xvciwgJm1femVyb0JydXNo
KTsKKyAgICAgICAgcmV0dXJuIG1femVyb0JydXNoOworICAgIH0KKworICAgIGlmIChjb2xvcktl
eSA9PSAweEZGRkZGRkZGKSB7CisgICAgICAgIGlmICghbV93aGl0ZUJydXNoKQorICAgICAgICAg
ICAgbV9yZW5kZXJUYXJnZXQtPkNyZWF0ZVNvbGlkQ29sb3JCcnVzaChjb2xvciwgJm1fd2hpdGVC
cnVzaCk7CisgICAgICAgIHJldHVybiBtX3doaXRlQnJ1c2g7CisgICAgfQorCisgICAgYXV0byBl
eGlzdGluZ0JydXNoID0gbV9zb2xpZENvbG9yZWRCcnVzaENhY2hlLmVuc3VyZShjb2xvcktleSwg
W3RoaXMsIGNvbG9yXSB7CisgICAgICAgIENPTVB0cjxJRDJEMVNvbGlkQ29sb3JCcnVzaD4gY29s
b3JCcnVzaDsKKyAgICAgICAgbV9yZW5kZXJUYXJnZXQtPkNyZWF0ZVNvbGlkQ29sb3JCcnVzaChj
b2xvciwgJmNvbG9yQnJ1c2gpOworICAgICAgICByZXR1cm4gY29sb3JCcnVzaDsKKyAgICB9KTsK
KworICAgIHJldHVybiBleGlzdGluZ0JydXNoLml0ZXJhdG9yLT52YWx1ZTsKK30KKwordm9pZCBQ
bGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6cmVjb21wdXRlU3Ryb2tlU3R5bGUoKQoreworICAgIGlm
ICghbV9zdHJva2VTeWxlSXNEaXJ0eSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9kMmRTdHJv
a2VTdHlsZSA9IG51bGxwdHI7CisKKyAgICBEYXNoQXJyYXkgZGFzaGVzOworICAgIGZsb2F0IHBh
dHRlcm5PZmZzZXQgPSAwOworICAgIGF1dG8gZGFzaFN0eWxlID0gRDJEMV9EQVNIX1NUWUxFX1NP
TElEOworCisgICAgaWYgKChtX3N0cm9rZVN0eWxlICE9IFNvbGlkU3Ryb2tlKSAmJiAobV9zdHJv
a2VTdHlsZSAhPSBOb1N0cm9rZSkpIHsKKyAgICAgICAgZGFzaFN0eWxlID0gRDJEMV9EQVNIX1NU
WUxFX0NVU1RPTTsKKyAgICAgICAgcGF0dGVybk9mZnNldCA9IG1fcGF0dGVybk9mZnNldCAvIG1f
c3Ryb2tlVGhpY2tuZXNzOworICAgICAgICBkYXNoZXMgPSBtX2Rhc2hlczsKKworICAgICAgICAv
LyBJbiBEaXJlY3QyRCwgZGFzaGVzIGFuZCBkb3RzIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIHRo
ZSByYXRpbyBvZiB0aGUgZGFzaCBsZW5ndGggdG8gdGhlIGxpbmUgdGhpY2tuZXNzLgorICAgICAg
ICBmb3IgKGF1dG8mIGRhc2ggOiBkYXNoZXMpCisgICAgICAgICAgICBkYXNoIC89IG1fc3Ryb2tl
VGhpY2tuZXNzOworICAgIH0KKworICAgIGF1dG8gc3Ryb2tlU3R5bGVQcm9wZXJ0aWVzID0gRDJE
MTo6U3Ryb2tlU3R5bGVQcm9wZXJ0aWVzKG1fbGluZUNhcCwgbV9saW5lQ2FwLCBtX2xpbmVDYXAs
IG1fbGluZUpvaW4sIG1fbWl0ZXJMaW1pdCwgZGFzaFN0eWxlLCBwYXR0ZXJuT2Zmc2V0KTsKKyAg
ICBHcmFwaGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+Q3JlYXRlU3Ryb2tlU3R5bGUoJnN0
cm9rZVN0eWxlUHJvcGVydGllcywgZGFzaGVzLmRhdGEoKSwgZGFzaGVzLnNpemUoKSwgJm1fZDJk
U3Ryb2tlU3R5bGUpOworCisgICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IGZhbHNlOworfQorCitJ
RDJEMVN0cm9rZVN0eWxlKiBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRDo6c3Ryb2tlU3R5bGUoKQor
eworICAgIHJlY29tcHV0ZVN0cm9rZVN0eWxlKCk7CisgICAgcmV0dXJuIG1fZDJkU3Ryb2tlU3R5
bGUuZ2V0KCk7Cit9CisKK0QyRDFfU1RST0tFX1NUWUxFX1BST1BFUlRJRVMgUGxhdGZvcm1Db250
ZXh0RGlyZWN0MkQ6OnN0cm9rZVN0eWxlUHJvcGVydGllcygpIGNvbnN0Cit7CisgICAgcmV0dXJu
IEQyRDE6OlN0cm9rZVN0eWxlUHJvcGVydGllcyhtX2xpbmVDYXAsIG1fbGluZUNhcCwgbV9saW5l
Q2FwLCBtX2xpbmVKb2luLCBtX21pdGVyTGltaXQsIEQyRDFfREFTSF9TVFlMRV9TT0xJRCwgMC4w
Zik7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnNldExpbmVDYXAoRDJEMV9D
QVBfU1RZTEUgbGluZUNhcCkKK3sKKyAgICBpZiAobV9saW5lQ2FwID09IGxpbmVDYXApCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fbGluZUNhcCA9IGxpbmVDYXA7CisgICAgbV9zdHJva2VTeWxl
SXNEaXJ0eSA9IHRydWU7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnNldExp
bmVKb2luKEQyRDFfTElORV9KT0lOIGpvaW4pCit7CisgICAgaWYgKG1fbGluZUpvaW4gPT0gam9p
bikKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9saW5lSm9pbiA9IGpvaW47CisgICAgbV9zdHJv
a2VTeWxlSXNEaXJ0eSA9IHRydWU7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6
OnNldFN0cm9rZVN0eWxlKFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlKQoreworICAgIGlmIChtX3N0
cm9rZVN0eWxlID09IHN0cm9rZVN0eWxlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3N0cm9r
ZVN0eWxlID0gc3Ryb2tlU3R5bGU7CisgICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7Cit9
CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnNldFN0cm9rZVRoaWNrbmVzcyhmbG9h
dCB0aGlja25lc3MpCit7CisgICAgaWYgKFdURjo6YXJlRXNzZW50aWFsbHlFcXVhbCh0aGlja25l
c3MsIG1fc3Ryb2tlVGhpY2tuZXNzKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9zdHJva2VU
aGlja25lc3MgPSB0aGlja25lc3M7CisgICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7Cit9
CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnNldE1pdGVyTGltaXQoZmxvYXQgY2Fu
dmFzTWl0ZXJMaW1pdCkKK3sKKyAgICAvLyBEaXJlY3QyRCBtaXRlciBsaW1pdCBpcyBpbiB0ZXJt
cyBvZiBIQUxGIHRoZSBsaW5lIHRoaWNrbmVzcy4KKyAgICBmbG9hdCBtaXRlckxpbWl0ID0gMC41
ZiAqIGNhbnZhc01pdGVyTGltaXQ7CisgICAgaWYgKFdURjo6YXJlRXNzZW50aWFsbHlFcXVhbCht
aXRlckxpbWl0LCBtX21pdGVyTGltaXQpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX21pdGVy
TGltaXQgPSBtaXRlckxpbWl0OworICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworfQor
Cit2b2lkIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEOjpzZXREYXNoT2Zmc2V0KGZsb2F0IGRhc2hP
ZmZzZXQpCit7CisgICAgaWYgKFdURjo6YXJlRXNzZW50aWFsbHlFcXVhbChkYXNoT2Zmc2V0LCBt
X2Rhc2hPZmZzZXQpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2Rhc2hPZmZzZXQgPSBkYXNo
T2Zmc2V0OworICAgIG1fc3Ryb2tlU3lsZUlzRGlydHkgPSB0cnVlOworfQorCit2b2lkIFBsYXRm
b3JtQ29udGV4dERpcmVjdDJEOjpzZXREYXNoZXMoY29uc3QgRGFzaEFycmF5JiBkYXNoZXMpCit7
CisgICAgaWYgKG1fZGFzaGVzID09IGRhc2hlcykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9k
YXNoZXMgPSBkYXNoZXM7CisgICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7Cit9CisKK3Zv
aWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnNldFBhdHRlcm5XaWR0aChmbG9hdCBwYXR0ZXJu
V2lkdGgpCit7CisgICAgaWYgKFdURjo6YXJlRXNzZW50aWFsbHlFcXVhbChwYXR0ZXJuV2lkdGgs
IG1fcGF0dGVybldpZHRoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wYXR0ZXJuV2lkdGgg
PSBwYXR0ZXJuV2lkdGg7CisgICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7Cit9CisKK3Zv
aWQgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQ6OnNldFBhdHRlcm5PZmZzZXQoZmxvYXQgcGF0dGVy
bk9mZnNldCkKK3sKKyAgICBpZiAoV1RGOjphcmVFc3NlbnRpYWxseUVxdWFsKHBhdHRlcm5PZmZz
ZXQsIG1fcGF0dGVybk9mZnNldCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcGF0dGVybk9m
ZnNldCA9IHBhdHRlcm5PZmZzZXQ7CisgICAgbV9zdHJva2VTeWxlSXNEaXJ0eSA9IHRydWU7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShESVJFQ1QyRCkKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9QbGF0Zm9ybUNvbnRleHRE
aXJlY3QyRC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9QbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oCShub25leGlzdGVudCkKKysrIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9QbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgVVNFKERJUkVDVDJEKQor
CisjaW5jbHVkZSAiQ09NUHRyLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5j
bHVkZSA8ZDJkMS5oPgorI2luY2x1ZGUgPGQyZDFfMS5oPgorI2luY2x1ZGUgPGQyZDFlZmZlY3Rz
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOworc3RydWN0IEdyYXBoaWNzQ29udGV4dFN0YXRlOworCituYW1lc3BhY2UgRGly
ZWN0MkQgeworc3RydWN0IEZpbGxTb3VyY2U7CitzdHJ1Y3QgU3Ryb2tlU291cmNlOworc3RydWN0
IFNoYWRvd1N0YXRlOworfQorCitjbGFzcyBQbGF0Zm9ybUNvbnRleHREaXJlY3QyRCB7CisgICAg
V1RGX01BS0VfTk9OQ09QWUFCTEUoUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQpOworcHVibGljOgor
ICAgIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEKElEMkQxUmVuZGVyVGFyZ2V0Kik7CisgICAgflBs
YXRmb3JtQ29udGV4dERpcmVjdDJEKCk7CisKKyAgICBJRDJEMVJlbmRlclRhcmdldCogcmVuZGVy
VGFyZ2V0KCkgeyByZXR1cm4gbV9yZW5kZXJUYXJnZXQuZ2V0KCk7IH0KKyAgICB2b2lkIHNldFJl
bmRlclRhcmdldChJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7IG1fcmVuZGVyVGFy
Z2V0ID0gcmVuZGVyVGFyZ2V0OyB9CisKKyAgICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUqIGdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSB7IHJldHVybiBtX2dyYXBoaWNzQ29udGV4dFBy
aXZhdGU7IH0KKyAgICB2b2lkIHNldEdyYXBoaWNzQ29udGV4dFByaXZhdGUoR3JhcGhpY3NDb250
ZXh0UGxhdGZvcm1Qcml2YXRlKiBncmFwaGljc0NvbnRleHRQcml2YXRlKSB7IG1fZ3JhcGhpY3ND
b250ZXh0UHJpdmF0ZSA9IGdyYXBoaWNzQ29udGV4dFByaXZhdGU7IH0KKworICAgIElEMkQxTGF5
ZXIqIGNsaXBMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fcmVuZGVyU3RhdGVzLmxhc3QoKS5tX2Fj
dGl2ZUxheWVyLmdldCgpOyB9CisgICAgSUQyRDFTdHJva2VTdHlsZSogc3Ryb2tlU3R5bGUoKTsK
KyAgICBEMkQxX1NUUk9LRV9TVFlMRV9QUk9QRVJUSUVTIHN0cm9rZVN0eWxlUHJvcGVydGllcygp
IGNvbnN0OworICAgIElEMkQxU3Ryb2tlU3R5bGUqIHBsYXRmb3JtU3Ryb2tlU3R5bGUoKSBjb25z
dDsKKworICAgIENPTVB0cjxJRDJEMVNvbGlkQ29sb3JCcnVzaD4gYnJ1c2hXaXRoQ29sb3IoY29u
c3QgRDJEMV9DT0xPUl9GJik7CisKKyAgICB2b2lkIHNhdmUoKTsKKyAgICB2b2lkIHJlc3RvcmUo
KTsKKworICAgIGJvb2wgaGFzU2F2ZWRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuICFtX3JlbmRlclN0
YXRlcy5pc0VtcHR5KCk7IH0KKworICAgIGVudW0gRGlyZWN0MkRMYXllclR5cGUgeyBBeGlzQWxp
Z25lZENsaXAsIExheWVyQ2xpcCB9OworICAgIHZvaWQgcHVzaFJlbmRlckNsaXAoRGlyZWN0MkRM
YXllclR5cGUpOworICAgIHZvaWQgc2V0QWN0aXZlTGF5ZXIoQ09NUHRyPElEMkQxTGF5ZXI+JiYp
OworCisgICAgdm9pZCByZWNvbXB1dGVTdHJva2VTdHlsZSgpOworICAgIGZsb2F0IHN0cm9rZVRo
aWNrbmVzcygpIGNvbnN0IHsgcmV0dXJuIG1fc3Ryb2tlVGhpY2tuZXNzOyB9CisKKyAgICBzdHJ1
Y3QgUmVuZGVyU3RhdGUgeworICAgICAgICBDT01QdHI8SUQyRDFEcmF3aW5nU3RhdGVCbG9jaz4g
bV9kcmF3aW5nU3RhdGVCbG9jazsKKyAgICAgICAgQ09NUHRyPElEMkQxTGF5ZXI+IG1fYWN0aXZl
TGF5ZXI7CisgICAgICAgIFZlY3RvcjxEaXJlY3QyRExheWVyVHlwZT4gbV9jbGlwczsKKyAgICB9
OworICAgIFZlY3RvcjxSZW5kZXJTdGF0ZT4gbV9yZW5kZXJTdGF0ZXM7CisKKyAgICBzdHJ1Y3Qg
VHJhbnNwYXJlbmN5TGF5ZXJTdGF0ZSB7CisgICAgICAgIENPTVB0cjxJRDJEMUJpdG1hcFJlbmRl
clRhcmdldD4gcmVuZGVyVGFyZ2V0OworICAgICAgICBDb2xvciBzaGFkb3dDb2xvcjsKKyAgICAg
ICAgRmxvYXRTaXplIHNoYWRvd09mZnNldDsKKyAgICAgICAgZmxvYXQgb3BhY2l0eSB7IDEuMCB9
OworICAgICAgICBmbG9hdCBzaGFkb3dCbHVyIHsgMCB9OworICAgICAgICBib29sIGhhc1NoYWRv
dyB7IGZhbHNlIH07CisgICAgfTsKKyAgICBWZWN0b3I8VHJhbnNwYXJlbmN5TGF5ZXJTdGF0ZT4g
bV90cmFuc3BhcmVuY3lMYXllclN0YWNrOworCisgICAgdm9pZCBzZXRMaW5lQ2FwKEQyRDFfQ0FQ
X1NUWUxFKTsKKyAgICB2b2lkIHNldExpbmVKb2luKEQyRDFfTElORV9KT0lOKTsKKyAgICB2b2lk
IHNldFN0cm9rZVN0eWxlKFN0cm9rZVN0eWxlKTsKKyAgICB2b2lkIHNldE1pdGVyTGltaXQoZmxv
YXQpOworICAgIHZvaWQgc2V0RGFzaE9mZnNldChmbG9hdCk7CisgICAgdm9pZCBzZXRQYXR0ZXJu
V2lkdGgoZmxvYXQpOworICAgIHZvaWQgc2V0UGF0dGVybk9mZnNldChmbG9hdCk7CisgICAgdm9p
ZCBzZXRTdHJva2VUaGlja25lc3MoZmxvYXQpOworICAgIHZvaWQgc2V0RGFzaGVzKGNvbnN0IERh
c2hBcnJheSYpOworCisgICAgdm9pZCBzZXRCbGVuZE1vZGUoRDJEMV9CTEVORF9NT0RFIG1vZGUp
IHsgbV9ibGVuZE1vZGUgPSBtb2RlOyB9CisgICAgdm9pZCBzZXRDb21wb3NpdGVNb2RlKEQyRDFf
Q09NUE9TSVRFX01PREUgbW9kZSkgeyBtX2NvbXBvc2l0ZU1vZGUgPSBtb2RlOyB9CisKK3ByaXZh
dGU6CisgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKiBtX2dyYXBoaWNzQ29udGV4
dFByaXZhdGUgeyBudWxscHRyIH07CisKKyAgICBDT01QdHI8SUQyRDFSZW5kZXJUYXJnZXQ+IG1f
cmVuZGVyVGFyZ2V0OworICAgIENPTVB0cjxJRDJEMVN0cm9rZVN0eWxlPiBtX2QyZFN0cm9rZVN0
eWxlOworCisgICAgSGFzaE1hcDx1aW50MzJfdCwgQ09NUHRyPElEMkQxU29saWRDb2xvckJydXNo
Pj4gbV9zb2xpZENvbG9yZWRCcnVzaENhY2hlOworICAgIENPTVB0cjxJRDJEMVNvbGlkQ29sb3JC
cnVzaD4gbV93aGl0ZUJydXNoOworICAgIENPTVB0cjxJRDJEMVNvbGlkQ29sb3JCcnVzaD4gbV96
ZXJvQnJ1c2g7CisgICAgQ09NUHRyPElEMkQxU29saWRDb2xvckJydXNoPiBtX3NvbGlkU3Ryb2tl
QnJ1c2g7CisgICAgQ09NUHRyPElEMkQxU29saWRDb2xvckJydXNoPiBtX3NvbGlkRmlsbEJydXNo
OworICAgIENPTVB0cjxJRDJEMUJpdG1hcEJydXNoPiBtX3BhdHRlcm5TdHJva2VCcnVzaDsKKyAg
ICBDT01QdHI8SUQyRDFCaXRtYXBCcnVzaD4gbV9wYXR0ZXJuRmlsbEJydXNoOworCisgICAgY2xh
c3MgU3RhdGU7CisgICAgU3RhdGUqIG1fc3RhdGUgeyBudWxscHRyIH07CisgICAgVmVjdG9yPFN0
YXRlPiBtX3N0YXRlU3RhY2s7CisKKyAgICBEMkQxX0NBUF9TVFlMRSBtX2xpbmVDYXAgeyBEMkQx
X0NBUF9TVFlMRV9GTEFUIH07CisgICAgRDJEMV9MSU5FX0pPSU4gbV9saW5lSm9pbiB7IEQyRDFf
TElORV9KT0lOX01JVEVSIH07CisgICAgU3Ryb2tlU3R5bGUgbV9zdHJva2VTdHlsZSB7IFNvbGlk
U3Ryb2tlIH07CisgICAgRGFzaEFycmF5IG1fZGFzaGVzOworCisgICAgZmxvYXQgbV9taXRlckxp
bWl0IHsgMTAuMGYgfTsKKyAgICBmbG9hdCBtX2Rhc2hPZmZzZXQgeyAwIH07CisgICAgZmxvYXQg
bV9wYXR0ZXJuV2lkdGggeyAxLjBmIH07CisgICAgZmxvYXQgbV9wYXR0ZXJuT2Zmc2V0IHsgMCB9
OworICAgIGZsb2F0IG1fc3Ryb2tlVGhpY2tuZXNzIHsgMCB9OworICAgIGZsb2F0IG1fYWxwaGEg
eyAxLjAgfTsKKworICAgIGJvb2wgbV9zdHJva2VTeWxlSXNEaXJ0eSB7IGZhbHNlIH07CisKKyAg
ICBEMkQxX0JMRU5EX01PREUgbV9ibGVuZE1vZGUgeyBEMkQxX0JMRU5EX01PREVfTVVMVElQTFkg
fTsKKyAgICBEMkQxX0NPTVBPU0lURV9NT0RFIG1fY29tcG9zaXRlTW9kZSB7IEQyRDFfQ09NUE9T
SVRFX01PREVfU09VUkNFX09WRVIgfTsKKworICAgIGZyaWVuZCBjbGFzcyBHcmFwaGljc0NvbnRl
eHQ7CisgICAgZnJpZW5kIGNsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTsKK307
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShESVJFQ1QyRCkKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VEaXJlY3QyRC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZURpcmVjdDJE
LmNwcAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0Ry
YWdJbWFnZURpcmVjdDJELmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsNiArMzQsNyBAQAogI2lu
Y2x1ZGUgIkhXbmREQy5oIgogI2luY2x1ZGUgIkltYWdlLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVt
ZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oIgogCiAjaW5jbHVk
ZSA8ZDJkMS5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KQEAgLTQyLDIwICs0MywyMiBAQAogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKLXZvaWQgZGVhbGxvY0NvbnRleHQoSUQyRDFSZW5kZXJUYXJn
ZXQqIHJlbmRlclRhcmdldCkKK3ZvaWQgZGVhbGxvY0NvbnRleHQoUGxhdGZvcm1Db250ZXh0RGly
ZWN0MkQqIHBsYXRmb3JtQ29udGV4dCkKIHsKLSAgICBpZiAocmVuZGVyVGFyZ2V0KQotICAgICAg
ICByZW5kZXJUYXJnZXQtPlJlbGVhc2UoKTsKKyAgICBpZiAocGxhdGZvcm1Db250ZXh0KSB7Cisg
ICAgICAgIGlmIChhdXRvKiByZW5kZXJUYXJnZXQgPSBwbGF0Zm9ybUNvbnRleHQtPnJlbmRlclRh
cmdldCgpKQorICAgICAgICAgICAgcmVuZGVyVGFyZ2V0LT5SZWxlYXNlKCk7CisgICAgfQogfQog
Ci1HRElPYmplY3Q8SEJJVE1BUD4gYWxsb2NJbWFnZShIREMgZGMsIEludFNpemUgc2l6ZSwgSUQy
RDFSZW5kZXJUYXJnZXQqKiB0YXJnZXRSZWYpCitHRElPYmplY3Q8SEJJVE1BUD4gYWxsb2NJbWFn
ZShIREMgZGMsIEludFNpemUgc2l6ZSwgUGxhdGZvcm1Db250ZXh0RGlyZWN0MkQqKiBwbGF0Zm9y
bUNvbnRleHQpCiB7CiAgICAgQml0bWFwSW5mbyBibXBJbmZvID0gQml0bWFwSW5mbzo6Y3JlYXRl
KHNpemUpOwogCiAgICAgTFBWT0lEIGJpdHMgPSBudWxscHRyOwogICAgIGF1dG8gaGJtcCA9IGFk
b3B0R0RJT2JqZWN0KDo6Q3JlYXRlRElCU2VjdGlvbihkYywgJmJtcEluZm8sIERJQl9SR0JfQ09M
T1JTLCAmYml0cywgMCwgMCkpOwogCi0gICAgaWYgKCF0YXJnZXRSZWYgfHwgIWhibXApCisgICAg
aWYgKCFwbGF0Zm9ybUNvbnRleHQgfHwgIWhibXApCiAgICAgICAgIHJldHVybiBoYm1wOwogCiAg
ICAgLy8gRklYTUU6IFVzZSBHREkgSW50ZXJvcCBsYXllciB0byBjcmVhdGUgSEJJVE1BUCBmcm9t
IEQyRCBCaXRtYXAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9ncmFwaGljcy9TVkdJbWFnZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvc3ZnL2dyYXBoaWNzL1NWR0ltYWdlLmNw
cAkocmV2aXNpb24gMjQ4MDA4KQorKysgU291cmNlL1dlYkNvcmUvc3ZnL2dyYXBoaWNzL1NWR0lt
YWdlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQg
KEMpIDIwMDYgRXJpYyBTZWlkZWwgPGVyaWNAd2Via2l0Lm9yZz4KLSAqIENvcHlyaWdodCAoQykg
MjAwOC0yMDA5LCAyMDE1LTIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog
Q29weXJpZ2h0IChDKSAyMDA4LTIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgog
ICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDExLiBBbGwgcmln
aHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNjgsNyArNjgsOSBAQAogCiAjaWYg
VVNFKERJUkVDVDJEKQogI2luY2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1ZGUgIkRpcmVjdDJEVXRp
bGl0aWVzLmgiCiAjaW5jbHVkZSAiSW1hZ2VEZWNvZGVyRGlyZWN0MkQuaCIKKyNpbmNsdWRlICJQ
bGF0Zm9ybUNvbnRleHREaXJlY3QyRC5oIgogI2luY2x1ZGUgPGQyZDEuaD4KICNlbmRpZgogCkBA
IC0yMzgsMTcgKzI0MCwxMiBAQCBOYXRpdmVJbWFnZVB0ciBTVkdJbWFnZTo6bmF0aXZlSW1hZ2Uo
Y29uCiAgICAgaWYgKCFTVUNDRUVERUQoaHIpKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAot
ICAgIGF1dG8gdGFyZ2V0UHJvcGVydGllcyA9IEQyRDE6OlJlbmRlclRhcmdldFByb3BlcnRpZXMo
RDJEMV9SRU5ERVJfVEFSR0VUX1RZUEVfREVGQVVMVCwKLSAgICAgICAgRDJEMTo6UGl4ZWxGb3Jt
YXQoRFhHSV9GT1JNQVRfQjhHOFI4QThfVU5PUk0sIEQyRDFfQUxQSEFfTU9ERV9QUkVNVUxUSVBM
SUVEKSwKLSAgICAgICAgMCwgMCwgRDJEMV9SRU5ERVJfVEFSR0VUX1VTQUdFX05PTkUsIEQyRDFf
RkVBVFVSRV9MRVZFTF9ERUZBVUxUKTsKLQotICAgIC8vIERyYXcgdGhlIFNWRyBpbnRvIGEgYml0
bWFwLgotICAgIENPTVB0cjxJRDJEMVJlbmRlclRhcmdldD4gbmF0aXZlSW1hZ2VUYXJnZXQ7Ci0g
ICAgaHIgPSBHcmFwaGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+Q3JlYXRlV2ljQml0bWFw
UmVuZGVyVGFyZ2V0KG5hdGl2ZUltYWdlLmdldCgpLCAmdGFyZ2V0UHJvcGVydGllcywgJm5hdGl2
ZUltYWdlVGFyZ2V0KTsKLSAgICBpZiAoIW5hdGl2ZUltYWdlVGFyZ2V0IHx8ICFTVUNDRUVERUQo
aHIpKQorICAgIENPTVB0cjxJRDJEMVJlbmRlclRhcmdldD4gbmF0aXZlSW1hZ2VUYXJnZXQgPSBE
aXJlY3QyRDo6Y3JlYXRlUmVuZGVyVGFyZ2V0RnJvbVdJQ0JpdG1hcChuYXRpdmVJbWFnZS5nZXQo
KSk7CisgICAgaWYgKCFuYXRpdmVJbWFnZVRhcmdldCkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7
CiAKLSAgICBHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KG5hdGl2ZUltYWdlVGFyZ2V0Lmdl
dCgpLCBHcmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBlOjpDUFVNZW1v
cnkpOworICAgIFBsYXRmb3JtQ29udGV4dERpcmVjdDJEIHBsYXRmb3JtQ29udGV4dChuYXRpdmVJ
bWFnZVRhcmdldC5nZXQoKSk7CisgICAgR3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dCgmcGxh
dGZvcm1Db250ZXh0LCBHcmFwaGljc0NvbnRleHQ6OkJpdG1hcFJlbmRlcmluZ0NvbnRleHRUeXBl
OjpHUFVNZW1vcnkpOwogCiAgICAgZHJhdyhsb2NhbENvbnRleHQsIHJlY3QoKSwgcmVjdCgpLCBD
b21wb3NpdGVTb3VyY2VPdmVyLCBCbGVuZE1vZGU6Ok5vcm1hbCwgRGVjb2RpbmdNb2RlOjpTeW5j
aHJvbm91cywgSW1hZ2VPcmllbnRhdGlvbkRlc2NyaXB0aW9uKCkpOwogCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>