<?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>162917</bug_id>
          
          <creation_ts>2016-10-04 10:26:22 -0700</creation_ts>
          <short_desc>[Win][Direct2D] Add initial D2D GraphicsContext implementation</short_desc>
          <delta_ts>2016-10-04 12:45:39 -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>WebKit Nightly Build</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>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>ossy</cc>
    
    <cc>pvollan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1236232</commentid>
    <comment_count>0</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2016-10-04 10:26:22 -0700</bug_when>
    <thetext>This patch adds a Direct2D GraphicsContext implementation, which will exist in parallel to the existing Cairo and CG implementations.

This patch simply adds the new files. It does not incorporate them into the build.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1236246</commentid>
    <comment_count>1</comment_count>
      <attachid>290615</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2016-10-04 10:44:06 -0700</bug_when>
    <thetext>Created attachment 290615
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1236248</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-10-04 10:45:02 -0700</bug_when>
    <thetext>Attachment 290615 did not pass style-queue:


ERROR: Source/WebCore/platform/graphics/Color.h:48:  D2D1_VECTOR_4F is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: Source/WebCore/platform/graphics/win/ColorDirect2D.cpp:49:  D2D1_VECTOR_4F is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
Total errors found: 2 in 11 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>1236253</commentid>
    <comment_count>3</comment_count>
      <attachid>290615</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2016-10-04 10:49:57 -0700</bug_when>
    <thetext>Comment on attachment 290615
Patch

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

rs=me, although I feel like this is so much code it should go through real review with someone who knows D2D :|

&gt; Source/WebCore/ChangeLog:12
&gt; +        features on Windows using Direct2D.
&gt; +
&gt; +
&gt; +        No new tests until complete backend lands.

Blank lines!

&gt; Source/WebCore/platform/graphics/win/ColorDirect2D.cpp:56
&gt; +}
&gt; +
&gt; +

More extra blank lines!

&gt; Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:177
&gt; +        /*
&gt; +        FIXME: Implement DisplayListRecorder support for drawNativeImage
&gt; +        m_displayListRecorder-&gt;drawNativeImage(image, imageSize, destRect, srcRect, op, blendMode, orientation);
&gt; +        */

Why not // comments?

&gt; Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:214
&gt; +    // ImageOrientation expects the origin to be at (0, 0)

Nit: End with .

&gt; Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:839
&gt; +        // ShadowBlur contextShadow(m_state);
&gt; +        // contextShadow.drawRectShadow(*this, FloatRoundedRect(rect));

Does this need a FIXME?

&gt; Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:865
&gt; +        // ShadowBlur contextShadow(m_state);
&gt; +        // contextShadow.drawRectShadow(*this, FloatRoundedRect(rect));
&gt; +        notImplemented();

Same here.

&gt; Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:890
&gt; +        // ShadowBlur contextShadow(m_state);
&gt; +        // contextShadow.drawRectShadow(*this, rect);
&gt; +        notImplemented();

And here.

&gt; Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:960
&gt; +        // ShadowBlur contextShadow(m_state);
&gt; +        // contextShadow.drawRectShadow(*this, rect);
&gt; +        notImplemented();

And probably many other places</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1236256</commentid>
    <comment_count>4</comment_count>
      <attachid>290615</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2016-10-04 10:54:00 -0700</bug_when>
    <thetext>Comment on attachment 290615
Patch

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

&gt;&gt; Source/WebCore/ChangeLog:12
&gt;&gt; +        No new tests until complete backend lands.
&gt; 
&gt; Blank lines!

Whoops!

&gt;&gt; Source/WebCore/platform/graphics/win/ColorDirect2D.cpp:56
&gt;&gt; +
&gt; 
&gt; More extra blank lines!

