<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>36041</bug_id>
          
          <creation_ts>2010-03-11 17:42:10 -0800</creation_ts>
          <short_desc>Remove unnecessary differences in common code between WebCore::StringImpl &amp; JSC::UStringImpl</short_desc>
          <delta_ts>2010-03-11 19:15:01 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore JavaScript</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Gavin Barraclough">barraclough</reporter>
          <assigned_to name="Gavin Barraclough">barraclough</assigned_to>
          <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>198865</commentid>
    <comment_count>0</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2010-03-11 17:42:10 -0800</bug_when>
    <thetext>Much of the code in WebCore::StringImpl and JSC::UStringImpl is now very similar, but has trivial and unnecessary formatting differences, such as the exact wording of comments, missing ASSERTs, functions implemented in the .h vs .cpp etc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>198866</commentid>
    <comment_count>1</comment_count>
      <attachid>50564</attachid>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2010-03-11 17:44:19 -0800</bug_when>
    <thetext>Created attachment 50564
Not setting r flag, abusing bugzilla to give me a pretty diff to get better comment per-function changes in my ChangeLog entries!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>198888</commentid>
    <comment_count>2</comment_count>
      <attachid>50569</attachid>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2010-03-11 18:26:50 -0800</bug_when>
    <thetext>Created attachment 50569
The patch

Shows as a ~0.5% - 1% progression on SunSpider on my laptop.
This may be noise, through is repeatable &amp; predominately seemed to come from moving the infrequently used UStringImpl::create() methods from the .h into the .cpp.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>198889</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-03-11 18:29:29 -0800</bug_when>
    <thetext>Attachment 50569 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
JavaScriptCore/runtime/UStringImpl.h:256:  More than one command on the same line  [whitespace/newline] [4]
JavaScriptCore/runtime/UStringImpl.h:256:  More than one command on the same line in if  [whitespace/parens] [4]
JavaScriptCore/runtime/UStringImpl.h:257:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/text/StringImpl.h:170:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/text/StringImpl.h:170:  More than one command on the same line in if  [whitespace/parens] [4]
Total errors found: 5 in 7 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>198902</commentid>
    <comment_count>4</comment_count>
      <attachid>50569</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2010-03-11 19:08:05 -0800</bug_when>
    <thetext>Comment on attachment 50569
The patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>198906</commentid>
    <comment_count>5</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2010-03-11 19:15:01 -0800</bug_when>
    <thetext>Comitted r55878</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50564</attachid>
            <date>2010-03-11 17:44:19 -0800</date>
            <delta_ts>2010-03-11 18:26:50 -0800</delta_ts>
            <desc>Not setting r flag, abusing bugzilla to give me a pretty diff to get better comment per-function changes in my ChangeLog entries!</desc>
            <filename>patch.strustrclean.txt</filename>
            <type>text/plain</type>
            <size>37564</size>
            <attacher name="Gavin Barraclough">barraclough</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU1ODY5KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzUgQEAKKzIwMTAtMDMtMTEgIEdhdmluIEJh
