<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>15838</bug_id>
          
          <creation_ts>2008-05-30 00:14:57 +0400</creation_ts>
          <short_desc>supermount-ng</short_desc>
          <delta_ts>2008-11-11 18:57:15 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>kernel-image-std-def</component>
          <version>unstable</version>
          <rep_platform>all</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>WONTFIX</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter>led</reporter>
          <assigned_to name="Vitaly Chikunov">vt</assigned_to>
          <cc>kernelbot</cc>
    
    <cc>placeholder</cc>
    
    <cc>vt</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>70966</commentid>
    <comment_count>0</comment_count>
    <who name="">led</who>
    <bug_when>2008-05-30 00:14:57 +0400</bug_when>
    <thetext>Предлагаю патч для поддержки supermount-ng для ядра 2.6.25 (для 2.6.24 тоже 
должен подойти)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>70967</commentid>
    <comment_count>1</comment_count>
      <attachid>2654</attachid>
    <who name="">led</who>
    <bug_when>2008-05-30 00:15:51 +0400</bug_when>
    <thetext>Created attachment 2654
linux-2.6.25.4-unionfs-aufs-cvs-20080519.patch

Собственно, патч</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>70968</commentid>
    <comment_count>2</comment_count>
      <attachid>2655</attachid>
    <who name="">led</who>
    <bug_when>2008-05-30 00:17:56 +0400</bug_when>
    <thetext>Created attachment 2655
linux-2.6.25.4-supermount-ng-2.2.2.patch

Сорри, промахнулся. Это правильный патч</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>80956</commentid>
    <comment_count>3</comment_count>
    <who name="Michail Yakushin">silicium</who>
    <bug_when>2008-11-11 18:57:14 +0300</bug_when>
    <thetext>Не нравиться мне этот пач, слишком во многое лезет.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>2654</attachid>
            <date>2008-05-30 00:15:51 +0400</date>
            <delta_ts>2008-05-30 00:18:47 +0400</delta_ts>
            <desc>linux-2.6.25.4-unionfs-aufs-cvs-20080519.patch</desc>
            <filename>linux-2.6.25.4-unionfs-aufs-cvs-20080519.patch</filename>
            <type>text/plain</type>
            <size>690142</size>
            <attacher>led</attacher>
            
              <data encoding="base64">ZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL2F1ZnMuaCBsaW51
eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvYXVmcy5oCi0tLSBsaW51eC0yLjYuMjUuNC11bmlv
bmZzLm9yaWcvZnMvYXVmcy9hdWZzLmgJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAorKysgbGlu
dXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL2F1ZnMuaAkyMDA4LTA1LTI1IDExOjU2OjA4ICsw
MzAwCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBKdW5q
aXJvIE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBw
cm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEz
MDEgIFVTQQorICovCisKKy8qCisgKiBtYWluIGhlYWRlciBmaWxlcworICoKKyAqICRJZDogYXVm
cy5oLHYgMS4yIDIwMDgvMDQvMjEgMDE6MzE6NDkgc2Zqcm8gRXhwICQKKyAqLworCisjaWZuZGVm
IF9fQVVGU19IX18KKyNkZWZpbmUgX19BVUZTX0hfXworCisjaWZkZWYgX19LRVJORUxfXworCisj
aW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKworI2luY2x1
ZGUgImJyYW5jaC5oIgorI2luY2x1ZGUgImNwdXAuaCIKKyNpbmNsdWRlICJkY3N1Yi5oIgorI2lu
Y2x1ZGUgImRlbnRyeS5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImZpbGUuaCIKKyNp
bmNsdWRlICJoaW5vZGUuaCIKKyNpbmNsdWRlICJpbm9kZS5oIgorI2luY2x1ZGUgIm1pc2MuaCIK
KyNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJvcHRzLmgiCisjaW5jbHVkZSAic3VwZXIu
aCIKKyNpbmNsdWRlICJzeXNhdWZzLmgiCisjaW5jbHVkZSAidmZzdWIuaCIKKyNpbmNsdWRlICJ3
aG91dC5oIgorI2luY2x1ZGUgIndrcS5oIgorLy8jaW5jbHVkZSAieGF0dHIuaCIKKworI2VuZGlm
IC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0FVRlNfSF9fICovCmRpZmYgLXVyTiBsaW51
eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9icmFuY2guYyBsaW51eC0yLjYuMjUuNC11
bmlvbmZzL2ZzL2F1ZnMvYnJhbmNoLmMKLS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9m
cy9hdWZzL2JyYW5jaC5jCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4y
NS40LXVuaW9uZnMvZnMvYXVmcy9icmFuY2guYwkyMDA4LTA1LTI1IDExOjU4OjUzICswMzAwCkBA
IC0wLDAgKzEsOTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggSnVuamlybyBP
a2FqaW1hCisgKgorICogVGhpcyBwcm9ncmFtLCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlz
IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3Jh
bTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBV
U0EKKyAqLworCisvKgorICogYnJhbmNoIG1hbmFnZW1lbnQKKyAqCisgKiAkSWQ6IGJyYW5jaC5j
LHYgMS41IDIwMDgvMDUvMTkgMDE6NTI6MTggc2Zqcm8gRXhwICQKKyAqLworCisjaW5jbHVkZSA8
bGludXgvaXNvX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbG9vcC5oPgorI2luY2x1ZGUgPGxpbnV4
L3JvbWZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlICJhdWZz
LmgiCisKK3N0YXRpYyB2b2lkIGZyZWVfYnJhbmNoKHN0cnVjdCBhdV9icmFuY2ggKmJyKQorewor
CUF1VHJhY2VFbnRlcigpOworCisJaWYgKGJyLT5icl94aW5vKQorCQlmcHV0KGJyLT5icl94aW5v
KTsKKwlkcHV0KGJyLT5icl93aCk7CisJZHB1dChici0+YnJfcGxpbmspOworCWlmICghYXVfdGVz
dF9uZnMoYnItPmJyX21udC0+bW50X3NiKSkKKwkJbW50cHV0KGJyLT5icl9tbnQpOworCWVsc2Ug
eworCQlsb2NrZGVwX29mZigpOworCQltbnRwdXQoYnItPmJyX21udCk7CisJCWxvY2tkZXBfb24o
KTsKKwl9CisJQXVEZWJ1Z09uKGF1X2JyX2NvdW50KGJyKSB8fCBhdG9taWNfcmVhZCgmYnItPmJy
X3doX3J1bm5pbmcpKTsKKwkvL0F1RGJnKCJmcmVlXG4iKTsKKwlrZnJlZShicik7Cit9CisKKy8q
CisgKiBmcmVlcyBhbGwgYnJhbmNoZXMKKyAqLwordm9pZCBhdV9icl9mcmVlKHN0cnVjdCBhdV9z
YmluZm8gKnNiaW5mbykKK3sKKwlhdWZzX2JpbmRleF90IGJtYXg7CisJc3RydWN0IGF1X2JyYW5j
aCAqKmJyOworCisJQXVUcmFjZUVudGVyKCk7CisJYm1heCA9IHNiaW5mby0+c2lfYmVuZCArIDE7
CisJYnIgPSBzYmluZm8tPnNpX2JyYW5jaDsKKwl3aGlsZSAoYm1heC0tKQorCQlmcmVlX2JyYW5j
aCgqYnIrKyk7Cit9CisKKy8qCisgKiBmaW5kIHRoZSBpbmRleCBvZiBhIGJyYW5jaCB3aGljaCBp
cyBzcGVjaWZpZWQgYnkgQGJyX2lkLgorICovCitpbnQgYXVfYnJfaW5kZXgoc3RydWN0IHN1cGVy
X2Jsb2NrICpzYiwgYXVmc19iaW5kZXhfdCBicl9pZCkKK3sKKwlhdWZzX2JpbmRleF90IGJpbmRl
eCwgYmVuZDsKKworCUF1VHJhY2VFbnRlcigpOworCisJYmVuZCA9IGF1X3NiZW5kKHNiKTsKKwlm
b3IgKGJpbmRleCA9IDA7IGJpbmRleCA8PSBiZW5kOyBiaW5kZXgrKykKKwkJaWYgKGF1X3Nicl9p
ZChzYiwgYmluZGV4KSA9PSBicl9pZCkKKwkJCXJldHVybiBiaW5kZXg7CisJcmV0dXJuIC0xOwor
fQorCisvKgorICogdGVzdCBpZiB0aGUgQGhfc2IgaXMgcmVhbC1yZWFkb25seS4KKyAqLworaW50
IGF1X3Rlc3RfZGVmX3JyKHN0cnVjdCBzdXBlcl9ibG9jayAqaF9zYikKK3sKKwlzd2l0Y2ggKGhf
c2ItPnNfbWFnaWMpIHsKKyNpZmRlZiBDT05GSUdfQVVGU19SUl9TUVVBU0hGUworCWNhc2UgU1FV
QVNIRlNfTUFHSUNfTFpNQToKKwljYXNlIFNRVUFTSEZTX01BR0lDOgorCWNhc2UgU1FVQVNIRlNf
TUFHSUNfTFpNQV9TV0FQOgorCWNhc2UgU1FVQVNIRlNfTUFHSUNfU1dBUDoKKwkJcmV0dXJuIDE7
IC8qIHJlYWwgcmVhZG9ubHkgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfSVNPOTY2
MF9GUykgfHwgZGVmaW5lZChDT05GSUdfSVNPOTY2MF9GU19NT0RVTEUpCisJY2FzZSBJU09GU19T
VVBFUl9NQUdJQzoKKwkJcmV0dXJuIDE7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NS
QU1GUykgfHwgZGVmaW5lZChDT05GSUdfQ1JBTUZTX01PRFVMRSkKKwljYXNlIENSQU1GU19NQUdJ
QzoKKwkJcmV0dXJuIDE7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1JPTUZTX0ZTKSB8
fCBkZWZpbmVkKENPTkZJR19ST01GU19GU19NT0RVTEUpCisJY2FzZSBST01GU19NQUdJQzoKKwkJ
cmV0dXJuIDE7CisjZW5kaWYKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSAqLworCisvKgorICogdGVzdCBpZiB0d28gaGlkZGVuX2RlbnRyaWVzIGhh
dmUgb3ZlcmxhcHBpbmcgYnJhbmNoZXMuCisgKi8KK3N0YXRpYyBpbnQgZG9fdGVzdF9vdmVybGFw
KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBkZW50cnkgKmhfZDEsCisJCQkgICBzdHJ1
Y3QgZGVudHJ5ICpoX2QyKQoreworCWludCBlcnI7CisKKwlMS1RSVHJhY2UoIiUuKnMsICUuKnNc
biIsIEF1RExOUGFpcihoX2QxKSwgQXVETE5QYWlyKGhfZDIpKTsKKworCWVyciA9IGF1X3Rlc3Rf
c3ViZGlyKGhfZDEsIGhfZDIpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQor
CitzdGF0aWMgaW50IHRlc3Rfb3ZlcmxhcF9sb29wYmFjayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi
LCBzdHJ1Y3QgZGVudHJ5ICpoX2QxLAorCQkJCSBzdHJ1Y3QgZGVudHJ5ICpoX2QyKQoreworI2lm
IGRlZmluZWQoQ09ORklHX0JMS19ERVZfTE9PUCkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9M
T09QX01PRFVMRSkKKwlzdHJ1Y3QgaW5vZGUgKmhfaW5vZGU7CisJc3RydWN0IGxvb3BfZGV2aWNl
ICpsOworCisJaF9pbm9kZSA9IGhfZDEtPmRfaW5vZGU7CisJaWYgKE1BSk9SKGhfaW5vZGUtPmlf
c2ItPnNfZGV2KSAhPSBMT09QX01BSk9SKQorCQlyZXR1cm4gMDsKKworCWwgPSBoX2lub2RlLT5p
X3NiLT5zX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwloX2QxID0gbC0+bG9fYmFja2lu
Z19maWxlLT5mX2RlbnRyeTsKKwlpZiAodW5saWtlbHkoaF9kMS0+ZF9zYiA9PSBzYikpCisJCXJl
dHVybiAxOworCXJldHVybiBkb190ZXN0X292ZXJsYXAoc2IsIGhfZDEsIGhfZDIpOworI2Vsc2UK
KwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHRlc3Rfb3ZlcmxhcChzdHJ1Y3Qg
c3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZGVudHJ5ICpoX2QxLAorCQkJc3RydWN0IGRlbnRyeSAq
aF9kMikKK3sKKwlMS1RSVHJhY2UoImQxICUuKnMsIGQyICUuKnNcbiIsIEF1RExOUGFpcihoX2Qx
KSwgQXVETE5QYWlyKGhfZDIpKTsKKworCWlmICh1bmxpa2VseShoX2QxID09IGhfZDIpKQorCQly
ZXR1cm4gMTsKKwlyZXR1cm4gZG9fdGVzdF9vdmVybGFwKHNiLCBoX2QxLCBoX2QyKQorCQl8fCBk
b190ZXN0X292ZXJsYXAoc2IsIGhfZDIsIGhfZDEpCisJCXx8IHRlc3Rfb3ZlcmxhcF9sb29wYmFj
ayhzYiwgaF9kMSwgaF9kMikKKwkJfHwgdGVzdF9vdmVybGFwX2xvb3BiYWNrKHNiLCBoX2QyLCBo
X2QxKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGluaXRfYnJfd2go
c3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYXVmc19iaW5kZXhfdCBiaW5kZXgsCisJCSAgICAgIHN0
cnVjdCBhdV9icmFuY2ggKmJyLCBpbnQgbmV3X3Blcm0sCisJCSAgICAgIHN0cnVjdCBkZW50cnkg
Kmhfcm9vdCwgc3RydWN0IHZmc21vdW50ICpoX21udCkKK3sKKwlpbnQgZXJyLCBvbGRfcGVybTsK
KwlzdHJ1Y3QgaW5vZGUgKmRpciwgKmhfZGlyOworCWNvbnN0IGludCBuZXcgPSAoYmluZGV4IDwg
MCk7CisKKwlMS1RSVHJhY2UoImIlZCwgbmV3X3Blcm0gJWRcbiIsIGJpbmRleCwgbmV3X3Blcm0p
OworCisJZGlyID0gc2ItPnNfcm9vdC0+ZF9pbm9kZTsKKwloX2RpciA9IGhfcm9vdC0+ZF9pbm9k
ZTsKKwlpZiAobmV3KQorCQltdXRleF9sb2NrX25lc3RlZCgmaF9kaXItPmlfbXV0ZXgsIEF1THNj
X0lfUEFSRU5UKTsKKwllbHNlCisJCWF1X2hkaXJfbG9jayhoX2RpciwgZGlyLCBiaW5kZXgpOwor
CisJYnJfd2hfd3JpdGVfbG9jayhicik7CisJb2xkX3Blcm0gPSBici0+YnJfcGVybTsKKwlici0+
YnJfcGVybSA9IG5ld19wZXJtOworCWVyciA9IGF1X3doX2luaXQoaF9yb290LCBiciwgYXVfZG9f
bmZzbW50KGhfbW50KSwgc2IpOworCWJyLT5icl9wZXJtID0gb2xkX3Blcm07CisJYnJfd2hfd3Jp
dGVfdW5sb2NrKGJyKTsKKworCWlmIChuZXcpCisJCW11dGV4X3VubG9jaygmaF9kaXItPmlfbXV0
ZXgpOworCWVsc2UKKwkJYXVfaGRpcl91bmxvY2soaF9kaXIsIGRpciwgYmluZGV4KTsKKworCUF1
VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisK
Ky8qCisgKiByZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkIGJyYW5jaC4gQG5ld19uYnJhbmNoIGlz
IGEgbnVtYmVyIG9mIGJyYW5jaGVzCisgKiBhZnRlciBhZGRpbmcgYSBicmFuY2guCisgKi8KK3N0
YXRpYyBzdHJ1Y3QgYXVfYnJhbmNoICphbGxvY19hZGRicihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi
LCBpbnQgbmV3X25icmFuY2gpCit7CisJc3RydWN0IGF1X2JyYW5jaCAqKmJyYW5jaHAsICphZGRf
YnJhbmNoOworCWludCBzejsKKwl2b2lkICpwOworCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisJc3Ry
dWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgYXVfaGlub2RlICpoaW5vZGVwOworCXN0cnVjdCBh
dV9oZGVudHJ5ICpoZGVudHJ5cDsKKworCUxLVFJUcmFjZSgibmV3X25icmFuY2ggJWRcbiIsIG5l
d19uYnJhbmNoKTsKKwlTaU11c3RXcml0ZUxvY2soc2IpOworCXJvb3QgPSBzYi0+c19yb290Owor
CURpTXVzdFdyaXRlTG9jayhyb290KTsKKwlpbm9kZSA9IHJvb3QtPmRfaW5vZGU7CisJSWlNdXN0
V3JpdGVMb2NrKGlub2RlKTsKKworCWFkZF9icmFuY2ggPSBrbWFsbG9jKHNpemVvZigqYWRkX2Jy
YW5jaCksIEdGUF9LRVJORUwpOworCS8vaWYgKExrdHJDb25kKSB7a2ZyZWUoYWRkX2JyYW5jaCk7
IGFkZF9icmFuY2ggPSBOVUxMO30KKwlpZiAodW5saWtlbHkoIWFkZF9icmFuY2gpKQorCQlnb3Rv
IG91dDsKKworCXN6ID0gc2l6ZW9mKCpicmFuY2hwKSAqIChuZXdfbmJyYW5jaCAtIDEpOworCWlm
ICh1bmxpa2VseSghc3opKQorCQlzeiA9IHNpemVvZigqYnJhbmNocCk7CisJcCA9IGF1X3NiaShz
YiktPnNpX2JyYW5jaDsKKwlicmFuY2hwID0gYXVfa3pyZWFsbG9jKHAsIHN6LCBzaXplb2YoKmJy
YW5jaHApICogbmV3X25icmFuY2gsCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJLy9pZiAoTGt0
ckNvbmQpIGJyYW5jaHAgPSBOVUxMOworCWlmICh1bmxpa2VseSghYnJhbmNocCkpCisJCWdvdG8g
b3V0X2JyOworCWF1X3NiaShzYiktPnNpX2JyYW5jaCA9IGJyYW5jaHA7CisKKwlzeiA9IHNpemVv
ZigqaGRlbnRyeXApICogKG5ld19uYnJhbmNoIC0gMSk7CisJaWYgKHVubGlrZWx5KCFzeikpCisJ
CXN6ID0gc2l6ZW9mKCpoZGVudHJ5cCk7CisJcCA9IGF1X2RpKHJvb3QpLT5kaV9oZGVudHJ5Owor
CWhkZW50cnlwID0gYXVfa3pyZWFsbG9jKHAsIHN6LCBzaXplb2YoKmhkZW50cnlwKSAqIG5ld19u
YnJhbmNoLAorCQkJCUdGUF9LRVJORUwpOworCS8vaWYgKExrdHJDb25kKSBoZGVudHJ5cCA9IE5V
TEw7CisJaWYgKHVubGlrZWx5KCFoZGVudHJ5cCkpCisJCWdvdG8gb3V0X2JyOworCWF1X2RpKHJv
b3QpLT5kaV9oZGVudHJ5ID0gaGRlbnRyeXA7CisKKwlzeiA9IHNpemVvZigqaGlub2RlcCkgKiAo
bmV3X25icmFuY2ggLSAxKTsKKwlpZiAodW5saWtlbHkoIXN6KSkKKwkJc3ogPSBzaXplb2YoKmhp
bm9kZXApOworCXAgPSBhdV9paShpbm9kZSktPmlpX2hpbm9kZTsKKwloaW5vZGVwID0gYXVfa3py
ZWFsbG9jKHAsIHN6LCBzaXplb2YoKmhpbm9kZXApICogbmV3X25icmFuY2gsCisJCQkgICAgICAg
R0ZQX0tFUk5FTCk7CisJLy9pZiAoTGt0ckNvbmQpIGhpbm9kZXAgPSBOVUxMOyAvLyB1bmF2YWls
YWJsZSB0ZXN0CisJaWYgKHVubGlrZWx5KCFoaW5vZGVwKSkKKwkJZ290byBvdXRfYnI7CisJYXVf
aWkoaW5vZGUpLT5paV9oaW5vZGUgPSBoaW5vZGVwOworCXJldHVybiBhZGRfYnJhbmNoOyAvKiBz
dWNjZXNzICovCisKKyBvdXRfYnI6CisJa2ZyZWUoYWRkX2JyYW5jaCk7Cisgb3V0OgorCUF1VHJh
Y2VFcnIoLUVOT01FTSk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cit9CisKKy8qCisgKiB0
ZXN0IGlmIHRoZSBicmFuY2ggcGVybWlzc2lvbiBpcyBsZWdhbCBvciBub3QuCisgKi8KK3N0YXRp
YyBpbnQgdGVzdF9icihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKmlub2Rl
LCBpbnQgYnJwZXJtLAorCQkgICBjaGFyICpwYXRoKQoreworCWludCBlcnI7CisKKwllcnIgPSAw
OworCWlmICh1bmxpa2VseShhdV9icl93cml0YWJsZShicnBlcm0pICYmIElTX1JET05MWShpbm9k
ZSkpKSB7CisJCUF1RXJyKCJ3cml0ZSBwZXJtaXNzaW9uIGZvciByZWFkb25seSBmcyBvciBpbm9k
ZSwgJXNcbiIsIHBhdGgpOworCQllcnIgPSAtRUlOVkFMOworCX0KKworCUF1VHJhY2VFcnIoZXJy
KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogcmV0dXJuczoKKyAqIDA6IHN1Y2Nlc3MsIHRo
ZSBjYWxsZXIgd2lsbCBhZGQgaXQKKyAqIHBsdXM6IHN1Y2Nlc3MsIGl0IGlzIGFscmVhZHkgdW5p
ZmllZCwgdGhlIGNhbGxlciBzaG91bGQgaWdub3JlIGl0CisgKiBtaW51czogZXJyb3IKKyAqLwor
c3RhdGljIGludCB0ZXN0X2FkZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYXVfb3B0
X2FkZCAqYWRkLCBpbnQgcmVtb3VudCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBkZW50cnkgKnJv
b3Q7CisJc3RydWN0IGlub2RlICppbm9kZSwgKmhfaW5vZGU7CisJYXVmc19iaW5kZXhfdCBiZW5k
LCBiaW5kZXg7CisKKwlMS1RSVHJhY2UoIiVzLCByZW1vJWRcbiIsIGFkZC0+cGF0aCwgcmVtb3Vu
dCk7CisKKwlyb290ID0gc2ItPnNfcm9vdDsKKwliZW5kID0gYXVfc2JlbmQoc2IpOworCWlmICh1
bmxpa2VseShiZW5kID49IDAKKwkJICAgICAmJiBhdV9maW5kX2RiaW5kZXgocm9vdCwgYWRkLT5u
ZC5wYXRoLmRlbnRyeSkgPj0gMCkpIHsKKwkJZXJyID0gMTsKKwkJaWYgKCFyZW1vdW50KSB7CisJ
CQllcnIgPSAtRUlOVkFMOworCQkJQXVFcnIoIiVzIGR1cGxpY2F0ZWRcbiIsIGFkZC0+cGF0aCk7
CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gLUVOT1NQQzsgLy8tRTJCSUc7CisJLy9p
ZiAoTGt0ckNvbmQpIGJlbmQgPSBBVUZTX0JSQU5DSF9NQVg7CisJaWYgKHVubGlrZWx5KEFVRlNf
QlJBTkNIX01BWCA8PSBhZGQtPmJpbmRleAorCQkgICAgIHx8IEFVRlNfQlJBTkNIX01BWCAtIDEg
PD0gYmVuZCkpIHsKKwkJQXVFcnIoIm51bWJlciBvZiBicmFuY2hlcyBleGNlZWRlZCAlc1xuIiwg
YWRkLT5wYXRoKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gLUVET007CisJaWYgKHVubGlr
ZWx5KGFkZC0+YmluZGV4IDwgMCB8fCBiZW5kICsgMSA8IGFkZC0+YmluZGV4KSkgeworCQlBdUVy
cigiYmFkIGluZGV4ICVkXG4iLCBhZGQtPmJpbmRleCk7CisJCWdvdG8gb3V0OworCX0KKworCWlu
b2RlID0gYWRkLT5uZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlBdURlYnVnT24oIWlub2RlIHx8
ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKTsKKwllcnIgPSAtRU5PRU5UOworCWlmICh1bmxpa2Vs
eSghaW5vZGUtPmlfbmxpbmspKSB7CisJCUF1RXJyKCJubyBleGlzdGVuY2UgJXNcbiIsIGFkZC0+
cGF0aCk7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IC1FSU5WQUw7CisJaWYgKHVubGlrZWx5
KGlub2RlLT5pX3NiID09IHNiKSkgeworCQlBdUVycigiJXMgbXVzdCBiZSBvdXRzaWRlXG4iLCBh
ZGQtPnBhdGgpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodW5saWtlbHkoYXVfdGVzdF9uZXN0
ZWQoaW5vZGUtPmlfc2IpKSkgeworCQlBdUVycigibmVzdGVkICIgQVVGU19OQU1FICIgJXNcbiIs
IGFkZC0+cGF0aCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh1bmxpa2VseSghc3RyY21wKGF1
X3NidHlwZShpbm9kZS0+aV9zYiksICJ1bmlvbmZzIikpKSB7CisJCUF1RXJyKCJ1bnN1cHBvcnRl
ZCBmaWxlc3lzdGVtLCAlc1xuIiwgYWRkLT5wYXRoKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYg
KHVubGlrZWx5KGF1X3Rlc3RfdW5zdXBwb3J0ZWRfbmZzKGlub2RlLT5pX3NiKSkpIHsKKwkJQXVF
cnIoQXVOb05mc0JyYW5jaE1zZyAiICVzXG4iLCBhZGQtPnBhdGgpOworCQlnb3RvIG91dDsKKwl9
CisKKwllcnIgPSB0ZXN0X2JyKHNiLCBhZGQtPm5kLnBhdGguZGVudHJ5LT5kX2lub2RlLCBhZGQt
PnBlcm0sIGFkZC0+cGF0aCk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0OworCisJ
aWYgKGJlbmQgPCAwKQorCQlyZXR1cm4gMDsgLyogc3VjY2VzcyAqLworCisJaF9pbm9kZSA9IGF1
X2hfZHB0cihyb290LCAwKS0+ZF9pbm9kZTsKKwlpZiAodW5saWtlbHkoYXVfb3B0X3Rlc3QoYXVf
bW50ZmxhZ3Moc2IpLCBXQVJOX1BFUk0pCisJCSAgICAgJiYgKChoX2lub2RlLT5pX21vZGUgJiBT
X0lBTExVR08pCisJCQkgIT0gKGlub2RlLT5pX21vZGUgJiBTX0lBTExVR08pCisJCQkgfHwgaF9p
bm9kZS0+aV91aWQgIT0gaW5vZGUtPmlfdWlkCisJCQkgfHwgaF9pbm9kZS0+aV9naWQgIT0gaW5v
ZGUtPmlfZ2lkKSkpCisJCUF1V2FybigidWlkL2dpZC9wZXJtICVzICV1LyV1LzAlbywgJXUvJXUv
MCVvXG4iLAorCQkgICAgICAgYWRkLT5wYXRoLAorCQkgICAgICAgaW5vZGUtPmlfdWlkLCBpbm9k
ZS0+aV9naWQsIChpbm9kZS0+aV9tb2RlICYgU19JQUxMVUdPKSwKKwkJICAgICAgIGhfaW5vZGUt
PmlfdWlkLCBoX2lub2RlLT5pX2dpZCwKKwkJICAgICAgIChoX2lub2RlLT5pX21vZGUgJiBTX0lB
TExVR08pKTsKKworCWVyciA9IC1FSU5WQUw7CisJZm9yIChiaW5kZXggPSAwOyBiaW5kZXggPD0g
YmVuZDsgYmluZGV4KyspCisJCWlmICh1bmxpa2VseSh0ZXN0X292ZXJsYXAoc2IsIGFkZC0+bmQu
cGF0aC5kZW50cnksCisJCQkJCSAgYXVfaF9kcHRyKHJvb3QsIGJpbmRleCkpKSkgeworCQkJQXVF
cnIoIiVzIGlzIG92ZXJsYXBwZWRcbiIsIGFkZC0+cGF0aCk7CisJCQlnb3RvIG91dDsKKwkJfQor
CWVyciA9IDA7CisKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisK
K3N0YXRpYyBpbnQgYXVfYnJfaW5pdChzdHJ1Y3QgYXVfYnJhbmNoICpiciwgc3RydWN0IHN1cGVy
X2Jsb2NrICpzYiwKKwkJICAgICAgc3RydWN0IGF1X29wdF9hZGQgKmFkZCkKK3sKKwlpbnQgZXJy
OworCisJQXVUcmFjZUVudGVyKCk7CisKKwllcnIgPSAwOworCWF1X3J3X2luaXRfbm9sb2NrKCZi
ci0+YnJfd2hfcndzZW0pOworCWJyLT5icl9wbGluayA9IE5VTEw7CisJYnItPmJyX3doID0gTlVM
TDsKKwlpZiAodW5saWtlbHkoYXVfYnJfd3JpdGFibGUoYWRkLT5wZXJtKSkpIHsKKwkJZXJyID0g
aW5pdF9icl93aChzYiwgLypiaW5kZXgqLy0xLCBiciwgYWRkLT5wZXJtLAorCQkJCSBhZGQtPm5k
LnBhdGguZGVudHJ5LCBhZGQtPm5kLnBhdGgubW50KTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJ
CQlnb3RvIG91dDsKKwl9CisKKwlici0+YnJfeGlubyA9IE5VTEw7CisJYnItPmJyX21udCA9IG1u
dGdldChhZGQtPm5kLnBhdGgubW50KTsKKwlpZiAoYXVfb3B0X3Rlc3QoYXVfbW50ZmxhZ3Moc2Ip
LCBYSU5PKSkgeworCQllcnIgPSBhdV94aW5vX2JyKHNiLCBiciwgYWRkLT5uZC5wYXRoLmRlbnRy
eS0+ZF9pbm9kZS0+aV9pbm8sCisJCQkJIGF1X3NicihzYiwgMCktPmJyX3hpbm8sIC8qZG9fdGVz
dCovMSk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQlBdURlYnVnT24oYnItPmJyX3hpbm8p
OworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlhdG9taWNfc2V0KCZici0+YnJfd2hfcnVubmlu
ZywgMCk7CisJYnItPmJyX2lkID0gYXVfbmV3X2JyX2lkKHNiKTsKKwlici0+YnJfcGVybSA9IGFk
ZC0+cGVybTsKKwlhdG9taWNfc2V0KCZici0+YnJfY291bnQsIDApOworCWJyLT5icl9ieXRlcyA9
IDA7CisJYnItPmJyX3hpbm9fdXBwZXIgPSBBVUZTX1hJTk9fVFJVTkNfSU5JVDsKKwlhdG9taWNf
c2V0KCZici0+YnJfeGlub19ydW5uaW5nLCAwKTsKKwlzeXNhdWZzX2JyX2luaXQoYnIpOworCWJy
LT5icl9nZW5lcmF0aW9uID0gYXVfc2lnZW4oc2IpOworCS8vc21wX21iKCk7IC8qIGF0b21pY19z
ZXQgKi8KKworIG91dDoKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworaW50
IGF1X2JyX2FkZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYXVfb3B0X2FkZCAqYWRk
LCBpbnQgcmVtb3VudCkKK3sKKwlpbnQgZXJyLCBhbW91bnQ7CisJYXVmc19iaW5kZXhfdCBiZW5k
LCBhZGRfYmluZGV4OworCXN0cnVjdCBkZW50cnkgKnJvb3QsICpkZW50cnk7CisJc3RydWN0IGF1
X2lpbmZvICppaW5mbzsKKwlzdHJ1Y3QgYXVfc2JpbmZvICpzYmluZm87CisJc3RydWN0IGF1X2Rp
bmZvICpkaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGUsICppbm9kZTsKKwl1bnNpZ25l
ZCBsb25nIGxvbmcgbWF4YjsKKwlzdHJ1Y3QgYXVfYnJhbmNoICoqYnJhbmNocCwgKmFkZF9icmFu
Y2g7CisJc3RydWN0IGF1X2hkZW50cnkgKmhkZW50cnlwOworCXN0cnVjdCBhdV9oaW5vZGUgKmhp
bm9kZXA7CisKKwlkZW50cnkgPSBhZGQtPm5kLnBhdGguZGVudHJ5OworCUxLVFJUcmFjZSgiYiVk
LCAlcywgMHgleCwgJS4qc1xuIiwKKwkJICBhZGQtPmJpbmRleCwgYWRkLT5wYXRoLCBhZGQtPnBl
cm0sIEF1RExOUGFpcihkZW50cnkpKTsKKwlTaU11c3RXcml0ZUxvY2soc2IpOworCXJvb3QgPSBz
Yi0+c19yb290OworCURpTXVzdFdyaXRlTG9jayhyb290KTsKKwlyb290X2lub2RlID0gcm9vdC0+
ZF9pbm9kZTsKKwlJTXVzdExvY2socm9vdF9pbm9kZSk7CisJSWlNdXN0V3JpdGVMb2NrKHJvb3Rf
aW5vZGUpOworCisJZXJyID0gdGVzdF9hZGQoc2IsIGFkZCwgcmVtb3VudCk7CisJaWYgKHVubGlr
ZWx5KGVyciA8IDApKQorCQlnb3RvIG91dDsKKwlpZiAoZXJyKQorCQlyZXR1cm4gMDsgLyogc3Vj
Y2VzcyAqLworCisJYmVuZCA9IGF1X3NiZW5kKHNiKTsKKwlhZGRfYnJhbmNoID0gYWxsb2NfYWRk
YnIoc2IsIGJlbmQgKyAyKTsKKwllcnIgPSBQVFJfRVJSKGFkZF9icmFuY2gpOworCWlmIChJU19F
UlIoYWRkX2JyYW5jaCkpCisJCWdvdG8gb3V0OworCWVyciA9IGF1X2JyX2luaXQoYWRkX2JyYW5j
aCwgc2IsIGFkZCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJa2ZyZWUoYWRkX2JyYW5jaCk7
CisJCWdvdG8gb3V0OworCX0KKworCWFkZF9iaW5kZXggPSBhZGQtPmJpbmRleDsKKwlpZiAocmVt
b3VudCkKKwkJc3lzYXVmc19icnNfZGVsKHNiLCBhZGRfYmluZGV4KTsKKworCXNiaW5mbyA9IGF1
X3NiaShzYik7CisJZGluZm8gPSBhdV9kaShyb290KTsKKwlpaW5mbyA9IGF1X2lpKHJvb3RfaW5v
ZGUpOworCisJYW1vdW50ID0gYmVuZCArIDEgLSBhZGRfYmluZGV4OworCWJyYW5jaHAgPSBzYmlu
Zm8tPnNpX2JyYW5jaCArIGFkZF9iaW5kZXg7CisJbWVtbW92ZShicmFuY2hwICsgMSwgYnJhbmNo
cCwgc2l6ZW9mKCpicmFuY2hwKSAqIGFtb3VudCk7CisJKmJyYW5jaHAgPSBhZGRfYnJhbmNoOwor
CWhkZW50cnlwID0gZGluZm8tPmRpX2hkZW50cnkgKyBhZGRfYmluZGV4OworCW1lbW1vdmUoaGRl
bnRyeXAgKyAxLCBoZGVudHJ5cCwgc2l6ZW9mKCpoZGVudHJ5cCkgKiBhbW91bnQpOworCWF1X2hf
ZGVudHJ5X2luaXQoaGRlbnRyeXApOworCWhpbm9kZXAgPSBpaW5mby0+aWlfaGlub2RlICsgYWRk
X2JpbmRleDsKKwltZW1tb3ZlKGhpbm9kZXAgKyAxLCBoaW5vZGVwLCBzaXplb2YoKmhpbm9kZXAp
ICogYW1vdW50KTsKKwloaW5vZGVwLT5oaV9pbm9kZSA9IE5VTEw7CisJYXVfaGluX2luaXQoaGlu
b2RlcCwgTlVMTCk7CisKKwlzYmluZm8tPnNpX2JlbmQrKzsKKwlkaW5mby0+ZGlfYmVuZCsrOwor
CWlpbmZvLT5paV9iZW5kKys7CisJaWYgKHVubGlrZWx5KGJlbmQgPCAwKSkgeworCQlzYmluZm8t
PnNpX2JlbmQgPSAwOworCQlkaW5mby0+ZGlfYnN0YXJ0ID0gMDsKKwkJaWluZm8tPmlpX2JzdGFy
dCA9IDA7CisJfQorCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWF1X3NldF9oX2RwdHIocm9v
dCwgYWRkX2JpbmRleCwgZGdldChkZW50cnkpKTsKKwlhdV9zZXRfaF9pcHRyKHJvb3RfaW5vZGUs
IGFkZF9iaW5kZXgsIGlncmFiKGlub2RlKSwgMCk7CisJaWYgKHJlbW91bnQpCisJCXN5c2F1ZnNf
YnJzX2FkZChzYiwgYWRkX2JpbmRleCk7CisKKwlpZiAoIWFkZF9iaW5kZXgpCisJCWF1X2NwdXBf
YXR0cl9hbGwocm9vdF9pbm9kZSk7CisJZWxzZQorCQlhdV9hZGRfbmxpbmsocm9vdF9pbm9kZSwg
aW5vZGUpOworCW1heGIgPSBkZW50cnktPmRfc2ItPnNfbWF4Ynl0ZXM7CisJaWYgKHNiLT5zX21h
eGJ5dGVzIDwgbWF4YikKKwkJc2ItPnNfbWF4Ynl0ZXMgPSBtYXhiOworCisgb3V0OgorCUF1VHJh
Y2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNk
ZWZpbmUgQXVWZXJib3NlKGRvX2luZm8sIGZtdCwgYXJncy4uLikgZG8geyBcCisJaWYgKCFkb19p
bmZvKSBcCisJCUxLVFJUcmFjZShmbXQsICMjYXJncyk7IFwKKwllbHNlIFwKKwkJQXVJbmZvKGZt
dCwgIyNhcmdzKTsgXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIHRlc3QgaWYgdGhlIGJyYW5jaCBp
cyBkZWxldGFibGUgb3Igbm90LgorICovCitzdGF0aWMgaW50IHRlc3RfZGVudHJ5X2J1c3koc3Ry
dWN0IGRlbnRyeSAqcm9vdCwgYXVmc19iaW5kZXhfdCBiaW5kZXgsCisJCQkgICAgYXVfZ2VuX3Qg
c2lnZW4pCit7CisJaW50IGVyciwgaSwgaiwgbmRlbnRyeSwgdmVyYm9zZTsKKwlzdHJ1Y3QgYXVf
ZGNzdWJfcGFnZXMgZHBhZ2VzOworCXN0cnVjdCBhdV9kcGFnZSAqZHBhZ2U7CisJc3RydWN0IGRl
bnRyeSAqZDsKKwlhdWZzX2JpbmRleF90IGJzdGFydCwgYmVuZDsKKwlzdHJ1Y3QgaW5vZGUgKmlu
b2RlOworCisJTEtUUlRyYWNlKCJiJWQsIGdlbiVkXG4iLCBiaW5kZXgsIHNpZ2VuKTsKKwlTaU11
c3RXcml0ZUxvY2socm9vdC0+ZF9zYik7CisKKwllcnIgPSBhdV9kcGFnZXNfaW5pdCgmZHBhZ2Vz
LCBHRlBfVEVNUE9SQVJZKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXQ7CisJZXJy
ID0gYXVfZGNzdWJfcGFnZXMoJmRwYWdlcywgcm9vdCwgTlVMTCwgTlVMTCk7CisJaWYgKHVubGlr
ZWx5KGVycikpCisJCWdvdG8gb3V0X2RwYWdlczsKKworCXZlcmJvc2UgPSAhIWF1X29wdF90ZXN0
KGF1X21udGZsYWdzKHJvb3QtPmRfc2IpLCBWRVJCT1NFKTsKKwlmb3IgKGkgPSAwOyAhZXJyICYm
IGkgPCBkcGFnZXMubmRwYWdlOyBpKyspIHsKKwkJZHBhZ2UgPSBkcGFnZXMuZHBhZ2VzICsgaTsK
KwkJbmRlbnRyeSA9IGRwYWdlLT5uZGVudHJ5OworCQlmb3IgKGogPSAwOyAhZXJyICYmIGogPCBu
ZGVudHJ5OyBqKyspIHsKKwkJCWQgPSBkcGFnZS0+ZGVudHJpZXNbal07CisJCQlBdURlYnVnT24o
IWF0b21pY19yZWFkKCZkLT5kX2NvdW50KSk7CisJCQlpbm9kZSA9IGQtPmRfaW5vZGU7CisJCQlB
dURlYnVnT24oIWlub2RlKTsKKwkJCWlmIChhdV9kaWdlbihkKSA9PSBzaWdlbgorCQkJICAgICYm
IGF1X2lpZ2VuKGlub2RlKSA9PSBzaWdlbikKKwkJCQlkaV9yZWFkX2xvY2tfY2hpbGQoZCwgQXVM
b2NrX0lSKTsKKwkJCWVsc2UgeworCQkJCWRpX3dyaXRlX2xvY2tfY2hpbGQoZCk7CisJCQkJZXJy
ID0gYXVfcmV2YWxfZHBhdGgoZCwgc2lnZW4pOworCQkJCWlmICghZXJyKQorCQkJCQlkaV9kb3du
Z3JhZGVfbG9jayhkLCBBdUxvY2tfSVIpOworCQkJCWVsc2UgeworCQkJCQlkaV93cml0ZV91bmxv
Y2soZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJYnN0YXJ0ID0gYXVfZGJzdGFy
dChkKTsKKwkJCWJlbmQgPSBhdV9kYmVuZChkKTsKKwkJCWlmIChic3RhcnQgPD0gYmluZGV4CisJ
CQkgICAgJiYgYmluZGV4IDw9IGJlbmQKKwkJCSAgICAmJiBhdV9oX2RwdHIoZCwgYmluZGV4KQor
CQkJICAgICYmICghU19JU0RJUihkLT5kX2lub2RlLT5pX21vZGUpCisJCQkJfHwgYnN0YXJ0ID09
IGJlbmQpKSB7CisJCQkJZXJyID0gLUVCVVNZOworCQkJCUF1VmVyYm9zZSh2ZXJib3NlLCAiYnVz
eSAlLipzXG4iLCBBdURMTlBhaXIoZCkpOworCQkJfQorCQkJZGlfcmVhZF91bmxvY2soZCwgQXVM
b2NrX0lSKTsKKwkJfQorCX0KKworIG91dF9kcGFnZXM6CisJYXVfZHBhZ2VzX2ZyZWUoJmRwYWdl
cyk7Cisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMg
aW50IHRlc3RfaW5vZGVfYnVzeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRleF90
IGJpbmRleCwKKwkJCSAgIGF1X2dlbl90IHNpZ2VuKQoreworCWludCBlcnIsIHZlcmJvc2U7CisJ
c3RydWN0IGlub2RlICppOworCWF1ZnNfYmluZGV4X3QgYnN0YXJ0LCBiZW5kOworCisJTEtUUlRy
YWNlKCJiJWQsIGdlbiVkXG4iLCBiaW5kZXgsIHNpZ2VuKTsKKwlTaU11c3RXcml0ZUxvY2soc2Ip
OworCisJZXJyID0gMDsKKwl2ZXJib3NlID0gISFhdV9vcHRfdGVzdChhdV9tbnRmbGFncyhzYiks
IFZFUkJPU0UpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJnNiLT5zX2lub2RlcywgaV9zYl9s
aXN0KSB7CisJCUF1RGVidWdPbighYXRvbWljX3JlYWQoJmktPmlfY291bnQpKTsKKwkJaWYgKCFs
aXN0X2VtcHR5KCZpLT5pX2RlbnRyeSkpCisJCQljb250aW51ZTsKKworCQlpZiAoYXVfaWlnZW4o
aSkgPT0gc2lnZW4pCisJCQlpaV9yZWFkX2xvY2tfY2hpbGQoaSk7CisJCWVsc2UgeworCQkJaWlf
d3JpdGVfbG9ja19jaGlsZChpKTsKKwkJCWVyciA9IGF1X3JlZnJlc2hfaGlub2RlX3NlbGYoaSk7
CisJCQlpZiAoIWVycikKKwkJCQlpaV9kb3duZ3JhZGVfbG9jayhpKTsKKwkJCWVsc2UgeworCQkJ
CWlpX3dyaXRlX3VubG9jayhpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWJzdGFydCA9
IGF1X2lic3RhcnQoaSk7CisJCWJlbmQgPSBhdV9pYmVuZChpKTsKKwkJaWYgKGJzdGFydCA8PSBi
aW5kZXgKKwkJICAgICYmIGJpbmRleCA8PSBiZW5kCisJCSAgICAmJiBhdV9oX2lwdHIoaSwgYmlu
ZGV4KQorCQkgICAgJiYgKCFTX0lTRElSKGktPmlfbW9kZSkgfHwgYnN0YXJ0ID09IGJlbmQpKSB7
CisJCQllcnIgPSAtRUJVU1k7CisJCQlBdVZlcmJvc2UodmVyYm9zZSwgImJ1c3kgaSVsdVxuIiwg
aS0+aV9pbm8pOworCQkJLy9hdV9kZWJ1Z19vbigpOworCQkJLy9EYmdJbm9kZShpKTsKKwkJCS8v
YXVfZGVidWdfb2ZmKCk7CisJCQlpaV9yZWFkX3VubG9jayhpKTsKKwkJCWJyZWFrOworCQl9CisJ
CWlpX3JlYWRfdW5sb2NrKGkpOworCX0KKworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJy
OworfQorCitzdGF0aWMgaW50IHRlc3RfY2hpbGRyZW5fYnVzeShzdHJ1Y3QgZGVudHJ5ICpyb290
LCBhdWZzX2JpbmRleF90IGJpbmRleCkKK3sKKwlpbnQgZXJyOworCWF1X2dlbl90IHNpZ2VuOwor
CisJTEtUUlRyYWNlKCJiJWRcbiIsIGJpbmRleCk7CisJU2lNdXN0V3JpdGVMb2NrKHJvb3QtPmRf
c2IpOworCURpTXVzdFdyaXRlTG9jayhyb290KTsKKwkvL3RvZG86IGRvbnQgdHJ1c3QgQktMLgor
CUF1RGVidWdPbigha2VybmVsX2xvY2tlZCgpKTsKKworCXNpZ2VuID0gYXVfc2lnZW4ocm9vdC0+
ZF9zYik7CisJRGlNdXN0Tm9XYWl0ZXJzKHJvb3QpOworCUlpTXVzdE5vV2FpdGVycyhyb290LT5k
X2lub2RlKTsKKwlkaV93cml0ZV91bmxvY2socm9vdCk7CisJZXJyID0gdGVzdF9kZW50cnlfYnVz
eShyb290LCBiaW5kZXgsIHNpZ2VuKTsKKwlpZiAoIWVycikKKwkJZXJyID0gdGVzdF9pbm9kZV9i
dXN5KHJvb3QtPmRfc2IsIGJpbmRleCwgc2lnZW4pOworCWRpX3dyaXRlX2xvY2tfY2hpbGQocm9v
dCk7IC8qIGF1ZnNfd3JpdGVfbG9jaygpIGNhbGxzIC4uLl9jaGlsZCgpICovCisKKwlBdVRyYWNl
RXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworaW50IGF1X2JyX2RlbChzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiLCBzdHJ1Y3QgYXVfb3B0X2RlbCAqZGVsLCBpbnQgcmVtb3VudCkKK3sKKwlpbnQg
ZXJyLCBkb193aCwgcmVyciwgdmVyYm9zZTsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290OworCXN0cnVj
dCBpbm9kZSAqaW5vZGUsICpoaWRkZW5fZGlyOworCWF1ZnNfYmluZGV4X3QgYmluZGV4LCBiZW5k
LCBicl9pZDsKKwlzdHJ1Y3QgYXVfc2JpbmZvICpzYmluZm87CisJc3RydWN0IGF1X2RpbmZvICpk
aW5mbzsKKwlzdHJ1Y3QgYXVfaWluZm8gKmlpbmZvOworCXN0cnVjdCBhdV9icmFuY2ggKmJyOwor
CXVuc2lnbmVkIGludCBtbnRfZmxhZ3M7CisKKwkvL2F1X2RlYnVnX29uKCk7CisJTEtUUlRyYWNl
KCIlcywgJS4qc1xuIiwgZGVsLT5wYXRoLCBBdURMTlBhaXIoZGVsLT5oX3Jvb3QpKTsKKwlTaU11
c3RXcml0ZUxvY2soc2IpOworCXJvb3QgPSBzYi0+c19yb290OworCURpTXVzdFdyaXRlTG9jayhy
b290KTsKKwlpbm9kZSA9IHJvb3QtPmRfaW5vZGU7CisJSWlNdXN0V3JpdGVMb2NrKGlub2RlKTsK
KworCWVyciA9IDA7CisJYmluZGV4ID0gYXVfZmluZF9kYmluZGV4KHJvb3QsIGRlbC0+aF9yb290
KTsKKwlpZiAoYmluZGV4IDwgMCkgeworCQlpZiAocmVtb3VudCkKKwkJCWdvdG8gb3V0OyAvKiBz
dWNjZXNzICovCisJCWVyciA9IC1FTk9FTlQ7CisJCUF1RXJyKCIlcyBubyBzdWNoIGJyYW5jaFxu
IiwgZGVsLT5wYXRoKTsKKwkJZ290byBvdXQ7CisJfQorCUxLVFJUcmFjZSgiYmluZGV4IGIlZFxu
IiwgYmluZGV4KTsKKworCWVyciA9IC1FQlVTWTsKKwltbnRfZmxhZ3MgPSBhdV9tbnRmbGFncyhz
Yik7CisJdmVyYm9zZSA9IGF1X29wdF90ZXN0KG1udF9mbGFncywgVkVSQk9TRSk7CisJYmVuZCA9
IGF1X3NiZW5kKHNiKTsKKwlpZiAodW5saWtlbHkoIWJlbmQpKSB7CisJCUF1VmVyYm9zZSh2ZXJi
b3NlLCAibm8gbW9yZSBicmFuY2hlcyBsZWZ0XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCWJyID0g
YXVfc2JyKHNiLCBiaW5kZXgpOworCWlmICh1bmxpa2VseShhdV9icl9jb3VudChicikpKSB7CisJ
CUF1VmVyYm9zZSh2ZXJib3NlLCAiJWQgZmlsZShzKSBvcGVuZWRcbiIsIGF1X2JyX2NvdW50KGJy
KSk7CisJCWdvdG8gb3V0OworCX0KKworCWRvX3doID0gMDsKKwloaWRkZW5fZGlyID0gZGVsLT5o
X3Jvb3QtPmRfaW5vZGU7CisJaWYgKGJyLT5icl93aCB8fCBici0+YnJfcGxpbmspIHsKKwkJZHB1
dChici0+YnJfd2gpOworCQlkcHV0KGJyLT5icl9wbGluayk7CisJCWJyLT5icl9wbGluayA9IE5V
TEw7CisJCWJyLT5icl93aCA9IE5VTEw7CisJCWRvX3doID0gMTsKKwl9CisKKwllcnIgPSB0ZXN0
X2NoaWxkcmVuX2J1c3kocm9vdCwgYmluZGV4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlp
ZiAodW5saWtlbHkoZG9fd2gpKQorCQkJZ290byBvdXRfd2g7CisJCWdvdG8gb3V0OworCX0KKwor
CWVyciA9IDA7CisJaWYgKHJlbW91bnQpCisJCXN5c2F1ZnNfYnJzX2RlbChzYiwgYmluZGV4KTsK
KwlzYmluZm8gPSBhdV9zYmkoc2IpOworCWRpbmZvID0gYXVfZGkocm9vdCk7CisJaWluZm8gPSBh
dV9paShpbm9kZSk7CisKKwlkcHV0KGF1X2hfZHB0cihyb290LCBiaW5kZXgpKTsKKwlhdV9oaXB1
dChpaW5mby0+aWlfaGlub2RlICsgYmluZGV4KTsKKwlicl9pZCA9IGJyLT5icl9pZDsKKwlmcmVl
X2JyYW5jaChicik7CisKKwkvL3RvZG86IHJlYWxsb2MgYW5kIHNocmluayBtZW1vcnkKKwlpZiAo
YmluZGV4IDwgYmVuZCkgeworCQljb25zdCBhdWZzX2JpbmRleF90IG4gPSBiZW5kIC0gYmluZGV4
OworCQlzdHJ1Y3QgYXVfYnJhbmNoICoqYnJwOworCQlzdHJ1Y3QgYXVfaGRlbnRyeSAqaGRwOwor
CQlzdHJ1Y3QgYXVfaGlub2RlICpoaXA7CisKKwkJYnJwID0gc2JpbmZvLT5zaV9icmFuY2ggKyBi
aW5kZXg7CisJCW1lbW1vdmUoYnJwLCBicnAgKyAxLCBzaXplb2YoKmJycCkgKiBuKTsKKwkJaGRw
ID0gZGluZm8tPmRpX2hkZW50cnkgKyBiaW5kZXg7CisJCW1lbW1vdmUoaGRwLCBoZHAgKyAxLCBz
aXplb2YoKmhkcCkgKiBuKTsKKwkJaGlwID0gaWluZm8tPmlpX2hpbm9kZSArIGJpbmRleDsKKwkJ
bWVtbW92ZShoaXAsIGhpcCArIDEsIHNpemVvZigqaGlwKSAqIG4pOworCX0KKwlzYmluZm8tPnNp
X2JyYW5jaFswICsgYmVuZF0gPSBOVUxMOworCWRpbmZvLT5kaV9oZGVudHJ5WzAgKyBiZW5kXS5o
ZF9kZW50cnkgPSBOVUxMOworCWlpbmZvLT5paV9oaW5vZGVbMCArIGJlbmRdLmhpX2lub2RlID0g
TlVMTDsKKwlhdV9oaW5faW5pdChpaW5mby0+aWlfaGlub2RlICsgYmVuZCwgTlVMTCk7CisKKwlz
YmluZm8tPnNpX2JlbmQtLTsKKwlkaW5mby0+ZGlfYmVuZC0tOworCWlpbmZvLT5paV9iZW5kLS07
CisJaWYgKHJlbW91bnQpCisJCXN5c2F1ZnNfYnJzX2FkZChzYiwgYmluZGV4KTsKKworCWlmICgh
YmluZGV4KQorCQlhdV9jcHVwX2F0dHJfYWxsKGlub2RlKTsKKwllbHNlCisJCWF1X3N1Yl9ubGlu
ayhpbm9kZSwgZGVsLT5oX3Jvb3QtPmRfaW5vZGUpOworCWlmIChhdV9vcHRfdGVzdChtbnRfZmxh
Z3MsIFBMSU5LKSkKKwkJYXVfcGxpbmtfaGFsZl9yZWZyZXNoKHNiLCBicl9pZCk7CisKKwlpZiAo
c2ItPnNfbWF4Ynl0ZXMgPT0gZGVsLT5oX3Jvb3QtPmRfc2ItPnNfbWF4Ynl0ZXMpIHsKKwkJYmVu
ZC0tOworCQlzYi0+c19tYXhieXRlcyA9IDA7CisJCWZvciAoYmluZGV4ID0gMDsgYmluZGV4IDw9
IGJlbmQ7IGJpbmRleCsrKSB7CisJCQl1bnNpZ25lZCBsb25nIGxvbmcgbWF4YjsKKwkJCW1heGIg
PSBhdV9zYnJfc2Ioc2IsIGJpbmRleCktPnNfbWF4Ynl0ZXM7CisJCQlpZiAoc2ItPnNfbWF4Ynl0
ZXMgPCBtYXhiKQorCQkJCXNiLT5zX21heGJ5dGVzID0gbWF4YjsKKwkJfQorCX0KKwlnb3RvIG91
dDsgLyogc3VjY2VzcyAqLworCisgb3V0X3doOgorCS8qIHJldmVydCAqLworCXJlcnIgPSBpbml0
X2JyX3doKHNiLCBiaW5kZXgsIGJyLCBici0+YnJfcGVybSwgZGVsLT5oX3Jvb3QsIGJyLT5icl9t
bnQpOworCWlmIChyZXJyKQorCQlBdVdhcm4oImZhaWxlZCByZS1jcmVhdGluZyBiYXNlIHdoaXRl
b3V0LCAlcy4gKCVkKVxuIiwKKwkJICAgICAgIGRlbC0+cGF0aCwgcmVycik7Cisgb3V0OgorCUF1
VHJhY2VFcnIoZXJyKTsKKwkvL2F1X2RlYnVnX29mZigpOworCXJldHVybiBlcnI7Cit9CisKK3N0
YXRpYyBpbnQgZG9fbmVlZF9zaWdlbl9pbmMoaW50IGEsIGludCBiKQoreworCXJldHVybiAoYXVf
YnJfd2hhYmxlKGEpICYmICFhdV9icl93aGFibGUoYikpOworfQorCitzdGF0aWMgaW50IG5lZWRf
c2lnZW5faW5jKGludCBvbGQsIGludCBuZXcpCit7CisJcmV0dXJuIChkb19uZWVkX3NpZ2VuX2lu
YyhvbGQsIG5ldykKKwkJfHwgZG9fbmVlZF9zaWdlbl9pbmMobmV3LCBvbGQpKTsKK30KKworaW50
IGF1X2JyX21vZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYXVfb3B0X21vZCAqbW9k
LCBpbnQgcmVtb3VudCwKKwkgICAgICBpbnQgKmRvX3VwZGF0ZSkKK3sKKwlpbnQgZXJyOworCXN0
cnVjdCBkZW50cnkgKnJvb3Q7CisJYXVmc19iaW5kZXhfdCBiaW5kZXg7CisJc3RydWN0IGF1X2Jy
YW5jaCAqYnI7CisJc3RydWN0IGlub2RlICpoaWRkZW5fZGlyOworCisJTEtUUlRyYWNlKCIlcywg
JS4qcywgMHgleFxuIiwKKwkJICBtb2QtPnBhdGgsIEF1RExOUGFpcihtb2QtPmhfcm9vdCksIG1v
ZC0+cGVybSk7CisJU2lNdXN0V3JpdGVMb2NrKHNiKTsKKwlyb290ID0gc2ItPnNfcm9vdDsKKwlE
aU11c3RXcml0ZUxvY2socm9vdCk7CisJSWlNdXN0V3JpdGVMb2NrKHJvb3QtPmRfaW5vZGUpOwor
CisJYmluZGV4ID0gYXVfZmluZF9kYmluZGV4KHJvb3QsIG1vZC0+aF9yb290KTsKKwlpZiAoYmlu
ZGV4IDwgMCkgeworCQlpZiAocmVtb3VudCkKKwkJCXJldHVybiAwOyAvKiBzdWNjZXNzICovCisJ
CWVyciA9IC1FTk9FTlQ7CisJCUF1RXJyKCIlcyBubyBzdWNoIGJyYW5jaFxuIiwgbW9kLT5wYXRo
KTsKKwkJZ290byBvdXQ7CisJfQorCUxLVFJUcmFjZSgiYmluZGV4IGIlZFxuIiwgYmluZGV4KTsK
KworCWhpZGRlbl9kaXIgPSBtb2QtPmhfcm9vdC0+ZF9pbm9kZTsKKwllcnIgPSB0ZXN0X2JyKHNi
LCBoaWRkZW5fZGlyLCBtb2QtPnBlcm0sIG1vZC0+cGF0aCk7CisJaWYgKHVubGlrZWx5KGVycikp
CisJCWdvdG8gb3V0OworCisJYnIgPSBhdV9zYnIoc2IsIGJpbmRleCk7CisJaWYgKGJyLT5icl9w
ZXJtID09IG1vZC0+cGVybSkKKwkJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKworCWlmIChhdV9i
cl93cml0YWJsZShici0+YnJfcGVybSkpIHsKKwkJLyogcmVtb3ZlIHdoaXRlb3V0IGJhc2UgKi8K
KwkJLy90b2RvOiBtb2QtPnBlcm0/CisJCWVyciA9IGluaXRfYnJfd2goc2IsIGJpbmRleCwgYnIs
IEF1QnJfUk8sIG1vZC0+aF9yb290LAorCQkJCSBici0+YnJfbW50KTsKKwkJaWYgKHVubGlrZWx5
KGVycikpCisJCQlnb3RvIG91dDsKKworCQlpZiAoIWF1X2JyX3dyaXRhYmxlKG1vZC0+cGVybSkp
IHsKKwkJCS8qIHJ3IC0tPiBybywgZmlsZSBtaWdodCBiZSBtbWFwcGVkICovCisJCQlzdHJ1Y3Qg
ZmlsZSAqZmlsZSwgKmhmOworCisJCQlEaU11c3ROb1dhaXRlcnMocm9vdCk7CisJCQlJaU11c3RO
b1dhaXRlcnMocm9vdC0+ZF9pbm9kZSk7CisJCQlkaV93cml0ZV91bmxvY2socm9vdCk7CisKKwkJ
CS8qCisJCQkgKiBubyBuZWVkIGZpbGVfbGlzdF9sb2NrKCkKKwkJCSAqIHNpbmNlIEJLTCAoYW5k
IHNiaW5mbykgaXMgbG9ja2VkCisJCQkgKi8KKwkJCUF1RGVidWdPbigha2VybmVsX2xvY2tlZCgp
KTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmlsZSwgJnNiLT5zX2ZpbGVzLCBmX3UuZnVfbGlz
dCkgeworCQkJCUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVETE5QYWlyKGZpbGUtPmZfZGVudHJ5KSk7
CisJCQkJaWYgKCFhdV90ZXN0X2F1ZnNfZmlsZShmaWxlKSkKKwkJCQkJY29udGludWU7CisKKwkJ
CQlmaV9yZWFkX2xvY2soZmlsZSk7CisJCQkJaWYgKCFTX0lTUkVHKGZpbGUtPmZfZGVudHJ5LT5k
X2lub2RlLT5pX21vZGUpCisJCQkJICAgIHx8ICEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUp
CisJCQkJICAgIHx8IGF1X2Zic3RhcnQoZmlsZSkgIT0gYmluZGV4KSB7CisJCQkJCUZpTXVzdE5v
V2FpdGVycyhmaWxlKTsKKwkJCQkJZmlfcmVhZF91bmxvY2soZmlsZSk7CisJCQkJCWNvbnRpbnVl
OworCQkJCX0KKworCQkJCWlmICh1bmxpa2VseShhdV90ZXN0X21tYXBwZWQoZmlsZSkpKSB7CisJ
CQkJCWVyciA9IC1FQlVTWTsKKwkJCQkJRmlNdXN0Tm9XYWl0ZXJzKGZpbGUpOworCQkJCQlmaV9y
ZWFkX3VubG9jayhmaWxlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gdG9kbzogYWxy
ZWFkeSBmbHVzaGVkPworCQkJCWhmID0gYXVfaF9mcHRyKGZpbGUsIGF1X2Zic3RhcnQoZmlsZSkp
OworCQkJCWhmLT5mX2ZsYWdzID0gYXVfZmlsZV9yb2ZsYWdzKGhmLT5mX2ZsYWdzKTsKKwkJCQlo
Zi0+Zl9tb2RlICY9IH5GTU9ERV9XUklURTsKKwkJCQlwdXRfd3JpdGVfYWNjZXNzKGhmLT5mX2Rl
bnRyeS0+ZF9pbm9kZSk7CisJCQkJRmlNdXN0Tm9XYWl0ZXJzKGZpbGUpOworCQkJCWZpX3JlYWRf
dW5sb2NrKGZpbGUpOworCQkJfQorCisJCQkvKiBhdWZzX3dyaXRlX2xvY2soKSBjYWxscyAuLi5f
Y2hpbGQoKSAqLworCQkJZGlfd3JpdGVfbG9ja19jaGlsZChyb290KTsKKwkJfQorCX0KKworCWlm
ICghZXJyKSB7CisJCSpkb191cGRhdGUgfD0gbmVlZF9zaWdlbl9pbmMoYnItPmJyX3Blcm0sIG1v
ZC0+cGVybSk7CisJCWJyLT5icl9wZXJtID0gbW9kLT5wZXJtOworCX0KKworIG91dDoKKwlBdVRy
YWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40LXVu
aW9uZnMub3JpZy9mcy9hdWZzL2JyYW5jaC5oIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVm
cy9icmFuY2guaAotLS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvYnJhbmNo
LmgJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQtdW5pb25mcy9m
cy9hdWZzL2JyYW5jaC5oCTIwMDgtMDUtMjUgMTE6NTY6MDggKzAzMDAKQEAgLTAsMCArMSwzMjQg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAqCisg
KiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdy
aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8q
CisgKiBicmFuY2ggZmlsZXN5c3RlbXMgYW5kIHhpbm8gZm9yIHRoZW0KKyAqCisgKiAkSWQ6IGJy
YW5jaC5oLHYgMS4zIDIwMDgvMDQvMjggMDM6MDM6MzIgc2Zqcm8gRXhwICQKKyAqLworCisjaWZu
ZGVmIF9fQVVGU19CUkFOQ0hfSF9fCisjZGVmaW5lIF9fQVVGU19CUkFOQ0hfSF9fCisKKyNpZmRl
ZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21v
dW50Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWZzX3R5
cGUuaD4KKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAic3VwZXIuaCIKKworLyogLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLworCisvKiBhbiBlbnRyeSBpbiBhIHhpbm8gZmlsZSAqLworc3RydWN0IGF1X3hp
bm9fZW50cnkgeworCWlub190IGlubzsKKwkvL19fdTMyIGhfZ2VuOworfSBfX3BhY2tlZDsKKwor
Ly8jZGVmaW5lIEF1WGlub19JTlZBTElEX0hHRU4JKC0xKQorCisvKiBhIHhpbm8gZmlsZSAqLwor
c3RydWN0IGF1X3hpbm9fZmlsZSB7CisJLy9zdHJ1Y3QgZmlsZQkJKip4aV9maWxlOworCXN0cnVj
dCBmaWxlCQkqeGlfZmlsZTsKKworCS8qIGFycmF5IG1hbmFnZW1lbnQgKi8KKwkvL3Vuc2lnbmVk
IGxvbmcgbG9uZwl4aV9saW1pdDsJLyogTWF4IHhpbm8gZmlsZSBzaXplICovCisJLy91bnNpZ25l
ZCBsb25nIGxvbmcJeGlfc2l6ZTsgLyogc19tYXhieXRlcyAqLworCisJLyogdHJ1bmNhdGlvbiAq
LworCWJsa2NudF90CQl4aV91cHBlcjsJLyogd2F0ZXJtYXJrIGluIGJsb2NrcyAqLworCS8vdTY0
CQkJeGlfdXBwZXI7CS8qIHdhdGVybWFyayBpbiBieXRlcyAqLworCS8vdTY0CQkJeGlfc3RlcDsJ
LyogdG8gbmV4dCB3YXRlcm1hcmsgaW4gYnl0ZXMgKi8KKwlhdG9taWNfdCAJCXhpX3J1bm5pbmc7
Cit9OworCisvKiBwcm90ZWN0ZWQgYnkgc3VwZXJibG9jayByd3NlbSAqLworc3RydWN0IGF1X2Jy
YW5jaCB7CisJc3RydWN0IGZpbGUJCSpicl94aW5vOworCS8vc3RydWN0IGF1X3hpbm9fZmlsZQkJ
KmJyX3hpbm87CisKKwlhdWZzX2JpbmRleF90CQlicl9pZDsKKworCWludAkJCWJyX3Blcm07CisJ
c3RydWN0IHZmc21vdW50CQkqYnJfbW50OworCWF0b21pY190CQlicl9jb3VudDsKKworCS8qIHdo
aXRlb3V0IGJhc2UgKi8KKwlzdHJ1Y3QgYXVfcndzZW0JCWJyX3doX3J3c2VtOworCXN0cnVjdCBk
ZW50cnkJCSpicl93aDsKKwlhdG9taWNfdCAJCWJyX3doX3J1bm5pbmc7CisKKwkvKiBwc2V1ZG8t
bGluayBkaXIgKi8KKwlzdHJ1Y3QgZGVudHJ5CQkqYnJfcGxpbms7CisKKwkvKiB4aW5vIHRydW5j
YXRpb24gKi8KKwlibGtjbnRfdAkJYnJfeGlub191cHBlcjsJLyogd2F0ZXJtYXJrIGluIGJsb2Nr
cyAqLworCWF0b21pY190CQlicl94aW5vX3J1bm5pbmc7CisKKwkvKiBtZnMgbW9kZSAqLworCXU2
NAkJCWJyX2J5dGVzOworCisjaWZkZWYgQ09ORklHX1NZU0ZTCisJLyogYW4gZW50cnkgdW5kZXIg
c3lzZnMgcGVyIG1vdW50LXBvaW50ICovCisJY2hhcgkJCWJyX25hbWVbOF07CisJc3RydWN0IGF0
dHJpYnV0ZQlicl9hdHRyOworI2VuZGlmCisKKwlhdV9nZW5fdAkJYnJfZ2VuZXJhdGlvbjsKK307
CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogYnJhbmNoIHBlcm1pc3Npb24gYW5kIGF0dHJp
YnV0ZSAqLworZW51bSB7CisJQXVCcl9SVywJCS8qIHdyaXRhYmxlLCBsaW5rYWJsZSB3aCAqLwor
CUF1QnJfUk8sCQkvKiByZWFkb25seSwgbm8gd2ggKi8KKwlBdUJyX1JSLAkJLyogbmF0aXZlbHkg
cmVhZG9ubHksIG5vIHdoICovCisKKwlBdUJyX1JXTm9MaW5rV0gsCS8qIHVuLWxpbmthYmxlIHdo
aXRlb3V0cyAqLworCisJQXVCcl9ST1dILAorCUF1QnJfUlJXSCwJCS8qIHdoaXRlb3V0LWFibGUg
Ki8KKworCUF1QnJfTGFzdAorfTsKKworc3RhdGljIGlubGluZSBpbnQgYXVfYnJfd3JpdGFibGUo
aW50IGJycGVybSkKK3sKKwlyZXR1cm4gKGJycGVybSA9PSBBdUJyX1JXIHx8IGJycGVybSA9PSBB
dUJyX1JXTm9MaW5rV0gpOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdV9icl93aGFibGUoaW50
IGJycGVybSkKK3sKKwlyZXR1cm4gKGJycGVybSA9PSBBdUJyX1JXCisJCXx8IGJycGVybSA9PSBB
dUJyX1JPV0gKKwkJfHwgYnJwZXJtID09IEF1QnJfUlJXSCk7Cit9CisKK3N0YXRpYyBpbmxpbmUg
aW50IGF1X2JyX2hpbm90aWZ5YWJsZShpbnQgYnJwZXJtKQoreworI2lmZGVmIENPTkZJR19BVUZT
X0hJTk9USUZZCisJcmV0dXJuIChicnBlcm0gIT0gQXVCcl9SUiAmJiBicnBlcm0gIT0gQXVCcl9S
UldIKTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAq
LworCisvKiBicmFuY2guYyAqLworc3RydWN0IGF1X3NiaW5mbzsKK3ZvaWQgYXVfYnJfZnJlZShz
dHJ1Y3QgYXVfc2JpbmZvICpzaW5mbyk7CitpbnQgYXVfdGVzdF9kZWZfcnIoc3RydWN0IHN1cGVy
X2Jsb2NrICpoX3NiKTsKK2ludCBhdV9icl9pbmRleChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBh
dWZzX2JpbmRleF90IGJyX2lkKTsKK3N0cnVjdCBhdV9vcHRfYWRkOworaW50IGF1X2JyX2FkZChz
dHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYXVfb3B0X2FkZCAqYWRkLCBpbnQgcmVtb3Vu
dCk7CitzdHJ1Y3QgYXVfb3B0X2RlbDsKK2ludCBhdV9icl9kZWwoc3RydWN0IHN1cGVyX2Jsb2Nr
ICpzYiwgc3RydWN0IGF1X29wdF9kZWwgKmRlbCwgaW50IHJlbW91bnQpOworc3RydWN0IGF1X29w
dF9tb2Q7CitpbnQgYXVfYnJfbW9kKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBhdV9v
cHRfbW9kICptb2QsIGludCByZW1vdW50LAorCSAgICAgIGludCAqZG9fdXBkYXRlKTsKKworLyog
eGluby5jICovCitpbnQgYXVfeGliX3RydW5jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCitz
dHJ1Y3QgZmlsZSAqYXVfeGlub19jcmVhdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAq
Zm5hbWUsIGludCBzaWxlbnQsCisJCQkgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50KTsKK2lub190
IGF1X3hpbm9fbmV3X2lubyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK2ludCBhdV94aW5vX3dy
aXRlMChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRleF90IGJpbmRleCwgaW5vX3Qg
aF9pbm8sCisJCSAgIGlub190IGlubyk7CitpbnQgYXVfeGlub193cml0ZShzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiLCBhdWZzX2JpbmRleF90IGJpbmRleCwgaW5vX3QgaF9pbm8sCisJCSAgc3RydWN0
IGF1X3hpbm9fZW50cnkgKnhpbm9lKTsKK2ludCBhdV94aW5vX3JlYWQoc3RydWN0IHN1cGVyX2Js
b2NrICpzYiwgYXVmc19iaW5kZXhfdCBiaW5kZXgsIGlub190IGhfaW5vLAorCQkgc3RydWN0IGF1
X3hpbm9fZW50cnkgKnhpbm9lKTsKK2ludCBhdV94aW5vX2JyKHN0cnVjdCBzdXBlcl9ibG9jayAq
c2IsIHN0cnVjdCBhdV9icmFuY2ggKmJyLCBpbm9fdCBoaW5vLAorCSAgICAgICBzdHJ1Y3QgZmls
ZSAqYmFzZV9maWxlLCBpbnQgZG9fdGVzdCk7CitpbnQgYXVfeGlub190cnVuYyhzdHJ1Y3Qgc3Vw
ZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRleF90IGJpbmRleCk7CisKK3N0cnVjdCBhdV9vcHRfeGlu
bzsKK2ludCBhdV94aW5vX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYXVfb3B0
X3hpbm8gKnhpbm8sIGludCByZW1vdW50KTsKK3ZvaWQgYXVfeGlub19jbHIoc3RydWN0IHN1cGVy
X2Jsb2NrICpzYik7CitzdHJ1Y3QgZmlsZSAqYXVfeGlub19kZWYoc3RydWN0IHN1cGVyX2Jsb2Nr
ICpzYik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy90b2RvOiBtZW1vcnkgYmFycmllcj8K
K3N0YXRpYyBpbmxpbmUgaW50IGF1X2JyX2NvdW50KHN0cnVjdCBhdV9icmFuY2ggKmJyKQorewor
CXJldHVybiBhdG9taWNfcmVhZCgmYnItPmJyX2NvdW50KTsKK30KKworc3RhdGljIGlubGluZSBp
bnQgYXVfYnJfZ2V0KHN0cnVjdCBhdV9icmFuY2ggKmJyKQoreworCXJldHVybiBhdG9taWNfaW5j
X3JldHVybigmYnItPmJyX2NvdW50KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXVfYnJfcHV0
KHN0cnVjdCBhdV9icmFuY2ggKmJyKQoreworCXJldHVybiBhdG9taWNfZGVjX3JldHVybigmYnIt
PmJyX2NvdW50KTsKK30KKworc3RhdGljIGlubGluZSBhdV9nZW5fdCBhdV9icl9nZW4oc3RydWN0
IGF1X2JyYW5jaCAqYnIpCit7CisJcmV0dXJuIGJyLT5icl9nZW5lcmF0aW9uOworfQorCisvKgor
ICogdGVzdCBpZiB0aGUgQGJyIGlzIHJlYWRvbmx5IG9yIG5vdC4KKyAqLworc3RhdGljIGlubGlu
ZSBpbnQgYXVfYnJfcmRvbmx5KHN0cnVjdCBhdV9icmFuY2ggKmJyKQoreworCXJldHVybiAoKGJy
LT5icl9tbnQtPm1udF9zYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJfHwgIWF1X2JyX3dyaXRh
YmxlKGJyLT5icl9wZXJtKSkKKwkJPyAtRVJPRlMgOiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
ICovCisKKy8qIFN1cGVyYmxvY2sgdG8gYnJhbmNoICovCitzdGF0aWMgaW5saW5lCithdWZzX2Jp
bmRleF90IGF1X3Nicl9pZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRleF90IGJp
bmRleCkKK3sKKwlyZXR1cm4gYXVfc2JyKHNiLCBiaW5kZXgpLT5icl9pZDsKK30KKworc3RhdGlj
IGlubGluZQorc3RydWN0IHZmc21vdW50ICphdV9zYnJfbW50KHN0cnVjdCBzdXBlcl9ibG9jayAq
c2IsIGF1ZnNfYmluZGV4X3QgYmluZGV4KQoreworCXJldHVybiBhdV9zYnIoc2IsIGJpbmRleCkt
PmJyX21udDsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IHN1cGVyX2Jsb2NrICphdV9zYnJf
c2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYXVmc19iaW5kZXhfdCBiaW5kZXgpCit7CisJcmV0
dXJuIGF1X3Nicl9tbnQoc2IsIGJpbmRleCktPm1udF9zYjsKK30KKworc3RhdGljIGlubGluZSB2
b2lkIGF1X3Nicl9wdXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYXVmc19iaW5kZXhfdCBiaW5k
ZXgpCit7CisJYXVfYnJfcHV0KGF1X3NicihzYiwgYmluZGV4KSk7Cit9CisKK3N0YXRpYyBpbmxp
bmUgaW50IGF1X3Nicl9wZXJtKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGF1ZnNfYmluZGV4X3Qg
YmluZGV4KQoreworCXJldHVybiBhdV9zYnIoc2IsIGJpbmRleCktPmJyX3Blcm07Cit9CisKK3N0
YXRpYyBpbmxpbmUgaW50IGF1X3Nicl93aGFibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYXVm
c19iaW5kZXhfdCBiaW5kZXgpCit7CisJcmV0dXJuIGF1X2JyX3doYWJsZShhdV9zYnJfcGVybShz
YiwgYmluZGV4KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF1X3Rlc3RfdHJ1bmNfeGlubyhz
dHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiBhdV90ZXN0X3RtcGZzKHNiKTsKK30K
KworLyogdGVtcG9yYXJ5IHN1cHBvcnQgZm9yIGkjMSBpbiBjcmFtZnMgKi8KK3N0YXRpYyBpbmxp
bmUgaW50IGF1X3Rlc3RfdW5pcXVlX2lubyhzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeSwgaW5vX3Qg
aF9pbm8pCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ1JBTUZTKSB8fCBkZWZpbmVkKENPTkZJR19D
UkFNRlNfTU9EVUxFKQorCWlmICh1bmxpa2VseShoX2RlbnRyeS0+ZF9zYi0+c19tYWdpYyA9PSBD
UkFNRlNfTUFHSUMpKQorCQlyZXR1cm4gKGhfaW5vICE9IDEpOworI2VuZGlmCisJcmV0dXJuIDE7
Cit9CisKKyNpZmRlZiBDT05GSUdfQVVGU19CUl9ORlMKK3N0YXRpYyBpbmxpbmUgaW50IGF1X3Rl
c3RfdW5zdXBwb3J0ZWRfbmZzKHN0cnVjdCBzdXBlcl9ibG9jayAqaF9zYikKK3sKKwlyZXR1cm4g
MDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdmZzbW91bnQgKmF1X2RvX25mc21udChzdHJ1
Y3QgdmZzbW91bnQgKmhfbW50KQoreworCWlmICghYXVfdGVzdF9uZnMoaF9tbnQtPm1udF9zYikp
CisJCXJldHVybiBOVUxMOworCXJldHVybiBoX21udDsKK30KKworLyogaXQgZG9lc24ndCBtbnRn
ZXQoKSAqLworc3RhdGljIGlubGluZQorc3RydWN0IHZmc21vdW50ICphdV9uZnNtbnQoc3RydWN0
IHN1cGVyX2Jsb2NrICpzYiwgYXVmc19iaW5kZXhfdCBiaW5kZXgpCit7CisJcmV0dXJuIGF1X2Rv
X25mc21udChhdV9zYnJfbW50KHNiLCBiaW5kZXgpKTsKK30KKworI2RlZmluZSBBdU5vTmZzQnJh
bmNoTXNnICJkdW1teSIKKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGF1X3Rlc3RfdW5zdXBw
b3J0ZWRfbmZzKHN0cnVjdCBzdXBlcl9ibG9jayAqaF9zYikKK3sKKwlyZXR1cm4gYXVfdGVzdF9u
ZnMoaF9zYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZmc21vdW50ICphdV9kb19uZnNt
bnQoc3RydWN0IHZmc21vdW50ICpoX21udCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGlj
IGlubGluZQorc3RydWN0IHZmc21vdW50ICphdV9uZnNtbnQoc3RydWN0IHN1cGVyX2Jsb2NrICpz
YiwgYXVmc19iaW5kZXhfdCBiaW5kZXgpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUg
QXVOb05mc0JyYW5jaE1zZyAiTkZTIGJyYW5jaCBpcyBub3Qgc3VwcG9ydGVkIiBcCisJIiwgdHJ5
IHNvbWUgY29uZmlndXJhdGlvbnMgYW5kIHBhdGNoZXMgaW5jbHVkZWQgaW4gYXVmcyBzb3VyY2Ug
Q1ZTLiIKKworI2VuZGlmIC8qIENPTkZJR19BVUZTX0JSX05GUyAqLworCisvKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tICovCisKKy8qCisgKiBicl93aF9yZWFkX2xvY2ssIGJyX3doX3dyaXRlX2xvY2sKKyAqIGJy
X3doX3JlYWRfdW5sb2NrLCBicl93aF93cml0ZV91bmxvY2ssIGJyX3doX2Rvd25ncmFkZV9sb2Nr
CisgKi8KK0F1U2ltcGxlUndzZW1GdW5jcyhicl93aCwgc3RydWN0IGF1X2JyYW5jaCAqYnIsIGJy
LT5icl93aF9yd3NlbSk7CisKKy8qIHRvIGRlYnVnIGVhc2llciwgZG8gbm90IG1ha2UgdGhlbSBp
bmxpbmVkIGZ1bmN0aW9ucyAqLworI2RlZmluZSBCcldoTXVzdFJlYWRMb2NrKGJyKSBkbyB7IFwK
KwkvKiBTaU11c3RBbnlMb2NrKHNiKTsgKi8gXAorCUF1UndNdXN0UmVhZExvY2soJihiciktPmJy
X3doX3J3c2VtKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBCcldoTXVzdFdyaXRlTG9jayhi
cikgZG8geyBcCisJLyogU2lNdXN0QW55TG9jayhzYik7ICovIFwKKwlBdVJ3TXVzdFdyaXRlTG9j
aygmKGJyKS0+YnJfd2hfcndzZW0pOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEJyV2hNdXN0
QW55TG9jayhicikgZG8geyBcCisJLyogU2lNdXN0QW55TG9jayhzYik7ICovIFwKKwlBdVJ3TXVz
dEFueUxvY2soJihiciktPmJyX3doX3J3c2VtKTsgXAorfSB3aGlsZSAoMCkKKworI2VuZGlmIC8q
IF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0FVRlNfQlJBTkNIX0hfXyAqLwpkaWZmIC11ck4g
bGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvYnJfZnVzZS5jIGxpbnV4LTIuNi4y
NS40LXVuaW9uZnMvZnMvYXVmcy9icl9mdXNlLmMKLS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMu
b3JpZy9mcy9hdWZzL2JyX2Z1c2UuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51
eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvYnJfZnVzZS5jCTIwMDgtMDUtMjUgMTE6NTY6MDgg
KzAzMDAKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBKdW5qaXJv
IE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9n
cmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEg
IFVTQQorICovCisKKy8qCisgKiBzcGVjaWFsIGhhbmRsaW5nIGZvciBpbm9kZSBhdHRyaWJ1dGVz
IG9uIEZVU0UgYnJhbmNoCisgKgorICogJElkOiBicl9mdXNlLmMsdiAxLjIgMjAwOC8wNC8yMSAw
MTozMjowNSBzZmpybyBFeHAgJAorICovCisKKyNpbmNsdWRlICJhdWZzLmgiCisKKy8qIGhfbW50
IGNhbiBiZSBOVUxMLCBpcyBpdCBzYWZlPyAqLworaW50IGF1X3VwZGF0ZV9mdXNlX2hfaW5vZGUo
c3RydWN0IHZmc21vdW50ICpoX21udCwgc3RydWN0IGRlbnRyeSAqaF9kZW50cnkpCit7CisJaW50
IGVycjsKKwlzdHJ1Y3Qga3N0YXQgc3Q7CisKKwlMS1RSVHJhY2UoIiUuKnNcbiIsIEF1RExOUGFp
cihoX2RlbnRyeSkpOworCisJZXJyID0gMDsKKwlpZiAodW5saWtlbHkoaF9kZW50cnktPmRfaW5v
ZGUKKwkJICAgICAvLyYmIGF0b21pY19yZWFkKCZoX2RlbnRyeS0+ZF9pbm9kZS0+aV9jb3VudCkK
KwkJICAgICAmJiBhdV90ZXN0X2Z1c2UoaF9kZW50cnktPmRfc2IpKSkgeworCQllcnIgPSB2ZnN1
Yl9nZXRhdHRyKGhfbW50LCBoX2RlbnRyeSwgJnN0LCAvKmRsZ3QqLzApOworCQlpZiAodW5saWtl
bHkoZXJyKSkgeworCQkJQXVEYmcoImVyciAlZFxuIiwgZXJyKTsKKwkJCWF1X2RlYnVnX29uKCk7
CisJCQlBdURiZ0RlbnRyeShoX2RlbnRyeSk7CisJCQlhdV9kZWJ1Z19vZmYoKTsKKwkJCVdBUk5f
T04oZXJyKTsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiBjdXJyZW50bHksIGZvciBm
dXNlIG9ubHkgKi8KK2ludCBhdWZzX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVj
dCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdCkKK3sKKwlpbnQgZXJyOworCXN0cnVj
dCBpbm9kZSAqaW5vZGUsICpoX2lub2RlOworCXN0cnVjdCBkZW50cnkgKmhfZGVudHJ5OworCisJ
TEtUUlRyYWNlKCIlLipzXG4iLCBBdURMTlBhaXIoZGVudHJ5KSk7CisKKwllcnIgPSAwOworCWF1
ZnNfcmVhZF9sb2NrKGRlbnRyeSwgQXVMb2NrX0lSKTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9k
ZTsKKwloX2lub2RlID0gYXVfaF9pcHRyKGlub2RlLCBhdV9pYnN0YXJ0KGlub2RlKSk7CisJaWYg
KHVubGlrZWx5KGF1X3Rlc3RfZnVzZShoX2lub2RlLT5pX3NiKSkpIHsKKwkJaF9kZW50cnkgPSBk
X2ZpbmRfYWxpYXMoaF9pbm9kZSk7CisJCS8qIHNpbXBseSBnYXZlIHVwIHVwZGF0aW5nIGZ1c2Ug
aW5vZGUgKi8KKwkJaWYgKGhfZGVudHJ5KSB7CisJCQkvKmlnbm9yZSovCisJCQlpZiAoIWF1X3Vw
ZGF0ZV9mdXNlX2hfaW5vZGUoTlVMTCwgaF9kZW50cnkpKQorCQkJCWF1X2NwdXBfYXR0cl9hbGwo
aW5vZGUpOworCQkJZHB1dChoX2RlbnRyeSk7CisJCX0KKwl9CisJZ2VuZXJpY19maWxsYXR0cihp
bm9kZSwgc3QpOworCisJYXVmc19yZWFkX3VubG9jayhkZW50cnksIEF1TG9ja19JUik7CisJcmV0
dXJuIGVycjsKK30KZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZz
L2JyX25mcy5jIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9icl9uZnMuYwotLS0gbGlu
dXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvYnJfbmZzLmMJMTk3MC0wMS0wMSAwMzow
MDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL2JyX25mcy5jCTIw
MDgtMDUtMjUgMTE6NTY6MDggKzAzMDAKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9ncmFtLCBhdWZzIGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAq
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBh
bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy
ZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0
b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogbG9va3VwIGZ1bmN0aW9ucyBm
b3IgTkZTIGJyYW5jaCBpbiBsaW51eC0yLjYuMTkgYW5kIGxhdGVyCisgKgorICogJElkOiBicl9u
ZnMuYyx2IDEuMyAyMDA4LzA1LzA0IDIzOjUxOjE0IHNmanJvIEV4cCAkCisgKi8KKworI2luY2x1
ZGUgImF1ZnMuaCIKKworc3RhdGljIHN0cnVjdCBmaWxlICphdV9maW5kX2hfaW50ZW50KHN0cnVj
dCBhdV9oZGVudHJ5ICpoZCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGZpbGUgKmhf
ZmlsZSwgKmhmOworCXN0cnVjdCBhdV9oZGludGVudCAqaGRpLCAqdG1wLCAqZG9fZnJlZTsKKwor
CUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVETE5QYWlyKGhkLT5oZF9kZW50cnkpKTsKKworCWhfZmls
ZSA9IE5VTEw7CisJZG9fZnJlZSA9IE5VTEw7CisJc3Bpbl9sb2NrKCZoZC0+aGRfbG9jayk7CisJ
bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhkaSwgdG1wLCBoZC0+aGRfaW50ZW50X2xpc3QsIGhk
aV9saXN0KSB7CisJCWhmID0gaGRpLT5oZGlfZmlsZVtBdUludGVudF9CUkFOQ0hdOworCQlpZiAo
aGRpLT5oZGlfZmlsZVtBdUludGVudF9BVUZTXSA9PSBmaWxlCisJCSAgICAmJiBoZi0+Zl9kZW50
cnkgPT0gaGQtPmhkX2RlbnRyeSkgeworCQkJaF9maWxlID0gaGY7CisJCQlkb19mcmVlID0gaGRp
OworCQkJbGlzdF9kZWwoJmhkaS0+aGRpX2xpc3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bp
bl91bmxvY2soJmhkLT5oZF9sb2NrKTsKKwlrZnJlZShkb19mcmVlKTsKKworCXJldHVybiBoX2Zp
bGU7Cit9CisKK3N0cnVjdCBmaWxlICphdV9oX2ludGVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnks
IGF1ZnNfYmluZGV4X3QgYmluZGV4LAorCQkJIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVj
dCBmaWxlICpoX2ZpbGU7CisJc3RydWN0IGF1X2hkZW50cnkgKmhkID0gYXVfZGkoZGVudHJ5KS0+
ZGlfaGRlbnRyeSArIGJpbmRleDsKKworCUxLVFJUcmFjZSgiJS4qcywgYiVkLCBmICVwXG4iLCBB
dURMTlBhaXIoZGVudHJ5KSwgYmluZGV4LCBmaWxlKTsKKwlEaU11c3RBbnlMb2NrKGRlbnRyeSk7
CisJQXVEZWJ1Z09uKGJpbmRleCA8IGF1X2RpKGRlbnRyeSktPmRpX2JzdGFydAorCQkgIHx8IGJp
bmRleCA+IGF1X2RpKGRlbnRyeSktPmRpX2JlbmQpOworCisJaF9maWxlID0gTlVMTDsKKwlpZiAo
IWhkLT5oZF9pbnRlbnRfbGlzdCB8fCAhZmlsZSkKKwkJcmV0dXJuIGhfZmlsZTsgLyogc3VjY2Vz
cyAqLworCisJLy9BdURlYnVnT24oYXVfdGVzdF93a3EoY3VycmVudCkpOworCWhfZmlsZSA9IGF1
X2ZpbmRfaF9pbnRlbnQoaGQsIGZpbGUpOworCS8vQXVEYmdGaWxlKGhfZmlsZSk7CisJcmV0dXJu
IGhfZmlsZTsKK30KKworc3RhdGljIGludCBhdV9zZXRfaF9pbnRlbnQoc3RydWN0IGRlbnRyeSAq
ZGVudHJ5LCBhdWZzX2JpbmRleF90IGJpbmRleCwKKwkJCSAgIHN0cnVjdCBmaWxlICpmaWxlLCBz
dHJ1Y3QgZmlsZSAqaF9maWxlKQoreworCWludCBlcnI7CisJc3RydWN0IGF1X2hkZW50cnkgKmhk
ID0gYXVfZGkoZGVudHJ5KS0+ZGlfaGRlbnRyeSArIGJpbmRleDsKKwlzdHJ1Y3QgYXVfaGRpbnRl
bnQgKmhkaTsKKwlzdHJ1Y3QgZmlsZSAqaGY7CisKKwlMS1RSVHJhY2UoIiUuKnMsIGIlZCwgZiAl
cFxuIiwgQXVETE5QYWlyKGRlbnRyeSksIGJpbmRleCwgZmlsZSk7CisJLyogZF9yZXZhbGlkYXRl
KCkgaG9sZHMgcmVhZF9sb2NrICovCisJLy9EaU11c3RXcml0ZUxvY2soZGVudHJ5KTsKKwlBdURl
YnVnT24oYmluZGV4IDwgYXVfZGkoZGVudHJ5KS0+ZGlfYnN0YXJ0CisJCSAgfHwgYmluZGV4ID4g
YXVfZGkoZGVudHJ5KS0+ZGlfYmVuZAorCQkgIHx8ICFmaWxlCisJCSAgfHwgIWhfZmlsZQorCQkg
IC8qIHx8IGF1X3Rlc3Rfd2txKGN1cnJlbnQpICovKTsKKworCWVyciA9IC1FTk9NRU07CisJaWYg
KGhkLT5oZF9pbnRlbnRfbGlzdCkgeworCQl3aGlsZSAoMSkgeworCQkJaGYgPSBhdV9maW5kX2hf
aW50ZW50KGhkLCBmaWxlKTsKKwkJCWlmICghaGYpCisJCQkJYnJlYWs7CisJCQlmcHV0KGhmKTsK
KwkJCUF1V2FybigiZnJlZWQgaGZpbGUgJS4qcyBiJWQgbGVmdFxuIiwKKwkJCSAgICAgICBBdURM
TlBhaXIoZGVudHJ5KSwgYmluZGV4KTsKKwkJfQorCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmaGQt
PmhkX2xvY2spOworCQlpZiAoIWhkLT5oZF9pbnRlbnRfbGlzdCkgeworCQkJaGQtPmhkX2ludGVu
dF9saXN0CisJCQkJPSBrbWFsbG9jKHNpemVvZigqaGQtPmhkX2ludGVudF9saXN0KSwKKwkJCQkJ
ICBHRlBfQVRPTUlDKTsKKwkJCWlmICh1bmxpa2VseSghaGQtPmhkX2ludGVudF9saXN0KSkgewor
CQkJCXNwaW5fdW5sb2NrKCZoZC0+aGRfbG9jayk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlJ
TklUX0xJU1RfSEVBRChoZC0+aGRfaW50ZW50X2xpc3QpOworCQl9CisJCXNwaW5fdW5sb2NrKCZo
ZC0+aGRfbG9jayk7CisJfQorCisJaGRpID0ga21hbGxvYyhzaXplb2YoKmhkaSksIEdGUF9URU1Q
T1JBUlkpOworCWlmICh1bmxpa2VseSghaGRpKSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAwOwor
CS8vaGRpLT5oZGlfcGlkID0gY3VycmVudC0+cGlkOworCWhkaS0+aGRpX2ZpbGVbQXVJbnRlbnRf
QVVGU10gPSBmaWxlOworCWhkaS0+aGRpX2ZpbGVbQXVJbnRlbnRfQlJBTkNIXSA9IGhfZmlsZTsK
KwlzcGluX2xvY2soJmhkLT5oZF9sb2NrKTsKKwlsaXN0X2FkZCgmaGRpLT5oZGlfbGlzdCwgaGQt
PmhkX2ludGVudF9saXN0KTsKKwlzcGluX3VubG9jaygmaGQtPmhkX2xvY2spOworCS8vQXVEYmdE
ZW50cnkoZGVudHJ5KTsKKwkvL0F1RGJnRmlsZShoX2ZpbGUpOworCisgb3V0OgorCUF1VHJhY2VF
cnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYXVfYnJfbmZzX2hfaW50ZW50KHN0cnVj
dCBmaWxlICpuZF9maWxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCSAgICAgICBhdWZzX2Jp
bmRleF90IGJpbmRleCwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IGVycjsKKworCUF1
VHJhY2VFbnRlcigpOworCisJZXJyID0gMDsKKwlpZiAoIW5kX2ZpbGUpCisJCWdvdG8gb3V0Owor
CisJQXVEZWJ1Z09uKCFuZCk7CisJZXJyID0gYXVfc2V0X2hfaW50ZW50KGRlbnRyeSwgYmluZGV4
LCBuZC0+aW50ZW50Lm9wZW4uZmlsZSwgbmRfZmlsZSk7CisJLy9lcnIgPSAtMTsKKwlpZiAodW5s
aWtlbHkoZXJyKSkgeworCQlmcHV0KG5kX2ZpbGUpOworCQlhdV9zZXRfaF9kcHRyKGRlbnRyeSwg
YmluZGV4LCBOVUxMKTsKKwkJLy90b2RvOiB1cGRhdGUgYnN0YXJ0IGFuZCBiZW5kPworCX0KKwor
IG91dDoKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLworCit2b2lkIGF1X2hpbnRlbnRfcHV0KHN0cnVjdCBhdV9oZGVudHJ5ICpoZCwgaW50
IGRvX2ZyZWUpCit7CisJc3RydWN0IGF1X2hkaW50ZW50ICpoZGksICp0bXA7CisJc3RydWN0IGZp
bGUgKmhmOworCisJaWYgKHVubGlrZWx5KGhkLT5oZF9pbnRlbnRfbGlzdCkpIHsKKwkJLy8gbm8g
c3BpbiBsb2NrCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShoZGksIHRtcCwgaGQtPmhkX2lu
dGVudF9saXN0LAorCQkJCQkgaGRpX2xpc3QpIHsKKwkJCUxLVFJUcmFjZSgiaGRpICVwXG4iLCBo
ZGkpOworCQkJaGYgPSBoZGktPmhkaV9maWxlW0F1SW50ZW50X0JSQU5DSF07CisJCQlpZiAodW5s
aWtlbHkoaGYpKQorCQkJCWZwdXQoaGYpOworCQkJLy9saXN0X2RlbCgmaGRpLT5oZGlfbGlzdCk7
CisJCQlrZnJlZShoZGkpOworCQl9CisJCWlmIChkb19mcmVlKQorCQkJa2ZyZWUoaGQtPmhkX2lu
dGVudF9saXN0KTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IGF1X2Zha2Vf
aW50ZW50KC8qIHN0cnVjdCBhdV9uZHN1YiAqc2F2ZSwgICovc3RydWN0IG5hbWVpZGF0YSAqbmQs
CisJCSAgIGludCBwZXJtKQoreworCWludCBlcnI7CisKKwlMS1RSVHJhY2UoInBlcm0gJWRcbiIs
IHBlcm0pOworCisJZXJyID0gMDsKKworCW5kLT5pbnRlbnQub3Blbi5maWxlID0gTlVMTDsKKwlp
ZiAobmQtPmZsYWdzICYgTE9PS1VQX09QRU4pIHsKKwkJZXJyID0gLUVORklMRTsKKwkJbmQtPmlu
dGVudC5vcGVuLmZpbGUgPSBnZXRfZW1wdHlfZmlscCgpOworCQlpZiAodW5saWtlbHkoIW5kLT5p
bnRlbnQub3Blbi5maWxlKSkgeworCQkJLy9uZC0+aW50ZW50Lm9wZW4uZmlsZSA9IHNhdmUtPmlu
dGVudC5vcGVuLmZpbGU7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWVyciA9IDA7CisJCWlmICgh
YXVfYnJfd3JpdGFibGUocGVybSkpIHsKKwkJCW5kLT5pbnRlbnQub3Blbi5mbGFncyA9IEZNT0RF
X1JFQUQKKwkJCQl8IGF1X2ZpbGVfcm9mbGFncyhuZC0+aW50ZW50Lm9wZW4uZmxhZ3MpOworCQkJ
bmQtPmZsYWdzICY9IH5MT09LVVBfQ1JFQVRFOworCQl9CisJfQorCisgb3V0OgorCUF1VHJhY2VF
cnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYXVfaGluX2FmdGVyX3JldmFsKHN0cnVj
dCBuYW1laWRhdGEgKm5kLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCSAgICAgICBhdWZzX2Jp
bmRleF90IGJpbmRleCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGVycjsKKworCUxLVFJU
cmFjZSgibmQgJXAsICUuKnMsIGIlZCwgZiAlZFxuIiwKKwkJICBuZCwgQXVETE5QYWlyKGRlbnRy
eSksIGJpbmRleCwgISFmaWxlKTsKKworCWVyciA9IDA7CisJaWYgKChuZC0+ZmxhZ3MgJiBMT09L
VVBfT1BFTikKKwkgICAgJiYgbmQtPmludGVudC5vcGVuLmZpbGUKKwkgICAgJiYgIUlTX0VSUihu
ZC0+aW50ZW50Lm9wZW4uZmlsZSkpIHsKKwkJaWYgKG5kLT5pbnRlbnQub3Blbi5maWxlLT5mX2Rl
bnRyeSkgeworCQkJLy9BdURiZ0ZpbGUobmQtPmludGVudC5vcGVuLmZpbGUpOworCQkJZXJyID0g
YXVfc2V0X2hfaW50ZW50KGRlbnRyeSwgYmluZGV4LCBmaWxlLAorCQkJCQkgICAgICBuZC0+aW50
ZW50Lm9wZW4uZmlsZSk7CisJCQlpZiAoIWVycikKKwkJCQluZC0+aW50ZW50Lm9wZW4uZmlsZSA9
IE5VTEw7CisJCX0KKwkJaWYgKHVubGlrZWx5KG5kLT5pbnRlbnQub3Blbi5maWxlKSkKKwkJCXB1
dF9maWxwKG5kLT5pbnRlbnQub3Blbi5maWxlKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisj
aWZkZWYgQ09ORklHX0FVRlNfRExHVAorc3RydWN0IGF1X2xvb2t1cF9oYXNoX2FyZ3MgeworCXN0
cnVjdCBkZW50cnkgKiplcnJwOworCXN0cnVjdCBxc3RyICpuYW1lOworCXN0cnVjdCBkZW50cnkg
KmJhc2U7CisJc3RydWN0IG5hbWVpZGF0YSAqbmQ7Cit9OworCitzdGF0aWMgdm9pZCBhdV9jYWxs
X2xvb2t1cF9oYXNoKHZvaWQgKmFyZ3MpCit7CisJc3RydWN0IGF1X2xvb2t1cF9oYXNoX2FyZ3Mg
KmEgPSBhcmdzOworCSphLT5lcnJwID0gdmZzdWJfX2xvb2t1cF9oYXNoKGEtPm5hbWUsIGEtPmJh
c2UsIGEtPm5kKTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKgorYXVfbGt1cF9oYXNoX2Rs
Z3Qoc3RydWN0IHFzdHIgKnRoaXMsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJICBzdHJ1Y3Qg
bmFtZWlkYXRhICpuZCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBkZW50cnkgKmRl
bnRyeTsKKwlpbnQgZGlycGVybTE7CisKKwlkaXJwZXJtMSA9IGF1X2Z0ZXN0X25keChmbGFncywg
RElSUEVSTTEpOworCWlmICghZGlycGVybTEgJiYgIWF1X2Z0ZXN0X25keChmbGFncywgRExHVCkp
CisJCWRlbnRyeSA9IHZmc3ViX19sb29rdXBfaGFzaCh0aGlzLCBwYXJlbnQsIG5kKTsKKwllbHNl
IHsKKwkJaW50IHdrcV9lcnI7CisJCXN0cnVjdCBhdV9sb29rdXBfaGFzaF9hcmdzIGFyZ3MgPSB7
CisJCQkuZXJycAk9ICZkZW50cnksCisJCQkubmFtZQk9IHRoaXMsCisJCQkuYmFzZQk9IHBhcmVu
dCwKKwkJCS5uZAk9IG5kCisJCX07CisJCXdrcV9lcnIgPSBhdV93a3Ffd2FpdChhdV9jYWxsX2xv
b2t1cF9oYXNoLCAmYXJncywKKwkJCQkgICAgICAvKmRsZ3QqLyFkaXJwZXJtMSk7CisJCWlmICh1
bmxpa2VseSh3a3FfZXJyKSkKKwkJCWRlbnRyeSA9IEVSUl9QVFIod2txX2Vycik7CisJfQorCisJ
QXVUcmFjZUVyclB0cihkZW50cnkpOworCXJldHVybiBkZW50cnk7Cit9CisjZWxzZQorc3RhdGlj
IHN0cnVjdCBkZW50cnkgKgorYXVfbGt1cF9oYXNoX2RsZ3Qoc3RydWN0IHFzdHIgKnRoaXMsIHN0
cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgdW5zaWduZWQg
aW50IGZsYWdzKQoreworCXJldHVybiB2ZnN1Yl9fbG9va3VwX2hhc2godGhpcywgcGFyZW50LCBu
ZCk7Cit9CisjZW5kaWYgLyogQ09ORklHX0FVRlNfRExHVCAqLworCitzdHJ1Y3QgZGVudHJ5ICph
dV9sa3VwX2hhc2goY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJ
ICAgIGludCBsZW4sIHN0cnVjdCBhdV9uZHggKm5keCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50
cnk7CisJY2hhciAqcDsKKwl1bnNpZ25lZCBsb25nIGhhc2g7CisJc3RydWN0IHFzdHIgdGhpczsK
Kwl1bnNpZ25lZCBpbnQgYzsKKwlzdHJ1Y3QgbmFtZWlkYXRhIHRtcF9uZCwgKm5kbzsKKwlpbnQg
ZXJyOworCisJTEtUUlRyYWNlKCIlLipzLyUuKnNcbiIsIEF1RExOUGFpcihwYXJlbnQpLCBsZW4s
IG5hbWUpOworCisJLy90b2RvOiBleHBvcnQgYW5kIGNhbGwgX19sb29rdXBfb25lX2xlbigpIGlu
IGZzL25hbWVpLmMKKwlkZW50cnkgPSBFUlJfUFRSKC1FQUNDRVMpOworCXRoaXMubmFtZSA9IG5h
bWU7CisJdGhpcy5sZW4gPSBsZW47CisJaWYgKHVubGlrZWx5KCFsZW4pKQorCQlnb3RvIG91dDsK
KworCXAgPSAodm9pZCAqKW5hbWU7CisJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CisJd2hpbGUg
KGxlbi0tKSB7CisJCWMgPSAqcCsrOworCQlpZiAodW5saWtlbHkoYyA9PSAnLycgfHwgYyA9PSAn
XDAnKSkKKwkJCWdvdG8gb3V0OworCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2goYywgaGFzaCk7
CisJfQorCXRoaXMuaGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CisKKwluZG8gPSBuZHgtPm5k
OworCWlmIChuZG8pIHsKKwkJdG1wX25kID0gKm5kbzsKKwkJZXJyID0gYXVfZmFrZV9pbnRlbnQo
JnRtcF9uZCwgbmR4LT5ici0+YnJfcGVybSk7CisJCWRlbnRyeSA9IEVSUl9QVFIoZXJyKTsKKwkJ
aWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dF9pbnRlbnQ7CisJfSBlbHNlCisJCW1lbXNl
dCgmdG1wX25kLCAwLCBzaXplb2YodG1wX25kKSk7CisKKwl0bXBfbmQucGF0aC5kZW50cnkgPSBw
YXJlbnQ7CisJdG1wX25kLnBhdGgubW50ID0gbmR4LT5uZnNtbnQ7CisJcGF0aF9nZXQoJnRtcF9u
ZC5wYXRoKTsKKwlkZW50cnkgPSBhdV9sa3VwX2hhc2hfZGxndCgmdGhpcywgcGFyZW50LCAmdG1w
X25kLCBuZHgtPmZsYWdzKTsKKwlpZiAoMCAmJiAhSVNfRVJSKGRlbnRyeSkpCisJCUF1RGJnRGVu
dHJ5KGRlbnRyeSk7CisJaWYgKCFJU19FUlIoZGVudHJ5KSkgeworCQkvKiB3aHkgbmVnYXRpdmUg
ZGVudHJ5IGZvciBhIG5ldyBkaXIgd2FzIHVuaGFzaGVkPyAqLworCQlpZiAodW5saWtlbHkoZF91
bmhhc2hlZChkZW50cnkpKSkKKwkJCWRfcmVoYXNoKGRlbnRyeSk7CisJCWlmICh0bXBfbmQuaW50
ZW50Lm9wZW4uZmlsZQorCQkgICAgJiYgdG1wX25kLmludGVudC5vcGVuLmZpbGUtPmZfZGVudHJ5
KSB7CisJCQkvL0F1RGJnRmlsZSh0bXBfbmQuaW50ZW50Lm9wZW4uZmlsZSk7CisJCQluZHgtPm5k
X2ZpbGUgPSB0bXBfbmQuaW50ZW50Lm9wZW4uZmlsZTsKKwkJCXRtcF9uZC5pbnRlbnQub3Blbi5m
aWxlID0gTlVMTDsKKwkJCS8vYXVfYnJfZ2V0KG5keC0+YnIpOworCQl9CisJfQorCXBhdGhfcHV0
KCZ0bXBfbmQucGF0aCk7CisKKyBvdXRfaW50ZW50OgorCWlmICh0bXBfbmQuaW50ZW50Lm9wZW4u
ZmlsZSkKKwkJcHV0X2ZpbHAodG1wX25kLmludGVudC5vcGVuLmZpbGUpOworIG91dDoKKwlBdVRy
YWNlRXJyUHRyKGRlbnRyeSk7CisJcmV0dXJuIGRlbnRyeTsKK30KZGlmZiAtdXJOIGxpbnV4LTIu
Ni4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL2JyX3hmcy5jIGxpbnV4LTIuNi4yNS40LXVuaW9u
ZnMvZnMvYXVmcy9icl94ZnMuYwotLS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1
ZnMvYnJfeGZzLmMJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQt
dW5pb25mcy9mcy9hdWZzL2JyX3hmcy5jCTIwMDgtMDUtMjUgMTE6NTY6MDggKzAzMDAKQEAgLTAs
MCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAq
CisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3Qs
IHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisK
Ky8qCisgKiBzcGVjaWFsIGhhbmRsaW5nIGlub2RlIGF0dHJpYnV0ZXMgb24gWEZTIGJyYW5jaCBp
biBsaW51eC0yLjYuMjQgYW5kIGxhdGVyCisgKgorICogJElkOiBicl94ZnMuYyx2IDEuMiAyMDA4
LzA0LzIxIDAxOjMzOjAwIHNmanJvIEV4cCAkCisgKi8KKworI2luY2x1ZGUgImF1ZnMuaCIKKwor
LyogaF9tbnQgY2FuIGJlIE5VTEwsIGlzIGl0IHNhZmU/ICovCitkZXZfdCBhdV9oX3JkZXYoc3Ry
dWN0IGlub2RlICpoX2lub2RlLCBzdHJ1Y3QgdmZzbW91bnQgKmhfbW50LAorCQlzdHJ1Y3QgZGVu
dHJ5ICpoX2RlbnRyeSkKK3sKKwlkZXZfdCByZGV2OworCWludCBlcnI7CisJc3RydWN0IGtzdGF0
IHN0OworCisJTEtUUlRyYWNlKCJoaSVsdVxuIiwgaF9pbm9kZS0+aV9pbm8pOworCWlmIChoX2Rl
bnRyeSkKKwkJTEtUUlRyYWNlKCIlLipzXG4iLCBBdURMTlBhaXIoaF9kZW50cnkpKTsKKworCXJk
ZXYgPSBoX2lub2RlLT5pX3JkZXY7CisJaWYgKCFyZGV2IHx8ICFhdV90ZXN0X3hmcyhoX2lub2Rl
LT5pX3NiKSkKKwkJZ290byBvdXQ7CisKKwlyZGV2ID0gMDsKKwlpZiAoIWhfZGVudHJ5KSB7CisJ
CWVyciA9IDA7CisJCWhfZGVudHJ5ID0gZF9maW5kX2FsaWFzKGhfaW5vZGUpOworCQlpZiAodW5s
aWtlbHkoIWhfZGVudHJ5KSkKKwkJCWdvdG8gZmFpbHVyZTsKKwkJZXJyID0gUFRSX0VSUihoX2Rl
bnRyeSk7CisJCWlmIChJU19FUlIoaF9kZW50cnkpKSB7CisJCQloX2RlbnRyeSA9IE5VTEw7CisJ
CQlnb3RvIGZhaWx1cmU7CisJCX0KKwkJTEtUUlRyYWNlKCIlLipzXG4iLCBBdURMTlBhaXIoaF9k
ZW50cnkpKTsKKwl9IGVsc2UKKwkJZGdldChoX2RlbnRyeSk7CisKKwllcnIgPSB2ZnN1Yl9nZXRh
dHRyKGhfbW50LCBoX2RlbnRyeSwgJnN0LCAvKmRsZ3QqLzApOworCWRwdXQoaF9kZW50cnkpOwor
CWlmICghZXJyKSB7CisJCXJkZXYgPSBzdC5yZGV2OworCQlnb3RvIG91dDsgLyogc3VjY2VzcyAq
LworCX0KKworIGZhaWx1cmU6CisJQXVJT0VycigiZmFpbGVkIHJkZXYgZm9yIFhGUyBpbm9kZSwg
aGklbHUsICVkXG4iLCBoX2lub2RlLT5pX2lubywgZXJyKTsKKyBvdXQ6CisJcmV0dXJuIHJkZXY7
Cit9CmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9jcHVwLmMg
bGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL2NwdXAuYwotLS0gbGludXgtMi42LjI1LjQt
dW5pb25mcy5vcmlnL2ZzL2F1ZnMvY3B1cC5jCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysr
IGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9jcHVwLmMJMjAwOC0wNS0yNSAxMTo1ODo1
MyArMDMwMApAQCAtMCwwICsxLDEwMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAw
OCBKdW5qaXJvIE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
ICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGgg
dGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKy8qCisgKiBjb3B5LXVwIGZ1bmN0aW9ucywgc2VlIHdicl9w
b2xpY3kuYyBmb3IgY29weS1kb3duCisgKgorICogJElkOiBjcHVwLmMsdiAxLjUgMjAwOC8wNS8x
MiAwMDoyOToxMSBzZmpybyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxsaW51eC9mc19zdGFjay5o
PgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlICJhdWZzLmgiCisKKy8qIHZp
b2xlbnQgY3B1cF9hdHRyXyooKSBmdW5jdGlvbnMgZG9uJ3QgY2FyZSBpbm9kZSBsb2NrICovCit2
b2lkIGF1X2NwdXBfYXR0cl90aW1lc2l6ZXMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1
Y3QgaW5vZGUgKmhfaW5vZGU7CisKKwlMS1RSVHJhY2UoImklbHVcbiIsIGlub2RlLT5pX2lubyk7
CisJLy9JTXVzdExvY2soaW5vZGUpOworCWhfaW5vZGUgPSBhdV9oX2lwdHIoaW5vZGUsIGF1X2li
c3RhcnQoaW5vZGUpKTsKKwlBdURlYnVnT24oIWhfaW5vZGUpOworCS8vSU11c3RMb2NrKCFoX2lu
b2RlKTsKKworCWZzc3RhY2tfY29weV9hdHRyX3RpbWVzKGlub2RlLCBoX2lub2RlKTsKKwkvL3Rv
ZG86IHRoaXMgc3Bpbl9sb2NrIGNvbmZsaWN0cyB0aGUgbmV3IHVuaW9uZnMgcGF0Y2ggaW4gLW1t
IHRyZWUKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWZzc3RhY2tfY29weV9pbm9kZV9z
aXplKGlub2RlLCBoX2lub2RlKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Cit9CisK
K3ZvaWQgYXVfY3B1cF9hdHRyX25saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0
IGlub2RlICpoX2lub2RlOworCisJTEtUUlRyYWNlKCJpJWx1XG4iLCBpbm9kZS0+aV9pbm8pOwor
CS8vSU11c3RMb2NrKGlub2RlKTsKKwlBdURlYnVnT24oIWlub2RlLT5pX21vZGUpOworCisJaF9p
bm9kZSA9IGF1X2hfaXB0cihpbm9kZSwgYXVfaWJzdGFydChpbm9kZSkpOworCWlub2RlLT5pX25s
aW5rID0gaF9pbm9kZS0+aV9ubGluazsKKworCS8qCisJICogZmV3ZXIgbmxpbmsgbWFrZXMgZmlu
ZCgxKSBub2lzeSwgYnV0IGxhcmdlciBubGluayBkb2Vzbid0LgorCSAqIGl0IG1heSBpbmNsdWRl
cyB3aHBsaW5rIGRpcmVjdG9yeS4KKwkgKi8KKwlpZiAodW5saWtlbHkoU19JU0RJUihoX2lub2Rl
LT5pX21vZGUpKSkgeworCQlhdWZzX2JpbmRleF90IGJpbmRleCwgYmVuZDsKKwkJYmVuZCA9IGF1
X2liZW5kKGlub2RlKTsKKwkJZm9yIChiaW5kZXggPSBhdV9pYnN0YXJ0KGlub2RlKSArIDE7IGJp
bmRleCA8PSBiZW5kOyBiaW5kZXgrKykgeworCQkJaF9pbm9kZSA9IGF1X2hfaXB0cihpbm9kZSwg
YmluZGV4KTsKKwkJCWlmIChoX2lub2RlKQorCQkJCWF1X2FkZF9ubGluayhpbm9kZSwgaF9pbm9k
ZSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgYXVfY3B1cF9hdHRyX2NoYW5nZWFibGUoc3RydWN0IGlu
b2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmhfaW5vZGU7CisKKwlMS1RSVHJhY2UoImkl
bHVcbiIsIGlub2RlLT5pX2lubyk7CisJLy9JTXVzdExvY2soaW5vZGUpOworCWhfaW5vZGUgPSBh
dV9oX2lwdHIoaW5vZGUsIGF1X2lic3RhcnQoaW5vZGUpKTsKKwlBdURlYnVnT24oIWhfaW5vZGUp
OworCisJaW5vZGUtPmlfbW9kZSA9IGhfaW5vZGUtPmlfbW9kZTsKKwlpbm9kZS0+aV91aWQgPSBo
X2lub2RlLT5pX3VpZDsKKwlpbm9kZS0+aV9naWQgPSBoX2lub2RlLT5pX2dpZDsKKwlhdV9jcHVw
X2F0dHJfdGltZXNpemVzKGlub2RlKTsKKworCS8vPz8KKwlpbm9kZS0+aV9mbGFncyA9IGhfaW5v
ZGUtPmlfZmxhZ3M7Cit9CisKK3ZvaWQgYXVfY3B1cF9pZ2VuKHN0cnVjdCBpbm9kZSAqaW5vZGUs
IHN0cnVjdCBpbm9kZSAqaF9pbm9kZSkKK3sKKwlpbm9kZS0+aV9nZW5lcmF0aW9uID0gaF9pbm9k
ZS0+aV9nZW5lcmF0aW9uOworCWF1X2lpKGlub2RlKS0+aWlfaHNiMSA9IGhfaW5vZGUtPmlfc2I7
Cit9CisKK3ZvaWQgYXVfY3B1cF9hdHRyX2FsbChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0
cnVjdCBpbm9kZSAqaF9pbm9kZTsKKworCUxLVFJUcmFjZSgiaSVsdVxuIiwgaW5vZGUtPmlfaW5v
KTsKKwkvL0lNdXN0TG9jayhpbm9kZSk7CisJaF9pbm9kZSA9IGF1X2hfaXB0cihpbm9kZSwgYXVf
aWJzdGFydChpbm9kZSkpOworCUF1RGVidWdPbighaF9pbm9kZSk7CisKKwlhdV9jcHVwX2F0dHJf
Y2hhbmdlYWJsZShpbm9kZSk7CisJaWYgKGlub2RlLT5pX25saW5rID4gMCkKKwkJYXVfY3B1cF9h
dHRyX25saW5rKGlub2RlKTsKKworCXN3aXRjaCAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgewor
CWNhc2UgU19JRkJMSzoKKwljYXNlIFNfSUZDSFI6CisJCWlub2RlLT5pX3JkZXYgPSBhdV9oX3Jk
ZXYoaF9pbm9kZSwgLypoX21udCovTlVMTCwKKwkJCQkJICAvKmhfZGVudHJ5Ki9OVUxMKTsKKwl9
CisJaW5vZGUtPmlfYmxrYml0cyA9IGhfaW5vZGUtPmlfYmxrYml0czsKKwlhdV9jcHVwX2lnZW4o
aW5vZGUsIGhfaW5vZGUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE5vdGU6IGR0
X2RlbnRyeSBhbmQgZHRfaGlkZGVuX2RlbnRyeSBhcmUgbm90IGRnZXQvZHB1dC1lZCAqLworCisv
KiBrZWVwIHRoZSB0aW1lc3RhbXBzIG9mIHRoZSBwYXJlbnQgZGlyIHdoZW4gY3B1cCAqLwordm9p
ZCBhdV9kdGltZV9zdG9yZShzdHJ1Y3QgYXVfZHRpbWUgKmR0LCBzdHJ1Y3QgZGVudHJ5ICpkZW50
cnksCisJCSAgICBzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeSwgc3RydWN0IGF1X2hpbm9kZSAqaGRp
cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJTEtUUlRyYWNlKCIlLipzLCBoZGlyICVk
XG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgISFoZGlyKTsKKwlBdURlYnVnT24oIWRlbnRyeSB8fCAh
aF9kZW50cnkgfHwgIWhfZGVudHJ5LT5kX2lub2RlKTsKKworCWR0LT5kdF9kZW50cnkgPSBkZW50
cnk7CisJZHQtPmR0X2hfZGVudHJ5ID0gaF9kZW50cnk7CisJZHQtPmR0X2hkaXIgPSBoZGlyOwor
CWlub2RlID0gaF9kZW50cnktPmRfaW5vZGU7CisJZHQtPmR0X2F0aW1lID0gaW5vZGUtPmlfYXRp
bWU7CisJZHQtPmR0X210aW1lID0gaW5vZGUtPmlfbXRpbWU7CisJLy9zbXBfbWIoKTsKK30KKwor
dm9pZCBhdV9kdGltZV9yZXZlcnQoc3RydWN0IGF1X2R0aW1lICpkdCkKK3sKKwlzdHJ1Y3QgaWF0
dHIgYXR0cjsKKwlpbnQgZXJyOworCXN0cnVjdCBhdV9oaW5faWdub3JlIGlnbjsKKwlzdHJ1Y3Qg
dmZzdWJfYXJncyB2YXJnczsKKworCUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVETE5QYWlyKGR0LT5k
dF9kZW50cnkpKTsKKworCWF0dHIuaWFfYXRpbWUgPSBkdC0+ZHRfYXRpbWU7CisJYXR0ci5pYV9t
dGltZSA9IGR0LT5kdF9tdGltZTsKKwlhdHRyLmlhX3ZhbGlkID0gQVRUUl9GT1JDRSB8IEFUVFJf
TVRJTUUgfCBBVFRSX01USU1FX1NFVAorCQl8IEFUVFJfQVRJTUUgfCBBVFRSX0FUSU1FX1NFVDsK
KworCXZmc3ViX2FyZ3NfaW5pdCgmdmFyZ3MsICZpZ24sCisJCQlhdV9vcHRfdGVzdF9kbGd0KGF1
X21udGZsYWdzKGR0LT5kdF9kZW50cnktPmRfc2IpKSwgMCk7CisJaWYgKHVubGlrZWx5KGR0LT5k
dF9oZGlyKSkKKwkJdmZzdWJfaWduX2hpbm9kZSgmdmFyZ3MsIElOX0FUVFJJQiwgZHQtPmR0X2hk
aXIpOworCWVyciA9IHZmc3ViX25vdGlmeV9jaGFuZ2UoZHQtPmR0X2hfZGVudHJ5LCAmYXR0ciwg
JnZhcmdzKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJQXVXYXJuKCJyZXN0b3JpbmcgdGltZXN0
YW1wcyBmYWlsZWQoJWQpLiBpZ25vcmVkXG4iLCBlcnIpOworfQorCisvKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
ICovCisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50CitjcHVwX2lhdHRyKHN0cnVjdCBk
ZW50cnkgKmhfZHN0LCBzdHJ1Y3QgZGVudHJ5ICpoX3NyYywgaW50IGRsZ3QpCit7CisJaW50IGVy
ciwgc2JpdHM7CisJc3RydWN0IGlhdHRyIGlhOworCXN0cnVjdCBpbm9kZSAqaF9pc3JjLCAqaF9p
ZHN0OworCXN0cnVjdCB2ZnN1Yl9hcmdzIHZhcmdzOworCisJTEtUUlRyYWNlKCIlLipzXG4iLCBB
dURMTlBhaXIoaF9kc3QpKTsKKwloX2lkc3QgPSBoX2RzdC0+ZF9pbm9kZTsKKwkvL0lNdXN0TG9j
ayhoX2lkc3QpOworCWhfaXNyYyA9IGhfc3JjLT5kX2lub2RlOworCS8vSU11c3RMb2NrKGhfaXNy
Yyk7CisKKwlpYS5pYV92YWxpZCA9IEFUVFJfRk9SQ0UgfCBBVFRSX01PREUgfCBBVFRSX1VJRCB8
IEFUVFJfR0lECisJCXwgQVRUUl9BVElNRSB8IEFUVFJfTVRJTUUKKwkJfCBBVFRSX0FUSU1FX1NF
VCB8IEFUVFJfTVRJTUVfU0VUOworCWlhLmlhX21vZGUgPSBoX2lzcmMtPmlfbW9kZTsKKwlpYS5p
YV91aWQgPSBoX2lzcmMtPmlfdWlkOworCWlhLmlhX2dpZCA9IGhfaXNyYy0+aV9naWQ7CisJaWEu
aWFfYXRpbWUgPSBoX2lzcmMtPmlfYXRpbWU7CisJaWEuaWFfbXRpbWUgPSBoX2lzcmMtPmlfbXRp
bWU7CisJc2JpdHMgPSAhIShpYS5pYV9tb2RlICYgKFNfSVNVSUQgfCBTX0lTR0lEKSk7CisKKwl2
ZnN1Yl9hcmdzX2luaXQoJnZhcmdzLCBOVUxMLCBkbGd0LCAvKmZvcmNlX3VubGluayovMCk7CisJ
ZXJyID0gdmZzdWJfbm90aWZ5X2NoYW5nZShoX2RzdCwgJmlhLCAmdmFyZ3MpOworCS8vaWYgKExr
dHJDb25kKSBlcnIgPSAtMTsKKworCS8qIGlzIHRoaXMgbmZzIG9ubHk/ICovCisJaWYgKCFlcnIg
JiYgc2JpdHMgJiYgYXVfdGVzdF9uZnMoaF9kc3QtPmRfc2IpKSB7CisJCWlhLmlhX3ZhbGlkID0g
QVRUUl9GT1JDRSB8IEFUVFJfTU9ERTsKKwkJaWEuaWFfbW9kZSA9IGhfaXNyYy0+aV9tb2RlOwor
CQllcnIgPSB2ZnN1Yl9ub3RpZnlfY2hhbmdlKGhfZHN0LCAmaWEsICZ2YXJncyk7CisJfQorCisJ
aWYgKCFlcnIpCisJCWhfaWRzdC0+aV9mbGFncyA9IGhfaXNyYy0+aV9mbGFnczsgLy8/PworCisJ
QXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiB0byBzdXBwb3J0IGEg
c3BhcnNlIGZpbGUgd2hpY2ggaXMgb3BlbmVkIHdpdGggT19BUFBFTkQsCisgKiB3ZSBuZWVkIHRv
IGNsb3NlIHRoZSBmaWxlLgorICovCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGludAorY3B1
cF9yZWd1bGFyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBiZHN0LCBhdWZz
X2JpbmRleF90IGJzcmMsCisJICAgICBsb2ZmX3QgbGVuKQoreworCWludCBlcnIsIGk7CisJc3Ry
dWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgaW5vZGUgKmhfaW5vZGU7CisJZW51bSB7IFNS
QywgRFNUIH07CisJc3RydWN0IHsKKwkJYXVmc19iaW5kZXhfdCBiaW5kZXg7CisJCXVuc2lnbmVk
IGludCBmbGFnczsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCQlzdHJ1Y3QgZmlsZSAqZmls
ZTsKKwkJdm9pZCAqbGFiZWwsICpsYWJlbF9maWxlOworCX0gKmgsIGhpZGRlbltdID0geworCQl7
CisJCQkuYmluZGV4ID0gYnNyYywKKwkJCS5mbGFncyA9IE9fUkRPTkxZIHwgT19OT0FUSU1FIHwg
T19MQVJHRUZJTEUsCisJCQkuZmlsZSA9IE5VTEwsCisJCQkubGFiZWwgPSAmJm91dCwKKwkJCS5s
YWJlbF9maWxlID0gJiZvdXRfc3JjX2ZpbGUKKwkJfSwKKwkJeworCQkJLmJpbmRleCA9IGJkc3Qs
CisJCQkuZmxhZ3MgPSBPX1dST05MWSB8IE9fTk9BVElNRSB8IE9fTEFSR0VGSUxFLAorCQkJLmZp
bGUgPSBOVUxMLAorCQkJLmxhYmVsID0gJiZvdXRfc3JjX2ZpbGUsCisJCQkubGFiZWxfZmlsZSA9
ICYmb3V0X2RzdF9maWxlCisJCX0KKwl9OworCisJTEtUUlRyYWNlKCJkZW50cnkgJS4qcywgYmRz
dCAlZCwgYnNyYyAlZCwgbGVuICVsbGRcbiIsCisJCSAgQXVETE5QYWlyKGRlbnRyeSksIGJkc3Qs
IGJzcmMsIGxlbik7CisJQXVEZWJ1Z09uKGJzcmMgPD0gYmRzdCk7CisJQXVEZWJ1Z09uKCFsZW4p
OworCXNiID0gZGVudHJ5LT5kX3NiOworCUF1RGVidWdPbihhdV90ZXN0X3JvKHNiLCBiZHN0LCBk
ZW50cnktPmRfaW5vZGUpKTsKKwkvKiBic3JjIGJyYW5jaCBjYW4gYmUgcm8vcncuICovCisKKwlo
ID0gaGlkZGVuOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyssIGgrKykgeworCQloLT5kZW50cnkg
PSBhdV9oX2RwdHIoZGVudHJ5LCBoLT5iaW5kZXgpOworCQlBdURlYnVnT24oIWgtPmRlbnRyeSk7
CisJCWhfaW5vZGUgPSBoLT5kZW50cnktPmRfaW5vZGU7CisJCUF1RGVidWdPbighaF9pbm9kZSB8
fCAhU19JU1JFRyhoX2lub2RlLT5pX21vZGUpKTsKKwkJaC0+ZmlsZSA9IGF1X2hfb3BlbihkZW50
cnksIGgtPmJpbmRleCwgaC0+ZmxhZ3MsIC8qZmlsZSovTlVMTCk7CisJCS8vaWYgKExrdHJDb25k
KQorCQkvL3tmcHV0KGgtPmZpbGUpO2F1X3Nicl9wdXQoc2IsIGgtPmJpbmRleCk7aC0+ZmlsZT1F
UlJfUFRSKC0xKTt9CisJCWVyciA9IFBUUl9FUlIoaC0+ZmlsZSk7CisJCWlmIChJU19FUlIoaC0+
ZmlsZSkpCisJCQlnb3RvICpoLT5sYWJlbDsKKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKHVubGlr
ZWx5KCFoLT5maWxlLT5mX29wKSkKKwkJCWdvdG8gKmgtPmxhYmVsX2ZpbGU7CisJfQorCisJLyog
c3RvcCB1cGRhdGluZyB3aGlsZSB3ZSBjb3B5dXAgKi8KKwlJTXVzdExvY2soaGlkZGVuW1NSQ10u
ZGVudHJ5LT5kX2lub2RlKTsKKwllcnIgPSBhdV9jb3B5X2ZpbGUoaGlkZGVuW0RTVF0uZmlsZSwg
aGlkZGVuW1NSQ10uZmlsZSwgbGVuLCBzYik7CisKKyBvdXRfZHN0X2ZpbGU6CisJZnB1dChoaWRk
ZW5bRFNUXS5maWxlKTsKKwlhdV9zYnJfcHV0KHNiLCBoaWRkZW5bRFNUXS5iaW5kZXgpOworIG91
dF9zcmNfZmlsZToKKwlmcHV0KGhpZGRlbltTUkNdLmZpbGUpOworCWF1X3Nicl9wdXQoc2IsIGhp
ZGRlbltTUkNdLmJpbmRleCk7Cisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJy
OworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGludAorYXVfZG9fY3B1cF9yZWd1bGFy
KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBiZHN0LAorCQkgICBhdWZzX2Jp
bmRleF90IGJzcmMsIGxvZmZfdCBsZW4sIHN0cnVjdCBpbm9kZSAqaF9pbm9kZSwKKwkJICAgc3Ry
dWN0IGlub2RlICpoX2Rpciwgc3RydWN0IGRlbnRyeSAqaF9kc3QsIGludCBkbGd0KQoreworCWlu
dCBlcnIsIHJlcnI7CisJbG9mZl90IGw7CisJc3RydWN0IHZmc3ViX2FyZ3MgdmFyZ3M7CisKKwlB
dVRyYWNlRW50ZXIoKTsKKworCWVyciA9IDA7CisJbCA9IGlfc2l6ZV9yZWFkKGhfaW5vZGUpOwor
CWlmIChsZW4gPT0gLTEgfHwgbCA8IGxlbikKKwkJbGVuID0gbDsKKwlpZiAobGVuKQorCQllcnIg
PSBjcHVwX3JlZ3VsYXIoZGVudHJ5LCBiZHN0LCBic3JjLCBsZW4pOworCQkvL2lmIChMa3RyQ29u
ZCkgZXJyID0gLTE7CisJaWYgKCFlcnIpCisJCWdvdG8gb3V0OyAvKiBzdWNjZXNzICovCisKKwl2
ZnN1Yl9hcmdzX2luaXQoJnZhcmdzLCBOVUxMLCBkbGd0LCAwKTsKKwlyZXJyID0gdmZzdWJfdW5s
aW5rKGhfZGlyLCBoX2RzdCwgJnZhcmdzKTsKKwlpZiAocmVycikgeworCQlBdUlPRXJyKCJmYWls
ZWQgdW5saW5raW5nIGNwdXAtZWQgJS4qcyglZCwgJWQpXG4iLAorCQkJQXVETE5QYWlyKGhfZHN0
KSwgZXJyLCByZXJyKTsKKwkJZXJyID0gLUVJTzsKKwl9CisKKyBvdXQ6CisJQXVUcmFjZUVycihl
cnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50Cith
dV9kb19jcHVwX3N5bWxpbmsoc3RydWN0IGRlbnRyeSAqaF9kc3QsIHN0cnVjdCBkZW50cnkgKmhf
c3JjLAorCQkgICBzdHJ1Y3QgaW5vZGUgKmhfZGlyLCB1bW9kZV90IG1vZGUsIGludCBkbGd0KQor
eworCWludCBlcnIsIHN5bWxlbjsKKwljaGFyICpzeW07CisJbW1fc2VnbWVudF90IG9sZF9mczsK
KworCUF1VHJhY2VFbnRlcigpOworCisJZXJyID0gLUVOT01FTTsKKwlzeW0gPSBfX2dldG5hbWUo
KTsKKwkvL2lmIChMa3RyQ29uZCkge19fcHV0bmFtZShzeW0pOyBzeW0gPSBOVUxMO30KKwlpZiAo
dW5saWtlbHkoIXN5bSkpCisJCWdvdG8gb3V0OworCisJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJc2V0
X2ZzKEtFUk5FTF9EUyk7CisJc3ltbGVuID0gaF9zcmMtPmRfaW5vZGUtPmlfb3AtPnJlYWRsaW5r
KGhfc3JjLCAoY2hhciBfX3VzZXIgKilzeW0sCisJCQkJCQlQQVRIX01BWCk7CisJZXJyID0gc3lt
bGVuOworCS8vaWYgKExrdHJDb25kKSBlcnIgPSBzeW1sZW4gPSAtMTsKKwlzZXRfZnMob2xkX2Zz
KTsKKworCWlmIChzeW1sZW4gPiAwKSB7CisJCXN5bVtzeW1sZW5dID0gMDsKKwkJZXJyID0gdmZz
dWJfc3ltbGluayhoX2RpciwgaF9kc3QsIHN5bSwgbW9kZSwgZGxndCk7CisJCS8vaWYgKExrdHJD
b25kKQorCQkvL3t2ZnNfdW5saW5rKGhfZGlyLCBoX2RzdCk7IGVyciA9IC0xO30KKwl9CisJX19w
dXRuYW1lKHN5bSk7CisKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9
CisKKy8qIHJldHVybiB3aXRoIGhpZGRlbiBkc3QgaW5vZGUgaXMgbG9ja2VkICovCitzdGF0aWMg
bm9pbmxpbmVfZm9yX3N0YWNrIGludAorY3B1cF9lbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnks
IGF1ZnNfYmluZGV4X3QgYmRzdCwgYXVmc19iaW5kZXhfdCBic3JjLAorCSAgIGxvZmZfdCBsZW4s
IHVuc2lnbmVkIGludCBmbGFncywgaW50IGRsZ3QpCit7CisJaW50IGVyciwgaXNkaXIsIGhpbm90
aWZ5OworCXN0cnVjdCBkZW50cnkgKmhfc3JjLCAqaF9kc3QsICpoX3BhcmVudCwgKnBhcmVudDsK
KwlzdHJ1Y3QgaW5vZGUgKmhfaW5vZGUsICpoX2RpcjsKKwlzdHJ1Y3QgYXVfZHRpbWUgZHQ7CisJ
dW1vZGVfdCBtb2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGF1X2hpbm9k
ZSAqaGdkaXI7CisJY29uc3QgaW50IGRvX2R0ID0gYXVfZnRlc3RfY3B1cChmbGFncywgRFRJTUUp
OworCXVuc2lnbmVkIGludCBtbnRfZmxhZ3M7CisKKwlMS1RSVHJhY2UoIiUuKnMsIGklbHUsIGJk
c3QgJWQsIGJzcmMgJWQsIGxlbiAlTGQsIGR0aW1lICV1XG4iLAorCQkgIEF1RExOUGFpcihkZW50
cnkpLCBkZW50cnktPmRfaW5vZGUtPmlfaW5vLCBiZHN0LCBic3JjLCBsZW4sCisJCSAgZG9fZHQp
OworCXNiID0gZGVudHJ5LT5kX3NiOworCUF1RGVidWdPbihiZHN0ID49IGJzcmMgfHwgYXVfdGVz
dF9ybyhzYiwgYmRzdCwgTlVMTCkpOworCS8qIGJzcmMgYnJhbmNoIGNhbiBiZSByby9ydy4gKi8K
KworCWhfc3JjID0gYXVfaF9kcHRyKGRlbnRyeSwgYnNyYyk7CisJQXVEZWJ1Z09uKCFoX3NyYyk7
CisJaF9pbm9kZSA9IGhfc3JjLT5kX2lub2RlOworCUF1RGVidWdPbighaF9pbm9kZSk7CisKKwkv
KiBzdG9wIHJlZmVyZW5jaW5nIHdoaWxlIHdlIGFyZSBjcmVhdGluZyAqLworCXBhcmVudCA9IGRn
ZXRfcGFyZW50KGRlbnRyeSk7CisJaF9kc3QgPSBhdV9oX2RwdHIoZGVudHJ5LCBiZHN0KTsKKwlB
dURlYnVnT24oaF9kc3QgJiYgaF9kc3QtPmRfaW5vZGUpOworCWhfcGFyZW50ID0gaF9kc3QtPmRf
cGFyZW50OyAvKiBkaXIgaW5vZGUgaXMgbG9ja2VkICovCisJaF9kaXIgPSBoX3BhcmVudC0+ZF9p
bm9kZTsKKwlJTXVzdExvY2soaF9kaXIpOworCisJbW50X2ZsYWdzID0gYXVfbW50ZmxhZ3Moc2Ip
OworCWhpbm90aWZ5ID0gISFhdV9vcHRfdGVzdChtbnRfZmxhZ3MsIFVEQkFfSU5PVElGWSk7CisJ
aWYgKGRvX2R0KSB7CisJCWhnZGlyID0gTlVMTDsKKwkJaWYgKHVubGlrZWx5KGhpbm90aWZ5ICYm
ICFJU19ST09UKHBhcmVudCkpKSB7CisJCQlzdHJ1Y3QgZGVudHJ5ICpncGFyZW50OworCQkJZ3Bh
cmVudCA9IGRnZXRfcGFyZW50KHBhcmVudCk7CisJCQloZ2RpciA9IGF1X2hpKGdwYXJlbnQtPmRf
aW5vZGUsIGJkc3QpOworCQkJZHB1dChncGFyZW50KTsKKwkJfQorCQlhdV9kdGltZV9zdG9yZSgm
ZHQsIHBhcmVudCwgaF9wYXJlbnQsIGhnZGlyKTsKKwl9CisKKwlpc2RpciA9IDA7CisJbW9kZSA9
IGhfaW5vZGUtPmlfbW9kZTsKKwlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZS
RUc6CisJCS8qIHN0b3AgdXBkYXRpbmcgd2hpbGUgd2UgYXJlIHJlZmVyZW5jaW5nICovCisJCUlN
dXN0TG9jayhoX2lub2RlKTsKKwkJZXJyID0gYXVfaF9jcmVhdGUoaF9kaXIsIGhfZHN0LCBtb2Rl
IHwgU19JV1VTUiwgZGxndCwgTlVMTCwKKwkJCQkgIGF1X25mc21udChzYiwgYmRzdCkpOworCQkv
L2lmIChMa3RyQ29uZCkge3Zmc191bmxpbmsoaF9kaXIsIGhfZHN0KTsgZXJyID0gLTE7fQorCQlp
ZiAoIWVycikKKwkJCWVyciA9IGF1X2RvX2NwdXBfcmVndWxhcihkZW50cnksIGJkc3QsIGJzcmMs
IGxlbiwKKwkJCQkJCSBoX2lub2RlLCBoX2RpciwgaF9kc3QsIGRsZ3QpOworCQlicmVhazsKKwlj
YXNlIFNfSUZESVI6CisJCWlzZGlyID0gMTsKKwkJZXJyID0gdmZzdWJfbWtkaXIoaF9kaXIsIGhf
ZHN0LCBtb2RlLCBkbGd0KTsKKwkJLy9pZiAoTGt0ckNvbmQpIHt2ZnNfcm1kaXIoaF9kaXIsIGhf
ZHN0KTsgZXJyID0gLTE7fQorCQlpZiAoIWVycikgeworCQkJLyogc2V0YXR0ciBjYXNlOiBkaXIg
aXMgbm90IGxvY2tlZCAqLworCQkJaWYgKDAgJiYgYXVfaWJzdGFydChwYXJlbnQtPmRfaW5vZGUp
ID09IGJkc3QpCisJCQkJYXVfY3B1cF9hdHRyX25saW5rKHBhcmVudC0+ZF9pbm9kZSk7CisJCQlh
dV9jcHVwX2F0dHJfbmxpbmsoZGVudHJ5LT5kX2lub2RlKTsKKwkJfQorCQlicmVhazsKKwljYXNl
IFNfSUZMTks6CisJCWVyciA9IGF1X2RvX2NwdXBfc3ltbGluayhoX2RzdCwgaF9zcmMsIGhfZGly
LCBtb2RlLCBkbGd0KTsKKwkJYnJlYWs7CisJY2FzZSBTX0lGQ0hSOgorCWNhc2UgU19JRkJMSzoK
KwkJQXVEZWJ1Z09uKCFjYXBhYmxlKENBUF9NS05PRCkpOworCQkvKkZBTExUSFJPVUdIKi8KKwlj
YXNlIFNfSUZJRk86CisJY2FzZSBTX0lGU09DSzoKKwkJZXJyID0gdmZzdWJfbWtub2QoaF9kaXIs
IGhfZHN0LCBtb2RlLAorCQkJCSAgYXVfaF9yZGV2KGhfaW5vZGUsIC8qaF9tbnQqL05VTEwsIGhf
c3JjKSwKKwkJCQkgIGRsZ3QpOworCQkvL2lmIChMa3RyQ29uZCkge3Zmc191bmxpbmsoaF9kaXIs
IGhfZHN0KTsgZXJyID0gLTE7fQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlBdUlPRXJyKCJVbmtu
b3duIGlub2RlIHR5cGUgMCVvXG4iLCBtb2RlKTsKKwkJZXJyID0gLUVJTzsKKwl9CisKKwkvL3Rv
ZG86IHNob3VsZCBpdCBiZSBhbHdheXM/CisJaWYgKHVubGlrZWx5KGhpbm90aWZ5CisJCSAgICAg
JiYgIWlzZGlyCisJCSAgICAgJiYgYXVfb3B0X3Rlc3QobW50X2ZsYWdzLCBYSU5PKQorCQkgICAg
ICYmIGhfaW5vZGUtPmlfbmxpbmsgPT0gMQorCQkgICAgICYmIGJkc3QgPCBic3JjKSkKKwkJYXVf
eGlub193cml0ZTAoc2IsIGJzcmMsIGhfaW5vZGUtPmlfaW5vLCAvKmlubyovMCk7CisJCS8qIGln
bm9yZSB0aGlzIGVycm9yICovCisKKwlpZiAoZG9fZHQpCisJCWF1X2R0aW1lX3JldmVydCgmZHQp
OworCWRwdXQocGFyZW50KTsKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKwor
LyoKKyAqIGNvcHl1cCB0aGUgQGRlbnRyeSBmcm9tIEBic3JjIHRvIEBiZHN0LgorICogdGhlIGNh
bGxlciBtdXN0IHNldCB0aGUgYm90aCBvZiBoaWRkZW4gZGVudHJpZXMuCisgKiBAbGVuIGlzIGZv
ciB0cnVuY2F0aW5nIHdoZW4gaXQgaXMgLTEgY29weXVwIHRoZSBlbnRpcmUgZmlsZS4KKyAqLwor
aW50IGF1X2NwdXBfc2luZ2xlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBi
ZHN0LAorCQkgICBhdWZzX2JpbmRleF90IGJzcmMsIGxvZmZfdCBsZW4sIHVuc2lnbmVkIGludCBm
bGFncykKK3sKKwlpbnQgZXJyLCByZXJyLCBpc2RpciwgZGxndCwgcGxpbms7CisJc3RydWN0IGRl
bnRyeSAqaF9zcmMsICpoX2RzdCwgKnBhcmVudCwgKmhfcGFyZW50OworCXN0cnVjdCBpbm9kZSAq
ZHN0X2lub2RlLCAqaF9kaXIsICppbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWF1
ZnNfYmluZGV4X3Qgb2xkX2lic3RhcnQ7CisJc3RydWN0IGF1X2R0aW1lIGR0OworCXN0cnVjdCB2
ZnN1Yl9hcmdzIHZhcmdzOworCXN0cnVjdCBhdV9oaW5vZGUgKmhnZGlyOworCXVuc2lnbmVkIGlu
dCBtbnRfZmxhZ3M7CisKKwlMS1RSVHJhY2UoIiUuKnMsIGklbHUsIGJkc3QgJWQsIGJzcmMgJWQs
IGxlbiAlTGQsIGZsYWdzIDB4JXhcbiIsCisJCSAgQXVETE5QYWlyKGRlbnRyeSksIGRlbnRyeS0+
ZF9pbm9kZS0+aV9pbm8sIGJkc3QsIGJzcmMsIGxlbiwKKwkJICBmbGFncyk7CisJc2IgPSBkZW50
cnktPmRfc2I7CisJQXVEZWJ1Z09uKGJzcmMgPD0gYmRzdCk7CisJaF9kc3QgPSBhdV9oX2RwdHIo
ZGVudHJ5LCBiZHN0KTsKKwlBdURlYnVnT24oIWhfZHN0IHx8IGhfZHN0LT5kX2lub2RlKTsKKwlo
X3BhcmVudCA9IGhfZHN0LT5kX3BhcmVudDsgLyogZGlyIGlub2RlIGlzIGxvY2tlZCAqLworCWhf
ZGlyID0gaF9wYXJlbnQtPmRfaW5vZGU7CisJSU11c3RMb2NrKGhfZGlyKTsKKwloX3NyYyA9IGF1
X2hfZHB0cihkZW50cnksIGJzcmMpOworCUF1RGVidWdPbighaF9zcmMgfHwgIWhfc3JjLT5kX2lu
b2RlKTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlJaU11c3RXcml0ZUxvY2soaW5vZGUp
OworCXBhcmVudCA9IGRnZXRfcGFyZW50KGRlbnRyeSk7CisKKwltbnRfZmxhZ3MgPSBhdV9tbnRm
bGFncyhzYik7CisJZGxndCA9ICEhYXVfb3B0X3Rlc3RfZGxndChtbnRfZmxhZ3MpOworCXBsaW5r
ID0gISFhdV9vcHRfdGVzdChtbnRfZmxhZ3MsIFBMSU5LKTsKKwlkc3RfaW5vZGUgPSBhdV9oX2lw
dHIoaW5vZGUsIGJkc3QpOworCWlmICh1bmxpa2VseShkc3RfaW5vZGUpKSB7CisJCWlmICh1bmxp
a2VseSghcGxpbmspKSB7CisJCQllcnIgPSAtRUlPOworCQkJQXVJT0VycigiaSVsdSBleGlzdHMg
b24gYSB1cHBlciBicmFuY2ggIgorCQkJCSJidXQgcGxpbmsgaXMgZGlzYWJsZWRcbiIsIGlub2Rl
LT5pX2lubyk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChkc3RfaW5vZGUtPmlfbmxpbmsp
IHsKKwkJCWhfc3JjID0gYXVfcGxpbmtfbGt1cChzYiwgYmRzdCwgaW5vZGUpOworCQkJZXJyID0g
UFRSX0VSUihoX3NyYyk7CisJCQlpZiAoSVNfRVJSKGhfc3JjKSkKKwkJCQlnb3RvIG91dDsKKwkJ
CUF1RGVidWdPbighaF9zcmMtPmRfaW5vZGUpOworCQkJZXJyID0gdmZzdWJfbGluayhoX3NyYywg
aF9kaXIsIGhfZHN0LCBkbGd0KTsKKwkJCWRwdXQoaF9zcmMpOworCQkJZ290byBvdXQ7CisJCX0g
ZWxzZQorCQkJLy90b2RvOiBjcHVwX3doX2ZpbGUKKwkJCS8qIHVkYmEgd29yayAqLworCQkJYXVf
dXBkYXRlX2JyYW5nZShpbm9kZSwgMSk7CisJfQorCisJb2xkX2lic3RhcnQgPSBhdV9pYnN0YXJ0
KGlub2RlKTsKKwllcnIgPSBjcHVwX2VudHJ5KGRlbnRyeSwgYmRzdCwgYnNyYywgbGVuLCBmbGFn
cywgZGxndCk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0OworCWRzdF9pbm9kZSA9
IGhfZHN0LT5kX2lub2RlOworCW11dGV4X2xvY2tfbmVzdGVkKCZkc3RfaW5vZGUtPmlfbXV0ZXgs
IEF1THNjX0lfQ0hJTEQyKTsKKworCS8vdG9kbzogdGVzdCBkbGd0CisJZXJyID0gY3B1cF9pYXR0
cihoX2RzdCwgaF9zcmMsIGRsZ3QpOworCS8vaWYgKExrdHJDb25kKSBlcnIgPSAtMTsKKwlpc2Rp
ciA9IFNfSVNESVIoZHN0X2lub2RlLT5pX21vZGUpOworCWlmICghZXJyKSB7CisJCWlmIChiZHN0
IDwgb2xkX2lic3RhcnQpCisJCQlhdV9zZXRfaWJzdGFydChpbm9kZSwgYmRzdCk7CisJCWF1X3Nl
dF9oX2lwdHIoaW5vZGUsIGJkc3QsIGlncmFiKGRzdF9pbm9kZSksCisJCQkgICAgICBhdV9oaV9m
bGFncyhpbm9kZSwgaXNkaXIpKTsKKwkJbXV0ZXhfdW5sb2NrKCZkc3RfaW5vZGUtPmlfbXV0ZXgp
OworCQlpZiAoIWlzZGlyCisJCSAgICAmJiBoX3NyYy0+ZF9pbm9kZS0+aV9ubGluayA+IDEKKwkJ
ICAgICYmIHBsaW5rKQorCQkJYXVfcGxpbmtfYXBwZW5kKHNiLCBpbm9kZSwgaF9kc3QsIGJkc3Qp
OworCQlnb3RvIG91dDsgLyogc3VjY2VzcyAqLworCX0KKworCS8qIHJldmVydCAqLworCW11dGV4
X3VubG9jaygmZHN0X2lub2RlLT5pX211dGV4KTsKKwloZ2RpciA9IE5VTEw7CisJaWYgKHVubGlr
ZWx5KGF1X29wdF90ZXN0KG1udF9mbGFncywgVURCQV9JTk9USUZZKQorCQkgICAgICYmICFJU19S
T09UKHBhcmVudCkpKSB7CisJCXN0cnVjdCBkZW50cnkgKmdwYXJlbnQ7CisJCWdwYXJlbnQgPSBk
Z2V0X3BhcmVudChwYXJlbnQpOworCQloZ2RpciA9IGF1X2hpKGdwYXJlbnQtPmRfaW5vZGUsIGJk
c3QpOworCQlkcHV0KGdwYXJlbnQpOworCX0KKwlhdV9kdGltZV9zdG9yZSgmZHQsIHBhcmVudCwg
aF9wYXJlbnQsIGhnZGlyKTsKKwl2ZnN1Yl9hcmdzX2luaXQoJnZhcmdzLCBOVUxMLCBkbGd0LCAw
KTsKKwlpZiAoIWlzZGlyKQorCQlyZXJyID0gdmZzdWJfdW5saW5rKGhfZGlyLCBoX2RzdCwgJnZh
cmdzKTsKKwllbHNlCisJCXJlcnIgPSB2ZnN1Yl9ybWRpcihoX2RpciwgaF9kc3QsICZ2YXJncyk7
CisJLy9yZXJyID0gLTE7CisJYXVfZHRpbWVfcmV2ZXJ0KCZkdCk7CisJaWYgKHJlcnIpIHsKKwkJ
QXVJT0VycigiZmFpbGVkIHJlbW92aW5nIGJyb2tlbiBlbnRyeSglZCwgJWQpXG4iLCBlcnIsIHJl
cnIpOworCQllcnIgPSAtRUlPOworCX0KKworIG91dDoKKwlkcHV0KHBhcmVudCk7CisJQXVUcmFj
ZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBhdV9jcHVwX3NpbmdsZV9hcmdz
IHsKKwlpbnQgKmVycnA7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWF1ZnNfYmluZGV4X3Qg
YmRzdCwgYnNyYzsKKwlsb2ZmX3QgbGVuOworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKK3N0
YXRpYyB2b2lkIGF1X2NhbGxfY3B1cF9zaW5nbGUodm9pZCAqYXJncykKK3sKKwlzdHJ1Y3QgYXVf
Y3B1cF9zaW5nbGVfYXJncyAqYSA9IGFyZ3M7CisJKmEtPmVycnAgPSBhdV9jcHVwX3NpbmdsZShh
LT5kZW50cnksIGEtPmJkc3QsIGEtPmJzcmMsIGEtPmxlbiwKKwkJCQkgIGEtPmZsYWdzKTsKK30K
KworaW50IGF1X3Npb19jcHVwX3NpbmdsZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmlu
ZGV4X3QgYmRzdCwKKwkJICAgICAgIGF1ZnNfYmluZGV4X3QgYnNyYywgbG9mZl90IGxlbiwgdW5z
aWduZWQgaW50IGZsYWdzKQoreworCWludCBlcnIsIHdrcV9lcnI7CisJc3RydWN0IGRlbnRyeSAq
aF9kZW50cnk7CisJdW1vZGVfdCBtb2RlOworCisJTEtUUlRyYWNlKCIlLipzLCBpJWx1LCBiZHN0
ICVkLCBic3JjICVkLCBsZW4gJUxkLCBmbGFncyAweCV4XG4iLAorCQkgIEF1RExOUGFpcihkZW50
cnkpLCBkZW50cnktPmRfaW5vZGUtPmlfaW5vLCBiZHN0LCBic3JjLCBsZW4sCisJCSAgZmxhZ3Mp
OworCisJaF9kZW50cnkgPSBhdV9oX2RwdHIoZGVudHJ5LCBic3JjKTsKKwltb2RlID0gaF9kZW50
cnktPmRfaW5vZGUtPmlfbW9kZSAmIFNfSUZNVDsKKwlpZiAoKG1vZGUgIT0gU19JRkNIUiAmJiBt
b2RlICE9IFNfSUZCTEspCisJICAgIHx8IGNhcGFibGUoQ0FQX01LTk9EKSkKKwkJZXJyID0gYXVf
Y3B1cF9zaW5nbGUoZGVudHJ5LCBiZHN0LCBic3JjLCBsZW4sIGZsYWdzKTsKKwllbHNlIHsKKwkJ
c3RydWN0IGF1X2NwdXBfc2luZ2xlX2FyZ3MgYXJncyA9IHsKKwkJCS5lcnJwCQk9ICZlcnIsCisJ
CQkuZGVudHJ5CQk9IGRlbnRyeSwKKwkJCS5iZHN0CQk9IGJkc3QsCisJCQkuYnNyYwkJPSBic3Jj
LAorCQkJLmxlbgkJPSBsZW4sCisJCQkuZmxhZ3MJCT0gZmxhZ3MKKwkJfTsKKwkJd2txX2VyciA9
IGF1X3drcV93YWl0KGF1X2NhbGxfY3B1cF9zaW5nbGUsICZhcmdzLCAvKmRsZ3QqLzApOworCQlp
ZiAodW5saWtlbHkod2txX2VycikpCisJCQllcnIgPSB3a3FfZXJyOworCX0KKworCUF1VHJhY2VF
cnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogY29weXVwIHRoZSBAZGVudHJ5IGZy
b20gdGhlIGZpcnN0IGFjdGl2ZSBoaWRkZW4gYnJhbmNoIHRvIEBiZHN0LAorICogdXNpbmcgYXVf
Y3B1cF9zaW5nbGUoKS4KKyAqLworaW50IGF1X2NwdXBfc2ltcGxlKHN0cnVjdCBkZW50cnkgKmRl
bnRyeSwgYXVmc19iaW5kZXhfdCBiZHN0LCBsb2ZmX3QgbGVuLAorCQkgICB1bnNpZ25lZCBpbnQg
ZmxhZ3MpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWF1ZnNfYmluZGV4
X3QgYnNyYywgYmVuZDsKKworCUxLVFJUcmFjZSgiJS4qcywgYmRzdCAlZCwgbGVuICVMZCwgZmxh
Z3MgMHgleFxuIiwKKwkJICBBdURMTlBhaXIoZGVudHJ5KSwgYmRzdCwgbGVuLCBmbGFncyk7CisJ
aW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJQXVEZWJ1Z09uKCFTX0lTRElSKGlub2RlLT5pX21v
ZGUpICYmIGF1X2Ric3RhcnQoZGVudHJ5KSA8IGJkc3QpOworCisJYmVuZCA9IGF1X2RiZW5kKGRl
bnRyeSk7CisJZm9yIChic3JjID0gYmRzdCArIDE7IGJzcmMgPD0gYmVuZDsgYnNyYysrKQorCQlp
ZiAoYXVfaF9kcHRyKGRlbnRyeSwgYnNyYykpCisJCQlicmVhazsKKwlBdURlYnVnT24oIWF1X2hf
ZHB0cihkZW50cnksIGJzcmMpKTsKKworCWVyciA9IGF1X2xrdXBfbmVnKGRlbnRyeSwgYmRzdCk7
CisJLy9lcnIgPSAtMTsKKwlpZiAoIWVycikgeworCQllcnIgPSBhdV9jcHVwX3NpbmdsZShkZW50
cnksIGJkc3QsIGJzcmMsIGxlbiwgZmxhZ3MpOworCQlpZiAoIWVycikKKwkJCXJldHVybiAwOyAv
KiBzdWNjZXNzICovCisKKwkJLyogcmV2ZXJ0ICovCisJCWF1X3NldF9oX2RwdHIoZGVudHJ5LCBi
ZHN0LCBOVUxMKTsKKwkJYXVfc2V0X2Ric3RhcnQoZGVudHJ5LCBic3JjKTsKKwl9CisKKwlBdVRy
YWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGF1X2NwdXBfc2ltcGxlX2Fy
Z3MgeworCWludCAqZXJycDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJYXVmc19iaW5kZXhf
dCBiZHN0OworCWxvZmZfdCBsZW47CisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworc3RhdGlj
IHZvaWQgYXVfY2FsbF9jcHVwX3NpbXBsZSh2b2lkICphcmdzKQoreworCXN0cnVjdCBhdV9jcHVw
X3NpbXBsZV9hcmdzICphID0gYXJnczsKKwkqYS0+ZXJycCA9IGF1X2NwdXBfc2ltcGxlKGEtPmRl
bnRyeSwgYS0+YmRzdCwgYS0+bGVuLCBhLT5mbGFncyk7Cit9CisKK2ludCBhdV9zaW9fY3B1cF9z
aW1wbGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBhdWZzX2JpbmRleF90IGJkc3QsIGxvZmZfdCBs
ZW4sCisJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciwgZG9fc2lvLCBk
bGd0LCB3a3FfZXJyOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmhf
ZGlyLCAqZGlyOworCisJTEtUUlRyYWNlKCIlLipzLCBiJWQsIGxlbiAlTGQsIGZsYWdzIDB4JXhc
biIsCisJCSAgQXVETE5QYWlyKGRlbnRyeSksIGJkc3QsIGxlbiwgZmxhZ3MpOworCisJcGFyZW50
ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwlkaXIgPSBwYXJlbnQtPmRfaW5vZGU7CisJaF9kaXIg
PSBhdV9oX2lwdHIoZGlyLCBiZHN0KTsKKwlkbGd0ID0gISFhdV9vcHRfdGVzdF9kbGd0KGF1X21u
dGZsYWdzKGRpci0+aV9zYikpOworCWRvX3NpbyA9IGF1X3Rlc3RfaF9wZXJtX3NpbyhoX2Rpciwg
TUFZX0VYRUMgfCBNQVlfV1JJVEUsIGRsZ3QpOworCWlmICghZG9fc2lvKSB7CisJCS8qCisJCSAq
IHRlc3RpbmcgQ0FQX01LTk9EIGlzIGZvciBnZW5lcmljIGZzLAorCQkgKiBidXQgQ0FQX0ZTRVRJ
RCBpcyBmb3IgeGZzIG9ubHksIGN1cnJlbnRseS4KKwkJICovCisJCXVtb2RlX3QgbW9kZSA9IGRl
bnRyeS0+ZF9pbm9kZS0+aV9tb2RlOworCQlkb19zaW8gPSAoKChtb2RlICYgKFNfSUZDSFIgfCBT
X0lGQkxLKSkKKwkJCSAgICYmICFjYXBhYmxlKENBUF9NS05PRCkpCisJCQkgIHx8ICgobW9kZSAm
IChTX0lTVUlEIHwgU19JU0dJRCkpCisJCQkgICAgICAmJiAhY2FwYWJsZShDQVBfRlNFVElEKSkp
OworCX0KKwlpZiAoIWRvX3NpbykKKwkJZXJyID0gYXVfY3B1cF9zaW1wbGUoZGVudHJ5LCBiZHN0
LCBsZW4sIGZsYWdzKTsKKwllbHNlIHsKKwkJc3RydWN0IGF1X2NwdXBfc2ltcGxlX2FyZ3MgYXJn
cyA9IHsKKwkJCS5lcnJwCQk9ICZlcnIsCisJCQkuZGVudHJ5CQk9IGRlbnRyeSwKKwkJCS5iZHN0
CQk9IGJkc3QsCisJCQkubGVuCQk9IGxlbiwKKwkJCS5mbGFncwkJPSBmbGFncworCQl9OworCQl3
a3FfZXJyID0gYXVfd2txX3dhaXQoYXVfY2FsbF9jcHVwX3NpbXBsZSwgJmFyZ3MsIC8qZGxndCov
MCk7CisJCWlmICh1bmxpa2VseSh3a3FfZXJyKSkKKwkJCWVyciA9IHdrcV9lcnI7CisJfQorCisJ
ZHB1dChwYXJlbnQpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50CithdV9kb19j
cHVwX3doKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBiZHN0LAorCSAgICAg
IHN0cnVjdCBkZW50cnkgKndoX2RlbnRyeSwgc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBsZW4p
Cit7CisJaW50IGVycjsKKwlzdHJ1Y3QgYXVfZGluZm8gKmRpbmZvOworCWF1ZnNfYmluZGV4X3Qg
YnN0YXJ0OworCXN0cnVjdCBkZW50cnkgKmhfZF9iZHN0LCAqaF9kX2JzdGFydDsKKworCUF1VHJh
Y2VFbnRlcigpOworCisJZGluZm8gPSBhdV9kaShkZW50cnkpOworCWJzdGFydCA9IGRpbmZvLT5k
aV9ic3RhcnQ7CisJaF9kX2Jkc3QgPSBkaW5mby0+ZGlfaGRlbnRyeVswICsgYmRzdF0uaGRfZGVu
dHJ5OworCWRpbmZvLT5kaV9ic3RhcnQgPSBiZHN0OworCWRpbmZvLT5kaV9oZGVudHJ5WzAgKyBi
ZHN0XS5oZF9kZW50cnkgPSB3aF9kZW50cnk7CisJaF9kX2JzdGFydCA9IGRpbmZvLT5kaV9oZGVu
dHJ5WzAgKyBic3RhcnRdLmhkX2RlbnRyeTsKKwlpZiAoZmlsZSkKKwkJZGluZm8tPmRpX2hkZW50
cnlbMCArIGJzdGFydF0uaGRfZGVudHJ5CisJCQk9IGF1X2hfZnB0cihmaWxlLCBhdV9mYnN0YXJ0
KGZpbGUpKS0+Zl9kZW50cnk7CisJZXJyID0gYXVfY3B1cF9zaW5nbGUoZGVudHJ5LCBiZHN0LCBi
c3RhcnQsIGxlbiwgIUF1Q3B1cF9EVElNRSk7CisJLy9pZiAoTGt0ckNvbmQpIGVyciA9IC0xOwor
CWlmICghZXJyICYmIGZpbGUpIHsKKwkJZXJyID0gYXVfcmVvcGVuX25vbmRpcihmaWxlKTsKKwkJ
Ly9lcnIgPSAtMTsKKwkJZGluZm8tPmRpX2hkZW50cnlbMCArIGJzdGFydF0uaGRfZGVudHJ5ID0g
aF9kX2JzdGFydDsKKwl9CisJZGluZm8tPmRpX2hkZW50cnlbMCArIGJkc3RdLmhkX2RlbnRyeSA9
IGhfZF9iZHN0OworCWRpbmZvLT5kaV9ic3RhcnQgPSBic3RhcnQ7CisKKwlBdVRyYWNlRXJyKGVy
cik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGNvcHl1cCB0aGUgZGVsZXRlZCBmaWxlIGZv
ciB3cml0aW5nLgorICovCitpbnQgYXVfY3B1cF93aChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1
ZnNfYmluZGV4X3QgYmRzdCwgbG9mZl90IGxlbiwKKwkgICAgICAgc3RydWN0IGZpbGUgKmZpbGUp
Cit7CisJaW50IGVyciwgZGxndDsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsICpoX3BhcmVudCwg
KndoX2RlbnRyeTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXVuc2lnbmVkIGludCBtbnRf
ZmxhZ3M7CisJc3RydWN0IGF1X2R0aW1lIGR0OworCXN0cnVjdCB2ZnN1Yl9hcmdzIHZhcmdzOwor
CXN0cnVjdCBhdV9oaW5vZGUgKmhnZGlyOworCXN0cnVjdCBhdV9uZHggbmR4ID0geworCQkubmQJ
PSBOVUxMLAorCQkuZmxhZ3MJPSAwLAorCQkvLy5icgk9IE5VTEwKKwl9OworCisJTEtUUlRyYWNl
KCIlLipzLCBiZHN0ICVkLCBsZW4gJUx1XG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgYmRzdCwgbGVu
KTsKKwlBdURlYnVnT24oU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkKKwkJICB8fCAo
ZmlsZSAmJiAhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkpOworCURpTXVzdFdyaXRlTG9j
ayhkZW50cnkpOworCisJcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwlJaU11c3RBbnlM
b2NrKHBhcmVudC0+ZF9pbm9kZSk7CisJaF9wYXJlbnQgPSBhdV9oX2RwdHIocGFyZW50LCBiZHN0
KTsKKwlBdURlYnVnT24oIWhfcGFyZW50KTsKKworCXNiID0gcGFyZW50LT5kX3NiOworCW1udF9m
bGFncyA9IGF1X21udGZsYWdzKHNiKTsKKwlkbGd0ID0gMDsKKwluZHgubmZzbW50ID0gYXVfbmZz
bW50KHNiLCBiZHN0KTsKKwlpZiAodW5saWtlbHkoYXVfb3B0X3Rlc3RfZGxndChtbnRfZmxhZ3Mp
KSkgeworCQlkbGd0ID0gMTsKKwkJYXVfZnNldF9uZHgobmR4LmZsYWdzLCBETEdUKTsKKwl9CisJ
d2hfZGVudHJ5ID0gYXVfd2h0bXBfbGt1cChoX3BhcmVudCwgJmRlbnRyeS0+ZF9uYW1lLCAmbmR4
KTsKKwkvL2lmIChMa3RyQ29uZCkge2RwdXQod2hfZGVudHJ5KTsgd2hfZGVudHJ5ID0gRVJSX1BU
UigtMSk7fQorCWVyciA9IFBUUl9FUlIod2hfZGVudHJ5KTsKKwlpZiAoSVNfRVJSKHdoX2RlbnRy
eSkpCisJCWdvdG8gb3V0OworCisJaGdkaXIgPSBOVUxMOworCWlmICh1bmxpa2VseShhdV9vcHRf
dGVzdChtbnRfZmxhZ3MsIFVEQkFfSU5PVElGWSkKKwkJICAgICAmJiAhSVNfUk9PVChwYXJlbnQp
KSkgeworCQlzdHJ1Y3QgZGVudHJ5ICpncGFyZW50OworCQlncGFyZW50ID0gZGdldF9wYXJlbnQo
cGFyZW50KTsKKwkJaGdkaXIgPSBhdV9oaShncGFyZW50LT5kX2lub2RlLCBiZHN0KTsKKwkJZHB1
dChncGFyZW50KTsKKwl9CisJYXVfZHRpbWVfc3RvcmUoJmR0LCBwYXJlbnQsIGhfcGFyZW50LCBo
Z2Rpcik7CisJZXJyID0gYXVfZG9fY3B1cF93aChkZW50cnksIGJkc3QsIHdoX2RlbnRyeSwgZmls
ZSwgbGVuKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXRfd2g7CisKKwlBdURlYnVn
T24oIWRfdW5oYXNoZWQoZGVudHJ5KSk7CisJLyogZGdldCBmaXJzdCB0byBmb3JjZSBzaWxseXJl
bmFtZSBvbiBuZnMgKi8KKwlkZ2V0KHdoX2RlbnRyeSk7CisJdmZzdWJfYXJnc19pbml0KCZ2YXJn
cywgTlVMTCwgZGxndCwgMCk7CisJZXJyID0gdmZzdWJfdW5saW5rKGhfcGFyZW50LT5kX2lub2Rl
LCB3aF9kZW50cnksICZ2YXJncyk7CisJLy9pZiAoTGt0ckNvbmQpIGVyciA9IC0xOworCWlmICh1
bmxpa2VseShlcnIpKSB7CisJCUF1SU9FcnIoImZhaWxlZCByZW1vdmUgY29waWVkLXVwIHRtcCBm
aWxlICUuKnMoJWQpXG4iLAorCQkJQXVETE5QYWlyKHdoX2RlbnRyeSksIGVycik7CisJCWVyciA9
IC1FSU87CisJfQorCWF1X2R0aW1lX3JldmVydCgmZHQpOworCWF1X3NldF9oaV93aChkZW50cnkt
PmRfaW5vZGUsIGJkc3QsIHdoX2RlbnRyeSk7CisKKyBvdXRfd2g6CisJZHB1dCh3aF9kZW50cnkp
OworIG91dDoKKwlkcHV0KHBhcmVudCk7CisJQXVUcmFjZUVycihlcnIpOworCS8vYXVfZGVidWdf
b2ZmKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGF1X2NwdXBfd2hfYXJncyB7CisJaW50
ICplcnJwOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlhdWZzX2JpbmRleF90IGJkc3Q7CisJ
bG9mZl90IGxlbjsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKK307CisKK3N0YXRpYyB2b2lkIGF1X2Nh
bGxfY3B1cF93aCh2b2lkICphcmdzKQoreworCXN0cnVjdCBhdV9jcHVwX3doX2FyZ3MgKmEgPSBh
cmdzOworCSphLT5lcnJwID0gYXVfY3B1cF93aChhLT5kZW50cnksIGEtPmJkc3QsIGEtPmxlbiwg
YS0+ZmlsZSk7Cit9CisKK2ludCBhdV9zaW9fY3B1cF93aChzdHJ1Y3QgZGVudHJ5ICpkZW50cnks
IGF1ZnNfYmluZGV4X3QgYmRzdCwgbG9mZl90IGxlbiwKKwkJICAgc3RydWN0IGZpbGUgKmZpbGUp
Cit7CisJaW50IGVyciwgd2txX2VycjsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJc3RydWN0
IGlub2RlICpkaXIsICpoX2RpcjsKKworCUF1VHJhY2VFbnRlcigpOworCXBhcmVudCA9IGRnZXRf
cGFyZW50KGRlbnRyeSk7CisJZGlyID0gcGFyZW50LT5kX2lub2RlOworCUlpTXVzdEFueUxvY2so
ZGlyKTsKKwloX2RpciA9IGF1X2hfaXB0cihkaXIsIGJkc3QpOworCisJaWYgKCFhdV90ZXN0X2hf
cGVybV9zaW8KKwkgICAgKGhfZGlyLCBNQVlfRVhFQyB8IE1BWV9XUklURSwKKwkgICAgIGF1X29w
dF90ZXN0X2RsZ3QoYXVfbW50ZmxhZ3MoZGVudHJ5LT5kX3NiKSkpKQorCQllcnIgPSBhdV9jcHVw
X3doKGRlbnRyeSwgYmRzdCwgbGVuLCBmaWxlKTsKKwllbHNlIHsKKwkJc3RydWN0IGF1X2NwdXBf
d2hfYXJncyBhcmdzID0geworCQkJLmVycnAJPSAmZXJyLAorCQkJLmRlbnRyeQk9IGRlbnRyeSwK
KwkJCS5iZHN0CT0gYmRzdCwKKwkJCS5sZW4JPSBsZW4sCisJCQkuZmlsZQk9IGZpbGUKKwkJfTsK
KwkJd2txX2VyciA9IGF1X3drcV93YWl0KGF1X2NhbGxfY3B1cF93aCwgJmFyZ3MsIC8qZGxndCov
MCk7CisJCWlmICh1bmxpa2VseSh3a3FfZXJyKSkKKwkJCWVyciA9IHdrcV9lcnI7CisJfQorCWRw
dXQocGFyZW50KTsKKworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBnZW5lcmljIHJvdXRpbmUgZm9yIGJvdGggb2YgY29w
eS11cCBhbmQgY29weS1kb3duLgorICogQWx0aG91Z2ggSSd2ZSB0cmllZCBidWlsZGluZyBhIHBh
dGggYnkgZGNzdWIsIEkgZ2F2ZSB1cCB0aGlzIGFwcHJvYWNoLgorICogU2luY2UgdGhlIGFuY2Vz
dG9yIGRpcmVjdG9yeSBtYXkgYmUgbW92ZWQvcmVuYW1lZCBkdXJpbmcgY29weS4KKyAqLworLyog
Y2YuIHJldmFsaWRhdGUgZnVuY3Rpb24gaW4gZmlsZS5jICovCitpbnQgYXVfY3BfZGlycyhzdHJ1
Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmRzdCwgc3RydWN0IGRlbnRyeSAqbG9j
a2VkLAorCSAgICAgICBpbnQgKCpjcCkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBhdWZzX2JpbmRl
eF90IGJkc3QsCisJCQkgc3RydWN0IGRlbnRyeSAqaF9wYXJlbnQsIHZvaWQgKmFyZyksCisJICAg
ICAgIHZvaWQgKmFyZykKK3sKKwlpbnQgZXJyLCBoaW5vdGlmeTsKKwlzdHJ1Y3Qgc3VwZXJfYmxv
Y2sgKnNiOworCXN0cnVjdCBkZW50cnkgKmQsICpwYXJlbnQsICpoX3BhcmVudCwgKmdwYXJlbnQs
ICpyZWFsX3BhcmVudDsKKworCUxLVFJUcmFjZSgiJS4qcywgYiVkLCBwYXJlbnQgaSVsdSwgbG9j
a2VkICVwXG4iLAorCQkgIEF1RExOUGFpcihkZW50cnkpLCBiZHN0LCBwYXJlbnRfaW5vKGRlbnRy
eSksIGxvY2tlZCk7CisJc2IgPSBkZW50cnktPmRfc2I7CisJQXVEZWJ1Z09uKGF1X3Rlc3Rfcm8o
c2IsIGJkc3QsIE5VTEwpKTsKKwllcnIgPSAwOworCXBhcmVudCA9IGRnZXRfcGFyZW50KGRlbnRy
eSk7CisJSWlNdXN0V3JpdGVMb2NrKHBhcmVudC0+ZF9pbm9kZSk7CisJaWYgKHVubGlrZWx5KElT
X1JPT1QocGFyZW50KSkpCisJCWdvdG8gb3V0OworCWlmIChsb2NrZWQpIHsKKwkJRGlNdXN0QW55
TG9jayhsb2NrZWQpOworCQlJaU11c3RBbnlMb2NrKGxvY2tlZC0+ZF9pbm9kZSk7CisJfQorCisJ
Lyogc2xvdyBsb29wLCBrZWVwIGl0IHNpbXBsZSBhbmQgc3R1cGlkICovCisJcmVhbF9wYXJlbnQg
PSBwYXJlbnQ7CisJaGlub3RpZnkgPSAhIWF1X29wdF90ZXN0KGF1X21udGZsYWdzKHNiKSwgVURC
QV9JTk9USUZZKTsKKwl3aGlsZSAoMSkgeworCQlkcHV0KHBhcmVudCk7CisJCXBhcmVudCA9IGRn
ZXRfcGFyZW50KGRlbnRyeSk7CisJCWhfcGFyZW50ID0gYXVfaF9kcHRyKHBhcmVudCwgYmRzdCk7
CisJCWlmIChoX3BhcmVudCkKKwkJCWdvdG8gb3V0OyAvKiBzdWNjZXNzICovCisKKwkJLyogZmlu
ZCB0b3AgZGlyIHdoaWNoIGlzIG5lZWRlZCB0byBjcHVwICovCisJCWRvIHsKKwkJCWQgPSBwYXJl
bnQ7CisJCQlkcHV0KHBhcmVudCk7CisJCQlwYXJlbnQgPSBkZ2V0X3BhcmVudChkKTsKKwkJCWlm
IChwYXJlbnQgIT0gbG9ja2VkKSB7CisJCQkJZGlfcmVhZF9sb2NrX3BhcmVudDMocGFyZW50LCAh
QXVMb2NrX0lSKTsKKwkJCQloX3BhcmVudCA9IGF1X2hfZHB0cihwYXJlbnQsIGJkc3QpOworCQkJ
CWRpX3JlYWRfdW5sb2NrKHBhcmVudCwgIUF1TG9ja19JUik7CisJCQl9IGVsc2UKKwkJCQloX3Bh
cmVudCA9IGF1X2hfZHB0cihwYXJlbnQsIGJkc3QpOworCQl9IHdoaWxlICghaF9wYXJlbnQpOwor
CisJCWlmIChkICE9IHJlYWxfcGFyZW50KQorCQkJZGlfd3JpdGVfbG9ja19jaGlsZDMoZCk7CisK
KwkJLyogc29tZWJvZHkgZWxzZSBtaWdodCBjcmVhdGUgd2hpbGUgd2Ugd2VyZSBzbGVlcGluZyAq
LworCQlpZiAoIWF1X2hfZHB0cihkLCBiZHN0KSB8fCAhYXVfaF9kcHRyKGQsIGJkc3QpLT5kX2lu
b2RlKSB7CisJCQlzdHJ1Y3QgaW5vZGUgKmhfZGlyID0gaF9wYXJlbnQtPmRfaW5vZGUsCisJCQkJ
KmRpciA9IHBhcmVudC0+ZF9pbm9kZTsKKworCQkJaWYgKGF1X2hfZHB0cihkLCBiZHN0KSkKKwkJ
CQlhdV91cGRhdGVfZGJzdGFydChkKTsKKwkJCS8vQXVEZWJ1Z09uKGF1X2Ric3RhcnQoZCkgPD0g
YmRzdCk7CisJCQlpZiAocGFyZW50ICE9IGxvY2tlZCkKKwkJCQlkaV9yZWFkX2xvY2tfcGFyZW50
MyhwYXJlbnQsIEF1TG9ja19JUik7CisJCQlncGFyZW50ID0gTlVMTDsKKwkJCWlmICh1bmxpa2Vs
eShoaW5vdGlmeSAmJiAhSVNfUk9PVChwYXJlbnQpKSkgeworCQkJCWdwYXJlbnQgPSBkZ2V0X3Bh
cmVudChwYXJlbnQpOworCQkJCWlmIChncGFyZW50ICE9IGxvY2tlZCkKKwkJCQkJaWlfcmVhZF9s
b2NrX3BhcmVudDQoZ3BhcmVudC0+ZF9pbm9kZSk7CisJCQkJZWxzZSB7CisJCQkJCWRwdXQoZ3Bh
cmVudCk7CisJCQkJCWdwYXJlbnQgPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJCWF1X2hkaXJfbG9j
ayhoX2RpciwgZGlyLCBiZHN0KTsKKwkJCWVyciA9IGNwKGQsIGJkc3QsIGhfcGFyZW50LCBhcmcp
OworCQkJLy9pZiAoTGt0ckNvbmQpIGVyciA9IC0xOworCQkJYXVfaGRpcl91bmxvY2soaF9kaXIs
IGRpciwgYmRzdCk7CisJCQlpZiAodW5saWtlbHkoZ3BhcmVudCkpIHsKKwkJCQlpaV9yZWFkX3Vu
bG9jayhncGFyZW50LT5kX2lub2RlKTsKKwkJCQlkcHV0KGdwYXJlbnQpOworCQkJfQorCQkJaWYg
KHBhcmVudCAhPSBsb2NrZWQpCisJCQkJZGlfcmVhZF91bmxvY2socGFyZW50LCBBdUxvY2tfSVIp
OworCQl9CisKKwkJaWYgKGQgIT0gcmVhbF9wYXJlbnQpCisJCQlkaV93cml0ZV91bmxvY2soZCk7
CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJYnJlYWs7CisJfQorCisgb3V0OgorCWRwdXQocGFy
ZW50KTsKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBh
dV9jcHVwX2RpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmRzdCwKKwkJ
ICAgICAgIHN0cnVjdCBkZW50cnkgKmhfcGFyZW50LCB2b2lkICphcmcpCit7CisJaW50IGVycjsK
KworCWVyciA9IGF1X3Npb19jcHVwX3NpbXBsZShkZW50cnksIGJkc3QsIC0xLCBBdUNwdXBfRFRJ
TUUpOworCisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBhdV9jcHVw
X2RpcnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBhdWZzX2JpbmRleF90IGJkc3QsCisJCSBzdHJ1
Y3QgZGVudHJ5ICpsb2NrZWQpCit7CisJaW50IGVycjsKKworCWVyciA9IGF1X2NwX2RpcnMoZGVu
dHJ5LCBiZHN0LCBsb2NrZWQsIGF1X2NwdXBfZGlyLCBOVUxMKTsKKworCUF1VHJhY2VFcnIoZXJy
KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYXVfdGVzdF9hbmRfY3B1cF9kaXJzKHN0cnVjdCBk
ZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBiZHN0LAorCQkJICBzdHJ1Y3QgZGVudHJ5ICps
b2NrZWQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJc3RydWN0IGlu
b2RlICpkaXI7CisKKwlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCWRpciA9IHBhcmVu
dC0+ZF9pbm9kZTsKKwlMS1RSVHJhY2UoIiUuKnMsIGIlZCwgcGFyZW50IGklbHUsIGxvY2tlZCAl
cFxuIiwKKwkJICBBdURMTlBhaXIoZGVudHJ5KSwgYmRzdCwgZGlyLT5pX2lubywgbG9ja2VkKTsK
KwlEaU11c3RSZWFkTG9jayhwYXJlbnQpOworCUlpTXVzdFJlYWRMb2NrKGRpcik7CisKKwllcnIg
PSAwOworCWlmIChhdV9oX2lwdHIoZGlyLCBiZHN0KSkKKwkJZ290byBvdXQ7CisKKwlkaV9yZWFk
X3VubG9jayhwYXJlbnQsIEF1TG9ja19JUik7CisJZGlfd3JpdGVfbG9ja19wYXJlbnQyKHBhcmVu
dCk7CisJLyogc29tZW9uZSBlbHNlIG1pZ2h0IGNoYW5nZSBvdXIgaW5vZGUgd2hpbGUgd2Ugd2Vy
ZSBzbGVlcGluZyAqLworCWlmICh1bmxpa2VseSghYXVfaF9pcHRyKGRpciwgYmRzdCkpKQorCQll
cnIgPSBhdV9jcHVwX2RpcnMoZGVudHJ5LCBiZHN0LCBsb2NrZWQpOworCWRpX2Rvd25ncmFkZV9s
b2NrKHBhcmVudCwgQXVMb2NrX0lSKTsKKworIG91dDoKKwlkcHV0KHBhcmVudCk7CisJQXVUcmFj
ZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11bmlv
bmZzLm9yaWcvZnMvYXVmcy9jcHVwLmggbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL2Nw
dXAuaAotLS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvY3B1cC5oCTE5NzAt
MDEtMDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9j
cHVwLmgJMjAwOC0wNS0yNSAxMTo1NjowOCArMDMwMApAQCAtMCwwICsxLDgyIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9n
cmFtLCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
ciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisg
KiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUg
RnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRo
IEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogY29weS11
cC9kb3duIGZ1bmN0aW9ucworICoKKyAqICRJZDogY3B1cC5oLHYgMS4yIDIwMDgvMDQvMjEgMDE6
MzM6NDMgc2Zqcm8gRXhwICQKKyAqLworCisjaWZuZGVmIF9fQVVGU19DUFVQX0hfXworI2RlZmlu
ZSBfX0FVRlNfQ1BVUF9IX18KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4
L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYXVmc190eXBlLmg+CisKK3ZvaWQgYXVfY3B1cF9hdHRy
X3RpbWVzaXplcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3ZvaWQgYXVfY3B1cF9hdHRyX25saW5r
KHN0cnVjdCBpbm9kZSAqaW5vZGUpOwordm9pZCBhdV9jcHVwX2F0dHJfY2hhbmdlYWJsZShzdHJ1
Y3QgaW5vZGUgKmlub2RlKTsKK3ZvaWQgYXVfY3B1cF9pZ2VuKHN0cnVjdCBpbm9kZSAqaW5vZGUs
IHN0cnVjdCBpbm9kZSAqaF9pbm9kZSk7Cit2b2lkIGF1X2NwdXBfYXR0cl9hbGwoc3RydWN0IGlu
b2RlICppbm9kZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogY3B1cCBmbGFncyAqLwor
I2RlZmluZSBBdUNwdXBfRFRJTUUJMQkvKiBkbyBkdGltZV9zdG9yZS9yZXZlcnQgKi8KKyNkZWZp
bmUgYXVfZnRlc3RfY3B1cChmbGFncywgbmFtZSkJKChmbGFncykgJiBBdUNwdXBfIyNuYW1lKQor
I2RlZmluZSBhdV9mc2V0X2NwdXAoZmxhZ3MsIG5hbWUpCXsgKGZsYWdzKSB8PSBBdUNwdXBfIyNu
YW1lOyB9CisjZGVmaW5lIGF1X2ZjbHJfY3B1cChmbGFncywgbmFtZSkJeyAoZmxhZ3MpICY9IH5B
dUNwdXBfIyNuYW1lOyB9CisKK2ludCBhdV9jcHVwX3NpbmdsZShzdHJ1Y3QgZGVudHJ5ICpkZW50
cnksIGF1ZnNfYmluZGV4X3QgYmRzdCwKKwkJICAgYXVmc19iaW5kZXhfdCBic3JjLCBsb2ZmX3Qg
bGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworaW50IGF1X3Npb19jcHVwX3NpbmdsZShzdHJ1Y3Qg
ZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmRzdCwKKwkJICAgICAgIGF1ZnNfYmluZGV4
X3QgYnNyYywgbG9mZl90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKTsKK2ludCBhdV9jcHVwX3Np
bXBsZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmRzdCwgbG9mZl90IGxl
biwKKwkJICAgdW5zaWduZWQgaW50IGZsYWdzKTsKK2ludCBhdV9zaW9fY3B1cF9zaW1wbGUoc3Ry
dWN0IGRlbnRyeSAqZGVudHJ5LCBhdWZzX2JpbmRleF90IGJkc3QsIGxvZmZfdCBsZW4sCisJCSAg
ICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOworaW50IGF1X2NwdXBfd2goc3RydWN0IGRlbnRyeSAq
ZGVudHJ5LCBhdWZzX2JpbmRleF90IGJkc3QsIGxvZmZfdCBsZW4sCisJICAgICAgIHN0cnVjdCBm
aWxlICpmaWxlKTsKK2ludCBhdV9zaW9fY3B1cF93aChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1
ZnNfYmluZGV4X3QgYmRzdCwgbG9mZl90IGxlbiwKKwkJICAgc3RydWN0IGZpbGUgKmZpbGUpOwor
CitpbnQgYXVfY3BfZGlycyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmRz
dCwgc3RydWN0IGRlbnRyeSAqbG9ja2VkLAorCSAgICAgICBpbnQgKCpjcCkoc3RydWN0IGRlbnRy
eSAqZGVudHJ5LCBhdWZzX2JpbmRleF90IGJkc3QsCisJCQkgc3RydWN0IGRlbnRyeSAqaF9wYXJl
bnQsIHZvaWQgKmFyZyksCisJICAgICAgIHZvaWQgKmFyZyk7CitpbnQgYXVfY3B1cF9kaXJzKHN0
cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBiZHN0LAorCQkgc3RydWN0IGRlbnRy
eSAqbG9ja2VkKTsKK2ludCBhdV90ZXN0X2FuZF9jcHVwX2RpcnMoc3RydWN0IGRlbnRyeSAqZGVu
dHJ5LCBhdWZzX2JpbmRleF90IGJkc3QsCisJCQkgIHN0cnVjdCBkZW50cnkgKmxvY2tlZCk7CisK
Ky8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoga2VlcCB0aW1lc3RhbXBzIHdoZW4gY29weXVwICov
CitzdHJ1Y3QgYXVfZHRpbWUgeworCXN0cnVjdCBkZW50cnkgKmR0X2RlbnRyeSwgKmR0X2hfZGVu
dHJ5OworCXN0cnVjdCBhdV9oaW5vZGUgKmR0X2hkaXI7CisJc3RydWN0IHRpbWVzcGVjIGR0X2F0
aW1lLCBkdF9tdGltZTsKK307Cit2b2lkIGF1X2R0aW1lX3N0b3JlKHN0cnVjdCBhdV9kdGltZSAq
ZHQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgIHN0cnVjdCBkZW50cnkgKmhfZGVudHJ5
LCBzdHJ1Y3QgYXVfaGlub2RlICpoZGlyKTsKK3ZvaWQgYXVfZHRpbWVfcmV2ZXJ0KHN0cnVjdCBh
dV9kdGltZSAqZHQpOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fQVVG
U19DUFVQX0hfXyAqLwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1
ZnMvZGNzdWIuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvZGNzdWIuYwotLS0gbGlu
dXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvZGNzdWIuYwkxOTcwLTAxLTAxIDAzOjAw
OjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvZGNzdWIuYwkyMDA4
LTA1LTI1IDExOjU4OjUzICswMzAwCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA3LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9ncmFtLCBhdWZz
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkK
KyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIg
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0
d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogc3ViLXJvdXRpbmVzIGZv
ciBkZW50cnkgY2FjaGUKKyAqCisgKiAkSWQ6IGRjc3ViLmMsdiAxLjMgMjAwOC8wNS8xOSAwMTo0
NzozNyBzZmpybyBFeHAgJAorICovCisKKyNpbmNsdWRlICJhdWZzLmgiCisKK3N0YXRpYyB2b2lk
IGF1X2RwYWdlX2ZyZWUoc3RydWN0IGF1X2RwYWdlICpkcGFnZSkKK3sKKwlpbnQgaTsKKworCUF1
VHJhY2VFbnRlcigpOworCUF1RGVidWdPbighZHBhZ2UpOworCisJZm9yIChpID0gMDsgaSA8IGRw
YWdlLT5uZGVudHJ5OyBpKyspCisJCWRwdXQoZHBhZ2UtPmRlbnRyaWVzW2ldKTsKKwlmcmVlX3Bh
Z2UoKHVuc2lnbmVkIGxvbmcpZHBhZ2UtPmRlbnRyaWVzKTsKK30KKworaW50IGF1X2RwYWdlc19p
bml0KHN0cnVjdCBhdV9kY3N1Yl9wYWdlcyAqZHBhZ2VzLCBnZnBfdCBnZnApCit7CisJaW50IGVy
cjsKKwl2b2lkICpwOworCisJQXVUcmFjZUVudGVyKCk7CisKKwllcnIgPSAtRU5PTUVNOworCWRw
YWdlcy0+ZHBhZ2VzID0ga21hbGxvYyhzaXplb2YoKmRwYWdlcy0+ZHBhZ2VzKSwgZ2ZwKTsKKwlp
ZiAodW5saWtlbHkoIWRwYWdlcy0+ZHBhZ2VzKSkKKwkJZ290byBvdXQ7CisJcCA9ICh2b2lkICop
X19nZXRfZnJlZV9wYWdlKGdmcCk7CisJaWYgKHVubGlrZWx5KCFwKSkKKwkJZ290byBvdXRfZHBh
Z2VzOworCWRwYWdlcy0+ZHBhZ2VzWzBdLm5kZW50cnkgPSAwOworCWRwYWdlcy0+ZHBhZ2VzWzBd
LmRlbnRyaWVzID0gcDsKKwlkcGFnZXMtPm5kcGFnZSA9IDE7CisJcmV0dXJuIDA7IC8qIHN1Y2Nl
c3MgKi8KKworIG91dF9kcGFnZXM6CisJa2ZyZWUoZHBhZ2VzLT5kcGFnZXMpOworIG91dDoKKwlB
dVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBhdV9kcGFnZXNfZnJlZShz
dHJ1Y3QgYXVfZGNzdWJfcGFnZXMgKmRwYWdlcykKK3sKKwlpbnQgaTsKKworCUF1VHJhY2VFbnRl
cigpOworCisJZm9yIChpID0gMDsgaSA8IGRwYWdlcy0+bmRwYWdlOyBpKyspCisJCWF1X2RwYWdl
X2ZyZWUoZHBhZ2VzLT5kcGFnZXMgKyBpKTsKKwlrZnJlZShkcGFnZXMtPmRwYWdlcyk7Cit9CisK
K3N0YXRpYyBpbnQgYXVfZHBhZ2VzX2FwcGVuZChzdHJ1Y3QgYXVfZGNzdWJfcGFnZXMgKmRwYWdl
cywKKwkJCSAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGdmcF90IGdmcCkKK3sKKwlpbnQgZXJy
LCBzejsKKwlzdHJ1Y3QgYXVfZHBhZ2UgKmRwYWdlOworCXZvaWQgKnA7CisKKwkvL0F1VHJhY2VF
bnRlcigpOworCisJZHBhZ2UgPSBkcGFnZXMtPmRwYWdlcyArIGRwYWdlcy0+bmRwYWdlIC0gMTsK
KwlBdURlYnVnT24oIWRwYWdlKTsKKwlzeiA9IFBBR0VfU0laRSAvIHNpemVvZihkZW50cnkpOwor
CWlmICh1bmxpa2VseShkcGFnZS0+bmRlbnRyeSA+PSBzeikpIHsKKwkJTEtUUkxhYmVsKG5ldyBk
cGFnZSk7CisJCWVyciA9IC1FTk9NRU07CisJCXN6ID0gZHBhZ2VzLT5uZHBhZ2UgKiBzaXplb2Yo
KmRwYWdlcy0+ZHBhZ2VzKTsKKwkJcCA9IGF1X2t6cmVhbGxvYyhkcGFnZXMtPmRwYWdlcywgc3os
CisJCQkJIHN6ICsgc2l6ZW9mKCpkcGFnZXMtPmRwYWdlcyksIGdmcCk7CisJCWlmICh1bmxpa2Vs
eSghcCkpCisJCQlnb3RvIG91dDsKKwkJZHBhZ2VzLT5kcGFnZXMgPSBwOworCQlkcGFnZSA9IGRw
YWdlcy0+ZHBhZ2VzICsgZHBhZ2VzLT5uZHBhZ2U7CisJCXAgPSAodm9pZCAqKV9fZ2V0X2ZyZWVf
cGFnZShnZnApOworCQlpZiAodW5saWtlbHkoIXApKQorCQkJZ290byBvdXQ7CisJCWRwYWdlLT5u
ZGVudHJ5ID0gMDsKKwkJZHBhZ2UtPmRlbnRyaWVzID0gcDsKKwkJZHBhZ2VzLT5uZHBhZ2UrKzsK
Kwl9CisKKwlkcGFnZS0+ZGVudHJpZXNbZHBhZ2UtPm5kZW50cnkrK10gPSBkZ2V0KGRlbnRyeSk7
CisJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKworIG91dDoKKwkvL0F1VHJhY2VFcnIoZXJyKTsK
KwlyZXR1cm4gZXJyOworfQorCitpbnQgYXVfZGNzdWJfcGFnZXMoc3RydWN0IGF1X2Rjc3ViX3Bh
Z2VzICpkcGFnZXMsIHN0cnVjdCBkZW50cnkgKnJvb3QsCisJCSAgIGF1X2RwYWdlc190ZXN0IHRl
c3QsIHZvaWQgKmFyZykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBkZW50cnkgKnRoaXNfcGFyZW50
ID0gcm9vdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OworCXN0cnVjdCBzdXBlcl9ibG9jayAq
c2IgPSByb290LT5kX3NiOworCisJQXVUcmFjZUVudGVyKCk7CisKKwllcnIgPSAwOworCXNwaW5f
bG9jaygmZGNhY2hlX2xvY2spOworIHJlcGVhdDoKKwluZXh0ID0gdGhpc19wYXJlbnQtPmRfc3Vi
ZGlycy5uZXh0OworIHJlc3VtZToKKwlpZiAodGhpc19wYXJlbnQtPmRfc2IgPT0gc2IKKwkgICAg
JiYgIUlTX1JPT1QodGhpc19wYXJlbnQpCisJICAgICYmIGF0b21pY19yZWFkKCZ0aGlzX3BhcmVu
dC0+ZF9jb3VudCkKKwkgICAgJiYgdGhpc19wYXJlbnQtPmRfaW5vZGUKKwkgICAgJiYgKCF0ZXN0
IHx8IHRlc3QodGhpc19wYXJlbnQsIGFyZykpKSB7CisJCWVyciA9IGF1X2RwYWdlc19hcHBlbmQo
ZHBhZ2VzLCB0aGlzX3BhcmVudCwgR0ZQX0FUT01JQyk7CisJCWlmICh1bmxpa2VseShlcnIpKQor
CQkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKG5leHQgIT0gJnRoaXNfcGFyZW50LT5kX3N1YmRp
cnMpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gbmV4dDsKKwkJc3RydWN0IGRlbnRyeSAq
ZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksCisJCQkJCQkgICBkX3UuZF9j
aGlsZCk7CisJCW5leHQgPSB0bXAtPm5leHQ7CisJCWlmICh1bmxpa2VseSgvKmRfdW5oYXNoZWQo
ZGVudHJ5KSB8fCAqLyFkZW50cnktPmRfaW5vZGUpKQorCQkJY29udGludWU7CisJCWlmICghbGlz
dF9lbXB0eSgmZGVudHJ5LT5kX3N1YmRpcnMpKSB7CisJCQl0aGlzX3BhcmVudCA9IGRlbnRyeTsK
KwkJCWdvdG8gcmVwZWF0OworCQl9CisJCWlmIChkZW50cnktPmRfc2IgPT0gc2IKKwkJICAgICYm
IGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpCisJCSAgICAmJiAoIXRlc3QgfHwgdGVzdChk
ZW50cnksIGFyZykpKSB7CisJCQllcnIgPSBhdV9kcGFnZXNfYXBwZW5kKGRwYWdlcywgZGVudHJ5
LCBHRlBfQVRPTUlDKTsKKwkJCWlmICh1bmxpa2VseShlcnIpKQorCQkJCWdvdG8gb3V0OworCQl9
CisJfQorCisJaWYgKHRoaXNfcGFyZW50ICE9IHJvb3QpIHsKKwkJbmV4dCA9IHRoaXNfcGFyZW50
LT5kX3UuZF9jaGlsZC5uZXh0OworCQl0aGlzX3BhcmVudCA9IHRoaXNfcGFyZW50LT5kX3BhcmVu
dDsgLyogZGNhY2hlX2xvY2sgaXMgbG9ja2VkICovCisJCWdvdG8gcmVzdW1lOworCX0KKyBvdXQ6
CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJu
IGVycjsKK30KKworaW50IGF1X2Rjc3ViX3BhZ2VzX3JldihzdHJ1Y3QgYXVfZGNzdWJfcGFnZXMg
KmRwYWdlcywgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgICAgaW50IGRvX2luY2x1ZGUs
IGF1X2RwYWdlc190ZXN0IHRlc3QsIHZvaWQgKmFyZykKK3sKKwlpbnQgZXJyOworCisJQXVUcmFj
ZUVudGVyKCk7CisKKwllcnIgPSAwOworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCWlmIChk
b19pbmNsdWRlICYmICghdGVzdCB8fCB0ZXN0KGRlbnRyeSwgYXJnKSkpIHsKKwkJZXJyID0gYXVf
ZHBhZ2VzX2FwcGVuZChkcGFnZXMsIGRlbnRyeSwgR0ZQX0FUT01JQyk7CisJCWlmICh1bmxpa2Vs
eShlcnIpKQorCQkJZ290byBvdXQ7CisJfQorCXdoaWxlICghSVNfUk9PVChkZW50cnkpKSB7CisJ
CWRlbnRyeSA9IGRlbnRyeS0+ZF9wYXJlbnQ7IC8qIGRjYWNoZV9sb2NrIGlzIGxvY2tlZCAqLwor
CQlpZiAoIXRlc3QgfHwgdGVzdChkZW50cnksIGFyZykpIHsKKwkJCWVyciA9IGF1X2RwYWdlc19h
cHBlbmQoZHBhZ2VzLCBkZW50cnksIEdGUF9BVE9NSUMpOworCQkJaWYgKHVubGlrZWx5KGVycikp
CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKyBvdXQ6CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2Nr
KTsKKworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYXVfdGVzdF9z
dWJkaXIoc3RydWN0IGRlbnRyeSAqZDEsIHN0cnVjdCBkZW50cnkgKmQyKQoreworCWludCBlcnI7
CisJaW50IGksIGo7CisJc3RydWN0IGF1X2Rjc3ViX3BhZ2VzIGRwYWdlczsKKwlzdHJ1Y3QgYXVf
ZHBhZ2UgKmRwYWdlOworCXN0cnVjdCBkZW50cnkgKipkZW50cmllczsKKworCUxLVFJUcmFjZSgi
JS4qcywgJS4qc1xuIiwgQXVETE5QYWlyKGQxKSwgQXVETE5QYWlyKGQyKSk7CisKKwllcnIgPSBh
dV9kcGFnZXNfaW5pdCgmZHBhZ2VzLCBHRlBfVEVNUE9SQVJZKTsKKwlpZiAodW5saWtlbHkoZXJy
KSkKKwkJZ290byBvdXQ7CisJZXJyID0gYXVfZGNzdWJfcGFnZXNfcmV2KCZkcGFnZXMsIGQxLCAv
KmRvX2luY2x1ZGUqLzEsIE5VTEwsIE5VTEwpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3Rv
IG91dF9kcGFnZXM7CisKKwlmb3IgKGkgPSBkcGFnZXMubmRwYWdlIC0gMTsgIWVyciAmJiBpID49
IDA7IGktLSkgeworCQlkcGFnZSA9IGRwYWdlcy5kcGFnZXMgKyBpOworCQlkZW50cmllcyA9IGRw
YWdlLT5kZW50cmllczsKKwkJZm9yIChqID0gZHBhZ2UtPm5kZW50cnkgLSAxOyAhZXJyICYmIGog
Pj0gMDsgai0tKSB7CisJCQlzdHJ1Y3QgZGVudHJ5ICpkOworCQkJZCA9IGRlbnRyaWVzW2pdOwor
CQkJLy9BdURiZygiZCAlLipzXG4iLCBBdURMTlBhaXIoZCkpOworCQkJZXJyID0gKGQgPT0gZDIp
OworCQl9CisJfQorCisgb3V0X2RwYWdlczoKKwlhdV9kcGFnZXNfZnJlZSgmZHBhZ2VzKTsKKyBv
dXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLXVyTiBsaW51eC0y
LjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9kY3N1Yi5oIGxpbnV4LTIuNi4yNS40LXVuaW9u
ZnMvZnMvYXVmcy9kY3N1Yi5oCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVm
cy9kY3N1Yi5oCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVu
aW9uZnMvZnMvYXVmcy9kY3N1Yi5oCTIwMDgtMDUtMjUgMTE6NTY6MDggKzAzMDAKQEAgLTAsMCAr
MSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEp1bmppcm8gT2thamltYQor
ICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAq
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFt
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5v
dCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy
YW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8K
KworLyoKKyAqIHN1Yi1yb3V0aW5lcyBmb3IgZGVudHJ5IGNhY2hlCisgKgorICogJElkOiBkY3N1
Yi5oLHYgMS4xIDIwMDgvMDQvMTggMTI6MTg6Mjkgc2Zqcm8gRXhwICQKKyAqLworCisjaWZuZGVm
IF9fQVVGU19EQ1NVQl9IX18KKyNkZWZpbmUgX19BVUZTX0RDU1VCX0hfXworCisjaWZkZWYgX19L
RVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisKK3N0cnVjdCBhdV9kcGFnZSB7
CisJaW50IG5kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqKmRlbnRyaWVzOworfTsKKworc3RydWN0
IGF1X2Rjc3ViX3BhZ2VzIHsKKwlpbnQgbmRwYWdlOworCXN0cnVjdCBhdV9kcGFnZSAqZHBhZ2Vz
OworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgYXVfZHBhZ2VzX2luaXQoc3RydWN0
IGF1X2Rjc3ViX3BhZ2VzICpkcGFnZXMsIGdmcF90IGdmcCk7Cit2b2lkIGF1X2RwYWdlc19mcmVl
KHN0cnVjdCBhdV9kY3N1Yl9wYWdlcyAqZHBhZ2VzKTsKK3R5cGVkZWYgaW50ICgqYXVfZHBhZ2Vz
X3Rlc3QpKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdm9pZCAqYXJnKTsKK2ludCBhdV9kY3N1Yl9w
YWdlcyhzdHJ1Y3QgYXVfZGNzdWJfcGFnZXMgKmRwYWdlcywgc3RydWN0IGRlbnRyeSAqcm9vdCwK
KwkJICAgYXVfZHBhZ2VzX3Rlc3QgdGVzdCwgdm9pZCAqYXJnKTsKK2ludCBhdV9kY3N1Yl9wYWdl
c19yZXYoc3RydWN0IGF1X2Rjc3ViX3BhZ2VzICpkcGFnZXMsIHN0cnVjdCBkZW50cnkgKmRlbnRy
eSwKKwkJICAgICAgIGludCBkb19pbmNsdWRlLCBhdV9kcGFnZXNfdGVzdCB0ZXN0LCB2b2lkICph
cmcpOworaW50IGF1X3Rlc3Rfc3ViZGlyKHN0cnVjdCBkZW50cnkgKmQxLCBzdHJ1Y3QgZGVudHJ5
ICpkMik7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX19BVUZTX0RDU1VC
X0hfXyAqLwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvZGVi
dWcuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvZGVidWcuYwotLS0gbGludXgtMi42
LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvZGVidWcuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICsw
MzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvZGVidWcuYwkyMDA4LTA1LTI1
IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9ncmFtLCBhdWZzIGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9u
ZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQor
ICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24s
IE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogZGVidWcgcHJpbnQgZnVuY3Rpb25z
CisgKgorICogJElkOiBkZWJ1Zy5jLHYgMS4yIDIwMDgvMDQvMjEgMDE6MzM6MDAgc2Zqcm8gRXhw
ICQKKyAqLworCisvLyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgImF1ZnMuaCIK
KworYXRvbWljX3QgYXVfY29uZCA9IEFUT01JQ19JTklUKDApOworCitjaGFyICphdV9wbGV2ZWwg
PSBLRVJOX0RFQlVHOworI2RlZmluZSBkcHJpKGZtdCwgYXJnLi4uKSBkbyB7IFwKKwlpZiAoTGt0
ckNvbmQpIFwKKwkJcHJpbnRrKCIlcyIgZm10LCBhdV9wbGV2ZWwsICMjYXJnKTsgXAorfSB3aGls
ZSAoMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGF1X2Rwcmlfd2hsaXN0KHN0cnVj
dCBhdV9uaGFzaCAqd2hsaXN0KQoreworCWludCBpOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFk
OworCXN0cnVjdCBhdV92ZGlyX3doICp0cG9zOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisK
Kwlmb3IgKGkgPSAwOyBpIDwgQXVTaXplX05IQVNIOyBpKyspIHsKKwkJaGVhZCA9IHdobGlzdC0+
aGVhZHMgKyBpOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeSh0cG9zLCBwb3MsIGhlYWQsIHdoX2hh
c2gpCisJCQlkcHJpKCJiJWQsICUuKnMsICVkXG4iLAorCQkJICAgICB0cG9zLT53aF9iaW5kZXgs
CisJCQkgICAgIHRwb3MtPndoX3N0ci5sZW4sIHRwb3MtPndoX3N0ci5uYW1lLAorCQkJICAgICB0
cG9zLT53aF9zdHIubGVuKTsKKwl9Cit9CisKK3ZvaWQgYXVfZHByaV92ZGlyKHN0cnVjdCBhdV92
ZGlyICp2ZGlyKQoreworCWludCBpOworCXVuaW9uIGF1X3ZkaXJfZGVibGtfcCBwOworCXVuc2ln
bmVkIGNoYXIgKm87CisKKwlpZiAoIXZkaXIgfHwgSVNfRVJSKHZkaXIpKSB7CisJCWRwcmkoImVy
ciAlbGRcbiIsIFBUUl9FUlIodmRpcikpOworCQlyZXR1cm47CisJfQorCisJZHByaSgibmJsayAl
ZCwgZGVibGsgJXAsIGxhc3R7JWQsICVwfSwgdmVyICVsdVxuIiwKKwkgICAgIHZkaXItPnZkX25i
bGssIHZkaXItPnZkX2RlYmxrLAorCSAgICAgdmRpci0+dmRfbGFzdC5pLCB2ZGlyLT52ZF9sYXN0
LnAucCwgdmRpci0+dmRfdmVyc2lvbik7CisJZm9yIChpID0gMDsgaSA8IHZkaXItPnZkX25ibGs7
IGkrKykgeworCQlwLmRlYmxrID0gdmRpci0+dmRfZGVibGtbaV07CisJCW8gPSBwLnA7CisJCWRw
cmkoIlslZF06ICVwXG4iLCBpLCBvKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZG9fcHJpX2lub2Rl
KGF1ZnNfYmluZGV4X3QgYmluZGV4LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJc3RydWN0IGRl
bnRyeSAqd2gpCit7CisJY2hhciAqbiA9IE5VTEw7CisJaW50IGwgPSAwLCBudGZ5ID0gMDsKKwor
CWlmICghaW5vZGUgfHwgSVNfRVJSKGlub2RlKSkgeworCQlkcHJpKCJpJWQ6IGVyciAlbGRcbiIs
IGJpbmRleCwgUFRSX0VSUihpbm9kZSkpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogdGhlIHR5
cGUgb2YgaV9ibG9ja3MgZGVwZW5kcyB1cG9uIENPTkZJR19MU0YgKi8KKwlCVUlMRF9CVUdfT04o
c2l6ZW9mKGlub2RlLT5pX2Jsb2NrcykgIT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpCisJCSAgICAg
JiYgc2l6ZW9mKGlub2RlLT5pX2Jsb2NrcykgIT0gc2l6ZW9mKHU2NCkpOworCWlmICh3aCkgewor
CQluID0gKHZvaWQgKil3aC0+ZF9uYW1lLm5hbWU7CisJCWwgPSB3aC0+ZF9uYW1lLmxlbjsKKwl9
CisKKwludGZ5ID0gYXVfdGVzdF9pbm90aWZ5KGlub2RlKTsKKwlkcHJpKCJpJWQ6IGklbHUsICVz
LCBjbnQgJWQsIG5sICV1LCAwJW8sIG50ZnkgJWQsIHN6ICVMdSwgYmxrICVMdSwiCisJICAgICAi
IGN0ICVMZCwgbnAgJWx1LCBzdCAweCVseCwgZiAweCV4LCBnICV4JXMlLipzXG4iLAorCSAgICAg
YmluZGV4LAorCSAgICAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9zYiA/IGF1X3NidHlwZShpbm9k
ZS0+aV9zYikgOiAiPz8iLAorCSAgICAgYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSwgaW5v
ZGUtPmlfbmxpbmssIGlub2RlLT5pX21vZGUsCisJICAgICBudGZ5LAorCSAgICAgaV9zaXplX3Jl
YWQoaW5vZGUpLCAodTY0KWlub2RlLT5pX2Jsb2NrcywKKwkgICAgIHRpbWVzcGVjX3RvX25zKCZp
bm9kZS0+aV9jdGltZSkgJiAweDBmZmZmLAorCSAgICAgaW5vZGUtPmlfbWFwcGluZyA/IGlub2Rl
LT5pX21hcHBpbmctPm5ycGFnZXMgOiAwLAorCSAgICAgaW5vZGUtPmlfc3RhdGUsIGlub2RlLT5p
X2ZsYWdzLCBpbm9kZS0+aV9nZW5lcmF0aW9uLAorCSAgICAgbCA/ICIsIHdoICIgOiAiIiwgbCwg
bik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXVfZHByaV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlu
b2RlKQoreworCXN0cnVjdCBhdV9paW5mbyAqaWluZm87CisJYXVmc19iaW5kZXhfdCBiaW5kZXg7
CisJaW50IGVycjsKKworCWVyciA9IGRvX3ByaV9pbm9kZSgtMSwgaW5vZGUsIE5VTEwpOworCWlm
IChlcnIgfHwgIWF1X3Rlc3RfYXVmcyhpbm9kZS0+aV9zYikpCisJCXJldHVybjsKKworCWlpbmZv
ID0gYXVfaWkoaW5vZGUpOworCWlmICghaWluZm8pCisJCXJldHVybjsKKwlkcHJpKCJpLTE6IGJz
dGFydCAlZCwgYmVuZCAlZCwgZ2VuICVkXG4iLAorCSAgICAgaWluZm8tPmlpX2JzdGFydCwgaWlu
Zm8tPmlpX2JlbmQsIGF1X2lpZ2VuKGlub2RlKSk7CisJaWYgKGlpbmZvLT5paV9ic3RhcnQgPCAw
KQorCQlyZXR1cm47CisJZm9yIChiaW5kZXggPSBpaW5mby0+aWlfYnN0YXJ0OyBiaW5kZXggPD0g
aWluZm8tPmlpX2JlbmQ7IGJpbmRleCsrKQorCQlkb19wcmlfaW5vZGUoYmluZGV4LCBpaW5mby0+
aWlfaGlub2RlWzAgKyBiaW5kZXhdLmhpX2lub2RlLAorCQkJICAgICBpaW5mby0+aWlfaGlub2Rl
WzAgKyBiaW5kZXhdLmhpX3doZGVudHJ5KTsKK30KKworc3RhdGljIGludCBkb19wcmlfZGVudHJ5
KGF1ZnNfYmluZGV4X3QgYmluZGV4LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgc3RydWN0
IGxpc3RfaGVhZCAqaW50ZW50KQoreworCXN0cnVjdCBkZW50cnkgKndoID0gTlVMTDsKKworCWlm
ICghZGVudHJ5IHx8IElTX0VSUihkZW50cnkpKSB7CisJCWRwcmkoImQlZDogZXJyICVsZFxuIiwg
YmluZGV4LCBQVFJfRVJSKGRlbnRyeSkpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIGRvIG5vdCBj
YWxsIGRnZXRfcGFyZW50KCkgaGVyZSAqLworCWRwcmkoImQlZDogJS4qcy8lLipzLCAlcywgY250
ICVkLCBmbGFncyAweCV4LCBpbnRlbnQgJWRcbiIsCisJICAgICBiaW5kZXgsCisJICAgICBBdURM
TlBhaXIoZGVudHJ5LT5kX3BhcmVudCksIEF1RExOUGFpcihkZW50cnkpLAorCSAgICAgZGVudHJ5
LT5kX3NiID8gYXVfc2J0eXBlKGRlbnRyeS0+ZF9zYikgOiAiPz8iLAorCSAgICAgYXRvbWljX3Jl
YWQoJmRlbnRyeS0+ZF9jb3VudCksIGRlbnRyeS0+ZF9mbGFncywgISFpbnRlbnQpOworCWlmIChi
aW5kZXggPj0gMCAmJiBkZW50cnktPmRfaW5vZGUgJiYgYXVfdGVzdF9hdWZzKGRlbnRyeS0+ZF9z
YikpIHsKKwkJc3RydWN0IGF1X2lpbmZvICppaW5mbyA9IGF1X2lpKGRlbnRyeS0+ZF9pbm9kZSk7
CisJCWlmIChpaW5mbykKKwkJCXdoID0gaWluZm8tPmlpX2hpbm9kZVswICsgYmluZGV4XS5oaV93
aGRlbnRyeTsKKwl9CisJZG9fcHJpX2lub2RlKGJpbmRleCwgZGVudHJ5LT5kX2lub2RlLCB3aCk7
CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICphdV9kYmdfaF9pbnRl
bnQoc3RydWN0IGF1X2RpbmZvICpkaW5mbywKKwkJCQkJIGF1ZnNfYmluZGV4X3QgYmluZGV4KQor
eworI2lmZGVmIENPTkZJR19BVUZTX0JSX05GUworCXJldHVybiBkaW5mby0+ZGlfaGRlbnRyeVsw
ICsgYmluZGV4XS5oZF9pbnRlbnRfbGlzdDsKKyNlbHNlCisJcmV0dXJuIE5VTEw7CisjZW5kaWYK
K30KKwordm9pZCBhdV9kcHJpX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3Ry
dWN0IGF1X2RpbmZvICpkaW5mbzsKKwlhdWZzX2JpbmRleF90IGJpbmRleDsKKwlpbnQgZXJyOwor
CisJZXJyID0gZG9fcHJpX2RlbnRyeSgtMSwgZGVudHJ5LCBOVUxMKTsKKwlpZiAoZXJyIHx8ICFh
dV90ZXN0X2F1ZnMoZGVudHJ5LT5kX3NiKSkKKwkJcmV0dXJuOworCisJZGluZm8gPSBhdV9kaShk
ZW50cnkpOworCWlmICghZGluZm8pCisJCXJldHVybjsKKwlkcHJpKCJkLTE6IGJzdGFydCAlZCwg
YmVuZCAlZCwgYndoICVkLCBiZGlyb3BxICVkLCBnZW4gJWRcbiIsCisJICAgICBkaW5mby0+ZGlf
YnN0YXJ0LCBkaW5mby0+ZGlfYmVuZCwKKwkgICAgIGRpbmZvLT5kaV9id2gsIGRpbmZvLT5kaV9i
ZGlyb3BxLCBhdV9kaWdlbihkZW50cnkpKTsKKwlpZiAoZGluZm8tPmRpX2JzdGFydCA8IDApCisJ
CXJldHVybjsKKwlmb3IgKGJpbmRleCA9IGRpbmZvLT5kaV9ic3RhcnQ7IGJpbmRleCA8PSBkaW5m
by0+ZGlfYmVuZDsgYmluZGV4KyspCisJCWRvX3ByaV9kZW50cnkoYmluZGV4LCBkaW5mby0+ZGlf
aGRlbnRyeVswICsgYmluZGV4XS5oZF9kZW50cnksCisJCQkgICAgICBhdV9kYmdfaF9pbnRlbnQo
ZGluZm8sIGJpbmRleCkpOworfQorCitzdGF0aWMgaW50IGRvX3ByaV9maWxlKGF1ZnNfYmluZGV4
X3QgYmluZGV4LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljaGFyIGFbMzJdOworCisJaWYgKCFm
aWxlIHx8IElTX0VSUihmaWxlKSkgeworCQlkcHJpKCJmJWQ6IGVyciAlbGRcbiIsIGJpbmRleCwg
UFRSX0VSUihmaWxlKSk7CisJCXJldHVybiAtMTsKKwl9CisJYVswXSA9IDA7CisJaWYgKGJpbmRl
eCA8IDAKKwkgICAgJiYgZmlsZS0+Zl9kZW50cnkKKwkgICAgJiYgYXVfdGVzdF9hdWZzKGZpbGUt
PmZfZGVudHJ5LT5kX3NiKQorCSAgICAmJiBhdV9maShmaWxlKSkKKwkJc25wcmludGYoYSwgc2l6
ZW9mKGEpLCAiLCBtbWFwcGVkICVkIiwgYXVfdGVzdF9tbWFwcGVkKGZpbGUpKTsKKwlkcHJpKCJm
JWQ6IG1vZGUgMHgleCwgZmxhZ3MgMCVvLCBjbnQgJWQsIHBvcyAlTHUlc1xuIiwKKwkgICAgIGJp
bmRleCwgZmlsZS0+Zl9tb2RlLCBmaWxlLT5mX2ZsYWdzLCBmaWxlX2NvdW50KGZpbGUpLAorCSAg
ICAgZmlsZS0+Zl9wb3MsIGEpOworCWlmIChmaWxlLT5mX2RlbnRyeSkKKwkJZG9fcHJpX2RlbnRy
eShiaW5kZXgsIGZpbGUtPmZfZGVudHJ5LCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBh
dV9kcHJpX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGF1X2ZpbmZvICpmaW5m
bzsKKwlhdWZzX2JpbmRleF90IGJpbmRleDsKKwlpbnQgZXJyOworCisJZXJyID0gZG9fcHJpX2Zp
bGUoLTEsIGZpbGUpOworCWlmIChlcnIgfHwgIWZpbGUtPmZfZGVudHJ5IHx8ICFhdV90ZXN0X2F1
ZnMoZmlsZS0+Zl9kZW50cnktPmRfc2IpKQorCQlyZXR1cm47CisKKwlmaW5mbyA9IGF1X2ZpKGZp
bGUpOworCWlmICghZmluZm8pCisJCXJldHVybjsKKwlpZiAoZmluZm8tPmZpX2JzdGFydCA8IDAp
CisJCXJldHVybjsKKwlmb3IgKGJpbmRleCA9IGZpbmZvLT5maV9ic3RhcnQ7IGJpbmRleCA8PSBm
aW5mby0+ZmlfYmVuZDsgYmluZGV4KyspIHsKKwkJc3RydWN0IGF1X2hmaWxlICpoZjsKKwkJLy9k
cHJpKCJiaW5kZXggJWRcbiIsIGJpbmRleCk7CisJCWhmID0gZmluZm8tPmZpX2hmaWxlICsgYmlu
ZGV4OworCQlkb19wcmlfZmlsZShiaW5kZXgsIGhmID8gaGYtPmhmX2ZpbGUgOiBOVUxMKTsKKwl9
Cit9CisKK3N0YXRpYyBpbnQgZG9fcHJpX2JyKGF1ZnNfYmluZGV4X3QgYmluZGV4LCBzdHJ1Y3Qg
YXVfYnJhbmNoICpicikKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKwlzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiOworCisJaWYgKCFiciB8fCBJU19FUlIoYnIpCisJICAgIHx8ICEobW50ID0gYnIt
PmJyX21udCkgfHwgSVNfRVJSKG1udCkKKwkgICAgfHwgIShzYiA9IG1udC0+bW50X3NiKSB8fCBJ
U19FUlIoc2IpKSB7CisJCWRwcmkoInMlZDogZXJyICVsZFxuIiwgYmluZGV4LCBQVFJfRVJSKGJy
KSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlkcHJpKCJzJWQ6IHtwZXJtIDB4JXgsIGNudCAlZH0s
ICIKKwkgICAgICIlcywgZmxhZ3MgMHglbHgsIGNudChCSUFTKSAlZCwgYWN0aXZlICVkLCB4aW5v
ICVkXG4iLAorCSAgICAgYmluZGV4LCBici0+YnJfcGVybSwgYXVfYnJfY291bnQoYnIpLAorCSAg
ICAgYXVfc2J0eXBlKHNiKSwgc2ItPnNfZmxhZ3MsIHNiLT5zX2NvdW50IC0gU19CSUFTLAorCSAg
ICAgYXRvbWljX3JlYWQoJnNiLT5zX2FjdGl2ZSksICEhYnItPmJyX3hpbm8pOworCXJldHVybiAw
OworfQorCit2b2lkIGF1X2Rwcmlfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1
Y3QgYXVfc2JpbmZvICpzYmluZm87CisJYXVmc19iaW5kZXhfdCBiaW5kZXg7CisJaW50IGVycjsK
KwlzdHJ1Y3QgdmZzbW91bnQgbW50ID0geyAubW50X3NiID0gc2IgfTsKKwlzdHJ1Y3QgYXVfYnJh
bmNoIGZha2UgPSB7CisJCS5icl9wZXJtID0gMCwKKwkJLmJyX21udCA9ICZtbnQsCisJCS5icl9j
b3VudCA9IEFUT01JQ19JTklUKDApLAorCQkuYnJfeGlubyA9IE5VTEwKKwl9OworCisJYXRvbWlj
X3NldCgmZmFrZS5icl9jb3VudCwgMCk7CisJc21wX21iKCk7IC8qIGF0b21pY19zZXQgKi8KKwll
cnIgPSBkb19wcmlfYnIoLTEsICZmYWtlKTsKKwlkcHJpKCJkZXYgMHgleFxuIiwgc2ItPnNfZGV2
KTsKKwlpZiAoZXJyIHx8ICFhdV90ZXN0X2F1ZnMoc2IpKQorCQlyZXR1cm47CisKKwlzYmluZm8g
PSBhdV9zYmkoc2IpOworCWlmICghc2JpbmZvKQorCQlyZXR1cm47CisJZm9yIChiaW5kZXggPSAw
OyBiaW5kZXggPD0gc2JpbmZvLT5zaV9iZW5kOyBiaW5kZXgrKykgeworCQkvL2RwcmkoImJpbmRl
eCAlZFxuIiwgYmluZGV4KTsKKwkJZG9fcHJpX2JyKGJpbmRleCwgc2JpbmZvLT5zaV9icmFuY2hb
MCArIGJpbmRleF0pOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGF1X2Ri
Z19zbGVlcChpbnQgc2VjKQoreworCXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3cSk7
CisJd2FpdF9ldmVudF90aW1lb3V0KHdxLCAwLCBzZWMgKiBIWik7Cit9CisKKy8qIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gKi8KKwordm9pZCBhdV9kZWJ1Z19zYmluZm9faW5pdChzdHJ1Y3QgYXVfc2JpbmZvICpz
YmluZm8pCit7CisjaWZkZWYgRm9yY2VJbm90aWZ5CisJYXVfb3B0X3NldF91ZGJhKHNiaW5mby0+
c2lfbW50ZmxhZ3MsIFVEQkFfSU5PVElGWSk7CisjZW5kaWYKKyNpZmRlZiBGb3JjZURsZ3QKKwlh
dV9vcHRfc2V0KHNiaW5mby0+c2lfbW50ZmxhZ3MsIERMR1QpOworI2VuZGlmCisjaWZkZWYgRm9y
Y2VOb1BsaW5rCisJYXVfb3B0X2NscihzYmluZm8tPnNpX21udGZsYWdzLCBQTElOSyk7CisjZW5k
aWYKKyNpZmRlZiBGb3JjZU5vWGlubworCWF1X29wdF9jbHIoc2JpbmZvLT5zaV9tbnRmbGFncywg
WElOTyk7CisjZW5kaWYKKyNpZmRlZiBGb3JjZU5vUmVmcm9mCisJYXVfb3B0X2NscihzYmluZm8t
PnNpX21udGZsYWdzLCBSRUZST0YpOworI2VuZGlmCit9CisKK2ludCBfX2luaXQgYXVfZGVidWdf
aW5pdCh2b2lkKQoreworCWF1ZnNfYmluZGV4X3QgYmluZGV4OworCXN0cnVjdCBhdV92ZGlyX2Rl
c3RyIGRlc3RyOworCisJYmluZGV4ID0gLTE7CisJQXVEZWJ1Z09uKGJpbmRleCA+PSAwKTsKKwor
CWRlc3RyLmxlbiA9IC0xOworCUF1RGVidWdPbihkZXN0ci5sZW4gPCBOQU1FX01BWCk7CisKKyNp
ZmRlZiBDT05GSUdfNEtTVEFDS1MKKwlBdVdhcm4oIkNPTkZJR180S1NUQUNLUyBpcyBkZWZpbmVk
LlxuIik7CisjZW5kaWYKKworCXJldHVybiAwOworfQpkaWZmIC11ck4gbGludXgtMi42LjI1LjQt
dW5pb25mcy5vcmlnL2ZzL2F1ZnMvZGVidWcuaCBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1
ZnMvZGVidWcuaAotLS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvZGVidWcu
aAkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2Zz
L2F1ZnMvZGVidWcuaAkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEsMjEwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICog
VGhpcyBwcm9ncmFtLCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg
KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0
ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgor
ICogZGVidWcgcHJpbnQgZnVuY3Rpb25zCisgKgorICogJElkOiBkZWJ1Zy5oLHYgMS4yIDIwMDgv
MDQvMjEgMDI6MDA6Mzcgc2Zqcm8gRXhwICQKKyAqLworCisjaWZuZGVmIF9fQVVGU19ERUJVR19I
X18KKyNkZWZpbmUgX19BVUZTX0RFQlVHX0hfXworCisjaWZkZWYgX19LRVJORUxfXworCisjaW5j
bHVkZSA8bGludXgvZnMuaD4KKworLyogdG8gZGVidWcgZWFzaWVyLCBkbyBub3QgbWFrZSBpdCBh
biBpbmxpbmVkIGZ1bmN0aW9uICovCisjZGVmaW5lIE10eE11c3RMb2NrKG10eCkJQXVEZWJ1Z09u
KCFtdXRleF9pc19sb2NrZWQobXR4KSkKKworI2lmZGVmIENPTkZJR19BVUZTX0RFQlVHCisvKiBz
cGFyc2Ugd2FybnMgYWJvdXQgcG9pbnRlciAqLworI2RlZmluZSBBdURlYnVnT24oYSkJCUJVR19P
TighIShhKSkKK2V4dGVybiBhdG9taWNfdCBhdV9jb25kOworI2RlZmluZSBhdV9kZWJ1Z19vbigp
CQlhdG9taWNfaW5jX3JldHVybigmYXVfY29uZCkKKyNkZWZpbmUgYXVfZGVidWdfb2ZmKCkJCWF0
b21pY19kZWNfcmV0dXJuKCZhdV9jb25kKQorc3RhdGljIGlubGluZSBpbnQgYXVfZGVidWdfdGVz
dCh2b2lkKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmYXVfY29uZCk7Cit9CisjZWxzZQorI2Rl
ZmluZSBBdURlYnVnT24oYSkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBhdV9kZWJ1Z19vbigp
CQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgYXVfZGVidWdfb2ZmKCkJCWRvIHt9IHdoaWxlICgw
KQorc3RhdGljIGlubGluZSBpbnQgYXVfZGVidWdfdGVzdCh2b2lkKQoreworCXJldHVybiAwOwor
fQorI2VuZGlmIC8qIENPTkZJR19BVUZTX0RFQlVHICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
KworLyogZGVidWcgcHJpbnQgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19MS1RSKSB8fCBkZWZpbmVk
KENPTkZJR19MS1RSX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9sa3RyLmg+CisjaWZkZWYgQ09O
RklHX0FVRlNfREVCVUcKKyN1bmRlZiBMa3RyQ29uZAorI2RlZmluZSBMa3RyQ29uZAl1bmxpa2Vs
eShhdV9kZWJ1Z190ZXN0KCkgfHwgKGxrdHJfY29uZCAmJiBsa3RyX2NvbmQoKSkpCisjZW5kaWYK
KyNlbHNlCisjZGVmaW5lIExrdHJDb25kCQkJYXVfZGVidWdfdGVzdCgpCisjZGVmaW5lIExLVFJE
dW1wVm1hKHByZSwgdm1hLCBzdWYpCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBMS1RSRHVtcFN0
YWNrKCkJCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgTEtUUlRyYWNlKGZtdCwgYXJncy4uLikg
ZG8geyBcCisJaWYgKExrdHJDb25kKSBcCisJCUF1RGJnKGZtdCwgIyNhcmdzKTsgXAorfSB3aGls
ZSAoMCkKKyNkZWZpbmUgTEtUUkxhYmVsKGxhYmVsKQkJTEtUUlRyYWNlKCIlc1xuIiwgI2xhYmVs
KQorI2VuZGlmIC8qIENPTkZJR19MS1RSICovCisKKyNkZWZpbmUgQXVUcmFjZUVycihlKSBkbyB7
IFwKKwlpZiAodW5saWtlbHkoKGUpIDwgMCkpIFwKKwkJTEtUUlRyYWNlKCJlcnIgJWRcbiIsIChp
bnQpKGUpKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBdVRyYWNlRXJyUHRyKHApIGRvIHsg
XAorCWlmIChJU19FUlIocCkpIFwKKwkJTEtUUlRyYWNlKCJlcnIgJWxkXG4iLCBQVFJfRVJSKHAp
KTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBdVRyYWNlRW50ZXIoKQlMS1RSTGFiZWwoZW50
ZXIpCisKKy8qIGRpcnR5IG1hY3JvcyBmb3IgZGVidWcgcHJpbnQsIHVzZSB3aXRoICIlLipzIiBh
bmQgY2F1dGlvbiAqLworI2RlZmluZSBBdUxOUGFpcihxc3RyKQkJKHFzdHIpLT5sZW4sIChxc3Ry
KS0+bmFtZQorI2RlZmluZSBBdURMTlBhaXIoZCkJCUF1TE5QYWlyKCYoZCktPmRfbmFtZSkKKwor
LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEF1RHByaShsdmwsIGZtdCwgYXJnLi4uKSBc
CisJcHJpbnRrKGx2bCBBVUZTX05BTUUgIiAlczolZDolc1slZF06ICIgZm10LCBcCisJICAgICAg
IF9fZnVuY19fLCBfX0xJTkVfXywgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCAjI2FyZykK
KyNkZWZpbmUgQXVEYmcoZm10LCBhcmcuLi4pCUF1RHByaShLRVJOX0RFQlVHLCBmbXQsICMjYXJn
KQorI2RlZmluZSBBdUluZm8oZm10LCBhcmcuLi4pCUF1RHByaShLRVJOX0lORk8sIGZtdCwgIyNh
cmcpCisjZGVmaW5lIEF1V2FybihmbXQsIGFyZy4uLikJQXVEcHJpKEtFUk5fV0FSTklORywgZm10
LCAjI2FyZykKKyNkZWZpbmUgQXVFcnIoZm10LCBhcmcuLi4pCUF1RHByaShLRVJOX0VSUiwgZm10
LCAjI2FyZykKKyNkZWZpbmUgQXVJT0VycihmbXQsIGFyZy4uLikJQXVFcnIoIkkvTyBFcnJvciwg
IiBmbXQsICMjYXJnKQorI2RlZmluZSBBdUlPRXJyV2hjayhmbXQsIGFyZy4uLikgQXVFcnIoIkkv
TyBFcnJvciwgdHJ5IHdoY2suICIgZm10LCAjI2FyZykKKyNkZWZpbmUgQXVXYXJuMShmbXQsIGFy
Zy4uLikgZG8geyBcCisJc3RhdGljIHVuc2lnbmVkIGNoYXIgX2M7IFwKKwlpZiAoIV9jKyspIEF1
V2FybihmbXQsICMjYXJnKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBdUVycjEoZm10LCBh
cmcuLi4pIGRvIHsgXAorCXN0YXRpYyB1bnNpZ25lZCBjaGFyIF9jOyBcCisJaWYgKCFfYysrKSBB
dUVycihmbXQsICMjYXJnKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBdUlPRXJyMShmbXQs
IGFyZy4uLikgZG8geyBcCisJc3RhdGljIHVuc2lnbmVkIGNoYXIgX2M7IFwKKwlpZiAoIV9jKysp
IEF1SU9FcnIoZm10LCAjI2FyZyk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQXVVbnN1cHBv
cnRNc2cJIlRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIiBcCisJCQkiIFBsZWFzZSBy
ZXBvcnQgdGhpcyBhcHBsaWNhdGlvbiB0byBhdWZzLXVzZXJzIE1MLiIKKyNkZWZpbmUgQXVVbnN1
cHBvcnQoZm10LCBhcmdzLi4uKSBkbyB7IFwKKwlBdUVycihBdVVuc3VwcG9ydE1zZyAiXG4iIGZt
dCwgIyNhcmdzKTsgXAorCWR1bXBfc3RhY2soKTsgXAorfSB3aGlsZSAoMCkKKworLyogLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLworCitzdHJ1Y3QgYXVfc2JpbmZvOworI2lmZGVmIENPTkZJR19BVUZTX0RFQlVH
CitleHRlcm4gY2hhciAqYXVfcGxldmVsOworc3RydWN0IGF1X25oYXNoOwordm9pZCBhdV9kcHJp
X3dobGlzdChzdHJ1Y3QgYXVfbmhhc2ggKndobGlzdCk7CitzdHJ1Y3QgYXVfdmRpcjsKK3ZvaWQg
YXVfZHByaV92ZGlyKHN0cnVjdCBhdV92ZGlyICp2ZGlyKTsKK3ZvaWQgYXVfZHByaV9pbm9kZShz
dHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3ZvaWQgYXVfZHByaV9kZW50cnkoc3RydWN0IGRlbnRyeSAq
ZGVudHJ5KTsKK3ZvaWQgYXVfZHByaV9maWxlKHN0cnVjdCBmaWxlICpmaWxwKTsKK3ZvaWQgYXVf
ZHByaV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3ZvaWQgYXVfZGJnX3NsZWVwKGludCBz
ZWMpOworaW50IF9faW5pdCBhdV9kZWJ1Z19pbml0KHZvaWQpOwordm9pZCBhdV9kZWJ1Z19zYmlu
Zm9faW5pdChzdHJ1Y3QgYXVfc2JpbmZvICpzYmluZm8pOworI2RlZmluZSBBdURiZ1dobGlzdCh3
KSBkbyB7IFwKKwlMS1RSVHJhY2UoI3cgIlxuIik7IFwKKwlhdV9kcHJpX3dobGlzdCh3KTsgXAor
fSB3aGlsZSAoMCkKKworI2RlZmluZSBBdURiZ1ZkaXIodikgZG8geyBcCisJTEtUUlRyYWNlKCN2
ICJcbiIpOyBcCisJYXVfZHByaV92ZGlyKHYpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEF1
RGJnSW5vZGUoaSkgZG8geyBcCisJTEtUUlRyYWNlKCNpICJcbiIpOyBcCisJYXVfZHByaV9pbm9k
ZShpKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBdURiZ0RlbnRyeShkKSBkbyB7IFwKKwlM
S1RSVHJhY2UoI2QgIlxuIik7IFwKKwlhdV9kcHJpX2RlbnRyeShkKTsgXAorfSB3aGlsZSAoMCkK
KworI2RlZmluZSBBdURiZ0ZpbGUoZikgZG8geyBcCisJTEtUUlRyYWNlKCNmICJcbiIpOyBcCisJ
YXVfZHByaV9maWxlKGYpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEF1RGJnU2Ioc2IpIGRv
IHsgXAorCUxLVFJUcmFjZSgjc2IgIlxuIik7IFwKKwlhdV9kcHJpX3NiKHNiKTsgXAorfSB3aGls
ZSAoMCkKKworI2RlZmluZSBBdURiZ1NsZWVwKHNlYykgZG8geyBcCisJQXVEYmcoInNsZWVwICVk
IHNlY1xuIiwgc2VjKTsgXAorCWF1X2RiZ19zbGVlcChzZWMpOyBcCit9IHdoaWxlICgwKQorI2Vs
c2UKK3N0YXRpYyBpbmxpbmUgaW50IGF1X2RlYnVnX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsK
K30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhdV9kZWJ1Z19zYmluZm9faW5pdChzdHJ1Y3QgYXVfc2Jp
bmZvICpzYmluZm8pCit7CisJLyogZW1wdHkgKi8KK30KKyNkZWZpbmUgQXVEYmdXaGxpc3QodykJ
CWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBBdURiZ1ZkaXIodikJCWRvIHt9IHdoaWxlICgwKQor
I2RlZmluZSBBdURiZ0lub2RlKGkpCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQXVEYmdEZW50
cnkoZCkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBBdURiZ0ZpbGUoZikJCWRvIHt9IHdoaWxl
ICgwKQorI2RlZmluZSBBdURiZ1NiKHNiKQkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIEF1RGJn
U2xlZXAoc2VjKQkJZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX0FVRlNfREVCVUcg
Ki8KKworI2lmZGVmIERiZ1VkYmFSYWNlCisjZGVmaW5lIEF1RGJnU2xlZXBfVWRiYVJhY2UoKQlB
dURiZ1NsZWVwKERiZ1VkYmFSYWNlKQorI2Vsc2UKKyNkZWZpbmUgQXVEYmdTbGVlcF9VZGJhUmFj
ZSgpCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVVGU19NQUdJQ19T
WVNSUQoraW50IF9faW5pdCBhdV9zeXNycV9pbml0KHZvaWQpOwordm9pZCBhdV9zeXNycV9maW4o
dm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgYXVfc3lzcnFfaW5pdCh2b2lkKQorewor
CXJldHVybiAwOworfQorI2RlZmluZSBhdV9zeXNycV9maW4oKQkJZG8ge30gd2hpbGUgKDApCisj
ZW5kaWYKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0FVRlNfREVCVUdf
SF9fICovCmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9kZW50
cnkuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvZGVudHJ5LmMKLS0tIGxpbnV4LTIu
Ni4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL2RlbnRyeS5jCTE5NzAtMDEtMDEgMDM6MDA6MDAg
KzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9kZW50cnkuYwkyMDA4LTA1
LTI1IDExOjU4OjUzICswMzAwCkBAIC0wLDAgKzEsOTc2IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9ncmFtLCBhdWZzIGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAq
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBh
bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy
ZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0
b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogbG9va3VwIGFuZCBkZW50cnkg
b3BlcmF0aW9ucworICoKKyAqICRJZDogZGVudHJ5LmMsdiAxLjYgMjAwOC8wNS8xOSAwMTo0Njo1
MyBzZmpybyBFeHAgJAorICovCisKKy8vI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisvLyNpbmNsdWRl
IDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgImF1ZnMuaCIKKworLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAq
LworCisvKgorICogYXVfbGt1cF9vbmUoKSBpcyBhIGdlbmVyaWMgYWJzdHJhY3QgZW50cnkgZnVu
Y3Rpb24gd2hpY2ggY2FsbHMKKyAqIGxvb2t1cF9vbmVfbGVuKCkgb3IgX19sb29rdXBfaGFzaCgp
IGZpbmFsbHkuIGl0IGlzIHNvbWUgY29uZGlzaW9ucyB0aGF0IG1ha2VzCisgKiBsb29rdXAgY29t
cGxpY2F0ZWQsIHdoaWNoIGFyZSBuZnMgYnJhbmNoLCBvcGVuLWludGVudCBhbmQgZGxndCBtb2Rl
LgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19BVUZTX0JSX05GUykgfHwgZGVmaW5lZChDT05G
SUdfQVVGU19ETEdUKQorLyogY2YuIGxvb2t1cF9vbmVfbGVuKCkgaW4gbGludXgvZnMvbmFtZWku
YyAqLworc3RydWN0IGRlbnRyeSAqYXVfbGt1cF9vbmUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0
IGRlbnRyeSAqcGFyZW50LCBpbnQgbGVuLAorCQkJICAgc3RydWN0IGF1X25keCAqbmR4KQorewor
CXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCUxLVFJUcmFjZSgiJS4qcy8lLipzLCBuZHh7JWQs
IDB4JXh9XG4iLAorCQkgIEF1RExOUGFpcihwYXJlbnQpLCBsZW4sIG5hbWUsICEhbmR4LT5uZnNt
bnQsIG5keC0+ZmxhZ3MpOworCisJbmR4LT5uZF9maWxlID0gTlVMTDsKKwlpZiAoIW5keC0+bmZz
bW50KQorCQlkZW50cnkgPSBhdV9sa3VwX29uZV9kbGd0KG5hbWUsIHBhcmVudCwgbGVuLCBuZHgt
PmZsYWdzKTsKKwllbHNlCisJCWRlbnRyeSA9IGF1X2xrdXBfaGFzaChuYW1lLCBwYXJlbnQsIGxl
biwgbmR4KTsKKworCUF1VHJhY2VFcnJQdHIoZGVudHJ5KTsKKwlyZXR1cm4gZGVudHJ5OworfQor
I2VuZGlmIC8qIENPTkZJR19BVUZTX0JSX05GUyB8fCBDT05GSUdfQVVGU19ETEdUICovCisKK3N0
cnVjdCBhdV9sa3VwX29uZV9hcmdzIHsKKwlzdHJ1Y3QgZGVudHJ5ICoqZXJycDsKKwljb25zdCBj
aGFyICpuYW1lOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlpbnQgbGVuOworCXN0cnVjdCBh
dV9uZHggKm5keDsKK307CisKK3N0YXRpYyB2b2lkIGF1X2NhbGxfbGt1cF9vbmUodm9pZCAqYXJn
cykKK3sKKwlzdHJ1Y3QgYXVfbGt1cF9vbmVfYXJncyAqYSA9IGFyZ3M7CisJKmEtPmVycnAgPSBh
dV9sa3VwX29uZShhLT5uYW1lLCBhLT5wYXJlbnQsIGEtPmxlbiwgYS0+bmR4KTsKK30KKworI2Rl
ZmluZSBBdUxrdXBfQUxMT1dfTkVHCTEKKyNkZWZpbmUgQXVMa3VwX0RMR1QJCSgxIDw8IDEpCisj
ZGVmaW5lIEF1TGt1cF9ESVJQRVJNMQkJKDEgPDwgMikKKyNkZWZpbmUgYXVfZnRlc3RfbGt1cChm
bGFncywgbmFtZSkJKChmbGFncykgJiBBdUxrdXBfIyNuYW1lKQorI2RlZmluZSBhdV9mc2V0X2xr
dXAoZmxhZ3MsIG5hbWUpCXsgKGZsYWdzKSB8PSBBdUxrdXBfIyNuYW1lOyB9CisjZGVmaW5lIGF1
X2ZjbHJfbGt1cChmbGFncywgbmFtZSkJeyAoZmxhZ3MpICY9IH5BdUxrdXBfIyNuYW1lOyB9Cisj
aWZuZGVmIENPTkZJR19BVUZTX0RMR1QKKyN1bmRlZiBBdUxrdXBfRExHVAorI2RlZmluZSBBdUxr
dXBfRExHVAkwCisjdW5kZWYgQXVMa3VwX0RJUlBFUk0xCisjZGVmaW5lIEF1TGt1cF9ESVJQRVJN
MQkwCisjZW5kaWYKKworc3RydWN0IGF1X2RvX2xvb2t1cF9hcmdzIHsKKwl1bnNpZ25lZCBpbnQJ
CWZsYWdzOworCW1vZGVfdAkJCXR5cGU7CisJc3RydWN0IG5hbWVpZGF0YQkqbmQ7Cit9OworCisv
KgorICogcmV0dXJucyBwb3NpdGl2ZS9uZWdhdGl2ZSBkZW50cnksIE5VTEwgb3IgYW4gZXJyb3Iu
CisgKiBOVUxMIG1lYW5zIHdoaXRlb3V0LWVkIG9yIG5vdC1mb3VuZC4KKyAqLworc3RhdGljIG5v
aW5saW5lX2Zvcl9zdGFjaworc3RydWN0IGRlbnRyeSAqYXVfZG9fbG9va3VwKHN0cnVjdCBkZW50
cnkgKmhfcGFyZW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgYXVmc19iaW5kZXhf
dCBiaW5kZXgsIHN0cnVjdCBxc3RyICp3aF9uYW1lLAorCQkJICAgIHN0cnVjdCBhdV9kb19sb29r
dXBfYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeTsKKwlpbnQgd2hfZm91
bmQsIHdoX2FibGUsIG9wcSwgZXJyOworCXN0cnVjdCBpbm9kZSAqaF9kaXIsICpoX2lub2RlLCAq
aW5vZGU7CisJc3RydWN0IHFzdHIgKm5hbWU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwl1
bnNpZ25lZCBpbnQgbmRfZmxhZ3M7CisJc3RydWN0IGF1X25keCBuZHggPSB7CisJCS5mbGFncwk9
IDAsCisJCS5uZAk9IGFyZ3MtPm5kCisJfTsKKwljb25zdCBpbnQgYWxsb3dfbmVnID0gYXVfZnRl
c3RfbGt1cChhcmdzLT5mbGFncywgQUxMT1dfTkVHKTsKKworCUxLVFJUcmFjZSgiJS4qcy8lLipz
LCBiJWQsIHtmbGFncyAweCV4LCB0eXBlIDAlbywgbmQgJWR9XG4iLAorCQkgIEF1RExOUGFpciho
X3BhcmVudCksIEF1RExOUGFpcihkZW50cnkpLCBiaW5kZXgsCisJCSAgYXJncy0+ZmxhZ3MsIGFy
Z3MtPnR5cGUsICEhYXJncy0+bmQpOworCWlmIChhcmdzLT5uZCkKKwkJTEtUUlRyYWNlKCJuZHsw
eCV4fVxuIiwgYXJncy0+bmQtPmZsYWdzKTsKKwlBdURlYnVnT24oSVNfUk9PVChkZW50cnkpKTsK
KwloX2RpciA9IGhfcGFyZW50LT5kX2lub2RlOworCisJbmRfZmxhZ3MgPSAwOworCXdoX2ZvdW5k
ID0gMDsKKwlzYiA9IGRlbnRyeS0+ZF9zYjsKKwluZHgubmZzbW50ID0gYXVfbmZzbW50KHNiLCBi
aW5kZXgpOworCWlmICh1bmxpa2VseShhdV9mdGVzdF9sa3VwKGFyZ3MtPmZsYWdzLCBETEdUKSkp
CisJCWF1X2ZzZXRfbmR4KG5keC5mbGFncywgRExHVCk7CisJaWYgKHVubGlrZWx5KGF1X2Z0ZXN0
X2xrdXAoYXJncy0+ZmxhZ3MsIERJUlBFUk0xKSkpCisJCWF1X2ZzZXRfbmR4KG5keC5mbGFncywg
RElSUEVSTTEpOworCUxLVFJUcmFjZSgibmZzbW50ICVwXG4iLCBuZHgubmZzbW50KTsKKwluZHgu
YnIgPSBhdV9zYnIoc2IsIGJpbmRleCk7CisJd2hfYWJsZSA9IGF1X2JyX3doYWJsZShuZHguYnIt
PmJyX3Blcm0pOworCW5hbWUgPSAmZGVudHJ5LT5kX25hbWU7CisJaWYgKHVubGlrZWx5KHdoX2Fi
bGUpKQorCQl3aF9mb3VuZCA9IGF1X3Rlc3Rfcm9icl93aChuYW1lLCBoX3BhcmVudCwgd2hfbmFt
ZSwKKwkJCQkJICAgLyp0cnlfc2lvKi8wLCAmbmR4KTsKKwkvL2lmIChMa3RyQ29uZCkgd2hfZm91
bmQgPSAtMTsKKwloX2RlbnRyeSA9IEVSUl9QVFIod2hfZm91bmQpOworCWlmICghd2hfZm91bmQp
CisJCWdvdG8gcmVhbF9sb29rdXA7CisJaWYgKHVubGlrZWx5KHdoX2ZvdW5kIDwgMCkpCisJCWdv
dG8gb3V0OworCisJLyogV2UgZm91bmQgYSB3aGl0ZW91dCAqLworCS8vYXVfc2V0X2RiZW5kKGRl
bnRyeSwgYmluZGV4KTsKKwlhdV9zZXRfZGJ3aChkZW50cnksIGJpbmRleCk7CisJaWYgKCFhbGxv
d19uZWcpCisJCXJldHVybiBOVUxMOyAvKiBzdWNjZXNzICovCisJaWYgKHVubGlrZWx5KG5keC5u
ZAorCQkgICAgICYmIGF1X3Rlc3RfbmZzKGhfcGFyZW50LT5kX3NiKQorCQkgICAgICYmIChuZHgu
bmQtPmZsYWdzICYgTE9PS1VQX0NSRUFURSkpKSB7CisJCW5kX2ZsYWdzID0gbmR4Lm5kLT5mbGFn
czsKKwkJbmR4Lm5kLT5mbGFncyAmPSB+KExPT0tVUF9PUEVOIHwgTE9PS1VQX0NSRUFURSk7CisJ
fQorCisgcmVhbF9sb29rdXA6CisJLyogZG8gbm90IHN1cGVyaW8uICovCisJaF9kZW50cnkgPSBh
dV9sa3VwX29uZShuYW1lLT5uYW1lLCBoX3BhcmVudCwgbmFtZS0+bGVuLCAmbmR4KTsKKwkvL2lm
IChMa3RyQ29uZCkge2RwdXQoaF9kZW50cnkpOyBoX2RlbnRyeSA9IEVSUl9QVFIoLTEpO30KKwlp
ZiAoSVNfRVJSKGhfZGVudHJ5KSkKKwkJZ290byBvdXQ7CisJQXVEZWJ1Z09uKGRfdW5oYXNoZWQo
aF9kZW50cnkpKTsKKwloX2lub2RlID0gaF9kZW50cnktPmRfaW5vZGU7CisJaWYgKCFoX2lub2Rl
KSB7CisJCWlmICghYWxsb3dfbmVnKQorCQkJZ290byBvdXRfbmVnOworCX0gZWxzZSBpZiAod2hf
Zm91bmQKKwkJICAgfHwgKGFyZ3MtPnR5cGUgJiYgYXJncy0+dHlwZSAhPSAoaF9pbm9kZS0+aV9t
b2RlICYgU19JRk1UKSkpCisJCWdvdG8gb3V0X25lZzsKKworCWlmIChhdV9kYmVuZChkZW50cnkp
IDw9IGJpbmRleCkKKwkJYXVfc2V0X2RiZW5kKGRlbnRyeSwgYmluZGV4KTsKKwlpZiAoYXVfZGJz
dGFydChkZW50cnkpIDwgMCB8fCBiaW5kZXggPCBhdV9kYnN0YXJ0KGRlbnRyeSkpCisJCWF1X3Nl
dF9kYnN0YXJ0KGRlbnRyeSwgYmluZGV4KTsKKwlhdV9zZXRfaF9kcHRyKGRlbnRyeSwgYmluZGV4
LCBoX2RlbnRyeSk7CisKKwllcnIgPSBhdV9icl9uZnNfaF9pbnRlbnQobmR4Lm5kX2ZpbGUsIGRl
bnRyeSwgYmluZGV4LCBhcmdzLT5uZCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJaF9kZW50
cnkgPSBFUlJfUFRSKGVycik7CisJCWdvdG8gb3V0OworCX0KKworCWlub2RlID0gZGVudHJ5LT5k
X2lub2RlOworCWlmICghaF9pbm9kZSB8fCAhU19JU0RJUihoX2lub2RlLT5pX21vZGUpIHx8ICF3
aF9hYmxlCisJICAgIHx8IChpbm9kZSAmJiAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkpCisJCWdv
dG8gb3V0OyAvKiBzdWNjZXNzICovCisKKwltdXRleF9sb2NrX25lc3RlZCgmaF9pbm9kZS0+aV9t
dXRleCwgQXVMc2NfSV9DSElMRCk7CisJb3BxID0gYXVfZGlyb3BxX3Rlc3QoaF9kZW50cnksICZu
ZHgpOworCS8vaWYgKExrdHJDb25kKSBvcHEgPSAtMTsKKwltdXRleF91bmxvY2soJmhfaW5vZGUt
PmlfbXV0ZXgpOworCWlmIChvcHEgPiAwKQorCQlhdV9zZXRfZGJkaXJvcHEoZGVudHJ5LCBiaW5k
ZXgpOworCWVsc2UgaWYgKHVubGlrZWx5KG9wcSA8IDApKSB7CisJCWF1X3NldF9oX2RwdHIoZGVu
dHJ5LCBiaW5kZXgsIE5VTEwpOworCQloX2RlbnRyeSA9IEVSUl9QVFIob3BxKTsKKwl9CisJZ290
byBvdXQ7CisKKyBvdXRfbmVnOgorCWRwdXQoaF9kZW50cnkpOworCWhfZGVudHJ5ID0gTlVMTDsK
KyBvdXQ6CisJaWYgKHVubGlrZWx5KG5kX2ZsYWdzKSkKKwkJbmR4Lm5kLT5mbGFncyB8PSAobmRf
ZmxhZ3MgJiAoTE9PS1VQX09QRU4gfCBMT09LVVBfQ1JFQVRFKSk7CisJQXVUcmFjZUVyclB0ciho
X2RlbnRyeSk7CisJcmV0dXJuIGhfZGVudHJ5OworfQorCisvKgorICogcmV0dXJucyB0aGUgbnVt
YmVyIG9mIGhpZGRlbiBwb3NpdGl2ZSBkZW50cmllcywKKyAqIG90aGVyd2lzZSBhbiBlcnJvci4K
KyAqIGNhbiBiZSBjYWxsZWQgYXQgdW5saW5raW5nIHdpdGggQHR5cGUgaXMgemVyby4KKyAqLwor
aW50IGF1X2xrdXBfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBi
c3RhcnQsIG1vZGVfdCB0eXBlLAorCQkgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQg
bnBvc2l0aXZlLCBlcnIsIGlzZGlyOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlhdWZzX2Jp
bmRleF90IGJpbmRleCwgYnRhaWwsIGJkaXJvcHE7CisJY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUg
PSAmZGVudHJ5LT5kX25hbWU7CisJc3RydWN0IHFzdHIgd2huYW1lOworCXN0cnVjdCBzdXBlcl9i
bG9jayAqc2I7CisJdW5zaWduZWQgaW50IG1udF9mbGFnczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2Rl
OworCXN0cnVjdCBhdV9kb19sb29rdXBfYXJncyBhcmdzID0geworCQkudHlwZQk9IHR5cGUsCisJ
CS5uZAk9IG5kCisJfTsKKworCUxLVFJUcmFjZSgiJS4qcywgYiVkLCB0eXBlIDAlb1xuIiwgQXVM
TlBhaXIobmFtZSksIGJzdGFydCwgdHlwZSk7CisJQXVEZWJ1Z09uKGJzdGFydCA8IDAgfHwgSVNf
Uk9PVChkZW50cnkpKTsKKworCS8qIGRpciBtYXkgbm90IGJlIGxvY2tlZCAqLworCXBhcmVudCA9
IGRnZXRfcGFyZW50KGRlbnRyeSk7CisKKwllcnIgPSBhdV90ZXN0X3JvYnJfc2h3aChkZW50cnkt
PmRfc2IsIG5hbWUpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIG91dDsKKworCWVyciA9
IGF1X3doX25hbWVfYWxsb2MobmFtZS0+bmFtZSwgbmFtZS0+bGVuLCAmd2huYW1lKTsKKwkvL2lm
IChMa3RyQ29uZCkge2F1X3doX25hbWVfZnJlZSgmd2huYW1lKTsgZXJyID0gLTE7fQorCWlmICh1
bmxpa2VseShlcnIpKQorCQlnb3RvIG91dDsKKworCXNiID0gZGVudHJ5LT5kX3NiOworCW1udF9m
bGFncyA9IGF1X21udGZsYWdzKHNiKTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpc2Rp
ciA9IChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKTsKKwlhcmdzLmZsYWdzID0gMDsK
KwlpZiAodW5saWtlbHkoYXVfb3B0X3Rlc3RfZGxndChtbnRfZmxhZ3MpKSkKKwkJYXVfZnNldF9s
a3VwKGFyZ3MuZmxhZ3MsIERMR1QpOworCWlmICh1bmxpa2VseShhdV9vcHRfdGVzdF9kaXJwZXJt
MShtbnRfZmxhZ3MpKSkKKwkJYXVfZnNldF9sa3VwKGFyZ3MuZmxhZ3MsIERJUlBFUk0xKTsKKwlp
ZiAoIXR5cGUpCisJCWF1X2ZzZXRfbGt1cChhcmdzLmZsYWdzLCBBTExPV19ORUcpOworCW5wb3Np
dGl2ZSA9IDA7CisJYnRhaWwgPSBhdV9kYnRhaWxkaXIocGFyZW50KTsKKwlmb3IgKGJpbmRleCA9
IGJzdGFydDsgYmluZGV4IDw9IGJ0YWlsOyBiaW5kZXgrKykgeworCQlzdHJ1Y3QgZGVudHJ5ICpo
X3BhcmVudCwgKmhfZGVudHJ5OworCQlzdHJ1Y3QgaW5vZGUgKmhfaW5vZGUsICpoX2RpcjsKKwor
CQloX2RlbnRyeSA9IGF1X2hfZHB0cihkZW50cnksIGJpbmRleCk7CisJCWlmIChoX2RlbnRyeSkg
eworCQkJaWYgKGhfZGVudHJ5LT5kX2lub2RlKQorCQkJCW5wb3NpdGl2ZSsrOworCQkJaWYgKHR5
cGUgIT0gU19JRkRJUikKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQl9CisJCWhfcGFyZW50
ID0gYXVfaF9kcHRyKHBhcmVudCwgYmluZGV4KTsKKwkJaWYgKCFoX3BhcmVudCkKKwkJCWNvbnRp
bnVlOworCQloX2RpciA9IGhfcGFyZW50LT5kX2lub2RlOworCQlpZiAoIWhfZGlyIHx8ICFTX0lT
RElSKGhfZGlyLT5pX21vZGUpKQorCQkJY29udGludWU7CisKKwkJbXV0ZXhfbG9ja19uZXN0ZWQo
JmhfZGlyLT5pX211dGV4LCBBdUxzY19JX1BBUkVOVCk7CisJCWhfZGVudHJ5ID0gYXVfZG9fbG9v
a3VwKGhfcGFyZW50LCBkZW50cnksIGJpbmRleCwgJndobmFtZSwKKwkJCQkJJmFyZ3MpOworCQkv
LyBkbyBub3QgZHB1dCBmb3IgdGVzdGluZworCQkvL2lmIChMa3RyQ29uZCkge2hfZGVudHJ5ID0g
RVJSX1BUUigtMSk7fQorCQltdXRleF91bmxvY2soJmhfZGlyLT5pX211dGV4KTsKKwkJZXJyID0g
UFRSX0VSUihoX2RlbnRyeSk7CisJCWlmIChJU19FUlIoaF9kZW50cnkpKQorCQkJZ290byBvdXRf
d2g7CisJCWF1X2ZjbHJfbGt1cChhcmdzLmZsYWdzLCBBTExPV19ORUcpOworCisJCWlmIChhdV9k
YndoKGRlbnRyeSkgPj0gMCkKKwkJCWJyZWFrOworCQlpZiAoIWhfZGVudHJ5KQorCQkJY29udGlu
dWU7CisJCWhfaW5vZGUgPSBoX2RlbnRyeS0+ZF9pbm9kZTsKKwkJaWYgKCFoX2lub2RlKQorCQkJ
Y29udGludWU7CisJCW5wb3NpdGl2ZSsrOworCQlpZiAoIWFyZ3MudHlwZSkKKwkJCWFyZ3MudHlw
ZSA9IGhfaW5vZGUtPmlfbW9kZSAmIFNfSUZNVDsKKwkJaWYgKGFyZ3MudHlwZSAhPSBTX0lGRElS
KQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKGlzZGlyKSB7CisJCQkvKiB0aGUgdHlwZSBvZiBsb3dl
cnMgbWF5IGJlIGRpZmZlcmVudCAqLworCQkJYmRpcm9wcSA9IGF1X2RiZGlyb3BxKGRlbnRyeSk7
CisJCQlpZiAoYmRpcm9wcSA+PSAwICYmIGJkaXJvcHEgPD0gYmluZGV4KQorCQkJCWJyZWFrOwor
CQl9CisJfQorCisJaWYgKG5wb3NpdGl2ZSkgeworCQlMS1RSTGFiZWwocG9zaXRpdmUpOworCQlh
dV91cGRhdGVfZGJzdGFydChkZW50cnkpOworCX0KKwllcnIgPSBucG9zaXRpdmU7CisKKyBvdXRf
d2g6CisJYXVfd2hfbmFtZV9mcmVlKCZ3aG5hbWUpOworIG91dDoKKwlkcHV0KHBhcmVudCk7CisJ
QXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBkZW50cnkgKmF1X3Np
b19sa3VwX29uZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGludCBs
ZW4sCisJCQkgICAgICAgc3RydWN0IGF1X25keCAqbmR4KQoreworCXN0cnVjdCBkZW50cnkgKmRl
bnRyeTsKKwlpbnQgd2txX2VycjsKKworCUxLVFJUcmFjZSgiJS4qcy8lLipzXG4iLCBBdURMTlBh
aXIocGFyZW50KSwgbGVuLCBuYW1lKTsKKworCWlmICghYXVfdGVzdF9oX3Blcm1fc2lvKHBhcmVu
dC0+ZF9pbm9kZSwgTUFZX0VYRUMsCisJCQkJYXVfZnRlc3RfbmR4KG5keC0+ZmxhZ3MsIERMR1Qp
KSkKKwkJZGVudHJ5ID0gYXVfbGt1cF9vbmUobmFtZSwgcGFyZW50LCBsZW4sIG5keCk7CisJZWxz
ZSB7CisJCS8vIHVnbHkKKwkJdW5zaWduZWQgaW50IGZsYWdzID0gbmR4LT5mbGFnczsKKwkJc3Ry
dWN0IGF1X2xrdXBfb25lX2FyZ3MgYXJncyA9IHsKKwkJCS5lcnJwCT0gJmRlbnRyeSwKKwkJCS5u
YW1lCT0gbmFtZSwKKwkJCS5wYXJlbnQJPSBwYXJlbnQsCisJCQkubGVuCT0gbGVuLAorCQkJLm5k
eAk9IG5keAorCQl9OworCisJCWF1X2ZjbHJfbmR4KG5keC0+ZmxhZ3MsIERMR1QpOworCQlhdV9m
Y2xyX25keChuZHgtPmZsYWdzLCBESVJQRVJNMSk7CisJCXdrcV9lcnIgPSBhdV93a3Ffd2FpdChh
dV9jYWxsX2xrdXBfb25lLCAmYXJncywgLypkbGd0Ki8wKTsKKwkJaWYgKHVubGlrZWx5KHdrcV9l
cnIpKQorCQkJZGVudHJ5ID0gRVJSX1BUUih3a3FfZXJyKTsKKwkJbmR4LT5mbGFncyA9IGZsYWdz
OworCX0KKworCUF1VHJhY2VFcnJQdHIoZGVudHJ5KTsKKwlyZXR1cm4gZGVudHJ5OworfQorCisv
KgorICogbG9va3VwIEBkZW50cnkgb24gQGJpbmRleCB3aGljaCBzaG91bGQgYmUgbmVnYXRpdmUu
CisgKi8KK2ludCBhdV9sa3VwX25lZyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4
X3QgYmluZGV4KQoreworCWludCBlcnI7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50LCAqaF9wYXJl
bnQsICpoX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmhfZGlyOworCXN0cnVjdCBhdV9uZHggbmR4
ID0geworCQkuZmxhZ3MJPSAwLAorCQkubmQJPSBOVUxMLAorCQkvLy5icgk9IE5VTEwKKwl9Owor
CXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJdW5zaWduZWQgaW50IG1udF9mbGFnczsKKworCUxL
VFJUcmFjZSgiJS4qcywgYiVkXG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgYmluZGV4KTsKKwkvKiBk
aXIgbWF5IG5vdCBiZSBsb2NrZWQgKi8KKwlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOwor
CUF1RGVidWdPbighcGFyZW50IHx8ICFwYXJlbnQtPmRfaW5vZGUKKwkJICB8fCAhU19JU0RJUihw
YXJlbnQtPmRfaW5vZGUtPmlfbW9kZSkpOworCWhfcGFyZW50ID0gYXVfaF9kcHRyKHBhcmVudCwg
YmluZGV4KTsKKwlBdURlYnVnT24oIWhfcGFyZW50KTsKKwloX2RpciA9IGhfcGFyZW50LT5kX2lu
b2RlOworCUF1RGVidWdPbighaF9kaXIgfHwgIVNfSVNESVIoaF9kaXItPmlfbW9kZSkpOworCisJ
c2IgPSBkZW50cnktPmRfc2I7CisJbW50X2ZsYWdzID0gYXVfbW50ZmxhZ3Moc2IpOworCW5keC5u
ZnNtbnQgPSBhdV9uZnNtbnQoc2IsIGJpbmRleCk7CisJaWYgKHVubGlrZWx5KGF1X29wdF90ZXN0
X2RsZ3QobW50X2ZsYWdzKSkpCisJCWF1X2ZzZXRfbmR4KG5keC5mbGFncywgRExHVCk7CisJaWYg
KHVubGlrZWx5KGF1X29wdF90ZXN0X2RpcnBlcm0xKG1udF9mbGFncykpKQorCQlhdV9mc2V0X25k
eChuZHguZmxhZ3MsIERJUlBFUk0xKTsKKwloX2RlbnRyeSA9IGF1X3Npb19sa3VwX29uZShkZW50
cnktPmRfbmFtZS5uYW1lLCBoX3BhcmVudCwKKwkJCQkgICBkZW50cnktPmRfbmFtZS5sZW4sICZu
ZHgpOworCS8vaWYgKExrdHJDb25kKSB7ZHB1dChoX2RlbnRyeSk7IGhfZGVudHJ5ID0gRVJSX1BU
UigtMSk7fQorCWVyciA9IFBUUl9FUlIoaF9kZW50cnkpOworCWlmIChJU19FUlIoaF9kZW50cnkp
KQorCQlnb3RvIG91dDsKKwlpZiAodW5saWtlbHkoaF9kZW50cnktPmRfaW5vZGUpKSB7CisJCWVy
ciA9IC1FSU87CisJCUF1SU9FcnIoImIlZCAlLipzIHNob3VsZCBiZSBuZWdhdGl2ZS5cbiIsCisJ
CQliaW5kZXgsIEF1RExOUGFpcihoX2RlbnRyeSkpOworCQlkcHV0KGhfZGVudHJ5KTsKKwkJZ290
byBvdXQ7CisJfQorCisJaWYgKGJpbmRleCA8IGF1X2Ric3RhcnQoZGVudHJ5KSkKKwkJYXVfc2V0
X2Ric3RhcnQoZGVudHJ5LCBiaW5kZXgpOworCWlmIChhdV9kYmVuZChkZW50cnkpIDwgYmluZGV4
KQorCQlhdV9zZXRfZGJlbmQoZGVudHJ5LCBiaW5kZXgpOworCWF1X3NldF9oX2RwdHIoZGVudHJ5
LCBiaW5kZXgsIGhfZGVudHJ5KTsKKwllcnIgPSAwOworCisgb3V0OgorCWRwdXQocGFyZW50KTsK
KwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIHJldHVybnMgdGhl
IG51bWJlciBvZiBmb3VuZCBoaWRkZW4gcG9zaXRpdmUgZGVudHJpZXMsCisgKiBvdGhlcndpc2Ug
YW4gZXJyb3IuCisgKi8KK2ludCBhdV9yZWZyZXNoX2hkZW50cnkoc3RydWN0IGRlbnRyeSAqZGVu
dHJ5LCBtb2RlX3QgdHlwZSkKK3sKKwlpbnQgbnBvc2l0aXZlLCBuZXdfc3o7CisJc3RydWN0IGF1
X2RpbmZvICpkaW5mbzsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBkZW50cnkg
KnBhcmVudDsKKwlhdWZzX2JpbmRleF90IGJpbmRleCwgcGFyZW50X2JlbmQsIHBhcmVudF9ic3Rh
cnQsIGJ3aCwgYmRpcm9wcSwgYmVuZDsKKwlzdHJ1Y3QgYXVfaGRlbnRyeSAqcDsKKwlhdV9nZW5f
dCBzZ2VuOworCisJTEtUUlRyYWNlKCIlLipzLCB0eXBlIDAlb1xuIiwgQXVETE5QYWlyKGRlbnRy
eSksIHR5cGUpOworCURpTXVzdFdyaXRlTG9jayhkZW50cnkpOworCXNiID0gZGVudHJ5LT5kX3Ni
OworCUF1RGVidWdPbihJU19ST09UKGRlbnRyeSkpOworCXNnZW4gPSBhdV9zaWdlbihzYik7CisJ
cGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwlBdURlYnVnT24oYXVfZGlnZW4ocGFyZW50
KSAhPSBzZ2VuCisJCSAgfHwgYXVfaWlnZW4ocGFyZW50LT5kX2lub2RlKSAhPSBzZ2VuKTsKKwor
CW5wb3NpdGl2ZSA9IC1FTk9NRU07CisJbmV3X3N6ID0gc2l6ZW9mKCpkaW5mby0+ZGlfaGRlbnRy
eSkgKiAoYXVfc2JlbmQoc2IpICsgMSk7CisJZGluZm8gPSBhdV9kaShkZW50cnkpOworCXAgPSBh
dV9renJlYWxsb2MoZGluZm8tPmRpX2hkZW50cnksIHNpemVvZigqcCkgKiAoZGluZm8tPmRpX2Jl
bmQgKyAxKSwKKwkJCSBuZXdfc3osIEdGUF9LRVJORUwpOworCS8vcCA9IE5VTEw7CisJaWYgKHVu
bGlrZWx5KCFwKSkKKwkJZ290byBvdXQ7CisJZGluZm8tPmRpX2hkZW50cnkgPSBwOworCisJYmVu
ZCA9IGRpbmZvLT5kaV9iZW5kOworCWJ3aCA9IGRpbmZvLT5kaV9id2g7CisJYmRpcm9wcSA9IGRp
bmZvLT5kaV9iZGlyb3BxOworCXAgKz0gZGluZm8tPmRpX2JzdGFydDsKKwlmb3IgKGJpbmRleCA9
IGRpbmZvLT5kaV9ic3RhcnQ7IGJpbmRleCA8PSBiZW5kOyBiaW5kZXgrKywgcCsrKSB7CisJCXN0
cnVjdCBkZW50cnkgKmhkLCAqaGRwOworCQlzdHJ1Y3QgYXVfaGRlbnRyeSB0bXAsICpxOworCQlh
dWZzX2JpbmRleF90IG5ld19iaW5kZXg7CisKKwkJaGQgPSBwLT5oZF9kZW50cnk7CisJCWlmICgh
aGQpCisJCQljb250aW51ZTsKKwkJaGRwID0gZGdldF9wYXJlbnQoaGQpOworCQlpZiAoaGRwID09
IGF1X2hfZHB0cihwYXJlbnQsIGJpbmRleCkpIHsKKwkJCWRwdXQoaGRwKTsKKwkJCWNvbnRpbnVl
OworCQl9CisKKwkJbmV3X2JpbmRleCA9IGF1X2ZpbmRfZGJpbmRleChwYXJlbnQsIGhkcCk7CisJ
CWRwdXQoaGRwKTsKKwkJQXVEZWJ1Z09uKG5ld19iaW5kZXggPT0gYmluZGV4KTsKKwkJaWYgKGRp
bmZvLT5kaV9id2ggPT0gYmluZGV4KQorCQkJYndoID0gbmV3X2JpbmRleDsKKwkJaWYgKGRpbmZv
LT5kaV9iZGlyb3BxID09IGJpbmRleCkKKwkJCWJkaXJvcHEgPSBuZXdfYmluZGV4OworCQlpZiAo
bmV3X2JpbmRleCA8IDApIHsgLy8gdGVzdCBoZXJlCisJCQlhdV9oZHB1dChwLCAvKmRvX2ZyZWUq
LzApOworCQkJcC0+aGRfZGVudHJ5ID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIHN3
YXAgdHdvIGhpZGRlbiBkZW50cmllcywgYW5kIGxvb3AgYWdhaW4gKi8KKwkJcSA9IGRpbmZvLT5k
aV9oZGVudHJ5ICsgbmV3X2JpbmRleDsKKwkJdG1wID0gKnE7CisJCSpxID0gKnA7CisJCSpwID0g
dG1wOworCQlpZiAodG1wLmhkX2RlbnRyeSkgeworCQkJYmluZGV4LS07CisJCQlwLS07CisJCX0K
Kwl9CisKKwkvLyB0ZXN0IGhlcmUKKwlkaW5mby0+ZGlfYndoID0gLTE7CisJaWYgKHVubGlrZWx5
KGJ3aCA+PSAwICYmIGJ3aCA8PSBhdV9zYmVuZChzYikgJiYgYXVfc2JyX3doYWJsZShzYiwgYndo
KSkpCisJCWRpbmZvLT5kaV9id2ggPSBid2g7CisJZGluZm8tPmRpX2JkaXJvcHEgPSAtMTsKKwlp
ZiAodW5saWtlbHkoYmRpcm9wcSA+PSAwICYmIGJkaXJvcHEgPD0gYXVfc2JlbmQoc2IpCisJCSAg
ICAgJiYgYXVfc2JyX3doYWJsZShzYiwgYmRpcm9wcSkpKQorCQlkaW5mby0+ZGlfYmRpcm9wcSA9
IGJkaXJvcHE7CisJcGFyZW50X2JlbmQgPSBhdV9kYmVuZChwYXJlbnQpOworCXAgPSBkaW5mby0+
ZGlfaGRlbnRyeTsKKwlmb3IgKGJpbmRleCA9IDA7IGJpbmRleCA8PSBwYXJlbnRfYmVuZDsgYmlu
ZGV4KyssIHArKykKKwkJaWYgKHAtPmhkX2RlbnRyeSkgeworCQkJZGluZm8tPmRpX2JzdGFydCA9
IGJpbmRleDsKKwkJCWJyZWFrOworCQl9CisJcCA9IGRpbmZvLT5kaV9oZGVudHJ5ICsgcGFyZW50
X2JlbmQ7CisJLy9mb3IgKGJpbmRleCA9IHBhcmVudF9iZW5kOyBiaW5kZXggPiBkaW5mby0+ZGlf
YnN0YXJ0OyBiaW5kZXgtLSwgcC0tKQorCWZvciAoYmluZGV4ID0gcGFyZW50X2JlbmQ7IGJpbmRl
eCA+PSAwOyBiaW5kZXgtLSwgcC0tKQorCQlpZiAocC0+aGRfZGVudHJ5KSB7CisJCQlkaW5mby0+
ZGlfYmVuZCA9IGJpbmRleDsKKwkJCWJyZWFrOworCQl9CisKKwlucG9zaXRpdmUgPSAwOworCXBh
cmVudF9ic3RhcnQgPSBhdV9kYnN0YXJ0KHBhcmVudCk7CisJaWYgKHR5cGUgIT0gU19JRkRJUiAm
JiBkaW5mby0+ZGlfYnN0YXJ0ID09IHBhcmVudF9ic3RhcnQpCisJCWdvdG8gb3V0X2RnZW47IC8q
IHN1Y2Nlc3MgKi8KKworCW5wb3NpdGl2ZSA9IGF1X2xrdXBfZGVudHJ5KGRlbnRyeSwgcGFyZW50
X2JzdGFydCwgdHlwZSwgLypuZCovTlVMTCk7CisJLy9pZiAoTGt0ckNvbmQpIG5wb3NpdGl2ZSA9
IC0xOworCWlmIChucG9zaXRpdmUgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAodW5saWtlbHkoZGlu
Zm8tPmRpX2J3aCA+PSAwICYmIGRpbmZvLT5kaV9id2ggPD0gZGluZm8tPmRpX2JzdGFydCkpCisJ
CWRfZHJvcChkZW50cnkpOworCisgb3V0X2RnZW46CisJYXVfdXBkYXRlX2RpZ2VuKGRlbnRyeSk7
Cisgb3V0OgorCWRwdXQocGFyZW50KTsKKwlBdVRyYWNlRXJyKG5wb3NpdGl2ZSk7CisJcmV0dXJu
IG5wb3NpdGl2ZTsKK30KKworc3RhdGljIGludCBhdV9sb2NrX25kKHN0cnVjdCBkZW50cnkgKmRl
bnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IGxvY2tlZCA9IDA7CisJaWYgKG5k
ICYmIGRlbnRyeSAhPSBuZC0+cGF0aC5kZW50cnkpIHsKKwkJZGlfcmVhZF9sb2NrX3BhcmVudChu
ZC0+cGF0aC5kZW50cnksIDApOworCQlsb2NrZWQgPSAxOworCX0KKwlyZXR1cm4gbG9ja2VkOwor
fQorCitzdGF0aWMgdm9pZCBhdV91bmxvY2tfbmQoaW50IGxvY2tlZCwgc3RydWN0IG5hbWVpZGF0
YSAqbmQpCit7CisJaWYgKGxvY2tlZCkKKwkJZGlfcmVhZF91bmxvY2sobmQtPnBhdGguZGVudHJ5
LCAwKTsKK30KKworLy8jZGVmaW5lIFRlc3RpbmdGdXNlCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0
YWNrIGludAorYXVfZG9faF9kX3JldmFsKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5k
ZXhfdCBiaW5kZXgsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kLCBzdHJ1Y3QgZGVudHJ5ICpoX2Rl
bnRyeSkKK3sKKwlpbnQgZXJyLCB2YWxpZCwgZTsKKwlpbnQgKCpyZXZhbCkoc3RydWN0IGRlbnRy
eSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3Ry
dWN0IG5hbWVpZGF0YSBmYWtlX25kLCAqcDsKKworCUxLVFJUcmFjZSgiJS4qcywgYiVkLCBuZCAl
ZFxuIiwgQXVETE5QYWlyKGRlbnRyeSksIGJpbmRleCwgISFuZCk7CisKKwllcnIgPSAwOworCXJl
dmFsID0gTlVMTDsKKwlpZiAoaF9kZW50cnktPmRfb3ApCisJCXJldmFsID0gaF9kZW50cnktPmRf
b3AtPmRfcmV2YWxpZGF0ZTsKKwlpZiAoIXJldmFsKQorCQlnb3RvIG91dDsKKworCXNiID0gZGVu
dHJ5LT5kX3NiOworCWlmIChuZCkgeworCQltZW1jcHkoJmZha2VfbmQsIG5kLCBzaXplb2YoKm5k
KSk7CisJCWVyciA9IGF1X2Zha2VfaW50ZW50KCZmYWtlX25kLCBhdV9zYnJfcGVybShzYiwgYmlu
ZGV4KSk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290
byBvdXQ7CisJCX0KKwl9CisJcCA9IGF1X2Zha2VfZG0oJmZha2VfbmQsIG5kLCBzYiwgYmluZGV4
KTsKKwlBdURlYnVnT24oSVNfRVJSKHApKTsKKwlBdURlYnVnT24obmQgJiYgcCAhPSAmZmFrZV9u
ZCk7CisJTEtUUlRyYWNlKCJiJWRcbiIsIGJpbmRleCk7CisKKwkvKiBpdCBtYXkgcmV0dXJuIHRy
aS1zdGF0ZSAqLworCXZhbGlkID0gcmV2YWwoaF9kZW50cnksIHApOworCWlmICh1bmxpa2VseSh2
YWxpZCA8IDApKQorCQllcnIgPSB2YWxpZDsKKwllbHNlIGlmICghdmFsaWQpCisJCWVyciA9IC1F
SU5WQUw7CisJZWxzZQorCQlBdURlYnVnT24oZXJyKTsKKworCWlmIChwKSB7CisJCUF1RGVidWdP
bighbmQpOworCQllID0gYXVfaGluX2FmdGVyX3JldmFsKHAsIGRlbnRyeSwgYmluZGV4LCBuZC0+
aW50ZW50Lm9wZW4uZmlsZSk7CisjaWZuZGVmIFRlc3RpbmdGdXNlCisJCWF1X3VwZGF0ZV9mdXNl
X2hfaW5vZGUocC0+cGF0aC5tbnQsIGhfZGVudHJ5KTsgLyppZ25vcmUqLworI2VuZGlmCisJCWlm
ICh1bmxpa2VseShlICYmICFlcnIpKQorCQkJZXJyID0gZTsKKwl9CisjaWZuZGVmIFRlc3RpbmdG
dXNlCisJZWxzZQorCQlhdV91cGRhdGVfZnVzZV9oX2lub2RlKE5VTEwsIGhfZGVudHJ5KTsgLypp
Z25vcmUqLworI2VuZGlmCisJYXVfZmFrZV9kbV9yZWxlYXNlKHApOworCisgb3V0OgorCUF1VHJh
Y2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNr
IGludAoraF9kX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUg
Kmlub2RlLAorCSAgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgaW50IGRvX3VkYmEpCit7CisJ
aW50IGVyciwgcGx1cywgbG9ja2VkLCB1bmhhc2hlZCwgaXNfcm9vdCwgaF9wbHVzOworCWF1ZnNf
YmluZGV4X3QgYmluZGV4LCBidGFpbCwgYnN0YXJ0LCBpYnMsIGliZTsKKwlzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiOworCXN0cnVjdCBpbm9kZSAqZmlyc3QsICpoX2lub2RlLCAqaF9jYWNoZWRfaW5v
ZGU7CisJdW1vZGVfdCBtb2RlLCBoX21vZGU7CisJc3RydWN0IGRlbnRyeSAqaF9kZW50cnk7CisJ
c3RydWN0IHFzdHIgKm5hbWU7CisKKwlMS1RSVHJhY2UoIiUuKnMsIG5kICVkXG4iLCBBdURMTlBh
aXIoZGVudHJ5KSwgISFuZCk7CisJQXVEZWJ1Z09uKGlub2RlICYmIGF1X2RpZ2VuKGRlbnRyeSkg
IT0gYXVfaWlnZW4oaW5vZGUpKTsKKworCWVyciA9IDA7CisJc2IgPSBkZW50cnktPmRfc2I7CisJ
cGx1cyA9IDA7CisJbW9kZSA9IDA7CisJZmlyc3QgPSBOVUxMOworCWlicyA9IC0xOworCWliZSA9
IC0xOworCXVuaGFzaGVkID0gZF91bmhhc2hlZChkZW50cnkpOworCWlzX3Jvb3QgPSBJU19ST09U
KGRlbnRyeSk7CisJbmFtZSA9ICZkZW50cnktPmRfbmFtZTsKKworCS8qCisJICogVGhlb3JldGlj
YWxseSwgUkVWQUwgdGVzdCBzaG91bGQgYmUgdW5uZWNlc3NhcnkgaW4gY2FzZSBvZiBJTk9USUZZ
LgorCSAqIEJ1dCBpbm90aWZ5IGRvZXNuJ3QgZmlyZSBzb21lIG5lY2Vzc2FyeSBldmVudHMsCisJ
ICoJSU5fQVRUUklCIGZvciBhdGltZS9ubGluay9wYWdlaW8KKwkgKglJTl9ERUxFVEUgZm9yIE5G
UyBkZW50cnkKKwkgKiBMZXQncyBkbyBSRVZBTCB0ZXN0IHRvby4KKwkgKi8KKwlpZiAoZG9fdWRi
YSAmJiBpbm9kZSkgeworCQltb2RlID0gKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpOworCQlwbHVz
ID0gKGlub2RlLT5pX25saW5rID4gMCk7CisJCWZpcnN0ID0gYXVfaF9pcHRyKGlub2RlLCBhdV9p
YnN0YXJ0KGlub2RlKSk7CisJCWlicyA9IGF1X2lic3RhcnQoaW5vZGUpOworCQlpYmUgPSBhdV9p
YmVuZChpbm9kZSk7CisJfQorCisJYnN0YXJ0ID0gYXVfZGJzdGFydChkZW50cnkpOworCWJ0YWls
ID0gYnN0YXJ0OworCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlidGFp
bCA9IGF1X2RidGFpbGRpcihkZW50cnkpOworCWxvY2tlZCA9IGF1X2xvY2tfbmQoZGVudHJ5LCBu
ZCk7CisJZm9yIChiaW5kZXggPSBic3RhcnQ7IGJpbmRleCA8PSBidGFpbDsgYmluZGV4KyspIHsK
KwkJaF9kZW50cnkgPSBhdV9oX2RwdHIoZGVudHJ5LCBiaW5kZXgpOworCQlpZiAoIWhfZGVudHJ5
KQorCQkJY29udGludWU7CisKKwkJTEtUUlRyYWNlKCJiJWQsICUuKnNcbiIsIGJpbmRleCwgQXVE
TE5QYWlyKGhfZGVudHJ5KSk7CisjaWZkZWYgVGVzdGluZ0Z1c2UKKwkJLyogZm9yY2UgcmUtbG9v
a3VwIGZvciBmdXNlLCBpbiBvcmRlciB0byB1cGRhdGUgYXR0cmlidXRlcyAqLworCQlpZiAodW5s
aWtlbHkoYXVfdGVzdF9mdXNlKGhfZGVudHJ5LT5kX3NiKSkpCisJCQlnb3RvIGVycjsKKyNlbmRp
ZgorCisJCWlmICh1bmxpa2VseShkb191ZGJhCisJCQkgICAgICYmICFpc19yb290CisJCQkgICAg
ICYmICh1bmhhc2hlZCAhPSBkX3VuaGFzaGVkKGhfZGVudHJ5KQorCQkJCSB8fCBuYW1lLT5sZW4g
IT0gaF9kZW50cnktPmRfbmFtZS5sZW4KKwkJCQkgfHwgbWVtY21wKG5hbWUtPm5hbWUsIGhfZGVu
dHJ5LT5kX25hbWUubmFtZSwKKwkJCQkJICAgbmFtZS0+bGVuKQorCQkJCSAgICAgKSkpIHsKKwkJ
CUxLVFJUcmFjZSgidW5oYXNoIDB4JXggMHgleCwgJS4qcyAlLipzXG4iLAorCQkJCSAgdW5oYXNo
ZWQsIGRfdW5oYXNoZWQoaF9kZW50cnkpLAorCQkJCSAgQXVETE5QYWlyKGRlbnRyeSksIEF1RExO
UGFpcihoX2RlbnRyeSkpOworCQkJZ290byBlcnI7CisJCX0KKworCQllcnIgPSBhdV9kb19oX2Rf
cmV2YWwoZGVudHJ5LCBiaW5kZXgsIG5kLCBoX2RlbnRyeSk7CisJCWlmICh1bmxpa2VseShlcnIp
KQorCQkJLyogZG8gbm90IGdvdG8gZXJyLCB0byBrZWVwIHRoZSBlcnJubyAqLworCQkJYnJlYWs7
CisKKwkJaWYgKHVubGlrZWx5KCFkb191ZGJhKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFVEQkEg
dGVzdHMgKi8KKwkJaF9pbm9kZSA9IGhfZGVudHJ5LT5kX2lub2RlOworCQlpZiAodW5saWtlbHko
ISFpbm9kZSAhPSAhIWhfaW5vZGUpKSB7CisJCQkvL0F1RGJnKCJoZXJlXG4iKTsKKwkJCWdvdG8g
ZXJyOworCQl9CisKKwkJaF9wbHVzID0gcGx1czsKKwkJaF9tb2RlID0gbW9kZTsKKwkJaF9jYWNo
ZWRfaW5vZGUgPSBoX2lub2RlOworCQlpZiAoaF9pbm9kZSkgeworCQkJaF9tb2RlID0gKGhfaW5v
ZGUtPmlfbW9kZSAmIFNfSUZNVCk7CisJCQloX3BsdXMgPSAoaF9pbm9kZS0+aV9ubGluayA+IDAp
OworCQkJLy9BdURiZ0lub2RlKGlub2RlKTsKKwkJCS8vQXVEYmdJbm9kZShoX2lub2RlKTsKKwkJ
fQorCQlpZiAoaW5vZGUgJiYgaWJzIDw9IGJpbmRleCAmJiBiaW5kZXggPD0gaWJlKQorCQkJaF9j
YWNoZWRfaW5vZGUgPSBhdV9oX2lwdHIoaW5vZGUsIGJpbmRleCk7CisKKwkJTEtUUlRyYWNlKCJ7
JWQsIDAlbywgJWR9LCBoeyVkLCAwJW8sICVkfVxuIiwKKwkJCSAgcGx1cywgbW9kZSwgISFoX2Nh
Y2hlZF9pbm9kZSwKKwkJCSAgaF9wbHVzLCBoX21vZGUsICEhaF9pbm9kZSk7CisJCWlmICh1bmxp
a2VseShwbHVzICE9IGhfcGx1cworCQkJICAgICB8fCBtb2RlICE9IGhfbW9kZQorCQkJICAgICB8
fCBoX2NhY2hlZF9pbm9kZSAhPSBoX2lub2RlKSkKKwkJCWdvdG8gZXJyOworCQljb250aW51ZTsK
KworCWVycjoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWF1X3VubG9ja19uZChs
b2NrZWQsIG5kKTsKKworCS8qCisJICoganVkZ2luZyBieSB0aW1lc3RhbXBzIGlzIG1lYW5pbmds
ZXNzIHNpbmNlIHNvbWUgZmlsZXN5c3RlbSB1c2VzCisJICogQ1VSUkVOVF9USU1FX1NFQyBpbnN0
ZWFkIG9mIENVUlJFTlRfVElNRS4KKwkgKi8KKwkvKgorCSAqIE5GUyBtYXkgc3RvcCBJTl9ERUxF
VEUgYmVjYXVzZSBvZiBEQ0FDSEVfTkZTRlNfUkVOQU1FRC4KKwkgKi8KKworCUF1VHJhY2VFcnIo
ZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGludAor
c2ltcGxlX3JldmFsX2RwYXRoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVfZ2VuX3Qgc2dlbikK
K3sKKwlpbnQgZXJyOworCW1vZGVfdCB0eXBlOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlz
dHJ1Y3QgaW5vZGUgKmlub2RlOworCisJTEtUUlRyYWNlKCIlLipzLCBzZ2VuICVkXG4iLCBBdURM
TlBhaXIoZGVudHJ5KSwgc2dlbik7CisJU2lNdXN0QW55TG9jayhkZW50cnktPmRfc2IpOworCURp
TXVzdFdyaXRlTG9jayhkZW50cnkpOworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCUF1RGVi
dWdPbighaW5vZGUpOworCisJaWYgKGF1X2RpZ2VuKGRlbnRyeSkgPT0gc2dlbiAmJiBhdV9paWdl
bihpbm9kZSkgPT0gc2dlbikKKwkJcmV0dXJuIDA7CisKKwlwYXJlbnQgPSBkZ2V0X3BhcmVudChk
ZW50cnkpOworCWRpX3JlYWRfbG9ja19wYXJlbnQocGFyZW50LCBBdUxvY2tfSVIpOworCUF1RGVi
dWdPbihhdV9kaWdlbihwYXJlbnQpICE9IHNnZW4KKwkJICB8fCBhdV9paWdlbihwYXJlbnQtPmRf
aW5vZGUpICE9IHNnZW4pOworI2lmZGVmIENPTkZJR19BVUZTX0RFQlVHCisJeworCQlpbnQgaSwg
ajsKKwkJc3RydWN0IGF1X2Rjc3ViX3BhZ2VzIGRwYWdlczsKKwkJc3RydWN0IGF1X2RwYWdlICpk
cGFnZTsKKwkJc3RydWN0IGRlbnRyeSAqKmRlbnRyaWVzOworCisJCWVyciA9IGF1X2RwYWdlc19p
bml0KCZkcGFnZXMsIEdGUF9URU1QT1JBUlkpOworCQlBdURlYnVnT24oZXJyKTsKKwkJZXJyID0g
YXVfZGNzdWJfcGFnZXNfcmV2KCZkcGFnZXMsIHBhcmVudCwgLypkb19pbmNsdWRlKi8xLCBOVUxM
LAorCQkJCQkgTlVMTCk7CisJCUF1RGVidWdPbihlcnIpOworCQlmb3IgKGkgPSBkcGFnZXMubmRw
YWdlIC0gMTsgIWVyciAmJiBpID49IDA7IGktLSkgeworCQkJZHBhZ2UgPSBkcGFnZXMuZHBhZ2Vz
ICsgaTsKKwkJCWRlbnRyaWVzID0gZHBhZ2UtPmRlbnRyaWVzOworCQkJZm9yIChqID0gZHBhZ2Ut
Pm5kZW50cnkgLSAxOyAhZXJyICYmIGogPj0gMDsgai0tKQorCQkJCUF1RGVidWdPbihhdV9kaWdl
bihkZW50cmllc1tqXSkgIT0gc2dlbik7CisJCX0KKwkJYXVfZHBhZ2VzX2ZyZWUoJmRwYWdlcyk7
CisJfQorI2VuZGlmCisJdHlwZSA9IChpbm9kZS0+aV9tb2RlICYgU19JRk1UKTsKKwkvKiByZXR1
cm5zIGEgbnVtYmVyIG9mIHBvc2l0aXZlIGRlbnRyaWVzICovCisJZXJyID0gYXVfcmVmcmVzaF9o
ZGVudHJ5KGRlbnRyeSwgdHlwZSk7CisJaWYgKGVyciA+PSAwKQorCQllcnIgPSBhdV9yZWZyZXNo
X2hpbm9kZShpbm9kZSwgZGVudHJ5KTsKKwlkaV9yZWFkX3VubG9jayhwYXJlbnQsIEF1TG9ja19J
Uik7CisJZHB1dChwYXJlbnQpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQor
CitpbnQgYXVfcmV2YWxfZHBhdGgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBhdV9nZW5fdCBzZ2Vu
KQoreworCWludCBlcnI7CisJc3RydWN0IGRlbnRyeSAqZCwgKnBhcmVudDsKKwlzdHJ1Y3QgaW5v
ZGUgKmlub2RlOworCisJTEtUUlRyYWNlKCIlLipzLCBzZ2VuICVkXG4iLCBBdURMTlBhaXIoZGVu
dHJ5KSwgc2dlbik7CisJQXVEZWJ1Z09uKCFkZW50cnktPmRfaW5vZGUpOworCURpTXVzdFdyaXRl
TG9jayhkZW50cnkpOworCisJaWYgKCFhdV9mdGVzdF9zaShhdV9zYmkoZGVudHJ5LT5kX3NiKSwg
RkFJTEVEX1JFRlJFU0hfRElSUykpCisJCXJldHVybiBzaW1wbGVfcmV2YWxfZHBhdGgoZGVudHJ5
LCBzZ2VuKTsKKworCS8qIHNsb3cgbG9vcCwga2VlcCBpdCBzaW1wbGUgYW5kIHN0dXBpZCAqLwor
CS8qIGNmOiBhdV9jcHVwX2RpcnMoKSAqLworCWVyciA9IDA7CisJcGFyZW50ID0gTlVMTDsKKwl3
aGlsZSAoYXVfZGlnZW4oZGVudHJ5KSAhPSBzZ2VuIHx8IGF1X2lpZ2VuKGRlbnRyeS0+ZF9pbm9k
ZSkgIT0gc2dlbikgeworCQlkID0gZGVudHJ5OworCQl3aGlsZSAoMSkgeworCQkJZHB1dChwYXJl
bnQpOworCQkJcGFyZW50ID0gZGdldF9wYXJlbnQoZCk7CisJCQlpZiAoYXVfZGlnZW4ocGFyZW50
KSA9PSBzZ2VuCisJCQkgICAgJiYgYXVfaWlnZW4ocGFyZW50LT5kX2lub2RlKSA9PSBzZ2VuKQor
CQkJCWJyZWFrOworCQkJZCA9IHBhcmVudDsKKwkJfQorCisJCWlub2RlID0gZC0+ZF9pbm9kZTsK
KwkJaWYgKGQgIT0gZGVudHJ5KSB7CisJCQkvL211dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsK
KwkJCWRpX3dyaXRlX2xvY2tfY2hpbGQoZCk7CisJCX0KKworCQkvKiBzb21lb25lIG1pZ2h0IHVw
ZGF0ZSBvdXIgZGVudHJ5IHdoaWxlIHdlIHdlcmUgc2xlZXBpbmcgKi8KKwkJaWYgKGF1X2RpZ2Vu
KGQpICE9IHNnZW4gfHwgYXVfaWlnZW4oZC0+ZF9pbm9kZSkgIT0gc2dlbikgeworCQkJZGlfcmVh
ZF9sb2NrX3BhcmVudChwYXJlbnQsIEF1TG9ja19JUik7CisJCQkvKiByZXR1cm5zIGEgbnVtYmVy
IG9mIHBvc2l0aXZlIGRlbnRyaWVzICovCisJCQllcnIgPSBhdV9yZWZyZXNoX2hkZW50cnkoZCwg
aW5vZGUtPmlfbW9kZSAmIFNfSUZNVCk7CisJCQkvL2VyciA9IC0xOworCQkJaWYgKGVyciA+PSAw
KQorCQkJCWVyciA9IGF1X3JlZnJlc2hfaGlub2RlKGlub2RlLCBkKTsKKwkJCS8vZXJyID0gLTE7
CisJCQlkaV9yZWFkX3VubG9jayhwYXJlbnQsIEF1TG9ja19JUik7CisJCX0KKworCQlpZiAoZCAh
PSBkZW50cnkpIHsKKwkJCWRpX3dyaXRlX3VubG9jayhkKTsKKwkJCS8vbXV0ZXhfdW5sb2NrKCZp
bm9kZS0+aV9tdXRleCk7CisJCX0KKwkJZHB1dChwYXJlbnQpOworCQlpZiAodW5saWtlbHkoZXJy
KSkKKwkJCWJyZWFrOworCX0KKworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQor
CisvKgorICogVEhJUyBJUyBBIEJPT0xFQU4gRlVOQ1RJT046IHJldHVybnMgMSBpZiB2YWxpZCwg
MCBvdGhlcndpc2UuCisgKiBuZnNkIHBhc3NlcyBOVUxMIGFzIG5hbWVpZGF0YS4KKyAqLworc3Rh
dGljIGludCBhdWZzX2RfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBu
YW1laWRhdGEgKm5kKQoreworCWludCB2YWxpZCwgZXJyLCBkb191ZGJhOworCXN0cnVjdCBzdXBl
cl9ibG9jayAqc2I7CisJYXVfZ2VuX3Qgc2dlbjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0
cnVjdCBuYW1laWRhdGEgdG1wX25kLCAqbmRwOworCisJTEtUUlRyYWNlKCJkZW50cnkgJS4qc1xu
IiwgQXVETE5QYWlyKGRlbnRyeSkpOworCWlmIChuZCAmJiBuZC0+cGF0aC5kZW50cnkpCisJCUxL
VFJUcmFjZSgibmR7JS4qcywgMHgleH1cbiIsCisJCQkgIEF1RExOUGFpcihuZC0+cGF0aC5kZW50
cnkpLCBuZC0+ZmxhZ3MpOworCS8vZGlyIGNhc2U6IEF1RGVidWdPbihkZW50cnktPmRfcGFyZW50
ICE9IG5kLT5kZW50cnkpOworCS8vcmVtb3ZlIGZhaWx1cmUgY2FzZTpBdURlYnVnT24oIUlTX1JP
T1QoZGVudHJ5KSAmJiBkX3VuaGFzaGVkKGRlbnRyeSkpOworCUF1RGVidWdPbighZGVudHJ5LT5k
X2ZzZGF0YSk7CisJLy9BdURiZ0RlbnRyeShkZW50cnkpOworCisJZXJyID0gLUVJTlZBTDsKKwlp
bm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzYiA9IGRlbnRyeS0+ZF9zYjsKKwlzaV9yZWFkX2xv
Y2soc2IsIEF1TG9ja19GTFVTSCk7CisKKwlzZ2VuID0gYXVfc2lnZW4oc2IpOworCWlmIChhdV9k
aWdlbihkZW50cnkpID09IHNnZW4pCisJCWRpX3JlYWRfbG9ja19jaGlsZChkZW50cnksICFBdUxv
Y2tfSVIpOworCWVsc2UgeworCQlBdURlYnVnT24oSVNfUk9PVChkZW50cnkpKTsKKyNpZmRlZiBG
b3JjZUlub3RpZnkKKwkJQXVEYmcoIlVEQkEgb3IgZGlnZW4sICUuKnNcbiIsIEF1RExOUGFpcihk
ZW50cnkpKTsKKyNlbmRpZgorCQlkaV93cml0ZV9sb2NrX2NoaWxkKGRlbnRyeSk7CisJCWlmIChp
bm9kZSkKKwkJCWVyciA9IGF1X3JldmFsX2RwYXRoKGRlbnRyeSwgc2dlbik7CisJCS8vZXJyID0g
LTE7CisJCWRpX2Rvd25ncmFkZV9sb2NrKGRlbnRyeSwgQXVMb2NrX0lSKTsKKwkJaWYgKHVubGlr
ZWx5KGVycikpCisJCQlnb3RvIG91dDsKKwkJaWYgKGlub2RlKQorCQkJaWlfcmVhZF91bmxvY2so
aW5vZGUpOworCQlBdURlYnVnT24oYXVfZGlnZW4oZGVudHJ5KSAhPSBzZ2VuKTsKKwl9CisKKwlp
ZiAoaW5vZGUpIHsKKwkJaWYgKGF1X2lpZ2VuKGlub2RlKSA9PSBzZ2VuKQorCQkJaWlfcmVhZF9s
b2NrX2NoaWxkKGlub2RlKTsKKwkJZWxzZSB7CisJCQlBdURlYnVnT24oSVNfUk9PVChkZW50cnkp
KTsKKyNpZmRlZiBGb3JjZUlub3RpZnkKKwkJCUF1RGJnKCJVREJBIG9yIHN1cnZpdmVkLCAlLipz
XG4iLCBBdURMTlBhaXIoZGVudHJ5KSk7CisJCQkvL2F1X2RlYnVnX29uKCk7CisJCQkvL0F1RGJn
SW5vZGUoaW5vZGUpOworCQkJLy9hdV9kZWJ1Z19vZmYoKTsKKyNlbmRpZgorCQkJaWlfd3JpdGVf
bG9ja19jaGlsZChpbm9kZSk7CisJCQllcnIgPSBhdV9yZWZyZXNoX2hpbm9kZShpbm9kZSwgZGVu
dHJ5KTsKKwkJCWlpX2Rvd25ncmFkZV9sb2NrKGlub2RlKTsKKwkJCWlmICh1bmxpa2VseShlcnIp
KQorCQkJCWdvdG8gb3V0OworCQkJQXVEZWJ1Z09uKGF1X2lpZ2VuKGlub2RlKSAhPSBzZ2VuKTsK
KwkJfQorCX0KKworCUF1RGVidWdPbihhdV9kaWdlbihkZW50cnkpICE9IHNnZW4pOworCUF1RGVi
dWdPbihpbm9kZSAmJiBhdV9paWdlbihpbm9kZSkgIT0gc2dlbik7CisJZXJyID0gLUVJTlZBTDsK
Kwlkb191ZGJhID0gIWF1X29wdF90ZXN0KGF1X21udGZsYWdzKHNiKSwgVURCQV9OT05FKTsKKwlp
ZiAoZG9fdWRiYSAmJiBpbm9kZSkgeworCQlhdWZzX2JpbmRleF90IGJzdGFydCA9IGF1X2lic3Rh
cnQoaW5vZGUpOworCQlpZiAoYnN0YXJ0ID49IDAKKwkJICAgICYmIGF1X3Rlc3RfaGlnZW4oaW5v
ZGUsIGF1X2hfaXB0cihpbm9kZSwgYnN0YXJ0KSkpCisJCQlnb3RvIG91dDsKKwl9CisJbmRwID0g
YXVfZHVwX25kKGF1X3NiaShzYiksICZ0bXBfbmQsIG5kKTsKKwllcnIgPSBoX2RfcmV2YWxpZGF0
ZShkZW50cnksIGlub2RlLCBuZHAsIGRvX3VkYmEpOworCS8vZXJyID0gLTE7CisKKyBvdXQ6CisJ
YXVfc3RvcmVfZm1vZGVfZXhlYyhuZCwgaW5vZGUpOworCisJaWYgKGlub2RlKQorCQlpaV9yZWFk
X3VubG9jayhpbm9kZSk7CisJZGlfcmVhZF91bmxvY2soZGVudHJ5LCAhQXVMb2NrX0lSKTsKKwlz
aV9yZWFkX3VubG9jayhzYik7CisJQXVUcmFjZUVycihlcnIpOworCXZhbGlkID0gIWVycjsKKwlp
ZiAoIXZhbGlkKQorCQlMS1RSVHJhY2UoIiUuKnMgaW52YWxpZFxuIiwgQXVETE5QYWlyKGRlbnRy
eSkpOworCXJldHVybiB2YWxpZDsKK30KKworc3RhdGljIHZvaWQgYXVmc19kX3JlbGVhc2Uoc3Ry
dWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBhdV9kaW5mbyAqZGluZm87CisJYXVmc19i
aW5kZXhfdCBiZW5kLCBiaW5kZXg7CisKKwlMS1RSVHJhY2UoIiUuKnNcbiIsIEF1RExOUGFpcihk
ZW50cnkpKTsKKwlBdURlYnVnT24oIWRfdW5oYXNoZWQoZGVudHJ5KSk7CisKKwlkaW5mbyA9IGRl
bnRyeS0+ZF9mc2RhdGE7CisJaWYgKHVubGlrZWx5KCFkaW5mbykpCisJCXJldHVybjsKKworCS8q
IGRlbnRyeSBtYXkgbm90IGJlIHJldmFsaWRhdGVkICovCisJYmluZGV4ID0gZGluZm8tPmRpX2Jz
dGFydDsKKwlpZiAoYmluZGV4ID49IDApIHsKKwkJc3RydWN0IGF1X2hkZW50cnkgKnA7CisJCWJl
bmQgPSBkaW5mby0+ZGlfYmVuZDsKKwkJQXVEZWJ1Z09uKGJlbmQgPCBiaW5kZXgpOworCQlwID0g
ZGluZm8tPmRpX2hkZW50cnkgKyBiaW5kZXg7CisJCXdoaWxlIChiaW5kZXgrKyA8PSBiZW5kKSB7
CisJCQlpZiAocC0+aGRfZGVudHJ5KQorCQkJCWF1X2hkcHV0KHAsIC8qZG9fZnJlZSovMSk7CisJ
CQlwKys7CisJCX0KKwl9CisJa2ZyZWUoZGluZm8tPmRpX2hkZW50cnkpOworCWF1X2NhY2hlX2Zy
ZWVfZGluZm8oZGluZm8pOworfQorCitzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgYXVmc19kb3Ag
PSB7CisJLmRfcmV2YWxpZGF0ZQk9IGF1ZnNfZF9yZXZhbGlkYXRlLAorCS5kX3JlbGVhc2UJPSBh
dWZzX2RfcmVsZWFzZSwKKwkvKiBuZXZlciB1c2UgZF9kZWxldGUsIGVzcGVjaWFsbHkgaW4gY2Fz
ZSBvZiBuZnMgc2VydmVyICovCisJLy8uZF9kZWxldGUJPSBhdWZzX2RfZGVsZXRlCisJLy8uZF9p
cHV0CQk9IGF1ZnNfZF9pcHV0Cit9OwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5v
cmlnL2ZzL2F1ZnMvZGVudHJ5LmggbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL2RlbnRy
eS5oCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9kZW50cnkuaAkxOTcw
LTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMv
ZGVudHJ5LmgJMjAwOC0wNS0yNSAxMTo1NjowOCArMDMwMApAQCAtMCwwICsxLDM4MSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IEp1bmppcm8gT2thamltYQorICoKKyAqIFRoaXMg
cHJvZ3JhbSwgYXVmcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8g
dGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBG
aWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworLyoKKyAqIGxv
b2t1cCBhbmQgZGVudHJ5IG9wZXJhdGlvbnMKKyAqCisgKiAkSWQ6IGRlbnRyeS5oLHYgMS40IDIw
MDgvMDUvMDQgMjM6NTQ6NTMgc2Zqcm8gRXhwICQKKyAqLworCisjaWZuZGVmIF9fQVVGU19ERU5U
UllfSF9fCisjZGVmaW5lIF9fQVVGU19ERU5UUllfSF9fCisKKyNpZmRlZiBfX0tFUk5FTF9fCisK
KyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVk
ZSA8bGludXgvYXVmc190eXBlLmg+CisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgInN1cGVy
LmgiCisjaW5jbHVkZSAidmZzdWIuaCIKKworLyogbmFtZWlkYXRhIG9wZW5faW50ZW50ICovCitl
bnVtIHsKKwlBdUludGVudF9BVUZTLAorCUF1SW50ZW50X0JSQU5DSCwKKwlBdUludGVudF9MYXN0
Cit9OworCitzdHJ1Y3QgYXVfaGRpbnRlbnQgeworCXN0cnVjdCBsaXN0X2hlYWQJaGRpX2xpc3Q7
CisJc3RydWN0IGZpbGUJCSpoZGlfZmlsZVtBdUludGVudF9MYXN0XTsKK307CisKK3N0cnVjdCBh
dV9oZGVudHJ5IHsKKwlzdHJ1Y3QgZGVudHJ5CQkqaGRfZGVudHJ5OworCisjaWZkZWYgQ09ORklH
X0FVRlNfQlJfTkZTCisJc3BpbmxvY2tfdAkJaGRfbG9jazsgLyogaW50ZXN0X2xpc3QgKi8KKwlz
dHJ1Y3QgbGlzdF9oZWFkCSpoZF9pbnRlbnRfbGlzdDsKKyNlbmRpZgorfTsKKworc3RydWN0IGF1
X2RpbmZvIHsKKwlhdG9taWNfdAkJZGlfZ2VuZXJhdGlvbjsKKworCXN0cnVjdCBhdV9yd3NlbQkJ
ZGlfcndzZW07CisJYXVmc19iaW5kZXhfdAkJZGlfYnN0YXJ0LCBkaV9iZW5kLCBkaV9id2gsIGRp
X2JkaXJvcHE7CisJc3RydWN0IGF1X2hkZW50cnkJKmRpX2hkZW50cnk7Cit9OworCisvKiBuYW1l
aWRhdGEgZXh0ZW5zaW9uIGZsYWdzICovCisjZGVmaW5lIEF1TmR4X0RMR1QJMQorI2RlZmluZSBB
dU5keF9ESVJQRVJNMQkoMSA8PCAxKQorI2RlZmluZSBhdV9mdGVzdF9uZHgoZmxhZ3MsIG5hbWUp
CSgoZmxhZ3MpICYgQXVOZHhfIyNuYW1lKQorI2RlZmluZSBhdV9mc2V0X25keChmbGFncywgbmFt
ZSkJeyAoZmxhZ3MpIHw9IEF1TmR4XyMjbmFtZTsgfQorI2RlZmluZSBhdV9mY2xyX25keChmbGFn
cywgbmFtZSkJeyAoZmxhZ3MpICY9IH5BdU5keF8jI25hbWU7IH0KKyNpZm5kZWYgQ09ORklHX0FV
RlNfRExHVAorI3VuZGVmIEF1TmR4X0RMR1QKKyNkZWZpbmUgQXVOZHhfRExHVAkwCisjdW5kZWYg
QXVOZHhfRElSUEVSTTEKKyNkZWZpbmUgQXVOZHhfRElSUEVSTTEJMAorI2VuZGlmCisKK3N0cnVj
dCBhdV9uZHggeworCXN0cnVjdCB2ZnNtb3VudCAqbmZzbW50OworCXVuc2lnbmVkIGludCBmbGFn
czsKKwlzdHJ1Y3QgbmFtZWlkYXRhICpuZDsKKwlzdHJ1Y3QgYXVfYnJhbmNoICpicjsKKwlzdHJ1
Y3QgZmlsZSAqbmRfZmlsZTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlu
bGluZSB2b2lkIGF1X2RvX2hfZGVudHJ5X2luaXQoc3RydWN0IGF1X2hkZW50cnkgKmhkZW50cnkp
Cit7CisJaGRlbnRyeS0+aGRfZGVudHJ5ID0gTlVMTDsKK30KKworI2lmZGVmIENPTkZJR19BVUZT
X0JSX05GUworc3RhdGljIGlubGluZSB2b2lkIGF1X2hfZGVudHJ5X2luaXQoc3RydWN0IGF1X2hk
ZW50cnkgKmhkZW50cnkpCit7CisJYXVfZG9faF9kZW50cnlfaW5pdChoZGVudHJ5KTsKKwlzcGlu
X2xvY2tfaW5pdCgmaGRlbnRyeS0+aGRfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBh
dV9oX2RlbnRyeV9pbml0X2FsbChzdHJ1Y3QgYXVfaGRlbnRyeSAqaGRlbnRyeSwgaW50IG4pCit7
CisJd2hpbGUgKG4tLSkKKwkJc3Bpbl9sb2NrX2luaXQoJmhkZW50cnlbbl0uaGRfbG9jayk7Cit9
CisKKy8qIGJyX25mcy5jICovCitzdHJ1Y3QgZmlsZSAqYXVfaF9pbnRlbnQoc3RydWN0IGRlbnRy
eSAqZGVudHJ5LCBhdWZzX2JpbmRleF90IGJpbmRleCwKKwkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSk7
CitpbnQgYXVfYnJfbmZzX2hfaW50ZW50KHN0cnVjdCBmaWxlICpuZF9maWxlLCBzdHJ1Y3QgZGVu
dHJ5ICpkZW50cnksCisJCSAgICAgICBhdWZzX2JpbmRleF90IGJpbmRleCwgc3RydWN0IG5hbWVp
ZGF0YSAqbmQpOwordm9pZCBhdV9oaW50ZW50X3B1dChzdHJ1Y3QgYXVfaGRlbnRyeSAqaGQsIGlu
dCBkb19mcmVlKTsKK2ludCBhdV9mYWtlX2ludGVudChzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgaW50
IHBlcm0pOworaW50IGF1X2hpbl9hZnRlcl9yZXZhbChzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgc3Ry
dWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgICAgYXVmc19iaW5kZXhfdCBiaW5kZXgsIHN0cnVj
dCBmaWxlICpmaWxlKTsKK3N0cnVjdCBkZW50cnkgKmF1X2xrdXBfaGFzaChjb25zdCBjaGFyICpu
YW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGludCBsZW4sCisJCQkgICAgc3RydWN0IGF1X25k
eCAqbmR4KTsKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdV9oX2RlbnRyeV9pbml0KHN0
cnVjdCBhdV9oZGVudHJ5ICpoZGVudHJ5KQoreworCWF1X2RvX2hfZGVudHJ5X2luaXQoaGRlbnRy
eSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdV9oX2RlbnRyeV9pbml0X2FsbChzdHJ1Y3Qg
YXVfaGRlbnRyeSAqaGRlbnRyeSwgaW50IG4pCit7CisJLyogbm90aGluZyAqLworfQorCitzdGF0
aWMgaW5saW5lCitzdHJ1Y3QgZmlsZSAqYXVfaF9pbnRlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5
LCBhdWZzX2JpbmRleF90IGJpbmRleCwKKwkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvL3Jl
dHVybiBFUlJfUFRSKC1FTk9TWVMpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5l
CitpbnQgYXVfYnJfbmZzX2hfaW50ZW50KHN0cnVjdCBmaWxlICpuZF9maWxlLCBzdHJ1Y3QgZGVu
dHJ5ICpkZW50cnksCisJCSAgICAgICBhdWZzX2JpbmRleF90IGJpbmRleCwgc3RydWN0IG5hbWVp
ZGF0YSAqbmQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdV9oaW50
ZW50X3B1dChzdHJ1Y3QgYXVfaGRlbnRyeSAqaGQsIGludCBkb19mcmVlKQoreworCS8qIGVtcHR5
ICovCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF1X2Zha2VfaW50ZW50KHN0cnVjdCBuYW1laWRh
dGEgKm5kLCBpbnQgcGVybSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZQoraW50
IGF1X2hpbl9hZnRlcl9yZXZhbChzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgc3RydWN0IGRlbnRyeSAq
ZGVudHJ5LAorCQkgICAgICAgYXVmc19iaW5kZXhfdCBiaW5kZXgsIHN0cnVjdCBmaWxlICpmaWxl
KQoreworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0FVRlNfRExHVAorc3RhdGljIGlu
bGluZQorc3RydWN0IGRlbnRyeSAqYXVfbGt1cF9oYXNoKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVj
dCBkZW50cnkgKnBhcmVudCwgaW50IGxlbiwKKwkJCSAgICBzdHJ1Y3QgYXVfbmR4ICpuZHgpCit7
CisJLy9yZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKKwlyZXR1cm4gdmZzdWJfbG9va3VwX29uZV9s
ZW4obmFtZSwgcGFyZW50LCBsZW4pOworfQorI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0FVRlNf
QlJfTkZTICovCisKKyNpZmRlZiBDT05GSUdfQVVGU19ETEdUCisvKiBkbGd0LmMgKi8KK3N0cnVj
dCBkZW50cnkgKmF1X2xrdXBfb25lX2RsZ3QoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRlbnRy
eSAqcGFyZW50LAorCQkJCWludCBsZW4sIHVuc2lnbmVkIGludCBmbGFncyk7CisjZWxpZiBkZWZp
bmVkKENPTkZJR19BVUZTX0JSX05GUykKKy8qIHJlZ2FyZGVsc3Mga2VybmVsIHZlcnNpb24gKi8K
K3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBkZW50cnkgKmF1X2xrdXBfb25lX2RsZ3QoY29uc3QgY2hh
ciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJCWludCBsZW4sIHVuc2lnbmVkIGlu
dCBmbGFncykKK3sKKwlyZXR1cm4gdmZzdWJfbG9va3VwX29uZV9sZW4obmFtZSwgcGFyZW50LCBs
ZW4pOworfQorI2VuZGlmCisKKy8qIGRlbnRyeS5jICovCitleHRlcm4gc3RydWN0IGRlbnRyeV9v
cGVyYXRpb25zIGF1ZnNfZG9wOworI2lmIGRlZmluZWQoQ09ORklHX0FVRlNfQlJfTkZTKSB8fCBk
ZWZpbmVkKENPTkZJR19BVUZTX0RMR1QpCitzdHJ1Y3QgZGVudHJ5ICphdV9sa3VwX29uZShjb25z
dCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGludCBsZW4sCisJCQkgICBzdHJ1
Y3QgYXVfbmR4ICpuZHgpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBkZW50cnkgKmF1
X2xrdXBfb25lKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgaW50IGxl
biwKKwkJCSAgIHN0cnVjdCBhdV9uZHggKm5keCkKK3sKKwkvL3RvZG86IG5keC0+bmRfZmlsZSA9
IE5VTEw7CisJcmV0dXJuIHZmc3ViX2xvb2t1cF9vbmVfbGVuKG5hbWUsIHBhcmVudCwgbGVuKTsK
K30KKyNlbmRpZgorc3RydWN0IGRlbnRyeSAqYXVfc2lvX2xrdXBfb25lKGNvbnN0IGNoYXIgKm5h
bWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgaW50IGxlbiwKKwkJCSAgICAgICBzdHJ1Y3QgYXVf
bmR4ICpuZHgpOworaW50IGF1X2xrdXBfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVm
c19iaW5kZXhfdCBic3RhcnQsIG1vZGVfdCB0eXBlLAorCQkgICBzdHJ1Y3QgbmFtZWlkYXRhICpu
ZCk7CitpbnQgYXVfbGt1cF9uZWcoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBhdWZzX2JpbmRleF90
IGJpbmRleCk7CitpbnQgYXVfcmVmcmVzaF9oZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwg
bW9kZV90IHR5cGUpOworaW50IGF1X3JldmFsX2RwYXRoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwg
YXVfZ2VuX3Qgc2dlbik7CisKKy8qIGRpbmZvLmMgKi8KK2ludCBhdV9hbGxvY19kaW5mbyhzdHJ1
Y3QgZGVudHJ5ICpkZW50cnkpOworc3RydWN0IGF1X2RpbmZvICphdV9kaShzdHJ1Y3QgZGVudHJ5
ICpkZW50cnkpOworCit2b2lkIGRpX3JlYWRfbG9jayhzdHJ1Y3QgZGVudHJ5ICpkLCBpbnQgZmxh
Z3MsIHVuc2lnbmVkIGludCBsc2MpOwordm9pZCBkaV9yZWFkX3VubG9jayhzdHJ1Y3QgZGVudHJ5
ICpkLCBpbnQgZmxhZ3MpOwordm9pZCBkaV9kb3duZ3JhZGVfbG9jayhzdHJ1Y3QgZGVudHJ5ICpk
LCBpbnQgZmxhZ3MpOwordm9pZCBkaV93cml0ZV9sb2NrKHN0cnVjdCBkZW50cnkgKmQsIHVuc2ln
bmVkIGludCBsc2MpOwordm9pZCBkaV93cml0ZV91bmxvY2soc3RydWN0IGRlbnRyeSAqZCk7Cit2
b2lkIGRpX3dyaXRlX2xvY2syX2NoaWxkKHN0cnVjdCBkZW50cnkgKmQxLCBzdHJ1Y3QgZGVudHJ5
ICpkMiwgaW50IGlzZGlyKTsKK3ZvaWQgZGlfd3JpdGVfbG9jazJfcGFyZW50KHN0cnVjdCBkZW50
cnkgKmQxLCBzdHJ1Y3QgZGVudHJ5ICpkMiwgaW50IGlzZGlyKTsKK3ZvaWQgZGlfd3JpdGVfdW5s
b2NrMihzdHJ1Y3QgZGVudHJ5ICpkMSwgc3RydWN0IGRlbnRyeSAqZDIpOworCitzdHJ1Y3QgZGVu
dHJ5ICphdV9oX2RwdHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBhdWZzX2JpbmRleF90IGJpbmRl
eCk7CisKK2F1ZnNfYmluZGV4X3QgYXVfZGJ0YWlsKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7Cith
dWZzX2JpbmRleF90IGF1X2RidGFpbGRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworCit2b2lk
IGF1X3NldF9kYmRpcm9wcShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmlu
ZGV4KTsKK3ZvaWQgYXVfc2V0X2hfZHB0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmlu
ZGV4X3QgYmluZGV4LAorCQkgICBzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeSk7CisKK3ZvaWQgYXVf
dXBkYXRlX2RicmFuZ2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZG9fcHV0X3plcm8pOwor
dm9pZCBhdV91cGRhdGVfZGJzdGFydChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwordm9pZCBhdV91
cGRhdGVfZGJlbmQoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK2ludCBhdV9maW5kX2RiaW5kZXgo
c3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeSk7CisKKy8qIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KKworLy90b2RvOiBtZW1vcnkgYmFycmllcj8KK3N0YXRpYyBpbmxpbmUg
YXVfZ2VuX3QgYXVfZGlnZW4oc3RydWN0IGRlbnRyeSAqZCkKK3sKKwlyZXR1cm4gYXRvbWljX3Jl
YWQoJmF1X2RpKGQpLT5kaV9nZW5lcmF0aW9uKTsKK30KKworI2lmZGVmIENPTkZJR19BVUZTX0hJ
Tk9USUZZCitzdGF0aWMgaW5saW5lIGF1X2dlbl90IGF1X2RpZ2VuX2RlYyhzdHJ1Y3QgZGVudHJ5
ICpkKQoreworCXJldHVybiBhdG9taWNfZGVjX3JldHVybigmYXVfZGkoZCktPmRpX2dlbmVyYXRp
b24pOworfQorI2VuZGlmIC8qIENPTkZJR19BVUZTX0hJTk9USUZZICovCisKKy8qIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gKi8KKworLyogbG9jayBzdWJjbGFzcyBmb3IgZGluZm8gKi8KK2VudW0geworCUF1THNj
X0RJX0NISUxELAkJLyogY2hpbGQgZmlyc3QgKi8KKwlBdUxzY19ESV9DSElMRDIsCS8qIHJlbmFt
ZSgyKSwgbGluaygyKSwgYW5kIGNwdXAgYXQgaGlub3RpZnkgKi8KKwlBdUxzY19ESV9DSElMRDMs
CS8qIGNvcHl1cCBkaXJzICovCisJQXVMc2NfRElfUEFSRU5ULAorCUF1THNjX0RJX1BBUkVOVDIs
CisJQXVMc2NfRElfUEFSRU5UMworfTsKKworLyoKKyAqIGRpX3JlYWRfbG9ja19jaGlsZCwgZGlf
d3JpdGVfbG9ja19jaGlsZCwKKyAqIGRpX3JlYWRfbG9ja19jaGlsZDIsIGRpX3dyaXRlX2xvY2tf
Y2hpbGQyLAorICogZGlfcmVhZF9sb2NrX2NoaWxkMywgZGlfd3JpdGVfbG9ja19jaGlsZDMsCisg
KiBkaV9yZWFkX2xvY2tfcGFyZW50LCBkaV93cml0ZV9sb2NrX3BhcmVudCwKKyAqIGRpX3JlYWRf
bG9ja19wYXJlbnQyLCBkaV93cml0ZV9sb2NrX3BhcmVudDIsCisgKiBkaV9yZWFkX2xvY2tfcGFy
ZW50MywgZGlfd3JpdGVfbG9ja19wYXJlbnQzLAorICovCisjZGVmaW5lIEF1UmVhZExvY2tGdW5j
KG5hbWUsIGxzYykgXAorc3RhdGljIGlubGluZSB2b2lkIGRpX3JlYWRfbG9ja18jI25hbWUoc3Ry
dWN0IGRlbnRyeSAqZCwgaW50IGZsYWdzKSBcCit7IGRpX3JlYWRfbG9jayhkLCBmbGFncywgQXVM
c2NfRElfIyNsc2MpOyB9CisKKyNkZWZpbmUgQXVXcml0ZUxvY2tGdW5jKG5hbWUsIGxzYykgXAor
c3RhdGljIGlubGluZSB2b2lkIGRpX3dyaXRlX2xvY2tfIyNuYW1lKHN0cnVjdCBkZW50cnkgKmQp
IFwKK3sgZGlfd3JpdGVfbG9jayhkLCBBdUxzY19ESV8jI2xzYyk7IH0KKworI2RlZmluZSBBdVJX
TG9ja0Z1bmNzKG5hbWUsIGxzYykgXAorCUF1UmVhZExvY2tGdW5jKG5hbWUsIGxzYykgXAorCUF1
V3JpdGVMb2NrRnVuYyhuYW1lLCBsc2MpCisKK0F1UldMb2NrRnVuY3MoY2hpbGQsIENISUxEKTsK
K0F1UldMb2NrRnVuY3MoY2hpbGQyLCBDSElMRDIpOworQXVSV0xvY2tGdW5jcyhjaGlsZDMsIENI
SUxEMyk7CitBdVJXTG9ja0Z1bmNzKHBhcmVudCwgUEFSRU5UKTsKK0F1UldMb2NrRnVuY3MocGFy
ZW50MiwgUEFSRU5UMik7CitBdVJXTG9ja0Z1bmNzKHBhcmVudDMsIFBBUkVOVDMpOworCisjdW5k
ZWYgQXVSZWFkTG9ja0Z1bmMKKyN1bmRlZiBBdVdyaXRlTG9ja0Z1bmMKKyN1bmRlZiBBdVJXTG9j
a0Z1bmNzCisKKy8qIHRvIGRlYnVnIGVhc2llciwgZG8gbm90IG1ha2UgdGhlbSBpbmxpbmVkIGZ1
bmN0aW9ucyAqLworI2RlZmluZSBEaU11c3RSZWFkTG9jayhkKSBkbyB7IFwKKwlTaU11c3RBbnlM
b2NrKChkKS0+ZF9zYik7IFwKKwlBdVJ3TXVzdFJlYWRMb2NrKCZhdV9kaShkKS0+ZGlfcndzZW0p
OyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERpTXVzdFdyaXRlTG9jayhkKSBkbyB7IFwKKwlT
aU11c3RBbnlMb2NrKChkKS0+ZF9zYik7IFwKKwlBdVJ3TXVzdFdyaXRlTG9jaygmYXVfZGkoZCkt
PmRpX3J3c2VtKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEaU11c3RBbnlMb2NrKGQpIGRv
IHsgXAorCVNpTXVzdEFueUxvY2soKGQpLT5kX3NiKTsgXAorCUF1UndNdXN0QW55TG9jaygmYXVf
ZGkoZCktPmRpX3J3c2VtKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEaU11c3ROb1dhaXRl
cnMoZCkJQXVSd011c3ROb1dhaXRlcnMoJmF1X2RpKGQpLT5kaV9yd3NlbSkKKworLyogLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIGF1ZnNfYmluZGV4X3QgYXVfZGJzdGFydChzdHJ1
Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJRGlNdXN0QW55TG9jayhkZW50cnkpOworCXJldHVybiBh
dV9kaShkZW50cnkpLT5kaV9ic3RhcnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYXVmc19iaW5kZXhf
dCBhdV9kYmVuZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJRGlNdXN0QW55TG9jayhkZW50
cnkpOworCXJldHVybiBhdV9kaShkZW50cnkpLT5kaV9iZW5kOworfQorCitzdGF0aWMgaW5saW5l
IGF1ZnNfYmluZGV4X3QgYXVfZGJ3aChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJRGlNdXN0
QW55TG9jayhkZW50cnkpOworCXJldHVybiBhdV9kaShkZW50cnkpLT5kaV9id2g7Cit9CisKK3N0
YXRpYyBpbmxpbmUgYXVmc19iaW5kZXhfdCBhdV9kYmRpcm9wcShzdHJ1Y3QgZGVudHJ5ICpkZW50
cnkpCit7CisJRGlNdXN0QW55TG9jayhkZW50cnkpOworCUF1RGVidWdPbihkZW50cnktPmRfaW5v
ZGUKKwkJICAmJiBkZW50cnktPmRfaW5vZGUtPmlfbW9kZQorCQkgICYmICFTX0lTRElSKGRlbnRy
eS0+ZF9pbm9kZS0+aV9tb2RlKSk7CisJcmV0dXJuIGF1X2RpKGRlbnRyeSktPmRpX2JkaXJvcHE7
Cit9CisKKy8vIGhhcmQvc29mdCBzZXQKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdV9zZXRfZGJzdGFy
dChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmluZGV4KQoreworCURpTXVz
dFdyaXRlTG9jayhkZW50cnkpOworCUF1RGVidWdPbihhdV9zYmVuZChkZW50cnktPmRfc2IpIDwg
YmluZGV4KTsKKwkvKiAqLworCWF1X2RpKGRlbnRyeSktPmRpX2JzdGFydCA9IGJpbmRleDsKK30K
Kworc3RhdGljIGlubGluZSB2b2lkIGF1X3NldF9kYmVuZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnks
IGF1ZnNfYmluZGV4X3QgYmluZGV4KQoreworCURpTXVzdFdyaXRlTG9jayhkZW50cnkpOworCUF1
RGVidWdPbihhdV9zYmVuZChkZW50cnktPmRfc2IpIDwgYmluZGV4CisJCSAgfHwgYmluZGV4IDwg
YXVfZGJzdGFydChkZW50cnkpKTsKKwlhdV9kaShkZW50cnkpLT5kaV9iZW5kID0gYmluZGV4Owor
fQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXVfc2V0X2Rid2goc3RydWN0IGRlbnRyeSAqZGVudHJ5
LCBhdWZzX2JpbmRleF90IGJpbmRleCkKK3sKKwlEaU11c3RXcml0ZUxvY2soZGVudHJ5KTsKKwlB
dURlYnVnT24oYXVfc2JlbmQoZGVudHJ5LT5kX3NiKSA8IGJpbmRleCk7CisJLyogZGJ3aCBjYW4g
YmUgb3V0c2lkZSBvZiBic3RhcnQgLSBiZW5kIHJhbmdlICovCisJYXVfZGkoZGVudHJ5KS0+ZGlf
YndoID0gYmluZGV4OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXVfaGRwdXQoc3RydWN0IGF1
X2hkZW50cnkgKmhkLCBpbnQgZG9fZnJlZSkKK3sKKwlhdV9oaW50ZW50X3B1dChoZCwgZG9fZnJl
ZSk7CisJZHB1dChoZC0+aGRfZGVudHJ5KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF1X3Vw
ZGF0ZV9kaWdlbihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJLy9EaU11c3RXcml0ZUxvY2so
ZGVudHJ5KTsKKwlBdURlYnVnT24oIWRlbnRyeS0+ZF9zYik7CisJYXRvbWljX3NldCgmYXVfZGko
ZGVudHJ5KS0+ZGlfZ2VuZXJhdGlvbiwgYXVfc2lnZW4oZGVudHJ5LT5kX3NiKSk7CisJLy9zbXBf
bWIoKTsgLyogYXRvbWljX3NldCAqLworfQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2Vu
ZGlmIC8qIF9fQVVGU19ERU5UUllfSF9fICovCmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11bmlv
bmZzLm9yaWcvZnMvYXVmcy9kaW5mby5jIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9k
aW5mby5jCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9kaW5mby5jCTE5
NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVm
cy9kaW5mby5jCTIwMDgtMDUtMjUgMTE6NTY6MDggKzAzMDAKQEAgLTAsMCArMSw0MTIgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAqCisgKiBUaGlz
IHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBv
cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRv
IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwg
RmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qCisgKiBk
ZW50cnkgcHJpdmF0ZSBkYXRhCisgKgorICogJElkOiBkaW5mby5jLHYgMS4zIDIwMDgvMDQvMjgg
MDM6MDQ6MjMgc2Zqcm8gRXhwICQKKyAqLworCisjaW5jbHVkZSAiYXVmcy5oIgorCitpbnQgYXVf
YWxsb2NfZGluZm8oc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBhdV9kaW5mbyAq
ZGluZm87CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlpbnQgbmJyOworCisJTEtUUlRyYWNl
KCIlLipzXG4iLCBBdURMTlBhaXIoZGVudHJ5KSk7CisJQXVEZWJ1Z09uKGRlbnRyeS0+ZF9mc2Rh
dGEpOworCisJZGluZm8gPSBhdV9jYWNoZV9hbGxvY19kaW5mbygpOworCS8vaWYgKExrdHJDb25k
KSB7YXVfY2FjaGVfZnJlZV9kaW5mbyhkaW5mbyk7IGRpbmZvID0gTlVMTDt9CisJaWYgKGRpbmZv
KSB7CisJCXNiID0gZGVudHJ5LT5kX3NiOworCQluYnIgPSBhdV9zYmVuZChzYikgKyAxOworCQlp
ZiAodW5saWtlbHkobmJyIDw9IDApKQorCQkJbmJyID0gMTsKKwkJZGluZm8tPmRpX2hkZW50cnkg
PSBrY2FsbG9jKG5iciwgc2l6ZW9mKCpkaW5mby0+ZGlfaGRlbnRyeSksCisJCQkJCSAgICBHRlBf
S0VSTkVMKTsKKwkJLy9pZiAoTGt0ckNvbmQpCisJCS8ve2tmcmVlKGRpbmZvLT5kaV9oZGVudHJ5
KTsgZGluZm8tPmRpX2hkZW50cnkgPSBOVUxMO30KKwkJaWYgKGRpbmZvLT5kaV9oZGVudHJ5KSB7
CisJCQlhdV9oX2RlbnRyeV9pbml0X2FsbChkaW5mby0+ZGlfaGRlbnRyeSwgbmJyKTsKKwkJCWF0
b21pY19zZXQoJmRpbmZvLT5kaV9nZW5lcmF0aW9uLCBhdV9zaWdlbihzYikpOworCQkJLy9zbXBf
bWIoKTsgLyogYXRvbWljX3NldCAqLworCQkJYXVfcndfaW5pdF93bG9ja19uZXN0ZWQoJmRpbmZv
LT5kaV9yd3NlbSwKKwkJCQkJCUF1THNjX0RJX1BBUkVOVCk7CisJCQlkaW5mby0+ZGlfYnN0YXJ0
ID0gLTE7CisJCQlkaW5mby0+ZGlfYmVuZCA9IC0xOworCQkJZGluZm8tPmRpX2J3aCA9IC0xOwor
CQkJZGluZm8tPmRpX2JkaXJvcHEgPSAtMTsKKworCQkJZGVudHJ5LT5kX2ZzZGF0YSA9IGRpbmZv
OworCQkJZGVudHJ5LT5kX29wID0gJmF1ZnNfZG9wOworCQkJcmV0dXJuIDA7IC8qIHN1Y2Nlc3Mg
Ki8KKwkJfQorCQlhdV9jYWNoZV9mcmVlX2RpbmZvKGRpbmZvKTsKKwl9CisJQXVUcmFjZUVycigt
RU5PTUVNKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RydWN0IGF1X2RpbmZvICphdV9kaShz
dHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGF1X2RpbmZvICpkaW5mbyA9IGRlbnRy
eS0+ZF9mc2RhdGE7CisJQXVEZWJ1Z09uKCFkaW5mbworCQkgfHwgIWRpbmZvLT5kaV9oZGVudHJ5
CisJCSAvKiB8fCBhdV9zYmkoZGVudHJ5LT5kX3NiKS0+c2lfYmVuZCA8IGRpbmZvLT5kaV9iZW5k
ICovCisJCSB8fCBkaW5mby0+ZGlfYmVuZCA8IGRpbmZvLT5kaV9ic3RhcnQKKwkJIC8qIGRid2gg
Y2FuIGJlIG91dHNpZGUgb2YgdGhpcyByYW5nZSAqLworCQkgfHwgKDAgPD0gZGluZm8tPmRpX2Jk
aXJvcHEKKwkJICAgICAmJiAoZGluZm8tPmRpX2JkaXJvcHEgPCBkaW5mby0+ZGlfYnN0YXJ0CisJ
CQkgLyogfHwgZGluZm8tPmRpX2JlbmQgPCBkaW5mby0+ZGlfYmRpcm9wcSAqLykpCisJCSk7CisJ
cmV0dXJuIGRpbmZvOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGRv
X2lpX3dyaXRlX2xvY2soc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGxzYykKK3sK
Kwlzd2l0Y2ggKGxzYykgeworCWNhc2UgQXVMc2NfRElfQ0hJTEQ6CisJCWlpX3dyaXRlX2xvY2tf
Y2hpbGQoaW5vZGUpOworCQlicmVhazsKKwljYXNlIEF1THNjX0RJX0NISUxEMjoKKwkJaWlfd3Jp
dGVfbG9ja19jaGlsZDIoaW5vZGUpOworCQlicmVhazsKKwljYXNlIEF1THNjX0RJX0NISUxEMzoK
KwkJaWlfd3JpdGVfbG9ja19jaGlsZDMoaW5vZGUpOworCQlicmVhazsKKwljYXNlIEF1THNjX0RJ
X1BBUkVOVDoKKwkJLy9BdURlYnVnT24oIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpOworCQlpaV93
cml0ZV9sb2NrX3BhcmVudChpbm9kZSk7CisJCWJyZWFrOworCWNhc2UgQXVMc2NfRElfUEFSRU5U
MjoKKwkJLy9BdURlYnVnT24oIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpOworCQlpaV93cml0ZV9s
b2NrX3BhcmVudDIoaW5vZGUpOworCQlicmVhazsKKwljYXNlIEF1THNjX0RJX1BBUkVOVDM6CisJ
CS8vQXVEZWJ1Z09uKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKTsKKwkJaWlfd3JpdGVfbG9ja19w
YXJlbnQzKGlub2RlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitz
dGF0aWMgdm9pZCBkb19paV9yZWFkX2xvY2soc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQg
aW50IGxzYykKK3sKKwlzd2l0Y2ggKGxzYykgeworCWNhc2UgQXVMc2NfRElfQ0hJTEQ6CisJCWlp
X3JlYWRfbG9ja19jaGlsZChpbm9kZSk7CisJCWJyZWFrOworCWNhc2UgQXVMc2NfRElfQ0hJTEQy
OgorCQlpaV9yZWFkX2xvY2tfY2hpbGQyKGlub2RlKTsKKwkJYnJlYWs7CisJY2FzZSBBdUxzY19E
SV9DSElMRDM6CisJCWlpX3JlYWRfbG9ja19jaGlsZDMoaW5vZGUpOworCQlicmVhazsKKwljYXNl
IEF1THNjX0RJX1BBUkVOVDoKKwkJLy9BdURlYnVnT24oIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkp
OworCQlpaV9yZWFkX2xvY2tfcGFyZW50KGlub2RlKTsKKwkJYnJlYWs7CisJY2FzZSBBdUxzY19E
SV9QQVJFTlQyOgorCQkvL0F1RGVidWdPbighU19JU0RJUihpbm9kZS0+aV9tb2RlKSk7CisJCWlp
X3JlYWRfbG9ja19wYXJlbnQyKGlub2RlKTsKKwkJYnJlYWs7CisJY2FzZSBBdUxzY19ESV9QQVJF
TlQzOgorCQkvL0F1RGVidWdPbighU19JU0RJUihpbm9kZS0+aV9tb2RlKSk7CisJCWlpX3JlYWRf
bG9ja19wYXJlbnQzKGlub2RlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQor
fQorCit2b2lkIGRpX3JlYWRfbG9jayhzdHJ1Y3QgZGVudHJ5ICpkLCBpbnQgZmxhZ3MsIHVuc2ln
bmVkIGludCBsc2MpCit7CisJU2lNdXN0QW55TG9jayhkLT5kX3NiKTsKKwkvLyB0b2RvOiBhbHdh
eXMgbmVzdGVkPworCWF1X3J3X3JlYWRfbG9ja19uZXN0ZWQoJmF1X2RpKGQpLT5kaV9yd3NlbSwg
bHNjKTsKKwlpZiAoZC0+ZF9pbm9kZSkgeworCQlpZiAoYXVfZnRlc3RfbG9jayhmbGFncywgSVcp
KQorCQkJZG9faWlfd3JpdGVfbG9jayhkLT5kX2lub2RlLCBsc2MpOworCQllbHNlIGlmIChhdV9m
dGVzdF9sb2NrKGZsYWdzLCBJUikpCisJCQlkb19paV9yZWFkX2xvY2soZC0+ZF9pbm9kZSwgbHNj
KTsKKwl9Cit9CisKK3ZvaWQgZGlfcmVhZF91bmxvY2soc3RydWN0IGRlbnRyeSAqZCwgaW50IGZs
YWdzKQoreworCVNpTXVzdEFueUxvY2soZC0+ZF9zYik7CisJaWYgKGQtPmRfaW5vZGUpIHsKKwkJ
aWYgKGF1X2Z0ZXN0X2xvY2soZmxhZ3MsIElXKSkKKwkJCWlpX3dyaXRlX3VubG9jayhkLT5kX2lu
b2RlKTsKKwkJZWxzZSBpZiAoYXVfZnRlc3RfbG9jayhmbGFncywgSVIpKQorCQkJaWlfcmVhZF91
bmxvY2soZC0+ZF9pbm9kZSk7CisJfQorCWF1X3J3X3JlYWRfdW5sb2NrKCZhdV9kaShkKS0+ZGlf
cndzZW0pOworfQorCit2b2lkIGRpX2Rvd25ncmFkZV9sb2NrKHN0cnVjdCBkZW50cnkgKmQsIGlu
dCBmbGFncykKK3sKKwlTaU11c3RBbnlMb2NrKGQtPmRfc2IpOworCWF1X3J3X2RncmFkZV9sb2Nr
KCZhdV9kaShkKS0+ZGlfcndzZW0pOworCWlmIChkLT5kX2lub2RlICYmIGF1X2Z0ZXN0X2xvY2so
ZmxhZ3MsIElSKSkKKwkJaWlfZG93bmdyYWRlX2xvY2soZC0+ZF9pbm9kZSk7Cit9CisKK3ZvaWQg
ZGlfd3JpdGVfbG9jayhzdHJ1Y3QgZGVudHJ5ICpkLCB1bnNpZ25lZCBpbnQgbHNjKQoreworCVNp
TXVzdEFueUxvY2soZC0+ZF9zYik7CisJLy8gdG9kbzogYWx3YXlzIG5lc3RlZD8KKwlhdV9yd193
cml0ZV9sb2NrX25lc3RlZCgmYXVfZGkoZCktPmRpX3J3c2VtLCBsc2MpOworCWlmIChkLT5kX2lu
b2RlKQorCQlkb19paV93cml0ZV9sb2NrKGQtPmRfaW5vZGUsIGxzYyk7Cit9CisKK3ZvaWQgZGlf
d3JpdGVfdW5sb2NrKHN0cnVjdCBkZW50cnkgKmQpCit7CisJU2lNdXN0QW55TG9jayhkLT5kX3Ni
KTsKKwlpZiAoZC0+ZF9pbm9kZSkKKwkJaWlfd3JpdGVfdW5sb2NrKGQtPmRfaW5vZGUpOworCWF1
X3J3X3dyaXRlX3VubG9jaygmYXVfZGkoZCktPmRpX3J3c2VtKTsKK30KKwordm9pZCBkaV93cml0
ZV9sb2NrMl9jaGlsZChzdHJ1Y3QgZGVudHJ5ICpkMSwgc3RydWN0IGRlbnRyeSAqZDIsIGludCBp
c2RpcikKK3sKKwlBdVRyYWNlRW50ZXIoKTsKKwlBdURlYnVnT24oZDEgPT0gZDIKKwkJICB8fCBk
MS0+ZF9pbm9kZSA9PSBkMi0+ZF9pbm9kZQorCQkgIHx8IGQxLT5kX3NiICE9IGQyLT5kX3NiKTsK
KworCWlmIChpc2RpciAmJiBhdV90ZXN0X3N1YmRpcihkMSwgZDIpKSB7CisJCWRpX3dyaXRlX2xv
Y2tfY2hpbGQoZDEpOworCQlkaV93cml0ZV9sb2NrX2NoaWxkMihkMik7CisJfSBlbHNlIHsKKwkJ
LyogdGhlcmUgc2hvdWxkIGJlIG5vIHJhY2VzICovCisJCWRpX3dyaXRlX2xvY2tfY2hpbGQoZDIp
OworCQlkaV93cml0ZV9sb2NrX2NoaWxkMihkMSk7CisJfQorfQorCit2b2lkIGRpX3dyaXRlX2xv
Y2syX3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkMSwgc3RydWN0IGRlbnRyeSAqZDIsIGludCBpc2Rp
cikKK3sKKwlBdVRyYWNlRW50ZXIoKTsKKwlBdURlYnVnT24oZDEgPT0gZDIKKwkJICB8fCBkMS0+
ZF9pbm9kZSA9PSBkMi0+ZF9pbm9kZQorCQkgIHx8IGQxLT5kX3NiICE9IGQyLT5kX3NiKTsKKwor
CWlmIChpc2RpciAmJiBhdV90ZXN0X3N1YmRpcihkMSwgZDIpKSB7CisJCWRpX3dyaXRlX2xvY2tf
cGFyZW50KGQxKTsKKwkJZGlfd3JpdGVfbG9ja19wYXJlbnQyKGQyKTsKKwl9IGVsc2UgeworCQkv
KiB0aGVyZSBzaG91bGQgYmUgbm8gcmFjZXMgKi8KKwkJZGlfd3JpdGVfbG9ja19wYXJlbnQoZDIp
OworCQlkaV93cml0ZV9sb2NrX3BhcmVudDIoZDEpOworCX0KK30KKwordm9pZCBkaV93cml0ZV91
bmxvY2syKHN0cnVjdCBkZW50cnkgKmQxLCBzdHJ1Y3QgZGVudHJ5ICpkMikKK3sKKwlkaV93cml0
ZV91bmxvY2soZDEpOworCWlmIChkMS0+ZF9pbm9kZSA9PSBkMi0+ZF9pbm9kZSkKKwkJYXVfcndf
d3JpdGVfdW5sb2NrKCZhdV9kaShkMiktPmRpX3J3c2VtKTsKKwllbHNlCisJCWRpX3dyaXRlX3Vu
bG9jayhkMik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGRlbnRyeSAqYXVf
aF9kcHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBiaW5kZXgpCit7CisJ
c3RydWN0IGRlbnRyeSAqZDsKKworCURpTXVzdEFueUxvY2soZGVudHJ5KTsKKwlpZiAoYXVfZGJz
dGFydChkZW50cnkpIDwgMCB8fCBiaW5kZXggPCBhdV9kYnN0YXJ0KGRlbnRyeSkpCisJCXJldHVy
biBOVUxMOworCUF1RGVidWdPbihiaW5kZXggPCAwCisJCSAgLyogfHwgYmluZGV4ID4gYXVfc2Jl
bmQoZGVudHJ5LT5kX3NiKSAqLyk7CisJZCA9IGF1X2RpKGRlbnRyeSktPmRpX2hkZW50cnlbMCAr
IGJpbmRleF0uaGRfZGVudHJ5OworCUF1RGVidWdPbihkICYmIChhdG9taWNfcmVhZCgmZC0+ZF9j
b3VudCkgPD0gMCkpOworCXJldHVybiBkOworfQorCithdWZzX2JpbmRleF90IGF1X2RidGFpbChz
dHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJYXVmc19iaW5kZXhfdCBiZW5kLCBid2g7CisKKwli
ZW5kID0gYXVfZGJlbmQoZGVudHJ5KTsKKwlpZiAoMCA8PSBiZW5kKSB7CisJCWJ3aCA9IGF1X2Ri
d2goZGVudHJ5KTsKKwkJLy9BdURlYnVnT24oYmVuZCA8IGJ3aCk7CisJCWlmICghYndoKQorCQkJ
cmV0dXJuIGJ3aDsKKwkJaWYgKDAgPCBid2ggJiYgYndoIDwgYmVuZCkKKwkJCXJldHVybiBid2gg
LSAxOworCX0KKwlyZXR1cm4gYmVuZDsKK30KKworYXVmc19iaW5kZXhfdCBhdV9kYnRhaWxkaXIo
c3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWF1ZnNfYmluZGV4X3QgYmVuZCwgYm9wcTsKKwor
CUF1RGVidWdPbihkZW50cnktPmRfaW5vZGUKKwkJICAmJiBkZW50cnktPmRfaW5vZGUtPmlfbW9k
ZQorCQkgICYmICFTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSk7CisKKwliZW5kID0g
YXVfZGJ0YWlsKGRlbnRyeSk7CisJaWYgKDAgPD0gYmVuZCkgeworCQlib3BxID0gYXVfZGJkaXJv
cHEoZGVudHJ5KTsKKwkJQXVEZWJ1Z09uKGJlbmQgPCBib3BxKTsKKwkJaWYgKDAgPD0gYm9wcSAm
JiBib3BxIDwgYmVuZCkKKwkJCWJlbmQgPSBib3BxOworCX0KKwlyZXR1cm4gYmVuZDsKK30KKwor
LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGF1X3NldF9kYmRpcm9wcShzdHJ1Y3QgZGVudHJ5
ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmluZGV4KQoreworCURpTXVzdFdyaXRlTG9jayhkZW50
cnkpOworCUF1RGVidWdPbihhdV9zYmVuZChkZW50cnktPmRfc2IpIDwgYmluZGV4KTsKKwlBdURl
YnVnT24oKGJpbmRleCA+PSAwCisJCSAgICYmIChiaW5kZXggPCBhdV9kYnN0YXJ0KGRlbnRyeSkK
KwkJICAgICAgIHx8IGF1X2RiZW5kKGRlbnRyeSkgPCBiaW5kZXgpKQorCQkgIHx8IChkZW50cnkt
PmRfaW5vZGUKKwkJICAgICAgJiYgZGVudHJ5LT5kX2lub2RlLT5pX21vZGUKKwkJICAgICAgJiYg
IVNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSk7CisJYXVfZGkoZGVudHJ5KS0+ZGlf
YmRpcm9wcSA9IGJpbmRleDsKK30KKwordm9pZCBhdV9zZXRfaF9kcHRyKHN0cnVjdCBkZW50cnkg
KmRlbnRyeSwgYXVmc19iaW5kZXhfdCBiaW5kZXgsCisJCSAgIHN0cnVjdCBkZW50cnkgKmhfZGVu
dHJ5KQoreworCXN0cnVjdCBhdV9oZGVudHJ5ICpoZCA9IGF1X2RpKGRlbnRyeSktPmRpX2hkZW50
cnkgKyBiaW5kZXg7CisJRGlNdXN0V3JpdGVMb2NrKGRlbnRyeSk7CisJQXVEZWJ1Z09uKGJpbmRl
eCA8IGF1X2RpKGRlbnRyeSktPmRpX2JzdGFydAorCQkgIHx8IGJpbmRleCA+IGF1X2RpKGRlbnRy
eSktPmRpX2JlbmQKKwkJICB8fCAoaF9kZW50cnkgJiYgYXRvbWljX3JlYWQoJmhfZGVudHJ5LT5k
X2NvdW50KSA8PSAwKQorCQkgIHx8IChoX2RlbnRyeSAmJiBoZC0+aGRfZGVudHJ5KQorCQkpOwor
CWlmIChoZC0+aGRfZGVudHJ5KQorCQlhdV9oZHB1dChoZCwgLypkb19mcmVlKi8wKTsKKwloZC0+
aGRfZGVudHJ5ID0gaF9kZW50cnk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBh
dV91cGRhdGVfZGJyYW5nZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkb19wdXRfemVybykK
K3sKKwlzdHJ1Y3QgYXVfZGluZm8gKmRpbmZvOworCWF1ZnNfYmluZGV4X3QgYmluZGV4OworCXN0
cnVjdCBkZW50cnkgKmhfZDsKKworCUxLVFJUcmFjZSgiJS4qcywgJWRcbiIsIEF1RExOUGFpcihk
ZW50cnkpLCBkb19wdXRfemVybyk7CisJRGlNdXN0V3JpdGVMb2NrKGRlbnRyeSk7CisKKwlkaW5m
byA9IGF1X2RpKGRlbnRyeSk7CisJaWYgKHVubGlrZWx5KCFkaW5mbykgfHwgZGluZm8tPmRpX2Jz
dGFydCA8IDApCisJCXJldHVybjsKKworCWlmIChkb19wdXRfemVybykgeworCQlmb3IgKGJpbmRl
eCA9IGRpbmZvLT5kaV9ic3RhcnQ7IGJpbmRleCA8PSBkaW5mby0+ZGlfYmVuZDsKKwkJICAgICBi
aW5kZXgrKykgeworCQkJaF9kID0gZGluZm8tPmRpX2hkZW50cnlbMCArIGJpbmRleF0uaGRfZGVu
dHJ5OworCQkJaWYgKGhfZCAmJiAhaF9kLT5kX2lub2RlKQorCQkJCWF1X3NldF9oX2RwdHIoZGVu
dHJ5LCBiaW5kZXgsIE5VTEwpOworCQl9CisJfQorCisJZGluZm8tPmRpX2JzdGFydCA9IC0xOwor
CXdoaWxlICgrK2RpbmZvLT5kaV9ic3RhcnQgPD0gZGluZm8tPmRpX2JlbmQpCisJCWlmIChkaW5m
by0+ZGlfaGRlbnRyeVswICsgZGluZm8tPmRpX2JzdGFydF0uaGRfZGVudHJ5KQorCQkJYnJlYWs7
CisJaWYgKGRpbmZvLT5kaV9ic3RhcnQgPiBkaW5mby0+ZGlfYmVuZCkgeworCQlkaW5mby0+ZGlf
YnN0YXJ0ID0gLTE7CisJCWRpbmZvLT5kaV9iZW5kID0gLTE7CisJCXJldHVybjsKKwl9CisKKwlk
aW5mby0+ZGlfYmVuZCsrOworCXdoaWxlICgwIDw9IC0tZGluZm8tPmRpX2JlbmQpCisJCWlmIChk
aW5mby0+ZGlfaGRlbnRyeVswICsgZGluZm8tPmRpX2JlbmRdLmhkX2RlbnRyeSkKKwkJCWJyZWFr
OworCUF1RGVidWdPbihkaW5mby0+ZGlfYnN0YXJ0ID4gZGluZm8tPmRpX2JlbmQgfHwgZGluZm8t
PmRpX2JlbmQgPCAwKTsKK30KKwordm9pZCBhdV91cGRhdGVfZGJzdGFydChzdHJ1Y3QgZGVudHJ5
ICpkZW50cnkpCit7CisJYXVmc19iaW5kZXhfdCBiaW5kZXgsCisJCWJzdGFydCA9IGF1X2Ric3Rh
cnQoZGVudHJ5KSwKKwkJYmVuZCA9IGF1X2RiZW5kKGRlbnRyeSk7CisJc3RydWN0IGRlbnRyeSAq
aF9kZW50cnk7CisKKwlMS1RSVHJhY2UoIiUuKnNcbiIsIEF1RExOUGFpcihkZW50cnkpKTsKKwlE
aU11c3RXcml0ZUxvY2soZGVudHJ5KTsKKworCWZvciAoYmluZGV4ID0gYnN0YXJ0OyBiaW5kZXgg
PD0gYmVuZDsgYmluZGV4KyspIHsKKwkJaF9kZW50cnkgPSBhdV9oX2RwdHIoZGVudHJ5LCBiaW5k
ZXgpOworCQlpZiAoIWhfZGVudHJ5KQorCQkJY29udGludWU7CisJCWlmIChoX2RlbnRyeS0+ZF9p
bm9kZSkgeworCQkJYXVfc2V0X2Ric3RhcnQoZGVudHJ5LCBiaW5kZXgpOworCQkJcmV0dXJuOwor
CQl9CisJCWF1X3NldF9oX2RwdHIoZGVudHJ5LCBiaW5kZXgsIE5VTEwpOworCX0KKwkvL2F1X3Nl
dF9kYnN0YXJ0KGRlbnRyeSwgLTEpOworCS8vYXVfc2V0X2RiZW5kKGRlbnRyeSwgLTEpOworfQor
Cit2b2lkIGF1X3VwZGF0ZV9kYmVuZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJYXVmc19i
aW5kZXhfdCBiaW5kZXgsCisJCWJzdGFydCA9IGF1X2Ric3RhcnQoZGVudHJ5KSwKKwkJYmVuZCA9
IGF1X2RiZW5kKGRlbnRyeSk7CisJc3RydWN0IGRlbnRyeSAqaF9kZW50cnk7CisKKwlEaU11c3RX
cml0ZUxvY2soZGVudHJ5KTsKKwlmb3IgKGJpbmRleCA9IGJlbmQ7IGJpbmRleCA8PSBic3RhcnQ7
IGJpbmRleC0tKSB7CisJCWhfZGVudHJ5ID0gYXVfaF9kcHRyKGRlbnRyeSwgYmluZGV4KTsKKwkJ
aWYgKCFoX2RlbnRyeSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaF9kZW50cnktPmRfaW5vZGUpIHsK
KwkJCWF1X3NldF9kYmVuZChkZW50cnksIGJpbmRleCk7CisJCQlyZXR1cm47CisJCX0KKwkJYXVf
c2V0X2hfZHB0cihkZW50cnksIGJpbmRleCwgTlVMTCk7CisJfQorCS8vYXVfc2V0X2Ric3RhcnQo
ZGVudHJ5LCAtMSk7CisJLy9hdV9zZXRfZGJlbmQoZGVudHJ5LCAtMSk7Cit9CisKK2ludCBhdV9m
aW5kX2RiaW5kZXgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRy
eSkKK3sKKwlhdWZzX2JpbmRleF90IGJpbmRleCwgYmVuZDsKKworCWJlbmQgPSBhdV9kYmVuZChk
ZW50cnkpOworCWZvciAoYmluZGV4ID0gYXVfZGJzdGFydChkZW50cnkpOyBiaW5kZXggPD0gYmVu
ZDsgYmluZGV4KyspCisJCWlmIChhdV9oX2RwdHIoZGVudHJ5LCBiaW5kZXgpID09IGhfZGVudHJ5
KQorCQkJcmV0dXJuIGJpbmRleDsKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLXVyTiBsaW51eC0yLjYu
MjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9kaXIuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2Zz
L2F1ZnMvZGlyLmMKLS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL2Rpci5j
CTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMv
YXVmcy9kaXIuYwkyMDA4LTA1LTI1IDExOjU4OjUzICswMzAwCkBAIC0wLDAgKzEsNTUzIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhp
cyBwcm9ncmFtLCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0
byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Qs
IEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICog
ZGlyZWN0b3J5IG9wZXJhdGlvbnMKKyAqCisgKiAkSWQ6IGRpci5jLHYgMS40IDIwMDgvMDUvMTIg
MDA6Mjc6NTggc2Zqcm8gRXhwICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnNfc3RhY2suaD4K
KyNpbmNsdWRlICJhdWZzLmgiCisKK3N0YXRpYyBpbnQgcmVvcGVuX2RpcihzdHJ1Y3QgZmlsZSAq
ZmlsZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgKmhfZGVudHJ5Owor
CWF1ZnNfYmluZGV4X3QgYmluZGV4LCBidGFpbCwgYnN0YXJ0OworCXN0cnVjdCBmaWxlICpoX2Zp
bGU7CisKKwlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlMS1RSVHJhY2UoIiUuKnNcbiIsIEF1
RExOUGFpcihkZW50cnkpKTsKKwlBdURlYnVnT24oIVNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5p
X21vZGUpKTsKKworCS8qIG9wZW4gYWxsIGhpZGRlbiBkaXJzICovCisJYnN0YXJ0ID0gYXVfZGJz
dGFydChkZW50cnkpOworCWZvciAoYmluZGV4ID0gYXVfZmJzdGFydChmaWxlKTsgYmluZGV4IDwg
YnN0YXJ0OyBiaW5kZXgrKykKKwkJYXVfc2V0X2hfZnB0cihmaWxlLCBiaW5kZXgsIE5VTEwpOwor
CWF1X3NldF9mYnN0YXJ0KGZpbGUsIGJzdGFydCk7CisJYnRhaWwgPSBhdV9kYnRhaWxkaXIoZGVu
dHJ5KTsKKwlmb3IgKGJpbmRleCA9IGF1X2ZiZW5kKGZpbGUpOyBidGFpbCA8IGJpbmRleDsgYmlu
ZGV4LS0pCisJCWF1X3NldF9oX2ZwdHIoZmlsZSwgYmluZGV4LCBOVUxMKTsKKwlhdV9zZXRfZmJl
bmQoZmlsZSwgYnRhaWwpOworCWZvciAoYmluZGV4ID0gYnN0YXJ0OyBiaW5kZXggPD0gYnRhaWw7
IGJpbmRleCsrKSB7CisJCWhfZGVudHJ5ID0gYXVfaF9kcHRyKGRlbnRyeSwgYmluZGV4KTsKKwkJ
aWYgKCFoX2RlbnRyeSkKKwkJCWNvbnRpbnVlOworCQloX2ZpbGUgPSBhdV9oX2ZwdHIoZmlsZSwg
YmluZGV4KTsKKwkJaWYgKGhfZmlsZSkgeworCQkJQXVEZWJ1Z09uKGhfZmlsZS0+Zl9kZW50cnkg
IT0gaF9kZW50cnkpOworCQkJY29udGludWU7CisJCX0KKworCQloX2ZpbGUgPSBhdV9oX29wZW4o
ZGVudHJ5LCBiaW5kZXgsIGZpbGUtPmZfZmxhZ3MsIGZpbGUpOworCQkvLyB1bmF2YWlsYWJsZQor
CQkvL2lmIChMa3RyQ29uZCkge2ZwdXQoaF9maWxlKTsKKwkJLy9hdV9icl9wdXQoYXVfc2JyKGRl
bnRyeS0+ZF9zYiwgYmluZGV4KSk7aF9maWxlPUVSUl9QVFIoLTEpO30KKwkJZXJyID0gUFRSX0VS
UihoX2ZpbGUpOworCQlpZiAoSVNfRVJSKGhfZmlsZSkpCisJCQlnb3RvIG91dDsgLy8gY2xvc2Ug
YWxsPworCQkvL2NwdXBfZmlsZV9mbGFncyhoX2ZpbGUsIGZpbGUpOworCQlhdV9zZXRfaF9mcHRy
KGZpbGUsIGJpbmRleCwgaF9maWxlKTsKKwl9CisJYXVfdXBkYXRlX2ZpZ2VuKGZpbGUpOworCS8v
ZmlsZS0+Zl9yYSA9IGhfZmlsZS0+Zl9yYTsgLy8/PworCWVyciA9IDA7CisKKyBvdXQ6CisJQXVU
cmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZG9fb3Blbl9kaXIo
c3RydWN0IGZpbGUgKmZpbGUsIGludCBmbGFncykKK3sKKwlpbnQgZXJyOworCWF1ZnNfYmluZGV4
X3QgYmluZGV4LCBidGFpbDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksICpoX2RlbnRyeTsKKwlz
dHJ1Y3QgZmlsZSAqaF9maWxlOworCisJZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJTEtUUlRy
YWNlKCIlLipzLCAweCV4XG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgZmxhZ3MpOworCUF1RGVidWdP
bighZGVudHJ5LT5kX2lub2RlIHx8ICFTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSk7
CisKKwllcnIgPSAwOworCWF1X3NldF9mdmRpcl9jYWNoZShmaWxlLCBOVUxMKTsKKwlmaWxlLT5m
X3ZlcnNpb24gPSBkZW50cnktPmRfaW5vZGUtPmlfdmVyc2lvbjsKKwliaW5kZXggPSBhdV9kYnN0
YXJ0KGRlbnRyeSk7CisJYXVfc2V0X2Zic3RhcnQoZmlsZSwgYmluZGV4KTsKKwlidGFpbCA9IGF1
X2RidGFpbGRpcihkZW50cnkpOworCWF1X3NldF9mYmVuZChmaWxlLCBidGFpbCk7CisJZm9yICg7
ICFlcnIgJiYgYmluZGV4IDw9IGJ0YWlsOyBiaW5kZXgrKykgeworCQloX2RlbnRyeSA9IGF1X2hf
ZHB0cihkZW50cnksIGJpbmRleCk7CisJCWlmICghaF9kZW50cnkpCisJCQljb250aW51ZTsKKwor
CQloX2ZpbGUgPSBhdV9oX29wZW4oZGVudHJ5LCBiaW5kZXgsIGZsYWdzLCBmaWxlKTsKKwkJLy9p
ZiAoTGt0ckNvbmQpIHtmcHV0KGhfZmlsZSk7CisJCS8vYXVfYnJfcHV0KGF1X3NicihkZW50cnkt
PmRfc2IsIGJpbmRleCkpO2hfZmlsZT1FUlJfUFRSKC0xKTt9CisJCWlmICghSVNfRVJSKGhfZmls
ZSkpIHsKKwkJCWF1X3NldF9oX2ZwdHIoZmlsZSwgYmluZGV4LCBoX2ZpbGUpOworCQkJY29udGlu
dWU7CisJCX0KKwkJZXJyID0gUFRSX0VSUihoX2ZpbGUpOworCX0KKwlhdV91cGRhdGVfZmlnZW4o
ZmlsZSk7CisJLy9maWxlLT5mX3JhID0gaF9maWxlLT5mX3JhOyAvLz8/CisJaWYgKCFlcnIpCisJ
CXJldHVybiAwOyAvKiBzdWNjZXNzICovCisKKwkvKiBjbG9zZSBhbGwgKi8KKwlmb3IgKGJpbmRl
eCA9IGF1X2Zic3RhcnQoZmlsZSk7ICFlcnIgJiYgYmluZGV4IDw9IGJ0YWlsOyBiaW5kZXgrKykK
KwkJYXVfc2V0X2hfZnB0cihmaWxlLCBiaW5kZXgsIE5VTEwpOworCWF1X3NldF9mYnN0YXJ0KGZp
bGUsIC0xKTsKKwlhdV9zZXRfZmJlbmQoZmlsZSwgLTEpOworCXJldHVybiBlcnI7Cit9CisKK3N0
YXRpYyBpbnQgYXVmc19vcGVuX2RpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAq
ZmlsZSkKK3sKKwlyZXR1cm4gYXVfZG9fb3Blbihpbm9kZSwgZmlsZSwgZG9fb3Blbl9kaXIpOwor
fQorCitzdGF0aWMgaW50IGF1ZnNfcmVsZWFzZV9kaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3Ry
dWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGF1X3ZkaXIgKnZkaXJfY2FjaGU7CisJc3RydWN0
IHN1cGVyX2Jsb2NrICpzYjsKKworCUxLVFJUcmFjZSgiaSVsdSwgJS4qc1xuIiwgaW5vZGUtPmlf
aW5vLCBBdURMTlBhaXIoZmlsZS0+Zl9kZW50cnkpKTsKKworCXNiID0gZmlsZS0+Zl9kZW50cnkt
PmRfc2I7CisJc2lfbm9mbHVzaF9yZWFkX2xvY2soc2IpOworCWZpX3dyaXRlX2xvY2soZmlsZSk7
CisJdmRpcl9jYWNoZSA9IGF1X2Z2ZGlyX2NhY2hlKGZpbGUpOworCWlmICh2ZGlyX2NhY2hlKQor
CQlhdV92ZGlyX2ZyZWUodmRpcl9jYWNoZSk7CisJZmlfd3JpdGVfdW5sb2NrKGZpbGUpOworCWF1
X2ZpbmZvX2ZpbihmaWxlKTsKKwlzaV9yZWFkX3VubG9jayhzYik7CisJcmV0dXJuIDA7Cit9CisK
K3N0YXRpYyBpbnQgZnN5bmNfZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5j
KQoreworCWludCBlcnI7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxv
Y2sgKnNiOworCWF1ZnNfYmluZGV4X3QgYmVuZCwgYmluZGV4OworCisJTEtUUlRyYWNlKCIlLipz
LCAlZFxuIiwgQXVETE5QYWlyKGRlbnRyeSksIGRhdGFzeW5jKTsKKwlEaU11c3RBbnlMb2NrKGRl
bnRyeSk7CisJc2IgPSBkZW50cnktPmRfc2I7CisJU2lNdXN0QW55TG9jayhzYik7CisJaW5vZGUg
PSBkZW50cnktPmRfaW5vZGU7CisJSU11c3RMb2NrKGlub2RlKTsKKwlJaU11c3RBbnlMb2NrKGlu
b2RlKTsKKworCWVyciA9IDA7CisJYmVuZCA9IGF1X2RiZW5kKGRlbnRyeSk7CisJZm9yIChiaW5k
ZXggPSBhdV9kYnN0YXJ0KGRlbnRyeSk7ICFlcnIgJiYgYmluZGV4IDw9IGJlbmQ7IGJpbmRleCsr
KSB7CisJCXN0cnVjdCBkZW50cnkgKmhfZGVudHJ5OworCQlzdHJ1Y3QgaW5vZGUgKmhfaW5vZGU7
CisJCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcDsKKworCQlpZiAoYXVfdGVzdF9ybyhzYiwg
YmluZGV4LCBpbm9kZSkpCisJCQljb250aW51ZTsKKwkJaF9kZW50cnkgPSBhdV9oX2RwdHIoZGVu
dHJ5LCBiaW5kZXgpOworCQlpZiAoIWhfZGVudHJ5KQorCQkJY29udGludWU7CisJCWhfaW5vZGUg
PSBoX2RlbnRyeS0+ZF9pbm9kZTsKKwkJaWYgKCFoX2lub2RlKQorCQkJY29udGludWU7CisKKwkJ
LyogY2YuIGZzL25zZmQvdmZzLmMgYW5kIGZzL25mc2QvbmZzNHJlY292ZXIuYyAqLworCQkvL2F1
X2hkaXJfbG9jayhoX2lub2RlLCBpbm9kZSwgYmluZGV4KTsKKwkJbXV0ZXhfbG9jaygmaF9pbm9k
ZS0+aV9tdXRleCk7CisJCWZvcCA9ICh2b2lkICopaF9pbm9kZS0+aV9mb3A7CisJCWVyciA9IGZp
bGVtYXBfZmRhdGF3cml0ZShoX2lub2RlLT5pX21hcHBpbmcpOworCQlpZiAoIWVyciAmJiBmb3Ag
JiYgZm9wLT5mc3luYykKKwkJCWVyciA9IGZvcC0+ZnN5bmMoTlVMTCwgaF9kZW50cnksIGRhdGFz
eW5jKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBmaWxlbWFwX2ZkYXRhd3JpdGUoaF9pbm9kZS0+
aV9tYXBwaW5nKTsKKwkJaWYgKCFlcnIpCisJCQlhdV91cGRhdGVfZnVzZV9oX2lub2RlKE5VTEws
IGhfZGVudHJ5KTsgLyppZ25vcmUqLworCQkvL2F1X2hkaXJfdW5sb2NrKGhfaW5vZGUsIGlub2Rl
LCBiaW5kZXgpOworCQltdXRleF91bmxvY2soJmhfaW5vZGUtPmlfbXV0ZXgpOworCX0KKworCUF1
VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQGZpbGUgbWF5IGJlIE5V
TEwKKyAqLworc3RhdGljIGludCBhdWZzX2ZzeW5jX2RpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3Ry
dWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICBpbnQgZGF0YXN5bmMpCit7CisJaW50IGVycjsKKwlz
dHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBmaWxlICpoX2ZpbGU7CisJc3RydWN0IHN1cGVy
X2Jsb2NrICpzYjsKKwlhdWZzX2JpbmRleF90IGJlbmQsIGJpbmRleDsKKworCUxLVFJUcmFjZSgi
JS4qcywgJWRcbiIsIEF1RExOUGFpcihkZW50cnkpLCBkYXRhc3luYyk7CisJaW5vZGUgPSBkZW50
cnktPmRfaW5vZGU7CisJSU11c3RMb2NrKGlub2RlKTsKKworCWVyciA9IDA7CisJc2IgPSBkZW50
cnktPmRfc2I7CisJc2lfbm9mbHVzaF9yZWFkX2xvY2soc2IpOworCWlmIChmaWxlKSB7CisJCWVy
ciA9IGF1X3JldmFsX2FuZF9sb2NrX2ZpbmZvKGZpbGUsIHJlb3Blbl9kaXIsIC8qd2xvY2sqLzEs
CisJCQkJCSAgICAgIC8qbG9ja2VkKi8xKTsKKwkJLy9lcnIgPSAtMTsKKwkJaWYgKHVubGlrZWx5
KGVycikpCisJCQlnb3RvIG91dDsKKwl9IGVsc2UKKwkJZGlfcmVhZF9sb2NrX2NoaWxkKGRlbnRy
eSwgIUF1TG9ja19JVyk7CisKKwlpaV93cml0ZV9sb2NrX2NoaWxkKGlub2RlKTsKKwlpZiAoZmls
ZSkgeworCQliZW5kID0gYXVfZmJlbmQoZmlsZSk7CisJCWZvciAoYmluZGV4ID0gYXVfZmJzdGFy
dChmaWxlKTsgIWVyciAmJiBiaW5kZXggPD0gYmVuZDsKKwkJICAgICBiaW5kZXgrKykgeworCQkJ
aF9maWxlID0gYXVfaF9mcHRyKGZpbGUsIGJpbmRleCk7CisJCQlpZiAoIWhfZmlsZSB8fCBhdV90
ZXN0X3JvKHNiLCBiaW5kZXgsIGlub2RlKSkKKwkJCQljb250aW51ZTsKKworCQkJZXJyID0gLUVJ
TlZBTDsKKwkJCWlmIChoX2ZpbGUtPmZfb3AgJiYgaF9maWxlLT5mX29wLT5mc3luYykgeworCQkJ
CS8vIHRvZG86IHRyeSBkb19mc3luYygpIGluIGZzL3N5bmMuYworCQkJCW11dGV4X2xvY2soJmhf
ZmlsZS0+Zl9tYXBwaW5nLT5ob3N0LT5pX211dGV4KTsKKwkJCQllcnIgPSBoX2ZpbGUtPmZfb3At
PmZzeW5jCisJCQkJCShoX2ZpbGUsIGhfZmlsZS0+Zl9kZW50cnksIGRhdGFzeW5jKTsKKwkJCQkv
L2VyciA9IC0xOworCQkJCWlmICghZXJyKQorCQkJCQlhdV91cGRhdGVfZnVzZV9oX2lub2RlCisJ
CQkJCQkoaF9maWxlLT5mX3Zmc21udCwKKwkJCQkJCSBoX2ZpbGUtPmZfZGVudHJ5KTsKKwkJCQkv
Kmlnbm9yZSovCisJCQkJbXV0ZXhfdW5sb2NrKCZoX2ZpbGUtPmZfbWFwcGluZy0+aG9zdC0+aV9t
dXRleCk7CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJZXJyID0gZnN5bmNfZGlyKGRlbnRyeSwgZGF0
YXN5bmMpOworCWF1X2NwdXBfYXR0cl90aW1lc2l6ZXMoaW5vZGUpOworCWlpX3dyaXRlX3VubG9j
ayhpbm9kZSk7CisJaWYgKGZpbGUpCisJCWZpX3dyaXRlX3VubG9jayhmaWxlKTsKKwllbHNlCisJ
CWRpX3JlYWRfdW5sb2NrKGRlbnRyeSwgIUF1TG9ja19JVyk7CisKKyBvdXQ6CisJc2lfcmVhZF91
bmxvY2soc2IpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYXVmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxl
LCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCWludCBlcnI7CisJc3RydWN0
IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHN1cGVyX2Js
b2NrICpzYjsKKworCWRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCUxLVFJUcmFjZSgiJS4qcywg
cG9zICVMZFxuIiwgQXVETE5QYWlyKGRlbnRyeSksIGZpbGUtPmZfcG9zKTsKKwlpbm9kZSA9IGRl
bnRyeS0+ZF9pbm9kZTsKKwlJTXVzdExvY2soaW5vZGUpOworCisJYXVfbmZzZF9sb2NrZGVwX29m
ZigpOworCXNiID0gZGVudHJ5LT5kX3NiOworCXNpX3JlYWRfbG9jayhzYiwgQXVMb2NrX0ZMVVNI
KTsKKwllcnIgPSBhdV9yZXZhbF9hbmRfbG9ja19maW5mbyhmaWxlLCByZW9wZW5fZGlyLCAvKnds
b2NrKi8xLAorCQkJCSAgICAgIC8qbG9ja2VkKi8xKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJ
Z290byBvdXQ7CisKKwlpaV93cml0ZV9sb2NrX2NoaWxkKGlub2RlKTsKKwllcnIgPSBhdV92ZGly
X2luaXQoZmlsZSk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJaWlfd3JpdGVfdW5sb2NrKGlu
b2RlKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwkvL0RiZ1ZkaXIoYXVfZnZkaXJfY2FjaGUo
ZmlsZSkpOy8vIGdvdG8gb3V0X3VubG9jazsKKworCS8qIG5mc2QgZmlsbGRpciBjYWxscyBsb29r
dXBfb25lX2xlbigpLiAqLworCWlpX2Rvd25ncmFkZV9sb2NrKGlub2RlKTsKKwllcnIgPSBhdV92
ZGlyX2ZpbGxfZGUoZmlsZSwgZGlyZW50LCBmaWxsZGlyKTsKKwkvL0RiZ1ZkaXIoYXVfZnZkaXJf
Y2FjaGUoZmlsZSkpOy8vIGdvdG8gb3V0X3VubG9jazsKKworCWZzc3RhY2tfY29weV9hdHRyX2F0
aW1lKGlub2RlLCBhdV9oX2lwdHIoaW5vZGUsIGF1X2lic3RhcnQoaW5vZGUpKSk7CisJaWlfcmVh
ZF91bmxvY2soaW5vZGUpOworCisgb3V0X3VubG9jazoKKwlmaV93cml0ZV91bmxvY2soZmlsZSk7
Cisgb3V0OgorCXNpX3JlYWRfdW5sb2NrKHNiKTsKKwlhdV9uZnNkX2xvY2tkZXBfb24oKTsKKwlB
dVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwor
CisjZGVmaW5lIEF1VGVzdEVtcHR5X1dIT05MWQkxCisjZGVmaW5lIEF1VGVzdEVtcHR5X0RMR1QJ
KDEgPDwgMSkKKyNkZWZpbmUgQXVUZXN0RW1wdHlfRElSUEVSTTEJKDEgPDwgMikKKyNkZWZpbmUg
QXVUZXN0RW1wdHlfQ0FMTEVECSgxIDw8IDMpCisjZGVmaW5lIEF1VGVzdEVtcHR5X1NIV0gJKDEg
PDwgNCkKKyNkZWZpbmUgYXVfZnRlc3RfdGVzdGVtcHR5KGZsYWdzLCBuYW1lKQkoKGZsYWdzKSAm
IEF1VGVzdEVtcHR5XyMjbmFtZSkKKyNkZWZpbmUgYXVfZnNldF90ZXN0ZW1wdHkoZmxhZ3MsIG5h
bWUpCXsgKGZsYWdzKSB8PSBBdVRlc3RFbXB0eV8jI25hbWU7IH0KKyNkZWZpbmUgYXVfZmNscl90
ZXN0ZW1wdHkoZmxhZ3MsIG5hbWUpCXsgKGZsYWdzKSAmPSB+QXVUZXN0RW1wdHlfIyNuYW1lOyB9
CisjaWZuZGVmIENPTkZJR19BVUZTX0RMR1QKKyN1bmRlZiBBdVRlc3RFbXB0eV9ETEdUCisjZGVm
aW5lIEF1VGVzdEVtcHR5X0RMR1QJMAorI3VuZGVmIEF1VGVzdEVtcHR5X0RJUlBFUk0xCisjZGVm
aW5lIEF1VGVzdEVtcHR5X0RJUlBFUk0xCTAKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfQVVGU19T
SFdICisjdW5kZWYgQXVUZXN0RW1wdHlfU0hXSAorI2RlZmluZSBBdVRlc3RFbXB0eV9TSFdICTAK
KyNlbmRpZgorCitzdHJ1Y3QgdGVzdF9lbXB0eV9hcmcgeworCXN0cnVjdCBhdV9uaGFzaCAqd2hs
aXN0OworCXVuc2lnbmVkIGludCBmbGFnczsKKwlpbnQgZXJyOworCWF1ZnNfYmluZGV4X3QgYmlu
ZGV4OworfTsKKworc3RhdGljIGludCB0ZXN0X2VtcHR5X2NiKHZvaWQgKl9fYXJnLCBjb25zdCBj
aGFyICpfX25hbWUsIGludCBuYW1lbGVuLAorCQkJIGxvZmZfdCBvZmZzZXQsIHU2NCBpbm8sIHVu
c2lnbmVkIGludCBkX3R5cGUpCit7CisJc3RydWN0IHRlc3RfZW1wdHlfYXJnICphcmcgPSBfX2Fy
ZzsKKwljaGFyICpuYW1lID0gKHZvaWQgKilfX25hbWU7CisKKwlMS1RSVHJhY2UoIiUuKnNcbiIs
IG5hbWVsZW4sIG5hbWUpOworCisJYXJnLT5lcnIgPSAwOworCWF1X2ZzZXRfdGVzdGVtcHR5KGFy
Zy0+ZmxhZ3MsIENBTExFRCk7CisJLy9zbXBfbWIoKTsKKwlpZiAobmFtZVswXSA9PSAnLicKKwkg
ICAgJiYgKG5hbWVsZW4gPT0gMSB8fCAobmFtZVsxXSA9PSAnLicgJiYgbmFtZWxlbiA9PSAyKSkp
CisJCXJldHVybiAwOyAvKiBzdWNjZXNzICovCisKKwlpZiAobmFtZWxlbiA8PSBBVUZTX1dIX1BG
WF9MRU4KKwkgICAgfHwgbWVtY21wKG5hbWUsIEFVRlNfV0hfUEZYLCBBVUZTX1dIX1BGWF9MRU4p
KSB7CisJCWlmIChhdV9mdGVzdF90ZXN0ZW1wdHkoYXJnLT5mbGFncywgV0hPTkxZKQorCQkgICAg
JiYgIWF1X25oYXNoX3Rlc3Rfa25vd25fd2goYXJnLT53aGxpc3QsIG5hbWUsIG5hbWVsZW4pKQor
CQkJYXJnLT5lcnIgPSAtRU5PVEVNUFRZOworCQlnb3RvIG91dDsKKwl9CisKKwluYW1lICs9IEFV
RlNfV0hfUEZYX0xFTjsKKwluYW1lbGVuIC09IEFVRlNfV0hfUEZYX0xFTjsKKwlpZiAoIWF1X25o
YXNoX3Rlc3Rfa25vd25fd2goYXJnLT53aGxpc3QsIG5hbWUsIG5hbWVsZW4pKQorCQlhcmctPmVy
ciA9IGF1X25oYXNoX2FwcGVuZF93aAorCQkJKGFyZy0+d2hsaXN0LCBuYW1lLCBuYW1lbGVuLCBp
bm8sIGRfdHlwZSwgYXJnLT5iaW5kZXgsCisJCQkgYXVfZnRlc3RfdGVzdGVtcHR5KGFyZy0+Zmxh
Z3MsIFNIV0gpKTsKKworIG91dDoKKwkvL3NtcF9tYigpOworCUF1VHJhY2VFcnIoYXJnLT5lcnIp
OworCXJldHVybiBhcmctPmVycjsKK30KKworc3RhdGljIGludCBkb190ZXN0X2VtcHR5KHN0cnVj
dCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHRlc3RfZW1wdHlfYXJnICphcmcpCit7CisJaW50IGVy
ciwgZGxndDsKKwlzdHJ1Y3QgZmlsZSAqaF9maWxlOworCisJTEtUUlRyYWNlKCIlLipzLCB7JXAs
IDB4JXgsICVkfVxuIiwKKwkJICBBdURMTlBhaXIoZGVudHJ5KSwgYXJnLT53aGxpc3QsIGFyZy0+
ZmxhZ3MsIGFyZy0+YmluZGV4KTsKKworCWhfZmlsZSA9IGF1X2hfb3BlbihkZW50cnksIGFyZy0+
YmluZGV4LAorCQkJICAgT19SRE9OTFkgfCBPX05PTkJMT0NLIHwgT19ESVJFQ1RPUlkgfCBPX0xB
UkdFRklMRSwKKwkJCSAgIC8qZmlsZSovTlVMTCk7CisJZXJyID0gUFRSX0VSUihoX2ZpbGUpOwor
CWlmIChJU19FUlIoaF9maWxlKSkKKwkJZ290byBvdXQ7CisJZXJyID0gMDsKKwlpZiAodW5saWtl
bHkoYXVfb3B0X3Rlc3QoYXVfbW50ZmxhZ3MoZGVudHJ5LT5kX3NiKSwgVURCQV9JTk9USUZZKQor
CQkgICAgICYmICFoX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX25saW5rKSkKKwkJZ290byBv
dXRfcHV0OworCisJZGxndCA9IGF1X2Z0ZXN0X3Rlc3RlbXB0eShhcmctPmZsYWdzLCBETEdUKTsK
KwkvL2hfZmlsZS0+Zl9wb3MgPSAwOworCWRvIHsKKwkJYXJnLT5lcnIgPSAwOworCQlhdV9mY2xy
X3Rlc3RlbXB0eShhcmctPmZsYWdzLCBDQUxMRUQpOworCQkvL3NtcF9tYigpOworCQllcnIgPSB2
ZnN1Yl9yZWFkZGlyKGhfZmlsZSwgdGVzdF9lbXB0eV9jYiwgYXJnLCBkbGd0KTsKKwkJaWYgKGVy
ciA+PSAwKQorCQkJZXJyID0gYXJnLT5lcnI7CisJfSB3aGlsZSAoIWVyciAmJiBhdV9mdGVzdF90
ZXN0ZW1wdHkoYXJnLT5mbGFncywgQ0FMTEVEKSk7CisKKyBvdXRfcHV0OgorCWZwdXQoaF9maWxl
KTsKKwlhdV9zYnJfcHV0KGRlbnRyeS0+ZF9zYiwgYXJnLT5iaW5kZXgpOworIG91dDoKKwlBdVRy
YWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGRvX3Rlc3RfZW1wdHlfYXJn
cyB7CisJaW50ICplcnJwOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgdGVzdF9l
bXB0eV9hcmcgKmFyZzsKK307CisKK3N0YXRpYyB2b2lkIGNhbGxfZG9fdGVzdF9lbXB0eSh2b2lk
ICphcmdzKQoreworCXN0cnVjdCBkb190ZXN0X2VtcHR5X2FyZ3MgKmEgPSBhcmdzOworCSphLT5l
cnJwID0gZG9fdGVzdF9lbXB0eShhLT5kZW50cnksIGEtPmFyZyk7Cit9CisKK3N0YXRpYyBpbnQg
c2lvX3Rlc3RfZW1wdHkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgdGVzdF9lbXB0eV9h
cmcgKmFyZykKK3sKKwlpbnQgZXJyLCB3a3FfZXJyOworCXN0cnVjdCBkZW50cnkgKmhfZGVudHJ5
OworCXN0cnVjdCBpbm9kZSAqaF9pbm9kZTsKKworCUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVETE5Q
YWlyKGRlbnRyeSkpOworCWhfZGVudHJ5ID0gYXVfaF9kcHRyKGRlbnRyeSwgYXJnLT5iaW5kZXgp
OworCUF1RGVidWdPbighaF9kZW50cnkpOworCWhfaW5vZGUgPSBoX2RlbnRyeS0+ZF9pbm9kZTsK
KwlBdURlYnVnT24oIWhfaW5vZGUgfHwgIVNfSVNESVIoaF9pbm9kZS0+aV9tb2RlKSk7CisKKwlt
dXRleF9sb2NrX25lc3RlZCgmaF9pbm9kZS0+aV9tdXRleCwgQXVMc2NfSV9DSElMRCk7CisJZXJy
ID0gYXVfdGVzdF9oX3Blcm1fc2lvKGhfaW5vZGUsIE1BWV9FWEVDIHwgTUFZX1JFQUQsCisJCQkJ
IGF1X29wdF90ZXN0X2RsZ3QoYXVfbW50ZmxhZ3MoZGVudHJ5LT5kX3NiKSkpOworCW11dGV4X3Vu
bG9jaygmaF9pbm9kZS0+aV9tdXRleCk7CisJaWYgKCFlcnIpCisJCWVyciA9IGRvX3Rlc3RfZW1w
dHkoZGVudHJ5LCBhcmcpOworCWVsc2UgeworCQlzdHJ1Y3QgZG9fdGVzdF9lbXB0eV9hcmdzIGFy
Z3MgPSB7CisJCQkuZXJycAk9ICZlcnIsCisJCQkuZGVudHJ5CT0gZGVudHJ5LAorCQkJLmFyZwk9
IGFyZworCQl9OworCQl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBhcmctPmZsYWdzOworCQlhdV9mY2xy
X3Rlc3RlbXB0eShhcmctPmZsYWdzLCBETEdUKTsKKwkJYXVfZmNscl90ZXN0ZW1wdHkoYXJnLT5m
bGFncywgRElSUEVSTTEpOworCQl3a3FfZXJyID0gYXVfd2txX3dhaXQoY2FsbF9kb190ZXN0X2Vt
cHR5LCAmYXJncywgLypkbGd0Ki8wKTsKKwkJaWYgKHVubGlrZWx5KHdrcV9lcnIpKQorCQkJZXJy
ID0gd2txX2VycjsKKwkJYXJnLT5mbGFncyA9IGZsYWdzOworCX0KKworCUF1VHJhY2VFcnIoZXJy
KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYXVfdGVzdF9lbXB0eV9sb3dlcihzdHJ1Y3QgZGVu
dHJ5ICpkZW50cnkpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVj
dCB0ZXN0X2VtcHR5X2FyZyBhcmc7CisJc3RydWN0IGF1X25oYXNoICp3aGxpc3Q7CisJYXVmc19i
aW5kZXhfdCBiaW5kZXgsIGJzdGFydCwgYnRhaWw7CisJdW5zaWduZWQgaW50IG1udF9mbGFnczsK
KworCUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVETE5QYWlyKGRlbnRyeSkpOworCWlub2RlID0gZGVu
dHJ5LT5kX2lub2RlOworCUF1RGVidWdPbighaW5vZGUgfHwgIVNfSVNESVIoaW5vZGUtPmlfbW9k
ZSkpOworCisJd2hsaXN0ID0gYXVfbmhhc2hfbmV3KEdGUF9URU1QT1JBUlkpOworCWVyciA9IFBU
Ul9FUlIod2hsaXN0KTsKKwlpZiAoSVNfRVJSKHdobGlzdCkpCisJCWdvdG8gb3V0OworCisJYnN0
YXJ0ID0gYXVfZGJzdGFydChkZW50cnkpOworCW1udF9mbGFncyA9IGF1X21udGZsYWdzKGRlbnRy
eS0+ZF9zYik7CisJYXJnLndobGlzdCA9IHdobGlzdDsKKwlhcmcuZmxhZ3MgPSAwOworCWlmICh1
bmxpa2VseShhdV9vcHRfdGVzdF9kbGd0KG1udF9mbGFncykpKQorCQlhdV9mc2V0X3Rlc3RlbXB0
eShhcmcuZmxhZ3MsIERMR1QpOworCWlmICh1bmxpa2VseShhdV9vcHRfdGVzdChtbnRfZmxhZ3Ms
IFNIV0gpKSkKKwkJYXVfZnNldF90ZXN0ZW1wdHkoYXJnLmZsYWdzLCBTSFdIKTsKKwlhcmcuYmlu
ZGV4ID0gYnN0YXJ0OworCWVyciA9IGRvX3Rlc3RfZW1wdHkoZGVudHJ5LCAmYXJnKTsKKwlpZiAo
dW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXRfd2hsaXN0OworCisJYXVfZnNldF90ZXN0ZW1wdHko
YXJnLmZsYWdzLCBXSE9OTFkpOworCWlmICh1bmxpa2VseShhdV9vcHRfdGVzdF9kaXJwZXJtMSht
bnRfZmxhZ3MpKSkKKwkJYXVfZnNldF90ZXN0ZW1wdHkoYXJnLmZsYWdzLCBESVJQRVJNMSk7CisJ
YnRhaWwgPSBhdV9kYnRhaWxkaXIoZGVudHJ5KTsKKwlmb3IgKGJpbmRleCA9IGJzdGFydCArIDE7
ICFlcnIgJiYgYmluZGV4IDw9IGJ0YWlsOyBiaW5kZXgrKykgeworCQlzdHJ1Y3QgZGVudHJ5ICpo
X2RlbnRyeTsKKwkJaF9kZW50cnkgPSBhdV9oX2RwdHIoZGVudHJ5LCBiaW5kZXgpOworCQlpZiAo
aF9kZW50cnkgJiYgaF9kZW50cnktPmRfaW5vZGUpIHsKKwkJCUF1RGVidWdPbighU19JU0RJUiho
X2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSk7CisJCQlhcmcuYmluZGV4ID0gYmluZGV4OworCQkJ
ZXJyID0gZG9fdGVzdF9lbXB0eShkZW50cnksICZhcmcpOworCQl9CisJfQorCisgb3V0X3dobGlz
dDoKKwlhdV9uaGFzaF9kZWwod2hsaXN0KTsKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJl
dHVybiBlcnI7Cit9CisKK2ludCBhdV90ZXN0X2VtcHR5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwg
c3RydWN0IGF1X25oYXNoICp3aGxpc3QpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmlu
b2RlOworCXN0cnVjdCB0ZXN0X2VtcHR5X2FyZyBhcmc7CisJYXVmc19iaW5kZXhfdCBiaW5kZXgs
IGJ0YWlsOworCisJTEtUUlRyYWNlKCIlLipzXG4iLCBBdURMTlBhaXIoZGVudHJ5KSk7CisJaW5v
ZGUgPSBkZW50cnktPmRfaW5vZGU7CisJQXVEZWJ1Z09uKCFpbm9kZSB8fCAhU19JU0RJUihpbm9k
ZS0+aV9tb2RlKSk7CisKKwllcnIgPSAwOworCWFyZy53aGxpc3QgPSB3aGxpc3Q7CisJYXJnLmZs
YWdzID0gQXVUZXN0RW1wdHlfV0hPTkxZOworCWlmICh1bmxpa2VseShhdV9vcHRfdGVzdChhdV9t
bnRmbGFncyhkZW50cnktPmRfc2IpLCBTSFdIKSkpCisJCWF1X2ZzZXRfdGVzdGVtcHR5KGFyZy5m
bGFncywgU0hXSCk7CisJYnRhaWwgPSBhdV9kYnRhaWxkaXIoZGVudHJ5KTsKKwlmb3IgKGJpbmRl
eCA9IGF1X2Ric3RhcnQoZGVudHJ5KTsgIWVyciAmJiBiaW5kZXggPD0gYnRhaWw7IGJpbmRleCsr
KSB7CisJCXN0cnVjdCBkZW50cnkgKmhfZGVudHJ5OworCQloX2RlbnRyeSA9IGF1X2hfZHB0cihk
ZW50cnksIGJpbmRleCk7CisJCWlmIChoX2RlbnRyeSAmJiBoX2RlbnRyeS0+ZF9pbm9kZSkgewor
CQkJQXVEZWJ1Z09uKCFTX0lTRElSKGhfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKTsKKwkJCWFy
Zy5iaW5kZXggPSBiaW5kZXg7CisJCQllcnIgPSBzaW9fdGVzdF9lbXB0eShkZW50cnksICZhcmcp
OworCQl9CisJfQorCisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWZzX2Rpcl9mb3AgPSB7
CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGF1ZnNfcmVhZGRpciwK
Kwkub3BlbgkJPSBhdWZzX29wZW5fZGlyLAorCS5yZWxlYXNlCT0gYXVmc19yZWxlYXNlX2RpciwK
KwkuZmx1c2gJCT0gYXVmc19mbHVzaCwKKwkuZnN5bmMJCT0gYXVmc19mc3luY19kaXIsCit9Owpk
aWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvZGlyLmggbGludXgt
Mi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL2Rpci5oCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZz
Lm9yaWcvZnMvYXVmcy9kaXIuaAkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0y
LjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvZGlyLmgJMjAwOC0wNS0yNSAxMTo1NjowOCArMDMwMApA
QCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IEp1bmppcm8g
T2thamltYQorICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhp
cyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dy
YW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAg
VVNBCisgKi8KKworLyoKKyAqIGRpcmVjdG9yeSBvcGVyYXRpb25zCisgKgorICogJElkOiBkaXIu
aCx2IDEuMiAyMDA4LzA0LzIxIDAxOjM0OjI2IHNmanJvIEV4cCAkCisgKi8KKworI2lmbmRlZiBf
X0FVRlNfRElSX0hfXworI2RlZmluZSBfX0FVRlNfRElSX0hfXworCisjaWZkZWYgX19LRVJORUxf
XworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWZzX3R5cGUuaD4K
KworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBuZWVkIHRvIGJlIGZhc3RlciBhbmQgc21hbGxl
ciAqLworCisjZGVmaW5lIEF1U2l6ZV9ERUJMSwk1MTIgLy8gdG9kbzogY2hhbmdlYWJsZQorI2Rl
ZmluZSBBdVNpemVfTkhBU0gJMzIgLy8gdG9kbzogY2hhbmdlYWJsZQorI2lmIEF1U2l6ZV9ERUJM
SyA8IE5BTUVfTUFYIHx8IFBBR0VfU0laRSA8IEF1U2l6ZV9ERUJMSworI2Vycm9yIGludmFsaWQg
c2l6ZSBBdVNpemVfREVCTEsKKyNlbmRpZgorCit0eXBlZGVmIGNoYXIgYXVfdmRpcl9kZWJsa190
W0F1U2l6ZV9ERUJMS107CisKK3N0cnVjdCBhdV9uaGFzaCB7CisJc3RydWN0IGhsaXN0X2hlYWQg
aGVhZHNbQXVTaXplX05IQVNIXTsKK307CisKK3N0cnVjdCBhdV92ZGlyX2Rlc3RyIHsKKwl1bnNp
Z25lZCBjaGFyCWxlbjsKKwljaGFyCQluYW1lWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGF1
X3ZkaXJfZGVoc3RyIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQloYXNoOworCXN0cnVjdCBhdV92ZGly
X2Rlc3RyCSpzdHI7Cit9OworCitzdHJ1Y3QgYXVfdmRpcl9kZSB7CisJaW5vX3QJCQlkZV9pbm87
CisJdW5zaWduZWQgY2hhcgkJZGVfdHlwZTsKKwkvKiBjYXV0aW9uOiBwYWNrZWQgKi8KKwlzdHJ1
Y3QgYXVfdmRpcl9kZXN0cglkZV9zdHI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVfdmRpcl93
aCB7CisJc3RydWN0IGhsaXN0X25vZGUJd2hfaGFzaDsKKwlhdWZzX2JpbmRleF90CQl3aF9iaW5k
ZXg7CisjaWZkZWYgQ09ORklHX0FVRlNfU0hXSAorCWlub190CQkJd2hfaW5vOworCXVuc2lnbmVk
IGNoYXIJCXdoX3R5cGU7CisJLyogY2F1dGlvbjogcGFja2VkICovCisjZW5kaWYKKwlzdHJ1Y3Qg
YXVfdmRpcl9kZXN0cgl3aF9zdHI7Cit9IF9fcGFja2VkOworCit1bmlvbiBhdV92ZGlyX2RlYmxr
X3AgeworCXVuc2lnbmVkIGNoYXIJCSpwOworCWF1X3ZkaXJfZGVibGtfdAkJKmRlYmxrOworCXN0
cnVjdCBhdV92ZGlyX2RlCSpkZTsKK307CisKK3N0cnVjdCBhdV92ZGlyIHsKKwlhdV92ZGlyX2Rl
YmxrX3QJKip2ZF9kZWJsazsKKwlpbnQJCXZkX25ibGs7CisJc3RydWN0IHsKKwkJaW50CQkJaTsK
KwkJdW5pb24gYXVfdmRpcl9kZWJsa19wCXA7CisJfSB2ZF9sYXN0OworCisJdW5zaWduZWQgbG9u
Zwl2ZF92ZXJzaW9uOworCXVuc2lnbmVkIGxvbmcJdmRfamlmZnk7Cit9OworCisvKiAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCisKKy8qIGRpci5jICovCitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBh
dWZzX2Rpcl9mb3A7CitpbnQgYXVfdGVzdF9lbXB0eV9sb3dlcihzdHJ1Y3QgZGVudHJ5ICpkZW50
cnkpOworaW50IGF1X3Rlc3RfZW1wdHkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgYXVf
bmhhc2ggKndobGlzdCk7CisKKy8qIHZkaXIuYyAqLworc3RydWN0IGF1X25oYXNoICphdV9uaGFz
aF9uZXcoZ2ZwX3QgZ2ZwKTsKK3ZvaWQgYXVfbmhhc2hfZGVsKHN0cnVjdCBhdV9uaGFzaCAqbmhh
c2gpOwordm9pZCBhdV9uaGFzaF9pbml0KHN0cnVjdCBhdV9uaGFzaCAqbmhhc2gpOwordm9pZCBh
dV9uaGFzaF9tb3ZlKHN0cnVjdCBhdV9uaGFzaCAqZHN0LCBzdHJ1Y3QgYXVfbmhhc2ggKnNyYyk7
Cit2b2lkIGF1X25oYXNoX2ZpbihzdHJ1Y3QgYXVfbmhhc2ggKm5oYXNoKTsKK2ludCBhdV9uaGFz
aF90ZXN0X2xvbmdlcl93aChzdHJ1Y3QgYXVfbmhhc2ggKndobGlzdCwgYXVmc19iaW5kZXhfdCBi
dGd0LAorCQkJICAgIGludCBsaW1pdCk7CitpbnQgYXVfbmhhc2hfdGVzdF9rbm93bl93aChzdHJ1
Y3QgYXVfbmhhc2ggKndobGlzdCwgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworaW50IGF1X25o
YXNoX2FwcGVuZF93aChzdHJ1Y3QgYXVfbmhhc2ggKndobGlzdCwgY2hhciAqbmFtZSwgaW50IG5h
bWVsZW4sCisJCSAgICAgICBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUsIGF1ZnNfYmlu
ZGV4X3QgYmluZGV4LAorCQkgICAgdW5zaWduZWQgY2hhciBzaHdoKTsKK3ZvaWQgYXVfdmRpcl9m
cmVlKHN0cnVjdCBhdV92ZGlyICp2ZGlyKTsKK2ludCBhdV92ZGlyX2luaXQoc3RydWN0IGZpbGUg
KmZpbGUpOworaW50IGF1X3ZkaXJfZmlsbF9kZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGly
ZW50LCBmaWxsZGlyX3QgZmlsbGRpcik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGlj
IGlubGluZQordm9pZCBhdV9zaHdoX2luaXRfd2goc3RydWN0IGF1X3ZkaXJfd2ggKndoLCBpbm9f
dCBpbm8sIHVuc2lnbmVkIGNoYXIgZF90eXBlKQoreworI2lmZGVmIENPTkZJR19BVUZTX1NIV0gK
Kwl3aC0+d2hfaW5vID0gaW5vOworCXdoLT53aF90eXBlID0gZF90eXBlOworI2VuZGlmCit9CisK
K3N0YXRpYyBpbmxpbmUgdm9pZCBhdV9hZGRfbmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVj
dCBpbm9kZSAqaF9kaXIpCit7CisJQXVEZWJ1Z09uKCFTX0lTRElSKGRpci0+aV9tb2RlKSB8fCAh
U19JU0RJUihoX2Rpci0+aV9tb2RlKSk7CisJZGlyLT5pX25saW5rICs9IGhfZGlyLT5pX25saW5r
IC0gMjsKKwlpZiAodW5saWtlbHkoaF9kaXItPmlfbmxpbmsgPCAyKSkKKwkJZGlyLT5pX25saW5r
ICs9IDI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdV9zdWJfbmxpbmsoc3RydWN0IGlub2Rl
ICpkaXIsIHN0cnVjdCBpbm9kZSAqaF9kaXIpCit7CisJQXVEZWJ1Z09uKCFTX0lTRElSKGRpci0+
aV9tb2RlKSB8fCAhU19JU0RJUihoX2Rpci0+aV9tb2RlKSk7CisJZGlyLT5pX25saW5rIC09IGhf
ZGlyLT5pX25saW5rIC0gMjsKKwlpZiAodW5saWtlbHkoaF9kaXItPmlfbmxpbmsgPCAyKSkKKwkJ
ZGlyLT5pX25saW5rIC09IDI7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYg
LyogX19BVUZTX0RJUl9IX18gKi8KZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3Jp
Zy9mcy9hdWZzL2RsZ3QuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvZGxndC5jCi0t
LSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9kbGd0LmMJMTk3MC0wMS0wMSAw
MzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL2RsZ3QuYwky
MDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA4IEp1bmppcm8gT2thamltYQorICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cisg
KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICog
YWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh
cmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9z
dG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworLyoKKyAqIGxvb2t1cCBmdW5jdGlvbnMg
aW4gJ2RlbGVnYXRlJyBtb2RlCisgKgorICogJElkOiBkbGd0LmMsdiAxLjIgMjAwOC8wNC8yMSAw
MjowMDozNyBzZmpybyBFeHAgJAorICovCisKKy8vI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+
CisjaW5jbHVkZSAiYXVmcy5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBhdV9s
b29rdXBfb25lX2xlbl9hcmdzIHsKKwlzdHJ1Y3QgZGVudHJ5ICoqZXJycDsKKwljb25zdCBjaGFy
ICpuYW1lOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlpbnQgbGVuOworfTsKKworc3RhdGlj
IHZvaWQgYXVfY2FsbF9sb29rdXBfb25lX2xlbih2b2lkICphcmdzKQoreworCXN0cnVjdCBhdV9s
b29rdXBfb25lX2xlbl9hcmdzICphID0gYXJnczsKKwkqYS0+ZXJycCA9IHZmc3ViX2xvb2t1cF9v
bmVfbGVuKGEtPm5hbWUsIGEtPnBhcmVudCwgYS0+bGVuKTsKK30KKworc3RydWN0IGRlbnRyeSAq
YXVfbGt1cF9vbmVfZGxndChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQs
CisJCQkJaW50IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBkZW50cnkgKmRl
bnRyeTsKKwlpbnQgZGlycGVybTE7CisKKwlMS1RSVHJhY2UoIiUuKnMvJS4qcywgMHgleFxuIiwg
QXVETE5QYWlyKHBhcmVudCksIGxlbiwgbmFtZSwgZmxhZ3MpOworCisJZGlycGVybTEgPSBhdV9m
dGVzdF9uZHgoZmxhZ3MsIERJUlBFUk0xKTsKKwlpZiAoIWRpcnBlcm0xICYmICFhdV9mdGVzdF9u
ZHgoZmxhZ3MsIERMR1QpKQorCQlkZW50cnkgPSB2ZnN1Yl9sb29rdXBfb25lX2xlbihuYW1lLCBw
YXJlbnQsIGxlbik7CisJZWxzZSB7CisJCWludCB3a3FfZXJyOworCQlzdHJ1Y3QgYXVfbG9va3Vw
X29uZV9sZW5fYXJncyBhcmdzID0geworCQkJLmVycnAJPSAmZGVudHJ5LAorCQkJLm5hbWUJPSBu
YW1lLAorCQkJLnBhcmVudAk9IHBhcmVudCwKKwkJCS5sZW4JPSBsZW4KKwkJfTsKKwkJd2txX2Vy
ciA9IGF1X3drcV93YWl0KGF1X2NhbGxfbG9va3VwX29uZV9sZW4sICZhcmdzLAorCQkJCSAgICAg
IC8qZGxndCovIWRpcnBlcm0xKTsKKwkJaWYgKHVubGlrZWx5KHdrcV9lcnIpKQorCQkJZGVudHJ5
ID0gRVJSX1BUUih3a3FfZXJyKTsKKwl9CisKKwlBdVRyYWNlRXJyUHRyKGRlbnRyeSk7CisJcmV0
dXJuIGRlbnRyeTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3Qgc2VjdXJpdHlf
aW5vZGVfcGVybWlzc2lvbl9hcmdzIHsKKwlpbnQgKmVycnA7CisJc3RydWN0IGlub2RlICpoX2lu
b2RlOworCWludCBtYXNrOworCXN0cnVjdCBuYW1laWRhdGEgKmZha2VfbmQ7Cit9OworCitzdGF0
aWMgdm9pZCBjYWxsX3NlY3VyaXR5X2lub2RlX3Blcm1pc3Npb24odm9pZCAqYXJncykKK3sKKwlz
dHJ1Y3Qgc2VjdXJpdHlfaW5vZGVfcGVybWlzc2lvbl9hcmdzICphID0gYXJnczsKKwlMS1RSVHJh
Y2UoImZzdWlkICVkXG4iLCBjdXJyZW50LT5mc3VpZCk7CisJKmEtPmVycnAgPSBzZWN1cml0eV9p
bm9kZV9wZXJtaXNzaW9uKGEtPmhfaW5vZGUsIGEtPm1hc2ssIGEtPmZha2VfbmQpOworfQorCitp
bnQgYXVfc2VjdXJpdHlfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmhfaW5vZGUsIGlu
dCBtYXNrLAorCQkJCSBzdHJ1Y3QgbmFtZWlkYXRhICpmYWtlX25kLCBpbnQgZGxndCkKK3sKKwlp
bnQgZXJyOworCisJQXVUcmFjZUVudGVyKCk7CisKKwlpZiAoIWRsZ3QpCisJCWVyciA9IHNlY3Vy
aXR5X2lub2RlX3Blcm1pc3Npb24oaF9pbm9kZSwgbWFzaywgZmFrZV9uZCk7CisJZWxzZSB7CisJ
CWludCB3a3FfZXJyOworCQlzdHJ1Y3Qgc2VjdXJpdHlfaW5vZGVfcGVybWlzc2lvbl9hcmdzIGFy
Z3MgPSB7CisJCQkuZXJycAkJPSAmZXJyLAorCQkJLmhfaW5vZGUJPSBoX2lub2RlLAorCQkJLm1h
c2sJCT0gbWFzaywKKwkJCS5mYWtlX25kCT0gZmFrZV9uZAorCQl9OworCQl3a3FfZXJyID0gYXVf
d2txX3dhaXQoY2FsbF9zZWN1cml0eV9pbm9kZV9wZXJtaXNzaW9uLCAmYXJncywKKwkJCQkgICAg
ICAvKmRsZ3QqLzEpOworCQlpZiAodW5saWtlbHkod2txX2VycikpCisJCQllcnIgPSB3a3FfZXJy
OworCX0KKworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC11ck4gbGlu
dXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvZXhwb3J0LmMgbGludXgtMi42LjI1LjQt
dW5pb25mcy9mcy9hdWZzL2V4cG9ydC5jCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcv
ZnMvYXVmcy9leHBvcnQuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYu
MjUuNC11bmlvbmZzL2ZzL2F1ZnMvZXhwb3J0LmMJMjAwOC0wNS0yNSAxMTo1NjowOCArMDMwMApA
QCAtMCwwICsxLDU3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEp1bmppcm8g
T2thamltYQorICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhp
cyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dy
YW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAg
VVNBCisgKi8KKworLyoKKyAqIGV4cG9ydCB2aWEgbmZzCisgKgorICogJElkOiBleHBvcnQuYyx2
IDEuNCAyMDA4LzA1LzA0IDIzOjUyOjA4IHNmanJvIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGxp
bnV4L2V4cG9ydGZzLmg+CisjaW5jbHVkZSAiYXVmcy5oIgorCit1bmlvbiBjb252IHsKKyNpZiBC
SVRTX1BFUl9MT05HID09IDMyCisJX191MzIgYVsxXTsKKyNlbHNlCisJX191MzIgYVsyXTsKKyNl
bmRpZgorCWlub190IGlubzsKK307CisKK3N0YXRpYyBpbm9fdCBkZWNvZGVfaW5vKF9fdTMyICph
KQoreworCXVuaW9uIGNvbnYgdTsKKworCXUuYVswXSA9IGFbMF07CisjaWYgQklUU19QRVJfTE9O
RyA9PSA2NAorCXUuYVsxXSA9IGFbMV07CisjZW5kaWYKKwlyZXR1cm4gdS5pbm87Cit9CisKK3N0
YXRpYyB2b2lkIGVuY29kZV9pbm8oX191MzIgKmEsIGlub190IGlubykKK3sKKwl1bmlvbiBjb252
IHU7CisKKwl1LmlubyA9IGlubzsKKwlhWzBdID0gdS5hWzBdOworI2lmIEJJVFNfUEVSX0xPTkcg
PT0gNjQKKwlhWzFdID0gdS5hWzFdOworI2VuZGlmCit9CisKKy8qIE5GUyBmaWxlIGhhbmRsZSAq
LworZW51bSB7CisJRmhfYnJfaWQsCisJRmhfc2lnZW4sCisjaWYgQklUU19QRVJfTE9ORyA9PSA2
NAorCS8qIHN1cHBvcnQgNjRiaXQgaW5vZGUgbnVtYmVyICovCisJRmhfaW5vMSwKKwlGaF9pbm8y
LAorCUZoX2Rpcl9pbm8xLAorCUZoX2Rpcl9pbm8yLAorCUZoX2hfaW5vMSwKKwlGaF9oX2lubzIs
CisjZWxzZQorCUZoX2lubzEsCisJRmhfZGlyX2lubzEsCisJRmhfaF9pbm8xLAorI2VuZGlmCisJ
RmhfaF9pZ2VuLAorCUZoX2hfdHlwZSwKKwlGaF90YWlsLAorCisJRmhfaW5vID0gRmhfaW5vMSwK
KwlGaF9kaXJfaW5vID0gRmhfZGlyX2lubzEsCisJRmhfaF9pbm8gPSBGaF9oX2lubzEsCit9Owor
CitzdGF0aWMgaW50IGF1X3Rlc3RfYW5vbihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0
dXJuICEhKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpOworfQorCisvKiAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWNvZGVfYnlfaW5vKHN0
cnVjdCBzdXBlcl9ibG9jayAqc2IsIGlub190IGlubywKKwkJCQkgICAgaW5vX3QgZGlyX2lubykK
K3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksICpwYXJlbnQ7CisJc3RydWN0IGlub2RlICppbm9k
ZTsKKworCUxLVFJUcmFjZSgiaSVsdSwgZGlyaSVsdVxuIiwgaW5vLCBkaXJfaW5vKTsKKworCWRl
bnRyeSA9IE5VTEw7CisJaW5vZGUgPSBpbG9va3VwKHNiLCBpbm8pOworCWlmICh1bmxpa2VseSgh
aW5vZGUpKQorCQlnb3RvIG91dDsKKworCWRlbnRyeSA9IEVSUl9QVFIoLUVTVEFMRSk7CisJaWYg
KHVubGlrZWx5KGlzX2JhZF9pbm9kZShpbm9kZSkpKQorCQlnb3RvIG91dF9pcHV0OworCisJZGVu
dHJ5ID0gTlVMTDsKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJc3RydWN0IGRl
bnRyeSAqZDsKKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50
cnkoZCwgJmlub2RlLT5pX2RlbnRyeSwgZF9hbGlhcykKKwkJCWlmICghYXVfdGVzdF9hbm9uKGQp
CisJCQkgICAgJiYgZC0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfaW5vID09IGRpcl9pbm8pIHsKKwkJ
CQlkZW50cnkgPSBkZ2V0X2xvY2tlZChkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJc3Bpbl91bmxv
Y2soJmRjYWNoZV9sb2NrKTsKKwl9IGVsc2UgeworCQlkZW50cnkgPSBkX2ZpbmRfYWxpYXMoaW5v
ZGUpOworCQlpZiAoZGVudHJ5ICYmICFhdV90ZXN0X2Fub24oZGVudHJ5KSkgeworCQkJaW50IHNh
bWVfaW5vOworCQkJcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwkJCXNhbWVfaW5vID0g
KHBhcmVudC0+ZF9pbm9kZS0+aV9pbm8gPT0gZGlyX2lubyk7CisJCQlkcHV0KHBhcmVudCk7CisJ
CQlpZiAoc2FtZV9pbm8pCisJCQkJZ290byBvdXRfaXB1dDsgLyogc3VjY2VzcyAqLworCQl9CisK
KwkJZHB1dChkZW50cnkpOworCQlkZW50cnkgPSBOVUxMOworCX0KKworIG91dF9pcHV0OgorCWlw
dXQoaW5vZGUpOworIG91dDoKKwlBdVRyYWNlRXJyUHRyKGRlbnRyeSk7CisJcmV0dXJuIGRlbnRy
eTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgZmluZF9uYW1lX2J5X2lubyB7
CisJaW50IGNhbGxlZCwgZm91bmQ7CisJaW5vX3QgaW5vOworCWNoYXIgKm5hbWU7CisJaW50IG5h
bWVsZW47Cit9OworCitzdGF0aWMgaW50CitmaW5kX25hbWVfYnlfaW5vKHZvaWQgKmFyZywgY29u
c3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGxvZmZfdCBvZmZzZXQsCisJCSB1NjQgaW5vLCB1
bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXN0cnVjdCBmaW5kX25hbWVfYnlfaW5vICphID0gYXJn
OworCisJYS0+Y2FsbGVkKys7CisJaWYgKGEtPmlubyAhPSBpbm8pCisJCXJldHVybiAwOworCisJ
bWVtY3B5KGEtPm5hbWUsIG5hbWUsIG5hbWVsZW4pOworCWEtPm5hbWVsZW4gPSBuYW1lbGVuOwor
CWEtPmZvdW5kID0gMTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRl
Y29kZV9ieV9kaXJfaW5vKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGlub190IGlubywKKwkJCQkJ
aW5vX3QgZGlyX2lubykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksICpwYXJlbnQ7CisJc3Ry
dWN0IGlub2RlICpkaXI7CisJc3RydWN0IGZpbmRfbmFtZV9ieV9pbm8gYXJnOworCXN0cnVjdCBm
aWxlICpmaWxlOworCWludCBlcnI7CisKKwlMS1RSVHJhY2UoImklbHUsIGRpcmklbHVcbiIsIGlu
bywgZGlyX2lubyk7CisKKwlkZW50cnkgPSBOVUxMOworCWRpciA9IGlsb29rdXAoc2IsIGRpcl9p
bm8pOworCWlmICh1bmxpa2VseSghZGlyKSkKKwkJZ290byBvdXQ7CisKKwlkZW50cnkgPSBFUlJf
UFRSKC1FU1RBTEUpOworCWlmICh1bmxpa2VseShpc19iYWRfaW5vZGUoZGlyKSkpCisJCWdvdG8g
b3V0X2lwdXQ7CisKKwlkZW50cnkgPSBOVUxMOworCXBhcmVudCA9IGRfZmluZF9hbGlhcyhkaXIp
OworCWlmIChwYXJlbnQpIHsKKwkJaWYgKHVubGlrZWx5KGF1X3Rlc3RfYW5vbihwYXJlbnQpKSkg
eworCQkJZHB1dChwYXJlbnQpOworCQkJZ290byBvdXRfaXB1dDsKKwkJfQorCX0gZWxzZQorCQln
b3RvIG91dF9pcHV0OworCisJZmlsZSA9IGRlbnRyeV9vcGVuKHBhcmVudCwgYXVfbW50Y2FjaGVf
Z2V0KHNiKSwgYXVfZGlyX3JvZmxhZ3MpOworCWRlbnRyeSA9ICh2b2lkICopZmlsZTsKKwlpZiAo
SVNfRVJSKGZpbGUpKQorCQlnb3RvIG91dF9pcHV0OworCisJZGVudHJ5ID0gRVJSX1BUUigtRU5P
TUVNKTsKKwlhcmcubmFtZSA9IF9fZ2V0bmFtZSgpOworCWlmICh1bmxpa2VseSghYXJnLm5hbWUp
KQorCQlnb3RvIG91dF9mcHV0OworCWFyZy5pbm8gPSBpbm87CisJYXJnLmZvdW5kID0gMDsKKwor
CWRvIHsKKwkJYXJnLmNhbGxlZCA9IDA7CisJCS8vc21wX21iKCk7CisJCWVyciA9IHZmc3ViX3Jl
YWRkaXIoZmlsZSwgZmluZF9uYW1lX2J5X2lubywgJmFyZywgLypkbGd0Ki8wKTsKKwl9IHdoaWxl
ICghZXJyICYmICFhcmcuZm91bmQgJiYgYXJnLmNhbGxlZCk7CisJZGVudHJ5ID0gRVJSX1BUUihl
cnIpOworCWlmIChhcmcuZm91bmQpIHsKKwkJLyogZG8gbm90IGNhbGwgYXVfbGt1cF9vbmUoKSwg
bm9yIGRsZ3QgKi8KKwkJbXV0ZXhfbG9jaygmZGlyLT5pX211dGV4KTsKKwkJZGVudHJ5ID0gdmZz
dWJfbG9va3VwX29uZV9sZW4oYXJnLm5hbWUsIHBhcmVudCwgYXJnLm5hbWVsZW4pOworCQltdXRl
eF91bmxvY2soJmRpci0+aV9tdXRleCk7CisJCUF1VHJhY2VFcnJQdHIoZGVudHJ5KTsKKwl9CisK
KwkvL291dF9wdXRuYW1lOgorCV9fcHV0bmFtZShhcmcubmFtZSk7Cisgb3V0X2ZwdXQ6CisJZnB1
dChmaWxlKTsKKyBvdXRfaXB1dDoKKwlpcHV0KGRpcik7Cisgb3V0OgorCUF1VHJhY2VFcnJQdHIo
ZGVudHJ5KTsKKwlyZXR1cm4gZGVudHJ5OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0
cnVjdCBhcHBlbmRfbmFtZSB7CisJaW50IGZvdW5kLCBjYWxsZWQsIGxlbjsKKwljaGFyICpoX3Bh
dGg7CisJaW5vX3QgaF9pbm87Cit9OworCitzdGF0aWMgaW50IGFwcGVuZF9uYW1lKHZvaWQgKmFy
ZywgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgbG9mZl90IHBvcywKKwkJICAgICAgIHU2NCBp
bm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCit7CisJc3RydWN0IGFwcGVuZF9uYW1lICphID0gYXJn
OworCWNoYXIgKnA7CisKKwlhLT5jYWxsZWQrKzsKKwlpZiAoaW5vICE9IGEtPmhfaW5vKQorCQly
ZXR1cm4gMDsKKworCUF1RGVidWdPbihsZW4gPT0gMSAmJiAqbmFtZSA9PSAnLicpOworCUF1RGVi
dWdPbihsZW4gPT0gMiAmJiBuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICcuJyk7CisJYS0+
bGVuID0gc3RybGVuKGEtPmhfcGF0aCk7CisJbWVtbW92ZShhLT5oX3BhdGggLSBsZW4gLSAxLCBh
LT5oX3BhdGgsIGEtPmxlbik7CisJYS0+aF9wYXRoIC09IGxlbiArIDE7CisJcCA9IGEtPmhfcGF0
aCArIGEtPmxlbjsKKwkqcCsrID0gJy8nOworCW1lbWNweShwLCBuYW1lLCBsZW4pOworCWEtPmxl
biArPSAxICsgbGVuOworCWEtPmZvdW5kKys7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQg
aF9hY2NlcHRhYmxlKHZvaWQgKmV4cHYsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlyZXR1
cm4gMTsKK30KKworc3RhdGljIGNoYXIgKmF1X2J1aWxkX3BhdGgoc3RydWN0IHN1cGVyX2Jsb2Nr
ICpzYiwgX191MzIgKmZoLCBjaGFyICpwYXRoLAorCQkJICAgICBzdHJ1Y3QgdmZzbW91bnQgKmhf
bW50LCBzdHJ1Y3QgZGVudHJ5ICpoX3Jvb3QsCisJCQkgICAgIHN0cnVjdCBkZW50cnkgKmhfcGFy
ZW50KQoreworCWNoYXIgKnJldDsKKwlpbnQgZXJyLCBsZW47CisJc3RydWN0IGZpbGUgKmhfZmls
ZTsKKwlzdHJ1Y3QgYXBwZW5kX25hbWUgYXJnOworCXN0cnVjdCBwYXRoIGRtX3BhdGggPSB7CisJ
CS5tbnQJPSBoX21udCwKKwkJLmRlbnRyeQk9IGhfcm9vdAorCX07CisKKwlBdVRyYWNlRW50ZXIo
KTsKKworCWFyZy5oX3BhdGggPSBkX3BhdGgoJmRtX3BhdGgsIHBhdGgsIFBBVEhfTUFYKTsKKwly
ZXQgPSBhcmcuaF9wYXRoOworCWlmICh1bmxpa2VseSghYXJnLmhfcGF0aCB8fCBJU19FUlIoYXJn
LmhfcGF0aCkpKQorCQlnb3RvIG91dDsKKworCWxlbiA9IHN0cmxlbihhcmcuaF9wYXRoKTsKKwlk
bV9wYXRoLmRlbnRyeSA9IGhfcGFyZW50OworCWFyZy5oX3BhdGggPSBkX3BhdGgoJmRtX3BhdGgs
IHBhdGgsIFBBVEhfTUFYKTsKKwlyZXQgPSBhcmcuaF9wYXRoOworCWlmICh1bmxpa2VseSghYXJn
LmhfcGF0aCB8fCBJU19FUlIoYXJnLmhfcGF0aCkpKQorCQlnb3RvIG91dDsKKwlMS1RSVHJhY2Uo
IiVzXG4iLCBhcmcuaF9wYXRoKTsKKwlpZiAobGVuICE9IDEpCisJCWFyZy5oX3BhdGggKz0gbGVu
OworCUxLVFJUcmFjZSgiJXAsICVzLCAlbGRcbiIsCisJCSAgYXJnLmhfcGF0aCwgYXJnLmhfcGF0
aCwgKGxvbmcpKGFyZy5oX3BhdGggLSBwYXRoKSk7CisKKwkvKiBjZi4gZnMvZXhwb3J0ZnMvZXhw
ZnMuYyAqLworCWhfZmlsZSA9IGRlbnRyeV9vcGVuKGRnZXQoaF9wYXJlbnQpLCBtbnRnZXQoaF9t
bnQpLCBhdV9kaXJfcm9mbGFncyk7CisJcmV0ID0gKHZvaWQgKiloX2ZpbGU7CisJaWYgKElTX0VS
UihoX2ZpbGUpKQorCQlnb3RvIG91dDsKKworCWFyZy5mb3VuZCA9IDA7CisJYXJnLmhfaW5vID0g
ZGVjb2RlX2lubyhmaCArIEZoX2hfaW5vKTsKKwlkbyB7CisJCWFyZy5jYWxsZWQgPSAwOworCQll
cnIgPSB2ZnN1Yl9yZWFkZGlyKGhfZmlsZSwgYXBwZW5kX25hbWUsICZhcmcsIC8qZGxndCovMCk7
CisJfSB3aGlsZSAoIWVyciAmJiAhYXJnLmZvdW5kICYmIGFyZy5jYWxsZWQpOworCUxLVFJUcmFj
ZSgiJXAsICVzLCAlZFxuIiwgYXJnLmhfcGF0aCwgYXJnLmhfcGF0aCwgYXJnLmxlbik7CisJZnB1
dChoX2ZpbGUpOworCXJldCA9IEVSUl9QVFIoZXJyKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJ
Z290byBvdXQ7CisKKwlkbV9wYXRoLm1udCA9IGF1X21udGNhY2hlX2dldChzYik7CisJZG1fcGF0
aC5kZW50cnkgPSBzYi0+c19yb290OworCXJldCA9IGRfcGF0aCgmZG1fcGF0aCwgcGF0aCwgUEFU
SF9NQVggLSBhcmcubGVuKTsKKwltbnRwdXQoZG1fcGF0aC5tbnQpOworCWlmICh1bmxpa2VseSgh
cmV0IHx8IElTX0VSUihyZXQpKSkKKwkJZ290byBvdXQ7CisJcmV0W3N0cmxlbihyZXQpXSA9ICcv
JzsKKwlMS1RSVHJhY2UoIiVzXG4iLCByZXQpOworCisgb3V0OgorCUF1VHJhY2VFcnJQdHIocmV0
KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqCitkZWNvZGVfYnlf
cGF0aChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRleF90IGJpbmRleCwgX191MzIg
KmZoLAorCSAgICAgICBpbnQgZmhfbGVuLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBkZW50
cnkgKmRlbnRyeSwgKmhfcGFyZW50LCAqcm9vdCwgKmhfcm9vdDsKKwlzdHJ1Y3Qgc3VwZXJfYmxv
Y2sgKmhfc2I7CisJY2hhciAqcGF0aCwgKnA7CisJc3RydWN0IHZmc21vdW50ICpoX21udDsKKwlp
bnQgZXJyOworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJc3RydWN0IGF1X2JyYW5jaCAqYnI7CisK
KwlMS1RSVHJhY2UoImIlZFxuIiwgYmluZGV4KTsKKwlTaU11c3RBbnlMb2NrKHNiKTsKKworCWJy
ID0gYXVfc2JyKHNiLCBiaW5kZXgpOworCS8qIGF1X2JyX2dldChicik7ICovCisJaF9tbnQgPSBi
ci0+YnJfbW50OworCWhfc2IgPSBoX21udC0+bW50X3NiOworCUxLVFJUcmFjZSgiJXMsIGhfZGVj
b2RlX2ZoXG4iLCBhdV9zYnR5cGUoaF9zYikpOworCS8qIGluIGxpbnV4LTIuNi4yNCwgaXQgdGFr
ZXMgc3RydWN0IGZpZCAqIGFzIGZpbGUgaGFuZGxlICovCisJLy90b2RvOiBjYWxsIGxvd2VyIGZo
X3RvX2RlbnRyeSgpPyBmaF90b19wYXJlbnQoKT8KKwloX3BhcmVudCA9IGV4cG9ydGZzX2RlY29k
ZV9maChoX21udCwgKHZvaWQgKikoZmggKyBGaF90YWlsKSwKKwkJCQkgICAgICBmaF9sZW4gLSBG
aF90YWlsLCBmaFtGaF9oX3R5cGVdLAorCQkJCSAgICAgIGhfYWNjZXB0YWJsZSwgLypjb250ZXh0
Ki9OVUxMKTsKKwlkZW50cnkgPSBoX3BhcmVudDsKKwlpZiAodW5saWtlbHkoIWhfcGFyZW50IHx8
IElTX0VSUihoX3BhcmVudCkpKSB7CisJCUF1V2FybjEoIiVzIGRlY29kZV9maCBmYWlsZWRcbiIs
IGF1X3NidHlwZShoX3NiKSk7CisJCWdvdG8gb3V0OworCX0KKwlkZW50cnkgPSBOVUxMOworCWlm
ICh1bmxpa2VseShhdV90ZXN0X2Fub24oaF9wYXJlbnQpKSkgeworCQlBdVdhcm4xKCIlcyBkZWNv
ZGVfZmggcmV0dXJuZWQgYSBkaXNjb25uZWN0ZWQgZGVudHJ5XG4iLAorCQkJYXVfc2J0eXBlKGhf
c2IpKTsKKwkJZHB1dChoX3BhcmVudCk7CisJCWdvdG8gb3V0OworCX0KKworCWRlbnRyeSA9IEVS
Ul9QVFIoLUVOT01FTSk7CisJcGF0aCA9IF9fZ2V0bmFtZSgpOworCWlmICh1bmxpa2VseSghcGF0
aCkpIHsKKwkJZHB1dChoX3BhcmVudCk7CisJCWdvdG8gb3V0OworCX0KKworCXJvb3QgPSBzYi0+
c19yb290OworCWRpX3JlYWRfbG9ja19wYXJlbnQocm9vdCwgIUF1TG9ja19JUik7CisJaF9yb290
ID0gYXVfaF9kcHRyKHJvb3QsIGJpbmRleCk7CisJZGlfcmVhZF91bmxvY2socm9vdCwgIUF1TG9j
a19JUik7CisJcCA9IGF1X2J1aWxkX3BhdGgoc2IsIGZoLCBwYXRoLCBoX21udCwgaF9yb290LCBo
X3BhcmVudCk7CisJZHB1dChoX3BhcmVudCk7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBvdXRf
cHV0bmFtZTsKKworCWVyciA9IHZmc3ViX3BhdGhfbG9va3VwKHAsIExPT0tVUF9GT0xMT1csICZu
ZCk7CisJZGVudHJ5ID0gRVJSX1BUUihlcnIpOworCWlmICghZXJyKSB7CisJCWRlbnRyeSA9IGRn
ZXQobmQucGF0aC5kZW50cnkpOworCQlpZiAodW5saWtlbHkoYXVfdGVzdF9hbm9uKGRlbnRyeSkp
KSB7CisJCQlkcHV0KGRlbnRyeSk7CisJCQlkZW50cnkgPSBFUlJfUFRSKC1FU1RBTEUpOworCQl9
CisJCXBhdGhfcHV0KCZuZC5wYXRoKTsKKwl9CisKKyBvdXRfcHV0bmFtZToKKwlfX3B1dG5hbWUo
cGF0aCk7Cisgb3V0OgorCS8qIGF1X2JyX3B1dChicik7ICovCisJQXVUcmFjZUVyclB0cihkZW50
cnkpOworCXJldHVybiBkZW50cnk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGlj
IG5vaW5saW5lX2Zvcl9zdGFjayBzdHJ1Y3QgZGVudHJ5ICoKK2F1ZnNfZGVjb2RlX2ZoKHN0cnVj
dCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpmaCwgaW50IGZoX2xlbiwgaW50IGZoX3R5cGUsCisJ
ICAgICAgIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRl
KSwKKwkgICAgICAgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJ
aW5vX3QgaW5vLCBkaXJfaW5vOworCWF1ZnNfYmluZGV4X3QgYmluZGV4LCBicl9pZDsKKwlzdHJ1
Y3QgaW5vZGUgKmlub2RlLCAqaF9pbm9kZTsKKwlhdV9nZW5fdCBzaWdlbjsKKworCS8vYXVfZGVi
dWdfb24oKTsKKwlMS1RSVHJhY2UoIiVkLCBmaHtpJXUsIGJyX2lkICV1LCBzaWdlbiAldSwgaGkl
dX1cbiIsCisJCSAgZmhfdHlwZSwgZmhbRmhfaW5vXSwgZmhbRmhfYnJfaWRdLCBmaFtGaF9zaWdl
bl0sCisJCSAgZmhbRmhfaF9pbm9dKTsKKwlBdURlYnVnT24oZmhfbGVuIDwgRmhfdGFpbCk7CisK
KwlzaV9yZWFkX2xvY2soc2IsIEF1TG9ja19GTFVTSCk7CisJbG9ja2RlcF9vZmYoKTsKKworCS8q
IGJyYW5jaCBpZCBtYXkgYmUgd3JhcHBlZCBhcm91bmQgKi8KKwlkZW50cnkgPSBFUlJfUFRSKC1F
U1RBTEUpOworCWJyX2lkID0gZmhbRmhfYnJfaWRdOworCXNpZ2VuID0gZmhbRmhfc2lnZW5dOwor
CWJpbmRleCA9IGF1X2JyX2luZGV4KHNiLCBicl9pZCk7CisJaWYgKHVubGlrZWx5KGJpbmRleCA8
IDAgfHwgc2lnZW4gKyBBVUZTX0JSQU5DSF9NQVggPD0gYXVfc2lnZW4oc2IpKSkKKwkJZ290byBv
dXQ7CisKKwkvKiBpcyB0aGlzIGlub2RlIHN0aWxsIGNhY2hlZD8gKi8KKwlpbm8gPSBkZWNvZGVf
aW5vKGZoICsgRmhfaW5vKTsKKwlkaXJfaW5vID0gZGVjb2RlX2lubyhmaCArIEZoX2Rpcl9pbm8p
OworCWRlbnRyeSA9IGRlY29kZV9ieV9pbm8oc2IsIGlubywgZGlyX2lubyk7CisJaWYgKElTX0VS
UihkZW50cnkpKQorCQlnb3RvIG91dDsKKwlpZiAoZGVudHJ5KQorCQlnb3RvIGFjY2VwdDsKKwor
CS8qIGlzIHRoZSBwYXJlbnQgZGlyIGNhY2hlZD8gKi8KKwlkZW50cnkgPSBkZWNvZGVfYnlfZGly
X2lubyhzYiwgaW5vLCBkaXJfaW5vKTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCWdvdG8gb3V0
OworCWlmIChkZW50cnkpCisJCWdvdG8gYWNjZXB0OworCisJLyogbG9va3VwIHBhdGggKi8KKwlk
ZW50cnkgPSBkZWNvZGVfYnlfcGF0aChzYiwgYmluZGV4LCBmaCwgZmhfbGVuLCBjb250ZXh0KTsK
KwlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCWdvdG8gb3V0OworCWlmICh1bmxpa2VseSghZGVudHJ5
KSkKKwkJZ290byBvdXRfc3RhbGU7CisJaWYgKHVubGlrZWx5KGRlbnRyeS0+ZF9pbm9kZS0+aV9p
bm8gIT0gaW5vKSkKKwkJZ290byBvdXRfZHB1dDsKKworIGFjY2VwdDoKKwlpbm9kZSA9IGRlbnRy
eS0+ZF9pbm9kZTsKKwloX2lub2RlID0gTlVMTDsKKwlpaV9yZWFkX2xvY2tfY2hpbGQoaW5vZGUp
OworCWlmIChhdV9pYnN0YXJ0KGlub2RlKSA8PSBiaW5kZXggJiYgYmluZGV4IDw9IGF1X2liZW5k
KGlub2RlKSkKKwkJaF9pbm9kZSA9IGF1X2hfaXB0cihpbm9kZSwgYmluZGV4KTsKKwlpaV9yZWFk
X3VubG9jayhpbm9kZSk7CisJaWYgKGhfaW5vZGUKKwkgICAgJiYgaF9pbm9kZS0+aV9nZW5lcmF0
aW9uID09IGZoW0ZoX2hfaWdlbl0KKwkgICAgJiYgYWNjZXB0YWJsZShjb250ZXh0LCBkZW50cnkp
KQorCQlnb3RvIG91dDsgLyogc3VjY2VzcyAqLworIG91dF9kcHV0OgorCWRwdXQoZGVudHJ5KTsK
KyBvdXRfc3RhbGU6CisJZGVudHJ5ID0gRVJSX1BUUigtRVNUQUxFKTsKKyBvdXQ6CisJbG9ja2Rl
cF9vbigpOworCXNpX3JlYWRfdW5sb2NrKHNiKTsKKwlBdVRyYWNlRXJyUHRyKGRlbnRyeSk7CisJ
Ly9hdV9kZWJ1Z19vZmYoKTsKKwlyZXR1cm4gZGVudHJ5OworfQorCitzdGF0aWMgc3RydWN0IGRl
bnRyeSAqCithdWZzX2ZoX3RvX2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qg
ZmlkICpmaWQsIGludCBmaF9sZW4sCisJCSAgaW50IGZoX3R5cGUpCit7CisJcmV0dXJuIGF1ZnNf
ZGVjb2RlX2ZoKHNiLCBmaWQtPnJhdywgZmhfbGVuLCBmaF90eXBlLCBoX2FjY2VwdGFibGUsCisJ
CQkgICAgICAvKmNvbnRleHQqL05VTEwpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0
YXRpYyBpbnQgYXVmc19lbmNvZGVfZmgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiAqZmgs
IGludCAqbWF4X2xlbiwKKwkJCSAgaW50IGNvbm5lY3RhYmxlKQoreworCWludCBlcnI7CisJc3Ry
dWN0IHN1cGVyX2Jsb2NrICpzYiwgKmhfc2I7CisJc3RydWN0IGlub2RlICppbm9kZSwgKmhfaW5v
ZGUsICpkaXI7CisJYXVmc19iaW5kZXhfdCBiaW5kZXg7CisJdW5pb24gY29udiB1OworCXN0cnVj
dCBkZW50cnkgKnBhcmVudCwgKmhfcGFyZW50OworCisJLy9hdV9kZWJ1Z19vbigpOworCUJVSUxE
X0JVR19PTihzaXplb2YodS5pbm8pICE9IHNpemVvZih1LmEpKTsKKwlMS1RSVHJhY2UoIiUuKnMs
IG1heCAlZCwgY29ubiAlZFxuIiwKKwkJICBBdURMTlBhaXIoZGVudHJ5KSwgKm1heF9sZW4sIGNv
bm5lY3RhYmxlKTsKKwlBdURlYnVnT24oYXVfdGVzdF9hbm9uKGRlbnRyeSkpOworCWlub2RlID0g
ZGVudHJ5LT5kX2lub2RlOworCUF1RGVidWdPbighaW5vZGUpOworCXBhcmVudCA9IGRnZXRfcGFy
ZW50KGRlbnRyeSk7CisJQXVEZWJ1Z09uKGF1X3Rlc3RfYW5vbihwYXJlbnQpKTsKKworCWVyciA9
IC1FTk9TUEM7CisJaWYgKHVubGlrZWx5KCptYXhfbGVuIDw9IEZoX3RhaWwpKSB7CisJCUF1V2Fy
bjEoIk5GU3YyIGNsaWVudCAobWF4X2xlbiAlZCk/XG4iLCAqbWF4X2xlbik7CisJCWdvdG8gb3V0
OworCX0KKworCXNiID0gZGVudHJ5LT5kX3NiOworCXNpX3JlYWRfbG9jayhzYiwgQXVMb2NrX0ZM
VVNIKTsKKwlkaV9yZWFkX2xvY2tfY2hpbGQoZGVudHJ5LCBBdUxvY2tfSVIpOworCWRpX3JlYWRf
bG9ja19wYXJlbnQocGFyZW50LCBBdUxvY2tfSVIpOworI2lmZGVmIENPTkZJR19BVUZTX0RFQlVH
CisJaWYgKHVubGlrZWx5KCFhdV9vcHRfdGVzdChhdV9tbnRmbGFncyhzYiksIFhJTk8pKSkKKwkJ
QXVXYXJuMSgiTkZTLWV4cG9ydGluZyByZXF1aXJlcyB4aW5vXG4iKTsKKyNlbmRpZgorCisJZXJy
ID0gLUVQRVJNOworCWJpbmRleCA9IGF1X2Ric3RhcnQoZGVudHJ5KTsKKwloX3NiID0gYXVfc2Jy
X3NiKHNiLCBiaW5kZXgpOworCWlmICh1bmxpa2VseSghaF9zYi0+c19leHBvcnRfb3ApKSB7CisJ
CUF1RXJyMSgiJXMgYnJhbmNoIGlzIG5vdCBleHBvcnRhYmxlXG4iLCBhdV9zYnR5cGUoaF9zYikp
OworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZmhbRmhfYnJfaWRdID0gYXVfc2JyX2lkKHNi
LCBiaW5kZXgpOworCWZoW0ZoX3NpZ2VuXSA9IGF1X3NpZ2VuKHNiKTsKKwllbmNvZGVfaW5vKGZo
ICsgRmhfaW5vLCBpbm9kZS0+aV9pbm8pOworCWRpciA9IHBhcmVudC0+ZF9pbm9kZTsKKwllbmNv
ZGVfaW5vKGZoICsgRmhfZGlyX2lubywgZGlyLT5pX2lubyk7CisJaF9pbm9kZSA9IGF1X2hfZHB0
cihkZW50cnksIGJpbmRleCktPmRfaW5vZGU7CisJZW5jb2RlX2lubyhmaCArIEZoX2hfaW5vLCBo
X2lub2RlLT5pX2lubyk7CisJZmhbRmhfaF9pZ2VuXSA9IGhfaW5vZGUtPmlfZ2VuZXJhdGlvbjsK
KworCSptYXhfbGVuIC09IEZoX3RhaWw7CisJLy9MS1RSVHJhY2UoIkZoX3RhaWwgJWQsIG1heF9s
ZW4gJWRcbiIsIEZoX3RhaWwsICptYXhfbGVuKTsKKwloX3BhcmVudCA9IGF1X2hfZHB0cihwYXJl
bnQsIGJpbmRleCk7CisJQXVEZWJ1Z09uKGF1X3Rlc3RfYW5vbihoX3BhcmVudCkpOworCS8qIGlu
IGxpbnV4LTIuNi4yNCwgaXQgdGFrZXMgc3RydWN0IGZpZCAqIGFzIGZpbGUgaGFuZGxlICovCisJ
ZmhbRmhfaF90eXBlXSA9IGV4cG9ydGZzX2VuY29kZV9maChoX3BhcmVudCwgKHZvaWQgKikoZmgg
KyBGaF90YWlsKSwKKwkJCQkJICAgbWF4X2xlbiwgY29ubmVjdGFibGUpOworCWVyciA9IGZoW0Zo
X2hfdHlwZV07CisJKm1heF9sZW4gKz0gRmhfdGFpbDsKKwlpZiAoZXJyICE9IDI1NSkKKwkJZXJy
ID0gMjsgLy8/PworCWVsc2UKKwkJQXVXYXJuMSgiJXMgZW5jb2RlX2ZoIGZhaWxlZFxuIiwgYXVf
c2J0eXBlKGhfc2IpKTsKKworIG91dF91bmxvY2s6CisJZGlfcmVhZF91bmxvY2socGFyZW50LCBB
dUxvY2tfSVIpOworCWF1ZnNfcmVhZF91bmxvY2soZGVudHJ5LCBBdUxvY2tfSVIpOworIG91dDoK
KwlkcHV0KHBhcmVudCk7CisJQXVUcmFjZUVycihlcnIpOworCS8vYXVfZGVidWdfb2ZmKCk7CisJ
aWYgKHVubGlrZWx5KGVyciA8IDApKQorCQllcnIgPSAyNTU7CisJcmV0dXJuIGVycjsKK30KKwor
LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgYXVmc19leHBv
cnRfb3AgPSB7CisJLmZoX3RvX2RlbnRyeQk9IGF1ZnNfZmhfdG9fZGVudHJ5LAorCS5lbmNvZGVf
ZmgJPSBhdWZzX2VuY29kZV9maAorfTsKZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMu
b3JpZy9mcy9hdWZzL2ZpbGUuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvZmlsZS5j
Ci0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9maWxlLmMJMTk3MC0wMS0w
MSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL2ZpbGUu
YwkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEsNzU1IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9ncmFt
LCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt
b2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBH
TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJl
ZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZs
b29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogaGFuZGxpbmcg
ZmlsZS9kaXIsIGFuZCBhZGRyZXNzX3NwYWNlIG9wZXJhdGlvbgorICoKKyAqICRJZDogZmlsZS5j
LHYgMS40IDIwMDgvMDUvMDQgMjM6NTQ6NTMgc2Zqcm8gRXhwICQKKyAqLworCisvLyNpbmNsdWRl
IDxsaW51eC9mc25vdGlmeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKy8vI2luY2x1
ZGUgPGxpbnV4L3BvbGwuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVk
ZSAiYXVmcy5oIgorCisvKgorICogYSBkaXJ0eSB0cmljayBmb3IgaGFuZGxpbmcgRk1PREVfRVhF
QyBhbmQgZGVueV93cml0ZV9hY2Nlc3MoKS4KKyAqIGJlY2F1c2UgRk1PREVfRVhFQyBmbGFnIGlz
IG5vdCBwYXNzZWQgdG8gZl9vcC0+b3BlbigpLAorICogc2V0IGl0IHRvIGZpbGUtPnByaXZhdGVf
ZGF0YSB0ZW1wb3JhcnkuCisgKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfQVVGU19NT0RVTEUpIHx8
IGRlZmluZWQoQ09ORklHX0FVRlNfREVOWV9XUklURV9BQ0NFU1NfUEFUQ0gpCitpbnQgYXVfc3Rv
cmVfZm1vZGVfZXhlYyhzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgc3RydWN0IGlub2RlICppbm9kZSkK
K3sKKwlpbnQgZXJyOworCXVuaW9uIHsKKwkJdm9pZCAqcDsKKwkJdW5zaWduZWQgbG9uZyB1bDsK
Kwl9IHU7CisKKwllcnIgPSAwOworCWlmIChuZAorCSAgICAmJiAobmQtPmZsYWdzICYgTE9PS1VQ
X09QRU4pCisJICAgICYmIG5kLT5pbnRlbnQub3Blbi5maWxlCisJICAgICYmIChuZC0+aW50ZW50
Lm9wZW4uZmxhZ3MgJiBGTU9ERV9FWEVDKQorCSAgICAmJiBpbm9kZQorCSAgICAmJiBTX0lTUkVH
KGlub2RlLT5pX21vZGUpKSB7CisJCXUudWwgPSBuZC0+aW50ZW50Lm9wZW4uZmxhZ3M7CisJCW5k
LT5pbnRlbnQub3Blbi5maWxlLT5wcml2YXRlX2RhdGEgPSB1LnA7CisJCS8vc21wX21iKCk7CisJ
CWVyciA9IDE7CisJfQorCisJcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCisvKiBkcm9wIGZsYWdz
IGZvciB3cml0aW5nICovCit1bnNpZ25lZCBpbnQgYXVfZmlsZV9yb2ZsYWdzKHVuc2lnbmVkIGlu
dCBmbGFncykKK3sKKwlmbGFncyAmPSB+KE9fV1JPTkxZIHwgT19SRFdSIHwgT19BUFBFTkQgfCBP
X0NSRUFUIHwgT19UUlVOQyk7CisJZmxhZ3MgfD0gT19SRE9OTFkgfCBPX05PQVRJTUU7CisJcmV0
dXJuIGZsYWdzOworfQorCisvKiBjb21tb24gZnVuY3Rpb25zIHRvIHJlZ3VsYXIgZmlsZSBhbmQg
ZGlyICovCitzdHJ1Y3QgZmlsZSAqYXVfaF9vcGVuKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVm
c19iaW5kZXhfdCBiaW5kZXgsIGludCBmbGFncywKKwkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxl
KQoreworCXN0cnVjdCBmaWxlICpoX2ZpbGU7CisJc3RydWN0IGRlbnRyeSAqaF9kZW50cnk7CisJ
c3RydWN0IGlub2RlICpoX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0
IGF1X2JyYW5jaCAqYnI7CisJaW50IGhpbm90aWZ5LCBlcnI7CisKKwlMS1RSVHJhY2UoIiUuKnMs
IGIlZCwgZmxhZ3MgMCVvLCBmICVkXG4iLAorCQkgIEF1RExOUGFpcihkZW50cnkpLCBiaW5kZXgs
IGZsYWdzLCAhIWZpbGUpOworCUF1RGVidWdPbighZGVudHJ5KTsKKwloX2RlbnRyeSA9IGF1X2hf
ZHB0cihkZW50cnksIGJpbmRleCk7CisJQXVEZWJ1Z09uKCFoX2RlbnRyeSk7CisJaF9pbm9kZSA9
IGhfZGVudHJ5LT5kX2lub2RlOworCUF1RGVidWdPbighaF9pbm9kZSk7CisKKwlzYiA9IGRlbnRy
eS0+ZF9zYjsKKwloaW5vdGlmeSA9ICEhYXVfb3B0X3Rlc3QoYXVfbW50ZmxhZ3Moc2IpLCBVREJB
X0lOT1RJRlkpOworCisJYnIgPSBhdV9zYnIoc2IsIGJpbmRleCk7CisJYXVfYnJfZ2V0KGJyKTsK
KwkvKiBkcm9wIGZsYWdzIGZvciB3cml0aW5nICovCisJaWYgKGF1X3Rlc3Rfcm8oc2IsIGJpbmRl
eCwgZGVudHJ5LT5kX2lub2RlKSkKKwkJZmxhZ3MgPSBhdV9maWxlX3JvZmxhZ3MoZmxhZ3MpOwor
CWZsYWdzICY9IH5PX0NSRUFUOworCisJaF9maWxlID0gTlVMTDsKKwlpZiAodW5saWtlbHkoZmls
ZSAmJiBhdV90ZXN0X25mcyhoX2RlbnRyeS0+ZF9zYikpKQorCQloX2ZpbGUgPSBhdV9oX2ludGVu
dChkZW50cnksIGJpbmRleCwgZmlsZSk7CisJaWYgKCFoX2ZpbGUpIHsKKwkJLy9EYmdTbGVlcCgz
KTsKKwkJaF9maWxlID0gZGVudHJ5X29wZW4oZGdldChoX2RlbnRyeSksIG1udGdldChici0+YnJf
bW50KSwgZmxhZ3MpOworCQkvL2lmIChMa3RyQ29uZCkge2ZwdXQoaF9maWxlKTsgaF9maWxlID0g
RVJSX1BUUigtMSk7fQorCX0KKworCS8qCisJICogYSBkaXJ0eSB0cmljayBmb3IgaGFuZGxpbmcg
Rk1PREVfRVhFQyBhbmQgZGVueV93cml0ZV9hY2Nlc3MoKS4KKwkgKi8KKwlpZiAoZmlsZSAmJiAo
ZmlsZS0+Zl9tb2RlICYgRk1PREVfRVhFQykpIHsKKwkJaF9maWxlLT5mX21vZGUgfD0gRk1PREVf
RVhFQzsKKwkJc21wX21iKCk7IC8qIGZsdXNoIGZfbW9kZSAqLworCQllcnIgPSBhdV9kZW55X3dy
aXRlX2FjY2VzcyhoX2ZpbGUpOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJZnB1dChoX2Zp
bGUpOworCQkJaF9maWxlID0gRVJSX1BUUihlcnIpOworCQl9CisJfQorCWlmICghSVNfRVJSKGhf
ZmlsZSkpCisJCXJldHVybiBoX2ZpbGU7CisKKwlhdV9icl9wdXQoYnIpOworCUF1VHJhY2VFcnJQ
dHIoaF9maWxlKTsKKwlyZXR1cm4gaF9maWxlOworfQorCitzdGF0aWMgaW50IGRvX2NvbyhzdHJ1
Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYnN0YXJ0KQoreworCWludCBlcnI7CisJ
c3RydWN0IGRlbnRyeSAqcGFyZW50LCAqaF9wYXJlbnQsICpoX2RlbnRyeSwgKmdwYXJlbnQ7CisJ
YXVmc19iaW5kZXhfdCBiY3B1cDsKKwlzdHJ1Y3QgaW5vZGUgKmhfZGlyLCAqaF9pbm9kZSwgKmRp
cjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCisJTEtUUlRyYWNlKCIlLipzXG4iLCBBdURM
TlBhaXIoZGVudHJ5KSk7CisJQXVEZWJ1Z09uKElTX1JPT1QoZGVudHJ5KSk7CisJRGlNdXN0V3Jp
dGVMb2NrKGRlbnRyeSk7CisKKwlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCWRpX3dy
aXRlX2xvY2tfcGFyZW50KHBhcmVudCk7CisJc2IgPSBkZW50cnktPmRfc2I7CisJZXJyID0gQXVX
YnJDb3B5dXAoYXVfc2JpKHNiKSwgZGVudHJ5KTsKKwliY3B1cCA9IGVycjsKKwlpZiAoZXJyIDwg
MCkgeworCQllcnIgPSAwOyAvKiBzdG9wIGNvcHl1cCwgaXQgaXMgbm90IGFuIGVycm9yICovCisJ
CWdvdG8gb3V0OworCX0KKwllcnIgPSAwOworCisJaF9wYXJlbnQgPSBhdV9oX2RwdHIocGFyZW50
LCBiY3B1cCk7CisJaWYgKCFoX3BhcmVudCkgeworCQllcnIgPSBhdV9jcHVwX2RpcnMoZGVudHJ5
LCBiY3B1cCwgTlVMTCk7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJZ290byBvdXQ7CisJCWhf
cGFyZW50ID0gYXVfaF9kcHRyKHBhcmVudCwgYmNwdXApOworCX0KKworCWhfZGlyID0gaF9wYXJl
bnQtPmRfaW5vZGU7CisJaF9kZW50cnkgPSBhdV9oX2RwdHIoZGVudHJ5LCBic3RhcnQpOworCWhf
aW5vZGUgPSBoX2RlbnRyeS0+ZF9pbm9kZTsKKwlkaXIgPSBwYXJlbnQtPmRfaW5vZGU7CisJLy90
b2RvOiBtZWFuaW5nbGVzcyBsb2NrIGlmIENPTkZJR19BVUZTX0RFQlVHIGlzIGRpc2FibGVkLgor
CWdwYXJlbnQgPSBOVUxMOworCWlmICh1bmxpa2VseShhdV9vcHRfdGVzdChhdV9tbnRmbGFncyhz
YiksIFVEQkFfSU5PVElGWSkKKwkJICAgICAmJiAhSVNfUk9PVChwYXJlbnQpKSkgeworCQlncGFy
ZW50ID0gZGdldF9wYXJlbnQocGFyZW50KTsKKwkJaWlfcmVhZF9sb2NrX3BhcmVudDIoZ3BhcmVu
dC0+ZF9pbm9kZSk7CisJfQorCWF1X2hkaXJfbG9jayhoX2RpciwgZGlyLCBiY3B1cCk7CisJLy90
b2RvOiB0ZXN0IHBhcmVudC1ncGFyZW50IHJlbGF0aW9uc2hpcAorCW11dGV4X2xvY2tfbmVzdGVk
KCZoX2lub2RlLT5pX211dGV4LCBBdUxzY19JX0NISUxEKTsKKwlBdURlYnVnT24oYXVfaF9kcHRy
KGRlbnRyeSwgYmNwdXApKTsKKwllcnIgPSBhdV9zaW9fY3B1cF9zaW1wbGUoZGVudHJ5LCBiY3B1
cCwgLTEsIEF1Q3B1cF9EVElNRSk7CisJQXVUcmFjZUVycihlcnIpOworCW11dGV4X3VubG9jaygm
aF9pbm9kZS0+aV9tdXRleCk7CisJYXVfaGRpcl91bmxvY2soaF9kaXIsIGRpciwgYmNwdXApOwor
CWlmICh1bmxpa2VseShncGFyZW50KSkgeworCQlpaV9yZWFkX3VubG9jayhncGFyZW50LT5kX2lu
b2RlKTsKKwkJZHB1dChncGFyZW50KTsKKwl9CisKKyBvdXQ6CisJZGlfd3JpdGVfdW5sb2NrKHBh
cmVudCk7CisJZHB1dChwYXJlbnQpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOwor
fQorCitpbnQgYXVfZG9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmls
ZSwKKwkgICAgICAgaW50ICgqb3Blbikoc3RydWN0IGZpbGUgKmZpbGUsIGludCBmbGFncykpCit7
CisJaW50IGVyciwgY29vOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiOworCWF1ZnNfYmluZGV4X3QgYnN0YXJ0OworCS8vc3RydWN0IGlub2RlICpoX2Rp
ciwgKmRpcjsKKworCWRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCUxLVFJUcmFjZSgiaSVsdSwg
JS4qc1xuIiwgaW5vZGUtPmlfaW5vLCBBdURMTlBhaXIoZGVudHJ5KSk7CisKKwlzYiA9IGRlbnRy
eS0+ZF9zYjsKKwlzaV9yZWFkX2xvY2soc2IsIEF1TG9ja19GTFVTSCk7CisJY29vID0gMDsKKwlz
d2l0Y2ggKGF1X21udGZsYWdzKHNiKSAmIEF1T3B0TWFza19DT08pIHsKKwljYXNlIEF1T3B0X0NP
T19MRUFGOgorCQljb28gPSAhU19JU0RJUihpbm9kZS0+aV9tb2RlKTsKKwkJYnJlYWs7CisJY2Fz
ZSBBdU9wdF9DT09fQUxMOgorCQljb28gPSAxOworCQlicmVhazsKKwl9CisJZXJyID0gYXVfZmlu
Zm9faW5pdChmaWxlKTsKKwkvL2lmIChMa3RyQ29uZCkge2ZpX3dyaXRlX3VubG9jayhmaWxlKTsg
ZmluX2ZpbmZvKGZpbGUpOyBlcnIgPSAtMTt9CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8g
b3V0OworCisJaWYgKCFjb28pIHsKKwkJZGlfcmVhZF9sb2NrX2NoaWxkKGRlbnRyeSwgQXVMb2Nr
X0lSKTsKKwkJYnN0YXJ0ID0gYXVfZGJzdGFydChkZW50cnkpOworCX0gZWxzZSB7CisJCWRpX3dy
aXRlX2xvY2tfY2hpbGQoZGVudHJ5KTsKKwkJYnN0YXJ0ID0gYXVfZGJzdGFydChkZW50cnkpOwor
CQlpZiAoYXVfdGVzdF9ybyhzYiwgYnN0YXJ0LCBkZW50cnktPmRfaW5vZGUpKSB7CisJCQllcnIg
PSBkb19jb28oZGVudHJ5LCBic3RhcnQpOworCQkJaWYgKGVycikgeworCQkJCWRpX3dyaXRlX3Vu
bG9jayhkZW50cnkpOworCQkJCWdvdG8gb3V0X2ZpbmZvOworCQkJfQorCQkJYnN0YXJ0ID0gYXVf
ZGJzdGFydChkZW50cnkpOworCQl9CisJCWRpX2Rvd25ncmFkZV9sb2NrKGRlbnRyeSwgQXVMb2Nr
X0lSKTsKKwl9CisKKwllcnIgPSBvcGVuKGZpbGUsIGZpbGUtPmZfZmxhZ3MpOworCS8vaWYgKExr
dHJDb25kKSBlcnIgPSAtMTsKKwlkaV9yZWFkX3VubG9jayhkZW50cnksIEF1TG9ja19JUik7CisK
KyBvdXRfZmluZm86CisJZmlfd3JpdGVfdW5sb2NrKGZpbGUpOworCWlmICh1bmxpa2VseShlcnIp
KQorCQlhdV9maW5mb19maW4oZmlsZSk7CisJLy9EYmdGaWxlKGZpbGUpOworIG91dDoKKwlzaV9y
ZWFkX3VubG9jayhzYik7CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK2lu
dCBhdV9yZW9wZW5fbm9uZGlyKHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBlcnI7CisJc3Ry
dWN0IGRlbnRyeSAqZGVudHJ5OworCWF1ZnNfYmluZGV4X3QgYnN0YXJ0LCBiaW5kZXgsIGJlbmQ7
CisJc3RydWN0IGZpbGUgKmhfZmlsZSwgKmhfZmlsZV90bXA7CisKKwlkZW50cnkgPSBmaWxlLT5m
X2RlbnRyeTsKKwlMS1RSVHJhY2UoIiUuKnNcbiIsIEF1RExOUGFpcihkZW50cnkpKTsKKwlic3Rh
cnQgPSBhdV9kYnN0YXJ0KGRlbnRyeSk7CisJQXVEZWJ1Z09uKFNfSVNESVIoZGVudHJ5LT5kX2lu
b2RlLT5pX21vZGUpCisJCSAgfHwgIWF1X2hfZHB0cihkZW50cnksIGJzdGFydCktPmRfaW5vZGUp
OworCisJaF9maWxlX3RtcCA9IE5VTEw7CisJaWYgKGF1X2Zic3RhcnQoZmlsZSkgPT0gYnN0YXJ0
KSB7CisJCWhfZmlsZSA9IGF1X2hfZnB0cihmaWxlLCBic3RhcnQpOworCQlpZiAoZmlsZS0+Zl9t
b2RlID09IGhfZmlsZS0+Zl9tb2RlKQorCQkJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKwkJaF9m
aWxlX3RtcCA9IGhfZmlsZTsKKwkJZ2V0X2ZpbGUoaF9maWxlX3RtcCk7CisJCWF1X3NldF9oX2Zw
dHIoZmlsZSwgYnN0YXJ0LCBOVUxMKTsKKwl9CisJQXVEZWJ1Z09uKGF1X2Zic3RhcnQoZmlsZSkg
PCBic3RhcnQKKwkJICB8fCBhdV9maShmaWxlKS0+ZmlfaGZpbGVbMCArIGJzdGFydF0uaGZfZmls
ZSk7CisKKwloX2ZpbGUgPSBhdV9oX29wZW4oZGVudHJ5LCBic3RhcnQsIGZpbGUtPmZfZmxhZ3Mg
JiB+T19UUlVOQywgZmlsZSk7CisJLy9pZiAoTGt0ckNvbmQpIHtmcHV0KGhfZmlsZSk7IGF1X2Jy
X3B1dChhdV9zYnIoZGVudHJ5LT5kX3NiLCBic3RhcnQpKTsKKwkvL2hfZmlsZSA9IEVSUl9QVFIo
LTEpO30KKwllcnIgPSBQVFJfRVJSKGhfZmlsZSk7CisJaWYgKElTX0VSUihoX2ZpbGUpKQorCQln
b3RvIG91dDsgLy8gY2xvc2UgYWxsPworCWVyciA9IDA7CisJLy9jcHVwX2ZpbGVfZmxhZ3MoaF9m
aWxlLCBmaWxlKTsKKwlhdV9zZXRfZmJzdGFydChmaWxlLCBic3RhcnQpOworCWF1X3NldF9oX2Zw
dHIoZmlsZSwgYnN0YXJ0LCBoX2ZpbGUpOworCWF1X3VwZGF0ZV9maWdlbihmaWxlKTsKKwkvL2Zp
bGUtPmZfcmEgPSBoX2ZpbGUtPmZfcmE7IC8vPz8KKworCS8qIGNsb3NlIGxvd2VyIGZpbGVzICov
CisJYmVuZCA9IGF1X2ZiZW5kKGZpbGUpOworCWZvciAoYmluZGV4ID0gYnN0YXJ0ICsgMTsgYmlu
ZGV4IDw9IGJlbmQ7IGJpbmRleCsrKQorCQlhdV9zZXRfaF9mcHRyKGZpbGUsIGJpbmRleCwgTlVM
TCk7CisJYXVfc2V0X2ZiZW5kKGZpbGUsIGJzdGFydCk7CisKKyBvdXQ6CisJaWYgKGhfZmlsZV90
bXApCisJCWZwdXQoaF9maWxlX3RtcCk7CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7
Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHByZXBhcmUgdGhlIEBmaWxlIGZv
ciB3cml0aW5nLgorICovCitpbnQgYXVfcmVhZHlfdG9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUs
IGxvZmZfdCBsZW4pCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksICpwYXJl
bnQsICpoX2RlbnRyeSwgKmhfcGFyZW50LCAqaGlfd2gsCisJCSpvbGRfaF9kZW50cnksICpncGFy
ZW50OworCXN0cnVjdCBpbm9kZSAqaF9pbm9kZSwgKmhfZGlyLCAqaW5vZGUsICpkaXI7CisJc3Ry
dWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlhdWZzX2JpbmRleF90IGJzdGFydCwgYmNwdXAsIG9sZF9i
c3RhcnQ7CisJc3RydWN0IGF1X2RpbmZvICpkaW5mbzsKKworCWRlbnRyeSA9IGZpbGUtPmZfZGVu
dHJ5OworCUxLVFJUcmFjZSgiJS4qcywgbGVuICVMZFxuIiwgQXVETE5QYWlyKGRlbnRyeSksIGxl
bik7CisJRmlNdXN0V3JpdGVMb2NrKGZpbGUpOworCisJc2IgPSBkZW50cnktPmRfc2I7CisJYnN0
YXJ0ID0gYXVfZmJzdGFydChmaWxlKTsKKwlBdURlYnVnT24oYXVfZmJyKGZpbGUsIGJzdGFydCkg
IT0gYXVfc2JyKHNiLCBic3RhcnQpKTsKKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCUF1
RGVidWdPbihTX0lTRElSKGlub2RlLT5pX21vZGUpKTsKKwlpaV9yZWFkX2xvY2tfY2hpbGQoaW5v
ZGUpOworCUxLVFJUcmFjZSgicmRvbmx5ICVkLCBic3RhcnQgJWRcbiIsCisJCSAgYXVfdGVzdF9y
byhzYiwgYnN0YXJ0LCBpbm9kZSksIGJzdGFydCk7CisJZXJyID0gYXVfdGVzdF9ybyhzYiwgYnN0
YXJ0LCBpbm9kZSk7CisJaWlfcmVhZF91bmxvY2soaW5vZGUpOworCWlmICghZXJyICYmIChhdV9o
X2ZwdHIoZmlsZSwgYnN0YXJ0KS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQlyZXR1cm4gMDsK
KworCS8qIG5lZWQgdG8gY3B1cCAqLworCWRpX3dyaXRlX2xvY2tfY2hpbGQoZGVudHJ5KTsKKwlw
YXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCWRpX3dyaXRlX2xvY2tfcGFyZW50KHBhcmVu
dCk7CisJZXJyID0gQXVXYnJDb3B5dXAoYXVfc2JpKHNiKSwgZGVudHJ5KTsKKwliY3B1cCA9IGVy
cjsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCWdvdG8gb3V0X3VubG9jazsKKwllcnIgPSAw
OworCisJaF9wYXJlbnQgPSBhdV9oX2RwdHIocGFyZW50LCBiY3B1cCk7CisJaWYgKCFoX3BhcmVu
dCkgeworCQllcnIgPSBhdV9jcHVwX2RpcnMoZGVudHJ5LCBiY3B1cCwgTlVMTCk7CisJCS8vaWYg
KExrdHJDb25kKSBlcnIgPSAtMTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dF91
bmxvY2s7CisJCWhfcGFyZW50ID0gYXVfaF9kcHRyKHBhcmVudCwgYmNwdXApOworCX0KKworCS8v
dG9kbzogbWVhbmluZ2xlc3MgbG9jayBpZiBDT05GSUdfQVVGU19ERUJVRyBpcyBkaXNhYmxlZC4K
KwlncGFyZW50ID0gTlVMTDsKKwlpZiAodW5saWtlbHkoYXVfb3B0X3Rlc3QoYXVfbW50ZmxhZ3Mo
c2IpLCBVREJBX0lOT1RJRlkpCisJCSAgICAgJiYgIUlTX1JPT1QocGFyZW50KSkpIHsKKwkJZ3Bh
cmVudCA9IGRnZXRfcGFyZW50KHBhcmVudCk7CisJCWlpX3JlYWRfbG9ja19wYXJlbnQyKGdwYXJl
bnQtPmRfaW5vZGUpOworCX0KKwloX2RpciA9IGhfcGFyZW50LT5kX2lub2RlOworCWhfZGVudHJ5
ID0gYXVfaF9mcHRyKGZpbGUsIGF1X2Zic3RhcnQoZmlsZSkpLT5mX2RlbnRyeTsKKwloX2lub2Rl
ID0gaF9kZW50cnktPmRfaW5vZGU7CisJZGlyID0gcGFyZW50LT5kX2lub2RlOworCWF1X2hkaXJf
bG9jayhoX2RpciwgZGlyLCBiY3B1cCk7CisJLy90b2RvOiB0ZXN0IHBhcmVudC1ncGFyZW50IHJl
bGF0aW9uc2hpcAorCW11dGV4X2xvY2tfbmVzdGVkKCZoX2lub2RlLT5pX211dGV4LCBBdUxzY19J
X0NISUxEKTsKKwlpZiAoZF91bmhhc2hlZChkZW50cnkpIC8qIHx8IGRfdW5oYXNoZWQoaF9kZW50
cnkpICovCisJICAgIC8qIHx8ICFoX2lub2RlLT5pX25saW5rICovKSB7CisJCWhpX3doID0gYXVf
aGlfd2goaW5vZGUsIGJjcHVwKTsKKwkJaWYgKCFoaV93aCkKKwkJCWVyciA9IGF1X3Npb19jcHVw
X3doKGRlbnRyeSwgYmNwdXAsIGxlbiwgZmlsZSk7CisJCWVsc2UgeworCQkJLyogYWxyZWFkeSBj
b3BpZWQtdXAgYWZ0ZXIgdW5saW5rICovCisJCQlkaW5mbyA9IGF1X2RpKGRlbnRyeSk7CisJCQlv
bGRfYnN0YXJ0ID0gZGluZm8tPmRpX2JzdGFydDsKKwkJCWRpbmZvLT5kaV9ic3RhcnQgPSBiY3B1
cDsKKwkJCW9sZF9oX2RlbnRyeSA9IGRpbmZvLT5kaV9oZGVudHJ5WzAgKyBiY3B1cF0uaGRfZGVu
dHJ5OworCQkJZGluZm8tPmRpX2hkZW50cnlbMCArIGJjcHVwXS5oZF9kZW50cnkgPSBoaV93aDsK
KwkJCWVyciA9IGF1X3Jlb3Blbl9ub25kaXIoZmlsZSk7CisJCQlkaW5mby0+ZGlfaGRlbnRyeVsw
ICsgYmNwdXBdLmhkX2RlbnRyeSA9IG9sZF9oX2RlbnRyeTsKKwkJCWRpbmZvLT5kaV9ic3RhcnQg
PSBvbGRfYnN0YXJ0OworCQl9CisJCS8vaWYgKExrdHJDb25kKSBlcnIgPSAtMTsKKwkJQXVUcmFj
ZUVycihlcnIpOworCX0gZWxzZSB7CisJCWlmICghYXVfaF9kcHRyKGRlbnRyeSwgYmNwdXApKQor
CQkJZXJyID0gYXVfc2lvX2NwdXBfc2ltcGxlKGRlbnRyeSwgYmNwdXAsIGxlbiwKKwkJCQkJCSBB
dUNwdXBfRFRJTUUpOworCQkvL2lmIChMa3RyQ29uZCkgZXJyID0gLTE7CisJCUF1VHJhY2VFcnIo
ZXJyKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBhdV9yZW9wZW5fbm9uZGlyKGZpbGUpOworCQkv
L2lmIChMa3RyQ29uZCkgZXJyID0gLTE7CisJCUF1VHJhY2VFcnIoZXJyKTsKKwl9CisJbXV0ZXhf
dW5sb2NrKCZoX2lub2RlLT5pX211dGV4KTsKKwlhdV9oZGlyX3VubG9jayhoX2RpciwgZGlyLCBi
Y3B1cCk7CisJaWYgKHVubGlrZWx5KGdwYXJlbnQpKSB7CisJCWlpX3JlYWRfdW5sb2NrKGdwYXJl
bnQtPmRfaW5vZGUpOworCQlkcHV0KGdwYXJlbnQpOworCX0KKworIG91dF91bmxvY2s6CisJZGlf
d3JpdGVfdW5sb2NrKHBhcmVudCk7CisJZGlfd3JpdGVfdW5sb2NrKGRlbnRyeSk7CisJZHB1dChw
YXJlbnQpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworCit9CisKKy8qIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gKi8KKworc3RhdGljIGludCByZWZyZXNoX2ZpbGVfYnlfaW5vZGUoc3RydWN0IGZp
bGUgKmZpbGUsIGludCAqbmVlZF9yZW9wZW4pCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgYXVfZmlu
Zm8gKmZpbmZvOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgKnBhcmVudCwgKm9sZF9oX2RlbnRy
eSwgKmhpX3doOworCXN0cnVjdCBpbm9kZSAqaW5vZGUsICpkaXIsICpoX2RpcjsKKwlhdWZzX2Jp
bmRleF90IGJzdGFydCwgbmV3X2JzdGFydCwgb2xkX2JzdGFydDsKKwlzdHJ1Y3Qgc3VwZXJfYmxv
Y2sgKnNiOworCXN0cnVjdCBhdV9kaW5mbyAqZGluZm87CisKKwlkZW50cnkgPSBmaWxlLT5mX2Rl
bnRyeTsKKwlMS1RSVHJhY2UoIiUuKnNcbiIsIEF1RExOUGFpcihkZW50cnkpKTsKKwlGaU11c3RX
cml0ZUxvY2soZmlsZSk7CisKKwllcnIgPSAwOworCWZpbmZvID0gYXVfZmkoZmlsZSk7CisJaW5v
ZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc2IgPSBkZW50cnktPmRfc2I7CisgYWdhaW46CisJYnN0
YXJ0ID0gYXVfaWJzdGFydChpbm9kZSk7CisJaWYgKGJzdGFydCA9PSBmaW5mby0+ZmlfYnN0YXJ0
KQorCQlnb3RvIG91dDsKKworCW5ld19ic3RhcnQgPSBic3RhcnQ7CisJcGFyZW50ID0gZGdldF9w
YXJlbnQoZGVudHJ5KTsKKwlkaXIgPSBwYXJlbnQtPmRfaW5vZGU7CisJaWYgKGF1X3Rlc3Rfcm8o
c2IsIGJzdGFydCwgaW5vZGUpKSB7CisJCWRpX3JlYWRfbG9ja19wYXJlbnQocGFyZW50LCAhQXVM
b2NrX0lSKTsKKwkJZXJyID0gQXVXYnJDb3B5dXAoYXVfc2JpKHNiKSwgZGVudHJ5KTsKKwkJbmV3
X2JzdGFydCA9IGVycjsKKwkJZGlfcmVhZF91bmxvY2socGFyZW50LCAhQXVMb2NrX0lSKTsKKwkJ
Ly90b2RvOiBlcnIgPSAtMTsKKwkJaWYgKHVubGlrZWx5KGVyciA8IDApKQorCQkJZ290byBvdXRf
cHV0OworCX0KKwlkaV9yZWFkX3VubG9jayhkZW50cnksIEF1TG9ja19JUik7CisJZGlfd3JpdGVf
bG9ja19jaGlsZChkZW50cnkpOworCS8qIHNvbWVvbmUgZWxzZSBtaWdodCBjaGFuZ2Ugb3VyIGlu
b2RlIHdoaWxlIHdlIHdlcmUgc2xlZXBpbmcgKi8KKwlpZiAoYnN0YXJ0ICE9IGF1X2lic3RhcnQo
aW5vZGUpKSB7IC8vIHRvZG8KKwkJZGlfZG93bmdyYWRlX2xvY2soZGVudHJ5LCBBdUxvY2tfSVIp
OworCQllcnIgPSAwOworCQlkcHV0KHBhcmVudCk7CisJCWdvdG8gYWdhaW47CisJfQorCWRpX3Jl
YWRfbG9ja19wYXJlbnQocGFyZW50LCBBdUxvY2tfSVIpOworCWJzdGFydCA9IG5ld19ic3RhcnQ7
CisKKwloaV93aCA9IGF1X2hpX3doKGlub2RlLCBic3RhcnQpOworCWlmIChhdV9vcHRfdGVzdChh
dV9tbnRmbGFncyhzYiksIFBMSU5LKQorCSAgICAmJiBhdV9wbGlua190ZXN0KHNiLCBpbm9kZSkK
KwkgICAgJiYgIWRfdW5oYXNoZWQoZGVudHJ5KSkgeworCQllcnIgPSBhdV90ZXN0X2FuZF9jcHVw
X2RpcnMoZGVudHJ5LCBic3RhcnQsIE5VTEwpOworCisJCS8qIGFsd2F5cyBzdXBlcmlvLiAqLwor
CQloX2RpciA9IGF1X2hfZHB0cihwYXJlbnQsIGJzdGFydCktPmRfaW5vZGU7CisJCWF1X2hkaXJf
bG9jayhoX2RpciwgZGlyLCBic3RhcnQpOworCQllcnIgPSBhdV9zaW9fY3B1cF9zaW1wbGUoZGVu
dHJ5LCBic3RhcnQsIC0xLCBBdUNwdXBfRFRJTUUpOworCQlhdV9oZGlyX3VubG9jayhoX2Rpciwg
ZGlyLCBic3RhcnQpOworCX0gZWxzZSBpZiAoaGlfd2gpIHsKKwkJLyogYWxyZWFkeSBjb3BpZWQt
dXAgYWZ0ZXIgdW5saW5rICovCisJCWRpbmZvID0gYXVfZGkoZGVudHJ5KTsKKwkJb2xkX2JzdGFy
dCA9IGRpbmZvLT5kaV9ic3RhcnQ7CisJCWRpbmZvLT5kaV9ic3RhcnQgPSBic3RhcnQ7CisJCW9s
ZF9oX2RlbnRyeSA9IGRpbmZvLT5kaV9oZGVudHJ5WzAgKyBic3RhcnRdLmhkX2RlbnRyeTsKKwkJ
ZGluZm8tPmRpX2hkZW50cnlbMCArIGJzdGFydF0uaGRfZGVudHJ5ID0gaGlfd2g7CisJCWVyciA9
IGF1X3Jlb3Blbl9ub25kaXIoZmlsZSk7CisJCWRpbmZvLT5kaV9oZGVudHJ5WzAgKyBic3RhcnRd
LmhkX2RlbnRyeSA9IG9sZF9oX2RlbnRyeTsKKwkJZGluZm8tPmRpX2JzdGFydCA9IG9sZF9ic3Rh
cnQ7CisJCSpuZWVkX3Jlb3BlbiA9IDA7CisJfQorCWRpX3JlYWRfdW5sb2NrKHBhcmVudCwgQXVM
b2NrX0lSKTsKKwlkaV9kb3duZ3JhZGVfbG9jayhkZW50cnksIEF1TG9ja19JUik7CisKKyBvdXRf
cHV0OgorCWRwdXQocGFyZW50KTsKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBl
cnI7Cit9CisKKy8qCisgKiBhZnRlciBicmFuY2ggbWFuaXB1bGF0aW5nLCByZWZyZXNoIHRoZSBm
aWxlLgorICovCitzdGF0aWMgaW50IHJlZnJlc2hfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50
ICgqcmVvcGVuKShzdHJ1Y3QgZmlsZSAqZmlsZSkpCit7CisJaW50IGVyciwgbmV3X3N6LCBuZWVk
X3Jlb3BlbjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJYXVmc19iaW5kZXhfdCBiZW5kLCBi
aW5kZXgsIGJzdGFydCwgYnJpZDsKKwlzdHJ1Y3QgYXVfaGZpbGUgKnA7CisJc3RydWN0IGF1X2Zp
bmZvICpmaW5mbzsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBpbm9kZSAqaW5v
ZGU7CisJc3RydWN0IGZpbGUgKmhpZGRlbl9maWxlOworCisJZGVudHJ5ID0gZmlsZS0+Zl9kZW50
cnk7CisJTEtUUlRyYWNlKCIlLipzXG4iLCBBdURMTlBhaXIoZGVudHJ5KSk7CisJRmlNdXN0V3Jp
dGVMb2NrKGZpbGUpOworCURpTXVzdFJlYWRMb2NrKGRlbnRyeSk7CisJaW5vZGUgPSBkZW50cnkt
PmRfaW5vZGU7CisJSWlNdXN0UmVhZExvY2soaW5vZGUpOworCisJZXJyID0gLUVOT01FTTsKKwlz
YiA9IGRlbnRyeS0+ZF9zYjsKKwlmaW5mbyA9IGF1X2ZpKGZpbGUpOworCWJzdGFydCA9IGZpbmZv
LT5maV9ic3RhcnQ7CisJYmVuZCA9IGZpbmZvLT5maV9ic3RhcnQ7CisJbmV3X3N6ID0gc2l6ZW9m
KCpmaW5mby0+ZmlfaGZpbGUpICogKGF1X3NiZW5kKHNiKSArIDEpOworCXAgPSBhdV9renJlYWxs
b2MoZmluZm8tPmZpX2hmaWxlLCBzaXplb2YoKnApICogKGZpbmZvLT5maV9iZW5kICsgMSksCisJ
CQkgbmV3X3N6LCBHRlBfS0VSTkVMKTsKKwkvL3AgPSBOVUxMOworCWlmICh1bmxpa2VseSghcCkp
CisJCWdvdG8gb3V0OworCWZpbmZvLT5maV9oZmlsZSA9IHA7CisJaGlkZGVuX2ZpbGUgPSBwWzAg
KyBic3RhcnRdLmhmX2ZpbGU7CisKKwlwID0gZmluZm8tPmZpX2hmaWxlICsgZmluZm8tPmZpX2Jz
dGFydDsKKwlicmlkID0gcC0+aGZfYnItPmJyX2lkOworCWJlbmQgPSBmaW5mby0+ZmlfYmVuZDsK
Kwlmb3IgKGJpbmRleCA9IGZpbmZvLT5maV9ic3RhcnQ7IGJpbmRleCA8PSBiZW5kOyBiaW5kZXgr
KywgcCsrKSB7CisJCXN0cnVjdCBhdV9oZmlsZSB0bXAsICpxOworCQlhdWZzX2JpbmRleF90IG5l
d19iaW5kZXg7CisKKwkJaWYgKCFwLT5oZl9maWxlKQorCQkJY29udGludWU7CisJCW5ld19iaW5k
ZXggPSBhdV9maW5kX2JpbmRleChzYiwgcC0+aGZfYnIpOworCQlpZiAobmV3X2JpbmRleCA9PSBi
aW5kZXgpCisJCQljb250aW51ZTsKKwkJaWYgKG5ld19iaW5kZXggPCAwKSB7IC8vIHRlc3QgaGVy
ZQorCQkJYXVfc2V0X2hfZnB0cihmaWxlLCBiaW5kZXgsIE5VTEwpOworCQkJY29udGludWU7CisJ
CX0KKworCQkvKiBzd2FwIHR3byBoaWRkZW4gaW5vZGUsIGFuZCBsb29wIGFnYWluICovCisJCXEg
PSBmaW5mby0+ZmlfaGZpbGUgKyBuZXdfYmluZGV4OworCQl0bXAgPSAqcTsKKwkJKnEgPSAqcDsK
KwkJKnAgPSB0bXA7CisJCWlmICh0bXAuaGZfZmlsZSkgeworCQkJYmluZGV4LS07CisJCQlwLS07
CisJCX0KKwl9CisJeworCQlhdWZzX2JpbmRleF90IHMgPSBmaW5mby0+ZmlfYnN0YXJ0LCBlID0g
ZmluZm8tPmZpX2JlbmQ7CisJCWZpbmZvLT5maV9ic3RhcnQgPSAwOworCQlmaW5mby0+ZmlfYmVu
ZCA9IGF1X3NiZW5kKHNiKTsKKwkJZmluZm8tPmZpX2JzdGFydCA9IHM7CisJCWZpbmZvLT5maV9i
ZW5kID0gZTsKKwl9CisKKwlwID0gZmluZm8tPmZpX2hmaWxlOworCWlmICghYXVfdGVzdF9tbWFw
cGVkKGZpbGUpICYmICFkX3VuaGFzaGVkKGRlbnRyeSkpIHsKKwkJYmVuZCA9IGF1X3NiZW5kKHNi
KTsKKwkJZm9yIChmaW5mby0+ZmlfYnN0YXJ0ID0gMDsgZmluZm8tPmZpX2JzdGFydCA8PSBiZW5k
OworCQkgICAgIGZpbmZvLT5maV9ic3RhcnQrKywgcCsrKQorCQkJaWYgKHAtPmhmX2ZpbGUpIHsK
KwkJCQlpZiAocC0+aGZfZmlsZS0+Zl9kZW50cnkKKwkJCQkgICAgJiYgcC0+aGZfZmlsZS0+Zl9k
ZW50cnktPmRfaW5vZGUpCisJCQkJCWJyZWFrOworCQkJCWVsc2UKKwkJCQkJYXVfaGZwdXQocCk7
CisJCQl9CisJfSBlbHNlIHsKKwkJYmVuZCA9IGF1X2JyX2luZGV4KHNiLCBicmlkKTsKKwkJLy9M
S1RSVHJhY2UoIiVkXG4iLCBiZW5kKTsKKwkJZm9yIChmaW5mby0+ZmlfYnN0YXJ0ID0gMDsgZmlu
Zm8tPmZpX2JzdGFydCA8IGJlbmQ7CisJCSAgICAgZmluZm8tPmZpX2JzdGFydCsrLCBwKyspCisJ
CQlpZiAocC0+aGZfZmlsZSkKKwkJCQlhdV9oZnB1dChwKTsKKwkJLy9MS1RSVHJhY2UoIiVkXG4i
LCBmaW5mby0+ZmlfYnN0YXJ0KTsKKwkJYmVuZCA9IGF1X3NiZW5kKHNiKTsKKwl9CisKKwlwID0g
ZmluZm8tPmZpX2hmaWxlICsgYmVuZDsKKwlmb3IgKGZpbmZvLT5maV9iZW5kID0gYmVuZDsgZmlu
Zm8tPmZpX2JlbmQgPj0gZmluZm8tPmZpX2JzdGFydDsKKwkgICAgIGZpbmZvLT5maV9iZW5kLS0s
IHAtLSkKKwkJaWYgKHAtPmhmX2ZpbGUpIHsKKwkJCWlmIChwLT5oZl9maWxlLT5mX2RlbnRyeQor
CQkJICAgICYmIHAtPmhmX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKQorCQkJCWJyZWFrOworCQkJ
ZWxzZQorCQkJCWF1X2hmcHV0KHApOworCQl9CisJQXVEZWJ1Z09uKGZpbmZvLT5maV9iZW5kIDwg
ZmluZm8tPmZpX2JzdGFydCk7CisJLy9EYmdGaWxlKGZpbGUpOworCS8vRGJnRGVudHJ5KGZpbGUt
PmZfZGVudHJ5KTsKKworCWVyciA9IDA7CisJbmVlZF9yZW9wZW4gPSAxOworCWlmICghYXVfdGVz
dF9tbWFwcGVkKGZpbGUpKQorCQllcnIgPSByZWZyZXNoX2ZpbGVfYnlfaW5vZGUoZmlsZSwgJm5l
ZWRfcmVvcGVuKTsKKwlpZiAoIWVyciAmJiBuZWVkX3Jlb3BlbiAmJiAhZF91bmhhc2hlZChkZW50
cnkpKQorCQllcnIgPSByZW9wZW4oZmlsZSk7CisJCS8vZXJyID0gLTE7CisJaWYgKCFlcnIpIHsK
KwkJYXVfdXBkYXRlX2ZpZ2VuKGZpbGUpOworCQkvL0RiZ0ZpbGUoZmlsZSk7CisJCXJldHVybiAw
OyAvKiBzdWNjZXNzICovCisJfQorCisJLyogZXJyb3IsIGNsb3NlIGFsbCBoaWRkZW4gZmlsZXMg
Ki8KKwliZW5kID0gYXVfZmJlbmQoZmlsZSk7CisJZm9yIChiaW5kZXggPSBhdV9mYnN0YXJ0KGZp
bGUpOyBiaW5kZXggPD0gYmVuZDsgYmluZGV4KyspCisJCWF1X3NldF9oX2ZwdHIoZmlsZSwgYmlu
ZGV4LCBOVUxMKTsKKworIG91dDoKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30K
KworLyogY29tbW9uIGZ1bmN0aW9uIHRvIHJlZ3VsYXIgZmlsZSBhbmQgZGlyICovCitpbnQgYXVf
cmV2YWxfYW5kX2xvY2tfZmluZm8oc3RydWN0IGZpbGUgKmZpbGUsIGludCAoKnJlb3Blbikoc3Ry
dWN0IGZpbGUgKmZpbGUpLAorCQkJICAgIGludCB3bG9jaywgaW50IGxvY2tlZCkKK3sKKwlpbnQg
ZXJyLCBwc2V1ZG9fbGluazsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IHN1cGVy
X2Jsb2NrICpzYjsKKwlhdWZzX2JpbmRleF90IGJzdGFydDsKKwlhdV9nZW5fdCBzZ2VuLCBmZ2Vu
OworCisJZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJTEtUUlRyYWNlKCIlLipzLCB3ICVkLCBs
ICVkXG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgd2xvY2ssIGxvY2tlZCk7CisJc2IgPSBkZW50cnkt
PmRfc2I7CisJU2lNdXN0QW55TG9jayhzYik7CisKKwllcnIgPSAwOworCXNnZW4gPSBhdV9zaWdl
bihzYik7CisJZmlfd3JpdGVfbG9jayhmaWxlKTsKKwlmZ2VuID0gYXVfZmlnZW4oZmlsZSk7CisJ
ZGlfcmVhZF9sb2NrX2NoaWxkKGRlbnRyeSwgQXVMb2NrX0lSKTsKKwlic3RhcnQgPSBhdV9kYnN0
YXJ0KGRlbnRyeSk7CisJcHNldWRvX2xpbmsgPSAoYnN0YXJ0ICE9IGF1X2lic3RhcnQoZGVudHJ5
LT5kX2lub2RlKSk7CisJZGlfcmVhZF91bmxvY2soZGVudHJ5LCBBdUxvY2tfSVIpOworCWlmIChz
Z2VuID09IGZnZW4gJiYgIXBzZXVkb19saW5rICYmIGF1X2Zic3RhcnQoZmlsZSkgPT0gYnN0YXJ0
KSB7CisJCWlmICghd2xvY2spCisJCQlmaV9kb3duZ3JhZGVfbG9jayhmaWxlKTsKKwkJcmV0dXJu
IDA7IC8qIHN1Y2Nlc3MgKi8KKwl9CisKKwlMS1RSVHJhY2UoInNnZW4gJWQsIGZnZW4gJWRcbiIs
IHNnZW4sIGZnZW4pOworCWlmICh1bmxpa2VseShzZ2VuICE9IGF1X2RpZ2VuKGRlbnRyeSkKKwkJ
ICAgICB8fCBzZ2VuICE9IGF1X2lpZ2VuKGRlbnRyeS0+ZF9pbm9kZSkpKSB7CisJCS8qCisJCSAq
IGRfcGF0aCgpIGFuZCBwYXRoX2xvb2t1cCgpIGlzIGEgc2ltcGxlIGFuZCBnb29kIGFwcHJvYWNo
CisJCSAqIHRvIHJldmFsaWRhdGUuIGJ1dCBzaV9yd3NlbSBpbiBERUJVR19SV1NFTSB3aWxsIGNh
dXNlIGEKKwkJICogZGVhZGxvY2suIHJlbW92ZWQgdGhlIGNvZGUuCisJCSAqLworCQlkaV93cml0
ZV9sb2NrX2NoaWxkKGRlbnRyeSk7CisJCWVyciA9IGF1X3JldmFsX2RwYXRoKGRlbnRyeSwgc2dl
bik7CisJCS8vaWYgKExrdHJDb25kKSBlcnIgPSAtMTsKKwkJZGlfd3JpdGVfdW5sb2NrKGRlbnRy
eSk7CisJCWlmICh1bmxpa2VseShlcnIgPCAwKSkKKwkJCWdvdG8gb3V0OworCQlBdURlYnVnT24o
YXVfZGlnZW4oZGVudHJ5KSAhPSBzZ2VuCisJCQkgIHx8IGF1X2lpZ2VuKGRlbnRyeS0+ZF9pbm9k
ZSkgIT0gc2dlbik7CisJfQorCisJZGlfcmVhZF9sb2NrX2NoaWxkKGRlbnRyeSwgQXVMb2NrX0lS
KTsKKwllcnIgPSByZWZyZXNoX2ZpbGUoZmlsZSwgcmVvcGVuCisJCQkgICAvKiAsIGF1X29wdF90
ZXN0KGF1X21udF9mbGFncyhzYiksIFJFRlJPRikgKi8pOworCS8vaWYgKExrdHJDb25kKSBlcnIg
PSAtMTsKKwlkaV9yZWFkX3VubG9jayhkZW50cnksIEF1TG9ja19JUik7CisJaWYgKCFlcnIpIHsK
KwkJaWYgKCF3bG9jaykKKwkJCWZpX2Rvd25ncmFkZV9sb2NrKGZpbGUpOworCX0gZWxzZQorCQlm
aV93cml0ZV91bmxvY2soZmlsZSk7CisKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVy
biBlcnI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogY2YuIGF1ZnNfbm9wYWdlKCkg
Ki8KKy8qIGZvciBtYWR2aXNlKDIpICovCitzdGF0aWMgaW50IGF1ZnNfcmVhZHBhZ2Uoc3RydWN0
IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCUF1VHJhY2VFbnRlcigpOworCXVu
bG9ja19wYWdlKHBhZ2UpOworCXJldHVybiAwOworfQorCisvKiB0aGV5IHdpbGwgbmV2ZXIgYmUg
Y2FsbGVkLiAqLworI2lmZGVmIENPTkZJR19BVUZTX0RFQlVHCitzdGF0aWMgaW50IGF1ZnNfcHJl
cGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAg
ICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sgQXVVbnN1cHBvcnQoKTsgcmV0dXJuIDA7
IH0KK3N0YXRpYyBpbnQgYXVmc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVj
dCBwYWdlICpwYWdlLAorCQkJICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sgQXVV
bnN1cHBvcnQoKTsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbnQgYXVmc193cml0ZV9iZWdpbihzdHJ1
Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkgICAgbG9m
Zl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBmbGFncywKKwkJCSAgICBzdHJ1Y3QgcGFn
ZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhKQoreyBBdVVuc3VwcG9ydCgpOyByZXR1cm4gMDsgfQor
c3RhdGljIGludCBhdWZzX3dyaXRlX2VuZChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJl
c3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWdu
ZWQgY29waWVkLAorCQkJICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKQoreyBBdVVu
c3VwcG9ydCgpOyByZXR1cm4gMDsgfQorc3RhdGljIGludCBhdWZzX3dyaXRlcGFnZShzdHJ1Y3Qg
cGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7IEF1VW5zdXBwb3J0
KCk7IHJldHVybiAwOyB9CitzdGF0aWMgdm9pZCBhdWZzX3N5bmNfcGFnZShzdHJ1Y3QgcGFnZSAq
cGFnZSkKK3sgQXVVbnN1cHBvcnQoKTsgfQorCitzdGF0aWMgaW50IGF1ZnNfc2V0X3BhZ2VfZGly
dHkoc3RydWN0IHBhZ2UgKnBhZ2UpCit7IEF1VW5zdXBwb3J0KCk7IHJldHVybiAwOyB9CitzdGF0
aWMgdm9pZCBhdWZzX2ludmFsaWRhdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBs
b25nIG9mZnNldCkKK3sgQXVVbnN1cHBvcnQoKTsgfQorc3RhdGljIGludCBhdWZzX3JlbGVhc2Vw
YWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCBnZnApCit7IEF1VW5zdXBwb3J0KCk7IHJldHVy
biAwOyB9CitzdGF0aWMgc3NpemVfdCBhdWZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9j
YiAqaW9jYiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0
LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreyBBdVVuc3VwcG9ydCgpOyByZXR1
cm4gMDsgfQorc3RhdGljIHN0cnVjdCBwYWdlICphdWZzX2dldF94aXBfcGFnZShzdHJ1Y3QgYWRk
cmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkgICAgICBzZWN0b3JfdCBvZmZzZXQsIGludCBjcmVh
dGUpCit7IEF1VW5zdXBwb3J0KCk7IHJldHVybiBOVUxMOyB9CisvL3N0YXRpYyBpbnQgYXVmc19t
aWdyYXRlcGFnZSAoc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBwYWdlICpwYWdlKQorLy97
IEF1VW5zdXBwb3J0KCk7IHJldHVybiAwOyB9CisjZW5kaWYgLyogQ09ORklHX0FVRlNfREVCVUcg
Ki8KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBhdWZzX2FvcCA9IHsKKwkucmVh
ZHBhZ2UJPSBhdWZzX3JlYWRwYWdlLAorI2lmZGVmIENPTkZJR19BVUZTX0RFQlVHCisJLndyaXRl
cGFnZQk9IGF1ZnNfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJPSBhdWZzX3N5bmNfcGFnZSwKKwkv
Ly53cml0ZXBhZ2VzCT0gYXVmc193cml0ZXBhZ2VzLAorCS5zZXRfcGFnZV9kaXJ0eQk9IGF1ZnNf
c2V0X3BhZ2VfZGlydHksCisJLy8ucmVhZHBhZ2VzCT0gYXVmc19yZWFkcGFnZXMsCisJLnByZXBh
cmVfd3JpdGUJPSBhdWZzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQk9IGF1ZnNfY29t
bWl0X3dyaXRlLAorCS53cml0ZV9iZWdpbgk9IGF1ZnNfd3JpdGVfYmVnaW4sCisJLndyaXRlX2Vu
ZAk9IGF1ZnNfd3JpdGVfZW5kLAorCS8vLmJtYXAJCT0gYXVmc19ibWFwLAorCS5pbnZhbGlkYXRl
cGFnZQk9IGF1ZnNfaW52YWxpZGF0ZXBhZ2UsCisJLnJlbGVhc2VwYWdlCT0gYXVmc19yZWxlYXNl
cGFnZSwKKwkuZGlyZWN0X0lPCT0gYXVmc19kaXJlY3RfSU8sCisJLmdldF94aXBfcGFnZQk9IGF1
ZnNfZ2V0X3hpcF9wYWdlLAorCS8vLm1pZ3JhdGVwYWdlCT0gYXVmc19taWdyYXRlcGFnZQorI2Vu
ZGlmIC8qIENPTkZJR19BVUZTX0RFQlVHICovCit9OwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQt
dW5pb25mcy5vcmlnL2ZzL2F1ZnMvZmlsZS5oIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVm
cy9maWxlLmgKLS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL2ZpbGUuaAkx
OTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1
ZnMvZmlsZS5oCTIwMDgtMDUtMjUgMTE6NTg6NTMgKzAzMDAKQEAgLTAsMCArMSwyNDYgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAqCisgKiBUaGlz
IHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBv
cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRv
IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwg
RmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qCisgKiBm
aWxlIG9wZXJhdGlvbnMKKyAqCisgKiAkSWQ6IGZpbGUuaCx2IDEuMyAyMDA4LzA1LzE5IDAxOjQ4
OjA0IHNmanJvIEV4cCAkCisgKi8KKworI2lmbmRlZiBfX0FVRlNfRklMRV9IX18KKyNkZWZpbmUg
X19BVUZTX0ZJTEVfSF9fCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9m
aWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2lu
Y2x1ZGUgPGxpbnV4L2F1ZnNfdHlwZS5oPgorI2luY2x1ZGUgImRlbnRyeS5oIgorI2luY2x1ZGUg
Im1pc2MuaCIKKyNpbmNsdWRlICJzdXBlci5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0
cnVjdCBhdV9icmFuY2g7CitzdHJ1Y3QgYXVfaGZpbGUgeworCXN0cnVjdCBmaWxlCQkqaGZfZmls
ZTsKKwlzdHJ1Y3QgYXVfYnJhbmNoCSpoZl9icjsKK307CisKK3N0cnVjdCBhdV92ZGlyOworc3Ry
dWN0IGF1X2ZpbmZvIHsKKwlhdG9taWNfdAkJZmlfZ2VuZXJhdGlvbjsKKworCXN0cnVjdCBhdV9y
d3NlbQkJZmlfcndzZW07CisJc3RydWN0IGF1X2hmaWxlCQkqZmlfaGZpbGU7CisJYXVmc19iaW5k
ZXhfdAkJZmlfYnN0YXJ0LCBmaV9iZW5kOworCisJdW5pb24geworCQlzdHJ1Y3Qgdm1fb3BlcmF0
aW9uc19zdHJ1Y3QJKmZpX2hfdm1fb3BzOworCQlzdHJ1Y3QgYXVfdmRpcgkJCSpmaV92ZGlyX2Nh
Y2hlOworCX07Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGZpbGUuYyAqLworZXh0
ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYXVmc19hb3A7Cit1bnNpZ25lZCBp
bnQgYXVfZmlsZV9yb2ZsYWdzKHVuc2lnbmVkIGludCBmbGFncyk7CitzdHJ1Y3QgZmlsZSAqYXVf
aF9vcGVuKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBiaW5kZXgsIGludCBm
bGFncywKKwkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlKTsKK2ludCBhdV9kb19vcGVuKHN0cnVj
dCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCSAgICAgICBpbnQgKCpvcGVuKShz
dHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGZsYWdzKSk7CitpbnQgYXVfcmVvcGVuX25vbmRpcihzdHJ1
Y3QgZmlsZSAqZmlsZSk7CitpbnQgYXVfcmVhZHlfdG9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUs
IGxvZmZfdCBsZW4pOworaW50IGF1X3JldmFsX2FuZF9sb2NrX2ZpbmZvKHN0cnVjdCBmaWxlICpm
aWxlLCBpbnQgKCpyZW9wZW4pKHN0cnVjdCBmaWxlICpmaWxlKSwKKwkJCSAgICBpbnQgd2xvY2ss
IGludCBsb2NrZWQpOworCisvKiBmX29wLmMgKi8KK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRp
b25zIGF1ZnNfZmlsZV9mb3A7CitpbnQgYXVmc19mbHVzaChzdHJ1Y3QgZmlsZSAqZmlsZSwgZmxf
b3duZXJfdCBpZCk7CisKKy8qIGZpbmZvLmMgKi8KK3N0cnVjdCBhdV9maW5mbyAqYXVfZmkoc3Ry
dWN0IGZpbGUgKmZpbGUpOworc3RydWN0IGF1X2JyYW5jaCAqYXVfZmJyKHN0cnVjdCBmaWxlICpm
aWxlLCBhdWZzX2JpbmRleF90IGJpbmRleCk7CitzdHJ1Y3QgZmlsZSAqYXVfaF9mcHRyKHN0cnVj
dCBmaWxlICpmaWxlLCBhdWZzX2JpbmRleF90IGJpbmRleCk7CisKK3ZvaWQgYXVfaGZwdXQoc3Ry
dWN0IGF1X2hmaWxlICpoZik7Cit2b2lkIGF1X3NldF9oX2ZwdHIoc3RydWN0IGZpbGUgKmZpbGUs
IGF1ZnNfYmluZGV4X3QgYmluZGV4LAorCQkgICBzdHJ1Y3QgZmlsZSAqaF9maWxlKTsKKwordm9p
ZCBhdV9maW5mb19maW4oc3RydWN0IGZpbGUgKmZpbGUpOworaW50IGF1X2ZpbmZvX2luaXQoc3Ry
dWN0IGZpbGUgKmZpbGUpOworCisjaWZkZWYgQ09ORklHX0FVRlNfUk9CUgorLyogcm9ici5jICov
CitzdHJ1Y3QgZmlsZSAqYXVfcm9icl9zYWZlX2ZpbGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2
bWEpOwordm9pZCBhdV9yb2JyX3Jlc2V0X2ZpbGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEs
IHN0cnVjdCBmaWxlICpmaWxlKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmaWxlICph
dV9yb2JyX3NhZmVfZmlsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qg
ZmlsZSAqZmlsZTsKKworCWZpbGUgPSB2bWEtPnZtX2ZpbGU7CisJaWYgKGZpbGUtPnByaXZhdGVf
ZGF0YSAmJiBhdV90ZXN0X2F1ZnMoZmlsZS0+Zl9kZW50cnktPmRfc2IpKQorCQlyZXR1cm4gZmls
ZTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZQordm9pZCBhdV9yb2JyX3Jlc2V0
X2ZpbGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBmaWxlICpmaWxlKQorewor
CXZtYS0+dm1fZmlsZSA9IGZpbGU7CisJLy9zbXBfbWIoKTsgLyogZmx1c2ggdm1fZmlsZSAqLwor
fQorI2VuZGlmIC8qIENPTkZJR19BVUZTX1JPQlIgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwor
CisvL3RvZG86IG1lbW9yeSBiYXJyaWVyPworc3RhdGljIGlubGluZSBhdV9nZW5fdCBhdV9maWdl
bihzdHJ1Y3QgZmlsZSAqZikKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJmF1X2ZpKGYpLT5maV9n
ZW5lcmF0aW9uKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXVfdGVzdF9tbWFwcGVkKHN0cnVj
dCBmaWxlICpmKQoreworCXJldHVybiAhIShhdV9maShmKS0+ZmlfaF92bV9vcHMpOworfQorCitz
dGF0aWMgaW5saW5lIGludCBhdV90ZXN0X2F1ZnNfZmlsZShzdHJ1Y3QgZmlsZSAqZikKK3sKKwly
ZXR1cm4gIShmLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlCisJCSAmIChTX0lGQ0hSIHwgU19J
RkJMSyB8IFNfSUZJRk8gfCBTX0lGU09DSykpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisK
KyNpZiAhZGVmaW5lZChDT05GSUdfQVVGU19NT0RVTEUpIHx8IGRlZmluZWQoQ09ORklHX0FVRlNf
REVOWV9XUklURV9BQ0NFU1NfUEFUQ0gpCitpbnQgYXVfc3RvcmVfZm1vZGVfZXhlYyhzdHJ1Y3Qg
bmFtZWlkYXRhICpuZCwgc3RydWN0IGlub2RlICppbm9kZSk7CisKK3N0YXRpYyBpbmxpbmUgaW50
IGF1X2Rlbnlfd3JpdGVfYWNjZXNzKHN0cnVjdCBmaWxlICpoX2ZpbGUpCit7CisJTEtUUlRyYWNl
KCIlLipzXG4iLCBBdURMTlBhaXIoaF9maWxlLT5mX2RlbnRyeSkpOworCXJldHVybiBkZW55X3dy
aXRlX2FjY2VzcyhoX2ZpbGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXVfYWxsb3dfd3Jp
dGVfYWNjZXNzKHN0cnVjdCBmaWxlICpoX2ZpbGUpCit7CisJYWxsb3dfd3JpdGVfYWNjZXNzKGhf
ZmlsZSk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IGF1X3N0b3JlX2Ztb2RlX2V4
ZWMoc3RydWN0IG5hbWVpZGF0YSAqbmQsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJLyogbm90
aGluZyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdV9kZW55X3dyaXRl
X2FjY2VzcyhzdHJ1Y3QgZmlsZSAqaF9maWxlKQoreworCS8qIG5vdGhpbmcgKi8KKwlyZXR1cm4g
MDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF1X2FsbG93X3dyaXRlX2FjY2VzcyhzdHJ1Y3Qg
ZmlsZSAqaF9maWxlKQoreworCS8qIG5vdGhpbmcgKi8KK30KKyNlbmRpZiAvKiBDT05GSUdfQVVG
U19ERU5ZX1dSSVRFX0FDQ0VTU19QQVRDSCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8q
CisgKiBmaV9yZWFkX2xvY2ssIGZpX3dyaXRlX2xvY2ssCisgKiBmaV9yZWFkX3VubG9jaywgZmlf
d3JpdGVfdW5sb2NrLCBmaV9kb3duZ3JhZGVfbG9jaworICovCitBdVNpbXBsZVJ3c2VtRnVuY3Mo
ZmksIHN0cnVjdCBmaWxlICpmLCBhdV9maShmKS0+ZmlfcndzZW0pOworCisvKiB0byBkZWJ1ZyBl
YXNpZXIsIGRvIG5vdCBtYWtlIHRoZW0gaW5saW5lZCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgRmlN
dXN0UmVhZExvY2soZikgZG8geyBcCisJU2lNdXN0QW55TG9jaygoZiktPmZfZGVudHJ5LT5kX3Ni
KTsgXAorCUF1UndNdXN0UmVhZExvY2soJmF1X2ZpKGYpLT5maV9yd3NlbSk7IFwKK30gd2hpbGUg
KDApCisKKyNkZWZpbmUgRmlNdXN0V3JpdGVMb2NrKGYpIGRvIHsgXAorCVNpTXVzdEFueUxvY2so
KGYpLT5mX2RlbnRyeS0+ZF9zYik7IFwKKwlBdVJ3TXVzdFdyaXRlTG9jaygmYXVfZmkoZiktPmZp
X3J3c2VtKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBGaU11c3RBbnlMb2NrKGYpIGRvIHsg
XAorCVNpTXVzdEFueUxvY2soKGYpLT5mX2RlbnRyeS0+ZF9zYik7IFwKKwlBdVJ3TXVzdEFueUxv
Y2soJmF1X2ZpKGYpLT5maV9yd3NlbSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRmlNdXN0
Tm9XYWl0ZXJzKGYpCUF1UndNdXN0Tm9XYWl0ZXJzKCZhdV9maShmKS0+ZmlfcndzZW0pCisKKy8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gKi8KKworLy8gaGFyZC9zb2Z0IHNldAorc3RhdGljIGlubGluZSBhdWZz
X2JpbmRleF90IGF1X2Zic3RhcnQoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJRmlNdXN0QW55TG9j
ayhmaWxlKTsKKwlyZXR1cm4gYXVfZmkoZmlsZSktPmZpX2JzdGFydDsKK30KKworc3RhdGljIGlu
bGluZSBhdWZzX2JpbmRleF90IGF1X2ZiZW5kKHN0cnVjdCBmaWxlICpmaWxlKQoreworCUZpTXVz
dEFueUxvY2soZmlsZSk7CisJcmV0dXJuIGF1X2ZpKGZpbGUpLT5maV9iZW5kOworfQorCitzdGF0
aWMgaW5saW5lIHN0cnVjdCBhdV92ZGlyICphdV9mdmRpcl9jYWNoZShzdHJ1Y3QgZmlsZSAqZmls
ZSkKK3sKKwlGaU11c3RBbnlMb2NrKGZpbGUpOworCXJldHVybiBhdV9maShmaWxlKS0+ZmlfdmRp
cl9jYWNoZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF1X3NldF9mYnN0YXJ0KHN0cnVjdCBm
aWxlICpmaWxlLCBhdWZzX2JpbmRleF90IGJpbmRleCkKK3sKKwlGaU11c3RXcml0ZUxvY2soZmls
ZSk7CisJQXVEZWJ1Z09uKGF1X3NiZW5kKGZpbGUtPmZfZGVudHJ5LT5kX3NiKSA8IGJpbmRleCk7
CisJYXVfZmkoZmlsZSktPmZpX2JzdGFydCA9IGJpbmRleDsKK30KKworc3RhdGljIGlubGluZSB2
b2lkIGF1X3NldF9mYmVuZChzdHJ1Y3QgZmlsZSAqZmlsZSwgYXVmc19iaW5kZXhfdCBiaW5kZXgp
Cit7CisJRmlNdXN0V3JpdGVMb2NrKGZpbGUpOworCUF1RGVidWdPbihhdV9zYmVuZChmaWxlLT5m
X2RlbnRyeS0+ZF9zYikgPCBiaW5kZXgKKwkJICB8fCBiaW5kZXggPCBhdV9mYnN0YXJ0KGZpbGUp
KTsKKwlhdV9maShmaWxlKS0+ZmlfYmVuZCA9IGJpbmRleDsKK30KKworc3RhdGljIGlubGluZSB2
b2lkIGF1X3NldF9mdmRpcl9jYWNoZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICBzdHJ1
Y3QgYXVfdmRpciAqdmRpcl9jYWNoZSkKK3sKKwlGaU11c3RXcml0ZUxvY2soZmlsZSk7CisJQXVE
ZWJ1Z09uKCFTX0lTRElSKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpCisJCSAgfHwg
KGF1X2ZpKGZpbGUpLT5maV92ZGlyX2NhY2hlICYmIHZkaXJfY2FjaGUpKTsKKwlhdV9maShmaWxl
KS0+ZmlfdmRpcl9jYWNoZSA9IHZkaXJfY2FjaGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBh
dV91cGRhdGVfZmlnZW4oc3RydWN0IGZpbGUgKmZpbGUpCit7CisJYXRvbWljX3NldCgmYXVfZmko
ZmlsZSktPmZpX2dlbmVyYXRpb24sIGF1X2RpZ2VuKGZpbGUtPmZfZGVudHJ5KSk7CisJLy9zbXBf
bWIoKTsgLyogYXRvbWljX3NldCAqLworfQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2Vu
ZGlmIC8qIF9fQVVGU19GSUxFX0hfXyAqLwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25m
cy5vcmlnL2ZzL2F1ZnMvZmluZm8uYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvZmlu
Zm8uYwotLS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvZmluZm8uYwkxOTcw
LTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMv
ZmluZm8uYwkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEsMTg1IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBw
cm9ncmFtLCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJD
SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
CisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZp
ZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogZmls
ZSBwcml2YXRlIGRhdGEKKyAqCisgKiAkSWQ6IGZpbmZvLmMsdiAxLjIgMjAwOC8wNC8yMSAwMToz
NToxNCBzZmpybyBFeHAgJAorICovCisKKyNpbmNsdWRlICJhdWZzLmgiCisKK3N0cnVjdCBhdV9m
aW5mbyAqYXVfZmkoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGF1X2ZpbmZvICpmaW5m
byA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlBdURlYnVnT24oIWZpbmZvCisJCSAgfHwgIWZpbmZv
LT5maV9oZmlsZQorCQkgIHx8ICgwIDwgZmluZm8tPmZpX2JlbmQKKwkJICAgICAgJiYgKC8qIGF1
X3NiaShmaWxlLT5mX2RlbnRyeS0+ZF9zYiktPnNpX2JlbmQKKwkJCSAgICAgPCBmaW5mby0+Zmlf
YmVuZAorCQkJICAgICB8fCAqLyBmaW5mby0+ZmlfYmVuZCA8IGZpbmZvLT5maV9ic3RhcnQpKSk7
CisJcmV0dXJuIGZpbmZvOworfQorCitzdHJ1Y3QgYXVfYnJhbmNoICphdV9mYnIoc3RydWN0IGZp
bGUgKmZpbGUsIGF1ZnNfYmluZGV4X3QgYmluZGV4KQoreworCXN0cnVjdCBhdV9maW5mbyAqZmlu
Zm8gPSBhdV9maShmaWxlKTsKKwlzdHJ1Y3QgYXVfaGZpbGUgKmhmOworCisJRmlNdXN0QW55TG9j
ayhmaWxlKTsKKwlBdURlYnVnT24oIWZpbmZvCisJCSAgfHwgZmluZm8tPmZpX2JzdGFydCA8IDAK
KwkJICB8fCBiaW5kZXggPCBmaW5mby0+ZmlfYnN0YXJ0CisJCSAgfHwgZmluZm8tPmZpX2JlbmQg
PCBiaW5kZXgpOworCWhmID0gZmluZm8tPmZpX2hmaWxlICsgYmluZGV4OworCUF1RGVidWdPbiho
Zi0+aGZfYnIgJiYgYXVfYnJfY291bnQoaGYtPmhmX2JyKSA8PSAwKTsKKwlyZXR1cm4gaGYtPmhm
X2JyOworfQorCitzdHJ1Y3QgZmlsZSAqYXVfaF9mcHRyKHN0cnVjdCBmaWxlICpmaWxlLCBhdWZz
X2JpbmRleF90IGJpbmRleCkKK3sKKwlzdHJ1Y3QgYXVfZmluZm8gKmZpbmZvID0gYXVfZmkoZmls
ZSk7CisJc3RydWN0IGF1X2hmaWxlICpoZjsKKworCUZpTXVzdEFueUxvY2soZmlsZSk7CisJQXVE
ZWJ1Z09uKCFmaW5mbworCQkgIHx8IGZpbmZvLT5maV9ic3RhcnQgPCAwCisJCSAgfHwgYmluZGV4
IDwgZmluZm8tPmZpX2JzdGFydAorCQkgIHx8IGZpbmZvLT5maV9iZW5kIDwgYmluZGV4KTsKKwlo
ZiA9IGZpbmZvLT5maV9oZmlsZSArIGJpbmRleDsKKwlBdURlYnVnT24oaGYtPmhmX2ZpbGUKKwkJ
ICAmJiBmaWxlX2NvdW50KGhmLT5oZl9maWxlKSA8PSAwCisJCSAgJiYgYXVfYnJfY291bnQoaGYt
PmhmX2JyKSA8PSAwKTsKKwlyZXR1cm4gaGYtPmhmX2ZpbGU7Cit9CisKK3ZvaWQgYXVfaGZwdXQo
c3RydWN0IGF1X2hmaWxlICpoZikKK3sKKwlpZiAoaGYtPmhmX2ZpbGUtPmZfbW9kZSAmIEZNT0RF
X0VYRUMpCisJCWF1X2FsbG93X3dyaXRlX2FjY2VzcyhoZi0+aGZfZmlsZSk7CisJZnB1dChoZi0+
aGZfZmlsZSk7CisJaGYtPmhmX2ZpbGUgPSBOVUxMOworCUF1RGVidWdPbighaGYtPmhmX2JyKTsK
KwlhdV9icl9wdXQoaGYtPmhmX2JyKTsKKwloZi0+aGZfYnIgPSBOVUxMOworfQorCit2b2lkIGF1
X3NldF9oX2ZwdHIoc3RydWN0IGZpbGUgKmZpbGUsIGF1ZnNfYmluZGV4X3QgYmluZGV4LCBzdHJ1
Y3QgZmlsZSAqdmFsKQoreworCXN0cnVjdCBhdV9maW5mbyAqZmluZm8gPSBhdV9maShmaWxlKTsK
KwlzdHJ1Y3QgYXVfaGZpbGUgKmhmOworCisJRmlNdXN0V3JpdGVMb2NrKGZpbGUpOworCUF1RGVi
dWdPbighZmluZm8KKwkJICB8fCBmaW5mby0+ZmlfYnN0YXJ0IDwgMAorCQkgIHx8IGJpbmRleCA8
IGZpbmZvLT5maV9ic3RhcnQKKwkJICB8fCBmaW5mby0+ZmlfYmVuZCA8IGJpbmRleCk7CisJQXVE
ZWJ1Z09uKHZhbCAmJiBmaWxlX2NvdW50KHZhbCkgPD0gMCk7CisJaGYgPSBmaW5mby0+ZmlfaGZp
bGUgKyBiaW5kZXg7CisJQXVEZWJ1Z09uKHZhbCAmJiBoZi0+aGZfZmlsZSk7CisJaWYgKGhmLT5o
Zl9maWxlKQorCQlhdV9oZnB1dChoZik7CisJaWYgKHZhbCkgeworCQloZi0+aGZfZmlsZSA9IHZh
bDsKKwkJaGYtPmhmX2JyID0gYXVfc2JyKGZpbGUtPmZfZGVudHJ5LT5kX3NiLCBiaW5kZXgpOwor
CX0KK30KKwordm9pZCBhdV9maW5mb19maW4oc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0
IGF1X2ZpbmZvICpmaW5mbzsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJYXVmc19iaW5kZXhf
dCBiaW5kZXgsIGJlbmQ7CisKKwlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlMS1RSVHJhY2Uo
IiUuKnNcbiIsIEF1RExOUGFpcihkZW50cnkpKTsKKwlTaU11c3RBbnlMb2NrKGRlbnRyeS0+ZF9z
Yik7CisKKwlmaV93cml0ZV9sb2NrKGZpbGUpOworCWJlbmQgPSBhdV9mYmVuZChmaWxlKTsKKwli
aW5kZXggPSBhdV9mYnN0YXJ0KGZpbGUpOworCWlmIChiaW5kZXggPj0gMCkKKwkJZm9yICg7IGJp
bmRleCA8PSBiZW5kOyBiaW5kZXgrKykKKwkJCWF1X3NldF9oX2ZwdHIoZmlsZSwgYmluZGV4LCBO
VUxMKTsKKworCWZpbmZvID0gYXVfZmkoZmlsZSk7CisjaWZkZWYgQ09ORklHX0FVRlNfREVCVUcK
KwlpZiAoZmluZm8tPmZpX2JzdGFydCA+PSAwKSB7CisJCWJlbmQgPSBhdV9mYmVuZChmaWxlKTsK
KwkJZm9yIChiaW5kZXggPSBmaW5mby0+ZmlfYnN0YXJ0OyBiaW5kZXggPD0gYmVuZDsgYmluZGV4
KyspIHsKKwkJCXN0cnVjdCBhdV9oZmlsZSAqaGY7CisJCQloZiA9IGZpbmZvLT5maV9oZmlsZSAr
IGJpbmRleDsKKwkJCUF1RGVidWdPbihoZi0+aGZfZmlsZSB8fCBoZi0+aGZfYnIpOworCQl9CisJ
fQorI2VuZGlmCisKKwlrZnJlZShmaW5mby0+ZmlfaGZpbGUpOworCWZpX3dyaXRlX3VubG9jayhm
aWxlKTsKKwlhdV9jYWNoZV9mcmVlX2ZpbmZvKGZpbmZvKTsKKwkvL2ZpbGUtPnByaXZhdGVfZGF0
YSA9IE5VTEw7Cit9CisKK2ludCBhdV9maW5mb19pbml0KHN0cnVjdCBmaWxlICpmaWxlKQorewor
CXN0cnVjdCBhdV9maW5mbyAqZmluZm87CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXVuaW9u
IHsKKwkJdm9pZCAqcDsKKwkJdW5zaWduZWQgbG9uZyB1bDsKKwl9IHU7CisKKwlkZW50cnkgPSBm
aWxlLT5mX2RlbnRyeTsKKwlMS1RSVHJhY2UoIiUuKnNcbiIsIEF1RExOUGFpcihkZW50cnkpKTsK
KwlBdURlYnVnT24oIWRlbnRyeS0+ZF9pbm9kZSk7CisKKwlmaW5mbyA9IGF1X2NhY2hlX2FsbG9j
X2ZpbmZvKCk7CisJaWYgKGZpbmZvKSB7CisJCWZpbmZvLT5maV9oZmlsZSA9IGtjYWxsb2MoYXVf
c2JlbmQoZGVudHJ5LT5kX3NiKSArIDEsCisJCQkJCSAgc2l6ZW9mKCpmaW5mby0+ZmlfaGZpbGUp
LCBHRlBfS0VSTkVMKTsKKwkJaWYgKGZpbmZvLT5maV9oZmlsZSkgeworCQkJYXVfcndfaW5pdF93
bG9jaygmZmluZm8tPmZpX3J3c2VtKTsKKwkJCWZpbmZvLT5maV9ic3RhcnQgPSAtMTsKKwkJCWZp
bmZvLT5maV9iZW5kID0gLTE7CisJCQlhdG9taWNfc2V0KCZmaW5mby0+ZmlfZ2VuZXJhdGlvbiwg
YXVfZGlnZW4oZGVudHJ5KSk7CisJCQkvL3NtcF9tYigpOyAvKiBhdG9taWNfc2V0ICovCisKKwkJ
CS8qCisJCQkgKiBhIGRpcnR5IHRyaWNrIGZvciBoYW5kbGluZyBGTU9ERV9FWEVDIGFuZAorCQkJ
ICogZGVueV93cml0ZV9hY2Nlc3MoKS4KKwkJCSAqIGJlY2F1c2UgRk1PREVfRVhFQyBmbGFnIGlz
IG5vdCBwYXNzZWQgdG8KKwkJCSAqIGZfb3AtPm9wZW4oKSwKKwkJCSAqIGF1ZnMgc2V0IGl0IHRv
IGZpbGUtPnByaXZhdGVfZGF0YSB0ZW1wb3JhcnkgaW4gbG9va3VwCisJCQkgKiBvciBkZW50cnkg
cmV2YWxpZGF0aW9uIG9wZXJhdGlvbnMuCisJCQkgKiByZXN0b3JlIHRoZSBmbGFnIHRvIGZfbW9k
ZSBoZXJlLgorCQkJICovCisJCQl1LnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCQlpZiAodS51
bCAmIEZNT0RFX0VYRUMpIHsKKwkJCQlmaWxlLT5mX21vZGUgfD0gRk1PREVfRVhFQzsKKwkJCQlz
bXBfbWIoKTsgLyogZmx1c2ggZl9tb2RlICovCisJCQl9CisKKwkJCWZpbGUtPnByaXZhdGVfZGF0
YSA9IGZpbmZvOworCQkJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKwkJfQorCQlhdV9jYWNoZV9m
cmVlX2ZpbmZvKGZpbmZvKTsKKwl9CisKKwlBdVRyYWNlRXJyKC1FTk9NRU0pOworCXJldHVybiAt
RU5PTUVNOworfQpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMv
Zl9vcC5jIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9mX29wLmMKLS0tIGxpbnV4LTIu
Ni4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL2Zfb3AuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICsw
MzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvZl9vcC5jCTIwMDgtMDUtMjUg
MTE6NTk6MzggKzAzMDAKQEAgLTAsMCArMSw2NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDUtMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25n
IHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisg
KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3Rvbiwg
TUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qCisgKiBmaWxlIGFuZCB2bSBvcGVyYXRpb25z
CisgKgorICogJElkOiBmX29wLmMsdiAxLjUgMjAwOC8wNS8xOSAwMTo0ODowNCBzZmpybyBFeHAg
JAorICovCisKKy8vI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgv
ZnNfc3RhY2suaD4KKy8vI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51
eC9wb2xsLmg+CisvLyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgImF1ZnMu
aCIKKworLyogY29tbW9uIGZ1bmN0aW9uIHRvIHJlZ3VsYXIgZmlsZSBhbmQgZGlyICovCitpbnQg
YXVmc19mbHVzaChzdHJ1Y3QgZmlsZSAqZmlsZSwgZmxfb3duZXJfdCBpZCkKK3sKKwlpbnQgZXJy
OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlhdWZzX2JpbmRleF90IGJpbmRleCwgYmVuZDsK
KworCWRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVETE5Q
YWlyKGRlbnRyeSkpOworCisJLy8gYXVmc19yZWFkX2xvY2tfZmlsZSgpCisJc2lfbm9mbHVzaF9y
ZWFkX2xvY2soZGVudHJ5LT5kX3NiKTsKKwlmaV9yZWFkX2xvY2soZmlsZSk7CisJZGlfcmVhZF9s
b2NrX2NoaWxkKGRlbnRyeSwgQXVMb2NrX0lXKTsKKworCWVyciA9IDA7CisJYmVuZCA9IGF1X2Zi
ZW5kKGZpbGUpOworCWZvciAoYmluZGV4ID0gYXVfZmJzdGFydChmaWxlKTsgIWVyciAmJiBiaW5k
ZXggPD0gYmVuZDsgYmluZGV4KyspIHsKKwkJc3RydWN0IGZpbGUgKmhfZmlsZTsKKwkJaF9maWxl
ID0gYXVfaF9mcHRyKGZpbGUsIGJpbmRleCk7CisJCWlmIChoX2ZpbGUgJiYgaF9maWxlLT5mX29w
ICYmIGhfZmlsZS0+Zl9vcC0+Zmx1c2gpIHsKKwkJCWVyciA9IGhfZmlsZS0+Zl9vcC0+Zmx1c2go
aF9maWxlLCBpZCk7CisJCQlpZiAoIWVycikKKwkJCQlhdV91cGRhdGVfZnVzZV9oX2lub2RlCisJ
CQkJCShoX2ZpbGUtPmZfdmZzbW50LCBoX2ZpbGUtPmZfZGVudHJ5KTsKKwkJCS8qaWdub3JlKi8K
KwkJfQorCX0KKwlhdV9jcHVwX2F0dHJfdGltZXNpemVzKGRlbnRyeS0+ZF9pbm9kZSk7CisKKwlk
aV9yZWFkX3VubG9jayhkZW50cnksIEF1TG9ja19JVyk7CisJZmlfcmVhZF91bmxvY2soZmlsZSk7
CisJc2lfcmVhZF91bmxvY2soZGVudHJ5LT5kX3NiKTsKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0
dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGRvX29wZW5f
bm9uZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZmxhZ3MpCit7CisJaW50IGVycjsKKwlhdWZz
X2JpbmRleF90IGJpbmRleDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBmaWxl
ICpoX2ZpbGU7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7
CisJc3RydWN0IGF1X2ZpbmZvICpmaW5mbzsKKworCWRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5Owor
CUxLVFJUcmFjZSgiJS4qcywgZmxhZ3MgMCVvXG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgZmxhZ3Mp
OworCUZpTXVzdFdyaXRlTG9jayhmaWxlKTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlB
dURlYnVnT24oIWlub2RlIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpOworCisJZXJyID0gMDsK
KwlmaW5mbyA9IGF1X2ZpKGZpbGUpOworCWZpbmZvLT5maV9oX3ZtX29wcyA9IE5VTEw7CisJc2Ig
PSBkZW50cnktPmRfc2I7CisJYmluZGV4ID0gYXVfZGJzdGFydChkZW50cnkpOworCUF1RGVidWdP
bighYXVfaF9kcHRyKGRlbnRyeSwgYmluZGV4KS0+ZF9pbm9kZSk7CisJLyogT19UUlVOQyBpcyBw
cm9jZXNzZWQgYWxyZWFkeSAqLworCUJVR19PTihhdV90ZXN0X3JvKHNiLCBiaW5kZXgsIGlub2Rl
KSAmJiAoZmxhZ3MgJiBPX1RSVU5DKSk7CisKKwloX2ZpbGUgPSBhdV9oX29wZW4oZGVudHJ5LCBi
aW5kZXgsIGZsYWdzLCBmaWxlKTsKKwkvL2lmIChMa3RyQ29uZCkge2ZwdXQoaF9maWxlKTsgYXVf
YnJfcHV0KGF1X3NicihkZW50cnktPmRfc2IsIGJpbmRleCkpOworCS8vaF9maWxlID0gRVJSX1BU
UigtMSk7fQorCWlmICghSVNfRVJSKGhfZmlsZSkpIHsKKwkJYXVfc2V0X2Zic3RhcnQoZmlsZSwg
YmluZGV4KTsKKwkJYXVfc2V0X2ZiZW5kKGZpbGUsIGJpbmRleCk7CisJCWF1X3NldF9oX2ZwdHIo
ZmlsZSwgYmluZGV4LCBoX2ZpbGUpOworCQlhdV91cGRhdGVfZmlnZW4oZmlsZSk7CisJCS8vZmls
ZS0+Zl9yYSA9IGhfZmlsZS0+Zl9yYTsgLy8/PworCQkvL0F1RGJnRmlsZShmaWxlKTsKKwkJcmV0
dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKwl9CisJZXJyID0gUFRSX0VSUihoX2ZpbGUpOworCUF1VHJh
Y2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGF1ZnNfb3Blbl9ub25k
aXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIGF1
X2RvX29wZW4oaW5vZGUsIGZpbGUsIGRvX29wZW5fbm9uZGlyKTsKK30KKworc3RhdGljIGludCBh
dWZzX3JlbGVhc2Vfbm9uZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxl
KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlLT5mX2RlbnRyeS0+ZF9zYjsKKwor
CUxLVFJUcmFjZSgiaSVsdSwgJS4qc1xuIiwgaW5vZGUtPmlfaW5vLCBBdURMTlBhaXIoZmlsZS0+
Zl9kZW50cnkpKTsKKworCXNpX25vZmx1c2hfcmVhZF9sb2NrKHNiKTsKKwlhdV9maW5mb19maW4o
ZmlsZSk7CisJc2lfcmVhZF91bmxvY2soc2IpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCisKK3N0YXRpYyBzc2l6ZV90IGF1ZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwg
Y2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJIGxvZmZfdCAqcHBvcykKK3sKKwlz
c2l6ZV90IGVycjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGZpbGUgKmhfZmls
ZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBpbm9kZSAqaF9pbm9kZTsKKwor
CWRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCUxLVFJUcmFjZSgiJS4qcywgY250ICVsdSwgcG9z
ICVMZFxuIiwKKwkJICBBdURMTlBhaXIoZGVudHJ5KSwgKHVuc2lnbmVkIGxvbmcpY291bnQsICpw
cG9zKTsKKwkvL0F1RGJnRGVudHJ5KGRlbnRyeSk7CisKKwlzYiA9IGRlbnRyeS0+ZF9zYjsKKwlz
aV9yZWFkX2xvY2soc2IsIEF1TG9ja19GTFVTSCk7CisJZXJyID0gYXVfcmV2YWxfYW5kX2xvY2tf
ZmluZm8oZmlsZSwgYXVfcmVvcGVuX25vbmRpciwgLyp3bG9jayovMCwKKwkJCQkgICAgICAvKmxv
Y2tlZCovMCk7CisJLy9pZiAoTGt0ckNvbmQpIHtmaV9yZWFkX3VubG9jayhmaWxlKTsgZXJyID0g
LTE7fQorCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIG91dDsKKworCS8qIHN1cHBvcnQgTFNN
IGFuZCBub3RpZnkgKi8KKwloX2ZpbGUgPSBhdV9oX2ZwdHIoZmlsZSwgYXVfZmJzdGFydChmaWxl
KSk7CisJaF9pbm9kZSA9IGhfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJZXJyID0gdmZzdWJf
cmVhZF91KGhfZmlsZSwgYnVmLCBjb3VudCwgcHBvcywKKwkJCSAgIGF1X29wdF90ZXN0X2RsZ3Qo
YXVfbW50ZmxhZ3Moc2IpKSk7CisJLy9maWxlLT5mX3JhID0gaF9maWxlLT5mX3JhOyAvLz8/CisJ
ZnNzdGFja19jb3B5X2F0dHJfYXRpbWUoZGVudHJ5LT5kX2lub2RlLCBoX2ZpbGUtPmZfZGVudHJ5
LT5kX2lub2RlKTsKKworCWZpX3JlYWRfdW5sb2NrKGZpbGUpOworIG91dDoKKwlzaV9yZWFkX3Vu
bG9jayhzYik7CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBz
c2l6ZV90IGF1ZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1
YnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90IGVycjsK
KwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksICpwYXJlbnQ7CisJc3RydWN0IGlub2RlICppbm9kZSwg
KmRpcjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXVuc2lnbmVkIGludCBtbnRfZmxhZ3M7
CisJc3RydWN0IGZpbGUgKmhfZmlsZTsKKwljaGFyIF9fdXNlciAqYnVmID0gKGNoYXIgX191c2Vy
ICopdWJ1ZjsKKwlzdHJ1Y3QgYXVfaGluX2lnbm9yZSBpZ247CisJc3RydWN0IHZmc3ViX2FyZ3Mg
dmFyZ3M7CisKKwlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlMS1RSVHJhY2UoIiUuKnMsIGNu
dCAlbHUsIHBvcyAlTGRcbiIsCisJCSAgQXVETE5QYWlyKGRlbnRyeSksICh1bnNpZ25lZCBsb25n
KWNvdW50LCAqcHBvcyk7CisKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwltdXRleF9sb2Nr
KCZpbm9kZS0+aV9tdXRleCk7CisJc2IgPSBkZW50cnktPmRfc2I7CisJc2lfcmVhZF9sb2NrKHNi
LCBBdUxvY2tfRkxVU0gpOworCWVyciA9IGF1X3JldmFsX2FuZF9sb2NrX2ZpbmZvKGZpbGUsIGF1
X3Jlb3Blbl9ub25kaXIsIC8qd2xvY2sqLzEsCisJCQkJICAgICAgLypsb2NrZWQqLzEpOworCS8v
aWYgKExrdHJDb25kKSB7Zmlfd3JpdGVfdW5sb2NrKGZpbGUpOyBlcnIgPSAtMTt9CisJaWYgKHVu
bGlrZWx5KGVycikpCisJCWdvdG8gb3V0OworCWVyciA9IGF1X3JlYWR5X3RvX3dyaXRlKGZpbGUs
IC0xKTsKKwkvL2lmIChMa3RyQ29uZCkgZXJyID0gLTE7CisJaWYgKHVubGlrZWx5KGVycikpCisJ
CWdvdG8gb3V0X3VubG9jazsKKworCS8qIHN1cHBvcnQgTFNNIGFuZCBub3RpZnkgKi8KKwltbnRf
ZmxhZ3MgPSBhdV9tbnRmbGFncyhzYik7CisJdmZzdWJfYXJnc19pbml0KCZ2YXJncywgJmlnbiwg
YXVfb3B0X3Rlc3RfZGxndChtbnRfZmxhZ3MpLCAwKTsKKwloX2ZpbGUgPSBhdV9oX2ZwdHIoZmls
ZSwgYXVfZmJzdGFydChmaWxlKSk7CisJaWYgKCFhdV9vcHRfdGVzdChtbnRfZmxhZ3MsIFVEQkFf
SU5PVElGWSkpCisJCWVyciA9IHZmc3ViX3dyaXRlX3UoaF9maWxlLCBidWYsIGNvdW50LCBwcG9z
LCAmdmFyZ3MpOworCWVsc2UgeworCQlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCQlk
aXIgPSBwYXJlbnQtPmRfaW5vZGU7CisJCWlpX3JlYWRfbG9ja19wYXJlbnQoZGlyKTsKKwkJdmZz
dWJfaWduX2hpbm9kZSgmdmFyZ3MsIElOX01PRElGWSwKKwkJCQkgYXVfaGkoZGlyLCBhdV9mYnN0
YXJ0KGZpbGUpKSk7CisJCWVyciA9IHZmc3ViX3dyaXRlX3UoaF9maWxlLCBidWYsIGNvdW50LCBw
cG9zLCAmdmFyZ3MpOworCQlpaV9yZWFkX3VubG9jayhkaXIpOworCQlkcHV0KHBhcmVudCk7CisJ
fQorCWlpX3dyaXRlX2xvY2tfY2hpbGQoaW5vZGUpOworCWF1X2NwdXBfYXR0cl90aW1lc2l6ZXMo
aW5vZGUpOworCWlpX3dyaXRlX3VubG9jayhpbm9kZSk7CisKKyBvdXRfdW5sb2NrOgorCWZpX3dy
aXRlX3VubG9jayhmaWxlKTsKKyBvdXQ6CisJc2lfcmVhZF91bmxvY2soc2IpOworCW11dGV4X3Vu
bG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOwor
fQorCisjaWZkZWYgQ09ORklHX0FVRlNfU1BMSUNFX1BBVENICitzdGF0aWMgaW50IGF1X3Rlc3Rf
bG9vcGJhY2sodm9pZCkKK3sKKwljb25zdCBjaGFyIGMgPSBjdXJyZW50LT5jb21tWzRdOworCS8q
IHRydWUgaWYgYSBrZXJuZWwgdGhyZWFkIG5hbWVkICdsb29wWzAtOV0uKicgYWNjZXNzZXMgYSBm
aWxlICovCisJY29uc3QgaW50IGxvb3BiYWNrID0gKGN1cnJlbnQtPm1tID09IE5VTEwKKwkJCSAg
ICAgICYmICcwJyA8PSBjICYmIGMgPD0gJzknCisJCQkgICAgICAmJiBzdHJuY21wKGN1cnJlbnQt
PmNvbW0sICJsb29wIiwgNCkgPT0gMCk7CisJcmV0dXJuIGxvb3BiYWNrOworfQorCitzdGF0aWMg
c3NpemVfdCBhdWZzX3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgKnBwb3Ms
CisJCQkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwKKwkJCQl1bnNp
Z25lZCBpbnQgZmxhZ3MpCit7CisJc3NpemVfdCBlcnI7CisJc3RydWN0IGZpbGUgKmhfZmlsZTsK
KwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKworCWRl
bnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCUxLVFJUcmFjZSgiJS4qcywgcG9zICVMZCwgbGVuICVs
dVxuIiwKKwkJICBBdURMTlBhaXIoZGVudHJ5KSwgKnBwb3MsICh1bnNpZ25lZCBsb25nKWxlbik7
CisKKwlzYiA9IGRlbnRyeS0+ZF9zYjsKKwlzaV9yZWFkX2xvY2soc2IsIEF1TG9ja19GTFVTSCk7
CisJZXJyID0gYXVfcmV2YWxfYW5kX2xvY2tfZmluZm8oZmlsZSwgYXVfcmVvcGVuX25vbmRpciwg
Lyp3bG9jayovMCwKKwkJCQkgICAgICAvKmxvY2tlZCovMCk7CisJaWYgKHVubGlrZWx5KGVycikp
CisJCWdvdG8gb3V0OworCisJZXJyID0gLUVJTlZBTDsKKwkvKiBzdXBwb3J0IExTTSBhbmQgbm90
aWZ5ICovCisJaF9maWxlID0gYXVfaF9mcHRyKGZpbGUsIGF1X2Zic3RhcnQoZmlsZSkpOworCWlm
ICgvKiB1bmxpa2VseSAqLyhhdV90ZXN0X2xvb3BiYWNrKCkpKSB7CisJCWZpbGUtPmZfbWFwcGlu
ZyA9IGhfZmlsZS0+Zl9tYXBwaW5nOworCQlzbXBfbWIoKTsgLyogdW5uZWNlc3Nhcnk/ICovCisJ
fQorCWVyciA9IHZmc3ViX3NwbGljZV90byhoX2ZpbGUsIHBwb3MsIHBpcGUsIGxlbiwgZmxhZ3Ms
CisJCQkgICAgICBhdV9vcHRfdGVzdF9kbGd0KGF1X21udGZsYWdzKHNiKSkpOworCS8vZmlsZS0+
Zl9yYSA9IGhfZmlsZS0+Zl9yYTsgLy8/PworCWZzc3RhY2tfY29weV9hdHRyX2F0aW1lKGRlbnRy
eS0+ZF9pbm9kZSwgaF9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJZmlfcmVhZF91bmxvY2so
ZmlsZSk7CisKKyBvdXQ6CisJc2lfcmVhZF91bmxvY2soc2IpOworCUF1VHJhY2VFcnIoZXJyKTsK
KwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3NpemVfdAorYXVmc19zcGxpY2Vfd3JpdGUoc3Ry
dWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCAqcHBv
cywKKwkJICBzaXplX3QgbGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3NpemVfdCBlcnI7
CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUsICpoX2lub2Rl
OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGZpbGUgKmhfZmlsZTsKKwlzdHJ1
Y3QgYXVfaGluX2lnbm9yZSBpZ247CisJc3RydWN0IHZmc3ViX2FyZ3MgdmFyZ3M7CisJdW5zaWdu
ZWQgaW50IG1udF9mbGFnczsKKworCWRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCUxLVFJUcmFj
ZSgiJS4qcywgbGVuICVsdSwgcG9zICVMZFxuIiwKKwkJICBBdURMTlBhaXIoZGVudHJ5KSwgKHVu
c2lnbmVkIGxvbmcpbGVuLCAqcHBvcyk7CisKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlt
dXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJc2IgPSBkZW50cnktPmRfc2I7CisJc2lfcmVh
ZF9sb2NrKHNiLCBBdUxvY2tfRkxVU0gpOworCWVyciA9IGF1X3JldmFsX2FuZF9sb2NrX2ZpbmZv
KGZpbGUsIGF1X3Jlb3Blbl9ub25kaXIsIC8qd2xvY2sqLzEsCisJCQkJICAgICAgLypsb2NrZWQq
LzEpOworCS8vaWYgKExrdHJDb25kKSB7Zmlfd3JpdGVfdW5sb2NrKGZpbGUpOyBlcnIgPSAtMTt9
CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0OworCWVyciA9IGF1X3JlYWR5X3RvX3dy
aXRlKGZpbGUsIC0xKTsKKwkvL2lmIChMa3RyQ29uZCkgZXJyID0gLTE7CisJaWYgKHVubGlrZWx5
KGVycikpCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qIHN1cHBvcnQgTFNNIGFuZCBub3RpZnkg
Ki8KKwltbnRfZmxhZ3MgPSBhdV9tbnRmbGFncyhzYik7CisJdmZzdWJfYXJnc19pbml0KCZ2YXJn
cywgJmlnbiwgYXVfb3B0X3Rlc3RfZGxndChtbnRfZmxhZ3MpLCAwKTsKKwloX2ZpbGUgPSBhdV9o
X2ZwdHIoZmlsZSwgYXVfZmJzdGFydChmaWxlKSk7CisJaF9pbm9kZSA9IGhfZmlsZS0+Zl9kZW50
cnktPmRfaW5vZGU7CisJLyogY3VycmVudCB2ZnNfc3BsaWNlX2Zyb20oKSBkb2Vzbid0IGZpcmUg
dXAgdGhlIGlub3RpZnkgZXZlbnQgKi8KKwlpZiAoMSB8fCAhYXVfb3B0X3Rlc3QobW50X2ZsYWdz
LCBVREJBX0lOT1RJRlkpKQorCQllcnIgPSB2ZnN1Yl9zcGxpY2VfZnJvbShwaXBlLCBoX2ZpbGUs
IHBwb3MsIGxlbiwgZmxhZ3MsICZ2YXJncyk7CisJZWxzZSB7CisJCS8vc3RydWN0IGRlbnRyeSAq
cGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwkJLy92ZnN1Yl9pZ25faGlub2RlKCZ2YXJn
cywgSU5fTU9ESUZZLAorCQkvL2F1X2hpKHBhcmVudC0+ZF9pbm9kZSwgYXVfZmJzdGFydChmaWxl
KSk7CisJCWVyciA9IHZmc3ViX3NwbGljZV9mcm9tKHBpcGUsIGhfZmlsZSwgcHBvcywgbGVuLCBm
bGFncywgJnZhcmdzKTsKKwkJLy9kcHV0KHBhcmVudCk7CisJfQorCWlpX3dyaXRlX2xvY2tfY2hp
bGQoaW5vZGUpOworCWF1X2NwdXBfYXR0cl90aW1lc2l6ZXMoaW5vZGUpOworCWlpX3dyaXRlX3Vu
bG9jayhpbm9kZSk7CisKKyBvdXRfdW5sb2NrOgorCWZpX3dyaXRlX3VubG9jayhmaWxlKTsKKyBv
dXQ6CisJc2lfcmVhZF91bmxvY2soc2IpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgp
OworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmIC8qIENPTkZJR19B
VUZTX1NQTElDRV9QQVRDSCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQg
YXVmc19mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2
bWYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGZpbGUg
KmZpbGUsICpoX2ZpbGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdGF0aWMgREVDTEFSRV9X
QUlUX1FVRVVFX0hFQUQod3EpOworCXN0cnVjdCBhdV9maW5mbyAqZmluZm87CisJLy9zdHJ1Y3Qg
cGFnZSAqcGFnZTsKKworCUF1VHJhY2VFbnRlcigpOworCUF1RGVidWdPbighdm1hIHx8ICF2bWEt
PnZtX2ZpbGUpOworCS8vdG9kbzogbm9uLXJvYnIgbW9kZSwgdXNlciB2bV9maWxlIGFzIGl0IGlz
LgorCXdhaXRfZXZlbnQod3EsIChmaWxlID0gYXVfcm9icl9zYWZlX2ZpbGUodm1hKSkpOworCUF1
RGVidWdPbighYXVfdGVzdF9hdWZzKGZpbGUtPmZfZGVudHJ5LT5kX3NiKSk7CisJZGVudHJ5ID0g
ZmlsZS0+Zl9kZW50cnk7CisJTEtUUlRyYWNlKCIlLipzXG4iLCBBdURMTlBhaXIoZGVudHJ5KSk7
CisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJQXVEZWJ1Z09uKCFTX0lTUkVHKGlub2RlLT5p
X21vZGUpKTsKKworCS8qIGRvIG5vdCByZXZhbGlkYXRlLCBub3Igc2kgbG9jayAqLworCWZpbmZv
ID0gYXVfZmkoZmlsZSk7CisJaF9maWxlID0gZmluZm8tPmZpX2hmaWxlWzAgKyBmaW5mby0+Zmlf
YnN0YXJ0XS5oZl9maWxlOworCUF1RGVidWdPbighaF9maWxlIHx8ICFhdV90ZXN0X21tYXBwZWQo
ZmlsZSkpOworCWZpX3dyaXRlX2xvY2soZmlsZSk7CisJdm1hLT52bV9maWxlID0gaF9maWxlOwor
CWVyciA9IGZpbmZvLT5maV9oX3ZtX29wcy0+ZmF1bHQodm1hLCB2bWYpOworCS8vZmlsZS0+Zl9y
YSA9IGhfZmlsZS0+Zl9yYTsgLy8/PworCWF1X3JvYnJfcmVzZXRfZmlsZSh2bWEsIGZpbGUpOwor
CWZpX3dyaXRlX3VubG9jayhmaWxlKTsKKwl3YWtlX3VwKCZ3cSk7CisKKwlpZiAoIShlcnIgJiBW
TV9GQVVMVF9FUlJPUikpIHsKKwkJLy9wYWdlLT5tYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwor
CQkvL2dldF9wYWdlKHBhZ2UpOworCQkvL2ZpbGUtPmZfbWFwcGluZyA9IGhfZmlsZS0+Zl9tYXBw
aW5nOworCQkvL3RvdWNoX2F0aW1lKE5VTEwsIGRlbnRyeSk7CisJCS8vaW5vZGUtPmlfYXRpbWUg
PSBoX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2F0aW1lOworCX0KKwlBdVRyYWNlRXJyKGVy
cik7CisJLy9BdURiZygiZXJyICVkXG4iLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRp
YyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgYXVmc192bV9vcHMgPSB7CisJLy8ub3BlbgkJ
PSBhdWZzX3ZtYW9wZW4sCisJLy8uY2xvc2UJCT0gYXVmc192bWFjbG9zZSwKKwkuZmF1bHQJCT0g
YXVmc19mYXVsdCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB2
bV9vcGVyYXRpb25zX3N0cnVjdCAqYXVfdm1fb3BzKHN0cnVjdCBmaWxlICpoX2ZpbGUsCisJCQkJ
CSAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB2bV9vcGVyYXRp
b25zX3N0cnVjdCAqdm1fb3BzOworCWludCBlcnI7CisKKwlBdVRyYWNlRW50ZXIoKTsKKworCWlm
ICghYXVfdGVzdF9uZnMoaF9maWxlLT5mX3Zmc21udC0+bW50X3NiKSkKKwkJZXJyID0gaF9maWxl
LT5mX29wLT5tbWFwKGhfZmlsZSwgdm1hKTsKKwllbHNlIHsKKwkJbG9ja2RlcF9vZmYoKTsKKwkJ
ZXJyID0gaF9maWxlLT5mX29wLT5tbWFwKGhfZmlsZSwgdm1hKTsKKwkJbG9ja2RlcF9vbigpOwor
CX0KKwl2bV9vcHMgPSBFUlJfUFRSKGVycik7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8g
b3V0OworCXZtX29wcyA9IHZtYS0+dm1fb3BzOworCWVyciA9IGRvX211bm1hcChjdXJyZW50LT5t
bSwgdm1hLT52bV9zdGFydCwKKwkJCXZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CisJaWYg
KHVubGlrZWx5KGVycikpIHsKKwkJQXVJT0VycigiZmFpbGVkIGludGVybmFsIHVubWFwcGluZyAl
LipzLCAlZFxuIiwKKwkJCUF1RExOUGFpcihoX2ZpbGUtPmZfZGVudHJ5KSwgZXJyKTsKKwkJdm1f
b3BzID0gRVJSX1BUUigtRUlPKTsKKwl9CisKKyBvdXQ6CisJQXVUcmFjZUVyclB0cih2bV9vcHMp
OworCXJldHVybiB2bV9vcHM7Cit9CisKK3N0YXRpYyBpbnQgYXVmc19tbWFwKHN0cnVjdCBmaWxl
ICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgZXJyLCB3bG9jaywg
bW1hcHBlZDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpz
YjsKKwlzdHJ1Y3QgZmlsZSAqaF9maWxlOworCXN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCAq
dm1fb3BzOworCisJZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJTEtUUlRyYWNlKCIlLipzLCAl
bHgsIGxlbiAlbHVcbiIsCisJCSAgQXVETE5QYWlyKGRlbnRyeSksIHZtYS0+dm1fc3RhcnQsCisJ
CSAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KTsKKwlBdURlYnVnT24oIVNfSVNSRUcoZGVu
dHJ5LT5kX2lub2RlLT5pX21vZGUpKTsKKwlBdURlYnVnT24oZG93bl93cml0ZV90cnlsb2NrKCZ2
bWEtPnZtX21tLT5tbWFwX3NlbSkpOworCisJbW1hcHBlZCA9IGF1X3Rlc3RfbW1hcHBlZChmaWxl
KTsgLyogY2FuIGJlIGhhcm1sZXNzIHJhY2UgY29uZGl0aW9uICovCisJd2xvY2sgPSAhIShmaWxl
LT5mX21vZGUgJiBGTU9ERV9XUklURSk7CisJc2IgPSBkZW50cnktPmRfc2I7CisJc2lfcmVhZF9s
b2NrKHNiLCBBdUxvY2tfRkxVU0gpOworCWVyciA9IGF1X3JldmFsX2FuZF9sb2NrX2ZpbmZvKGZp
bGUsIGF1X3Jlb3Blbl9ub25kaXIsCisJCQkJICAgICAgd2xvY2sgfCAhbW1hcHBlZCwgLypsb2Nr
ZWQqLzApOworCS8vZXJyID0gLTE7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0Owor
CisJaWYgKHdsb2NrKSB7CisJCWVyciA9IGF1X3JlYWR5X3RvX3dyaXRlKGZpbGUsIC0xKTsKKwkJ
Ly9lcnIgPSAtMTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dF91bmxvY2s7CisJ
fQorCisJaF9maWxlID0gYXVfaF9mcHRyKGZpbGUsIGF1X2Zic3RhcnQoZmlsZSkpOworCWlmICh1
bmxpa2VseShhdV90ZXN0X2Z1c2UoaF9maWxlLT5mX2RlbnRyeS0+ZF9zYikpKSB7CisJCS8qCisJ
CSAqIGJ5IHRoaXMgYXNzaWdubWVudCwgZl9tYXBwaW5nIHdpbGwgZGlmZmVycyBmcm9tIGF1ZnMg
aW5vZGUKKwkJICogaV9tYXBwaW5nLgorCQkgKiBpZiBzb21lb25lIGVsc2UgbWl4ZXMgdGhlIHVz
ZSBvZiBmX2RlbnRyeS0+ZF9pbm9kZSBhbmQKKwkJICogZl9tYXBwaW5nLT5ob3N0LCB0aGVuIGEg
cHJvYmxlbSBtYXkgYXJpc2UuCisJCSAqLworCQlmaWxlLT5mX21hcHBpbmcgPSBoX2ZpbGUtPmZf
bWFwcGluZzsKKwl9CisKKwlpZiAoMCAmJiBoX2ZpbGUtPmZfb3AtPm1tYXAgPT0gZ2VuZXJpY19m
aWxlX21tYXApIHsKKwkJZXJyID0gZ2VuZXJpY19maWxlX21tYXAoZmlsZSwgdm1hKTsgLyogaW5z
dGVhZCBvZiBoX2ZpbGUgKi8KKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dF91bmxv
Y2s7CisJCWF1X2ZpKGZpbGUpLT5maV9oX3ZtX29wcyA9IHZtYS0+dm1fb3BzOworCX0gZWxzZSB7
CisJCXZtX29wcyA9IE5VTEw7CisJCWlmICghbW1hcHBlZCkgeworCQkJdm1fb3BzID0gYXVfdm1f
b3BzKGhfZmlsZSwgdm1hKTsKKwkJCWVyciA9IFBUUl9FUlIodm1fb3BzKTsKKwkJCWlmIChJU19F
UlIodm1fb3BzKSkKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQllcnIgPSBnZW5lcmlj
X2ZpbGVfbW1hcChmaWxlLCB2bWEpOworCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCWdvdG8gb3V0
X3VubG9jazsKKwkJdm1hLT52bV9vcHMgPSAmYXVmc192bV9vcHM7CisJCS8qIHRlc3QgYWdhaW4g
Ki8KKwkJaWYgKCFhdV90ZXN0X21tYXBwZWQoZmlsZSkpIHsKKwkJCUZpTXVzdFdyaXRlTG9jayhm
aWxlKTsKKwkJCWF1X2ZpKGZpbGUpLT5maV9oX3ZtX29wcyA9IHZtX29wczsKKwkJfQorCX0KKwor
CWZpbGVfYWNjZXNzZWQoaF9maWxlKTsKKwlhdV91cGRhdGVfZnVzZV9oX2lub2RlKGhfZmlsZS0+
Zl92ZnNtbnQsIGhfZmlsZS0+Zl9kZW50cnkpOyAvKmlnbm9yZSovCisJZnNzdGFja19jb3B5X2F0
dHJfYXRpbWUoZGVudHJ5LT5kX2lub2RlLCBoX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwor
IG91dF91bmxvY2s6CisJaWYgKCF3bG9jayAmJiBtbWFwcGVkKQorCQlmaV9yZWFkX3VubG9jayhm
aWxlKTsKKwllbHNlCisJCWZpX3dyaXRlX3VubG9jayhmaWxlKTsKKyBvdXQ6CisJc2lfcmVhZF91
bmxvY2soc2IpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXVmc19wb2xsKHN0cnVjdCBmaWxl
ICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrOworCXN0cnVj
dCBmaWxlICpoX2ZpbGU7CisJaW50IGVycjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3Ry
dWN0IHN1cGVyX2Jsb2NrICpzYjsKKworCWRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCUxLVFJU
cmFjZSgiJS4qcywgd2FpdCAlcFxuIiwgQXVETE5QYWlyKGRlbnRyeSksIHdhaXQpOworCUF1RGVi
dWdPbihTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSk7CisKKwkvKiBXZSBzaG91bGQg
cHJldGVuZCBhbiBlcnJvciBoYXBwZW5lZC4gKi8KKwltYXNrID0gUE9MTEVSUiAvKiB8IFBPTExJ
TiB8IFBPTExPVVQgKi87CisJc2IgPSBkZW50cnktPmRfc2I7CisJc2lfcmVhZF9sb2NrKHNiLCBB
dUxvY2tfRkxVU0gpOworCWVyciA9IGF1X3JldmFsX2FuZF9sb2NrX2ZpbmZvKGZpbGUsIGF1X3Jl
b3Blbl9ub25kaXIsIC8qd2xvY2sqLzAsCisJCQkJICAgICAgLypsb2NrZWQqLzApOworCS8vZXJy
ID0gLTE7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0OworCisJLyogaXQgaXMgbm90
IGFuIGVycm9yIG9mIGhpZGRlbl9maWxlIGhhcyBubyBvcGVyYXRpb24gKi8KKwltYXNrID0gREVG
QVVMVF9QT0xMTUFTSzsKKwloX2ZpbGUgPSBhdV9oX2ZwdHIoZmlsZSwgYXVfZmJzdGFydChmaWxl
KSk7CisJaWYgKGhfZmlsZS0+Zl9vcCAmJiBoX2ZpbGUtPmZfb3AtPnBvbGwpCisJCW1hc2sgPSBo
X2ZpbGUtPmZfb3AtPnBvbGwoaF9maWxlLCB3YWl0KTsKKwlmaV9yZWFkX3VubG9jayhmaWxlKTsK
KworIG91dDoKKwlzaV9yZWFkX3VubG9jayhzYik7CisJQXVUcmFjZUVycigoaW50KW1hc2spOwor
CXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGF1ZnNfZnN5bmNfbm9uZGlyKHN0cnVjdCBm
aWxlICpmaWxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgIGludCBkYXRhc3luYykK
K3sKKwlpbnQgZXJyOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGZpbGUgKmhfZmls
ZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCisJTEtUUlRyYWNlKCIlLipzLCAlZFxuIiwg
QXVETE5QYWlyKGRlbnRyeSksIGRhdGFzeW5jKTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsK
KworCUlNdXN0TG9jayhmaWxlLT5mX21hcHBpbmctPmhvc3QpOworCWlmICh1bmxpa2VseShpbm9k
ZSAhPSBmaWxlLT5mX21hcHBpbmctPmhvc3QpKSB7CisJCW11dGV4X3VubG9jaygmZmlsZS0+Zl9t
YXBwaW5nLT5ob3N0LT5pX211dGV4KTsKKwkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwor
CX0KKwlJTXVzdExvY2soaW5vZGUpOworCisJc2IgPSBkZW50cnktPmRfc2I7CisJc2lfcmVhZF9s
b2NrKHNiLCBBdUxvY2tfRkxVU0gpOworCWVyciA9IDA7IC8vLUVCQURGOyAvLyBwb3NpeD8KKwlp
ZiAodW5saWtlbHkoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpKQorCQlnb3RvIG91dDsK
KwllcnIgPSBhdV9yZXZhbF9hbmRfbG9ja19maW5mbyhmaWxlLCBhdV9yZW9wZW5fbm9uZGlyLCAv
Kndsb2NrKi8xLAorCQkJCSAgICAgIC8qbG9ja2VkKi8xKTsKKwkvL2VyciA9IC0xOworCWlmICh1
bmxpa2VseShlcnIpKQorCQlnb3RvIG91dDsKKwllcnIgPSBhdV9yZWFkeV90b193cml0ZShmaWxl
LCAtMSk7CisJLy9lcnIgPSAtMTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXRfdW5s
b2NrOworCisJZXJyID0gLUVJTlZBTDsKKwloX2ZpbGUgPSBhdV9oX2ZwdHIoZmlsZSwgYXVfZmJz
dGFydChmaWxlKSk7CisJaWYgKGhfZmlsZS0+Zl9vcCAmJiBoX2ZpbGUtPmZfb3AtPmZzeW5jKSB7
CisJCWlpX3dyaXRlX2xvY2tfY2hpbGQoaW5vZGUpOworCQltdXRleF9sb2NrX25lc3RlZCgmaF9m
aWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCwKKwkJCQkgIEF1THNjX0lfQ0hJTEQpOwor
CQllcnIgPSBoX2ZpbGUtPmZfb3AtPmZzeW5jKGhfZmlsZSwgaF9maWxlLT5mX2RlbnRyeSwgZGF0
YXN5bmMpOworCQkvL2VyciA9IC0xOworCQlpZiAoIWVycikKKwkJCWF1X3VwZGF0ZV9mdXNlX2hf
aW5vZGUoaF9maWxlLT5mX3Zmc21udCwKKwkJCQkJICAgICAgIGhfZmlsZS0+Zl9kZW50cnkpOwor
CQlhdV9jcHVwX2F0dHJfdGltZXNpemVzKGlub2RlKTsKKwkJbXV0ZXhfdW5sb2NrKCZoX2ZpbGUt
PmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwkJaWlfd3JpdGVfdW5sb2NrKGlub2RlKTsK
Kwl9CisKKyBvdXRfdW5sb2NrOgorCWZpX3dyaXRlX3VubG9jayhmaWxlKTsKKyBvdXQ6CisJc2lf
cmVhZF91bmxvY2soc2IpOworCWlmICh1bmxpa2VseShpbm9kZSAhPSBmaWxlLT5mX21hcHBpbmct
Pmhvc3QpKSB7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCQltdXRleF9sb2Nr
KCZmaWxlLT5mX21hcHBpbmctPmhvc3QtPmlfbXV0ZXgpOworCX0KKwlBdVRyYWNlRXJyKGVycik7
CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhdWZzX2Zhc3luYyhpbnQgZmQsIHN0cnVj
dCBmaWxlICpmaWxlLCBpbnQgZmxhZykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBmaWxlICpoX2Zp
bGU7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisK
KwlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlMS1RSVHJhY2UoIiUuKnMsICVkXG4iLCBBdURM
TlBhaXIoZGVudHJ5KSwgZmxhZyk7CisKKwlzYiA9IGRlbnRyeS0+ZF9zYjsKKwlzaV9yZWFkX2xv
Y2soc2IsIEF1TG9ja19GTFVTSCk7CisJZXJyID0gYXVfcmV2YWxfYW5kX2xvY2tfZmluZm8oZmls
ZSwgYXVfcmVvcGVuX25vbmRpciwgLyp3bG9jayovMCwKKwkJCQkgICAgICAvKmxvY2tlZCovMCk7
CisJLy9lcnIgPSAtMTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXQ7CisKKwloX2Zp
bGUgPSBhdV9oX2ZwdHIoZmlsZSwgYXVfZmJzdGFydChmaWxlKSk7CisJaWYgKGhfZmlsZS0+Zl9v
cCAmJiBoX2ZpbGUtPmZfb3AtPmZhc3luYykKKwkJZXJyID0gaF9maWxlLT5mX29wLT5mYXN5bmMo
ZmQsIGhfZmlsZSwgZmxhZyk7CisJZmlfcmVhZF91bmxvY2soZmlsZSk7CisKKyBvdXQ6CisJc2lf
cmVhZF91bmxvY2soc2IpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisv
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVmc19maWxlX2Zv
cCA9IHsKKwkucmVhZAkJPSBhdWZzX3JlYWQsCisJLndyaXRlCQk9IGF1ZnNfd3JpdGUsCisJLnBv
bGwJCT0gYXVmc19wb2xsLAorCS5tbWFwCQk9IGF1ZnNfbW1hcCwKKwkub3BlbgkJPSBhdWZzX29w
ZW5fbm9uZGlyLAorCS5mbHVzaAkJPSBhdWZzX2ZsdXNoLAorCS5yZWxlYXNlCT0gYXVmc19yZWxl
YXNlX25vbmRpciwKKwkuZnN5bmMJCT0gYXVmc19mc3luY19ub25kaXIsCisJLmZhc3luYwkJPSBh
dWZzX2Zhc3luYywKKyNpZmRlZiBDT05GSUdfQVVGU19TUExJQ0VfUEFUQ0gKKwkuc3BsaWNlX3dy
aXRlCT0gYXVmc19zcGxpY2Vfd3JpdGUsCisJLnNwbGljZV9yZWFkCT0gYXVmc19zcGxpY2VfcmVh
ZCwKKyNlbmRpZgorfTsKZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9h
dWZzL2hpbm9kZS5oIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9oaW5vZGUuaAotLS0g
bGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvaGlub2RlLmgJMTk3MC0wMS0wMSAw
MzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL2hpbm9kZS5o
CTIwMDgtMDUtMjUgMTE6NTY6MDggKzAzMDAKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDUtMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dyYW0s
IGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v
ZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdO
VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVl
IFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxv
b3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qCisgKiBsb3dlciAoYnJh
bmNoIGZpbGVzeXN0ZW0pIGlub2RlIGFuZCBzZXR0aW5nIGlub3RpZnkKKyAqCisgKiAkSWQ6IGhp
bm9kZS5oLHYgMS4zIDIwMDgvMDQvMjggMDM6MDg6Mzcgc2Zqcm8gRXhwICQKKyAqLworCisjaWZu
ZGVmIF9fQVVGU19ISU5PREVfSF9fCisjZGVmaW5lIF9fQVVGU19ISU5PREVfSF9fCisKKyNpZmRl
ZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lu
b3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWZzX3R5cGUuaD4KKy8vI2luY2x1ZGUgImJyYW5j
aC5oIgorLy8jaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJzdXBlci5oIgorI2luY2x1ZGUg
InZmc3ViLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGF1X2hpbm90aWZ5IHsK
KyNpZmRlZiBDT05GSUdfQVVGU19ISU5PVElGWQorCXN0cnVjdCBpbm90aWZ5X3dhdGNoCWhpbl93
YXRjaDsKKwlzdHJ1Y3QgaW5vZGUJCSpoaW5fYXVmc19pbm9kZTsJLyogbm8gZ2V0L3B1dCAqLwor
CisJLyogYW4gYXJyYXkgb2YgYXRvbWljX3QgWCBhdV9oaW5fbmlnbm9yZSAqLworCWF0b21pY190
CQloaW5faWdub3JlWzBdOworI2VuZGlmCit9OworCitzdHJ1Y3QgYXVfaGlub2RlIHsKKwlzdHJ1
Y3QgaW5vZGUJCSpoaV9pbm9kZTsKKwlhdWZzX2JpbmRleF90CQloaV9pZDsKKyNpZmRlZiBDT05G
SUdfQVVGU19ISU5PVElGWQorCXN0cnVjdCBhdV9oaW5vdGlmeQkqaGlfbm90aWZ5OworI2VuZGlm
CisKKwkvKiByZWZlcmVuY2UgdG8gdGhlIGNvcGllZC11cCB3aGl0ZW91dCB3aXRoIGdldC9wdXQg
Ki8KKwlzdHJ1Y3QgZGVudHJ5CQkqaGlfd2hkZW50cnk7Cit9OworCitzdHJ1Y3QgYXVfaGluX2ln
bm9yZSB7CisjaWZkZWYgQ09ORklHX0FVRlNfSElOT1RJRlkKKwlfX3UzMgkJCWlnbl9ldmVudHM7
CisJc3RydWN0IGF1X2hpbm9kZQkqaWduX2hpbm9kZTsKKyNlbmRpZgorfTsKKworLyogLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX0FVRlNfSElOT1RJRlkKK3N0YXRpYyBpbmxpbmUK
K3ZvaWQgYXVfaGluX2luaXQoc3RydWN0IGF1X2hpbm9kZSAqaGlub2RlLCBzdHJ1Y3QgYXVfaGlu
b3RpZnkgKnZhbCkKK3sKKwloaW5vZGUtPmhpX25vdGlmeSA9IHZhbDsKK30KKworLyogaGlub3Rp
ZnkuYyAqLworaW50IGF1X2hpbl9hbGxvYyhzdHJ1Y3QgYXVfaGlub2RlICpoaW5vZGUsIHN0cnVj
dCBpbm9kZSAqaW5vZGUsCisJCSBzdHJ1Y3QgaW5vZGUgKmhfaW5vZGUpOwordm9pZCBhdV9oaW5f
ZnJlZShzdHJ1Y3QgYXVfaGlub2RlICpoaW5vZGUpOwordm9pZCBhdV9kb19oZGlyX2xvY2soc3Ry
dWN0IGlub2RlICpoX2Rpciwgc3RydWN0IGlub2RlICpkaXIsCisJCSAgICAgYXVmc19iaW5kZXhf
dCBiaW5kZXgsIHVuc2lnbmVkIGludCBsc2MpOwordm9pZCBhdV9oZGlyX3VubG9jayhzdHJ1Y3Qg
aW5vZGUgKmhfZGlyLCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJICAgIGF1ZnNfYmluZGV4X3QgYmlu
ZGV4KTsKK3N0cnVjdCBkZW50cnkgKmF1X2hkaXJfbG9ja19yZW5hbWUoc3RydWN0IGRlbnRyeSAq
KmhfcGFyZW50cywKKwkJCQkgICBzdHJ1Y3QgaW5vZGUgKipkaXJzLCBhdWZzX2JpbmRleF90IGJp
bmRleCwKKwkJCQkgICBpbnQgaXNzYW1lZGlyKTsKK3ZvaWQgYXVfaGRpcl91bmxvY2tfcmVuYW1l
KHN0cnVjdCBkZW50cnkgKipoX3BhcmVudHMsIHN0cnVjdCBpbm9kZSAqKmRpcnMsCisJCQkgICBh
dWZzX2JpbmRleF90IGJpbmRleCwgaW50IGlzc2FtZWRpcik7Cit2b2lkIGF1X3Jlc2V0X2hpbm90
aWZ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBmbGFncyk7CisKK3ZvaWQgYXVf
aGluX2lnbm9yZShzdHJ1Y3QgYXVfaGlub2RlICpoaW5vZGUsIF9fdTMyIGV2ZW50cyk7Cit2b2lk
IGF1X2hpbl91bmlnbm9yZShzdHJ1Y3QgYXVfaGlub2RlICpoaW5vZGUsIF9fdTMyIGV2ZW50cyk7
CisKK2ludCBfX2luaXQgYXVfaW5vdGlmeV9pbml0KHZvaWQpOwordm9pZCBhdV9pbm90aWZ5X2Zp
bih2b2lkKTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZQordm9pZCBhdV9oaW5faW5pdChzdHJ1
Y3QgYXVfaGlub2RlICpoaW5vZGUsIHN0cnVjdCBhdV9oaW5vdGlmeSAqdmFsKQoreworCS8qIGVt
cHR5ICovCit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBhdV9oaW5fYWxsb2Moc3RydWN0IGF1X2hp
bm9kZSAqaGlub2RlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgc3RydWN0IGlub2RlICpoX2lu
b2RlKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF1
X2hpbl9mcmVlKHN0cnVjdCBhdV9oaW5vZGUgKmhpbm9kZSkKK3sKKwkvKiBub3RoaW5nICovCit9
CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgYXVfZG9faGRpcl9sb2NrKHN0cnVjdCBpbm9kZSAqaF9k
aXIsIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkgICAgIGF1ZnNfYmluZGV4X3QgYmluZGV4LCB1bnNp
Z25lZCBpbnQgbHNjKQoreworCW11dGV4X2xvY2tfbmVzdGVkKCZoX2Rpci0+aV9tdXRleCwgbHNj
KTsKK30KKworc3RhdGljIGlubGluZQordm9pZCBhdV9oZGlyX3VubG9jayhzdHJ1Y3QgaW5vZGUg
KmhfZGlyLCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJICAgIGF1ZnNfYmluZGV4X3QgYmluZGV4KQor
eworCW11dGV4X3VubG9jaygmaF9kaXItPmlfbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lCitz
dHJ1Y3QgZGVudHJ5ICphdV9oZGlyX2xvY2tfcmVuYW1lKHN0cnVjdCBkZW50cnkgKipoX3BhcmVu
dHMsCisJCQkJICAgc3RydWN0IGlub2RlICoqZGlycywgYXVmc19iaW5kZXhfdCBiaW5kZXgsCisJ
CQkJICAgaW50IGlzc2FtZWRpcikKK3sKKwlyZXR1cm4gdmZzdWJfbG9ja19yZW5hbWUoaF9wYXJl
bnRzWzBdLCBoX3BhcmVudHNbMV0pOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIGF1X2hkaXJf
dW5sb2NrX3JlbmFtZShzdHJ1Y3QgZGVudHJ5ICoqaF9wYXJlbnRzLCBzdHJ1Y3QgaW5vZGUgKipk
aXJzLAorCQkJICAgYXVmc19iaW5kZXhfdCBiaW5kZXgsIGludCBpc3NhbWVkaXIpCit7CisJdmZz
dWJfdW5sb2NrX3JlbmFtZShoX3BhcmVudHNbMF0sIGhfcGFyZW50c1sxXSk7Cit9CisKK3N0YXRp
YyBpbmxpbmUgdm9pZCBhdV9yZXNldF9oaW5vdGlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNp
Z25lZCBpbnQgZmxhZ3MpCit7CisJLyogbm90aGluZyAqLworfQorCitzdGF0aWMgaW5saW5lIHZv
aWQgYXVfaGluX2lnbm9yZShzdHJ1Y3QgYXVfaGlub3RpZnkgKmhpbm90aWZ5LCBfX3UzMiBldmVu
dHMpCit7CisJLyogbm90aGluZyAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXVfaGluX3Vu
aWdub3JlKHN0cnVjdCBhdV9oaW5vdGlmeSAqaGlub3RpZnksIF9fdTMyIGV2ZW50cykKK3sKKwkv
KiBub3RoaW5nICovCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF1X2lub3RpZnlfaW5pdCh2b2lk
KQoreworCXJldHVybiAwOworfQorCisjZGVmaW5lIGF1X2lub3RpZnlfZmluKCkJZG8ge30gd2hp
bGUgKDApCisjZW5kaWYgLyogQ09ORklHX0FVRlNfSElOT1RJRlkgKi8KKworLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLworCisvKgorICogYXVfaGRpcl9sb2NrLCBhdV9oZGlyMl9sb2NrCisgKi8KKyNkZWZp
bmUgQXVMb2NrRnVuYyhuYW1lLCBsc2MpIFwKK3N0YXRpYyBpbmxpbmUgXAordm9pZCBuYW1lIyNf
bG9jayhzdHJ1Y3QgaW5vZGUgKmhfZGlyLCBzdHJ1Y3QgaW5vZGUgKmRpciwgYXVmc19iaW5kZXhf
dCBiaW5kZXgpIFwKK3sgYXVfZG9faGRpcl9sb2NrKGhfZGlyLCBkaXIsIGJpbmRleCwgQXVMc2Nf
SV8jI2xzYyk7IH0KKworQXVMb2NrRnVuYyhhdV9oZGlyLCBQQVJFTlQpOworQXVMb2NrRnVuYyhh
dV9oZGlyMiwgUEFSRU5UMik7CisKKyN1bmRlZiBBdUxvY2tGdW5jCisKKy8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0FVRlNfSElOT0RF
X0hfXyAqLwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvaGlu
X29yX2RsZ3QuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvaGluX29yX2RsZ3QuYwot
LS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvaGluX29yX2RsZ3QuYwkxOTcw
LTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMv
aGluX29yX2RsZ3QuYwkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEsNzA4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEp1bmppcm8gT2thamltYQorICoKKyAqIFRoaXMg
cHJvZ3JhbSwgYXVmcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8g
dGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBG
aWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworLyoKKyAqIHN1
Yi1yb3V0aW5lcyBmb3IgdmZzIGluIGhpbm90aWZ5IG9yIGRsZ3QgbW9kZQorICoKKyAqICRJZDog
aGluX29yX2RsZ3QuYyx2IDEuMiAyMDA4LzA0LzIxIDAyOjAwOjM3IHNmanJvIEV4cCAkCisgKi8K
Ky8vIEknbSBnb2luZyB0byBzbGlnaHRseSBtYWQKKworI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3Mu
aD4KKyNpbmNsdWRlICJhdWZzLmgiCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQVVGU19ISU5PVElG
WSkgJiYgIWRlZmluZWQoQ09ORklHX0FVRlNfRExHVCkKKyNlcnJvciBtaXMtY29uZmlndXJhaW9u
IG9yIE1ha2VmaWxlCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgcGVy
bWlzc2lvbl9hcmdzIHsKKwlpbnQgKmVycnA7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQg
bWFzazsKKwlzdHJ1Y3QgbmFtZWlkYXRhICpuZDsKK307CisKK3N0YXRpYyB2b2lkIGNhbGxfcGVy
bWlzc2lvbih2b2lkICphcmdzKQoreworCXN0cnVjdCBwZXJtaXNzaW9uX2FyZ3MgKmEgPSBhcmdz
OworCSphLT5lcnJwID0gZG9fdmZzdWJfcGVybWlzc2lvbihhLT5pbm9kZSwgYS0+bWFzaywgYS0+
bmQpOworfQorCitpbnQgdmZzdWJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQg
bWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQsCisJCSAgICAgaW50IGRsZ3QpCit7CisJaWYgKCFk
bGd0KQorCQlyZXR1cm4gZG9fdmZzdWJfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgbmQpOworCWVs
c2UgeworCQlpbnQgZXJyLCB3a3FfZXJyOworCQlzdHJ1Y3QgcGVybWlzc2lvbl9hcmdzIGFyZ3Mg
PSB7CisJCQkuZXJycAk9ICZlcnIsCisJCQkuaW5vZGUJPSBpbm9kZSwKKwkJCS5tYXNrCT0gbWFz
aywKKwkJCS5uZAk9IG5kCisJCX07CisJCXdrcV9lcnIgPSBhdV93a3Ffd2FpdChjYWxsX3Blcm1p
c3Npb24sICZhcmdzLCAvKmRsZ3QqLzEpOworCQlpZiAodW5saWtlbHkod2txX2VycikpCisJCQll
cnIgPSB3a3FfZXJyOworCQlyZXR1cm4gZXJyOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAq
LworCitzdHJ1Y3QgY3JlYXRlX2FyZ3MgeworCWludCAqZXJycDsKKwlzdHJ1Y3QgaW5vZGUgKmRp
cjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJaW50IG1vZGU7CisJc3RydWN0IG5hbWVpZGF0
YSAqbmQ7Cit9OworCitzdGF0aWMgdm9pZCBjYWxsX2NyZWF0ZSh2b2lkICphcmdzKQoreworCXN0
cnVjdCBjcmVhdGVfYXJncyAqYSA9IGFyZ3M7CisJKmEtPmVycnAgPSBkb192ZnN1Yl9jcmVhdGUo
YS0+ZGlyLCBhLT5kZW50cnksIGEtPm1vZGUsIGEtPm5kKTsKK30KKworaW50IHZmc3ViX2NyZWF0
ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJ
IHN0cnVjdCBuYW1laWRhdGEgKm5kLCBpbnQgZGxndCkKK3sKKwlpZiAoIWRsZ3QpCisJCXJldHVy
biBkb192ZnN1Yl9jcmVhdGUoZGlyLCBkZW50cnksIG1vZGUsIG5kKTsKKwllbHNlIHsKKwkJaW50
IGVyciwgd2txX2VycjsKKwkJc3RydWN0IGNyZWF0ZV9hcmdzIGFyZ3MgPSB7CisJCQkuZXJycAk9
ICZlcnIsCisJCQkuZGlyCT0gZGlyLAorCQkJLmRlbnRyeQk9IGRlbnRyeSwKKwkJCS5tb2RlCT0g
bW9kZSwKKwkJCS5uZAk9IG5kCisJCX07CisJCXdrcV9lcnIgPSBhdV93a3Ffd2FpdChjYWxsX2Ny
ZWF0ZSwgJmFyZ3MsIC8qZGxndCovMSk7CisJCWlmICh1bmxpa2VseSh3a3FfZXJyKSkKKwkJCWVy
ciA9IHdrcV9lcnI7CisJCXJldHVybiBlcnI7CisJfQorfQorCitzdHJ1Y3Qgc3ltbGlua19hcmdz
IHsKKwlpbnQgKmVycnA7CisJc3RydWN0IGlub2RlICpkaXI7CisJc3RydWN0IGRlbnRyeSAqZGVu
dHJ5OworCWNvbnN0IGNoYXIgKnN5bW5hbWU7CisJaW50IG1vZGU7Cit9OworCitzdGF0aWMgdm9p
ZCBjYWxsX3N5bWxpbmsodm9pZCAqYXJncykKK3sKKwlzdHJ1Y3Qgc3ltbGlua19hcmdzICphID0g
YXJnczsKKwkqYS0+ZXJycCA9IGRvX3Zmc3ViX3N5bWxpbmsoYS0+ZGlyLCBhLT5kZW50cnksIGEt
PnN5bW5hbWUsIGEtPm1vZGUpOworfQorCitpbnQgdmZzdWJfc3ltbGluayhzdHJ1Y3QgaW5vZGUg
KmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpzeW1uYW1lLAorCQkgIGlu
dCBtb2RlLCBpbnQgZGxndCkKK3sKKwlpZiAoIWRsZ3QpCisJCXJldHVybiBkb192ZnN1Yl9zeW1s
aW5rKGRpciwgZGVudHJ5LCBzeW1uYW1lLCBtb2RlKTsKKwllbHNlIHsKKwkJaW50IGVyciwgd2tx
X2VycjsKKwkJc3RydWN0IHN5bWxpbmtfYXJncyBhcmdzID0geworCQkJLmVycnAJCT0gJmVyciwK
KwkJCS5kaXIJCT0gZGlyLAorCQkJLmRlbnRyeQkJPSBkZW50cnksCisJCQkuc3ltbmFtZQk9IHN5
bW5hbWUsCisJCQkubW9kZQkJPSBtb2RlCisJCX07CisJCXdrcV9lcnIgPSBhdV93a3Ffd2FpdChj
YWxsX3N5bWxpbmssICZhcmdzLCAvKmRsZ3QqLzEpOworCQlpZiAodW5saWtlbHkod2txX2Vycikp
CisJCQllcnIgPSB3a3FfZXJyOworCQlyZXR1cm4gZXJyOworCX0KK30KKworc3RydWN0IG1rbm9k
X2FyZ3MgeworCWludCAqZXJycDsKKwlzdHJ1Y3QgaW5vZGUgKmRpcjsKKwlzdHJ1Y3QgZGVudHJ5
ICpkZW50cnk7CisJaW50IG1vZGU7CisJZGV2X3QgZGV2OworfTsKKworc3RhdGljIHZvaWQgY2Fs
bF9ta25vZCh2b2lkICphcmdzKQoreworCXN0cnVjdCBta25vZF9hcmdzICphID0gYXJnczsKKwkq
YS0+ZXJycCA9IGRvX3Zmc3ViX21rbm9kKGEtPmRpciwgYS0+ZGVudHJ5LCBhLT5tb2RlLCBhLT5k
ZXYpOworfQorCitpbnQgdmZzdWJfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50
cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IGRldiwKKwkJaW50IGRsZ3QpCit7CisJaWYgKCFk
bGd0KQorCQlyZXR1cm4gZG9fdmZzdWJfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIGRldik7CisJ
ZWxzZSB7CisJCWludCBlcnIsIHdrcV9lcnI7CisJCXN0cnVjdCBta25vZF9hcmdzIGFyZ3MgPSB7
CisJCQkuZXJycAk9ICZlcnIsCisJCQkuZGlyCT0gZGlyLAorCQkJLmRlbnRyeQk9IGRlbnRyeSwK
KwkJCS5tb2RlCT0gbW9kZSwKKwkJCS5kZXYJPSBkZXYKKwkJfTsKKwkJd2txX2VyciA9IGF1X3dr
cV93YWl0KGNhbGxfbWtub2QsICZhcmdzLCAvKmRsZ3QqLzEpOworCQlpZiAodW5saWtlbHkod2tx
X2VycikpCisJCQllcnIgPSB3a3FfZXJyOworCQlyZXR1cm4gZXJyOworCX0KK30KKworc3RydWN0
IG1rZGlyX2FyZ3MgeworCWludCAqZXJycDsKKwlzdHJ1Y3QgaW5vZGUgKmRpcjsKKwlzdHJ1Y3Qg
ZGVudHJ5ICpkZW50cnk7CisJaW50IG1vZGU7Cit9OworCitzdGF0aWMgdm9pZCBjYWxsX21rZGly
KHZvaWQgKmFyZ3MpCit7CisJc3RydWN0IG1rZGlyX2FyZ3MgKmEgPSBhcmdzOworCSphLT5lcnJw
ID0gZG9fdmZzdWJfbWtkaXIoYS0+ZGlyLCBhLT5kZW50cnksIGEtPm1vZGUpOworfQorCitpbnQg
dmZzdWJfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50
IG1vZGUsIGludCBkbGd0KQoreworCWlmICghZGxndCkKKwkJcmV0dXJuIGRvX3Zmc3ViX21rZGly
KGRpciwgZGVudHJ5LCBtb2RlKTsKKwllbHNlIHsKKwkJaW50IGVyciwgd2txX2VycjsKKwkJc3Ry
dWN0IG1rZGlyX2FyZ3MgYXJncyA9IHsKKwkJCS5lcnJwCT0gJmVyciwKKwkJCS5kaXIJPSBkaXIs
CisJCQkuZGVudHJ5CT0gZGVudHJ5LAorCQkJLm1vZGUJPSBtb2RlCisJCX07CisJCXdrcV9lcnIg
PSBhdV93a3Ffd2FpdChjYWxsX21rZGlyLCAmYXJncywgLypkbGd0Ki8xKTsKKwkJaWYgKHVubGlr
ZWx5KHdrcV9lcnIpKQorCQkJZXJyID0gd2txX2VycjsKKwkJcmV0dXJuIGVycjsKKwl9Cit9CisK
Ky8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGxpbmtfYXJncyB7CisJaW50ICplcnJwOwor
CXN0cnVjdCBpbm9kZSAqZGlyOworCXN0cnVjdCBkZW50cnkgKnNyY19kZW50cnksICpkZW50cnk7
Cit9OworCitzdGF0aWMgdm9pZCBjYWxsX2xpbmsodm9pZCAqYXJncykKK3sKKwlzdHJ1Y3QgbGlu
a19hcmdzICphID0gYXJnczsKKwkqYS0+ZXJycCA9IGRvX3Zmc3ViX2xpbmsoYS0+c3JjX2RlbnRy
eSwgYS0+ZGlyLCBhLT5kZW50cnkpOworfQorCitpbnQgdmZzdWJfbGluayhzdHJ1Y3QgZGVudHJ5
ICpzcmNfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkgICAgICAgc3RydWN0IGRlbnRyeSAq
ZGVudHJ5LCBpbnQgZGxndCkKK3sKKwlpZiAoIWRsZ3QpCisJCXJldHVybiBkb192ZnN1Yl9saW5r
KHNyY19kZW50cnksIGRpciwgZGVudHJ5KTsKKwllbHNlIHsKKwkJaW50IGVyciwgd2txX2VycjsK
KwkJc3RydWN0IGxpbmtfYXJncyBhcmdzID0geworCQkJLmVycnAJCT0gJmVyciwKKwkJCS5zcmNf
ZGVudHJ5CT0gc3JjX2RlbnRyeSwKKwkJCS5kaXIJCT0gZGlyLAorCQkJLmRlbnRyeQkJPSBkZW50
cnkKKwkJfTsKKwkJd2txX2VyciA9IGF1X3drcV93YWl0KGNhbGxfbGluaywgJmFyZ3MsIC8qZGxn
dCovMSk7CisJCWlmICh1bmxpa2VseSh3a3FfZXJyKSkKKwkJCWVyciA9IHdrcV9lcnI7CisJCXJl
dHVybiBlcnI7CisJfQorfQorCitzdHJ1Y3QgcmVuYW1lX2FyZ3MgeworCWludCAqZXJycDsKKwlz
dHJ1Y3QgaW5vZGUgKnNyY19kaXIsICpkaXI7CisJc3RydWN0IGRlbnRyeSAqc3JjX2RlbnRyeSwg
KmRlbnRyeTsKKwlzdHJ1Y3QgdmZzdWJfYXJncyAqdmFyZ3M7Cit9OworCitzdGF0aWMgdm9pZCBj
YWxsX3JlbmFtZSh2b2lkICphcmdzKQoreworCXN0cnVjdCByZW5hbWVfYXJncyAqYSA9IGFyZ3M7
CisJdmZzdWJfaWdub3JlKGEtPnZhcmdzKTsKKwkqYS0+ZXJycCA9IGRvX3Zmc3ViX3JlbmFtZShh
LT5zcmNfZGlyLCBhLT5zcmNfZGVudHJ5LCBhLT5kaXIsCisJCQkJICAgYS0+ZGVudHJ5KTsKKwlp
ZiAodW5saWtlbHkoKmEtPmVycnApKQorCQl2ZnN1Yl91bmlnbm9yZShhLT52YXJncyk7Cit9CisK
K2ludCB2ZnN1Yl9yZW5hbWUoc3RydWN0IGlub2RlICpzcmNfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpz
cmNfZGVudHJ5LAorCQkgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwK
KwkJIHN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJncykKK3sKKwlpbnQgZXJyOworCisJaWYgKCF2ZnN1
Yl9mdGVzdCh2YXJncy0+ZmxhZ3MsIERMR1QpKSB7CisJCXZmc3ViX2lnbm9yZSh2YXJncyk7CisJ
CWVyciA9IGRvX3Zmc3ViX3JlbmFtZShzcmNfZGlyLCBzcmNfZGVudHJ5LCBkaXIsIGRlbnRyeSk7
CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJdmZzdWJfdW5pZ25vcmUodmFyZ3MpOworCX0gZWxz
ZSB7CisJCWludCB3a3FfZXJyOworCQlzdHJ1Y3QgcmVuYW1lX2FyZ3MgYXJncyA9IHsKKwkJCS5l
cnJwCQk9ICZlcnIsCisJCQkuc3JjX2Rpcgk9IHNyY19kaXIsCisJCQkuc3JjX2RlbnRyeQk9IHNy
Y19kZW50cnksCisJCQkuZGlyCQk9IGRpciwKKwkJCS5kZW50cnkJCT0gZGVudHJ5LAorCQkJLnZh
cmdzCQk9IHZhcmdzCisJCX07CisJCXdrcV9lcnIgPSBhdV93a3Ffd2FpdChjYWxsX3JlbmFtZSwg
JmFyZ3MsIC8qZGxndCovMSk7CisJCWlmICh1bmxpa2VseSh3a3FfZXJyKSkKKwkJCWVyciA9IHdr
cV9lcnI7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBybWRpcl9hcmdzIHsKKwlpbnQg
KmVycnA7CisJc3RydWN0IGlub2RlICpkaXI7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0
cnVjdCB2ZnN1Yl9hcmdzICp2YXJnczsKK307CisKK3N0YXRpYyB2b2lkIGNhbGxfcm1kaXIodm9p
ZCAqYXJncykKK3sKKwlzdHJ1Y3Qgcm1kaXJfYXJncyAqYSA9IGFyZ3M7CisJdmZzdWJfaWdub3Jl
KGEtPnZhcmdzKTsKKwkqYS0+ZXJycCA9IGRvX3Zmc3ViX3JtZGlyKGEtPmRpciwgYS0+ZGVudHJ5
KTsKKwlpZiAodW5saWtlbHkoKmEtPmVycnApKQorCQl2ZnN1Yl91bmlnbm9yZShhLT52YXJncyk7
Cit9CisKK2ludCB2ZnN1Yl9ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAq
ZGVudHJ5LAorCQlzdHJ1Y3QgdmZzdWJfYXJncyAqdmFyZ3MpCit7CisJaW50IGVycjsKKworCWlm
ICghdmZzdWJfZnRlc3QodmFyZ3MtPmZsYWdzLCBETEdUKSkgeworCQl2ZnN1Yl9pZ25vcmUodmFy
Z3MpOworCQllcnIgPSBkb192ZnN1Yl9ybWRpcihkaXIsIGRlbnRyeSk7CisJCWlmICh1bmxpa2Vs
eShlcnIpKQorCQkJdmZzdWJfdW5pZ25vcmUodmFyZ3MpOworCX0gZWxzZSB7CisJCWludCB3a3Ff
ZXJyOworCQlzdHJ1Y3Qgcm1kaXJfYXJncyBhcmdzID0geworCQkJLmVycnAJPSAmZXJyLAorCQkJ
LmRpcgk9IGRpciwKKwkJCS5kZW50cnkJPSBkZW50cnksCisJCQkudmFyZ3MJPSB2YXJncworCQl9
OworCQl3a3FfZXJyID0gYXVfd2txX3dhaXQoY2FsbF9ybWRpciwgJmFyZ3MsIC8qZGxndCovMSk7
CisJCWlmICh1bmxpa2VseSh3a3FfZXJyKSkKKwkJCWVyciA9IHdrcV9lcnI7CisJfQorCXJldHVy
biBlcnI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IHJlYWRfYXJncyB7CisJ
c3NpemVfdCAqZXJycDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwl1bmlvbiB7CisJCXZvaWQgKmti
dWY7CisJCWNoYXIgX191c2VyICp1YnVmOworCX07CisJc2l6ZV90IGNvdW50OworCWxvZmZfdCAq
cHBvczsKK307CisKK3N0YXRpYyB2b2lkIGNhbGxfcmVhZF9rKHZvaWQgKmFyZ3MpCit7CisJc3Ry
dWN0IHJlYWRfYXJncyAqYSA9IGFyZ3M7CisJTEtUUlRyYWNlKCIlLipzLCBjbnQgJWx1LCBwb3Mg
JUxkXG4iLAorCQkgIEF1RExOUGFpcihhLT5maWxlLT5mX2RlbnRyeSksICh1bnNpZ25lZCBsb25n
KWEtPmNvdW50LAorCQkgICphLT5wcG9zKTsKKwkqYS0+ZXJycCA9IGRvX3Zmc3ViX3JlYWRfayhh
LT5maWxlLCBhLT5rYnVmLCBhLT5jb3VudCwgYS0+cHBvcyk7Cit9CisKK3NzaXplX3QgdmZzdWJf
cmVhZF91KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNvdW50
LAorCQkgICAgIGxvZmZfdCAqcHBvcywgaW50IGRsZ3QpCit7CisJaWYgKCFkbGd0KQorCQlyZXR1
cm4gZG9fdmZzdWJfcmVhZF91KGZpbGUsIHVidWYsIGNvdW50LCBwcG9zKTsKKwllbHNlIHsKKwkJ
aW50IHdrcV9lcnI7CisJCXNzaXplX3QgZXJyLCByZWFkOworCQlzdHJ1Y3QgcmVhZF9hcmdzIGFy
Z3MgPSB7CisJCQkuZXJycAk9ICZlcnIsCisJCQkuZmlsZQk9IGZpbGUsCisJCQkuY291bnQJPSBj
b3VudCwKKwkJCS5wcG9zCT0gcHBvcworCQl9OworCisJCWlmICh1bmxpa2VseSghY291bnQpKQor
CQkJcmV0dXJuIDA7CisKKwkJLyoKKwkJICogd29ya2Fyb3VuZCBhbiBhcHBsaWNhdGlvbiBidWcu
CisJCSAqIGdlbmVyYWxseSwgcmVhZCgyKSBvciB3cml0ZSgyKSBtYXkgcmV0dXJuIHRoZSB2YWx1
ZSBzaG9ydGVyCisJCSAqIHRoYW4gcmVxdWVzdGVkLiBCdXQgbWFueSBhcHBsaWNhdGlvbnMgZG9u
J3Qgc3VwcG9ydCBpdCwKKwkJICogZm9yIGV4YW1wbGUgYmFzaC4KKwkJICovCisJCWVyciA9IC1F
Tk9NRU07CisJCWlmIChhcmdzLmNvdW50ID4gUEFHRV9TSVpFKQorCQkJYXJncy5jb3VudCA9IFBB
R0VfU0laRTsKKwkJYXJncy5rYnVmID0ga21hbGxvYyhhcmdzLmNvdW50LCBHRlBfVEVNUE9SQVJZ
KTsKKwkJaWYgKHVubGlrZWx5KCFhcmdzLmtidWYpKQorCQkJZ290byBvdXQ7CisKKwkJcmVhZCA9
IDA7CisJCWRvIHsKKwkJCXdrcV9lcnIgPSBhdV93a3Ffd2FpdChjYWxsX3JlYWRfaywgJmFyZ3Ms
IC8qZGxndCovMSk7CisJCQlpZiAodW5saWtlbHkod2txX2VycikpCisJCQkJZXJyID0gd2txX2Vy
cjsKKwkJCWlmICh1bmxpa2VseShlcnIgPiAwCisJCQkJICAgICAmJiBjb3B5X3RvX3VzZXIodWJ1
ZiwgYXJncy5rYnVmLCBlcnIpKSkgeworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXRf
ZnJlZTsKKwkJCX0gZWxzZSBpZiAoIWVycikKKwkJCQlicmVhazsKKwkJCWVsc2UgaWYgKHVubGlr
ZWx5KGVyciA8IDApKQorCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQljb3VudCAtPSBlcnI7CisJCQkv
KiBkbyBub3QgcmVhZCB0b28gbXVjaCBiZWNhdXNlIG9mIGZpbGUgaS9vIHBvaW50ZXIgKi8KKwkJ
CWlmIChjb3VudCA8IGFyZ3MuY291bnQpCisJCQkJYXJncy5jb3VudCA9IGNvdW50OworCQkJdWJ1
ZiArPSBlcnI7CisJCQlyZWFkICs9IGVycjsKKwkJfSB3aGlsZSAoY291bnQpOworCQlzbXBfbWIo
KTsgLyogZmx1c2ggdWJ1ZiAqLworCQllcnIgPSByZWFkOworCisJb3V0X2ZyZWU6CisJCWtmcmVl
KGFyZ3Mua2J1Zik7CisJb3V0OgorCQlyZXR1cm4gZXJyOworCX0KK30KKworc3NpemVfdCB2ZnN1
Yl9yZWFkX2soc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmtidWYsIHNpemVfdCBjb3VudCwgbG9m
Zl90ICpwcG9zLAorCQkgICAgIGludCBkbGd0KQoreworCWlmICghZGxndCkKKwkJcmV0dXJuIGRv
X3Zmc3ViX3JlYWRfayhmaWxlLCBrYnVmLCBjb3VudCwgcHBvcyk7CisJZWxzZSB7CisJCXNzaXpl
X3QgZXJyOworCQlpbnQgd2txX2VycjsKKwkJc3RydWN0IHJlYWRfYXJncyBhcmdzID0geworCQkJ
LmVycnAJPSAmZXJyLAorCQkJLmZpbGUJPSBmaWxlLAorCQkJLmNvdW50CT0gY291bnQsCisJCQku
cHBvcwk9IHBwb3MKKwkJfTsKKwkJYXJncy5rYnVmID0ga2J1ZjsKKwkJd2txX2VyciA9IGF1X3dr
cV93YWl0KGNhbGxfcmVhZF9rLCAmYXJncywgLypkbGd0Ki8xKTsKKwkJaWYgKHVubGlrZWx5KHdr
cV9lcnIpKQorCQkJZXJyID0gd2txX2VycjsKKwkJcmV0dXJuIGVycjsKKwl9Cit9CisKK3N0cnVj
dCB3cml0ZV9hcmdzIHsKKwlzc2l6ZV90ICplcnJwOworCXN0cnVjdCBmaWxlICpmaWxlOworCXVu
aW9uIHsKKwkJdm9pZCAqa2J1ZjsKKwkJY29uc3QgY2hhciBfX3VzZXIgKnVidWY7CisJfTsKKwl2
b2lkICpidWY7CisJc2l6ZV90IGNvdW50OworCWxvZmZfdCAqcHBvczsKKwlzdHJ1Y3QgdmZzdWJf
YXJncyAqdmFyZ3M7Cit9OworCitzdGF0aWMgdm9pZCBjYWxsX3dyaXRlX2sodm9pZCAqYXJncykK
K3sKKwlzdHJ1Y3Qgd3JpdGVfYXJncyAqYSA9IGFyZ3M7CisJTEtUUlRyYWNlKCIlLipzLCBjbnQg
JWx1LCBwb3MgJUxkXG4iLAorCQkgIEF1RExOUGFpcihhLT5maWxlLT5mX2RlbnRyeSksICh1bnNp
Z25lZCBsb25nKWEtPmNvdW50LAorCQkgICphLT5wcG9zKTsKKwl2ZnN1Yl9pZ25vcmUoYS0+dmFy
Z3MpOworCSphLT5lcnJwID0gZG9fdmZzdWJfd3JpdGVfayhhLT5maWxlLCBhLT5rYnVmLCBhLT5j
b3VudCwgYS0+cHBvcyk7CisJaWYgKHVubGlrZWx5KCphLT5lcnJwIDwgMCkpCisJCXZmc3ViX3Vu
aWdub3JlKGEtPnZhcmdzKTsKK30KKworc3NpemVfdCB2ZnN1Yl93cml0ZV91KHN0cnVjdCBmaWxl
ICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgICBs
b2ZmX3QgKnBwb3MsIHN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJncykKK3sKKwlzc2l6ZV90IGVycjsK
KworCWlmICghdmZzdWJfZnRlc3QodmFyZ3MtPmZsYWdzLCBETEdUKSkgeworCQl2ZnN1Yl9pZ25v
cmUodmFyZ3MpOworCQllcnIgPSBkb192ZnN1Yl93cml0ZV91KGZpbGUsIHVidWYsIGNvdW50LCBw
cG9zKTsKKwkJaWYgKHVubGlrZWx5KGVyciA8IDApKQorCQkJdmZzdWJfdW5pZ25vcmUodmFyZ3Mp
OworCX0gZWxzZSB7CisJCXNzaXplX3Qgd3JpdHRlbjsKKwkJaW50IHdrcV9lcnI7CisJCXN0cnVj
dCB3cml0ZV9hcmdzIGFyZ3MgPSB7CisJCQkuZXJycAk9ICZlcnIsCisJCQkuZmlsZQk9IGZpbGUs
CisJCQkuY291bnQJPSBjb3VudCwKKwkJCS5wcG9zCT0gcHBvcywKKwkJCS52YXJncwk9IHZhcmdz
CisJCX07CisKKwkJaWYgKHVubGlrZWx5KCFjb3VudCkpCisJCQlyZXR1cm4gMDsKKworCQkvKgor
CQkgKiB3b3JrYXJvdW5kIGFuIGFwcGxpY2F0aW9uIGJ1Zy4KKwkJICogZ2VuZXJhbGx5LCByZWFk
KDIpIG9yIHdyaXRlKDIpIG1heSByZXR1cm4gdGhlIHZhbHVlIHNob3J0ZXIKKwkJICogdGhhbiBy
ZXF1ZXN0ZWQuIEJ1dCBtYW55IGFwcGxpY2F0aW9ucyBkb24ndCBzdXBwb3J0IGl0LAorCQkgKiBm
b3IgZXhhbXBsZSBiYXNoLgorCQkgKi8KKwkJZXJyID0gLUVOT01FTTsKKwkJaWYgKGFyZ3MuY291
bnQgPiBQQUdFX1NJWkUpCisJCQlhcmdzLmNvdW50ID0gUEFHRV9TSVpFOworCQlhcmdzLmtidWYg
PSBrbWFsbG9jKGFyZ3MuY291bnQsIEdGUF9URU1QT1JBUlkpOworCQlpZiAodW5saWtlbHkoIWFy
Z3Mua2J1ZikpCisJCQlnb3RvIG91dDsKKworCQl3cml0dGVuID0gMDsKKwkJZG8geworCQkJaWYg
KHVubGlrZWx5KGNvcHlfZnJvbV91c2VyKGFyZ3Mua2J1ZiwgdWJ1ZiwKKwkJCQkJCSAgICBhcmdz
LmNvdW50KSkpIHsKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9
CisKKwkJCXdrcV9lcnIgPSBhdV93a3Ffd2FpdChjYWxsX3dyaXRlX2ssICZhcmdzLCAvKmRsZ3Qq
LzEpOworCQkJaWYgKHVubGlrZWx5KHdrcV9lcnIpKQorCQkJCWVyciA9IHdrcV9lcnI7CisJCQlp
ZiAoZXJyID4gMCkgeworCQkJCWNvdW50IC09IGVycjsKKwkJCQlpZiAoY291bnQgPCBhcmdzLmNv
dW50KQorCQkJCQlhcmdzLmNvdW50ID0gY291bnQ7CisJCQkJdWJ1ZiArPSBlcnI7CisJCQkJd3Jp
dHRlbiArPSBlcnI7CisJCQl9IGVsc2UgaWYgKCFlcnIpCisJCQkJYnJlYWs7CisJCQllbHNlIGlm
ICh1bmxpa2VseShlcnIgPCAwKSkKKwkJCQlnb3RvIG91dF9mcmVlOworCQl9IHdoaWxlIChjb3Vu
dCk7CisJCWVyciA9IHdyaXR0ZW47CisKKwlvdXRfZnJlZToKKwkJa2ZyZWUoYXJncy5rYnVmKTsK
Kwl9Cisgb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3NzaXplX3QgdmZzdWJfd3JpdGVfayhzdHJ1
Y3QgZmlsZSAqZmlsZSwgdm9pZCAqa2J1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MsCisJ
CSAgICAgIHN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJncykKK3sKKwlzc2l6ZV90IGVycjsKKworCWlm
ICghdmZzdWJfZnRlc3QodmFyZ3MtPmZsYWdzLCBETEdUKSkgeworCQl2ZnN1Yl9pZ25vcmUodmFy
Z3MpOworCQllcnIgPSBkb192ZnN1Yl93cml0ZV9rKGZpbGUsIGtidWYsIGNvdW50LCBwcG9zKTsK
KwkJaWYgKHVubGlrZWx5KGVyciA8IDApKQorCQkJdmZzdWJfdW5pZ25vcmUodmFyZ3MpOworCX0g
ZWxzZSB7CisJCWludCB3a3FfZXJyOworCQlzdHJ1Y3Qgd3JpdGVfYXJncyBhcmdzID0geworCQkJ
LmVycnAJPSAmZXJyLAorCQkJLmZpbGUJPSBmaWxlLAorCQkJLmNvdW50CT0gY291bnQsCisJCQku
cHBvcwk9IHBwb3MsCisJCQkudmFyZ3MJPSB2YXJncworCQl9OworCQlhcmdzLmtidWYgPSBrYnVm
OworCQl3a3FfZXJyID0gYXVfd2txX3dhaXQoY2FsbF93cml0ZV9rLCAmYXJncywgLypkbGd0Ki8x
KTsKKwkJaWYgKHVubGlrZWx5KHdrcV9lcnIpKQorCQkJZXJyID0gd2txX2VycjsKKwl9CisJcmV0
dXJuIGVycjsKK30KKworc3RydWN0IHJlYWRkaXJfYXJncyB7CisJaW50ICplcnJwOworCXN0cnVj
dCBmaWxlICpmaWxlOworCWZpbGxkaXJfdCBmaWxsZGlyOworCXZvaWQgKmFyZzsKK307CisKK3N0
YXRpYyB2b2lkIGNhbGxfcmVhZGRpcih2b2lkICphcmdzKQoreworCXN0cnVjdCByZWFkZGlyX2Fy
Z3MgKmEgPSBhcmdzOworCSphLT5lcnJwID0gZG9fdmZzdWJfcmVhZGRpcihhLT5maWxlLCBhLT5m
aWxsZGlyLCBhLT5hcmcpOworfQorCitpbnQgdmZzdWJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmls
ZSwgZmlsbGRpcl90IGZpbGxkaXIsIHZvaWQgKmFyZywgaW50IGRsZ3QpCit7CisJaWYgKCFkbGd0
KQorCQlyZXR1cm4gZG9fdmZzdWJfcmVhZGRpcihmaWxlLCBmaWxsZGlyLCBhcmcpOworCWVsc2Ug
eworCQlpbnQgZXJyLCB3a3FfZXJyOworCQlzdHJ1Y3QgcmVhZGRpcl9hcmdzIGFyZ3MgPSB7CisJ
CQkuZXJycAkJPSAmZXJyLAorCQkJLmZpbGUJCT0gZmlsZSwKKwkJCS5maWxsZGlyCT0gZmlsbGRp
ciwKKwkJCS5hcmcJCT0gYXJnCisJCX07CisJCXdrcV9lcnIgPSBhdV93a3Ffd2FpdChjYWxsX3Jl
YWRkaXIsICZhcmdzLCAvKmRsZ3QqLzEpOworCQlpZiAodW5saWtlbHkod2txX2VycikpCisJCQll
cnIgPSB3a3FfZXJyOworCQlyZXR1cm4gZXJyOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAq
LworCitzdHJ1Y3Qgc3BsaWNlX3RvX2FyZ3MgeworCWxvbmcgKmVycnA7CisJc3RydWN0IGZpbGUg
KmluOworCWxvZmZfdCAqcHBvczsKKwlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlOworCXNp
emVfdCBsZW47CisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworc3RhdGljIHZvaWQgY2FsbF9z
cGxpY2VfdG8odm9pZCAqYXJncykKK3sKKwlzdHJ1Y3Qgc3BsaWNlX3RvX2FyZ3MgKmEgPSBhcmdz
OworCSphLT5lcnJwID0gZG9fdmZzdWJfc3BsaWNlX3RvKGEtPmluLCBhLT5wcG9zLCBhLT5waXBl
LCBhLT5sZW4sCisJCQkJICAgICAgYS0+ZmxhZ3MpOworfQorCitsb25nIHZmc3ViX3NwbGljZV90
byhzdHJ1Y3QgZmlsZSAqaW4sIGxvZmZfdCAqcHBvcywKKwkJICAgICBzdHJ1Y3QgcGlwZV9pbm9k
ZV9pbmZvICpwaXBlLCBzaXplX3QgbGVuLAorCQkgICAgIHVuc2lnbmVkIGludCBmbGFncywgaW50
IGRsZ3QpCit7CisJaWYgKCFkbGd0KQorCQlyZXR1cm4gZG9fdmZzdWJfc3BsaWNlX3RvKGluLCBw
cG9zLCBwaXBlLCBsZW4sIGZsYWdzKTsKKwllbHNlIHsKKwkJbG9uZyBlcnI7CisJCWludCB3a3Ff
ZXJyOworCQlzdHJ1Y3Qgc3BsaWNlX3RvX2FyZ3MgYXJncyA9IHsKKwkJCS5lcnJwCT0gJmVyciwK
KwkJCS5pbgk9IGluLAorCQkJLnBwb3MJPSBwcG9zLAorCQkJLnBpcGUJPSBwaXBlLAorCQkJLmxl
bgk9IGxlbiwKKwkJCS5mbGFncwk9IGZsYWdzCisJCX07CisJCXdrcV9lcnIgPSBhdV93a3Ffd2Fp
dChjYWxsX3NwbGljZV90bywgJmFyZ3MsIC8qZGxndCovMSk7CisJCWlmICh1bmxpa2VseSh3a3Ff
ZXJyKSkKKwkJCWVyciA9IHdrcV9lcnI7CisJCXJldHVybiBlcnI7CisJfQorfQorCitzdHJ1Y3Qg
c3BsaWNlX2Zyb21fYXJncyB7CisJbG9uZyAqZXJycDsKKwlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZv
ICpwaXBlOworCXN0cnVjdCBmaWxlICpvdXQ7CisJbG9mZl90ICpwcG9zOworCXNpemVfdCBsZW47
CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJnczsKK307CisK
K3N0YXRpYyB2b2lkIGNhbGxfc3BsaWNlX2Zyb20odm9pZCAqYXJncykKK3sKKwlzdHJ1Y3Qgc3Bs
aWNlX2Zyb21fYXJncyAqYSA9IGFyZ3M7CisJdmZzdWJfaWdub3JlKGEtPnZhcmdzKTsKKwkqYS0+
ZXJycCA9IGRvX3Zmc3ViX3NwbGljZV9mcm9tKGEtPnBpcGUsIGEtPm91dCwgYS0+cHBvcywgYS0+
bGVuLAorCQkJCQlhLT5mbGFncyk7CisJaWYgKHVubGlrZWx5KCphLT5lcnJwIDwgMCkpCisJCXZm
c3ViX3VuaWdub3JlKGEtPnZhcmdzKTsKK30KKworbG9uZyB2ZnN1Yl9zcGxpY2VfZnJvbShzdHJ1
Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCBzdHJ1Y3QgZmlsZSAqb3V0LAorCQkgICAgICAgbG9m
Zl90ICpwcG9zLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCSAgICAgICBzdHJ1
Y3QgdmZzdWJfYXJncyAqdmFyZ3MpCit7CisJbG9uZyBlcnI7CisKKwlpZiAoIXZmc3ViX2Z0ZXN0
KHZhcmdzLT5mbGFncywgRExHVCkpIHsKKwkJdmZzdWJfaWdub3JlKHZhcmdzKTsKKwkJZXJyID0g
ZG9fdmZzdWJfc3BsaWNlX2Zyb20ocGlwZSwgb3V0LCBwcG9zLCBsZW4sIGZsYWdzKTsKKwkJaWYg
KHVubGlrZWx5KGVyciA8IDApKQorCQkJdmZzdWJfdW5pZ25vcmUodmFyZ3MpOworCX0gZWxzZSB7
CisJCWludCB3a3FfZXJyOworCQlzdHJ1Y3Qgc3BsaWNlX2Zyb21fYXJncyBhcmdzID0geworCQkJ
LmVycnAJPSAmZXJyLAorCQkJLnBpcGUJPSBwaXBlLAorCQkJLm91dAk9IG91dCwKKwkJCS5wcG9z
CT0gcHBvcywKKwkJCS5sZW4JPSBsZW4sCisJCQkuZmxhZ3MJPSBmbGFncywKKwkJCS52YXJncwk9
IHZhcmdzCisJCX07CisJCXdrcV9lcnIgPSBhdV93a3Ffd2FpdChjYWxsX3NwbGljZV9mcm9tLCAm
YXJncywgLypkbGd0Ki8xKTsKKwkJaWYgKHVubGlrZWx5KHdrcV9lcnIpKQorCQkJZXJyID0gd2tx
X2VycjsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1
Y3QgZ2V0YXR0cl9hcmdzIHsKKwlpbnQgKmVycnA7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisJ
c3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBrc3RhdCAqc3Q7Cit9OworCitzdGF0aWMg
dm9pZCBjYWxsX2dldGF0dHIodm9pZCAqYXJncykKK3sKKwlzdHJ1Y3QgZ2V0YXR0cl9hcmdzICph
ID0gYXJnczsKKwkqYS0+ZXJycCA9IGRvX3Zmc3ViX2dldGF0dHIoYS0+bW50LCBhLT5kZW50cnks
IGEtPnN0KTsKK30KKworaW50IHZmc3ViX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0
cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdCwKKwkJICBpbnQgZGxndCkKK3sK
KwlpZiAoIWRsZ3QpCisJCXJldHVybiBkb192ZnN1Yl9nZXRhdHRyKG1udCwgZGVudHJ5LCBzdCk7
CisJZWxzZSB7CisJCWludCBlcnIsIHdrcV9lcnI7CisJCXN0cnVjdCBnZXRhdHRyX2FyZ3MgYXJn
cyA9IHsKKwkJCS5lcnJwCT0gJmVyciwKKwkJCS5tbnQJPSBtbnQsCisJCQkuZGVudHJ5CT0gZGVu
dHJ5LAorCQkJLnN0CT0gc3QKKwkJfTsKKwkJd2txX2VyciA9IGF1X3drcV93YWl0KGNhbGxfZ2V0
YXR0ciwgJmFyZ3MsIC8qZGxndCovMSk7CisJCWlmICh1bmxpa2VseSh3a3FfZXJyKSkKKwkJCWVy
ciA9IHdrcV9lcnI7CisJCXJldHVybiBlcnI7CisJfQorfQpkaWZmIC11ck4gbGludXgtMi42LjI1
LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvaGlub3RpZnkuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZz
L2ZzL2F1ZnMvaGlub3RpZnkuYwotLS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1
ZnMvaGlub3RpZnkuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUu
NC11bmlvbmZzL2ZzL2F1ZnMvaGlub3RpZnkuYwkyMDA4LTA1LTI1IDExOjU4OjUzICswMzAwCkBA
IC0wLDAgKzEsMTA1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEp1bmppcm8g
T2thamltYQorICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhp
cyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dy
YW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAg
VVNBCisgKi8KKworLyoKKyAqIGludGVybmFsL2hpZGRlbiBpbm90aWZ5IGhhbmRsZXIKKyAqCisg
KiAkSWQ6IGhpbm90aWZ5LmMsdiAxLjUgMjAwOC8wNS8xOSAwMTo0OToxMSBzZmpybyBFeHAgJAor
ICovCisKKyNpbmNsdWRlICJhdWZzLmgiCisKKy8qIGlub3RpZnkgZXZlbnRzICovCitzdGF0aWMg
Y29uc3QgX191MzIgQXVJbk1hc2sgPSAoSU5fTU9WRSB8IElOX0RFTEVURSB8IElOX0NSRUFURQor
CQkJICAgICAgIC8qIHwgSU5fQUNDRVNTICovCisJCQkgICAgICAgfCBJTl9NT0RJRlkgfCBJTl9B
VFRSSUIKKwkJCSAgICAgICAvKiB8IElOX0RFTEVURV9TRUxGIHwgSU5fTU9WRV9TRUxGICovCisJ
KTsKK3N0YXRpYyBzdHJ1Y3QgaW5vdGlmeV9oYW5kbGUgKmluX2hhbmRsZTsKKworLyogdGhlIHNp
emUgb2YgYW4gYXJyYXkgZm9yIGlnbm9yZSBjb3VudGVyICovCitzdGF0aWMgaW50IGF1X2hpbl9u
aWdub3JlOworCitBdUNhY2hlRnVuY3MoaGlub3RpZnksIEF1Q2FjaGVfSElOT1RJRlkpOworCitp
bnQgYXVfaGluX2FsbG9jKHN0cnVjdCBhdV9oaW5vZGUgKmhpbm9kZSwgc3RydWN0IGlub2RlICpp
bm9kZSwKKwkJIHN0cnVjdCBpbm9kZSAqaGlkZGVuX2lub2RlKQoreworCWludCBlcnIsIGk7CisJ
c3RydWN0IGF1X2hpbm90aWZ5ICpoaW47CisJczMyIHdkOworCisJTEtUUlRyYWNlKCJpJWx1LCBo
aSVsdVxuIiwgaW5vZGUtPmlfaW5vLCBoaWRkZW5faW5vZGUtPmlfaW5vKTsKKworCWVyciA9IC1F
Tk9NRU07CisJaGluID0gYXVfY2FjaGVfYWxsb2NfaGlub3RpZnkoKTsKKwlpZiAoaGluKSB7CisJ
CUF1RGVidWdPbihoaW5vZGUtPmhpX25vdGlmeSk7CisJCWhpbm9kZS0+aGlfbm90aWZ5ID0gaGlu
OworCQloaW4tPmhpbl9hdWZzX2lub2RlID0gaW5vZGU7CisJCWZvciAoaSA9IDA7IGkgPCBhdV9o
aW5fbmlnbm9yZTsgaSsrKQorCQkJYXRvbWljX3NldChoaW4tPmhpbl9pZ25vcmUgKyBpLCAwKTsK
KworCQlpbm90aWZ5X2luaXRfd2F0Y2goJmhpbi0+aGluX3dhdGNoKTsKKwkJd2QgPSBpbm90aWZ5
X2FkZF93YXRjaChpbl9oYW5kbGUsICZoaW4tPmhpbl93YXRjaCwgaGlkZGVuX2lub2RlLAorCQkJ
CSAgICAgICBBdUluTWFzayk7CisJCWlmICh3ZCA+PSAwKQorCQkJcmV0dXJuIDA7IC8qIHN1Y2Nl
c3MgKi8KKworCQllcnIgPSB3ZDsKKwkJcHV0X2lub3RpZnlfd2F0Y2goJmhpbi0+aGluX3dhdGNo
KTsKKwkJYXVfY2FjaGVfZnJlZV9oaW5vdGlmeShoaW4pOworCQloaW5vZGUtPmhpX25vdGlmeSA9
IE5VTEw7CisJfQorCisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQg
YXVfaGluX2ZyZWUoc3RydWN0IGF1X2hpbm9kZSAqaGlub2RlKQoreworCWludCBlcnI7CisJc3Ry
dWN0IGF1X2hpbm90aWZ5ICpoaW47CisKKwlBdVRyYWNlRW50ZXIoKTsKKworCWhpbiA9IGhpbm9k
ZS0+aGlfbm90aWZ5OworCWlmICh1bmxpa2VseShoaW4pKSB7CisJCWVyciA9IDA7CisJCWlmIChh
dG9taWNfcmVhZCgmaGluLT5oaW5fd2F0Y2guY291bnQpKQorCQkJZXJyID0gaW5vdGlmeV9ybV93
YXRjaChpbl9oYW5kbGUsICZoaW4tPmhpbl93YXRjaCk7CisJCWlmICh1bmxpa2VseShlcnIpKQor
CQkJLyogaXQgbWVhbnMgdGhlIHdhdGNoIGlzIGFscmVhZHkgcmVtb3ZlZCAqLworCQkJTEtUUlRy
YWNlKCJmYWlsZWQgaW5vdGlmeV9ybV93YXRjaCgpICVkXG4iLCBlcnIpOworCQlhdV9jYWNoZV9m
cmVlX2hpbm90aWZ5KGhpbik7CisJCWhpbm9kZS0+aGlfbm90aWZ5ID0gTlVMTDsKKwl9Cit9CisK
Ky8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgY3RsX2hpbm90aWZ5KHN0cnVjdCBh
dV9oaW5vZGUgKmhpbm9kZSwgY29uc3QgX191MzIgbWFzaykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmhf
aW5vZGU7CisJc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoOworCisJaF9pbm9kZSA9IGhpbm9k
ZS0+aGlfaW5vZGU7CisJTEtUUlRyYWNlKCJoaSVsdSwgc2IgJXAsIDB4JXhcbiIsIGhfaW5vZGUt
PmlfaW5vLCBoX2lub2RlLT5pX3NiLCBtYXNrKTsKKwlJTXVzdExvY2soaF9pbm9kZSk7CisJaWYg
KCFoaW5vZGUtPmhpX25vdGlmeSkKKwkJcmV0dXJuOworCisJd2F0Y2ggPSAmaGlub2RlLT5oaV9u
b3RpZnktPmhpbl93YXRjaDsKKwkvKiBzdHJ1Y3QgaW5vdGlmeV9oYW5kbGUgaXMgaGlkZGVuICov
CisJbXV0ZXhfbG9jaygmaF9pbm9kZS0+aW5vdGlmeV9tdXRleCk7CisJLy9tdXRleF9sb2NrKCZ3
YXRjaC0+aWgtPm11dGV4KTsKKwl3YXRjaC0+bWFzayA9IG1hc2s7CisJLy9tdXRleF91bmxvY2so
JndhdGNoLT5paC0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmaF9pbm9kZS0+aW5vdGlmeV9tdXRl
eCk7CisJTEtUUlRyYWNlKCJ3YXRjaCAlcCwgbWFzayAldVxuIiwgd2F0Y2gsIHdhdGNoLT5tYXNr
KTsKK30KKworI2RlZmluZSBzdXNwZW5kX2hpbm90aWZ5KGhpKQljdGxfaGlub3RpZnkoaGksIDAp
CisjZGVmaW5lIHJlc3VtZV9oaW5vdGlmeShoaSkJY3RsX2hpbm90aWZ5KGhpLCBBdUluTWFzaykK
Kwordm9pZCBhdV9kb19oZGlyX2xvY2soc3RydWN0IGlub2RlICpoX2Rpciwgc3RydWN0IGlub2Rl
ICpkaXIsCisJCSAgICAgYXVmc19iaW5kZXhfdCBiaW5kZXgsIHVuc2lnbmVkIGludCBsc2MpCit7
CisJc3RydWN0IGF1X2hpbm9kZSAqaGlub2RlOworCisJTEtUUlRyYWNlKCJpJWx1LCBiJWQsIGxz
YyAlZFxuIiwgZGlyLT5pX2lubywgYmluZGV4LCBsc2MpOworCUF1RGVidWdPbighU19JU0RJUihk
aXItPmlfbW9kZSkpOworCWhpbm9kZSA9IGF1X2lpKGRpciktPmlpX2hpbm9kZSArIGJpbmRleDsK
KwlBdURlYnVnT24oaF9kaXIgIT0gaGlub2RlLT5oaV9pbm9kZSk7CisKKwltdXRleF9sb2NrX25l
c3RlZCgmaF9kaXItPmlfbXV0ZXgsIGxzYyk7CisJc3VzcGVuZF9oaW5vdGlmeShoaW5vZGUpOwor
fQorCit2b2lkIGF1X2hkaXJfdW5sb2NrKHN0cnVjdCBpbm9kZSAqaF9kaXIsIHN0cnVjdCBpbm9k
ZSAqZGlyLAorCQkgICAgYXVmc19iaW5kZXhfdCBiaW5kZXgpCit7CisJc3RydWN0IGF1X2hpbm9k
ZSAqaGlub2RlOworCisJTEtUUlRyYWNlKCJpJWx1LCBiJWRcbiIsIGRpci0+aV9pbm8sIGJpbmRl
eCk7CisJQXVEZWJ1Z09uKCFTX0lTRElSKGRpci0+aV9tb2RlKSk7CisJaGlub2RlID0gYXVfaWko
ZGlyKS0+aWlfaGlub2RlICsgYmluZGV4OworCUF1RGVidWdPbihoX2RpciAhPSBoaW5vZGUtPmhp
X2lub2RlKTsKKworCXJlc3VtZV9oaW5vdGlmeShoaW5vZGUpOworCW11dGV4X3VubG9jaygmaF9k
aXItPmlfbXV0ZXgpOworfQorCitzdHJ1Y3QgZGVudHJ5ICphdV9oZGlyX2xvY2tfcmVuYW1lKHN0
cnVjdCBkZW50cnkgKipoX3BhcmVudHMsCisJCQkJICAgc3RydWN0IGlub2RlICoqZGlycywgYXVm
c19iaW5kZXhfdCBiaW5kZXgsCisJCQkJICAgaW50IGlzc2FtZWRpcikKK3sKKwlzdHJ1Y3QgZGVu
dHJ5ICpoX3RyYXA7CisJc3RydWN0IGF1X2hpbm9kZSAqaGlub2RlOworCisJTEtUUlRyYWNlKCIl
LipzLCAlLipzXG4iLAorCQkgIEF1RExOUGFpcihoX3BhcmVudHNbMF0pLCBBdURMTlBhaXIoaF9w
YXJlbnRzWzFdKSk7CisKKwloX3RyYXAgPSB2ZnN1Yl9sb2NrX3JlbmFtZShoX3BhcmVudHNbMF0s
IGhfcGFyZW50c1sxXSk7CisJaGlub2RlID0gYXVfaWkoZGlyc1swXSktPmlpX2hpbm9kZSArIGJp
bmRleDsKKwlBdURlYnVnT24oaF9wYXJlbnRzWzBdLT5kX2lub2RlICE9IGhpbm9kZS0+aGlfaW5v
ZGUpOworCXN1c3BlbmRfaGlub3RpZnkoaGlub2RlKTsKKwlpZiAoIWlzc2FtZWRpcikgeworCQlo
aW5vZGUgPSBhdV9paShkaXJzWzFdKS0+aWlfaGlub2RlICsgYmluZGV4OworCQlBdURlYnVnT24o
aF9wYXJlbnRzWzFdLT5kX2lub2RlICE9IGhpbm9kZS0+aGlfaW5vZGUpOworCQlzdXNwZW5kX2hp
bm90aWZ5KGhpbm9kZSk7CisJfQorCisJcmV0dXJuIGhfdHJhcDsKK30KKwordm9pZCBhdV9oZGly
X3VubG9ja19yZW5hbWUoc3RydWN0IGRlbnRyeSAqKmhfcGFyZW50cywgc3RydWN0IGlub2RlICoq
ZGlycywKKwkJCSAgIGF1ZnNfYmluZGV4X3QgYmluZGV4LCBpbnQgaXNzYW1lZGlyKQoreworCXN0
cnVjdCBhdV9oaW5vZGUgKmhpbm9kZTsKKworCUxLVFJUcmFjZSgiJS4qcywgJS4qc1xuIiwKKwkJ
ICBBdURMTlBhaXIoaF9wYXJlbnRzWzBdKSwgQXVETE5QYWlyKGhfcGFyZW50c1sxXSkpOworCisJ
aGlub2RlID0gYXVfaWkoZGlyc1swXSktPmlpX2hpbm9kZSArIGJpbmRleDsKKwlBdURlYnVnT24o
aF9wYXJlbnRzWzBdLT5kX2lub2RlICE9IGhpbm9kZS0+aGlfaW5vZGUpOworCXJlc3VtZV9oaW5v
dGlmeShoaW5vZGUpOworCWlmICghaXNzYW1lZGlyKSB7CisJCWhpbm9kZSA9IGF1X2lpKGRpcnNb
MV0pLT5paV9oaW5vZGUgKyBiaW5kZXg7CisJCUF1RGVidWdPbihoX3BhcmVudHNbMV0tPmRfaW5v
ZGUgIT0gaGlub2RlLT5oaV9pbm9kZSk7CisJCXJlc3VtZV9oaW5vdGlmeShoaW5vZGUpOworCX0K
Kwl2ZnN1Yl91bmxvY2tfcmVuYW1lKGhfcGFyZW50c1swXSwgaF9wYXJlbnRzWzFdKTsKK30KKwor
dm9pZCBhdV9yZXNldF9oaW5vdGlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQg
ZmxhZ3MpCit7CisJYXVmc19iaW5kZXhfdCBiaW5kZXgsIGJlbmQ7CisJc3RydWN0IGlub2RlICpo
aTsKKwlzdHJ1Y3QgZGVudHJ5ICppd2hkZW50cnk7CisKKwlMS1RSVHJhY2UoImklbHUsIDB4JXhc
biIsIGlub2RlLT5pX2lubywgZmxhZ3MpOworCisJYmVuZCA9IGF1X2liZW5kKGlub2RlKTsKKwlm
b3IgKGJpbmRleCA9IGF1X2lic3RhcnQoaW5vZGUpOyBiaW5kZXggPD0gYmVuZDsgYmluZGV4Kysp
IHsKKwkJaGkgPSBhdV9oX2lwdHIoaW5vZGUsIGJpbmRleCk7CisJCWlmIChoaSkgeworCQkJLy9t
dXRleF9sb2NrX25lc3RlZCgmaGktPmlfbXV0ZXgsIEF1THNjX0lfQ0hJTEQpOworCQkJaXdoZGVu
dHJ5ID0gYXVfaGlfd2goaW5vZGUsIGJpbmRleCk7CisJCQlpZiAodW5saWtlbHkoaXdoZGVudHJ5
KSkKKwkJCQlkZ2V0KGl3aGRlbnRyeSk7CisJCQlpZ3JhYihoaSk7CisJCQlhdV9zZXRfaF9pcHRy
KGlub2RlLCBiaW5kZXgsIE5VTEwsIDApOworCQkJYXVfc2V0X2hfaXB0cihpbm9kZSwgYmluZGV4
LCBpZ3JhYihoaSksCisJCQkJICAgICAgZmxhZ3MgJiB+QXVIaV9YSU5PKTsKKwkJCWlwdXQoaGkp
OworCQkJZHB1dChpd2hkZW50cnkpOworCQkJLy9tdXRleF91bmxvY2soJmhpLT5pX211dGV4KTsK
KwkJfQorCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBjZi4gZnNub3RpZnlfY2hh
bmdlKCkgKi8KK19fdTMyIHZmc3ViX2V2ZW50c19ub3RpZnlfY2hhbmdlKHN0cnVjdCBpYXR0ciAq
aWEpCit7CisJX191MzIgZXZlbnRzOworCWNvbnN0IHVuc2lnbmVkIGludCBhbXRpbWUgPSAoQVRU
Ul9BVElNRSB8IEFUVFJfTVRJTUUpOworCisJZXZlbnRzID0gMDsKKwlpZiAoKGlhLT5pYV92YWxp
ZCAmIChBVFRSX1VJRCB8IEFUVFJfR0lEIHwgQVRUUl9NT0RFKSkKKwkgICAgfHwgKGlhLT5pYV92
YWxpZCAmIGFtdGltZSkgPT0gYW10aW1lKQorCQlldmVudHMgfD0gSU5fQVRUUklCOworCWlmICgo
aWEtPmlhX3ZhbGlkICYgQVRUUl9TSVpFKQorCSAgICB8fCAoaWEtPmlhX3ZhbGlkICYgYW10aW1l
KSA9PSBBVFRSX01USU1FKQorCQlldmVudHMgfD0gSU5fTU9ESUZZOworCXJldHVybiBldmVudHM7
Cit9CisKK3ZvaWQgdmZzdWJfaWduX2hpbm9kZShzdHJ1Y3QgdmZzdWJfYXJncyAqdmFyZ3MsIF9f
dTMyIGV2ZW50cywKKwkJICAgICAgc3RydWN0IGF1X2hpbm9kZSAqaGlub2RlKQoreworCXN0cnVj
dCBhdV9oaW5faWdub3JlICppZ247CisKKwlBdURlYnVnT24oIWhpbm9kZSk7CisKKwlpZ24gPSB2
YXJncy0+aWdub3JlICsgdmFyZ3MtPm5pZ25vcmUrKzsKKwlpZ24tPmlnbl9ldmVudHMgPSBldmVu
dHM7CisJaWduLT5pZ25faGlub2RlID0gaGlub2RlOworfQorCit2b2lkIHZmc3ViX2lnbm9yZShz
dHJ1Y3QgdmZzdWJfYXJncyAqdmFyZ3MpCit7CisJaW50IG47CisJc3RydWN0IGF1X2hpbl9pZ25v
cmUgKmlnbjsKKworCW4gPSB2YXJncy0+bmlnbm9yZTsKKwlpZ24gPSB2YXJncy0+aWdub3JlOwor
CXdoaWxlIChuLS0gPiAwKSB7CisJCWF1X2hpbl9pZ25vcmUoaWduLT5pZ25faGlub2RlLCBpZ24t
Pmlnbl9ldmVudHMpOworCQlpZ24rKzsKKwl9Cit9CisKK3ZvaWQgdmZzdWJfdW5pZ25vcmUoc3Ry
dWN0IHZmc3ViX2FyZ3MgKnZhcmdzKQoreworCWludCBuOworCXN0cnVjdCBhdV9oaW5faWdub3Jl
ICppZ247CisKKwluID0gdmFyZ3MtPm5pZ25vcmU7CisJaWduID0gdmFyZ3MtPmlnbm9yZTsKKwl3
aGlsZSAobi0tID4gMCkgeworCQlhdV9oaW5fdW5pZ25vcmUoaWduLT5pZ25faGlub2RlLCBpZ24t
Pmlnbl9ldmVudHMpOworCQlpZ24rKzsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwor
dm9pZCBhdV9oaW5faWdub3JlKHN0cnVjdCBhdV9oaW5vZGUgKmhpbm9kZSwgX191MzIgZXZlbnRz
KQoreworCWludCBpOworCWF0b21pY190ICppZ247CisKKwlMS1RSVHJhY2UoIjB4JXhcbiIsIGV2
ZW50cyk7CisJQXVEZWJ1Z09uKCFoaW5vZGUgfHwgIWV2ZW50cyk7CisJaWYgKHVubGlrZWx5KCFo
aW5vZGUtPmhpX2lub2RlIHx8ICFoaW5vZGUtPmhpX25vdGlmeSkpIHsKKwkJLyoKKwkJICogaXQg
bWF5IGhhcHBlbiBieSB0aGlzIHNjZW5hcmlvLgorCQkgKiAtIGEgZmlsZSBhbmQgaXRzIHBhcmVu
dCBkaXIgZXhpc3Qgb24gdHdvIGJyYW5jaGVzCisJCSAqIC0gYSBmaWxlIG9uIHRoZSB1cHBlciBi
cmFuY2ggaXMgb3BlbmVkCisJCSAqIC0gdGhlIHBhcmVudCBkaXIgYW5kIHRoZSBmaWxlIGFyZSBy
ZW1vdmVkIGJ5IHVkYmEKKwkJICogLSB0aGUgcGFyZW50IGlzIHJlLWFjY2Vzc2VkLCBhbmQgbmV3
IGRlbnRyeS9pbm9kZSBpbgorCQkgKiAgIGF1ZnMgaXMgZ2VuZXJhdGVkIGZvciBpdCwgYmFzZWQg
dXBvbiB0aGUgb25lIG9uIHRoZSBsb3dlcgorCQkgKiAgIGJyYW5jaAorCQkgKiAtIHRoZSBvcGVu
ZWQgZmlsZSBpcyByZS1hY2Nlc3NlZCwgcmUtdmFsaWRhdGVkLCBhbmQgaXQgbWF5IGJlCisJCSAq
ICAgcmUtY29ubmVjdGVkIHRvIHRoZSBuZXcgcGFyZW50IGRlbnRyeQorCQkgKiBpdCBtZWFucyB0
aGUgZmlsZSBpbiBhdWZzIGNhbm5vdCBnZXQgdGhlIGFjdHVhbCByZW1vdmVkCisJCSAqIHBhcmVu
dCBkaXIgb24gdGhlIGJyYW5jaC4KKwkJICovCisJCXJldHVybjsKKwl9CisJTEtUUlRyYWNlKCJo
aSVsdVxuIiwgaGlub2RlLT5oaV9pbm9kZS0+aV9pbm8pOworI2lmZGVmIERiZ0lub3RpZnkKKwlB
dURiZygiaGklbHUsIDB4JXhcbiIsIGhpbm9kZS0+aGlfaW5vZGUtPmlfaW5vLCBldmVudHMpOwor
I2VuZGlmCisJQXVEZWJ1Z09uKCFoaW5vZGUtPmhpX25vdGlmeSk7CisKKwlpZ24gPSBoaW5vZGUt
PmhpX25vdGlmeS0+aGluX2lnbm9yZTsKKwlmb3IgKGkgPSAwOyBpIDwgYXVfaGluX25pZ25vcmU7
IGkrKykKKwkJaWYgKDFVIDw8IGkgJiBldmVudHMpCisJCQlhdG9taWNfaW5jX3JldHVybihpZ24g
KyBpKTsKK30KKwordm9pZCBhdV9oaW5fdW5pZ25vcmUoc3RydWN0IGF1X2hpbm9kZSAqaGlub2Rl
LCBfX3UzMiBldmVudHMpCit7CisJaW50IGk7CisJYXRvbWljX3QgKmlnbjsKKworCUxLVFJUcmFj
ZSgiMHgleFxuIiwgZXZlbnRzKTsKKwlBdURlYnVnT24oIWhpbm9kZSB8fCAhZXZlbnRzKTsKKwlp
ZiAodW5saWtlbHkoIWhpbm9kZS0+aGlfaW5vZGUgfHwgIWhpbm9kZS0+aGlfbm90aWZ5KSkKKwkJ
cmV0dXJuOworCUxLVFJUcmFjZSgiaGklbHVcbiIsIGhpbm9kZS0+aGlfaW5vZGUtPmlfaW5vKTsK
KyNpZmRlZiBEYmdJbm90aWZ5CisJQXVEYmcoImhpJWx1LCAweCV4XG4iLCBoaW5vZGUtPmhpX2lu
b2RlLT5pX2lubywgZXZlbnRzKTsKKyNlbmRpZgorCUF1RGVidWdPbighaGlub2RlLT5oaV9ub3Rp
ZnkpOworCisJaWduID0gaGlub2RlLT5oaV9ub3RpZnktPmhpbl9pZ25vcmU7CisJZm9yIChpID0g
MDsgaSA8IGF1X2hpbl9uaWdub3JlOyBpKyspCisJCWlmICgxVSA8PCBpICYgZXZlbnRzKQorCQkJ
YXRvbWljX2RlY19yZXR1cm4oaWduICsgaSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwor
c3RhdGljIGNoYXIgKmluX25hbWUodTMyIG1hc2spCit7CisjaWZkZWYgQ09ORklHX0FVRlNfREVC
VUcKKyNkZWZpbmUgdGVzdF9yZXQoZmxhZykJaWYgKG1hc2sgJiBmbGFnKSByZXR1cm4gI2ZsYWc7
CisJdGVzdF9yZXQoSU5fQUNDRVNTKTsKKwl0ZXN0X3JldChJTl9NT0RJRlkpOworCXRlc3RfcmV0
KElOX0FUVFJJQik7CisJdGVzdF9yZXQoSU5fQ0xPU0VfV1JJVEUpOworCXRlc3RfcmV0KElOX0NM
T1NFX05PV1JJVEUpOworCXRlc3RfcmV0KElOX09QRU4pOworCXRlc3RfcmV0KElOX01PVkVEX0ZS
T00pOworCXRlc3RfcmV0KElOX01PVkVEX1RPKTsKKwl0ZXN0X3JldChJTl9DUkVBVEUpOworCXRl
c3RfcmV0KElOX0RFTEVURSk7CisJdGVzdF9yZXQoSU5fREVMRVRFX1NFTEYpOworCXRlc3RfcmV0
KElOX01PVkVfU0VMRik7CisJdGVzdF9yZXQoSU5fVU5NT1VOVCk7CisJdGVzdF9yZXQoSU5fUV9P
VkVSRkxPVyk7CisJdGVzdF9yZXQoSU5fSUdOT1JFRCk7CisJcmV0dXJuICIiOworI3VuZGVmIHRl
c3RfcmV0CisjZWxzZQorCXJldHVybiAiPz8iOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmxvb2t1cF93bG9ja19ieV9uYW1lKGNoYXIg
Km5hbWUsIHVuc2lnbmVkIGludCBubGVuLAorCQkJCQkgICBzdHJ1Y3QgaW5vZGUgKmRpcikKK3sK
KwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksICpkLCAqcGFyZW50OworCXN0cnVjdCBxc3RyICpkbmFt
ZTsKKworCUxLVFJUcmFjZSgiJS4qcywgZGlyJWx1XG4iLCBubGVuLCBuYW1lLCBkaXItPmlfaW5v
KTsKKworCXBhcmVudCA9IGRfZmluZF9hbGlhcyhkaXIpOworCWlmICghcGFyZW50KQorCQlyZXR1
cm4gTlVMTDsKKworCWRlbnRyeSA9IE5VTEw7CisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJ
bGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmcGFyZW50LT5kX3N1YmRpcnMsIGRfdS5kX2NoaWxkKSB7
CisJCUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVETE5QYWlyKGQpKTsKKwkJZG5hbWUgPSAmZC0+ZF9u
YW1lOworCQlpZiAoZG5hbWUtPmxlbiAhPSBubGVuIHx8IG1lbWNtcChkbmFtZS0+bmFtZSwgbmFt
ZSwgbmxlbikpCisJCQljb250aW51ZTsKKwkJaWYgKCFhdG9taWNfcmVhZCgmZC0+ZF9jb3VudCkp
IHsKKwkJCXNwaW5fbG9jaygmZC0+ZF9sb2NrKTsKKwkJCV9fZF9kcm9wKGQpOworCQkJc3Bpbl91
bmxvY2soJmQtPmRfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRlbnRyeSA9IGRnZXQo
ZCk7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCWRwdXQocGFy
ZW50KTsKKworCWlmIChkZW50cnkpCisJCWRpX3dyaXRlX2xvY2tfY2hpbGQoZGVudHJ5KTsKKwly
ZXR1cm4gZGVudHJ5OworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICpsb29rdXBfd2xvY2tfYnlf
aW5vKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCSBhdWZzX2JpbmRleF90IGJpbmRleCwg
aW5vX3QgaF9pbm8pCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgYXVfeGlub19l
bnRyeSB4aW5vZTsKKwlpbnQgZXJyOworCisJTEtUUlRyYWNlKCJiJWQsIGhpJWx1XG4iLCBiaW5k
ZXgsIGhfaW5vKTsKKwlBdURlYnVnT24oIWF1X29wdF90ZXN0KGF1X21udGZsYWdzKHNiKSwgWElO
TykpOworCisJaW5vZGUgPSBOVUxMOworCWVyciA9IGF1X3hpbm9fcmVhZChzYiwgYmluZGV4LCBo
X2lubywgJnhpbm9lKTsKKwlpZiAoIWVyciAmJiB4aW5vZS5pbm8pCisJCWlub2RlID0gaWxvb2t1
cChzYiwgeGlub2UuaW5vKTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dDsKKwlpZiAodW5saWtl
bHkoaW5vZGUtPmlfaW5vID09IEFVRlNfUk9PVF9JTk8pKSB7CisJCUF1V2Fybigid3Jvbmcgcm9v
dCBicmFuY2hcbiIpOworCQlpcHV0KGlub2RlKTsKKwkJaW5vZGUgPSBOVUxMOworCQlnb3RvIG91
dDsKKwl9CisKKwlpaV93cml0ZV9sb2NrX2NoaWxkKGlub2RlKTsKKworIG91dDoKKwlyZXR1cm4g
aW5vZGU7Cit9CisKK3N0YXRpYyBpbnQgaGluX3hpbm8oc3RydWN0IGlub2RlICppbm9kZSwgc3Ry
dWN0IGlub2RlICpoX2lub2RlKQoreworCWludCBlcnI7CisJYXVmc19iaW5kZXhfdCBiaW5kZXgs
IGJlbmQsIGJmb3VuZCwgYnN0YXJ0OworCXN0cnVjdCBpbm9kZSAqaF9pOworCisJTEtUUlRyYWNl
KCJpJWx1LCBoaSVsdVxuIiwgaW5vZGUtPmlfaW5vLCBoX2lub2RlLT5pX2lubyk7CisKKwllcnIg
PSAwOworCWlmICh1bmxpa2VseShpbm9kZS0+aV9pbm8gPT0gQVVGU19ST09UX0lOTykpIHsKKwkJ
QXVXYXJuKCJicmFuY2ggcm9vdCBkaXIgd2FzIGNoYW5nZWRcbiIpOworCQlnb3RvIG91dDsKKwl9
CisKKwliZm91bmQgPSAtMTsKKwliZW5kID0gYXVfaWJlbmQoaW5vZGUpOworCWJzdGFydCA9IGF1
X2lic3RhcnQoaW5vZGUpOworCWZvciAoYmluZGV4ID0gYnN0YXJ0OyBiaW5kZXggPD0gYmVuZDsg
YmluZGV4KyspIHsKKwkJaWYgKGF1X2hfaXB0cihpbm9kZSwgYmluZGV4KSA9PSBoX2lub2RlKSB7
CisJCQliZm91bmQgPSBiaW5kZXg7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoYmZvdW5kIDwg
MCkKKwkJZ290byBvdXQ7CisKKwlmb3IgKGJpbmRleCA9IGJzdGFydDsgYmluZGV4IDw9IGJlbmQ7
IGJpbmRleCsrKSB7CisJCWhfaSA9IGF1X2hfaXB0cihpbm9kZSwgYmluZGV4KTsKKwkJaWYgKGhf
aSkKKwkJCWVyciA9IGF1X3hpbm9fd3JpdGUwKGlub2RlLT5pX3NiLCBiaW5kZXgsIGhfaS0+aV9p
bm8sCisJCQkJCSAgICAgMCk7CisJCS8qIGlnbm9yZSB0aGlzIGVycm9yICovCisJCS8qIGJhZCBh
Y3Rpb24/ICovCisJfQorCisJLyogY2hpbGRyZW4gaW5vZGUgbnVtYmVyIHdpbGwgYmUgYnJva2Vu
ICovCisKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRp
YyBpbnQgaGluX2dlbl90cmVlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyLCBp
LCBqLCBuZGVudHJ5OworCXN0cnVjdCBhdV9kY3N1Yl9wYWdlcyBkcGFnZXM7CisJc3RydWN0IGF1
X2RwYWdlICpkcGFnZTsKKwlzdHJ1Y3QgZGVudHJ5ICoqZGVudHJpZXM7CisKKwlMS1RSVHJhY2Uo
IiUuKnNcbiIsIEF1RExOUGFpcihkZW50cnkpKTsKKworCWVyciA9IGF1X2RwYWdlc19pbml0KCZk
cGFnZXMsIEdGUF9URU1QT1JBUlkpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIG91dDsK
KwllcnIgPSBhdV9kY3N1Yl9wYWdlcygmZHBhZ2VzLCBkZW50cnksIE5VTEwsIE5VTEwpOworCWlm
ICh1bmxpa2VseShlcnIpKQorCQlnb3RvIG91dF9kcGFnZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwg
ZHBhZ2VzLm5kcGFnZTsgaSsrKSB7CisJCWRwYWdlID0gZHBhZ2VzLmRwYWdlcyArIGk7CisJCWRl
bnRyaWVzID0gZHBhZ2UtPmRlbnRyaWVzOworCQluZGVudHJ5ID0gZHBhZ2UtPm5kZW50cnk7CisJ
CWZvciAoaiA9IDA7IGogPCBuZGVudHJ5OyBqKyspIHsKKwkJCXN0cnVjdCBkZW50cnkgKmQ7CisJ
CQlkID0gZGVudHJpZXNbal07CisJCQlMS1RSVHJhY2UoIiUuKnNcbiIsIEF1RExOUGFpcihkKSk7
CisJCQlpZiAoSVNfUk9PVChkKSkKKwkJCQljb250aW51ZTsKKworCQkJZF9kcm9wKGQpOworCQkJ
YXVfZGlnZW5fZGVjKGQpOworCQkJaWYgKGQtPmRfaW5vZGUpCisJCQkJLy9yZXNldCBjaGlsZHJl
biB4aW5vPyBjYWNoZWQgY2hpbGRyZW4gb25seT8KKwkJCQlhdV9paWdlbl9kZWMoZC0+ZF9pbm9k
ZSk7CisJCX0KKwl9CisKKyBvdXRfZHBhZ2VzOgorCWF1X2RwYWdlc19mcmVlKCZkcGFnZXMpOwor
CisJLyogZGlzY2FyZCBjaGlsZHJlbiAqLworCWRlbnRyeV91bmhhc2goZGVudHJ5KTsKKwlkcHV0
KGRlbnRyeSk7Cisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisv
KgorICogcmV0dXJuIDAgaWYgcHJvY2Vzc2VkLgorICovCitzdGF0aWMgaW50IGhpbl9nZW5fYnlf
aW5vZGUoY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IG5sZW4sIHN0cnVjdCBpbm9kZSAqaW5vZGUs
CisJCQkgICAgY29uc3QgdW5zaWduZWQgaW50IGlzZGlyKQoreworCWludCBlcnI7CisJc3RydWN0
IGRlbnRyeSAqZDsKKwlzdHJ1Y3QgcXN0ciAqZG5hbWU7CisKKwlMS1RSVHJhY2UoIiUuKnMsIGkl
bHVcbiIsIG5sZW4sIG5hbWUsIGlub2RlLT5pX2lubyk7CisKKwllcnIgPSAxOworCWlmICh1bmxp
a2VseShpbm9kZS0+aV9pbm8gPT0gQVVGU19ST09UX0lOTykpIHsKKwkJQXVXYXJuKCJicmFuY2gg
cm9vdCBkaXIgd2FzIGNoYW5nZWRcbiIpOworCQllcnIgPSAwOworCQlnb3RvIG91dDsKKwl9CisK
KwlpZiAoIWlzZGlyKSB7CisJCUF1RGVidWdPbighbmFtZSk7CisJCWF1X2lpZ2VuX2RlYyhpbm9k
ZSk7CisJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQs
ICZpbm9kZS0+aV9kZW50cnksIGRfYWxpYXMpIHsKKwkJCWRuYW1lID0gJmQtPmRfbmFtZTsKKwkJ
CWlmIChkbmFtZS0+bGVuICE9IG5sZW4KKwkJCSAgICAmJiBtZW1jbXAoZG5hbWUtPm5hbWUsIG5h
bWUsIG5sZW4pKQorCQkJCWNvbnRpbnVlOworCQkJZXJyID0gMDsKKwkJCXNwaW5fbG9jaygmZC0+
ZF9sb2NrKTsKKwkJCV9fZF9kcm9wKGQpOworCQkJYXVfZGlnZW5fZGVjKGQpOworCQkJc3Bpbl91
bmxvY2soJmQtPmRfbG9jayk7CisJCQlicmVhazsKKwkJfQorCQlzcGluX3VubG9jaygmZGNhY2hl
X2xvY2spOworCX0gZWxzZSB7CisJCWF1X2ZzZXRfc2koYXVfc2JpKGlub2RlLT5pX3NiKSwgRkFJ
TEVEX1JFRlJFU0hfRElSUyk7CisJCWQgPSBkX2ZpbmRfYWxpYXMoaW5vZGUpOworCQlpZiAoIWQp
IHsKKwkJCWF1X2lpZ2VuX2RlYyhpbm9kZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWRuYW1l
ID0gJmQtPmRfbmFtZTsKKwkJaWYgKGRuYW1lLT5sZW4gPT0gbmxlbiAmJiAhbWVtY21wKGRuYW1l
LT5uYW1lLCBuYW1lLCBubGVuKSkKKwkJCWVyciA9IGhpbl9nZW5fdHJlZShkKTsKKwkJZHB1dChk
KTsKKwl9CisKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0
YXRpYyBpbnQgaGluX2dlbl9ieV9uYW1lKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgdW5z
aWduZWQgaW50IGlzZGlyKQoreworCWludCBlcnI7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwor
CUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVETE5QYWlyKGRlbnRyeSkpOworCisJaW5vZGUgPSBkZW50
cnktPmRfaW5vZGU7CisJaWYgKElTX1JPT1QoZGVudHJ5KQorCSAgICAvL3x8IChpbm9kZSAmJiBp
bm9kZS0+aV9pbm8gPT0gQVVGU19ST09UX0lOTykKKwkJKSB7CisJCUF1V2FybigiYnJhbmNoIHJv
b3QgZGlyIHdhcyBjaGFuZ2VkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXJyID0gMDsKKwlp
ZiAoIWlzZGlyKSB7CisJCWRfZHJvcChkZW50cnkpOworCQlhdV9kaWdlbl9kZWMoZGVudHJ5KTsK
KwkJaWYgKGlub2RlKQorCQkJYXVfaWlnZW5fZGVjKGlub2RlKTsKKwl9IGVsc2UgeworCQlhdV9m
c2V0X3NpKGF1X3NiaShkZW50cnktPmRfc2IpLCBGQUlMRURfUkVGUkVTSF9ESVJTKTsKKwkJaWYg
KGlub2RlKQorCQkJZXJyID0gaGluX2dlbl90cmVlKGRlbnRyeSk7CisJfQorCisJQXVUcmFjZUVy
cihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGhpbl9hdHRyKHN0cnVjdCBp
bm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqaF9pbm9kZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpo
X2RlbnRyeTsKKworCUxLVFJUcmFjZSgiaSVsdSwgaGklbHVcbiIsIGlub2RlLT5pX2lubywgaF9p
bm9kZS0+aV9pbm8pOworCisJaWYgKGF1X2hfaXB0cihpbm9kZSwgYXVfaWJzdGFydChpbm9kZSkp
ICE9IGhfaW5vZGUpCisJCXJldHVybjsKKworCWhfZGVudHJ5ID0gZF9maW5kX2FsaWFzKGhfaW5v
ZGUpOworCWlmIChoX2RlbnRyeSkgeworCQlhdV91cGRhdGVfZnVzZV9oX2lub2RlKE5VTEwsIGhf
ZGVudHJ5KTsKKwkJLyogaWdub3JlIGFuIGVycm9yKi8KKwkJZHB1dChoX2RlbnRyeSk7CisJfQor
CisJYXVfY3B1cF9hdHRyX2FsbChpbm9kZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwor
LyogaGlub3RpZnkgam9iIGZsYWdzICovCisjZGVmaW5lIEF1SGluSm9iX1hJTk8wCTEKKyNkZWZp
bmUgQXVIaW5Kb2JfR0VOCSgxIDw8IDEpCisjZGVmaW5lIEF1SGluSm9iX0RJUkVOVAkoMSA8PCAy
KQorI2RlZmluZSBBdUhpbkpvYl9BVFRSCSgxIDw8IDMpCisjZGVmaW5lIEF1SGluSm9iX0lTRElS
CSgxIDw8IDQpCisjZGVmaW5lIEF1SGluSm9iX1RSWVhJTk8wICgxIDw8IDUpCisjZGVmaW5lIEF1
SGluSm9iX01OVFBOVAkoMSA8PCA2KQorI2RlZmluZSBhdV9mdGVzdF9oaW5qb2IoZmxhZ3MsIG5h
bWUpCSgoZmxhZ3MpICYgQXVIaW5Kb2JfIyNuYW1lKQorI2RlZmluZSBhdV9mc2V0X2hpbmpvYihm
bGFncywgbmFtZSkJeyAoZmxhZ3MpIHw9IEF1SGluSm9iXyMjbmFtZTsgfQorI2RlZmluZSBhdV9m
Y2xyX2hpbmpvYihmbGFncywgbmFtZSkJeyAoZmxhZ3MpICY9IH5BdUhpbkpvYl8jI25hbWU7IH0K
Kworc3RydWN0IGhpbl9qb2JfYXJncyB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBp
bm9kZSAqaW5vZGUsICpoX2lub2RlLCAqZGlyLCAqaF9kaXI7CisJc3RydWN0IGRlbnRyeSAqZGVu
dHJ5OworCWNoYXIgKmhfbmFtZTsKKwlpbnQgaF9ubGVuOworfTsKKworc3RhdGljIGludCBoaW5f
am9iKHN0cnVjdCBoaW5fam9iX2FyZ3MgKmEpCit7CisJY29uc3QgdW5zaWduZWQgaW50IGlzZGly
ID0gYXVfZnRlc3RfaGluam9iKGEtPmZsYWdzLCBJU0RJUik7CisKKwkvKiByZXNldCB4aW5vICov
CisJaWYgKGF1X2Z0ZXN0X2hpbmpvYihhLT5mbGFncywgWElOTzApICYmIGEtPmlub2RlKQorCQlo
aW5feGlubyhhLT5pbm9kZSwgYS0+aF9pbm9kZSk7CisJLyogaWdub3JlIHRoaXMgZXJyb3IgKi8K
KworCWlmIChhdV9mdGVzdF9oaW5qb2IoYS0+ZmxhZ3MsIFRSWVhJTk8wKQorCSAgICAmJiBhLT5p
bm9kZQorCSAgICAmJiBhLT5oX2lub2RlKSB7CisJCW11dGV4X2xvY2tfbmVzdGVkKCZhLT5oX2lu
b2RlLT5pX211dGV4LCBBdUxzY19JX0NISUxEKTsKKwkJaWYgKCFhLT5oX2lub2RlLT5pX25saW5r
KQorCQkJaGluX3hpbm8oYS0+aW5vZGUsIGEtPmhfaW5vZGUpOworCQkvKiBpZ25vcmUgdGhpcyBl
cnJvciAqLworCQltdXRleF91bmxvY2soJmEtPmhfaW5vZGUtPmlfbXV0ZXgpOworCX0KKworCS8q
IG1ha2UgdGhlIGdlbmVyYXRpb24gb2Jzb2xldGUgKi8KKwlpZiAoYXVfZnRlc3RfaGluam9iKGEt
PmZsYWdzLCBHRU4pKSB7CisJCWludCBlcnIgPSAtMTsKKwkJaWYgKGEtPmlub2RlKQorCQkJZXJy
ID0gaGluX2dlbl9ieV9pbm9kZShhLT5oX25hbWUsIGEtPmhfbmxlbiwgYS0+aW5vZGUsCisJCQkJ
CSAgICAgICBpc2Rpcik7CisJCWlmIChlcnIgJiYgYS0+ZGVudHJ5KQorCQkJaGluX2dlbl9ieV9u
YW1lKGEtPmRlbnRyeSwgaXNkaXIpOworCQkvKiBpZ25vcmUgdGhpcyBlcnJvciAqLworCX0KKwor
CS8qIG1ha2UgZGlyIGVudHJpZXMgb2Jzb2xldGUgKi8KKwlpZiAoYXVfZnRlc3RfaGluam9iKGEt
PmZsYWdzLCBESVJFTlQpICYmIGEtPmlub2RlKSB7CisJCXN0cnVjdCBhdV92ZGlyICp2ZGlyOwor
CQlJaU11c3RXcml0ZUxvY2soYS0+aW5vZGUpOworCQl2ZGlyID0gYXVfaXZkaXIoYS0+aW5vZGUp
OworCQlpZiAodmRpcikKKwkJCXZkaXItPnZkX2ppZmZ5ID0gMDsKKwkJLy9JTXVzdExvY2soYS0+
aW5vZGUpOworCQkvL2EtPmlub2RlLT5pX3ZlcnNpb24rKzsKKwl9CisKKwkvKiB1cGRhdGUgdGhl
IGF0dHIgKi8KKwlpZiAoYXVfZnRlc3RfaGluam9iKGEtPmZsYWdzLCBBVFRSKSAmJiBhLT5pbm9k
ZSAmJiBhLT5oX2lub2RlKQorCQloaW5fYXR0cihhLT5pbm9kZSwgYS0+aF9pbm9kZSk7CisKKwkv
KiBjYW4gZG8gbm90aGluZyBidXQgd2FybiAqLworCWlmIChhdV9mdGVzdF9oaW5qb2IoYS0+Zmxh
Z3MsIE1OVFBOVCkKKwkgICAgJiYgYS0+ZGVudHJ5CisJICAgICYmIGRfbW91bnRwb2ludChhLT5k
ZW50cnkpKQorCQlBdVdhcm4oIm1vdW50LXBvaW50ICUuKnMgaXMgcmVtb3ZlZCBvciByZW5hbWVk
XG4iLAorCQkgICAgICAgQXVETE5QYWlyKGEtPmRlbnRyeSkpOworCisJcmV0dXJuIDA7Cit9CisK
Ky8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSB7IENISUxELCBQQVJFTlQgfTsKK3N0cnVjdCBw
b3N0cHJvY19hcmdzIHsKKwlzdHJ1Y3QgaW5vZGUgKmhfZGlyLCAqZGlyLCAqaF9jaGlsZF9pbm9k
ZTsKKwl1MzIgbWFzazsKKwl1bnNpZ25lZCBpbnQgZmxhZ3NbMl07CisJdW5zaWduZWQgaW50IGhf
Y2hpbGRfbmxlbjsKKwljaGFyIGhfY2hpbGRfbmFtZVtdOworfTsKKworc3RhdGljIHZvaWQgcG9z
dHByb2Modm9pZCAqX2FyZ3MpCit7CisJc3RydWN0IHBvc3Rwcm9jX2FyZ3MgKmEgPSBfYXJnczsK
KwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWF1ZnNfYmluZGV4X3QgYmluZGV4LCBiZW5kLCBi
Zm91bmQ7CisJaW50IHhpbm8sIGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWlub190IGhf
aW5vOworCXN0cnVjdCBoaW5fam9iX2FyZ3MgYXJnczsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7
CisJc3RydWN0IGF1X3NiaW5mbyAqc2JpbmZvOworCisJQXVEZWJ1Z09uKCFfYXJncyk7CisJQXVE
ZWJ1Z09uKCFhLT5oX2Rpcik7CisJQXVEZWJ1Z09uKCFhLT5kaXIpOworCUF1RGVidWdPbighYS0+
bWFzayk7CisJLy9hdV9kZWJ1Z19vbigpOworCUxLVFJUcmFjZSgibWFzayAweCV4ICVzLCBpJWx1
LCBoaSVsdSwgaGNpJWx1XG4iLAorCQkgIGEtPm1hc2ssIGluX25hbWUoYS0+bWFzayksIGEtPmRp
ci0+aV9pbm8sIGEtPmhfZGlyLT5pX2lubywKKwkJICBhLT5oX2NoaWxkX2lub2RlID8gYS0+aF9j
aGlsZF9pbm9kZS0+aV9pbm8gOiAwKTsKKworCWlub2RlID0gTlVMTDsKKwlkZW50cnkgPSBOVUxM
OworCS8vIGRvIG5vdCBsb2NrIGhlcmUgYmVjYXVzZSBvZiBkX3JldmFsaWRhdGUoKSBtYXkgY2F1
c2UgYSBkZWFkbG9jay4KKwkvL211dGV4X2xvY2soJmEtPmRpci0+aV9tdXRleCk7CisJc2IgPSBh
LT5kaXItPmlfc2I7CisJQXVEZWJ1Z09uKCFzYik7CisJc2JpbmZvID0gYXVfc2JpKHNiKTsKKwlB
dURlYnVnT24oIXNiaW5mbyk7CisJLyogYmlnIGF1ZnMgbG9jayAqLworCXNpX25vZmx1c2hfd3Jp
dGVfbG9jayhzYik7CisKKwlpaV9yZWFkX2xvY2tfcGFyZW50KGEtPmRpcik7CisJYmZvdW5kID0g
LTE7CisJYmVuZCA9IGF1X2liZW5kKGEtPmRpcik7CisJZm9yIChiaW5kZXggPSBhdV9pYnN0YXJ0
KGEtPmRpcik7IGJpbmRleCA8PSBiZW5kOyBiaW5kZXgrKykKKwkJaWYgKGF1X2hfaXB0cihhLT5k
aXIsIGJpbmRleCkgPT0gYS0+aF9kaXIpIHsKKwkJCWJmb3VuZCA9IGJpbmRleDsKKwkJCWJyZWFr
OworCQl9CisJaWlfcmVhZF91bmxvY2soYS0+ZGlyKTsKKwlpZiAodW5saWtlbHkoYmZvdW5kIDwg
MCkpCisJCWdvdG8gb3V0OworCisJeGlubyA9ICEhYXVfb3B0X3Rlc3QoYXVfbW50ZmxhZ3Moc2Ip
LCBYSU5PKTsKKwloX2lubyA9IDA7CisJaWYgKGEtPmhfY2hpbGRfaW5vZGUpCisJCWhfaW5vID0g
YS0+aF9jaGlsZF9pbm9kZS0+aV9pbm87CisJLy9BdURiZygiaGVyZVxuIik7CisKKwlpZiAoYS0+
aF9jaGlsZF9ubGVuCisJICAgICYmIChhdV9mdGVzdF9oaW5qb2IoYS0+ZmxhZ3NbQ0hJTERdLCBH
RU4pCisJCXx8IGF1X2Z0ZXN0X2hpbmpvYihhLT5mbGFnc1tDSElMRF0sIE1OVFBOVCkpKQorCQlk
ZW50cnkgPSBsb29rdXBfd2xvY2tfYnlfbmFtZShhLT5oX2NoaWxkX25hbWUsIGEtPmhfY2hpbGRf
bmxlbiwKKwkJCQkJICAgICAgYS0+ZGlyKTsKKwkvL0F1RGJnKCJoZXJlXG4iKTsKKwlpZiAoZGVu
dHJ5KQorCQlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoeGlubyAmJiAhaW5vZGUgJiYg
aF9pbm8KKwkgICAgJiYgKGF1X2Z0ZXN0X2hpbmpvYihhLT5mbGFnc1tDSElMRF0sIFhJTk8wKQor
CQl8fCBhdV9mdGVzdF9oaW5qb2IoYS0+ZmxhZ3NbQ0hJTERdLCBUUllYSU5PMCkKKwkJfHwgYXVf
ZnRlc3RfaGluam9iKGEtPmZsYWdzW0NISUxEXSwgR0VOKQorCQl8fCBhdV9mdGVzdF9oaW5qb2Io
YS0+ZmxhZ3NbQ0hJTERdLCBBVFRSKSkpCisJCWlub2RlID0gbG9va3VwX3dsb2NrX2J5X2lubyhz
YiwgYmZvdW5kLCBoX2lubyk7CisJLy9BdURiZygiaGVyZVxuIik7CisKKwlhcmdzLmZsYWdzID0g
YS0+ZmxhZ3NbQ0hJTERdOworCWFyZ3MuZGVudHJ5ID0gZGVudHJ5OworCWFyZ3MuaW5vZGUgPSBp
bm9kZTsKKwlhcmdzLmhfaW5vZGUgPSBhLT5oX2NoaWxkX2lub2RlOworCWFyZ3MuZGlyID0gYS0+
ZGlyOworCWFyZ3MuaF9kaXIgPSBhLT5oX2RpcjsKKwlhcmdzLmhfbmFtZSA9IGEtPmhfY2hpbGRf
bmFtZTsKKwlhcmdzLmhfbmxlbiA9IGEtPmhfY2hpbGRfbmxlbjsKKwllcnIgPSBoaW5fam9iKCZh
cmdzKTsKKwlpZiAoZGVudHJ5KSB7CisJCWRpX3dyaXRlX3VubG9jayhkZW50cnkpOworCQlkcHV0
KGRlbnRyeSk7CisJfSBlbHNlIGlmIChpbm9kZSkgeworCQlpaV93cml0ZV91bmxvY2soaW5vZGUp
OworCQlpcHV0KGlub2RlKTsKKwl9CisJLy9BdURiZygiaGVyZVxuIik7CisKKwlpaV93cml0ZV9s
b2NrX3BhcmVudChhLT5kaXIpOworCWFyZ3MuZmxhZ3MgPSBhLT5mbGFnc1tQQVJFTlRdOworCWFy
Z3MuZGVudHJ5ID0gTlVMTDsKKwlhcmdzLmlub2RlID0gYS0+ZGlyOworCWFyZ3MuaF9pbm9kZSA9
IGEtPmhfZGlyOworCWFyZ3MuZGlyID0gTlVMTDsKKwlhcmdzLmhfZGlyID0gTlVMTDsKKwlhcmdz
LmhfbmFtZSA9IE5VTEw7CisJYXJncy5oX25sZW4gPSAwOworCWVyciA9IGhpbl9qb2IoJmFyZ3Mp
OworCWlpX3dyaXRlX3VubG9jayhhLT5kaXIpOworCS8vQXVEYmcoImhlcmVcbiIpOworCisgb3V0
OgorCXNpX3dyaXRlX3VubG9jayhzYik7CisJLy9tdXRleF91bmxvY2soJmEtPmRpci0+aV9tdXRl
eCk7CisJYXVfbnd0X2RlYygmc2JpbmZvLT5zaV9ub3dhaXQpOworCisJaXB1dChhLT5oX2NoaWxk
X2lub2RlKTsKKwlpcHV0KGEtPmhfZGlyKTsKKwlpcHV0KGEtPmRpcik7CisJa2ZyZWUoYSk7CisJ
Ly9hdV9kZWJ1Z19vZmYoKTsKK30KKworLy90b2RvOiBlbmRpYW4/CisjaWZuZGVmIGlsb2cyCisj
ZGVmaW5lIGlsb2cyKG4pIGZmeih+KG4pKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGF1ZnNfaW5v
dGlmeShzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2gsIHUzMiB3ZCwgdTMyIG1hc2ssCisJCQkg
dTMyIGNvb2tpZSwgY29uc3QgY2hhciAqaF9jaGlsZF9uYW1lLAorCQkJIHN0cnVjdCBpbm9kZSAq
aF9jaGlsZF9pbm9kZSkKK3sKKwlzdHJ1Y3QgYXVfaGlub3RpZnkgKmhpbm90aWZ5OworCXN0cnVj
dCBwb3N0cHJvY19hcmdzICphcmdzOworCWludCBsZW4sIHdrcV9lcnIsIGlzZGlyLCBpc3Jvb3Qs
IHdoLCBpZHg7CisJY2hhciAqcDsKKwlzdHJ1Y3QgaW5vZGUgKmRpcjsKKwl1bnNpZ25lZCBpbnQg
ZmxhZ3NbMl07CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlhdG9taWNfdCAqY250OworCisJ
TEtUUlRyYWNlKCJpJWx1LCB3ZCAlZCwgbWFzayAweCV4ICVzLCBjb29raWUgMHgleCwgaGNuYW1l
ICVzLCBoaSVsdVxuIiwKKwkJICB3YXRjaC0+aW5vZGUtPmlfaW5vLCB3ZCwgbWFzaywgaW5fbmFt
ZShtYXNrKSwgY29va2llLAorCQkgIGhfY2hpbGRfbmFtZSA/IGhfY2hpbGRfbmFtZSA6ICIiLAor
CQkgIGhfY2hpbGRfaW5vZGUgPyBoX2NoaWxkX2lub2RlLT5pX2lubyA6IDApOworCS8qIGlmIElO
X1VOTU9VTlQgaGFwcGVucywgdGhlcmUgbXVzdCBiZSBhbm90aGVyIGJ1ZyAqLworCWlmIChtYXNr
ICYgKElOX0lHTk9SRUQgfCBJTl9VTk1PVU5UKSkgeworCQkvL1dBUk5fT04od2F0Y2gtPmlub2Rl
LT5pX2lubyA9PSAxNSk7CisJCXB1dF9pbm90aWZ5X3dhdGNoKHdhdGNoKTsKKwkJcmV0dXJuOwor
CX0KKworI2lmZGVmIERiZ0lub3RpZnkKKwlpZiAoIWhfY2hpbGRfbmFtZSB8fCBzdHJjbXAoaF9j
aGlsZF9uYW1lLCBBVUZTX1hJTk9fRk5BTUUpKQorCQlBdURiZygiaSVsdSwgd2QgJWQsIG1hc2sg
MHgleCAlcywgY29va2llIDB4JXgsIGhjbmFtZSAlcywiCisJCSAgICAgICIgaGklbHVcbiIsCisJ
CSAgICAgIHdhdGNoLT5pbm9kZS0+aV9pbm8sIHdkLCBtYXNrLCBpbl9uYW1lKG1hc2spLCBjb29r
aWUsCisJCSAgICAgIGhfY2hpbGRfbmFtZSA/IGhfY2hpbGRfbmFtZSA6ICIiLAorCQkgICAgICBo
X2NoaWxkX2lub2RlID8gaF9jaGlsZF9pbm9kZS0+aV9pbm8gOiAwKTsKKwkvL1dBUk5fT04oMSk7
CisjZW5kaWYKKworCWhpbm90aWZ5ID0gY29udGFpbmVyX29mKHdhdGNoLCBzdHJ1Y3QgYXVfaGlu
b3RpZnksIGhpbl93YXRjaCk7CisJQXVEZWJ1Z09uKCFoaW5vdGlmeSB8fCAhaGlub3RpZnktPmhp
bl9hdWZzX2lub2RlKTsKKwlpZHggPSBpbG9nMihtYXNrICYgSU5fQUxMX0VWRU5UUyk7CisJQXVE
ZWJ1Z09uKGF1X2hpbl9uaWdub3JlIDw9IGlkeCk7CisJY250ID0gaGlub3RpZnktPmhpbl9pZ25v
cmUgKyBpZHg7CisJaWYgKDAgPD0gYXRvbWljX2RlY19yZXR1cm4oY250KSkKKwkJcmV0dXJuOwor
CWF0b21pY19pbmNfcmV0dXJuKGNudCk7CisKKwlkaXIgPSBpZ3JhYihoaW5vdGlmeS0+aGluX2F1
ZnNfaW5vZGUpOworCWlmICghZGlyKQorCQlyZXR1cm47CisJaXNyb290ID0gKGRpci0+aV9pbm8g
PT0gQVVGU19ST09UX0lOTyk7CisJbGVuID0gMDsKKwl3aCA9IDA7CisJaWYgKGhfY2hpbGRfbmFt
ZSkgeworCQlsZW4gPSBzdHJsZW4oaF9jaGlsZF9uYW1lKTsKKwkJaWYgKCFtZW1jbXAoaF9jaGls
ZF9uYW1lLCBBVUZTX1dIX1BGWCwgQVVGU19XSF9QRlhfTEVOKSkgeworCQkJaF9jaGlsZF9uYW1l
ICs9IEFVRlNfV0hfUEZYX0xFTjsKKwkJCWxlbiAtPSBBVUZTX1dIX1BGWF9MRU47CisJCQl3aCA9
IDE7CisJCX0KKwl9CisKKwlpc2RpciA9IDA7CisJaWYgKGhfY2hpbGRfaW5vZGUpCisJCWlzZGly
ID0gISFTX0lTRElSKGhfY2hpbGRfaW5vZGUtPmlfbW9kZSk7CisJZmxhZ3NbUEFSRU5UXSA9IEF1
SGluSm9iX0lTRElSOworCWZsYWdzW0NISUxEXSA9IDA7CisJaWYgKGlzZGlyKQorCQlmbGFnc1tD
SElMRF0gPSBBdUhpbkpvYl9JU0RJUjsKKwlzd2l0Y2ggKG1hc2sgJiBJTl9BTExfRVZFTlRTKSB7
CisJY2FzZSBJTl9NT0RJRlk6CisJCS8qRkFMTFRIUk9VR0gqLworCWNhc2UgSU5fQVRUUklCOgor
CQlpZiAoaF9jaGlsZF9pbm9kZSkgeworCQkJaWYgKCF3aCkKKwkJCQlhdV9mc2V0X2hpbmpvYihm
bGFnc1tDSElMRF0sIEFUVFIpOworCQl9IGVsc2UKKwkJCWF1X2ZzZXRfaGluam9iKGZsYWdzW1BB
UkVOVF0sIEFUVFIpOworCQlicmVhazsKKworCQkvKiBJTl9NT1ZFRF9GUk9NIGlzIHRoZSBmaXJz
dCBldmVudCBpbiByZW5hbWUoMikgKi8KKwljYXNlIElOX01PVkVEX0ZST006CisJY2FzZSBJTl9N
T1ZFRF9UTzoKKwkJQXVEZWJ1Z09uKCFoX2NoaWxkX25hbWUgfHwgIWhfY2hpbGRfaW5vZGUpOwor
CQlhdV9mc2V0X2hpbmpvYihmbGFnc1tDSElMRF0sIEdFTik7CisJCWF1X2ZzZXRfaGluam9iKGZs
YWdzW0NISUxEXSwgQVRUUik7CisJCWlmICgxIHx8IGlzZGlyKQorCQkJYXVfZnNldF9oaW5qb2Io
ZmxhZ3NbQ0hJTERdLCBYSU5PMCk7CisJCWF1X2ZzZXRfaGluam9iKGZsYWdzW0NISUxEXSwgTU5U
UE5UKTsKKworCQlhdV9mc2V0X2hpbmpvYihmbGFnc1tQQVJFTlRdLCBBVFRSKTsKKwkJYXVfZnNl
dF9oaW5qb2IoZmxhZ3NbUEFSRU5UXSwgRElSRU5UKTsKKwkJYnJlYWs7CisKKwljYXNlIElOX0NS
RUFURToKKwkJQXVEZWJ1Z09uKCFoX2NoaWxkX25hbWUgfHwgIWhfY2hpbGRfaW5vZGUpOworCQlh
dV9mc2V0X2hpbmpvYihmbGFnc1tQQVJFTlRdLCBBVFRSKTsKKwkJYXVfZnNldF9oaW5qb2IoZmxh
Z3NbUEFSRU5UXSwgRElSRU5UKTsKKwkJYXVfZnNldF9oaW5qb2IoZmxhZ3NbQ0hJTERdLCBHRU4p
OworCQkvKiBoYXJkIGxpbmsgKi8KKwkJaWYgKCFpc2RpciAmJiBoX2NoaWxkX2lub2RlLT5pX25s
aW5rID4gMSkKKwkJCWF1X2ZzZXRfaGluam9iKGZsYWdzW0NISUxEXSwgQVRUUik7CisJCWJyZWFr
OworCisJY2FzZSBJTl9ERUxFVEU6CisJCS8qCisJCSAqIGF1ZnMgbmV2ZXIgYmUgYWJsZSB0byBn
ZXQgdGhpcyBjaGlsZCBpbm9kZS4KKwkJICogcmV2YWxpZGF0aW9uIHNob3VsZCBiZSBpbiBkX3Jl
dmFsaWRhdGUoKQorCQkgKiBieSBjaGVja2luZyBpX25saW5rLCBpX2dlbmVyYXRpb24gb3IgZF91
bmhhc2hlZCgpLgorCQkgKi8KKwkJQXVEZWJ1Z09uKCFoX2NoaWxkX25hbWUpOworCQlhdV9mc2V0
X2hpbmpvYihmbGFnc1tQQVJFTlRdLCBBVFRSKTsKKwkJYXVfZnNldF9oaW5qb2IoZmxhZ3NbUEFS
RU5UXSwgRElSRU5UKTsKKwkJYXVfZnNldF9oaW5qb2IoZmxhZ3NbQ0hJTERdLCBHRU4pOworCQlh
dV9mc2V0X2hpbmpvYihmbGFnc1tDSElMRF0sIFRSWVhJTk8wKTsKKwkJYXVfZnNldF9oaW5qb2Io
ZmxhZ3NbQ0hJTERdLCBNTlRQTlQpOworCQlicmVhazsKKworCWNhc2UgSU5fREVMRVRFX1NFTEY6
CisJCWlmICghaXNyb290KQorCQkJYXVfZnNldF9oaW5qb2IoZmxhZ3NbUEFSRU5UXSwgR0VOKTsK
KwkJLypGQUxMVEhST1VHSCovCisKKwljYXNlIElOX01PVkVfU0VMRjoKKwkJLyoKKwkJICogd2hl
biBhbiBpbm90aWZ5IGlzIHNldCB0byBhbiBhdWZzIGlub2RlLAorCQkgKiBzdWNoIGlub2RlIGNh
biBiZSBpc29sYXRlZCBhbmQgdGhpcyBldmVudCBjYW4gYmUgZmlyZWQKKwkJICogc29sZWx5Lgor
CQkgKi8KKwkJQXVEZWJ1Z09uKGhfY2hpbGRfbmFtZSB8fCBoX2NoaWxkX2lub2RlKTsKKwkJaWYg
KHVubGlrZWx5KGlzcm9vdCkpIHsKKwkJCUF1V2Fybigicm9vdCBicmFuY2ggd2FzIG1vdmVkXG4i
KTsKKwkJCWlwdXQoZGlyKTsKKwkJCXJldHVybjsKKwkJfQorCQlhdV9mc2V0X2hpbmpvYihmbGFn
c1tQQVJFTlRdLCBYSU5PMCk7CisJCWF1X2ZzZXRfaGluam9iKGZsYWdzW1BBUkVOVF0sIEdFTik7
CisJCWF1X2ZzZXRfaGluam9iKGZsYWdzW1BBUkVOVF0sIEFUVFIpOworCQlhdV9mc2V0X2hpbmpv
YihmbGFnc1tQQVJFTlRdLCBESVJFTlQpOworCQkvL2F1X2ZzZXRfaGluam9iKGZsYWdzW1BBUkVO
VF0sIE1OVFBOVCk7CisJCWJyZWFrOworCWNhc2UgSU5fQUNDRVNTOgorCWRlZmF1bHQ6CisJCUF1
RGVidWdPbigxKTsKKwl9CisKKwlpZiAod2gpCisJCWhfY2hpbGRfaW5vZGUgPSBOVUxMOworCisJ
LyogaXB1dCgpIGFuZCBrZnJlZSgpIHdpbGwgYmUgY2FsbGVkIGluIHBvc3Rwcm9jKCkgKi8KKwkv
KgorCSAqIGlub3RpZnlfbXV0ZXggaXMgYWxyZWFkeSBhY3F1aXJlZCBhbmQga21hbGxvYy9wcnVu
ZV9pY2FjaGUgbWF5IGxvY2sKKwkgKiBpcHJ1bmVfbXV0ZXguIHN0cmFuZ2UuCisJICovCisJbG9j
a2RlcF9vZmYoKTsKKwlhcmdzID0ga21hbGxvYyhzaXplb2YoKmFyZ3MpICsgbGVuICsgMSwgR0ZQ
X1RFTVBPUkFSWSk7CisJbG9ja2RlcF9vbigpOworCWlmICh1bmxpa2VseSghYXJncykpIHsKKwkJ
QXVFcnIxKCJubyBtZW1vcnlcbiIpOworCQlpcHV0KGRpcik7CisJCXJldHVybjsKKwl9CisJYXJn
cy0+ZmxhZ3NbUEFSRU5UXSA9IGZsYWdzW1BBUkVOVF07CisJYXJncy0+ZmxhZ3NbQ0hJTERdID0g
ZmxhZ3NbQ0hJTERdOworCWFyZ3MtPm1hc2sgPSBtYXNrOworCWFyZ3MtPmRpciA9IGRpcjsKKwlh
cmdzLT5oX2RpciA9IGlncmFiKHdhdGNoLT5pbm9kZSk7CisJaWYgKGhfY2hpbGRfaW5vZGUpCisJ
CWlncmFiKGhfY2hpbGRfaW5vZGUpOworCWFyZ3MtPmhfY2hpbGRfaW5vZGUgPSBoX2NoaWxkX2lu
b2RlOworCWFyZ3MtPmhfY2hpbGRfbmxlbiA9IGxlbjsKKwlpZiAobGVuKSB7CisJCXAgPSAodm9p
ZCAqKWFyZ3M7CisJCXAgKz0gc2l6ZW9mKCphcmdzKTsKKwkJbWVtY3B5KHAsIGhfY2hpbGRfbmFt
ZSwgbGVuICsgMSk7CisJfQorCisJc2IgPSBkaXItPmlfc2I7CisJYXVfbnd0X2luYygmYXVfc2Jp
KHNiKS0+c2lfbm93YWl0KTsKKwlsb2NrZGVwX29mZigpOworCXdrcV9lcnIgPSBhdV93a3Ffbm93
YWl0KHBvc3Rwcm9jLCBhcmdzLCBzYiwgLypkbGd0Ki8wKTsKKwlsb2NrZGVwX29uKCk7CisJaWYg
KHVubGlrZWx5KHdrcV9lcnIpKSB7CisJCUF1RXJyKCJ3a3EgJWRcbiIsIHdrcV9lcnIpOworCQlh
dV9ud3RfZGVjKCZhdV9zYmkoc2IpLT5zaV9ub3dhaXQpOworCX0KK30KKworc3RhdGljIHZvaWQg
YXVmc19pbm90aWZ5X2Rlc3Ryb3koc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoKQoreworCXJl
dHVybjsKK30KKworc3RhdGljIHN0cnVjdCBpbm90aWZ5X29wZXJhdGlvbnMgYXVmc19pbm90aWZ5
X29wcyA9IHsKKwkuaGFuZGxlX2V2ZW50CT0gYXVmc19pbm90aWZ5LAorCS5kZXN0cm95X3dhdGNo
CT0gYXVmc19pbm90aWZ5X2Rlc3Ryb3kKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3Rh
dGljIHZvaWQgYXVfaGluX2Rlc3Ryb3lfY2FjaGUodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ry
b3koYXVfY2FjaGVwW0F1Q2FjaGVfSElOT1RJRlldKTsKKwlhdV9jYWNoZXBbQXVDYWNoZV9ISU5P
VElGWV0gPSBOVUxMOworfQorCitpbnQgX19pbml0IGF1X2lub3RpZnlfaW5pdCh2b2lkKQorewor
CWF1X2hpbl9uaWdub3JlID0gNjsKKwl3aGlsZSAoMVUgPDwgYXVfaGluX25pZ25vcmUgPCBBdUlu
TWFzaykKKwkJYXVfaGluX25pZ25vcmUrKzsKKwkvL0F1RGJnKCJhdV9oaW5fbmlnbm9yZSAlZFxu
IiwgYXVfaGluX25pZ25vcmUpOworCUF1RGVidWdPbihhdV9oaW5fbmlnbm9yZSAhPSAxMCk7CisK
Kwlpbl9oYW5kbGUgPSBFUlJfUFRSKC1FTk9NRU0pOworCWF1X2NhY2hlcFtBdUNhY2hlX0hJTk9U
SUZZXQorCQk9IEF1Q2FjaGVYKGF1X2hpbm90aWZ5LCBzaXplb2YoYXRvbWljX3QpICogYXVfaGlu
X25pZ25vcmUpOworCWlmICh1bmxpa2VseSghYXVfY2FjaGVwW0F1Q2FjaGVfSElOT1RJRlldKSkK
KwkJZ290byBvdXQ7CisKKwlpbl9oYW5kbGUgPSBpbm90aWZ5X2luaXQoJmF1ZnNfaW5vdGlmeV9v
cHMpOworCWlmICghSVNfRVJSKGluX2hhbmRsZSkpCisJCXJldHVybiAwOworCisJYXVfaGluX2Rl
c3Ryb3lfY2FjaGUoKTsKKyBvdXQ6CisJQXVUcmFjZUVyclB0cihpbl9oYW5kbGUpOworCXJldHVy
biBQVFJfRVJSKGluX2hhbmRsZSk7Cit9CisKK3ZvaWQgYXVfaW5vdGlmeV9maW4odm9pZCkKK3sK
Kwlpbm90aWZ5X2Rlc3Ryb3koaW5faGFuZGxlKTsKKwlpZiAoYXVfY2FjaGVwW0F1Q2FjaGVfSElO
T1RJRlldKQorCQlhdV9oaW5fZGVzdHJveV9jYWNoZSgpOworfQpkaWZmIC11ck4gbGludXgtMi42
LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvaWluZm8uYyBsaW51eC0yLjYuMjUuNC11bmlvbmZz
L2ZzL2F1ZnMvaWluZm8uYwotLS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMv
aWluZm8uYwkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlv
bmZzL2ZzL2F1ZnMvaWluZm8uYwkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEs
MjgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisg
KgorICogVGhpcyBwcm9ncmFtLCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICog
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0g
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLwor
CisvKgorICogaW5vZGUgcHJpdmF0ZSBkYXRhCisgKgorICogJElkOiBpaW5mby5jLHYgMS4yIDIw
MDgvMDQvMjEgMDE6MzI6MDUgc2Zqcm8gRXhwICQKKyAqLworCisjaW5jbHVkZSAiYXVmcy5oIgor
CitzdHJ1Y3QgYXVfaWluZm8gKmF1X2lpKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0
IGF1X2lpbmZvICppaW5mbzsKKworCWlpbmZvID0gJihjb250YWluZXJfb2YoaW5vZGUsIHN0cnVj
dCBhdWZzX2ljbnRuciwgdmZzX2lub2RlKS0+aWluZm8pOworCS8qIGJhZF9pbm9kZSBjYXNlICov
CisJaWYgKHVubGlrZWx5KCFpaW5mby0+aWlfaGlub2RlKSkKKwkJcmV0dXJuIE5VTEw7CisJQXVE
ZWJ1Z09uKCFpaW5mby0+aWlfaGlub2RlCisJCSAgLyogfHwgYXVfc2JpKGlub2RlLT5pX3NiKS0+
c2lfYmVuZCA8IGlpbmZvLT5paV9iZW5kICovCisJCSAgfHwgaWluZm8tPmlpX2JlbmQgPCBpaW5m
by0+aWlfYnN0YXJ0KTsKKwlyZXR1cm4gaWluZm87Cit9CisKK3N0cnVjdCBpbm9kZSAqYXVfaF9p
cHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGF1ZnNfYmluZGV4X3QgYmluZGV4KQoreworCXN0cnVj
dCBpbm9kZSAqaGlkZGVuX2lub2RlOworCisJSWlNdXN0QW55TG9jayhpbm9kZSk7CisJQXVEZWJ1
Z09uKGJpbmRleCA8IDAgfHwgYXVfaWJlbmQoaW5vZGUpIDwgYmluZGV4KTsKKwloaWRkZW5faW5v
ZGUgPSBhdV9paShpbm9kZSktPmlpX2hpbm9kZVswICsgYmluZGV4XS5oaV9pbm9kZTsKKwlBdURl
YnVnT24oaGlkZGVuX2lub2RlICYmIGF0b21pY19yZWFkKCZoaWRkZW5faW5vZGUtPmlfY291bnQp
IDw9IDApOworCXJldHVybiBoaWRkZW5faW5vZGU7Cit9CisKK2F1ZnNfYmluZGV4X3QgYXVfaWlf
YnJfaWQoc3RydWN0IGlub2RlICppbm9kZSwgYXVmc19iaW5kZXhfdCBiaW5kZXgpCit7CisJSWlN
dXN0QW55TG9jayhpbm9kZSk7CisJQXVEZWJ1Z09uKGJpbmRleCA8IDAKKwkJICB8fCBhdV9pYmVu
ZChpbm9kZSkgPCBiaW5kZXgKKwkJICB8fCAhYXVfaWkoaW5vZGUpLT5paV9oaW5vZGVbMCArIGJp
bmRleF0uaGlfaW5vZGUpOworCXJldHVybiBhdV9paShpbm9kZSktPmlpX2hpbm9kZVswICsgYmlu
ZGV4XS5oaV9pZDsKK30KKworLy8gaGFyZC9zb2Z0IHNldAordm9pZCBhdV9zZXRfaWJzdGFydChz
dHJ1Y3QgaW5vZGUgKmlub2RlLCBhdWZzX2JpbmRleF90IGJpbmRleCkKK3sKKwlzdHJ1Y3QgYXVf
aWluZm8gKmlpbmZvID0gYXVfaWkoaW5vZGUpOworCXN0cnVjdCBpbm9kZSAqaF9pbm9kZTsKKwor
CUlpTXVzdFdyaXRlTG9jayhpbm9kZSk7CisJQXVEZWJ1Z09uKGF1X3NiZW5kKGlub2RlLT5pX3Ni
KSA8IGJpbmRleCk7CisJaWluZm8tPmlpX2JzdGFydCA9IGJpbmRleDsKKwloX2lub2RlID0gaWlu
Zm8tPmlpX2hpbm9kZVtiaW5kZXggKyAwXS5oaV9pbm9kZTsKKwlpZiAoaF9pbm9kZSkKKwkJYXVf
Y3B1cF9pZ2VuKGlub2RlLCBoX2lub2RlKTsKK30KKwordW5zaWduZWQgaW50IGF1X2hpX2ZsYWdz
KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBpc2RpcikKK3sKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7
CisJY29uc3QgdW5zaWduZWQgaW50IG1udF9mbGFncyA9IGF1X21udGZsYWdzKGlub2RlLT5pX3Ni
KTsKKworCWZsYWdzID0gMDsKKwlpZiAoYXVfb3B0X3Rlc3QobW50X2ZsYWdzLCBYSU5PKSkKKwkJ
YXVfZnNldF9oaShmbGFncywgWElOTyk7CisJaWYgKHVubGlrZWx5KGlzZGlyICYmIGF1X29wdF90
ZXN0KG1udF9mbGFncywgVURCQV9JTk9USUZZKSkpCisJCWF1X2ZzZXRfaGkoZmxhZ3MsIE5PVElG
WSk7CisJcmV0dXJuIGZsYWdzOworfQorCit2b2lkIGF1X3NldF9oX2lwdHIoc3RydWN0IGlub2Rl
ICppbm9kZSwgYXVmc19iaW5kZXhfdCBiaW5kZXgsCisJCSAgIHN0cnVjdCBpbm9kZSAqaF9pbm9k
ZSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBhdV9oaW5vZGUgKmhpbm9kZTsKKwlz
dHJ1Y3QgaW5vZGUgKmhpOworCXN0cnVjdCBhdV9paW5mbyAqaWluZm8gPSBhdV9paShpbm9kZSk7
CisKKwlMS1RSVHJhY2UoImklbHUsIGIlZCwgaGklbHUsIGZsYWdzIDB4JXhcbiIsCisJCSAgaW5v
ZGUtPmlfaW5vLCBiaW5kZXgsIGhfaW5vZGUgPyBoX2lub2RlLT5pX2lubyA6IDAsIGZsYWdzKTsK
KwlJaU11c3RXcml0ZUxvY2soaW5vZGUpOworCWhpbm9kZSA9IGlpbmZvLT5paV9oaW5vZGUgKyBi
aW5kZXg7CisJaGkgPSBoaW5vZGUtPmhpX2lub2RlOworCUF1RGVidWdPbihiaW5kZXggPCBhdV9p
YnN0YXJ0KGlub2RlKSB8fCBhdV9pYmVuZChpbm9kZSkgPCBiaW5kZXgKKwkJICB8fCAoaF9pbm9k
ZSAmJiBhdG9taWNfcmVhZCgmaF9pbm9kZS0+aV9jb3VudCkgPD0gMCkKKwkJICB8fCAoaF9pbm9k
ZSAmJiBoaSkpOworCisJaWYgKGhpKSB7CisJCWF1X2hpcHV0KGhpbm9kZSk7CisJfQorCWhpbm9k
ZS0+aGlfaW5vZGUgPSBoX2lub2RlOworCWlmIChoX2lub2RlKSB7CisJCWludCBlcnI7CisJCXN0
cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCQlpZiAoYmluZGV4ID09IGlp
bmZvLT5paV9ic3RhcnQpCisJCQlhdV9jcHVwX2lnZW4oaW5vZGUsIGhfaW5vZGUpOworCQloaW5v
ZGUtPmhpX2lkID0gYXVfc2JyX2lkKHNiLCBiaW5kZXgpOworCQlpZiAoYXVfZnRlc3RfaGkoZmxh
Z3MsIFhJTk8pKSB7CisJCQlzdHJ1Y3QgYXVfeGlub19lbnRyeSB4aW5vZSA9IHsKKwkJCQkuaW5v
CT0gaW5vZGUtPmlfaW5vLAorCQkJCS8vLmhfZ2VuCT0gaF9pbm9kZS0+aV9nZW5lcmF0aW9uCisJ
CQl9OworCQkJZXJyID0gYXVfeGlub193cml0ZShzYiwgYmluZGV4LCBoX2lub2RlLT5pX2lubywg
Jnhpbm9lKTsKKwkJCWlmICh1bmxpa2VseShlcnIpKQorCQkJCUF1SU9FcnIxKCJmYWlsZWQgYXVf
eGlub193cml0ZSgpICVkXG4iLCBlcnIpOworCQl9CisKKwkJaWYgKHVubGlrZWx5KGF1X2Z0ZXN0
X2hpKGZsYWdzLCBOT1RJRlkpCisJCQkgICAgICYmIGF1X2JyX2hpbm90aWZ5YWJsZShhdV9zYnJf
cGVybShzYiwgYmluZGV4KSkpKSB7CisJCQllcnIgPSBhdV9oaW5fYWxsb2MoaGlub2RlLCBpbm9k
ZSwgaF9pbm9kZSk7CisJCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCQlBdUlPRXJyMSgiYXVfaGlu
X2FsbG9jKCkgJWRcbiIsIGVycik7CisJCX0KKwl9Cit9CisKK3ZvaWQgYXVfc2V0X2hpX3doKHN0
cnVjdCBpbm9kZSAqaW5vZGUsIGF1ZnNfYmluZGV4X3QgYmluZGV4LAorCQkgIHN0cnVjdCBkZW50
cnkgKmhfd2gpCit7CisJc3RydWN0IGF1X2hpbm9kZSAqaGlub2RlOworCisJSWlNdXN0V3JpdGVM
b2NrKGlub2RlKTsKKwloaW5vZGUgPSBhdV9paShpbm9kZSktPmlpX2hpbm9kZSArIGJpbmRleDsK
KwlBdURlYnVnT24oaGlub2RlLT5oaV93aGRlbnRyeSk7CisJaGlub2RlLT5oaV93aGRlbnRyeSA9
IGhfd2g7Cit9CisKK3ZvaWQgYXVfdXBkYXRlX2lpZ2VuKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7
CisJLy9JaU11c3RXcml0ZUxvY2soaW5vZGUpOworCUF1RGVidWdPbighaW5vZGUtPmlfc2IpOwor
CWF0b21pY19zZXQoJmF1X2lpKGlub2RlKS0+aWlfZ2VuZXJhdGlvbiwgYXVfc2lnZW4oaW5vZGUt
Pmlfc2IpKTsKKwkvL3NtcF9tYigpOyAvKiBhdG9taWNfc2V0ICovCit9CisKKy8qIGl0IG1heSBi
ZSBjYWxsZWQgYXQgcmVtb3VudCB0aW1lLCB0b28gKi8KK3ZvaWQgYXVfdXBkYXRlX2JyYW5nZShz
dHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZG9fcHV0X3plcm8pCit7CisJc3RydWN0IGF1X2lpbmZv
ICppaW5mbzsKKworCUxLVFJUcmFjZSgiaSVsdSwgJWRcbiIsIGlub2RlLT5pX2lubywgZG9fcHV0
X3plcm8pOworCUlpTXVzdFdyaXRlTG9jayhpbm9kZSk7CisKKwlpaW5mbyA9IGF1X2lpKGlub2Rl
KTsKKwlpZiAodW5saWtlbHkoIWlpbmZvKSB8fCBpaW5mby0+aWlfYnN0YXJ0IDwgMCkKKwkJcmV0
dXJuOworCisJaWYgKGRvX3B1dF96ZXJvKSB7CisJCWF1ZnNfYmluZGV4X3QgYmluZGV4OworCQlm
b3IgKGJpbmRleCA9IGlpbmZvLT5paV9ic3RhcnQ7IGJpbmRleCA8PSBpaW5mby0+aWlfYmVuZDsK
KwkJICAgICBiaW5kZXgrKykgeworCQkJc3RydWN0IGlub2RlICpoX2k7CisJCQloX2kgPSBpaW5m
by0+aWlfaGlub2RlWzAgKyBiaW5kZXhdLmhpX2lub2RlOworCQkJaWYgKGhfaSAmJiAhaF9pLT5p
X25saW5rKQorCQkJCWF1X3NldF9oX2lwdHIoaW5vZGUsIGJpbmRleCwgTlVMTCwgMCk7CisJCX0K
Kwl9CisKKwlpaW5mby0+aWlfYnN0YXJ0ID0gLTE7CisJd2hpbGUgKCsraWluZm8tPmlpX2JzdGFy
dCA8PSBpaW5mby0+aWlfYmVuZCkKKwkJaWYgKGlpbmZvLT5paV9oaW5vZGVbMCArIGlpbmZvLT5p
aV9ic3RhcnRdLmhpX2lub2RlKQorCQkJYnJlYWs7CisJaWYgKGlpbmZvLT5paV9ic3RhcnQgPiBp
aW5mby0+aWlfYmVuZCkgeworCQlpaW5mby0+aWlfYnN0YXJ0ID0gLTE7CisJCWlpbmZvLT5paV9i
ZW5kID0gLTE7CisJCXJldHVybjsKKwl9CisKKwlpaW5mby0+aWlfYmVuZCsrOworCXdoaWxlICgw
IDw9IC0taWluZm8tPmlpX2JlbmQpCisJCWlmIChpaW5mby0+aWlfaGlub2RlWzAgKyBpaW5mby0+
aWlfYmVuZF0uaGlfaW5vZGUpCisJCQlicmVhazsKKwlBdURlYnVnT24oaWluZm8tPmlpX2JzdGFy
dCA+IGlpbmZvLT5paV9iZW5kIHx8IGlpbmZvLT5paV9iZW5kIDwgMCk7Cit9CisKKy8qIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gKi8KKworaW50IGF1X2lpbmZvX2luaXQoc3RydWN0IGlub2RlICppbm9kZSkKK3sK
KwlzdHJ1Y3QgYXVfaWluZm8gKmlpbmZvOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJaW50
IG5iciwgaTsKKworCXNiID0gaW5vZGUtPmlfc2I7CisJQXVEZWJ1Z09uKCFzYik7CisJaWluZm8g
PSAmKGNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IGF1ZnNfaWNudG5yLCB2ZnNfaW5vZGUpLT5p
aW5mbyk7CisJQXVEZWJ1Z09uKGlpbmZvLT5paV9oaW5vZGUpOworCW5iciA9IGF1X3NiZW5kKHNi
KSArIDE7CisJaWYgKHVubGlrZWx5KG5iciA8PSAwKSkKKwkJbmJyID0gMTsKKwlpaW5mby0+aWlf
aGlub2RlID0ga2NhbGxvYyhuYnIsIHNpemVvZigqaWluZm8tPmlpX2hpbm9kZSksIEdGUF9LRVJO
RUwpOworCS8vaWluZm8tPmlpX2hpbm9kZSA9IE5VTEw7CisJaWYgKGlpbmZvLT5paV9oaW5vZGUp
IHsKKwkJZm9yIChpID0gMDsgaSA8IG5icjsgaSsrKQorCQkJaWluZm8tPmlpX2hpbm9kZVtpXS5o
aV9pZCA9IC0xOworCQlhdG9taWNfc2V0KCZpaW5mby0+aWlfZ2VuZXJhdGlvbiwgYXVfc2lnZW4o
c2IpKTsKKwkJLy9zbXBfbWIoKTsgLyogYXRvbWljX3NldCAqLworCQlhdV9yd19pbml0X25vbG9j
aygmaWluZm8tPmlpX3J3c2VtKTsKKwkJaWluZm8tPmlpX2JzdGFydCA9IC0xOworCQlpaW5mby0+
aWlfYmVuZCA9IC0xOworCQlpaW5mby0+aWlfdmRpciA9IE5VTEw7CisJCXJldHVybiAwOworCX0K
KwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBhdV9paW5mb193cml0ZTAoc3RydWN0
IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGF1X2hpbm9kZSAqaGlub2RlLAorCQkJICAgaW5vX3Qg
aW5vKQoreworCWludCBlcnIsIGxvY2tlZDsKKwlhdWZzX2JpbmRleF90IGJpbmRleDsKKworCWVy
ciA9IDA7CisJbG9ja2VkID0gc2lfcmVhZF90cnlsb2NrKHNiLCAhQXVMb2NrX0ZMVVNIKTsgLy8g
Y3J1Y2lvIQorCWJpbmRleCA9IGF1X2JyX2luZGV4KHNiLCBoaW5vZGUtPmhpX2lkKTsKKwlpZiAo
YmluZGV4ID49IDApCisJCWVyciA9IGF1X3hpbm9fd3JpdGUwKHNiLCBiaW5kZXgsIGhpbm9kZS0+
aGlfaW5vZGUtPmlfaW5vLCBpbm8pOworCS8qIGVycm9yIGFjdGlvbj8gKi8KKwlpZiAobG9ja2Vk
KQorCQlzaV9yZWFkX3VubG9jayhzYik7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBhdV9paW5m
b19maW4oc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYXVfaWluZm8gKmlpbmZvOwor
CWF1ZnNfYmluZGV4X3QgYmVuZDsKKwlzdHJ1Y3QgYXVfaGlub2RlICpoaTsKKwlzdHJ1Y3Qgc3Vw
ZXJfYmxvY2sgKnNiOworCWludCB1bmxpbmtlZDsKKwlpbm9fdCBpbm87CisKKwlpaW5mbyA9IGF1
X2lpKGlub2RlKTsKKwkvKiBiYWRfaW5vZGUgY2FzZSAqLworCWlmICh1bmxpa2VseSghaWluZm8p
KQorCQlyZXR1cm47CisKKwlpZiAodW5saWtlbHkoaWluZm8tPmlpX3ZkaXIpKQorCQlhdV92ZGly
X2ZyZWUoaWluZm8tPmlpX3ZkaXIpOworCisJaWYgKGlpbmZvLT5paV9ic3RhcnQgPj0gMCkgewor
CQlzYiA9IGlub2RlLT5pX3NiOworCQl1bmxpbmtlZCA9ICFpbm9kZS0+aV9ubGluazsKKwkJaW5v
ID0gMDsKKwkJaWYgKHVubGlua2VkKQorCQkJaW5vID0gaW5vZGUtPmlfaW5vOworCQloaSA9IGlp
bmZvLT5paV9oaW5vZGUgKyBpaW5mby0+aWlfYnN0YXJ0OworCQliZW5kID0gaWluZm8tPmlpX2Jl
bmQ7CisJCXdoaWxlIChpaW5mby0+aWlfYnN0YXJ0KysgPD0gYmVuZCkgeworCQkJaWYgKGhpLT5o
aV9pbm9kZSkgeworCQkJCWlmICh1bmxpbmtlZCB8fCAhaGktPmhpX2lub2RlLT5pX25saW5rKSB7
CisJCQkJCWF1X2lpbmZvX3dyaXRlMChzYiwgaGksIGlubyk7CisJCQkJCS8qIGlnbm9yZSB0aGlz
IGVycm9yICovCisJCQkJCWlubyA9IDA7CisJCQkJfQorCQkJCWF1X2hpcHV0KGhpKTsKKwkJCX0K
KwkJCWhpKys7CisJCX0KKwkJLy9paW5mby0+aWlfYnN0YXJ0ID0gaWluZm8tPmlpX2JlbmQgPSAt
MTsKKwl9CisKKwlrZnJlZShpaW5mby0+aWlfaGlub2RlKTsKKwkvL2lpbmZvLT5paV9oaW5vZGUg
PSBOVUxMOworfQpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMv
aW5vZGUuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvaW5vZGUuYwotLS0gbGludXgt
Mi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvaW5vZGUuYwkxOTcwLTAxLTAxIDAzOjAwOjAw
ICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvaW5vZGUuYwkyMDA4LTA1
LTI1IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEsNDA1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9ncmFtLCBhdWZzIGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAq
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBh
bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy
ZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0
b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogaW5vZGUgZnVuY3Rpb25zCisg
KgorICogJElkOiBpbm9kZS5jLHYgMS4zIDIwMDgvMDQvMjggMDM6MDQ6MTIgc2Zqcm8gRXhwICQK
KyAqLworCisjaW5jbHVkZSAiYXVmcy5oIgorCitpbnQgYXVfcmVmcmVzaF9oaW5vZGVfc2VsZihz
dHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBlcnIsIG5ld19zeiwgdXBkYXRlOworCXN0cnVj
dCBpbm9kZSAqZmlyc3Q7CisJc3RydWN0IGF1X2hpbm9kZSAqcCwgKnEsIHRtcDsKKwlzdHJ1Y3Qg
c3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBhdV9paW5mbyAqaWluZm87CisJYXVmc19iaW5kZXhf
dCBiaW5kZXgsIGJlbmQsIG5ld19iaW5kZXg7CisKKwlMS1RSVHJhY2UoImklbHVcbiIsIGlub2Rl
LT5pX2lubyk7CisJSWlNdXN0V3JpdGVMb2NrKGlub2RlKTsKKworCWVyciA9IC1FTk9NRU07CisJ
dXBkYXRlID0gMDsKKwlzYiA9IGlub2RlLT5pX3NiOworCWJlbmQgPSBhdV9zYmVuZChzYik7CisJ
bmV3X3N6ID0gc2l6ZW9mKCppaW5mby0+aWlfaGlub2RlKSAqIChiZW5kICsgMSk7CisJaWluZm8g
PSBhdV9paShpbm9kZSk7CisJcCA9IGF1X2t6cmVhbGxvYyhpaW5mby0+aWlfaGlub2RlLCBzaXpl
b2YoKnApICogKGlpbmZvLT5paV9iZW5kICsgMSksCisJCQkgbmV3X3N6LCBHRlBfS0VSTkVMKTsK
KwkvL3AgPSBOVUxMOworCWlmICh1bmxpa2VseSghcCkpCisJCWdvdG8gb3V0OworCisJaWluZm8t
PmlpX2hpbm9kZSA9IHA7CisJcCA9IGlpbmZvLT5paV9oaW5vZGUgKyBpaW5mby0+aWlfYnN0YXJ0
OworCWZpcnN0ID0gcC0+aGlfaW5vZGU7CisJZXJyID0gMDsKKwlmb3IgKGJpbmRleCA9IGlpbmZv
LT5paV9ic3RhcnQ7IGJpbmRleCA8PSBpaW5mby0+aWlfYmVuZDsKKwkgICAgIGJpbmRleCsrLCBw
KyspIHsKKwkJaWYgKCFwLT5oaV9pbm9kZSkKKwkJCWNvbnRpbnVlOworCisJCW5ld19iaW5kZXgg
PSBhdV9icl9pbmRleChzYiwgcC0+aGlfaWQpOworCQlpZiAobmV3X2JpbmRleCA9PSBiaW5kZXgp
CisJCQljb250aW51ZTsKKwkJaWYgKG5ld19iaW5kZXggPCAwKSB7CisJCQl1cGRhdGUrKzsKKwkJ
CWF1X2hpcHV0KHApOworCQkJcC0+aGlfaW5vZGUgPSBOVUxMOworCQkJY29udGludWU7CisJCX0K
KworCQlpZiAobmV3X2JpbmRleCA8IGlpbmZvLT5paV9ic3RhcnQpCisJCQlpaW5mby0+aWlfYnN0
YXJ0ID0gbmV3X2JpbmRleDsKKwkJaWYgKGlpbmZvLT5paV9iZW5kIDwgbmV3X2JpbmRleCkKKwkJ
CWlpbmZvLT5paV9iZW5kID0gbmV3X2JpbmRleDsKKwkJLyogc3dhcCB0d28gaGlkZGVuIGlub2Rl
LCBhbmQgbG9vcCBhZ2FpbiAqLworCQlxID0gaWluZm8tPmlpX2hpbm9kZSArIG5ld19iaW5kZXg7
CisJCXRtcCA9ICpxOworCQkqcSA9ICpwOworCQkqcCA9IHRtcDsKKwkJaWYgKHRtcC5oaV9pbm9k
ZSkgeworCQkJYmluZGV4LS07CisJCQlwLS07CisJCX0KKwl9CisJYXVfdXBkYXRlX2JyYW5nZShp
bm9kZSwgLypkb19wdXRfemVybyovMCk7CisKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBv
dXQ7CisKKwlpZiAoMSB8fCBmaXJzdCAhPSBhdV9oX2lwdHIoaW5vZGUsIGlpbmZvLT5paV9ic3Rh
cnQpKQorCQlhdV9jcHVwX2F0dHJfYWxsKGlub2RlKTsKKwlpZiAodXBkYXRlICYmIFNfSVNESVIo
aW5vZGUtPmlfbW9kZSkpCisJCWlub2RlLT5pX3ZlcnNpb24rKzsKKwlhdV91cGRhdGVfaWlnZW4o
aW5vZGUpOworCisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitp
bnQgYXVfcmVmcmVzaF9oaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAq
ZGVudHJ5KQoreworCWludCBlcnIsIHVwZGF0ZSwgaXNkaXI7CisJc3RydWN0IGlub2RlICpmaXJz
dDsKKwlzdHJ1Y3QgYXVfaGlub2RlICpwOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3Ry
dWN0IGF1X2lpbmZvICppaW5mbzsKKwlhdWZzX2JpbmRleF90IGJpbmRleCwgYmVuZDsKKwl1bnNp
Z25lZCBpbnQgZmxhZ3M7CisKKwlMS1RSVHJhY2UoIiUuKnNcbiIsIEF1RExOUGFpcihkZW50cnkp
KTsKKwlJaU11c3RXcml0ZUxvY2soaW5vZGUpOworCisJZXJyID0gYXVfcmVmcmVzaF9oaW5vZGVf
c2VsZihpbm9kZSk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0OworCisJc2IgPSBk
ZW50cnktPmRfc2I7CisJYmVuZCA9IGF1X3NiZW5kKHNiKTsKKwlpaW5mbyA9IGF1X2lpKGlub2Rl
KTsKKwl1cGRhdGUgPSAwOworCXAgPSBpaW5mby0+aWlfaGlub2RlICsgaWluZm8tPmlpX2JzdGFy
dDsKKwlmaXJzdCA9IHAtPmhpX2lub2RlOworCWlzZGlyID0gU19JU0RJUihpbm9kZS0+aV9tb2Rl
KTsKKwlmbGFncyA9IGF1X2hpX2ZsYWdzKGlub2RlLCBpc2Rpcik7CisJYmVuZCA9IGF1X2RiZW5k
KGRlbnRyeSk7CisJZm9yIChiaW5kZXggPSBhdV9kYnN0YXJ0KGRlbnRyeSk7IGJpbmRleCA8PSBi
ZW5kOyBiaW5kZXgrKykgeworCQlzdHJ1Y3QgaW5vZGUgKmhpOworCQlzdHJ1Y3QgZGVudHJ5ICpo
ZDsKKworCQloZCA9IGF1X2hfZHB0cihkZW50cnksIGJpbmRleCk7CisJCWlmICghaGQgfHwgIWhk
LT5kX2lub2RlKQorCQkJY29udGludWU7CisKKwkJaWYgKGlpbmZvLT5paV9ic3RhcnQgPD0gYmlu
ZGV4ICYmIGJpbmRleCA8PSBpaW5mby0+aWlfYmVuZCkgeworCQkJaGkgPSBhdV9oX2lwdHIoaW5v
ZGUsIGJpbmRleCk7CisJCQlpZiAoaGkpIHsKKwkJCQlpZiAoaGkgPT0gaGQtPmRfaW5vZGUpCisJ
CQkJCWNvbnRpbnVlOworCQkJCWVyciA9IC1FU1RBTEU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0K
KwkJaWYgKGJpbmRleCA8IGlpbmZvLT5paV9ic3RhcnQpCisJCQlpaW5mby0+aWlfYnN0YXJ0ID0g
YmluZGV4OworCQlpZiAoaWluZm8tPmlpX2JlbmQgPCBiaW5kZXgpCisJCQlpaW5mby0+aWlfYmVu
ZCA9IGJpbmRleDsKKwkJYXVfc2V0X2hfaXB0cihpbm9kZSwgYmluZGV4LCBpZ3JhYihoZC0+ZF9p
bm9kZSksIGZsYWdzKTsKKwkJdXBkYXRlKys7CisJfQorCWF1X3VwZGF0ZV9icmFuZ2UoaW5vZGUs
IC8qZG9fcHV0X3plcm8qLzApOworCisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0Owor
CisJaWYgKDEgfHwgZmlyc3QgIT0gYXVfaF9pcHRyKGlub2RlLCBpaW5mby0+aWlfYnN0YXJ0KSkK
KwkJYXVfY3B1cF9hdHRyX2FsbChpbm9kZSk7CisJaWYgKHVwZGF0ZSAmJiBpc2RpcikKKwkJaW5v
ZGUtPmlfdmVyc2lvbisrOworCWF1X3VwZGF0ZV9paWdlbihpbm9kZSk7CisKKyBvdXQ6CisJQXVU
cmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2lub2RlKHN0
cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyLCBp
c2RpcjsKKwlzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmhfaW5vZGU7
CisJdW1vZGVfdCBtb2RlOworCWF1ZnNfYmluZGV4X3QgYmluZGV4LCBic3RhcnQsIGJ0YWlsOwor
CXN0cnVjdCBhdV9paW5mbyAqaWluZm87CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJTEtUUlRy
YWNlKCJpJWx1LCAlLipzXG4iLCBpbm9kZS0+aV9pbm8sIEF1RExOUGFpcihkZW50cnkpKTsKKwlB
dURlYnVnT24oIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSk7CisJSWlNdXN0V3JpdGVMb2NrKGlu
b2RlKTsKKwlic3RhcnQgPSBhdV9kYnN0YXJ0KGRlbnRyeSk7CisJaF9kZW50cnkgPSBhdV9oX2Rw
dHIoZGVudHJ5LCBic3RhcnQpOworCUF1RGVidWdPbighaF9kZW50cnkpOworCWhfaW5vZGUgPSBo
X2RlbnRyeS0+ZF9pbm9kZTsKKwlBdURlYnVnT24oIWhfaW5vZGUpOworCisJZXJyID0gMDsKKwlp
c2RpciA9IDA7CisJbW9kZSA9IGhfaW5vZGUtPmlfbW9kZTsKKwlzd2l0Y2ggKG1vZGUgJiBTX0lG
TVQpIHsKKwljYXNlIFNfSUZSRUc6CisJCWJ0YWlsID0gYXVfZGJ0YWlsKGRlbnRyeSk7CisJCWJy
ZWFrOworCWNhc2UgU19JRkRJUjoKKwkJaXNkaXIgPSAxOworCQlidGFpbCA9IGF1X2RidGFpbGRp
cihkZW50cnkpOworCQlpbm9kZS0+aV9vcCA9ICZhdWZzX2Rpcl9pb3A7CisJCWlub2RlLT5pX2Zv
cCA9ICZhdWZzX2Rpcl9mb3A7CisJCWJyZWFrOworCWNhc2UgU19JRkxOSzoKKwkJYnRhaWwgPSBh
dV9kYnRhaWwoZGVudHJ5KTsKKwkJaW5vZGUtPmlfb3AgPSAmYXVmc19zeW1saW5rX2lvcDsKKwkJ
YnJlYWs7CisJY2FzZSBTX0lGQkxLOgorCWNhc2UgU19JRkNIUjoKKwljYXNlIFNfSUZJRk86CisJ
Y2FzZSBTX0lGU09DSzoKKwkJYnRhaWwgPSBhdV9kYnRhaWwoZGVudHJ5KTsKKwkJaW5pdF9zcGVj
aWFsX2lub2RlKGlub2RlLCBtb2RlLAorCQkJCSAgIGF1X2hfcmRldihoX2lub2RlLCAvKmhfbW50
Ki9OVUxMLCBoX2RlbnRyeSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlBdUlPRXJyKCJVbmtu
b3duIGZpbGUgdHlwZSAwJW9cbiIsIG1vZGUpOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dDsK
Kwl9CisKKwlmbGFncyA9IGF1X2hpX2ZsYWdzKGlub2RlLCBpc2Rpcik7CisJaWluZm8gPSBhdV9p
aShpbm9kZSk7CisJaWluZm8tPmlpX2JzdGFydCA9IGJzdGFydDsKKwlpaW5mby0+aWlfYmVuZCA9
IGJ0YWlsOworCWZvciAoYmluZGV4ID0gYnN0YXJ0OyBiaW5kZXggPD0gYnRhaWw7IGJpbmRleCsr
KSB7CisJCWhfZGVudHJ5ID0gYXVfaF9kcHRyKGRlbnRyeSwgYmluZGV4KTsKKwkJaWYgKCFoX2Rl
bnRyeSkKKwkJCWNvbnRpbnVlOworCQlBdURlYnVnT24oIWhfZGVudHJ5LT5kX2lub2RlKTsKKwkJ
YXVfc2V0X2hfaXB0cihpbm9kZSwgYmluZGV4LCBpZ3JhYihoX2RlbnRyeS0+ZF9pbm9kZSksIGZs
YWdzKTsKKwl9CisJYXVfY3B1cF9hdHRyX2FsbChpbm9kZSk7CisKKyBvdXQ6CisJQXVUcmFjZUVy
cihlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIHN1Y2Nlc3NmdWwgcmV0dXJucyB3aXRoIGlp
bmZvIHdyaXRlX2xvY2tlZCAqLworLy90b2RvOiByZXR1cm4gd2l0aCB1bmxvY2tlZD8KK3N0YXRp
YyBpbnQgcmV2YWxfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVu
dHJ5LCBpbnQgKm1hdGNoZWQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmhfaW5vZGUs
ICpoX2Rpbm9kZTsKKwlhdWZzX2JpbmRleF90IGJpbmRleCwgYmVuZDsKKworCUxLVFJUcmFjZSgi
aSVsdSwgJS4qc1xuIiwgaW5vZGUtPmlfaW5vLCBBdURMTlBhaXIoZGVudHJ5KSk7CisKKwkqbWF0
Y2hlZCA9IDA7CisKKwkvKgorCSAqIGJlZm9yZSB0aGlzIGZ1bmN0aW9uLCBpZiBhdWZzIGdvdCBh
bnkgaWluZm8gbG9jaywgaXQgbXVzdCBiZSBvbmx5CisJICogb25lLCB0aGUgcGFyZW50IGRpci4K
KwkgKiBpdCBjYW4gaGFwcGVuIGJ5IFVEQkEgYW5kIHRoZSBvYnNvbGV0ZWQgaW5vZGUgbnVtYmVy
LgorCSAqLworCWVyciA9IC1FSU87CisJaWYgKHVubGlrZWx5KGlub2RlLT5pX2lubyA9PSBwYXJl
bnRfaW5vKGRlbnRyeSkpKQorCQlnb3RvIG91dDsKKworCWVyciA9IDA7CisJaF9kaW5vZGUgPSBh
dV9oX2RwdHIoZGVudHJ5LCBhdV9kYnN0YXJ0KGRlbnRyeSkpLT5kX2lub2RlOworCW11dGV4X2xv
Y2tfbmVzdGVkKCZpbm9kZS0+aV9tdXRleCwgQXVMc2NfSV9DSElMRCk7CisJaWlfd3JpdGVfbG9j
a19uZXcoaW5vZGUpOworCWJlbmQgPSBhdV9pYmVuZChpbm9kZSk7CisJZm9yIChiaW5kZXggPSBh
dV9pYnN0YXJ0KGlub2RlKTsgYmluZGV4IDw9IGJlbmQ7IGJpbmRleCsrKSB7CisJCWhfaW5vZGUg
PSBhdV9oX2lwdHIoaW5vZGUsIGJpbmRleCk7CisJCWlmIChoX2lub2RlICYmIGhfaW5vZGUgPT0g
aF9kaW5vZGUpIHsKKwkJCS8vJiYgKGlicyAhPSBic3RhcnQgfHwgIWF1X3Rlc3RfaGlnZW4oaW5v
ZGUsIGhfaW5vZGUpKSk7CisJCQkqbWF0Y2hlZCA9IDE7CisJCQllcnIgPSAwOworCQkJaWYgKHVu
bGlrZWx5KGF1X2lpZ2VuKGlub2RlKSAhPSBhdV9kaWdlbihkZW50cnkpKSkKKwkJCQllcnIgPSBh
dV9yZWZyZXNoX2hpbm9kZShpbm9kZSwgZGVudHJ5KTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlm
ICh1bmxpa2VseShlcnIpKQorCQlpaV93cml0ZV91bmxvY2soaW5vZGUpOworCW11dGV4X3VubG9j
aygmaW5vZGUtPmlfbXV0ZXgpOworCisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4g
ZXJyOworfQorCisvKiBzdWNjZXNzZnVsIHJldHVybnMgd2l0aCBpaW5mbyB3cml0ZV9sb2NrZWQg
Ki8KKy8vdG9kbzogcmV0dXJuIHdpdGggdW5sb2NrZWQ/CitzdHJ1Y3QgaW5vZGUgKmF1X25ld19p
bm9kZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSwgKmhf
aW5vZGU7CisJc3RydWN0IGRlbnRyeSAqaF9kZW50cnk7CisJaW5vX3QgaF9pbm87CisJc3RydWN0
IHN1cGVyX2Jsb2NrICpzYjsKKwlpbnQgZXJyLCBtYXRjaDsKKwlhdWZzX2JpbmRleF90IGJzdGFy
dDsKKwlzdHJ1Y3QgYXVfeGlub19lbnRyeSB4aW5vZTsKKworCUxLVFJUcmFjZSgiJS4qc1xuIiwg
QXVETE5QYWlyKGRlbnRyeSkpOworCXNiID0gZGVudHJ5LT5kX3NiOworCWJzdGFydCA9IGF1X2Ri
c3RhcnQoZGVudHJ5KTsKKwloX2RlbnRyeSA9IGF1X2hfZHB0cihkZW50cnksIGJzdGFydCk7CisJ
QXVEZWJ1Z09uKCFoX2RlbnRyeSk7CisJaF9pbm9kZSA9IGhfZGVudHJ5LT5kX2lub2RlOworCUF1
RGVidWdPbighaF9pbm9kZSk7CisKKwloX2lubyA9IGhfaW5vZGUtPmlfaW5vOworCWVyciA9IGF1
X3hpbm9fcmVhZChzYiwgYnN0YXJ0LCBoX2lubywgJnhpbm9lKTsKKwkvL2VyciA9IC0xOworCWlu
b2RlID0gRVJSX1BUUihlcnIpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIG91dDsKKyBu
ZXdfaW5vOgorCWlmICgheGlub2UuaW5vKSB7CisJCXhpbm9lLmlubyA9IGF1X3hpbm9fbmV3X2lu
byhzYik7CisJCWlmICgheGlub2UuaW5vKSB7CisJCQlpbm9kZSA9IEVSUl9QVFIoLUVJTyk7CisJ
CQlnb3RvIG91dDsKKwkJfQorCX0KKworCUxLVFJUcmFjZSgiaSVsdVxuIiwgeGlub2UuaW5vKTsK
Kwlpbm9kZSA9IGF1X2lnZXRfbG9ja2VkKHNiLCB4aW5vZS5pbm8pOworCWVyciA9IFBUUl9FUlIo
aW5vZGUpOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlnb3RvIG91dDsKKworCUxLVFJUcmFjZSgi
JWx4LCBuZXcgJWRcbiIsIGlub2RlLT5pX3N0YXRlLCAhIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVX
KSk7CisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJaWlfd3JpdGVfbG9ja19uZXco
aW5vZGUpOworCQllcnIgPSBzZXRfaW5vZGUoaW5vZGUsIGRlbnRyeSk7CisJCS8vZXJyID0gLTE7
CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCQlpZiAoIWVycikKKwkJCWdvdG8gb3V0OyAv
KiBzdWNjZXNzICovCisJCWlnZXRfZmFpbGVkKGlub2RlKTsKKwkJaWlfd3JpdGVfdW5sb2NrKGlu
b2RlKTsKKwkJZ290byBvdXRfaXB1dDsKKwl9IGVsc2UgeworCQkvL3RvZG86IHJlbW92ZSB0aGlz
CisJCUF1RGVidWdPbihpbm9kZS0+aV9zdGF0ZSAmIElfTE9DSyk7CisJCWVyciA9IHJldmFsX2lu
b2RlKGlub2RlLCBkZW50cnksICZtYXRjaCk7CisJCWlmICghZXJyKQorCQkJZ290byBvdXQ7IC8q
IHN1Y2Nlc3MgKi8KKwkJZWxzZSBpZiAobWF0Y2gpCisJCQlnb3RvIG91dF9pcHV0OworCX0KKwor
CWlmICh1bmxpa2VseShhdV90ZXN0X3VuaXF1ZV9pbm8oaF9kZW50cnksIGhfaW5vKSkpCisJCUF1
V2FybjEoIlVuLW5vdGlmaWVkIFVEQkEgb3IgcmVwZWF0ZWRseSByZW5hbWVkIGRpciwiCisJCQki
IGIlZCwgJXMsICUuKnMsIGhpJWx1LCBpJWx1LlxuIiwKKwkJCWJzdGFydCwgYXVfc2J0eXBlKGhf
ZGVudHJ5LT5kX3NiKSwgQXVETE5QYWlyKGRlbnRyeSksCisJCQloX2lubywgeGlub2UuaW5vKTsK
Kwl4aW5vZS5pbm8gPSAwOworCWVyciA9IGF1X3hpbm9fd3JpdGUwKHNiLCBic3RhcnQsIGhfaW5v
LCAwKTsKKwlpZiAoIWVycikgeworCQlpcHV0KGlub2RlKTsKKwkJZ290byBuZXdfaW5vOworCX0K
KwkvKiBmb3JjZSBub3hpbm8/ICovCisKKyBvdXRfaXB1dDoKKwlpcHV0KGlub2RlKTsKKwlpbm9k
ZSA9IEVSUl9QVFIoZXJyKTsKKyBvdXQ6CisJQXVUcmFjZUVyclB0cihpbm9kZSk7CisJcmV0dXJu
IGlub2RlOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBhdV90ZXN0X3JvKHN0cnVj
dCBzdXBlcl9ibG9jayAqc2IsIGF1ZnNfYmluZGV4X3QgYmluZGV4LAorCSAgICAgICBzdHJ1Y3Qg
aW5vZGUgKmlub2RlKQoreworCWludCBlcnI7CisKKwllcnIgPSBhdV9icl9yZG9ubHkoYXVfc2Jy
KHNiLCBiaW5kZXgpKTsKKworCS8qIHBzZXVkby1saW5rIGFmdGVyIGZsdXNoZWQgbWF5IG91dCBv
ZiBib3VuZHMgKi8KKwlpZiAoIWVycgorCSAgICAmJiBpbm9kZQorCSAgICAmJiBhdV9pYnN0YXJ0
KGlub2RlKSA8PSBiaW5kZXgKKwkgICAgJiYgYmluZGV4IDw9IGF1X2liZW5kKGlub2RlKSkgewor
CQkvKgorCQkgKiBwZXJtaXNzaW9uIGNoZWNrIGlzIHVubmVjZXNzYXJ5IHNpbmNlIHZmc3ViIHJv
dXRpbmUKKwkJICogd2lsbCBiZSBjYWxsZWQgbGF0ZXIKKwkJICovCisJCXN0cnVjdCBpbm9kZSAq
aGkgPSBhdV9oX2lwdHIoaW5vZGUsIGJpbmRleCk7CisJCWlmIChoaSkKKwkJCWVyciA9IElTX0lN
TVVUQUJMRShoaSkgPyAtRVJPRlMgOiAwOworCX0KKworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1
cm4gZXJyOworfQorCitpbnQgYXVfdGVzdF9oX3Blcm0oc3RydWN0IGlub2RlICpoX2lub2RlLCBp
bnQgbWFzaywgaW50IGRsZ3QpCit7CisJaWYgKCFjdXJyZW50LT5mc3VpZCkKKwkJcmV0dXJuIDA7
CisJLy90b2RvOiBmYWtlIG5hbWVpZGF0YQorCXJldHVybiB2ZnN1Yl9wZXJtaXNzaW9uKGhfaW5v
ZGUsIG1hc2ssIE5VTEwsIGRsZ3QpOworfQorCitpbnQgYXVfdGVzdF9oX3Blcm1fc2lvKHN0cnVj
dCBpbm9kZSAqaF9pbm9kZSwgaW50IG1hc2ssIGludCBkbGd0KQoreworCWlmICh1bmxpa2VseShh
dV90ZXN0X25mcyhoX2lub2RlLT5pX3NiKQorCQkgICAgICYmIChtYXNrICYgTUFZX1dSSVRFKQor
CQkgICAgICYmIFNfSVNESVIoaF9pbm9kZS0+aV9tb2RlKSkpCisJCW1hc2sgfD0gTUFZX1JFQUQ7
IC8qIGZvcmNlIHBlcm1pc3Npb24gY2hlY2sgKi8KKwlyZXR1cm4gYXVfdGVzdF9oX3Blcm0oaF9p
bm9kZSwgbWFzaywgZGxndCk7Cit9CmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9y
aWcvZnMvYXVmcy9pbm9kZS5oIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9pbm9kZS5o
Ci0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9pbm9kZS5oCTE5NzAtMDEt
MDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9pbm9k
ZS5oCTIwMDgtMDUtMjUgMTE6NTY6MDggKzAzMDAKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dy
YW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
IG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAq
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBG
cmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGgg
Rmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qCisgKiBpbm9kZSBv
cGVyYXRpb25zCisgKgorICogJElkOiBpbm9kZS5oLHYgMS4yIDIwMDgvMDQvMjEgMDE6MzI6MDUg
c2Zqcm8gRXhwICQKKyAqLworCisjaWZuZGVmIF9fQVVGU19JTk9ERV9IX18KKyNkZWZpbmUgX19B
VUZTX0lOT0RFX0hfXworCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnMu
aD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+
CisjaW5jbHVkZSA8bGludXgvYXVmc190eXBlLmg+CisjaW5jbHVkZSAiaGlub2RlLmgiCisjaW5j
bHVkZSAibWlzYy5oIgorI2luY2x1ZGUgInN1cGVyLmgiCisKK3N0cnVjdCBhdV9oaW5vZGU7Citz
dHJ1Y3QgYXVfdmRpcjsKK3N0cnVjdCBhdV9paW5mbyB7CisJYXRvbWljX3QJCWlpX2dlbmVyYXRp
b247CisJc3RydWN0IHN1cGVyX2Jsb2NrCSppaV9oc2IxOwkvKiBubyBnZXQvcHV0ICovCisKKwlz
dHJ1Y3QgYXVfcndzZW0JCWlpX3J3c2VtOworCWF1ZnNfYmluZGV4X3QJCWlpX2JzdGFydCwgaWlf
YmVuZDsKKwlzdHJ1Y3QgYXVfaGlub2RlCSppaV9oaW5vZGU7CisJc3RydWN0IGF1X3ZkaXIJCSpp
aV92ZGlyOworfTsKKworc3RydWN0IGF1ZnNfaWNudG5yIHsKKwlzdHJ1Y3QgYXVfaWluZm8gaWlu
Zm87CisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
KworLyogaW5vZGUuYyAqLworaW50IGF1X3JlZnJlc2hfaGlub2RlX3NlbGYoc3RydWN0IGlub2Rl
ICppbm9kZSk7CitpbnQgYXVfcmVmcmVzaF9oaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3Ry
dWN0IGRlbnRyeSAqZGVudHJ5KTsKK3N0cnVjdCBpbm9kZSAqYXVfbmV3X2lub2RlKHN0cnVjdCBk
ZW50cnkgKmRlbnRyeSk7CitpbnQgYXVfdGVzdF9ybyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBh
dWZzX2JpbmRleF90IGJpbmRleCwKKwkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQg
YXVfdGVzdF9oX3Blcm0oc3RydWN0IGlub2RlICpoX2lub2RlLCBpbnQgbWFzaywgaW50IGRsZ3Qp
OworaW50IGF1X3Rlc3RfaF9wZXJtX3NpbyhzdHJ1Y3QgaW5vZGUgKmhfaW5vZGUsIGludCBtYXNr
LCBpbnQgZGxndCk7CisKKy8qIGlfb3AuYyAqLworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRp
b25zIGF1ZnNfaW9wLCBhdWZzX3N5bWxpbmtfaW9wLCBhdWZzX2Rpcl9pb3A7CisKKy8qIGF1X3dy
X2RpciBmbGFncyAqLworI2RlZmluZSBBdVdyRGlyX0FERF9FTlRSWQkxCisjZGVmaW5lIEF1V3JE
aXJfTE9DS19TUkNESVIJKDEgPDwgMSkKKyNkZWZpbmUgQXVXckRpcl9JU0RJUgkJKDEgPDwgMikK
KyNkZWZpbmUgYXVfZnRlc3Rfd3JkaXIoZmxhZ3MsIG5hbWUpCSgoZmxhZ3MpICYgQXVXckRpcl8j
I25hbWUpCisjZGVmaW5lIGF1X2ZzZXRfd3JkaXIoZmxhZ3MsIG5hbWUpCXsgKGZsYWdzKSB8PSBB
dVdyRGlyXyMjbmFtZTsgfQorI2RlZmluZSBhdV9mY2xyX3dyZGlyKGZsYWdzLCBuYW1lKQl7IChm
bGFncykgJj0gfkF1V3JEaXJfIyNuYW1lOyB9CisKK3N0cnVjdCBhdV93cl9kaXJfYXJncyB7CisJ
YXVmc19iaW5kZXhfdCBmb3JjZV9idGd0OworCXVuc2lnbmVkIGludCBmbGFnczsKK307CitpbnQg
YXVfd3JfZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGRlbnRyeSAqc3JjX2RlbnRy
eSwKKwkgICAgICBzdHJ1Y3QgYXVfd3JfZGlyX2FyZ3MgKmFyZ3MpOworCisvKiBpX29wX2FkZC5j
ICovCitzdHJ1Y3QgYXVfbmR4OworaW50IGF1X21heV9hZGQoc3RydWN0IGRlbnRyeSAqZGVudHJ5
LCBhdWZzX2JpbmRleF90IGJpbmRleCwKKwkgICAgICAgc3RydWN0IGRlbnRyeSAqaF9wYXJlbnQs
IGludCBpc2Rpciwgc3RydWN0IGF1X25keCAqbmR4KTsKK2ludCBhdWZzX21rbm9kKHN0cnVjdCBp
bm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBkZXZfdCBkZXYpOwor
aW50IGF1ZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5
LCBjb25zdCBjaGFyICpzeW1uYW1lKTsKK2ludCBhdWZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRp
ciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJc3RydWN0IG5hbWVpZGF0YSAq
bmQpOworaW50IGF1ZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpzcmNfZGVudHJ5LCBzdHJ1Y3QgaW5v
ZGUgKmRpciwKKwkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworaW50IGF1ZnNfbWtkaXIo
c3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpOworCisv
KiBpX29wX2RlbC5jICovCitpbnQgYXVfd3JfZGlyX25lZWRfd2goc3RydWN0IGRlbnRyeSAqZGVu
dHJ5LCBpbnQgaXNkaXIsIGF1ZnNfYmluZGV4X3QgKmJjcHVwLAorCQkgICAgICBzdHJ1Y3QgZGVu
dHJ5ICpsb2NrZWQpOworaW50IGF1X21heV9kZWwoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBhdWZz
X2JpbmRleF90IGJpbmRleCwKKwkgICAgICAgc3RydWN0IGRlbnRyeSAqaF9wYXJlbnQsIGludCBp
c2Rpciwgc3RydWN0IGF1X25keCAqbmR4KTsKK2ludCBhdWZzX3VubGluayhzdHJ1Y3QgaW5vZGUg
KmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK2ludCBhdWZzX3JtZGlyKHN0cnVjdCBpbm9k
ZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworCisvKiBpX29wX3Jlbi5jICovCitpbnQg
YXVfd2JyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBidGd0KTsKK2ludCBh
dWZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKnNyY19kaXIsIHN0cnVjdCBkZW50cnkgKnNyY19kZW50
cnksCisJCXN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworCisjaWZk
ZWYgQ09ORklHX0FVRlNfRExHVAorLyogZGxndC5jICovCitpbnQgYXVfc2VjdXJpdHlfaW5vZGVf
cGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmhfaW5vZGUsIGludCBtYXNrLAorCQkJCSBzdHJ1Y3Qg
bmFtZWlkYXRhICpmYWtlX25kLCBpbnQgZGxndCk7CisjZWxzZQorc3RhdGljIGlubGluZQoraW50
IGF1X3NlY3VyaXR5X2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICpoX2lub2RlLCBpbnQg
bWFzaywKKwkJCQkgc3RydWN0IG5hbWVpZGF0YSAqZmFrZV9uZCwgaW50IGRsZ3QpCit7CisJcmV0
dXJuIHNlY3VyaXR5X2lub2RlX3Blcm1pc3Npb24oaF9pbm9kZSwgbWFzaywgZmFrZV9uZCk7Cit9
CisjZW5kaWYgLyogQ09ORklHX0FVRlNfRExHVCAqLworCisjaWZkZWYgQ09ORklHX0FVRlNfV09S
S0FST1VORF9GVVNFCisvKiBicl9mdXNlLmMgKi8KK2ludCBhdWZzX2dldGF0dHIoc3RydWN0IHZm
c21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdCk7Cisj
ZW5kaWYKKworLyogaWluZm8uYyAqLworc3RydWN0IGF1X2lpbmZvICphdV9paShzdHJ1Y3QgaW5v
ZGUgKmlub2RlKTsKK3N0cnVjdCBpbm9kZSAqYXVfaF9pcHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUs
IGF1ZnNfYmluZGV4X3QgYmluZGV4KTsKK2F1ZnNfYmluZGV4X3QgYXVfaWlfYnJfaWQoc3RydWN0
IGlub2RlICppbm9kZSwgYXVmc19iaW5kZXhfdCBiaW5kZXgpOworCit2b2lkIGF1X3NldF9pYnN0
YXJ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGF1ZnNfYmluZGV4X3QgYmluZGV4KTsKK3ZvaWQgYXVf
c2V0X2hpX3doKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGF1ZnNfYmluZGV4X3QgYmluZGV4LAorCQkg
IHN0cnVjdCBkZW50cnkgKmhfd2gpOwordW5zaWduZWQgaW50IGF1X2hpX2ZsYWdzKHN0cnVjdCBp
bm9kZSAqaW5vZGUsIGludCBpc2Rpcik7CisKKy8qIGhpbm9kZSBmbGFncyAqLworI2RlZmluZSBB
dUhpX1hJTk8JMQorI2RlZmluZSBBdUhpX05PVElGWQkoMSA8PCAxKQorI2RlZmluZSBhdV9mdGVz
dF9oaShmbGFncywgbmFtZSkJKChmbGFncykgJiBBdUhpXyMjbmFtZSkKKyNkZWZpbmUgYXVfZnNl
dF9oaShmbGFncywgbmFtZSkJCXsgKGZsYWdzKSB8PSBBdUhpXyMjbmFtZTsgfQorI2RlZmluZSBh
dV9mY2xyX2hpKGZsYWdzLCBuYW1lKQkJeyAoZmxhZ3MpICY9IH5BdUhpXyMjbmFtZTsgfQorI2lm
bmRlZiBDT05GSUdfQVVGU19ISU5PVElGWQorI3VuZGVmIEF1SGlfTk9USUZZCisjZGVmaW5lIEF1
SGlfTk9USUZZCTAKKyNlbmRpZgorCit2b2lkIGF1X3NldF9oX2lwdHIoc3RydWN0IGlub2RlICpp
bm9kZSwgYXVmc19iaW5kZXhfdCBiaW5kZXgsCisJCSAgIHN0cnVjdCBpbm9kZSAqaF9pbm9kZSwg
dW5zaWduZWQgaW50IGZsYWdzKTsKKwordm9pZCBhdV91cGRhdGVfaWlnZW4oc3RydWN0IGlub2Rl
ICppbm9kZSk7Cit2b2lkIGF1X3VwZGF0ZV9icmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgaW50
IGRvX3B1dF96ZXJvKTsKKworaW50IGF1X2lpbmZvX2luaXQoc3RydWN0IGlub2RlICppbm9kZSk7
Cit2b2lkIGF1X2lpbmZvX2ZpbihzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyogcGxpbmsuYyAq
LworI2lmZGVmIENPTkZJR19BVUZTX0RFQlVHCit2b2lkIGF1X3BsaW5rX2xpc3Qoc3RydWN0IHN1
cGVyX2Jsb2NrICpzYik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGF1X3BsaW5rX2xpc3Qo
c3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwkvKiBub3RoaW5nICovCit9CisjZW5kaWYKK2lu
dCBhdV9wbGlua190ZXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqaW5v
ZGUpOworc3RydWN0IGRlbnRyeSAqYXVfcGxpbmtfbGt1cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi
LCBhdWZzX2JpbmRleF90IGJpbmRleCwKKwkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSk7Cit2
b2lkIGF1X3BsaW5rX2FwcGVuZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUg
Kmlub2RlLAorCQkgICAgIHN0cnVjdCBkZW50cnkgKmhfZGVudHJ5LCBhdWZzX2JpbmRleF90IGJp
bmRleCk7Cit2b2lkIGF1X3BsaW5rX3B1dChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3ZvaWQg
YXVfcGxpbmtfaGFsZl9yZWZyZXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGF1ZnNfYmluZGV4
X3QgYnJfaWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGxvY2sgc3ViY2xhc3MgZm9y
IGlpbmZvICovCitlbnVtIHsKKwlBdUxzY19JSV9DSElMRCwJCS8qIGNoaWxkIGZpcnN0ICovCisJ
QXVMc2NfSUlfQ0hJTEQyLAkvKiByZW5hbWUoMiksIGxpbmsoMiksIGFuZCBjcHVwIGF0IGhpbm90
aWZ5ICovCisJQXVMc2NfSUlfQ0hJTEQzLAkvKiBjb3B5dXAgZGlycyAqLworCUF1THNjX0lJX1BB
UkVOVCwKKwlBdUxzY19JSV9QQVJFTlQyLAorCUF1THNjX0lJX1BBUkVOVDMsCisJQXVMc2NfSUlf
UEFSRU5UNCwKKwlBdUxzY19JSV9ORVcJCS8qIG5ldyBpbm9kZSAqLworfTsKKworLyoKKyAqIGlp
X3JlYWRfbG9ja19jaGlsZCwgaWlfd3JpdGVfbG9ja19jaGlsZCwKKyAqIGlpX3JlYWRfbG9ja19j
aGlsZDIsIGlpX3dyaXRlX2xvY2tfY2hpbGQyLAorICogaWlfcmVhZF9sb2NrX2NoaWxkMywgaWlf
d3JpdGVfbG9ja19jaGlsZDMsCisgKiBpaV9yZWFkX2xvY2tfcGFyZW50LCBpaV93cml0ZV9sb2Nr
X3BhcmVudCwKKyAqIGlpX3JlYWRfbG9ja19wYXJlbnQyLCBpaV93cml0ZV9sb2NrX3BhcmVudDIs
CisgKiBpaV9yZWFkX2xvY2tfcGFyZW50MywgaWlfd3JpdGVfbG9ja19wYXJlbnQzLAorICogaWlf
cmVhZF9sb2NrX3BhcmVudDQsIGlpX3dyaXRlX2xvY2tfcGFyZW50NCwKKyAqIGlpX3JlYWRfbG9j
a19uZXcsIGlpX3dyaXRlX2xvY2tfbmV3CisgKi8KKyNkZWZpbmUgQXVSZWFkTG9ja0Z1bmMobmFt
ZSwgbHNjKSBcCitzdGF0aWMgaW5saW5lIHZvaWQgaWlfcmVhZF9sb2NrXyMjbmFtZShzdHJ1Y3Qg
aW5vZGUgKmkpIFwKK3sgYXVfcndfcmVhZF9sb2NrX25lc3RlZCgmYXVfaWkoaSktPmlpX3J3c2Vt
LCBBdUxzY19JSV8jI2xzYyk7IH0KKworI2RlZmluZSBBdVdyaXRlTG9ja0Z1bmMobmFtZSwgbHNj
KSBcCitzdGF0aWMgaW5saW5lIHZvaWQgaWlfd3JpdGVfbG9ja18jI25hbWUoc3RydWN0IGlub2Rl
ICppKSBcCit7IGF1X3J3X3dyaXRlX2xvY2tfbmVzdGVkKCZhdV9paShpKS0+aWlfcndzZW0sIEF1
THNjX0lJXyMjbHNjKTsgfQorCisjZGVmaW5lIEF1UldMb2NrRnVuY3MobmFtZSwgbHNjKSBcCisJ
QXVSZWFkTG9ja0Z1bmMobmFtZSwgbHNjKSBcCisJQXVXcml0ZUxvY2tGdW5jKG5hbWUsIGxzYykK
KworQXVSV0xvY2tGdW5jcyhjaGlsZCwgQ0hJTEQpOworQXVSV0xvY2tGdW5jcyhjaGlsZDIsIENI
SUxEMik7CitBdVJXTG9ja0Z1bmNzKGNoaWxkMywgQ0hJTEQzKTsKK0F1UldMb2NrRnVuY3MocGFy
ZW50LCBQQVJFTlQpOworQXVSV0xvY2tGdW5jcyhwYXJlbnQyLCBQQVJFTlQyKTsKK0F1UldMb2Nr
RnVuY3MocGFyZW50MywgUEFSRU5UMyk7CitBdVJXTG9ja0Z1bmNzKHBhcmVudDQsIFBBUkVOVDQp
OworQXVSV0xvY2tGdW5jcyhuZXcsIE5FVyk7CisKKyN1bmRlZiBBdVJlYWRMb2NrRnVuYworI3Vu
ZGVmIEF1V3JpdGVMb2NrRnVuYworI3VuZGVmIEF1UldMb2NrRnVuY3MKKworLyoKKyAqIGlpX3Jl
YWRfdW5sb2NrLCBpaV93cml0ZV91bmxvY2ssIGlpX2Rvd25ncmFkZV9sb2NrCisgKi8KK0F1U2lt
cGxlVW5sb2NrUndzZW1GdW5jcyhpaSwgc3RydWN0IGlub2RlICppLCBhdV9paShpKS0+aWlfcndz
ZW0pOworCisvKiB0byBkZWJ1ZyBlYXNpZXIsIGRvIG5vdCBtYWtlIHRoZW0gaW5saW5lZCBmdW5j
dGlvbnMgKi8KKyNkZWZpbmUgSWlNdXN0UmVhZExvY2soaSkgZG8geyBcCisJU2lNdXN0QW55TG9j
aygoaSktPmlfc2IpOyBcCisJQXVSd011c3RSZWFkTG9jaygmYXVfaWkoaSktPmlpX3J3c2VtKTsg
XAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBJaU11c3RXcml0ZUxvY2soaSkgZG8geyBcCisJU2lN
dXN0QW55TG9jaygoaSktPmlfc2IpOyBcCisJQXVSd011c3RXcml0ZUxvY2soJmF1X2lpKGkpLT5p
aV9yd3NlbSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSWlNdXN0QW55TG9jayhpKSBkbyB7
IFwKKwlTaU11c3RBbnlMb2NrKChpKS0+aV9zYik7IFwKKwlBdVJ3TXVzdEFueUxvY2soJmF1X2lp
KGkpLT5paV9yd3NlbSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSWlNdXN0Tm9XYWl0ZXJz
KGkpCUF1UndNdXN0Tm9XYWl0ZXJzKCZhdV9paShpKS0+aWlfcndzZW0pCisKKy8qIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gKi8KKworc3RhdGljIGlubGluZSBhdWZzX2JpbmRleF90IGF1X2lic3RhcnQoc3RydWN0
IGlub2RlICppbm9kZSkKK3sKKwlJaU11c3RBbnlMb2NrKGlub2RlKTsKKwlyZXR1cm4gYXVfaWko
aW5vZGUpLT5paV9ic3RhcnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYXVmc19iaW5kZXhfdCBhdV9p
YmVuZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCUlpTXVzdEFueUxvY2soaW5vZGUpOworCXJl
dHVybiBhdV9paShpbm9kZSktPmlpX2JlbmQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF1
X3ZkaXIgKmF1X2l2ZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJSWlNdXN0QW55TG9jayhp
bm9kZSk7CisJQXVEZWJ1Z09uKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKTsKKwlyZXR1cm4gYXVf
aWkoaW5vZGUpLT5paV92ZGlyOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZW50cnkgKmF1
X2hpX3doKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGF1ZnNfYmluZGV4X3QgYmluZGV4KQoreworCXN0
cnVjdCBhdV9oaW5vZGUgKmhpbm9kZTsKKwlJaU11c3RBbnlMb2NrKGlub2RlKTsKKwloaW5vZGUg
PSBhdV9paShpbm9kZSktPmlpX2hpbm9kZSArIGJpbmRleDsKKwlyZXR1cm4gaGlub2RlLT5oaV93
aGRlbnRyeTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF1X3NldF9pYmVuZChzdHJ1Y3QgaW5v
ZGUgKmlub2RlLCBhdWZzX2JpbmRleF90IGJpbmRleCkKK3sKKwlJaU11c3RXcml0ZUxvY2soaW5v
ZGUpOworCUF1RGVidWdPbihhdV9zYmVuZChpbm9kZS0+aV9zYikgPCBiaW5kZXggfHwgYmluZGV4
IDwgYXVfaWJzdGFydChpbm9kZSkpOworCWF1X2lpKGlub2RlKS0+aWlfYmVuZCA9IGJpbmRleDsK
K30KKworc3RhdGljIGlubGluZSB2b2lkIGF1X3NldF9pdmRpcihzdHJ1Y3QgaW5vZGUgKmlub2Rl
LCBzdHJ1Y3QgYXVfdmRpciAqdmRpcikKK3sKKwlJaU11c3RXcml0ZUxvY2soaW5vZGUpOworCUF1
RGVidWdPbighU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCAoYXVfaWkoaW5vZGUpLT5paV92ZGly
ICYmIHZkaXIpKTsKKwlhdV9paShpbm9kZSktPmlpX3ZkaXIgPSB2ZGlyOworfQorCitzdGF0aWMg
aW5saW5lIHZvaWQgYXVfaGlwdXQoc3RydWN0IGF1X2hpbm9kZSAqaGlub2RlKQoreworCWF1X2hp
bl9mcmVlKGhpbm9kZSk7CisJZHB1dChoaW5vZGUtPmhpX3doZGVudHJ5KTsKKwlpcHV0KGhpbm9k
ZS0+aGlfaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdV9oaW5vZGUgKmF1X2hp
KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGF1ZnNfYmluZGV4X3QgYmluZGV4KQoreworCS8vdG9kbzog
dGhpcyBsb2NrIGNoZWNrIGNhdXNlcyBzb21lIHVubmVjZXNzYXJ5IGxvY2tzIGluIGNhbGxlcnMu
CisJSWlNdXN0QW55TG9jayhpbm9kZSk7CisJcmV0dXJuIGF1X2lpKGlub2RlKS0+aWlfaGlub2Rl
ICsgYmluZGV4OworfQorCisvKiB0aW55IHRlc3QgZm9yIGlub2RlIG51bWJlciAqLworLyogdG1w
ZnMgZ2VuZXJhdGlvbiBpcyB0b28gcm91Z2ggKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF1X3Rlc3Rf
aGlnZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpoX2lub2RlKQoreworCUlp
TXVzdEFueUxvY2soaW5vZGUpOworCXJldHVybiAhKGF1X2lpKGlub2RlKS0+aWlfaHNiMSA9PSBo
X2lub2RlLT5pX3NiCisJCSAmJiBpbm9kZS0+aV9nZW5lcmF0aW9uID09IGhfaW5vZGUtPmlfZ2Vu
ZXJhdGlvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYXVfZ2VuX3QgYXVfaWlnZW4oc3RydWN0IGlu
b2RlICppbm9kZSkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJmF1X2lpKGlub2RlKS0+aWlfZ2Vu
ZXJhdGlvbik7Cit9CisKKyNpZmRlZiBDT05GSUdfQVVGU19ISU5PVElGWQorc3RhdGljIGlubGlu
ZSBhdV9nZW5fdCBhdV9paWdlbl9kZWMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwkvL0F1RGJn
KCJpJWx1XG4iLCBpbm9kZS0+aV9pbm8pOworCXJldHVybiBhdG9taWNfZGVjX3JldHVybigmYXVf
aWkoaW5vZGUpLT5paV9nZW5lcmF0aW9uKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19LRVJO
RUxfXyAqLworI2VuZGlmIC8qIF9fQVVGU19JTk9ERV9IX18gKi8KZGlmZiAtdXJOIGxpbnV4LTIu
Ni4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL2lfb3BfYWRkLmMgbGludXgtMi42LjI1LjQtdW5p
b25mcy9mcy9hdWZzL2lfb3BfYWRkLmMKLS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9m
cy9hdWZzL2lfb3BfYWRkLmMJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42
LjI1LjQtdW5pb25mcy9mcy9hdWZzL2lfb3BfYWRkLmMJMjAwOC0wNS0yNSAxMTo1NjowOCArMDMw
MApAQCAtMCwwICsxLDc3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IEp1bmpp
cm8gT2thamltYQorICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHBy
b2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24s
IEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMw
MSAgVVNBCisgKi8KKworLyoKKyAqIGlub2RlIG9wZXJhdGlvbnMgKGFkZCBlbnRyeSkKKyAqCisg
KiAkSWQ6IGlfb3BfYWRkLmMsdiAxLjQgMjAwOC8wNS8wNCAyMzo1NDo1MyBzZmpybyBFeHAgJAor
ICovCisKKyNpbmNsdWRlICJhdWZzLmgiCisKKy8qCisgKiBmaW5hbCBwcm9jZWR1cmUgb2YgYWRk
aW5nIGEgbmV3IGVudHJ5LCBleGNlcHQgbGluaygyKS4KKyAqIHJlbW92ZSB3aGl0ZW91dCwgaW5z
dGFudGlhdGUsIGNvcHl1cCB0aGUgcGFyZW50IGRpcidzIHRpbWVzIGFuZCBzaXplCisgKiBhbmQg
dXBkYXRlIHZlcnNpb24uCisgKiBpZiBpdCBmYWlsZWQsIHJlLWNyZWF0ZSB0aGUgcmVtb3ZlZCB3
aGl0ZW91dC4KKyAqLworc3RhdGljIGludCBlcGlsb2coc3RydWN0IGlub2RlICpkaXIsIHN0cnVj
dCBkZW50cnkgKndoX2RlbnRyeSwKKwkJICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50
IGVyciwgcmVycjsKKwlhdWZzX2JpbmRleF90IGJ3aDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAq
aF9kaXI7CisJc3RydWN0IGRlbnRyeSAqd2g7CisJc3RydWN0IGF1X25keCBuZHg7CisJc3RydWN0
IHN1cGVyX2Jsb2NrICpzYjsKKworCUxLVFJUcmFjZSgid2ggJXAsICUuKnNcbiIsIHdoX2RlbnRy
eSwgQXVETE5QYWlyKGRlbnRyeSkpOworCisJYndoID0gLTE7CisJaWYgKHdoX2RlbnRyeSkgewor
CQloX2RpciA9IHdoX2RlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7IC8qIGRpciBpbm9kZSBpcyBs
b2NrZWQgKi8KKwkJSU11c3RMb2NrKGhfZGlyKTsKKwkJYndoID0gYXVfZGJ3aChkZW50cnkpOwor
CQllcnIgPSBhdV93aF91bmxpbmtfZGVudHJ5KGhfZGlyLCB3aF9kZW50cnksIGRlbnRyeSwgZGly
LAorCQkJCQkgIC8qZGxndCovMCk7CisJCS8vZXJyID0gLTE7CisJCWlmICh1bmxpa2VseShlcnIp
KQorCQkJZ290byBvdXQ7CisJfQorCisJaW5vZGUgPSBhdV9uZXdfaW5vZGUoZGVudHJ5KTsKKwkv
L2lub2RlID0gRVJSX1BUUigtMSk7CisJaWYgKCFJU19FUlIoaW5vZGUpKSB7CisJCWRfaW5zdGFu
dGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCWRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7
IC8qIGRpciBpbm9kZSBpcyBsb2NrZWQgKi8KKwkJSU11c3RMb2NrKGRpcik7CisJCS8qIG9yIGFs
d2F5cyBjcHVwIGRpciBtdGltZT8gKi8KKwkJaWYgKGF1X2lic3RhcnQoZGlyKSA9PSBhdV9kYnN0
YXJ0KGRlbnRyeSkpCisJCQlhdV9jcHVwX2F0dHJfdGltZXNpemVzKGRpcik7CisJCWRpci0+aV92
ZXJzaW9uKys7CisJCXJldHVybiAwOyAvKiBzdWNjZXNzICovCisJfQorCisJZXJyID0gUFRSX0VS
Uihpbm9kZSk7CisJaWYgKCF3aF9kZW50cnkpCisJCWdvdG8gb3V0OworCisJLyogcmV2ZXJ0ICov
CisJc2IgPSBkZW50cnktPmRfc2I7CisJbmR4LmZsYWdzID0gMDsKKwlpZiAodW5saWtlbHkoYXVf
b3B0X3Rlc3RfZGxndChhdV9tbnRmbGFncyhzYikpKSkKKwkJYXVfZnNldF9uZHgobmR4LmZsYWdz
LCBETEdUKTsKKwluZHgubmZzbW50ID0gYXVfbmZzbW50KHNiLCBid2gpOworCW5keC5uZCA9IE5V
TEw7CisJLy9uZHguYnIgPSBOVUxMOworCS8qIGRpciBpbm9kZSBpcyBsb2NrZWQgKi8KKwl3aCA9
IGF1X3doX2NyZWF0ZShkaXIsIGRlbnRyeSwgYndoLCB3aF9kZW50cnktPmRfcGFyZW50LCAmbmR4
KTsKKwkvL3doID0gRVJSX1BUUigtMSk7CisJcmVyciA9IFBUUl9FUlIod2gpOworCWlmICghSVNf
RVJSKHdoKSkgeworCQlkcHV0KHdoKTsKKwkJZ290byBvdXQ7CisJfQorCUF1SU9FcnIoIiUuKnMg
cmV2ZXJ0aW5nIHdoaXRlb3V0IGZhaWxlZCglZCwgJWQpXG4iLAorCQlBdURMTlBhaXIoZGVudHJ5
KSwgZXJyLCByZXJyKTsKKwllcnIgPSAtRUlPOworCisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsK
KwlyZXR1cm4gZXJyOworfQorCisvKgorICogc2ltcGxlIHRlc3RzIGZvciB0aGUgYWRkaW5nIGlu
b2RlIG9wZXJhdGlvbnMuCisgKiBmb2xsb3dpbmcgdGhlIGNoZWNrcyBpbiB2ZnMsIHBsdXMgdGhl
IHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAuCisgKi8KK2ludCBhdV9tYXlfYWRkKHN0cnVjdCBk
ZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBiaW5kZXgsCisJICAgICAgIHN0cnVjdCBkZW50
cnkgKmhfcGFyZW50LCBpbnQgaXNkaXIsIHN0cnVjdCBhdV9uZHggKm5keCkKK3sKKwlpbnQgZXJy
LCBleGlzdDsKKwlzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmhfaW5v
ZGU7CisJdW1vZGVfdCBoX21vZGU7CisKKwlMS1RSVHJhY2UoIiUuKnMvJS4qcywgYiVkLCBkaXIg
JWRcbiIsCisJCSAgQXVETE5QYWlyKGhfcGFyZW50KSwgQXVETE5QYWlyKGRlbnRyeSksIGJpbmRl
eCwgaXNkaXIpOworCisJZXhpc3QgPSAhIWRlbnRyeS0+ZF9pbm9kZTsKKwloX2RlbnRyeSA9IGF1
X2hfZHB0cihkZW50cnksIGJpbmRleCk7CisJaF9pbm9kZSA9IGhfZGVudHJ5LT5kX2lub2RlOwor
CWlmICghZXhpc3QpIHsKKwkJZXJyID0gLUVFWElTVDsKKwkJaWYgKHVubGlrZWx5KGhfaW5vZGUp
KQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJLyogcmVuYW1lKDIpIGNhc2UgKi8KKwkJZXJy
ID0gLUVJTzsKKwkJaWYgKHVubGlrZWx5KCFoX2lub2RlIHx8ICFoX2lub2RlLT5pX25saW5rKSkK
KwkJCWdvdG8gb3V0OworCisJCWhfbW9kZSA9IGhfaW5vZGUtPmlfbW9kZTsKKwkJaWYgKCFpc2Rp
cikgeworCQkJZXJyID0gLUVJU0RJUjsKKwkJCWlmICh1bmxpa2VseShTX0lTRElSKGhfbW9kZSkp
KQorCQkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYgKHVubGlrZWx5KCFTX0lTRElSKGhfbW9kZSkp
KSB7CisJCQllcnIgPSAtRU5PVERJUjsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZXJyID0g
LUVJTzsKKwkvKiBleHBlY3RlZCBwYXJlbnQgZGlyIGlzIGxvY2tlZCAqLworCWlmICh1bmxpa2Vs
eShoX3BhcmVudCAhPSBoX2RlbnRyeS0+ZF9wYXJlbnQpKQorCQlnb3RvIG91dDsKKwllcnIgPSAw
OworCisJaWYgKHVubGlrZWx5KGF1X29wdF90ZXN0KGF1X21udGZsYWdzKGRlbnRyeS0+ZF9zYiks
IFVEQkFfSU5PVElGWSkpKSB7CisJCXN0cnVjdCBkZW50cnkgKmhfbGF0ZXN0OworCQlzdHJ1Y3Qg
cXN0ciAqcXN0ciA9ICZkZW50cnktPmRfbmFtZTsKKworCQllcnIgPSAtRUFDQ0VTOworCQlpZiAo
dW5saWtlbHkoYXVfdGVzdF9oX3Blcm0KKwkJCSAgICAgKGhfcGFyZW50LT5kX2lub2RlLCBNQVlf
RVhFQyB8IE1BWV9XUklURSwKKwkJCSAgICAgIGF1X2Z0ZXN0X25keChuZHgtPmZsYWdzLCBETEdU
KSkpKQorCQkJZ290byBvdXQ7CisKKwkJZXJyID0gLUVJTzsKKwkJaF9sYXRlc3QgPSBhdV9zaW9f
bGt1cF9vbmUocXN0ci0+bmFtZSwgaF9wYXJlbnQsIHFzdHItPmxlbiwKKwkJCQkJICAgbmR4KTsK
KwkJZXJyID0gUFRSX0VSUihoX2xhdGVzdCk7CisJCWlmIChJU19FUlIoaF9sYXRlc3QpKQorCQkJ
Z290byBvdXQ7CisJCWVyciA9IC1FSU87CisJCWRwdXQoaF9sYXRlc3QpOworCQlpZiAoaF9sYXRl
c3QgPT0gaF9kZW50cnkpCisJCQllcnIgPSAwOworCX0KKworIG91dDoKKwlBdVRyYWNlRXJyKGVy
cik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGluaXRpYWwgcHJvY2VkdXJlIG9mIGFkZGlu
ZyBhIG5ldyBlbnRyeS4KKyAqIHByZXBhcmUgd3JpdGFibGUgYnJhbmNoIGFuZCB0aGUgcGFyZW50
IGRpciwgbG9jayBpdCwKKyAqIGxvb2t1cCB3aGl0ZW91dCBmb3IgdGhlIG5ldyBlbnRyeS4KKyAq
Lworc3RhdGljIHN0cnVjdCBkZW50cnkgKgorbG9ja19oZGlyX2xrdXBfd2goc3RydWN0IGRlbnRy
eSAqZGVudHJ5LCBzdHJ1Y3QgYXVfZHRpbWUgKmR0LAorCQkgIHN0cnVjdCBkZW50cnkgKnNyY19k
ZW50cnksIHN0cnVjdCBhdV93cl9kaXJfYXJncyAqd3JfZGlyX2FyZ3MpCit7CisJc3RydWN0IGRl
bnRyeSAqd2hfZGVudHJ5LCAqcGFyZW50LCAqaF9wYXJlbnQsICpncGFyZW50OworCWludCBlcnI7
CisJYXVmc19iaW5kZXhfdCBic3RhcnQsIGJjcHVwOworCXN0cnVjdCBpbm9kZSAqZGlyLCAqaF9k
aXIsICpnZGlyOworCXN0cnVjdCBhdV9uZHggbmR4OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7
CisJc3RydWN0IGF1X2hpbm9kZSAqaGdkaXI7CisJdW5zaWduZWQgaW50IG1udF9mbGFnczsKKwor
CUxLVFJUcmFjZSgiJS4qcywgc3JjICVwXG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgc3JjX2RlbnRy
eSk7CisKKwlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OyAvKiBkaXIgaW5vZGUgaXMgbG9ja2Vk
ICovCisJSU11c3RMb2NrKHBhcmVudC0+ZF9pbm9kZSk7CisJYnN0YXJ0ID0gYXVfZGJzdGFydChk
ZW50cnkpOworCWVyciA9IGF1X3dyX2RpcihkZW50cnksIHNyY19kZW50cnksIHdyX2Rpcl9hcmdz
KTsKKwliY3B1cCA9IGVycjsKKwkvL2VyciA9IC0xOworCXdoX2RlbnRyeSA9IEVSUl9QVFIoZXJy
KTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCWdvdG8gb3V0OworCisJc2IgPSBwYXJlbnQt
PmRfc2I7CisJbW50X2ZsYWdzID0gYXVfbW50ZmxhZ3Moc2IpOworCS8vdG9kbzogbWVhbmluZ2xl
c3MgbG9jayBpZiBDT05GSUdfQVVGU19ERUJVRyBpcyBkaXNhYmxlZC4KKwloZ2RpciA9IE5VTEw7
CisJaWYgKHVubGlrZWx5KGR0ICYmIGF1X29wdF90ZXN0KG1udF9mbGFncywgVURCQV9JTk9USUZZ
KQorCQkgICAgICYmICFJU19ST09UKHBhcmVudCkpKSB7CisJCWdwYXJlbnQgPSBkZ2V0X3BhcmVu
dChwYXJlbnQpOworCQlnZGlyID0gZ3BhcmVudC0+ZF9pbm9kZTsKKwkJaWlfcmVhZF9sb2NrX3Bh
cmVudDIoZ2Rpcik7CisJCWhnZGlyID0gYXVfaGkoZ2RpciwgYmNwdXApOworCQlpaV9yZWFkX3Vu
bG9jayhnZGlyKTsKKwkJZHB1dChncGFyZW50KTsKKwl9CisJZGlyID0gcGFyZW50LT5kX2lub2Rl
OworCWhfcGFyZW50ID0gYXVfaF9kcHRyKHBhcmVudCwgYmNwdXApOworCWhfZGlyID0gaF9wYXJl
bnQtPmRfaW5vZGU7CisKKwlBdURiZ1NsZWVwX1VkYmFSYWNlKCk7CisJYXVfaGRpcl9sb2NrKGhf
ZGlyLCBkaXIsIGJjcHVwKTsKKwkvL3RvZG86IHJldmFsaWRhdGUgdGhlIGxvd2VyIGRlbnRyeT8K
KworCW5keC5uZnNtbnQgPSBhdV9uZnNtbnQoc2IsIGJjcHVwKTsKKwluZHguZmxhZ3MgPSAwOwor
CWlmICh1bmxpa2VseShhdV9vcHRfdGVzdF9kbGd0KG1udF9mbGFncykpKQorCQlhdV9mc2V0X25k
eChuZHguZmxhZ3MsIERMR1QpOworCW5keC5uZCA9IE5VTEw7CisJLy9uZHguYnIgPSBOVUxMOwor
CS8vbmR4Lm5kX2ZpbGUgPSBOVUxMOworCisJaWYgKCFhdV9vcHRfdGVzdChtbnRfZmxhZ3MsIFVE
QkFfTk9ORSkgJiYgYXVfZGJzdGFydChkZW50cnkpID09IGJjcHVwKSB7CisJCXN0cnVjdCBuYW1l
aWRhdGEgbmQ7CisKKwkJaWYgKHVubGlrZWx5KG5keC5uZnNtbnQpKSB7CisJCQkvL3RvZG86IGRp
cnR5CisJCQluZHgubmQgPSAmbmQ7CisJCQluZHguYnIgPSBhdV9zYnIoc2IsIGJjcHVwKTsKKwkJ
CW1lbXNldCgmbmQsIDAsIHNpemVvZihuZCkpOworCQkJbmQuZmxhZ3MgPSBMT09LVVBfQ1JFQVRF
OworCQkJbmQuaW50ZW50Lm9wZW4uZmxhZ3MgPSBPX0VYQ0w7CisJCX0KKwkJZXJyID0gYXVfbWF5
X2FkZChkZW50cnksIGJjcHVwLCBoX3BhcmVudCwKKwkJCQkgYXVfZnRlc3Rfd3JkaXIod3JfZGly
X2FyZ3MtPmZsYWdzLCBJU0RJUiksCisJCQkJICZuZHgpOworCQl3aF9kZW50cnkgPSBFUlJfUFRS
KGVycik7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJZ290byBvdXRfZGlyOworCQluZHgubmQg
PSBOVUxMOworCQluZHguYnIgPSBOVUxMOworCX0KKworCWlmIChkdCkKKwkJYXVfZHRpbWVfc3Rv
cmUoZHQsIHBhcmVudCwgaF9wYXJlbnQsIGhnZGlyKTsKKwl3aF9kZW50cnkgPSBOVUxMOworCWlm
ICgvKiBiY3B1cCAhPSBic3RhcnQgfHwgKi8gYmNwdXAgIT0gYXVfZGJ3aChkZW50cnkpKQorCQln
b3RvIG91dDsgLyogc3VjY2VzcyAqLworCisJd2hfZGVudHJ5ID0gYXVfd2hfbGt1cChoX3BhcmVu
dCwgJmRlbnRyeS0+ZF9uYW1lLCAmbmR4KTsKKwkvL3doX2RlbnRyeSA9IEVSUl9QVFIoLTEpOwor
Cisgb3V0X2RpcjoKKwlpZiAoSVNfRVJSKHdoX2RlbnRyeSkpCisJCWF1X2hkaXJfdW5sb2NrKGhf
ZGlyLCBkaXIsIGJjcHVwKTsKKyBvdXQ6CisJQXVUcmFjZUVyclB0cih3aF9kZW50cnkpOworCXJl
dHVybiB3aF9kZW50cnk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSB7IE1rbm9k
LCBTeW1saW5rLCBDcmVhdCB9Oworc3RydWN0IHNpbXBsZV9hcmcgeworCWludCB0eXBlOworCXVu
aW9uIHsKKwkJc3RydWN0IHsKKwkJCWludCBtb2RlOworCQkJc3RydWN0IG5hbWVpZGF0YSAqbmQ7
CisJCX0gYzsKKwkJc3RydWN0IHsKKwkJCWNvbnN0IGNoYXIgKnN5bW5hbWU7CisJCX0gczsKKwkJ
c3RydWN0IHsKKwkJCWludCBtb2RlOworCQkJZGV2X3QgZGV2OworCQl9IG07CisJfSB1OworfTsK
Kworc3RhdGljIGludCBhZGRfc2ltcGxlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5
ICpkZW50cnksCisJCSAgICAgIHN0cnVjdCBzaW1wbGVfYXJnICphcmcpCit7CisJaW50IGVyciwg
ZGxndCwgY3JlYXRlZDsKKwlzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeSwgKmhfcGFyZW50LCAqd2hf
ZGVudHJ5LCAqcGFyZW50OworCXN0cnVjdCBpbm9kZSAqaF9kaXI7CisJc3RydWN0IGF1X2R0aW1l
IGR0OworCXN0cnVjdCB2ZnN1Yl9hcmdzIHZhcmdzOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7
CisJYXVmc19iaW5kZXhfdCBic3RhcnQ7CisJc3RydWN0IGF1X3dyX2Rpcl9hcmdzIHdyX2Rpcl9h
cmdzID0geworCQkuZm9yY2VfYnRndAk9IC0xLAorCQkuZmxhZ3MJCT0gQXVXckRpcl9BRERfRU5U
UlkKKwl9OworCisJTEtUUlRyYWNlKCJ0eXBlICVkLCAlLipzXG4iLCBhcmctPnR5cGUsIEF1RExO
UGFpcihkZW50cnkpKTsKKwlJTXVzdExvY2soZGlyKTsKKworCWF1ZnNfcmVhZF9sb2NrKGRlbnRy
eSwgQXVMb2NrX0RXKTsKKwlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OyAvKiBkaXIgaW5vZGUg
aXMgbG9ja2VkICovCisJZGlfd3JpdGVfbG9ja19wYXJlbnQocGFyZW50KTsKKwl3aF9kZW50cnkg
PSBsb2NrX2hkaXJfbGt1cF93aChkZW50cnksICZkdCwgLypzcmNfZGVudHJ5Ki9OVUxMLAorCQkJ
CSAgICAgICZ3cl9kaXJfYXJncyk7CisJLy93aF9kZW50cnkgPSBFUlJfUFRSKC0xKTsKKwllcnIg
PSBQVFJfRVJSKHdoX2RlbnRyeSk7CisJaWYgKElTX0VSUih3aF9kZW50cnkpKQorCQlnb3RvIG91
dDsKKworCWJzdGFydCA9IGF1X2Ric3RhcnQoZGVudHJ5KTsKKwloX2RlbnRyeSA9IGF1X2hfZHB0
cihkZW50cnksIGJzdGFydCk7CisJaF9wYXJlbnQgPSBoX2RlbnRyeS0+ZF9wYXJlbnQ7IC8qIGRp
ciBpbm9kZSBpcyBsb2NrZWQgKi8KKwloX2RpciA9IGhfcGFyZW50LT5kX2lub2RlOworCUlNdXN0
TG9jayhoX2Rpcik7CisJc2IgPSBkaXItPmlfc2I7CisJZGxndCA9ICEhYXVfb3B0X3Rlc3RfZGxn
dChhdV9tbnRmbGFncyhzYikpOworCisJc3dpdGNoIChhcmctPnR5cGUpIHsKKwljYXNlIENyZWF0
OgorCQlBdURlYnVnT24oYXVfdGVzdF9uZnMoaF9kaXItPmlfc2IpICYmICFhcmctPnUuYy5uZCk7
CisJCWVyciA9IGF1X2hfY3JlYXRlKGhfZGlyLCBoX2RlbnRyeSwgYXJnLT51LmMubW9kZSwgZGxn
dCwKKwkJCQkgIGFyZy0+dS5jLm5kLCBhdV9uZnNtbnQoc2IsIGJzdGFydCkpOworCQlicmVhazsK
KwljYXNlIFN5bWxpbms6CisJCWVyciA9IHZmc3ViX3N5bWxpbmsoaF9kaXIsIGhfZGVudHJ5LCBh
cmctPnUucy5zeW1uYW1lLAorCQkJCSAgICBTX0lBTExVR08sIGRsZ3QpOworCQlicmVhazsKKwlj
YXNlIE1rbm9kOgorCQllcnIgPSB2ZnN1Yl9ta25vZChoX2RpciwgaF9kZW50cnksIGFyZy0+dS5t
Lm1vZGUsIGFyZy0+dS5tLmRldiwKKwkJCQkgIGRsZ3QpOworCQlicmVhazsKKwlkZWZhdWx0Ogor
CQlCVUcoKTsKKwl9CisJY3JlYXRlZCA9ICFlcnI7CisJaWYgKCFlcnIpCisJCWVyciA9IGVwaWxv
ZyhkaXIsIHdoX2RlbnRyeSwgZGVudHJ5KTsKKwkvL2VyciA9IC0xOworCisJLyogcmV2ZXJ0ICov
CisJaWYgKHVubGlrZWx5KGNyZWF0ZWQgJiYgZXJyICYmIGhfZGVudHJ5LT5kX2lub2RlKSkgewor
CQlpbnQgcmVycjsKKwkJdmZzdWJfYXJnc19pbml0KCZ2YXJncywgTlVMTCwgZGxndCwgMCk7CisJ
CXJlcnIgPSB2ZnN1Yl91bmxpbmsoaF9kaXIsIGhfZGVudHJ5LCAmdmFyZ3MpOworCQkvL3JlcnIg
PSAtMTsKKwkJaWYgKHJlcnIpIHsKKwkJCUF1SU9FcnIoIiUuKnMgcmV2ZXJ0IGZhaWx1cmUoJWQs
ICVkKVxuIiwKKwkJCQlBdURMTlBhaXIoZGVudHJ5KSwgZXJyLCByZXJyKTsKKwkJCWVyciA9IC1F
SU87CisJCX0KKwkJLy90b2RvOiBpbm90aWZ5IHdpbGwgYmUgZmlyZWQgdG8gdGhlIGdyYW5kIHBh
cmVudCBkaXIKKwkJYXVfZHRpbWVfcmV2ZXJ0KCZkdCk7CisJCWRfZHJvcChkZW50cnkpOworCX0K
KworCWF1X2hkaXJfdW5sb2NrKGhfZGlyLCBkaXIsIGJzdGFydCk7CisJZHB1dCh3aF9kZW50cnkp
OworCisgb3V0OgorCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWF1X3VwZGF0ZV9kYnN0YXJ0KGRl
bnRyeSk7CisJCWRfZHJvcChkZW50cnkpOworCX0KKwlkaV93cml0ZV91bmxvY2socGFyZW50KTsK
KwlhdWZzX3JlYWRfdW5sb2NrKGRlbnRyeSwgQXVMb2NrX0RXKTsKKwlBdVRyYWNlRXJyKGVycik7
CisJcmV0dXJuIGVycjsKK30KKworaW50IGF1ZnNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0
cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IGRldikKK3sKKwlzdHJ1Y3Qgc2lt
cGxlX2FyZyBhcmcgPSB7CisJCS50eXBlID0gTWtub2QsCisJCS51Lm0gPSB7CisJCQkubW9kZQk9
IG1vZGUsCisJCQkuZGV2CT0gZGV2CisJCX0KKwl9OworCXJldHVybiBhZGRfc2ltcGxlKGRpciwg
ZGVudHJ5LCAmYXJnKTsKK30KKworaW50IGF1ZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwg
c3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpzeW1uYW1lKQoreworCXN0cnVjdCBz
aW1wbGVfYXJnIGFyZyA9IHsKKwkJLnR5cGUgPSBTeW1saW5rLAorCQkudS5zLnN5bW5hbWUgPSBz
eW1uYW1lCisJfTsKKwlyZXR1cm4gYWRkX3NpbXBsZShkaXIsIGRlbnRyeSwgJmFyZyk7Cit9CisK
K2ludCBhdWZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5
LCBpbnQgbW9kZSwKKwkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHNpbXBsZV9h
cmcgYXJnID0geworCQkudHlwZSA9IENyZWF0LAorCQkudS5jID0geworCQkJLm1vZGUJPSBtb2Rl
LAorCQkJLm5kCT0gbmQKKwkJfQorCX07CisJcmV0dXJuIGFkZF9zaW1wbGUoZGlyLCBkZW50cnks
ICZhcmcpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBsaW5rX2FyZyB7CisJ
YXVmc19iaW5kZXhfdCBiZHN0LCBic3JjOworCWludCBpc3NhbWVkaXIsIGRsZ3Q7CisJc3RydWN0
IGRlbnRyeSAqc3JjX3BhcmVudCwgKnBhcmVudCwgKmhfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAq
aF9kaXIsICppbm9kZSwgKmRpcjsKK307CisKK3N0YXRpYyBpbnQgY3B1cF9iZWZvcmVfbGluayhz
dHJ1Y3QgZGVudHJ5ICpzcmNfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCSAgICBzdHJ1
Y3QgbGlua19hcmcgKmEpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmhpLCAqaF9kaXIs
ICpzcmNfZGlyLCAqZ2RpcjsKKwlzdHJ1Y3QgZGVudHJ5ICpncGFyZW50OworCisJQXVUcmFjZUVu
dGVyKCk7CisKKwlncGFyZW50ID0gTlVMTDsKKwlnZGlyID0gTlVMTDsKKwlpZiAodW5saWtlbHko
YXVfb3B0X3Rlc3QoYXVfbW50ZmxhZ3Moc3JjX2RlbnRyeS0+ZF9zYiksIFVEQkFfSU5PVElGWSkK
KwkJICAgICAmJiAhSVNfUk9PVChhLT5zcmNfcGFyZW50KSkpIHsKKwkJZ3BhcmVudCA9IGRnZXRf
cGFyZW50KGEtPnNyY19wYXJlbnQpOworCQlnZGlyID0gZ3BhcmVudC0+ZF9pbm9kZTsKKwkJaWYg
KGdkaXIgPT0gZGlyKSB7CisJCQlkcHV0KGdwYXJlbnQpOworCQkJZ3BhcmVudCA9IE5VTEw7CisJ
CX0KKwl9CisJc3JjX2RpciA9IGEtPnNyY19wYXJlbnQtPmRfaW5vZGU7CisJaF9kaXIgPSBOVUxM
OworCisJaWYgKCFhLT5pc3NhbWVkaXIpIHsKKwkJLyogdGhpcyB0ZW1wb3JhcnkgdW5sb2NrL2xv
Y2sgaXMgc2FmZSAqLworCQlhdV9oZGlyX3VubG9jayhhLT5oX2RpciwgZGlyLCBhLT5iZHN0KTsK
KwkJZGlfcmVhZF9sb2NrX3BhcmVudDIoYS0+c3JjX3BhcmVudCwgQXVMb2NrX0lSKTsKKwkJZXJy
ID0gYXVfdGVzdF9hbmRfY3B1cF9kaXJzKHNyY19kZW50cnksIGEtPmJkc3QsIGEtPnBhcmVudCk7
CisJCS8vZXJyID0gLTE7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQlhdV9oZGlyX2xvY2so
YS0+aF9kaXIsIGRpciwgYS0+YmRzdCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8vdG9kbzog
bWVhbmluZ2xlc3MgbG9jayBpZiBDT05GSUdfQVVGU19ERUJVRyBpcyBkaXNhYmxlZC4KKwkJaWYg
KHVubGlrZWx5KGdwYXJlbnQpKQorCQkJaWlfcmVhZF9sb2NrX3BhcmVudDMoZ2Rpcik7CisJCWhf
ZGlyID0gYXVfaF9pcHRyKHNyY19kaXIsIGEtPmJkc3QpOworCQlhdV9oZGlyX2xvY2soaF9kaXIs
IHNyY19kaXIsIGEtPmJkc3QpOworCX0gZWxzZSBpZiAodW5saWtlbHkoZ3BhcmVudCkpIHsKKwkJ
LyogdGhpcyB0ZW1wb3JhcnkgdW5sb2NrL2xvY2sgaXMgc2FmZSAqLworCQlhdV9oZGlyX3VubG9j
ayhhLT5oX2RpciwgZGlyLCBhLT5iZHN0KTsKKwkJaWlfcmVhZF9sb2NrX3BhcmVudDMoZ2Rpcik7
CisJCWF1X2hkaXJfbG9jayhhLT5oX2RpciwgZGlyLCBhLT5iZHN0KTsKKwl9CisJLy90b2RvOiB0
ZXN0IHBhcmVudC1ncGFyZW50IHJlbGF0aW9uc2hpcAorCisJQXVEZWJ1Z09uKGF1X2Ric3RhcnQo
c3JjX2RlbnRyeSkgIT0gYS0+YnNyYyk7CisJaGkgPSBhdV9oX2RwdHIoc3JjX2RlbnRyeSwgYS0+
YnNyYyktPmRfaW5vZGU7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJmhpLT5pX211dGV4LCBBdUxzY19J
X0NISUxEKTsKKwllcnIgPSBhdV9zaW9fY3B1cF9zaW1wbGUoc3JjX2RlbnRyeSwgYS0+YmRzdCwg
LTEsIEF1Q3B1cF9EVElNRSk7CisJLy9lcnIgPSAtMTsKKwltdXRleF91bmxvY2soJmhpLT5pX211
dGV4KTsKKworCWlmICh1bmxpa2VseShncGFyZW50KSkgeworCQlpaV9yZWFkX3VubG9jayhnZGly
KTsKKwkJZHB1dChncGFyZW50KTsKKwl9CisKKyBvdXQ6CisJaWYgKGhfZGlyKSB7CisJCWF1X2hk
aXJfdW5sb2NrKGhfZGlyLCBzcmNfZGlyLCBhLT5iZHN0KTsKKwkJYXVfaGRpcl9sb2NrKGEtPmhf
ZGlyLCBkaXIsIGEtPmJkc3QpOworCX0KKwlpZiAoIWEtPmlzc2FtZWRpcikKKwkJZGlfcmVhZF91
bmxvY2soYS0+c3JjX3BhcmVudCwgQXVMb2NrX0lSKTsKKworCUF1VHJhY2VFcnIoZXJyKTsKKwly
ZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNwdXBfb3JfbGluayhzdHJ1Y3QgZGVudHJ5ICpz
cmNfZGVudHJ5LCBzdHJ1Y3QgbGlua19hcmcgKmEpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaW5v
ZGUgKmlub2RlLCAqaF9pbm9kZSwgKmhfZHN0X2lub2RlOworCXN0cnVjdCBkZW50cnkgKmhfZGVu
dHJ5OworCWF1ZnNfYmluZGV4X3QgYnN0YXJ0OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisK
KwlBdVRyYWNlRW50ZXIoKTsKKworCXNiID0gc3JjX2RlbnRyeS0+ZF9zYjsKKwlpbm9kZSA9IHNy
Y19kZW50cnktPmRfaW5vZGU7CisJQXVEZWJ1Z09uKGF1X2Ric3RhcnQoc3JjX2RlbnRyeSkgIT0g
YS0+YnNyYyk7CisJaF9kZW50cnkgPSBhdV9oX2RwdHIoc3JjX2RlbnRyeSwgYS0+YnNyYyk7CisJ
aF9pbm9kZSA9IGhfZGVudHJ5LT5kX2lub2RlOworCWJzdGFydCA9IGF1X2lic3RhcnQoaW5vZGUp
OworCWhfZHN0X2lub2RlID0gTlVMTDsKKwlpZiAoYnN0YXJ0IDw9IGEtPmJkc3QpCisJCWhfZHN0
X2lub2RlID0gYXVfaF9pcHRyKGlub2RlLCBhLT5iZHN0KTsKKworCWlmICghaF9kc3RfaW5vZGUg
fHwgIWhfZHN0X2lub2RlLT5pX25saW5rKSB7CisJCS8qIGNvcHl1cCBzcmNfZGVudHJ5IGFzIHRo
ZSBuYW1lIG9mIGRlbnRyeS4gKi8KKwkJYXVfc2V0X2Ric3RhcnQoc3JjX2RlbnRyeSwgYS0+YmRz
dCk7CisJCWF1X3NldF9oX2RwdHIoc3JjX2RlbnRyeSwgYS0+YmRzdCwgZGdldChhLT5oX2RlbnRy
eSkpOworCQltdXRleF9sb2NrX25lc3RlZCgmaF9pbm9kZS0+aV9tdXRleCwgQXVMc2NfSV9DSElM
RCk7CisJCWVyciA9IGF1X3Npb19jcHVwX3NpbmdsZShzcmNfZGVudHJ5LCBhLT5iZHN0LCBhLT5i
c3JjLCAtMSwKKwkJCQkJICFBdUNwdXBfRFRJTUUpOworCQkvL2VyciA9IC0xOworCQltdXRleF91
bmxvY2soJmhfaW5vZGUtPmlfbXV0ZXgpOworCQlhdV9zZXRfaF9kcHRyKHNyY19kZW50cnksIGEt
PmJkc3QsIE5VTEwpOworCQlhdV9zZXRfZGJzdGFydChzcmNfZGVudHJ5LCBhLT5ic3JjKTsKKwl9
IGVsc2UgeworCQkvKiB0aGUgaW5vZGUgb2Ygc3JjX2RlbnRyeSBhbHJlYWR5IGV4aXN0cyBvbiBh
LmJkc3QgYnJhbmNoICovCisJCWhfZGVudHJ5ID0gZF9maW5kX2FsaWFzKGhfZHN0X2lub2RlKTsK
KwkJaWYgKGhfZGVudHJ5KSB7CisJCQllcnIgPSB2ZnN1Yl9saW5rKGhfZGVudHJ5LCBhLT5oX2Rp
ciwKKwkJCQkJIGEtPmhfZGVudHJ5LCBhLT5kbGd0KTsKKwkJCWRwdXQoaF9kZW50cnkpOworCQl9
IGVsc2UgeworCQkJQXVJT0Vycigibm8gZGVudHJ5IGZvdW5kIGZvciBpJWx1IG9uIGIlZFxuIiwK
KwkJCQloX2RzdF9pbm9kZS0+aV9pbm8sIGEtPmJkc3QpOworCQkJZXJyID0gLUVJTzsKKwkJfQor
CX0KKworCWlmICghZXJyKQorCQlhdV9wbGlua19hcHBlbmQoc2IsIGEtPmlub2RlLCBhLT5oX2Rl
bnRyeSwgYS0+YmRzdCk7CisKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKwor
aW50IGF1ZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpzcmNfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRp
ciwKKwkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IGVyciwgcmVycjsKKwlz
dHJ1Y3QgZGVudHJ5ICpoX3BhcmVudCwgKndoX2RlbnRyeSwgKmhfc3JjX2RlbnRyeTsKKwlzdHJ1
Y3QgYXVfZHRpbWUgZHQ7CisJc3RydWN0IGxpbmtfYXJnIGE7CisJc3RydWN0IHN1cGVyX2Jsb2Nr
ICpzYjsKKwl1bnNpZ25lZCBpbnQgbW50X2ZsYWdzOworCXN0cnVjdCB2ZnN1Yl9hcmdzIHZhcmdz
OworCXN0cnVjdCBhdV93cl9kaXJfYXJncyB3cl9kaXJfYXJncyA9IHsKKwkJLy8uZm9yY2VfYnRn
dAk9IC0xLAorCQkuZmxhZ3MJCT0gQXVXckRpcl9BRERfRU5UUlkKKwl9OworCisJTEtUUlRyYWNl
KCJzcmMgJS4qcywgaSVsdSwgZHN0ICUuKnNcbiIsCisJCSAgQXVETE5QYWlyKHNyY19kZW50cnkp
LCBkaXItPmlfaW5vLCBBdURMTlBhaXIoZGVudHJ5KSk7CisJSU11c3RMb2NrKGRpcik7CisJSU11
c3RMb2NrKHNyY19kZW50cnktPmRfaW5vZGUpOworCUF1RGVidWdPbihTX0lTRElSKHNyY19kZW50
cnktPmRfaW5vZGUtPmlfbW9kZSkpOworCisJYXVmc19yZWFkX2FuZF93cml0ZV9sb2NrMihkZW50
cnksIHNyY19kZW50cnksIC8qZmxhZ3MqLzApOworCXNiID0gZGVudHJ5LT5kX3NiOworCWEuZGly
ID0gZGlyOworCWEuc3JjX3BhcmVudCA9IGRnZXRfcGFyZW50KHNyY19kZW50cnkpOworCWEucGFy
ZW50ID0gZGVudHJ5LT5kX3BhcmVudDsgLyogZGlyIGlub2RlIGlzIGxvY2tlZCAqLworCWEuaXNz
YW1lZGlyID0gKGEuc3JjX3BhcmVudCA9PSBhLnBhcmVudCk7CisJaWYgKCFhLmlzc2FtZWRpcikK
KwkJYXVfZnNldF93cmRpcih3cl9kaXJfYXJncy5mbGFncywgTE9DS19TUkNESVIpOworCXdyX2Rp
cl9hcmdzLmZvcmNlX2J0Z3QgPSBhdV9kYnN0YXJ0KHNyY19kZW50cnkpOworCWRpX3dyaXRlX2xv
Y2tfcGFyZW50KGEucGFyZW50KTsKKwl3cl9kaXJfYXJncy5mb3JjZV9idGd0ID0gYXVfd2JyKGRl
bnRyeSwgd3JfZGlyX2FyZ3MuZm9yY2VfYnRndCk7CisJd2hfZGVudHJ5ID0gbG9ja19oZGlyX2xr
dXBfd2goZGVudHJ5LCAmZHQsIHNyY19kZW50cnksICZ3cl9kaXJfYXJncyk7CisJLy93aF9kZW50
cnkgPSBFUlJfUFRSKC0xKTsKKwllcnIgPSBQVFJfRVJSKHdoX2RlbnRyeSk7CisJaWYgKElTX0VS
Uih3aF9kZW50cnkpKQorCQlnb3RvIG91dDsKKworCWEuaW5vZGUgPSBzcmNfZGVudHJ5LT5kX2lu
b2RlOworCWEuYmRzdCA9IGF1X2Ric3RhcnQoZGVudHJ5KTsKKwlhLmhfZGVudHJ5ID0gYXVfaF9k
cHRyKGRlbnRyeSwgYS5iZHN0KTsKKwloX3BhcmVudCA9IGEuaF9kZW50cnktPmRfcGFyZW50OyAv
KiBkaXIgaW5vZGUgaXMgbG9ja2VkICovCisJYS5oX2RpciA9IGhfcGFyZW50LT5kX2lub2RlOwor
CUlNdXN0TG9jayhhLmhfZGlyKTsKKworCWVyciA9IDA7CisJbW50X2ZsYWdzID0gYXVfbW50Zmxh
Z3Moc2IpOworCWEuZGxndCA9ICEhYXVfb3B0X3Rlc3RfZGxndChtbnRfZmxhZ3MpOworCisJLy90
b2RvOiBtaW5vciBvcHRpbWl6ZSwgdGhlaXIgc2IgbWF5IGJlIHNhbWUgd2hpbGUgdGhlaXIgYmlu
ZGV4IGRpZmZlcnMuCisJYS5ic3JjID0gYXVfZGJzdGFydChzcmNfZGVudHJ5KTsKKwloX3NyY19k
ZW50cnkgPSBhdV9oX2RwdHIoc3JjX2RlbnRyeSwgYS5ic3JjKTsKKwlpZiAodW5saWtlbHkoIWF1
X29wdF90ZXN0KG1udF9mbGFncywgUExJTkspKSkgeworCQkvKgorCQkgKiBjb3B5dXAgc3JjX2Rl
bnRyeSB0byB0aGUgYnJhbmNoIHdlIHByb2Nlc3MsCisJCSAqIGFuZCB0aGVuIGxpbmsoMikgdG8g
aXQuCisJCSAqIGdhdmUgdXAgJ3BzZXVkbyBsaW5rIGJ5IGNwdXAnIGFwcHJvYWNoLAorCQkgKiBz
aW5jZSBubGluayBtYXkgYmUgb25lIGFuZCBzb21lIGFwcGxpY2F0aW9ucyB3aWxsIG5vdCB3b3Jr
LgorCQkgKi8KKwkJaWYgKGEuYmRzdCA8IGEuYnNyYworCQkgICAgLyogJiYgaF9zcmNfZGVudHJ5
LT5kX3NiICE9IGEuaF9kZW50cnktPmRfc2IgKi8pCisJCQllcnIgPSBjcHVwX2JlZm9yZV9saW5r
KHNyY19kZW50cnksIGRpciwgJmEpOworCQlpZiAoIWVycikgeworCQkJaF9zcmNfZGVudHJ5ID0g
YXVfaF9kcHRyKHNyY19kZW50cnksIGEuYmRzdCk7CisJCQllcnIgPSB2ZnN1Yl9saW5rKGhfc3Jj
X2RlbnRyeSwgYS5oX2RpciwgYS5oX2RlbnRyeSwKKwkJCQkJIGEuZGxndCk7CisJCQkvL2VyciA9
IC0xOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGEuYmRzdCA8IGEuYnNyYworCQkgICAgLyogJiYg
aF9zcmNfZGVudHJ5LT5kX3NiICE9IGEuaF9kZW50cnktPmRfc2IgKi8pCisJCQllcnIgPSBjcHVw
X29yX2xpbmsoc3JjX2RlbnRyeSwgJmEpOworCQllbHNlIHsKKwkJCWhfc3JjX2RlbnRyeSA9IGF1
X2hfZHB0cihzcmNfZGVudHJ5LCBhLmJkc3QpOworCQkJZXJyID0gdmZzdWJfbGluayhoX3NyY19k
ZW50cnksIGEuaF9kaXIsIGEuaF9kZW50cnksCisJCQkJCSBhLmRsZ3QpOworCQkJLy9lcnIgPSAt
MTsKKwkJfQorCX0KKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXRfdW5sb2NrOworCWlm
ICh3aF9kZW50cnkpIHsKKwkJZXJyID0gYXVfd2hfdW5saW5rX2RlbnRyeShhLmhfZGlyLCB3aF9k
ZW50cnksIGRlbnRyeSwKKwkJCQkJICBkaXIsIC8qZGxndCovMCk7CisJCS8vZXJyID0gLTE7CisJ
CWlmICh1bmxpa2VseShlcnIpKQorCQkJZ290byBvdXRfcmV2ZXJ0OworCX0KKworCWRpci0+aV92
ZXJzaW9uKys7CisJaWYgKGF1X2lic3RhcnQoZGlyKSA9PSBhdV9kYnN0YXJ0KGRlbnRyeSkpCisJ
CWF1X2NwdXBfYXR0cl90aW1lc2l6ZXMoZGlyKTsKKwlpZiAoIWRfdW5oYXNoZWQoYS5oX2RlbnRy
eSkKKwkgICAgLyogfHwgaF9vbGRfaW5vZGUtPmlfbmxpbmsgPD0gbmxpbmsgKi8KKwkgICAgLyog
fHwgU0JfTkZTKGhfc3JjX2RlbnRyeS0+ZF9zYikgKi8pIHsKKwkJZGVudHJ5LT5kX2lub2RlID0g
aWdyYWIoYS5pbm9kZSk7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBhLmlub2RlKTsKKwkJaW5j
X25saW5rKGEuaW5vZGUpOworCQlhLmlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lOworCX0g
ZWxzZQorCQkvKiBuZnMgY2FzZSAoPCAyLjYuMTUpICovCisJCWRfZHJvcChkZW50cnkpOworCWdv
dG8gb3V0X3VubG9jazsgLyogc3VjY2VzcyAqLworCisgb3V0X3JldmVydDoKKwl2ZnN1Yl9hcmdz
X2luaXQoJnZhcmdzLCBOVUxMLCBhLmRsZ3QsIDApOworCXJlcnIgPSB2ZnN1Yl91bmxpbmsoYS5o
X2RpciwgYS5oX2RlbnRyeSwgJnZhcmdzKTsKKwkvL3JlcnIgPSAtMTsKKwlpZiAoIXJlcnIpCisJ
CWdvdG8gb3V0X2R0OworLy8gb3V0X3JlcnI6CisJQXVJT0VycigiJS4qcyByZXZlcnRpbmcgZmFp
bGVkKCVkLCAlZClcbiIsCisJCUF1RExOUGFpcihkZW50cnkpLCBlcnIsIHJlcnIpOworCWVyciA9
IC1FSU87Cisgb3V0X2R0OgorCWRfZHJvcChkZW50cnkpOworCWF1X2R0aW1lX3JldmVydCgmZHQp
OworIG91dF91bmxvY2s6CisJYXVfaGRpcl91bmxvY2soYS5oX2RpciwgZGlyLCBhLmJkc3QpOwor
CWRwdXQod2hfZGVudHJ5KTsKKyBvdXQ6CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJYXVfdXBk
YXRlX2Ric3RhcnQoZGVudHJ5KTsKKwkJZF9kcm9wKGRlbnRyeSk7CisJfQorCWRpX3dyaXRlX3Vu
bG9jayhhLnBhcmVudCk7CisJZHB1dChhLnNyY19wYXJlbnQpOworCWF1ZnNfcmVhZF9hbmRfd3Jp
dGVfdW5sb2NrMihkZW50cnksIHNyY19kZW50cnkpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1
cm4gZXJyOworfQorCitpbnQgYXVmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRl
bnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlpbnQgZXJyLCByZXJyLCBkaXJvcHEsIGRsZ3Q7
CisJc3RydWN0IGRlbnRyeSAqaF9kZW50cnksICpoX3BhcmVudCwgKndoX2RlbnRyeSwgKnBhcmVu
dCwgKm9wcV9kZW50cnk7CisJc3RydWN0IGlub2RlICpoX2RpciwgKmhfaW5vZGU7CisJc3RydWN0
IGF1X2R0aW1lIGR0OworCWF1ZnNfYmluZGV4X3QgYmluZGV4OworCXN0cnVjdCBzdXBlcl9ibG9j
ayAqc2I7CisJdW5zaWduZWQgaW50IG1udF9mbGFnczsKKwlzdHJ1Y3QgdmZzdWJfYXJncyB2YXJn
czsKKwlzdHJ1Y3QgYXVfd3JfZGlyX2FyZ3Mgd3JfZGlyX2FyZ3MgPSB7CisJCS5mb3JjZV9idGd0
CT0gLTEsCisJCS5mbGFncwkJPSBBdVdyRGlyX0FERF9FTlRSWSB8IEF1V3JEaXJfSVNESVIKKwl9
OworCisJTEtUUlRyYWNlKCJpJWx1LCAlLipzLCBtb2RlIDAlb1xuIiwKKwkJICBkaXItPmlfaW5v
LCBBdURMTlBhaXIoZGVudHJ5KSwgbW9kZSk7CisJSU11c3RMb2NrKGRpcik7CisKKwlhdWZzX3Jl
YWRfbG9jayhkZW50cnksIEF1TG9ja19EVyk7CisJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsg
LyogZGlyIGlub2RlIGlzIGxvY2tlZCAqLworCWRpX3dyaXRlX2xvY2tfcGFyZW50KHBhcmVudCk7
CisJd2hfZGVudHJ5ID0gbG9ja19oZGlyX2xrdXBfd2goZGVudHJ5LCAmZHQsIC8qc3JjX2RlbnRy
eSovTlVMTCwKKwkJCQkgICAgICAmd3JfZGlyX2FyZ3MpOworCS8vd2hfZGVudHJ5ID0gRVJSX1BU
UigtMSk7CisJZXJyID0gUFRSX0VSUih3aF9kZW50cnkpOworCWlmIChJU19FUlIod2hfZGVudHJ5
KSkKKwkJZ290byBvdXQ7CisKKwlzYiA9IGRlbnRyeS0+ZF9zYjsKKwliaW5kZXggPSBhdV9kYnN0
YXJ0KGRlbnRyeSk7CisJaF9kZW50cnkgPSBhdV9oX2RwdHIoZGVudHJ5LCBiaW5kZXgpOworCWhf
cGFyZW50ID0gaF9kZW50cnktPmRfcGFyZW50OyAvKiBkaXIgaW5vZGUgaXMgbG9ja2VkICovCisJ
aF9kaXIgPSBoX3BhcmVudC0+ZF9pbm9kZTsKKwlJTXVzdExvY2soaF9kaXIpOworCW1udF9mbGFn
cyA9IGF1X21udGZsYWdzKHNiKTsKKwlkbGd0ID0gISFhdV9vcHRfdGVzdF9kbGd0KG1udF9mbGFn
cyk7CisKKwllcnIgPSB2ZnN1Yl9ta2RpcihoX2RpciwgaF9kZW50cnksIG1vZGUsIGRsZ3QpOwor
CS8vZXJyID0gLTE7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0X3VubG9jazsKKwlo
X2lub2RlID0gaF9kZW50cnktPmRfaW5vZGU7CisKKwkvKiBtYWtlIHRoZSBkaXIgb3BhcXVlICov
CisJZGlyb3BxID0gMDsKKwlpZiAod2hfZGVudHJ5IHx8IGF1X29wdF90ZXN0KG1udF9mbGFncywg
QUxXQVlTX0RJUk9QUSkpIHsKKwkJbXV0ZXhfbG9ja19uZXN0ZWQoJmhfaW5vZGUtPmlfbXV0ZXgs
IEF1THNjX0lfQ0hJTEQpOworCQlvcHFfZGVudHJ5ID0gYXVfZGlyb3BxX2NyZWF0ZShkZW50cnks
IGJpbmRleCwgLypkbGd0Ki8wKTsKKwkJLy9vcHFfZGVudHJ5ID0gRVJSX1BUUigtMSk7CisJCW11
dGV4X3VubG9jaygmaF9pbm9kZS0+aV9tdXRleCk7CisJCWVyciA9IFBUUl9FUlIob3BxX2RlbnRy
eSk7CisJCWlmIChJU19FUlIob3BxX2RlbnRyeSkpCisJCQlnb3RvIG91dF9kaXI7CisJCWRwdXQo
b3BxX2RlbnRyeSk7CisJCWRpcm9wcSA9IDE7CisJfQorCisJZXJyID0gZXBpbG9nKGRpciwgd2hf
ZGVudHJ5LCBkZW50cnkpOworCS8vZXJyID0gLTE7CisJaWYgKCFlcnIpIHsKKwkJaW5jX25saW5r
KGRpcik7CisJCWdvdG8gb3V0X3VubG9jazsgLyogc3VjY2VzcyAqLworCX0KKworCS8qIHJldmVy
dCAqLworCWlmIChkaXJvcHEpIHsKKwkJTEtUUkxhYmVsKHJldmVydCBvcHEpOworCQltdXRleF9s
b2NrX25lc3RlZCgmaF9pbm9kZS0+aV9tdXRleCwgQXVMc2NfSV9DSElMRCk7CisJCXJlcnIgPSBh
dV9kaXJvcHFfcmVtb3ZlKGRlbnRyeSwgYmluZGV4LCBkbGd0KTsKKwkJLy9yZXJyID0gLTE7CisJ
CW11dGV4X3VubG9jaygmaF9pbm9kZS0+aV9tdXRleCk7CisJCWlmIChyZXJyKSB7CisJCQlBdUlP
RXJyKCIlLipzIHJldmVydGluZyBkaXJvcHEgZmFpbGVkKCVkLCAlZClcbiIsCisJCQkJQXVETE5Q
YWlyKGRlbnRyeSksIGVyciwgcmVycik7CisJCQllcnIgPSAtRUlPOworCQl9CisJfQorCisgb3V0
X2RpcjoKKwlMS1RSTGFiZWwocmV2ZXJ0IGRpcik7CisJdmZzdWJfYXJnc19pbml0KCZ2YXJncywg
TlVMTCwgZGxndCwgMCk7CisJcmVyciA9IHZmc3ViX3JtZGlyKGhfZGlyLCBoX2RlbnRyeSwgJnZh
cmdzKTsKKwkvL3JlcnIgPSAtMTsKKwlpZiAocmVycikgeworCQlBdUlPRXJyKCIlLipzIHJldmVy
dGluZyBkaXIgZmFpbGVkKCVkLCAlZClcbiIsCisJCQlBdURMTlBhaXIoZGVudHJ5KSwgZXJyLCBy
ZXJyKTsKKwkJZXJyID0gLUVJTzsKKwl9CisJZF9kcm9wKGRlbnRyeSk7CisJYXVfZHRpbWVfcmV2
ZXJ0KCZkdCk7Cisgb3V0X3VubG9jazoKKwlhdV9oZGlyX3VubG9jayhoX2RpciwgZGlyLCBiaW5k
ZXgpOworCWRwdXQod2hfZGVudHJ5KTsKKyBvdXQ6CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJ
YXVfdXBkYXRlX2Ric3RhcnQoZGVudHJ5KTsKKwkJZF9kcm9wKGRlbnRyeSk7CisJfQorCWRpX3dy
aXRlX3VubG9jayhwYXJlbnQpOworCWF1ZnNfcmVhZF91bmxvY2soZGVudHJ5LCBBdUxvY2tfRFcp
OworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC11ck4gbGludXgtMi42
LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvaV9vcC5jIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMv
ZnMvYXVmcy9pX29wLmMKLS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL2lf
b3AuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZz
L2ZzL2F1ZnMvaV9vcC5jCTIwMDgtMDUtMjUgMTE6NTg6NTMgKzAzMDAKQEAgLTAsMCArMSw3MzIg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAqCisg
KiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdy
aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8q
CisgKiBpbm9kZSBvcGVyYXRpb25zIChleGNlcHQgYWRkL2RlbC9yZW5hbWUpCisgKgorICogJElk
OiBpX29wLmMsdiAxLjUgMjAwOC8wNS8xOSAwMTo0Njo1MyBzZmpybyBFeHAgJAorICovCisKKy8v
I2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZnNfc3RhY2suaD4KKy8vI2lu
Y2x1ZGUgPGxpbnV4L25hbWVpLmg+CisvLyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUg
PGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlICJhdWZzLmgiCisKK3N0YXRpYyBpbnQgaF9wZXJt
aXNzaW9uKHN0cnVjdCBpbm9kZSAqaF9pbm9kZSwgaW50IG1hc2ssCisJCQlzdHJ1Y3QgbmFtZWlk
YXRhICpmYWtlX25kLCBpbnQgYnJwZXJtLCBpbnQgZGxndCkKK3sKKwlpbnQgZXJyLCBzdWJtYXNr
OworCWNvbnN0IGludCB3cml0ZV9tYXNrID0gKG1hc2sgJiAoTUFZX1dSSVRFIHwgTUFZX0FQUEVO
RCkpOworCisJTEtUUlRyYWNlKCJpbm8gJWx1LCBtYXNrIDB4JXgsIGJycGVybSAweCV4XG4iLAor
CQkgIGhfaW5vZGUtPmlfaW5vLCBtYXNrLCBicnBlcm0pOworCisJZXJyID0gLUVBQ0NFUzsKKwlp
ZiAodW5saWtlbHkoKHdyaXRlX21hc2sgJiYgSVNfSU1NVVRBQkxFKGhfaW5vZGUpKQorCQkgICAg
IHx8ICgobWFzayAmIE1BWV9FWEVDKSAmJiBTX0lTUkVHKGhfaW5vZGUtPmlfbW9kZSkKKwkJCSAm
JiBmYWtlX25kICYmIGZha2VfbmQtPnBhdGgubW50CisJCQkgJiYgKGZha2VfbmQtPnBhdGgubW50
LT5tbnRfZmxhZ3MgJiBNTlRfTk9FWEVDKSkKKwkJICAgICkpCisJCWdvdG8gb3V0OworCisJLyog
c2tpcCBoaWRkZW4gZnMgdGVzdCBpbiB0aGUgY2FzZSBvZiB3cml0ZSB0byBybyBicmFuY2ggKi8K
KwlzdWJtYXNrID0gbWFzayAmIH5NQVlfQVBQRU5EOworCWlmICh1bmxpa2VseSgod3JpdGVfbWFz
ayAmJiAhYXVfYnJfd3JpdGFibGUoYnJwZXJtKSkKKwkJICAgICB8fCAhaF9pbm9kZS0+aV9vcAor
CQkgICAgIHx8ICFoX2lub2RlLT5pX29wLT5wZXJtaXNzaW9uKSkgeworCQkvL0xLVFJMYWJlbChn
ZW5lcmljX3Blcm1pc3Npb24pOworCQllcnIgPSBnZW5lcmljX3Blcm1pc3Npb24oaF9pbm9kZSwg
c3VibWFzaywgTlVMTCk7CisJfSBlbHNlIHsKKwkJLy9MS1RSTGFiZWwoaF9pbm9kZS0+cGVybWlz
c2lvbik7CisJCWVyciA9IGhfaW5vZGUtPmlfb3AtPnBlcm1pc3Npb24oaF9pbm9kZSwgc3VibWFz
aywgZmFrZV9uZCk7CisJCUF1VHJhY2VFcnIoZXJyKTsKKwl9CisKKwlpZiAoIWVycikKKwkJZXJy
ID0gYXVfc2VjdXJpdHlfaW5vZGVfcGVybWlzc2lvbihoX2lub2RlLCBtYXNrLCBmYWtlX25kLAor
CQkJCQkJICAgZGxndCk7CisKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7
Cit9CisKK3N0YXRpYyBpbnQgc2lsbHlfbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qg
bmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgbG9ja2VkID0gMDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sg
KnNiID0gaW5vZGUtPmlfc2I7CisKKwlMS1RSVHJhY2UoImklbHUsIG5kICVwXG4iLCBpbm9kZS0+
aV9pbm8sIG5kKTsKKworCWlmICghbmQgfHwgIW5kLT5wYXRoLmRlbnRyeSkgeworCQlzaV9yZWFk
X2xvY2soc2IsIEF1TG9ja19GTFVTSCk7CisJCWlpX3JlYWRfbG9ja19jaGlsZChpbm9kZSk7CisJ
fSBlbHNlIGlmIChuZC0+cGF0aC5kZW50cnktPmRfaW5vZGUgIT0gaW5vZGUpIHsKKwkJbG9ja2Vk
ID0gMTsKKwkJLyogbG9jayBjaGlsZCBmaXJzdCwgdGhlbiBwYXJlbnQgKi8KKwkJc2lfcmVhZF9s
b2NrKHNiLCBBdUxvY2tfRkxVU0gpOworCQlpaV9yZWFkX2xvY2tfY2hpbGQoaW5vZGUpOworCQlk
aV9yZWFkX2xvY2tfcGFyZW50KG5kLT5wYXRoLmRlbnRyeSwgMCk7CisJfSBlbHNlIHsKKwkJbG9j
a2VkID0gMjsKKwkJYXVmc19yZWFkX2xvY2sobmQtPnBhdGguZGVudHJ5LCBBdUxvY2tfRkxVU0gg
fCBBdUxvY2tfSVIpOworCX0KKwlyZXR1cm4gbG9ja2VkOworfQorCitzdGF0aWMgdm9pZCBzaWxs
eV91bmxvY2soaW50IGxvY2tlZCwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5hbWVpZGF0
YSAqbmQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCisJTEtU
UlRyYWNlKCJsb2NrZWQgJWQsIGklbHUsIG5kICVwXG4iLCBsb2NrZWQsIGlub2RlLT5pX2lubywg
bmQpOworCisJc3dpdGNoIChsb2NrZWQpIHsKKwljYXNlIDA6CisJCWlpX3JlYWRfdW5sb2NrKGlu
b2RlKTsKKwkJc2lfcmVhZF91bmxvY2soc2IpOworCQlicmVhazsKKwljYXNlIDE6CisJCWRpX3Jl
YWRfdW5sb2NrKG5kLT5wYXRoLmRlbnRyeSwgMCk7CisJCWlpX3JlYWRfdW5sb2NrKGlub2RlKTsK
KwkJc2lfcmVhZF91bmxvY2soc2IpOworCQlicmVhazsKKwljYXNlIDI6CisJCWF1ZnNfcmVhZF91
bmxvY2sobmQtPnBhdGguZGVudHJ5LCBBdUxvY2tfRkxVU0ggfCBBdUxvY2tfSVIpOworCQlicmVh
azsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXVmc19wZXJtaXNz
aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkK
K3sKKwlpbnQgZXJyLCBsb2NrZWQsIGRsZ3Q7CisJYXVmc19iaW5kZXhfdCBiaW5kZXgsIGJlbmQ7
CisJc3RydWN0IGlub2RlICpoX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJdW5z
aWduZWQgaW50IG1udF9mbGFnczsKKwlzdHJ1Y3QgbmFtZWlkYXRhIGZha2VfbmQsICpwOworCWNv
bnN0IGludCB3cml0ZV9tYXNrID0gKG1hc2sgJiAoTUFZX1dSSVRFIHwgTUFZX0FQUEVORCkpOwor
CWNvbnN0IGludCBub25kaXIgPSAhU19JU0RJUihpbm9kZS0+aV9tb2RlKTsKKworCUxLVFJUcmFj
ZSgiaW5vICVsdSwgbWFzayAweCV4LCBub25kaXIgJWQsIHdyaXRlX21hc2sgJWQsICIKKwkJICAi
bmQgJWR7JWQsICVkfVxuIiwKKwkJICBpbm9kZS0+aV9pbm8sIG1hc2ssIG5vbmRpciwgd3JpdGVf
bWFzaywKKwkJICAhIW5kLCBuZCA/ICEhbmQtPnBhdGguZGVudHJ5IDogMCwgbmQgPyAhIW5kLT5w
YXRoLm1udCA6IDApOworCisJc2IgPSBpbm9kZS0+aV9zYjsKKwlsb2NrZWQgPSBzaWxseV9sb2Nr
KGlub2RlLCBuZCk7CisJbW50X2ZsYWdzID0gYXVfbW50ZmxhZ3Moc2IpOworCWRsZ3QgPSAhIWF1
X29wdF90ZXN0X2RsZ3QobW50X2ZsYWdzKTsKKworCWlmIChuZCkKKwkJZmFrZV9uZCA9ICpuZDsK
KwlpZiAoLyogdW5saWtlbHkgKi8obm9uZGlyIHx8IHdyaXRlX21hc2sKKwkJCSAgIHx8IGF1X29w
dF90ZXN0X2RpcnBlcm0xKG1udF9mbGFncykpKSB7CisJCWhfaW5vZGUgPSBhdV9oX2lwdHIoaW5v
ZGUsIGF1X2lic3RhcnQoaW5vZGUpKTsKKwkJQXVEZWJ1Z09uKCFoX2lub2RlCisJCQkgIHx8ICgo
aF9pbm9kZS0+aV9tb2RlICYgU19JRk1UKQorCQkJICAgICAgIT0gKGlub2RlLT5pX21vZGUgJiBT
X0lGTVQpKSk7CisJCWVyciA9IDA7CisJCWJpbmRleCA9IGF1X2lic3RhcnQoaW5vZGUpOworCQlw
ID0gYXVfZmFrZV9kbSgmZmFrZV9uZCwgbmQsIHNiLCBiaW5kZXgpOworCQkvKiBhY3R1YWwgdGVz
dCB3aWxsIGJlIGRlbGVnYXRlZCB0byBMU00gKi8KKwkJaWYgKElTX0VSUihwKSkKKwkJCUF1RGVi
dWdPbihQVFJfRVJSKHApICE9IC1FTk9FTlQpOworCQllbHNlIHsKKwkJCUxLVFJUcmFjZSgiYiVk
XG4iLCBiaW5kZXgpOworCQkJZXJyID0gaF9wZXJtaXNzaW9uKGhfaW5vZGUsIG1hc2ssIHAsCisJ
CQkJCSAgIGF1X3Nicl9wZXJtKHNiLCBiaW5kZXgpLCBkbGd0KTsKKwkJCWF1X2Zha2VfZG1fcmVs
ZWFzZShwKTsKKwkJfQorCQlpZiAod3JpdGVfbWFzayAmJiAhZXJyKSB7CisJCQkvKiB0ZXN0IHdo
ZXRoZXIgdGhlIHVwcGVyIHdyaXRhYmxlIGJyYW5jaCBleGlzdHMgKi8KKwkJCWVyciA9IC1FUk9G
UzsKKwkJCWZvciAoOyBiaW5kZXggPj0gMDsgYmluZGV4LS0pCisJCQkJaWYgKCFhdV9icl9yZG9u
bHkoYXVfc2JyKHNiLCBiaW5kZXgpKSkgeworCQkJCQllcnIgPSAwOworCQkJCQlicmVhazsKKwkJ
CQl9CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJLyogbm9uLXdyaXRlIHRvIGRpciAqLworCWVy
ciA9IDA7CisJYmVuZCA9IGF1X2liZW5kKGlub2RlKTsKKwlmb3IgKGJpbmRleCA9IGF1X2lic3Rh
cnQoaW5vZGUpOyAhZXJyICYmIGJpbmRleCA8PSBiZW5kOyBiaW5kZXgrKykgeworCQloX2lub2Rl
ID0gYXVfaF9pcHRyKGlub2RlLCBiaW5kZXgpOworCQlpZiAoIWhfaW5vZGUpCisJCQljb250aW51
ZTsKKwkJQXVEZWJ1Z09uKCFTX0lTRElSKGhfaW5vZGUtPmlfbW9kZSkpOworCisJCXAgPSBhdV9m
YWtlX2RtKCZmYWtlX25kLCBuZCwgc2IsIGJpbmRleCk7CisJCS8qIGFjdHVhbCB0ZXN0IHdpbGwg
YmUgZGVsZWdhdGVkIHRvIExTTSAqLworCQlpZiAoSVNfRVJSKHApKQorCQkJQXVEZWJ1Z09uKFBU
Ul9FUlIocCkgIT0gLUVOT0VOVCk7CisJCWVsc2UgeworCQkJTEtUUlRyYWNlKCJiJWRcbiIsIGJp
bmRleCk7CisJCQllcnIgPSBoX3Blcm1pc3Npb24oaF9pbm9kZSwgbWFzaywgcCwKKwkJCQkJICAg
YXVfc2JyX3Blcm0oc2IsIGJpbmRleCksIGRsZ3QpOworCQkJYXVfZmFrZV9kbV9yZWxlYXNlKHAp
OworCQl9CisJfQorCisgb3V0OgorCXNpbGx5X3VubG9jayhsb2NrZWQsIGlub2RlLCBuZCk7CisJ
QXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
Kworc3RhdGljIHN0cnVjdCBkZW50cnkgKmF1ZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBz
dHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlz
dHJ1Y3QgZGVudHJ5ICpyZXQsICpwYXJlbnQ7CisJaW50IGVyciwgbnBvc2l0aXZlOworCXN0cnVj
dCBpbm9kZSAqaW5vZGUsICpoX2lub2RlOworCXN0cnVjdCBuYW1laWRhdGEgdG1wX25kLCAqbmRw
OworCisJTEtUUlRyYWNlKCJkaXIgJWx1LCAlLipzLCBuZHsweCV4fVxuIiwKKwkJICBkaXItPmlf
aW5vLCBBdURMTlBhaXIoZGVudHJ5KSwgbmQgPyBuZC0+ZmxhZ3MgOiAwKTsKKwlBdURlYnVnT24o
SVNfUk9PVChkZW50cnkpKTsKKwlJTXVzdExvY2soZGlyKTsKKworCS8qIG5kIGNhbiBiZSBOVUxM
ICovCisJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsgLyogZGlyIGlub2RlIGlzIGxvY2tlZCAq
LworCWF1ZnNfcmVhZF9sb2NrKHBhcmVudCwgQXVMb2NrX0ZMVVNIKTsKKwllcnIgPSBhdV9hbGxv
Y19kaW5mbyhkZW50cnkpOworCS8vaWYgKExrdHJDb25kKSBlcnIgPSAtMTsKKwlyZXQgPSBFUlJf
UFRSKGVycik7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0OworCisJbmRwID0gYXVf
ZHVwX25kKGF1X3NiaShkaXItPmlfc2IpLCAmdG1wX25kLCBuZCk7CisJbnBvc2l0aXZlID0gYXVf
bGt1cF9kZW50cnkoZGVudHJ5LCBhdV9kYnN0YXJ0KHBhcmVudCksIC8qdHlwZSovMCwgbmRwKTsK
KwllcnIgPSBucG9zaXRpdmU7CisJLy9lcnIgPSAtMTsKKwlyZXQgPSBFUlJfUFRSKGVycik7CisJ
aWYgKHVubGlrZWx5KGVyciA8IDApKQorCQlnb3RvIG91dF91bmxvY2s7CisJaW5vZGUgPSBOVUxM
OworCWlmIChucG9zaXRpdmUpIHsKKwkJLyoKKwkJICogc3RvcCAncmFjZSctaW5nIGJldHdlZW4g
aGFyZGxpbmtzIHVuZGVyIGRpZmZlcmVudCBwYXJlbnRzLgorCQkgKi8KKwkJaF9pbm9kZSA9IGF1
X2hfZHB0cihkZW50cnksIGF1X2Ric3RhcnQoZGVudHJ5KSktPmRfaW5vZGU7CisJCUF1RGVidWdP
bighaF9pbm9kZSk7CisJCWlmIChoX2lub2RlLT5pX25saW5rID09IDEgfHwgU19JU0RJUihoX2lu
b2RlLT5pX21vZGUpKQorCQkJaW5vZGUgPSBhdV9uZXdfaW5vZGUoZGVudHJ5KTsKKwkJZWxzZSB7
CisJCQlzdGF0aWMgREVGSU5FX01VVEVYKG10eCk7CisJCQltdXRleF9sb2NrKCZtdHgpOworCQkJ
aW5vZGUgPSBhdV9uZXdfaW5vZGUoZGVudHJ5KTsKKwkJCW11dGV4X3VubG9jaygmbXR4KTsKKwkJ
fQorCQlyZXQgPSAodm9pZCAqKWlub2RlOworCX0KKwlpZiAoIUlTX0VSUihpbm9kZSkpIHsKKwkJ
LyogZF9zcGxpY2VfYWxpYXMoKSBhbHNvIHN1cHBvcnRzIGRfYWRkKCkgKi8KKwkJcmV0ID0gZF9z
cGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CisJCWlmICh1bmxpa2VseShJU19FUlIocmV0KSAm
JiBpbm9kZSkpCisJCQlpaV93cml0ZV91bmxvY2soaW5vZGUpOworCQkvL0F1RGJnRGVudHJ5KGRl
bnRyeSk7CisJCUF1RGVidWdPbihuZAorCQkJICAmJiAobmQtPmZsYWdzICYgTE9PS1VQX09QRU4p
CisJCQkgICYmIG5kLT5pbnRlbnQub3Blbi5maWxlCisJCQkgICYmIG5kLT5pbnRlbnQub3Blbi5m
aWxlLT5mX2RlbnRyeSk7CisJCWF1X3N0b3JlX2Ztb2RlX2V4ZWMobmQsIGlub2RlKTsKKwl9CisK
KyBvdXRfdW5sb2NrOgorCWRpX3dyaXRlX3VubG9jayhkZW50cnkpOworIG91dDoKKwlhdWZzX3Jl
YWRfdW5sb2NrKHBhcmVudCwgIUF1TG9ja19JUik7CisJQXVUcmFjZUVyclB0cihyZXQpOworCXJl
dHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGRlY2lkZSB0aGUg
YnJhbmNoIGFuZCB0aGUgcGFyZW50IGRpciB3aGVyZSB3ZSB3aWxsIGNyZWF0ZSBhIG5ldyBlbnRy
eS4KKyAqIHJldHVybnMgbmV3IGJpbmRleCBvciBhbiBlcnJvci4KKyAqIGNvcHl1cCB0aGUgcGFy
ZW50IGRpciBpZiBuZWVkZWQuCisgKi8KK2ludCBhdV93cl9kaXIoc3RydWN0IGRlbnRyeSAqZGVu
dHJ5LCBzdHJ1Y3QgZGVudHJ5ICpzcmNfZGVudHJ5LAorCSAgICAgIHN0cnVjdCBhdV93cl9kaXJf
YXJncyAqYXJncykKK3sKKwlpbnQgZXJyOworCWF1ZnNfYmluZGV4X3QgYmNwdXAsIGJzdGFydCwg
c3JjX2JzdGFydDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBkZW50cnkgKnBh
cmVudCwgKnNyY19wYXJlbnQ7CisJc3RydWN0IGF1X3NiaW5mbyAqc2JpbmZvOworCWNvbnN0IGlu
dCBhZGRfZW50cnkgPSBhdV9mdGVzdF93cmRpcihhcmdzLT5mbGFncywgQUREX0VOVFJZKTsKKwlj
b25zdCBpbnQgbG9ja19zcmNkaXIgPSBhdV9mdGVzdF93cmRpcihhcmdzLT5mbGFncywgTE9DS19T
UkNESVIpOworCisJTEtUUlRyYWNlKCIlLipzLCBzcmMgJXAsIHslZCwgMHgleH1cbiIsCisJCSAg
QXVETE5QYWlyKGRlbnRyeSksIHNyY19kZW50cnksIGFyZ3MtPmZvcmNlX2J0Z3QsIGFyZ3MtPmZs
YWdzKTsKKwkvL0F1RGJnRGVudHJ5KGRlbnRyeSk7CisKKwlzcmNfcGFyZW50ID0gTlVMTDsKKwlz
YiA9IGRlbnRyeS0+ZF9zYjsKKwlzYmluZm8gPSBhdV9zYmkoc2IpOworCXBhcmVudCA9IGRnZXRf
cGFyZW50KGRlbnRyeSk7CisJYnN0YXJ0ID0gYXVfZGJzdGFydChkZW50cnkpOworCWJjcHVwID0g
YnN0YXJ0OworCWlmIChhcmdzLT5mb3JjZV9idGd0IDwgMCkgeworCQlpZiAoc3JjX2RlbnRyeSkg
eworCQkJc3JjX2JzdGFydCA9IGF1X2Ric3RhcnQoc3JjX2RlbnRyeSk7CisJCQlpZiAoc3JjX2Jz
dGFydCA8IGJzdGFydCkKKwkJCQliY3B1cCA9IHNyY19ic3RhcnQ7CisJCX0gZWxzZSBpZiAoYWRk
X2VudHJ5KSB7CisJCQllcnIgPSBBdVdickNyZWF0ZShzYmluZm8sIGRlbnRyeSwKKwkJCQkJICBh
dV9mdGVzdF93cmRpcihhcmdzLT5mbGFncywgSVNESVIpKTsKKwkJCWJjcHVwID0gZXJyOworCQl9
CisKKwkJaWYgKGJjcHVwIDwgMCB8fCBhdV90ZXN0X3JvKHNiLCBiY3B1cCwgZGVudHJ5LT5kX2lu
b2RlKSkgeworCQkJaWYgKGFkZF9lbnRyeSkKKwkJCQllcnIgPSBBdVdickNvcHl1cChzYmluZm8s
IGRlbnRyeSk7CisJCQllbHNlIHsKKwkJCQlkaV9yZWFkX2xvY2tfcGFyZW50KHBhcmVudCwgIUF1
TG9ja19JUik7CisJCQkJZXJyID0gQXVXYnJDb3B5dXAoc2JpbmZvLCBkZW50cnkpOworCQkJCWRp
X3JlYWRfdW5sb2NrKHBhcmVudCwgIUF1TG9ja19JUik7CisJCQl9CisJCQkvL2VyciA9IC0xOwor
CQkJYmNwdXAgPSBlcnI7CisJCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCQkJZ290byBvdXQ7
CisJCX0KKwl9IGVsc2UgeworCQliY3B1cCA9IGFyZ3MtPmZvcmNlX2J0Z3Q7CisJCUF1RGVidWdP
bihhdV90ZXN0X3JvKHNiLCBiY3B1cCwgZGVudHJ5LT5kX2lub2RlKSk7CisJfQorCUxLVFJUcmFj
ZSgiYnN0YXJ0ICVkLCBiY3B1cCAlZFxuIiwgYnN0YXJ0LCBiY3B1cCk7CisJaWYgKGJzdGFydCA8
IGJjcHVwKQorCQlhdV91cGRhdGVfZGJyYW5nZShkZW50cnksIC8qZG9fcHV0X3plcm8qLzEpOwor
CisJZXJyID0gYmNwdXA7CisJaWYgKGJjcHVwID09IGJzdGFydCkKKwkJZ290byBvdXQ7IC8qIHN1
Y2Nlc3MgKi8KKworCS8qIGNvcHl1cCB0aGUgbmV3IHBhcmVudCBpbnRvIHRoZSBicmFuY2ggd2Ug
cHJvY2VzcyAqLworCWlmIChzcmNfZGVudHJ5KSB7CisJCXNyY19wYXJlbnQgPSBkZ2V0X3BhcmVu
dChzcmNfZGVudHJ5KTsKKwkJaWYgKGxvY2tfc3JjZGlyKQorCQkJZGlfd3JpdGVfbG9ja19wYXJl
bnQyKHNyY19wYXJlbnQpOworCX0KKworCWlmIChhZGRfZW50cnkpIHsKKwkJYXVfdXBkYXRlX2Ri
c3RhcnQoZGVudHJ5KTsKKwkJSU11c3RMb2NrKHBhcmVudC0+ZF9pbm9kZSk7CisJCURpTXVzdFdy
aXRlTG9jayhwYXJlbnQpOworCQlJaU11c3RXcml0ZUxvY2socGFyZW50LT5kX2lub2RlKTsKKwl9
IGVsc2UKKwkJZGlfd3JpdGVfbG9ja19wYXJlbnQocGFyZW50KTsKKworCWVyciA9IDA7CisJaWYg
KCFhdV9oX2RwdHIocGFyZW50LCBiY3B1cCkpIHsKKwkJaWYgKGJzdGFydCA8IGJjcHVwKQorCQkJ
ZXJyID0gYXVfY3Bkb3duX2RpcnMoZGVudHJ5LCBiY3B1cCwgc3JjX3BhcmVudCk7CisJCWVsc2UK
KwkJCWVyciA9IGF1X2NwdXBfZGlycyhkZW50cnksIGJjcHVwLCBzcmNfcGFyZW50KTsKKwl9CisJ
Ly9lcnIgPSAtMTsKKwlpZiAoIWVyciAmJiBhZGRfZW50cnkpIHsKKwkJc3RydWN0IGRlbnRyeSAq
aF9wYXJlbnQ7CisJCXN0cnVjdCBpbm9kZSAqaF9kaXI7CisKKwkJaF9wYXJlbnQgPSBhdV9oX2Rw
dHIocGFyZW50LCBiY3B1cCk7CisJCUF1RGVidWdPbighaF9wYXJlbnQpOworCQloX2RpciA9IGhf
cGFyZW50LT5kX2lub2RlOworCQlBdURlYnVnT24oIWhfZGlyKTsKKwkJbXV0ZXhfbG9ja19uZXN0
ZWQoJmhfZGlyLT5pX211dGV4LCBBdUxzY19JX1BBUkVOVCk7CisJCWVyciA9IGF1X2xrdXBfbmVn
KGRlbnRyeSwgYmNwdXApOworCQkvL2VyciA9IC0xOworCQltdXRleF91bmxvY2soJmhfZGlyLT5p
X211dGV4KTsKKwkJaWYgKGJzdGFydCA8IGJjcHVwICYmIGF1X2Ric3RhcnQoZGVudHJ5KSA8IDAp
IHsKKwkJCWF1X3NldF9kYnN0YXJ0KGRlbnRyeSwgMCk7CisJCQlhdV91cGRhdGVfZGJyYW5nZShk
ZW50cnksIC8qZG9fcHV0X3plcm8qLzApOworCQl9CisJfQorCisJaWYgKCFhZGRfZW50cnkpCisJ
CWRpX3dyaXRlX3VubG9jayhwYXJlbnQpOworCWlmIChsb2NrX3NyY2RpcikKKwkJZGlfd3JpdGVf
dW5sb2NrKHNyY19wYXJlbnQpOworCWRwdXQoc3JjX3BhcmVudCk7CisJaWYgKCFlcnIpCisJCWVy
ciA9IGJjcHVwOyAvKiBzdWNjZXNzICovCisJLy9lcnIgPSAtRVBFUk07Cisgb3V0OgorCWRwdXQo
cGFyZW50KTsKKwlMS1RSVHJhY2UoImVyciAlZFxuIiwgZXJyKTsKKwlBdVRyYWNlRXJyKGVycik7
CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBh
dV9oaV9sb2NrKHN0cnVjdCBpbm9kZSAqaF9pbm9kZSwgaW50IGlzZGlyLCBzdHJ1Y3QgaW5vZGUg
Kmlub2RlLAorCQkgICAgICAgYXVmc19iaW5kZXhfdCBiaW5kZXgpCit7CisJaWYgKCFpc2RpcikK
KwkJbXV0ZXhfbG9ja19uZXN0ZWQoJmhfaW5vZGUtPmlfbXV0ZXgsIEF1THNjX0lfQ0hJTEQpOwor
CWVsc2UKKwkJYXVfaGRpcjJfbG9jayhoX2lub2RlLCBpbm9kZSwgYmluZGV4KTsKK30KKworc3Rh
dGljIHZvaWQgYXVfaGlfdW5sb2NrKHN0cnVjdCBpbm9kZSAqaF9pbm9kZSwgaW50IGlzZGlyLCBz
dHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJIGF1ZnNfYmluZGV4X3QgYmluZGV4KQoreworCWlmICgh
aXNkaXIpCisJCW11dGV4X3VubG9jaygmaF9pbm9kZS0+aV9tdXRleCk7CisJZWxzZQorCQlhdV9o
ZGlyX3VubG9jayhoX2lub2RlLCBpbm9kZSwgYmluZGV4KTsKK30KKworc3RydWN0IGF1X2ljcHVw
X2FyZ3MgeworCWF1ZnNfYmluZGV4X3QgYnRndDsKKwl1bnNpZ25lZCBjaGFyIGlzZGlyLCBkaWRf
Y3B1cDsgLyogZmxhZ3MgKi8KKwl1bnNpZ25lZCBjaGFyIGhpbm90aWZ5OworCXN0cnVjdCBkZW50
cnkgKnBhcmVudCwgKmdwYXJlbnQsICpoX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmRpciwgKmdk
aXIsICpoX2lub2RlLCAqaF9kaXI7Cit9OworCitzdGF0aWMgaW50IGF1X2xvY2tfYW5kX2ljcHVw
KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgbG9mZl90IHN6LAorCQkJICAgICBzdHJ1Y3QgYXVfaWNw
dXBfYXJncyAqcmFyZ3MpCit7CisJaW50IGVycjsKKwlhdWZzX2JpbmRleF90IGJzdGFydDsKKwlz
dHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBkZW50cnkgKmhpX3doOworCXN0cnVjdCBp
bm9kZSAqaW5vZGU7CisJc3RydWN0IGF1X3dyX2Rpcl9hcmdzIHdyX2Rpcl9hcmdzID0geworCQku
Zm9yY2VfYnRndAk9IC0xLAorCQkuZmxhZ3MJCT0gMAorCX07CisKKwlMS1RSVHJhY2UoIiUuKnMs
ICVsbGRcbiIsIEF1RExOUGFpcihkZW50cnkpLCBzeik7CisKKwlkaV93cml0ZV9sb2NrX2NoaWxk
KGRlbnRyeSk7CisJYnN0YXJ0ID0gYXVfZGJzdGFydChkZW50cnkpOworCXNiID0gZGVudHJ5LT5k
X3NiOworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXJhcmdzLT5pc2RpciA9IFNfSVNESVIo
aW5vZGUtPmlfbW9kZSk7CisJaWYgKHJhcmdzLT5pc2RpcikKKwkJYXVfZnNldF93cmRpcih3cl9k
aXJfYXJncy5mbGFncywgSVNESVIpOworCWVyciA9IGF1X3dyX2RpcihkZW50cnksIC8qc3JjX2Rl
bnRyeSovTlVMTCwgJndyX2Rpcl9hcmdzKTsKKwkvL2VyciA9IC0xOworCWlmICh1bmxpa2VseShl
cnIgPCAwKSkKKwkJZ290byBvdXRfZGVudHJ5OworCXJhcmdzLT5idGd0ID0gZXJyOworCXJhcmdz
LT5kaWRfY3B1cCA9IChlcnIgIT0gYnN0YXJ0KTsKKwllcnIgPSAwOworCisJLyogY3JhenkgdWRi
YSBsb2NrcyAqLworCXJhcmdzLT5oaW5vdGlmeSA9ICEhYXVfb3B0X3Rlc3QoYXVfbW50ZmxhZ3Mo
c2IpLCBVREJBX0lOT1RJRlkpOworCWlmICh1bmxpa2VseSghSVNfUk9PVChkZW50cnkpKSkgewor
CQlyYXJncy0+cGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwkJcmFyZ3MtPmRpciA9IHJh
cmdzLT5wYXJlbnQtPmRfaW5vZGU7CisJCWRpX3JlYWRfbG9ja19wYXJlbnQocmFyZ3MtPnBhcmVu
dCwgQXVMb2NrX0lSKTsKKwl9CisJcmFyZ3MtPmhfZGVudHJ5ID0gYXVfaF9kcHRyKGRlbnRyeSwg
YXVfZGJzdGFydChkZW50cnkpKTsKKwlyYXJncy0+aF9pbm9kZSA9IHJhcmdzLT5oX2RlbnRyeS0+
ZF9pbm9kZTsKKwlBdURlYnVnT24oIXJhcmdzLT5oX2lub2RlKTsKKworCWlmICghcmFyZ3MtPmRp
ZF9jcHVwKSB7CisJCWF1X2hpX2xvY2socmFyZ3MtPmhfaW5vZGUsIHJhcmdzLT5pc2RpciwgaW5v
ZGUsIHJhcmdzLT5idGd0KTsKKwkJLy90b2RvOiByZXZhbGlkYXRlIHRoZSBsb3dlciBkZW50cnk/
CisJCWdvdG8gb3V0OyAvKiBzdWNjZXNzICovCisJfQorCisJaWYgKHVubGlrZWx5KHJhcmdzLT5o
aW5vdGlmeQorCQkgICAgICYmIHJhcmdzLT5wYXJlbnQKKwkJICAgICAmJiAhSVNfUk9PVChyYXJn
cy0+cGFyZW50KSkpIHsKKwkJcmFyZ3MtPmdwYXJlbnQgPSBkZ2V0X3BhcmVudChyYXJncy0+cGFy
ZW50KTsKKwkJcmFyZ3MtPmdkaXIgPSByYXJncy0+Z3BhcmVudC0+ZF9pbm9kZTsKKwkJaWlfcmVh
ZF9sb2NrX3BhcmVudDIocmFyZ3MtPmdkaXIpOworCX0KKworCWhpX3doID0gTlVMTDsKKwlyYXJn
cy0+aF9kaXIgPSBhdV9oX2lwdHIocmFyZ3MtPmRpciwgcmFyZ3MtPmJ0Z3QpOworCWF1X2hkaXJf
bG9jayhyYXJncy0+aF9kaXIsIHJhcmdzLT5kaXIsIHJhcmdzLT5idGd0KTsKKwkvL3RvZG86IHJl
dmFsaWRhdGUgdGhlIGxvd2VyIGRlbnRyeT8KKwlhdV9oaV9sb2NrKHJhcmdzLT5oX2lub2RlLCBy
YXJncy0+aXNkaXIsIGlub2RlLCBic3RhcnQpOworCWlmICghZF91bmhhc2hlZChkZW50cnkpKSB7
CisJCWVyciA9IGF1X3Npb19jcHVwX3NpbXBsZShkZW50cnksIHJhcmdzLT5idGd0LCBzeiwgQXVD
cHVwX0RUSU1FKTsKKwkJaWYgKCFlcnIpCisJCQlyYXJncy0+aF9kZW50cnkgPSBhdV9oX2RwdHIo
ZGVudHJ5LCBhdV9kYnN0YXJ0KGRlbnRyeSkpOworCX0gZWxzZSB7CisJCWhpX3doID0gYXVfaGlf
d2goaW5vZGUsIHJhcmdzLT5idGd0KTsKKwkJaWYgKCFoaV93aCkgeworCQkJZXJyID0gYXVfc2lv
X2NwdXBfd2goZGVudHJ5LCByYXJncy0+YnRndCwgc3osCisJCQkJCSAgICAgLypmaWxlKi9OVUxM
KTsKKwkJCWlmICghZXJyKQorCQkJCWhpX3doID0gYXVfaGlfd2goaW5vZGUsIHJhcmdzLT5idGd0
KTsKKwkJfQorCQlpZiAoIWhpX3doKQorCQkJcmFyZ3MtPmhfZGVudHJ5ID0gYXVfaF9kcHRyKGRl
bnRyeSwgYXVfZGJzdGFydChkZW50cnkpKTsKKwkJZWxzZQorCQkJcmFyZ3MtPmhfZGVudHJ5ID0g
aGlfd2g7IC8qIGRvIG5vdCBkZ2V0IGhlcmUgKi8KKwl9CisKKwkvL2VyciA9IC0xOworCWF1X2hp
X3VubG9jayhyYXJncy0+aF9pbm9kZSwgcmFyZ3MtPmlzZGlyLCBpbm9kZSwgYnN0YXJ0KTsKKwly
YXJncy0+aF9pbm9kZSA9IHJhcmdzLT5oX2RlbnRyeS0+ZF9pbm9kZTsKKwlBdURlYnVnT24oIXJh
cmdzLT5oX2lub2RlKTsKKwlpZiAoIWVycikKKwkJYXVfaGlfbG9jayhyYXJncy0+aF9pbm9kZSwg
cmFyZ3MtPmlzZGlyLCBpbm9kZSwgcmFyZ3MtPmJ0Z3QpOworCWF1X2hkaXJfdW5sb2NrKHJhcmdz
LT5oX2RpciwgcmFyZ3MtPmRpciwgcmFyZ3MtPmJ0Z3QpOworCWlmICghZXJyKQorCQlnb3RvIG91
dDsgLyogc3VjY2VzcyAqLworCisJYXVfaGlfdW5sb2NrKHJhcmdzLT5oX2lub2RlLCByYXJncy0+
aXNkaXIsIGlub2RlLCByYXJncy0+YnRndCk7CisJaWYgKHVubGlrZWx5KHJhcmdzLT5nZGlyKSkg
eworCQlpaV9yZWFkX3VubG9jayhyYXJncy0+Z2Rpcik7CisJCWRwdXQocmFyZ3MtPmdwYXJlbnQp
OworCX0KKwlpZiAodW5saWtlbHkocmFyZ3MtPmRpcikpIHsKKwkJZGlfcmVhZF91bmxvY2socmFy
Z3MtPnBhcmVudCwgQXVMb2NrX0lSKTsKKwkJZHB1dChyYXJncy0+cGFyZW50KTsKKwl9CisKKyBv
dXRfZGVudHJ5OgorCWRpX3dyaXRlX3VubG9jayhkZW50cnkpOworIG91dDoKKwlBdVRyYWNlRXJy
KGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhdWZzX3NldGF0dHIoc3RydWN0
IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmlhKQoreworCWludCBlcnI7CisJc3RydWN0
IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgYXVfaGluX2lnbm9yZSBpZ247CisJc3RydWN0IHZmc3Vi
X2FyZ3MgdmFyZ3M7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlfX3UzMiBldmVudHM7CisJ
c3RydWN0IGZpbGUgKmZpbGU7CisJbG9mZl90IHN6OworCXN0cnVjdCBhdV9pY3B1cF9hcmdzIHJh
cmdzOworCisJTEtUUlRyYWNlKCIlLipzLCBpYV92YWxpZCAweCV4XG4iLCBBdURMTlBhaXIoZGVu
dHJ5KSwgaWEtPmlhX3ZhbGlkKTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlJTXVzdExv
Y2soaW5vZGUpOworCisJc2IgPSBkZW50cnktPmRfc2I7CisJc2lfcmVhZF9sb2NrKHNiLCBBdUxv
Y2tfRkxVU0gpOworCisJZmlsZSA9IE5VTEw7CisJaWYgKGlhLT5pYV92YWxpZCAmIEFUVFJfRklM
RSkgeworCQkvKiBjdXJyZW50bHkgZnRydW5jYXRlKDIpIG9ubHkgKi8KKwkJZmlsZSA9IGlhLT5p
YV9maWxlOworCQlmaV93cml0ZV9sb2NrKGZpbGUpOworCQlpYS0+aWFfZmlsZSA9IGF1X2hfZnB0
cihmaWxlLCBhdV9mYnN0YXJ0KGZpbGUpKTsKKwl9CisKKwlzeiA9IC0xOworCWlmICgoaWEtPmlh
X3ZhbGlkICYgQVRUUl9TSVpFKQorCSAgICAmJiBpYS0+aWFfc2l6ZSA8IGlfc2l6ZV9yZWFkKGlu
b2RlKSkKKwkJc3ogPSBpYS0+aWFfc2l6ZTsKKwltZW1zZXQoJnJhcmdzLCAwLCBzaXplb2YocmFy
Z3MpKTsKKwllcnIgPSBhdV9sb2NrX2FuZF9pY3B1cChkZW50cnksIHN6LCAmcmFyZ3MpOworCWlm
ICh1bmxpa2VseShlcnIgPCAwKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoKGlhLT5pYV92YWxpZCAm
IEFUVFJfU0laRSkKKwkgICAgJiYgaWEtPmlhX3NpemUgPCBpX3NpemVfcmVhZChpbm9kZSkpIHsK
KwkJZXJyID0gdm10cnVuY2F0ZShpbm9kZSwgaWEtPmlhX3NpemUpOworCQlpZiAodW5saWtlbHko
ZXJyKSkKKwkJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpZiAoaWEtPmlhX3ZhbGlkICYgKEFU
VFJfS0lMTF9TVUlEIHwgQVRUUl9LSUxMX1NHSUQpKQorCQlpYS0+aWFfdmFsaWQgJj0gfkFUVFJf
TU9ERTsKKworCWV2ZW50cyA9IDA7CisJdmZzdWJfYXJnc19pbml0KCZ2YXJncywgJmlnbiwgYXVf
b3B0X3Rlc3RfZGxndChhdV9tbnRmbGFncyhzYikpLCAwKTsKKwlpZiAodW5saWtlbHkocmFyZ3Mu
aGlub3RpZnkgJiYgcmFyZ3MuZGlyKSkgeworCQlldmVudHMgPSB2ZnN1Yl9ldmVudHNfbm90aWZ5
X2NoYW5nZShpYSk7CisJCWlmIChldmVudHMpCisJCQl2ZnN1Yl9pZ25faGlub2RlKCZ2YXJncywg
ZXZlbnRzLAorCQkJCQkgYXVfaGkocmFyZ3MuZGlyLCByYXJncy5idGd0KSk7CisJfQorCWVyciA9
IHZmc3ViX25vdGlmeV9jaGFuZ2UocmFyZ3MuaF9kZW50cnksIGlhLCAmdmFyZ3MpOworCS8vZXJy
ID0gLTE7CisJaWYgKCFlcnIpCisJCWF1X2NwdXBfYXR0cl9jaGFuZ2VhYmxlKGlub2RlKTsKKwor
IG91dF91bmxvY2s6CisJYXVfaGlfdW5sb2NrKHJhcmdzLmhfaW5vZGUsIHJhcmdzLmlzZGlyLCBp
bm9kZSwgcmFyZ3MuYnRndCk7CisJaWYgKHVubGlrZWx5KHJhcmdzLmdkaXIpKSB7CisJCWlpX3Jl
YWRfdW5sb2NrKHJhcmdzLmdkaXIpOworCQlkcHV0KHJhcmdzLmdwYXJlbnQpOworCX0KKwlpZiAo
dW5saWtlbHkocmFyZ3MuZGlyKSkgeworCQlkaV9yZWFkX3VubG9jayhyYXJncy5wYXJlbnQsIEF1
TG9ja19JUik7CisJCWRwdXQocmFyZ3MucGFyZW50KTsKKwl9CisJZGlfd3JpdGVfdW5sb2NrKGRl
bnRyeSk7Cisgb3V0OgorCWlmIChmaWxlKSB7CisJCWlhLT5pYV9maWxlID0gZmlsZTsKKwkJLy9p
YS0+aWFfdmFsaWQgfD0gQVRUUl9GSUxFOworCQlmaV93cml0ZV91bmxvY2soZmlsZSk7CisJfQor
CXNpX3JlYWRfdW5sb2NrKHNiKTsKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30K
KworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGhfcmVhZGxpbmsoc3RydWN0IGRl
bnRyeSAqZGVudHJ5LCBpbnQgYmluZGV4LCBjaGFyIF9fdXNlciAqYnVmLAorCQkgICAgICBpbnQg
YnVmc2l6KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGRlbnRyeSAqaF9k
ZW50cnk7CisKKwlMS1RSVHJhY2UoIiUuKnMsIGIlZCwgJWRcbiIsIEF1RExOUGFpcihkZW50cnkp
LCBiaW5kZXgsIGJ1ZnNpeik7CisKKwloX2RlbnRyeSA9IGF1X2hfZHB0cihkZW50cnksIGJpbmRl
eCk7CisJaWYgKHVubGlrZWx5KCFoX2RlbnRyeS0+ZF9pbm9kZS0+aV9vcAorCQkgICAgIHx8ICFo
X2RlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+cmVhZGxpbmspKQorCQlyZXR1cm4gLUVJTlZBTDsKKwor
CXNiID0gZGVudHJ5LT5kX3NiOworCWlmICghYXVfdGVzdF9ybyhzYiwgYmluZGV4LCBkZW50cnkt
PmRfaW5vZGUpKSB7CisJCXRvdWNoX2F0aW1lKGF1X3Nicl9tbnQoc2IsIGJpbmRleCksIGhfZGVu
dHJ5KTsKKwkJYXVfdXBkYXRlX2Z1c2VfaF9pbm9kZShOVUxMLCBoX2RlbnRyeSk7IC8qaWdub3Jl
Ki8KKwkJZnNzdGFja19jb3B5X2F0dHJfYXRpbWUoZGVudHJ5LT5kX2lub2RlLCBoX2RlbnRyeS0+
ZF9pbm9kZSk7CisJfQorCXJldHVybiBoX2RlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+cmVhZGxpbmso
aF9kZW50cnksIGJ1ZiwgYnVmc2l6KTsKK30KKworc3RhdGljIGludCBhdWZzX3JlYWRsaW5rKHN0
cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGJ1ZnNpeikKK3sKKwlp
bnQgZXJyOworCisJTEtUUlRyYWNlKCIlLipzLCAlZFxuIiwgQXVETE5QYWlyKGRlbnRyeSksIGJ1
ZnNpeik7CisKKwlhdWZzX3JlYWRfbG9jayhkZW50cnksIEF1TG9ja19JUik7CisJZXJyID0gaF9y
ZWFkbGluayhkZW50cnksIGF1X2Ric3RhcnQoZGVudHJ5KSwgYnVmLCBidWZzaXopOworCS8vZXJy
ID0gLTE7CisJYXVmc19yZWFkX3VubG9jayhkZW50cnksIEF1TG9ja19JUik7CisJQXVUcmFjZUVy
cihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkICphdWZzX2ZvbGxvd19saW5r
KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IGVy
cjsKKwljaGFyICpidWY7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKworCUxLVFJUcmFjZSgiJS4q
cywgbmQgJS4qc1xuIiwKKwkJICBBdURMTlBhaXIoZGVudHJ5KSwgQXVETE5QYWlyKG5kLT5wYXRo
LmRlbnRyeSkpOworCisJZXJyID0gLUVOT01FTTsKKwlidWYgPSBfX2dldG5hbWUoKTsKKwkvL2J1
ZiA9IE5VTEw7CisJaWYgKHVubGlrZWx5KCFidWYpKQorCQlnb3RvIG91dDsKKworCWF1ZnNfcmVh
ZF9sb2NrKGRlbnRyeSwgQXVMb2NrX0lSKTsKKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMo
S0VSTkVMX0RTKTsKKwllcnIgPSBoX3JlYWRsaW5rKGRlbnRyeSwgYXVfZGJzdGFydChkZW50cnkp
LCAoY2hhciBfX3VzZXIgKilidWYsCisJCQkgUEFUSF9NQVgpOworCS8vZXJyID0gLTE7CisJc2V0
X2ZzKG9sZF9mcyk7CisJYXVmc19yZWFkX3VubG9jayhkZW50cnksIEF1TG9ja19JUik7CisKKwlp
ZiAoZXJyID49IDApIHsKKwkJYnVmW2Vycl0gPSAwOworCQkvKiB3aWxsIGJlIGZyZWVkIGJ5IHB1
dF9saW5rICovCisJCW5kX3NldF9saW5rKG5kLCBidWYpOworCQlyZXR1cm4gTlVMTDsgLyogc3Vj
Y2VzcyAqLworCX0KKwlfX3B1dG5hbWUoYnVmKTsKKworIG91dDoKKwlwYXRoX3B1dCgmbmQtPnBh
dGgpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0
aWMgdm9pZCBhdWZzX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVp
ZGF0YSAqbmQsCisJCQkgIHZvaWQgKmNvb2tpZSkKK3sKKwlMS1RSVHJhY2UoIiUuKnNcbiIsIEF1
RExOUGFpcihkZW50cnkpKTsKKwlfX3B1dG5hbWUobmRfZ2V0X2xpbmsobmQpKTsKK30KKworLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBhdWZzX3RydW5jYXRlX3JhbmdlKHN0cnVj
dCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCkKK3sKKwlBdVVuc3VwcG9y
dCgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25z
IGF1ZnNfc3ltbGlua19pb3AgPSB7CisJLnBlcm1pc3Npb24JPSBhdWZzX3Blcm1pc3Npb24sCisJ
LnNldGF0dHIJPSBhdWZzX3NldGF0dHIsCisjaWZkZWYgQ09ORklHX0FVRlNfV09SS0FST1VORF9G
VVNFCisJLmdldGF0dHIJPSBhdWZzX2dldGF0dHIsCisjZW5kaWYKKworCS5yZWFkbGluawk9IGF1
ZnNfcmVhZGxpbmssCisJLmZvbGxvd19saW5rCT0gYXVmc19mb2xsb3dfbGluaywKKwkucHV0X2xp
bmsJPSBhdWZzX3B1dF9saW5rCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhdWZzX2Rp
cl9pb3AgPSB7CisJLmNyZWF0ZQkJPSBhdWZzX2NyZWF0ZSwKKwkubG9va3VwCQk9IGF1ZnNfbG9v
a3VwLAorCS5saW5rCQk9IGF1ZnNfbGluaywKKwkudW5saW5rCQk9IGF1ZnNfdW5saW5rLAorCS5z
eW1saW5rCT0gYXVmc19zeW1saW5rLAorCS5ta2RpcgkJPSBhdWZzX21rZGlyLAorCS5ybWRpcgkJ
PSBhdWZzX3JtZGlyLAorCS5ta25vZAkJPSBhdWZzX21rbm9kLAorCS5yZW5hbWUJCT0gYXVmc19y
ZW5hbWUsCisKKwkucGVybWlzc2lvbgk9IGF1ZnNfcGVybWlzc2lvbiwKKwkuc2V0YXR0cgk9IGF1
ZnNfc2V0YXR0ciwKKyNpZmRlZiBDT05GSUdfQVVGU19XT1JLQVJPVU5EX0ZVU0UKKwkuZ2V0YXR0
cgk9IGF1ZnNfZ2V0YXR0ciwKKyNlbmRpZgorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMg
YXVmc19pb3AgPSB7CisJLnBlcm1pc3Npb24JPSBhdWZzX3Blcm1pc3Npb24sCisJLnNldGF0dHIJ
PSBhdWZzX3NldGF0dHIsCisjaWZkZWYgQ09ORklHX0FVRlNfV09SS0FST1VORF9GVVNFCisJLmdl
dGF0dHIJPSBhdWZzX2dldGF0dHIsCisjZW5kaWYKKworCS8vdm9pZCAoKnRydW5jYXRlKSAoc3Ry
dWN0IGlub2RlICopOworCS50cnVuY2F0ZV9yYW5nZQk9IGF1ZnNfdHJ1bmNhdGVfcmFuZ2UsCit9
OwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvaV9vcF9kZWwu
YyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvaV9vcF9kZWwuYwotLS0gbGludXgtMi42
LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvaV9vcF9kZWwuYwkxOTcwLTAxLTAxIDAzOjAwOjAw
ICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvaV9vcF9kZWwuYwkyMDA4
LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEsNTY2IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9ncmFtLCBhdWZz
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkK
KyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIg
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0
d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogaW5vZGUgb3BlcmF0aW9u
cyAoZGVsIGVudHJ5KQorICoKKyAqICRJZDogaV9vcF9kZWwuYyx2IDEuNCAyMDA4LzA1LzA0IDIz
OjU0OjUzIHNmanJvIEV4cCAkCisgKi8KKworI2luY2x1ZGUgImF1ZnMuaCIKKworLyogcmV0dXJu
cywKKyAqIDA6IHdoIGlzIHVubmVjZXNzYXJ5CisgKiBwbHVzOiB3aCBpcyBuZWNlc3NhcnkKKyAq
IG1pbnVzOiBlcnJvcgorICovCitpbnQgYXVfd3JfZGlyX25lZWRfd2goc3RydWN0IGRlbnRyeSAq
ZGVudHJ5LCBpbnQgaXNkaXIsIGF1ZnNfYmluZGV4X3QgKmJjcHVwLAorCQkgICAgICBzdHJ1Y3Qg
ZGVudHJ5ICpsb2NrZWQpCit7CisJaW50IG5lZWRfd2gsIGVycjsKKwlhdWZzX2JpbmRleF90IGJz
dGFydDsKKwlzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi
OworCisJTEtUUlRyYWNlKCIlLipzLCBpc2RpciAlZCwgKmJjcHVwICVkLCBsb2NrZWQgJXBcbiIs
CisJCSAgQXVETE5QYWlyKGRlbnRyeSksIGlzZGlyLCAqYmNwdXAsIGxvY2tlZCk7CisJc2IgPSBk
ZW50cnktPmRfc2I7CisKKwlic3RhcnQgPSBhdV9kYnN0YXJ0KGRlbnRyeSk7CisJTEtUUlRyYWNl
KCJiY3B1cCAlZCwgYnN0YXJ0ICVkXG4iLCAqYmNwdXAsIGJzdGFydCk7CisJaF9kZW50cnkgPSBh
dV9oX2RwdHIoZGVudHJ5LCBic3RhcnQpOworCWlmICgqYmNwdXAgPCAwKSB7CisJCSpiY3B1cCA9
IGJzdGFydDsKKwkJaWYgKGF1X3Rlc3Rfcm8oc2IsIGJzdGFydCwgZGVudHJ5LT5kX2lub2RlKSkg
eworCQkJZXJyID0gQXVXYnJDb3B5dXAoYXVfc2JpKHNiKSwgZGVudHJ5KTsKKwkJCSpiY3B1cCA9
IGVycjsKKwkJCS8vZXJyID0gLTE7CisJCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCQkJZ290
byBvdXQ7CisJCX0KKwl9IGVsc2UKKwkJQXVEZWJ1Z09uKGJzdGFydCA8ICpiY3B1cAorCQkJICB8
fCBhdV90ZXN0X3JvKHNiLCAqYmNwdXAsIGRlbnRyeS0+ZF9pbm9kZSkpOworCUxLVFJUcmFjZSgi
YmNwdXAgJWQsIGJzdGFydCAlZFxuIiwgKmJjcHVwLCBic3RhcnQpOworCisJaWYgKCpiY3B1cCAh
PSBic3RhcnQpIHsKKwkJZXJyID0gYXVfY3B1cF9kaXJzKGRlbnRyeSwgKmJjcHVwLCBsb2NrZWQp
OworCQkvL2VyciA9IC0xOworCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCWdvdG8gb3V0OworCQlu
ZWVkX3doID0gMTsKKwl9IGVsc2UgeworCQkvL3N0cnVjdCBuYW1laWRhdGEgbmQ7CisJCWF1ZnNf
YmluZGV4X3Qgb2xkX2JlbmQsIG5ld19iZW5kLCBiZGlyb3BxID0gLTE7CisJCW9sZF9iZW5kID0g
YXVfZGJlbmQoZGVudHJ5KTsKKwkJaWYgKGlzZGlyKSB7CisJCQliZGlyb3BxID0gYXVfZGJkaXJv
cHEoZGVudHJ5KTsKKwkJCWF1X3NldF9kYmRpcm9wcShkZW50cnksIC0xKTsKKwkJfQorCQluZWVk
X3doID0gYXVfbGt1cF9kZW50cnkoZGVudHJ5LCBic3RhcnQgKyAxLCAvKnR5cGUqLzAsCisJCQkJ
CSAvKm5kKi9OVUxMKTsKKwkJZXJyID0gbmVlZF93aDsKKwkJLy9lcnIgPSAtMTsKKwkJaWYgKGlz
ZGlyKQorCQkJYXVfc2V0X2RiZGlyb3BxKGRlbnRyeSwgYmRpcm9wcSk7CisJCWlmICh1bmxpa2Vs
eShlcnIgPCAwKSkKKwkJCWdvdG8gb3V0OworCQluZXdfYmVuZCA9IGF1X2RiZW5kKGRlbnRyeSk7
CisJCWlmICghbmVlZF93aCAmJiBvbGRfYmVuZCAhPSBuZXdfYmVuZCkgeworCQkJYXVfc2V0X2hf
ZHB0cihkZW50cnksIG5ld19iZW5kLCBOVUxMKTsKKwkJCWF1X3NldF9kYmVuZChkZW50cnksIG9s
ZF9iZW5kKTsKKwkJfQorCX0KKwlMS1RSVHJhY2UoIm5lZWRfd2ggJWRcbiIsIG5lZWRfd2gpOwor
CWVyciA9IG5lZWRfd2g7CisKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7
Cit9CisKKy8qCisgKiBzaW1wbGUgdGVzdHMgZm9yIHRoZSByZW1vdmFsIGlub2RlIG9wZXJhdGlv
bnMuCisgKiBmb2xsb3dpbmcgdGhlIGNoZWNrcyBpbiB2ZnMsIHBsdXMgdGhlIHBhcmVudC1jaGls
ZCByZWxhdGlvbnNoaXAuCisgKi8KK2ludCBhdV9tYXlfZGVsKHN0cnVjdCBkZW50cnkgKmRlbnRy
eSwgYXVmc19iaW5kZXhfdCBiaW5kZXgsCisJICAgICAgIHN0cnVjdCBkZW50cnkgKmhfcGFyZW50
LCBpbnQgaXNkaXIsIHN0cnVjdCBhdV9uZHggKm5keCkKK3sKKwlpbnQgZXJyLCBleGlzdDsKKwlz
dHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBkZW50cnkgKmhfZGVudHJ5OworCXN0cnVj
dCBpbm9kZSAqaF9pbm9kZTsKKwl1bW9kZV90IGhfbW9kZTsKKworCUxLVFJUcmFjZSgiJS4qcy8l
LipzLCBiJWQsIGRpciAlZFxuIiwKKwkJICBBdURMTlBhaXIoaF9wYXJlbnQpLCBBdURMTlBhaXIo
ZGVudHJ5KSwgYmluZGV4LCBpc2Rpcik7CisKKwlzYiA9IGRlbnRyeS0+ZF9zYjsKKwlleGlzdCA9
ICEhZGVudHJ5LT5kX2lub2RlOworCWhfZGVudHJ5ID0gYXVfaF9kcHRyKGRlbnRyeSwgYmluZGV4
KTsKKwloX2lub2RlID0gaF9kZW50cnktPmRfaW5vZGU7CisJaWYgKGV4aXN0KSB7CisJCWVyciA9
IC1FTk9FTlQ7CisJCWlmICh1bmxpa2VseSghaF9pbm9kZSB8fCAhaF9pbm9kZS0+aV9ubGluaykp
CisJCQlnb3RvIG91dDsKKworCQloX21vZGUgPSBoX2lub2RlLT5pX21vZGU7CisJCWlmICghaXNk
aXIpIHsKKwkJCWVyciA9IC1FSVNESVI7CisJCQlpZiAodW5saWtlbHkoU19JU0RJUihoX21vZGUp
KSkKKwkJCQlnb3RvIG91dDsKKwkJfSBlbHNlIGlmICh1bmxpa2VseSghU19JU0RJUihoX21vZGUp
KSkgeworCQkJZXJyID0gLUVOT1RESVI7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJ
CS8qIHJlbmFtZSgyKSBjYXNlICovCisJCWVyciA9IC1FSU87CisJCWlmICh1bmxpa2VseShoX2lu
b2RlKSkKKwkJCWdvdG8gb3V0OworCX0KKworCWVyciA9IC1FTk9FTlQ7CisJLyogZXhwZWN0ZWQg
cGFyZW50IGRpciBpcyBsb2NrZWQgKi8KKwlpZiAodW5saWtlbHkoaF9wYXJlbnQgIT0gaF9kZW50
cnktPmRfcGFyZW50KSkKKwkJZ290byBvdXQ7CisJZXJyID0gMDsKKworCS8qCisJICogc29tZSBm
aWxlc3lzdGVtIG1heSB1bmxpbmsgYSBkaXIgYW5kIGNvcnJ1cHQgaXRzIGNvbnNpc3RlbmN5Lgor
CSAqIHNvIGxldCdzIHRyeSBoZWF2eSB0ZXN0LgorCSAqLworCWlmICgxIC8qdW5saWtlbHkoYXVf
b3B0X3Rlc3QoYXVfbW50ZmxhZ3Moc2IpLCBVREJBX0lOT1RJRlkpKSovKSB7CisJCXN0cnVjdCBk
ZW50cnkgKmhfbGF0ZXN0OworCQlzdHJ1Y3QgcXN0ciAqcXN0ciA9ICZkZW50cnktPmRfbmFtZTsK
KworCQllcnIgPSAtRUFDQ0VTOworCQlpZiAodW5saWtlbHkoYXVfdGVzdF9oX3Blcm0oaF9wYXJl
bnQtPmRfaW5vZGUsCisJCQkJCSAgICBNQVlfRVhFQyB8IE1BWV9XUklURSwKKwkJCQkJICAgIGF1
X2Z0ZXN0X25keChuZHgtPmZsYWdzLCBETEdUKSkpKQorCQkJZ290byBvdXQ7CisKKwkJaF9sYXRl
c3QgPSBhdV9zaW9fbGt1cF9vbmUocXN0ci0+bmFtZSwgaF9wYXJlbnQsIHFzdHItPmxlbiwKKwkJ
CQkJICAgbmR4KTsKKwkJLy9lcnIgPSBQVFJfRVJSKGhfbGF0ZXN0KTsKKwkJZXJyID0gLUVJTzsK
KwkJaWYgKElTX0VSUihoX2xhdGVzdCkpCisJCQlnb3RvIG91dDsKKwkJZHB1dChoX2xhdGVzdCk7
CisJCWlmIChoX2xhdGVzdCA9PSBoX2RlbnRyeSkKKwkJCWVyciA9IDA7CisJfQorCisgb3V0Ogor
CUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRy
eSAqCitsb2NrX2hkaXJfY3JlYXRlX3doKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGlzZGly
LCBhdWZzX2JpbmRleF90ICpyYmNwdXAsCisJCSAgICBzdHJ1Y3QgYXVfZHRpbWUgKmR0KQorewor
CXN0cnVjdCBkZW50cnkgKndoX2RlbnRyeTsKKwlpbnQgZXJyLCBuZWVkX3doOworCXN0cnVjdCBk
ZW50cnkgKmhfcGFyZW50LCAqcGFyZW50LCAqZ3BhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmRpciwg
KmhfZGlyLCAqZ2RpcjsKKwlzdHJ1Y3QgYXVfbmR4IG5keDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sg
KnNiOworCXN0cnVjdCBhdV9oaW5vZGUgKmhnZGlyOworCWF1ZnNfYmluZGV4X3QgYmNwdXA7CisJ
dW5zaWduZWQgaW50IG1udF9mbGFnczsKKworCUxLVFJUcmFjZSgiJS4qcywgaXNkaXIgJWRcbiIs
IEF1RExOUGFpcihkZW50cnkpLCBpc2Rpcik7CisKKwluZWVkX3doID0gYXVfd3JfZGlyX25lZWRf
d2goZGVudHJ5LCBpc2RpciwgcmJjcHVwLCBOVUxMKTsKKwllcnIgPSBuZWVkX3doOworCS8vZXJy
ID0gLTE7CisJd2hfZGVudHJ5ID0gRVJSX1BUUihlcnIpOworCWlmICh1bmxpa2VseShlcnIgPCAw
KSkKKwkJZ290byBvdXQ7CisKKwkvL3RvZG86IG1lYW5pbmdsZXNzIGxvY2sgaWYgQ09ORklHX0FV
RlNfREVCVUcgaXMgZGlzYWJsZWQuCisJaGdkaXIgPSBOVUxMOworCWJjcHVwID0gKnJiY3B1cDsK
KwlzYiA9IGRlbnRyeS0+ZF9zYjsKKwltbnRfZmxhZ3MgPSBhdV9tbnRmbGFncyhzYik7CisJcGFy
ZW50ID0gZGVudHJ5LT5kX3BhcmVudDsgLyogZGlyIGlub2RlIGlzIGxvY2tlZCAqLworCWlmICh1
bmxpa2VseShhdV9vcHRfdGVzdChtbnRfZmxhZ3MsIFVEQkFfSU5PVElGWSkKKwkJICAgICAmJiAh
SVNfUk9PVChwYXJlbnQpKSkgeworCQlncGFyZW50ID0gZGdldF9wYXJlbnQocGFyZW50KTsKKwkJ
Z2RpciA9IGdwYXJlbnQtPmRfaW5vZGU7CisJCWlpX3JlYWRfbG9ja19wYXJlbnQyKGdkaXIpOwor
CQloZ2RpciA9IGF1X2hpKGdkaXIsIGJjcHVwKTsKKwkJaWlfcmVhZF91bmxvY2soZ2Rpcik7CisJ
CWRwdXQoZ3BhcmVudCk7CisJfQorCWRpciA9IHBhcmVudC0+ZF9pbm9kZTsKKwlJTXVzdExvY2so
ZGlyKTsKKwloX3BhcmVudCA9IGF1X2hfZHB0cihwYXJlbnQsIGJjcHVwKTsKKwloX2RpciA9IGhf
cGFyZW50LT5kX2lub2RlOworCisJQXVEYmdTbGVlcF9VZGJhUmFjZSgpOworCWF1X2hkaXJfbG9j
ayhoX2RpciwgZGlyLCBiY3B1cCk7CisJLy90b2RvOiByZXZhbGlkYXRlIHRoZSBsb3dlciBkZW50
cnk/CisKKwlpZiAoIWF1X29wdF90ZXN0KG1udF9mbGFncywgVURCQV9OT05FKSAmJiBhdV9kYnN0
YXJ0KGRlbnRyeSkgPT0gYmNwdXApIHsKKwkJbmR4Lm5mc21udCA9IGF1X25mc21udChzYiwgYmNw
dXApOworCQluZHguZmxhZ3MgPSAwOworCQlpZiAodW5saWtlbHkoYXVfb3B0X3Rlc3RfZGxndCht
bnRfZmxhZ3MpKSkKKwkJCWF1X2ZzZXRfbmR4KG5keC5mbGFncywgRExHVCk7CisJCW5keC5uZCA9
IE5VTEw7CisJCS8vbmR4LmJyID0gYXVfc2JyKHNiLCBiY3B1cCk7CisJCS8vbmR4Lm5kX2ZpbGUg
PSBOVUxMOworCQllcnIgPSBhdV9tYXlfZGVsKGRlbnRyeSwgYmNwdXAsIGhfcGFyZW50LCBpc2Rp
ciwgJm5keCk7CisJCXdoX2RlbnRyeSA9IEVSUl9QVFIoZXJyKTsKKwkJaWYgKHVubGlrZWx5KGVy
cikpCisJCQlnb3RvIG91dF9kaXI7CisJfQorCisJYXVfZHRpbWVfc3RvcmUoZHQsIHBhcmVudCwg
aF9wYXJlbnQsIGhnZGlyKTsKKwl3aF9kZW50cnkgPSBOVUxMOworCWlmICghbmVlZF93aCkKKwkJ
Z290byBvdXQ7IC8qIHN1Y2Nlc3MsIG5vIG5lZWQgdG8gY3JlYXRlIHdoaXRlb3V0ICovCisKKwlu
ZHgubmZzbW50ID0gYXVfbmZzbW50KHNiLCBiY3B1cCk7CisJbmR4LmZsYWdzID0gMDsKKwlpZiAo
dW5saWtlbHkoYXVfb3B0X3Rlc3RfZGxndChtbnRfZmxhZ3MpKSkKKwkJYXVfZnNldF9uZHgobmR4
LmZsYWdzLCBETEdUKTsKKwluZHgubmQgPSBOVUxMOworCS8vbmR4LmJyID0gTlVMTDsKKwl3aF9k
ZW50cnkgPSBhdV93aF9jcmVhdGUoZGlyLCBkZW50cnksIGJjcHVwLCBoX3BhcmVudCwgJm5keCk7
CisJLy93aF9kZW50cnkgPSBFUlJfUFRSKC0xKTsKKwlpZiAoIUlTX0VSUih3aF9kZW50cnkpKQor
CQlnb3RvIG91dDsgLyogc3VjY2VzcyAqLworCS8qIHJldHVybnMgd2l0aCB0aGUgcGFyZW50IGlz
IGxvY2tlZCBhbmQgd2hfZGVudHJ5IGlzIERHRVRlZCAqLworCisgb3V0X2RpcjoKKwlhdV9oZGly
X3VubG9jayhoX2RpciwgZGlyLCBiY3B1cCk7Cisgb3V0OgorCUF1VHJhY2VFcnJQdHIod2hfZGVu
dHJ5KTsKKwlyZXR1cm4gd2hfZGVudHJ5OworfQorCitzdGF0aWMgaW50IHJlbndoX2FuZF9ybWRp
cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmluZGV4LAorCQkJICAgc3Ry
dWN0IGF1X25oYXNoICp3aGxpc3QsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCWludCBybWRpcl9s
YXRlciwgZXJyOworCXN0cnVjdCBkZW50cnkgKmhfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5v
ZGUsICpoX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisKKwlMS1RSVHJhY2UoIiUu
KnMsIGIlZFxuIiwgQXVETE5QYWlyKGRlbnRyeSksIGJpbmRleCk7CisKKwlpbm9kZSA9IE5VTEw7
CisJaF9pbm9kZSA9IE5VTEw7CisJc2IgPSBkZW50cnktPmRfc2I7CisJaWYgKHVubGlrZWx5KGF1
X29wdF90ZXN0KGF1X21udGZsYWdzKHNiKSwgVURCQV9JTk9USUZZKSkpIHsKKwkJaW5vZGUgPSBk
ZW50cnktPmRfaW5vZGU7CisJCWhfaW5vZGUgPSBhdV9oX2lwdHIoaW5vZGUsIGJpbmRleCk7CisJ
CWF1X2hkaXIyX2xvY2soaF9pbm9kZSwgaW5vZGUsIGJpbmRleCk7CisJfQorCWVyciA9IGF1X3do
dG1wX3JlbihkaXIsIGRlbnRyeSwgYmluZGV4LCAvKm5vc2VsZiovMSk7CisJaWYgKHVubGlrZWx5
KGlub2RlKSkKKwkJYXVfaGRpcl91bmxvY2soaF9pbm9kZSwgaW5vZGUsIGJpbmRleCk7CisJLy9l
cnIgPSAtMTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXQ7CisKKwloX2RlbnRyeSA9
IGF1X2hfZHB0cihkZW50cnksIGJpbmRleCk7CisJaWYgKCFhdV90ZXN0X25mcyhoX2RlbnRyeS0+
ZF9zYikpIHsKKwkJY29uc3QgaW50IGRpcndoID0gYXVfc2JpKHNiKS0+c2lfZGlyd2g7CisJCXJt
ZGlyX2xhdGVyID0gKGRpcndoIDw9IDEpOworCQlpZiAoIXJtZGlyX2xhdGVyKQorCQkJcm1kaXJf
bGF0ZXIgPSBhdV9uaGFzaF90ZXN0X2xvbmdlcl93aCh3aGxpc3QsIGJpbmRleCwKKwkJCQkJCQkg
ICAgICBkaXJ3aCk7CisJCWlmIChybWRpcl9sYXRlcikKKwkJCXJldHVybiBybWRpcl9sYXRlcjsK
Kwl9CisKKwllcnIgPSBhdV93aHRtcF9ybWRpcihoX2RlbnRyeSwgd2hsaXN0LCBiaW5kZXgsIGRp
ciwgZGVudHJ5LT5kX2lub2RlLAorCQkJICAgICAvKm5vc2VsZiovMSk7CisJLy9lcnIgPSAtMTsK
KwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlBdUlPRXJyKCJybWRpciAlLipzLCBiJWQgZmFpbGVk
LCAlZC4gaWdub3JlZFxuIiwKKwkJCUF1RExOUGFpcihoX2RlbnRyeSksIGJpbmRleCwgZXJyKTsK
KwkJZXJyID0gMDsKKwl9CisKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7
Cit9CisKK3N0YXRpYyB2b2lkIGVwaWxvZyhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRy
eSAqZGVudHJ5LAorCQkgICBhdWZzX2JpbmRleF90IGJpbmRleCkKK3sKKwkvL3RvZG86IHVubmVj
ZXNzYXJ5PworCWRfZHJvcChkZW50cnkpOworCWRlbnRyeS0+ZF9pbm9kZS0+aV9jdGltZSA9IGRp
ci0+aV9jdGltZTsKKworCWlmIChhdG9taWNfcmVhZCgmZGVudHJ5LT5kX2NvdW50KSA9PSAxKSB7
CisJCWF1X3NldF9oX2RwdHIoZGVudHJ5LCBhdV9kYnN0YXJ0KGRlbnRyeSksIE5VTEwpOworCQlh
dV91cGRhdGVfZGJzdGFydChkZW50cnkpOworCX0KKwlpZiAoYXVfaWJzdGFydChkaXIpID09IGJp
bmRleCkKKwkJYXVfY3B1cF9hdHRyX3RpbWVzaXplcyhkaXIpOworCWRpci0+aV92ZXJzaW9uKys7
Cit9CisKKy8qIHJldmVydCBmbGFncyAqLworI2RlZmluZSBBdVJldl9ETEdUCTEKKyNkZWZpbmUg
YXVfZnRlc3RfcmV2KGZsYWdzLCBuYW1lKQkoKGZsYWdzKSAmIEF1UmV2XyMjbmFtZSkKKyNkZWZp
bmUgYXVfZnNldF9yZXYoZmxhZ3MsIG5hbWUpCXsgKGZsYWdzKSB8PSBBdVJldl8jI25hbWU7IH0K
KyNkZWZpbmUgYXVfZmNscl9yZXYoZmxhZ3MsIG5hbWUpCXsgKGZsYWdzKSAmPSB+QXVSZXZfIyNu
YW1lOyB9CisjaWZuZGVmIENPTkZJR19BVUZTX0RMR1QKKyN1bmRlZiBBdVJldl9ETEdUCisjZGVm
aW5lIEF1UmV2X0RMR1QJMAorI2VuZGlmCisKK3N0YXRpYyBpbnQgZG9fcmV2ZXJ0KGludCBlcnIs
IHN0cnVjdCBkZW50cnkgKndoX2RlbnRyeSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAg
IGF1ZnNfYmluZGV4X3QgYndoLCBzdHJ1Y3QgYXVfZHRpbWUgKmR0LCB1bnNpZ25lZCBpbnQgZmxh
Z3MpCit7CisJaW50IHJlcnI7CisJc3RydWN0IGlub2RlICpkaXI7CisKKwlkaXIgPSB3aF9kZW50
cnktPmRfcGFyZW50LT5kX2lub2RlOyAvKiBkaXIgaW5vZGUgaXMgbG9ja2VkICovCisJSU11c3RM
b2NrKGRpcik7CisJcmVyciA9IGF1X3doX3VubGlua19kZW50cnkoZGlyLCB3aF9kZW50cnksIGRl
bnRyeSwgZGlyLAorCQkJCSAgIGF1X2Z0ZXN0X3JldihmbGFncywgRExHVCkpOworCS8vcmVyciA9
IC0xOworCWlmICghcmVycikgeworCQlhdV9zZXRfZGJ3aChkZW50cnksIGJ3aCk7CisJCWF1X2R0
aW1lX3JldmVydChkdCk7CisJCXJldHVybiAwOworCX0KKworCUF1SU9FcnIoIiUuKnMgcmV2ZXJ0
aW5nIHdoaXRlb3V0IGZhaWxlZCglZCwgJWQpXG4iLAorCQlBdURMTlBhaXIoZGVudHJ5KSwgZXJy
LCByZXJyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQg
YXVmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sK
KwlpbnQgZXJyLCBkbGd0OworCXN0cnVjdCBpbm9kZSAqaW5vZGUsICpoX2RpcjsKKwlzdHJ1Y3Qg
ZGVudHJ5ICpwYXJlbnQsICp3aF9kZW50cnksICpoX2RlbnRyeTsKKwlzdHJ1Y3QgYXVfZHRpbWUg
ZHQ7CisJYXVmc19iaW5kZXhfdCBid2gsIGJpbmRleCwgYnN0YXJ0OworCXN0cnVjdCBzdXBlcl9i
bG9jayAqc2I7CisJc3RydWN0IHZmc3ViX2FyZ3MgdmFyZ3M7CisKKwlMS1RSVHJhY2UoImklbHUs
ICUuKnNcbiIsIGRpci0+aV9pbm8sIEF1RExOUGFpcihkZW50cnkpKTsKKwlJTXVzdExvY2soZGly
KTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpZiAodW5saWtlbHkoIWlub2RlKSkKKwkJ
cmV0dXJuIC1FTk9FTlQ7IC8qIHBvc3NpYmxlPyAqLworCUlNdXN0TG9jayhpbm9kZSk7CisKKwlh
dWZzX3JlYWRfbG9jayhkZW50cnksIEF1TG9ja19EVyk7CisJcGFyZW50ID0gZGVudHJ5LT5kX3Bh
cmVudDsgLyogZGlyIGlub2RlIGlzIGxvY2tlZCAqLworCWRpX3dyaXRlX2xvY2tfcGFyZW50KHBh
cmVudCk7CisKKwlic3RhcnQgPSBhdV9kYnN0YXJ0KGRlbnRyeSk7CisJYndoID0gYXVfZGJ3aChk
ZW50cnkpOworCWJpbmRleCA9IC0xOworCXdoX2RlbnRyeSA9IGxvY2tfaGRpcl9jcmVhdGVfd2go
ZGVudHJ5LCAvKmlzZGlyKi8wLCAmYmluZGV4LCAmZHQpOworCS8vd2hfZGVudHJ5ID0gRVJSX1BU
UigtMSk7CisJZXJyID0gUFRSX0VSUih3aF9kZW50cnkpOworCWlmIChJU19FUlIod2hfZGVudHJ5
KSkKKwkJZ290byBvdXQ7CisKKwlzYiA9IGRpci0+aV9zYjsKKwlkbGd0ID0gISFhdV9vcHRfdGVz
dF9kbGd0KGF1X21udGZsYWdzKHNiKSk7CisJQXVEZWJ1Z09uKGF1X2Ric3RhcnQoZGVudHJ5KSAh
PSBic3RhcnQpOworCWhfZGVudHJ5ID0gYXVfaF9kcHRyKGRlbnRyeSwgYnN0YXJ0KTsKKwlkZ2V0
KGhfZGVudHJ5KTsKKworCWlmIChiaW5kZXggPT0gYnN0YXJ0KSB7CisJCXZmc3ViX2FyZ3NfaW5p
dCgmdmFyZ3MsIE5VTEwsIGRsZ3QsIDApOworCQloX2RpciA9IGhfZGVudHJ5LT5kX3BhcmVudC0+
ZF9pbm9kZTsgLyogZGlyIGlub2RlIGlzIGxvY2tlZCAqLworCQlJTXVzdExvY2soaF9kaXIpOwor
CQllcnIgPSB2ZnN1Yl91bmxpbmsoaF9kaXIsIGhfZGVudHJ5LCAmdmFyZ3MpOworCQkvL2VyciA9
IC0xOworCX0gZWxzZSB7CisJCS8qIGRpciBpbm9kZSBpcyBsb2NrZWQgKi8KKwkJQXVEZWJ1Z09u
KCF3aF9kZW50cnkKKwkJCSAgfHwgd2hfZGVudHJ5LT5kX3BhcmVudCAhPSBhdV9oX2RwdHIocGFy
ZW50LCBiaW5kZXgpKTsKKwkJaF9kaXIgPSB3aF9kZW50cnktPmRfcGFyZW50LT5kX2lub2RlOwor
CQlJTXVzdExvY2soaF9kaXIpOworCQllcnIgPSAwOworCX0KKworCWlmICghZXJyKSB7CisJCWRy
b3BfbmxpbmsoaW5vZGUpOworCQllcGlsb2coZGlyLCBkZW50cnksIGJpbmRleCk7CisKKwkJLyog
dXBkYXRlIHRhcmdldCB0aW1lc3RhbXBzICovCisJCWlmIChiaW5kZXggPT0gYnN0YXJ0KSB7CisJ
CQlhdV91cGRhdGVfZnVzZV9oX2lub2RlKE5VTEwsIGhfZGVudHJ5KTsgLyppZ25vcmUqLworCQkJ
aW5vZGUtPmlfY3RpbWUgPSBoX2RlbnRyeS0+ZF9pbm9kZS0+aV9jdGltZTsKKwkJfSBlbHNlCisJ
CQkvL3RvZG86IHRoaXMgdGltZXN0YW1wIG1heSBiZSByZXZlcnRlZCBsYXRlcgorCQkJaW5vZGUt
PmlfY3RpbWUgPSBoX2Rpci0+aV9jdGltZTsKKwkJZ290byBvdXRfdW5sb2NrOyAvKiBzdWNjZXNz
ICovCisJfQorCisJLyogcmV2ZXJ0ICovCisJaWYgKHdoX2RlbnRyeSkgeworCQlpbnQgcmVycjsK
KwkJdW5zaWduZWQgaW50IHJldl9mbGFnczsKKworCQlyZXZfZmxhZ3MgPSAwOworCQlpZiAodW5s
aWtlbHkoZGxndCkpCisJCQlhdV9mc2V0X3JldihyZXZfZmxhZ3MsIERMR1QpOworCQlyZXJyID0g
ZG9fcmV2ZXJ0KGVyciwgd2hfZGVudHJ5LCBkZW50cnksIGJ3aCwgJmR0LCByZXZfZmxhZ3MpOwor
CQlpZiAocmVycikKKwkJCWVyciA9IHJlcnI7CisJfQorCisgb3V0X3VubG9jazoKKwlhdV9oZGly
X3VubG9jayhoX2RpciwgZGlyLCBiaW5kZXgpOworCWRwdXQod2hfZGVudHJ5KTsKKwlkcHV0KGhf
ZGVudHJ5KTsKKyBvdXQ6CisJZGlfd3JpdGVfdW5sb2NrKHBhcmVudCk7CisJYXVmc19yZWFkX3Vu
bG9jayhkZW50cnksIEF1TG9ja19EVyk7CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7
Cit9CisKK2ludCBhdWZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpk
ZW50cnkpCit7CisJaW50IGVyciwgcm1kaXJfbGF0ZXI7CisJc3RydWN0IGlub2RlICppbm9kZSwg
KmhfZGlyOworCXN0cnVjdCBkZW50cnkgKnBhcmVudCwgKndoX2RlbnRyeSwgKmhfZGVudHJ5Owor
CXN0cnVjdCBhdV9kdGltZSBkdDsKKwlhdWZzX2JpbmRleF90IGJ3aCwgYmluZGV4LCBic3RhcnQ7
CisJc3RydWN0IGF1X3dodG1wX3JtZGlyX2FyZ3MgKmFyZ3M7CisJc3RydWN0IGF1X25oYXNoICp3
aGxpc3Q7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwl1bnNpZ25lZCBpbnQgbW50X2ZsYWdz
OworCisJTEtUUlRyYWNlKCJpJWx1LCAlLipzXG4iLCBkaXItPmlfaW5vLCBBdURMTlBhaXIoZGVu
dHJ5KSk7CisJSU11c3RMb2NrKGRpcik7CisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaWYg
KHVubGlrZWx5KCFpbm9kZSkpCisJCXJldHVybiAtRU5PRU5UOyAvKiBwb3NzaWJsZT8gKi8KKwlJ
TXVzdExvY2soaW5vZGUpOworCisJd2hsaXN0ID0gYXVfbmhhc2hfbmV3KEdGUF9URU1QT1JBUlkp
OworCWVyciA9IFBUUl9FUlIod2hsaXN0KTsKKwlpZiAoSVNfRVJSKHdobGlzdCkpCisJCWdvdG8g
b3V0OworCisJZXJyID0gLUVOT01FTTsKKwlhcmdzID0ga21hbGxvYyhzaXplb2YoKmFyZ3MpLCBH
RlBfVEVNUE9SQVJZKTsKKwkvL2FyZ3MgPSBOVUxMOworCWlmICh1bmxpa2VseSghYXJncykpCisJ
CWdvdG8gb3V0X3dobGlzdDsKKworCWF1ZnNfcmVhZF9sb2NrKGRlbnRyeSwgQXVMb2NrX0RXKTsK
KwlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OyAvKiBkaXIgaW5vZGUgaXMgbG9ja2VkICovCisJ
ZGlfd3JpdGVfbG9ja19wYXJlbnQocGFyZW50KTsKKwllcnIgPSBhdV90ZXN0X2VtcHR5KGRlbnRy
eSwgd2hsaXN0KTsKKwkvL2VyciA9IC0xOworCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIG91
dF9hcmdzOworCisJYnN0YXJ0ID0gYXVfZGJzdGFydChkZW50cnkpOworCWJ3aCA9IGF1X2Rid2go
ZGVudHJ5KTsKKwliaW5kZXggPSAtMTsKKwl3aF9kZW50cnkgPSBsb2NrX2hkaXJfY3JlYXRlX3do
KGRlbnRyeSwgLyppc2RpciovMSwgJmJpbmRleCwgJmR0KTsKKwkvL3doX2RlbnRyeSA9IEVSUl9Q
VFIoLTEpOworCWVyciA9IFBUUl9FUlIod2hfZGVudHJ5KTsKKwlpZiAoSVNfRVJSKHdoX2RlbnRy
eSkpCisJCWdvdG8gb3V0X2FyZ3M7CisKKwlBdURlYnVnT24oYXVfZGJzdGFydChkZW50cnkpICE9
IGJzdGFydCk7CisJaF9kZW50cnkgPSBhdV9oX2RwdHIoZGVudHJ5LCBic3RhcnQpOworCWRnZXQo
aF9kZW50cnkpOworCisJcm1kaXJfbGF0ZXIgPSAwOworCWlmIChiaW5kZXggPT0gYnN0YXJ0KSB7
CisJCWhfZGlyID0gaF9kZW50cnktPmRfcGFyZW50LT5kX2lub2RlOyAvKiBkaXIgaW5vZGUgaXMg
bG9ja2VkICovCisJCUlNdXN0TG9jayhoX2Rpcik7CisJCWVyciA9IHJlbndoX2FuZF9ybWRpcihk
ZW50cnksIGJzdGFydCwgd2hsaXN0LCBkaXIpOworCQkvL2VyciA9IC0xOworCQlpZiAoZXJyID4g
MCkgeworCQkJcm1kaXJfbGF0ZXIgPSBlcnI7CisJCQllcnIgPSAwOworCQl9CisJfSBlbHNlIHsK
KwkJLyogZGlyIGlub2RlIGlzIGxvY2tlZCAqLworCQlBdURlYnVnT24oIXdoX2RlbnRyeQorCQkJ
ICB8fCB3aF9kZW50cnktPmRfcGFyZW50ICE9IGF1X2hfZHB0cihwYXJlbnQsIGJpbmRleCkpOwor
CQloX2RpciA9IHdoX2RlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJCUlNdXN0TG9jayhoX2Rp
cik7CisJCWVyciA9IDA7CisJfQorCisJc2IgPSBkZW50cnktPmRfc2I7CisJbW50X2ZsYWdzID0g
YXVfbW50ZmxhZ3Moc2IpOworCWlmICghZXJyKSB7CisJCS8vYXVmc19iaW5kZXhfdCBiaSwgYmVu
ZDsKKworCQlpZiAodW5saWtlbHkoYXVfb3B0X3Rlc3QobW50X2ZsYWdzLCBVREJBX0lOT1RJRlkp
CisJCQkgICAgICYmIHJtZGlyX2xhdGVyKSkKKwkJCWF1X3Jlc2V0X2hpbm90aWZ5KGlub2RlLCAv
KmZsYWdzKi8wKTsKKwkJY2xlYXJfbmxpbmsoaW5vZGUpOworCQlhdV9zZXRfZGJkaXJvcHEoZGVu
dHJ5LCAtMSk7CisJCWVwaWxvZyhkaXIsIGRlbnRyeSwgYmluZGV4KTsKKworCQlpZiAocm1kaXJf
bGF0ZXIpIHsKKwkJCWF1X3dodG1wX2tpY2tfcm1kaXIoaF9kZW50cnksIHdobGlzdCwgYnN0YXJ0
LCBkaXIsCisJCQkJCSAgICBpbm9kZSwgLypub3NlbGYqLzEsIGFyZ3MpOworCQkJYXJncyA9IE5V
TEw7CisJCX0KKworCQlnb3RvIG91dF91bmxvY2s7IC8qIHN1Y2Nlc3MgKi8KKwl9CisKKwkvKiBy
ZXZlcnQgKi8KKwlMS1RSTGFiZWwocmV2ZXJ0KTsKKwlpZiAod2hfZGVudHJ5KSB7CisJCWludCBy
ZXJyOworCQl1bnNpZ25lZCBpbnQgcmV2X2ZsYWdzOworCisJCXJldl9mbGFncyA9IDA7CisJCWlm
ICh1bmxpa2VseShhdV9vcHRfdGVzdF9kbGd0KG1udF9mbGFncykpKQorCQkJYXVfZnNldF9yZXYo
cmV2X2ZsYWdzLCBETEdUKTsKKwkJcmVyciA9IGRvX3JldmVydChlcnIsIHdoX2RlbnRyeSwgZGVu
dHJ5LCBid2gsICZkdCwgcmV2X2ZsYWdzKTsKKwkJaWYgKHJlcnIpCisJCQllcnIgPSByZXJyOwor
CX0KKworIG91dF91bmxvY2s6CisJYXVfaGRpcl91bmxvY2soaF9kaXIsIGRpciwgYmluZGV4KTsK
KwlkcHV0KHdoX2RlbnRyeSk7CisJZHB1dChoX2RlbnRyeSk7Cisgb3V0X2FyZ3M6CisJZGlfd3Jp
dGVfdW5sb2NrKHBhcmVudCk7CisJYXVmc19yZWFkX3VubG9jayhkZW50cnksIEF1TG9ja19EVyk7
CisJa2ZyZWUoYXJncyk7Cisgb3V0X3dobGlzdDoKKwlhdV9uaGFzaF9kZWwod2hsaXN0KTsKKyBv
dXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLXVyTiBsaW51eC0y
LjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9pX29wX3Jlbi5jIGxpbnV4LTIuNi4yNS40LXVu
aW9uZnMvZnMvYXVmcy9pX29wX3Jlbi5jCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcv
ZnMvYXVmcy9pX29wX3Jlbi5jCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIu
Ni4yNS40LXVuaW9uZnMvZnMvYXVmcy9pX29wX3Jlbi5jCTIwMDgtMDUtMjUgMTE6NTY6MDggKzAz
MDAKQEAgLTAsMCArMSw4MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBKdW5q
aXJvIE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBw
cm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEz
MDEgIFVTQQorICovCisKKy8qCisgKiBpbm9kZSBvcGVyYXRpb24gKHJlbmFtZSBlbnRyeSkKKyAq
IHRvZG86IHRoaXMgaXMgbW9uc3RlcgorICoKKyAqICRJZDogaV9vcF9yZW4uYyx2IDEuNCAyMDA4
LzA1LzA0IDIzOjUxOjQwIHNmanJvIEV4cCAkCisgKi8KKworI2luY2x1ZGUgImF1ZnMuaCIKKwor
ZW51bSB7IFNSQywgRFNUIH07CisKKyNkZWZpbmUgQXVSZW5fSVNESVIJMQorI2RlZmluZSBBdVJl
bl9JU1NBTUVESVIJKDEgPDwgMSkKKyNkZWZpbmUgQXVSZW5fV0hTUkMJKDEgPDwgMikKKyNkZWZp
bmUgQXVSZW5fV0hEU1QJKDEgPDwgMykKKyNkZWZpbmUgQXVSZW5fRExHVAkoMSA8PCA0KQorI2Rl
ZmluZSBhdV9mdGVzdF9yZW4oZmxhZ3MsIG5hbWUpCSgoZmxhZ3MpICYgQXVSZW5fIyNuYW1lKQor
I2RlZmluZSBhdV9mc2V0X3JlbihmbGFncywgbmFtZSkJeyAoZmxhZ3MpIHw9IEF1UmVuXyMjbmFt
ZTsgfQorI2RlZmluZSBhdV9mY2xyX3JlbihmbGFncywgbmFtZSkJeyAoZmxhZ3MpICY9IH5BdVJl
bl8jI25hbWU7IH0KKyNpZm5kZWYgQ09ORklHX0FVRlNfRExHVAorI3VuZGVmIEF1UmVuX0RMR1QK
KyNkZWZpbmUgQXVSZW5fRExHVAkwCisjZW5kaWYKKworc3RydWN0IHJlbmFtZV9hcmdzIHsKKwlz
dHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeVsyXSwgKnBhcmVudFsyXSwgKmhfcGFyZW50WzJdLCAqaF90
cmFwOworCXN0cnVjdCBhdV9uaGFzaCB3aGxpc3Q7CisJYXVmc19iaW5kZXhfdCBidGd0LCBic3Rh
cnRbMl07CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJ
dW5zaWduZWQgaW50IG1udF9mbGFnczsKK307CisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sg
aW50Citkb19yZW5hbWUoc3RydWN0IGlub2RlICpzcmNfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpzcmNf
ZGVudHJ5LAorCSAgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3Ry
dWN0IHJlbmFtZV9hcmdzICphKQoreworCWludCBlcnIsIG5lZWRfZGlyb3BxLCBieWNwdXAsIHJl
cnI7CisJc3RydWN0IGF1X3dodG1wX3JtZGlyX2FyZ3MgKnRoYXJnczsKKwlzdHJ1Y3QgZGVudHJ5
ICp3aF9kZW50cnlbMl0sICpoX2RzdCwgKmhfc3JjOworCXN0cnVjdCBpbm9kZSAqaF9kaXJbMl07
CisJYXVmc19iaW5kZXhfdCBiaW5kZXgsIGJlbmQ7CisJc3RydWN0IGF1X2hpbl9pZ25vcmUgaWdu
OworCXN0cnVjdCB2ZnN1Yl9hcmdzIHZhcmdzOworCXN0cnVjdCBhdV9uZHggbmR4ID0geworCQku
ZmxhZ3MJPSAwLAorCQkubmQJPSBOVUxMLAorCQkvLy5icgk9IE5VTEwKKwl9OworCisJTEtUUlRy
YWNlKCIlLipzLyUuKnMsICUuKnMvJS4qcywgIgorCQkgICJoZHslcCwgJXB9LCBocHslcCwgJXB9
LCB3aCAlcCwgYnRndCAlZCwgYnN0YXJ0eyVkLCAlZH0sICIKKwkJICAiZmxhZ3MgMHgleFxuIiwK
KwkJICBBdURMTlBhaXIoYS0+cGFyZW50W1NSQ10pLCBBdURMTlBhaXIoc3JjX2RlbnRyeSksCisJ
CSAgQXVETE5QYWlyKGEtPnBhcmVudFtEU1RdKSwgQXVETE5QYWlyKGRlbnRyeSksCisJCSAgYS0+
aF9kZW50cnlbU1JDXSwgYS0+aF9kZW50cnlbRFNUXSwKKwkJICBhLT5oX3BhcmVudFtTUkNdLCBh
LT5oX3BhcmVudFtEU1RdLAorCQkgICZhLT53aGxpc3QsIGEtPmJ0Z3QsCisJCSAgYS0+YnN0YXJ0
W1NSQ10sIGEtPmJzdGFydFtEU1RdLAorCQkgIGEtPmZsYWdzKTsKKworCWhfZGlyW1NSQ10gPSBh
LT5oX3BhcmVudFtTUkNdLT5kX2lub2RlOworCWhfZGlyW0RTVF0gPSBhLT5oX3BhcmVudFtEU1Rd
LT5kX2lub2RlOworCisJLyogcHJlcGFyZSB3b3JrcXVldWUgYXJncyAqLworCWhfZHN0ID0gTlVM
TDsKKwl0aGFyZ3MgPSBOVUxMOworCWlmIChhdV9mdGVzdF9yZW4oYS0+ZmxhZ3MsIElTRElSKSAm
JiBhLT5oX2RlbnRyeVtEU1RdLT5kX2lub2RlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCXRoYXJn
cyA9IGttYWxsb2Moc2l6ZW9mKCp0aGFyZ3MpLCBHRlBfVEVNUE9SQVJZKTsKKwkJLy90aGFyZ3Mg
PSBOVUxMOworCQlpZiAodW5saWtlbHkoIXRoYXJncykpCisJCQlnb3RvIG91dDsKKwkJaF9kc3Qg
PSBkZ2V0KGEtPmhfZGVudHJ5W0RTVF0pOworCX0KKworCXdoX2RlbnRyeVtTUkNdID0gTlVMTDsK
Kwl3aF9kZW50cnlbRFNUXSA9IE5VTEw7CisJbmR4Lm5mc21udCA9IGF1X25mc21udChhLT5zYiwg
YS0+YnRndCk7CisJaWYgKHVubGlrZWx5KGF1X2Z0ZXN0X3JlbihhLT5mbGFncywgRExHVCkpKQor
CQlhdV9mc2V0X25keChuZHguZmxhZ3MsIERMR1QpOworCisJLyogY3JlYXRlIHdoaXRlb3V0IGZv
ciBzcmNfZGVudHJ5ICovCisJaWYgKGF1X2Z0ZXN0X3JlbihhLT5mbGFncywgV0hTUkMpKSB7CisJ
CXdoX2RlbnRyeVtTUkNdID0gYXVfd2hfY3JlYXRlKHNyY19kaXIsIHNyY19kZW50cnksIGEtPmJ0
Z3QsCisJCQkJCSAgICAgIGEtPmhfcGFyZW50W1NSQ10sICZuZHgpOworCQkvL3doX2RlbnRyeVtT
UkNdID0gRVJSX1BUUigtMSk7CisJCWVyciA9IFBUUl9FUlIod2hfZGVudHJ5W1NSQ10pOworCQlp
ZiAoSVNfRVJSKHdoX2RlbnRyeVtTUkNdKSkKKwkJCWdvdG8gb3V0X3RoYXJnczsKKwl9CisKKwkv
KiBsb29rdXAgd2hpdGVvdXQgZm9yIGRlbnRyeSAqLworCWlmIChhdV9mdGVzdF9yZW4oYS0+Zmxh
Z3MsIFdIRFNUKSkgeworCQlzdHJ1Y3QgZGVudHJ5ICpkOworCisJCWQgPSBhdV93aF9sa3VwKGEt
PmhfcGFyZW50W0RTVF0sICZkZW50cnktPmRfbmFtZSwgJm5keCk7CisJCS8vZCA9IEVSUl9QVFIo
LTEpOworCQllcnIgPSBQVFJfRVJSKGQpOworCQlpZiAoSVNfRVJSKGQpKQorCQkJZ290byBvdXRf
d2hzcmM7CisJCWlmICghZC0+ZF9pbm9kZSkKKwkJCWRwdXQoZCk7CisJCWVsc2UKKwkJCXdoX2Rl
bnRyeVtEU1RdID0gZDsKKwl9CisKKwkvKiByZW5hbWUgZGVudHJ5IHRvIHRtcHdoICovCisJaWYg
KHRoYXJncykgeworCQllcnIgPSBhdV93aHRtcF9yZW4oZGlyLCBkZW50cnksIGEtPmJ0Z3QsIC8q
bm9zZWxmKi8wKTsKKwkJLy9lcnIgPSAtMTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3Rv
IG91dF93aGRzdDsKKwkJYXVfc2V0X2hfZHB0cihkZW50cnksIGEtPmJ0Z3QsIE5VTEwpOworCQll
cnIgPSBhdV9sa3VwX25lZyhkZW50cnksIGEtPmJ0Z3QpOworCQkvL2VyciA9IC0xOworCQlpZiAo
dW5saWtlbHkoZXJyKSkKKwkJCWdvdG8gb3V0X3dodG1wOworCQlhLT5oX2RlbnRyeVtEU1RdID0g
YXVfaF9kcHRyKGRlbnRyeSwgYS0+YnRndCk7CisJfQorCisJLyogY3B1cCBzcmMgKi8KKwlpZiAo
YS0+aF9kZW50cnlbRFNUXS0+ZF9pbm9kZSAmJiBhLT5ic3RhcnRbU1JDXSAhPSBhLT5idGd0KSB7
CisJCW11dGV4X2xvY2tfbmVzdGVkKCZhLT5oX2RlbnRyeVtTUkNdLT5kX2lub2RlLT5pX211dGV4
LAorCQkJCSAgQXVMc2NfSV9DSElMRCk7CisJCWVyciA9IGF1X3Npb19jcHVwX3NpbXBsZShzcmNf
ZGVudHJ5LCBhLT5idGd0LCAtMSwKKwkJCQkJICFBdUNwdXBfRFRJTUUpOworCQkvL2VyciA9IC0x
OyAvLyB1bnRlc3RlZCBkaXIKKwkJbXV0ZXhfdW5sb2NrKCZhLT5oX2RlbnRyeVtTUkNdLT5kX2lu
b2RlLT5pX211dGV4KTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dF93aHRtcDsK
Kwl9CisKKwkvKiByZW5hbWUgYnkgdmZzX3JlbmFtZSBvciBjcHVwICovCisJbmVlZF9kaXJvcHEg
PSBhdV9mdGVzdF9yZW4oYS0+ZmxhZ3MsIElTRElSKQorCQkmJiAod2hfZGVudHJ5W0RTVF0KKwkJ
ICAgIHx8IGF1X2RiZGlyb3BxKGRlbnRyeSkgPT0gYS0+YnRndAorCQkgICAgLyogaGlkZSB0aGUg
bG93ZXIgdG8ga2VlcCB4aW5vICovCisJCSAgICB8fCBhLT5idGd0IDwgYXVfZGJlbmQoZGVudHJ5
KQorCQkgICAgfHwgYXVfb3B0X3Rlc3QoYS0+bW50X2ZsYWdzLCBBTFdBWVNfRElST1BRKSk7CisJ
YnljcHVwID0gMDsKKwlpZiAoYXVfZGJzdGFydChzcmNfZGVudHJ5KSA9PSBhLT5idGd0KSB7CisJ
CWlmIChuZWVkX2Rpcm9wcSAmJiBhdV9kYmRpcm9wcShzcmNfZGVudHJ5KSA9PSBhLT5idGd0KQor
CQkJbmVlZF9kaXJvcHEgPSAwOworCQl2ZnN1Yl9hcmdzX2luaXQoJnZhcmdzLCAmaWduLCBhdV9m
dGVzdF9yZW4oYS0+ZmxhZ3MsIERMR1QpLCAwKTsKKwkJaWYgKHVubGlrZWx5KGF1X29wdF90ZXN0
KGEtPm1udF9mbGFncywgVURCQV9JTk9USUZZKQorCQkJICAgICAmJiBhdV9mdGVzdF9yZW4oYS0+
ZmxhZ3MsIElTRElSKSkpCisJCQl2ZnN1Yl9pZ25faGlub2RlKCZ2YXJncywgSU5fTU9WRV9TRUxG
LAorCQkJCQkgYXVfaGkoc3JjX2RlbnRyeS0+ZF9pbm9kZSwgYS0+YnRndCkpOworCQlBdURlYnVn
T24oYXVfZGJzdGFydChzcmNfZGVudHJ5KSAhPSBhLT5idGd0KTsKKwkJZXJyID0gdmZzdWJfcmVu
YW1lKGhfZGlyW1NSQ10sIGF1X2hfZHB0cihzcmNfZGVudHJ5LCBhLT5idGd0KSwKKwkJCQkgICBo
X2RpcltEU1RdLCBhLT5oX2RlbnRyeVtEU1RdLCAmdmFyZ3MpOworCQkvL2VyciA9IC0xOworCX0g
ZWxzZSB7CisJCWJ5Y3B1cCA9IDE7CisJCW11dGV4X2xvY2tfbmVzdGVkKCZhLT5oX2RlbnRyeVtT
UkNdLT5kX2lub2RlLT5pX211dGV4LAorCQkJCSAgQXVMc2NfSV9DSElMRCk7CisJCWF1X3NldF9k
YnN0YXJ0KHNyY19kZW50cnksIGEtPmJ0Z3QpOworCQlhdV9zZXRfaF9kcHRyKHNyY19kZW50cnks
IGEtPmJ0Z3QsIGRnZXQoYS0+aF9kZW50cnlbRFNUXSkpOworCQllcnIgPSBhdV9zaW9fY3B1cF9z
aW5nbGUoc3JjX2RlbnRyeSwgYS0+YnRndCwgYS0+YnN0YXJ0W1NSQ10sCisJCQkJCSAtMSwgIUF1
Q3B1cF9EVElNRSk7CisJCS8vZXJyID0gLTE7IC8vIHVudGVzdGVkIGRpcgorCQlpZiAodW5saWtl
bHkoZXJyKSkgeworCQkJYXVfc2V0X2hfZHB0cihzcmNfZGVudHJ5LCBhLT5idGd0LCBOVUxMKTsK
KwkJCWF1X3NldF9kYnN0YXJ0KHNyY19kZW50cnksIGEtPmJzdGFydFtTUkNdKTsKKwkJfQorCQlt
dXRleF91bmxvY2soJmEtPmhfZGVudHJ5W1NSQ10tPmRfaW5vZGUtPmlfbXV0ZXgpOworCX0KKwlp
ZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXRfd2h0bXA7CisKKwkvKiBtYWtlIGRpciBvcGFx
dWUgKi8KKwlpZiAobmVlZF9kaXJvcHEpIHsKKwkJc3RydWN0IGRlbnRyeSAqZGlyb3BxOworCQlz
dHJ1Y3QgaW5vZGUgKmhfaW5vZGU7CisKKwkJaF9pbm9kZSA9IGF1X2hfZHB0cihzcmNfZGVudHJ5
LCBhLT5idGd0KS0+ZF9pbm9kZTsKKwkJYXVfaGRpcl9sb2NrKGhfaW5vZGUsIHNyY19kZW50cnkt
PmRfaW5vZGUsIGEtPmJ0Z3QpOworCQlkaXJvcHEgPSBhdV9kaXJvcHFfY3JlYXRlKHNyY19kZW50
cnksIGEtPmJ0Z3QsCisJCQkJCSAgYXVfZnRlc3RfcmVuKGEtPmZsYWdzLCBETEdUKSk7CisJCS8v
ZGlyb3BxID0gRVJSX1BUUigtMSk7CisJCWF1X2hkaXJfdW5sb2NrKGhfaW5vZGUsIHNyY19kZW50
cnktPmRfaW5vZGUsIGEtPmJ0Z3QpOworCQllcnIgPSBQVFJfRVJSKGRpcm9wcSk7CisJCWlmIChJ
U19FUlIoZGlyb3BxKSkKKwkJCWdvdG8gb3V0X3JlbmFtZTsKKwkJZHB1dChkaXJvcHEpOworCX0K
KworCS8qIHVwZGF0ZSB0YXJnZXQgdGltZXN0YW1wcyAqLworCUF1RGVidWdPbihhdV9kYnN0YXJ0
KHNyY19kZW50cnkpICE9IGEtPmJ0Z3QpOworCWhfc3JjID0gYXVfaF9kcHRyKHNyY19kZW50cnks
IGEtPmJ0Z3QpOworCWF1X3VwZGF0ZV9mdXNlX2hfaW5vZGUoTlVMTCwgaF9zcmMpOyAvKmlnbm9y
ZSovCisJLy9mc3N0YWNrX2NvcHlfYXR0cl9hdGltZShzcmNfZGVudHJ5LT5kX2lub2RlLCBoX3Ny
Yy0+ZF9pbm9kZSk7CisJc3JjX2RlbnRyeS0+ZF9pbm9kZS0+aV9jdGltZSA9IGhfc3JjLT5kX2lu
b2RlLT5pX2N0aW1lOworCisJLyogcmVtb3ZlIHdoaXRlb3V0IGZvciBkZW50cnkgKi8KKwlpZiAo
d2hfZGVudHJ5W0RTVF0pIHsKKwkJZXJyID0gYXVfd2hfdW5saW5rX2RlbnRyeShoX2RpcltEU1Rd
LCB3aF9kZW50cnlbRFNUXSwKKwkJCQkJICBkZW50cnksIGRpciwgLypkbGd0Ki8wKTsKKwkJLy9l
cnIgPSAtMTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dF9kaXJvcHE7CisJfQor
CisJLyogcmVtb3ZlIHdodG1wICovCisJaWYgKHRoYXJncykgeworCQlpZiAoYXVfdGVzdF9uZnMo
aF9kc3QtPmRfc2IpCisJCSAgICB8fCAhYXVfbmhhc2hfdGVzdF9sb25nZXJfd2goJmEtPndobGlz
dCwgYS0+YnRndCwKKwkJCQkJCWF1X3NiaShhLT5zYiktPnNpX2RpcndoKSkgeworCQkJZXJyID0g
YXVfd2h0bXBfcm1kaXIoaF9kc3QsICZhLT53aGxpc3QsIGEtPmJ0Z3QsIGRpciwKKwkJCQkJICAg
ICBkZW50cnktPmRfaW5vZGUsIC8qbm9zZWxmKi8wKTsKKwkJCWlmICh1bmxpa2VseShlcnIpKQor
CQkJCUF1V2FybigiZmFpbGVkIHJlbW92aW5nIHdodG1wIGRpciAlLipzICglZCksICIKKwkJCQkg
ICAgICAgImlnbm9yZWQuXG4iLCBBdURMTlBhaXIoaF9kc3QpLCBlcnIpOworCQl9IGVsc2Ugewor
CQkJYXVfd2h0bXBfa2lja19ybWRpcihoX2RzdCwgJmEtPndobGlzdCwgYS0+YnRndCwgZGlyLAor
CQkJCQkgICAgZGVudHJ5LT5kX2lub2RlLCAvKm5vc2VsZiovMCwKKwkJCQkJICAgIHRoYXJncyk7
CisJCQlkcHV0KGhfZHN0KTsKKwkJCXRoYXJncyA9IE5VTEw7CisJCX0KKwl9CisJZXJyID0gMDsK
Kwlnb3RvIG91dF9zdWNjZXNzOworCisjZGVmaW5lIFJldmVydEZhaWx1cmUoZm10LCBhcmdzLi4u
KSBkbyB7IFwKKwkJQXVJT0VycldoY2soInJldmVydCBmYWlsdXJlOiAiIGZtdCAiICglZCwgJWQp
XG4iLCBcCisJCQkgICAgIyNhcmdzLCBlcnIsIHJlcnIpOyBcCisJCWVyciA9IC1FSU87IFwKKwl9
IHdoaWxlICgwKQorCisgb3V0X2Rpcm9wcToKKwlpZiAobmVlZF9kaXJvcHEpIHsKKwkJc3RydWN0
IGlub2RlICpoX2lub2RlOworCisJCWhfaW5vZGUgPSBhdV9oX2RwdHIoc3JjX2RlbnRyeSwgYS0+
YnRndCktPmRfaW5vZGU7CisJCS8vYnJfd2hfcmVhZF9sb2NrKGF1X3NicihhLT5zYiwgYS0+YnRn
dCkpOworCQkvKiBpX2xvY2sgc2ltcGx5IHNpbmNlIGlub3RpZnkgaXMgbm90IHNldCB0byBoX2lu
b2RlLiAqLworCQltdXRleF9sb2NrX25lc3RlZCgmaF9pbm9kZS0+aV9tdXRleCwgQXVMc2NfSV9Q
QVJFTlQpOworCQkvL2F1X2hkaXJfbG9jayhoX2lub2RlLCBzcmNfZGVudHJ5LT5kX2lub2RlLCBh
LT5idGd0KTsKKwkJcmVyciA9IGF1X2Rpcm9wcV9yZW1vdmUoc3JjX2RlbnRyeSwgYS0+YnRndCwK
KwkJCQkJYXVfZnRlc3RfcmVuKGEtPmZsYWdzLCBETEdUKSk7CisJCS8vcmVyciA9IC0xOworCQkv
L2F1X2hkaXJfdW5sb2NrKGhfaW5vZGUsIHNyY19kZW50cnktPmRfaW5vZGUsIGEtPmJ0Z3QpOwor
CQltdXRleF91bmxvY2soJmhfaW5vZGUtPmlfbXV0ZXgpOworCQkvL2JyX3doX3JlYWRfdW5sb2Nr
KGF1X3NicihhLT5zYiwgYS0+YnRndCkpOworCQlpZiAocmVycikKKwkJCVJldmVydEZhaWx1cmUo
InJlbW92ZSBkaXJvcHEgJS4qcyIsCisJCQkJICAgICAgQXVETE5QYWlyKHNyY19kZW50cnkpKTsK
Kwl9Cisgb3V0X3JlbmFtZToKKwlpZiAoIWJ5Y3B1cCkgeworCQlzdHJ1Y3QgZGVudHJ5ICpkOwor
CQlzdHJ1Y3QgcXN0ciAqbmFtZSA9ICZzcmNfZGVudHJ5LT5kX25hbWU7CisKKwkJZCA9IGF1X2xr
dXBfb25lKG5hbWUtPm5hbWUsIGEtPmhfcGFyZW50W1NSQ10sIG5hbWUtPmxlbiwgJm5keCk7CisJ
CS8vZCA9IEVSUl9QVFIoLTEpOworCQlyZXJyID0gUFRSX0VSUihkKTsKKwkJaWYgKElTX0VSUihk
KSkgeworCQkJUmV2ZXJ0RmFpbHVyZSgiYXVfbGt1cF9vbmUgJS4qcyIsCisJCQkJICAgICAgQXVE
TE5QYWlyKHNyY19kZW50cnkpKTsKKwkJCWdvdG8gb3V0X3dodG1wOworCQl9CisJCUF1RGVidWdP
bihkLT5kX2lub2RlKTsKKwkJdmZzdWJfYXJnc19pbml0KCZ2YXJncywgJmlnbiwgYXVfZnRlc3Rf
cmVuKGEtPmZsYWdzLCBETEdUKSwgMCk7CisJCWlmICh1bmxpa2VseShhdV9vcHRfdGVzdChhLT5t
bnRfZmxhZ3MsIFVEQkFfSU5PVElGWSkKKwkJCSAgICAgJiYgYXVfZnRlc3RfcmVuKGEtPmZsYWdz
LCBJU0RJUikpKQorCQkJdmZzdWJfaWduX2hpbm9kZSgmdmFyZ3MsIElOX01PVkVfU0VMRiwKKwkJ
CQkJIGF1X2hpKHNyY19kZW50cnktPmRfaW5vZGUsIGEtPmJ0Z3QpKTsKKwkJcmVyciA9IHZmc3Vi
X3JlbmFtZShoX2RpcltEU1RdLCBhdV9oX2RwdHIoc3JjX2RlbnRyeSwgYS0+YnRndCksCisJCQkJ
ICAgIGhfZGlyW1NSQ10sIGQsICZ2YXJncyk7CisJCS8vcmVyciA9IC0xOworCQlkX2Ryb3AoZCk7
CisJCWRwdXQoZCk7CisJCS8vYXVfc2V0X2hfZHB0cihzcmNfZGVudHJ5LCBhLT5idGd0LCBOVUxM
KTsKKwkJaWYgKHJlcnIpCisJCQlSZXZlcnRGYWlsdXJlKCJyZW5hbWUgJS4qcyIsIEF1RExOUGFp
cihzcmNfZGVudHJ5KSk7CisJfSBlbHNlIHsKKwkJdmZzdWJfYXJnc19pbml0KCZ2YXJncywgTlVM
TCwgYXVfZnRlc3RfcmVuKGEtPmZsYWdzLCBETEdUKSwgMCk7CisJCXJlcnIgPSB2ZnN1Yl91bmxp
bmsoaF9kaXJbRFNUXSwgYS0+aF9kZW50cnlbRFNUXSwgJnZhcmdzKTsKKwkJLy9yZXJyID0gLTE7
CisJCWF1X3NldF9oX2RwdHIoc3JjX2RlbnRyeSwgYS0+YnRndCwgTlVMTCk7CisJCWF1X3NldF9k
YnN0YXJ0KHNyY19kZW50cnksIGEtPmJzdGFydFtTUkNdKTsKKwkJaWYgKHJlcnIpCisJCQlSZXZl
cnRGYWlsdXJlKCJ1bmxpbmsgJS4qcyIsCisJCQkJICAgICAgQXVETE5QYWlyKGEtPmhfZGVudHJ5
W0RTVF0pKTsKKwl9Cisgb3V0X3dodG1wOgorCWlmICh0aGFyZ3MpIHsKKwkJc3RydWN0IGRlbnRy
eSAqZDsKKwkJc3RydWN0IHFzdHIgKm5hbWUgPSAmZGVudHJ5LT5kX25hbWU7CisKKwkJZCA9IGF1
X2xrdXBfb25lKG5hbWUtPm5hbWUsIGEtPmhfcGFyZW50W0RTVF0sIG5hbWUtPmxlbiwgJm5keCk7
CisJCS8vZCA9IEVSUl9QVFIoLTEpOworCQlyZXJyID0gUFRSX0VSUihkKTsKKwkJaWYgKElTX0VS
UihkKSkgeworCQkJUmV2ZXJ0RmFpbHVyZSgibG9va3VwICUuKnMiLCBBdUxOUGFpcihuYW1lKSk7
CisJCQlnb3RvIG91dF93aGRzdDsKKwkJfQorCQlpZiAoZC0+ZF9pbm9kZSkgeworCQkJZF9kcm9w
KGQpOworCQkJZHB1dChkKTsKKwkJCWdvdG8gb3V0X3doZHN0OworCQl9CisJCUF1RGVidWdPbihk
LT5kX2lub2RlKTsKKwkJdmZzdWJfYXJnc19pbml0KCZ2YXJncywgJmlnbiwgYXVfZnRlc3RfcmVu
KGEtPmZsYWdzLCBETEdUKSwgMCk7CisJCWlmICh1bmxpa2VseSgwICYmIGF1X29wdF90ZXN0KGEt
Pm1udF9mbGFncywgVURCQV9JTk9USUZZKQorCQkJICAgICAmJiBhdV9mdGVzdF9yZW4oYS0+Zmxh
Z3MsIElTRElSKSkpCisJCQl2ZnN1Yl9pZ25faGlub2RlKCZ2YXJncywgSU5fTU9WRV9TRUxGLAor
CQkJCQkgYXVfaGkoZGVudHJ5LT5kX2lub2RlLCBhLT5idGd0KSk7CisJCXJlcnIgPSB2ZnN1Yl9y
ZW5hbWUoaF9kaXJbRFNUXSwgaF9kc3QsIGhfZGlyW0RTVF0sIGQsICZ2YXJncyk7CisJCS8vcmVy
ciA9IC0xOworCQlkX2Ryb3AoZCk7CisJCWRwdXQoZCk7CisJCWlmIChyZXJyKSB7CisJCQlSZXZl
cnRGYWlsdXJlKCJyZW5hbWUgJS4qcyIsIEF1RExOUGFpcihoX2RzdCkpOworCQkJZ290byBvdXRf
d2hkc3Q7CisJCX0KKwkJYXVfc2V0X2hfZHB0cihkZW50cnksIGEtPmJ0Z3QsIE5VTEwpOworCQlh
dV9zZXRfaF9kcHRyKGRlbnRyeSwgYS0+YnRndCwgZGdldChoX2RzdCkpOworCX0KKyBvdXRfd2hk
c3Q6CisJZHB1dCh3aF9kZW50cnlbRFNUXSk7CisJd2hfZGVudHJ5W0RTVF0gPSBOVUxMOworIG91
dF93aHNyYzoKKwlpZiAod2hfZGVudHJ5W1NSQ10pIHsKKwkJcmVyciA9IGF1X3doX3VubGlua19k
ZW50cnkoaF9kaXJbU1JDXSwgd2hfZGVudHJ5W1NSQ10sCisJCQkJCSAgIHNyY19kZW50cnksIHNy
Y19kaXIsIC8qZGxndCovMCk7CisJCS8vcmVyciA9IC0xOworCQlpZiAocmVycikKKwkJCVJldmVy
dEZhaWx1cmUoInVubGluayAlLipzIiwgQXVETE5QYWlyKHdoX2RlbnRyeVtTUkNdKSk7CisJfQor
I3VuZGVmIFJldmVydEZhaWx1cmUKKwlkX2Ryb3Aoc3JjX2RlbnRyeSk7CisJYmVuZCA9IGF1X2Ri
ZW5kKHNyY19kZW50cnkpOworCWZvciAoYmluZGV4ID0gYXVfZGJzdGFydChzcmNfZGVudHJ5KTsg
YmluZGV4IDw9IGJlbmQ7IGJpbmRleCsrKSB7CisJCXN0cnVjdCBkZW50cnkgKmhkOworCisJCWhk
ID0gYXVfaF9kcHRyKHNyY19kZW50cnksIGJpbmRleCk7CisJCWlmIChoZCkKKwkJCWRfZHJvcCho
ZCk7CisJfQorCWRfZHJvcChkZW50cnkpOworCWJlbmQgPSBhdV9kYmVuZChkZW50cnkpOworCWZv
ciAoYmluZGV4ID0gYXVfZGJzdGFydChkZW50cnkpOyBiaW5kZXggPD0gYmVuZDsgYmluZGV4Kysp
IHsKKwkJc3RydWN0IGRlbnRyeSAqaGQ7CisKKwkJaGQgPSBhdV9oX2RwdHIoZGVudHJ5LCBiaW5k
ZXgpOworCQlpZiAoaGQpCisJCQlkX2Ryb3AoaGQpOworCX0KKwlhdV91cGRhdGVfZGJzdGFydChk
ZW50cnkpOworCWlmICh0aGFyZ3MpCisJCWRfZHJvcChoX2RzdCk7Cisgb3V0X3N1Y2Nlc3M6CisJ
ZHB1dCh3aF9kZW50cnlbU1JDXSk7CisJZHB1dCh3aF9kZW50cnlbRFNUXSk7Cisgb3V0X3RoYXJn
czoKKwlpZiAodGhhcmdzKSB7CisJCWRwdXQoaF9kc3QpOworCQlrZnJlZSh0aGFyZ3MpOworCX0K
KyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiB0ZXN0
IGlmIEBkZW50cnkgZGlyIGNhbiBiZSByZW5hbWUgZGVzdGluYXRpb24gb3Igbm90LgorICogc3Vj
Y2VzcyBtZWFucywgaXQgaXMgYSBsb2dpY2FsbHkgZW1wdHkgZGlyLgorICovCitzdGF0aWMgaW50
IG1heV9yZW5hbWVfZHN0ZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBi
dGd0LAorCQkJICAgICBzdHJ1Y3QgYXVfbmhhc2ggKndobGlzdCkKK3sKKwlMS1RSVHJhY2UoIiUu
KnNcbiIsIEF1RExOUGFpcihkZW50cnkpKTsKKworCXJldHVybiBhdV90ZXN0X2VtcHR5KGRlbnRy
eSwgd2hsaXN0KTsKK30KKworLyoKKyAqIHRlc3QgaWYgQGRlbnRyeSBkaXIgY2FuIGJlIHJlbmFt
ZSBzb3VyY2Ugb3Igbm90LgorICogaWYgaXQgY2FuLCByZXR1cm4gMCBhbmQgQGNoaWxkcmVuIGlz
IGZpbGxlZC4KKyAqIHN1Y2Nlc3MgbWVhbnMsCisgKiAtIG9yLCBpdCBpcyBhIGxvZ2ljYWxseSBl
bXB0eSBkaXIuCisgKiAtIG9yLCBpdCBleGlzdHMgb24gd3JpdGFibGUgYnJhbmNoIGFuZCBoYXMg
bm8gY2hpbGRyZW4gaW5jbHVkaW5nIHdoaXRlb3V0cworICogICAgICAgb24gdGhlIGxvd2VyIGJy
YW5jaC4KKyAqLworc3RhdGljIGludCBtYXlfcmVuYW1lX3NyY2RpcihzdHJ1Y3QgZGVudHJ5ICpk
ZW50cnksIGF1ZnNfYmluZGV4X3QgYnRndCkKK3sKKwlpbnQgZXJyOworCWF1ZnNfYmluZGV4X3Qg
YnN0YXJ0OworCisJTEtUUlRyYWNlKCIlLipzXG4iLCBBdURMTlBhaXIoZGVudHJ5KSk7CisKKwli
c3RhcnQgPSBhdV9kYnN0YXJ0KGRlbnRyeSk7CisJaWYgKGJzdGFydCAhPSBidGd0KSB7CisJCXN0
cnVjdCBhdV9uaGFzaCAqd2hsaXN0OworCisJCXdobGlzdCA9IGF1X25oYXNoX25ldyhHRlBfVEVN
UE9SQVJZKTsKKwkJZXJyID0gUFRSX0VSUih3aGxpc3QpOworCQlpZiAoSVNfRVJSKHdobGlzdCkp
CisJCQlnb3RvIG91dDsKKwkJZXJyID0gYXVfdGVzdF9lbXB0eShkZW50cnksIHdobGlzdCk7CisJ
CWF1X25oYXNoX2RlbCh3aGxpc3QpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYnN0YXJ0ID09
IGF1X2RidGFpbGRpcihkZW50cnkpKQorCQlyZXR1cm4gMDsgLyogc3VjY2VzcyAqLworCisJZXJy
ID0gYXVfdGVzdF9lbXB0eV9sb3dlcihkZW50cnkpOworCisgb3V0OgorCWlmICgvKiB1bmxpa2Vs
eSAqLyhlcnIgPT0gLUVOT1RFTVBUWSkpIHsKKwkJQXVXYXJuMSgicmVuYW1pbmcgZGlyIHdobyBo
YXMgY2hpbGQocmVuKSBvbiBtdWx0aXBsZSBicmFuY2hlcywiCisJCSAgICAgICIgaXMgbm90IHN1
cHBvcnRlZFxuIik7CisJCWVyciA9IC1FWERFVjsKKwl9CisJQXVUcmFjZUVycihlcnIpOworCXJl
dHVybiBlcnI7Cit9CisKKy8qIG1haW5seSBmb3IgbGluaygyKSBhbmQgcmVuYW1lKDIpICovCitp
bnQgYXVfd2JyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhfdCBidGd0KQorewor
CWF1ZnNfYmluZGV4X3QgYmRpcm9wcSwgYndoOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwor
CUxLVFJUcmFjZSgiJS4qcywgYiVkXG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgYnRndCk7CisJcGFy
ZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKKwlJTXVzdExvY2socGFyZW50LT5kX2lub2RlKTsgLyog
ZGlyIGlzIGxvY2tlZCAqLworCisJYmRpcm9wcSA9IGF1X2RiZGlyb3BxKHBhcmVudCk7CisJYndo
ID0gYXVfZGJ3aChkZW50cnkpOworCWlmIChhdV9icl9yZG9ubHkoYXVfc2JyKGRlbnRyeS0+ZF9z
YiwgYnRndCkpCisJCSAgICAgfHwgKDAgPD0gYmRpcm9wcSAmJiBiZGlyb3BxIDwgYnRndCkKKwkJ
ICAgICB8fCAoMCA8PSBid2ggJiYgYndoIDwgYnRndCkpCisJCWJ0Z3QgPSAtMTsKKworCUxLVFJU
cmFjZSgiYnRndCAlZFxuIiwgYnRndCk7CisJcmV0dXJuIGJ0Z3Q7Cit9CisKKy8vdG9kbzogbWVh
bmluZ2xlc3MgbG9jayBpZiBDT05GSUdfQVVGU19ERUJVRyBpcyBkaXNhYmxlZC4KK3N0YXRpYyB2
b2lkIGF1X2hnZGlycyhzdHJ1Y3QgYXVfaGlub2RlICoqaGdkaXIsIHN0cnVjdCByZW5hbWVfYXJn
cyAqYSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpncGFyZW50WzJdOworCXN0cnVjdCBpbm9kZSAqZ2Rp
cjsKKworCWlmICghYXVfb3B0X3Rlc3QoYS0+bW50X2ZsYWdzLCBVREJBX0lOT1RJRlkpKQorCQly
ZXR1cm47CisKKwlncGFyZW50W1NSQ10gPSBOVUxMOworCWlmICghSVNfUk9PVChhLT5wYXJlbnRb
U1JDXSkpIHsKKwkJZ3BhcmVudFtTUkNdID0gZGdldF9wYXJlbnQoYS0+cGFyZW50W1NSQ10pOwor
CQlnZGlyID0gZ3BhcmVudFtTUkNdLT5kX2lub2RlOworCQlpZiAoZ3BhcmVudFtTUkNdICE9IGEt
PnBhcmVudFtEU1RdKSB7CisJCQlpaV9yZWFkX2xvY2tfcGFyZW50MyhnZGlyKTsKKwkJCWhnZGly
W1NSQ10gPSBhdV9oaShnZGlyLCBhLT5idGd0KTsKKwkJCWlpX3JlYWRfdW5sb2NrKGdkaXIpOwor
CQl9IGVsc2UKKwkJCWhnZGlyW1NSQ10gPSBhdV9oaShnZGlyLCBhLT5idGd0KTsKKwkJZHB1dChn
cGFyZW50W1NSQ10pOworCX0KKworCWlmICghYXVfZnRlc3RfcmVuKGEtPmZsYWdzLCBJU1NBTUVE
SVIpCisJICAgICYmICFJU19ST09UKGEtPnBhcmVudFtEU1RdKQorCSAgICAmJiBhLT5wYXJlbnRb
RFNUXSAhPSBncGFyZW50W1NSQ10pIHsKKwkJZ3BhcmVudFtEU1RdID0gZGdldF9wYXJlbnQoYS0+
cGFyZW50W0RTVF0pOworCQlnZGlyID0gZ3BhcmVudFtEU1RdLT5kX2lub2RlOworCQlpZiAoZ3Bh
cmVudFtEU1RdICE9IGEtPnBhcmVudFtTUkNdKSB7CisJCQlpaV9yZWFkX2xvY2tfcGFyZW50Myhn
ZGlyKTsKKwkJCWhnZGlyW0RTVF0gPSBhdV9oaShnZGlyLCBhLT5idGd0KTsKKwkJCWlpX3JlYWRf
dW5sb2NrKGdkaXIpOworCQl9IGVsc2UKKwkJCWhnZGlyW0RTVF0gPSBhdV9oaShnZGlyLCBhLT5i
dGd0KTsKKwkJZHB1dChncGFyZW50W0RTVF0pOworCX0KK30KKworLyoKKyAqIHNpbXBsZSB0ZXN0
cyBmb3IgcmVuYW1lLgorICogZm9sbG93aW5nIHRoZSBjaGVja3MgaW4gdmZzLCBwbHVzIHRoZSBw
YXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwLgorICovCitzdGF0aWMgaW50IGF1X21heV9yZW4oc3Ry
dWN0IGlub2RlICpzcmNfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpzcmNfZGVudHJ5LAorCQkgICAgICBz
dHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgICBzdHJ1Y3Qg
cmVuYW1lX2FyZ3MgKmEsIHN0cnVjdCBhdV9uZHggKm5keCkKK3sKKwlpbnQgZXJyOworCXN0cnVj
dCBpbm9kZSAqaF9pbm9kZTsKKworCUF1VHJhY2VFbnRlcigpOworCisJaWYgKGEtPmJzdGFydFtT
UkNdID09IGEtPmJ0Z3QpIHsKKwkJZXJyID0gYXVfbWF5X2RlbChzcmNfZGVudHJ5LCBhLT5idGd0
LCBhLT5oX3BhcmVudFtTUkNdLAorCQkJCSBhdV9mdGVzdF9yZW4oYS0+ZmxhZ3MsIElTRElSKSwg
bmR4KTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gLUVJTlZB
TDsKKwkJaWYgKHVubGlrZWx5KGEtPmhfZGVudHJ5W1NSQ10gPT0gYS0+aF90cmFwKSkKKwkJCWdv
dG8gb3V0OworCX0KKworCWVyciA9IDA7CisJaWYgKGEtPmJzdGFydFtEU1RdICE9IGEtPmJ0Z3Qp
CisJCWdvdG8gb3V0OworCisJZXJyID0gLUVJTzsKKwloX2lub2RlID0gYS0+aF9kZW50cnlbRFNU
XS0+ZF9pbm9kZTsKKwlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkgeworCQlpZiAodW5saWtlbHkoaF9p
bm9kZSkpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gYXVfbWF5X2FkZChkZW50cnksIGEtPmJ0Z3Qs
IGEtPmhfcGFyZW50W0RTVF0sCisJCQkJIGF1X2Z0ZXN0X3JlbihhLT5mbGFncywgSVNESVIpLCBu
ZHgpOworCX0gZWxzZSB7CisJCWlmICh1bmxpa2VseSghaF9pbm9kZSB8fCAhaF9pbm9kZS0+aV9u
bGluaykpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gYXVfbWF5X2RlbChkZW50cnksIGEtPmJ0Z3Qs
IGEtPmhfcGFyZW50W0RTVF0sCisJCQkJIGF1X2Z0ZXN0X3JlbihhLT5mbGFncywgSVNESVIpLCBu
ZHgpOworCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCWdvdG8gb3V0OworCQllcnIgPSAtRU5PVEVN
UFRZOworCQlpZiAodW5saWtlbHkoYS0+aF9kZW50cnlbRFNUXSA9PSBhLT5oX3RyYXApKQorCQkJ
Z290byBvdXQ7CisJCWVyciA9IDA7CisJfQorCisgb3V0OgorCWlmICh1bmxpa2VseShlcnIgPT0g
LUVOT0VOVCB8fCBlcnIgPT0gLUVFWElTVCkpCisJCWVyciA9IC1FSU87CisJQXVUcmFjZUVycihl
cnIpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBhdWZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKnNy
Y19kaXIsIHN0cnVjdCBkZW50cnkgKnNyY19kZW50cnksCisJCXN0cnVjdCBpbm9kZSAqZGlyLCBz
dHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IGVyciwgZG9fZHRfZHN0ZGlyLCBmbGFnczsK
KwlhdWZzX2JpbmRleF90IGJlbmQsIGJpbmRleDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlWzJdLCAq
ZGlyc1syXTsKKwlzdHJ1Y3QgYXVfaGlub2RlICpoZ2RpclsyXSwgKmhkaXI7CisJZW51bSB7IFBB
UkVOVCwgQ0hJTEQgfTsKKwkvKiByZWR1Y2Ugc3RhY2sgc3BhY2UgKi8KKwlzdHJ1Y3QgeworCQlz
dHJ1Y3QgcmVuYW1lX2FyZ3MgYTsKKwkJc3RydWN0IGF1X2R0aW1lIGR0WzJdWzJdOworCX0gKnA7
CisJc3RydWN0IGF1X3dyX2Rpcl9hcmdzIHdyX2Rpcl9hcmdzID0geworCQkvLy5mb3JjZV9idGd0
CT0gLTEsCisJCS5mbGFncwkJPSBBdVdyRGlyX0FERF9FTlRSWQorCX07CisKKwlMS1RSVHJhY2Uo
ImklbHUsICUuKnMsIGklbHUsICUuKnNcbiIsCisJCSAgc3JjX2Rpci0+aV9pbm8sIEF1RExOUGFp
cihzcmNfZGVudHJ5KSwKKwkJICBkaXItPmlfaW5vLCBBdURMTlBhaXIoZGVudHJ5KSk7CisJSU11
c3RMb2NrKHNyY19kaXIpOworCUlNdXN0TG9jayhkaXIpOworCWlub2RlW0RTVF0gPSBkZW50cnkt
PmRfaW5vZGU7CisJaWYgKGlub2RlW0RTVF0pIHsKKwkJSU11c3RMb2NrKGlub2RlW0RTVF0pOwor
CQlpZ3JhYihpbm9kZVtEU1RdKTsKKwl9CisKKwllcnIgPSAtRU5PTUVNOworCUJVSUxEX0JVR19P
TihzaXplb2YoKnApID4gUEFHRV9TSVpFKTsKKwlwID0ga21hbGxvYyhzaXplb2YoKnApLCBHRlBf
VEVNUE9SQVJZKTsKKwlpZiAodW5saWtlbHkoIXApKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1F
Tk9URElSOworCXAtPmEuc2IgPSBzcmNfZGVudHJ5LT5kX3NiOworCWlub2RlW1NSQ10gPSBzcmNf
ZGVudHJ5LT5kX2lub2RlOworCWZsYWdzID0gMDsKKwlwLT5hLmZsYWdzID0gMDsKKwlpZiAoU19J
U0RJUihpbm9kZVtTUkNdLT5pX21vZGUpKSB7CisJCWZsYWdzID0gQXVMb2NrX0RJUjsKKwkJYXVf
ZnNldF9yZW4ocC0+YS5mbGFncywgSVNESVIpOworCQlpZiAodW5saWtlbHkoaW5vZGVbRFNUXSAm
JiAhU19JU0RJUihpbm9kZVtEU1RdLT5pX21vZGUpKSkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJfQor
CisJYXVmc19yZWFkX2FuZF93cml0ZV9sb2NrMihkZW50cnksIHNyY19kZW50cnksIGZsYWdzKTsK
KwlwLT5hLm1udF9mbGFncyA9IGF1X21udGZsYWdzKHAtPmEuc2IpOworCWlmICh1bmxpa2VseShh
dV9vcHRfdGVzdF9kbGd0KHAtPmEubW50X2ZsYWdzKSkpCisJCWF1X2ZzZXRfcmVuKHAtPmEuZmxh
Z3MsIERMR1QpOworCXAtPmEucGFyZW50W1NSQ10gPSBzcmNfZGVudHJ5LT5kX3BhcmVudDsgLyog
ZGlyIGlub2RlIGlzIGxvY2tlZCAqLworCXAtPmEucGFyZW50W0RTVF0gPSBkZW50cnktPmRfcGFy
ZW50OyAvKiBkaXIgaW5vZGUgaXMgbG9ja2VkICovCisJaWYgKHNyY19kaXIgPT0gZGlyKSB7CisJ
CWF1X2ZzZXRfcmVuKHAtPmEuZmxhZ3MsIElTU0FNRURJUik7CisJCWRpX3dyaXRlX2xvY2tfcGFy
ZW50KHAtPmEucGFyZW50W0RTVF0pOworCX0gZWxzZQorCQlkaV93cml0ZV9sb2NrMl9wYXJlbnQo
cC0+YS5wYXJlbnRbU1JDXSwgcC0+YS5wYXJlbnRbRFNUXSwKKwkJCQkgICAgICAvKmlzZGlyKi8x
KTsKKworCS8qIHdoaWNoIGJyYW5jaCB3ZSBwcm9jZXNzICovCisJcC0+YS5ic3RhcnRbU1JDXSA9
IGF1X2Ric3RhcnQoc3JjX2RlbnRyeSk7CisJcC0+YS5ic3RhcnRbRFNUXSA9IGF1X2Ric3RhcnQo
ZGVudHJ5KTsKKwlpZiAoYXVfZnRlc3RfcmVuKHAtPmEuZmxhZ3MsIElTRElSKSkKKwkJYXVfZnNl
dF93cmRpcih3cl9kaXJfYXJncy5mbGFncywgSVNESVIpOworCXdyX2Rpcl9hcmdzLmZvcmNlX2J0
Z3QgPSBwLT5hLmJzdGFydFtTUkNdOworCWlmIChkZW50cnktPmRfaW5vZGUgJiYgcC0+YS5ic3Rh
cnRbRFNUXSA8IHAtPmEuYnN0YXJ0W1NSQ10pCisJCXdyX2Rpcl9hcmdzLmZvcmNlX2J0Z3QgPSBw
LT5hLmJzdGFydFtEU1RdOworCXdyX2Rpcl9hcmdzLmZvcmNlX2J0Z3QgPSBhdV93YnIoZGVudHJ5
LCB3cl9kaXJfYXJncy5mb3JjZV9idGd0KTsKKwllcnIgPSBhdV93cl9kaXIoZGVudHJ5LCBzcmNf
ZGVudHJ5LCAmd3JfZGlyX2FyZ3MpOworCXAtPmEuYnRndCA9IGVycjsKKwlpZiAodW5saWtlbHko
ZXJyIDwgMCkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qIGFyZSB0aGV5IGF2YWlsYWJsZSB0
byBiZSByZW5hbWVkICovCisJZXJyID0gMDsKKwlhdV9uaGFzaF9pbml0KCZwLT5hLndobGlzdCk7
CisJaWYgKGF1X2Z0ZXN0X3JlbihwLT5hLmZsYWdzLCBJU0RJUikgJiYgaW5vZGVbRFNUXSkgewor
CQlhdV9zZXRfZGJzdGFydChkZW50cnksIHAtPmEuYnN0YXJ0W0RTVF0pOworCQllcnIgPSBtYXlf
cmVuYW1lX2RzdGRpcihkZW50cnksIHAtPmEuYnRndCwgJnAtPmEud2hsaXN0KTsKKwkJYXVfc2V0
X2Ric3RhcnQoZGVudHJ5LCBwLT5hLmJ0Z3QpOworCX0KKwlwLT5hLmhfZGVudHJ5W0RTVF0gPSBh
dV9oX2RwdHIoZGVudHJ5LCBhdV9kYnN0YXJ0KGRlbnRyeSkpOworCWlmICh1bmxpa2VseShlcnIp
KQorCQlnb3RvIG91dF91bmxvY2s7CisJLy90b2RvOiBtaW5vciBvcHRpbWl6ZSwgdGhlaXIgc2Ig
bWF5IGJlIHNhbWUgd2hpbGUgdGhlaXIgYmluZGV4IGRpZmZlcnMuCisJcC0+YS5oX2RlbnRyeVtT
UkNdID0gYXVfaF9kcHRyKHNyY19kZW50cnksIGF1X2Ric3RhcnQoc3JjX2RlbnRyeSkpOworCWlm
IChhdV9mdGVzdF9yZW4ocC0+YS5mbGFncywgSVNESVIpKSB7CisJCWVyciA9IG1heV9yZW5hbWVf
c3JjZGlyKHNyY19kZW50cnksIHAtPmEuYnRndCk7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJ
Z290byBvdXRfY2hpbGRyZW47CisJfQorCisJLyogcHJlcGFyZSB0aGUgd3JpdGFibGUgcGFyZW50
IGRpciBvbiB0aGUgc2FtZSBicmFuY2ggKi8KKwllcnIgPSBhdV93cl9kaXJfbmVlZF93aChzcmNf
ZGVudHJ5LCBhdV9mdGVzdF9yZW4ocC0+YS5mbGFncywgSVNESVIpLAorCQkJCSZwLT5hLmJ0Z3Qs
CisJCQkJYXVfZnRlc3RfcmVuKHAtPmEuZmxhZ3MsIElTU0FNRURJUikKKwkJCQk/IE5VTEwgOiBw
LT5hLnBhcmVudFtEU1RdKTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCWdvdG8gb3V0X2No
aWxkcmVuOworCWlmIChlcnIpCisJCWF1X2ZzZXRfcmVuKHAtPmEuZmxhZ3MsIFdIU1JDKTsKKwlp
ZiAocC0+YS5ic3RhcnRbRFNUXSA9PSBwLT5hLmJ0Z3QpIHsKKwkJYXVfZnNldF9yZW4ocC0+YS5m
bGFncywgV0hEU1QpOworCX0gZWxzZSB7CisJCWVyciA9IGF1X2NwdXBfZGlycyhkZW50cnksIHAt
PmEuYnRndCwKKwkJCQkgICBhdV9mdGVzdF9yZW4ocC0+YS5mbGFncywgSVNTQU1FRElSKQorCQkJ
CSAgID8gTlVMTCA6IHAtPmEucGFyZW50W1NSQ10pOworCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJ
CWdvdG8gb3V0X2NoaWxkcmVuOworCX0KKworCWhnZGlyW1NSQ10gPSBOVUxMOworCWhnZGlyW0RT
VF0gPSBOVUxMOworCWF1X2hnZGlycyhoZ2RpciwgJnAtPmEpOworCXAtPmEuaF9wYXJlbnRbU1JD
XSA9IGF1X2hfZHB0cihwLT5hLnBhcmVudFtTUkNdLCBwLT5hLmJ0Z3QpOworCXAtPmEuaF9wYXJl
bnRbRFNUXSA9IGF1X2hfZHB0cihwLT5hLnBhcmVudFtEU1RdLCBwLT5hLmJ0Z3QpOworCWRpcnNb
MF0gPSBzcmNfZGlyOworCWRpcnNbMV0gPSBkaXI7CisKKwlBdURiZ1NsZWVwX1VkYmFSYWNlKCk7
CisJcC0+YS5oX3RyYXAgPSBhdV9oZGlyX2xvY2tfcmVuYW1lKHAtPmEuaF9wYXJlbnQsIGRpcnMs
IHAtPmEuYnRndCwKKwkJCQkJICBhdV9mdGVzdF9yZW4ocC0+YS5mbGFncywgSVNTQU1FRElSKSk7
CisJLy90b2RvOiByZXZhbGlkYXRlIHRoZSBsb3dlciBkZW50cmllcz8KKworCWlmICghYXVfb3B0
X3Rlc3QocC0+YS5tbnRfZmxhZ3MsIFVEQkFfTk9ORSkpIHsKKwkJc3RydWN0IGF1X25keCBuZHgg
PSB7CisJCQkubmZzbW50CT0gYXVfbmZzbW50KHAtPmEuc2IsIHAtPmEuYnRndCksCisJCQkuZmxh
Z3MJPSAwLAorCQkJLm5kCT0gTlVMTCwKKwkJCS8vLmJyCT0gTlVMTAorCQl9OworCQlpZiAodW5s
aWtlbHkoYXVfZnRlc3RfcmVuKHAtPmEuZmxhZ3MsIERMR1QpKSkKKwkJCWF1X2ZzZXRfbmR4KG5k
eC5mbGFncywgRExHVCk7CisJCWVyciA9IGF1X21heV9yZW4oc3JjX2Rpciwgc3JjX2RlbnRyeSwg
ZGlyLCBkZW50cnksICZwLT5hLCAmbmR4KTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3Rv
IG91dF9oZGlyOworCX0KKworCS8qIHN0b3JlIHRpbWVzdGFtcHMgdG8gYmUgcmV2ZXJ0aWJsZSAq
LworCWF1X2R0aW1lX3N0b3JlKHAtPmR0W1BBUkVOVF0gKyBTUkMsIHAtPmEucGFyZW50W1NSQ10s
CisJCSAgICAgICBwLT5hLmhfcGFyZW50W1NSQ10sIGhnZGlyW1NSQ10pOworCWlmICghYXVfZnRl
c3RfcmVuKHAtPmEuZmxhZ3MsIElTU0FNRURJUikpCisJCWF1X2R0aW1lX3N0b3JlKHAtPmR0W1BB
UkVOVF0gKyBEU1QsIHAtPmEucGFyZW50W0RTVF0sCisJCQkgICAgICAgcC0+YS5oX3BhcmVudFtE
U1RdLCBoZ2RpcltEU1RdKTsKKwlkb19kdF9kc3RkaXIgPSAwOworCWlmIChhdV9mdGVzdF9yZW4o
cC0+YS5mbGFncywgSVNESVIpKSB7CisJCWhkaXIgPSBOVUxMOworCQlpZiAodW5saWtlbHkoYXVf
b3B0X3Rlc3QocC0+YS5tbnRfZmxhZ3MsIFVEQkFfSU5PVElGWSkpKQorCQkJaGRpciA9IGF1X2hp
KHAtPmEucGFyZW50W1NSQ10tPmRfaW5vZGUsIHAtPmEuYnRndCk7CisJCWF1X2R0aW1lX3N0b3Jl
KHAtPmR0W0NISUxEXSArIFNSQywgc3JjX2RlbnRyeSwKKwkJCSAgICAgICBwLT5hLmhfZGVudHJ5
W1NSQ10sIGhkaXIpOworCQlpZiAocC0+YS5oX2RlbnRyeVtEU1RdLT5kX2lub2RlKSB7CisJCQlk
b19kdF9kc3RkaXIgPSAxOworCQkJaWYgKHVubGlrZWx5KGF1X29wdF90ZXN0KHAtPmEubW50X2Zs
YWdzLCBVREJBX0lOT1RJRlkpKSkKKwkJCQloZGlyID0gYXVfaGkocC0+YS5wYXJlbnRbRFNUXS0+
ZF9pbm9kZSwKKwkJCQkJICAgICBwLT5hLmJ0Z3QpOworCQkJYXVfZHRpbWVfc3RvcmUocC0+ZHRb
Q0hJTERdICsgRFNULCBkZW50cnksCisJCQkJICAgICAgIHAtPmEuaF9kZW50cnlbRFNUXSwgaGRp
cik7CisJCX0KKwl9CisKKwllcnIgPSBkb19yZW5hbWUoc3JjX2Rpciwgc3JjX2RlbnRyeSwgZGly
LCBkZW50cnksICZwLT5hKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXRfZHQ7CisJ
YXVfaGRpcl91bmxvY2tfcmVuYW1lKHAtPmEuaF9wYXJlbnQsIGRpcnMsIHAtPmEuYnRndCwKKwkJ
CSAgICAgIGF1X2Z0ZXN0X3JlbihwLT5hLmZsYWdzLCBJU1NBTUVESVIpKTsKKworCS8qIHVwZGF0
ZSBkaXIgYXR0cmlidXRlcyAqLworCWRpci0+aV92ZXJzaW9uKys7CisJaWYgKGF1X2Z0ZXN0X3Jl
bihwLT5hLmZsYWdzLCBJU0RJUikpIHsKKwkJLyogaXMgdGhpcyB1cGRhdGluZyBkZWZpbmVkIGlu
IFBPU0lYPyAqLworCQkvL211dGV4X2xvY2soJmlub2RlW1NSQ10tPmlfbXV0ZXgpOworCQlhdV9j
cHVwX2F0dHJfdGltZXNpemVzKGlub2RlW1NSQ10pOworCQkvL211dGV4X3VubG9jaygmaW5vZGVb
U1JDXS0+aV9tdXRleCk7CisKKwkJYXVfY3B1cF9hdHRyX25saW5rKGRpcik7CisJCWlmIChpbm9k
ZVtEU1RdKSB7CisJCQljbGVhcl9ubGluayhpbm9kZVtEU1RdKTsKKwkJCWF1X2NwdXBfYXR0cl90
aW1lc2l6ZXMoaW5vZGVbRFNUXSk7CisJCX0KKwl9CisJaWYgKGF1X2lic3RhcnQoZGlyKSA9PSBw
LT5hLmJ0Z3QpCisJCWF1X2NwdXBfYXR0cl90aW1lc2l6ZXMoZGlyKTsKKworCWlmICghYXVfZnRl
c3RfcmVuKHAtPmEuZmxhZ3MsIElTU0FNRURJUikpIHsKKwkJc3JjX2Rpci0+aV92ZXJzaW9uKys7
CisJCWlmIChhdV9mdGVzdF9yZW4ocC0+YS5mbGFncywgSVNESVIpKQorCQkJYXVfY3B1cF9hdHRy
X25saW5rKHNyY19kaXIpOworCQlpZiAoYXVfaWJzdGFydChzcmNfZGlyKSA9PSBwLT5hLmJ0Z3Qp
CisJCQlhdV9jcHVwX2F0dHJfdGltZXNpemVzKHNyY19kaXIpOworCX0KKworCS8qIGRwdXQvaXB1
dCBhbGwgbG93ZXIgZGVudHJpZXMgKi8KKwlhdV9zZXRfZGJ3aChzcmNfZGVudHJ5LCAtMSk7CisJ
YmVuZCA9IGF1X2RiZW5kKHNyY19kZW50cnkpOworCWZvciAoYmluZGV4ID0gcC0+YS5idGd0ICsg
MTsgYmluZGV4IDw9IGJlbmQ7IGJpbmRleCsrKSB7CisJCXN0cnVjdCBkZW50cnkgKmhkOworCQlo
ZCA9IGF1X2hfZHB0cihzcmNfZGVudHJ5LCBiaW5kZXgpOworCQlpZiAoaGQpCisJCQlhdV9zZXRf
aF9kcHRyKHNyY19kZW50cnksIGJpbmRleCwgTlVMTCk7CisJfQorCWF1X3NldF9kYmVuZChzcmNf
ZGVudHJ5LCBwLT5hLmJ0Z3QpOworCisJYmVuZCA9IGF1X2liZW5kKGlub2RlW1NSQ10pOworCWZv
ciAoYmluZGV4ID0gcC0+YS5idGd0ICsgMTsgYmluZGV4IDw9IGJlbmQ7IGJpbmRleCsrKSB7CisJ
CXN0cnVjdCBpbm9kZSAqaGk7CisJCWhpID0gYXVfaF9pcHRyKGlub2RlW1NSQ10sIGJpbmRleCk7
CisJCWlmIChoaSkgeworCQkJLy9BdURiZygiaGklbHUsIGklbHVcbiIsIGhpLT5pX2lubywgMExV
KTsKKwkJCWF1X3hpbm9fd3JpdGUwKHAtPmEuc2IsIGJpbmRleCwgaGktPmlfaW5vLCAwKTsKKwkJ
CS8qIGlnbm9yZSB0aGlzIGVycm9yICovCisJCQlhdV9zZXRfaF9pcHRyKGlub2RlW1NSQ10sIGJp
bmRleCwgTlVMTCwgMCk7CisJCX0KKwl9CisJYXVfc2V0X2liZW5kKGlub2RlW1NSQ10sIHAtPmEu
YnRndCk7CisKKwlnb3RvIG91dF9jaGlsZHJlbjsgLyogc3VjY2VzcyAqLworCisgb3V0X2R0Ogor
CWF1X2R0aW1lX3JldmVydChwLT5kdFtQQVJFTlRdICsgU1JDKTsKKwlpZiAoIWF1X2Z0ZXN0X3Jl
bihwLT5hLmZsYWdzLCBJU1NBTUVESVIpKQorCQlhdV9kdGltZV9yZXZlcnQocC0+ZHRbUEFSRU5U
XSArIERTVCk7CisJaWYgKGF1X2Z0ZXN0X3JlbihwLT5hLmZsYWdzLCBJU0RJUikgJiYgZXJyICE9
IC1FSU8pIHsKKwkJc3RydWN0IGRlbnRyeSAqaGQ7CisKKwkJaGQgPSBwLT5kdFtDSElMRF1bU1JD
XS5kdF9oX2RlbnRyeTsKKwkJbXV0ZXhfbG9ja19uZXN0ZWQoJmhkLT5kX2lub2RlLT5pX211dGV4
LCBBdUxzY19JX0NISUxEKTsKKwkJYXVfZHRpbWVfcmV2ZXJ0KHAtPmR0W0NISUxEXSArIFNSQyk7
CisJCW11dGV4X3VubG9jaygmaGQtPmRfaW5vZGUtPmlfbXV0ZXgpOworCQlpZiAoZG9fZHRfZHN0
ZGlyKSB7CisJCQloZCA9IHAtPmR0W0NISUxEXVtEU1RdLmR0X2hfZGVudHJ5OworCQkJbXV0ZXhf
bG9ja19uZXN0ZWQoJmhkLT5kX2lub2RlLT5pX211dGV4LCBBdUxzY19JX0NISUxEKTsKKwkJCWF1
X2R0aW1lX3JldmVydChwLT5kdFtDSElMRF0gKyBEU1QpOworCQkJbXV0ZXhfdW5sb2NrKCZoZC0+
ZF9pbm9kZS0+aV9tdXRleCk7CisJCX0KKwl9Cisgb3V0X2hkaXI6CisJYXVfaGRpcl91bmxvY2tf
cmVuYW1lKHAtPmEuaF9wYXJlbnQsIGRpcnMsIHAtPmEuYnRndCwKKwkJCSAgICAgIGF1X2Z0ZXN0
X3JlbihwLT5hLmZsYWdzLCBJU1NBTUVESVIpKTsKKyBvdXRfY2hpbGRyZW46CisJYXVfbmhhc2hf
ZmluKCZwLT5hLndobGlzdCk7Cisgb3V0X3VubG9jazoKKwkvL2lmICh1bmxpa2VseShlcnIgLyog
JiYgYXVfZnRlc3RfcmVuKHAtPmEuZmxhZ3MsIElTRElSKSAqLykpIHsKKwlpZiAodW5saWtlbHko
ZXJyICYmIGF1X2Z0ZXN0X3JlbihwLT5hLmZsYWdzLCBJU0RJUikpKSB7CisJCWF1X3VwZGF0ZV9k
YnN0YXJ0KGRlbnRyeSk7CisJCWRfZHJvcChkZW50cnkpOworCX0KKwlpZiAoYXVfZnRlc3RfcmVu
KHAtPmEuZmxhZ3MsIElTU0FNRURJUikpCisJCWRpX3dyaXRlX3VubG9jayhwLT5hLnBhcmVudFtE
U1RdKTsKKwllbHNlCisJCWRpX3dyaXRlX3VubG9jazIocC0+YS5wYXJlbnRbU1JDXSwgcC0+YS5w
YXJlbnRbRFNUXSk7CisJYXVmc19yZWFkX2FuZF93cml0ZV91bmxvY2syKGRlbnRyeSwgc3JjX2Rl
bnRyeSk7Cisgb3V0X2ZyZWU6CisJa2ZyZWUocCk7Cisgb3V0OgorCWlwdXQoaW5vZGVbRFNUXSk7
CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLXVyTiBsaW51eC0yLjYu
MjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9LY29uZmlnIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMv
ZnMvYXVmcy9LY29uZmlnCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9L
Y29uZmlnCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9u
ZnMvZnMvYXVmcy9LY29uZmlnCTIwMDgtMDUtMjUgMTE6NTY6MDggKzAzMDAKQEAgLTAsMCArMSwy
ODQgQEAKK2NvbmZpZyBBVUZTCisJdHJpc3RhdGUgIkFub3RoZXIgdW5pb25mcyIKKwloZWxwCisJ
QXVmcyBpcyBhIHN0YWNrYWJsZSB1bmlmaWNhdGlvbiBmaWxlc3lzdGVtIHN1Y2ggYXMgVW5pb25m
cywKKwl3aGljaCB1bmlmaWVzIHNldmVyYWwgZGlyZWN0b3JpZXMgYW5kIHByb3ZpZGVzIGEgbWVy
Z2VkIHNpbmdsZQorCWRpcmVjdG9yeS4KKwlJbiB0aGUgZWFybHkgZGF5cywgYXVmcyB3YXMgZW50
aXJlbHkgcmUtZGVzaWduZWQgYW5kCisJcmUtaW1wbGVtZW50ZWQgVW5pb25mcyBWZXJzaW9uIDEu
eCBzZXJpZXMuIEFmdGVyIG1hbnkgb3JpZ2luYWwKKwlpZGVhcywgYXBwcm9hY2hlcyBhbmQgaW1w
cm92ZW1lbnRzLCBpdCBiZWNvbWVzIHRvdGFsbHkKKwlkaWZmZXJlbnQgZnJvbSBVbmlvbmZzIHdo
aWxlIGtlZXBpbmcgdGhlIGJhc2ljIGZlYXR1cmVzLgorCVNlZSBVbmlvbmZzIGZvciB0aGUgYmFz
aWMgZmVhdHVyZXMuCisKK2lmIEFVRlMKKworY29uZmlnIEFVRlNfRkFLRV9ETQorCWJvb2wgIlVz
ZSBzaW1wbGlmaWVkIChmYWtlKSBuYW1laWRhdGEiCisJZGVwZW5kcyBvbiBBVUZTCisJZGVmYXVs
dCB5CisJaGVscAorCUZha2luZyBuYW1laWRhdGEgKGxpbnV4IGtlcm5lbCBpbnRlcm5hbCBkYXRh
KSwgeW91IGNhbiBnZXQKKwliZXR0ZXIgcGVyZm9ybWFuY2UgaW4gc29tZSBjYXNlcy4KKwlXaGVu
IHlvdSB1c2UgTkZTIGFzIGFuIGF1ZnMgYnJhbmNoIG9yIGRsZ3QgLyogL2RpcnBlcm0xICovIGF1
ZnMgbW91bnQgb3B0aW9uLAorCXlvdSBuZWVkIHRvIGRpc2FibGUgdGhpcyBjb25maWd1cmF0aW9u
LgorCitjaG9pY2UKKwlwcm9tcHQgIk1heGltdW0gbnVtYmVyIG9mIGJyYW5jaGVzIgorCWRlcGVu
ZHMgb24gQVVGUworCWRlZmF1bHQgQVVGU19CUkFOQ0hfTUFYXzEyNworCWhlbHAKKwlTcGVjaWZp
ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJyYW5jaGVzIChvciBtZW1iZXIgZGlyZWN0b3JpZXMp
IGluIGEgXAorCXNpbmdsZSBhdWZzLiBUaGUgbGFyZ2VyIHZhbHVlIGNvbnN1bWVzIG1vcmUgc3lz
dGVtIHJlc291cmNlcyBhbmQgaGFzIFwKKwlhbiBpbXBhY3QgdG8gcGVyZm9ybWFuY2UuCitjb25m
aWcgQVVGU19CUkFOQ0hfTUFYXzEyNworCWJvb2wgIjEyNyIKKwloZWxwCisJU3BlY2lmaWVzIHRo
ZSBtYXhpbXVtIG51bWJlciBvZiBicmFuY2hlcyAob3IgbWVtYmVyIGRpcmVjdG9yaWVzKSBpbiBh
IFwKKwlzaW5nbGUgYXVmcy4gVGhlIGxhcmdlciB2YWx1ZSBjb25zdW1lcyBtb3JlIHN5c3RlbSBy
ZXNvdXJjZXMgYW5kIGhhcyBcCisJYW4gaW1wYWN0IHRvIHBlcmZvcm1hbmNlLgorY29uZmlnIEFV
RlNfQlJBTkNIX01BWF81MTEKKwlib29sICI1MTEiCisJaGVscAorCVNwZWNpZmllcyB0aGUgbWF4
aW11bSBudW1iZXIgb2YgYnJhbmNoZXMgKG9yIG1lbWJlciBkaXJlY3RvcmllcykgaW4gYSBcCisJ
c2luZ2xlIGF1ZnMuIFRoZSBsYXJnZXIgdmFsdWUgY29uc3VtZXMgbW9yZSBzeXN0ZW0gcmVzb3Vy
Y2VzIGFuZCBoYXMgXAorCWFuIGltcGFjdCB0byBwZXJmb3JtYW5jZS4KK2NvbmZpZyBBVUZTX0JS
QU5DSF9NQVhfMTAyMworCWJvb2wgIjEwMjMiCisJaGVscAorCVNwZWNpZmllcyB0aGUgbWF4aW11
bSBudW1iZXIgb2YgYnJhbmNoZXMgKG9yIG1lbWJlciBkaXJlY3RvcmllcykgaW4gYSBcCisJc2lu
Z2xlIGF1ZnMuIFRoZSBsYXJnZXIgdmFsdWUgY29uc3VtZXMgbW9yZSBzeXN0ZW0gcmVzb3VyY2Vz
IGFuZCBoYXMgXAorCWFuIGltcGFjdCB0byBwZXJmb3JtYW5jZS4KK2NvbmZpZyBBVUZTX0JSQU5D
SF9NQVhfMzI3NjcKKwlib29sICIzMjc2NyIKKwloZWxwCisJU3BlY2lmaWVzIHRoZSBtYXhpbXVt
IG51bWJlciBvZiBicmFuY2hlcyAob3IgbWVtYmVyIGRpcmVjdG9yaWVzKSBpbiBhIFwKKwlzaW5n
bGUgYXVmcy4gVGhlIGxhcmdlciB2YWx1ZSBjb25zdW1lcyBtb3JlIHN5c3RlbSByZXNvdXJjZXMg
YW5kIGhhcyBcCisJYW4gaW1wYWN0IHRvIHBlcmZvcm1hbmNlLgorZW5kY2hvaWNlCisKK2NvbmZp
ZyBBVUZTX0hJTk9USUZZCisJYm9vbCAiVXNlIGlub3RpZnkgdG8gZGV0ZWN0IGFjdGlvbnMgb24g
YSBicmFuY2giCisJZGVwZW5kcyBvbiBBVUZTCisJZGVwZW5kcyBvbiBJTk9USUZZCisJZGVmYXVs
dCBuCisJaGVscAorCUlmIHlvdSB3YW50IHRvIG1vZGlmeSBmaWxlcyBvbiBicmFuY2hlcyBkaXJl
Y3RseSwgZWcuIGJ5cGFzc2luZyBhdWZzLAorCWFuZCB3YW50IGF1ZnMgdG8gZGV0ZWN0IHRoZSBj
aGFuZ2VzIG9mIHRoZW0gZnVsbHksIHRoZW4gZW5hYmxlIHRoaXMKKwlvcHRpb24gYW5kIHVzZSAn
dWRiYT1pbm90aWZ5JyBtb3VudCBvcHRpb24uCisJSXQgd2lsbCBkYW1hZ2UgdGhlIHBlcmZvcm1h
bmNlLgorCVNlZSBkZXRhaWwgaW4gYXVmcy41LgorCitjb21tZW50ICJJTk9USUZZIGFuZCBBVUZT
X0hJTk9USUZZIGFyZSBkaXNhYmxlZCIKKwlkZXBlbmRzIG9uIElOT1RJRlkgPSBuCisKK2NvbmZp
ZyBBVUZTX0VYUE9SVAorCWJvb2wgIk5GUy1leHBvcnRhYmxlIGF1ZnMiCisJZGVwZW5kcyBvbiBB
VUZTCisJZGVwZW5kcyBvbiAoQVVGUyA9IHkgJiYgRVhQT1JURlMgPSB5KSB8fCAoQVVGUyA9IG0g
JiYgRVhQT1JURlMpCisJZGVmYXVsdCBuCisJaGVscAorCUlmIHlvdSB3YW50IHRvIGV4cG9ydCB5
b3VyIG1vdW50ZWQgYXVmcywgdGhlbiBlbmFibGUgdGhpcworCW9wdGlvbi4gVGhlcmUgYXJlIHNl
dmVyYWwgcmVxdWlyZW1lbnRzIHRvIGV4cG9ydCBhdWZzLgorCVNlZSBkZXRhaWwgaW4gYXVmcy41
LgorCitjb21tZW50ICJFWFBPUlRGUyBhbmQgQVVGU19FWFBPUlQgYXJlIGRpc2FibGVkIgorCWRl
cGVuZHMgb24gQVVGUworCWRlcGVuZHMgb24gRVhQT1JURlMgPSBuCisKK2NvbW1lbnQgIkFVRlNf
RVhQT1JUIGlzIGRpc2FibGVkIHNpbmNlIEVYUE9SVEZTIGlzIGEgbW9kdWxlIGJ1dCBBVUZTIgor
CWRlcGVuZHMgb24gQVVGUworCWRlcGVuZHMgb24gRVhQT1JURlMgPSBtICYmIEFVRlMgPSB5CisK
K2NvbmZpZyBBVUZTX1JPQlIKKwlib29sICJBdWZzIGFzIGFuIHJlYWRvbmx5IGJyYW5jaCBvZiBh
bm90aGVyIGF1ZnMiCisJZGVwZW5kcyBvbiBBVUZTCisJZGVmYXVsdCBuCisJaGVscAorCUlmIHlv
dSB3YW50IG1ha2UgeW91ciBhdWZzIHRvIGJlIGEgcGFydCBvZiBhbm90aGVyIGF1ZnMsIHRoZW4K
KwllbmFibGUgdGhpcyBvcHRpb24uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuIHNwZWNpZnkgeW91
ciBhdWZzCisJcGF0aCBpbiAnYnI6JyBtb3VudCBvcHRpb24gZm9yIGFub3RoZXIgYXVmcywgYnV0
IGNhbm5vdAorCXNwZWNpZnkgJ3J3JyBhcyB0aGUgYnJhbmNoIHBlcm1pc3Npb24uCisJSXQgd2ls
bCBkYW1hZ2UgdGhlIHBlcmZvcm1hbmNlLgorCVNlZSBkZXRhaWwgaW4gYXVmcy41LgorCitjb25m
aWcgQVVGU19ETEdUCisJYm9vbCAiRGVsZWdhdGUgdGhlIGludGVybmFsIGJyYW5jaCBhY2Nlc3Mg
dGhlIGtlcm5lbCB0aHJlYWQiCisJZGVwZW5kcyBvbiBBVUZTCisJZGVmYXVsdCBuCisJaGVscAor
CUlmIHlvdSB3YW50IC8qdG8gdXNlICdkaXJwZXJtMScgbW91bnQgb3B0aW9uLCBvciAqLyBhdWZz
IHRvIGRlbGVnYXRlCisJdGhlIGludGVybmFsIGFjY2VzcyB0byB0aGUgYnJhbmNoZXMgd2hpY2gg
aXMgbWFkZSBieSBhdWZzLCB0bworCXRoZSBrZXJuZWwgdGhyZWFkLCBpbiBvcmRlciB0byBoaWRl
IHRoZSBhY2Nlc3MgaXNzdWVkIGJ5IHlvdXIKKwlhcHBsaWNhdGlvbiBmcm9tIHlvdXIgTFNNIG9y
IHNvbWV0aGluZyBvciBtYWtlIHlvdXIKKwlhcHBsaWNhdGlvbiB0byBiZSB0cmFjZWQgc3RyaWN0
bHkgYnkgdGhlIHRhc2sgSS9PIGFjY291bnRpbmcsCisJdGhlbiBlbmFibGUgdGhpcyBvcHRpb24g
YW5kIHVzZSAnZGxndCcgbW91bnQgb3B0aW9uLgorCUl0IHdpbGwgZGFtYWdlIHRoZSBwZXJmb3Jt
YW5jZS4KKwlTZWUgZGV0YWlsIGluIGF1ZnMuNS4KKworY29uZmlnIEFVRlNfUlJfU1FVQVNIRlMK
Kwlib29sICJNYWtlIHNxdWFzaGZzIGJyYW5jaCBSUiAocmVhbCByZWFkb25seSkgYnkgZGVmYXVs
dCIKKwlkZXBlbmRzIG9uIEFVRlMKKwlkZWZhdWx0IHkKKwloZWxwCisJSWYgeW91IHVzZSBzcXVh
c2hmcyBvciBMWk1BIHBhdGNoZWQgc3F1YXNoZnMgYXMgYW4gYXVmcyBicmFuY2gKKwlhbmQgd2Fu
dCB0byBzZXQgJz1ycicgdG8gaXQgYnkgZGVmYXVsdCwgdGhlbiBlbmFibGUgdGhpcworCWNvbmZp
Z3VyYXRpb24uCisJJ3JyJyBzdGFuZHMgZm9yIHJlYWwgcmVhZG9ubHkgYW5kIGl0IG9wdGltaXpl
cyBzb21lIGFzcGVjdHMgb2YKKwkncm8uJworCVNlZSBkZXRhaWwgaW4gYXVmcy41LgorCitjb25m
aWcgQVVGU19TRUNfUEVSTV9QQVRDSAorCWJvb2wgInNlY19wZXJtLTIuNi4yNC5wYXRjaCB3YXMg
YXBwbGllZCBvciBub3QiCisJZGVwZW5kcyBvbiBBVUZTCisJZGVwZW5kcyBvbiBBVUZTID0gbQor
CWRlcGVuZHMgb24gU0VDVVJJVFkKKwlkZWZhdWx0IG4KKwloZWxwCisJSWYgeW91IGJ1aWxkIGF1
ZnMgYXMgYSBtb2R1bGUgYW5kIGVuYWJsZWQgQ09ORklHX1NFQ1VSSVRZLAorCXRoZW4geW91IG5l
ZWQgdG8gYXBwbHkgdGhlIHBhdGNoCisJJ0NWU19UUkVFL2F1ZnMvcGF0Y2gvc2VjX3Blcm0tMi42
LjI0LnBhdGNoJyB0byB5b3VyIGtlcm5lbAorCXNvdXJjZSwgYW5kIGVuYWJsZSB0aGlzIGNvbmZp
Z3VyYXRpb24uCisJVGhlIHNlY19wZXJtLTIuNi4yNC5wYXRjaCBleHBvcnRzIGEga2VybmVsIGZ1
bmN0aW9uCisJc2VjdXJpdHlfaW5vZGVfcGVybWlzc2lvbigpIHRvIG1vZHVsZXMuCisKK2NvbW1l
bnQgIlNFQ1VSSVRZIGFuZCBBVUZTX1NFQ19QRVJNX1BBVENIIGFyZSBkaXNhYmxlZCIKKwlkZXBl
bmRzIG9uIEFVRlMKKwlkZXBlbmRzIG9uIFNFQ1VSSVRZID0gbgorCitjb25maWcgQVVGU19TUExJ
Q0VfUEFUQ0gKKwlib29sICJzcGxpY2UucGF0Y2ggZm9yIHNlbmRmaWxlKDIpIGFuZCBzcGxpY2Uo
MikiCisJZGVwZW5kcyBvbiBBVUZTCisJZGVmYXVsdCBuCisJaGVscAorCUlmIHlvdSB1c2UgJ2xv
b3BiYWNrIG1vdW50JyBvbiBhIGZzLWltYWdlIGZpbGUsIG9yIHVzZQorCXNwbGljZSgyKSBvciBz
ZW5kZmlsZSgyKSBzeXN0ZW1jYWxsIGluIGF1ZnMsIHRoZW4geW91IG5lZWQgdG8KKwlhcHBseSB0
aGUgcGF0Y2ggJ0NWU19UUkVFL2F1ZnMvcGF0Y2gvc3BsaWNlLnBhdGNoJyB0byB5b3VyCisJa2Vy
bmVsIHNvdXJjZSwgYW5kIGVuYWJsZSB0aGlzIGNvbmZpZ3VyYXRpb24uCisJVGhlIHNwbGljZS5w
YXRjaCBtYWtlcyB0aGUga2VybmVsIGZ1bmN0aW9uIHZmc19zcGxpY2VfdG8vZnJvbSgpCisJZ2xv
YmFsIGFuZCBleHBvcnRzIHRoZW0gdG8gbW9kdWxlcy4KKworY29uZmlnIEFVRlNfUFVUX0ZJTFBf
UEFUQ0gKKwlib29sICJwdXRfZmlscC5wYXRjaCBmb3IgTkZTIGJyYW5jaCIKKwlkZXBlbmRzIG9u
IEFVRlMKKwlkZXBlbmRzIG9uIEFVRlMgPSBtCisJZGVwZW5kcyBvbiBORlNfRlMKKwlkZXBlbmRz
IG9uIEFVRlNfRkFLRV9ETSA9IG4KKwlkZWZhdWx0IG4KKwloZWxwCisJSWYgeW91IGJ1aWxkIGF1
ZnMgYXMgYSBtb2R1bGUgYW5kIHVzZSBtb3VudGVkIE5GUyBhcyBhbiBhdWZzCisJYnJhbmNoIGZp
bGVzeXN0ZW0sIHRoZW4geW91IG5lZWQgdG8gYXBwbHkgdGhlIHBhdGNoCisJJ0NWU19UUkVFL2F1
ZnMvcGF0Y2gvcHV0X2ZpbHAucGF0Y2gnIHRvIHlvdXIga2VybmVsIHNvdXJjZSwKKwlhbmQgZW5h
YmxlIHRoaXMgY29uZmlndXJhdGlvbi4KKwlUaGUgcHV0X2ZpbHAucGF0Y2ggZXhwb3J0cyBhIGtl
cm5lbCBmdW5jdGlvbiBwdXRfZmlscCgpIHRvCisJbW9kdWxlcy4KKworY29tbWVudCAiTkZTX0ZT
IGFuZCBBVUZTX1BVVF9GSUxQX1BBVENIIGFyZSBkaXNhYmxlZCIKKwlkZXBlbmRzIG9uIEFVRlMK
KwlkZXBlbmRzIG9uIE5GU19GUyA9IG4KKworY29tbWVudCAiQVVGU19GSUxQX1BBVENIIGlzIGRp
c2FibGVkIHNpbmNlIEFVRlNfRkFLRV9ETSBpcyBlbmFibGVkIgorCWRlcGVuZHMgb24gQVVGUwor
CWRlcGVuZHMgb24gQVVGU19GQUtFX0RNCisKK2NvbmZpZyBBVUZTX0xIQVNIX1BBVENICisJYm9v
bCAibGhhc2gucGF0Y2ggZm9yIE5GUyBicmFuY2giCisJZGVwZW5kcyBvbiBBVUZTCisJZGVwZW5k
cyBvbiBORlNfRlMKKwlkZXBlbmRzIG9uIEFVRlNfRkFLRV9ETSA9IG4KKwlkZWZhdWx0IG4KKwlo
ZWxwCisJSWYgeW91IHVzZSBtb3VudGVkIE5GUyBhcyBhbiBhdWZzIGJyYW5jaCBmaWxlc3lzdGVt
LCB0aGVuIHlvdQorCW5lZWQgdG8gYXBwbHkgdGhlIHBhdGNoICdDVlNfVFJFRS9hdWZzL3BhdGNo
L2xoYXNoLnBhdGNoJyAob3IKKwlsaGFzaC0yLjYuMjIucGF0Y2ggZm9yIGxpbnV4LTIuNi4yMiBh
bmQgbGF0ZXIpIHRvIHlvdXIga2VybmVsCisJc291cmNlLCBhbmQgZW5hYmxlIHRoaXMgY29uZmln
dXJhdGlvbi4KKwlUaGUgcGF0Y2ggZmlsZSBtYWtlcyB0aGUga2VybmVsIGZ1bmN0aW9uIF9fbG9v
a3VwX2hhc2goKSBnbG9iYWwKKwlhbmQgZXhwb3J0cyBpdCB0byBtb2R1bGVzLgorCitjb21tZW50
ICJORlNfRlMgYW5kIEFVRlNfTEhBU0hfUEFUQ0ggYXJlIGRpc2FibGVkIgorCWRlcGVuZHMgb24g
QVVGUworCWRlcGVuZHMgb24gTkZTX0ZTID0gbgorCitjb21tZW50ICJBVUZTX0xIQVNIX1BBVENI
IGlzIGRpc2FibGVkIHNpbmNlIEFVRlNfRkFLRV9ETSBpcyBlbmFibGVkIgorCWRlcGVuZHMgb24g
QVVGUworCWRlcGVuZHMgb24gQVVGU19GQUtFX0RNCisKK2NvbmZpZyBBVUZTX0ZTWU5DX1NVUEVS
X1BBVENICisJYm9vbCAiZnN5bmNfc3VwZXItMi42Lnh4LnBhdGNoIHdhcyBhcHBsaWVkIG9yIG5v
dCIKKwlkZXBlbmRzIG9uIEFVRlMKKwlkZXBlbmRzIG9uIEFVRlMgPSBtCisJZGVmYXVsdCBuCisJ
aGVscAorCUlmIHlvdSBidWlsZCBhdWZzIGFzIGEgbW9kdWxlIGFuZCB3YW50IHRvIGZsdXNoIGV2
ZXJ5dGhpbmcgZm9yCisJYnJhbmNoIGZpbGVzeXN0ZW1zIHdoaWNoIGFyZSBub3QgbWFya2VkIGFz
ICdycicgbm9yICdycit3aCcgYXQKKwl1bW91bnQgb3IgcmVtb3VudCB0aW1lLCB0aGVuIHlvdSBu
ZWVkIHRvIGFwcGx5IHRoZSBwYXRjaAorCSdDVlNfVFJFRS9hdWZzL3BhdGNoL2ZzeW5jX3N1cGVy
LTIuNi4xNi5wYXRjaCcgb3IKKwknLi4uLTIuNi4xOS5wYXRjaCcgdG8geW91ciBrZXJuZWwgc291
cmNlLCBhbmQgZW5hYmxlIHRoaXMKKwljb25maWd1cmF0aW9uLgorCUl0IG1heSBiZSBoZWxwZnVs
IGF0IHNodXRkb3duIHRpbWUgaW4gY2FzZSBvZiB5b3VyIGF1ZnMgaXMgYQorCXJvb3QgZmlsZXN5
c3RlbS4gQnV0IHRoaXMgYmVoYXZpb3VyIHdpbGwgbm90IGd1YXJhbnRlZSB0aGUKKwljb25zaXN0
ZW5jeSBvZiBicmFuY2ggZmlsZXN5c3RlbXMuIFRvIGd1cmFudGVlIGl0LCB0cnkgdGhlCisJYXBw
cm9hY2ggZGVzY3JpYmVkIGluIHRoZSBhdWZzIG1hbnVhbCwgYW5kIGRvbid0IGZvcmdldAorCWlu
c3RhbGxpbmcgYXVwbGluayBzY3JpcHQuCisJVGhlIGZzeW5jX3N1cGVyLTIuNi54eC5wYXRjaCBk
b2VzIG5vdGhpbmcgYnV0IGV4cG9ydHMgYSBrZXJuZWwKKwlmdW5jdGlvbiBmc3luY19zdXBlcigp
IHRvIG1vZHVsZXMuCisKK2NvbmZpZyBBVUZTX0RFTllfV1JJVEVfQUNDRVNTX1BBVENICisJYm9v
bCAiZGVueV93cml0ZV9hY2Nlc3MucGF0Y2ggd2FzIGFwcGxpZWQgb3Igbm90IgorCWRlcGVuZHMg
b24gQVVGUworCWRlcGVuZHMgb24gQVVGUyA9IG0KKwlkZWZhdWx0IG4KKwloZWxwCisJQSBzZWN1
cml0eSBlbmhhbmNlbWVudCB0byBkZW55IHdyaXRpbmcgdG8gYSBydW5uaW5nIGV4ZWN1dGFibGUK
Kwl3aGljaCBleGlzdHMgb24gYW4gYXVmcyBicmFuY2ggZmlsZXN5c3RlbSBhbmQgZXhlY3V0ZWQg
dGhyb3VnaAorCWF1ZnMuIElmIHlvdSBhcHBsaWVkCisJJ0NWU19UUkVFL2F1ZnMvcGF0Y2gvZGVu
eV93cml0ZV9hY2Nlc3MucGF0Y2gnIHRvIHlvdXIga2VybmVsCisJYW5kIHlvdSBhcmUgY29tcGls
aW5nIGF1ZnMgYXMgYSBtb2R1bGUsIHRoZW4gZW5hYmxlIHRoaXMKKwlvcHRpb24uCisJVGhlIHdy
aXRlX2RlbnlfYWNjZXNzLnBhdGNoIGRvZXMgbm90aGluZyBidXQgZXhwb3J0IHRoZQorCWZ1bmN0
aW9uLgorCitjb25maWcgQVVGU19XT1JLQVJPVU5EX0ZVU0UKKwlib29sICJTcGVjaWFsIGhhbmRs
aW5nIGZvciBGVVNFLWJhc2VkIGZpbGVzeXN0ZW0iCisJZGVwZW5kcyBvbiBBVUZTICYmIEZVU0Vf
RlMKKwlkZWZhdWx0IG4KKwloZWxwCisJQSBGVVNFLWJhc2VkIGZpbGVzeXN0ZW0gbWF5IG5vdCBp
bml0aWFsaXplIGl0cyBpbm9kZQorCWF0dHJpYnV0ZXMgYW5kIHRoZSBGVVNFIGRldmVsb3BlciB0
aGlua3MgdGhlIGlub2RlIGF0dHJpYnV0ZXMKKwlpbiBhIHBvc2l0aXZlIGRlbnRyeSB3aGljaCBp
cyByZXR1cm5lZCBieSBWRlMgbG9va3VwIG9wZXJhdGlvbgorCWFyZSBub3QgcmVsaWFibGUuCisJ
SWYgeW91IHVzZSBhIEZVU0UtYmFzZWQgZmlsZXN5c3RlbSBhcyBhbiBhdWZzIGJyYW5jaCwgYW5k
IGl0CisJY3VzdG9taXplcyB0aGUgaW5vZGUgYXR0cmlidXRlIG9uIGl0IHdpdGhvdXQgb3ZlcnJp
ZGluZworCWZ1c2VfbG93bGV2ZWxfb3BzLmxvb2t1cCwgcHJvYmFibHkgeW91IG5lZWQgdG8gZW5h
YmxlIHRoaXMKKwljb25maWd1cmF0aW9uLgorCUlmIHlvdSBlbmFibGUgdGhpcyBjb25maWd1cmF0
aW9uLCBhdWZzIGNhbGxzIGdldGF0dHIgb3BlcmF0aW9uCisJaW4gZXZlcnkgbG9va3VwIGFuZCBy
ZXZhbGlkYXRlIG9wZXJhdGlvbiBmb3IgdGhlIEZVU0UtYmFzZWQKKwlmaWxlc3lzdGVtIGJyYW5j
aC4KKwlJdCB3aWxsIGRhbWFnZSB0aGUgcGVyZm9ybWFuY2UgZXZlbiBpZiB5b3UgZG9uJ3QgdXNl
IGEKKwlGVVNFLWJhc2VkIGZpbGVzeXN0ZW0gYnJhbmNoLgorCitjb25maWcgQVVGU19ERUJVRwor
CWJvb2wgIkRlYnVnIGF1ZnMiCisJZGVwZW5kcyBvbiBBVUZTCisJZGVmYXVsdCB5CisJaGVscAor
CUVuYWJsZSB0aGlzIHRvIGNvbXBpbGUgYXVmcyBpbnRlcm5hbCBkZWJ1ZyBjb2RlLgorCVRoZSBw
ZXJmb3JtYW5jZSB3aWxsIGJlIGRhbWFnZWQuCisKK2NvbmZpZyBBVUZTX0NPTVBBVAorCWJvb2wg
IkNvbXBhdGliaWxpdHkgd2l0aCBVbmlvbmZzIChvYnNvbGV0ZSkiCisJZGVwZW5kcyBvbiBBVUZT
CisJZGVmYXVsdCBuCisJaGVscAorCVRoaXMgbWFrZXMgYXVmcyBjb21wYXRpYmxlIHdpdGggdW5p
b25mcy1zdHlsZSBtb3VudCBvcHRpb25zIGFuZCBzb21lCisJYmVoYXZpb3Vycy4KKwlUaGUgZGly
cz0gbW91bnQgb3B0aW9uIGFuZCA9bmZzcm8gYnJhbmNoIHBlcm1pc3Npb24gZmxhZyBhcmUgYWx3
YXlzCisJaW50ZXJwcmV0ZWQgYXMgYnI6IG1vdW50IG9wdGlvbiBhbmQgPXJvIGZsYWcgcmVzcGVj
dGl2ZWx5LiBUaGUKKwknZGVidWcnLCAnZGVsZXRlJyBhbmQgJ2ltYXAnIG1vdW50IG9wdGlvbnMg
YXJlIGlnbm9yZWQuCisJSWYgeW91IGRpc2FibGUgdGhpcyBvcHRpb24sIHlvdSB3aWxsIGdldCwK
KwktIGF1ZnMgaXNzdWVzIGEgd2FybmluZyBhYm91dCB0aGUgaWdub3JlZCBtb3VudCBvcHRpb25z
CisJLSB0aGUgZGVmYXVsdCBicmFuY2ggcGVybWlzc2lvbiBmbGFnIGlzIHNldC4gUlcgZm9yIHRo
ZSBmaXJzdCBicmFuY2gsCisJICBhbmQgUk8gZm9yIHRoZSByZXN0cy4KKwktIHRoZSBuYW1lIG9m
IGEgaW50ZXJuYWwgZmlsZSB3aGljaCByZXByZXNlbnRzIHRoZSBkaXJlY3RvcnkgaXMKKwkgICdv
cGFxdWUnLCBiZWNvbWVzICcud2guLndoLi5vcHEnCisJLSB0aGUgJ2Rpcm9wcT13JyBtb3VudCBv
cHRpb24gaXMgc2V0IGJ5IGRlZmF1bHQKK2VuZGlmCmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11
bmlvbmZzLm9yaWcvZnMvYXVmcy9NYWtlZmlsZSBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1
ZnMvTWFrZWZpbGUKLS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL01ha2Vm
aWxlCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMv
ZnMvYXVmcy9NYWtlZmlsZQkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEsNjUg
QEAKKyMgQVVGUyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IDIuNi4yNSBhbmQgbGF0ZXIKKyMgJElk
OiBNYWtlZmlsZSx2IDEuMyAyMDA4LzA0LzI4IDAzOjAzOjEwIHNmanJvIEV4cCAkCisKKyMgdGhl
IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IGluaGVyaXRlZCBzaW5jZSAyLjYuMjMKK2lm
ZGVmIEFVRlNfRVhUUkFfQ0ZMQUdTCitFWFRSQV9DRkxBR1MgKz0gJHtBVUZTX0VYVFJBX0NGTEFH
U30KK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwor
aWZkZWYgQ09ORklHX0FVRlNfUlJfU1FVQVNIRlMKKyMgY2YuIHNxdWFzaGZzMy4yLXIyIGFuZCBz
cWx6bWEgcGF0Y2guCitFWFRSQV9DRkxBR1MgKz0gLURTUVVBU0hGU19NQUdJQz0weDczNzE3MzY4
CitFWFRSQV9DRkxBR1MgKz0gLURTUVVBU0hGU19NQUdJQ19TV0FQPTB4Njg3MzcxNzMKK0VYVFJB
X0NGTEFHUyArPSAtRFNRVUFTSEZTX01BR0lDX0xaTUE9MHg3MTczNjg3MworRVhUUkFfQ0ZMQUdT
ICs9IC1EU1FVQVNIRlNfTUFHSUNfTFpNQV9TV0FQPTB4NzM2ODczNzEKK2VuZGlmCisKK2lmZGVm
IENPTkZJR19BVUZTX1dPUktBUk9VTkRfRlVTRQorIyBkZWZpbmVkIGluICR7c3JjdHJlZX0vZnMv
ZnVzZS9pbm9kZS5jCitFWFRSQV9DRkxBR1MgKz0gLURGVVNFX1NVUEVSX01BR0lDPTB4NjU3MzU1
NDYKK2VuZGlmCisKK2lmZGVmIENPTkZJR19YRlNfRlMKKyMgZGVmaW5lZCBpbiAke3NyY3RyZWV9
L2ZzL3hmcy94ZnNfc2IuaAorRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX1NCX01BR0lDPTB4NTg0NjUz
NDIKK2VuZGlmCisKK2lmZGVmIENPTkZJR19UTVBGUworIyBkZWZpbmVkIGluICR7c3JjdHJlZX0v
bW0vc2htZW0uYworRVhUUkFfQ0ZMQUdTICs9IC1EVE1QRlNfTUFHSUM9MHgwMTAyMTk5NAorZW5k
aWYKKworLWluY2x1ZGUgJChkaXIgJChsYXN0d29yZCAke01BS0VGSUxFX0xJU1R9KSlwcml2Lm1r
CisjJCh3YXJuaW5nICR7RVhUUkFfQ0ZMQUdTfSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIworCitvYmotJChDT05GSUdfQVVGUykgKz0gYXVmcy5vCithdWZzLXkg
Oj0gbW9kdWxlLm8gc3VwZXIubyBzYmluZm8ubyBicmFuY2gubyB4aW5vLm8gc3lzYXVmcy5vIG9w
dHMubyBcCisJd2txLm8gdmZzdWIubyBkY3N1Yi5vIFwKKwljcHVwLm8gd2hvdXQubyBwbGluay5v
IHdicl9wb2xpY3kubyBcCisJZGVudHJ5Lm8gZGluZm8ubyBcCisJZmlsZS5vIGZfb3AubyBmaW5m
by5vIFwKKwlkaXIubyB2ZGlyLm8gXAorCWlub2RlLm8gaV9vcC5vIGlfb3BfYWRkLm8gaV9vcF9k
ZWwubyBpX29wX3Jlbi5vIGlpbmZvLm8gXAorCW1pc2MubworCisjeGF0dHIubworYXVmcy0kKENP
TkZJR19TWVNGUykgKz0gc3lzZnMubworYXVmcy0kKENPTkZJR19BVUZTX0JSX05GUykgKz0gYnJf
bmZzLm8KK2F1ZnMtJChDT05GSUdfQVVGU19CUl9YRlMpICs9IGJyX3hmcy5vCithdWZzLSQoQ09O
RklHX0FVRlNfV09SS0FST1VORF9GVVNFKSArPSBicl9mdXNlLm8KKworYXVmcy0kKENPTkZJR19B
VUZTX0RMR1QpICs9IGRsZ3QubworYXVmcy0kKENPTkZJR19BVUZTX0hJTk9USUZZKSArPSBoaW5v
dGlmeS5vIGhpbl9vcl9kbGd0Lm8KKyMgZGlydHkKK2lmbmRlZiBDT05GSUdfQVVGU19ISU5PVElG
WQorYXVmcy0kKENPTkZJR19BVUZTX0RMR1QpICs9IGhpbl9vcl9kbGd0Lm8KK2VuZGlmCisKK2F1
ZnMtJChDT05GSUdfQVVGU19FWFBPUlQpICs9IGV4cG9ydC5vCithdWZzLSQoQ09ORklHX0FVRlNf
Uk9CUikgKz0gcm9ici5vCithdWZzLSQoQ09ORklHX0FVRlNfREVCVUcpICs9IGRlYnVnLm8KK2F1
ZnMtJChDT05GSUdfQVVGU19NQUdJQ19TWVNSUSkgKz0gc3lzcnEubwpkaWZmIC11ck4gbGludXgt
Mi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvbWlzYy5jIGxpbnV4LTIuNi4yNS40LXVuaW9u
ZnMvZnMvYXVmcy9taXNjLmMKLS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZz
L21pc2MuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlv
bmZzL2ZzL2F1ZnMvbWlzYy5jCTIwMDgtMDUtMjUgMTE6NTg6NTMgKzAzMDAKQEAgLTAsMCArMSwy
NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAq
CisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3Qs
IHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisK
Ky8qCisgKiAkSWQ6IG1pc2MuYyx2IDEuNiAyMDA4LzA1LzE5IDAxOjQ2OjUzIHNmanJvIEV4cCAk
CisgKi8KKworLy8jaW5jbHVkZSA8bGludXgvZnMuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L25hbWVp
Lmg+CisvLyNpbmNsdWRlIDxsaW51eC9tbS5oPgorLy8jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4K
KyNpbmNsdWRlICJhdWZzLmgiCisKK3ZvaWQgKmF1X2t6cmVhbGxvYyh2b2lkICpwLCB1bnNpZ25l
ZCBpbnQgbnVzZWQsIHVuc2lnbmVkIGludCBuZXdfc3osIGdmcF90IGdmcCkKK3sKKwl2b2lkICpx
OworCisJTEtUUlRyYWNlKCJwICVwLCBudXNlZCAlZCwgc3ogJWRcbiIsIHAsIG51c2VkLCBuZXdf
c3opOworCUF1RGVidWdPbihuZXdfc3ogPD0gMCk7CisJaWYgKG5ld19zeiA8PSBudXNlZCkKKwkJ
cmV0dXJuIHA7CisKKwlxID0ga3JlYWxsb2MocCwgbmV3X3N6LCBnZnApOworCWlmIChxKQorCQlt
ZW1zZXQocSArIG51c2VkLCAwLCBuZXdfc3ogLSBudXNlZCk7CisJcmV0dXJuIHE7Cit9CisKKy8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IG5hbWVpZGF0YSAqYXVfZHVwX25kKHN0cnVjdCBh
dV9zYmluZm8gKnNiaW5mbywgc3RydWN0IG5hbWVpZGF0YSAqZHN0LAorCQkJICAgIHN0cnVjdCBu
YW1laWRhdGEgKnNyYykKK3sKKwlMS1RSVHJhY2UoInNyYyAlcFxuIiwgc3JjKTsKKworCWlmIChz
cmMpIHsKKwkJKmRzdCA9ICpzcmM7CisJCWRzdC0+ZmxhZ3MgJj0gfkxPT0tVUF9QQVJFTlQ7CisJ
CWlmIChzYmluZm8tPnNpX3dicl9jcmVhdGUgPT0gQXVXYnJDcmVhdGVfVERQKSB7CisJCQlpZiAo
KGRzdC0+ZmxhZ3MgJiBMT09LVVBfQ1JFQVRFKQorCQkJICAgICYmICEoZHN0LT5pbnRlbnQub3Bl
bi5mbGFncyAmIE9fQ1JFQVQpKQorCQkJCWRzdC0+ZmxhZ3MgJj0gfkxPT0tVUF9DUkVBVEU7CisJ
CX0gZWxzZSB7CisJCQlkc3QtPmZsYWdzICY9IH5MT09LVVBfQ1JFQVRFOworCQkJZHN0LT5pbnRl
bnQub3Blbi5mbGFncyAmPSB+T19DUkVBVDsKKwkJfQorCX0gZWxzZQorCQlkc3QgPSBOVUxMOwor
CisJcmV0dXJuIGRzdDsKK30KKworc3RydWN0IG5hbWVpZGF0YSAqYXVfZmFrZV9kbShzdHJ1Y3Qg
bmFtZWlkYXRhICpmYWtlX25kLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCwKKwkJCSAgICAgc3RydWN0
IHN1cGVyX2Jsb2NrICpzYiwgYXVmc19iaW5kZXhfdCBiaW5kZXgpCit7CisJTEtUUlRyYWNlKCJu
ZCAlcCwgYiVkXG4iLCBuZCwgYmluZGV4KTsKKworCWlmICghbmQpCisJCXJldHVybiBOVUxMOwor
CisJRGlNdXN0QW55TG9jayhuZC0+cGF0aC5kZW50cnkpOworCisJZmFrZV9uZC0+cGF0aC5kZW50
cnkgPSBOVUxMOworCWZha2VfbmQtPnBhdGgubW50ID0gTlVMTDsKKworCWlmIChiaW5kZXggPD0g
YXVfZGJlbmQobmQtPnBhdGguZGVudHJ5KSkKKwkJZmFrZV9uZC0+cGF0aC5kZW50cnkgPSBhdV9o
X2RwdHIobmQtPnBhdGguZGVudHJ5LCBiaW5kZXgpOworCWlmIChmYWtlX25kLT5wYXRoLmRlbnRy
eSkgeworCQlmYWtlX25kLT5wYXRoLm1udCA9IGF1X3Nicl9tbnQoc2IsIGJpbmRleCk7CisJCUF1
RGVidWdPbighZmFrZV9uZC0+cGF0aC5tbnQpOworCQlwYXRoX2dldCgmZmFrZV9uZC0+cGF0aCk7
CisJfSBlbHNlCisJCWZha2VfbmQgPSBFUlJfUFRSKC1FTk9FTlQpOworCisJQXVUcmFjZUVyclB0
cihmYWtlX25kKTsKKwlyZXR1cm4gZmFrZV9uZDsKK30KKwordm9pZCBhdV9mYWtlX2RtX3JlbGVh
c2Uoc3RydWN0IG5hbWVpZGF0YSAqZmFrZV9uZCkKK3sKKwlpZiAoZmFrZV9uZCkKKwkJcGF0aF9w
dXQoJmZha2VfbmQtPnBhdGgpOworfQorCitpbnQgYXVfaF9jcmVhdGUoc3RydWN0IGlub2RlICpo
X2Rpciwgc3RydWN0IGRlbnRyeSAqaF9kZW50cnksIGludCBtb2RlLAorCQlpbnQgZGxndCwgc3Ry
dWN0IG5hbWVpZGF0YSAqbmQsIHN0cnVjdCB2ZnNtb3VudCAqbmZzbW50KQoreworCWludCBlcnI7
CisKKwlMS1RSVHJhY2UoImhpJWx1LCAlLipzLCAwJW8sIG5kICVkLCBuZnNtbnQgJWRcbiIsCisJ
CSAgaF9kaXItPmlfaW5vLCBBdURMTlBhaXIoaF9kZW50cnkpLCBtb2RlLCAhIW5kLCAhIW5mc21u
dCk7CisKKwllcnIgPSAtRU5PU1lTOworCWlmICghbmZzbW50KQorCQllcnIgPSB2ZnN1Yl9jcmVh
dGUoaF9kaXIsIGhfZGVudHJ5LCBtb2RlLCAvKm5kKi9OVUxMLCBkbGd0KTsKKwllbHNlIHsKKwkJ
c3RydWN0IG5hbWVpZGF0YSBmYWtlX25kOworCisJCWlmIChuZCkKKwkJCWZha2VfbmQgPSAqbmQ7
CisJCWVsc2UKKwkJCW1lbXNldCgmZmFrZV9uZCwgMCwgc2l6ZW9mKGZha2VfbmQpKTsKKwkJZmFr
ZV9uZC5wYXRoLmRlbnRyeSA9IGhfZGVudHJ5OworCQlmYWtlX25kLnBhdGgubW50ID0gbmZzbW50
OworCQlwYXRoX2dldCgmZmFrZV9uZC5wYXRoKTsKKwkJZmFrZV9uZC5mbGFncyA9IExPT0tVUF9D
UkVBVEU7CisJCWZha2VfbmQuaW50ZW50Lm9wZW4uZmxhZ3MgPSBPX0NSRUFUIHwgRk1PREVfUkVB
RDsKKwkJZmFrZV9uZC5pbnRlbnQub3Blbi5jcmVhdGVfbW9kZSA9IG1vZGU7CisKKwkJZXJyID0g
dmZzdWJfY3JlYXRlKGhfZGlyLCBoX2RlbnRyeSwgbW9kZSwgJmZha2VfbmQsIGRsZ3QpOworCQlw
YXRoX3B1dCgmZmFrZV9uZC5wYXRoKTsKKwl9CisKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJu
IGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgYXVfY29weV9maWxlKHN0cnVj
dCBmaWxlICpkc3QsIHN0cnVjdCBmaWxlICpzcmMsIGxvZmZfdCBsZW4sCisJCSBzdHJ1Y3Qgc3Vw
ZXJfYmxvY2sgKnNiKQoreworCWludCBlcnIsIGFsbF96ZXJvOworCXVuc2lnbmVkIGxvbmcgYmxr
c2l6ZTsKKwljaGFyICpidWY7CisJc3RydWN0IHZmc3ViX2FyZ3MgdmFyZ3M7CisJLyogcmVkdWNl
IHN0YWNrIHNwYWNlICovCisJc3RydWN0IGlhdHRyICppYTsKKworCUxLVFJUcmFjZSgiJS4qcywg
JS4qc1xuIiwKKwkJICBBdURMTlBhaXIoZHN0LT5mX2RlbnRyeSksIEF1RExOUGFpcihzcmMtPmZf
ZGVudHJ5KSk7CisJQXVEZWJ1Z09uKCEoZHN0LT5mX21vZGUgJiBGTU9ERV9XUklURSkpOworI2lm
ZGVmIENPTkZJR19BVUZTX0RFQlVHCisJeworCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJCXBh
cmVudCA9IGRnZXRfcGFyZW50KGRzdC0+Zl9kZW50cnkpOworCQlJTXVzdExvY2socGFyZW50LT5k
X2lub2RlKTsKKwkJZHB1dChwYXJlbnQpOworCX0KKyNlbmRpZgorCisJZXJyID0gLUVOT01FTTsK
KwlibGtzaXplID0gZHN0LT5mX2RlbnRyeS0+ZF9zYi0+c19ibG9ja3NpemU7CisJaWYgKCFibGtz
aXplIHx8IFBBR0VfU0laRSA8IGJsa3NpemUpCisJCWJsa3NpemUgPSBQQUdFX1NJWkU7CisJTEtU
UlRyYWNlKCJibGtzaXplICVsdVxuIiwgYmxrc2l6ZSk7CisJYnVmID0ga21hbGxvYyhibGtzaXpl
LCBHRlBfVEVNUE9SQVJZKTsKKwkvL2J1ZiA9IE5VTEw7CisJaWYgKHVubGlrZWx5KCFidWYpKQor
CQlnb3RvIG91dDsKKwlpYSA9IGttYWxsb2Moc2l6ZW9mKCppYSksIEdGUF9URU1QT1JBUlkpOwor
CWlmICh1bmxpa2VseSghaWEpKQorCQlnb3RvIG91dF9idWY7CisKKyNpZmRlZiBDT05GSUdfQVVG
U19ERUJVRworCWlmIChsZW4gPiAoMSA8PCAyMikpCisJCUF1V2FybigiY29weWluZyBhIGxhcmdl
IGZpbGUgJUxkXG4iLCAobG9uZyBsb25nKWxlbik7CisjZW5kaWYKKwl2ZnN1Yl9hcmdzX2luaXQo
JnZhcmdzLCBOVUxMLCBhdV9vcHRfdGVzdF9kbGd0KGF1X21udGZsYWdzKHNiKSksIDApOworCWVy
ciA9IDA7CisJYWxsX3plcm8gPSAwOworCXNyYy0+Zl9wb3MgPSAwOworCWRzdC0+Zl9wb3MgPSAw
OworCXdoaWxlIChsZW4pIHsKKwkJc2l6ZV90IHN6LCByYnl0ZXMsIHdieXRlcywgaTsKKwkJY2hh
ciAqcDsKKworCQlMS1RSVHJhY2UoImxlbiAlbGxkXG4iLCBsZW4pOworCQlzeiA9IGJsa3NpemU7
CisJCWlmIChsZW4gPCBibGtzaXplKQorCQkJc3ogPSBsZW47CisKKwkJLyogc3VwcG9ydCBMU00g
YW5kIG5vdGlmeSAqLworCQlyYnl0ZXMgPSAwOworCQkvLyBzaWduYWxfcGVuZGluZworCQl3aGls
ZSAoIXJieXRlcyB8fCBlcnIgPT0gLUVBR0FJTiB8fCBlcnIgPT0gLUVJTlRSKSB7CisJCQlyYnl0
ZXMgPSB2ZnN1Yl9yZWFkX2soc3JjLCBidWYsIHN6LCAmc3JjLT5mX3BvcywKKwkJCQkJICAgICAg
dmZzdWJfZnRlc3QodmFyZ3MuZmxhZ3MsIERMR1QpKTsKKwkJCWVyciA9IHJieXRlczsKKwkJfQor
CQlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCQlicmVhazsKKworCQlhbGxfemVybyA9IDA7CisJ
CWlmIChsZW4gPj0gcmJ5dGVzICYmIHJieXRlcyA9PSBibGtzaXplKSB7CisJCQkvL3RvZG86IHRy
eSBiaXRtYXAgb3IgbWVtY21wKCkvZ2V0X3plcm9lZF9wYWdlKCkKKwkJCXVuc2lnbmVkIGxvbmcg
KnVscDsKKwkJCXNpemVfdCBuOworCisJCQlhbGxfemVybyA9IDE7CisJCQl1bHAgPSAodm9pZCAq
KWJ1ZjsKKwkJCW4gPSByYnl0ZXMgLyBzaXplb2YoKnVscCk7CisJCQlpID0gbjsKKwkJCXdoaWxl
IChuLS0gPiAwICYmIGFsbF96ZXJvKQorCQkJCWFsbF96ZXJvID0gISp1bHArKzsKKwkJCXAgPSAo
dm9pZCAqKXVscDsKKwkJCWkgKj0gc2l6ZW9mKCp1bHApOworCQkJZm9yICg7IGFsbF96ZXJvICYm
IGkgPCByYnl0ZXM7IGkrKykKKwkJCQlhbGxfemVybyA9ICEqcCsrOworCQl9CisJCWlmICghYWxs
X3plcm8pIHsKKwkJCXdieXRlcyA9IHJieXRlczsKKwkJCXAgPSBidWY7CisJCQl3aGlsZSAod2J5
dGVzKSB7CisJCQkJc2l6ZV90IGI7CisJCQkJLyogc3VwcG9ydCBMU00gYW5kIG5vdGlmeSAqLwor
CQkJCWIgPSB2ZnN1Yl93cml0ZV9rKGRzdCwgcCwgd2J5dGVzLCAmZHN0LT5mX3BvcywKKwkJCQkJ
CSAgJnZhcmdzKTsKKwkJCQllcnIgPSBiOworCQkJCS8vIHNpZ25hbF9wZW5kaW5nCisJCQkJaWYg
KHVubGlrZWx5KGVyciA9PSAtRUFHQUlOIHx8IGVyciA9PSAtRUlOVFIpKQorCQkJCQljb250aW51
ZTsKKwkJCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCQkJCWJyZWFrOworCQkJCXdieXRlcyAt
PSBiOworCQkJCXAgKz0gYjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZmZfdCByZXM7CisJCQlM
S1RSTGFiZWwoaG9sZSk7CisJCQlyZXMgPSB2ZnN1Yl9sbHNlZWsoZHN0LCByYnl0ZXMsIFNFRUtf
Q1VSKTsKKwkJCWVyciA9IHJlczsKKwkJCWlmICh1bmxpa2VseShyZXMgPCAwKSkKKwkJCQlicmVh
azsKKwkJfQorCQlsZW4gLT0gcmJ5dGVzOworCQllcnIgPSAwOworCX0KKworCS8qIHRoZSBsYXN0
IGJsb2NrIG1heSBiZSBhIGhvbGUgKi8KKwlpZiAodW5saWtlbHkoIWVyciAmJiBhbGxfemVybykp
IHsKKwkJc3RydWN0IGRlbnRyeSAqaF9kID0gZHN0LT5mX2RlbnRyeTsKKwkJc3RydWN0IGlub2Rl
ICpoX2kgPSBoX2QtPmRfaW5vZGU7CisKKwkJTEtUUkxhYmVsKGxhc3QgaG9sZSk7CisJCWRvIHsK
KwkJCS8vIHNpZ25hbF9wZW5kaW5nCisJCQllcnIgPSB2ZnN1Yl93cml0ZV9rKGRzdCwgIlwwIiwg
MSwgJmRzdC0+Zl9wb3MsICZ2YXJncyk7CisJCX0gd2hpbGUgKGVyciA9PSAtRUFHQUlOIHx8IGVy
ciA9PSAtRUlOVFIpOworCQlpZiAoZXJyID09IDEpIHsKKwkJCWlhLT5pYV9zaXplID0gZHN0LT5m
X3BvczsKKwkJCWlhLT5pYV92YWxpZCA9IEFUVFJfU0laRSB8IEFUVFJfRklMRTsKKwkJCWlhLT5p
YV9maWxlID0gZHN0OworCQkJbXV0ZXhfbG9ja19uZXN0ZWQoJmhfaS0+aV9tdXRleCwgQXVMc2Nf
SV9DSElMRDIpOworCQkJZXJyID0gdmZzdWJfbm90aWZ5X2NoYW5nZShoX2QsIGlhLCAmdmFyZ3Mp
OworCQkJbXV0ZXhfdW5sb2NrKCZoX2ktPmlfbXV0ZXgpOworCQl9CisJfQorCisJa2ZyZWUoaWEp
OworIG91dF9idWY6CisJa2ZyZWUoYnVmKTsKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJl
dHVybiBlcnI7Cit9CmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVm
cy9taXNjLmggbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL21pc2MuaAotLS0gbGludXgt
Mi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvbWlzYy5oCTE5NzAtMDEtMDEgMDM6MDA6MDAg
KzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9taXNjLmgJMjAwOC0wNS0y
NSAxMTo1NjowOCArMDMwMApAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwNS0yMDA4IEp1bmppcm8gT2thamltYQorICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxv
bmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK
KyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9u
LCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworLyoKKyAqICRJZDogbWlzYy5oLHYgMS4yIDIw
MDgvMDQvMjEgMDE6MzM6MDAgc2Zqcm8gRXhwICQKKyAqLworCisjaWZuZGVmIF9fQVVGU19NSVND
X0hfXworI2RlZmluZSBfX0FVRlNfTUlTQ19IX18KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lu
Y2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxs
aW51eC9hdWZzX3R5cGUuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0eXBlZGVmIHVuc2ln
bmVkIGludCBhdV9nZW5fdDsKKy8qIHNlZSBsaW51eC9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaCAq
LworI2RlZmluZSBBdUdlbllvdW5nZXIoYSwgYikJKChpbnQpKGIpIC0gKGludCkoYSkgPCAwKQor
I2RlZmluZSBBdUdlbk9sZGVyKGEsIGIpCUF1ZnNHZW5Zb3VuZ2VyKGIsIGEpCisKKy8qIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gKi8KKworc3RydWN0IGF1X3J3c2VtIHsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlCXJ3
c2VtOworI2lmZGVmIENPTkZJR19BVUZTX0RFQlVHCisJYXRvbWljX3QJCXJjbnQ7CisjZW5kaWYK
K307CisKKyNpZmRlZiBDT05GSUdfQVVGU19ERUJVRworI2RlZmluZSBBdURiZ1JjbnRJbml0KHJ3
KSBkbyB7IFwKKwlhdG9taWNfc2V0KCYocncpLT5yY250LCAwKTsgXAorCXNtcF9tYigpOyBcCit9
IHdoaWxlICgwKQorCisjZGVmaW5lIEF1RGJnUmNudEluYyhydykJYXRvbWljX2luY19yZXR1cm4o
JihydyktPnJjbnQpCisjZGVmaW5lIEF1RGJnUmNudERlYyhydykJV0FSTl9PTihhdG9taWNfZGVj
X3JldHVybigmKHJ3KS0+cmNudCkgPCAwKQorI2Vsc2UKKyNkZWZpbmUgQXVEYmdSY250SW5pdChy
dykJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIEF1RGJnUmNudEluYyhydykJZG8ge30gd2hpbGUg
KDApCisjZGVmaW5lIEF1RGJnUmNudERlYyhydykJZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyog
Q09ORklHX0FVRlNfREVCVUcgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGF1X3J3X2luaXRfbm9s
b2NrKHN0cnVjdCBhdV9yd3NlbSAqcncpCit7CisJQXVEYmdSY250SW5pdChydyk7CisJaW5pdF9y
d3NlbSgmcnctPnJ3c2VtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF1X3J3X2luaXRfd2xv
Y2soc3RydWN0IGF1X3J3c2VtICpydykKK3sKKwlhdV9yd19pbml0X25vbG9jayhydyk7CisJZG93
bl93cml0ZSgmcnctPnJ3c2VtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF1X3J3X2luaXRf
d2xvY2tfbmVzdGVkKHN0cnVjdCBhdV9yd3NlbSAqcncsCisJCQkJCSAgIHVuc2lnbmVkIGludCBs
c2MpCit7CisJYXVfcndfaW5pdF9ub2xvY2socncpOworCWRvd25fd3JpdGVfbmVzdGVkKCZydy0+
cndzZW0sIGxzYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdV9yd19yZWFkX2xvY2soc3Ry
dWN0IGF1X3J3c2VtICpydykKK3sKKwlkb3duX3JlYWQoJnJ3LT5yd3NlbSk7CisJQXVEYmdSY250
SW5jKHJ3KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF1X3J3X3JlYWRfbG9ja19uZXN0ZWQo
c3RydWN0IGF1X3J3c2VtICpydywgdW5zaWduZWQgaW50IGxzYykKK3sKKwlkb3duX3JlYWRfbmVz
dGVkKCZydy0+cndzZW0sIGxzYyk7CisJQXVEYmdSY250SW5jKHJ3KTsKK30KKworc3RhdGljIGlu
bGluZSB2b2lkIGF1X3J3X3JlYWRfdW5sb2NrKHN0cnVjdCBhdV9yd3NlbSAqcncpCit7CisJQXVE
YmdSY250RGVjKHJ3KTsKKwl1cF9yZWFkKCZydy0+cndzZW0pOworfQorCitzdGF0aWMgaW5saW5l
IHZvaWQgYXVfcndfZGdyYWRlX2xvY2soc3RydWN0IGF1X3J3c2VtICpydykKK3sKKwlBdURiZ1Jj
bnRJbmMocncpOworCWRvd25ncmFkZV93cml0ZSgmcnctPnJ3c2VtKTsKK30KKworc3RhdGljIGlu
bGluZSB2b2lkIGF1X3J3X3dyaXRlX2xvY2soc3RydWN0IGF1X3J3c2VtICpydykKK3sKKwlkb3du
X3dyaXRlKCZydy0+cndzZW0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXVfcndfd3JpdGVf
bG9ja19uZXN0ZWQoc3RydWN0IGF1X3J3c2VtICpydywKKwkJCQkJICAgdW5zaWduZWQgaW50IGxz
YykKK3sKKwlkb3duX3dyaXRlX25lc3RlZCgmcnctPnJ3c2VtLCBsc2MpOworfQorCitzdGF0aWMg
aW5saW5lIHZvaWQgYXVfcndfd3JpdGVfdW5sb2NrKHN0cnVjdCBhdV9yd3NlbSAqcncpCit7CisJ
dXBfd3JpdGUoJnJ3LT5yd3NlbSk7Cit9CisKKy8qIHdoeSBpcyBub3QgX25lc3RlZCB2ZXJzaW9u
IGRlZmluZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF1X3J3X3JlYWRfdHJ5bG9jayhzdHJ1Y3Qg
YXVfcndzZW0gKnJ3KQoreworCWludCByZXQgPSBkb3duX3JlYWRfdHJ5bG9jaygmcnctPnJ3c2Vt
KTsKKwlpZiAocmV0KQorCQlBdURiZ1JjbnRJbmMocncpOworCXJldHVybiByZXQ7Cit9CisKK3N0
YXRpYyBpbmxpbmUgaW50IGF1X3J3X3dyaXRlX3RyeWxvY2soc3RydWN0IGF1X3J3c2VtICpydykK
K3sKKwlyZXR1cm4gZG93bl93cml0ZV90cnlsb2NrKCZydy0+cndzZW0pOworfQorCisjdW5kZWYg
QXVEYmdSY250SW5pdAorI3VuZGVmIEF1RGJnUmNudEluYworI3VuZGVmIEF1RGJnUmNudERlYwor
CisvKiB0byBkZWJ1ZyBlYXNpZXIsIGRvIG5vdCBtYWtlIHRoZW0gaW5saW5lZCBmdW5jdGlvbnMg
Ki8KKyNkZWZpbmUgQXVSd011c3ROb1dhaXRlcnMocncpCUF1RGVidWdPbighbGlzdF9lbXB0eSgm
KHJ3KS0+cndzZW0ud2FpdF9saXN0KSkKKyNkZWZpbmUgQXVSd011c3RBbnlMb2NrKHJ3KQlBdURl
YnVnT24oZG93bl93cml0ZV90cnlsb2NrKCYocncpLT5yd3NlbSkpCisjaWZkZWYgQ09ORklHX0FV
RlNfREVCVUcKKyNkZWZpbmUgQXVSd011c3RSZWFkTG9jayhydykgZG8geyBcCisJQXVSd011c3RB
bnlMb2NrKHJ3KTsgXAorCUF1RGVidWdPbighYXRvbWljX3JlYWQoJihydyktPnJjbnQpKTsgXAor
fSB3aGlsZSAoMCkKKworI2RlZmluZSBBdVJ3TXVzdFdyaXRlTG9jayhydykgZG8geyBcCisJQXVS
d011c3RBbnlMb2NrKHJ3KTsgXAorCUF1RGVidWdPbihhdG9taWNfcmVhZCgmKHJ3KS0+cmNudCkp
OyBcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgQXVSd011c3RSZWFkTG9jayhydykJQXVS
d011c3RBbnlMb2NrKHJ3KQorI2RlZmluZSBBdVJ3TXVzdFdyaXRlTG9jayhydykJQXVSd011c3RB
bnlMb2NrKHJ3KQorI2VuZGlmIC8qIENPTkZJR19BVUZTX0RFQlVHICovCisKKyNkZWZpbmUgQXVT
aW1wbGVMb2NrUndzZW1GdW5jcyhwcmVmaXgsIHBhcmFtLCByd3NlbSkgXAorc3RhdGljIGlubGlu
ZSB2b2lkIHByZWZpeCMjX3JlYWRfbG9jayhwYXJhbSkgXAoreyBhdV9yd19yZWFkX2xvY2soJihy
d3NlbSkpOyB9IFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVmaXgjI193cml0ZV9sb2NrKHBhcmFt
KSBcCit7IGF1X3J3X3dyaXRlX2xvY2soJihyd3NlbSkpOyB9IFwKK3N0YXRpYyBpbmxpbmUgaW50
IHByZWZpeCMjX3JlYWRfdHJ5bG9jayhwYXJhbSkgXAoreyByZXR1cm4gYXVfcndfcmVhZF90cnls
b2NrKCYocndzZW0pKTsgfSBcCitzdGF0aWMgaW5saW5lIGludCBwcmVmaXgjI193cml0ZV90cnls
b2NrKHBhcmFtKSBcCit7IHJldHVybiBhdV9yd193cml0ZV90cnlsb2NrKCYocndzZW0pKTsgfQor
Ly9zdGF0aWMgaW5saW5lIHZvaWQgcHJlZml4IyNfcmVhZF90cnlsb2NrX25lc3RlZChwYXJhbSwg
bHNjKQorLy97YXVfcndfcmVhZF90cnlsb2NrX25lc3RlZCgmKHJ3c2VtLCBsc2MpKTt9CisvL3N0
YXRpYyBpbmxpbmUgdm9pZCBwcmVmaXgjI193cml0ZV90cnlsb2NrX25lc3RkKHBhcmFtLCBsc2Mp
CisvL3thdV9yd193cml0ZV90cnlsb2NrX25lc3RlZCgmKHJ3c2VtKSwgbmVzdGVkKTt9CisKKyNk
ZWZpbmUgQXVTaW1wbGVVbmxvY2tSd3NlbUZ1bmNzKHByZWZpeCwgcGFyYW0sIHJ3c2VtKSBcCitz
dGF0aWMgaW5saW5lIHZvaWQgcHJlZml4IyNfcmVhZF91bmxvY2socGFyYW0pIFwKK3sgYXVfcndf
cmVhZF91bmxvY2soJihyd3NlbSkpOyB9IFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVmaXgjI193
cml0ZV91bmxvY2socGFyYW0pIFwKK3sgYXVfcndfd3JpdGVfdW5sb2NrKCYocndzZW0pKTsgfSBc
CitzdGF0aWMgaW5saW5lIHZvaWQgcHJlZml4IyNfZG93bmdyYWRlX2xvY2socGFyYW0pIFwKK3sg
YXVfcndfZGdyYWRlX2xvY2soJihyd3NlbSkpOyB9CisKKyNkZWZpbmUgQXVTaW1wbGVSd3NlbUZ1
bmNzKHByZWZpeCwgcGFyYW0sIHJ3c2VtKSBcCisJQXVTaW1wbGVMb2NrUndzZW1GdW5jcyhwcmVm
aXgsIHBhcmFtLCByd3NlbSkgXAorCUF1U2ltcGxlVW5sb2NrUndzZW1GdW5jcyhwcmVmaXgsIHBh
cmFtLCByd3NlbSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICphdV9renJlYWxsb2Mo
dm9pZCAqcCwgdW5zaWduZWQgaW50IG51c2VkLCB1bnNpZ25lZCBpbnQgbmV3X3N6LCBnZnBfdCBn
ZnApOworCitzdHJ1Y3QgYXVfc2JpbmZvOworc3RydWN0IG5hbWVpZGF0YSAqYXVfZHVwX25kKHN0
cnVjdCBhdV9zYmluZm8gKnNiaW5mbywgc3RydWN0IG5hbWVpZGF0YSAqZHN0LAorCQkJICAgIHN0
cnVjdCBuYW1laWRhdGEgKnNyYyk7CisKK3N0cnVjdCBuYW1laWRhdGEgKmF1X2Zha2VfZG0oc3Ry
dWN0IG5hbWVpZGF0YSAqZmFrZV9uZCwgc3RydWN0IG5hbWVpZGF0YSAqbmQsCisJCQkgICAgIHN0
cnVjdCBzdXBlcl9ibG9jayAqc2IsIGF1ZnNfYmluZGV4X3QgYmluZGV4KTsKK3ZvaWQgYXVfZmFr
ZV9kbV9yZWxlYXNlKHN0cnVjdCBuYW1laWRhdGEgKmZha2VfbmQpOworaW50IGF1X2hfY3JlYXRl
KHN0cnVjdCBpbm9kZSAqaF9kaXIsIHN0cnVjdCBkZW50cnkgKmhfZGVudHJ5LCBpbnQgbW9kZSwK
KwkJaW50IGRsZ3QsIHN0cnVjdCBuYW1laWRhdGEgKm5kLCBzdHJ1Y3QgdmZzbW91bnQgKm5mc21u
dCk7CisKK2ludCBhdV9jb3B5X2ZpbGUoc3RydWN0IGZpbGUgKmRzdCwgc3RydWN0IGZpbGUgKnNy
YywgbG9mZl90IGxlbiwKKwkJIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCisjZW5kaWYgLyog
X19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fQVVGU19NSVNDX0hfXyAqLwpkaWZmIC11ck4gbGlu
dXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvbW9kdWxlLmMgbGludXgtMi42LjI1LjQt
dW5pb25mcy9mcy9hdWZzL21vZHVsZS5jCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcv
ZnMvYXVmcy9tb2R1bGUuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYu
MjUuNC11bmlvbmZzL2ZzL2F1ZnMvbW9kdWxlLmMJMjAwOC0wNS0yNSAxMTo1ODo1MyArMDMwMApA
QCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBKdW5qaXJvIE9rYWpp
bWEKKyAqCisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
CisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJv
Z3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBp
ZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQor
ICovCisKKy8qCisgKiBtb2R1bGUgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgb3BlcmF0aW9ucworICoK
KyAqICRJZDogbW9kdWxlLmMsdiAxLjQgMjAwOC8wNS8xOSAwMTo0OToyNCBzZmpybyBFeHAgJAor
ICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlICJhdWZzLmgiCisKKy8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGF1ZnMgY2FjaGVzCisgKi8KK3N0cnVjdCBrbWVt
X2NhY2hlICphdV9jYWNoZXBbQXVDYWNoZV9MYXN0XTsKK3N0YXRpYyBpbnQgX19pbml0IGNyZWF0
ZV9jYWNoZSh2b2lkKQoreworCWF1X2NhY2hlcFtBdUNhY2hlX0RJTkZPXSA9IEF1Q2FjaGUoYXVf
ZGluZm8pOworCWlmIChhdV9jYWNoZXBbQXVDYWNoZV9ESU5GT10pCisJCWF1X2NhY2hlcFtBdUNh
Y2hlX0lDTlROUl0gPSBBdUNhY2hlKGF1ZnNfaWNudG5yKTsKKwlpZiAoYXVfY2FjaGVwW0F1Q2Fj
aGVfSUNOVE5SXSkKKwkJYXVfY2FjaGVwW0F1Q2FjaGVfRklORk9dID0gQXVDYWNoZShhdV9maW5m
byk7CisJLy9hdV9jYWNoZXBbQXVDYWNoZV9GSU5GT10gPSBOVUxMOworCWlmIChhdV9jYWNoZXBb
QXVDYWNoZV9GSU5GT10pCisJCWF1X2NhY2hlcFtBdUNhY2hlX1ZESVJdID0gQXVDYWNoZShhdV92
ZGlyKTsKKwlpZiAoYXVfY2FjaGVwW0F1Q2FjaGVfVkRJUl0pCisJCWF1X2NhY2hlcFtBdUNhY2hl
X0RFSFNUUl0gPSBBdUNhY2hlKGF1X3ZkaXJfZGVoc3RyKTsKKwlpZiAoYXVfY2FjaGVwW0F1Q2Fj
aGVfREVIU1RSXSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGlj
IHZvaWQgZGVzdHJveV9jYWNoZSh2b2lkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBB
dUNhY2hlX0xhc3Q7IGkrKykKKwkJaWYgKGF1X2NhY2hlcFtpXSkgeworCQkJa21lbV9jYWNoZV9k
ZXN0cm95KGF1X2NhY2hlcFtpXSk7CisJCQlhdV9jYWNoZXBbaV0gPSBOVUxMOworCQl9Cit9CisK
Ky8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY2hhciBhdV9lc2NfY2hhcnNbMHgyMCArIDNdOyAvKiAw
eDAxLTB4MjAsIGJhY2tzbGFzaCwgZGVsLCBhbmQgTlVMTCAqLworaW50IGF1X2Rpcl9yb2ZsYWdz
OworCisvKgorICogZnVuY3Rpb25zIGZvciBtb2R1bGUgaW50ZXJmYWNlLgorICovCitNT0RVTEVf
TElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKdW5qaXJvIE9rYWppbWEiKTsKK01PRFVM
RV9ERVNDUklQVElPTihBVUZTX05BTUUgIiAtLSBBbm90aGVyIHVuaW9uZnMiKTsKK01PRFVMRV9W
RVJTSU9OKEFVRlNfVkVSU0lPTik7CisKKy8qIGl0IHNob3VsZCBiZSAnYnl0ZScsIGJ1dCBwYXJh
bV9zZXRfYnl0ZSgpIHByaW50cyBpdCBieSAiJWMiICovCitzaG9ydCBhdWZzX253a3EgPSBBVUZT
X05XS1FfREVGOworTU9EVUxFX1BBUk1fREVTQyhud2txLCAidGhlIG51bWJlciBvZiB3b3JrcXVl
dWUgdGhyZWFkLCAiIEFVRlNfV0tRX05BTUUpOworbW9kdWxlX3BhcmFtX25hbWVkKG53a3EsIGF1
ZnNfbndrcSwgc2hvcnQsIFNfSVJVR08pOworCitpbnQgc3lzYXVmc19icnM7CitNT0RVTEVfUEFS
TV9ERVNDKGJycywgInVzZSA8c3lzZnM+L2ZzL2F1ZnMvc2lfKi9ick4iKTsKK21vZHVsZV9wYXJh
bV9uYW1lZChicnMsIHN5c2F1ZnNfYnJzLCBpbnQsIFNfSVJVR08pOworCisvKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGF1ZnNfaW5pdCh2b2lkKQoreworCWludCBlcnIs
IGk7CisJY2hhciAqcDsKKworCWF1X2RlYnVnX2luaXQoKTsKKworCXAgPSBhdV9lc2NfY2hhcnM7
CisJZm9yIChpID0gMTsgaSA8PSAnICc7IGkrKykKKwkJKnArKyA9IGk7CisJKnArKyA9ICdcXCc7
CisJKnArKyA9ICdceDdmJzsKKwkqcCA9IDA7CisKKwlhdV9kaXJfcm9mbGFncyA9IGF1X2ZpbGVf
cm9mbGFncyhPX0RJUkVDVE9SWSB8IE9fTEFSR0VGSUxFKTsKKworCWVyciA9IC1FSU5WQUw7CisJ
aWYgKHVubGlrZWx5KGF1ZnNfbndrcSA8PSAwKSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzeXNh
dWZzX2luaXQoKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXQ7CisJZXJyID0gYXVf
d2txX2luaXQoKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXRfc3lzYXVmczsKKwll
cnIgPSBhdV9pbm90aWZ5X2luaXQoKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXRf
d2txOworCWVyciA9IGF1X3N5c3JxX2luaXQoKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290
byBvdXRfaW5vdGlmeTsKKworCWVyciA9IGNyZWF0ZV9jYWNoZSgpOworCWlmICh1bmxpa2VseShl
cnIpKQorCQlnb3RvIG91dF9zeXNycTsKKworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmF1
ZnNfZnNfdHlwZSk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0X2NhY2hlOworCXBy
X2luZm8oQVVGU19OQU1FICIgIiBBVUZTX1ZFUlNJT04gIlxuIik7CisJcmV0dXJuIDA7IC8qIHN1
Y2Nlc3MgKi8KKworIG91dF9jYWNoZToKKwlkZXN0cm95X2NhY2hlKCk7Cisgb3V0X3N5c3JxOgor
CWF1X3N5c3JxX2ZpbigpOworIG91dF9pbm90aWZ5OgorCWF1X2lub3RpZnlfZmluKCk7Cisgb3V0
X3drcToKKwlhdV93a3FfZmluKCk7Cisgb3V0X3N5c2F1ZnM6CisJc3lzYXVmc19maW4oKTsKKyBv
dXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9f
ZXhpdCBhdWZzX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmF1ZnNfZnNf
dHlwZSk7CisJZGVzdHJveV9jYWNoZSgpOworCisJYXVfc3lzcnFfZmluKCk7CisJYXVfaW5vdGlm
eV9maW4oKTsKKwlhdV93a3FfZmluKCk7CisJc3lzYXVmc19maW4oKTsKK30KKworbW9kdWxlX2lu
aXQoYXVmc19pbml0KTsKK21vZHVsZV9leGl0KGF1ZnNfZXhpdCk7CisKKy8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KKworLyogZmFrZSBLY29uZmlnICovCisjaWYgMQorCisjaWZkZWYgQ09ORklHX0FVRlNf
SElOT1RJRlkKKyNpZm5kZWYgQ09ORklHX0lOT1RJRlkKKyNlcnJvciBlbmFibGUgQ09ORklHX0lO
T1RJRlkgdG8gdXNlIENPTkZJR19BVUZTX0hJTk9USUZZLgorI2VuZGlmCisjZW5kaWYgLyogQ09O
RklHX0FVRlNfSElOT1RJRlkgKi8KKworI2lmIEFVRlNfQlJBTkNIX01BWCA+IDUxMSAmJiBQQUdF
X1NJWkUgPiA0MDk2Cisjd2FybmluZyBwYWdlc2l6ZSBpcyBsYXJnZXIgdGhhbiA0a2IsIFwKKwlD
T05GSUdfQVVGU19CUkFOQ0hfTUFYXzUxMSBvciBzbWFsbGVyIGlzIHJlY29tbWVuZGVkLgorI2Vu
ZGlmCisKKyNpZmRlZiBDT05GSUdfQVVGU19TVEFUCisjaWZuZGVmIENPTkZJR19TWVNGUworI2Vy
cm9yIENPTkZJR19BVUZTX1NUQVQgcmVxdWlyZXMgQ09ORklHX1NZU0ZTLgorI2VuZGlmCisjZW5k
aWYgLyogQ09ORklHX0FVRlNfU1RBVCAqLworCisjaWZkZWYgQ09ORklHX0FVRlNfRVhQT1JUCisj
aWYgIWRlZmluZWQoQ09ORklHX0VYUE9SVEZTKSAmJiAhZGVmaW5lZChDT05GSUdfRVhQT1JURlNf
TU9EVUxFKQorI2Vycm9yIENPTkZJR19BVUZTX0VYUE9SVCByZXF1aXJlcyBDT05GSUdfRVhQT1JU
RlMKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0VYUE9SVEZTX01PRFVMRSkgJiYgZGVmaW5l
ZChDT05GSUdfQVVGUykKKyNlcnJvciBuZWVkIENPTkZJR19FWFBPUlRGUyA9IHkgdG8gbGluayBh
dWZzIHN0YXRpY2FsbHkgd2l0aCBDT05GSUdfQVVGU19FWFBPUlQKKyNlbmRpZgorI2VuZGlmIC8q
IENPTkZJR19BVUZTX0VYUE9SVCAqLworCisjaWZkZWYgQ09ORklHX0FVRlNfU0VDX1BFUk1fUEFU
Q0gKKyNpZm5kZWYgQ09ORklHX1NFQ1VSSVRZCisjd2FybmluZyBDT05GSUdfQVVGU19TRUNfUEVS
TV9QQVRDSCBpcyB1bm5lY2Vzc2FyeSBzaW5jZSBDT05GSUdfU0VDVVJJVFkgaXMgZGlzYWJsZWQu
CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVVGUworI3dhcm5pbmcgQ09ORklHX0FVRlNfU0VDX1BF
Uk1fUEFUQ0ggaXMgdW5uZWNlc3Nhcnkgc2luY2UgQ09ORklHX0FVRlMgaXMgbm90IGEgbW9kdWxl
LgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BVUZTX0ZBS0VfRE0KKyN3YXJuaW5n
IENPTkZJR19BVUZTX0ZBS0VfRE0gaXMgb2Jzb2xldGVkIGluIGxpbnV4LTIuNi4yNCBhbmQgbGF0
ZXIuCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BVUZTX1BVVF9GSUxQX1BBVENICisjaWYgIWRl
ZmluZWQoQ09ORklHX05GU19GUykgJiYgIWRlZmluZWQoQ09ORklHX05GU19GU19NT0RVTEUpCisj
d2FybmluZyBDT05GSUdfQVVGU19QVVRfRklMUF9QQVRDSCBpcyB1bm5lY2Vzc2FyeSBzaW5jZSBD
T05GSUdfTkZTX0ZTIGlzIGRpc2FibGVkLgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FVRlMKKyN3
YXJuaW5nIENPTkZJR19BVUZTX1BVVF9GSUxQX1BBVENIIGlzIHVubmVjZXNzYXJ5IHNpbmNlIENP
TkZJR19BVUZTIGlzIG5vdCBhIG1vZHVsZS4KKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19BVUZT
X1BVVF9GSUxQX1BBVENIICovCisKKyNpZmRlZiBDT05GSUdfQVVGU19MSEFTSF9QQVRDSAorI2lm
ICFkZWZpbmVkKENPTkZJR19ORlNfRlMpICYmICFkZWZpbmVkKENPTkZJR19ORlNfRlNfTU9EVUxF
KQorI3dhcm5pbmcgQ09ORklHX0FVRlNfTEhBU0hfUEFUQ0ggaXMgdW5uZWNlc3Nhcnkgc2luY2Ug
Q09ORklHX05GU19GUyBpcyBkaXNhYmxlZC4KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBDT05G
SUdfQVVGU19LU0laRV9QQVRDSAorI3dhcm5pbmcgQ09ORklHX0FVRlNfS1NJWkVfUEFUQ0ggaXMg
dW5uZWNlc3NhcnkgZm9yIGxpbnV4LTIuNi4yMiBhbmQgbGF0ZXIuCisjZW5kaWYKKworI2lmZGVm
IENPTkZJR19BVUZTX1dPUktBUk9VTkRfRlVTRQorI2lmICFkZWZpbmVkKENPTkZJR19GVVNFX0ZT
KSAmJiAhZGVmaW5lZChDT05GSUdfRlVTRV9GU19NT0RVTEUpCisjd2FybmluZyBDT05GSUdfQVVG
U19XT1JLQVJPVU5EX0ZVU0UgaXMgZW5hYmxlZCB3aGlsZSBGVVNFIGlzIGRpc2FibGVkLgorI2Vu
ZGlmCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ERUJVR19QUk9WRV9MT0NLSU5HCisjaWYgTUFY
X0xPQ0tERVBfU1VCQ0xBU1NFUyA8IEF1THNjX0lfRW5kCisjd2FybmluZyBsb2NrZGVwIHdpbGwg
bm90IHdvcmsgc2luY2UgYXVmcyB1c2VzIGRlZXBlciBsb2Nrcy4KKyNlbmRpZgorI2VuZGlmCisK
KyNpZmRlZiBDT05GSUdfQVVGU19DT01QQVQKKyN3YXJuaW5nIENPTkZJR19BVUZTX0NPTVBBVCB3
aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLgorI2VuZGlmCisKKyNlbmRpZgpkaWZm
IC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvbW9kdWxlLmggbGludXgt
Mi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL21vZHVsZS5oCi0tLSBsaW51eC0yLjYuMjUuNC11bmlv
bmZzLm9yaWcvZnMvYXVmcy9tb2R1bGUuaAkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBs
aW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvbW9kdWxlLmgJMjAwOC0wNS0yNSAxMTo1Njow
OCArMDMwMApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDgg
SnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9ncmFtLCBhdWZzIGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRo
aXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjEx
MC0xMzAxICBVU0EKKyAqLworCisvKgorICogbW9kdWxlIGluaXRpYWxpemF0aW9uIGFuZCBtb2R1
bGUtZ2xvYmFsCisgKgorICogJElkOiBtb2R1bGUuaCx2IDEuMiAyMDA4LzA0LzIxIDAxOjMzOjAw
IHNmanJvIEV4cCAkCisgKi8KKworI2lmbmRlZiBfX0FVRlNfTU9EVUxFX0hfXworI2RlZmluZSBf
X0FVRlNfTU9EVUxFX0hfXworCisjaWZkZWYgX19LRVJORUxfXworCisvLyNpbmNsdWRlIDxsaW51
eC9zbGFiLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogbW9kdWxlIHBhcmFtZXRlcnMg
Ki8KK2V4dGVybiBzaG9ydCBhdWZzX253a3E7CitleHRlcm4gaW50IHN5c2F1ZnNfYnJzOworCisv
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBjaGFyIGF1X2VzY19jaGFyc1tdOworZXh0ZXJu
IGludCBhdV9kaXJfcm9mbGFnczsKKworLyoga21lbSBjYWNoZSAqLworZW51bSB7CisJQXVDYWNo
ZV9ESU5GTywKKwlBdUNhY2hlX0lDTlROUiwKKwlBdUNhY2hlX0ZJTkZPLAorCUF1Q2FjaGVfVkRJ
UiwKKwlBdUNhY2hlX0RFSFNUUiwKKyNpZmRlZiBDT05GSUdfQVVGU19ISU5PVElGWQorCUF1Q2Fj
aGVfSElOT1RJRlksCisjZW5kaWYKKwlBdUNhY2hlX0xhc3QKK307CisKK2V4dGVybiBzdHJ1Y3Qg
a21lbV9jYWNoZSAqYXVfY2FjaGVwW107CisKKyNkZWZpbmUgQXVDYWNoZUFyZ3ModHlwZSwgc3op
CSh0eXBlKSwgKHN6KSwgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsIE5VTEwKKyNkZWZpbmUgQXVD
YWNoZVgodHlwZSwgZXh0cmEpIFwKKwlrbWVtX2NhY2hlX2NyZWF0ZShBdUNhY2hlQXJncygjdHlw
ZSwgc2l6ZW9mKHN0cnVjdCB0eXBlKSArIGV4dHJhKSkKKyNkZWZpbmUgQXVDYWNoZSh0eXBlKQkJ
QXVDYWNoZVgodHlwZSwgMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEF1Q2Fj
aGVGdW5jcyhuYW1lLCBpbmRleCkgXAorc3RhdGljIGlubGluZSB2b2lkICphdV9jYWNoZV9hbGxv
Y18jI25hbWUodm9pZCkgXAoreyByZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhhdV9jYWNoZXBbaW5k
ZXhdLCBHRlBfS0VSTkVMKTsgfSBcCitzdGF0aWMgaW5saW5lIHZvaWQgYXVfY2FjaGVfZnJlZV8j
I25hbWUodm9pZCAqcCkgXAoreyBrbWVtX2NhY2hlX2ZyZWUoYXVfY2FjaGVwW2luZGV4XSwgcCk7
IH0KKworQXVDYWNoZUZ1bmNzKGRpbmZvLCBBdUNhY2hlX0RJTkZPKTsKK0F1Q2FjaGVGdW5jcyhp
Y250bnIsIEF1Q2FjaGVfSUNOVE5SKTsKK0F1Q2FjaGVGdW5jcyhmaW5mbywgQXVDYWNoZV9GSU5G
Tyk7CitBdUNhY2hlRnVuY3ModmRpciwgQXVDYWNoZV9WRElSKTsKK0F1Q2FjaGVGdW5jcyhkZWhz
dHIsIEF1Q2FjaGVfREVIU1RSKTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAv
KiBfX0FVRlNfTU9EVUxFX0hfXyAqLwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5v
cmlnL2ZzL2F1ZnMvb3B0cy5jIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9vcHRzLmMK
LS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL29wdHMuYwkxOTcwLTAxLTAx
IDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvb3B0cy5j
CTIwMDgtMDUtMjUgMTI6MDA6MTUgKzAzMDAKQEAgLTAsMCArMSwxNDY1IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9ncmFt
LCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt
b2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBH
TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJl
ZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZs
b29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogbW91bnQgb3B0
aW9ucy9mbGFncworICoKKyAqICRJZDogb3B0cy5jLHYgMS41IDIwMDgvMDUvMTkgMDE6NDk6MzYg
c2Zqcm8gRXhwICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4gLyogYSBkaXN0cmli
dXRpb24gcmVxdWlyZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlICJh
dWZzLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSB7CisJT3B0X2JyLAorCU9wdF9h
ZGQsIE9wdF9kZWwsIE9wdF9tb2QsIE9wdF9yZW9yZGVyLCBPcHRfYXBwZW5kLCBPcHRfcHJlcGVu
ZCwKKwlPcHRfaWRlbCwgT3B0X2ltb2QsIE9wdF9pcmVvcmRlciwKKwlPcHRfZGlyd2gsIE9wdF9y
ZGNhY2hlLCBPcHRfZGVibGssIE9wdF9uaGFzaCwgT3B0X3JlbmRpciwKKwlPcHRfeGlubywgT3B0
X3p4aW5vLCBPcHRfbm94aW5vLAorCU9wdF90cnVuY194aW5vLCBPcHRfdHJ1bmNfeGlub192LCBP
cHRfbm90cnVuY194aW5vLAorCU9wdF90cnVuY194aW5vX3BhdGgsIE9wdF9pdHJ1bmNfeGlubywK
KwlPcHRfeGlub2RpciwgT3B0X3hpbm9uYW1lcywgT3B0X2l4aW5vbmFtZXMsCisJT3B0X3RydW5j
X3hpYiwgT3B0X25vdHJ1bmNfeGliLAorCU9wdF9kaXJwZXJtMSwgT3B0X25vZGlycGVybTEsCisJ
T3B0X3Nod2gsIE9wdF9ub3Nod2gsCisJT3B0X3BsaW5rLCBPcHRfbm9wbGluaywgT3B0X2xpc3Rf
cGxpbmssIE9wdF9jbGVhbl9wbGluaywKKwlPcHRfdWRiYSwKKwkvL09wdF9sb2NrLCBPcHRfdW5s
b2NrLAorCU9wdF9jbWQsIE9wdF9jbWRfYXJncywKKwlPcHRfZGlyb3BxX2EsIE9wdF9kaXJvcHFf
dywKKwlPcHRfd2Fybl9wZXJtLCBPcHRfbm93YXJuX3Blcm0sCisJT3B0X3dicl9jb3B5dXAsIE9w
dF93YnJfY3JlYXRlLAorCU9wdF9jb28sCisJT3B0X2RsZ3QsIE9wdF9ub2RsZ3QsCisJT3B0X3Jl
ZnJvZiwgT3B0X25vcmVmcm9mLAorCU9wdF92ZXJib3NlLCBPcHRfbm92ZXJib3NlLAorCU9wdF90
YWlsLCBPcHRfaWdub3JlLCBPcHRfaWdub3JlX3NpbGVudCwgT3B0X2VycgorfTsKKworc3RhdGlj
IG1hdGNoX3RhYmxlX3Qgb3B0aW9ucyA9IHsKKwl7T3B0X2JyLCAiYnI9JXMifSwKKwl7T3B0X2Jy
LCAiYnI6JXMifSwKKworCXtPcHRfYWRkLCAiYWRkPSVkOiVzIn0sCisJe09wdF9hZGQsICJhZGQ6
JWQ6JXMifSwKKwl7T3B0X2FkZCwgImlucz0lZDolcyJ9LAorCXtPcHRfYWRkLCAiaW5zOiVkOiVz
In0sCisJe09wdF9hcHBlbmQsICJhcHBlbmQ9JXMifSwKKwl7T3B0X2FwcGVuZCwgImFwcGVuZDol
cyJ9LAorCXtPcHRfcHJlcGVuZCwgInByZXBlbmQ9JXMifSwKKwl7T3B0X3ByZXBlbmQsICJwcmVw
ZW5kOiVzIn0sCisKKwl7T3B0X2RlbCwgImRlbD0lcyJ9LAorCXtPcHRfZGVsLCAiZGVsOiVzIn0s
CisJLy97T3B0X2lkZWwsICJpZGVsOiVkIn0sCisJe09wdF9tb2QsICJtb2Q9JXMifSwKKwl7T3B0
X21vZCwgIm1vZDolcyJ9LAorCXtPcHRfaW1vZCwgImltb2Q6JWQ6JXMifSwKKworCXtPcHRfZGly
d2gsICJkaXJ3aD0lZCJ9LAorCXtPcHRfZGlyd2gsICJkaXJ3aDolZCJ9LAorCisJe09wdF94aW5v
LCAieGlubz0lcyJ9LAorCXtPcHRfeGlubywgInhpbm86JXMifSwKKwl7T3B0X3hpbm9kaXIsICJ4
aW5vZGlyPSVzIn0sCisJe09wdF94aW5vZGlyLCAieGlub2RpcjolcyJ9LAorCXtPcHRfbm94aW5v
LCAibm94aW5vIn0sCisJe09wdF90cnVuY194aW5vLCAidHJ1bmNfeGlubyJ9LAorCXtPcHRfdHJ1
bmNfeGlub192LCAidHJ1bmNfeGlub192PSVkOiVkIn0sCisJe09wdF9ub3RydW5jX3hpbm8sICJu
b3RydW5jX3hpbm8ifSwKKwl7T3B0X3RydW5jX3hpbm9fcGF0aCwgInRydW5jX3hpbm89JXMifSwK
Kwl7T3B0X3RydW5jX3hpbm9fcGF0aCwgInRydW5jX3hpbm86JXMifSwKKwl7T3B0X2l0cnVuY194
aW5vLCAiaXRydW5jX3hpbm89JWQifSwKKwl7T3B0X2l0cnVuY194aW5vLCAiaXRydW5jX3hpbm86
JWQifSwKKwkvL3tPcHRfenhpbm8sICJ6eGlubz0lcyJ9LAorCXtPcHRfdHJ1bmNfeGliLCAidHJ1
bmNfeGliIn0sCisJe09wdF9ub3RydW5jX3hpYiwgIm5vdHJ1bmNfeGliIn0sCisKKwl7T3B0X3Bs
aW5rLCAicGxpbmsifSwKKwl7T3B0X25vcGxpbmssICJub3BsaW5rIn0sCisjaWZkZWYgQ09ORklH
X0FVRlNfREVCVUcKKwl7T3B0X2xpc3RfcGxpbmssICJsaXN0X3BsaW5rIn0sCisjZW5kaWYKKwl7
T3B0X2NsZWFuX3BsaW5rLCAiY2xlYW5fcGxpbmsifSwKKworCXtPcHRfdWRiYSwgInVkYmE9JXMi
fSwKKworCXtPcHRfZGlyb3BxX2EsICJkaXJvcHE9YWx3YXlzIn0sCisJe09wdF9kaXJvcHFfYSwg
ImRpcm9wcT1hIn0sCisJe09wdF9kaXJvcHFfdywgImRpcm9wcT13aGl0ZW91dGVkIn0sCisJe09w
dF9kaXJvcHFfdywgImRpcm9wcT13In0sCisKKwl7T3B0X3dhcm5fcGVybSwgIndhcm5fcGVybSJ9
LAorCXtPcHRfbm93YXJuX3Blcm0sICJub3dhcm5fcGVybSJ9LAorCisjaWZkZWYgQ09ORklHX0FV
RlNfRExHVAorCXtPcHRfZGxndCwgImRsZ3QifSwKKwl7T3B0X25vZGxndCwgIm5vZGxndCJ9LAor
CisJe09wdF9kaXJwZXJtMSwgImRpcnBlcm0xIn0sCisJe09wdF9ub2RpcnBlcm0xLCAibm9kaXJw
ZXJtMSJ9LAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVVGU19TSFdICisJe09wdF9zaHdoLCAi
c2h3aCJ9LAorCXtPcHRfbm9zaHdoLCAibm9zaHdoIn0sCisjZW5kaWYKKworCXtPcHRfcmVuZGly
LCAicmVuZGlyPSVkIn0sCisJe09wdF9yZW5kaXIsICJyZW5kaXI6JWQifSwKKworCXtPcHRfcmVm
cm9mLCAicmVmcm9mIn0sCisJe09wdF9ub3JlZnJvZiwgIm5vcmVmcm9mIn0sCisKKwl7T3B0X3Zl
cmJvc2UsICJ2ZXJib3NlIn0sCisJe09wdF92ZXJib3NlLCAidiJ9LAorCXtPcHRfbm92ZXJib3Nl
LCAibm92ZXJib3NlIn0sCisJe09wdF9ub3ZlcmJvc2UsICJxdWlldCJ9LAorCXtPcHRfbm92ZXJi
b3NlLCAicSJ9LAorCXtPcHRfbm92ZXJib3NlLCAic2lsZW50In0sCisKKwl7T3B0X3JkY2FjaGUs
ICJyZGNhY2hlPSVkIn0sCisJe09wdF9yZGNhY2hlLCAicmRjYWNoZTolZCJ9LAorCisJe09wdF9j
b28sICJjb289JXMifSwKKworCXtPcHRfd2JyX2NyZWF0ZSwgImNyZWF0ZT0lcyJ9LAorCXtPcHRf
d2JyX2NyZWF0ZSwgImNyZWF0ZTolcyJ9LAorCXtPcHRfd2JyX2NyZWF0ZSwgImNyZWF0ZV9wb2xp
Y3k9JXMifSwKKwl7T3B0X3dicl9jcmVhdGUsICJjcmVhdGVfcG9saWN5OiVzIn0sCisJe09wdF93
YnJfY29weXVwLCAiY3B1cD0lcyJ9LAorCXtPcHRfd2JyX2NvcHl1cCwgImNwdXA6JXMifSwKKwl7
T3B0X3dicl9jb3B5dXAsICJjb3B5dXA9JXMifSwKKwl7T3B0X3dicl9jb3B5dXAsICJjb3B5dXA6
JXMifSwKKwl7T3B0X3dicl9jb3B5dXAsICJjb3B5dXBfcG9saWN5PSVzIn0sCisJe09wdF93YnJf
Y29weXVwLCAiY29weXVwX3BvbGljeTolcyJ9LAorCisJLyogaW50ZXJuYWwgdXNlIGZvciB0aGUg
c2NyaXB0cyAqLworCXtPcHRfaWdub3JlX3NpbGVudCwgInNpPSVzIn0sCisKKwl7T3B0X2JyLCAi
ZGlycz0lcyJ9LAorCXtPcHRfaWdub3JlLCAiZGVidWc9JWQifSwKKwl7T3B0X2lnbm9yZSwgImRl
bGV0ZT13aGl0ZW91dCJ9LAorCXtPcHRfaWdub3JlLCAiZGVsZXRlPWFsbCJ9LAorCXtPcHRfaWdu
b3JlLCAiaW1hcD0lcyJ9LAorCisJe09wdF9lcnIsIE5VTEx9Cit9OworCisvKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyICphdV9wYXJzZXJfcGF0dGVybihpbnQgdmFsLCBz
dHJ1Y3QgbWF0Y2hfdG9rZW4gKnRva2VuKQoreworCXdoaWxlICh0b2tlbi0+cGF0dGVybikgewor
CQlpZiAodG9rZW4tPnRva2VuID09IHZhbCkKKwkJCXJldHVybiB0b2tlbi0+cGF0dGVybjsKKwkJ
dG9rZW4rKzsKKwl9CisJQlVHKCk7CisJcmV0dXJuICI/PyI7Cit9CisKKy8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KKworI2RlZmluZSBSVwkJInJ3IgorI2RlZmluZSBSTwkJInJvIgorI2RlZmluZSBXSAkJ
IndoIgorI2RlZmluZSBSUgkJInJyIgorI2RlZmluZSBOb0xpbmtXSAkibm9sd2giCisKK3N0YXRp
YyBtYXRjaF90YWJsZV90IGJycGVybXMgPSB7CisJe0F1QnJfUlIsIFJSfSwKKwl7QXVCcl9STywg
Uk99LAorCXtBdUJyX1JXLCBSV30sCisKKwl7QXVCcl9SUldILCBSUiAiKyIgV0h9LAorCXtBdUJy
X1JPV0gsIFJPICIrIiBXSH0sCisJe0F1QnJfUldOb0xpbmtXSCwgUlcgIisiIE5vTGlua1dIfSwK
KworCXtBdUJyX1JPV0gsICJuZnNybyJ9LAorCXtBdUJyX1JPLCBOVUxMfQorfTsKKworc3RhdGlj
IG5vaW5saW5lX2Zvcl9zdGFjayBpbnQgYnJfcGVybV92YWwoY2hhciAqcGVybSkKK3sKKwlpbnQg
dmFsOworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKworCUF1RGVidWdPbighcGVy
bSB8fCAhKnBlcm0pOworCUxLVFJUcmFjZSgicGVybSAlc1xuIiwgcGVybSk7CisJdmFsID0gbWF0
Y2hfdG9rZW4ocGVybSwgYnJwZXJtcywgYXJncyk7CisJQXVUcmFjZUVycih2YWwpOworCXJldHVy
biB2YWw7Cit9CisKK2NvbnN0IGNoYXIgKmF1X29wdHN0cl9icl9wZXJtKGludCBicnBlcm0pCit7
CisJcmV0dXJuIGF1X3BhcnNlcl9wYXR0ZXJuKGJycGVybSwgYnJwZXJtcyk7Cit9CisKKy8qIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KKworc3RhdGljIG1hdGNoX3RhYmxlX3QgdWRiYWxldmVsID0geworCXtB
dU9wdF9VREJBX1JFVkFMLCAicmV2YWwifSwKKyNpZmRlZiBDT05GSUdfQVVGU19ISU5PVElGWQor
CXtBdU9wdF9VREJBX0lOT1RJRlksICJpbm90aWZ5In0sCisjZW5kaWYKKwl7QXVPcHRfVURCQV9O
T05FLCAibm9uZSJ9LAorCXstMSwgTlVMTH0KK307CisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3Rh
Y2sgaW50IHVkYmFfdmFsKGNoYXIgKnN0cikKK3sKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRf
QVJHU107CisJcmV0dXJuIG1hdGNoX3Rva2VuKHN0ciwgdWRiYWxldmVsLCBhcmdzKTsKK30KKwor
Y29uc3QgY2hhciAqYXVfb3B0c3RyX3VkYmEoaW50IHVkYmEpCit7CisJcmV0dXJuIGF1X3BhcnNl
cl9wYXR0ZXJuKHVkYmEsIHVkYmFsZXZlbCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwor
c3RhdGljIG1hdGNoX3RhYmxlX3QgY29vbGV2ZWwgPSB7CisJe0F1T3B0X0NPT19OT05FLCAibm9u
ZSJ9LAorCXtBdU9wdF9DT09fTEVBRiwgImxlYWYifSwKKwl7QXVPcHRfQ09PX0FMTCwgImFsbCJ9
LAorCXstMSwgTlVMTH0KK307CisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50IGNvb192
YWwoY2hhciAqc3RyKQoreworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwlyZXR1
cm4gbWF0Y2hfdG9rZW4oc3RyLCBjb29sZXZlbCwgYXJncyk7Cit9CisKK2NvbnN0IGNoYXIgKmF1
X29wdHN0cl9jb28oaW50IGNvbykKK3sKKwlyZXR1cm4gYXVfcGFyc2VyX3BhdHRlcm4oY29vLCBj
b29sZXZlbCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIG1hdGNoX3RhYmxl
X3QgYXVfd2JyX2NyZWF0ZV9wb2xpY3kgPSB7CisJe0F1V2JyQ3JlYXRlX1REUCwgInRkcCJ9LAor
CXtBdVdickNyZWF0ZV9URFAsICJ0b3AtZG93bi1wYXJlbnQifSwKKwl7QXVXYnJDcmVhdGVfUlIs
ICJyciJ9LAorCXtBdVdickNyZWF0ZV9SUiwgInJvdW5kLXJvYmluIn0sCisJe0F1V2JyQ3JlYXRl
X01GUywgIm1mcyJ9LAorCXtBdVdickNyZWF0ZV9NRlMsICJtb3N0LWZyZWUtc3BhY2UifSwKKwl7
QXVXYnJDcmVhdGVfTUZTViwgIm1mczolZCJ9LAorCXtBdVdickNyZWF0ZV9NRlNWLCAibW9zdC1m
cmVlLXNwYWNlOiVkIn0sCisKKwl7QXVXYnJDcmVhdGVfTUZTUlIsICJtZnNycjolZCJ9LAorCXtB
dVdickNyZWF0ZV9NRlNSUlYsICJtZnNycjolZDolZCJ9LAorCXtBdVdickNyZWF0ZV9QTUZTLCAi
cG1mcyJ9LAorCXtBdVdickNyZWF0ZV9QTUZTViwgInBtZnM6JWQifSwKKworCXstMSwgTlVMTH0K
K307CisKKy8qIGNmLiBsaW51eC9saWIvcGFyc2VyLmMgKi8KK3N0YXRpYyBpbnQgYXVfbWF0Y2hf
dWxsKHN1YnN0cmluZ190ICpzLCB1bnNpZ25lZCBsb25nIGxvbmcgKnJlc3VsdCwgaW50IGJhc2Up
Cit7CisJY2hhciAqZW5kcDsKKwljaGFyICpidWY7CisJaW50IHJldDsKKworCWJ1ZiA9IGttYWxs
b2Mocy0+dG8gLSBzLT5mcm9tICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVy
biAtRU5PTUVNOworCW1lbWNweShidWYsIHMtPmZyb20sIHMtPnRvIC0gcy0+ZnJvbSk7CisJYnVm
W3MtPnRvIC0gcy0+ZnJvbV0gPSAnXDAnOworCSpyZXN1bHQgPSBzaW1wbGVfc3RydG91bGwoYnVm
LCAmZW5kcCwgYmFzZSk7CisJcmV0ID0gMDsKKwlpZiAoZW5kcCA9PSBidWYpCisJCXJldCA9IC1F
SU5WQUw7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF1X3di
cl9tZnNfd21hcmsoc3Vic3RyaW5nX3QgKmFyZywgY2hhciAqc3RyLAorCQkJICAgIHN0cnVjdCBh
dV9vcHRfd2JyX2NyZWF0ZSAqY3JlYXRlKQoreworCWludCBlcnI7CisJdTY0IHVsbDsKKworCWVy
ciA9IDA7CisJaWYgKCFhdV9tYXRjaF91bGwoYXJnLCAmdWxsLCAwKSkKKwkJY3JlYXRlLT5tZnNy
cl93YXRlcm1hcmsgPSB1bGw7CisJZWxzZSB7CisJCUF1RXJyKCJiYWQgaW50ZWdlciBpbiAlc1xu
Iiwgc3RyKTsKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0
dXJuIGVycjsKK30KKworc3RhdGljIGludCBhdV93YnJfbWZzX3NlYyhzdWJzdHJpbmdfdCAqYXJn
LCBjaGFyICpzdHIsCisJCQkgIHN0cnVjdCBhdV9vcHRfd2JyX2NyZWF0ZSAqY3JlYXRlKQorewor
CWludCBuLCBlcnI7CisKKwllcnIgPSAwOworCWlmICghbWF0Y2hfaW50KGFyZywgJm4pICYmIDAg
PD0gbikKKwkJY3JlYXRlLT5tZnNfc2Vjb25kID0gbjsKKwllbHNlIHsKKwkJQXVFcnIoImJhZCBp
bnRlZ2VyIGluICVzXG4iLCBzdHIpOworCQllcnIgPSAtRUlOVkFMOworCX0KKworCUF1VHJhY2VF
cnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGlu
dAorYXVfd2JyX2NyZWF0ZV92YWwoY2hhciAqc3RyLCBzdHJ1Y3QgYXVfb3B0X3dicl9jcmVhdGUg
KmNyZWF0ZSkKK3sKKwlpbnQgZXJyLCBlOworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdT
XTsKKworCWVyciA9IG1hdGNoX3Rva2VuKHN0ciwgYXVfd2JyX2NyZWF0ZV9wb2xpY3ksIGFyZ3Mp
OworCWNyZWF0ZS0+d2JyX2NyZWF0ZSA9IGVycjsKKwlzd2l0Y2ggKGVycikgeworCWNhc2UgQXVX
YnJDcmVhdGVfTUZTUlJWOgorCQllID0gYXVfd2JyX21mc193bWFyaygmYXJnc1swXSwgc3RyLCBj
cmVhdGUpOworCQlpZiAoIWUpCisJCQllID0gYXVfd2JyX21mc19zZWMoJmFyZ3NbMV0sIHN0ciwg
Y3JlYXRlKTsKKwkJaWYgKHVubGlrZWx5KGUpKQorCQkJZXJyID0gZTsKKwkJYnJlYWs7CisJY2Fz
ZSBBdVdickNyZWF0ZV9NRlNSUjoKKwkJZSA9IGF1X3dicl9tZnNfd21hcmsoJmFyZ3NbMF0sIHN0
ciwgY3JlYXRlKTsKKwkJaWYgKHVubGlrZWx5KGUpKSB7CisJCQllcnIgPSBlOworCQkJYnJlYWs7
CisJCX0KKwkJLypGQUxMVEhST1VHSCovCisJY2FzZSBBdVdickNyZWF0ZV9NRlM6CisJY2FzZSBB
dVdickNyZWF0ZV9QTUZTOgorCQljcmVhdGUtPm1mc19zZWNvbmQgPSBBVUZTX01GU19TRUNPTkRf
REVGOworCQlicmVhazsKKwljYXNlIEF1V2JyQ3JlYXRlX01GU1Y6CisJY2FzZSBBdVdickNyZWF0
ZV9QTUZTVjoKKwkJZSA9IGF1X3dicl9tZnNfc2VjKCZhcmdzWzBdLCBzdHIsIGNyZWF0ZSk7CisJ
CWlmICh1bmxpa2VseShlKSkKKwkJCWVyciA9IGU7CisJCWJyZWFrOworCX0KKworCXJldHVybiBl
cnI7Cit9CisKK2NvbnN0IGNoYXIgKmF1X29wdHN0cl93YnJfY3JlYXRlKGludCB3YnJfY3JlYXRl
KQoreworCXJldHVybiBhdV9wYXJzZXJfcGF0dGVybih3YnJfY3JlYXRlLCBhdV93YnJfY3JlYXRl
X3BvbGljeSk7Cit9CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IGF1X3dicl9jb3B5dXBfcG9saWN5
ID0geworCXtBdVdickNvcHl1cF9URFAsICJ0ZHAifSwKKwl7QXVXYnJDb3B5dXBfVERQLCAidG9w
LWRvd24tcGFyZW50In0sCisJe0F1V2JyQ29weXVwX0JVUCwgImJ1cCJ9LAorCXtBdVdickNvcHl1
cF9CVVAsICJib3R0b20tdXAtcGFyZW50In0sCisJe0F1V2JyQ29weXVwX0JVLCAiYnUifSwKKwl7
QXVXYnJDb3B5dXBfQlUsICJib3R0b20tdXAifSwKKwl7LTEsIE5VTEx9Cit9OworCitzdGF0aWMg
bm9pbmxpbmVfZm9yX3N0YWNrIGludCBhdV93YnJfY29weXVwX3ZhbChjaGFyICpzdHIpCit7CisJ
c3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCXJldHVybiBtYXRjaF90b2tlbihzdHIs
IGF1X3dicl9jb3B5dXBfcG9saWN5LCBhcmdzKTsKK30KKworY29uc3QgY2hhciAqYXVfb3B0c3Ry
X3dicl9jb3B5dXAoaW50IHdicl9jb3B5dXApCit7CisJcmV0dXJuIGF1X3BhcnNlcl9wYXR0ZXJu
KHdicl9jb3B5dXAsIGF1X3dicl9jb3B5dXBfcG9saWN5KTsKK30KKworLyogLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LSAqLworCitzdGF0aWMgY29uc3QgaW50IGxrdXBfZGlyZmxhZ3MgPSBMT09LVVBfRk9MTE9XIHwg
TE9PS1VQX0RJUkVDVE9SWTsKKworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayB2b2lkIGR1bXBf
b3B0cyhzdHJ1Y3QgYXVfb3B0cyAqb3B0cykKK3sKKyNpZmRlZiBDT05GSUdfQVVGU19ERUJVRwor
CS8qIHJlZHVjZSBzdGFjayBzcGFjZSAqLworCXVuaW9uIHsKKwkJc3RydWN0IGF1X29wdF9hZGQg
KmFkZDsKKwkJc3RydWN0IGF1X29wdF9kZWwgKmRlbDsKKwkJc3RydWN0IGF1X29wdF9tb2QgKm1v
ZDsKKwkJc3RydWN0IGF1X29wdF94aW5vICp4aW5vOworCQlzdHJ1Y3QgYXVfb3B0X3hpbm9faXRy
dW5jICp4aW5vX2l0cnVuYzsKKwkJc3RydWN0IGF1X29wdF93YnJfY3JlYXRlICpjcmVhdGU7CisJ
fSB1OworCXN0cnVjdCBhdV9vcHQgKm9wdDsKKworCUF1VHJhY2VFbnRlcigpOworCisJb3B0ID0g
b3B0cy0+b3B0OworCXdoaWxlICgvKiBvcHQgPCBvcHRzX3RhaWwgJiYgKi8gb3B0LT50eXBlICE9
IE9wdF90YWlsKSB7CisJCXN3aXRjaCAob3B0LT50eXBlKSB7CisJCWNhc2UgT3B0X2FkZDoKKwkJ
CXUuYWRkID0gJm9wdC0+YWRkOworCQkJTEtUUlRyYWNlKCJhZGQge2IlZCwgJXMsIDB4JXgsICVw
fVxuIiwKKwkJCQkgIHUuYWRkLT5iaW5kZXgsIHUuYWRkLT5wYXRoLCB1LmFkZC0+cGVybSwKKwkJ
CQkgIHUuYWRkLT5uZC5wYXRoLmRlbnRyeSk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGVsOgor
CQljYXNlIE9wdF9pZGVsOgorCQkJdS5kZWwgPSAmb3B0LT5kZWw7CisJCQlMS1RSVHJhY2UoImRl
bCB7JXMsICVwfVxuIiwgdS5kZWwtPnBhdGgsIHUuZGVsLT5oX3Jvb3QpOworCQkJYnJlYWs7CisJ
CWNhc2UgT3B0X21vZDoKKwkJY2FzZSBPcHRfaW1vZDoKKwkJCXUubW9kID0gJm9wdC0+bW9kOwor
CQkJTEtUUlRyYWNlKCJtb2QgeyVzLCAweCV4LCAlcH1cbiIsCisJCQkJICB1Lm1vZC0+cGF0aCwg
dS5tb2QtPnBlcm0sIHUubW9kLT5oX3Jvb3QpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2FwcGVu
ZDoKKwkJCXUuYWRkID0gJm9wdC0+YWRkOworCQkJTEtUUlRyYWNlKCJhcHBlbmQge2IlZCwgJXMs
IDB4JXgsICVwfVxuIiwKKwkJCQkgIHUuYWRkLT5iaW5kZXgsIHUuYWRkLT5wYXRoLCB1LmFkZC0+
cGVybSwKKwkJCQkgIHUuYWRkLT5uZC5wYXRoLmRlbnRyeSk7CisJCQlicmVhazsKKwkJY2FzZSBP
cHRfcHJlcGVuZDoKKwkJCXUuYWRkID0gJm9wdC0+YWRkOworCQkJTEtUUlRyYWNlKCJwcmVwZW5k
IHtiJWQsICVzLCAweCV4LCAlcH1cbiIsCisJCQkJICB1LmFkZC0+YmluZGV4LCB1LmFkZC0+cGF0
aCwgdS5hZGQtPnBlcm0sCisJCQkJICB1LmFkZC0+bmQucGF0aC5kZW50cnkpOworCQkJYnJlYWs7
CisJCWNhc2UgT3B0X2RpcndoOgorCQkJTEtUUlRyYWNlKCJkaXJ3aCAlZFxuIiwgb3B0LT5kaXJ3
aCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcmRjYWNoZToKKwkJCUxLVFJUcmFjZSgicmRjYWNo
ZSAlZFxuIiwgb3B0LT5yZGNhY2hlKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF94aW5vOgorCQkJ
dS54aW5vID0gJm9wdC0+eGlubzsKKwkJCUxLVFJUcmFjZSgieGlubyB7JXMgJS4qc31cbiIsCisJ
CQkJICB1Lnhpbm8tPnBhdGgsCisJCQkJICBBdURMTlBhaXIodS54aW5vLT5maWxlLT5mX2RlbnRy
eSkpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3RydW5jX3hpbm86CisJCQlMS1RSTGFiZWwodHJ1
bmNfeGlubyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm90cnVuY194aW5vOgorCQkJTEtUUkxh
YmVsKG5vdHJ1bmNfeGlubyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdHJ1bmNfeGlub19wYXRo
OgorCQljYXNlIE9wdF9pdHJ1bmNfeGlubzoKKwkJCXUueGlub19pdHJ1bmMgPSAmb3B0LT54aW5v
X2l0cnVuYzsKKwkJCUxLVFJUcmFjZSgidHJ1bmNfeGlubyAlZFxuIiwgdS54aW5vX2l0cnVuYy0+
YmluZGV4KTsKKwkJCWJyZWFrOworCisJCWNhc2UgT3B0X25veGlubzoKKwkJCUxLVFJMYWJlbChu
b3hpbm8pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3RydW5jX3hpYjoKKwkJCUxLVFJMYWJlbCh0
cnVuY194aWIpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vdHJ1bmNfeGliOgorCQkJTEtUUkxh
YmVsKG5vdHJ1bmNfeGliKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9kaXJwZXJtMToKKwkJCUxL
VFJMYWJlbChkaXJwZXJtMSk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9kaXJwZXJtMToKKwkJ
CUxLVFJMYWJlbChub2RpcnBlcm0xKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9zaHdoOgorCQkJ
TEtUUkxhYmVsKHNod2gpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vc2h3aDoKKwkJCUxLVFJM
YWJlbChub3Nod2gpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3BsaW5rOgorCQkJTEtUUkxhYmVs
KHBsaW5rKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub3BsaW5rOgorCQkJTEtUUkxhYmVsKG5v
cGxpbmspOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2xpc3RfcGxpbms6CisJCQlMS1RSTGFiZWwo
bGlzdF9wbGluayk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY2xlYW5fcGxpbms6CisJCQlMS1RS
TGFiZWwoY2xlYW5fcGxpbmspOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VkYmE6CisJCQlMS1RS
VHJhY2UoInVkYmEgJWQsICVzXG4iLAorCQkJCSAgb3B0LT51ZGJhLCBhdV9vcHRzdHJfdWRiYShv
cHQtPnVkYmEpKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9kaXJvcHFfYToKKwkJCUxLVFJMYWJl
bChkaXJvcHFfYSk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGlyb3BxX3c6CisJCQlMS1RSTGFi
ZWwoZGlyb3BxX3cpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3dhcm5fcGVybToKKwkJCUxLVFJM
YWJlbCh3YXJuX3Blcm0pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vd2Fybl9wZXJtOgorCQkJ
TEtUUkxhYmVsKG5vd2Fybl9wZXJtKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9kbGd0OgorCQkJ
TEtUUkxhYmVsKGRsZ3QpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vZGxndDoKKwkJCUxLVFJM
YWJlbChub2RsZ3QpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3JlZnJvZjoKKwkJCUxLVFJMYWJl
bChyZWZyb2YpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vcmVmcm9mOgorCQkJTEtUUkxhYmVs
KG5vcmVmcm9mKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF92ZXJib3NlOgorCQkJTEtUUkxhYmVs
KHZlcmJvc2UpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vdmVyYm9zZToKKwkJCUxLVFJMYWJl
bChub3ZlcmJvc2UpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NvbzoKKwkJCUxLVFJUcmFjZSgi
Y29vICVkLCAlc1xuIiwKKwkJCQkgIG9wdC0+Y29vLCBhdV9vcHRzdHJfY29vKG9wdC0+Y29vKSk7
CisJCQlicmVhazsKKwkJY2FzZSBPcHRfd2JyX2NyZWF0ZToKKwkJCXUuY3JlYXRlID0gJm9wdC0+
d2JyX2NyZWF0ZTsKKwkJCUxLVFJUcmFjZSgiY3JlYXRlICVkLCAlc1xuIiwgdS5jcmVhdGUtPndi
cl9jcmVhdGUsCisJCQkJICBhdV9vcHRzdHJfd2JyX2NyZWF0ZSh1LmNyZWF0ZS0+d2JyX2NyZWF0
ZSkpOworCQkJc3dpdGNoICh1LmNyZWF0ZS0+d2JyX2NyZWF0ZSkgeworCQkJY2FzZSBBdVdickNy
ZWF0ZV9NRlNWOgorCQkJY2FzZSBBdVdickNyZWF0ZV9QTUZTVjoKKwkJCQlMS1RSVHJhY2UoIiVk
IHNlY1xuIiwgdS5jcmVhdGUtPm1mc19zZWNvbmQpOworCQkJCWJyZWFrOworCQkJY2FzZSBBdVdi
ckNyZWF0ZV9NRlNSUjoKKwkJCQlMS1RSVHJhY2UoIiVMdSB3YXRlcm1hcmtcbiIsCisJCQkJCSAg
dS5jcmVhdGUtPm1mc3JyX3dhdGVybWFyayk7CisJCQkJYnJlYWs7CisJCQljYXNlIEF1V2JyQ3Jl
YXRlX01GU1JSVjoKKwkJCQlMS1RSVHJhY2UoIiVMdSB3YXRlcm1hcmssICVkIHNlY1xuIiwKKwkJ
CQkJICB1LmNyZWF0ZS0+bWZzcnJfd2F0ZXJtYXJrLAorCQkJCQkgIHUuY3JlYXRlLT5tZnNfc2Vj
b25kKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9wdF93YnJfY29weXVw
OgorCQkJTEtUUlRyYWNlKCJjb3B5dXAgJWQsICVzXG4iLCBvcHQtPndicl9jb3B5dXAsCisJCQkJ
ICBhdV9vcHRzdHJfd2JyX2NvcHl1cChvcHQtPndicl9jb3B5dXApKTsKKwkJCWJyZWFrOworCQlk
ZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwkJb3B0Kys7CisJfQorI2VuZGlmCit9CisKK3ZvaWQg
YXVfb3B0c19mcmVlKHN0cnVjdCBhdV9vcHRzICpvcHRzKQoreworCXN0cnVjdCBhdV9vcHQgKm9w
dDsKKworCUF1VHJhY2VFbnRlcigpOworCisJb3B0ID0gb3B0cy0+b3B0OworCXdoaWxlIChvcHQt
PnR5cGUgIT0gT3B0X3RhaWwpIHsKKwkJc3dpdGNoIChvcHQtPnR5cGUpIHsKKwkJY2FzZSBPcHRf
YWRkOgorCQljYXNlIE9wdF9hcHBlbmQ6CisJCWNhc2UgT3B0X3ByZXBlbmQ6CisJCQlwYXRoX3B1
dCgmb3B0LT5hZGQubmQucGF0aCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGVsOgorCQljYXNl
IE9wdF9pZGVsOgorCQkJZHB1dChvcHQtPmRlbC5oX3Jvb3QpOworCQkJYnJlYWs7CisJCWNhc2Ug
T3B0X21vZDoKKwkJY2FzZSBPcHRfaW1vZDoKKwkJCWRwdXQob3B0LT5tb2QuaF9yb290KTsKKwkJ
CWJyZWFrOworCQljYXNlIE9wdF94aW5vOgorCQkJZnB1dChvcHQtPnhpbm8uZmlsZSk7CisJCQli
cmVhazsKKwkJfQorCQlvcHQrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb3B0X2FkZChzdHJ1Y3Qg
YXVfb3B0ICpvcHQsIGNoYXIgKm9wdF9zdHIsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCSAg
IGF1ZnNfYmluZGV4X3QgYmluZGV4KQoreworCWludCBlcnI7CisJc3RydWN0IGF1X29wdF9hZGQg
KmFkZCA9ICZvcHQtPmFkZDsKKwljaGFyICpwOworCisJTEtUUlRyYWNlKCIlcywgYiVkXG4iLCBv
cHRfc3RyLCBiaW5kZXgpOworCisJYWRkLT5iaW5kZXggPSBiaW5kZXg7CisJYWRkLT5wZXJtID0g
QXVCcl9MYXN0OworCWFkZC0+cGF0aCA9IG9wdF9zdHI7CisJcCA9IHN0cmNocihvcHRfc3RyLCAn
PScpOworCWlmICh1bmxpa2VseShwKSkgeworCQkqcCsrID0gMDsKKwkJaWYgKCpwKQorCQkJYWRk
LT5wZXJtID0gYnJfcGVybV92YWwocCk7CisJfQorCisJLyogTFNNIG1heSBkZXRlY3QgaXQgKi8K
KwkvKiBkbyBub3Qgc3VwZXJpby4gKi8KKwllcnIgPSB2ZnN1Yl9wYXRoX2xvb2t1cChhZGQtPnBh
dGgsIGxrdXBfZGlyZmxhZ3MsICZhZGQtPm5kKTsKKwkvL2VyciA9IC0xOworCWlmICghZXJyKSB7
CisJCWlmICghcCAvKiAmJiBhZGQtPnBlcm0gPT0gQXVCcl9MYXN0ICovKSB7CisJCQlhZGQtPnBl
cm0gPSBBdUJyX1JPOworCQkJaWYgKGF1X3Rlc3RfZGVmX3JyKGFkZC0+bmQucGF0aC5kZW50cnkt
PmRfc2IpKQorCQkJCWFkZC0+cGVybSA9IEF1QnJfUlI7CisJCQlpZiAoIWJpbmRleCAmJiAhKHNi
LT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJCQlhZGQtPnBlcm0gPSBBdUJyX1JXOworI2lmZGVm
IENPTkZJR19BVUZTX0NPTVBBVAorCQkJYWRkLT5wZXJtID0gQXVCcl9SVzsKKyNlbmRpZgorCQl9
CisJCW9wdC0+dHlwZSA9IE9wdF9hZGQ7CisJCWdvdG8gb3V0OworCX0KKwlBdUVycigibG9va3Vw
IGZhaWxlZCAlcyAoJWQpXG4iLCBhZGQtPnBhdGgsIGVycik7CisJZXJyID0gLUVJTlZBTDsKKwor
IG91dDoKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyogY2FsbGVkIHdp
dGhvdXQgYXVmcyBsb2NrICovCitpbnQgYXVfb3B0c19wYXJzZShzdHJ1Y3Qgc3VwZXJfYmxvY2sg
KnNiLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBjaGFyICpzdHIsCisJCSAgc3RydWN0IGF1X29wdHMg
Km9wdHMpCit7CisJaW50IGVyciwgbiwgdG9rZW4sIHNraXBwZWQ7CisJc3RydWN0IGRlbnRyeSAq
cm9vdDsKKwlzdHJ1Y3QgYXVfb3B0ICpvcHQsICpvcHRfdGFpbDsKKwljaGFyICpvcHRfc3RyLCAq
cDsKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJYXVmc19iaW5kZXhfdCBiaW5k
ZXgsIGJlbmQ7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwl1bmlvbiB7CisJCXN0cnVjdCBhdV9v
cHRfZGVsICpkZWw7CisJCXN0cnVjdCBhdV9vcHRfbW9kICptb2Q7CisJCXN0cnVjdCBhdV9vcHRf
eGlubyAqeGlubzsKKwkJc3RydWN0IGF1X29wdF94aW5vX2l0cnVuYyAqeGlub19pdHJ1bmM7CisJ
CXN0cnVjdCBhdV9vcHRfd2JyX2NyZWF0ZSAqY3JlYXRlOworCX0gdTsKKwlzdHJ1Y3QgZmlsZSAq
ZmlsZTsKKworCUxLVFJUcmFjZSgiJXMsIG5vcHRzICVkXG4iLCBzdHIsIG9wdHMtPm1heF9vcHQp
OworCisJcm9vdCA9IHNiLT5zX3Jvb3Q7CisJZXJyID0gMDsKKwliaW5kZXggPSAwOworCW9wdCA9
IG9wdHMtPm9wdDsKKwlvcHRfdGFpbCA9IG9wdCArIG9wdHMtPm1heF9vcHQgLSAxOworCW9wdC0+
dHlwZSA9IE9wdF90YWlsOworCXdoaWxlICghZXJyICYmIChvcHRfc3RyID0gc3Ryc2VwKCZzdHIs
ICIsIikpICYmICpvcHRfc3RyKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCXRva2VuID0gbWF0Y2hf
dG9rZW4ob3B0X3N0ciwgb3B0aW9ucywgYXJncyk7CisJCUxLVFJUcmFjZSgiJXMsIHRva2VuICVk
LCBhcmdzWzBdeyVwLCAlcH1cbiIsCisJCQkgIG9wdF9zdHIsIHRva2VuLCBhcmdzWzBdLmZyb20s
IGFyZ3NbMF0udG8pOworCisJCXNraXBwZWQgPSAwOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNh
c2UgT3B0X2JyOgorCQkJZXJyID0gMDsKKwkJCXdoaWxlICghZXJyICYmIChvcHRfc3RyID0gc3Ry
c2VwKCZhcmdzWzBdLmZyb20sICI6IikpCisJCQkgICAgICAgJiYgKm9wdF9zdHIpIHsKKwkJCQll
cnIgPSBvcHRfYWRkKG9wdCwgb3B0X3N0ciwgc2IsIGJpbmRleCsrKTsKKwkJCQkvL2lmIChMa3Ry
Q29uZCkgZXJyID0gLTE7CisJCQkJaWYgKHVubGlrZWx5KCFlcnIgJiYgKytvcHQgPiBvcHRfdGFp
bCkpIHsKKwkJCQkJZXJyID0gLUUyQklHOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJb3B0LT50
eXBlID0gT3B0X3RhaWw7CisJCQkJc2tpcHBlZCA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJY2Fz
ZSBPcHRfYWRkOgorCQkJaWYgKHVubGlrZWx5KG1hdGNoX2ludCgmYXJnc1swXSwgJm4pKSkgewor
CQkJCUF1RXJyKCJiYWQgaW50ZWdlciBpbiAlc1xuIiwgb3B0X3N0cik7CisJCQkJYnJlYWs7CisJ
CQl9CisJCQliaW5kZXggPSBuOworCQkJZXJyID0gb3B0X2FkZChvcHQsIGFyZ3NbMV0uZnJvbSwg
c2IsIGJpbmRleCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfYXBwZW5kOgorCQkJZXJyID0gb3B0
X2FkZChvcHQsIGFyZ3NbMF0uZnJvbSwgc2IsIC8qZHVtbXkgYmluZGV4Ki8xKTsKKwkJCWlmICgh
ZXJyKQorCQkJCW9wdC0+dHlwZSA9IHRva2VuOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3ByZXBl
bmQ6CisJCQllcnIgPSBvcHRfYWRkKG9wdCwgYXJnc1swXS5mcm9tLCBzYiwgLypiaW5kZXgqLzAp
OworCQkJaWYgKCFlcnIpCisJCQkJb3B0LT50eXBlID0gdG9rZW47CisJCQlicmVhazsKKwkJY2Fz
ZSBPcHRfZGVsOgorCQkJdS5kZWwgPSAmb3B0LT5kZWw7CisJCQl1LmRlbC0+cGF0aCA9IGFyZ3Nb
MF0uZnJvbTsKKwkJCUxLVFJUcmFjZSgiZGVsIHBhdGggJXNcbiIsIHUuZGVsLT5wYXRoKTsKKwkJ
CS8qIExTTSBtYXkgZGV0ZWN0IGl0ICovCisJCQkvKiBkbyBub3Qgc3VwZXJpby4gKi8KKwkJCWVy
ciA9IHZmc3ViX3BhdGhfbG9va3VwKHUuZGVsLT5wYXRoLCBsa3VwX2RpcmZsYWdzLAorCQkJCQkJ
Jm5kKTsKKwkJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQkJQXVFcnIoImxvb2t1cCBmYWlsZWQg
JXMgKCVkKVxuIiwKKwkJCQkgICAgICB1LmRlbC0+cGF0aCwgZXJyKTsKKwkJCQlicmVhazsKKwkJ
CX0KKwkJCXUuZGVsLT5oX3Jvb3QgPSBkZ2V0KG5kLnBhdGguZGVudHJ5KTsKKwkJCXBhdGhfcHV0
KCZuZC5wYXRoKTsKKwkJCW9wdC0+dHlwZSA9IHRva2VuOworCQkJYnJlYWs7CisJCWNhc2UgT3B0
X21vZDoKKwkJCXUubW9kID0gJm9wdC0+bW9kOworCQkJdS5tb2QtPnBhdGggPSBhcmdzWzBdLmZy
b207CisJCQlwID0gc3RyY2hyKHUubW9kLT5wYXRoLCAnPScpOworCQkJaWYgKHVubGlrZWx5KCFw
KSkgeworCQkJCUF1RXJyKCJubyBwZXJtc3Npb24gJXNcbiIsIG9wdF9zdHIpOworCQkJCWJyZWFr
OworCQkJfQorCQkJKnArKyA9IDA7CisJCQl1Lm1vZC0+cGVybSA9IGJyX3Blcm1fdmFsKHApOwor
CQkJTEtUUlRyYWNlKCJtb2QgcGF0aCAlcywgcGVybSAweCV4LCAlc1xuIiwKKwkJCQkgIHUubW9k
LT5wYXRoLCB1Lm1vZC0+cGVybSwgcCk7CisJCQkvKiBMU00gbWF5IGRldGVjdCBpdCAqLworCQkJ
LyogZG8gbm90IHN1cGVyaW8uICovCisJCQllcnIgPSB2ZnN1Yl9wYXRoX2xvb2t1cCh1Lm1vZC0+
cGF0aCwgbGt1cF9kaXJmbGFncywKKwkJCQkJCSZuZCk7CisJCQlpZiAodW5saWtlbHkoZXJyKSkg
eworCQkJCUF1RXJyKCJsb29rdXAgZmFpbGVkICVzICglZClcbiIsCisJCQkJICAgICAgdS5tb2Qt
PnBhdGgsIGVycik7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1Lm1vZC0+aF9yb290ID0gZGdldChu
ZC5wYXRoLmRlbnRyeSk7CisJCQlwYXRoX3B1dCgmbmQucGF0aCk7CisJCQlvcHQtPnR5cGUgPSB0
b2tlbjsKKwkJCWJyZWFrOworI2lmZGVmIElNT0QKKwkJY2FzZSBPcHRfaW1vZDoKKwkJCXUubW9k
ID0gJm9wdC0+bW9kOworCQkJdS5tb2QtPnBhdGggPSAiKGluZGV4ZWQpIjsKKwkJCWlmICh1bmxp
a2VseShtYXRjaF9pbnQoJmFyZ3NbMF0sICZuKSkpIHsKKwkJCQlBdUVycigiYmFkIGludGVnZXIg
aW4gJXNcbiIsIG9wdF9zdHIpOworCQkJCWJyZWFrOworCQkJfQorCQkJYmluZGV4ID0gbjsKKwkJ
CWF1ZnNfcmVhZF9sb2NrKHJvb3QsIEF1TG9ja19GTFVTSCk7CisJCQlpZiAoYmluZGV4IDwgMCB8
fCBhdV9zYmVuZChzYikgPCBiaW5kZXgpIHsKKwkJCQlBdUVycigib3V0IG9mIGJvdW5kcywgJWRc
biIsIGJpbmRleCk7CisJCQkJYXVmc19yZWFkX3VubG9jayhyb290LCAhQXVMb2NrX0lSKTsKKwkJ
CQlicmVhazsKKwkJCX0KKwkJCXUubW9kLT5wZXJtID0gYnJfcGVybV92YWwoYXJnc1sxXS5mcm9t
KTsKKwkJCUxLVFJUcmFjZSgibW9kIHBhdGggJXMsIHBlcm0gMHgleCwgJXNcbiIsCisJCQkJICB1
Lm1vZC0+cGF0aCwgdS5tb2QtPnBlcm0sIGFyZ3NbMV0uZnJvbSk7CisJCQllcnIgPSAwOworCQkJ
dS5tb2QtPmhfcm9vdCA9IGRnZXQoYXVfaF9kcHRyKHJvb3QsIGJpbmRleCkpOworCQkJb3B0LT50
eXBlID0gdG9rZW47CisJCQlhdWZzX3JlYWRfdW5sb2NrKHJvb3QsICFBdUxvY2tfSVIpOworCQkJ
YnJlYWs7CisjZW5kaWYKKwkJY2FzZSBPcHRfeGlubzoKKwkJCXUueGlubyA9ICZvcHQtPnhpbm87
CisJCQlmaWxlID0gYXVfeGlub19jcmVhdGUoc2IsIGFyZ3NbMF0uZnJvbSwgLypzaWxlbnQqLzAs
CisJCQkJCSAgICAgIC8qcGFyZW50Ki9OVUxMKTsKKwkJCWVyciA9IFBUUl9FUlIoZmlsZSk7CisJ
CQlpZiAoSVNfRVJSKGZpbGUpKQorCQkJCWJyZWFrOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWlm
ICh1bmxpa2VseShmaWxlLT5mX2RlbnRyeS0+ZF9zYiA9PSBzYikpIHsKKwkJCQlmcHV0KGZpbGUp
OworCQkJCUF1RXJyKCIlcyBtdXN0IGJlIG91dHNpZGVcbiIsIGFyZ3NbMF0uZnJvbSk7CisJCQkJ
YnJlYWs7CisJCQl9CisJCQllcnIgPSAwOworCQkJdS54aW5vLT5maWxlID0gZmlsZTsKKwkJCXUu
eGluby0+cGF0aCA9IGFyZ3NbMF0uZnJvbTsKKwkJCW9wdC0+dHlwZSA9IHRva2VuOworCQkJYnJl
YWs7CisKKwkJY2FzZSBPcHRfdHJ1bmNfeGlub19wYXRoOgorCQkJdS54aW5vX2l0cnVuYyA9ICZv
cHQtPnhpbm9faXRydW5jOworCQkJcCA9IGFyZ3NbMF0uZnJvbTsKKwkJCUxLVFJUcmFjZSgidHJ1
bmNfeGlubyBwYXRoICVzXG4iLCBwKTsKKwkJCS8qIExTTSBtYXkgZGV0ZWN0IGl0ICovCisJCQkv
KiBkbyBub3Qgc3VwZXJpby4gKi8KKwkJCWVyciA9IHZmc3ViX3BhdGhfbG9va3VwKHAsIGxrdXBf
ZGlyZmxhZ3MsICZuZCk7CisJCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJCUF1RXJyKCJsb29r
dXAgZmFpbGVkICVzICglZClcbiIsIHAgLCBlcnIpOworCQkJCWJyZWFrOworCQkJfQorCQkJdS54
aW5vX2l0cnVuYy0+YmluZGV4ID0gLTE7CisJCQlhdWZzX3JlYWRfbG9jayhyb290LCBBdUxvY2tf
RkxVU0gpOworCQkJYmVuZCA9IGF1X3NiZW5kKHNiKTsKKwkJCWZvciAoYmluZGV4ID0gMDsgYmlu
ZGV4IDw9IGJlbmQ7IGJpbmRleCsrKSB7CisJCQkJaWYgKGF1X2hfZHB0cihyb290LCBiaW5kZXgp
ID09IG5kLnBhdGguZGVudHJ5KSB7CisJCQkJCXUueGlub19pdHJ1bmMtPmJpbmRleCA9IGJpbmRl
eDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYXVmc19yZWFkX3VubG9jayhyb290LCAh
QXVMb2NrX0lSKTsKKwkJCXBhdGhfcHV0KCZuZC5wYXRoKTsKKwkJCWlmICh1bmxpa2VseSh1Lnhp
bm9faXRydW5jLT5iaW5kZXggPCAwKSkgeworCQkJCUF1RXJyKCJubyBzdWNoIGJyYW5jaCAlc1xu
IiwgcCk7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW9wdC0+dHlw
ZSA9IHRva2VuOworCQkJYnJlYWs7CisKKwkJY2FzZSBPcHRfaXRydW5jX3hpbm86CisJCQl1Lnhp
bm9faXRydW5jID0gJm9wdC0+eGlub19pdHJ1bmM7CisJCQlpZiAodW5saWtlbHkobWF0Y2hfaW50
KCZhcmdzWzBdLCAmbikpKSB7CisJCQkJQXVFcnIoImJhZCBpbnRlZ2VyIGluICVzXG4iLCBvcHRf
c3RyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXUueGlub19pdHJ1bmMtPmJpbmRleCA9IG47CisJ
CQlhdWZzX3JlYWRfbG9jayhyb290LCBBdUxvY2tfRkxVU0gpOworCQkJaWYgKG4gPCAwIHx8IGF1
X3NiZW5kKHNiKSA8IG4pIHsKKwkJCQlBdUVycigib3V0IG9mIGJvdW5kcywgJWRcbiIsIG4pOwor
CQkJCWF1ZnNfcmVhZF91bmxvY2socm9vdCwgIUF1TG9ja19JUik7CisJCQkJYnJlYWs7CisJCQl9
CisJCQlhdWZzX3JlYWRfdW5sb2NrKHJvb3QsICFBdUxvY2tfSVIpOworCQkJZXJyID0gMDsKKwkJ
CW9wdC0+dHlwZSA9IHRva2VuOworCQkJYnJlYWs7CisKKwkJY2FzZSBPcHRfZGlyd2g6CisJCQlp
ZiAodW5saWtlbHkobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0LT5kaXJ3aCkpKQorCQkJCWJyZWFr
OworCQkJZXJyID0gMDsKKwkJCW9wdC0+dHlwZSA9IHRva2VuOworCQkJYnJlYWs7CisKKwkJY2Fz
ZSBPcHRfcmRjYWNoZToKKwkJCWlmICh1bmxpa2VseShtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHQt
PnJkY2FjaGUpKSkKKwkJCQlicmVhazsKKwkJCWVyciA9IDA7CisJCQlvcHQtPnR5cGUgPSB0b2tl
bjsKKwkJCWJyZWFrOworCisJCWNhc2UgT3B0X3Nod2g6CisJCQlpZiAoZmxhZ3MgJiBNU19SRE9O
TFkpIHsKKwkJCQllcnIgPSAwOworCQkJCW9wdC0+dHlwZSA9IHRva2VuOworCQkJfSBlbHNlCisJ
CQkJQXVFcnIoInNod2ggcmVxdWlyZXMgcm9cbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPcHRf
dHJ1bmNfeGlubzoKKwkJY2FzZSBPcHRfbm90cnVuY194aW5vOgorCQljYXNlIE9wdF9ub3hpbm86
CisJCWNhc2UgT3B0X3RydW5jX3hpYjoKKwkJY2FzZSBPcHRfbm90cnVuY194aWI6CisJCWNhc2Ug
T3B0X2RpcnBlcm0xOgorCQljYXNlIE9wdF9ub2RpcnBlcm0xOgorCQljYXNlIE9wdF9ub3Nod2g6
CisJCWNhc2UgT3B0X3BsaW5rOgorCQljYXNlIE9wdF9ub3BsaW5rOgorCQljYXNlIE9wdF9saXN0
X3BsaW5rOgorCQljYXNlIE9wdF9jbGVhbl9wbGluazoKKwkJY2FzZSBPcHRfZGlyb3BxX2E6CisJ
CWNhc2UgT3B0X2Rpcm9wcV93OgorCQljYXNlIE9wdF93YXJuX3Blcm06CisJCWNhc2UgT3B0X25v
d2Fybl9wZXJtOgorCQljYXNlIE9wdF9kbGd0OgorCQljYXNlIE9wdF9ub2RsZ3Q6CisJCWNhc2Ug
T3B0X3JlZnJvZjoKKwkJY2FzZSBPcHRfbm9yZWZyb2Y6CisJCWNhc2UgT3B0X3ZlcmJvc2U6CisJ
CWNhc2UgT3B0X25vdmVyYm9zZToKKwkJCWVyciA9IDA7CisJCQlvcHQtPnR5cGUgPSB0b2tlbjsK
KwkJCWJyZWFrOworCisJCWNhc2UgT3B0X3VkYmE6CisJCQlvcHQtPnVkYmEgPSB1ZGJhX3ZhbChh
cmdzWzBdLmZyb20pOworCQkJaWYgKG9wdC0+dWRiYSA+PSAwKSB7CisJCQkJZXJyID0gMDsKKwkJ
CQlvcHQtPnR5cGUgPSB0b2tlbjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT3B0X3dicl9j
cmVhdGU6CisJCQl1LmNyZWF0ZSA9ICZvcHQtPndicl9jcmVhdGU7CisJCQl1LmNyZWF0ZS0+d2Jy
X2NyZWF0ZQorCQkJCT0gYXVfd2JyX2NyZWF0ZV92YWwoYXJnc1swXS5mcm9tLCB1LmNyZWF0ZSk7
CisJCQlpZiAodS5jcmVhdGUtPndicl9jcmVhdGUgPj0gMCkgeworCQkJCWVyciA9IDA7CisJCQkJ
b3B0LT50eXBlID0gdG9rZW47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPcHRfd2JyX2NvcHl1
cDoKKwkJCW9wdC0+d2JyX2NvcHl1cCA9IGF1X3dicl9jb3B5dXBfdmFsKGFyZ3NbMF0uZnJvbSk7
CisJCQlpZiAob3B0LT53YnJfY29weXVwID49IDApIHsKKwkJCQllcnIgPSAwOworCQkJCW9wdC0+
dHlwZSA9IHRva2VuOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPcHRfY29vOgorCQkJb3B0
LT5jb28gPSBjb29fdmFsKGFyZ3NbMF0uZnJvbSk7CisJCQlpZiAob3B0LT5jb28gPj0gMCkgewor
CQkJCWVyciA9IDA7CisJCQkJb3B0LT50eXBlID0gdG9rZW47CisJCQl9CisJCQlicmVhazsKKwor
CQljYXNlIE9wdF9pZ25vcmU6CisjaWZuZGVmIENPTkZJR19BVUZTX0NPTVBBVAorCQkJQXVXYXJu
KCJpZ25vcmVkICVzXG4iLCBvcHRfc3RyKTsKKyNlbmRpZgorCQljYXNlIE9wdF9pZ25vcmVfc2ls
ZW50OgorCQkJc2tpcHBlZCA9IDE7CisJCQllcnIgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgT3B0
X2VycjoKKwkJCUF1RXJyKCJ1bmtub3duIG9wdGlvbiAlc1xuIiwgb3B0X3N0cik7CisJCQlicmVh
azsKKwkJfQorCisJCWlmICghZXJyICYmICFza2lwcGVkKSB7CisJCQlpZiAodW5saWtlbHkoKytv
cHQgPiBvcHRfdGFpbCkpIHsKKwkJCQllcnIgPSAtRTJCSUc7CisJCQkJb3B0LS07CisJCQkJb3B0
LT50eXBlID0gT3B0X3RhaWw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvcHQtPnR5cGUgPSBPcHRf
dGFpbDsKKwkJfQorCX0KKworCWR1bXBfb3B0cyhvcHRzKTsKKwlpZiAodW5saWtlbHkoZXJyKSkK
KwkJYXVfb3B0c19mcmVlKG9wdHMpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOwor
fQorCisvKgorICogcmV0dXJucywKKyAqIHBsdXM6IHByb2Nlc3NlZCB3aXRob3V0IGFuIGVycm9y
CisgKiB6ZXJvOiB1bnByb2Nlc3NlZAorICovCitzdGF0aWMgaW50IGF1X29wdF9zaW1wbGUoc3Ry
dWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGF1X29wdCAqb3B0LAorCQkJIHN0cnVjdCBhdV9v
cHRzICpvcHRzKQoreworCWludCBlcnI7CisJc3RydWN0IGF1X3NiaW5mbyAqc2JpbmZvOworCXN0
cnVjdCBhdV9vcHRfd2JyX2NyZWF0ZSAqY3JlYXRlOworCisJQXVUcmFjZUVudGVyKCk7CisKKwll
cnIgPSAxOyAvKiBoYW5kbGVkICovCisJc2JpbmZvID0gYXVfc2JpKHNiKTsKKwlzd2l0Y2ggKG9w
dC0+dHlwZSkgeworCWNhc2UgT3B0X3VkYmE6CisJCXNiaW5mby0+c2lfbW50ZmxhZ3MgJj0gfkF1
T3B0TWFza19VREJBOworCQlzYmluZm8tPnNpX21udGZsYWdzIHw9IG9wdC0+dWRiYTsKKwkJb3B0
cy0+Z2l2ZW5fdWRiYSB8PSBvcHQtPnVkYmE7CisJCWJyZWFrOworCisJY2FzZSBPcHRfcGxpbms6
CisJCWF1X29wdF9zZXQoc2JpbmZvLT5zaV9tbnRmbGFncywgUExJTkspOworCQlicmVhazsKKwlj
YXNlIE9wdF9ub3BsaW5rOgorCQlpZiAoYXVfb3B0X3Rlc3Qoc2JpbmZvLT5zaV9tbnRmbGFncywg
UExJTkspKQorCQkJYXVfcGxpbmtfcHV0KHNiKTsKKwkJYXVfb3B0X2NscihzYmluZm8tPnNpX21u
dGZsYWdzLCBQTElOSyk7CisJCWJyZWFrOworCWNhc2UgT3B0X2xpc3RfcGxpbms6CisJCWlmIChh
dV9vcHRfdGVzdChzYmluZm8tPnNpX21udGZsYWdzLCBQTElOSykpCisJCQlhdV9wbGlua19saXN0
KHNiKTsKKwkJYnJlYWs7CisJY2FzZSBPcHRfY2xlYW5fcGxpbms6CisJCWlmIChhdV9vcHRfdGVz
dChzYmluZm8tPnNpX21udGZsYWdzLCBQTElOSykpCisJCQlhdV9wbGlua19wdXQoc2IpOworCQli
cmVhazsKKworCWNhc2UgT3B0X2Rpcm9wcV9hOgorCQlhdV9vcHRfc2V0KHNiaW5mby0+c2lfbW50
ZmxhZ3MsIEFMV0FZU19ESVJPUFEpOworCQlicmVhazsKKwljYXNlIE9wdF9kaXJvcHFfdzoKKwkJ
YXVfb3B0X2NscihzYmluZm8tPnNpX21udGZsYWdzLCBBTFdBWVNfRElST1BRKTsKKwkJYnJlYWs7
CisKKwljYXNlIE9wdF9kbGd0OgorCQlhdV9vcHRfc2V0KHNiaW5mby0+c2lfbW50ZmxhZ3MsIERM
R1QpOworCQlicmVhazsKKwljYXNlIE9wdF9ub2RsZ3Q6CisJCWF1X29wdF9jbHIoc2JpbmZvLT5z
aV9tbnRmbGFncywgRExHVCk7CisJCWJyZWFrOworCisJY2FzZSBPcHRfd2Fybl9wZXJtOgorCQlh
dV9vcHRfc2V0KHNiaW5mby0+c2lfbW50ZmxhZ3MsIFdBUk5fUEVSTSk7CisJCWJyZWFrOworCWNh
c2UgT3B0X25vd2Fybl9wZXJtOgorCQlhdV9vcHRfY2xyKHNiaW5mby0+c2lfbW50ZmxhZ3MsIFdB
Uk5fUEVSTSk7CisJCWJyZWFrOworCisJY2FzZSBPcHRfcmVmcm9mOgorCQlhdV9vcHRfc2V0KHNi
aW5mby0+c2lfbW50ZmxhZ3MsIFJFRlJPRik7CisJCWJyZWFrOworCWNhc2UgT3B0X25vcmVmcm9m
OgorCQkvL2F1X29wdF9zZXQoc2JpbmZvLT5zaV9tbnRmbGFncywgQ09PX0xFQUYpOworCQlhdV9v
cHRfY2xyKHNiaW5mby0+c2lfbW50ZmxhZ3MsIFJFRlJPRik7CisJCWJyZWFrOworCisJY2FzZSBP
cHRfdmVyYm9zZToKKwkJYXVfb3B0X3NldChzYmluZm8tPnNpX21udGZsYWdzLCBWRVJCT1NFKTsK
KwkJYnJlYWs7CisJY2FzZSBPcHRfbm92ZXJib3NlOgorCQlhdV9vcHRfY2xyKHNiaW5mby0+c2lf
bW50ZmxhZ3MsIFZFUkJPU0UpOworCQlicmVhazsKKworCWNhc2UgT3B0X3dicl9jcmVhdGU6CisJ
CWNyZWF0ZSA9ICZvcHQtPndicl9jcmVhdGU7CisJCWlmIChzYmluZm8tPnNpX3dicl9jcmVhdGVf
b3BzLT5maW4pIHsKKwkJCWVyciA9IHNiaW5mby0+c2lfd2JyX2NyZWF0ZV9vcHMtPmZpbihzYik7
CisJCQlpZiAoIWVycikKKwkJCQllcnIgPSAxOworCQl9CisJCXNiaW5mby0+c2lfd2JyX2NyZWF0
ZSA9IGNyZWF0ZS0+d2JyX2NyZWF0ZTsKKwkJc2JpbmZvLT5zaV93YnJfY3JlYXRlX29wcworCQkJ
PSBhdV93YnJfY3JlYXRlX29wcyArIGNyZWF0ZS0+d2JyX2NyZWF0ZTsKKwkJc3dpdGNoIChjcmVh
dGUtPndicl9jcmVhdGUpIHsKKwkJY2FzZSBBdVdickNyZWF0ZV9NRlNSUlY6CisJCWNhc2UgQXVX
YnJDcmVhdGVfTUZTUlI6CisJCQlzYmluZm8tPnNpX3dicl9tZnMubWZzcnJfd2F0ZXJtYXJrCisJ
CQkJPSBjcmVhdGUtPm1mc3JyX3dhdGVybWFyazsKKwkJCS8qRkFMTFRIUk9VR0gqLworCQljYXNl
IEF1V2JyQ3JlYXRlX01GUzoKKwkJY2FzZSBBdVdickNyZWF0ZV9NRlNWOgorCQljYXNlIEF1V2Jy
Q3JlYXRlX1BNRlM6CisJCWNhc2UgQXVXYnJDcmVhdGVfUE1GU1Y6CisJCQlzYmluZm8tPnNpX3di
cl9tZnMubWZzX2V4cGlyZSA9IGNyZWF0ZS0+bWZzX3NlY29uZCAqIEhaOworCQkJYnJlYWs7CisJ
CX0KKwkJaWYgKHNiaW5mby0+c2lfd2JyX2NyZWF0ZV9vcHMtPmluaXQpCisJCQlzYmluZm8tPnNp
X3dicl9jcmVhdGVfb3BzLT5pbml0KHNiKTsgLyogaWdub3JlICovCisJCWJyZWFrOworCWNhc2Ug
T3B0X3dicl9jb3B5dXA6CisJCXNiaW5mby0+c2lfd2JyX2NvcHl1cCA9IG9wdC0+d2JyX2NvcHl1
cDsKKwkJc2JpbmZvLT5zaV93YnJfY29weXVwX29wcyA9IGF1X3dicl9jb3B5dXBfb3BzICsgb3B0
LT53YnJfY29weXVwOworCQlicmVhazsKKworCWNhc2UgT3B0X2NvbzoKKwkJc2JpbmZvLT5zaV9t
bnRmbGFncyAmPSB+QXVPcHRNYXNrX0NPTzsKKwkJc2JpbmZvLT5zaV9tbnRmbGFncyB8PSBvcHQt
PmNvbzsKKwkJYnJlYWs7CisKKwljYXNlIE9wdF9kaXJ3aDoKKwkJc2JpbmZvLT5zaV9kaXJ3aCA9
IG9wdC0+ZGlyd2g7CisJCWJyZWFrOworCisJY2FzZSBPcHRfcmRjYWNoZToKKwkJc2JpbmZvLT5z
aV9yZGNhY2hlID0gb3B0LT5yZGNhY2hlICogSFo7CisJCWJyZWFrOworCisJY2FzZSBPcHRfdHJ1
bmNfeGlubzoKKwkJYXVfb3B0X3NldChzYmluZm8tPnNpX21udGZsYWdzLCBUUlVOQ19YSU5PKTsK
KwkJYnJlYWs7CisJY2FzZSBPcHRfbm90cnVuY194aW5vOgorCQlhdV9vcHRfY2xyKHNiaW5mby0+
c2lfbW50ZmxhZ3MsIFRSVU5DX1hJTk8pOworCQlicmVhazsKKworCWNhc2UgT3B0X2RpcnBlcm0x
OgorCQlhdV9vcHRfc2V0KHNiaW5mby0+c2lfbW50ZmxhZ3MsIERJUlBFUk0xKTsKKwkJYnJlYWs7
CisJY2FzZSBPcHRfbm9kaXJwZXJtMToKKwkJYXVfb3B0X2NscihzYmluZm8tPnNpX21udGZsYWdz
LCBESVJQRVJNMSk7CisJCWJyZWFrOworCisJY2FzZSBPcHRfc2h3aDoKKwkJYXVfb3B0X3NldChz
YmluZm8tPnNpX21udGZsYWdzLCBTSFdIKTsKKwkJYnJlYWs7CisJY2FzZSBPcHRfbm9zaHdoOgor
CQlhdV9vcHRfY2xyKHNiaW5mby0+c2lfbW50ZmxhZ3MsIFNIV0gpOworCQlicmVhazsKKworCWNh
c2UgT3B0X3RydW5jX3hpbm9fcGF0aDoKKwljYXNlIE9wdF9pdHJ1bmNfeGlubzoKKwkJZXJyID0g
YXVfeGlub190cnVuYyhzYiwgb3B0LT54aW5vX2l0cnVuYy5iaW5kZXgpOworCQlpZiAoIWVycikK
KwkJCWVyciA9IDE7CisJCWJyZWFrOworCisJY2FzZSBPcHRfdHJ1bmNfeGliOgorCQlhdV9mc2V0
X29wdHMob3B0cy0+ZmxhZ3MsIFRSVU5DX1hJQik7CisJCWJyZWFrOworCWNhc2UgT3B0X25vdHJ1
bmNfeGliOgorCQlhdV9mY2xyX29wdHMob3B0cy0+ZmxhZ3MsIFRSVU5DX1hJQik7CisJCWJyZWFr
OworCisJZGVmYXVsdDoKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJfQorCisJQXVUcmFjZUVycihl
cnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiByZXR1cm5zIHRyaS1zdGF0ZS4KKyAqIHBs
dXM6IHByb2Nlc3NlZCB3aXRob3V0IGFuIGVycm9yCisgKiB6ZXJvOiB1bnByb2Nlc3NlZAorICog
bWludXM6IGVycm9yCisgKi8KK3N0YXRpYyBpbnQgYXVfb3B0X2JyKHN0cnVjdCBzdXBlcl9ibG9j
ayAqc2IsIHN0cnVjdCBhdV9vcHQgKm9wdCwKKwkJICAgICBzdHJ1Y3QgYXVfb3B0cyAqb3B0cykK
K3sKKwlpbnQgZXJyLCBkb19yZWZyZXNoOworCisJQXVUcmFjZUVudGVyKCk7CisKKwllcnIgPSAw
OworCXN3aXRjaCAob3B0LT50eXBlKSB7CisJY2FzZSBPcHRfYXBwZW5kOgorCQlvcHQtPmFkZC5i
aW5kZXggPSBhdV9zYmVuZChzYikgKyAxOworCQlpZiAodW5saWtlbHkob3B0LT5hZGQuYmluZGV4
IDwgMCkpCisJCQlvcHQtPmFkZC5iaW5kZXggPSAwOworCQlnb3RvIGFkZDsKKwljYXNlIE9wdF9w
cmVwZW5kOgorCQlvcHQtPmFkZC5iaW5kZXggPSAwOworCWFkZDoKKwljYXNlIE9wdF9hZGQ6CisJ
CWVyciA9IGF1X2JyX2FkZChzYiwgJm9wdC0+YWRkLAorCQkJCWF1X2Z0ZXN0X29wdHMob3B0cy0+
ZmxhZ3MsIFJFTU9VTlQpKTsKKwkJaWYgKCFlcnIpIHsKKwkJCWVyciA9IDE7CisJCQlhdV9mc2V0
X29wdHMob3B0cy0+ZmxhZ3MsIFJFRlJFU0hfRElSKTsKKwkJCWlmICh1bmxpa2VseShhdV9icl93
aGFibGUob3B0LT5hZGQucGVybSkpKQorCQkJCWF1X2ZzZXRfb3B0cyhvcHRzLT5mbGFncywgUkVG
UkVTSF9OT05ESVIpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPcHRfZGVsOgorCWNhc2UgT3B0
X2lkZWw6CisJCWVyciA9IGF1X2JyX2RlbChzYiwgJm9wdC0+ZGVsLAorCQkJCWF1X2Z0ZXN0X29w
dHMob3B0cy0+ZmxhZ3MsIFJFTU9VTlQpKTsKKwkJaWYgKCFlcnIpIHsKKwkJCWVyciA9IDE7CisJ
CQlhdV9mc2V0X29wdHMob3B0cy0+ZmxhZ3MsIFRSVU5DX1hJQik7CisJCQlhdV9mc2V0X29wdHMo
b3B0cy0+ZmxhZ3MsIFJFRlJFU0hfRElSKTsKKwkJCWF1X2ZzZXRfb3B0cyhvcHRzLT5mbGFncywg
UkVGUkVTSF9OT05ESVIpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPcHRfbW9kOgorCWNhc2Ug
T3B0X2ltb2Q6CisJCWVyciA9IGF1X2JyX21vZChzYiwgJm9wdC0+bW9kLAorCQkJCWF1X2Z0ZXN0
X29wdHMob3B0cy0+ZmxhZ3MsIFJFTU9VTlQpLAorCQkJCSZkb19yZWZyZXNoKTsKKwkJaWYgKCFl
cnIpIHsKKwkJCWVyciA9IDE7CisJCQlpZiAodW5saWtlbHkoZG9fcmVmcmVzaCkpIHsKKwkJCQlh
dV9mc2V0X29wdHMob3B0cy0+ZmxhZ3MsIFJFRlJFU0hfRElSKTsKKwkJCQlhdV9mc2V0X29wdHMo
b3B0cy0+ZmxhZ3MsIFJFRlJFU0hfTk9ORElSKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisK
KwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhdV9vcHRf
eGlubyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYXVfb3B0ICpvcHQsCisJCSAgICAg
ICBzdHJ1Y3QgYXVfb3B0X3hpbm8gKipvcHRfeGlubywgc3RydWN0IGF1X29wdHMgKm9wdHMpCit7
CisJaW50IGVycjsKKworCUF1VHJhY2VFbnRlcigpOworCisJZXJyID0gMDsKKwlzd2l0Y2ggKG9w
dC0+dHlwZSkgeworCWNhc2UgT3B0X3hpbm86CisJCWVyciA9IGF1X3hpbm9fc2V0KHNiLCAmb3B0
LT54aW5vLAorCQkJCSAgYXVfZnRlc3Rfb3B0cyhvcHRzLT5mbGFncywgUkVNT1VOVCkpOworCQlp
ZiAoIWVycikKKwkJCSpvcHRfeGlubyA9ICZvcHQtPnhpbm87CisJCWJyZWFrOworCWNhc2UgT3B0
X25veGlubzoKKwkJYXVfeGlub19jbHIoc2IpOworCQkqb3B0X3hpbm8gPSAodm9pZCAqKS0xOwor
CQlicmVhazsKKwl9CisKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3Rh
dGljIG5vaW5saW5lX2Zvcl9zdGFjayBpbnQKK3ZlcmlmeV9vcHRzKHN0cnVjdCBzdXBlcl9ibG9j
ayAqc2IsIHVuc2lnbmVkIGludCBwZW5kaW5nLCBpbnQgcmVtb3VudCkKK3sKKwlpbnQgZXJyOwor
CWF1ZnNfYmluZGV4X3QgYmluZGV4LCBiZW5kOworCXN0cnVjdCBhdV9icmFuY2ggKmJyOworCXN0
cnVjdCBkZW50cnkgKnJvb3Q7CisJc3RydWN0IGlub2RlICpkaXI7CisJdW5zaWduZWQgaW50IGRv
X3BsaW5rOworCXVuc2lnbmVkIGludCBtbnRfZmxhZ3M7CisKKwlBdVRyYWNlRW50ZXIoKTsKKwlt
bnRfZmxhZ3MgPSBhdV9tbnRmbGFncyhzYik7CisJQXVEZWJ1Z09uKCEobW50X2ZsYWdzICYgQXVP
cHRNYXNrX0NPTykpOworCUF1RGVidWdPbighKG1udF9mbGFncyAmIEF1T3B0TWFza19VREJBKSk7
CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJaWYgKHVubGlrZWx5KCFh
dV9icl93cml0YWJsZShhdV9zYnJfcGVybShzYiwgMCkpKSkKKwkJCUF1V2FybigiZmlyc3QgYnJh
bmNoIHNob3VsZCBiZSByd1xuIik7CisJCWlmICh1bmxpa2VseShhdV9vcHRfdGVzdChtbnRfZmxh
Z3MsIFNIV0gpKSkKKwkJCUF1V2Fybigic2h3aCBzaG91bGQgYmUgdXNlZCB3aXRoIHJvXG4iKTsK
Kwl9CisKKwlpZiAodW5saWtlbHkoYXVfb3B0X3Rlc3QobW50X2ZsYWdzIHwgcGVuZGluZywgVURC
QV9JTk9USUZZKQorCQkgICAgICYmICFhdV9vcHRfdGVzdChtbnRfZmxhZ3MsIFhJTk8pKSkKKwkJ
QXVXYXJuKCJ1ZGJhPWlub3RpZnkgcmVxdWlyZXMgeGlub1xuIik7CisKKwllcnIgPSAwOworCXJv
b3QgPSBzYi0+c19yb290OworCWRpciA9IHNiLT5zX3Jvb3QtPmRfaW5vZGU7CisJZG9fcGxpbmsg
PSAhIWF1X29wdF90ZXN0KG1udF9mbGFncywgUExJTkspOworCWJlbmQgPSBhdV9zYmVuZChzYik7
CisJZm9yIChiaW5kZXggPSAwOyAhZXJyICYmIGJpbmRleCA8PSBiZW5kOyBiaW5kZXgrKykgewor
CQlzdHJ1Y3QgaW5vZGUgKmhfZGlyOworCQlpbnQgc2tpcDsKKworCQlza2lwID0gMDsKKwkJaF9k
aXIgPSBhdV9oX2lwdHIoZGlyLCBiaW5kZXgpOworCQliciA9IGF1X3NicihzYiwgYmluZGV4KTsK
KwkJYnJfd2hfcmVhZF9sb2NrKGJyKTsKKwkJc3dpdGNoIChici0+YnJfcGVybSkgeworCQljYXNl
IEF1QnJfUlI6CisJCWNhc2UgQXVCcl9STzoKKwkJY2FzZSBBdUJyX1JSV0g6CisJCWNhc2UgQXVC
cl9ST1dIOgorCQkJc2tpcCA9ICghYnItPmJyX3doICYmICFici0+YnJfcGxpbmspOworCQkJYnJl
YWs7CisKKwkJY2FzZSBBdUJyX1JXTm9MaW5rV0g6CisJCQlza2lwID0gIWJyLT5icl93aDsKKwkJ
CWlmIChza2lwKSB7CisJCQkJaWYgKGRvX3BsaW5rKQorCQkJCQlza2lwID0gISFici0+YnJfcGxp
bms7CisJCQkJZWxzZQorCQkJCQlza2lwID0gIWJyLT5icl9wbGluazsKKwkJCX0KKwkJCWJyZWFr
OworCisJCWNhc2UgQXVCcl9SVzoKKwkJCXNraXAgPSAhIWJyLT5icl93aDsKKwkJCWlmIChza2lw
KSB7CisJCQkJaWYgKGRvX3BsaW5rKQorCQkJCQlza2lwID0gISFici0+YnJfcGxpbms7CisJCQkJ
ZWxzZQorCQkJCQlza2lwID0gIWJyLT5icl9wbGluazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRl
ZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCQlicl93aF9yZWFkX3VubG9jayhicik7CisKKwkJaWYg
KHNraXApCisJCQljb250aW51ZTsKKworCQlhdV9oZGlyX2xvY2soaF9kaXIsIGRpciwgYmluZGV4
KTsKKwkJYnJfd2hfd3JpdGVfbG9jayhicik7CisJCWVyciA9IGF1X3doX2luaXQoYXVfaF9kcHRy
KHJvb3QsIGJpbmRleCksIGJyLAorCQkJCSBhdV9uZnNtbnQoc2IsIGJpbmRleCksIHNiKTsKKwkJ
YnJfd2hfd3JpdGVfdW5sb2NrKGJyKTsKKwkJYXVfaGRpcl91bmxvY2soaF9kaXIsIGRpciwgYmlu
ZGV4KTsKKwl9CisKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworaW50IGF1
X29wdHNfbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGF1X29wdHMgKm9wdHMp
Cit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmRpcjsKKwlzdHJ1Y3QgYXVfb3B0ICpvcHQ7
CisJc3RydWN0IGF1X29wdF94aW5vICpvcHRfeGlubzsKKwlhdWZzX2JpbmRleF90IGJlbmQ7CisJ
c3RydWN0IGF1X3NiaW5mbyAqc2JpbmZvOworCXVuc2lnbmVkIGludCB0bXA7CisKKwlBdVRyYWNl
RW50ZXIoKTsKKwlTaU11c3RXcml0ZUxvY2soc2IpOworCURpTXVzdFdyaXRlTG9jayhzYi0+c19y
b290KTsKKwlkaXIgPSBzYi0+c19yb290LT5kX2lub2RlOworCUlpTXVzdFdyaXRlTG9jayhkaXIp
OworCisJZXJyID0gMDsKKwlvcHRfeGlubyA9IE5VTEw7CisJb3B0ID0gb3B0cy0+b3B0OworCXdo
aWxlIChlcnIgPj0gMCAmJiBvcHQtPnR5cGUgIT0gT3B0X3RhaWwpCisJCWVyciA9IGF1X29wdF9z
aW1wbGUoc2IsIG9wdCsrLCBvcHRzKTsKKwlpZiAoZXJyID4gMCkKKwkJZXJyID0gMDsKKwllbHNl
IGlmICh1bmxpa2VseShlcnIgPCAwKSkKKwkJZ290byBvdXQ7CisKKwkvKiBkaXNhYmxlIHhpbm8s
IGhpbm90aWZ5LCBkbGd0IHRlbXBvcmFyeSAqLworCXNiaW5mbyA9IGF1X3NiaShzYik7CisJdG1w
ID0gc2JpbmZvLT5zaV9tbnRmbGFnczsKKwlhdV9vcHRfY2xyKHNiaW5mby0+c2lfbW50ZmxhZ3Ms
IFhJTk8pOworCWF1X29wdF9jbHIoc2JpbmZvLT5zaV9tbnRmbGFncywgRExHVCk7CisJYXVfb3B0
X3NldF91ZGJhKHNiaW5mby0+c2lfbW50ZmxhZ3MsIFVEQkFfUkVWQUwpOworCisJb3B0ID0gb3B0
cy0+b3B0OworCXdoaWxlIChlcnIgPj0gMCAmJiBvcHQtPnR5cGUgIT0gT3B0X3RhaWwpCisJCWVy
ciA9IGF1X29wdF9icihzYiwgb3B0KyssIG9wdHMpOworCWlmIChlcnIgPiAwKQorCQllcnIgPSAw
OworCWVsc2UgaWYgKHVubGlrZWx5KGVyciA8IDApKQorCQlnb3RvIG91dDsKKworCWJlbmQgPSBh
dV9zYmVuZChzYik7CisJaWYgKHVubGlrZWx5KGJlbmQgPCAwKSkgeworCQllcnIgPSAtRUlOVkFM
OworCQlBdUVycigibm8gYnJhbmNoZXNcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYXVf
b3B0X3Rlc3QodG1wLCBYSU5PKSkKKwkJYXVfb3B0X3NldChzYmluZm8tPnNpX21udGZsYWdzLCBY
SU5PKTsKKwlvcHQgPSBvcHRzLT5vcHQ7CisJd2hpbGUgKCFlcnIgJiYgb3B0LT50eXBlICE9IE9w
dF90YWlsKQorCQllcnIgPSBhdV9vcHRfeGlubyhzYiwgb3B0KyssICZvcHRfeGlubywgb3B0cyk7
CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0OworCisJLy90b2RvOiB0ZXN0IHRoaXMg
ZXJyb3IgY2FzZS4KKwllcnIgPSB2ZXJpZnlfb3B0cyhzYiwgdG1wLCAvKnJlbW91bnQqLzApOwor
CWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIG91dDsKKworCS8qIGVuYWJsZSB4aW5vICovCisJ
aWYgKGF1X29wdF90ZXN0KHRtcCwgWElOTykgJiYgIW9wdF94aW5vKSB7CisJCXN0cnVjdCBhdV9v
cHRfeGlubyB4aW5vOworCisJCXhpbm8uZmlsZSA9IGF1X3hpbm9fZGVmKHNiKTsKKwkJZXJyID0g
UFRSX0VSUih4aW5vLmZpbGUpOworCQlpZiAoSVNfRVJSKHhpbm8uZmlsZSkpCisJCQlnb3RvIG91
dDsKKworCQllcnIgPSBhdV94aW5vX3NldChzYiwgJnhpbm8sIC8qcmVtb3VudCovMCk7CisJCWZw
dXQoeGluby5maWxlKTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dDsKKwl9CisK
KwkvKiByZXN0b3JlIGhpbm90aWZ5ICovCisJc2JpbmZvLT5zaV9tbnRmbGFncyAmPSB+QXVPcHRN
YXNrX1VEQkE7CisJc2JpbmZvLT5zaV9tbnRmbGFncyB8PSAodG1wICYgQXVPcHRNYXNrX1VEQkEp
OworCWlmIChhdV9vcHRfdGVzdCh0bXAsIFVEQkFfSU5PVElGWSkpCisJCWF1X3Jlc2V0X2hpbm90
aWZ5KGRpciwgYXVfaGlfZmxhZ3MoZGlyLCAxKSAmIH5BdUhpX1hJTk8pOworCisJLyogcmVzdG9y
ZSBkbGd0ICovCisJaWYgKGF1X29wdF90ZXN0X2RsZ3QodG1wKSkKKwkJYXVfb3B0X3NldChzYmlu
Zm8tPnNpX21udGZsYWdzLCBETEdUKTsKKworIG91dDoKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0
dXJuIGVycjsKK30KKworaW50IGF1X29wdHNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi
LCBzdHJ1Y3QgYXVfb3B0cyAqb3B0cykKK3sKKwlpbnQgZXJyLCByZXJyOworCXN0cnVjdCBpbm9k
ZSAqZGlyOworCXN0cnVjdCBhdV9vcHRfeGlubyAqb3B0X3hpbm87CisJc3RydWN0IGF1X29wdCAq
b3B0OworCXVuc2lnbmVkIGludCBkbGd0OworCXN0cnVjdCBhdV9zYmluZm8gKnNiaW5mbzsKKwor
CUF1VHJhY2VFbnRlcigpOworCVNpTXVzdFdyaXRlTG9jayhzYik7CisJRGlNdXN0V3JpdGVMb2Nr
KHNiLT5zX3Jvb3QpOworCWRpciA9IHNiLT5zX3Jvb3QtPmRfaW5vZGU7CisJSWlNdXN0V3JpdGVM
b2NrKGRpcik7CisJc2JpbmZvID0gYXVfc2JpKHNiKTsKKwkvL0F1RGVidWdPbihhdV9vcHRfdGVz
dChzYmlmbm8tPnNpX21udGZsYWdzLCBVREJBX0lOT1RJRlkpKTsKKworCWVyciA9IDA7CisJZGxn
dCA9ICEhYXVfb3B0X3Rlc3RfZGxndChzYmluZm8tPnNpX21udGZsYWdzKTsKKwlvcHRfeGlubyA9
IE5VTEw7CisJb3B0ID0gb3B0cy0+b3B0OworCXdoaWxlIChlcnIgPj0gMCAmJiBvcHQtPnR5cGUg
IT0gT3B0X3RhaWwpIHsKKwkJZXJyID0gYXVfb3B0X3NpbXBsZShzYiwgb3B0LCBvcHRzKTsKKwor
CQkvKiBkaXNhYmxlIGl0IHRlbXBvcmFyeSAqLworCQlkbGd0ID0gISFhdV9vcHRfdGVzdF9kbGd0
KHNiaW5mby0+c2lfbW50ZmxhZ3MpOworCQlhdV9vcHRfY2xyKHNiaW5mby0+c2lfbW50ZmxhZ3Ms
IERMR1QpOworCisJCWlmICghZXJyKQorCQkJZXJyID0gYXVfb3B0X2JyKHNiLCBvcHQsIG9wdHMp
OworCQlpZiAoIWVycikKKwkJCWVyciA9IGF1X29wdF94aW5vKHNiLCBvcHQsICZvcHRfeGlubywg
b3B0cyk7CisKKwkJLyogcmVzdG9yZSBpdCAqLworCQlpZiAodW5saWtlbHkoZGxndCkpCisJCQlh
dV9vcHRfc2V0KHNiaW5mby0+c2lfbW50ZmxhZ3MsIERMR1QpOworCQlvcHQrKzsKKwl9CisJaWYg
KGVyciA+IDApCisJCWVyciA9IDA7CisJQXVUcmFjZUVycihlcnIpOworCisJLyogZ28gb24gZXZl
biBlcnIgKi8KKworCS8vdG9kbzogdGVzdCB0aGlzIGVycm9yIGNhc2UuCisJYXVfb3B0X2Nscihz
YmluZm8tPnNpX21udGZsYWdzLCBETEdUKTsKKwlyZXJyID0gdmVyaWZ5X29wdHMoc2IsIHNiaW5m
by0+c2lfbW50ZmxhZ3MsIC8qcmVtb3VudCovMSk7CisJaWYgKHVubGlrZWx5KGRsZ3QpKQorCQlh
dV9vcHRfc2V0KHNiaW5mby0+c2lfbW50ZmxhZ3MsIERMR1QpOworCWlmICh1bmxpa2VseShyZXJy
ICYmICFlcnIpKQorCQllcnIgPSByZXJyOworCisJaWYgKHVubGlrZWx5KGF1X2Z0ZXN0X29wdHMo
b3B0cy0+ZmxhZ3MsIFRSVU5DX1hJQikpKSB7CisJCXJlcnIgPSBhdV94aWJfdHJ1bmMoc2IpOwor
CQlpZiAodW5saWtlbHkocmVyciAmJiAhZXJyKSkKKwkJCWVyciA9IHJlcnI7CisJfQorCisJLyog
dGhleSBhcmUgaGFuZGxlZCBieSB0aGUgY2FsbGVyICovCisJaWYgKCFhdV9mdGVzdF9vcHRzKG9w
dHMtPmZsYWdzLCBSRUZSRVNIX0RJUikKKwkgICAgJiYgKG9wdHMtPmdpdmVuX3VkYmEgfHwgYXVf
b3B0X3Rlc3Qoc2JpbmZvLT5zaV9tbnRmbGFncywgWElOTykpKQorCQlhdV9mc2V0X29wdHMob3B0
cy0+ZmxhZ3MsIFJFRlJFU0hfRElSKTsKKworCUxLVFJUcmFjZSgic3RhdHVzIDB4JXhcbiIsIG9w
dHMtPmZsYWdzKTsKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtdXJO
IGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL29wdHMuaCBsaW51eC0yLjYuMjUu
NC11bmlvbmZzL2ZzL2F1ZnMvb3B0cy5oCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcv
ZnMvYXVmcy9vcHRzLmgJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1
LjQtdW5pb25mcy9mcy9hdWZzL29wdHMuaAkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0w
LDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggSnVuamlybyBPa2Fq
aW1hCisgKgorICogVGhpcyBwcm9ncmFtLCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
cgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHBy
b2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsg
aWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EK
KyAqLworCisvKgorICogbW91bnQgb3B0aW9ucy9mbGFncworICoKKyAqICRJZDogb3B0cy5oLHYg
MS4yIDIwMDgvMDQvMjEgMDE6NDY6MjYgc2Zqcm8gRXhwICQKKyAqLworCisjaWZuZGVmIF9fQVVG
U19PUFRTX0hfXworI2RlZmluZSBfX0FVRlNfT1BUU19IX18KKworI2lmZGVmIF9fS0VSTkVMX18K
KworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNs
dWRlIDxsaW51eC9hdWZzX3R5cGUuaD4KKyNpbmNsdWRlICJ3a3EuaCIKKworLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLworLyogbW91bnQgZmxhZ3MgKi8KKworLyogZXh0ZXJuYWwgaW5vZGUgbnVtYmVyIGJp
dG1hcCBhbmQgdHJhbnNsYXRpb24gdGFibGUgKi8KKyNkZWZpbmUgQXVPcHRfWElOTwkJMQorI2Rl
ZmluZSBBdU9wdF9UUlVOQ19YSU5PCSgxIDw8IDEpCisjZGVmaW5lIEF1T3B0X0xJTk8JCSgxIDw8
IDIpCisjZGVmaW5lIEF1T3B0X1VEQkFfTk9ORQkJKDEgPDwgMykJLyogdXNlcnMgZGlyZWN0IGJy
YW5jaCBhY2Nlc3MgKi8KKyNkZWZpbmUgQXVPcHRfVURCQV9SRVZBTAkoMSA8PCA0KQorI2RlZmlu
ZSBBdU9wdF9VREJBX0lOT1RJRlkJKDEgPDwgNSkKKyNkZWZpbmUgQXVPcHRfU0hXSAkJKDEgPDwg
NikKKyNkZWZpbmUgQXVPcHRfUExJTksJCSgxIDw8IDcpCisjZGVmaW5lIEF1T3B0X1dBUk5fUEVS
TQkJKDEgPDwgOCkKKyNkZWZpbmUgQXVPcHRfRElSUEVSTTEJCSgxIDw8IDkpCisjZGVmaW5lIEF1
T3B0X0RMR1QJCSgxIDw8IDEwKQorI2RlZmluZSBBdU9wdF9DT09fTk9ORQkJKDEgPDwgMTEpCS8q
IGNvcHl1cCBvbiBvcGVuICovCisjZGVmaW5lIEF1T3B0X0NPT19MRUFGCQkoMSA8PCAxMikKKyNk
ZWZpbmUgQXVPcHRfQ09PX0FMTAkJKDEgPDwgMTMpCisjZGVmaW5lIEF1T3B0X0FMV0FZU19ESVJP
UFEJKDEgPDwgMTQpCisjZGVmaW5lIEF1T3B0X1JFRlJPRgkJKDEgPDwgMTUpCisjZGVmaW5lIEF1
T3B0X1ZFUkJPU0UJCSgxIDw8IDE2KQorI2lmbmRlZiBDT05GSUdfQVVGU19ISU5PVElGWQorI3Vu
ZGVmIEF1T3B0X1VEQkFfSU5PVElGWQorI2RlZmluZSBBdU9wdF9VREJBX0lOT1RJRlkJMAorI2Vu
ZGlmCisjaWZuZGVmIENPTkZJR19BVUZTX1NIV0gKKyN1bmRlZiBBdU9wdF9TSFdICisjZGVmaW5l
IEF1T3B0X1NIV0gJCTAKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfQVVGU19ETEdUCisjdW5kZWYg
QXVPcHRfRElSUEVSTTEKKyNkZWZpbmUgQXVPcHRfRElSUEVSTTEJCTAKKyN1bmRlZiBBdU9wdF9E
TEdUCisjZGVmaW5lIEF1T3B0X0RMR1QJCTAKKyNlbmRpZgorCisvKiBwb2xpY2llcyB0byBzZWxl
Y3Qgb25lIGFtb25nIG11bHRpcGxlIHdyaXRhYmxlIGJyYW5jaGVzICovCitlbnVtIHsKKwlBdVdi
ckNyZWF0ZV9URFAsCS8qIHRvcCBkb3duIHBhcmVudCAqLworCUF1V2JyQ3JlYXRlX1JSLAkJLyog
cm91bmQgcm9iaW4gKi8KKwlBdVdickNyZWF0ZV9NRlMsCS8qIG1vc3QgZnJlZSBzcGFjZSAqLwor
CUF1V2JyQ3JlYXRlX01GU1YsCS8qIG1mcyB3aXRoIHNlY29uZHMgKi8KKwlBdVdickNyZWF0ZV9N
RlNSUiwJLyogbWZzIHRoZW4gcnIgKi8KKwlBdVdickNyZWF0ZV9NRlNSUlYsCS8qIG1mcyB0aGVu
IHJyIHdpdGggc2Vjb25kcyAqLworCUF1V2JyQ3JlYXRlX1BNRlMsCS8qIHBhcmVudCBhbmQgbWZz
ICovCisJQXVXYnJDcmVhdGVfUE1GU1YsCS8qIHBhcmVudCBhbmQgbWZzIHdpdGggc2Vjb25kcyAq
LworCisJQXVXYnJDcmVhdGVfRGVmID0gQXVXYnJDcmVhdGVfVERQCit9OworCitlbnVtIHsKKwlB
dVdickNvcHl1cF9URFAsCS8qIHRvcCBkb3duIHBhcmVudCAqLworCUF1V2JyQ29weXVwX0JVUCwJ
LyogYm90dG9tIHVwIHBhcmVudCAqLworCUF1V2JyQ29weXVwX0JVLAkJLyogYm90dG9tIHVwICov
CisKKwlBdVdickNvcHl1cF9EZWYgPSBBdVdickNvcHl1cF9URFAKK307CisKKyNkZWZpbmUgQXVP
cHRNYXNrX0NPTwkJKEF1T3B0X0NPT19OT05FIFwKKwkJCQkgfCBBdU9wdF9DT09fTEVBRiBcCisJ
CQkJIHwgQXVPcHRfQ09PX0FMTCkKKyNkZWZpbmUgQXVPcHRNYXNrX1VEQkEJCShBdU9wdF9VREJB
X05PTkUgXAorCQkJCSB8IEF1T3B0X1VEQkFfUkVWQUwgXAorCQkJCSB8IEF1T3B0X1VEQkFfSU5P
VElGWSkKKworI2lmZGVmIENPTkZJR19BVUZTX0NPTVBBVAorI2RlZmluZSBBdU9wdF9EZWZFeHRy
YTEJQXVPcHRfQUxXQVlTX0RJUk9QUQorI2Vsc2UKKyNkZWZpbmUgQXVPcHRfRGVmRXh0cmExCTAK
KyNlbmRpZgorCisjZGVmaW5lIEF1T3B0X0RlZgkoQXVPcHRfWElOTyBcCisJCQkgfCBBdU9wdF9V
REJBX1JFVkFMIFwKKwkJCSB8IEF1T3B0X1dBUk5fUEVSTSBcCisJCQkgfCBBdU9wdF9DT09fTk9O
RSBcCisJCQkgfCBBdU9wdF9QTElOSyBcCisJCQkgfCBBdU9wdF9EZWZFeHRyYTEpCisKKy8qIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGF1X29wdF9hZGQgeworCWF1ZnNfYmluZGV4X3QJCWJp
bmRleDsKKwljaGFyCQkJKnBhdGg7CisJaW50CQkJcGVybTsKKwlzdHJ1Y3QgbmFtZWlkYXRhCW5k
OworfTsKKworc3RydWN0IGF1X29wdF9kZWwgeworCWNoYXIJCSpwYXRoOworCXN0cnVjdCBkZW50
cnkJKmhfcm9vdDsKK307CisKK3N0cnVjdCBhdV9vcHRfbW9kIHsKKwljaGFyCQkqcGF0aDsKKwlp
bnQJCXBlcm07CisJc3RydWN0IGRlbnRyeQkqaF9yb290OworfTsKKworc3RydWN0IGF1X29wdF94
aW5vIHsKKwljaGFyCQkqcGF0aDsKKwlzdHJ1Y3QgZmlsZQkqZmlsZTsKK307CisKK3N0cnVjdCBh
dV9vcHRfeGlub19pdHJ1bmMgeworCWF1ZnNfYmluZGV4X3QJYmluZGV4OworfTsKKworc3RydWN0
IGF1X29wdF94aW5vX3RydW5jX3YgeworCXU2NAkJdXBwZXI7CisJaW50CQlzdGVwOworfTsKKwor
c3RydWN0IGF1X29wdF93YnJfY3JlYXRlIHsKKwlpbnQgd2JyX2NyZWF0ZTsKKwlpbnQgbWZzX3Nl
Y29uZDsKKwl1NjQgbWZzcnJfd2F0ZXJtYXJrOworfTsKKworc3RydWN0IGF1X29wdCB7CisJaW50
IHR5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgYXVfb3B0X3hpbm8JeGlubzsKKwkJc3RydWN0IGF1
X29wdF94aW5vX2l0cnVuYyB4aW5vX2l0cnVuYzsKKwkJc3RydWN0IGF1X29wdF9hZGQJYWRkOwor
CQlzdHJ1Y3QgYXVfb3B0X2RlbAlkZWw7CisJCXN0cnVjdCBhdV9vcHRfbW9kCW1vZDsKKwkJaW50
CQkJZGlyd2g7CisJCWludAkJCXJkY2FjaGU7CisJCWludAkJCWRlYmxrOworCQlpbnQJCQluaGFz
aDsKKwkJaW50CQkJdWRiYTsKKwkJaW50CQkJY29vOworCQlzdHJ1Y3QgYXVfb3B0X3dicl9jcmVh
dGUgd2JyX2NyZWF0ZTsKKwkJaW50CQkJd2JyX2NvcHl1cDsKKwl9OworfTsKKworLyogb3B0cyBm
bGFncyAqLworI2RlZmluZSBBdU9wdHNfUkVNT1VOVAkJMQorI2RlZmluZSBBdU9wdHNfUkVGUkVT
SF9ESVIJKDEgPDwgMSkKKyNkZWZpbmUgQXVPcHRzX1JFRlJFU0hfTk9ORElSCSgxIDw8IDIpCisj
ZGVmaW5lIEF1T3B0c19UUlVOQ19YSUIJKDEgPDwgMykKKyNkZWZpbmUgYXVfZnRlc3Rfb3B0cyhm
bGFncywgbmFtZSkJKChmbGFncykgJiBBdU9wdHNfIyNuYW1lKQorI2RlZmluZSBhdV9mc2V0X29w
dHMoZmxhZ3MsIG5hbWUpCXsgKGZsYWdzKSB8PSBBdU9wdHNfIyNuYW1lOyB9CisjZGVmaW5lIGF1
X2ZjbHJfb3B0cyhmbGFncywgbmFtZSkJeyAoZmxhZ3MpICY9IH5BdU9wdHNfIyNuYW1lOyB9CisK
K3N0cnVjdCBhdV9vcHRzIHsKKwlzdHJ1Y3QgYXVfb3B0CSpvcHQ7CisJaW50CQltYXhfb3B0Owor
CisJdW5zaWduZWQgaW50CWdpdmVuX3VkYmE7CisJdW5zaWduZWQgaW50CWZsYWdzOworfTsKKwor
LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSAqLworCitjb25zdCBjaGFyICphdV9vcHRzdHJfYnJfcGVybShpbnQg
YnJwZXJtKTsKK2NvbnN0IGNoYXIgKmF1X29wdHN0cl91ZGJhKGludCB1ZGJhKTsKK2NvbnN0IGNo
YXIgKmF1X29wdHN0cl9jb28oaW50IGNvbyk7Citjb25zdCBjaGFyICphdV9vcHRzdHJfd2JyX2Nv
cHl1cChpbnQgd2JyX2NvcHl1cCk7Citjb25zdCBjaGFyICphdV9vcHRzdHJfd2JyX2NyZWF0ZShp
bnQgd2JyX2NyZWF0ZSk7CisKK3ZvaWQgYXVfb3B0c19mcmVlKHN0cnVjdCBhdV9vcHRzICpvcHRz
KTsKK2ludCBhdV9vcHRzX3BhcnNlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxv
bmcgZmxhZ3MsIGNoYXIgKnN0ciwKKwkJICBzdHJ1Y3QgYXVfb3B0cyAqb3B0cyk7CitpbnQgYXVf
b3B0c19tb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYXVfb3B0cyAqb3B0cyk7
CitpbnQgYXVfb3B0c19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBhdV9v
cHRzICpvcHRzKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHVuc2ln
bmVkIGludCBhdV9vcHRfZG9fdGVzdCh1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGludCBi
aXQpCit7CisJQXVEZWJ1Z09uKGJpdCAmIChBdU9wdF9ETEdUIHwgQXVPcHRfRElSUEVSTTEpKTsK
KwlyZXR1cm4gKGZsYWdzICYgYml0KTsKK30KKworI2RlZmluZSBhdV9vcHRfdGVzdChmbGFncywg
bmFtZSkJYXVfb3B0X2RvX3Rlc3QoZmxhZ3MsIEF1T3B0XyMjbmFtZSkKKworI2RlZmluZSBhdV9v
cHRfc2V0KGZsYWdzLCBuYW1lKSBkbyB7IFwKKwlCVUlMRF9CVUdfT04oQXVPcHRfIyNuYW1lICYg
KEF1T3B0TWFza19DT08gfCBBdU9wdE1hc2tfVURCQSkpOyBcCisJKChmbGFncykgfD0gQXVPcHRf
IyNuYW1lKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBhdV9vcHRfY2xyKGZsYWdzLCBuYW1l
KQkJeyAoKGZsYWdzKSAmPSB+QXVPcHRfIyNuYW1lKTsgfQorCisjZGVmaW5lIGF1X29wdF9zZXRf
Y29vKGZsYWdzLCBuYW1lKSBkbyB7IFwKKwkoZmxhZ3MpICY9IH5BdU9wdE1hc2tfQ09POyBcCisJ
KChmbGFncykgfD0gQXVPcHRfIyNuYW1lKTsgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIGF1X29w
dF9zZXRfdWRiYShmbGFncywgbmFtZSkgZG8geyBcCisJKGZsYWdzKSAmPSB+QXVPcHRNYXNrX1VE
QkE7IFwKKwkoKGZsYWdzKSB8PSBBdU9wdF8jI25hbWUpOyBcCit9IHdoaWxlKDApCisKK3N0YXRp
YyBpbmxpbmUgdW5zaWduZWQgaW50IGF1X29wdF90ZXN0X2RsZ3QodW5zaWduZWQgaW50IGZsYWdz
KQoreworCWlmICghYXVfdGVzdF93a3EoY3VycmVudCkpCisJCXJldHVybiAoZmxhZ3MgJiBBdU9w
dF9ETEdUKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXVf
b3B0X3Rlc3RfZGlycGVybTEodW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmICghYXVfdGVzdF93
a3EoY3VycmVudCkpCisJCXJldHVybiAoZmxhZ3MgJiBBdU9wdF9ESVJQRVJNMSk7CisJcmV0dXJu
IDA7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX19BVUZTX09QVFNf
SF9fICovCmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9wbGlu
ay5jIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9wbGluay5jCi0tLSBsaW51eC0yLjYu
MjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9wbGluay5jCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAz
MDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9wbGluay5jCTIwMDgtMDUtMjUg
MTE6NTY6MDggKzAzMDAKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDctMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25n
IHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisg
KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3Rvbiwg
TUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qCisgKiBwc2V1ZG8tbGluaworICoKKyAqICRJ
ZDogcGxpbmsuYyx2IDEuMiAyMDA4LzA0LzIxIDAxOjQ1OjE2IHNmanJvIEV4cCAkCisgKi8KKwor
I2luY2x1ZGUgImF1ZnMuaCIKKworc3RydWN0IHBzZXVkb19saW5rIHsKKwlzdHJ1Y3QgbGlzdF9o
ZWFkIGxpc3Q7CisJc3RydWN0IGlub2RlICppbm9kZTsKK307CisKKyNpZmRlZiBDT05GSUdfQVVG
U19ERUJVRwordm9pZCBhdV9wbGlua19saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJ
c3RydWN0IGF1X3NiaW5mbyAqc2JpbmZvOworCXN0cnVjdCBsaXN0X2hlYWQgKnBsaW5rX2xpc3Q7
CisJc3RydWN0IHBzZXVkb19saW5rICpwbGluazsKKworCUF1VHJhY2VFbnRlcigpOworCVNpTXVz
dEFueUxvY2soc2IpOworCXNiaW5mbyA9IGF1X3NiaShzYik7CisJQXVEZWJ1Z09uKCFhdV9vcHRf
dGVzdChhdV9tbnRmbGFncyhzYiksIFBMSU5LKSk7CisKKwlwbGlua19saXN0ID0gJnNiaW5mby0+
c2lfcGxpbms7CisJc3Bpbl9sb2NrKCZzYmluZm8tPnNpX3BsaW5rX2xvY2spOworCWxpc3RfZm9y
X2VhY2hfZW50cnkocGxpbmssIHBsaW5rX2xpc3QsIGxpc3QpCisJCUF1RGJnKCIlbHVcbiIsIHBs
aW5rLT5pbm9kZS0+aV9pbm8pOworCXNwaW5fdW5sb2NrKCZzYmluZm8tPnNpX3BsaW5rX2xvY2sp
OworfQorI2VuZGlmCisKK2ludCBhdV9wbGlua190ZXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2Is
IHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGZvdW5kOworCXN0cnVjdCBhdV9zYmluZm8g
KnNiaW5mbzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlua19saXN0OworCXN0cnVjdCBwc2V1ZG9f
bGluayAqcGxpbms7CisKKwlMS1RSVHJhY2UoImklbHVcbiIsIGlub2RlLT5pX2lubyk7CisJU2lN
dXN0QW55TG9jayhzYik7CisJc2JpbmZvID0gYXVfc2JpKHNiKTsKKwlBdURlYnVnT24oIWF1X29w
dF90ZXN0KGF1X21udGZsYWdzKHNiKSwgUExJTkspKTsKKworCWZvdW5kID0gMDsKKwlwbGlua19s
aXN0ID0gJnNiaW5mby0+c2lfcGxpbms7CisJc3Bpbl9sb2NrKCZzYmluZm8tPnNpX3BsaW5rX2xv
Y2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGxpbmssIHBsaW5rX2xpc3QsIGxpc3QpCisJCWlm
IChwbGluay0+aW5vZGUgPT0gaW5vZGUpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9
CisJc3Bpbl91bmxvY2soJnNiaW5mby0+c2lfcGxpbmtfbG9jayk7CisJcmV0dXJuIGZvdW5kOwor
fQorCisvKiAyMCBpcyBtYXggZGlnaXRzIGxlbmd0aCBvZiB1bG9uZyA2NCAqLworI2RlZmluZSBQ
TElOS19OQU1FX0xFTgkoKDIwICsgMSkgKiAyKQorCitzdGF0aWMgaW50IHBsaW5rX25hbWUoY2hh
ciAqbmFtZSwgaW50IGxlbiwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICAgICAgYXVmc19iaW5k
ZXhfdCBiaW5kZXgpCit7CisJaW50IHJsZW47CisJc3RydWN0IGlub2RlICpoX2lub2RlOworCisJ
TEtUUlRyYWNlKCJpJWx1LCBiJWRcbiIsIGlub2RlLT5pX2lubywgYmluZGV4KTsKKwlBdURlYnVn
T24obGVuICE9IFBMSU5LX05BTUVfTEVOKTsKKwloX2lub2RlID0gYXVfaF9pcHRyKGlub2RlLCBi
aW5kZXgpOworCUF1RGVidWdPbighaF9pbm9kZSk7CisJcmxlbiA9IHNucHJpbnRmKG5hbWUsIGxl
biwgIiVsdS4lbHUiLCBpbm9kZS0+aV9pbm8sIGhfaW5vZGUtPmlfaW5vKTsKKwlBdURlYnVnT24o
cmxlbiA+PSBsZW4pOworCXJldHVybiBybGVuOworfQorCitzdHJ1Y3QgZGVudHJ5ICphdV9wbGlu
a19sa3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGF1ZnNfYmluZGV4X3QgYmluZGV4LAorCQkJ
ICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBkZW50cnkgKmhfZGVudHJ5LCAq
aF9wYXJlbnQ7CisJc3RydWN0IGF1X2JyYW5jaCAqYnI7CisJc3RydWN0IGlub2RlICpoX2RpcjsK
KwljaGFyIHRndG5hbWVbUExJTktfTkFNRV9MRU5dOworCWludCBsZW47CisJc3RydWN0IGF1X25k
eCBuZHggPSB7CisJCS5mbGFncwk9IDAsCisJCS5uZAk9IE5VTEwsCisJCS8vLmJyCT0gTlVMTAor
CX07CisKKwlMS1RSVHJhY2UoImIlZCwgaSVsdVxuIiwgYmluZGV4LCBpbm9kZS0+aV9pbm8pOwor
CWJyID0gYXVfc2JyKHNiLCBiaW5kZXgpOworCWhfcGFyZW50ID0gYnItPmJyX3BsaW5rOworCUF1
RGVidWdPbighaF9wYXJlbnQpOworCWhfZGlyID0gaF9wYXJlbnQtPmRfaW5vZGU7CisJQXVEZWJ1
Z09uKCFoX2Rpcik7CisKKwlsZW4gPSBwbGlua19uYW1lKHRndG5hbWUsIHNpemVvZih0Z3RuYW1l
KSwgaW5vZGUsIGJpbmRleCk7CisKKwkvKiBhbHdheXMgc3VwZXJpby4gKi8KKwluZHgubmZzbW50
ID0gYXVfZG9fbmZzbW50KGJyLT5icl9tbnQpOworCW11dGV4X2xvY2tfbmVzdGVkKCZoX2Rpci0+
aV9tdXRleCwgQXVMc2NfSV9DSElMRDIpOworCWhfZGVudHJ5ID0gYXVfc2lvX2xrdXBfb25lKHRn
dG5hbWUsIGhfcGFyZW50LCBsZW4sICZuZHgpOworCW11dGV4X3VubG9jaygmaF9kaXItPmlfbXV0
ZXgpOworCXJldHVybiBoX2RlbnRyeTsKK30KKworc3RhdGljIGludCBkb193aHBsaW5rKGNoYXIg
KnRndCwgaW50IGxlbiwgc3RydWN0IGRlbnRyeSAqaF9wYXJlbnQsCisJCSAgICAgIHN0cnVjdCBk
ZW50cnkgKmhfZGVudHJ5LCBzdHJ1Y3QgdmZzbW91bnQgKm5mc21udCwKKwkJICAgICAgc3RydWN0
IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgZXJyLCBkbGd0OworCXN0cnVjdCBkZW50cnkgKmhf
dGd0OworCXN0cnVjdCBpbm9kZSAqaF9kaXI7CisJc3RydWN0IHZmc3ViX2FyZ3MgdmFyZ3M7CisJ
c3RydWN0IGF1X25keCBuZHggPSB7CisJCS5uZnNtbnQJPSBuZnNtbnQsCisJCS5mbGFncwk9IDAs
CisJCS5uZAk9IE5VTEwsCisJCS8vLmJyCT0gTlVMTAorCX07CisKKwlkbGd0ID0gISFhdV9vcHRf
dGVzdF9kbGd0KGF1X21udGZsYWdzKHNiKSk7CisJaWYgKHVubGlrZWx5KGRsZ3QpKQorCQlhdV9m
c2V0X25keChuZHguZmxhZ3MsIERMR1QpOworCWhfdGd0ID0gYXVfbGt1cF9vbmUodGd0LCBoX3Bh
cmVudCwgbGVuLCAmbmR4KTsKKwllcnIgPSBQVFJfRVJSKGhfdGd0KTsKKwlpZiAoSVNfRVJSKGhf
dGd0KSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAwOworCXZmc3ViX2FyZ3NfaW5pdCgmdmFyZ3Ms
IE5VTEwsIGRsZ3QsIDApOworCWhfZGlyID0gaF9wYXJlbnQtPmRfaW5vZGU7CisJaWYgKHVubGlr
ZWx5KGhfdGd0LT5kX2lub2RlICYmIGhfdGd0LT5kX2lub2RlICE9IGhfZGVudHJ5LT5kX2lub2Rl
KSkKKwkJZXJyID0gdmZzdWJfdW5saW5rKGhfZGlyLCBoX3RndCwgJnZhcmdzKTsKKwlpZiAoIWVy
ciAmJiAhaF90Z3QtPmRfaW5vZGUpIHsKKwkJZXJyID0gdmZzdWJfbGluayhoX2RlbnRyeSwgaF9k
aXIsIGhfdGd0LCBkbGd0KTsKKwkJLy9pbm9kZS0+aV9ubGluaysrOworCX0KKwlkcHV0KGhfdGd0
KTsKKworIG91dDoKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0
IGRvX3docGxpbmtfYXJncyB7CisJaW50ICplcnJwOworCWNoYXIgKnRndDsKKwlpbnQgbGVuOwor
CXN0cnVjdCBkZW50cnkgKmhfcGFyZW50OworCXN0cnVjdCBkZW50cnkgKmhfZGVudHJ5OworCXN0
cnVjdCB2ZnNtb3VudCAqbmZzbW50OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7Cit9OworCitz
dGF0aWMgdm9pZCBjYWxsX2RvX3docGxpbmsodm9pZCAqYXJncykKK3sKKwlzdHJ1Y3QgZG9fd2hw
bGlua19hcmdzICphID0gYXJnczsKKwkqYS0+ZXJycCA9IGRvX3docGxpbmsoYS0+dGd0LCBhLT5s
ZW4sIGEtPmhfcGFyZW50LCBhLT5oX2RlbnRyeSwKKwkJCSAgICAgIGEtPm5mc21udCwgYS0+c2Ip
OworfQorCitzdGF0aWMgaW50IHdocGxpbmsoc3RydWN0IGRlbnRyeSAqaF9kZW50cnksIHN0cnVj
dCBpbm9kZSAqaW5vZGUsCisJCSAgIGF1ZnNfYmluZGV4X3QgYmluZGV4LCBzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiKQoreworCWludCBlcnIsIGxlbiwgd2txX2VycjsKKwlzdHJ1Y3QgYXVfYnJhbmNo
ICpicjsKKwlzdHJ1Y3QgZGVudHJ5ICpoX3BhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmhfZGlyOwor
CWNoYXIgdGd0bmFtZVtQTElOS19OQU1FX0xFTl07CisKKwlMS1RSVHJhY2UoIiUuKnNcbiIsIEF1
RExOUGFpcihoX2RlbnRyeSkpOworCWJyID0gYXVfc2JyKGlub2RlLT5pX3NiLCBiaW5kZXgpOwor
CWhfcGFyZW50ID0gYnItPmJyX3BsaW5rOworCUF1RGVidWdPbighaF9wYXJlbnQpOworCWhfZGly
ID0gaF9wYXJlbnQtPmRfaW5vZGU7CisJQXVEZWJ1Z09uKCFoX2Rpcik7CisKKwlsZW4gPSBwbGlu
a19uYW1lKHRndG5hbWUsIHNpemVvZih0Z3RuYW1lKSwgaW5vZGUsIGJpbmRleCk7CisKKwkvKiBh
bHdheXMgc3VwZXJpby4gKi8KKwltdXRleF9sb2NrX25lc3RlZCgmaF9kaXItPmlfbXV0ZXgsIEF1
THNjX0lfQ0hJTEQyKTsKKwlpZiAoIWF1X3Rlc3Rfd2txKGN1cnJlbnQpKSB7CisJCXN0cnVjdCBk
b193aHBsaW5rX2FyZ3MgYXJncyA9IHsKKwkJCS5lcnJwCQk9ICZlcnIsCisJCQkudGd0CQk9IHRn
dG5hbWUsCisJCQkubGVuCQk9IGxlbiwKKwkJCS5oX3BhcmVudAk9IGhfcGFyZW50LAorCQkJLmhf
ZGVudHJ5CT0gaF9kZW50cnksCisJCQkubmZzbW50CQk9IGF1X2RvX25mc21udChici0+YnJfbW50
KSwKKwkJCS5zYgkJPSBzYgorCQl9OworCQl3a3FfZXJyID0gYXVfd2txX3dhaXQoY2FsbF9kb193
aHBsaW5rLCAmYXJncywgLypkbGd0Ki8wKTsKKwkJaWYgKHVubGlrZWx5KHdrcV9lcnIpKQorCQkJ
ZXJyID0gd2txX2VycjsKKwl9IGVsc2UKKwkJZXJyID0gZG9fd2hwbGluayh0Z3RuYW1lLCBsZW4s
IGhfcGFyZW50LCBoX2RlbnRyeSwKKwkJCQkgYXVfZG9fbmZzbW50KGJyLT5icl9tbnQpLCBzYik7
CisJbXV0ZXhfdW5sb2NrKCZoX2Rpci0+aV9tdXRleCk7CisKKwlBdVRyYWNlRXJyKGVycik7CisJ
cmV0dXJuIGVycjsKK30KKwordm9pZCBhdV9wbGlua19hcHBlbmQoc3RydWN0IHN1cGVyX2Jsb2Nr
ICpzYiwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICAgICBzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRy
eSwgYXVmc19iaW5kZXhfdCBiaW5kZXgpCit7CisJc3RydWN0IGF1X3NiaW5mbyAqc2JpbmZvOwor
CXN0cnVjdCBsaXN0X2hlYWQgKnBsaW5rX2xpc3Q7CisJc3RydWN0IHBzZXVkb19saW5rICpwbGlu
azsKKwlpbnQgZm91bmQsIGVyciwgY250OworCisJTEtUUlRyYWNlKCJpJWx1XG4iLCBpbm9kZS0+
aV9pbm8pOworCVNpTXVzdEFueUxvY2soc2IpOworCXNiaW5mbyA9IGF1X3NiaShzYik7CisJQXVE
ZWJ1Z09uKCFhdV9vcHRfdGVzdChhdV9tbnRmbGFncyhzYiksIFBMSU5LKSk7CisKKwljbnQgPSAw
OworCWZvdW5kID0gMDsKKwlwbGlua19saXN0ID0gJnNiaW5mby0+c2lfcGxpbms7CisJc3Bpbl9s
b2NrKCZzYmluZm8tPnNpX3BsaW5rX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGxpbmss
IHBsaW5rX2xpc3QsIGxpc3QpIHsKKwkJY250Kys7CisJCWlmIChwbGluay0+aW5vZGUgPT0gaW5v
ZGUpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZXJyID0gMDsKKwlp
ZiAoIWZvdW5kKSB7CisJCXBsaW5rID0ga21hbGxvYyhzaXplb2YoKnBsaW5rKSwgR0ZQX0FUT01J
Qyk7CisJCWlmIChwbGluaykgeworCQkJcGxpbmstPmlub2RlID0gaWdyYWIoaW5vZGUpOworCQkJ
bGlzdF9hZGQoJnBsaW5rLT5saXN0LCBwbGlua19saXN0KTsKKwkJCWNudCsrOworCQl9IGVsc2UK
KwkJCWVyciA9IC1FTk9NRU07CisJfQorCXNwaW5fdW5sb2NrKCZzYmluZm8tPnNpX3BsaW5rX2xv
Y2spOworCisJaWYgKCFlcnIpCisJCWVyciA9IHdocGxpbmsoaF9kZW50cnksIGlub2RlLCBiaW5k
ZXgsIHNiKTsKKworCWlmICh1bmxpa2VseShjbnQgPiBBVUZTX1BMSU5LX1dBUk4pKQorCQlBdVdh
cm4xKCJ1bmV4cGVjdGVkbHkgbWFueSBwc2V1ZG8gbGlua3MsICVkXG4iLCBjbnQpOworCWlmICh1
bmxpa2VseShlcnIpKQorCQlBdVdhcm4oImVyciAlZCwgZGFtYWdlZCBwc2V1ZG8gbGluay4gaWdu
b3JlZC5cbiIsIGVycik7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3B1dF9wbGluayhzdHJ1Y3QgcHNl
dWRvX2xpbmsgKnBsaW5rLCBpbnQgZG9fZGVsKQoreworCUF1VHJhY2VFbnRlcigpOworCisJaXB1
dChwbGluay0+aW5vZGUpOworCWlmIChkb19kZWwpCisJCWxpc3RfZGVsKCZwbGluay0+bGlzdCk7
CisJa2ZyZWUocGxpbmspOworfQorCit2b2lkIGF1X3BsaW5rX3B1dChzdHJ1Y3Qgc3VwZXJfYmxv
Y2sgKnNiKQoreworCXN0cnVjdCBhdV9zYmluZm8gKnNiaW5mbzsKKwlzdHJ1Y3QgbGlzdF9oZWFk
ICpwbGlua19saXN0OworCXN0cnVjdCBwc2V1ZG9fbGluayAqcGxpbmssICp0bXA7CisKKwlBdVRy
YWNlRW50ZXIoKTsKKwlTaU11c3RXcml0ZUxvY2soc2IpOworCXNiaW5mbyA9IGF1X3NiaShzYik7
CisJQXVEZWJ1Z09uKCFhdV9vcHRfdGVzdChhdV9tbnRmbGFncyhzYiksIFBMSU5LKSk7CisKKwlw
bGlua19saXN0ID0gJnNiaW5mby0+c2lfcGxpbms7CisJLy9zcGluX2xvY2soJnNiaW5mby0+c2lf
cGxpbmtfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBsaW5rLCB0bXAsIHBsaW5r
X2xpc3QsIGxpc3QpCisJCWRvX3B1dF9wbGluayhwbGluaywgMCk7CisJSU5JVF9MSVNUX0hFQUQo
cGxpbmtfbGlzdCk7CisJLy9zcGluX3VubG9jaygmc2JpbmZvLT5zaV9wbGlua19sb2NrKTsKK30K
Kwordm9pZCBhdV9wbGlua19oYWxmX3JlZnJlc2goc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYXVm
c19iaW5kZXhfdCBicl9pZCkKK3sKKwlzdHJ1Y3QgYXVfc2JpbmZvICpzYmluZm87CisJc3RydWN0
IGxpc3RfaGVhZCAqcGxpbmtfbGlzdDsKKwlzdHJ1Y3QgcHNldWRvX2xpbmsgKnBsaW5rLCAqdG1w
OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJYXVmc19iaW5kZXhfdCBic3RhcnQsIGJlbmQsIGJp
bmRleDsKKwlpbnQgZG9fcHV0OworCisJQXVUcmFjZUVudGVyKCk7CisJU2lNdXN0V3JpdGVMb2Nr
KHNiKTsKKwlzYmluZm8gPSBhdV9zYmkoc2IpOworCUF1RGVidWdPbighYXVfb3B0X3Rlc3QoYXVf
bW50ZmxhZ3Moc2IpLCBQTElOSykpOworCisJcGxpbmtfbGlzdCA9ICZzYmluZm8tPnNpX3BsaW5r
OworCS8vc3Bpbl9sb2NrKCZzYmluZm8tPnNpX3BsaW5rX2xvY2spOworCWxpc3RfZm9yX2VhY2hf
ZW50cnlfc2FmZShwbGluaywgdG1wLCBwbGlua19saXN0LCBsaXN0KSB7CisJCWRvX3B1dCA9IDA7
CisJCWlub2RlID0gaWdyYWIocGxpbmstPmlub2RlKTsKKwkJaWlfd3JpdGVfbG9ja19jaGlsZChp
bm9kZSk7CisJCWJzdGFydCA9IGF1X2lic3RhcnQoaW5vZGUpOworCQliZW5kID0gYXVfaWJlbmQo
aW5vZGUpOworCQlpZiAoYnN0YXJ0ID49IDApIHsKKwkJCWZvciAoYmluZGV4ID0gYnN0YXJ0OyBi
aW5kZXggPD0gYmVuZDsgYmluZGV4KyspIHsKKwkJCQlpZiAoIWF1X2hfaXB0cihpbm9kZSwgYmlu
ZGV4KQorCQkJCSAgICB8fCBhdV9paV9icl9pZChpbm9kZSwgYmluZGV4KSAhPSBicl9pZCkKKwkJ
CQkJY29udGludWU7CisJCQkJYXVfc2V0X2hfaXB0cihpbm9kZSwgYmluZGV4LCBOVUxMLCAwKTsK
KwkJCQlkb19wdXQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UKKwkJCWRvX3B1dF9w
bGluayhwbGluaywgMSk7CisKKwkJaWYgKGRvX3B1dCkgeworCQkJZm9yIChiaW5kZXggPSBic3Rh
cnQ7IGJpbmRleCA8PSBiZW5kOyBiaW5kZXgrKykKKwkJCQlpZiAoYXVfaF9pcHRyKGlub2RlLCBi
aW5kZXgpKSB7CisJCQkJCWRvX3B1dCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWlmIChk
b19wdXQpCisJCQkJZG9fcHV0X3BsaW5rKHBsaW5rLCAxKTsKKwkJfQorCQlpaV93cml0ZV91bmxv
Y2soaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwl9CisJLy9zcGluX3VubG9jaygmc2JpbmZvLT5z
aV9wbGlua19sb2NrKTsKK30KZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9m
cy9hdWZzL3JvYnIuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvcm9ici5jCi0tLSBs
aW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9yb2JyLmMJMTk3MC0wMS0wMSAwMzow
MDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL3JvYnIuYwkyMDA4
LTA1LTI1IDExOjU4OjUzICswMzAwCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA4IEp1bmppcm8gT2thamltYQorICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxv
bmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK
KyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9u
LCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworLyoKKyAqICdyb2JyJywgYXVmcyBhcyByZWFk
b25seSBicmFuY2ggb2YgYW5vdGhlciBhdWZzCisgKgorICogJElkOiByb2JyLmMsdiAxLjMgMjAw
OC8wNS8xOSAwMTo0ODowNCBzZmpybyBFeHAgJAorICovCisKKyNpbmNsdWRlICJhdWZzLmgiCisK
Ky8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IGF1X3Rlc3Rfcm9icl93aChzdHJ1Y3QgcXN0ciAq
bmFtZSwgc3RydWN0IGRlbnRyeSAqaF9wYXJlbnQsCisJCSAgICBzdHJ1Y3QgcXN0ciAqd2hfbmFt
ZSwgaW50IHRyeV9zaW8sIHN0cnVjdCBhdV9uZHggKm5keCkKK3sKKwlpZiAoc3RybmNtcChuYW1l
LT5uYW1lLCBBVUZTX1dIX1BGWCwgQVVGU19XSF9QRlhfTEVOKSkKKwkJcmV0dXJuIGF1X3doX3Rl
c3QoaF9wYXJlbnQsIHdoX25hbWUsIHRyeV9zaW8sIG5keCk7CisJcmV0dXJuIC1FUEVSTTsKK30K
KworaW50IGF1X3Rlc3Rfcm9icl9zaHdoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IHN0
cnVjdCBxc3RyICpuYW1lKQoreworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICov
CisKK3N0cnVjdCBhdV9yb2JyX2x2bWEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1
Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKK307CisKK3N0cnVjdCBmaWxlICphdV9yb2JyX3NhZmVf
ZmlsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9
IHZtYS0+dm1fZmlsZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZS0+Zl9kZW50cnkt
PmRfc2I7CisJc3RydWN0IGF1X3JvYnJfbHZtYSAqbHZtYSwgKmVudHJ5OworCXN0cnVjdCBhdV9z
YmluZm8gKnNiaW5mbzsKKwlpbnQgZm91bmQsIHdhcm47CisKKwlBdVRyYWNlRW50ZXIoKTsKKwlB
dURlYnVnT24oIWF1X3Rlc3RfYXVmcyhzYikpOworCisJd2FybiA9IDA7CisJZm91bmQgPSAwOwor
CXNiaW5mbyA9IGF1X3NiaShzYik7CisJc3Bpbl9sb2NrKCZzYmluZm8tPnNpX2x2bWFfbG9jayk7
CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJnNiaW5mby0+c2lfbHZtYSwgbGlzdCkgewor
CQlmb3VuZCA9IChlbnRyeS0+dm1hID09IHZtYSk7CisJCWlmICh1bmxpa2VseShmb3VuZCkpCisJ
CQlicmVhazsKKwl9CisJaWYgKCFmb3VuZCkgeworCQlsdm1hID0ga21hbGxvYyhzaXplb2YoKmx2
bWEpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGx2bWEpIHsKKwkJCWx2bWEtPnZtYSA9IHZtYTsKKwkJ
CWxpc3RfYWRkKCZsdm1hLT5saXN0LCAmc2JpbmZvLT5zaV9sdm1hKTsKKwkJfSBlbHNlIHsKKwkJ
CXdhcm4gPSAxOworCQkJZmlsZSA9IE5VTEw7CisJCX0KKwl9IGVsc2UKKwkJZmlsZSA9IE5VTEw7
CisJc3Bpbl91bmxvY2soJnNiaW5mby0+c2lfbHZtYV9sb2NrKTsKKworCWlmICh1bmxpa2VseSh3
YXJuKSkKKwkJQXVXYXJuMSgibm8gbWVtb3J5IGZvciBsdm1hXG4iKTsKKwlyZXR1cm4gZmlsZTsK
K30KKwordm9pZCBhdV9yb2JyX3Jlc2V0X2ZpbGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEs
IHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlLT5m
X2RlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3QgYXVfcm9icl9sdm1hICplbnRyeSwgKmZvdW5kOworCXN0
cnVjdCBhdV9zYmluZm8gKnNiaW5mbzsKKworCUF1VHJhY2VFbnRlcigpOworCUF1RGVidWdPbigh
YXVfdGVzdF9hdWZzKHNiKSk7CisKKwl2bWEtPnZtX2ZpbGUgPSBmaWxlOworCS8vc21wX21iKCk7
IC8qIGZsdXNoIHZtX2ZpbGUgKi8KKworCWZvdW5kID0gTlVMTDsKKwlzYmluZm8gPSBhdV9zYmko
c2IpOworCXNwaW5fbG9jaygmc2JpbmZvLT5zaV9sdm1hX2xvY2spOworCWxpc3RfZm9yX2VhY2hf
ZW50cnkoZW50cnksICZzYmluZm8tPnNpX2x2bWEsIGxpc3QpCisJCWlmIChlbnRyeS0+dm1hID09
IHZtYSkgeworCQkJZm91bmQgPSBlbnRyeTsKKwkJCWJyZWFrOworCQl9CisJQXVEZWJ1Z09uKCFm
b3VuZCk7CisJbGlzdF9kZWwoJmZvdW5kLT5saXN0KTsKKwlzcGluX3VubG9jaygmc2JpbmZvLT5z
aV9sdm1hX2xvY2spOworCWtmcmVlKGZvdW5kKTsKK30KZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40
LXVuaW9uZnMub3JpZy9mcy9hdWZzL3NiaW5mby5jIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMv
YXVmcy9zYmluZm8uYwotLS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvc2Jp
bmZvLmMJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQtdW5pb25m
cy9mcy9hdWZzL3NiaW5mby5jCTIwMDgtMDUtMjUgMTE6NTg6NTMgKzAzMDAKQEAgLTAsMCArMSwy
NjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAq
CisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3Qs
IHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisK
Ky8qCisgKiBzdXBlcmJsb2NrIHByaXZhdGUgZGF0YQorICoKKyAqICRJZDogc2JpbmZvLmMsdiAx
LjUgMjAwOC8wNS8xOSAwMTo0OTo1NiBzZmpybyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxsaW51
eC9tbnRfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRl
ICJhdWZzLmgiCisKKy8qCisgKiB0aGV5IGFyZSBuZWNlc3NhcnkgcmVnYXJkbGVzcyBzeXNmcyBp
cyBkaXNhYmxlZC4KKyAqLwordm9pZCBhdV9zaV9mcmVlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQor
eworCXN0cnVjdCBhdV9zYmluZm8gKnNiaW5mbzsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwor
CisJTEtUUlRyYWNlKCJrb2JqICVwXG4iLCBrb2JqKTsKKwlzYmluZm8gPSBjb250YWluZXJfb2Yo
a29iaiwgc3RydWN0IGF1X3NiaW5mbywgc2lfa29iaik7CisJTEtUUlRyYWNlKCJzYmluZm8gJXBc
biIsIHNiaW5mbyk7CisJQXVEZWJ1Z09uKCFsaXN0X2VtcHR5KCZzYmluZm8tPnNpX3BsaW5rKSk7
CisKKwlzYiA9IHNiaW5mby0+c2lfc2I7CisJaWYgKHVubGlrZWx5KCFhdV9mdGVzdF9zaShzYmlu
Zm8sIEZBSUxFRF9JTklUKSkpIHsKKwkJYXVfc2JpbGlzdF9sb2NrKCk7CisJCWF1X3NiaWxpc3Rf
ZGVsKHNiaW5mbyk7CisJCWF1X3NiaWxpc3RfdW5sb2NrKCk7CisJfQorCisJc2lfd3JpdGVfbG9j
ayhzYik7CisJYXVfeGlub19jbHIoc2IpOworCWF1X2JyX2ZyZWUoc2JpbmZvKTsKKwlrZnJlZShz
YmluZm8tPnNpX2JyYW5jaCk7CisJc2lfd3JpdGVfdW5sb2NrKHNiKTsKKworCS8vQXVEYmcoImZy
ZWVcbiIpOworIAlrZnJlZShzYmluZm8pOworfQorCitpbnQgYXVfc2lfYWxsb2Moc3RydWN0IHN1
cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBhdV9zYmluZm8gKnNiaW5mbzsK
KworCUF1VHJhY2VFbnRlcigpOworCisJZXJyID0gLUVOT01FTTsKKwlzYmluZm8gPSBrbWFsbG9j
KHNpemVvZigqc2JpbmZvKSwgR0ZQX0tFUk5FTCk7CisJLy9pZiAoTGt0ckNvbmQpIHtrZnJlZShz
YmluZm8pOyBzYmluZm8gPSBOVUxMO30KKwlpZiAodW5saWtlbHkoIXNiaW5mbykpCisJCWdvdG8g
b3V0OworCXNiaW5mby0+c2lfYnJhbmNoID0ga3phbGxvYyhzaXplb2YoKnNiaW5mby0+c2lfYnJh
bmNoKSwgR0ZQX0tFUk5FTCk7CisJLy9pZiAoTGt0ckNvbmQpIHtrZnJlZShzYmluZm8tPnNpX2Jy
YW5jaCk7IHNiaW5mby0+c2lfYnJhbmNoID0gTlVMTDt9CisJaWYgKHVubGlrZWx5KCFzYmluZm8t
PnNpX2JyYW5jaCkpCisJCWdvdG8gb3V0X3NiaW5mbzsKKworCW1lbXNldCgmc2JpbmZvLT5zaV9r
b2JqLCAwLCBzaXplb2Yoc2JpbmZvLT5zaV9rb2JqKSk7CisJZXJyID0gc3lzYXVmc19zaV9pbml0
KHNiaW5mbyk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0X2JyOworCisJYXVfcndf
aW5pdF93bG9jaygmc2JpbmZvLT5zaV9yd3NlbSk7CisJc2JpbmZvLT5zaV9nZW5lcmF0aW9uID0g
MDsKKwkvL3NiaW5mby0+c2lfZ2VuZXJhdGlvbiA9IElOVF9NQVggLSAyOworCXNiaW5mby0+YXVf
c2lfc3RhdHVzID0gMDsKKwlzYmluZm8tPnNpX2JlbmQgPSAtMTsKKwlzYmluZm8tPnNpX2xhc3Rf
YnJfaWQgPSAwOworCisJc2JpbmZvLT5zaV93YnJfY29weXVwID0gQXVXYnJDb3B5dXBfRGVmOwor
CXNiaW5mby0+c2lfd2JyX2NyZWF0ZSA9IEF1V2JyQ3JlYXRlX0RlZjsKKwlzYmluZm8tPnNpX3di
cl9jb3B5dXBfb3BzID0gYXVfd2JyX2NvcHl1cF9vcHMgKyBBdVdickNvcHl1cF9EZWY7CisJc2Jp
bmZvLT5zaV93YnJfY3JlYXRlX29wcyA9IGF1X3dicl9jcmVhdGVfb3BzICsgQXVXYnJDcmVhdGVf
RGVmOworCisJc2JpbmZvLT5zaV9tbnRmbGFncyA9IEF1T3B0X0RlZjsKKworCXNiaW5mby0+c2lf
eHJlYWQgPSBOVUxMOworCXNiaW5mby0+c2lfeHdyaXRlID0gTlVMTDsKKwlzYmluZm8tPnNpX3hp
YiA9IE5VTEw7CisJbXV0ZXhfaW5pdCgmc2JpbmZvLT5zaV94aWJfbXR4KTsKKwlzYmluZm8tPnNp
X3hpYl9idWYgPSBOVUxMOworCS8qIGxlYXZlIHNpX3hpYl9sYXN0X3BpbmRleCBhbmQgc2lfeGli
X25leHRfYml0ICovCisKKwlhdV9ud3RfaW5pdCgmc2JpbmZvLT5zaV9ub3dhaXQpOworCisJc2Jp
bmZvLT5zaV9yZGNhY2hlID0gQVVGU19SRENBQ0hFX0RFRiAqIEhaOworCXNiaW5mby0+c2lfZGly
d2ggPSBBVUZTX0RJUldIX0RFRjsKKworCXNwaW5fbG9ja19pbml0KCZzYmluZm8tPnNpX3BsaW5r
X2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZzYmluZm8tPnNpX3BsaW5rKTsKKworCWF1X3JvYnJf
bHZtYV9pbml0KHNiaW5mbyk7CisKKwkvKiBsZWF2ZSBvdGhlciBtZW1iZXJzIGZvciBzeXNhdWZz
IGFuZCBzaV9tbnQuICovCisJc2JpbmZvLT5zaV9zYiA9IHNiOworCisJc2ItPnNfZnNfaW5mbyA9
IHNiaW5mbzsKKwkvL3N5c2F1ZnNfc2lfZ2V0KHNiKTsKKworCWF1X2RlYnVnX3NiaW5mb19pbml0
KHNiaW5mbyk7CisJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKworIG91dF9icjoKKwlrZnJlZShz
YmluZm8tPnNpX2JyYW5jaCk7Cisgb3V0X3NiaW5mbzoKKwlrZnJlZShzYmluZm8pOworIG91dDoK
KwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAq
LworCitzdHJ1Y3QgYXVfYnJhbmNoICphdV9zYnIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYXVm
c19iaW5kZXhfdCBiaW5kZXgpCit7CisJc3RydWN0IGF1X2JyYW5jaCAqYnI7CisKKwlTaU11c3RB
bnlMb2NrKHNiKTsKKwlBdURlYnVnT24oYmluZGV4IDwgMCB8fCBhdV9zYmVuZChzYikgPCBiaW5k
ZXgpOworCWJyID0gYXVfc2JpKHNiKS0+c2lfYnJhbmNoWzAgKyBiaW5kZXhdOworCUF1RGVidWdP
bighYnIpOworCXJldHVybiBicjsKK30KKworYXVfZ2VuX3QgYXVfc2lnZW5faW5jKHN0cnVjdCBz
dXBlcl9ibG9jayAqc2IpCit7CisJYXVfZ2VuX3QgZ2VuOworCisJU2lNdXN0V3JpdGVMb2NrKHNi
KTsKKwlnZW4gPSArK2F1X3NiaShzYiktPnNpX2dlbmVyYXRpb247CisJYXVfdXBkYXRlX2RpZ2Vu
KHNiLT5zX3Jvb3QpOworCWF1X3VwZGF0ZV9paWdlbihzYi0+c19yb290LT5kX2lub2RlKTsKKwlz
Yi0+c19yb290LT5kX2lub2RlLT5pX3ZlcnNpb24rKzsKKwlyZXR1cm4gZ2VuOworfQorCitpbnQg
YXVfZmluZF9iaW5kZXgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGF1X2JyYW5jaCAq
YnIpCit7CisJYXVmc19iaW5kZXhfdCBiaW5kZXgsIGJlbmQ7CisKKwliZW5kID0gYXVfc2JlbmQo
c2IpOworCWZvciAoYmluZGV4ID0gMDsgYmluZGV4IDw9IGJlbmQ7IGJpbmRleCsrKQorCQlpZiAo
YXVfc2JyKHNiLCBiaW5kZXgpID09IGJyKQorCQkJcmV0dXJuIGJpbmRleDsKKwlyZXR1cm4gLTE7
Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogZGVudHJ5IGFuZCBzdXBlcl9ibG9jayBs
b2NrLiBjYWxsIGF0IGVudHJ5IHBvaW50ICovCit2b2lkIGF1ZnNfcmVhZF9sb2NrKHN0cnVjdCBk
ZW50cnkgKmRlbnRyeSwgaW50IGZsYWdzKQoreworCXNpX3JlYWRfbG9jayhkZW50cnktPmRfc2Is
IGZsYWdzKTsKKwlpZiAoYXVfZnRlc3RfbG9jayhmbGFncywgRFcpKQorCQlkaV93cml0ZV9sb2Nr
X2NoaWxkKGRlbnRyeSk7CisJZWxzZQorCQlkaV9yZWFkX2xvY2tfY2hpbGQoZGVudHJ5LCBmbGFn
cyk7Cit9CisKK3ZvaWQgYXVmc19yZWFkX3VubG9jayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGlu
dCBmbGFncykKK3sKKwlpZiAoYXVfZnRlc3RfbG9jayhmbGFncywgRFcpKQorCQlkaV93cml0ZV91
bmxvY2soZGVudHJ5KTsKKwllbHNlCisJCWRpX3JlYWRfdW5sb2NrKGRlbnRyeSwgZmxhZ3MpOwor
CXNpX3JlYWRfdW5sb2NrKGRlbnRyeS0+ZF9zYik7Cit9CisKK3ZvaWQgYXVmc193cml0ZV9sb2Nr
KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzaV93cml0ZV9sb2NrKGRlbnRyeS0+ZF9zYik7
CisJZGlfd3JpdGVfbG9ja19jaGlsZChkZW50cnkpOworfQorCit2b2lkIGF1ZnNfd3JpdGVfdW5s
b2NrKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlkaV93cml0ZV91bmxvY2soZGVudHJ5KTsK
KwlzaV93cml0ZV91bmxvY2soZGVudHJ5LT5kX3NiKTsKK30KKwordm9pZCBhdWZzX3JlYWRfYW5k
X3dyaXRlX2xvY2syKHN0cnVjdCBkZW50cnkgKmQxLCBzdHJ1Y3QgZGVudHJ5ICpkMiwgaW50IGZs
YWdzKQoreworCUF1RGVidWdPbihkMSA9PSBkMiB8fCBkMS0+ZF9zYiAhPSBkMi0+ZF9zYik7CisJ
c2lfcmVhZF9sb2NrKGQxLT5kX3NiLCBmbGFncyk7CisJZGlfd3JpdGVfbG9jazJfY2hpbGQoZDEs
IGQyLCBhdV9mdGVzdF9sb2NrKGZsYWdzLCBESVIpKTsKK30KKwordm9pZCBhdWZzX3JlYWRfYW5k
X3dyaXRlX3VubG9jazIoc3RydWN0IGRlbnRyeSAqZDEsIHN0cnVjdCBkZW50cnkgKmQyKQorewor
CUF1RGVidWdPbihkMSA9PSBkMiB8fCBkMS0+ZF9zYiAhPSBkMi0+ZF9zYik7CisJZGlfd3JpdGVf
dW5sb2NrMihkMSwgZDIpOworCXNpX3JlYWRfdW5sb2NrKGQxLT5kX3NiKTsKK30KKworLyogLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSAqLworCithdWZzX2JpbmRleF90IGF1X25ld19icl9pZChzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiKQoreworCWF1ZnNfYmluZGV4X3QgYnJfaWQ7CisJc3RydWN0IGF1X3NiaW5mbyAq
c2JpbmZvOworCisJQXVUcmFjZUVudGVyKCk7CisJU2lNdXN0V3JpdGVMb2NrKHNiKTsKKworCXNi
aW5mbyA9IGF1X3NiaShzYik7CisJd2hpbGUgKDEpIHsKKwkJYnJfaWQgPSArK3NiaW5mby0+c2lf
bGFzdF9icl9pZDsKKwkJaWYgKGJyX2lkICYmIGF1X2JyX2luZGV4KHNiLCBicl9pZCkgPCAwKQor
CQkJcmV0dXJuIGJyX2lkOworCX0KK30KKworLy90b2RvOiBkaXJ0eQorLyoKKyAqIHdoZW4geW91
IG1udHB1dCgpIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24sCisgKiB5b3Ug
aGF2ZSB0byBzdG9yZSBpdCB0byB5b3VyIGxvY2FsIHZhci4KKyAqIGllLiBuZXZlciBtbnRwdXQg
c2lfbW50Y2FjaGUgZGlyZWN0bHkuCisgKi8KK3N0cnVjdCB2ZnNtb3VudCAqYXVfbW50Y2FjaGVf
Z2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGF1X3NiaW5mbyAqc2JpbmZv
OworCXN0cnVjdCBtbnRfbmFtZXNwYWNlICpuczsKKwlzdHJ1Y3QgdmZzbW91bnQgKnBvcywgKm1u
dDsKKworCUF1VHJhY2VFbnRlcigpOworCisJc2JpbmZvID0gYXVfc2JpKHNiKTsKKworCXNwaW5f
bG9jaygmc2JpbmZvLT5zaV9tbnRjYWNoZV9sb2NrKTsKKwlpZiAoc2JpbmZvLT5zaV9tbnRjYWNo
ZSkKKwkJZ290byBvdXQ7CisKKwkvKiB2ZnNtb3VudF9sb2NrIGlzIG5vdCBleHBvcnRlZCAqLwor
CS8vcm9vdF9tbnQgPSBjdXJyZW50LT5mcy0+cm9vdC5tbnQ7CisJLyogbm8gZ2V0L3B1dCAqLwor
CUF1RGVidWdPbighY3VycmVudC0+bnNwcm94eSk7CisJbnMgPSBjdXJyZW50LT5uc3Byb3h5LT5t
bnRfbnM7CisJQXVEZWJ1Z09uKCFucyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZucy0+
bGlzdCwgbW50X2xpc3QpCisJCWlmIChwb3MtPm1udF9zYiA9PSBzYikgeworCQkJc2JpbmZvLT5z
aV9tbnRjYWNoZSA9IHBvczsKKwkJCWJyZWFrOworCQl9CisJQXVEZWJ1Z09uKCFzYmluZm8tPnNp
X21udGNhY2hlKTsKKworIG91dDoKKwltbnQgPSBtbnRnZXQoc2JpbmZvLT5zaV9tbnRjYWNoZSk7
CisJc3Bpbl91bmxvY2soJnNiaW5mby0+c2lfbW50Y2FjaGVfbG9jayk7CisJcmV0dXJuIG1udDsK
K30KZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL3N1cGVyLmMg
bGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL3N1cGVyLmMKLS0tIGxpbnV4LTIuNi4yNS40
LXVuaW9uZnMub3JpZy9mcy9hdWZzL3N1cGVyLmMJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAor
KysgbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL3N1cGVyLmMJMjAwOC0wNS0yNSAxMjow
MDo1MyArMDMwMApAQCAtMCwwICsxLDg3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0y
MDA4IEp1bmppcm8gT2thamltYQorICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0
aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAg
MDIxMTAtMTMwMSAgVVNBCisgKi8KKworLyoKKyAqIG1vdW50IGFuZCBzdXBlcl9ibG9jayBvcGVy
YXRpb25zCisgKgorICogJElkOiBzdXBlci5jLHYgMS42IDIwMDgvMDUvMTkgMDE6NTA6MTAgc2Zq
cm8gRXhwICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGlu
dXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUg
PGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CisKKyNpbmNsdWRl
ICJhdWZzLmgiCisKKy8qCisgKiBzdXBlcl9vcGVyYXRpb25zCisgKi8KK3N0YXRpYyBzdHJ1Y3Qg
aW5vZGUgKmF1ZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1
Y3QgYXVmc19pY250bnIgKmM7CisKKwlBdVRyYWNlRW50ZXIoKTsKKworCWMgPSBhdV9jYWNoZV9h
bGxvY19pY250bnIoKTsKKwkvL2lmIChMa3RyQ29uZCkge2F1X2NhY2hlX2ZyZWVfaWNudG5yKGMp
OyBjID0gTlVMTDt9CisJaWYgKGMpIHsKKwkJaW5vZGVfaW5pdF9vbmNlKCZjLT52ZnNfaW5vZGUp
OworCQljLT52ZnNfaW5vZGUuaV92ZXJzaW9uID0gMTsgLy9zaWdlbihzYik7CisJCWMtPmlpbmZv
LmlpX2hpbm9kZSA9IE5VTEw7CisJCXJldHVybiAmYy0+dmZzX2lub2RlOworCX0KKwlyZXR1cm4g
TlVMTDsKK30KKworc3RhdGljIHZvaWQgYXVmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAq
aW5vZGUpCit7CisJTEtUUlRyYWNlKCJpJWx1XG4iLCBpbm9kZS0+aV9pbm8pOworCWF1X2lpbmZv
X2Zpbihpbm9kZSk7CisJYXVfY2FjaGVfZnJlZV9pY250bnIoY29udGFpbmVyX29mKGlub2RlLCBz
dHJ1Y3QgYXVmc19pY250bnIsCisJCQkJCSAgdmZzX2lub2RlKSk7Cit9CisKK3N0cnVjdCBpbm9k
ZSAqYXVfaWdldF9sb2NrZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW5vX3QgaW5vKQorewor
CXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycjsKKworCUxLVFJUcmFjZSgiaSVsdVxuIiwg
aW5vKTsKKworCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIGlubyk7CisJaWYgKHVubGlrZWx5KCFp
bm9kZSkpIHsKKwkJaW5vZGUgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIG91dDsKKwl9CisJ
QXVEZWJ1Z09uKElTX0VSUihpbm9kZSkpOworCWlmICh1bmxpa2VseSghKGlub2RlLT5pX3N0YXRl
ICYgSV9ORVcpKSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBhdV9paW5mb19pbml0KGlub2RlKTsK
KwkvL2lmIChMa3RyQ29uZCkgZXJyID0gLTE7CisJaWYgKCFlcnIpIHsKKwkJaW5vZGUtPmlfdmVy
c2lvbisrOworCQlpbm9kZS0+aV9vcCA9ICZhdWZzX2lvcDsKKwkJaW5vZGUtPmlfZm9wID0gJmF1
ZnNfZmlsZV9mb3A7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmF1ZnNfYW9wOworCQkv
L2lub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmYmRpOworCX0gZWxzZSB7CisJ
CWlnZXRfZmFpbGVkKGlub2RlKTsKKwkJaW5vZGUgPSBFUlJfUFRSKGVycik7CisJfQorCisgb3V0
OgorCS8qIG5ldmVyIHJldHVybiBOVUxMICovCisJQXVEZWJ1Z09uKCFpbm9kZSk7CisJQXVUcmFj
ZUVyclB0cihpbm9kZSk7CisJcmV0dXJuIGlub2RlOworfQorCitzdGF0aWMgaW50IGF1X3Nob3df
YnJzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWlu
dCBlcnI7CisJYXVmc19iaW5kZXhfdCBiaW5kZXgsIGJlbmQ7CisJc3RydWN0IGRlbnRyeSAqcm9v
dDsKKwlzdHJ1Y3QgcGF0aCBwYXRoOworCisJQXVUcmFjZUVudGVyKCk7CisKKwllcnIgPSAwOwor
CXJvb3QgPSBzYi0+c19yb290OworCWJlbmQgPSBhdV9zYmVuZChzYik7CisJZm9yIChiaW5kZXgg
PSAwOyAhZXJyICYmIGJpbmRleCA8PSBiZW5kOyBiaW5kZXgrKykgeworCQlwYXRoLm1udCA9IGF1
X3Nicl9tbnQoc2IsIGJpbmRleCk7CisJCXBhdGguZGVudHJ5ID0gYXVfaF9kcHRyKHJvb3QsIGJp
bmRleCk7CisJCWVyciA9IHNlcV9wYXRoKHNlcSwgJnBhdGgsIGF1X2VzY19jaGFycyk7CisJCWlm
IChlcnIgPiAwKQorCQkJZXJyID0gc2VxX3ByaW50ZgorCQkJCShzZXEsICI9JXMiLAorCQkJCSBh
dV9vcHRzdHJfYnJfcGVybShhdV9zYnJfcGVybShzYiwgYmluZGV4KSkpOworCQlpZiAoIWVyciAm
JiBiaW5kZXggIT0gYmVuZCkKKwkJCWVyciA9IHNlcV9wdXRjKHNlcSwgJzonKTsKKwl9CisKKwlB
dVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYXVfc2hvd193
YnJfY3JlYXRlKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IHYsCisJCQkgICAgICAgc3RydWN0IGF1
X3NiaW5mbyAqc2JpbmZvKQoreworCWNvbnN0IGNoYXIgKnBhdDsKKworCUF1RGVidWdPbih2ID09
IEF1V2JyQ3JlYXRlX0RlZik7CisKKwlzZXFfcHJpbnRmKG0sICIsY3JlYXRlPSIpOworCXBhdCA9
IGF1X29wdHN0cl93YnJfY3JlYXRlKHYpOworCXN3aXRjaCAodikgeworCWNhc2UgQXVXYnJDcmVh
dGVfVERQOgorCWNhc2UgQXVXYnJDcmVhdGVfUlI6CisJY2FzZSBBdVdickNyZWF0ZV9NRlM6CisJ
Y2FzZSBBdVdickNyZWF0ZV9QTUZTOgorCQlzZXFfcHJpbnRmKG0sIHBhdCk7CisJCWJyZWFrOwor
CWNhc2UgQXVXYnJDcmVhdGVfTUZTVjoKKwkJc2VxX3ByaW50ZihtLCAvKnBhdCovIm1mczolbHUi
LAorCQkJICAgc2JpbmZvLT5zaV93YnJfbWZzLm1mc19leHBpcmUgLyBIWik7CisJCWJyZWFrOwor
CWNhc2UgQXVXYnJDcmVhdGVfUE1GU1Y6CisJCXNlcV9wcmludGYobSwgLypwYXQqLyJwbWZzOiVs
dSIsCisJCQkgICBzYmluZm8tPnNpX3dicl9tZnMubWZzX2V4cGlyZSAvIEhaKTsKKwkJYnJlYWs7
CisJY2FzZSBBdVdickNyZWF0ZV9NRlNSUjoKKwkJc2VxX3ByaW50ZihtLCAvKnBhdCovIm1mc3Jy
OiVMdSIsCisJCQkgICBzYmluZm8tPnNpX3dicl9tZnMubWZzcnJfd2F0ZXJtYXJrKTsKKwkJYnJl
YWs7CisJY2FzZSBBdVdickNyZWF0ZV9NRlNSUlY6CisJCXNlcV9wcmludGYobSwgLypwYXQqLyJt
ZnNycjolTHU6JWx1IiwKKwkJCSAgIHNiaW5mby0+c2lfd2JyX21mcy5tZnNycl93YXRlcm1hcmss
CisJCQkgICBzYmluZm8tPnNpX3dicl9tZnMubWZzX2V4cGlyZSAvIEhaKTsKKwkJYnJlYWs7CisJ
fQorfQorCisvKiBzZXFfZmlsZSB3aWxsIHJlLWNhbGwgbWUgaW4gY2FzZSBvZiB0b28gbG9uZyBz
dHJpbmcgKi8KK3N0YXRpYyBpbnQgYXVmc19zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICpt
LCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlpbnQgZXJyLCBuOworCXN0cnVjdCBzdXBlcl9i
bG9jayAqc2I7CisJc3RydWN0IGF1X3NiaW5mbyAqc2JpbmZvOworCXN0cnVjdCBkZW50cnkgKnJv
b3Q7CisJc3RydWN0IGZpbGUgKnhpbm87CisJdW5zaWduZWQgaW50IG1udF9mbGFncywgdjsKKwlz
dHJ1Y3QgcGF0aCBwYXRoOworCisJLy9hdV9kZWJ1Z19vbigpOworCUF1VHJhY2VFbnRlcigpOwor
CisJc2IgPSBtbnQtPm1udF9zYjsKKwlyb290ID0gc2ItPnNfcm9vdDsKKwlpZiAoIXN5c2F1ZnNf
YnJzKQorCQlhdWZzX3JlYWRfbG9jayhyb290LCAhQXVMb2NrX0lSKTsKKwllbHNlCisJCXNpX25v
Zmx1c2hfcmVhZF9sb2NrKHNiKTsKKwlzYmluZm8gPSBhdV9zYmkoc2IpOworCXNlcV9wcmludGYo
bSwgIixzaT0lcCIsIHNiaW5mbyk7CisJbW50X2ZsYWdzID0gYXVfbW50ZmxhZ3Moc2IpOworCWlm
IChhdV9vcHRfdGVzdChtbnRfZmxhZ3MsIFhJTk8pKSB7CisJCXNlcV9wdXRzKG0sICIseGlubz0i
KTsKKwkJeGlubyA9IHNiaW5mby0+c2lfeGliOworCQlwYXRoLm1udCA9IHhpbm8tPmZfdmZzbW50
OworCQlwYXRoLmRlbnRyeSA9IHhpbm8tPmZfZGVudHJ5OworCQllcnIgPSBzZXFfcGF0aChtLCAm
cGF0aCwgYXVfZXNjX2NoYXJzKTsKKwkJaWYgKHVubGlrZWx5KGVyciA8PSAwKSkKKwkJCWdvdG8g
b3V0OworCQllcnIgPSAwOworI2RlZmluZSBEZWxldGVkICJcXDA0MChkZWxldGVkKSIKKwkJbS0+
Y291bnQgLT0gc2l6ZW9mKERlbGV0ZWQpIC0gMTsKKwkJQXVEZWJ1Z09uKG1lbWNtcChtLT5idWYg
KyBtLT5jb3VudCwgRGVsZXRlZCwKKwkJCQkgc2l6ZW9mKERlbGV0ZWQpIC0gMSkpOworI3VuZGVm
IERlbGV0ZWQKKwl9IGVsc2UKKwkJc2VxX3B1dHMobSwgIixub3hpbm8iKTsKKworI2RlZmluZSBB
dUJvb2wobmFtZSwgc3RyKSBkbyB7IFwKKwl2ID0gYXVfb3B0X3Rlc3QobW50X2ZsYWdzLCBuYW1l
KTsgXAorCWlmICh2ICE9IGF1X29wdF90ZXN0KEF1T3B0X0RlZiwgbmFtZSkpIFwKKwkJc2VxX3By
aW50ZihtLCAiLCVzIiAjc3RyLCB2ID8gIiIgOiAibm8iKTsgXAorfSB3aGlsZSAoMCkKKworI2Rl
ZmluZSBBdVN0cihuYW1lLCBzdHIpIGRvIHsgXAorCXYgPSBtbnRfZmxhZ3MgJiBBdU9wdE1hc2tf
IyNuYW1lOyBcCisJaWYgKHYgIT0gKEF1T3B0X0RlZiAmIEF1T3B0TWFza18jI25hbWUpKSBcCisJ
CXNlcV9wcmludGYobSwgIiwiICNzdHIgIj0lcyIsIGF1X29wdHN0cl8jI3N0cih2KSk7IFwKK30g
d2hpbGUgKDApCisKKyNpZmRlZiBDT05GSUdfQVVGU19DT01QQVQKKyNkZWZpbmUgQXVTdHJfQnJP
cHQJImRpcnM9IgorI2Vsc2UKKyNkZWZpbmUgQXVTdHJfQnJPcHQJImJyOiIKKyNlbmRpZgorCisJ
QXVCb29sKFRSVU5DX1hJTk8sIHRydW5jX3hpbm8pOworCUF1Qm9vbChESVJQRVJNMSwgZGlycGVy
bTEpOworCUF1Qm9vbChTSFdILCBzaHdoKTsKKwlBdUJvb2woUExJTkssIHBsaW5rKTsKKwlBdVN0
cihVREJBLCB1ZGJhKTsKKworCXYgPSBzYmluZm8tPnNpX3dicl9jcmVhdGU7CisJaWYgKHYgIT0g
QXVXYnJDcmVhdGVfRGVmKQorCQlhdV9zaG93X3dicl9jcmVhdGUobSwgdiwgc2JpbmZvKTsKKwor
CXYgPSBzYmluZm8tPnNpX3dicl9jb3B5dXA7CisJaWYgKHYgIT0gQXVXYnJDb3B5dXBfRGVmKQor
CQlzZXFfcHJpbnRmKG0sICIsY3B1cD0lcyIsIGF1X29wdHN0cl93YnJfY29weXVwKHYpKTsKKwor
CXYgPSBhdV9vcHRfdGVzdChtbnRfZmxhZ3MsIEFMV0FZU19ESVJPUFEpOworCWlmICh2ICE9IGF1
X29wdF90ZXN0KEF1T3B0X0RlZiwgQUxXQVlTX0RJUk9QUSkpCisJCXNlcV9wcmludGYobSwgIixk
aXJvcHE9JWMiLCB2ID8gJ2EnIDogJ3cnKTsKKwlBdUJvb2woUkVGUk9GLCByZWZyb2YpOworCUF1
Qm9vbChETEdULCBkbGd0KTsKKwlBdUJvb2woV0FSTl9QRVJNLCB3YXJuX3Blcm0pOworCUF1Qm9v
bChWRVJCT1NFLCB2ZXJib3NlKTsKKworCW4gPSBzYmluZm8tPnNpX2RpcndoOworCWlmIChuICE9
IEFVRlNfRElSV0hfREVGKQorCQlzZXFfcHJpbnRmKG0sICIsZGlyd2g9JWQiLCBuKTsKKwluID0g
c2JpbmZvLT5zaV9yZGNhY2hlIC8gSFo7CisJaWYgKG4gIT0gQVVGU19SRENBQ0hFX0RFRikKKwkJ
c2VxX3ByaW50ZihtLCAiLHJkY2FjaGU9JWQiLCBuKTsKKworCUF1U3RyKENPTywgY29vKTsKKwor
IG91dDoKKwlpZiAoIXN5c2F1ZnNfYnJzKSB7CisJCXNlcV9wdXRzKG0sICIsIiBBdVN0cl9Cck9w
dCk7CisJCWF1X3Nob3dfYnJzKG0sIHNiKTsKKwkJYXVmc19yZWFkX3VubG9jayhyb290LCAhQXVM
b2NrX0lSKTsKKwl9IGVsc2UKKwkJc2lfcmVhZF91bmxvY2soc2IpOworCS8vYXVfZGVidWdfb2Zm
KCk7CisJcmV0dXJuIDA7CisKKyN1bmRlZiBBdUJvb2wKKyN1bmRlZiBBdVN0cgorI3VuZGVmIEF1
U3RyX0JyT3B0Cit9CisKK3N0YXRpYyBpbnQgYXVmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVu
dHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCWludCBlcnI7CisKKwlBdVRyYWNlRW50ZXIo
KTsKKworCWF1ZnNfcmVhZF9sb2NrKGRlbnRyeS0+ZF9zYi0+c19yb290LCAwKTsKKwllcnIgPSB2
ZnN1Yl9zdGF0ZnMoYXVfaF9kcHRyKGRlbnRyeS0+ZF9zYi0+c19yb290LCAwKSwgYnVmLAorCQkJ
ICAgISFhdV9vcHRfdGVzdF9kbGd0KGF1X21udGZsYWdzKGRlbnRyeS0+ZF9zYikpKTsKKwkvL2lm
IChMa3RyQ29uZCkgZXJyID0gLTE7CisJYXVmc19yZWFkX3VubG9jayhkZW50cnktPmRfc2ItPnNf
cm9vdCwgMCk7CisJaWYgKCFlcnIpIHsKKwkJYnVmLT5mX3R5cGUgPSBBVUZTX1NVUEVSX01BR0lD
OworCQlidWYtPmZfbmFtZWxlbiAtPSBBVUZTX1dIX1BGWF9MRU47CisJCS8vdG9kbzogc3VwcG9y
dCB1dWlkPworCQltZW1zZXQoJmJ1Zi0+Zl9mc2lkLCAwLCBzaXplb2YoYnVmLT5mX2ZzaWQpKTsK
Kwl9CisJLyogYnVmLT5mX2JzaXplID0gYnVmLT5mX2Jsb2NrcyA9IGJ1Zi0+Zl9iZnJlZSA9IGJ1
Zi0+Zl9iYXZhaWwgPSAtMTsgKi8KKworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOwor
fQorCitzdGF0aWMgdm9pZCBhdV9mc3luY19icihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorewor
I2lmZGVmIENPTkZJR19BVUZTX0ZTWU5DX1NVUEVSX1BBVENICisJYXVmc19iaW5kZXhfdCBiZW5k
LCBiaW5kZXg7CisJaW50IGJycGVybTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmhfc2I7CisKKwlB
dVRyYWNlRW50ZXIoKTsKKworCXNpX3dyaXRlX2xvY2soc2IpOworCWJlbmQgPSBhdV9zYmVuZChz
Yik7CisJZm9yIChiaW5kZXggPSAwOyBiaW5kZXggPCBiZW5kOyBiaW5kZXgrKykgeworCQlicnBl
cm0gPSBhdV9zYnJfcGVybShzYiwgYmluZGV4KTsKKwkJaWYgKGJycGVybSA9PSBBdUJyX1JSIHx8
IGJycGVybSA9PSBBdUJyX1JSV0gpCisJCQljb250aW51ZTsKKwkJaF9zYiA9IGF1X3Nicl9zYihz
YiwgYmluZGV4KTsKKwkJaWYgKGJkZXZfcmVhZF9vbmx5KGhfc2ItPnNfYmRldikpCisJCQljb250
aW51ZTsKKworCQlsb2NrZGVwX29mZigpOworCQlkb3duX3dyaXRlKCZoX3NiLT5zX3Vtb3VudCk7
CisJCXNocmlua19kY2FjaGVfc2IoaF9zYik7CisJCWZzeW5jX3N1cGVyKGhfc2IpOworCQl1cF93
cml0ZSgmaF9zYi0+c191bW91bnQpOworCQlsb2NrZGVwX29uKCk7CisJfQorCXNpX3dyaXRlX3Vu
bG9jayhzYik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgYXVmc191bW91bnRfYmVnaW4oc3Ry
dWN0IHZmc21vdW50ICptbnQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi
ID0gbW50LT5tbnRfc2I7CisJc3RydWN0IGF1X3NiaW5mbyAqc2JpbmZvOworCisJQXVUcmFjZUVu
dGVyKCk7CisJLy90b2RvOiBkb250IHRydXN0IEJLTC4KKwlBdURlYnVnT24oIWtlcm5lbF9sb2Nr
ZWQoKSk7CisKKwlzYmluZm8gPSBhdV9zYmkoc2IpOworCWlmICh1bmxpa2VseSghc2JpbmZvKSkK
KwkJcmV0dXJuOworCisJYXVfZnN5bmNfYnIoc2IpOworCisJc2lfd3JpdGVfbG9jayhzYik7CisJ
aWYgKGF1X29wdF90ZXN0KGF1X21udGZsYWdzKHNiKSwgUExJTkspKQorCQlhdV9wbGlua19wdXQo
c2IpOworCXNwaW5fbG9jaygmc2JpbmZvLT5zaV9tbnRjYWNoZV9sb2NrKTsKKwlzYmluZm8tPnNp
X21udGNhY2hlID0gTlVMTDsKKwlzcGluX3VubG9jaygmc2JpbmZvLT5zaV9tbnRjYWNoZV9sb2Nr
KTsKKwlzaV93cml0ZV91bmxvY2soc2IpOworfQorCisvKiBmaW5hbCBhY3Rpb25zIHdoZW4gdW5t
b3VudGluZyBhIGZpbGUgc3lzdGVtICovCitzdGF0aWMgdm9pZCBhdWZzX3B1dF9zdXBlcihzdHJ1
Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBhdV9zYmluZm8gKnNiaW5mbzsKKworCUF1
VHJhY2VFbnRlcigpOworCisJc2JpbmZvID0gYXVfc2JpKHNiKTsKKwlpZiAodW5saWtlbHkoIXNi
aW5mbykpCisJCXJldHVybjsKKwlrb2JqZWN0X3B1dCgmc2JpbmZvLT5zaV9rb2JqKTsKK30KKwor
LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcmVmcmVzaCBkZW50cnkgYW5kIGlub2RlIGF0
IHJlbW91bnQgdGltZS4KKyAqLworc3RhdGljIGludCBkb19yZWZyZXNoKHN0cnVjdCBkZW50cnkg
KmRlbnRyeSwgbW9kZV90IHR5cGUsCisJCSAgICAgIHVuc2lnbmVkIGludCBkaXJfZmxhZ3MpCit7
CisJaW50IGVycjsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJc3RydWN0IGlub2RlICppbm9k
ZTsKKworCUxLVFJUcmFjZSgiJS4qcywgMCVvXG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgdHlwZSk7
CisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJQXVEZWJ1Z09uKCFpbm9kZSk7CisKKwlkaV93
cml0ZV9sb2NrX2NoaWxkKGRlbnRyeSk7CisJcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsK
KwlkaV9yZWFkX2xvY2tfcGFyZW50KHBhcmVudCwgQXVMb2NrX0lSKTsKKwkvKiByZXR1cm5zIGEg
bnVtYmVyIG9mIHBvc2l0aXZlIGRlbnRyaWVzICovCisJZXJyID0gYXVfcmVmcmVzaF9oZGVudHJ5
KGRlbnRyeSwgdHlwZSk7CisJLy9lcnIgPSAtMTsKKwlpZiAoZXJyID49IDApIHsKKwkJZXJyID0g
YXVfcmVmcmVzaF9oaW5vZGUoaW5vZGUsIGRlbnRyeSk7CisJCS8vZXJyID0gLTE7CisJCWlmICgh
ZXJyICYmIHR5cGUgPT0gU19JRkRJUikKKwkJCWF1X3Jlc2V0X2hpbm90aWZ5KGlub2RlLCBkaXJf
ZmxhZ3MpOworCX0KKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJQXVFcnIoInVucmVjb3ZlcmFibGUg
ZXJyb3IgJWQsICUuKnNcbiIsIGVyciwgQXVETE5QYWlyKGRlbnRyeSkpOworCWRpX3JlYWRfdW5s
b2NrKHBhcmVudCwgQXVMb2NrX0lSKTsKKwlkcHV0KHBhcmVudCk7CisJZGlfd3JpdGVfdW5sb2Nr
KGRlbnRyeSk7CisKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGlj
IGludCB0ZXN0X2RpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHZvaWQgKmFyZykKK3sKKwlyZXR1
cm4gU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSk7Cit9CisKKy8vdG9kbzogbWVyZ2Ug
d2l0aCByZWZyZXNoX25vbmRpcigpCitzdGF0aWMgaW50IHJlZnJlc2hfZGlyKHN0cnVjdCBkZW50
cnkgKnJvb3QsIGF1X2dlbl90IHNnZW4pCit7CisJaW50IGVyciwgaSwgaiwgbmRlbnRyeSwgZTsK
Kwljb25zdCB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBhdV9oaV9mbGFncyhyb290LT5kX2lub2RlLCAv
KmlzZGlyKi8xKTsKKwlzdHJ1Y3QgYXVfZGNzdWJfcGFnZXMgZHBhZ2VzOworCXN0cnVjdCBhdV9k
cGFnZSAqZHBhZ2U7CisJc3RydWN0IGRlbnRyeSAqKmRlbnRyaWVzOworCXN0cnVjdCBpbm9kZSAq
aW5vZGU7CisKKwlMS1RSVHJhY2UoInNnZW4gJWRcbiIsIHNnZW4pOworCVNpTXVzdFdyaXRlTG9j
ayhyb290LT5kX3NiKTsKKwkvL3RvZG86IGRvbnQgdHJ1c3QgQktMLgorCUF1RGVidWdPbihhdV9k
aWdlbihyb290KSAhPSBzZ2VuIHx8ICFrZXJuZWxfbG9ja2VkKCkpOworCisJZXJyID0gMDsKKwls
aXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmcm9vdC0+ZF9zYi0+c19pbm9kZXMsIGlfc2JfbGlz
dCkKKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgYXVfaWlnZW4oaW5vZGUpICE9IHNn
ZW4pIHsKKwkJCWlpX3dyaXRlX2xvY2tfY2hpbGQoaW5vZGUpOworCQkJZSA9IGF1X3JlZnJlc2hf
aGlub2RlX3NlbGYoaW5vZGUpOworCQkJLy9lID0gLTE7CisJCQlpaV93cml0ZV91bmxvY2soaW5v
ZGUpOworCQkJaWYgKHVubGlrZWx5KGUpKSB7CisJCQkJTEtUUlRyYWNlKCJlICVkLCBpJWx1XG4i
LCBlLCBpbm9kZS0+aV9pbm8pOworCQkJCWlmICghZXJyKQorCQkJCQllcnIgPSBlOworCQkJCS8q
IGdvIG9uIGV2ZW4gaWYgZXJyICovCisJCQl9CisJCX0KKworCWUgPSBhdV9kcGFnZXNfaW5pdCgm
ZHBhZ2VzLCBHRlBfVEVNUE9SQVJZKTsKKwlpZiAodW5saWtlbHkoZSkpIHsKKwkJaWYgKCFlcnIp
CisJCQllcnIgPSBlOworCQlnb3RvIG91dDsKKwl9CisJZSA9IGF1X2Rjc3ViX3BhZ2VzKCZkcGFn
ZXMsIHJvb3QsIHRlc3RfZGlyLCBOVUxMKTsKKwlpZiAodW5saWtlbHkoZSkpIHsKKwkJaWYgKCFl
cnIpCisJCQllcnIgPSBlOworCQlnb3RvIG91dF9kcGFnZXM7CisJfQorCisJZm9yIChpID0gMDsg
IWUgJiYgaSA8IGRwYWdlcy5uZHBhZ2U7IGkrKykgeworCQlkcGFnZSA9IGRwYWdlcy5kcGFnZXMg
KyBpOworCQlkZW50cmllcyA9IGRwYWdlLT5kZW50cmllczsKKwkJbmRlbnRyeSA9IGRwYWdlLT5u
ZGVudHJ5OworCQlmb3IgKGogPSAwOyAhZSAmJiBqIDwgbmRlbnRyeTsgaisrKSB7CisJCQlzdHJ1
Y3QgZGVudHJ5ICpkOworCQkJZCA9IGRlbnRyaWVzW2pdOworI2lmZGVmIENPTkZJR19BVUZTX0RF
QlVHCisJCQl7CisJCQkJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCQkJCXBhcmVudCA9IGRnZXRf
cGFyZW50KGQpOworCQkJCUF1RGVidWdPbighU19JU0RJUihkLT5kX2lub2RlLT5pX21vZGUpCisJ
CQkJCSAgfHwgSVNfUk9PVChkKQorCQkJCQkgIHx8IGF1X2RpZ2VuKHBhcmVudCkgIT0gc2dlbik7
CisJCQkJZHB1dChwYXJlbnQpOworCQkJfQorI2VuZGlmCisJCQlpZiAoYXVfZGlnZW4oZCkgIT0g
c2dlbikgeworCQkJCWUgPSBkb19yZWZyZXNoKGQsIFNfSUZESVIsIGZsYWdzKTsKKwkJCQkvL2Ug
PSAtMTsKKwkJCQlpZiAodW5saWtlbHkoZSAmJiAhZXJyKSkKKwkJCQkJZXJyID0gZTsKKwkJCQkv
KiBicmVhayBvbiBlcnIgKi8KKwkJCX0KKwkJfQorCX0KKworIG91dF9kcGFnZXM6CisJYXVfZHBh
Z2VzX2ZyZWUoJmRwYWdlcyk7Cisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJy
OworfQorCitzdGF0aWMgaW50IHRlc3Rfbm9uZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdm9p
ZCAqYXJnKQoreworCXJldHVybiAhU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSk7Cit9
CisKK3N0YXRpYyBpbnQgcmVmcmVzaF9ub25kaXIoc3RydWN0IGRlbnRyeSAqcm9vdCwgYXVfZ2Vu
X3Qgc2dlbiwgaW50IGRvX2RlbnRyeSkKK3sKKwlpbnQgZXJyLCBpLCBqLCBuZGVudHJ5LCBlOwor
CXN0cnVjdCBhdV9kY3N1Yl9wYWdlcyBkcGFnZXM7CisJc3RydWN0IGF1X2RwYWdlICpkcGFnZTsK
KwlzdHJ1Y3QgZGVudHJ5ICoqZGVudHJpZXM7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCUxL
VFJUcmFjZSgic2dlbiAlZFxuIiwgc2dlbik7CisJU2lNdXN0V3JpdGVMb2NrKHJvb3QtPmRfc2Ip
OworCS8vdG9kbzogZG9udCB0cnVzdCBCS0wuCisJQXVEZWJ1Z09uKGF1X2RpZ2VuKHJvb3QpICE9
IHNnZW4gfHwgIWtlcm5lbF9sb2NrZWQoKSk7CisKKwllcnIgPSAwOworCWxpc3RfZm9yX2VhY2hf
ZW50cnkoaW5vZGUsICZyb290LT5kX3NiLT5zX2lub2RlcywgaV9zYl9saXN0KQorCQlpZiAoIVNf
SVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgYXVfaWlnZW4oaW5vZGUpICE9IHNnZW4pIHsKKwkJCWlp
X3dyaXRlX2xvY2tfY2hpbGQoaW5vZGUpOworCQkJZSA9IGF1X3JlZnJlc2hfaGlub2RlX3NlbGYo
aW5vZGUpOworCQkJLy9lID0gLTE7CisJCQlpaV93cml0ZV91bmxvY2soaW5vZGUpOworCQkJaWYg
KHVubGlrZWx5KGUpKSB7CisJCQkJTEtUUlRyYWNlKCJlICVkLCBpJWx1XG4iLCBlLCBpbm9kZS0+
aV9pbm8pOworCQkJCWlmICghZXJyKQorCQkJCQllcnIgPSBlOworCQkJCS8qIGdvIG9uIGV2ZW4g
aWYgZXJyICovCisJCQl9CisJCX0KKworCWlmICghZG9fZGVudHJ5KQorCQlnb3RvIG91dDsKKwor
CWUgPSBhdV9kcGFnZXNfaW5pdCgmZHBhZ2VzLCBHRlBfVEVNUE9SQVJZKTsKKwlpZiAodW5saWtl
bHkoZSkpIHsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBlOworCQlnb3RvIG91dDsKKwl9CisJZSA9
IGF1X2Rjc3ViX3BhZ2VzKCZkcGFnZXMsIHJvb3QsIHRlc3Rfbm9uZGlyLCBOVUxMKTsKKwlpZiAo
dW5saWtlbHkoZSkpIHsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBlOworCQlnb3RvIG91dF9kcGFn
ZXM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRwYWdlcy5uZHBhZ2U7IGkrKykgeworCQlkcGFn
ZSA9IGRwYWdlcy5kcGFnZXMgKyBpOworCQlkZW50cmllcyA9IGRwYWdlLT5kZW50cmllczsKKwkJ
bmRlbnRyeSA9IGRwYWdlLT5uZGVudHJ5OworCQlmb3IgKGogPSAwOyBqIDwgbmRlbnRyeTsgaisr
KSB7CisJCQlzdHJ1Y3QgZGVudHJ5ICpkOworCQkJZCA9IGRlbnRyaWVzW2pdOworI2lmZGVmIENP
TkZJR19BVUZTX0RFQlVHCisJCQl7CisJCQkJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCQkJCXBh
cmVudCA9IGRnZXRfcGFyZW50KGQpOworCQkJCUF1RGVidWdPbihTX0lTRElSKGQtPmRfaW5vZGUt
PmlfbW9kZSkKKwkJCQkJICB8fCBhdV9kaWdlbihwYXJlbnQpICE9IHNnZW4pOworCQkJCWRwdXQo
cGFyZW50KTsKKwkJCX0KKyNlbmRpZgorCQkJaW5vZGUgPSBkLT5kX2lub2RlOworCQkJaWYgKGlu
b2RlICYmIGF1X2RpZ2VuKGQpICE9IHNnZW4pIHsKKwkJCQllID0gZG9fcmVmcmVzaChkLCBpbm9k
ZS0+aV9tb2RlICYgU19JRk1ULCAwKTsKKwkJCQkvL2UgPSAtMTsKKwkJCQlpZiAodW5saWtlbHko
ZSAmJiAhZXJyKSkKKwkJCQkJZXJyID0gZTsKKwkJCQkvKiBnbyBvbiBldmVuIGVyciAqLworCQkJ
fQorCQl9CisJfQorCisgb3V0X2RwYWdlczoKKwlhdV9kcGFnZXNfZnJlZSgmZHBhZ2VzKTsKKyBv
dXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIHN0b3AgZXh0cmEg
aW50ZXJwcmV0YXRpb24gb2YgZXJybm8gaW4gbW91bnQoOCksIGFuZCBzdHJhbmdlIGVycm9yIG1l
c3NhZ2VzICovCitzdGF0aWMgaW50IGN2dF9lcnIoaW50IGVycikKK3sKKwlBdVRyYWNlRXJyKGVy
cik7CisKKwlzd2l0Y2ggKGVycikgeworCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FTk9URElSOgor
CWNhc2UgLUVFWElTVDoKKwljYXNlIC1FSU86CisJCWVyciA9IC1FSU5WQUw7CisJfQorCXJldHVy
biBlcnI7Cit9CisKKy8qIHByb3RlY3RlZCBieSBzX3Vtb3VudCAqLworc3RhdGljIGludCBhdWZz
X3JlbW91bnRfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0
YSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisJc3RydWN0IGlub2RlICpp
bm9kZTsKKwlzdHJ1Y3QgYXVfb3B0cyBvcHRzOworCXVuc2lnbmVkIGludCBkbGd0OworCXN0cnVj
dCBhdV9zYmluZm8gKnNiaW5mbzsKKworCS8vYXVfZGVidWdfb24oKTsKKwlMS1RSVHJhY2UoImZs
YWdzIDB4JXgsIGRhdGEgJXMsIGxlbiAlbHVcbiIsCisJCSAgKmZsYWdzLCBkYXRhID8gZGF0YSA6
ICJOVUxMIiwKKwkJICAodW5zaWduZWQgbG9uZykoZGF0YSA/IHN0cmxlbihkYXRhKSA6IDApKTsK
KworCWF1X2ZzeW5jX2JyKHNiKTsKKwllcnIgPSAwOworCWlmICghZGF0YSB8fCAhKmRhdGEpCisJ
CWdvdG8gb3V0OyAvKiBzdWNjZXNzICovCisKKwllcnIgPSAtRU5PTUVNOworCW1lbXNldCgmb3B0
cywgMCwgc2l6ZW9mKG9wdHMpKTsKKwlvcHRzLm9wdCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdl
KEdGUF9URU1QT1JBUlkpOworCS8vaWYgKExrdHJDb25kKSB7ZnJlZV9wYWdlKCh1bnNpZ25lZCBs
b25nKW9wdHMub3B0KTsgb3B0cy5vcHQgPSBOVUxMO30KKwlpZiAodW5saWtlbHkoIW9wdHMub3B0
KSkKKwkJZ290byBvdXQ7CisJb3B0cy5tYXhfb3B0ID0gUEFHRV9TSVpFIC8gc2l6ZW9mKCpvcHRz
Lm9wdCk7CisJb3B0cy5mbGFncyA9IEF1T3B0c19SRU1PVU5UOworCisJLyogcGFyc2UgaXQgYmVm
b3JlIGF1ZnMgbG9jayAqLworCWVyciA9IGF1X29wdHNfcGFyc2Uoc2IsICpmbGFncywgZGF0YSwg
Jm9wdHMpOworCS8vaWYgKExrdHJDb25kKSB7YXVfZnJlZV9vcHRzKCZvcHRzKTsgZXJyID0gLTE7
fQorCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIG91dF9vcHRzOworCisJc2JpbmZvID0gYXVf
c2JpKHNiKTsKKwlyb290ID0gc2ItPnNfcm9vdDsKKwlpbm9kZSA9IHJvb3QtPmRfaW5vZGU7CisJ
bXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCWF1ZnNfd3JpdGVfbG9jayhyb290KTsKKwor
CS8vRGJnU2xlZXAoMyk7CisKKwkvKiBhdV9kb19vcHRzKCkgbWF5IHJldHVybiBhbiBlcnJvciAq
LworCWVyciA9IGF1X29wdHNfcmVtb3VudChzYiwgJm9wdHMpOworCS8vaWYgKExrdHJDb25kKSBl
cnIgPSAtMTsKKwlhdV9vcHRzX2ZyZWUoJm9wdHMpOworCisJaWYgKGF1X2Z0ZXN0X29wdHMob3B0
cy5mbGFncywgUkVGUkVTSF9ESVIpCisJICAgIHx8IGF1X2Z0ZXN0X29wdHMob3B0cy5mbGFncywg
UkVGUkVTSF9OT05ESVIpKSB7CisJCWludCByZXJyOworCQlhdV9nZW5fdCBzaWdlbjsKKworCQlk
bGd0ID0gISFhdV9vcHRfdGVzdF9kbGd0KHNiaW5mby0+c2lfbW50ZmxhZ3MpOworCQlhdV9vcHRf
Y2xyKHNiaW5mby0+c2lfbW50ZmxhZ3MsIERMR1QpOworCQlhdV9zaWdlbl9pbmMoc2IpOworCQlh
dV9yZXNldF9oaW5vdGlmeShpbm9kZSwgYXVfaGlfZmxhZ3MoaW5vZGUsIC8qaXNkaXIqLzEpKTsK
KwkJc2lnZW4gPSBhdV9zaWdlbihzYik7CisJCWF1X2ZjbHJfc2koc2JpbmZvLCBGQUlMRURfUkVG
UkVTSF9ESVJTKTsKKworCQlEaU11c3ROb1dhaXRlcnMocm9vdCk7CisJCUlpTXVzdE5vV2FpdGVy
cyhyb290LT5kX2lub2RlKTsKKwkJZGlfd3JpdGVfdW5sb2NrKHJvb3QpOworCisJCXJlcnIgPSBy
ZWZyZXNoX2Rpcihyb290LCBzaWdlbik7CisJCWlmICh1bmxpa2VseShyZXJyKSkgeworCQkJYXVf
ZnNldF9zaShzYmluZm8sIEZBSUxFRF9SRUZSRVNIX0RJUlMpOworCQkJQXVXYXJuKCJSZWZyZXNo
aW5nIGRpcmVjdG9yaWVzIGZhaWxlZCwgaWdub3JlcyAoJWQpXG4iLAorCQkJICAgICAgIHJlcnIp
OworCQl9CisKKwkJaWYgKHVubGlrZWx5KGF1X2Z0ZXN0X29wdHMob3B0cy5mbGFncywgUkVGUkVT
SF9OT05ESVIpKSkgeworCQkJLy9hdV9kZWJ1Z19vbigpOworCQkJcmVyciA9IHJlZnJlc2hfbm9u
ZGlyKHJvb3QsIHNpZ2VuLCAhcmVycik7CisJCQlpZiAodW5saWtlbHkocmVycikpCisJCQkJQXVX
YXJuKCJSZWZyZXNoaW5nIG5vbi1kaXJlY3RvcmllcyBmYWlsZWQsIgorCQkJCSAgICAgICAiIGln
bm9yZXMgKCVkKVxuIiwgcmVycik7CisJCQkvL2F1X2RlYnVnX29mZigpOworCQl9CisKKwkJLyog
YXVmc193cml0ZV9sb2NrKCkgY2FsbHMgLi4uX2NoaWxkKCkgKi8KKwkJZGlfd3JpdGVfbG9ja19j
aGlsZChyb290KTsKKworCQlhdV9jcHVwX2F0dHJfYWxsKGlub2RlKTsKKwkJaWYgKHVubGlrZWx5
KGRsZ3QpKQorCQkJYXVfb3B0X3NldChzYmluZm8tPnNpX21udGZsYWdzLCBETEdUKTsKKwl9CisK
KwlhdWZzX3dyaXRlX3VubG9jayhyb290KTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4
KTsKKworIG91dF9vcHRzOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylvcHRzLm9wdCk7Cisg
b3V0OgorCWVyciA9IGN2dF9lcnIoZXJyKTsKKwlBdVRyYWNlRXJyKGVycik7CisJLy9hdV9kZWJ1
Z19vZmYoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlv
bnMgYXVmc19zb3AgPSB7CisJLmFsbG9jX2lub2RlCT0gYXVmc19hbGxvY19pbm9kZSwKKwkuZGVz
dHJveV9pbm9kZQk9IGF1ZnNfZGVzdHJveV9pbm9kZSwKKwkvLy5kaXJ0eV9pbm9kZQk9IGF1ZnNf
ZGlydHlfaW5vZGUsCisJLy8ud3JpdGVfaW5vZGUJPSBhdWZzX3dyaXRlX2lub2RlLAorCS8vdm9p
ZCAoKnB1dF9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKKwkuZHJvcF9pbm9kZQk9IGdlbmVyaWNf
ZGVsZXRlX2lub2RlLAorCS8vLmRlbGV0ZV9pbm9kZQk9IGF1ZnNfZGVsZXRlX2lub2RlLAorCS8v
LmNsZWFyX2lub2RlCT0gYXVmc19jbGVhcl9pbm9kZSwKKworCS5zaG93X29wdGlvbnMJPSBhdWZz
X3Nob3dfb3B0aW9ucywKKwkuc3RhdGZzCQk9IGF1ZnNfc3RhdGZzLAorCisJLnB1dF9zdXBlcgk9
IGF1ZnNfcHV0X3N1cGVyLAorCS8vdm9pZCAoKndyaXRlX3N1cGVyKSAoc3RydWN0IHN1cGVyX2Js
b2NrICopOworCS8vaW50ICgqc3luY19mcykoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdh
aXQpOworCS8vdm9pZCAoKndyaXRlX3N1cGVyX2xvY2tmcykgKHN0cnVjdCBzdXBlcl9ibG9jayAq
KTsKKwkvL3ZvaWQgKCp1bmxvY2tmcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKwkucmVtb3Vu
dF9mcwk9IGF1ZnNfcmVtb3VudF9mcywKKwkvKiBkZXBlbmRzIHVwb24gdW1vdW50IGZsYWdzLiBh
bHNvIHVzZSBwdXRfc3VwZXIoKSAoPCAyLjYuMTgpICovCisJLnVtb3VudF9iZWdpbgk9IGF1ZnNf
dW1vdW50X2JlZ2luCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYWxs
b2Nfcm9vdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWludCBlcnI7CisJc3RydWN0IGlu
b2RlICppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290OworCisJQXVUcmFjZUVudGVyKCk7CisK
KwllcnIgPSAtRU5PTUVNOworCWlub2RlID0gYXVfaWdldF9sb2NrZWQoc2IsIEFVRlNfUk9PVF9J
Tk8pOworCS8vaWYgKExrdHJDb25kKSB7aXB1dChpbm9kZSk7IGlub2RlID0gTlVMTDt9CisJZXJy
ID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCWdvdG8gb3V0OworCXVu
bG9ja19uZXdfaW5vZGUoaW5vZGUpOworCWlub2RlLT5pX21vZGUgPSBTX0lGRElSOworCXJvb3Qg
PSBkX2FsbG9jX3Jvb3QoaW5vZGUpOworCS8vaWYgKExrdHJDb25kKSB7aWdyYWIoaW5vZGUpOyBk
cHV0KHJvb3QpOyByb290ID0gTlVMTDt9CisJaWYgKHVubGlrZWx5KCFyb290KSkKKwkJZ290byBv
dXRfaXB1dDsKKwllcnIgPSBQVFJfRVJSKHJvb3QpOworCWlmIChJU19FUlIocm9vdCkpCisJCWdv
dG8gb3V0X2lwdXQ7CisKKwllcnIgPSBhdV9hbGxvY19kaW5mbyhyb290KTsKKwkvL2lmIChMa3Ry
Q29uZCl7YXVfcndfd3JpdGVfdW5sb2NrKCZhdV9kaShyb290KS0+ZGlfcndzZW0pO2Vycj0tMTt9
CisJaWYgKCFlcnIpIHsKKwkJc2ItPnNfcm9vdCA9IHJvb3Q7CisJCXJldHVybiAwOyAvKiBzdWNj
ZXNzICovCisJfQorCWRwdXQocm9vdCk7CisJZ290byBvdXQ7IC8qIGRvIG5vdCBpcHV0ICovCisK
KyBvdXRfaXB1dDoKKwlpZ2V0X2ZhaWxlZChpbm9kZSk7CisJaXB1dChpbm9kZSk7Cisgb3V0Ogor
CUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworCit9CisKK3N0YXRpYyBpbnQgYXVmc19m
aWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnJhd19kYXRhLCBpbnQgc2ls
ZW50KQoreworCWludCBlcnI7CisJc3RydWN0IGRlbnRyeSAqcm9vdDsKKwlzdHJ1Y3QgaW5vZGUg
Kmlub2RlOworCXN0cnVjdCBhdV9vcHRzIG9wdHM7CisJY2hhciAqYXJnID0gcmF3X2RhdGE7CisK
KwkvL2F1X2RlYnVnX29uKCk7CisJaWYgKHVubGlrZWx5KCFhcmcgfHwgISphcmcpKSB7CisJCWVy
ciA9IC1FSU5WQUw7CisJCUF1RXJyKCJubyBhcmdcbiIpOworCQlnb3RvIG91dDsKKwl9CisJTEtU
UlRyYWNlKCIlcywgc2lsZW50ICVkXG4iLCBhcmcsIHNpbGVudCk7CisKKwllcnIgPSAtRU5PTUVN
OworCW1lbXNldCgmb3B0cywgMCwgc2l6ZW9mKG9wdHMpKTsKKwlvcHRzLm9wdCA9ICh2b2lkICop
X19nZXRfZnJlZV9wYWdlKEdGUF9URU1QT1JBUlkpOworCS8vaWYgKExrdHJDb25kKSB7ZnJlZV9w
YWdlKCh1bnNpZ25lZCBsb25nKW9wdHMub3B0KTsgb3B0cy5vcHQgPSBOVUxMO30KKwlpZiAodW5s
aWtlbHkoIW9wdHMub3B0KSkKKwkJZ290byBvdXQ7CisJb3B0cy5tYXhfb3B0ID0gUEFHRV9TSVpF
IC8gc2l6ZW9mKCpvcHRzLm9wdCk7CisKKwllcnIgPSBhdV9zaV9hbGxvYyhzYik7CisJLy9pZiAo
TGt0ckNvbmQpIHtzaV93cml0ZV91bmxvY2soc2IpO2ZyZWVfc2JpbmZvKHNiKTtlcnI9LTE7fQor
CWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIG91dF9vcHRzOworCVNpTXVzdFdyaXRlTG9jayhz
Yik7CisJLyogYWxsIHRpbWVzdGFtcHMgYWx3YXlzIGZvbGxvdyB0aGUgb25lcyBvbiB0aGUgYnJh
bmNoICovCisJc2ItPnNfZmxhZ3MgfD0gTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJc2It
PnNfb3AgPSAmYXVmc19zb3A7CisJc2ItPnNfbWFnaWMgPSBBVUZTX1NVUEVSX01BR0lDOworCWF1
X2luaXRfZXhwb3J0X29wKHNiKTsKKworCWVyciA9IGFsbG9jX3Jvb3Qoc2IpOworCS8vaWYgKExr
dHJDb25kKSB7YXVfcndfd3JpdGVfdW5sb2NrKCZhdV9kaShzYi0+c19yb290KS0+ZGlfcndzZW0p
OworCS8vZHB1dChzYi0+c19yb290KTtzYi0+c19yb290PU5VTEw7ZXJyPS0xO30KKwlpZiAodW5s
aWtlbHkoZXJyKSkgeworCQlBdURlYnVnT24oc2ItPnNfcm9vdCk7CisJCXNpX3dyaXRlX3VubG9j
ayhzYik7CisJCWdvdG8gb3V0X2luZm87CisJfQorCXJvb3QgPSBzYi0+c19yb290OworCURpTXVz
dFdyaXRlTG9jayhyb290KTsKKwlpbm9kZSA9IHJvb3QtPmRfaW5vZGU7CisJaW5vZGUtPmlfbmxp
bmsgPSAyOworCisJLyoKKwkgKiBhY3R1YWxseSB3ZSBjYW4gcGFyc2Ugb3B0aW9ucyByZWdhcmRs
ZXNzIGF1ZnMgbG9jayBoZXJlLgorCSAqIGJ1dCBhdCByZW1vdW50IHRpbWUsIHBhcnNpbmcgbXVz
dCBiZSBkb25lIGJlZm9yZSBhdWZzIGxvY2suCisJICogc28gd2UgZm9sbG93IHRoZSBzYW1lIHJ1
bGUuCisJICovCisJaWlfd3JpdGVfbG9ja19wYXJlbnQoaW5vZGUpOworCWF1ZnNfd3JpdGVfdW5s
b2NrKHJvb3QpOworCWVyciA9IGF1X29wdHNfcGFyc2Uoc2IsIHNiLT5zX2ZsYWdzLCBhcmcsICZv
cHRzKTsKKwkvL2lmIChMa3RyQ29uZCkge2F1X29wdHNfZnJlZSgmb3B0cyk7IGVyciA9IC0xO30K
KwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXRfcm9vdDsKKworCS8qIGxvY2sgdmZzX2lu
b2RlIGZpcnN0LCB0aGVuIGF1ZnMuICovCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwor
CWlub2RlLT5pX29wID0gJmF1ZnNfZGlyX2lvcDsKKwlpbm9kZS0+aV9mb3AgPSAmYXVmc19kaXJf
Zm9wOworCWF1ZnNfd3JpdGVfbG9jayhyb290KTsKKworCXNiLT5zX21heGJ5dGVzID0gMDsKKwll
cnIgPSBhdV9vcHRzX21vdW50KHNiLCAmb3B0cyk7CisJLy9pZiAoTGt0ckNvbmQpIGVyciA9IC0x
OworCWF1X29wdHNfZnJlZSgmb3B0cyk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0
X3VubG9jazsKKwlBdURlYnVnT24oIXNiLT5zX21heGJ5dGVzKTsKKworCS8vQXVEYmdEZW50cnko
cm9vdCk7CisJYXVmc193cml0ZV91bmxvY2socm9vdCk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+
aV9tdXRleCk7CisJLy9BdURiZ1NiKHNiKTsKKwlnb3RvIG91dF9vcHRzOyAvKiBzdWNjZXNzICov
CisKKyBvdXRfdW5sb2NrOgorCWF1ZnNfd3JpdGVfdW5sb2NrKHJvb3QpOworCW11dGV4X3VubG9j
aygmaW5vZGUtPmlfbXV0ZXgpOworIG91dF9yb290OgorCWRwdXQocm9vdCk7CisJc2ItPnNfcm9v
dCA9IE5VTEw7Cisgb3V0X2luZm86CisJYXVfZnNldF9zaShhdV9zYmkoc2IpLCBGQUlMRURfSU5J
VCk7CisJa29iamVjdF9wdXQoJmF1X3NiaShzYiktPnNpX2tvYmopOworCXNiLT5zX2ZzX2luZm8g
PSBOVUxMOworIG91dF9vcHRzOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylvcHRzLm9wdCk7
Cisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsKKwllcnIgPSBjdnRfZXJyKGVycik7CisJQXVUcmFj
ZUVycihlcnIpOworCS8vYXVfZGVidWdfb2ZmKCk7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGF1ZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3Rl
bV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCisJCSAgICAgICBjb25zdCBjaGFyICpkZXZfbmFt
ZSwgdm9pZCAqcmF3X2RhdGEsCisJCSAgICAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlp
bnQgZXJyOworCisJLyogYWxsIHRpbWVzdGFtcHMgYWx3YXlzIGZvbGxvdyB0aGUgb25lcyBvbiB0
aGUgYnJhbmNoICovCisJLyogbW50LT5tbnRfZmxhZ3MgfD0gTU5UX05PQVRJTUUgfCBNTlRfTk9E
SVJBVElNRTsgKi8KKwllcnIgPSBnZXRfc2Jfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsIHJhd19kYXRh
LCBhdWZzX2ZpbGxfc3VwZXIsIG1udCk7CisJaWYgKCFlcnIpIHsKKwkJc3RydWN0IHN1cGVyX2Js
b2NrICpzYiA9IG1udC0+bW50X3NiOworCQlzdHJ1Y3QgYXVfc2JpbmZvICpzYmluZm8gPSBhdV9z
Ymkoc2IpOworCisJCS8qIG5vIGdldC9wdXQgKi8KKwkJc3Bpbl9sb2NrX2luaXQoJnNiaW5mby0+
c2lfbW50Y2FjaGVfbG9jayk7CisJCXNiaW5mby0+c2lfbW50Y2FjaGUgPSBtbnQ7CisKKwkJYXVf
c2JpbGlzdF9sb2NrKCk7CisJCWF1X3NiaWxpc3RfYWRkKHNiaW5mbyk7CisJCXNpX3dyaXRlX2xv
Y2soc2IpOworCQlzeXNhdWZzX2Jyc19hZGQoc2IsIDApOworCQlzaV93cml0ZV91bmxvY2soc2Ip
OworCQlhdV9zYmlsaXN0X3VubG9jaygpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3Qg
ZmlsZV9zeXN0ZW1fdHlwZSBhdWZzX2ZzX3R5cGUgPSB7CisJLm5hbWUJCT0gQVVGU19GU1RZUEUs
CisJLmZzX2ZsYWdzCT0gRlNfUkVWQUxfRE9ULCAvKiBmb3IgVURCQSBhbmQgTkZTIGJyYW5jaCAq
LworCS5nZXRfc2IJCT0gYXVmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBnZW5lcmljX3NodXRkb3du
X3N1cGVyLAorCS8vLmtpbGxfc2IJPSBraWxsX2Fub25fc3VwZXIsCisJLyogbm8gbmVlZCB0byBf
X21vZHVsZV9nZXQoKSBhbmQgbW9kdWxlX3B1dCgpLiAqLworCS5vd25lcgkJPSBUSElTX01PRFVM
RSwKK307CmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9zdXBl
ci5oIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9zdXBlci5oCi0tLSBsaW51eC0yLjYu
MjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9zdXBlci5oCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAz
MDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9zdXBlci5oCTIwMDgtMDUtMjUg
MTE6NTg6NTMgKzAzMDAKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDUtMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25n
IHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisg
KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3Rvbiwg
TUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qCisgKiBzdXBlcl9ibG9jayBvcGVyYXRpb25z
CisgKgorICogJElkOiBzdXBlci5oLHYgMS41IDIwMDgvMDUvMTkgMDE6NTA6MTggc2Zqcm8gRXhw
ICQKKyAqLworCisjaWZuZGVmIF9fQVVGU19TVVBFUl9IX18KKyNkZWZpbmUgX19BVUZTX1NVUEVS
X0hfXworCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNs
dWRlIDxsaW51eC9jcmFtZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5j
bHVkZSA8bGludXgvbWFnaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWZzX3R5cGUuaD4KKy8vI2lu
Y2x1ZGUgImhpbm9kZS5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKy8vI2luY2x1ZGUgIm9wdHMuaCIK
KyNpbmNsdWRlICJ3a3EuaCIKKwordHlwZWRlZiBzc2l6ZV90ICgqYXVfcmVhZGZfdCkoc3RydWN0
IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7Cit0eXBlZGVmIHNzaXpl
X3QgKCphdV93cml0ZWZfdCkoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6
ZV90LAorCQkJICAgICAgIGxvZmZfdCAqKTsKKworc3RydWN0IGF1X3dicl9jb3B5dXBfb3BlcmF0
aW9ucyB7CisJaW50ICgqY29weXVwKShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworfTsKKworc3Ry
dWN0IGF1X3dicl9jcmVhdGVfb3BlcmF0aW9ucyB7CisJaW50ICgqY3JlYXRlKShzdHJ1Y3QgZGVu
dHJ5ICpkZW50cnksIGludCBpc2Rpcik7CisJaW50ICgqaW5pdCkoc3RydWN0IHN1cGVyX2Jsb2Nr
ICpzYik7CisJaW50ICgqZmluKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK307CisKK3N0cnVj
dCBhdV93YnJfbWZzIHsKKwlzdHJ1Y3QgbXV0ZXgJbWZzX2xvY2s7IC8qIHByb3RlY3QgdGhpcyBz
dHJ1Y3R1cmUgKi8KKwl1bnNpZ25lZCBsb25nCW1mc19qaWZmeTsKKwl1bnNpZ25lZCBsb25nCW1m
c19leHBpcmU7CisJYXVmc19iaW5kZXhfdAltZnNfYmluZGV4OworCisJdTY0CQltZnNycl9ieXRl
czsKKwl1NjQJCW1mc3JyX3dhdGVybWFyazsKK307CisKKy8qIHNiaW5mbyBzdGF0dXMgZmxhZ3Mg
Ki8KKy8qCisgKiBzZXQgdHJ1ZSB3aGVuIHJlZnJlc2hfZGlycygpIGZhaWxlZCBhdCByZW1vdW50
IHRpbWUuCisgKiB0aGVuIHRyeSByZWZyZXNoaW5nIGRpcnMgYXQgYWNjZXNzIHRpbWUgYWdhaW4u
CisgKiBpZiBpdCBpcyBmYWxzZSwgcmVmcmVzaGluZyBkaXJzIGF0IGFjY2VzcyB0aW1lIGlzIHVu
bmVjZXNhcnkKKyAqLworI2RlZmluZSBBdVNpX0ZBSUxFRF9SRUZSRVNIX0RJUlMJMQorI2RlZmlu
ZSBBdVNpX0ZBSUxFRF9JTklUCQkoMSA8PCAxKQorI2RlZmluZSBhdV9mdGVzdF9zaShzYmluZm8s
IG5hbWUpCSgoc2JpbmZvKS0+YXVfc2lfc3RhdHVzICYgQXVTaV8jI25hbWUpCisjZGVmaW5lIGF1
X2ZzZXRfc2koc2JpbmZvLCBuYW1lKSBcCisJeyAoc2JpbmZvKS0+YXVfc2lfc3RhdHVzIHw9IEF1
U2lfIyNuYW1lOyB9CisjZGVmaW5lIGF1X2ZjbHJfc2koc2JpbmZvLCBuYW1lKSBcCisJeyAoc2Jp
bmZvKS0+YXVfc2lfc3RhdHVzICY9IH5BdVNpXyMjbmFtZTsgfQorCitzdHJ1Y3QgYXVfYnJhbmNo
Oworc3RydWN0IGF1X3NiaW5mbyB7CisJLyogbm93YWl0IHRhc2tzIGluIHRoZSBzeXN0ZW0td2lk
ZSB3b3JrcXVldWUgKi8KKwlzdHJ1Y3QgYXVfbm93YWl0X3Rhc2tzCXNpX25vd2FpdDsKKworCXN0
cnVjdCBhdV9yd3NlbQkJc2lfcndzZW07CisKKwkvKiBicmFuY2ggbWFuYWdlbWVudCAqLworCWF1
X2dlbl90CQlzaV9nZW5lcmF0aW9uOworCisJLyogc2VlIGFib3ZlIGZsYWdzICovCisJdW5zaWdu
ZWQgY2hhcgkJYXVfc2lfc3RhdHVzOworCisJYXVmc19iaW5kZXhfdAkJc2lfYmVuZDsKKwlhdWZz
X2JpbmRleF90CQlzaV9sYXN0X2JyX2lkOworCXN0cnVjdCBhdV9icmFuY2gJKipzaV9icmFuY2g7
CisKKwkvKiBwb2xpY3kgdG8gc2VsZWN0IGEgd3JpdGFibGUgYnJhbmNoICovCisJdW5zaWduZWQg
Y2hhcgkJc2lfd2JyX2NvcHl1cDsKKwl1bnNpZ25lZCBjaGFyCQlzaV93YnJfY3JlYXRlOworCXN0
cnVjdCBhdV93YnJfY29weXVwX29wZXJhdGlvbnMgKnNpX3dicl9jb3B5dXBfb3BzOworCXN0cnVj
dCBhdV93YnJfY3JlYXRlX29wZXJhdGlvbnMgKnNpX3dicl9jcmVhdGVfb3BzOworCisJLyogcm91
bmQgcm9iaW4gKi8KKwlhdG9taWNfdAkJc2lfd2JyX3JyX25leHQ7CisKKwkvKiBtb3N0IGZyZWUg
c3BhY2UgKi8KKwlzdHJ1Y3QgYXVfd2JyX21mcwlzaV93YnJfbWZzOworCisJLyogbW91bnQgZmxh
Z3MgKi8KKwkvKiBpbmNsdWRlL2FzbS1pYTY0L3NpZ2luZm8uaCBkZWZpbmVzIGEgbWFjcm8gbmFt
ZWQgc2lfZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQJCXNpX21udGZsYWdzOworCisJLyogZXh0ZXJu
YWwgaW5vZGUgbnVtYmVyIChiaXRtYXAgYW5kIHRyYW5zbGF0aW9uIHRhYmxlKSAqLworCWF1X3Jl
YWRmX3QJCXNpX3hyZWFkOworCWF1X3dyaXRlZl90CQlzaV94d3JpdGU7CisJc3RydWN0IGZpbGUJ
CSpzaV94aWI7CisJc3RydWN0IG11dGV4CQlzaV94aWJfbXR4OyAvKiBwcm90ZWN0IHhpYiBtZW1i
ZXJzICovCisJdW5zaWduZWQgbG9uZwkJKnNpX3hpYl9idWY7CisJdW5zaWduZWQgbG9uZwkJc2lf
eGliX2xhc3RfcGluZGV4OworCWludAkJCXNpX3hpYl9uZXh0X2JpdDsKKwkvL3Vuc2lnbmVkIGxv
bmcgbG9uZwlzaV94aWJfbGltaXQ7CS8qIE1heCB4aWIgZmlsZSBzaXplICovCisKKwkvKiByZWFk
ZGlyIGNhY2hlIHRpbWUsIG1heCwgaW4gSFogKi8KKwl1bnNpZ25lZCBsb25nCQlzaV9yZGNhY2hl
OworCisJLyoKKwkgKiBJZiB0aGUgbnVtYmVyIG9mIHdoaXRlb3V0cyBhcmUgbGFyZ2VyIHRoYW4g
c2lfZGlyd2gsIGxlYXZlIGFsbCBvZgorCSAqIHRoZW0gYWZ0ZXIgYXVfd2h0bXBfcmVuIHRvIHJl
ZHVjZSB0aGUgY29zdCBvZiBybWRpcigyKS4KKwkgKiBmdXR1cmUgZnNjay5hdWZzIG9yIGtlcm5l
bCB0aHJlYWQgd2lsbCByZW1vdmUgdGhlbSBsYXRlci4KKwkgKiBPdGhlcndpc2UsIHJlbW92ZSBh
bGwgd2hpdGVvdXRzIGFuZCB0aGUgZGlyIGluIHJtZGlyKDIpLgorCSAqLworCXVuc2lnbmVkIGlu
dAkJc2lfZGlyd2g7CisKKwkvKgorCSAqIHJlbmFtZSgyKSBhIGRpcmVjdG9yeSB3aXRoIGFsbCBj
aGlsZHJlbi4KKwkgKi8KKwkvL2ludAkJCXNpX3JlbmRpcjsKKworCS8qIHBzZXVkb19saW5rIGxp
c3QgKi8gLy8gZGlydHkKKwlzcGlubG9ja190CQlzaV9wbGlua19sb2NrOworCXN0cnVjdCBsaXN0
X2hlYWQJc2lfcGxpbms7CisKKwkvKiBkaXJ0eSwgZm9yIGV4cG9ydCwgYXN5bmMgb3BzLCBhbmQg
c3lzZnMgKi8KKwlzcGlubG9ja190CQlzaV9tbnRjYWNoZV9sb2NrOworCXN0cnVjdCB2ZnNtb3Vu
dAkJKnNpX21udGNhY2hlOwkvKiBubyBnZXQvcHV0ICovCisKKwkvKgorCSAqIHN5c2ZzIGFuZCBs
aWZldGltZSBtYW5hZ2VtZW50LgorCSAqIHRoaXMgaXMgbm90IGEgc21hbGwgc3RydWN0dXJlIGFu
ZCBpdCBtYXkgYmUgYSB3YXN0ZSBvZiBtZW1vcnkgaW4gY2FzZQorCSAqIG9mIHN5c2ZzIGlzIGRp
c2FibGVkLCBwYXJ0aWN1bGFyeSB3aGVuIG1hbnkgYXVmcy1lcyBhcmUgbW91bnRlZC4KKwkgKi8K
KwlzdHJ1Y3Qga29iamVjdAkJc2lfa29iajsKKworCS8vdG9kbzogcmVtb3ZlIHRoaXMgbGlzdC4K
KwkvKiBzdXBlcl9ibG9ja3MgbGlzdCBpcyBub3QgZXhwb3J0ZWQgKi8KKwlzdHJ1Y3QgbGlzdF9o
ZWFkCXNpX2xpc3Q7CisKKyNpZmRlZiBDT05GSUdfQVVGU19ST0JSCisJLyogbG9ja2VkIHZtYSBs
aXN0IGZvciBtbWFwKCkgKi8gLy8gZGlydHkKKwlzcGlubG9ja190CQlzaV9sdm1hX2xvY2s7CisJ
c3RydWN0IGxpc3RfaGVhZAlzaV9sdm1hOworI2VuZGlmCisKKwkvKiBkaXJ0eSwgbmVjZXNzYXJ5
IGZvciB1bm1vdW50aW5nLCBzeXNmcyBhbmQgc3lzcnEgKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJ
KnNpX3NiOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBwb2xpY3kgdG8gc2VsZWN0
IG9uZSBhbW9uZyB3cml0YWJsZSBicmFuY2hlcyAqLworI2RlZmluZSBBdVdickNvcHl1cChzYmlu
Zm8sIGFyZ3MuLi4gKSBcCisJKHNiaW5mbyktPnNpX3dicl9jb3B5dXBfb3BzLT5jb3B5dXAoYXJn
cykKKyNkZWZpbmUgQXVXYnJDcmVhdGUoc2JpbmZvLCBhcmdzLi4uICkgXAorCShzYmluZm8pLT5z
aV93YnJfY3JlYXRlX29wcy0+Y3JlYXRlKGFyZ3MpCisKKy8qIGZsYWdzIGZvciBzaV9yZWFkX2xv
Y2soKS9hdWZzX3JlYWRfbG9jaygpL2RpX3JlYWRfbG9jaygpICovCisjZGVmaW5lIEF1TG9ja19E
VwkJMQkJLyogd3JpdGUtbG9jayBkZW50cnkgKi8KKyNkZWZpbmUgQXVMb2NrX0lSCQkoMSA8PCAx
KQkvKiByZWFkLWxvY2sgaW5vZGUgKi8KKyNkZWZpbmUgQXVMb2NrX0lXCQkoMSA8PCAyKQkvKiB3
cml0ZS1sb2NrIGlub2RlICovCisjZGVmaW5lIEF1TG9ja19GTFVTSAkJKDEgPDwgMykJLyogd2Fp
dCBmb3IgJ25vd2FpdCcgdGFza3MgKi8KKyNkZWZpbmUgQXVMb2NrX0RJUgkJKDEgPDwgNCkJLyog
dGFyZ2V0IGlzIGEgZGlyICovCisjZGVmaW5lIGF1X2Z0ZXN0X2xvY2soZmxhZ3MsIG5hbWUpCSgo
ZmxhZ3MpICYgQXVMb2NrXyMjbmFtZSkKKyNkZWZpbmUgYXVfZnNldF9sb2NrKGZsYWdzLCBuYW1l
KQl7IChmbGFncykgfD0gQXVMb2NrXyMjbmFtZTsgfQorI2RlZmluZSBhdV9mY2xyX2xvY2soZmxh
Z3MsIG5hbWUpCXsgKGZsYWdzKSAmPSB+QXVMb2NrXyMjbmFtZTsgfQorCisvKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tICovCisKKy8qIHN1cGVyLmMgKi8KK2V4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBh
dWZzX2ZzX3R5cGU7CitzdHJ1Y3QgaW5vZGUgKmF1X2lnZXRfbG9ja2VkKHN0cnVjdCBzdXBlcl9i
bG9jayAqc2IsIGlub190IGlubyk7CisKKy8qIHNiaW5mby5jICovCit2b2lkIGF1X3NpX2ZyZWUo
c3RydWN0IGtvYmplY3QgKmtvYmopOworaW50IGF1X3NpX2FsbG9jKHN0cnVjdCBzdXBlcl9ibG9j
ayAqc2IpOworc3RydWN0IGF1X2JyYW5jaCAqYXVfc2JyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2Is
IGF1ZnNfYmluZGV4X3QgYmluZGV4KTsKK2F1X2dlbl90IGF1X3NpZ2VuX2luYyhzdHJ1Y3Qgc3Vw
ZXJfYmxvY2sgKnNiKTsKK2ludCBhdV9maW5kX2JpbmRleChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi
LCBzdHJ1Y3QgYXVfYnJhbmNoICpicik7CisKK3ZvaWQgYXVmc19yZWFkX2xvY2soc3RydWN0IGRl
bnRyeSAqZGVudHJ5LCBpbnQgZmxhZ3MpOwordm9pZCBhdWZzX3JlYWRfdW5sb2NrKHN0cnVjdCBk
ZW50cnkgKmRlbnRyeSwgaW50IGZsYWdzKTsKK3ZvaWQgYXVmc193cml0ZV9sb2NrKHN0cnVjdCBk
ZW50cnkgKmRlbnRyeSk7Cit2b2lkIGF1ZnNfd3JpdGVfdW5sb2NrKHN0cnVjdCBkZW50cnkgKmRl
bnRyeSk7Cit2b2lkIGF1ZnNfcmVhZF9hbmRfd3JpdGVfbG9jazIoc3RydWN0IGRlbnRyeSAqZDEs
IHN0cnVjdCBkZW50cnkgKmQyLCBpbnQgaXNkaXIpOwordm9pZCBhdWZzX3JlYWRfYW5kX3dyaXRl
X3VubG9jazIoc3RydWN0IGRlbnRyeSAqZDEsIHN0cnVjdCBkZW50cnkgKmQyKTsKKworYXVmc19i
aW5kZXhfdCBhdV9uZXdfYnJfaWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitzdHJ1Y3QgdmZz
bW91bnQgKmF1X21udGNhY2hlX2dldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKworLyogd2Jy
X3BvbGljeS5jICovCitleHRlcm4gc3RydWN0IGF1X3dicl9jb3B5dXBfb3BlcmF0aW9ucyBhdV93
YnJfY29weXVwX29wc1tdOworZXh0ZXJuIHN0cnVjdCBhdV93YnJfY3JlYXRlX29wZXJhdGlvbnMg
YXVfd2JyX2NyZWF0ZV9vcHNbXTsKK2ludCBhdV9jcGRvd25fZGlycyhzdHJ1Y3QgZGVudHJ5ICpk
ZW50cnksIGF1ZnNfYmluZGV4X3QgYmRzdCwKKwkJICAgc3RydWN0IGRlbnRyeSAqbG9ja2VkKTsK
KworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdV9zYmluZm8g
KmF1X3NiaShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiBzYi0+c19mc19pbmZv
OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmF1X3NidHlwZShzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiKQoreworCXJldHVybiBzYi0+c190eXBlLT5uYW1lOworfQorCitzdGF0aWMgaW5s
aW5lIGludCBhdV90ZXN0X2F1ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4g
KHNiLT5zX21hZ2ljID09IEFVRlNfU1VQRVJfTUFHSUMpOworfQorCitzdGF0aWMgaW5saW5lIGlu
dCBhdV90ZXN0X25mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworI2lmZGVmIENPTkZJR19B
VUZTX0JSX05GUworCXJldHVybiAoc2ItPnNfbWFnaWMgPT0gTkZTX1NVUEVSX01BR0lDKTsKKyNl
bHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBpbnQgYXVfdGVzdF9m
dXNlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisjaWZkZWYgQ09ORklHX0FVRlNfV09SS0FS
T1VORF9GVVNFCisjaWZkZWYgRlVTRV9TVVBFUl9NQUdJQworCUJVSUxEX0JVR19PTihGVVNFX1NV
UEVSX01BR0lDICE9IDB4NjU3MzU1NDYpOworCXJldHVybiAoc2ItPnNfbWFnaWMgPT0gRlVTRV9T
VVBFUl9NQUdJQyk7CisjZWxzZQorCXJldHVybiAhc3RyY21wKGF1X3NidHlwZShzYiksICJmdXNl
Iik7CisjZW5kaWYKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBh
dV90ZXN0X3hmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworI2lmZGVmIENPTkZJR19BVUZT
X0JSX1hGUworI2lmZGVmIFhGU19TQl9NQUdJQworCUJVSUxEX0JVR19PTihYRlNfU0JfTUFHSUMg
IT0gMHg1ODQ2NTM0Mik7CisJcmV0dXJuIChzYi0+c19tYWdpYyA9PSBYRlNfU0JfTUFHSUMpOwor
I2Vsc2UKKwlyZXR1cm4gIXN0cmNtcChhdV9zYnR5cGUoc2IpLCAieGZzIik7CisjZW5kaWYKKyNl
bmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdV90ZXN0X3RtcGZzKHN0
cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisjaWZkZWYgQ09ORklHX1RNUEZTCisjaWZkZWYgVE1Q
RlNfTUFHSUMKKwlCVUlMRF9CVUdfT04oVE1QRlNfTUFHSUMgIT0gMHgwMTAyMTk5NCk7CisJcmV0
dXJuIChzYi0+c19tYWdpYyA9PSBUTVBGU19NQUdJQyk7CisjZWxzZQorCXJldHVybiAhc3RyY21w
KGF1X3NidHlwZShzYiksICJ0bXBmcyIpOworI2VuZGlmCisjZW5kaWYKKwlyZXR1cm4gMDsKK30K
KworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX0FVRlNfRVhQT1JUCitleHRl
cm4gc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGF1ZnNfZXhwb3J0X29wOworc3RhdGljIGlubGlu
ZSB2b2lkIGF1X2luaXRfZXhwb3J0X29wKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc2It
PnNfZXhwb3J0X29wID0gJmF1ZnNfZXhwb3J0X29wOworfQorCitzdGF0aWMgaW5saW5lIGludCBh
dV90ZXN0X25mc2Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJcmV0dXJuICghdHNrLT5t
bSAmJiAhc3RyY21wKHRzay0+Y29tbSwgIm5mc2QiKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9p
ZCBhdV9uZnNkX2xvY2tkZXBfb2ZmKHZvaWQpCit7CisJaWYgKGF1X3Rlc3RfbmZzZChjdXJyZW50
KSkKKwkJbG9ja2RlcF9vZmYoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF1X25mc2RfbG9j
a2RlcF9vbih2b2lkKQoreworCWlmIChhdV90ZXN0X25mc2QoY3VycmVudCkpCisJCWxvY2tkZXBf
b24oKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBhdV90ZXN0X25mc2Qoc3RydWN0IHRh
c2tfc3RydWN0ICp0c2spCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBh
dV9pbml0X2V4cG9ydF9vcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCS8qIG5vdGhpbmcg
Ki8KK30KKworI2RlZmluZSBhdV9uZnNkX2xvY2tkZXBfb2ZmKCkJZG8ge30gd2hpbGUgKDApCisj
ZGVmaW5lIGF1X25mc2RfbG9ja2RlcF9vbigpCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qIENP
TkZJR19BVUZTX0VYUE9SVCAqLworCisjaWZkZWYgQ09ORklHX0FVRlNfUk9CUgorc3RhdGljIGlu
bGluZSBpbnQgYXVfdGVzdF9uZXN0ZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpoX3NiKQoreworCXJl
dHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXVfcm9icl9sdm1hX2luaXQoc3RydWN0
IGF1X3NiaW5mbyAqc2JpbmZvKQoreworCXNwaW5fbG9ja19pbml0KCZzYmluZm8tPnNpX2x2bWFf
bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnNiaW5mby0+c2lfbHZtYSk7Cit9CisjZWxzZQorc3Rh
dGljIGlubGluZSBpbnQgYXVfdGVzdF9uZXN0ZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpoX3NiKQor
eworCWludCBlcnIgPSAwOworCWlmICh1bmxpa2VseShhdV90ZXN0X2F1ZnMoaF9zYikpKSB7CisJ
CWVyciA9IC1FSU5WQUw7CisJCUF1VHJhY2VFcnIoZXJyKTsKKwl9CisJcmV0dXJuIGVycjsKK30K
Kworc3RhdGljIGlubGluZSB2b2lkIGF1X3JvYnJfbHZtYV9pbml0KHN0cnVjdCBhdV9zYmluZm8g
KnNiaW5mbykKK3sKKwkvKiBlbXB0eSAqLworfQorI2VuZGlmIC8qIENPTkZJR19BVUZTX1JPQlIg
Ki8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBsb2NrIHN1cGVyYmxvY2suIG1haW5seSBm
b3IgZW50cnkgcG9pbnQgZnVuY3Rpb25zICovCisvKgorICogc2lfbm9mbHVzaF9yZWFkX2xvY2ss
IHNpX25vZmx1c2hfd3JpdGVfbG9jaywKKyAqIHNpX3JlYWRfdW5sb2NrLCBzaV93cml0ZV91bmxv
Y2ssIHNpX2Rvd25ncmFkZV9sb2NrCisgKi8KK0F1U2ltcGxlTG9ja1J3c2VtRnVuY3Moc2lfbm9m
bHVzaCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJICAgICAgIGF1X3NiaShzYiktPnNpX3J3
c2VtKTsKK0F1U2ltcGxlVW5sb2NrUndzZW1GdW5jcyhzaSwgc3RydWN0IHN1cGVyX2Jsb2NrICpz
YiwgYXVfc2JpKHNiKS0+c2lfcndzZW0pOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2lfcmVhZF9s
b2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmbGFncykKK3sKKwlpZiAoYXVfZnRlc3Rf
bG9jayhmbGFncywgRkxVU0gpKQorCQlhdV9ud3RfZmx1c2goJmF1X3NiaShzYiktPnNpX25vd2Fp
dCk7CisJc2lfbm9mbHVzaF9yZWFkX2xvY2soc2IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQg
c2lfd3JpdGVfbG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWF1X253dF9mbHVzaCgm
YXVfc2JpKHNiKS0+c2lfbm93YWl0KTsKKwlzaV9ub2ZsdXNoX3dyaXRlX2xvY2soc2IpOworfQor
CitzdGF0aWMgaW5saW5lIGludCBzaV9yZWFkX3RyeWxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpz
YiwgaW50IGZsYWdzKQoreworCWlmIChhdV9mdGVzdF9sb2NrKGZsYWdzLCBGTFVTSCkpCisJCWF1
X253dF9mbHVzaCgmYXVfc2JpKHNiKS0+c2lfbm93YWl0KTsKKwlyZXR1cm4gc2lfbm9mbHVzaF9y
ZWFkX3RyeWxvY2soc2IpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaV93cml0ZV90cnlsb2Nr
KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmbGFncykKK3sKKwlpZiAoYXVfZnRlc3RfbG9j
ayhmbGFncywgRkxVU0gpKQorCQlhdV9ud3RfZmx1c2goJmF1X3NiaShzYiktPnNpX25vd2FpdCk7
CisJcmV0dXJuIHNpX25vZmx1c2hfd3JpdGVfdHJ5bG9jayhzYik7Cit9CisKKy8qIHRvIGRlYnVn
IGVhc2llciwgZG8gbm90IG1ha2UgdGhlbSBpbmxpbmVkIGZ1bmN0aW9ucyAqLworI2RlZmluZSBT
aU11c3RSZWFkTG9jayhzYikJQXVSd011c3RSZWFkTG9jaygmYXVfc2JpKHNiKS0+c2lfcndzZW0p
CisjZGVmaW5lIFNpTXVzdFdyaXRlTG9jayhzYikJQXVSd011c3RXcml0ZUxvY2soJmF1X3NiaShz
YiktPnNpX3J3c2VtKQorI2RlZmluZSBTaU11c3RBbnlMb2NrKHNiKQlBdVJ3TXVzdEFueUxvY2so
JmF1X3NiaShzYiktPnNpX3J3c2VtKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBp
bmxpbmUgYXVmc19iaW5kZXhfdCBhdV9zYmVuZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorewor
CVNpTXVzdEFueUxvY2soc2IpOworCXJldHVybiBhdV9zYmkoc2IpLT5zaV9iZW5kOworfQorCitz
dGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdV9tbnRmbGFncyhzdHJ1Y3Qgc3VwZXJfYmxvY2sg
KnNiKQoreworCVNpTXVzdEFueUxvY2soc2IpOworCXJldHVybiBhdV9zYmkoc2IpLT5zaV9tbnRm
bGFnczsKK30KKworc3RhdGljIGlubGluZSBhdV9nZW5fdCBhdV9zaWdlbihzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiKQoreworCVNpTXVzdEFueUxvY2soc2IpOworCXJldHVybiBhdV9zYmkoc2IpLT5z
aV9nZW5lcmF0aW9uOworfQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9f
QVVGU19TVVBFUl9IX18gKi8KZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9m
cy9hdWZzL3N5c2F1ZnMuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvc3lzYXVmcy5j
Ci0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9zeXNhdWZzLmMJMTk3MC0w
MS0wMSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL3N5
c2F1ZnMuYwkyMDA4LTA1LTI1IDExOjU4OjUzICswMzAwCkBAIC0wLDAgKzEsMTA0IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBw
cm9ncmFtLCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJD
SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
CisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZp
ZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogc3lz
ZnMgaW50ZXJmYWNlIGFuZCBsaWZldGltZSBtYW5hZ2VtZW50CisgKiB0aGV5IGFyZSBuZWNlc3Nh
cnkgcmVnYXJkbGVzcyBzeXNmcyBpcyBkaXNhYmxlZC4KKyAqCisgKiAkSWQ6IHN5c2F1ZnMuYyx2
IDEuNSAyMDA4LzA1LzE5IDAxOjUwOjQ3IHNmanJvIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGxp
bnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lz
ZnMuaD4KKyNpbmNsdWRlICJhdWZzLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogc3Vw
ZXJfYmxvY2tzIGxpc3QgaXMgbm90IGV4cG9ydGVkICovCitERUZJTkVfTVVURVgoYXVfc2JpbGlz
dF9tdHgpOworTElTVF9IRUFEKGF1X3NiaWxpc3QpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisK
K3N0YXRpYyBzdHJ1Y3Qga3NldCBhdV9rc2V0OworCisjZGVmaW5lIEF1U2JpQXR0cihfbmFtZSkg
eyBcCisJLmF0dHIgICA9IHsgLm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksIC5tb2RlID0gMDQ0
NCB9LAlcCisJLnNob3cgICA9IHN5c2F1ZnNfc2JpXyMjX25hbWUsCQkJCVwKK30KKworc3RhdGlj
IHN0cnVjdCBhdV9zYmlfYXR0ciBhdV9zYmlfYXR0cl94aW5vID0gQXVTYmlBdHRyKHhpbm8pOwor
c3RydWN0IGF0dHJpYnV0ZSAqYXVfc2JpX2F0dHJzW10gPSB7CisJJmF1X3NiaV9hdHRyX3hpbm8u
YXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgYXVfc2JpX29wcyA9
IHsKKwkuc2hvdyAgID0gc3lzYXVmc19zYmlfc2hvdworfTsKKworc3RhdGljIHN0cnVjdCBrb2Jq
X3R5cGUgYXVfc2JpX2t0eXBlID0geworCS5yZWxlYXNlCT0gYXVfc2lfZnJlZSwKKwkuc3lzZnNf
b3BzCT0gJmF1X3NiaV9vcHMsCisJLmRlZmF1bHRfYXR0cnMJPSBhdV9zYmlfYXR0cnMsCit9Owor
CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBzeXNhdWZzX3NpX2luaXQoc3RydWN0IGF1X3Ni
aW5mbyAqc2JpbmZvKQoreworCWludCBlcnI7CisKKwlzYmluZm8tPnNpX2tvYmoua3NldCA9ICZh
dV9rc2V0OworCWVyciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZzYmluZm8tPnNpX2tvYmosICZh
dV9zYmlfa3R5cGUsCisJCQkJICAgTlVMTC8qJmF1X2tzZXQua29iaiovLAorCQkJCSAgIFN5c2F1
ZnNTYl9QUkVGSVggIiVwIiwgc2JpbmZvKTsKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVy
cjsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgc3lzYXVmc19maW4odm9pZCkK
K3sKKwlBdURlYnVnT24oIWxpc3RfZW1wdHkoJmF1X3NiaWxpc3QpKTsKKwlzeXNmc19yZW1vdmVf
Z3JvdXAoJmF1X2tzZXQua29iaiwgYXVfYXR0cl9ncm91cCk7CisJa3NldF91bnJlZ2lzdGVyKCZh
dV9rc2V0KTsKK30KKworaW50IF9faW5pdCBzeXNhdWZzX2luaXQodm9pZCkKK3sKKwlpbnQgZXJy
OworCisJc3lzYXVmc19icnNfaW5pdCgpOworCWF1X2tzZXQua29iai5wYXJlbnQgPSBmc19rb2Jq
OworCWtvYmplY3Rfc2V0X25hbWUoJmF1X2tzZXQua29iaiwgQVVGU19OQU1FKTsKKwlhdV9rc2V0
LmtvYmoua3R5cGUgPSBhdV9rdHlwZTsKKwllcnIgPSBrc2V0X3JlZ2lzdGVyKCZhdV9rc2V0KTsK
KwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXQ7CisJZXJyID0gc3lzZnNfY3JlYXRlX2dy
b3VwKCZhdV9rc2V0LmtvYmosIGF1X2F0dHJfZ3JvdXApOworCWlmICh1bmxpa2VseShlcnIpKQor
CQlrc2V0X3VucmVnaXN0ZXIoJmF1X2tzZXQpOworCisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsK
KwlyZXR1cm4gZXJyOworfQpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2Zz
L2F1ZnMvc3lzYXVmcy5oIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy9zeXNhdWZzLmgK
LS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL3N5c2F1ZnMuaAkxOTcwLTAx
LTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvc3lz
YXVmcy5oCTIwMDgtMDUtMjUgMTE6NTg6NTMgKzAzMDAKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAqCisgKiBUaGlzIHBy
b2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUK
KyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRo
ZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlm
dGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qCisgKiBzeXNm
cyBpbnRlcmZhY2UgYW5kIGxpZmV0aW1lIG1hbmFnZW1lbnQKKyAqCisgKiAkSWQ6IHN5c2F1ZnMu
aCx2IDEuNiAyMDA4LzA1LzE5IDAxOjUwOjQ3IHNmanJvIEV4cCAkCisgKi8KKworI2lmbmRlZiBf
X1NZU0FVRlNfSF9fCisjZGVmaW5lIF9fU1lTQVVGU19IX18KKworI2lmZGVmIF9fS0VSTkVMX18K
KworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNs
dWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJzdXBlci5oIgorCisvKiBlbnRyaWVzIHVuZGVyIHN5
c2ZzIHBlciBzdXBlciBibG9jayAqLworZW51bSB7CisJU3lzYXVmc1NiX1hJTk8sCisJU3lzYXVm
c1NiX01OVFBOVDEsCisJU3lzYXVmc1NiX0xhc3QKK307CisKKyNkZWZpbmUgU3lzYXVmc1NiX1BS
RUZJWAkic2lfIgkvKiBmb2xsb3dlZCBieSAlcCAqLworCitzdHJ1Y3QgYXVfc2JpX2F0dHIgewor
CXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlpbnQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKnNl
cSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisK
Ky8qIHN5c2F1ZnMuYyAqLworZXh0ZXJuIHN0cnVjdCBtdXRleCBhdV9zYmlsaXN0X210eDsKK2V4
dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGF1X3NiaWxpc3Q7CitleHRlcm4gc3RydWN0IGF0dHJpYnV0
ZSAqYXVfc2JpX2F0dHJzW107CitpbnQgc3lzYXVmc19zaV9pbml0KHN0cnVjdCBhdV9zYmluZm8g
KnNiaW5mbyk7CitpbnQgX19pbml0IHN5c2F1ZnNfaW5pdCh2b2lkKTsKK3ZvaWQgc3lzYXVmc19m
aW4odm9pZCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGF1
X3NiaWxpc3RfbG9jayh2b2lkKQoreworCW11dGV4X2xvY2soJmF1X3NiaWxpc3RfbXR4KTsKK30K
Kworc3RhdGljIGlubGluZSB2b2lkIGF1X3NiaWxpc3RfdW5sb2NrKHZvaWQpCit7CisJbXV0ZXhf
dW5sb2NrKCZhdV9zYmlsaXN0X210eCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdV9zYmls
aXN0X2RlbChzdHJ1Y3QgYXVfc2JpbmZvICpzYmluZm8pCit7CisJbGlzdF9kZWwoJnNiaW5mby0+
c2lfbGlzdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdV9zYmlsaXN0X2FkZChzdHJ1Y3Qg
YXVfc2JpbmZvICpzYmluZm8pCit7CisJLyogdGhlIG9yZGVyIGluIHRoaXMgbGlzdCBpcyBpbXBv
cnRhbnQgKi8KKwlsaXN0X2FkZF90YWlsKCZzYmluZm8tPnNpX2xpc3QsICZhdV9zYmlsaXN0KTsK
K30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgYXVfYnJhbmNoOworI2lmZGVmIENP
TkZJR19TWVNGUworLyogc3lzZnMuYyAqLworZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAg
KmF1X2F0dHJfZ3JvdXA7CitleHRlcm4gc3RydWN0IGtvYmpfdHlwZSAqYXVfa3R5cGU7CisKK2lu
dCBzeXNhdWZzX3NiaV94aW5vKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3Qgc3VwZXJfYmxv
Y2sgKnNiKTsKK2ludCBzeXNhdWZzX3NiaV9tbnRwbnQxKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBz
dHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3NzaXplX3Qgc3lzYXVmc19zYmlfc2hvdyhzdHJ1Y3Qg
a29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpOwor
Cit2b2lkIHN5c2F1ZnNfYnJfaW5pdChzdHJ1Y3QgYXVfYnJhbmNoICpicik7Cit2b2lkIHN5c2F1
ZnNfYnJzX2FkZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRleF90IGJpbmRleCk7
Cit2b2lkIHN5c2F1ZnNfYnJzX2RlbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRl
eF90IGJpbmRleCk7CisKKyNkZWZpbmUgc3lzYXVmc19icnNfaW5pdCgpCWRvIHt9IHdoaWxlICgw
KQorCisjZWxzZQorI2RlZmluZSBhdV9hdHRyX2dyb3VwCU5VTEwKKyNkZWZpbmUgYXVfa3R5cGUJ
TlVMTAorCitzdGF0aWMgaW5saW5lCitpbnQgc3lzYXVmc19zYmlfeGlubyhzdHJ1Y3Qgc2VxX2Zp
bGUgKnNlcSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gMDsKK30KKworc3Rh
dGljIGlubGluZQoraW50IHN5c2F1ZnNfc2JpX21udHBudDEoc3RydWN0IHNlcV9maWxlICpzZXEs
IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxp
bmUKK3NzaXplX3Qgc3lzYXVmc19zYmlfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0
IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0
YXRpYyBpbmxpbmUgdm9pZCBzeXNhdWZzX2JyX2luaXQoc3RydWN0IGF1X2JyYW5jaCAqYnIpCit7
CisJLyogZW1wdHkgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHN5c2F1ZnNfYnJzX2FkZChz
dHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRleF90IGJpbmRleCkKK3sKKwkvKiBub3Ro
aW5nICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeXNhdWZzX2Jyc19kZWwoc3RydWN0IHN1
cGVyX2Jsb2NrICpzYiwgYXVmc19iaW5kZXhfdCBiaW5kZXgpCit7CisJLyogbm90aGluZyAqLwor
fQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzYXVmc19icnNfaW5pdCh2b2lkKQoreworCXN5c2F1
ZnNfYnJzID0gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KKworI2VuZGlmIC8qIF9f
S0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX1NZU0FVRlNfSF9fICovCmRpZmYgLXVyTiBsaW51eC0y
LjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy9zeXNmcy5jIGxpbnV4LTIuNi4yNS40LXVuaW9u
ZnMvZnMvYXVmcy9zeXNmcy5jCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVm
cy9zeXNmcy5jCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVu
aW9uZnMvZnMvYXVmcy9zeXNmcy5jCTIwMDgtMDUtMjUgMTE6NTg6NTMgKzAzMDAKQEAgLTAsMCAr
MSw0NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBKdW5qaXJvIE9rYWppbWEK
KyAqCisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisg
KiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3Jh
bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBu
b3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBG
cmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICov
CisKKy8qCisgKiBzeXNmcyBpbnRlcmZhY2UKKyAqCisgKiAkSWQ6IHN5c2ZzLmMsdiAxLjQgMjAw
OC8wNS8xOSAwMTo1MToxNiBzZmpybyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5o
PgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+
CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlICJhdWZzLmgiCisKKworI2lmZGVm
IENPTkZJR19BVUZTX0xPQ0FMCitzdGF0aWMgc3NpemVfdCBjb25maWdfc2hvdyhzdHJ1Y3Qga29i
amVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVm
KQoreworI2RlZmluZSBjb25mX2Jvb2wobmFtZSkJIkNPTkZJR19BVUZTXyIgI25hbWUgIj15XG4i
CisJc3RhdGljIGNvbnN0IGNoYXIgb3B0W10gPQorI2lmZGVmIENPTkZJR19BVUZTCisJCSJDT05G
SUdfQVVGUz15XG4iCisjZWxzZQorCQkiQ09ORklHX0FVRlM9bVxuIgorI2VuZGlmCisjaWZkZWYg
Q09ORklHX0FVRlNfQlJBTkNIX01BWF8xMjcKKwkJY29uZl9ib29sKEJSQU5DSF9NQVhfMTI3KQor
I2VsaWYgZGVmaW5lZChDT05GSUdfQVVGU19CUkFOQ0hfTUFYXzUxMSkKKwkJY29uZl9ib29sKEJS
QU5DSF9NQVhfNTExKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVVGU19CUkFOQ0hfTUFYXzEwMjMp
CisJCWNvbmZfYm9vbChCUkFOQ0hfTUFYXzEwMjMpCisjZWxpZiBkZWZpbmVkKENPTkZJR19BVUZT
X0JSQU5DSF9NQVhfMzI3NjcpCisJCWNvbmZfYm9vbChCUkFOQ0hfTUFYXzMyNzY3KQorI2VuZGlm
CisjaWZkZWYgQ09ORklHX0FVRlNfSElOT1RJRlkKKwkJY29uZl9ib29sKEhJTk9USUZZKQorI2Vu
ZGlmCisjaWZkZWYgQ09ORklHX0FVRlNfRVhQT1JUCisJCWNvbmZfYm9vbChFWFBPUlQpCisjZW5k
aWYKKyNpZmRlZiBDT05GSUdfQVVGU19ST0JSCisJCWNvbmZfYm9vbChST0JSKQorI2VuZGlmCisj
aWZkZWYgQ09ORklHX0FVRlNfU0hXSAorCQljb25mX2Jvb2woU0hXSCkKKyNlbmRpZgorI2lmZGVm
IENPTkZJR19BVUZTX0RMR1QKKwkJY29uZl9ib29sKERMR1QpCisjZW5kaWYKKyNpZmRlZiBDT05G
SUdfQVVGU19SUl9TUVVBU0hGUworCQljb25mX2Jvb2woUlJfU1FVQVNIRlMpCisjZW5kaWYKKyNp
ZmRlZiBDT05GSUdfQVVGU19TRUNfUEVSTV9QQVRDSAorCQljb25mX2Jvb2woU0VDX1BFUk1fUEFU
Q0gpCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVVGU19TUExJQ0VfUEFUQ0gKKwkJY29uZl9ib29s
KFNQTElDRV9QQVRDSCkKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BVUZTX1BVVF9GSUxQX1BBVENI
CisJCWNvbmZfYm9vbChQVVRfRklMUF9QQVRDSCkKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BVUZT
X0xIQVNIX1BBVENICisJCWNvbmZfYm9vbChMSEFTSF9QQVRDSCkKKyNlbmRpZgorI2lmZGVmIENP
TkZJR19BVUZTX0ZTWU5DX1NVUEVSX1BBVENICisJCWNvbmZfYm9vbChGU1lOQ19TVVBFUl9QQVRD
SCkKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BVUZTX0RFTllfV1JJVEVfQUNDRVNTX1BBVENICisJ
CWNvbmZfYm9vbChERU5ZX1dSSVRFX0FDQ0VTU19QQVRDSCkKKyNlbmRpZgorI2lmZGVmIENPTkZJ
R19BVUZTX0tTSVpFX1BBVENICisJCWNvbmZfYm9vbChLU0laRV9QQVRDSCkKKyNlbmRpZgorI2lm
ZGVmIENPTkZJR19BVUZTX1dPUktBUk9VTkRfRlVTRQorCQljb25mX2Jvb2woV09SS0FST1VORF9G
VVNFKQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FVRlNfU1RBVAorCQljb25mX2Jvb2woU1RBVCkK
KyNlbmRpZgorI2lmZGVmIENPTkZJR19BVUZTX0RFQlVHCisJCWNvbmZfYm9vbChERUJVRykKKyNl
bmRpZgorI2lmZGVmIENPTkZJR19BVUZTX0NPTVBBVAorCQljb25mX2Jvb2woQ09NUEFUKQorI2Vu
ZGlmCisKKy8qIGF1dG9tYXRpYyBjb25maWd1cmF0aW9ucyAqLworI2lmZGVmIENPTkZJR19BVUZT
X0JSX05GUworCQljb25mX2Jvb2woQlJfTkZTKQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FVRlNf
TUFHSUNfU1lTUlEKKwkJY29uZl9ib29sKE1BR0lDX1NZU1JRKQorI2VuZGlmCisJCTsKKyN1bmRl
ZiBjb25mX2Jvb2wKKworCWNoYXIgKnAgPSBidWY7CisJY29uc3QgY2hhciAqZW5kID0gYnVmICsg
UEFHRV9TSVpFOworCisJcCArPSBzbnByaW50ZihwLCBlbmQgLSBwLCAiJXMiLCBvcHQpOworI2lm
ZGVmIERiZ1VkYmFSYWNlCisJaWYgKHAgPCBlbmQpCisJCXAgKz0gc25wcmludGYocCwgZW5kIC0g
cCwgIkRiZ1VkYmFSYWNlPSVkXG4iLCBEYmdVZGJhUmFjZSk7CisjZW5kaWYKKwlpZiAocCA8IGVu
ZCkKKwkJcmV0dXJuIHAgLSBidWY7CisJZWxzZQorCQlyZXR1cm4gLUVGQklHOworfQorCitzdGF0
aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGF1X2NvbmZpZ19hdHRyID0gX19BVFRSX1JPKGNvbmZp
Zyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BVUZTX1NUQVQKK3N0YXRpYyBzc2l6ZV90IHN0
YXRfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRy
LAorCQkJIGNoYXIgKmJ1ZikKK3sKKwljaGFyICpwID0gYnVmOworCWNvbnN0IGNoYXIgKmVuZCA9
IGJ1ZiArIFBBR0VfU0laRTsKKwlpbnQgaTsKKworCXAgKz0gc25wcmludGYocCwgZW5kIC0gcCwg
IndrcSBtYXhfYnVzeToiKTsKKwlmb3IgKGkgPSAwOyBwIDwgZW5kICYmIGkgPCBhdWZzX253a3E7
IGkrKykKKwkJcCArPSBzbnByaW50ZihwLCBlbmQgLSBwLCAiICV1IiwgYXVfd2txW2ldLm1heF9i
dXN5KTsKKwlpZiAocCA8IGVuZCkKKwkJcCArPSBzbnByaW50ZihwLCBlbmQgLSBwLCAiLCAldShn
ZW5lcmljKVxuIiwKKwkJCSAgICAgIGF1X3drcVthdWZzX253a3FdLm1heF9idXN5KTsKKworCWlm
IChwIDwgZW5kKQorCQlyZXR1cm4gcCAtIGJ1ZjsKKwllbHNlCisJCXJldHVybiAtRUZCSUc7Cit9
CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgYXVfc3RhdF9hdHRyID0gX19BVFRSX1JP
KHN0YXQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVVGU19ERUJVRworc3RhdGljIHNzaXpl
X3QgZGVidWdfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmlidXRl
ICphdHRyLAorCQkJICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIs
IGF1X2RlYnVnX3Rlc3QoKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3N0b3JlKHN0cnVj
dCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjb25z
dCBjaGFyICpidWYsIHNpemVfdCBzeikKK3sKKwlMS1RSVHJhY2UoIiUuKnNcbiIsICh1bnNpZ25l
ZCBpbnQpc3osIGJ1Zik7CisKKwlpZiAodW5saWtlbHkoIXN6IHx8ICgqYnVmICE9ICcwJyAmJiAq
YnVmICE9ICcxJykpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoKmJ1ZiA9PSAnMCcp
CisJCWF1X2RlYnVnX29mZigpOworCWVsc2UgaWYgKCpidWYgPT0gJzEnKQorCQlhdV9kZWJ1Z19v
bigpOworCXJldHVybiBzejsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBhdV9k
ZWJ1Z19hdHRyID0gX19BVFRSKGRlYnVnLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCQkJCSAgICBk
ZWJ1Z19zaG93LCBkZWJ1Z19zdG9yZSk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1
dGUgKmF1X2F0dHJbXSA9IHsKKyNpZmRlZiBDT05GSUdfQVVGU19MT0NBTAorCSZhdV9jb25maWdf
YXR0ci5hdHRyLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FVRlNfU1RBVAorCSZhdV9zdGF0X2F0
dHIuYXR0ciwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BVUZTX0RFQlVHCisJJmF1X2RlYnVnX2F0
dHIuYXR0ciwKKyNlbmRpZgorCU5VTEwsCS8qIG5lZWQgdG8gTlVMTCB0ZXJtaW5hdGUgdGhlIGxp
c3Qgb2YgYXR0cmlidXRlcyAqLworfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAg
YXVfYXR0cl9ncm91cF9ib2R5ID0geworCS5hdHRycyA9IGF1X2F0dHIKK307CisKK3N0cnVjdCBh
dHRyaWJ1dGVfZ3JvdXAgKmF1X2F0dHJfZ3JvdXAgPSAmYXVfYXR0cl9ncm91cF9ib2R5OworCisv
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiB0aGV5IGFyZSBjb3BpZWQgZnJvbSBsaW51eC9s
aWIva29iamVjdC5jLAorICogYW5kIHdpbGwgYmUgZXhwb3J0ZWQgaW4gdGhlIGZ1dHVyZS4KKyAq
Lworc3RhdGljIHNzaXplX3QgYXVfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1
Y3QgYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qga29ial9h
dHRyaWJ1dGUgKmthdHRyOworCXNzaXplX3QgcmV0ID0gLUVJTzsKKworCWthdHRyID0gY29udGFp
bmVyX29mKGF0dHIsIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSwgYXR0cik7CisJaWYgKGthdHRyLT5z
aG93KQorCQlyZXQgPSBrYXR0ci0+c2hvdyhrb2JqLCBrYXR0ciwgYnVmKTsKKwlyZXR1cm4gcmV0
OworfQorCisjaWZkZWYgQ09ORklHX0FVRlNfREVCVUcKK3N0YXRpYyBzc2l6ZV90IGF1X2F0dHJf
c3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkg
ICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBrb2JqX2F0dHJp
YnV0ZSAqa2F0dHI7CisJc3NpemVfdCByZXQgPSAtRUlPOworCisJa2F0dHIgPSBjb250YWluZXJf
b2YoYXR0ciwgc3RydWN0IGtvYmpfYXR0cmlidXRlLCBhdHRyKTsKKwlpZiAoa2F0dHItPnN0b3Jl
KQorCQlyZXQgPSBrYXR0ci0+c3RvcmUoa29iaiwga2F0dHIsIGJ1ZiwgY291bnQpOworCXJldHVy
biByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgc3lzYXVmc19vcHMg
PSB7CisJLnNob3cgICA9IGF1X2F0dHJfc2hvdywKKyNpZmRlZiBDT05GSUdfQVVGU19ERUJVRwor
CS5zdG9yZSAgPSBhdV9hdHRyX3N0b3JlCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29i
al90eXBlIGF1X2t0eXBlX2JvZHkgPSB7CisJLnN5c2ZzX29wcyA9ICZzeXNhdWZzX29wcworfTsK
K3N0cnVjdCBrb2JqX3R5cGUgKmF1X2t0eXBlID0gJmF1X2t0eXBlX2JvZHk7CisKKy8qIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gKi8KKworaW50IHN5c2F1ZnNfc2JpX3hpbm8oc3RydWN0IHNlcV9maWxlICpzZXEs
IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IGVyciwgZGxndDsKKwlzdHJ1Y3QgYXVf
c2JpbmZvICpzYmluZm87CisJdW5zaWduZWQgaW50IG1udF9mbGFnczsKKwlhdWZzX2JpbmRleF90
IGJlbmQsIGJpbmRleDsKKwlzdHJ1Y3QgZmlsZSAqeGY7CisJc3RydWN0IGtzdGF0IHN0OworCisJ
QXVUcmFjZUVudGVyKCk7CisKKwlzYmluZm8gPSBhdV9zYmkoc2IpOworCW1udF9mbGFncyA9IGF1
X21udGZsYWdzKHNiKTsKKwlpZiAodW5saWtlbHkoIWF1X29wdF90ZXN0KG1udF9mbGFncywgWElO
TykpKSB7CisjaWZkZWYgQ09ORklHX0FVRlNfREVCVUcKKwkJQXVEZWJ1Z09uKHNiaW5mby0+c2lf
eGliKTsKKwkJYmVuZCA9IGF1X3NiZW5kKHNiKTsKKwkJZm9yIChiaW5kZXggPSAwOyBiaW5kZXgg
PD0gYmVuZDsgYmluZGV4KyspCisJCQlBdURlYnVnT24oYXVfc2JyKHNiLCBiaW5kZXgpLT5icl94
aW5vKTsKKyNlbmRpZgorCQllcnIgPSAwOworCQlnb3RvIG91dDsgLyogc3VjY2VzcyAqLworCX0K
KworCWRsZ3QgPSAhIWF1X29wdF90ZXN0X2RsZ3QobW50X2ZsYWdzKTsKKwl4ZiA9IHNiaW5mby0+
c2lfeGliOworCWVyciA9IHZmc3ViX2dldGF0dHIoeGYtPmZfdmZzbW50LCB4Zi0+Zl9kZW50cnks
ICZzdCwgZGxndCk7CisJaWYgKCFlcnIpCisJCXNlcV9wcmludGYoc2VxLCAiJUx1eCVsdSAlTGRc
biIsCisJCQkgICBzdC5ibG9ja3MsIHN0LmJsa3NpemUsIChsb25nIGxvbmcpc3Quc2l6ZSk7CisJ
ZWxzZQorCQlzZXFfcHJpbnRmKHNlcSwgImVyciAlZFxuIiwgZXJyKTsKKworCWJlbmQgPSBhdV9z
YmVuZChzYik7CisJZm9yIChiaW5kZXggPSAwOyAhZXJyICYmIGJpbmRleCA8PSBiZW5kOyBiaW5k
ZXgrKykgeworCQl4ZiA9IGF1X3NicihzYiwgYmluZGV4KS0+YnJfeGlubzsKKwkJaWYgKCF4ZikK
KwkJCWNvbnRpbnVlOworCQlzZXFfcHJpbnRmKHNlcSwgIiVkOiAiLCBiaW5kZXgpOworCQllcnIg
PSB2ZnN1Yl9nZXRhdHRyKHhmLT5mX3Zmc21udCwgeGYtPmZfZGVudHJ5LCAmc3QsIGRsZ3QpOwor
CQlpZiAoIWVycikKKwkJCXNlcV9wcmludGYoc2VxLCAiJWQsICVMdXglbHUgJUxkXG4iLAorCQkJ
CSAgIGZpbGVfY291bnQoeGYpLCBzdC5ibG9ja3MsIHN0LmJsa3NpemUsCisJCQkJICAgKGxvbmcg
bG9uZylzdC5zaXplKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsICJlcnIgJWRcbiIsIGVy
cik7CisJfQorCisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisv
KgorICogdGhlIGxpZmV0aW1lIG9mIGJyYW5jaCBpcyBpbmRlcGVuZGVudCBmcm9tIHRoZSBlbnRy
eSB1bmRlciBzeXNmcy4KKyAqIHN5c2ZzIGhhbmRsZXMgdGhlIGxpZmV0aW1lIG9mIHRoZSBlbnRy
eSwgYW5kIG5ldmVyIGNhbGwgLT5zaG93KCkgYWZ0ZXIgaXQgaXMKKyAqIHVubGlua2VkLgorICov
CisjZGVmaW5lIFN5c2F1ZnNCcl9QUkVGSVggImJyIgorc3RhdGljIGludCBzeXNhdWZzX3NiaV9i
cihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgYXVm
c19iaW5kZXhfdCBiaW5kZXgpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290Owor
CXN0cnVjdCBhdV9icmFuY2ggKmJyOworCXN0cnVjdCBwYXRoIHBhdGg7CisKKwlMS1RSVHJhY2Uo
ImIlZFxuIiwgYmluZGV4KTsKKworCWVyciA9IC1FTk9FTlQ7CisJaWYgKHVubGlrZWx5KGF1X3Ni
ZW5kKHNiKSA8IGJpbmRleCkpCisJCWdvdG8gb3V0OworCisJZXJyID0gMDsKKwlyb290ID0gc2It
PnNfcm9vdDsKKwlkaV9yZWFkX2xvY2tfcGFyZW50KHJvb3QsICFBdUxvY2tfSVIpOworCWJyID0g
YXVfc2JyKHNiLCBiaW5kZXgpOworCXBhdGgubW50ID0gYnItPmJyX21udDsKKwlwYXRoLmRlbnRy
eSA9IGF1X2hfZHB0cihyb290LCBiaW5kZXgpOworCXNlcV9wYXRoKHNlcSwgJnBhdGgsIGF1X2Vz
Y19jaGFycyk7CisJZGlfcmVhZF91bmxvY2socm9vdCwgIUF1TG9ja19JUik7CisJc2VxX3ByaW50
ZihzZXEsICI9JXNcbiIsIGF1X29wdHN0cl9icl9wZXJtKGJyLT5icl9wZXJtKSk7CisKKyBvdXQ6
CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g
Ki8KKworc3RhdGljIHN0cnVjdCBzZXFfZmlsZSAqYXVfc2VxKGNoYXIgKnAsIHNzaXplX3QgbGVu
KQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCisJc2VxID0ga3phbGxvYyhzaXplb2YoKnNl
cSksIEdGUF9URU1QT1JBUlkpOworCWlmIChzZXEpIHsKKwkJLy9tdXRleF9pbml0KCZzZXEubG9j
ayk7CisJCXNlcS0+YnVmID0gcDsKKwkJc2VxLT5jb3VudCA9IDA7CisJCXNlcS0+c2l6ZSA9IGxl
bjsKKwkJcmV0dXJuIHNlcTsgLyogc3VjY2VzcyAqLworCX0KKworCXNlcSA9IEVSUl9QVFIoLUVO
T01FTSk7CisJQXVUcmFjZUVyclB0cihzZXEpOworCXJldHVybiBzZXE7Cit9CisKKy8vdG9kbzog
ZmlsZSBzaXplIG1heSBleGNlZWQgUEFHRV9TSVpFCitzc2l6ZV90IHN5c2F1ZnNfc2JpX3Nob3co
c3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAq
YnVmKQoreworCXNzaXplX3QgZXJyOworCXN0cnVjdCBhdV9zYmluZm8gKnNiaW5mbzsKKwlzdHJ1
Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCWNoYXIgKm5hbWU7
CisJc3RydWN0IGF0dHJpYnV0ZSAqKmNhdHRyOworCisJTEtUUlRyYWNlKCIlcy8lc1xuIiwga29i
amVjdF9uYW1lKGtvYmopLCBhdHRyLT5uYW1lKTsKKworCXNiaW5mbyA9IGNvbnRhaW5lcl9vZihr
b2JqLCBzdHJ1Y3QgYXVfc2JpbmZvLCBzaV9rb2JqKTsKKwlzYiA9IHNiaW5mby0+c2lfc2I7CisJ
c2lfbm9mbHVzaF9yZWFkX2xvY2soc2IpOworCisJc2VxID0gYXVfc2VxKGJ1ZiwgUEFHRV9TSVpF
KTsKKwllcnIgPSBQVFJfRVJSKHNlcSk7CisJaWYgKElTX0VSUihzZXEpKQorCQlnb3RvIG91dDsK
KworCW5hbWUgPSAodm9pZCAqKWF0dHItPm5hbWU7CisJY2F0dHIgPSBhdV9zYmlfYXR0cnM7CisJ
d2hpbGUgKCpjYXR0cikgeworCQlpZiAoIXN0cmNtcChuYW1lLCAoKmNhdHRyKS0+bmFtZSkpIHsK
KwkJCWVyciA9IGNvbnRhaW5lcl9vZigqY2F0dHIsIHN0cnVjdCBhdV9zYmlfYXR0ciwgYXR0cikK
KwkJCQktPnNob3coc2VxLCBzYik7CisJCQlnb3RvIG91dF9zZXE7CisJCX0KKwkJY2F0dHIrKzsK
Kwl9CisKKwlpZiAoIXN0cm5jbXAobmFtZSwgU3lzYXVmc0JyX1BSRUZJWCwgc2l6ZW9mKFN5c2F1
ZnNCcl9QUkVGSVgpIC0gMSkpIHsKKwkJbmFtZSArPSBzaXplb2YoU3lzYXVmc0JyX1BSRUZJWCkg
LSAxOworCQllcnIgPSBzeXNhdWZzX3NiaV9icihzZXEsIHNiLCBzaW1wbGVfc3RydG9sKG5hbWUs
IE5VTEwsIDEwKSk7CisJCWdvdG8gb3V0X3NlcTsKKwl9CisJQlVHKCk7CisKKyBvdXRfc2VxOgor
CWlmICghZXJyKSB7CisJCWVyciA9IHNlcS0+Y291bnQ7CisJCS8qIHN5c2ZzIGxpbWl0ICovCisJ
CWlmICh1bmxpa2VseShlcnIgPT0gUEFHRV9TSVpFKSkKKwkJCWVyciA9IC1FRkJJRzsKKwl9CisJ
a2ZyZWUoc2VxKTsKKyBvdXQ6CisJc2lfcmVhZF91bmxvY2soc2IpOworCUF1VHJhY2VFcnIoZXJy
KTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgc3lzYXVm
c19icl9pbml0KHN0cnVjdCBhdV9icmFuY2ggKmJyKQoreworCWJyLT5icl9hdHRyLm5hbWUgPSBi
ci0+YnJfbmFtZTsKKwlici0+YnJfYXR0ci5tb2RlID0gU19JUlVHTzsKKwlici0+YnJfYXR0ci5v
d25lciA9IFRISVNfTU9EVUxFOworfQorCit2b2lkIHN5c2F1ZnNfYnJzX2RlbChzdHJ1Y3Qgc3Vw
ZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRleF90IGJpbmRleCkKK3sKKwlzdHJ1Y3QgYXVfc2JpbmZv
ICpzYmluZm87CisJYXVmc19iaW5kZXhfdCBiZW5kOworCisJTEtUUlRyYWNlKCJiJWRcbiIsIGJp
bmRleCk7CisKKwlpZiAoIXN5c2F1ZnNfYnJzKQorCQlyZXR1cm47CisKKwlzYmluZm8gPSBhdV9z
Ymkoc2IpOworCWJlbmQgPSBhdV9zYmVuZChzYik7CisJZm9yICg7IGJpbmRleCA8PSBiZW5kOyBi
aW5kZXgrKykKKwkJc3lzZnNfcmVtb3ZlX2ZpbGUoJnNiaW5mby0+c2lfa29iaiwKKwkJCQkgICZh
dV9zYnIoc2IsIGJpbmRleCktPmJyX2F0dHIpOworfQorCit2b2lkIHN5c2F1ZnNfYnJzX2FkZChz
dHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRleF90IGJpbmRleCkKK3sKKwlpbnQgZXJy
OworCXN0cnVjdCBrb2JqZWN0ICprb2JqOworCWF1ZnNfYmluZGV4X3QgYmVuZDsKKwlzdHJ1Y3Qg
YXVfYnJhbmNoICpicjsKKworCUxLVFJUcmFjZSgiYiVkXG4iLCBiaW5kZXgpOworCisJaWYgKCFz
eXNhdWZzX2JycykKKwkJcmV0dXJuOworCisJa29iaiA9ICZhdV9zYmkoc2IpLT5zaV9rb2JqOwor
CWJlbmQgPSBhdV9zYmVuZChzYik7CisJZm9yICg7IGJpbmRleCA8PSBiZW5kOyBiaW5kZXgrKykg
eworCQliciA9IGF1X3NicihzYiwgYmluZGV4KTsKKwkJc25wcmludGYoYnItPmJyX25hbWUsIHNp
emVvZihici0+YnJfbmFtZSksCisJCQkgU3lzYXVmc0JyX1BSRUZJWCAiJWQiLCBiaW5kZXgpOwor
CQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZShrb2JqLCAmYnItPmJyX2F0dHIpOworCQlpZiAodW5s
aWtlbHkoZXJyKSkKKwkJCUF1V2FybigiZmFpbGVkICVzIHVuZGVyIHN5c2ZzKCVkKVxuIiwgYnIt
PmJyX25hbWUsIGVycik7CisJfQorfQpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5v
cmlnL2ZzL2F1ZnMvc3lzcnEuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvc3lzcnEu
YwotLS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvc3lzcnEuYwkxOTcwLTAx
LTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvc3lz
cnEuYwkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9ncmFtLCBh
dWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2Rp
ZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBT
b2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29y
LCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogbWFnaWMgc3lzcnEg
aGFubGRlcgorICoKKyAqICRJZDogc3lzcnEuYyx2IDEuNCAyMDA4LzA1LzA0IDIzOjUzOjI3IHNm
anJvIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgv
bW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51
eC9zeXNycS5oPgorI2luY2x1ZGUgImF1ZnMuaCIKKworc3RhdGljIHZvaWQgc3lzcnFfc2Ioc3Ry
dWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwljaGFyICpwbGV2ZWw7CisJc3RydWN0IGlub2RlICpp
OworCisJcGxldmVsID0gYXVfcGxldmVsOworCWF1X3BsZXZlbCA9IEtFUk5fV0FSTklORzsKKwlh
dV9kZWJ1Z19vbigpOworCisJcHJfd2FybmluZyhBVUZTX05BTUUgIjogc3VwZXJibG9ja1xuIik7
CisJYXVfZHByaV9zYihzYik7CisJcHJfd2FybmluZyhBVUZTX05BTUUgIjogcm9vdCBkZW50cnlc
biIpOworCWF1X2RwcmlfZGVudHJ5KHNiLT5zX3Jvb3QpOworCXByX3dhcm5pbmcoQVVGU19OQU1F
ICI6IGlzb2xhdGVkIGlub2RlXG4iKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZzYi0+c19p
bm9kZXMsIGlfc2JfbGlzdCkKKwkJaWYgKGxpc3RfZW1wdHkoJmktPmlfZGVudHJ5KSkKKwkJCWF1
X2RwcmlfaW5vZGUoaSk7CisKKwlhdV9wbGV2ZWwgPSBwbGV2ZWw7CisJYXVfZGVidWdfb2ZmKCk7
Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogbW9kdWxlIHBhcmFtZXRlciAqLworc3Rh
dGljIGNoYXIgKmF1ZnNfc3lzcnFfa2V5ID0gImEiOworbW9kdWxlX3BhcmFtX25hbWVkKHN5c3Jx
LCBhdWZzX3N5c3JxX2tleSwgY2hhcnAsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhzeXNy
cSwgIk1hZ2ljU3lzUnEga2V5IGZvciAiIEFVRlNfTkFNRSk7CisKK3N0YXRpYyB2b2lkIGF1X3N5
c3JxKGludCBrZXksIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGF1X3NiaW5m
byAqc2JpbmZvOworCisJLy9tdXRleF9sb2NrKCZhdV9zYmlsaXN0X210eCk7CisJbGlzdF9mb3Jf
ZWFjaF9lbnRyeShzYmluZm8sICZhdV9zYmlsaXN0LCBzaV9saXN0KQorCQlzeXNycV9zYihzYmlu
Zm8tPnNpX3NiKTsKKwkvL211dGV4X3VubG9jaygmYXVfc2JpbGlzdF9tdHgpOworfQorCitzdGF0
aWMgc3RydWN0IHN5c3JxX2tleV9vcCBhdV9zeXNycV9vcCA9IHsKKwkuaGFuZGxlcgk9IGF1X3N5
c3JxLAorCS5oZWxwX21zZwk9ICJBdWZzIiwKKwkuYWN0aW9uX21zZwk9ICJBdWZzIiwKKwkuZW5h
YmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfRFVNUCAvLz8/Cit9OworCisvKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
ICovCisKK2ludCBfX2luaXQgYXVfc3lzcnFfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisJY2hh
ciBrZXk7CisKKwllcnIgPSAtMTsKKwlrZXkgPSAqYXVmc19zeXNycV9rZXk7CisJaWYgKCdhJyA8
PSBrZXkgJiYga2V5IDw9ICd6JykKKwkJZXJyID0gcmVnaXN0ZXJfc3lzcnFfa2V5KGtleSwgJmF1
X3N5c3JxX29wKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJQXVFcnIoImVyciAlZCwgc3lzcnE9
JWNcbiIsIGVyciwga2V5KTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGF1X3N5c3JxX2Zpbih2
b2lkKQoreworCWludCBlcnI7CisJZXJyID0gdW5yZWdpc3Rlcl9zeXNycV9rZXkoKmF1ZnNfc3lz
cnFfa2V5LCAmYXVfc3lzcnFfb3ApOworCWlmICh1bmxpa2VseShlcnIpKQorCQlBdUVycigiZXJy
ICVkIChpZ25vcmVkKVxuIiwgZXJyKTsKK30KZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40LXVuaW9u
ZnMub3JpZy9mcy9hdWZzL3ZkaXIuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvdmRp
ci5jCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy92ZGlyLmMJMTk3MC0w
MS0wMSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL3Zk
aXIuYwkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEsOTM0IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9n
cmFtLCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
ciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisg
KiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUg
RnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRo
IEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogdmlydHVh
bCBvciB2ZXJ0aWNhbCBkaXJlY3RvcnkKKyAqCisgKiAkSWQ6IHZkaXIuYyx2IDEuMyAyMDA4LzA0
LzI4IDAzOjA1OjQ4IHNmanJvIEV4cCAkCisgKi8KKworI2luY2x1ZGUgImF1ZnMuaCIKKworc3Rh
dGljIGludCBjYWxjX3NpemUoaW50IG5hbWVsZW4pCit7CisJaW50IHN6OworCisJc3ogPSBzaXpl
b2Yoc3RydWN0IGF1X3ZkaXJfZGUpICsgbmFtZWxlbjsKKwlpZiAoc2l6ZW9mKGlub190KSA9PSBz
aXplb2YobG9uZykpIHsKKwkJY29uc3QgaW50IG1hc2sgPSBzaXplb2YoaW5vX3QpIC0gMTsKKwkJ
aWYgKHN6ICYgbWFzaykgeworCQkJc3ogKz0gc2l6ZW9mKGlub190KTsKKwkJCXN6ICY9IH5tYXNr
OworCQl9CisJfSBlbHNlIHsKKwl9CisKKwlBdURlYnVnT24oc3ogJSBzaXplb2YoaW5vX3QpKTsK
KwlyZXR1cm4gc3o7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2RlYmxrX2VuZCh1bmlvbiBhdV92ZGly
X2RlYmxrX3AgKnAsCisJCQkgdW5pb24gYXVfdmRpcl9kZWJsa19wICpkZWJsa19lbmQpCit7CisJ
aWYgKGNhbGNfc2l6ZSgwKSA8PSBkZWJsa19lbmQtPnAgLSBwLT5wKSB7CisJCXAtPmRlLT5kZV9z
dHIubGVuID0gMDsKKwkJLy9zbXBfbWIoKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtMTsg
LyogZXJyb3IgKi8KK30KKworLyogcmV0dXJucyB0cnVlIG9yIGZhbHNlICovCitzdGF0aWMgaW50
IGlzX2RlYmxrX2VuZCh1bmlvbiBhdV92ZGlyX2RlYmxrX3AgKnAsCisJCQl1bmlvbiBhdV92ZGly
X2RlYmxrX3AgKmRlYmxrX2VuZCkKK3sKKwlpZiAoY2FsY19zaXplKDApIDw9IGRlYmxrX2VuZC0+
cCAtIHAtPnApCisJCXJldHVybiAhcC0+ZGUtPmRlX3N0ci5sZW47CisJcmV0dXJuIDE7Cit9CisK
K3N0YXRpYyBhdV92ZGlyX2RlYmxrX3QgKmxhc3RfZGVibGsoc3RydWN0IGF1X3ZkaXIgKnZkaXIp
Cit7CisJcmV0dXJuIHZkaXItPnZkX2RlYmxrW3ZkaXItPnZkX25ibGsgLSAxXTsKK30KKwordm9p
ZCBhdV9uaGFzaF9pbml0KHN0cnVjdCBhdV9uaGFzaCAqbmhhc2gpCit7CisJaW50IGk7CisJZm9y
IChpID0gMDsgaSA8IEF1U2l6ZV9OSEFTSDsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQobmhhc2gt
PmhlYWRzICsgaSk7Cit9CisKK3N0cnVjdCBhdV9uaGFzaCAqYXVfbmhhc2hfbmV3KGdmcF90IGdm
cCkKK3sKKwlzdHJ1Y3QgYXVfbmhhc2ggKm5oYXNoOworCisJbmhhc2ggPSBrbWFsbG9jKHNpemVv
Zigqbmhhc2gpLCBnZnApOworCWlmIChuaGFzaCkgeworCQlhdV9uaGFzaF9pbml0KG5oYXNoKTsK
KwkJcmV0dXJuIG5oYXNoOworCX0KKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKK30KKwordm9p
ZCBhdV9uaGFzaF9kZWwoc3RydWN0IGF1X25oYXNoICpuaGFzaCkKK3sKKwlhdV9uaGFzaF9maW4o
bmhhc2gpOworCWtmcmVlKG5oYXNoKTsKK30KKwordm9pZCBhdV9uaGFzaF9tb3ZlKHN0cnVjdCBh
dV9uaGFzaCAqZHN0LCBzdHJ1Y3QgYXVfbmhhc2ggKnNyYykKK3sKKwlpbnQgaTsKKworCUF1VHJh
Y2VFbnRlcigpOworCisJLy9EYmdXaGxpc3Qoc3JjKTsKKwkqZHN0ID0gKnNyYzsKKwlmb3IgKGkg
PSAwOyBpIDwgQXVTaXplX05IQVNIOyBpKyspIHsKKwkJc3RydWN0IGhsaXN0X2hlYWQgKmg7CisJ
CWggPSBkc3QtPmhlYWRzICsgaTsKKwkJaWYgKGgtPmZpcnN0KQorCQkJaC0+Zmlyc3QtPnBwcmV2
ID0gJmgtPmZpcnN0OworCQlJTklUX0hMSVNUX0hFQUQoc3JjLT5oZWFkcyArIGkpOworCX0KKwkv
L0RiZ1dobGlzdChzcmMpOworCS8vRGJnV2hsaXN0KGRzdCk7CisJLy9zbXBfbWIoKTsKK30KKwor
LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGF1X25oYXNoX2ZpbihzdHJ1Y3QgYXVfbmhhc2gg
KndobGlzdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3Qg
YXVfdmRpcl93aCAqdHBvczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zLCAqbjsKKworCUF1VHJh
Y2VFbnRlcigpOworCisJZm9yIChpID0gMDsgaSA8IEF1U2l6ZV9OSEFTSDsgaSsrKSB7CisJCWhl
YWQgPSB3aGxpc3QtPmhlYWRzICsgaTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cG9z
LCBwb3MsIG4sIGhlYWQsIHdoX2hhc2gpIHsKKwkJCS8vaGxpc3RfZGVsKHBvcyk7CisJCQlrZnJl
ZSh0cG9zKTsKKwkJfQorCX0KK30KKworaW50IGF1X25oYXNoX3Rlc3RfbG9uZ2VyX3doKHN0cnVj
dCBhdV9uaGFzaCAqd2hsaXN0LCBhdWZzX2JpbmRleF90IGJ0Z3QsCisJCQkgICAgaW50IGxpbWl0
KQoreworCWludCBuLCBpOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBhdV92
ZGlyX3doICp0cG9zOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisKKwlMS1RSVHJhY2UoImxp
bWl0ICVkXG4iLCBsaW1pdCk7CisJLy9yZXR1cm4gMTsKKworCW4gPSAwOworCWZvciAoaSA9IDA7
IGkgPCBBdVNpemVfTkhBU0g7IGkrKykgeworCQloZWFkID0gd2hsaXN0LT5oZWFkcyArIGk7CisJ
CWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHRwb3MsIHBvcywgaGVhZCwgd2hfaGFzaCkKKwkJCWlmICh0
cG9zLT53aF9iaW5kZXggPT0gYnRndCAmJiArK24gPiBsaW1pdCkKKwkJCQlyZXR1cm4gMTsKKwl9
CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXVfbmFtZV9oYXNoKGNvbnN0
IHVuc2lnbmVkIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBsZW4pCit7CisJcmV0dXJuIChmdWxs
X25hbWVfaGFzaChuYW1lLCBsZW4pICUgQXVTaXplX05IQVNIKTsKK30KKworLyogcmV0dXJucyBm
b3VuZCh0cnVlKSBvciBub3QgKi8KK2ludCBhdV9uaGFzaF90ZXN0X2tub3duX3doKHN0cnVjdCBh
dV9uaGFzaCAqd2hsaXN0LCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwlzdHJ1Y3QgaGxp
c3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgYXVfdmRpcl93aCAqdHBvczsKKwlzdHJ1Y3QgaGxpc3Rf
bm9kZSAqcG9zOworCXN0cnVjdCBhdV92ZGlyX2Rlc3RyICpzdHI7CisKKwlMS1RSVHJhY2UoIiUu
KnNcbiIsIG5hbWVsZW4sIG5hbWUpOworCisJaGVhZCA9IHdobGlzdC0+aGVhZHMgKyBhdV9uYW1l
X2hhc2gobmFtZSwgbmFtZWxlbik7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkodHBvcywgcG9zLCBo
ZWFkLCB3aF9oYXNoKSB7CisJCXN0ciA9ICZ0cG9zLT53aF9zdHI7CisJCUxLVFJUcmFjZSgiJS4q
c1xuIiwgc3RyLT5sZW4sIHN0ci0+bmFtZSk7CisJCWlmIChzdHItPmxlbiA9PSBuYW1lbGVuICYm
ICFtZW1jbXAoc3RyLT5uYW1lLCBuYW1lLCBuYW1lbGVuKSkKKwkJCXJldHVybiAxOworCX0KKwly
ZXR1cm4gMDsKK30KKworaW50IGF1X25oYXNoX2FwcGVuZF93aChzdHJ1Y3QgYXVfbmhhc2ggKndo
bGlzdCwgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCSAgICAgICBpbm9fdCBpbm8sIHVuc2ln
bmVkIGludCBkX3R5cGUsIGF1ZnNfYmluZGV4X3QgYmluZGV4LAorCQkgICAgICAgdW5zaWduZWQg
Y2hhciBzaHdoKQoreworCWludCBlcnI7CisJc3RydWN0IGF1X3ZkaXJfZGVzdHIgKnN0cjsKKwlz
dHJ1Y3QgYXVfdmRpcl93aCAqd2g7CisKKwlMS1RSVHJhY2UoIiUuKnNcbiIsIG5hbWVsZW4sIG5h
bWUpOworCisJZXJyID0gLUVOT01FTTsKKwl3aCA9IGttYWxsb2Moc2l6ZW9mKCp3aCkgKyBuYW1l
bGVuLCBHRlBfVEVNUE9SQVJZKTsKKwlpZiAodW5saWtlbHkoIXdoKSkKKwkJZ290byBvdXQ7CisJ
ZXJyID0gMDsKKwl3aC0+d2hfYmluZGV4ID0gYmluZGV4OworCWlmICh1bmxpa2VseShzaHdoKSkK
KwkJYXVfc2h3aF9pbml0X3doKHdoLCBpbm8sIGRfdHlwZSk7CisJc3RyID0gJndoLT53aF9zdHI7
CisJc3RyLT5sZW4gPSBuYW1lbGVuOworCW1lbWNweShzdHItPm5hbWUsIG5hbWUsIG5hbWVsZW4p
OworCWhsaXN0X2FkZF9oZWFkKCZ3aC0+d2hfaGFzaCwKKwkJICAgICAgIHdobGlzdC0+aGVhZHMg
KyBhdV9uYW1lX2hhc2gobmFtZSwgbmFtZWxlbikpOworCS8vc21wX21iKCk7CisKKyBvdXQ6CisJ
QXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
Kwordm9pZCBhdV92ZGlyX2ZyZWUoc3RydWN0IGF1X3ZkaXIgKnZkaXIpCit7CisJYXVfdmRpcl9k
ZWJsa190ICoqZGVibGs7CisKKwlBdVRyYWNlRW50ZXIoKTsKKworCWRlYmxrID0gdmRpci0+dmRf
ZGVibGs7CisJd2hpbGUgKHZkaXItPnZkX25ibGstLSkgeworCQlrZnJlZSgqZGVibGspOworCQlk
ZWJsaysrOworCX0KKwlrZnJlZSh2ZGlyLT52ZF9kZWJsayk7CisJYXVfY2FjaGVfZnJlZV92ZGly
KHZkaXIpOworfQorCitzdGF0aWMgaW50IGFwcGVuZF9kZWJsayhzdHJ1Y3QgYXVfdmRpciAqdmRp
cikKK3sKKwlpbnQgZXJyLCBzeiwgaTsKKwlhdV92ZGlyX2RlYmxrX3QgKipvOworCXVuaW9uIGF1
X3ZkaXJfZGVibGtfcCBwLCBkZWJsa19lbmQ7CisKKwlBdVRyYWNlRW50ZXIoKTsKKworCWVyciA9
IC1FTk9NRU07CisJc3ogPSBzaXplb2YoKm8pICogdmRpci0+dmRfbmJsazsKKwlvID0gYXVfa3py
ZWFsbG9jKHZkaXItPnZkX2RlYmxrLCBzeiwgc3ogKyBzaXplb2YoKm8pLCBHRlBfS0VSTkVMKTsK
KwlpZiAodW5saWtlbHkoIW8pKQorCQlnb3RvIG91dDsKKwl2ZGlyLT52ZF9kZWJsayA9IG87CisJ
cC5kZWJsayA9IGttYWxsb2Moc2l6ZW9mKCpwLmRlYmxrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHAu
ZGVibGspIHsKKwkJaSA9IHZkaXItPnZkX25ibGsrKzsKKwkJdmRpci0+dmRfZGVibGtbaV0gPSBw
LmRlYmxrOworCQl2ZGlyLT52ZF9sYXN0LmkgPSBpOworCQl2ZGlyLT52ZF9sYXN0LnAucCA9IHAu
cDsKKwkJZGVibGtfZW5kLmRlYmxrID0gcC5kZWJsayArIDE7CisJCWVyciA9IHNldF9kZWJsa19l
bmQoJnAsICZkZWJsa19lbmQpOworCQlBdURlYnVnT24oZXJyKTsKKwl9CisKKyBvdXQ6CisJQXVU
cmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXVfdmRpciAq
YWxsb2NfdmRpcih2b2lkKQoreworCXN0cnVjdCBhdV92ZGlyICp2ZGlyOworCWludCBlcnI7CisK
KwlBdVRyYWNlRW50ZXIoKTsKKworCWVyciA9IC1FTk9NRU07CisJdmRpciA9IGF1X2NhY2hlX2Fs
bG9jX3ZkaXIoKTsKKwlpZiAodW5saWtlbHkoIXZkaXIpKQorCQlnb3RvIG91dDsKKwl2ZGlyLT52
ZF9kZWJsayA9IGt6YWxsb2Moc2l6ZW9mKCp2ZGlyLT52ZF9kZWJsayksIEdGUF9LRVJORUwpOwor
CWlmICh1bmxpa2VseSghdmRpci0+dmRfZGVibGspKQorCQlnb3RvIG91dF9mcmVlOworCisJdmRp
ci0+dmRfbmJsayA9IDA7CisJdmRpci0+dmRfdmVyc2lvbiA9IDA7CisJdmRpci0+dmRfamlmZnkg
PSAwOworCWVyciA9IGFwcGVuZF9kZWJsayh2ZGlyKTsKKwlpZiAoIWVycikKKwkJcmV0dXJuIHZk
aXI7IC8qIHN1Y2Nlc3MgKi8KKworCWtmcmVlKHZkaXItPnZkX2RlYmxrKTsKKworIG91dF9mcmVl
OgorCWF1X2NhY2hlX2ZyZWVfdmRpcih2ZGlyKTsKKyBvdXQ6CisJdmRpciA9IEVSUl9QVFIoZXJy
KTsKKwlBdVRyYWNlRXJyUHRyKHZkaXIpOworCXJldHVybiB2ZGlyOworfQorCitzdGF0aWMgaW50
IHJlaW5pdF92ZGlyKHN0cnVjdCBhdV92ZGlyICp2ZGlyKQoreworCWludCBlcnI7CisJdW5pb24g
YXVfdmRpcl9kZWJsa19wIHAsIGRlYmxrX2VuZDsKKworCUF1VHJhY2VFbnRlcigpOworCisJd2hp
bGUgKHZkaXItPnZkX25ibGsgPiAxKSB7CisJCWtmcmVlKHZkaXItPnZkX2RlYmxrW3ZkaXItPnZk
X25ibGsgLSAxXSk7CisJCXZkaXItPnZkX2RlYmxrW3ZkaXItPnZkX25ibGsgLSAxXSA9IE5VTEw7
CisJCXZkaXItPnZkX25ibGstLTsKKwl9CisJcC5kZWJsayA9IHZkaXItPnZkX2RlYmxrWzBdOwor
CWRlYmxrX2VuZC5kZWJsayA9IHAuZGVibGsgKyAxOworCWVyciA9IHNldF9kZWJsa19lbmQoJnAs
ICZkZWJsa19lbmQpOworCUF1RGVidWdPbihlcnIpOworCXZkaXItPnZkX3ZlcnNpb24gPSAwOwor
CXZkaXItPnZkX2ppZmZ5ID0gMDsKKwl2ZGlyLT52ZF9sYXN0LmkgPSAwOworCXZkaXItPnZkX2xh
c3QucC5kZWJsayA9IHZkaXItPnZkX2RlYmxrWzBdOworCS8vc21wX21iKCk7CisJLy9EYmdWZGly
KHZkaXIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGlj
IHZvaWQgZnJlZV9kZWhsaXN0KHN0cnVjdCBhdV9uaGFzaCAqZGVobGlzdCkKK3sKKwlpbnQgaTsK
KwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgYXVfdmRpcl9kZWhzdHIgKnRwb3M7
CisJc3RydWN0IGhsaXN0X25vZGUgKnBvcywgKm47CisKKwlBdVRyYWNlRW50ZXIoKTsKKworCWZv
ciAoaSA9IDA7IGkgPCBBdVNpemVfTkhBU0g7IGkrKykgeworCQloZWFkID0gZGVobGlzdC0+aGVh
ZHMgKyBpOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRwb3MsIHBvcywgbiwgaGVhZCwg
aGFzaCkgeworCQkJLy9obGlzdF9kZWwocG9zKTsKKwkJCWF1X2NhY2hlX2ZyZWVfZGVoc3RyKHRw
b3MpOworCQl9CisJfQorfQorCisvKiByZXR1cm5zIGZvdW5kKHRydWUpIG9yIG5vdCAqLworc3Rh
dGljIGludCB0ZXN0X2tub3duKHN0cnVjdCBhdV9uaGFzaCAqZGVsaXN0LCBjaGFyICpuYW1lLCBp
bnQgbmFtZWxlbikKK3sKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgYXVfdmRp
cl9kZWhzdHIgKnRwb3M7CisJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKKwlzdHJ1Y3QgYXVfdmRp
cl9kZXN0ciAqc3RyOworCisJTEtUUlRyYWNlKCIlLipzXG4iLCBuYW1lbGVuLCBuYW1lKTsKKwor
CWhlYWQgPSBkZWxpc3QtPmhlYWRzICsgYXVfbmFtZV9oYXNoKG5hbWUsIG5hbWVsZW4pOworCWhs
aXN0X2Zvcl9lYWNoX2VudHJ5KHRwb3MsIHBvcywgaGVhZCwgaGFzaCkgeworCQlzdHIgPSB0cG9z
LT5zdHI7CisJCUxLVFJUcmFjZSgiJS4qc1xuIiwgc3RyLT5sZW4sIHN0ci0+bmFtZSk7CisJCWlm
IChzdHItPmxlbiA9PSBuYW1lbGVuICYmICFtZW1jbXAoc3RyLT5uYW1lLCBuYW1lLCBuYW1lbGVu
KSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGFwcGVu
ZF9kZShzdHJ1Y3QgYXVfdmRpciAqdmRpciwgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGlub190
IGlubywKKwkJICAgICB1bnNpZ25lZCBpbnQgZF90eXBlLCBzdHJ1Y3QgYXVfbmhhc2ggKmRlbGlz
dCkKK3sKKwlpbnQgZXJyLCBzejsKKwl1bmlvbiBhdV92ZGlyX2RlYmxrX3AgcCwgKnJvb20sIGRl
YmxrX2VuZDsKKwlzdHJ1Y3QgYXVfdmRpcl9kZWhzdHIgKmRlaHN0cjsKKworCUxLVFJUcmFjZSgi
JS4qcyAlZCwgaSVsdSwgZHQldVxuIiwgbmFtZWxlbiwgbmFtZSwgbmFtZWxlbiwgaW5vLCBkX3R5
cGUpOworCisJcC5kZWJsayA9IGxhc3RfZGVibGsodmRpcik7CisJZGVibGtfZW5kLmRlYmxrID0g
cC5kZWJsayArIDE7CisJcm9vbSA9ICZ2ZGlyLT52ZF9sYXN0LnA7CisJQXVEZWJ1Z09uKHJvb20t
PnAgPCBwLnAgfHwgZGVibGtfZW5kLnAgPD0gcm9vbS0+cAorCQkgIHx8ICFpc19kZWJsa19lbmQo
cm9vbSwgJmRlYmxrX2VuZCkpOworCisJc3ogPSBjYWxjX3NpemUobmFtZWxlbik7CisJaWYgKHVu
bGlrZWx5KHN6ID4gZGVibGtfZW5kLnAgLSByb29tLT5wKSkgeworCQllcnIgPSBhcHBlbmRfZGVi
bGsodmRpcik7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJZ290byBvdXQ7CisJCXAuZGVibGsg
PSBsYXN0X2RlYmxrKHZkaXIpOworCQlkZWJsa19lbmQuZGVibGsgPSBwLmRlYmxrICsgMTsKKwkJ
Ly9zbXBfbWIoKTsKKwkJQXVEZWJ1Z09uKHJvb20tPnAgIT0gcC5wKTsKKwl9CisKKwllcnIgPSAt
RU5PTUVNOworCWRlaHN0ciA9IGF1X2NhY2hlX2FsbG9jX2RlaHN0cigpOworCWlmICh1bmxpa2Vs
eSghZGVoc3RyKSkKKwkJZ290byBvdXQ7CisJZGVoc3RyLT5zdHIgPSAmcm9vbS0+ZGUtPmRlX3N0
cjsKKwlobGlzdF9hZGRfaGVhZCgmZGVoc3RyLT5oYXNoLAorCQkgICAgICAgZGVsaXN0LT5oZWFk
cyArIGF1X25hbWVfaGFzaChuYW1lLCBuYW1lbGVuKSk7CisKKwlyb29tLT5kZS0+ZGVfaW5vID0g
aW5vOworCXJvb20tPmRlLT5kZV90eXBlID0gZF90eXBlOworCXJvb20tPmRlLT5kZV9zdHIubGVu
ID0gbmFtZWxlbjsKKwltZW1jcHkocm9vbS0+ZGUtPmRlX3N0ci5uYW1lLCBuYW1lLCBuYW1lbGVu
KTsKKworCWVyciA9IDA7CisJcm9vbS0+cCArPSBzejsKKwlpZiAodW5saWtlbHkoc2V0X2RlYmxr
X2VuZChyb29tLCAmZGVibGtfZW5kKSkpCisJCWVyciA9IGFwcGVuZF9kZWJsayh2ZGlyKTsKKwkv
L3NtcF9tYigpOworCisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQor
CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYXVfaW5vKHN0cnVjdCBzdXBlcl9i
bG9jayAqc2IsIGF1ZnNfYmluZGV4X3QgYmluZGV4LCBpbm9fdCBoX2lubywKKwkJICBpbm9fdCAq
aW5vKQoreworCWludCBlcnI7CisJc3RydWN0IGF1X3hpbm9fZW50cnkgeGlub2U7CisJc3RhdGlj
IERFRklORV9NVVRFWChtdHgpOworCisJLyogYSByYWNlIGNvbmRpdGlvbiBmb3IgaGFyZGxpbmtz
ICovCisJbXV0ZXhfbG9jaygmbXR4KTsKKwllcnIgPSBhdV94aW5vX3JlYWQoc2IsIGJpbmRleCwg
aF9pbm8sICZ4aW5vZSk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0OworCisJaWYg
KCF4aW5vZS5pbm8pIHsKKwkJLy9zdHJ1Y3QgaW5vZGUgKmhfaW5vZGU7CisJCWVyciA9IC1FSU87
CisJCXhpbm9lLmlubyA9IGF1X3hpbm9fbmV3X2lubyhzYik7CisJCWlmICh1bmxpa2VseSgheGlu
b2UuaW5vKSkKKwkJCWdvdG8gb3V0OworCQllcnIgPSBhdV94aW5vX3dyaXRlKHNiLCBiaW5kZXgs
IGhfaW5vLCAmeGlub2UpOworCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCWdvdG8gb3V0OworCX0K
KworCSppbm8gPSB4aW5vZS5pbm87CisKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZtdHgpOworCUF1
VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGF1X3doX2lubyhz
dHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRleF90IGJpbmRleCwgaW5vX3QgaF9pbm8s
CisJCSAgICAgaW5vX3QgKmlubykKK3sKKyNpZmRlZiBDT05GSUdfQVVGU19TSFdICisJcmV0dXJu
IGF1X2lubyhzYiwgYmluZGV4LCBoX2lubywgaW5vKTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5k
aWYKK30KKworI2RlZmluZSBBdUZpbGxWZGlyX0NBTExFRAkxCisjZGVmaW5lIEF1RmlsbFZkaXJf
U0hXSAkJKDEgPDwgMSkKKyNkZWZpbmUgYXVfZnRlc3RfZmlsbHZkaXIoZmxhZ3MsIG5hbWUpCSgo
ZmxhZ3MpICYgQXVGaWxsVmRpcl8jI25hbWUpCisjZGVmaW5lIGF1X2ZzZXRfZmlsbHZkaXIoZmxh
Z3MsIG5hbWUpCXsgKGZsYWdzKSB8PSBBdUZpbGxWZGlyXyMjbmFtZTsgfQorI2RlZmluZSBhdV9m
Y2xyX2ZpbGx2ZGlyKGZsYWdzLCBuYW1lKQl7IChmbGFncykgJj0gfkF1RmlsbFZkaXJfIyNuYW1l
OyB9CisjaWZuZGVmIENPTkZJR19BVUZTX1NIV0gKKyN1bmRlZiBBdUZpbGxWZGlyX1NIV0gKKyNk
ZWZpbmUgQXVGaWxsVmRpcl9TSFdICQkwCisjZW5kaWYKKworc3RydWN0IGZpbGx2ZGlyX2FyZyB7
CisJc3RydWN0IGZpbGUJCSpmaWxlOworCXN0cnVjdCBhdV92ZGlyIAkqdmRpcjsKKwlzdHJ1Y3Qg
YXVfbmhhc2gJKmRlbGlzdDsKKwlzdHJ1Y3QgYXVfbmhhc2gJKndobGlzdDsKKwlhdWZzX2JpbmRl
eF90CQliaW5kZXg7CisJdW5zaWduZWQgaW50CQlmbGFnczsKKwlpbnQJCQllcnI7Cit9OworCitz
dGF0aWMgaW50IGZpbGx2ZGlyKHZvaWQgKl9fYXJnLCBjb25zdCBjaGFyICpfX25hbWUsIGludCBu
YW1lbGVuLCBsb2ZmX3Qgb2Zmc2V0LAorCQkgICAgdTY0IGhfaW5vLCB1bnNpZ25lZCBpbnQgZF90
eXBlKQoreworCXN0cnVjdCBmaWxsdmRpcl9hcmcgKmFyZyA9IF9fYXJnOworCWNoYXIgKm5hbWUg
PSAodm9pZCAqKV9fbmFtZTsKKwlhdWZzX2JpbmRleF90IGJpbmRleCwgYmVuZDsKKwlzdHJ1Y3Qg
c3VwZXJfYmxvY2sgKnNiOworCWlub190IGlubzsKKworCUxLVFJUcmFjZSgiJS4qcywgbmFtZWxl
biAlZCwgaSVMdSwgZHQldVxuIiwKKwkJICBuYW1lbGVuLCBuYW1lLCBuYW1lbGVuLCAodTY0KWhf
aW5vLCBkX3R5cGUpOworCisJc2IgPSBhcmctPmZpbGUtPmZfZGVudHJ5LT5kX3NiOworCWJlbmQg
PSBhcmctPmJpbmRleDsKKwlhcmctPmVyciA9IDA7CisJYXVfZnNldF9maWxsdmRpcihhcmctPmZs
YWdzLCBDQUxMRUQpOworCS8vc21wX21iKCk7CisJaWYgKG5hbWVsZW4gPD0gQVVGU19XSF9QRlhf
TEVOCisJICAgIHx8IG1lbWNtcChuYW1lLCBBVUZTX1dIX1BGWCwgQVVGU19XSF9QRlhfTEVOKSkg
eworCQlmb3IgKGJpbmRleCA9IDA7IGJpbmRleCA8IGJlbmQ7IGJpbmRleCsrKQorCQkJaWYgKHRl
c3Rfa25vd24oYXJnLT5kZWxpc3QgKyBiaW5kZXgsIG5hbWUsIG5hbWVsZW4pCisJCQkgICAgfHwg
YXVfbmhhc2hfdGVzdF9rbm93bl93aChhcmctPndobGlzdCArIGJpbmRleCwKKwkJCQkJCSAgICAg
IG5hbWUsIG5hbWVsZW4pKQorCQkJCWdvdG8gb3V0OyAvKiBhbHJlYWR5IGV4aXN0cyBvciB3aGl0
ZW91dGVkICovCisKKwkJaW5vID0gMTsgLyogd2h5IGRvZXMgZ2NjIHdhcm5zPyAqLworCQlhcmct
PmVyciA9IGF1X2lubyhzYiwgYmVuZCwgaF9pbm8sICZpbm8pOworCQlpZiAoIWFyZy0+ZXJyKQor
CQkJYXJnLT5lcnIgPSBhcHBlbmRfZGUoYXJnLT52ZGlyLCBuYW1lLCBuYW1lbGVuLCBpbm8sCisJ
CQkJCSAgICAgZF90eXBlLCBhcmctPmRlbGlzdCArIGJlbmQpOworCX0gZWxzZSB7CisJCW5hbWUg
Kz0gQVVGU19XSF9QRlhfTEVOOworCQluYW1lbGVuIC09IEFVRlNfV0hfUEZYX0xFTjsKKwkJZm9y
IChiaW5kZXggPSAwOyBiaW5kZXggPCBiZW5kOyBiaW5kZXgrKykKKwkJCWlmIChhdV9uaGFzaF90
ZXN0X2tub3duX3doKGFyZy0+d2hsaXN0ICsgYmVuZCwgbmFtZSwKKwkJCQkJCSAgIG5hbWVsZW4p
KQorCQkJCWdvdG8gb3V0OyAvKiBhbHJlYWR5IHdoaXRlb3V0ZWQgKi8KKworCQlpbm8gPSAxOyAv
KiBkdW1teSAqLworCQlpZiAodW5saWtlbHkoYXVfZnRlc3RfZmlsbHZkaXIoYXJnLT5mbGFncywg
U0hXSCkpKQorCQkJYXJnLT5lcnIgPSBhdV93aF9pbm8oc2IsIGJlbmQsIGhfaW5vLCAmaW5vKTsK
KwkJaWYgKCFhcmctPmVycikKKwkJCWFyZy0+ZXJyID0gYXVfbmhhc2hfYXBwZW5kX3doCisJCQkJ
KGFyZy0+d2hsaXN0ICsgYmVuZCwgbmFtZSwgbmFtZWxlbiwgaW5vLCBkX3R5cGUsCisJCQkJIGJl
bmQsIGF1X2Z0ZXN0X2ZpbGx2ZGlyKGFyZy0+ZmxhZ3MsIFNIV0gpKTsKKwl9CisKKyBvdXQ6CisJ
aWYgKCFhcmctPmVycikKKwkJYXJnLT52ZGlyLT52ZF9qaWZmeSA9IGppZmZpZXM7CisJLy9zbXBf
bWIoKTsKKwlBdVRyYWNlRXJyKGFyZy0+ZXJyKTsKKwlyZXR1cm4gYXJnLT5lcnI7Cit9CisKK3N0
YXRpYyBpbnQgYXVfaGFuZGxlX3Nod2goc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGF1
X3ZkaXIgKnZkaXIsCisJCQkgIGF1ZnNfYmluZGV4X3QgYnN0YXJ0LCBhdWZzX2JpbmRleF90IGJl
bmQsCisJCQkgIHN0cnVjdCBhdV9uaGFzaCAqX3dobGlzdCwgc3RydWN0IGF1X25oYXNoICpfZGVs
aXN0KQoreworI2lmZGVmIENPTkZJR19BVUZTX1NIV0gKKwlpbnQgZXJyLCBpOworCXN0cnVjdCBo
bGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBhdV92ZGlyX3doICp0cG9zOworCXN0cnVjdCBobGlz
dF9ub2RlICpwb3MsICpuOworCWNoYXIgKnAsICpvOworCXN0cnVjdCBhdV9uaGFzaCAqd2hsaXN0
LCAqZGVsaXN0OworCXN0cnVjdCBhdV92ZGlyX2Rlc3RyICpkZXN0cjsKKwlhdWZzX2JpbmRleF90
IGJpbmRleDsKKworCUF1VHJhY2VFbnRlcigpOworCUF1RGVidWdPbighYXVfb3B0X3Rlc3QoYXVf
bW50ZmxhZ3Moc2IpLCBTSFdIKSk7CisKKwllcnIgPSAtRU5PTUVNOworCW8gPSBwID0gX19nZXRu
YW1lKCk7CisJaWYgKHVubGlrZWx5KCFwKSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAwOworCW1l
bWNweShwLCBBVUZTX1dIX1BGWCwgQVVGU19XSF9QRlhfTEVOKTsKKwlwICs9IEFVRlNfV0hfUEZY
X0xFTjsKKwlmb3IgKGJpbmRleCA9IGJzdGFydDsgIWVyciAmJiBiaW5kZXggPD0gYmVuZDsgYmlu
ZGV4KyspIHsKKwkJd2hsaXN0ID0gX3dobGlzdCArIGJpbmRleDsKKwkJZGVsaXN0ID0gX2RlbGlz
dCArIGJpbmRleDsKKworCQlmb3IgKGkgPSAwOyBpIDwgQXVTaXplX05IQVNIOyBpKyspIHsKKwkJ
CWhlYWQgPSB3aGxpc3QtPmhlYWRzICsgaTsKKwkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUo
dHBvcywgcG9zLCBuLCBoZWFkLCB3aF9oYXNoKSB7CisJCQkJZGVzdHIgPSAmdHBvcy0+d2hfc3Ry
OworCQkJCW1lbWNweShwLCBkZXN0ci0+bmFtZSwgZGVzdHItPmxlbik7CisJCQkJZXJyID0gYXBw
ZW5kX2RlKHZkaXIsIG8sCisJCQkJCQlkZXN0ci0+bGVuICsgQVVGU19XSF9QRlhfTEVOLAorCQkJ
CQkJdHBvcy0+d2hfaW5vLCB0cG9zLT53aF90eXBlLAorCQkJCQkJZGVsaXN0KTsKKwkJCQlpZiAo
dW5saWtlbHkoZXJyKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlfX3B1dG5hbWUo
byk7CisKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7CisjZWxzZQorCXJl
dHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgYXVfZG9fcmVhZF92ZGlyKHN0cnVjdCBm
aWxsdmRpcl9hcmcgKmFyZykKK3sKKwlpbnQgZXJyLCBkbGd0LCBzaHdoOworCWF1ZnNfYmluZGV4
X3QgYmVuZCwgYmluZGV4LCBic3RhcnQ7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwl1bnNp
Z25lZCBpbnQgbW50X2ZsYWdzOworCXN0cnVjdCBmaWxlICpoZjsKKwlsb2ZmX3Qgb2Zmc2V0Owor
CisJQXVUcmFjZUVudGVyKCk7CisKKwllcnIgPSAtRU5PTUVNOworCWJlbmQgPSBhdV9mYmVuZChh
cmctPmZpbGUpOworCWFyZy0+ZGVsaXN0ID0ga21hbGxvYyhzaXplb2YoKmFyZy0+ZGVsaXN0KSAq
IChiZW5kICsgMSksIEdGUF9URU1QT1JBUlkpOworCWlmICh1bmxpa2VseSghYXJnLT5kZWxpc3Qp
KQorCQlnb3RvIG91dDsKKwlhcmctPndobGlzdCA9IGttYWxsb2Moc2l6ZW9mKCphcmctPndobGlz
dCkgKiAoYmVuZCArIDEpLCBHRlBfVEVNUE9SQVJZKTsKKwlpZiAodW5saWtlbHkoIWFyZy0+d2hs
aXN0KSkKKwkJZ290byBvdXRfZGVsaXN0OworCWVyciA9IDA7CisJZm9yIChiaW5kZXggPSAwOyBi
aW5kZXggPD0gYmVuZDsgYmluZGV4KyspIHsKKwkJYXVfbmhhc2hfaW5pdChhcmctPmRlbGlzdCAr
IGJpbmRleCk7CisJCWF1X25oYXNoX2luaXQoYXJnLT53aGxpc3QgKyBiaW5kZXgpOworCX0KKwor
CXNiID0gYXJnLT5maWxlLT5mX2RlbnRyeS0+ZF9zYjsKKwltbnRfZmxhZ3MgPSBhdV9tbnRmbGFn
cyhzYik7CisJZGxndCA9ICEhYXVfb3B0X3Rlc3RfZGxndChtbnRfZmxhZ3MpOworCWFyZy0+Zmxh
Z3MgPSAwOworCXNod2ggPSAwOworCWlmICh1bmxpa2VseShhdV9vcHRfdGVzdChtbnRfZmxhZ3Ms
IFNIV0gpKSkgeworCQlzaHdoID0gMTsKKwkJYXVfZnNldF9maWxsdmRpcihhcmctPmZsYWdzLCBT
SFdIKTsKKwl9CisJYnN0YXJ0ID0gYXVfZmJzdGFydChhcmctPmZpbGUpOworCWZvciAoYmluZGV4
ID0gYnN0YXJ0OyAhZXJyICYmIGJpbmRleCA8PSBiZW5kOyBiaW5kZXgrKykgeworCQloZiA9IGF1
X2hfZnB0cihhcmctPmZpbGUsIGJpbmRleCk7CisJCWlmICghaGYpCisJCQljb250aW51ZTsKKwor
CQlvZmZzZXQgPSB2ZnN1Yl9sbHNlZWsoaGYsIDAsIFNFRUtfU0VUKTsKKwkJZXJyID0gb2Zmc2V0
OworCQlpZiAodW5saWtlbHkob2Zmc2V0KSkKKwkJCWJyZWFrOworCQlhcmctPmJpbmRleCA9IGJp
bmRleDsKKwkJZG8geworCQkJYXJnLT5lcnIgPSAwOworCQkJYXVfZmNscl9maWxsdmRpcihhcmct
PmZsYWdzLCBDQUxMRUQpOworCQkJLy9zbXBfbWIoKTsKKwkJCWVyciA9IHZmc3ViX3JlYWRkaXIo
aGYsIGZpbGx2ZGlyLCBhcmcsIGRsZ3QpOworCQkJaWYgKGVyciA+PSAwKQorCQkJCWVyciA9IGFy
Zy0+ZXJyOworCQl9IHdoaWxlICghZXJyICYmIGF1X2Z0ZXN0X2ZpbGx2ZGlyKGFyZy0+ZmxhZ3Ms
IENBTExFRCkpOworCX0KKworCWlmICh1bmxpa2VseSghZXJyICYmIHNod2gpKQorCQllcnIgPSBh
dV9oYW5kbGVfc2h3aChzYiwgYXJnLT52ZGlyLCBic3RhcnQsIGJlbmQsIGFyZy0+d2hsaXN0LAor
CQkJCSAgICAgYXJnLT5kZWxpc3QpOworCisJZm9yIChiaW5kZXggPSBic3RhcnQ7IGJpbmRleCA8
PSBiZW5kOyBiaW5kZXgrKykgeworCQlmcmVlX2RlaGxpc3QoYXJnLT5kZWxpc3QgKyBiaW5kZXgp
OworCQlhdV9uaGFzaF9maW4oYXJnLT53aGxpc3QgKyBiaW5kZXgpOworCX0KKwlrZnJlZShhcmct
PndobGlzdCk7CisKKyBvdXRfZGVsaXN0OgorCWtmcmVlKGFyZy0+ZGVsaXN0KTsKKyBvdXQ6CisJ
QXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF92ZGly
KHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbWF5X3JlYWQpCit7CisJaW50IGVyciwgZG9fcmVhZDsK
KwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3Qg
YXVfdmRpciAqdmRpciwgKmFsbG9jYXRlZDsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZTsKKwlzdHJ1
Y3QgZmlsbHZkaXJfYXJnIGFyZzsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCisJZGVudHJ5
ID0gZmlsZS0+Zl9kZW50cnk7CisJTEtUUlRyYWNlKCIlLipzLCBtYXkgJWRcbiIsIEF1RExOUGFp
cihkZW50cnkpLCBtYXlfcmVhZCk7CisJRmlNdXN0V3JpdGVMb2NrKGZpbGUpOworCWlub2RlID0g
ZGVudHJ5LT5kX2lub2RlOworCUlNdXN0TG9jayhpbm9kZSk7CisJSWlNdXN0V3JpdGVMb2NrKGlu
b2RlKTsKKwlBdURlYnVnT24oIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpOworCisJZXJyID0gMDsK
KwlhbGxvY2F0ZWQgPSBOVUxMOworCWRvX3JlYWQgPSAwOworCXNiID0gaW5vZGUtPmlfc2I7CisJ
ZXhwaXJlID0gYXVfc2JpKHNiKS0+c2lfcmRjYWNoZTsKKwl2ZGlyID0gYXVfaXZkaXIoaW5vZGUp
OworCWlmICghdmRpcikgeworCQlBdURlYnVnT24oYXVfZnZkaXJfY2FjaGUoZmlsZSkpOworCQlk
b19yZWFkID0gMTsKKwkJdmRpciA9IGFsbG9jX3ZkaXIoKTsKKwkJZXJyID0gUFRSX0VSUih2ZGly
KTsKKwkJaWYgKElTX0VSUih2ZGlyKSkKKwkJCWdvdG8gb3V0OworCQllcnIgPSAwOworCQlhbGxv
Y2F0ZWQgPSB2ZGlyOworCX0gZWxzZSBpZiAobWF5X3JlYWQKKwkJICAgJiYgKGlub2RlLT5pX3Zl
cnNpb24gIT0gdmRpci0+dmRfdmVyc2lvbgorCQkgICAgICAgfHwgdGltZV9hZnRlcihqaWZmaWVz
LCB2ZGlyLT52ZF9qaWZmeSArIGV4cGlyZSkpKSB7CisJCUxLVFJUcmFjZSgiaXZlciAlTHUsIHZk
dmVyICVsdSwgZXhwICVsdVxuIiwKKwkJCSAgaW5vZGUtPmlfdmVyc2lvbiwgdmRpci0+dmRfdmVy
c2lvbiwKKwkJCSAgdmRpci0+dmRfamlmZnkgKyBleHBpcmUpOworCQlkb19yZWFkID0gMTsKKwkJ
ZXJyID0gcmVpbml0X3ZkaXIodmRpcik7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJZ290byBv
dXQ7CisJfQorCS8vQXVEYmdWZGlyKHZkaXIpOyBnb3RvIG91dDsKKworCWlmICghZG9fcmVhZCkK
KwkJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKworCWFyZy5maWxlID0gZmlsZTsKKwlhcmcudmRp
ciA9IHZkaXI7CisJZXJyID0gYXVfZG9fcmVhZF92ZGlyKCZhcmcpOworCWlmICghZXJyKSB7CisJ
CS8vZmlsZS0+Zl9wb3MgPSAwOworCQl2ZGlyLT52ZF92ZXJzaW9uID0gaW5vZGUtPmlfdmVyc2lv
bjsKKwkJdmRpci0+dmRfbGFzdC5pID0gMDsKKwkJdmRpci0+dmRfbGFzdC5wLmRlYmxrID0gdmRp
ci0+dmRfZGVibGtbMF07CisJCWlmIChhbGxvY2F0ZWQpCisJCQlhdV9zZXRfaXZkaXIoaW5vZGUs
IGFsbG9jYXRlZCk7CisJCS8vQXVEYmdWZGlyKHZkaXIpOworCX0gZWxzZSBpZiAoYWxsb2NhdGVk
KQorCQlhdV92ZGlyX2ZyZWUoYWxsb2NhdGVkKTsKKworIG91dDoKKwlBdVRyYWNlRXJyKGVycik7
CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjb3B5X3ZkaXIoc3RydWN0IGF1X3ZkaXIg
KnRndCwgc3RydWN0IGF1X3ZkaXIgKnNyYykKK3sKKwlpbnQgZXJyLCBpLCByZXJyLCBuOworCisJ
QXVUcmFjZUVudGVyKCk7CisJQXVEZWJ1Z09uKHRndC0+dmRfbmJsayAhPSAxKTsKKwkvL0F1RGJn
VmRpcih0Z3QpOworCisJZXJyID0gLUVOT01FTTsKKwlpZiAodGd0LT52ZF9uYmxrIDwgc3JjLT52
ZF9uYmxrKSB7CisJCWF1X3ZkaXJfZGVibGtfdCAqKnA7CisJCXAgPSBhdV9renJlYWxsb2ModGd0
LT52ZF9kZWJsaywgc2l6ZW9mKCpwKSAqIHRndC0+dmRfbmJsaywKKwkJCQkgc2l6ZW9mKCpwKSAq
IHNyYy0+dmRfbmJsaywgR0ZQX0tFUk5FTCk7CisJCWlmICh1bmxpa2VseSghcCkpCisJCQlnb3Rv
IG91dDsKKwkJdGd0LT52ZF9kZWJsayA9IHA7CisJfQorCisJdGd0LT52ZF9uYmxrID0gc3JjLT52
ZF9uYmxrOworCW4gPSBzcmMtPnZkX25ibGs7CisJbWVtY3B5KHRndC0+dmRfZGVibGtbMF0sIHNy
Yy0+dmRfZGVibGtbMF0sIEF1U2l6ZV9ERUJMSyk7CisJLy90Z3QtPnZkX2xhc3QuaSA9IDA7CisJ
Ly90Z3QtPnZkX2xhc3QucC5kZWJsayA9IHRndC0+dmRfZGVibGtbMF07CisJdGd0LT52ZF92ZXJz
aW9uID0gc3JjLT52ZF92ZXJzaW9uOworCXRndC0+dmRfamlmZnkgPSBzcmMtPnZkX2ppZmZ5Owor
CisJZm9yIChpID0gMTsgaSA8IG47IGkrKykgeworCQl0Z3QtPnZkX2RlYmxrW2ldID0ga21hbGxv
YyhBdVNpemVfREVCTEssIEdGUF9LRVJORUwpOworCQlpZiAodGd0LT52ZF9kZWJsa1tpXSkKKwkJ
CW1lbWNweSh0Z3QtPnZkX2RlYmxrW2ldLCBzcmMtPnZkX2RlYmxrW2ldLAorCQkJICAgICAgIEF1
U2l6ZV9ERUJMSyk7CisJCWVsc2UKKwkJCWdvdG8gb3V0OworCX0KKwkvL3NtcF9tYigpOworCS8v
QXVEYmdWZGlyKHRndCk7CisJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKworIG91dDoKKwlyZXJy
ID0gcmVpbml0X3ZkaXIodGd0KTsKKwlCVUdfT04ocmVycik7CisJQXVUcmFjZUVycihlcnIpOwor
CXJldHVybiBlcnI7Cit9CisKK2ludCBhdV92ZGlyX2luaXQoc3RydWN0IGZpbGUgKmZpbGUpCit7
CisJaW50IGVycjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGlub2RlICppbm9k
ZTsKKwlzdHJ1Y3QgYXVfdmRpciAqdmRpcl9jYWNoZSwgKmFsbG9jYXRlZDsKKworCWRlbnRyeSA9
IGZpbGUtPmZfZGVudHJ5OworCUxLVFJUcmFjZSgiJS4qcywgcG9zICVMZFxuIiwgQXVETE5QYWly
KGRlbnRyeSksIGZpbGUtPmZfcG9zKTsKKwlGaU11c3RXcml0ZUxvY2soZmlsZSk7CisJaW5vZGUg
PSBkZW50cnktPmRfaW5vZGU7CisJSWlNdXN0V3JpdGVMb2NrKGlub2RlKTsKKwlBdURlYnVnT24o
IVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpOworCisJZXJyID0gcmVhZF92ZGlyKGZpbGUsICFmaWxl
LT5mX3Bvcyk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0OworCS8vQXVEYmdWZGly
KGF1X2l2ZGlyKGlub2RlKSk7IGdvdG8gb3V0OworCisJYWxsb2NhdGVkID0gTlVMTDsKKwl2ZGly
X2NhY2hlID0gYXVfZnZkaXJfY2FjaGUoZmlsZSk7CisJaWYgKCF2ZGlyX2NhY2hlKSB7CisJCXZk
aXJfY2FjaGUgPSBhbGxvY192ZGlyKCk7CisJCWVyciA9IFBUUl9FUlIodmRpcl9jYWNoZSk7CisJ
CWlmIChJU19FUlIodmRpcl9jYWNoZSkpCisJCQlnb3RvIG91dDsKKwkJYWxsb2NhdGVkID0gdmRp
cl9jYWNoZTsKKwl9IGVsc2UgaWYgKCFmaWxlLT5mX3BvcyAmJiB2ZGlyX2NhY2hlLT52ZF92ZXJz
aW9uICE9IGZpbGUtPmZfdmVyc2lvbikgeworCQllcnIgPSByZWluaXRfdmRpcih2ZGlyX2NhY2hl
KTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dDsKKwl9IGVsc2UKKwkJcmV0dXJu
IDA7IC8qIHN1Y2Nlc3MgKi8KKwkvL2VyciA9IDA7IEF1RGJnVmRpcih2ZGlyX2NhY2hlKTsgZ290
byBvdXQ7CisKKwllcnIgPSBjb3B5X3ZkaXIodmRpcl9jYWNoZSwgYXVfaXZkaXIoaW5vZGUpKTsK
KwlpZiAoIWVycikgeworCQlmaWxlLT5mX3ZlcnNpb24gPSBpbm9kZS0+aV92ZXJzaW9uOworCQlp
ZiAoYWxsb2NhdGVkKQorCQkJYXVfc2V0X2Z2ZGlyX2NhY2hlKGZpbGUsIGFsbG9jYXRlZCk7CisJ
fSBlbHNlIGlmIChhbGxvY2F0ZWQpCisJCWF1X3ZkaXJfZnJlZShhbGxvY2F0ZWQpOworCisgb3V0
OgorCS8vYXVfZGVidWdfb24oKTsKKwlBdVRyYWNlRXJyKGVycik7CisJLy9hdV9kZWJ1Z19vZmYo
KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgbG9mZl90IGNhbGNfb2Zmc2V0KHN0cnVjdCBh
dV92ZGlyICp2ZGlyKQoreworCWxvZmZfdCBvZmZzZXQ7CisJdW5pb24gYXVfdmRpcl9kZWJsa19w
IHA7CisKKwlwLmRlYmxrID0gdmRpci0+dmRfZGVibGtbdmRpci0+dmRfbGFzdC5pXTsKKwlvZmZz
ZXQgPSB2ZGlyLT52ZF9sYXN0LnAucCAtIHAucDsKKwlvZmZzZXQgKz0gc2l6ZW9mKCpwLmRlYmxr
KSAqIHZkaXItPnZkX2xhc3QuaTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiByZXR1cm5zIHRy
dWUgb3IgZmFsc2UgKi8KK3N0YXRpYyBpbnQgc2Vla192ZGlyKHN0cnVjdCBmaWxlICpmaWxlKQor
eworCWludCB2YWxpZCwgaSwgbjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGF1
X3ZkaXIgKnZkaXJfY2FjaGU7CisJbG9mZl90IG9mZnNldDsKKwl1bmlvbiBhdV92ZGlyX2RlYmxr
X3AgcCwgZGVibGtfZW5kOworCisJZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJTEtUUlRyYWNl
KCIlLipzLCBwb3MgJUxkXG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgZmlsZS0+Zl9wb3MpOworCXZk
aXJfY2FjaGUgPSBhdV9mdmRpcl9jYWNoZShmaWxlKTsKKwlBdURlYnVnT24oIXZkaXJfY2FjaGUp
OworCS8vQXVEYmdWZGlyKHZkaXJfY2FjaGUpOworCisJdmFsaWQgPSAxOworCW9mZnNldCA9IGNh
bGNfb2Zmc2V0KHZkaXJfY2FjaGUpOworCUxLVFJUcmFjZSgib2Zmc2V0ICVMZFxuIiwgb2Zmc2V0
KTsKKwlpZiAoZmlsZS0+Zl9wb3MgPT0gb2Zmc2V0KQorCQlnb3RvIG91dDsKKworCXZkaXJfY2Fj
aGUtPnZkX2xhc3QuaSA9IDA7CisJdmRpcl9jYWNoZS0+dmRfbGFzdC5wLmRlYmxrID0gdmRpcl9j
YWNoZS0+dmRfZGVibGtbMF07CisJaWYgKCFmaWxlLT5mX3BvcykKKwkJZ290byBvdXQ7CisKKwl2
YWxpZCA9IDA7CisJaSA9IGZpbGUtPmZfcG9zIC8gQXVTaXplX0RFQkxLOworCUxLVFJUcmFjZSgi
aSAlZFxuIiwgaSk7CisJaWYgKGkgPj0gdmRpcl9jYWNoZS0+dmRfbmJsaykKKwkJZ290byBvdXQ7
CisKKwluID0gdmRpcl9jYWNoZS0+dmRfbmJsazsKKwlmb3IgKDsgaSA8IG47IGkrKykgeworCQlw
LmRlYmxrID0gdmRpcl9jYWNoZS0+dmRfZGVibGtbaV07CisJCWRlYmxrX2VuZC5kZWJsayA9IHAu
ZGVibGsgKyAxOworCQlvZmZzZXQgPSBpOworCQlvZmZzZXQgKj0gQXVTaXplX0RFQkxLOworCQl3
aGlsZSAoIWlzX2RlYmxrX2VuZCgmcCwgJmRlYmxrX2VuZCkgJiYgb2Zmc2V0IDwgZmlsZS0+Zl9w
b3MpIHsKKwkJCWludCBsOworCQkJbCA9IGNhbGNfc2l6ZShwLmRlLT5kZV9zdHIubGVuKTsKKwkJ
CW9mZnNldCArPSBsOworCQkJcC5wICs9IGw7CisJCX0KKwkJaWYgKCFpc19kZWJsa19lbmQoJnAs
ICZkZWJsa19lbmQpKSB7CisJCQl2YWxpZCA9IDE7CisJCQl2ZGlyX2NhY2hlLT52ZF9sYXN0Lmkg
PSBpOworCQkJdmRpcl9jYWNoZS0+dmRfbGFzdC5wID0gcDsKKwkJCWJyZWFrOworCQl9CisJfQor
Cisgb3V0OgorCS8vc21wX21iKCk7CisJQXVUcmFjZUVycighdmFsaWQpOworCXJldHVybiB2YWxp
ZDsKK30KKworaW50IGF1X3ZkaXJfZmlsbF9kZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGly
ZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlpbnQgZXJyLCBsOworCXN0cnVjdCBkZW50cnkg
KmRlbnRyeTsKKwlzdHJ1Y3QgYXVfdmRpciAqdmRpcl9jYWNoZTsKKwlzdHJ1Y3QgYXVfdmRpcl9k
ZSAqZGU7CisJdW5pb24gYXVfdmRpcl9kZWJsa19wIGRlYmxrX2VuZDsKKworCWRlbnRyeSA9IGZp
bGUtPmZfZGVudHJ5OworCUxLVFJUcmFjZSgiJS4qcywgcG9zICVMZFxuIiwgQXVETE5QYWlyKGRl
bnRyeSksIGZpbGUtPmZfcG9zKTsKKwl2ZGlyX2NhY2hlID0gYXVfZnZkaXJfY2FjaGUoZmlsZSk7
CisJQXVEZWJ1Z09uKCF2ZGlyX2NhY2hlKTsKKwkvL0F1RGJnVmRpcih2ZGlyX2NhY2hlKTsKKwor
CWlmICghc2Vla192ZGlyKGZpbGUpKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgxKSB7CisJCWRl
YmxrX2VuZC5kZWJsaworCQkJPSB2ZGlyX2NhY2hlLT52ZF9kZWJsa1t2ZGlyX2NhY2hlLT52ZF9s
YXN0LmldICsgMTsKKwkJd2hpbGUgKCFpc19kZWJsa19lbmQoJnZkaXJfY2FjaGUtPnZkX2xhc3Qu
cCwgJmRlYmxrX2VuZCkpIHsKKwkJCWRlID0gdmRpcl9jYWNoZS0+dmRfbGFzdC5wLmRlOworCQkJ
TEtUUlRyYWNlKCIlLipzLCBvZmYlTGQsIGklbHUsIGR0JWRcbiIsCisJCQkJICBkZS0+ZGVfc3Ry
LmxlbiwgZGUtPmRlX3N0ci5uYW1lLAorCQkJCSAgZmlsZS0+Zl9wb3MsIGRlLT5kZV9pbm8sIGRl
LT5kZV90eXBlKTsKKwkJCWVyciA9IGZpbGxkaXIoZGlyZW50LCBkZS0+ZGVfc3RyLm5hbWUsIGRl
LT5kZV9zdHIubGVuLAorCQkJCSAgICAgIGZpbGUtPmZfcG9zLCBkZS0+ZGVfaW5vLCBkZS0+ZGVf
dHlwZSk7CisJCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJCUF1VHJhY2VFcnIoZXJyKTsKKwkJ
CQkvL3JldHVybiBlcnI7CisJCQkJLy90b2RvOiBpZ25vcmUgdGhlIGVycm9yIGNhdXNlZCBieSB1
ZGJhLgorCQkJCXJldHVybiAwOworCQkJfQorCisJCQlsID0gY2FsY19zaXplKGRlLT5kZV9zdHIu
bGVuKTsKKwkJCXZkaXJfY2FjaGUtPnZkX2xhc3QucC5wICs9IGw7CisJCQlmaWxlLT5mX3BvcyAr
PSBsOworCQl9CisJCWlmICh2ZGlyX2NhY2hlLT52ZF9sYXN0LmkgPCB2ZGlyX2NhY2hlLT52ZF9u
YmxrIC0gMSkgeworCQkJdmRpcl9jYWNoZS0+dmRfbGFzdC5pKys7CisJCQl2ZGlyX2NhY2hlLT52
ZF9sYXN0LnAuZGVibGsKKwkJCQk9IHZkaXJfY2FjaGUtPnZkX2RlYmxrW3ZkaXJfY2FjaGUtPnZk
X2xhc3QuaV07CisJCQlmaWxlLT5mX3BvcyA9IHNpemVvZigqdmRpcl9jYWNoZS0+dmRfbGFzdC5w
LmRlYmxrKQorCQkJCSogdmRpcl9jYWNoZS0+dmRfbGFzdC5pOworCQkJY29udGludWU7CisJCX0K
KwkJYnJlYWs7CisJfQorCisJLy9zbXBfbWIoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtdXJOIGxp
bnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL3Zmc3ViLmMgbGludXgtMi42LjI1LjQt
dW5pb25mcy9mcy9hdWZzL3Zmc3ViLmMKLS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9m
cy9hdWZzL3Zmc3ViLmMJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1
LjQtdW5pb25mcy9mcy9hdWZzL3Zmc3ViLmMJMjAwOC0wNS0yNSAxMTo1ODo1MyArMDMwMApAQCAt
MCwwICsxLDY0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEp1bmppcm8gT2th
amltYQorICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBw
cm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07
IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNB
CisgKi8KKworLyoKKyAqIHN1Yi1yb3V0aW5lcyBmb3IgVkZTCisgKgorICogJElkOiB2ZnN1Yi5j
LHYgMS4zIDIwMDgvMDUvMTIgMDA6Mjk6MTEgc2Zqcm8gRXhwICQKKyAqLworLy8gSSdtIGdvaW5n
IHRvIHNsaWdodGx5IG1hZAorCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUg
ImF1ZnMuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIHZmc3ViX2FyZ3NfaW5pdChz
dHJ1Y3QgdmZzdWJfYXJncyAqdmFyZ3MsIHN0cnVjdCBhdV9oaW5faWdub3JlICppZ24sCisJCSAg
ICAgaW50IGRsZ3QsIGludCBmb3JjZV91bmxpbmspCit7CisJZG9fdmZzdWJfYXJnc19yZWluaXQo
dmFyZ3MsIGlnbik7CisJdmFyZ3MtPmZsYWdzID0gMDsKKwlpZiAodW5saWtlbHkoZGxndCkpCisJ
CXZmc3ViX2ZzZXQodmFyZ3MtPmZsYWdzLCBETEdUKTsKKwlpZiAoZm9yY2VfdW5saW5rKQorCQl2
ZnN1Yl9mc2V0KHZhcmdzLT5mbGFncywgRk9SQ0VfVU5MSU5LKTsKK30KKworLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLworCitzdHJ1Y3QgZmlsZSAqdmZzdWJfZmlscF9vcGVuKGNvbnN0IGNoYXIgKnBhdGgs
IGludCBvZmxhZ3MsIGludCBtb2RlKQoreworCXN0cnVjdCBmaWxlICplcnI7CisKKwlMS1RSVHJh
Y2UoIiVzXG4iLCBwYXRoKTsKKworCWxvY2tkZXBfb2ZmKCk7CisJZXJyID0gZmlscF9vcGVuKHBh
dGgsIG9mbGFncywgbW9kZSk7CisJbG9ja2RlcF9vbigpOworCWlmICghSVNfRVJSKGVycikpCisJ
CWF1X3VwZGF0ZV9mdXNlX2hfaW5vZGUoZXJyLT5mX3Zmc21udCwgZXJyLT5mX2RlbnRyeSk7IC8q
aWdub3JlKi8KKwlyZXR1cm4gZXJyOworfQorCitpbnQgdmZzdWJfcGF0aF9sb29rdXAoY29uc3Qg
Y2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGZsYWdzLAorCQkgICAgICBzdHJ1Y3QgbmFtZWlkYXRh
ICpuZCkKK3sKKwlpbnQgZXJyOworCisJTEtUUlRyYWNlKCIlc1xuIiwgbmFtZSk7CisKKwkvKiBs
b2NrZGVwX29mZigpOyAqLworCWVyciA9IHBhdGhfbG9va3VwKG5hbWUsIGZsYWdzLCBuZCk7CisJ
LyogbG9ja2RlcF9vbigpOyAqLworCWlmICghZXJyKQorCQlhdV91cGRhdGVfZnVzZV9oX2lub2Rl
KG5kLT5wYXRoLm1udCwgbmQtPnBhdGguZGVudHJ5KTsKKwkvKmlnbm9yZSovCisJcmV0dXJuIGVy
cjsKK30KKworc3RydWN0IGRlbnRyeSAqdmZzdWJfbG9va3VwX29uZV9sZW4oY29uc3QgY2hhciAq
bmFtZSwgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJCSAgICBpbnQgbGVuKQoreworCXN0cnVj
dCBkZW50cnkgKmQ7CisKKwlMS1RSVHJhY2UoIiUuKnMvJS4qc1xuIiwgQXVETE5QYWlyKHBhcmVu
dCksIGxlbiwgbmFtZSk7CisJSU11c3RMb2NrKHBhcmVudC0+ZF9pbm9kZSk7CisKKwlkID0gbG9v
a3VwX29uZV9sZW4obmFtZSwgcGFyZW50LCBsZW4pOworCWlmICghSVNfRVJSKGQpKQorCQlhdV91
cGRhdGVfZnVzZV9oX2lub2RlKE5VTEwsIGQpOyAvKmlnbm9yZSovCisJcmV0dXJuIGQ7Cit9CisK
KyNpZmRlZiBDT05GSUdfQVVGU19MSEFTSF9QQVRDSAorc3RydWN0IGRlbnRyeSAqdmZzdWJfX2xv
b2t1cF9oYXNoKHN0cnVjdCBxc3RyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCisJCQkJ
ICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkOworCisJTEtUUlRy
YWNlKCIlLipzLyUuKnMsIG5kICVkXG4iLAorCQkgIEF1RExOUGFpcihwYXJlbnQpLCBBdUxOUGFp
cihuYW1lKSwgISFuZCk7CisJaWYgKG5kKQorCQlMS1RSVHJhY2UoIm5kezB4JXh9XG4iLCBuZC0+
ZmxhZ3MpOworCUlNdXN0TG9jayhwYXJlbnQtPmRfaW5vZGUpOworCisJZCA9IF9fbG9va3VwX2hh
c2gobmFtZSwgcGFyZW50LCBuZCk7CisJaWYgKCFJU19FUlIoZCkpCisJCWF1X3VwZGF0ZV9mdXNl
X2hfaW5vZGUoTlVMTCwgZCk7IC8qaWdub3JlKi8KKwlyZXR1cm4gZDsKK30KKyNlbmRpZgorCisv
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBkb192ZnN1Yl9jcmVhdGUoc3RydWN0IGlub2RlICpk
aXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCSAgICBzdHJ1Y3QgbmFtZWlk
YXRhICpuZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCisJTEtUUlRy
YWNlKCJpJWx1LCAlLipzLCAweCV4XG4iLCBkaXItPmlfaW5vLCBBdURMTlBhaXIoZGVudHJ5KSwg
bW9kZSk7CisJSU11c3RMb2NrKGRpcik7CisKKwllcnIgPSB2ZnNfY3JlYXRlKGRpciwgZGVudHJ5
LCBtb2RlLCBuZCk7CisJaWYgKCFlcnIpIHsKKwkJbW50ID0gTlVMTDsKKwkJaWYgKG5kKQorCQkJ
bW50ID0gbmQtPnBhdGgubW50OworCQkvKiBkaXIgaW5vZGUgaXMgbG9ja2VkICovCisJCWF1X3Vw
ZGF0ZV9mdXNlX2hfaW5vZGUobW50LCBkZW50cnktPmRfcGFyZW50KTsgLyppZ25vcmUqLworCQlh
dV91cGRhdGVfZnVzZV9oX2lub2RlKG1udCwgZGVudHJ5KTsgLyppZ25vcmUqLworCX0KKwlyZXR1
cm4gZXJyOworfQorCitpbnQgZG9fdmZzdWJfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3Ry
dWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgIGNvbnN0IGNoYXIgKnN5bW5hbWUsIGludCBtb2Rl
KQoreworCWludCBlcnI7CisKKwlMS1RSVHJhY2UoImklbHUsICUuKnMsICVzLCAweCV4XG4iLAor
CQkgIGRpci0+aV9pbm8sIEF1RExOUGFpcihkZW50cnkpLCBzeW1uYW1lLCBtb2RlKTsKKwlJTXVz
dExvY2soZGlyKTsKKworCWVyciA9IHZmc19zeW1saW5rKGRpciwgZGVudHJ5LCBzeW1uYW1lLCBt
b2RlKTsKKwlpZiAoIWVycikgeworCQkvKiBkaXIgaW5vZGUgaXMgbG9ja2VkICovCisJCWF1X3Vw
ZGF0ZV9mdXNlX2hfaW5vZGUoTlVMTCwgZGVudHJ5LT5kX3BhcmVudCk7IC8qaWdub3JlKi8KKwkJ
YXVfdXBkYXRlX2Z1c2VfaF9pbm9kZShOVUxMLCBkZW50cnkpOyAvKmlnbm9yZSovCisJfQorCXJl
dHVybiBlcnI7Cit9CisKK2ludCBkb192ZnN1Yl9ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3Ry
dWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJICAgZGV2X3QgZGV2KQoreworCWludCBl
cnI7CisKKwlMS1RSVHJhY2UoImklbHUsICUuKnMsIDB4JXhcbiIsIGRpci0+aV9pbm8sIEF1RExO
UGFpcihkZW50cnkpLCBtb2RlKTsKKwlJTXVzdExvY2soZGlyKTsKKworCWVyciA9IHZmc19ta25v
ZChkaXIsIGRlbnRyeSwgbW9kZSwgZGV2KTsKKwlpZiAoIWVycikgeworCQkvKiBkaXIgaW5vZGUg
aXMgbG9ja2VkICovCisJCWF1X3VwZGF0ZV9mdXNlX2hfaW5vZGUoTlVMTCwgZGVudHJ5LT5kX3Bh
cmVudCk7IC8qaWdub3JlKi8KKwkJYXVfdXBkYXRlX2Z1c2VfaF9pbm9kZShOVUxMLCBkZW50cnkp
OyAvKmlnbm9yZSovCisJfQorCXJldHVybiBlcnI7Cit9CisKK2ludCBkb192ZnN1Yl9saW5rKHN0
cnVjdCBkZW50cnkgKnNyY19kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkgIHN0cnVjdCBk
ZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyOworCisJTEtUUlRyYWNlKCIlLipzLCBpJWx1LCAl
LipzXG4iLAorCQkgIEF1RExOUGFpcihzcmNfZGVudHJ5KSwgZGlyLT5pX2lubywgQXVETE5QYWly
KGRlbnRyeSkpOworCUlNdXN0TG9jayhkaXIpOworCisJbG9ja2RlcF9vZmYoKTsKKwllcnIgPSB2
ZnNfbGluayhzcmNfZGVudHJ5LCBkaXIsIGRlbnRyeSk7CisJbG9ja2RlcF9vbigpOworCWlmICgh
ZXJyKSB7CisJCUxLVFJUcmFjZSgic3JjX2kgJXAsIGRzdF9pICVwXG4iLAorCQkJICBzcmNfZGVu
dHJ5LT5kX2lub2RlLCBkZW50cnktPmRfaW5vZGUpOworCQkvKiBmdXNlIGhhcyBkaWZmZXJlbnQg
bWVtb3J5IGlub2RlIGZvciB0aGUgc2FtZSBpbnVtYmVyICovCisJCWF1X3VwZGF0ZV9mdXNlX2hf
aW5vZGUoTlVMTCwgc3JjX2RlbnRyeSk7IC8qaWdub3JlKi8KKwkJLyogZGlyIGlub2RlIGlzIGxv
Y2tlZCAqLworCQlhdV91cGRhdGVfZnVzZV9oX2lub2RlKE5VTEwsIGRlbnRyeS0+ZF9wYXJlbnQp
OyAvKmlnbm9yZSovCisJCWF1X3VwZGF0ZV9mdXNlX2hfaW5vZGUoTlVMTCwgZGVudHJ5KTsgLypp
Z25vcmUqLworCX0KKwlyZXR1cm4gZXJyOworfQorCitpbnQgZG9fdmZzdWJfcmVuYW1lKHN0cnVj
dCBpbm9kZSAqc3JjX2Rpciwgc3RydWN0IGRlbnRyeSAqc3JjX2RlbnRyeSwKKwkJICAgIHN0cnVj
dCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IGVycjsKKworCUxL
VFJUcmFjZSgiaSVsdSwgJS4qcywgaSVsdSwgJS4qc1xuIiwKKwkJICBzcmNfZGlyLT5pX2lubywg
QXVETE5QYWlyKHNyY19kZW50cnkpLAorCQkgIGRpci0+aV9pbm8sIEF1RExOUGFpcihkZW50cnkp
KTsKKwlJTXVzdExvY2soZGlyKTsKKwlJTXVzdExvY2soc3JjX2Rpcik7CisKKwlsb2NrZGVwX29m
ZigpOworCWVyciA9IHZmc19yZW5hbWUoc3JjX2Rpciwgc3JjX2RlbnRyeSwgZGlyLCBkZW50cnkp
OworCWxvY2tkZXBfb24oKTsKKwlpZiAoIWVycikgeworCQkvKiBkaXIgaW5vZGUgaXMgbG9ja2Vk
ICovCisJCWF1X3VwZGF0ZV9mdXNlX2hfaW5vZGUoTlVMTCwgZGVudHJ5LT5kX3BhcmVudCk7IC8q
aWdub3JlKi8KKwkJYXVfdXBkYXRlX2Z1c2VfaF9pbm9kZShOVUxMLCBzcmNfZGVudHJ5LT5kX3Bh
cmVudCk7IC8qaWdub3JlKi8KKwkJYXVfdXBkYXRlX2Z1c2VfaF9pbm9kZShOVUxMLCBzcmNfZGVu
dHJ5KTsgLyppZ25vcmUqLworCX0KKwlyZXR1cm4gZXJyOworfQorCitpbnQgZG9fdmZzdWJfbWtk
aXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7
CisJaW50IGVycjsKKworCUxLVFJUcmFjZSgiaSVsdSwgJS4qcywgMHgleFxuIiwgZGlyLT5pX2lu
bywgQXVETE5QYWlyKGRlbnRyeSksIG1vZGUpOworCUlNdXN0TG9jayhkaXIpOworCisJZXJyID0g
dmZzX21rZGlyKGRpciwgZGVudHJ5LCBtb2RlKTsKKwlpZiAoIWVycikgeworCQkvKiBkaXIgaW5v
ZGUgaXMgbG9ja2VkICovCisJCWF1X3VwZGF0ZV9mdXNlX2hfaW5vZGUoTlVMTCwgZGVudHJ5LT5k
X3BhcmVudCk7IC8qaWdub3JlKi8KKwkJYXVfdXBkYXRlX2Z1c2VfaF9pbm9kZShOVUxMLCBkZW50
cnkpOyAvKmlnbm9yZSovCisJfQorCXJldHVybiBlcnI7Cit9CisKK2ludCBkb192ZnN1Yl9ybWRp
cihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCBlcnI7
CisKKwlMS1RSVHJhY2UoImklbHUsICUuKnNcbiIsIGRpci0+aV9pbm8sIEF1RExOUGFpcihkZW50
cnkpKTsKKwlJTXVzdExvY2soZGlyKTsKKworCWxvY2tkZXBfb2ZmKCk7CisJZXJyID0gdmZzX3Jt
ZGlyKGRpciwgZGVudHJ5KTsKKwlsb2NrZGVwX29uKCk7CisJLyogZGlyIGlub2RlIGlzIGxvY2tl
ZCAqLworCWlmICghZXJyKQorCQlhdV91cGRhdGVfZnVzZV9oX2lub2RlKE5VTEwsIGRlbnRyeS0+
ZF9wYXJlbnQpOyAvKmlnbm9yZSovCisJcmV0dXJuIGVycjsKK30KKworaW50IGRvX3Zmc3ViX3Vu
bGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCBl
cnI7CisKKwlMS1RSVHJhY2UoImklbHUsICUuKnNcbiIsIGRpci0+aV9pbm8sIEF1RExOUGFpcihk
ZW50cnkpKTsKKwlJTXVzdExvY2soZGlyKTsKKworCS8qIHZmc191bmxpbmsoKSBsb2NrcyBpbm9k
ZSAqLworCWxvY2tkZXBfb2ZmKCk7CisJZXJyID0gdmZzX3VubGluayhkaXIsIGRlbnRyeSk7CisJ
bG9ja2RlcF9vbigpOworCS8qIGRpciBpbm9kZSBpcyBsb2NrZWQgKi8KKwlpZiAoIWVycikKKwkJ
YXVfdXBkYXRlX2Z1c2VfaF9pbm9kZShOVUxMLCBkZW50cnktPmRfcGFyZW50KTsgLyppZ25vcmUq
LworCXJldHVybiBlcnI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3NpemVfdCBkb192
ZnN1Yl9yZWFkX3Uoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1YnVmLCBzaXplX3Qg
Y291bnQsCisJCQlsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCBlcnI7CisKKwlMS1RSVHJhY2Uo
IiUuKnMsIGNudCAlbHUsIHBvcyAlTGRcbiIsCisJCSAgQXVETE5QYWlyKGZpbGUtPmZfZGVudHJ5
KSwgKHVuc2lnbmVkIGxvbmcpY291bnQsICpwcG9zKTsKKworCWlmICgwIC8qIWF1X3Rlc3RfbmZz
KGZpbGUtPmZfdmZzbW50LT5tbnRfc2IpKi8pCisJCWVyciA9IHZmc19yZWFkKGZpbGUsIHVidWYs
IGNvdW50LCBwcG9zKTsKKwllbHNlIHsKKwkJbG9ja2RlcF9vZmYoKTsKKwkJZXJyID0gdmZzX3Jl
YWQoZmlsZSwgdWJ1ZiwgY291bnQsIHBwb3MpOworCQlsb2NrZGVwX29uKCk7CisJfQorCWlmIChl
cnIgPj0gMCkKKwkJYXVfdXBkYXRlX2Z1c2VfaF9pbm9kZShmaWxlLT5mX3Zmc21udCwgZmlsZS0+
Zl9kZW50cnkpOworCS8qaWdub3JlKi8KKwlyZXR1cm4gZXJyOworfQorCisvLyBrZXJuZWxfcmVh
ZCgpID8/Citzc2l6ZV90IGRvX3Zmc3ViX3JlYWRfayhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAq
a2J1Ziwgc2l6ZV90IGNvdW50LAorCQkJbG9mZl90ICpwcG9zKQoreworCXNzaXplX3QgZXJyOwor
CW1tX3NlZ21lbnRfdCBvbGRmczsKKworCW9sZGZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5F
TF9EUyk7CisJZXJyID0gZG9fdmZzdWJfcmVhZF91KGZpbGUsIChjaGFyIF9fdXNlciAqKWtidWYs
IGNvdW50LCBwcG9zKTsKKwlzZXRfZnMob2xkZnMpOworCXJldHVybiBlcnI7Cit9CisKK3NzaXpl
X3QgZG9fdmZzdWJfd3JpdGVfdShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIg
KnVidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCBlcnI7
CisKKwlMS1RSVHJhY2UoIiUuKnMsIGNudCAlbHUsIHBvcyAlTGRcbiIsCisJCSAgQXVETE5QYWly
KGZpbGUtPmZfZGVudHJ5KSwgKHVuc2lnbmVkIGxvbmcpY291bnQsICpwcG9zKTsKKworCWxvY2tk
ZXBfb2ZmKCk7CisJZXJyID0gdmZzX3dyaXRlKGZpbGUsIHVidWYsIGNvdW50LCBwcG9zKTsKKwls
b2NrZGVwX29uKCk7CisJaWYgKGVyciA+PSAwKQorCQlhdV91cGRhdGVfZnVzZV9oX2lub2RlKGZp
bGUtPmZfdmZzbW50LCBmaWxlLT5mX2RlbnRyeSk7CisJLyppZ25vcmUqLworCXJldHVybiBlcnI7
Cit9CisKK3NzaXplX3QgZG9fdmZzdWJfd3JpdGVfayhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAq
a2J1Ziwgc2l6ZV90IGNvdW50LAorCQkJIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90IGVycjsK
KwltbV9zZWdtZW50X3Qgb2xkZnM7CisKKwlvbGRmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJO
RUxfRFMpOworCWVyciA9IGRvX3Zmc3ViX3dyaXRlX3UoZmlsZSwgKGNvbnN0IGNoYXIgX191c2Vy
ICopa2J1ZiwgY291bnQsIHBwb3MpOworCXNldF9mcyhvbGRmcyk7CisJcmV0dXJuIGVycjsKK30K
KworaW50IGRvX3Zmc3ViX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIGZpbGxkaXJfdCBmaWxs
ZGlyLCB2b2lkICphcmcpCit7CisJaW50IGVycjsKKworCUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVE
TE5QYWlyKGZpbGUtPmZfZGVudHJ5KSk7CisKKwlsb2NrZGVwX29mZigpOworCWVyciA9IHZmc19y
ZWFkZGlyKGZpbGUsIGZpbGxkaXIsIGFyZyk7CisJbG9ja2RlcF9vbigpOworCWlmIChlcnIgPj0g
MCkKKwkJYXVfdXBkYXRlX2Z1c2VfaF9pbm9kZShmaWxlLT5mX3Zmc21udCwgZmlsZS0+Zl9kZW50
cnkpOworCS8qaWdub3JlKi8KKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgQ09ORklHX0FVRlNf
U1BMSUNFX1BBVENICitsb25nIGRvX3Zmc3ViX3NwbGljZV90byhzdHJ1Y3QgZmlsZSAqaW4sIGxv
ZmZfdCAqcHBvcywKKwkJCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHNpemVfdCBsZW4s
CisJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJbG9uZyBlcnI7CisKKwlMS1RSVHJhY2UoIiUu
KnMsIHBvcyAlTGQsIGxlbiAlbHUsIDB4JXhcbiIsCisJCSAgQXVETE5QYWlyKGluLT5mX2RlbnRy
eSksICpwcG9zLCAodW5zaWduZWQgbG9uZylsZW4sIGZsYWdzKTsKKworCWxvY2tkZXBfb2ZmKCk7
CisJZXJyID0gdmZzX3NwbGljZV90byhpbiwgcHBvcywgcGlwZSwgbGVuLCBmbGFncyk7CisJbG9j
a2RlcF9vbigpOworCWlmIChlcnIgPj0gMCkKKwkJYXVfdXBkYXRlX2Z1c2VfaF9pbm9kZShpbi0+
Zl92ZnNtbnQsIGluLT5mX2RlbnRyeSk7IC8qaWdub3JlKi8KKwlyZXR1cm4gZXJyOworfQorCits
b25nIGRvX3Zmc3ViX3NwbGljZV9mcm9tKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHN0
cnVjdCBmaWxlICpvdXQsCisJCQkgIGxvZmZfdCAqcHBvcywgc2l6ZV90IGxlbiwgdW5zaWduZWQg
aW50IGZsYWdzKQoreworCWxvbmcgZXJyOworCisJTEtUUlRyYWNlKCIlLipzLCBwb3MgJUxkLCBs
ZW4gJWx1LCAweCV4XG4iLAorCQkgIEF1RExOUGFpcihvdXQtPmZfZGVudHJ5KSwgKnBwb3MsICh1
bnNpZ25lZCBsb25nKWxlbiwgZmxhZ3MpOworCisJbG9ja2RlcF9vZmYoKTsKKwllcnIgPSB2ZnNf
c3BsaWNlX2Zyb20ocGlwZSwgb3V0LCBwcG9zLCBsZW4sIGZsYWdzKTsKKwlsb2NrZGVwX29uKCk7
CisJaWYgKGVyciA+PSAwKQorCQlhdV91cGRhdGVfZnVzZV9oX2lub2RlKG91dC0+Zl92ZnNtbnQs
IG91dC0+Zl9kZW50cnkpOyAvKmlnbm9yZSovCisJcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCisv
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBhdV92ZnN1Yl9ta2Rpcl9hcmdzIHsKKwlpbnQg
KmVycnA7CisJc3RydWN0IGlub2RlICpkaXI7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWlu
dCBtb2RlOworCWludCBkbGd0OworfTsKKworc3RhdGljIHZvaWQgYXVfY2FsbF92ZnN1Yl9ta2Rp
cih2b2lkICphcmdzKQoreworCXN0cnVjdCBhdV92ZnN1Yl9ta2Rpcl9hcmdzICphID0gYXJnczsK
KwkqYS0+ZXJycCA9IHZmc3ViX21rZGlyKGEtPmRpciwgYS0+ZGVudHJ5LCBhLT5tb2RlLCBhLT5k
bGd0KTsKK30KKworaW50IHZmc3ViX3Npb19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0
IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJICAgIGludCBkbGd0KQoreworCWludCBlcnIs
IGRvX3Npbywgd2txX2VycjsKKworCUxLVFJUcmFjZSgiaSVsdSwgJS4qc1xuIiwgZGlyLT5pX2lu
bywgQXVETE5QYWlyKGRlbnRyeSkpOworCisJZG9fc2lvID0gYXVfdGVzdF9oX3Blcm1fc2lvKGRp
ciwgTUFZX0VYRUMgfCBNQVlfV1JJVEUsIGRsZ3QpOworCWlmICghZG9fc2lvKQorCQllcnIgPSB2
ZnN1Yl9ta2RpcihkaXIsIGRlbnRyeSwgbW9kZSwgZGxndCk7CisJZWxzZSB7CisJCXN0cnVjdCBh
dV92ZnN1Yl9ta2Rpcl9hcmdzIGFyZ3MgPSB7CisJCQkuZXJycAk9ICZlcnIsCisJCQkuZGlyCT0g
ZGlyLAorCQkJLmRlbnRyeQk9IGRlbnRyeSwKKwkJCS5tb2RlCT0gbW9kZSwKKwkJCS5kbGd0CT0g
ZGxndAorCQl9OworCQl3a3FfZXJyID0gYXVfd2txX3dhaXQoYXVfY2FsbF92ZnN1Yl9ta2Rpciwg
JmFyZ3MsIC8qZGxndCovMCk7CisJCWlmICh1bmxpa2VseSh3a3FfZXJyKSkKKwkJCWVyciA9IHdr
cV9lcnI7CisJfQorCisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0cnVj
dCBhdV92ZnN1Yl9ybWRpcl9hcmdzIHsKKwlpbnQgKmVycnA7CisJc3RydWN0IGlub2RlICpkaXI7
CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJnczsKK307
CisKK3N0YXRpYyB2b2lkIGF1X2NhbGxfdmZzdWJfcm1kaXIodm9pZCAqYXJncykKK3sKKwlzdHJ1
Y3QgYXVfdmZzdWJfcm1kaXJfYXJncyAqYSA9IGFyZ3M7CisJKmEtPmVycnAgPSB2ZnN1Yl9ybWRp
cihhLT5kaXIsIGEtPmRlbnRyeSwgYS0+dmFyZ3MpOworfQorCitpbnQgdmZzdWJfc2lvX3JtZGly
KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkbGd0KQorewor
CWludCBlcnIsIGRvX3Npbywgd2txX2VycjsKKwlzdHJ1Y3QgdmZzdWJfYXJncyB2YXJnczsKKwor
CUxLVFJUcmFjZSgiaSVsdSwgJS4qc1xuIiwgZGlyLT5pX2lubywgQXVETE5QYWlyKGRlbnRyeSkp
OworCisJdmZzdWJfYXJnc19pbml0KCZ2YXJncywgLyppZ24qL05VTEwsIGRsZ3QsIC8qZm9yY2Vf
dW5saW5rKi8wKTsKKwlkb19zaW8gPSBhdV90ZXN0X2hfcGVybV9zaW8oZGlyLCBNQVlfRVhFQyB8
IE1BWV9XUklURSwgZGxndCk7CisJaWYgKCFkb19zaW8pCisJCWVyciA9IHZmc3ViX3JtZGlyKGRp
ciwgZGVudHJ5LCAmdmFyZ3MpOworCWVsc2UgeworCQlzdHJ1Y3QgYXVfdmZzdWJfcm1kaXJfYXJn
cyBhcmdzID0geworCQkJLmVycnAJCT0gJmVyciwKKwkJCS5kaXIJCT0gZGlyLAorCQkJLmRlbnRy
eQkJPSBkZW50cnksCisJCQkudmFyZ3MJCT0gJnZhcmdzCisJCX07CisJCXdrcV9lcnIgPSBhdV93
a3Ffd2FpdChhdV9jYWxsX3Zmc3ViX3JtZGlyLCAmYXJncywgLypkbGd0Ki8wKTsKKwkJaWYgKHVu
bGlrZWx5KHdrcV9lcnIpKQorCQkJZXJyID0gd2txX2VycjsKKwl9CisKKwlBdVRyYWNlRXJyKGVy
cik7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3Qgbm90
aWZ5X2NoYW5nZV9hcmdzIHsKKwlpbnQgKmVycnA7CisJc3RydWN0IGRlbnRyeSAqaF9kZW50cnk7
CisJc3RydWN0IGlhdHRyICppYTsKKwlzdHJ1Y3QgdmZzdWJfYXJncyAqdmFyZ3M7Cit9OworCitz
dGF0aWMgdm9pZCBjYWxsX25vdGlmeV9jaGFuZ2Uodm9pZCAqYXJncykKK3sKKwlzdHJ1Y3Qgbm90
aWZ5X2NoYW5nZV9hcmdzICphID0gYXJnczsKKwlzdHJ1Y3QgaW5vZGUgKmhfaW5vZGU7CisKKwlM
S1RSVHJhY2UoIiUuKnMsIGlhX3ZhbGlkIDB4JXhcbiIsCisJCSAgQXVETE5QYWlyKGEtPmhfZGVu
dHJ5KSwgYS0+aWEtPmlhX3ZhbGlkKTsKKwloX2lub2RlID0gYS0+aF9kZW50cnktPmRfaW5vZGU7
CisJSU11c3RMb2NrKGhfaW5vZGUpOworCisJKmEtPmVycnAgPSAtRVBFUk07CisJaWYgKCFJU19J
TU1VVEFCTEUoaF9pbm9kZSkgJiYgIUlTX0FQUEVORChoX2lub2RlKSkgeworCQl2ZnN1Yl9pZ25v
cmUoYS0+dmFyZ3MpOworCQlsb2NrZGVwX29mZigpOworCQkqYS0+ZXJycCA9IG5vdGlmeV9jaGFu
Z2UoYS0+aF9kZW50cnksIGEtPmlhKTsKKwkJbG9ja2RlcF9vbigpOworCQlpZiAoISphLT5lcnJw
KQorCQkJYXVfdXBkYXRlX2Z1c2VfaF9pbm9kZShOVUxMLCBhLT5oX2RlbnRyeSk7IC8qaWdub3Jl
Ki8KKwkJZWxzZQorCQkJdmZzdWJfdW5pZ25vcmUoYS0+dmFyZ3MpOworCX0KKwlBdVRyYWNlRXJy
KCphLT5lcnJwKTsKK30KKworI2lmZGVmIENPTkZJR19BVUZTX0RMR1QKK3N0YXRpYyB2b2lkIHZm
c3ViX25vdGlmeV9jaGFuZ2VfZGxndChzdHJ1Y3Qgbm90aWZ5X2NoYW5nZV9hcmdzICphcmdzLAor
CQkJCSAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmICghdmZzdWJfZnRlc3QoZmxhZ3Ms
IERMR1QpKQorCQljYWxsX25vdGlmeV9jaGFuZ2UoYXJncyk7CisJZWxzZSB7CisJCWludCB3a3Ff
ZXJyOworCQl3a3FfZXJyID0gYXVfd2txX3dhaXQoY2FsbF9ub3RpZnlfY2hhbmdlLCBhcmdzLCAv
KmRsZ3QqLzEpOworCQlpZiAodW5saWtlbHkod2txX2VycikpCisJCQkqYXJncy0+ZXJycCA9IHdr
cV9lcnI7CisJfQorfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHZmc3ViX25vdGlmeV9jaGFuZ2VfZGxn
dChzdHJ1Y3Qgbm90aWZ5X2NoYW5nZV9hcmdzICphcmdzLAorCQkJCSAgICAgdW5zaWduZWQgaW50
IGZsYWdzKQoreworCWNhbGxfbm90aWZ5X2NoYW5nZShhcmdzKTsKK30KKyNlbmRpZgorCitpbnQg
dmZzdWJfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAq
aWEsCisJCQlzdHJ1Y3QgdmZzdWJfYXJncyAqdmFyZ3MpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qg
bm90aWZ5X2NoYW5nZV9hcmdzIGFyZ3MgPSB7CisJCS5lcnJwCQk9ICZlcnIsCisJCS5oX2RlbnRy
eQk9IGRlbnRyeSwKKwkJLmlhCQk9IGlhLAorCQkudmFyZ3MJCT0gdmFyZ3MKKwl9OworCisJdmZz
dWJfbm90aWZ5X2NoYW5nZV9kbGd0KCZhcmdzLCB2YXJncy0+ZmxhZ3MpOworCisJQXVUcmFjZUVy
cihlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0
IHVubGlua19hcmdzIHsKKwlpbnQgKmVycnA7CisJc3RydWN0IGlub2RlICpkaXI7CisJc3RydWN0
IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJnczsKK307CisKK3N0YXRp
YyB2b2lkIGNhbGxfdW5saW5rKHZvaWQgKmFyZ3MpCit7CisJc3RydWN0IHVubGlua19hcmdzICph
ID0gYXJnczsKKwlzdHJ1Y3QgaW5vZGUgKmhfaW5vZGU7CisJY29uc3QgaW50IHN0b3Bfc2lsbHly
ZW5hbWUgPSAoYXVfdGVzdF9uZnMoYS0+ZGVudHJ5LT5kX3NiKQorCQkJCSAgICAgICYmIGF0b21p
Y19yZWFkKCZhLT5kZW50cnktPmRfY291bnQpID09IDEpOworCisJTEtUUlRyYWNlKCIlLipzLCBz
dG9wX3NpbGx5ICVkLCBjbnQgJWRcbiIsCisJCSAgQXVETE5QYWlyKGEtPmRlbnRyeSksIHN0b3Bf
c2lsbHlyZW5hbWUsCisJCSAgYXRvbWljX3JlYWQoJmEtPmRlbnRyeS0+ZF9jb3VudCkpOworCS8v
SU11c3RMb2NrKGEtPmRpcik7CisKKwlpZiAoIXN0b3Bfc2lsbHlyZW5hbWUpCisJCWRnZXQoYS0+
ZGVudHJ5KTsKKwloX2lub2RlID0gYS0+ZGVudHJ5LT5kX2lub2RlOworCWlmIChoX2lub2RlKQor
CQlhdG9taWNfaW5jX3JldHVybigmaF9pbm9kZS0+aV9jb3VudCk7CisJKmEtPmVycnAgPSBkb192
ZnN1Yl91bmxpbmsoYS0+ZGlyLCBhLT5kZW50cnkpOworCisJaWYgKCFzdG9wX3NpbGx5cmVuYW1l
KQorCQlkcHV0KGEtPmRlbnRyeSk7CisJaWYgKGhfaW5vZGUpCisJCWlwdXQoaF9pbm9kZSk7CisK
KwlBdVRyYWNlRXJyKCphLT5lcnJwKTsKK30KKworLyoKKyAqIEBkaXI6IG11c3QgYmUgbG9ja2Vk
LgorICogQGRlbnRyeTogdGFyZ2V0IGRlbnRyeS4KKyAqLworaW50IHZmc3ViX3VubGluayhzdHJ1
Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgc3RydWN0IHZmc3ViX2Fy
Z3MgKnZhcmdzKQoreworCWludCBlcnI7CisJc3RydWN0IHVubGlua19hcmdzIGFyZ3MgPSB7CisJ
CS5lcnJwCT0gJmVyciwKKwkJLmRpcgk9IGRpciwKKwkJLmRlbnRyeQk9IGRlbnRyeSwKKwkJLnZh
cmdzCT0gdmFyZ3MKKwl9OworCisJaWYgKCF2ZnN1Yl9mdGVzdCh2YXJncy0+ZmxhZ3MsIERMR1Qp
CisJICAgICYmICF2ZnN1Yl9mdGVzdCh2YXJncy0+ZmxhZ3MsIEZPUkNFX1VOTElOSykpCisJCWNh
bGxfdW5saW5rKCZhcmdzKTsKKwllbHNlIHsKKwkJaW50IHdrcV9lcnI7CisJCXdrcV9lcnIgPSBh
dV93a3Ffd2FpdChjYWxsX3VubGluaywgJmFyZ3MsCisJCQkJICAgICAgdmZzdWJfZnRlc3QodmFy
Z3MtPmZsYWdzLCBETEdUKSk7CisJCWlmICh1bmxpa2VseSh3a3FfZXJyKSkKKwkJCWVyciA9IHdr
cV9lcnI7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitz
dHJ1Y3Qgc3RhdGZzX2FyZ3MgeworCWludCAqZXJycDsKKwl2b2lkICphcmc7CisJc3RydWN0IGtz
dGF0ZnMgKmJ1ZjsKK307CisKK3N0YXRpYyB2b2lkIGNhbGxfc3RhdGZzKHZvaWQgKmFyZ3MpCit7
CisJc3RydWN0IHN0YXRmc19hcmdzICphID0gYXJnczsKKwkqYS0+ZXJycCA9IHZmc19zdGF0ZnMo
YS0+YXJnLCBhLT5idWYpOworfQorCisjaWZkZWYgQ09ORklHX0FVRlNfRExHVAorc3RhdGljIHZv
aWQgdmZzdWJfc3RhdGZzX2RsZ3Qoc3RydWN0IHN0YXRmc19hcmdzICphcmdzLCBpbnQgZGxndCkK
K3sKKwlpZiAoIWRsZ3QpCisJCWNhbGxfc3RhdGZzKGFyZ3MpOworCWVsc2UgeworCQlpbnQgd2tx
X2VycjsKKwkJd2txX2VyciA9IGF1X3drcV93YWl0KGNhbGxfc3RhdGZzLCBhcmdzLCAvKmRsZ3Qq
LzEpOworCQlpZiAodW5saWtlbHkod2txX2VycikpCisJCQkqYXJncy0+ZXJycCA9IHdrcV9lcnI7
CisJfQorfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHZmc3ViX3N0YXRmc19kbGd0KHN0cnVjdCBzdGF0
ZnNfYXJncyAqYXJncywgaW50IGRsZ3QpCit7CisJY2FsbF9zdGF0ZnMoYXJncyk7Cit9CisjZW5k
aWYKKworaW50IHZmc3ViX3N0YXRmcyh2b2lkICphcmcsIHN0cnVjdCBrc3RhdGZzICpidWYsIGlu
dCBkbGd0KQoreworCWludCBlcnI7CisJc3RydWN0IHN0YXRmc19hcmdzIGFyZ3MgPSB7CisJCS5l
cnJwCT0gJmVyciwKKwkJLmFyZwk9IGFyZywKKwkJLmJ1Zgk9IGJ1ZgorCX07CisKKwl2ZnN1Yl9z
dGF0ZnNfZGxndCgmYXJncywgZGxndCk7CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC11ck4gbGlu
dXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvdmZzdWIuaCBsaW51eC0yLjYuMjUuNC11
bmlvbmZzL2ZzL2F1ZnMvdmZzdWIuaAotLS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2Zz
L2F1ZnMvdmZzdWIuaAkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUu
NC11bmlvbmZzL2ZzL2F1ZnMvdmZzdWIuaAkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0w
LDAgKzEsNDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSnVuamlybyBPa2Fq
aW1hCisgKgorICogVGhpcyBwcm9ncmFtLCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
cgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHBy
b2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsg
aWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EK
KyAqLworCisvKgorICogc3ViLXJvdXRpbmVzIGZvciBWRlMKKyAqCisgKiAkSWQ6IHZmc3ViLmgs
diAxLjIgMjAwOC8wNC8yMSAwMTo0OToyMiBzZmpybyBFeHAgJAorICovCisKKyNpZm5kZWYgX19B
VUZTX1ZGU1VCX0hfXworI2RlZmluZSBfX0FVRlNfVkZTVUJfSF9fCisKKyNpZmRlZiBfX0tFUk5F
TF9fCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+Cisj
aW5jbHVkZSA8bGludXgvc3BsaWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPgorCisv
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHZmc3ViIGZsYWdzICovCisjZGVmaW5lIFZmc3ViX0RM
R1QJCTEJCS8qIG9wZXJhdGlvbiB3aXRoIGRlbGVnYXRpb24gKi8KKyNkZWZpbmUgVmZzdWJfRk9S
Q0VfVU5MSU5LCSgxIDw8IDEpCS8qIGZvcmNlIHVubGlua2luZyAqLworI2RlZmluZSB2ZnN1Yl9m
dGVzdChmbGFncywgbmFtZSkJKChmbGFncykgJiBWZnN1Yl8jI25hbWUpCisjZGVmaW5lIHZmc3Vi
X2ZzZXQoZmxhZ3MsIG5hbWUpCQl7IChmbGFncykgfD0gVmZzdWJfIyNuYW1lOyB9CisjZGVmaW5l
IHZmc3ViX2ZjbHIoZmxhZ3MsIG5hbWUpCQl7IChmbGFncykgJj0gflZmc3ViXyMjbmFtZTsgfQor
I2lmbmRlZiBDT05GSUdfQVVGU19ETEdUCisjdW5kZWYgVmZzdWJfRExHVAorI2RlZmluZSBWZnN1
Yl9ETEdUCTAKKyNlbmRpZgorCitzdHJ1Y3QgYXVfaGluX2lnbm9yZTsKK3N0cnVjdCB2ZnN1Yl9h
cmdzIHsKKyNpZmRlZiBDT05GSUdfQVVGU19ISU5PVElGWQorCS8qIGlub3RpZnkgZXZlbnRzIHRv
IGJlIGlnbm9yZWQgKi8KKwlpbnQJCQluaWdub3JlOworCXN0cnVjdCBhdV9oaW5faWdub3JlCSpp
Z25vcmU7CisjZW5kaWYKKworCXVuc2lnbmVkIGludAkJZmxhZ3M7Cit9OworCitzdHJ1Y3QgYXVf
aGlub2RlOworI2lmZGVmIENPTkZJR19BVUZTX0hJTk9USUZZCitzdGF0aWMgaW5saW5lCit2b2lk
IGRvX3Zmc3ViX2FyZ3NfcmVpbml0KHN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJncywgc3RydWN0IGF1
X2hpbl9pZ25vcmUgKmlnbikKK3sKKwl2YXJncy0+bmlnbm9yZSA9IDA7CisJdmFyZ3MtPmlnbm9y
ZSA9IGlnbjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZmc3ViX2FyZ3NfcmVpbml0KHN0cnVj
dCB2ZnN1Yl9hcmdzICp2YXJncykKK3sKKwl2YXJncy0+bmlnbm9yZSA9IDA7Cit9CisKK19fdTMy
IHZmc3ViX2V2ZW50c19ub3RpZnlfY2hhbmdlKHN0cnVjdCBpYXR0ciAqaWEpOwordm9pZCB2ZnN1
Yl9pZ25faGlub2RlKHN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJncywgX191MzIgZXZlbnRzLAorCQkg
ICAgICBzdHJ1Y3QgYXVfaGlub2RlICpoaW5vZGUpOwordm9pZCB2ZnN1Yl9pZ25faW5vZGUoc3Ry
dWN0IHZmc3ViX2FyZ3MgKnZhcmdzLCBfX3UzMiBldmVudHMsCisJCSAgICAgc3RydWN0IGlub2Rl
ICppbm9kZSwgc3RydWN0IGlub2RlICpoX2lub2RlKTsKKwordm9pZCB2ZnN1Yl9pZ25vcmUoc3Ry
dWN0IHZmc3ViX2FyZ3MgKnZhcmdzKTsKK3ZvaWQgdmZzdWJfdW5pZ25vcmUoc3RydWN0IHZmc3Vi
X2FyZ3MgKnZhcmdzKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lCit2b2lkIGRvX3Zmc3ViX2FyZ3Nf
cmVpbml0KHN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJncywgc3RydWN0IGF1X2hpbl9pZ25vcmUgKmln
bikKK3sKKwkvKiBlbXB0eSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmZzdWJfYXJnc19y
ZWluaXQoc3RydWN0IHZmc3ViX2FyZ3MgKnZhcmdzKQoreworCS8qIGVtcHR5ICovCit9CisKK3N0
YXRpYyBpbmxpbmUgX191MzIgdmZzdWJfZXZlbnRzX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGlhdHRy
ICppYSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZmc3ViX2lnbl9o
aW5vZGUoc3RydWN0IHZmc3ViX2FyZ3MgKnZhcmdzLCBfX3UzMiBldmVudHMsCisJCQkJICAgIHN0
cnVjdCBhdV9oaW5vZGUgKmhpbm9kZSkKK3sKKwkvKiBlbXB0eSAqLworfQorCitzdGF0aWMgaW5s
aW5lIHZvaWQgdmZzdWJfaWduX2lub2RlKHN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJncywgX191MzIg
ZXZlbnRzLAorCQkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqaF9pbm9k
ZSkKK3sKKwkvKiBlbXB0eSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmZzdWJfaWdub3Jl
KHN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJncykKK3sKKwkvKiBlbXB0eSAqLworfQorCitzdGF0aWMg
aW5saW5lIHZvaWQgdmZzdWJfdW5pZ25vcmUoc3RydWN0IHZmc3ViX2FyZ3MgKnZhcmdzKQorewor
CS8qIGVtcHR5ICovCit9CisjZW5kaWYgLyogQ09ORklHX0FVRlNfSElOT1RJRlkgKi8KKwordm9p
ZCB2ZnN1Yl9hcmdzX2luaXQoc3RydWN0IHZmc3ViX2FyZ3MgKnZhcmdzLCBzdHJ1Y3QgYXVfaGlu
X2lnbm9yZSAqaWduLAorCQkgICAgIGludCBkbGd0LCBpbnQgZm9yY2VfdW5saW5rKTsKKworLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSAqLworCisvKiBpbm90aWZ5X2lub2RlX3dhdGNoZWQoKSBpcyBub3QgZXhw
b3J0ZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF1X3Rlc3RfaW5vdGlmeShzdHJ1Y3QgaW5vZGUg
Kmlub2RlKQoreworI2lmZGVmIENPTkZJR19JTk9USUZZCisJcmV0dXJuICFsaXN0X2VtcHR5KCZp
bm9kZS0+aW5vdGlmeV93YXRjaGVzKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tICovCisKKy8qIGxvY2sgc3ViY2xhc3MgZm9yIGhpZGRlbiBpbm9kZSAqLworLyog
ZGVmYXVsdCBNQVhfTE9DS0RFUF9TVUJDTEFTU0VTKDgpIGlzIG5vdCBlbm91Z2ggKi8KKy8vIHRv
ZG86IHJlZHVjZSBpdAorZW51bSB7CisJQXVMc2NfSV9CZWdpbiA9IElfTVVURVhfUVVPVEEsIC8q
IDQgKi8KKwlBdUxzY19JX1BBUkVOVCwJCS8qIGhpZGRlbiBpbm9kZSwgcGFyZW50IGZpcnN0ICov
CisJQXVMc2NfSV9DSElMRCwKKwlBdUxzY19JX1BBUkVOVDIsCS8qIGNvcHl1cCBkaXJzICovCisJ
QXVMc2NfSV9DSElMRDIsCisJQXVMc2NfSV9FbmQKK307CisKKyNkZWZpbmUgSU11c3RMb2NrKGkp
CU10eE11c3RMb2NrKCYoaSktPmlfbXV0ZXgpCisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBkZW50
cnkgKnZmc3ViX2xvY2tfcmVuYW1lKHN0cnVjdCBkZW50cnkgKmQxLCBzdHJ1Y3QgZGVudHJ5ICpk
MikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkOworCisJbG9ja2RlcF9vZmYoKTsKKwlkID0gbG9ja19y
ZW5hbWUoZDEsIGQyKTsKKwlsb2NrZGVwX29uKCk7CisJcmV0dXJuIGQ7Cit9CisKK3N0YXRpYyBp
bmxpbmUgdm9pZCB2ZnN1Yl91bmxvY2tfcmVuYW1lKHN0cnVjdCBkZW50cnkgKmQxLCBzdHJ1Y3Qg
ZGVudHJ5ICpkMikKK3sKKwlsb2NrZGVwX29mZigpOworCXVubG9ja19yZW5hbWUoZDEsIGQyKTsK
Kwlsb2NrZGVwX29uKCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJ
R19BVUZTX1dPUktBUk9VTkRfRlVTRQorLyogYnJfZnVzZS5jICovCitpbnQgYXVfdXBkYXRlX2Z1
c2VfaF9pbm9kZShzdHJ1Y3QgdmZzbW91bnQgKmhfbW50LCBzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRy
eSk7CisjZWxzZQorc3RhdGljIGlubGluZQoraW50IGF1X3VwZGF0ZV9mdXNlX2hfaW5vZGUoc3Ry
dWN0IHZmc21vdW50ICpoX21udCwgc3RydWN0IGRlbnRyeSAqaF9kZW50cnkpCit7CisJcmV0dXJu
IDA7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BVUZTX0JSX1hGUworLyogYnJfeGZzLmMg
Ki8KK2Rldl90IGF1X2hfcmRldihzdHJ1Y3QgaW5vZGUgKmhfaW5vZGUsIHN0cnVjdCB2ZnNtb3Vu
dCAqaF9tbnQsCisJCXN0cnVjdCBkZW50cnkgKmhfZGVudHJ5KTsKKyNlbHNlCitzdGF0aWMgaW5s
aW5lCitkZXZfdCBhdV9oX3JkZXYoc3RydWN0IGlub2RlICpoX2lub2RlLCBzdHJ1Y3QgdmZzbW91
bnQgKmhfbW50LAorCQlzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeSkKK3sKKwlyZXR1cm4gaF9pbm9k
ZS0+aV9yZGV2OworfQorI2VuZGlmCisKKy8qIHNpbXBsZSBhYnN0cmFjdGlvbnMsIGZvciBmdXR1
cmUgdXNlICovCitzdGF0aWMgaW5saW5lCitpbnQgZG9fdmZzdWJfcGVybWlzc2lvbihzdHJ1Y3Qg
aW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJTEtUUlRy
YWNlKCJpJWx1LCBtYXNrIDB4JXgsIG5kICVkXG4iLCBpbm9kZS0+aV9pbm8sIG1hc2ssICEhbmQp
OworCUlNdXN0TG9jayhpbm9kZSk7CisJcmV0dXJuIHBlcm1pc3Npb24oaW5vZGUsIG1hc2ssIG5k
KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgZmlsZSAqdmZzdWJfZmlscF9v
cGVuKGNvbnN0IGNoYXIgKnBhdGgsIGludCBvZmxhZ3MsIGludCBtb2RlKTsKK2ludCB2ZnN1Yl9w
YXRoX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCSAgICAg
IHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKK3N0cnVjdCBkZW50cnkgKnZmc3ViX2xvb2t1cF9vbmVf
bGVuKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkgICAgaW50
IGxlbik7CisKKyNpZmRlZiBDT05GSUdfQVVGU19MSEFTSF9QQVRDSAorc3RydWN0IGRlbnRyeSAq
dmZzdWJfX2xvb2t1cF9oYXNoKHN0cnVjdCBxc3RyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJl
bnQsCisJCQkJICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CisjZW5kaWYKKworLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLworCitpbnQgZG9fdmZzdWJfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3Qg
ZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwor
aW50IGRvX3Zmc3ViX3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRl
bnRyeSwKKwkJICAgICBjb25zdCBjaGFyICpzeW1uYW1lLCBpbnQgbW9kZSk7CitpbnQgZG9fdmZz
dWJfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1v
ZGUsCisJCSAgIGRldl90IGRldik7CitpbnQgZG9fdmZzdWJfbGluayhzdHJ1Y3QgZGVudHJ5ICpz
cmNfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkp
OworaW50IGRvX3Zmc3ViX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKnNyY19kaXIsIHN0cnVjdCBkZW50
cnkgKnNyY19kZW50cnksCisJCSAgICBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAq
ZGVudHJ5KTsKK2ludCBkb192ZnN1Yl9ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRl
bnRyeSAqZGVudHJ5LCBpbnQgbW9kZSk7CitpbnQgZG9fdmZzdWJfcm1kaXIoc3RydWN0IGlub2Rl
ICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitpbnQgZG9fdmZzdWJfdW5saW5rKHN0cnVj
dCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworCisvKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
ICovCisKK3NzaXplX3QgZG9fdmZzdWJfcmVhZF91KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9f
dXNlciAqdWJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJbG9mZl90ICpwcG9zKTsKKy8vIGtlcm5lbF9y
ZWFkKCkgPz8KK3NzaXplX3QgZG9fdmZzdWJfcmVhZF9rKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lk
ICprYnVmLCBzaXplX3QgY291bnQsCisJCQlsb2ZmX3QgKnBwb3MpOworc3NpemVfdCBkb192ZnN1
Yl93cml0ZV91KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJ
CSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Citzc2l6ZV90IGRvX3Zmc3ViX3dyaXRlX2so
c3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmtidWYsIHNpemVfdCBjb3VudCwKKwkJCSBsb2ZmX3Qg
KnBwb3MpOworaW50IGRvX3Zmc3ViX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIGZpbGxkaXJf
dCBmaWxsZGlyLCB2b2lkICphcmcpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBD
T05GSUdfQVVGU19TUExJQ0VfUEFUQ0gKK2xvbmcgZG9fdmZzdWJfc3BsaWNlX3RvKHN0cnVjdCBm
aWxlICppbiwgbG9mZl90ICpwcG9zLAorCQkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwg
c2l6ZV90IGxlbiwKKwkJCXVuc2lnbmVkIGludCBmbGFncyk7Citsb25nIGRvX3Zmc3ViX3NwbGlj
ZV9mcm9tKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHN0cnVjdCBmaWxlICpvdXQsCisJ
CQkgIGxvZmZfdCAqcHBvcywgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKTsKKyNlbHNl
CitzdGF0aWMgaW5saW5lCitsb25nIGRvX3Zmc3ViX3NwbGljZV90byhzdHJ1Y3QgZmlsZSAqaW4s
IGxvZmZfdCAqcHBvcywKKwkJCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHNpemVfdCBs
ZW4sCisJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0
YXRpYyBpbmxpbmUKK2xvbmcgZG9fdmZzdWJfc3BsaWNlX2Zyb20oc3RydWN0IHBpcGVfaW5vZGVf
aW5mbyAqcGlwZSwgc3RydWN0IGZpbGUgKm91dCwKKwkJCSAgbG9mZl90ICpwcG9zLCBzaXplX3Qg
bGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisjZW5kaWYg
LyogQ09ORklHX0FVRlNfU1BMSUNFX1BBVENIICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwor
c3RhdGljIGlubGluZSBsb2ZmX3QgdmZzdWJfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2Zm
X3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQoreworCWxvZmZfdCBlcnI7CisKKwlMS1RSVHJhY2UoIiUu
KnNcbiIsIEF1RExOUGFpcihmaWxlLT5mX2RlbnRyeSkpOworCisJbG9ja2RlcF9vZmYoKTsKKwll
cnIgPSB2ZnNfbGxzZWVrKGZpbGUsIG9mZnNldCwgb3JpZ2luKTsKKwlsb2NrZGVwX29uKCk7CisJ
cmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG9fdmZzdWJfZ2V0YXR0cihzdHJ1
Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgIHN0cnVjdCBr
c3RhdCAqc3QpCit7CisJTEtUUlRyYWNlKCIlLipzXG4iLCBBdURMTlBhaXIoZGVudHJ5KSk7CisJ
cmV0dXJuIHZmc19nZXRhdHRyKG1udCwgZGVudHJ5LCBzdCk7Cit9CisKKy8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0FVRlNfSElOT1RJRlkpIHx8IGRlZmluZWQoQ09O
RklHX0FVRlNfRExHVCkKKy8qIGhpbl9vcl9kbGd0LmMgKi8KK2ludCB2ZnN1Yl9wZXJtaXNzaW9u
KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCwKKwkJ
ICAgICBpbnQgZGxndCk7CisKK2ludCB2ZnN1Yl9jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0
cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCSBzdHJ1Y3QgbmFtZWlkYXRhICpuZCwg
aW50IGRsZ3QpOworaW50IHZmc3ViX3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBk
ZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqc3ltbmFtZSwKKwkJICBpbnQgbW9kZSwgaW50IGRs
Z3QpOworaW50IHZmc3ViX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpk
ZW50cnksIGludCBtb2RlLCBkZXZfdCBkZXYsCisJCWludCBkbGd0KTsKK2ludCB2ZnN1Yl9saW5r
KHN0cnVjdCBkZW50cnkgKnNyY19kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLAorCSAgICAgICBz
dHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkbGd0KTsKK2ludCB2ZnN1Yl9yZW5hbWUoc3RydWN0
IGlub2RlICpzcmNfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpzcmNfZGVudHJ5LAorCQkgc3RydWN0IGlu
b2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJIHN0cnVjdCB2ZnN1Yl9hcmdzICp2
YXJncyk7CitpbnQgdmZzdWJfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkg
KmRlbnRyeSwgaW50IG1vZGUsIGludCBkbGd0KTsKK2ludCB2ZnN1Yl9ybWRpcihzdHJ1Y3QgaW5v
ZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQlzdHJ1Y3QgdmZzdWJfYXJncyAqdmFy
Z3MpOworCitzc2l6ZV90IHZmc3ViX3JlYWRfdShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3Vz
ZXIgKnVidWYsIHNpemVfdCBjb3VudCwKKwkJICAgICBsb2ZmX3QgKnBwb3MsIGludCBkbGd0KTsK
K3NzaXplX3QgdmZzdWJfcmVhZF9rKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICprYnVmLCBzaXpl
X3QgY291bnQsIGxvZmZfdCAqcHBvcywKKwkJICAgICBpbnQgZGxndCk7Citzc2l6ZV90IHZmc3Vi
X3dyaXRlX3Uoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLCBzaXpl
X3QgY291bnQsCisJCSAgICAgIGxvZmZfdCAqcHBvcywgc3RydWN0IHZmc3ViX2FyZ3MgKnZhcmdz
KTsKK3NzaXplX3QgdmZzdWJfd3JpdGVfayhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqa2J1Ziwg
c2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MsCisJCSAgICAgIHN0cnVjdCB2ZnN1Yl9hcmdzICp2
YXJncyk7CitpbnQgdmZzdWJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgZmlsbGRpcl90IGZp
bGxkaXIsIHZvaWQgKmFyZywgaW50IGRsZ3QpOworbG9uZyB2ZnN1Yl9zcGxpY2VfdG8oc3RydWN0
IGZpbGUgKmluLCBsb2ZmX3QgKnBwb3MsCisJCSAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAq
cGlwZSwgc2l6ZV90IGxlbiwKKwkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIGludCBkbGd0KTsK
K2xvbmcgdmZzdWJfc3BsaWNlX2Zyb20oc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3Ry
dWN0IGZpbGUgKm91dCwKKwkJICAgICAgIGxvZmZfdCAqcHBvcywgc2l6ZV90IGxlbiwgdW5zaWdu
ZWQgaW50IGZsYWdzLAorCQkgICAgICAgc3RydWN0IHZmc3ViX2FyZ3MgKnZhcmdzKTsKKworaW50
IHZmc3ViX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRy
eSwgc3RydWN0IGtzdGF0ICpzdCwKKwkJICBpbnQgZGxndCk7CisjZWxzZQorCitzdGF0aWMgaW5s
aW5lCitpbnQgdmZzdWJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywg
c3RydWN0IG5hbWVpZGF0YSAqbmQsCisJCSAgICAgaW50IGRsZ3QpCit7CisJcmV0dXJuIGRvX3Zm
c3ViX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIG5kKTsKK30KKworc3RhdGljIGlubGluZQoraW50
IHZmc3ViX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBp
bnQgbW9kZSwKKwkJIHN0cnVjdCBuYW1laWRhdGEgKm5kLCBpbnQgZGxndCkKK3sKKwlyZXR1cm4g
ZG9fdmZzdWJfY3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlLCBuZCk7Cit9CisKK3N0YXRpYyBpbmxp
bmUKK2ludCB2ZnN1Yl9zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpk
ZW50cnksIGNvbnN0IGNoYXIgKnN5bW5hbWUsCisJCSAgaW50IG1vZGUsIGludCBkbGd0KQorewor
CXJldHVybiBkb192ZnN1Yl9zeW1saW5rKGRpciwgZGVudHJ5LCBzeW1uYW1lLCBtb2RlKTsKK30K
Kworc3RhdGljIGlubGluZQoraW50IHZmc3ViX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1
Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBkZXZfdCBkZXYsCisJCWludCBkbGd0KQorewor
CXJldHVybiBkb192ZnN1Yl9ta25vZChkaXIsIGRlbnRyeSwgbW9kZSwgZGV2KTsKK30KKworc3Rh
dGljIGlubGluZQoraW50IHZmc3ViX2xpbmsoc3RydWN0IGRlbnRyeSAqc3JjX2RlbnRyeSwgc3Ry
dWN0IGlub2RlICpkaXIsCisJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRsZ3Qp
Cit7CisJcmV0dXJuIGRvX3Zmc3ViX2xpbmsoc3JjX2RlbnRyeSwgZGlyLCBkZW50cnkpOworfQor
CitzdGF0aWMgaW5saW5lCitpbnQgdmZzdWJfcmVuYW1lKHN0cnVjdCBpbm9kZSAqc3JjX2Rpciwg
c3RydWN0IGRlbnRyeSAqc3JjX2RlbnRyeSwKKwkJIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3Qg
ZGVudHJ5ICpkZW50cnksCisJCSBzdHJ1Y3QgdmZzdWJfYXJncyAqdmFyZ3MpCit7CisJaW50IGVy
cjsKKworCXZmc3ViX2lnbm9yZSh2YXJncyk7CisJZXJyID0gZG9fdmZzdWJfcmVuYW1lKHNyY19k
aXIsIHNyY19kZW50cnksIGRpciwgZGVudHJ5KTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJdmZz
dWJfdW5pZ25vcmUodmFyZ3MpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2lu
dCB2ZnN1Yl9ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBp
bnQgbW9kZSwgaW50IGRsZ3QpCit7CisJcmV0dXJuIGRvX3Zmc3ViX21rZGlyKGRpciwgZGVudHJ5
LCBtb2RlKTsKK30KKworc3RhdGljIGlubGluZQoraW50IHZmc3ViX3JtZGlyKHN0cnVjdCBpbm9k
ZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCXN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJn
cykKK3sKKwlpbnQgZXJyOworCisJdmZzdWJfaWdub3JlKHZhcmdzKTsKKwllcnIgPSBkb192ZnN1
Yl9ybWRpcihkaXIsIGRlbnRyeSk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCXZmc3ViX3VuaWdu
b3JlKHZhcmdzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lCitzc2l6ZV90IHZm
c3ViX3JlYWRfdShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBj
b3VudCwKKwkJICAgICBsb2ZmX3QgKnBwb3MsIGludCBkbGd0KQoreworCXJldHVybiBkb192ZnN1
Yl9yZWFkX3UoZmlsZSwgdWJ1ZiwgY291bnQsIHBwb3MpOworfQorCitzdGF0aWMgaW5saW5lCitz
c2l6ZV90IHZmc3ViX3JlYWRfayhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqa2J1Ziwgc2l6ZV90
IGNvdW50LCBsb2ZmX3QgKnBwb3MsCisJCSAgICAgaW50IGRsZ3QpCit7CisJcmV0dXJuIGRvX3Zm
c3ViX3JlYWRfayhmaWxlLCBrYnVmLCBjb3VudCwgcHBvcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUK
K3NzaXplX3QgdmZzdWJfd3JpdGVfdShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3Vz
ZXIgKnVidWYsIHNpemVfdCBjb3VudCwKKwkJICAgICAgbG9mZl90ICpwcG9zLCBzdHJ1Y3QgdmZz
dWJfYXJncyAqdmFyZ3MpCit7CisJaW50IGVycjsKKworCXZmc3ViX2lnbm9yZSh2YXJncyk7CisJ
ZXJyID0gZG9fdmZzdWJfd3JpdGVfdShmaWxlLCB1YnVmLCBjb3VudCwgcHBvcyk7CisJaWYgKHVu
bGlrZWx5KGVyciA8IDApKQorCQl2ZnN1Yl91bmlnbm9yZSh2YXJncyk7CisJcmV0dXJuIGVycjsK
K30KKworc3RhdGljIGlubGluZQorc3NpemVfdCB2ZnN1Yl93cml0ZV9rKHN0cnVjdCBmaWxlICpm
aWxlLCB2b2lkICprYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcywKKwkJICAgICAgc3Ry
dWN0IHZmc3ViX2FyZ3MgKnZhcmdzKQoreworCWludCBlcnI7CisKKwl2ZnN1Yl9pZ25vcmUodmFy
Z3MpOworCWVyciA9IGRvX3Zmc3ViX3dyaXRlX2soZmlsZSwga2J1ZiwgY291bnQsIHBwb3MpOwor
CWlmICh1bmxpa2VseShlcnIgPCAwKSkKKwkJdmZzdWJfdW5pZ25vcmUodmFyZ3MpOworCXJldHVy
biBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCB2ZnN1Yl9yZWFkZGlyKHN0cnVjdCBmaWxl
ICpmaWxlLCBmaWxsZGlyX3QgZmlsbGRpciwgdm9pZCAqYXJnLCBpbnQgZGxndCkKK3sKKwlyZXR1
cm4gZG9fdmZzdWJfcmVhZGRpcihmaWxlLCBmaWxsZGlyLCBhcmcpOworfQorCitzdGF0aWMgaW5s
aW5lCitsb25nIHZmc3ViX3NwbGljZV90byhzdHJ1Y3QgZmlsZSAqaW4sIGxvZmZfdCAqcHBvcywK
KwkJICAgICBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCBzaXplX3QgbGVuLAorCQkgICAg
IHVuc2lnbmVkIGludCBmbGFncywgaW50IGRsZ3QpCit7CisJcmV0dXJuIGRvX3Zmc3ViX3NwbGlj
ZV90byhpbiwgcHBvcywgcGlwZSwgbGVuLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2xv
bmcgdmZzdWJfc3BsaWNlX2Zyb20oc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0
IGZpbGUgKm91dCwKKwkJICAgICAgIGxvZmZfdCAqcHBvcywgc2l6ZV90IGxlbiwgdW5zaWduZWQg
aW50IGZsYWdzLAorCQkgICAgICAgc3RydWN0IHZmc3ViX2FyZ3MgKnZhcmdzKQoreworCWxvbmcg
ZXJyOworCisJdmZzdWJfaWdub3JlKHZhcmdzKTsKKwllcnIgPSBkb192ZnN1Yl9zcGxpY2VfZnJv
bShwaXBlLCBvdXQsIHBwb3MsIGxlbiwgZmxhZ3MpOworCWlmICh1bmxpa2VseShlcnIgPCAwKSkK
KwkJdmZzdWJfdW5pZ25vcmUodmFyZ3MpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxp
bmUKK2ludCB2ZnN1Yl9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5
ICpkZW50cnksIHN0cnVjdCBrc3RhdCAqc3QsCisJCSAgaW50IGRsZ3QpCit7CisJcmV0dXJuIGRv
X3Zmc3ViX2dldGF0dHIobW50LCBkZW50cnksIHN0KTsKK30KKyNlbmRpZiAvKiBDT05GSUdfQVVG
U19ETEdUIHx8IENPTkZJR19BVUZTX0hJTk9USUZZICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
KworaW50IHZmc3ViX3Npb19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAq
ZGVudHJ5LCBpbnQgbW9kZSwKKwkJICAgIGludCBkbGd0KTsKK2ludCB2ZnN1Yl9zaW9fcm1kaXIo
c3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRsZ3QpOworCisv
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCisKK2ludCB2ZnN1Yl9ub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50
cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICppYSwKKwkJCXN0cnVjdCB2ZnN1Yl9hcmdzICp2YXJn
cyk7CitpbnQgdmZzdWJfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpk
ZW50cnksCisJCSBzdHJ1Y3QgdmZzdWJfYXJncyAqdmFyZ3MpOworaW50IHZmc3ViX3N0YXRmcyh2
b2lkICphcmcsIHN0cnVjdCBrc3RhdGZzICpidWYsIGludCBkbGd0KTsKKworI2VuZGlmIC8qIF9f
S0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0FVRlNfVkZTVUJfSF9fICovCmRpZmYgLXVyTiBsaW51
eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy93YnJfcG9saWN5LmMgbGludXgtMi42LjI1
LjQtdW5pb25mcy9mcy9hdWZzL3dicl9wb2xpY3kuYwotLS0gbGludXgtMi42LjI1LjQtdW5pb25m
cy5vcmlnL2ZzL2F1ZnMvd2JyX3BvbGljeS5jCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysr
IGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy93YnJfcG9saWN5LmMJMjAwOC0wNS0yNSAx
MTo1NjowOCArMDMwMApAQCAtMCwwICsxLDY5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
Ny0yMDA4IEp1bmppcm8gT2thamltYQorICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcg
d2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAq
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBN
QSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworLyoKKyAqIHBvbGljaWVzIGZvciBzZWxlY3Rpbmcg
b25lIGFtb25nIG11bHRpcGxlIHdyaXRhYmxlIGJyYW5jaGVzCisgKgorICogJElkOiB3YnJfcG9s
aWN5LmMsdiAxLjMgMjAwOC8wNC8yOCAwMzowNDoxMiBzZmpybyBFeHAgJAorICovCisKKyNpbmNs
dWRlIDxsaW51eC9zdGF0ZnMuaD4KKyNpbmNsdWRlICJhdWZzLmgiCisKK3N0YXRpYyBpbnQgYXVf
Y3Bkb3duX2F0dHIoc3RydWN0IGRlbnRyeSAqaF9kc3QsIHN0cnVjdCBkZW50cnkgKmhfc3JjLCBp
bnQgZGxndCkKK3sKKwlpbnQgZXJyLCBzYml0czsKKwlzdHJ1Y3QgaWF0dHIgaWE7CisJc3RydWN0
IGlub2RlICpoX2lkc3QsICpoX2lzcmM7CisJc3RydWN0IHZmc3ViX2FyZ3MgdmFyZ3M7CisKKwlM
S1RSVHJhY2UoIiUuKnNcbiIsIEF1RExOUGFpcihoX2RzdCkpOworCWhfaWRzdCA9IGhfZHN0LT5k
X2lub2RlOworCS8vSU11c3RMb2NrKGhfaWRzdCk7CisJaF9pc3JjID0gaF9zcmMtPmRfaW5vZGU7
CisJLy9JTXVzdExvY2soaF9pc3JjKTsKKworCWlhLmlhX3ZhbGlkID0gQVRUUl9GT1JDRSB8IEFU
VFJfTU9ERSB8IEFUVFJfVUlEIHwgQVRUUl9HSUQ7CisJaWEuaWFfbW9kZSA9IGhfaXNyYy0+aV9t
b2RlOworCWlhLmlhX3VpZCA9IGhfaXNyYy0+aV91aWQ7CisJaWEuaWFfZ2lkID0gaF9pc3JjLT5p
X2dpZDsKKwlzYml0cyA9ICEhKGlhLmlhX21vZGUgJiAoU19JU1VJRCB8IFNfSVNHSUQpKTsKKwor
CXZmc3ViX2FyZ3NfaW5pdCgmdmFyZ3MsIE5VTEwsIGRsZ3QsIC8qZm9yY2VfdW5saW5rKi8wKTsK
KwllcnIgPSB2ZnN1Yl9ub3RpZnlfY2hhbmdlKGhfZHN0LCAmaWEsICZ2YXJncyk7CisKKwkvKiBp
cyB0aGlzIG5mcyBvbmx5PyAqLworCWlmICghZXJyICYmIHNiaXRzICYmIGF1X3Rlc3RfbmZzKGhf
ZHN0LT5kX3NiKSkgeworCQlpYS5pYV92YWxpZCA9IEFUVFJfRk9SQ0UgfCBBVFRSX01PREU7CisJ
CWlhLmlhX21vZGUgPSBoX2lzcmMtPmlfbW9kZTsKKwkJZXJyID0gdmZzdWJfbm90aWZ5X2NoYW5n
ZShoX2RzdCwgJmlhLCAmdmFyZ3MpOworCX0KKworCWlmICghZXJyKQorCQloX2lkc3QtPmlfZmxh
Z3MgPSBoX2lzcmMtPmlfZmxhZ3M7IC8vPz8KKworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4g
ZXJyOworfQorCitzdHJ1Y3QgYXVfY3Bkb3duX2Rpcl9hcmdzIHsKKwlzdHJ1Y3QgZGVudHJ5ICpw
YXJlbnQ7CisJdW5zaWduZWQgaW50IHBhcmVudF9vcHE7IC8vIGJpdC1mbGFncworfTsKKworc3Rh
dGljIGludCBhdV9jcGRvd25fZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhf
dCBiZHN0LAorCQkJIHN0cnVjdCBkZW50cnkgKmhfcGFyZW50LCB2b2lkICphcmcpCit7CisJaW50
IGVyciwgcGFyZW50X29wcSwgd2hlZCwgZGxndCwgZG9fb3BxLCBtYWRlX2RpciwgZGlyb3BxLCBy
ZXJyOworCXN0cnVjdCBhdV9jcGRvd25fZGlyX2FyZ3MgKmFyZ3MgPSBhcmc7CisJYXVmc19iaW5k
ZXhfdCBiZW5kLCBib3BxLCBic3RhcnQ7CisJc3RydWN0IGRlbnRyeSAqaF9kZW50cnksICpvcHFf
ZGVudHJ5LCAqd2hfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaF9kaXIsICpoX2lub2RlLCAqaW5v
ZGU7CisKKwlMS1RSVHJhY2UoIiUuKnMsIGIlZFxuIiwgQXVETE5QYWlyKGRlbnRyeSksIGJkc3Qp
OworCWJzdGFydCA9IGF1X2Ric3RhcnQoZGVudHJ5KTsKKwlBdURlYnVnT24oYnN0YXJ0IDw9IGJk
c3QKKwkJICAmJiBiZHN0IDw9IGF1X2RiZW5kKGRlbnRyeSkKKwkJICAmJiBhdV9oX2RwdHIoZGVu
dHJ5LCBiZHN0KSk7CisJQXVEZWJ1Z09uKCFoX3BhcmVudCk7CisJaF9kaXIgPSBoX3BhcmVudC0+
ZF9pbm9kZTsKKwlBdURlYnVnT24oIWhfZGlyKTsKKwlJTXVzdExvY2soaF9kaXIpOworCisJZXJy
ID0gYXVfbGt1cF9uZWcoZGVudHJ5LCBiZHN0KTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJ
CWdvdG8gb3V0OworCWhfZGVudHJ5ID0gYXVfaF9kcHRyKGRlbnRyeSwgYmRzdCk7CisJZGxndCA9
ICEhYXVfb3B0X3Rlc3RfZGxndChhdV9tbnRmbGFncyhkZW50cnktPmRfc2IpKTsKKwllcnIgPSB2
ZnN1Yl9zaW9fbWtkaXIoaF9kaXIsIGhfZGVudHJ5LCBTX0lSV1hVIHwgU19JUlVHTyB8IFNfSVhV
R08sCisJCQkgICAgICBkbGd0KTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXRfcHV0
OworCisJbWFkZV9kaXIgPSAxOworCWJlbmQgPSBhdV9kYmVuZChkZW50cnkpOworCWJvcHEgPSBh
dV9kYmRpcm9wcShkZW50cnkpOworCXdoZWQgPSAoYXVfZGJ3aChkZW50cnkpID09IGJkc3QpOwor
CWlmICghYXJncy0+cGFyZW50X29wcSkKKwkJYXJncy0+cGFyZW50X29wcSB8PSAoYm9wcSA8PSBi
ZHN0KTsKKwlwYXJlbnRfb3BxID0gKGFyZ3MtPnBhcmVudF9vcHEgJiYgYXJncy0+cGFyZW50ID09
IGRlbnRyeSk7CisJZG9fb3BxID0gMDsKKwlkaXJvcHEgPSAwOworCWhfaW5vZGUgPSBoX2RlbnRy
eS0+ZF9pbm9kZTsKKwltdXRleF9sb2NrX25lc3RlZCgmaF9pbm9kZS0+aV9tdXRleCwgQXVMc2Nf
SV9DSElMRCk7CisJaWYgKHdoZWQgfHwgKHBhcmVudF9vcHEgJiYgZG9fb3BxKSkgeworCQlvcHFf
ZGVudHJ5ID0gYXVfZGlyb3BxX2NyZWF0ZShkZW50cnksIGJkc3QsIGRsZ3QpOworCQllcnIgPSBQ
VFJfRVJSKG9wcV9kZW50cnkpOworCQlpZiAoSVNfRVJSKG9wcV9kZW50cnkpKSB7CisJCQltdXRl
eF91bmxvY2soJmhfaW5vZGUtPmlfbXV0ZXgpOworCQkJZ290byBvdXRfZGlyOworCQl9CisJCWRw
dXQob3BxX2RlbnRyeSk7CisJCWRpcm9wcSA9IDE7CisJfQorCisJZXJyID0gYXVfY3Bkb3duX2F0
dHIoaF9kZW50cnksIGF1X2hfZHB0cihkZW50cnksIGJzdGFydCksIGRsZ3QpOworCW11dGV4X3Vu
bG9jaygmaF9pbm9kZS0+aV9tdXRleCk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0
X29wcTsKKworCXdoX2RlbnRyeSA9IE5VTEw7CisJaWYgKHdoZWQpIHsKKwkJd2hfZGVudHJ5ID0g
YXVfd2hfbGt1cChoX3BhcmVudCwgJmRlbnRyeS0+ZF9uYW1lLCAvKm5keCovTlVMTCk7CisJCWVy
ciA9IFBUUl9FUlIod2hfZGVudHJ5KTsKKwkJaWYgKElTX0VSUih3aF9kZW50cnkpKQorCQkJZ290
byBvdXRfb3BxOworCQllcnIgPSAwOworCQlpZiAod2hfZGVudHJ5LT5kX2lub2RlKQorCQkJZXJy
ID0gYXVfd2hfdW5saW5rX2RlbnRyeShoX2Rpciwgd2hfZGVudHJ5LCBkZW50cnksCisJCQkJCQkg
IE5VTEwsIGRsZ3QpOworCQlkcHV0KHdoX2RlbnRyeSk7CisJCWlmICh1bmxpa2VseShlcnIpKQor
CQkJZ290byBvdXRfb3BxOworCX0KKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWlmIChh
dV9pYmVuZChpbm9kZSkgPCBiZHN0KQorCQlhdV9zZXRfaWJlbmQoaW5vZGUsIGJkc3QpOworCWF1
X3NldF9oX2lwdHIoaW5vZGUsIGJkc3QsIGlncmFiKGhfaW5vZGUpLCBhdV9oaV9mbGFncyhpbm9k
ZSwgMSkpOworCWdvdG8gb3V0OyAvKiBzdWNjZXNzICovCisKKwkvKiByZXZlcnQgKi8KKyBvdXRf
b3BxOgorCWlmIChkaXJvcHEpIHsKKwkJbXV0ZXhfbG9ja19uZXN0ZWQoJmhfaW5vZGUtPmlfbXV0
ZXgsIEF1THNjX0lfQ0hJTEQpOworCQlyZXJyID0gYXVfZGlyb3BxX3JlbW92ZShkZW50cnksIGJk
c3QsIGRsZ3QpOworCQltdXRleF91bmxvY2soJmhfaW5vZGUtPmlfbXV0ZXgpOworCQlpZiAodW5s
aWtlbHkocmVycikpIHsKKwkJCUF1SU9FcnIoImZhaWxlZCByZW1vdmluZyBkaXJvcHEgZm9yICUu
KnMgYiVkICglZClcbiIsCisJCQkJQXVETE5QYWlyKGRlbnRyeSksIGJkc3QsIHJlcnIpOworCQkJ
ZXJyID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorIG91dF9kaXI6CisJaWYgKG1hZGVf
ZGlyKSB7CisJCXJlcnIgPSB2ZnN1Yl9zaW9fcm1kaXIoaF9kaXIsIGhfZGVudHJ5LCBkbGd0KTsK
KwkJaWYgKHVubGlrZWx5KHJlcnIpKSB7CisJCQlBdUlPRXJyKCJmYWlsZWQgcmVtb3ZpbmcgJS4q
cyBiJWQgKCVkKVxuIiwKKwkJCQlBdURMTlBhaXIoZGVudHJ5KSwgYmRzdCwgcmVycik7CisJCQll
cnIgPSAtRUlPOworCQl9CisJfQorIG91dF9wdXQ6CisJYXVfc2V0X2hfZHB0cihkZW50cnksIGJk
c3QsIE5VTEwpOworCWlmIChhdV9kYmVuZChkZW50cnkpID09IGJkc3QpCisJCWF1X3VwZGF0ZV9k
YmVuZChkZW50cnkpOworIG91dDoKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30K
KworaW50IGF1X2NwZG93bl9kaXJzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5kZXhf
dCBiZHN0LAorCQkgICBzdHJ1Y3QgZGVudHJ5ICpsb2NrZWQpCit7CisJaW50IGVycjsKKwlzdHJ1
Y3QgYXVfY3Bkb3duX2Rpcl9hcmdzIGFyZ3MgPSB7CisJCS5wYXJlbnQJCT0gZGdldF9wYXJlbnQo
ZGVudHJ5KSwKKwkJLnBhcmVudF9vcHEJPSAwCisJfTsKKworCUxLVFJUcmFjZSgiJS4qcywgYiVk
XG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgYmRzdCk7CisKKwllcnIgPSBhdV9jcF9kaXJzKGRlbnRy
eSwgYmRzdCwgbG9ja2VkLCBhdV9jcGRvd25fZGlyLCAmYXJncyk7CisJZHB1dChhcmdzLnBhcmVu
dCk7CisKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLworCisvKiBwb2xpY2llcyBmb3IgY3JlYXRlICovCisKK3N0YXRpYyBpbnQgYXVfd2Jy
X2J1KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGF1ZnNfYmluZGV4X3QgYmluZGV4KQoreworCWZv
ciAoOyBiaW5kZXggPj0gMDsgYmluZGV4LS0pCisJCWlmICghYXVfYnJfcmRvbmx5KGF1X3Nicihz
YiwgYmluZGV4KSkpCisJCQlyZXR1cm4gYmluZGV4OworCXJldHVybiAtRVJPRlM7Cit9CisKKy8q
IHRvcCBkb3duIHBhcmVudCAqLworc3RhdGljIGludCBhdV93YnJfY3JlYXRlX3RkcChzdHJ1Y3Qg
ZGVudHJ5ICpkZW50cnksIGludCBpc2RpcikKK3sKKwlpbnQgZXJyLCBkaXJwZXJtMTsKKwlzdHJ1
Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWF1ZnNfYmluZGV4X3QgYnN0YXJ0LCBiaW5kZXg7CisJc3Ry
dWN0IGRlbnRyeSAqcGFyZW50LCAqaF9wYXJlbnQ7CisJc3RydWN0IGlub2RlICpoX2RpcjsKKwor
CUxLVFJUcmFjZSgiJS4qcywgZGlyICVkXG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgaXNkaXIpOwor
CisJc2IgPSBkZW50cnktPmRfc2I7CisJZGlycGVybTEgPSAhIWF1X29wdF90ZXN0X2RpcnBlcm0x
KGF1X21udGZsYWdzKHNiKSk7CisJYnN0YXJ0ID0gYXVfZGJzdGFydChkZW50cnkpOworCWVyciA9
IGJzdGFydDsKKwlpZiAoIWF1X2JyX3Jkb25seShhdV9zYnIoc2IsIGJzdGFydCkpKQorCQlnb3Rv
IG91dDsKKworCWVyciA9IC1FUk9GUzsKKwlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOwor
CWZvciAoYmluZGV4ID0gYXVfZGJzdGFydChwYXJlbnQpOyBiaW5kZXggPCBic3RhcnQ7IGJpbmRl
eCsrKSB7CisJCWhfcGFyZW50ID0gYXVfaF9kcHRyKHBhcmVudCwgYmluZGV4KTsKKwkJaWYgKCFo
X3BhcmVudCkKKwkJCWNvbnRpbnVlOworCQloX2RpciA9IGhfcGFyZW50LT5kX2lub2RlOworCQlp
ZiAoIWhfZGlyKQorCQkJY29udGludWU7CisKKwkJaWYgKCFhdV9icl9yZG9ubHkoYXVfc2JyKHNi
LCBiaW5kZXgpKQorCQkgICAgJiYgKCFkaXJwZXJtMQorCQkJfHwgYXVfdGVzdF9oX3Blcm0oaF9k
aXIsIE1BWV9XUklURSB8IE1BWV9FWEVDLAorCQkJCQkgIC8qZGxndCovMCkpKSB7CisJCQkJZXJy
ID0gYmluZGV4OworCQkJCWJyZWFrOworCQl9CisJfQorCWRwdXQocGFyZW50KTsKKworCS8qIGJv
dHRvbSB1cCBoZXJlICovCisJaWYgKHVubGlrZWx5KGVyciA8IDApKQorCQllcnIgPSBhdV93YnJf
YnUoc2IsIGJzdGFydCAtIDEpOworCisgb3V0OgorCUxLVFJUcmFjZSgiYiVkXG4iLCBlcnIpOwor
CXJldHVybiBlcnI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogYW4gZXhjZXB0aW9u
IGZvciB0aGUgcG9saWN5IG90aGVyIHRoYW4gdGRwICovCitzdGF0aWMgaW50IGF1X3dicl9jcmVh
dGVfZXhwKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBkZW50
cnkgKnBhcmVudDsKKwlhdWZzX2JpbmRleF90IGJ3aCwgYmRpcm9wcTsKKworCUxLVFJUcmFjZSgi
JS4qc1xuIiwgQXVETE5QYWlyKGRlbnRyeSkpOworCisJZXJyID0gLTE7CisJYndoID0gYXVfZGJ3
aChkZW50cnkpOworCXBhcmVudCA9IGRnZXRfcGFyZW50KGRlbnRyeSk7CisJYmRpcm9wcSA9IGF1
X2RiZGlyb3BxKHBhcmVudCk7CisJaWYgKGJ3aCA+PSAwKSB7CisJCWlmIChiZGlyb3BxID49IDAp
CisJCQllcnIgPSBtaW4oYmRpcm9wcSwgYndoKTsKKwkJZWxzZQorCQkJZXJyID0gYndoOworCQlM
S1RSVHJhY2UoIiVkXG4iLCBlcnIpOworCX0gZWxzZSBpZiAoYmRpcm9wcSA+PSAwKSB7CisJCWVy
ciA9IGJkaXJvcHE7CisJCUxLVFJUcmFjZSgiJWRcbiIsIGVycik7CisJfQorCWRwdXQocGFyZW50
KTsKKworCWlmIChlcnIgPj0gMCAmJiBhdV9icl9yZG9ubHkoYXVfc2JyKGRlbnRyeS0+ZF9zYiwg
ZXJyKSkpCisJCWVyciA9IC0xOworCisJTEtUUlRyYWNlKCIlZFxuIiwgZXJyKTsKKwlyZXR1cm4g
ZXJyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHJvdW5kIHJvYmluICovCitzdGF0
aWMgaW50IGF1X3dicl9jcmVhdGVfaW5pdF9ycihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorewor
CWludCBlcnI7CisKKwllcnIgPSBhdV93YnJfYnUoc2IsIGF1X3NiZW5kKHNiKSk7CisJYXRvbWlj
X3NldCgmYXVfc2JpKHNiKS0+c2lfd2JyX3JyX25leHQsIC1lcnIpOyAvKiBsZXNzIGltcG9ydGFu
dCAqLworCisJTEtUUlRyYWNlKCJiJWRcbiIsIGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3Rh
dGljIGludCBhdV93YnJfY3JlYXRlX3JyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGlzZGly
KQoreworCWludCBlcnIsIG5icjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWF0b21pY190
ICpuZXh0OworCXVuc2lnbmVkIGludCB1OworCWF1ZnNfYmluZGV4X3QgYmluZGV4LCBiZW5kOwor
CisJLy9hdV9kZWJ1Z19vbigpOworCUxLVFJUcmFjZSgiJS4qcywgZGlyICVkXG4iLCBBdURMTlBh
aXIoZGVudHJ5KSwgaXNkaXIpOworCisJc2IgPSBkZW50cnktPmRfc2I7CisJbmV4dCA9IE5VTEw7
CisJZXJyID0gYXVfd2JyX2NyZWF0ZV9leHAoZGVudHJ5KTsKKwlpZiAoZXJyID49IDApCisJCWdv
dG8gb3V0OworCisJbmV4dCA9ICZhdV9zYmkoc2IpLT5zaV93YnJfcnJfbmV4dDsKKwliZW5kID0g
YXVfc2JlbmQoc2IpOworCW5iciA9IGJlbmQgKyAxOworCWZvciAoYmluZGV4ID0gMDsgYmluZGV4
IDw9IGJlbmQ7IGJpbmRleCsrKSB7CisJCWlmICghaXNkaXIpIHsKKwkJCWVyciA9IGF0b21pY19k
ZWNfcmV0dXJuKG5leHQpICsgMTsKKwkJCS8qIG1vZHVsbyBmb3IgMCBpcyBtZWFuaW5nbGVzcyAq
LworCQkJaWYgKHVubGlrZWx5KCFlcnIpKQorCQkJCWVyciA9IGF0b21pY19kZWNfcmV0dXJuKG5l
eHQpICsgMTsKKwkJfSBlbHNlCisJCQllcnIgPSBhdG9taWNfcmVhZChuZXh0KTsKKwkJTEtUUlRy
YWNlKCIlZFxuIiwgZXJyKTsKKwkJdSA9IGVycjsKKwkJZXJyID0gdSAlIG5icjsKKwkJTEtUUlRy
YWNlKCIlZFxuIiwgZXJyKTsKKwkJaWYgKCFhdV9icl9yZG9ubHkoYXVfc2JyKHNiLCBlcnIpKSkK
KwkJCWJyZWFrOworCQllcnIgPSAtRVJPRlM7CisJfQorCisgb3V0OgorCUxLVFJUcmFjZSgiJWRc
biIsIGVycik7CisJLy9hdV9kZWJ1Z19vZmYoKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tICovCisKKy8qIG1vc3QgZnJlZSBzcGFjZSAqLworc3RhdGljIHZvaWQgKmF1X3di
cl9zdGF0ZnNfYXJnKHN0cnVjdCBhdV9icmFuY2ggKmJyLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi
LAorCQkJICAgICAgIGF1ZnNfYmluZGV4X3QgYmluZGV4KQoreworCXN0cnVjdCBzdXBlcl9ibG9j
ayAqaF9zYjsKKworCWhfc2IgPSBici0+YnJfbW50LT5tbnRfc2I7CisKKwlpZiAoIWF1X3Rlc3Rf
bmZzKGhfc2IpKQorCQlyZXR1cm4gaF9zYi0+c19yb290OworCisJLyogc2lnaCwsLCB3aHkgbmZz
IHNfcm9vdCBoYXMgd3JvbmcgaW5vZGU/ICovCisJcmV0dXJuIGF1X2RpKHNiLT5zX3Jvb3QpLT5k
aV9oZGVudHJ5WzAgKyBiaW5kZXhdLmhkX2RlbnRyeTsKK30KKworc3RhdGljIHZvaWQgYXVfbWZz
KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWF1
ZnNfYmluZGV4X3QgYmluZGV4LCBiZW5kOworCWludCBkbGd0LCBlcnI7CisJc3RydWN0IGtzdGF0
ZnMgc3Q7CisJdTY0IGIsIGJhdmFpbDsKKwl2b2lkICphcmc7CisJc3RydWN0IGF1X2JyYW5jaCAq
YnI7CisJc3RydWN0IGF1X3dicl9tZnMgKm1mczsKKworCUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVE
TE5QYWlyKGRlbnRyeSkpOworCisJYmF2YWlsID0gMDsKKwlzYiA9IGRlbnRyeS0+ZF9zYjsKKwlt
ZnMgPSAmYXVfc2JpKHNiKS0+c2lfd2JyX21mczsKKwltZnMtPm1mc19iaW5kZXggPSAtRVJPRlM7
CisJbWZzLT5tZnNycl9ieXRlcyA9IDA7CisJZGxndCA9ICEhYXVfb3B0X3Rlc3RfZGxndChhdV9t
bnRmbGFncyhzYikpOworCWJlbmQgPSBhdV9zYmVuZChzYik7CisJZm9yIChiaW5kZXggPSAwOyBi
aW5kZXggPD0gYmVuZDsgYmluZGV4KyspIHsKKwkJYnIgPSBhdV9zYnIoc2IsIGJpbmRleCk7CisJ
CWlmIChhdV9icl9yZG9ubHkoYnIpKQorCQkJY29udGludWU7CisJCWFyZyA9IGF1X3dicl9zdGF0
ZnNfYXJnKGJyLCBzYiwgYmluZGV4KTsKKwkJaWYgKCFhcmcpCisJCQljb250aW51ZTsKKworCQll
cnIgPSB2ZnN1Yl9zdGF0ZnMoYXJnLCAmc3QsIGRsZ3QpOworCQlMS1RSVHJhY2UoImIlZCwgJWQs
ICVMdVxuIiwKKwkJCSAgYmluZGV4LCBlcnIsICh1bnNpZ25lZCBsb25nIGxvbmcpc3QuZl9iYXZh
aWwpOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJQXVXYXJuMSgiZmFpbGVkIHN0YXRmcywg
YiVkLCAlZFxuIiwgYmluZGV4LCBlcnIpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiB3aGVu
IHRoZSBhdmFpbGFibGUgc2l6ZSBpcyBlcXVhbCwgc2VsZWN0IGxvd2VyIG9uZSAqLworCQliID0g
c3QuZl9iYXZhaWwgKiBzdC5mX2JzaXplOworCQlici0+YnJfYnl0ZXMgPSBiOworCQlpZiAoYiA+
PSBiYXZhaWwpIHsKKwkJCWJhdmFpbCA9IGI7CisJCQltZnMtPm1mc19iaW5kZXggPSBiaW5kZXg7
CisJCQltZnMtPm1mc19qaWZmeSA9IGppZmZpZXM7CisJCX0KKwl9CisKKwltZnMtPm1mc3JyX2J5
dGVzID0gYmF2YWlsOworCUxLVFJUcmFjZSgiYiVkXG4iLCBtZnMtPm1mc19iaW5kZXgpOworfQor
CitzdGF0aWMgaW50IGF1X3dicl9jcmVhdGVfbWZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50
IGlzZGlyKQoreworCWludCBlcnI7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3Qg
YXVfd2JyX21mcyAqbWZzOworCisJLy9hdV9kZWJ1Z19vbigpOworCUxLVFJUcmFjZSgiJS4qc1xu
IiwgQXVETE5QYWlyKGRlbnRyeSkpOworCisJc2IgPSBkZW50cnktPmRfc2I7CisJZXJyID0gYXVf
d2JyX2NyZWF0ZV9leHAoZGVudHJ5KTsKKwlpZiAoZXJyID49IDApCisJCWdvdG8gb3V0OworCisJ
bWZzID0gJmF1X3NiaShzYiktPnNpX3dicl9tZnM7CisJbXV0ZXhfbG9jaygmbWZzLT5tZnNfbG9j
ayk7CisJaWYgKHVubGlrZWx5KHRpbWVfYWZ0ZXIoamlmZmllcywgbWZzLT5tZnNfamlmZnkgKyBt
ZnMtPm1mc19leHBpcmUpCisJCSAgICAgfHwgbWZzLT5tZnNfYmluZGV4IDwgMAorCQkgICAgIHx8
IGF1X2JyX3Jkb25seShhdV9zYnIoc2IsIG1mcy0+bWZzX2JpbmRleCkpKSkKKwkJYXVfbWZzKGRl
bnRyeSk7CisJbXV0ZXhfdW5sb2NrKCZtZnMtPm1mc19sb2NrKTsKKwllcnIgPSBtZnMtPm1mc19i
aW5kZXg7CisKKyBvdXQ6CisJTEtUUlRyYWNlKCJiJWRcbiIsIGVycik7CisJLy9hdV9kZWJ1Z19v
ZmYoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGF1X3dicl9jcmVhdGVfaW5pdF9t
ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYXVfd2JyX21mcyAqbWZzOwor
CisJbWZzID0gJmF1X3NiaShzYiktPnNpX3dicl9tZnM7CisJTEtUUlRyYWNlKCJleHBpcmUgJWx1
XG4iLCBtZnMtPm1mc19leHBpcmUpOworCisJbXV0ZXhfaW5pdCgmbWZzLT5tZnNfbG9jayk7CisJ
bWZzLT5tZnNfamlmZnkgPSAwOworCW1mcy0+bWZzX2JpbmRleCA9IC1FUk9GUzsKKworCXJldHVy
biAwOworfQorCitzdGF0aWMgaW50IGF1X3dicl9jcmVhdGVfZmluX21mcyhzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiKQoreworCUF1VHJhY2VFbnRlcigpOworCW11dGV4X2Rlc3Ryb3koJmF1X3NiaShz
YiktPnNpX3dicl9tZnMubWZzX2xvY2spOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tICovCisKKy8qIG1vc3QgZnJlZSBzcGFjZSBhbmQgdGhlbiByb3VuZCByb2JpbiAqLworc3Rh
dGljIGludCBhdV93YnJfY3JlYXRlX21mc3JyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGlz
ZGlyKQoreworCWludCBlcnI7CisJc3RydWN0IGF1X3dicl9tZnMgKm1mczsKKworCS8vYXVfZGVi
dWdfb24oKTsKKwlMS1RSVHJhY2UoIiUuKnMsICVkXG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgaXNk
aXIpOworCisJZXJyID0gYXVfd2JyX2NyZWF0ZV9tZnMoZGVudHJ5LCBpc2Rpcik7CisJaWYgKGVy
ciA+PSAwKSB7CisJCW1mcyA9ICZhdV9zYmkoZGVudHJ5LT5kX3NiKS0+c2lfd2JyX21mczsKKwkJ
TEtUUlRyYWNlKCIlTHUgYnl0ZXMsICVMdSB3bWFya1xuIiwKKwkJCSAgbWZzLT5tZnNycl9ieXRl
cywgbWZzLT5tZnNycl93YXRlcm1hcmspOworCQlpZiAodW5saWtlbHkobWZzLT5tZnNycl9ieXRl
cyA8IG1mcy0+bWZzcnJfd2F0ZXJtYXJrKSkKKwkJCWVyciA9IGF1X3dicl9jcmVhdGVfcnIoZGVu
dHJ5LCBpc2Rpcik7CisJfQorCisJTEtUUlRyYWNlKCJiJWRcbiIsIGVycik7CisJLy9hdV9kZWJ1
Z19vZmYoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGF1X3dicl9jcmVhdGVfaW5p
dF9tZnNycihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWludCBlcnI7CisJLy9hdV9kZWJ1
Z19vbigpOworCWF1X3dicl9jcmVhdGVfaW5pdF9tZnMoc2IpOyAvKiBpZ25vcmUgKi8KKwllcnIg
PSBhdV93YnJfY3JlYXRlX2luaXRfcnIoc2IpOworCS8vYXVfZGVidWdfb2ZmKCk7CisJcmV0dXJu
IGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB0b3AgZG93biBwYXJlbnQgYW5k
IG1vc3QgZnJlZSBzcGFjZSAqLworc3RhdGljIGludCBhdV93YnJfY3JlYXRlX3BtZnMoc3RydWN0
IGRlbnRyeSAqZGVudHJ5LCBpbnQgaXNkaXIpCit7CisJaW50IGVyciwgZTIsIGRpcnBlcm0xOwor
CXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50LCAqaF9wYXJl
bnQ7CisJYXVmc19iaW5kZXhfdCBiaW5kZXgsIGJzdGFydCwgYmVuZDsKKwlzdHJ1Y3QgYXVfYnJh
bmNoICpicjsKKwl1NjQgYjsKKwlzdHJ1Y3QgaW5vZGUgKmhfZGlyOworCisJLy9hdV9kZWJ1Z19v
bigpOworCUxLVFJUcmFjZSgiJS4qcywgJWRcbiIsIEF1RExOUGFpcihkZW50cnkpLCBpc2Rpcik7
CisKKwllcnIgPSBhdV93YnJfY3JlYXRlX3RkcChkZW50cnksIGlzZGlyKTsKKwlpZiAodW5saWtl
bHkoZXJyIDwgMCkpCisJCWdvdG8gb3V0OworCXBhcmVudCA9IGRnZXRfcGFyZW50KGRlbnRyeSk7
CisJYnN0YXJ0ID0gYXVfZGJzdGFydChwYXJlbnQpOworCWJlbmQgPSBhdV9kYnRhaWxkaXIocGFy
ZW50KTsKKwlpZiAoYnN0YXJ0ID09IGJlbmQpCisJCWdvdG8gb3V0X3BhcmVudDsgLyogc3VjY2Vz
cyAqLworCisJZTIgPSBhdV93YnJfY3JlYXRlX21mcyhkZW50cnksIGlzZGlyKTsKKwlpZiAoZTIg
PCAwKQorCQlnb3RvIG91dF9wYXJlbnQ7IC8qIHN1Y2Nlc3MgKi8KKworCS8qIHdoZW4gdGhlIGF2
YWlsYWJsZSBzaXplIGlzIGVxdWFsLCBzZWxlY3QgdXBwZXIgb25lICovCisJc2IgPSBkZW50cnkt
PmRfc2I7CisJYnIgPSBhdV9zYnIoc2IsIGVycik7CisJZGlycGVybTEgPSAhIWF1X29wdF90ZXN0
X2RpcnBlcm0xKGF1X21udGZsYWdzKHNiKSk7CisJYiA9IGJyLT5icl9ieXRlczsKKwlMS1RSVHJh
Y2UoImIlZCwgJUx1XG4iLCBlcnIsIGIpOworCisJaWYgKHVubGlrZWx5KGRpcnBlcm0xKSkgewor
CQlmb3IgKGJpbmRleCA9IGJzdGFydDsgYmluZGV4IDw9IGJlbmQ7IGJpbmRleCsrKSB7CisJCQlo
X3BhcmVudCA9IGF1X2hfZHB0cihwYXJlbnQsIGJpbmRleCk7CisJCQlpZiAoIWhfcGFyZW50KQor
CQkJCWNvbnRpbnVlOworCQkJaF9kaXIgPSBoX3BhcmVudC0+ZF9pbm9kZTsKKwkJCWlmICghaF9k
aXIpCisJCQkJY29udGludWU7CisKKwkJCWJyID0gYXVfc2JyKHNiLCBiaW5kZXgpOworCQkJaWYg
KCFhdV9icl9yZG9ubHkoYnIpCisJCQkgICAgJiYgYXVfdGVzdF9oX3Blcm0oaF9kaXIsIE1BWV9X
UklURSB8IE1BWV9FWEVDLAorCQkJCQkgICAgICAvKmRsZ3QqLzApCisJCQkgICAgJiYgYnItPmJy
X2J5dGVzID4gYikgeworCQkJCWIgPSBici0+YnJfYnl0ZXM7CisJCQkJZXJyID0gYmluZGV4Owor
CQkJCUxLVFJUcmFjZSgiYiVkLCAlTHVcbiIsIGVyciwgYik7CisJCQl9CisJCX0KKwkJaWYgKGVy
ciA+PSAwKQorCQkJZ290byBvdXRfcGFyZW50OworCX0KKwlmb3IgKGJpbmRleCA9IGJzdGFydDsg
YmluZGV4IDw9IGJlbmQ7IGJpbmRleCsrKSB7CisJCWhfcGFyZW50ID0gYXVfaF9kcHRyKHBhcmVu
dCwgYmluZGV4KTsKKwkJaWYgKCFoX3BhcmVudCB8fCAhaF9wYXJlbnQtPmRfaW5vZGUpCisJCQlj
b250aW51ZTsKKworCQliciA9IGF1X3NicihzYiwgYmluZGV4KTsKKwkJaWYgKCFhdV9icl9yZG9u
bHkoYnIpICYmIGJyLT5icl9ieXRlcyA+IGIpIHsKKwkJCWIgPSBici0+YnJfYnl0ZXM7CisJCQll
cnIgPSBiaW5kZXg7CisJCQlMS1RSVHJhY2UoImIlZCwgJUx1XG4iLCBlcnIsIGIpOworCQl9CisJ
fQorCisgb3V0X3BhcmVudDoKKwlkcHV0KHBhcmVudCk7Cisgb3V0OgorCUxLVFJUcmFjZSgiYiVk
XG4iLCBlcnIpOworCS8vYXVfZGVidWdfb2ZmKCk7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSAqLworCisvKiBwb2xpY2llcyBmb3IgY29weXVwICovCisKKy8qIHRvcCBkb3du
IHBhcmVudCAqLworc3RhdGljIGludCBhdV93YnJfY29weXVwX3RkcChzdHJ1Y3QgZGVudHJ5ICpk
ZW50cnkpCit7CisJcmV0dXJuIGF1X3dicl9jcmVhdGVfdGRwKGRlbnRyeSwgLyppc2RpciwgYW55
dGhpbmcgaXMgb2sqLzApOworfQorCisvKiBib3R0b20gdXAgcGFyZW50ICovCitzdGF0aWMgaW50
IGF1X3dicl9jb3B5dXBfYnVwKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyLCBk
aXJwZXJtMTsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsICpoX3BhcmVudDsKKwlhdWZzX2JpbmRl
eF90IGJpbmRleCwgYnN0YXJ0OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGlu
b2RlICpoX2RpcjsKKworCUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVETE5QYWlyKGRlbnRyeSkpOwor
CisJZXJyID0gLUVST0ZTOworCXNiID0gZGVudHJ5LT5kX3NiOworCWRpcnBlcm0xID0gISFhdV9v
cHRfdGVzdF9kaXJwZXJtMShhdV9tbnRmbGFncyhzYikpOworCXBhcmVudCA9IGRnZXRfcGFyZW50
KGRlbnRyeSk7CisJYnN0YXJ0ID0gYXVfZGJzdGFydChwYXJlbnQpOworCWZvciAoYmluZGV4ID0g
YXVfZGJzdGFydChkZW50cnkpOyBiaW5kZXggPj0gYnN0YXJ0OyBiaW5kZXgtLSkgeworCQloX3Bh
cmVudCA9IGF1X2hfZHB0cihwYXJlbnQsIGJpbmRleCk7CisJCWlmICghaF9wYXJlbnQpCisJCQlj
b250aW51ZTsKKwkJaF9kaXIgPSBoX3BhcmVudC0+ZF9pbm9kZTsKKwkJaWYgKCFoX2RpcikKKwkJ
CWNvbnRpbnVlOworCisJCWlmICghYXVfYnJfcmRvbmx5KGF1X3NicihzYiwgYmluZGV4KSkKKwkJ
ICAgICYmICghZGlycGVybTEKKwkJCXx8IGF1X3Rlc3RfaF9wZXJtKGhfZGlyLCBNQVlfV1JJVEUg
fCBNQVlfRVhFQywKKwkJCQkJICAvKmRsZ3QqLzApKSkgeworCQkJZXJyID0gYmluZGV4OworCQkJ
YnJlYWs7CisJCX0KKwl9CisJZHB1dChwYXJlbnQpOworCisJLyogYm90dG9tIHVwIGhlcmUgKi8K
KwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCWVyciA9IGF1X3dicl9idShzYiwgYnN0YXJ0IC0g
MSk7CisKKwlMS1RSVHJhY2UoImIlZFxuIiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBi
b3R0b20gdXAgKi8KK3N0YXRpYyBpbnQgYXVfd2JyX2NvcHl1cF9idShzdHJ1Y3QgZGVudHJ5ICpk
ZW50cnkpCit7CisJaW50IGVycjsKKworCUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVETE5QYWlyKGRl
bnRyeSkpOworCisJZXJyID0gYXVfd2JyX2J1KGRlbnRyeS0+ZF9zYiwgYXVfZGJzdGFydChkZW50
cnkpKTsKKworCUxLVFJUcmFjZSgiYiVkXG4iLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGF1X3dicl9jb3B5dXBfb3BlcmF0aW9ucyBhdV93
YnJfY29weXVwX29wc1tdID0geworCVtBdVdickNvcHl1cF9URFBdID0geworCQkuY29weXVwCT0g
YXVfd2JyX2NvcHl1cF90ZHAKKwl9LAorCVtBdVdickNvcHl1cF9CVVBdID0geworCQkuY29weXVw
CT0gYXVfd2JyX2NvcHl1cF9idXAKKwl9LAorCVtBdVdickNvcHl1cF9CVV0gPSB7CisJCS5jb3B5
dXAJPSBhdV93YnJfY29weXVwX2J1CisJfQorfTsKKworc3RydWN0IGF1X3dicl9jcmVhdGVfb3Bl
cmF0aW9ucyBhdV93YnJfY3JlYXRlX29wc1tdID0geworCVtBdVdickNyZWF0ZV9URFBdID0gewor
CQkuY3JlYXRlCT0gYXVfd2JyX2NyZWF0ZV90ZHAKKwl9LAorCVtBdVdickNyZWF0ZV9SUl0gPSB7
CisJCS5jcmVhdGUJPSBhdV93YnJfY3JlYXRlX3JyLAorCQkuaW5pdAk9IGF1X3dicl9jcmVhdGVf
aW5pdF9ycgorCX0sCisJW0F1V2JyQ3JlYXRlX01GU10gPSB7CisJCS5jcmVhdGUJPSBhdV93YnJf
Y3JlYXRlX21mcywKKwkJLmluaXQJPSBhdV93YnJfY3JlYXRlX2luaXRfbWZzLAorCQkuZmluCT0g
YXVfd2JyX2NyZWF0ZV9maW5fbWZzCisJfSwKKwlbQXVXYnJDcmVhdGVfTUZTVl0gPSB7CisJCS5j
cmVhdGUJPSBhdV93YnJfY3JlYXRlX21mcywKKwkJLmluaXQJPSBhdV93YnJfY3JlYXRlX2luaXRf
bWZzLAorCQkuZmluCT0gYXVfd2JyX2NyZWF0ZV9maW5fbWZzCisJfSwKKwlbQXVXYnJDcmVhdGVf
TUZTUlJdID0geworCQkuY3JlYXRlCT0gYXVfd2JyX2NyZWF0ZV9tZnNyciwKKwkJLmluaXQJPSBh
dV93YnJfY3JlYXRlX2luaXRfbWZzcnIsCisJCS5maW4JPSBhdV93YnJfY3JlYXRlX2Zpbl9tZnMK
Kwl9LAorCVtBdVdickNyZWF0ZV9NRlNSUlZdID0geworCQkuY3JlYXRlCT0gYXVfd2JyX2NyZWF0
ZV9tZnNyciwKKwkJLmluaXQJPSBhdV93YnJfY3JlYXRlX2luaXRfbWZzcnIsCisJCS5maW4JPSBh
dV93YnJfY3JlYXRlX2Zpbl9tZnMKKwl9LAorCVtBdVdickNyZWF0ZV9QTUZTXSA9IHsKKwkJLmNy
ZWF0ZQk9IGF1X3dicl9jcmVhdGVfcG1mcywKKwkJLmluaXQJPSBhdV93YnJfY3JlYXRlX2luaXRf
bWZzLAorCQkuZmluCT0gYXVfd2JyX2NyZWF0ZV9maW5fbWZzCisJfSwKKwlbQXVXYnJDcmVhdGVf
UE1GU1ZdID0geworCQkuY3JlYXRlCT0gYXVfd2JyX2NyZWF0ZV9wbWZzLAorCQkuaW5pdAk9IGF1
X3dicl9jcmVhdGVfaW5pdF9tZnMsCisJCS5maW4JPSBhdV93YnJfY3JlYXRlX2Zpbl9tZnMKKwl9
Cit9OwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvd2hvdXQu
YyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvd2hvdXQuYwotLS0gbGludXgtMi42LjI1
LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMvd2hvdXQuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAw
CisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvd2hvdXQuYwkyMDA4LTA1LTI1IDEx
OjU4OjUzICswMzAwCkBAIC0wLDAgKzEsMTA1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
NS0yMDA4IEp1bmppcm8gT2thamltYQorICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcg
d2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAq
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBN
QSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworLyoKKyAqIHdoaXRlb3V0IGZvciBsb2dpY2FsIGRl
bGV0aW9uIGFuZCBvcGFxdWUgZGlyZWN0b3J5CisgKgorICogJElkOiB3aG91dC5jLHYgMS40IDIw
MDgvMDUvMTIgMDA6Mjc6NTggc2Zqcm8gRXhwICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMu
aD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorLy8jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+
CisvLyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgImF1ZnMuaCIKKworI2Rl
ZmluZSBXSF9NQVNLCQkJU19JUlVHTworCisvKiBJZiBhIGRpcmVjdG9yeSBjb250YWlucyB0aGlz
IGZpbGUsIHRoZW4gaXQgaXMgb3BhcXVlLiAgV2Ugc3RhcnQgd2l0aCB0aGUKKyAqIC53aC4gZmxh
ZyBzbyB0aGF0IGl0IGlzIGJsb2NrZWQgYnkgbG9va3VwLgorICovCitzdGF0aWMgc3RydWN0IHFz
dHIgZGlyb3BxX25hbWUgPSB7CisJLm5hbWUgPSBBVUZTX1dIX0RJUk9QUSwKKwkubGVuID0gc2l6
ZW9mKEFVRlNfV0hfRElST1BRKSAtIDEKK307CisKKy8qCisgKiBnZW5lcmF0ZSB3aGl0ZW91dCBu
YW1lLCB3aGljaCBpcyBOT1QgdGVybWluYXRlZCBieSBOVUxMLgorICogQG5hbWU6IG9yaWdpbmFs
IGRfbmFtZS5uYW1lCisgKiBAbGVuOiBvcmlnaW5hbCBkX25hbWUubGVuCisgKiBAd2g6IHdoaXRl
b3V0IHFzdHIKKyAqIHJldHVybnMgemVybyB3aGVuIHN1Y2NlZWRzLCBvdGhlcndpc2UgZXJyb3Iu
CisgKiBzdWNjZWVkZWQgdmFsdWUgYXMgd2gtPm5hbWUgc2hvdWxkIGJlIGZyZWVkIGJ5IGF1X3do
X25hbWVfZnJlZSgpLgorICovCitpbnQgYXVfd2hfbmFtZV9hbGxvYyhjb25zdCBjaGFyICpuYW1l
LCBpbnQgbGVuLCBzdHJ1Y3QgcXN0ciAqd2gpCit7CisJY2hhciAqcDsKKworCUF1RGVidWdPbigh
bmFtZSB8fCAhbGVuIHx8ICF3aCk7CisKKwlpZiAodW5saWtlbHkobGVuID4gUEFUSF9NQVggLSBB
VUZTX1dIX1BGWF9MRU4pKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXdoLT5sZW4gPSBs
ZW4gKyBBVUZTX1dIX1BGWF9MRU47CisJcCA9IGttYWxsb2Mod2gtPmxlbiwgR0ZQX0tFUk5FTCk7
CisJd2gtPm5hbWUgPSBwOworCS8vaWYgKExrdHJDb25kKSB7a2ZyZWUocCk7IHdoLT5uYW1lID0g
cCA9IE5VTEw7fQorCWlmIChwKSB7CisJCW1lbWNweShwLCBBVUZTX1dIX1BGWCwgQVVGU19XSF9Q
RlhfTEVOKTsKKwkJbWVtY3B5KHAgKyBBVUZTX1dIX1BGWF9MRU4sIG5hbWUsIGxlbik7CisJCS8v
c21wX21iKCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCBh
dV93aF9uYW1lX2ZyZWUoc3RydWN0IHFzdHIgKndoKQoreworCUF1RGVidWdPbighd2ggfHwgIXdo
LT5uYW1lKTsKKwlrZnJlZSh3aC0+bmFtZSk7CisjaWZkZWYgQ09ORklHX0FVRlNfREVCVUcKKwl3
aC0+bmFtZSA9IE5VTEw7CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgor
ICogdGVzdCBpZiB0aGUgQHdoX25hbWUgZXhpc3RzIHVuZGVyIEBoX3BhcmVudC4KKyAqIEB0cnlf
c2lvIHNwZWNpZmllcyB0aGUgbmVjZXNzYXJ5IG9mIHN1cGVyLWlvLgorICovCitpbnQgYXVfd2hf
dGVzdChzdHJ1Y3QgZGVudHJ5ICpoX3BhcmVudCwgc3RydWN0IHFzdHIgKndoX25hbWUsIGludCB0
cnlfc2lvLAorCSAgICAgICBzdHJ1Y3QgYXVfbmR4ICpuZHgpCit7CisJaW50IGVycjsKKwlzdHJ1
Y3QgZGVudHJ5ICp3aF9kZW50cnk7CisJc3RydWN0IGlub2RlICpoX2RpcjsKKwl1bnNpZ25lZCBp
bnQgZmxhZ3M7CisKKwlMS1RSVHJhY2UoIiUuKnMvJS4qcywgbmR4eyVwLCAweCV4fVxuIiwgQXVE
TE5QYWlyKGhfcGFyZW50KSwKKwkJICB3aF9uYW1lLT5sZW4sIHdoX25hbWUtPm5hbWUsIG5keC0+
bmZzbW50LCBuZHgtPmZsYWdzKTsKKwloX2RpciA9IGhfcGFyZW50LT5kX2lub2RlOworCUF1RGVi
dWdPbighU19JU0RJUihoX2Rpci0+aV9tb2RlKSk7CisKKwlmbGFncyA9IDA7CisJaWYgKG5keCAm
JiBuZHgtPm5kKSB7CisJCWZsYWdzID0gbmR4LT5uZC0+ZmxhZ3M7CisJCW5keC0+bmQtPmZsYWdz
ICY9IH4oTE9PS1VQX09QRU4gfCBMT09LVVBfQ1JFQVRFKTsKKwl9CisKKwlpZiAoIXRyeV9zaW8p
CisJCXdoX2RlbnRyeSA9IGF1X2xrdXBfb25lKHdoX25hbWUtPm5hbWUsIGhfcGFyZW50LAorCQkJ
CQl3aF9uYW1lLT5sZW4sIG5keCk7CisJZWxzZQorCQl3aF9kZW50cnkgPSBhdV9zaW9fbGt1cF9v
bmUod2hfbmFtZS0+bmFtZSwgaF9wYXJlbnQsCisJCQkJCSAgICB3aF9uYW1lLT5sZW4sIG5keCk7
CisJaWYgKGZsYWdzKQorCQluZHgtPm5kLT5mbGFncyA9IGZsYWdzOworCS8vaWYgKExrdHJDb25k
KSB7ZHB1dCh3aF9kZW50cnkpOyB3aF9kZW50cnkgPSBFUlJfUFRSKC0xKTt9CisJZXJyID0gUFRS
X0VSUih3aF9kZW50cnkpOworCWlmIChJU19FUlIod2hfZGVudHJ5KSkKKwkJZ290byBvdXQ7CisK
KwllcnIgPSAwOworCWlmICghd2hfZGVudHJ5LT5kX2lub2RlKQorCQlnb3RvIG91dF93aDsgLyog
c3VjY2VzcyAqLworCisJZXJyID0gMTsKKwlpZiAoU19JU1JFRyh3aF9kZW50cnktPmRfaW5vZGUt
PmlfbW9kZSkpCisJCWdvdG8gb3V0X3doOyAvKiBzdWNjZXNzICovCisKKwllcnIgPSAtRUlPOwor
CUF1SU9FcnIoIiUuKnMgSW52YWxpZCB3aGl0ZW91dCBlbnRyeSB0eXBlIDAlby5cbiIsCisJCUF1
RExOUGFpcih3aF9kZW50cnkpLCB3aF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSk7CisKKyBvdXRf
d2g6CisJZHB1dCh3aF9kZW50cnkpOworIG91dDoKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJu
IGVycjsKK30KKworLyoKKyAqIHRlc3QgaWYgdGhlIEBoX2RlbnRyeSBzZXRzIG9wYXF1ZSBvciBu
b3QuCisgKi8KK2ludCBhdV9kaXJvcHFfdGVzdChzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeSwgc3Ry
dWN0IGF1X25keCAqbmR4KQoreworCWludCBlcnIsIHRyeV9zaW87CisJc3RydWN0IGlub2RlICpo
X2RpcjsKKworCUxLVFJUcmFjZSgiZGVudHJ5ICUuKnNcbiIsIEF1RExOUGFpcihoX2RlbnRyeSkp
OworCWhfZGlyID0gaF9kZW50cnktPmRfaW5vZGU7CisJQXVEZWJ1Z09uKCFTX0lTRElSKGhfZGly
LT5pX21vZGUpKTsKKworCXRyeV9zaW8gPSBhdV90ZXN0X2hfcGVybV9zaW8oaF9kaXIsIE1BWV9F
WEVDLAorCQkJCSAgICAgYXVfZnRlc3RfbmR4KG5keC0+ZmxhZ3MsIERMR1QpKTsKKwllcnIgPSBh
dV93aF90ZXN0KGhfZGVudHJ5LCAmZGlyb3BxX25hbWUsIHRyeV9zaW8sIG5keCk7CisJQXVUcmFj
ZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiByZXR1cm5zIGEgbmVnYXRpdmUg
ZGVudHJ5IHdob3NlIG5hbWUgaXMgdW5pcXVlIGFuZCB0ZW1wb3JhcnkuCisgKi8KK3N0cnVjdCBk
ZW50cnkgKmF1X3dodG1wX2xrdXAoc3RydWN0IGRlbnRyeSAqaF9wYXJlbnQsIHN0cnVjdCBxc3Ry
ICpwcmVmaXgsCisJCQkgICAgIHN0cnVjdCBhdV9uZHggKm5keCkKK3sKKyNkZWZpbmUgSEVYX0xF
TiA0CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWludCBsZW4sIGk7CisJY2hhciBkZWZuYW1l
W0FVRlNfV0hfUEZYX0xFTiAqIDIgKyBETkFNRV9JTkxJTkVfTEVOX01JTiArIDEKKwkJICAgICAr
IEhFWF9MRU4gKyAxXSwgKm5hbWUsICpwOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNudDsKKwor
CUxLVFJUcmFjZSgiaHAgJS4qcywgcHJlZml4ICUuKnNcbiIsCisJCSAgQXVETE5QYWlyKGhfcGFy
ZW50KSwgcHJlZml4LT5sZW4sIHByZWZpeC0+bmFtZSk7CisJQXVEZWJ1Z09uKCFoX3BhcmVudC0+
ZF9pbm9kZSk7CisKKwluYW1lID0gZGVmbmFtZTsKKwlsZW4gPSBzaXplb2YoZGVmbmFtZSkgLSBE
TkFNRV9JTkxJTkVfTEVOX01JTiArIHByZWZpeC0+bGVuIC0gMTsKKwlpZiAodW5saWtlbHkocHJl
Zml4LT5sZW4gPiBETkFNRV9JTkxJTkVfTEVOX01JTikpIHsKKwkJZGVudHJ5ID0gRVJSX1BUUigt
RU5BTUVUT09MT05HKTsKKwkJaWYgKHVubGlrZWx5KGxlbiA+PSBQQVRIX01BWCkpCisJCQlnb3Rv
IG91dDsKKwkJZGVudHJ5ID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJbmFtZSA9IGttYWxsb2MobGVu
ICsgMSwgR0ZQX0tFUk5FTCk7CisJCS8vaWYgKExrdHJDb25kKSB7a2ZyZWUobmFtZSk7IG5hbWUg
PSBOVUxMO30KKwkJaWYgKHVubGlrZWx5KCFuYW1lKSkKKwkJCWdvdG8gb3V0OworCX0KKworCS8q
IGRvdWJseSB3aGl0ZW91dC1lZCAqLworCW1lbWNweShuYW1lLCBBVUZTX1dIX1BGWCBBVUZTX1dI
X1BGWCwgQVVGU19XSF9QRlhfTEVOICogMik7CisJcCA9IG5hbWUgKyBBVUZTX1dIX1BGWF9MRU4g
KiAyOworCW1lbWNweShwLCBwcmVmaXgtPm5hbWUsIHByZWZpeC0+bGVuKTsKKwlwICs9IHByZWZp
eC0+bGVuOworCSpwKysgPSAnLic7CisJQXVEZWJ1Z09uKG5hbWUgKyBsZW4gKyAxIC0gcCA8PSBI
RVhfTEVOKTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJc3ByaW50ZihwLCAiJS4q
ZCIsIEhFWF9MRU4sIGNudCsrKTsKKwkJZGVudHJ5ID0gYXVfc2lvX2xrdXBfb25lKG5hbWUsIGhf
cGFyZW50LCBsZW4sIG5keCk7CisJCS8vaWYgKExrdHJDb25kKSB7ZHB1dChkZW50cnkpOyBkZW50
cnkgPSBFUlJfUFRSKC0xKTt9CisJCWlmIChJU19FUlIoZGVudHJ5KSB8fCAhZGVudHJ5LT5kX2lu
b2RlKQorCQkJZ290byBvdXRfbmFtZTsKKwkJZHB1dChkZW50cnkpOworCX0KKwkvKiBBdVdhcm4o
ImNvdWxkIG5vdCBnZXQgcmFuZG9tIG5hbWVcbiIpOyAqLworCWRlbnRyeSA9IEVSUl9QVFIoLUVF
WElTVCk7CisJQXVEYmcoIiUuKnNcbiIsIGxlbiwgbmFtZSk7CisJQlVHKCk7CisKKyBvdXRfbmFt
ZToKKwlpZiAodW5saWtlbHkobmFtZSAhPSBkZWZuYW1lKSkKKwkJa2ZyZWUobmFtZSk7Cisgb3V0
OgorCUF1VHJhY2VFcnJQdHIoZGVudHJ5KTsKKwlyZXR1cm4gZGVudHJ5OworI3VuZGVmIEhFWF9M
RU4KK30KKworLyoKKyAqIHJlbmFtZSB0aGUgQGRlbnRyeSBvZiBAYmluZGV4IHRvIHRoZSB3aGl0
ZW91dGVkIHRlbXBvcmFyeSBuYW1lLgorICovCitpbnQgYXVfd2h0bXBfcmVuKHN0cnVjdCBpbm9k
ZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmluZGV4LAorCQkg
aW50IG5vc2VsZikKK3sKKwlpbnQgZXJyLCBkbGd0OworCXN0cnVjdCBpbm9kZSAqaF9kaXI7CisJ
c3RydWN0IGRlbnRyeSAqaF9kZW50cnksICpoX3BhcmVudCwgKnRtcF9kZW50cnk7CisJc3RydWN0
IHN1cGVyX2Jsb2NrICpzYjsKKwl1bnNpZ25lZCBpbnQgbW50X2ZsYWdzOworCXN0cnVjdCBhdV9o
aW5faWdub3JlIGlnbjsKKwlzdHJ1Y3QgdmZzdWJfYXJncyB2YXJnczsKKwlzdHJ1Y3QgYXVfbmR4
IG5keCA9IHsKKwkJLmZsYWdzCT0gMCwKKwkJLm5kCT0gTlVMTCwKKwkJLy8uYnIJPSBOVUxMCisJ
fTsKKworCUxLVFJUcmFjZSgiJS4qcywgYiVkXG4iLCBBdURMTlBhaXIoZGVudHJ5KSwgYmluZGV4
KTsKKwloX2RlbnRyeSA9IGF1X2hfZHB0cihkZW50cnksIGJpbmRleCk7CisJQXVEZWJ1Z09uKCFo
X2RlbnRyeSB8fCAhaF9kZW50cnktPmRfaW5vZGUpOworCWhfcGFyZW50ID0gaF9kZW50cnktPmRf
cGFyZW50OyAvKiBkaXIgaW5vZGUgaXMgbG9ja2VkICovCisJaF9kaXIgPSBoX3BhcmVudC0+ZF9p
bm9kZTsKKwlJTXVzdExvY2soaF9kaXIpOworCisJc2IgPSBkZW50cnktPmRfc2I7CisJbW50X2Zs
YWdzID0gYXVfbW50ZmxhZ3Moc2IpOworCWRsZ3QgPSAhIWF1X29wdF90ZXN0X2RsZ3QobW50X2Zs
YWdzKTsKKwlpZiAodW5saWtlbHkoZGxndCkpCisJCWF1X2ZzZXRfbmR4KG5keC5mbGFncywgRExH
VCk7CisJbmR4Lm5mc21udCA9IGF1X25mc21udChzYiwgYmluZGV4KTsKKwl0bXBfZGVudHJ5ID0g
YXVfd2h0bXBfbGt1cChoX3BhcmVudCwgJmhfZGVudHJ5LT5kX25hbWUsICZuZHgpOworCS8vaWYg
KExrdHJDb25kKSB7ZHB1dCh0bXBfZGVudHJ5KTsgdG1wX2RlbnRyeSA9IEVSUl9QVFIoLTEpO30K
KwllcnIgPSBQVFJfRVJSKHRtcF9kZW50cnkpOworCWlmICghSVNfRVJSKHRtcF9kZW50cnkpKSB7
CisJCS8qIHVuZGVyIHRoZSBzYW1lIGRpciwgbm8gbmVlZCB0byBsb2NrX3JlbmFtZSgpICovCisJ
CXZmc3ViX2FyZ3NfaW5pdCgmdmFyZ3MsICZpZ24sIGRsZ3QsIDApOworCQlBdURlYnVnT24oIVNf
SVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKTsKKwkJaWYgKHVubGlrZWx5KGF1X29wdF90
ZXN0KG1udF9mbGFncywgVURCQV9JTk9USUZZKSAmJiAhbm9zZWxmKSkKKwkJCXZmc3ViX2lnbl9o
aW5vZGUoJnZhcmdzLCBJTl9NT1ZFX1NFTEYsCisJCQkJCSBhdV9oaShkZW50cnktPmRfaW5vZGUs
IGJpbmRleCkpOworCQllcnIgPSB2ZnN1Yl9yZW5hbWUoaF9kaXIsIGhfZGVudHJ5LCBoX2Rpciwg
dG1wX2RlbnRyeSwgJnZhcmdzKTsKKwkJLy9pZiAoTGt0ckNvbmQpIGVyciA9IC0xOyAvL3VuYXZh
aWxhYmxlCisJCUF1VHJhY2VFcnIoZXJyKTsKKwkJZHB1dCh0bXBfZGVudHJ5KTsKKwl9CisKKwlB
dVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwor
CitzdGF0aWMgaW50IGRvX3VubGlua193aChzdHJ1Y3QgaW5vZGUgKmhfZGlyLCBzdHJ1Y3QgZGVu
dHJ5ICp3aF9kZW50cnksCisJCQlzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IGRsZ3QpCit7CisJc3Ry
dWN0IHZmc3ViX2FyZ3MgdmFyZ3M7CisKKwlMS1RSVHJhY2UoImhpJWx1LCB3aCAlLipzXG4iLCBo
X2Rpci0+aV9pbm8sIEF1RExOUGFpcih3aF9kZW50cnkpKTsKKwlBdURlYnVnT24oIXdoX2RlbnRy
eS0+ZF9pbm9kZSB8fCAhU19JU1JFRyh3aF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpOworCisJ
LyoKKwkgKiBmb3JjZXMgc3VwZXJpbyB3aGVuIHRoZSBkaXIgaGFzIGEgc3RpY2t5IGJpdC4KKwkg
KiB0aGlzIG1heSBiZSBhIHZpb2xhdGlvbiBvZiB1bml4IGZzIHNlbWFudGljcy4KKwkgKi8KKwl2
ZnN1Yl9hcmdzX2luaXQoJnZhcmdzLCBOVUxMLCBkbGd0LAorCQkJKGhfZGlyLT5pX21vZGUgJiBT
X0lTVlRYKQorCQkJJiYgd2hfZGVudHJ5LT5kX2lub2RlLT5pX3VpZCAhPSBjdXJyZW50LT5mc3Vp
ZCk7CisJcmV0dXJuIHZmc3ViX3VubGluayhoX2Rpciwgd2hfZGVudHJ5LCAmdmFyZ3MpOworfQor
CitpbnQgYXVfd2hfdW5saW5rX2RlbnRyeShzdHJ1Y3QgaW5vZGUgKmhfZGlyLCBzdHJ1Y3QgZGVu
dHJ5ICp3aF9kZW50cnksCisJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAq
ZGlyLCBpbnQgZGxndCkKK3sKKwlpbnQgZXJyOworCisJTEtUUlRyYWNlKCJoaSVsdSwgd2ggJS4q
cywgZCAlcFxuIiwgaF9kaXItPmlfaW5vLAorCQkgIEF1RExOUGFpcih3aF9kZW50cnkpLCBkZW50
cnkpOworCUF1RGVidWdPbigoZGVudHJ5ICYmIGF1X2Rid2goZGVudHJ5KSA8IDApCisJCSAgfHwg
IXdoX2RlbnRyeS0+ZF9pbm9kZQorCQkgIHx8ICFTX0lTUkVHKHdoX2RlbnRyeS0+ZF9pbm9kZS0+
aV9tb2RlKSk7CisKKwllcnIgPSBkb191bmxpbmtfd2goaF9kaXIsIHdoX2RlbnRyeSwgZGlyLCBk
bGd0KTsKKwkvL2lmIChMa3RyQ29uZCkgZXJyID0gLTE7IC8vIHVuYXZhaWxhYmxlCisJaWYgKCFl
cnIgJiYgZGVudHJ5KQorCQlhdV9zZXRfZGJ3aChkZW50cnksIC0xKTsKKworCUF1VHJhY2VFcnIo
ZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVubGlua193aF9uYW1lKHN0cnVj
dCBkZW50cnkgKmhfcGFyZW50LCBzdHJ1Y3QgcXN0ciAqd2gsCisJCQkgIHN0cnVjdCBpbm9kZSAq
ZGlyLCBzdHJ1Y3QgYXVfbmR4ICpuZHgpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmhf
ZGlyOworCXN0cnVjdCBkZW50cnkgKmhfZGVudHJ5OworCisJTEtUUlRyYWNlKCIlLipzLyUuKnNc
biIsIEF1RExOUGFpcihoX3BhcmVudCksIEF1TE5QYWlyKHdoKSk7CisJaF9kaXIgPSBoX3BhcmVu
dC0+ZF9pbm9kZTsKKworCS8qIGF1X3Rlc3RfaF9wZXJtKCkgaXMgYWxyZWFkeSBkb25lICovCisJ
aF9kZW50cnkgPSBhdV9sa3VwX29uZSh3aC0+bmFtZSwgaF9wYXJlbnQsIHdoLT5sZW4sIG5keCk7
CisJLy9pZiAoTGt0ckNvbmQpIHtkcHV0KGhfZGVudHJ5KTsgaF9kZW50cnkgPSBFUlJfUFRSKC0x
KTt9CisJaWYgKCFJU19FUlIoaF9kZW50cnkpKSB7CisJCWVyciA9IDA7CisJCWlmIChoX2RlbnRy
eS0+ZF9pbm9kZSAmJiBTX0lTUkVHKGhfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQorCQkJZXJy
ID0gZG9fdW5saW5rX3doKGhfZGlyLCBoX2RlbnRyeSwgZGlyLAorCQkJCQkgICBhdV9mdGVzdF9u
ZHgobmR4LT5mbGFncywgRExHVCkpOworCQlkcHV0KGhfZGVudHJ5KTsKKwl9IGVsc2UKKwkJZXJy
ID0gUFRSX0VSUihoX2RlbnRyeSk7CisKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsK
K30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBjbGVhbl93aChzdHJ1Y3Qg
aW5vZGUgKmhfZGlyLCBzdHJ1Y3QgZGVudHJ5ICp3aCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB2
ZnN1Yl9hcmdzIHZhcmdzOworCisJQXVUcmFjZUVudGVyKCk7CisKKwlpZiAod2gtPmRfaW5vZGUp
IHsKKwkJdmZzdWJfYXJnc19pbml0KCZ2YXJncywgTlVMTCwgMCwgMCk7CisJCWVyciA9IHZmc3Vi
X3VubGluayhoX2Rpciwgd2gsICZ2YXJncyk7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJQXVX
YXJuKCJmYWlsZWQgdW5saW5rICUuKnMgKCVkKSwgaWdub3JlZC5cbiIsCisJCQkgICAgICAgQXVE
TE5QYWlyKHdoKSwgZXJyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFuX3BsaW5rKHN0cnVj
dCBpbm9kZSAqaF9kaXIsIHN0cnVjdCBkZW50cnkgKnBsaW5rKQoreworCWludCBlcnI7CisJc3Ry
dWN0IHZmc3ViX2FyZ3MgdmFyZ3M7CisKKwlBdVRyYWNlRW50ZXIoKTsKKworCWlmIChwbGluay0+
ZF9pbm9kZSkgeworCQl2ZnN1Yl9hcmdzX2luaXQoJnZhcmdzLCBOVUxMLCAwLCAwKTsKKwkJZXJy
ID0gdmZzdWJfcm1kaXIoaF9kaXIsIHBsaW5rLCAmdmFyZ3MpOworCQlpZiAodW5saWtlbHkoZXJy
KSkKKwkJCUF1V2FybigiZmFpbGVkIHJtZGlyICUuKnMgKCVkKSwgaWdub3JlZC5cbiIsCisJCQkg
ICAgICAgQXVETE5QYWlyKHBsaW5rKSwgZXJyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9s
aW5rYWJsZShzdHJ1Y3QgaW5vZGUgKmhfZGlyKQoreworCWlmIChoX2Rpci0+aV9vcCAmJiBoX2Rp
ci0+aV9vcC0+bGluaykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRp
YyBpbnQgcGxpbmtfZGlyKHN0cnVjdCBpbm9kZSAqaF9kaXIsIHN0cnVjdCBkZW50cnkgKnBsaW5r
KQoreworCWludCBlcnI7CisKKwllcnIgPSAtRUVYSVNUOworCWlmICghcGxpbmstPmRfaW5vZGUp
IHsKKwkJaW50IG1vZGUgPSBTX0lSV1hVOworCQlpZiAodW5saWtlbHkoYXVfdGVzdF9uZnMocGxp
bmstPmRfc2IpKSkKKwkJCW1vZGUgfD0gU19JWFVHTzsKKwkJZXJyID0gdmZzdWJfbWtkaXIoaF9k
aXIsIHBsaW5rLCBtb2RlLCAvKmRsZ3QqLzApOworCX0gZWxzZSBpZiAoU19JU0RJUihwbGluay0+
ZF9pbm9kZS0+aV9tb2RlKSkKKwkJZXJyID0gMDsKKwllbHNlCisJCUF1RXJyKCJ1bmtub3duICUu
KnMgZXhpc3RzXG4iLCBBdURMTlBhaXIocGxpbmspKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8q
CisgKiBpbml0aWFsaXplIHRoZSB3aGl0ZW91dCBiYXNlIGZpbGUvZGlyIGZvciBAYnIuCisgKi8K
K2ludCBhdV93aF9pbml0KHN0cnVjdCBkZW50cnkgKmhfcm9vdCwgc3RydWN0IGF1X2JyYW5jaCAq
YnIsCisJICAgICAgIHN0cnVjdCB2ZnNtb3VudCAqbmZzbW50LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sg
KnNiKQoreworCWludCBlcnI7CisJc3RydWN0IGRlbnRyeSAqd2gsICpwbGluazsKKwlzdHJ1Y3Qg
aW5vZGUgKmhfZGlyOworCXN0YXRpYyBzdHJ1Y3QgcXN0ciBiYXNlX25hbWVbXSA9IHsKKwkJewor
CQkJLm5hbWUJPSBBVUZTX1dIX0JBU0VOQU1FLAorCQkJLmxlbgk9IHNpemVvZihBVUZTX1dIX0JB
U0VOQU1FKSAtIDEKKwkJfSwKKwkJeworCQkJLm5hbWUJPSBBVUZTX1dIX1BMSU5LRElSLAorCQkJ
Lmxlbgk9IHNpemVvZihBVUZTX1dIX1BMSU5LRElSKSAtIDEKKwkJfQorCX07CisJc3RydWN0IGF1
X25keCBuZHggPSB7CisJCS5uZnNtbnQJPSBuZnNtbnQsCisJCS5mbGFncwk9IDAsIC8qIGFsd2F5
cyBubyBkbGd0ICovCisJCS5uZAk9IE5VTEwsCisJCS8vLmJyCT0gTlVMTAorCX07CisJY29uc3Qg
aW50IGRvX3BsaW5rID0gYXVfb3B0X3Rlc3QoYXVfbW50ZmxhZ3Moc2IpLCBQTElOSyk7CisKKwlM
S1RSVHJhY2UoIm5mc21udCAlcFxuIiwgbmZzbW50KTsKKwlCcldoTXVzdFdyaXRlTG9jayhicik7
CisJU2lNdXN0V3JpdGVMb2NrKHNiKTsKKwloX2RpciA9IGhfcm9vdC0+ZF9pbm9kZTsKKworCS8q
IGRvdWJseSB3aGl0ZW91dGVkICovCisJd2ggPSBhdV93aF9sa3VwKGhfcm9vdCwgYmFzZV9uYW1l
ICsgMCwgJm5keCk7CisJLy9pZiAoTGt0ckNvbmQpIHtkcHV0KHdoKTsgd2ggPSBFUlJfUFRSKC0x
KTt9CisJZXJyID0gUFRSX0VSUih3aCk7CisJaWYgKElTX0VSUih3aCkpCisJCWdvdG8gb3V0Owor
CUF1RGVidWdPbihici0+YnJfd2ggJiYgYnItPmJyX3doICE9IHdoKTsKKworCXBsaW5rID0gYXVf
d2hfbGt1cChoX3Jvb3QsIGJhc2VfbmFtZSArIDEsICZuZHgpOworCWVyciA9IFBUUl9FUlIocGxp
bmspOworCWlmIChJU19FUlIocGxpbmspKQorCQlnb3RvIG91dF9kcHV0X3doOworCUF1RGVidWdP
bihici0+YnJfcGxpbmsgJiYgYnItPmJyX3BsaW5rICE9IHBsaW5rKTsKKworCWRwdXQoYnItPmJy
X3doKTsKKwlkcHV0KGJyLT5icl9wbGluayk7CisJYnItPmJyX3doID0gTlVMTDsKKwlici0+YnJf
cGxpbmsgPSBOVUxMOworCisJZXJyID0gMDsKKwlzd2l0Y2ggKGJyLT5icl9wZXJtKSB7CisJY2Fz
ZSBBdUJyX1JSOgorCWNhc2UgQXVCcl9STzoKKwljYXNlIEF1QnJfUlJXSDoKKwljYXNlIEF1QnJf
Uk9XSDoKKwkJY2xlYW5fd2goaF9kaXIsIHdoKTsKKwkJY2xlYW5fcGxpbmsoaF9kaXIsIHBsaW5r
KTsKKwkJYnJlYWs7CisKKwljYXNlIEF1QnJfUldOb0xpbmtXSDoKKwkJY2xlYW5fd2goaF9kaXIs
IHdoKTsKKwkJaWYgKGRvX3BsaW5rKSB7CisJCQllcnIgPSB0ZXN0X2xpbmthYmxlKGhfZGlyKTsK
KwkJCWlmICh1bmxpa2VseShlcnIpKQorCQkJCWdvdG8gb3V0X25vbGluazsKKworCQkJZXJyID0g
cGxpbmtfZGlyKGhfZGlyLCBwbGluayk7CisJCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCQlnb3Rv
IG91dF9lcnI7CisJCQlici0+YnJfcGxpbmsgPSBkZ2V0KHBsaW5rKTsKKwkJfSBlbHNlCisJCQlj
bGVhbl9wbGluayhoX2RpciwgcGxpbmspOworCQlicmVhazsKKworCWNhc2UgQXVCcl9SVzoKKwkJ
LyoKKwkJICogZm9yIHRoZSBtb21lbnQsIGF1ZnMgc3VwcG9ydHMgdGhlIGJyYW5jaCBmaWxlc3lz
dGVtCisJCSAqIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgbGluaygyKS4KKwkJICogdGVzdGluZyBv
biBGQVQgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpX29wLT5zZXRhdHRyKCkgZnVsbHkKKwkJICog
ZWl0aGVyLCBjb3B5dXAgZmFpbGVkLgorCQkgKiBmaW5hbGx5LCBzdWNoIGZpbGVzeXN0ZW0gd2ls
bCBub3QgYmUgdXNlZCBhcyB0aGUgd3JpdGFibGUKKwkJICogYnJhbmNoLgorCQkgKi8KKwkJZXJy
ID0gdGVzdF9saW5rYWJsZShoX2Rpcik7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJZ290byBv
dXRfbm9saW5rOworCisJCWVyciA9IC1FRVhJU1Q7CisJCWlmICghd2gtPmRfaW5vZGUpCisJCQll
cnIgPSBhdV9oX2NyZWF0ZShoX2Rpciwgd2gsIFdIX01BU0ssIC8qZGxndCovMCwKKwkJCQkJICAv
Km5kKi9OVUxMLCBuZnNtbnQpOworCQllbHNlIGlmIChTX0lTUkVHKHdoLT5kX2lub2RlLT5pX21v
ZGUpKQorCQkJZXJyID0gMDsKKwkJZWxzZQorCQkJQXVFcnIoInVua25vd24gJS4qcy8lLipzIGV4
aXN0c1xuIiwKKwkJCSAgICAgIEF1RExOUGFpcihoX3Jvb3QpLCBBdURMTlBhaXIod2gpKTsKKwkJ
aWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dF9lcnI7CisKKwkJaWYgKGRvX3BsaW5rKSB7
CisJCQllcnIgPSBwbGlua19kaXIoaF9kaXIsIHBsaW5rKTsKKwkJCWlmICh1bmxpa2VseShlcnIp
KQorCQkJCWdvdG8gb3V0X2VycjsKKwkJCWJyLT5icl9wbGluayA9IGRnZXQocGxpbmspOworCQl9
IGVsc2UKKwkJCWNsZWFuX3BsaW5rKGhfZGlyLCBwbGluayk7CisJCWJyLT5icl93aCA9IGRnZXQo
d2gpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworIG91dF9kcHV0Ogor
CWRwdXQocGxpbmspOworIG91dF9kcHV0X3doOgorCWRwdXQod2gpOworIG91dDoKKwlBdVRyYWNl
RXJyKGVycik7CisJcmV0dXJuIGVycjsKKyBvdXRfbm9saW5rOgorCUF1RXJyKCIlLipzIGRvZXNu
J3Qgc3VwcG9ydCBsaW5rKDIpLCB1c2Ugbm9wbGluayBhbmQgcncrbm9sd2hcbiIsCisJICAgICAg
QXVETE5QYWlyKGhfcm9vdCkpOworCWdvdG8gb3V0X2RwdXQ7Cisgb3V0X2VycjoKKwlBdUVycigi
YW4gZXJyb3IoJWQpIG9uIHRoZSB3cml0YWJsZSBicmFuY2ggJS4qcyglcylcbiIsCisJICAgICAg
ZXJyLCBBdURMTlBhaXIoaF9yb290KSwgYXVfc2J0eXBlKGhfcm9vdC0+ZF9zYikpOworCWdvdG8g
b3V0X2RwdXQ7Cit9CisKK3N0cnVjdCByZWluaXRfYnJfd2ggeworCXN0cnVjdCBzdXBlcl9ibG9j
ayAqc2I7CisJc3RydWN0IGF1X2JyYW5jaCAqYnI7Cit9OworCitzdGF0aWMgdm9pZCByZWluaXRf
YnJfd2godm9pZCAqYXJnKQoreworCWludCBlcnI7CisJc3RydWN0IHJlaW5pdF9icl93aCAqYSA9
IGFyZzsKKwlzdHJ1Y3QgaW5vZGUgKmhfZGlyLCAqZGlyOworCXN0cnVjdCBkZW50cnkgKmhfcm9v
dDsKKwlhdWZzX2JpbmRleF90IGJpbmRleDsKKwlzdHJ1Y3QgdmZzdWJfYXJncyB2YXJnczsKKwor
CUF1VHJhY2VFbnRlcigpOworCUF1RGVidWdPbighYS0+YnItPmJyX3doIHx8ICFhLT5ici0+YnJf
d2gtPmRfaW5vZGUgfHwgY3VycmVudC0+ZnN1aWQpOworCisJZXJyID0gMDsKKwkvKiBiaWcgYXVm
cyBsb2NrICovCisJc2lfd3JpdGVfbG9jayhhLT5zYik7CisJaWYgKHVubGlrZWx5KCFhdV9icl93
cml0YWJsZShhLT5ici0+YnJfcGVybSkpKQorCQlnb3RvIG91dDsKKwliaW5kZXggPSBhdV9icl9p
bmRleChhLT5zYiwgYS0+YnItPmJyX2lkKTsKKwlpZiAodW5saWtlbHkoYmluZGV4IDwgMCkpCisJ
CWdvdG8gb3V0OworCisJZGlyID0gYS0+c2ItPnNfcm9vdC0+ZF9pbm9kZTsKKwloX3Jvb3QgPSBk
Z2V0X3BhcmVudChhLT5ici0+YnJfd2gpOworCWhfZGlyID0gaF9yb290LT5kX2lub2RlOworCUF1
RGVidWdPbighaF9kaXItPmlfb3AgfHwgIWhfZGlyLT5pX29wLT5saW5rKTsKKwl2ZnN1Yl9hcmdz
X2luaXQoJnZhcmdzLCBOVUxMLCAvKmRsZ3QqLzAsIDApOworCWF1X2hkaXJfbG9jayhoX2Rpciwg
ZGlyLCBiaW5kZXgpOworCWJyX3doX3dyaXRlX2xvY2soYS0+YnIpOworCWVyciA9IHZmc3ViX3Vu
bGluayhoX2RpciwgYS0+YnItPmJyX3doLCAmdmFyZ3MpOworCS8vaWYgKExrdHJDb25kKSBlcnIg
PSAtMTsKKwlkcHV0KGEtPmJyLT5icl93aCk7CisJYS0+YnItPmJyX3doID0gTlVMTDsKKwlpZiAo
IWVycikKKwkJZXJyID0gYXVfd2hfaW5pdChoX3Jvb3QsIGEtPmJyLCBhdV9kb19uZnNtbnQoYS0+
YnItPmJyX21udCksCisJCQkJIGEtPnNiKTsKKwlicl93aF93cml0ZV91bmxvY2soYS0+YnIpOwor
CWF1X2hkaXJfdW5sb2NrKGhfZGlyLCBkaXIsIGJpbmRleCk7CisJZHB1dChoX3Jvb3QpOworCisg
b3V0OgorCWF0b21pY19kZWNfcmV0dXJuKCZhLT5ici0+YnJfd2hfcnVubmluZyk7CisJYXVfYnJf
cHV0KGEtPmJyKTsKKwlzaV93cml0ZV91bmxvY2soYS0+c2IpOworCWtmcmVlKGFyZyk7CisJaWYg
KHVubGlrZWx5KGVycikpCisJCUF1SU9FcnIoImVyciAlZFxuIiwgZXJyKTsKK30KKworc3RhdGlj
IHZvaWQga2lja19yZWluaXRfYnJfd2goc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGF1
X2JyYW5jaCAqYnIpCit7CisJaW50IGRvX2RlYywgd2txX2VycjsKKwlzdHJ1Y3QgcmVpbml0X2Jy
X3doICphcmc7CisKKwlkb19kZWMgPSAxOworCWlmIChhdG9taWNfaW5jX3JldHVybigmYnItPmJy
X3doX3J1bm5pbmcpICE9IDEpCisJCWdvdG8gb3V0OworCisJLyogaWdub3JlIEVOT01FTSAqLwor
CWFyZyA9IGttYWxsb2Moc2l6ZW9mKCphcmcpLCBHRlBfVEVNUE9SQVJZKTsKKwlpZiAoYXJnKSB7
CisJCS8qCisJCSAqIGRlYyh3aF9ydW5uaW5nKSwga2ZyZWUoYXJnKSBhbmQgYXVfYnJfcHV0KCkK
KwkJICogaW4gcmVpbml0IGZ1bmN0aW9uCisJCSAqLworCQlhcmctPnNiID0gc2I7CisJCWFyZy0+
YnIgPSBicjsKKwkJYXVfYnJfZ2V0KGJyKTsKKwkJd2txX2VyciA9IGF1X3drcV9ub3dhaXQocmVp
bml0X2JyX3doLCBhcmcsIHNiLCAvKmRsZ3QqLzApOworCQlpZiAodW5saWtlbHkod2txX2Vycikp
IHsKKwkJCWF0b21pY19kZWNfcmV0dXJuKCZici0+YnJfd2hfcnVubmluZyk7CisJCQlhdV9icl9w
dXQoYnIpOworCQkJa2ZyZWUoYXJnKTsKKwkJfQorCQlkb19kZWMgPSAwOworCX0KKworIG91dDoK
KwlpZiAoZG9fZGVjKQorCQlhdG9taWNfZGVjX3JldHVybigmYnItPmJyX3doX3J1bm5pbmcpOwor
fQorCisvKgorICogY3JlYXRlIHRoZSB3aGl0ZW91dCBAd2guCisgKi8KK3N0YXRpYyBpbnQgbGlu
a19vcl9jcmVhdGVfd2goc3RydWN0IGRlbnRyeSAqd2gsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2Is
CisJCQkgICAgIGF1ZnNfYmluZGV4X3QgYmluZGV4LCBzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlp
bnQgZXJyLCBkbGd0OworCXN0cnVjdCBhdV9icmFuY2ggKmJyOworCXN0cnVjdCBkZW50cnkgKmhf
cGFyZW50OworCXN0cnVjdCBpbm9kZSAqaF9kaXI7CisKKwlMS1RSVHJhY2UoIiUuKnNcbiIsIEF1
RExOUGFpcih3aCkpOworCVNpTXVzdFJlYWRMb2NrKHNiKTsKKwloX3BhcmVudCA9IHdoLT5kX3Bh
cmVudDsgLyogZGlyIGlub2RlIGlzIGxvY2tlZCAqLworCWhfZGlyID0gaF9wYXJlbnQtPmRfaW5v
ZGU7CisJSU11c3RMb2NrKGhfZGlyKTsKKworCWRsZ3QgPSAhIWF1X29wdF90ZXN0X2RsZ3QoYXVf
bW50ZmxhZ3Moc2IpKTsKKwliciA9IGF1X3NicihzYiwgYmluZGV4KTsKKwlicl93aF9yZWFkX2xv
Y2soYnIpOworCWlmIChici0+YnJfd2gpIHsKKwkJZXJyID0gdmZzdWJfbGluayhici0+YnJfd2gs
IGhfZGlyLCB3aCwgZGxndCk7CisJCWlmICghZXJyIHx8IGVyciAhPSAtRU1MSU5LKQorCQkJZ290
byBvdXQ7CisKKwkJLyogbGluayBjb3VudCBmdWxsLiByZS1pbml0aWFsaXplIGJyX3doLiAqLwor
CQlraWNrX3JlaW5pdF9icl93aChzYiwgYnIpOworCX0KKworCS8qIHJldHVybiB0aGlzIGVycm9y
IGluIHRoaXMgY29udGV4dCAqLworCWVyciA9IGF1X2hfY3JlYXRlKGhfZGlyLCB3aCwgV0hfTUFT
SywgZGxndCwgLypuZCovTlVMTCwKKwkJCSAgYXVfZG9fbmZzbW50KGJyLT5icl9tbnQpKTsKKwor
IG91dDoKKwlicl93aF9yZWFkX3VubG9jayhicik7CisJQXVUcmFjZUVycihlcnIpOworCXJldHVy
biBlcnI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGNyZWF0ZSBvciByZW1v
dmUgdGhlIGRpcm9wcS4KKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRvX2Rpcm9wcShzdHJ1
Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmluZGV4LAorCQkJCXVuc2lnbmVkIGlu
dCBmbGFncykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpvcHFfZGVudHJ5LCAqaF9kZW50cnk7CisJc3Ry
dWN0IGlub2RlICpoX2RpcjsKKwlpbnQgZXJyLCBkbGd0OworCXN0cnVjdCBzdXBlcl9ibG9jayAq
c2I7CisJc3RydWN0IGF1X25keCBuZHggPSB7CisJCS5mbGFncwk9IDAsCisJCS5uZAk9IE5VTEws
CisJCS8vLmJyCT0gTlVMTAorCX07CisKKwlMS1RSVHJhY2UoIiUuKnMsIGJpbmRleCAlZCwgZmxh
Z3MgMHgleFxuIiwKKwkJICBBdURMTlBhaXIoZGVudHJ5KSwgYmluZGV4LCBmbGFncyk7CisJaF9k
ZW50cnkgPSBhdV9oX2RwdHIoZGVudHJ5LCBiaW5kZXgpOworCUF1RGVidWdPbighaF9kZW50cnkp
OworCWhfZGlyID0gaF9kZW50cnktPmRfaW5vZGU7CisJQXVEZWJ1Z09uKCFoX2RpciB8fCAhU19J
U0RJUihoX2Rpci0+aV9tb2RlKSk7CisKKwkvKiBhbHJlYWR5IGNoZWNrZWQgYnkgYXVfdGVzdF9o
X3Blcm0oKS4gKi8KKwlzYiA9IGRlbnRyeS0+ZF9zYjsKKwluZHgubmZzbW50ID0gYXVfbmZzbW50
KHNiLCBiaW5kZXgpOworCWRsZ3QgPSAwOworCWlmICh1bmxpa2VseShhdV9mdGVzdF9kaXJvcHEo
ZmxhZ3MsIERMR1QpKSkgeworCQlkbGd0ID0gMTsKKwkJYXVfZnNldF9uZHgobmR4LmZsYWdzLCBE
TEdUKTsKKwl9CisJb3BxX2RlbnRyeSA9IGF1X2xrdXBfb25lKGRpcm9wcV9uYW1lLm5hbWUsIGhf
ZGVudHJ5LCBkaXJvcHFfbmFtZS5sZW4sCisJCQkJICZuZHgpOworCS8vaWYgKExrdHJDb25kKSB7
ZHB1dChvcHFfZGVudHJ5KTsgb3BxX2RlbnRyeSA9IEVSUl9QVFIoLTEpO30KKwlpZiAoSVNfRVJS
KG9wcV9kZW50cnkpKQorCQlnb3RvIG91dDsKKworCWlmIChhdV9mdGVzdF9kaXJvcHEoZmxhZ3Ms
IENSRUFURSkpIHsKKwkJQXVEZWJ1Z09uKG9wcV9kZW50cnktPmRfaW5vZGUpOworCQllcnIgPSBs
aW5rX29yX2NyZWF0ZV93aChvcHFfZGVudHJ5LCBzYiwgYmluZGV4LAorCQkJCQlkZW50cnktPmRf
aW5vZGUpOworCQkvL2lmIChMa3RyQ29uZCkge3Zmc191bmxpbmsoaF9kaXIsIG9wcV9kZW50cnkp
OyBlcnIgPSAtMTt9CisJCWlmICghZXJyKSB7CisJCQlhdV9zZXRfZGJkaXJvcHEoZGVudHJ5LCBi
aW5kZXgpOworCQkJZ290byBvdXQ7IC8qIHN1Y2Nlc3MgKi8KKwkJfQorCX0gZWxzZSB7CisJCUF1
RGVidWdPbigvKiAhU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkKKwkJCSAgICogfHwg
ICovIW9wcV9kZW50cnktPmRfaW5vZGUpOworCQllcnIgPSBkb191bmxpbmtfd2goaF9kaXIsIG9w
cV9kZW50cnksIGRlbnRyeS0+ZF9pbm9kZSwgZGxndCk7CisJCS8vaWYgKExrdHJDb25kKSBlcnIg
PSAtMTsKKwkJaWYgKCFlcnIpCisJCQlhdV9zZXRfZGJkaXJvcHEoZGVudHJ5LCAtMSk7CisJfQor
CWRwdXQob3BxX2RlbnRyeSk7CisJb3BxX2RlbnRyeSA9IEVSUl9QVFIoZXJyKTsKKworIG91dDoK
KwlBdVRyYWNlRXJyUHRyKG9wcV9kZW50cnkpOworCXJldHVybiBvcHFfZGVudHJ5OworfQorCitz
dHJ1Y3QgZG9fZGlyb3BxX2FyZ3MgeworCXN0cnVjdCBkZW50cnkgKiplcnJwOworCXN0cnVjdCBk
ZW50cnkgKmRlbnRyeTsKKwlhdWZzX2JpbmRleF90IGJpbmRleDsKKwl1bnNpZ25lZCBpbnQgZmxh
Z3M7Cit9OworCitzdGF0aWMgdm9pZCBjYWxsX2RvX2Rpcm9wcSh2b2lkICphcmdzKQoreworCXN0
cnVjdCBkb19kaXJvcHFfYXJncyAqYSA9IGFyZ3M7CisJKmEtPmVycnAgPSBkb19kaXJvcHEoYS0+
ZGVudHJ5LCBhLT5iaW5kZXgsIGEtPmZsYWdzKTsKK30KKworc3RydWN0IGRlbnRyeSAqYXVfZGly
b3BxX3NpbyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmluZGV4LAorCQkJ
ICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGRlbnRyeSAqZGlyb3BxLCAqaF9k
ZW50cnk7CisKKwlMS1RSVHJhY2UoIiUuKnMsIGJpbmRleCAlZCwgZmxhZ3MgMHgleFxuIiwKKwkJ
ICBBdURMTlBhaXIoZGVudHJ5KSwgYmluZGV4LCBmbGFncyk7CisKKwloX2RlbnRyeSA9IGF1X2hf
ZHB0cihkZW50cnksIGJpbmRleCk7CisJaWYgKCFhdV90ZXN0X2hfcGVybV9zaW8oaF9kZW50cnkt
PmRfaW5vZGUsIE1BWV9FWEVDIHwgTUFZX1dSSVRFLAorCQkJCWF1X2Z0ZXN0X2Rpcm9wcShmbGFn
cywgRExHVCkpKQorCQlkaXJvcHEgPSBkb19kaXJvcHEoZGVudHJ5LCBiaW5kZXgsIGZsYWdzKTsK
KwllbHNlIHsKKwkJaW50IHdrcV9lcnI7CisJCXN0cnVjdCBkb19kaXJvcHFfYXJncyBhcmdzID0g
eworCQkJLmVycnAJCT0gJmRpcm9wcSwKKwkJCS5kZW50cnkJCT0gZGVudHJ5LAorCQkJLmJpbmRl
eAkJPSBiaW5kZXgsCisJCQkuZmxhZ3MJCT0gZmxhZ3MKKwkJfTsKKwkJd2txX2VyciA9IGF1X3dr
cV93YWl0KGNhbGxfZG9fZGlyb3BxLCAmYXJncywgLypkbGd0Ki8wKTsKKwkJaWYgKHVubGlrZWx5
KHdrcV9lcnIpKQorCQkJZGlyb3BxID0gRVJSX1BUUih3a3FfZXJyKTsKKwl9CisKKwlBdVRyYWNl
RXJyUHRyKGRpcm9wcSk7CisJcmV0dXJuIGRpcm9wcTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAq
LworCisvKgorICogbG9va3VwIHdoaXRlb3V0IGRlbnRyeS4KKyAqIEBoX3BhcmVudDogaGlkZGVu
IHBhcmVudCBkZW50cnkgd2hpY2ggbXVzdCBleGlzdCBhbmQgYmUgbG9ja2VkCisgKiBAYmFzZV9u
YW1lOiBuYW1lIG9mIGRlbnRyeSB3aGljaCB3aWxsIGJlIHdoaXRlb3V0ZWQKKyAqIHJldHVybnMg
ZGVudHJ5IGZvciB3aGl0ZW91dC4KKyAqLworc3RydWN0IGRlbnRyeSAqYXVfd2hfbGt1cChzdHJ1
Y3QgZGVudHJ5ICpoX3BhcmVudCwgc3RydWN0IHFzdHIgKmJhc2VfbmFtZSwKKwkJCSAgc3RydWN0
IGF1X25keCAqbmR4KQoreworCWludCBlcnI7CisJc3RydWN0IHFzdHIgd2hfbmFtZTsKKwlzdHJ1
Y3QgZGVudHJ5ICp3aF9kZW50cnk7CisKKwlMS1RSVHJhY2UoIiUuKnMvJS4qc1xuIiwgQXVETE5Q
YWlyKGhfcGFyZW50KSwgQXVMTlBhaXIoYmFzZV9uYW1lKSk7CisKKwllcnIgPSBhdV93aF9uYW1l
X2FsbG9jKGJhc2VfbmFtZS0+bmFtZSwgYmFzZV9uYW1lLT5sZW4sICZ3aF9uYW1lKTsKKwkvL2lm
IChMa3RyQ29uZCkge2F1X3doX25hbWVfZnJlZSgmd2hfbmFtZSk7IGVyciA9IC0xO30KKwl3aF9k
ZW50cnkgPSBFUlJfUFRSKGVycik7CisJaWYgKCFlcnIpIHsKKwkJLyogZG8gbm90IHN1cGVyaW8u
ICovCisJCXdoX2RlbnRyeSA9IGF1X2xrdXBfb25lKHdoX25hbWUubmFtZSwgaF9wYXJlbnQsCisJ
CQkJCXdoX25hbWUubGVuLCBuZHgpOworCQlhdV93aF9uYW1lX2ZyZWUoJndoX25hbWUpOworCX0K
KwlBdVRyYWNlRXJyUHRyKHdoX2RlbnRyeSk7CisJcmV0dXJuIHdoX2RlbnRyeTsKK30KKworLyoK
KyAqIGxpbmsvY3JlYXRlIGEgd2hpdGVvdXQgZm9yIEBkZW50cnkgb24gQGJpbmRleC4KKyAqLwor
c3RydWN0IGRlbnRyeSAqYXVfd2hfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVu
dHJ5ICpkZW50cnksCisJCQkgICAgYXVmc19iaW5kZXhfdCBiaW5kZXgsIHN0cnVjdCBkZW50cnkg
KmhfcGFyZW50LAorCQkJICAgIHN0cnVjdCBhdV9uZHggKm5keCkKK3sKKwlzdHJ1Y3QgZGVudHJ5
ICp3aF9kZW50cnk7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCisJTEtU
UlRyYWNlKCIlLipzLyUuKnMgb24gYiVkXG4iLCBBdURMTlBhaXIoaF9wYXJlbnQpLAorCQkgIEF1
RExOUGFpcihkZW50cnkpLCBiaW5kZXgpOworCisJc2IgPSBkZW50cnktPmRfc2I7CisJd2hfZGVu
dHJ5ID0gYXVfd2hfbGt1cChoX3BhcmVudCwgJmRlbnRyeS0+ZF9uYW1lLCBuZHgpOworCS8vYXVf
bmZzbW50KHNiLCBiaW5kZXgpLCBuZWVkX2RsZ3Qoc2IpKTsKKwkvL2lmIChMa3RyQ29uZCkge2Rw
dXQod2hfZGVudHJ5KTsgd2hfZGVudHJ5ID0gRVJSX1BUUigtMSk7fQorCWlmICghSVNfRVJSKHdo
X2RlbnRyeSkgJiYgIXdoX2RlbnRyeS0+ZF9pbm9kZSkgeworCQllcnIgPSBsaW5rX29yX2NyZWF0
ZV93aCh3aF9kZW50cnksIHNiLCBiaW5kZXgsIGRpcik7CisJCWlmICghZXJyKQorCQkJYXVfc2V0
X2Rid2goZGVudHJ5LCBiaW5kZXgpOworCQllbHNlIHsKKwkJCWRwdXQod2hfZGVudHJ5KTsKKwkJ
CXdoX2RlbnRyeSA9IEVSUl9QVFIoZXJyKTsKKwkJfQorCX0KKworCUF1VHJhY2VFcnJQdHIod2hf
ZGVudHJ5KTsKKwlyZXR1cm4gd2hfZGVudHJ5OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisK
Ky8qIERlbGV0ZSBhbGwgd2hpdGVvdXRzIGluIHRoaXMgZGlyZWN0b3J5IG9uIGJyYW5jaCBiaW5k
ZXguICovCitzdGF0aWMgaW50IGRlbF93aF9jaGlsZHJlbihzdHJ1Y3QgYXVfbmhhc2ggKndobGlz
dCwgc3RydWN0IGRlbnRyeSAqaF9wYXJlbnQsCisJCQkgICBhdWZzX2JpbmRleF90IGJpbmRleCwg
c3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgIHN0cnVjdCBhdV9uZHggKm5keCkKK3sKKwlpbnQg
ZXJyLCBpOworCXN0cnVjdCBxc3RyIHdoX25hbWU7CisJY2hhciAqcDsKKwlzdHJ1Y3QgaW5vZGUg
KmhfZGlyOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBhdV92ZGlyX3doICp0
cG9zOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJc3RydWN0IGF1X3ZkaXJfZGVzdHIgKnN0
cjsKKworCUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVETE5QYWlyKGhfcGFyZW50KSk7CisJaF9kaXIg
PSBoX3BhcmVudC0+ZF9pbm9kZTsKKwlBdURlYnVnT24oSVNfUkRPTkxZKGhfZGlyKSk7CisJLy9T
aU11c3RSZWFkTG9jayg/Pyk7CisKKwllcnIgPSAtRU5PTUVNOworCXAgPSBfX2dldG5hbWUoKTsK
Kwl3aF9uYW1lLm5hbWUgPSBwOworCS8vaWYgKExrdHJDb25kKSB7X19wdXRuYW1lKHApOyB3aF9u
YW1lLm5hbWUgPSBwID0gTlVMTDt9CisJaWYgKHVubGlrZWx5KCF3aF9uYW1lLm5hbWUpKQorCQln
b3RvIG91dDsKKwltZW1jcHkocCwgQVVGU19XSF9QRlgsIEFVRlNfV0hfUEZYX0xFTik7CisJcCAr
PSBBVUZTX1dIX1BGWF9MRU47CisKKwkvKiBhbHJlYWR5IGNoZWNrZWQgYnkgYXVfdGVzdF9oX3Bl
cm0oKS4gKi8KKwllcnIgPSAwOworCWZvciAoaSA9IDA7ICFlcnIgJiYgaSA8IEF1U2l6ZV9OSEFT
SDsgaSsrKSB7CisJCWhlYWQgPSB3aGxpc3QtPmhlYWRzICsgaTsKKwkJaGxpc3RfZm9yX2VhY2hf
ZW50cnkodHBvcywgcG9zLCBoZWFkLCB3aF9oYXNoKSB7CisJCQlpZiAodHBvcy0+d2hfYmluZGV4
ICE9IGJpbmRleCkKKwkJCQljb250aW51ZTsKKwkJCXN0ciA9ICZ0cG9zLT53aF9zdHI7CisJCQlp
ZiAoc3RyLT5sZW4gKyBBVUZTX1dIX1BGWF9MRU4gPD0gUEFUSF9NQVgpIHsKKwkJCQltZW1jcHko
cCwgc3RyLT5uYW1lLCBzdHItPmxlbik7CisJCQkJd2hfbmFtZS5sZW4gPSBBVUZTX1dIX1BGWF9M
RU4gKyBzdHItPmxlbjsKKwkJCQllcnIgPSB1bmxpbmtfd2hfbmFtZShoX3BhcmVudCwgJndoX25h
bWUsIGlub2RlLAorCQkJCQkJICAgICBuZHgpOworCQkJCS8vaWYgKExrdHJDb25kKSBlcnIgPSAt
MTsKKwkJCQlpZiAoIWVycikKKwkJCQkJY29udGludWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlB
dUlPRXJyKCJ3aGl0ZW91dCBuYW1lIHRvbyBsb25nICUuKnNcbiIsCisJCQkJc3RyLT5sZW4sIHN0
ci0+bmFtZSk7CisJCQllcnIgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwl9CisJX19wdXRuYW1l
KHdoX25hbWUubmFtZSk7CisKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7
Cit9CisKK3N0cnVjdCBkZWxfd2hfY2hpbGRyZW5fYXJncyB7CisJaW50ICplcnJwOworCXN0cnVj
dCBhdV9uaGFzaCAqd2hsaXN0OworCXN0cnVjdCBkZW50cnkgKmhfcGFyZW50OworCWF1ZnNfYmlu
ZGV4X3QgYmluZGV4OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGF1X25keCAqbmR4
OworfTsKKworc3RhdGljIHZvaWQgY2FsbF9kZWxfd2hfY2hpbGRyZW4odm9pZCAqYXJncykKK3sK
KwlzdHJ1Y3QgZGVsX3doX2NoaWxkcmVuX2FyZ3MgKmEgPSBhcmdzOworCSphLT5lcnJwID0gZGVs
X3doX2NoaWxkcmVuKGEtPndobGlzdCwgYS0+aF9wYXJlbnQsIGEtPmJpbmRleCwKKwkJCQkgICBh
LT5pbm9kZSwgYS0+bmR4KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcm1k
aXIgdGhlIHdoaXRlb3V0ZWQgdGVtcG9yYXJ5IG5hbWVkIGRpciBAaF9kZW50cnkuCisgKiBAd2hs
aXN0OiB3aGl0ZW91dGVkIGNoaWxkcmVuLgorICovCitpbnQgYXVfd2h0bXBfcm1kaXIoc3RydWN0
IGRlbnRyeSAqaF9kZW50cnksIHN0cnVjdCBhdV9uaGFzaCAqd2hsaXN0LAorCQkgICBhdWZzX2Jp
bmRleF90IGJpbmRleCwgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJ
CSAgIGludCBub3NlbGYpCit7CisJaW50IGVyciwgZGxndDsKKwlzdHJ1Y3QgaW5vZGUgKmhfaW5v
ZGUsICpoX2RpcjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXVuc2lnbmVkIGludCBtbnRf
ZmxhZ3M7CisJc3RydWN0IGF1X2hpbl9pZ25vcmUgaWduOworCXN0cnVjdCB2ZnN1Yl9hcmdzIHZh
cmdzOworCXN0cnVjdCBhdV9uZHggbmR4ID0geworCQkuZmxhZ3MJPSAwLAorCQkubmQJPSBOVUxM
LAorCQkvLy5icgk9IE5VTEwKKwl9OworCisJTEtUUlRyYWNlKCJoZCAlLipzLCBiJWQsIGklbHVc
biIsCisJCSAgQXVETE5QYWlyKGhfZGVudHJ5KSwgYmluZGV4LCBkaXItPmlfaW5vKTsKKwlJTXVz
dExvY2soZGlyKTsKKwlJaU11c3RBbnlMb2NrKGRpcik7CisJaF9kaXIgPSBoX2RlbnRyeS0+ZF9w
YXJlbnQtPmRfaW5vZGU7IC8qIGRpciBpbm9kZSBpcyBsb2NrZWQgKi8KKwlJTXVzdExvY2soaF9k
aXIpOworCisJc2IgPSBpbm9kZS0+aV9zYjsKKwltbnRfZmxhZ3MgPSBhdV9tbnRmbGFncyhzYik7
CisJZGxndCA9ICEhYXVfb3B0X3Rlc3RfZGxndChtbnRfZmxhZ3MpOworCWlmICh1bmxpa2VseShk
bGd0KSkKKwkJYXVfZnNldF9uZHgobmR4LmZsYWdzLCBETEdUKTsKKwluZHgubmZzbW50ID0gYXVf
bmZzbW50KHNiLCBiaW5kZXgpOworCWhfaW5vZGUgPSBoX2RlbnRyeS0+ZF9pbm9kZTsKKwlBdURl
YnVnT24oaF9pbm9kZSAhPSBhdV9oX2lwdHIoaW5vZGUsIGJpbmRleCkpOworCWF1X2hkaXIyX2xv
Y2soaF9pbm9kZSwgaW5vZGUsIGJpbmRleCk7CisKKwkvKgorCSAqIHNvbWVvbmUgZWxzZSBtaWdo
dCBjaGFuZ2Ugc29tZSB3aGl0ZW91dHMgd2hpbGUgd2Ugd2VyZSBzbGVlcGluZy4KKwkgKiBpdCBt
ZWFucyB0aGlzIHdobGlzdCBtYXkgaGF2ZSBhbiBvYnNvbGV0ZWQgZW50cnkuCisJICovCisJaWYg
KCFhdV90ZXN0X2hfcGVybV9zaW8oaF9pbm9kZSwgTUFZX0VYRUMgfCBNQVlfV1JJVEUsIGRsZ3Qp
KQorCQllcnIgPSBkZWxfd2hfY2hpbGRyZW4od2hsaXN0LCBoX2RlbnRyeSwgYmluZGV4LCBpbm9k
ZSwgJm5keCk7CisJZWxzZSB7CisJCWludCB3a3FfZXJyOworCQkvKiB1Z2x5ICovCisJCXVuc2ln
bmVkIGludCBmbGFncyA9IG5keC5mbGFnczsKKwkJc3RydWN0IGRlbF93aF9jaGlsZHJlbl9hcmdz
IGFyZ3MgPSB7CisJCQkuZXJycAkJPSAmZXJyLAorCQkJLndobGlzdAkJPSB3aGxpc3QsCisJCQku
aF9wYXJlbnQJPSBoX2RlbnRyeSwKKwkJCS5iaW5kZXgJCT0gYmluZGV4LAorCQkJLmlub2RlCQk9
IGlub2RlLAorCQkJLm5keAkJPSAmbmR4CisJCX07CisKKwkJbmR4LmZsYWdzID0gMDsKKwkJd2tx
X2VyciA9IGF1X3drcV93YWl0KGNhbGxfZGVsX3doX2NoaWxkcmVuLCAmYXJncywgLypkbGd0Ki8w
KTsKKwkJaWYgKHVubGlrZWx5KHdrcV9lcnIpKQorCQkJZXJyID0gd2txX2VycjsKKwkJbmR4LmZs
YWdzID0gZmxhZ3M7CisJfQorCWF1X2hkaXJfdW5sb2NrKGhfaW5vZGUsIGlub2RlLCBiaW5kZXgp
OworCisJaWYgKCFlcnIpIHsKKwkJdmZzdWJfYXJnc19pbml0KCZ2YXJncywgJmlnbiwgZGxndCwg
MCk7CisJCWlmICh1bmxpa2VseShhdV9vcHRfdGVzdChtbnRfZmxhZ3MsIFVEQkFfSU5PVElGWSkg
JiYgIW5vc2VsZikpCisJCQl2ZnN1Yl9pZ25faGlub2RlKCZ2YXJncywgSU5fREVMRVRFX1NFTEYs
CisJCQkJCSBhdV9oaShpbm9kZSwgYmluZGV4KSk7CisJCWVyciA9IHZmc3ViX3JtZGlyKGhfZGly
LCBoX2RlbnRyeSwgJnZhcmdzKTsKKwkJLy9kX2Ryb3AoaF9kZW50cnkpOworCQkvL2lmIChMa3Ry
Q29uZCkgZXJyID0gLTE7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJaWYgKGF1X2lic3RhcnQoZGly
KSA9PSBiaW5kZXgpIHsKKwkJCWF1X2NwdXBfYXR0cl90aW1lc2l6ZXMoZGlyKTsKKwkJCS8vYXVf
Y3B1cF9hdHRyX25saW5rKGRpcik7CisJCQlkcm9wX25saW5rKGRpcik7CisJCX0KKwkJcmV0dXJu
IDA7IC8qIHN1Y2Nlc3MgKi8KKwl9CisKKwlBdVdhcm4oImZhaWxlZCByZW1vdmluZyAlLipzKCVk
KSwgaWdub3JlZFxuIiwgQXVETE5QYWlyKGhfZGVudHJ5KSwgZXJyKTsKKwlyZXR1cm4gZXJyOwor
fQorCitzdGF0aWMgdm9pZCBhdV93aHRtcF9ybWRpcl9mcmVlX2FyZ3Moc3RydWN0IGF1X3dodG1w
X3JtZGlyX2FyZ3MgKmFyZ3MpCit7CisJZHB1dChhcmdzLT5oX2RlbnRyeSk7CisJYXVfbmhhc2hf
ZmluKCZhcmdzLT53aGxpc3QpOworCWlwdXQoYXJncy0+aW5vZGUpOworCW11dGV4X3VubG9jaygm
YXJncy0+ZGlyLT5pX211dGV4KTsKKwlpcHV0KGFyZ3MtPmRpcik7CisJa2ZyZWUoYXJncyk7Cit9
CisKK3N0YXRpYyB2b2lkIGRvX3JtZGlyX3dodG1wKHZvaWQgKmFyZ3MpCit7CisJaW50IGVycjsK
KwlzdHJ1Y3QgYXVfd2h0bXBfcm1kaXJfYXJncyAqYSA9IGFyZ3M7CisJc3RydWN0IHN1cGVyX2Js
b2NrICpzYjsKKworCUxLVFJUcmFjZSgiJS4qcywgYiVkLCBkaXIgaSVsdVxuIiwKKwkJICBBdURM
TlBhaXIoYS0+aF9kZW50cnkpLCBhLT5iaW5kZXgsIGEtPmRpci0+aV9pbm8pOworCisJbXV0ZXhf
bG9jaygmYS0+ZGlyLT5pX211dGV4KTsKKwlzYiA9IGEtPmRpci0+aV9zYjsKKwkvL0F1RGJnU2xl
ZXAoMyk7CisJc2lfbm9mbHVzaF9yZWFkX2xvY2soc2IpOworCWVyciA9IGF1X3Rlc3Rfcm8oc2Is
IGEtPmJpbmRleCwgTlVMTCk7CisJaWYgKCFlcnIpIHsKKwkJc3RydWN0IGRlbnRyeSAqaF9wYXJl
bnQgPSBkZ2V0X3BhcmVudChhLT5oX2RlbnRyeSk7CisJCXN0cnVjdCBpbm9kZSAqaF9kaXIgPSBo
X3BhcmVudC0+ZF9pbm9kZTsKKworCQlpaV93cml0ZV9sb2NrX2NoaWxkKGEtPmlub2RlKTsKKwkJ
aWlfd3JpdGVfbG9ja19wYXJlbnQoYS0+ZGlyKTsKKwkJYXVfaGRpcl9sb2NrKGhfZGlyLCBhLT5k
aXIsIGEtPmJpbmRleCk7CisJCWVyciA9IGF1X3dodG1wX3JtZGlyKGEtPmhfZGVudHJ5LCAmYS0+
d2hsaXN0LCBhLT5iaW5kZXgsCisJCQkJICAgICBhLT5kaXIsIGEtPmlub2RlLCBhLT5ub3NlbGYp
OworCQlhdV9oZGlyX3VubG9jayhoX2RpciwgYS0+ZGlyLCBhLT5iaW5kZXgpOworCQlpaV93cml0
ZV91bmxvY2soYS0+ZGlyKTsKKwkJaWlfd3JpdGVfdW5sb2NrKGEtPmlub2RlKTsKKwkJZHB1dCho
X3BhcmVudCk7CisJfQorCXNpX3JlYWRfdW5sb2NrKHNiKTsKKwlhdV93aHRtcF9ybWRpcl9mcmVl
X2FyZ3MoYSk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCUF1SU9FcnIoImVyciAlZFxuIiwgZXJy
KTsKK30KKwordm9pZCBhdV93aHRtcF9raWNrX3JtZGlyKHN0cnVjdCBkZW50cnkgKmhfZGVudHJ5
LCBzdHJ1Y3QgYXVfbmhhc2ggKndobGlzdCwKKwkJCSBhdWZzX2JpbmRleF90IGJpbmRleCwgc3Ry
dWN0IGlub2RlICpkaXIsCisJCQkgc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vc2VsZiwKKwkJ
CSBzdHJ1Y3QgYXVfd2h0bXBfcm1kaXJfYXJncyAqYXJncykKK3sKKwlpbnQgd2txX2VycjsKKwor
CUxLVFJUcmFjZSgiJS4qc1xuIiwgQXVETE5QYWlyKGhfZGVudHJ5KSk7CisJSU11c3RMb2NrKGRp
cik7CisKKwkvKiBhbGwgcG9zdC1wcm9jZXNzIHdpbGwgYmUgZG9uZSBpbiBkb19ybWRpcl93aHRt
cCgpLiAqLworCWFyZ3MtPmhfZGVudHJ5ID0gZGdldChoX2RlbnRyeSk7CisJYXVfbmhhc2hfaW5p
dCgmYXJncy0+d2hsaXN0KTsKKwlhdV9uaGFzaF9tb3ZlKCZhcmdzLT53aGxpc3QsIHdobGlzdCk7
CisJYXJncy0+YmluZGV4ID0gYmluZGV4OworCWFyZ3MtPmRpciA9IGlncmFiKGRpcik7CisJYXJn
cy0+aW5vZGUgPSBpZ3JhYihpbm9kZSk7CisJYXJncy0+bm9zZWxmID0gbm9zZWxmOworCXdrcV9l
cnIgPSBhdV93a3Ffbm93YWl0KGRvX3JtZGlyX3dodG1wLCBhcmdzLCBkaXItPmlfc2IsIC8qZGxn
dCovMCk7CisJaWYgKHVubGlrZWx5KHdrcV9lcnIpKSB7CisJCUF1V2Fybigicm1kaXIgZXJyb3Ig
JS4qcyAoJWQpLCBpZ25vcmVkXG4iLAorCQkgICAgICAgQXVETE5QYWlyKGhfZGVudHJ5KSwgd2tx
X2Vycik7CisJCWF1X3dodG1wX3JtZGlyX2ZyZWVfYXJncyhhcmdzKTsKKwl9Cit9CmRpZmYgLXVy
TiBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy93aG91dC5oIGxpbnV4LTIuNi4y
NS40LXVuaW9uZnMvZnMvYXVmcy93aG91dC5oCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9y
aWcvZnMvYXVmcy93aG91dC5oCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIu
Ni4yNS40LXVuaW9uZnMvZnMvYXVmcy93aG91dC5oCTIwMDgtMDUtMjUgMTE6NTY6MDggKzAzMDAK
QEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBKdW5qaXJv
IE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9n
cmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEg
IFVTQQorICovCisKKy8qCisgKiB3aGl0ZW91dCBmb3IgbG9naWNhbCBkZWxldGlvbiBhbmQgb3Bh
cXVlIGRpcmVjdG9yeQorICoKKyAqICRJZDogd2hvdXQuaCx2IDEuMiAyMDA4LzA0LzIxIDAyOjAw
OjM3IHNmanJvIEV4cCAkCisgKi8KKworI2lmbmRlZiBfX0FVRlNfV0hPVVRfSF9fCisjZGVmaW5l
IF9fQVVGU19XSE9VVF9IX18KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4
L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYXVmc190eXBlLmg+CisjaW5jbHVkZSAiZGlyLmgiCisj
aW5jbHVkZSAib3B0cy5oIgorI2luY2x1ZGUgInN1cGVyLmgiCisKK2ludCBhdV93aF9uYW1lX2Fs
bG9jKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIHN0cnVjdCBxc3RyICp3aCk7Cit2b2lkIGF1
X3doX25hbWVfZnJlZShzdHJ1Y3QgcXN0ciAqd2gpOworCitzdHJ1Y3QgYXVfbmR4OworaW50IGF1
X3doX3Rlc3Qoc3RydWN0IGRlbnRyeSAqaF9wYXJlbnQsIHN0cnVjdCBxc3RyICp3aF9uYW1lLCBp
bnQgdHJ5X3NpbywKKwkgICAgICAgc3RydWN0IGF1X25keCAqbmR4KTsKK2ludCBhdV9kaXJvcHFf
dGVzdChzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeSwgc3RydWN0IGF1X25keCAqbmR4KTsKKworc3Ry
dWN0IGRlbnRyeSAqYXVfd2h0bXBfbGt1cChzdHJ1Y3QgZGVudHJ5ICpoX3BhcmVudCwgc3RydWN0
IHFzdHIgKnByZWZpeCwKKwkJCSAgICAgc3RydWN0IGF1X25keCAqbmR4KTsKK2ludCBhdV93aHRt
cF9yZW4oc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgYXVmc19iaW5k
ZXhfdCBiaW5kZXgsCisJCSBpbnQgbm9zZWxmKTsKK2ludCBhdV93aF91bmxpbmtfZGVudHJ5KHN0
cnVjdCBpbm9kZSAqaF9kaXIsIHN0cnVjdCBkZW50cnkgKndoX2RlbnRyeSwKKwkJCXN0cnVjdCBk
ZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsIGludCBkbGd0KTsKKworc3RydWN0IGF1
X2JyYW5jaDsKK2ludCBhdV93aF9pbml0KHN0cnVjdCBkZW50cnkgKmhfcGFyZW50LCBzdHJ1Y3Qg
YXVfYnJhbmNoICpiciwKKwkgICAgICAgc3RydWN0IHZmc21vdW50ICpuZnNtbnQsIHN0cnVjdCBz
dXBlcl9ibG9jayAqc2IpOworCisvKiBkaXJvcHEgZmxhZ3MgKi8KKyNkZWZpbmUgQXVEaXJvcHFf
Q1JFQVRFCTEKKyNkZWZpbmUgQXVEaXJvcHFfRExHVAkoMSA8PCAxKQorI2RlZmluZSBhdV9mdGVz
dF9kaXJvcHEoZmxhZ3MsIG5hbWUpCSgoZmxhZ3MpICYgQXVEaXJvcHFfIyNuYW1lKQorI2RlZmlu
ZSBhdV9mc2V0X2Rpcm9wcShmbGFncywgbmFtZSkJeyAoZmxhZ3MpIHw9IEF1RGlyb3BxXyMjbmFt
ZTsgfQorI2RlZmluZSBhdV9mY2xyX2Rpcm9wcShmbGFncywgbmFtZSkJeyAoZmxhZ3MpICY9IH5B
dURpcm9wcV8jI25hbWU7IH0KKyNpZm5kZWYgQ09ORklHX0FVRlNfRExHVAorI3VuZGVmIEF1RGly
b3BxX0RMR1QKKyNkZWZpbmUgQXVEaXJvcHFfRExHVAkwCisjZW5kaWYKKworc3RydWN0IGRlbnRy
eSAqYXVfZGlyb3BxX3NpbyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGF1ZnNfYmluZGV4X3QgYmlu
ZGV4LAorCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCitzdHJ1Y3QgZGVudHJ5ICphdV93
aF9sa3VwKHN0cnVjdCBkZW50cnkgKmhfcGFyZW50LCBzdHJ1Y3QgcXN0ciAqYmFzZV9uYW1lLAor
CQkJICBzdHJ1Y3QgYXVfbmR4ICpuZHgpOworc3RydWN0IGRlbnRyeSAqYXVfd2hfY3JlYXRlKHN0
cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgYXVmc19iaW5k
ZXhfdCBiaW5kZXgsIHN0cnVjdCBkZW50cnkgKmhfcGFyZW50LAorCQkJICAgIHN0cnVjdCBhdV9u
ZHggKm5keCk7CisKKy8qIHJlYWwgcm1kaXIgdGhlIHdoaXRlb3V0LWVkIGRpciAqLworc3RydWN0
IGF1X3dodG1wX3JtZGlyX2FyZ3MgeworCXN0cnVjdCBkZW50cnkgKmhfZGVudHJ5OworCXN0cnVj
dCBhdV9uaGFzaCB3aGxpc3Q7CisJYXVmc19iaW5kZXhfdCBiaW5kZXg7CisJc3RydWN0IGlub2Rl
ICpkaXIsICppbm9kZTsKKwlpbnQgbm9zZWxmOworfTsKKworc3RydWN0IGF1X25oYXNoOworaW50
IGF1X3dodG1wX3JtZGlyKHN0cnVjdCBkZW50cnkgKmhfZGVudHJ5LCBzdHJ1Y3QgYXVfbmhhc2gg
KndobGlzdCwKKwkJICAgYXVmc19iaW5kZXhfdCBiaW5kZXgsIHN0cnVjdCBpbm9kZSAqZGlyLCBz
dHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICBpbnQgbm9zZWxmKTsKK3ZvaWQgYXVfd2h0bXBfa2lj
a19ybWRpcihzdHJ1Y3QgZGVudHJ5ICpoX2RlbnRyeSwgc3RydWN0IGF1X25oYXNoICp3aGxpc3Qs
CisJCQkgYXVmc19iaW5kZXhfdCBiaW5kZXgsIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJIHN0cnVj
dCBpbm9kZSAqaW5vZGUsIGludCBub3NlbGYsCisJCQkgc3RydWN0IGF1X3dodG1wX3JtZGlyX2Fy
Z3MgKmFyZ3MpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUKK3N0cnVj
dCBkZW50cnkgKmF1X2Rpcm9wcV9jcmVhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBhdWZzX2Jp
bmRleF90IGJpbmRleCwKKwkJCQlpbnQgZGxndCkKK3sKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBB
dURpcm9wcV9DUkVBVEU7CisJaWYgKHVubGlrZWx5KGRsZ3QpKQorCQlhdV9mc2V0X2Rpcm9wcShm
bGFncywgRExHVCk7CisJcmV0dXJuIGF1X2Rpcm9wcV9zaW8oZGVudHJ5LCBiaW5kZXgsIGZsYWdz
KTsKK30KKworc3RhdGljIGlubGluZQoraW50IGF1X2Rpcm9wcV9yZW1vdmUoc3RydWN0IGRlbnRy
eSAqZGVudHJ5LCBhdWZzX2JpbmRleF90IGJpbmRleCwgaW50IGRsZ3QpCit7CisJdW5zaWduZWQg
aW50IGZsYWdzID0gIUF1RGlyb3BxX0NSRUFURTsKKwlpZiAodW5saWtlbHkoZGxndCkpCisJCWF1
X2ZzZXRfZGlyb3BxKGZsYWdzLCBETEdUKTsKKwlyZXR1cm4gUFRSX0VSUihhdV9kaXJvcHFfc2lv
KGRlbnRyeSwgYmluZGV4LCBmbGFncykpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNp
ZmRlZiBDT05GSUdfQVVGU19ST0JSCisvKiByb2JyLmMgKi8KK2ludCBhdV90ZXN0X3JvYnJfd2go
c3RydWN0IHFzdHIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKmhfcGFyZW50LAorCQkgICAgc3RydWN0
IHFzdHIgKndoX25hbWUsIGludCB0cnlfc2lvLCBzdHJ1Y3QgYXVfbmR4ICpuZHgpOworaW50IGF1
X3Rlc3Rfcm9icl9zaHdoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IHN0cnVjdCBxc3Ry
ICpuYW1lKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lCitpbnQgYXVfdGVzdF9yb2JyX3doKHN0cnVj
dCBxc3RyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpoX3BhcmVudCwKKwkJICAgIHN0cnVjdCBxc3Ry
ICp3aF9uYW1lLCBpbnQgdHJ5X3Npbywgc3RydWN0IGF1X25keCAqbmR4KQoreworCXJldHVybiBh
dV93aF90ZXN0KGhfcGFyZW50LCB3aF9uYW1lLCB0cnlfc2lvLCBuZHgpOworfQorCitzdGF0aWMg
aW5saW5lCitpbnQgYXVfdGVzdF9yb2JyX3Nod2goc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29u
c3Qgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJaWYgKHVubGlrZWx5KCFhdV9vcHRfdGVzdChhdV9t
bnRmbGFncyhzYiksIFNIV0gpCisJCSAgICAgJiYgIXN0cm5jbXAobmFtZS0+bmFtZSwgQVVGU19X
SF9QRlgsIEFVRlNfV0hfUEZYX0xFTikpKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiAwOwor
fQorI2VuZGlmIC8qIENPTkZJR19BVUZTX1JPQlIgKi8KKworI2VuZGlmIC8qIF9fS0VSTkVMX18g
Ki8KKyNlbmRpZiAvKiBfX0FVRlNfV0hPVVRfSF9fICovCmRpZmYgLXVyTiBsaW51eC0yLjYuMjUu
NC11bmlvbmZzLm9yaWcvZnMvYXVmcy93a3EuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1
ZnMvd2txLmMKLS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9hdWZzL3drcS5jCTE5
NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVm
cy93a3EuYwkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0wLDAgKzEsMjk3IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggSnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBw
cm9ncmFtLCBhdWZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJD
SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
CisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZp
ZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKgorICogd29y
a3F1ZXVlIGZvciBhc3luY2hyb25vdXMvc3VwZXItaW8vZGVsZWdhdGVkIG9wZXJhdGlvbnMKKyAq
CisgKiAkSWQ6IHdrcS5jLHYgMS40IDIwMDgvMDUvMDQgMjM6NTM6Mzggc2Zqcm8gRXhwICQKKyAq
LworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSAiYXVmcy5oIgorCitzdHJ1
Y3QgYXVfd2txICphdV93a3E7CisKK3N0cnVjdCBhdV9jcmVkIHsKKyNpZmRlZiBDT05GSUdfQVVG
U19ETEdUCisJaW50IHVtYXNrOworCXVpZF90IGZzdWlkOworCWdpZF90IGZzZ2lkOworCWtlcm5l
bF9jYXBfdCBjYXBfZWZmZWN0aXZlLCBjYXBfaW5oZXJpdGFibGUsIGNhcF9wZXJtaXR0ZWQ7CisJ
Ly91bnNpZ25lZCBrZWVwX2NhcGFiaWxpdGllczoxOworCS8vc3RydWN0IHVzZXJfc3RydWN0ICp1
c2VyOworCS8vc3RydWN0IGZzX3N0cnVjdCAqZnM7CisJLy9zdHJ1Y3QgbnNwcm94eSAqbnNwcm94
eTsKKyNlbmRpZgorfTsKKworc3RydWN0IGF1X3draW5mbyB7CisJc3RydWN0IHdvcmtfc3RydWN0
IHdrOworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0
cnVjdCBhdV9jcmVkIGNyZWQ7CisKKwlhdV93a3FfZnVuY190IGZ1bmM7CisJdm9pZCAqYXJnczsK
KworCWF0b21pY190ICpidXN5cDsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqY29tcDsKK307CisKKy8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19BVUZTX0RMR1QKK3N0YXRpYyB2b2lk
IGNyZWRfc3RvcmUoc3RydWN0IGF1X2NyZWQgKmNyZWQpCit7CisJY3JlZC0+dW1hc2sgPSBjdXJy
ZW50LT5mcy0+dW1hc2s7CisJY3JlZC0+ZnN1aWQgPSBjdXJyZW50LT5mc3VpZDsKKwljcmVkLT5m
c2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCWNyZWQtPmNhcF9lZmZlY3RpdmUgPSBjdXJyZW50LT5j
YXBfZWZmZWN0aXZlOworCWNyZWQtPmNhcF9pbmhlcml0YWJsZSA9IGN1cnJlbnQtPmNhcF9pbmhl
cml0YWJsZTsKKwljcmVkLT5jYXBfcGVybWl0dGVkID0gY3VycmVudC0+Y2FwX3Blcm1pdHRlZDsK
K30KKworc3RhdGljIHZvaWQgY3JlZF9yZXZlcnQoc3RydWN0IGF1X2NyZWQgKmNyZWQpCit7CisJ
QXVEZWJ1Z09uKCFhdV90ZXN0X3drcShjdXJyZW50KSk7CisJY3VycmVudC0+ZnMtPnVtYXNrID0g
Y3JlZC0+dW1hc2s7CisJY3VycmVudC0+ZnN1aWQgPSBjcmVkLT5mc3VpZDsKKwljdXJyZW50LT5m
c2dpZCA9IGNyZWQtPmZzZ2lkOworCWN1cnJlbnQtPmNhcF9lZmZlY3RpdmUgPSBjcmVkLT5jYXBf
ZWZmZWN0aXZlOworCWN1cnJlbnQtPmNhcF9pbmhlcml0YWJsZSA9IGNyZWQtPmNhcF9pbmhlcml0
YWJsZTsKKwljdXJyZW50LT5jYXBfcGVybWl0dGVkID0gY3JlZC0+Y2FwX3Blcm1pdHRlZDsKK30K
Kworc3RhdGljIHZvaWQgY3JlZF9zd2l0Y2goc3RydWN0IGF1X2NyZWQgKm9sZCwgc3RydWN0IGF1
X2NyZWQgKm5ldykKK3sKKwljcmVkX3N0b3JlKG9sZCk7CisJY3JlZF9yZXZlcnQobmV3KTsKK30K
Kworc3RhdGljIHZvaWQgZGxndF9jcmVkX3N0b3JlKHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0
IGF1X3draW5mbyAqd2tpbmZvKQoreworCWlmICh1bmxpa2VseShhdV9mdGVzdF93a3EoZmxhZ3Ms
IERMR1QpKSkKKwkJY3JlZF9zdG9yZSgmd2tpbmZvLT5jcmVkKTsKK30KKworc3RhdGljIHZvaWQg
ZGxndF9mdW5jKHN0cnVjdCBhdV93a2luZm8gKndraW5mbykKK3sKKwlpZiAoIWF1X2Z0ZXN0X3dr
cSh3a2luZm8tPmZsYWdzLCBETEdUKSkKKwkJd2tpbmZvLT5mdW5jKHdraW5mby0+YXJncyk7CisJ
ZWxzZSB7CisJCXN0cnVjdCBhdV9jcmVkIGNyZWQ7CisJCWNyZWRfc3dpdGNoKCZjcmVkLCAmd2tp
bmZvLT5jcmVkKTsKKwkJd2tpbmZvLT5mdW5jKHdraW5mby0+YXJncyk7CisJCWNyZWRfcmV2ZXJ0
KCZjcmVkKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgZGxndF9jcmVkX3N0b3JlKHVuc2ln
bmVkIGludCBmbGFncywgc3RydWN0IGF1X3draW5mbyAqd2tpbmZvKQoreworCS8qIGVtcHR5ICov
Cit9CisKK3N0YXRpYyB2b2lkIGRsZ3RfZnVuYyhzdHJ1Y3QgYXVfd2tpbmZvICp3a2luZm8pCit7
CisJd2tpbmZvLT5mdW5jKHdraW5mby0+YXJncyk7Cit9CisjZW5kaWYgLyogQ09ORklHX0FVRlNf
RExHVCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9idXN5
KHN0cnVjdCBhdV93a3EgKndrcSwgc3RydWN0IGF1X3draW5mbyAqd2tpbmZvKQoreworI2lmZGVm
IENPTkZJR19BVUZTX1NUQVQKKwl1bnNpZ25lZCBpbnQgbmV3LCBvbGQ7CisKKwlkbyB7CisJCW5l
dyA9IGF0b21pY19yZWFkKHdraW5mby0+YnVzeXApOworCQlvbGQgPSB3a3EtPm1heF9idXN5Owor
CQlpZiAobmV3IDw9IG9sZCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKGNtcHhjaGcoJndrcS0+bWF4
X2J1c3ksIG9sZCwgbmV3KSA9PSBvbGQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZW5xdWV1
ZShzdHJ1Y3QgYXVfd2txICp3a3EsIHN0cnVjdCBhdV93a2luZm8gKndraW5mbykKK3sKKwlBdVRy
YWNlRW50ZXIoKTsKKwl3a2luZm8tPmJ1c3lwID0gJndrcS0+YnVzeTsKKwl1cGRhdGVfYnVzeSh3
a3EsIHdraW5mbyk7CisJaWYgKGF1X2Z0ZXN0X3drcSh3a2luZm8tPmZsYWdzLCBXQUlUKSkKKwkJ
cmV0dXJuICFxdWV1ZV93b3JrKHdrcS0+cSwgJndraW5mby0+d2spOworCWVsc2UKKwkJcmV0dXJu
ICFzY2hlZHVsZV93b3JrKCZ3a2luZm8tPndrKTsKK30KKworc3RhdGljIHZvaWQgZG9fd2txKHN0
cnVjdCBhdV93a2luZm8gKndraW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgaWRsZSwgbjsKKwlpbnQg
aSwgaWRsZV9pZHg7CisKKwlBdVRyYWNlRW50ZXIoKTsKKworCXdoaWxlICgxKSB7CisJCWlmIChh
dV9mdGVzdF93a3Eod2tpbmZvLT5mbGFncywgV0FJVCkpIHsKKwkJCWlkbGVfaWR4ID0gMDsKKwkJ
CWlkbGUgPSBVSU5UX01BWDsKKwkJCWZvciAoaSA9IDA7IGkgPCBhdWZzX253a3E7IGkrKykgewor
CQkJCW4gPSBhdG9taWNfaW5jX3JldHVybigmYXVfd2txW2ldLmJ1c3kpOworCQkJCWlmIChuID09
IDEgJiYgIWVucXVldWUoYXVfd2txICsgaSwgd2tpbmZvKSkKKwkJCQkJcmV0dXJuOyAvKiBzdWNj
ZXNzICovCisKKwkJCQlpZiAobiA8IGlkbGUpIHsKKwkJCQkJaWRsZV9pZHggPSBpOworCQkJCQlp
ZGxlID0gbjsKKwkJCQl9CisJCQkJYXRvbWljX2RlY19yZXR1cm4oJmF1X3drcVtpXS5idXN5KTsK
KwkJCX0KKwkJfSBlbHNlCisJCQlpZGxlX2lkeCA9IGF1ZnNfbndrcTsKKworCQlhdG9taWNfaW5j
X3JldHVybigmYXVfd2txW2lkbGVfaWR4XS5idXN5KTsKKwkJaWYgKCFlbnF1ZXVlKGF1X3drcSAr
IGlkbGVfaWR4LCB3a2luZm8pKQorCQkJcmV0dXJuOyAvKiBzdWNjZXNzICovCisKKwkJLyogaW1w
b3NzaWJsZT8gKi8KKwkJQXVXYXJuMSgiZmFpbGVkIHRvIHF1ZXVlX3dvcmsoKVxuIik7CisJCXlp
ZWxkKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3a3FfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3Qg
KndrKQoreworCXN0cnVjdCBhdV93a2luZm8gKndraW5mbyA9IGNvbnRhaW5lcl9vZih3aywgc3Ry
dWN0IGF1X3draW5mbywgd2spOworCisJTEtUUlRyYWNlKCJ3a2luZm97MHgleCwgJXAsICVwLCAl
cH1cbiIsCisJCSAgd2tpbmZvLT5mbGFncywgd2tpbmZvLT5mdW5jLCB3a2luZm8tPmJ1c3lwLCB3
a2luZm8tPmNvbXApOworCisJZGxndF9mdW5jKHdraW5mbyk7CisJYXRvbWljX2RlY19yZXR1cm4o
d2tpbmZvLT5idXN5cCk7CisJaWYgKGF1X2Z0ZXN0X3drcSh3a2luZm8tPmZsYWdzLCBXQUlUKSkK
KwkJY29tcGxldGUod2tpbmZvLT5jb21wKTsKKwllbHNlIHsKKwkJbW50cHV0KHdraW5mby0+bW50
KTsKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCWtmcmVlKHdraW5mbyk7CisJfQorfQor
CitpbnQgYXVfd2txX3J1bihhdV93a3FfZnVuY190IGZ1bmMsIHZvaWQgKmFyZ3MsIHN0cnVjdCBz
dXBlcl9ibG9jayAqc2IsCisJICAgICAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgZXJy
OworCS8vaW50IHF1ZXVlZDsKKwkvL3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3a3E7CisJREVD
TEFSRV9DT01QTEVUSU9OX09OU1RBQ0soY29tcCk7CisJc3RydWN0IGF1X3draW5mbyBfd2tpbmZv
ID0geworCQkvLy5zYgk9IHNiLAorCQkuZmxhZ3MJPSBmbGFncywKKwkJLmZ1bmMJPSBmdW5jLAor
CQkuYXJncwk9IGFyZ3MsCisJCS5jb21wCT0gJmNvbXAKKwl9LCAqd2tpbmZvID0gJl93a2luZm87
CisKKwlMS1RSVHJhY2UoIjB4JXhcbiIsIGZsYWdzKTsKKwlBdURlYnVnT24oYXVfdGVzdF93a3Eo
Y3VycmVudCkpOworCisJZXJyID0gMDsKKwlpZiAodW5saWtlbHkoIWF1X2Z0ZXN0X3drcShmbGFn
cywgV0FJVCkpKSB7CisJCUF1RGVidWdPbighc2IpOworCQkvKgorCQkgKiB3a3FfZnVuYygpIG11
c3QgZnJlZSB0aGlzIHdraW5mby4KKwkJICogaXQgaGlnaGx5IGRlcGVuZHMgdXBvbiB0aGUgaW1w
bGVtZW50YXRpb24gb2Ygd29ya3F1ZXVlLgorCQkgKi8KKwkJZXJyID0gLUVOT01FTTsKKwkJd2tp
bmZvID0ga21hbGxvYyhzaXplb2YoKndraW5mbyksIEdGUF9URU1QT1JBUlkpOworCQlpZiAodW5s
aWtlbHkoIXdraW5mbykpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gMDsKKwkJLyogcHJvaGliaXQg
dW1vdW50ICovCisJCXdraW5mby0+bW50ID0gYXVfbW50Y2FjaGVfZ2V0KHNiKTsKKwkJd2tpbmZv
LT5mbGFncyA9IGZsYWdzOworCQl3a2luZm8tPmZ1bmMgPSBmdW5jOworCQl3a2luZm8tPmFyZ3Mg
PSBhcmdzOworCQl3a2luZm8tPmNvbXAgPSBOVUxMOworCQlfX21vZHVsZV9nZXQoVEhJU19NT0RV
TEUpOworCX0KKworCUlOSVRfV09SSygmd2tpbmZvLT53aywgd2txX2Z1bmMpOworCWRsZ3RfY3Jl
ZF9zdG9yZShmbGFncywgd2tpbmZvKTsKKwlkb193a3Eod2tpbmZvKTsKKwlpZiAoYXVfZnRlc3Rf
d2txKGZsYWdzLCBXQUlUKSkKKwkJLyogbm8gdGltZW91dCwgbm8gaW50ZXJydXB0ICovCisJCXdh
aXRfZm9yX2NvbXBsZXRpb24od2tpbmZvLT5jb21wKTsKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIp
OworCXJldHVybiBlcnI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBhdV93a3Ff
ZmluKHZvaWQpCit7CisJaW50IGk7CisKKwlBdVRyYWNlRW50ZXIoKTsKKworCWZvciAoaSA9IDA7
IGkgPCBhdWZzX253a3E7IGkrKykKKwkJaWYgKGF1X3drcVtpXS5xICYmICFJU19FUlIoYXVfd2tx
W2ldLnEpKQorCQkJZGVzdHJveV93b3JrcXVldWUoYXVfd2txW2ldLnEpOworCWtmcmVlKGF1X3dr
cSk7Cit9CisKK2ludCBfX2luaXQgYXVfd2txX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyLCBpOwor
CXN0cnVjdCBhdV93a3EgKm5vd2FpdHE7CisKKwlMS1RSVHJhY2UoIiVkXG4iLCBhdWZzX253a3Ep
OworCisJLyogJysxJyBpcyBmb3IgYWNjb3VudGluZyAgb2Ygbm93YWl0IHF1ZXVlICovCisJZXJy
ID0gLUVOT01FTTsKKwlhdV93a3EgPSBrY2FsbG9jKGF1ZnNfbndrcSArIDEsIHNpemVvZigqYXVf
d2txKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFhdV93a3EpKQorCQlnb3RvIG91dDsK
KworCWVyciA9IDA7CisJZm9yIChpID0gMDsgaSA8IGF1ZnNfbndrcTsgaSsrKSB7CisJCWF1X3dr
cVtpXS5xID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoQVVGU19XS1FfTkFNRSk7CisJ
CWlmIChhdV93a3FbaV0ucSAmJiAhSVNfRVJSKGF1X3drcVtpXS5xKSkgeworCQkJYXRvbWljX3Nl
dCgmYXVfd2txW2ldLmJ1c3ksIDApOworCQkJYXVfd2txW2ldLm1heF9idXN5ID0gMDsKKwkJCWNv
bnRpbnVlOworCQl9CisKKwkJZXJyID0gUFRSX0VSUihhdV93a3FbaV0ucSk7CisJCWF1X3drcV9m
aW4oKTsKKwkJYnJlYWs7CisJfQorCisJLyogbm93YWl0IGFjY291bnRpbmcgKi8KKwlub3dhaXRx
ID0gYXVfd2txICsgYXVmc19ud2txOworCWF0b21pY19zZXQoJm5vd2FpdHEtPmJ1c3ksIDApOwor
CW5vd2FpdHEtPm1heF9idXN5ID0gMDsKKwlub3dhaXRxLT5xID0gTlVMTDsKKwkvL3NtcF9tYigp
OyAvKiBhdG9taWNfc2V0ICovCisKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBl
cnI7Cit9CmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvYXVmcy93a3Eu
aCBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL2F1ZnMvd2txLmgKLS0tIGxpbnV4LTIuNi4yNS40
LXVuaW9uZnMub3JpZy9mcy9hdWZzL3drcS5oCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysr
IGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy93a3EuaAkyMDA4LTA1LTI1IDExOjU2OjA4
ICswMzAwCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDgg
SnVuamlybyBPa2FqaW1hCisgKgorICogVGhpcyBwcm9ncmFtLCBhdWZzIGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRo
aXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjEx
MC0xMzAxICBVU0EKKyAqLworCisvKgorICogd29ya3F1ZXVlIGZvciBhc3luY2hyb25vdXMvc3Vw
ZXItaW8vZGVsZWdhdGVkIG9wZXJhdGlvbnMKKyAqCisgKiAkSWQ6IHdrcS5oLHYgMS4zIDIwMDgv
MDQvMjggMDM6MTg6MjEgc2Zqcm8gRXhwICQKKyAqLworCisjaWZuZGVmIF9fQVVGU19XS1FfSF9f
CisjZGVmaW5lIF9fQVVGU19XS1FfSF9fCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRl
IDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgv
d29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvYXVmc190eXBlLmg+CisKKy8qIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gKi8KKworLyogaW50ZXJuYWwgd29ya3F1ZXVlIG5hbWVkIEFVRlNfV0tRX05BTUUgKi8K
K3N0cnVjdCBhdV93a3EgeworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CSpxOworCisJLyogYWNj
b3VudGluZyAqLworCWF0b21pY190CQlidXN5OworCXVuc2lnbmVkIGludAkJbWF4X2J1c3k7IC8v
IHRvZG86IFNUQVQgb25seQorfTsKKworLyoKKyAqIGluIHRoZSBuZXh0IG9wZXJhdGlvbiwgd2Fp
dCBmb3IgdGhlICdub3dhaXQnIHRhc2tzIGluIHN5c3RlbS13aWRlIHdvcmtxdWV1ZQorICovCitz
dHJ1Y3QgYXVfbm93YWl0X3Rhc2tzIHsKKyNpZmRlZiBDT05GSUdfQVVGU19ISU5PVElGWQorCS8q
CisJICogY3VycmVudGx5LCB0aGUgJ25vd2FpdCcgdGFzayB3aGljaCBzaG91bGQgYmUgd2FpdGVk
IGluIHRoZSBuZXh0CisJICogb3BlcmF0aW9uIGlzIG9ubHkgaGlub3RpZnkuCisJICovCisJYXRv
bWljX3QJCW53X2xlbjsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlud193cTsKKyNlbmRpZgorfTsKKwor
LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gc3RydWN0IGF1X3drcSAqYXVfd2txOwordHlw
ZWRlZiB2b2lkICgqYXVfd2txX2Z1bmNfdCkodm9pZCAqYXJncyk7CisKKy8qIHdrcSBmbGFncyAq
LworI2RlZmluZSBBdVdrcV9XQUlUCTEKKyNkZWZpbmUgQXVXa3FfRExHVAkoMSA8PCAxKQorI2Rl
ZmluZSBhdV9mdGVzdF93a3EoZmxhZ3MsIG5hbWUpCSgoZmxhZ3MpICYgQXVXa3FfIyNuYW1lKQor
I2RlZmluZSBhdV9mc2V0X3drcShmbGFncywgbmFtZSkJeyAoZmxhZ3MpIHw9IEF1V2txXyMjbmFt
ZTsgfQorI2RlZmluZSBhdV9mY2xyX3drcShmbGFncywgbmFtZSkJeyAoZmxhZ3MpICY9IH5BdVdr
cV8jI25hbWU7IH0KKyNpZm5kZWYgQ09ORklHX0FVRlNfRExHVAorI3VuZGVmIEF1V2txX0RMR1QK
KyNkZWZpbmUgQXVXa3FfRExHVAkwCisjZW5kaWYKKworaW50IGF1X3drcV9ydW4oYXVfd2txX2Z1
bmNfdCBmdW5jLCB2b2lkICphcmdzLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCSAgICAgICB1
bnNpZ25lZCBpbnQgZmxhZ3MpOworaW50IF9faW5pdCBhdV93a3FfaW5pdCh2b2lkKTsKK3ZvaWQg
YXVfd2txX2Zpbih2b2lkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5l
IGludCBhdV90ZXN0X3drcShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlyZXR1cm4gKCF0
c2stPm1tICYmICFzdHJjbXAodHNrLT5jb21tLCBBVUZTX1dLUV9OQU1FKSk7Cit9CisKK3N0YXRp
YyBpbmxpbmUgaW50IGF1X3drcV93YWl0KGF1X3drcV9mdW5jX3QgZnVuYywgdm9pZCAqYXJncywg
aW50IGRsZ3QpCit7CisJdW5zaWduZWQgaW50IGZsYWdzID0gQXVXa3FfV0FJVDsKKwlpZiAodW5s
aWtlbHkoZGxndCkpCisJCWF1X2ZzZXRfd2txKGZsYWdzLCBETEdUKTsKKwlyZXR1cm4gYXVfd2tx
X3J1bihmdW5jLCBhcmdzLCAvKnNiKi9OVUxMLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUg
aW50IGF1X3drcV9ub3dhaXQoYXVfd2txX2Z1bmNfdCBmdW5jLCB2b2lkICphcmdzLAorCQkJCXN0
cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBkbGd0KQoreworCXVuc2lnbmVkIGludCBmbGFncyA9
ICFBdVdrcV9XQUlUOworCWlmICh1bmxpa2VseShkbGd0KSkKKwkJYXVfZnNldF93a3EoZmxhZ3Ms
IERMR1QpOworCXJldHVybiBhdV93a3FfcnVuKGZ1bmMsIGFyZ3MsIHNiLCBmbGFncyk7Cit9CisK
KyNpZmRlZiBDT05GSUdfQVVGU19ISU5PVElGWQorLy90b2RvOiBtZW1vcnkgYmFycmllcj8KK3N0
YXRpYyBpbmxpbmUgdm9pZCBhdV9ud3RfaW5pdChzdHJ1Y3QgYXVfbm93YWl0X3Rhc2tzICpud3Qp
Cit7CisJYXRvbWljX3NldCgmbnd0LT5ud19sZW4sIDApOworCXNtcF9tYigpOyAvKiBhdG9taWNf
c2V0ICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmbnd0LT5ud193cSk7Cit9CisKK3N0YXRpYyBp
bmxpbmUgaW50IGF1X253dF9pbmMoc3RydWN0IGF1X25vd2FpdF90YXNrcyAqbnd0KQoreworCXJl
dHVybiBhdG9taWNfaW5jX3JldHVybigmbnd0LT5ud19sZW4pOworfQorCitzdGF0aWMgaW5saW5l
IGludCBhdV9ud3RfZGVjKHN0cnVjdCBhdV9ub3dhaXRfdGFza3MgKm53dCkKK3sKKwlpbnQgcmV0
ID0gYXRvbWljX2RlY19yZXR1cm4oJm53dC0+bndfbGVuKTsKKwlpZiAoIXJldCkKKwkJd2FrZV91
cF9hbGwoJm53dC0+bndfd3EpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50
IGF1X253dF9mbHVzaChzdHJ1Y3QgYXVfbm93YWl0X3Rhc2tzICpud3QpCit7CisJd2FpdF9ldmVu
dChud3QtPm53X3dxLCAhYXRvbWljX3JlYWQoJm53dC0+bndfbGVuKSk7CisJcmV0dXJuIDA7Cit9
CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGF1X253dF9pbml0KHN0cnVjdCBhdV9ub3dhaXRf
dGFza3MgKm53dCkKK3sKKwkvKiBub3RoaW5nICovCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF1
X253dF9pbmMoc3RydWN0IGF1X25vd2FpdF90YXNrcyAqbnd0KQoreworCXJldHVybiAwOworfQor
CitzdGF0aWMgaW5saW5lIGludCBhdV9ud3RfZGVjKHN0cnVjdCBhdV9ub3dhaXRfdGFza3MgKm53
dCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXVfbnd0X2ZsdXNoKHN0
cnVjdCBhdV9ub3dhaXRfdGFza3MgKm53dCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBD
T05GSUdfQVVGU19ISU5PVElGWSAqLworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlm
IC8qIF9fQVVGU19XS1FfSF9fICovCmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9y
aWcvZnMvYXVmcy94aW5vLmMgbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9hdWZzL3hpbm8uYwot
LS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2F1ZnMveGluby5jCTE5NzAtMDEtMDEg
MDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvYXVmcy94aW5vLmMJ
MjAwOC0wNS0yNSAxMTo1ODo1MyArMDMwMApAQCAtMCwwICsxLDEyMjUgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDUtMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dyYW0s
IGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v
ZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdO
VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVl
IFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxv
b3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qCisgKiBleHRlcm5hbCBp
bm9kZSBudW1iZXIgdHJhbnNsYXRpb24gdGFibGUgYW5kIGJpdG1hcAorICoKKyAqICRJZDogeGlu
by5jLHYgMS42IDIwMDgvMDUvMTkgMDE6NTE6MjMgc2Zqcm8gRXhwICQKKyAqLworCisvLyNpbmNs
dWRlIDxsaW51eC9mc25vdGlmeS5oPgorLy8jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNp
bmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSAiYXVmcy5oIgorCisvKiAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCisKK3N0YXRpYyBzc2l6ZV90IHhpbm9fZnJlYWQoYXVfcmVhZGZfdCBmdW5jLCBz
dHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqYnVmLAorCQkJICBzaXplX3Qgc2l6ZSwgbG9mZl90ICpw
b3MpCit7CisJc3NpemVfdCBlcnI7CisJbW1fc2VnbWVudF90IG9sZGZzOworCisJTEtUUlRyYWNl
KCIlLipzLCBzeiAlbHUsICpwb3MgJUxkXG4iLAorCQkgIEF1RExOUGFpcihmaWxlLT5mX2RlbnRy
eSksICh1bnNpZ25lZCBsb25nKXNpemUsICpwb3MpOworCisJb2xkZnMgPSBnZXRfZnMoKTsKKwlz
ZXRfZnMoS0VSTkVMX0RTKTsKKwlkbyB7CisJCS8vIHNpZ25hbF9wZW5kaW5nCisJCWVyciA9IGZ1
bmMoZmlsZSwgKGNoYXIgX191c2VyICopYnVmLCBzaXplLCBwb3MpOworCX0gd2hpbGUgKGVyciA9
PSAtRUFHQUlOIHx8IGVyciA9PSAtRUlOVFIpOworCXNldF9mcyhvbGRmcyk7CisKKwlBdVRyYWNl
RXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0
aWMgc3NpemVfdCBkb194aW5vX2Z3cml0ZShhdV93cml0ZWZfdCBmdW5jLCBzdHJ1Y3QgZmlsZSAq
ZmlsZSwgdm9pZCAqYnVmLAorCQkJICAgICAgc2l6ZV90IHNpemUsIGxvZmZfdCAqcG9zKQorewor
CXNzaXplX3QgZXJyOworCW1tX3NlZ21lbnRfdCBvbGRmczsKKworCWxvY2tkZXBfb2ZmKCk7CisJ
b2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlkbyB7CisJCS8vIHNpZ25h
bF9wZW5kaW5nCisJCWVyciA9IGZ1bmMoZmlsZSwgKGNvbnN0IGNoYXIgX191c2VyICopYnVmLCBz
aXplLCBwb3MpOworCX0gd2hpbGUgKGVyciA9PSAtRUFHQUlOIHx8IGVyciA9PSAtRUlOVFIpOwor
CXNldF9mcyhvbGRmcyk7CisJbG9ja2RlcF9vbigpOworCisJaWYgKGVyciA+PSAwKQorCQlhdV91
cGRhdGVfZnVzZV9oX2lub2RlKGZpbGUtPmZfdmZzbW50LCBmaWxlLT5mX2RlbnRyeSk7CisJLypp
Z25vcmUqLworCisJQXVUcmFjZUVycihlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBk
b194aW5vX2Z3cml0ZV9hcmdzIHsKKwlzc2l6ZV90ICplcnJwOworCWF1X3dyaXRlZl90IGZ1bmM7
CisJc3RydWN0IGZpbGUgKmZpbGU7CisJdm9pZCAqYnVmOworCXNpemVfdCBzaXplOworCWxvZmZf
dCAqcG9zOworfTsKKworc3RhdGljIHZvaWQgY2FsbF9kb194aW5vX2Z3cml0ZSh2b2lkICphcmdz
KQoreworCXN0cnVjdCBkb194aW5vX2Z3cml0ZV9hcmdzICphID0gYXJnczsKKwkqYS0+ZXJycCA9
IGRvX3hpbm9fZndyaXRlKGEtPmZ1bmMsIGEtPmZpbGUsIGEtPmJ1ZiwgYS0+c2l6ZSwgYS0+cG9z
KTsKK30KKworc3RhdGljIHNzaXplX3QgeGlub19md3JpdGUoYXVfd3JpdGVmX3QgZnVuYywgc3Ry
dWN0IGZpbGUgKmZpbGUsIHZvaWQgKmJ1ZiwKKwkJCSAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKnBv
cykKK3sKKwlzc2l6ZV90IGVycjsKKworCUxLVFJUcmFjZSgiJS4qcywgc3ogJWx1LCAqcG9zICVM
ZFxuIiwKKwkJICBBdURMTlBhaXIoZmlsZS0+Zl9kZW50cnkpLCAodW5zaWduZWQgbG9uZylzaXpl
LCAqcG9zKTsKKworCS8vIHNpZ25hbCBibG9jayBhbmQgbm8gd2txPworCS8qCisJICogaXQgYnJl
YWtzIFJMSU1JVF9GU0laRSBhbmQgbm9ybWFsIHVzZXIncyBsaW1pdCwKKwkgKiB1c2VycyBzaG91
bGQgY2FyZSBhYm91dCBxdW90YSBhbmQgcmVhbCAnZmlsZXN5c3RlbSBmdWxsLicKKwkgKi8KKwlp
ZiAoIWF1X3Rlc3Rfd2txKGN1cnJlbnQpKSB7CisJCWludCB3a3FfZXJyOworCQlzdHJ1Y3QgZG9f
eGlub19md3JpdGVfYXJncyBhcmdzID0geworCQkJLmVycnAJPSAmZXJyLAorCQkJLmZ1bmMJPSBm
dW5jLAorCQkJLmZpbGUJPSBmaWxlLAorCQkJLmJ1Zgk9IGJ1ZiwKKwkJCS5zaXplCT0gc2l6ZSwK
KwkJCS5wb3MJPSBwb3MKKwkJfTsKKwkJd2txX2VyciA9IGF1X3drcV93YWl0KGNhbGxfZG9feGlu
b19md3JpdGUsICZhcmdzLCAvKmRsZ3QqLzApOworCQlpZiAodW5saWtlbHkod2txX2VycikpCisJ
CQllcnIgPSB3a3FfZXJyOworCX0gZWxzZQorCQllcnIgPSBkb194aW5vX2Z3cml0ZShmdW5jLCBm
aWxlLCBidWYsIHNpemUsIHBvcyk7CisKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsK
K30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgeGlub19kb190cnVuY19hcmdzIHsK
KwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKwlzdHJ1Y3QgYXVfYnJhbmNoICpicjsKK307CisKK3N0
YXRpYyB2b2lkIHhpbm9fZG9fdHJ1bmModm9pZCAqX2FyZ3MpCit7CisJc3RydWN0IHhpbm9fZG9f
dHJ1bmNfYXJncyAqYXJncyA9IF9hcmdzOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJYXVm
c19iaW5kZXhfdCBiaW5kZXg7CisJaW50IGVycjsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKworCWVy
ciA9IDA7CisJc2IgPSBhcmdzLT5tbnQtPm1udF9zYjsKKwlzaV9ub2ZsdXNoX3dyaXRlX2xvY2so
c2IpOworCWJpbmRleCA9IGF1X2JyX2luZGV4KHNiLCBhcmdzLT5ici0+YnJfaWQpOworCUF1RGVi
dWdPbihiaW5kZXggPCAwKTsKKwllcnIgPSBhdV94aW5vX3RydW5jKHNiLCBiaW5kZXgpOworCWlm
ICh1bmxpa2VseShlcnIpKQorCQlnb3RvIG91dDsKKworCWZpbGUgPSBhcmdzLT5ici0+YnJfeGlu
bzsKKwlhdV91cGRhdGVfZnVzZV9oX2lub2RlKGFyZ3MtPmJyLT5icl9tbnQsIGZpbGUtPmZfZGVu
dHJ5KTsgLyppZ25vcmUqLworCWlmIChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9ibG9ja3Mg
Pj0gYXJncy0+YnItPmJyX3hpbm9fdXBwZXIpCisJCWFyZ3MtPmJyLT5icl94aW5vX3VwcGVyICs9
IEFVRlNfWElOT19UUlVOQ19TVEVQOworCS8vQXVEYmcoIiVMdVxuIiwgKHVuc2lnbmVkIGxvbmcg
bG9uZylhcmdzLT5ici0+YnJfeGlub191cHBlcik7CisKKyBvdXQ6CisJc2lfd3JpdGVfdW5sb2Nr
KHNiKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJQXVXYXJuKCJlcnIgYiVkLCAoJWQpXG4iLCBi
aW5kZXgsIGVycik7CisJYXVfbnd0X2RlYygmYXVfc2JpKHNiKS0+c2lfbm93YWl0KTsKKwlhdG9t
aWNfZGVjX3JldHVybigmYXJncy0+YnItPmJyX3hpbm9fcnVubmluZyk7CisJYXVfYnJfcHV0KGFy
Z3MtPmJyKTsKKwltbnRwdXQoYXJncy0+bW50KTsKKwlrZnJlZShhcmdzKTsKK30KKworc3RhdGlj
IHZvaWQgeGlub190cnlfdHJ1bmMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGF1X2Jy
YW5jaCAqYnIpCit7CisJc3RydWN0IHhpbm9fZG9fdHJ1bmNfYXJncyAqYXJnczsKKwlzdHJ1Y3Qg
YXVfc2JpbmZvICpzYmluZm87CisJc3RydWN0IGZpbGUgKmZpbGUgPSBici0+YnJfeGlubzsKKwlp
bnQgd2txX2VycjsKKworCWF1X3VwZGF0ZV9mdXNlX2hfaW5vZGUoYnItPmJyX21udCwgZmlsZS0+
Zl9kZW50cnkpOyAvKmlnbm9yZSovCisJaWYgKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2Js
b2NrcyA8IGJyLT5icl94aW5vX3VwcGVyKQorCQlyZXR1cm47CisJaWYgKGF0b21pY19pbmNfcmV0
dXJuKCZici0+YnJfeGlub19ydW5uaW5nKSA+IDEpCisJCWdvdG8gb3V0OworCisJLyogbG9jayBh
bmQga2ZyZWUoKSB3aWxsIGJlIGNhbGxlZCBpbiB0cnVuY194aW5vKCkgKi8KKwlhcmdzID0ga21h
bGxvYyhzaXplb2YoKmFyZ3MpLCBHRlBfVEVNUE9SQVJZKTsKKwlpZiAoYXJncykgeworCQlhcmdz
LT5tbnQgPSBhdV9tbnRjYWNoZV9nZXQoc2IpOworCQlhcmdzLT5iciA9IGJyOworCQlhdV9icl9n
ZXQoYnIpOworCQlzYmluZm8gPSBhdV9zYmkoc2IpOworCQlhdV9ud3RfaW5jKCZzYmluZm8tPnNp
X25vd2FpdCk7CisJCXdrcV9lcnIgPSBhdV93a3Ffbm93YWl0KHhpbm9fZG9fdHJ1bmMsIGFyZ3Ms
IHNiLCAvKmRsZ3QqLzApOworCQlpZiAoIXdrcV9lcnIpCisJCQlyZXR1cm47IC8qIHN1Y2Nlc3Mg
Ki8KKworCQlBdUVycigid2txICVkXG4iLCB3a3FfZXJyKTsKKwkJYXVfbnd0X2RlYygmc2JpbmZv
LT5zaV9ub3dhaXQpOworCQltbnRwdXQoYXJncy0+bW50KTsKKwkJYXVfYnJfcHV0KGJyKTsKKwkJ
a2ZyZWUoYXJncyk7CisJfSBlbHNlCisJCUF1RXJyMSgibm8gbWVtb3J5XG4iKTsKKyBvdXQ6CisJ
YXRvbWljX2RlY19yZXR1cm4oJmJyLT5icl94aW5vX3J1bm5pbmcpOworfQorCisvKiAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCisKKyNkZWZpbmUgQXVfTE9GRl9NQVgJKChsb2ZmX3QpTExPTkdfTUFYKQorCitz
dGF0aWMgaW50IGF1X3hpbm9fZG9fd3JpdGUoYXVfd3JpdGVmX3Qgd3JpdGUsIHN0cnVjdCBmaWxl
ICpmaWxlLAorCQkJICAgIGlub190IGhfaW5vLCBzdHJ1Y3QgYXVfeGlub19lbnRyeSAqeGlub2Up
Cit7CisJbG9mZl90IHBvczsKKwlzc2l6ZV90IHN6OworCisJQXVUcmFjZUVudGVyKCk7CisKKwlw
b3MgPSBoX2lubzsKKwlpZiAodW5saWtlbHkoQXVfTE9GRl9NQVggLyBzaXplb2YoKnhpbm9lKSAt
IDEgPCBwb3MpKSB7CisJCUF1SU9FcnIxKCJ0b28gbGFyZ2UgaGklbHVcbiIsIGhfaW5vKTsKKwkJ
cmV0dXJuIC1FRkJJRzsKKwl9CisJcG9zICo9IHNpemVvZigqeGlub2UpOworCXN6ID0geGlub19m
d3JpdGUod3JpdGUsIGZpbGUsIHhpbm9lLCBzaXplb2YoKnhpbm9lKSwgJnBvcyk7CisJaWYgKHN6
ID09IHNpemVvZigqeGlub2UpKQorCQlyZXR1cm4gMDsgLyogc3VjY2VzcyAqLworCisJQXVJT0Vy
cigid3JpdGUgZmFpbGVkICglbGQpXG4iLCAobG9uZylzeik7CisJcmV0dXJuIC1FSU87Cit9CisK
Ky8qCisgKiB3cml0ZSBAaW5vIHRvIHRoZSB4aW5vZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBicmFu
Y2h7QHNiLCBAYmluZGV4fQorICogYXQgdGhlIHBvc2l0aW9uIG9mIEBfaW5vLgorICogd2hlbiBA
aW5vIGlzIHplcm8sIGl0IGlzIHdyaXR0ZW4gdG8gdGhlIHhpbm9maWxlIGFuZCBtZWFucyBubyBl
bnRyeS4KKyAqLworaW50IGF1X3hpbm9fd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYXVm
c19iaW5kZXhfdCBiaW5kZXgsIGlub190IGhfaW5vLAorCQkgIHN0cnVjdCBhdV94aW5vX2VudHJ5
ICp4aW5vZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBmaWxlICpmaWxlOworCXN0cnVjdCBhdV9i
cmFuY2ggKmJyOworCXVuc2lnbmVkIGludCBtbnRfZmxhZ3M7CisKKwlMS1RSVHJhY2UoImIlZCwg
aGklbHUsIGklbHVcbiIsIGJpbmRleCwgaF9pbm8sIHhpbm9lLT5pbm8pOworCUJVSUxEX0JVR19P
TihzaXplb2YobG9uZyBsb25nKSAhPSBzaXplb2YoQXVfTE9GRl9NQVgpCisJCSAgICAgfHwgKChs
b2ZmX3QpIC0gMSkgPiAwKTsKKworCW1udF9mbGFncyA9IGF1X21udGZsYWdzKHNiKTsKKwlpZiAo
dW5saWtlbHkoIWF1X29wdF90ZXN0KG1udF9mbGFncywgWElOTykpKQorCQlyZXR1cm4gMDsKKwor
CWJyID0gYXVfc2JyKHNiLCBiaW5kZXgpOworCWZpbGUgPSBici0+YnJfeGlubzsKKwlBdURlYnVn
T24oIWZpbGUpOworCisJZXJyID0gYXVfeGlub19kb193cml0ZShhdV9zYmkoc2IpLT5zaV94d3Jp
dGUsIGZpbGUsIGhfaW5vLCB4aW5vZSk7CisJaWYgKCFlcnIpIHsKKwkJaWYgKHVubGlrZWx5KGF1
X29wdF90ZXN0KG1udF9mbGFncywgVFJVTkNfWElOTykKKwkJCSAgICAgJiYgYXVfdGVzdF90cnVu
Y194aW5vKGJyLT5icl9tbnQtPm1udF9zYikpKQorCQkJeGlub190cnlfdHJ1bmMoc2IsIGJyKTsK
KwkJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKwl9CisKKwlBdUlPRXJyKCJ3cml0ZSBmYWlsZWQg
KCVkKVxuIiwgZXJyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwor
CitzdGF0aWMgY29uc3QgaW50IHBhZ2VfYml0cyA9IChpbnQpUEFHRV9TSVpFICogQklUU19QRVJf
QllURTsKKy8vc3RhdGljIGNvbnN0IGludCBwYWdlX2JpdHMgPSA0Oworc3RhdGljIGlub190IHhp
Yl9jYWxjX2lubyh1bnNpZ25lZCBsb25nIHBpbmRleCwgaW50IGJpdCkKK3sKKwlpbm9fdCBpbm87
CisJQXVEZWJ1Z09uKGJpdCA8IDAgfHwgcGFnZV9iaXRzIDw9IGJpdCk7CisJaW5vID0gQVVGU19G
SVJTVF9JTk8gKyBwaW5kZXggKiBwYWdlX2JpdHMgKyBiaXQ7CisJcmV0dXJuIGlubzsKK30KKwor
c3RhdGljIHZvaWQgeGliX2NhbGNfYml0KGlub190IGlubywgdW5zaWduZWQgbG9uZyAqcGluZGV4
LCBpbnQgKmJpdCkKK3sKKwlBdURlYnVnT24oaW5vIDwgQVVGU19GSVJTVF9JTk8pOworCWlubyAt
PSBBVUZTX0ZJUlNUX0lOTzsKKwkqcGluZGV4ID0gaW5vIC8gcGFnZV9iaXRzOworCSpiaXQgPSBp
bm8gJSBwYWdlX2JpdHM7Cit9CisKK3N0YXRpYyBpbnQgeGliX3BpbmRleChzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIHBpbmRleCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBh
dV9zYmluZm8gKnNiaW5mbzsKKwlsb2ZmX3QgcG9zOworCXNzaXplX3Qgc3o7CisJc3RydWN0IGZp
bGUgKnhpYjsKKwl1bnNpZ25lZCBsb25nICpwOworCisJTEtUUlRyYWNlKCJwaW5kZXggJWx1XG4i
LCBwaW5kZXgpOworCXNiaW5mbyA9IGF1X3NiaShzYik7CisJTXR4TXVzdExvY2soJnNiaW5mby0+
c2lfeGliX210eCk7CisJQXVEZWJ1Z09uKHBpbmRleCA+IFVMT05HX01BWCAvIFBBR0VfU0laRQor
CQkgIHx8ICFhdV9vcHRfdGVzdChzYmluZm8tPnNpX21udGZsYWdzLCBYSU5PKSk7CisKKwlpZiAo
cGluZGV4ID09IHNiaW5mby0+c2lfeGliX2xhc3RfcGluZGV4KQorCQlyZXR1cm4gMDsKKworCXhp
YiA9IHNiaW5mby0+c2lfeGliOworCXAgPSBzYmluZm8tPnNpX3hpYl9idWY7CisJcG9zID0gc2Jp
bmZvLT5zaV94aWJfbGFzdF9waW5kZXg7CisJcG9zICo9IFBBR0VfU0laRTsKKwlzeiA9IHhpbm9f
ZndyaXRlKHNiaW5mby0+c2lfeHdyaXRlLCB4aWIsIHAsIFBBR0VfU0laRSwgJnBvcyk7CisJaWYg
KHVubGlrZWx5KHN6ICE9IFBBR0VfU0laRSkpCisJCWdvdG8gb3V0OworCisJcG9zID0gcGluZGV4
OworCXBvcyAqPSBQQUdFX1NJWkU7CisJaWYgKGlfc2l6ZV9yZWFkKHhpYi0+Zl9kZW50cnktPmRf
aW5vZGUpID49IHBvcyArIFBBR0VfU0laRSkKKwkJc3ogPSB4aW5vX2ZyZWFkKHNiaW5mby0+c2lf
eHJlYWQsIHhpYiwgcCwgUEFHRV9TSVpFLCAmcG9zKTsKKwllbHNlIHsKKwkJbWVtc2V0KHAsIDAs
IFBBR0VfU0laRSk7CisJCXN6ID0geGlub19md3JpdGUoc2JpbmZvLT5zaV94d3JpdGUsIHhpYiwg
cCwgUEFHRV9TSVpFLCAmcG9zKTsKKwl9CisJaWYgKHN6ID09IFBBR0VfU0laRSkgeworCQlzYmlu
Zm8tPnNpX3hpYl9sYXN0X3BpbmRleCA9IHBpbmRleDsKKwkJcmV0dXJuIDA7IC8qIHN1Y2Nlc3Mg
Ki8KKwl9CisKKyBvdXQ6CisJQXVJT0VycjEoIndyaXRlIGZhaWxlZCAoJWxkKVxuIiwgKGxvbmcp
c3opOworCWVyciA9IHN6OworCWlmIChzeiA+PSAwKQorCQllcnIgPSAtRUlPOworCUF1VHJhY2VF
cnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBh
dV94aW5vX3dyaXRlMChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRleF90IGJpbmRl
eCwgaW5vX3QgaF9pbm8sCisJCSAgIGlub190IGlubykKK3sKKwlpbnQgZXJyLCBiaXQ7CisJdW5z
aWduZWQgbG9uZyBwaW5kZXg7CisJc3RydWN0IGF1X3NiaW5mbyAqc2JpbmZvOworCXN0cnVjdCBh
dV94aW5vX2VudHJ5IHhpbm9lID0geworCQkuaW5vCT0gMAorCX07CisKKwlMS1RSVHJhY2UoImIl
ZCwgaGklbHUsIGklbHVcbiIsIGJpbmRleCwgaF9pbm8sIGlubyk7CisKKwlzYmluZm8gPSBhdV9z
Ymkoc2IpOworCWlmICh1bmxpa2VseSghYXVfb3B0X3Rlc3QoYXVfbW50ZmxhZ3Moc2IpLCBYSU5P
KSkpCisJCXJldHVybiAwOworCisJZXJyID0gMDsKKwlpZiAodW5saWtlbHkoaW5vKSkgeworCQlB
dURlYnVnT24oaW5vIDwgQVVGU19GSVJTVF9JTk8pOworCQl4aWJfY2FsY19iaXQoaW5vLCAmcGlu
ZGV4LCAmYml0KTsKKwkJQXVEZWJ1Z09uKHBhZ2VfYml0cyA8PSBiaXQpOworCQltdXRleF9sb2Nr
KCZzYmluZm8tPnNpX3hpYl9tdHgpOworCQllcnIgPSB4aWJfcGluZGV4KHNiLCBwaW5kZXgpOwor
CQlpZiAoIWVycikgeworCQkJY2xlYXJfYml0KGJpdCwgc2JpbmZvLT5zaV94aWJfYnVmKTsKKwkJ
CXNiaW5mby0+c2lfeGliX25leHRfYml0ID0gYml0OworCQl9CisJCW11dGV4X3VubG9jaygmc2Jp
bmZvLT5zaV94aWJfbXR4KTsKKwl9CisKKwlpZiAoIWVycikKKwkJZXJyID0gYXVfeGlub193cml0
ZShzYiwgYmluZGV4LCBoX2lubywgJnhpbm9lKTsKKwlyZXR1cm4gZXJyOworfQorCitpbm9fdCBh
dV94aW5vX25ld19pbm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbm9fdCBpbm87CisJ
c3RydWN0IGF1X3NiaW5mbyAqc2JpbmZvOworCWludCBmcmVlX2JpdCwgZXJyOworCXVuc2lnbmVk
IGxvbmcgKnAsIHBpbmRleCwgdWwsIHBlbmQ7CisJc3RydWN0IGZpbGUgKmZpbGU7CisKKwkvL2F1
X2RlYnVnX29uKCk7CisJQXVUcmFjZUVudGVyKCk7CisKKwlzYmluZm8gPSBhdV9zYmkoc2IpOwor
CWlmICh1bmxpa2VseSghYXVfb3B0X3Rlc3QoYXVfbW50ZmxhZ3Moc2IpLCBYSU5PKSkpCisJCXJl
dHVybiBpdW5pcXVlKHNiLCBBVUZTX0ZJUlNUX0lOTyk7CisKKwltdXRleF9sb2NrKCZzYmluZm8t
PnNpX3hpYl9tdHgpOworCXAgPSBzYmluZm8tPnNpX3hpYl9idWY7CisJZnJlZV9iaXQgPSBzYmlu
Zm8tPnNpX3hpYl9uZXh0X2JpdDsKKwkvL0F1RGJnKCJiaXQgJWQsIHBpbmRleCAlZFxuIiwgZnJl
ZV9iaXQsIHNiaW5mby0+c2lfeGliX2xhc3RfcGluZGV4KTsKKwkvL0F1RGJnKCJiaXQgJWQsICVk
XG4iLCBmcmVlX2JpdCwgdGVzdF9iaXQoZnJlZV9iaXQsIHApKTsKKwlpZiAoZnJlZV9iaXQgPCBw
YWdlX2JpdHMgJiYgIXRlc3RfYml0KGZyZWVfYml0LCBwKSkKKwkJZ290byBvdXQ7IC8qIHN1Y2Nl
c3MgKi8KKwlmcmVlX2JpdCA9IGZpbmRfZmlyc3RfemVyb19iaXQocCwgcGFnZV9iaXRzKTsKKwlp
ZiAoZnJlZV9iaXQgPCBwYWdlX2JpdHMpCisJCWdvdG8gb3V0OyAvKiBzdWNjZXNzICovCisKKwlw
aW5kZXggPSBzYmluZm8tPnNpX3hpYl9sYXN0X3BpbmRleDsKKwlmb3IgKHVsID0gcGluZGV4IC0g
MTsgdWwgPCBVTE9OR19NQVg7IHVsLS0pIHsKKwkJZXJyID0geGliX3BpbmRleChzYiwgdWwpOwor
CQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCWdvdG8gb3V0X2VycjsKKwkJZnJlZV9iaXQgPSBmaW5k
X2ZpcnN0X3plcm9fYml0KHAsIHBhZ2VfYml0cyk7CisJCWlmIChmcmVlX2JpdCA8IHBhZ2VfYml0
cykKKwkJCWdvdG8gb3V0OyAvKiBzdWNjZXNzICovCisJfQorCisJZmlsZSA9IHNiaW5mby0+c2lf
eGliOworCXBlbmQgPSBpX3NpemVfcmVhZChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgLyBQQUdF
X1NJWkU7CisJZm9yICh1bCA9IHBpbmRleCArIDE7IHVsIDw9IHBlbmQ7IHVsKyspIHsKKwkJZXJy
ID0geGliX3BpbmRleChzYiwgdWwpOworCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCWdvdG8gb3V0
X2VycjsKKwkJZnJlZV9iaXQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KHAsIHBhZ2VfYml0cyk7CisJ
CWlmIChmcmVlX2JpdCA8IHBhZ2VfYml0cykKKwkJCWdvdG8gb3V0OyAvKiBzdWNjZXNzICovCisJ
fQorCUJVRygpOworCisgb3V0OgorCXNldF9iaXQoZnJlZV9iaXQsIHApOworCXNiaW5mby0+c2lf
eGliX25leHRfYml0Kys7CisJcGluZGV4ID0gc2JpbmZvLT5zaV94aWJfbGFzdF9waW5kZXg7CisJ
bXV0ZXhfdW5sb2NrKCZzYmluZm8tPnNpX3hpYl9tdHgpOworCWlubyA9IHhpYl9jYWxjX2lubyhw
aW5kZXgsIGZyZWVfYml0KTsKKwkvL0F1RGJnKCJpJWx1XG4iLCBpbm8pOworCUxLVFJUcmFjZSgi
aSVsdVxuIiwgaW5vKTsKKwkvL2F1X2RlYnVnX29mZigpOworCXJldHVybiBpbm87Cisgb3V0X2Vy
cjoKKwltdXRleF91bmxvY2soJnNiaW5mby0+c2lfeGliX210eCk7CisJTEtUUlRyYWNlKCJpMFxu
Iik7CisJLy9hdV9kZWJ1Z19vZmYoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJlYWQgQGlu
byBmcm9tIHhpbm9maWxlIGZvciB0aGUgc3BlY2lmaWVkIGJyYW5jaHtAc2IsIEBiaW5kZXh9Cisg
KiBhdCB0aGUgcG9zaXRpb24gb2YgQGhfaW5vLgorICogaWYgQGlubyBkb2VzIG5vdCBleGlzdCBh
bmQgQGRvX25ldyBpcyB0cnVlLCBnZXQgbmV3IG9uZS4KKyAqLworaW50IGF1X3hpbm9fcmVhZChz
dHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBhdWZzX2JpbmRleF90IGJpbmRleCwgaW5vX3QgaF9pbm8s
CisJCSBzdHJ1Y3QgYXVfeGlub19lbnRyeSAqeGlub2UpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qg
ZmlsZSAqZmlsZTsKKwlsb2ZmX3QgcG9zOworCXNzaXplX3Qgc3o7CisJc3RydWN0IGF1X3NiaW5m
byAqc2JpbmZvOworCisJTEtUUlRyYWNlKCJiJWQsIGhpJWx1XG4iLCBiaW5kZXgsIGhfaW5vKTsK
KworCWVyciA9IDA7CisJeGlub2UtPmlubyA9IDA7CisJc2JpbmZvID0gYXVfc2JpKHNiKTsKKwlp
ZiAodW5saWtlbHkoIWF1X29wdF90ZXN0KGF1X21udGZsYWdzKHNiKSwgWElOTykpKQorCQlyZXR1
cm4gMDsgLyogbm8gaW5vICovCisKKwlwb3MgPSBoX2lubzsKKwlpZiAodW5saWtlbHkoQXVfTE9G
Rl9NQVggLyBzaXplb2YoKnhpbm9lKSAtIDEgPCBwb3MpKSB7CisJCUF1SU9FcnIxKCJ0b28gbGFy
Z2UgaGklbHVcbiIsIGhfaW5vKTsKKwkJcmV0dXJuIC1FRkJJRzsKKwl9CisJcG9zICo9IHNpemVv
ZigqeGlub2UpOworCisJZmlsZSA9IGF1X3NicihzYiwgYmluZGV4KS0+YnJfeGlubzsKKwlBdURl
YnVnT24oIWZpbGUpOworCWlmIChpX3NpemVfcmVhZChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkg
PCBwb3MgKyBzaXplb2YoKnhpbm9lKSkKKwkJcmV0dXJuIDA7IC8qIG5vIGlubyAqLworCisJc3og
PSB4aW5vX2ZyZWFkKHNiaW5mby0+c2lfeHJlYWQsIGZpbGUsIHhpbm9lLCBzaXplb2YoKnhpbm9l
KSwgJnBvcyk7CisJaWYgKHN6ID09IHNpemVvZigqeGlub2UpKQorCQlyZXR1cm4gMDsgLyogc3Vj
Y2VzcyAqLworCisJZXJyID0gc3o7CisJaWYgKHVubGlrZWx5KHN6ID49IDApKSB7CisJCWVyciA9
IC1FSU87CisJCUF1SU9FcnIoInhpbm8gcmVhZCBlcnJvciAoJWxkKVxuIiwgKGxvbmcpc3opOwor
CX0KKworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tICovCisKK3N0cnVjdCBmaWxlICphdV94aW5vX2NyZWF0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sg
KnNiLCBjaGFyICpmbmFtZSwgaW50IHNpbGVudCwKKwkJCSAgICBzdHJ1Y3QgZGVudHJ5ICpwYXJl
bnQpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGVycjsKKwlzdHJ1Y3QgZGVudHJ5ICpo
X3BhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmhfZGlyOworCXN0cnVjdCB2ZnN1Yl9hcmdzIHZhcmdz
OworCS8vY29uc3QgaW50IGhpbm90aWZ5ID0gYXVfb3B0X3Rlc3QoYXVfbW50ZmxhZ3Moc2IpLCBV
REJBX0lOT1RJRlkpOworCisJTEtUUlRyYWNlKCIlc1xuIiwgZm5hbWUpOworCS8vQXVEZWJ1Z09u
KCFhdV9vcHRfdGVzdChhdV9tbnRmbGFncyhzYiksIFhJTk8pKTsKKworCS8qIExTTSBtYXkgZGV0
ZWN0IGl0ICovCisJZmlsZSA9IHZmc3ViX2ZpbHBfb3BlbihmbmFtZSwgT19SRFdSIHwgT19DUkVB
VCB8IE9fRVhDTCB8IE9fTEFSR0VGSUxFLAorCQkJICAgICAgIFNfSVJVR08gfCBTX0lXVUdPKTsK
KwkvL2ZpbGUgPSBFUlJfUFRSKC0xKTsKKwlpZiAoSVNfRVJSKGZpbGUpKSB7CisJCWlmICghc2ls
ZW50KQorCQkJQXVFcnIoIm9wZW4gJXMoJWxkKVxuIiwgZm5hbWUsIFBUUl9FUlIoZmlsZSkpOwor
CQlyZXR1cm4gZmlsZTsKKwl9CisKKwkvKiBrZWVwIGZpbGUgY291bnQgKi8KKwloX3BhcmVudCA9
IGRnZXRfcGFyZW50KGZpbGUtPmZfZGVudHJ5KTsKKwloX2RpciA9IGhfcGFyZW50LT5kX2lub2Rl
OworCXZmc3ViX2FyZ3NfaW5pdCgmdmFyZ3MsIE5VTEwsIDAsIDApOworCW11dGV4X2xvY2tfbmVz
dGVkKCZoX2Rpci0+aV9tdXRleCwgQXVMc2NfSV9QQVJFTlQpOworCWVyciA9IHZmc3ViX3VubGlu
ayhoX2RpciwgZmlsZS0+Zl9kZW50cnksICZ2YXJncyk7CisJbXV0ZXhfdW5sb2NrKCZoX2Rpci0+
aV9tdXRleCk7CisJZHB1dChoX3BhcmVudCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJaWYg
KCFzaWxlbnQpCisJCQlBdUVycigidW5saW5rICVzKCVkKVxuIiwgZm5hbWUsIGVycik7CisJCWdv
dG8gb3V0OworCX0KKworCWlmIChzYiAhPSBmaWxlLT5mX2RlbnRyeS0+ZF9zYikKKwkJcmV0dXJu
IGZpbGU7IC8qIHN1Y2Nlc3MgKi8KKworCWlmICghc2lsZW50KQorCQlBdUVycigiJXMgbXVzdCBi
ZSBvdXRzaWRlXG4iLCBmbmFtZSk7CisJZXJyID0gLUVJTlZBTDsKKworIG91dDoKKwlmcHV0KGZp
bGUpOworCWZpbGUgPSBFUlJfUFRSKGVycik7CisJcmV0dXJuIGZpbGU7Cit9CisKKy8qCisgKiBm
aW5kIGFub3RoZXIgYnJhbmNoIHdobyBpcyBvbiB0aGUgc2FtZSBmaWxlc3lzdGVtIG9mIHRoZSBz
cGVjaWZpZWQKKyAqIGJyYW5jaHtAYnRndH0uIHNlYXJjaCB1bnRpbCBAYmVuZC4KKyAqLworc3Rh
dGljIGludCBpc19zYl9zaGFyZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYXVmc19iaW5kZXhf
dCBidGd0LAorCQkJYXVmc19iaW5kZXhfdCBiZW5kKQoreworCWF1ZnNfYmluZGV4X3QgYmluZGV4
OworCXN0cnVjdCBzdXBlcl9ibG9jayAqdGd0X3NiID0gYXVfc2JyX3NiKHNiLCBidGd0KTsKKwor
CWZvciAoYmluZGV4ID0gMDsgYmluZGV4IDw9IGJlbmQ7IGJpbmRleCsrKQorCQlpZiAodW5saWtl
bHkoYnRndCAhPSBiaW5kZXggJiYgdGd0X3NiID09IGF1X3Nicl9zYihzYiwgYmluZGV4KSkpCisJ
CQlyZXR1cm4gYmluZGV4OworCXJldHVybiAtMTsKK30KKworLyoKKyAqIGNyZWF0ZSBhIG5ldyB4
aW5vZmlsZSBhdCB0aGUgc2FtZSBwbGFjZS9wYXRoIGFzIEBiYXNlX2ZpbGUuCisgKi8KK3N0YXRp
Yworc3RydWN0IGZpbGUgKmF1X3hpbm9fY3JlYXRlMihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBz
dHJ1Y3QgZmlsZSAqYmFzZV9maWxlLAorCQkJICAgICBzdHJ1Y3QgZmlsZSAqY29weV9zcmMpCit7
CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGVycjsKKwlzdHJ1Y3QgZGVudHJ5ICpiYXNlLCAq
ZGVudHJ5LCAqcGFyZW50OworCXN0cnVjdCBpbm9kZSAqZGlyLCAqaW5vZGU7CisJc3RydWN0IHFz
dHIgKm5hbWU7CisJc3RydWN0IHZmc3ViX2FyZ3MgdmFyZ3M7CisJc3RydWN0IGF1X25keCBuZHgg
PSB7CisJCS5uZnNtbnQJPSBOVUxMLAorCQkuZmxhZ3MJPSAwLAorCQkubmQJPSBOVUxMLAorCQkv
Ly5icgk9IE5VTEwKKwl9OworCisJYmFzZSA9IGJhc2VfZmlsZS0+Zl9kZW50cnk7CisJTEtUUlRy
YWNlKCIlLipzXG4iLCBBdURMTlBhaXIoYmFzZSkpOworCXBhcmVudCA9IGJhc2UtPmRfcGFyZW50
OyAvKiBkaXIgaW5vZGUgaXMgbG9ja2VkICovCisJZGlyID0gcGFyZW50LT5kX2lub2RlOworCUlN
dXN0TG9jayhkaXIpOworCisJZmlsZSA9IEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKHVubGlrZWx5
KGF1X3Rlc3RfbmZzKHBhcmVudC0+ZF9zYikpKQorCQlnb3RvIG91dDsKKworCS8qIGRvIG5vdCBz
dXBlcmlvLCBub3IgTkZTLiAqLworCW5hbWUgPSAmYmFzZS0+ZF9uYW1lOworCWRlbnRyeSA9IGF1
X2xrdXBfb25lKG5hbWUtPm5hbWUsIHBhcmVudCwgbmFtZS0+bGVuLCAmbmR4KTsKKwkvL2lmIChM
a3RyQ29uZCkge2RwdXQoZGVudHJ5KTsgZGVudHJ5ID0gRVJSX1BUUigtMSk7fQorCWlmIChJU19F
UlIoZGVudHJ5KSkgeworCQlmaWxlID0gKHZvaWQgKilkZW50cnk7CisJCUF1RXJyKCIlLipzIGxv
b2t1cCBlcnIgJWxkXG4iLCBBdUxOUGFpcihuYW1lKSwgUFRSX0VSUihkZW50cnkpKTsKKwkJZ290
byBvdXQ7CisJfQorCWVyciA9IHZmc3ViX2NyZWF0ZShkaXIsIGRlbnRyeSwgU19JUlVHTyB8IFNf
SVdVR08sIE5VTEwsIC8qZGxndCovMCk7CisJLy9pZiAoTGt0ckNvbmQpIHt2ZnNfdW5saW5rKGRp
ciwgZGVudHJ5KTsgZXJyID0gLTE7fQorCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWZpbGUgPSBF
UlJfUFRSKGVycik7CisJCUF1RXJyKCIlLipzIGNyZWF0ZSBlcnIgJWRcbiIsIEF1TE5QYWlyKG5h
bWUpLCBlcnIpOworCQlnb3RvIG91dF9kcHV0OworCX0KKwlmaWxlID0gZGVudHJ5X29wZW4oZGdl
dChkZW50cnkpLCBtbnRnZXQoYmFzZV9maWxlLT5mX3Zmc21udCksCisJCQkgICBPX1JEV1IgfCBP
X0NSRUFUIHwgT19FWENMIHwgT19MQVJHRUZJTEUpOworCS8vaWYgKExrdHJDb25kKSB7ZnB1dChm
aWxlKTsgZmlsZSA9IEVSUl9QVFIoLTEpO30KKwlpZiAoSVNfRVJSKGZpbGUpKSB7CisJCUF1RXJy
KCIlLipzIG9wZW4gZXJyICVsZFxuIiwgQXVMTlBhaXIobmFtZSksIFBUUl9FUlIoZmlsZSkpOwor
CQlnb3RvIG91dF9kcHV0OworCX0KKwl2ZnN1Yl9hcmdzX2luaXQoJnZhcmdzLCBOVUxMLCAwLCAw
KTsKKwllcnIgPSB2ZnN1Yl91bmxpbmsoZGlyLCBkZW50cnksICZ2YXJncyk7CisJLy9pZiAoTGt0
ckNvbmQpIGVyciA9IC0xOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCUF1RXJyKCIlLipzIHVu
bGluayBlcnIgJWRcbiIsIEF1TE5QYWlyKG5hbWUpLCBlcnIpOworCQlnb3RvIG91dF9mcHV0Owor
CX0KKworCWlmIChjb3B5X3NyYykgeworCQlpbm9kZSA9IGNvcHlfc3JjLT5mX2RlbnRyeS0+ZF9p
bm9kZTsKKwkJZXJyID0gYXVfY29weV9maWxlKGZpbGUsIGNvcHlfc3JjLCBpX3NpemVfcmVhZChp
bm9kZSksIHNiKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCUF1RXJyKCIlLipzIGNvcHkg
ZXJyICVkXG4iLCBBdUxOUGFpcihuYW1lKSwgZXJyKTsKKwkJCWdvdG8gb3V0X2ZwdXQ7CisJCX0K
Kwl9CisJZ290byBvdXRfZHB1dDsgLyogc3VjY2VzcyAqLworCisgb3V0X2ZwdXQ6CisJZnB1dChm
aWxlKTsKKwlmaWxlID0gRVJSX1BUUihlcnIpOworIG91dF9kcHV0OgorCWRwdXQoZGVudHJ5KTsK
KyBvdXQ6CisJQXVUcmFjZUVyclB0cihmaWxlKTsKKwlyZXR1cm4gZmlsZTsKK30KKworLyogLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSAqLworCisvKgorICogaW5pdGlhbGl6ZSB0aGUgeGlub2ZpbGUgZm9yIHRoZSBz
cGVjaWZpZWQgYnJhbmNoe0BzYiwgQGJpbmRleH0KKyAqIGF0IHRoZSBwbGFjZS9wYXRoIHdoZXJl
IEBiYXNlX2ZpbGUgaW5kaWNhdGVzLgorICogdGVzdCB3aGV0aGVyIGFub3RoZXIgYnJhbmNoIGlz
IG9uIHRoZSBzYW1lIGZpbGVzeXN0ZW0gb3Igbm90LAorICogaWYgQGRvX3Rlc3QgaXMgdHJ1ZS4K
KyAqLworaW50IGF1X3hpbm9fYnIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGF1X2Jy
YW5jaCAqYnIsIGlub190IGhfaW5vLAorCSAgICAgICBzdHJ1Y3QgZmlsZSAqYmFzZV9maWxlLCBp
bnQgZG9fdGVzdCkKK3sKKwlpbnQgZXJyLCBkb19jcmVhdGU7CisJc3RydWN0IGF1X2JyYW5jaCAq
c2hhcmVkX2JyOworCWF1ZnNfYmluZGV4X3QgYnNoYXJlZCwgYmVuZDsKKwlzdHJ1Y3QgaW5vZGUg
KmRpcjsKKwlzdHJ1Y3QgYXVfeGlub19lbnRyeSB4aW5vZTsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJl
bnQ7CisJc3RydWN0IGZpbGUgKmZpbGU7CisKKwlMS1RSVHJhY2UoImJhc2VfZmlsZSAlcCwgZG9f
dGVzdCAlZFxuIiwgYmFzZV9maWxlLCBkb190ZXN0KTsKKwlTaU11c3RXcml0ZUxvY2soc2IpOwor
CUF1RGVidWdPbighYXVfb3B0X3Rlc3QoYXVfbW50ZmxhZ3Moc2IpLCBYSU5PKSk7CisJQXVEZWJ1
Z09uKGJyLT5icl94aW5vKTsKKworCWRvX2NyZWF0ZSA9IDE7CisJYnNoYXJlZCA9IC0xOworCXNo
YXJlZF9iciA9IE5VTEw7CisJYmVuZCA9IGF1X3NiZW5kKHNiKTsKKwlpZiAoZG9fdGVzdCkgewor
CQlhdWZzX2JpbmRleF90IGJpbmRleDsKKworCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnRndF9zYiA9
IGJyLT5icl9tbnQtPm1udF9zYjsKKwkJZm9yIChiaW5kZXggPSAwOyBiaW5kZXggPD0gYmVuZDsg
YmluZGV4KyspCisJCQlpZiAodW5saWtlbHkodGd0X3NiID09IGF1X3Nicl9zYihzYiwgYmluZGV4
KSkpIHsKKwkJCQlic2hhcmVkID0gYmluZGV4OworCQkJCWJyZWFrOworCQkJfQorCX0KKwlpZiAo
dW5saWtlbHkoYnNoYXJlZCA+PSAwKSkgeworCQlzaGFyZWRfYnIgPSBhdV9zYnIoc2IsIGJzaGFy
ZWQpOworCQlkb19jcmVhdGUgPSAhc2hhcmVkX2JyLT5icl94aW5vOworCX0KKworCWlmIChkb19j
cmVhdGUpIHsKKwkJcGFyZW50ID0gZGdldF9wYXJlbnQoYmFzZV9maWxlLT5mX2RlbnRyeSk7CisJ
CWRpciA9IHBhcmVudC0+ZF9pbm9kZTsKKworCQltdXRleF9sb2NrX25lc3RlZCgmZGlyLT5pX211
dGV4LCBBdUxzY19JX1BBUkVOVCk7CisJCWZpbGUgPSBhdV94aW5vX2NyZWF0ZTIoc2IsIGJhc2Vf
ZmlsZSwgTlVMTCk7CisJCWVyciA9IFBUUl9FUlIoZmlsZSk7CisJCW11dGV4X3VubG9jaygmZGly
LT5pX211dGV4KTsKKwkJZHB1dChwYXJlbnQpOworCQlpZiAoSVNfRVJSKGZpbGUpKQorCQkJZ290
byBvdXQ7CisJCWJyLT5icl94aW5vID0gZmlsZTsKKwl9IGVsc2UgeworCQlici0+YnJfeGlubyA9
IHNoYXJlZF9ici0+YnJfeGlubzsKKwkJZ2V0X2ZpbGUoYnItPmJyX3hpbm8pOworCX0KKworCXhp
bm9lLmlubyA9IEFVRlNfUk9PVF9JTk87CisJLy94aW5vZS5oX2dlbiA9IGhfaW5vZGUtPmlfZ2Vu
ZXJhdGlvbjsKKwkvL1dBUk5fT04oeGlub2UuaF9nZW4gPT0gQXVYaW5vX0lOVkFMSURfSEdFTik7
CisJZXJyID0gYXVfeGlub19kb193cml0ZShhdV9zYmkoc2IpLT5zaV94d3JpdGUsIGJyLT5icl94
aW5vLCBoX2lubywKKwkJCSAgICAgICAmeGlub2UpOworCS8vaWYgKExrdHJDb25kKSBlcnIgPSAt
MTsKKwlpZiAoIWVycikKKwkJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKworCS8vZnB1dChici0+
YnJfeGlubyk7CisJLy9ici0+YnJfeGlubyA9IE5VTEw7CisKKyBvdXQ6CisJQXVUcmFjZUVycihl
cnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIHRvbyBzbG93ICovCitzdGF0aWMgaW50IGRvX3hp
Yl9yZXN0b3JlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmaWxlICpmaWxlLCB2b2lk
ICpwYWdlKQoreworCWludCBlcnIsIGJpdDsKKwlzdHJ1Y3QgYXVfc2JpbmZvICpzYmluZm87CisJ
YXVfcmVhZGZfdCBmdW5jOworCWxvZmZfdCBwb3MsIHBlbmQ7CisJc3NpemVfdCBzejsKKwlzdHJ1
Y3QgYXVfeGlub19lbnRyeSAqeGlub2U7CisJdW5zaWduZWQgbG9uZyBwaW5kZXg7CisKKwlBdVRy
YWNlRW50ZXIoKTsKKwlTaU11c3RXcml0ZUxvY2soc2IpOworCisJZXJyID0gMDsKKwlzYmluZm8g
PSBhdV9zYmkoc2IpOworCWZ1bmMgPSBzYmluZm8tPnNpX3hyZWFkOworCXBlbmQgPSBpX3NpemVf
cmVhZChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisjaWZkZWYgQ09ORklHX0FVRlNfREVCVUcK
KwlpZiAodW5saWtlbHkocGVuZCA+ICgxIDw8IDIyKSkpCisJCUF1V2FybigidGVzdGluZyBhIGxh
cmdlIHhpbm8gZmlsZSAlTGRcbiIsIChsb25nIGxvbmcpcGVuZCk7CisjZW5kaWYKKwlwb3MgPSAw
OworCXdoaWxlIChwb3MgPCBwZW5kKSB7CisJCXN6ID0geGlub19mcmVhZChmdW5jLCBmaWxlLCBw
YWdlLCBQQUdFX1NJWkUsICZwb3MpOworCQllcnIgPSBzejsKKwkJaWYgKHVubGlrZWx5KHN6IDw9
IDApKQorCQkJZ290byBvdXQ7CisKKwkJZXJyID0gMDsKKwkJZm9yICh4aW5vZSA9IHBhZ2U7IHN6
ID4gMDsgeGlub2UrKywgc3ogLT0gc2l6ZW9mKHhpbm9lKSkgeworCQkJLy9BdURiZygiaSVsdVxu
IiwgeGlub2UtPmlubyk7CisJCQlpZiAodW5saWtlbHkoeGlub2UtPmlubyA8IEFVRlNfRklSU1Rf
SU5PKSkKKwkJCQljb250aW51ZTsKKworCQkJeGliX2NhbGNfYml0KHhpbm9lLT5pbm8sICZwaW5k
ZXgsICZiaXQpOworCQkJQXVEZWJ1Z09uKHBhZ2VfYml0cyA8PSBiaXQpOworCQkJZXJyID0geGli
X3BpbmRleChzYiwgcGluZGV4KTsKKwkJCWlmICghZXJyKQorCQkJCXNldF9iaXQoYml0LCBzYmlu
Zm8tPnNpX3hpYl9idWYpOworCQkJZWxzZQorCQkJCWdvdG8gb3V0OworCQkJLy9BdURiZygiaSVs
dSwgYml0ICVkXG4iLCB4aW5vZS0+aW5vLCBiaXQpOworCQl9CisJfQorCisgb3V0OgorCUF1VHJh
Y2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHhpYl9yZXN0b3JlKHN0
cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IGVycjsKKwlhdWZzX2JpbmRleF90IGJpbmRl
eCwgYmVuZDsKKwl2b2lkICpwYWdlOworCisJLy9hdV9kZWJ1Z19vbigpOworCUF1VHJhY2VFbnRl
cigpOworCisJZXJyID0gLUVOT01FTTsKKwlwYWdlID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2Uo
R0ZQX1RFTVBPUkFSWSk7CisJaWYgKHVubGlrZWx5KCFwYWdlKSkKKwkJZ290byBvdXQ7CisKKwll
cnIgPSAwOworCWJlbmQgPSBhdV9zYmVuZChzYik7CisJZm9yIChiaW5kZXggPSAwOyAhZXJyICYm
IGJpbmRleCA8PSBiZW5kOyBiaW5kZXgrKykKKwkJaWYgKCFiaW5kZXggfHwgaXNfc2Jfc2hhcmVk
KHNiLCBiaW5kZXgsIGJpbmRleCAtIDEpIDwgMCkKKwkJCWVyciA9IGRvX3hpYl9yZXN0b3JlCisJ
CQkJKHNiLCBhdV9zYnIoc2IsIGJpbmRleCktPmJyX3hpbm8sIHBhZ2UpOworCQllbHNlCisJCQlM
S1RSVHJhY2UoImIlZFxuIiwgYmluZGV4KTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFn
ZSk7CisKKyBvdXQ6CisJQXVUcmFjZUVycihlcnIpOworCS8vYXVfZGVidWdfb2ZmKCk7CisJcmV0
dXJuIGVycjsKK30KKworaW50IGF1X3hpYl90cnVuYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQor
eworCWludCBlcnI7CisJc3RydWN0IGF1X3NiaW5mbyAqc2JpbmZvOworCXVuc2lnbmVkIGxvbmcg
KnA7CisJLy9pbm9fdCBpbm87CisJbG9mZl90IHBvczsKKwlzc2l6ZV90IHN6OworCXN0cnVjdCBk
ZW50cnkgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmRpcjsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsK
Kwl1bnNpZ25lZCBpbnQgbW50X2ZsYWdzOworCisJQXVUcmFjZUVudGVyKCk7CisJU2lNdXN0V3Jp
dGVMb2NrKHNiKTsKKworCW1udF9mbGFncyA9IGF1X21udGZsYWdzKHNiKTsKKwlpZiAodW5saWtl
bHkoIWF1X29wdF90ZXN0KG1udF9mbGFncywgWElOTykpKQorCQlyZXR1cm4gMDsKKworCS8vYXVm
c19kZWJ1Z19vbigpOworCXNiaW5mbyA9IGF1X3NiaShzYik7CisJcGFyZW50ID0gZGdldF9wYXJl
bnQoc2JpbmZvLT5zaV94aWItPmZfZGVudHJ5KTsKKwlkaXIgPSBwYXJlbnQtPmRfaW5vZGU7CisJ
bXV0ZXhfbG9ja19uZXN0ZWQoJmRpci0+aV9tdXRleCwgQXVMc2NfSV9QQVJFTlQpOworCWZpbGUg
PSBhdV94aW5vX2NyZWF0ZTIoc2IsIHNiaW5mby0+c2lfeGliLCBOVUxMKTsKKwltdXRleF91bmxv
Y2soJmRpci0+aV9tdXRleCk7CisJZHB1dChwYXJlbnQpOworCWVyciA9IFBUUl9FUlIoZmlsZSk7
CisJaWYgKElTX0VSUihmaWxlKSkKKwkJZ290byBvdXQ7CisJZnB1dChzYmluZm8tPnNpX3hpYik7
CisJc2JpbmZvLT5zaV94aWIgPSBmaWxlOworCisJcCA9IHNiaW5mby0+c2lfeGliX2J1ZjsKKwlt
ZW1zZXQocCwgMCwgUEFHRV9TSVpFKTsKKwlwb3MgPSAwOworCXN6ID0geGlub19md3JpdGUoc2Jp
bmZvLT5zaV94d3JpdGUsIHNiaW5mby0+c2lfeGliLCBwLCBQQUdFX1NJWkUsICZwb3MpOworCWlm
ICh1bmxpa2VseShzeiAhPSBQQUdFX1NJWkUpKSB7CisJCWVyciA9IHN6OworCQlBdUlPRXJyKCJl
cnIgJWRcbiIsIGVycik7CisJCWlmIChzeiA+PSAwKQorCQkJZXJyID0gLUVJTzsKKwkJZ290byBv
dXQ7CisJfQorCisJaWYgKGF1X29wdF90ZXN0KG1udF9mbGFncywgWElOTykpIHsKKwkJbXV0ZXhf
bG9jaygmc2JpbmZvLT5zaV94aWJfbXR4KTsKKwkJZXJyID0geGliX3Jlc3RvcmUoc2IpOworCQlt
dXRleF91bmxvY2soJnNiaW5mby0+c2lfeGliX210eCk7CisJfQorCitvdXQ6CisJLy9hdWZzX2Rl
YnVnX29mZigpOworCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tICovCisKKy8qCisgKiB4aW5vIG1vdW50IG9wdGlvbiBoYW5kbGVycworICovCitz
dGF0aWMgYXVfcmVhZGZfdCBmaW5kX3JlYWRmKHN0cnVjdCBmaWxlICpoX2ZpbGUpCit7CisJY29u
c3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wID0gaF9maWxlLT5mX29wOworCisJaWYgKGZv
cCkgeworCQlpZiAoZm9wLT5yZWFkKQorCQkJcmV0dXJuIGZvcC0+cmVhZDsKKwkJaWYgKGZvcC0+
YWlvX3JlYWQpCisJCQlyZXR1cm4gZG9fc3luY19yZWFkOworCX0KKwlyZXR1cm4gRVJSX1BUUigt
RU5PU1lTKTsKK30KKworc3RhdGljIGF1X3dyaXRlZl90IGZpbmRfd3JpdGVmKHN0cnVjdCBmaWxl
ICpoX2ZpbGUpCit7CisJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wID0gaF9maWxl
LT5mX29wOworCisJaWYgKGZvcCkgeworCQlpZiAoZm9wLT53cml0ZSkKKwkJCXJldHVybiBmb3At
PndyaXRlOworCQlpZiAoZm9wLT5haW9fd3JpdGUpCisJCQlyZXR1cm4gZG9fc3luY193cml0ZTsK
Kwl9CisJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7Cit9CisKKy8qIHhpbm8gYml0bWFwICovCitz
dGF0aWMgdm9pZCB4aW5vX2NsZWFyX3hpYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0
cnVjdCBhdV9zYmluZm8gKnNiaW5mbzsKKworCUF1VHJhY2VFbnRlcigpOworCVNpTXVzdFdyaXRl
TG9jayhzYik7CisKKwlzYmluZm8gPSBhdV9zYmkoc2IpOworCXNiaW5mby0+c2lfeHJlYWQgPSBO
VUxMOworCXNiaW5mby0+c2lfeHdyaXRlID0gTlVMTDsKKwlpZiAoc2JpbmZvLT5zaV94aWIpCisJ
CWZwdXQoc2JpbmZvLT5zaV94aWIpOworCXNiaW5mby0+c2lfeGliID0gTlVMTDsKKwlmcmVlX3Bh
Z2UoKHVuc2lnbmVkIGxvbmcpc2JpbmZvLT5zaV94aWJfYnVmKTsKKwlzYmluZm8tPnNpX3hpYl9i
dWYgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGF1X3hpbm9fc2V0X3hpYihzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiLCBzdHJ1Y3QgZmlsZSAqYmFzZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBhdV9z
YmluZm8gKnNiaW5mbzsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlsb2ZmX3QgcG9zOworCisJTEtU
UlRyYWNlKCIlLipzXG4iLCBBdURMTlBhaXIoYmFzZS0+Zl9kZW50cnkpKTsKKwlTaU11c3RXcml0
ZUxvY2soc2IpOworCisJc2JpbmZvID0gYXVfc2JpKHNiKTsKKwlmaWxlID0gYXVfeGlub19jcmVh
dGUyKHNiLCBiYXNlLCBzYmluZm8tPnNpX3hpYik7CisJZXJyID0gUFRSX0VSUihmaWxlKTsKKwlp
ZiAoSVNfRVJSKGZpbGUpKQorCQlnb3RvIG91dDsKKwlpZiAoc2JpbmZvLT5zaV94aWIpCisJCWZw
dXQoc2JpbmZvLT5zaV94aWIpOworCXNiaW5mby0+c2lfeGliID0gZmlsZTsKKwlzYmluZm8tPnNp
X3hyZWFkID0gZmluZF9yZWFkZihmaWxlKTsKKwlBdURlYnVnT24oSVNfRVJSKHNiaW5mby0+c2lf
eHJlYWQpKTsKKwlzYmluZm8tPnNpX3h3cml0ZSA9IGZpbmRfd3JpdGVmKGZpbGUpOworCUF1RGVi
dWdPbihJU19FUlIoc2JpbmZvLT5zaV94d3JpdGUpKTsKKworCWVyciA9IC1FTk9NRU07CisJaWYg
KCFzYmluZm8tPnNpX3hpYl9idWYpCisJCXNiaW5mby0+c2lfeGliX2J1ZiA9ICh2b2lkICopZ2V0
X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghc2JpbmZvLT5zaV94aWJf
YnVmKSkKKwkJZ290byBvdXRfdW5zZXQ7CisKKwlzYmluZm8tPnNpX3hpYl9sYXN0X3BpbmRleCA9
IDA7CisJc2JpbmZvLT5zaV94aWJfbmV4dF9iaXQgPSAwOworCisJLyogbm8gbmVlZCB0byBsb2Nr
IGZvciBpX3NpemVfcmVhZCgpICovCisJaWYgKGlfc2l6ZV9yZWFkKGZpbGUtPmZfZGVudHJ5LT5k
X2lub2RlKSA8IFBBR0VfU0laRSkgeworCQlwb3MgPSAwOworCQllcnIgPSB4aW5vX2Z3cml0ZShz
YmluZm8tPnNpX3h3cml0ZSwgZmlsZSwgc2JpbmZvLT5zaV94aWJfYnVmLAorCQkJCSAgUEFHRV9T
SVpFLCAmcG9zKTsKKwkJaWYgKHVubGlrZWx5KGVyciAhPSBQQUdFX1NJWkUpKQorCQkJZ290byBv
dXRfZnJlZTsKKwl9CisJZXJyID0gMDsKKwlnb3RvIG91dDsgLyogc3VjY2VzcyAqLworCisgb3V0
X2ZyZWU6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXNiaW5mby0+c2lfeGliX2J1Zik7CisJ
c2JpbmZvLT5zaV94aWJfYnVmID0gTlVMTDsKKwlpZiAoZXJyID49IDApCisJCWVyciA9IC1FSU87
Cisgb3V0X3Vuc2V0OgorCWZwdXQoc2JpbmZvLT5zaV94aWIpOworCXNiaW5mby0+c2lfeGliID0g
TlVMTDsKKwlzYmluZm8tPnNpX3hyZWFkID0gTlVMTDsKKwlzYmluZm8tPnNpX3h3cml0ZSA9IE5V
TEw7Cisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiB4aW5v
IGZvciBlYWNoIGJyYW5jaCAqLworc3RhdGljIHZvaWQgeGlub19jbGVhcl9icihzdHJ1Y3Qgc3Vw
ZXJfYmxvY2sgKnNiKQoreworCWF1ZnNfYmluZGV4X3QgYmluZGV4LCBiZW5kOworCXN0cnVjdCBh
dV9icmFuY2ggKmJyOworCisJQXVUcmFjZUVudGVyKCk7CisJU2lNdXN0V3JpdGVMb2NrKHNiKTsK
KworCWJlbmQgPSBhdV9zYmVuZChzYik7CisJZm9yIChiaW5kZXggPSAwOyBiaW5kZXggPD0gYmVu
ZDsgYmluZGV4KyspIHsKKwkJYnIgPSBhdV9zYnIoc2IsIGJpbmRleCk7CisJCWlmICh1bmxpa2Vs
eSghYnIgfHwgIWJyLT5icl94aW5vKSkKKwkJCWNvbnRpbnVlOworCisJCWZwdXQoYnItPmJyX3hp
bm8pOworCQlici0+YnJfeGlubyA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGF1X3hpbm9f
c2V0X2JyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmaWxlICpiYXNlKQoreworCWlu
dCBlcnI7CisJYXVmc19iaW5kZXhfdCBiaW5kZXgsIGJlbmQsIGJzaGFyZWQ7CisJc3RydWN0IHsK
KwkJc3RydWN0IGZpbGUgKm9sZCwgKm5ldzsKKwl9ICpmcGFpciwgKnA7CisJc3RydWN0IGF1X2Jy
YW5jaCAqYnI7CisJc3RydWN0IGF1X3hpbm9fZW50cnkgeGlub2U7CisJc3RydWN0IGlub2RlICpp
bm9kZTsKKwlhdV93cml0ZWZfdCB3cml0ZWY7CisKKwkvL2F1X2RlYnVnX29uKCk7CisJTEtUUlRy
YWNlKCIlLipzXG4iLCBBdURMTlBhaXIoYmFzZS0+Zl9kZW50cnkpKTsKKwlTaU11c3RXcml0ZUxv
Y2soc2IpOworCisJZXJyID0gLUVOT01FTTsKKwliZW5kID0gYXVfc2JlbmQoc2IpOworCWZwYWly
ID0ga2NhbGxvYyhiZW5kICsgMSwgc2l6ZW9mKCpmcGFpciksIEdGUF9URU1QT1JBUlkpOworCWlm
ICh1bmxpa2VseSghZnBhaXIpKQorCQlnb3RvIG91dDsKKworCWlub2RlID0gc2ItPnNfcm9vdC0+
ZF9pbm9kZTsKKwl4aW5vZS5pbm8gPSBBVUZTX1JPT1RfSU5POworCXdyaXRlZiA9IGF1X3NiaShz
YiktPnNpX3h3cml0ZTsKKwlmb3IgKGJpbmRleCA9IDAsIHAgPSBmcGFpcjsgYmluZGV4IDw9IGJl
bmQ7IGJpbmRleCsrLCBwKyspIHsKKwkJYnIgPSBhdV9zYnIoc2IsIGJpbmRleCk7CisJCWJzaGFy
ZWQgPSBpc19zYl9zaGFyZWQoc2IsIGJpbmRleCwgYmluZGV4IC0gMSk7CisJCWlmIChic2hhcmVk
ID49IDApIHsKKwkJCS8qIHNoYXJlZCB4aW5vICovCisJCQkqcCA9IGZwYWlyW2JzaGFyZWRdOwor
CQkJZ2V0X2ZpbGUocC0+bmV3KTsKKwkJfQorCisJCWlmICghcC0+bmV3KSB7CisJCQkvKiBuZXcg
eGlubyAqLworCQkJcC0+b2xkID0gYnItPmJyX3hpbm87CisJCQlwLT5uZXcgPSBhdV94aW5vX2Ny
ZWF0ZTIoc2IsIGJhc2UsIGJyLT5icl94aW5vKTsKKwkJCWVyciA9IFBUUl9FUlIocC0+bmV3KTsK
KwkJCWlmIChJU19FUlIocC0+bmV3KSkgeworCQkJCXAtPm5ldyA9IE5VTEw7CisJCQkJZ290byBv
dXRfcGFpcjsKKwkJCX0KKwkJfQorCisJCWVyciA9IGF1X3hpbm9fZG9fd3JpdGUod3JpdGVmLCBw
LT5uZXcsCisJCQkJICAgICAgIGF1X2hfaXB0cihpbm9kZSwgYmluZGV4KS0+aV9pbm8sICZ4aW5v
ZSk7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJZ290byBvdXRfcGFpcjsKKwl9CisKKwlmb3Ig
KGJpbmRleCA9IDAsIHAgPSBmcGFpcjsgYmluZGV4IDw9IGJlbmQ7IGJpbmRleCsrLCBwKyspIHsK
KwkJYnIgPSBhdV9zYnIoc2IsIGJpbmRleCk7CisJCUF1RGVidWdPbihwLT5vbGQgIT0gYnItPmJy
X3hpbm8pOworCQlpZiAoYnItPmJyX3hpbm8pCisJCQlmcHV0KGJyLT5icl94aW5vKTsKKwkJZ2V0
X2ZpbGUocC0+bmV3KTsKKwkJYnItPmJyX3hpbm8gPSBwLT5uZXc7CisJfQorCisgb3V0X3BhaXI6
CisJZm9yIChiaW5kZXggPSAwLCBwID0gZnBhaXI7IGJpbmRleCA8PSBiZW5kOyBiaW5kZXgrKywg
cCsrKQorCQlpZiAocC0+bmV3KQorCQkJZnB1dChwLT5uZXcpOworCQllbHNlCisJCQlicmVhazsK
KwlrZnJlZShmcGFpcik7Cisgb3V0OgorCUF1VHJhY2VFcnIoZXJyKTsKKwkvL2F1X2RlYnVnX29m
ZigpOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgYXVfeGlub19jbHIoc3RydWN0IHN1cGVyX2Js
b2NrICpzYikKK3sKKwlBdVRyYWNlRW50ZXIoKTsKKwlTaU11c3RXcml0ZUxvY2soc2IpOworCisJ
eGlub19jbGVhcl94aWIoc2IpOworCXhpbm9fY2xlYXJfYnIoc2IpOworCWF1X29wdF9jbHIoYXVf
c2JpKHNiKS0+c2lfbW50ZmxhZ3MsIFhJTk8pOworfQorCitpbnQgYXVfeGlub19zZXQoc3RydWN0
IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGF1X29wdF94aW5vICp4aW5vLCBpbnQgcmVtb3VudCkK
K3sKKwlpbnQgZXJyLCBza2lwOworCXN0cnVjdCBkZW50cnkgKnBhcmVudCwgKmN1cl9wYXJlbnQ7
CisJc3RydWN0IHFzdHIgKmRuYW1lLCAqY3VyX25hbWU7CisJc3RydWN0IGZpbGUgKmN1cl94aW5v
OworCXN0cnVjdCBpbm9kZSAqZGlyOworCXN0cnVjdCBhdV9zYmluZm8gKnNiaW5mbzsKKworCUxL
VFJUcmFjZSgicmVtb3VudCAlZFxuIiwgcmVtb3VudCk7CisJU2lNdXN0V3JpdGVMb2NrKHNiKTsK
KworCWVyciA9IDA7CisJc2JpbmZvID0gYXVfc2JpKHNiKTsKKwlwYXJlbnQgPSBkZ2V0X3BhcmVu
dCh4aW5vLT5maWxlLT5mX2RlbnRyeSk7CisJaWYgKHJlbW91bnQpIHsKKwkJc2tpcCA9IDA7CisJ
CWRuYW1lID0gJnhpbm8tPmZpbGUtPmZfZGVudHJ5LT5kX25hbWU7CisJCWN1cl94aW5vID0gc2Jp
bmZvLT5zaV94aWI7CisJCWlmIChjdXJfeGlubykgeworCQkJY3VyX3BhcmVudCA9IGRnZXRfcGFy
ZW50KGN1cl94aW5vLT5mX2RlbnRyeSk7CisJCQljdXJfbmFtZSA9ICZjdXJfeGluby0+Zl9kZW50
cnktPmRfbmFtZTsKKwkJCXNraXAgPSAoY3VyX3BhcmVudCA9PSBwYXJlbnQKKwkJCQkmJiBkbmFt
ZS0+bGVuID09IGN1cl9uYW1lLT5sZW4KKwkJCQkmJiAhbWVtY21wKGRuYW1lLT5uYW1lLCBjdXJf
bmFtZS0+bmFtZSwKKwkJCQkJICAgZG5hbWUtPmxlbikpOworCQkJZHB1dChjdXJfcGFyZW50KTsK
KwkJfQorCQlpZiAoc2tpcCkKKwkJCWdvdG8gb3V0OworCX0KKworCWF1X29wdF9zZXQoc2JpbmZv
LT5zaV9tbnRmbGFncywgWElOTyk7CisJZGlyID0gcGFyZW50LT5kX2lub2RlOworCW11dGV4X2xv
Y2tfbmVzdGVkKCZkaXItPmlfbXV0ZXgsIEF1THNjX0lfUEFSRU5UKTsKKwllcnIgPSBhdV94aW5v
X3NldF94aWIoc2IsIHhpbm8tPmZpbGUpOworCWlmICghZXJyKQorCQllcnIgPSBhdV94aW5vX3Nl
dF9icihzYiwgeGluby0+ZmlsZSk7CisJbXV0ZXhfdW5sb2NrKCZkaXItPmlfbXV0ZXgpOworCWlm
ICghZXJyKQorCQlnb3RvIG91dDsgLyogc3VjY2VzcyAqLworCisJLyogcmVzZXQgYWxsICovCisJ
QXVJT0VycigiZmFpbGVkIGNyZWF0aW5nIHhpbm8sIGZvcmNpbmcgbm94aW5vICglZCkuXG4iLCBl
cnIpOworCWVyciA9IC1FSU87CisJYXVfeGlub19jbHIoc2IpOworCisgb3V0OgorCWRwdXQocGFy
ZW50KTsKKwlBdVRyYWNlRXJyKGVycik7CisJcmV0dXJuIGVycjsKK30KKworaW50IGF1X3hpbm9f
dHJ1bmMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYXVmc19iaW5kZXhfdCBiaW5kZXgpCit7CisJ
aW50IGVycjsKKwlzdHJ1Y3QgYXVfYnJhbmNoICpicjsKKwlzdHJ1Y3QgZmlsZSAqbmV3X3hpbm87
CisJc3RydWN0IHN1cGVyX2Jsb2NrICpoX3NiOworCWF1ZnNfYmluZGV4X3QgYmksIGJlbmQ7CisJ
c3RydWN0IGRlbnRyeSAqcGFyZW50OworCXN0cnVjdCBpbm9kZSAqZGlyOworCisJLy9hdV9kZWJ1
Z19vbigpOworCUxLVFJUcmFjZSgiYiVkXG4iLCBiaW5kZXgpOworCVNpTXVzdFdyaXRlTG9jayhz
Yik7CisKKwllcnIgPSAtRUlOVkFMOworCWJlbmQgPSBhdV9zYmVuZChzYik7CisJaWYgKHVubGlr
ZWx5KGJpbmRleCA8IDAgfHwgYmVuZCA8IGJpbmRleCkpCisJCWdvdG8gb3V0OworCWJyID0gYXVf
c2JyKHNiLCBiaW5kZXgpOworCWlmICh1bmxpa2VseSghYnItPmJyX3hpbm8pKQorCQlnb3RvIG91
dDsKKworCXBhcmVudCA9IGRnZXRfcGFyZW50KGJyLT5icl94aW5vLT5mX2RlbnRyeSk7CisJZGly
ID0gcGFyZW50LT5kX2lub2RlOworCS8vQXVEYmdGaWxlKGJyLT5icl94aW5vKTsKKwltdXRleF9s
b2NrX25lc3RlZCgmZGlyLT5pX211dGV4LCBBdUxzY19JX1BBUkVOVCk7CisJbmV3X3hpbm8gPSBh
dV94aW5vX2NyZWF0ZTIoc2IsIGJyLT5icl94aW5vLCBici0+YnJfeGlubyk7CisJbXV0ZXhfdW5s
b2NrKCZkaXItPmlfbXV0ZXgpOworCS8vQXVEYmdGaWxlKG5ld194aW5vKTsKKwlkcHV0KHBhcmVu
dCk7CisJZXJyID0gUFRSX0VSUihuZXdfeGlubyk7CisJaWYgKElTX0VSUihuZXdfeGlubykpCisJ
CWdvdG8gb3V0OworCWVyciA9IDA7CisJZnB1dChici0+YnJfeGlubyk7CisJYnItPmJyX3hpbm8g
PSBuZXdfeGlubzsKKworCWhfc2IgPSBici0+YnJfbW50LT5tbnRfc2I7CisJZm9yIChiaSA9IDA7
IGJpIDw9IGJlbmQ7IGJpKyspIHsKKwkJaWYgKHVubGlrZWx5KGJpID09IGJpbmRleCkpCisJCQlj
b250aW51ZTsKKwkJYnIgPSBhdV9zYnIoc2IsIGJpKTsKKwkJaWYgKGJyLT5icl9tbnQtPm1udF9z
YiAhPSBoX3NiKQorCQkJY29udGludWU7CisKKwkJZnB1dChici0+YnJfeGlubyk7CisJCWJyLT5i
cl94aW5vID0gbmV3X3hpbm87CisJCWdldF9maWxlKG5ld194aW5vKTsKKwl9CisKKyBvdXQ6CisJ
QXVUcmFjZUVycihlcnIpOworCS8vYXVfZGVidWdfb2ZmKCk7CisJcmV0dXJuIGVycjsKK30KKwor
LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogY3JlYXRlIGEgeGlub2ZpbGUgYXQgdGhlIGRl
ZmF1bHQgcGxhY2UvcGF0aC4KKyAqLworc3RydWN0IGZpbGUgKmF1X3hpbm9fZGVmKHN0cnVjdCBz
dXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJYXVmc19iaW5kZXhfdCBi
ZW5kLCBiaW5kZXgsIGJ3cjsKKwljaGFyICpwYWdlLCAqcDsKKwlzdHJ1Y3QgcGF0aCBwYXRoOwor
CisJQXVUcmFjZUVudGVyKCk7CisKKwliZW5kID0gYXVfc2JlbmQoc2IpOworCWJ3ciA9IC0xOwor
CWZvciAoYmluZGV4ID0gMDsgYmluZGV4IDw9IGJlbmQ7IGJpbmRleCsrKQorCQlpZiAoYXVfYnJf
d3JpdGFibGUoYXVfc2JyX3Blcm0oc2IsIGJpbmRleCkpCisJCSAgICAmJiAhYXVfdGVzdF9uZnMo
YXVfaF9kcHRyKHNiLT5zX3Jvb3QsIGJpbmRleCktPmRfc2IpKSB7CisJCQlid3IgPSBiaW5kZXg7
CisJCQlicmVhazsKKwkJfQorCisJaWYgKGJ3ciA+PSAwKSB7CisJCWZpbGUgPSBFUlJfUFRSKC1F
Tk9NRU0pOworCQlwYWdlID0gX19nZXRuYW1lKCk7CisJCS8vaWYgKExrdHJDb25kKSB7X19wdXRu
YW1lKHBhZ2UpOyBwYWdlID0gTlVMTDt9CisJCWlmICh1bmxpa2VseSghcGFnZSkpCisJCQlnb3Rv
IG91dDsKKwkJcGF0aC5tbnQgPSBhdV9zYnJfbW50KHNiLCBid3IpOworCQlwYXRoLmRlbnRyeSA9
IGF1X2hfZHB0cihzYi0+c19yb290LCBid3IpOworCQlwID0gZF9wYXRoKCZwYXRoLCBwYWdlLCBQ
QVRIX01BWCAtIHNpemVvZihBVUZTX1hJTk9fRk5BTUUpKTsKKwkJLy9pZiAoTGt0ckNvbmQpIHAg
PSBFUlJfUFRSKC0xKTsKKwkJZmlsZSA9ICh2b2lkICopcDsKKwkJaWYgKHAgJiYgIUlTX0VSUihw
KSkgeworCQkJc3RyY2F0KHAsICIvIiBBVUZTX1hJTk9fRk5BTUUpOworCQkJTEtUUlRyYWNlKCIl
c1xuIiwgcCk7CisJCQlmaWxlID0gYXVfeGlub19jcmVhdGUoc2IsIHAsIC8qc2lsZW50Ki8wLCBz
Yi0+c19yb290KTsKKwkJCS8vaWYgKExrdHJDb25kKSB7ZnB1dChmaWxlKTsgZmlsZSA9IEVSUl9Q
VFIoLTEpO30KKwkJfQorCQlfX3B1dG5hbWUocGFnZSk7CisJfSBlbHNlIHsKKwkJZmlsZSA9IGF1
X3hpbm9fY3JlYXRlKHNiLCBBVUZTX1hJTk9fREVGUEFUSCwgLypzaWxlbnQqLzAsCisJCQkJICAg
ICAgLypwYXJlbnQqL05VTEwpOworCQkvL2lmIChMa3RyQ29uZCkge2ZwdXQoZmlsZSk7IGZpbGUg
PSBFUlJfUFRSKC0xKTt9CisJCWlmICh1bmxpa2VseShhdV90ZXN0X25mcyhmaWxlLT5mX2RlbnRy
eS0+ZF9zYikpKSB7CisJCQlBdUVycigieGlubyBvciBub3hpbm8gb3B0aW9uIGlzIHJlcXVpcmVk
ICIKKwkJCSAgICAgICJzaW5jZSAlcyBpcyBORlNcbiIsIEFVRlNfWElOT19ERUZQQVRIKTsKKwkJ
CWZwdXQoZmlsZSk7CisJCQlmaWxlID0gRVJSX1BUUigtRUlOVkFMKTsKKwkJfQorCX0KKworIG91
dDoKKwlBdVRyYWNlRXJyUHRyKGZpbGUpOworCXJldHVybiBmaWxlOworfQpkaWZmIC11ck4gbGlu
dXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL2ZpbGVfdGFibGUuYyBsaW51eC0yLjYuMjUuNC11
bmlvbmZzL2ZzL2ZpbGVfdGFibGUuYwotLS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2Zz
L2ZpbGVfdGFibGUuYwkyMDA4LTA0LTE4IDAxOjIwOjEwICswMzAwCisrKyBsaW51eC0yLjYuMjUu
NC11bmlvbmZzL2ZzL2ZpbGVfdGFibGUuYwkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC0z
MDgsNiArMzA4LDcgQEAKIAkJZmlsZV9mcmVlKGZpbGUpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0wo
cHV0X2ZpbHApOwogCiB2b2lkIGZpbGVfbW92ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGxp
c3RfaGVhZCAqbGlzdCkKIHsKZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9m
cy9LY29uZmlnIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvS2NvbmZpZwotLS0gbGludXgtMi42
LjI1LjQtdW5pb25mcy5vcmlnL2ZzL0tjb25maWcJMjAwOC0wNS0yNSAxMTo1MzozNyArMDMwMAor
KysgbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9LY29uZmlnCTIwMDgtMDUtMjUgMTE6NTY6MDgg
KzAzMDAKQEAgLTYxNCw2ICs2MTQsOCBAQAogCSAgSWYgeW91IHdhbnQgdG8gZGV2ZWxvcCBhIHVz
ZXJzcGFjZSBGUywgb3IgaWYgeW91IHdhbnQgdG8gdXNlCiAJICBhIGZpbGVzeXN0ZW0gYmFzZWQg
b24gRlVTRSwgYW5zd2VyIFkgb3IgTS4KIAorc291cmNlICJmcy9hdWZzL0tjb25maWciCisKIGNv
bmZpZyBHRU5FUklDX0FDTAogCWJvb2wKIAlzZWxlY3QgRlNfUE9TSVhfQUNMCmRpZmYgLXVyTiBs
aW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvTWFrZWZpbGUgbGludXgtMi42LjI1LjQtdW5p
b25mcy9mcy9NYWtlZmlsZQotLS0gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL01ha2Vm
aWxlCTIwMDgtMDUtMjUgMTE6NTM6MzcgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMv
ZnMvTWFrZWZpbGUJMjAwOC0wNS0yNSAxMTo1NjowOCArMDMwMApAQCAtMTA3LDYgKzEwNyw3IEBA
CiBvYmotJChDT05GSUdfQVVUT0ZTNF9GUykJKz0gYXV0b2ZzNC8KIG9iai0kKENPTkZJR19BREZT
X0ZTKQkJKz0gYWRmcy8KIG9iai0kKENPTkZJR19GVVNFX0ZTKQkJKz0gZnVzZS8KK29iai0kKENP
TkZJR19BVUZTKQkJKz0gYXVmcy8KIG9iai0kKENPTkZJR19VREZfRlMpCQkrPSB1ZGYvCiBvYmot
JChDT05GSUdfU1VOX09QRU5QUk9NRlMpCSs9IG9wZW5wcm9tZnMvCiBvYmotJChDT05GSUdfSkZT
X0ZTKQkJKz0gamZzLwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2ZzL25h
bWVpLmMgbGludXgtMi42LjI1LjQtdW5pb25mcy9mcy9uYW1laS5jCi0tLSBsaW51eC0yLjYuMjUu
NC11bmlvbmZzLm9yaWcvZnMvbmFtZWkuYwkyMDA4LTA1LTI1IDExOjUzOjM3ICswMzAwCisrKyBs
aW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL25hbWVpLmMJMjAwOC0wNS0yNSAxMTo1NjowOCArMDMw
MApAQCAtMTI5Miw3ICsxMjkyLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgc3RydWN0
IGRlbnRyeSAqX19sb29rdXBfaGFzaChzdHJ1Y3QgcXN0ciAqbmFtZSwKK3N0cnVjdCBkZW50cnkg
Kl9fbG9va3VwX2hhc2goc3RydWN0IHFzdHIgKm5hbWUsCiAJCXN0cnVjdCBkZW50cnkgKmJhc2Us
IHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKQEAgLTI4
MzcsMyArMjgzNyw1IEBACiBFWFBPUlRfU1lNQk9MKHZmc191bmxpbmspOwogRVhQT1JUX1NZTUJP
TChkZW50cnlfdW5oYXNoKTsKIEVYUE9SVF9TWU1CT0woZ2VuZXJpY19yZWFkbGluayk7CitFWFBP
UlRfU1lNQk9MKF9fbG9va3VwX2hhc2gpOworRVhQT1JUX1NZTUJPTChkZW55X3dyaXRlX2FjY2Vz
cyk7CmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvZnMvc3BsaWNlLmMgbGlu
dXgtMi42LjI1LjQtdW5pb25mcy9mcy9zcGxpY2UuYwotLS0gbGludXgtMi42LjI1LjQtdW5pb25m
cy5vcmlnL2ZzL3NwbGljZS5jCTIwMDgtMDUtMjUgMTE6NTM6MzcgKzAzMDAKKysrIGxpbnV4LTIu
Ni4yNS40LXVuaW9uZnMvZnMvc3BsaWNlLmMJMjAwOC0wNS0yNSAxMTo1NjowOCArMDMwMApAQCAt
ODc0LDcgKzg3NCw2IEBACiB7CiAJcmV0dXJuIHNwbGljZV9mcm9tX3BpcGUocGlwZSwgb3V0LCBw
cG9zLCBsZW4sIGZsYWdzLCBwaXBlX3RvX3NlbmRwYWdlKTsKIH0KLQogRVhQT1JUX1NZTUJPTChn
ZW5lcmljX3NwbGljZV9zZW5kcGFnZSk7CiAKIC8qCmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC11
bmlvbmZzLm9yaWcvZnMvc3VwZXIuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2ZzL3N1cGVyLmMK
LS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9mcy9zdXBlci5jCTIwMDgtMDQtMTggMDE6
MjA6MTAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMvZnMvc3VwZXIuYwkyMDA4LTA1
LTI1IDExOjU2OjA4ICswMzAwCkBAIC0yNjcsNiArMjY3LDcgQEAKIAlfX2ZzeW5jX3N1cGVyKHNi
KTsKIAlyZXR1cm4gc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKIH0KK0VYUE9SVF9TWU1CT0wo
ZnN5bmNfc3VwZXIpOwogCiAvKioKICAqCWdlbmVyaWNfc2h1dGRvd25fc3VwZXIJLQljb21tb24g
aGVscGVyIGZvciAtPmtpbGxfc2IoKQpkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5v
cmlnL2luY2x1ZGUvbGludXgvYXVmc190eXBlLmggbGludXgtMi42LjI1LjQtdW5pb25mcy9pbmNs
dWRlL2xpbnV4L2F1ZnNfdHlwZS5oCi0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvaW5j
bHVkZS9saW51eC9hdWZzX3R5cGUuaAkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51
eC0yLjYuMjUuNC11bmlvbmZzL2luY2x1ZGUvbGludXgvYXVmc190eXBlLmgJMjAwOC0wNS0yNSAx
MTo1NjowOCArMDMwMApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
NSwgMjAwNiwgMjAwNywgMjAwOCBKdW5qaXJvIE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dyYW0s
IGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v
ZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdO
VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVl
IFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxv
b3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKy8qICRJZDogYXVmc190eXBl
LmgsdiAxLjEwNSAyMDA4LzA1LzA0IDIzOjU1OjE0IHNmanJvIEV4cCAkICovCisKKyNpbmNsdWRl
IDxsaW51eC9pb2N0bC5oPgorCisjaWZuZGVmIF9fQVVGU19UWVBFX0hfXworI2RlZmluZSBfX0FV
RlNfVFlQRV9IX18KKworI2RlZmluZSBBVUZTX1ZFUlNJT04JIjIwMDgwNTA1IgorCisvKiBtb3Zl
IHRoaXMgdG8gbGludXgtMi42LjE5L2luY2x1ZGUvbWFnaWMuaCAqLworI2RlZmluZSBBVUZTX1NV
UEVSX01BR0lDCSgnYScgPDwgMjQgfCAndScgPDwgMTYgfCAnZicgPDwgOCB8ICdzJykKKworLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX0FVRlNfQlJBTkNIX01BWF8xMjcKKy8q
IHNvbWUgZW52aXJvbm1lbnRzIHRyZWF0ICdjaGFyJyBhcyAndW5zaWduZWQgY2hhcicgYnkgZGVm
YXVsdCAqLwordHlwZWRlZiBzaWduZWQgY2hhciBhdWZzX2JpbmRleF90OworI2RlZmluZSBBVUZT
X0JSQU5DSF9NQVggMTI3CisjZWxzZQordHlwZWRlZiBzaG9ydCBhdWZzX2JpbmRleF90OworI2lm
ZGVmIENPTkZJR19BVUZTX0JSQU5DSF9NQVhfNTExCisjZGVmaW5lIEFVRlNfQlJBTkNIX01BWCA1
MTEKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FVRlNfQlJBTkNIX01BWF8xMDIzKQorI2RlZmluZSBB
VUZTX0JSQU5DSF9NQVggMTAyMworI2VsaWYgZGVmaW5lZChDT05GSUdfQVVGU19CUkFOQ0hfTUFY
XzMyNzY3KQorI2RlZmluZSBBVUZTX0JSQU5DSF9NQVggMzI3NjcKKyNlbHNlCisjZXJyb3IgdW5r
bm93biBDT05GSUdfQVVGU19CUkFOQ0hfTUFYIHZhbHVlCisjZW5kaWYKKyNlbmRpZgorCisjZGVm
aW5lIEFVRlNfTkFNRQkJImF1ZnMiCisjZGVmaW5lIEFVRlNfRlNUWVBFCQlBVUZTX05BTUUKKwor
I2RlZmluZSBBVUZTX1JPT1RfSU5PCQkyCisjZGVmaW5lIEFVRlNfRklSU1RfSU5PCQkxMQorCisj
ZGVmaW5lIEFVRlNfV0hfUEZYCQkiLndoLiIKKyNkZWZpbmUgQVVGU19XSF9QRlhfTEVOCQkoKGlu
dClzaXplb2YoQVVGU19XSF9QRlgpIC0gMSkKKyNkZWZpbmUgQVVGU19YSU5PX0ZOQU1FCQkiLiIg
QVVGU19OQU1FICIueGlubyIKKyNkZWZpbmUgQVVGU19YSU5PX0RFRlBBVEgJIi90bXAvIiBBVUZT
X1hJTk9fRk5BTUUKKyNkZWZpbmUgQVVGU19YSU5PX1RSVU5DX0lOSVQJNjQgLyogYmxvY2tzICov
CisjZGVmaW5lIEFVRlNfWElOT19UUlVOQ19TVEVQCTQgIC8qIGJsb2NrcyAqLworI2RlZmluZSBB
VUZTX0RJUldIX0RFRgkJMworI2RlZmluZSBBVUZTX1JEQ0FDSEVfREVGCTEwIC8qIHNlY29uZHMg
Ki8KKyNkZWZpbmUgQVVGU19XS1FfTkFNRQkJQVVGU19OQU1FICJkIgorI2RlZmluZSBBVUZTX05X
S1FfREVGCQk0CisjZGVmaW5lIEFVRlNfTUZTX1NFQ09ORF9ERUYJMzAgLyogc2Vjb25kcyAqLwor
I2RlZmluZSBBVUZTX1BMSU5LX1dBUk4JCTEwMCAvKiBudW1iZXIgb2YgcGxpbmtzICovCisKKyNp
ZmRlZiBDT05GSUdfQVVGU19DT01QQVQKKyNkZWZpbmUgQVVGU19ESVJPUFFfTkFNRQkiX19kaXJf
b3BhcXVlIgorI2Vsc2UKKyNkZWZpbmUgQVVGU19ESVJPUFFfTkFNRQlBVUZTX1dIX1BGWCAiLm9w
cSIgLyogd2hpdGVvdXRlZCBkb3VibHkgKi8KKyNlbmRpZgorI2RlZmluZSBBVUZTX1dIX0RJUk9Q
UQkJQVVGU19XSF9QRlggQVVGU19ESVJPUFFfTkFNRQorCisvKiB3aWxsIGJlIHdoaXRlb3V0ZWQg
ZG91Ymx5ICovCisjZGVmaW5lIEFVRlNfV0hfQkFTRU5BTUUJQVVGU19XSF9QRlggQVVGU19OQU1F
CisjZGVmaW5lIEFVRlNfV0hfUExJTktESVIJQVVGU19XSF9QRlggInBsaW5rIgorCisvKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tICovCisKKy8qIGlvY3RsICovCitlbnVtIHsKKwlBdUN0bEVyciwKKwlBdUN0bEVy
cl9MYXN0Cit9OworZW51bSB7CisJQXVDdGxfUkVGUkVTSCwgLy9BdUN0bF9SRUZSRVNIViwKKwkv
L0F1Q3RsX0ZMVVNIX1BMSU5LLAorCS8vQXVDdGxfQ1BVUCwKKwlBdUN0bF9DUERPV04sIEF1Q3Rs
X01WRE9XTiwKKwkvL0F1Q3RsX0RJUk9QUQorfTsKKworc3RydWN0IGF1ZnNfY3RsX2NwIHsKKwlp
bnQgYnNyYywgYmRzdDsKKwlpbnQgZXJyOworfTsKKworI2RlZmluZSBBdUN0bFR5cGUJCSdBJwor
I2RlZmluZSBBVUZTX0NUTF9SRUZSRVNICV9JTyhBdUN0bFR5cGUsIEF1Q3RsX1JFRlJFU0gpCisv
LyNkZWZpbmUgQVVGU19DVExfUkVGUkVTSFYJX0lPKEF1Q3RsVHlwZSwgQXVDdGxfUkVGUkVTSFYp
CisvLyNkZWZpbmUgQVVGU19DVExfRkxVU0hfUExJTksJX0lPUihBdUN0bFR5cGUsIEF1Q3RsX0ZM
VVNIX1BMSU5LKQorLy8jZGVmaW5lIEFVRlNfQ1RMX0NQVVAJCV9JT1dSKEF1Q3RsVHlwZSwgQXVD
dGxfQ1BVUCwgc3RydWN0IGF1ZnNfY3RsX2NwKQorI2RlZmluZSBBVUZTX0NUTF9DUERPV04gXAor
CV9JT1dSKEF1Q3RsVHlwZSwgQXVDdGxfQ1BET1dOLCBzdHJ1Y3QgYXVmc19jdGxfY3ApCisjZGVm
aW5lIEFVRlNfQ1RMX01WRE9XTiBcCisJX0lPV1IoQXVDdGxUeXBlLCBBdUN0bF9NVkRPV04sIHN0
cnVjdCBhdWZzX2N0bF9jcCkKKy8vI2RlZmluZSBBVUZTX0NUTF9ESVJPUFEJCV9JTyhBdUN0bFR5
cGUsIEF1Q3RsX0RJUk9QUSkKKworI2VuZGlmIC8qIF9fQVVGU19UWVBFX0hfXyAqLwpkaWZmIC11
ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2luY2x1ZGUvbGludXgvbmFtZWkuaCBsaW51
eC0yLjYuMjUuNC11bmlvbmZzL2luY2x1ZGUvbGludXgvbmFtZWkuaAotLS0gbGludXgtMi42LjI1
LjQtdW5pb25mcy5vcmlnL2luY2x1ZGUvbGludXgvbmFtZWkuaAkyMDA4LTA0LTE4IDAxOjIwOjE3
ICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2luY2x1ZGUvbGludXgvbmFtZWkuaAky
MDA4LTA1LTI1IDExOjU2OjA4ICswMzAwCkBAIC03MSw2ICs3MSw3IEBACiBleHRlcm4gaW50IHBh
dGhfbG9va3VwX29wZW4oaW50IGRmZCwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9va3Vw
X2ZsYWdzLCBzdHJ1Y3QgbmFtZWlkYXRhICosIGludCBvcGVuX2ZsYWdzKTsKIGV4dGVybiBzdHJ1
Y3QgZmlsZSAqbG9va3VwX2luc3RhbnRpYXRlX2ZpbHAoc3RydWN0IG5hbWVpZGF0YSAqbmQsIHN0
cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJaW50ICgqb3Blbikoc3RydWN0IGlub2RlICosIHN0cnVj
dCBmaWxlICopKTsKK3N0cnVjdCBkZW50cnkgKiBfX2xvb2t1cF9oYXNoKHN0cnVjdCBxc3RyICpu
YW1lLCBzdHJ1Y3QgZGVudHJ5ICogYmFzZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwogZXh0ZXJu
IHN0cnVjdCBmaWxlICpuYW1laWRhdGFfdG9fZmlscChzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgaW50
IGZsYWdzKTsKIGV4dGVybiB2b2lkIHJlbGVhc2Vfb3Blbl9pbnRlbnQoc3RydWN0IG5hbWVpZGF0
YSAqKTsKIApkaWZmIC11ck4gbGludXgtMi42LjI1LjQtdW5pb25mcy5vcmlnL2luY2x1ZGUvbGlu
dXgvc3BsaWNlLmggbGludXgtMi42LjI1LjQtdW5pb25mcy9pbmNsdWRlL2xpbnV4L3NwbGljZS5o
Ci0tLSBsaW51eC0yLjYuMjUuNC11bmlvbmZzLm9yaWcvaW5jbHVkZS9saW51eC9zcGxpY2UuaAky
MDA4LTA1LTI1IDExOjUzOjM3ICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC11bmlvbmZzL2luY2x1
ZGUvbGludXgvc3BsaWNlLmgJMjAwOC0wNS0yNSAxMTo1NjowOCArMDMwMApAQCAtNzUsNSArNzUs
NCBAQAogZXh0ZXJuIGxvbmcgdmZzX3NwbGljZV90byhzdHJ1Y3QgZmlsZSAqaW4sIGxvZmZfdCAq
cHBvcywKIAkJCSAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwKIAkJ
CSAgdW5zaWduZWQgaW50IGZsYWdzKTsKLQogI2VuZGlmCmRpZmYgLXVyTiBsaW51eC0yLjYuMjUu
NC11bmlvbmZzLm9yaWcvc2VjdXJpdHkvc2VjdXJpdHkuYyBsaW51eC0yLjYuMjUuNC11bmlvbmZz
L3NlY3VyaXR5L3NlY3VyaXR5LmMKLS0tIGxpbnV4LTIuNi4yNS40LXVuaW9uZnMub3JpZy9zZWN1
cml0eS9zZWN1cml0eS5jCTIwMDgtMDQtMTggMDE6MjA6MjAgKzAzMDAKKysrIGxpbnV4LTIuNi4y
NS40LXVuaW9uZnMvc2VjdXJpdHkvc2VjdXJpdHkuYwkyMDA4LTA1LTI1IDExOjU2OjA4ICswMzAw
CkBAIC00MzMsNiArNDMzLDcgQEAKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIHNlY3VyaXR5X29wcy0+
aW5vZGVfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgbmQpOwogfQorRVhQT1JUX1NZTUJPTChzZWN1
cml0eV9pbm9kZV9wZXJtaXNzaW9uKTsKIAogaW50IHNlY3VyaXR5X2lub2RlX3NldGF0dHIoc3Ry
dWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCiB7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>2655</attachid>
            <date>2008-05-30 00:17:56 +0400</date>
            <delta_ts>2008-05-30 00:17:56 +0400</delta_ts>
            <desc>linux-2.6.25.4-supermount-ng-2.2.2.patch</desc>
            <filename>linux-2.6.25.4-supermount-ng-2.2.2.patch</filename>
            <type>text/plain</type>
            <size>167396</size>
            <attacher>led</attacher>
            
              <data encoding="base64">ZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40Lm9yaWcvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy8w
MC1JTkRFWCBsaW51eC0yLjYuMjUuNC9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zLzAwLUlOREVY
Ci0tLSBsaW51eC0yLjYuMjUuNC5vcmlnL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvMDAtSU5E
RVgJMjAwOC0wNC0xOCAwMToxOTo1NSArMDMwMAorKysgbGludXgtMi42LjI1LjQvRG9jdW1lbnRh
dGlvbi9maWxlc3lzdGVtcy8wMC1JTkRFWAkyMDA4LTA1LTIwIDAxOjI3OjUzICswMzAwCkBAIC05
Miw2ICs5Miw4IEBACiAJLSBhIGRlc2NyaXB0aW9uIG9mIHNoYXJlZCBzdWJ0cmVlcyBmb3IgbmFt
ZXNwYWNlcy4KIHNtYmZzLnR4dAogCS0gaW5mbyBvbiB1c2luZyBmaWxlc3lzdGVtcyB3aXRoIHRo
ZSBTTUIgcHJvdG9jb2wgKFdpbiAzLjExIGFuZCBOVCkuCitzdXBlcm1vdW50LnR4dAorCS0gaW5m
byBvbiB1c2luZyBzdXBlcm1vdW50IGZvciByZW1vdmFibGUgbWVkaWEuCiBzcHVmcy50eHQKIAkt
IGluZm8gYW5kIG1vdW50IG9wdGlvbnMgZm9yIHRoZSBTUFUgZmlsZXN5c3RlbSB1c2VkIG9uIENl
bGwuCiBzeXNmcy1wY2kudHh0CmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC5vcmlnL0RvY3VtZW50
YXRpb24vZmlsZXN5c3RlbXMvc3VwZXJtb3VudC50eHQgbGludXgtMi42LjI1LjQvRG9jdW1lbnRh
dGlvbi9maWxlc3lzdGVtcy9zdXBlcm1vdW50LnR4dAotLS0gbGludXgtMi42LjI1LjQub3JpZy9E
b2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N1cGVybW91bnQudHh0CTE5NzAtMDEtMDEgMDM6MDA6
MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40L0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3Vw
ZXJtb3VudC50eHQJMjAwOC0wNS0yMCAwMToyNzo1MyArMDMwMApAQCAtMCwwICsxLDI1OCBAQAor
U3VwZXJtb3VudCBSRUFETUUKKz09PT09PT09PT09PT09PT09CisKK1J1bm5pbmcgc3VwZXJtb3Vu
dAorLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHJ1biBzdXBlcm1vdW50LCBjb21waWxlIGFuZCBp
bnN0YWxsIGEga2VybmVsIHdpdGggdGhlIHN1cGVybW91bnQKK3BhdGNoZXMgYW5kIHNlbGVjdCAi
WSIgdG8gdGhlIHF1ZXN0aW9uCisKKwlTdXBlcm1vdW50IHJlbW92YWJsZSBtZWRpYSBzdXBwb3J0
IChDT05GSUdfU1VQRVJNT1VOVCkgW1kvbi8/XSAKKword2hlbiB5b3UgcnVuICJtYWtlIGNvbmZp
ZyIuICBZb3UgbW91bnQgYSBzdXBlcm1vdW50IGZpbGVzeXN0ZW0gd2l0aAordGhlIG5vcm1hbCBt
b3VudCBjb21tYW5kLCB1c2luZyB0aGUgc3ludGF4CisKKwltb3VudCAtdCBzdXBlcm1vdW50IC1v
IDxzdXBlcmZzLW9wdGlvbnM+LC0tLDxzdWJmcy1vcHRpb25zPiBub25lIDxtcHQ+CisKK29yIGJ5
IGFkZGluZyBjb3JyZXBzb25kaW5nIGxpbmUgdG8gL2V0Yy9mc3RhYgorCisJbm9uZSAgPG1wdD4g
c3VwZXJtb3VudCA8c3VwZXJmcy1vcHRpb25zPiwtLSw8c3ViZnMtb3B0aW9ucz4gMCAwCisKK3do
ZXJlCisKKwk8c3VwZXJmcy1vcHRpb25zPiBhcmUgdGhlIG9wdGlvbnMgeW91IHdhbnQgdG8gcGFz
cyB0byBzdXBlcm1vdW50CisJaXRzZWxmLiAgVGhlc2UgYXJlIGRlc2NyaWJlZCBiZWxvdy4KKwor
CTxzdWJmcy1vcHRpb25zPiBhcmUgdGhlIG9wdGlvbnMgeW91IHdhbnQgc3VwZXJtb3VudCB0byBw
YXNzIHRvIHRoZQorCWRpc21vdW50YWJsZSBmaWxlc3lzdGVtIHVuZGVybmVhdGguCisKKwk8bXB0
PiBpcyB0aGUgbW91bnQgcG9pbnQgd2hlcmUgeW91IHdhbnQgeW91ciByZW1vdmFibGUgbWVkaWEg
dG8gYmUKKwltb3VudGVkLiAKKwkKK1dBUk5JTkc6IElmIHlvdSBnZXQgZXJyb3JzIHdpdGggR0ND
IDMuNC5YIG9yIGF2b2JlIHdpdGggaW5saW5lIG9uIHN1YmZzLmMKK3JlcGxhY2UgYWxsIGluc3Rh
bmNlcyBvZiAiaW5saW5lIiBieSAiIiAobm90aGluZykgYW5kIGdvIGFoZWFkLgorW3VwZGF0ZWQg
Zm9yIGtlcm5lbCAyLjYuWCBieSBtYWRndXNAZ21haWwuY29tXQorTWFueSB0aGFua3MgdG86CitS
b2JlcnQgU29tYnJ1dHpraSA8c29tYnJ1dHpAaW5mb3JtYXRpay5odS1iZXJsaW4uZGU+CitBbGV4
YW5kcmUgVGVpeGVpcmEgPGFsZXhhbmRyZUBpbnNpZ25lc29mdHdhcmUuY29tPgorS2VpdGggU21p
dGggPGtlaXRoQGtzbWl0aC5jb20+CitFbmdsaXNoCitbaHR0cDovL3d3dy5jb21wdW5hdXRhLmNv
bS9mb3J1bXMvbGludXgvaW5zdGFsYXJsaW51eC9zdXBlcm1vdW50X2VuLmh0bWxdCitFc3Bh8W9s
CitbaHR0cDovL3d3dy5jb21wdW5hdXRhLmNvbS9mb3J1bXMvbGludXgvaW5zdGFsYXJsaW51eC9z
dXBlcm1vdW50X2VzLmh0bWxdCisKK1dBUk5JTkc6IGluIHRoZSBhYm92ZSBkZXNjcmlwdGlvbiBg
bm9uZScgaXMgbGl0ZXJhbCB3b3JkLiBXaGlsZSBkZXZpY2UKK2lzIGlnbm9yZWQgYnkgc3VwZXJt
b3VudCBpdHNlbGYsIHVzaW5nIHJlYWwgZmlsZXMgaW4gdGhpcyBwbGFjZSAocmVhbAorZGV2aWNl
IG5hbWUgb3IgbW91bnQgcG9pbnQgZGlyZWN0b3J5IG5hbWUpIGlzIGtub3duIHRvIGNhdXNlIHBy
b2JsZW1zLgorU29tZSBwcm9ncmFtcyAtIGZ1c2VyIGlzIG9uZSBvZiB0aGVtIC0gd2lsbCB0cnkg
dG8gZGVzY2VuZCBpbnRvIGZpbGVzeXN0ZW0KK2lmIGRldiBjYW4gYmUgc3RhdHRlZCwgdGh1cyBt
YWtpbmcgc3VwZXJtb3VudCB0byBhdHRlbXB0IHRvIGFjY2VzcyBtZWRpYS4KK1RoaXMgaXMgYW5u
b3lpbmcgYXQgYmVzdCAtIGluIHRoZSB3b3JzdCBjYXNlIGl0IGNhbiB0YWtlIHZlcnkgbG9uZyB0
aW1lCitkdXJpbmcgc3RhcnR1cCBvciBzaHV0ZG93bi4KKworTm90aWNlIHRoYXQgeW91IGRvIG5v
dCBkaXJlY3RseSBzcGVjaWZ5IHRoZSBibG9jayBkZXZpY2UgeW91IGFyZSBnb2luZwordG8gbW91
bnQgb24gdGhlIG1vdW50IGNvbW1hbmQgbGluZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3VwZXJt
b3VudAorZmlsZXN5c3RlbSBpcyBOT1QgY29ubmVjdGVkIHRvIGEgYmxvY2sgZGV2aWNlOyByYXRo
ZXIsIHN1cGVybW91bnQgaXMKK3Jlc3BvbnNpYmxlIGZvciBjb25uZWN0aW5nIGEgc2VwYXJhdGUg
ZmlsZXN5c3RlbSB0byB0aGUgYmxvY2sgZGV2aWNlLgorWW91IHNwZWNpZnkgdGhlIHN1Yi1maWxl
c3lzdGVtIGFuZCBibG9jayBkZXZpY2UgbmFtZSBieSBwcm92aWRpbmcgdGhlCis8c3VwZXJmcy1v
cHRpb25zPiBmaWVsZCwgd2hlcmUgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBjdXJyZW50bHkK
K3JlY29nbmlzZWQ6CisKKworKiBmcz08ZmlsZXN5c3RlbS10eXBlPgkJCVtkZWZhdWx0IGlzICJh
dXRvIl0KKworCVNwZWNpZnkgdGhlIHN1YmZpbGVzeXN0ZW0gdHlwZS4gTm90IGV2ZXJ5IGZpbGVz
eXN0ZW0gdHlwZSBoYXMKK2JlZW4gdGVzdGVkLiAgSWYgeW91IHVzZSBgYXV0bycsIGl0IHdpbGwg
dHJ5IHRoZSBmb2xsb3dpbmcgZmlsZXN5c3RlbXMKK2luIG9yZGVyOgorCQkgICAgCSJ1ZGYiCisJ
CQkiaXNvOTY2MCIKKwkJCSJleHQyIgorCQkJInZmYXQiCisJCQkibXNkb3MiCisKK0l0IGlzIGFs
c28gcG9zc2libGUgdG8gZ2l2ZSBsaXN0IG9mIHR5cGVzIHNlcGFyYXRlZCBieSBgOicsIGxpa2UK
KworCQlmcz1leHQyOnZmYXQKKwkJICAgIC0gb3IgLQorCQlmcz11ZGY6aXNvOTY2MAorIAorCisq
IGRldj08YmxvY2stZGV2aWNlPgkJCVtubyBkZWZhdWx0LCBtYW5kYXRvcnldCisKKwlTcGVjaWZ5
IHRoZSBibG9jayBkZXZpY2Ugb24gd2hpY2ggdGhlIHN1YmZzIGlzIHRvIGJlIG1vdW50ZWQuCisK
KworKiB0cmF5X2xvY2s9e2Fsd2F5cyxvbndyaXRlLG5ldmVyfQlbZGVmYXVsdCBpcyAib253cml0
ZSJdCisKKwlTcGVjaWZ5IHdoZW4gc3VwZXJtb3VudCBpcyB0byBwcmV2ZW50IG1lZGlhIHJlbW92
YWwuIGBhbHdheXMnIG1lYW5zCitvbiBldmVyeSBhY2Nlc3MgKGl0IHdhcyBkZWZhdWx0IGluIGVh
cmxpZXIgdmVyc2lvbnMpLCBgb253cml0ZScgbWVhbnMgb25seQorZm9yIHdyaXRlIGFjY2VzcyBh
bmQgYG5ldmVyJyBtZWFucyBuZXZlciA6KSBgb253cml0ZScgYW5kIGBuZXZlcicgYXJlIHRoZQor
c2FtZSBmb3Igcm8gbWVkaWEgbGlrZSBDRC1ST00uIEl0IGlzIG5vdCBjbGVhciB3aGVuIGBuZXZl
cicgaXMgYWN0dWFsbHkgdXNlZnVsLAoraXQgaXMgcHJlc2VudGVkIGZvciBjb21wbGV0ZW5lc3Mg
b25seS4KKworKiBkZWJ1Z1s9PGJpdG1hcD5dCQkJW2RlZmF1bHQgaXMgbm8gZGVidWddCisKKwlF
bmFibGUgZGVidWdnaW5nIGNvZGUgaW4gdGhlIHN1cGVybW91bnQgZmlsZXN5c3RlbSwgaWYKK3Ro
ZSBkZWJ1ZyBvcHRpb24gd2FzIGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lLiAgQnkgZGVmYXVsdCwg
ZGVidWdnaW5nCitjb2RlIGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCBidXQgaXMgZGlzYWJs
ZWQgdW50aWwgYSBkZWJ1ZyBtb3VudAorb3B0aW9uIGlzIHNlZW4uIDxiaXRtYXA+IGlzIHRoZSBj
b21iaW5hdGlvbiBvZiBkZWJ1ZyBmbGFncywgZm9sbG93aW5nCitmbGFncyBhcmUgcG9zc2libGU6
CisKKwkweDAwMSAtICJnZW5lcmljIiBkZWJ1ZyAodXNlZCBieSBzdXBlcm1vdW50X2RlYnVnKSAt
IGRlZmF1bHQKKwkweDAwMiAtIHRyYWNlIGRlbnRyeS5jCisJMHgwMDQgLSB0cmFjZSBmaWxlLmMK
KwkweDAwOCAtIHRyYWNlIGZpbGVtYXAuYworCTB4MDEwIC0gdHJhY2UgbWVkaWFjdGwuYworCTB4
MDIwIC0gdHJhY2UgbmFtZWkuYworCTB4MDQwIC0gdHJhY2Ugc3ViZnMuYworCTB4MDgwIC0gdHJh
Y2Ugc3VwZXIuYworCitUcmFjZSBmbGFncyB0dXJuIG9uIHRyYWNpbmcgb2YgZnVuY3Rpb25zIGlu
IGNvcnJlcHNvbmRpbmcgZmlsZXMuCisiR2VuZXJpYyIgZGVidWcgZmxhZyBpcyB0ZXN0ZWQgaW4g
c3VwZXJtb3VudF9kZWJ1ZzsgZm9yIGNvbXBhdGliaWxpdHksCitpZiBubyBmbGFncyBhcmUgc3Bl
Y2lmaWVkLCB0aGlzIGZsYWcgaXMgc2V0LgorCisKKyogJy0tJworCisJQWxsIG9wdGlvbnMgYWZ0
ZXIgdGhlIG9wdGlvbiBzdHJpbmcgJy0tJyB3aWxsIGJlIHBhc3NlZAorZGlyZWN0bHkgdG8gdGhl
IHN1YmZpbGVzeXN0ZW0gd2hlbiBpdCBnZXRzIG1vdW50ZWQuCisKK0Vycm9ycworLS0tLS0tCisK
K0luIGFkZGl0aW9uIHRvICJub3JtYWwiIGVycm9ycyBkdXJpbmcgZmlsZSBvcGVyYXRpb25zIHN1
cGVybW91bnQgbWF5CityZXR1cm4gZm9sbG93aW5nIGVycm9yIGNvZGVzOgorCisqIE5vIG1lZGl1
bSBmb3VuZAorCisJWW91IGF0dGVtcHQgdG8gYWNjZXNzIHN1cGVybW91bnRlZCBmaWxlc3lzdGVt
IHdoZW4gdGhlcmUgaXMgbm8KK21lZGl1bSBpbnNlcnRlZAorCisqIFdyb25nIG1lZGl1bSB0eXBl
CisKKwkoTm90IHJlYWxseSBnZW5lcmF0ZWQgYnkgc3VwZXJtb3VudCkgWW91IGF0dGVtcHQgdG8g
bW91bnQgQ0QKK3dpdGhvdXQgZGF0YSB0cmFja3MKKworKiBTdGFsZSBORlMgZmlsZSBoYW5kbGUK
KworCVlvdSBhdHRlbXB0IHRvIHVzZSBmaWxlIGhhbmRsZSBhZnRlciBtZWRpdW0gaGFzIGJlZW4g
Y2hhbmdlZC4KKworKiBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzCisKKwkoTm90IHJlYWxseSBn
ZW5lcmF0ZWQgYnkgc3VwZXJtb3VudCkgZGV2aWNlIHNwZWNpZmllZCBpbgorZGV2PTxkZXZpY2U+
IG9wdGlvbiBkb2VzIG5vdCBleGlzdC4gQWxzbyBzb21lIGRyaXZlcnMgcmV0dXJuIHRoaXMKK2Vy
cm9yIGluc3RlYWQgb2YgIk5vIG1lZGl1bSBmb3VuZCIsIG9uZSBleGFtcGxlIGJlaW5nIGZsb3Bw
eSBkcml2ZXIuCisKKyogRGV2aWNlIG9yIHJlc291cmNlIGJ1c3kKKworCShOb3QgcmVhbGx5IGdl
bmVyYXRlZCBieSBzdXBlcm1vdW50KSBkZXZpY2UgaXMgYWxyZWFkeSBtb3VudGVkLgorU3VwZXJt
b3VudCBwcmV2ZW50cyBkb3VibGUgbW91bnQgZXZlbiBpZiBrZXJuZWwgb3RoZXJ3aXNlIHdvdWxk
IG1ha2UgaXQKK3Bvc3NpYmxlLgorCisqIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKworCShO
b3QgcmVhbGx5IGdlbmVyYXRlZCBieSBzdXBlcm1vdW50KSBmaWxlIG5hbWUgc3BlY2lmaWVkIGJ5
CitkZXY9PGRldmljZT4gb3B0aW9uIGRvZXMgbm90IGV4aXN0CisKKyogT3BlcmF0aW9uIG5vdCBw
ZXJtaXR0ZWQKKworCVlvdSBhdHRlbXB0IHRvIGFjY2VzcyBzdWJmcyB0aGF0IGlzIGN1cnJlbnRs
eSBkaXNhYmxlZAorCisvcHJvYyBzdXBwb3J0CistLS0tLS0tLS0tLS0tCisKK0lmIGtlcm5lbCBo
YXMgYmVlbiBjb21waWxlZCB3aXRoIHByb2NmcyBzdXBwb3J0LCBzdXBlcm1vdW50IHdpbGwgcHJv
dmlkZQorL3Byb2MgaW50ZXJmYWNlIHRvIHJlYWQgc3ViZnMgc3RhdHVzIGFuZCB0byBjb250cm9s
IHNvbWUgYXNwZWN0cyBvZiBzdWJmcy4KK1RoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGNyZWF0ZWQg
dW5kZXIgL3Byb2MvZnMvc3VwZXJtb3VudDoKKworKiB2ZXJzaW9uIChybykKKwlTaG93cyBzdXBl
cm1vdW50IHZlcnNpb24uCisKKyogc3ViZnMgKHJ3KQorCisJUmVhZGluZyB0aGlzIGZpbGUgcmV0
dXJucyBsaXN0IG9mIGFsbCBzdWJmcyBzdGF0dXMuIE9uZSBsaW5lIGZvcgorZXZlcnkgc3ViZnMg
aXMgcmV0dXJuZWQ7IHRoZSBmb3JtYXQgaXMKKwkKKwk8ZGV2bmFtZT4gZGlzYWJsZWQKKwkJLSBv
ciAtCisJPGRldm5hbWU+IHVubW91bnRlZAorCQktIG9yIC0KKwk8ZGV2bmFtZT4gbW91bnRlZCBy
ZWFkY291bnQgd3JpdGVjb3VudAorCit3aGVyZSA8ZGV2bmFtZT4gaXMgdGhlIHN0cmluZyBwYXNz
ZWQgaW4gYGRldj0nIHBhcmFtZXRlciBkdXJpbmcgbW91bnQuCitgcmVhZGNvdW50JyBpcyBudW1i
ZXIgb2YgY3VycmVudCBzdWJmcyAidXNlcnMiIG5lZWRpbmcgcm8gYWNjZXNzOyBgd3JpdGVjb3Vu
dCcKK2lzIHRoZSBudW1iZXIgb2YgInVzZXJzIiBuZWVkaW5nIHJ3IG1vZGUuIEl0IGlzIG1vc3Rs
eSB0aGUgbnVtYmVyIG9mIG9wZW4KK2ZpbGVzLCBidXQgaW5vZGUgb3BlcmF0aW9ucyBhbHNvIGFk
ZCB0byB0aGVzZSBjb3VudHMuIFRob3NlIG9wZXJhdGlvbnMKK2FyZSBub3JtYWxseSBzaG9ydC1s
aXZlZCB0byBiZSBzZWVuLgorCisJV3JpdGluZyB0aGlzIGZpbGUgY2hhbmdlcyBzdWJmcyBzdGF0
dXM7IHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlCitzdXBvcnRlZDoKKworCTxkZXZuYW1lPiBb
ZGlzYWJsZXxlbmFibGVdIFtyZWxlYXNlIFtmb3JjZV1dCisKK2BkaXNhYmxlJyB3aWxsIGRpc2Fi
bGUgc3ViZnMgKGkuZS4gYW55IGZ1dGhlciBhdHRlbXB0IHRvIG1vdW50IGlzIHJlamVjdGVkKS4K
K1N1YmZzIG11c3QgYmUgdW5tb3VudGVkOyB1c2UgYGRpc2FibGUgcmVsZWFzZScgb3IgYGRpc2Fi
bGUgcmVsZWFzZSBmb3JjZScgdG8KK3VubW91bnQgYW5kIGRpc2FibGUgYXQgdGhlIHNhbWUgdGlt
ZS4KKworYGVuYWJsZScgd2lsbCBlbmFibGUgZGlzYWJsZWQgc3ViZnMsIGl0IGhhcyBubyBlZmZl
Y3QgaWYgc3ViZnMgaXMgYWxyZWFkeQorZW5hYmxlZC4KKworYHJlbGVhc2UnIHdpbGwgdW5tb3Vu
dCBzdWJmcyB1bmxlc3MgaXQgaXMgYnVzeSAob3BlbmNvdW50ID4gMCkuIFRvIHVubW91bnQKK2J1
c3kgc3ViZnMgYWRkIGBmb3JjZSc7IHRoZSBlZmZlY3QgaXMgdmVyeSBtdWNoIGFzIGlmIG1lZGlh
IGNoYW5nZSBoYXMgYmVlbgorZGV0ZWN0ZWQgKHdpdGggdGhlIGRpZmZlcmVuY2UgdGhhdCBzdWJm
cyB3aWxsIGJlIGNsZWFubHkgdW5tb3VudGVkKS4KKworU29tZSBiYXNpYyBzYW5pdHkgY2hlY2tz
IGFyZSBwZXJmb3JtZWQsIGkuZS4gaXQgaXMgaW1wb3NzaWJsZSB0byBzcGVjaWZ5Citib3RoIGBl
bmFibGUnIGFuZCBgZGlzYWJsZScgb3IgYGZvcmNlJyB3aXRob3V0IGByZWxlYXNlJy4KKworSW50
ZXJuYWxzL0xvY2tpbmcKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RISVMgU0VDVElPTiBJUyBQUk9C
QUJMWSBJTkNPTVBMRVRFLiBDT1JSRUNUSU9OUyBBUkUgV0VMQ09NRS4KKworU3VwZXJtb3VudCBp
dHNlbGYgaXMgdXNpbmcgdHdvIGxvY2tzIGFuZCByZWxpZXMgb24gdHdvIG1vcmUgbG9ja2luZyBy
dWxlcworYXMgaW1wbGVtZW50ZWQgYnkga2VybmVsLgorCisqIHN1cGVybW91bnRfcHJvY19zZW0K
KworCUdsb2JhbCBtdXRleCB1c2VkIHRvIHByb3RlY3QgbGlzdCBvZiBzYmkgZHVyaW5nIGFjY2Vz
cyB0bworL3Byb2MvZnMvc3VwZXJtb3VudC9zdWJmcworCisqIHNiaS0+c2VtCisKKwlQZXItZmls
ZXN5c3RlbSBtdXRleCB0aGF0IHByb3RlY3RzIHN1YmZzIHN0YXRlIChtb3VudGVkL3VubW91bnRl
ZCkuCitBbnkgY2hhbmdlcyB0byBzdWJmcyBzdGF0ZSAobW91bnRpbmcsIHVubW91dGluZywgYWRk
aW5nIG9yIHJlbW92aW5nIGZpbGUsCitkZW50cnkgb3IgaW5vZGUpIGhhcHBlbiB1bmRlciB0aGlz
IG11dGV4LgorCisqIGlub2RlLT5pX3NlbSAoc2VlIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbS9M
b2NraW5nKQorCisJUGVyLWlub2RlIG11dGV4IHVzZWQgYnkgVkZTIHRvIHNlcmlhbGl6ZSBpbm9k
ZSB1bmxpbmsgb3BlcmF0aW9uLgorU3VwZXJtb3VudCByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBs
aW5rL3VubGluayBmb3IgYW4gaW5vZGUgYXJlIG11dHVhbGx5Citsb2NrZWQgYW5kIHRodXMgaW5v
ZGUtPmlfbmxpbmsgaXMgYXRvbWljIGluc2lkZSBvZiBmcyBtZXRob2QuCisKKyogQktMCisKKwlV
c2VkIHRvIHByb3RlY3QgZGV2aWNlIHVzYWdlIGNvdW50LiBJdCBpcyBjaGFuZ2VkIGluIG9wZW4v
cmVsZWFzZQorYW5kIHJlZmVyZW5jZWQgaW4gaW9jdGwgYWxsIG9mIHdoaWNoIHJ1biB1bmRlciBC
S0wuIFN1cGVybW91bnQgYWRkcyBtZWRpYWN0bAorYW5kIGludGVybmFsbHkgd3JhcHMgaXQgaW4g
QktMIGFzIHdlbGwuCisKK0NhdmVhdHMvQlVHUworLS0tLS0tLS0tLS0tCisKK0lub2RlIHRpbWVz
IGFyZSBiZWxpZXZlZCB0byBiZSBjb3JyZWN0bHkgdXBkYXRlZDsgc3RpbGwgaXQgaXMgcG9zc2li
bGUgdGhhdAorSSBtaXNzZWQgc29tZSBwb2ludC4KKworSWYgc3ViZnMgaXMgbm90IHlldCBtb3Vu
dGVkLCBmaW5kIC9tbnQvY2Ryb20gZmFpbHMgd2l0aCAiZmluZDogL21udC9jZHJvbQorY2hhbmdl
ZCBkdXJpbmcgZXhlY3V0aW9uIG9mIGZpbmQiLiBJdCBpcyB1bmxpa2VseSBpdCBjYW4gYmUgZml4
ZWQgaW4KK3N1cGVybW91bnQ7IG11Y2ggbW9yZSBzaW1wbGUgaXMgdG8gcHJvdmlkZSB3cmFwcGVy
IHRoYXQgd2lsbCBjaGVjayBpZiBzdWJmcworaXMgbW91bnRlZCBhbmQgZG8gc2ltcGxlICJ0b3Vj
aCAgL21udC9jZHJvbSIgaWYgbm90IHRvIG1ha2Ugc3VyZSBpdCBpcy4KKworU3VwZXJtb3VudCBh
dHRlbXB0cyB0byBjaGVjayBmb3IgY2hhbmdlZCBtZWRpYSBhdCBldmVyeSBvcGVyYXRpb24gYW5k
CitpbnZhbGlkYXRlIGFuZCB1bW91bnQgb2xkIHN1YmZzIHRvIGF2b2lkIG5ldyBtZWRpYSBjb3Jy
dXB0aW9uIGluIHJ3IGNhc2UuCitTdGlsbCBpdCBpcyBwb3NzaWJsZSB0aGF0IGtlcm5lbCB3aWxs
IHdyaXRlIG91dCBzdGFsZSBpbmZvcm1hdGlvbiBhbmQKK2l0IGlzIG91dHNpZGUgb2Ygc3VwZXJt
b3VudCBjb250cm9sLgorCitCeSBkZWZhdWx0IGNkcm9tIGRyaXZlciBkb2VzIG5vdCBjaGVjayBt
ZWRpYSB0eXBlIGkuZS4gc3VwZXJtb3VudCB3aWxsCit0cnkgYWxsIGNvbmZpZ3VyZWQgZnMgdHlw
ZXMgaW4gdHVybiB0aGF0IG1heSBiZSBxdWl0ZSB0aW1lIGNvbnN1bWluZy4KK1VzZSBzeXNjdGwg
LXcgZGV2LmNkcm9tLmNoZWNrX21lZGlhPTEgdG8gZW5hYmxlIGl0LiBDb21tZW50cyBpbiBjZHJv
bS5jCitpbmRpY2F0ZSB0aGF0IHNvbWUgKG5vbiBjb25mb3JtaW5nKSBzb2Z0d2FyZSBtYXkgaGF2
ZSBwcm9ibGVtcyB3aXRoIHRoaXMKK3NldHRpbmdzLiBZTU1WCisKZGlmZiAtdXJOIGxpbnV4LTIu
Ni4yNS40Lm9yaWcvZHJpdmVycy9jZHJvbS9jZHJvbS5jIGxpbnV4LTIuNi4yNS40L2RyaXZlcnMv
Y2Ryb20vY2Ryb20uYwotLS0gbGludXgtMi42LjI1LjQub3JpZy9kcml2ZXJzL2Nkcm9tL2Nkcm9t
LmMJMjAwOC0wNC0xOCAwMToyMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQvZHJpdmVycy9j
ZHJvbS9jZHJvbS5jCTIwMDgtMDUtMjAgMDE6Mjc6NTMgKzAzMDAKQEAgLTI4MCw2ICsyODAsNyBA
QAogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAj
aW5jbHVkZSA8bGludXgvdGltZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXBlcm1vdW50X21lZGlh
Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC0zNDQsNyArMzQ1LDcgQEAKICNk
ZWZpbmUgQ0RST01fREVGX1RJTUVPVVQJKDcgKiBIWikKIAogLyogTm90LWV4cG9ydGVkIHJvdXRp
bmVzLiAqLwotc3RhdGljIGludCBvcGVuX2Zvcl9kYXRhKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5m
byAqIGNkaSk7CitzdGF0aWMgaW50IG9wZW5fZm9yX2RhdGEoc3RydWN0IGNkcm9tX2RldmljZV9p
bmZvICogY2RpLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKIHN0YXRpYyBpbnQgY2hlY2tf
Zm9yX2F1ZGlvX2Rpc2Moc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICogY2RpLAogCQkJIHN0cnVj
dCBjZHJvbV9kZXZpY2Vfb3BzICogY2RvKTsKIHN0YXRpYyB2b2lkIHNhbml0aXplX2Zvcm1hdCh1
bmlvbiBjZHJvbV9hZGRyICphZGRyLCAKQEAgLTEwMDcsNyArMTAwOCw3IEBACiAJaWYgKChmcC0+
Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmIChjZGktPm9wdGlvbnMgJiBDRE9fVVNFX0ZGTEFHUykp
IHsKIAkJcmV0ID0gY2RpLT5vcHMtPm9wZW4oY2RpLCAxKTsKIAl9IGVsc2UgewotCQlyZXQgPSBv
cGVuX2Zvcl9kYXRhKGNkaSk7CisJCXJldCA9IG9wZW5fZm9yX2RhdGEoY2RpLCBpcC0+aV9iZGV2
KTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyOwogCQljZHJvbV9tbWMzX3Byb2ZpbGUoY2RpKTsK
QEAgLTEwNDMsNyArMTA0NCw3IEBACiB9CiAKIHN0YXRpYwotaW50IG9wZW5fZm9yX2RhdGEoc3Ry
dWN0IGNkcm9tX2RldmljZV9pbmZvICogY2RpKQoraW50IG9wZW5fZm9yX2RhdGEoc3RydWN0IGNk
cm9tX2RldmljZV9pbmZvICogY2RpLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQogewogCWlu
dCByZXQ7CiAJc3RydWN0IGNkcm9tX2RldmljZV9vcHMgKmNkbyA9IGNkaS0+b3BzOwpAQCAtMTEy
OCw3ICsxMTI5LDggQEAKIAkJY2RpbmZvKENEX09QRU4sICJvcGVuIGRldmljZSBmYWlsZWQuXG4i
KTsgCiAJCWdvdG8gY2xlYW5fdXBfYW5kX3JldHVybjsKIAl9Ci0JaWYgKENEUk9NX0NBTihDRENf
TE9DSykgJiYgKGNkaS0+b3B0aW9ucyAmIENET19MT0NLKSkgeworCWlmIChDRFJPTV9DQU4oQ0RD
X0xPQ0spICYmIChjZGktPm9wdGlvbnMgJiBDRE9fTE9DSykgJiYKKwkgICAgc3VwZXJtb3VudF91
c2FnZV9jb3VudChiZGV2LCBjZGktPnVzZV9jb3VudCkgPiAwKSB7CiAJCQljZG8tPmxvY2tfZG9v
cihjZGksIDEpOwogCQkJY2RpbmZvKENEX09QRU4sICJkb29yIGxvY2tlZC5cbiIpOwogCX0KQEAg
LTEyMjAsNyArMTIyMiw4IEBACiAJCWNkaW5mbyhDRF9DTE9TRSwgIlVzZSBjb3VudCBmb3IgXCIv
ZGV2LyVzXCIgbm93IHplcm9cbiIsIGNkaS0+bmFtZSk7CiAJCWNkcm9tX2R2ZF9yd19jbG9zZV93
cml0ZShjZGkpOwogCi0JCWlmICgoY2RvLT5jYXBhYmlsaXR5ICYgQ0RDX0xPQ0spICYmICFrZWVw
bG9ja2VkKSB7CisJCWlmICghc3VwZXJtb3VudF91c2FnZV9jb3VudChmcCA/IGZwLT5mX2RlbnRy
eS0+ZF9pbm9kZS0+aV9iZGV2IDogMCwgY2RpLT51c2VfY291bnQpICYmCisJCSAgICAoY2RvLT5j
YXBhYmlsaXR5ICYgQ0RDX0xPQ0spICYmICFrZWVwbG9ja2VkKSB7CiAJCQljZGluZm8oQ0RfQ0xP
U0UsICJVbmxvY2tpbmcgZG9vciFcbiIpOwogCQkJY2RvLT5sb2NrX2Rvb3IoY2RpLCAwKTsKIAkJ
fQpAQCAtMTQ5NCw2ICsxNDk3LDM4IEBACiAJCXRyYWNrcy0+Y2RpLCB0cmFja3MtPnhhKTsKIH0J
CiAKKyNpZiBkZWZpbmVkKENPTkZJR19TVVBFUk1PVU5UKSB8fCBkZWZpbmVkKENPTkZJR19TVVBF
Uk1PVU5UX01PRFVMRSkKKy8qCisgKiBNRURJQV9MT0NLLCBNRURJQV9VTkxPQ0sKKyAqICAgb3B0
YXJnID09IDAgLSBkbyBub3QgYWRqdXN0IHVzYWdlIGNvdW50IChjb21wYXRpYmlsaXR5KQorICog
ICBvcHRhcmcgPT0gMSAtIGFkanVzdCB1c2FnZSBjb3VudAorICovCitpbnQgY2Ryb21fbWVkaWFj
dGwoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIHN0cnVjdCBibG9ja19kZXZpY2UgKmJk
ZXYsIGludCBvcCwgaW50IG9wdGFyZykKK3sKKwlzdHJ1Y3QgY2Ryb21fZGV2aWNlX29wcyAqY2Rv
ID0gY2RpLT5vcHM7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBNRURJQV9MT0NLOgorCWNhc2Ug
TUVESUFfVU5MT0NLOgorCQlpZiAob3AgPT0gTUVESUFfVU5MT0NLICYmIG9wdGFyZykgeworCQkJ
Y2RpLT51c2VfY291bnQtLTsKKwkJaWYgKGNkaS0+dXNlX2NvdW50IDwgMCkKKwkJCWNkaS0+dXNl
X2NvdW50ID0gMDsKKwkJfQorCQlpZiAoY2RvLT5jYXBhYmlsaXR5ICYgfmNkaS0+bWFzayAmIENE
Q19MT0NLICYmCisJCSAgICBjZGktPm9wdGlvbnMgJiBDRE9fTE9DSyAmJgorCQkJc3VwZXJtb3Vu
dF91c2FnZV9jb3VudChiZGV2LCBjZGktPnVzZV9jb3VudCkgPT0gMCkKKwkJCWNkby0+bG9ja19k
b29yKGNkaSwgKG9wID09IE1FRElBX0xPQ0spKTsKKwkJaWYgKG9wID09IE1FRElBX0xPQ0sgJiYg
b3B0YXJnKQorCQkJY2RpLT51c2VfY291bnQrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0
dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKIC8qIFJlcXVlc3RzIHRv
IHRoZSBsb3ctbGV2ZWwgZHJpdmVycyB3aWxsIC9hbHdheXMvIGJlIGRvbmUgaW4gdGhlCiAgICBm
b2xsb3dpbmcgZm9ybWF0IGNvbnZlbnRpb246CiAKQEAgLTIyMzcsMTQgKzIyNzIsMTggQEAKIAly
ZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjZHJvbV9pb2N0bF9lamVjdChzdHJ1Y3QgY2Ryb21f
ZGV2aWNlX2luZm8gKmNkaSkKK3N0YXRpYyBpbnQgY2Ryb21faW9jdGxfZWplY3Qoc3RydWN0IGNk
cm9tX2RldmljZV9pbmZvICpjZGksIHN0cnVjdCBpbm9kZSAqaXApCiB7CiAJY2RpbmZvKENEX0RP
X0lPQ1RMLCAiZW50ZXJpbmcgQ0RST01FSkVDVFxuIik7CiAKIAlpZiAoIUNEUk9NX0NBTihDRENf
T1BFTl9UUkFZKSkKIAkJcmV0dXJuIC1FTk9TWVM7Ci0JaWYgKGNkaS0+dXNlX2NvdW50ICE9IDEg
fHwga2VlcGxvY2tlZCkKLQkJcmV0dXJuIC1FQlVTWTsKKy8vCWlmIChjZGktPnVzZV9jb3VudCAh
PSAxIHx8IGtlZXBsb2NrZWQpCisvLwkJcmV0dXJuIC1FQlVTWTsKKwkJaWYgKGtlZXBsb2NrZWQg
fHwKKwkJICAgIChzdXBlcm1vdW50X3VzYWdlX2NvdW50KGlwLT5pX2JkZXYsY2RpLT51c2VfY291
bnQpICE9IDEpKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKwogCWlmIChD
RFJPTV9DQU4oQ0RDX0xPQ0spKSB7CiAJCWludCByZXQgPSBjZGktPm9wcy0+bG9ja19kb29yKGNk
aSwgMCk7CiAJCWlmIChyZXQpCkBAIC0yNzEzLDcgKzI3NTIsNyBAQAogCWNhc2UgQ0RST01NVUxU
SVNFU1NJT046CiAJCXJldHVybiBjZHJvbV9pb2N0bF9tdWx0aXNlc3Npb24oY2RpLCBhcmdwKTsK
IAljYXNlIENEUk9NRUpFQ1Q6Ci0JCXJldHVybiBjZHJvbV9pb2N0bF9lamVjdChjZGkpOworCQly
ZXR1cm4gY2Ryb21faW9jdGxfZWplY3QoY2RpLGlwKTsKIAljYXNlIENEUk9NQ0xPU0VUUkFZOgog
CQlyZXR1cm4gY2Ryb21faW9jdGxfY2xvc2V0cmF5KGNkaSk7CiAJY2FzZSBDRFJPTUVKRUNUX1NX
OgpAQCAtMzI3MCw2ICszMzA5LDkgQEAKIEVYUE9SVF9TWU1CT0woY2Ryb21fcmVsZWFzZSk7CiBF
WFBPUlRfU1lNQk9MKGNkcm9tX2lvY3RsKTsKIEVYUE9SVF9TWU1CT0woY2Ryb21fbWVkaWFfY2hh
bmdlZCk7CisjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJNT1VOVCkgfHwgZGVmaW5lZChDT05GSUdf
U1VQRVJNT1VOVF9NT0RVTEUpCitFWFBPUlRfU1lNQk9MKGNkcm9tX21lZGlhY3RsKTsKKyNlbmRp
ZgogRVhQT1JUX1NZTUJPTChjZHJvbV9udW1iZXJfb2Zfc2xvdHMpOwogRVhQT1JUX1NZTUJPTChj
ZHJvbV9tb2RlX3NlbGVjdCk7CiBFWFBPUlRfU1lNQk9MKGNkcm9tX21vZGVfc2Vuc2UpOwpkaWZm
IC11ck4gbGludXgtMi42LjI1LjQub3JpZy9kcml2ZXJzL2lkZS9pZGUtY2QuYyBsaW51eC0yLjYu
MjUuNC9kcml2ZXJzL2lkZS9pZGUtY2QuYwotLS0gbGludXgtMi42LjI1LjQub3JpZy9kcml2ZXJz
L2lkZS9pZGUtY2QuYwkyMDA4LTA0LTE4IDAxOjIwOjAzICswMzAwCisrKyBsaW51eC0yLjYuMjUu
NC9kcml2ZXJzL2lkZS9pZGUtY2QuYwkyMDA4LTA1LTIwIDAxOjI3OjUzICswMzAwCkBAIC00MCwx
MCArNDAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2Nz
aS5oPgkvKiBGb3IgU0NTSSAtPiBBVEFQSSBjb21tYW5kIGNvbnZlcnNpb24gKi8KLQogI2luY2x1
ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9y
ZGVyLmg+CisjaW5jbHVkZSA8bGludXgvc3VwZXJtb3VudF9tZWRpYS5oPgogI2luY2x1ZGUgPGFz
bS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCkBAIC0yMTA2LDYgKzIx
MDYsMjUgQEAKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2s7
CiAJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBpZGVfY2RfZyhkaXNrKTsKIAorI2lmIGRlZmlu
ZWQoQ09ORklHX1NVUEVSTU9VTlQpIHx8IGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlRfTU9EVUxF
KQorCS8qCisJICogVGhpcyBpcyB0aGUgc2FtZSBzb3J0IG9mIGNsb2NrbG9hZCBhcyB1c2UgaW4g
YmxrZGV2X2dldC4KKwkgKiBXZSBuZWVkIGluZm9ybWF0aW9uIHdoZXRoZXIgZGV2aWNlIGlzIHN1
cGVybW91bnRlZCBpbnNpZGUKKwkgKiBvZiBjZHJvbV9yZWxlYXNlIHRvIGRlY2lkZSBpZiB0cmF5
IG11c3QgYmUgdW5sb2NrZWQuCisJICogVGhpcyBpbmZvcm1hdGlvbiBzbyBmYXIgaXMgYXZhaWxh
YmxlIG9ubHkgYnkgbG9va2luZworCSAqIHVwIHN1cGVyYmxvY2sgYnV0IGl0IG5lZWRzIHN0cnVj
dCAqYmRldiBhbmQgaXQgaXMgbm90CisJICogYXZhaWxhYmxlIGluIGNkcm9tX3JlbGVhc2UgYW55
bW9yZQorCSAqLworCXN0cnVjdCBkZW50cnkgdF9kZW50cnk7CisJc3RydWN0IGZpbGUgdF9maWxl
OworCisJaWYgKCFmaWxlKSB7CisJCXRfZmlsZS5mX2RlbnRyeSA9ICZ0X2RlbnRyeTsKKwkJdF9k
ZW50cnkuZF9pbm9kZSA9IGlub2RlOworCQlmaWxlID0gJnRfZmlsZTsKKwl9CisjZW5kaWYKKwog
CWNkcm9tX3JlbGVhc2UgKCZpbmZvLT5kZXZpbmZvLCBmaWxlKTsKIAogCWlkZV9jZF9wdXQoaW5m
byk7CkBAIC0yMTkwLDYgKzIyMDksMzggQEAKIAogCXJldHVybiAgMDsKIH0KKyNpZiBkZWZpbmVk
KENPTkZJR19TVVBFUk1PVU5UKSB8fCBkZWZpbmVkKENPTkZJR19TVVBFUk1PVU5UX01PRFVMRSkK
Ky8qCitNQURHVVM6IEFKSkpKIFBMRUFTRSBSRUFEIERUSEUgTEtNTCBBQk9VVCBORVcgU1RVRkZT
CitzdGF0aWMgaW50IGlkZWNkX21lZGlhY3RsKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGlu
dCBvcCwgaW50IGFyZykKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGJkZXYtPmJkX2Rpc2s7
CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gZGlzay0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjZHJv
bV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXJldHVybiBjZHJvbV9tZWRpYWN0
bCgmaW5mby0+ZGV2aW5mbywgYmRldiwgb3AsIGFyZyk7CisJCisJc3RydWN0IGNkcm9tX2luZm8g
KmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJCisJQ0RST01fU1RBVEVfRkxBR1MgKGRyaXZl
KS0+bWVkaWFfY2hhbmdlZCA9IDE7CisJQ0RST01fU1RBVEVfRkxBR1MgKGRyaXZlKS0+dG9jX3Zh
bGlkID0gMDsKKwlpbmZvLT5uc2VjdG9yc19idWZmZXJlZCA9IDA7CisKK30qLworc3RhdGljIGlu
dCBpZGVjZF9tZWRpYWN0bChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBpbnQgb3AsIGludCBh
cmcpCit7CisJLy9zdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGJkZXYtPmJkX2Rpc2s7IC8vdGhpcyBk
ZWYgd29ya3MKKwlyZXR1cm4gMDsKKwkvKgorCUZJWE1FOiBzb21lIG9mIHRoaXMgdHdvIGRlZnMs
IGdvZXMgaW50byBQYWdlIEZhdWx0cworCVRoZXJlIGFyZSBhIGxvdCBvZiBjb250cm9scyBvdmVy
IENEX1JPTSBkaXNhYmxpbmcgZm9yIGEgd2hpbGUKKwkKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSBk
aXNrLT5wcml2YXRlX2RhdGE7CisJCQkgICAgLy9pbmZvLT5kcml2ZTsKKwlzdHJ1Y3QgY2Ryb21f
aW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlyZXR1cm4gY2Ryb21fbWVkaWFjdGwo
JmluZm8tPmRldmluZm8sIGJkZXYsIG9wLCBhcmcpOworCSovCit9CisjZW5kaWYKIAogc3RhdGlj
IHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBpZGVjZF9vcHMgPSB7CiAJLm93bmVyCQk9
IFRISVNfTU9EVUxFLApAQCAtMjE5Nyw3ICsyMjQ4LDExIEBACiAJLnJlbGVhc2UJPSBpZGVjZF9y
ZWxlYXNlLAogCS5pb2N0bAkJPSBpZGVjZF9pb2N0bCwKIAkubWVkaWFfY2hhbmdlZAk9IGlkZWNk
X21lZGlhX2NoYW5nZWQsCi0JLnJldmFsaWRhdGVfZGlzaz0gaWRlY2RfcmV2YWxpZGF0ZV9kaXNr
CisJLnJldmFsaWRhdGVfZGlzaz0gaWRlY2RfcmV2YWxpZGF0ZV9kaXNrLAorI2lmIGRlZmluZWQo
Q09ORklHX1NVUEVSTU9VTlQpIHx8IGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlRfTU9EVUxFKQor
CS5tZWRpYWN0bAk9IGlkZWNkX21lZGlhY3RsLAorI2VuZGlmCisKIH07CiAKIC8qIG9wdGlvbnMg
Ki8KZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40Lm9yaWcvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5j
IGxpbnV4LTIuNi4yNS40L2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwotLS0gbGludXgtMi42LjI1
LjQub3JpZy9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMJMjAwOC0wNC0xOCAwMToyMDowMyArMDMw
MAorKysgbGludXgtMi42LjI1LjQvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCTIwMDgtMDUtMjAg
MDE6Mjk6MjkgKzAzMDAKQEAgLTM2LDYgKzM2LDggQEAKIAogI2luY2x1ZGUgPHNjc2kvc2NzaV9p
b2N0bC5oPgogCisjaW5jbHVkZSA8bGludXgvc3VwZXJtb3VudF9tZWRpYS5oPgorCiAjaW5jbHVk
ZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxp
bnV4L3VhY2Nlc3MuaD4KQEAgLTE0MzksNyArMTQ0MSw3IEBACiAKIAlmbG9wcHktPm9wZW5lcnMr
KzsKIAotCWlmIChmbG9wcHktPm9wZW5lcnMgPT0gMSkgeworCWlmIChzdXBlcm1vdW50X3VzYWdl
X2NvdW50KGlub2RlLT5pX2JkZXYsIGZsb3BweS0+b3BlbmVycykgPT0gMSkgewogCQlmbG9wcHkt
PmZsYWdzICY9IH5JREVGTE9QUFlfRkxBR19GT1JNQVRfSU5fUFJPR1JFU1M7CiAJCS8qIEp1c3Qg
aW4gY2FzZSAqLwogCkBAIC0xNDkzLDcgKzE0OTUsNyBAQAogCiAJZGVidWdfbG9nKCJSZWFjaGVk
ICVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoZmxvcHB5LT5vcGVuZXJzID09IDEpIHsKKyAJaWYg
KHN1cGVybW91bnRfdXNhZ2VfY291bnQoaW5vZGUtPmlfYmRldiwgZmxvcHB5LT5vcGVuZXJzKSA9
PSAxKSB7CiAJCS8qIElPTUVHQSBDbGlrISBkcml2ZXMgZG8gbm90IHN1cHBvcnQgbG9jay91bmxv
Y2sgY29tbWFuZHMgKi8KIAkJaWYgKCEoZmxvcHB5LT5mbGFncyAmIElERUZMT1BQWV9GTEFHX0NM
SUtfRFJJVkUpKSB7CiAJCQlpZGVmbG9wcHlfY3JlYXRlX3ByZXZlbnRfY21kKCZwYywgMCk7CkBA
IC0xNTIyLDkgKzE1MjQsMTAgQEAKIH0KIAogc3RhdGljIGludCBpZGVfZmxvcHB5X2xvY2tkb29y
KGlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5LCBpZGVmbG9wcHlfcGNfdCAqcGMsCisJCQkgICAg
ICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFy
ZywgdW5zaWduZWQgaW50IGNtZCkKIHsKLQlpZiAoZmxvcHB5LT5vcGVuZXJzID4gMSkKKwlpZiAo
c3VwZXJtb3VudF91c2FnZV9jb3VudChiZGV2LCBmbG9wcHktPm9wZW5lcnMpID4gMSkKIAkJcmV0
dXJuIC1FQlVTWTsKIAogCS8qIFRoZSBJT01FR0EgQ2xpayEgRHJpdmUgZG9lc24ndCBzdXBwb3J0
IHRoaXMgY29tbWFuZCAtCkBAIC0xNjEwLDcgKzE2MTMsNyBAQAogCWNhc2UgQ0RST01FSkVDVDoK
IAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBDRFJPTV9MT0NLRE9PUjoKLQkJcmV0dXJuIGlk
ZV9mbG9wcHlfbG9ja2Rvb3IoZmxvcHB5LCAmcGMsIGFyZywgY21kKTsKKwkJcmV0dXJuIGlkZV9m
bG9wcHlfbG9ja2Rvb3IoZmxvcHB5LCAmcGMsIGJkZXYsIGFyZywgY21kKTsKIAljYXNlIElERUZM
T1BQWV9JT0NUTF9GT1JNQVRfU1VQUE9SVEVEOgogCQlyZXR1cm4gMDsKIAljYXNlIElERUZMT1BQ
WV9JT0NUTF9GT1JNQVRfR0VUX0NBUEFDSVRZOgpAQCAtMTY2Miw2ICsxNjY1LDM4IEBACiAJc2V0
X2NhcGFjaXR5KGRpc2ssIGlkZWZsb3BweV9jYXBhY2l0eShmbG9wcHktPmRyaXZlKSk7CiAJcmV0
dXJuIDA7CiB9CisjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJNT1VOVCkgfHwgZGVmaW5lZChDT05G
SUdfU1VQRVJNT1VOVF9NT0RVTEUpCitzdGF0aWMgaW50IGlkZWZsb3BweV9tZWRpYWN0bCAoc3Ry
dWN0IGJsb2NrX2RldmljZSAqYmRldiwgaW50IG9wLCBpbnQgb3B0YXJnKQoreworCWlkZV9kcml2
ZV90ICpkcml2ZSA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwlpZGVmbG9wcHlfZmxv
cHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpZGVmbG9wcHlfcGNfdCBwYzsK
KworICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICAgY2FzZSBNRURJQV9MT0NLOgorICAg
ICAgICAgICAgIGNhc2UgTUVESUFfVU5MT0NLOgorICAgICAgICAgICAgICAgICAgICAgaWYgKG9w
ID09IE1FRElBX1VOTE9DSyAmJiBvcHRhcmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZmxvcHB5LT5vcGVuZXJzLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChm
bG9wcHktPm9wZW5lcnMgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGZsb3BweS0+b3BlbmVycyA9IDA7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgICAvKiBJT01FR0EgQ2xpayEgZHJpdmVzIGRvIG5vdCBzdXBwb3J0IGxvY2svdW5s
b2NrIGNvbW1hbmRzICovCisgICAgICAgICAgICAgICAgICAgICBpZiAoKGZsb3BweS0+ZmxhZ3Mg
JiBJREVGTE9QUFlfRkxBR19DTElLX0RSSVZFKQorICAgICAgICAgICAgICAgICAgICAgICAgICYm
IHN1cGVybW91bnRfdXNhZ2VfY291bnQoYmRldiwgZmxvcHB5LT5vcGVuZXJzKSA9PSAwKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZWZsb3BweV9jcmVhdGVfcHJldmVudF9jbWQo
JnBjLCAob3AgPT0gTUVESUFfTE9DSykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
dm9pZCkgaWRlZmxvcHB5X3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYyk7CisgICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPT0gTUVESUFfTE9DSyAmJiBv
cHRhcmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3BweS0+b3BlbmVycysrOwor
ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICB9CisgICAgIHJldHVybiAwOwor
fQorI2VuZGlmCisKKwogCiBzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGlk
ZWZsb3BweV9vcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLApAQCAtMTY3MCw3ICsxNzA1
LDEwIEBACiAJLmlvY3RsCQk9IGlkZWZsb3BweV9pb2N0bCwKIAkuZ2V0Z2VvCQk9IGlkZWZsb3Bw
eV9nZXRnZW8sCiAJLm1lZGlhX2NoYW5nZWQJPSBpZGVmbG9wcHlfbWVkaWFfY2hhbmdlZCwKLQku
cmV2YWxpZGF0ZV9kaXNrPSBpZGVmbG9wcHlfcmV2YWxpZGF0ZV9kaXNrCisJLnJldmFsaWRhdGVf
ZGlzaz0gaWRlZmxvcHB5X3JldmFsaWRhdGVfZGlzaywKKyNpZiBkZWZpbmVkKENPTkZJR19TVVBF
Uk1PVU5UKSB8fCBkZWZpbmVkKENPTkZJR19TVVBFUk1PVU5UX01PRFVMRSkKKwkubWVkaWFjdGwJ
PSBpZGVmbG9wcHlfbWVkaWFjdGwsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgaWRlX2Zsb3Bw
eV9wcm9iZShpZGVfZHJpdmVfdCAqZHJpdmUpCmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC5vcmln
L2RyaXZlcnMvc2NzaS9zci5jIGxpbnV4LTIuNi4yNS40L2RyaXZlcnMvc2NzaS9zci5jCi0tLSBs
aW51eC0yLjYuMjUuNC5vcmlnL2RyaXZlcnMvc2NzaS9zci5jCTIwMDgtMDQtMTggMDE6MjA6MDkg
KzAzMDAKKysrIGxpbnV4LTIuNi4yNS40L2RyaXZlcnMvc2NzaS9zci5jCTIwMDgtMDUtMjAgMDE6
Mjc6NTMgKzAzMDAKQEAgLTQ4OCw2ICs0ODgsMjcgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBz
Y3NpX2NkICpjZCA9IHNjc2lfY2QoaW5vZGUtPmlfYmRldi0+YmRfZGlzayk7CisJCisjaWYgZGVm
aW5lZChDT05GSUdfU1VQRVJNT1VOVCkgfHwgZGVmaW5lZChDT05GSUdfU1VQRVJNT1VOVF9NT0RV
TEUpCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBzYW1lIHNvcnQgb2YgY2xvY2tsb2FkIGFzIHVzZSBp
biBibGtkZXZfZ2V0LgorCSAqIFdlIG5lZWQgaW5mb3JtYXRpb24gd2hldGhlciBkZXZpY2UgaXMg
c3VwZXJtb3VudGVkIGluc2lkZQorCSAqIG9mIGNkcm9tX3JlbGVhc2UgdG8gZGVjaWRlIGlmIHRy
YXkgbXVzdCBiZSB1bmxvY2tlZC4KKwkgKiBUaGlzIGluZm9ybWF0aW9uIHNvIGZhciBpcyBhdmFp
bGFibGUgb25seSBieSBsb29raW5nCisJICogdXAgc3VwZXJibG9jayBidXQgaXQgbmVlZHMgc3Ry
dWN0ICpiZGV2IGFuZCBpdCBpcyBub3QKKwkgKiBhdmFpbGFibGUgaW4gY2Ryb21fcmVsZWFzZSBh
bnltb3JlCisJICovCisJc3RydWN0IGRlbnRyeSB0X2RlbnRyeTsKKwlzdHJ1Y3QgZmlsZSB0X2Zp
bGU7CisKKwlpZiAoIWZpbGUpIHsKKwkJdF9maWxlLmZfZGVudHJ5ID0gJnRfZGVudHJ5OworCQl0
X2RlbnRyeS5kX2lub2RlID0gaW5vZGU7CisJCWZpbGUgPSAmdF9maWxlOworCX0KKyNlbmRpZgor
CQorCQogCXJldCA9IGNkcm9tX3JlbGVhc2UoJmNkLT5jZGksIGZpbGUpOwogCWlmKHJldCkKIAkJ
cmV0dXJuIHJldDsKQEAgLTUzNyw2ICs1NTgsMTUgQEAKIAlyZXR1cm4gY2Ryb21fbWVkaWFfY2hh
bmdlZCgmY2QtPmNkaSk7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19TVVBFUk1PVU5UKSB8fCBk
ZWZpbmVkKENPTkZJR19TVVBFUk1PVU5UX01PRFVMRSkKK3N0YXRpYyBpbnQgc3JfYmxvY2tfbWVk
aWFjdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgaW50IG9wLCBpbnQgYXJnKQoreworCXN0
cnVjdCBnZW5kaXNrICpkaXNrID0gYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2Qg
PSBzY3NpX2NkKGRpc2spOworCXJldHVybiBjZHJvbV9tZWRpYWN0bCgmY2QtPmNkaSwgYmRldiwg
b3AsIGFyZyk7Cit9CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0
aW9ucyBzcl9iZG9wcyA9CiB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLApAQCAtNTQ0LDYgKzU3
NCw5IEBACiAJLnJlbGVhc2UJPSBzcl9ibG9ja19yZWxlYXNlLAogCS5pb2N0bAkJPSBzcl9ibG9j
a19pb2N0bCwKIAkubWVkaWFfY2hhbmdlZAk9IHNyX2Jsb2NrX21lZGlhX2NoYW5nZWQsCisjaWYg
ZGVmaW5lZChDT05GSUdfU1VQRVJNT1VOVCkgfHwgZGVmaW5lZChDT05GSUdfU1VQRVJNT1VOVF9N
T0RVTEUpCisJLm1lZGlhY3RsCT0gc3JfYmxvY2tfbWVkaWFjdGwsCisjZW5kaWYKIAkvKiAKIAkg
KiBObyBjb21wYXRfaW9jdGwgZm9yIG5vdyBiZWNhdXNlIHNyX2Jsb2NrX2lvY3RsIG5ldmVyCiAJ
ICogc2VlbXMgdG8gcGFzcyBhcmJpdGFyeSBpb2N0bHMgZG93biB0byBob3N0IGRyaXZlcnMuCmRp
ZmYgLXVyTiBsaW51eC0yLjYuMjUuNC5vcmlnL2ZzL2Jsb2NrX2Rldi5jIGxpbnV4LTIuNi4yNS40
L2ZzL2Jsb2NrX2Rldi5jCi0tLSBsaW51eC0yLjYuMjUuNC5vcmlnL2ZzL2Jsb2NrX2Rldi5jCTIw
MDgtMDQtMTggMDE6MjA6MTAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40L2ZzL2Jsb2NrX2Rldi5j
CTIwMDgtMDUtMjAgMDE6Mjc6NTMgKzAzMDAKQEAgLTg4MSwxMSArODgxLDQ2IEBACiAJc3RydWN0
IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOwogCXN0cnVjdCBibG9ja19kZXZpY2Vfb3Bl
cmF0aW9ucyAqIGJkb3BzID0gZGlzay0+Zm9wczsKIAorI2lmIGRlZmluZWQoQ09ORklHX1NVUEVS
TU9VTlQpIHx8IGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlRfTU9EVUxFKQorCXN0cnVjdCBzdXBl
cl9ibG9jayAqc2IgPSBOVUxMOworCWludCBzdXBlcm1vdW50ZWQgPSAwOworI2VuZGlmCisKIAlp
ZiAoIWJkb3BzLT5tZWRpYV9jaGFuZ2VkKQogCQlyZXR1cm4gMDsKIAlpZiAoIWJkb3BzLT5tZWRp
YV9jaGFuZ2VkKGJkZXYtPmJkX2Rpc2spKQogCQlyZXR1cm4gMDsKIAorI2lmIGRlZmluZWQoQ09O
RklHX1NVUEVSTU9VTlQpIHx8IGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlRfTU9EVUxFKQorCXNi
ID0gZ2V0X3N1cGVyKGJkZXYpOworCWlmIChzYikgeworCQlhdG9taWNfc2V0KCZzYi0+c19tZWRp
YV9jaGFuZ2VkLCAxKTsKKwkJc3VwZXJtb3VudGVkID0gc2ItPnNfZmxhZ3MgJiBNU19TVVBFUk1P
VU5URUQ7CisJCWRyb3Bfc3VwZXIoc2IpOworCX0KKworCS8qCisJICogU3VwZXJtb3VudCB1c2Vk
IHRvIGRpZCBpbnZhbGlkYXRlX2RldmljZSBmb2xsb3dlZCBieQorCSAqIGRlc3Ryb3lfYnVmZmVy
cy4gaW52YWxpZGF0ZV9kZXZpY2UgaGFyZGx5IGRvZXMgYW55dGhpbmcKKwkgKiB1c2VmdWwgaGVy
ZSBhcyBpdCB3b24ndCByZWFsbHkgaW52YWxpZGF0ZSAiYnVzeSIgaW5vZGVzCisJICogYW5kIGV2
ZXJ5IGlub2RlIGluIHN1YmZzIGlzIGJ1c3kgKGF0IGxlYXN0IG9uZSByZWZlcmVuY2UKKwkgKiBm
cm9tIHN1cGVyZnMgZXhpc3RzKS4gU28gbm93IGl0IGp1c3QgZmx1c2hlcworCSAqIGJ1ZmZlcnMg
c28gdGhleSBkbyBub3QgYWNjaWRlbnRhbGx5IG92ZXJ3cml0ZSBuZXdseQorCSAqIGluc2VydGVk
IG1lZGlhCisJICoKKwkgKiBGSVhNRSB1bmZvcnR1bmF0ZWx5IGR1cmluZyB1bW91bnQgVkZTIG1h
eSB3cml0ZSBvbiBpdHMKKwkgKiBvd24sIGxpa2Ugd3JpdGVfc3VwZXIuIFRob3NlIHdyaXRlcyB3
aWxsIGdvIHRvIGEgd3JvbmcKKwkgKiBtZWRpYSB0aHVzIGNvcnJ1cHRpbmcgaXQgOigKKwkgKgor
CSAqIFRoZXJlIGlzIG5vIGVycm9yIHByaW50IGJlY2F1c2Ugc3VwZXJtb3VudCB3YXJucyB1c2Vy
CisJICogaXRzZWxmLgorCSAqLworCisJaWYgKHN1cGVybW91bnRlZCkgeworCQlpbnZhbGlkYXRl
X2JkZXYoYmRldik7CisJfSBlbHNlCisjZW5kaWYKKwogCWlmIChfX2ludmFsaWRhdGVfZGV2aWNl
KGJkZXYpKQogCQlwcmludGsoIlZGUzogYnVzeSBpbm9kZXMgb24gY2hhbmdlZCBtZWRpYS5cbiIp
OwogCmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC5vcmlnL2ZzL2V4dDIvc3VwZXIuYyBsaW51eC0y
LjYuMjUuNC9mcy9leHQyL3N1cGVyLmMKLS0tIGxpbnV4LTIuNi4yNS40Lm9yaWcvZnMvZXh0Mi9z
dXBlci5jCTIwMDgtMDQtMTggMDE6MjA6MTAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40L2ZzL2V4
dDIvc3VwZXIuYwkyMDA4LTA1LTIwIDAxOjI3OjUzICswMzAwCkBAIC00MjQsNiArNDI0LDEyIEBA
CiAJe09wdF91c3JxdW90YSwgInVzcnF1b3RhIn0sCiAJe09wdF9yZXNlcnZhdGlvbiwgInJlc2Vy
dmF0aW9uIn0sCiAJe09wdF9ub3Jlc2VydmF0aW9uLCAibm9yZXNlcnZhdGlvbiJ9LAorI2lmIGRl
ZmluZWQoQ09ORklHX1NVUEVSTU9VTlQpIHx8IGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlRfTU9E
VUxFKQorCS8qIFNpbGVudGx5IGlnbm9yZSBOTFMgb3B0aW9ucyAqLworCXtPcHRfaWdub3JlLCAi
aW9jaGFyc2V0In0sCisJe09wdF9pZ25vcmUsICJjb2RlcGFnZSJ9LAorCXtPcHRfaWdub3JlLCAi
dW1hc2sifSwKKyNlbmRpZgogCXtPcHRfZXJyLCBOVUxMfQogfTsKIApkaWZmIC11ck4gbGludXgt
Mi42LjI1LjQub3JpZy9mcy9pc29mcy9pbm9kZS5jIGxpbnV4LTIuNi4yNS40L2ZzL2lzb2ZzL2lu
b2RlLmMKLS0tIGxpbnV4LTIuNi4yNS40Lm9yaWcvZnMvaXNvZnMvaW5vZGUuYwkyMDA4LTA0LTE4
IDAxOjIwOjEwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC9mcy9pc29mcy9pbm9kZS5jCTIwMDgt
MDUtMjAgMDE6Mjc6NTMgKzAzMDAKQEAgLTM0NSw2ICszNDUsMTAgQEAKIAl7T3B0X2lnbm9yZSwg
ImNvbnY9YXV0byJ9LAogCXtPcHRfaWdub3JlLCAiY29udj1hIn0sCiAJe09wdF9ub2NvbXByZXNz
LCAibm9jb21wcmVzcyJ9LAorI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlQpIHx8IGRlZmlu
ZWQoQ09ORklHX1NVUEVSTU9VTlRfTU9EVUxFKQorCXtPcHRfaWdub3JlLCAiY29kZXBhZ2U9JXMi
fSwKKwl7T3B0X2lnbm9yZSwgInVtYXNrPSVzIn0sCisjZW5kaWYKIAl7T3B0X2VyciwgTlVMTH0K
IH07CiAKZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40Lm9yaWcvZnMvS2NvbmZpZyBsaW51eC0yLjYu
MjUuNC9mcy9LY29uZmlnCi0tLSBsaW51eC0yLjYuMjUuNC5vcmlnL2ZzL0tjb25maWcJMjAwOC0w
NC0xOCAwMToyMDoxMCArMDMwMAorKysgbGludXgtMi42LjI1LjQvZnMvS2NvbmZpZwkyMDA4LTA1
LTIwIDAxOjI3OjUzICswMzAwCkBAIC04NjcsNiArODY3LDggQEAKIAogbWVudSAiUHNldWRvIGZp
bGVzeXN0ZW1zIgogCitzb3VyY2UgImZzL3N1cGVybW91bnQvS2NvbmZpZyIKKwogY29uZmlnIFBS
T0NfRlMKIAlib29sICIvcHJvYyBmaWxlIHN5c3RlbSBzdXBwb3J0IiBpZiBFTUJFRERFRAogCWRl
ZmF1bHQgeQpkaWZmIC11ck4gbGludXgtMi42LjI1LjQub3JpZy9mcy9NYWtlZmlsZSBsaW51eC0y
LjYuMjUuNC9mcy9NYWtlZmlsZQotLS0gbGludXgtMi42LjI1LjQub3JpZy9mcy9NYWtlZmlsZQky
MDA4LTA0LTE4IDAxOjIwOjEwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC9mcy9NYWtlZmlsZQky
MDA4LTA1LTIwIDAxOjI3OjUzICswMzAwCkBAIC0xMTYsNiArMTE2LDcgQEAKIG9iai0kKENPTkZJ
R19CRUZTX0ZTKQkJKz0gYmVmcy8KIG9iai0kKENPTkZJR19IT1NURlMpCQkrPSBob3N0ZnMvCiBv
YmotJChDT05GSUdfSFBQRlMpCQkrPSBocHBmcy8KK29iai0kKENPTkZJR19TVVBFUk1PVU5UKQkr
PSBzdXBlcm1vdW50Lwogb2JqLSQoQ09ORklHX0RFQlVHX0ZTKQkJKz0gZGVidWdmcy8KIG9iai0k
KENPTkZJR19PQ0ZTMl9GUykJCSs9IG9jZnMyLwogb2JqLSQoQ09ORklHX0dGUzJfRlMpICAgICAg
ICAgICArPSBnZnMyLwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQub3JpZy9mcy9uYW1lc3BhY2Uu
YyBsaW51eC0yLjYuMjUuNC9mcy9uYW1lc3BhY2UuYwotLS0gbGludXgtMi42LjI1LjQub3JpZy9m
cy9uYW1lc3BhY2UuYwkyMDA4LTA0LTE4IDAxOjIwOjEwICswMzAwCisrKyBsaW51eC0yLjYuMjUu
NC9mcy9uYW1lc3BhY2UuYwkyMDA4LTA1LTIwIDAxOjI3OjUzICswMzAwCkBAIC0xNDM4LDYgKzE0
MzgsMTUgQEAKIAlpZiAocmV0dmFsKQogCQlnb3RvIGRwdXRfb3V0OwogCisjaWYgZGVmaW5lZChD
T05GSUdfU1VQRVJNT1VOVCkgfHwgZGVmaW5lZChDT05GSUdfU1VQRVJNT1VOVF9NT0RVTEUpCisJ
aWYgKCEoZmxhZ3MgJiAoTVNfUkVNT1VOVCB8IE1TX01PVkUpKSAmJgorCSAgICAobmQucGF0aC5t
bnQtPm1udF9zYi0+c190eXBlLT5mc19mbGFncyAmIEZTX05PX1NVQk1OVCkpIHsKKwkJcmV0dmFs
ID0gLUVQRVJNOworCQlwYXRoX3B1dCgmbmQucGF0aCk7CisJCXJldHVybiByZXR2YWw7CisJfQor
I2VuZGlmCisKIAlpZiAoZmxhZ3MgJiBNU19SRU1PVU5UKQogCQlyZXR2YWwgPSBkb19yZW1vdW50
KCZuZCwgZmxhZ3MgJiB+TVNfUkVNT1VOVCwgbW50X2ZsYWdzLAogCQkJCSAgICBkYXRhX3BhZ2Up
OwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQub3JpZy9mcy9zdXBlci5jIGxpbnV4LTIuNi4yNS40
L2ZzL3N1cGVyLmMKLS0tIGxpbnV4LTIuNi4yNS40Lm9yaWcvZnMvc3VwZXIuYwkyMDA4LTA0LTE4
IDAxOjIwOjEwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC9mcy9zdXBlci5jCTIwMDgtMDUtMjAg
MDE6Mjc6NTMgKzAzMDAKQEAgLTkwLDYgKzkwLDkgQEAKIAkJcy0+c19xY29wID0gc2JfcXVvdGFj
dGxfb3BzOwogCQlzLT5zX29wID0gJmRlZmF1bHRfb3A7CiAJCXMtPnNfdGltZV9ncmFuID0gMTAw
MDAwMDAwMDsKKyNpZiBkZWZpbmVkKENPTkZJR19TVVBFUk1PVU5UKSB8fCBkZWZpbmVkKENPTkZJ
R19TVVBFUk1PVU5UX01PRFVMRSkgICAgICAgICAgIAorCQlhdG9taWNfc2V0KCZzLT5zX21lZGlh
X2NoYW5nZWQsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZW5kaWYJCQogCX0K
IG91dDoKIAlyZXR1cm4gczsKQEAgLTYxOCw2ICs2MjEsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAor
I2lmZGVmIENPTkZJR19TVVBFUk1PVU5UX01PRFVMRQorRVhQT1JUX1NZTUJPTChkb19yZW1vdW50
X3NiKTsKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBkb19lbWVyZ2VuY3lfcmVtb3VudCh1bnNpZ25l
ZCBsb25nIGZvbykKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwpAQCAtNzUwLDcgKzc1Nywx
MyBAQAogCQlnb3RvIGVycm9yX3M7CiAKIAlpZiAocy0+c19yb290KSB7Ci0JCWlmICgoZmxhZ3Mg
XiBzLT5zX2ZsYWdzKSAmIE1TX1JET05MWSkgeworCQlpZiAoKChmbGFncyBeIHMtPnNfZmxhZ3Mp
ICYgTVNfUkRPTkxZKQorI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlQpIHx8IGRlZmluZWQo
Q09ORklHX1NVUEVSTU9VTlRfTU9EVUxFKQorCQkvKiBkaXNhbGxvdyBkb3VibGUgbW91bnRpbmcg
Zm9yIHN1cGVybW91bnRlZCBkZXZpY2UgKi8KKwkJICAgIHx8ICgoZmxhZ3MgfCBzLT5zX2ZsYWdz
KSAmIE1TX1NVUEVSTU9VTlRFRCkKKyNlbmRpZgorCQkgICApCisJCXsKIAkJCXVwX3dyaXRlKCZz
LT5zX3Vtb3VudCk7CiAJCQlkZWFjdGl2YXRlX3N1cGVyKHMpOwogCQkJZXJyb3IgPSAtRUJVU1k7
CkBAIC04NjYsNiArODc5LDE3IEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogCiAJZXJy
b3IgPSAtRU5PTUVNOworI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlQpIHx8IGRlZmluZWQo
Q09ORklHX1NVUEVSTU9VTlRfTU9EVUxFKQorCS8qIHNhbml0eSBjaGVja3M7IHN1cGVybW91bnQg
cmVsaWVzIG9uIHRoZXNlIGFzc3VtcHRpb25zICovCisJaWYgKGZsYWdzICYgTVNfU1VQRVJNT1VO
VEVEKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJaWYgKHR5cGUtPmZzX2ZsYWdzICYgRlNfUkVO
QU1FX0RPRVNfRF9NT1ZFKQorCQkJZ290byBvdXQ7CisJCWlmICghKHR5cGUtPmZzX2ZsYWdzICYg
RlNfUkVRVUlSRVNfREVWKSkKKwkJCWdvdG8gb3V0OworCQllcnJvciA9IC1FTk9NRU07CisJfQor
I2VuZGlmCiAJbW50ID0gYWxsb2NfdmZzbW50KG5hbWUpOwogCWlmICghbW50KQogCQlnb3RvIG91
dDsKQEAgLTk0NSw3ICs5NjksMTEgQEAKIAlwdXRfZmlsZXN5c3RlbSh0eXBlKTsKIAlyZXR1cm4g
bW50OwogfQorI2lmZGVmIENPTkZJR19TVVBFUk1PVU5UX01PRFVMRQorRVhQT1JUX1NZTUJPTChk
b19rZXJuX21vdW50KTsKKyNlbHNlCiBFWFBPUlRfU1lNQk9MX0dQTChkb19rZXJuX21vdW50KTsK
KyNlbmRpZgogCiBzdHJ1Y3QgdmZzbW91bnQgKmtlcm5fbW91bnRfZGF0YShzdHJ1Y3QgZmlsZV9z
eXN0ZW1fdHlwZSAqdHlwZSwgdm9pZCAqZGF0YSkKIHsKZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40
Lm9yaWcvZnMvc3VwZXJtb3VudC9jaGFuZ2Vsb2cgbGludXgtMi42LjI1LjQvZnMvc3VwZXJtb3Vu
dC9jaGFuZ2Vsb2cKLS0tIGxpbnV4LTIuNi4yNS40Lm9yaWcvZnMvc3VwZXJtb3VudC9jaGFuZ2Vs
b2cJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQvZnMvc3VwZXJt
b3VudC9jaGFuZ2Vsb2cJMjAwOC0wNS0yMCAwMToyNzo1MyArMDMwMApAQCAtMCwwICsxLDQ2MiBA
QAorKiA/ID8gPyBBbmRyZXkgQm9yemVua292IDxhcnZpZGphYXJAbWFpbC5ydT4gPy4/Lj8KKwor
KiBTdW4gMTggSmFuIDIwMDQgQW5kcmV5IEJvcnplbmtvdiA8YXJ2aWRqYWFyQG1haWwucnU+IDIu
MC40CisKKyAgLSB5ZXQgYW5vdGhlciBhdHRlbXB0IHRvIGZpeCBkZXRlY3Rpb24gb2YgVVNCIGRy
aXZlIHJlbW92YWxlCisgICAgKGV4cGxpY2l0bHkgY2hlY2sgZm9yIFNEVkVfREVMIHN0YXRlIGlu
IHNkLmM6c2RfbWVkaWFfY2hhbmdlZCkKKworICAtIGZpeGVkIGkxOG4gcGF0Y2ggZm9yIGV4dDIg
YW5kIHVkZiAoaWdub3JlZCBvcHRpb25zKQorCisgIC0gLT5ub3BhZ2UgcHJvdG90eXBlIGNoYW5n
ZWQ7IGl0IG1ha2VzIGl0IGluY29tcGF0aWJsZSB3aXRoCisgICAga2VybmVsIDwgMi42LjEgKEkg
d29uZGVyIGhvdyBpdCBjb21waWxlZCAtIG9yIGRpZCBJIG1pc3MKKyAgICB3YXJuaW5nKS4gQWRk
IGNvbW1lbnRzIGFib3V0IC0+cG9wdWxhdGUgYW5kIHdoeSBpdCB3b24ndCBiZQorICAgIGltcGxl
bWVudGVkCisKKyAgLSBmaXggImF1dG8iIG9wdGlvbi4gU2ltcGxpZmljYXRpb24gb2Ygb3B0aW9u
IHByb2Nlc3NpbmcgdHVybmVkCisgICAgb3V0IHRvIGJlIGEgbWVzcyA6KCBSZXBvcnRlZCBieSBC
YXJ0CisKKyogTW9uIDEyIEphbiAyMDA0IEFuZHJleSBCb3J6ZW5rb3YgPGFydmlkamFhckBtYWls
LnJ1PiAyLjAuM2IKKworICAtIEZpeCBjb21waWxhdGlvbiBwcm9ibGVtIGluIHN1YmZzLmMgd2l0
aCBvbGRlciBHQ0MgLSBkZWNsYXJhdGlvbgorICAgIGFmdGVyIHN0YXRlbWVudCBpbiBjbGVhcl9p
bm9kZXMoYnVnIDg3NTAwOSkuIFBvaW50ZWQgYnkgQWRyaWFuIFB1bmdhLgorCisqIFdlZCAwNyBK
YW4gMjAwNCBBbmRyZXkgQm9yemVua292IDxhcnZpZGphYXJAbWFpbC5ydT4gMi4wLjNhCisKKyAg
LSBmaXggT29wcyBkdXJpbmcgb3B0aW9ucyBwYXJzaW5nIGlmIG5vIHN1YmZzIG9wdGlvbiBpcwor
ICAgIGdpdmVuIGFmdGVyICItLSIgKGJ1ZyA4Njk4NjMpCisKKyogTW9uIDI5IERlYyAyMDAzIEFu
ZHJleSBCb3J6ZW5rb3YgPGFydmlkamFhckBtYWlsLnJ1PiAyLjAuMworCisgIC0gbW92ZSB0ZXN0
IGZvciBkZXZpY2Ugb2ZmbGluZSBpbiBzZC5jIHRvIHRoZSB0b3AgaW4gYXR0ZW1wdAorICAgIHRv
IGZpeCBVU0IgcmVtb3ZhbGUgcHJvYmxlbQorCisgIC0gc2ltcGxpZnkgb3B0aW9ucyBwcm9jZXNp
bmcKKworICAtIHJlbW92ZSBjZHJvbSAib3BlbiBmYWlsZWQiIG1lc3NhZ2UgKGl0IGlzIG5vdyB1
bmRlcgorICAgIENEUk9NX09QRU4gZmxhZyBsaWtlIGFsbCBvdGhlcnMgaW4gY2Ryb21fb3Blbiku
CisKKyAgLSByZXdyb3RlIG9wdGlvbiBwYXJzaW5nIHRvIHVzZSBuZXcgbGliL3BhcnNlIGxpYnJh
cnkKKworKiBTdW4gMjYgT2N0IDIwMDMgQW5kcmV5IEJvcnplbmtvdiA8YXJ2aWRqYWFyQG1haWwu
cnU+IDIuMC4yYQorCisgIC0gcmVtb3ZlIHNvbWUgb2Jzb2xldGUgZmlsZXMgdGhhdCBhcmUgbm90
IHVzZWQgYW55bW9yZSBmcm9tIENWUworICAgIChpLmUuIGZyb20gcGF0Y2gpCisKKyAgLSBpc29m
cyBuZWVkcyBleHRyYSBpZ25vcmVkIG9wdGlvbnMgbm93LiBJdCBydXJucyBvdXQgaXQgc2lsZW50
bHkKKyAgICBpZ25vcmVkIGFueSB1bmtub3duIG9wdGlvbiBiZWZvcmUgbmV3IGFuZCBzaGlueSBv
cHRpb24gcGFyc2luZworICAgIGNvZGUKKworICAtIGNvbnNpc3RlbnRseSB1c2UgImtlcm5lbCAy
LjYiIGluIHZlcnNpb24gcHJpbnQKKworICAtIHVwZGF0ZXMgZm9yIC10ZXN0OC4gQ2hhbmdlIGV4
dDIvdWRmIHBhdGNoZXMgdG8gbWF0Y2ggbmV3IG9wdGlvbnMKKyAgICBwYXJzaW5nIGNvZGUuCisK
KyogV2VkIDEwIFNlcCAyMDAzIEFuZHJleSBCb3J6ZW5rb3YgPGFydmlkamFhckBtYWlsLnJ1PiAy
LjAuMgorCisgIC0gTk9ERVYgaXMgZ29uZSwgdXNlIE1LREVWKFVOTkFNRURfTUFKT1IsIDApIGlu
c3RlYWQsIGl0IGlzIGp1c3QKKyAgICBhcyBnb29kIGFzIGFueXRoaW5nIGVsc2UKKworKiBTYXQg
MjMgQXVnIDIwMDMgQW5kcmV5IEJvcnplbmtvdiA8YXJ2aWRqYWFyQG1haWwucnU+IDIuMC4xZAor
CisgIC0gcmVkaWZmIGFnYWluc3QgMi42LjAtdGVzdDQKKworKiBNb24gMTggQXVnIDIwMDMgQW5k
cmV5IEJvcnplbmtvdiA8YXJ2aWRqYWFyQG1haWwucnU+IDIuMC4xYworCisgIC0gZml4IGNvbXBp
bGF0aW9uIHdpdGhvdXQgQ09ORklHX1NVUEVSTU9VTlQuIFJlcG9ydGVkIGJ5CisgICAgSWdvciBT
dHJ5Z2luCisKKyogU3VuIDEwIEF1ZyAyMDAzIEFuZHJleSBCb3J6ZW5rb3YgPGFydmlkamFhckBt
YWlsLnJ1PiAyLjAuMWIKKworICAtIC9wcm9jL2ZzL3N1cGVybW91bnQvdmVyc2lvbiBpcyByZWFk
LW9ubHksIGRvIG5vdCBzZXQgcGVybWlzc2lvbnMgdG8KKyAgICBydworCisgIC0gcmVtb3ZlIGdl
bmVyaWNfdW5wbHVnX3F1ZXVlIGZyb20gaWRlX2RvX2RyaXZlX2NtZCwgYXBwYXJlbnRseQorICAg
IGl0IGlzIHJlZHVuZGFudCBub3cgKGZpeGVzIGJ1ZyA3ODU2OTEpCisKKyAgLSByZWRpZmYgZm9y
IDIuNi4wLXRlc3QzCisKKyogU3VuIDI3IEp1bCAyMDAzIEFuZHJleSBCb3J6ZW5rb3YgPGFydmlk
amFhckBtYWlsLnJ1PiAyLjAuMWEKKworICAtIHJlZGlmZiBmb3IgMi42LjAtdGVzdDIKKworKiBT
dW4gMTMgSnVsIDIwMDMgQW5kcmV5IEJvcnplbmtvdiA8YXJ2aWRqYWFyQG1haWwucnU+IDIuMC4x
CisKKyAgLSBodXNoIG1vc3QgdW51c2VkIHZhcmlhYmxlcyB3YXJuaW5ncyB3aXRoIENPTkZJR19E
RUJVRyAoaWRlYQorICAgIHN1Z2dlc3RlZCBieSBKZWZmIEdhcnppaykKKworICAtIHJlcGxhY2Ug
dWdseSBTVVBFUk1PVU5UX1RBUkNFX3tFTlRFUixMRUFWRX1bX0FSR1NdIHdpdGggRU5URVIvTEVB
VkUKKyAgICBVc2UgJXAgdGhyb3VnaG91dCBmb3IgcG9pbnRlciBvdXRwdXQuCisKKyAgLSBzZW5k
IEROX0NSRUFURSBmb3Igcm9vdCBvbiBtb3VudAorCisgIC0gYWxsb3cgb3BlbiBhbmQgcmVhZGRp
ciBvbiBtb3VudHBvaW50IGV2ZW4gaWYgc3ViZnMgaXMgdW5tb3VudGVkLgorICAgIFRoaXMgcHJv
dmlkZXMgZm9yIGFjdGl2ZSBtb25pdG9yaW5nIGJ5IEZBTS9kbm90aWZ5IGFuZCBpcyBvdmVyYWxs
CisgICAgbGVzcyBzdXJwcmlzaW5nIC0gbHMgL21udC9jZHJvbSBqdXN0IHJldHVybnMgZW1wdHkg
ZGlyZWN0b3J5IG5vdworICAgIGluc3RlYWQgb2YgZXJyb3IuIEZvciB0ZWNobmljYWwgcmVhc29u
cyAtPmZsdXNoIGFuZCAtPnBlcm1pc3Npb25zCisgICAgbmVlZCBiZSBhd2FyZSBhYm91dCBpdCB0
b28uCisKKyAgICBGaWxlcyBvcGVuZWQgd2hpbGUgc3ViZnMgaXMgdW5tb3VudGVkIGFyZSBOT1Qg
dXNhYmxlIGZvciBhbnl0aGluZworICAgIGV4Y2VwdCByZWFkZGlyIGV2ZW4gQUZURVIgc3ViZnMg
Z2V0cyBtb3VudGVkLiBTbyBhcHBsaWNhdGlvbgorICAgIGhhcyB0byByZW9wZW4gZGlyZWN0b3J5
IHRvIHJlc2NhbiBpdC4gQUZBSUsgYWxsIG9mIHRoZW0gZG8gaXQgOikKKworKiBTYXQgMTIgSnVs
IDIwMDMgQW5kcmV5IEJvcnplbmtvdiA8YXJ2aWRqYWFyQG1haWwucnU+IDIuMC4wYQorCisgIC0g
YWRkIHN0cnVjdCBuYW1laWRhdGEgKiBnb2VzIGludG8gZF9yZXZhbGlkYXRlIGFzIHdlbGwKKwor
ICAtIGFkZCBzdHJ1Y3QgbmFtZWlkYXRhICogdG8gc29tZSBpbm9kZSBtZXRob2RzIChpbnRyb2R1
Y2VkIGluCisgICAgMi41Ljc1KS4gQ3VycmVudGx5IGl0IGlzIGp1c3QgcGFzc2VkIGFsb25nIC0g
aXQgaXMgbm90IGNsZWFyIGlmCisgICAgbG9jYWwgc3ViZnMtc3BlY2lmaWMgbmFtZWlkYXRhIGhh
cyB0byBiZSBjb25zdHJ1Y3RlZC4gQXBwYXJlbnRseQorICAgIGl0IGV4aXN0ZWQgaW4gZm9sbG93
X2xpbmsgYWxsIHRoZSB0aW1lIHdpdGhvdXQgYW55IGV2aWwgZG9uZS4KKworICAtIGZpeCBzbWFs
bCByYWNlcyBpbiBzdXBlcm1vdW50X2dldGF0dHIgLSBkbyBub3QgYXR0ZW1wdCB0bworICAgIGdl
dCBzdWJkZW50IGlmIHByZXZlbnRfdW1vdW50IGZhaWxlZAorCisqIE1vbiAyMyBKdW4gMjAwMyBB
bmRyZXkgQm9yemVua292IDxhcnZpZGphYXJAbWFpbC5ydT4gMi4wLjAKKworICAtIGFkZGVkIC0+
Z2V0YXR0cjsgaXQgbmV2ZXIgZmFpbHMgb24gYm90aCB1bm1vdW50ZWQgbW91bnRwb2ludAorICAg
IGFuZCBzdGFsZSBvcGVuIGZpbGVzIC0gdG8gZW5zdXJlIGZ1c2VyIC1tIC9tbnQvY2Ryb20gc3Rp
bGwgZmluZHMgdGhlbQorCisgIC0gbWVyZ2UgMi41LjczOyB1cGRhdGUgc2QuYyB0byBuZXcgcmVm
Y291bnQgaW50ZXJmYWNlIGluIHNkLmMKKworICAtIGZpeCBTVVBFUk1PVU5UX0JVR19PTl9MT0NL
RUQgd2l0aG91dCBTVVBFUk1PVU5UX0RFQlVHCisKKyAgLSBhZGQgbWVkaWEgbWFuYWdlbWVudCB0
byBpZGUtZmxvcHB5IGFuZCB0aG9zZSBDRC1ST00gZHJpdmVycyB0aGF0CisgICAgYXJlIHVzaW5n
IHN0YW5kYXJkIGNkcm9tXyogY2FsbHMgKGNkdTMxYSwgY20yMDYsIG1jZCwgbWNkeCwgc2JwY2Qp
LgorICAgIFRlc3Rkcml2ZSByZXZlYWxlZCB0aGF0IG5vbmUgb2YgdGhlbSBidWlsZHMgZm9yIG90
aGVyIHJlYXNvbnMgOikKKworICAtIGFkZCAodW4pbWFya19tZWRpYV9zdXBlcm1vdW50ZWQ7IG1h
cmsgYWZ0ZXIgbW91bnQsIHVubWFyaworICAgIGJlZm9yZSB1bW91bnQuIFRoZXNlIGZ1bmN0aW9u
cyBqdXN0IG1hbmlwdWxhdGUgYmRfZGlzay0+c2NvdW50CisKKyAgLSBhZGQgc2NvdW50IHRvIHN0
cnVjdCBnZW5kaXNrIHRvIHNlcnZlIGFzIGNvdW50IG9mIHRvdGFsCisgICAgc3VwZXJtb3VudGVk
IHBhcnRpdGlvbnM7IHVzZSBldmVyeXdoZXJlIHRvIGNoZWNrIGlmIGRldmljZQorICAgIGlzIHN1
cGVybW91bnRlZAorCisqIFR1ZSAxNyBKdW4gMjAwMyBBbmRyZXkgQm9yemVua292IDxhcnZpZGph
YXJAbWFpbC5ydT4gMi4wLjB0ZXN0MgorCisgIC0gdXBkYXRlIGtlcm5lbCBwYXRjaCBmb3IgMi41
LjcyICh0aGVyZSB3YXMgYSByZWplY3QgaW4KKyAgICBkcml2ZXJzL2lkZS9pZGUtaW8uYykKKwor
ICAtIG1vdmUgaW5pdF9pbm9kZV9pbmZvIGludG8gYWxsb2NfaW5vZGU7IHVzZSBpZ2V0X2xvY2tl
ZAorICAgIGluc3RlYWQgb2YgaWdldCB0byBza2lwIC0+cmVhZF9pbm9kZSB3aXRoIGludGVudCB0
byBtb3ZlCisgICAgaW5vZGUgaW5pdCB1bmRlciBpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykK
KworICAtIHBvbGlzaCBkZW50cnkuYyBhIGJpdCB3aGlsZSBJIGFtIG9uIGl0CisKKyAgLSAtPmRf
Y29tcGFyZSBpcyBub3QgcnVuIHVuZGVyIGRjYWNoZV9sb2NrIGFueW1vcmUuIFBvaW50ZWQgYnkK
KyAgICBNYW5lZXNoIFNvbmkuIEFzIHdlIGNhbid0IHNsZWVwIGluIGRfY29tcGFyZSwgdXNlIHJ3
bG9jayB0bworICAgIHByb3RlY3QgYWdhaW5zdCByYWNlcyB3aXRoIHN1cGVybW91bnRfY2xlYW5f
ZGVudHJpZXMgdW50aWwKKyAgICBJIGZpbmQgYmV0dGVyIHNvbHV0aW9uLgorCisgIC0gcmVtb3Zl
IG5ld19zdWJmc19kZW50cnkgLSBpdCBpcyBub3QgdXNlZCBhbnltb3JlIGFuZCBjb21tZW50cwor
ICAgIHRoZXJlIHdlcmUgd3JvbmcgYW55d2F5CisKKyogU3VuIDAxIEp1biAyMDAzIEFuZHJleSBC
b3J6ZW5rb3YgPGFydmlkamFhckBtYWlsLnJ1PiAyLjAuMHRlc3QxCisKKyAgLSBhZGQgc3IgYW5k
IHNkIHN1cHBvcnQKKworICAtIHVwZGF0ZSBzYiBzX2Jsb2Nrc2l6ZSBhbmQgc19ibG9ja3NpemVf
Yml0cyBvbiBzdWJmcyBtb3VudAorCisgIC0gdXNlIEJLTCBhcm91bmQgY2hla19kaXNrX2NoYW5n
ZTsgaXQgaXMgbm90IGdhcmFudGVlZCBieSBWRlMgbm93CisKKyAgLSBsbHNlZWsgbm8gbW9yZSB1
cGRhdGVzIGZpbGUgcmVhZGFoZWFkIHBvaW50ZXIKKworICAtIHVzZWQgYmRldiBub3QgZ2VuZGlz
ayBpbiBtZWRpYWN0bCAtIGl0IG5lZWRzIGl0IGZvcgorICAgIHN1cGVybW91bnRfdXNhZ2VfY291
bnQuIEl0IHByb2JhYmx5IG5lZWRzIHJlZGVzaWduLiBBbHNvIHNvbWUgbWlub3IKKyAgICBjaGFu
Z2VzIG9uIHRoZSB3YXkuCisKKyAgLSAyLjUgY2hhbmdlcy4gc3VwZXJtb3VudF9nZXRfc2IsIGlu
b2RlIGFsbG9jL2RlYWxsb2MsIHVzZSBiZGV2IGluc3RlYWQKKyAgICBvZiBkZXYsIE1ha2VmaWxl
IGNoYW5nZSwgYWRkIENPTkZJR19TVVBFUk1PVU5UX0RFQlVHLCBkb19yZW1vdW50X3NiCisgICAg
cHJvdG90eXBlIGNoYW5nZSwgbWtub2QgcHJvdG90eXBlIGNoYW5nZSwgVVBEQVRFX0FUSU1FIGRl
YWQsCisgICAgZG5vdGlmeV9wYXJlbnQgaXMgbm93IHRydWUgZnVuY3Rpb24KKworKiBUdWUgMjcg
TWF5IDIwMDMgQW5kcmV5IEJvcnplbmtvdiA8YXJ2aWRqYWFyQG1haWwucnU+IDEuMi43CisKKyAg
LSAocmUtKXNldCByb290IGlub2RlIGZsYWdzIGFmdGVyIHVubW91bnRpbmcgc3ViZnMKKworICAt
IGZpeCBtb3VudGluZyBvZiBybyBtZWRpYSBvbiBydyBmaWxlc3lzdGVtLiBJdCB3YXMgYnJva2Vu
ICBieSBmaXgKKyAgICBpbiAxLjIuNC4gUmVtb3ZlIHNhdmVkIHNfbWZsYWdzIGFuZCBqdXN0IHVz
ZSByZWFsIHNiLT5zX2ZsYWdzLgorICAgIFJlcG9ydGVkIGJ5IENvbiBLb2xpdmFzCisgICAgCisg
IC0gZG8gbm90IHVzZSBNU19NR0NfVkFMIGluIHN1YmZzX3JlYWxfbW91bnQgLSBpdCBpcyBub3Qg
dXNlZCBhbnl3aGVyZQorICAgIGluIGtlcm5lbCBhbmQgYWxsIGxvd2VyIGJpdHMgYXJlIGFscmVh
ZHkgdGFrZW4gaW4gMi41CisKKyAgLSBjb25maWd1cmUgaGVscCBmcm9tIE1hcmMtQ2hyaXN0aWFu
IFBldGVyc2VuCisKKyAgLSB1c2Ugc3Vic2ItPnNfYmRldiBpbnN0ZWFkIG9mIGxvb2tpbmcgdXAg
dXNpbmcgc19kZXYuIFRoaXMgYWxzbworICAgIGZpeGVzIHByb2JsZW0gd2l0aCBPKDEpIHBhdGNo
IChidWcgNzM3NzgzKQorCisqIFdlZCAxNCBNYXkgMjAwMyBBbmRyZXkgQm9yemVua292IDxhcnZp
ZGphYXJAbWFpbC5ydT4gMS4yLjYKKworICAtIGNoZWNrIGZvciBjb3JyZWN0IGlub2RlIGluIGF0
dGFjaF9zdWJmc19pbm9kZSAtIGlmIHN1cGVyIGlub2RlCisgICAgaGFzIHN1Ymlub2RlIGF0dGFj
aGVkIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMgaXMgY3VycmVudGx5CisgICAgcmVzdWVzdGVkLiBF
bHNlIGl0IGlzIGEgYnVnLgorCisgIC0gdXNlIGxvb2t1cF9vbmVfbGVuIHRvIGxvb2t1cCBzdWJm
cyBkZW50cnkgaW4gY2FjaGU7IGNoZWNrIGlmCisgICAgc3ViZnMgZGlkIG5vdCBjaGFuZ2UgbmFt
ZSBhbmQgbG9va3VwICJyZWFsIiBkZW50cnkgaW4gcGFyZW50CisgICAgY2FjaGUgaW4gdGhpcyBj
YXNlLiBUaGlzIGZpbmFsbHkgcHV0cyBhbiBlbmQgdG8gdGhlIGF0dGVtcHQgdG8KKyAgICBjb250
cm9sIHN1YmZzIGRjYWNoZS4gVGhlIG9ubHkgdGhpbmcgd2UgcmVseSB1cG9uIG5vdyBpcyB0aGF0
CisgICAgbm90aGluZyBjYW4gY2hhbmdlIGRpcmVjdG9yeSBjb250ZW50cyB3aGlsZSBpbiBsb29r
dXAgbWV0aG9kLgorCisgIC0gaW1wbGVtZW50IGRfaGFzaCBhbmQgZF9jb21wYXJlIHRvIHByb3Bl
cmx5IHN1cHBvcnQgY2FzZS0KKyAgICBpbnNlbnNpdGl2ZSBmaWxlc3lzdGVtcyAodmZhdCAmIENv
KS4KKyAgCisgIC0gcmVzZXQgc3VwZXIgaW5vZGUgaV9tYXBwaW5nIHNvIGl0IGRvZXMgbm90IHBv
aW50IHRvIGZyZWVkCisgICAgc3ViaW5vZGUgbWFwcGluZyB3aGVuIHVubW91bnRpbmcgc3ViZnMK
KworICAtIHNlbmQgZG5vdGlmeV9wYXJlbnQgb24gZGVudHJ5IGNsZWFudXAsIG5vdCBvbiBpbm9k
ZQorCisgIC0gdXNlIHdyaXRlX2lub2RlX25vdyBpbiAtPndyaXRlX2lub2RlLiBSZWFkaW5nIGlu
dHJpY2F0ZWQgZmxhZ3MKKyAgICBtYW5pcHVsYXRpb25zIGluIGZzL2lub2RlLmMgd2FzIGp1c3Qg
dG9vIGludGltaWRhdGluZy4gSXQgaXMgbm90IGFzCisgICAgbXVjaCBvdmVyaGVhZCBhcyBpdCBs
b29rcyBsaWtlIC0gaXQgaXMgY2FsbGVkIGZyb20gc3luY19vbmUgb25seQorICAgIHNvIGFsbCBk
aXJ0eSBwYWdlcyBhcmUgc2NoZWR1bGVkIHRvIGJlIGZsdXNoZWQgYW55d2F5LgorCisqIFN1biAw
NCBNYXkgMjAwMyBBbmRyZXkgQm9yemVua292IDxhcnZpZGphYXJAbWFpbC5ydT4gMS4yLjUKKwor
ICAtIGVuYWJsZSBkZW50cmllcyBjYWNoaW5nOyBwcm9wZXJseSB1c2UgZF9hZGQgd2hlbiBkZW50
cnkgaXMgZmlyc3QKKyAgICBsb29rZWQgdXAgYW5kIGRfaW5zdGFudGlhdGUgd2hlbiBpbm9kZSBp
cyBmaW5hbGx5IGF2YWlsYWJsZS4KKworICAtIGZpcnN0IHN0YWIgYXQgc2VuZGluZyBub3RpZmlj
YXRpb25zIG9uIG1lZGlhIHVtb3VudC9tb3VudAorCisgIC0gbW9yZSBjYXZlYXRzIDooCisKKyog
U2F0IDI2IEFwciAyMDAzIEFuZHJleSBCb3J6ZW5rb3YgPGFydmlkamFhckBtYWlsLnJ1PiAxLjIu
NAorCisgIC0gZml4IHdyaXRlX2lub2RlL3ByZXBhcmVfaW5vZGUgZGVhZGxvY2suIEl0IGxvb2tl
ZCBsaWtlCisgIAlzZXQgSV9MT0NLCisJCQlkb3duKCZzYmktPnNlbSk7CisJCQlpZ2V0NCAtPiB3
YWl0X29uX2lub2RlCisJZG93bigmc2JpLT5zZW0pCisKKyAgLSBNU19BQ1RJVkUgd2FzIHJlc2V0
IG9uIHN1YmZzIHJlbW91bnQKKworICAtIHByaW50IHByb2Nlc3MgUElEIGluIHRyYWNlCisKKyAg
LSBhZGp1c3QgZGlyZWN0b3J5IHN0cnVjdHVyZSB0byBtYWtlIHBhdGNoIGdlbmVyYXRpb24gZWFz
aWVyCisKKyogU3VuIDIwIEFwciAyMDAzIEFuZHJleSBCb3J6ZW5rb3YgPGFydmlkamFhckBtYWls
LnJ1PiAxLjIuMworCisgIC0gZHVtbXkgdmVyc2lvbiBkdWUgdG8gc2NyaXB0IHByb2JsZW1zCisK
KyogU3VuIDIwIEFwciAyMDAzIEFuZHJleSBCb3J6ZW5rb3YgPGFydmlkamFhckBtYWlsLnJ1PiAx
LjIuMgorICAKKyAgLSByZW1vdmUgI2lmZGVmIENPTkZJR19QUk9DX0ZTIGZyb20gaW5pdC5jLCBp
dCBhbHJlYWR5IGV4aXN0cyBpbgorICAgIHN1cGVybW91bnQuaAorCisgIC0gbm9fdHJheV9sb2Nr
IC0+IFRSQVlfTE9DS19ORVZFUi4gSnVzdCB0byBtYWtlIHN1cmUgaXQgcmVtYWlucworICAgIGNv
bXBhdGlibGUgKGV2ZW4gaWYgaXQgaXMgdmVyeSB1bmxpa2VseSBhbnlib2R5IGlzIHVzaW5nIGl0
KS4KKworICAtIGJhY2tvdXQga2VybmVsIHN0YXQgcGF0Y2g7IHJlbW92ZSBnZXRhdHRyIGFsbHRv
Z2V0aGVyLiBJdCBmaXhlZAorICAgIGZ1c2VyIC1tIGZvciBzdGFsZSBmaWxlcy4gZ2V0YXR0ciBy
ZW1haW5zIHVuaXBsZW1lbnRlZCBiZWNhdXNlCisgICAgaXQgZG9lcyBub3Qgc2VlbSB0byBiZSB1
c2VkIGFueXdoZXJlIGluIGtlcm5lbCBhdCBhbGwgc28gSSBhbSBub3QKKyAgICBhY3R1YWxseSBz
dXJlIGhvdyB0byBpbXBsZW1lbnQgaXQKKworICAgIEl0IGFsc28gYmFja291dHMgMTBfcmVhZGxp
ayBhbmQgMzBfbHNlZWsgYXMgdGhleSBhcmUgbm90IHVzZWQKKyAgICBhbnltb3JlIGZvciBhIGxv
bmcgdGltZS4KKworICAtIHJlbW92ZSBib2d1cyBjaGVjayBmb3Igc3ViLSBhbmQgc3VwZXJpbm9k
ZXMgaV9jb3VudC4gaV9jb3VudCBpcworICAgIG91dHNpZGUgb2Ygc3VwZXJtb3VudCBjb250cm9s
OyB0aGUgb25seSB0aGluZyB0aGF0IHdlIG11c3QgYmUKKyAgICBzdXJlIGluIC0gaW5vZGUgaXMg
ZnJlZSBvbiB1bW91bnQuCisKKyAgLSByZXNldCByb290IGlub2RlIGF0dHJpYnV0ZXMgYW5kIG9w
ZXJhdGlvbnMgb24gdW1vdW50LiBUaGlzIGZpeGVzCisgICAgdGhlIHByb2JsZW0gb2YgYXR0ZW1w
dCB0byBtb3VudCBtZWRpYSBvbiBscyAtbCAvbW50IGFmdGVyIHN1YmZzCisgICAgaGFzIGJlZW4g
bW91bnRlZCBvbmNlLgorCisgIC0gcmVtb3ZlIC0+c3RhbGUuIEZvciBhbGwgcHJhY3RpY2FsIHB1
cnBvc2VzIGFuIGVudGl0eSBpcyBzdGFsZSBpZmYKKyAgICBpdCBkb2VzIG5vdCAoeWV0KSBoYXZl
IGFzc29jaWF0ZWQgc3ViZnMgZW50aXR5LiBDcmVhdGluZyB5ZXQgYW5vdGhlcgorICAgIGZpZWxk
IHRoYXQganVzdCBtaXJyb3JzIHRoaXMgY29uZGl0aW9uIGRvZXMgbm90IGFkZCBhIHNpbmdsZSBi
aXQKKyAgICBvZiB1c2VmdWwgaW5mb3JtYXRpb24uCisKKyAgLSBzdWJmc19pc19idXN5IGlmZiBz
dWJmcyBtbnRfY291bnQgPiAxCisKKyogU2F0IDA1IEFwciAyMDAzIEFuZHJleSBCb3J6ZW5rb3Yg
PGFydmlkamFhckBtYWlsLnJ1PiAxLjIuMQorCisgIC0gZml4ZWQgc3R1cGlkIHRoaW5rbyBpbiBt
ZWRpYWN0bCBtZXRob2RzICh0aGUgZWZmZWN0IHdhcyBpdCB3YXMKKyAgICBpbXBvc3NpYmxlIHRv
IG1hbnVhbGx5IGVqZWN0IHJvIG1lZGlhKS4gSXQgd2FzIGV4cG9zZWQgYnkgcmVjZW50CisgICAg
Y2hhbmdlcy4gTm8gY2hhbmdlcyBpbiBzdXBlcm1vdW50IGl0c2VsZiBvbmx5IGluIGRyaXZlciBj
b2RlCisKKyAgLSByZXBsYWNlIG5vX3RyYXlfbG9jayB3aXRoIHRyYXlfbG9jaz17bmV2ZXIsb253
cml0ZSxhbHdheXN9IHdpdGgKKyAgICAib253cml0ZSIgYmVpbmcgZGVmYXVsdC4gSSBzdGlsIGRv
IG5vdCBxdWl0ZSBsaWtlIHJlc3VsdGluZyBjb2RlCisgICAgYnV0IGl0IHdpbGwgZG8gZm9yIG5v
dy4KKworICAtIHNpbXBsaWZpZWQgc3ViZnNfKGdldHxwdXQpXyh3cml0ZXxyZWFkKSBpbnRlcmZh
Y2U7IG1lcmdlIGJvdGgKKyAgICByZWFkL3dyaXRlIGluIG9uZSBmdW5jdGlvbjsgcmVtb3ZlIHN1
YmZzX2dldF9hdGltZS4gVG8gbXkgc3VycHJpc2UKKyAgICBpdCByZXN1bHRlZCBvbiBtb3JlIGNs
ZWFuIGludGVyZmFjZSBpbiB0aGUgcmVzdCBvZiBzdXBlcm1vdW50IGV2ZW4KKyAgICBpZiBzdWJm
c18oZ2V0fHB1dClfYWNjZXNzIGRvZXMgbG9vayBhIGJpdCB3ZWlyZC4KKworKiBTdW4gMzAgTWFy
IDIwMDMgQW5kcmV5IEJvcnplbmtvdiA8YXJ2aWRqYWFyQG1haWwucnU+IDEuMi4wCisKKyAgLSBj
aGFuZ2VkIHByb2MgY29tbWFuZCBmb3JtYXQgdG8KKyAgICA8ZGV2bmFtZT4gW2VuYWJsZXxkaXNh
YmxlXSBbcmVsZWFzZSBbZm9yY2VdXQorCisgIC0gYWRkIC9wcm9jL2ZzL3N1cGVybW91bnQvdmVy
c2lvbjsgcHJpbnRrIHZlcnNpb24gb24gc3RhcnVwIG9ubHkKKyAgICBpZiBwcm9jZnMgaXMgbm90
IGNvbmZpZ3VyZWQuCisKKyAgLSB1bmlmeSBtZWRpYSBsb2NrIHJ1bGVzIGZvciB0aG9zZWQgZHJp
dmVycyB1c2luZyBpbXBsZW1lbnRpbmcKKyAgICBtZWRpYWN0bCAoY2Ryb20sIHNkLCBpZGUtZmxv
cHB5IGFzIG9mIHRoaXMgd3JpdGluZykuIExvY2sKKyAgICBtZWRpYSBmb3IgYm90aCBtYW51YWwg
YW5kIHNvZnR3YXJlIGVqZWN0OyBkbyBub3QgdW5sb2NrIG1lZGlhCisgICAgdGhhdCBpcyBpbiB1
c2VkIGJ5IHNvbWV0aGluZyBlbHNlLgorCisgIC0gYWRkZWQgc2hvd19vcHRpb25zIG1ldGhvZCB0
byBzdXBlci5jCisKKyAgLSBpbXBsZW1lbnRlZCAvcHJvYy9mcy9zdXBlcm1vdW50L3N1YmZzIHJl
YWQgYXMgc2VxX2ZpbGUKKworKiBTYXQgMjkgTWFyIDIwMDMgQW5kcmV5IEJvcnplbmtvdiA8YXJ2
aWRqYWFyQG1haWwucnU+IDEuMS40CisKKyAgLSBzdXBlcm1vdW50X3JlbmFtZSBsZWZ0b3ZlciAt
IGl0IGRvZXMgbm90IG5lZWQgbmV3X3N1YmZzX2RlbnRyeS4KKyAgICBJdCBzdGlsbCB3b3JrZWQg
YmVjYXVzZSBuZXcgZGVudHJ5IHdhcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHksIGJ1dAorICAgIGxl
dCdzIGRvIGl0IHRoZSByaWdodCB3YXkuIEFsc28gbWFyayB0YXJnZXQgcncgaWYgZXhpc3RzCisK
KyAgLSBwcm9wYWdhdGUgU19JTU1VVEFCTEUsIFNfTk9BVElNRSBhbmQgU19BUFBFTkQgZmxhZ3Mg
ZnJvbSBzdWJmcworICAgIHRvIHN1cGVyIGlub2RlLiBGaWxlc3lzdGVtcyB1c3VhbGx5IHJlbHkg
b24gVkZTIHRvIGNoZWNrIHRoZXNlCisgICAgZmxhZ3Mgd2hpY2ggbWVhbnMgaXQgd2FzIHBvc3Np
YmxlIHRvIG92ZXJ3cml0ZSBpbW11dGFibGUgZmlsZS4gQWxzbworICAgIG5lZWRlZCBmb3IgYXRp
bWUgbWFuYWdlbWVudCAodG8gYmUgYWRkZWQpLgorCisgIC0gYWRkZWQgYXRpbWUgbWFuYWdlbWVu
dC4gSXQgaXMgYmFzZWQgb24gZ3JlcCBVUERBVEVfQVRJTUUgc28gaXQgbWF5CisgICAgYmUgaW5j
b21wbGV0ZTsgc3RpbGwgaXQgZ2l2ZXMgcmlnaHQgcmVzdWx0cyBpbiBtb3N0IG9idmlvdXMgY2Fz
ZXMgOikKKyAgICBJdCByZXNwZWN0cyBubyhkaXIpYXRpbWUgbW91bnQgZmxhZy4KKworICAtIE1h
a2Ugc3VyZSBzdXBlciBpbm9kZSB0aW1lcyBhbmQgc2l6ZXMgYXJlIHVwZGF0ZWQgdG8gcmVmbGVj
dCBzdWJmcworICAgIGlub2RlLiBEb25lIGluIHByZXBhcmF0aW9uIHRvIHJlbW92ZSBzdGF0IGtl
cm5lbCBwYXRjaC4gT25seSB0aG9zZQorICAgIGZpZWxkcyBuZWVkZWQgYnkgc3RhdCBhcmUgdXBk
YXRlZC4KKworICAtIHJlbW92ZSBhc3NlcnRpb24gc3ViaS0+aV9jb3VudCA9PSAxIGZyb20gY2xl
YXJfaW5vZGUuIFN1YmZzIGljYWNoZQorICAgIGlzIG1hbmFnZWQgaW5kZXBlbmRlbnRseSBhbmQg
dGhlcmUgaXMgbm8gbG9jayAoYXMgb3Bwb3NlZCB0byBkZW50cnkKKyAgICBjYXNlIHdoZXJlIHdl
IG5ldmVyIGRvIGNhY2hlZCBsb29rdXAgZm9yIHN1YmZzKS4KKworICAtIHVzZSBpbm9kZSBjYWNo
ZSBmb3Igc3VwZXJtb3VudCBpbm9kZXMgdG8gYXZvaWQgbGluZWFyIHNlYXJjaC4gVGhpcworICAg
IG1vdmVzIGFsbW9zdCB0aGUgd2hvbGUgaW5vZGUgY3JlYXRpb24gdGFzayBpbnRvIHJlYWRfaW5v
ZGUyIC0gdGhlCisgICAgb25seSBwbGFjZSB3aGVyZSBpbm9kZSBuZWVkcyB0byBiZSBjcmVhdGVk
IGlzIHJvb3QgaW5vZGUuCisKKyAgICBXZSB1c2UgaW5vZGUgbnVtYmVycyBmcm9tIHN1YmZzOyBy
b290IGlub2RlIGlzIG5ldmVyIGNhY2hlZCB1bnRpbAorICAgIHN1YmZzIGhhcyBiZWVuIG1vdW50
ZWQuIFN0YWxlIGlub2RlcyBhcmUgcmVtb3ZlZCBmcm9tIGNhY2hlIGluCisgICAgY2xlYW5faW5v
ZGVzIChqdXN0IGxpa2UgZGVudHJpZXMgYXJlIGluIGNsZWFuX2RlbnRyaWVzKSBzbyBhbGlhc2lu
ZworICAgIHByb2JsZW0gaXMgc29sdmVkLgorCisgIC0gYWRkICJkaXNhYmxlZCIgc3RhdGUgLSBw
cmV2ZW50IGFueSBhdHRlbXB0IHRvIG1vdW50IG1lZGlhCisKKyAgLSBhZGQgcHJvY2ZzIHN1cHBv
cnQuIFJlYWRpbmcgL3Byb2MvZnMvc3VwZXJtb3VudC9zdWJmcyB3aWxsIHJldHVybgorICAgIGxp
c3Qgb2Ygc3ViZnMgYW5kIHRoZWlyIHN0YXR1cy4gV3JpdGluZyBpbnRvIGl0IGFsbG93cyB5b3Ug
dG8KKyAgICBjb250cm9sIHN0YXR1cyBvZiBzdWJmcyAobW91bnRlZC91bm1vdW50ZWQsIGVuYWJs
ZWQvZHVzYWJsZWQpCisKKyAgLSBmaXggcmFjZSBpbiBjbGVhcl9pbm9kZS4gSXQgd2FzIHBvc3Np
YmxlIHRoYXQgc3ViZnMgd2FzIHVtb3VudGVkCisgICAgYWZ0ZXIgaW5vZGUgaGFzIGJlZW4gcmVt
b3ZlZCBmcm9tIGxpc3QgYnV0IGJlZm9yZSBpdHMgYWNjZXNzCisgICAgY291bnRlcnMgd2VyZSBj
bGVhcmVkLiBUaGUgY29kZSB0aGF0IGNoZWNrZXMgZm9yIHRoYXQgZXhpc3RzIG9ubHkKKyAgICBm
b3IgZGVidWdnaW5nIHN0aWxsIEknZCBsaWtlIGl0IHRvIGJlIHVzZWZ1bC4KKworKiBTdW4gMTYg
TWFyIDIwMDMgQW5kcmV5IEJvcnplbmtvdiA8YXJ2aWRqYWFyQG1haWwucnU+IDEuMS4zCisKKyAg
LSBhZGQgQ1ZTIHZlcmlvbiBJZCdzIHRvIGZpbGVzCisKKyAgLSBmaW5hbGx5IGdldCByaWQgb2Yg
dWdseSBnZW5lcmF0aW9uIG51bWJlci4gSXQgaXMgZW5vdWdoIHRvIGp1c3QKKyAgICBtYXJrIGVu
dGl0eSBvYnNvbGV0ZTsgd2UgZG8gbm90IGNhcmUgYWN0dWFsbHkgd2hlbiBpdCBoYXBwZW5lZC4K
KyAgICBOb3cgZXZlcnkgZW50aXR5IHN0YXJ0cyBvdXQgc3RhbGU7IHN0YWxlIGZsYWcgaXMgcmVz
ZXQgd2hlbiBzdWJmcworICAgIG9iamVjdCBpcyBhdHRhY2hlZDsgc3RhbGUgZmxhZyBpcyBzZXQg
YWdhaW4gZm9yIHRoZSByZXN0IG9mIGxpZmUKKyAgICBpbiBzdWJmc191bW91bnQKKworICAtIGFz
IGEgc2lkZSBlZmZlY3QgcmVhZC93cml0ZSBjb3VudCBpcyBhc3NvY2lhdGVkIHdpdGggaW5vZGVz
CisgICAgZXhjbHVzaXZlbHkKKworICAtIGNsZWFyX2lub2RlIGFuZCBkX2lwdXQgbmVlZCBwcmV2
ZW50L2FsbG93IHVtb3VudCB0byBhdm9pZCAic3RlYWxpbmciCisgICAgc3ViZnMgd2hpbGUgaG9s
ZGluZyBhY3RpdmUgZW50aXRpZXMuIEZpbGUgcmVsZWFzZSBpcyBzYWZlIGFzIFZGUyBkb2VzCisg
ICAgbm91IHB1dCBtbnQgdW50aWwgX3JlbGVhc2UgaXMgZmluaXNoZWQuCisKKyAgLSBzdWJmc19w
cmV2ZW50X3Vtb3VudCBkb2VzIG5vdCBuZWVkIHZhbGlkYXRvci4gVGhlIHdvcnN0IHRoaW5nIHRo
YXQKKyAgICBjYW4gaGFwcGVuIGlzIHRoYXQgbmV3bHkgbW91bnRlZCBzdWJmcyBpcyBhY2Nlc3Nl
ZC4gVGhhdCBkb2VzIG5vdAorICAgIG1hdHRlciwgYWNjZXNzIHRvIHN1YmZzIG9iamVjdCBpcyBj
aGVja2VkIGZvciB2YWxpZGl0eSBzZXBhcmF0ZWx5IGluCisgICAgZXZlcnkgY2FzZS4KKworICAt
IGZpbmFsbHkgY2xhcmlmeSBkY2FjaGUgbWFuYWdlbWVudC4gQXMgd2UgY2Fubm90IGdhcmFudGVl
IGNvaGVyZW5jeQorICAgIGJldHdlZW4gc3ViLSBhbmQgc3VwZXItIGZzIGNhY2hlcyB3ZSBpZ25v
cmUgc3ViZnMgY2FjaGUgZW50aXJlbHkuCisgICAgU3VwZXIgZGVudHJ5IGlzIGluc3RhbnRpYXRl
ZCBpbiBzdXBlcm1vdW50X2xvb2t1cCBhbmQgcGFzc2VkIGFyb3VuZAorICAgIHdpdGggc3ViZnMg
ZGVudHJ5IGF0dGFjaGVkLiBJdCBkb2VzIG5vdCBtYXR0ZXIgaWYgaXQgaXMgcG9zaXRpdmUgb3IK
KyAgICBuZWdhdGl2ZS4gQ3VycmVudGx5IGRlbnRyaWVzIGFyZSBmb3JjZWQgdG8gYmUgZGVsZXRl
ZCBpbgorICAgIHN1cGVybW91bnRfZF9kZWxldGUgYnV0IEkgYmVsaWV2ZSBpdCBpcyBub3QgcmVh
bGx5IG5lZWRlZC4KKworICAtIHByaW50IHZlcnNpb24gbnVtYmVyIG9uIHJlZ2lzdGVyaW5nIGZp
bGVzeXN0ZW0gdG8gZmFjaWxpdGF0ZSBkZWJ1Z2dpbmcKKworICAtIHVtb3VudCBzdWJmcyBhcyBz
b29uIGFzIHBvc3NpYmxlIGluIGNoZWNrX2Rpc2tfY2hhbmdlLiBUaGlzIGVsaW1pbmF0ZXMKKyAg
ICB6b21iaWUgc3RhdGUgKG1vdW50ZWQgYnV0IGluYWN0aXZlIGR1ZSB0byBtZWRpYSBjaGFuZ2Ug
ZGV0ZWN0ZWQpLgorCisgIC0ga2lsbCBzdWJmc19pc19hY3RpdmUsIGl0IGlzIHRoZSBzYW1lIGFz
IHN1YmZzX2lzX21vdW50ZWQgbm93LgorCisgIC0ga2lsbCB0cmFuc2xhdGlvbnMuYyBpdCBkb2Vz
IG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsIG5vdzsgbW92ZSBmdW5jdGlvbnMKKyAgICBpbiBmaWxl
L2RlbnRyeS9uYW1laQorCisgIC0gZml4IHN0dXBpZCBidWcgaW4gZ2V0X3N1cGVybW91bnRfaW5v
ZGUgYWdhaW4gLSBzdXBlciBpbm9kZSBtdXN0CisgICAgYmUgaW5pdGVkIGFuZCBhdHRhY2hlZCBq
dXN0IG9uY2Ugbm90IGV2ZXJ5IHRpbWUuCisgICAgUHJhaXNlIGFzc2VydGlvbnMgYWdhaW4gOikK
KworKiAxMCBNYXIgMjAwMyBBbmRyZXkgQm9yemVua292IDxhcnZpZGphYXJAbWFpbC5ydT4gMS4x
LjIKKworICAtIGFsbG93IGZzPXR5cGUxOnR5cGUyOi4uLgorCisgIC0gcmVtb3ZlIHN1cGVybW91
bnRfZHJvcF9kZW50cmllcyAobm8gbW9yZSB1c2VkKQorCisgIC0gYWRkIHNvbWUgbW9yZSBhc3Nl
cnRpb25zIHRvIHN1YmZzX3Vtb3VudAorCisqIDEwIE1hciAyMDAzIEFuZHJleSBCb3J6ZW5rb3Yg
PGFydmlkamFhckBtYWlsLnJ1PiAxLjEuMQorCisgIC0gZml4IHN0dXBpZCBidWcgaW4gc3ViZnMg
aW5vZGUgcmVmY291bnRpbmcuIEl0IHdhcyB2aXNpYmxlIHdpdGgKKyAgICBoYXJkbGlua3Mgb25s
eSBzbyBDRC1ST00gdXNlcnMgd291bGQgbm90IGV2ZXIgc2VlIGl0LgorCisgIC0gZml4IGV2ZW4g
bW9yZSBzdHVwaWQgYnVnIGluIHVubGluayAtIHN1Ymkgd2FzIHVzZWQgaW5zdGVhZCBvZiBzdXBl
cmkKKworKiA4IE1hciAyMDAzIEFuZHJleSBCb3J6ZW5rb3YgPGFydmlkamFhckBtYWlsLnJ1PiAx
LjEuMAorCisgIC0gZmlsZXMgY2Fubm90IHVzZSBpbm9kZSBvYnNvbGV0ZSBmbGFnIC0gaXQgZG9l
cyBub3Qgd29yayBmb3IKKyAgICByb290IGlub2RlcworCisgIC0gbWFrZSBmaWxlIHN5c3RlbSBz
dHJ1Y3R1cmUgZXhhY3QgbWlycm9yIG9mIHN1YmZzIC0gbm93IHRoZXJlCisgICAgaXMgMS10by0x
IGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gc3VwZXItIGFuZCBzdWJmcyBmaWxlcywgZGVudHJpZXMK
KyAgICBhbmQgaW5vZGVzLiBUaGlzIGlzIG5lZWRlZCB0byBwcm9wZXJseSBtYW5hZ2Ugd3JpdGUg
YWNjZXNzIHdpdGhvdXQKKyAgICB0b28gbXVjaCBsb2NraW5nCisKKyAgLSBmaW5hbGx5IHJlYWxp
emVkIHRoYXQgc3ViZnMgY2Fubm90IGJlIG9ic29sZXRlOyB1c2UgZWl0aGVyIGZpbGUKKyAgICBv
ciBpbm9kZSBwb2ludGVyIGluIGFsbCBjYWxscyBpbnRvIHN1YmZzLmMgdG8gY2hlY2sgZm9yIGZy
ZXNobmVzcworCisgIC0gZGVidWcgaXMgbm93IHBlci1tb3VudDsgYWRkZWQgdHJhY2Ugb2YgYWxs
IGZ1bmN0aW9ucworICAKKyAgLSBtb3ZlIHNldHRpbmcgb2YgU1VQRVJNT1VOVF9ERUJVRyB0byBN
YWtlZmlsZSBpbnN0ZWFkIG9mIHN1cGVybW91bnRfaS5oCisKKyogMSBNYXIgMjAwMyBBbmRyZXkg
Qm9yemVua292IDxhcnZpZGphYXJAbWFpbC5ydT4gMS4wLjAKKworICAtIG1ha2Ugc3VyZSBpdCBp
cyBhbHdheXMgcG9zc2libGUgdW1vdW50IHN1YmZzLiBJdCBkb2VzIGl0IGJ5CisgICAga2VlcGlu
ZyBsaXN0IG9mIG9wZW5lZCBmaWxlcyAoaW4gYWRkaXRpb24gdG8gaW5vZGVzKSBhbmQgY2xvc2lu
ZworICAgIHRoZW0gaWYgbWVkaWEgY2hhbmdlIGlzIGRldGVjdGVkLgorCisgIC0gbWFrZSBzdXJl
IHN1YmZzIGNhbid0IGdvIGF3YXkgd2hpbGUgaXQgaXMgYmVpbmcgaW4gdXNlLiBGb3IKKyAgICBm
aWxlcyBpdCBnZXRfZmlsZSBmb3Igc3ViZmlsZSB0byBlbnN1cmUgc3ViZnMgbW50IGlzIG5vdCBm
cmVlZC4gRm9yCisgICAgaW5vZGUgb3BlcmF0aW9uIGl0IGluY3JlbWVudHMgdXNhZ2UgY291bnRl
ciBvZiBzdWJtbnQgZm9yIGR1cmF0aW9uCisgICAgb2Ygb3BlcmF0aW9uLgorCisgIC0gbWFrZSBz
dXJlIHN1cGVybW91bnRlZCBkZXZpY2UgY2FuJ3QgYmUgbW91bnRlZCB0d2ljZSAodGhhdCBpcwor
ICAgIGFsbG93ZWQgYnkga2VybmVsKSBiZWNhdXNlIGl0IHJlbGllcyBvbiBiZWluZyB0aGUgb25s
eSAib3duZXIiIG9mCisgICAgc3ViZnMuIEl0IGRvZXMgaXQgYnkgY2hlY2tpbmcgZm9yIE1TX1NV
UEVSTU9VTlRFRCBmbGFnIG9uIG1vdW50LgorCisgIC0gbWFrZSBzdXJlIHlvdSBjYW4ndCBtb3Vu
dCBvdmVyIHN1cGVybW91bnRlZCBkaXJlY3RvcnkuIEFsbG93aW5nCisgICAgaXQgaXMgYSBuaWdo
dG1hcmUgYW5kIEkgY2Fubm90IHNlZSBhbnkgcmVhc29uIGZvciBpdCAoaWYgeW91IGNhbgorICAg
IHByb3ZpZGUgdmFsaWQgb25lIC0gSSBtYXkgcmVjb25zaWRlciB0aGlzIHBhcnQpLiBJdCBkb2Vz
IHNvIGJ5CisgICAgYWRkaW5nIGZzdHlwZSBmbGFnIGFuZCBjaGVja2luZyBpdCBvbiBtb3VudGlu
Zy4KKworICAtIHJlamVjdCBtb3VudCAtbyByZW1vdW50IGZvciB0aGUgdGltZSBiZWluZyAodW50
aWwgd2UgY2FuIGRlYWwKKyAgICB3aXRoIGl0IHByb3Blcmx5KQorCisgIC0gY29tcGxldGVseSBj
aGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgaW5kaXZpZHVhbCBpbm9kZSBtZXRob2RzLgorICAgIElu
c3RlYWQgb2YgY2FsbGluZyBWRlMgcmVjdXJzaXZlbHkgaXQgY2FsbHMgc3ViZnMgbWV0aG9kcyBk
aXJlY3RseS4KKyAgICBJdCBpcyB0byBlbnN1cmUgd2UgYXJlIGluIGZ1bGwgY29udHJvbCBvZiBz
dWJmcyAoYXNzdW1pbmcgaXQgYmVoYXZlcworICAgIHByb3Blcmx5IDopCisKKyAgLSBwcm9wZXJs
eSBpbXBsZW1lbnQgVk0gbWV0aG9kcy4gQ3VycmVudGx5IGNoYW5naW5nIG1lZGlhIHdvdWxkCisg
ICAgbGVhdmUgeW91IHdpdGggdm1fYXJlYSBwb2ludGluZyB0byBubyBtb3JlIGV4aXN0aW5nIGlu
b2RlIC4uLgorCisgIC0gcmVtb3ZlIG1hbnkgb2Jzb2xldGUgcGllY2VzIGxpa2UgZmxhZ3MgdGhh
dCBqdXN0IGR1cGxpY2F0ZQorICAgIGV4aXN0aW5nIGluZm9ybWF0aW9uLgorCisgIC0gZW5zdXJl
IGNvaGVyZW5jeSBiZXR3ZWVuIHN1cGVyLSBhbmQgc3ViZnMgZGVudHJpZXMuIEVpdGhlciB3ZQor
ICAgIGhhdmUgYm90aCBhY3RpdmUgaW4gZGNhY2hlIG9yIGRvIG5vdCBoYXZlIHRoZW0gYXQgYWxs
LgorCisgIC0gZml4ZSB0aGUgcHJvYmxlbSB3aXRoIG1lZGlhIGVqZWN0aW9uIGFmdGVyIGRpcmVj
dCBhY2Nlc3MgdG8gQ0QtUk9NCisKKyAgLSBhZGQgImp1c3QgZGlzYyBjaGFuZ2UiIHRvIGFsbCBv
cGVyYXRpb25zIHRvIGRldGVjdCBtZWRpYSBjaGFuZ2UKKyAgICBhcyBzb29uIGFzIHBvc3NpYmxl
LiBJdCBpcyBwb3NzaWJsZSB0byBhZGQgb3B0aW9uIHRvIGRvIGl0IGp1c3QKKyAgICBmb3Igd3Jp
dGFibGUgbWVkaWEgb3IgdG8gY29tcGxldGVseSB0dXJuIGl0IG9mZi4KZGlmZiAtdXJOIGxpbnV4
LTIuNi4yNS40Lm9yaWcvZnMvc3VwZXJtb3VudC9kZW50cnkuYyBsaW51eC0yLjYuMjUuNC9mcy9z
dXBlcm1vdW50L2RlbnRyeS5jCi0tLSBsaW51eC0yLjYuMjUuNC5vcmlnL2ZzL3N1cGVybW91bnQv
ZGVudHJ5LmMJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQvZnMv
c3VwZXJtb3VudC9kZW50cnkuYwkyMDA4LTA1LTIwIDAxOjI3OjUzICswMzAwCkBAIC0wLDAgKzEs
MjgyIEBACisvKgorICogIGxpbnV4L2ZzL3N1cGVybW91bnQvZGVudHJ5LmMKKyAqCisgKiAgT3Jp
Z2luYWwgdmVyc2lvbjoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk1CisgKiAgICAgIFN0ZXBo
ZW4gVHdlZWRpZSAoc2N0QGRjcy5lZC5hYy51aykKKyAqCisgKiAgUmV3cml0ZW4gZm9yIGtlcm5l
bCAyLjIgJiAyLjQuIChDKSAxOTk5LCAyMDAwIEFsZXhpcyBNaWtoYWlsb3YKKyAqICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsZXhpc0BhYmMuY2FwLnJ1KQorICogIFJld3Jp
dHRlbiBmb3Iga2VybmVsIDIuNC4yMSAoQykgMjAwMyBBbmRyZXkgQm9yemVua292CisgKiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcnZpZGphYXJAbWFpbC5ydSkKKyAq
ICBSZXdyaXR0ZW4gZm9yIGtlcm5lbCAyLjUuNzAgKEMpIDIwMDMgQW5kcmV5IEJvcnplbmtvdgor
ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJ2aWRqYWFyQG1haWwu
cnUpCisgKgorICogICRJZDogZGVudHJ5LmMsdiAxLjkuMi4zIDIwMDMvMDcvMTMgMTQ6NTI6NDMg
Ym9yIEV4cCAkCisgKi8KKworI2RlZmluZSBTX0RCR19UUkFDRV9DVVJSRU5UIFNfREJHX1RSQUNF
X0RFTlRSWQorI2luY2x1ZGUgInN1cGVybW91bnQuaCIKKworaW50Citpbml0X2RlbnRyeV9pbmZv
KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVu
dHJ5LT5kX3NiOworCXN0cnVjdCBzdXBlcm1vdW50X2RlbnRyeV9pbmZvICpzZGk7CisJaW50IHJj
OworCisJRU5URVIoc2IsICJkZW50cnk9JXMiLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXJj
ID0gMTsKKwlzZGkgPSBrbWFsbG9jKHNpemVvZigqc2RpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFz
ZGkpCisJCWdvdG8gb3V0OworCisJbWVtc2V0KHNkaSwgMCwgc2l6ZW9mKCpzZGkpKTsKKworCUlO
SVRfTElTVF9IRUFEKCZzZGktPmxpc3QpOworCXNkaS0+ZGVudHJ5ID0gMDsKKwlzZGktPmhvc3Qg
PSBkZW50cnk7CisJCisJZGVudHJ5LT5kX2ZzZGF0YSA9IHNkaTsKKwlkZW50cnktPmRfb3AgPSAm
c3VwZXJtb3VudF9kb3BzOworCisJcmMgPSAwOworb3V0OgorCUxFQVZFKHNiLCAiZGVudHJ5PSVz
IHJjPSVkIiwgZGVudHJ5LT5kX25hbWUubmFtZSwgcmMpOworCisJcmV0dXJuIHJjOworCit9CisK
K3ZvaWQKK2F0dGFjaF9zdWJmc19kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qg
ZGVudHJ5ICpzdWJkZW50KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRf
c2I7CisJc3RydWN0IHN1cGVybW91bnRfc2JfaW5mbyAqc2JpID0gc3VwZXJtb3VudF9zYmkoc2Ip
OworCXN0cnVjdCBzdXBlcm1vdW50X2RlbnRyeV9pbmZvICpzZGk7CisKKwlFTlRFUihzYiwgImRl
bnRyeT0lcyBzdWJkPSVwIiwgZGVudHJ5LT5kX25hbWUubmFtZSwgc3ViZGVudCk7CisKKwlzZGkg
PSBzdXBlcm1vdW50X2QoZGVudHJ5KTsKKwlTVVBFUk1PVU5UX0JVR19MT0NLRURfT04oc2IsIHNk
aS0+ZGVudHJ5KTsKKwlzZGktPmRlbnRyeSA9IGRnZXQoc3ViZGVudCk7CisJbGlzdF9hZGQoJnNk
aS0+bGlzdCwgJnNiaS0+c19kZW50cmllcyk7CisKKwlMRUFWRShzYiwgImRlbnRyeT0lcyIsIGRl
bnRyeS0+ZF9uYW1lLm5hbWUpOworfQorCisKK3N0cnVjdCBkZW50cnkgKgorZ2V0X3N1YmZzX2Rl
bnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9
IGRlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3QgZGVudHJ5ICplcnI7CisJc3RydWN0IHN1cGVybW91bnRf
ZGVudHJ5X2luZm8gKnNkaSA9IHN1cGVybW91bnRfZChkZW50cnkpOworCisJRU5URVIoc2IsICJk
ZW50cnk9JXMiLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXN1YmZzX2xvY2soc2IpOworCisJ
ZXJyID0gRVJSX1BUUigtRU5PTUVESVVNKTsKKwlpZiAoIXN1YmZzX2lzX21vdW50ZWQoc2IpKQor
CQlnb3RvIG91dDsKKworCWVyciA9IEVSUl9QVFIoLUVTVEFMRSk7CisJaWYgKGlzX2RlbnRyeV9v
YnNvbGV0ZShkZW50cnkpKQorCQlnb3RvIG91dDsKKworCWVyciA9IGRnZXQoc2RpLT5kZW50cnkp
OworCVNVUEVSTU9VTlRfQlVHX0xPQ0tFRF9PTihzYiwgIWVycik7CisJU1VQRVJNT1VOVF9CVUdf
TE9DS0VEX09OKHNiLCAoZGVudHJ5LT5kX2lub2RlID09IDApIF4gKGVyci0+ZF9pbm9kZSA9PSAw
KSk7CisKK291dDoKKwlzdWJmc191bmxvY2soc2IpOworCisJTEVBVkUoc2IsICJkZW50cnk9JXMg
c3ViZD0lcCIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGVycik7CisKKwlyZXR1cm4gZXJyOworfQor
CitzdGF0aWMgaW50CitzdXBlcm1vdW50X2RfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50
cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBk
ZW50cnktPmRfc2I7CisJc3RydWN0IGRlbnRyeSAqc3ViZDsKKwlpbnQgcmM7CisJc3RydWN0IHZm
c21vdW50ICptbnQ7CisKKwlFTlRFUihzYiwgImRlbnRyeT0lcyIsIGRlbnRyeS0+ZF9uYW1lLm5h
bWUpOworCisJcmMgPSAwOworCW1udCA9IHN1YmZzX3ByZXZlbnRfdW1vdW50KHNiKTsKKwlpZiAo
IW1udCkKKwkJZ290byBvdXQ7CisJCisJc3ViZCA9IGdldF9zdWJmc19kZW50cnkoZGVudHJ5KTsK
KworCWlmIChJU19FUlIoc3ViZCkpCisJCWdvdG8gYWxsb3dfdW1vdW50OworCisJcmMgPSAxOwor
CS8qIEZJWE1FIGRvIHdlIG5lZWQgdG8gYnVpbGQgcHJvcGVyIHN1YmZzIG5kPyAqLworCWlmIChz
dWJkLT5kX29wICYmIHN1YmQtPmRfb3AtPmRfcmV2YWxpZGF0ZSkKKwkJcmMgPSBzdWJkLT5kX29w
LT5kX3JldmFsaWRhdGUoc3ViZCwgbmQpOworCisJZHB1dChzdWJkKTsKK2FsbG93X3Vtb3VudDoK
KwlzdWJmc19hbGxvd191bW91bnQoc2IsIG1udCk7CitvdXQ6CisKKwlMRUFWRShzYiwgImRlbnRy
eT0lcyByYz0lZCIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHJjKTsKKworCXJldHVybiByYzsKK30K
Kworc3RhdGljIGludAorc3VwZXJtb3VudF9kX2hhc2goc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBz
dHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5k
X3NiOworCXN0cnVjdCBkZW50cnkgKnN1YmQ7CisJaW50IHJjOworCXN0cnVjdCB2ZnNtb3VudCAq
bW50OworCisJRU5URVIoc2IsICJkZW50cnk9JXMgbmFtZT0lcyIsIGRlbnRyeS0+ZF9uYW1lLm5h
bWUsIG5hbWUtPm5hbWUpOworCisJcmMgPSAtRU5PTUVESVVNOworCW1udCA9IHN1YmZzX3ByZXZl
bnRfdW1vdW50KHNiKTsKKwlpZiAoIW1udCkKKwkJZ290byBvdXQ7CisJCisJc3ViZCA9IGdldF9z
dWJmc19kZW50cnkoZGVudHJ5KTsKKwlyYyA9IFBUUl9FUlIoc3ViZCk7CisJaWYgKElTX0VSUihz
dWJkKSkKKwkJZ290byBhbGxvd191bW91bnQ7CisKKwlyYyA9IDA7CisJaWYgKHN1YmQtPmRfb3Ag
JiYgc3ViZC0+ZF9vcCAmJiBzdWJkLT5kX29wLT5kX2hhc2gpCisJCXJjID0gc3ViZC0+ZF9vcC0+
ZF9oYXNoKHN1YmQsIG5hbWUpOworCisJZHB1dChzdWJkKTsKK2FsbG93X3Vtb3VudDoKKwlzdWJm
c19hbGxvd191bW91bnQoc2IsIG1udCk7CitvdXQ6CisJTEVBVkUoc2IsICJkZW50cnk9JXMgcmM9
JWQiLCBkZW50cnktPmRfbmFtZS5uYW1lLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworcnds
b2NrX3QgZF9jb21wYXJlX2xvY2sgPSBSV19MT0NLX1VOTE9DS0VEOworCitzdGF0aWMgaW50Citz
dXBlcm1vdW50X2RfY29tcGFyZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpu
YW1lMSwgc3RydWN0IHFzdHIgKm5hbWUyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBk
ZW50cnktPmRfc2I7CisJc3RydWN0IHN1cGVybW91bnRfZGVudHJ5X2luZm8gKnNkaTsKKwlzdHJ1
Y3QgZGVudHJ5ICpzdWJkOworCWludCByYzsKKworCUVOVEVSKHNiLCAiZGVudHJ5PSVzIG5hbWUx
PSVzIG5hbWUyPSVzIiwgZGVudHJ5LT5kX25hbWUubmFtZSwgbmFtZTEtPm5hbWUsIG5hbWUyLT5u
YW1lKTsKKworCXJjID0gMTsgLyogZmFpbCBieSBkZWZhdWx0ICovCisJc2RpID0gZGVudHJ5LT5k
X2ZzZGF0YTsKKwlTVVBFUk1PVU5UX0JVR19PTighc2RpKTsKKworCS8qCisJICogSEFDSyAtIEZJ
WE1FCisJICogdGhpcyBwcm90ZWN0cyBhZ2FpbnN0IHJhY2VzIHdpdGggc3VwZXJtb3VudF9jbGVh
bl9kZW50cmllcworCSAqIEkgY2Fubm90IHVzZSBibG9ja2luZyBjYWxscyAoaS5lLiBzYmktPnNl
bSkgaGVyZSBhbmQgaXQgaXMgbm90CisJICogcHJvdGVjdGVkIGJ5IGRjYWNoZV9sb2NrIGFueW1v
cmUKKwkgKi8KKwlyZWFkX2xvY2soJmRfY29tcGFyZV9sb2NrKTsKKwlzdWJkID0gc2RpLT5kZW50
cnk7CisJaWYgKCFzdWJkKSB7CisJCXJlYWRfdW5sb2NrKCZkX2NvbXBhcmVfbG9jayk7CisJCWdv
dG8gb3V0OworCX0KKworCWlmIChzdWJkLT5kX29wICYmIHN1YmQtPmRfb3AtPmRfY29tcGFyZSkK
KwkJcmMgPSBzdWJkLT5kX29wLT5kX2NvbXBhcmUoc3ViZCwgbmFtZTEsIG5hbWUyKTsKKwllbHNl
IHsgLyogYmFzZWQgb24gZnMvZGNhY2hlLmM6ZF9sb29rdXAgKi8KKwkJaWYgKG5hbWUxLT5sZW4g
PT0gbmFtZTItPmxlbikKKwkJICAgICByYyA9IG1lbWNtcChuYW1lMS0+bmFtZSwgbmFtZTItPm5h
bWUsIG5hbWUxLT5sZW4pOworCX0KKwlyZWFkX3VubG9jaygmZF9jb21wYXJlX2xvY2spOworCitv
dXQ6CisJTEVBVkUoc2IsICJkZW50cnk9JXMgcmM9JWQiLCBkZW50cnktPmRfbmFtZS5uYW1lLCBy
Yyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2hhbmRsZV9zdWJkZW50
KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVu
dHJ5LT5kX3NiOworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCXN0cnVjdCBzdXBlcm1vdW50X2Rl
bnRyeV9pbmZvICpzZGkgPSBzdXBlcm1vdW50X2QoZGVudHJ5KTsKKwlzdHJ1Y3QgZGVudHJ5ICpz
dWJkID0gMDsKKworCW1udCA9IHN1YmZzX3ByZXZlbnRfdW1vdW50KHNiKTsKKwlpZiAoIW1udCkK
KwkJZ290byBvdXQ7CisKKwlzdWJmc19sb2NrKHNiKTsKKwlpZiAoc2RpKSB7CisJCXN1YmQgPSBz
ZGktPmRlbnRyeTsKKwkJbGlzdF9kZWxfaW5pdCgmc2RpLT5saXN0KTsKKwkJc2RpLT5kZW50cnkg
PSAwOworCX0KKwlzdWJmc191bmxvY2soc2IpOworCisJaWYgKHN1YmQpCisJCWRwdXQoc3ViZCk7
CisKKwlzdWJmc19hbGxvd191bW91bnQoc2IsIG1udCk7CitvdXQ6CisJcmV0dXJuOworfQorCisv
KgorICogaW4gY2FzZSBvZiBhY3RpdmUgZGVudHJ5IHdlIG11c3QgYmUgc3VyZSBzdWJmcyBkZW50
cnkgaXMgcmVsZWFzZWQKKyAqIGJlZm9yZSBzdWJmcyBpbm9kZSB0byBjb3JyZWN0bHkgbWFpbnRh
aW4gd3JpdGUgc3RhdGUKKyAqLworc3RhdGljIHZvaWQKK3N1cGVybW91bnRfZF9pcHV0KHN0cnVj
dCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOworCisJRU5URVIoc2IsICJkZW50cnk9JXMgaW5vZGU9
JXAiLCBkZW50cnktPmRfbmFtZS5uYW1lLCBpbm9kZSk7CisKKwloYW5kbGVfc3ViZGVudChkZW50
cnkpOworCWlwdXQoaW5vZGUpOworCisJTEVBVkUoc2IsICJkZW50cnk9JXMiLCBkZW50cnktPmRf
bmFtZS5uYW1lKTsKK30KKwkKKworLyoKKyAqIHRoaXMgZHVwbGljYXRlZCBjb2RlIGlzIGR1ZSB0
byB0aGUgbGFjayBvZiBjb21tb24gImRlc3Ryb3kiIG1ldGhvZAorICogZm9yIGJvdGggbmVnYXRp
dmUgYW5kIHBvc2l0aXZlIGRlbnRyaWVzCisgKi8KK3N0YXRpYyB2b2lkCitzdXBlcm1vdW50X2Rf
cmVsZWFzZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpz
YiA9IGRlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3Qgc3VwZXJtb3VudF9kZW50cnlfaW5mbyAqc2RpID0g
c3VwZXJtb3VudF9kKGRlbnRyeSk7CisKKwlFTlRFUihzYiwgImRlbnRyeT0lcyIsIGRlbnRyeS0+
ZF9uYW1lLm5hbWUpOworCisJaGFuZGxlX3N1YmRlbnQoZGVudHJ5KTsKKwlrZnJlZShzZGkpOwor
CisJTEVBVkUoc2IsICJkZW50cnk9JXMiLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKK30KKworc3Ry
dWN0IGRlbnRyeV9vcGVyYXRpb25zIHN1cGVybW91bnRfZG9wcyA9IHsKKwkuZF9yZXZhbGlkYXRl
CT0gc3VwZXJtb3VudF9kX3JldmFsaWRhdGUsCisJLmRfaGFzaAkJPSBzdXBlcm1vdW50X2RfaGFz
aCwKKwkuZF9jb21wYXJlCT0gc3VwZXJtb3VudF9kX2NvbXBhcmUsCisJLmRfaXB1dAkJPSBzdXBl
cm1vdW50X2RfaXB1dCwKKwkuZF9yZWxlYXNlCT0gc3VwZXJtb3VudF9kX3JlbGVhc2UsCit9Owpk
aWZmIC11ck4gbGludXgtMi42LjI1LjQub3JpZy9mcy9zdXBlcm1vdW50L2ZpbGUuYyBsaW51eC0y
LjYuMjUuNC9mcy9zdXBlcm1vdW50L2ZpbGUuYwotLS0gbGludXgtMi42LjI1LjQub3JpZy9mcy9z
dXBlcm1vdW50L2ZpbGUuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYu
MjUuNC9mcy9zdXBlcm1vdW50L2ZpbGUuYwkyMDA4LTA1LTIwIDAxOjI3OjUzICswMzAwCkBAIC0w
LDAgKzEsNjkwIEBACisvKgorICogIGxpbnV4L2ZzL3N1cGVybW91bnQvZmlsZS5jCisgKgorICog
IE9yaWdpbmFsIHZlcnNpb246CisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NworICog
ICAgICBTdGVwaGVuIFR3ZWVkaWUgKHNjdEBkY3MuZWQuYWMudWspCisgKgorICogICAgICBmcm9t
CisgKgorICogICAgICBsaW51eC9mcy9taW5peC9kaXIuYworICogICAgICBDb3B5cmlnaHQgKEMp
IDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogICAgICBhbmQKKyAqCisgKiAgICAg
IGxpbnV4L2ZzL2V4dDIvZGlyLmMKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAx
OTk0LCAxOTk1ICBSZW15IENhcmQKKyAqCisgKiAgUmV3cml0ZW4gZm9yIGtlcm5lbCAyLjIgJiAy
LjQuIChDKSAxOTk5LCAyMDAwIEFsZXhpcyBNaWtoYWlsb3YKKyAqICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGFsZXhpc0BhYmMuY2FwLnJ1KQorICogIFJld3JpdGVuIGZvciBr
ZXJuZWwgMi40LiAoQykgMjAwMSBNYW5kcmFrZVNvZnQgSW5jLgorICogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBKdWFuIFF1aW50ZWxhIChxdWludGVsYUBtYW5kcmFrZXNvZnQu
Y29tKQorICogIFJld3JpdHRlbiBmb3Iga2VybmVsIDIuNC4yMSAoQykgMjAwMyBBbmRyZXkgQm9y
emVua292CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcnZpZGph
YXJAbWFpbC5ydSkKKyAqICBSZXdyaXR0ZW4gZm9yIGtlcm5lbCAyLjUuNzAgKEMpIDIwMDMgQW5k
cmV5IEJvcnplbmtvdgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
YXJ2aWRqYWFyQG1haWwucnUpCisgKgorICogICRJZDogZmlsZS5jLHYgMS4xMy40LjQgMjAwMy8w
Ny8xMyAxNDo1Mjo0MyBib3IgRXhwICQKKyAqLworCisjZGVmaW5lIFNfREJHX1RSQUNFX0NVUlJF
TlQgU19EQkdfVFJBQ0VfRklMRQorI2luY2x1ZGUgInN1cGVybW91bnQuaCIKKworI2RlZmluZSBE
RUZBVUxUX1BPTExNQVNLIChQT0xMSU4gfCBQT0xMT1VUIHwgUE9MTFJETk9STSB8IFBPTExXUk5P
Uk0pCisKK3N0YXRpYyBpbmxpbmUgaW50Citpbml0X2ZpbGVfaW5mbyhzdHJ1Y3QgZmlsZSAqZmls
ZSwgdW5zaWduZWQgaW50IGZha2UpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGZpbGUt
PmZfZGVudHJ5LT5kX3NiOworCXN0cnVjdCBzdXBlcm1vdW50X2ZpbGVfaW5mbyAqc2ZpOworCWlu
dCByYzsKKworCUVOVEVSKHNiLCAiZmlsZT0lcCBmYWtlPSVkIiwgZmlsZSwgZmFrZSk7CisKKwly
YyA9IDE7CisJc2ZpID0ga21hbGxvYyhzaXplb2YoKnNmaSksIEdGUF9LRVJORUwpOworCWlmICgh
c2ZpKQorCQlnb3RvIG91dDsKKworCW1lbXNldChzZmksIDAsIHNpemVvZigqc2ZpKSk7CisKKwlJ
TklUX0xJU1RfSEVBRCgmc2ZpLT5saXN0KTsKKwlzZmktPmhvc3QgPSBmaWxlOworCXNmaS0+b3du
ZXIgPSBjdXJyZW50LT5waWQ7CisJc2ZpLT52bV9vcHMgPSAwOworCXNmaS0+ZmlsZSA9IDA7CisJ
c2ZpLT5mYWtlID0gZmFrZTsKKwkKKwlmaWxlLT5mX3N1cGVybW91bnQgPSBzZmk7CisKKwlyYyA9
IDA7CitvdXQ6CisJTEVBVkUoc2IsICJmaWxlPSVwIGZha2U9JWQgcmM9JWQiLCBmaWxlLCBmYWtl
LCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYXR0YWNoX3N1
YmZzX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmaWxlICpzdWJmaWxlKQoreworCXN0
cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlLT5mX2RlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3Qgc3Vw
ZXJtb3VudF9zYl9pbmZvICpzYmkgPSBzdXBlcm1vdW50X3NiaShzYik7CisJc3RydWN0IHN1cGVy
bW91bnRfZmlsZV9pbmZvICpzZmk7CisKKwlFTlRFUihzYiwgImZpbGU9JXAgc3ViZmlsZT0lcCIs
IGZpbGUsIHN1YmZpbGUpOworCisJc2ZpID0gc3VwZXJtb3VudF9mKGZpbGUpOworCXNmaS0+Zmls
ZSA9IHN1YmZpbGU7CisJbGlzdF9hZGQoJnNmaS0+bGlzdCwgJnNiaS0+c19maWxlcyk7CisKKwlM
RUFWRShzYiwgImZpbGU9JXAgc3ViZmlsZT0lcCIsIGZpbGUsIHN1YmZpbGUpOworfQorCitzdGF0
aWMgaW5saW5lIGludAorcHJlcGFyZV9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZmls
ZSAqc3ViZmlsZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZS0+Zl9kZW50cnkt
PmRfc2I7CisJaW50IHJjOworCisJRU5URVIoc2IsICJmaWxlPSVwIHN1YmZpbGU9JXAiLCBmaWxl
LCBzdWJmaWxlKTsKKworCXN1YmZzX2xvY2soc2IpOworCisJcmMgPSAtRU5PTUVESVVNOworCWlm
ICghc3ViZnNfaXNfbW91bnRlZChzYikpCisJCWdvdG8gb3V0OworCisJcmMgPSAtRVNUQUxFOwor
CWlmIChpc19kZW50cnlfb2Jzb2xldGUoZmlsZS0+Zl9kZW50cnkpKQorCQlnb3RvIG91dDsKKwor
CXJjID0gLUVOT01FTTsKKwlpZiAoaW5pdF9maWxlX2luZm8oZmlsZSwgMCkpCisJCWdvdG8gb3V0
OworCisJYXR0YWNoX3N1YmZzX2ZpbGUoZmlsZSwgc3ViZmlsZSk7CisJcmMgPSAwOworCitvdXQ6
CisJc3ViZnNfdW5sb2NrKHNiKTsKKworCUxFQVZFKHNiLCAiZmlsZT0lcCBzdWJmaWxlPSVwIiwg
ZmlsZSwgc3ViZmlsZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0cnVjdCBmaWxlICoKK2dldF9z
dWJmc19maWxlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2Ig
PSBmaWxlLT5mX2RlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3Qgc3VwZXJtb3VudF9maWxlX2luZm8gKnNm
aSA9IHN1cGVybW91bnRfZihmaWxlKTsKKwlzdHJ1Y3QgZmlsZSAqZXJyOworCisJRU5URVIoc2Is
ICJmaWxlPSVwIiwgZmlsZSk7CisKKwlzdWJmc19sb2NrKHNiKTsKKwkKKwllcnIgPSBFUlJfUFRS
KC1FTk9NRURJVU0pOworCWlmICghc3ViZnNfaXNfbW91bnRlZChzYikpCisJCWdvdG8gb3V0Owor
CisJZXJyID0gRVJSX1BUUigtRVNUQUxFKTsKKwlpZiAoaXNfZmlsZV9mYWtlKGZpbGUpIHx8IGlz
X2ZpbGVfb2Jzb2xldGUoZmlsZSkpCisJCWdvdG8gb3V0OworCisJZXJyID0gc2ZpLT5maWxlOwor
CVNVUEVSTU9VTlRfQlVHX0xPQ0tFRF9PTihzYiwgIWVyci0+Zl9kZW50cnkpOworCVNVUEVSTU9V
TlRfQlVHX0xPQ0tFRF9PTihzYiwgIWVyci0+Zl9kZW50cnktPmRfaW5vZGUpOworCWdldF9maWxl
KGVycik7CisKK291dDoKKwlzdWJmc191bmxvY2soc2IpOworCisJTEVBVkUoc2IsICJmaWxlPSVw
IHN1YmZpbGU9JXAiLCBmaWxlLCBlcnIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGxv
ZmZfdAorc3VwZXJtb3VudF9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQs
IGludCBvcmlnaW4pCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGZpbGUtPmZfZGVudHJ5
LT5kX3NiOworCXN0cnVjdCBmaWxlICpzdWJmaWxlOworCWxvZmZfdCByYzsKKworCUVOVEVSKHNi
LCAiZmlsZT0lcCBvZmZzZXQ9JWxsZCBvcmlnaW49JWQiLCBmaWxlLCBvZmZzZXQsIG9yaWdpbik7
CisKKwlyYyA9IC1FU1RBTEU7CisJaWYgKHN1YmZzX2NoZWNrX2Rpc2tfY2hhbmdlKHNiKSkKKwkJ
Z290byBvdXQ7CisKKwlzdWJmaWxlID0gZ2V0X3N1YmZzX2ZpbGUoZmlsZSk7CisJcmMgPSBQVFJf
RVJSKHN1YmZpbGUpOworCWlmIChJU19FUlIoc3ViZmlsZSkpCisJCWdvdG8gb3V0OworCisJaWYg
KHN1YmZpbGUtPmZfb3AgJiYgc3ViZmlsZS0+Zl9vcC0+bGxzZWVrKQorCQlyYyA9IHN1YmZpbGUt
PmZfb3AtPmxsc2VlayhzdWJmaWxlLCBvZmZzZXQsIG9yaWdpbik7CisJZWxzZQorCQlyYyA9IGRl
ZmF1bHRfbGxzZWVrKHN1YmZpbGUsIG9mZnNldCwgb3JpZ2luKTsKKwlmaWxlLT5mX3BvcyA9IHN1
YmZpbGUtPmZfcG9zOworCWZpbGUtPmZfdmVyc2lvbiA9IHN1YmZpbGUtPmZfdmVyc2lvbjsKKwor
CWZwdXQoc3ViZmlsZSk7CitvdXQ6CisJTEVBVkUoc2IsICJmaWxlPSVwIHJjPSVsbGQiLCBmaWxl
LCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdXBlcm1vdW50X3Jl
YWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBw
cG9zKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlLT5mX2RlbnRyeS0+ZF9zYjsK
KwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0
IGZpbGUgKnN1YmZpbGU7CisJaW50IHdyaXRlX29uID0gTkVFRF9XUklURV9BVElNRShpbm9kZSk7
CisJaW50IHJjOworCisJRU5URVIoc2IsICJmaWxlPSVwIiwgZmlsZSk7CisKKwlyYyA9IC1FU1RB
TEU7CisJaWYgKHN1YmZzX2NoZWNrX2Rpc2tfY2hhbmdlKHNiKSkKKwkJZ290byBvdXQ7CisKKwlz
dWJmaWxlID0gZ2V0X3N1YmZzX2ZpbGUoZmlsZSk7CisJcmMgPSBQVFJfRVJSKHN1YmZpbGUpOwor
CWlmIChJU19FUlIoc3ViZmlsZSkpCisJCWdvdG8gb3V0OworCisJcmMgPSAtRUlOVkFMOworCWlm
ICghc3ViZmlsZS0+Zl9vcCB8fCAhc3ViZmlsZS0+Zl9vcC0+cmVhZCkKKwkJZ290byBwdXRfc3Vi
ZmlsZTsKKworCXJjID0gc3ViZnNfZ2V0X2FjY2Vzcyhpbm9kZSwgd3JpdGVfb24pOworCWlmIChy
YykKKwkJZ290byBwdXRfc3ViZmlsZTsKKworCXJjID0gc3ViZmlsZS0+Zl9vcC0+cmVhZChzdWJm
aWxlLCBidWYsIGNvdW50LCBwcG9zKTsKKwlzdWJmc19wdXRfYWNjZXNzKGlub2RlLCB3cml0ZV9v
bik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBwdXRfc3ViZmlsZTsKKworCWlub2RlLT5pX2F0aW1l
ID0gc3ViZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfYXRpbWU7CisKKwlpZiAocmMgPiAwKQor
CQlmaWxlLT5mX3BvcyA9IHN1YmZpbGUtPmZfcG9zID0gKnBwb3M7CisKK3B1dF9zdWJmaWxlOgor
CWZwdXQoc3ViZmlsZSk7CitvdXQ6CisJTEVBVkUoc2IsICJmaWxlPSVwIHJjPSVkIiwgZmlsZSwg
cmMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3NpemVfdAorc3VwZXJtb3VudF93cml0
ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAorCQkgc2l6ZV90IGNvdW50LCBs
b2ZmX3QgKiBwcG9zKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlLT5mX2RlbnRy
eS0+ZF9zYjsKKwlzdHJ1Y3QgZmlsZSAqc3ViZmlsZTsKKwlpbnQgcmM7CisKKwlFTlRFUihzYiwg
ImZpbGU9JXAiLCBmaWxlKTsKKworCXJjID0gLUVTVEFMRTsKKwlpZiAoc3ViZnNfY2hlY2tfZGlz
a19jaGFuZ2Uoc2IpKQorCQlnb3RvIG91dDsKKworCXN1YmZpbGUgPSBnZXRfc3ViZnNfZmlsZShm
aWxlKTsKKwlyYyA9IFBUUl9FUlIoc3ViZmlsZSk7CisJaWYgKElTX0VSUihzdWJmaWxlKSkKKwkJ
Z290byBvdXQ7CisKKwlyYyA9IDA7CisJaWYgKHN1YmZpbGUtPmZfb3AgJiYgc3ViZmlsZS0+Zl9v
cC0+d3JpdGUpCisJCXJjID0gc3ViZmlsZS0+Zl9vcC0+d3JpdGUoc3ViZmlsZSwgYnVmLCBjb3Vu
dCwgcHBvcyk7CisJaWYgKHJjID4gMCkgeworCQlzdHJ1Y3QgaW5vZGUgKnN1Ymlub2RlID0gc3Vi
ZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisKKwkJZmlsZS0+Zl9wb3MgPSBzdWJmaWxlLT5mX3Bv
cyA9ICpwcG9zOworCQlmaWxlLT5mX21vZGUgPSBzdWJmaWxlLT5mX21vZGU7CisJCWZpbGUtPmZf
ZGVudHJ5LT5kX2lub2RlLT5pX3NpemUgPSBzdWJpbm9kZS0+aV9zaXplOworCQlmaWxlLT5mX2Rl
bnRyeS0+ZF9pbm9kZS0+aV9ibG9ja3MgPSBzdWJpbm9kZS0+aV9ibG9ja3M7CisJCWZpbGUtPmZf
ZGVudHJ5LT5kX2lub2RlLT5pX21vZGUgPSBzdWJpbm9kZS0+aV9tb2RlOworCQlmaWxlLT5mX2Rl
bnRyeS0+ZF9pbm9kZS0+aV9jdGltZSA9IHN1Ymlub2RlLT5pX2N0aW1lOworCQlmaWxlLT5mX2Rl
bnRyeS0+ZF9pbm9kZS0+aV9tdGltZSA9IHN1Ymlub2RlLT5pX210aW1lOworCX0KKworCWZwdXQo
c3ViZmlsZSk7CitvdXQ6CisJTEVBVkUoc2IsICJmaWxlPSVwIHJjPSVkIiwgZmlsZSwgcmMpOwor
CisJcmV0dXJuIHJjOworfQorCitpbnQKK3N1cGVybW91bnRfcmVhZGRpcihzdHJ1Y3QgZmlsZSAq
ZmlsZSwgdm9pZCAqYnVmLCBmaWxsZGlyX3QgZmlsbF9mbikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxv
Y2sgKnNiID0gZmlsZS0+Zl9kZW50cnktPmRfc2I7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZp
bGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmaWxlICpzdWJmaWxlOworCWludCB3cml0
ZV9vbiA9IE5FRURfV1JJVEVfQVRJTUUoaW5vZGUpOworCWludCBmYWtlX3JlYWRkaXIgPSAxOwor
CWludCByYzsKKworCUVOVEVSKHNiLCAiZmlsZT0lcCIsIGZpbGUpOworCisJcmMgPSAtRVNUQUxF
OworCWlmIChzdWJmc19jaGVja19kaXNrX2NoYW5nZShzYikpCisJCWdvdG8gb3V0OworCisJc3Vi
ZmlsZSA9IGdldF9zdWJmc19maWxlKGZpbGUpOworCXJjID0gUFRSX0VSUihzdWJmaWxlKTsKKwlp
ZiAoSVNfRVJSKHN1YmZpbGUpKQorCQlnb3RvIG91dDsKKworCXJjID0gLUVOT1RESVI7CisJaWYg
KCFzdWJmaWxlLT5mX29wIHx8ICFzdWJmaWxlLT5mX29wLT5yZWFkZGlyKQorCQlnb3RvIHB1dF9z
dWJmaWxlOworCisJcmMgPSBzdWJmc19nZXRfYWNjZXNzKGlub2RlLCB3cml0ZV9vbik7CisJaWYg
KHJjKQorCQlnb3RvIHB1dF9zdWJmaWxlOworCisJLyogRklYTUUgc2hvdWxkIGl0IGdvIGJlZm9y
ZSBnZXRfYWNjZXNzPyAqLworCWZha2VfcmVhZGRpciA9IDA7CisJcmMgPSBzdWJmaWxlLT5mX29w
LT5yZWFkZGlyKHN1YmZpbGUsIGJ1ZiwgZmlsbF9mbik7CisJc3ViZnNfcHV0X2FjY2Vzcyhpbm9k
ZSwgd3JpdGVfb24pOworCWlmIChyYykKKwkJZ290byBwdXRfc3ViZmlsZTsKKworCWlub2RlLT5p
X2F0aW1lID0gc3ViZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfYXRpbWU7CisJZmlsZS0+Zl9w
b3MgPSBzdWJmaWxlLT5mX3BvczsKKworcHV0X3N1YmZpbGU6CisJZnB1dChzdWJmaWxlKTsKK291
dDoKKwlpZiAoZmFrZV9yZWFkZGlyICYmIGlzX2ZpbGVfZmFrZShmaWxlKSkgeworCQkvKiBjZi4g
c3VwZXJtb3VudF9vcGVuICovCisJCXJjID0gMDsKKwl9CisJTEVBVkUoc2IsICJmaWxlPSVwIHJj
PSVkIGZwb3M9JWxsZCIsIGZpbGUsIHJjLCBmaWxlLT5mX3Bvcyk7CisKKwlyZXR1cm4gcmM7Cit9
CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3N1cGVybW91bnRfcG9sbChzdHJ1Y3QgZmlsZSAqZmls
ZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp0YWJsZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxv
Y2sgKnNiID0gZmlsZS0+Zl9kZW50cnktPmRfc2I7CisJc3RydWN0IGZpbGUgKnN1YmZpbGU7CisJ
aW50IHJjOworCisJRU5URVIoc2IsICJmaWxlPSVwIiwgZmlsZSk7CisKKwlyYyA9IC1FU1RBTEU7
CisJaWYgKHN1YmZzX2NoZWNrX2Rpc2tfY2hhbmdlKHNiKSkKKwkJZ290byBvdXQ7CisKKwlzdWJm
aWxlID0gZ2V0X3N1YmZzX2ZpbGUoZmlsZSk7CisJcmMgPSBQVFJfRVJSKHN1YmZpbGUpOworCWlm
IChJU19FUlIoc3ViZmlsZSkpCisJCWdvdG8gb3V0OworCisJcmMgPSBERUZBVUxUX1BPTExNQVNL
OworCWlmIChzdWJmaWxlLT5mX29wICYmIHN1YmZpbGUtPmZfb3AtPnBvbGwpCisJCXJjID0gc3Vi
ZmlsZS0+Zl9vcC0+cG9sbChzdWJmaWxlLCB0YWJsZSk7CisKKwlmcHV0KHN1YmZpbGUpOworb3V0
OgorCUxFQVZFKHNiLCAiZmlsZT0lcCByYz0lZCIsIGZpbGUsIHJjKTsKKworCXJldHVybiByYzsK
K30KKworc3RhdGljIGludAorc3VwZXJtb3VudF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBz
dHJ1Y3QgZmlsZSAqZmlsZSwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJn
KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlLT5mX2RlbnRyeS0+ZF9zYjsKKwlz
dHJ1Y3QgZmlsZSAqc3ViZmlsZTsKKwlzdHJ1Y3QgaW5vZGUgKnN1Ymlub2RlOworCWludCByYzsK
KworCUVOVEVSKHNiLCAiZmlsZT0lcCBjbWQ9JXUgYXJnPSVsdSIsIGZpbGUsIGNtZCwgYXJnKTsK
KworCXJjID0gLUVTVEFMRTsKKwlpZiAoc3ViZnNfY2hlY2tfZGlza19jaGFuZ2Uoc2IpKQorCQln
b3RvIG91dDsKKworCXN1YmZpbGUgPSBnZXRfc3ViZnNfZmlsZShmaWxlKTsKKwlyYyA9IFBUUl9F
UlIoc3ViZmlsZSk7CisJaWYgKElTX0VSUihzdWJmaWxlKSkKKwkJZ290byBvdXQ7CisKKwlyYyA9
IC1FTk9UVFk7CisJc3ViaW5vZGUgPSBzdWJmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpZiAo
c3ViZmlsZS0+Zl9vcCAmJiBzdWJmaWxlLT5mX29wLT5pb2N0bCkKKwkJcmMgPSBzdWJmaWxlLT5m
X29wLT5pb2N0bChzdWJpbm9kZSwgc3ViZmlsZSwgY21kLCBhcmcpOworCisJLyogZmxhZ3MgbWF5
IGhhdmUgYmVlbiBjaGFuZ2VkIGJ5IGlvY3RsICovCisJaWYgKCFyYykKKwkJc2V0X2lub2RlX2Zs
YWdzKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBzdWJpbm9kZSk7CisKKwlmcHV0KHN1YmZpbGUp
Oworb3V0OgorCUxFQVZFKHNiLCAiZmlsZT0lcCByYz0lZCIsIGZpbGUsIHJjKTsKKworCXJldHVy
biByYzsKK30KKworaW50CitzdXBlcm1vdW50X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3Ry
dWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3Ni
OworCXN0cnVjdCBkZW50cnkgKnN1YmRlbnQ7CisJc3RydWN0IGZpbGUgKnN1YmZpbGUgPSAwOwor
CXN0cnVjdCB2ZnNtb3VudCAqc3VibW50OworCWludCB3cml0ZV9vbiA9IGZpbGUtPmZfbW9kZSAm
IEZNT0RFX1dSSVRFOworCWludCBmYWtlX29wZW4gPSAxOworCWludCByYzsKKworCUVOVEVSKHNi
LCAiaW5vZGU9JXAgZmlsZT0lcCIsIGlub2RlLCBmaWxlKTsKKworCXJjID0gLUVTVEFMRTsKKwlp
ZiAoc3ViZnNfY2hlY2tfZGlza19jaGFuZ2Uoc2IpKQorCQlnb3RvIG91dDsKKworCXN1Ym1udCA9
IHN1YmZzX2dldF9tbnQoc2IpOworCWlmICghc3VibW50KQorCQlnb3RvIG91dDsKKworCXN1YmRl
bnQgPSBnZXRfc3ViZnNfZGVudHJ5KGZpbGUtPmZfZGVudHJ5KTsKKwlyYyA9IFBUUl9FUlIoc3Vi
ZGVudCk7CisJaWYgKElTX0VSUihzdWJkZW50KSkKKwkJZ290byBwdXRfc3VibW50OworCQorCXJj
ID0gc3ViZnNfZ2V0X2FjY2Vzcyhpbm9kZSwgd3JpdGVfb24pOworCWlmIChyYykKKwkJZ290byBw
dXRfc3ViZGVudDsKKworCS8qCisJICogdGhlIGZvbGxvd2luZyBpcyB1c2VkIHRvIHNpbXBsaWZ5
IGVycm9yIHByb2Nlc3NpbmcuIGRlbnRyeV9vcGVuCisJICogYXV0b21hdGljYWxseSBkb2VzIG1u
dHB1dCBhbmQgZHB1dCBpbiBlcnJvciBjYXNlLCB0aGlzIG1heSByZXN1bHQKKwkgKiBpbiBzdWJm
cyBiZWluZyBkZXN0cm95ZWQKKwkgKiBXZSBqdXN0IG1ha2Ugc3VyZSB3ZSBuZWVkIHRvIGRvIG1u
dHB1dCBleGFjdGx5IG9uY2UgaGVyZTsKKwkgKiBhZGRpdGlvbmFsbHkgaXQgZ3VhcmRzIGFnYWlu
c3QgYWNjaWRlbnRhbCByZW1vdW50aW5nIG9mIHN1YmZzCisJICogdW50aWwgd2UgaGFzIGNsZWFu
ZWQgdXAKKwkgKi8KKwlzdWJtbnQgPSBtbnRnZXQoc3VibW50KTsKKwlzdWJkZW50ID0gZGdldChz
dWJkZW50KTsKKworCXN1YmZpbGUgPSBkZW50cnlfb3BlbihzdWJkZW50LCBzdWJtbnQsIGZpbGUt
PmZfZmxhZ3MpOworCXJjID0gUFRSX0VSUihzdWJmaWxlKTsKKwlpZiAoSVNfRVJSKHN1YmZpbGUp
KQorCQlnb3RvIHB1dF9hY2Nlc3M7CisJLyoKKwkgKiBubyBuZWVkIHRvIGRvIGV4dHJhIG1udHB1
dCBhbmQgZHB1dCwgaXQgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluCisJICogZGVudHJ5X29wZW4g
b24gZXJyb3IKKwkgKi8KKworCXJjID0gcHJlcGFyZV9maWxlKGZpbGUsIHN1YmZpbGUpOworCWlm
IChyYykKKwkJZ290byBwdXRfc3ViZmlsZTsKKworCXN1YmZpbGUtPmZfbW9kZSA9IGZpbGUtPmZf
bW9kZTsKKwkvKgorCSAqIHRoaXMgaXMgbmVlZGVkIGZvciBtbWFwIHRvIHdvcmsuIEluIGN1cnJl
bnQgbW9kZWwgdm1fYXJlYQorCSAqIGlzIGFzc29jaWF0ZWQgd2l0aCBzdXBlcmZpbGU7IHdlIG5l
dmVyIGV4cGxpY2l0bHkgY2FsbAorCSAqIGFueSB2bSBtZXRob2Qgd2l0aCBzdWJmaWxlIGFzIHBv
aW50ZXIuIEJ1dCBtYW55IGRyaXZlcnMKKwkgKiBhdHRhY2ggcHJpdmF0ZSBzdHJ1Y3R1cmVzIHRv
IHRoaXMgZmllbGQgYW5kIG1tYXAgb2Ygc3BlY2lhbAorCSAqIGZpbGVzIG9uIHN1cGVybW91bnQg
ZnMgd29uJ3Qgd29yayB3aXRob3V0IGl0CisJICovCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gc3Vi
ZmlsZS0+cHJpdmF0ZV9kYXRhOworCS8qCisJICogd2UgaGF2ZSByZWFsIHN1YmZpbGUgbm93LCBk
byBub3QgZmFrZSBhbnl0aGluZworCSAqLworCWZha2Vfb3BlbiA9IDA7CisKKwkvKgorCSAqIE5v
dyBnZXQgcmlkIG9mIGV4dHJhIG1udGdldCBhbmQgZGdldAorCSAqLworCWdvdG8gcHV0X3N1YmRl
bnQ7CisKKwkvKgorCSAqIGVycm9yIGNsZWFudXAKKwkgKi8KKworcHV0X3N1YmZpbGU6CisJZnB1
dChzdWJmaWxlKTsKKwlzdWJmaWxlID0gMDsKK3B1dF9hY2Nlc3M6CisJc3ViZnNfcHV0X2FjY2Vz
cyhpbm9kZSwgd3JpdGVfb24pOworcHV0X3N1YmRlbnQ6CisJZHB1dChzdWJkZW50KTsKK3B1dF9z
dWJtbnQ6CisJbW50cHV0KHN1Ym1udCk7CitvdXQ6CisJaWYgKGZha2Vfb3BlbiAmJiBpbm9kZSA9
PSBzYi0+c19yb290LT5kX2lub2RlKSB7CisJCS8qCisJCSAqIGFsd2F5cyBhcHBlYXIgdG8gc3Vj
Y2VlZCBmb3Igcm9vdCBvcGVuLiBJdCBhbGxvd3MgYWN0aXZlCisJCSAqIG1vbml0b3Jpbmcgb2Yg
bW91bnRwb2ludCB1c2luZyBGQU0vZG5vdGlmeSBhbmQgYWxzbyBpcyBsZXNzCisJCSAqIHN1cnBy
aXNpbmcgZm9yIG90aGVyIHByb2dyYW1zCisJCSAqLworCQlyYyA9IGluaXRfZmlsZV9pbmZvKGZp
bGUsIDEpOworCQlpZiAocmMpCisJCQlyYyA9IC1FTk9NRU07CisJfQorCUxFQVZFKHNiLCAiaW5v
ZGU9JXAgZmlsZT0lcCByYz0lZCBzdWJmaWxlPTB4JXAiLCBpbm9kZSwgZmlsZSwgcmMsIHN1YmZp
bGUpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitzdXBlcm1vdW50X2ZsdXNoKHN0
cnVjdCBmaWxlICpmaWxlLCBmbF9vd25lcl90IGlkKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAq
c2IgPSBmaWxlLT5mX2RlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3QgZmlsZSAqc3ViZmlsZTsKKwlpbnQg
ZmFrZV9mbHVzaCA9IDE7CisJaW50IHJjOworCisJRU5URVIoc2IsICJmaWxlPSVwIiwgZmlsZSk7
CisKKwlyYyA9IC1FU1RBTEU7CisJaWYgKHN1YmZzX2NoZWNrX2Rpc2tfY2hhbmdlKHNiKSkKKwkJ
Z290byBvdXQ7CisKKwlzdWJmaWxlID0gZ2V0X3N1YmZzX2ZpbGUoZmlsZSk7CisJcmMgPSBQVFJf
RVJSKHN1YmZpbGUpOworCWlmIChJU19FUlIoc3ViZmlsZSkpCisJCWdvdG8gb3V0OworCisJcmMg
PSAwOworCWZha2VfZmx1c2ggPSAwOworCWlmIChzdWJmaWxlLT5mX29wICYmIHN1YmZpbGUtPmZf
b3AtPmZsdXNoKQorCQlyYyA9IHN1YmZpbGUtPmZfb3AtPmZsdXNoKHN1YmZpbGUsaWQpOworCisJ
ZnB1dChzdWJmaWxlKTsKK291dDoKKwlpZiAoZmFrZV9mbHVzaCAmJiBpc19maWxlX2Zha2UoZmls
ZSkpIHsKKwkJLyogY2YuIHN1cGVybW91bnRfb3BlbiAqLworCQlyYyA9IDA7CisJfQorCUxFQVZF
KHNiLCAiZmlsZT0lcCByYz0lZCBmYWtlPSVkIiwgZmlsZSwgcmMsIGZha2VfZmx1c2gpOworCisJ
cmV0dXJuIHJjOworfQorCisvKgorICogaWYgc3ViZmlsZSBpcyBOVUxMIGl0IGhhcyBhbHJlYWR5
IGJlZW4gcmVsZWFzZWQgaW4gc3VwZXJtb3VudF9jbGVhbl9maWxlcworICogdG9nZXRoZXIgd2l0
aCBhZGp1c3Rpbmcgb3Blbi93cml0ZSBjb3VudGVycy4gRWxzZSB3ZSBkbyBpdCBoZXJlLgorICoK
KyAqIFRoZSByZWFzb24gaXMsIGl0IG1heSBiZSBjYWxsZWQgbG9uZyBhZnRlciBtZWRpYSBoYXMg
YmVlbiBjaGFuZ2VkCisgKiBhbmQgd2UgZGVmaW5pdGVseSBkbyBub3Qgd2FudCB0aGlzIGZ1bmN0
aW9uIHRvIG1lc3MgdXAgdGhlCisgKiBuZXcgc3ViZnMgc3RhdGUuCisgKi8KK3N0YXRpYyBpbnQK
K3N1cGVybW91bnRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmls
ZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqc3ViZmlsZSA9IDA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpz
YiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBzdXBlcm1vdW50X2ZpbGVfaW5mbyAqc2ZpID0gZmls
ZS0+Zl9zdXBlcm1vdW50OworCisJRU5URVIoc2IsICJpbm9kZT0lcCBmaWxlPSVwIiwgaW5vZGUs
IGZpbGUpOworCisJc3ViZnNfbG9jayhzYik7CisJLyoKKwkgKiBGSVhNRQorCSAqIHRoaXMgc3Vj
a3MuIEJ1dCB0aGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGFueSB3YXkKKwkgKiB0byBkaXN0aW5n
dWlzaCBiZXR3ZWVuIEVOT01FTSBvbiBfb3BlbiAobGVnaXRpbWF0ZQorCSAqIGNhc2UpIGFuZCBh
bnl0aGluZyBlbHNlIChwbGFpbiBidWcpCisJICovCisJaWYgKHNmaSkgeworCQlsaXN0X2RlbCgm
c2ZpLT5saXN0KTsKKwkJc3ViZmlsZSA9IHNmaS0+ZmlsZTsKKwkJc2ZpLT5maWxlID0gMDsKKwl9
IGVsc2UKKwkJc3VwZXJtb3VudF93YXJuaW5nKHNiLCAibm8gc3VwZXJtb3VudCBmaWxlIGluZm8g
YXR0YWNoZWQiKTsKKwlzdWJmc191bmxvY2soc2IpOworCisJaWYgKHN1YmZpbGUpIHsKKwkJaW50
IGJ1ZyA9IGF0b21pY19yZWFkKCZzdWJmaWxlLT5mX2NvdW50KSAhPSAxOworCQlmcHV0KHN1YmZp
bGUpOworCQlzdWJmc19wdXRfYWNjZXNzKGlub2RlLCBmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklU
RSk7CisJCVNVUEVSTU9VTlRfQlVHX09OKGJ1Zyk7CisJfQorCisJaWYgKHNmaSkKKwkJa2ZyZWUo
c2ZpKTsKKworCUxFQVZFKHNiLCAiaW5vZGU9JXAgZmlsZT0lcCIsIGlub2RlLCBmaWxlKTsKKwor
CXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQKK3N1cGVybW91bnRfZnN5bmMoc3RydWN0IGZp
bGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVj
dCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlLT5mX2RlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3QgZmlsZSAq
c3ViZmlsZTsKKwlpbnQgcmM7CisKKwlFTlRFUihzYiwgImZpbGU9JXAgZGVudHJ5PSVzIHN5bmM9
JWQiLCBmaWxlLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkYXRhc3luYyk7CisKKwlyYyA9IC1FU1RB
TEU7CisJaWYgKHN1YmZzX2NoZWNrX2Rpc2tfY2hhbmdlKHNiKSkKKwkJZ290byBvdXQ7CisKKwlz
dWJmaWxlID0gZ2V0X3N1YmZzX2ZpbGUoZmlsZSk7CisJcmMgPSBQVFJfRVJSKHN1YmZpbGUpOwor
CWlmIChJU19FUlIoc3ViZmlsZSkpCisJCWdvdG8gb3V0OworCisJcmMgPSAtRUlOVkFMOworCWlm
IChzdWJmaWxlLT5mX29wICYmIHN1YmZpbGUtPmZfb3AtPmZzeW5jKQorCQlyYyA9IHN1YmZpbGUt
PmZfb3AtPmZzeW5jKHN1YmZpbGUsIHN1YmZpbGUtPmZfZGVudHJ5LCBkYXRhc3luYyk7CisKKwlm
cHV0KHN1YmZpbGUpOworb3V0OgorCUVOVEVSKHNiLCAiZmlsZT0lcCBkZW50cnk9JXMgcmM9JWQi
LCBmaWxlLCBkZW50cnktPmRfbmFtZS5uYW1lLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0
YXRpYyBpbnQKK3N1cGVybW91bnRfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGlu
dCBvbikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZS0+Zl9kZW50cnktPmRfc2I7
CisJc3RydWN0IGZpbGUgKnN1YmZpbGU7CisJaW50IHJjOworCisJRU5URVIoc2IsICJmZD0lZCBm
aWxlPSVwIG9uPSVkIiwgZmQsIGZpbGUsIG9uKTsKKworCXJjID0gLUVTVEFMRTsKKwlpZiAoc3Vi
ZnNfY2hlY2tfZGlza19jaGFuZ2Uoc2IpKQorCQlnb3RvIG91dDsKKworCXN1YmZpbGUgPSBnZXRf
c3ViZnNfZmlsZShmaWxlKTsKKwlyYyA9IFBUUl9FUlIoc3ViZmlsZSk7CisJaWYgKElTX0VSUihz
dWJmaWxlKSkKKwkJZ290byBvdXQ7CisKKwlyYyA9IC1FSU5WQUw7CisJaWYgKHN1YmZpbGUtPmZf
b3AgJiYgc3ViZmlsZS0+Zl9vcC0+ZmFzeW5jKQorCQlyYyA9IHN1YmZpbGUtPmZfb3AtPmZhc3lu
YyhmZCwgc3ViZmlsZSwgb24pOworCisJZnB1dChzdWJmaWxlKTsKK291dDoKKwlMRUFWRShzYiwg
ImZkPSVkIGZpbGU9JXAgcmM9JWQiLCBmZCwgZmlsZSwgcmMpOworCisJcmV0dXJuIHJjOworfQor
CitzdGF0aWMgaW50CitzdXBlcm1vdW50X2xvY2soc3RydWN0IGZpbGUgKmZpbGUsIGludCBjbWQs
IHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxl
LT5mX2RlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3QgZmlsZSAqc3ViZmlsZTsKKwlzdHJ1Y3QgZmlsZV9s
b2NrICpmbF90bXA7CisJaW50IHJjOworCisJRU5URVIoc2IsICJmaWxlPSVwIGNtZD0lZCIsIGZp
bGUsIGNtZCk7CisKKwlyYyA9IC1FU1RBTEU7CisJaWYgKHN1YmZzX2NoZWNrX2Rpc2tfY2hhbmdl
KHNiKSkKKwkJZ290byBvdXQ7CisKKwlzdWJmaWxlID0gZ2V0X3N1YmZzX2ZpbGUoZmlsZSk7CisJ
cmMgPSBQVFJfRVJSKHN1YmZpbGUpOworCWlmIChJU19FUlIoc3ViZmlsZSkpCisJCWdvdG8gb3V0
OworCisJcmMgPSAwOworCWlmIChzdWJmaWxlLT5mX29wICYmIHN1YmZpbGUtPmZfb3AtPmxvY2sp
CisJCXJjID0gc3ViZmlsZS0+Zl9vcC0+bG9jayhzdWJmaWxlLCBjbWQsIGZsKTsKKwllbHNlIGlm
IChjbWQgPT0gRl9HRVRMSykKKwkJcG9zaXhfdGVzdF9sb2NrKGZpbGUsIGZsKTsKKworCWZwdXQo
c3ViZmlsZSk7CitvdXQ6CisJTEVBVkUoc2IsICJmaWxlPSVwIHJjPSVkIiwgZmlsZSwgcmMpOwor
CisJcmV0dXJuIHJjOworfQorCisvKiBGaXhtZToKKyAqIHJlYWR2OiBlYXN5LCBleHBvcnQgY2h1
cm5rIGZyb20gdmZzCisgKiB3cml0ZXY6IGVhc3ksIGV4cG9ydCBjaHVybmsgZnJvbSB2ZnMKKyAq
IHNlbmRwYWdlOiBvbmx5IHVzZWQgZm9yIG5ldHdvcmtpbmcsIG5vdCBuZWVkZWQKKyAqIGdldF91
bm1tYXBwZWRfYXJlYTogb25seSB1c2VkIGZvciBkZXZpY2VzLCBub3QgbmVlZGVkCisgKi8KKwor
c3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdXBlcm1vdW50X2Rpcl9vcGVyYXRpb25zID0geworCS5s
bHNlZWsJCT0gc3VwZXJtb3VudF9sbHNlZWssCisJLnJlYWQJCT0gc3VwZXJtb3VudF9yZWFkLAor
CS5yZWFkZGlyCT0gc3VwZXJtb3VudF9yZWFkZGlyLAorCS5pb2N0bAkJPSBzdXBlcm1vdW50X2lv
Y3RsLAorCS5vcGVuCQk9IHN1cGVybW91bnRfb3BlbiwKKwkuZmx1c2gJCT0gc3VwZXJtb3VudF9m
bHVzaCwKKwkucmVsZWFzZQk9IHN1cGVybW91bnRfcmVsZWFzZSwKKwkuZnN5bmMJCT0gc3VwZXJt
b3VudF9mc3luYywKKwkuZmFzeW5jCQk9IHN1cGVybW91bnRfZmFzeW5jLAorfTsKKworc3RydWN0
IGZpbGVfb3BlcmF0aW9ucyBzdXBlcm1vdW50X2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVr
CQk9IHN1cGVybW91bnRfbGxzZWVrLAorCS5yZWFkCQk9IHN1cGVybW91bnRfcmVhZCwKKwkud3Jp
dGUJCT0gc3VwZXJtb3VudF93cml0ZSwKKwkucG9sbAkJPSBzdXBlcm1vdW50X3BvbGwsCisJLmlv
Y3RsCQk9IHN1cGVybW91bnRfaW9jdGwsCisJLm1tYXAJCT0gc3VwZXJtb3VudF9maWxlX21tYXAs
IC8qIGZyb20gZmlsZW1hcC5jICovCisJLm9wZW4JCT0gc3VwZXJtb3VudF9vcGVuLAorCS5mbHVz
aAkJPSBzdXBlcm1vdW50X2ZsdXNoLAorCS5yZWxlYXNlCT0gc3VwZXJtb3VudF9yZWxlYXNlLAor
CS5mc3luYwkJPSBzdXBlcm1vdW50X2ZzeW5jLAorCS5mYXN5bmMJCT0gc3VwZXJtb3VudF9mYXN5
bmMsCisJLmxvY2sJCT0gc3VwZXJtb3VudF9sb2NrLAorfTsKZGlmZiAtdXJOIGxpbnV4LTIuNi4y
NS40Lm9yaWcvZnMvc3VwZXJtb3VudC9maWxlbWFwLmMgbGludXgtMi42LjI1LjQvZnMvc3VwZXJt
b3VudC9maWxlbWFwLmMKLS0tIGxpbnV4LTIuNi4yNS40Lm9yaWcvZnMvc3VwZXJtb3VudC9maWxl
bWFwLmMJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQvZnMvc3Vw
ZXJtb3VudC9maWxlbWFwLmMJMjAwOC0wNS0yMCAwMToyNzo1MyArMDMwMApAQCAtMCwwICsxLDE4
MiBAQAorLyoKKyAqICBsaW51eC9mcy9zdXBlcm1vdW50L2ZpbGVtYXAuYworICoKKyAqICBJbml0
aWFsIHZlcnNpb24gZm9yIGtlcm5lbCAyLjQuMjEgKEMpIDIwMDMgQW5kcmV5IEJvcnplbmtvdgor
ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJ2aWRqYWFy
QG1haWwucnUpCisgKgorICogICRJZDogZmlsZW1hcC5jLHYgMS40LjQuMiAyMDA0LzAxLzE0IDIw
OjI4OjAxIGJvciBFeHAgJAorICovCisKKyNkZWZpbmUgU19EQkdfVFJBQ0VfQ1VSUkVOVCBTX0RC
R19UUkFDRV9GSUxFTUFQCisjaW5jbHVkZSAic3VwZXJtb3VudC5oIgorCisvKgorICogU29tZSBy
YXRpb25hbGUgYW5kIGp1c3RpZmljYXRpb24gZm9yIHRoaXMgZmlsZQorICoKKyAqIFdlIHBsYXkg
ZGlydHkgdHJpY2tzIHdpdGggbW0gbWFuYWdlbWVudCBmb3IgbW1hcGVkIGZpbGVzIG9uIHN1cGVy
bW91bnQuCisgKiBBZGRyZXNzIHNwYWNlIHBvaW50cyB0byBzdWJpbm9kZSBidXQgdm0gYXJlYSBp
cyBhc3NvY2lhdGVkIHdpdGggc3VwZXJmaWxlLgorICogV2hlbiBtZWRpYSBjaGFuZ2UgaXMgZGV0
ZWN0ZWQsIHN1Ymlub2RlIHRvZ2V0aGVyIHdpdGggYWxsIGFzc29jaWF0ZWQKKyAqIHBhZ2VzIGdv
ZXMgYXdheSBhcyB3ZWxsIChhdCBsZWFzdCwgSSBob3BlIHNvIC4uLikgTm93IHdlIG11c3QgcHJl
dmVudAorICogYW55IGF0dGVtcHQgdG8gYWNjZXNzIG5vIG1vcmUgZXhpc3RpbmcgYWRkcmVzcyBz
cGFjZS4gVG8gZG8gc28gd2Ugc2F2ZQorICogb3JpZ2luYWwgdm1fb3BzIGluIHByaXZhdGUgZmll
bGQgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHZtX29wcyBpbiB0aGlzIGZpbGUuCisgKiBUaGV5IGNo
ZWNrIGlmIGZpbGUgaXMgc3RhbGUsIGlmIHllcywgdGhleSB0cnkgdG8gcmV0dXJuIHNlbnNpYmxl
IGVycm9yLgorICogVGhlcmUgaXMgc29tZSBkb3VidCBhYm91dCBwb3NzaWJpbGl0eSB0byBibG9j
ayBoZXJlIC4uLiBPVE9IIGFueSB3cml0ZQorICogbG9jayBvbiBzdWJmcyBpcyBob2xkIGluIGNv
bnRleHQgd2hlcmUgbm8gbW0gbG9jayBpcyBleHBlY3RlZC4KKyAqLworc3RhdGljIHZvaWQKK3N1
cGVybW91bnRfdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEpCit7CisJc3RydWN0
IGZpbGUgKmZpbGUgPSBhcmVhLT52bV9maWxlLCAqc3ViZmlsZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxv
Y2sgKnNiID0gZmlsZS0+Zl9kZW50cnktPmRfc2I7CisJc3RydWN0IHN1cGVybW91bnRfZmlsZV9p
bmZvICpzZmk7CisKKwlFTlRFUihzYiwgInZtPSVwIiwgYXJlYSk7CisKKwlpZiAoc3ViZnNfY2hl
Y2tfZGlza19jaGFuZ2Uoc2IpKQorCQlnb3RvIG91dDsKKworCXN1YmZpbGUgPSBnZXRfc3ViZnNf
ZmlsZShmaWxlKTsKKwlpZiAoSVNfRVJSKHN1YmZpbGUpKQorCQlnb3RvIG91dDsKKworCXNmaSA9
IHN1cGVybW91bnRfZihmaWxlKTsKKwlpZiAoc2ZpLT52bV9vcHMgJiYgc2ZpLT52bV9vcHMtPm9w
ZW4pCisJCXNmaS0+dm1fb3BzLT5vcGVuKGFyZWEpOworCisJZnB1dChzdWJmaWxlKTsKK291dDoK
KwlMRUFWRShzYiwgInZtPSVwIiwgYXJlYSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lk
CitzdXBlcm1vdW50X3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKK3sKKwlz
dHJ1Y3QgZmlsZSAqZmlsZSA9IGFyZWEtPnZtX2ZpbGUsICpzdWJmaWxlOworCXN0cnVjdCBzdXBl
cl9ibG9jayAqc2IgPSBmaWxlLT5mX2RlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3Qgc3VwZXJtb3VudF9m
aWxlX2luZm8gKnNmaTsKKworCUVOVEVSKHNiLCAidm09JXAiLCBhcmVhKTsKKwkKKwlpZiAoc3Vi
ZnNfY2hlY2tfZGlza19jaGFuZ2Uoc2IpKQorCQlnb3RvIG91dDsKKworCXN1YmZpbGUgPSBnZXRf
c3ViZnNfZmlsZShmaWxlKTsKKwlpZiAoSVNfRVJSKHN1YmZpbGUpKQorCQlnb3RvIG91dDsKKwor
CXNmaSA9IHN1cGVybW91bnRfZihmaWxlKTsKKwlpZiAoc2ZpLT52bV9vcHMgJiYgc2ZpLT52bV9v
cHMtPmNsb3NlKQorCQlzZmktPnZtX29wcy0+Y2xvc2UoYXJlYSk7CisKKwlmcHV0KHN1YmZpbGUp
Oworb3V0OgorCUxFQVZFKHNiLCAidm09JXAiLCBhcmVhKTsKKworCXJldHVybjsKK30KKworc3Rh
dGljIHN0cnVjdCBwYWdlICoKK3N1cGVybW91bnRfdm1fbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0
cnVjdCAqYXJlYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgKnR5cGUpCit7CisJc3RydWN0
IGZpbGUgKmZpbGUgPSBhcmVhLT52bV9maWxlLCAqc3ViZmlsZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxv
Y2sgKnNiID0gZmlsZS0+Zl9kZW50cnktPmRfc2I7CisJc3RydWN0IHN1cGVybW91bnRfZmlsZV9p
bmZvICpzZmk7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSAwOworCisJRU5URVIoc2IsICJ2bT0lcCBh
ZGRyPSVseCIsIGFyZWEsIGFkZHJlc3MpOworCQorCS8qCisJICogdGhpcyBpcyBjYWxsZWQgd2l0
aCBtbSBzZW1hcGhvcmUgZG93biByZWFkIGFuZCBwYWdldGFibGUKKwkgKiBzcGlubG9jayByZWxl
YXNlZC4gU28gaXQgX2FwcGVhcnNfIHNhZmUgdG8gc2xlZXAgLi4uCisJICovCisJaWYgKHN1YmZz
X2NoZWNrX2Rpc2tfY2hhbmdlKHNiKSkKKwkJZ290byBvdXQ7CisKKwlzdWJmaWxlID0gZ2V0X3N1
YmZzX2ZpbGUoZmlsZSk7CisJaWYgKElTX0VSUihzdWJmaWxlKSkKKwkJZ290byBvdXQ7CisKKwlz
ZmkgPSBzdXBlcm1vdW50X2YoZmlsZSk7CisJcGFnZSA9IHNmaS0+dm1fb3BzLT5ub3BhZ2UoYXJl
YSwgYWRkcmVzcywgdHlwZSk7CisKKwlmcHV0KHN1YmZpbGUpOworb3V0OgorCUxFQVZFKHNiLCAi
dm09JXAgcGFnZT0lcCIsIGFyZWEsIHBhZ2UpOworCisJcmV0dXJuIHBhZ2U7Cit9CisKK2ludAor
c3VwZXJtb3VudF9maWxlX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0
cnVjdCAqdm1hKQoreworCisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGZpbGUtPmZfZGVudHJ5
LT5kX3NiOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsK
KwlzdHJ1Y3Qgc3VwZXJtb3VudF9maWxlX2luZm8gKnNmaTsKKwlzdHJ1Y3QgZmlsZSAqc3ViZmls
ZTsKKwlpbnQgd3JpdGVfb24gPSBORUVEX1dSSVRFX0FUSU1FKGlub2RlKTsKKwlpbnQgcmM7CisK
KwlFTlRFUihzYiwgImZpbGU9JXAgdm09JXAiLCBmaWxlLCB2bWEpOworCQorCXJjID0gLUVTVEFM
RTsKKwlpZiAoc3ViZnNfY2hlY2tfZGlza19jaGFuZ2Uoc2IpKQorCQlnb3RvIG91dDsKKworCXN1
YmZpbGUgPSBnZXRfc3ViZnNfZmlsZShmaWxlKTsKKwlyYyA9IFBUUl9FUlIoc3ViZmlsZSk7CisJ
aWYgKElTX0VSUihzdWJmaWxlKSkKKwkJZ290byBvdXQ7CisKKwlzZmkgPSBzdXBlcm1vdW50X2Yo
ZmlsZSk7CisKKwlyYyA9IC1FTk9ERVY7CisJaWYgKCFzdWJmaWxlLT5mX29wIHx8ICFzdWJmaWxl
LT5mX29wLT5tbWFwKQorCQlnb3RvIHB1dF9zdWJmaWxlOworCisJcmMgPSBzdWJmc19nZXRfYWNj
ZXNzKGlub2RlLCB3cml0ZV9vbik7CisJaWYgKHJjKQorCQlnb3RvIHB1dF9zdWJmaWxlOworCisJ
cmMgPSBzdWJmaWxlLT5mX29wLT5tbWFwKHN1YmZpbGUsIHZtYSk7CisJc3ViZnNfcHV0X2FjY2Vz
cyhpbm9kZSwgd3JpdGVfb24pOworCWlmIChyYykKKwkJZ290byBwdXRfc3ViZmlsZTsKKwkvKgor
CSAqIHdlIGNhbm5vdCBkZWFsIHdpdGggYW5vbnltb3VzIG1hcHBpbmcKKwkgKi8KKwlpZiAoIXZt
YS0+dm1fb3BzIHx8ICF2bWEtPnZtX29wcy0+bm9wYWdlKSB7CisJCXJjID0gLUVOT1NZUzsKKwkJ
Z290byBwdXRfc3ViZmlsZTsKKwl9CisKKwkvKgorCSAqIG5vdyBkbyB0aGUgbmFzdHkgdHJpY2sK
KwkgKi8KKwlzZmktPnZtX29wcyA9IHZtYS0+dm1fb3BzOworCXZtYS0+dm1fb3BzID0gJnN1cGVy
bW91bnRfdm1fb3BzOworCitwdXRfc3ViZmlsZToKKwlmcHV0KHN1YmZpbGUpOworb3V0OgorCUxF
QVZFKHNiLCAiZmlsZT0lcCB2bT0lcCByYz0lZCIsIGZpbGUsIHZtYSwgcmMpOworCisJcmV0dXJu
IHJjOworfQorCisvKgorICogLT5wb3B1bGF0ZToJdG8gcHJvcGVybHkgaW1wbGVtZW50IGl0IGl0
IHNob3VsZCBjYWxsIGRvX25vX3BhZ2UgaWYKKyAqICAJCXN1YmZzIGRvZXMgbm90IHByb3ZpZGUg
aXRzIG93biAtPnBvcHVsYXRlLiBVbmZvcnR1bmF0ZWx5CisgKiAgCQlwb3B1bGF0ZSBnZXRzIGRp
ZmZlcmVudCBwYXJhbWV0ZXJzLiBUcmFuc2xhdGluZyB0aGVtIGludG8KKyAqICAJCXdoYXQgLT5u
b3BhZ2UgZXhwZWN0cyBqdXN0IGRvZXMgbm90IHdvcnRoIGl0IC0gY3VycmVudGx5CisgKiAgCQlz
dXBlcm1vdW50IGlzIHNsb3cgZW5vdWdoIHRvIGJvdGhlciBhYm91dCB0aGlzIGltYWdpbmFyeQor
ICogIAkJc3BlZWQgdXAgZXZlbiBpZiBpdCB3YXMgcG9zc2libGUgKHdoaWNoIHByb2JhYmx5IGlz
IG5vdAorICogIAkJZHVlIHRvIGhvdyBsb2NraW5nIGlzIGRvbmU7IHNlZSBtbS9tZW1vcnkuYyku
CisgKi8KK3N0cnVjdCAgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3VwZXJtb3VudF92bV9vcHMgPSB7
CisJLm9wZW4JCT0gc3VwZXJtb3VudF92bV9vcGVuLAorCS5jbG9zZQkJPSBzdXBlcm1vdW50X3Zt
X2Nsb3NlLAorCS5ub3BhZ2UJCT0gc3VwZXJtb3VudF92bV9ub3BhZ2UsCit9OwpkaWZmIC11ck4g
bGludXgtMi42LjI1LjQub3JpZy9mcy9zdXBlcm1vdW50L2luaXQuYyBsaW51eC0yLjYuMjUuNC9m
cy9zdXBlcm1vdW50L2luaXQuYwotLS0gbGludXgtMi42LjI1LjQub3JpZy9mcy9zdXBlcm1vdW50
L2luaXQuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC9mcy9z
dXBlcm1vdW50L2luaXQuYwkyMDA4LTA1LTIwIDAxOjI3OjUzICswMzAwCkBAIC0wLDAgKzEsNDgg
QEAKKy8qIAorICogbGludXgvZnMvc3VwZXJtb3VudC9pbml0LmMKKyAqCisgKiAgKEMpIENvcHly
aWdodCAyMDAxLTIwMDIgSnVhbiBRdWludGVsYSA8cXVpbnRlbGFAbWFuZHJha2Vzb2Z0LmNvbT4K
KyAqICAgICAgUmVsZWFzZWQgdW5kZSBHUEwgdjIuCisgKiAgUmV3cml0dGVuIGZvciBrZXJuZWwg
Mi40LjIxIChDKSAyMDAzIEFuZHJleSBCb3J6ZW5rb3YKKyAqICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGFydmlkamFhckBtYWlsLnJ1KQorICogIFJld3JpdHRlbiBmb3Ig
a2VybmVsIDIuNS43MCAoQykgMjAwMyBBbmRyZXkgQm9yemVua292CisgKiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChhcnZpZGphYXJAbWFpbC5ydSkKKyAqCisgKiAgJElk
OiBpbml0LmMsdiAxLjYuNC40IDIwMDMvMTAvMjYgMTY6MjE6MjUgYm9yIEV4cCAkCisgKi8KKwor
I2luY2x1ZGUgInN1cGVybW91bnQuaCIKKworc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgc3VwZXJt
b3VudF9mc190eXBlID0geworICAgICAgICAub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwK
KyAgICAgICAgLm5hbWUgICAgICAgICAgID0gInN1cGVybW91bnQiLAorICAgICAgICAuZ2V0X3Ni
ICAgICAgICAgPSBzdXBlcm1vdW50X2dldF9zYiwKKyAgICAgICAgLmtpbGxfc2IgICAgICAgID0g
a2lsbF9hbm9uX3N1cGVyLAorICAgICAgICAuZnNfZmxhZ3MgICAgICAgPSBGU19OT19TVUJNTlQs
Cit9OworCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9zdXBlcm1vdW50X2ZzKHZvaWQpCit7CisJ
aW50IHJjID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmc3VwZXJtb3VudF9mc190eXBlKTsKKwkKKwlp
ZiAoIXJjKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlN1cGVybW91bnQgdmVyc2lvbiAlcyBmb3Ig
a2VybmVsIDIuNlxuIiwgU1VQRVJNT1VOVF9WRVJTSU9OKTsKKwkJc3VwZXJtb3VudF9wcm9jX3Jl
Z2lzdGVyKCk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4
aXRfc3VwZXJtb3VudF9mcyh2b2lkKQoreworCXN1cGVybW91bnRfcHJvY191bnJlZ2lzdGVyKCk7
CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZzdXBlcm1vdW50X2ZzX3R5cGUpOworfQorCitNT0RV
TEVfQVVUSE9SKCJTdGVwaGVuIFR3ZWVkaWUsIEFsZXhpcyBNaWtoYWlsb3YsIEp1YW4gUXVpbnRl
bGEsIEFuZHJleSBCb3J6ZW5rb3YgYW5kIG90aGVycyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJU
cmFuc3BhcmVudCByZW1vdmFibGUgbWVkaWEgc3VwcG9ydCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQ
TCIpOworbW9kdWxlX2luaXQoaW5pdF9zdXBlcm1vdW50X2ZzKTsKK21vZHVsZV9leGl0KGV4aXRf
c3VwZXJtb3VudF9mcyk7CmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC5vcmlnL2ZzL3N1cGVybW91
bnQvS2NvbmZpZyBsaW51eC0yLjYuMjUuNC9mcy9zdXBlcm1vdW50L0tjb25maWcKLS0tIGxpbnV4
LTIuNi4yNS40Lm9yaWcvZnMvc3VwZXJtb3VudC9LY29uZmlnCTE5NzAtMDEtMDEgMDM6MDA6MDAg
KzAzMDAKKysrIGxpbnV4LTIuNi4yNS40L2ZzL3N1cGVybW91bnQvS2NvbmZpZwkyMDA4LTA1LTIw
IDAxOjI3OjUzICswMzAwCkBAIC0wLDAgKzEsMjYgQEAKK2NvbmZpZyBTVVBFUk1PVU5UCisJdHJp
c3RhdGUgIlN1cGVybW91bnQgcmVtb3ZhYmxlIG1lZGlhIHN1cHBvcnQiCisJaGVscAorCSAgU3Vw
ZXJtb3VudCBnaXZlcyB5b3UgdGhlIGFiaWxpdHkgdG8gYWNjZXNzIENELVJPTXMgYW5kIEZsb3Bw
aWVzCisJICB3aXRob3V0IG1vdW50aW5nL3VubW91bnRpbmcgdGhlbSBldmVyeSB0aW1lIHlvdSB3
YW50IHRvIGFjY2VzcworCSAgYSBkaWZmZXJlbnQgZGlzay9mbG9wcHkuIEp1c3QgZWplY3QgdGhl
IG1lZGlhLCBpbnNlcnQgYSBuZXcgb25lCisJICBhbmQgeW91IGFyZSBhYmxlIHRvIGFjY2VzcyBp
dC4KKworCSAgUmVhZCBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N1cGVybW91bnQudHh0IGZv
ciBtb3JlIGluZm9ybWF0aW9uLgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIHRoZSBTdXBl
cm1vdW50IHN1cHBvcnQgYXMgYSBtb2R1bGUgKCA9IGNvZGUKKwkgIHdoaWNoIGNhbiBiZSBpbnNl
cnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlcgorCSAg
eW91IHdhbnQpLCBzYXkgTSBoZXJlIGFuZCByZWFkIERvY3VtZW50YXRpb24vbW9kdWxlcy50eHQu
IFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHN1cGVybW91bnQuby4KKworCSAgSWYgdW5z
dXJlLCBzYXkgTi4KKworY29uZmlnIFNVUEVSTU9VTlRfREVCVUcKKwlib29sICJFbmFibGUgc3Vw
ZXJtb3VudCBkZWJ1ZyBjb2RlIgorCWRlcGVuZHMgb24gU1VQRVJNT1VOVAorCWhlbHAKKwkgIElm
IHlvdSBzZXQgdGhpcyB0byBZLCBhZGRpdGlvbmFsIGRlYnVnIGNvZGUgd2lsbCBiZSBjb21waWxl
ZCBpbi4KKwkgIERlYnVnIG91dHB1dCBpcyBjb250cm9sbGVkIHdpdGggZGVidWc9TiBtb3VudCBv
cHRpb24uIFBvc3NpYmxlCisJICB2YWx1ZXMgYXJlIGxpc3RlZCBpbiBEb2N1bWVudGF0aW9uL2Zp
bGVzeXN0ZW1zL3N1cGVybW91bnQudHh0LgorCisJICBJZiB1bnN1cmUsIHNheSBZLgpkaWZmIC11
ck4gbGludXgtMi42LjI1LjQub3JpZy9mcy9zdXBlcm1vdW50L01ha2VmaWxlIGxpbnV4LTIuNi4y
NS40L2ZzL3N1cGVybW91bnQvTWFrZWZpbGUKLS0tIGxpbnV4LTIuNi4yNS40Lm9yaWcvZnMvc3Vw
ZXJtb3VudC9NYWtlZmlsZQkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYu
MjUuNC9mcy9zdXBlcm1vdW50L01ha2VmaWxlCTIwMDgtMDUtMjAgMDE6Mjc6NTMgKzAzMDAKQEAg
LTAsMCArMSwxNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IHN1cGVybW91bnRpbmcg
cm91dGluZXMuCisjCisKK3N1cGVybW91bnQtb2JqcyA6PQlkZW50cnkubyBcCisJCQlmaWxlLm8g
XAorCQkJZmlsZW1hcC5vIFwKKwkJCWluaXQubyBcCisJCQltZWRpYWN0bC5vIFwKKwkJCW5hbWVp
Lm8gXAorCQkJcHJvYy5vIFwKKwkJCXN1YmZzLm8gXAorCQkJc3VwZXIubyAKKworb2JqLSQoQ09O
RklHX1NVUEVSTU9VTlQpICs9IHN1cGVybW91bnQubwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQu
b3JpZy9mcy9zdXBlcm1vdW50L21lZGlhY3RsLmMgbGludXgtMi42LjI1LjQvZnMvc3VwZXJtb3Vu
dC9tZWRpYWN0bC5jCi0tLSBsaW51eC0yLjYuMjUuNC5vcmlnL2ZzL3N1cGVybW91bnQvbWVkaWFj
dGwuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC9mcy9zdXBl
cm1vdW50L21lZGlhY3RsLmMJMjAwOC0wNS0yMCAwMToyNzo1MyArMDMwMApAQCAtMCwwICsxLDY5
IEBACisvKgorICogIGxpbnV4L2ZzL3N1cGVybW91bnQvbWVkaWFjdGwuYworICoKKyAqICBPcmln
aW5hbCB2ZXJzaW9uOgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcKKyAqICAgICAg
U3RlcGhlbiBUd2VlZGllIChzY3RAZGNzLmVkLmFjLnVrKQorICoKKyAqICBSZXdyaXRlbiBmb3Ig
a2VybmVsIDIuMiwgMi40LiAoQykgMTk5OSwgMjAwMCBBbGV4aXMgTWlraGFpbG92CisgKiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGV4aXNAYWJjLmNhcC5ydSkKKyAqICBS
ZXdyaXR0ZW4gZm9yIGtlcm5lbCAyLjQuMjEgKEMpIDIwMDMgQW5kcmV5IEJvcnplbmtvdgorICog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJ2aWRqYWFyQG1haWwucnUp
CisgKiAgUmV3cml0dGVuIGZvciBrZXJuZWwgMi41LjcwIChDKSAyMDAzIEFuZHJleSBCb3J6ZW5r
b3YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFydmlkamFhckBt
YWlsLnJ1KQorICoKKyAqICAkSWQ6IG1lZGlhY3RsLmMsdiAxLjUuMi41IDIwMDMvMDcvMTMgMTk6
MTU6MjAgYm9yIEV4cCAkCisgKi8KKworI2RlZmluZSBTX0RCR19UUkFDRV9DVVJSRU5UIFNfREJH
X1RSQUNFX01FRElBQ1RMCisjaW5jbHVkZSAic3VwZXJtb3VudC5oIgorCisvKiAKKyAqIFRyeSB0
byBsb2NrIHRoZSBkcml2ZSBkb29yLiAgVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byB3b3JrIG9u
IGFsbAorICogaGFyZHdhcmUsIGJ1dCB3ZSB0cnkgYW55IHRyaWNrcyB3ZSBrbm93IG9mIGFueXdh
eS4gIAorICovCit2b2lkCitzdXBlcm1vdW50X21lZGlhY3RsKHN0cnVjdCBzdXBlcl9ibG9jayAq
c2IsIGludCBvcGVyYXRpb24sIGludCBvcHQpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRl
djsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1YnNiOworCXN0cnVjdCBibG9ja19kZXZpY2Vfb3Bl
cmF0aW9ucyAqZm9wcyA9IDA7CisKKwlpZiAoIXN1YmZzX2lzX21vdW50ZWQoc2IpKQorCQlyZXR1
cm47CisKKwlzdWJzYiA9IHN1YmZzX3NiKHNiKTsKKwliZGV2ID0gc3Vic2ItPnNfYmRldjsKKwlp
ZiAoIWJkZXYtPmJkX2Rpc2spCisJCXJldHVybjsKKworCS8qIEZJWE1FIGlzIGl0IGVub3VnaCB0
byB1c2UgYmRfc2VtIGhlcmU/ICovCisJc3dpdGNoIChvcGVyYXRpb24pIHsKKwkJY2FzZSBTVVBF
Uk1PVU5UX0lOQ19DT1VOVDoKKwkJCWxvY2tfa2VybmVsKCk7CisJCQlTVVBFUk1PVU5UX0JVR19P
TihiZGV2LT5iZF9kaXNrLT5zY291bnQgPCAwKTsKKwkJCWJkZXYtPmJkX2Rpc2stPnNjb3VudCsr
OworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuOworCQljYXNlIFNVUEVSTU9VTlRfREVD
X0NPVU5UOgorCQkJbG9ja19rZXJuZWwoKTsKKwkJCVNVUEVSTU9VTlRfQlVHX09OKGJkZXYtPmJk
X2Rpc2stPnNjb3VudCA8PSAwKTsKKwkJCWJkZXYtPmJkX2Rpc2stPnNjb3VudC0tOworCQkJdW5s
b2NrX2tlcm5lbCgpOworCQkJcmV0dXJuOworCX0KKworCWZvcHMgPSBiZGV2LT5iZF9kaXNrLT5m
b3BzOworCWlmICghZm9wcyB8fCAhZm9wcy0+bWVkaWFjdGwpCisJCXJldHVybjsKKwkvKgorCSAq
IHRyYXkgaXMgKHVuLSlsb2NrZWQgaW4gb3BlbiAoQktMIGZvciBiZGV2KSwgcmVsZWFzZSAoQktM
IGZvciBiZGV2KQorCSAqIGFuZCBpb2N0bCAoQktMKS4gV2UgYXJlIGluIGdvb2QgY29tcGFueS4K
KwkgKiBUaGlzIG11c3QgYmUgY2hhbmdlZCBpZiBibG9jayBkZXZpY2VzIGV2ZXIgc3RvcCB1c2lu
ZyBCS0wKKwkgKiBmb3Igb3Blbi9yZWxlYXNlLiBVbmZvcnR1bmF0ZWx5LCB1c2luZyBqdXN0IGJk
ZXYtPmJkX3NlbSBpcyBub3QKKwkgKiBlbm91Z2ggZHVlIHRvIGlvY3RsLgorCSAqLworCWxvY2tf
a2VybmVsKCk7CisJZm9wcy0+bWVkaWFjdGwoYmRldiwgb3BlcmF0aW9uLCBvcHQpOworCXVubG9j
a19rZXJuZWwoKTsKK30KZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40Lm9yaWcvZnMvc3VwZXJtb3Vu
dC9uYW1laS5jIGxpbnV4LTIuNi4yNS40L2ZzL3N1cGVybW91bnQvbmFtZWkuYwotLS0gbGludXgt
Mi42LjI1LjQub3JpZy9mcy9zdXBlcm1vdW50L25hbWVpLmMJMTk3MC0wMS0wMSAwMzowMDowMCAr
MDMwMAorKysgbGludXgtMi42LjI1LjQvZnMvc3VwZXJtb3VudC9uYW1laS5jCTIwMDgtMDUtMjAg
MDE6Mjc6NTMgKzAzMDAKQEAgLTAsMCArMSwxMTQ1IEBACisvKgorICogIGxpbnV4L2ZzL3N1cGVy
bW91bnQvbmFtZWkuYworICoKKyAqICBPcmlnaW5hbCB2ZXJzaW9uOgorICogICAgICBDb3B5cmln
aHQgKEMpIDE5OTUKKyAqICAgICAgU3RlcGhlbiBUd2VlZGllIChzY3RAZGNzLmVkLmFjLnVrKQor
ICoKKyAqICAgICAgZnJvbQorICoKKyAqICAgICAgbGludXgvZnMvbWluaXgvbmFtZWkuYworICog
ICAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogICAg
ICBhbmQKKyAqCisgKiAgICAgIGxpbnV4L2ZzL2V4dDIvbmFtZWkuYworICogICAgICBDb3B5cmln
aHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgIFJlbXkgQ2FyZAorICoKKyAqICBSZXdyaXRl
biBmb3Iga2VybmVsIDIuMiAmIDIuNC4gKEMpIDE5OTksIDIwMDAgQWxleGlzIE1pa2hhaWxvdgor
ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxleGlzQGFiYy5jYXAucnUp
CisgKiAgUmV3cml0dGVuIGZvciBrZXJuZWwgMi40LjIxIChDKSAyMDAzIEFuZHJleSBCb3J6ZW5r
b3YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFydmlkamFhckBt
YWlsLnJ1KQorICogIFJld3JpdHRlbiBmb3Iga2VybmVsIDIuNS43MCAoQykgMjAwMyBBbmRyZXkg
Qm9yemVua292CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcnZp
ZGphYXJAbWFpbC5ydSkKKyAqCisgKiAgJElkOiBuYW1laS5jLHYgMS4yMS4yLjExIDIwMDQvMDEv
MDQgMTU6MDU6MDMgYm9yIEV4cCAkCisgKi8KKworI2RlZmluZSBTX0RCR19UUkFDRV9DVVJSRU5U
IFNfREJHX1RSQUNFX05BTUVJCisjaW5jbHVkZSAic3VwZXJtb3VudC5oIgorCisvKioKKyAqIEF0
dGFjaCBzdXBlciBkZW50cnkgdG8gc3ViIGRlbnRyeSAKKyAqCisgKiBAZGVudHJ5OglzdXBlciBk
ZW50cnkgdGhhdCBpcyBiZWluZyBjcmVhdGVkCisgKiBAc3ViZDoJc3ViZnMgZGVudHJ5IHRoYXQg
anVzdCBoYXMgYmVlbiBmb3VuZAorICoKKyAqIEl0IGNoZWNrcyB3aGV0aGVyIHN1YmZzIGlzIHN0
aWxsIHZhbGlkIHVzaW5nIEBkZW50cnktPmRfcGFyZW50OworICogbmV3IHN1cGVybW91bnRfZGVu
dHJ5X2luZm8gaXMgY3JlYXRlZCBhbmQgc2V0IHRvIHBvaW50IHRvIEBzdWJkLgorICoKKyAqIEl0
IGlzIHBvc3NpYmxlIHRoYXQgQHN1YmQgYWN0dWFsbHkgaGFzIGRpZmZlcmVudCBuYW1lIChudGZz
LCB2ZmF0IG9yCisgKiBpbiBnZW5lcmFsIGFueSBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW1z
KS4gU2VhcmNoIEBkZW50cnktPmRfcGFyZW50CisgKiBmb3IgYSBjaGlsZCBtYXRjaGluZyA9PSBA
c3ViZC0+ZF9uYW1lLiBJZiBmb3VuZCwgZGlzY2FyZCBAZGVudHJ5IGFuZCBjaGlsZAorICogKGFm
dGVyIHNvbWUgdmFsaWRpdHkgY2hlY2tzKSBpcyByZXR1cm5lZC4gQ2hlY2sgdGhhdCBjaGlsZCBh
Y3R1YWxseSBwb2ludHMKKyAqIHRvIEBzdWJkCisgKgorICogZF9sb29rdXAgcmVsaWVzIG9uIHRo
ZSBmYWN0IHRoYXQgaGFzaCBpcyBwcm9wZXJseSBpbml0aWFsaXplZCBpbgorICogQHN1YmQtPmRf
bmFtZSBhbmQgdGhhdCBzdXBlcmZzIGlzIHVzaW5nIHRoZSBzYW1lIGNvbXBhcmUgbWV0aG9kIGFz
IHN1YmZzLgorICoKKyAqIEFib3V0IHJlZiBjb3VudGluZy4gQHN1YmQgaXMgZHB1dCBpbiBzdXBl
cm1vdW50X2xvb2t1cC4gSS5lLiBpbiBjYXNlIG9mCisgKiBlcnJvciBvciBpZiB3ZSBmaW5kIG91
dCBpdCBpcyBhbHJlYWR5IGNvbm5lY3RlZCB0byBzdXBlcmZzIHRoZSBleGNlc3NpdmUKKyAqIGNv
dW50ZXIgZ2V0cyBkZWNyZW1lbnRlZC4gQGRlbnRyeSBpcyBmaW5hbGx5IGRwdXQgaW4gY2FsbGVy
IG9mIC0+bG9va3VwCisgKiBpZiAtPmxvb2t1cCByZXR1cm5zIHNvbWV0aGluZyAhPSAwLgorICov
CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK3ByZXBhcmVfZGVudHJ5KHN0cnVjdCBkZW50cnkg
KmRlbnRyeSwgc3RydWN0IGRlbnRyeSAqc3ViZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi
ID0gZGVudHJ5LT5kX3NiOworCXN0cnVjdCBkZW50cnkgKnJjOworCisJRU5URVIoc2IsICJkZW50
cnk9JXMgc3ViZD0lcyIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHN1YmQtPmRfbmFtZS5uYW1lKTsK
KworCXN1YmZzX2xvY2soc2IpOworCisJU1VQRVJNT1VOVF9CVUdfTE9DS0VEX09OKHNiLCAhc3Vi
ZCk7CisJU1VQRVJNT1VOVF9CVUdfTE9DS0VEX09OKHNiLCBkZW50cnktPmRfZnNkYXRhKTsKKwor
CXJjID0gRVJSX1BUUigtRU5PTUVESVVNKTsKKwlpZiAoIXN1YmZzX2lzX21vdW50ZWQoc2IpKQor
CQlnb3RvIG91dDsKKworCXJjID0gRVJSX1BUUigtRVNUQUxFKTsKKwlpZiAoaXNfZGVudHJ5X29i
c29sZXRlKGRlbnRyeS0+ZF9wYXJlbnQpKQorCQlnb3RvIG91dDsKKworCXJjID0gZF9sb29rdXAo
ZGVudHJ5LT5kX3BhcmVudCwgJnN1YmQtPmRfbmFtZSk7CisJaWYgKElTX0VSUihyYykpCisJCWdv
dG8gb3V0OworCisJaWYgKHJjKSB7CisJCVNVUEVSTU9VTlRfQlVHX0xPQ0tFRF9PTihzYiwgIXJj
LT5kX2ZzZGF0YSk7CisJCVNVUEVSTU9VTlRfQlVHX0xPQ0tFRF9PTihzYiwKKwkJKChzdHJ1Y3Qg
c3VwZXJtb3VudF9kZW50cnlfaW5mbyAqKXJjLT5kX2ZzZGF0YSktPmRlbnRyeSAhPSBzdWJkKTsK
Kwl9IGVsc2UgeworCQkvKgorCQkgKiB0aGlzIGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUuIFdl
IGNhbm5vdCBnYXJhbnRlZSBmdWxsCisJCSAqIGNvaGVyZW5jeSBiZXR3ZWVuIHN1YmZzIGFuZCBz
dXBlcmZzIGNhY2hlOyBpLmUuIGVudHJ5CisJCSAqIG1heSBoYXZlIGJlZW4gbGVmdCBpbiBvbmUg
Y2FjaGUgYnV0IHJlbW92ZWQgZnJvbSBhbm90aGVyCisJCSAqLworCQlyYyA9IEVSUl9QVFIoLUVO
T01FTSk7CisJCWlmIChpbml0X2RlbnRyeV9pbmZvKGRlbnRyeSkpCisJCQlnb3RvIG91dDsKKwkJ
YXR0YWNoX3N1YmZzX2RlbnRyeShkZW50cnksIHN1YmQpOworCQlkX2FkZChkZW50cnksIDApOwor
CQlyYyA9IDA7CisJfQorCitvdXQ6CisJc3ViZnNfdW5sb2NrKHNiKTsKKworCUxFQVZFKHNiLCAi
ZGVudHJ5PSVwIHN1YmQ9JXAgcmM9JXAiLCBkZW50cnksIHN1YmQsIHJjKTsKKworCXJldHVybiBy
YzsKKwkvKgorCSAqIHN1YmRlbnQgaXMgaW1wbGljaXRseSBmcmVlZCBvbiByZXR1cm4gaWYgd2Ug
c2tpcCBkZ2V0IGhlcmUKKwkgKi8KK30KKworCisvKioKKyAqIEF0dGFjaCBzdXBlcmZzIGlub2Rl
IHRvIHN1YmZzIGlub2RlIAorICoKKyAqIEBkZW50cnk6CXN1cGVyZnMgZGVudHJ5CisgKiBAc3Vi
ZDoJc3ViZnMgZGVudHJ5CisgKgorICogVGhpcyBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgb25s
eSBpbiBjb2ludGV4dCB0aGF0IHJlcXVpcmVzCisgKiBuZWdhdGl2ZSBkZW50cnkuCisgKgorICog
RklYTUUKKyAqIEhvbGRpbmcgc2JpLT5zZW0gZHVyaW5nIGlnZXQ0IGNyZWF0ZXMgZGVhZGxvY2sg
d2l0aCB3cml0ZV9pbm9kZSAtCisgKiB3cml0ZV9pbm9kZSBzZXRzIElfTE9DSyBhYmQgY2FsbHMg
c3VwZXJtb3VudF93cml0ZV9pbm9kZSBhdCB0aGUKKyAqIHNhbWUgbW9tZW50IGFzIGlnZXQ0IHNs
ZWVwcyB3YWl0aW5nIGZvciBJX0xPQ0sgdG8gYmUgY2xlYXJlZC4gU28KKyAqIGl0IGZpcnN0IGFj
cXVpcmVzIGlub2RlIGFuZCB0aGVuIGNoZWNrcyBpZiBzdWJmcyBpcyBzdGlsbCB2YWxpZC4KKyAq
LworCitzdGF0aWMgaW50CitwcmVwYXJlX2lub2RlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3Ry
dWN0IGRlbnRyeSAqc3ViZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5k
X3NiOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlu
b2RlICpzdWJpID0gc3ViZC0+ZF9pbm9kZTsKKwlpbnQgcmM7CisKKwlFTlRFUihzYiwgImRlbnRy
eT0lcyIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJU1VQRVJNT1VOVF9CVUdfT04oaW5vZGUp
OworCVNVUEVSTU9VTlRfQlVHX09OKCFzdWJpKTsKKworCXJjID0gLUVOT01FTTsKKwlpbm9kZSA9
IGlnZXRfbG9ja2VkKHNiLCBzdWJpLT5pX2lubyk7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXQ7
CisJZWxzZSBpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykKKwkJdW5sb2NrX25ld19pbm9kZShp
bm9kZSk7CisKKwlyYyA9IDA7CisKKwlzdWJmc19sb2NrKHNiKTsKKwlpZiAoIXN1YmZzX2lzX21v
dW50ZWQoc2IpKQorCQlyYyA9IC1FTk9NRURJVU07CisJZWxzZSBpZiAoaXNfZGVudHJ5X29ic29s
ZXRlKGRlbnRyeSkpCisJCXJjID0gLUVTVEFMRTsKKwllbHNlIHsKKwkJYXR0YWNoX3N1YmZzX2lu
b2RlKGlub2RlLCBzdWJpKTsKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwl9CisJ
c3ViZnNfdW5sb2NrKHNiKTsKKworCWlmIChyYykKKwkJaXB1dChpbm9kZSk7CisKK291dDoKKwlM
RUFWRShzYiwgImRlbnRyeT0lcyBpbm9kZT0lcCByYz0lZCIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUs
IGlub2RlLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0cnVjdCBpbm9kZSAqCitnZXRfc3Vi
ZnNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi
ID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGlub2RlICplcnI7CisJc3RydWN0IHN1cGVybW91bnRf
aW5vZGVfaW5mbyAqc2lpID0gc3VwZXJtb3VudF9pKGlub2RlKTsKKworCUVOVEVSKHNiLCAiaW5v
ZGU9JXAiLCBpbm9kZSk7CisKKwlzdWJmc19sb2NrKHNiKTsKKworCWVyciA9IEVSUl9QVFIoLUVO
T01FRElVTSk7CisJaWYgKCFzdWJmc19pc19tb3VudGVkKHNiKSkKKwkJZ290byBvdXQ7CisKKwll
cnIgPSBFUlJfUFRSKC1FU1RBTEUpOworCWlmIChpc19pbm9kZV9vYnNvbGV0ZShpbm9kZSkpCisJ
CWdvdG8gb3V0OworCisJZXJyID0gaWdyYWIoc2lpLT5pbm9kZSk7CisJU1VQRVJNT1VOVF9CVUdf
TE9DS0VEX09OKHNiLCAhZXJyKTsKKworb3V0OgorCXN1YmZzX3VubG9jayhzYik7CisKKwlMRUFW
RShzYiwgImlub2RlPSVwIHN1Ymk9JXAiLCBpbm9kZSwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9
CisKKy8qIGlub2RlIG1ldGhvZHMgKi8KKworc3RhdGljIGludAorc3VwZXJtb3VudF9jcmVhdGUo
c3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIHN0cnVj
dCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7
CisJc3RydWN0IGRlbnRyeSAqc3ViZGVudDsKKwlzdHJ1Y3QgaW5vZGUgKnN1YmRpcjsKKwlpbnQg
cmM7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisKKwlFTlRFUihzYiwgImRpcj0lcCBkZW50cnk9
JXMiLCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJbW50ID0gc3ViZnNfZ29fb25saW5l
KHNiKTsKKwlyYyA9IFBUUl9FUlIobW50KTsKKwlpZiAoSVNfRVJSKG1udCkpCisJCWdvdG8gb3V0
OworCisJc3ViZGlyID0gZ2V0X3N1YmZzX2lub2RlKGRpcik7CisJcmMgPSBQVFJfRVJSKHN1YmRp
cik7CisJaWYgKElTX0VSUihzdWJkaXIpKQorCQlnb3RvIGdvX29mZmxpbmU7CisKKwlyYyA9IC1F
QUNDRVM7CisJaWYgKCFzdWJkaXItPmlfb3AgfHwgIXN1YmRpci0+aV9vcC0+Y3JlYXRlKQorCQln
b3RvIHB1dF9zdWJkaXI7CisJCisJc3ViZGVudCA9IGdldF9zdWJmc19kZW50cnkoZGVudHJ5KTsK
KwlyYyA9IFBUUl9FUlIoc3ViZGVudCk7CisJaWYgKElTX0VSUihzdWJkZW50KSkKKwkJZ290byBw
dXRfc3ViZGlyOworCisJcmMgPSBzdWJmc19nZXRfYWNjZXNzKGRpciwgMSk7CisJaWYgKHJjKQor
CQlnb3RvIHB1dF9zdWJkZW50OworCisJLyogRklYTUUgYnVpbGQgcHJvcGVyIG5kIHN0cnVjdCAq
LworCXJjID0gc3ViZGlyLT5pX29wLT5jcmVhdGUoc3ViZGlyLCBzdWJkZW50LCBtb2RlLCBuZCk7
CisJc3ViZnNfcHV0X2FjY2VzcyhkaXIsIDEpOworCWlmIChyYykKKwkJZ290byBwdXRfc3ViZGVu
dDsKKworCXJjID0gcHJlcGFyZV9pbm9kZShkZW50cnksIHN1YmRlbnQpOworCWlmIChyYykKKwkJ
Z290byBwdXRfc3ViZGVudDsKKworCWRpci0+aV9tdGltZSA9IHN1YmRpci0+aV9tdGltZTsKKwlk
aXItPmlfY3RpbWUgPSBzdWJkaXItPmlfY3RpbWU7CisJZGlyLT5pX25saW5rID0gc3ViZGlyLT5p
X25saW5rOworCWRpci0+aV9zaXplID0gc3ViZGlyLT5pX3NpemU7CisJZGlyLT5pX2Jsb2NrcyA9
IHN1YmRpci0+aV9ibG9ja3M7CisKK3B1dF9zdWJkZW50OgorCWRwdXQoc3ViZGVudCk7CitwdXRf
c3ViZGlyOgorCWlwdXQoc3ViZGlyKTsKK2dvX29mZmxpbmU6CisJc3ViZnNfZ29fb2ZmbGluZShz
YiwgbW50KTsKK291dDoKKwlMRUFWRShzYiwgImRpcj0lcCBkZW50cnk9JXMgcmM9JWQiLCBkaXIs
IGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHJjKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBT
ZWFyY2ggZGlyZWN0b3J5IGZvciBhIG1hdGNoaW5nIG5hbWUKKyAqCisgKiBAZGlyOglkaXJlY3Rv
cnkgdGhhdCBpcyBiZWluZyBzZWFyY2hlZAorICogQGRlbnRyeToJbmFtZSB0byBzZWFyY2ggZm9y
IChpbiBkZW50cnktPmRfbmFtZSkKKyAqCisgKiBUaGlzIGlzIChjdXJyZW50bHkgOikgdGhlIG9u
bHkgbWV0aG9kIHdoZXJlIHdlIGRvIG5vdCBjYWxsIHN1YmZzCisgKiBkaXJlY3RseS4gVGhlIHJl
YXNvbiBpcyBjb2hlcmVuY3kgYmV0d2VlbiBzdWJmcyBhbmQgc3VwZXJmcyBkZW50cnkKKyAqIGNh
Y2hlcy4gSXQgaXMgaW1wb3NzaWJsZSB0byBlbnN1cmUgaXQgd2l0aG91dCBtb2RpZnlpbmcgdGhl
IHZlcnkKKyAqIGd1dHMgb2YgZnMvZGNhY2hlLmM7IHNvIHdlIGNoZWNrIGNhY2hlIGJlZm9yZSBk
b2luZyBhY3R1YWwgbG9va3VwLgorICogbG9va3VwX29uZV9sZW4ganVzdCBhdm9pZHMgZHVwbGlj
YXRpbmcgb2YgY29kZS4KKyAqCisgKiBTdXBlcm1vdW50IGlzIGluIGV4Y2x1c2l2ZSBjb250cm9s
IG9mIHN1YmZzIHNvIGl0IGlzIGdhcmFudGVlZCB0aGF0CisgKiBkZW50cnkgY2Fubm90IG1hZ2lj
YWxseSBhcHBlYXIgaW4gdGhlIG1pZGRsZSBvZiBsb29rdXAuCisgKgorICogVGhlcmUgYXJlIGZp
bGVzeXN0ZW1zIHRoYXQgc3VwcG9ydCBtdWx0aXBsZSBmb3JtcyBvZiBmaWxlIG5hbWUsIGxpa2UK
KyAqIGNhc2UtaW5zZW5zaXRpdmUgb3Igc2hvcnQtbG9uZyBuYW1lcyBvbiBOVEZTLiBJbiB0aGlz
IGNhc2UgY2FjaGUgbG9va3VwCisgKiBmYWlscyBidXQgZmlsZXN5c3RlbSBtYXkgcmV0dXJuIGRl
bnRyeSBmb3IgZGlmZmVyZW50IG5hbWUuIEluIHRoaXMgY2FzZQorICogd2UgY2hlY2sgaWYgZGVu
dHJ5IHdpdGggbWF0Y2hpbmcgbmFtZSBleGlzdHMgaW4gcGFyZW50IGFuZCByZXVzZSBpdC4KKyAq
Lworc3RhdGljIHN0cnVjdCBkZW50cnkgKgorc3VwZXJtb3VudF9sb29rdXAoc3RydWN0IGlub2Rl
ICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJ
c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgZGVudHJ5ICpyYywg
KnN1YmRlbnQsICpzdWJwYXJlbnQ7CisJc3RydWN0IGlub2RlICpzdWJkaXI7CisJc3RydWN0IHZm
c21vdW50ICptbnQ7CisJaW50IHJldDsKKworCUVOVEVSKHNiLCAiZGlyPSVwIGRlbnRyeT0lcyIs
IGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwltbnQgPSBzdWJmc19nb19vbmxpbmUoc2Ip
OworCXJjID0gKHN0cnVjdCBkZW50cnkgKiltbnQ7CisJaWYgKElTX0VSUihtbnQpKQorCQlnb3Rv
IG91dDsKKworCXN1YmRpciA9IGdldF9zdWJmc19pbm9kZShkaXIpOworCXJjID0gKHN0cnVjdCBk
ZW50cnkgKilzdWJkaXI7CisJaWYgKElTX0VSUihzdWJkaXIpKQorCQlnb3RvIGdvX29mZmxpbmU7
CisKKwlzdWJwYXJlbnQgPSBnZXRfc3ViZnNfZGVudHJ5KGRlbnRyeS0+ZF9wYXJlbnQpOworCXJj
ID0gc3VicGFyZW50OworCWlmIChJU19FUlIoc3VicGFyZW50KSkKKwkJZ290byBwdXRfc3ViZGly
OworCisJcmV0ID0gc3ViZnNfZ2V0X2FjY2VzcyhkaXIsIDApOworCXJjID0gRVJSX1BUUihyZXQp
OworCWlmIChyZXQpCisJCWdvdG8gcHV0X3N1YnBhcmVudDsKKworCVNVUEVSTU9VTlRfQlVHX09O
KHN1YnBhcmVudC0+ZF9pbm9kZSAhPSBzdWJkaXIpOworCisJLyogRklYTUUgdXN1YWxseSBsb29r
dXBfb25lX2xlbiBpcyBjYWxsZWQgdW5kZXIgaV9zZW0gKi8KKwkvKiBGSVhNRSB3aGF0IHRvIGRv
IHdpdGggbmQ/ICovCisJc3ViZGVudCA9IGxvb2t1cF9vbmVfbGVuKGRlbnRyeS0+ZF9uYW1lLm5h
bWUsIHN1YnBhcmVudCwKKwkJCQkgZGVudHJ5LT5kX25hbWUubGVuKTsKKworCXN1YmZzX3B1dF9h
Y2Nlc3MoZGlyLCAwKTsKKwlyYyA9IHN1YmRlbnQ7CisJaWYgKElTX0VSUihyYykpCisJCWdvdG8g
cHV0X3N1YnBhcmVudDsKKworCXJjID0gcHJlcGFyZV9kZW50cnkoZGVudHJ5LCBzdWJkZW50KTsK
KwlpZiAoSVNfRVJSKHJjKSkKKwkJZ290byBwdXRfc3ViZGVudDsKKworCWlmICghcmMgJiYgc3Vi
ZGVudC0+ZF9pbm9kZSkgeworCQlyZXQgPSBwcmVwYXJlX2lub2RlKGRlbnRyeSwgc3ViZGVudCk7
CisJCWlmIChyZXQgPCAwKQorCQkJcmMgPSBFUlJfUFRSKHJldCk7CisJfQorCitwdXRfc3ViZGVu
dDoKKwlkcHV0KHN1YmRlbnQpOworcHV0X3N1YnBhcmVudDoKKwlkcHV0KHN1YnBhcmVudCk7Citw
dXRfc3ViZGlyOgorCWlwdXQoc3ViZGlyKTsKK2dvX29mZmxpbmU6CisJc3ViZnNfZ29fb2ZmbGlu
ZShzYiwgbW50KTsKK291dDoKKwlMRUFWRShzYiwgImRpcj0lcCBkZW50cnk9JXMgcmM9JXAiLCBk
aXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHJjKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGlj
IGludAorc3VwZXJtb3VudF9saW5rKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBp
bm9kZSAqZGlyLAorCQlzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCXN0cnVjdCBzdXBl
cl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGRlbnRyeSAqb2xkX3N1YmRlbnQsICpu
ZXdfc3ViZGVudDsKKwlzdHJ1Y3QgaW5vZGUgKnN1YmRpcjsKKwlpbnQgcmM7CisJc3RydWN0IHZm
c21vdW50ICptbnQ7CisKKwlFTlRFUihzYiwgImZyb209JXMgZGlyPSVwIHRvPSVzIiwgb2xkX2Rl
bnRyeS0+ZF9uYW1lLm5hbWUsIGRpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJU1VQ
RVJNT1VOVF9CVUdfT04obmV3X2RlbnRyeS0+ZF9pbm9kZSk7CisKKwltbnQgPSBzdWJmc19nb19v
bmxpbmUoc2IpOworCXJjID0gUFRSX0VSUihtbnQpOworCWlmIChJU19FUlIobW50KSkKKwkJZ290
byBvdXQ7CisKKwlzdWJkaXIgPSBnZXRfc3ViZnNfaW5vZGUoZGlyKTsKKwlyYyA9IFBUUl9FUlIo
c3ViZGlyKTsKKwlpZiAoSVNfRVJSKHN1YmRpcikpCisJCWdvdG8gZ29fb2ZmbGluZTsKKworCXJj
ID0gLUVQRVJNOworCWlmICghc3ViZGlyLT5pX29wIHx8ICFzdWJkaXItPmlfb3AtPmxpbmspCisJ
CWdvdG8gcHV0X3N1YmRpcjsKKworCW9sZF9zdWJkZW50ID0gZ2V0X3N1YmZzX2RlbnRyeShvbGRf
ZGVudHJ5KTsKKwlyYyA9IFBUUl9FUlIob2xkX3N1YmRlbnQpOworCWlmIChJU19FUlIob2xkX3N1
YmRlbnQpKQorCQlnb3RvIHB1dF9zdWJkaXI7CisKKwluZXdfc3ViZGVudCA9IGdldF9zdWJmc19k
ZW50cnkobmV3X2RlbnRyeSk7CisJcmMgPSBQVFJfRVJSKG5ld19zdWJkZW50KTsKKwlpZiAoSVNf
RVJSKG5ld19zdWJkZW50KSkKKwkJZ290byBwdXRfb2xkX3N1YmRlbnQ7CisKKwlyYyA9IHN1YmZz
X2dldF9hY2Nlc3MoZGlyLCAxKTsKKwlpZiAocmMpCisJCWdvdG8gcHV0X25ld19zdWJkZW50Owor
CisJcmMgPSBzdWJkaXItPmlfb3AtPmxpbmsob2xkX3N1YmRlbnQsIHN1YmRpciwgbmV3X3N1YmRl
bnQpOworCXN1YmZzX3B1dF9hY2Nlc3MoZGlyLCAxKTsKKwlpZiAocmMpCisJCWdvdG8gcHV0X25l
d19zdWJkZW50OworCisJcmMgPSBwcmVwYXJlX2lub2RlKG5ld19kZW50cnksIG5ld19zdWJkZW50
KTsKKwlpZiAocmMpCisJCWdvdG8gcHV0X25ld19zdWJkZW50OworCisJZGlyLT5pX210aW1lID0g
c3ViZGlyLT5pX210aW1lOworCWRpci0+aV9jdGltZSA9IHN1YmRpci0+aV9jdGltZTsKKwlkaXIt
PmlfbmxpbmsgPSBzdWJkaXItPmlfbmxpbms7CisJZGlyLT5pX3NpemUgPSBzdWJkaXItPmlfc2l6
ZTsKKwlkaXItPmlfYmxvY2tzID0gc3ViZGlyLT5pX2Jsb2NrczsKKworcHV0X25ld19zdWJkZW50
OgorCWRwdXQobmV3X3N1YmRlbnQpOworcHV0X29sZF9zdWJkZW50OgorCWRwdXQob2xkX3N1YmRl
bnQpOworcHV0X3N1YmRpcjoKKwlpcHV0KHN1YmRpcik7Citnb19vZmZsaW5lOgorCXN1YmZzX2dv
X29mZmxpbmUoc2IsIG1udCk7CitvdXQ6CisJTEVBVkUoc2IsICJmcm9tPSVzIGRpcj0lcCB0bz0l
cyByYz0lZCIsIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLCBkaXIsIG5ld19kZW50cnktPmRfbmFt
ZS5uYW1lLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK3N1cGVybW91bnRf
dW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3Ry
dWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgZGVudHJ5ICpzdWJkZW50
OworCXN0cnVjdCBpbm9kZSAqc3ViZGlyOworCWludCByYzsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1u
dDsKKworCUVOVEVSKHNiLCAiZGlyPSVwIGRlbnRyeT0lcyIsIGRpciwgZGVudHJ5LT5kX25hbWUu
bmFtZSk7CisKKwltbnQgPSBzdWJmc19nb19vbmxpbmUoc2IpOworCXJjID0gUFRSX0VSUihtbnQp
OworCWlmIChJU19FUlIobW50KSkKKwkJZ290byBvdXQ7CisKKwlzdWJkaXIgPSBnZXRfc3ViZnNf
aW5vZGUoZGlyKTsKKwlyYyA9IFBUUl9FUlIoc3ViZGlyKTsKKwlpZiAoSVNfRVJSKHN1YmRpcikp
CisJCWdvdG8gZ29fb2ZmbGluZTsKKworCXJjID0gLUVQRVJNOworCWlmICghc3ViZGlyLT5pX29w
IHx8ICFzdWJkaXItPmlfb3AtPnVubGluaykKKwkJZ290byBwdXRfc3ViZGlyOworCisJc3ViZGVu
dCA9IGdldF9zdWJmc19kZW50cnkoZGVudHJ5KTsKKwlyYyA9IFBUUl9FUlIoc3ViZGVudCk7CisJ
aWYgKElTX0VSUihzdWJkZW50KSkKKwkJZ290byBwdXRfc3ViZGlyOworCisJLyoKKwkgKiBiZWxv
dyBpcyBub3QgYSB0eXBvLiBXZSBoYXZlIHRvIG1hcmsgX2RlbGV0ZWRfIGlub2RlCisJICogZm9y
IHBvc3NpYmxlIGxhdGVyIGRlbGV0ZSBpbiBjbGVhcl9pbm9kZQorCSAqLworCXJjID0gc3ViZnNf
Z2V0X2FjY2VzcyhkZW50cnktPmRfaW5vZGUsIDEpOworCWlmIChyYykKKwkJZ290byBwdXRfc3Vi
ZGVudDsKKworCXJjID0gc3ViZGlyLT5pX29wLT51bmxpbmsoc3ViZGlyLCBzdWJkZW50KTsKKwlp
ZiAocmMpCisJCWdvdG8gcHV0X3dyaXRlX2FjY2VzczsKKworCWRpci0+aV9tdGltZSA9IHN1YmRp
ci0+aV9tdGltZTsKKwlkaXItPmlfY3RpbWUgPSBzdWJkaXItPmlfY3RpbWU7CisJZGlyLT5pX25s
aW5rID0gc3ViZGlyLT5pX25saW5rOworCWRpci0+aV9zaXplID0gc3ViZGlyLT5pX3NpemU7CisJ
ZGlyLT5pX2Jsb2NrcyA9IHN1YmRpci0+aV9ibG9ja3M7CisKKwlkZW50cnktPmRfaW5vZGUtPmlf
bmxpbmsgPSBzdWJkZW50LT5kX2lub2RlLT5pX25saW5rOworCWRlbnRyeS0+ZF9pbm9kZS0+aV9j
dGltZSA9IHN1YmRlbnQtPmRfaW5vZGUtPmlfY3RpbWU7CisKK3B1dF93cml0ZV9hY2Nlc3M6CisJ
LyoKKwkgKiB3ZSBjYW4ndCBwdXQgd3JpdGUgYWNjZXNzIGlmIHRoZXJlIGFyZSBwZW5kaW5nIGRl
bGV0ZXMKKwkgKiBzbyB3ZSBsZWF2ZSBpdCBvbiBhbmQgbGV0IGl0IGJlIHB1dCBpbiBjbGVhcl9p
bm9kZSBmb3IKKwkgKiBpX25saW5rID09IDAKKwkgKgorCSAqIFdoaWxlIGlfbmxpbmsgaXMgYmVs
aWV2ZWQgdG8gYmUgYXRvbWljIGhlcmUgaV9jb3VudCBub3QsCisJICogc28gd2UgY2Fubm90IGNo
ZWNrICYmIGlfY291bnQgPT0gMC4gSXQgaXMgZXhwZWN0ZWQgdGhhdAorCSAqIGRlbGV0ZWQgZmls
ZXMgYXJlIGtlcHQgb3BlbiBvbmx5IHJhcmVseS4KKwkgKi8KKwlpZiAoZGVudHJ5LT5kX2lub2Rl
LT5pX25saW5rKQorCQlzdWJmc19wdXRfYWNjZXNzKGRlbnRyeS0+ZF9pbm9kZSwgMSk7CitwdXRf
c3ViZGVudDoKKwlkcHV0KHN1YmRlbnQpOworcHV0X3N1YmRpcjoKKwlpcHV0KHN1YmRpcik7Citn
b19vZmZsaW5lOgorCXN1YmZzX2dvX29mZmxpbmUoc2IsIG1udCk7CitvdXQ6CisJTEVBVkUoc2Is
ICJkaXI9JXAgZGVudHJ5PSVzIHJjPSVkIiwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCByYyk7
CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK3N1cGVybW91bnRfc3ltbGluayhzdHJ1
Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICBjb25zdCBjaGFyICpz
eW1uYW1lKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0
IGRlbnRyeSAqc3ViZGVudDsKKwlzdHJ1Y3QgaW5vZGUgKnN1YmRpcjsKKwlpbnQgcmM7CisJc3Ry
dWN0IHZmc21vdW50ICptbnQ7CisKKwlFTlRFUihzYiwgImRpcj0lcCBkZW50cnk9JXMiLCBkaXIs
IGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJbW50ID0gc3ViZnNfZ29fb25saW5lKHNiKTsKKwly
YyA9IFBUUl9FUlIobW50KTsKKwlpZiAoSVNfRVJSKG1udCkpCisJCWdvdG8gb3V0OworCisJc3Vi
ZGlyID0gZ2V0X3N1YmZzX2lub2RlKGRpcik7CisJcmMgPSBQVFJfRVJSKHN1YmRpcik7CisJaWYg
KElTX0VSUihzdWJkaXIpKQorCQlnb3RvIGdvX29mZmxpbmU7CisKKwlyYyA9IC1FUEVSTTsKKwlp
ZiAoIXN1YmRpci0+aV9vcCB8fCAhc3ViZGlyLT5pX29wLT5zeW1saW5rKQorCQlnb3RvIHB1dF9z
dWJkaXI7CisKKwlzdWJkZW50ID0gZ2V0X3N1YmZzX2RlbnRyeShkZW50cnkpOworCXJjID0gUFRS
X0VSUihzdWJkZW50KTsKKwlpZiAoSVNfRVJSKHN1YmRlbnQpKQorCQlnb3RvIHB1dF9zdWJkaXI7
CisKKwlyYyA9IHN1YmZzX2dldF9hY2Nlc3MoZGlyLCAxKTsKKwlpZiAocmMpCisJCWdvdG8gcHV0
X3N1YmRlbnQ7CisKKwlyYyA9IHN1YmRpci0+aV9vcC0+c3ltbGluayhzdWJkaXIsIHN1YmRlbnQs
IHN5bW5hbWUpOworCXN1YmZzX3B1dF9hY2Nlc3MoZGlyLCAxKTsKKwlpZiAocmMpCisJCWdvdG8g
cHV0X3N1YmRlbnQ7CisKKwlyYyA9IHByZXBhcmVfaW5vZGUoZGVudHJ5LCBzdWJkZW50KTsKKwlp
ZiAocmMpCisJCWdvdG8gcHV0X3N1YmRlbnQ7CisKKwlkaXItPmlfbXRpbWUgPSBzdWJkaXItPmlf
bXRpbWU7CisJZGlyLT5pX2N0aW1lID0gc3ViZGlyLT5pX2N0aW1lOworCWRpci0+aV9ubGluayA9
IHN1YmRpci0+aV9ubGluazsKKwlkaXItPmlfc2l6ZSA9IHN1YmRpci0+aV9zaXplOworCWRpci0+
aV9ibG9ja3MgPSBzdWJkaXItPmlfYmxvY2tzOworCitwdXRfc3ViZGVudDoKKwlkcHV0KHN1YmRl
bnQpOworcHV0X3N1YmRpcjoKKwlpcHV0KHN1YmRpcik7Citnb19vZmZsaW5lOgorCXN1YmZzX2dv
X29mZmxpbmUoc2IsIG1udCk7CitvdXQ6CisJTEVBVkUoc2IsICJkaXI9JXAgZGVudHJ5PSVzIHJj
PSVkIiwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisK
K3N0YXRpYyBpbnQKK3N1cGVybW91bnRfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBk
ZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRp
ci0+aV9zYjsKKwlzdHJ1Y3QgZGVudHJ5ICpzdWJkZW50OworCXN0cnVjdCBpbm9kZSAqc3ViZGly
OworCWludCByYzsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKworCUVOVEVSKHNiLCAiZGlyPSVw
IGRlbnRyeT0lcyIsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwltbnQgPSBzdWJmc19n
b19vbmxpbmUoc2IpOworCXJjID0gUFRSX0VSUihtbnQpOworCWlmIChJU19FUlIobW50KSkKKwkJ
Z290byBvdXQ7CisKKwlzdWJkaXIgPSBnZXRfc3ViZnNfaW5vZGUoZGlyKTsKKwlyYyA9IFBUUl9F
UlIoc3ViZGlyKTsKKwlpZiAoSVNfRVJSKHN1YmRpcikpCisJCWdvdG8gZ29fb2ZmbGluZTsKKwor
CXJjID0gLUVQRVJNOworCWlmICghc3ViZGlyLT5pX29wIHx8ICFzdWJkaXItPmlfb3AtPm1rZGly
KQorCQlnb3RvIHB1dF9zdWJkaXI7CisKKwlzdWJkZW50ID0gZ2V0X3N1YmZzX2RlbnRyeShkZW50
cnkpOworCXJjID0gUFRSX0VSUihzdWJkZW50KTsKKwlpZiAoSVNfRVJSKHN1YmRlbnQpKQorCQln
b3RvIHB1dF9zdWJkaXI7CisKKwlyYyA9IHN1YmZzX2dldF9hY2Nlc3MoZGlyLCAxKTsKKwlpZiAo
cmMpCisJCWdvdG8gcHV0X3N1YmRlbnQ7CisKKwlyYyA9IHN1YmRpci0+aV9vcC0+bWtkaXIoc3Vi
ZGlyLCBzdWJkZW50LCBtb2RlKTsKKwlzdWJmc19wdXRfYWNjZXNzKGRpciwgMSk7CisJaWYgKHJj
KQorCQlnb3RvIHB1dF9zdWJkZW50OworCisJcmMgPSBwcmVwYXJlX2lub2RlKGRlbnRyeSwgc3Vi
ZGVudCk7CisJaWYgKHJjKQorCQlnb3RvIHB1dF9zdWJkZW50OworCisJZGlyLT5pX210aW1lID0g
c3ViZGlyLT5pX210aW1lOworCWRpci0+aV9jdGltZSA9IHN1YmRpci0+aV9jdGltZTsKKwlkaXIt
PmlfbmxpbmsgPSBzdWJkaXItPmlfbmxpbms7CisJZGlyLT5pX3NpemUgPSBzdWJkaXItPmlfc2l6
ZTsKKwlkaXItPmlfYmxvY2tzID0gc3ViZGlyLT5pX2Jsb2NrczsKKworcHV0X3N1YmRlbnQ6CisJ
ZHB1dChzdWJkZW50KTsKK3B1dF9zdWJkaXI6CisJaXB1dChzdWJkaXIpOworZ29fb2ZmbGluZToK
KwlzdWJmc19nb19vZmZsaW5lKHNiLCBtbnQpOworb3V0OgorCUxFQVZFKHNiLCAiZGlyPSVwIGRl
bnRyeT0lcyByYz0lZCIsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgcmMpOworCisJcmV0dXJu
IHJjOworfQorCitzdGF0aWMgaW50CitzdXBlcm1vdW50X3JtZGlyKHN0cnVjdCBpbm9kZSAqZGly
LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRp
ci0+aV9zYjsKKwlzdHJ1Y3QgZGVudHJ5ICpzdWJkZW50OworCXN0cnVjdCBpbm9kZSAqc3ViZGly
OworCWludCByYzsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKworCUVOVEVSKHNiLCAiZGlyPSVw
IGRlbnRyeT0lcyIsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwltbnQgPSBzdWJmc19n
b19vbmxpbmUoc2IpOworCXJjID0gUFRSX0VSUihtbnQpOworCWlmIChJU19FUlIobW50KSkKKwkJ
Z290byBvdXQ7CisKKwlzdWJkaXIgPSBnZXRfc3ViZnNfaW5vZGUoZGlyKTsKKwlyYyA9IFBUUl9F
UlIoc3ViZGlyKTsKKwlpZiAoSVNfRVJSKHN1YmRpcikpCisJCWdvdG8gZ29fb2ZmbGluZTsKKwor
CXJjID0gLUVQRVJNOworCWlmICghc3ViZGlyLT5pX29wIHx8ICFzdWJkaXItPmlfb3AtPnJtZGly
KQorCQlnb3RvIHB1dF9zdWJkaXI7CisKKwlzdWJkZW50ID0gZ2V0X3N1YmZzX2RlbnRyeShkZW50
cnkpOworCXJjID0gUFRSX0VSUihzdWJkZW50KTsKKwlpZiAoSVNfRVJSKHN1YmRlbnQpKQorCQln
b3RvIHB1dF9zdWJkaXI7CisKKwkvKiBjZi4gc3VwZXJtb3VudF91bmxpbmsgKi8KKwlyYyA9IHN1
YmZzX2dldF9hY2Nlc3MoZGVudHJ5LT5kX2lub2RlLCAxKTsKKwlpZiAocmMpCisJCWdvdG8gcHV0
X3N1YmRlbnQ7CisKKwlyYyA9IHN1YmRpci0+aV9vcC0+cm1kaXIoc3ViZGlyLCBzdWJkZW50KTsK
KwlpZiAocmMpCisJCWdvdG8gcHV0X3dyaXRlX2FjY2VzczsKKworCWRpci0+aV9tdGltZSA9IHN1
YmRpci0+aV9tdGltZTsKKwlkaXItPmlfY3RpbWUgPSBzdWJkaXItPmlfY3RpbWU7CisJZGlyLT5p
X25saW5rID0gc3ViZGlyLT5pX25saW5rOworCWRpci0+aV9zaXplID0gc3ViZGlyLT5pX3NpemU7
CisJZGlyLT5pX2Jsb2NrcyA9IHN1YmRpci0+aV9ibG9ja3M7CisKKwkvKiBobW0gLi4uIGhhcmQg
bGlua3MgdG8gZGlyZWN0b3JpZXMgYXJlIG5vdCBhbGxvd2VkLCBhcmUgdGhleT8gKi8KKwlkZW50
cnktPmRfaW5vZGUtPmlfbmxpbmsgPSBzdWJkZW50LT5kX2lub2RlLT5pX25saW5rOworCWRlbnRy
eS0+ZF9pbm9kZS0+aV9jdGltZSA9IHN1YmRlbnQtPmRfaW5vZGUtPmlfY3RpbWU7CisKK3B1dF93
cml0ZV9hY2Nlc3M6CisJLyogY2YuIHN1cGVybW91bnRfdW5saW5rICovCisJaWYgKGRlbnRyeS0+
ZF9pbm9kZS0+aV9ubGluaykKKwkJc3ViZnNfcHV0X2FjY2VzcyhkZW50cnktPmRfaW5vZGUsIDEp
OworcHV0X3N1YmRlbnQ6CisJZHB1dChzdWJkZW50KTsKK3B1dF9zdWJkaXI6CisJaXB1dChzdWJk
aXIpOworZ29fb2ZmbGluZToKKwlzdWJmc19nb19vZmZsaW5lKHNiLCBtbnQpOworb3V0OgorCUxF
QVZFKHNiLCAiZGlyPSVwIGRlbnRyeT0lcyByYz0lZCIsIGRpciwgZGVudHJ5LT5kX25hbWUubmFt
ZSwgcmMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitzdXBlcm1vdW50X21rbm9k
KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludAorCQkgbW9kZSwg
ZGV2X3QgZGV2KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3Ry
dWN0IGRlbnRyeSAqc3ViZGVudDsKKwlzdHJ1Y3QgaW5vZGUgKnN1YmRpcjsKKwlpbnQgcmM7CisJ
c3RydWN0IHZmc21vdW50ICptbnQ7CisKKwlFTlRFUihzYiwgImRpcj0lcCBkZW50cnk9JXMiLCBk
aXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJbW50ID0gc3ViZnNfZ29fb25saW5lKHNiKTsK
KwlyYyA9IFBUUl9FUlIobW50KTsKKwlpZiAoSVNfRVJSKG1udCkpCisJCWdvdG8gb3V0OworCisJ
c3ViZGlyID0gZ2V0X3N1YmZzX2lub2RlKGRpcik7CisJcmMgPSBQVFJfRVJSKHN1YmRpcik7CisJ
aWYgKElTX0VSUihzdWJkaXIpKQorCQlnb3RvIGdvX29mZmxpbmU7CisKKwlyYyA9IC1FUEVSTTsK
KwlpZiAoIXN1YmRpci0+aV9vcCB8fCAhc3ViZGlyLT5pX29wLT5ta25vZCkKKwkJZ290byBwdXRf
c3ViZGlyOworCisJc3ViZGVudCA9IGdldF9zdWJmc19kZW50cnkoZGVudHJ5KTsKKwlyYyA9IFBU
Ul9FUlIoc3ViZGVudCk7CisJaWYgKElTX0VSUihzdWJkZW50KSkKKwkJZ290byBwdXRfc3ViZGly
OworCisJcmMgPSBzdWJmc19nZXRfYWNjZXNzKGRpciwgMSk7CisJaWYgKHJjKQorCQlnb3RvIHB1
dF9zdWJkZW50OworCisJcmMgPSBzdWJkaXItPmlfb3AtPm1rbm9kKHN1YmRpciwgc3ViZGVudCwg
bW9kZSwgZGV2KTsKKwlzdWJmc19wdXRfYWNjZXNzKGRpciwgMSk7CisJaWYgKHJjKQorCQlnb3Rv
IHB1dF9zdWJkZW50OworCisJcmMgPSBwcmVwYXJlX2lub2RlKGRlbnRyeSwgc3ViZGVudCk7CisJ
aWYgKHJjKQorCQlnb3RvIHB1dF9zdWJkZW50OworCisJZGlyLT5pX210aW1lID0gc3ViZGlyLT5p
X210aW1lOworCWRpci0+aV9jdGltZSA9IHN1YmRpci0+aV9jdGltZTsKKwlkaXItPmlfbmxpbmsg
PSBzdWJkaXItPmlfbmxpbms7CisJZGlyLT5pX3NpemUgPSBzdWJkaXItPmlfc2l6ZTsKKwlkaXIt
PmlfYmxvY2tzID0gc3ViZGlyLT5pX2Jsb2NrczsKKworcHV0X3N1YmRlbnQ6CisJZHB1dChzdWJk
ZW50KTsKK3B1dF9zdWJkaXI6CisJaXB1dChzdWJkaXIpOworZ29fb2ZmbGluZToKKwlzdWJmc19n
b19vZmZsaW5lKHNiLCBtbnQpOworb3V0OgorCUxFQVZFKHNiLCAiZGlyPSVwIGRlbnRyeT0lcyBy
Yz0lZCIsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgcmMpOworCisJcmV0dXJuIHJjOworfQor
CitzdGF0aWMgaW50CitzdXBlcm1vdW50X3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZGRpciwgc3Ry
dWN0IGRlbnRyeSAqb2xkZGVudHJ5LAorCQkgIHN0cnVjdCBpbm9kZSAqbmV3ZGlyLCBzdHJ1Y3Qg
ZGVudHJ5ICpuZXdkZW50cnkpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG9sZGRpci0+
aV9zYjsKKwlzdHJ1Y3QgZGVudHJ5ICpvbGRzdWJkZW50LCAqbmV3c3ViZGVudDsKKwlzdHJ1Y3Qg
aW5vZGUgKm9sZHN1YmRpciwgKm5ld3N1YmRpcjsKKwlpbnQgcmM7CisJc3RydWN0IHZmc21vdW50
ICptbnQ7CisKKwlFTlRFUihzYiwgIm9sZGRpcj0lcCBvbGRkZW50cnk9JXMgbmV3ZGlyPSVwIG5l
d2RlbnRyeT0lcyIsIG9sZGRpciwgb2xkZGVudHJ5LT5kX25hbWUubmFtZSwgbmV3ZGlyLCBuZXdk
ZW50cnktPmRfbmFtZS5uYW1lKTsKKworCW1udCA9IHN1YmZzX2dvX29ubGluZShzYik7CisJcmMg
PSBQVFJfRVJSKG1udCk7CisJaWYgKElTX0VSUihtbnQpKQorCQlnb3RvIG91dDsKKworCW9sZHN1
YmRpciA9IGdldF9zdWJmc19pbm9kZShvbGRkaXIpOworCXJjID0gUFRSX0VSUihvbGRzdWJkaXIp
OworCWlmIChJU19FUlIob2xkc3ViZGlyKSkKKwkJZ290byBnb19vZmZsaW5lOworCisJcmMgPSAt
RVBFUk07CisJaWYgKCFvbGRzdWJkaXItPmlfb3AgfHwgIW9sZHN1YmRpci0+aV9vcC0+cmVuYW1l
KQorCQlnb3RvIHB1dF9vbGRfc3ViZGlyOworCisJb2xkc3ViZGVudCA9IGdldF9zdWJmc19kZW50
cnkob2xkZGVudHJ5KTsKKwlyYyA9IFBUUl9FUlIob2xkc3ViZGVudCk7CisJaWYgKElTX0VSUihv
bGRzdWJkZW50KSkKKwkJZ290byBwdXRfb2xkX3N1YmRpcjsKKworCW5ld3N1YmRpciA9IGdldF9z
dWJmc19pbm9kZShuZXdkaXIpOworCXJjID0gUFRSX0VSUihuZXdzdWJkaXIpOworCWlmIChJU19F
UlIobmV3c3ViZGlyKSkKKwkJZ290byBwdXRfb2xkX3N1YmRlbnQ7CisKKwluZXdzdWJkZW50ID0g
Z2V0X3N1YmZzX2RlbnRyeShuZXdkZW50cnkpOworCXJjID0gUFRSX0VSUihuZXdzdWJkZW50KTsK
KwlpZiAoSVNfRVJSKG5ld3N1YmRlbnQpKQorCQlnb3RvIHB1dF9uZXdfc3ViZGlyOworCisJLyoK
KwkgKiBJZiBuZXcgZmlsZSBleGlzdHMgaXQgd2lsbCBiZSBpbXBsY2l0bHkgdW5saW5rZWQgc28K
KwkgKiBiZWhhdmUgbGlrZSBpbiB1bmxpbmsgY2FzZS4KKwkgKiBJZiBpdCBkb2VzIG5vdCBleGlz
dCB3ZSBoYXZlIHR3byB3cml0ZSBhY2Nlc3NlcyAtIGZvcgorCSAqIGJvdGggb2xkIGFuZCBuZXcg
ZGlyZWN0b3J5LCBJIGd1ZXNzIGl0IGRvZXMgbm90IG1hdHRlcgorCSAqIHdoaWNoIG9uZSBpcyB1
c2VkIGluIHRoaXMgY2FzZQorCSAqLworCWlmIChuZXdkZW50cnktPmRfaW5vZGUpCisJCXJjID0g
c3ViZnNfZ2V0X2FjY2VzcyhuZXdkZW50cnktPmRfaW5vZGUsIDEpOworCWVsc2UKKwkJcmMgPSBz
dWJmc19nZXRfYWNjZXNzKG9sZGRpciwgMSk7CisJaWYgKHJjKQorCQlnb3RvIHB1dF9uZXdfc3Vi
ZGVudDsKKworCXJjID0gb2xkc3ViZGlyLT5pX29wLT5yZW5hbWUob2xkc3ViZGlyLCBvbGRzdWJk
ZW50LAorCQkJCSAgICAgbmV3c3ViZGlyLCBuZXdzdWJkZW50KTsKKwlpZiAocmMpCisJCWdvdG8g
cHV0X3dyaXRlX2FjY2VzczsKKworCS8qCisJICogdGhpcyBpcyBzdHJpY3RseSBzcGVha2luZyBj
b25kaXRpb25hbCBvbiBGU19SRU5BTUVfRE9FU19EX01PVkUKKwkgKiBmbGFnLCBidXQgYXMgb2Yg
dGhpcyB3cml0aW5nIHRoaXMgZmxhZyBpcyBzZXQgb25seQorCSAqIGZvciBORlMgb3IgaW50ZXJt
ZXp6byBhbmQgaXQgaG9wZWZ1bGx5IGdvZXMgYXdheSBzb21ldGltZXMgLi4uCisJICoKKwkgKiBT
dXBlcm1vdW50IHBhdGNoIGFkZHMgY29kZSB0byBkb19rZXJuX21vdW50IHRoYXQgY2hlY2tzCisJ
ICogZm9yIHRoaXMgZmxhZyBhbmQgcmVmdXNlcyBtb3VudGluZworCSAqLworCWRfbW92ZShvbGRz
dWJkZW50LCBuZXdzdWJkZW50KTsKKworCW9sZGRpci0+aV9tdGltZSA9IG9sZHN1YmRpci0+aV9t
dGltZTsKKwlvbGRkaXItPmlfY3RpbWUgPSBvbGRzdWJkaXItPmlfY3RpbWU7CisJb2xkZGlyLT5p
X25saW5rID0gb2xkc3ViZGlyLT5pX25saW5rOworCW9sZGRpci0+aV9zaXplID0gb2xkc3ViZGly
LT5pX3NpemU7CisJb2xkZGlyLT5pX2Jsb2NrcyA9IG9sZHN1YmRpci0+aV9ibG9ja3M7CisKKwlu
ZXdkaXItPmlfbXRpbWUgPSBuZXdzdWJkaXItPmlfbXRpbWU7CisJbmV3ZGlyLT5pX2N0aW1lID0g
bmV3c3ViZGlyLT5pX2N0aW1lOworCW5ld2Rpci0+aV9ubGluayA9IG5ld3N1YmRpci0+aV9ubGlu
azsKKwluZXdkaXItPmlfc2l6ZSA9IG5ld3N1YmRpci0+aV9zaXplOworCW5ld2Rpci0+aV9ibG9j
a3MgPSBuZXdzdWJkaXItPmlfYmxvY2tzOworCisJb2xkZGVudHJ5LT5kX2lub2RlLT5pX25saW5r
ID0gb2xkc3ViZGVudC0+ZF9pbm9kZS0+aV9ubGluazsKKwlvbGRkZW50cnktPmRfaW5vZGUtPmlf
Y3RpbWUgPSBvbGRzdWJkZW50LT5kX2lub2RlLT5pX2N0aW1lOworCisJaWYgKG5ld2RlbnRyeS0+
ZF9pbm9kZSkgeworCQluZXdkZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgPSBuZXdzdWJkZW50LT5k
X2lub2RlLT5pX25saW5rOworCQluZXdkZW50cnktPmRfaW5vZGUtPmlfY3RpbWUgPSBuZXdzdWJk
ZW50LT5kX2lub2RlLT5pX2N0aW1lOworCX0KKworcHV0X3dyaXRlX2FjY2VzczoKKwlpZiAobmV3
ZGVudHJ5LT5kX2lub2RlKSB7CisJCS8qIGNmLiBzdXBlcm1vdW50X3VubGluayAqLworCQlpZiAo
bmV3ZGVudHJ5LT5kX2lub2RlLT5pX25saW5rKQorCQkJc3ViZnNfcHV0X2FjY2VzcyhuZXdkZW50
cnktPmRfaW5vZGUsIDEpOworCX0gZWxzZQorCQlzdWJmc19wdXRfYWNjZXNzKG9sZGRpciwgMSk7
CitwdXRfbmV3X3N1YmRlbnQ6CisJZHB1dChuZXdzdWJkZW50KTsKK3B1dF9uZXdfc3ViZGlyOgor
CWlwdXQobmV3c3ViZGlyKTsKK3B1dF9vbGRfc3ViZGVudDoKKwlkcHV0KG9sZHN1YmRlbnQpOwor
cHV0X29sZF9zdWJkaXI6CisJaXB1dChvbGRzdWJkaXIpOworZ29fb2ZmbGluZToKKwlzdWJmc19n
b19vZmZsaW5lKHNiLCBtbnQpOworb3V0OgorCUxFQVZFKHNiLCAib2xkZGVudHJ5PSVzIG5ld2Rl
bnRyeT0lcyByYz0lZCIsIG9sZGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG5ld2RlbnRyeS0+ZF9uYW1l
Lm5hbWUsIHJjKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCAKK3N1cGVybW91bnRf
cmVhZGxpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIgLCBpbnQgYnVmbGVu
KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CisJc3RydWN0IGlu
b2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICpzdWJkZW50Owor
CWludCB3cml0ZV9vbiA9IE5FRURfV1JJVEVfQVRJTUUoaW5vZGUpOworCWludCByYzsKKwlzdHJ1
Y3QgdmZzbW91bnQgKm1udDsKKworCUVOVEVSKHNiLCAiZGVudHJ5PSVzIiwgZGVudHJ5LT5kX25h
bWUubmFtZSk7CisKKwltbnQgPSBzdWJmc19nb19vbmxpbmUoc2IpOworCXJjID0gUFRSX0VSUiht
bnQpOworCWlmIChJU19FUlIobW50KSkKKwkJZ290byBvdXQ7CisKKwlzdWJkZW50ID0gZ2V0X3N1
YmZzX2RlbnRyeShkZW50cnkpOworCXJjID0gUFRSX0VSUihzdWJkZW50KTsKKwlpZiAoSVNfRVJS
KHN1YmRlbnQpKQorCQlnb3RvIGdvX29mZmxpbmU7CisKKwlyYyA9IC1FSU5WQUw7CisJaWYgKCFz
dWJkZW50LT5kX2lub2RlLT5pX29wIHx8ICFzdWJkZW50LT5kX2lub2RlLT5pX29wLT5yZWFkbGlu
aykKKwkJZ290byBwdXRfc3ViZGVudDsKKworCXJjID0gc3ViZnNfZ2V0X2FjY2Vzcyhpbm9kZSwg
d3JpdGVfb24pOworCWlmIChyYykKKwkJZ290byBwdXRfc3ViZGVudDsKKworCS8vdXBkYXRlX2F0
aW1lKHN1YmRlbnQtPmRfaW5vZGUpOworCXRvdWNoX2F0aW1lKG1udCxzdWJkZW50KTsKKwlyYyA9
IHN1YmRlbnQtPmRfaW5vZGUtPmlfb3AtPnJlYWRsaW5rKHN1YmRlbnQsIGJ1ZmZlciwgYnVmbGVu
KTsKKwlzdWJmc19wdXRfYWNjZXNzKGlub2RlLCB3cml0ZV9vbik7CisJaW5vZGUtPmlfYXRpbWUg
PSBzdWJkZW50LT5kX2lub2RlLT5pX2F0aW1lOworCitwdXRfc3ViZGVudDoKKwlkcHV0KHN1YmRl
bnQpOworZ29fb2ZmbGluZToKKwlzdWJmc19nb19vZmZsaW5lKHNiLCBtbnQpOworb3V0OgorCUxF
QVZFKHNiLCAiZGVudHJ5PSVzIHJjPSVkIiwgZGVudHJ5LT5kX25hbWUubmFtZSwgcmMpOworCisJ
cmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitzdXBlcm1vdW50X2ZvbGxvd19saW5rKHN0cnVj
dCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHN1cGVy
X2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5
LT5kX2lub2RlOworCXN0cnVjdCBkZW50cnkgKnN1YmRlbnQ7CisJaW50IHdyaXRlX29uID0gTkVF
RF9XUklURV9BVElNRShpbm9kZSk7CisJaW50IHJjOworCXN0cnVjdCB2ZnNtb3VudCAqbW50Owor
CQorCUVOVEVSKHNiLCAiZGVudHJ5PSVzIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwltbnQg
PSBzdWJmc19nb19vbmxpbmUoc2IpOworCXJjID0gUFRSX0VSUihtbnQpOworCWlmIChJU19FUlIo
bW50KSkKKwkJZ290byBvdXQ7CisKKwlzdWJkZW50ID0gZ2V0X3N1YmZzX2RlbnRyeShkZW50cnkp
OworCXJjID0gUFRSX0VSUihzdWJkZW50KTsKKwlpZiAoSVNfRVJSKHN1YmRlbnQpKQorCQlnb3Rv
IGdvX29mZmxpbmU7CisKKwlyYyA9IHN1YmZzX2dldF9hY2Nlc3MoaW5vZGUsIHdyaXRlX29uKTsK
KwlpZiAocmMpCisJCWdvdG8gcHV0X3N1YmRlbnQ7CisKKwkvL3VwZGF0ZV9hdGltZShzdWJkZW50
LT5kX2lub2RlKTsKKwl0b3VjaF9hdGltZShtbnQsc3ViZGVudCk7CisJLyogRklYTUUgZG8gd2Ug
bmVlZCBwcm9wZXIgc3ViZnMgbmQgaGVyZT8gKi8KKwlyYyA9IHN1YmRlbnQtPmRfaW5vZGUtPmlf
b3AtPmZvbGxvd19saW5rKHN1YmRlbnQsIG5kKTsKKwlzdWJmc19wdXRfYWNjZXNzKGlub2RlLCB3
cml0ZV9vbik7CisJaW5vZGUtPmlfYXRpbWUgPSBzdWJkZW50LT5kX2lub2RlLT5pX2F0aW1lOwor
CitwdXRfc3ViZGVudDoKKwlkcHV0KHN1YmRlbnQpOwkKK2dvX29mZmxpbmU6CisJc3ViZnNfZ29f
b2ZmbGluZShzYiwgbW50KTsKK291dDoKKwlMRUFWRShzYiwgImRlbnRyeT0lcyByYz0lZCIsIGRl
bnRyeS0+ZF9uYW1lLm5hbWUsIHJjKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAor
c3VwZXJtb3VudF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1
Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlf
c2I7CisJc3RydWN0IGlub2RlICpzdWJpOworCWludCByYzsKKwlpbnQgd3JpdGVfb24gPSAhSVNf
UkRPTkxZKGlub2RlKSAmJiAobWFzayAmIE1BWV9XUklURSk7CisJc3RydWN0IHZmc21vdW50ICpt
bnQ7CisJaW50IGZha2VfcGVybWlzc2lvbnMgPSAxOworCisJRU5URVIoc2IsICJpbm9kZT0lcCIs
IGlub2RlKTsKKworCW1udCA9IHN1YmZzX2dvX29ubGluZShzYik7CisJcmMgPSBQVFJfRVJSKG1u
dCk7CisJaWYgKElTX0VSUihtbnQpKQorCQlnb3RvIG91dDsKKworCXN1YmkgPSBnZXRfc3ViZnNf
aW5vZGUoaW5vZGUpOworCXJjID0gUFRSX0VSUihzdWJpKTsKKwlpZiAoSVNfRVJSKHN1YmkpKQor
CQlnb3RvIGdvX29mZmxpbmU7CisKKwlyYyA9IHN1YmZzX2dldF9hY2Nlc3MoaW5vZGUsIHdyaXRl
X29uKTsKKwlpZiAocmMpCisJCWdvdG8gcHV0X3N1Ymk7CisKKwlmYWtlX3Blcm1pc3Npb25zID0g
MDsKKwkvKiBGSVhNRSBkbyB3ZSBuZWVkIHByb3BlciBzdWJmcyBuZCBoZXJlICovCisJaWYgKHN1
YmktPmlfb3AgJiYgc3ViaS0+aV9vcC0+cGVybWlzc2lvbikKKwkJcmMgPSBzdWJpLT5pX29wLT5w
ZXJtaXNzaW9uKHN1YmksIG1hc2ssIG5kKTsKKwllbHNlCisJCXJjID0gZ2VuZXJpY19wZXJtaXNz
aW9uKHN1YmksIG1hc2ssIE5VTEwpOworCisJc3ViZnNfcHV0X2FjY2Vzcyhpbm9kZSwgd3JpdGVf
b24pOworCitwdXRfc3ViaToKKwlpcHV0KHN1YmkpOworZ29fb2ZmbGluZToKKwlzdWJmc19nb19v
ZmZsaW5lKHNiLCBtbnQpOworb3V0OgorCWlmIChmYWtlX3Blcm1pc3Npb25zICYmIGlub2RlID09
IHNiLT5zX3Jvb3QtPmRfaW5vZGUpIHsKKwkJLyogY2YuIGZpbGUuYzpzdXBlcm1vdW50X29wZW4o
KSAqLworCQlyYyA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgTlVMTCk7CisJfQor
CisJTEVBVkUoc2IsICJpbm9kZT0lcCByYz0lZCBmYWtlPSVkIiwgaW5vZGUsIHJjLCBmYWtlX3Bl
cm1pc3Npb25zKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorc3VwZXJtb3VudF9z
ZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQoreworCXN0
cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CisJc3RydWN0IGlub2RlICpzdWJp
OworCXN0cnVjdCBkZW50cnkgKnN1YmRlbnQ7CisJaW50IHJjOworCXN0cnVjdCB2ZnNtb3VudCAq
bW50OworCisJRU5URVIoc2IsICJkZW50cnk9JXMiLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwor
CW1udCA9IHN1YmZzX2dvX29ubGluZShzYik7CisJcmMgPSBQVFJfRVJSKG1udCk7CisJaWYgKElT
X0VSUihtbnQpKQorCQlnb3RvIG91dDsKKworCXN1YmRlbnQgPSBnZXRfc3ViZnNfZGVudHJ5KGRl
bnRyeSk7CisJcmMgPSBQVFJfRVJSKHN1YmRlbnQpOworCWlmIChJU19FUlIoc3ViZGVudCkpCisJ
CWdvdG8gZ29fb2ZmbGluZTsKKworCXJjID0gc3ViZnNfZ2V0X2FjY2VzcyhkZW50cnktPmRfaW5v
ZGUsIDEpOworCWlmIChyYykKKwkJZ290byBwdXRfc3ViZGVudDsKKworCXN1YmkgPSBzdWJkZW50
LT5kX2lub2RlOworCWlmIChzdWJpLT5pX29wICYmIHN1YmktPmlfb3AtPnNldGF0dHIpCisJCXJj
ID0gc3ViaS0+aV9vcC0+c2V0YXR0cihzdWJkZW50LCBhdHRyKTsKKwllbHNlIHsKKwkJcmMgPSBp
bm9kZV9jaGFuZ2Vfb2soc3ViaSwgYXR0cik7CisJCS8qCisJCSAqIEZJWE1FCisJCSAqIFdoYXQg
dG8gZG8gd2l0aCBxdW90YT8KKwkJICovCisJCWlmICghcmMpCisJCQlyYyA9IGlub2RlX3NldGF0
dHIoc3ViaSwgYXR0cik7CisJfQorCXN1YmZzX3B1dF9hY2Nlc3MoZGVudHJ5LT5kX2lub2RlLCAx
KTsKKwlpZiAocmMpCisJCWdvdG8gcHV0X3N1YmRlbnQ7CisKKwkvKiAKKwkgKiBJZiBpdCB3b3Jr
ZWQsIHRoZW4gd2UgbmVlZCB0byBtYXJrIHRoZSBtb2RpZmljYXRpb24KKwkgKiB0byB0aGUgc3Vi
ZnMsIGFuZCB3ZSBhbHNvIG5lZWQgdG8gcHJvcG9nYXRlIHRoZQorCSAqIGNoYW5nZSB1cCB0byB0
aGUgc2hhZG93aW5nIGlub2RlLiAgCisJICovCisJYXR0ci0+aWFfbW9kZSA9IHN1YmktPmlfbW9k
ZTsKKwlhdHRyLT5pYV91aWQgPSBzdWJpLT5pX3VpZDsKKwlhdHRyLT5pYV9naWQgPSBzdWJpLT5p
X2dpZDsKKwlhdHRyLT5pYV9zaXplID0gc3ViaS0+aV9zaXplOworCWF0dHItPmlhX2F0aW1lID0g
c3ViaS0+aV9hdGltZTsKKwlhdHRyLT5pYV9tdGltZSA9IHN1YmktPmlfbXRpbWU7CisJYXR0ci0+
aWFfY3RpbWUgPSBzdWJpLT5pX2N0aW1lOworCWF0dHItPmlhX3ZhbGlkID0KKwkgICAgQVRUUl9V
SUQgfCBBVFRSX0dJRCB8IEFUVFJfTU9ERSB8IEFUVFJfU0laRSB8CisJICAgIEFUVFJfQVRJTUUg
fCBBVFRSX01USU1FIHwgQVRUUl9DVElNRTsKKwlpbm9kZV9zZXRhdHRyKGRlbnRyeS0+ZF9pbm9k
ZSwgYXR0cik7CisKK3B1dF9zdWJkZW50OgorCWRwdXQoc3ViZGVudCk7Citnb19vZmZsaW5lOgor
CXN1YmZzX2dvX29mZmxpbmUoc2IsIG1udCk7CitvdXQ6CisJTEVBVkUoc2IsICJkZW50cnk9JXMg
cmM9JWQiLCBkZW50cnktPmRfbmFtZS5uYW1lLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0
YXRpYyBpbnQKK3N1cGVybW91bnRfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0
IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RydWN0IHN1cGVyX2Js
b2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3QgdmZzbW91bnQgKnN1Ym1udDsKKyAgICAg
ICAgc3RydWN0IGRlbnRyeSAqc3ViZGVudCA9IDA7CisgICAgICAgIGludCByYzsKKworCUVOVEVS
KHNiLCAiZGVudHJ5PSVzIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkvKgorCSAqIGRvIG5v
dCB1c2Ugc3ViZnNfZ29fb25saW5lIC0gaXQgd2lsbCByZXN1bHQgaW4gbHMgL21udAorCSAqIGF0
dGVtcHRpbmcgdG8gbW91bnQgYWxsIHN1cGVybW91bnRlZCBkaXJlY3RvcmllcworCSAqLworCXN1
Ym1udCA9IHN1YmZzX3ByZXZlbnRfdW1vdW50KHNiKTsKKwlpZiAoc3VibW50KQorCQlzdWJkZW50
ID0gZ2V0X3N1YmZzX2RlbnRyeShkZW50cnkpOworCisJLyoKKwkgKiBkbyBub3QgZmFpbCBzdGF0
IGZvciBzdGFsZSBmaWxlcyAtIGl0IGlzIG5lZWRlZCB0bworCSAqIG1ha2Ugc3VyZSBmdXNlciAt
bSAvbW50L2Nkcm9tIGxpc3RzIGFsbCBwcm9jZXNzZXMgc3RpbGwKKwkgKiBoYXZpbmcgYW55IChv
YnNvbGV0ZSkgZmlsZSBvcGVuCisJICovCisgICAgICAgIGlmIChzdWJtbnQgJiYgc3ViZGVudCAm
JiAhSVNfRVJSKHN1YmRlbnQpKSB7CisgICAgICAgICAgICAgICAgcmMgPSB2ZnNfZ2V0YXR0cihz
dWJtbnQsIHN1YmRlbnQsIHN0YXQpOworCQlzdGF0LT5kZXYgPSBzYi0+c19kZXY7CisJfSBlbHNl
IHsKKwkJc3ViZnNfbG9jayhzYik7CisJCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2Rl
LCBzdGF0KTsKKwkJc3ViZnNfdW5sb2NrKHNiKTsKKwkJcmMgPSAwOworCX0KKworCWlmIChzdWJk
ZW50ICYmICFJU19FUlIoc3ViZGVudCkpCisJCWRwdXQoc3ViZGVudCk7CisJaWYgKHN1Ym1udCkK
KwkJc3ViZnNfYWxsb3dfdW1vdW50KHNiLCBzdWJtbnQpOworCisJTEVBVkUoc2IsICJkZW50cnk9
JXMgcmM9JWQiLCBkZW50cnktPmRfbmFtZS5uYW1lLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisK
Ky8qCisgKiBkaXJlY3RvcmllcyBjYW4gaGFuZGxlIG1vc3Qgb3BlcmF0aW9ucy4uLiAgc3VwZXJt
b3VudC9uYW1laS5jIGp1c3QKKyAqIHBhc3NlcyB0aGVtIHRocm91Z2ggdG8gdGhlIHVuZGVybHlp
bmcgc3ViZnMsIGV4Y2VwdCBmb3IgbG9va3VwKCkuCisgKi8KKworLyogdHJ1bmNhdGU6IGlzIG5v
dCBuZWNlc2FyeSwgaGFuZGxlZCB3aXRoIHNldGF0dHIKKyAqIHJldmFsaWRhdGU6IG9ubHkgbmVl
ZGVkIGJ5IG5mcworICogLT5nZXRhdHRyOglGSVhNRSBpcyBub3QgYXBwZWFyZWQgdG8gYmUgdXNl
ZCBhbnl3aGVyZSBpbiBrZXJuZWw7IHNvIEkgYW0KKyAqICAJCW5vdCBzdXJlIGhvdyB0byBpbXBs
ZW1lbnQgaXQgb3Igd2hhdCB0byByZXR1cm4KKyAqIEZJWE1FOiBpbXBsZW1lbnQgYWNjbCBmdW5j
dGlvbnMKKyAqLworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzdXBlcm1vdW50X2Rpcl9pb3Bz
ID0geworCS5jcmVhdGUJCT0gc3VwZXJtb3VudF9jcmVhdGUsCisJLmxvb2t1cAkJPSBzdXBlcm1v
dW50X2xvb2t1cCwKKwkubGluawkJPSBzdXBlcm1vdW50X2xpbmssCisJLnVubGluawkJPSBzdXBl
cm1vdW50X3VubGluaywKKwkuc3ltbGluawk9IHN1cGVybW91bnRfc3ltbGluaywKKwkubWtkaXIJ
CT0gc3VwZXJtb3VudF9ta2RpciwKKwkucm1kaXIJCT0gc3VwZXJtb3VudF9ybWRpciwKKwkubWtu
b2QJCT0gc3VwZXJtb3VudF9ta25vZCwKKwkucmVuYW1lCQk9IHN1cGVybW91bnRfcmVuYW1lLAor
CS5wZXJtaXNzaW9uCT0gc3VwZXJtb3VudF9wZXJtaXNzaW9uLAorCS5zZXRhdHRyCT0gc3VwZXJt
b3VudF9zZXRhdHRyLAorCS5nZXRhdHRyCT0gc3VwZXJtb3VudF9nZXRhdHRyLAorfTsKKworc3Ry
dWN0IGlub2RlX29wZXJhdGlvbnMgc3VwZXJtb3VudF9zeW1saW5rX2lvcHMgPSB7CisJLnJlYWRs
aW5rCT0gc3VwZXJtb3VudF9yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBzdXBlcm1vdW50X2Zv
bGxvd19saW5rLAorCS5zZXRhdHRyCT0gc3VwZXJtb3VudF9zZXRhdHRyLAorCS5nZXRhdHRyCT0g
c3VwZXJtb3VudF9nZXRhdHRyLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3VwZXJt
b3VudF9maWxlX2lvcHMgPSB7CisJLnNldGF0dHIJPSBzdXBlcm1vdW50X3NldGF0dHIsCisJLmdl
dGF0dHIJPSBzdXBlcm1vdW50X2dldGF0dHIsCit9OwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQu
b3JpZy9mcy9zdXBlcm1vdW50L3Byb2MuYyBsaW51eC0yLjYuMjUuNC9mcy9zdXBlcm1vdW50L3By
b2MuYwotLS0gbGludXgtMi42LjI1LjQub3JpZy9mcy9zdXBlcm1vdW50L3Byb2MuYwkxOTcwLTAx
LTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUuNC9mcy9zdXBlcm1vdW50L3Byb2Mu
YwkyMDA4LTA1LTIwIDAxOjI3OjUzICswMzAwCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogIGxp
bnV4L2ZzL3N1cGVybW91bnQvcHJvYy5jCisgKgorICogIEluaXRpYWwgdmVyc2lvbiBmb3Iga2Vy
bmVsIDIuNC4yMSAoQykgMjAwMyBBbmRyZXkgQm9yemVua292CisgKiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcnZpZGphYXJAbWFpbC5ydSkKKyAqICBSZXdy
aXR0ZW4gZm9yIGtlcm5lbCAyLjUuNzAgKEMpIDIwMDMgQW5kcmV5IEJvcnplbmtvdgorICogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJ2aWRqYWFyQG1haWwucnUpCisg
KgorICogICRJZDogcHJvYy5jLHYgMS43LjQuNCAyMDAzLzEwLzI2IDE2OjIxOjI1IGJvciBFeHAg
JAorICovCisKKyNpbmNsdWRlICJzdXBlcm1vdW50LmgiCisKKyNpZmRlZiBDT05GSUdfUFJPQ19G
UworCisvKgorICogd2UgdXNlIHNlbWFwaG9yZSBiZWNhdXNlIHdlIGhhdmUgdG8gbG9jayBzdWJm
cyBpbnNpZGUgYW5kIGl0IGNhbgorICogc2xlZXAuIFVubG9ja2luZyBwcm9jZnMgbGlzdCB3b3Vs
ZCBtZWFuIGFkZGluZyBnZW5lcmljIHVzYWdlIGNvdW50CisgKiBtYW5hZ2VtZW50IHRvIHNiaSBh
bmQgdGhpcyBpcyBmYXIgdG9vIGZldGNoaW5nCisgKi8KKworc3RhdGljIERFQ0xBUkVfTVVURVgo
c3VwZXJtb3VudF9wcm9jX3NlbSk7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpzdXBl
cm1vdW50X3Byb2Nfcm9vdDsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnN1cGVybW91
bnRfcHJvY19zdWJmczsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnN1cGVybW91bnRf
cHJvY192ZXJzaW9uOworc3RhdGljIHN0cnVjdCBzdXBlcm1vdW50X3NiX2luZm8gKnN1cGVybW91
bnRfbGlzdF9oZWFkOworCisjZGVmaW5lIFNLSVBfQkxBTktTKHMpCXdoaWxlKCpzID09ICcgJyB8
fCAqcyA9PSAnXHQnIHx8ICpzID09ICdcbicpIHMrKworI2RlZmluZSBDSEVDS19DT1VOVCBkbyB7
IFwKKwlzaXplICs9IG47IFwKKwljb3VudCAtPSBuOyBcCisJaWYgKGNvdW50IDw9IDApIHsgXAor
CQlzdWJmc191bmxvY2soc2JpLT5ob3N0KTsgXAorCQlicmVhazsgXAorCX0gXAorfSB3aGlsZSAo
MCkKKworLyogaXRlcmF0b3I7IHNoYW1lbGVzc2x5IGNvcGllZCBvdmVyIGZyb20gcGNpLmMgKi8K
K3N0YXRpYyB2b2lkICpzdXBlcm1vdW50X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLCBs
b2ZmX3QgKnBvcykKK3sKKyAgICAgICAgc3RydWN0IHN1cGVybW91bnRfc2JfaW5mbyAqc2JpOwor
ICAgICAgICBsb2ZmX3QgbiA9ICpwb3M7CisKKwlkb3duKCZzdXBlcm1vdW50X3Byb2Nfc2VtKTsK
KworICAgICAgICBzYmkgPSBzdXBlcm1vdW50X2xpc3RfaGVhZDsKKyAgICAgICAgd2hpbGUgKG4t
LSAmJiBzYmkpCisgICAgICAgICAgICAgICAgc2JpID0gc2JpLT5uZXh0OworCisgICAgICAgIHJl
dHVybiBzYmk7Cit9CisKK3N0YXRpYyB2b2lkICpzdXBlcm1vdW50X3NlcV9uZXh0KHN0cnVjdCBz
ZXFfZmlsZSAqc2YsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworICAgICAgICBzdHJ1Y3Qgc3Vw
ZXJtb3VudF9zYl9pbmZvICpzYmkgPSB2OworICAgICAgICAoKnBvcykrKzsKKyAgICAgICAgcmV0
dXJuIHNiaS0+bmV4dDsKK30KKworc3RhdGljIHZvaWQgc3VwZXJtb3VudF9zZXFfc3RvcChzdHJ1
Y3Qgc2VxX2ZpbGUgKnNmLCB2b2lkICp2KQoreworCXVwKCZzdXBlcm1vdW50X3Byb2Nfc2VtKTsK
K30KKworCitzdGF0aWMgaW50CitzdXBlcm1vdW50X3Nob3dfc2JpKHN0cnVjdCBzZXFfZmlsZSAq
c2YsIHZvaWQgKnYpCit7CisJc3RydWN0IHN1cGVybW91bnRfc2JfaW5mbyAqc2JpID0gdjsKKwor
CisJc3ViZnNfbG9jayhzYmktPmhvc3QpOworCXNlcV9wdXRzKHNmLCBzYmktPmRldm5hbWUpOwor
CWlmIChzYmktPmRpc2FibGVkKQorCQlzZXFfcHV0cyhzZiwgIiBkaXNhYmxlZFxuIik7CisJZWxz
ZSBpZiAoc3ViZnNfaXNfbW91bnRlZChzYmktPmhvc3QpKQorCQlzZXFfcHJpbnRmKHNmLCAiIG1v
dW50ZWQgJWQgJWRcbiIsCisJCQkJc2JpLT5yZWFkY291bnQsIHNiaS0+d3JpdGVjb3VudCk7CisJ
ZWxzZQorCQlzZXFfcHV0cyhzZiwgIiB1bm1vdW50ZWRcbiIpOworCXN1YmZzX3VubG9jayhzYmkt
Pmhvc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMg
c3VwZXJtb3VudF9wcm9jX3N1YmZzX29wID0geworICAgICAgICBzdGFydDogIHN1cGVybW91bnRf
c2VxX3N0YXJ0LAorICAgICAgICBuZXh0OiAgIHN1cGVybW91bnRfc2VxX25leHQsCisgICAgICAg
IHN0b3A6ICAgc3VwZXJtb3VudF9zZXFfc3RvcCwKKyAgICAgICAgc2hvdzogICBzdXBlcm1vdW50
X3Nob3dfc2JpCit9OworCitzdGF0aWMgaW50IHN1cGVybW91bnRfcHJvY19zdWJmc19vcGVuKHN0
cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgICAgICByZXR1cm4g
c2VxX29wZW4oZmlsZSwgJnN1cGVybW91bnRfcHJvY19zdWJmc19vcCk7Cit9CisKKy8qCisgKiBt
b3N0bHkgY29waWVkIG92ZXIgZnJvbSBkcml2ZXJzL3Njc2kvc2NzaS5jOnByb2Nfc2NzaV9nZW5f
d3JpdGUoKQorICovCitzdGF0aWMgaW50CitzdXBlcm1vdW50X3Byb2Nfc3ViZnNfd3JpdGUoc3Ry
dWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbmd0aCwgbG9mZl90ICpv
ZmZzZXQpCit7CisJY2hhciAqYnVmZmVyLCAqcywgKmRldiA9IDA7CisJaW50IGRpc2FibGUgPSAw
LCBlbmFibGUgPSAwLCByZWxlYXNlID0gMCwgZm9yY2UgPSAwOworCXN0cnVjdCBzdXBlcm1vdW50
X3NiX2luZm8gKnNiaTsKKwlzaXplX3QgcmM7CisKKwlyYyA9IC1FSU5WQUw7CisJaWYgKCFidWYg
fHwgbGVuZ3RoID4gUEFHRV9TSVpFKQorCQlnb3RvIG91dDsKKworCXJjID0gLUVOT01FTTsKKwlp
ZiAoIShzID0gYnVmZmVyID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQor
CQlnb3RvIG91dDsKKworCXJjID0tRUZBVUxUOworCWlmKGNvcHlfZnJvbV91c2VyKGJ1ZmZlciwg
YnVmLCBsZW5ndGgpKQorCQlnb3RvIGZyZWVfYnVmZmVyOworCisJcmMgPSAtRUlOVkFMOworCWlm
IChsZW5ndGggPCBQQUdFX1NJWkUpCisJCWJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsKKwllbHNlIGlm
IChidWZmZXJbUEFHRV9TSVpFLTFdKQorCQlnb3RvIGZyZWVfYnVmZmVyOworCisJLyoKKwkgKiBl
Y2hvICIvZGV2L2Nkcm9tIFtlbmFibGV8ZGlzYWJsZV0gW3JlbGVhc2UgW2ZvcmNlXV0iID4gXAor
CSAqIAkJCQkvcHJvYy9mcy9zdXBlcm1vdW50L3N1YmZzCisJICovCisKKwlkbyB7CisJCWNoYXIg
KnA7CisKKwkJU0tJUF9CTEFOS1Mocyk7CisJCXAgPSBzdHJwYnJrKHMsICIgXHRcbiIpOworCQlp
ZiAocCkKKwkJCSpwKysgPSAnXDAnOworCQlpZiAoIWRldikKKwkJCWRldiA9IHM7CisJCWVsc2Ug
aWYgKCFzdHJjbXAocywgImRpc2FibGUiKSkKKwkJCWRpc2FibGUgPSAxOworCQllbHNlIGlmICgh
c3RyY21wKHMsICJlbmFibGUiKSkKKwkJCWVuYWJsZSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAo
cywgInJlbGVhc2UiKSkKKwkJCXJlbGVhc2UgPSAxOworCQllbHNlIGlmICghc3RyY21wKHMsICJm
b3JjZSIpKQorCQkJZm9yY2UgPSAxOworCQllbHNlCisJCQlnb3RvIGZyZWVfYnVmZmVyOworCisJ
CXMgPSBwOworCX0gd2hpbGUgKHMgJiYgKnMpOworCisJaWYgKChlbmFibGUgJiYgZGlzYWJsZSkg
fHwgKGZvcmNlICYmICFyZWxlYXNlKSkKKwkJZ290byBmcmVlX2J1ZmZlcjsKKworCWRvd24oJnN1
cGVybW91bnRfcHJvY19zZW0pOworCWZvcihzYmkgPSBzdXBlcm1vdW50X2xpc3RfaGVhZDsgc2Jp
OyBzYmkgPSBzYmktPm5leHQpIHsKKwkJaWYgKHN0cmNtcChzYmktPmRldm5hbWUsIGRldikpCisJ
CQljb250aW51ZTsKKworCQlzdWJmc19sb2NrKHNiaS0+aG9zdCk7CisKKwkJcmMgPSBsZW5ndGg7
CisJCWlmIChyZWxlYXNlICYmIHN1YmZzX2lzX21vdW50ZWQoc2JpLT5ob3N0KSkgeworCQkJaWYg
KCFzdWJmc19pc19idXN5KHNiaS0+aG9zdCkgfHwgZm9yY2UpCisJCQkJc3ViZnNfdW1vdW50KHNi
aS0+aG9zdCwgU1VCRlNfVU1OVF9VU0VSKTsKKwkJCWVsc2UKKwkJCQlyYyA9IC1FQlVTWTsKKwkJ
fQorCQkKKwkJaWYgKGRpc2FibGUgJiYgc3ViZnNfaXNfbW91bnRlZChzYmktPmhvc3QpKQorCQkJ
cmMgPSAtRUJVU1k7CisKKwkJaWYgKHJjID49IDApIHsKKwkJCWlmIChkaXNhYmxlKQorCQkJCXNi
aS0+ZGlzYWJsZWQgPSAxOworCQkJZWxzZSBpZiAoZW5hYmxlKQorCQkJCXNiaS0+ZGlzYWJsZWQg
PSAwOworCQl9CisKKwkJc3ViZnNfdW5sb2NrKHNiaS0+aG9zdCk7CisJCWJyZWFrOworCX0KKwl1
cCgmc3VwZXJtb3VudF9wcm9jX3NlbSk7CisKK2ZyZWVfYnVmZmVyOgorCWZyZWVfcGFnZSgodW5z
aWduZWQgbG9uZylidWZmZXIpOworb3V0OgorCXJldHVybiByYzsKKworfQorCitzdGF0aWMgc3Ry
dWN0IGZpbGVfb3BlcmF0aW9ucyBzdXBlcm1vdW50X3Byb2Nfc3ViZnNfb3BlcmF0aW9ucyA9IHsK
KyAgICAgICAgb3BlbjogICAgICAgICAgIHN1cGVybW91bnRfcHJvY19zdWJmc19vcGVuLAorICAg
ICAgICByZWFkOiAgICAgICAgICAgc2VxX3JlYWQsCisgICAgICAgIGxsc2VlazogICAgICAgICBz
ZXFfbHNlZWssCisgICAgICAgIHJlbGVhc2U6ICAgICAgICBzZXFfcmVsZWFzZSwKKwl3cml0ZToJ
CXN1cGVybW91bnRfcHJvY19zdWJmc193cml0ZSwKK307CisKK3N0YXRpYyBpbnQKK3N1cGVybW91
bnRfcHJvY192ZXJzaW9uX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBwb3Ms
IGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IHJjOworCisJcmMgPSBz
bnByaW50ZihwYWdlLCBjb3VudCwgIlN1cGVybW91bnQgdmVyc2lvbiAlcyBmb3Iga2VybmVsIDIu
NlxuIiwKKwkJCQkgICAgU1VQRVJNT1VOVF9WRVJTSU9OKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4g
cmM7Cit9CisKK3ZvaWQKK3N1cGVybW91bnRfcHJvY19yZWdpc3Rlcih2b2lkKQoreworCXN1cGVy
bW91bnRfcHJvY19yb290ID0gcHJvY19ta2RpcigiZnMvc3VwZXJtb3VudCIsIDApOworCWlmICgh
c3VwZXJtb3VudF9wcm9jX3Jvb3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVVBFUk1PVU5UIGZh
aWxlZCB0byBjcmVhdGUgL3Byb2MvZnMvc3VwZXJtb3VudCIpOworCQlyZXR1cm47CisJfQorCXN1
cGVybW91bnRfcHJvY19yb290LT5vd25lciA9IFRISVNfTU9EVUxFOworCisJc3VwZXJtb3VudF9w
cm9jX3ZlcnNpb24gPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJ2ZXJzaW9uIiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTX0lGUkVHIHwgU19JUlVHTywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcm1vdW50X3Byb2Nfcm9vdCwK
KwkJCQkJc3VwZXJtb3VudF9wcm9jX3ZlcnNpb25fcmVhZCwKKwkJCQkJMCk7CisKKwlpZiAoc3Vw
ZXJtb3VudF9wcm9jX3ZlcnNpb24pCisJCXN1cGVybW91bnRfcHJvY192ZXJzaW9uLT5vd25lciA9
IFRISVNfTU9EVUxFOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSJTVVBFUk1PVU5UIGZh
aWxlZCB0byBjcmVhdGUgL3Byb2MvZnMvc3VwZXJtb3VudC92ZXJzaW9uIik7CisKKwlzdXBlcm1v
dW50X3Byb2Nfc3ViZnMgPSBjcmVhdGVfcHJvY19lbnRyeSgic3ViZnMiLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcm1vdW50X3Byb2Nf
cm9vdCk7CisKKwlpZiAoc3VwZXJtb3VudF9wcm9jX3N1YmZzKSB7CisJCXN1cGVybW91bnRfcHJv
Y19zdWJmcy0+cHJvY19mb3BzID0KKwkJCSZzdXBlcm1vdW50X3Byb2Nfc3ViZnNfb3BlcmF0aW9u
czsKKwkJc3VwZXJtb3VudF9wcm9jX3N1YmZzLT5vd25lciA9IFRISVNfTU9EVUxFOworCX0gZWxz
ZQorCQlwcmludGsoS0VSTl9FUlIKKwkJIlNVUEVSTU9VTlQgZmFpbGVkIHRvIGNyZWF0ZSAvcHJv
Yy9mcy9zdXBlcm1vdW50L3N1YmZzIik7CisKK30KKwordm9pZAorc3VwZXJtb3VudF9wcm9jX3Vu
cmVnaXN0ZXIodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiZnMvc3VwZXJtb3VudC9zdWJm
cyIsIDApOworCXJlbW92ZV9wcm9jX2VudHJ5KCJmcy9zdXBlcm1vdW50L3ZlcnNpb24iLCAwKTsK
KwlyZW1vdmVfcHJvY19lbnRyeSgiZnMvc3VwZXJtb3VudCIsIDApOworfQorCit2b2lkCitzdXBl
cm1vdW50X3Byb2NfaW5zZXJ0KHN0cnVjdCBzdXBlcm1vdW50X3NiX2luZm8gKnNiaSkKK3sKKwor
CWRvd24oJnN1cGVybW91bnRfcHJvY19zZW0pOworCisJc2JpLT5uZXh0ID0gc3VwZXJtb3VudF9s
aXN0X2hlYWQ7CisJc3VwZXJtb3VudF9saXN0X2hlYWQgPSBzYmk7CisKKwl1cCgmc3VwZXJtb3Vu
dF9wcm9jX3NlbSk7Cit9CisKK3ZvaWQKK3N1cGVybW91bnRfcHJvY19yZW1vdmUoc3RydWN0IHN1
cGVybW91bnRfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCBzdXBlcm1vdW50X3NiX2luZm8gKipw
LCAqcTsKKworCWRvd24oJnN1cGVybW91bnRfcHJvY19zZW0pOworCisJZm9yKHAgPSAmc3VwZXJt
b3VudF9saXN0X2hlYWQsIHEgPSBzdXBlcm1vdW50X2xpc3RfaGVhZDsKKwkJCXE7IHAgPSAmcS0+
bmV4dCwgcSA9IHEtPm5leHQpCisJCWlmIChxID09IHNiaSkKKwkJCWJyZWFrOworCisJaWYgKHEp
CisJCSpwID0gcS0+bmV4dDsKKworCXVwKCZzdXBlcm1vdW50X3Byb2Nfc2VtKTsKKworCVNVUEVS
TU9VTlRfQlVHX09OKCFxKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwpkaWZmIC11
ck4gbGludXgtMi42LjI1LjQub3JpZy9mcy9zdXBlcm1vdW50L3N1YmZzLmMgbGludXgtMi42LjI1
LjQvZnMvc3VwZXJtb3VudC9zdWJmcy5jCi0tLSBsaW51eC0yLjYuMjUuNC5vcmlnL2ZzL3N1cGVy
bW91bnQvc3ViZnMuYwkxOTcwLTAxLTAxIDAzOjAwOjAwICswMzAwCisrKyBsaW51eC0yLjYuMjUu
NC9mcy9zdXBlcm1vdW50L3N1YmZzLmMJMjAwOC0wNS0yMCAwMToyNzo1MyArMDMwMApAQCAtMCww
ICsxLDc0MiBAQAorLyoKKyAqICBsaW51eC9mcy9zdXBlcm1vdW50L3N1YmZzLmMKKyAqCisgKiAg
T3JpZ2luYWwgdmVyc2lvbjoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3CisgKiAg
ICAgIFN0ZXBoZW4gVHdlZWRpZSAoc2N0QGRjcy5lZC5hYy51aykKKyAqCisgKiAgICAgIGZyb20K
KyAqCisgKiAgICAgIGxpbnV4L2ZzL21pbml4L2lub2RlLmMKKyAqICAgICAgQ29weXJpZ2h0IChD
KSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICAgICAgYW5kCisgKgorICogICAg
ICBsaW51eC9mcy9leHQyL3N1cGVyLmMKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkz
LCAxOTk0LCAxOTk1ICBSZW15IENhcmQKKyAqCisgKiAgUmV3cml0ZW4gZm9yIGtlcm5lbCAyLjIs
IDIuNC4gKEMpIDE5OTksIDIwMDAgQWxleGlzIE1pa2hhaWxvdgorICogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoYWxleGlzQGFiYy5jYXAucnUpCisgKiAgUmV3cml0dGVuIGZv
ciBrZXJuZWwgMi40LjIxIChDKSAyMDAzIEFuZHJleSBCb3J6ZW5rb3YKKyAqICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFydmlkamFhckBtYWlsLnJ1KQorICogIFJld3Jp
dHRlbiBmb3Iga2VybmVsIDIuNS43MCAoQykgMjAwMyBBbmRyZXkgQm9yemVua292CisgKiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcnZpZGphYXJAbWFpbC5ydSkKKyAq
CisgKiAgJElkOiBzdWJmcy5jLHYgMS4yOS4yLjExIDIwMDQvMDEvMTQgMTk6MjQ6MTAgYm9yIEV4
cCAkCisgKi8KKworI2RlZmluZSBTX0RCR19UUkFDRV9DVVJSRU5UIFNfREJHX1RSQUNFX1NVQkZT
CisjaW5jbHVkZSAic3VwZXJtb3VudC5oIgorCisvKgorICogY2xvc2UgYWxsIG9wZW4gZmlsZXMg
b24gc3ViZnMKKyAqLworc3RhdGljIHZvaWQKK3N1cGVybW91bnRfY2xlYW5fZmlsZXMoc3RydWN0
IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3VwZXJtb3VudF9zYl9pbmZvICpzYmkgPSBz
dXBlcm1vdW50X3NiaShzYik7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKKworCUVOVEVS
KHNiKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG4sICZzYmktPnNfZmlsZXMpIHsKKwkJ
c3RydWN0IHN1cGVybW91bnRfZmlsZV9pbmZvICpzZmk7CisJCXN0cnVjdCBmaWxlICpzdWJmaWxl
OworCisJCXNmaSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3Qgc3VwZXJtb3VudF9maWxlX2luZm8s
IGxpc3QpOworCisJCXN1YmZpbGUgPSBzZmktPmZpbGU7CisJCXNmaS0+ZmlsZSA9IDA7CisJCWxp
c3RfZGVsX2luaXQoJnNmaS0+bGlzdCk7CisKKwkJU1VQRVJNT1VOVF9CVUdfTE9DS0VEX09OKHNi
LCAhc3ViZmlsZSk7CisKKwkJZnB1dChzdWJmaWxlKTsKKwl9CisKKwlMRUFWRShzYik7CisKK30K
KworLyoKKyAqIGNsb3NlIGFsbCBvcGVuIGRlbnRyaWVzIG9uIHN1YmZzCisgKi8KK3N0YXRpYyB2
b2lkCitzdXBlcm1vdW50X2NsZWFuX2RlbnRyaWVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7
CisJc3RydWN0IHN1cGVybW91bnRfc2JfaW5mbyAqc2JpID0gc3VwZXJtb3VudF9zYmkoc2IpOwor
CXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisKKwlFTlRFUihzYik7CisKKwlsaXN0X2Zvcl9l
YWNoX3NhZmUocHRyLCBuLCAmc2JpLT5zX2RlbnRyaWVzKSB7CisJCXN0cnVjdCBzdXBlcm1vdW50
X2RlbnRyeV9pbmZvICpzZGk7CisJCXN0cnVjdCBkZW50cnkgKnN1YmRlbnQ7CisKKwkJc2RpID0g
bGlzdF9lbnRyeShwdHIsIHN0cnVjdCBzdXBlcm1vdW50X2RlbnRyeV9pbmZvLCBsaXN0KTsKKwkJ
LyoKKwkJICogSEFDSyAtIEZJWE1FCisJCSAqIHNlZSBkZW50cnkuYzpzdXBlcm1vdW50X2RfY29t
cGFyZQorCQkgKi8KKwkJd3JpdGVfbG9jaygmZF9jb21wYXJlX2xvY2spOworCQlzdWJkZW50ID0g
c2RpLT5kZW50cnk7CisJCXNkaS0+ZGVudHJ5ID0gMDsKKwkJd3JpdGVfdW5sb2NrKCZkX2NvbXBh
cmVfbG9jayk7CisKKwkJbGlzdF9kZWxfaW5pdCgmc2RpLT5saXN0KTsKKwkJZF9kcm9wKHNkaS0+
aG9zdCk7CisJCWRub3RpZnlfcGFyZW50KHNkaS0+aG9zdCwgRE5fREVMRVRFKTsKKworCQlTVVBF
Uk1PVU5UX0JVR19MT0NLRURfT04oc2IsICFzdWJkZW50KTsKKworCQlkcHV0KHN1YmRlbnQpOwor
CX0KKworCUxFQVZFKHNiKTsKKworfQorCisvKgorICogY2xvc2UgYWxsIG9wZW4gaW5vZGVzIG9u
IHN1YmZzCisgKi8KK3N0YXRpYyB2b2lkCitzdXBlcm1vdW50X2NsZWFuX2lub2RlcyhzdHJ1Y3Qg
c3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBzdXBlcm1vdW50X3NiX2luZm8gKnNiaSA9IHN1
cGVybW91bnRfc2JpKHNiKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuOworCisJRU5URVIo
c2IpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbiwgJnNiaS0+c19pbm9kZXMpIHsKKwkJ
c3RydWN0IHN1cGVybW91bnRfaW5vZGVfaW5mbyAqc2lpOworCQlzdHJ1Y3QgaW5vZGUgKmhvc3Q7
CisJCXN0cnVjdCBpbm9kZSAqc3ViaTsKKworCQlzaWkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0
IHN1cGVybW91bnRfaW5vZGVfaW5mbywgbGlzdCk7CisJCWhvc3QgPSAmc2lpLT52ZnNfaW5vZGU7
CisKKwkJc3ViaSA9IHNpaS0+aW5vZGU7CisJCXNpaS0+aW5vZGUgPSBOVUxMOworCQlsaXN0X2Rl
bF9pbml0KCZzaWktPmxpc3QpOworCQlyZW1vdmVfaW5vZGVfaGFzaChob3N0KTsKKwkJaG9zdC0+
aV9tYXBwaW5nID0gJmhvc3QtPmlfZGF0YTsKKworCQkvKgorCQkgKiBpdCBpcyBwb3NzaWJsZSB0
byBoYXZlIG5vIHN1YmkgaGVyZS4gY2xlYXJfaW5vZGUgZG9lcworCQkgKiByZWxlYXNlIGxvY2sg
YWZ0ZXIgcmVtb3Zpbmcgc3ViaSBidXQgYmVmb3JlIHVubGlua2luZworCQkgKiBpdAorCQkgKi8K
KwkJaWYgKHN1YmkpCisJCQlpcHV0KHN1YmkpOworCisJCVNVUEVSTU9VTlRfQlVHX0xPQ0tFRF9P
TihzYiwgc2lpLT53cml0ZWNvdW50IDwgMCk7CisJCVNVUEVSTU9VTlRfQlVHX0xPQ0tFRF9PTihz
Yiwgc2lpLT5yZWFkY291bnQgPCAwKTsKKwkJd2hpbGUgKHNpaS0+d3JpdGVjb3VudCkgeworCQkJ
c2lpLT53cml0ZWNvdW50LS07CisJCQlzYmktPndyaXRlY291bnQtLTsKKwkJfQorCQl3aGlsZSAo
c2lpLT5yZWFkY291bnQpIHsKKwkJCXNpaS0+cmVhZGNvdW50LS07CisJCQlzYmktPnJlYWRjb3Vu
dC0tOworCQl9CisJfQorCisJTEVBVkUoc2IpOworfQorCisvKgorICogcmVhc29uIGNhbiBiZQor
ICogICBTVUJGU19VTU5UX05PUk1BTCAtIG5vcm1hbCB1bW91bnQsIGRvIG5vdCB0cnkgdG8gcmVs
ZWFzZSBzdWJmcworICogICBTVUJGU19VTU5UX01FRElBICAtIG1lZGlhIGNoYW5nZSBkZXRlY3Rl
ZCwgcmVsZWFzZSBzdWJmcywKKyAqICAgCQkJIGRvIG5vdCByZW1vdW50IHJvIChhcyBtZWRpYSBp
cyBhbHJlYWR5IGdvbmUpCisgKiAgIFNVQkZTX1VNTlRfVVNFUiAgIC0gdXNlciByZXF1ZXN0LCBy
ZWxlYXNlIHN1YmZzLCByZW1vdW50IHJvIGJlZm9yZQorICogICAJCQkgcmVsZWFzaW5nIHRyYXkg
bG9jaworICoKKyAqICAgdW5sb2NrX2Rvb3IgaXMgYWx3YXlzIG5lZWRlZCB0byBrZWVwIGRldmlj
ZSB1c2FnZSBjb3VudCBjb3JyZWN0CisgKi8KK3N0YXRpYyBpbnQgc3ViZnNfcmVtb3VudF9ybyhz
dHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3ZvaWQKK3N1YmZzX3Vtb3VudChzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiLCBpbnQgcmVhc29uKQoreworCXN0cnVjdCBzdXBlcm1vdW50X3NiX2luZm8gKnNi
aSA9IHN1cGVybW91bnRfc2JpKHNiKTsKKwlpbnQgd3JpdGVjb3VudCA9IHNiaS0+d3JpdGVjb3Vu
dDsKKworCUVOVEVSKHNiKTsKKworCWlmIChyZWFzb24gIT0gU1VCRlNfVU1OVF9OT1JNQUwpIHsK
KwkJLyoKKwkJICogd2UgdXNlZCB0byBkaWQgc2hyaW5rX2RjYWNoZSBoZXJlLiBJdCBjb21waWNh
dGVzIGxvY2tpbmcKKwkJICogKGNsZWFyX2lub2RlIGlzIGNhbGxlZCB1bmRlciBzYmktPnNlbSB0
aHVzIHJlcXVpcmluZyBlaXRoZXIKKwkJICogcmVjdXJzaXZlIGxvY2sgb3Igc2VwYXJhdGUgbG9j
ayBqdXN0IGZvciBpbm9kZSBsaXN0KS4KKwkJICogVGhpcyBpcyBub3QgbmVlZGVkIGFueSBtb3Jl
IHRvIGVuc3VyZSBzdWJmcyBjYW4gYmUgdW1vdW50ZWQKKwkJICogc28gd2UgbGV0IGRlbnRyaWVz
IGRpZSBhbmQgcmVseSBvbiBkZW50cnlfcmV2YWxpZGF0ZSB0bworCQkgKiByZWplY3Qgc3RhbGUg
ZGVudHJpZXMKKwkJICovCisKKwkJaWYgKHN1YmZzX2lzX2J1c3koc2IpKQorCQkJc3VwZXJtb3Vu
dF93YXJuaW5nKHNiLCAib3BlbmVkIGZpbGVzIGR1cmluZyBtZWRpYSBjaGFuZ2UiKTsKKworCQlz
dXBlcm1vdW50X2NsZWFuX2ZpbGVzKHNiKTsKKwkJc3VwZXJtb3VudF9jbGVhbl9kZW50cmllcyhz
Yik7CisJCXN1cGVybW91bnRfY2xlYW5faW5vZGVzKHNiKTsKKworCQlpZiAocmVhc29uID09IFNV
QkZTX1VNTlRfVVNFUiAmJiB3cml0ZWNvdW50ID4gMCkKKwkJCXN1YmZzX3JlbW91bnRfcm8oc2Ip
OworCQlpZiAoc2JpLT5sb2NrY291bnQgPiAwKQorCQkJc3VwZXJtb3VudF91bmxvY2tfZG9vcihz
Yik7CisJCS8qCisJCSAqIHRoaXMgaXMgcXVpdGUgdWdseSBidXQgc28gZmFyIEkgaGF2ZSBubyBp
ZGVhIGhvdyB0bworCQkgKiBkbyBpdCBjbGVhbmx5CisJCSAqLworCQlzYmktPmxvY2tjb3VudCA9
IDA7CisJfQorCisJLyoKKwkgKiBhbGwgZmlsZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGNsb3NlZAor
CSAqLworCVNVUEVSTU9VTlRfQlVHX0xPQ0tFRF9PTihzYiwgc2JpLT53cml0ZWNvdW50KTsKKwlT
VVBFUk1PVU5UX0JVR19MT0NLRURfT04oc2IsIHNiaS0+cmVhZGNvdW50KTsKKwlTVVBFUk1PVU5U
X0JVR19MT0NLRURfT04oc2IsIHNiaS0+bG9ja2NvdW50KTsKKwlTVVBFUk1PVU5UX0JVR19MT0NL
RURfT04oc2IsICFsaXN0X2VtcHR5KCZzYmktPnNfZmlsZXMpKTsKKwlTVVBFUk1PVU5UX0JVR19M
T0NLRURfT04oc2IsICFsaXN0X2VtcHR5KCZzYmktPnNfZGVudHJpZXMpKTsKKwlTVVBFUk1PVU5U
X0JVR19MT0NLRURfT04oc2IsICFsaXN0X2VtcHR5KCZzYmktPnNfaW5vZGVzKSk7CisKKwl1bm1h
cmtfbWVkaWFfc3VwZXJtb3VudGVkKHNiKTsKKwltbnRwdXQoc2JpLT5zX3VuZGVybW91bnQpOwor
CXNiaS0+c191bmRlcm1vdW50ID0gTlVMTDsKKwlpZiAoc2JpLT5ydykKKwkJc2ItPnNfZmxhZ3Mg
Jj0gfk1TX1JET05MWTsKKwlzYi0+c19ibG9ja3NpemUgPSAxMDI0OworCXNiLT5zX2Jsb2Nrc2l6
ZV9iaXRzID0gMTA7CisKKwkvKgorCSAqIEZJWE1FCisJICogYWdhaW4gdGhlIHByb2JsZW0gb2Yg
dW5tb3VudGluZyBzdWJmcyBmcm9tIGluc2lkZSBvZiBwdXRfc3VwZXIKKwkgKi8KKwlpZiAoc2It
PnNfcm9vdCkKKwkJc3VwZXJtb3VudF9pbml0X3Jvb3RfaW5vZGUoc2ItPnNfcm9vdC0+ZF9pbm9k
ZSk7CisKKwlMRUFWRShzYik7Cit9CisKK3N0YXRpYyBpbnQKK3N1YmZzX3JlbW91bnRfcm8oc3Ry
dWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1YnNiID0gc3Vi
ZnNfc2Ioc2IpOworCWludCByYzsKKworCUVOVEVSKHNiKTsKKworCXJjID0gZG9fcmVtb3VudF9z
YihzdWJzYiwgc3Vic2ItPnNfZmxhZ3MgfCBNU19SRE9OTFksIE5VTEwsIDApOworCisJTEVBVkUo
c2IpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitzdWJmc19yZW1vdW50X3J3KHN0
cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzdWJzYiA9IHN1
YmZzX3NiKHNiKTsKKwlpbnQgcmM7CisKKwlFTlRFUihzYik7CisKKwlyYyA9IGRvX3JlbW91bnRf
c2Ioc3Vic2IsIHN1YnNiLT5zX2ZsYWdzICYgfk1TX1JET05MWSwgTlVMTCwgMCk7CisKKwlMRUFW
RShzYik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKgorc3Vi
ZnNfcmVhbF9tb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICp0eXBlKQoreworCXN0
cnVjdCBzdXBlcm1vdW50X3NiX2luZm8gKnNiaSA9IHN1cGVybW91bnRfc2JpKHNiKTsKKwlzdHJ1
Y3QgdmZzbW91bnQgKm1udDsKKwljaGFyICpvcHRzID0gTlVMTDsKKworCUVOVEVSKHNiLCAidHlw
ZT0lcyIsIHR5cGUpOworCisJaWYgKHNiaS0+c19kYXRhKSB7CisJCW9wdHMgPSBzdHJkdXAoc2Jp
LT5zX2RhdGEpOworCQlpZiAoIW9wdHMpIHsKKwkJCW1udCA9IEVSUl9QVFIoLUVOT01FTSk7CisJ
CQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwltbnQgPSBkb19rZXJuX21vdW50KHR5cGUsCisJCQkg
ICAgKHNiLT5zX2ZsYWdzICYgTVNfUk1UX01BU0spIHwgTVNfU1VQRVJNT1VOVEVELAorCQkJICAg
IHNiaS0+ZGV2bmFtZSwgb3B0cyk7CisJaWYgKG9wdHMpCisJCWtmcmVlKG9wdHMpOworCitmYWls
OgorCUxFQVZFKHNiLCAic3VibW50PSVwIiwgbW50KTsKKworCXJldHVybiBtbnQ7Cit9CisKK3N0
YXRpYyBpbnQKK3N1YmZzX3JlYWxfbW91bnQyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNoYXIg
KnR5cGUpCit7CisJc3RydWN0IHN1cGVybW91bnRfc2JfaW5mbyAqc2JpID0gc3VwZXJtb3VudF9z
Ymkoc2IpOworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc3Vi
c2I7CisJaW50IHJjID0gMDsKKworCUVOVEVSKHNiLCAidHlwZT0lcyIsIHR5cGUpOworCisJbW50
ID0gc3ViZnNfcmVhbF9tb3VudChzYiwgdHlwZSk7CisKKwlpZiAoSVNfRVJSKG1udCkgJiYgUFRS
X0VSUihtbnQpID09IC1FUk9GUykgeworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJCW1u
dCA9IHN1YmZzX3JlYWxfbW91bnQoc2IsIHR5cGUpOworCX0KKwlyYyA9IFBUUl9FUlIobW50KTsK
KwlpZiAoSVNfRVJSKG1udCkpCisJCWdvdG8gb3V0OworCisJLyogcGFyYW5vaWQgY2hlY2sgZm9y
IGRvdWJsZS1tb3VudGluZyAqLworCVNVUEVSTU9VTlRfQlVHX0xPQ0tFRF9PTihzYiwgYXRvbWlj
X3JlYWQoJm1udC0+bW50X3NiLT5zX2FjdGl2ZSkgIT0gMSk7CisKKwlzYmktPnNfdW5kZXJtb3Vu
dCA9IG1udDsKKworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlyYyA9IHN1
YmZzX3JlbW91bnRfcm8oc2IpOworCQlpZiAocmMpCisJCQlnb3RvIG1udHB1dDsKKwl9CisKKwlz
dWJzYiA9IG1udC0+bW50X3NiOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IHN1YnNiLT5zX2Jsb2Nrc2l6
ZTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IHN1YnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWF0
dGFjaF9zdWJmc19kZW50cnkoc2ItPnNfcm9vdCwgbW50LT5tbnRfcm9vdCk7CisJYXR0YWNoX3N1
YmZzX2lub2RlKHNiLT5zX3Jvb3QtPmRfaW5vZGUsIG1udC0+bW50X3Jvb3QtPmRfaW5vZGUpOwor
CWluc2VydF9pbm9kZV9oYXNoKHNiLT5zX3Jvb3QtPmRfaW5vZGUpOworCWRub3RpZnlfcGFyZW50
KHNiLT5zX3Jvb3QsIEROX0NSRUFURSk7CisJcmMgPSAwOworCWdvdG8gb3V0OworCisJLyoKKwkg
KiBlcnJvciBjbGVhbiB1cAorCSAqLworbW50cHV0OgorCXNiaS0+c191bmRlcm1vdW50ID0gMDsK
KwltbnRwdXQobW50KTsKK291dDoKKwlMRUFWRShzYiwgInR5cGU9JXMgcmM9JWQiLCB0eXBlLCBy
Yyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBFcnJvciB2YWx1ZXMgZnJvbSBtb3VudAor
ICogICBFTk9FTlQgICAgIC0gbm8gZGV2aWNlIGZpbGUgKHF1aXRlIHBvc3NpYmxlIHdpdGggZGV2
ZnMpCisgKiAgIEVOWElPICAgICAgLSBkZXZpY2UgZG9lcyBub3QgZXhpc3QKKyAqICAgRU5PTUVE
SVVNICAtIG5vIG1lZGl1bSBpbnNlcnRlZCAoc3VycHJpc2UsIHN1cnByaXNlIDopCisgKiAgIEVC
VVNZICAgICAgLSBhdHRlbXB0IHRvIG1vdW50IG9uIGFscmVhZHkgbW91bnRlZCBkZXZpY2UKKyAq
ICAgICAgICAgICAgICAgIHdlIHNwZWNpZmljYWxseSBkaXNhbGxvdyBpdCBldmVuIHdoZW4gYm90
aAorICogICAgICAgICAgICAgICAgZmlsZSBzeXN0ZW0gYW5kIG1vZGUgKHJvL3J3KSBhcmUgdGhl
IHNhbWUKKyAqLworc3RhdGljIGludAorc3ViZnNfbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpz
YikKK3sKKwlzdHJ1Y3Qgc3VwZXJtb3VudF9zYl9pbmZvICpzYmkgPSBzdXBlcm1vdW50X3NiaShz
Yik7CisJaW50IHJldHZhbCA9IC1FTk9ERVY7CisJY2hhciAqdHlwZXMgPSBzdHJkdXAoc2JpLT5z
X3R5cGUpOworCisJRU5URVIoc2IpOworCisJaWYgKHNiaS0+ZGlzYWJsZWQpCisJCXJldHZhbCA9
IC1FUEVSTTsKKwllbHNlIGlmICghdHlwZXMpCisJICAgICAgIHJldHZhbCA9IC1FTk9NRU07CisJ
ZWxzZSB7CisJCWNoYXIgKnAgPSB0eXBlcywgKmZzOworCisJCXdoaWxlICgoZnMgPSBzdHJzZXAo
JnAsICI6IikpICE9IE5VTEwgJiYgcmV0dmFsCisJCSAgICAgICAmJiByZXR2YWwgIT0gLUVOWElP
CisJCSAgICAgICAmJiByZXR2YWwgIT0gLUVOT01FRElVTQorCQkgICAgICAgJiYgcmV0dmFsICE9
IC1FTk9FTlQKKwkJICAgICAgICYmIHJldHZhbCAhPSAtRUJVU1kpCisJCQlyZXR2YWwgPSBzdWJm
c19yZWFsX21vdW50MihzYiwgZnMpOworCX0KKworCWlmICh0eXBlcykKKwkJa2ZyZWUodHlwZXMp
OworCisJaWYgKCFyZXR2YWwpCisJCW1hcmtfbWVkaWFfc3VwZXJtb3VudGVkKHNiKTsKKworCUxF
QVZFKHNiLCAicmM9JWQiLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGlj
IGludAorX19zdWJmc19jaGVja19kaXNrX2NoYW5nZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQor
eworCXN0cnVjdCBzdXBlcl9ibG9jayAqc3Vic2IgPSBzdWJmc19zYihzYik7CisJaW50IHJjOwor
CXN0cnVjdCBibG9ja19kZXZpY2UgKmRldiA9IHN1YnNiLT5zX2JkZXY7CisKKwlFTlRFUihzYik7
CisKKwlyYyA9IGF0b21pY19yZWFkKCZzdWJzYi0+c19tZWRpYV9jaGFuZ2VkKTsKKwlpZiAoIXJj
KSB7CisJCWxvY2tfa2VybmVsKCk7CisJCXJjID0gY2hlY2tfZGlza19jaGFuZ2UoZGV2KTsKKwkJ
dW5sb2NrX2tlcm5lbCgpOworCX0KKworCWlmIChyYykKKwkJc3ViZnNfdW1vdW50KHNiLCBTVUJG
U19VTU5UX01FRElBKTsKKworCUxFQVZFKHNiLCAicmM9JWQiLCByYyk7CisKKwlyZXR1cm4gcmM7
Cit9CisKKy8qCisgKiB0aGlzIG11c3QgcmVhbGx5IGJlIGNhbGxlZCBzdWJmc19hY3RpdmUgLi4u
CisgKi8KK2ludAorc3ViZnNfY2hlY2tfZGlza19jaGFuZ2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpz
YikKK3sKKwlpbnQgcmM7CisKKwlFTlRFUihzYik7CisKKwlzdWJmc19sb2NrKHNiKTsKKwlpZiAo
c3ViZnNfaXNfbW91bnRlZChzYikpCisJCXJjID0gX19zdWJmc19jaGVja19kaXNrX2NoYW5nZShz
Yik7CisJZWxzZQorCQlyYyA9IDE7CisJc3ViZnNfdW5sb2NrKHNiKTsKKworCisJTEVBVkUoc2Is
ICJyYz0lZCIsIHJjKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorY2hlY2tfYW5k
X3JlbW91bnRfc3ViZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmM7CisKKwlF
TlRFUihzYik7CisKKwlpZiAoc3ViZnNfaXNfbW91bnRlZChzYikgJiYgIV9fc3ViZnNfY2hlY2tf
ZGlza19jaGFuZ2Uoc2IpKSB7CisJCXJjID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJcmMgPSBz
dWJmc19tb3VudChzYik7CisKK291dDoKKwlMRUFWRShzYiwgInJjPSVkIiwgcmMpOworCisJcmV0
dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAorc3ViZnNfdHJheV9sb2NrKHN0cnVjdCBzdXBlcl9i
bG9jayAqc2IpCit7CisJc3RydWN0IHN1cGVybW91bnRfc2JfaW5mbyAqc2JpID0gc3VwZXJtb3Vu
dF9zYmkoc2IpOworCisJRU5URVIoc2IpOworCisJU1VQRVJNT1VOVF9CVUdfTE9DS0VEX09OKHNi
LCBzYmktPmxvY2tjb3VudCA8IDApOworCisJaWYgKCFzYmktPmxvY2tjb3VudCsrKQorCQlzdXBl
cm1vdW50X2xvY2tfZG9vcihzYik7CisKKwlMRUFWRShzYik7Cit9CisKK3N0YXRpYyB2b2lkCitz
dWJmc190cmF5X3VubG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBzdXBl
cm1vdW50X3NiX2luZm8gKnNiaSA9IHN1cGVybW91bnRfc2JpKHNiKTsKKworCUVOVEVSKHNiKTsK
KworCVNVUEVSTU9VTlRfQlVHX0xPQ0tFRF9PTihzYiwgc2JpLT5sb2NrY291bnQgPD0gMCk7CisK
KwlpZiAoIS0tc2JpLT5sb2NrY291bnQpCisJCXN1cGVybW91bnRfdW5sb2NrX2Rvb3Ioc2IpOwor
CisJTEVBVkUoc2IpOworfQorCitzdGF0aWMgdm9pZAorc3ViZnNfZ2V0X3JlYWRfYWNjZXNzKHN0
cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHN1cGVybW91bnRfc2JfaW5mbyAqc2Jp
ID0gc3VwZXJtb3VudF9zYmkoc2IpOworCisJRU5URVIoc2IpOworCisJU1VQRVJNT1VOVF9CVUdf
TE9DS0VEX09OKHNiLCBzYmktPnJlYWRjb3VudCA8IDApOworCisJaWYgKCFzYmktPnJlYWRjb3Vu
dCsrICYmIHNiaS0+dHJheV9sb2NrID09IFRSQVlfTE9DS19BTFdBWVMpCisJCXN1YmZzX3RyYXlf
bG9jayhzYik7CisKKwlMRUFWRShzYik7Cit9CisKK3N0YXRpYyBpbnQKK3N1YmZzX2dldF93cml0
ZV9hY2Nlc3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3VwZXJtb3VudF9z
Yl9pbmZvICpzYmkgPSBzdXBlcm1vdW50X3NiaShzYik7CisJaW50IHJjOworCisJRU5URVIoc2Ip
OworCisJU1VQRVJNT1VOVF9CVUdfTE9DS0VEX09OKHNiLCBzYmktPndyaXRlY291bnQgPCAwKTsK
KworCXJjID0gMDsKKwlpZiAoIXNiaS0+d3JpdGVjb3VudCkgeworCQlpZiAoc2ItPnNfZmxhZ3Mg
JiBNU19SRE9OTFkpCisJCQlyYyA9IC1FUk9GUzsKKwkJZWxzZQorCQkJcmMgPSBzdWJmc19yZW1v
dW50X3J3KHNiKTsKKwl9CisKKwlpZiAoIXJjICYmICFzYmktPndyaXRlY291bnQrKyAmJiBzYmkt
PnRyYXlfbG9jayAhPSBUUkFZX0xPQ0tfTkVWRVIpCisJCXN1YmZzX3RyYXlfbG9jayhzYik7CisK
KwlMRUFWRShzYiwgInJjPSVkIiwgcmMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9p
ZAorc3ViZnNfcHV0X3JlYWRfYWNjZXNzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3Ry
dWN0IHN1cGVybW91bnRfc2JfaW5mbyAqc2JpID0gc3VwZXJtb3VudF9zYmkoc2IpOworCisJRU5U
RVIoc2IpOworCisJU1VQRVJNT1VOVF9CVUdfTE9DS0VEX09OKHNiLCBzYmktPnJlYWRjb3VudCA8
PSAwKTsKKworCWlmICghLS1zYmktPnJlYWRjb3VudCAmJiBzYmktPnRyYXlfbG9jayA9PSBUUkFZ
X0xPQ0tfQUxXQVlTKQorCQlzdWJmc190cmF5X3VubG9jayhzYik7CisKKwlMRUFWRShzYik7Cit9
CisKK3N0YXRpYyB2b2lkCitzdWJmc19wdXRfd3JpdGVfYWNjZXNzKHN0cnVjdCBzdXBlcl9ibG9j
ayAqc2IpCit7CisJc3RydWN0IHN1cGVybW91bnRfc2JfaW5mbyAqc2JpID0gc3VwZXJtb3VudF9z
Ymkoc2IpOworCisJRU5URVIoc2IpOworCisJU1VQRVJNT1VOVF9CVUdfTE9DS0VEX09OKHNiLCBz
YmktPndyaXRlY291bnQgPD0gMCk7CisKKwlpZiAoIS0tc2JpLT53cml0ZWNvdW50KSB7CisJCS8q
CisJCSAqIG5vIG5lZWQgdG8gZnN5bmMsIGl0IGlzIGRvbmUgYXV0b21hdGljYWxseSBvbiByZW1v
dW50CisJCSAqLworCQlpbnQgcmMgPSBzdWJmc19yZW1vdW50X3JvKHNiKTsKKwkJaWYgKHJjKQor
CQkJc3VwZXJtb3VudF9lcnJvcihzYiwgImZhaWxlZCB0byByZW1vdW50IHJvLCBlcnJvciA9ICVk
IiwgcmMpOworCQlpZiAoc2JpLT50cmF5X2xvY2sgIT0gVFJBWV9MT0NLX05FVkVSKQorCQkJc3Vi
ZnNfdHJheV91bmxvY2soc2IpOworCX0KKworCUxFQVZFKHNiKTsKK30KKworaW50CitzdWJmc19n
ZXRfYWNjZXNzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBydykKK3sKKwlzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJaW50IHJjID0gMDsKKwkKKwlFTlRFUihzYik7CisK
KwlzdWJmc19sb2NrKHNiKTsKKwlpZiAoaXNfaW5vZGVfb2Jzb2xldGUoaW5vZGUpKQorCQlyYyA9
IC1FU1RBTEU7CisJZWxzZSB7CisJCXN0cnVjdCBzdXBlcm1vdW50X2lub2RlX2luZm8gKnNpaSA9
IHN1cGVybW91bnRfaShpbm9kZSk7CisKKwkJaWYgKHJ3KSB7CisJCQlTVVBFUk1PVU5UX0JVR19M
T0NLRURfT04oc2IsIHNpaS0+d3JpdGVjb3VudCA8IDApOworCQkJcmMgPSBzdWJmc19nZXRfd3Jp
dGVfYWNjZXNzKHNiKTsKKwkJCWlmICghcmMpCisJCQkJc2lpLT53cml0ZWNvdW50Kys7CisJCX0g
ZWxzZSB7CisJCQlTVVBFUk1PVU5UX0JVR19MT0NLRURfT04oc2IsIHNpaS0+cmVhZGNvdW50IDwg
MCk7CisJCQlzdWJmc19nZXRfcmVhZF9hY2Nlc3Moc2IpOworCQkJc2lpLT5yZWFkY291bnQrKzsK
KwkJfQorCX0KKwlzdWJmc191bmxvY2soc2IpOworCisJTEVBVkUoc2IsICJyYz0lZCIsIHJjKTsK
KworCXJldHVybiByYzsKK30KKwordm9pZAorc3ViZnNfcHV0X2FjY2VzcyhzdHJ1Y3QgaW5vZGUg
Kmlub2RlLCBpbnQgcncpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3Ni
OworCisJRU5URVIoc2IpOworCisJc3ViZnNfbG9jayhzYik7CisJaWYgKCFpc19pbm9kZV9vYnNv
bGV0ZShpbm9kZSkpIHsKKwkJc3RydWN0IHN1cGVybW91bnRfaW5vZGVfaW5mbyAqc2lpID0gc3Vw
ZXJtb3VudF9pKGlub2RlKTsKKworCQlpZiAocncpIHsKKwkJCVNVUEVSTU9VTlRfQlVHX0xPQ0tF
RF9PTihzYiwgc2lpLT53cml0ZWNvdW50IDw9IDApOworCQkJc2lpLT53cml0ZWNvdW50LS07CisJ
CQlzdWJmc19wdXRfd3JpdGVfYWNjZXNzKHNiKTsKKwkJfSBlbHNlIHsKKwkJCVNVUEVSTU9VTlRf
QlVHX0xPQ0tFRF9PTihzYiwgc2lpLT5yZWFkY291bnQgPD0gMCk7CisJCQlzaWktPnJlYWRjb3Vu
dC0tOworCQkJc3ViZnNfcHV0X3JlYWRfYWNjZXNzKHNiKTsKKwkJfQorCisJfQorCXN1YmZzX3Vu
bG9jayhzYik7CisKKwlMRUFWRShzYik7Cit9CisKK3N0cnVjdCB2ZnNtb3VudCAqCitzdWJmc19n
b19vbmxpbmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmM7CisJc3RydWN0IHZm
c21vdW50ICptbnQ7CisKKwlFTlRFUihzYik7CisKKwlzdWJmc19sb2NrKHNiKTsKKworCXJjID0g
Y2hlY2tfYW5kX3JlbW91bnRfc3ViZnMoc2IpOworCW1udCA9IEVSUl9QVFIocmMpOworCWlmICgh
cmMpCisJCW1udCA9IG1udGdldChzdWJmc19tbnQoc2IpKTsKKwlzdWJmc191bmxvY2soc2IpOwor
CisJTEVBVkUoc2IsICJtbnQ9JXAiLCBtbnQpOworCisJcmV0dXJuIG1udDsKK30KKwordm9pZAor
c3ViZnNfZ29fb2ZmbGluZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdmZzbW91bnQg
Km1udCkKK3sKKwlFTlRFUihzYik7CisKKwlTVVBFUk1PVU5UX0JVR19PTighbW50KTsKKwltbnRw
dXQobW50KTsKKworCUxFQVZFKHNiKTsKKworfQorCitzdHJ1Y3QgdmZzbW91bnQgKgorc3ViZnNf
cHJldmVudF91bW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgdmZzbW91
bnQgKm1udDsKKworCUVOVEVSKHNiKTsKKworCXN1YmZzX2xvY2soc2IpOworCW1udCA9IHN1YmZz
X21udChzYik7CisJaWYgKG1udCkKKwkJbW50ID0gbW50Z2V0KG1udCk7CisJc3ViZnNfdW5sb2Nr
KHNiKTsKKworCUxFQVZFKHNiLCAibW50PSVwIiwgbW50KTsKKworCXJldHVybiBtbnQ7Cit9CisK
K3ZvaWQKK3N1YmZzX2FsbG93X3Vtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qg
dmZzbW91bnQgKm1udCkKK3sKKwlFTlRFUihzYik7CisKKwlTVVBFUk1PVU5UX0JVR19PTighbW50
KTsKKwltbnRwdXQobW50KTsKKworCUxFQVZFKHNiKTsKKworfQorCitzdHJ1Y3QgdmZzbW91bnQg
Kgorc3ViZnNfZ2V0X21udChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCB2ZnNt
b3VudCAqbW50ID0gTlVMTDsKKworCUVOVEVSKHNiKTsKKworCXN1YmZzX2xvY2soc2IpOworCWlm
IChzdWJmc19pc19tb3VudGVkKHNiKSkKKwkJbW50ID0gbW50Z2V0KHN1YmZzX21udChzYikpOwor
CXN1YmZzX3VubG9jayhzYik7CisKKwlMRUFWRShzYiwgIm1udD0lcCIsIG1udCk7CisKKwlyZXR1
cm4gbW50OworfQorCitzdHJ1Y3Qgc3VwZXJfYmxvY2sgKgorc3ViZnNfZ2V0X3NiKHN0cnVjdCBz
dXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzdWJzYiA9IE5VTEw7CisK
KwlFTlRFUihzYik7CisKKwlzdWJmc19sb2NrKHNiKTsKKwlpZiAoc3ViZnNfaXNfbW91bnRlZChz
YikpCisJCXN1YnNiID0gc3ViZnNfc2Ioc2IpOworCXN1YmZzX3VubG9jayhzYik7CisKKwlMRUFW
RShzYiwgInN1YnNiPSVwIiwgc3Vic2IpOworCisJcmV0dXJuIHN1YnNiOworfQorCisvKgorICog
Y29udHJhcnkgdG8gaXRzIG5hbWUgdGhpcyBmdW5jdGlvbiBkZWFscyB3aXRoIF9zdXBlcm1vdW50
XyBpbm9kZQorICovCit2b2lkCitzdWJmc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2Rl
KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgc3Vw
ZXJtb3VudF9pbm9kZV9pbmZvICpzaWkgPSBzdXBlcm1vdW50X2koaW5vZGUpOworCisJRU5URVIo
c2IsICJpbm9kZT0lcCIsIGlub2RlKTsKKworCXN1YmZzX2xvY2soc2IpOworCisJLyoKKwkgKiB0
aGlzIGlzIHNhZmUuIElmIHN1YmZzIGhhcyBiZWVuIHVubW91bnRlZCwgY291bnRlcnMgaGFzIGJl
ZW4KKwkgKiBzZXQgdG8gMCBhbHJlYWR5CisJICovCisJd2hpbGUoc2lpLT53cml0ZWNvdW50ID4g
MCkgeworCQlzaWktPndyaXRlY291bnQtLTsKKwkJc3ViZnNfcHV0X3dyaXRlX2FjY2VzcyhzYik7
CisJfQorCisJd2hpbGUoc2lpLT5yZWFkY291bnQgPiAwKSB7CisJCXNpaS0+cmVhZGNvdW50LS07
CisJCXN1YmZzX3B1dF9yZWFkX2FjY2VzcyhzYik7CisJfQorCisJbGlzdF9kZWwoJnNpaS0+bGlz
dCk7CisKKwlzdWJmc191bmxvY2soc2IpOworCisJTEVBVkUoc2IsICJpbm9kZT0lcCIsIGlub2Rl
KTsKK30KZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40Lm9yaWcvZnMvc3VwZXJtb3VudC9zdXBlci5j
IGxpbnV4LTIuNi4yNS40L2ZzL3N1cGVybW91bnQvc3VwZXIuYwotLS0gbGludXgtMi42LjI1LjQu
b3JpZy9mcy9zdXBlcm1vdW50L3N1cGVyLmMJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAorKysg
bGludXgtMi42LjI1LjQvZnMvc3VwZXJtb3VudC9zdXBlci5jCTIwMDgtMDUtMjAgMDE6Mjc6NTMg
KzAzMDAKQEAgLTAsMCArMSw2NDggQEAKKy8qCisgKiAgbGludXgvZnMvc3VwZXJtb3VudC9zdXBl
ci5jCisgKgorICogIE9yaWdpbmFsIHZlcnNpb246CisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5
NSwgMTk5NworICogICAgICBTdGVwaGVuIFR3ZWVkaWUgKHNjdEBAZGNzLmVkLmFjLnVrKQorICoK
KyAqICAgICAgZnJvbQorICoKKyAqICAgICAgbGludXgvZnMvbWluaXgvaW5vZGUuYworICogICAg
ICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogICAgICBh
bmQKKyAqCisgKiAgICAgIGxpbnV4L2ZzL2V4dDIvc3VwZXIuYworICogICAgICBDb3B5cmlnaHQg
KEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgIFJlbXkgQ2FyZAorICoKKyAqICBSZXdyaXRlbiBm
b3Iga2VybmVsIDIuMiwgMi40LiAoQykgMTk5OSwgMjAwMCBBbGV4aXMgTWlraGFpbG92CisgKiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGV4aXNAQGFiYy5jYXAucnUpCisg
KiAgUmV3cml0dGVuIGZvciBrZXJuZWwgMi40LjIxIChDKSAyMDAzIEFuZHJleSBCb3J6ZW5rb3YK
KyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFydmlkamFhckBAbWFp
bC5ydSkKKyAqICBSZXdyaXR0ZW4gZm9yIGtlcm5lbCAyLjUuNzAgKEMpIDIwMDMgQW5kcmV5IEJv
cnplbmtvdgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJ2aWRq
YWFyQEBtYWlsLnJ1KQorICoKKyAqICAkSWQ6IHN1cGVyLmMsdiAxLjI1LjIuMTEgMjAwNC8wMS8x
NCAxOToyNDoxMCBib3IgRXhwICQKKyAqLworCisjZGVmaW5lIFNfREJHX1RSQUNFX0NVUlJFTlQg
U19EQkdfVFJBQ0VfU1VQRVIKKworI2luY2x1ZGUgPGxpbnV4L3N0YXRmcy5oPgorI2luY2x1ZGUg
PGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgInN1cGVybW91bnQuaCIKKworLyoKKyAqIHZmYXQg
YW5kIG1zZG9zIGRvIG5vdCBoYXZlIGFueSB2YWxpZGlkdHkgY2hlY2tzIGZvciBzdXBlcmJsb2Nr
IGFuZCBtdXN0CisgKiBiZSB0aGUgbGFzdCBlbnRyaWVzIQorICovCisKK3N0YXRpYyBjaGFyICpk
ZWZhdWx0X2ZzX3R5cGVzID0gInVkZjppc285NjYwOmV4dDI6dmZhdDptc2RvcyI7CisKK3N0YXRp
YyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBzdXBlcm1vdW50X3NvcHM7CisKKy8qID09PT09PT09
PT09PT09PT09PT09PT09PT0gaGVscGVycyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0gKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzdXBlcm1vdW50X3VwZGF0ZV9pbm9kZShzdHJ1
Y3QgaW5vZGUgKnN1cGVyaSwgc3RydWN0IGlub2RlICpzdWJpKQoreworCXN0cnVjdCBzdXBlcl9i
bG9jayAqc2IgPSBzdXBlcmktPmlfc2I7CisKKwlFTlRFUihzYiwgInN1cGVyaT0lcCBzdWJpPSVw
Iiwgc3VwZXJpLCBzdWJpKTsKKworCXN1cGVyaS0+aV9pbm8gPSBzdWJpLT5pX2lubzsKKwlzdXBl
cmktPmlfbW9kZSA9IHN1YmktPmlfbW9kZTsKKwlzdXBlcmktPmlfdWlkID0gc3ViaS0+aV91aWQ7
CisJc3VwZXJpLT5pX2dpZCA9IHN1YmktPmlfZ2lkOworCXN1cGVyaS0+aV9ubGluayA9IHN1Ymkt
Pmlfbmxpbms7CisJc3VwZXJpLT5pX3NpemUgPSBzdWJpLT5pX3NpemU7CisJc3VwZXJpLT5pX2F0
aW1lID0gc3ViaS0+aV9hdGltZTsKKwlzdXBlcmktPmlfY3RpbWUgPSBzdWJpLT5pX2N0aW1lOwor
CXN1cGVyaS0+aV9tdGltZSA9IHN1YmktPmlfbXRpbWU7CisJLy9zdXBlcmktPmlfYmxrc2l6ZSA9
IHN1YmktPmlfYmxrc2l6ZTsKKwlzdXBlcmktPmlfYmxvY2tzID0gc3ViaS0+aV9ibG9ja3M7CisJ
c3VwZXJpLT5pX3JkZXYgPSBzdWJpLT5pX3JkZXY7CisJc3VwZXJpLT5pX3ZlcnNpb24rKzsKKwlz
ZXRfaW5vZGVfZmxhZ3Moc3VwZXJpLCBzdWJpKTsKKworCWlmIChTX0lTRElSKHN1cGVyaS0+aV9t
b2RlKSkgeworCQlzdXBlcmktPmlfb3AgPSAmc3VwZXJtb3VudF9kaXJfaW9wczsKKwkJc3VwZXJp
LT5pX2ZvcCA9ICZzdXBlcm1vdW50X2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0xO
SyhzdXBlcmktPmlfbW9kZSkpIHsKKwkJc3VwZXJpLT5pX29wID0gJnN1cGVybW91bnRfc3ltbGlu
a19pb3BzOworCQlzdXBlcmktPmlfbWFwcGluZyA9IHN1YmktPmlfbWFwcGluZzsKKwl9IGVsc2Ug
eworCQlzdXBlcmktPmlfb3AgPSAmc3VwZXJtb3VudF9maWxlX2lvcHM7CisJCXN1cGVyaS0+aV9m
b3AgPSAmc3VwZXJtb3VudF9maWxlX29wZXJhdGlvbnM7CisJCXN1cGVyaS0+aV9tYXBwaW5nID0g
c3ViaS0+aV9tYXBwaW5nOworCX0KKworCUxFQVZFKHNiLCAic3VwZXJpPSVwIHN1Ymk9JXAiLCBz
dXBlcmksIHN1YmkpOworfQorCisvKiB0aGlzIGlzIGFsc28gY2FsbGVkIGZyb20gc3ViZnNfbW91
bnQgdG8gcmVpbnN0YW50aWF0ZSByb290IGlub2RlICovCit2b2lkCithdHRhY2hfc3ViZnNfaW5v
ZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpzdWJpKQoreworCXN0cnVjdCBz
dXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgc3VwZXJtb3VudF9zYl9pbmZv
ICpzYmkgPSBzdXBlcm1vdW50X3NiaShzYik7CisJc3RydWN0IHN1cGVybW91bnRfaW5vZGVfaW5m
byAqc2lpOworCisJRU5URVIoc2IsICJpbm9kZT0lcCBzdWJpPSVwIiwgaW5vZGUsIHN1YmkpOwor
CisJc2lpID0gc3VwZXJtb3VudF9pKGlub2RlKTsKKwlpZiAoIXNpaS0+aW5vZGUpIHsKKwkJLyoK
KwkJICogdGhpcyBjYW4gYmUgcnVuIGNvbmN1cnJlbnRseS4gSXQgaXMgZXhlY3V0ZWQgdW5kZXIK
KwkJICogc2JpLT5zZW0gc28gb25seSBvbmUgdGFzayB3b3VsZCBhY3R1YWxseSBpbnN0YW50YXRl
CisJCSAqIGlub2RlLiBTZWUgbmFtZWkuYzpwcmVwYXJlX2lub2RlCisJCSAqIEFub3RoZXIgdXNl
ciBpcyBzdWJmcy5jOnN1YmZzX3JlYWxfbW91bnQyCisJCSAqLworCQlzaWktPmlub2RlID0gaWdy
YWIoc3ViaSk7CisJCXN1cGVybW91bnRfdXBkYXRlX2lub2RlKGlub2RlLCBzdWJpKTsKKwkJbGlz
dF9hZGQoJnNpaS0+bGlzdCwgJnNiaS0+c19pbm9kZXMpOworCX0gZWxzZQorCQlTVVBFUk1PVU5U
X0JVR19MT0NLRURfT04oc2IsIHNpaS0+aW5vZGUgIT0gc3ViaSk7CisKKwlMRUFWRShzYiwgImlu
b2RlPSVwIHN1Ymk9JXAiLCBpbm9kZSwgc3ViaSk7Cit9CisKK2NoYXIgKgorc3RyZHVwKGNvbnN0
IGNoYXIgKnZhbCkKK3sKKwljaGFyICp0bXA7CisJdG1wID0ga21hbGxvYygxICsgc3RybGVuKHZh
bCksIEdGUF9LRVJORUwpOworCWlmICh0bXApCisJCXN0cmNweSh0bXAsIHZhbCk7CisJcmV0dXJu
IHRtcDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcm1vdW50X3NiX2luZm8gKgorY3JlYXRlX3Ni
aShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBzdXBlcm1vdW50X3NiX2luZm8g
KnNiaSA9IGttYWxsb2Moc2l6ZW9mICgqc2JpKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXNiaSkK
KwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoc2JpLCAwLCBzaXplb2YgKCpzYmkpKTsKKworCXNi
aS0+c191bmRlcm1vdW50ID0gTlVMTDsKKwlzYmktPnNfdHlwZSA9IHNiaS0+ZGV2bmFtZSA9IHNi
aS0+c19kYXRhID0gTlVMTDsKKwlJTklUX0xJU1RfSEVBRCgmc2JpLT5zX2lub2Rlcyk7CisJSU5J
VF9MSVNUX0hFQUQoJnNiaS0+c19maWxlcyk7CisJSU5JVF9MSVNUX0hFQUQoJnNiaS0+c19kZW50
cmllcyk7CisJaW5pdF9NVVRFWCgmc2JpLT5zZW0pOworCXNiaS0+aG9zdCA9IHNiOworCXNiaS0+
dHJheV9sb2NrID0gVFJBWV9MT0NLX09OV1JJVEU7CisJc2JpLT5ydyA9ICEoc2ItPnNfZmxhZ3Mg
JiBNU19SRE9OTFkpOworCisJcmV0dXJuIHNiaTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfc2Jp
KHN0cnVjdCBzdXBlcm1vdW50X3NiX2luZm8gKnNiaSkKK3sKKwlpZiAoc2JpLT5zX3R5cGUgJiYg
c2JpLT5zX3R5cGUgIT0gZGVmYXVsdF9mc190eXBlcykKKwkJa2ZyZWUoc2JpLT5zX3R5cGUpOwor
CWlmIChzYmktPmRldm5hbWUpCisJCWtmcmVlKHNiaS0+ZGV2bmFtZSk7CisJaWYgKHNiaS0+c19k
YXRhKQorCQlrZnJlZShzYmktPnNfZGF0YSk7CisJa2ZyZWUoc2JpKTsKK30KKworZW51bSB7CisJ
T3B0X2ZzLCBPcHRfZnNfYXV0bywgT3B0X2RldiwgT3B0X2RlYnVnLCBPcHRfZGVidWdfb2xkLCBP
cHRfc3ViZnNvcHRzLAorCU9wdF90cmF5X2xvY2tfYWx3YXlzLCBPcHRfdHJheV9sb2NrX25ldmVy
LCBPcHRfdHJheV9sb2NrX29ud3JpdGUsCisJT3B0X2lnbm9yZSwgT3B0X2VycgorfTsKKworc3Rh
dGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworCXtPcHRfZnNfYXV0bywgImZzPWF1dG8ifSwK
Kwl7T3B0X2ZzLCAiZnM9JXMifSwKKwl7T3B0X2RldiwgImRldj0lcyJ9LAorCXtPcHRfZGVidWcs
ICJkZWJ1Zz0ldSJ9LAorCXtPcHRfZGVidWdfb2xkLCAiZGVidWcifSwKKwl7T3B0X3N1YmZzb3B0
cywgIi0tIn0sCisJe09wdF90cmF5X2xvY2tfYWx3YXlzLCAidHJheV9sb2NrPWFsd2F5cyJ9LAor
CXtPcHRfdHJheV9sb2NrX25ldmVyLCAidHJheV9sb2NrPW5ldmVyIn0sCisJe09wdF90cmF5X2xv
Y2tfb253cml0ZSwgInRyYXlfbG9jaz1vbndyaXRlIn0sCisJe09wdF9pZ25vcmUsICJub190cmF5
X2xvY2sifSwKKwl7T3B0X2lnbm9yZSwgImZhaWxfc3RhdGZzX3VudGlsX21vdW50In0sCisJe09w
dF9lcnIsIE5VTEx9Cit9OworCitzdGF0aWMgaW50CitwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlv
bnMsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHN1cGVybW91bnRfc2JfaW5m
byAqc2JpID0gc3VwZXJtb3VudF9zYmkoc2IpOworCWludCByYzsKKwljaGFyICpwOworCisJaWYg
KCFvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywg
IiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCXN1YnN0cmluZ190IGFyZ3NbTUFYX09Q
VF9BUkdTXTsKKwkJaW50IG47CisKKwkJLyogZW1wdHkgb3B0aW9uIG1lYW5zIHN0YXJ0IG9mIHN1
YmZzIG9wdGlvbnMgKi8KKwkJaWYgKCEqcCkKKwkJCWdvdG8gY29weV9zdWJmc19vcHRpb25zOwor
CisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoKHRva2Vu
KSB7CisJCWNhc2UgT3B0X2ZzOgorCQkJc2JpLT5zX3R5cGUgPSBtYXRjaF9zdHJkdXAoJmFyZ3Nb
MF0pOworCQkJaWYgKCFzYmktPnNfdHlwZSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWJyZWFr
OworCQljYXNlIE9wdF9mc19hdXRvOgorCQkJc2JpLT5zX3R5cGUgPSBkZWZhdWx0X2ZzX3R5cGVz
OworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2RldjoKKwkJCXNiaS0+ZGV2bmFtZSA9IG1hdGNoX3N0
cmR1cCgmYXJnc1swXSk7CisJCQlpZiAoIXNiaS0+ZGV2bmFtZSkKKwkJCQlyZXR1cm4gLUVOT01F
TTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9kZWJ1ZzoKKwkJCWlmICgocmMgPSBtYXRjaF9pbnQo
JmFyZ3NbMF0sICZuKSkpCisJCQkJcmV0dXJuIHJjOworCQkJc2JpLT5zX2RlYnVnID0gbjsKKwkJ
CWJyZWFrOworCQljYXNlIE9wdF9kZWJ1Z19vbGQ6CisJCQlzYmktPnNfZGVidWcgPSBTX0RCR19E
RUJVRzsKKwkJCWJyZWFrOworCQljYXNlIE9wdF90cmF5X2xvY2tfYWx3YXlzOgorCQkJc2JpLT50
cmF5X2xvY2sgPSBUUkFZX0xPQ0tfQUxXQVlTOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3RyYXlf
bG9ja19vbndyaXRlOgorCQkJc2JpLT50cmF5X2xvY2sgPSBUUkFZX0xPQ0tfT05XUklURTsKKwkJ
CWJyZWFrOworCQljYXNlIE9wdF90cmF5X2xvY2tfbmV2ZXI6CisJCQlzYmktPnRyYXlfbG9jayA9
IFRSQVlfTE9DS19ORVZFUjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9zdWJmc29wdHM6Citjb3B5
X3N1YmZzX29wdGlvbnM6CisJCQkvKiBtb3VudCBtYXkgaGF2ZSByZW1vdmVkIG9wdGlvbnMgYWZ0
ZXIgLS0gKi8KKwkJCWlmIChvcHRpb25zICYmICpvcHRpb25zKSB7CisJCQkJc2JpLT5zX2RhdGEg
PSBzdHJkdXAob3B0aW9ucyk7CisJCQkJaWYgKCFzYmktPnNfZGF0YSkKKwkJCQkJcmV0dXJuIC1F
Tk9NRU07CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9pZ25vcmU6
CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN1cGVybW91bnRfZXJyb3Ioc2IsICJVbnJlY29n
bml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiIsCisJCQkJCSBwKTsKKwkJCXJldHVybiAtRUlOVkFM
OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorc3VwZXJtb3Vu
dF9pbml0X3Jvb3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbm9kZS0+aV9tb2Rl
ID0gMDc3NyB8IFNfSUZESVI7CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaW5v
ZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJLy9pbm9kZS0+aV9ibGtzaXplID0gaW5vZGUt
Pmlfc2ItPnNfYmxvY2tzaXplOworCWlub2RlLT5pX3JkZXYgPSBNS0RFVihVTk5BTUVEX01BSk9S
LCAwKTsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUg
PSBDVVJSRU5UX1RJTUU7CisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJaW5vZGUtPmlfYmxvY2tzID0g
MDsKKwlpbm9kZS0+aV9pbm8gPSAwOworCWlub2RlLT5pX25saW5rID0gMDsKKworCXNldF9pbm9k
ZV9mbGFncyhpbm9kZSwgMCk7CisKKwlpbm9kZS0+aV9vcCA9ICZzdXBlcm1vdW50X2Rpcl9pb3Bz
OworCWlub2RlLT5pX2ZvcCA9ICZzdXBlcm1vdW50X2Rpcl9vcGVyYXRpb25zOworfQorCitzdGF0
aWMgc3RydWN0IGlub2RlICoKK3N1cGVybW91bnRfcm9vdF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxv
Y2sgKnNiKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCisJRU5U
RVIoc2IpOworCisJaWYgKGlub2RlKSB7CisJCWlub2RlLT5pX3ZlcnNpb24gPSAwOworCQlzdXBl
cm1vdW50X2luaXRfcm9vdF9pbm9kZShpbm9kZSk7CisJfQorCisJTEVBVkUoc2IsICJpbm9kZT0l
cCIsIGlub2RlKTsKKworCXJldHVybiBpbm9kZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09
PT09PT09PT0gdXNlZCBpbiBmc3R5cGUgZGVjbGFyYXRpb24gPT09PT09PT09PT09PT09PSovCisK
Ky8qIHJlYWRfc3VwZXI6IHRoZSBtYWluIG1vdW50KCkgZW50cnkgcG9pbnQgaW50byB0aGUgVkZT
IGxheWVyLiAqLworc3RhdGljIGludAorc3VwZXJtb3VudF9yZWFkX3N1cGVyKHN0cnVjdCBzdXBl
cl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGlub2RlICpy
b290X2lub2RlOworCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisJc3RydWN0IHN1cGVybW91bnRfc2Jf
aW5mbyAqc2JpID0gY3JlYXRlX3NiaShzYik7CisJaW50IHJjID0gLUVOT01FTTsKKworCWlmICgh
c2JpKQorCQlnb3RvIGZhaWxfbm9fbWVtb3J5OworCisJc2ItPnNfZnNfaW5mbyA9IHNiaTsKKwor
CXJjID0gcGFyc2Vfb3B0aW9ucygoY2hhciAqKSBkYXRhLCBzYik7CisJaWYgKHJjKQorCQlnb3Rv
IGZhaWxfcGFyc2luZzsKKworCXJjID0gLUVJTlZBTDsKKwlpZiAoIXNiaS0+ZGV2bmFtZSkgewor
CQlzdXBlcm1vdW50X2Vycm9yKHNiLCAibm8gZGV2PTxkZXZpY2U+IG9wdGlvbiIpOworCQlnb3Rv
IGZhaWxfcGFyc2luZzsKKwl9CisKKwlpZiAoIXNiaS0+c190eXBlKSB7CisJCXNiaS0+c190eXBl
ID0gZGVmYXVsdF9mc190eXBlczsKKwkJc3VwZXJtb3VudF93YXJuaW5nKHNiLCAibm8gZnM9PGZp
bGVzeXN0ZW0+IG9wdGlvbiwgYXNzdW1pbmcgZnM9YXV0byIpOworCX0KKworCXJjID0gLUVOT01F
TTsKKworCXNiLT5zX2Jsb2Nrc2l6ZSA9IDEwMjQ7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSAx
MDsKKwlzYi0+c19tYWdpYyA9IFNVUEVSTU9VTlRfU1VQRVJfTUFHSUM7CisJc2ItPnNfb3AgPSAm
c3VwZXJtb3VudF9zb3BzOworCisJcm9vdF9pbm9kZSA9IHN1cGVybW91bnRfcm9vdF9pbm9kZShz
Yik7CisJaWYgKCFyb290X2lub2RlKQorCQlnb3RvIGZhaWxfYWxsb2NhdGluZ19yb290X2lub2Rl
OworCisJcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlpZiAoIXJvb3QpCisJCWdv
dG8gZmFpbF9hbGxvY2F0aW5nX3Jvb3RfZGVudHJ5OworCWlmIChpbml0X2RlbnRyeV9pbmZvKHJv
b3QpKQorCQlnb3RvIGZhaWxfaW5pdF9yb290X2luZm87CisKKwlzYi0+c19yb290ID0gcm9vdDsK
KworCXN1cGVybW91bnRfcHJvY19pbnNlcnQoc2JpKTsKKworCXJldHVybiAwOworCitmYWlsX2lu
aXRfcm9vdF9pbmZvOgorCWRwdXQocm9vdCk7CitmYWlsX2FsbG9jYXRpbmdfcm9vdF9kZW50cnk6
CisJaXB1dChyb290X2lub2RlKTsKK2ZhaWxfcGFyc2luZzoKK2ZhaWxfYWxsb2NhdGluZ19yb290
X2lub2RlOgorCWZyZWVfc2JpKHNiaSk7CisKK2ZhaWxfbm9fbWVtb3J5OgorCXJldHVybiByYzsK
K30KKworc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlcm1vdW50X2dldF9zYihzdHJ1Y3QgZmlsZV9z
eXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9p
ZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisgICAgICAgIHJldHVybiBnZXRfc2Jf
bm9kZXYoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIHN1cGVybW91bnRfcmVhZF9zdXBlcixtbnQpOwor
fQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PSBzdXBlcl9vcGVyYXRpb25zIG1ldGhvZHMg
PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqCitzdXBlcm1v
dW50X2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHN1cGVy
bW91bnRfaW5vZGVfaW5mbyAqc2lpID0ga21hbGxvYyhzaXplb2YoKnNpaSksIEdGUF9LRVJORUwp
OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAwOworCisJRU5URVIoc2IpOworCisJaWYgKHNpaSkg
eworCQlJTklUX0xJU1RfSEVBRCgmc2lpLT5saXN0KTsKKwkJc2lpLT5pbm9kZSA9IDA7CisJCXNp
aS0+cmVhZGNvdW50ID0gMDsKKwkJc2lpLT53cml0ZWNvdW50ID0gMDsKKwkJaW5vZGUgPSAmc2lp
LT52ZnNfaW5vZGU7CisJCWlub2RlX2luaXRfb25jZShpbm9kZSk7CisJfQorCisJTEVBVkUoc2Is
ICJpbm9kZT0lcCIsIGlub2RlKTsKKworCXJldHVybiBpbm9kZTsKK30KKworc3RhdGljIHZvaWQK
K3N1cGVybW91bnRfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVj
dCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgc3VwZXJtb3VudF9pbm9k
ZV9pbmZvICpzaWkgPSBzdXBlcm1vdW50X2koaW5vZGUpOworCisJRU5URVIoc2IsICJpbm9kZT0l
cCIsIGlub2RlKTsKKworCWtmcmVlKHNpaSk7CisKKwlFTlRFUihzYiwgImlub2RlPSVwIiwgaW5v
ZGUpOworfQorCisvKgorICogRklYTUUKKyAqIEkgYW0gc3RpbGwgdW5zdXJlIGlmIChvciB3aHkp
IHRoaXMgZnVuY3Rpb25zIGlzIG5lZWRlZDsgaXQgaXMgbGlrZWx5CisgKiB0byBnbyBhd2F5LiBT
byBmYXIgdGhlIG9ubHkgX3JlYWxfIHVzZXIgc2VlbXMgdG8gYmUga25mc2QuCisgKi8KK3N0YXRp
YyB2b2lkCitzdXBlcm1vdW50X3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBz
eW5jKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qg
c3VwZXJfYmxvY2sgKnN1YnNiOworCXN0cnVjdCBpbm9kZSAqc3ViaTsKKwlzdHJ1Y3QgdmZzbW91
bnQgKnN1Ym1udDsKKworCUVOVEVSKHNiKTsKKworCWlmIChzdWJmc19jaGVja19kaXNrX2NoYW5n
ZShzYikpCisJCWdvdG8gb3V0OworCisJc3VibW50ID0gc3ViZnNfcHJldmVudF91bW91bnQoc2Ip
OworCWlmICghc3VibW50KQorCQlnb3RvIG91dDsKKworCXN1YmkgPSBnZXRfc3ViZnNfaW5vZGUo
aW5vZGUpOworCWlmIChJU19FUlIoc3ViaSkpCisJCWdvdG8gYWxsb3dfdW1vdW50OworCisJc3Vi
c2IgPSBzdWJmc19nZXRfc2Ioc2IpOworCWlmICghc2IpCisJCWdvdG8gcHV0X3N1Ymk7CisKKwlp
ZiAoc3Vic2ItPnNfb3AgJiYgc3Vic2ItPnNfb3AtPndyaXRlX2lub2RlKSB7CisJCWlmIChzdWJm
c19nZXRfYWNjZXNzKGlub2RlLCAxKSkKKwkJCWdvdG8gcHV0X3N1Ymk7CisKKwkJd3JpdGVfaW5v
ZGVfbm93KHN1YmksIHN5bmMpOworCisJCXN1YmZzX3B1dF9hY2Nlc3MoaW5vZGUsIDEpOworCX0K
K3B1dF9zdWJpOgorCWlwdXQoc3ViaSk7CithbGxvd191bW91bnQ6CisJc3ViZnNfYWxsb3dfdW1v
dW50KHNiLCBzdWJtbnQpOworb3V0OgorCUxFQVZFKHNiKTsKKworCXJldHVybjsKK30KKworLyoK
KyAqIEZJWE1FCisgKiBzdWJmc191bW91bnQgaGFzIG5vIGJ1c2luZXNzIGhlcmUKKyAqIGl0IHNo
b3VsZCBiZSBtb3ZlZCBpbnRvIHVtb3VudF9iZWdpbjsgaW4gdGhpcyBjYXNlIGZvcmNlIHVtb3Vu
dCB3aWxsCisgKiBmcmVlIHN1YmZzIChhbmQgZ2l2ZSBmYWxzZSBObyBtZWRpdW0gYXMgZXJyb3Ig
Li4uIG9oLCB3ZWxsKQorICovCitzdGF0aWMgdm9pZAorc3VwZXJtb3VudF9wdXRfc3VwZXIoc3Ry
dWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3VwZXJtb3VudF9zYl9pbmZvICpzYmkg
PSBzdXBlcm1vdW50X3NiaShzYik7CisKKwlFTlRFUihzYik7CisKKwlzdWJmc19sb2NrKHNiKTsK
KwlpZiAoc3ViZnNfaXNfbW91bnRlZChzYikpCisJCXN1YmZzX3Vtb3VudChzYiwgU1VCRlNfVU1O
VF9OT1JNQUwpOworCXN1YmZzX3VubG9jayhzYik7CisKKwlzdXBlcm1vdW50X3Byb2NfcmVtb3Zl
KHNiaSk7CisKKwlMRUFWRShzYik7CisKKwlzYi0+c19mc19pbmZvID0gMDsKKwlmcmVlX3NiaShz
YmkpOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBoYXMgdG8gYmUgZG9uZSBpbiB0d28gc3Rl
cHMgKHVuZm9ydHVuYXRlbHkpCisgKiBGaXJzdCBtYWtlIHN1cmUgaXB1dChzdWJpKSBpcyBydW4g
anVzdCBvbmNlIC0gYW5kIHRoZW4gcHV0CisgKiByZWFkL3dyaXRlIGFjY2VzcyBhbmQgZmluYWxs
eSByZW1vdmUgaW5vZGUgZnJvbSBsaXN0CisgKgorICogV2UgY2FuJ3QgZG8gaXQgaW4gb25lIHNo
b3QgYmVjYXVzZSByZW1vdmluZyBpbm9kZSBmcm9tIGxpc3QKKyAqIHdpbGwgcmVtb3ZlIGFsc28g
cG9zc2liaWxpdHkgdG8gbWFyayBpdCBzdGFsZS4gSXQgaGFzIGJlZW4gCisgKiBpbnRyb2R1Y2Vk
IGJ5IG1lIDooIHJlbW92aW5nIGdlbmVyYXRpb24gbnVtYmVycy4gT1RPSCBzbyBmYXIKKyAqIGl0
IGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgbmVlZHMgZXh0cmEgdHJlYXRtZW50IGJlY2F1c2Ugb2Yg
aXQuCisgKi8KK3N0YXRpYyB2b2lkCitzdXBlcm1vdW50X2NsZWFyX2lub2RlKHN0cnVjdCBpbm9k
ZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVybW91bnRfaW5vZGVfaW5mbyAqc2lpID0gc3VwZXJt
b3VudF9pKGlub2RlKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJ
c3RydWN0IGlub2RlICpzdWJpOworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCisJRU5URVIoc2Is
ICJpbm9kZT0lcCIsIGlub2RlKTsKKworCW1udCA9IHN1YmZzX3ByZXZlbnRfdW1vdW50KHNiKTsK
KwlpZiAoIW1udCkKKwkJZ290byBvdXQ7CisKKwlzdWJmc19sb2NrKHNiKTsKKwlzdWJpID0gc2lp
LT5pbm9kZTsKKwlzaWktPmlub2RlID0gMDsKKwlzdWJmc191bmxvY2soc2IpOworCisKKwlpZiAo
c3ViaSkgeworCQkvKgorCQkgKiB3ZSB1c2VkIHRvIGNoZWNrIGZvciBzdWJpLT5pX2NvdW50ICE9
IDEgaGVyZS4KKwkJICogVGhpcyBkb2VzIG5vdCBhY3R1YWxseSB3b3JrIC0gaXQgaXMgcXVpdGUg
cG9zc2libGUKKwkJICogdGhhdCBpbm9kZSBoYXMgYmVlbiBsb29rZWQgdXAgd2hpbGUgd2Ugd2Vy
ZSBpbiB0aGlzCisJCSAqIGZ1bmN0aW9uLiBTbyBqdXN0IGlnbm9yZSBpdCAodGhlIHdvcnN0IHRo
aW5nIHRoYXQKKwkJICogbWF5IGhhcHBlbiBpcyB0aGF0IHN1YmZzIGNhbm5vdCBiZSByZW1vdW50
ZWQpCisJCSAqLworCisJCWlwdXQoc3ViaSk7CisKKwl9CisJc3ViZnNfYWxsb3dfdW1vdW50KHNi
LCBtbnQpOworCisJLyoKKwkgKiBUaGlzIGRvZXMgbm90IGhhcyBtdWNoIHRvIGRvIHdpdGggc3Vi
ZnMgYnV0IEkgZGlkIG5vdCB3YW50CisJICogdG8gZXhwb3J0IF9fIGZ1bmN0aW9ucworCSAqLwor
CXN1YmZzX2NsZWFyX2lub2RlKGlub2RlKTsKK291dDoKKwlMRUFWRShzYiwgImlub2RlPSVwIiwg
aW5vZGUpOworfQorLyoKKyAqIEZJWE1FIHdoeSBpdCBpcyBuZWVkZWQ/CisgKi8KKworc3RhdGlj
IHZvaWQKK3N1cGVybW91bnRfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sK
KwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKworCUVOVEVSKHNiKTsKKworCWlmIChzdWJmc19jaGVj
a19kaXNrX2NoYW5nZShzYikpCisJCWdvdG8gb3V0OworCisJaWYgKHN1YmZzX2lzX3J3KHNiKSkg
eworCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1YnNiOworCisJCW1udCA9IHN1YmZzX3ByZXZlbnRf
dW1vdW50KHNiKTsKKwkJaWYgKCFtbnQpCisJCQlnb3RvIG91dDsKKworCQlzdWJzYiA9IHN1YmZz
X2dldF9zYihzYik7CisJCWlmIChzdWJzYiAmJiBzdWJzYi0+c19vcCAmJiBzdWJzYi0+c19vcC0+
d3JpdGVfc3VwZXIpCisJCQlzdWJzYi0+c19vcC0+d3JpdGVfc3VwZXIoc3Vic2IpOworCisJCXN1
YmZzX2FsbG93X3Vtb3VudChzYiwgbW50KTsKKwl9CisKK291dDoKKwlMRUFWRShzYik7CisKKwly
ZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKKy8vc3VwZXJtb3VudF9zdGF0ZnMoc3RydWN0IHN1cGVy
X2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3N1cGVybW91bnRfc3RhdGZzKHN0cnVj
dCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKnNiPWRlbnRyeS0+ZF9zYjsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBzdXBlcl9ibG9j
ayAqc3Vic2I7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisKKwlFTlRFUihzYik7CisKKwkodm9p
ZClzdWJmc19jaGVja19kaXNrX2NoYW5nZShzYik7CisKKwltbnQgPSBzdWJmc19wcmV2ZW50X3Vt
b3VudChzYik7CisJaWYgKCFtbnQpCisJCWdvdG8gb3V0OworCisJc3Vic2IgPSBzdWJmc19nZXRf
c2Ioc2IpOworCWlmIChzdWJzYiAmJiBzdWJzYi0+c19vcCAmJiBzdWJzYi0+c19vcC0+c3RhdGZz
KQorCQlyYyA9IHN1YnNiLT5zX29wLT5zdGF0ZnMoZGVudHJ5LCBidWYpOworCWlmICghcmMpCisJ
CWJ1Zi0+Zl90eXBlID0gU1VQRVJNT1VOVF9TVVBFUl9NQUdJQzsKKworCXN1YmZzX2FsbG93X3Vt
b3VudChzYiwgbW50KTsKK291dDoKKwlMRUFWRShzYiwgInJjPSVkIiwgcmMpOworCisJcmV0dXJu
IHJjOworfQorCitzdGF0aWMgaW50CitzdXBlcm1vdW50X3JlbW91bnRfZnMoc3RydWN0IHN1cGVy
X2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwlyZXR1cm4gLUVOT1NZUzsK
K30KKworLyoKKyAqIGJhc2VkIG9uIGZzL250ZnMvaW5vZGUuYzpudGZzX3Nob3dfb3B0aW9ucwor
ICovCitzdGF0aWMgaW50CitzdXBlcm1vdW50X3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUg
KnNmLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlzdHJ1Y3Qgc3VwZXJtb3VudF9zYl9pbmZv
ICpzYmkgPSBzdXBlcm1vdW50X3NiaShtbnQtPm1udF9zYik7CisKKwlzZXFfcHJpbnRmKHNmLCAi
LGRldj0lcyIsIHNiaS0+ZGV2bmFtZSk7CisJc2VxX3B1dHMoc2YsICIsZnM9Iik7CisJaWYgKHNi
aS0+c190eXBlID09IGRlZmF1bHRfZnNfdHlwZXMpCisJCXNlcV9wdXRzKHNmLCAiYXV0byIpOwor
CWVsc2UgCisJCXNlcV9wdXRzKHNmLCBzYmktPnNfdHlwZSk7CisJc2VxX3B1dHMoc2YsICIsdHJh
eV9sb2NrPSIpOworCWlmIChzYmktPnRyYXlfbG9jayA9PSBUUkFZX0xPQ0tfQUxXQVlTKQorCQlz
ZXFfcHV0cyhzZiwgImFsd2F5cyIpOworCWVsc2UgaWYgKHNiaS0+dHJheV9sb2NrID09IFRSQVlf
TE9DS19ORVZFUikKKwkJc2VxX3B1dHMoc2YsICJuZXZlciIpOworCWVsc2UgaWYgKHNiaS0+dHJh
eV9sb2NrID09IFRSQVlfTE9DS19PTldSSVRFKQorCQlzZXFfcHV0cyhzZiwgIm9ud3JpdGUiKTsK
KwllbHNlCisJCVNVUEVSTU9VTlRfQlVHX09OKDEpOworCisJaWYgKHNiaS0+c19kZWJ1ZykKKwkJ
c2VxX3ByaW50ZihzZiwgIixkZWJ1Zz0weCVseCIsIHNiaS0+c19kZWJ1Zyk7CisJaWYgKHNiaS0+
c19kYXRhKQorCQlzZXFfcHJpbnRmKHNmLCAiLC0tLCVzIiwgc2JpLT5zX2RhdGEpOworCXJldHVy
biAwOworfQorCisvKgorICogLT5yZWFkX2lub2RlOglub3QgbmVlZGVkCisgKiAtPmRpcnR5X2lu
b2RlOglwcm9iYWJseSBub3QgbmVlZGVkLiBJdCBhcHBlYXJzIFZGUyBsYXllciBuZXZlcgorICog
IAkJCWNhbGxzIG1hcmtfaW5vZGVfZGlydHkgaXRzZWxmOyBleGNlcHRpb24gaXMKKyAqICAJCQlV
UERBVEVfQVRJTUUgYW5kIGl0IGlzIGFscmVhZHkgaGFuZGxlZCBzcGVjaWFsbHkKKyAqICAJCQlG
SVhNRQorICogIAkJCUl0IG1heSBiZSBuZWVkZWQgZm9yIGtuZnNkIGFuZCBzaW1pbGFyCisgKiAt
PnB1dF9pbm9kZToJCW5vdCBuZWVkZWQKKyAqIC0+ZGVsZXRlX2lub2RlOglub3QgbmVlZGVkCisg
KiAtPndyaXRlX3N1cGVyOglGSVhNRSBub3QgbmVlZGVkLCB3ZSBkbyBub3QgaGF2ZSBhbnkgYmFj
a2luZyBzdG9yZQorICogLT5zeW5jX2ZzOgkJbm90IG5lZWRlZAorICogLT53cml0ZV9zdXBlcl9s
b2NrZnM6bm90IG5lZWRlZAorICogLT51bmxvY2tmczoJCW5vdCBuZWVkZWQKKyAqIC0+dW1vdW50
X2JlZ2luOglUT0RPIG1heWJlIHRvIG1vdmUgc3ViZnNfdW1vdW50IGF3YXlzIGZyb20gcHV0X3N1
cGVyCisgKiAtPmZoX3RvX2RlbnRyeToJVE9ETyBtYXkgYmUKKyAqIC0+ZGVudHJ5X3RvX2ZoOglU
T0RPIG1heSBiZQorICovCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc3VwZXJtb3Vu
dF9zb3BzID0geworCS5hbGxvY19pbm9kZQk9IHN1cGVybW91bnRfYWxsb2NfaW5vZGUsCisJLmRl
c3Ryb3lfaW5vZGUJPSBzdXBlcm1vdW50X2Rlc3Ryb3lfaW5vZGUsCisJLndyaXRlX2lub2RlCT0g
c3VwZXJtb3VudF93cml0ZV9pbm9kZSwKKwkuY2xlYXJfaW5vZGUJPSBzdXBlcm1vdW50X2NsZWFy
X2lub2RlLAorCS5wdXRfc3VwZXIJPSBzdXBlcm1vdW50X3B1dF9zdXBlciwKKwkud3JpdGVfc3Vw
ZXIJPSBzdXBlcm1vdW50X3dyaXRlX3N1cGVyLAorCS5zdGF0ZnMJCT0gc3VwZXJtb3VudF9zdGF0
ZnMsCisJLnJlbW91bnRfZnMJPSBzdXBlcm1vdW50X3JlbW91bnRfZnMsCisJLnNob3dfb3B0aW9u
cwk9IHN1cGVybW91bnRfc2hvd19vcHRpb25zLAorfTsKZGlmZiAtdXJOIGxpbnV4LTIuNi4yNS40
Lm9yaWcvZnMvc3VwZXJtb3VudC9zdXBlcm1vdW50LmggbGludXgtMi42LjI1LjQvZnMvc3VwZXJt
b3VudC9zdXBlcm1vdW50LmgKLS0tIGxpbnV4LTIuNi4yNS40Lm9yaWcvZnMvc3VwZXJtb3VudC9z
dXBlcm1vdW50LmgJMTk3MC0wMS0wMSAwMzowMDowMCArMDMwMAorKysgbGludXgtMi42LjI1LjQv
ZnMvc3VwZXJtb3VudC9zdXBlcm1vdW50LmgJMjAwOC0wNS0yMCAwMToyNzo1MyArMDMwMApAQCAt
MCwwICsxLDUwOCBAQAorI2lmbmRlZiBfU1VQRVJNT1VOVF9JX0gKKyNkZWZpbmUgX1NVUEVSTU9V
TlRfSV9ICisKKy8qCisgKiAgJElkOiBzdXBlcm1vdW50LmgsdiAxLjQyLjIuMjkgMjAwNC8wMS8x
OCAxODo0NDoyNSBib3IgRXhwICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cisj
aW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2lu
Y2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRl
IDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9m
aWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Cisj
aW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Cisj
aW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+Cisj
aW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgor
I2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNs
dWRlIDxsaW51eC9zdXBlcm1vdW50X21lZGlhLmg+CisKKyNpZmRlZiBDT05GSUdfU1VQRVJNT1VO
VF9ERUJVRworI2RlZmluZSBTVVBFUk1PVU5UX0RFQlVHCisjZW5kaWYKKy8qCisgKiBUaGUgc3Vw
ZXJtb3VudCBzdXBlcmJsb2NrIG1hZ2ljIG51bWJlcgorICovCisKKyNkZWZpbmUgU1VQRVJNT1VO
VF9TVVBFUl9NQUdJQwkweDlmYTEKKyNkZWZpbmUgU1VQRVJNT1VOVF9WRVJTSU9OCQkiMi4wLjQi
CisKKyNkZWZpbmUgU19EQkdfREVCVUcJCQkweDAwMQorI2RlZmluZSBTX0RCR19UUkFDRV9ERU5U
UlkJCTB4MDAyCisjZGVmaW5lIFNfREJHX1RSQUNFX0ZJTEUJCTB4MDA0CisjZGVmaW5lIFNfREJH
X1RSQUNFX0ZJTEVNQVAJCTB4MDA4CisjZGVmaW5lIFNfREJHX1RSQUNFX01FRElBQ1RMCQkweDAx
MAorI2RlZmluZSBTX0RCR19UUkFDRV9OQU1FSQkJMHgwMjAKKyNkZWZpbmUgU19EQkdfVFJBQ0Vf
U1VCRlMJCTB4MDQwCisjZGVmaW5lIFNfREJHX1RSQUNFX1NVUEVSCQkweDA4MAorCisvKgorICog
VGhlIHN1YmZzIHVtb3VudCByZWFzb24KKyAqLworI2RlZmluZSBTVUJGU19VTU5UX05PUk1BTAkJ
MCAvKiBub3JtYWwgdW1vdW50ICovCisjZGVmaW5lIFNVQkZTX1VNTlRfTUVESUEJCTEgLyogbWVk
aWEgY2hhbmdlIGRldGVjdGVkICovCisjZGVmaW5lIFNVQkZTX1VNTlRfVVNFUgkJCTIgLyogdXNl
ciByZXF1ZXN0ICovCisKKy8qCisgKiBXaGVuIHRvIGxvY2sgbWVkaWEKKyAqLworI2RlZmluZSBU
UkFZX0xPQ0tfTkVWRVIJCQkwCisjZGVmaW5lIFRSQVlfTE9DS19PTldSSVRFCQkxCisjZGVmaW5l
IFRSQVlfTE9DS19BTFdBWVMJCTIKKworZXh0ZXJuIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHN1
cGVybW91bnRfZnNfdHlwZTsKKworI2lmZGVmIFNVUEVSTU9VTlRfREVCVUcKKworI2RlZmluZSBT
VVBFUk1PVU5UX0JVR19PTih4KSBCVUdfT04oeCkKKyNkZWZpbmUgU1VQRVJNT1VOVF9CVUdfTE9D
S0VEX09OKHNiLCB4KSBcCitkbyB7IFwKKwlpZiAoeCkgeyBcCisJCXN1YmZzX3VubG9jayhzYik7
IFwKKwkJQlVHKCk7IFwKKwl9IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgc3VwZXJtb3VudF9k
ZWJ1ZyhzYiwgYXJncy4uLikgXAorZG8geyBcCisJc3RydWN0IHN1cGVybW91bnRfc2JfaW5mbyAq
c2JpID0gc3VwZXJtb3VudF9zYmkoc2IpOyBcCisJY2hhciAqZGV2ID0gc2JpLT5kZXZuYW1lID8g
c2JpLT5kZXZuYW1lIDogInVua25vd24iOyBcCitcCisJaWYgKHN1cGVybW91bnRfZGJnKHNiLCBT
X0RCR19ERUJVRykpIHsgXAorCQlwcmludGsoIiVzU1VQRVJNT1VOVCBERUJVRyBbZGV2PSVzXSA8
JXM6JWQ+ICIsIFwKKwkJCUtFUk5fREVCVUcsIGRldiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7
IFwKKwkJcHJpbnRrKGFyZ3MpOyBcCisJCXByaW50aygiXG4iKTsgXAorCX0gXAorfSB3aGlsZSgw
KQorCisjZGVmaW5lIEVOVEVSKHNiLCBhcmdzLi4uKSBcCitkbyB7IFwKKwlzdHJ1Y3Qgc3VwZXJt
b3VudF9zYl9pbmZvICpzYmkgPSBzdXBlcm1vdW50X3NiaShzYik7IFwKKwljaGFyICpkZXYgPSBz
YmktPmRldm5hbWUgPyBzYmktPmRldm5hbWUgOiAidW5rbm93biI7IFwKK1wKKwlpZiAoc3VwZXJt
b3VudF9kYmcoc2IsIFNfREJHX1RSQUNFX0NVUlJFTlQpKSB7IFwKKwkJcHJpbnRrKCIlc1NVUEVS
TU9VTlQgVFJBQ0UgW2Rldj0lc10gUElEPSVsdSBFTlRFUiAlcyIsIFwKKwkJCUtFUk5fREVCVUcs
IGRldiwgKHVuc2lnbmVkIGxvbmcpY3VycmVudC0+cGlkLCBcCisJCQlfX0ZVTkNUSU9OX18pOyBc
CisJCXByaW50aygiICIgYXJncyk7IFwKKwkJcHJpbnRrKCJcbiIpOyBcCisJfSBcCit9IHdoaWxl
ICgwKQorCisjZGVmaW5lIExFQVZFKHNiLCBhcmdzLi4uKSBcCitkbyB7IFwKKwlzdHJ1Y3Qgc3Vw
ZXJtb3VudF9zYl9pbmZvICpzYmkgPSBzdXBlcm1vdW50X3NiaShzYik7IFwKKwljaGFyICpkZXYg
PSBzYmktPmRldm5hbWUgPyBzYmktPmRldm5hbWUgOiAidW5rbm93biI7IFwKK1wKKwlpZiAoc3Vw
ZXJtb3VudF9kYmcoc2IsIFNfREJHX1RSQUNFX0NVUlJFTlQpKSB7IFwKKwkJcHJpbnRrKCIlc1NV
UEVSTU9VTlQgVFJBQ0UgW2Rldj0lc10gUElEPSVsdSBMRUFWRSAlcyIsIFwKKwkJCUtFUk5fREVC
VUcsIGRldiwgKHVuc2lnbmVkIGxvbmcpY3VycmVudC0+cGlkLCBcCisJCQlfX0ZVTkNUSU9OX18p
OyBcCisJCXByaW50aygiICIgYXJncyk7IFwKKwkJcHJpbnRrKCJcbiIpOyBcCisJfSBcCit9IHdo
aWxlICgwKQorCisjZWxzZSAvKiBTVVBFUk1PVU5UX0RFQlVHICovCisjZGVmaW5lIHN1cGVybW91
bnRfZGVidWcoZiwgYS4uLikgLyoqLworI2RlZmluZSBTVVBFUk1PVU5UX0JVR19PTih4KSBkbyB7
IH0gd2hpbGUgKDApCisjZGVmaW5lIFNVUEVSTU9VTlRfQlVHX0xPQ0tFRF9PTihzYiwgeCkgZG8g
eyB9IHdoaWxlICgwKQorCisjZGVmaW5lIEVOVEVSKHNiLCBhcmdzLi4uKSBkbyB7ICh2b2lkKXNi
OyB9IHdoaWxlICgwKQorI2RlZmluZSBMRUFWRShzYiwgYXJncy4uLikgZG8geyAodm9pZClzYjsg
fSB3aGlsZSAoMCkKKyNlbmRpZgkJCQkvKiBTVVBFUk1PVU5UX0RFQlVHICovCisKKyNkZWZpbmUg
c3VwZXJtb3VudF93YXJuaW5nKHNiLCAuLi4pIFwKK2RvIHsgXAorCXN0cnVjdCBzdXBlcm1vdW50
X3NiX2luZm8gKnNiaSA9IHN1cGVybW91bnRfc2JpKHNiKTsgXAorCWNoYXIgKmRldiA9IHNiaS0+
ZGV2bmFtZSA/IHNiaS0+ZGV2bmFtZSA6ICJ1bmtub3duIjsgXAorXAorCXByaW50aygiJXNTVVBF
Uk1PVU5UIFdBUk5JTkcgW2Rldj0lc10gIiwgS0VSTl9XQVJOSU5HLCBkZXYpOyBcCisJcHJpbnRr
KF9fVkFfQVJHU19fKTsgXAorCXByaW50aygiXG4iKTsgXAorfSB3aGlsZSgwKQorCisjZGVmaW5l
IHN1cGVybW91bnRfZXJyb3Ioc2IsIC4uLikgXAorZG8geyBcCisJc3RydWN0IHN1cGVybW91bnRf
c2JfaW5mbyAqc2JpID0gc3VwZXJtb3VudF9zYmkoc2IpOyBcCisJY2hhciAqZGV2ID0gc2JpLT5k
ZXZuYW1lID8gc2JpLT5kZXZuYW1lIDogInVua25vd24iOyBcCitcCisJcHJpbnRrKCIlc1NVUEVS
TU9VTlQgRVJST1IgW2Rldj0lc10gIiwgS0VSTl9FUlIsIGRldik7IFwKKwlwcmludGsoX19WQV9B
UkdTX18pOyBcCisJcHJpbnRrKCJcbiIpOyBcCit9IHdoaWxlKDApCisKKy8qCisgKiBUaGUgZm9s
bG93aW5nIGlzIGRyaXZlZCBmcm9tIGZzL2lub2RlLmM6dXBkYXRlX2F0aW1lKCkKKyAqLworLyoj
ZGVmaW5lIE5FRURfV1JJVEVfQVRJTUUoaW5vZGUpIFwKKyAgICAoIShpbm9kZS0+aV9mbGFncyAm
IFNfTk9BVElNRSkgfHwgXAorCSAgICAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19OT0FUSU1F
KSB8fCBcCisJICAgICgoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19OT0RJUkFUSU1FKSAmJiBT
X0lTRElSKGlub2RlLT5pX21vZGUpKSkKKyovCisjZGVmaW5lIE5FRURfV1JJVEVfQVRJTUUoaW5v
ZGUpIFwKKwkoISgoaW5vZGUtPmlfZmxhZ3MgJiBTX05PQVRJTUUpIHx8IFwKKwkgKChpbm9kZS0+
aV9zYi0+c19mbGFncyAmIE1TX05PRElSQVRJTUUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkp
IHx8IFwKKwkgSVNfUkRPTkxZKGlub2RlKSkpCisKKy8qCisjZGVmaW5lIE5FRURfV1JJVEVfQVRJ
TUUoaW5vZGUpIFwKKwkoIShJU19OT0FUSU1FKGlub2RlKSB8fCBcCisJIChJU19OT0RJUkFUSU1F
KGlub2RlKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSB8fCBcCisJIElTX1JET05MWShpbm9k
ZSkpKQorKi8KKworLyoKKyAqIHN1cGVybW91bnQgc3VwZXItYmxvY2sgZGF0YSBpbiBtZW1vcnkK
KyAqLworc3RydWN0IHN1cGVybW91bnRfc2JfaW5mbzsKK3N0cnVjdCBzdXBlcm1vdW50X3NiX2lu
Zm8geworCS8qID09IG9wdGlvbnMgPT0gKi8KKwl1bnNpZ25lZCBsb25nIHNfZGVidWc7CS8qIGRl
YnVnIGZsYWdzIFNfREJHXyogKi8KKwljaGFyICpzX3R5cGU7CQkvKiBUeXBlIG9mIGZzIHRvIGJl
IHN1Yi1tb3VudGVkICovCisJY2hhciAqZGV2bmFtZTsJCS8qIFdoZXJlIHRvIG1vdW50IHRoZSBz
dWJmcyBmcm9tICovCisJY2hhciAqc19kYXRhOwkJLyogRGF0YSB0byBwYXNzIHdoZW4gbW91bnRp
bmcgc3ViZnMgKi8KKwkvKiA9PSBlbmQgb2Ygb3B0aW9ucyA9PSAqLworCXN0cnVjdCB2ZnNtb3Vu
dCAqc191bmRlcm1vdW50OworCQkJCS8qIE1vdW50IHBvaW50IGZvciBzdWJmcyAqLworCWludCBy
ZWFkY291bnQ7CQkvKiBSZWZjb3VudCBvZiByZWFkIGFjY2VzcworCQkJCSAgIG9uIHRoZSBmaWxl
c3lzdGVtICovCisJaW50IHdyaXRlY291bnQ7CQkvKiBSZWZjb3VudCBvZiB3cml0ZSBhY2Nlc3MK
KwkJCQkgICBvbiB0aGUgZmlsZXN5c3RlbSAqLworCWludCBsb2NrY291bnQ7CQkvKiBSZWZjb3Vu
dCBvZiByZXF1ZXN0cyB0byBsb2NrIHRyYXkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNfaW5vZGVz
OworCQkJCS8qIGxpc3Qgb2YgYWN0aXZlIGlub2RlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgc19m
aWxlczsKKwkJCQkvKiBsaXN0IG9mIGFjdGl2ZSBmaWxlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQg
c19kZW50cmllczsKKwkJCQkvKiBsaXN0IG9mIGFjdGl2ZSBkZW50cmllcyAqLworCXN0cnVjdCBz
ZW1hcGhvcmUgc2VtOworCXN0cnVjdCBzdXBlcl9ibG9jayAqaG9zdDsKKwkJCQkvKiBuZWVkZWQg
Zm9yIHByb2NmcyBzdXBwb3J0ICovCisJc3RydWN0IHN1cGVybW91bnRfc2JfaW5mbyAqbmV4dDsK
KwkJCQkvKiBsaXN0IG9mIGFsbCBzdXBlcm1vdW50IGZzICovCisJdW5zaWduZWQgaW50IHRyYXlf
bG9jazoyOworCXVuc2lnbmVkIGludCBkaXNhYmxlZDoxOworCXVuc2lnbmVkIGludCBydzoxOwor
fTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3VwZXJtb3VudF9zYl9pbmZvICoKK3N1cGVybW91
bnRfc2JpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHN1cGVybW91bnRfc2Jf
aW5mbyAqc2JpOworCUJVR19PTighc2IpOworCUJVR19PTihzYi0+c190eXBlICE9ICZzdXBlcm1v
dW50X2ZzX3R5cGUpOworCisJc2JpID0gKHN0cnVjdCBzdXBlcm1vdW50X3NiX2luZm8gKikgKHNi
LT5zX2ZzX2luZm8pOworCUJVR19PTighc2JpKTsKKworCXJldHVybiBzYmk7Cit9CisKK3N0YXRp
YyBpbmxpbmUgc3RydWN0IHZmc21vdW50ICoKK3N1YmZzX21udChzdHJ1Y3Qgc3VwZXJfYmxvY2sg
KnNiKQoreworCXJldHVybiBzdXBlcm1vdW50X3NiaShzYiktPnNfdW5kZXJtb3VudDsKK30KKwor
c3RhdGljIGlubGluZSBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKgorc3ViZnNfc2Ioc3RydWN0IHN1cGVy
X2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IHN1YmZzX21udChzYik7CisK
KwlpZiAobW50KSByZXR1cm4gbW50LT5tbnRfc2I7CisKKwlyZXR1cm4gMDsKK30KKworLyogdGhp
cyBpcyBleHBlY3RlZCB0byBydW4gdW5kZXIgc2ItPnNlbSAqLworc3RhdGljIGlubGluZSBpbnQK
K3N1YmZzX2lzX21vdW50ZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3Vw
ZXJtb3VudF9zYl9pbmZvICpzYmkgPSBzdXBlcm1vdW50X3NiaShzYik7CisKKwlyZXR1cm4gc2Jp
LT5zX3VuZGVybW91bnQgIT0gMDsKK30KKworLyogdGhpcyBpcyBleHBlY3RlZCB0byBydW4gdW5k
ZXIgc2ItPnNlbSAqLworc3RhdGljIGlubGluZSBpbnQKK3N1YmZzX2lzX2J1c3koc3RydWN0IHN1
cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IHN1YmZzX21udChzYik7
CisKKwkvKgorCSAqIEluICJub3JtYWwiIGNhc2UgbW50X2NvdW50IGlzIDIuIEJ1dCB3ZSBjdXJy
ZW50bHkgZG8KKwkgKiBub3QgaW5zZXJ0IHN1YmZzIGludG8gdGFzayBuYW1lc3BhY2Ugc28gY291
bnQgaXMgMQorCSAqIEZJWE1FCisJICogVGhpcyBhbHNvIG1lYW5zIHdlIGRvIG5vdCBkb191bW91
bnQgaS5lLiBkbyBub3QgcnVuCisJICogZWl0aGVyIHVtb3VudF9iZWdpbiBvciBEUVVPVF9PRkYg
Zm9yIHN1YmZzLgorCSAqLworCWlmIChtbnQpIHJldHVybiBhdG9taWNfcmVhZCgmbW50LT5tbnRf
Y291bnQpID4gMTsKKworCXJldHVybiAwOworfQorCisvKiB0aGlzIGlzIGV4cGVjdGVkIHRvIHJ1
biB1bmRlciBzYi0+c2VtICovCitzdGF0aWMgaW5saW5lIGludAorc3ViZnNfaXNfcncoc3RydWN0
IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1YnNiOworCisJaWYg
KCFzdWJmc19pc19tb3VudGVkKHNiKSkKKwkJcmV0dXJuIDA7CisJCisJc3Vic2IgPSBzdWJmc19z
YihzYik7CisJcmV0dXJuICEoc3Vic2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpOworfQorCitzdGF0
aWMgaW5saW5lIHZvaWQKK3N1YmZzX2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlz
dHJ1Y3Qgc3VwZXJtb3VudF9zYl9pbmZvICpzYmkgPSBzdXBlcm1vdW50X3NiaShzYik7CisKKwlk
b3duKCZzYmktPnNlbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3ViZnNfdW5sb2NrKHN0
cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHN1cGVybW91bnRfc2JfaW5mbyAqc2Jp
ID0gc3VwZXJtb3VudF9zYmkoc2IpOworCisJdXAoJnNiaS0+c2VtKTsKK30KKworLyoKKyAqIHF1
ZXJ5IGRlYnVnIGZsYWdzIHNldAorICovCitzdGF0aWMgaW5saW5lIGludCBzdXBlcm1vdW50X2Ri
ZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVj
dCBzdXBlcm1vdW50X3NiX2luZm8gKnNiaSA9IHN1cGVybW91bnRfc2JpKHNiKTsKKworCXJldHVy
biBzYmktPnNfZGVidWcgJiBmbGFnczsKK30KKworLyoKKyAqIHN1cGVybW91bnQgaW5vZGUgaW5m
bworICovCisKK3N0cnVjdCBzdXBlcm1vdW50X2lub2RlX2luZm8geworCXN0cnVjdCBsaXN0X2hl
YWQgbGlzdDsKKyAgCXN0cnVjdCBpbm9kZSAqaW5vZGU7CS8qIHN1YmZzIGlub2RlICovCisJaW50
IHJlYWRjb3VudDsKKwlpbnQgd3JpdGVjb3VudDsKKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOwkv
KiBzdXBlcmZzIGlub2RlICovCit9OworCitzdGF0aWMgaW5saW5lIGludAoraXNfaW5vZGVfc3Vw
ZXJtb3VudGVkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGlub2RlICYmIGlub2Rl
LT5pX3NiICYmIGlub2RlLT5pX3NiLT5zX3R5cGUgPT0gJnN1cGVybW91bnRfZnNfdHlwZTsKK30K
Kworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3VwZXJtb3VudF9pbm9kZV9pbmZvICoKK3N1cGVybW91
bnRfaShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCVNVUEVSTU9VTlRfQlVHX09OKCFpc19pbm9k
ZV9zdXBlcm1vdW50ZWQoaW5vZGUpKTsKKworCXJldHVybiBsaXN0X2VudHJ5KGlub2RlLCBzdHJ1
Y3Qgc3VwZXJtb3VudF9pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5l
IGludAoraXNfaW5vZGVfb2Jzb2xldGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qg
c3VwZXJtb3VudF9pbm9kZV9pbmZvICpzaWkgPSBzdXBlcm1vdW50X2koaW5vZGUpOworCisJcmV0
dXJuIHNpaS0+aW5vZGUgPT0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzdXBlcm1vdW50
X2xpc3RfYWRkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVybW91
bnRfaW5vZGVfaW5mbyAqc2lpID0gc3VwZXJtb3VudF9pKGlub2RlKTsKKworCWxpc3RfYWRkKCYo
c2lpLT5saXN0KSwgJihzdXBlcm1vdW50X3NiaShpbm9kZS0+aV9zYiktPnNfaW5vZGVzKSk7Cit9
CisKKy8qCisgKiBGSVhNRQorICogU2hvdWxkIHdlIHByb3BhZ2F0ZSBhbGwgZmxhZ3M/ICpfUVVP
VEEgbG9va3MgdmVyeSBwb3NzaWJsZSBjYW5kaWRhdGUKKyAqIFdlIGNhbid0IGp1c3QgYXNzaWdu
IHRoZW0gYmVjYXVzZSBvdGhlciBmbGFncyBtYXkgYmUgc2V0IGJ5IFZGUworICovCisjZGVmaW5l
IFNNTlRfSU5PREVfRkxBR1MgKFNfSU1NVVRBQkxFfFNfTk9BVElNRXxTX0FQUEVORHxTX1NZTkMp
CitzdGF0aWMgaW5saW5lIHZvaWQKK3NldF9pbm9kZV9mbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2Rl
LCBzdHJ1Y3QgaW5vZGUgKnN1YmkpCit7CisJaW5vZGUtPmlfZmxhZ3MgJj0gflNNTlRfSU5PREVf
RkxBR1M7CisJaWYgKHN1YmkpCisJCWlub2RlLT5pX2ZsYWdzIHw9IChzdWJpLT5pX2ZsYWdzICYg
U01OVF9JTk9ERV9GTEFHUyk7Cit9CisKKy8qCisgKiBzdXBlcm1vdW50IGRlbnRyeSBpbmZvCisg
Ki8KKworc3RydWN0IHN1cGVybW91bnRfZGVudHJ5X2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQg
bGlzdDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGRlbnRyeSAqaG9zdDsKK307
CisKK3N0YXRpYyBpbmxpbmUgaW50Citpc19kZW50cnlfc3VwZXJtb3VudGVkKHN0cnVjdCBkZW50
cnkgKmRlbnRyeSkKK3sKKwlyZXR1cm4gKGRlbnRyeSAmJiBkZW50cnktPmRfc2IgJiYgZGVudHJ5
LT5kX3NiLT5zX3R5cGUgPT0gJnN1cGVybW91bnRfZnNfdHlwZSk7Cit9CisKK3N0YXRpYyBpbmxp
bmUgc3RydWN0IHN1cGVybW91bnRfZGVudHJ5X2luZm8gKgorc3VwZXJtb3VudF9kKHN0cnVjdCBk
ZW50cnkgKmRlbnRyeSkKK3sKKwlTVVBFUk1PVU5UX0JVR19PTighaXNfZGVudHJ5X3N1cGVybW91
bnRlZChkZW50cnkpKTsKKwlTVVBFUk1PVU5UX0JVR19PTighZGVudHJ5LT5kX2ZzZGF0YSk7CisK
KwlyZXR1cm4gIChzdHJ1Y3Qgc3VwZXJtb3VudF9kZW50cnlfaW5mbyAqKWRlbnRyeS0+ZF9mc2Rh
dGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citpc19kZW50cnlfb2Jzb2xldGUoc3RydWN0IGRl
bnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzdXBlcm1vdW50X2RlbnRyeV9pbmZvICpzZGkgPSBz
dXBlcm1vdW50X2QoZGVudHJ5KTsKKworCXJldHVybiBzZGktPmRlbnRyeSA9PSAwOworfQorCisv
KgorICogU3VwZXJtb3VudCBmaWxlIGluZm8gCisgKi8KKworc3RydWN0IHN1cGVybW91bnRfZmls
ZV9pbmZvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IGZpbGUgKgkJaG9zdDsK
KwlzdHJ1Y3QgZmlsZQkJKmZpbGU7CisJcGlkX3QJCQlvd25lcjsKKwlzdHJ1Y3Qgdm1fb3BlcmF0
aW9uc19zdHJ1Y3QgKnZtX29wczsKKwl1bnNpZ25lZCBpbnQJCWZha2U6MTsKK307CisKK3N0YXRp
YyBpbmxpbmUgaW50Citpc19maWxlX3N1cGVybW91bnRlZChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sK
KwlyZXR1cm4gZmlsZSAmJiBmaWxlLT5mX2RlbnRyeSAmJiBpc19kZW50cnlfc3VwZXJtb3VudGVk
KGZpbGUtPmZfZGVudHJ5KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3VwZXJtb3VudF9m
aWxlX2luZm8gKgorc3VwZXJtb3VudF9mKHN0cnVjdCBmaWxlICpmaWxlKQoreworCVNVUEVSTU9V
TlRfQlVHX09OKCFpc19maWxlX3N1cGVybW91bnRlZChmaWxlKSk7CisJU1VQRVJNT1VOVF9CVUdf
T04oIWZpbGUtPmZfc3VwZXJtb3VudCk7CisKKwlyZXR1cm4gIGZpbGUtPmZfc3VwZXJtb3VudDsK
K30KKworc3RhdGljIGlubGluZSBpbnQKK2lzX2ZpbGVfb2Jzb2xldGUoc3RydWN0IGZpbGUgKmZp
bGUpCit7CisJc3RydWN0IHN1cGVybW91bnRfZmlsZV9pbmZvICpzZmkgPSBzdXBlcm1vdW50X2Yo
ZmlsZSk7CisKKwlyZXR1cm4gc2ZpLT5maWxlID09IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUg
aW50Citpc19maWxlX2Zha2Uoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHN1cGVybW91
bnRfZmlsZV9pbmZvICpzZmkgPSBzdXBlcm1vdW50X2YoZmlsZSk7CisKKwlyZXR1cm4gc2ZpLT5m
YWtlOworfQorCisvKiBkZW50cnkuYyAqLworZXh0ZXJuIHJ3bG9ja190IGRfY29tcGFyZV9sb2Nr
OworZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBzdXBlcm1vdW50X2RvcHM7CitleHRl
cm4gaW50IGluaXRfZGVudHJ5X2luZm8oc3RydWN0IGRlbnRyeSAqKTsKK2V4dGVybiB2b2lkIGF0
dGFjaF9zdWJmc19kZW50cnkoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworZXh0
ZXJuIHN0cnVjdCBkZW50cnkgKmdldF9zdWJmc19kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5
KTsKKyAKKy8qIGZpbGUuYyAqLworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3VwZXJt
b3VudF9kaXJfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN1cGVy
bW91bnRfZmlsZV9vcGVyYXRpb25zOworCisvKiBmaWxlbWFwLmMgKi8KK2V4dGVybiBzdHJ1Y3Qg
dm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3VwZXJtb3VudF92bV9vcHM7CitleHRlcm4gaW50IHN1cGVy
bW91bnRfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsK
K2V4dGVybiBzdHJ1Y3QgZmlsZSAqZ2V0X3N1YmZzX2ZpbGUoc3RydWN0IGZpbGUqKTsKKworLyog
bWVkaWFjdGwuYyAqLworZXh0ZXJuIHZvaWQgc3VwZXJtb3VudF9tZWRpYWN0bChzdHJ1Y3Qgc3Vw
ZXJfYmxvY2sgKiwgaW50LCBpbnQpOworc3RhdGljIGlubGluZSB2b2lkCitzdXBlcm1vdW50X2xv
Y2tfZG9vcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN1cGVybW91bnRfbWVkaWFjdGwo
c2IsIE1FRElBX0xPQ0ssIDEpOworfQorc3RhdGljIGlubGluZSB2b2lkCitzdXBlcm1vdW50X3Vu
bG9ja19kb29yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3VwZXJtb3VudF9tZWRpYWN0
bChzYiwgTUVESUFfVU5MT0NLLCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCittYXJrX21l
ZGlhX3N1cGVybW91bnRlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN1cGVybW91bnRf
bWVkaWFjdGwoc2IsIFNVUEVSTU9VTlRfSU5DX0NPVU5ULCAwKTsKKwlzdXBlcm1vdW50X21lZGlh
Y3RsKHNiLCBNRURJQV9VTkxPQ0ssIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3VubWFy
a19tZWRpYV9zdXBlcm1vdW50ZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdXBlcm1v
dW50X21lZGlhY3RsKHNiLCBTVVBFUk1PVU5UX0RFQ19DT1VOVCwgMCk7Cit9CisKKy8qIG5hbWVp
LmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzdXBlcm1vdW50X2Rpcl9pb3Bz
OworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHN1cGVybW91bnRfZmlsZV9pb3BzOwor
ZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHN1cGVybW91bnRfc3ltbGlua19pb3BzOwor
ZXh0ZXJuIHN0cnVjdCBpbm9kZSAqY3JlYXRlX3N1cGVybW91bnRfaW5vZGUoc3RydWN0IHN1cGVy
X2Jsb2NrICopOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqZ2V0X3N1YmZzX2lub2RlKHN0cnVjdCBp
bm9kZSAqaW5vZGUpOworCisvKiBwcm9jLmMgKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworZXh0
ZXJuIHZvaWQgc3VwZXJtb3VudF9wcm9jX3JlZ2lzdGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgc3Vw
ZXJtb3VudF9wcm9jX3VucmVnaXN0ZXIodm9pZCk7CitleHRlcm4gdm9pZCBzdXBlcm1vdW50X3By
b2NfaW5zZXJ0KHN0cnVjdCBzdXBlcm1vdW50X3NiX2luZm8gKik7CitleHRlcm4gdm9pZCBzdXBl
cm1vdW50X3Byb2NfcmVtb3ZlKHN0cnVjdCBzdXBlcm1vdW50X3NiX2luZm8gKik7CisjZWxzZQor
I2RlZmluZSBzdXBlcm1vdW50X3Byb2NfcmVnaXN0ZXIoKSBkbyB7IH0gd2hpbGUoMCkKKyNkZWZp
bmUgc3VwZXJtb3VudF9wcm9jX3VucmVnaXN0ZXIoKSBkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUg
c3VwZXJtb3VudF9wcm9jX2luc2VydChzYmkpIGRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBzdXBl
cm1vdW50X3Byb2NfcmVtb3ZlKHNiaSkgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworLyogc3Vi
ZnMuYyAqLworZXh0ZXJuIHZvaWQgc3ViZnNfdW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2Is
IGludCk7CitleHRlcm4gc3RydWN0IHZmc21vdW50ICpzdWJmc19nb19vbmxpbmUoc3RydWN0IHN1
cGVyX2Jsb2NrICopOworZXh0ZXJuIHZvaWQgc3ViZnNfZ29fb2ZmbGluZShzdHJ1Y3Qgc3VwZXJf
YmxvY2sgKiwgc3RydWN0IHZmc21vdW50ICopOworZXh0ZXJuIGludCBzdWJmc19nZXRfYWNjZXNz
KHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgc3ViZnNfcHV0X2FjY2VzcyhzdHJ1
Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiBpbnQgc3ViZnNfY2hlY2tfZGlza19jaGFuZ2Uoc3Ry
dWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIHN0cnVjdCB2ZnNtb3VudCAqc3ViZnNfcHJldmVu
dF91bW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIHZvaWQgc3ViZnNfYWxsb3df
dW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgdmZzbW91bnQgKik7CitleHRlcm4g
c3RydWN0IHZmc21vdW50ICpzdWJmc19nZXRfbW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwor
ZXh0ZXJuIHN0cnVjdCBzdXBlcl9ibG9jayAqc3ViZnNfZ2V0X3NiKHN0cnVjdCBzdXBlcl9ibG9j
ayAqc2IpOworZXh0ZXJuIHZvaWQgc3ViZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOwor
CisvKiBzdXBlci5jICovCitleHRlcm4gc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlcm1vdW50X2dl
dF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgdm9pZCAq
LHN0cnVjdCB2ZnNtb3VudCAqbW50KTsKK2V4dGVybiB2b2lkIGF0dGFjaF9zdWJmc19pbm9kZShz
dHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgc3VwZXJtb3VudF9p
bml0X3Jvb3RfaW5vZGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIGNoYXIgKnN0cmR1cChjb25z
dCBjaGFyICopOworCisjZW5kaWYJCQkJLyogX1NVUEVSTU9VTlRfSV9IICovCmRpZmYgLXVyTiBs
aW51eC0yLjYuMjUuNC5vcmlnL2ZzL3VkZi9zdXBlci5jIGxpbnV4LTIuNi4yNS40L2ZzL3VkZi9z
dXBlci5jCi0tLSBsaW51eC0yLjYuMjUuNC5vcmlnL2ZzL3VkZi9zdXBlci5jCTIwMDgtMDQtMTgg
MDE6MjA6MTAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40L2ZzL3VkZi9zdXBlci5jCTIwMDgtMDUt
MjAgMDE6Mjc6NTMgKzAzMDAKQEAgLTM2OCw3ICszNjgsNyBAQAogCU9wdF9naWQsIE9wdF91aWQs
IE9wdF91bWFzaywgT3B0X3Nlc3Npb24sIE9wdF9sYXN0YmxvY2ssCiAJT3B0X2FuY2hvciwgT3B0
X3ZvbHVtZSwgT3B0X3BhcnRpdGlvbiwgT3B0X2ZpbGVzZXQsCiAJT3B0X3Jvb3RkaXIsIE9wdF91
dGY4LCBPcHRfaW9jaGFyc2V0LAotCU9wdF9lcnIsIE9wdF91Zm9yZ2V0LCBPcHRfdWlnbm9yZSwg
T3B0X2dmb3JnZXQsIE9wdF9naWdub3JlCisJT3B0X2lnbm9yZSwgT3B0X2VyciwgT3B0X3Vmb3Jn
ZXQsIE9wdF91aWdub3JlLCBPcHRfZ2ZvcmdldCwgT3B0X2dpZ25vcmUKIH07CiAKIHN0YXRpYyBt
YXRjaF90YWJsZV90IHRva2VucyA9IHsKQEAgLTM5Nyw2ICszOTcsMTAgQEAKIAl7T3B0X3Jvb3Rk
aXIsCSJyb290ZGlyPSV1In0sCiAJe09wdF91dGY4LAkidXRmOCJ9LAogCXtPcHRfaW9jaGFyc2V0
LAkiaW9jaGFyc2V0PSVzIn0sCisjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJNT1VOVCkgfHwgZGVm
aW5lZChDT05GSUdfU1VQRVJNT1VOVF9NT0RVTEUpCisJLyogU2lsZW50bHkgaWdub3JlIE5MUyBv
cHRpb24gKi8KKwl7T3B0X2lnbm9yZSwgImNvZGVwYWdlIn0sCisjZW5kaWYKIAl7T3B0X2VyciwJ
TlVMTH0KIH07CiAKQEAgLTY4Nyw2ICs2OTEsOCBAQAogCQkJCXVkZl9kZWJ1ZygiSVNPOTY2MCBW
b2x1bWUgRGVzY3JpcHRvciBTZXQgIgogCQkJCQkgICJUZXJtaW5hdG9yIGZvdW5kXG4iKTsKIAkJ
CQlicmVhazsKKwkJCWNhc2UgT3B0X2lnbm9yZToKKwkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJ
CQkJdWRmX2RlYnVnKCJJU085NjYwIFZSUyAoJXUpIGZvdW5kXG4iLAogCQkJCQkgIHZzZC0+c3Ry
dWN0VHlwZSk7CmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC5vcmlnL2luY2x1ZGUvbGludXgvY2Ry
b20uaCBsaW51eC0yLjYuMjUuNC9pbmNsdWRlL2xpbnV4L2Nkcm9tLmgKLS0tIGxpbnV4LTIuNi4y
NS40Lm9yaWcvaW5jbHVkZS9saW51eC9jZHJvbS5oCTIwMDgtMDQtMTggMDE6MjA6MTcgKzAzMDAK
KysrIGxpbnV4LTIuNi4yNS40L2luY2x1ZGUvbGludXgvY2Ryb20uaAkyMDA4LTA1LTIwIDAxOjI3
OjUzICswMzAwCkBAIC05OTIsNiArOTkyLDkgQEAKIGV4dGVybiBpbnQgY2Ryb21faW9jdGwoc3Ry
dWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAogCQlzdHJ1Y3Qg
aW5vZGUgKmlwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4g
aW50IGNkcm9tX21lZGlhX2NoYW5nZWQoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICopOworI2lm
IGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlQpIHx8IGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlRf
TU9EVUxFKQorZXh0ZXJuIGludCBjZHJvbV9tZWRpYWN0bChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2lu
Zm8gKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLCBpbnQsIGludCk7CisjZW5kaWYKIAogZXh0ZXJu
IGludCByZWdpc3Rlcl9jZHJvbShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSk7CiBleHRl
cm4gaW50IHVucmVnaXN0ZXJfY2Ryb20oc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGkpOwpk
aWZmIC11ck4gbGludXgtMi42LjI1LjQub3JpZy9pbmNsdWRlL2xpbnV4L2dlbmhkLmggbGludXgt
Mi42LjI1LjQvaW5jbHVkZS9saW51eC9nZW5oZC5oCi0tLSBsaW51eC0yLjYuMjUuNC5vcmlnL2lu
Y2x1ZGUvbGludXgvZ2VuaGQuaAkyMDA4LTA0LTE4IDAxOjIwOjE3ICswMzAwCisrKyBsaW51eC0y
LjYuMjUuNC9pbmNsdWRlL2xpbnV4L2dlbmhkLmgJMjAwOC0wNS0yMCAwMToyNzo1MyArMDMwMApA
QCAtMTQxLDYgKzE0MSwxMCBAQAogCXN0cnVjdCBkaXNrX3N0YXRzIGRrc3RhdHM7CiAjZW5kaWYK
IAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXN5bmNfbm90aWZ5OworI2lmIGRlZmluZWQoQ09ORklHX1NV
UEVSTU9VTlQpIHx8IGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlRfTU9EVUxFKQorCWludCBzY291
bnQ7CQkJLyogbnVtYmVyIG9mIHN1cGVybW91bnRlZCBwYXJ0aXRpb25zICovCisjZW5kaWYKKwog
fTsKIAogLyogCmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC5vcmlnL2luY2x1ZGUvbGludXgvc3Vw
ZXJtb3VudF9tZWRpYS5oIGxpbnV4LTIuNi4yNS40L2luY2x1ZGUvbGludXgvc3VwZXJtb3VudF9t
ZWRpYS5oCi0tLSBsaW51eC0yLjYuMjUuNC5vcmlnL2luY2x1ZGUvbGludXgvc3VwZXJtb3VudF9t
ZWRpYS5oCTE5NzAtMDEtMDEgMDM6MDA6MDAgKzAzMDAKKysrIGxpbnV4LTIuNi4yNS40L2luY2x1
ZGUvbGludXgvc3VwZXJtb3VudF9tZWRpYS5oCTIwMDgtMDUtMjAgMDE6Mjc6NTMgKzAzMDAKQEAg
LTAsMCArMSw0NyBAQAorI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlQpIHx8IGRlZmluZWQo
Q09ORklHX1NVUEVSTU9VTlRfTU9EVUxFKQorCisvKgorICogVGhlc2UgYXJlIHRoZSAib3AiIG9w
ZXJhdGlvbiBjb2RlcyBmb3IgbWVkaWFjdGwoKSBtZWRpYSBjb250cm9sCisgKiBjYWxscyBmb3Ig
ZGV2aWNlIHNwZWNpYWwgZmlsZXMKKyAqLworZW51bSB7CisJTUVESUFfTE9DSyA9IDEyMzQsCS8q
IExvY2sgdGhlIGRyaXZlIGRvb3IgKi8KKwlNRURJQV9VTkxPQ0ssCQkvKiBVbmxvY2sgdGhlIGRy
aXZlIGRvb3IgKi8KKwlTVVBFUk1PVU5UX0lOQ19DT1VOVCwKKwlTVVBFUk1PVU5UX0RFQ19DT1VO
VCwKK307CisKK3N0YXRpYyBpbmxpbmUgaW50CitzdXBlcm1vdW50X3VzYWdlX2NvdW50KHN0cnVj
dCBibG9ja19kZXZpY2UgKmJkZXYsIGludCBjb3VudCkKK3sKKwlpZiAoYmRldikgeworCQljb3Vu
dCAtPSBiZGV2LT5iZF9kaXNrLT5zY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9
IDA7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2Rldl9pc19z
dXBlcm1vdW50ZWQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlyZXR1cm4gYmRldiA/
IGJkZXYtPmJkX2Rpc2stPnNjb3VudCA+IDAgOiAwOworfQorCisjZWxzZSAvKiBDT05GSUdfU1VQ
RVJNT1VOVCAqLworCitzdGF0aWMgaW5saW5lIGludAorc3VwZXJtb3VudF91c2FnZV9jb3VudChz
dHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBpbnQgY291bnQpCit7CisJKHZvaWQpYmRldjsgLy8g
bWFrZSBjb21waWxlciBoYXBweQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGlubGluZSBp
bnQKK2Rldl9pc19zdXBlcm1vdW50ZWQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwko
dm9pZCliZGV2OyAvLyBtYWtlIGNvbXBpbGVyIGhhcHB5CisJcmV0dXJuIDA7Cit9CisKKyNlbmRp
ZiAvKiBDT05GSUdfU1VQRVJNT1VOVCAqLwpkaWZmIC11ck4gbGludXgtMi42LjI1LjQub3JpZy9k
cml2ZXJzL3Njc2kvc2QuYyBsaW51eC0yLjYuMjUuNC9kcml2ZXJzL3Njc2kvc2QuYwotLS0gbGlu
dXgtMi42LjI1LjQub3JpZy9kcml2ZXJzL3Njc2kvc2QuYwkyMDA4LTA0LTE4IDAxOjIwOjA5ICsw
MzAwCisrKyBsaW51eC0yLjYuMjUuNC9kcml2ZXJzL3Njc2kvc2QuYwkyMDA4LTA1LTIwIDAxOjI3
OjUzICswMzAwCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5o
PgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kcml2ZXIuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZWgu
aD4KKyNpbmNsdWRlIDxsaW51eC9zdXBlcm1vdW50X21lZGlhLmg+CiAjaW5jbHVkZSA8c2NzaS9z
Y3NpX2hvc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KICNpbmNsdWRlIDxzY3Np
L3Njc2ljYW0uaD4KQEAgLTYxMCw2ICs2MTEsMTIgQEAKIAkJCXNjc2lfc2V0X21lZGl1bV9yZW1v
dmFsKHNkZXYsIFNDU0lfUkVNT1ZBTF9QUkVWRU5UKTsKIAl9CiAKKyNpZiBkZWZpbmVkKENPTkZJ
R19TVVBFUk1PVU5UKSB8fCBkZWZpbmVkKENPTkZJR19TVVBFUk1PVU5UX01PRFVMRSkKKwlpZiAo
c3VwZXJtb3VudF91c2FnZV9jb3VudChpbm9kZS0+aV9iZGV2LCBzZGtwLT5vcGVuZXJzKyspID09
IDAgJiYgc2Rldi0+cmVtb3ZhYmxlKSB7CisJCWlmIChzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2lu
Z19lcnJvcnMoc2RldikpCisJCQlzY3NpX3NldF9tZWRpdW1fcmVtb3ZhbChzZGV2LCBTQ1NJX1JF
TU9WQUxfUFJFVkVOVCk7CisJfQorI2VuZGlmCiAJcmV0dXJuIDA7CiAKIGVycm9yX291dDoKQEAg
LTY0MCw3ICs2NDcsMTIgQEAKIAkJaWYgKHNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9y
cyhzZGV2KSkKIAkJCXNjc2lfc2V0X21lZGl1bV9yZW1vdmFsKHNkZXYsIFNDU0lfUkVNT1ZBTF9B
TExPVyk7CiAJfQotCisjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJNT1VOVCkgfHwgZGVmaW5lZChD
T05GSUdfU1VQRVJNT1VOVF9NT0RVTEUpCisJaWYgKHN1cGVybW91bnRfdXNhZ2VfY291bnQoaW5v
ZGUtPmlfYmRldiwgLS1zZGtwLT5vcGVuZXJzKSA9PSAwICYmIHNkZXYtPnJlbW92YWJsZSkgewor
CQlpZiAoc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkZXYpKQorCQkJc2NzaV9z
ZXRfbWVkaXVtX3JlbW92YWwoc2RldiwgU0NTSV9SRU1PVkFMX0FMTE9XKTsKKwl9CisjZW5kaWYK
IAkvKgogCSAqIFhYWCBhbmQgd2hhdCBpZiB0aGVyZSBhcmUgcGFja2V0cyBpbiBmbGlnaHQgYW5k
IHRoaXMgY2xvc2UoKQogCSAqIFhYWCBpcyBmb2xsb3dlZCBieSBhICJybW1vZCBzZF9tb2QiPwpA
QCAtNzgyLDYgKzc5NCwxNyBAQAogCQkJCQkgICAgICBzc2hkcik7CiAJfQogCisjaWYgZGVmaW5l
ZChDT05GSUdfU1VQRVJNT1VOVCkgfHwgZGVmaW5lZChDT05GSUdfU1VQRVJNT1VOVF9NT0RVTEUp
CisJLyoKKwkgKiBGSVhNRSBIQUNLCisJICogYnVzeSBkZXZpY2UgdGhhdCBpcyB1bnBsdWdnZWQg
aXMgU0RFVl9ERUwgYnV0IG9ubGluZSBhbmQgaW9jdGwKKwkgKiBkb2VzIG5vdCByZXR1cm4gYW55
IGVycm9yLiBPaCB3ZWxsLCBpdCBpcyBsaWtlbHkgbGF5ZXJpbmcKKwkgKiB2aW9sYXRpb24gYnV0
IGZvciBub3cgaXQgZW5hYmxlcyBtZWRpYSBjaGVja3MgZm9yIHN1cGVybW91bnQKKwkgKi8KKwor
CWlmIChzZHAtPnNkZXZfc3RhdGUgPT0gU0RFVl9ERUwpIAorCQlyZXR2YWwgPSAxOworI2VuZGlm
CiAJLyoKIAkgKiBVbmFibGUgdG8gdGVzdCwgdW5pdCBwcm9iYWJseSBub3QgcmVhZHkuICAgVGhp
cyB1c3VhbGx5CiAJICogbWVhbnMgdGhlcmUgaXMgbm8gZGlzYyBpbiB0aGUgZHJpdmUuICBNYXJr
IGFzIGNoYW5nZWQsCkBAIC04NjcsNiArODkwLDUxIEBACiAJfQogfQogCisjaWYgZGVmaW5lZChD
T05GSUdfU1VQRVJNT1VOVCkgfHwgZGVmaW5lZChDT05GSUdfU1VQRVJNT1VOVF9NT0RVTEUpCisv
KgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBtZWRpYSBjb250cm9sIG9wZXJhdGlvbnMuICBD
dXJyZW50bHkgdGhlCisgKiBvbmx5IGZ1bmN0aW9ucyB1c2VkIGFyZSBNRURJQV9MT0NLIGFuZCBN
RURJQV9VTkxPQ0ssIHRvIGxvY2sgYW5kCisgKiB1bmxvY2sgdGhlIGRyaXZlIGRvb3IuCisgKi8K
Kworc3RhdGljIGludCBzZF9tZWRpYWN0bChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBpbnQg
b3AsIGludCBvcHRhcmcpCit7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IHNjc2lfZGlzayhi
ZGV2LT5iZF9kaXNrKTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHNka3AtPmRldmljZTsK
KwlpbnQgcmMgPSAwOworCisJU0NTSV9MT0dfSExRVUVVRSgzLCBwcmludGsoInNkX21lZGlhY3Rs
OiBkaXNrPSVzXG4iLAorCQkJCQkJYmRldi0+YmRfZGlzay0+ZGlza19uYW1lKSk7CisKKwlpZiAo
IXNkcC0+cmVtb3ZhYmxlKQorCQlyZXR1cm4gMDsKKworCWlmICghc2NzaV9ibG9ja193aGVuX3By
b2Nlc3NpbmdfZXJyb3JzKHNkcCkpCisJCXJldHVybiAtRU5PREVWOworCisJc3dpdGNoIChvcCkg
eworCWNhc2UgTUVESUFfTE9DSzoKKwkJaWYgKHN1cGVybW91bnRfdXNhZ2VfY291bnQoYmRldiwg
c2RrcC0+b3BlbmVycykgPT0gMCkKKwkJCXJjID0gc2NzaV9zZXRfbWVkaXVtX3JlbW92YWwoc2Rw
LCBTQ1NJX1JFTU9WQUxfUFJFVkVOVCk7CisJCS8qIEZJWE1FIGlzIGl0IHRoZSByaWdodCB3YXk/
ICovCisJCWlmIChvcHRhcmcpCisJCQlzZGtwLT5vcGVuZXJzKys7CisJCWJyZWFrOworCWNhc2Ug
TUVESUFfVU5MT0NLOgorCQlpZiAob3B0YXJnICYmIHNka3AtPm9wZW5lcnMgPiAwKQorCQkJc2Rr
cC0+b3BlbmVycy0tOworCQlpZiAoc3VwZXJtb3VudF91c2FnZV9jb3VudChiZGV2LCBzZGtwLT5v
cGVuZXJzKSA9PSAwKQorCQkJcmMgPSBzY3NpX3NldF9tZWRpdW1fcmVtb3ZhbChzZHAsIFNDU0lf
UkVNT1ZBTF9BTExPVyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJ
YnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorI2VuZGlmCisKIAogI2lmZGVmIENPTkZJR19D
T01QQVQKIC8qIApAQCAtOTE0LDYgKzk4MiwxMCBAQAogI2VuZGlmCiAJLm1lZGlhX2NoYW5nZWQJ
CT0gc2RfbWVkaWFfY2hhbmdlZCwKIAkucmV2YWxpZGF0ZV9kaXNrCT0gc2RfcmV2YWxpZGF0ZV9k
aXNrLAorI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlQpIHx8IGRlZmluZWQoQ09ORklHX1NV
UEVSTU9VTlRfTU9EVUxFKQorCS5tZWRpYWN0bAkJPSBzZF9tZWRpYWN0bCwKKyNlbmRpZgorCQog
fTsKIAogLyoqCmRpZmYgLXVyTiBsaW51eC0yLjYuMjUuNC5vcmlnL2luY2x1ZGUvbGludXgvZnMu
aCBsaW51eC0yLjYuMjUuNC9pbmNsdWRlL2xpbnV4L2ZzLmgKLS0tIGxpbnV4LTIuNi4yNS40Lm9y
aWcvaW5jbHVkZS9saW51eC9mcy5oCTIwMDgtMDQtMTggMDE6MjA6MTcgKzAzMDAKKysrIGxpbnV4
LTIuNi4yNS40L2luY2x1ZGUvbGludXgvZnMuaAkyMDA4LTA1LTIwIDAxOjI3OjUzICswMzAwCkBA
IC05Miw2ICs5Miw5IEBACiAvKiBwdWJsaWMgZmxhZ3MgZm9yIGZpbGVfc3lzdGVtX3R5cGUgKi8K
ICNkZWZpbmUgRlNfUkVRVUlSRVNfREVWIDEgCiAjZGVmaW5lIEZTX0JJTkFSWV9NT1VOVERBVEEg
MgorI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlQpIHx8IGRlZmluZWQoQ09ORklHX1NVUEVS
TU9VTlRfTU9EVUxFKQorI2RlZmluZSBGU19OT19TVUJNTlQJNjQJLyogUHJldmVudCBtb3VudGlu
ZyBvdmVyIHRoaXMgZmlsZXN5c3RlbSAqLworI2VuZGlmCiAjZGVmaW5lIEZTX0hBU19TVUJUWVBF
IDQKICNkZWZpbmUgRlNfUkVWQUxfRE9UCTE2Mzg0CS8qIENoZWNrIHRoZSBwYXRocyAiLiIsICIu
LiIgZm9yIHN0YWxlbmVzcyAqLwogI2RlZmluZSBGU19SRU5BTUVfRE9FU19EX01PVkUJMzI3NjgJ
LyogRlMgd2lsbCBoYW5kbGUgZF9tb3ZlKCkKQEAgLTExOCw2ICsxMjEsOSBAQAogCQkJCSAgIE1T
X1ZFUkJPU0UgaXMgZGVwcmVjYXRlZC4gKi8KICNkZWZpbmUgTVNfU0lMRU5UCTMyNzY4CiAjZGVm
aW5lIE1TX1BPU0lYQUNMCSgxPDwxNikJLyogVkZTIGRvZXMgbm90IGFwcGx5IHRoZSB1bWFzayAq
LworI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlQpIHx8IGRlZmluZWQoQ09ORklHX1NVUEVS
TU9VTlRfTU9EVUxFKQorI2RlZmluZSBNU19TVVBFUk1PVU5URUQgKDE8PDI5KSAvKiAyMSBpcyBi
ZWluZyB1c2VkIG5vdyBieSB1cGRhdGUgYXRpbWUqLworI2VuZGlmCiAjZGVmaW5lIE1TX1VOQklO
REFCTEUJKDE8PDE3KQkvKiBjaGFuZ2UgdG8gdW5iaW5kYWJsZSAqLwogI2RlZmluZSBNU19QUklW
QVRFCSgxPDwxOCkJLyogY2hhbmdlIHRvIHByaXZhdGUgKi8KICNkZWZpbmUgTVNfU0xBVkUJKDE8
PDE5KQkvKiBjaGFuZ2UgdG8gc2xhdmUgKi8KQEAgLTgwOSw2ICs4MTUsMTAgQEAKIAlzdHJ1Y3Qg
bGlzdF9oZWFkCWZfZXBfbGlua3M7CiAJc3BpbmxvY2tfdAkJZl9lcF9sb2NrOwogI2VuZGlmIC8q
ICNpZmRlZiBDT05GSUdfRVBPTEwgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TVVBFUk1PVU5UKSB8
fCBkZWZpbmVkKENPTkZJR19TVVBFUk1PVU5UX01PRFVMRSkKKwkvKiBVc2VkIGJ5IHN1cGVybW91
bnQuIFVzZShmdWxsbmVzcykgdW5jb25maXJtZWQgKi8KKwl2b2lkICAgICAgICAgICAgICAgICAg
ICAqZl9zdXBlcm1vdW50OworI2VuZGlmCiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKmZfbWFwcGlu
ZzsKIH07CiBleHRlcm4gc3BpbmxvY2tfdCBmaWxlc19sb2NrOwpAQCAtMTAyOSw2ICsxMDM5LDkg
QEAKIAkgKi8KIAlzdHJ1Y3QgbXV0ZXggc192ZnNfcmVuYW1lX211dGV4OwkvKiBLbHVkZ2UgKi8K
IAorI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSTU9VTlQpIHx8IGRlZmluZWQoQ09ORklHX1NVUEVS
TU9VTlRfTU9EVUxFKQorICAgICBhdG9taWNfdCBzX21lZGlhX2NoYW5nZWQ7CisjZW5kaWYKIAkv
KiBHcmFudWxhcml0eSBvZiBjL20vYXRpbWUgaW4gbnMuCiAJICAgQ2Fubm90IGJlIHdvcnNlIHRo
YW4gYSBzZWNvbmQgKi8KIAl1MzIJCSAgIHNfdGltZV9ncmFuOwpAQCAtMTEzMiw2ICsxMTQ1LDkg
QEAKIAlpbnQgKCpkaXJlY3RfYWNjZXNzKSAoc3RydWN0IGJsb2NrX2RldmljZSAqLCBzZWN0b3Jf
dCwgdW5zaWduZWQgbG9uZyAqKTsKIAlpbnQgKCptZWRpYV9jaGFuZ2VkKSAoc3RydWN0IGdlbmRp
c2sgKik7CiAJaW50ICgqcmV2YWxpZGF0ZV9kaXNrKSAoc3RydWN0IGdlbmRpc2sgKik7CisjaWYg
ZGVmaW5lZChDT05GSUdfU1VQRVJNT1VOVCkgfHwgZGVmaW5lZChDT05GSUdfU1VQRVJNT1VOVF9N
T0RVTEUpCisJaW50ICgqbWVkaWFjdGwpIChzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIGludCwgaW50
KTsKKyNlbmRpZgogCWludCAoKmdldGdlbykoc3RydWN0IGJsb2NrX2RldmljZSAqLCBzdHJ1Y3Qg
aGRfZ2VvbWV0cnkgKik7CiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiB9Owo=
</data>

          </attachment>
      

    </bug>

</bugzilla>