:-(.  Fixed.

&gt;&gt; Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:177
&gt;&gt; +        */
&gt; 
&gt; Why not // comments?

Sure! Done.

&gt;&gt; Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:214
&gt;&gt; +    // ImageOrientation expects the origin to be at (0, 0)
&gt; 
&gt; Nit: End with .

OK!

&gt;&gt; Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:839
&gt;&gt; +        // contextShadow.drawRectShadow(*this, FloatRoundedRect(rect));
&gt; 
&gt; Does this need a FIXME?

Sure. And all the other places. Done.

&gt;&gt; Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:865
&gt;&gt; +        notImplemented();
&gt; 
&gt; Same here.

Done.

&gt;&gt; Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:890
&gt;&gt; +        notImplemented();
&gt; 
&gt; And here.

Done.

&gt;&gt; Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp:960
&gt;&gt; +        notImplemented();
&gt; 
&gt; And probably many other places

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1236257</commentid>
    <comment_count>5</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2016-10-04 10:55:05 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Comment on attachment 290615 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=290615&amp;action=review
&gt; 
&gt; rs=me, although I feel like this is so much code it should go through real
&gt; review with someone who knows D2D :|

Sadly, there seems to be no such person. I&apos;m hoping one of the EA or Sony people will jump in at some point with some advice. Until then, I just want to get this prototype in place so others can build it and hack on it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1236283</commentid>
    <comment_count>6</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2016-10-04 11:33:49 -0700</bug_when>
    <thetext>Committed r206773: &lt;http://trac.webkit.org/changeset/206773&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1236319</commentid>
    <comment_count>7</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2016-10-04 12:22:03 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Committed r206773: &lt;http://trac.webkit.org/changeset/206773&gt;

It broke the Windows build, see build.webkit.org for details.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1236324</commentid>
    <comment_count>8</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2016-10-04 12:45:39 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; &gt; Committed r206773: &lt;http://trac.webkit.org/changeset/206773&gt;
&gt; 
&gt; It broke the Windows build, see build.webkit.org for details.

Build correction landed:

Committed r206780: &lt;http://trac.webkit.org/changeset/206780&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>290615</attachid>
            <date>2016-10-04 10:44:06 -0700</date>
            <delta_ts>2016-10-04 10:49:57 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-162917-20161004104055.patch</filename>
            <type>text/plain</type>
            <size>65941</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDIwNjc3MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMxIEBACisyMDE2LTEwLTA0ICBCcmVudCBG
dWxnaGFtICA8YmZ1bGdoYW1AYXBwbGUuY29tPgorCisgICAgICAgIFtXaW5dW0RpcmVjdDJEXSBB
ZGQgaW5pdGlhbCBEMkQgR3JhcGhpY3NDb250ZXh0IGltcGxlbWVudGF0aW9uCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjI5MTcKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGxhbmRzIGEg
c2V0IG9mIG5ldyBmaWxlcyB0aGF0IGltcGxlbWVudCB0aGUgR3JhcGhpY3NDb250ZXh0CisgICAg
ICAgIGZlYXR1cmVzIG9uIFdpbmRvd3MgdXNpbmcgRGlyZWN0MkQuCisKKworICAgICAgICBObyBu
ZXcgdGVzdHMgdW50aWwgY29tcGxldGUgYmFja2VuZCBsYW5kcy4KKworICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL0NvbG9yLmg6IEFkZCBuZXcgY2FzdGluZyBvcGVyYXRvci4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9GbG9hdFNpemUuaDogRGl0dG8uCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcDogVXBkYXRlIGZvciBEaXJlY3QyRAorICAg
ICAgICBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGlj
c0NvbnRleHQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vQ29sb3JEaXJlY3Qy
RC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDb2xvcjo6b3BlcmF0b3IgRDJEMV9WRUNUT1JfNEYp
OiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0
Q0dXaW4uY3BwOiBBZGQgY29tcGlsZXIKKyAgICAgICAgZ3VhcmQgdG8gYXZvaWQgYnVpbGRpbmcg
d2hlbiB1c2luZyBEaXJlY3QyRC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3Jh
cGhpY3NDb250ZXh0RGlyZWN0MkQuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy93aW4vR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGlyZWN0MkQuaDogQWRkZWQu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHA6
IFVwZGF0ZSBmb3IgRGlyZWN0MkQKKyAgICAgICAgaW5jbHVkZXMuCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL1RyYW5zZm9ybWF0aW9uTWF0cml4RGlyZWN0MkQuY3BwOiBGaXggY29t
bWVudC4KKwogMjAxNi0xMC0wNCAgQ2FybG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxp
YS5jb20+CiAKICAgICAgICAgW1NPVVBdIFJlbW92ZSBTU0xQb2xpY3lGbGFncyBmcm9tIFNvdXBO
ZXR3b3JrU2Vzc2lvbgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29s
b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xv
ci5oCShyZXZpc2lvbiAyMDY3NDEpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9Db2xvci5oCSh3b3JraW5nIGNvcHkpCkBAIC00NCw2ICs0NCw4IEBAIHN0cnVjdCBfRDNEQ09M
T1JWQUxVRTsKIHR5cGVkZWYgX0QzRENPTE9SVkFMVUUgRDNEQ09MT1JWQUxVRTsKIHR5cGVkZWYg
RDNEQ09MT1JWQUxVRSBEMkRfQ09MT1JfRjsKIHR5cGVkZWYgRDJEX0NPTE9SX0YgRDJEMV9DT0xP
Ul9GOworc3RydWN0IEQyRF9WRUNUT1JfNEY7Cit0eXBlZGVmIEQyRF9WRUNUT1JfNEYgRDJEMV9W
RUNUT1JfNEY7CiAjZW5kaWYKIAogI2lmIFBMQVRGT1JNKEdUSykKQEAgLTE4NCw2ICsxODYsNyBA
QCBwdWJsaWM6CiAjaWYgUExBVEZPUk0oV0lOKQogICAgIFdFQkNPUkVfRVhQT1JUIENvbG9yKEQy
RDFfQ09MT1JfRik7CiAgICAgV0VCQ09SRV9FWFBPUlQgb3BlcmF0b3IgRDJEMV9DT0xPUl9GKCkg
Y29uc3Q7CisgICAgV0VCQ09SRV9FWFBPUlQgb3BlcmF0b3IgRDJEMV9WRUNUT1JfNEYoKSBjb25z
dDsKICNlbmRpZgogCiAgICAgc3RhdGljIGJvb2wgcGFyc2VIZXhDb2xvcihjb25zdCBTdHJpbmcm
LCBSR0JBMzImKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0Zsb2F0
U2l6ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0Zs
b2F0U2l6ZS5oCShyZXZpc2lvbiAyMDY3NDEpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9GbG9hdFNpemUuaAkod29ya2luZyBjb3B5KQpAQCAtMTMwLDcgKzEzMCw3IEBAIHB1
YmxpYzoKICNlbmRpZgogCiAjaWYgUExBVEZPUk0oV0lOKQotICAgIFdFQkNPUkVfRVhQT1JUIGV4
cGxpY2l0IEZsb2F0U2l6ZShjb25zdCBEMkQxX1NJWkVfRiYpOyAvLyBkb24ndCBkbyB0aGlzIGlt
cGxpY2l0bHkgc2luY2UgaXQncyBsb3NzeQorICAgIFdFQkNPUkVfRVhQT1JUIEZsb2F0U2l6ZShj
b25zdCBEMkQxX1NJWkVfRiYpOwogICAgIG9wZXJhdG9yIEQyRDFfU0laRV9GKCkgY29uc3Q7CiAj
ZW5kaWYKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3ND
b250ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0NvbnRleHQuY3BwCShyZXZpc2lvbiAyMDY3NDEpCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC04MzQsNyArODM0LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXRSb3VuZGVkUmVj
dAogICAgIGNsaXBPdXQocGF0aCk7CiB9CiAKLSNpZiAhVVNFKENHKSAmJiAhVVNFKENBSVJPKQor
I2lmICFVU0UoQ0cpICYmICFVU0UoRElSRUNUMkQpICYmICFVU0UoQ0FJUk8pCiBJbnRSZWN0IEdy
YXBoaWNzQ29udGV4dDo6Y2xpcEJvdW5kcygpIGNvbnN0CiB7CiAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CkBAIC05MDIsNyArOTAyLDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSb3Vu
ZGVkUmVjdChjbwogICAgICAgICBmaWxsUmVjdChyZWN0LnJlY3QoKSwgY29sb3IsIGNvbXBvc2l0
ZU9wZXJhdGlvbigpLCBibGVuZE1vZGUpOwogfQogCi0jaWYgIVVTRShDRykgJiYgIVVTRShDQUlS
TykKKyNpZiAhVVNFKENHKSAmJiAhVVNFKERJUkVDVDJEKSAmJiAhVVNFKENBSVJPKQogdm9pZCBH
cmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0V2l0aFJvdW5kZWRIb2xlKGNvbnN0IEludFJlY3QmIHJl
Y3QsIGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmIHJvdW5kZWRIb2xlUmVjdCwgY29uc3QgQ29sb3Im
IGNvbG9yKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCkBAIC05NTcsNyArOTU3LDcg
QEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldERyYXdMdW1pbmFuY2VNYQogICAgICAgICBtX2Rp
c3BsYXlMaXN0UmVjb3JkZXItPnVwZGF0ZVN0YXRlKG1fc3RhdGUsIEdyYXBoaWNzQ29udGV4dFN0
YXRlOjpEcmF3THVtaW5hbmNlTWFza0NoYW5nZSk7CiB9CiAKLSNpZiAhVVNFKENHKQorI2lmICFV
U0UoQ0cpICYmICFVU0UoRElSRUNUMkQpCiAvLyBJbXBsZW1lbnQgdGhpcyBpZiB5b3Ugd2FudCB0
byBnbyBwdXNoIHRoZSBkcmF3aW5nIG1vZGUgaW50byB5b3VyIG5hdGl2ZSBjb250ZXh0IGltbWVk
aWF0ZWx5Lgogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtVGV4dERyYXdpbmdNb2Rl
KFRleHREcmF3aW5nTW9kZUZsYWdzKQogewpAQCAtOTcwLDEzICs5NzAsMTMgQEAgdm9pZCBHcmFw
aGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlUwogfQogI2VuZGlmCiAKLSNpZiAhVVNFKENH
KQorI2lmICFVU0UoQ0cpICYmICFVU0UoRElSRUNUMkQpCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0UGxhdGZvcm1TaG91bGRTbW9vdGhGb250cyhib29sKQogewogfQogI2VuZGlmCiAKLSNpZiAh
VVNFKENHKSAmJiAhVVNFKENBSVJPKQorI2lmICFVU0UoQ0cpICYmICFVU0UoRElSRUNUMkQpICYm
ICFVU0UoQ0FJUk8pCiBib29sIEdyYXBoaWNzQ29udGV4dDo6aXNBY2NlbGVyYXRlZENvbnRleHQo
KSBjb25zdAogewogICAgIHJldHVybiBmYWxzZTsKQEAgLTEwMTIsNyArMTAxMiw3IEBAIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjphZGp1c3RMaW5lVG9QaXhlbEIKICAgICB9CiB9CiAKLSNpZiAhVVNF
KENHKQorI2lmICFVU0UoQ0cpICYmICFVU0UoRElSRUNUMkQpCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDo6cGxhdGZvcm1BcHBseURldmljZVNjYWxlRmFjdG9yKGZsb2F0KQogewogfQpAQCAtMTA2MCw3
ICsxMDYwLDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZUVsbGlwc2VBc1BhdAogICAg
IHN0cm9rZVBhdGgocGF0aCk7CiB9CiAKLSNpZiAhVVNFKENHKQorI2lmICFVU0UoQ0cpICYmICFV
U0UoRElSRUNUMkQpCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1GaWxsRWxsaXBzZShj
b25zdCBGbG9hdFJlY3QmIGVsbGlwc2UpCiB7CiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNz
Q29udGV4dC5oCShyZXZpc2lvbiAyMDY3NDEpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9HcmFwaGljc0NvbnRleHQuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAK
IC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTMg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIw
MTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAyMDA4
LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zOCw2ICszOCwx
MSBAQAogCiAjaWYgVVNFKENHKQogdHlwZWRlZiBzdHJ1Y3QgQ0dDb250ZXh0IFBsYXRmb3JtR3Jh
cGhpY3NDb250ZXh0OworI2VsaWYgVVNFKERJUkVDVDJEKQoraW50ZXJmYWNlIElEMkQxRENSZW5k
ZXJUYXJnZXQ7CitpbnRlcmZhY2UgSUQyRDFSZW5kZXJUYXJnZXQ7CitpbnRlcmZhY2UgSUQyRDFG
YWN0b3J5OwordHlwZWRlZiBJRDJEMVJlbmRlclRhcmdldCBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4
dDsKICNlbGlmIFVTRShDQUlSTykKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNsYXNzIFBsYXRmb3Jt
Q29udGV4dENhaXJvOwpAQCAtMzAwLDExICszMDUsMTEgQEAgcHVibGljOgogCiAgICAgY29uc3Qg
R3JhcGhpY3NDb250ZXh0U3RhdGUmIHN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZTsgfQog
Ci0jaWYgVVNFKENHKSB8fCBVU0UoQ0FJUk8pCisjaWYgVVNFKENHKSB8fCBVU0UoRElSRUNUMkQp
IHx8IFVTRShDQUlSTykKICAgICBXRUJDT1JFX0VYUE9SVCB2b2lkIGRyYXdOYXRpdmVJbWFnZShj
b25zdCBOYXRpdmVJbWFnZVB0ciYsIGNvbnN0IEZsb2F0U2l6ZSYgc2VsZlNpemUsIGNvbnN0IEZs
b2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3Bl
cmF0b3IgPSBDb21wb3NpdGVTb3VyY2VPdmVyLCBCbGVuZE1vZGUgPSBCbGVuZE1vZGVOb3JtYWws
IEltYWdlT3JpZW50YXRpb24gPSBJbWFnZU9yaWVudGF0aW9uKCkpOwogI2VuZGlmCiAKLSNpZiBV
U0UoQ0cpCisjaWYgVVNFKENHKSB8fCBVU0UoRElSRUNUMkQpCiAgICAgdm9pZCBhcHBseVN0cm9r
ZVBhdHRlcm4oKTsKICAgICB2b2lkIGFwcGx5RmlsbFBhdHRlcm4oKTsKICAgICB2b2lkIGRyYXdQ
YXRoKGNvbnN0IFBhdGgmKTsKQEAgLTUwNCw2ICs1MDksNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBk
cmF3Um91bmRDb3JuZXIoYm9vbCBuZXdDbGlwLCBSRUNUIGNsaXBSZWN0LCBSRUNUIHJlY3RXaW4s
IEhEQyBkYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICNlbHNlCiAgICAgR3JhcGhpY3NDb250
ZXh0KEhEQywgYm9vbCBoYXNBbHBoYSA9IGZhbHNlKTsgLy8gRklYTUU6IFRvIGJlIHJlbW92ZWQu
CisgICAgR3JhcGhpY3NDb250ZXh0KEhEQywgSUQyRDFEQ1JlbmRlclRhcmdldCoqLCBSRUNULCBi
b29sIGhhc0FscGhhID0gZmFsc2UpOyAvLyBGSVhNRTogVG8gYmUgcmVtb3ZlZC4KIAogICAgIC8v
IFdoZW4gc2V0IHRvIHRydWUsIGNoaWxkIHdpbmRvd3Mgc2hvdWxkIGJlIHJlbmRlcmVkIGludG8g
dGhpcyBjb250ZXh0CiAgICAgLy8gcmF0aGVyIHRoYW4gYWxsb3dpbmcgdGhlbSBqdXN0IHRvIHJl
bmRlciB0byB0aGUgc2NyZWVuLiBEZWZhdWx0cyB0bwpAQCAtNTQwLDYgKzU0NiwxNSBAQCBwdWJs
aWM6CiAgICAgLy8gVGhlIGJpdG1hcCBzaG91bGQgYmUgbm9uLXByZW11bHRpcGxpZWQuCiAgICAg
dm9pZCBkcmF3V2luZG93c0JpdG1hcChXaW5kb3dzQml0bWFwKiwgY29uc3QgSW50UG9pbnQmKTsK
ICNlbmRpZgorICAgIFdFQkNPUkVfRVhQT1JUIHN0YXRpYyBJRDJEMUZhY3RvcnkqIHN5c3RlbUZh
Y3RvcnkoKTsKKyAgICBXRUJDT1JFX0VYUE9SVCBzdGF0aWMgSUQyRDFSZW5kZXJUYXJnZXQqIGRl
ZmF1bHRSZW5kZXJUYXJnZXQoKTsKKworICAgIFdFQkNPUkVfRVhQT1JUIHZvaWQgc2V0RGlkQmVn
aW5EcmF3KGJvb2wpOworICAgIFdFQkNPUkVfRVhQT1JUIGJvb2wgZGlkQmVnaW5EcmF3KCkgY29u
c3Q7CisgICAgRDJEMV9DT0xPUl9GIGNvbG9yV2l0aEdsb2JhbEFscGhhKGNvbnN0IENvbG9yJikg
Y29uc3Q7CisKKyAgICBJRDJEMVNvbGlkQ29sb3JCcnVzaCogc29saWRTdHJva2VCcnVzaCgpOwor
ICAgIElEMkQxU29saWRDb2xvckJydXNoKiBzb2xpZEZpbGxCcnVzaCgpOwogI2Vsc2UgLy8gUExB
VEZPUk0oV0lOKQogICAgIGJvb2wgc2hvdWxkSW5jbHVkZUNoaWxkV2luZG93cygpIGNvbnN0IHsg
cmV0dXJuIGZhbHNlOyB9CiAjZW5kaWYgLy8gUExBVEZPUk0oV0lOKQpAQCAtNTU3LDYgKzU3Miwx
MyBAQCBwcml2YXRlOgogCiAjaWYgUExBVEZPUk0oV0lOKSAmJiAhVVNFKFdJTkdESSkKICAgICB2
b2lkIHBsYXRmb3JtSW5pdChIREMsIGJvb2wgaGFzQWxwaGEgPSBmYWxzZSk7CisgICAgdm9pZCBw
bGF0Zm9ybUluaXQoSERDLCBJRDJEMVJlbmRlclRhcmdldCoqLCBSRUNULCBib29sIGhhc0FscGhh
ID0gZmFsc2UpOworICAgIHZvaWQgcGxhdGZvcm1Jbml0KElEMkQxUmVuZGVyVGFyZ2V0Kik7Cisj
ZW5kaWYKKworI2lmIFVTRShESVJFQ1QyRCkKKyAgICB2b2lkIGRyYXdXaXRob3V0U2hhZG93KGNv
bnN0IEZsb2F0UmVjdCYgYm91bmRpbmdSZWN0LCBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoSUQy
RDFSZW5kZXJUYXJnZXQqKT4mKTsKKyAgICB2b2lkIGRyYXdXaXRoU2hhZG93KGNvbnN0IEZsb2F0
UmVjdCYgYm91bmRpbmdSZWN0LCBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJU
YXJnZXQqKT4mKTsKICNlbmRpZgogCiAgICAgdm9pZCBzYXZlUGxhdGZvcm1TdGF0ZSgpOwpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0NvbG9yRGlyZWN0MkQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Db2xv
ckRpcmVjdDJELmNwcAkocmV2aXNpb24gMjA2NzQxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0NvbG9yRGlyZWN0MkQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2
ICsyOSw3IEBACiAjaWYgUExBVEZPUk0oV0lOKQogCiAjaW5jbHVkZSA8ZDJkMS5oPgorI2luY2x1
ZGUgPGQyZDFfMWhlbHBlci5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTQ1LDYgKzQ2
LDE0IEBAIENvbG9yOjpvcGVyYXRvciBEMkQxX0NPTE9SX0YoKSBjb25zdAogICAgIHJldHVybiBE
MkQxOjpDb2xvckYocmdiKCksIGNvbG9yQWxwaGEpOwogfQogCitDb2xvcjo6b3BlcmF0b3IgRDJE
MV9WRUNUT1JfNEYoKSBjb25zdAoreworICAgIGZsb2F0IHIsIGcsIGIsIGE7CisgICAgZ2V0UkdC
QShyLCBnLCBiLCBhKTsKKyAgICByZXR1cm4gRDJEMTo6VmVjdG9yNEYociwgZywgYiwgYSk7Cit9
CisKKwogfQogCiAjZW5kaWYgLy8gUExBVEZPUk0oV0lOKQpJbmRleDogU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0
Q0dXaW4uY3BwCShyZXZpc2lvbiAyMDY3NDEpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
Niw2ICsyNiw4IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250
ZXh0Q0cuaCIKIAorI2lmIFVTRShDRykKKwogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgog
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNHLmgiCiAjaW5jbHVkZSAi
UGF0aC5oIgpAQCAtMjYyLDMgKzI2NCw0IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlOjpmbHUKIH0KIAogfQorI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0RGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHREaXJl
Y3QyRC5jcHAJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0dyYXBoaWNzQ29udGV4dERpcmVjdDJELmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDE2NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisKKyNp
bmNsdWRlICJDT01QdHIuaCIKKyNpbmNsdWRlICJDdXJyZW50VGltZS5oIgorI2luY2x1ZGUgIkRp
c3BsYXlMaXN0UmVjb3JkZXIuaCIKKyNpbmNsdWRlICJGbG9hdFJvdW5kZWRSZWN0LmgiCisjaW5j
bHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGlyZWN0MkQuaCIKKyNpbmNsdWRl
ICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJOb3RJbXBs
ZW1lbnRlZC5oIgorI2luY2x1ZGUgIlVSTC5oIgorI2luY2x1ZGUgPGQyZDEuaD4KKyNpbmNsdWRl
IDxkMmQxZWZmZWN0cy5oPgorI2luY2x1ZGUgPGR3cml0ZS5oPgorCisjcHJhZ21hIHdhcm5pbmcg
KGRpc2FibGUgOiA0NzU2KQorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK0dyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBoZGMsIGJvb2wg
aGFzQWxwaGEpCit7CisgICAgcGxhdGZvcm1Jbml0KGhkYywgaGFzQWxwaGEpOworfQorCitHcmFw
aGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChIREMgaGRjLCBJRDJEMURDUmVuZGVyVGFyZ2V0
KiogcmVuZGVyVGFyZ2V0LCBSRUNUIHJlY3QsIGJvb2wgaGFzQWxwaGEpCit7CisgICAgbV9kYXRh
LT5tX2hkYyA9IGhkYzsKKworICAgIC8vIENyZWF0ZSBhIERDIHJlbmRlciB0YXJnZXQuCisgICAg
YXV0byB0YXJnZXRQcm9wZXJ0aWVzID0gRDJEMTo6UmVuZGVyVGFyZ2V0UHJvcGVydGllcyhEMkQx
X1JFTkRFUl9UQVJHRVRfVFlQRV9ERUZBVUxULAorICAgICAgICBEMkQxOjpQaXhlbEZvcm1hdChE
WEdJX0ZPUk1BVF9COEc4UjhBOF9VTk9STSwgRDJEMV9BTFBIQV9NT0RFX0lHTk9SRSksCisgICAg
ICAgIDAsIDAsIEQyRDFfUkVOREVSX1RBUkdFVF9VU0FHRV9OT05FLCBEMkQxX0ZFQVRVUkVfTEVW
RUxfREVGQVVMVCk7CisKKyAgICBIUkVTVUxUIGhyID0gR3JhcGhpY3NDb250ZXh0OjpzeXN0ZW1G
YWN0b3J5KCktPkNyZWF0ZURDUmVuZGVyVGFyZ2V0KCZ0YXJnZXRQcm9wZXJ0aWVzLCByZW5kZXJU
YXJnZXQpOworICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOworCisgICAgKCpyZW5k
ZXJUYXJnZXQpLT5CaW5kREMoaGRjLCAmcmVjdCk7CisKKyAgICBtX2RhdGEgPSBuZXcgR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCpyZW5kZXJUYXJnZXQpOworfQorCitJRDJEMUZhY3Rv
cnkqIEdyYXBoaWNzQ29udGV4dDo6c3lzdGVtRmFjdG9yeSgpCit7CisgICAgc3RhdGljIElEMkQx
RmFjdG9yeSogZGlyZWN0MkRGYWN0b3J5ID0gbnVsbHB0cjsKKyAgICBpZiAoIWRpcmVjdDJERmFj
dG9yeSkgeworICAgICAgICBIUkVTVUxUIGhyID0gRDJEMUNyZWF0ZUZhY3RvcnkoRDJEMV9GQUNU
T1JZX1RZUEVfTVVMVElfVEhSRUFERUQsICZkaXJlY3QyREZhY3RvcnkpOworICAgICAgICBSRUxF
QVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGlyZWN0MkRG
YWN0b3J5OworfQorCitJRDJEMVJlbmRlclRhcmdldCogR3JhcGhpY3NDb250ZXh0OjpkZWZhdWx0
UmVuZGVyVGFyZ2V0KCkKK3sKKyAgICBzdGF0aWMgSUQyRDFSZW5kZXJUYXJnZXQqIGRlZmF1bHRS
ZW5kZXJUYXJnZXQgPSBudWxscHRyOworICAgIGlmICghZGVmYXVsdFJlbmRlclRhcmdldCkgewor
ICAgICAgICBhdXRvIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBEMkQxOjpSZW5kZXJUYXJnZXRQ
cm9wZXJ0aWVzKCk7CisgICAgICAgIHJlbmRlclRhcmdldFByb3BlcnRpZXMudXNhZ2UgPSBEMkQx
X1JFTkRFUl9UQVJHRVRfVVNBR0VfR0RJX0NPTVBBVElCTEU7CisgICAgICAgIGF1dG8gaHduZFJl
bmRlclRhcmdldFByb3BlcnRpZXMgPSBEMkQxOjpId25kUmVuZGVyVGFyZ2V0UHJvcGVydGllcyg6
OkdldERlc2t0b3BXaW5kb3coKSwgRDJEMTo6U2l6ZVUoMTAsIDEwKSk7CisgICAgICAgIEhSRVNV
TFQgaHIgPSBzeXN0ZW1GYWN0b3J5KCktPkNyZWF0ZUh3bmRSZW5kZXJUYXJnZXQoJnJlbmRlclRh
cmdldFByb3BlcnRpZXMsICZod25kUmVuZGVyVGFyZ2V0UHJvcGVydGllcywgcmVpbnRlcnByZXRf
Y2FzdDxJRDJEMUh3bmRSZW5kZXJUYXJnZXQqKj4oJmRlZmF1bHRSZW5kZXJUYXJnZXQpKTsKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisgICAgfQorCisgICAgcmV0dXJu
IGRlZmF1bHRSZW5kZXJUYXJnZXQ7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXREaWRC
ZWdpbkRyYXcoYm9vbCBkaWRCZWdpbkRyYXcpCit7CisgICAgUkVMRUFTRV9BU1NFUlQobV9kYXRh
KTsKKyAgICBtX2RhdGEtPm1fZGlkQmVnaW5EcmF3ID0gZGlkQmVnaW5EcmF3OworfQorCitib29s
IEdyYXBoaWNzQ29udGV4dDo6ZGlkQmVnaW5EcmF3KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9k
YXRhLT5tX2RpZEJlZ2luRHJhdzsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3Jt
SW5pdChIREMgaGRjLCBib29sIGhhc0FscGhhKQoreworICAgIGlmICghaGRjKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBDT01QdHI8SUQyRDFSZW5kZXJUYXJnZXQ+IHJlbmRlclRhcmdldDsKKyAg
ICBtX2RhdGEgPSBuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKHJlbmRlclRhcmdl
dC5nZXQoKSk7CisgICAgbV9kYXRhLT5tX2hkYyA9IGhkYzsKKyAgICAvLyBNYWtlIHN1cmUgdGhl
IGNvbnRleHQgc3RhcnRzIGluIHN5bmMgd2l0aCBvdXIgc3RhdGUuCisgICAgc2V0UGxhdGZvcm1G
aWxsQ29sb3IoZmlsbENvbG9yKCkpOworICAgIHNldFBsYXRmb3JtU3Ryb2tlQ29sb3Ioc3Ryb2tl
Q29sb3IoKSk7CisgICAgc2V0UGxhdGZvcm1TdHJva2VUaGlja25lc3Moc3Ryb2tlVGhpY2tuZXNz
KCkpOworICAgIC8vIEZJWE1FOiBtX3N0YXRlLmltYWdlSW50ZXJwb2xhdGlvblF1YWxpdHkgPSBj
b252ZXJ0SW50ZXJwb2xhdGlvblF1YWxpdHkoQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxp
dHkocGxhdGZvcm1Db250ZXh0KCkpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRm
b3JtSW5pdChJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KQoreworICAgIGlmICghcmVu
ZGVyVGFyZ2V0KQorICAgICAgICByZXR1cm47CisKKyAgICBtX2RhdGEgPSBuZXcgR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlKHJlbmRlclRhcmdldCk7CisKKyAgICAvLyBNYWtlIHN1cmUg
dGhlIGNvbnRleHQgc3RhcnRzIGluIHN5bmMgd2l0aCBvdXIgc3RhdGUuCisgICAgc2V0UGxhdGZv
cm1GaWxsQ29sb3IoZmlsbENvbG9yKCkpOworICAgIHNldFBsYXRmb3JtU3Ryb2tlQ29sb3Ioc3Ry
b2tlQ29sb3IoKSk7CisgICAgc2V0UGxhdGZvcm1TdHJva2VUaGlja25lc3Moc3Ryb2tlVGhpY2tu
ZXNzKCkpOworICAgIC8vIEZJWE1FOiBtX3N0YXRlLmltYWdlSW50ZXJwb2xhdGlvblF1YWxpdHkg
PSBjb252ZXJ0SW50ZXJwb2xhdGlvblF1YWxpdHkoQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1
YWxpdHkocGxhdGZvcm1Db250ZXh0KCkpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnBs
YXRmb3JtRGVzdHJveSgpCit7CisgICAgZGVsZXRlIG1fZGF0YTsKK30KKworSUQyRDFSZW5kZXJU
YXJnZXQqIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Db250ZXh0KCkgY29uc3QKK3sKKyAgICBB
U1NFUlQoIXBhaW50aW5nRGlzYWJsZWQoKSk7CisgICAgQVNTRVJUKG1fZGF0YS0+cmVuZGVyVGFy
Z2V0KCkpOworICAgIHJldHVybiBtX2RhdGEtPnJlbmRlclRhcmdldCgpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDo6c2F2ZVBsYXRmb3JtU3RhdGUoKQoreworICAgIEFTU0VSVCghcGFpbnRp
bmdEaXNhYmxlZCgpKTsKKyAgICBBU1NFUlQoIWlzUmVjb3JkaW5nKCkpOworCisgICAgLy8gTm90
ZTogRG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiB0aGlzIGNsYXNzIGltcGxlbWVudGF0
aW9uLCBzaW5jZSB3ZSB3YW50IHRvIGF2b2lkIHRoZSBleHRyYQorICAgIC8vIHNhdmUgb2YgdGhl
IHNlY29uZGFyeSBjb250ZXh0IChpbiBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEaXJl
Y3QyRC5oKS4KKyAgICBtX2RhdGEtPnNhdmUoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OnJlc3RvcmVQbGF0Zm9ybVN0YXRlKCkKK3sKKyAgICBBU1NFUlQoIXBhaW50aW5nRGlzYWJsZWQo
KSk7CisgICAgQVNTRVJUKCFpc1JlY29yZGluZygpKTsKKworICAgIC8vIE5vdGU6IERvIG5vdCB1
c2UgdGhpcyBmdW5jdGlvbiB3aXRoaW4gdGhpcyBjbGFzcyBpbXBsZW1lbnRhdGlvbiwgc2luY2Ug
d2Ugd2FudCB0byBhdm9pZCB0aGUgZXh0cmEKKyAgICAvLyByZXN0b3JlIG9mIHRoZSBzZWNvbmRh
cnkgY29udGV4dCAoaW4gR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGlyZWN0MkQuaCku
CisgICAgbV9kYXRhLT5yZXN0b3JlKCk7CisgICAgLy8gRklYTUU6IG1fZGF0YS0+bV91c2VyVG9E
ZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eSA9IGZhbHNlOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd05hdGl2ZUltYWdlKGNvbnN0IENPTVB0cjxJRDJEMUJpdG1hcD4mIGlt
YWdlLCBjb25zdCBGbG9hdFNpemUmIGltYWdlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVj
dCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBvcCwgQmxlbmRN
b2RlIGJsZW5kTW9kZSwgSW1hZ2VPcmllbnRhdGlvbiBvcmllbnRhdGlvbikKK3sKKyAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoaXNSZWNvcmRp
bmcoKSkgeworICAgICAgICAvKgorICAgICAgICBGSVhNRTogSW1wbGVtZW50IERpc3BsYXlMaXN0
UmVjb3JkZXIgc3VwcG9ydCBmb3IgZHJhd05hdGl2ZUltYWdlCisgICAgICAgIG1fZGlzcGxheUxp
c3RSZWNvcmRlci0+ZHJhd05hdGl2ZUltYWdlKGltYWdlLCBpbWFnZVNpemUsIGRlc3RSZWN0LCBz
cmNSZWN0LCBvcCwgYmxlbmRNb2RlLCBvcmllbnRhdGlvbik7CisgICAgICAgICovCisgICAgICAg
IG5vdEltcGxlbWVudGVkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGJp
dG1hcFNpemUgPSBpbWFnZS0+R2V0U2l6ZSgpOworCisgICAgZmxvYXQgY3VyckhlaWdodCA9IG9y
aWVudGF0aW9uLnVzZXNXaWR0aEFzSGVpZ2h0KCkgPyBiaXRtYXBTaXplLndpZHRoIDogYml0bWFw
U2l6ZS5oZWlnaHQ7CisgICAgaWYgKGN1cnJIZWlnaHQgPD0gc3JjUmVjdC55KCkpCisgICAgICAg
IHJldHVybjsKKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOworCisgICAg
RDJEMV9NQVRSSVhfM1gyX0YgY3RtOworICAgIGNvbnRleHQtPkdldFRyYW5zZm9ybSgmY3RtKTsK
KworICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0oY3RtKTsKKworICAgIEQyRENvbnRleHRT
dGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSk7CisKKyAgICBib29sIHNob3VsZFVzZVN1Ymlt
YWdlID0gZmFsc2U7CisKKyAgICAvLyBJZiB0aGUgc291cmNlIHJlY3QgaXMgYSBzdWJwb3J0aW9u
IG9mIHRoZSBpbWFnZSwgdGhlbiB3ZSBjb21wdXRlIGFuIGluZmxhdGVkIGRlc3RpbmF0aW9uIHJl
Y3QgdGhhdCB3aWxsIGhvbGQgdGhlIGVudGlyZSBpbWFnZQorICAgIC8vIGFuZCB0aGVuIHNldCBh
IGNsaXAgdG8gdGhlIHBvcnRpb24gdGhhdCB3ZSB3YW50IHRvIGRpc3BsYXkuCisgICAgRmxvYXRS
ZWN0IGFkanVzdGVkRGVzdFJlY3QgPSBkZXN0UmVjdDsKKworICAgIGlmIChzcmNSZWN0LnNpemUo
KSAhPSBpbWFnZVNpemUpIHsKKyAgICAgICAgLy8gRklYTUU6IEltcGxlbWVudCBpbWFnZSBzY2Fs
aW5nCisgICAgICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIGlt
YWdlIGlzIG9ubHkgcGFydGlhbGx5IGxvYWRlZCwgdGhlbiBzaHJpbmsgdGhlIGRlc3RpbmF0aW9u
IHJlY3QgdGhhdCB3ZSdyZSBkcmF3aW5nIGludG8gYWNjb3JkaW5nbHkuCisgICAgaWYgKCFzaG91
bGRVc2VTdWJpbWFnZSAmJiBjdXJySGVpZ2h0IDwgaW1hZ2VTaXplLmhlaWdodCgpKQorICAgICAg
ICBhZGp1c3RlZERlc3RSZWN0LnNldEhlaWdodChhZGp1c3RlZERlc3RSZWN0LmhlaWdodCgpICog
Y3VyckhlaWdodCAvIGltYWdlU2l6ZS5oZWlnaHQoKSk7CisKKyAgICBzZXRQbGF0Zm9ybUNvbXBv
c2l0ZU9wZXJhdGlvbihvcCwgYmxlbmRNb2RlKTsKKworICAgIC8vIEltYWdlT3JpZW50YXRpb24g
ZXhwZWN0cyB0aGUgb3JpZ2luIHRvIGJlIGF0ICgwLCAwKQorICAgIHRyYW5zZm9ybS50cmFuc2xh
dGUoYWRqdXN0ZWREZXN0UmVjdC54KCksIGFkanVzdGVkRGVzdFJlY3QueSgpKTsKKyAgICBjb250
ZXh0LT5TZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKKyAgICBhZGp1c3RlZERlc3RSZWN0LnNldExv
Y2F0aW9uKEZsb2F0UG9pbnQoKSk7CisKKyAgICBpZiAob3JpZW50YXRpb24gIT0gRGVmYXVsdElt
YWdlT3JpZW50YXRpb24pIHsKKyAgICAgICAgdGhpcy0+Y29uY2F0Q1RNKG9yaWVudGF0aW9uLnRy
YW5zZm9ybUZyb21EZWZhdWx0KGFkanVzdGVkRGVzdFJlY3Quc2l6ZSgpKSk7CisgICAgICAgIGlm
IChvcmllbnRhdGlvbi51c2VzV2lkdGhBc0hlaWdodCgpKSB7CisgICAgICAgICAgICAvLyBUaGUg
ZGVzdGluYXRpb24gcmVjdCB3aWxsIGhhdmUgaXQncyB3aWR0aCBhbmQgaGVpZ2h0IGFscmVhZHkg
cmV2ZXJzZWQgZm9yIHRoZSBvcmllbnRhdGlvbiBvZgorICAgICAgICAgICAgLy8gdGhlIGltYWdl
LCBhcyBpdCB3YXMgbmVlZGVkIGZvciBwYWdlIGxheW91dCwgc28gd2UgbmVlZCB0byByZXZlcnNl
IGl0IGJhY2sgaGVyZS4KKyAgICAgICAgICAgIGFkanVzdGVkRGVzdFJlY3QgPSBGbG9hdFJlY3Qo
YWRqdXN0ZWREZXN0UmVjdC54KCksIGFkanVzdGVkRGVzdFJlY3QueSgpLCBhZGp1c3RlZERlc3RS
ZWN0LmhlaWdodCgpLCBhZGp1c3RlZERlc3RSZWN0LndpZHRoKCkpOworICAgICAgICB9CisgICAg
fQorCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAgICBkcmF3V2l0aG91
dFNoYWRvdyhhZGp1c3RlZERlc3RSZWN0LCBbdGhpcywgaW1hZ2UsIGFkanVzdGVkRGVzdFJlY3Qs
IHNyY1JlY3RdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgcmVu
ZGVyVGFyZ2V0LT5EcmF3Qml0bWFwKGltYWdlLmdldCgpLCBhZGp1c3RlZERlc3RSZWN0LCAxLjBm
LCBEMkQxX0JJVE1BUF9JTlRFUlBPTEFUSU9OX01PREVfTElORUFSLCBzdGF0aWNfY2FzdDxEMkQx
X1JFQ1RfRj4oc3JjUmVjdCkpOworICAgIH0pOworCisgICAgaWYgKCFzdGF0ZVNhdmVyLmRpZFNh
dmUoKSkKKyAgICAgICAgY29udGV4dC0+U2V0VHJhbnNmb3JtKGN0bSk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50UmVj
dCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCwgYm9vbCBtYXlDcmVhdGVCaXRtYXAp
Cit7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3V2luZG93c0JpdG1hcChXaW5kb3dz
Qml0bWFwKiBpbWFnZSwgY29uc3QgSW50UG9pbnQmIHBvaW50KQoreworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBQYXRoJiBwYXRoLCBmbG9hdCB3aWR0aCwg
ZmxvYXQgb2Zmc2V0LCBjb25zdCBDb2xvciYgY29sb3IpCit7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IFZlY3RvcjxGbG9hdFJlY3Q+JiByZWN0cywgZmxv
YXQgd2lkdGgsIGZsb2F0IG9mZnNldCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6dXBkYXRlRG9jdW1lbnRNYXJrZXJSZXNvdXJjZXMoKQoreworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JEb2N1bWVudE1hcmtlcihjb25zdCBG
bG9hdFBvaW50JiBwb2ludCwgZmxvYXQgd2lkdGgsIERvY3VtZW50TWFya2VyTGluZVN0eWxlIHN0
eWxlKQoreworfQorCitDT01QdHI8SUQyRDFTb2xpZENvbG9yQnJ1c2g+IEdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZTo6YnJ1c2hXaXRoQ29sb3IoY29uc3QgRDJEMV9DT0xPUl9GJiBjb2xv
cikKK3sKKyAgICBSR0JBMzIgY29sb3JLZXkgPSBtYWtlUkdCQTMyRnJvbUZsb2F0cyhjb2xvci5y
LCBjb2xvci5nLCBjb2xvci5iLCBjb2xvci5hKTsKKworICAgIGlmICghY29sb3JLZXkpIHsKKyAg
ICAgICAgaWYgKCFtX3plcm9CcnVzaCkKKyAgICAgICAgICAgIG1fcmVuZGVyVGFyZ2V0LT5DcmVh
dGVTb2xpZENvbG9yQnJ1c2goY29sb3IsICZtX3plcm9CcnVzaCk7CisgICAgICAgIHJldHVybiBt
X3plcm9CcnVzaDsKKyAgICB9CisKKyAgICBpZiAoY29sb3JLZXkgPT0gMHhGRkZGRkZGRikgewor
ICAgICAgICBpZiAoIW1fd2hpdGVCcnVzaCkKKyAgICAgICAgICAgIG1fcmVuZGVyVGFyZ2V0LT5D
cmVhdGVTb2xpZENvbG9yQnJ1c2goY29sb3IsICZtX3doaXRlQnJ1c2gpOworICAgICAgICByZXR1
cm4gbV93aGl0ZUJydXNoOworICAgIH0KKworICAgIGF1dG8gZXhpc3RpbmdCcnVzaCA9IG1fc29s
aWRDb2xvcmVkQnJ1c2hDYWNoZS5lbnN1cmUoY29sb3JLZXksIFt0aGlzLCBjb2xvcl0geworICAg
ICAgICBJRDJEMVNvbGlkQ29sb3JCcnVzaCogY29sb3JCcnVzaDsKKyAgICAgICAgbV9yZW5kZXJU
YXJnZXQtPkNyZWF0ZVNvbGlkQ29sb3JCcnVzaChjb2xvciwgJmNvbG9yQnJ1c2gpOworICAgICAg
ICByZXR1cm4gY29sb3JCcnVzaDsKKyAgICB9KTsKKworICAgIHJldHVybiBleGlzdGluZ0JydXNo
Lml0ZXJhdG9yLT52YWx1ZTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGU6OmNsaXAoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIGlmIChtX3JlbmRlclN0YXRl
cy5pc0VtcHR5KCkpCisgICAgICAgIHNhdmUoKTsKKworICAgIG1fcmVuZGVyVGFyZ2V0LT5QdXNo
QXhpc0FsaWduZWRDbGlwKHJlY3QsIEQyRDFfQU5USUFMSUFTX01PREVfUEVSX1BSSU1JVElWRSk7
CisgICAgbV9yZW5kZXJTdGF0ZXMubGFzdCgpLm1fY2xpcHMuYXBwZW5kKEdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZTo6QXhpc0FsaWduZWRDbGlwKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGU6OmNsaXAoY29uc3QgUGF0aCYgcGF0aCkKK3sKKyAgICBjbGlw
KHBhdGgucGxhdGZvcm1QYXRoKCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZTo6Y2xpcChJRDJEMUdlb21ldHJ5KiBwYXRoKQoreworICAgIEFTU0VSVChtX3JlbmRl
clN0YXRlcy5zaXplKCkpOworICAgIGlmICghbV9yZW5kZXJTdGF0ZXMuc2l6ZSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBDT01QdHI8SUQyRDFMYXllcj4gY2xpcExheWVyOworICAgIEhSRVNV
TFQgaHIgPSBtX3JlbmRlclRhcmdldC0+Q3JlYXRlTGF5ZXIoJmNsaXBMYXllcik7CisgICAgQVNT
RVJUKFNVQ0NFRURFRChocikpOworICAgIGlmICghU1VDQ0VFREVEKGhyKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgbV9yZW5kZXJUYXJnZXQtPlB1c2hMYXllcihEMkQxOjpMYXllclBhcmFtZXRl
cnMoRDJEMTo6SW5maW5pdGVSZWN0KCksIHBhdGgpLCBjbGlwTGF5ZXIuZ2V0KCkpOworICAgIG1f
cmVuZGVyU3RhdGVzLmxhc3QoKS5tX2NsaXBzLmFwcGVuZChHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGU6OkxheWVyQ2xpcCk7CisgICAgbV9yZW5kZXJTdGF0ZXMubGFzdCgpLm1fYWN0aXZl
TGF5ZXIgPSBjbGlwTGF5ZXI7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlOjpjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBhZmZpbmVUcmFuc2Zvcm0pCit7
CisgICAgQVNTRVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgpKTsKKworICAgIEQyRDFfTUFUUklYXzNY
Ml9GIGN1cnJlbnRUcmFuc2Zvcm07CisgICAgbV9yZW5kZXJUYXJnZXQtPkdldFRyYW5zZm9ybSgm
Y3VycmVudFRyYW5zZm9ybSk7CisKKyAgICBtX3JlbmRlclRhcmdldC0+U2V0VHJhbnNmb3JtKGFm
ZmluZVRyYW5zZm9ybSAqIEFmZmluZVRyYW5zZm9ybShjdXJyZW50VHJhbnNmb3JtKSk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpmbHVzaCgpCit7CisgICAgQVNT
RVJUKG1fcmVuZGVyVGFyZ2V0LmdldCgpKTsKKyAgICBEMkQxX1RBRyBmaXJzdCwgc2Vjb25kOwor
ICAgIEhSRVNVTFQgaHIgPSBtX3JlbmRlclRhcmdldC0+Rmx1c2goJmZpcnN0LCAmc2Vjb25kKTsK
KworICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6ZW5kRHJhdygpCit7CisgICAgQVNTRVJUKG1fcmVuZGVy
VGFyZ2V0LmdldCgpKTsKKyAgICBEMkQxX1RBRyBmaXJzdCwgc2Vjb25kOworICAgIEhSRVNVTFQg
aHIgPSBtX3JlbmRlclRhcmdldC0+RW5kRHJhdygmZmlyc3QsICZzZWNvbmQpOworCisgICAgUkVM
RUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlOjpyZXN0b3JlKCkKK3sKKyAgICBBU1NFUlQobV9yZW5kZXJUYXJnZXQuZ2V0
KCkpOworCisgICAgYXV0byByZXN0b3JlU3RhdGUgPSBtX3JlbmRlclN0YXRlcy50YWtlTGFzdCgp
OworICAgIG1fcmVuZGVyVGFyZ2V0LT5SZXN0b3JlRHJhd2luZ1N0YXRlKHJlc3RvcmVTdGF0ZS5t
X2RyYXdpbmdTdGF0ZUJsb2NrLmdldCgpKTsKKworICAgIGZvciAoYXV0byBjbGlwVHlwZSA9IHJl
c3RvcmVTdGF0ZS5tX2NsaXBzLnJiZWdpbigpOyBjbGlwVHlwZSAhPSByZXN0b3JlU3RhdGUubV9j
bGlwcy5yZW5kKCk7ICsrY2xpcFR5cGUpIHsKKyAgICAgICAgaWYgKCpjbGlwVHlwZSA9PSBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkF4aXNBbGlnbmVkQ2xpcCkKKyAgICAgICAgICAg
IG1fcmVuZGVyVGFyZ2V0LT5Qb3BBeGlzQWxpZ25lZENsaXAoKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgbV9yZW5kZXJUYXJnZXQtPlBvcExheWVyKCk7CisgICAgfQorfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2F2ZSgpCit7CisgICAgQVNTRVJUKG1fcmVu
ZGVyVGFyZ2V0LmdldCgpKTsKKworICAgIFJlbmRlclN0YXRlIGN1cnJlbnRTdGF0ZTsKKyAgICBH
cmFwaGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+Q3JlYXRlRHJhd2luZ1N0YXRlQmxvY2so
JmN1cnJlbnRTdGF0ZS5tX2RyYXdpbmdTdGF0ZUJsb2NrKTsKKworICAgIG1fcmVuZGVyVGFyZ2V0
LT5TYXZlRHJhd2luZ1N0YXRlKGN1cnJlbnRTdGF0ZS5tX2RyYXdpbmdTdGF0ZUJsb2NrLmdldCgp
KTsKKworICAgIG1fcmVuZGVyU3RhdGVzLmFwcGVuZChjdXJyZW50U3RhdGUpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBz
aXplKQoreworICAgIEFTU0VSVChtX3JlbmRlclRhcmdldC5nZXQoKSk7CisKKyAgICBEMkQxX01B
VFJJWF8zWDJfRiBjdXJyZW50VHJhbnNmb3JtOworICAgIG1fcmVuZGVyVGFyZ2V0LT5HZXRUcmFu
c2Zvcm0oJmN1cnJlbnRUcmFuc2Zvcm0pOworCisgICAgYXV0byBzY2FsZSA9IEQyRDE6Ok1hdHJp
eDN4MkY6OlNjYWxlKHNpemUpOworICAgIG1fcmVuZGVyVGFyZ2V0LT5TZXRUcmFuc2Zvcm0oc2Nh
bGUgKiBjdXJyZW50VHJhbnNmb3JtKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGU6OnNldENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAg
ICBBU1NFUlQobV9yZW5kZXJUYXJnZXQuZ2V0KCkpOworICAgIG1fcmVuZGVyVGFyZ2V0LT5TZXRU
cmFuc2Zvcm0odHJhbnNmb3JtKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGU6OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIEFTU0VSVChtX3JlbmRl
clRhcmdldC5nZXQoKSk7CisKKyAgICBEMkQxX01BVFJJWF8zWDJfRiBjdXJyZW50VHJhbnNmb3Jt
OworICAgIG1fcmVuZGVyVGFyZ2V0LT5HZXRUcmFuc2Zvcm0oJmN1cnJlbnRUcmFuc2Zvcm0pOwor
CisgICAgYXV0byB0cmFuc2xhdGlvbiA9IEQyRDE6Ok1hdHJpeDN4MkY6OlRyYW5zbGF0aW9uKHgs
IHkpOworICAgIG1fcmVuZGVyVGFyZ2V0LT5TZXRUcmFuc2Zvcm0odHJhbnNsYXRpb24gKiBjdXJy
ZW50VHJhbnNmb3JtKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6
OnJvdGF0ZShmbG9hdCBhbmdsZSkKK3sKKyAgICBBU1NFUlQobV9yZW5kZXJUYXJnZXQuZ2V0KCkp
OworCisgICAgRDJEMV9NQVRSSVhfM1gyX0YgY3VycmVudFRyYW5zZm9ybTsKKyAgICBtX3JlbmRl
clRhcmdldC0+R2V0VHJhbnNmb3JtKCZjdXJyZW50VHJhbnNmb3JtKTsKKworICAgIGF1dG8gcm90
YXRpb24gPSBEMkQxOjpNYXRyaXgzeDJGOjpSb3RhdGlvbihyYWQyZGVnKGFuZ2xlKSk7CisgICAg
bV9yZW5kZXJUYXJnZXQtPlNldFRyYW5zZm9ybShyb3RhdGlvbiAqIGN1cnJlbnRUcmFuc2Zvcm0p
OworfQorCitEMkQxX0NPTE9SX0YgR3JhcGhpY3NDb250ZXh0Ojpjb2xvcldpdGhHbG9iYWxBbHBo
YShjb25zdCBDb2xvciYgY29sb3IpIGNvbnN0Cit7CisgICAgZmxvYXQgY29sb3JBbHBoYSA9IGNv
bG9yLmFscGhhKCkgLyAyNTUuMGY7CisgICAgZmxvYXQgZ2xvYmFsQWxwaGEgPSBtX3N0YXRlLmFs
cGhhOworCisgICAgcmV0dXJuIEQyRDE6OkNvbG9yRihjb2xvci5yZ2IoKSwgZ2xvYmFsQWxwaGEg
KiBjb2xvckFscGhhKTsKK30KKworSUQyRDFTb2xpZENvbG9yQnJ1c2gqIEdyYXBoaWNzQ29udGV4
dDo6c29saWRTdHJva2VCcnVzaCgpCit7CisgICAgcmV0dXJuIG1fZGF0YS0+bV9zb2xpZFN0cm9r
ZUJydXNoLmdldCgpOworfQorCitJRDJEMVNvbGlkQ29sb3JCcnVzaCogR3JhcGhpY3NDb250ZXh0
Ojpzb2xpZEZpbGxCcnVzaCgpCit7CisgICAgcmV0dXJuIG1fZGF0YS0+bV9zb2xpZEZpbGxCcnVz
aC5nZXQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdQYXR0ZXJuKEltYWdlJiBp
bWFnZSwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVj
dCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3JtLCBjb25zdCBGbG9hdFBv
aW50JiBwaGFzZSwgY29uc3QgRmxvYXRTaXplJiBzcGFjaW5nLCBDb21wb3NpdGVPcGVyYXRvciBv
cCwgQmxlbmRNb2RlIGJsZW5kTW9kZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpIHx8
ICFwYXR0ZXJuVHJhbnNmb3JtLmlzSW52ZXJ0aWJsZSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpZiAoaXNSZWNvcmRpbmcoKSkgeworICAgICAgICBtX2Rpc3BsYXlMaXN0UmVjb3JkZXItPmRy
YXdQYXR0ZXJuKGltYWdlLCBkZXN0UmVjdCwgdGlsZVJlY3QsIHBhdHRlcm5UcmFuc2Zvcm0sIHBo
YXNlLCBzcGFjaW5nLCBvcCwgYmxlbmRNb2RlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwVG9J
bWFnZUJ1ZmZlcihJbWFnZUJ1ZmZlciYgYnVmZmVyLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0
KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IEZsb2F0U2l6ZSBidWZmZXJEZXN0aW5hdGlvblNpemUgPSBidWZmZXIuc2l6ZUZvckRlc3RpbmF0
aW9uU2l6ZShkZXN0UmVjdC5zaXplKCkpOworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKKy8v
IERyYXdzIGEgZmlsbGVkIHJlY3RhbmdsZSB3aXRoIGEgc3Ryb2tlZCBib3JkZXIuCit2b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZHJhd1JlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBmbG9hdCBib3Jk
ZXJUaGlja25lc3MpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKGlzUmVjb3JkaW5nKCkpIHsKKyAgICAgICAgbV9kaXNwbGF5TGlzdFJl
Y29yZGVyLT5kcmF3UmVjdChyZWN0LCBib3JkZXJUaGlja25lc3MpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgLy8gRklYTUU6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIHBh
dHRlcm5zIGFuZCBncmFkaWVudHMgbGlrZSBkcmF3UGF0aCBkb2VzLCBpdCBwcm9iYWJseSBzaG91
bGQuCisgICAgQVNTRVJUKCFyZWN0LmlzRW1wdHkoKSk7CisKKyAgICBhdXRvIGNvbnRleHQgPSBw
bGF0Zm9ybUNvbnRleHQoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOwor
CisgICAgZHJhd1dpdGhvdXRTaGFkb3cocmVjdCwgW3RoaXMsIHJlY3RdKElEMkQxUmVuZGVyVGFy
Z2V0KiByZW5kZXJUYXJnZXQpIHsKKyAgICAgICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9
IHJlY3Q7CisgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd1JlY3RhbmdsZSgmZDJkUmVjdCwgc29s
aWRTdHJva2VCcnVzaCgpLCBzdHJva2VUaGlja25lc3MoKSk7CisgICAgICAgIHJlbmRlclRhcmdl
dC0+RmlsbFJlY3RhbmdsZSgmZDJkUmVjdCwgc29saWRGaWxsQnJ1c2goKSk7CisgICAgfSk7Cit9
CisKKy8vIFRoaXMgaXMgb25seSB1c2VkIHRvIGRyYXcgYm9yZGVycy4KK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpkcmF3TGluZShjb25zdCBGbG9hdFBvaW50JiBwb2ludDEsIGNvbnN0IEZsb2F0UG9p
bnQmIHBvaW50MikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSA9PSBOb1N0cm9rZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKGlzUmVjb3JkaW5nKCkpIHsKKyAgICAgICAgbV9kaXNwbGF5TGlzdFJlY29y
ZGVyLT5kcmF3TGluZShwb2ludDEsIHBvaW50Mik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBmbG9hdCB0aGlja25lc3MgPSBzdHJva2VUaGlja25lc3MoKTsKKyAgICBib29sIGlzVmVy
dGljYWxMaW5lID0gKHBvaW50MS54KCkgKyB0aGlja25lc3MgPT0gcG9pbnQyLngoKSk7CisgICAg
ZmxvYXQgc3Ryb2tlV2lkdGggPSBpc1ZlcnRpY2FsTGluZSA/IHBvaW50Mi55KCkgLSBwb2ludDEu
eSgpIDogcG9pbnQyLngoKSAtIHBvaW50MS54KCk7CisgICAgaWYgKCF0aGlja25lc3MgfHwgIXN0
cm9rZVdpZHRoKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9y
bUNvbnRleHQoKTsKKworICAgIFN0cm9rZVN0eWxlIHN0cm9rZVN0eWxlID0gdGhpcy0+c3Ryb2tl
U3R5bGUoKTsKKyAgICBmbG9hdCBjb3JuZXJXaWR0aCA9IDA7CisgICAgYm9vbCBkcmF3c0Rhc2hl
ZExpbmUgPSBzdHJva2VTdHlsZSA9PSBEb3R0ZWRTdHJva2UgfHwgc3Ryb2tlU3R5bGUgPT0gRGFz
aGVkU3Ryb2tlOworCisgICAgQ09NUHRyPElEMkQxU3Ryb2tlU3R5bGU+IGQyZFN0cm9rZVN0eWxl
OworICAgIEQyRENvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSwgZHJhd3NEYXNo
ZWRMaW5lKTsKKyAgICBpZiAoZHJhd3NEYXNoZWRMaW5lKSB7CisgICAgICAgIC8vIEZpZ3VyZSBv
dXQgZW5kIHBvaW50cyB0byBlbnN1cmUgd2UgYWx3YXlzIHBhaW50IGNvcm5lcnMuCisgICAgICAg
IGNvcm5lcldpZHRoID0gc3Ryb2tlU3R5bGUgPT0gRG90dGVkU3Ryb2tlID8gdGhpY2tuZXNzIDog
c3RkOjptaW4oMiAqIHRoaWNrbmVzcywgc3RkOjptYXgodGhpY2tuZXNzLCBzdHJva2VXaWR0aCAv
IDMpKTsKKyAgICAgICAgc3Ryb2tlV2lkdGggLT0gMiAqIGNvcm5lcldpZHRoOworICAgICAgICBm
bG9hdCBwYXR0ZXJuV2lkdGggPSBzdHJva2VTdHlsZSA9PSBEb3R0ZWRTdHJva2UgPyB0aGlja25l
c3MgOiBzdGQ6Om1pbigzICogdGhpY2tuZXNzLCBzdGQ6Om1heCh0aGlja25lc3MsIHN0cm9rZVdp
ZHRoIC8gMykpOworICAgICAgICAvLyBDaGVjayBpZiBjb3JuZXIgZHJhd2luZyBzdWZmaWNpZW50
bHkgY292ZXJzIHRoZSBsaW5lLgorICAgICAgICBpZiAoc3Ryb2tlV2lkdGggPD0gcGF0dGVybldp
ZHRoICsgMSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBQYXR0ZXJuIHN0YXJ0
cyB3aXRoIGZ1bGwgZmlsbCBhbmQgZW5kcyB3aXRoIHRoZSBlbXB0eSBmaWxsLgorICAgICAgICAv
LyAxLiBMZXQncyBzdGFydCB3aXRoIHRoZSBlbXB0eSBwaGFzZSBhZnRlciB0aGUgY29ybmVyLgor
ICAgICAgICAvLyAyLiBDaGVjayBpZiB3ZSd2ZSBnb3Qgb2RkIG9yIGV2ZW4gbnVtYmVyIG9mIHBh
dHRlcm5zIGFuZCB3aGV0aGVyIHRoZXkgZnVsbHkgY292ZXIgdGhlIGxpbmUuCisgICAgICAgIC8v
IDMuIEluIGNhc2Ugb2YgZXZlbiBudW1iZXIgb2YgcGF0dGVybnMgYW5kL29yIHJlbWFpbmRlciwg
bW92ZSB0aGUgcGF0dGVybiBzdGFydCBwb3NpdGlvbgorICAgICAgICAvLyBzbyB0aGF0IHRoZSBw
YXR0ZXJuIGlzIGJhbGFuY2VkIGJldHdlZW4gdGhlIGNvcm5lcnMuCisgICAgICAgIGZsb2F0IHBh
dHRlcm5PZmZzZXQgPSBwYXR0ZXJuV2lkdGg7CisgICAgICAgIGludCBudW1iZXJPZlNlZ21lbnRz
ID0gZmxvb3JmKHN0cm9rZVdpZHRoIC8gcGF0dGVybldpZHRoKTsKKyAgICAgICAgYm9vbCBvZGRO
dW1iZXJPZlNlZ21lbnRzID0gbnVtYmVyT2ZTZWdtZW50cyAlIDI7CisgICAgICAgIGZsb2F0IHJl
bWFpbmRlciA9IHN0cm9rZVdpZHRoIC0gKG51bWJlck9mU2VnbWVudHMgKiBwYXR0ZXJuV2lkdGgp
OworICAgICAgICBpZiAob2RkTnVtYmVyT2ZTZWdtZW50cyAmJiByZW1haW5kZXIpCisgICAgICAg
ICAgICBwYXR0ZXJuT2Zmc2V0IC09IHJlbWFpbmRlciAvIDI7CisgICAgICAgIGVsc2UgaWYgKCFv
ZGROdW1iZXJPZlNlZ21lbnRzKSB7CisgICAgICAgICAgICBpZiAocmVtYWluZGVyKQorICAgICAg
ICAgICAgICAgIHBhdHRlcm5PZmZzZXQgKz0gcGF0dGVybk9mZnNldCAtIChwYXR0ZXJuV2lkdGgg
KyByZW1haW5kZXIpIC8gMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwYXR0
ZXJuT2Zmc2V0ICs9IHBhdHRlcm5XaWR0aCAvIDI7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qg
ZmxvYXQgZGFzaGVzWzJdID0geyBwYXR0ZXJuV2lkdGgsIHBhdHRlcm5XaWR0aCB9OworCisgICAg
ICAgIGF1dG8gc3Ryb2tlU3R5bGVQcm9wZXJ0aWVzID0gRDJEMTo6U3Ryb2tlU3R5bGVQcm9wZXJ0
aWVzKCk7CisKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0
ZVN0cm9rZVN0eWxlKCZzdHJva2VTdHlsZVByb3BlcnRpZXMsIGRhc2hlcywgQVJSQVlTSVpFKGRh
c2hlcyksICZkMmRTdHJva2VTdHlsZSk7CisgICAgfQorCisgICAgRmxvYXRQb2ludCBwMSA9IHBv
aW50MTsKKyAgICBGbG9hdFBvaW50IHAyID0gcG9pbnQyOworICAgIC8vIENlbnRlciBsaW5lIGFu
ZCBjdXQgb2ZmIGNvcm5lcnMgZm9yIHBhdHRlcm4gcGF0aW5pbmcuCisgICAgaWYgKGlzVmVydGlj
YWxMaW5lKSB7CisgICAgICAgIGZsb2F0IGNlbnRlck9mZnNldCA9IChwMi54KCkgLSBwMS54KCkp
IC8gMjsKKyAgICAgICAgcDEubW92ZShjZW50ZXJPZmZzZXQsIGNvcm5lcldpZHRoKTsKKyAgICAg
ICAgcDIubW92ZSgtY2VudGVyT2Zmc2V0LCAtY29ybmVyV2lkdGgpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIGZsb2F0IGNlbnRlck9mZnNldCA9IChwMi55KCkgLSBwMS55KCkpIC8gMjsKKyAgICAg
ICAgcDEubW92ZShjb3JuZXJXaWR0aCwgY2VudGVyT2Zmc2V0KTsKKyAgICAgICAgcDIubW92ZSgt
Y29ybmVyV2lkdGgsIC1jZW50ZXJPZmZzZXQpOworICAgIH0KKworICAgIGNvbnRleHQtPlNldFRh
Z3MoMSwgX19MSU5FX18pOworCisgICAgRmxvYXRSZWN0IGJvdW5kaW5nUmVjdChwMSwgcDIpOwor
CisgICAgZHJhd1dpdGhvdXRTaGFkb3coYm91bmRpbmdSZWN0LCBbdGhpcywgcDEsIHAyLCBkMmRT
dHJva2VTdHlsZV0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICBy
ZW5kZXJUYXJnZXQtPkRyYXdMaW5lKHAxLCBwMiwgc29saWRTdHJva2VCcnVzaCgpLCBzdHJva2VU
aGlja25lc3MoKSwgZDJkU3Ryb2tlU3R5bGUuZ2V0KCkpOworICAgIH0pOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZHJhd0VsbGlwc2UoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChpc1Jl
Y29yZGluZygpKSB7CisgICAgICAgIG1fZGlzcGxheUxpc3RSZWNvcmRlci0+ZHJhd0VsbGlwc2Uo
cmVjdCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGVsbGlwc2UgPSBEMkQx
OjpFbGxpcHNlKEQyRDE6OlBvaW50MkYocmVjdC54KCksIHJlY3QueSgpKSwgcmVjdC53aWR0aCgp
LCByZWN0LmhlaWdodCgpKTsKKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgp
OworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAgICBkcmF3V2l0aG91
dFNoYWRvdyhyZWN0LCBbdGhpcywgZWxsaXBzZV0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRh
cmdldCkgeworICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxFbGxpcHNlKCZlbGxpcHNlLCBzb2xp
ZEZpbGxCcnVzaCgpKTsKKworICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdFbGxpcHNlKCZlbGxp
cHNlLCBzb2xpZFN0cm9rZUJydXNoKCksIHN0cm9rZVRoaWNrbmVzcygpKTsKKyAgICB9KTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmFwcGx5U3Ryb2tlUGF0dGVybigpCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTm90ZTogQmVj
YXVzZSBvZiB0aGUgd2F5IERpcmVjdDJEIGRyYXdzLCB3ZSBtYXkgbm90IG5lZWQgdGhpcyBleHBs
aWNpdCBjb250ZXh0ICdzZXQgc3Ryb2tlIHBhdHRlcm4nIGxvZ2ljLgorICAgIG5vdEltcGxlbWVu
dGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjphcHBseUZpbGxQYXR0ZXJuKCkKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBO
b3RlOiBCZWNhdXNlIG9mIHRoZSB3YXkgRGlyZWN0MkQgZHJhd3MsIHdlIG1heSBub3QgbmVlZCB0
aGlzIGV4cGxpY2l0IGNvbnRleHQgJ3NldCBmaWxsIHBhdHRlcm4nIGxvZ2ljLgorICAgIG5vdElt
cGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3UGF0aChjb25zdCBQ
YXRoJiBwYXRoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkgfHwgcGF0aC5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChpc1JlY29yZGluZygpKSB7CisgICAgICAg
IG1fZGlzcGxheUxpc3RSZWNvcmRlci0+ZHJhd1BhdGgocGF0aCk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBjb25z
dCBHcmFwaGljc0NvbnRleHRTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgaWYgKHN0YXRl
LmZpbGxHcmFkaWVudCB8fCBzdGF0ZS5zdHJva2VHcmFkaWVudCkgeworICAgICAgICAvLyBXZSBk
b24ndCBoYXZlIGFueSBvcHRpbWl6ZWQgd2F5IHRvIGZpbGwgJiBzdHJva2UgYSBwYXRoIHVzaW5n
IGdyYWRpZW50cworICAgICAgICAvLyBGSVhNRTogQmUgc21hcnRlciBhYm91dCB0aGlzLgorICAg
ICAgICBmaWxsUGF0aChwYXRoKTsKKyAgICAgICAgc3Ryb2tlUGF0aChwYXRoKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIGlmIChzdGF0ZS5maWxsUGF0dGVybikKKyAgICAgICAgYXBw
bHlGaWxsUGF0dGVybigpOworCisgICAgaWYgKHN0YXRlLnN0cm9rZVBhdHRlcm4pCisgICAgICAg
IGFwcGx5U3Ryb2tlUGF0dGVybigpOworCisgICAgaWYgKHBhdGguYWN0aXZlUGF0aCgpKQorICAg
ICAgICBwYXRoLmFjdGl2ZVBhdGgoKS0+Q2xvc2UoKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3Mo
MSwgX19MSU5FX18pOworCisgICAgYXV0byByZWN0ID0gcGF0aC5mYXN0Qm91bmRpbmdSZWN0KCk7
CisgICAgZHJhd1dpdGhvdXRTaGFkb3cocmVjdCwgW3RoaXMsICZwYXRoXShJRDJEMVJlbmRlclRh
cmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0dlb21ldHJ5
KHBhdGgucGxhdGZvcm1QYXRoKCksIHNvbGlkU3Ryb2tlQnJ1c2goKSk7CisgICAgfSk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3V2l0aG91dFNoYWRvdyhjb25zdCBGbG9hdFJlY3Qm
IC8qYm91bmRpbmdSZWN0Ki8sIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChJRDJEMVJlbmRlclRh
cmdldCopPiYgZHJhd0NvbW1hbmRzKQoreworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29u
dGV4dCgpOworCisgICAgaWYgKCFkaWRCZWdpbkRyYXcoKSkKKyAgICAgICAgY29udGV4dC0+QmVn
aW5EcmF3KCk7CisKKyAgICBkcmF3Q29tbWFuZHMoY29udGV4dCk7CisKKyAgICBpZiAoIWRpZEJl
Z2luRHJhdygpKQorICAgICAgICBtX2RhdGEtPmVuZERyYXcoKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmRyYXdXaXRoU2hhZG93KGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdSZWN0LCBj
b25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoSUQyRDFSZW5kZXJUYXJnZXQqKT4mIGRyYXdDb21tYW5k
cykKK3sKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKKworICAgIC8vIFJl
bmRlciB0aGUgY3VycmVudCBnZW9tZXRyeSB0byBhIGJpdG1hcCBjb250ZXh0CisgICAgQ09NUHRy
PElEMkQxQml0bWFwUmVuZGVyVGFyZ2V0PiBiaXRtYXBUYXJnZXQ7CisgICAgSFJFU1VMVCBociA9
IGNvbnRleHQtPkNyZWF0ZUNvbXBhdGlibGVSZW5kZXJUYXJnZXQoJmJpdG1hcFRhcmdldCk7Cisg
ICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisKKyAgICBiaXRtYXBUYXJnZXQtPkJl
Z2luRHJhdygpOworICAgIGRyYXdDb21tYW5kcyhiaXRtYXBUYXJnZXQuZ2V0KCkpOworICAgIGhy
ID0gYml0bWFwVGFyZ2V0LT5FbmREcmF3KCk7CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVE
KGhyKSk7CisKKyAgICBDT01QdHI8SUQyRDFCaXRtYXA+IGJpdG1hcDsKKyAgICBociA9IGJpdG1h
cFRhcmdldC0+R2V0Qml0bWFwKCZiaXRtYXApOworICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURF
RChocikpOworCisgICAgQ09NUHRyPElEMkQxRGV2aWNlQ29udGV4dD4gZGV2aWNlQ29udGV4dDsK
KyAgICBociA9IGNvbnRleHQtPlF1ZXJ5SW50ZXJmYWNlKCZkZXZpY2VDb250ZXh0KTsKKyAgICBS
RUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKworICAgIC8vIENyZWF0ZSB0aGUgc2hhZG93
IGVmZmVjdAorICAgIENPTVB0cjxJRDJEMUVmZmVjdD4gc2hhZG93RWZmZWN0OworICAgIGhyID0g
ZGV2aWNlQ29udGV4dC0+Q3JlYXRlRWZmZWN0KENMU0lEX0QyRDFTaGFkb3csICZzaGFkb3dFZmZl
Y3QpOworICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOworCisgICAgc2hhZG93RWZm
ZWN0LT5TZXRJbnB1dCgwLCBiaXRtYXAuZ2V0KCkpOworICAgIHNoYWRvd0VmZmVjdC0+U2V0VmFs
dWUoRDJEMV9TSEFET1dfUFJPUF9DT0xPUiwgc3RhdGljX2Nhc3Q8RDJEMV9WRUNUT1JfNEY+KG1f
c3RhdGUuc2hhZG93Q29sb3IpKTsKKyAgICBzaGFkb3dFZmZlY3QtPlNldFZhbHVlKEQyRDFfU0hB
RE9XX1BST1BfQkxVUl9TVEFOREFSRF9ERVZJQVRJT04sIG1fc3RhdGUuc2hhZG93Qmx1cik7CisK
KyAgICBDT01QdHI8SUQyRDFFZmZlY3Q+IHRyYW5zZm9ybUVmZmVjdDsKKyAgICBociA9IGRldmlj
ZUNvbnRleHQtPkNyZWF0ZUVmZmVjdChDTFNJRF9EMkQxMkRBZmZpbmVUcmFuc2Zvcm0sICZ0cmFu
c2Zvcm1FZmZlY3QpOworICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NFRURFRChocikpOworCisgICAg
dHJhbnNmb3JtRWZmZWN0LT5TZXRJbnB1dEVmZmVjdCgwLCBzaGFkb3dFZmZlY3QuZ2V0KCkpOwor
CisgICAgYXV0byB0cmFuc2xhdGlvbiA9IEQyRDE6Ok1hdHJpeDN4MkY6OlRyYW5zbGF0aW9uKG1f
c3RhdGUuc2hhZG93T2Zmc2V0LndpZHRoKCksIG1fc3RhdGUuc2hhZG93T2Zmc2V0LmhlaWdodCgp
KTsKKyAgICB0cmFuc2Zvcm1FZmZlY3QtPlNldFZhbHVlKEQyRDFfMkRBRkZJTkVUUkFOU0ZPUk1f
UFJPUF9UUkFOU0ZPUk1fTUFUUklYLCB0cmFuc2xhdGlvbik7CisKKyAgICBDT01QdHI8SUQyRDFF
ZmZlY3Q+IGNvbXBvc2l0b3I7CisgICAgaHIgPSBkZXZpY2VDb250ZXh0LT5DcmVhdGVFZmZlY3Qo
Q0xTSURfRDJEMUNvbXBvc2l0ZSwgJmNvbXBvc2l0b3IpOworICAgIFJFTEVBU0VfQVNTRVJUKFNV
Q0NFRURFRChocikpOworCisgICAgY29tcG9zaXRvci0+U2V0SW5wdXRFZmZlY3QoMCwgdHJhbnNm
b3JtRWZmZWN0LmdldCgpKTsKKyAgICBjb21wb3NpdG9yLT5TZXRJbnB1dCgxLCBiaXRtYXAuZ2V0
KCkpOworCisgICAgLy8gRmxpcCB0aGUgY29udGV4dAorICAgIEQyRDFfTUFUUklYXzNYMl9GIGN0
bTsKKyAgICBkZXZpY2VDb250ZXh0LT5HZXRUcmFuc2Zvcm0oJmN0bSk7CisgICAgYXV0byB0cmFu
c2xhdGUgPSBEMkQxOjpNYXRyaXgzeDJGOjpUcmFuc2xhdGlvbigwLjBmLCBkZXZpY2VDb250ZXh0
LT5HZXRTaXplKCkuaGVpZ2h0KTsKKyAgICBhdXRvIGZsaXAgPSBEMkQxOjpNYXRyaXgzeDJGOjpT
Y2FsZShEMkQxOjpTaXplRigxLjBmLCAtMS4wZikpOworICAgIGRldmljZUNvbnRleHQtPlNldFRy
YW5zZm9ybShjdG0gKiBmbGlwICogdHJhbnNsYXRlKTsKKworICAgIGRldmljZUNvbnRleHQtPkJl
Z2luRHJhdygpOworICAgIGRldmljZUNvbnRleHQtPkRyYXdJbWFnZShjb21wb3NpdG9yLmdldCgp
LCBEMkQxX0lOVEVSUE9MQVRJT05fTU9ERV9MSU5FQVIpOworICAgIGRldmljZUNvbnRleHQtPkVu
ZERyYXcoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxQYXRoKGNvbnN0IFBhdGgm
IHBhdGgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSB8fCBwYXRoLmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGlzUmVjb3JkaW5nKCkpIHsKKyAgICAgICAgbV9k
aXNwbGF5TGlzdFJlY29yZGVyLT5maWxsUGF0aChwYXRoKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIGlmIChwYXRoLmFjdGl2ZVBhdGgoKSkgeworICAgICAgICAvLyBNYWtlIHN1cmUg
aXQncyBjbG9zZWQuIFRoaXMgbWlnaHQgZmFpbCBpZiB0aGUgcGF0aCB3YXMgYWxyZWFkeSBjbG9z
ZWQsIHNvCisgICAgICAgIC8vIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLgorICAgICAgICBwYXRo
LmFjdGl2ZVBhdGgoKS0+Q2xvc2UoKTsKKyAgICB9CisKKyAgICBEMkRDb250ZXh0U3RhdGVTYXZl
ciBzdGF0ZVNhdmVyKCptX2RhdGEpOworCisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250
ZXh0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIGlmICht
X3N0YXRlLmZpbGxHcmFkaWVudCkgeworICAgICAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElO
RV9fKTsKKworICAgICAgICBGbG9hdFJlY3QgYm91bmRpbmdSZWN0ID0gcGF0aC5mYXN0Qm91bmRp
bmdSZWN0KCk7CisgICAgICAgIGF1dG8gZHJhd0Z1bmN0aW9uID0gW3RoaXMsICZwYXRoXShJRDJE
MVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgICAgICByZW5kZXJUYXJnZXQt
PkZpbGxHZW9tZXRyeShwYXRoLnBsYXRmb3JtUGF0aCgpLCBtX3N0YXRlLmZpbGxHcmFkaWVudC0+
Y3JlYXRlUGxhdGZvcm1HcmFkaWVudElmTmVjZXNzYXJ5KHJlbmRlclRhcmdldCkpOworICAgICAg
ICB9OworCisgICAgICAgIGlmIChoYXNTaGFkb3coKSkKKyAgICAgICAgICAgIGRyYXdXaXRoU2hh
ZG93KGJvdW5kaW5nUmVjdCwgZHJhd0Z1bmN0aW9uKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgZHJhd1dpdGhvdXRTaGFkb3coYm91bmRpbmdSZWN0LCBkcmF3RnVuY3Rpb24pOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fc3RhdGUuZmlsbFBhdHRlcm4pCisgICAgICAg
IGFwcGx5RmlsbFBhdHRlcm4oKTsKKworICAgIENPTVB0cjxJRDJEMUdlb21ldHJ5R3JvdXA+IHBh
dGhUb0ZpbGw7CisgICAgcGF0aC5jcmVhdGVHZW9tZXRyeVdpdGhGaWxsTW9kZShmaWxsUnVsZSgp
LCBwYXRoVG9GaWxsKTsKKworICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworCisg
ICAgRmxvYXRSZWN0IGNvbnRleHRSZWN0KEZsb2F0UG9pbnQoKSwgY29udGV4dC0+R2V0U2l6ZSgp
KTsKKyAgICBkcmF3V2l0aG91dFNoYWRvdyhjb250ZXh0UmVjdCwgW3RoaXMsICZwYXRoVG9GaWxs
XShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIHJlbmRlclRhcmdl
dC0+RmlsbEdlb21ldHJ5KHBhdGhUb0ZpbGwuZ2V0KCksIHNvbGlkRmlsbEJydXNoKCkpOworICAg
IH0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUGF0aChjb25zdCBQYXRoJiBw
YXRoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkgfHwgcGF0aC5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIGlmIChpc1JlY29yZGluZygpKSB7CisgICAgICAgIG1fZGlz
cGxheUxpc3RSZWNvcmRlci0+c3Ryb2tlUGF0aChwYXRoKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOworICAgIAorICAgIGNv
bnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworCisgICAgaWYgKG1fc3RhdGUuc3Ryb2tlR3Jh
ZGllbnQpIHsKKyAgICAgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAgICAg
ICAgRDJEQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqbV9kYXRhKTsKKyAgICAgICAgYXV0
byBib3VuZGluZ1JlY3QgPSBwYXRoLmZhc3RCb3VuZGluZ1JlY3QoKTsKKyAgICAgICAgYXV0byBk
cmF3RnVuY3Rpb24gPSBbdGhpcywgJnBhdGhdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJn
ZXQpIHsKKyAgICAgICAgICAgIHJlbmRlclRhcmdldC0+RHJhd0dlb21ldHJ5KHBhdGgucGxhdGZv
cm1QYXRoKCksIG1fc3RhdGUuc3Ryb2tlR3JhZGllbnQtPmNyZWF0ZVBsYXRmb3JtR3JhZGllbnRJ
Zk5lY2Vzc2FyeShyZW5kZXJUYXJnZXQpKTsKKyAgICAgICAgfTsKKworICAgICAgICBpZiAoaGFz
U2hhZG93KCkpCisgICAgICAgICAgICBkcmF3V2l0aFNoYWRvdyhib3VuZGluZ1JlY3QsIGRyYXdG
dW5jdGlvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRyYXdXaXRob3V0U2hhZG93KGJv
dW5kaW5nUmVjdCwgZHJhd0Z1bmN0aW9uKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgaWYgKG1fc3RhdGUuc3Ryb2tlUGF0dGVybikKKyAgICAgICAgYXBwbHlTdHJva2VQYXR0ZXJu
KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIEZsb2F0UmVj
dCBjb250ZXh0UmVjdChGbG9hdFBvaW50KCksIGNvbnRleHQtPkdldFNpemUoKSk7CisgICAgZHJh
d1dpdGhvdXRTaGFkb3coY29udGV4dFJlY3QsIFt0aGlzLCAmcGF0aF0oSUQyRDFSZW5kZXJUYXJn
ZXQqIHJlbmRlclRhcmdldCkgeworICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdHZW9tZXRyeShw
YXRoLnBsYXRmb3JtUGF0aCgpLCBzb2xpZFN0cm9rZUJydXNoKCksIHN0cm9rZVRoaWNrbmVzcygp
KTsKKyAgICB9KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZs
b2F0UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBpZiAoaXNSZWNvcmRpbmcoKSkgeworICAgICAgICBtX2Rpc3BsYXlMaXN0
UmVjb3JkZXItPmZpbGxSZWN0KHJlY3QpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
YXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7CisKKyAgICBpZiAobV9zdGF0ZS5maWxs
R3JhZGllbnQpIHsKKyAgICAgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisgICAg
ICAgIEQyRENvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0YSk7CisgICAgICAgIGF1
dG8gZHJhd0Z1bmN0aW9uID0gW3RoaXMsIHJlY3RdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJU
YXJnZXQpIHsKKyAgICAgICAgICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSByZWN0Owor
ICAgICAgICAgICAgcmVuZGVyVGFyZ2V0LT5GaWxsUmVjdGFuZ2xlKCZkMmRSZWN0LCBtX3N0YXRl
LmZpbGxHcmFkaWVudC0+Y3JlYXRlUGxhdGZvcm1HcmFkaWVudElmTmVjZXNzYXJ5KHJlbmRlclRh
cmdldCkpOworICAgICAgICB9OworCisgICAgICAgIGlmIChoYXNTaGFkb3coKSkKKyAgICAgICAg
ICAgIGRyYXdXaXRoU2hhZG93KHJlY3QsIGRyYXdGdW5jdGlvbik7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIGRyYXdXaXRob3V0U2hhZG93KHJlY3QsIGRyYXdGdW5jdGlvbik7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV9zdGF0ZS5maWxsUGF0dGVybikKKyAgICAgICAg
YXBwbHlGaWxsUGF0dGVybigpOworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7
CisKKyAgICBib29sIGRyYXdPd25TaGFkb3cgPSAhaXNBY2NlbGVyYXRlZENvbnRleHQoKSAmJiBo
YXNCbHVycmVkU2hhZG93KCkgJiYgIW1fc3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXM7IC8v
IERvbid0IHVzZSBTaGFkb3dCbHVyIGZvciBjYW52YXMgeWV0LgorICAgIGlmIChkcmF3T3duU2hh
ZG93KSB7CisgICAgICAgIC8vIFNoYWRvd0JsdXIgY29udGV4dFNoYWRvdyhtX3N0YXRlKTsKKyAg
ICAgICAgLy8gY29udGV4dFNoYWRvdy5kcmF3UmVjdFNoYWRvdygqdGhpcywgRmxvYXRSb3VuZGVk
UmVjdChyZWN0KSk7CisgICAgICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgfQorCisgICAgZHJh
d1dpdGhvdXRTaGFkb3cocmVjdCwgW3RoaXMsIHJlY3RdKElEMkQxUmVuZGVyVGFyZ2V0KiByZW5k
ZXJUYXJnZXQpIHsKKyAgICAgICAgY29uc3QgRDJEMV9SRUNUX0YgZDJkUmVjdCA9IHJlY3Q7Cisg
ICAgICAgIHJlbmRlclRhcmdldC0+RmlsbFJlY3RhbmdsZSgmZDJkUmVjdCwgc29saWRGaWxsQnJ1
c2goKSk7CisgICAgfSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25z
dCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoaXNSZWNvcmRpbmcoKSkg
eworICAgICAgICBtX2Rpc3BsYXlMaXN0UmVjb3JkZXItPmZpbGxSZWN0KHJlY3QsIGNvbG9yKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29u
dGV4dCgpOworCisgICAgYm9vbCBkcmF3T3duU2hhZG93ID0gIWlzQWNjZWxlcmF0ZWRDb250ZXh0
KCkgJiYgaGFzQmx1cnJlZFNoYWRvdygpICYmICFtX3N0YXRlLnNoYWRvd3NJZ25vcmVUcmFuc2Zv
cm1zOyAvLyBEb24ndCB1c2UgU2hhZG93Qmx1ciBmb3IgY2FudmFzIHlldC4KKyAgICBpZiAoZHJh
d093blNoYWRvdykgeworICAgICAgICAvLyBTaGFkb3dCbHVyIGNvbnRleHRTaGFkb3cobV9zdGF0
ZSk7CisgICAgICAgIC8vIGNvbnRleHRTaGFkb3cuZHJhd1JlY3RTaGFkb3coKnRoaXMsIEZsb2F0
Um91bmRlZFJlY3QocmVjdCkpOworICAgICAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIH0KKwor
ICAgIGNvbnRleHQtPlNldFRhZ3MoMSwgX19MSU5FX18pOworCisgICAgZHJhd1dpdGhvdXRTaGFk
b3cocmVjdCwgW3RoaXMsIHJlY3QsIGNvbG9yXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFy
Z2V0KSB7CisgICAgICAgIGNvbnN0IEQyRDFfUkVDVF9GIGQyZFJlY3QgPSByZWN0OworICAgICAg
ICByZW5kZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUoJmQyZFJlY3QsIG1fZGF0YS0+YnJ1c2hXaXRo
Q29sb3IoY29sb3JXaXRoR2xvYmFsQWxwaGEoY29sb3IpKS5nZXQoKSk7CisgICAgfSk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybUZpbGxSb3VuZGVkUmVjdChjb25zdCBGbG9h
dFJvdW5kZWRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKCFpc1JlY29yZGlu
ZygpKTsKKworICAgIGF1dG8gY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOworCisgICAgYm9v
bCBkcmF3T3duU2hhZG93ID0gIWlzQWNjZWxlcmF0ZWRDb250ZXh0KCkgJiYgaGFzQmx1cnJlZFNo
YWRvdygpICYmICFtX3N0YXRlLnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zOyAvLyBEb24ndCB1c2Ug
U2hhZG93Qmx1ciBmb3IgY2FudmFzIHlldC4KKyAgICBEMkRDb250ZXh0U3RhdGVTYXZlciBzdGF0
ZVNhdmVyKCptX2RhdGEsIGRyYXdPd25TaGFkb3cpOworICAgIGlmIChkcmF3T3duU2hhZG93KSB7
CisgICAgICAgIC8vIFNoYWRvd0JsdXIgY29udGV4dFNoYWRvdyhtX3N0YXRlKTsKKyAgICAgICAg
Ly8gY29udGV4dFNoYWRvdy5kcmF3UmVjdFNoYWRvdygqdGhpcywgcmVjdCk7CisgICAgICAgIG5v
dEltcGxlbWVudGVkKCk7CisgICAgfQorCisgICAgaWYgKCFkaWRCZWdpbkRyYXcoKSkKKyAgICAg
ICAgY29udGV4dC0+QmVnaW5EcmF3KCk7CisgICAgCisgICAgY29udGV4dC0+U2V0VGFncygxLCBf
X0xJTkVfXyk7CisKKyAgICBjb25zdCBGbG9hdFJlY3QmIHIgPSByZWN0LnJlY3QoKTsKKyAgICBj
b25zdCBGbG9hdFJvdW5kZWRSZWN0OjpSYWRpaSYgcmFkaWkgPSByZWN0LnJhZGlpKCk7CisgICAg
Ym9vbCBlcXVhbFdpZHRocyA9IChyYWRpaS50b3BMZWZ0KCkud2lkdGgoKSA9PSByYWRpaS50b3BS
aWdodCgpLndpZHRoKCkgJiYgcmFkaWkudG9wUmlnaHQoKS53aWR0aCgpID09IHJhZGlpLmJvdHRv
bUxlZnQoKS53aWR0aCgpICYmIHJhZGlpLmJvdHRvbUxlZnQoKS53aWR0aCgpID09IHJhZGlpLmJv
dHRvbVJpZ2h0KCkud2lkdGgoKSk7CisgICAgYm9vbCBlcXVhbEhlaWdodHMgPSAocmFkaWkudG9w
TGVmdCgpLmhlaWdodCgpID09IHJhZGlpLmJvdHRvbUxlZnQoKS5oZWlnaHQoKSAmJiByYWRpaS5i
b3R0b21MZWZ0KCkuaGVpZ2h0KCkgPT0gcmFkaWkudG9wUmlnaHQoKS5oZWlnaHQoKSAmJiByYWRp
aS50b3BSaWdodCgpLmhlaWdodCgpID09IHJhZGlpLmJvdHRvbVJpZ2h0KCkuaGVpZ2h0KCkpOwor
ICAgIGJvb2wgaGFzQ3VzdG9tRmlsbCA9IG1fc3RhdGUuZmlsbEdyYWRpZW50IHx8IG1fc3RhdGUu
ZmlsbFBhdHRlcm47CisgICAgaWYgKCFoYXNDdXN0b21GaWxsICYmIGVxdWFsV2lkdGhzICYmIGVx
dWFsSGVpZ2h0cyAmJiByYWRpaS50b3BMZWZ0KCkud2lkdGgoKSAqIDIgPT0gci53aWR0aCgpICYm
IHJhZGlpLnRvcExlZnQoKS5oZWlnaHQoKSAqIDIgPT0gci5oZWlnaHQoKSkgeworICAgICAgICBh
dXRvIHJvdW5kZWRSZWN0ID0gRDJEMTo6Um91bmRlZFJlY3QociwgcmFkaWkudG9wTGVmdCgpLndp
ZHRoKCksIHJhZGlpLnRvcExlZnQoKS5oZWlnaHQoKSk7CisgICAgICAgIENPTVB0cjxJRDJEMVNv
bGlkQ29sb3JCcnVzaD4gZmlsbEJydXNoID0gbV9kYXRhLT5icnVzaFdpdGhDb2xvcihjb2xvcldp
dGhHbG9iYWxBbHBoYShjb2xvcikpOworICAgICAgICBjb250ZXh0LT5GaWxsUm91bmRlZFJlY3Rh
bmdsZShyb3VuZGVkUmVjdCwgZmlsbEJydXNoLmdldCgpKTsKKyAgICB9IGVsc2UgeworICAgICAg
ICBEMkRDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCptX2RhdGEpOworICAgICAgICBzZXRG
aWxsQ29sb3IoY29sb3IpOworCisgICAgICAgIFBhdGggcGF0aDsKKyAgICAgICAgcGF0aC5hZGRS
b3VuZGVkUmVjdChyZWN0KTsKKyAgICAgICAgZmlsbFBhdGgocGF0aCk7CisgICAgfQorCisgICAg
aWYgKCFkaWRCZWdpbkRyYXcoKSkKKyAgICAgICAgbV9kYXRhLT5lbmREcmF3KCk7CisKKyAgICBp
ZiAoZHJhd093blNoYWRvdykKKyAgICAgICAgc3RhdGVTYXZlci5yZXN0b3JlKCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdFdpdGhSb3VuZGVkSG9sZShjb25zdCBGbG9hdFJl
Y3QmIHJlY3QsIGNvbnN0IEZsb2F0Um91bmRlZFJlY3QmIHJvdW5kZWRIb2xlUmVjdCwgY29uc3Qg
Q29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGlmIChpc1JlY29yZGluZygpKSB7CisgICAgICAgIG1fZGlzcGxheUxpc3RS
ZWNvcmRlci0+ZmlsbFJlY3RXaXRoUm91bmRlZEhvbGUocmVjdCwgcm91bmRlZEhvbGVSZWN0LCBj
b2xvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0
Zm9ybUNvbnRleHQoKTsKKworICAgIGlmICghZGlkQmVnaW5EcmF3KCkpCisgICAgICAgIGNvbnRl
eHQtPkJlZ2luRHJhdygpOworCisgICAgY29udGV4dC0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisK
KyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRSZWN0KHJlY3QpOworCisgICAgaWYgKCFyb3Vu
ZGVkSG9sZVJlY3QucmFkaWkoKS5pc1plcm8oKSkKKyAgICAgICAgcGF0aC5hZGRSb3VuZGVkUmVj
dChyb3VuZGVkSG9sZVJlY3QpOworICAgIGVsc2UKKyAgICAgICAgcGF0aC5hZGRSZWN0KHJvdW5k
ZWRIb2xlUmVjdC5yZWN0KCkpOworCisgICAgV2luZFJ1bGUgb2xkRmlsbFJ1bGUgPSBmaWxsUnVs
ZSgpOworICAgIENvbG9yIG9sZEZpbGxDb2xvciA9IGZpbGxDb2xvcigpOworCisgICAgc2V0Rmls
bFJ1bGUoUlVMRV9FVkVOT0REKTsKKyAgICBzZXRGaWxsQ29sb3IoY29sb3IpOworCisgICAgLy8g
ZmlsbFJlY3RXaXRoUm91bmRlZEhvbGUoKSBhc3N1bWVzIHRoYXQgdGhlIGVkZ2VzIG9mIHJlY3Qg
YXJlIGNsaXBwZWQgb3V0LCBzbyB3ZSBvbmx5IGNhcmUgYWJvdXQgc2hhZG93cyBjYXN0IGFyb3Vu
ZCBpbnNpZGUgdGhlIGhvbGUuCisgICAgYm9vbCBkcmF3T3duU2hhZG93ID0gIWlzQWNjZWxlcmF0
ZWRDb250ZXh0KCkgJiYgaGFzQmx1cnJlZFNoYWRvdygpICYmICFtX3N0YXRlLnNoYWRvd3NJZ25v
cmVUcmFuc2Zvcm1zOworICAgIEQyRENvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKm1fZGF0
YSwgZHJhd093blNoYWRvdyk7CisgICAgaWYgKGRyYXdPd25TaGFkb3cpIHsKKyAgICAgICAgLy8g
U2hhZG93Qmx1ciBjb250ZXh0U2hhZG93KG1fc3RhdGUpOworICAgICAgICAvLyBjb250ZXh0U2hh
ZG93LmRyYXdSZWN0U2hhZG93KCp0aGlzLCByZWN0KTsKKyAgICAgICAgbm90SW1wbGVtZW50ZWQo
KTsKKyAgICB9CisKKyAgICBmaWxsUGF0aChwYXRoKTsKKworICAgIGlmICghZGlkQmVnaW5EcmF3
KCkpCisgICAgICAgIG1fZGF0YS0+ZW5kRHJhdygpOworCisgICAgaWYgKGRyYXdPd25TaGFkb3cp
CisgICAgICAgIHN0YXRlU2F2ZXIucmVzdG9yZSgpOworCisgICAgc2V0RmlsbFJ1bGUob2xkRmls
bFJ1bGUpOworICAgIHNldEZpbGxDb2xvcihvbGRGaWxsQ29sb3IpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6Y2xpcChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGlzUmVjb3JkaW5nKCkp
IHsKKyAgICAgICAgbV9kaXNwbGF5TGlzdFJlY29yZGVyLT5jbGlwKHJlY3QpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgbV9kYXRhLT5jbGlwKHJlY3QpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGlzUmVjb3JkaW5n
KCkpIHsKKyAgICAgICAgbV9kaXNwbGF5TGlzdFJlY29yZGVyLT5jbGlwT3V0KHJlY3QpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgUGF0aCBwYXRoOworICAgIHBhdGguYWRkUmVjdChy
ZWN0KTsKKworICAgIGNsaXBPdXQocGF0aCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpj
bGlwT3V0KGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGlzUmVjb3JkaW5nKCkpIHsKKyAgICAgICAgbV9k
aXNwbGF5TGlzdFJlY29yZGVyLT5jbGlwT3V0KHBhdGgpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgLy8gVG8gY2xpcCBPdXQgd2UgbmVlZCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBp
bmZpbml0ZQorICAgIC8vIGNsaXBwaW5nIHJlY3QgYW5kIHRoZSBwYXRoIHdlIGp1c3QgY3JlYXRl
ZC4KKyAgICBEMkQxX1NJWkVfRiByZW5kZXJlclNpemUgPSBwbGF0Zm9ybUNvbnRleHQoKS0+R2V0
U2l6ZSgpOworICAgIEZsb2F0UmVjdCBjbGlwQm91bmRzKDAsIDAsIHJlbmRlcmVyU2l6ZS53aWR0
aCwgcmVuZGVyZXJTaXplLmhlaWdodCk7CisKKyAgICBQYXRoIGJvdW5kaW5nUmVjdDsKKyAgICBi
b3VuZGluZ1JlY3QuYWRkUmVjdChjbGlwQm91bmRzKTsKKyAgICBib3VuZGluZ1JlY3QuYXBwZW5k
R2VvbWV0cnkocGF0aC5wbGF0Zm9ybVBhdGgoKSk7CisKKyAgICBDT01QdHI8SUQyRDFHZW9tZXRy
eUdyb3VwPiBwYXRoVG9DbGlwOworICAgIGJvdW5kaW5nUmVjdC5jcmVhdGVHZW9tZXRyeVdpdGhG
aWxsTW9kZShSVUxFX0VWRU5PREQsIHBhdGhUb0NsaXApOworCisgICAgbV9kYXRhLT5jbGlwKHBh
dGhUb0NsaXAuZ2V0KCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFBhdGgoY29u
c3QgUGF0aCYgcGF0aCwgV2luZFJ1bGUgY2xpcFJ1bGUpCit7CisgICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGlzUmVjb3JkaW5nKCkpIHsKKyAg
ICAgICAgbV9kaXNwbGF5TGlzdFJlY29yZGVyLT5jbGlwUGF0aChwYXRoLCBjbGlwUnVsZSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRl
eHQoKTsKKyAgICBpZiAocGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgbV9kYXRhLT5jbGlwKEZs
b2F0UmVjdCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENPTVB0cjxJRDJEMUdl
b21ldHJ5R3JvdXA+IHBhdGhUb0NsaXA7CisgICAgcGF0aC5jcmVhdGVHZW9tZXRyeVdpdGhGaWxs
TW9kZShjbGlwUnVsZSwgcGF0aFRvQ2xpcCk7CisKKyAgICBtX2RhdGEtPmNsaXAocGF0aFRvQ2xp
cC5nZXQoKSk7Cit9CisKK0ludFJlY3QgR3JhcGhpY3NDb250ZXh0OjpjbGlwQm91bmRzKCkgY29u
c3QKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm4gSW50UmVj
dCgpOworCisgICAgaWYgKGlzUmVjb3JkaW5nKCkpIHsKKyAgICAgICAgV1RGTG9nQWx3YXlzKCJH
ZXR0aW5nIHRoZSBjbGlwIGJvdW5kcyBub3QgeWV0IHN1cHBvcnRlZCB3aXRoIGRpc3BsYXkgbGlz
dHMiKTsKKyAgICAgICAgcmV0dXJuIEludFJlY3QoLTIwNDgsIC0yMDQ4LCA0MDk2LCA0MDk2KTsg
Ly8gRklYTUU6IGRpc3BsYXkgbGlzdHMuCisgICAgfQorCisgICAgRDJEMV9SRUNUX0YgZDJkQ2xp
cEJvdW5kcyA9IEQyRDE6OkluZmluaXRlUmVjdCgpOworICAgIEZsb2F0UmVjdCBjbGlwQm91bmRz
KGQyZENsaXBCb3VuZHMubGVmdCwgZDJkQ2xpcEJvdW5kcy50b3AsIGQyZENsaXBCb3VuZHMucmln
aHQgLSBkMmRDbGlwQm91bmRzLmxlZnQsIGQyZENsaXBCb3VuZHMuYm90dG9tIC0gZDJkQ2xpcEJv
dW5kcy50b3ApOworCisgICAgaWYgKG1fZGF0YS0+Y2xpcExheWVyKCkpIHsKKyAgICAgICAgYXV0
byBjbGlwU2l6ZSA9IG1fZGF0YS0+Y2xpcExheWVyKCktPkdldFNpemUoKTsKKyAgICAgICAgY2xp
cEJvdW5kcy5zZXRXaWR0aChjbGlwU2l6ZS53aWR0aCk7CisgICAgICAgIGNsaXBCb3VuZHMuc2V0
SGVpZ2h0KGNsaXBTaXplLmhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIGVuY2xvc2luZ0lu
dFJlY3QoY2xpcEJvdW5kcyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdpblBsYXRm
b3JtVHJhbnNwYXJlbmN5TGF5ZXIoZmxvYXQgb3BhY2l0eSkKK3sKKyAgICBpZiAocGFpbnRpbmdE
aXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQoIWlzUmVjb3JkaW5nKCkp
OworCisgICAgc2F2ZSgpOworCisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQ6OmVuZFBsYXRmb3JtVHJhbnNwYXJlbmN5TGF5ZXIoKQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVCghaXNSZWNv
cmRpbmcoKSk7CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgcmVzdG9yZSgpOworfQor
Citib29sIEdyYXBoaWNzQ29udGV4dDo6c3VwcG9ydHNUcmFuc3BhcmVuY3lMYXllcnMoKQorewor
ICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3Jt
U2hhZG93KGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0LCBmbG9hdCBibHVyLCBjb25zdCBDb2xvciYg
Y29sb3IpCit7CisgICAgKHZvaWQpb2Zmc2V0OworICAgICh2b2lkKWJsdXI7CisgICAgKHZvaWQp
Y29sb3I7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OmNsZWFyUGxhdGZvcm1TaGFkb3coKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6c2V0TWl0ZXJMaW1pdChmbG9hdCBsaW1pdCkKK3sKKyAgICBpZiAocGFpbnRpbmdE
aXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoaXNSZWNvcmRpbmcoKSkgewor
ICAgICAgICAvLyBNYXliZSB0aGlzIHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBzdGF0ZS4KKyAgICAg
ICAgbV9kaXNwbGF5TGlzdFJlY29yZGVyLT5zZXRNaXRlckxpbWl0KGxpbWl0KTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpjbGVhclJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChpc1JlY29yZGlu
ZygpKSB7CisgICAgICAgIG1fZGlzcGxheUxpc3RSZWNvcmRlci0+Y2xlYXJSZWN0KHJlY3QpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBjb250ZXh0ID0gcGxhdGZvcm1Db250
ZXh0KCk7CisKKyAgICBjb250ZXh0LT5TZXRUYWdzKDEsIF9fTElORV9fKTsKKworICAgIGRyYXdX
aXRob3V0U2hhZG93KHJlY3QsIFt0aGlzLCByZWN0XShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVy
VGFyZ2V0KSB7CisgICAgICAgIEZsb2F0U2l6ZSByZW5kZXJUYXJnZXRTaXplID0gcmVuZGVyVGFy
Z2V0LT5HZXRTaXplKCk7CisgICAgICAgIGlmIChyZWN0LnNpemUoKSA9PSByZW5kZXJUYXJnZXRT
aXplKQorICAgICAgICAgICAgcmVuZGVyVGFyZ2V0LT5DbGVhcigpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICByZW5kZXJUYXJnZXQtPkZpbGxSZWN0YW5nbGUocmVjdCwgbV9kYXRhLT5icnVz
aFdpdGhDb2xvcihjb2xvcldpdGhHbG9iYWxBbHBoYShmaWxsQ29sb3IoKSkpLmdldCgpKTsKKyAg
ICB9KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVJlY3QoY29uc3QgRmxvYXRS
ZWN0JiByZWN0LCBmbG9hdCBsaW5lV2lkdGgpCit7CisgICAgKHZvaWQpcmVjdDsKKyAgICAodm9p
ZClsaW5lV2lkdGg7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnNldExpbmVDYXAoTGluZUNhcCBjYXApCit7CisgICAgKHZvaWQpY2FwOworICAgIG5v
dEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lRGFzaChj
b25zdCBEYXNoQXJyYXkmIGRhc2hlcywgZmxvYXQgZGFzaE9mZnNldCkKK3sKKyAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoaXNSZWNvcmRpbmco
KSkgeworICAgICAgICBtX2Rpc3BsYXlMaXN0UmVjb3JkZXItPnNldExpbmVEYXNoKGRhc2hlcywg
ZGFzaE9mZnNldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZGFzaE9mZnNl
dCA8IDApIHsKKyAgICAgICAgZmxvYXQgbGVuZ3RoID0gMDsKKyAgICAgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBkYXNoZXMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBsZW5ndGggKz0gc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KGRhc2hlc1tpXSk7CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAg
ICAgICBkYXNoT2Zmc2V0ID0gZm1vZChkYXNoT2Zmc2V0LCBsZW5ndGgpICsgbGVuZ3RoOworICAg
IH0KKworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpz
ZXRMaW5lSm9pbihMaW5lSm9pbiBqb2luKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIGlmIChpc1JlY29yZGluZygpKSB7CisgICAgICAgIG1f
ZGlzcGxheUxpc3RSZWNvcmRlci0+c2V0TGluZUpvaW4oam9pbik7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6Y2FudmFzQ2xpcChjb25zdCBQYXRoJiBwYXRoLCBXaW5kUnVsZSBmaWxsUnVsZSkKK3sKKyAg
ICBjbGlwUGF0aChwYXRoLCBmaWxsUnVsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpz
Y2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGlzUmVjb3JkaW5nKCkpIHsKKyAgICAgICAg
bV9kaXNwbGF5TGlzdFJlY29yZGVyLT5zY2FsZShzaXplKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIG1fZGF0YS0+c2NhbGUoc2l6ZSk7CisgICAgLy8gRklYTUU6IG1fZGF0YS0+bV91
c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eSA9IGZhbHNlOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6cm90YXRlKGZsb2F0IGFuZ2xlKQoreworICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChpc1JlY29yZGluZygpKSB7
CisgICAgICAgIG1fZGlzcGxheUxpc3RSZWNvcmRlci0+cm90YXRlKGFuZ2xlKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIG1fZGF0YS0+cm90YXRlKGFuZ2xlKTsKKyAgICAvLyBGSVhN
RTogbV9kYXRhLT5tX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5ID0gZmFs
c2U7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQg
eSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpZiAoaXNSZWNvcmRpbmcoKSkgeworICAgICAgICBtX2Rpc3BsYXlMaXN0UmVjb3JkZXItPnRy
YW5zbGF0ZSh4LCB5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fZGF0YS0+dHJh
bnNsYXRlKHgsIHkpOworICAgIC8vIEZJWE1FOiBtX2RhdGEtPm1fdXNlclRvRGV2aWNlVHJhbnNm
b3JtS25vd25Ub0JlSWRlbnRpdHkgPSBmYWxzZTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoaXNSZWNvcmRp
bmcoKSkgeworICAgICAgICBtX2Rpc3BsYXlMaXN0UmVjb3JkZXItPmNvbmNhdENUTSh0cmFuc2Zv
cm0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9kYXRhLT5jb25jYXRDVE0odHJh
bnNmb3JtKTsKKyAgICAvLyBGSVhNRTogbV9kYXRhLT5tX3VzZXJUb0RldmljZVRyYW5zZm9ybUtu
b3duVG9CZUlkZW50aXR5ID0gZmFsc2U7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRD
VE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCit7CisgICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGlzUmVjb3JkaW5nKCkpIHsK
KyAgICAgICAgV1RGTG9nQWx3YXlzKCJHcmFwaGljc0NvbnRleHQ6OnNldENUTSgpIGlzIG5vdCBj
b21wYXRpYmxlIHdpdGggcmVjb3JkaW5nIGNvbnRleHRzLiIpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgbV9kYXRhLT5zZXRDVE0odHJhbnNmb3JtKTsKKyAgICAvLyBGSVhNRTogbV9k
YXRhLT5tX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5ID0gZmFsc2U7Cit9
CisKK0FmZmluZVRyYW5zZm9ybSBHcmFwaGljc0NvbnRleHQ6OmdldENUTShJbmNsdWRlRGV2aWNl
U2NhbGUgaW5jbHVkZVNjYWxlKSBjb25zdAoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybiBBZmZpbmVUcmFuc2Zvcm0oKTsKKworICAgIGlmIChpc1JlY29yZGlu
ZygpKSB7CisgICAgICAgIFdURkxvZ0Fsd2F5cygiR3JhcGhpY3NDb250ZXh0OjpnZXRDVE0oKSBp
cyBub3QgeWV0IGNvbXBhdGlibGUgd2l0aCByZWNvcmRpbmcgY29udGV4dHMuIik7CisgICAgICAg
IHJldHVybiBBZmZpbmVUcmFuc2Zvcm0oKTsKKyAgICB9CisKKyAgICBEMkQxX01BVFJJWF8zWDJf
RiBjdXJyZW50VHJhbnNmb3JtOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5HZXRUcmFuc2Zvcm0o
JmN1cnJlbnRUcmFuc2Zvcm0pOworICAgIHJldHVybiBjdXJyZW50VHJhbnNmb3JtOworfQorCitG
bG9hdFJlY3QgR3JhcGhpY3NDb250ZXh0Ojpyb3VuZFRvRGV2aWNlUGl4ZWxzKGNvbnN0IEZsb2F0
UmVjdCYgcmVjdCwgUm91bmRpbmdNb2RlIHJvdW5kaW5nTW9kZSkKK3sKKyAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm4gcmVjdDsKKworICAgIGlmIChpc1JlY29yZGlu
ZygpKSB7CisgICAgICAgIFdURkxvZ0Fsd2F5cygiR3JhcGhpY3NDb250ZXh0Ojpyb3VuZFRvRGV2
aWNlUGl4ZWxzKCkgaXMgbm90IHlldCBjb21wYXRpYmxlIHdpdGggcmVjb3JkaW5nIGNvbnRleHRz
LiIpOworICAgICAgICByZXR1cm4gcmVjdDsKKyAgICB9CisKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworCisgICAgcmV0dXJuIHJlY3Q7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGlu
ZUZvclRleHQoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGZsb2F0IHdpZHRoLCBib29sIHByaW50
aW5nLCBib29sIGRvdWJsZUxpbmVzLCBTdHJva2VTdHlsZSBzdHJva2VTdHlsZSkKK3sKKyAgICBE
YXNoQXJyYXkgd2lkdGhzOworICAgIHdpZHRocy5hcHBlbmQod2lkdGgpOworICAgIHdpZHRocy5h
cHBlbmQoMCk7CisgICAgZHJhd0xpbmVzRm9yVGV4dChwb2ludCwgd2lkdGhzLCBwcmludGluZywg
ZG91YmxlTGluZXMsIHN0cm9rZVN0eWxlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRy
YXdMaW5lc0ZvclRleHQoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGNvbnN0IERhc2hBcnJheSYg
d2lkdGhzLCBib29sIHByaW50aW5nLCBib29sIGRvdWJsZUxpbmVzLCBTdHJva2VTdHlsZSBzdHJv
a2VTdHlsZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBpZiAoIXdpZHRocy5zaXplKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChp
c1JlY29yZGluZygpKSB7CisgICAgICAgIG1fZGlzcGxheUxpc3RSZWNvcmRlci0+ZHJhd0xpbmVz
Rm9yVGV4dChwb2ludCwgd2lkdGhzLCBwcmludGluZywgZG91YmxlTGluZXMsIHN0cm9rZVRoaWNr
bmVzcygpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5vdEltcGxlbWVudGVkKCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRVUkxGb3JSZWN0KGNvbnN0IFVSTCYgbGlu
aywgY29uc3QgSW50UmVjdCYgZGVzdFJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGlzUmVjb3JkaW5nKCkpIHsKKyAgICAgICAg
V1RGTG9nQWx3YXlzKCJHcmFwaGljc0NvbnRleHQ6OnNldFVSTEZvclJlY3QoKSBpcyBub3QgeWV0
IGNvbXBhdGlibGUgd2l0aCByZWNvcmRpbmcgY29udGV4dHMuIik7CisgICAgICAgIHJldHVybjsg
Ly8gRklYTUUgZm9yIGRpc3BsYXkgbGlzdHMuCisgICAgfQorCisgICAgUmV0YWluUHRyPENGVVJM
UmVmPiB1cmxSZWYgPSBsaW5rLmNyZWF0ZUNGVVJMKCk7CisgICAgaWYgKCF1cmxSZWYpCisgICAg
ICAgIHJldHVybjsKKworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpzZXRQbGF0Zm9ybUltYWdlSW50ZXJwb2xhdGlvblF1YWxpdHkoSW50ZXJwb2xhdGlv
blF1YWxpdHkgbW9kZSkKK3sKKyAgICBBU1NFUlQoIXBhaW50aW5nRGlzYWJsZWQoKSk7CisKKyAg
ICBEMkQxX0lOVEVSUE9MQVRJT05fTU9ERSBxdWFsaXR5ID0gRDJEMV9JTlRFUlBPTEFUSU9OX01P
REVfTkVBUkVTVF9ORUlHSEJPUjsKKworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgSW50
ZXJwb2xhdGlvbkRlZmF1bHQ6CisgICAgICAgIHF1YWxpdHkgPSBEMkQxX0lOVEVSUE9MQVRJT05f
TU9ERV9ORUFSRVNUX05FSUdIQk9SOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEludGVycG9s
YXRpb25Ob25lOgorICAgICAgICBxdWFsaXR5ID0gRDJEMV9JTlRFUlBPTEFUSU9OX01PREVfTkVB
UkVTVF9ORUlHSEJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRlcnBvbGF0aW9uTG93
OgorICAgICAgICBxdWFsaXR5ID0gRDJEMV9JTlRFUlBPTEFUSU9OX01PREVfTElORUFSOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIEludGVycG9sYXRpb25NZWRpdW06CisgICAgICAgIHF1YWxp
dHkgPSBEMkQxX0lOVEVSUE9MQVRJT05fTU9ERV9DVUJJQzsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBJbnRlcnBvbGF0aW9uSGlnaDoKKyAgICAgICAgcXVhbGl0eSA9IEQyRDFfSU5URVJQT0xB
VElPTl9NT0RFX0hJR0hfUVVBTElUWV9DVUJJQzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAg
IC8vIEZJWE1FOiBTZXRJbnRlcnBvbGF0aW9uUXVhbGl0eShwbGF0Zm9ybUNvbnRleHQoKSwgcXVh
bGl0eSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRJc0NBTGF5ZXJDb250ZXh0KGJv
b2wgaXNMYXllckNvbnRleHQpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgaWYgKGlzUmVjb3JkaW5nKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgcHJvYmFiYWx5IG5vdCBuZWVkZWQuCisgICAgbm90SW1w
bGVtZW50ZWQoKTsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQ6OmlzQ0FMYXllckNvbnRleHQo
KSBjb25zdAoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIC8vIEZJWE1FCisgICAgaWYgKGlzUmVjb3JkaW5nKCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgcHJvYmFiYWx5IG5vdCBuZWVk
ZWQuCisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpzZXRJc0FjY2VsZXJhdGVkQ29udGV4dChib29sIGlzQWNjZWxlcmF0
ZWQpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgLy8gRklYTUUKKyAgICBpZiAoaXNSZWNvcmRpbmcoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQ6OmlzQWNjZWxl
cmF0ZWRDb250ZXh0KCkgY29uc3QKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRQorICAgIGlmIChpc1JlY29yZGluZygp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHByb2Jh
YmFseSBub3QgbmVlZGVkLgorICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZhbHNl
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1UZXh0RHJhd2luZ01vZGUo
VGV4dERyYXdpbmdNb2RlRmxhZ3MgbW9kZSkKK3sKKyAgICAodm9pZCltb2RlOworICAgIG5vdElt
cGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9r
ZUNvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBBU1NFUlQobV9zdGF0ZS5zdHJva2VD
b2xvciA9PSBjb2xvcik7CisKKyAgICBtX2RhdGEtPm1fc29saWRTdHJva2VCcnVzaCA9IG51bGxw
dHI7CisKKyAgICBtX2RhdGEtPm1fc29saWRTdHJva2VCcnVzaCA9IG1fZGF0YS0+YnJ1c2hXaXRo
Q29sb3IoY29sb3JXaXRoR2xvYmFsQWxwaGEoc3Ryb2tlQ29sb3IoKSkpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VUaGlja25lc3MoZmxvYXQgdGhpY2tuZXNz
KQoreworICAgIC8vIFRoaXMgaXMgYSBuby1vcCBvbiBXaW5kb3dzLiBXZSBmaWxsIHVzaW5nIHRo
ZSBHcmFwaGljc0NvbnRleHRTdGF0ZTo6c3Ryb2tlVGhpY2tuZXNzIG1lbWJlci4KKyAgICBBU1NF
UlQobV9zdGF0ZS5zdHJva2VUaGlja25lc3MgPT0gdGhpY2tuZXNzKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQ6OnNldFBsYXRmb3JtRmlsbENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sK
KyAgICBBU1NFUlQobV9zdGF0ZS5maWxsQ29sb3IgPT0gY29sb3IpOworCisgICAgbV9kYXRhLT5t
X3NvbGlkRmlsbEJydXNoID0gbnVsbHB0cjsKKworICAgIG1fZGF0YS0+bV9zb2xpZEZpbGxCcnVz
aCA9IG1fZGF0YS0+YnJ1c2hXaXRoQ29sb3IoY29sb3JXaXRoR2xvYmFsQWxwaGEoZmlsbENvbG9y
KCkpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU2hvdWxkQW50aWFs
aWFzKGJvb2wgZW5hYmxlKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIEFTU0VSVCghaXNSZWNvcmRpbmcoKSk7CisKKyAgICBhdXRvIGFudGlh
bGlhc01vZGUgPSBlbmFibGUgPyBEMkQxX0FOVElBTElBU19NT0RFX1BFUl9QUklNSVRJVkUgOiBE
MkQxX0FOVElBTElBU19NT0RFX0FMSUFTRUQ7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPlNldEFu
dGlhbGlhc01vZGUoYW50aWFsaWFzTW9kZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpz
ZXRQbGF0Zm9ybVNob3VsZFNtb290aEZvbnRzKGJvb2wgZW5hYmxlKQoreworICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVCghaXNSZWNvcmRp
bmcoKSk7CisKKyAgICBhdXRvIGZvbnRTbW9vdGhpbmdNb2RlID0gZW5hYmxlID8gRDJEMV9URVhU
X0FOVElBTElBU19NT0RFX0NMRUFSVFlQRSA6IEQyRDFfVEVYVF9BTlRJQUxJQVNfTU9ERV9BTElB
U0VEOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5TZXRUZXh0QW50aWFsaWFzTW9kZShmb250U21v
b3RoaW5nTW9kZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybUFscGhh
KGZsb2F0KQoreworICAgIC8qIE5vLW9wIG9uIHRoaXMgcGxhdGZvcm0gKi8KK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtQ29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9w
ZXJhdG9yIG1vZGUsIEJsZW5kTW9kZSBibGVuZE1vZGUpCit7CisgICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKCFpc1JlY29yZGluZygpKTsK
KworICAgIEQyRDFfQkxFTkRfTU9ERSB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVf
U0NSRUVOOworICAgIEQyRDFfQ09NUE9TSVRFX01PREUgdGFyZ2V0Q29tcG9zaXRlTW9kZSA9IEQy
RDFfQ09NUE9TSVRFX01PREVfU09VUkNFX0FUT1A7IC8vID8/PworCisgICAgaWYgKGJsZW5kTW9k
ZSAhPSBCbGVuZE1vZGVOb3JtYWwpIHsKKyAgICAgICAgc3dpdGNoIChibGVuZE1vZGUpIHsKKyAg
ICAgICAgY2FzZSBCbGVuZE1vZGVNdWx0aXBseToKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9k
ZSA9IEQyRDFfQkxFTkRfTU9ERV9NVUxUSVBMWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIEJsZW5kTW9kZVNjcmVlbjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQy
RDFfQkxFTkRfTU9ERV9TQ1JFRU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBC
bGVuZE1vZGVPdmVybGF5OgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVO
RF9NT0RFX09WRVJMQVk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVuZE1v
ZGVEYXJrZW46CisgICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVf
REFSS0VOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2RlTGlnaHRl
bjoKKyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9MSUdIVEVO
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2RlQ29sb3JEb2RnZToK
KyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DT0xPUl9ET0RH
RTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9kZUNvbG9yQnVybjoK
KyAgICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9DT0xPUl9CVVJO
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2RlSGFyZExpZ2h0Ogor
ICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2RlID0gRDJEMV9CTEVORF9NT0RFX0hBUkRfTElHSFQ7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVuZE1vZGVTb2Z0TGlnaHQ6Cisg
ICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfU09GVF9MSUdIVDsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9kZURpZmZlcmVuY2U6Cisg
ICAgICAgICAgICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfRElGRkVSRU5DRTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJsZW5kTW9kZUV4Y2x1c2lvbjoKKyAg
ICAgICAgICAgIHRhcmdldEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9FWENMVVNJT047Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCbGVuZE1vZGVIdWU6CisgICAgICAgICAg
ICB0YXJnZXRCbGVuZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfSFVFOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2RlU2F0dXJhdGlvbjoKKyAgICAgICAgICAgIHRhcmdl
dEJsZW5kTW9kZSA9IEQyRDFfQkxFTkRfTU9ERV9TQVRVUkFUSU9OOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgQmxlbmRNb2RlQ29sb3I6CisgICAgICAgICAgICB0YXJnZXRCbGVu
ZE1vZGUgPSBEMkQxX0JMRU5EX01PREVfQ09MT1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBCbGVuZE1vZGVMdW1pbm9zaXR5OgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2Rl
ID0gRDJEMV9CTEVORF9NT0RFX0xVTUlOT1NJVFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBCbGVuZE1vZGVQbHVzRGFya2VyOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRNb2Rl
ID0gRDJEMV9CTEVORF9NT0RFX0RBUktFUl9DT0xPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIEJsZW5kTW9kZVBsdXNMaWdodGVyOgorICAgICAgICAgICAgdGFyZ2V0QmxlbmRN
b2RlID0gRDJEMV9CTEVORF9NT0RFX0xJR0hURVJfQ09MT1I7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBl
bHNlIHsKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlQ2xl
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
KyAgICB9CisKKyAgICBtX2RhdGEtPm1fYmxlbmRNb2RlID0gdGFyZ2V0QmxlbmRNb2RlOworICAg
IG1fZGF0YS0+bV9jb21wb3NpdGVNb2RlID0gdGFyZ2V0Q29tcG9zaXRlTW9kZTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtQXBwbHlEZXZpY2VTY2FsZUZhY3RvcihmbG9hdCBk
ZXZpY2VTY2FsZUZhY3RvcikKK3sKKyAgICAvLyBUaGlzIGlzIGEgbm8tb3AgZm9yIERpcmVjdDJE
LgorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1GaWxsRWxsaXBzZShjb25zdCBG
bG9hdFJlY3QmIGVsbGlwc2UpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgQVNTRVJUKCFpc1JlY29yZGluZygpKTsKKworICAgIGlmIChtX3N0
YXRlLmZpbGxHcmFkaWVudCB8fCBtX3N0YXRlLmZpbGxQYXR0ZXJuKSB7CisgICAgICAgIC8vIEZJ
WE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byBmaWxsIGVsbGlwc2VzIHdpdGggcGF0dGVybi9ncmFk
aWVudCBicnVzaGVzIGluIEQyRC4KKyAgICAgICAgZmlsbEVsbGlwc2VBc1BhdGgoZWxsaXBzZSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGQyZEVsbGlwc2UgPSBEMkQxOjpF
bGxpcHNlKEQyRDE6OlBvaW50MkYoZWxsaXBzZS54KCksIGVsbGlwc2UueSgpKSwgZWxsaXBzZS53
aWR0aCgpLCBlbGxpcHNlLmhlaWdodCgpKTsKKworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5TZXRU
YWdzKDEsIF9fTElORV9fKTsKKworICAgIGRyYXdXaXRob3V0U2hhZG93KGVsbGlwc2UsIFt0aGlz
LCBkMmRFbGxpcHNlXShJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KSB7CisgICAgICAg
IHJlbmRlclRhcmdldC0+RmlsbEVsbGlwc2UoJmQyZEVsbGlwc2UsIHNvbGlkRmlsbEJydXNoKCkp
OworICAgIH0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1TdHJva2VFbGxp
cHNlKGNvbnN0IEZsb2F0UmVjdCYgZWxsaXBzZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxl
ZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQoIWlzUmVjb3JkaW5nKCkpOworCisg
ICAgaWYgKG1fc3RhdGUuc3Ryb2tlR3JhZGllbnQgfHwgbV9zdGF0ZS5zdHJva2VQYXR0ZXJuKSB7
CisgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byBzdHJva2UgZWxsaXBzZXMg
d2l0aCBwYXR0ZXJuL2dyYWRpZW50IGJydXNoZXMgaW4gRDJELgorICAgICAgICBzdHJva2VFbGxp
cHNlQXNQYXRoKGVsbGlwc2UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBk
MmRFbGxpcHNlID0gRDJEMTo6RWxsaXBzZShEMkQxOjpQb2ludDJGKGVsbGlwc2UueCgpLCBlbGxp
cHNlLnkoKSksIGVsbGlwc2Uud2lkdGgoKSwgZWxsaXBzZS5oZWlnaHQoKSk7CisKKyAgICBwbGF0
Zm9ybUNvbnRleHQoKS0+U2V0VGFncygxLCBfX0xJTkVfXyk7CisKKyAgICBkcmF3V2l0aG91dFNo
YWRvdyhlbGxpcHNlLCBbdGhpcywgZDJkRWxsaXBzZV0oSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRl
clRhcmdldCkgeworICAgICAgICByZW5kZXJUYXJnZXQtPkRyYXdFbGxpcHNlKCZkMmRFbGxpcHNl
LCBzb2xpZFN0cm9rZUJydXNoKCksIHN0cm9rZVRoaWNrbmVzcygpKTsKKyAgICB9KTsKK30KKwor
fQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZURpcmVjdDJELmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURp
cmVjdDJELmgJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURpcmVjdDJELmgJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1
ZGUgIkNvbG9yLmgiCisjaW5jbHVkZSA8ZDJkMS5oPgorI2luY2x1ZGUgPGQyZDFfMS5oPgorI2lu
Y2x1ZGUgPGQyZDFlZmZlY3RzLmg+CisjaW5jbHVkZSA8ZDJkMWhlbHBlci5oPgorI2luY2x1ZGUg
PHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3dGYvVGlueUxSVUNhY2hlLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlIHsKKyAgICBX
VEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUoSUQyRDFSZW5kZXJUYXJnZXQqIHJlbmRlclRhcmdldCkKKyAgICAgICAgOiBt
X3JlbmRlclRhcmdldChyZW5kZXJUYXJnZXQpCisgICAgeworICAgIH0KKworICAgIGVudW0gRGly
ZWN0MkRMYXllclR5cGUgeyBBeGlzQWxpZ25lZENsaXAsIExheWVyQ2xpcCB9OworCisgICAgdm9p
ZCBjbGlwKGNvbnN0IEZsb2F0UmVjdCYpOworICAgIHZvaWQgY2xpcChjb25zdCBQYXRoJik7Cisg
ICAgdm9pZCBjbGlwKElEMkQxR2VvbWV0cnkqKTsKKyAgICB2b2lkIGVuZERyYXcoKTsKKyAgICB2
b2lkIGZsdXNoKCk7CisgICAgdm9pZCBzYXZlKCk7CisgICAgdm9pZCBzY2FsZShjb25zdCBGbG9h
dFNpemUmKTsKKyAgICB2b2lkIHJlc3RvcmUoKTsKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCk7Cisg
ICAgdm9pZCB0cmFuc2xhdGUoZmxvYXQsIGZsb2F0KTsKKyAgICB2b2lkIGNvbmNhdENUTShjb25z
dCBBZmZpbmVUcmFuc2Zvcm0mKTsKKyAgICB2b2lkIHNldENUTShjb25zdCBBZmZpbmVUcmFuc2Zv
cm0mKTsKKworICAgIElEMkQxUmVuZGVyVGFyZ2V0KiByZW5kZXJUYXJnZXQoKSB7IHJldHVybiBt
X3JlbmRlclRhcmdldC5nZXQoKTsgfQorICAgIElEMkQxTGF5ZXIqIGNsaXBMYXllcigpIGNvbnN0
IHsgcmV0dXJuIG1fcmVuZGVyU3RhdGVzLmxhc3QoKS5tX2FjdGl2ZUxheWVyLmdldCgpOyB9CisK
KyAgICBDT01QdHI8SUQyRDFTb2xpZENvbG9yQnJ1c2g+IGJydXNoV2l0aENvbG9yKGNvbnN0IEQy
RDFfQ09MT1JfRiYpOworCisgICAgSERDIG1faGRjIHsgbnVsbHB0ciB9OworICAgIEQyRDFfQkxF
TkRfTU9ERSBtX2JsZW5kTW9kZSB7IEQyRDFfQkxFTkRfTU9ERV9NVUxUSVBMWSB9OworICAgIEQy
RDFfQ09NUE9TSVRFX01PREUgbV9jb21wb3NpdGVNb2RlIHsgRDJEMV9DT01QT1NJVEVfTU9ERV9T
T1VSQ0VfT1ZFUiB9OworICAgIGJvb2wgbV9zaG91bGRJbmNsdWRlQ2hpbGRXaW5kb3dzIHsgZmFs
c2UgfTsKKyAgICBib29sIG1fZGlkQmVnaW5EcmF3IHsgZmFsc2UgfTsKKworICAgIENPTVB0cjxJ
RDJEMVNvbGlkQ29sb3JCcnVzaD4gbV9zb2xpZFN0cm9rZUJydXNoOworICAgIENPTVB0cjxJRDJE
MVNvbGlkQ29sb3JCcnVzaD4gbV9zb2xpZEZpbGxCcnVzaDsKKworcHJpdmF0ZToKKyAgICBDT01Q
dHI8SUQyRDFSZW5kZXJUYXJnZXQ+IG1fcmVuZGVyVGFyZ2V0OworICAgIEhhc2hNYXA8UkdCQTMy
LCBDT01QdHI8SUQyRDFTb2xpZENvbG9yQnJ1c2g+PiBtX3NvbGlkQ29sb3JlZEJydXNoQ2FjaGU7
CisgICAgQ09NUHRyPElEMkQxU29saWRDb2xvckJydXNoPiBtX3doaXRlQnJ1c2g7CisgICAgQ09N
UHRyPElEMkQxU29saWRDb2xvckJydXNoPiBtX3plcm9CcnVzaDsKKworICAgIHN0cnVjdCBSZW5k
ZXJTdGF0ZSB7CisgICAgICAgIENPTVB0cjxJRDJEMURyYXdpbmdTdGF0ZUJsb2NrPiBtX2RyYXdp
bmdTdGF0ZUJsb2NrOworICAgICAgICBDT01QdHI8SUQyRDFMYXllcj4gbV9hY3RpdmVMYXllcjsK
KyAgICAgICAgVmVjdG9yPERpcmVjdDJETGF5ZXJUeXBlPiBtX2NsaXBzOworICAgIH07CisKKyAg
ICBWZWN0b3I8UmVuZGVyU3RhdGU+IG1fcmVuZGVyU3RhdGVzOworfTsKKworY2xhc3MgRDJEQ29u
dGV4dFN0YXRlU2F2ZXIgeworcHVibGljOgorICAgIEQyRENvbnRleHRTdGF0ZVNhdmVyKEdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSYgY29udGV4dCwgYm9vbCBzYXZlQW5kUmVzdG9yZSA9
IHRydWUpCisgICAgICAgIDogbV9jb250ZXh0KGNvbnRleHQpCisgICAgICAgICwgbV9zYXZlQW5k
UmVzdG9yZShzYXZlQW5kUmVzdG9yZSkKKyAgICB7CisgICAgICAgIGlmIChtX3NhdmVBbmRSZXN0
b3JlKQorICAgICAgICAgICAgbV9jb250ZXh0LnNhdmUoKTsKKyAgICB9CisKKyAgICB+RDJEQ29u
dGV4dFN0YXRlU2F2ZXIoKQorICAgIHsKKyAgICAgICAgaWYgKG1fc2F2ZUFuZFJlc3RvcmUpCisg
ICAgICAgICAgICBtX2NvbnRleHQucmVzdG9yZSgpOworICAgIH0KKworICAgIHZvaWQgc2F2ZSgp
CisgICAgeworICAgICAgICBBU1NFUlQoIW1fc2F2ZUFuZFJlc3RvcmUpOworICAgICAgICBtX2Nv
bnRleHQuc2F2ZSgpOworICAgICAgICBtX3NhdmVBbmRSZXN0b3JlID0gdHJ1ZTsKKyAgICB9CisK
KyAgICB2b2lkIHJlc3RvcmUoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fc2F2ZUFuZFJlc3Rv
cmUpOworICAgICAgICBtX2NvbnRleHQucmVzdG9yZSgpOworICAgICAgICBtX3NhdmVBbmRSZXN0
b3JlID0gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBkaWRTYXZlKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiBtX3NhdmVBbmRSZXN0b3JlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUmIG1fY29udGV4dDsKKyAgICBib29sIG1fc2F2
ZUFuZFJlc3RvcmUgeyBmYWxzZSB9OworfTsKKworfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5j
cHAJKHJldmlzaW9uIDIwNjc0MSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9HcmFwaGljc0NvbnRleHRXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw2ICsyOCw4
IEBACiAKICNpZiBVU0UoQ0cpCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlQ0cuaCIKKyNlbGlmIFVTRShESVJFQ1QyRCkKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGVEaXJlY3QyRC5oIgogI2VsaWYgVVNFKENBSVJPKQogI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNhaXJvLmgiCiAjZW5kaWYKQEAgLTE0NCw3ICsx
NDYsNyBAQCBIREMgR3JhcGhpY3NDb250ZXh0OjpoZGMoKSBjb25zdAogICAgIHJldHVybiBtX2Rh
dGEtPm1faGRjOwogfQogCi0jaWYgUExBVEZPUk0oV0lOKQorI2lmIFBMQVRGT1JNKFdJTikgJiYg
IVVTRShESVJFQ1QyRCkKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzYXZl
KCkKIHsKICAgICBpZiAoIW1faGRjKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL1RyYW5zZm9ybWF0aW9uTWF0cml4RGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9UcmFuc2Zvcm1hdGlvbk1hdHJp
eERpcmVjdDJELmNwcAkocmV2aXNpb24gMjA2NzQxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL1RyYW5zZm9ybWF0aW9uTWF0cml4RGlyZWN0MkQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC03Miw0ICs3Miw0IEBAIEFmZmluZVRyYW5zZm9ybTo6b3BlcmF0b3IgRDJEMV9N
QVRSSVhfM1gKIAogfQogCi0jZW5kaWYgLy8gVVNFKERJUkVDVDJEKQorI2VuZGlmCg==
</data>
<flag name="review"
          id="313786"
          type_id="1"
          status="+"
          setter="dino"
    />
          </attachment>
      

    </bug>

</bugzilla>