<?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>213454</bug_id>
          
          <creation_ts>2020-06-22 01:40:54 -0700</creation_ts>
          <short_desc>[JSC] Cache UDateTimePatternGenerator</short_desc>
          <delta_ts>2020-09-15 21:24:15 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>213425</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Yusuke Suzuki">ysuzuki</reporter>
          <assigned_to name="Yusuke Suzuki">ysuzuki</assigned_to>
          <cc>ap</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>ross.kirsling</cc>
    
    <cc>saam</cc>
    
    <cc>tzagallo</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1664961</commentid>
    <comment_count>0</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-06-22 01:40:54 -0700</bug_when>
    <thetext>A lot of ICU objects are opened by the specified locale, but in the typical application, this locale can be one.
We should cache some of ICU objects that is repeatedly used, and clear it if it is not used so much.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1665045</commentid>
    <comment_count>1</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2020-06-22 08:32:43 -0700</bug_when>
    <thetext>We have a cache for encoding, does anything else show on profiles?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1665046</commentid>
    <comment_count>2</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-06-22 08:34:22 -0700</bug_when>
    <thetext>(In reply to Alexey Proskuryakov from comment #1)
&gt; We have a cache for encoding, does anything else show on profiles?

This is not related to encoding, this is for JSC Intl features including Intl.DateTimeFormat, NumberFormat etc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1665052</commentid>
    <comment_count>3</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-06-22 09:00:04 -0700</bug_when>
    <thetext>(In reply to Yusuke Suzuki from comment #2)
&gt; (In reply to Alexey Proskuryakov from comment #1)
&gt; &gt; We have a cache for encoding, does anything else show on profiles?
&gt; 
&gt; This is not related to encoding, this is for JSC Intl features including
&gt; Intl.DateTimeFormat, NumberFormat etc.

For example, every time Intl.DateTimeFormat is created, we open and close UDateTimePatternGenerator, which involves ICU locale parsing.
https://github.com/WebKit/webkit/blob/master/Source/JavaScriptCore/runtime/IntlDateTimeFormat.cpp#L608-L620

And further more, this code can be called every time we call `new Date().toLocaleString()` is called.
https://github.com/WebKit/webkit/blob/master/Source/JavaScriptCore/builtins/DatePrototype.js#L78

Furthermore, to make the code spec compliant, we need to generate ICU date-format pattern from &quot;jjmm&quot; skeleton to obtain hourCycleDefault (hcDefault in the spec). But this is per-locale 4-value enum. Getting dateformat generator from locale, passing skeleton to generate pattern, and parsing the pattern to obtain this 4-value enum every time we call is toLocaleString not so efficient. Currently, we are not doing this since it is costly. But we should to make our implementation spec compliant and caching is the best idea to avoid the above thing since it is per-locale thing.

As the result, if you run

for (var i = 0; i &lt; 1e4; ++i) {
    new Date().toLocaleString();
}

80 - 90% of time is used for getting UDateTimePatternGenerator. If you add the other processing which can be avoided by caching, this part takes 95%.
And the above takes 3-4 s in JSC. While V8 and SpiderMonkey take 66 ms.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1665075</commentid>
    <comment_count>4</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2020-06-22 09:49:01 -0700</bug_when>
    <thetext>&gt; This is not related to encoding, this is for JSC Intl features including
&gt; Intl.DateTimeFormat, NumberFormat etc.

That&apos;s why my question was about &quot;anything else&quot;.

I guess a microbenchmark is good enough here, although an improvement on an actual live website would be more cool.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1665236</commentid>
    <comment_count>5</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-06-22 17:05:49 -0700</bug_when>
    <thetext>I think the goal of this is making Intl APIs performance competitive to the other engines even after adding new features / fixing spec violations / updating the existing implementation.
I&apos;ve checked new Intl APIs and noticed that updating sometimes introduces more ICU round-trip, which can be costly.
And I noticed that these cost can be avoided if some of ICU objects are cached because these calculations are typically per-locale, and it seems that the other engines are taking the same path (caching) to mitigate this ICU cost.
If we can keep these APIs competitive to the other engines (this means, significantly improve the performance for major cases, while keeping performance same to the other engines for minor cases), then we do not need to bother about updating / fixing the existing issues which can introduce more inevitable ICU round-trips :), that&apos;s the goal of this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1688937</commentid>
    <comment_count>6</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-09-15 17:44:47 -0700</bug_when>
    <thetext>UDateTimePatternGenerator look up is too expensive.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1688974</commentid>
    <comment_count>7</comment_count>
      <attachid>408891</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-09-15 20:02:45 -0700</bug_when>
    <thetext>Created attachment 408891
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1688977</commentid>
    <comment_count>8</comment_count>
      <attachid>408891</attachid>
    <who name="Ross Kirsling">ross.kirsling</who>
    <bug_when>2020-09-15 20:36:35 -0700</bug_when>
    <thetext>Comment on attachment 408891
Patch

r=me, what an amazing perf boost.
Like you mentioned on Slack, I like the idea of looking into whether an LRU cache or something would provide further benefits in the future.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1688990</commentid>
    <comment_count>9</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-09-15 21:23:57 -0700</bug_when>
    <thetext>Committed r267132: &lt;https://trac.webkit.org/changeset/267132&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1688991</commentid>
    <comment_count>10</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-09-15 21:24:15 -0700</bug_when>
    <thetext>&lt;rdar://problem/68962794&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>408891</attachid>
            <date>2020-09-15 20:02:45 -0700</date>
            <delta_ts>2020-09-15 20:36:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-213454-20200915200244.patch</filename>
            <type>text/plain</type>
            <size>19984</size>
            <attacher name="Yusuke Suzuki">ysuzuki</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjY3MTI1CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCA4
MGM3MDY5ZjJhNTFhNThkNmI1M2I3ODRlZmIyYTI1ZjQ5MmNmOWViLi4yY2Y5NWI1NTRlMTgxMWZk
Y2QxZjNlMjkxODE1OWViOWUyMWJhNWExIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwzNyBAQAorMjAyMC0wOS0xNSAgWXVzdWtlIFN1enVraSAgPHlzdXp1a2lAYXBwbGUuY29t
PgorCisgICAgICAgIFtKU0NdIENhY2hlIFVEYXRlVGltZVBhdHRlcm5HZW5lcmF0b3IKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIxMzQ1NAorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIElDVSB1ZGF0cGdfb3Bl
biBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgc2xvdy4gQXMgYSByZXN1bHQsIDgwfiUgb2YgdGlt
ZSBpcyB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gd2hlbiBjYWxsaW5nIERhdGUjdG9Mb2NhbGVTdHJp
bmcuCisgICAgICAgIFdlIHNob3VsZCBoYXZlIGxhc3QtdXNlZCBjYWNoZSBpbiBWTSwgd2hpY2gg
Y292ZXJzIG1ham9yIGNhc2VzIGxpa2UsICJPbmUgbG9jYWxlIChwb3NzaWJseSBkZWZhdWx0IGxv
Y2FsZSkgaXMgdXNlZCBhbmQgY29udGludW91c2x5CisgICAgICAgIHVzZSB0b0xvY2FsZVN0cmlu
ZyB3aXRoIHRoYXQgbG9jYWxlIi4KKworICAgICAgICBUaGlzIHNpZ25pZmljYW50bHkgaW1wcm92
ZXMgdG9Mb2NhbGVTdHJpbmcgLyB0b0xvY2FsZURhdGVTdHJpbmcgLyB0b0xvY2FsZVRpbWVTdHJp
bmcgcGVyZm9ybWFuY2UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFRvVCAgICAgICAgICAgICAgICAgICAgIFBhdGNoZWQKKworICAgICAgICAg
ICAgZGF0ZS10by1sb2NhbGUtc3RyaW5nICAgICAgICAgICAzOTIuMDA5MistMC42ODExICAgICBe
ICAgICA4Ny4zMTk2Ky0zLjE1OTggICAgICAgIF4gZGVmaW5pdGVseSA0LjQ4OTR4IGZhc3Rlcgor
ICAgICAgICAgICAgZGF0ZS10by1sb2NhbGUtZGF0ZS1zdHJpbmcgICAgICAzNzcuOTExNystNy44
NzAxICAgICBeICAgICA3MC40MTU1Ky0zLjY2NjEgICAgICAgIF4gZGVmaW5pdGVseSA1LjM2Njl4
IGZhc3RlcgorICAgICAgICAgICAgZGF0ZS10by1sb2NhbGUtdGltZS1zdHJpbmcgICAgICAzNzMu
MTk3MCstMy4wMTQyICAgICBeICAgICA2Ny4zNzkwKy0yLjg5NTIgICAgICAgIF4gZGVmaW5pdGVs
eSA1LjUzODh4IGZhc3RlcgorCisKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIFNvdXJjZXMudHh0OgorICAgICAgICAqIHJ1bnRp
bWUvSW50bENhY2hlLmNwcDogQWRkZWQuCisgICAgICAgIChKU0M6OkludGxDYWNoZTo6Y2FjaGVT
aGFyZWRQYXR0ZXJuR2VuZXJhdG9yKToKKyAgICAgICAgKEpTQzo6SW50bENhY2hlOjpnZXRCZXN0
RGF0ZVRpbWVQYXR0ZXJuKToKKyAgICAgICAgKiBydW50aW1lL0ludGxDYWNoZS5oOiBBZGRlZC4K
KyAgICAgICAgKEpTQzo6SW50bENhY2hlOjpnZXRTaGFyZWRQYXR0ZXJuR2VuZXJhdG9yKToKKyAg
ICAgICAgKiBydW50aW1lL0ludGxEYXRlVGltZUZvcm1hdC5jcHA6CisgICAgICAgIChKU0M6Oklu
dGxEYXRlVGltZUZvcm1hdDo6aW5pdGlhbGl6ZURhdGVUaW1lRm9ybWF0KToKKyAgICAgICAgKiBy
dW50aW1lL1ZNLmNwcDoKKyAgICAgICAgKEpTQzo6Vk06OlZNKToKKyAgICAgICAgKiBydW50aW1l
L1ZNLmg6CisgICAgICAgIChKU0M6OlZNOjppbnRsQ2FjaGUpOgorCiAyMDIwLTA5LTE1ICBIeWVv
Y2tKaW4gS2ltICA8a2hlcm9vdHpAZ21haWwuY29tPgogCiAgICAgICAgIENoZWNrIHdoZXRoZXIg
dGhlIGl0ZXJhdG9yIGlzIGNhbGxhYmxlIGluIHNwcmVhZApkaWZmIC0tZ2l0IGEvU291cmNlL0ph
dmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagppbmRleCA0Zjc0ZDg5OTU2ZWU4NDIyYjI1N2VjZTBjOWIwZTMyNGM3MjgwOWYyLi5jODQy
MDZlN2NhZmUzZGY4YmY4YTI5NzMxZDkwMzUzYzQ0ZGEwOWI4IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagor
KysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvagpAQCAtMTc5Nyw2ICsxNzk3LDcgQEAKIAkJRTMxNjE4MTMxRUM1RkUxNzAwMDZB
MjE4IC8qIERPTUFubm90YXRpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEUzMTYxODEwMUVDNUZFMDgwMDA2QTIxOCAvKiBET01Bbm5vdGF0aW9uLmgg
Ki87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJRTMxNjE4
MTUxRUM1RkUyNzAwMDZBMjE4IC8qIERPTUF0dHJpYnV0ZUdldHRlclNldHRlci5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTMxNjE4MTIxRUM1RkUwODAw
MDZBMjE4IC8qIERPTUF0dHJpYnV0ZUdldHRlclNldHRlci5oICovOyBzZXR0aW5ncyA9IHtBVFRS
SUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUUzMThDQkMxMUI4QUVGNTEwMEEyOTI5RCAv
KiBKU01vZHVsZU5hbWVzcGFjZU9iamVjdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gRTMxOENCQkYxQjhBRUY1MTAwQTI5MjlEIC8qIEpTTW9kdWxlTmFt
ZXNwYWNlT2JqZWN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsg
fTsgfTsKKwkJRTMxQzMxMzIyNTExQUZENzAwRTdBM0EwIC8qIEludGxDYWNoZS5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTMxQzMxMzAyNTExQUZENjAw
RTdBM0EwIC8qIEludGxDYWNoZS5oICovOyB9OwogCQlFMzIwMUMxRDFGOEU4MjM2MDA3NkEwMzIg
LyogSlNTY3JpcHRGZXRjaFBhcmFtZXRlcnMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEUzOEQwNjBCMUY4RTgxNDEwMDY0OUNGMiAvKiBKU1NjcmlwdEZl
dGNoUGFyYW1ldGVycy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7
IH07IH07CiAJCUUzMjAxQzFFMUY4RTgyNEMwMDc2QTAzMiAvKiBTY3JpcHRGZXRjaFBhcmFtZXRl
cnMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUzOEQw
NjBDMUY4RTgxNDEwMDY0OUNGMiAvKiBTY3JpcHRGZXRjaFBhcmFtZXRlcnMuaCAqLzsgc2V0dGlu
Z3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQlFMzIyRTVBMzFEQTY0NDM5
MDA2RTc3MDkgLyogREZHU25pcHBldFBhcmFtcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gRTMyMkU1QTExREE2NDQzNTAwNkU3NzA5IC8qIERGR1NuaXBw
ZXRQYXJhbXMuaCAqLzsgfTsKQEAgLTQ5NzUsNiArNDk3Niw4IEBACiAJCUUzMTYxODEyMUVDNUZF
MDgwMDA2QTIxOCAvKiBET01BdHRyaWJ1dGVHZXR0ZXJTZXR0ZXIuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gRE9NQXR0cmlidXRlR2V0dGVyU2V0dGVyLmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCUUzMThDQkJFMUI4QUVGNTEwMEEyOTI5RCAvKiBKU01vZHVsZU5h
bWVzcGFjZU9iamVjdC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBK
U01vZHVsZU5hbWVzcGFjZU9iamVjdC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CUUzMThDQkJGMUI4QUVGNTEwMEEyOTI5RCAvKiBKU01vZHVsZU5hbWVzcGFjZU9iamVjdC5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBKU01vZHVsZU5hbWVzcGFjZU9iamVjdC5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFMzFDMzEzMDI1MTFBRkQ2MDBFN0EzQTAg
LyogSW50bENhY2hlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEludGxDYWNo
ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFMzFDMzEzMTI1MTFBRkQ2MDBFN0Ez
QTAgLyogSW50bENhY2hlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9
IEludGxDYWNoZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUUzMjJFNUEwMURB
NjQ0MzUwMDZFNzcwOSAvKiBERkdTbmlwcGV0UGFyYW1zLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgbmFtZSA9IERGR1NuaXBwZXRQYXJhbXMuY3BwOyBwYXRoID0gZGZnL0RGR1Nu
aXBwZXRQYXJhbXMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFMzIyRTVBMTFE
QTY0NDM1MDA2RTc3MDkgLyogREZHU25pcHBldFBhcmFtcy5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jLmg7IG5hbWUgPSBERkdTbmlwcGV0UGFyYW1zLmg7IHBhdGggPSBkZmcvREZHU25pcHBldFBh
cmFtcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFMzIyRTVBNDFEQTY0NEE0MDA2
RTc3MDkgLyogRlRMU25pcHBldFBhcmFtcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IG5hbWUgPSBGVExTbmlwcGV0UGFyYW1zLmNwcDsgcGF0aCA9IGZ0bC9GVExTbmlwcGV0UGFy
YW1zLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTczMTAsNiArNzMxMyw4IEBA
CiAJCQkJQTdBOEFGMkIxN0FEQjVGMzAwNUFCMTc0IC8qIEludDhBcnJheS5oICovLAogCQkJCUJD
OUJCOTVCMEUxOTY4MDYwMERGODg1NSAvKiBJbnRlcm5hbEZ1bmN0aW9uLmNwcCAqLywKIAkJCQlC
QzExNjY3QTBFMTk5QzA1MDA4MDY2REQgLyogSW50ZXJuYWxGdW5jdGlvbi5oICovLAorCQkJCUUz
MUMzMTMxMjUxMUFGRDYwMEU3QTNBMCAvKiBJbnRsQ2FjaGUuY3BwICovLAorCQkJCUUzMUMzMTMw
MjUxMUFGRDYwMEU3QTNBMCAvKiBJbnRsQ2FjaGUuaCAqLywKIAkJCQlBMUI5RTIzMzFCNEUwRDY3
MDBCQzdGRUQgLyogSW50bENvbGxhdG9yLmNwcCAqLywKIAkJCQlBMUI5RTIzNDFCNEUwRDY3MDBC
QzdGRUQgLyogSW50bENvbGxhdG9yLmggKi8sCiAJCQkJQTFCOUUyMzUxQjRFMEQ2NzAwQkM3RkVE
IC8qIEludGxDb2xsYXRvckNvbnN0cnVjdG9yLmNwcCAqLywKQEAgLTk4MjQsNiArOTgyOSw3IEBA
CiAJCQkJNTNGNkJGNkQxQzNGMDYwQTAwRjQxRTVEIC8qIEludGVybmFsRnVuY3Rpb25BbGxvY2F0
aW9uUHJvZmlsZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMTQyOUQ3N0MwRUQyMEQ3MzAwQjg5NjE5
IC8qIEludGVycHJldGVyLmggaW4gSGVhZGVycyAqLywKIAkJCQlFMzlENDVGNTFEMzkwMDU2MDBC
M0IzNzcgLyogSW50ZXJwcmV0ZXJJbmxpbmVzLmggaW4gSGVhZGVycyAqLywKKwkJCQlFMzFDMzEz
MjI1MTFBRkQ3MDBFN0EzQTAgLyogSW50bENhY2hlLmggaW4gSGVhZGVycyAqLywKIAkJCQlBMUI5
RTIzQTFCNEUwRDY3MDBCQzdGRUQgLyogSW50bENvbGxhdG9yLmggaW4gSGVhZGVycyAqLywKIAkJ
CQlBMUI5RTIzQzFCNEUwRDY3MDBCQzdGRUQgLyogSW50bENvbGxhdG9yQ29uc3RydWN0b3IuaCBp
biBIZWFkZXJzICovLAogCQkJCUExODE5M0UzMUI0RTBDREIwMEZDMTAyOSAvKiBJbnRsQ29sbGF0
b3JDb25zdHJ1Y3Rvci5sdXQuaCBpbiBIZWFkZXJzICovLApkaWZmIC0tZ2l0IGEvU291cmNlL0ph
dmFTY3JpcHRDb3JlL1NvdXJjZXMudHh0IGIvU291cmNlL0phdmFTY3JpcHRDb3JlL1NvdXJjZXMu
dHh0CmluZGV4IDQ5YTc2MWYxMmFhNTBjZjE5NDA5NmFhMDI5NGY4YzA5MDZhNzc5OGIuLjZmOGUy
NzE5NzIxMzU1NTEyMzhhN2I4NDcxMWExNTY3NTA5YzMzNDAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9K
YXZhU2NyaXB0Q29yZS9Tb3VyY2VzLnR4dAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvU291
cmNlcy50eHQKQEAgLTgxMCw2ICs4MTAsNyBAQCBydW50aW1lL0luaXRpYWxpemVUaHJlYWRpbmcu
Y3BwCiBydW50aW1lL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbk9iamVjdC5jcHAKIHJ1bnRpbWUv
SW50ZXJuYWxGdW5jdGlvbi5jcHAKIHJ1bnRpbWUvSW50cmluc2ljLmNwcAorcnVudGltZS9JbnRs
Q2FjaGUuY3BwCiBydW50aW1lL0ludGxDb2xsYXRvci5jcHAKIHJ1bnRpbWUvSW50bENvbGxhdG9y
Q29uc3RydWN0b3IuY3BwCiBydW50aW1lL0ludGxDb2xsYXRvclByb3RvdHlwZS5jcHAKZGlmZiAt
LWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0ludGxDYWNoZS5jcHAgYi9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9JbnRsQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjJhNzkx
NWFjNTEwNTYyNmNjZDJkNDg4NDE5ZDczMjI1MDYyMGMwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9JbnRsQ2FjaGUuY3BwCkBAIC0wLDAgKzEsNTQg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW50bENhY2hl
LmgiCisKK25hbWVzcGFjZSBKU0MgeworCitVRGF0ZVRpbWVQYXR0ZXJuR2VuZXJhdG9yKiBJbnRs
Q2FjaGU6OmNhY2hlU2hhcmVkUGF0dGVybkdlbmVyYXRvcihjb25zdCBDU3RyaW5nJiBsb2NhbGUs
IFVFcnJvckNvZGUmIHN0YXR1cykKK3sKKyAgICBhdXRvIGdlbmVyYXRvciA9IHN0ZDo6dW5pcXVl
X3B0cjxVRGF0ZVRpbWVQYXR0ZXJuR2VuZXJhdG9yLCBJQ1VEZWxldGVyPHVkYXRwZ19jbG9zZT4+
KHVkYXRwZ19vcGVuKGxvY2FsZS5kYXRhKCksICZzdGF0dXMpKTsKKyAgICBpZiAoVV9GQUlMVVJF
KHN0YXR1cykpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIG1fY2FjaGVkRGF0ZVRpbWVQ
YXR0ZXJuR2VuZXJhdG9yTG9jYWxlID0gbG9jYWxlOworICAgIG1fY2FjaGVkRGF0ZVRpbWVQYXR0
ZXJuR2VuZXJhdG9yID0gV1RGTW92ZShnZW5lcmF0b3IpOworICAgIHJldHVybiBtX2NhY2hlZERh
dGVUaW1lUGF0dGVybkdlbmVyYXRvci5nZXQoKTsKK30KKworVmVjdG9yPFVDaGFyLCAzMj4gSW50
bENhY2hlOjpnZXRCZXN0RGF0ZVRpbWVQYXR0ZXJuKGNvbnN0IENTdHJpbmcmIGxvY2FsZSwgY29u
c3QgVUNoYXIqIHNrZWxldG9uLCB1bnNpZ25lZCBza2VsZXRvblNpemUsIFVFcnJvckNvZGUmIHN0
YXR1cykKK3sKKyAgICAvLyBBbHdheXMgdXNlIElDVSBkYXRlIGZvcm1hdCBnZW5lcmF0b3IsIHJh
dGhlciB0aGFuIG91ciBvd24gcGF0dGVybiBsaXN0IGFuZCBtYXRjaGVyLgorICAgIGF1dG8gc2hh
cmVkR2VuZXJhdG9yID0gZ2V0U2hhcmVkUGF0dGVybkdlbmVyYXRvcihsb2NhbGUsIHN0YXR1cyk7
CisgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKQorICAgICAgICByZXR1cm4geyB9OworICAgIFZl
Y3RvcjxVQ2hhciwgMzI+IHBhdHRlcm5CdWZmZXI7CisgICAgc3RhdHVzID0gY2FsbEJ1ZmZlclBy
b2R1Y2luZ0Z1bmN0aW9uKHVkYXRwZ19nZXRCZXN0UGF0dGVybldpdGhPcHRpb25zLCBzaGFyZWRH
ZW5lcmF0b3IsIHNrZWxldG9uLCBza2VsZXRvblNpemUsIFVEQVRQR19NQVRDSF9IT1VSX0ZJRUxE
X0xFTkdUSCwgcGF0dGVybkJ1ZmZlcik7CisgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKQorICAg
ICAgICByZXR1cm4geyB9OworICAgIHJldHVybiBwYXR0ZXJuQnVmZmVyOworfQorCit9IC8vIG5h
bWVzcGFjZSBKU0MKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0lu
dGxDYWNoZS5oIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSW50bENhY2hlLmgKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uYjk2NzJmZjUxYTRlMjk5NTM5NTA4YWZhYWNkMDdkMmY5M2NjZGFmOQotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0ludGxDYWNoZS5oCkBA
IC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHVu
aWNvZGUvdWRhdHBnLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8
d3RmL3VuaWNvZGUvaWN1L0lDVUhlbHBlcnMuaD4KKworbmFtZXNwYWNlIEpTQyB7CisKK2NsYXNz
IEludGxDYWNoZSB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoSW50bENhY2hlKTsKKyAgICBX
VEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBJbnRsQ2FjaGUoKSA9IGRlZmF1
bHQ7CisKKyAgICBWZWN0b3I8VUNoYXIsIDMyPiBnZXRCZXN0RGF0ZVRpbWVQYXR0ZXJuKGNvbnN0
IENTdHJpbmcmIGxvY2FsZSwgY29uc3QgVUNoYXIqIHNrZWxldG9uLCB1bnNpZ25lZCBza2VsZXRv
blNpemUsIFVFcnJvckNvZGUmKTsKKworcHJpdmF0ZToKKyAgICBVRGF0ZVRpbWVQYXR0ZXJuR2Vu
ZXJhdG9yKiBnZXRTaGFyZWRQYXR0ZXJuR2VuZXJhdG9yKGNvbnN0IENTdHJpbmcmIGxvY2FsZSwg
VUVycm9yQ29kZSYgc3RhdHVzKQorICAgIHsKKyAgICAgICAgaWYgKG1fY2FjaGVkRGF0ZVRpbWVQ
YXR0ZXJuR2VuZXJhdG9yKSB7CisgICAgICAgICAgICBpZiAobG9jYWxlID09IG1fY2FjaGVkRGF0
ZVRpbWVQYXR0ZXJuR2VuZXJhdG9yTG9jYWxlKQorICAgICAgICAgICAgICAgIHJldHVybiBtX2Nh
Y2hlZERhdGVUaW1lUGF0dGVybkdlbmVyYXRvci5nZXQoKTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gY2FjaGVTaGFyZWRQYXR0ZXJuR2VuZXJhdG9yKGxvY2FsZSwgc3RhdHVzKTsKKyAgICB9
CisKKyAgICBVRGF0ZVRpbWVQYXR0ZXJuR2VuZXJhdG9yKiBjYWNoZVNoYXJlZFBhdHRlcm5HZW5l
cmF0b3IoY29uc3QgQ1N0cmluZyYgbG9jYWxlLCBVRXJyb3JDb2RlJik7CisKKyAgICBzdGQ6OnVu
aXF1ZV9wdHI8VURhdGVUaW1lUGF0dGVybkdlbmVyYXRvciwgSUNVRGVsZXRlcjx1ZGF0cGdfY2xv
c2U+PiBtX2NhY2hlZERhdGVUaW1lUGF0dGVybkdlbmVyYXRvcjsKKyAgICBDU3RyaW5nIG1fY2Fj
aGVkRGF0ZVRpbWVQYXR0ZXJuR2VuZXJhdG9yTG9jYWxlOworfTsKKworfSAvLyBuYW1lc3BhY2Ug
SlNDCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9JbnRsRGF0ZVRp
bWVGb3JtYXQuY3BwIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSW50bERhdGVUaW1l
Rm9ybWF0LmNwcAppbmRleCA3ZjIyYTU1ZDdhN2MzYjhmZWJhZTNhNGQwNDU2ZjhhOGRjYzhlYjYy
Li5mNTFjYjAyZWU4OGQ4NmM5OTdhMjMzMmM1Y2MwZDAxYjQ2NDFiZTFjIDEwMDY0NAotLS0gYS9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9JbnRsRGF0ZVRpbWVGb3JtYXQuY3BwCisrKyBi
L1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0ludGxEYXRlVGltZUZvcm1hdC5jcHAKQEAg
LTI3LDEyICsyNywxMiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkludGxEYXRl
VGltZUZvcm1hdC5oIgogCisjaW5jbHVkZSAiSW50bENhY2hlLmgiCiAjaW5jbHVkZSAiSW50bE9i
amVjdElubGluZXMuaCIKICNpbmNsdWRlICJKU0JvdW5kRnVuY3Rpb24uaCIKICNpbmNsdWRlICJK
U0NJbmxpbmVzLmgiCiAjaW5jbHVkZSAiT2JqZWN0Q29uc3RydWN0b3IuaCIKICNpbmNsdWRlIDx1
bmljb2RlL3VjYWwuaD4KLSNpbmNsdWRlIDx1bmljb2RlL3VkYXRwZy5oPgogI2luY2x1ZGUgPHVu
aWNvZGUvdWVudW0uaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CiAjaW5j
bHVkZSA8d3RmL3VuaWNvZGUvaWN1L0lDVUhlbHBlcnMuaD4KQEAgLTgxNCwxOCArODE0LDYgQEAg
dm9pZCBJbnRsRGF0ZVRpbWVGb3JtYXQ6OmluaXRpYWxpemVEYXRlVGltZUZvcm1hdChKU0dsb2Jh
bE9iamVjdCogZ2xvYmFsT2JqZWN0LAogICAgIG1fdGltZVN0eWxlID0gaW50bE9wdGlvbjxEYXRl
VGltZVN0eWxlPihnbG9iYWxPYmplY3QsIG9wdGlvbnMsIHZtLnByb3BlcnR5TmFtZXMtPnRpbWVT
dHlsZSwgeyB7ICJmdWxsIl9zLCBEYXRlVGltZVN0eWxlOjpGdWxsIH0sIHsgImxvbmciX3MsIERh
dGVUaW1lU3R5bGU6OkxvbmcgfSwgeyAibWVkaXVtIl9zLCBEYXRlVGltZVN0eWxlOjpNZWRpdW0g
fSwgeyAic2hvcnQiX3MsIERhdGVUaW1lU3R5bGU6OlNob3J0IH0gfSwgInRpbWVTdHlsZSBtdXN0
IGJlIFwiZnVsbFwiLCBcImxvbmdcIiwgXCJtZWRpdW1cIiwgb3IgXCJzaG9ydFwiIl9zLCBEYXRl
VGltZVN0eWxlOjpOb25lKTsKICAgICBSRVRVUk5fSUZfRVhDRVBUSU9OKHNjb3BlLCB2b2lkKCkp
OwogCi0KLSAgICBhdXRvIHBhdHRlcm5Gcm9tU2tlbGV0b24gPSBbJl0oY29uc3QgVUNoYXIqIHNr
ZWxldG9uLCB1bnNpZ25lZCBza2VsZXRvblNpemUsIFZlY3RvcjxVQ2hhciwgMzI+JiBwYXR0ZXJu
QnVmZmVyLCBVRXJyb3JDb2RlJiBzdGF0dXMpIHsKLSAgICAgICAgLy8gQWx3YXlzIHVzZSBJQ1Ug
ZGF0ZSBmb3JtYXQgZ2VuZXJhdG9yLCByYXRoZXIgdGhhbiBvdXIgb3duIHBhdHRlcm4gbGlzdCBh
bmQgbWF0Y2hlci4KLSAgICAgICAgYXV0byBnZW5lcmF0b3IgPSBzdGQ6OnVuaXF1ZV9wdHI8VURh
dGVUaW1lUGF0dGVybkdlbmVyYXRvciwgSUNVRGVsZXRlcjx1ZGF0cGdfY2xvc2U+Pih1ZGF0cGdf
b3BlbihkYXRhTG9jYWxlV2l0aEV4dGVuc2lvbnMuZGF0YSgpLCAmc3RhdHVzKSk7Ci0gICAgICAg
IGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBz
dGF0dXMgPSBjYWxsQnVmZmVyUHJvZHVjaW5nRnVuY3Rpb24odWRhdHBnX2dldEJlc3RQYXR0ZXJu
V2l0aE9wdGlvbnMsIGdlbmVyYXRvci5nZXQoKSwgc2tlbGV0b24sIHNrZWxldG9uU2l6ZSwgVURB
VFBHX01BVENIX0hPVVJfRklFTERfTEVOR1RILCBwYXR0ZXJuQnVmZmVyKTsKLSAgICAgICAgaWYg
KFVfRkFJTFVSRShzdGF0dXMpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH07Ci0KICAgICBW
ZWN0b3I8VUNoYXIsIDMyPiBwYXR0ZXJuQnVmZmVyOwogICAgIGlmIChtX2RhdGVTdHlsZSAhPSBE
YXRlVGltZVN0eWxlOjpOb25lIHx8IG1fdGltZVN0eWxlICE9IERhdGVUaW1lU3R5bGU6Ok5vbmUp
IHsKICAgICAgICAgLy8gMzAuIEZvciBlYWNoIHJvdyBpbiBUYWJsZSAxLCBleGNlcHQgdGhlIGhl
YWRlciByb3csIGRvCkBAIC05MDIsOCArODkwLDcgQEAgdm9pZCBJbnRsRGF0ZVRpbWVGb3JtYXQ6
OmluaXRpYWxpemVEYXRlVGltZUZvcm1hdChKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LAog
ICAgICAgICAgICAgICAgIHJlcGxhY2VIb3VyQ3ljbGVJblNrZWxldG9uKHNrZWxldG9uLCBzcGVj
aWZpZWRIb3VyMTIpOwogICAgICAgICAgICAgICAgIGRhdGFMb2dMbklmKEludGxEYXRlVGltZUZv
cm1hdEludGVybmFsOjp2ZXJib3NlLCAicmVwbGFjZWQ6KCIsIFN0cmluZ1ZpZXcoc2tlbGV0b24u
ZGF0YSgpLCBza2VsZXRvbi5zaXplKCkpLCAiKSIpOwogCi0gICAgICAgICAgICAgICAgcGF0dGVy
bkJ1ZmZlci5jbGVhcigpOwotICAgICAgICAgICAgICAgIHBhdHRlcm5Gcm9tU2tlbGV0b24oc2tl
bGV0b24uZGF0YSgpLCBza2VsZXRvbi5zaXplKCksIHBhdHRlcm5CdWZmZXIsIHN0YXR1cyk7Cisg
ICAgICAgICAgICAgICAgcGF0dGVybkJ1ZmZlciA9IHZtLmludGxDYWNoZSgpLmdldEJlc3REYXRl
VGltZVBhdHRlcm4oZGF0YUxvY2FsZVdpdGhFeHRlbnNpb25zLCBza2VsZXRvbi5kYXRhKCksIHNr
ZWxldG9uLnNpemUoKSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICBpZiAoVV9GQUlMVVJFKHN0
YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3dUeXBlRXJyb3IoZ2xvYmFsT2JqZWN0
LCBzY29wZSwgImZhaWxlZCB0byBpbml0aWFsaXplIERhdGVUaW1lRm9ybWF0Il9zKTsKICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtOTEzLDcgKzkwMCw3IEBAIHZvaWQgSW50bERhdGVU
aW1lRm9ybWF0Ojppbml0aWFsaXplRGF0ZVRpbWVGb3JtYXQoSlNHbG9iYWxPYmplY3QqIGdsb2Jh
bE9iamVjdCwKICAgICB9IGVsc2UgewogICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVS
T19FUlJPUjsKICAgICAgICAgU3RyaW5nIHNrZWxldG9uID0gc2tlbGV0b25CdWlsZGVyLnRvU3Ry
aW5nKCk7Ci0gICAgICAgIHBhdHRlcm5Gcm9tU2tlbGV0b24oU3RyaW5nVmlldyhza2VsZXRvbiku
dXBjb252ZXJ0ZWRDaGFyYWN0ZXJzKCkuZ2V0KCksIHNrZWxldG9uLmxlbmd0aCgpLCBwYXR0ZXJu
QnVmZmVyLCBzdGF0dXMpOworICAgICAgICBwYXR0ZXJuQnVmZmVyID0gdm0uaW50bENhY2hlKCku
Z2V0QmVzdERhdGVUaW1lUGF0dGVybihkYXRhTG9jYWxlV2l0aEV4dGVuc2lvbnMsIFN0cmluZ1Zp
ZXcoc2tlbGV0b24pLnVwY29udmVydGVkQ2hhcmFjdGVycygpLmdldCgpLCBza2VsZXRvbi5sZW5n
dGgoKSwgc3RhdHVzKTsKICAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CiAgICAgICAg
ICAgICB0aHJvd1R5cGVFcnJvcihnbG9iYWxPYmplY3QsIHNjb3BlLCAiZmFpbGVkIHRvIGluaXRp
YWxpemUgRGF0ZVRpbWVGb3JtYXQiX3MpOwogICAgICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0
IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVk0uY3BwIGIvU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvVk0uY3BwCmluZGV4IDU5ZTQwYzhlNGNjOTg3ZWY0M2NlNzFhZmRlZGYw
ZTFhMWNlMWU1ZjEuLjk4Nzc2ZmM4Y2U1ZGVkNmZjOGFkZjEwYzM0YTVkOTJlNThkMWI3ZWQgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1ZNLmNwcAorKysgYi9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9WTS5jcHAKQEAgLTY1LDYgKzY1LDcgQEAKICNpbmNs
dWRlICJIZWFwUHJvZmlsZXIuaCIKICNpbmNsdWRlICJIb3N0Q2FsbFJldHVyblZhbHVlLmgiCiAj
aW5jbHVkZSAiSW50ZXJwcmV0ZXIuaCIKKyNpbmNsdWRlICJJbnRsQ2FjaGUuaCIKICNpbmNsdWRl
ICJJbnRsQ29sbGF0b3IuaCIKICNpbmNsdWRlICJJbnRsRGF0ZVRpbWVGb3JtYXQuaCIKICNpbmNs
dWRlICJJbnRsRGlzcGxheU5hbWVzLmgiCkBAIC0zOTgsNiArMzk5LDcgQEAgVk06OlZNKFZNVHlw
ZSB2bVR5cGUsIEhlYXBUeXBlIGhlYXBUeXBlLCBXVEY6OlJ1bkxvb3AqIHJ1bkxvb3AsIGJvb2wq
IHN1Y2Nlc3MpCiAjZW5kaWYKICAgICAsIG1fc3RhY2tQb2ludGVyQXRWTUVudHJ5KG51bGxwdHIp
CiAgICAgLCBtX2NvZGVDYWNoZShtYWtlVW5pcXVlPENvZGVDYWNoZT4oKSkKKyAgICAsIG1faW50
bENhY2hlKG1ha2VVbmlxdWU8SW50bENhY2hlPigpKQogICAgICwgbV9idWlsdGluRXhlY3V0YWJs
ZXMobWFrZVVuaXF1ZTxCdWlsdGluRXhlY3V0YWJsZXM+KCp0aGlzKSkKICAgICAsIG1fdHlwZVBy
b2ZpbGVyRW5hYmxlZENvdW50KDApCiAgICAgLCBtX3ByaW1pdGl2ZUdpZ2FjYWdlRW5hYmxlZChJ
c1dhdGNoZWQpCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9WTS5o
IGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVk0uaAppbmRleCAwZjM4MjFmYjEyNzRm
ODQ0YjhmNzAzNDJhZTFiMjc2ODFmMzYyOTM5Li5kMzhhZmEyYmI3YmJmNWZhY2YxZjExMmZkZWNl
MjVhOTIzOGQ4Y2I5IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9W
TS5oCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1ZNLmgKQEAgLTEyNCw2ICsx
MjQsNyBAQCBjbGFzcyBIYXNPd25Qcm9wZXJ0eUNhY2hlOwogY2xhc3MgSGVhcFByb2ZpbGVyOwog
Y2xhc3MgSWRlbnRpZmllcjsKIGNsYXNzIEludGVycHJldGVyOworY2xhc3MgSW50bENhY2hlOwog
Y2xhc3MgSW50bENvbGxhdG9yOwogY2xhc3MgSW50bERhdGVUaW1lRm9ybWF0OwogY2xhc3MgSW50
bERpc3BsYXlOYW1lczsKQEAgLTEwMjIsNiArMTAyMyw3IEBAIGNsYXNzIFZNIDogcHVibGljIFRo
cmVhZFNhZmVSZWZDb3VudGVkPFZNPiwgcHVibGljIERvdWJseUxpbmtlZExpc3ROb2RlPFZNPiB7
CiAKICAgICBKU0xvY2smIGFwaUxvY2soKSB7IHJldHVybiAqbV9hcGlMb2NrOyB9CiAgICAgQ29k
ZUNhY2hlKiBjb2RlQ2FjaGUoKSB7IHJldHVybiBtX2NvZGVDYWNoZS5nZXQoKTsgfQorICAgIElu
dGxDYWNoZSYgaW50bENhY2hlKCkgeyByZXR1cm4gKm1faW50bENhY2hlOyB9CiAKICAgICBKU19F
WFBPUlRfUFJJVkFURSB2b2lkIHdoZW5JZGxlKEZ1bmN0aW9uPHZvaWQoKT4mJik7CiAKQEAgLTEy
MDgsNiArMTIxMCw3IEBAIGNsYXNzIFZNIDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPFZN
PiwgcHVibGljIERvdWJseUxpbmtlZExpc3ROb2RlPFZNPiB7CiAgICAgYm9vbCBtX2dsb2JhbENv
bnN0UmVkZWNsYXJhdGlvblNob3VsZFRocm93IHsgdHJ1ZSB9OwogICAgIGJvb2wgbV9zaG91bGRC
dWlsZFBDVG9Db2RlT3JpZ2luTWFwcGluZyB7IGZhbHNlIH07CiAgICAgc3RkOjp1bmlxdWVfcHRy
PENvZGVDYWNoZT4gbV9jb2RlQ2FjaGU7CisgICAgc3RkOjp1bmlxdWVfcHRyPEludGxDYWNoZT4g
bV9pbnRsQ2FjaGU7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEJ1aWx0aW5FeGVjdXRhYmxlcz4gbV9i
dWlsdGluRXhlY3V0YWJsZXM7CiAgICAgSGFzaE1hcDxSZWZQdHI8VW5pcXVlZFN0cmluZ0ltcGw+
LCBSZWZQdHI8V2F0Y2hwb2ludFNldD4+IG1faW1wdXJlUHJvcGVydHlXYXRjaHBvaW50U2V0czsK
ICAgICBzdGQ6OnVuaXF1ZV9wdHI8VHlwZVByb2ZpbGVyPiBtX3R5cGVQcm9maWxlcjsKZGlmZiAt
LWdpdCBhL0pTVGVzdHMvQ2hhbmdlTG9nIGIvSlNUZXN0cy9DaGFuZ2VMb2cKaW5kZXggNDk5OTVj
YzkxMWVjODRlOGVjYzVhY2E4ZTIyNDU2NmNjNmFhZWNhYS4uMjEzMGY5NzA4OTY3YWVmOWQ4Y2I0
ZmI0MDgwOTI5MDUxZTAwYjQyOSAxMDA2NDQKLS0tIGEvSlNUZXN0cy9DaGFuZ2VMb2cKKysrIGIv
SlNUZXN0cy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNCBAQAorMjAyMC0wOS0xNSAgWXVzdWtlIFN1
enVraSAgPHlzdXp1a2lAYXBwbGUuY29tPgorCisgICAgICAgIFtKU0NdIENhY2hlIFVEYXRlVGlt
ZVBhdHRlcm5HZW5lcmF0b3IKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIxMzQ1NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgICogbWljcm9iZW5jaG1hcmtzL2RhdGUtdG8tbG9jYWxlLWRhdGUtc3RyaW5nLmpz
OiBBZGRlZC4KKyAgICAgICAgKiBtaWNyb2JlbmNobWFya3MvZGF0ZS10by1sb2NhbGUtc3RyaW5n
LmpzOiBBZGRlZC4KKyAgICAgICAgKiBtaWNyb2JlbmNobWFya3MvZGF0ZS10by1sb2NhbGUtdGlt
ZS1zdHJpbmcuanM6IEFkZGVkLgorCiAyMDIwLTA5LTE1ICBIeWVvY2tKaW4gS2ltICA8a2hlcm9v
dHpAZ21haWwuY29tPgogCiAgICAgICAgIENoZWNrIHdoZXRoZXIgdGhlIGl0ZXJhdG9yIGlzIGNh
bGxhYmxlIGluIHNwcmVhZApkaWZmIC0tZ2l0IGEvSlNUZXN0cy9taWNyb2JlbmNobWFya3MvZGF0
ZS10by1sb2NhbGUtZGF0ZS1zdHJpbmcuanMgYi9KU1Rlc3RzL21pY3JvYmVuY2htYXJrcy9kYXRl
LXRvLWxvY2FsZS1kYXRlLXN0cmluZy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yMTQ0MDRmNmU0MDI4YmI0ZGNj
ZjY4OWRkOGI2NzIyNTJmNWZiY2EyCi0tLSAvZGV2L251bGwKKysrIGIvSlNUZXN0cy9taWNyb2Jl
bmNobWFya3MvZGF0ZS10by1sb2NhbGUtZGF0ZS1zdHJpbmcuanMKQEAgLTAsMCArMSwyIEBACitm
b3IgKHZhciBpID0gMDsgaSA8IDFlMzsgKytpKQorICAgIG5ldyBEYXRlKCkudG9Mb2NhbGVEYXRl
U3RyaW5nKCk7CmRpZmYgLS1naXQgYS9KU1Rlc3RzL21pY3JvYmVuY2htYXJrcy9kYXRlLXRvLWxv
Y2FsZS1zdHJpbmcuanMgYi9KU1Rlc3RzL21pY3JvYmVuY2htYXJrcy9kYXRlLXRvLWxvY2FsZS1z
dHJpbmcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uOTQ4Zjk0M2Y5YzIzMzlhZjc1MmVkZTVjN2E3ZTE3ZTQyOWIx
OGQyMgotLS0gL2Rldi9udWxsCisrKyBiL0pTVGVzdHMvbWljcm9iZW5jaG1hcmtzL2RhdGUtdG8t
bG9jYWxlLXN0cmluZy5qcwpAQCAtMCwwICsxLDIgQEAKK2ZvciAodmFyIGkgPSAwOyBpIDwgMWUz
OyArK2kpCisgICAgbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpOwpkaWZmIC0tZ2l0IGEvSlNU
ZXN0cy9taWNyb2JlbmNobWFya3MvZGF0ZS10by1sb2NhbGUtdGltZS1zdHJpbmcuanMgYi9KU1Rl
c3RzL21pY3JvYmVuY2htYXJrcy9kYXRlLXRvLWxvY2FsZS10aW1lLXN0cmluZy5qcwpuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi5iNWZlOTdlNDI3YTcxMTQwYzQxMDQ3OTI0MGRhMDZhOGQ2Mzk0ZjM4Ci0tLSAvZGV2L251
bGwKKysrIGIvSlNUZXN0cy9taWNyb2JlbmNobWFya3MvZGF0ZS10by1sb2NhbGUtdGltZS1zdHJp
bmcuanMKQEAgLTAsMCArMSwyIEBACitmb3IgKHZhciBpID0gMDsgaSA8IDFlMzsgKytpKQorICAg
IG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCk7Cg==
</data>
<flag name="review"
          id="424410"
          type_id="1"
          status="+"
          setter="ross.kirsling"
    />
          </attachment>
      

    </bug>

</bugzilla>