<?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>123646</bug_id>
          
          <creation_ts>2013-11-01 16:03:56 -0700</creation_ts>
          <short_desc>Remote Layer Tree: Move RemoteLayerBackingStore to Shared/</short_desc>
          <delta_ts>2013-11-04 11:08:06 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit2</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Tim Horton">thorton</reporter>
          <assigned_to name="Tim Horton">thorton</assigned_to>
          <cc>andersca</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>946078</commentid>
    <comment_count>0</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-11-01 16:03:56 -0700</bug_when>
    <thetext>Move RemoteLayerBackingStore to Shared/, since it is used on both the UI and Web process side of things.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>946079</commentid>
    <comment_count>1</comment_count>
      <attachid>215775</attachid>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-11-01 16:04:54 -0700</bug_when>
    <thetext>Created attachment 215775
patch

will move with svn mv</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>946085</commentid>
    <comment_count>2</comment_count>
      <attachid>215775</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-11-01 16:13:02 -0700</bug_when>
    <thetext>Comment on attachment 215775
patch

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

&gt; Source/WebKit2/Shared/mac/RemoteLayerBackingStore.mm:40
&gt; +#ifdef __has_include
&gt; +#if __has_include(&lt;ApplicationServices/ApplicationServicesPriv.h&gt;)

I think we could do this with a single if instead:

    #if defined __has_include &amp;&amp; __has_include(&lt;ApplicationServices/ApplicationServicesPriv.h&gt;)

I didn’t think of that earlier because I found the whole idiom so strange.

&gt; Source/WebKit2/Shared/mac/RemoteLayerBackingStore.mm:152
&gt; +    unsigned long bytesPerRow = IOSurfaceAlignProperty(kIOSurfaceBytesPerRow, width * bytesPerElement);

This returns size_t, not unsigned long.

&gt; Source/WebKit2/Shared/mac/RemoteLayerBackingStore.mm:155
&gt; +    unsigned long allocSize = IOSurfaceAlignProperty(kIOSurfaceAllocSize, height * bytesPerRow);

Ditto.

&gt; Source/WebKit2/Shared/mac/RemoteLayerBackingStore.mm:215
&gt; +        backSurface = createIOSurface(expandedScaledSize);

Why not use m_frontSurface directly here and dump the backSurface local?

&gt; Source/WebKit2/Shared/mac/RemoteLayerBackingStore.mm:218
&gt; +        CGContextClearRect(cgContext.get(), CGRectMake(0, 0, expandedScaledSize.width(), expandedScaledSize.height()));

Could we use CGRectInfinite instead?

&gt; Source/WebKit2/Shared/mac/RemoteLayerBackingStore.mm:222
&gt; +        backBuffer = ShareableBitmap::createShareable(expandedIntSize(scaledSize), ShareableBitmap::SupportsAlpha);

Why not use m_frontBuffer directly here and dump the backBuffer local?

&gt; Source/WebKit2/Shared/mac/RemoteLayerBackingStore.mm:226
&gt; +    drawInContext(*context);

It’s kind of funny that we allocate the context on the heap just so we can share this one line of code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>946089</commentid>
    <comment_count>3</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-11-01 16:20:11 -0700</bug_when>
    <thetext>Heh, thanks, Darin! I&apos;ll make those changes in another patch since it doesn&apos;t seem like a good idea to do them in a file-move patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>946090</commentid>
    <comment_count>4</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-11-01 16:23:28 -0700</bug_when>
    <thetext>Did the move in http://trac.webkit.org/changeset/158463</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>946096</commentid>
    <comment_count>5</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-11-01 16:33:52 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 215775 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=215775&amp;action=review
&gt; 
&gt; &gt; Source/WebKit2/Shared/mac/RemoteLayerBackingStore.mm:40
&gt; &gt; +#ifdef __has_include
&gt; &gt; +#if __has_include(&lt;ApplicationServices/ApplicationServicesPriv.h&gt;)
&gt; 
&gt; I think we could do this with a single if instead:
&gt; 
&gt;     #if defined __has_include &amp;&amp; __has_include(&lt;ApplicationServices/ApplicationServicesPriv.h&gt;)
&gt; 
&gt; I didn’t think of that earlier because I found the whole idiom so strange.

We could! That does look a lot nicer. None of the other instances of this idiom do, but I don&apos;t see why not.

&gt; &gt; Source/WebKit2/Shared/mac/RemoteLayerBackingStore.mm:215
&gt; &gt; +        backSurface = createIOSurface(expandedScaledSize);
&gt; 
&gt; Why not use m_frontSurface directly here and dump the backSurface local?
&gt;
&gt; &gt; Source/WebKit2/Shared/mac/RemoteLayerBackingStore.mm:222
&gt; &gt; +        backBuffer = ShareableBitmap::createShareable(expandedIntSize(scaledSize), ShareableBitmap::SupportsAlpha);
&gt; 
&gt; Why not use m_frontBuffer directly here and dump the backBuffer local?

I&apos;m a bit concerned about releasing the existing m_frontSurface while we have an image referencing it for the same reason I discovered I need to hold onto the context - I&apos;m pretty sure we&apos;ll copy the image data off the GPU. But I haven&apos;t tested or looked at the source in this specific case.

Doing that in the software case would be fine, because the CGImageRef will hold on to the ShareableBitmap while it&apos;s alive.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>946125</commentid>
    <comment_count>6</comment_count>
      <attachid>215787</attachid>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-11-01 17:49:07 -0700</bug_when>
    <thetext>Created attachment 215787
address review comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>946225</commentid>
    <comment_count>7</comment_count>
      <attachid>215787</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-11-02 09:02:54 -0700</bug_when>
    <thetext>Comment on attachment 215787
address review comments

Clearing flags on attachment: 215787

Committed r158488: &lt;http://trac.webkit.org/changeset/158488&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>215775</attachid>
            <date>2013-11-01 16:04:54 -0700</date>
            <delta_ts>2013-11-01 16:13:02 -0700</delta_ts>
            <desc>patch</desc>
            <filename>move.diff</filename>
            <type>text/plain</type>
            <size>32023</size>
            <attacher name="Tim Horton">thorton</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQyL0No