cnJhY2xvdWdoICA8YmFycmFjbG91Z2hAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0zNjA0MQorICAgICAgICBSZW1vdmUgdW5uZWNlc3NhcnkgZGlmZmVyZW5jZXMg
aW4gY29tbW9uIGNvZGUgYmV0d2VlbiBXZWJDb3JlOjpTdHJpbmdJbXBsICYgSlNDOjpVU3RyaW5n
SW1wbAorCisgICAgICAgIE11Y2ggb2YgdGhlIGNvZGUgaW4gV2ViQ29yZTo6U3RyaW5nSW1wbCBh
bmQgSlNDOjpVU3RyaW5nSW1wbCBpcyBub3cgdmVyeSBzaW1pbGFyLAorICAgICAgICBidXQgaGFz
IHRyaXZpYWwgYW5kIHVubmVjZXNzYXJ5IGZvcm1hdHRpbmcgZGlmZmVyZW5jZXMsIHN1Y2ggYXMg
dGhlIGV4YWN0IHdvcmRpbmcKKyAgICAgICAgb2YgY29tbWVudHMsIG1pc3NpbmcgQVNTRVJUcywg
ZnVuY3Rpb25zIGltcGxlbWVudGVkIGluIHRoZSAuaCB2cyAuY3BwIGV0Yy4KKworICAgICAgICAq
IHJ1bnRpbWUvSWRlbnRpZmllci5jcHA6CisgICAgICAgIChKU0M6OklkZW50aWZpZXI6OmFkZCk6
CisgICAgICAgIChKU0M6OklkZW50aWZpZXI6OmFkZFNsb3dDYXNlKToKKyAgICAgICAgKiBydW50
aW1lL1VTdHJpbmdJbXBsLmNwcDoKKyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6On5VU3RyaW5n
SW1wbCk6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBsOjpjcmVhdGVVbmluaXRpYWxpemVkKToK
KyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OmNyZWF0ZSk6CisgICAgICAgIChKU0M6OlVTdHJp
bmdJbXBsOjpzaGFyZWRCdWZmZXIpOgorICAgICAgICAqIHJ1bnRpbWUvVVN0cmluZ0ltcGwuaDoK
KyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OlVTdHJpbmdJbXBsKToKKyAgICAgICAgKEpTQzo6
VVN0cmluZ0ltcGw6OnNldEhhc2gpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6Y3JlYXRl
KToKKyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OmFkb3B0KToKKyAgICAgICAgKEpTQzo6VVN0
cmluZ0ltcGw6OmNvc3QpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6aGFzaCk6CisgICAg
ICAgIChKU0M6OlVTdHJpbmdJbXBsOjpleGlzdGluZ0hhc2gpOgorICAgICAgICAoSlNDOjpVU3Ry
aW5nSW1wbDo6Y29tcHV0ZUhhc2gpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6Y2hlY2tD
b25zaXN0ZW5jeSk6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBsOjpidWZmZXJPd25lcnNoaXAp
OgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6KToKKwogMjAxMC0wMy0xMSAgTWFyayBSb3dl
ICA8bXJvd2VAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFRpbSBIYXRjaGVyLgpJ
bmRleDogSmF2YVNjcmlwdENvcmUvcnVudGltZS9JZGVudGlmaWVyLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0lkZW50aWZpZXIuY3BwCShyZXZpc2lvbiA1NTgzMykK
KysrIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmllci5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTQzLDcgKzQzLDcgQEAgcHVibGljOgogICAgICAgICBmb3IgKEhhc2hTZXQ8VVN0cmluZzo6
UmVwKj46Oml0ZXJhdG9yIGl0ZXIgPSBtX3RhYmxlLmJlZ2luKCk7IGl0ZXIgIT0gZW5kOyArK2l0
ZXIpCiAgICAgICAgICAgICAoKml0ZXIpLT5zZXRJc0lkZW50aWZpZXIoZmFsc2UpOwogICAgIH0K
LSAgICAKKwogICAgIHN0ZDo6cGFpcjxIYXNoU2V0PFVTdHJpbmc6OlJlcCo+OjppdGVyYXRvciwg
Ym9vbD4gYWRkKFVTdHJpbmc6OlJlcCogdmFsdWUpCiAgICAgewogICAgICAgICBzdGQ6OnBhaXI8
SGFzaFNldDxVU3RyaW5nOjpSZXAqPjo6aXRlcmF0b3IsIGJvb2w+IHJlc3VsdCA9IG1fdGFibGUu
YWRkKHZhbHVlKTsKQEAgLTEyOSwxMCArMTI5LDggQEAgUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+
IElkZW50aWZpZXI6OmFkZAogICAgICAgICByZXAtPmhhc2goKTsKICAgICAgICAgcmV0dXJuIHJl
cDsKICAgICB9Ci0gICAgaWYgKCFjWzBdKSB7Ci0gICAgICAgIFVTdHJpbmc6OlJlcDo6ZW1wdHko
KS0+aGFzaCgpOworICAgIGlmICghY1swXSkKICAgICAgICAgcmV0dXJuIFVTdHJpbmc6OlJlcDo6
ZW1wdHkoKTsKLSAgICB9CiAgICAgaWYgKCFjWzFdKQogICAgICAgICByZXR1cm4gYWRkKGdsb2Jh
bERhdGEsIGdsb2JhbERhdGEtPnNtYWxsU3RyaW5ncy5zaW5nbGVDaGFyYWN0ZXJTdHJpbmdSZXAo
c3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY1swXSkpKTsKIApAQCAtMTkzLDEwICsxOTEsOCBA
QCBQYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4gSWRlbnRpZmllcjo6YWRkCiAgICAgICAgIGlmIChj
IDw9IDB4RkYpCiAgICAgICAgICAgICByZXR1cm4gYWRkKGdsb2JhbERhdGEsIGdsb2JhbERhdGEt
PnNtYWxsU3RyaW5ncy5zaW5nbGVDaGFyYWN0ZXJTdHJpbmdSZXAoYykpOwogICAgIH0KLSAgICBp
ZiAoIWxlbmd0aCkgewotICAgICAgICBVU3RyaW5nOjpSZXA6OmVtcHR5KCktPmhhc2goKTsKKyAg
ICBpZiAoIWxlbmd0aCkKICAgICAgICAgcmV0dXJuIFVTdHJpbmc6OlJlcDo6ZW1wdHkoKTsKLSAg
ICB9CiAgICAgVUNoYXJCdWZmZXIgYnVmID0ge3MsIGxlbmd0aH07IAogICAgIHBhaXI8SGFzaFNl
dDxVU3RyaW5nOjpSZXAqPjo6aXRlcmF0b3IsIGJvb2w+IGFkZFJlc3VsdCA9IGdsb2JhbERhdGEt
PmlkZW50aWZpZXJUYWJsZS0+YWRkPFVDaGFyQnVmZmVyLCBVQ2hhckJ1ZmZlclRyYW5zbGF0b3I+
KGJ1Zik7CiAKQEAgLTIyNCwxMCArMjIwLDggQEAgUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IElk
ZW50aWZpZXI6OmFkZAogICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgfQog
ICAgIH0KLSAgICBpZiAoIXItPmxlbmd0aCgpKSB7Ci0gICAgICAgIFVTdHJpbmc6OlJlcDo6ZW1w
dHkoKS0+aGFzaCgpOworICAgIGlmICghci0+bGVuZ3RoKCkpCiAgICAgICAgIHJldHVybiBVU3Ry
aW5nOjpSZXA6OmVtcHR5KCk7Ci0gICAgfQogICAgIHJldHVybiAqZ2xvYmFsRGF0YS0+aWRlbnRp
ZmllclRhYmxlLT5hZGQocikuZmlyc3Q7CiB9CiAKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3J1bnRp
bWUvVVN0cmluZ0ltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUv
VVN0cmluZ0ltcGwuY3BwCShyZXZpc2lvbiA1NTgzMikKKysrIEphdmFTY3JpcHRDb3JlL3J1bnRp
bWUvVVN0cmluZ0ltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw2ICszNiwzMyBAQCB1c2lu
ZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3BhY2UgSlNDIHsKIAorc3RhdGljIGNvbnN0IHVuc2ln
bmVkIG1pbkxlbmd0aFRvU2hhcmUgPSAyMDsKKworVVN0cmluZ0ltcGw6On5VU3RyaW5nSW1wbCgp
Cit7CisgICAgQVNTRVJUKCFpc1N0YXRpYygpKTsKKyAgICBjaGVja0NvbnNpc3RlbmN5KCk7CisK
KyAgICBpZiAoaXNJZGVudGlmaWVyKCkpCisgICAgICAgIElkZW50aWZpZXI6OnJlbW92ZSh0aGlz
KTsKKworICAgIEJ1ZmZlck93bmVyc2hpcCBvd25lcnNoaXAgPSBidWZmZXJPd25lcnNoaXAoKTsK
KyAgICBpZiAob3duZXJzaGlwICE9IEJ1ZmZlckludGVybmFsKSB7CisgICAgICAgIGlmIChvd25l
cnNoaXAgPT0gQnVmZmVyT3duZWQpIHsKKyAgICAgICAgICAgIEFTU0VSVCghbV9zaGFyZWRCdWZm
ZXIpOworICAgICAgICAgICAgQVNTRVJUKG1fZGF0YSk7CisgICAgICAgICAgICBmYXN0RnJlZShj
b25zdF9jYXN0PFVDaGFyKj4obV9kYXRhKSk7CisgICAgICAgIH0gZWxzZSBpZiAob3duZXJzaGlw
ID09IEJ1ZmZlclN1YnN0cmluZykgeworICAgICAgICAgICAgQVNTRVJUKG1fc3Vic3RyaW5nQnVm
ZmVyKTsKKyAgICAgICAgICAgIG1fc3Vic3RyaW5nQnVmZmVyLT5kZXJlZigpOworICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUKG93bmVyc2hpcCA9PSBCdWZmZXJTaGFyZWQpOwor
ICAgICAgICAgICAgQVNTRVJUKG1fc2hhcmVkQnVmZmVyKTsKKyAgICAgICAgICAgIG1fc2hhcmVk
QnVmZmVyLT5kZXJlZigpOworICAgICAgICB9CisgICAgfQorfQorCiBVU3RyaW5nSW1wbCogVVN0
cmluZ0ltcGw6OmVtcHR5KCkKIHsKICAgICAvLyBBIG5vbi1udWxsIHBvaW50ZXIgYXQgYW4gaW52
YWxpZCBhZGRyZXNzIChpbiBwYWdlIHplcm8pIHNvIHRoYXQgaWYgaXQgd2VyZSB0byBiZSBhY2Nl
c3NlZCB3ZQpAQCAtNDUsNiArNzIsMjUgQEAgVVN0cmluZ0ltcGwqIFVTdHJpbmdJbXBsOjplbXB0
eSgpCiAgICAgcmV0dXJuICZlbXB0eVN0cmluZzsKIH0KIAorUGFzc1JlZlB0cjxVU3RyaW5nSW1w
bD4gVVN0cmluZ0ltcGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQodW5zaWduZWQgbGVuZ3RoLCBVQ2hh
ciomIGRhdGEpCit7CisgICAgaWYgKCFsZW5ndGgpIHsKKyAgICAgICAgZGF0YSA9IDA7CisgICAg
ICAgIHJldHVybiBlbXB0eSgpOworICAgIH0KKworICAgIC8vIEFsbG9jYXRlIGEgc2luZ2xlIGJ1
ZmZlciBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiB0aGUgU3RyaW5nSW1wbAorICAgIC8vIHN0cnVj
dCBhcyB3ZWxsIGFzIHRoZSBkYXRhIHdoaWNoIGl0IGNvbnRhaW5zLiBUaGlzIHJlbW92ZXMgb25l
IAorICAgIC8vIGhlYXAgYWxsb2NhdGlvbiBmcm9tIHRoaXMgY2FsbC4KKyAgICBpZiAobGVuZ3Ro
ID4gKChzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC0gc2l6ZW9mKFVTdHJpbmdJ
bXBsKSkgLyBzaXplb2YoVUNoYXIpKSkKKyAgICAgICAgQ1JBU0goKTsKKyAgICBzaXplX3Qgc2l6
ZSA9IHNpemVvZihVU3RyaW5nSW1wbCkgKyBsZW5ndGggKiBzaXplb2YoVUNoYXIpOworICAgIFVT
dHJpbmdJbXBsKiBzdHJpbmcgPSBzdGF0aWNfY2FzdDxVU3RyaW5nSW1wbCo+KGZhc3RNYWxsb2Mo
c2l6ZSkpOworCisgICAgZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPihzdHJpbmcgKyAx
KTsKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IChzdHJpbmcpIFVTdHJpbmdJbXBsKGxlbmd0aCkp
OworfQorCiBQYXNzUmVmUHRyPFVTdHJpbmdJbXBsPiBVU3RyaW5nSW1wbDo6Y3JlYXRlKGNvbnN0
IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCiB7CiAgICAgaWYgKCFjaGFyYWN0
ZXJzIHx8ICFsZW5ndGgpCkBAIC03Nyw1MCArMTIzLDM1IEBAIFBhc3NSZWZQdHI8VVN0cmluZ0lt
cGw+IFVTdHJpbmdJbXBsOjpjcmUKICAgICByZXR1cm4gY3JlYXRlKHN0cmluZywgc3RybGVuKHN0
cmluZykpOwogfQogCi1TaGFyZWRVQ2hhciogVVN0cmluZ0ltcGw6OmJhc2VTaGFyZWRCdWZmZXIo
KQorUGFzc1JlZlB0cjxVU3RyaW5nSW1wbD4gVVN0cmluZ0ltcGw6OmNyZWF0ZShQYXNzUmVmUHRy
PFNoYXJlZFVDaGFyPiBzaGFyZWRCdWZmZXIsIGNvbnN0IFVDaGFyKiBidWZmZXIsIHVuc2lnbmVk
IGxlbmd0aCkKIHsKLSAgICBBU1NFUlQoKGJ1ZmZlck93bmVyc2hpcCgpID09IEJ1ZmZlclNoYXJl
ZCkKLSAgICAgICAgfHwgKChidWZmZXJPd25lcnNoaXAoKSA9PSBCdWZmZXJPd25lZCkgJiYgIW1f
YnVmZmVyKSk7Ci0KLSAgICBpZiAoYnVmZmVyT3duZXJzaGlwKCkgIT0gQnVmZmVyU2hhcmVkKSB7
Ci0gICAgICAgIG1fcmVmQ291bnRBbmRGbGFncyA9IChtX3JlZkNvdW50QW5kRmxhZ3MgJiB+c19y
ZWZDb3VudE1hc2tCdWZmZXJPd25lcnNoaXApIHwgQnVmZmVyU2hhcmVkOwotICAgICAgICBtX2J1
ZmZlclNoYXJlZCA9IFNoYXJlZFVDaGFyOjpjcmVhdGUobmV3IFNoYXJhYmxlVUNoYXIobV9kYXRh
KSkucmVsZWFzZVJlZigpOwotICAgIH0KLQotICAgIHJldHVybiBtX2J1ZmZlclNoYXJlZDsKKyAg
ICBpZiAoIWxlbmd0aCkKKyAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgcmV0dXJuIGFkb3B0
UmVmKG5ldyBVU3RyaW5nSW1wbChidWZmZXIsIGxlbmd0aCwgc2hhcmVkQnVmZmVyKSk7CiB9CiAK
IFNoYXJlZFVDaGFyKiBVU3RyaW5nSW1wbDo6c2hhcmVkQnVmZmVyKCkKIHsKLSAgICBpZiAobV9s
ZW5ndGggPCBzX21pbkxlbmd0aFRvU2hhcmUpCisgICAgaWYgKG1fbGVuZ3RoIDwgbWluTGVuZ3Ro
VG9TaGFyZSkKICAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gQWxsIHN0YXRpYyBzdHJpbmdzIGFy
ZSBzbWFsbGVyIHRoYXQgdGhlIG1pbmltaW0gbGVuZ3RoIHRvIHNoYXJlLgogICAgIEFTU0VSVCgh
aXNTdGF0aWMoKSk7CiAKLSAgICBVU3RyaW5nSW1wbCogb3duZXIgPSBidWZmZXJPd25lclN0cmlu
ZygpOwotICAgIGlmIChvd25lci0+YnVmZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVySW50ZXJuYWwp
Ci0gICAgICAgIHJldHVybiAwOworICAgIEJ1ZmZlck93bmVyc2hpcCBvd25lcnNoaXAgPSBidWZm
ZXJPd25lcnNoaXAoKTsKIAotICAgIHJldHVybiBvd25lci0+YmFzZVNoYXJlZEJ1ZmZlcigpOwot
fQotCi1VU3RyaW5nSW1wbDo6flVTdHJpbmdJbXBsKCkKLXsKLSAgICBBU1NFUlQoIWlzU3RhdGlj
KCkpOwotICAgIGNoZWNrQ29uc2lzdGVuY3koKTsKLQotICAgIGlmIChpc0lkZW50aWZpZXIoKSkK
LSAgICAgICAgSWRlbnRpZmllcjo6cmVtb3ZlKHRoaXMpOwotCi0gICAgaWYgKGJ1ZmZlck93bmVy
c2hpcCgpICE9IEJ1ZmZlckludGVybmFsKSB7Ci0gICAgICAgIGlmIChidWZmZXJPd25lcnNoaXAo
KSA9PSBCdWZmZXJPd25lZCkKLSAgICAgICAgICAgIGZhc3RGcmVlKGNvbnN0X2Nhc3Q8VUNoYXIq
PihtX2RhdGEpKTsKLSAgICAgICAgZWxzZSBpZiAoYnVmZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVy
U3Vic3RyaW5nKQotICAgICAgICAgICAgbV9idWZmZXJTdWJzdHJpbmctPmRlcmVmKCk7Ci0gICAg
ICAgIGVsc2UgewotICAgICAgICAgICAgQVNTRVJUKGJ1ZmZlck93bmVyc2hpcCgpID09IEJ1ZmZl
clNoYXJlZCk7Ci0gICAgICAgICAgICBtX2J1ZmZlclNoYXJlZC0+ZGVyZWYoKTsKLSAgICAgICAg
fQorICAgIGlmIChvd25lcnNoaXAgPT0gQnVmZmVySW50ZXJuYWwpCisgICAgICAgIHJldHVybiAw
OworICAgIGlmIChvd25lcnNoaXAgPT0gQnVmZmVyU3Vic3RyaW5nKQorICAgICAgICByZXR1cm4g
bV9zdWJzdHJpbmdCdWZmZXItPnNoYXJlZEJ1ZmZlcigpOworICAgIGlmIChvd25lcnNoaXAgPT0g
QnVmZmVyT3duZWQpIHsKKyAgICAgICAgQVNTRVJUKCFtX3NoYXJlZEJ1ZmZlcik7CisgICAgICAg
IG1fc2hhcmVkQnVmZmVyID0gU2hhcmVkVUNoYXI6OmNyZWF0ZShuZXcgU2hhcmFibGVVQ2hhciht
X2RhdGEpKS5yZWxlYXNlUmVmKCk7CisgICAgICAgIG1fcmVmQ291bnRBbmRGbGFncyA9IChtX3Jl
ZkNvdW50QW5kRmxhZ3MgJiB+c19yZWZDb3VudE1hc2tCdWZmZXJPd25lcnNoaXApIHwgQnVmZmVy
U2hhcmVkOwogICAgIH0KKworICAgIEFTU0VSVChvd25lcnNoaXAgPT0gQnVmZmVyU2hhcmVkKTsK
KyAgICBBU1NFUlQobV9zaGFyZWRCdWZmZXIpOworICAgIHJldHVybiBtX3NoYXJlZEJ1ZmZlcjsK
IH0KIAogdm9pZCBVUm9wZUltcGw6OmRlcmVmRmliZXJzTm9uUmVjdXJzaXZlKFZlY3RvcjxVUm9w
ZUltcGwqLCAzMj4mIHdvcmtRdWV1ZSkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvVVN0
cmluZ0ltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL1VTdHJpbmdJ
bXBsLmgJKHJldmlzaW9uIDU1ODMzKQorKysgSmF2YVNjcmlwdENvcmUvcnVudGltZS9VU3RyaW5n
SW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDUsNDcgKzEwNSwxMDMgQEAgcHJvdGVjdGVkOgog
fTsKIAogY2xhc3MgVVN0cmluZ0ltcGwgOiBwdWJsaWMgVVN0cmluZ09yUm9wZUltcGwgewotcHVi
bGljOgotICAgIHRlbXBsYXRlPHNpemVfdCBpbmxpbmVDYXBhY2l0eT4KLSAgICBzdGF0aWMgUGFz
c1JlZlB0cjxVU3RyaW5nSW1wbD4gYWRvcHQoVmVjdG9yPFVDaGFyLCBpbmxpbmVDYXBhY2l0eT4m
IHZlY3RvcikKKyAgICBmcmllbmQgY2xhc3MgQ1N0cmluZ1RyYW5zbGF0b3I7CisgICAgZnJpZW5k
IGNsYXNzIFVDaGFyQnVmZmVyVHJhbnNsYXRvcjsKKyAgICBmcmllbmQgY2xhc3MgSklUOworICAg
IGZyaWVuZCBjbGFzcyBTbWFsbFN0cmluZ3NTdG9yYWdlOworICAgIGZyaWVuZCBjbGFzcyBVU3Ry
aW5nT3JSb3BlSW1wbDsKKyAgICBmcmllbmQgdm9pZCBpbml0aWFsaXplVVN0cmluZygpOworcHJp
dmF0ZToKKyAgICAvLyBGb3IgU21hbGxTdHJpbmdTdG9yYWdlLCB3aGljaCBhbGxvY2F0ZXMgYW4g
YXJyYXkgYW5kIHVzZXMgYW4gaW4tcGxhY2UgbmV3LgorICAgIFVTdHJpbmdJbXBsKCkgeyB9CisK
KyAgICAvLyBVc2VkIHRvIGNvbnN0cnVjdCBzdGF0aWMgc3RyaW5ncywgd2hpY2ggaGF2ZSBhbiBz
cGVjaWFsIHJlZkNvdW50IHRoYXQgY2FuIG5ldmVyIGhpdCB6ZXJvLgorICAgIC8vIFRoaXMgbWVh
bnMgdGhhdCB0aGUgc3RhdGljIHN0cmluZyB3aWxsIG5ldmVyIGJlIGRlc3Ryb3llZCwgd2hpY2gg
aXMgaW1wb3J0YW50IGJlY2F1c2UKKyAgICAvLyBzdGF0aWMgc3RyaW5ncyB3aWxsIGJlIHNoYXJl
ZCBhY3Jvc3MgdGhyZWFkcyAmIHJlZi1jb3VudGVkIGluIGEgbm9uLXRocmVhZHNhZmUgbWFubmVy
LgorICAgIFVTdHJpbmdJbXBsKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5n
dGgsIFN0YXRpY1N0cmluZ0NvbnN0cnVjdFR5cGUpCisgICAgICAgIDogVVN0cmluZ09yUm9wZUlt
cGwobGVuZ3RoLCBDb25zdHJ1Y3RTdGF0aWNTdHJpbmcpCisgICAgICAgICwgbV9kYXRhKGNoYXJh
Y3RlcnMpCisgICAgICAgICwgbV9idWZmZXIoMCkKKyAgICAgICAgLCBtX2hhc2goMCkKICAgICB7
Ci0gICAgICAgIGlmICh1bnNpZ25lZCBsZW5ndGggPSB2ZWN0b3Iuc2l6ZSgpKSB7Ci0gICAgICAg
ICAgICBBU1NFUlQodmVjdG9yLmRhdGEoKSk7Ci0gICAgICAgICAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IFVTdHJpbmdJbXBsKHZlY3Rvci5yZWxlYXNlQnVmZmVyKCksIGxlbmd0aCkpOwotICAgICAg
ICB9Ci0gICAgICAgIHJldHVybiBlbXB0eSgpOworICAgICAgICBoYXNoKCk7CisgICAgICAgIGNo
ZWNrQ29uc2lzdGVuY3koKTsKICAgICB9CiAKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxVU3RyaW5n
SW1wbD4gY3JlYXRlKGNvbnN0IFVDaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxlbmd0aCk7Ci0gICAg
c3RhdGljIFBhc3NSZWZQdHI8VVN0cmluZ0ltcGw+IGNyZWF0ZShjb25zdCBjaGFyKiBjLCB1bnNp
Z25lZCBsZW5ndGgpOwotICAgIHN0YXRpYyBQYXNzUmVmUHRyPFVTdHJpbmdJbXBsPiBjcmVhdGUo
Y29uc3QgY2hhciogYyk7CisgICAgLy8gQ3JlYXRlIGEgbm9ybWFsIHN0cmluZyB3aXRoIGludGVy
bmFsIHN0b3JhZ2UgKEJ1ZmZlckludGVybmFsKQorICAgIFVTdHJpbmdJbXBsKHVuc2lnbmVkIGxl
bmd0aCkKKyAgICAgICAgOiBVU3RyaW5nT3JSb3BlSW1wbChsZW5ndGgsIEJ1ZmZlckludGVybmFs
KQorICAgICAgICAsIG1fZGF0YShyZWludGVycHJldF9jYXN0PFVDaGFyKj4odGhpcyArIDEpKQor
ICAgICAgICAsIG1fYnVmZmVyKDApCisgICAgICAgICwgbV9oYXNoKDApCisgICAgeworICAgICAg
ICBBU1NFUlQobV9kYXRhKTsKKyAgICAgICAgQVNTRVJUKG1fbGVuZ3RoKTsKKyAgICAgICAgY2hl
Y2tDb25zaXN0ZW5jeSgpOworICAgIH0KIAotICAgIHN0YXRpYyBQYXNzUmVmUHRyPFVTdHJpbmdJ
bXBsPiBjcmVhdGUoUGFzc1JlZlB0cjxVU3RyaW5nSW1wbD4gcmVwLCB1bnNpZ25lZCBvZmZzZXQs
IHVuc2lnbmVkIGxlbmd0aCkKKyAgICAvLyBDcmVhdGUgYSBVU3RyaW5nSW1wbCBhZG9wdGluZyBv
d25lcnNoaXAgb2YgdGhlIHByb3ZpZGVkIGJ1ZmZlciAoQnVmZmVyT3duZWQpCisgICAgVVN0cmlu
Z0ltcGwoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKKyAgICAgICAg
OiBVU3RyaW5nT3JSb3BlSW1wbChsZW5ndGgsIEJ1ZmZlck93bmVkKQorICAgICAgICAsIG1fZGF0
YShjaGFyYWN0ZXJzKQorICAgICAgICAsIG1fYnVmZmVyKDApCisgICAgICAgICwgbV9oYXNoKDAp
CiAgICAgewotICAgICAgICBBU1NFUlQocmVwKTsKLSAgICAgICAgcmVwLT5jaGVja0NvbnNpc3Rl
bmN5KCk7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgVVN0cmluZ0ltcGwocmVwLT5tX2Rh
dGEgKyBvZmZzZXQsIGxlbmd0aCwgcmVwLT5idWZmZXJPd25lclN0cmluZygpKSk7CisgICAgICAg
IEFTU0VSVChtX2RhdGEpOworICAgICAgICBBU1NFUlQobV9sZW5ndGgpOworICAgICAgICBjaGVj
a0NvbnNpc3RlbmN5KCk7CiAgICAgfQogCi0gICAgc3RhdGljIFBhc3NSZWZQdHI8VVN0cmluZ0lt
cGw+IGNyZWF0ZShQYXNzUmVmUHRyPFNoYXJlZFVDaGFyPiBzaGFyZWRCdWZmZXIsIGNvbnN0IFVD
aGFyKiBidWZmZXIsIHVuc2lnbmVkIGxlbmd0aCkKKyAgICAvLyBVc2VkIHRvIGNyZWF0ZSBuZXcg
c3RyaW5ncyB0aGF0IGFyZSBhIHN1YnN0cmluZyBvZiBhbiBleGlzdGluZyBVU3RyaW5nSW1wbCAo
QnVmZmVyU3Vic3RyaW5nKQorICAgIFVTdHJpbmdJbXBsKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJz
LCB1bnNpZ25lZCBsZW5ndGgsIFBhc3NSZWZQdHI8VVN0cmluZ0ltcGw+IGJhc2UpCisgICAgICAg
IDogVVN0cmluZ09yUm9wZUltcGwobGVuZ3RoLCBCdWZmZXJTdWJzdHJpbmcpCisgICAgICAgICwg
bV9kYXRhKGNoYXJhY3RlcnMpCisgICAgICAgICwgbV9zdWJzdHJpbmdCdWZmZXIoYmFzZS5yZWxl
YXNlUmVmKCkpCisgICAgICAgICwgbV9oYXNoKDApCiAgICAgewotICAgICAgICByZXR1cm4gYWRv
cHRSZWYobmV3IFVTdHJpbmdJbXBsKGJ1ZmZlciwgbGVuZ3RoLCBzaGFyZWRCdWZmZXIpKTsKKyAg
ICAgICAgQVNTRVJUKG1fZGF0YSk7CisgICAgICAgIEFTU0VSVChtX2xlbmd0aCk7CisgICAgICAg
IGNoZWNrQ29uc2lzdGVuY3koKTsKICAgICB9CiAKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxVU3Ry
aW5nSW1wbD4gY3JlYXRlVW5pbml0aWFsaXplZCh1bnNpZ25lZCBsZW5ndGgsIFVDaGFyKiYgb3V0
cHV0KQorICAgIC8vIFVzZWQgdG8gY29uc3RydWN0IG5ldyBzdHJpbmdzIHNoYXJpbmcgYW4gZXhp
c3RpbmcgU2hhcmVkVUNoYXIgKEJ1ZmZlclNoYXJlZCkKKyAgICBVU3RyaW5nSW1wbChjb25zdCBV
Q2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoLCBQYXNzUmVmUHRyPFNoYXJlZFVDaGFy
PiBzaGFyZWRCdWZmZXIpCisgICAgICAgIDogVVN0cmluZ09yUm9wZUltcGwobGVuZ3RoLCBCdWZm
ZXJTaGFyZWQpCisgICAgICAgICwgbV9kYXRhKGNoYXJhY3RlcnMpCisgICAgICAgICwgbV9zaGFy
ZWRCdWZmZXIoc2hhcmVkQnVmZmVyLnJlbGVhc2VSZWYoKSkKKyAgICAgICAgLCBtX2hhc2goMCkK
ICAgICB7Ci0gICAgICAgIGlmICghbGVuZ3RoKSB7Ci0gICAgICAgICAgICBvdXRwdXQgPSAwOwot
ICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCk7Ci0gICAgICAgIH0KKyAgICAgICAgQVNTRVJUKG1f
ZGF0YSk7CisgICAgICAgIEFTU0VSVChtX2xlbmd0aCk7CisgICAgICAgIGNoZWNrQ29uc2lzdGVu
Y3koKTsKKyAgICB9CiAKLSAgICAgICAgaWYgKGxlbmd0aCA+ICgoc3RkOjpudW1lcmljX2xpbWl0
czxzaXplX3Q+OjptYXgoKSAtIHNpemVvZihVU3RyaW5nSW1wbCkpIC8gc2l6ZW9mKFVDaGFyKSkp
Ci0gICAgICAgICAgICBDUkFTSCgpOwotICAgICAgICBVU3RyaW5nSW1wbCogcmVzdWx0SW1wbCA9
IHN0YXRpY19jYXN0PFVTdHJpbmdJbXBsKj4oZmFzdE1hbGxvYyhzaXplb2YoVUNoYXIpICogbGVu
Z3RoICsgc2l6ZW9mKFVTdHJpbmdJbXBsKSkpOwotICAgICAgICBvdXRwdXQgPSByZWludGVycHJl
dF9jYXN0PFVDaGFyKj4ocmVzdWx0SW1wbCArIDEpOwotICAgICAgICByZXR1cm4gYWRvcHRSZWYo
bmV3KHJlc3VsdEltcGwpIFVTdHJpbmdJbXBsKGxlbmd0aCkpOworICAgIC8vIEZvciB1c2Ugb25s
eSBieSBJZGVudGlmaWVyJ3MgWFhYVHJhbnNsYXRvciBoZWxwZXJzLgorICAgIHZvaWQgc2V0SGFz
aCh1bnNpZ25lZCBoYXNoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKCFtX2hhc2gpOworICAgICAg
ICBBU1NFUlQoaGFzaCA9PSBjb21wdXRlSGFzaChtX2RhdGEsIG1fbGVuZ3RoKSk7CisgICAgICAg
IG1faGFzaCA9IGhhc2g7CisgICAgfQorCitwdWJsaWM6CisgICAgflVTdHJpbmdJbXBsKCk7CisK
KyAgICBzdGF0aWMgUGFzc1JlZlB0cjxVU3RyaW5nSW1wbD4gY3JlYXRlKGNvbnN0IFVDaGFyKiwg
dW5zaWduZWQgbGVuZ3RoKTsKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxVU3RyaW5nSW1wbD4gY3Jl
YXRlKGNvbnN0IGNoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOworICAgIHN0YXRpYyBQYXNzUmVmUHRy
PFVTdHJpbmdJbXBsPiBjcmVhdGUoY29uc3QgY2hhciopOworICAgIHN0YXRpYyBQYXNzUmVmUHRy
PFVTdHJpbmdJbXBsPiBjcmVhdGUoUGFzc1JlZlB0cjxTaGFyZWRVQ2hhcj4sIGNvbnN0IFVDaGFy
KiwgdW5zaWduZWQgbGVuZ3RoKTsKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxVU3RyaW5nSW1wbD4g
Y3JlYXRlKFBhc3NSZWZQdHI8VVN0cmluZ0ltcGw+IHJlcCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNp
Z25lZCBsZW5ndGgpCisgICAgeworICAgICAgICBpZiAoIWxlbmd0aCkKKyAgICAgICAgICAgIHJl
dHVybiBlbXB0eSgpOworICAgICAgICBBU1NFUlQocmVwKTsKKyAgICAgICAgcmVwLT5jaGVja0Nv
bnNpc3RlbmN5KCk7CisgICAgICAgIFVTdHJpbmdJbXBsKiBvd25lclJlcCA9IChyZXAtPmJ1ZmZl
ck93bmVyc2hpcCgpID09IEJ1ZmZlclN1YnN0cmluZykgPyByZXAtPm1fc3Vic3RyaW5nQnVmZmVy
IDogcmVwLmdldCgpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFVTdHJpbmdJbXBsKHJl
cC0+bV9kYXRhICsgb2Zmc2V0LCBsZW5ndGgsIG93bmVyUmVwKSk7CiAgICAgfQogCisgICAgc3Rh
dGljIFBhc3NSZWZQdHI8VVN0cmluZ0ltcGw+IGNyZWF0ZVVuaW5pdGlhbGl6ZWQodW5zaWduZWQg
bGVuZ3RoLCBVQ2hhciomIG91dHB1dCk7CiAgICAgc3RhdGljIFBhc3NSZWZQdHI8VVN0cmluZ0lt
cGw+IHRyeUNyZWF0ZVVuaW5pdGlhbGl6ZWQodW5zaWduZWQgbGVuZ3RoLCBVQ2hhciomIG91dHB1
dCkKICAgICB7CiAgICAgICAgIGlmICghbGVuZ3RoKSB7CkBAIC0xNjIsMTMgKzIxOCwyNCBAQCBw
dWJsaWM6CiAgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcocmVzdWx0SW1wbCkgVVN0cmluZ0lt
cGwobGVuZ3RoKSk7CiAgICAgfQogCisgICAgdGVtcGxhdGU8c2l6ZV90IGlubGluZUNhcGFjaXR5
PgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFVTdHJpbmdJbXBsPiBhZG9wdChWZWN0b3I8VUNoYXIs
IGlubGluZUNhcGFjaXR5PiYgdmVjdG9yKQorICAgIHsKKyAgICAgICAgaWYgKHNpemVfdCBzaXpl
ID0gdmVjdG9yLnNpemUoKSkgeworICAgICAgICAgICAgQVNTRVJUKHZlY3Rvci5kYXRhKCkpOwor
ICAgICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBVU3RyaW5nSW1wbCh2ZWN0b3IucmVsZWFz
ZUJ1ZmZlcigpLCBzaXplKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVtcHR5KCk7Cisg
ICAgfQorCiAgICAgU2hhcmVkVUNoYXIqIHNoYXJlZEJ1ZmZlcigpOwogICAgIGNvbnN0IFVDaGFy
KiBjaGFyYWN0ZXJzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CisKICAgICBzaXplX3QgY29z
dCgpCiAgICAgewogICAgICAgICAvLyBGb3Igc3Vic3RyaW5ncywgcmV0dXJuIHRoZSBjb3N0IG9m
IHRoZSBiYXNlIHN0cmluZy4KICAgICAgICAgaWYgKGJ1ZmZlck93bmVyc2hpcCgpID09IEJ1ZmZl
clN1YnN0cmluZykKLSAgICAgICAgICAgIHJldHVybiBtX2J1ZmZlclN1YnN0cmluZy0+Y29zdCgp
OworICAgICAgICAgICAgcmV0dXJuIG1fc3Vic3RyaW5nQnVmZmVyLT5jb3N0KCk7CiAKICAgICAg
ICAgaWYgKG1fcmVmQ291bnRBbmRGbGFncyAmIHNfcmVmQ291bnRGbGFnU2hvdWxkUmVwb3J0ZWRD
b3N0KSB7CiAgICAgICAgICAgICBtX3JlZkNvdW50QW5kRmxhZ3MgJj0gfnNfcmVmQ291bnRGbGFn
U2hvdWxkUmVwb3J0ZWRDb3N0OwpAQCAtMTc2LDkgKzI0Myw3IEBAIHB1YmxpYzoKICAgICAgICAg
fQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0IHsg
aWYgKCFtX2hhc2gpIG1faGFzaCA9IGNvbXB1dGVIYXNoKG1fZGF0YSwgbV9sZW5ndGgpOyByZXR1
cm4gbV9oYXNoOyB9Ci0gICAgdW5zaWduZWQgZXhpc3RpbmdIYXNoKCkgY29uc3QgeyBBU1NFUlQo
bV9oYXNoKTsgcmV0dXJuIG1faGFzaDsgfSAvLyBmYXN0IHBhdGggZm9yIElkZW50aWZpZXJzCi0g
ICAgdm9pZCBzZXRIYXNoKHVuc2lnbmVkIGhhc2gpIHsgQVNTRVJUKGhhc2ggPT0gY29tcHV0ZUhh
c2gobV9kYXRhLCBtX2xlbmd0aCkpOyBtX2hhc2ggPSBoYXNoOyB9IC8vIGZhc3QgcGF0aCBmb3Ig
SWRlbnRpZmllcnMKKwogICAgIGJvb2wgaXNJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gbV9y
ZWZDb3VudEFuZEZsYWdzICYgc19yZWZDb3VudEZsYWdJc0lkZW50aWZpZXI7IH0KICAgICB2b2lk
IHNldElzSWRlbnRpZmllcihib29sIGlzSWRlbnRpZmllcikKICAgICB7CkBAIC0xODgsOCArMjUz
LDIyIEBAIHB1YmxpYzoKICAgICAgICAgICAgIG1fcmVmQ291bnRBbmRGbGFncyAmPSB+c19yZWZD
b3VudEZsYWdJc0lkZW50aWZpZXI7CiAgICAgfQogCisvLyBTWU5DIFNZTkMgU1lOQworLy8gU1lO
QyBTWU5DIFNZTkMKKy8vIFNZTkMgU1lOQyBTWU5DCisvLyBTWU5DIFNZTkMgU1lOQworLy8gU1lO
QyBTWU5DIFNZTkMKKworICAgIHVuc2lnbmVkIGhhc2goKSBjb25zdCB7IGlmICghbV9oYXNoKSBt
X2hhc2ggPSBjb21wdXRlSGFzaChtX2RhdGEsIG1fbGVuZ3RoKTsgcmV0dXJuIG1faGFzaDsgfQor
ICAgIHVuc2lnbmVkIGV4aXN0aW5nSGFzaCgpIGNvbnN0IHsgQVNTRVJUKG1faGFzaCk7IHJldHVy
biBtX2hhc2g7IH0KKyAgICBzdGF0aWMgdW5zaWduZWQgY29tcHV0ZUhhc2goY29uc3QgVUNoYXIq
IGRhdGEsIHVuc2lnbmVkIGxlbmd0aCkgeyByZXR1cm4gV1RGOjpzdHJpbmdIYXNoKGRhdGEsIGxl
bmd0aCk7IH0KKyAgICBzdGF0aWMgdW5zaWduZWQgY29tcHV0ZUhhc2goY29uc3QgY2hhciogZGF0
YSwgdW5zaWduZWQgbGVuZ3RoKSB7IHJldHVybiBXVEY6OnN0cmluZ0hhc2goZGF0YSwgbGVuZ3Ro
KTsgfQorICAgIHN0YXRpYyB1bnNpZ25lZCBjb21wdXRlSGFzaChjb25zdCBjaGFyKiBkYXRhKSB7
IHJldHVybiBXVEY6OnN0cmluZ0hhc2goZGF0YSk7IH0KKwogICAgIEFMV0FZU19JTkxJTkUgdm9p
ZCBkZXJlZigpIHsgbV9yZWZDb3VudEFuZEZsYWdzIC09IHNfcmVmQ291bnRJbmNyZW1lbnQ7IGlm
ICghKG1fcmVmQ291bnRBbmRGbGFncyAmIChzX3JlZkNvdW50TWFzayB8IHNfcmVmQ291bnRGbGFn
U3RhdGljKSkpIGRlbGV0ZSB0aGlzOyB9CiAKKyAgICBzdGF0aWMgVVN0cmluZ0ltcGwqIGVtcHR5
KCk7CisKICAgICBzdGF0aWMgdm9pZCBjb3B5Q2hhcnMoVUNoYXIqIGRlc3RpbmF0aW9uLCBjb25z
dCBVQ2hhciogc291cmNlLCB1bnNpZ25lZCBudW1DaGFyYWN0ZXJzKQogICAgIHsKICAgICAgICAg
aWYgKG51bUNoYXJhY3RlcnMgPD0gc19jb3B5Q2hhcnNJbmxpbmVDdXRPZmYpIHsKQEAgLTE5OSwx
MDkgKzI3OCwzMyBAQCBwdWJsaWM6CiAgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb24sIHNv
dXJjZSwgbnVtQ2hhcmFjdGVycyAqIHNpemVvZihVQ2hhcikpOwogICAgIH0KIAotICAgIHN0YXRp
YyB1bnNpZ25lZCBjb21wdXRlSGFzaChjb25zdCBVQ2hhciogcywgdW5zaWduZWQgbGVuZ3RoKSB7
IHJldHVybiBXVEY6OnN0cmluZ0hhc2gocywgbGVuZ3RoKTsgfQotICAgIHN0YXRpYyB1bnNpZ25l
ZCBjb21wdXRlSGFzaChjb25zdCBjaGFyKiBzLCB1bnNpZ25lZCBsZW5ndGgpIHsgcmV0dXJuIFdU
Rjo6c3RyaW5nSGFzaChzLCBsZW5ndGgpOyB9Ci0gICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVI
YXNoKGNvbnN0IGNoYXIqIHMpIHsgcmV0dXJuIFdURjo6c3RyaW5nSGFzaChzKTsgfQotCi0gICAg
c3RhdGljIFVTdHJpbmdJbXBsKiBlbXB0eSgpOwotCiAgICAgQUxXQVlTX0lOTElORSB2b2lkIGNo
ZWNrQ29uc2lzdGVuY3koKSBjb25zdAogICAgIHsKICAgICAgICAgLy8gVGhlcmUgaXMgbm8gcmVj
dXJzaW9uIG9mIHN1YnN0cmluZ3MuCi0gICAgICAgIEFTU0VSVChidWZmZXJPd25lclN0cmluZygp
LT5idWZmZXJPd25lcnNoaXAoKSAhPSBCdWZmZXJTdWJzdHJpbmcpOworICAgICAgICBBU1NFUlQo
KGJ1ZmZlck93bmVyc2hpcCgpICE9IEJ1ZmZlclN1YnN0cmluZykgfHwgKG1fc3Vic3RyaW5nQnVm
ZmVyLT5idWZmZXJPd25lcnNoaXAoKSAhPSBCdWZmZXJTdWJzdHJpbmcpKTsKICAgICAgICAgLy8g
U3RhdGljIHN0cmluZ3MgY2Fubm90IGJlIHB1dCBpbiBpZGVudGlmaWVyIHRhYmxlcywgYmVjYXVz
ZSB0aGV5IGFyZSBnbG9iYWxseSBzaGFyZWQuCiAgICAgICAgIEFTU0VSVCghaXNTdGF0aWMoKSB8
fCAhaXNJZGVudGlmaWVyKCkpOwogICAgIH0KIAogcHJpdmF0ZToKLSAgICAvLyBGb3IgU21hbGxT
dHJpbmdTdG9yYWdlLCB3aGljaCBhbGxvY2F0ZXMgYW4gYXJyYXkgYW5kIHVzZXMgYW4gaW4tcGxh
Y2UgbmV3LgotICAgIFVTdHJpbmdJbXBsKCkgeyB9Ci0KLSAgICAvLyBVc2VkIHRvIGNvbnN0cnVj
dCBub3JtYWwgc3RyaW5ncyB3aXRoIGFuIGludGVybmFsIGJ1ZmZlci4KLSAgICBVU3RyaW5nSW1w
bCh1bnNpZ25lZCBsZW5ndGgpCi0gICAgICAgIDogVVN0cmluZ09yUm9wZUltcGwobGVuZ3RoLCBC
dWZmZXJJbnRlcm5hbCkKLSAgICAgICAgLCBtX2RhdGEocmVpbnRlcnByZXRfY2FzdDxVQ2hhcio+
KHRoaXMgKyAxKSkKLSAgICAgICAgLCBtX2J1ZmZlcigwKQotICAgICAgICAsIG1faGFzaCgwKQot
ICAgIHsKLSAgICAgICAgY2hlY2tDb25zaXN0ZW5jeSgpOwotICAgIH0KLQotICAgIC8vIFVzZWQg
dG8gY29uc3RydWN0IG5vcm1hbCBzdHJpbmdzIHdpdGggYW4gZXh0ZXJuYWwgYnVmZmVyLgotICAg
IFVTdHJpbmdJbXBsKGNvbnN0IFVDaGFyKiBkYXRhLCB1bnNpZ25lZCBsZW5ndGgpCi0gICAgICAg
IDogVVN0cmluZ09yUm9wZUltcGwobGVuZ3RoLCBCdWZmZXJPd25lZCkKLSAgICAgICAgLCBtX2Rh
dGEoZGF0YSkKLSAgICAgICAgLCBtX2J1ZmZlcigwKQotICAgICAgICAsIG1faGFzaCgwKQotICAg
IHsKLSAgICAgICAgY2hlY2tDb25zaXN0ZW5jeSgpOwotICAgIH0KLQotICAgIC8vIFVzZWQgdG8g
Y29uc3RydWN0IHN0YXRpYyBzdHJpbmdzLCB3aGljaCBoYXZlIGFuIHNwZWNpYWwgcmVmQ291bnQg
dGhhdCBjYW4gbmV2ZXIgaGl0IHplcm8uCi0gICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBzdGF0
aWMgc3RyaW5nIHdpbGwgbmV2ZXIgYmUgZGVzdHJveWVkLCB3aGljaCBpcyBpbXBvcnRhbnQgYmVj
YXVzZQotICAgIC8vIHN0YXRpYyBzdHJpbmdzIHdpbGwgYmUgc2hhcmVkIGFjcm9zcyB0aHJlYWRz
ICYgcmVmLWNvdW50ZWQgaW4gYSBub24tdGhyZWFkc2FmZSBtYW5uZXIuCi0gICAgVVN0cmluZ0lt
cGwoY29uc3QgVUNoYXIqIGRhdGEsIHVuc2lnbmVkIGxlbmd0aCwgU3RhdGljU3RyaW5nQ29uc3Ry
dWN0VHlwZSkKLSAgICAgICAgOiBVU3RyaW5nT3JSb3BlSW1wbChsZW5ndGgsIENvbnN0cnVjdFN0
YXRpY1N0cmluZykKLSAgICAgICAgLCBtX2RhdGEoZGF0YSkKLSAgICAgICAgLCBtX2J1ZmZlcigw
KQotICAgICAgICAsIG1faGFzaCgwKQotICAgIHsKLSAgICAgICAgY2hlY2tDb25zaXN0ZW5jeSgp
OwotICAgIH0KLQotICAgIC8vIFVzZWQgdG8gY3JlYXRlIG5ldyBzdHJpbmdzIHRoYXQgYXJlIGEg
c3Vic3RyaW5nIG9mIGFuIGV4aXN0aW5nIHN0cmluZy4KLSAgICBVU3RyaW5nSW1wbChjb25zdCBV
Q2hhciogZGF0YSwgdW5zaWduZWQgbGVuZ3RoLCBQYXNzUmVmUHRyPFVTdHJpbmdJbXBsPiBiYXNl
KQotICAgICAgICA6IFVTdHJpbmdPclJvcGVJbXBsKGxlbmd0aCwgQnVmZmVyU3Vic3RyaW5nKQot
ICAgICAgICAsIG1fZGF0YShkYXRhKQotICAgICAgICAsIG1fYnVmZmVyU3Vic3RyaW5nKGJhc2Uu
cmVsZWFzZVJlZigpKQotICAgICAgICAsIG1faGFzaCgwKQotICAgIHsKLSAgICAgICAgLy8gRG8g
dXNlIHN0YXRpYyBzdHJpbmdzIGFzIGEgYmFzZSBmb3Igc3Vic3RyaW5nczsgVW50eXBlZFB0ckFu
ZEJpdGZpZWxkIGFzc3VtZXMKLSAgICAgICAgLy8gdGhhdCBhbGwgcG9pbnRlcnMgd2lsbCBiZSBh
dCBsZWFzdCA4LWJ5dGUgYWxpZ25lZCwgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IG9mCi0gICAg
ICAgIC8vIFVTdHJpbmdJbXBscyB0aGF0IGFyZSBub3QgaGVhcCBhbGxvY2F0ZWQuCi0gICAgICAg
IEFTU0VSVChtX2J1ZmZlclN1YnN0cmluZy0+bGVuZ3RoKCkpOwotICAgICAgICBBU1NFUlQoIW1f
YnVmZmVyU3Vic3RyaW5nLT5pc1N0YXRpYygpKTsKLSAgICAgICAgY2hlY2tDb25zaXN0ZW5jeSgp
OwotICAgIH0KLQotICAgIC8vIFVzZWQgdG8gY29uc3RydWN0IG5ldyBzdHJpbmdzIHNoYXJpbmcg
YW4gZXhpc3Rpbmcgc2hhcmVkIGJ1ZmZlci4KLSAgICBVU3RyaW5nSW1wbChjb25zdCBVQ2hhciog
ZGF0YSwgdW5zaWduZWQgbGVuZ3RoLCBQYXNzUmVmUHRyPFNoYXJlZFVDaGFyPiBzaGFyZWRCdWZm
ZXIpCi0gICAgICAgIDogVVN0cmluZ09yUm9wZUltcGwobGVuZ3RoLCBCdWZmZXJTaGFyZWQpCi0g
ICAgICAgICwgbV9kYXRhKGRhdGEpCi0gICAgICAgICwgbV9idWZmZXJTaGFyZWQoc2hhcmVkQnVm
ZmVyLnJlbGVhc2VSZWYoKSkKLSAgICAgICAgLCBtX2hhc2goMCkKLSAgICB7Ci0gICAgICAgIGNo
ZWNrQ29uc2lzdGVuY3koKTsKLSAgICB9Ci0KLSAgICB+VVN0cmluZ0ltcGwoKTsKLQogICAgIC8v
IFRoaXMgbnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgMiB0byBhdm9pZCBzaGFyaW5nIGVtcHR5LCBu
dWxsIGFzIHdlbGwgYXMgMSBjaGFyYWN0ZXIgc3RyaW5ncyBmcm9tIFNtYWxsU3RyaW5ncy4KLSAg
ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc19taW5MZW5ndGhUb1NoYXJlID0gMTA7CiAgICAgc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIHNfY29weUNoYXJzSW5saW5lQ3V0T2ZmID0gMjA7CiAKLSAgICBV
U3RyaW5nSW1wbCogYnVmZmVyT3duZXJTdHJpbmcoKSB7IHJldHVybiAoYnVmZmVyT3duZXJzaGlw
KCkgPT0gQnVmZmVyU3Vic3RyaW5nKSA/IG1fYnVmZmVyU3Vic3RyaW5nIDogIHRoaXM7IH0KLSAg
ICBjb25zdCBVU3RyaW5nSW1wbCogYnVmZmVyT3duZXJTdHJpbmcoKSBjb25zdCB7IHJldHVybiAo
YnVmZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVyU3Vic3RyaW5nKSA/IG1fYnVmZmVyU3Vic3RyaW5n
IDogIHRoaXM7IH0KLSAgICBTaGFyZWRVQ2hhciogYmFzZVNoYXJlZEJ1ZmZlcigpOwotICAgIHVu
c2lnbmVkIGJ1ZmZlck93bmVyc2hpcCgpIGNvbnN0IHsgcmV0dXJuIG1fcmVmQ291bnRBbmRGbGFn
cyAmIHNfcmVmQ291bnRNYXNrQnVmZmVyT3duZXJzaGlwOyB9CisgICAgQnVmZmVyT3duZXJzaGlw
IGJ1ZmZlck93bmVyc2hpcCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PEJ1ZmZlck93bmVy
c2hpcD4obV9yZWZDb3VudEFuZEZsYWdzICYgc19yZWZDb3VudE1hc2tCdWZmZXJPd25lcnNoaXAp
OyB9CiAgICAgYm9vbCBpc1N0YXRpYygpIGNvbnN0IHsgcmV0dXJuIG1fcmVmQ291bnRBbmRGbGFn
cyAmIHNfcmVmQ291bnRGbGFnU3RhdGljOyB9CiAKICAgICAvLyB1bnNoYXJlZCBkYXRhCiAgICAg
Y29uc3QgVUNoYXIqIG1fZGF0YTsKICAgICB1bmlvbiB7CiAgICAgICAgIHZvaWQqIG1fYnVmZmVy
OwotICAgICAgICBVU3RyaW5nSW1wbCogbV9idWZmZXJTdWJzdHJpbmc7Ci0gICAgICAgIFNoYXJl
ZFVDaGFyKiBtX2J1ZmZlclNoYXJlZDsKKyAgICAgICAgVVN0cmluZ0ltcGwqIG1fc3Vic3RyaW5n
QnVmZmVyOworICAgICAgICBTaGFyZWRVQ2hhciogbV9zaGFyZWRCdWZmZXI7CiAgICAgfTsKICAg
ICBtdXRhYmxlIHVuc2lnbmVkIG1faGFzaDsKLQotICAgIGZyaWVuZCBjbGFzcyBKSVQ7Ci0gICAg
ZnJpZW5kIGNsYXNzIFNtYWxsU3RyaW5nc1N0b3JhZ2U7Ci0gICAgZnJpZW5kIGNsYXNzIFVTdHJp
bmdPclJvcGVJbXBsOwotICAgIGZyaWVuZCB2b2lkIGluaXRpYWxpemVVU3RyaW5nKCk7CiB9Owog
CiBjbGFzcyBVUm9wZUltcGwgOiBwdWJsaWMgVVN0cmluZ09yUm9wZUltcGwgeworICAgIGZyaWVu
ZCBjbGFzcyBVU3RyaW5nT3JSb3BlSW1wbDsKIHB1YmxpYzoKICAgICAvLyBBIFVSb3BlSW1wbCBp
cyBjb21wb3NlZCBmcm9tIGEgc2V0IG9mIHNtYWxsZXIgc3RyaW5ncyBjYWxsZWQgRmliZXJzLgog
ICAgIC8vIEVhY2ggRmliZXIgaW4gYSByb3BlIGlzIGVpdGhlciBVU3RyaW5nSW1wbCBvciBhbm90
aGVyIFVSb3BlSW1wbC4KQEAgLTMzOSw4ICszNDIsNiBAQCBwcml2YXRlOgogCiAgICAgdW5zaWdu
ZWQgbV9maWJlckNvdW50OwogICAgIEZpYmVyIG1fZmliZXJzWzFdOwotCi0gICAgZnJpZW5kIGNs
YXNzIFVTdHJpbmdPclJvcGVJbXBsOwogfTsKIAogaW5saW5lIHZvaWQgVVN0cmluZ09yUm9wZUlt
cGw6OmRlcmVmKCkKSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvQ2hhbmdlTG9nCShyZXZpc2lvbiA1NTg2OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMjggQEAKKzIwMTAtMDMtMTEgIEdhdmluIEJhcnJhY2xvdWdo
ICA8YmFycmFjbG91Z2hAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0zNjA0MQorICAgICAgICBSZW1vdmUgdW5uZWNlc3NhcnkgZGlmZmVyZW5jZXMgaW4gY29tbW9u
IGNvZGUgYmV0d2VlbiBXZWJDb3JlOjpTdHJpbmdJbXBsICYgSlNDOjpVU3RyaW5nSW1wbAorCisg
ICAgICAgIE11Y2ggb2YgdGhlIGNvZGUgaW4gV2ViQ29yZTo6U3RyaW5nSW1wbCBhbmQgSlNDOjpV
U3RyaW5nSW1wbCBpcyBub3cgdmVyeSBzaW1pbGFyLAorICAgICAgICBidXQgaGFzIHRyaXZpYWwg
YW5kIHVubmVjZXNzYXJ5IGZvcm1hdHRpbmcgZGlmZmVyZW5jZXMsIHN1Y2ggYXMgdGhlIGV4YWN0
IHdvcmRpbmcKKyAgICAgICAgb2YgY29tbWVudHMsIG1pc3NpbmcgQVNTRVJUcywgZnVuY3Rpb25z
IGltcGxlbWVudGVkIGluIHRoZSAuaCB2cyAuY3BwIGV0Yy4KKworICAgICAgICAqIHBsYXRmb3Jt
L3RleHQvU3RyaW5nSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjplbXB0
eSk6CisgICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjpjcmVhdGVVbmluaXRpYWxpemVkKToK
KyAgICAgICAgKFdlYkNvcmU6OlN0cmluZ0ltcGw6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpTdHJpbmdJbXBsOjpzaGFyZWRCdWZmZXIpOgorICAgICAgICAqIHBsYXRmb3JtL3RleHQvU3Ry
aW5nSW1wbC5oOgorICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6KToKKyAgICAgICAgKFdl
YkNvcmU6OlN0cmluZ0ltcGw6OlN0cmluZ0ltcGwpOgorICAgICAgICAoV2ViQ29yZTo6U3RyaW5n
SW1wbDo6c2V0SGFzaCk6CisgICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjphZG9wdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjpjaGFyYWN0ZXJzKToKKyAgICAgICAgKFdlYkNv
cmU6OlN0cmluZ0ltcGw6Omhhc2gpOgorICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6Y29t
cHV0ZUhhc2gpOgorCiAyMDEwLTAzLTExICBMZWFuZHJvIFBlcmVpcmEgIDxsZWFuZHJvQHByb2Z1
c2lvbi5tb2JpPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEhvbGdlciBGcmV5dGhlci4KSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5jcHAJKHJldmlzaW9uIDU1ODMyKQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw3
ICszMyw2IEBACiAjaW5jbHVkZSAiU3RyaW5nSGFzaC5oIgogI2luY2x1ZGUgIlRleHRCcmVha0l0
ZXJhdG9yLmgiCiAjaW5jbHVkZSAiVGV4dEVuY29kaW5nLmgiCi0jaW5jbHVkZSAiVGhyZWFkR2xv
YmFsRGF0YS5oIgogI2luY2x1ZGUgPHJ1bnRpbWUvVVN0cmluZy5oPgogI2luY2x1ZGUgPHd0Zi9k
dG9hLmg+CiAjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KQEAgLTQ3LDU4ICs0Niw2IEBAIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1pbkxlbmd0aFRvU2hh
cmUgPSAyMDsKIAotc3RhdGljIGlubGluZSBVQ2hhciogbmV3VUNoYXJWZWN0b3IodW5zaWduZWQg
bikKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VUNoYXIqPihmYXN0TWFsbG9jKHNpemVvZihV
Q2hhcikgKiBuKSk7Ci19Ci0KLS8vIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBvbmx5IHRvIGNy
ZWF0ZSB0aGUgZW1wdHkgc3RyaW5nLgotU3RyaW5nSW1wbDo6U3RyaW5nSW1wbCgpCi0gICAgOiBt
X2RhdGEoMCkKLSAgICAsIG1fc2hhcmVkQnVmZmVyKDApCi0gICAgLCBtX2xlbmd0aCgwKQotICAg
ICwgbV9yZWZDb3VudEFuZEZsYWdzKHNfcmVmQ291bnRGbGFnU3RhdGljIHwgQnVmZmVySW50ZXJu
YWwpCi0gICAgLCBtX2hhc2goMCkKLXsKLSAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaGFzaCBpcyBj
b21wdXRlZCBzbyB0aGF0IEF0b21pY1N0cmluZ0hhc2ggY2FuIGNhbGwgZXhpc3RpbmdIYXNoKCkK
LSAgICAvLyB3aXRoIGltcHVuaXR5LiBUaGUgZW1wdHkgc3RyaW5nIGlzIHNwZWNpYWwgYmVjYXVz
ZSBpdCBpcyBuZXZlciBlbnRlcmVkIGludG8KLSAgICAvLyBBdG9taWNTdHJpbmcncyBIYXNoS2V5
LCBidXQgc3RpbGwgbmVlZHMgdG8gY29tcGFyZSBjb3JyZWN0bHkuCi0gICAgaGFzaCgpOwotfQot
Ci1pbmxpbmUgU3RyaW5nSW1wbDo6U3RyaW5nSW1wbCh1bnNpZ25lZCBsZW5ndGgpCi0gICAgOiBt
X2RhdGEocmVpbnRlcnByZXRfY2FzdDxjb25zdCBVQ2hhcio+KHRoaXMgKyAxKSkKLSAgICAsIG1f
c2hhcmVkQnVmZmVyKDApCi0gICAgLCBtX2xlbmd0aChsZW5ndGgpCi0gICAgLCBtX3JlZkNvdW50
QW5kRmxhZ3Moc19yZWZDb3VudEluY3JlbWVudCB8IEJ1ZmZlckludGVybmFsKQotICAgICwgbV9o
YXNoKDApCi17Ci0gICAgQVNTRVJUKG1fZGF0YSk7Ci0gICAgQVNTRVJUKG1fbGVuZ3RoKTsKLX0K
LQotaW5saW5lIFN0cmluZ0ltcGw6OlN0cmluZ0ltcGwoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMs
IHVuc2lnbmVkIGxlbmd0aCkKLSAgICA6IG1fZGF0YShjaGFyYWN0ZXJzKQotICAgICwgbV9zaGFy
ZWRCdWZmZXIoMCkKLSAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKLSAgICAsIG1fcmVmQ291bnRBbmRG
bGFncyhzX3JlZkNvdW50SW5jcmVtZW50IHwgQnVmZmVyT3duZWQpCi0gICAgLCBtX2hhc2goMCkK
LXsKLSAgICBBU1NFUlQobV9kYXRhKTsKLSAgICBBU1NFUlQobV9sZW5ndGgpOwotfQotCi1pbmxp
bmUgU3RyaW5nSW1wbDo6U3RyaW5nSW1wbChjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWdu
ZWQgbGVuZ3RoLCBQYXNzUmVmUHRyPFNoYXJlZFVDaGFyPiBzaGFyZWRCdWZmZXIpCi0gICAgOiBt
X2RhdGEoY2hhcmFjdGVycykKLSAgICAsIG1fc2hhcmVkQnVmZmVyKHNoYXJlZEJ1ZmZlci5yZWxl
YXNlUmVmKCkpCi0gICAgLCBtX2xlbmd0aChsZW5ndGgpCi0gICAgLCBtX3JlZkNvdW50QW5kRmxh
Z3Moc19yZWZDb3VudEluY3JlbWVudCB8IEJ1ZmZlclNoYXJlZCkKLSAgICAsIG1faGFzaCgwKQot
ewotICAgIEFTU0VSVChtX2RhdGEpOwotICAgIEFTU0VSVChtX2xlbmd0aCk7Ci19Ci0KIFN0cmlu
Z0ltcGw6On5TdHJpbmdJbXBsKCkKIHsKICAgICBpZiAoaW5UYWJsZSgpKQpAQCAtMTIwLDEwICs2
Nyw4NiBAQCBTdHJpbmdJbXBsOjp+U3RyaW5nSW1wbCgpCiAKIFN0cmluZ0ltcGwqIFN0cmluZ0lt
cGw6OmVtcHR5KCkKIHsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZ0ltcGwsIGVtcHR5
U3RyaW5nLCAoKSk7CisgICAgLy8gQSBub24tbnVsbCBwb2ludGVyIGF0IGFuIGludmFsaWQgYWRk
cmVzcyAoaW4gcGFnZSB6ZXJvKSBzbyB0aGF0IGlmIGl0IHdlcmUgdG8gYmUgYWNjZXNzZWQgd2UK
KyAgICAvLyBzaG91bGQgY2F0Y2ggdGhlIGVycm9yIHdpdGggZmF1bHQgKGhvd2V2ZXIgaXQgc2hv
dWxkIGJlIGltcG9zc2libGUgdG8gYWNjZXNzLCBzaW5jZSBsZW5ndGggaXMgemVybykuCisgICAg
c3RhdGljIGNvbnN0IFVDaGFyKiBpbnZhbGlkTm9uTnVsbFVDaGFyUHRyID0gcmVpbnRlcnByZXRf
Y2FzdDxVQ2hhcio+KHN0YXRpY19jYXN0PGludHB0cl90PigxKSk7CisgICAgREVGSU5FX1NUQVRJ
Q19MT0NBTChTdHJpbmdJbXBsLCBlbXB0eVN0cmluZywgKGludmFsaWROb25OdWxsVUNoYXJQdHIs
IDAsIENvbnN0cnVjdFN0YXRpY1N0cmluZykpOwogICAgIHJldHVybiAmZW1wdHlTdHJpbmc7CiB9
CiAKK1Bhc3NSZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6Y3JlYXRlVW5pbml0aWFsaXpl
ZCh1bnNpZ25lZCBsZW5ndGgsIFVDaGFyKiYgZGF0YSkKK3sKKyAgICBpZiAoIWxlbmd0aCkgewor
ICAgICAgICBkYXRhID0gMDsKKyAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgfQorCisgICAg
Ly8gQWxsb2NhdGUgYSBzaW5nbGUgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBjb250YWluIHRoZSBT
dHJpbmdJbXBsCisgICAgLy8gc3RydWN0IGFzIHdlbGwgYXMgdGhlIGRhdGEgd2hpY2ggaXQgY29u
dGFpbnMuIFRoaXMgcmVtb3ZlcyBvbmUgCisgICAgLy8gaGVhcCBhbGxvY2F0aW9uIGZyb20gdGhp
cyBjYWxsLgorICAgIGlmIChsZW5ndGggPiAoKHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6
bWF4KCkgLSBzaXplb2YoU3RyaW5nSW1wbCkpIC8gc2l6ZW9mKFVDaGFyKSkpCisgICAgICAgIENS
QVNIKCk7CisgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoU3RyaW5nSW1wbCkgKyBsZW5ndGggKiBz
aXplb2YoVUNoYXIpOworICAgIFN0cmluZ0ltcGwqIHN0cmluZyA9IHN0YXRpY19jYXN0PFN0cmlu
Z0ltcGwqPihmYXN0TWFsbG9jKHNpemUpKTsKKworICAgIGRhdGEgPSByZWludGVycHJldF9jYXN0
PFVDaGFyKj4oc3RyaW5nICsgMSk7CisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyAoc3RyaW5nKSBT
dHJpbmdJbXBsKGxlbmd0aCkpOworfQorCitQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0lt
cGw6OmNyZWF0ZShjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQorewor
ICAgIGlmICghY2hhcmFjdGVycyB8fCAhbGVuZ3RoKQorICAgICAgICByZXR1cm4gZW1wdHkoKTsK
KworICAgIFVDaGFyKiBkYXRhOworICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gc3RyaW5nID0g
Y3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGRhdGEpOworICAgIG1lbWNweShkYXRhLCBjaGFy
YWN0ZXJzLCBsZW5ndGggKiBzaXplb2YoVUNoYXIpKTsKKyAgICByZXR1cm4gc3RyaW5nOworfQor
CitQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6OmNyZWF0ZShjb25zdCBjaGFyKiBj
aGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCit7CisgICAgaWYgKCFjaGFyYWN0ZXJzIHx8ICFs
ZW5ndGgpCisgICAgICAgIHJldHVybiBlbXB0eSgpOworCisgICAgVUNoYXIqIGRhdGE7CisgICAg
UGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBzdHJpbmcgPSBjcmVhdGVVbmluaXRpYWxpemVkKGxlbmd0
aCwgZGF0YSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBsZW5ndGg7ICsraSkgewor
ICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBjaGFyYWN0ZXJzW2ldOworICAgICAgICBkYXRhW2ld
ID0gYzsKKyAgICB9CisgICAgcmV0dXJuIHN0cmluZzsKK30KKworUGFzc1JlZlB0cjxTdHJpbmdJ
bXBsPiBTdHJpbmdJbXBsOjpjcmVhdGUoY29uc3QgY2hhciogc3RyaW5nKQoreworICAgIGlmICgh
c3RyaW5nKQorICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICByZXR1cm4gY3JlYXRlKHN0cmlu
Zywgc3RybGVuKHN0cmluZykpOworfQorCitTaGFyZWRVQ2hhciogU3RyaW5nSW1wbDo6c2hhcmVk
QnVmZmVyKCkKK3sKKyAgICBpZiAobV9sZW5ndGggPCBtaW5MZW5ndGhUb1NoYXJlKQorICAgICAg
ICByZXR1cm4gMDsKKyAgICAvLyBBbGwgc3RhdGljIHN0cmluZ3MgYXJlIHNtYWxsZXIgdGhhdCB0
aGUgbWluaW1pbSBsZW5ndGggdG8gc2hhcmUuCisgICAgQVNTRVJUKCFpc1N0YXRpYygpKTsKKwor
ICAgIEJ1ZmZlck93bmVyc2hpcCBvd25lcnNoaXAgPSBidWZmZXJPd25lcnNoaXAoKTsKKworICAg
IGlmIChvd25lcnNoaXAgPT0gQnVmZmVySW50ZXJuYWwpCisgICAgICAgIHJldHVybiAwOworICAg
IGlmIChvd25lcnNoaXAgPT0gQnVmZmVyT3duZWQpIHsKKyAgICAgICAgQVNTRVJUKCFtX3NoYXJl
ZEJ1ZmZlcik7CisgICAgICAgIG1fc2hhcmVkQnVmZmVyID0gU2hhcmVkVUNoYXI6OmNyZWF0ZShu
ZXcgU2hhcmFibGVVQ2hhcihtX2RhdGEpKS5yZWxlYXNlUmVmKCk7CisgICAgICAgIG1fcmVmQ291
bnRBbmRGbGFncyA9IChtX3JlZkNvdW50QW5kRmxhZ3MgJiB+c19yZWZDb3VudE1hc2tCdWZmZXJP
d25lcnNoaXApIHwgQnVmZmVyU2hhcmVkOworICAgIH0KKworICAgIEFTU0VSVChvd25lcnNoaXAg
PT0gQnVmZmVyU2hhcmVkKTsKKyAgICBBU1NFUlQobV9zaGFyZWRCdWZmZXIpOworICAgIHJldHVy
biBtX3NoYXJlZEJ1ZmZlcjsKK30KKwogYm9vbCBTdHJpbmdJbXBsOjpjb250YWluc09ubHlXaGl0
ZXNwYWNlKCkKIHsKICAgICAvLyBGSVhNRTogVGhlIGRlZmluaXRpb24gb2Ygd2hpdGVzcGFjZSBo
ZXJlIGluY2x1ZGVzIGEgbnVtYmVyIG9mIGNoYXJhY3RlcnMKQEAgLTkxMyw2MyArOTM2LDYgQEAg
UGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjphZG9wdAogICAgIHJldHVybiBhZG9w
dFJlZihuZXcgU3RyaW5nSW1wbChidWZmZXIucmVsZWFzZSgpLCBsZW5ndGgpKTsKIH0KIAotUGFz
c1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjphZG9wdChWZWN0b3I8VUNoYXI+JiB2ZWN0
b3IpCi17Ci0gICAgc2l6ZV90IHNpemUgPSB2ZWN0b3Iuc2l6ZSgpOwotICAgIGlmIChzaXplID09
IDApCi0gICAgICAgIHJldHVybiBlbXB0eSgpOwotICAgIHJldHVybiBhZG9wdFJlZihuZXcgU3Ry
aW5nSW1wbCh2ZWN0b3IucmVsZWFzZUJ1ZmZlcigpLCBzaXplKSk7Ci19Ci0KLVBhc3NSZWZQdHI8
U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6Y3JlYXRlVW5pbml0aWFsaXplZCh1bnNpZ25lZCBsZW5n
dGgsIFVDaGFyKiYgZGF0YSkKLXsKLSAgICBpZiAoIWxlbmd0aCkgewotICAgICAgICBkYXRhID0g
MDsKLSAgICAgICAgcmV0dXJuIGVtcHR5KCk7Ci0gICAgfQotCi0gICAgLy8gQWxsb2NhdGUgYSBz
aW5nbGUgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBjb250YWluIHRoZSBTdHJpbmdJbXBsCi0gICAg
Ly8gc3RydWN0IGFzIHdlbGwgYXMgdGhlIGRhdGEgd2hpY2ggaXQgY29udGFpbnMuIFRoaXMgcmVt
b3ZlcyBvbmUgCi0gICAgLy8gaGVhcCBhbGxvY2F0aW9uIGZyb20gdGhpcyBjYWxsLgotICAgIHNp
emVfdCBzaXplID0gc2l6ZW9mKFN0cmluZ0ltcGwpICsgbGVuZ3RoICogc2l6ZW9mKFVDaGFyKTsK
LSAgICBTdHJpbmdJbXBsKiBzdHJpbmcgPSBzdGF0aWNfY2FzdDxTdHJpbmdJbXBsKj4oZmFzdE1h
bGxvYyhzaXplKSk7Ci0gICAgZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPihzdHJpbmcg
KyAxKTsKLSAgICBzdHJpbmcgPSBuZXcgKHN0cmluZykgU3RyaW5nSW1wbChsZW5ndGgpOwotICAg
IHJldHVybiBhZG9wdFJlZihzdHJpbmcpOwotfQotCi1QYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0
cmluZ0ltcGw6OmNyZWF0ZShjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3Ro
KQotewotICAgIGlmICghY2hhcmFjdGVycyB8fCAhbGVuZ3RoKQotICAgICAgICByZXR1cm4gZW1w
dHkoKTsKLQotICAgIFVDaGFyKiBkYXRhOwotICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gc3Ry
aW5nID0gY3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGRhdGEpOwotICAgIG1lbWNweShkYXRh
LCBjaGFyYWN0ZXJzLCBsZW5ndGggKiBzaXplb2YoVUNoYXIpKTsKLSAgICByZXR1cm4gc3RyaW5n
OwotfQotCi1QYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6OmNyZWF0ZShjb25zdCBj
aGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAgaWYgKCFjaGFyYWN0ZXJz
IHx8ICFsZW5ndGgpCi0gICAgICAgIHJldHVybiBlbXB0eSgpOwotCi0gICAgVUNoYXIqIGRhdGE7
Ci0gICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBzdHJpbmcgPSBjcmVhdGVVbmluaXRpYWxpemVk
KGxlbmd0aCwgZGF0YSk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBsZW5ndGg7ICsr
aSkgewotICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBjaGFyYWN0ZXJzW2ldOwotICAgICAgICBk
YXRhW2ldID0gYzsKLSAgICB9Ci0gICAgcmV0dXJuIHN0cmluZzsKLX0KLQotUGFzc1JlZlB0cjxT
dHJpbmdJbXBsPiBTdHJpbmdJbXBsOjpjcmVhdGUoY29uc3QgY2hhciogc3RyaW5nKQotewotICAg
IGlmICghc3RyaW5nKQotICAgICAgICByZXR1cm4gZW1wdHkoKTsKLSAgICByZXR1cm4gY3JlYXRl
KHN0cmluZywgc3RybGVuKHN0cmluZykpOwotfQotCiAjaWYgVVNFKEpTQykKIFBhc3NSZWZQdHI8
U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6Y3JlYXRlKGNvbnN0IEpTQzo6VVN0cmluZyYgc3RyKQog
ewpAQCAtMTAxNywyNSArOTgzLDQgQEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBs
Ojpjcm9zcwogICAgIHJldHVybiB0aHJlYWRzYWZlQ29weSgpOwogfQogCi1TdHJpbmdJbXBsOjpT
aGFyZWRVQ2hhciogU3RyaW5nSW1wbDo6c2hhcmVkQnVmZmVyKCkKLXsKLSAgICBpZiAobV9sZW5n
dGggPCBtaW5MZW5ndGhUb1NoYXJlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIEJ1ZmZlck93
bmVyc2hpcCBvd25lcnNoaXAgPSBidWZmZXJPd25lcnNoaXAoKTsKLQotICAgIGlmIChvd25lcnNo
aXAgPT0gQnVmZmVySW50ZXJuYWwpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKG93bmVy
c2hpcCA9PSBCdWZmZXJPd25lZCkgewotICAgICAgICBBU1NFUlQoIW1fc2hhcmVkQnVmZmVyKTsK
LSAgICAgICAgbV9zaGFyZWRCdWZmZXIgPSBTaGFyZWRVQ2hhcjo6Y3JlYXRlKG5ldyBTaGFyYWJs
ZVVDaGFyKGNvbnN0X2Nhc3Q8VUNoYXIqPihtX2RhdGEpKSkucmVsZWFzZVJlZigpOwotICAgICAg
ICBtX3JlZkNvdW50QW5kRmxhZ3MgPSAobV9yZWZDb3VudEFuZEZsYWdzICYgfnNfcmVmQ291bnRN
YXNrQnVmZmVyT3duZXJzaGlwKSB8IEJ1ZmZlclNoYXJlZDsKLSAgICB9Ci0KLSAgICBBU1NFUlQo
YnVmZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVyU2hhcmVkKTsKLSAgICBBU1NFUlQobV9zaGFyZWRC
dWZmZXIpOwotICAgIHJldHVybiBtX3NoYXJlZEJ1ZmZlcjsKLX0KLQogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5oCShyZXZpc2lvbiA1NTgz
MikKKysrIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmgJKHdvcmtpbmcgY29weSkK
QEAgLTU2LDYgKzU2LDggQEAgc3RydWN0IFVDaGFyQnVmZmVyVHJhbnNsYXRvcjsKIAogZW51bSBU
ZXh0Q2FzZVNlbnNpdGl2aXR5IHsgVGV4dENhc2VTZW5zaXRpdmUsIFRleHRDYXNlSW5zZW5zaXRp
dmUgfTsKIAordHlwZWRlZiBPd25GYXN0TWFsbG9jUHRyPGNvbnN0IFVDaGFyPiBTaGFyYWJsZVVD
aGFyOwordHlwZWRlZiBDcm9zc1RocmVhZFJlZkNvdW50ZWQ8U2hhcmFibGVVQ2hhcj4gU2hhcmVk
VUNoYXI7CiB0eXBlZGVmIGJvb2wgKCpDaGFyYWN0ZXJNYXRjaEZ1bmN0aW9uUHRyKShVQ2hhcik7
CiAKIGNsYXNzIFN0cmluZ0ltcGwgOiBwdWJsaWMgTm9uY29weWFibGUgewpAQCAtNjMsNDkgKzY1
LDEwMSBAQCBjbGFzcyBTdHJpbmdJbXBsIDogcHVibGljIE5vbmNvcHlhYmxlIHsKICAgICBmcmll
bmQgc3RydWN0IEhhc2hBbmRDaGFyYWN0ZXJzVHJhbnNsYXRvcjsKICAgICBmcmllbmQgc3RydWN0
IFVDaGFyQnVmZmVyVHJhbnNsYXRvcjsKIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIFRocmVh
ZEdsb2JhbERhdGE7Ci0KICAgICBlbnVtIEJ1ZmZlck93bmVyc2hpcCB7CiAgICAgICAgIEJ1ZmZl
ckludGVybmFsLAogICAgICAgICBCdWZmZXJPd25lZCwKICAgICAgICAgQnVmZmVyU2hhcmVkLAog
ICAgIH07CiAKLSAgICB0eXBlZGVmIE93bkZhc3RNYWxsb2NQdHI8Y29uc3QgVUNoYXI+IFNoYXJh
YmxlVUNoYXI7Ci0gICAgdHlwZWRlZiBDcm9zc1RocmVhZFJlZkNvdW50ZWQ8U2hhcmFibGVVQ2hh
cj4gU2hhcmVkVUNoYXI7CisgICAgLy8gVXNlZCB0byBjb25zdHJ1Y3Qgc3RhdGljIHN0cmluZ3Ms
IHdoaWNoIGhhdmUgYW4gc3BlY2lhbCByZWZDb3VudCB0aGF0IGNhbiBuZXZlciBoaXQgemVyby4K
KyAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIHN0YXRpYyBzdHJpbmcgd2lsbCBuZXZlciBiZSBk
ZXN0cm95ZWQsIHdoaWNoIGlzIGltcG9ydGFudCBiZWNhdXNlCisgICAgLy8gc3RhdGljIHN0cmlu
Z3Mgd2lsbCBiZSBzaGFyZWQgYWNyb3NzIHRocmVhZHMgJiByZWYtY291bnRlZCBpbiBhIG5vbi10
aHJlYWRzYWZlIG1hbm5lci4KKyAgICBlbnVtIFN0YXRpY1N0cmluZ0NvbnN0cnVjdFR5cGUgeyBD
b25zdHJ1Y3RTdGF0aWNTdHJpbmcgfTsKKyAgICBTdHJpbmdJbXBsKGNvbnN0IFVDaGFyKiBjaGFy
YWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgsIFN0YXRpY1N0cmluZ0NvbnN0cnVjdFR5cGUpCisgICAg
ICAgIDogbV9kYXRhKGNoYXJhY3RlcnMpCisgICAgICAgICwgbV9zaGFyZWRCdWZmZXIoMCkKKyAg
ICAgICAgLCBtX2xlbmd0aChsZW5ndGgpCisgICAgICAgICwgbV9yZWZDb3VudEFuZEZsYWdzKHNf
cmVmQ291bnRGbGFnU3RhdGljIHwgQnVmZmVySW50ZXJuYWwpCisgICAgICAgICwgbV9oYXNoKDAp
CisgICAgeworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaGFzaCBpcyBjb21wdXRlZCBzbyB0
aGF0IEF0b21pY1N0cmluZ0hhc2ggY2FuIGNhbGwgZXhpc3RpbmdIYXNoKCkKKyAgICAgICAgLy8g
d2l0aCBpbXB1bml0eS4gVGhlIGVtcHR5IHN0cmluZyBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgaXMg
bmV2ZXIgZW50ZXJlZCBpbnRvCisgICAgICAgIC8vIEF0b21pY1N0cmluZydzIEhhc2hLZXksIGJ1
dCBzdGlsbCBuZWVkcyB0byBjb21wYXJlIGNvcnJlY3RseS4KKyAgICAgICAgaGFzaCgpOworICAg
IH0KKworICAgIC8vIENyZWF0ZSBhIG5vcm1hbCBzdHJpbmcgd2l0aCBpbnRlcm5hbCBzdG9yYWdl
IChCdWZmZXJJbnRlcm5hbCkKKyAgICBTdHJpbmdJbXBsKHVuc2lnbmVkIGxlbmd0aCkKKyAgICAg
ICAgOiBtX2RhdGEocmVpbnRlcnByZXRfY2FzdDxjb25zdCBVQ2hhcio+KHRoaXMgKyAxKSkKKyAg
ICAgICAgLCBtX3NoYXJlZEJ1ZmZlcigwKQorICAgICAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKKyAg
ICAgICAgLCBtX3JlZkNvdW50QW5kRmxhZ3Moc19yZWZDb3VudEluY3JlbWVudCB8IEJ1ZmZlcklu
dGVybmFsKQorICAgICAgICAsIG1faGFzaCgwKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGF0
YSk7CisgICAgICAgIEFTU0VSVChtX2xlbmd0aCk7CisgICAgfQogCi0gICAgLy8gVXNlZCB0byBj
cmVhdGUgdGhlIGVtcHR5IHN0cmluZyAoIiIpLCBhdXRvbWF0aWNhbGx5IGhhc2hlcy4KLSAgICBT
dHJpbmdJbXBsKCk7Ci0gICAgLy8gQ3JlYXRlIGEgU3RyaW5nSW1wbCB3aXRoIGludGVybmFsIHN0
b3JhZ2UgKEJ1ZmZlckludGVybmFsKQotICAgIFN0cmluZ0ltcGwodW5zaWduZWQgbGVuZ3RoKTsK
ICAgICAvLyBDcmVhdGUgYSBTdHJpbmdJbXBsIGFkb3B0aW5nIG93bmVyc2hpcCBvZiB0aGUgcHJv
dmlkZWQgYnVmZmVyIChCdWZmZXJPd25lZCkKLSAgICBTdHJpbmdJbXBsKGNvbnN0IFVDaGFyKiwg
dW5zaWduZWQgbGVuZ3RoKTsKLSAgICAvLyBDcmVhdGUgYSBTdHJpbmdJbXBsIHVzaW5nIGEgc2hh
cmVkIGJ1ZmZlciAoQnVmZmVyU2hhcmVkKQotICAgIFN0cmluZ0ltcGwoY29uc3QgVUNoYXIqLCB1
bnNpZ25lZCBsZW5ndGgsIFBhc3NSZWZQdHI8U2hhcmVkVUNoYXI+KTsKKyAgICBTdHJpbmdJbXBs
KGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCisgICAgICAgIDogbV9k
YXRhKGNoYXJhY3RlcnMpCisgICAgICAgICwgbV9zaGFyZWRCdWZmZXIoMCkKKyAgICAgICAgLCBt
X2xlbmd0aChsZW5ndGgpCisgICAgICAgICwgbV9yZWZDb3VudEFuZEZsYWdzKHNfcmVmQ291bnRJ
bmNyZW1lbnQgfCBCdWZmZXJPd25lZCkKKyAgICAgICAgLCBtX2hhc2goMCkKKyAgICB7CisgICAg
ICAgIEFTU0VSVChtX2RhdGEpOworICAgICAgICBBU1NFUlQobV9sZW5ndGgpOworICAgIH0KKwor
ICAgIC8vIFVzZWQgdG8gY29uc3RydWN0IG5ldyBzdHJpbmdzIHNoYXJpbmcgYW4gZXhpc3Rpbmcg
U2hhcmVkVUNoYXIgKEJ1ZmZlclNoYXJlZCkKKyAgICBTdHJpbmdJbXBsKGNvbnN0IFVDaGFyKiBj
aGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgsIFBhc3NSZWZQdHI8U2hhcmVkVUNoYXI+IHNoYXJl
ZEJ1ZmZlcikKKyAgICAgICAgOiBtX2RhdGEoY2hhcmFjdGVycykKKyAgICAgICAgLCBtX3NoYXJl
ZEJ1ZmZlcihzaGFyZWRCdWZmZXIucmVsZWFzZVJlZigpKQorICAgICAgICAsIG1fbGVuZ3RoKGxl
bmd0aCkKKyAgICAgICAgLCBtX3JlZkNvdW50QW5kRmxhZ3Moc19yZWZDb3VudEluY3JlbWVudCB8
IEJ1ZmZlclNoYXJlZCkKKyAgICAgICAgLCBtX2hhc2goMCkKKyAgICB7CisgICAgICAgIEFTU0VS
VChtX2RhdGEpOworICAgICAgICBBU1NFUlQobV9sZW5ndGgpOworICAgIH0KIAogICAgIC8vIEZv
ciB1c2Ugb25seSBieSBBdG9taWNTdHJpbmcncyBYWFhUcmFuc2xhdG9yIGhlbHBlcnMuCi0gICAg
dm9pZCBzZXRIYXNoKHVuc2lnbmVkIGhhc2gpIHsgQVNTRVJUKCFtX2hhc2gpOyBtX2hhc2ggPSBo
YXNoOyB9Ci0gICAgCisgICAgdm9pZCBzZXRIYXNoKHVuc2lnbmVkIGhhc2gpCisgICAgeworICAg
ICAgICBBU1NFUlQoIW1faGFzaCk7CisgICAgICAgIEFTU0VSVChoYXNoID09IGNvbXB1dGVIYXNo
KG1fZGF0YSwgbV9sZW5ndGgpKTsKKyAgICAgICAgbV9oYXNoID0gaGFzaDsKKyAgICB9CisKIHB1
YmxpYzoKICAgICB+U3RyaW5nSW1wbCgpOwogCiAgICAgc3RhdGljIFBhc3NSZWZQdHI8U3RyaW5n
SW1wbD4gY3JlYXRlKGNvbnN0IFVDaGFyKiwgdW5zaWduZWQgbGVuZ3RoKTsKICAgICBzdGF0aWMg
UGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBjcmVhdGUoY29uc3QgY2hhciosIHVuc2lnbmVkIGxlbmd0
aCk7CiAgICAgc3RhdGljIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gY3JlYXRlKGNvbnN0IGNoYXIq
KTsKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBjcmVhdGVVbmluaXRpYWxpemVk
KHVuc2lnbmVkIGxlbmd0aCwgVUNoYXIqJiBkYXRhKTsKLQotICAgIHN0YXRpYyBQYXNzUmVmUHRy
PFN0cmluZ0ltcGw+IGNyZWF0ZVdpdGhUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXIoY29uc3QgU3Ry
aW5nSW1wbCYpOwotCi0gICAgc3RhdGljIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gY3JlYXRlU3Ry
aXBwaW5nTnVsbENoYXJhY3RlcnMoY29uc3QgVUNoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOwotICAg
IHN0YXRpYyBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGFkb3B0KFN0cmluZ0J1ZmZlciYpOwotICAg
IHN0YXRpYyBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGFkb3B0KFZlY3RvcjxVQ2hhcj4mKTsKICNp
ZiBVU0UoSlNDKQogICAgIHN0YXRpYyBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGNyZWF0ZShjb25z
dCBKU0M6OlVTdHJpbmcmKTsKICAgICBKU0M6OlVTdHJpbmcgdXN0cmluZygpOwogI2VuZGlmCiAK
KyAgICBzdGF0aWMgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBjcmVhdGVVbmluaXRpYWxpemVkKHVu
c2lnbmVkIGxlbmd0aCwgVUNoYXIqJiBkYXRhKTsKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxTdHJp
bmdJbXBsPiBjcmVhdGVXaXRoVGVybWluYXRpbmdOdWxsQ2hhcmFjdGVyKGNvbnN0IFN0cmluZ0lt
cGwmKTsKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBjcmVhdGVTdHJpcHBpbmdO
dWxsQ2hhcmFjdGVycyhjb25zdCBVQ2hhciosIHVuc2lnbmVkIGxlbmd0aCk7CisKKyAgICB0ZW1w
bGF0ZTxzaXplX3QgaW5saW5lQ2FwYWNpdHk+CisgICAgc3RhdGljIFBhc3NSZWZQdHI8U3RyaW5n
SW1wbD4gYWRvcHQoVmVjdG9yPFVDaGFyLCBpbmxpbmVDYXBhY2l0eT4mIHZlY3RvcikKKyAgICB7
CisgICAgICAgIGlmIChzaXplX3Qgc2l6ZSA9IHZlY3Rvci5zaXplKCkpIHsKKyAgICAgICAgICAg
IEFTU0VSVCh2ZWN0b3IuZGF0YSgpKTsKKyAgICAgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcg
U3RyaW5nSW1wbCh2ZWN0b3IucmVsZWFzZUJ1ZmZlcigpLCBzaXplKSk7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgfQorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFN0cmlu
Z0ltcGw+IGFkb3B0KFN0cmluZ0J1ZmZlciYpOworCiAgICAgU2hhcmVkVUNoYXIqIHNoYXJlZEJ1
ZmZlcigpOwotICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzKCkgeyByZXR1cm4gbV9kYXRhOyB9
CisgICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMoKSBjb25zdCB7IHJldHVybiBtX2RhdGE7IH0K
ICAgICB1bnNpZ25lZCBsZW5ndGgoKSB7IHJldHVybiBtX2xlbmd0aDsgfQogCiAgICAgYm9vbCBo
YXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXIoKSBjb25zdCB7IHJldHVybiBtX3JlZkNvdW50QW5k
RmxhZ3MgJiBzX3JlZkNvdW50RmxhZ0hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3RlcjsgfQpAQCAt
MTEzLDE1ICsxNjcsMjMgQEAgcHVibGljOgogICAgIGJvb2wgaW5UYWJsZSgpIGNvbnN0IHsgcmV0
dXJuIG1fcmVmQ291bnRBbmRGbGFncyAmIHNfcmVmQ291bnRGbGFnSW5UYWJsZTsgfQogICAgIHZv
aWQgc2V0SW5UYWJsZSgpIHsgbV9yZWZDb3VudEFuZEZsYWdzIHw9IHNfcmVmQ291bnRGbGFnSW5U
YWJsZTsgfQogCi0gICAgdW5zaWduZWQgaGFzaCgpIHsgaWYgKG1faGFzaCA9PSAwKSBtX2hhc2gg
PSBjb21wdXRlSGFzaChtX2RhdGEsIG1fbGVuZ3RoKTsgcmV0dXJuIG1faGFzaDsgfQorLy8gU1lO
QyBTWU5DIFNZTkMKKy8vIFNZTkMgU1lOQyBTWU5DCisvLyBTWU5DIFNZTkMgU1lOQworLy8gU1lO
QyBTWU5DIFNZTkMKKy8vIFNZTkMgU1lOQyBTWU5DCisKKyAgICB1bnNpZ25lZCBoYXNoKCkgY29u
c3QgeyBpZiAoIW1faGFzaCkgbV9oYXNoID0gY29tcHV0ZUhhc2gobV9kYXRhLCBtX2xlbmd0aCk7
IHJldHVybiBtX2hhc2g7IH0KICAgICB1bnNpZ25lZCBleGlzdGluZ0hhc2goKSBjb25zdCB7IEFT
U0VSVChtX2hhc2gpOyByZXR1cm4gbV9oYXNoOyB9Ci0gICAgaW5saW5lIHN0YXRpYyB1bnNpZ25l
ZCBjb21wdXRlSGFzaChjb25zdCBVQ2hhciogZGF0YSwgdW5zaWduZWQgbGVuZ3RoKSB7IHJldHVy
biBXVEY6OnN0cmluZ0hhc2goZGF0YSwgbGVuZ3RoKTsgfQotICAgIGlubGluZSBzdGF0aWMgdW5z
aWduZWQgY29tcHV0ZUhhc2goY29uc3QgY2hhciogZGF0YSkgeyByZXR1cm4gV1RGOjpzdHJpbmdI
YXNoKGRhdGEpOyB9CisgICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVIYXNoKGNvbnN0IFVDaGFy
KiBkYXRhLCB1bnNpZ25lZCBsZW5ndGgpIHsgcmV0dXJuIFdURjo6c3RyaW5nSGFzaChkYXRhLCBs
ZW5ndGgpOyB9CisgICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVIYXNoKGNvbnN0IGNoYXIqIGRh
dGEpIHsgcmV0dXJuIFdURjo6c3RyaW5nSGFzaChkYXRhKTsgfQogCiAgICAgU3RyaW5nSW1wbCog
cmVmKCkgeyBtX3JlZkNvdW50QW5kRmxhZ3MgKz0gc19yZWZDb3VudEluY3JlbWVudDsgcmV0dXJu
IHRoaXM7IH0KICAgICBBTFdBWVNfSU5MSU5FIHZvaWQgZGVyZWYoKSB7IG1fcmVmQ291bnRBbmRG
bGFncyAtPSBzX3JlZkNvdW50SW5jcmVtZW50OyBpZiAoIShtX3JlZkNvdW50QW5kRmxhZ3MgJiAo
c19yZWZDb3VudE1hc2sgfCBzX3JlZkNvdW50RmxhZ1N0YXRpYykpKSBkZWxldGUgdGhpczsgfQog
ICAgIEFMV0FZU19JTkxJTkUgYm9vbCBoYXNPbmVSZWYoKSBjb25zdCB7IHJldHVybiAobV9yZWZD
b3VudEFuZEZsYWdzICYgKHNfcmVmQ291bnRNYXNrIHwgc19yZWZDb3VudEZsYWdTdGF0aWMpKSA9
PSBzX3JlZkNvdW50SW5jcmVtZW50OyB9CiAKKyAgICBzdGF0aWMgU3RyaW5nSW1wbCogZW1wdHko
KTsKKwogICAgIC8vIFJldHVybnMgYSBTdHJpbmdJbXBsIHN1aXRhYmxlIGZvciB1c2Ugb24gYW5v
dGhlciB0aHJlYWQuCiAgICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBjcm9zc1RocmVhZFN0cmlu
ZygpOwogICAgIC8vIE1ha2VzIGEgZGVlcCBjb3B5LiBIZWxwZnVsIG9ubHkgaWYgeW91IG5lZWQg
dG8gdXNlIGEgU3RyaW5nIG9uIGFub3RoZXIgdGhyZWFkCkBAIC0xNzgsOCArMjQwLDYgQEAgcHVi
bGljOgogICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gcmVwbGFjZShTdHJpbmdJbXBsKiwgU3Ry
aW5nSW1wbCopOwogICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gcmVwbGFjZSh1bnNpZ25lZCBp
bmRleCwgdW5zaWduZWQgbGVuLCBTdHJpbmdJbXBsKik7CiAKLSAgICBzdGF0aWMgU3RyaW5nSW1w
bCogZW1wdHkoKTsKLQogICAgIFZlY3RvcjxjaGFyPiBhc2NpaSgpOwogCiAgICAgV1RGOjpVbmlj
b2RlOjpEaXJlY3Rpb24gZGVmYXVsdFdyaXRpbmdEaXJlY3Rpb24oKTsKQEAgLTE5Nyw4ICsyNTcs
NiBAQCBwcml2YXRlOgogCiAgICAgc3RhdGljIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gY3JlYXRl
U3RyaXBwaW5nTnVsbENoYXJhY3RlcnNTbG93Q2FzZShjb25zdCBVQ2hhciosIHVuc2lnbmVkIGxl
bmd0aCk7CiAgICAgCi0gICAgLy8gVGhlIFN0cmluZ0ltcGwgc3RydWN0IGFuZCBpdHMgZGF0YSBt
YXkgYmUgYWxsb2NhdGVkIHdpdGhpbiBhIHNpbmdsZSBoZWFwIGJsb2NrLgotICAgIC8vIEluIHRo
aXMgY2FzZSwgdGhlIG1fZGF0YSBwb2ludGVyIGlzIGFuICJpbnRlcm5hbCBidWZmZXIiLCBhbmQg
ZG9lcyBub3QgbmVlZCB0byBiZSBkZWFsbG9jYXRlZC4KICAgICBCdWZmZXJPd25lcnNoaXAgYnVm
ZmVyT3duZXJzaGlwKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8QnVmZmVyT3duZXJzaGlw
PihtX3JlZkNvdW50QW5kRmxhZ3MgJiBzX3JlZkNvdW50TWFza0J1ZmZlck93bmVyc2hpcCk7IH0K
IAogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzX3JlZkNvdW50TWFzayA9IDB4RkZGRkZGRTA7
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50569</attachid>
            <date>2010-03-11 18:26:50 -0800</date>
            <delta_ts>2010-03-11 19:08:05 -0800</delta_ts>
            <desc>The patch</desc>
            <filename>patch.strustrclean.2.txt</filename>
            <type>text/plain</type>
            <size>38653</size>
            <attacher name="Gavin Barraclough">barraclough</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU1ODY5KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzUgQEAKKzIwMTAtMDMtMTEgIEdhdmluIEJh
cnJhY2xvdWdoICA8YmFycmFjbG91Z2hAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0zNjA0MQorICAgICAgICBSZW1vdmUgdW5uZWNlc3NhcnkgZGlmZmVyZW5jZXMg
aW4gY29tbW9uIGNvZGUgYmV0d2VlbiBXZWJDb3JlOjpTdHJpbmdJbXBsICYgSlNDOjpVU3RyaW5n
SW1wbAorCisgICAgICAgIE11Y2ggb2YgdGhlIGNvZGUgaW4gV2ViQ29yZTo6U3RyaW5nSW1wbCBh
bmQgSlNDOjpVU3RyaW5nSW1wbCBpcyBub3cgdmVyeSBzaW1pbGFyLAorICAgICAgICBidXQgaGFz
IHRyaXZpYWwgYW5kIHVubmVjZXNzYXJ5IGZvcm1hdHRpbmcgZGlmZmVyZW5jZXMsIHN1Y2ggYXMg
dGhlIGV4YWN0IHdvcmRpbmcKKyAgICAgICAgb2YgY29tbWVudHMsIG1pc3NpbmcgQVNTRVJUcywg
ZnVuY3Rpb25zIGltcGxlbWVudGVkIGluIHRoZSAuaCB2cyAuY3BwIGV0Yy4KKworICAgICAgICAq
IHJ1bnRpbWUvSWRlbnRpZmllci5jcHA6CisgICAgICAgIChKU0M6OklkZW50aWZpZXI6OmFkZCk6
IFVTdHJpbmdJbXBsOjplbXB0eSgpIG5vdyBhdXRvbWF0aWNhbGx5IGhhc2hlcywgdWFzIHBlciBX
ZWJDb3JlIHN0cmluZ3MuCisgICAgICAgIChKU0M6OklkZW50aWZpZXI6OmFkZFNsb3dDYXNlKTog
VVN0cmluZ0ltcGw6OmVtcHR5KCkgbm93IGF1dG9tYXRpY2FsbHkgaGFzaGVzLCB1YXMgcGVyIFdl
YkNvcmUgc3RyaW5ncy4KKyAgICAgICAgKiBydW50aW1lL1VTdHJpbmdJbXBsLmNwcDoKKyAgICAg
ICAgKEpTQzo6VVN0cmluZ0ltcGw6On5VU3RyaW5nSW1wbCk6IE9ubHkgY2FsbCBidWZmZXJPd25l
cnNoaXAoKSBvbmNlLCBhZGQgbWlzc2luZyBBU1NFUlRzLgorICAgICAgICAoSlNDOjpVU3RyaW5n
SW1wbDo6Y3JlYXRlVW5pbml0aWFsaXplZCk6IE1vdmUgZnJvbSAuaCwgbm90IGNvbW1vbmx5IGNh
bGxlZCwgbm8gbmVlZCB0byBpbmxpbmUuCisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBsOjpjcmVh
dGUpOiBNb3ZlIGZyb20gLmgsIG5vdCBjb21tb25seSBjYWxsZWQsIG5vIG5lZWQgdG8gaW5saW5l
LgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6c2hhcmVkQnVmZmVyKTogUmV3cml0dGVuIHRv
IG1vcmUgY2xvc2VseSBtYXRjaCBXZWJDb3JlIGltcGxlbWVudGF0aW9uLCByZW1vdmUgbmVlZCBm
b3Igc2VwYXJhdGUgYmFzZVNoYXJlZEJ1ZmZlcigpIG1ldGhvZC4KKyAgICAgICAgKiBydW50aW1l
L1VTdHJpbmdJbXBsLmg6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBsOjpVU3RyaW5nSW1wbCk6
IEF1dG9tYXRpY2FsbHkgaGFzaCBzdGF0aWMgc3RyaW5ncywgQVNTRVJUIG1fZGF0YSAmIG1fbGVu
Z3RoIGFyZSBub24tbnVsbC9ub24temVybyBpbiBub24tc3RhdGljIHN0cmluZ3MuCisgICAgICAg
IChKU0M6OlVTdHJpbmdJbXBsOjpzZXRIYXNoKTogQWRkIG1pc3NpbmcgQVNTRVJULgorICAgICAg
ICAoSlNDOjpVU3RyaW5nSW1wbDo6Y3JlYXRlKTogTW92ZWQgdG8gLmNwcCAvIGFkZGVkIG1pc3Np
bmcgY2hlY2sgZm9yIGVtcHR5IHN0cmluZyBjcmVhdGlvbi4KKyAgICAgICAgKEpTQzo6VVN0cmlu
Z0ltcGw6OmFkb3B0KTogVmVjdG9yLnNpemUoKSByZXR1cm5zIHNpemVfdCwgbm90IHVuc2lnbmVk
LgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6Y29zdCk6IFJlbmFtZWQgbV9idWZmZXJTdWJz
dHJpbmcgLT4gbV9zdWJzdHJpbmdCdWZmZXIKKyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6Omhh
c2gpOiBSZW9yZGVyZWQgaW4gZmlsZS4KKyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OmV4aXN0
aW5nSGFzaCk6IFJlb3JkZXJlZCBpbiBmaWxlLgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6
Y29tcHV0ZUhhc2gpOiBSZW9yZGVyZWQgaW4gZmlsZSwgcmVuYW1lZCBwYXJhbWV0ZXIuCisgICAg
ICAgIChKU0M6OlVTdHJpbmdJbXBsOjpjaGVja0NvbnNpc3RlbmN5KTogcmV3cm90ZSBBU1NFUlQu
CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBsOjpidWZmZXJPd25lcnNoaXApOiBSZXR1cm4gdHlw
ZSBzaG91bGQgYmUgQnVmZmVyT3duZXJzaGlwLgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6
KTogTW92ZWQgZnJpZW5kcyB0byBoZWFkIG9mIGNsYXNzLgorCiAyMDEwLTAzLTExICBNYXJrIFJv
d2UgIDxtcm93ZUBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgVGltIEhhdGNoZXIu
CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0lkZW50aWZpZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmllci5jcHAJKHJldmlzaW9uIDU1ODMz
KQorKysgSmF2YVNjcmlwdENvcmUvcnVudGltZS9JZGVudGlmaWVyLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDMsNyArNDMsNyBAQCBwdWJsaWM6CiAgICAgICAgIGZvciAoSGFzaFNldDxVU3RyaW5n
OjpSZXAqPjo6aXRlcmF0b3IgaXRlciA9IG1fdGFibGUuYmVnaW4oKTsgaXRlciAhPSBlbmQ7ICsr
aXRlcikKICAgICAgICAgICAgICgqaXRlciktPnNldElzSWRlbnRpZmllcihmYWxzZSk7CiAgICAg
fQotICAgIAorCiAgICAgc3RkOjpwYWlyPEhhc2hTZXQ8VVN0cmluZzo6UmVwKj46Oml0ZXJhdG9y
LCBib29sPiBhZGQoVVN0cmluZzo6UmVwKiB2YWx1ZSkKICAgICB7CiAgICAgICAgIHN0ZDo6cGFp
cjxIYXNoU2V0PFVTdHJpbmc6OlJlcCo+OjppdGVyYXRvciwgYm9vbD4gcmVzdWx0ID0gbV90YWJs
ZS5hZGQodmFsdWUpOwpAQCAtMTI5LDEwICsxMjksOCBAQCBQYXNzUmVmUHRyPFVTdHJpbmc6OlJl
cD4gSWRlbnRpZmllcjo6YWRkCiAgICAgICAgIHJlcC0+aGFzaCgpOwogICAgICAgICByZXR1cm4g
cmVwOwogICAgIH0KLSAgICBpZiAoIWNbMF0pIHsKLSAgICAgICAgVVN0cmluZzo6UmVwOjplbXB0
eSgpLT5oYXNoKCk7CisgICAgaWYgKCFjWzBdKQogICAgICAgICByZXR1cm4gVVN0cmluZzo6UmVw
OjplbXB0eSgpOwotICAgIH0KICAgICBpZiAoIWNbMV0pCiAgICAgICAgIHJldHVybiBhZGQoZ2xv
YmFsRGF0YSwgZ2xvYmFsRGF0YS0+c21hbGxTdHJpbmdzLnNpbmdsZUNoYXJhY3RlclN0cmluZ1Jl
cChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjWzBdKSkpOwogCkBAIC0xOTMsMTAgKzE5MSw4
IEBAIFBhc3NSZWZQdHI8VVN0cmluZzo6UmVwPiBJZGVudGlmaWVyOjphZGQKICAgICAgICAgaWYg
KGMgPD0gMHhGRikKICAgICAgICAgICAgIHJldHVybiBhZGQoZ2xvYmFsRGF0YSwgZ2xvYmFsRGF0
YS0+c21hbGxTdHJpbmdzLnNpbmdsZUNoYXJhY3RlclN0cmluZ1JlcChjKSk7CiAgICAgfQotICAg
IGlmICghbGVuZ3RoKSB7Ci0gICAgICAgIFVTdHJpbmc6OlJlcDo6ZW1wdHkoKS0+aGFzaCgpOwor
ICAgIGlmICghbGVuZ3RoKQogICAgICAgICByZXR1cm4gVVN0cmluZzo6UmVwOjplbXB0eSgpOwot
ICAgIH0KICAgICBVQ2hhckJ1ZmZlciBidWYgPSB7cywgbGVuZ3RofTsgCiAgICAgcGFpcjxIYXNo
U2V0PFVTdHJpbmc6OlJlcCo+OjppdGVyYXRvciwgYm9vbD4gYWRkUmVzdWx0ID0gZ2xvYmFsRGF0
YS0+aWRlbnRpZmllclRhYmxlLT5hZGQ8VUNoYXJCdWZmZXIsIFVDaGFyQnVmZmVyVHJhbnNsYXRv
cj4oYnVmKTsKIApAQCAtMjI0LDEwICsyMjAsOCBAQCBQYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4g
SWRlbnRpZmllcjo6YWRkCiAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICB9
CiAgICAgfQotICAgIGlmICghci0+bGVuZ3RoKCkpIHsKLSAgICAgICAgVVN0cmluZzo6UmVwOjpl
bXB0eSgpLT5oYXNoKCk7CisgICAgaWYgKCFyLT5sZW5ndGgoKSkKICAgICAgICAgcmV0dXJuIFVT
dHJpbmc6OlJlcDo6ZW1wdHkoKTsKLSAgICB9CiAgICAgcmV0dXJuICpnbG9iYWxEYXRhLT5pZGVu
dGlmaWVyVGFibGUtPmFkZChyKS5maXJzdDsKIH0KIApJbmRleDogSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9VU3RyaW5nSW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9VU3RyaW5nSW1wbC5jcHAJKHJldmlzaW9uIDU1ODMyKQorKysgSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9VU3RyaW5nSW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDMzIEBAIHVz
aW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBKU0MgewogCitzdGF0aWMgY29uc3QgdW5z
aWduZWQgbWluTGVuZ3RoVG9TaGFyZSA9IDIwOworCitVU3RyaW5nSW1wbDo6flVTdHJpbmdJbXBs
KCkKK3sKKyAgICBBU1NFUlQoIWlzU3RhdGljKCkpOworICAgIGNoZWNrQ29uc2lzdGVuY3koKTsK
KworICAgIGlmIChpc0lkZW50aWZpZXIoKSkKKyAgICAgICAgSWRlbnRpZmllcjo6cmVtb3ZlKHRo
aXMpOworCisgICAgQnVmZmVyT3duZXJzaGlwIG93bmVyc2hpcCA9IGJ1ZmZlck93bmVyc2hpcCgp
OworICAgIGlmIChvd25lcnNoaXAgIT0gQnVmZmVySW50ZXJuYWwpIHsKKyAgICAgICAgaWYgKG93
bmVyc2hpcCA9PSBCdWZmZXJPd25lZCkgeworICAgICAgICAgICAgQVNTRVJUKCFtX3NoYXJlZEJ1
ZmZlcik7CisgICAgICAgICAgICBBU1NFUlQobV9kYXRhKTsKKyAgICAgICAgICAgIGZhc3RGcmVl
KGNvbnN0X2Nhc3Q8VUNoYXIqPihtX2RhdGEpKTsKKyAgICAgICAgfSBlbHNlIGlmIChvd25lcnNo
aXAgPT0gQnVmZmVyU3Vic3RyaW5nKSB7CisgICAgICAgICAgICBBU1NFUlQobV9zdWJzdHJpbmdC
dWZmZXIpOworICAgICAgICAgICAgbV9zdWJzdHJpbmdCdWZmZXItPmRlcmVmKCk7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlQob3duZXJzaGlwID09IEJ1ZmZlclNoYXJlZCk7
CisgICAgICAgICAgICBBU1NFUlQobV9zaGFyZWRCdWZmZXIpOworICAgICAgICAgICAgbV9zaGFy
ZWRCdWZmZXItPmRlcmVmKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIFVTdHJpbmdJbXBsKiBV
U3RyaW5nSW1wbDo6ZW1wdHkoKQogewogICAgIC8vIEEgbm9uLW51bGwgcG9pbnRlciBhdCBhbiBp
bnZhbGlkIGFkZHJlc3MgKGluIHBhZ2UgemVybykgc28gdGhhdCBpZiBpdCB3ZXJlIHRvIGJlIGFj
Y2Vzc2VkIHdlCkBAIC00NSw2ICs3MiwyNSBAQCBVU3RyaW5nSW1wbCogVVN0cmluZ0ltcGw6OmVt
cHR5KCkKICAgICByZXR1cm4gJmVtcHR5U3RyaW5nOwogfQogCitQYXNzUmVmUHRyPFVTdHJpbmdJ
bXBsPiBVU3RyaW5nSW1wbDo6Y3JlYXRlVW5pbml0aWFsaXplZCh1bnNpZ25lZCBsZW5ndGgsIFVD
aGFyKiYgZGF0YSkKK3sKKyAgICBpZiAoIWxlbmd0aCkgeworICAgICAgICBkYXRhID0gMDsKKyAg
ICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgYSBzaW5nbGUg
YnVmZmVyIGxhcmdlIGVub3VnaCB0byBjb250YWluIHRoZSBTdHJpbmdJbXBsCisgICAgLy8gc3Ry
dWN0IGFzIHdlbGwgYXMgdGhlIGRhdGEgd2hpY2ggaXQgY29udGFpbnMuIFRoaXMgcmVtb3ZlcyBv
bmUgCisgICAgLy8gaGVhcCBhbGxvY2F0aW9uIGZyb20gdGhpcyBjYWxsLgorICAgIGlmIChsZW5n
dGggPiAoKHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgLSBzaXplb2YoVVN0cmlu
Z0ltcGwpKSAvIHNpemVvZihVQ2hhcikpKQorICAgICAgICBDUkFTSCgpOworICAgIHNpemVfdCBz
aXplID0gc2l6ZW9mKFVTdHJpbmdJbXBsKSArIGxlbmd0aCAqIHNpemVvZihVQ2hhcik7CisgICAg
VVN0cmluZ0ltcGwqIHN0cmluZyA9IHN0YXRpY19jYXN0PFVTdHJpbmdJbXBsKj4oZmFzdE1hbGxv
YyhzaXplKSk7CisKKyAgICBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxVQ2hhcio+KHN0cmluZyAr
IDEpOworICAgIHJldHVybiBhZG9wdFJlZihuZXcgKHN0cmluZykgVVN0cmluZ0ltcGwobGVuZ3Ro
KSk7Cit9CisKIFBhc3NSZWZQdHI8VVN0cmluZ0ltcGw+IFVTdHJpbmdJbXBsOjpjcmVhdGUoY29u
c3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKIHsKICAgICBpZiAoIWNoYXJh
Y3RlcnMgfHwgIWxlbmd0aCkKQEAgLTc3LDUwICsxMjMsMzUgQEAgUGFzc1JlZlB0cjxVU3RyaW5n
SW1wbD4gVVN0cmluZ0ltcGw6OmNyZQogICAgIHJldHVybiBjcmVhdGUoc3RyaW5nLCBzdHJsZW4o
c3RyaW5nKSk7CiB9CiAKLVNoYXJlZFVDaGFyKiBVU3RyaW5nSW1wbDo6YmFzZVNoYXJlZEJ1ZmZl
cigpCitQYXNzUmVmUHRyPFVTdHJpbmdJbXBsPiBVU3RyaW5nSW1wbDo6Y3JlYXRlKFBhc3NSZWZQ
dHI8U2hhcmVkVUNoYXI+IHNoYXJlZEJ1ZmZlciwgY29uc3QgVUNoYXIqIGJ1ZmZlciwgdW5zaWdu
ZWQgbGVuZ3RoKQogewotICAgIEFTU0VSVCgoYnVmZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVyU2hh
cmVkKQotICAgICAgICB8fCAoKGJ1ZmZlck93bmVyc2hpcCgpID09IEJ1ZmZlck93bmVkKSAmJiAh
bV9idWZmZXIpKTsKLQotICAgIGlmIChidWZmZXJPd25lcnNoaXAoKSAhPSBCdWZmZXJTaGFyZWQp
IHsKLSAgICAgICAgbV9yZWZDb3VudEFuZEZsYWdzID0gKG1fcmVmQ291bnRBbmRGbGFncyAmIH5z
X3JlZkNvdW50TWFza0J1ZmZlck93bmVyc2hpcCkgfCBCdWZmZXJTaGFyZWQ7Ci0gICAgICAgIG1f
YnVmZmVyU2hhcmVkID0gU2hhcmVkVUNoYXI6OmNyZWF0ZShuZXcgU2hhcmFibGVVQ2hhcihtX2Rh
dGEpKS5yZWxlYXNlUmVmKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1fYnVmZmVyU2hhcmVkOwor
ICAgIGlmICghbGVuZ3RoKQorICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICByZXR1cm4gYWRv
cHRSZWYobmV3IFVTdHJpbmdJbXBsKGJ1ZmZlciwgbGVuZ3RoLCBzaGFyZWRCdWZmZXIpKTsKIH0K
IAogU2hhcmVkVUNoYXIqIFVTdHJpbmdJbXBsOjpzaGFyZWRCdWZmZXIoKQogewotICAgIGlmICht
X2xlbmd0aCA8IHNfbWluTGVuZ3RoVG9TaGFyZSkKKyAgICBpZiAobV9sZW5ndGggPCBtaW5MZW5n
dGhUb1NoYXJlKQogICAgICAgICByZXR1cm4gMDsKKyAgICAvLyBBbGwgc3RhdGljIHN0cmluZ3Mg
YXJlIHNtYWxsZXIgdGhhdCB0aGUgbWluaW1pbSBsZW5ndGggdG8gc2hhcmUuCiAgICAgQVNTRVJU
KCFpc1N0YXRpYygpKTsKIAotICAgIFVTdHJpbmdJbXBsKiBvd25lciA9IGJ1ZmZlck93bmVyU3Ry
aW5nKCk7Ci0gICAgaWYgKG93bmVyLT5idWZmZXJPd25lcnNoaXAoKSA9PSBCdWZmZXJJbnRlcm5h
bCkKLSAgICAgICAgcmV0dXJuIDA7CisgICAgQnVmZmVyT3duZXJzaGlwIG93bmVyc2hpcCA9IGJ1
ZmZlck93bmVyc2hpcCgpOwogCi0gICAgcmV0dXJuIG93bmVyLT5iYXNlU2hhcmVkQnVmZmVyKCk7
Ci19Ci0KLVVTdHJpbmdJbXBsOjp+VVN0cmluZ0ltcGwoKQotewotICAgIEFTU0VSVCghaXNTdGF0
aWMoKSk7Ci0gICAgY2hlY2tDb25zaXN0ZW5jeSgpOwotCi0gICAgaWYgKGlzSWRlbnRpZmllcigp
KQotICAgICAgICBJZGVudGlmaWVyOjpyZW1vdmUodGhpcyk7Ci0KLSAgICBpZiAoYnVmZmVyT3du
ZXJzaGlwKCkgIT0gQnVmZmVySW50ZXJuYWwpIHsKLSAgICAgICAgaWYgKGJ1ZmZlck93bmVyc2hp
cCgpID09IEJ1ZmZlck93bmVkKQotICAgICAgICAgICAgZmFzdEZyZWUoY29uc3RfY2FzdDxVQ2hh
cio+KG1fZGF0YSkpOwotICAgICAgICBlbHNlIGlmIChidWZmZXJPd25lcnNoaXAoKSA9PSBCdWZm
ZXJTdWJzdHJpbmcpCi0gICAgICAgICAgICBtX2J1ZmZlclN1YnN0cmluZy0+ZGVyZWYoKTsKLSAg
ICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBBU1NFUlQoYnVmZmVyT3duZXJzaGlwKCkgPT0gQnVm
ZmVyU2hhcmVkKTsKLSAgICAgICAgICAgIG1fYnVmZmVyU2hhcmVkLT5kZXJlZigpOwotICAgICAg
ICB9CisgICAgaWYgKG93bmVyc2hpcCA9PSBCdWZmZXJJbnRlcm5hbCkKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgaWYgKG93bmVyc2hpcCA9PSBCdWZmZXJTdWJzdHJpbmcpCisgICAgICAgIHJldHVy
biBtX3N1YnN0cmluZ0J1ZmZlci0+c2hhcmVkQnVmZmVyKCk7CisgICAgaWYgKG93bmVyc2hpcCA9
PSBCdWZmZXJPd25lZCkgeworICAgICAgICBBU1NFUlQoIW1fc2hhcmVkQnVmZmVyKTsKKyAgICAg
ICAgbV9zaGFyZWRCdWZmZXIgPSBTaGFyZWRVQ2hhcjo6Y3JlYXRlKG5ldyBTaGFyYWJsZVVDaGFy
KG1fZGF0YSkpLnJlbGVhc2VSZWYoKTsKKyAgICAgICAgbV9yZWZDb3VudEFuZEZsYWdzID0gKG1f
cmVmQ291bnRBbmRGbGFncyAmIH5zX3JlZkNvdW50TWFza0J1ZmZlck93bmVyc2hpcCkgfCBCdWZm
ZXJTaGFyZWQ7CiAgICAgfQorCisgICAgQVNTRVJUKG93bmVyc2hpcCA9PSBCdWZmZXJTaGFyZWQp
OworICAgIEFTU0VSVChtX3NoYXJlZEJ1ZmZlcik7CisgICAgcmV0dXJuIG1fc2hhcmVkQnVmZmVy
OwogfQogCiB2b2lkIFVSb3BlSW1wbDo6ZGVyZWZGaWJlcnNOb25SZWN1cnNpdmUoVmVjdG9yPFVS
b3BlSW1wbCosIDMyPiYgd29ya1F1ZXVlKQpJbmRleDogSmF2YVNjcmlwdENvcmUvcnVudGltZS9V
U3RyaW5nSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvVVN0cmlu
Z0ltcGwuaAkocmV2aXNpb24gNTU4MzMpCisrKyBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL1VTdHJp
bmdJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTEwNSw0NyArMTA1LDEwMyBAQCBwcm90ZWN0ZWQ6
CiB9OwogCiBjbGFzcyBVU3RyaW5nSW1wbCA6IHB1YmxpYyBVU3RyaW5nT3JSb3BlSW1wbCB7Ci1w
dWJsaWM6Ci0gICAgdGVtcGxhdGU8c2l6ZV90IGlubGluZUNhcGFjaXR5PgotICAgIHN0YXRpYyBQ
YXNzUmVmUHRyPFVTdHJpbmdJbXBsPiBhZG9wdChWZWN0b3I8VUNoYXIsIGlubGluZUNhcGFjaXR5
PiYgdmVjdG9yKQorICAgIGZyaWVuZCBjbGFzcyBDU3RyaW5nVHJhbnNsYXRvcjsKKyAgICBmcmll
bmQgY2xhc3MgVUNoYXJCdWZmZXJUcmFuc2xhdG9yOworICAgIGZyaWVuZCBjbGFzcyBKSVQ7Cisg
ICAgZnJpZW5kIGNsYXNzIFNtYWxsU3RyaW5nc1N0b3JhZ2U7CisgICAgZnJpZW5kIGNsYXNzIFVT
dHJpbmdPclJvcGVJbXBsOworICAgIGZyaWVuZCB2b2lkIGluaXRpYWxpemVVU3RyaW5nKCk7Citw
cml2YXRlOgorICAgIC8vIEZvciBTbWFsbFN0cmluZ1N0b3JhZ2UsIHdoaWNoIGFsbG9jYXRlcyBh
biBhcnJheSBhbmQgdXNlcyBhbiBpbi1wbGFjZSBuZXcuCisgICAgVVN0cmluZ0ltcGwoKSB7IH0K
KworICAgIC8vIFVzZWQgdG8gY29uc3RydWN0IHN0YXRpYyBzdHJpbmdzLCB3aGljaCBoYXZlIGFu
IHNwZWNpYWwgcmVmQ291bnQgdGhhdCBjYW4gbmV2ZXIgaGl0IHplcm8uCisgICAgLy8gVGhpcyBt
ZWFucyB0aGF0IHRoZSBzdGF0aWMgc3RyaW5nIHdpbGwgbmV2ZXIgYmUgZGVzdHJveWVkLCB3aGlj
aCBpcyBpbXBvcnRhbnQgYmVjYXVzZQorICAgIC8vIHN0YXRpYyBzdHJpbmdzIHdpbGwgYmUgc2hh
cmVkIGFjcm9zcyB0aHJlYWRzICYgcmVmLWNvdW50ZWQgaW4gYSBub24tdGhyZWFkc2FmZSBtYW5u
ZXIuCisgICAgVVN0cmluZ0ltcGwoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxl
bmd0aCwgU3RhdGljU3RyaW5nQ29uc3RydWN0VHlwZSkKKyAgICAgICAgOiBVU3RyaW5nT3JSb3Bl
SW1wbChsZW5ndGgsIENvbnN0cnVjdFN0YXRpY1N0cmluZykKKyAgICAgICAgLCBtX2RhdGEoY2hh
cmFjdGVycykKKyAgICAgICAgLCBtX2J1ZmZlcigwKQorICAgICAgICAsIG1faGFzaCgwKQogICAg
IHsKLSAgICAgICAgaWYgKHVuc2lnbmVkIGxlbmd0aCA9IHZlY3Rvci5zaXplKCkpIHsKLSAgICAg
ICAgICAgIEFTU0VSVCh2ZWN0b3IuZGF0YSgpKTsKLSAgICAgICAgICAgIHJldHVybiBhZG9wdFJl
ZihuZXcgVVN0cmluZ0ltcGwodmVjdG9yLnJlbGVhc2VCdWZmZXIoKSwgbGVuZ3RoKSk7Ci0gICAg
ICAgIH0KLSAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgICAgIGhhc2goKTsKKyAgICAgICAg
Y2hlY2tDb25zaXN0ZW5jeSgpOwogICAgIH0KIAotICAgIHN0YXRpYyBQYXNzUmVmUHRyPFVTdHJp
bmdJbXBsPiBjcmVhdGUoY29uc3QgVUNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgbGVuZ3RoKTsKLSAg
ICBzdGF0aWMgUGFzc1JlZlB0cjxVU3RyaW5nSW1wbD4gY3JlYXRlKGNvbnN0IGNoYXIqIGMsIHVu
c2lnbmVkIGxlbmd0aCk7Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8VVN0cmluZ0ltcGw+IGNyZWF0
ZShjb25zdCBjaGFyKiBjKTsKKyAgICAvLyBDcmVhdGUgYSBub3JtYWwgc3RyaW5nIHdpdGggaW50
ZXJuYWwgc3RvcmFnZSAoQnVmZmVySW50ZXJuYWwpCisgICAgVVN0cmluZ0ltcGwodW5zaWduZWQg
bGVuZ3RoKQorICAgICAgICA6IFVTdHJpbmdPclJvcGVJbXBsKGxlbmd0aCwgQnVmZmVySW50ZXJu
YWwpCisgICAgICAgICwgbV9kYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPih0aGlzICsgMSkp
CisgICAgICAgICwgbV9idWZmZXIoMCkKKyAgICAgICAgLCBtX2hhc2goMCkKKyAgICB7CisgICAg
ICAgIEFTU0VSVChtX2RhdGEpOworICAgICAgICBBU1NFUlQobV9sZW5ndGgpOworICAgICAgICBj
aGVja0NvbnNpc3RlbmN5KCk7CisgICAgfQogCi0gICAgc3RhdGljIFBhc3NSZWZQdHI8VVN0cmlu
Z0ltcGw+IGNyZWF0ZShQYXNzUmVmUHRyPFVTdHJpbmdJbXBsPiByZXAsIHVuc2lnbmVkIG9mZnNl
dCwgdW5zaWduZWQgbGVuZ3RoKQorICAgIC8vIENyZWF0ZSBhIFVTdHJpbmdJbXBsIGFkb3B0aW5n
IG93bmVyc2hpcCBvZiB0aGUgcHJvdmlkZWQgYnVmZmVyIChCdWZmZXJPd25lZCkKKyAgICBVU3Ry
aW5nSW1wbChjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQorICAgICAg
ICA6IFVTdHJpbmdPclJvcGVJbXBsKGxlbmd0aCwgQnVmZmVyT3duZWQpCisgICAgICAgICwgbV9k
YXRhKGNoYXJhY3RlcnMpCisgICAgICAgICwgbV9idWZmZXIoMCkKKyAgICAgICAgLCBtX2hhc2go
MCkKICAgICB7Ci0gICAgICAgIEFTU0VSVChyZXApOwotICAgICAgICByZXAtPmNoZWNrQ29uc2lz
dGVuY3koKTsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBVU3RyaW5nSW1wbChyZXAtPm1f
ZGF0YSArIG9mZnNldCwgbGVuZ3RoLCByZXAtPmJ1ZmZlck93bmVyU3RyaW5nKCkpKTsKKyAgICAg
ICAgQVNTRVJUKG1fZGF0YSk7CisgICAgICAgIEFTU0VSVChtX2xlbmd0aCk7CisgICAgICAgIGNo
ZWNrQ29uc2lzdGVuY3koKTsKICAgICB9CiAKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxVU3RyaW5n
SW1wbD4gY3JlYXRlKFBhc3NSZWZQdHI8U2hhcmVkVUNoYXI+IHNoYXJlZEJ1ZmZlciwgY29uc3Qg
VUNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgbGVuZ3RoKQorICAgIC8vIFVzZWQgdG8gY3JlYXRlIG5l
dyBzdHJpbmdzIHRoYXQgYXJlIGEgc3Vic3RyaW5nIG9mIGFuIGV4aXN0aW5nIFVTdHJpbmdJbXBs
IChCdWZmZXJTdWJzdHJpbmcpCisgICAgVVN0cmluZ0ltcGwoY29uc3QgVUNoYXIqIGNoYXJhY3Rl
cnMsIHVuc2lnbmVkIGxlbmd0aCwgUGFzc1JlZlB0cjxVU3RyaW5nSW1wbD4gYmFzZSkKKyAgICAg
ICAgOiBVU3RyaW5nT3JSb3BlSW1wbChsZW5ndGgsIEJ1ZmZlclN1YnN0cmluZykKKyAgICAgICAg
LCBtX2RhdGEoY2hhcmFjdGVycykKKyAgICAgICAgLCBtX3N1YnN0cmluZ0J1ZmZlcihiYXNlLnJl
bGVhc2VSZWYoKSkKKyAgICAgICAgLCBtX2hhc2goMCkKICAgICB7Ci0gICAgICAgIHJldHVybiBh
ZG9wdFJlZihuZXcgVVN0cmluZ0ltcGwoYnVmZmVyLCBsZW5ndGgsIHNoYXJlZEJ1ZmZlcikpOwor
ICAgICAgICBBU1NFUlQobV9kYXRhKTsKKyAgICAgICAgQVNTRVJUKG1fbGVuZ3RoKTsKKyAgICAg
ICAgY2hlY2tDb25zaXN0ZW5jeSgpOwogICAgIH0KIAotICAgIHN0YXRpYyBQYXNzUmVmUHRyPFVT
dHJpbmdJbXBsPiBjcmVhdGVVbmluaXRpYWxpemVkKHVuc2lnbmVkIGxlbmd0aCwgVUNoYXIqJiBv
dXRwdXQpCisgICAgLy8gVXNlZCB0byBjb25zdHJ1Y3QgbmV3IHN0cmluZ3Mgc2hhcmluZyBhbiBl
eGlzdGluZyBTaGFyZWRVQ2hhciAoQnVmZmVyU2hhcmVkKQorICAgIFVTdHJpbmdJbXBsKGNvbnN0
IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgsIFBhc3NSZWZQdHI8U2hhcmVkVUNo
YXI+IHNoYXJlZEJ1ZmZlcikKKyAgICAgICAgOiBVU3RyaW5nT3JSb3BlSW1wbChsZW5ndGgsIEJ1
ZmZlclNoYXJlZCkKKyAgICAgICAgLCBtX2RhdGEoY2hhcmFjdGVycykKKyAgICAgICAgLCBtX3No
YXJlZEJ1ZmZlcihzaGFyZWRCdWZmZXIucmVsZWFzZVJlZigpKQorICAgICAgICAsIG1faGFzaCgw
KQogICAgIHsKLSAgICAgICAgaWYgKCFsZW5ndGgpIHsKLSAgICAgICAgICAgIG91dHB1dCA9IDA7
Ci0gICAgICAgICAgICByZXR1cm4gZW1wdHkoKTsKLSAgICAgICAgfQorICAgICAgICBBU1NFUlQo
bV9kYXRhKTsKKyAgICAgICAgQVNTRVJUKG1fbGVuZ3RoKTsKKyAgICAgICAgY2hlY2tDb25zaXN0
ZW5jeSgpOworICAgIH0KIAotICAgICAgICBpZiAobGVuZ3RoID4gKChzdGQ6Om51bWVyaWNfbGlt
aXRzPHNpemVfdD46Om1heCgpIC0gc2l6ZW9mKFVTdHJpbmdJbXBsKSkgLyBzaXplb2YoVUNoYXIp
KSkKLSAgICAgICAgICAgIENSQVNIKCk7Ci0gICAgICAgIFVTdHJpbmdJbXBsKiByZXN1bHRJbXBs
ID0gc3RhdGljX2Nhc3Q8VVN0cmluZ0ltcGwqPihmYXN0TWFsbG9jKHNpemVvZihVQ2hhcikgKiBs
ZW5ndGggKyBzaXplb2YoVVN0cmluZ0ltcGwpKSk7Ci0gICAgICAgIG91dHB1dCA9IHJlaW50ZXJw
cmV0X2Nhc3Q8VUNoYXIqPihyZXN1bHRJbXBsICsgMSk7Ci0gICAgICAgIHJldHVybiBhZG9wdFJl
ZihuZXcocmVzdWx0SW1wbCkgVVN0cmluZ0ltcGwobGVuZ3RoKSk7CisgICAgLy8gRm9yIHVzZSBv
bmx5IGJ5IElkZW50aWZpZXIncyBYWFhUcmFuc2xhdG9yIGhlbHBlcnMuCisgICAgdm9pZCBzZXRI
YXNoKHVuc2lnbmVkIGhhc2gpCisgICAgeworICAgICAgICBBU1NFUlQoIW1faGFzaCk7CisgICAg
ICAgIEFTU0VSVChoYXNoID09IGNvbXB1dGVIYXNoKG1fZGF0YSwgbV9sZW5ndGgpKTsKKyAgICAg
ICAgbV9oYXNoID0gaGFzaDsKKyAgICB9CisKK3B1YmxpYzoKKyAgICB+VVN0cmluZ0ltcGwoKTsK
KworICAgIHN0YXRpYyBQYXNzUmVmUHRyPFVTdHJpbmdJbXBsPiBjcmVhdGUoY29uc3QgVUNoYXIq
LCB1bnNpZ25lZCBsZW5ndGgpOworICAgIHN0YXRpYyBQYXNzUmVmUHRyPFVTdHJpbmdJbXBsPiBj
cmVhdGUoY29uc3QgY2hhciosIHVuc2lnbmVkIGxlbmd0aCk7CisgICAgc3RhdGljIFBhc3NSZWZQ
dHI8VVN0cmluZ0ltcGw+IGNyZWF0ZShjb25zdCBjaGFyKik7CisgICAgc3RhdGljIFBhc3NSZWZQ
dHI8VVN0cmluZ0ltcGw+IGNyZWF0ZShQYXNzUmVmUHRyPFNoYXJlZFVDaGFyPiwgY29uc3QgVUNo
YXIqLCB1bnNpZ25lZCBsZW5ndGgpOworICAgIHN0YXRpYyBQYXNzUmVmUHRyPFVTdHJpbmdJbXBs
PiBjcmVhdGUoUGFzc1JlZlB0cjxVU3RyaW5nSW1wbD4gcmVwLCB1bnNpZ25lZCBvZmZzZXQsIHVu
c2lnbmVkIGxlbmd0aCkKKyAgICB7CisgICAgICAgIGlmICghbGVuZ3RoKQorICAgICAgICAgICAg
cmV0dXJuIGVtcHR5KCk7CisgICAgICAgIEFTU0VSVChyZXApOworICAgICAgICByZXAtPmNoZWNr
Q29uc2lzdGVuY3koKTsKKyAgICAgICAgVVN0cmluZ0ltcGwqIG93bmVyUmVwID0gKHJlcC0+YnVm
ZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVyU3Vic3RyaW5nKSA/IHJlcC0+bV9zdWJzdHJpbmdCdWZm
ZXIgOiByZXAuZ2V0KCk7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgVVN0cmluZ0ltcGwo
cmVwLT5tX2RhdGEgKyBvZmZzZXQsIGxlbmd0aCwgb3duZXJSZXApKTsKICAgICB9CiAKKyAgICBz
dGF0aWMgUGFzc1JlZlB0cjxVU3RyaW5nSW1wbD4gY3JlYXRlVW5pbml0aWFsaXplZCh1bnNpZ25l
ZCBsZW5ndGgsIFVDaGFyKiYgb3V0cHV0KTsKICAgICBzdGF0aWMgUGFzc1JlZlB0cjxVU3RyaW5n
SW1wbD4gdHJ5Q3JlYXRlVW5pbml0aWFsaXplZCh1bnNpZ25lZCBsZW5ndGgsIFVDaGFyKiYgb3V0
cHV0KQogICAgIHsKICAgICAgICAgaWYgKCFsZW5ndGgpIHsKQEAgLTE2MiwxMyArMjE4LDI0IEBA
IHB1YmxpYzoKICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyhyZXN1bHRJbXBsKSBVU3RyaW5n
SW1wbChsZW5ndGgpKTsKICAgICB9CiAKKyAgICB0ZW1wbGF0ZTxzaXplX3QgaW5saW5lQ2FwYWNp
dHk+CisgICAgc3RhdGljIFBhc3NSZWZQdHI8VVN0cmluZ0ltcGw+IGFkb3B0KFZlY3RvcjxVQ2hh
ciwgaW5saW5lQ2FwYWNpdHk+JiB2ZWN0b3IpCisgICAgeworICAgICAgICBpZiAoc2l6ZV90IHNp
emUgPSB2ZWN0b3Iuc2l6ZSgpKSB7CisgICAgICAgICAgICBBU1NFUlQodmVjdG9yLmRhdGEoKSk7
CisgICAgICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFVTdHJpbmdJbXBsKHZlY3Rvci5yZWxl
YXNlQnVmZmVyKCksIHNpemUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW1wdHkoKTsK
KyAgICB9CisKICAgICBTaGFyZWRVQ2hhciogc2hhcmVkQnVmZmVyKCk7CiAgICAgY29uc3QgVUNo
YXIqIGNoYXJhY3RlcnMoKSBjb25zdCB7IHJldHVybiBtX2RhdGE7IH0KKwogICAgIHNpemVfdCBj
b3N0KCkKICAgICB7CiAgICAgICAgIC8vIEZvciBzdWJzdHJpbmdzLCByZXR1cm4gdGhlIGNvc3Qg
b2YgdGhlIGJhc2Ugc3RyaW5nLgogICAgICAgICBpZiAoYnVmZmVyT3duZXJzaGlwKCkgPT0gQnVm
ZmVyU3Vic3RyaW5nKQotICAgICAgICAgICAgcmV0dXJuIG1fYnVmZmVyU3Vic3RyaW5nLT5jb3N0
KCk7CisgICAgICAgICAgICByZXR1cm4gbV9zdWJzdHJpbmdCdWZmZXItPmNvc3QoKTsKIAogICAg
ICAgICBpZiAobV9yZWZDb3VudEFuZEZsYWdzICYgc19yZWZDb3VudEZsYWdTaG91bGRSZXBvcnRl
ZENvc3QpIHsKICAgICAgICAgICAgIG1fcmVmQ291bnRBbmRGbGFncyAmPSB+c19yZWZDb3VudEZs
YWdTaG91bGRSZXBvcnRlZENvc3Q7CkBAIC0xNzYsOSArMjQzLDcgQEAgcHVibGljOgogICAgICAg
ICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3Qg
eyBpZiAoIW1faGFzaCkgbV9oYXNoID0gY29tcHV0ZUhhc2gobV9kYXRhLCBtX2xlbmd0aCk7IHJl
dHVybiBtX2hhc2g7IH0KLSAgICB1bnNpZ25lZCBleGlzdGluZ0hhc2goKSBjb25zdCB7IEFTU0VS
VChtX2hhc2gpOyByZXR1cm4gbV9oYXNoOyB9IC8vIGZhc3QgcGF0aCBmb3IgSWRlbnRpZmllcnMK
LSAgICB2b2lkIHNldEhhc2godW5zaWduZWQgaGFzaCkgeyBBU1NFUlQoaGFzaCA9PSBjb21wdXRl
SGFzaChtX2RhdGEsIG1fbGVuZ3RoKSk7IG1faGFzaCA9IGhhc2g7IH0gLy8gZmFzdCBwYXRoIGZv
ciBJZGVudGlmaWVycworCiAgICAgYm9vbCBpc0lkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBt
X3JlZkNvdW50QW5kRmxhZ3MgJiBzX3JlZkNvdW50RmxhZ0lzSWRlbnRpZmllcjsgfQogICAgIHZv
aWQgc2V0SXNJZGVudGlmaWVyKGJvb2wgaXNJZGVudGlmaWVyKQogICAgIHsKQEAgLTE4OCw4ICsy
NTMsMTYgQEAgcHVibGljOgogICAgICAgICAgICAgbV9yZWZDb3VudEFuZEZsYWdzICY9IH5zX3Jl
ZkNvdW50RmxhZ0lzSWRlbnRpZmllcjsKICAgICB9CiAKKyAgICB1bnNpZ25lZCBoYXNoKCkgY29u
c3QgeyBpZiAoIW1faGFzaCkgbV9oYXNoID0gY29tcHV0ZUhhc2gobV9kYXRhLCBtX2xlbmd0aCk7
IHJldHVybiBtX2hhc2g7IH0KKyAgICB1bnNpZ25lZCBleGlzdGluZ0hhc2goKSBjb25zdCB7IEFT
U0VSVChtX2hhc2gpOyByZXR1cm4gbV9oYXNoOyB9CisgICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1
dGVIYXNoKGNvbnN0IFVDaGFyKiBkYXRhLCB1bnNpZ25lZCBsZW5ndGgpIHsgcmV0dXJuIFdURjo6
c3RyaW5nSGFzaChkYXRhLCBsZW5ndGgpOyB9CisgICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVI
YXNoKGNvbnN0IGNoYXIqIGRhdGEsIHVuc2lnbmVkIGxlbmd0aCkgeyByZXR1cm4gV1RGOjpzdHJp
bmdIYXNoKGRhdGEsIGxlbmd0aCk7IH0KKyAgICBzdGF0aWMgdW5zaWduZWQgY29tcHV0ZUhhc2go
Y29uc3QgY2hhciogZGF0YSkgeyByZXR1cm4gV1RGOjpzdHJpbmdIYXNoKGRhdGEpOyB9CisKICAg
ICBBTFdBWVNfSU5MSU5FIHZvaWQgZGVyZWYoKSB7IG1fcmVmQ291bnRBbmRGbGFncyAtPSBzX3Jl
ZkNvdW50SW5jcmVtZW50OyBpZiAoIShtX3JlZkNvdW50QW5kRmxhZ3MgJiAoc19yZWZDb3VudE1h
c2sgfCBzX3JlZkNvdW50RmxhZ1N0YXRpYykpKSBkZWxldGUgdGhpczsgfQogCisgICAgc3RhdGlj
IFVTdHJpbmdJbXBsKiBlbXB0eSgpOworCiAgICAgc3RhdGljIHZvaWQgY29weUNoYXJzKFVDaGFy
KiBkZXN0aW5hdGlvbiwgY29uc3QgVUNoYXIqIHNvdXJjZSwgdW5zaWduZWQgbnVtQ2hhcmFjdGVy
cykKICAgICB7CiAgICAgICAgIGlmIChudW1DaGFyYWN0ZXJzIDw9IHNfY29weUNoYXJzSW5saW5l
Q3V0T2ZmKSB7CkBAIC0xOTksMTA5ICsyNzIsMzMgQEAgcHVibGljOgogICAgICAgICAgICAgbWVt
Y3B5KGRlc3RpbmF0aW9uLCBzb3VyY2UsIG51bUNoYXJhY3RlcnMgKiBzaXplb2YoVUNoYXIpKTsK
ICAgICB9CiAKLSAgICBzdGF0aWMgdW5zaWduZWQgY29tcHV0ZUhhc2goY29uc3QgVUNoYXIqIHMs
IHVuc2lnbmVkIGxlbmd0aCkgeyByZXR1cm4gV1RGOjpzdHJpbmdIYXNoKHMsIGxlbmd0aCk7IH0K
LSAgICBzdGF0aWMgdW5zaWduZWQgY29tcHV0ZUhhc2goY29uc3QgY2hhciogcywgdW5zaWduZWQg
bGVuZ3RoKSB7IHJldHVybiBXVEY6OnN0cmluZ0hhc2gocywgbGVuZ3RoKTsgfQotICAgIHN0YXRp
YyB1bnNpZ25lZCBjb21wdXRlSGFzaChjb25zdCBjaGFyKiBzKSB7IHJldHVybiBXVEY6OnN0cmlu
Z0hhc2gocyk7IH0KLQotICAgIHN0YXRpYyBVU3RyaW5nSW1wbCogZW1wdHkoKTsKLQogICAgIEFM
V0FZU19JTkxJTkUgdm9pZCBjaGVja0NvbnNpc3RlbmN5KCkgY29uc3QKICAgICB7CiAgICAgICAg
IC8vIFRoZXJlIGlzIG5vIHJlY3Vyc2lvbiBvZiBzdWJzdHJpbmdzLgotICAgICAgICBBU1NFUlQo
YnVmZmVyT3duZXJTdHJpbmcoKS0+YnVmZmVyT3duZXJzaGlwKCkgIT0gQnVmZmVyU3Vic3RyaW5n
KTsKKyAgICAgICAgQVNTRVJUKChidWZmZXJPd25lcnNoaXAoKSAhPSBCdWZmZXJTdWJzdHJpbmcp
IHx8IChtX3N1YnN0cmluZ0J1ZmZlci0+YnVmZmVyT3duZXJzaGlwKCkgIT0gQnVmZmVyU3Vic3Ry
aW5nKSk7CiAgICAgICAgIC8vIFN0YXRpYyBzdHJpbmdzIGNhbm5vdCBiZSBwdXQgaW4gaWRlbnRp
ZmllciB0YWJsZXMsIGJlY2F1c2UgdGhleSBhcmUgZ2xvYmFsbHkgc2hhcmVkLgogICAgICAgICBB
U1NFUlQoIWlzU3RhdGljKCkgfHwgIWlzSWRlbnRpZmllcigpKTsKICAgICB9CiAKIHByaXZhdGU6
Ci0gICAgLy8gRm9yIFNtYWxsU3RyaW5nU3RvcmFnZSwgd2hpY2ggYWxsb2NhdGVzIGFuIGFycmF5
IGFuZCB1c2VzIGFuIGluLXBsYWNlIG5ldy4KLSAgICBVU3RyaW5nSW1wbCgpIHsgfQotCi0gICAg
Ly8gVXNlZCB0byBjb25zdHJ1Y3Qgbm9ybWFsIHN0cmluZ3Mgd2l0aCBhbiBpbnRlcm5hbCBidWZm
ZXIuCi0gICAgVVN0cmluZ0ltcGwodW5zaWduZWQgbGVuZ3RoKQotICAgICAgICA6IFVTdHJpbmdP
clJvcGVJbXBsKGxlbmd0aCwgQnVmZmVySW50ZXJuYWwpCi0gICAgICAgICwgbV9kYXRhKHJlaW50
ZXJwcmV0X2Nhc3Q8VUNoYXIqPih0aGlzICsgMSkpCi0gICAgICAgICwgbV9idWZmZXIoMCkKLSAg
ICAgICAgLCBtX2hhc2goMCkKLSAgICB7Ci0gICAgICAgIGNoZWNrQ29uc2lzdGVuY3koKTsKLSAg
ICB9Ci0KLSAgICAvLyBVc2VkIHRvIGNvbnN0cnVjdCBub3JtYWwgc3RyaW5ncyB3aXRoIGFuIGV4
dGVybmFsIGJ1ZmZlci4KLSAgICBVU3RyaW5nSW1wbChjb25zdCBVQ2hhciogZGF0YSwgdW5zaWdu
ZWQgbGVuZ3RoKQotICAgICAgICA6IFVTdHJpbmdPclJvcGVJbXBsKGxlbmd0aCwgQnVmZmVyT3du
ZWQpCi0gICAgICAgICwgbV9kYXRhKGRhdGEpCi0gICAgICAgICwgbV9idWZmZXIoMCkKLSAgICAg
ICAgLCBtX2hhc2goMCkKLSAgICB7Ci0gICAgICAgIGNoZWNrQ29uc2lzdGVuY3koKTsKLSAgICB9
Ci0KLSAgICAvLyBVc2VkIHRvIGNvbnN0cnVjdCBzdGF0aWMgc3RyaW5ncywgd2hpY2ggaGF2ZSBh
biBzcGVjaWFsIHJlZkNvdW50IHRoYXQgY2FuIG5ldmVyIGhpdCB6ZXJvLgotICAgIC8vIFRoaXMg
bWVhbnMgdGhhdCB0aGUgc3RhdGljIHN0cmluZyB3aWxsIG5ldmVyIGJlIGRlc3Ryb3llZCwgd2hp
Y2ggaXMgaW1wb3J0YW50IGJlY2F1c2UKLSAgICAvLyBzdGF0aWMgc3RyaW5ncyB3aWxsIGJlIHNo
YXJlZCBhY3Jvc3MgdGhyZWFkcyAmIHJlZi1jb3VudGVkIGluIGEgbm9uLXRocmVhZHNhZmUgbWFu
bmVyLgotICAgIFVTdHJpbmdJbXBsKGNvbnN0IFVDaGFyKiBkYXRhLCB1bnNpZ25lZCBsZW5ndGgs
IFN0YXRpY1N0cmluZ0NvbnN0cnVjdFR5cGUpCi0gICAgICAgIDogVVN0cmluZ09yUm9wZUltcGwo
bGVuZ3RoLCBDb25zdHJ1Y3RTdGF0aWNTdHJpbmcpCi0gICAgICAgICwgbV9kYXRhKGRhdGEpCi0g
ICAgICAgICwgbV9idWZmZXIoMCkKLSAgICAgICAgLCBtX2hhc2goMCkKLSAgICB7Ci0gICAgICAg
IGNoZWNrQ29uc2lzdGVuY3koKTsKLSAgICB9Ci0KLSAgICAvLyBVc2VkIHRvIGNyZWF0ZSBuZXcg
c3RyaW5ncyB0aGF0IGFyZSBhIHN1YnN0cmluZyBvZiBhbiBleGlzdGluZyBzdHJpbmcuCi0gICAg
VVN0cmluZ0ltcGwoY29uc3QgVUNoYXIqIGRhdGEsIHVuc2lnbmVkIGxlbmd0aCwgUGFzc1JlZlB0
cjxVU3RyaW5nSW1wbD4gYmFzZSkKLSAgICAgICAgOiBVU3RyaW5nT3JSb3BlSW1wbChsZW5ndGgs
IEJ1ZmZlclN1YnN0cmluZykKLSAgICAgICAgLCBtX2RhdGEoZGF0YSkKLSAgICAgICAgLCBtX2J1
ZmZlclN1YnN0cmluZyhiYXNlLnJlbGVhc2VSZWYoKSkKLSAgICAgICAgLCBtX2hhc2goMCkKLSAg
ICB7Ci0gICAgICAgIC8vIERvIHVzZSBzdGF0aWMgc3RyaW5ncyBhcyBhIGJhc2UgZm9yIHN1YnN0
cmluZ3M7IFVudHlwZWRQdHJBbmRCaXRmaWVsZCBhc3N1bWVzCi0gICAgICAgIC8vIHRoYXQgYWxs
IHBvaW50ZXJzIHdpbGwgYmUgYXQgbGVhc3QgOC1ieXRlIGFsaWduZWQsIHdlIGNhbm5vdCBndWFy
YW50ZWUgdGhhdCBvZgotICAgICAgICAvLyBVU3RyaW5nSW1wbHMgdGhhdCBhcmUgbm90IGhlYXAg
YWxsb2NhdGVkLgotICAgICAgICBBU1NFUlQobV9idWZmZXJTdWJzdHJpbmctPmxlbmd0aCgpKTsK
LSAgICAgICAgQVNTRVJUKCFtX2J1ZmZlclN1YnN0cmluZy0+aXNTdGF0aWMoKSk7Ci0gICAgICAg
IGNoZWNrQ29uc2lzdGVuY3koKTsKLSAgICB9Ci0KLSAgICAvLyBVc2VkIHRvIGNvbnN0cnVjdCBu
ZXcgc3RyaW5ncyBzaGFyaW5nIGFuIGV4aXN0aW5nIHNoYXJlZCBidWZmZXIuCi0gICAgVVN0cmlu
Z0ltcGwoY29uc3QgVUNoYXIqIGRhdGEsIHVuc2lnbmVkIGxlbmd0aCwgUGFzc1JlZlB0cjxTaGFy
ZWRVQ2hhcj4gc2hhcmVkQnVmZmVyKQotICAgICAgICA6IFVTdHJpbmdPclJvcGVJbXBsKGxlbmd0
aCwgQnVmZmVyU2hhcmVkKQotICAgICAgICAsIG1fZGF0YShkYXRhKQotICAgICAgICAsIG1fYnVm
ZmVyU2hhcmVkKHNoYXJlZEJ1ZmZlci5yZWxlYXNlUmVmKCkpCi0gICAgICAgICwgbV9oYXNoKDAp
Ci0gICAgewotICAgICAgICBjaGVja0NvbnNpc3RlbmN5KCk7Ci0gICAgfQotCi0gICAgflVTdHJp
bmdJbXBsKCk7Ci0KICAgICAvLyBUaGlzIG51bWJlciBtdXN0IGJlIGF0IGxlYXN0IDIgdG8gYXZv
aWQgc2hhcmluZyBlbXB0eSwgbnVsbCBhcyB3ZWxsIGFzIDEgY2hhcmFjdGVyIHN0cmluZ3MgZnJv
bSBTbWFsbFN0cmluZ3MuCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfbWluTGVuZ3RoVG9T
aGFyZSA9IDEwOwogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzX2NvcHlDaGFyc0lubGluZUN1
dE9mZiA9IDIwOwogCi0gICAgVVN0cmluZ0ltcGwqIGJ1ZmZlck93bmVyU3RyaW5nKCkgeyByZXR1
cm4gKGJ1ZmZlck93bmVyc2hpcCgpID09IEJ1ZmZlclN1YnN0cmluZykgPyBtX2J1ZmZlclN1YnN0
cmluZyA6ICB0aGlzOyB9Ci0gICAgY29uc3QgVVN0cmluZ0ltcGwqIGJ1ZmZlck93bmVyU3RyaW5n
KCkgY29uc3QgeyByZXR1cm4gKGJ1ZmZlck93bmVyc2hpcCgpID09IEJ1ZmZlclN1YnN0cmluZykg
PyBtX2J1ZmZlclN1YnN0cmluZyA6ICB0aGlzOyB9Ci0gICAgU2hhcmVkVUNoYXIqIGJhc2VTaGFy
ZWRCdWZmZXIoKTsKLSAgICB1bnNpZ25lZCBidWZmZXJPd25lcnNoaXAoKSBjb25zdCB7IHJldHVy
biBtX3JlZkNvdW50QW5kRmxhZ3MgJiBzX3JlZkNvdW50TWFza0J1ZmZlck93bmVyc2hpcDsgfQor
ICAgIEJ1ZmZlck93bmVyc2hpcCBidWZmZXJPd25lcnNoaXAoKSBjb25zdCB7IHJldHVybiBzdGF0
aWNfY2FzdDxCdWZmZXJPd25lcnNoaXA+KG1fcmVmQ291bnRBbmRGbGFncyAmIHNfcmVmQ291bnRN
YXNrQnVmZmVyT3duZXJzaGlwKTsgfQogICAgIGJvb2wgaXNTdGF0aWMoKSBjb25zdCB7IHJldHVy
biBtX3JlZkNvdW50QW5kRmxhZ3MgJiBzX3JlZkNvdW50RmxhZ1N0YXRpYzsgfQogCiAgICAgLy8g
dW5zaGFyZWQgZGF0YQogICAgIGNvbnN0IFVDaGFyKiBtX2RhdGE7CiAgICAgdW5pb24gewogICAg
ICAgICB2b2lkKiBtX2J1ZmZlcjsKLSAgICAgICAgVVN0cmluZ0ltcGwqIG1fYnVmZmVyU3Vic3Ry
aW5nOwotICAgICAgICBTaGFyZWRVQ2hhciogbV9idWZmZXJTaGFyZWQ7CisgICAgICAgIFVTdHJp
bmdJbXBsKiBtX3N1YnN0cmluZ0J1ZmZlcjsKKyAgICAgICAgU2hhcmVkVUNoYXIqIG1fc2hhcmVk
QnVmZmVyOwogICAgIH07CiAgICAgbXV0YWJsZSB1bnNpZ25lZCBtX2hhc2g7Ci0KLSAgICBmcmll
bmQgY2xhc3MgSklUOwotICAgIGZyaWVuZCBjbGFzcyBTbWFsbFN0cmluZ3NTdG9yYWdlOwotICAg
IGZyaWVuZCBjbGFzcyBVU3RyaW5nT3JSb3BlSW1wbDsKLSAgICBmcmllbmQgdm9pZCBpbml0aWFs
aXplVVN0cmluZygpOwogfTsKIAogY2xhc3MgVVJvcGVJbXBsIDogcHVibGljIFVTdHJpbmdPclJv
cGVJbXBsIHsKKyAgICBmcmllbmQgY2xhc3MgVVN0cmluZ09yUm9wZUltcGw7CiBwdWJsaWM6CiAg
ICAgLy8gQSBVUm9wZUltcGwgaXMgY29tcG9zZWQgZnJvbSBhIHNldCBvZiBzbWFsbGVyIHN0cmlu
Z3MgY2FsbGVkIEZpYmVycy4KICAgICAvLyBFYWNoIEZpYmVyIGluIGEgcm9wZSBpcyBlaXRoZXIg
VVN0cmluZ0ltcGwgb3IgYW5vdGhlciBVUm9wZUltcGwuCkBAIC0zMzksOCArMzM2LDYgQEAgcHJp
dmF0ZToKIAogICAgIHVuc2lnbmVkIG1fZmliZXJDb3VudDsKICAgICBGaWJlciBtX2ZpYmVyc1sx
XTsKLQotICAgIGZyaWVuZCBjbGFzcyBVU3RyaW5nT3JSb3BlSW1wbDsKIH07CiAKIGlubGluZSB2
b2lkIFVTdHJpbmdPclJvcGVJbXBsOjpkZXJlZigpCkluZGV4OiBXZWJDb3JlL0NoYW5nZUxvZwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNTU4NjkpCisrKyBXZWJD
b3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI4IEBACisyMDEwLTAzLTEx
ICBHYXZpbiBCYXJyYWNsb3VnaCAgPGJhcnJhY2xvdWdoQGFwcGxlLmNvbT4KKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzYwNDEKKyAgICAgICAgUmVtb3ZlIHVubmVjZXNzYXJ5IGRp
ZmZlcmVuY2VzIGluIGNvbW1vbiBjb2RlIGJldHdlZW4gV2ViQ29yZTo6U3RyaW5nSW1wbCAmIEpT
Qzo6VVN0cmluZ0ltcGwKKworICAgICAgICBNdWNoIG9mIHRoZSBjb2RlIGluIFdlYkNvcmU6OlN0
cmluZ0ltcGwgYW5kIEpTQzo6VVN0cmluZ0ltcGwgaXMgbm93IHZlcnkgc2ltaWxhciwKKyAgICAg
ICAgYnV0IGhhcyB0cml2aWFsIGFuZCB1bm5lY2Vzc2FyeSBmb3JtYXR0aW5nIGRpZmZlcmVuY2Vz
LCBzdWNoIGFzIHRoZSBleGFjdCB3b3JkaW5nCisgICAgICAgIG9mIGNvbW1lbnRzLCBtaXNzaW5n
IEFTU0VSVHMsIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiB0aGUgLmggdnMgLmNwcCBldGMuCisK
KyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6U3RyaW5nSW1wbDo6ZW1wdHkpOiBSZW9yZGVyZWQgaW4gZmlsZSwgbWFkZSBlbXB0eSgpLT5j
aGFyYWN0ZXJzKCkgcmV0dXJuIGEgbm9uLW51bGwgdmFsdWUgdG8gbWF0Y2ggSlNDLgorICAgICAg
ICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6Y3JlYXRlVW5pbml0aWFsaXplZCk6IEFkZGVkIG92ZXJm
bG93IGNoZWNrLgorICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6Y3JlYXRlKTogUmVvcmRl
cmVkIGluIGZpbGUuCisgICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjpzaGFyZWRCdWZmZXIp
OiBSZW9yZGVyZWQgaW4gZmlsZS4KKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwu
aDoKKyAgICAgICAgKFdlYkNvcmU6OlN0cmluZ0ltcGw6Oik6IFJlbW92ZSBUaHJlYWRHbG9iYWxE
YXRhIGFzIGZyaWVuZCwgbW92ZSBTaGFyYWJsZVVDaGFyICYgU2hhcmVkVUNoYXIgdG8gV2ViQ29y
ZSBuYW1lc3BhY2UuCisgICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjpTdHJpbmdJbXBsKTog
TWFkZSBzdGF0aWMgY29uc3RydWN0b3IgbWV0aG9kICh1c2VkIHRvIGNyZWF0ZSBlbXB0eSBzdHJp
bmcpIHRha2UgYXJndW1lbnRzLCB0byBtYXRjaCBKU0MgJiBwcmV2ZW50IGFjY2lkZW50YWwgdXNl
LgorICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6c2V0SGFzaCk6IEFkZGVkIG1pc3Npbmcg
QVNTRVJULgorICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6YWRvcHQpOiBNYWtlIGFkcG90
IHdvcmsgd2l0aCBWZWN0b3JzIHdpdGggYSBub24temVybyBpbmxpbmUgY2FwYWNpdHkuCisgICAg
ICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjpjaGFyYWN0ZXJzKTogTWFyayBhcyBjb25zdCB0byBt
YXRjaCBKU0MuCisgICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjpoYXNoKTogVXNlICFtX2hh
c2ggaW5zdGVhZCBvZiBtX2hhc2ggPT0gMC4KKyAgICAgICAgKFdlYkNvcmU6OlN0cmluZ0ltcGw6
OmNvbXB1dGVIYXNoKTogUmVtb3ZlIHJlZHVuZGFudCAnaW5saW5lJy4KKwogMjAxMC0wMy0xMSAg
TGVhbmRybyBQZXJlaXJhICA8bGVhbmRyb0Bwcm9mdXNpb24ubW9iaT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBIb2xnZXIgRnJleXRoZXIuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3Ry
aW5nSW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0lt
cGwuY3BwCShyZXZpc2lvbiA1NTgzMikKKysrIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJ
bXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgIlN0cmlu
Z0hhc2guaCIKICNpbmNsdWRlICJUZXh0QnJlYWtJdGVyYXRvci5oIgogI2luY2x1ZGUgIlRleHRF
bmNvZGluZy5oIgotI2luY2x1ZGUgIlRocmVhZEdsb2JhbERhdGEuaCIKICNpbmNsdWRlIDxydW50
aW1lL1VTdHJpbmcuaD4KICNpbmNsdWRlIDx3dGYvZHRvYS5oPgogI2luY2x1ZGUgPHd0Zi9Bc3Nl
cnRpb25zLmg+CkBAIC00Nyw1OCArNDYsNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHN0YXRp
YyBjb25zdCB1bnNpZ25lZCBtaW5MZW5ndGhUb1NoYXJlID0gMjA7CiAKLXN0YXRpYyBpbmxpbmUg
VUNoYXIqIG5ld1VDaGFyVmVjdG9yKHVuc2lnbmVkIG4pCi17Ci0gICAgcmV0dXJuIHN0YXRpY19j
YXN0PFVDaGFyKj4oZmFzdE1hbGxvYyhzaXplb2YoVUNoYXIpICogbikpOwotfQotCi0vLyBUaGlz
IGNvbnN0cnVjdG9yIGlzIHVzZWQgb25seSB0byBjcmVhdGUgdGhlIGVtcHR5IHN0cmluZy4KLVN0
cmluZ0ltcGw6OlN0cmluZ0ltcGwoKQotICAgIDogbV9kYXRhKDApCi0gICAgLCBtX3NoYXJlZEJ1
ZmZlcigwKQotICAgICwgbV9sZW5ndGgoMCkKLSAgICAsIG1fcmVmQ291bnRBbmRGbGFncyhzX3Jl
ZkNvdW50RmxhZ1N0YXRpYyB8IEJ1ZmZlckludGVybmFsKQotICAgICwgbV9oYXNoKDApCi17Ci0g
ICAgLy8gRW5zdXJlIHRoYXQgdGhlIGhhc2ggaXMgY29tcHV0ZWQgc28gdGhhdCBBdG9taWNTdHJp
bmdIYXNoIGNhbiBjYWxsIGV4aXN0aW5nSGFzaCgpCi0gICAgLy8gd2l0aCBpbXB1bml0eS4gVGhl
IGVtcHR5IHN0cmluZyBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgaXMgbmV2ZXIgZW50ZXJlZCBpbnRv
Ci0gICAgLy8gQXRvbWljU3RyaW5nJ3MgSGFzaEtleSwgYnV0IHN0aWxsIG5lZWRzIHRvIGNvbXBh
cmUgY29ycmVjdGx5LgotICAgIGhhc2goKTsKLX0KLQotaW5saW5lIFN0cmluZ0ltcGw6OlN0cmlu
Z0ltcGwodW5zaWduZWQgbGVuZ3RoKQotICAgIDogbV9kYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgVUNoYXIqPih0aGlzICsgMSkpCi0gICAgLCBtX3NoYXJlZEJ1ZmZlcigwKQotICAgICwgbV9s
ZW5ndGgobGVuZ3RoKQotICAgICwgbV9yZWZDb3VudEFuZEZsYWdzKHNfcmVmQ291bnRJbmNyZW1l
bnQgfCBCdWZmZXJJbnRlcm5hbCkKLSAgICAsIG1faGFzaCgwKQotewotICAgIEFTU0VSVChtX2Rh
dGEpOwotICAgIEFTU0VSVChtX2xlbmd0aCk7Ci19Ci0KLWlubGluZSBTdHJpbmdJbXBsOjpTdHJp
bmdJbXBsKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCi0gICAgOiBt
X2RhdGEoY2hhcmFjdGVycykKLSAgICAsIG1fc2hhcmVkQnVmZmVyKDApCi0gICAgLCBtX2xlbmd0
aChsZW5ndGgpCi0gICAgLCBtX3JlZkNvdW50QW5kRmxhZ3Moc19yZWZDb3VudEluY3JlbWVudCB8
IEJ1ZmZlck93bmVkKQotICAgICwgbV9oYXNoKDApCi17Ci0gICAgQVNTRVJUKG1fZGF0YSk7Ci0g
ICAgQVNTRVJUKG1fbGVuZ3RoKTsKLX0KLQotaW5saW5lIFN0cmluZ0ltcGw6OlN0cmluZ0ltcGwo
Y29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCwgUGFzc1JlZlB0cjxTaGFy
ZWRVQ2hhcj4gc2hhcmVkQnVmZmVyKQotICAgIDogbV9kYXRhKGNoYXJhY3RlcnMpCi0gICAgLCBt
X3NoYXJlZEJ1ZmZlcihzaGFyZWRCdWZmZXIucmVsZWFzZVJlZigpKQotICAgICwgbV9sZW5ndGgo
bGVuZ3RoKQotICAgICwgbV9yZWZDb3VudEFuZEZsYWdzKHNfcmVmQ291bnRJbmNyZW1lbnQgfCBC
dWZmZXJTaGFyZWQpCi0gICAgLCBtX2hhc2goMCkKLXsKLSAgICBBU1NFUlQobV9kYXRhKTsKLSAg
ICBBU1NFUlQobV9sZW5ndGgpOwotfQotCiBTdHJpbmdJbXBsOjp+U3RyaW5nSW1wbCgpCiB7CiAg
ICAgaWYgKGluVGFibGUoKSkKQEAgLTEyMCwxMCArNjcsODQgQEAgU3RyaW5nSW1wbDo6flN0cmlu
Z0ltcGwoKQogCiBTdHJpbmdJbXBsKiBTdHJpbmdJbXBsOjplbXB0eSgpCiB7Ci0gICAgREVGSU5F
X1NUQVRJQ19MT0NBTChTdHJpbmdJbXBsLCBlbXB0eVN0cmluZywgKCkpOworICAgIC8vIEEgbm9u
LW51bGwgcG9pbnRlciBhdCBhbiBpbnZhbGlkIGFkZHJlc3MgKGluIHBhZ2UgemVybykgc28gdGhh
dCBpZiBpdCB3ZXJlIHRvIGJlIGFjY2Vzc2VkIHdlCisgICAgLy8gc2hvdWxkIGNhdGNoIHRoZSBl
cnJvciB3aXRoIGZhdWx0IChob3dldmVyIGl0IHNob3VsZCBiZSBpbXBvc3NpYmxlIHRvIGFjY2Vz
cywgc2luY2UgbGVuZ3RoIGlzIHplcm8pLgorICAgIHN0YXRpYyBjb25zdCBVQ2hhciogaW52YWxp
ZE5vbk51bGxVQ2hhclB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPihzdGF0aWNfY2FzdDxp
bnRwdHJfdD4oMSkpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoU3RyaW5nSW1wbCwgZW1wdHlT
dHJpbmcsIChpbnZhbGlkTm9uTnVsbFVDaGFyUHRyLCAwLCBDb25zdHJ1Y3RTdGF0aWNTdHJpbmcp
KTsKICAgICByZXR1cm4gJmVtcHR5U3RyaW5nOwogfQogCitQYXNzUmVmUHRyPFN0cmluZ0ltcGw+
IFN0cmluZ0ltcGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQodW5zaWduZWQgbGVuZ3RoLCBVQ2hhciom
IGRhdGEpCit7CisgICAgaWYgKCFsZW5ndGgpIHsKKyAgICAgICAgZGF0YSA9IDA7CisgICAgICAg
IHJldHVybiBlbXB0eSgpOworICAgIH0KKworICAgIC8vIEFsbG9jYXRlIGEgc2luZ2xlIGJ1ZmZl
ciBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiB0aGUgU3RyaW5nSW1wbAorICAgIC8vIHN0cnVjdCBh
cyB3ZWxsIGFzIHRoZSBkYXRhIHdoaWNoIGl0IGNvbnRhaW5zLiBUaGlzIHJlbW92ZXMgb25lIAor
ICAgIC8vIGhlYXAgYWxsb2NhdGlvbiBmcm9tIHRoaXMgY2FsbC4KKyAgICBpZiAobGVuZ3RoID4g
KChzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC0gc2l6ZW9mKFN0cmluZ0ltcGwp
KSAvIHNpemVvZihVQ2hhcikpKQorICAgICAgICBDUkFTSCgpOworICAgIHNpemVfdCBzaXplID0g
c2l6ZW9mKFN0cmluZ0ltcGwpICsgbGVuZ3RoICogc2l6ZW9mKFVDaGFyKTsKKyAgICBTdHJpbmdJ
bXBsKiBzdHJpbmcgPSBzdGF0aWNfY2FzdDxTdHJpbmdJbXBsKj4oZmFzdE1hbGxvYyhzaXplKSk7
CisKKyAgICBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxVQ2hhcio+KHN0cmluZyArIDEpOworICAg
IHJldHVybiBhZG9wdFJlZihuZXcgKHN0cmluZykgU3RyaW5nSW1wbChsZW5ndGgpKTsKK30KKwor
UGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjpjcmVhdGUoY29uc3QgVUNoYXIqIGNo
YXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKK3sKKyAgICBpZiAoIWNoYXJhY3RlcnMgfHwgIWxl
bmd0aCkKKyAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisKKyAgICBVQ2hhciogZGF0YTsKKyAgICBQ
YXNzUmVmUHRyPFN0cmluZ0ltcGw+IHN0cmluZyA9IGNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3Ro
LCBkYXRhKTsKKyAgICBtZW1jcHkoZGF0YSwgY2hhcmFjdGVycywgbGVuZ3RoICogc2l6ZW9mKFVD
aGFyKSk7CisgICAgcmV0dXJuIHN0cmluZzsKK30KKworUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBT
dHJpbmdJbXBsOjpjcmVhdGUoY29uc3QgY2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3Ro
KQoreworICAgIGlmICghY2hhcmFjdGVycyB8fCAhbGVuZ3RoKQorICAgICAgICByZXR1cm4gZW1w
dHkoKTsKKworICAgIFVDaGFyKiBkYXRhOworICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gc3Ry
aW5nID0gY3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGRhdGEpOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgIT0gbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0g
Y2hhcmFjdGVyc1tpXTsKKyAgICAgICAgZGF0YVtpXSA9IGM7CisgICAgfQorICAgIHJldHVybiBz
dHJpbmc7Cit9CisKK1Bhc3NSZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6Y3JlYXRlKGNv
bnN0IGNoYXIqIHN0cmluZykKK3sKKyAgICBpZiAoIXN0cmluZykKKyAgICAgICAgcmV0dXJuIGVt
cHR5KCk7CisgICAgcmV0dXJuIGNyZWF0ZShzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsKK30KKwor
U2hhcmVkVUNoYXIqIFN0cmluZ0ltcGw6OnNoYXJlZEJ1ZmZlcigpCit7CisgICAgaWYgKG1fbGVu
Z3RoIDwgbWluTGVuZ3RoVG9TaGFyZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBCdWZmZXJP
d25lcnNoaXAgb3duZXJzaGlwID0gYnVmZmVyT3duZXJzaGlwKCk7CisKKyAgICBpZiAob3duZXJz
aGlwID09IEJ1ZmZlckludGVybmFsKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAob3duZXJz
aGlwID09IEJ1ZmZlck93bmVkKSB7CisgICAgICAgIEFTU0VSVCghbV9zaGFyZWRCdWZmZXIpOwor
ICAgICAgICBtX3NoYXJlZEJ1ZmZlciA9IFNoYXJlZFVDaGFyOjpjcmVhdGUobmV3IFNoYXJhYmxl
VUNoYXIobV9kYXRhKSkucmVsZWFzZVJlZigpOworICAgICAgICBtX3JlZkNvdW50QW5kRmxhZ3Mg
PSAobV9yZWZDb3VudEFuZEZsYWdzICYgfnNfcmVmQ291bnRNYXNrQnVmZmVyT3duZXJzaGlwKSB8
IEJ1ZmZlclNoYXJlZDsKKyAgICB9CisKKyAgICBBU1NFUlQob3duZXJzaGlwID09IEJ1ZmZlclNo
YXJlZCk7CisgICAgQVNTRVJUKG1fc2hhcmVkQnVmZmVyKTsKKyAgICByZXR1cm4gbV9zaGFyZWRC
dWZmZXI7Cit9CisKIGJvb2wgU3RyaW5nSW1wbDo6Y29udGFpbnNPbmx5V2hpdGVzcGFjZSgpCiB7
CiAgICAgLy8gRklYTUU6IFRoZSBkZWZpbml0aW9uIG9mIHdoaXRlc3BhY2UgaGVyZSBpbmNsdWRl
cyBhIG51bWJlciBvZiBjaGFyYWN0ZXJzCkBAIC05MTMsNjMgKzkzNCw2IEBAIFBhc3NSZWZQdHI8
U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6YWRvcHQKICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0
cmluZ0ltcGwoYnVmZmVyLnJlbGVhc2UoKSwgbGVuZ3RoKSk7CiB9CiAKLVBhc3NSZWZQdHI8U3Ry
aW5nSW1wbD4gU3RyaW5nSW1wbDo6YWRvcHQoVmVjdG9yPFVDaGFyPiYgdmVjdG9yKQotewotICAg
IHNpemVfdCBzaXplID0gdmVjdG9yLnNpemUoKTsKLSAgICBpZiAoc2l6ZSA9PSAwKQotICAgICAg
ICByZXR1cm4gZW1wdHkoKTsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0cmluZ0ltcGwodmVj
dG9yLnJlbGVhc2VCdWZmZXIoKSwgc2l6ZSkpOwotfQotCi1QYXNzUmVmUHRyPFN0cmluZ0ltcGw+
IFN0cmluZ0ltcGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQodW5zaWduZWQgbGVuZ3RoLCBVQ2hhciom
IGRhdGEpCi17Ci0gICAgaWYgKCFsZW5ndGgpIHsKLSAgICAgICAgZGF0YSA9IDA7Ci0gICAgICAg
IHJldHVybiBlbXB0eSgpOwotICAgIH0KLQotICAgIC8vIEFsbG9jYXRlIGEgc2luZ2xlIGJ1ZmZl
ciBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiB0aGUgU3RyaW5nSW1wbAotICAgIC8vIHN0cnVjdCBh
cyB3ZWxsIGFzIHRoZSBkYXRhIHdoaWNoIGl0IGNvbnRhaW5zLiBUaGlzIHJlbW92ZXMgb25lIAot
ICAgIC8vIGhlYXAgYWxsb2NhdGlvbiBmcm9tIHRoaXMgY2FsbC4KLSAgICBzaXplX3Qgc2l6ZSA9
IHNpemVvZihTdHJpbmdJbXBsKSArIGxlbmd0aCAqIHNpemVvZihVQ2hhcik7Ci0gICAgU3RyaW5n
SW1wbCogc3RyaW5nID0gc3RhdGljX2Nhc3Q8U3RyaW5nSW1wbCo+KGZhc3RNYWxsb2Moc2l6ZSkp
OwotICAgIGRhdGEgPSByZWludGVycHJldF9jYXN0PFVDaGFyKj4oc3RyaW5nICsgMSk7Ci0gICAg
c3RyaW5nID0gbmV3IChzdHJpbmcpIFN0cmluZ0ltcGwobGVuZ3RoKTsKLSAgICByZXR1cm4gYWRv
cHRSZWYoc3RyaW5nKTsKLX0KLQotUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjpj
cmVhdGUoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICBp
ZiAoIWNoYXJhY3RlcnMgfHwgIWxlbmd0aCkKLSAgICAgICAgcmV0dXJuIGVtcHR5KCk7Ci0KLSAg
ICBVQ2hhciogZGF0YTsKLSAgICBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IHN0cmluZyA9IGNyZWF0
ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoLCBkYXRhKTsKLSAgICBtZW1jcHkoZGF0YSwgY2hhcmFjdGVy
cywgbGVuZ3RoICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgcmV0dXJuIHN0cmluZzsKLX0KLQotUGFz
c1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjpjcmVhdGUoY29uc3QgY2hhciogY2hhcmFj
dGVycywgdW5zaWduZWQgbGVuZ3RoKQotewotICAgIGlmICghY2hhcmFjdGVycyB8fCAhbGVuZ3Ro
KQotICAgICAgICByZXR1cm4gZW1wdHkoKTsKLQotICAgIFVDaGFyKiBkYXRhOwotICAgIFBhc3NS
ZWZQdHI8U3RyaW5nSW1wbD4gc3RyaW5nID0gY3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGRh
dGEpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gbGVuZ3RoOyArK2kpIHsKLSAgICAg
ICAgdW5zaWduZWQgY2hhciBjID0gY2hhcmFjdGVyc1tpXTsKLSAgICAgICAgZGF0YVtpXSA9IGM7
Ci0gICAgfQotICAgIHJldHVybiBzdHJpbmc7Ci19Ci0KLVBhc3NSZWZQdHI8U3RyaW5nSW1wbD4g
U3RyaW5nSW1wbDo6Y3JlYXRlKGNvbnN0IGNoYXIqIHN0cmluZykKLXsKLSAgICBpZiAoIXN0cmlu
ZykKLSAgICAgICAgcmV0dXJuIGVtcHR5KCk7Ci0gICAgcmV0dXJuIGNyZWF0ZShzdHJpbmcsIHN0
cmxlbihzdHJpbmcpKTsKLX0KLQogI2lmIFVTRShKU0MpCiBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+
IFN0cmluZ0ltcGw6OmNyZWF0ZShjb25zdCBKU0M6OlVTdHJpbmcmIHN0cikKIHsKQEAgLTEwMTcs
MjUgKzk4MSw0IEBAIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6Y3Jvc3MKICAg
ICByZXR1cm4gdGhyZWFkc2FmZUNvcHkoKTsKIH0KIAotU3RyaW5nSW1wbDo6U2hhcmVkVUNoYXIq
IFN0cmluZ0ltcGw6OnNoYXJlZEJ1ZmZlcigpCi17Ci0gICAgaWYgKG1fbGVuZ3RoIDwgbWluTGVu
Z3RoVG9TaGFyZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBCdWZmZXJPd25lcnNoaXAgb3du
ZXJzaGlwID0gYnVmZmVyT3duZXJzaGlwKCk7Ci0KLSAgICBpZiAob3duZXJzaGlwID09IEJ1ZmZl
ckludGVybmFsKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChvd25lcnNoaXAgPT0gQnVm
ZmVyT3duZWQpIHsKLSAgICAgICAgQVNTRVJUKCFtX3NoYXJlZEJ1ZmZlcik7Ci0gICAgICAgIG1f
c2hhcmVkQnVmZmVyID0gU2hhcmVkVUNoYXI6OmNyZWF0ZShuZXcgU2hhcmFibGVVQ2hhcihjb25z
dF9jYXN0PFVDaGFyKj4obV9kYXRhKSkpLnJlbGVhc2VSZWYoKTsKLSAgICAgICAgbV9yZWZDb3Vu
dEFuZEZsYWdzID0gKG1fcmVmQ291bnRBbmRGbGFncyAmIH5zX3JlZkNvdW50TWFza0J1ZmZlck93
bmVyc2hpcCkgfCBCdWZmZXJTaGFyZWQ7Ci0gICAgfQotCi0gICAgQVNTRVJUKGJ1ZmZlck93bmVy
c2hpcCgpID09IEJ1ZmZlclNoYXJlZCk7Ci0gICAgQVNTRVJUKG1fc2hhcmVkQnVmZmVyKTsKLSAg
ICByZXR1cm4gbV9zaGFyZWRCdWZmZXI7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuaAkocmV2aXNpb24gNTU4MzIpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC01Niw2ICs1
Niw4IEBAIHN0cnVjdCBVQ2hhckJ1ZmZlclRyYW5zbGF0b3I7CiAKIGVudW0gVGV4dENhc2VTZW5z
aXRpdml0eSB7IFRleHRDYXNlU2Vuc2l0aXZlLCBUZXh0Q2FzZUluc2Vuc2l0aXZlIH07CiAKK3R5
cGVkZWYgT3duRmFzdE1hbGxvY1B0cjxjb25zdCBVQ2hhcj4gU2hhcmFibGVVQ2hhcjsKK3R5cGVk
ZWYgQ3Jvc3NUaHJlYWRSZWZDb3VudGVkPFNoYXJhYmxlVUNoYXI+IFNoYXJlZFVDaGFyOwogdHlw
ZWRlZiBib29sICgqQ2hhcmFjdGVyTWF0Y2hGdW5jdGlvblB0cikoVUNoYXIpOwogCiBjbGFzcyBT
dHJpbmdJbXBsIDogcHVibGljIE5vbmNvcHlhYmxlIHsKQEAgLTYzLDQ5ICs2NSwxMDEgQEAgY2xh
c3MgU3RyaW5nSW1wbCA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CiAgICAgZnJpZW5kIHN0cnVjdCBI
YXNoQW5kQ2hhcmFjdGVyc1RyYW5zbGF0b3I7CiAgICAgZnJpZW5kIHN0cnVjdCBVQ2hhckJ1ZmZl
clRyYW5zbGF0b3I7CiBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBUaHJlYWRHbG9iYWxEYXRh
OwotCiAgICAgZW51bSBCdWZmZXJPd25lcnNoaXAgewogICAgICAgICBCdWZmZXJJbnRlcm5hbCwK
ICAgICAgICAgQnVmZmVyT3duZWQsCiAgICAgICAgIEJ1ZmZlclNoYXJlZCwKICAgICB9OwogCi0g
ICAgdHlwZWRlZiBPd25GYXN0TWFsbG9jUHRyPGNvbnN0IFVDaGFyPiBTaGFyYWJsZVVDaGFyOwot
ICAgIHR5cGVkZWYgQ3Jvc3NUaHJlYWRSZWZDb3VudGVkPFNoYXJhYmxlVUNoYXI+IFNoYXJlZFVD
aGFyOworICAgIC8vIFVzZWQgdG8gY29uc3RydWN0IHN0YXRpYyBzdHJpbmdzLCB3aGljaCBoYXZl
IGFuIHNwZWNpYWwgcmVmQ291bnQgdGhhdCBjYW4gbmV2ZXIgaGl0IHplcm8uCisgICAgLy8gVGhp
cyBtZWFucyB0aGF0IHRoZSBzdGF0aWMgc3RyaW5nIHdpbGwgbmV2ZXIgYmUgZGVzdHJveWVkLCB3
aGljaCBpcyBpbXBvcnRhbnQgYmVjYXVzZQorICAgIC8vIHN0YXRpYyBzdHJpbmdzIHdpbGwgYmUg
c2hhcmVkIGFjcm9zcyB0aHJlYWRzICYgcmVmLWNvdW50ZWQgaW4gYSBub24tdGhyZWFkc2FmZSBt
YW5uZXIuCisgICAgZW51bSBTdGF0aWNTdHJpbmdDb25zdHJ1Y3RUeXBlIHsgQ29uc3RydWN0U3Rh
dGljU3RyaW5nIH07CisgICAgU3RyaW5nSW1wbChjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5z
aWduZWQgbGVuZ3RoLCBTdGF0aWNTdHJpbmdDb25zdHJ1Y3RUeXBlKQorICAgICAgICA6IG1fZGF0
YShjaGFyYWN0ZXJzKQorICAgICAgICAsIG1fc2hhcmVkQnVmZmVyKDApCisgICAgICAgICwgbV9s
ZW5ndGgobGVuZ3RoKQorICAgICAgICAsIG1fcmVmQ291bnRBbmRGbGFncyhzX3JlZkNvdW50Rmxh
Z1N0YXRpYyB8IEJ1ZmZlckludGVybmFsKQorICAgICAgICAsIG1faGFzaCgwKQorICAgIHsKKyAg
ICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGhhc2ggaXMgY29tcHV0ZWQgc28gdGhhdCBBdG9taWNT
dHJpbmdIYXNoIGNhbiBjYWxsIGV4aXN0aW5nSGFzaCgpCisgICAgICAgIC8vIHdpdGggaW1wdW5p
dHkuIFRoZSBlbXB0eSBzdHJpbmcgaXMgc3BlY2lhbCBiZWNhdXNlIGl0IGlzIG5ldmVyIGVudGVy
ZWQgaW50bworICAgICAgICAvLyBBdG9taWNTdHJpbmcncyBIYXNoS2V5LCBidXQgc3RpbGwgbmVl
ZHMgdG8gY29tcGFyZSBjb3JyZWN0bHkuCisgICAgICAgIGhhc2goKTsKKyAgICB9CisKKyAgICAv
LyBDcmVhdGUgYSBub3JtYWwgc3RyaW5nIHdpdGggaW50ZXJuYWwgc3RvcmFnZSAoQnVmZmVySW50
ZXJuYWwpCisgICAgU3RyaW5nSW1wbCh1bnNpZ25lZCBsZW5ndGgpCisgICAgICAgIDogbV9kYXRh
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUNoYXIqPih0aGlzICsgMSkpCisgICAgICAgICwgbV9z
aGFyZWRCdWZmZXIoMCkKKyAgICAgICAgLCBtX2xlbmd0aChsZW5ndGgpCisgICAgICAgICwgbV9y
ZWZDb3VudEFuZEZsYWdzKHNfcmVmQ291bnRJbmNyZW1lbnQgfCBCdWZmZXJJbnRlcm5hbCkKKyAg
ICAgICAgLCBtX2hhc2goMCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2RhdGEpOworICAgICAg
ICBBU1NFUlQobV9sZW5ndGgpOworICAgIH0KIAotICAgIC8vIFVzZWQgdG8gY3JlYXRlIHRoZSBl
bXB0eSBzdHJpbmcgKCIiKSwgYXV0b21hdGljYWxseSBoYXNoZXMuCi0gICAgU3RyaW5nSW1wbCgp
OwotICAgIC8vIENyZWF0ZSBhIFN0cmluZ0ltcGwgd2l0aCBpbnRlcm5hbCBzdG9yYWdlIChCdWZm
ZXJJbnRlcm5hbCkKLSAgICBTdHJpbmdJbXBsKHVuc2lnbmVkIGxlbmd0aCk7CiAgICAgLy8gQ3Jl
YXRlIGEgU3RyaW5nSW1wbCBhZG9wdGluZyBvd25lcnNoaXAgb2YgdGhlIHByb3ZpZGVkIGJ1ZmZl
ciAoQnVmZmVyT3duZWQpCi0gICAgU3RyaW5nSW1wbChjb25zdCBVQ2hhciosIHVuc2lnbmVkIGxl
bmd0aCk7Ci0gICAgLy8gQ3JlYXRlIGEgU3RyaW5nSW1wbCB1c2luZyBhIHNoYXJlZCBidWZmZXIg
KEJ1ZmZlclNoYXJlZCkKLSAgICBTdHJpbmdJbXBsKGNvbnN0IFVDaGFyKiwgdW5zaWduZWQgbGVu
Z3RoLCBQYXNzUmVmUHRyPFNoYXJlZFVDaGFyPik7CisgICAgU3RyaW5nSW1wbChjb25zdCBVQ2hh
ciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQorICAgICAgICA6IG1fZGF0YShjaGFyYWN0
ZXJzKQorICAgICAgICAsIG1fc2hhcmVkQnVmZmVyKDApCisgICAgICAgICwgbV9sZW5ndGgobGVu
Z3RoKQorICAgICAgICAsIG1fcmVmQ291bnRBbmRGbGFncyhzX3JlZkNvdW50SW5jcmVtZW50IHwg
QnVmZmVyT3duZWQpCisgICAgICAgICwgbV9oYXNoKDApCisgICAgeworICAgICAgICBBU1NFUlQo
bV9kYXRhKTsKKyAgICAgICAgQVNTRVJUKG1fbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBVc2Vk
IHRvIGNvbnN0cnVjdCBuZXcgc3RyaW5ncyBzaGFyaW5nIGFuIGV4aXN0aW5nIFNoYXJlZFVDaGFy
IChCdWZmZXJTaGFyZWQpCisgICAgU3RyaW5nSW1wbChjb25zdCBVQ2hhciogY2hhcmFjdGVycywg
dW5zaWduZWQgbGVuZ3RoLCBQYXNzUmVmUHRyPFNoYXJlZFVDaGFyPiBzaGFyZWRCdWZmZXIpCisg
ICAgICAgIDogbV9kYXRhKGNoYXJhY3RlcnMpCisgICAgICAgICwgbV9zaGFyZWRCdWZmZXIoc2hh
cmVkQnVmZmVyLnJlbGVhc2VSZWYoKSkKKyAgICAgICAgLCBtX2xlbmd0aChsZW5ndGgpCisgICAg
ICAgICwgbV9yZWZDb3VudEFuZEZsYWdzKHNfcmVmQ291bnRJbmNyZW1lbnQgfCBCdWZmZXJTaGFy
ZWQpCisgICAgICAgICwgbV9oYXNoKDApCisgICAgeworICAgICAgICBBU1NFUlQobV9kYXRhKTsK
KyAgICAgICAgQVNTRVJUKG1fbGVuZ3RoKTsKKyAgICB9CiAKICAgICAvLyBGb3IgdXNlIG9ubHkg
YnkgQXRvbWljU3RyaW5nJ3MgWFhYVHJhbnNsYXRvciBoZWxwZXJzLgotICAgIHZvaWQgc2V0SGFz
aCh1bnNpZ25lZCBoYXNoKSB7IEFTU0VSVCghbV9oYXNoKTsgbV9oYXNoID0gaGFzaDsgfQotICAg
IAorICAgIHZvaWQgc2V0SGFzaCh1bnNpZ25lZCBoYXNoKQorICAgIHsKKyAgICAgICAgQVNTRVJU
KCFtX2hhc2gpOworICAgICAgICBBU1NFUlQoaGFzaCA9PSBjb21wdXRlSGFzaChtX2RhdGEsIG1f
bGVuZ3RoKSk7CisgICAgICAgIG1faGFzaCA9IGhhc2g7CisgICAgfQorCiBwdWJsaWM6CiAgICAg
flN0cmluZ0ltcGwoKTsKIAogICAgIHN0YXRpYyBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGNyZWF0
ZShjb25zdCBVQ2hhciosIHVuc2lnbmVkIGxlbmd0aCk7CiAgICAgc3RhdGljIFBhc3NSZWZQdHI8
U3RyaW5nSW1wbD4gY3JlYXRlKGNvbnN0IGNoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOwogICAgIHN0
YXRpYyBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGNyZWF0ZShjb25zdCBjaGFyKik7Ci0gICAgc3Rh
dGljIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gY3JlYXRlVW5pbml0aWFsaXplZCh1bnNpZ25lZCBs
ZW5ndGgsIFVDaGFyKiYgZGF0YSk7Ci0KLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxTdHJpbmdJbXBs
PiBjcmVhdGVXaXRoVGVybWluYXRpbmdOdWxsQ2hhcmFjdGVyKGNvbnN0IFN0cmluZ0ltcGwmKTsK
LQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGNyZWF0ZVN0cmlwcGluZ051bGxD
aGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiwgdW5zaWduZWQgbGVuZ3RoKTsKLSAgICBzdGF0aWMgUGFz
c1JlZlB0cjxTdHJpbmdJbXBsPiBhZG9wdChTdHJpbmdCdWZmZXImKTsKLSAgICBzdGF0aWMgUGFz
c1JlZlB0cjxTdHJpbmdJbXBsPiBhZG9wdChWZWN0b3I8VUNoYXI+Jik7CiAjaWYgVVNFKEpTQykK
ICAgICBzdGF0aWMgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBjcmVhdGUoY29uc3QgSlNDOjpVU3Ry
aW5nJik7CiAgICAgSlNDOjpVU3RyaW5nIHVzdHJpbmcoKTsKICNlbmRpZgogCisgICAgc3RhdGlj
IFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gY3JlYXRlVW5pbml0aWFsaXplZCh1bnNpZ25lZCBsZW5n
dGgsIFVDaGFyKiYgZGF0YSk7CisgICAgc3RhdGljIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gY3Jl
YXRlV2l0aFRlcm1pbmF0aW5nTnVsbENoYXJhY3Rlcihjb25zdCBTdHJpbmdJbXBsJik7CisgICAg
c3RhdGljIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gY3JlYXRlU3RyaXBwaW5nTnVsbENoYXJhY3Rl
cnMoY29uc3QgVUNoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOworCisgICAgdGVtcGxhdGU8c2l6ZV90
IGlubGluZUNhcGFjaXR5PgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGFkb3B0
KFZlY3RvcjxVQ2hhciwgaW5saW5lQ2FwYWNpdHk+JiB2ZWN0b3IpCisgICAgeworICAgICAgICBp
ZiAoc2l6ZV90IHNpemUgPSB2ZWN0b3Iuc2l6ZSgpKSB7CisgICAgICAgICAgICBBU1NFUlQodmVj
dG9yLmRhdGEoKSk7CisgICAgICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0cmluZ0ltcGwo
dmVjdG9yLnJlbGVhc2VCdWZmZXIoKSwgc2l6ZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVy
biBlbXB0eSgpOworICAgIH0KKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBhZG9w
dChTdHJpbmdCdWZmZXImKTsKKwogICAgIFNoYXJlZFVDaGFyKiBzaGFyZWRCdWZmZXIoKTsKLSAg
ICBjb25zdCBVQ2hhciogY2hhcmFjdGVycygpIHsgcmV0dXJuIG1fZGF0YTsgfQorICAgIGNvbnN0
IFVDaGFyKiBjaGFyYWN0ZXJzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CiAgICAgdW5zaWdu
ZWQgbGVuZ3RoKCkgeyByZXR1cm4gbV9sZW5ndGg7IH0KIAogICAgIGJvb2wgaGFzVGVybWluYXRp
bmdOdWxsQ2hhcmFjdGVyKCkgY29uc3QgeyByZXR1cm4gbV9yZWZDb3VudEFuZEZsYWdzICYgc19y
ZWZDb3VudEZsYWdIYXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXI7IH0KQEAgLTExMywxNSArMTY3
LDE3IEBAIHB1YmxpYzoKICAgICBib29sIGluVGFibGUoKSBjb25zdCB7IHJldHVybiBtX3JlZkNv
dW50QW5kRmxhZ3MgJiBzX3JlZkNvdW50RmxhZ0luVGFibGU7IH0KICAgICB2b2lkIHNldEluVGFi
bGUoKSB7IG1fcmVmQ291bnRBbmRGbGFncyB8PSBzX3JlZkNvdW50RmxhZ0luVGFibGU7IH0KIAot
ICAgIHVuc2lnbmVkIGhhc2goKSB7IGlmIChtX2hhc2ggPT0gMCkgbV9oYXNoID0gY29tcHV0ZUhh
c2gobV9kYXRhLCBtX2xlbmd0aCk7IHJldHVybiBtX2hhc2g7IH0KKyAgICB1bnNpZ25lZCBoYXNo
KCkgY29uc3QgeyBpZiAoIW1faGFzaCkgbV9oYXNoID0gY29tcHV0ZUhhc2gobV9kYXRhLCBtX2xl
bmd0aCk7IHJldHVybiBtX2hhc2g7IH0KICAgICB1bnNpZ25lZCBleGlzdGluZ0hhc2goKSBjb25z
dCB7IEFTU0VSVChtX2hhc2gpOyByZXR1cm4gbV9oYXNoOyB9Ci0gICAgaW5saW5lIHN0YXRpYyB1
bnNpZ25lZCBjb21wdXRlSGFzaChjb25zdCBVQ2hhciogZGF0YSwgdW5zaWduZWQgbGVuZ3RoKSB7
IHJldHVybiBXVEY6OnN0cmluZ0hhc2goZGF0YSwgbGVuZ3RoKTsgfQotICAgIGlubGluZSBzdGF0
aWMgdW5zaWduZWQgY29tcHV0ZUhhc2goY29uc3QgY2hhciogZGF0YSkgeyByZXR1cm4gV1RGOjpz
dHJpbmdIYXNoKGRhdGEpOyB9CisgICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVIYXNoKGNvbnN0
IFVDaGFyKiBkYXRhLCB1bnNpZ25lZCBsZW5ndGgpIHsgcmV0dXJuIFdURjo6c3RyaW5nSGFzaChk
YXRhLCBsZW5ndGgpOyB9CisgICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVIYXNoKGNvbnN0IGNo
YXIqIGRhdGEpIHsgcmV0dXJuIFdURjo6c3RyaW5nSGFzaChkYXRhKTsgfQogCiAgICAgU3RyaW5n
SW1wbCogcmVmKCkgeyBtX3JlZkNvdW50QW5kRmxhZ3MgKz0gc19yZWZDb3VudEluY3JlbWVudDsg
cmV0dXJuIHRoaXM7IH0KICAgICBBTFdBWVNfSU5MSU5FIHZvaWQgZGVyZWYoKSB7IG1fcmVmQ291
bnRBbmRGbGFncyAtPSBzX3JlZkNvdW50SW5jcmVtZW50OyBpZiAoIShtX3JlZkNvdW50QW5kRmxh
Z3MgJiAoc19yZWZDb3VudE1hc2sgfCBzX3JlZkNvdW50RmxhZ1N0YXRpYykpKSBkZWxldGUgdGhp
czsgfQogICAgIEFMV0FZU19JTkxJTkUgYm9vbCBoYXNPbmVSZWYoKSBjb25zdCB7IHJldHVybiAo
bV9yZWZDb3VudEFuZEZsYWdzICYgKHNfcmVmQ291bnRNYXNrIHwgc19yZWZDb3VudEZsYWdTdGF0
aWMpKSA9PSBzX3JlZkNvdW50SW5jcmVtZW50OyB9CiAKKyAgICBzdGF0aWMgU3RyaW5nSW1wbCog
ZW1wdHkoKTsKKwogICAgIC8vIFJldHVybnMgYSBTdHJpbmdJbXBsIHN1aXRhYmxlIGZvciB1c2Ug
b24gYW5vdGhlciB0aHJlYWQuCiAgICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBjcm9zc1RocmVh
ZFN0cmluZygpOwogICAgIC8vIE1ha2VzIGEgZGVlcCBjb3B5LiBIZWxwZnVsIG9ubHkgaWYgeW91
IG5lZWQgdG8gdXNlIGEgU3RyaW5nIG9uIGFub3RoZXIgdGhyZWFkCkBAIC0xNzgsOCArMjM0LDYg
QEAgcHVibGljOgogICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gcmVwbGFjZShTdHJpbmdJbXBs
KiwgU3RyaW5nSW1wbCopOwogICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gcmVwbGFjZSh1bnNp
Z25lZCBpbmRleCwgdW5zaWduZWQgbGVuLCBTdHJpbmdJbXBsKik7CiAKLSAgICBzdGF0aWMgU3Ry
aW5nSW1wbCogZW1wdHkoKTsKLQogICAgIFZlY3RvcjxjaGFyPiBhc2NpaSgpOwogCiAgICAgV1RG
OjpVbmljb2RlOjpEaXJlY3Rpb24gZGVmYXVsdFdyaXRpbmdEaXJlY3Rpb24oKTsKQEAgLTE5Nyw4
ICsyNTEsNiBAQCBwcml2YXRlOgogCiAgICAgc3RhdGljIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4g
Y3JlYXRlU3RyaXBwaW5nTnVsbENoYXJhY3RlcnNTbG93Q2FzZShjb25zdCBVQ2hhciosIHVuc2ln
bmVkIGxlbmd0aCk7CiAgICAgCi0gICAgLy8gVGhlIFN0cmluZ0ltcGwgc3RydWN0IGFuZCBpdHMg
ZGF0YSBtYXkgYmUgYWxsb2NhdGVkIHdpdGhpbiBhIHNpbmdsZSBoZWFwIGJsb2NrLgotICAgIC8v
IEluIHRoaXMgY2FzZSwgdGhlIG1fZGF0YSBwb2ludGVyIGlzIGFuICJpbnRlcm5hbCBidWZmZXIi
LCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBkZWFsbG9jYXRlZC4KICAgICBCdWZmZXJPd25lcnNo
aXAgYnVmZmVyT3duZXJzaGlwKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8QnVmZmVyT3du
ZXJzaGlwPihtX3JlZkNvdW50QW5kRmxhZ3MgJiBzX3JlZkNvdW50TWFza0J1ZmZlck93bmVyc2hp
cCk7IH0KIAogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzX3JlZkNvdW50TWFzayA9IDB4RkZG
RkZGRTA7Cg==
</data>
<flag name="review"
          id="33740"
          type_id="1"
          status="+"
          setter="oliver"
    />
          </attachment>
      

    </bug>

</bugzilla>