YW5nZUxvZwppbmRleCA2MzI3OWFkLi45MzRmYjViIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
Mi9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMTkg
QEAKIDIwMTMtMTEtMDEgIFRpbSBIb3J0b24gIDx0aW1vdGh5X2hvcnRvbkBhcHBsZS5jb20+CiAK
KyAgICAgICAgUmVtb3RlIExheWVyIFRyZWU6IE1vdmUgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUg
dG8gU2hhcmVkLworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTIzNjQ2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgTW92ZSBSZW1vdGVMYXllckJhY2tpbmdTdG9yZSB0byBTaGFyZWQvLCBzaW5jZSBpdCBpcwor
ICAgICAgICB1c2VkIG9uIGJvdGggdGhlIFVJIGFuZCBXZWIgcHJvY2VzcyBzaWRlIG9mIHRoaW5n
cy4KKworICAgICAgICAqIFNoYXJlZC9tYWMvUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUuaDogUmVu
YW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5
ZXJCYWNraW5nU3RvcmUuaC4KKyAgICAgICAgKiBTaGFyZWQvbWFjL1JlbW90ZUxheWVyQmFja2lu
Z1N0b3JlLm1tOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdl
L21hYy9SZW1vdGVMYXllckJhY2tpbmdTdG9yZS5tbS4KKyAgICAgICAgKiBXZWJLaXQyLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2o6CisKKzIwMTMtMTEtMDEgIFRpbSBIb3J0b24gIDx0aW1vdGh5
X2hvcnRvbkBhcHBsZS5jb20+CisKICAgICAgICAgUmVtb3RlIExheWVyIFRyZWU6IFZlbmQgbGF5
ZXIgY29udGVudHMgdmlhIElPU3VyZmFjZXMKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTEyMzYwMAogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9T
aGFyZWQvbWFjL1JlbW90ZUxheWVyQmFja2luZ1N0b3JlLmggYi9Tb3VyY2UvV2ViS2l0Mi9TaGFy
ZWQvbWFjL1JlbW90ZUxheWVyQmFja2luZ1N0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uNWJlMjAwZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQyL1No
YXJlZC9tYWMvUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUuaApAQCAtMCwwICsxLDg2IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5k
ZWYgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmVfaAorI2RlZmluZSBSZW1vdGVMYXllckJhY2tpbmdT
dG9yZV9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJT
aGFyZWFibGVCaXRtYXAuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0Zsb2F0UmVjdC5oPgorI2luY2x1
ZGUgPFdlYkNvcmUvUmVnaW9uLmg+CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU7CisKK2NsYXNzIFJlbW90ZUxheWVyQmFja2luZ1N0b3JlIHsKK3B1
YmxpYzoKKyAgICBSZW1vdGVMYXllckJhY2tpbmdTdG9yZSgpOworCisgICAgdm9pZCBlbnN1cmVC
YWNraW5nU3RvcmUoUGxhdGZvcm1DQUxheWVyUmVtb3RlKiwgV2ViQ29yZTo6SW50U2l6ZSwgZmxv
YXQgc2NhbGUsIGJvb2wgYWNjZWxlcmF0ZXNEcmF3aW5nKTsKKworICAgIHZvaWQgc2V0TmVlZHNE
aXNwbGF5KGNvbnN0IFdlYkNvcmU6OkludFJlY3QpOworICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5
KCk7CisKKyAgICBib29sIGRpc3BsYXkoKTsKKworICAgIFJldGFpblB0cjxDR0ltYWdlUmVmPiBp
bWFnZSgpIGNvbnN0OworICAgIFJldGFpblB0cjxJT1N1cmZhY2VSZWY+IHN1cmZhY2UoKSBjb25z
dCB7IHJldHVybiBtX2Zyb250U3VyZmFjZTsgfQorICAgIFdlYkNvcmU6OkludFNpemUgc2l6ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQorICAgIGZsb2F0IHNjYWxlKCkgY29uc3QgeyByZXR1
cm4gbV9zY2FsZTsgfQorICAgIGJvb2wgYWNjZWxlcmF0ZXNEcmF3aW5nKCkgY29uc3QgeyByZXR1
cm4gbV9hY2NlbGVyYXRlc0RyYXdpbmc7IH0KKworICAgIFBsYXRmb3JtQ0FMYXllclJlbW90ZSog
bGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2xheWVyOyB9CisKKyAgICB2b2lkIGVuY29kZShDb3Jl
SVBDOjpBcmd1bWVudEVuY29kZXImKSBjb25zdDsKKyAgICBzdGF0aWMgYm9vbCBkZWNvZGUoQ29y
ZUlQQzo6QXJndW1lbnREZWNvZGVyJiwgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUmKTsKKworcHJp
dmF0ZToKKyAgICBXZWJDb3JlOjpJbnRSZWN0IG1hcFRvQ29udGVudENvb3JkaW5hdGVzKGNvbnN0
IFdlYkNvcmU6OkludFJlY3QpIGNvbnN0OworCisgICAgYm9vbCBoYXNGcm9udEJ1ZmZlcigpIHsg
cmV0dXJuIG1fYWNjZWxlcmF0ZXNEcmF3aW5nID8gISFtX2Zyb250U3VyZmFjZSA6ICEhbV9mcm9u
dEJ1ZmZlcjsgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dD4gY3JlYXRlQmFja2luZ1N0b3JlKCk7CisgICAgdm9pZCBkcmF3SW5Db250ZXh0KFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dCYpOworCisgICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlKiBtX2xheWVy
OworCisgICAgV2ViQ29yZTo6SW50U2l6ZSBtX3NpemU7CisgICAgZmxvYXQgbV9zY2FsZTsKKwor
ICAgIFdlYkNvcmU6OlJlZ2lvbiBtX2RpcnR5UmVnaW9uOworCisgICAgUmVmUHRyPFNoYXJlYWJs
ZUJpdG1hcD4gbV9mcm9udEJ1ZmZlcjsKKyAgICBSZXRhaW5QdHI8SU9TdXJmYWNlUmVmPiBtX2Zy
b250U3VyZmFjZTsKKworICAgIGJvb2wgbV9hY2NlbGVyYXRlc0RyYXdpbmc7Cit9OworCit9IC8v
IG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKworI2VuZGlmIC8vIFJlbW90ZUxheWVyQmFja2luZ1N0b3JlX2gKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQyL1NoYXJlZC9tYWMvUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUubW0gYi9Tb3Vy
Y2UvV2ViS2l0Mi9TaGFyZWQvbWFjL1JlbW90ZUxheWVyQmFja2luZ1N0b3JlLm1tCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MzA2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViS2l0Mi9TaGFyZWQvbWFjL1JlbW90ZUxheWVyQmFja2luZ1N0b3JlLm1tCkBAIC0w
LDAgKzEsMzA2IEBACisgLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
Q09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQgIlJlbW90ZUxheWVyQmFj
a2luZ1N0b3JlLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbXBv
cnQgIkFyZ3VtZW50Q29kZXJzLmgiCisjaW1wb3J0ICJNYWNoUG9ydC5oIgorI2ltcG9ydCAiUGxh
dGZvcm1DQUxheWVyUmVtb3RlLmgiCisjaW1wb3J0ICJTaGFyZWFibGVCaXRtYXAuaCIKKyNpbXBv
cnQgIldlYkNvcmVBcmd1bWVudENvZGVycy5oIgorI2ltcG9ydCA8V2ViQ29yZS9HcmFwaGljc0Nv
bnRleHRDRy5oPgorI2ltcG9ydCA8V2ViQ29yZS9XZWJMYXllci5oPgorCisjaWZkZWYgX19oYXNf
aW5jbHVkZQorI2lmIF9faGFzX2luY2x1ZGUoPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRp
b25TZXJ2aWNlc1ByaXYuaD4pCisjaW1wb3J0IDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0
aW9uU2VydmljZXNQcml2Lmg+CisjZW5kaWYKKyNlbmRpZgorCitleHRlcm4gIkMiIHsKK0NHQ29u
dGV4dFJlZiBDR0lPU3VyZmFjZUNvbnRleHRDcmVhdGUoSU9TdXJmYWNlUmVmLCBzaXplX3QsIHNp
emVfdCwgc2l6ZV90LCBzaXplX3QsIENHQ29sb3JTcGFjZVJlZiwgQ0dCaXRtYXBJbmZvKTsKK0NH
SW1hZ2VSZWYgQ0dJT1N1cmZhY2VDb250ZXh0Q3JlYXRlSW1hZ2UoQ0dDb250ZXh0UmVmKTsKK30K
KwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Cit1c2luZyBuYW1lc3BhY2UgV2ViS2l0OworCitS
ZW1vdGVMYXllckJhY2tpbmdTdG9yZTo6UmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUoKQorICAgIDog
bV9sYXllcihudWxscHRyKQoreworfQorCit2b2lkIFJlbW90ZUxheWVyQmFja2luZ1N0b3JlOjpl
bnN1cmVCYWNraW5nU3RvcmUoUGxhdGZvcm1DQUxheWVyUmVtb3RlKiBsYXllciwgSW50U2l6ZSBz
aXplLCBmbG9hdCBzY2FsZSwgYm9vbCBhY2NlbGVyYXRlc0RyYXdpbmcpCit7CisgICAgaWYgKG1f
bGF5ZXIgPT0gbGF5ZXIgJiYgbV9zaXplID09IHNpemUgJiYgbV9zY2FsZSA9PSBzY2FsZSAmJiBt
X2FjY2VsZXJhdGVzRHJhd2luZyA9PSBhY2NlbGVyYXRlc0RyYXdpbmcpCisgICAgICAgIHJldHVy
bjsKKworICAgIG1fbGF5ZXIgPSBsYXllcjsKKyAgICBtX3NpemUgPSBzaXplOworICAgIG1fc2Nh
bGUgPSBzY2FsZTsKKyAgICBtX2FjY2VsZXJhdGVzRHJhd2luZyA9IGFjY2VsZXJhdGVzRHJhd2lu
ZzsKKworICAgIG1fZnJvbnRTdXJmYWNlID0gbnVsbHB0cjsKKyAgICBtX2Zyb250QnVmZmVyID0g
bnVsbHB0cjsKK30KKwordm9pZCBSZW1vdGVMYXllckJhY2tpbmdTdG9yZTo6ZW5jb2RlKENvcmVJ
UEM6OkFyZ3VtZW50RW5jb2RlciYgZW5jb2RlcikgY29uc3QKK3sKKyAgICBlbmNvZGVyIDw8IG1f
c2l6ZTsKKyAgICBlbmNvZGVyIDw8IG1fc2NhbGU7CisgICAgZW5jb2RlciA8PCBtX2FjY2VsZXJh
dGVzRHJhd2luZzsKKworICAgIGlmIChtX2FjY2VsZXJhdGVzRHJhd2luZykgeworICAgICAgICBt
YWNoX3BvcnRfdCBwb3J0ID0gSU9TdXJmYWNlQ3JlYXRlTWFjaFBvcnQobV9mcm9udFN1cmZhY2Uu
Z2V0KCkpOworICAgICAgICBlbmNvZGVyIDw8IENvcmVJUEM6Ok1hY2hQb3J0KHBvcnQsIE1BQ0hf
TVNHX1RZUEVfTU9WRV9TRU5EKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTaGFyZWFibGVCaXRt
YXA6OkhhbmRsZSBoYW5kbGU7CisgICAgICAgIG1fZnJvbnRCdWZmZXItPmNyZWF0ZUhhbmRsZSho
YW5kbGUpOworICAgICAgICBlbmNvZGVyIDw8IGhhbmRsZTsKKyAgICB9Cit9CisKK2Jvb2wgUmVt
b3RlTGF5ZXJCYWNraW5nU3RvcmU6OmRlY29kZShDb3JlSVBDOjpBcmd1bWVudERlY29kZXImIGRl
Y29kZXIsIFJlbW90ZUxheWVyQmFja2luZ1N0b3JlJiByZXN1bHQpCit7CisgICAgaWYgKCFkZWNv
ZGVyLmRlY29kZShyZXN1bHQubV9zaXplKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
aWYgKCFkZWNvZGVyLmRlY29kZShyZXN1bHQubV9zY2FsZSkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmICghZGVjb2Rlci5kZWNvZGUocmVzdWx0Lm1fYWNjZWxlcmF0ZXNEcmF3aW5n
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHJlc3VsdC5tX2FjY2VsZXJhdGVz
RHJhd2luZykgeworICAgICAgICBDb3JlSVBDOjpNYWNoUG9ydCBtYWNoUG9ydDsKKyAgICAgICAg
aWYgKCFkZWNvZGVyLmRlY29kZShtYWNoUG9ydCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIHJlc3VsdC5tX2Zyb250U3VyZmFjZSA9IGFkb3B0Q0YoSU9TdXJmYWNlTG9va3Vw
RnJvbU1hY2hQb3J0KG1hY2hQb3J0LnBvcnQoKSkpOworICAgICAgICBtYWNoX3BvcnRfZGVhbGxv
Y2F0ZShtYWNoX3Rhc2tfc2VsZigpLCBtYWNoUG9ydC5wb3J0KCkpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIFNoYXJlYWJsZUJpdG1hcDo6SGFuZGxlIGhhbmRsZTsKKyAgICAgICAgaWYgKCFkZWNv
ZGVyLmRlY29kZShoYW5kbGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBy
ZXN1bHQubV9mcm9udEJ1ZmZlciA9IFNoYXJlYWJsZUJpdG1hcDo6Y3JlYXRlKGhhbmRsZSk7Cisg
ICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK0ludFJlY3QgUmVtb3RlTGF5ZXJCYWNraW5n
U3RvcmU6Om1hcFRvQ29udGVudENvb3JkaW5hdGVzKGNvbnN0IEludFJlY3QgcmVjdCkgY29uc3QK
K3sKKyAgICBJbnRSZWN0IGZsaXBwZWRSZWN0ID0gcmVjdDsKKyAgICBpZiAobV9sYXllci0+b3du
ZXIoKS0+cGxhdGZvcm1DQUxheWVyQ29udGVudHNPcmllbnRhdGlvbigpID09IEdyYXBoaWNzTGF5
ZXI6OkNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNCb3R0b21VcCkKKyAgICAgICAgZmxpcHBlZFJlY3Qu
c2V0WShtX3NpemUuaGVpZ2h0KCkgLSByZWN0LnkoKSAtIHJlY3QuaGVpZ2h0KCkpOworICAgIHJl
dHVybiBmbGlwcGVkUmVjdDsKK30KKwordm9pZCBSZW1vdGVMYXllckJhY2tpbmdTdG9yZTo6c2V0
TmVlZHNEaXNwbGF5KGNvbnN0IEludFJlY3QgcmVjdCkKK3sKKyAgICBJbnRSZWN0IGZsaXBwZWRS
ZWN0ID0gbWFwVG9Db250ZW50Q29vcmRpbmF0ZXMocmVjdCk7CisgICAgbV9kaXJ0eVJlZ2lvbi51
bml0ZShmbGlwcGVkUmVjdCk7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU6OnNl
dE5lZWRzRGlzcGxheSgpCit7CisgICAgc2V0TmVlZHNEaXNwbGF5KEludFJlY3QoSW50UG9pbnQo
KSwgbV9zaXplKSk7Cit9CisKK3N0YXRpYyBSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPiBjcmVhdGVJ
T1N1cmZhY2VDb250ZXh0KElPU3VyZmFjZVJlZiBzdXJmYWNlLCBJbnRTaXplIHNpemUsIENHQ29s
b3JTcGFjZVJlZiBjb2xvclNwYWNlKQoreworICAgIGlmICghc3VyZmFjZSkKKyAgICAgICAgcmV0
dXJuIG51bGxwdHI7CisKKyAgICBDR0JpdG1hcEluZm8gYml0bWFwSW5mbyA9IGtDR0ltYWdlQWxw
aGFQcmVtdWx0aXBsaWVkRmlyc3QgfCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkhvc3Q7CisgICAgc2l6
ZV90IGJpdHNQZXJDb21wb25lbnQgPSA4OworICAgIHNpemVfdCBiaXRzUGVyUGl4ZWwgPSAzMjsK
KyAgICByZXR1cm4gYWRvcHRDRihDR0lPU3VyZmFjZUNvbnRleHRDcmVhdGUoc3VyZmFjZSwgc2l6
ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpLCBiaXRzUGVyQ29tcG9uZW50LCBiaXRzUGVyUGl4ZWws
IGNvbG9yU3BhY2UsIGJpdG1hcEluZm8pKTsKK30KKworc3RhdGljIFJldGFpblB0cjxJT1N1cmZh
Y2VSZWY+IGNyZWF0ZUlPU3VyZmFjZShJbnRTaXplIHNpemUpCit7CisgICAgdW5zaWduZWQgcGl4
ZWxGb3JtYXQgPSAnQkdSQSc7CisgICAgdW5zaWduZWQgYnl0ZXNQZXJFbGVtZW50ID0gNDsKKyAg
ICBpbnQgd2lkdGggPSBzaXplLndpZHRoKCk7CisgICAgaW50IGhlaWdodCA9IHNpemUuaGVpZ2h0
KCk7CisKKyAgICB1bnNpZ25lZCBsb25nIGJ5dGVzUGVyUm93ID0gSU9TdXJmYWNlQWxpZ25Qcm9w
ZXJ0eShrSU9TdXJmYWNlQnl0ZXNQZXJSb3csIHdpZHRoICogYnl0ZXNQZXJFbGVtZW50KTsKKyAg
ICBBU1NFUlQoYnl0ZXNQZXJSb3cpOworCisgICAgdW5zaWduZWQgbG9uZyBhbGxvY1NpemUgPSBJ
T1N1cmZhY2VBbGlnblByb3BlcnR5KGtJT1N1cmZhY2VBbGxvY1NpemUsIGhlaWdodCAqIGJ5dGVz
UGVyUm93KTsKKyAgICBBU1NFUlQoYWxsb2NTaXplKTsKKworICAgIE5TRGljdGlvbmFyeSAqZGlj
dCA9IEB7CisgICAgICAgIChpZClrSU9TdXJmYWNlV2lkdGg6IEAod2lkdGgpLAorICAgICAgICAo
aWQpa0lPU3VyZmFjZUhlaWdodDogQChoZWlnaHQpLAorICAgICAgICAoaWQpa0lPU3VyZmFjZVBp
eGVsRm9ybWF0OiBAKHBpeGVsRm9ybWF0KSwKKyAgICAgICAgKGlkKWtJT1N1cmZhY2VCeXRlc1Bl
ckVsZW1lbnQ6IEAoYnl0ZXNQZXJFbGVtZW50KSwKKyAgICAgICAgKGlkKWtJT1N1cmZhY2VCeXRl
c1BlclJvdzogQChieXRlc1BlclJvdyksCisgICAgICAgIChpZClrSU9TdXJmYWNlQWxsb2NTaXpl
OiBAKGFsbG9jU2l6ZSkKKyAgICB9OworCisgICAgcmV0dXJuIGFkb3B0Q0YoSU9TdXJmYWNlQ3Jl
YXRlKChDRkRpY3Rpb25hcnlSZWYpZGljdCkpOworfQorCitSZXRhaW5QdHI8Q0dJbWFnZVJlZj4g
UmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU6OmltYWdlKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fZnJv
bnRCdWZmZXIgfHwgbV9hY2NlbGVyYXRlc0RyYXdpbmcpCisgICAgICAgIHJldHVybiBudWxscHRy
OworCisgICAgLy8gRklYTUU6IERvIHdlIG5lZWQgQ29weT8KKyAgICByZXR1cm4gbV9mcm9udEJ1
ZmZlci0+bWFrZUNHSW1hZ2VDb3B5KCk7Cit9CisKK2Jvb2wgUmVtb3RlTGF5ZXJCYWNraW5nU3Rv
cmU6OmRpc3BsYXkoKQoreworICAgIGlmICghbV9sYXllcikKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgLy8gSWYgd2UgcHJldmlvdXNseSB3ZXJlIGRyYXdzQ29udGVudD1ZRVMsIGFuZCBu
b3cgYXJlIG5vdCwgd2UgbmVlZAorICAgIC8vIHRvIG5vdGUgdGhhdCBvdXIgYmFja2luZyBzdG9y
ZSBoYXMgYmVlbiBjbGVhcmVkLgorICAgIGlmICghbV9sYXllci0+b3duZXIoKSB8fCAhbV9sYXll
ci0+b3duZXIoKS0+cGxhdGZvcm1DQUxheWVyRHJhd3NDb250ZW50KCkpIHsKKyAgICAgICAgYm9v
bCBwcmV2aW91c2x5RHJld0NvbnRlbnRzID0gaGFzRnJvbnRCdWZmZXIoKTsKKworICAgICAgICBt
X2Zyb250QnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgbV9mcm9udFN1cmZhY2UgPSBudWxscHRy
OworCisgICAgICAgIHJldHVybiBwcmV2aW91c2x5RHJld0NvbnRlbnRzOworICAgIH0KKworICAg
IGlmICghaGFzRnJvbnRCdWZmZXIoKSkKKyAgICAgICAgbV9kaXJ0eVJlZ2lvbi51bml0ZShJbnRS
ZWN0KEludFBvaW50KCksIG1fc2l6ZSkpOworCisgICAgaWYgKG1fZGlydHlSZWdpb24uaXNFbXB0
eSgpIHx8IG1fc2l6ZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlm
IChtX2xheWVyLT5vd25lcigpLT5wbGF0Zm9ybUNBTGF5ZXJTaG93UmVwYWludENvdW50ZXIobV9s
YXllcikpIHsKKyAgICAgICAgSW50UmVjdCBpbmRpY2F0b3JSZWN0ID0gbWFwVG9Db250ZW50Q29v
cmRpbmF0ZXMoSW50UmVjdCgwLCAwLCA1MiwgMjcpKTsKKyAgICAgICAgbV9kaXJ0eVJlZ2lvbi51
bml0ZShpbmRpY2F0b3JSZWN0KTsKKyAgICB9CisKKyAgICBGbG9hdFNpemUgc2NhbGVkU2l6ZSA9
IG1fc2l6ZTsKKyAgICBzY2FsZWRTaXplLnNjYWxlKG1fc2NhbGUpOworICAgIEludFNpemUgZXhw
YW5kZWRTY2FsZWRTaXplID0gZXhwYW5kZWRJbnRTaXplKHNjYWxlZFNpemUpOworCisgICAgc3Rk
Ojp1bmlxdWVfcHRyPEdyYXBoaWNzQ29udGV4dD4gY29udGV4dDsKKyAgICBSZWZQdHI8U2hhcmVh
YmxlQml0bWFwPiBiYWNrQnVmZmVyOworICAgIFJldGFpblB0cjxJT1N1cmZhY2VSZWY+IGJhY2tT
dXJmYWNlOworCisgICAgaWYgKG1fYWNjZWxlcmF0ZXNEcmF3aW5nKSB7CisgICAgICAgIGJhY2tT
dXJmYWNlID0gY3JlYXRlSU9TdXJmYWNlKGV4cGFuZGVkU2NhbGVkU2l6ZSk7CisgICAgICAgIFJl
dGFpblB0cjxDR0NvbnRleHRSZWY+IGNnQ29udGV4dCA9IGNyZWF0ZUlPU3VyZmFjZUNvbnRleHQo
YmFja1N1cmZhY2UuZ2V0KCksIGV4cGFuZGVkU2NhbGVkU2l6ZSwgc1JHQkNvbG9yU3BhY2VSZWYo
KSk7CisgICAgICAgIGNvbnRleHQgPSBzdGQ6Om1ha2VfdW5pcXVlPEdyYXBoaWNzQ29udGV4dD4o
Y2dDb250ZXh0LmdldCgpKTsKKyAgICAgICAgQ0dDb250ZXh0Q2xlYXJSZWN0KGNnQ29udGV4dC5n
ZXQoKSwgQ0dSZWN0TWFrZSgwLCAwLCBleHBhbmRlZFNjYWxlZFNpemUud2lkdGgoKSwgZXhwYW5k
ZWRTY2FsZWRTaXplLmhlaWdodCgpKSk7CisgICAgICAgIGNvbnRleHQtPnNjYWxlKEZsb2F0U2l6
ZSgxLCAtMSkpOworICAgICAgICBjb250ZXh0LT50cmFuc2xhdGUoMCwgLWV4cGFuZGVkU2NhbGVk
U2l6ZS5oZWlnaHQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmFja0J1ZmZlciA9IFNoYXJl
YWJsZUJpdG1hcDo6Y3JlYXRlU2hhcmVhYmxlKGV4cGFuZGVkSW50U2l6ZShzY2FsZWRTaXplKSwg
U2hhcmVhYmxlQml0bWFwOjpTdXBwb3J0c0FscGhhKTsKKyAgICAgICAgY29udGV4dCA9IGJhY2tC
dWZmZXItPmNyZWF0ZUdyYXBoaWNzQ29udGV4dCgpOworICAgIH0KKworICAgIGRyYXdJbkNvbnRl
eHQoKmNvbnRleHQpOworCisgICAgaWYgKG1fYWNjZWxlcmF0ZXNEcmF3aW5nKQorICAgICAgICBt
X2Zyb250U3VyZmFjZSA9IGJhY2tTdXJmYWNlOworICAgIGVsc2UKKyAgICAgICAgbV9mcm9udEJ1
ZmZlciA9IGJhY2tCdWZmZXI7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZW1vdGVM
YXllckJhY2tpbmdTdG9yZTo6ZHJhd0luQ29udGV4dChHcmFwaGljc0NvbnRleHQmIGNvbnRleHQp
Cit7CisgICAgUmV0YWluUHRyPENHSW1hZ2VSZWY+IGZyb250SW1hZ2U7CisgICAgUmV0YWluUHRy
PENHQ29udGV4dFJlZj4gZnJvbnRDb250ZXh0OworCisgICAgaWYgKG1fYWNjZWxlcmF0ZXNEcmF3
aW5nKSB7CisgICAgICAgIGZyb250Q29udGV4dCA9IGNyZWF0ZUlPU3VyZmFjZUNvbnRleHQobV9m
cm9udFN1cmZhY2UuZ2V0KCksIGV4cGFuZGVkSW50U2l6ZShtX3NpemUgKiBtX3NjYWxlKSwgc1JH
QkNvbG9yU3BhY2VSZWYoKSk7CisgICAgICAgIGZyb250SW1hZ2UgPSBhZG9wdENGKENHSU9TdXJm
YWNlQ29udGV4dENyZWF0ZUltYWdlKGZyb250Q29udGV4dC5nZXQoKSkpOworICAgIH0gZWxzZQor
ICAgICAgICBmcm9udEltYWdlID0gaW1hZ2UoKTsKKworICAgIFZlY3RvcjxJbnRSZWN0PiBkaXJ0
eVJlY3RzID0gbV9kaXJ0eVJlZ2lvbi5yZWN0cygpOworCisgICAgLy8gSWYgd2UgaGF2ZSBsZXNz
IHRoYW4gd2ViTGF5ZXJNYXhSZWN0c1RvUGFpbnQgcmVjdHMgdG8gcGFpbnQgYW5kIHRoZXkgY292
ZXIgbGVzcworICAgIC8vIHRoYW4gd2ViTGF5ZXJXYXN0ZWRTcGFjZVRocmVzaG9sZCBvZiB0aGUg
YXJlYSwgd2UnbGwgZG8gYSBwYXJ0aWFsIHJlcGFpbnQuCisKKyAgICBWZWN0b3I8RmxvYXRSZWN0
LCB3ZWJMYXllck1heFJlY3RzVG9QYWludD4gcmVjdHNUb1BhaW50OworICAgIGlmIChkaXJ0eVJl
Y3RzLnNpemUoKSA8PSB3ZWJMYXllck1heFJlY3RzVG9QYWludCAmJiBtX2RpcnR5UmVnaW9uLnRv
dGFsQXJlYSgpIDw9IHdlYkxheWVyV2FzdGVkU3BhY2VUaHJlc2hvbGQgKiBtX3NpemUud2lkdGgo
KSAqIG1fc2l6ZS5oZWlnaHQoKSkgeworICAgICAgICAvLyBDb3B5IG92ZXIgdGhlIHBhcnRzIG9m
IHRoZSBmcm9udCBidWZmZXIgdGhhdCB3ZSdyZSBub3QgZ29pbmcgdG8gcmVwYWludC4KKyAgICAg
ICAgaWYgKGZyb250SW1hZ2UpIHsKKyAgICAgICAgICAgIFJlZ2lvbiBjbGVhblJlZ2lvbihJbnRS
ZWN0KEludFBvaW50KCksIG1fc2l6ZSkpOworICAgICAgICAgICAgY2xlYW5SZWdpb24uc3VidHJh
Y3QobV9kaXJ0eVJlZ2lvbik7CisKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcmVjdCA6
IGNsZWFuUmVnaW9uLnJlY3RzKCkpIHsKKyAgICAgICAgICAgICAgICBGbG9hdFJlY3Qgc2NhbGVk
UmVjdCA9IHJlY3Q7CisgICAgICAgICAgICAgICAgc2NhbGVkUmVjdC5zY2FsZShtX3NjYWxlKTsK
KyAgICAgICAgICAgICAgICBGbG9hdFNpemUgaW1hZ2VTaXplKENHSW1hZ2VHZXRXaWR0aChmcm9u
dEltYWdlLmdldCgpKSwgQ0dJbWFnZUdldEhlaWdodChmcm9udEltYWdlLmdldCgpKSk7CisgICAg
ICAgICAgICAgICAgY29udGV4dC5kcmF3TmF0aXZlSW1hZ2UoZnJvbnRJbWFnZS5nZXQoKSwgaW1h
Z2VTaXplLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBzY2FsZWRSZWN0LCBzY2FsZWRSZWN0KTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcmVjdCA6
IGRpcnR5UmVjdHMpCisgICAgICAgICAgICByZWN0c1RvUGFpbnQuYXBwZW5kKHJlY3QpOworICAg
IH0KKworICAgIGNvbnRleHQuc2NhbGUoRmxvYXRTaXplKG1fc2NhbGUsIG1fc2NhbGUpKTsKKwor
ICAgIHN3aXRjaCAobV9sYXllci0+bGF5ZXJUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBQbGF0Zm9y
bUNBTGF5ZXI6OkxheWVyVHlwZVNpbXBsZUxheWVyOgorICAgICAgICBjYXNlIFBsYXRmb3JtQ0FM
YXllcjo6TGF5ZXJUeXBlVGlsZWRCYWNraW5nVGlsZUxheWVyOgorICAgICAgICAgICAgaWYgKHJl
Y3RzVG9QYWludC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmVjdHNUb1BhaW50LmFwcGVu
ZChJbnRSZWN0KEludFBvaW50KCksIG1fc2l6ZSkpOworICAgICAgICAgICAgZm9yIChjb25zdCBh
dXRvJiByZWN0IDogcmVjdHNUb1BhaW50KQorICAgICAgICAgICAgICAgIG1fbGF5ZXItPm93bmVy
KCktPnBsYXRmb3JtQ0FMYXllclBhaW50Q29udGVudHMobV9sYXllciwgY29udGV4dCwgZW5jbG9z
aW5nSW50UmVjdChyZWN0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0
Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZVdlYkxheWVyOgorICAgICAgICAgICAgZHJhd0xheWVyQ29u
dGVudHMoY29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKSwgbV9sYXllciwgcmVjdHNUb1BhaW50KTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJU
eXBlTGF5ZXI6CisgICAgICAgIGNhc2UgUGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGVUcmFuc2Zv
cm1MYXllcjoKKyAgICAgICAgY2FzZSBQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZVdlYlRpbGVk
TGF5ZXI6CisgICAgICAgIGNhc2UgUGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGVUaWxlZEJhY2tp
bmdMYXllcjoKKyAgICAgICAgY2FzZSBQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZVBhZ2VUaWxl
ZEJhY2tpbmdMYXllcjoKKyAgICAgICAgY2FzZSBQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZVJv
b3RMYXllcjoKKyAgICAgICAgY2FzZSBQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZUFWUGxheWVy
TGF5ZXI6CisgICAgICAgIGNhc2UgUGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGVDdXN0b206Cisg
ICAgICAgICAgICBicmVhazsKKyAgICB9OworCisgICAgbV9kaXJ0eVJlZ2lvbiA9IFJlZ2lvbigp
OworCisgICAgQ0dDb250ZXh0Rmx1c2goY29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKSk7CisKKyAg
ICAvLyBJZiBvdXIgZnJvbnRJbWFnZSBpcyBkZXJpdmVkIGZyb20gYW4gSU9TdXJmYWNlLCB3ZSBu
ZWVkIHRvCisgICAgLy8gZGVzdHJveSB0aGUgaW1hZ2UgYmVmb3JlIHRoZSBDR0NvbnRleHQgaXQn
cyBkZXJpdmVkIGZyb20sCisgICAgLy8gc28gdGhhdCB0aGUgY29udGV4dCBkb2Vzbid0IG1ha2Ug
YSBDUFUgY29weSBvZiB0aGUgc3VyZmFjZSBkYXRhLgorICAgIGZyb250SW1hZ2UgPSBudWxscHRy
OworICAgIGZyb250Q29udGV4dCA9IG51bGxwdHI7Cit9CisKKyNlbmRpZiAvLyBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9Tb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oKaW5kZXggODc1NzJhYS4uMzY1NDQwNiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdDIvV2ViS2l0Mi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCisrKyBiL1NvdXJj
ZS9XZWJLaXQyL1dlYktpdDIueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtNDU5NCw2ICs0
NTk0LDggQEAKIAkJCQlCQ0Y1MDVFNTEyNDMwNDdCMDA1OTU1QUUgLyogUGxhdGZvcm1DZXJ0aWZp
Y2F0ZUluZm8uaCAqLywKIAkJCQlCQ0Y1MDVFNjEyNDMwNDdCMDA1OTU1QUUgLyogUGxhdGZvcm1D
ZXJ0aWZpY2F0ZUluZm8ubW0gKi8sCiAJCQkJRTFDQzFCOEYxMkQ3RUFERjAwNjI1ODM4IC8qIFBy
aW50SW5mb01hYy5tbSAqLywKKwkJCQkyRDQ3QjU2QTE4MTA3MTRFMDAzQTNBRUUgLyogUmVtb3Rl
TGF5ZXJCYWNraW5nU3RvcmUubW0gKi8sCisJCQkJMkQ0N0I1NkIxODEwNzE0RTAwM0EzQUVFIC8q
IFJlbW90ZUxheWVyQmFja2luZ1N0b3JlLmggKi8sCiAJCQkJMUFGMUFDNkExNjUxNzU5RTAwQzE3
RDdGIC8qIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uLmggKi8sCiAJCQkJMUFGMUFDNjkxNjUx
NzU5RTAwQzE3RDdGIC8qIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uLm1tICovLAogCQkJCTFB
QUI0QUE5MTI5NkYxNTQwMDIzOTUyRiAvKiBTYW5kYm94RXh0ZW5zaW9uTWFjLm1tICovLApAQCAt
NDkzNCw4ICs0OTM2LDYgQEAKIAkJCQkyREEwNDlCMjE4MENDQ0QzMDBBQUZBOUUgLyogUGxhdGZv
cm1DQUxheWVyUmVtb3RlLmggKi8sCiAJCQkJMkQ4OTQ5RUUxODIwNDRGNjAwRTg5OEFBIC8qIFBs
YXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5jcHAgKi8sCiAJCQkJMkQ4OTQ5RUYxODIw
NDRGNjAwRTg5OEFBIC8qIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5oICovLAot
CQkJCTJENDdCNTZBMTgxMDcxNEUwMDNBM0FFRSAvKiBSZW1vdGVMYXllckJhY2tpbmdTdG9yZS5t
bSAqLywKLQkJCQkyRDQ3QjU2QjE4MTA3MTRFMDAzQTNBRUUgLyogUmVtb3RlTGF5ZXJCYWNraW5n
U3RvcmUuaCAqLywKIAkJCQkxQUIxNkFFODE2NEIzQTg4MDAyOTBENjIgLyogUmVtb3RlTGF5ZXJU
cmVlQ29udGV4dC5oICovLAogCQkJCTFBQjE2QUU3MTY0QjNBODgwMDI5MEQ2MiAvKiBSZW1vdGVM
YXllclRyZWVDb250ZXh0Lm1tICovLAogCQkJCTFBQjE2QURDMTY0ODU5ODQwMDI5MEQ2MiAvKiBS
ZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5oICovLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dDIvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXllckJhY2tpbmdTdG9yZS5oIGIvU291
cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXllckJhY2tpbmdTdG9y
ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmUyMDBlLi4wMDAwMDAwCi0tLSBh
L1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJCYWNraW5n
U3RvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0g
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBSZW1vdGVMYXll
ckJhY2tpbmdTdG9yZV9oCi0jZGVmaW5lIFJlbW90ZUxheWVyQmFja2luZ1N0b3JlX2gKLQotI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKLQotI2luY2x1ZGUgIlNoYXJlYWJsZUJpdG1h
cC5oIgotI2luY2x1ZGUgPFdlYkNvcmUvRmxvYXRSZWN0Lmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9S
ZWdpb24uaD4KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFBsYXRmb3JtQ0FMYXllclJl
bW90ZTsKLQotY2xhc3MgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUgewotcHVibGljOgotICAgIFJl
bW90ZUxheWVyQmFja2luZ1N0b3JlKCk7Ci0KLSAgICB2b2lkIGVuc3VyZUJhY2tpbmdTdG9yZShQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGUqLCBXZWJDb3JlOjpJbnRTaXplLCBmbG9hdCBzY2FsZSwgYm9v
bCBhY2NlbGVyYXRlc0RyYXdpbmcpOwotCi0gICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoY29uc3Qg
V2ViQ29yZTo6SW50UmVjdCk7Ci0gICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsKLQotICAgIGJv
b2wgZGlzcGxheSgpOwotCi0gICAgUmV0YWluUHRyPENHSW1hZ2VSZWY+IGltYWdlKCkgY29uc3Q7
Ci0gICAgUmV0YWluUHRyPElPU3VyZmFjZVJlZj4gc3VyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1f
ZnJvbnRTdXJmYWNlOyB9Ci0gICAgV2ViQ29yZTo6SW50U2l6ZSBzaXplKCkgY29uc3QgeyByZXR1
cm4gbV9zaXplOyB9Ci0gICAgZmxvYXQgc2NhbGUoKSBjb25zdCB7IHJldHVybiBtX3NjYWxlOyB9
Ci0gICAgYm9vbCBhY2NlbGVyYXRlc0RyYXdpbmcoKSBjb25zdCB7IHJldHVybiBtX2FjY2VsZXJh
dGVzRHJhd2luZzsgfQotCi0gICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlKiBsYXllcigpIGNvbnN0
IHsgcmV0dXJuIG1fbGF5ZXI7IH0KLQotICAgIHZvaWQgZW5jb2RlKENvcmVJUEM6OkFyZ3VtZW50
RW5jb2RlciYpIGNvbnN0OwotICAgIHN0YXRpYyBib29sIGRlY29kZShDb3JlSVBDOjpBcmd1bWVu
dERlY29kZXImLCBSZW1vdGVMYXllckJhY2tpbmdTdG9yZSYpOwotCi1wcml2YXRlOgotICAgIFdl
YkNvcmU6OkludFJlY3QgbWFwVG9Db250ZW50Q29vcmRpbmF0ZXMoY29uc3QgV2ViQ29yZTo6SW50
UmVjdCkgY29uc3Q7Ci0KLSAgICBib29sIGhhc0Zyb250QnVmZmVyKCkgeyByZXR1cm4gbV9hY2Nl
bGVyYXRlc0RyYXdpbmcgPyAhIW1fZnJvbnRTdXJmYWNlIDogISFtX2Zyb250QnVmZmVyOyB9Ci0K
LSAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0PiBjcmVhdGVCYWNr
aW5nU3RvcmUoKTsKLSAgICB2b2lkIGRyYXdJbkNvbnRleHQoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0Jik7Ci0KLSAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUqIG1fbGF5ZXI7Ci0KLSAgICBXZWJD
b3JlOjpJbnRTaXplIG1fc2l6ZTsKLSAgICBmbG9hdCBtX3NjYWxlOwotCi0gICAgV2ViQ29yZTo6
UmVnaW9uIG1fZGlydHlSZWdpb247Ci0KLSAgICBSZWZQdHI8U2hhcmVhYmxlQml0bWFwPiBtX2Zy
b250QnVmZmVyOwotICAgIFJldGFpblB0cjxJT1N1cmZhY2VSZWY+IG1fZnJvbnRTdXJmYWNlOwot
Ci0gICAgYm9vbCBtX2FjY2VsZXJhdGVzRHJhd2luZzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdl
YktpdAotCi0jZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotCi0jZW5kaWYg
Ly8gUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmVfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIv
V2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXllckJhY2tpbmdTdG9yZS5tbSBiL1NvdXJj
ZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUu
bW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MzA2NjkuLjAwMDAwMDAKLS0tIGEv
U291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXllckJhY2tpbmdT
dG9yZS5tbQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0gLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
LSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW1wb3J0ICJjb25maWcu
aCIKLSNpbXBvcnQgIlJlbW90ZUxheWVyQmFja2luZ1N0b3JlLmgiCi0KLSNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCi0KLSNpbXBvcnQgIkFyZ3VtZW50Q29kZXJzLmgiCi0jaW1wb3J0
ICJNYWNoUG9ydC5oIgotI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVyUmVtb3RlLmgiCi0jaW1wb3J0
ICJTaGFyZWFibGVCaXRtYXAuaCIKLSNpbXBvcnQgIldlYkNvcmVBcmd1bWVudENvZGVycy5oIgot
I2ltcG9ydCA8V2ViQ29yZS9HcmFwaGljc0NvbnRleHRDRy5oPgotI2ltcG9ydCA8V2ViQ29yZS9X
ZWJMYXllci5oPgotCi0jaWZkZWYgX19oYXNfaW5jbHVkZQotI2lmIF9faGFzX2luY2x1ZGUoPEFw
cGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlc1ByaXYuaD4pCi0jaW1wb3J0IDxB
cHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXNQcml2Lmg+Ci0jZW5kaWYKLSNl
bmRpZgotCi1leHRlcm4gIkMiIHsKLUNHQ29udGV4dFJlZiBDR0lPU3VyZmFjZUNvbnRleHRDcmVh
dGUoSU9TdXJmYWNlUmVmLCBzaXplX3QsIHNpemVfdCwgc2l6ZV90LCBzaXplX3QsIENHQ29sb3JT
cGFjZVJlZiwgQ0dCaXRtYXBJbmZvKTsKLUNHSW1hZ2VSZWYgQ0dJT1N1cmZhY2VDb250ZXh0Q3Jl
YXRlSW1hZ2UoQ0dDb250ZXh0UmVmKTsKLX0KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci11
c2luZyBuYW1lc3BhY2UgV2ViS2l0OwotCi1SZW1vdGVMYXllckJhY2tpbmdTdG9yZTo6UmVtb3Rl
TGF5ZXJCYWNraW5nU3RvcmUoKQotICAgIDogbV9sYXllcihudWxscHRyKQotewotfQotCi12b2lk
IFJlbW90ZUxheWVyQmFja2luZ1N0b3JlOjplbnN1cmVCYWNraW5nU3RvcmUoUGxhdGZvcm1DQUxh
eWVyUmVtb3RlKiBsYXllciwgSW50U2l6ZSBzaXplLCBmbG9hdCBzY2FsZSwgYm9vbCBhY2NlbGVy
YXRlc0RyYXdpbmcpCi17Ci0gICAgaWYgKG1fbGF5ZXIgPT0gbGF5ZXIgJiYgbV9zaXplID09IHNp
emUgJiYgbV9zY2FsZSA9PSBzY2FsZSAmJiBtX2FjY2VsZXJhdGVzRHJhd2luZyA9PSBhY2NlbGVy
YXRlc0RyYXdpbmcpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fbGF5ZXIgPSBsYXllcjsKLSAg
ICBtX3NpemUgPSBzaXplOwotICAgIG1fc2NhbGUgPSBzY2FsZTsKLSAgICBtX2FjY2VsZXJhdGVz
RHJhd2luZyA9IGFjY2VsZXJhdGVzRHJhd2luZzsKLQotICAgIG1fZnJvbnRTdXJmYWNlID0gbnVs
bHB0cjsKLSAgICBtX2Zyb250QnVmZmVyID0gbnVsbHB0cjsKLX0KLQotdm9pZCBSZW1vdGVMYXll
ckJhY2tpbmdTdG9yZTo6ZW5jb2RlKENvcmVJUEM6OkFyZ3VtZW50RW5jb2RlciYgZW5jb2Rlcikg
Y29uc3QKLXsKLSAgICBlbmNvZGVyIDw8IG1fc2l6ZTsKLSAgICBlbmNvZGVyIDw8IG1fc2NhbGU7
Ci0gICAgZW5jb2RlciA8PCBtX2FjY2VsZXJhdGVzRHJhd2luZzsKLQotICAgIGlmIChtX2FjY2Vs
ZXJhdGVzRHJhd2luZykgewotICAgICAgICBtYWNoX3BvcnRfdCBwb3J0ID0gSU9TdXJmYWNlQ3Jl
YXRlTWFjaFBvcnQobV9mcm9udFN1cmZhY2UuZ2V0KCkpOwotICAgICAgICBlbmNvZGVyIDw8IENv
cmVJUEM6Ok1hY2hQb3J0KHBvcnQsIE1BQ0hfTVNHX1RZUEVfTU9WRV9TRU5EKTsKLSAgICB9IGVs
c2UgewotICAgICAgICBTaGFyZWFibGVCaXRtYXA6OkhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIG1f
ZnJvbnRCdWZmZXItPmNyZWF0ZUhhbmRsZShoYW5kbGUpOwotICAgICAgICBlbmNvZGVyIDw8IGhh
bmRsZTsKLSAgICB9Ci19Ci0KLWJvb2wgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU6OmRlY29kZShD
b3JlSVBDOjpBcmd1bWVudERlY29kZXImIGRlY29kZXIsIFJlbW90ZUxheWVyQmFja2luZ1N0b3Jl
JiByZXN1bHQpCi17Ci0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShyZXN1bHQubV9zaXplKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShyZXN1bHQubV9z
Y2FsZSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghZGVjb2Rlci5kZWNvZGUo
cmVzdWx0Lm1fYWNjZWxlcmF0ZXNEcmF3aW5nKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgaWYgKHJlc3VsdC5tX2FjY2VsZXJhdGVzRHJhd2luZykgewotICAgICAgICBDb3JlSVBDOjpN
YWNoUG9ydCBtYWNoUG9ydDsKLSAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29kZShtYWNoUG9ydCkp
Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJlc3VsdC5tX2Zyb250U3VyZmFj
ZSA9IGFkb3B0Q0YoSU9TdXJmYWNlTG9va3VwRnJvbU1hY2hQb3J0KG1hY2hQb3J0LnBvcnQoKSkp
OwotICAgICAgICBtYWNoX3BvcnRfZGVhbGxvY2F0ZShtYWNoX3Rhc2tfc2VsZigpLCBtYWNoUG9y
dC5wb3J0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFNoYXJlYWJsZUJpdG1hcDo6SGFuZGxl
IGhhbmRsZTsKLSAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29kZShoYW5kbGUpKQotICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXN1bHQubV9mcm9udEJ1ZmZlciA9IFNoYXJlYWJs
ZUJpdG1hcDo6Y3JlYXRlKGhhbmRsZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LUludFJlY3QgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU6Om1hcFRvQ29udGVudENvb3JkaW5hdGVz
KGNvbnN0IEludFJlY3QgcmVjdCkgY29uc3QKLXsKLSAgICBJbnRSZWN0IGZsaXBwZWRSZWN0ID0g
cmVjdDsKLSAgICBpZiAobV9sYXllci0+b3duZXIoKS0+cGxhdGZvcm1DQUxheWVyQ29udGVudHNP
cmllbnRhdGlvbigpID09IEdyYXBoaWNzTGF5ZXI6OkNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNCb3R0
b21VcCkKLSAgICAgICAgZmxpcHBlZFJlY3Quc2V0WShtX3NpemUuaGVpZ2h0KCkgLSByZWN0Lnko
KSAtIHJlY3QuaGVpZ2h0KCkpOwotICAgIHJldHVybiBmbGlwcGVkUmVjdDsKLX0KLQotdm9pZCBS
ZW1vdGVMYXllckJhY2tpbmdTdG9yZTo6c2V0TmVlZHNEaXNwbGF5KGNvbnN0IEludFJlY3QgcmVj
dCkKLXsKLSAgICBJbnRSZWN0IGZsaXBwZWRSZWN0ID0gbWFwVG9Db250ZW50Q29vcmRpbmF0ZXMo
cmVjdCk7Ci0gICAgbV9kaXJ0eVJlZ2lvbi51bml0ZShmbGlwcGVkUmVjdCk7Ci19Ci0KLXZvaWQg
UmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU6OnNldE5lZWRzRGlzcGxheSgpCi17Ci0gICAgc2V0TmVl
ZHNEaXNwbGF5KEludFJlY3QoSW50UG9pbnQoKSwgbV9zaXplKSk7Ci19Ci0KLXN0YXRpYyBSZXRh
aW5QdHI8Q0dDb250ZXh0UmVmPiBjcmVhdGVJT1N1cmZhY2VDb250ZXh0KElPU3VyZmFjZVJlZiBz
dXJmYWNlLCBJbnRTaXplIHNpemUsIENHQ29sb3JTcGFjZVJlZiBjb2xvclNwYWNlKQotewotICAg
IGlmICghc3VyZmFjZSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBDR0JpdG1hcElu
Zm8gYml0bWFwSW5mbyA9IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QgfCBrQ0dCaXRt
YXBCeXRlT3JkZXIzMkhvc3Q7Ci0gICAgc2l6ZV90IGJpdHNQZXJDb21wb25lbnQgPSA4OwotICAg
IHNpemVfdCBiaXRzUGVyUGl4ZWwgPSAzMjsKLSAgICByZXR1cm4gYWRvcHRDRihDR0lPU3VyZmFj
ZUNvbnRleHRDcmVhdGUoc3VyZmFjZSwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpLCBiaXRz
UGVyQ29tcG9uZW50LCBiaXRzUGVyUGl4ZWwsIGNvbG9yU3BhY2UsIGJpdG1hcEluZm8pKTsKLX0K
LQotc3RhdGljIFJldGFpblB0cjxJT1N1cmZhY2VSZWY+IGNyZWF0ZUlPU3VyZmFjZShJbnRTaXpl
IHNpemUpCi17Ci0gICAgdW5zaWduZWQgcGl4ZWxGb3JtYXQgPSAnQkdSQSc7Ci0gICAgdW5zaWdu
ZWQgYnl0ZXNQZXJFbGVtZW50ID0gNDsKLSAgICBpbnQgd2lkdGggPSBzaXplLndpZHRoKCk7Ci0g
ICAgaW50IGhlaWdodCA9IHNpemUuaGVpZ2h0KCk7Ci0KLSAgICB1bnNpZ25lZCBsb25nIGJ5dGVz
UGVyUm93ID0gSU9TdXJmYWNlQWxpZ25Qcm9wZXJ0eShrSU9TdXJmYWNlQnl0ZXNQZXJSb3csIHdp
ZHRoICogYnl0ZXNQZXJFbGVtZW50KTsKLSAgICBBU1NFUlQoYnl0ZXNQZXJSb3cpOwotCi0gICAg
dW5zaWduZWQgbG9uZyBhbGxvY1NpemUgPSBJT1N1cmZhY2VBbGlnblByb3BlcnR5KGtJT1N1cmZh
Y2VBbGxvY1NpemUsIGhlaWdodCAqIGJ5dGVzUGVyUm93KTsKLSAgICBBU1NFUlQoYWxsb2NTaXpl
KTsKLQotICAgIE5TRGljdGlvbmFyeSAqZGljdCA9IEB7Ci0gICAgICAgIChpZClrSU9TdXJmYWNl
V2lkdGg6IEAod2lkdGgpLAotICAgICAgICAoaWQpa0lPU3VyZmFjZUhlaWdodDogQChoZWlnaHQp
LAotICAgICAgICAoaWQpa0lPU3VyZmFjZVBpeGVsRm9ybWF0OiBAKHBpeGVsRm9ybWF0KSwKLSAg
ICAgICAgKGlkKWtJT1N1cmZhY2VCeXRlc1BlckVsZW1lbnQ6IEAoYnl0ZXNQZXJFbGVtZW50KSwK
LSAgICAgICAgKGlkKWtJT1N1cmZhY2VCeXRlc1BlclJvdzogQChieXRlc1BlclJvdyksCi0gICAg
ICAgIChpZClrSU9TdXJmYWNlQWxsb2NTaXplOiBAKGFsbG9jU2l6ZSkKLSAgICB9OwotCi0gICAg
cmV0dXJuIGFkb3B0Q0YoSU9TdXJmYWNlQ3JlYXRlKChDRkRpY3Rpb25hcnlSZWYpZGljdCkpOwot
fQotCi1SZXRhaW5QdHI8Q0dJbWFnZVJlZj4gUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU6OmltYWdl
KCkgY29uc3QKLXsKLSAgICBpZiAoIW1fZnJvbnRCdWZmZXIgfHwgbV9hY2NlbGVyYXRlc0RyYXdp
bmcpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgLy8gRklYTUU6IERvIHdlIG5lZWQg
Q29weT8KLSAgICByZXR1cm4gbV9mcm9udEJ1ZmZlci0+bWFrZUNHSW1hZ2VDb3B5KCk7Ci19Ci0K
LWJvb2wgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU6OmRpc3BsYXkoKQotewotICAgIGlmICghbV9s
YXllcikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gSWYgd2UgcHJldmlvdXNseSB3
ZXJlIGRyYXdzQ29udGVudD1ZRVMsIGFuZCBub3cgYXJlIG5vdCwgd2UgbmVlZAotICAgIC8vIHRv
IG5vdGUgdGhhdCBvdXIgYmFja2luZyBzdG9yZSBoYXMgYmVlbiBjbGVhcmVkLgotICAgIGlmICgh
bV9sYXllci0+b3duZXIoKSB8fCAhbV9sYXllci0+b3duZXIoKS0+cGxhdGZvcm1DQUxheWVyRHJh
d3NDb250ZW50KCkpIHsKLSAgICAgICAgYm9vbCBwcmV2aW91c2x5RHJld0NvbnRlbnRzID0gaGFz
RnJvbnRCdWZmZXIoKTsKLQotICAgICAgICBtX2Zyb250QnVmZmVyID0gbnVsbHB0cjsKLSAgICAg
ICAgbV9mcm9udFN1cmZhY2UgPSBudWxscHRyOwotCi0gICAgICAgIHJldHVybiBwcmV2aW91c2x5
RHJld0NvbnRlbnRzOwotICAgIH0KLQotICAgIGlmICghaGFzRnJvbnRCdWZmZXIoKSkKLSAgICAg
ICAgbV9kaXJ0eVJlZ2lvbi51bml0ZShJbnRSZWN0KEludFBvaW50KCksIG1fc2l6ZSkpOwotCi0g
ICAgaWYgKG1fZGlydHlSZWdpb24uaXNFbXB0eSgpIHx8IG1fc2l6ZS5pc0VtcHR5KCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChtX2xheWVyLT5vd25lcigpLT5wbGF0Zm9ybUNB
TGF5ZXJTaG93UmVwYWludENvdW50ZXIobV9sYXllcikpIHsKLSAgICAgICAgSW50UmVjdCBpbmRp
Y2F0b3JSZWN0ID0gbWFwVG9Db250ZW50Q29vcmRpbmF0ZXMoSW50UmVjdCgwLCAwLCA1MiwgMjcp
KTsKLSAgICAgICAgbV9kaXJ0eVJlZ2lvbi51bml0ZShpbmRpY2F0b3JSZWN0KTsKLSAgICB9Ci0K
LSAgICBGbG9hdFNpemUgc2NhbGVkU2l6ZSA9IG1fc2l6ZTsKLSAgICBzY2FsZWRTaXplLnNjYWxl
KG1fc2NhbGUpOwotICAgIEludFNpemUgZXhwYW5kZWRTY2FsZWRTaXplID0gZXhwYW5kZWRJbnRT
aXplKHNjYWxlZFNpemUpOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPEdyYXBoaWNzQ29udGV4dD4g
Y29udGV4dDsKLSAgICBSZWZQdHI8U2hhcmVhYmxlQml0bWFwPiBiYWNrQnVmZmVyOwotICAgIFJl
dGFpblB0cjxJT1N1cmZhY2VSZWY+IGJhY2tTdXJmYWNlOwotCi0gICAgaWYgKG1fYWNjZWxlcmF0
ZXNEcmF3aW5nKSB7Ci0gICAgICAgIGJhY2tTdXJmYWNlID0gY3JlYXRlSU9TdXJmYWNlKGV4cGFu
ZGVkU2NhbGVkU2l6ZSk7Ci0gICAgICAgIFJldGFpblB0cjxDR0NvbnRleHRSZWY+IGNnQ29udGV4
dCA9IGNyZWF0ZUlPU3VyZmFjZUNvbnRleHQoYmFja1N1cmZhY2UuZ2V0KCksIGV4cGFuZGVkU2Nh
bGVkU2l6ZSwgc1JHQkNvbG9yU3BhY2VSZWYoKSk7Ci0gICAgICAgIGNvbnRleHQgPSBzdGQ6Om1h
a2VfdW5pcXVlPEdyYXBoaWNzQ29udGV4dD4oY2dDb250ZXh0LmdldCgpKTsKLSAgICAgICAgQ0dD
b250ZXh0Q2xlYXJSZWN0KGNnQ29udGV4dC5nZXQoKSwgQ0dSZWN0TWFrZSgwLCAwLCBleHBhbmRl
ZFNjYWxlZFNpemUud2lkdGgoKSwgZXhwYW5kZWRTY2FsZWRTaXplLmhlaWdodCgpKSk7Ci0gICAg
ICAgIGNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSgxLCAtMSkpOwotICAgICAgICBjb250ZXh0LT50
cmFuc2xhdGUoMCwgLWV4cGFuZGVkU2NhbGVkU2l6ZS5oZWlnaHQoKSk7Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgYmFja0J1ZmZlciA9IFNoYXJlYWJsZUJpdG1hcDo6Y3JlYXRlU2hhcmVhYmxlKGV4
cGFuZGVkSW50U2l6ZShzY2FsZWRTaXplKSwgU2hhcmVhYmxlQml0bWFwOjpTdXBwb3J0c0FscGhh
KTsKLSAgICAgICAgY29udGV4dCA9IGJhY2tCdWZmZXItPmNyZWF0ZUdyYXBoaWNzQ29udGV4dCgp
OwotICAgIH0KLQotICAgIGRyYXdJbkNvbnRleHQoKmNvbnRleHQpOwotCi0gICAgaWYgKG1fYWNj
ZWxlcmF0ZXNEcmF3aW5nKQotICAgICAgICBtX2Zyb250U3VyZmFjZSA9IGJhY2tTdXJmYWNlOwot
ICAgIGVsc2UKLSAgICAgICAgbV9mcm9udEJ1ZmZlciA9IGJhY2tCdWZmZXI7Ci0KLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLQotdm9pZCBSZW1vdGVMYXllckJhY2tpbmdTdG9yZTo6ZHJhd0luQ29udGV4
dChHcmFwaGljc0NvbnRleHQmIGNvbnRleHQpCi17Ci0gICAgUmV0YWluUHRyPENHSW1hZ2VSZWY+
IGZyb250SW1hZ2U7Ci0gICAgUmV0YWluUHRyPENHQ29udGV4dFJlZj4gZnJvbnRDb250ZXh0Owot
Ci0gICAgaWYgKG1fYWNjZWxlcmF0ZXNEcmF3aW5nKSB7Ci0gICAgICAgIGZyb250Q29udGV4dCA9
IGNyZWF0ZUlPU3VyZmFjZUNvbnRleHQobV9mcm9udFN1cmZhY2UuZ2V0KCksIGV4cGFuZGVkSW50
U2l6ZShtX3NpemUgKiBtX3NjYWxlKSwgc1JHQkNvbG9yU3BhY2VSZWYoKSk7Ci0gICAgICAgIGZy
b250SW1hZ2UgPSBhZG9wdENGKENHSU9TdXJmYWNlQ29udGV4dENyZWF0ZUltYWdlKGZyb250Q29u
dGV4dC5nZXQoKSkpOwotICAgIH0gZWxzZQotICAgICAgICBmcm9udEltYWdlID0gaW1hZ2UoKTsK
LQotICAgIFZlY3RvcjxJbnRSZWN0PiBkaXJ0eVJlY3RzID0gbV9kaXJ0eVJlZ2lvbi5yZWN0cygp
OwotCi0gICAgLy8gSWYgd2UgaGF2ZSBsZXNzIHRoYW4gd2ViTGF5ZXJNYXhSZWN0c1RvUGFpbnQg
cmVjdHMgdG8gcGFpbnQgYW5kIHRoZXkgY292ZXIgbGVzcwotICAgIC8vIHRoYW4gd2ViTGF5ZXJX
YXN0ZWRTcGFjZVRocmVzaG9sZCBvZiB0aGUgYXJlYSwgd2UnbGwgZG8gYSBwYXJ0aWFsIHJlcGFp
bnQuCi0KLSAgICBWZWN0b3I8RmxvYXRSZWN0LCB3ZWJMYXllck1heFJlY3RzVG9QYWludD4gcmVj
dHNUb1BhaW50OwotICAgIGlmIChkaXJ0eVJlY3RzLnNpemUoKSA8PSB3ZWJMYXllck1heFJlY3Rz
VG9QYWludCAmJiBtX2RpcnR5UmVnaW9uLnRvdGFsQXJlYSgpIDw9IHdlYkxheWVyV2FzdGVkU3Bh
Y2VUaHJlc2hvbGQgKiBtX3NpemUud2lkdGgoKSAqIG1fc2l6ZS5oZWlnaHQoKSkgewotICAgICAg
ICAvLyBDb3B5IG92ZXIgdGhlIHBhcnRzIG9mIHRoZSBmcm9udCBidWZmZXIgdGhhdCB3ZSdyZSBu
b3QgZ29pbmcgdG8gcmVwYWludC4KLSAgICAgICAgaWYgKGZyb250SW1hZ2UpIHsKLSAgICAgICAg
ICAgIFJlZ2lvbiBjbGVhblJlZ2lvbihJbnRSZWN0KEludFBvaW50KCksIG1fc2l6ZSkpOwotICAg
ICAgICAgICAgY2xlYW5SZWdpb24uc3VidHJhY3QobV9kaXJ0eVJlZ2lvbik7Ci0KLSAgICAgICAg
ICAgIGZvciAoY29uc3QgYXV0byYgcmVjdCA6IGNsZWFuUmVnaW9uLnJlY3RzKCkpIHsKLSAgICAg
ICAgICAgICAgICBGbG9hdFJlY3Qgc2NhbGVkUmVjdCA9IHJlY3Q7Ci0gICAgICAgICAgICAgICAg
c2NhbGVkUmVjdC5zY2FsZShtX3NjYWxlKTsKLSAgICAgICAgICAgICAgICBGbG9hdFNpemUgaW1h
Z2VTaXplKENHSW1hZ2VHZXRXaWR0aChmcm9udEltYWdlLmdldCgpKSwgQ0dJbWFnZUdldEhlaWdo
dChmcm9udEltYWdlLmdldCgpKSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5kcmF3TmF0aXZl
SW1hZ2UoZnJvbnRJbWFnZS5nZXQoKSwgaW1hZ2VTaXplLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBz
Y2FsZWRSZWN0LCBzY2FsZWRSZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIGZvciAoY29uc3QgYXV0byYgcmVjdCA6IGRpcnR5UmVjdHMpCi0gICAgICAgICAgICByZWN0
c1RvUGFpbnQuYXBwZW5kKHJlY3QpOwotICAgIH0KLQotICAgIGNvbnRleHQuc2NhbGUoRmxvYXRT
aXplKG1fc2NhbGUsIG1fc2NhbGUpKTsKLQotICAgIHN3aXRjaCAobV9sYXllci0+bGF5ZXJUeXBl
KCkpIHsKLSAgICAgICAgY2FzZSBQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZVNpbXBsZUxheWVy
OgotICAgICAgICBjYXNlIFBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlVGlsZWRCYWNraW5nVGls
ZUxheWVyOgotICAgICAgICAgICAgaWYgKHJlY3RzVG9QYWludC5pc0VtcHR5KCkpCi0gICAgICAg
ICAgICAgICAgcmVjdHNUb1BhaW50LmFwcGVuZChJbnRSZWN0KEludFBvaW50KCksIG1fc2l6ZSkp
OwotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiByZWN0IDogcmVjdHNUb1BhaW50KQotICAg
ICAgICAgICAgICAgIG1fbGF5ZXItPm93bmVyKCktPnBsYXRmb3JtQ0FMYXllclBhaW50Q29udGVu
dHMobV9sYXllciwgY29udGV4dCwgZW5jbG9zaW5nSW50UmVjdChyZWN0KSk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSBQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZVdlYkxheWVy
OgotICAgICAgICAgICAgZHJhd0xheWVyQ29udGVudHMoY29udGV4dC5wbGF0Zm9ybUNvbnRleHQo
KSwgbV9sYXllciwgcmVjdHNUb1BhaW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIFBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlTGF5ZXI6Ci0gICAgICAgIGNhc2UgUGxhdGZv
cm1DQUxheWVyOjpMYXllclR5cGVUcmFuc2Zvcm1MYXllcjoKLSAgICAgICAgY2FzZSBQbGF0Zm9y
bUNBTGF5ZXI6OkxheWVyVHlwZVdlYlRpbGVkTGF5ZXI6Ci0gICAgICAgIGNhc2UgUGxhdGZvcm1D
QUxheWVyOjpMYXllclR5cGVUaWxlZEJhY2tpbmdMYXllcjoKLSAgICAgICAgY2FzZSBQbGF0Zm9y
bUNBTGF5ZXI6OkxheWVyVHlwZVBhZ2VUaWxlZEJhY2tpbmdMYXllcjoKLSAgICAgICAgY2FzZSBQ
bGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZVJvb3RMYXllcjoKLSAgICAgICAgY2FzZSBQbGF0Zm9y
bUNBTGF5ZXI6OkxheWVyVHlwZUFWUGxheWVyTGF5ZXI6Ci0gICAgICAgIGNhc2UgUGxhdGZvcm1D
QUxheWVyOjpMYXllclR5cGVDdXN0b206Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9OwotCi0g
ICAgbV9kaXJ0eVJlZ2lvbiA9IFJlZ2lvbigpOwotCi0gICAgQ0dDb250ZXh0Rmx1c2goY29udGV4
dC5wbGF0Zm9ybUNvbnRleHQoKSk7Ci0KLSAgICAvLyBJZiBvdXIgZnJvbnRJbWFnZSBpcyBkZXJp
dmVkIGZyb20gYW4gSU9TdXJmYWNlLCB3ZSBuZWVkIHRvCi0gICAgLy8gZGVzdHJveSB0aGUgaW1h
Z2UgYmVmb3JlIHRoZSBDR0NvbnRleHQgaXQncyBkZXJpdmVkIGZyb20sCi0gICAgLy8gc28gdGhh
dCB0aGUgY29udGV4dCBkb2Vzbid0IG1ha2UgYSBDUFUgY29weSBvZiB0aGUgc3VyZmFjZSBkYXRh
LgotICAgIGZyb250SW1hZ2UgPSBudWxscHRyOwotICAgIGZyb250Q29udGV4dCA9IG51bGxwdHI7
Ci19Ci0KLSNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCg==
</data>
<flag name="review"
          id="238590"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>215787</attachid>
            <date>2013-11-01 17:49:07 -0700</date>
            <delta_ts>2013-11-02 09:02:54 -0700</delta_ts>
            <desc>address review comments</desc>
            <filename>reviewcomments.diff</filename>
            <type>text/plain</type>
            <size>7937</size>
            <attacher name="Tim Horton">thorton</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQyL0No
YW5nZUxvZwppbmRleCBkNzNjNjE0Li43MmZjOWE5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
Mi9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzMg
QEAKKzIwMTMtMTEtMDEgIFRpbSBIb3J0b24gIDx0aW1vdGh5X2hvcnRvbkBhcHBsZS5jb20+CisK
KyAgICAgICAgQWRkcmVzcyBzb21lIHJldmlldyBjb21tZW50cyBub3RlZCBpbiByMTU4NDYzCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjM2NDYKKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIFNoYXJlZC9t
YWMvUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUubW06CisgICAgICAgIFB1dCBvdXIgX19oYXNfaW5j
bHVkZSBpZnMgYWxsIG9uIG9uZSBsaW5lLgorCisgICAgICAgIChjcmVhdGVJT1N1cmZhY2UpOgor
ICAgICAgICBJT1N1cmZhY2VBbGlnblByb3BlcnR5IHJldHVybnMgc2l6ZV90LCBub3QgdW5zaWdu
ZWQgbG9uZy4KKworICAgICAgICAoUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU6OmRpc3BsYXkpOgor
ICAgICAgICAoUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU6OmRyYXdJbkNvbnRleHQpOgorICAgICAg
ICBDcmVhdGUgdGhlIGZyb250SW1hZ2UgaW4gZGlzcGxheSgpIGFuZCBoYW5kIGl0IHRvIGRyYXdJ
bkNvbnRleHQoKS4KKworICAgICAgICBVc2UgdGhlIEdyYXBoaWNzQ29udGV4dCBBUEkgaW5zdGVh
ZCBvZiBDRyBpdHNlbGYgZm9yIGNsZWFyUmVjdCgpLgorCisgICAgICAgIFdoZW4gdXNpbmcgU2hh
cmVhYmxlQml0bWFwLCByZXBsYWNlIG1fZnJvbnRCdWZmZXIgaW5zdGVhZCBvZgorICAgICAgICBo
YXZpbmcgYSBiYWNrQnVmZmVyIGxvY2FsOyB0aGUgQ0dJbWFnZVJlZiB3aWxsIHJldGFpbiB0aGUK
KyAgICAgICAgU2hhcmVhYmxlQml0bWFwIGl0IHJlZmVyZW5jZXMuCisKKyAgICAgICAgRHVwbGlj
YXRlIG91ciBkcmF3SW5Db250ZXh0KCkgY2FsbHMgc28gd2UgZG9uJ3QgaGF2ZSB0byBhbGxvY2F0
ZQorICAgICAgICBhIEdyYXBoaWNzQ29udGV4dCBvbiB0aGUgaGVhcCBpbiB0aGUgSU9TdXJmYWNl
IGNhc2UuCisKKyAgICAgICAgRG9uJ3QgYm90aGVyIGNsZWFyaW5nIGZyb250Q29udGV4dDsgaXQn
bGwgaGFwcGVuIGZvciB1cyBhdAorICAgICAgICB0aGUgYXBwcm9wcmlhdGUgdGltZS4gSW5zdGVh
ZCwgYXNzZXJ0IHRoYXQgaXQncyBzdGlsbCBhbGl2ZSBhZnRlcgorICAgICAgICB3ZSBkcm9wIG91
ciByZWZlcmVuY2UgdG8gdGhlIGZyb250SW1hZ2UgY3JlYXRlZCBmcm9tIGl0LgorCiAyMDEzLTEx
LTAxICBEYW4gQmVybnN0ZWluICA8bWl0ekBhcHBsZS5jb20+CiAKICAgICAgICAgW0NvY29hXSBX
S09iamVjdCBzZWVtcyB0byBiZSBpbml0aWFsaXppbmcgaXRzIHRhcmdldCBpbiBhIHRocmVhZC1z
YWZlIG1hbm5lciwgYnV0IHJlYWxseSBpcyBub3QKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQy
L1NoYXJlZC9tYWMvUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUuaCBiL1NvdXJjZS9XZWJLaXQyL1No
YXJlZC9tYWMvUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUuaAppbmRleCA1YmUyMDBlLi5hMzI3MzQ3
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvbWFjL1JlbW90ZUxheWVyQmFja2lu
Z1N0b3JlLmgKKysrIGIvU291cmNlL1dlYktpdDIvU2hhcmVkL21hYy9SZW1vdGVMYXllckJhY2tp
bmdTdG9yZS5oCkBAIC02NCw3ICs2NCw3IEBAIHByaXZhdGU6CiAgICAgYm9vbCBoYXNGcm9udEJ1
ZmZlcigpIHsgcmV0dXJuIG1fYWNjZWxlcmF0ZXNEcmF3aW5nID8gISFtX2Zyb250U3VyZmFjZSA6
ICEhbV9mcm9udEJ1ZmZlcjsgfQogCiAgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dD4gY3JlYXRlQmFja2luZ1N0b3JlKCk7Ci0gICAgdm9pZCBkcmF3SW5Db250ZXh0
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCYpOworICAgIHZvaWQgZHJhd0luQ29udGV4dChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQmLCBDR0ltYWdlUmVmIGZyb250SW1hZ2UpOwogCiAgICAgUGxh
dGZvcm1DQUxheWVyUmVtb3RlKiBtX2xheWVyOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0
Mi9TaGFyZWQvbWFjL1JlbW90ZUxheWVyQmFja2luZ1N0b3JlLm1tIGIvU291cmNlL1dlYktpdDIv
U2hhcmVkL21hYy9SZW1vdGVMYXllckJhY2tpbmdTdG9yZS5tbQppbmRleCA1NTMwNjY5Li5iYzhi
MjY3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvbWFjL1JlbW90ZUxheWVyQmFj
a2luZ1N0b3JlLm1tCisrKyBiL1NvdXJjZS9XZWJLaXQyL1NoYXJlZC9tYWMvUmVtb3RlTGF5ZXJC
YWNraW5nU3RvcmUubW0KQEAgLTM2LDExICszNiw5IEBACiAjaW1wb3J0IDxXZWJDb3JlL0dyYXBo
aWNzQ29udGV4dENHLmg+CiAjaW1wb3J0IDxXZWJDb3JlL1dlYkxheWVyLmg+CiAKLSNpZmRlZiBf
X2hhc19pbmNsdWRlCi0jaWYgX19oYXNfaW5jbHVkZSg8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBs
aWNhdGlvblNlcnZpY2VzUHJpdi5oPikKKyNpZiBkZWZpbmVkKF9faGFzX2luY2x1ZGUpICYmIF9f
aGFzX2luY2x1ZGUoPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlc1ByaXYu
aD4pCiAjaW1wb3J0IDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXNQcml2
Lmg+CiAjZW5kaWYKLSNlbmRpZgogCiBleHRlcm4gIkMiIHsKIENHQ29udGV4dFJlZiBDR0lPU3Vy
ZmFjZUNvbnRleHRDcmVhdGUoSU9TdXJmYWNlUmVmLCBzaXplX3QsIHNpemVfdCwgc2l6ZV90LCBz
aXplX3QsIENHQ29sb3JTcGFjZVJlZiwgQ0dCaXRtYXBJbmZvKTsKQEAgLTE0OSwxMCArMTQ3LDEw
IEBAIHN0YXRpYyBSZXRhaW5QdHI8SU9TdXJmYWNlUmVmPiBjcmVhdGVJT1N1cmZhY2UoSW50U2l6
ZSBzaXplKQogICAgIGludCB3aWR0aCA9IHNpemUud2lkdGgoKTsKICAgICBpbnQgaGVpZ2h0ID0g
c2l6ZS5oZWlnaHQoKTsKIAotICAgIHVuc2lnbmVkIGxvbmcgYnl0ZXNQZXJSb3cgPSBJT1N1cmZh
Y2VBbGlnblByb3BlcnR5KGtJT1N1cmZhY2VCeXRlc1BlclJvdywgd2lkdGggKiBieXRlc1BlckVs
ZW1lbnQpOworICAgIHNpemVfdCBieXRlc1BlclJvdyA9IElPU3VyZmFjZUFsaWduUHJvcGVydHko
a0lPU3VyZmFjZUJ5dGVzUGVyUm93LCB3aWR0aCAqIGJ5dGVzUGVyRWxlbWVudCk7CiAgICAgQVNT
RVJUKGJ5dGVzUGVyUm93KTsKIAotICAgIHVuc2lnbmVkIGxvbmcgYWxsb2NTaXplID0gSU9TdXJm
YWNlQWxpZ25Qcm9wZXJ0eShrSU9TdXJmYWNlQWxsb2NTaXplLCBoZWlnaHQgKiBieXRlc1BlclJv
dyk7CisgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IElPU3VyZmFjZUFsaWduUHJvcGVydHkoa0lPU3Vy
ZmFjZUFsbG9jU2l6ZSwgaGVpZ2h0ICogYnl0ZXNQZXJSb3cpOwogICAgIEFTU0VSVChhbGxvY1Np
emUpOwogCiAgICAgTlNEaWN0aW9uYXJ5ICpkaWN0ID0gQHsKQEAgLTIwNyw0MyArMjA1LDQzIEBA
IGJvb2wgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU6OmRpc3BsYXkoKQogICAgIHNjYWxlZFNpemUu
c2NhbGUobV9zY2FsZSk7CiAgICAgSW50U2l6ZSBleHBhbmRlZFNjYWxlZFNpemUgPSBleHBhbmRl
ZEludFNpemUoc2NhbGVkU2l6ZSk7CiAKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8R3JhcGhpY3NDb250
ZXh0PiBjb250ZXh0OwotICAgIFJlZlB0cjxTaGFyZWFibGVCaXRtYXA+IGJhY2tCdWZmZXI7Ci0g
ICAgUmV0YWluUHRyPElPU3VyZmFjZVJlZj4gYmFja1N1cmZhY2U7Ci0KICAgICBpZiAobV9hY2Nl
bGVyYXRlc0RyYXdpbmcpIHsKLSAgICAgICAgYmFja1N1cmZhY2UgPSBjcmVhdGVJT1N1cmZhY2Uo
ZXhwYW5kZWRTY2FsZWRTaXplKTsKKyAgICAgICAgUmV0YWluUHRyPElPU3VyZmFjZVJlZj4gYmFj
a1N1cmZhY2UgPSBjcmVhdGVJT1N1cmZhY2UoZXhwYW5kZWRTY2FsZWRTaXplKTsKICAgICAgICAg
UmV0YWluUHRyPENHQ29udGV4dFJlZj4gY2dDb250ZXh0ID0gY3JlYXRlSU9TdXJmYWNlQ29udGV4
dChiYWNrU3VyZmFjZS5nZXQoKSwgZXhwYW5kZWRTY2FsZWRTaXplLCBzUkdCQ29sb3JTcGFjZVJl
ZigpKTsKLSAgICAgICAgY29udGV4dCA9IHN0ZDo6bWFrZV91bmlxdWU8R3JhcGhpY3NDb250ZXh0
PihjZ0NvbnRleHQuZ2V0KCkpOwotICAgICAgICBDR0NvbnRleHRDbGVhclJlY3QoY2dDb250ZXh0
LmdldCgpLCBDR1JlY3RNYWtlKDAsIDAsIGV4cGFuZGVkU2NhbGVkU2l6ZS53aWR0aCgpLCBleHBh
bmRlZFNjYWxlZFNpemUuaGVpZ2h0KCkpKTsKLSAgICAgICAgY29udGV4dC0+c2NhbGUoRmxvYXRT
aXplKDEsIC0xKSk7Ci0gICAgICAgIGNvbnRleHQtPnRyYW5zbGF0ZSgwLCAtZXhwYW5kZWRTY2Fs
ZWRTaXplLmhlaWdodCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBiYWNrQnVmZmVyID0gU2hh
cmVhYmxlQml0bWFwOjpjcmVhdGVTaGFyZWFibGUoZXhwYW5kZWRJbnRTaXplKHNjYWxlZFNpemUp
LCBTaGFyZWFibGVCaXRtYXA6OlN1cHBvcnRzQWxwaGEpOwotICAgICAgICBjb250ZXh0ID0gYmFj
a0J1ZmZlci0+Y3JlYXRlR3JhcGhpY3NDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgZHJhd0luQ29u
dGV4dCgqY29udGV4dCk7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dCBjb250ZXh0KGNnQ29udGV4
dC5nZXQoKSk7CisgICAgICAgIGNvbnRleHQuY2xlYXJSZWN0KEZsb2F0UmVjdChGbG9hdFBvaW50
KCksIGV4cGFuZGVkU2NhbGVkU2l6ZSkpOworICAgICAgICBjb250ZXh0LnNjYWxlKEZsb2F0U2l6
ZSgxLCAtMSkpOworICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZSgwLCAtZXhwYW5kZWRTY2FsZWRT
aXplLmhlaWdodCgpKTsKKworICAgICAgICBSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPiBmcm9udENv
bnRleHQ7CisgICAgICAgIFJldGFpblB0cjxDR0ltYWdlUmVmPiBmcm9udEltYWdlOworICAgICAg
ICBpZiAobV9mcm9udFN1cmZhY2UpIHsKKyAgICAgICAgICAgIGZyb250Q29udGV4dCA9IGNyZWF0
ZUlPU3VyZmFjZUNvbnRleHQobV9mcm9udFN1cmZhY2UuZ2V0KCksIGV4cGFuZGVkSW50U2l6ZSht
X3NpemUgKiBtX3NjYWxlKSwgc1JHQkNvbG9yU3BhY2VSZWYoKSk7CisgICAgICAgICAgICBmcm9u
dEltYWdlID0gYWRvcHRDRihDR0lPU3VyZmFjZUNvbnRleHRDcmVhdGVJbWFnZShmcm9udENvbnRl
eHQuZ2V0KCkpKTsKKyAgICAgICAgfQogCi0gICAgaWYgKG1fYWNjZWxlcmF0ZXNEcmF3aW5nKQor
ICAgICAgICBkcmF3SW5Db250ZXh0KGNvbnRleHQsIGZyb250SW1hZ2UuZ2V0KCkpOwogICAgICAg
ICBtX2Zyb250U3VyZmFjZSA9IGJhY2tTdXJmYWNlOwotICAgIGVsc2UKLSAgICAgICAgbV9mcm9u
dEJ1ZmZlciA9IGJhY2tCdWZmZXI7CisKKyAgICAgICAgLy8gSWYgb3VyIGZyb250SW1hZ2UgaXMg
ZGVyaXZlZCBmcm9tIGFuIElPU3VyZmFjZSwgd2UgbmVlZCB0bworICAgICAgICAvLyBkZXN0cm95
IHRoZSBpbWFnZSBiZWZvcmUgdGhlIENHQ29udGV4dCBpdCdzIGRlcml2ZWQgZnJvbSwKKyAgICAg
ICAgLy8gc28gdGhhdCB0aGUgY29udGV4dCBkb2Vzbid0IG1ha2UgYSBDUFUgY29weSBvZiB0aGUg
c3VyZmFjZSBkYXRhLgorICAgICAgICBpZiAoZnJvbnRJbWFnZSkgeworICAgICAgICAgICAgZnJv
bnRJbWFnZSA9IG51bGxwdHI7CisgICAgICAgICAgICBBU1NFUlQoZnJvbnRDb250ZXh0KTsKKyAg
ICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFJldGFpblB0cjxDR0ltYWdlUmVmPiBmcm9u
dEltYWdlID0gaW1hZ2UoKTsKKyAgICAgICAgbV9mcm9udEJ1ZmZlciA9IFNoYXJlYWJsZUJpdG1h
cDo6Y3JlYXRlU2hhcmVhYmxlKGV4cGFuZGVkSW50U2l6ZShzY2FsZWRTaXplKSwgU2hhcmVhYmxl
Qml0bWFwOjpTdXBwb3J0c0FscGhhKTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEdyYXBoaWNz
Q29udGV4dD4gY29udGV4dCA9IG1fZnJvbnRCdWZmZXItPmNyZWF0ZUdyYXBoaWNzQ29udGV4dCgp
OworICAgICAgICBkcmF3SW5Db250ZXh0KCpjb250ZXh0LCBmcm9udEltYWdlLmdldCgpKTsKKyAg
ICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBSZW1vdGVMYXllckJhY2tpbmdTdG9y
ZTo6ZHJhd0luQ29udGV4dChHcmFwaGljc0NvbnRleHQmIGNvbnRleHQpCit2b2lkIFJlbW90ZUxh
eWVyQmFja2luZ1N0b3JlOjpkcmF3SW5Db250ZXh0KEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwg
Q0dJbWFnZVJlZiBmcm9udEltYWdlKQogewotICAgIFJldGFpblB0cjxDR0ltYWdlUmVmPiBmcm9u
dEltYWdlOwotICAgIFJldGFpblB0cjxDR0NvbnRleHRSZWY+IGZyb250Q29udGV4dDsKLQotICAg
IGlmIChtX2FjY2VsZXJhdGVzRHJhd2luZykgewotICAgICAgICBmcm9udENvbnRleHQgPSBjcmVh
dGVJT1N1cmZhY2VDb250ZXh0KG1fZnJvbnRTdXJmYWNlLmdldCgpLCBleHBhbmRlZEludFNpemUo
bV9zaXplICogbV9zY2FsZSksIHNSR0JDb2xvclNwYWNlUmVmKCkpOwotICAgICAgICBmcm9udElt
YWdlID0gYWRvcHRDRihDR0lPU3VyZmFjZUNvbnRleHRDcmVhdGVJbWFnZShmcm9udENvbnRleHQu
Z2V0KCkpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZnJvbnRJbWFnZSA9IGltYWdlKCk7Ci0KICAg
ICBWZWN0b3I8SW50UmVjdD4gZGlydHlSZWN0cyA9IG1fZGlydHlSZWdpb24ucmVjdHMoKTsKIAog
ICAgIC8vIElmIHdlIGhhdmUgbGVzcyB0aGFuIHdlYkxheWVyTWF4UmVjdHNUb1BhaW50IHJlY3Rz
IHRvIHBhaW50IGFuZCB0aGV5IGNvdmVyIGxlc3MKQEAgLTI1OSw4ICsyNTcsOCBAQCB2b2lkIFJl
bW90ZUxheWVyQmFja2luZ1N0b3JlOjpkcmF3SW5Db250ZXh0KEdyYXBoaWNzQ29udGV4dCYgY29u
dGV4dCkKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcmVjdCA6IGNsZWFuUmVnaW9uLnJl
Y3RzKCkpIHsKICAgICAgICAgICAgICAgICBGbG9hdFJlY3Qgc2NhbGVkUmVjdCA9IHJlY3Q7CiAg
ICAgICAgICAgICAgICAgc2NhbGVkUmVjdC5zY2FsZShtX3NjYWxlKTsKLSAgICAgICAgICAgICAg
ICBGbG9hdFNpemUgaW1hZ2VTaXplKENHSW1hZ2VHZXRXaWR0aChmcm9udEltYWdlLmdldCgpKSwg
Q0dJbWFnZUdldEhlaWdodChmcm9udEltYWdlLmdldCgpKSk7Ci0gICAgICAgICAgICAgICAgY29u
dGV4dC5kcmF3TmF0aXZlSW1hZ2UoZnJvbnRJbWFnZS5nZXQoKSwgaW1hZ2VTaXplLCBDb2xvclNw
YWNlRGV2aWNlUkdCLCBzY2FsZWRSZWN0LCBzY2FsZWRSZWN0KTsKKyAgICAgICAgICAgICAgICBG
bG9hdFNpemUgaW1hZ2VTaXplKENHSW1hZ2VHZXRXaWR0aChmcm9udEltYWdlKSwgQ0dJbWFnZUdl
dEhlaWdodChmcm9udEltYWdlKSk7CisgICAgICAgICAgICAgICAgY29udGV4dC5kcmF3TmF0aXZl
SW1hZ2UoZnJvbnRJbWFnZSwgaW1hZ2VTaXplLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBzY2FsZWRS
ZWN0LCBzY2FsZWRSZWN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yOTUsMTIg
KzI5Myw2IEBAIHZvaWQgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU6OmRyYXdJbkNvbnRleHQoR3Jh
cGhpY3NDb250ZXh0JiBjb250ZXh0KQogICAgIG1fZGlydHlSZWdpb24gPSBSZWdpb24oKTsKIAog
ICAgIENHQ29udGV4dEZsdXNoKGNvbnRleHQucGxhdGZvcm1Db250ZXh0KCkpOwotCi0gICAgLy8g
SWYgb3VyIGZyb250SW1hZ2UgaXMgZGVyaXZlZCBmcm9tIGFuIElPU3VyZmFjZSwgd2UgbmVlZCB0
bwotICAgIC8vIGRlc3Ryb3kgdGhlIGltYWdlIGJlZm9yZSB0aGUgQ0dDb250ZXh0IGl0J3MgZGVy
aXZlZCBmcm9tLAotICAgIC8vIHNvIHRoYXQgdGhlIGNvbnRleHQgZG9lc24ndCBtYWtlIGEgQ1BV
IGNvcHkgb2YgdGhlIHN1cmZhY2UgZGF0YS4KLSAgICBmcm9udEltYWdlID0gbnVsbHB0cjsKLSAg
ICBmcm9udENvbnRleHQgPSBudWxscHRyOwogfQogCiAjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>