Select Page
Lnmp+pagespeed+brotli+redis,让你的WordPress飞起来!

Lnmp+pagespeed+brotli+redis,让你的WordPress飞起来!

从零开始架构一个全新的外贸网站,使用Ubuntu 18.04+LNMP1.6军哥包。

搭建好网站后再添加brotli+redis。

并弃用AVADA,使用新主题DIVI。

目录:

1.安装LNMP1.6

2.配置Wordpress

3.安装brotli+redis

1.安装LNMP1.6

首先到Linode新建一个VPS。然后Xshell链接。

开始进行搭建;

链接Xshell 后,输入:

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”nginx” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”c3VkbyBhcHQtZ2V0IC1xeSB1cGRhdGUKc3VkbyBhcHQtZ2V0IC1xeSB1cGdyYWRlCnN1ZG8gYXB0IC15IGF1dG9yZW1vdmU=” title=”#更新套件库” header_font=”Georgia|700|||||||” usetabwidth=”on”]c3VkbyBhcHQtZ2V0IC1xeSB1cGRhdGUKc3VkbyBhcHQtZ2V0IC1xeSB1cGdyYWRlCnN1ZG8gYXB0IC15IGF1dG9yZW1vdmU=[/et_pb_dmb_code_snippet]

让 Ubuntu 的安装套件库更新到最新。这里可能要花一点时间进行,所以要稍微等一下下。
接着输入:

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”nginx” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”d2dldCBodHRwOi8vc29mdC52cHNlci5uZXQvbG5tcC9sbm1wMS42LnRhci5neiAtY08gbG5tcDEuNi50YXIuZ3ogJiYgdGFyIHp4ZiBsbm1wMS42LnRhci5neiAmJiBjZCBsbm1wMS42ICYmIC4vaW5zdGFsbC5zaCBsbm1w” title=”#lnmp1.6安装lnmp包” header_font=”Georgia|700|||||||” usetabwidth=”on” custom_padding=”||3px|||”]d2dldCBodHRwOi8vc29mdC52cHNlci5uZXQvbG5tcC9sbm1wMS42LnRhci5neiAtY08gbG5tcDEuNi50YXIuZ3ogJiYgdGFyIHp4ZiBsbm1wMS42LnRhci5neiAmJiBjZCBsbm1wMS42ICYmIC4vaW5zdGFsbC5zaCBsbm1w[/et_pb_dmb_code_snippet]

后面的安装步骤我就省略了,大家可以参考我之前的文章:Linode VPS+LNMP1.6+WordPress搭建外贸网站
里面已经很详细地介绍安装步骤到主题的安装。

2.配置Wordpress

WordPress的搭建和SSL的配置上面已经做了。

现在配置WordPress是为了DIVI主题而配置。

DIVI的配置并没有AVADA那么复杂,修改的东西也没那么多。

我们先安装DIVI主题及DIVI 子主题。

DIVI主题默认是开启加载Google 的字体“OpenSan”,如果你并不是使用此字体你必须在子主题的function中禁用他。

当然,如果你默认就是用OpenSan字体的 可以无视这个操作。

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”php” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”LyogVHJhbnNsYXRvcnM6IElmIHRoZXJlIGFyZSBjaGFyYWN0ZXJzIGluIHlvdXIgbGFuZ3VhZ2UgdGhhdCBhcmUgbm90ICogc3VwcG9ydGVkIGJ5IE9wZW4gU2FucywgdHJhbnNsYXRlIHRoaXMgdG8g4oCYb2Zm4oCZLiBEbyBub3QgdHJhbnNsYXRlICogaW50byB5b3VyIG93biBsYW5ndWFnZS4gKi8KCiRvcGVuX3NhbnMgPSBfeCgg4oCYb2Zm4oCZLCDigJhPcGVuIFNhbnMgZm9udDogb24gb3Igb2Zm4oCZLCDigJhEaXZp4oCZICk7CmlmICgg4oCYb2Zm4oCZICE9PSAkb3Blbl9zYW5zICkKeyAkZm9udF9mYW1pbGllcyA9IGFycmF5KCk7CmlmICgg4oCYb2Zm4oCZICE9PSAkb3Blbl9zYW5zICkKJGZvbnRfZmFtaWxpZXNbXSA9IOKAmE9wZW4rU2FuczozMDBpdGFsaWMsNDAwaXRhbGljLDYwMGl0YWxpYyw3MDBpdGFsaWMsODAwaXRhbGljLDQwMCwzMDAsNjAwLDcwMCw4MDDigJk7CiRwcm90b2NvbCA9IGlzX3NzbCgpID8g4oCYaHR0cHPigJkgOiDigJhodHRw4oCZOwokcXVlcnlfYXJncyA9IGFycmF5KCDigJhmYW1pbHnigJkgPT4gaW1wbG9kZSgg4oCYJTdD4oCZLCAkZm9udF9mYW1pbGllcyApLCDigJhzdWJzZXTigJkgPT4g4oCYbGF0aW4sbGF0aW4tZXh04oCZLCApOwokZm9udHNfdXJsID0gYWRkX3F1ZXJ5X2FyZyggJHF1ZXJ5X2FyZ3MsIOKAnCRwcm90b2NvbDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzc+KAnSApOyB9CnJldHVybiAkZm9udHNfdXJsOw==” title=”#禁用OpenSan” header_font=”Georgia|700|||||||” usetabwidth=”on”]LyogVHJhbnNsYXRvcnM6IElmIHRoZXJlIGFyZSBjaGFyYWN0ZXJzIGluIHlvdXIgbGFuZ3VhZ2UgdGhhdCBhcmUgbm90ICogc3VwcG9ydGVkIGJ5IE9wZW4gU2FucywgdHJhbnNsYXRlIHRoaXMgdG8g4oCYb2Zm4oCZLiBEbyBub3QgdHJhbnNsYXRlICogaW50byB5b3VyIG93biBsYW5ndWFnZS4gKi8KCiRvcGVuX3NhbnMgPSBfeCgg4oCYb2Zm4oCZLCDigJhPcGVuIFNhbnMgZm9udDogb24gb3Igb2Zm4oCZLCDigJhEaXZp4oCZICk7CmlmICgg4oCYb2Zm4oCZICE9PSAkb3Blbl9zYW5zICkKeyAkZm9udF9mYW1pbGllcyA9IGFycmF5KCk7CmlmICgg4oCYb2Zm4oCZICE9PSAkb3Blbl9zYW5zICkKJGZvbnRfZmFtaWxpZXNbXSA9IOKAmE9wZW4rU2FuczozMDBpdGFsaWMsNDAwaXRhbGljLDYwMGl0YWxpYyw3MDBpdGFsaWMsODAwaXRhbGljLDQwMCwzMDAsNjAwLDcwMCw4MDDigJk7CiRwcm90b2NvbCA9IGlzX3NzbCgpID8g4oCYaHR0cHPigJkgOiDigJhodHRw4oCZOwokcXVlcnlfYXJncyA9IGFycmF5KCDigJhmYW1pbHnigJkgPT4gaW1wbG9kZSgg4oCYJTdD4oCZLCAkZm9udF9mYW1pbGllcyApLCDigJhzdWJzZXTigJkgPT4g4oCYbGF0aW4sbGF0aW4tZXh04oCZLCApOwokZm9udHNfdXJsID0gYWRkX3F1ZXJ5X2FyZyggJHF1ZXJ5X2FyZ3MsIOKAnCRwcm90b2NvbDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzc+KAnSApOyB9CnJldHVybiAkZm9udHNfdXJsOw==[/et_pb_dmb_code_snippet]

3.安装brotli+redis

3-1 安装Nginx Brotli

由谷歌开源的 Brotli 压缩算法不知道大家听过没有?现代网站大多用的压缩算法都是 gzip,它也是非常有效的一种压缩算法,可以节省网站服务器和用户之间传输数据所需要花费的时间(毕竟是压缩传送的,这么说大家应该都能懂,不懂就想想你下载原文件和下载压缩包的区别),但是这个 Brotli,据闻能比 gzip 做得更好——不仅能获得更高的压缩比率,而且对压缩/解压速度影响也比较小。

有关这个压缩算法的说明,我就不详细说了,毕竟本文主要是针对那些已经知道或了解 Brotli 却又不知道怎么启用的人来写的。如果你还不是很了解,也可以去谷歌的 GitHub 了解一下:https://github.com/google/brotli

一、下载 Nginx Brotli 源码
在下载之前,我要先跟大家提一下,源码下载地址我这里可以分享给大家两个:

  1. 谷歌官方的,源码已经很久没更新了,但是能用:https://github.com/google/ngx_brotli.git
  2. 网友 Fork 自谷歌官方的源码之后弄的,比较新,仍在更新中,也能用:https://github.com/eustas/ngx_brotli.git

具体选哪个你们自己判断吧,反正都是能用的~

下面开始说具体怎么做了,这里只说一遍,所有操作都是要你在 SSH 命令行下进行的,最好是用 Root 用户,不会出现权限之类的问题,否则自己记得适时使用 sudo 命令。

在 SSH 上找一个你想存放 Brotli 源码的目录并进入,比如 /usr/local:

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”nginx” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”Y2QgL3Vzci9sb2NhbApnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2V1c3Rhcy9uZ3hfYnJvdGxpLmdpdAoj5aaC5p6c5o+Q56S65rKh5pyJIGdpdCDlkb3ku6TnmoTor53vvIzlhYjljrvlronoo4XkuIDkuKrvvIzov5nph4zlsLHlj6ror7QgRGViaWFuL1VidW50dSDnmoTlronoo4Xmlrnms5XkuobvvJoKYXB0LWdldCB1cGRhdGUKYXB0LWdldCBpbnN0YWxsIGdpdA==” title=”#使用 Git Clone 命令下载源码,源码地址自己选上面那两个的其中一个” header_font=”Georgia|700|||||||” usetabwidth=”on”]Y2QgL3Vzci9sb2NhbApnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2V1c3Rhcy9uZ3hfYnJvdGxpLmdpdAoj5aaC5p6c5o+Q56S65rKh5pyJIGdpdCDlkb3ku6TnmoTor53vvIzlhYjljrvlronoo4XkuIDkuKrvvIzov5nph4zlsLHlj6ror7QgRGViaWFuL1VidW50dSDnmoTlronoo4Xmlrnms5XkuobvvJoKYXB0LWdldCB1cGRhdGUKYXB0LWdldCBpbnN0YWxsIGdpdA==[/et_pb_dmb_code_snippet][et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”nginx” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”Y2Qgbmd4X2Jyb3RsaQpnaXQgc3VibW9kdWxlIHVwZGF0ZSAtLWluaXQgLS1yZWN1cnNpdmU=” title=”#下载完之后什么也别动,直接执行下面的命令,本部分结束:” header_font=”Georgia|700|||||||” usetabwidth=”on”]Y2Qgbmd4X2Jyb3RsaQpnaXQgc3VibW9kdWxlIHVwZGF0ZSAtLWluaXQgLS1yZWN1cnNpdmU=[/et_pb_dmb_code_snippet]

军哥包nginx编译的比较简单,直接编辑 LNMP 安装目录下的 lnmp.conf 文件(默认的话应该位于/root/lnmp1.6 这个目录):

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”nginx” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”dmkgL3Jvb3QvbG5tcDEuNi9sbm1wLmNvbmY=” header_font=”Georgia|700|||||||” usetabwidth=”on”]dmkgL3Jvb3QvbG5tcDEuNi9sbm1wLmNvbmY=[/et_pb_dmb_code_snippet]

按 i 开启编辑模式,在如下位置加上–add-module=/usr/local/ngx_brotli 这个编译参数,再提醒一下,/usr/local/ngx_brotli 这个目录请写自己下载保存 Brotli 源码的目录:

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”nginx” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”TmdpbnhfTW9kdWxlc19PcHRpb25zPeKAmC0tYWRkLW1vZHVsZT0vdXNyL2xvY2FsL25neF9icm90bGnigJk=” header_font=”Georgia|700|||||||” usetabwidth=”on”]TmdpbnhfTW9kdWxlc19PcHRpb25zPeKAmC0tYWRkLW1vZHVsZT0vdXNyL2xvY2FsL25neF9icm90bGnigJk=[/et_pb_dmb_code_snippet]

按 ESC 退出编辑状态,:wq 保存并退出。然后用 LNMP 自带的脚本升级一下 Nginx,这里我们可以选择同版本 Nginx 不升级,也可以真的升级,没什么差别,我们只是借用升级脚本重新编译一下 Nginx 而已:

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”nginx” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”Y2QgL3Jvb3QvbG5tcDEuNgouL3VwZ3JhZGUuc2ggbmdpbng=” header_font=”Georgia|700|||||||” usetabwidth=”on”]Y2QgL3Jvb3QvbG5tcDEuNgouL3VwZ3JhZGUuc2ggbmdpbng=[/et_pb_dmb_code_snippet]

注意:上面那个命令里的目录路径请根据你自己安装 LNMP 位置的路径来写,如果你的 LNMP 不是安装在 Root 目录下,路径是会不同的,总之就是找到你 LNMP 安装目录下的那个 upgrade.sh 升级脚本就对了。

升级脚本执行完成之后,就是编译完成了,此时你的 Nginx 已经加入了 Brotli 模块,用 Nginx -V 这个命令可以看到。

配置xxx.com.conf

所有的东西安装完毕然后开始配置网站的conf文件:

文件位置在/usr/local/nginx/conf/vhost。 你最好把他下载到桌面编辑。

你可以直接复制我的配置,对应修改一下自己的网站名称。

配置文件写好并上传后,输入:

lnmp restart.

3-2 安装Redis

Lnmp军哥包安装redis就简单很多。Redis是一个开源、支持网络、基于内存、键值对存储数据库。

入lnmp解压后的目录: 

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”nginx” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”Y2QgL3Jvb3QvbG5tcDEuNi8KLi9hZGRvbnMuc2ggaW5zdGFsbCByZWRpcwoj54S25ZCO5LiA55u054K55Zue6L2m77yM55u05Yiw56iL5bqP6L+Q6KGM57uT5p2fCiPnu5PmnZ/lkI7kvaDopoHkv67mlLnkuIDkuItyZWRpcy5jb25m5paH5Lu277yaCm5hbm8gL3Vzci9sb2NhbC9yZWRpcy9ldGMvcmVkaXMuY29uZg==” header_font=”Georgia|700|||||||” usetabwidth=”on”]Y2QgL3Jvb3QvbG5tcDEuNi8KLi9hZGRvbnMuc2ggaW5zdGFsbCByZWRpcwoj54S25ZCO5LiA55u054K55Zue6L2m77yM55u05Yiw56iL5bqP6L+Q6KGM57uT5p2fCiPnu5PmnZ/lkI7kvaDopoHkv67mlLnkuIDkuItyZWRpcy5jb25m5paH5Lu277yaCm5hbm8gL3Vzci9sb2NhbC9yZWRpcy9ldGMvcmVkaXMuY29uZg==[/et_pb_dmb_code_snippet]

逐一修改:(可以用Ctrl+W搜索功能)

找到「daemonize no」,改成。
指令或程式码
daemonize yes
代表要啟用 pid 檔案。

找到「supervised no」,改成。
指令或程式码
supervised systemd
代表要在系统开机时同时开启 Redis。

找到「dir ./」,改成。
指令或程式码
dir /var/lib/redis
代表资料库快取要写在这边。

找到「# maxmemory 」,改成。
指令或程式码
maxmemory 60M
在 WordPress 当中,如果你使用了 20 到 30 个外挂的话,其实快取也不太可能超过 60MB 的大小。

接着找到「# maxmemory-policy noeviction」,改成。
指令或程式码
maxmemory-policy allkeys-lru
Change the policy to allkeys-lru which forces redis-server to delete old cache (least recently used objects) when the Redis server starts to run out of memory

然后找到「stop-writes-on-bgsave-error yes」,改成。
指令或程式码
stop-writes-on-bgsave-error no

最后请为 Redis 设定一个密码。避免 Redis 被不知道的人使用,需要透过密码这关才能够使用。找到「# requirepass foobared」之后,改成。
指令或程式码
requirepass [一组 Redis 专用的密码]

另外在 Redis 当中,有一些指令可能会损坏你的资料库,甚至是让你的资料库消失。所以我们要透过设定档案把这些指令给关闭。
找到「# save “”」的下方,输入以下内容。

指令或程式码
rename-command FLUSHDB “”
rename-command FLUSHALL “”
rename-command DEBUG “”
rename-command CONFIG “”

编辑完成后请按「Control」+「X」,按「Y」,再按「Enter」完成编辑。

这文件里面有一个redis.conf文件。你最好把它下载下来。然后按照我下面的配置,直接覆盖:

 

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”php” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”IyBSZWRpcyBjb25maWd1cmF0aW9uIGZpbGUgZXhhbXBsZS4KIwojIE5vdGUgdGhhdCBpbiBvcmRlciB0byByZWFkIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsIFJlZGlzIG11c3QgYmUKIyBzdGFydGVkIHdpdGggdGhlIGZpbGUgcGF0aCBhcyBmaXJzdCBhcmd1bWVudDoKIwojIC4vcmVkaXMtc2VydmVyIC9wYXRoL3RvL3JlZGlzLmNvbmYKCiMgTm90ZSBvbiB1bml0czogd2hlbiBtZW1vcnkgc2l6ZSBpcyBuZWVkZWQsIGl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkKIyBpdCBpbiB0aGUgdXN1YWwgZm9ybSBvZiAxayA1R0IgNE0gYW5kIHNvIGZvcnRoOgojCiMgMWsgPT4gMTAwMCBieXRlcwojIDFrYiA9PiAxMDI0IGJ5dGVzCiMgMW0gPT4gMTAwMDAwMCBieXRlcwojIDFtYiA9PiAxMDI0KjEwMjQgYnl0ZXMKIyAxZyA9PiAxMDAwMDAwMDAwIGJ5dGVzCiMgMWdiID0+IDEwMjQqMTAyNCoxMDI0IGJ5dGVzCiMKIyB1bml0cyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSBzbyAxR0IgMUdiIDFnQiBhcmUgYWxsIHRoZSBzYW1lLgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBJTkNMVURFUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBJbmNsdWRlIG9uZSBvciBtb3JlIG90aGVyIGNvbmZpZyBmaWxlcyBoZXJlLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91CiMgaGF2ZSBhIHN0YW5kYXJkIHRlbXBsYXRlIHRoYXQgZ29lcyB0byBhbGwgUmVkaXMgc2VydmVycyBidXQgYWxzbyBuZWVkCiMgdG8gY3VzdG9taXplIGEgZmV3IHBlci1zZXJ2ZXIgc2V0dGluZ3MuICBJbmNsdWRlIGZpbGVzIGNhbiBpbmNsdWRlCiMgb3RoZXIgZmlsZXMsIHNvIHVzZSB0aGlzIHdpc2VseS4KIwojIE5vdGljZSBvcHRpb24gImluY2x1ZGUiIHdvbid0IGJlIHJld3JpdHRlbiBieSBjb21tYW5kICJDT05GSUcgUkVXUklURSIKIyBmcm9tIGFkbWluIG9yIFJlZGlzIFNlbnRpbmVsLiBTaW5jZSBSZWRpcyBhbHdheXMgdXNlcyB0aGUgbGFzdCBwcm9jZXNzZWQKIyBsaW5lIGFzIHZhbHVlIG9mIGEgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUsIHlvdSdkIGJldHRlciBwdXQgaW5jbHVkZXMKIyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZmlsZSB0byBhdm9pZCBvdmVyd3JpdGluZyBjb25maWcgY2hhbmdlIGF0IHJ1bnRpbWUuCiMKIyBJZiBpbnN0ZWFkIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB1c2luZyBpbmNsdWRlcyB0byBvdmVycmlkZSBjb25maWd1cmF0aW9uCiMgb3B0aW9ucywgaXQgaXMgYmV0dGVyIHRvIHVzZSBpbmNsdWRlIGFzIHRoZSBsYXN0IGxpbmUuCiMKIyBpbmNsdWRlIC9wYXRoL3RvL2xvY2FsLmNvbmYKIyBpbmNsdWRlIC9wYXRoL3RvL290aGVyLmNvbmYKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTU9EVUxFUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIExvYWQgbW9kdWxlcyBhdCBzdGFydHVwLiBJZiB0aGUgc2VydmVyIGlzIG5vdCBhYmxlIHRvIGxvYWQgbW9kdWxlcwojIGl0IHdpbGwgYWJvcnQuIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBtdWx0aXBsZSBsb2FkbW9kdWxlIGRpcmVjdGl2ZXMuCiMKIyBsb2FkbW9kdWxlIC9wYXRoL3RvL215X21vZHVsZS5zbwojIGxvYWRtb2R1bGUgL3BhdGgvdG8vb3RoZXJfbW9kdWxlLnNvCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5FVFdPUksgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBCeSBkZWZhdWx0LCBpZiBubyAiYmluZCIgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgaXMgc3BlY2lmaWVkLCBSZWRpcyBsaXN0ZW5zCiMgZm9yIGNvbm5lY3Rpb25zIGZyb20gYWxsIHRoZSBuZXR3b3JrIGludGVyZmFjZXMgYXZhaWxhYmxlIG9uIHRoZSBzZXJ2ZXIuCiMgSXQgaXMgcG9zc2libGUgdG8gbGlzdGVuIHRvIGp1c3Qgb25lIG9yIG11bHRpcGxlIHNlbGVjdGVkIGludGVyZmFjZXMgdXNpbmcKIyB0aGUgImJpbmQiIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBJUCBhZGRyZXNzZXMuCiMKIyBFeGFtcGxlczoKIwojIGJpbmQgMTkyLjE2OC4xLjEwMCAxMC4wLjAuMQojIGJpbmQgMTI3LjAuMC4xIDo6MQojCiMgfn5+IFdBUk5JTkcgfn5+IElmIHRoZSBjb21wdXRlciBydW5uaW5nIFJlZGlzIGlzIGRpcmVjdGx5IGV4cG9zZWQgdG8gdGhlCiMgaW50ZXJuZXQsIGJpbmRpbmcgdG8gYWxsIHRoZSBpbnRlcmZhY2VzIGlzIGRhbmdlcm91cyBhbmQgd2lsbCBleHBvc2UgdGhlCiMgaW5zdGFuY2UgdG8gZXZlcnlib2R5IG9uIHRoZSBpbnRlcm5ldC4gU28gYnkgZGVmYXVsdCB3ZSB1bmNvbW1lbnQgdGhlCiMgZm9sbG93aW5nIGJpbmQgZGlyZWN0aXZlLCB0aGF0IHdpbGwgZm9yY2UgUmVkaXMgdG8gbGlzdGVuIG9ubHkgaW50bwojIHRoZSBJUHY0IGxvb3BiYWNrIGludGVyZmFjZSBhZGRyZXNzICh0aGlzIG1lYW5zIFJlZGlzIHdpbGwgYmUgYWJsZSB0bwojIGFjY2VwdCBjb25uZWN0aW9ucyBvbmx5IGZyb20gY2xpZW50cyBydW5uaW5nIGludG8gdGhlIHNhbWUgY29tcHV0ZXIgaXQKIyBpcyBydW5uaW5nKS4KIwojIElGIFlPVSBBUkUgU1VSRSBZT1UgV0FOVCBZT1VSIElOU1RBTkNFIFRPIExJU1RFTiBUTyBBTEwgVEhFIElOVEVSRkFDRVMKIyBKVVNUIENPTU1FTlQgVEhFIEZPTExPV0lORyBMSU5FLgojIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpiaW5kIDEyNy4wLjAuMQoKIyBQcm90ZWN0ZWQgbW9kZSBpcyBhIGxheWVyIG9mIHNlY3VyaXR5IHByb3RlY3Rpb24sIGluIG9yZGVyIHRvIGF2b2lkIHRoYXQKIyBSZWRpcyBpbnN0YW5jZXMgbGVmdCBvcGVuIG9uIHRoZSBpbnRlcm5ldCBhcmUgYWNjZXNzZWQgYW5kIGV4cGxvaXRlZC4KIwojIFdoZW4gcHJvdGVjdGVkIG1vZGUgaXMgb24gYW5kIGlmOgojCiMgMSkgVGhlIHNlcnZlciBpcyBub3QgYmluZGluZyBleHBsaWNpdGx5IHRvIGEgc2V0IG9mIGFkZHJlc3NlcyB1c2luZyB0aGUKIyAgICAiYmluZCIgZGlyZWN0aXZlLgojIDIpIE5vIHBhc3N3b3JkIGlzIGNvbmZpZ3VyZWQuCiMKIyBUaGUgc2VydmVyIG9ubHkgYWNjZXB0cyBjb25uZWN0aW9ucyBmcm9tIGNsaWVudHMgY29ubmVjdGluZyBmcm9tIHRoZQojIElQdjQgYW5kIElQdjYgbG9vcGJhY2sgYWRkcmVzc2VzIDEyNy4wLjAuMSBhbmQgOjoxLCBhbmQgZnJvbSBVbml4IGRvbWFpbgojIHNvY2tldHMuCiMKIyBCeSBkZWZhdWx0IHByb3RlY3RlZCBtb2RlIGlzIGVuYWJsZWQuIFlvdSBzaG91bGQgZGlzYWJsZSBpdCBvbmx5IGlmCiMgeW91IGFyZSBzdXJlIHlvdSB3YW50IGNsaWVudHMgZnJvbSBvdGhlciBob3N0cyB0byBjb25uZWN0IHRvIFJlZGlzCiMgZXZlbiBpZiBubyBhdXRoZW50aWNhdGlvbiBpcyBjb25maWd1cmVkLCBub3IgYSBzcGVjaWZpYyBzZXQgb2YgaW50ZXJmYWNlcwojIGFyZSBleHBsaWNpdGx5IGxpc3RlZCB1c2luZyB0aGUgImJpbmQiIGRpcmVjdGl2ZS4KcHJvdGVjdGVkLW1vZGUgeWVzCgojIEFjY2VwdCBjb25uZWN0aW9ucyBvbiB0aGUgc3BlY2lmaWVkIHBvcnQsIGRlZmF1bHQgaXMgNjM3OSAoSUFOQSAjODE1MzQ0KS4KIyBJZiBwb3J0IDAgaXMgc3BlY2lmaWVkIFJlZGlzIHdpbGwgbm90IGxpc3RlbiBvbiBhIFRDUCBzb2NrZXQuCnBvcnQgNjM3OQoKIyBUQ1AgbGlzdGVuKCkgYmFja2xvZy4KIwojIEluIGhpZ2ggcmVxdWVzdHMtcGVyLXNlY29uZCBlbnZpcm9ubWVudHMgeW91IG5lZWQgYW4gaGlnaCBiYWNrbG9nIGluIG9yZGVyCiMgdG8gYXZvaWQgc2xvdyBjbGllbnRzIGNvbm5lY3Rpb25zIGlzc3Vlcy4gTm90ZSB0aGF0IHRoZSBMaW51eCBrZXJuZWwKIyB3aWxsIHNpbGVudGx5IHRydW5jYXRlIGl0IHRvIHRoZSB2YWx1ZSBvZiAvcHJvYy9zeXMvbmV0L2NvcmUvc29tYXhjb25uIHNvCiMgbWFrZSBzdXJlIHRvIHJhaXNlIGJvdGggdGhlIHZhbHVlIG9mIHNvbWF4Y29ubiBhbmQgdGNwX21heF9zeW5fYmFja2xvZwojIGluIG9yZGVyIHRvIGdldCB0aGUgZGVzaXJlZCBlZmZlY3QuCnRjcC1iYWNrbG9nIDUxMQoKIyBVbml4IHNvY2tldC4KIwojIFNwZWNpZnkgdGhlIHBhdGggZm9yIHRoZSBVbml4IHNvY2tldCB0aGF0IHdpbGwgYmUgdXNlZCB0byBsaXN0ZW4gZm9yCiMgaW5jb21pbmcgY29ubmVjdGlvbnMuIFRoZXJlIGlzIG5vIGRlZmF1bHQsIHNvIFJlZGlzIHdpbGwgbm90IGxpc3RlbgojIG9uIGEgdW5peCBzb2NrZXQgd2hlbiBub3Qgc3BlY2lmaWVkLgojCiMgdW5peHNvY2tldCAvdG1wL3JlZGlzLnNvY2sKIyB1bml4c29ja2V0cGVybSA3MDAKCiMgQ2xvc2UgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgYSBjbGllbnQgaXMgaWRsZSBmb3IgTiBzZWNvbmRzICgwIHRvIGRpc2FibGUpCnRpbWVvdXQgMAoKIyBUQ1Aga2VlcGFsaXZlLgojCiMgSWYgbm9uLXplcm8sIHVzZSBTT19LRUVQQUxJVkUgdG8gc2VuZCBUQ1AgQUNLcyB0byBjbGllbnRzIGluIGFic2VuY2UKIyBvZiBjb21tdW5pY2F0aW9uLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdHdvIHJlYXNvbnM6CiMKIyAxKSBEZXRlY3QgZGVhZCBwZWVycy4KIyAyKSBUYWtlIHRoZSBjb25uZWN0aW9uIGFsaXZlIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgbmV0d29yawojICAgIGVxdWlwbWVudCBpbiB0aGUgbWlkZGxlLgojCiMgT24gTGludXgsIHRoZSBzcGVjaWZpZWQgdmFsdWUgKGluIHNlY29uZHMpIGlzIHRoZSBwZXJpb2QgdXNlZCB0byBzZW5kIEFDS3MuCiMgTm90ZSB0aGF0IHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIHRoZSBkb3VibGUgb2YgdGhlIHRpbWUgaXMgbmVlZGVkLgojIE9uIG90aGVyIGtlcm5lbHMgdGhlIHBlcmlvZCBkZXBlbmRzIG9uIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4KIwojIEEgcmVhc29uYWJsZSB2YWx1ZSBmb3IgdGhpcyBvcHRpb24gaXMgMzAwIHNlY29uZHMsIHdoaWNoIGlzIHRoZSBuZXcKIyBSZWRpcyBkZWZhdWx0IHN0YXJ0aW5nIHdpdGggUmVkaXMgMy4yLjEuCnRjcC1rZWVwYWxpdmUgMzAwCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0VORVJBTCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIEJ5IGRlZmF1bHQgUmVkaXMgZG9lcyBub3QgcnVuIGFzIGEgZGFlbW9uLiBVc2UgJ3llcycgaWYgeW91IG5lZWQgaXQuCiMgTm90ZSB0aGF0IFJlZGlzIHdpbGwgd3JpdGUgYSBwaWQgZmlsZSBpbiAvdmFyL3J1bi9yZWRpcy5waWQgd2hlbiBkYWVtb25pemVkLgpkYWVtb25pemUgeWVzCgojIElmIHlvdSBydW4gUmVkaXMgZnJvbSB1cHN0YXJ0IG9yIHN5c3RlbWQsIFJlZGlzIGNhbiBpbnRlcmFjdCB3aXRoIHlvdXIKIyBzdXBlcnZpc2lvbiB0cmVlLiBPcHRpb25zOgojICAgc3VwZXJ2aXNlZCBubyAgICAgIC0gbm8gc3VwZXJ2aXNpb24gaW50ZXJhY3Rpb24KIyAgIHN1cGVydmlzZWQgdXBzdGFydCAtIHNpZ25hbCB1cHN0YXJ0IGJ5IHB1dHRpbmcgUmVkaXMgaW50byBTSUdTVE9QIG1vZGUKIyAgIHN1cGVydmlzZWQgc3lzdGVtZCAtIHNpZ25hbCBzeXN0ZW1kIGJ5IHdyaXRpbmcgUkVBRFk9MSB0byAkTk9USUZZX1NPQ0tFVAojICAgc3VwZXJ2aXNlZCBhdXRvICAgIC0gZGV0ZWN0IHVwc3RhcnQgb3Igc3lzdGVtZCBtZXRob2QgYmFzZWQgb24KIyAgICAgICAgICAgICAgICAgICAgICAgIFVQU1RBUlRfSk9CIG9yIE5PVElGWV9TT0NLRVQgZW52aXJvbm1lbnQgdmFyaWFibGVzCiMgTm90ZTogdGhlc2Ugc3VwZXJ2aXNpb24gbWV0aG9kcyBvbmx5IHNpZ25hbCAicHJvY2VzcyBpcyByZWFkeS4iCiMgICAgICAgVGhleSBkbyBub3QgZW5hYmxlIGNvbnRpbnVvdXMgbGl2ZW5lc3MgcGluZ3MgYmFjayB0byB5b3VyIHN1cGVydmlzb3IuCnN1cGVydmlzZWQgc3lzdGVtZAoKIyBJZiBhIHBpZCBmaWxlIGlzIHNwZWNpZmllZCwgUmVkaXMgd3JpdGVzIGl0IHdoZXJlIHNwZWNpZmllZCBhdCBzdGFydHVwCiMgYW5kIHJlbW92ZXMgaXQgYXQgZXhpdC4KIwojIFdoZW4gdGhlIHNlcnZlciBydW5zIG5vbiBkYWVtb25pemVkLCBubyBwaWQgZmlsZSBpcyBjcmVhdGVkIGlmIG5vbmUgaXMKIyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIFdoZW4gdGhlIHNlcnZlciBpcyBkYWVtb25pemVkLCB0aGUgcGlkIGZpbGUKIyBpcyB1c2VkIGV2ZW4gaWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdGluZyB0byAiL3Zhci9ydW4vcmVkaXMucGlkIi4KIwojIENyZWF0aW5nIGEgcGlkIGZpbGUgaXMgYmVzdCBlZmZvcnQ6IGlmIFJlZGlzIGlzIG5vdCBhYmxlIHRvIGNyZWF0ZSBpdAojIG5vdGhpbmcgYmFkIGhhcHBlbnMsIHRoZSBzZXJ2ZXIgd2lsbCBzdGFydCBhbmQgcnVuIG5vcm1hbGx5LgpwaWRmaWxlIC92YXIvcnVuL3JlZGlzLnBpZAoKIyBTcGVjaWZ5IHRoZSBzZXJ2ZXIgdmVyYm9zaXR5IGxldmVsLgojIFRoaXMgY2FuIGJlIG9uZSBvZjoKIyBkZWJ1ZyAoYSBsb3Qgb2YgaW5mb3JtYXRpb24sIHVzZWZ1bCBmb3IgZGV2ZWxvcG1lbnQvdGVzdGluZykKIyB2ZXJib3NlIChtYW55IHJhcmVseSB1c2VmdWwgaW5mbywgYnV0IG5vdCBhIG1lc3MgbGlrZSB0aGUgZGVidWcgbGV2ZWwpCiMgbm90aWNlIChtb2RlcmF0ZWx5IHZlcmJvc2UsIHdoYXQgeW91IHdhbnQgaW4gcHJvZHVjdGlvbiBwcm9iYWJseSkKIyB3YXJuaW5nIChvbmx5IHZlcnkgaW1wb3J0YW50IC8gY3JpdGljYWwgbWVzc2FnZXMgYXJlIGxvZ2dlZCkKbG9nbGV2ZWwgbm90aWNlCgojIFNwZWNpZnkgdGhlIGxvZyBmaWxlIG5hbWUuIEFsc28gdGhlIGVtcHR5IHN0cmluZyBjYW4gYmUgdXNlZCB0byBmb3JjZQojIFJlZGlzIHRvIGxvZyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LiBOb3RlIHRoYXQgaWYgeW91IHVzZSBzdGFuZGFyZAojIG91dHB1dCBmb3IgbG9nZ2luZyBidXQgZGFlbW9uaXplLCBsb2dzIHdpbGwgYmUgc2VudCB0byAvZGV2L251bGwKbG9nZmlsZSAiIgoKIyBUbyBlbmFibGUgbG9nZ2luZyB0byB0aGUgc3lzdGVtIGxvZ2dlciwganVzdCBzZXQgJ3N5c2xvZy1lbmFibGVkJyB0byB5ZXMsCiMgYW5kIG9wdGlvbmFsbHkgdXBkYXRlIHRoZSBvdGhlciBzeXNsb2cgcGFyYW1ldGVycyB0byBzdWl0IHlvdXIgbmVlZHMuCiMgc3lzbG9nLWVuYWJsZWQgbm8KCiMgU3BlY2lmeSB0aGUgc3lzbG9nIGlkZW50aXR5LgojIHN5c2xvZy1pZGVudCByZWRpcwoKIyBTcGVjaWZ5IHRoZSBzeXNsb2cgZmFjaWxpdHkuIE11c3QgYmUgVVNFUiBvciBiZXR3ZWVuIExPQ0FMMC1MT0NBTDcuCiMgc3lzbG9nLWZhY2lsaXR5IGxvY2FsMAoKIyBTZXQgdGhlIG51bWJlciBvZiBkYXRhYmFzZXMuIFRoZSBkZWZhdWx0IGRhdGFiYXNlIGlzIERCIDAsIHlvdSBjYW4gc2VsZWN0CiMgYSBkaWZmZXJlbnQgb25lIG9uIGEgcGVyLWNvbm5lY3Rpb24gYmFzaXMgdXNpbmcgU0VMRUNUIDxkYmlkPiB3aGVyZQojIGRiaWQgaXMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAnZGF0YWJhc2VzJy0xCmRhdGFiYXNlcyAxNgoKIyBCeSBkZWZhdWx0IFJlZGlzIHNob3dzIGFuIEFTQ0lJIGFydCBsb2dvIG9ubHkgd2hlbiBzdGFydGVkIHRvIGxvZyB0byB0aGUKIyBzdGFuZGFyZCBvdXRwdXQgYW5kIGlmIHRoZSBzdGFuZGFyZCBvdXRwdXQgaXMgYSBUVFkuIEJhc2ljYWxseSB0aGlzIG1lYW5zCiMgdGhhdCBub3JtYWxseSBhIGxvZ28gaXMgZGlzcGxheWVkIG9ubHkgaW4gaW50ZXJhY3RpdmUgc2Vzc2lvbnMuCiMKIyBIb3dldmVyIGl0IGlzIHBvc3NpYmxlIHRvIGZvcmNlIHRoZSBwcmUtNC4wIGJlaGF2aW9yIGFuZCBhbHdheXMgc2hvdyBhCiMgQVNDSUkgYXJ0IGxvZ28gaW4gc3RhcnR1cCBsb2dzIGJ5IHNldHRpbmcgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8geWVzLgphbHdheXMtc2hvdy1sb2dvIHllcwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU05BUFNIT1RUSU5HICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojCiMgU2F2ZSB0aGUgREIgb24gZGlzazoKIwojICAgc2F2ZSA8c2Vjb25kcz4gPGNoYW5nZXM+CiMKIyAgIFdpbGwgc2F2ZSB0aGUgREIgaWYgYm90aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNlY29uZHMgYW5kIHRoZSBnaXZlbgojICAgbnVtYmVyIG9mIHdyaXRlIG9wZXJhdGlvbnMgYWdhaW5zdCB0aGUgREIgb2NjdXJyZWQuCiMKIyAgIEluIHRoZSBleGFtcGxlIGJlbG93IHRoZSBiZWhhdmlvdXIgd2lsbCBiZSB0byBzYXZlOgojICAgYWZ0ZXIgOTAwIHNlYyAoMTUgbWluKSBpZiBhdCBsZWFzdCAxIGtleSBjaGFuZ2VkCiMgICBhZnRlciAzMDAgc2VjICg1IG1pbikgaWYgYXQgbGVhc3QgMTAga2V5cyBjaGFuZ2VkCiMgICBhZnRlciA2MCBzZWMgaWYgYXQgbGVhc3QgMTAwMDAga2V5cyBjaGFuZ2VkCiMKIyAgIE5vdGU6IHlvdSBjYW4gZGlzYWJsZSBzYXZpbmcgY29tcGxldGVseSBieSBjb21tZW50aW5nIG91dCBhbGwgInNhdmUiIGxpbmVzLgojCiMgICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlbW92ZSBhbGwgdGhlIHByZXZpb3VzbHkgY29uZmlndXJlZCBzYXZlCiMgICBwb2ludHMgYnkgYWRkaW5nIGEgc2F2ZSBkaXJlY3RpdmUgd2l0aCBhIHNpbmdsZSBlbXB0eSBzdHJpbmcgYXJndW1lbnQKIyAgIGxpa2UgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgojCiMgICBzYXZlICIiCiNyZW5hbWUtY29tbWFuZCBGTFVTSERCICIiCiNyZW5hbWUtY29tbWFuZCBGTFVTSEFMTCAiIgojcmVuYW1lLWNvbW1hbmQgREVCVUcgIiIKI3JlbmFtZS1jb21tYW5kIENPTkZJRyAiIgoKc2F2ZSA5MDAgMQpzYXZlIDMwMCAxMApzYXZlIDYwIDEwMDAwCgojIEJ5IGRlZmF1bHQgUmVkaXMgd2lsbCBzdG9wIGFjY2VwdGluZyB3cml0ZXMgaWYgUkRCIHNuYXBzaG90cyBhcmUgZW5hYmxlZAojIChhdCBsZWFzdCBvbmUgc2F2ZSBwb2ludCkgYW5kIHRoZSBsYXRlc3QgYmFja2dyb3VuZCBzYXZlIGZhaWxlZC4KIyBUaGlzIHdpbGwgbWFrZSB0aGUgdXNlciBhd2FyZSAoaW4gYSBoYXJkIHdheSkgdGhhdCBkYXRhIGlzIG5vdCBwZXJzaXN0aW5nCiMgb24gZGlzayBwcm9wZXJseSwgb3RoZXJ3aXNlIGNoYW5jZXMgYXJlIHRoYXQgbm8gb25lIHdpbGwgbm90aWNlIGFuZCBzb21lCiMgZGlzYXN0ZXIgd2lsbCBoYXBwZW4uCiMKIyBJZiB0aGUgYmFja2dyb3VuZCBzYXZpbmcgcHJvY2VzcyB3aWxsIHN0YXJ0IHdvcmtpbmcgYWdhaW4gUmVkaXMgd2lsbAojIGF1dG9tYXRpY2FsbHkgYWxsb3cgd3JpdGVzIGFnYWluLgojCiMgSG93ZXZlciBpZiB5b3UgaGF2ZSBzZXR1cCB5b3VyIHByb3BlciBtb25pdG9yaW5nIG9mIHRoZSBSZWRpcyBzZXJ2ZXIKIyBhbmQgcGVyc2lzdGVuY2UsIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZSBzbyB0aGF0IFJlZGlzIHdpbGwKIyBjb250aW51ZSB0byB3b3JrIGFzIHVzdWFsIGV2ZW4gaWYgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggZGlzaywKIyBwZXJtaXNzaW9ucywgYW5kIHNvIGZvcnRoLgpzdG9wLXdyaXRlcy1vbi1iZ3NhdmUtZXJyb3Igbm8KCiMgQ29tcHJlc3Mgc3RyaW5nIG9iamVjdHMgdXNpbmcgTFpGIHdoZW4gZHVtcCAucmRiIGRhdGFiYXNlcz8KIyBGb3IgZGVmYXVsdCB0aGF0J3Mgc2V0IHRvICd5ZXMnIGFzIGl0J3MgYWxtb3N0IGFsd2F5cyBhIHdpbi4KIyBJZiB5b3Ugd2FudCB0byBzYXZlIHNvbWUgQ1BVIGluIHRoZSBzYXZpbmcgY2hpbGQgc2V0IGl0IHRvICdubycgYnV0CiMgdGhlIGRhdGFzZXQgd2lsbCBsaWtlbHkgYmUgYmlnZ2VyIGlmIHlvdSBoYXZlIGNvbXByZXNzaWJsZSB2YWx1ZXMgb3Iga2V5cy4KcmRiY29tcHJlc3Npb24geWVzCgojIFNpbmNlIHZlcnNpb24gNSBvZiBSREIgYSBDUkM2NCBjaGVja3N1bSBpcyBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KIyBUaGlzIG1ha2VzIHRoZSBmb3JtYXQgbW9yZSByZXNpc3RhbnQgdG8gY29ycnVwdGlvbiBidXQgdGhlcmUgaXMgYSBwZXJmb3JtYW5jZQojIGhpdCB0byBwYXkgKGFyb3VuZCAxMCUpIHdoZW4gc2F2aW5nIGFuZCBsb2FkaW5nIFJEQiBmaWxlcywgc28geW91IGNhbiBkaXNhYmxlIGl0CiMgZm9yIG1heGltdW0gcGVyZm9ybWFuY2VzLgojCiMgUkRCIGZpbGVzIGNyZWF0ZWQgd2l0aCBjaGVja3N1bSBkaXNhYmxlZCBoYXZlIGEgY2hlY2tzdW0gb2YgemVybyB0aGF0IHdpbGwKIyB0ZWxsIHRoZSBsb2FkaW5nIGNvZGUgdG8gc2tpcCB0aGUgY2hlY2suCnJkYmNoZWNrc3VtIHllcwoKIyBUaGUgZmlsZW5hbWUgd2hlcmUgdG8gZHVtcCB0aGUgREIKZGJmaWxlbmFtZSBkdW1wLnJkYgoKIyBUaGUgd29ya2luZyBkaXJlY3RvcnkuCiMKIyBUaGUgREIgd2lsbCBiZSB3cml0dGVuIGluc2lkZSB0aGlzIGRpcmVjdG9yeSwgd2l0aCB0aGUgZmlsZW5hbWUgc3BlY2lmaWVkCiMgYWJvdmUgdXNpbmcgdGhlICdkYmZpbGVuYW1lJyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZS4KIwojIFRoZSBBcHBlbmQgT25seSBGaWxlIHdpbGwgYWxzbyBiZSBjcmVhdGVkIGluc2lkZSB0aGlzIGRpcmVjdG9yeS4KIwojIE5vdGUgdGhhdCB5b3UgbXVzdCBzcGVjaWZ5IGEgZGlyZWN0b3J5IGhlcmUsIG5vdCBhIGZpbGUgbmFtZS4KZGlyIC4vCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUkVQTElDQVRJT04gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIE1hc3Rlci1SZXBsaWNhIHJlcGxpY2F0aW9uLiBVc2UgcmVwbGljYW9mIHRvIG1ha2UgYSBSZWRpcyBpbnN0YW5jZSBhIGNvcHkgb2YKIyBhbm90aGVyIFJlZGlzIHNlcnZlci4gQSBmZXcgdGhpbmdzIHRvIHVuZGVyc3RhbmQgQVNBUCBhYm91dCBSZWRpcyByZXBsaWNhdGlvbi4KIwojICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICArLS0tLS0tLS0tLS0tLS0tKwojICAgfCAgICAgIE1hc3RlciAgICAgIHwgLS0tPiB8ICAgIFJlcGxpY2EgICAgfAojICAgfCAocmVjZWl2ZSB3cml0ZXMpIHwgICAgICB8ICAoZXhhY3QgY29weSkgfAojICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICArLS0tLS0tLS0tLS0tLS0tKwojCiMgMSkgUmVkaXMgcmVwbGljYXRpb24gaXMgYXN5bmNocm9ub3VzLCBidXQgeW91IGNhbiBjb25maWd1cmUgYSBtYXN0ZXIgdG8KIyAgICBzdG9wIGFjY2VwdGluZyB3cml0ZXMgaWYgaXQgYXBwZWFycyB0byBiZSBub3QgY29ubmVjdGVkIHdpdGggYXQgbGVhc3QKIyAgICBhIGdpdmVuIG51bWJlciBvZiByZXBsaWNhcy4KIyAyKSBSZWRpcyByZXBsaWNhcyBhcmUgYWJsZSB0byBwZXJmb3JtIGEgcGFydGlhbCByZXN5bmNocm9uaXphdGlvbiB3aXRoIHRoZQojICAgIG1hc3RlciBpZiB0aGUgcmVwbGljYXRpb24gbGluayBpcyBsb3N0IGZvciBhIHJlbGF0aXZlbHkgc21hbGwgYW1vdW50IG9mCiMgICAgdGltZS4gWW91IG1heSB3YW50IHRvIGNvbmZpZ3VyZSB0aGUgcmVwbGljYXRpb24gYmFja2xvZyBzaXplIChzZWUgdGhlIG5leHQKIyAgICBzZWN0aW9ucyBvZiB0aGlzIGZpbGUpIHdpdGggYSBzZW5zaWJsZSB2YWx1ZSBkZXBlbmRpbmcgb24geW91ciBuZWVkcy4KIyAzKSBSZXBsaWNhdGlvbiBpcyBhdXRvbWF0aWMgYW5kIGRvZXMgbm90IG5lZWQgdXNlciBpbnRlcnZlbnRpb24uIEFmdGVyIGEKIyAgICBuZXR3b3JrIHBhcnRpdGlvbiByZXBsaWNhcyBhdXRvbWF0aWNhbGx5IHRyeSB0byByZWNvbm5lY3QgdG8gbWFzdGVycwojICAgIGFuZCByZXN5bmNocm9uaXplIHdpdGggdGhlbS4KIwojIHJlcGxpY2FvZiA8bWFzdGVyaXA+IDxtYXN0ZXJwb3J0PgoKIyBJZiB0aGUgbWFzdGVyIGlzIHBhc3N3b3JkIHByb3RlY3RlZCAodXNpbmcgdGhlICJyZXF1aXJlcGFzcyIgY29uZmlndXJhdGlvbgojIGRpcmVjdGl2ZSBiZWxvdykgaXQgaXMgcG9zc2libGUgdG8gdGVsbCB0aGUgcmVwbGljYSB0byBhdXRoZW50aWNhdGUgYmVmb3JlCiMgc3RhcnRpbmcgdGhlIHJlcGxpY2F0aW9uIHN5bmNocm9uaXphdGlvbiBwcm9jZXNzLCBvdGhlcndpc2UgdGhlIG1hc3RlciB3aWxsCiMgcmVmdXNlIHRoZSByZXBsaWNhIHJlcXVlc3QuCiMKIyBtYXN0ZXJhdXRoIDxtYXN0ZXItcGFzc3dvcmQ+CgojIFdoZW4gYSByZXBsaWNhIGxvc2VzIGl0cyBjb25uZWN0aW9uIHdpdGggdGhlIG1hc3Rlciwgb3Igd2hlbiB0aGUgcmVwbGljYXRpb24KIyBpcyBzdGlsbCBpbiBwcm9ncmVzcywgdGhlIHJlcGxpY2EgY2FuIGFjdCBpbiB0d28gZGlmZmVyZW50IHdheXM6CiMKIyAxKSBpZiByZXBsaWNhLXNlcnZlLXN0YWxlLWRhdGEgaXMgc2V0IHRvICd5ZXMnICh0aGUgZGVmYXVsdCkgdGhlIHJlcGxpY2Egd2lsbAojICAgIHN0aWxsIHJlcGx5IHRvIGNsaWVudCByZXF1ZXN0cywgcG9zc2libHkgd2l0aCBvdXQgb2YgZGF0ZSBkYXRhLCBvciB0aGUKIyAgICBkYXRhIHNldCBtYXkganVzdCBiZSBlbXB0eSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBzeW5jaHJvbml6YXRpb24uCiMKIyAyKSBpZiByZXBsaWNhLXNlcnZlLXN0YWxlLWRhdGEgaXMgc2V0IHRvICdubycgdGhlIHJlcGxpY2Egd2lsbCByZXBseSB3aXRoCiMgICAgYW4gZXJyb3IgIlNZTkMgd2l0aCBtYXN0ZXIgaW4gcHJvZ3Jlc3MiIHRvIGFsbCB0aGUga2luZCBvZiBjb21tYW5kcwojICAgIGJ1dCB0byBJTkZPLCByZXBsaWNhT0YsIEFVVEgsIFBJTkcsIFNIVVRET1dOLCBSRVBMQ09ORiwgUk9MRSwgQ09ORklHLAojICAgIFNVQlNDUklCRSwgVU5TVUJTQ1JJQkUsIFBTVUJTQ1JJQkUsIFBVTlNVQlNDUklCRSwgUFVCTElTSCwgUFVCU1VCLAojICAgIENPTU1BTkQsIFBPU1QsIEhPU1Q6IGFuZCBMQVRFTkNZLgojCnJlcGxpY2Etc2VydmUtc3RhbGUtZGF0YSB5ZXMKCiMgWW91IGNhbiBjb25maWd1cmUgYSByZXBsaWNhIGluc3RhbmNlIHRvIGFjY2VwdCB3cml0ZXMgb3Igbm90LiBXcml0aW5nIGFnYWluc3QKIyBhIHJlcGxpY2EgaW5zdGFuY2UgbWF5IGJlIHVzZWZ1bCB0byBzdG9yZSBzb21lIGVwaGVtZXJhbCBkYXRhIChiZWNhdXNlIGRhdGEKIyB3cml0dGVuIG9uIGEgcmVwbGljYSB3aWxsIGJlIGVhc2lseSBkZWxldGVkIGFmdGVyIHJlc3luYyB3aXRoIHRoZSBtYXN0ZXIpIGJ1dAojIG1heSBhbHNvIGNhdXNlIHByb2JsZW1zIGlmIGNsaWVudHMgYXJlIHdyaXRpbmcgdG8gaXQgYmVjYXVzZSBvZiBhCiMgbWlzY29uZmlndXJhdGlvbi4KIwojIFNpbmNlIFJlZGlzIDIuNiBieSBkZWZhdWx0IHJlcGxpY2FzIGFyZSByZWFkLW9ubHkuCiMKIyBOb3RlOiByZWFkIG9ubHkgcmVwbGljYXMgYXJlIG5vdCBkZXNpZ25lZCB0byBiZSBleHBvc2VkIHRvIHVudHJ1c3RlZCBjbGllbnRzCiMgb24gdGhlIGludGVybmV0LiBJdCdzIGp1c3QgYSBwcm90ZWN0aW9uIGxheWVyIGFnYWluc3QgbWlzdXNlIG9mIHRoZSBpbnN0YW5jZS4KIyBTdGlsbCBhIHJlYWQgb25seSByZXBsaWNhIGV4cG9ydHMgYnkgZGVmYXVsdCBhbGwgdGhlIGFkbWluaXN0cmF0aXZlIGNvbW1hbmRzCiMgc3VjaCBhcyBDT05GSUcsIERFQlVHLCBhbmQgc28gZm9ydGguIFRvIGEgbGltaXRlZCBleHRlbnQgeW91IGNhbiBpbXByb3ZlCiMgc2VjdXJpdHkgb2YgcmVhZCBvbmx5IHJlcGxpY2FzIHVzaW5nICdyZW5hbWUtY29tbWFuZCcgdG8gc2hhZG93IGFsbCB0aGUKIyBhZG1pbmlzdHJhdGl2ZSAvIGRhbmdlcm91cyBjb21tYW5kcy4KcmVwbGljYS1yZWFkLW9ubHkgeWVzCgojIFJlcGxpY2F0aW9uIFNZTkMgc3RyYXRlZ3k6IGRpc2sgb3Igc29ja2V0LgojCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFdBUk5JTkc6IERJU0tMRVNTIFJFUExJQ0FUSU9OIElTIEVYUEVSSU1FTlRBTCBDVVJSRU5UTFkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBOZXcgcmVwbGljYXMgYW5kIHJlY29ubmVjdGluZyByZXBsaWNhcyB0aGF0IGFyZSBub3QgYWJsZSB0byBjb250aW51ZSB0aGUgcmVwbGljYXRpb24KIyBwcm9jZXNzIGp1c3QgcmVjZWl2aW5nIGRpZmZlcmVuY2VzLCBuZWVkIHRvIGRvIHdoYXQgaXMgY2FsbGVkIGEgImZ1bGwKIyBzeW5jaHJvbml6YXRpb24iLiBBbiBSREIgZmlsZSBpcyB0cmFuc21pdHRlZCBmcm9tIHRoZSBtYXN0ZXIgdG8gdGhlIHJlcGxpY2FzLgojIFRoZSB0cmFuc21pc3Npb24gY2FuIGhhcHBlbiBpbiB0d28gZGlmZmVyZW50IHdheXM6CiMKIyAxKSBEaXNrLWJhY2tlZDogVGhlIFJlZGlzIG1hc3RlciBjcmVhdGVzIGEgbmV3IHByb2Nlc3MgdGhhdCB3cml0ZXMgdGhlIFJEQgojICAgICAgICAgICAgICAgICBmaWxlIG9uIGRpc2suIExhdGVyIHRoZSBmaWxlIGlzIHRyYW5zZmVycmVkIGJ5IHRoZSBwYXJlbnQKIyAgICAgICAgICAgICAgICAgcHJvY2VzcyB0byB0aGUgcmVwbGljYXMgaW5jcmVtZW50YWxseS4KIyAyKSBEaXNrbGVzczogVGhlIFJlZGlzIG1hc3RlciBjcmVhdGVzIGEgbmV3IHByb2Nlc3MgdGhhdCBkaXJlY3RseSB3cml0ZXMgdGhlCiMgICAgICAgICAgICAgIFJEQiBmaWxlIHRvIHJlcGxpY2Egc29ja2V0cywgd2l0aG91dCB0b3VjaGluZyB0aGUgZGlzayBhdCBhbGwuCiMKIyBXaXRoIGRpc2stYmFja2VkIHJlcGxpY2F0aW9uLCB3aGlsZSB0aGUgUkRCIGZpbGUgaXMgZ2VuZXJhdGVkLCBtb3JlIHJlcGxpY2FzCiMgY2FuIGJlIHF1ZXVlZCBhbmQgc2VydmVkIHdpdGggdGhlIFJEQiBmaWxlIGFzIHNvb24gYXMgdGhlIGN1cnJlbnQgY2hpbGQgcHJvZHVjaW5nCiMgdGhlIFJEQiBmaWxlIGZpbmlzaGVzIGl0cyB3b3JrLiBXaXRoIGRpc2tsZXNzIHJlcGxpY2F0aW9uIGluc3RlYWQgb25jZQojIHRoZSB0cmFuc2ZlciBzdGFydHMsIG5ldyByZXBsaWNhcyBhcnJpdmluZyB3aWxsIGJlIHF1ZXVlZCBhbmQgYSBuZXcgdHJhbnNmZXIKIyB3aWxsIHN0YXJ0IHdoZW4gdGhlIGN1cnJlbnQgb25lIHRlcm1pbmF0ZXMuCiMKIyBXaGVuIGRpc2tsZXNzIHJlcGxpY2F0aW9uIGlzIHVzZWQsIHRoZSBtYXN0ZXIgd2FpdHMgYSBjb25maWd1cmFibGUgYW1vdW50IG9mCiMgdGltZSAoaW4gc2Vjb25kcykgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0cmFuc2ZlciBpbiB0aGUgaG9wZSB0aGF0IG11bHRpcGxlIHJlcGxpY2FzCiMgd2lsbCBhcnJpdmUgYW5kIHRoZSB0cmFuc2ZlciBjYW4gYmUgcGFyYWxsZWxpemVkLgojCiMgV2l0aCBzbG93IGRpc2tzIGFuZCBmYXN0IChsYXJnZSBiYW5kd2lkdGgpIG5ldHdvcmtzLCBkaXNrbGVzcyByZXBsaWNhdGlvbgojIHdvcmtzIGJldHRlci4KcmVwbC1kaXNrbGVzcy1zeW5jIG5vCgojIFdoZW4gZGlza2xlc3MgcmVwbGljYXRpb24gaXMgZW5hYmxlZCwgaXQgaXMgcG9zc2libGUgdG8gY29uZmlndXJlIHRoZSBkZWxheQojIHRoZSBzZXJ2ZXIgd2FpdHMgaW4gb3JkZXIgdG8gc3Bhd24gdGhlIGNoaWxkIHRoYXQgdHJhbnNmZXJzIHRoZSBSREIgdmlhIHNvY2tldAojIHRvIHRoZSByZXBsaWNhcy4KIwojIFRoaXMgaXMgaW1wb3J0YW50IHNpbmNlIG9uY2UgdGhlIHRyYW5zZmVyIHN0YXJ0cywgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHNlcnZlCiMgbmV3IHJlcGxpY2FzIGFycml2aW5nLCB0aGF0IHdpbGwgYmUgcXVldWVkIGZvciB0aGUgbmV4dCBSREIgdHJhbnNmZXIsIHNvIHRoZSBzZXJ2ZXIKIyB3YWl0cyBhIGRlbGF5IGluIG9yZGVyIHRvIGxldCBtb3JlIHJlcGxpY2FzIGFycml2ZS4KIwojIFRoZSBkZWxheSBpcyBzcGVjaWZpZWQgaW4gc2Vjb25kcywgYW5kIGJ5IGRlZmF1bHQgaXMgNSBzZWNvbmRzLiBUbyBkaXNhYmxlCiMgaXQgZW50aXJlbHkganVzdCBzZXQgaXQgdG8gMCBzZWNvbmRzIGFuZCB0aGUgdHJhbnNmZXIgd2lsbCBzdGFydCBBU0FQLgpyZXBsLWRpc2tsZXNzLXN5bmMtZGVsYXkgNQoKIyBSZXBsaWNhcyBzZW5kIFBJTkdzIHRvIHNlcnZlciBpbiBhIHByZWRlZmluZWQgaW50ZXJ2YWwuIEl0J3MgcG9zc2libGUgdG8gY2hhbmdlCiMgdGhpcyBpbnRlcnZhbCB3aXRoIHRoZSByZXBsX3BpbmdfcmVwbGljYV9wZXJpb2Qgb3B0aW9uLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxMAojIHNlY29uZHMuCiMKIyByZXBsLXBpbmctcmVwbGljYS1wZXJpb2QgMTAKCiMgVGhlIGZvbGxvd2luZyBvcHRpb24gc2V0cyB0aGUgcmVwbGljYXRpb24gdGltZW91dCBmb3I6CiMKIyAxKSBCdWxrIHRyYW5zZmVyIEkvTyBkdXJpbmcgU1lOQywgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiByZXBsaWNhLgojIDIpIE1hc3RlciB0aW1lb3V0IGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgcmVwbGljYXMgKGRhdGEsIHBpbmdzKS4KIyAzKSBSZXBsaWNhIHRpbWVvdXQgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiBtYXN0ZXJzIChSRVBMQ09ORiBBQ0sgcGluZ3MpLgojCiMgSXQgaXMgaW1wb3J0YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZQojIHNwZWNpZmllZCBmb3IgcmVwbC1waW5nLXJlcGxpY2EtcGVyaW9kIG90aGVyd2lzZSBhIHRpbWVvdXQgd2lsbCBiZSBkZXRlY3RlZAojIGV2ZXJ5IHRpbWUgdGhlcmUgaXMgbG93IHRyYWZmaWMgYmV0d2VlbiB0aGUgbWFzdGVyIGFuZCB0aGUgcmVwbGljYS4KIwojIHJlcGwtdGltZW91dCA2MAoKIyBEaXNhYmxlIFRDUF9OT0RFTEFZIG9uIHRoZSByZXBsaWNhIHNvY2tldCBhZnRlciBTWU5DPwojCiMgSWYgeW91IHNlbGVjdCAieWVzIiBSZWRpcyB3aWxsIHVzZSBhIHNtYWxsZXIgbnVtYmVyIG9mIFRDUCBwYWNrZXRzIGFuZAojIGxlc3MgYmFuZHdpZHRoIHRvIHNlbmQgZGF0YSB0byByZXBsaWNhcy4gQnV0IHRoaXMgY2FuIGFkZCBhIGRlbGF5IGZvcgojIHRoZSBkYXRhIHRvIGFwcGVhciBvbiB0aGUgcmVwbGljYSBzaWRlLCB1cCB0byA0MCBtaWxsaXNlY29uZHMgd2l0aAojIExpbnV4IGtlcm5lbHMgdXNpbmcgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCiMKIyBJZiB5b3Ugc2VsZWN0ICJubyIgdGhlIGRlbGF5IGZvciBkYXRhIHRvIGFwcGVhciBvbiB0aGUgcmVwbGljYSBzaWRlIHdpbGwKIyBiZSByZWR1Y2VkIGJ1dCBtb3JlIGJhbmR3aWR0aCB3aWxsIGJlIHVzZWQgZm9yIHJlcGxpY2F0aW9uLgojCiMgQnkgZGVmYXVsdCB3ZSBvcHRpbWl6ZSBmb3IgbG93IGxhdGVuY3ksIGJ1dCBpbiB2ZXJ5IGhpZ2ggdHJhZmZpYyBjb25kaXRpb25zCiMgb3Igd2hlbiB0aGUgbWFzdGVyIGFuZCByZXBsaWNhcyBhcmUgbWFueSBob3BzIGF3YXksIHR1cm5pbmcgdGhpcyB0byAieWVzIiBtYXkKIyBiZSBhIGdvb2QgaWRlYS4KcmVwbC1kaXNhYmxlLXRjcC1ub2RlbGF5IG5vCgojIFNldCB0aGUgcmVwbGljYXRpb24gYmFja2xvZyBzaXplLiBUaGUgYmFja2xvZyBpcyBhIGJ1ZmZlciB0aGF0IGFjY3VtdWxhdGVzCiMgcmVwbGljYSBkYXRhIHdoZW4gcmVwbGljYXMgYXJlIGRpc2Nvbm5lY3RlZCBmb3Igc29tZSB0aW1lLCBzbyB0aGF0IHdoZW4gYSByZXBsaWNhCiMgd2FudHMgdG8gcmVjb25uZWN0IGFnYWluLCBvZnRlbiBhIGZ1bGwgcmVzeW5jIGlzIG5vdCBuZWVkZWQsIGJ1dCBhIHBhcnRpYWwKIyByZXN5bmMgaXMgZW5vdWdoLCBqdXN0IHBhc3NpbmcgdGhlIHBvcnRpb24gb2YgZGF0YSB0aGUgcmVwbGljYSBtaXNzZWQgd2hpbGUKIyBkaXNjb25uZWN0ZWQuCiMKIyBUaGUgYmlnZ2VyIHRoZSByZXBsaWNhdGlvbiBiYWNrbG9nLCB0aGUgbG9uZ2VyIHRoZSB0aW1lIHRoZSByZXBsaWNhIGNhbiBiZQojIGRpc2Nvbm5lY3RlZCBhbmQgbGF0ZXIgYmUgYWJsZSB0byBwZXJmb3JtIGEgcGFydGlhbCByZXN5bmNocm9uaXphdGlvbi4KIwojIFRoZSBiYWNrbG9nIGlzIG9ubHkgYWxsb2NhdGVkIG9uY2UgdGhlcmUgaXMgYXQgbGVhc3QgYSByZXBsaWNhIGNvbm5lY3RlZC4KIwojIHJlcGwtYmFja2xvZy1zaXplIDFtYgoKIyBBZnRlciBhIG1hc3RlciBoYXMgbm8gbG9uZ2VyIGNvbm5lY3RlZCByZXBsaWNhcyBmb3Igc29tZSB0aW1lLCB0aGUgYmFja2xvZwojIHdpbGwgYmUgZnJlZWQuIFRoZSBmb2xsb3dpbmcgb3B0aW9uIGNvbmZpZ3VyZXMgdGhlIGFtb3VudCBvZiBzZWNvbmRzIHRoYXQKIyBuZWVkIHRvIGVsYXBzZSwgc3RhcnRpbmcgZnJvbSB0aGUgdGltZSB0aGUgbGFzdCByZXBsaWNhIGRpc2Nvbm5lY3RlZCwgZm9yCiMgdGhlIGJhY2tsb2cgYnVmZmVyIHRvIGJlIGZyZWVkLgojCiMgTm90ZSB0aGF0IHJlcGxpY2FzIG5ldmVyIGZyZWUgdGhlIGJhY2tsb2cgZm9yIHRpbWVvdXQsIHNpbmNlIHRoZXkgbWF5IGJlCiMgcHJvbW90ZWQgdG8gbWFzdGVycyBsYXRlciwgYW5kIHNob3VsZCBiZSBhYmxlIHRvIGNvcnJlY3RseSAicGFydGlhbGx5CiMgcmVzeW5jaHJvbml6ZSIgd2l0aCB0aGUgcmVwbGljYXM6IGhlbmNlIHRoZXkgc2hvdWxkIGFsd2F5cyBhY2N1bXVsYXRlIGJhY2tsb2cuCiMKIyBBIHZhbHVlIG9mIDAgbWVhbnMgdG8gbmV2ZXIgcmVsZWFzZSB0aGUgYmFja2xvZy4KIwojIHJlcGwtYmFja2xvZy10dGwgMzYwMAoKIyBUaGUgcmVwbGljYSBwcmlvcml0eSBpcyBhbiBpbnRlZ2VyIG51bWJlciBwdWJsaXNoZWQgYnkgUmVkaXMgaW4gdGhlIElORk8gb3V0cHV0LgojIEl0IGlzIHVzZWQgYnkgUmVkaXMgU2VudGluZWwgaW4gb3JkZXIgdG8gc2VsZWN0IGEgcmVwbGljYSB0byBwcm9tb3RlIGludG8gYQojIG1hc3RlciBpZiB0aGUgbWFzdGVyIGlzIG5vIGxvbmdlciB3b3JraW5nIGNvcnJlY3RseS4KIwojIEEgcmVwbGljYSB3aXRoIGEgbG93IHByaW9yaXR5IG51bWJlciBpcyBjb25zaWRlcmVkIGJldHRlciBmb3IgcHJvbW90aW9uLCBzbwojIGZvciBpbnN0YW5jZSBpZiB0aGVyZSBhcmUgdGhyZWUgcmVwbGljYXMgd2l0aCBwcmlvcml0eSAxMCwgMTAwLCAyNSBTZW50aW5lbCB3aWxsCiMgcGljayB0aGUgb25lIHdpdGggcHJpb3JpdHkgMTAsIHRoYXQgaXMgdGhlIGxvd2VzdC4KIwojIEhvd2V2ZXIgYSBzcGVjaWFsIHByaW9yaXR5IG9mIDAgbWFya3MgdGhlIHJlcGxpY2EgYXMgbm90IGFibGUgdG8gcGVyZm9ybSB0aGUKIyByb2xlIG9mIG1hc3Rlciwgc28gYSByZXBsaWNhIHdpdGggcHJpb3JpdHkgb2YgMCB3aWxsIG5ldmVyIGJlIHNlbGVjdGVkIGJ5CiMgUmVkaXMgU2VudGluZWwgZm9yIHByb21vdGlvbi4KIwojIEJ5IGRlZmF1bHQgdGhlIHByaW9yaXR5IGlzIDEwMC4KcmVwbGljYS1wcmlvcml0eSAxMDAKCiMgSXQgaXMgcG9zc2libGUgZm9yIGEgbWFzdGVyIHRvIHN0b3AgYWNjZXB0aW5nIHdyaXRlcyBpZiB0aGVyZSBhcmUgbGVzcyB0aGFuCiMgTiByZXBsaWNhcyBjb25uZWN0ZWQsIGhhdmluZyBhIGxhZyBsZXNzIG9yIGVxdWFsIHRoYW4gTSBzZWNvbmRzLgojCiMgVGhlIE4gcmVwbGljYXMgbmVlZCB0byBiZSBpbiAib25saW5lIiBzdGF0ZS4KIwojIFRoZSBsYWcgaW4gc2Vjb25kcywgdGhhdCBtdXN0IGJlIDw9IHRoZSBzcGVjaWZpZWQgdmFsdWUsIGlzIGNhbGN1bGF0ZWQgZnJvbQojIHRoZSBsYXN0IHBpbmcgcmVjZWl2ZWQgZnJvbSB0aGUgcmVwbGljYSwgdGhhdCBpcyB1c3VhbGx5IHNlbnQgZXZlcnkgc2Vjb25kLgojCiMgVGhpcyBvcHRpb24gZG9lcyBub3QgR1VBUkFOVEVFIHRoYXQgTiByZXBsaWNhcyB3aWxsIGFjY2VwdCB0aGUgd3JpdGUsIGJ1dAojIHdpbGwgbGltaXQgdGhlIHdpbmRvdyBvZiBleHBvc3VyZSBmb3IgbG9zdCB3cml0ZXMgaW4gY2FzZSBub3QgZW5vdWdoIHJlcGxpY2FzCiMgYXJlIGF2YWlsYWJsZSwgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcy4KIwojIEZvciBleGFtcGxlIHRvIHJlcXVpcmUgYXQgbGVhc3QgMyByZXBsaWNhcyB3aXRoIGEgbGFnIDw9IDEwIHNlY29uZHMgdXNlOgojCiMgbWluLXJlcGxpY2FzLXRvLXdyaXRlIDMKIyBtaW4tcmVwbGljYXMtbWF4LWxhZyAxMAojCiMgU2V0dGluZyBvbmUgb3IgdGhlIG90aGVyIHRvIDAgZGlzYWJsZXMgdGhlIGZlYXR1cmUuCiMKIyBCeSBkZWZhdWx0IG1pbi1yZXBsaWNhcy10by13cml0ZSBpcyBzZXQgdG8gMCAoZmVhdHVyZSBkaXNhYmxlZCkgYW5kCiMgbWluLXJlcGxpY2FzLW1heC1sYWcgaXMgc2V0IHRvIDEwLgoKIyBBIFJlZGlzIG1hc3RlciBpcyBhYmxlIHRvIGxpc3QgdGhlIGFkZHJlc3MgYW5kIHBvcnQgb2YgdGhlIGF0dGFjaGVkCiMgcmVwbGljYXMgaW4gZGlmZmVyZW50IHdheXMuIEZvciBleGFtcGxlIHRoZSAiSU5GTyByZXBsaWNhdGlvbiIgc2VjdGlvbgojIG9mZmVycyB0aGlzIGluZm9ybWF0aW9uLCB3aGljaCBpcyB1c2VkLCBhbW9uZyBvdGhlciB0b29scywgYnkKIyBSZWRpcyBTZW50aW5lbCBpbiBvcmRlciB0byBkaXNjb3ZlciByZXBsaWNhIGluc3RhbmNlcy4KIyBBbm90aGVyIHBsYWNlIHdoZXJlIHRoaXMgaW5mbyBpcyBhdmFpbGFibGUgaXMgaW4gdGhlIG91dHB1dCBvZiB0aGUKIyAiUk9MRSIgY29tbWFuZCBvZiBhIG1hc3Rlci4KIwojIFRoZSBsaXN0ZWQgSVAgYW5kIGFkZHJlc3Mgbm9ybWFsbHkgcmVwb3J0ZWQgYnkgYSByZXBsaWNhIGlzIG9idGFpbmVkCiMgaW4gdGhlIGZvbGxvd2luZyB3YXk6CiMKIyAgIElQOiBUaGUgYWRkcmVzcyBpcyBhdXRvIGRldGVjdGVkIGJ5IGNoZWNraW5nIHRoZSBwZWVyIGFkZHJlc3MKIyAgIG9mIHRoZSBzb2NrZXQgdXNlZCBieSB0aGUgcmVwbGljYSB0byBjb25uZWN0IHdpdGggdGhlIG1hc3Rlci4KIwojICAgUG9ydDogVGhlIHBvcnQgaXMgY29tbXVuaWNhdGVkIGJ5IHRoZSByZXBsaWNhIGR1cmluZyB0aGUgcmVwbGljYXRpb24KIyAgIGhhbmRzaGFrZSwgYW5kIGlzIG5vcm1hbGx5IHRoZSBwb3J0IHRoYXQgdGhlIHJlcGxpY2EgaXMgdXNpbmcgdG8KIyAgIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMuCiMKIyBIb3dldmVyIHdoZW4gcG9ydCBmb3J3YXJkaW5nIG9yIE5ldHdvcmsgQWRkcmVzcyBUcmFuc2xhdGlvbiAoTkFUKSBpcwojIHVzZWQsIHRoZSByZXBsaWNhIG1heSBiZSBhY3R1YWxseSByZWFjaGFibGUgdmlhIGRpZmZlcmVudCBJUCBhbmQgcG9ydAojIHBhaXJzLiBUaGUgZm9sbG93aW5nIHR3byBvcHRpb25zIGNhbiBiZSB1c2VkIGJ5IGEgcmVwbGljYSBpbiBvcmRlciB0bwojIHJlcG9ydCB0byBpdHMgbWFzdGVyIGEgc3BlY2lmaWMgc2V0IG9mIElQIGFuZCBwb3J0LCBzbyB0aGF0IGJvdGggSU5GTwojIGFuZCBST0xFIHdpbGwgcmVwb3J0IHRob3NlIHZhbHVlcy4KIwojIFRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGJvdGggdGhlIG9wdGlvbnMgaWYgeW91IG5lZWQgdG8gb3ZlcnJpZGUganVzdAojIHRoZSBwb3J0IG9yIHRoZSBJUCBhZGRyZXNzLgojCiMgcmVwbGljYS1hbm5vdW5jZS1pcCA1LjUuNS41CiMgcmVwbGljYS1hbm5vdW5jZS1wb3J0IDEyMzQKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU0VDVVJJVFkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgUmVxdWlyZSBjbGllbnRzIHRvIGlzc3VlIEFVVEggPFBBU1NXT1JEPiBiZWZvcmUgcHJvY2Vzc2luZyBhbnkgb3RoZXIKIyBjb21tYW5kcy4gIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGluIGVudmlyb25tZW50cyBpbiB3aGljaCB5b3UgZG8gbm90IHRydXN0CiMgb3RoZXJzIHdpdGggYWNjZXNzIHRvIHRoZSBob3N0IHJ1bm5pbmcgcmVkaXMtc2VydmVyLgojCiMgVGhpcyBzaG91bGQgc3RheSBjb21tZW50ZWQgb3V0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZCBiZWNhdXNlIG1vc3QKIyBwZW9wbGUgZG8gbm90IG5lZWQgYXV0aCAoZS5nLiB0aGV5IHJ1biB0aGVpciBvd24gc2VydmVycykuCiMKIyBXYXJuaW5nOiBzaW5jZSBSZWRpcyBpcyBwcmV0dHkgZmFzdCBhbiBvdXRzaWRlIHVzZXIgY2FuIHRyeSB1cCB0bwojIDE1MGsgcGFzc3dvcmRzIHBlciBzZWNvbmQgYWdhaW5zdCBhIGdvb2QgYm94LiBUaGlzIG1lYW5zIHRoYXQgeW91IHNob3VsZAojIHVzZSBhIHZlcnkgc3Ryb25nIHBhc3N3b3JkIG90aGVyd2lzZSBpdCB3aWxsIGJlIHZlcnkgZWFzeSB0byBicmVhay4KIwogcmVxdWlyZXBhc3MgbGpwMDMwODM4CgojIENvbW1hbmQgcmVuYW1pbmcuCiMKIyBJdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgZGFuZ2Vyb3VzIGNvbW1hbmRzIGluIGEgc2hhcmVkCiMgZW52aXJvbm1lbnQuIEZvciBpbnN0YW5jZSB0aGUgQ09ORklHIGNvbW1hbmQgbWF5IGJlIHJlbmFtZWQgaW50byBzb21ldGhpbmcKIyBoYXJkIHRvIGd1ZXNzIHNvIHRoYXQgaXQgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUgZm9yIGludGVybmFsLXVzZSB0b29scwojIGJ1dCBub3QgYXZhaWxhYmxlIGZvciBnZW5lcmFsIGNsaWVudHMuCiMKIyBFeGFtcGxlOgojCiMgcmVuYW1lLWNvbW1hbmQgQ09ORklHIGI4NDBmYzAyZDUyNDA0NTQyOTk0MWNjMTVmNTllNDFjYjdiZTZjNTIKIwojIEl0IGlzIGFsc28gcG9zc2libGUgdG8gY29tcGxldGVseSBraWxsIGEgY29tbWFuZCBieSByZW5hbWluZyBpdCBpbnRvCiMgYW4gZW1wdHkgc3RyaW5nOgojCiMgcmVuYW1lLWNvbW1hbmQgQ09ORklHICIiCiMKIyBQbGVhc2Ugbm90ZSB0aGF0IGNoYW5naW5nIHRoZSBuYW1lIG9mIGNvbW1hbmRzIHRoYXQgYXJlIGxvZ2dlZCBpbnRvIHRoZQojIEFPRiBmaWxlIG9yIHRyYW5zbWl0dGVkIHRvIHJlcGxpY2FzIG1heSBjYXVzZSBwcm9ibGVtcy4KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENMSUVOVFMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIFNldCB0aGUgbWF4IG51bWJlciBvZiBjb25uZWN0ZWQgY2xpZW50cyBhdCB0aGUgc2FtZSB0aW1lLiBCeSBkZWZhdWx0CiMgdGhpcyBsaW1pdCBpcyBzZXQgdG8gMTAwMDAgY2xpZW50cywgaG93ZXZlciBpZiB0aGUgUmVkaXMgc2VydmVyIGlzIG5vdAojIGFibGUgdG8gY29uZmlndXJlIHRoZSBwcm9jZXNzIGZpbGUgbGltaXQgdG8gYWxsb3cgZm9yIHRoZSBzcGVjaWZpZWQgbGltaXQKIyB0aGUgbWF4IG51bWJlciBvZiBhbGxvd2VkIGNsaWVudHMgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGZpbGUgbGltaXQKIyBtaW51cyAzMiAoYXMgUmVkaXMgcmVzZXJ2ZXMgYSBmZXcgZmlsZSBkZXNjcmlwdG9ycyBmb3IgaW50ZXJuYWwgdXNlcykuCiMKIyBPbmNlIHRoZSBsaW1pdCBpcyByZWFjaGVkIFJlZGlzIHdpbGwgY2xvc2UgYWxsIHRoZSBuZXcgY29ubmVjdGlvbnMgc2VuZGluZwojIGFuIGVycm9yICdtYXggbnVtYmVyIG9mIGNsaWVudHMgcmVhY2hlZCcuCiMKIyBtYXhjbGllbnRzIDEwMDAwCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTUVNT1JZIE1BTkFHRU1FTlQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgU2V0IGEgbWVtb3J5IHVzYWdlIGxpbWl0IHRvIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzLgojIFdoZW4gdGhlIG1lbW9yeSBsaW1pdCBpcyByZWFjaGVkIFJlZGlzIHdpbGwgdHJ5IHRvIHJlbW92ZSBrZXlzCiMgYWNjb3JkaW5nIHRvIHRoZSBldmljdGlvbiBwb2xpY3kgc2VsZWN0ZWQgKHNlZSBtYXhtZW1vcnktcG9saWN5KS4KIwojIElmIFJlZGlzIGNhbid0IHJlbW92ZSBrZXlzIGFjY29yZGluZyB0byB0aGUgcG9saWN5LCBvciBpZiB0aGUgcG9saWN5IGlzCiMgc2V0IHRvICdub2V2aWN0aW9uJywgUmVkaXMgd2lsbCBzdGFydCB0byByZXBseSB3aXRoIGVycm9ycyB0byBjb21tYW5kcwojIHRoYXQgd291bGQgdXNlIG1vcmUgbWVtb3J5LCBsaWtlIFNFVCwgTFBVU0gsIGFuZCBzbyBvbiwgYW5kIHdpbGwgY29udGludWUKIyB0byByZXBseSB0byByZWFkLW9ubHkgY29tbWFuZHMgbGlrZSBHRVQuCiMKIyBUaGlzIG9wdGlvbiBpcyB1c3VhbGx5IHVzZWZ1bCB3aGVuIHVzaW5nIFJlZGlzIGFzIGFuIExSVSBvciBMRlUgY2FjaGUsIG9yIHRvCiMgc2V0IGEgaGFyZCBtZW1vcnkgbGltaXQgZm9yIGFuIGluc3RhbmNlICh1c2luZyB0aGUgJ25vZXZpY3Rpb24nIHBvbGljeSkuCiMKIyBXQVJOSU5HOiBJZiB5b3UgaGF2ZSByZXBsaWNhcyBhdHRhY2hlZCB0byBhbiBpbnN0YW5jZSB3aXRoIG1heG1lbW9yeSBvbiwKIyB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlcnMgbmVlZGVkIHRvIGZlZWQgdGhlIHJlcGxpY2FzIGFyZSBzdWJ0cmFjdGVkCiMgZnJvbSB0aGUgdXNlZCBtZW1vcnkgY291bnQsIHNvIHRoYXQgbmV0d29yayBwcm9ibGVtcyAvIHJlc3luY3Mgd2lsbAojIG5vdCB0cmlnZ2VyIGEgbG9vcCB3aGVyZSBrZXlzIGFyZSBldmljdGVkLCBhbmQgaW4gdHVybiB0aGUgb3V0cHV0CiMgYnVmZmVyIG9mIHJlcGxpY2FzIGlzIGZ1bGwgd2l0aCBERUxzIG9mIGtleXMgZXZpY3RlZCB0cmlnZ2VyaW5nIHRoZSBkZWxldGlvbgojIG9mIG1vcmUga2V5cywgYW5kIHNvIGZvcnRoIHVudGlsIHRoZSBkYXRhYmFzZSBpcyBjb21wbGV0ZWx5IGVtcHRpZWQuCiMKIyBJbiBzaG9ydC4uLiBpZiB5b3UgaGF2ZSByZXBsaWNhcyBhdHRhY2hlZCBpdCBpcyBzdWdnZXN0ZWQgdGhhdCB5b3Ugc2V0IGEgbG93ZXIKIyBsaW1pdCBmb3IgbWF4bWVtb3J5IHNvIHRoYXQgdGhlcmUgaXMgc29tZSBmcmVlIFJBTSBvbiB0aGUgc3lzdGVtIGZvciByZXBsaWNhCiMgb3V0cHV0IGJ1ZmZlcnMgKGJ1dCB0aGlzIGlzIG5vdCBuZWVkZWQgaWYgdGhlIHBvbGljeSBpcyAnbm9ldmljdGlvbicpLgojCiBtYXhtZW1vcnkgNjBNCgojIE1BWE1FTU9SWSBQT0xJQ1k6IGhvdyBSZWRpcyB3aWxsIHNlbGVjdCB3aGF0IHRvIHJlbW92ZSB3aGVuIG1heG1lbW9yeQojIGlzIHJlYWNoZWQuIFlvdSBjYW4gc2VsZWN0IGFtb25nIGZpdmUgYmVoYXZpb3JzOgojCiMgdm9sYXRpbGUtbHJ1IC0+IEV2aWN0IHVzaW5nIGFwcHJveGltYXRlZCBMUlUgYW1vbmcgdGhlIGtleXMgd2l0aCBhbiBleHBpcmUgc2V0LgojIGFsbGtleXMtbHJ1IC0+IEV2aWN0IGFueSBrZXkgdXNpbmcgYXBwcm94aW1hdGVkIExSVS4KIyB2b2xhdGlsZS1sZnUgLT4gRXZpY3QgdXNpbmcgYXBwcm94aW1hdGVkIExGVSBhbW9uZyB0aGUga2V5cyB3aXRoIGFuIGV4cGlyZSBzZXQuCiMgYWxsa2V5cy1sZnUgLT4gRXZpY3QgYW55IGtleSB1c2luZyBhcHByb3hpbWF0ZWQgTEZVLgojIHZvbGF0aWxlLXJhbmRvbSAtPiBSZW1vdmUgYSByYW5kb20ga2V5IGFtb25nIHRoZSBvbmVzIHdpdGggYW4gZXhwaXJlIHNldC4KIyBhbGxrZXlzLXJhbmRvbSAtPiBSZW1vdmUgYSByYW5kb20ga2V5LCBhbnkga2V5LgojIHZvbGF0aWxlLXR0bCAtPiBSZW1vdmUgdGhlIGtleSB3aXRoIHRoZSBuZWFyZXN0IGV4cGlyZSB0aW1lIChtaW5vciBUVEwpCiMgbm9ldmljdGlvbiAtPiBEb24ndCBldmljdCBhbnl0aGluZywganVzdCByZXR1cm4gYW4gZXJyb3Igb24gd3JpdGUgb3BlcmF0aW9ucy4KIwojIExSVSBtZWFucyBMZWFzdCBSZWNlbnRseSBVc2VkCiMgTEZVIG1lYW5zIExlYXN0IEZyZXF1ZW50bHkgVXNlZAojCiMgQm90aCBMUlUsIExGVSBhbmQgdm9sYXRpbGUtdHRsIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhcHByb3hpbWF0ZWQKIyByYW5kb21pemVkIGFsZ29yaXRobXMuCiMKIyBOb3RlOiB3aXRoIGFueSBvZiB0aGUgYWJvdmUgcG9saWNpZXMsIFJlZGlzIHdpbGwgcmV0dXJuIGFuIGVycm9yIG9uIHdyaXRlCiMgICAgICAgb3BlcmF0aW9ucywgd2hlbiB0aGVyZSBhcmUgbm8gc3VpdGFibGUga2V5cyBmb3IgZXZpY3Rpb24uCiMKIyAgICAgICBBdCB0aGUgZGF0ZSBvZiB3cml0aW5nIHRoZXNlIGNvbW1hbmRzIGFyZTogc2V0IHNldG54IHNldGV4IGFwcGVuZAojICAgICAgIGluY3IgZGVjciBycHVzaCBscHVzaCBycHVzaHggbHB1c2h4IGxpbnNlcnQgbHNldCBycG9wbHB1c2ggc2FkZAojICAgICAgIHNpbnRlciBzaW50ZXJzdG9yZSBzdW5pb24gc3VuaW9uc3RvcmUgc2RpZmYgc2RpZmZzdG9yZSB6YWRkIHppbmNyYnkKIyAgICAgICB6dW5pb25zdG9yZSB6aW50ZXJzdG9yZSBoc2V0IGhzZXRueCBobXNldCBoaW5jcmJ5IGluY3JieSBkZWNyYnkKIyAgICAgICBnZXRzZXQgbXNldCBtc2V0bnggZXhlYyBzb3J0CiMKIyBUaGUgZGVmYXVsdCBpczoKIwogbWF4bWVtb3J5LXBvbGljeSBhbGxrZXlzLWxydQoKIyBMUlUsIExGVSBhbmQgbWluaW1hbCBUVEwgYWxnb3JpdGhtcyBhcmUgbm90IHByZWNpc2UgYWxnb3JpdGhtcyBidXQgYXBwcm94aW1hdGVkCiMgYWxnb3JpdGhtcyAoaW4gb3JkZXIgdG8gc2F2ZSBtZW1vcnkpLCBzbyB5b3UgY2FuIHR1bmUgaXQgZm9yIHNwZWVkIG9yCiMgYWNjdXJhY3kuIEZvciBkZWZhdWx0IFJlZGlzIHdpbGwgY2hlY2sgZml2ZSBrZXlzIGFuZCBwaWNrIHRoZSBvbmUgdGhhdCB3YXMKIyB1c2VkIGxlc3MgcmVjZW50bHksIHlvdSBjYW4gY2hhbmdlIHRoZSBzYW1wbGUgc2l6ZSB1c2luZyB0aGUgZm9sbG93aW5nCiMgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUuCiMKIyBUaGUgZGVmYXVsdCBvZiA1IHByb2R1Y2VzIGdvb2QgZW5vdWdoIHJlc3VsdHMuIDEwIEFwcHJveGltYXRlcyB2ZXJ5IGNsb3NlbHkKIyB0cnVlIExSVSBidXQgY29zdHMgbW9yZSBDUFUuIDMgaXMgZmFzdGVyIGJ1dCBub3QgdmVyeSBhY2N1cmF0ZS4KIwojIG1heG1lbW9yeS1zYW1wbGVzIDUKCiMgU3RhcnRpbmcgZnJvbSBSZWRpcyA1LCBieSBkZWZhdWx0IGEgcmVwbGljYSB3aWxsIGlnbm9yZSBpdHMgbWF4bWVtb3J5IHNldHRpbmcKIyAodW5sZXNzIGl0IGlzIHByb21vdGVkIHRvIG1hc3RlciBhZnRlciBhIGZhaWxvdmVyIG9yIG1hbnVhbGx5KS4gSXQgbWVhbnMKIyB0aGF0IHRoZSBldmljdGlvbiBvZiBrZXlzIHdpbGwgYmUganVzdCBoYW5kbGVkIGJ5IHRoZSBtYXN0ZXIsIHNlbmRpbmcgdGhlCiMgREVMIGNvbW1hbmRzIHRvIHRoZSByZXBsaWNhIGFzIGtleXMgZXZpY3QgaW4gdGhlIG1hc3RlciBzaWRlLgojCiMgVGhpcyBiZWhhdmlvciBlbnN1cmVzIHRoYXQgbWFzdGVycyBhbmQgcmVwbGljYXMgc3RheSBjb25zaXN0ZW50LCBhbmQgaXMgdXN1YWxseQojIHdoYXQgeW91IHdhbnQsIGhvd2V2ZXIgaWYgeW91ciByZXBsaWNhIGlzIHdyaXRhYmxlLCBvciB5b3Ugd2FudCB0aGUgcmVwbGljYSB0byBoYXZlCiMgYSBkaWZmZXJlbnQgbWVtb3J5IHNldHRpbmcsIGFuZCB5b3UgYXJlIHN1cmUgYWxsIHRoZSB3cml0ZXMgcGVyZm9ybWVkIHRvIHRoZQojIHJlcGxpY2EgYXJlIGlkZW1wb3RlbnQsIHRoZW4geW91IG1heSBjaGFuZ2UgdGhpcyBkZWZhdWx0IChidXQgYmUgc3VyZSB0byB1bmRlcnN0YW5kCiMgd2hhdCB5b3UgYXJlIGRvaW5nKS4KIwojIE5vdGUgdGhhdCBzaW5jZSB0aGUgcmVwbGljYSBieSBkZWZhdWx0IGRvZXMgbm90IGV2aWN0LCBpdCBtYXkgZW5kIHVzaW5nIG1vcmUKIyBtZW1vcnkgdGhhbiB0aGUgb25lIHNldCB2aWEgbWF4bWVtb3J5ICh0aGVyZSBhcmUgY2VydGFpbiBidWZmZXJzIHRoYXQgbWF5CiMgYmUgbGFyZ2VyIG9uIHRoZSByZXBsaWNhLCBvciBkYXRhIHN0cnVjdHVyZXMgbWF5IHNvbWV0aW1lcyB0YWtlIG1vcmUgbWVtb3J5IGFuZCBzbwojIGZvcnRoKS4gU28gbWFrZSBzdXJlIHlvdSBtb25pdG9yIHlvdXIgcmVwbGljYXMgYW5kIG1ha2Ugc3VyZSB0aGV5IGhhdmUgZW5vdWdoCiMgbWVtb3J5IHRvIG5ldmVyIGhpdCBhIHJlYWwgb3V0LW9mLW1lbW9yeSBjb25kaXRpb24gYmVmb3JlIHRoZSBtYXN0ZXIgaGl0cwojIHRoZSBjb25maWd1cmVkIG1heG1lbW9yeSBzZXR0aW5nLgojCiMgcmVwbGljYS1pZ25vcmUtbWF4bWVtb3J5IHllcwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTEFaWSBGUkVFSU5HICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBSZWRpcyBoYXMgdHdvIHByaW1pdGl2ZXMgdG8gZGVsZXRlIGtleXMuIE9uZSBpcyBjYWxsZWQgREVMIGFuZCBpcyBhIGJsb2NraW5nCiMgZGVsZXRpb24gb2YgdGhlIG9iamVjdC4gSXQgbWVhbnMgdGhhdCB0aGUgc2VydmVyIHN0b3BzIHByb2Nlc3NpbmcgbmV3IGNvbW1hbmRzCiMgaW4gb3JkZXIgdG8gcmVjbGFpbSBhbGwgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0IGluIGEgc3luY2hyb25vdXMKIyB3YXkuIElmIHRoZSBrZXkgZGVsZXRlZCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzbWFsbCBvYmplY3QsIHRoZSB0aW1lIG5lZWRlZAojIGluIG9yZGVyIHRvIGV4ZWN1dGUgdGhlIERFTCBjb21tYW5kIGlzIHZlcnkgc21hbGwgYW5kIGNvbXBhcmFibGUgdG8gbW9zdCBvdGhlcgojIE8oMSkgb3IgTyhsb2dfTikgY29tbWFuZHMgaW4gUmVkaXMuIEhvd2V2ZXIgaWYgdGhlIGtleSBpcyBhc3NvY2lhdGVkIHdpdGggYW4KIyBhZ2dyZWdhdGVkIHZhbHVlIGNvbnRhaW5pbmcgbWlsbGlvbnMgb2YgZWxlbWVudHMsIHRoZSBzZXJ2ZXIgY2FuIGJsb2NrIGZvcgojIGEgbG9uZyB0aW1lIChldmVuIHNlY29uZHMpIGluIG9yZGVyIHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24uCiMKIyBGb3IgdGhlIGFib3ZlIHJlYXNvbnMgUmVkaXMgYWxzbyBvZmZlcnMgbm9uIGJsb2NraW5nIGRlbGV0aW9uIHByaW1pdGl2ZXMKIyBzdWNoIGFzIFVOTElOSyAobm9uIGJsb2NraW5nIERFTCkgYW5kIHRoZSBBU1lOQyBvcHRpb24gb2YgRkxVU0hBTEwgYW5kCiMgRkxVU0hEQiBjb21tYW5kcywgaW4gb3JkZXIgdG8gcmVjbGFpbSBtZW1vcnkgaW4gYmFja2dyb3VuZC4gVGhvc2UgY29tbWFuZHMKIyBhcmUgZXhlY3V0ZWQgaW4gY29uc3RhbnQgdGltZS4gQW5vdGhlciB0aHJlYWQgd2lsbCBpbmNyZW1lbnRhbGx5IGZyZWUgdGhlCiMgb2JqZWN0IGluIHRoZSBiYWNrZ3JvdW5kIGFzIGZhc3QgYXMgcG9zc2libGUuCiMKIyBERUwsIFVOTElOSyBhbmQgQVNZTkMgb3B0aW9uIG9mIEZMVVNIQUxMIGFuZCBGTFVTSERCIGFyZSB1c2VyLWNvbnRyb2xsZWQuCiMgSXQncyB1cCB0byB0aGUgZGVzaWduIG9mIHRoZSBhcHBsaWNhdGlvbiB0byB1bmRlcnN0YW5kIHdoZW4gaXQgaXMgYSBnb29kCiMgaWRlYSB0byB1c2Ugb25lIG9yIHRoZSBvdGhlci4gSG93ZXZlciB0aGUgUmVkaXMgc2VydmVyIHNvbWV0aW1lcyBoYXMgdG8KIyBkZWxldGUga2V5cyBvciBmbHVzaCB0aGUgd2hvbGUgZGF0YWJhc2UgYXMgYSBzaWRlIGVmZmVjdCBvZiBvdGhlciBvcGVyYXRpb25zLgojIFNwZWNpZmljYWxseSBSZWRpcyBkZWxldGVzIG9iamVjdHMgaW5kZXBlbmRlbnRseSBvZiBhIHVzZXIgY2FsbCBpbiB0aGUKIyBmb2xsb3dpbmcgc2NlbmFyaW9zOgojCiMgMSkgT24gZXZpY3Rpb24sIGJlY2F1c2Ugb2YgdGhlIG1heG1lbW9yeSBhbmQgbWF4bWVtb3J5IHBvbGljeSBjb25maWd1cmF0aW9ucywKIyAgICBpbiBvcmRlciB0byBtYWtlIHJvb20gZm9yIG5ldyBkYXRhLCB3aXRob3V0IGdvaW5nIG92ZXIgdGhlIHNwZWNpZmllZAojICAgIG1lbW9yeSBsaW1pdC4KIyAyKSBCZWNhdXNlIG9mIGV4cGlyZTogd2hlbiBhIGtleSB3aXRoIGFuIGFzc29jaWF0ZWQgdGltZSB0byBsaXZlIChzZWUgdGhlCiMgICAgRVhQSVJFIGNvbW1hbmQpIG11c3QgYmUgZGVsZXRlZCBmcm9tIG1lbW9yeS4KIyAzKSBCZWNhdXNlIG9mIGEgc2lkZSBlZmZlY3Qgb2YgYSBjb21tYW5kIHRoYXQgc3RvcmVzIGRhdGEgb24gYSBrZXkgdGhhdCBtYXkKIyAgICBhbHJlYWR5IGV4aXN0LiBGb3IgZXhhbXBsZSB0aGUgUkVOQU1FIGNvbW1hbmQgbWF5IGRlbGV0ZSB0aGUgb2xkIGtleQojICAgIGNvbnRlbnQgd2hlbiBpdCBpcyByZXBsYWNlZCB3aXRoIGFub3RoZXIgb25lLiBTaW1pbGFybHkgU1VOSU9OU1RPUkUKIyAgICBvciBTT1JUIHdpdGggU1RPUkUgb3B0aW9uIG1heSBkZWxldGUgZXhpc3Rpbmcga2V5cy4gVGhlIFNFVCBjb21tYW5kCiMgICAgaXRzZWxmIHJlbW92ZXMgYW55IG9sZCBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQga2V5IGluIG9yZGVyIHRvIHJlcGxhY2UKIyAgICBpdCB3aXRoIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgojIDQpIER1cmluZyByZXBsaWNhdGlvbiwgd2hlbiBhIHJlcGxpY2EgcGVyZm9ybXMgYSBmdWxsIHJlc3luY2hyb25pemF0aW9uIHdpdGgKIyAgICBpdHMgbWFzdGVyLCB0aGUgY29udGVudCBvZiB0aGUgd2hvbGUgZGF0YWJhc2UgaXMgcmVtb3ZlZCBpbiBvcmRlciB0bwojICAgIGxvYWQgdGhlIFJEQiBmaWxlIGp1c3QgdHJhbnNmZXJyZWQuCiMKIyBJbiBhbGwgdGhlIGFib3ZlIGNhc2VzIHRoZSBkZWZhdWx0IGlzIHRvIGRlbGV0ZSBvYmplY3RzIGluIGEgYmxvY2tpbmcgd2F5LAojIGxpa2UgaWYgREVMIHdhcyBjYWxsZWQuIEhvd2V2ZXIgeW91IGNhbiBjb25maWd1cmUgZWFjaCBjYXNlIHNwZWNpZmljYWxseQojIGluIG9yZGVyIHRvIGluc3RlYWQgcmVsZWFzZSBtZW1vcnkgaW4gYSBub24tYmxvY2tpbmcgd2F5IGxpa2UgaWYgVU5MSU5LCiMgd2FzIGNhbGxlZCwgdXNpbmcgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXM6CgpsYXp5ZnJlZS1sYXp5LWV2aWN0aW9uIG5vCmxhenlmcmVlLWxhenktZXhwaXJlIG5vCmxhenlmcmVlLWxhenktc2VydmVyLWRlbCBubwpyZXBsaWNhLWxhenktZmx1c2ggbm8KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBUFBFTkQgT05MWSBNT0RFICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgQnkgZGVmYXVsdCBSZWRpcyBhc3luY2hyb25vdXNseSBkdW1wcyB0aGUgZGF0YXNldCBvbiBkaXNrLiBUaGlzIG1vZGUgaXMKIyBnb29kIGVub3VnaCBpbiBtYW55IGFwcGxpY2F0aW9ucywgYnV0IGFuIGlzc3VlIHdpdGggdGhlIFJlZGlzIHByb2Nlc3Mgb3IKIyBhIHBvd2VyIG91dGFnZSBtYXkgcmVzdWx0IGludG8gYSBmZXcgbWludXRlcyBvZiB3cml0ZXMgbG9zdCAoZGVwZW5kaW5nIG9uCiMgdGhlIGNvbmZpZ3VyZWQgc2F2ZSBwb2ludHMpLgojCiMgVGhlIEFwcGVuZCBPbmx5IEZpbGUgaXMgYW4gYWx0ZXJuYXRpdmUgcGVyc2lzdGVuY2UgbW9kZSB0aGF0IHByb3ZpZGVzCiMgbXVjaCBiZXR0ZXIgZHVyYWJpbGl0eS4gRm9yIGluc3RhbmNlIHVzaW5nIHRoZSBkZWZhdWx0IGRhdGEgZnN5bmMgcG9saWN5CiMgKHNlZSBsYXRlciBpbiB0aGUgY29uZmlnIGZpbGUpIFJlZGlzIGNhbiBsb3NlIGp1c3Qgb25lIHNlY29uZCBvZiB3cml0ZXMgaW4gYQojIGRyYW1hdGljIGV2ZW50IGxpa2UgYSBzZXJ2ZXIgcG93ZXIgb3V0YWdlLCBvciBhIHNpbmdsZSB3cml0ZSBpZiBzb21ldGhpbmcKIyB3cm9uZyB3aXRoIHRoZSBSZWRpcyBwcm9jZXNzIGl0c2VsZiBoYXBwZW5zLCBidXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMKIyBzdGlsbCBydW5uaW5nIGNvcnJlY3RseS4KIwojIEFPRiBhbmQgUkRCIHBlcnNpc3RlbmNlIGNhbiBiZSBlbmFibGVkIGF0IHRoZSBzYW1lIHRpbWUgd2l0aG91dCBwcm9ibGVtcy4KIyBJZiB0aGUgQU9GIGlzIGVuYWJsZWQgb24gc3RhcnR1cCBSZWRpcyB3aWxsIGxvYWQgdGhlIEFPRiwgdGhhdCBpcyB0aGUgZmlsZQojIHdpdGggdGhlIGJldHRlciBkdXJhYmlsaXR5IGd1YXJhbnRlZXMuCiMKIyBQbGVhc2UgY2hlY2sgaHR0cDovL3JlZGlzLmlvL3RvcGljcy9wZXJzaXN0ZW5jZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCmFwcGVuZG9ubHkgbm8KCiMgVGhlIG5hbWUgb2YgdGhlIGFwcGVuZCBvbmx5IGZpbGUgKGRlZmF1bHQ6ICJhcHBlbmRvbmx5LmFvZiIpCgphcHBlbmRmaWxlbmFtZSAiYXBwZW5kb25seS5hb2YiCgojIFRoZSBmc3luYygpIGNhbGwgdGVsbHMgdGhlIE9wZXJhdGluZyBTeXN0ZW0gdG8gYWN0dWFsbHkgd3JpdGUgZGF0YSBvbiBkaXNrCiMgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBtb3JlIGRhdGEgaW4gdGhlIG91dHB1dCBidWZmZXIuIFNvbWUgT1Mgd2lsbCByZWFsbHkgZmx1c2gKIyBkYXRhIG9uIGRpc2ssIHNvbWUgb3RoZXIgT1Mgd2lsbCBqdXN0IHRyeSB0byBkbyBpdCBBU0FQLgojCiMgUmVkaXMgc3VwcG9ydHMgdGhyZWUgZGlmZmVyZW50IG1vZGVzOgojCiMgbm86IGRvbid0IGZzeW5jLCBqdXN0IGxldCB0aGUgT1MgZmx1c2ggdGhlIGRhdGEgd2hlbiBpdCB3YW50cy4gRmFzdGVyLgojIGFsd2F5czogZnN5bmMgYWZ0ZXIgZXZlcnkgd3JpdGUgdG8gdGhlIGFwcGVuZCBvbmx5IGxvZy4gU2xvdywgU2FmZXN0LgojIGV2ZXJ5c2VjOiBmc3luYyBvbmx5IG9uZSB0aW1lIGV2ZXJ5IHNlY29uZC4gQ29tcHJvbWlzZS4KIwojIFRoZSBkZWZhdWx0IGlzICJldmVyeXNlYyIsIGFzIHRoYXQncyB1c3VhbGx5IHRoZSByaWdodCBjb21wcm9taXNlIGJldHdlZW4KIyBzcGVlZCBhbmQgZGF0YSBzYWZldHkuIEl0J3MgdXAgdG8geW91IHRvIHVuZGVyc3RhbmQgaWYgeW91IGNhbiByZWxheCB0aGlzIHRvCiMgIm5vIiB0aGF0IHdpbGwgbGV0IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyIHdoZW4KIyBpdCB3YW50cywgZm9yIGJldHRlciBwZXJmb3JtYW5jZXMgKGJ1dCBpZiB5b3UgY2FuIGxpdmUgd2l0aCB0aGUgaWRlYSBvZgojIHNvbWUgZGF0YSBsb3NzIGNvbnNpZGVyIHRoZSBkZWZhdWx0IHBlcnNpc3RlbmNlIG1vZGUgdGhhdCdzIHNuYXBzaG90dGluZyksCiMgb3Igb24gdGhlIGNvbnRyYXJ5LCB1c2UgImFsd2F5cyIgdGhhdCdzIHZlcnkgc2xvdyBidXQgYSBiaXQgc2FmZXIgdGhhbgojIGV2ZXJ5c2VjLgojCiMgTW9yZSBkZXRhaWxzIHBsZWFzZSBjaGVjayB0aGUgZm9sbG93aW5nIGFydGljbGU6CiMgaHR0cDovL2FudGlyZXouY29tL3Bvc3QvcmVkaXMtcGVyc2lzdGVuY2UtZGVteXN0aWZpZWQuaHRtbAojCiMgSWYgdW5zdXJlLCB1c2UgImV2ZXJ5c2VjIi4KCiMgYXBwZW5kZnN5bmMgYWx3YXlzCmFwcGVuZGZzeW5jIGV2ZXJ5c2VjCiMgYXBwZW5kZnN5bmMgbm8KCiMgV2hlbiB0aGUgQU9GIGZzeW5jIHBvbGljeSBpcyBzZXQgdG8gYWx3YXlzIG9yIGV2ZXJ5c2VjLCBhbmQgYSBiYWNrZ3JvdW5kCiMgc2F2aW5nIHByb2Nlc3MgKGEgYmFja2dyb3VuZCBzYXZlIG9yIEFPRiBsb2cgYmFja2dyb3VuZCByZXdyaXRpbmcpIGlzCiMgcGVyZm9ybWluZyBhIGxvdCBvZiBJL08gYWdhaW5zdCB0aGUgZGlzaywgaW4gc29tZSBMaW51eCBjb25maWd1cmF0aW9ucwojIFJlZGlzIG1heSBibG9jayB0b28gbG9uZyBvbiB0aGUgZnN5bmMoKSBjYWxsLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gZml4IGZvcgojIHRoaXMgY3VycmVudGx5LCBhcyBldmVuIHBlcmZvcm1pbmcgZnN5bmMgaW4gYSBkaWZmZXJlbnQgdGhyZWFkIHdpbGwgYmxvY2sKIyBvdXIgc3luY2hyb25vdXMgd3JpdGUoMikgY2FsbC4KIwojIEluIG9yZGVyIHRvIG1pdGlnYXRlIHRoaXMgcHJvYmxlbSBpdCdzIHBvc3NpYmxlIHRvIHVzZSB0aGUgZm9sbG93aW5nIG9wdGlvbgojIHRoYXQgd2lsbCBwcmV2ZW50IGZzeW5jKCkgZnJvbSBiZWluZyBjYWxsZWQgaW4gdGhlIG1haW4gcHJvY2VzcyB3aGlsZSBhCiMgQkdTQVZFIG9yIEJHUkVXUklURUFPRiBpcyBpbiBwcm9ncmVzcy4KIwojIFRoaXMgbWVhbnMgdGhhdCB3aGlsZSBhbm90aGVyIGNoaWxkIGlzIHNhdmluZywgdGhlIGR1cmFiaWxpdHkgb2YgUmVkaXMgaXMKIyB0aGUgc2FtZSBhcyAiYXBwZW5kZnN5bmMgbm9uZSIuIEluIHByYWN0aWNhbCB0ZXJtcywgdGhpcyBtZWFucyB0aGF0IGl0IGlzCiMgcG9zc2libGUgdG8gbG9zZSB1cCB0byAzMCBzZWNvbmRzIG9mIGxvZyBpbiB0aGUgd29yc3Qgc2NlbmFyaW8gKHdpdGggdGhlCiMgZGVmYXVsdCBMaW51eCBzZXR0aW5ncykuCiMKIyBJZiB5b3UgaGF2ZSBsYXRlbmN5IHByb2JsZW1zIHR1cm4gdGhpcyB0byAieWVzIi4gT3RoZXJ3aXNlIGxlYXZlIGl0IGFzCiMgIm5vIiB0aGF0IGlzIHRoZSBzYWZlc3QgcGljayBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIGR1cmFiaWxpdHkuCgpuby1hcHBlbmRmc3luYy1vbi1yZXdyaXRlIG5vCgojIEF1dG9tYXRpYyByZXdyaXRlIG9mIHRoZSBhcHBlbmQgb25seSBmaWxlLgojIFJlZGlzIGlzIGFibGUgdG8gYXV0b21hdGljYWxseSByZXdyaXRlIHRoZSBsb2cgZmlsZSBpbXBsaWNpdGx5IGNhbGxpbmcKIyBCR1JFV1JJVEVBT0Ygd2hlbiB0aGUgQU9GIGxvZyBzaXplIGdyb3dzIGJ5IHRoZSBzcGVjaWZpZWQgcGVyY2VudGFnZS4KIwojIFRoaXMgaXMgaG93IGl0IHdvcmtzOiBSZWRpcyByZW1lbWJlcnMgdGhlIHNpemUgb2YgdGhlIEFPRiBmaWxlIGFmdGVyIHRoZQojIGxhdGVzdCByZXdyaXRlIChpZiBubyByZXdyaXRlIGhhcyBoYXBwZW5lZCBzaW5jZSB0aGUgcmVzdGFydCwgdGhlIHNpemUgb2YKIyB0aGUgQU9GIGF0IHN0YXJ0dXAgaXMgdXNlZCkuCiMKIyBUaGlzIGJhc2Ugc2l6ZSBpcyBjb21wYXJlZCB0byB0aGUgY3VycmVudCBzaXplLiBJZiB0aGUgY3VycmVudCBzaXplIGlzCiMgYmlnZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBwZXJjZW50YWdlLCB0aGUgcmV3cml0ZSBpcyB0cmlnZ2VyZWQuIEFsc28KIyB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWluaW1hbCBzaXplIGZvciB0aGUgQU9GIGZpbGUgdG8gYmUgcmV3cml0dGVuLCB0aGlzCiMgaXMgdXNlZnVsIHRvIGF2b2lkIHJld3JpdGluZyB0aGUgQU9GIGZpbGUgZXZlbiBpZiB0aGUgcGVyY2VudGFnZSBpbmNyZWFzZQojIGlzIHJlYWNoZWQgYnV0IGl0IGlzIHN0aWxsIHByZXR0eSBzbWFsbC4KIwojIFNwZWNpZnkgYSBwZXJjZW50YWdlIG9mIHplcm8gaW4gb3JkZXIgdG8gZGlzYWJsZSB0aGUgYXV0b21hdGljIEFPRgojIHJld3JpdGUgZmVhdHVyZS4KCmF1dG8tYW9mLXJld3JpdGUtcGVyY2VudGFnZSAxMDAKYXV0by1hb2YtcmV3cml0ZS1taW4tc2l6ZSA2NG1iCgojIEFuIEFPRiBmaWxlIG1heSBiZSBmb3VuZCB0byBiZSB0cnVuY2F0ZWQgYXQgdGhlIGVuZCBkdXJpbmcgdGhlIFJlZGlzCiMgc3RhcnR1cCBwcm9jZXNzLCB3aGVuIHRoZSBBT0YgZGF0YSBnZXRzIGxvYWRlZCBiYWNrIGludG8gbWVtb3J5LgojIFRoaXMgbWF5IGhhcHBlbiB3aGVuIHRoZSBzeXN0ZW0gd2hlcmUgUmVkaXMgaXMgcnVubmluZwojIGNyYXNoZXMsIGVzcGVjaWFsbHkgd2hlbiBhbiBleHQ0IGZpbGVzeXN0ZW0gaXMgbW91bnRlZCB3aXRob3V0IHRoZQojIGRhdGE9b3JkZXJlZCBvcHRpb24gKGhvd2V2ZXIgdGhpcyBjYW4ndCBoYXBwZW4gd2hlbiBSZWRpcyBpdHNlbGYKIyBjcmFzaGVzIG9yIGFib3J0cyBidXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3RpbGwgd29ya3MgY29ycmVjdGx5KS4KIwojIFJlZGlzIGNhbiBlaXRoZXIgZXhpdCB3aXRoIGFuIGVycm9yIHdoZW4gdGhpcyBoYXBwZW5zLCBvciBsb2FkIGFzIG11Y2gKIyBkYXRhIGFzIHBvc3NpYmxlICh0aGUgZGVmYXVsdCBub3cpIGFuZCBzdGFydCBpZiB0aGUgQU9GIGZpbGUgaXMgZm91bmQKIyB0byBiZSB0cnVuY2F0ZWQgYXQgdGhlIGVuZC4gVGhlIGZvbGxvd2luZyBvcHRpb24gY29udHJvbHMgdGhpcyBiZWhhdmlvci4KIwojIElmIGFvZi1sb2FkLXRydW5jYXRlZCBpcyBzZXQgdG8geWVzLCBhIHRydW5jYXRlZCBBT0YgZmlsZSBpcyBsb2FkZWQgYW5kCiMgdGhlIFJlZGlzIHNlcnZlciBzdGFydHMgZW1pdHRpbmcgYSBsb2cgdG8gaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSBldmVudC4KIyBPdGhlcndpc2UgaWYgdGhlIG9wdGlvbiBpcyBzZXQgdG8gbm8sIHRoZSBzZXJ2ZXIgYWJvcnRzIHdpdGggYW4gZXJyb3IKIyBhbmQgcmVmdXNlcyB0byBzdGFydC4gV2hlbiB0aGUgb3B0aW9uIGlzIHNldCB0byBubywgdGhlIHVzZXIgcmVxdWlyZXMKIyB0byBmaXggdGhlIEFPRiBmaWxlIHVzaW5nIHRoZSAicmVkaXMtY2hlY2stYW9mIiB1dGlsaXR5IGJlZm9yZSB0byByZXN0YXJ0CiMgdGhlIHNlcnZlci4KIwojIE5vdGUgdGhhdCBpZiB0aGUgQU9GIGZpbGUgd2lsbCBiZSBmb3VuZCB0byBiZSBjb3JydXB0ZWQgaW4gdGhlIG1pZGRsZQojIHRoZSBzZXJ2ZXIgd2lsbCBzdGlsbCBleGl0IHdpdGggYW4gZXJyb3IuIFRoaXMgb3B0aW9uIG9ubHkgYXBwbGllcyB3aGVuCiMgUmVkaXMgd2lsbCB0cnkgdG8gcmVhZCBtb3JlIGRhdGEgZnJvbSB0aGUgQU9GIGZpbGUgYnV0IG5vdCBlbm91Z2ggYnl0ZXMKIyB3aWxsIGJlIGZvdW5kLgphb2YtbG9hZC10cnVuY2F0ZWQgeWVzCgojIFdoZW4gcmV3cml0aW5nIHRoZSBBT0YgZmlsZSwgUmVkaXMgaXMgYWJsZSB0byB1c2UgYW4gUkRCIHByZWFtYmxlIGluIHRoZQojIEFPRiBmaWxlIGZvciBmYXN0ZXIgcmV3cml0ZXMgYW5kIHJlY292ZXJpZXMuIFdoZW4gdGhpcyBvcHRpb24gaXMgdHVybmVkCiMgb24gdGhlIHJld3JpdHRlbiBBT0YgZmlsZSBpcyBjb21wb3NlZCBvZiB0d28gZGlmZmVyZW50IHN0YW56YXM6CiMKIyAgIFtSREIgZmlsZV1bQU9GIHRhaWxdCiMKIyBXaGVuIGxvYWRpbmcgUmVkaXMgcmVjb2duaXplcyB0aGF0IHRoZSBBT0YgZmlsZSBzdGFydHMgd2l0aCB0aGUgIlJFRElTIgojIHN0cmluZyBhbmQgbG9hZHMgdGhlIHByZWZpeGVkIFJEQiBmaWxlLCBhbmQgY29udGludWVzIGxvYWRpbmcgdGhlIEFPRgojIHRhaWwuCmFvZi11c2UtcmRiLXByZWFtYmxlIHllcwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTFVBIFNDUklQVElORyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBNYXggZXhlY3V0aW9uIHRpbWUgb2YgYSBMdWEgc2NyaXB0IGluIG1pbGxpc2Vjb25kcy4KIwojIElmIHRoZSBtYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIGlzIHJlYWNoZWQgUmVkaXMgd2lsbCBsb2cgdGhhdCBhIHNjcmlwdCBpcwojIHN0aWxsIGluIGV4ZWN1dGlvbiBhZnRlciB0aGUgbWF4aW11bSBhbGxvd2VkIHRpbWUgYW5kIHdpbGwgc3RhcnQgdG8KIyByZXBseSB0byBxdWVyaWVzIHdpdGggYW4gZXJyb3IuCiMKIyBXaGVuIGEgbG9uZyBydW5uaW5nIHNjcmlwdCBleGNlZWRzIHRoZSBtYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIG9ubHkgdGhlCiMgU0NSSVBUIEtJTEwgYW5kIFNIVVRET1dOIE5PU0FWRSBjb21tYW5kcyBhcmUgYXZhaWxhYmxlLiBUaGUgZmlyc3QgY2FuIGJlCiMgdXNlZCB0byBzdG9wIGEgc2NyaXB0IHRoYXQgZGlkIG5vdCB5ZXQgY2FsbGVkIHdyaXRlIGNvbW1hbmRzLiBUaGUgc2Vjb25kCiMgaXMgdGhlIG9ubHkgd2F5IHRvIHNodXQgZG93biB0aGUgc2VydmVyIGluIHRoZSBjYXNlIGEgd3JpdGUgY29tbWFuZCB3YXMKIyBhbHJlYWR5IGlzc3VlZCBieSB0aGUgc2NyaXB0IGJ1dCB0aGUgdXNlciBkb2Vzbid0IHdhbnQgdG8gd2FpdCBmb3IgdGhlIG5hdHVyYWwKIyB0ZXJtaW5hdGlvbiBvZiB0aGUgc2NyaXB0LgojCiMgU2V0IGl0IHRvIDAgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBmb3IgdW5saW1pdGVkIGV4ZWN1dGlvbiB3aXRob3V0IHdhcm5pbmdzLgpsdWEtdGltZS1saW1pdCA1MDAwCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSRURJUyBDTFVTVEVSICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIE5vcm1hbCBSZWRpcyBpbnN0YW5jZXMgY2FuJ3QgYmUgcGFydCBvZiBhIFJlZGlzIENsdXN0ZXI7IG9ubHkgbm9kZXMgdGhhdCBhcmUKIyBzdGFydGVkIGFzIGNsdXN0ZXIgbm9kZXMgY2FuLiBJbiBvcmRlciB0byBzdGFydCBhIFJlZGlzIGluc3RhbmNlIGFzIGEKIyBjbHVzdGVyIG5vZGUgZW5hYmxlIHRoZSBjbHVzdGVyIHN1cHBvcnQgdW5jb21tZW50aW5nIHRoZSBmb2xsb3dpbmc6CiMKIyBjbHVzdGVyLWVuYWJsZWQgeWVzCgojIEV2ZXJ5IGNsdXN0ZXIgbm9kZSBoYXMgYSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gZmlsZS4gVGhpcyBmaWxlIGlzIG5vdAojIGludGVuZGVkIHRvIGJlIGVkaXRlZCBieSBoYW5kLiBJdCBpcyBjcmVhdGVkIGFuZCB1cGRhdGVkIGJ5IFJlZGlzIG5vZGVzLgojIEV2ZXJ5IFJlZGlzIENsdXN0ZXIgbm9kZSByZXF1aXJlcyBhIGRpZmZlcmVudCBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gZmlsZS4KIyBNYWtlIHN1cmUgdGhhdCBpbnN0YW5jZXMgcnVubmluZyBpbiB0aGUgc2FtZSBzeXN0ZW0gZG8gbm90IGhhdmUKIyBvdmVybGFwcGluZyBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lcy4KIwojIGNsdXN0ZXItY29uZmlnLWZpbGUgbm9kZXMtNjM3OS5jb25mCgojIENsdXN0ZXIgbm9kZSB0aW1lb3V0IGlzIHRoZSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIGEgbm9kZSBtdXN0IGJlIHVucmVhY2hhYmxlCiMgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgaW4gZmFpbHVyZSBzdGF0ZS4KIyBNb3N0IG90aGVyIGludGVybmFsIHRpbWUgbGltaXRzIGFyZSBtdWx0aXBsZSBvZiB0aGUgbm9kZSB0aW1lb3V0LgojCiMgY2x1c3Rlci1ub2RlLXRpbWVvdXQgMTUwMDAKCiMgQSByZXBsaWNhIG9mIGEgZmFpbGluZyBtYXN0ZXIgd2lsbCBhdm9pZCB0byBzdGFydCBhIGZhaWxvdmVyIGlmIGl0cyBkYXRhCiMgbG9va3MgdG9vIG9sZC4KIwojIFRoZXJlIGlzIG5vIHNpbXBsZSB3YXkgZm9yIGEgcmVwbGljYSB0byBhY3R1YWxseSBoYXZlIGFuIGV4YWN0IG1lYXN1cmUgb2YKIyBpdHMgImRhdGEgYWdlIiwgc28gdGhlIGZvbGxvd2luZyB0d28gY2hlY2tzIGFyZSBwZXJmb3JtZWQ6CiMKIyAxKSBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgcmVwbGljYXMgYWJsZSB0byBmYWlsb3ZlciwgdGhleSBleGNoYW5nZSBtZXNzYWdlcwojICAgIGluIG9yZGVyIHRvIHRyeSB0byBnaXZlIGFuIGFkdmFudGFnZSB0byB0aGUgcmVwbGljYSB3aXRoIHRoZSBiZXN0CiMgICAgcmVwbGljYXRpb24gb2Zmc2V0IChtb3JlIGRhdGEgZnJvbSB0aGUgbWFzdGVyIHByb2Nlc3NlZCkuCiMgICAgUmVwbGljYXMgd2lsbCB0cnkgdG8gZ2V0IHRoZWlyIHJhbmsgYnkgb2Zmc2V0LCBhbmQgYXBwbHkgdG8gdGhlIHN0YXJ0CiMgICAgb2YgdGhlIGZhaWxvdmVyIGEgZGVsYXkgcHJvcG9ydGlvbmFsIHRvIHRoZWlyIHJhbmsuCiMKIyAyKSBFdmVyeSBzaW5nbGUgcmVwbGljYSBjb21wdXRlcyB0aGUgdGltZSBvZiB0aGUgbGFzdCBpbnRlcmFjdGlvbiB3aXRoCiMgICAgaXRzIG1hc3Rlci4gVGhpcyBjYW4gYmUgdGhlIGxhc3QgcGluZyBvciBjb21tYW5kIHJlY2VpdmVkIChpZiB0aGUgbWFzdGVyCiMgICAgaXMgc3RpbGwgaW4gdGhlICJjb25uZWN0ZWQiIHN0YXRlKSwgb3IgdGhlIHRpbWUgdGhhdCBlbGFwc2VkIHNpbmNlIHRoZQojICAgIGRpc2Nvbm5lY3Rpb24gd2l0aCB0aGUgbWFzdGVyIChpZiB0aGUgcmVwbGljYXRpb24gbGluayBpcyBjdXJyZW50bHkgZG93bikuCiMgICAgSWYgdGhlIGxhc3QgaW50ZXJhY3Rpb24gaXMgdG9vIG9sZCwgdGhlIHJlcGxpY2Egd2lsbCBub3QgdHJ5IHRvIGZhaWxvdmVyCiMgICAgYXQgYWxsLgojCiMgVGhlIHBvaW50ICIyIiBjYW4gYmUgdHVuZWQgYnkgdXNlci4gU3BlY2lmaWNhbGx5IGEgcmVwbGljYSB3aWxsIG5vdCBwZXJmb3JtCiMgdGhlIGZhaWxvdmVyIGlmLCBzaW5jZSB0aGUgbGFzdCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBtYXN0ZXIsIHRoZSB0aW1lCiMgZWxhcHNlZCBpcyBncmVhdGVyIHRoYW46CiMKIyAgIChub2RlLXRpbWVvdXQgKiByZXBsaWNhLXZhbGlkaXR5LWZhY3RvcikgKyByZXBsLXBpbmctcmVwbGljYS1wZXJpb2QKIwojIFNvIGZvciBleGFtcGxlIGlmIG5vZGUtdGltZW91dCBpcyAzMCBzZWNvbmRzLCBhbmQgdGhlIHJlcGxpY2EtdmFsaWRpdHktZmFjdG9yCiMgaXMgMTAsIGFuZCBhc3N1bWluZyBhIGRlZmF1bHQgcmVwbC1waW5nLXJlcGxpY2EtcGVyaW9kIG9mIDEwIHNlY29uZHMsIHRoZQojIHJlcGxpY2Egd2lsbCBub3QgdHJ5IHRvIGZhaWxvdmVyIGlmIGl0IHdhcyBub3QgYWJsZSB0byB0YWxrIHdpdGggdGhlIG1hc3RlcgojIGZvciBsb25nZXIgdGhhbiAzMTAgc2Vjb25kcy4KIwojIEEgbGFyZ2UgcmVwbGljYS12YWxpZGl0eS1mYWN0b3IgbWF5IGFsbG93IHJlcGxpY2FzIHdpdGggdG9vIG9sZCBkYXRhIHRvIGZhaWxvdmVyCiMgYSBtYXN0ZXIsIHdoaWxlIGEgdG9vIHNtYWxsIHZhbHVlIG1heSBwcmV2ZW50IHRoZSBjbHVzdGVyIGZyb20gYmVpbmcgYWJsZSB0bwojIGVsZWN0IGEgcmVwbGljYSBhdCBhbGwuCiMKIyBGb3IgbWF4aW11bSBhdmFpbGFiaWxpdHksIGl0IGlzIHBvc3NpYmxlIHRvIHNldCB0aGUgcmVwbGljYS12YWxpZGl0eS1mYWN0b3IKIyB0byBhIHZhbHVlIG9mIDAsIHdoaWNoIG1lYW5zLCB0aGF0IHJlcGxpY2FzIHdpbGwgYWx3YXlzIHRyeSB0byBmYWlsb3ZlciB0aGUKIyBtYXN0ZXIgcmVnYXJkbGVzcyBvZiB0aGUgbGFzdCB0aW1lIHRoZXkgaW50ZXJhY3RlZCB3aXRoIHRoZSBtYXN0ZXIuCiMgKEhvd2V2ZXIgdGhleSdsbCBhbHdheXMgdHJ5IHRvIGFwcGx5IGEgZGVsYXkgcHJvcG9ydGlvbmFsIHRvIHRoZWlyCiMgb2Zmc2V0IHJhbmspLgojCiMgWmVybyBpcyB0aGUgb25seSB2YWx1ZSBhYmxlIHRvIGd1YXJhbnRlZSB0aGF0IHdoZW4gYWxsIHRoZSBwYXJ0aXRpb25zIGhlYWwKIyB0aGUgY2x1c3RlciB3aWxsIGFsd2F5cyBiZSBhYmxlIHRvIGNvbnRpbnVlLgojCiMgY2x1c3Rlci1yZXBsaWNhLXZhbGlkaXR5LWZhY3RvciAxMAoKIyBDbHVzdGVyIHJlcGxpY2FzIGFyZSBhYmxlIHRvIG1pZ3JhdGUgdG8gb3JwaGFuZWQgbWFzdGVycywgdGhhdCBhcmUgbWFzdGVycwojIHRoYXQgYXJlIGxlZnQgd2l0aG91dCB3b3JraW5nIHJlcGxpY2FzLiBUaGlzIGltcHJvdmVzIHRoZSBjbHVzdGVyIGFiaWxpdHkKIyB0byByZXNpc3QgdG8gZmFpbHVyZXMgYXMgb3RoZXJ3aXNlIGFuIG9ycGhhbmVkIG1hc3RlciBjYW4ndCBiZSBmYWlsZWQgb3ZlcgojIGluIGNhc2Ugb2YgZmFpbHVyZSBpZiBpdCBoYXMgbm8gd29ya2luZyByZXBsaWNhcy4KIwojIFJlcGxpY2FzIG1pZ3JhdGUgdG8gb3JwaGFuZWQgbWFzdGVycyBvbmx5IGlmIHRoZXJlIGFyZSBzdGlsbCBhdCBsZWFzdCBhCiMgZ2l2ZW4gbnVtYmVyIG9mIG90aGVyIHdvcmtpbmcgcmVwbGljYXMgZm9yIHRoZWlyIG9sZCBtYXN0ZXIuIFRoaXMgbnVtYmVyCiMgaXMgdGhlICJtaWdyYXRpb24gYmFycmllciIuIEEgbWlncmF0aW9uIGJhcnJpZXIgb2YgMSBtZWFucyB0aGF0IGEgcmVwbGljYQojIHdpbGwgbWlncmF0ZSBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgb3RoZXIgd29ya2luZyByZXBsaWNhIGZvciBpdHMgbWFzdGVyCiMgYW5kIHNvIGZvcnRoLiBJdCB1c3VhbGx5IHJlZmxlY3RzIHRoZSBudW1iZXIgb2YgcmVwbGljYXMgeW91IHdhbnQgZm9yIGV2ZXJ5CiMgbWFzdGVyIGluIHlvdXIgY2x1c3Rlci4KIwojIERlZmF1bHQgaXMgMSAocmVwbGljYXMgbWlncmF0ZSBvbmx5IGlmIHRoZWlyIG1hc3RlcnMgcmVtYWluIHdpdGggYXQgbGVhc3QKIyBvbmUgcmVwbGljYSkuIFRvIGRpc2FibGUgbWlncmF0aW9uIGp1c3Qgc2V0IGl0IHRvIGEgdmVyeSBsYXJnZSB2YWx1ZS4KIyBBIHZhbHVlIG9mIDAgY2FuIGJlIHNldCBidXQgaXMgdXNlZnVsIG9ubHkgZm9yIGRlYnVnZ2luZyBhbmQgZGFuZ2Vyb3VzCiMgaW4gcHJvZHVjdGlvbi4KIwojIGNsdXN0ZXItbWlncmF0aW9uLWJhcnJpZXIgMQoKIyBCeSBkZWZhdWx0IFJlZGlzIENsdXN0ZXIgbm9kZXMgc3RvcCBhY2NlcHRpbmcgcXVlcmllcyBpZiB0aGV5IGRldGVjdCB0aGVyZQojIGlzIGF0IGxlYXN0IGFuIGhhc2ggc2xvdCB1bmNvdmVyZWQgKG5vIGF2YWlsYWJsZSBub2RlIGlzIHNlcnZpbmcgaXQpLgojIFRoaXMgd2F5IGlmIHRoZSBjbHVzdGVyIGlzIHBhcnRpYWxseSBkb3duIChmb3IgZXhhbXBsZSBhIHJhbmdlIG9mIGhhc2ggc2xvdHMKIyBhcmUgbm8gbG9uZ2VyIGNvdmVyZWQpIGFsbCB0aGUgY2x1c3RlciBiZWNvbWVzLCBldmVudHVhbGx5LCB1bmF2YWlsYWJsZS4KIyBJdCBhdXRvbWF0aWNhbGx5IHJldHVybnMgYXZhaWxhYmxlIGFzIHNvb24gYXMgYWxsIHRoZSBzbG90cyBhcmUgY292ZXJlZCBhZ2Fpbi4KIwojIEhvd2V2ZXIgc29tZXRpbWVzIHlvdSB3YW50IHRoZSBzdWJzZXQgb2YgdGhlIGNsdXN0ZXIgd2hpY2ggaXMgd29ya2luZywKIyB0byBjb250aW51ZSB0byBhY2NlcHQgcXVlcmllcyBmb3IgdGhlIHBhcnQgb2YgdGhlIGtleSBzcGFjZSB0aGF0IGlzIHN0aWxsCiMgY292ZXJlZC4gSW4gb3JkZXIgdG8gZG8gc28sIGp1c3Qgc2V0IHRoZSBjbHVzdGVyLXJlcXVpcmUtZnVsbC1jb3ZlcmFnZQojIG9wdGlvbiB0byBuby4KIwojIGNsdXN0ZXItcmVxdWlyZS1mdWxsLWNvdmVyYWdlIHllcwoKIyBUaGlzIG9wdGlvbiwgd2hlbiBzZXQgdG8geWVzLCBwcmV2ZW50cyByZXBsaWNhcyBmcm9tIHRyeWluZyB0byBmYWlsb3ZlciBpdHMKIyBtYXN0ZXIgZHVyaW5nIG1hc3RlciBmYWlsdXJlcy4gSG93ZXZlciB0aGUgbWFzdGVyIGNhbiBzdGlsbCBwZXJmb3JtIGEKIyBtYW51YWwgZmFpbG92ZXIsIGlmIGZvcmNlZCB0byBkbyBzby4KIwojIFRoaXMgaXMgdXNlZnVsIGluIGRpZmZlcmVudCBzY2VuYXJpb3MsIGVzcGVjaWFsbHkgaW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUKIyBkYXRhIGNlbnRlciBvcGVyYXRpb25zLCB3aGVyZSB3ZSB3YW50IG9uZSBzaWRlIHRvIG5ldmVyIGJlIHByb21vdGVkIGlmIG5vdAojIGluIHRoZSBjYXNlIG9mIGEgdG90YWwgREMgZmFpbHVyZS4KIwojIGNsdXN0ZXItcmVwbGljYS1uby1mYWlsb3ZlciBubwoKIyBJbiBvcmRlciB0byBzZXR1cCB5b3VyIGNsdXN0ZXIgbWFrZSBzdXJlIHRvIHJlYWQgdGhlIGRvY3VtZW50YXRpb24KIyBhdmFpbGFibGUgYXQgaHR0cDovL3JlZGlzLmlvIHdlYiBzaXRlLgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ0xVU1RFUiBET0NLRVIvTkFUIHN1cHBvcnQgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBJbiBjZXJ0YWluIGRlcGxveW1lbnRzLCBSZWRpcyBDbHVzdGVyIG5vZGVzIGFkZHJlc3MgZGlzY292ZXJ5IGZhaWxzLCBiZWNhdXNlCiMgYWRkcmVzc2VzIGFyZSBOQVQtdGVkIG9yIGJlY2F1c2UgcG9ydHMgYXJlIGZvcndhcmRlZCAodGhlIHR5cGljYWwgY2FzZSBpcwojIERvY2tlciBhbmQgb3RoZXIgY29udGFpbmVycykuCiMKIyBJbiBvcmRlciB0byBtYWtlIFJlZGlzIENsdXN0ZXIgd29ya2luZyBpbiBzdWNoIGVudmlyb25tZW50cywgYSBzdGF0aWMKIyBjb25maWd1cmF0aW9uIHdoZXJlIGVhY2ggbm9kZSBrbm93cyBpdHMgcHVibGljIGFkZHJlc3MgaXMgbmVlZGVkLiBUaGUKIyBmb2xsb3dpbmcgdHdvIG9wdGlvbnMgYXJlIHVzZWQgZm9yIHRoaXMgc2NvcGUsIGFuZCBhcmU6CiMKIyAqIGNsdXN0ZXItYW5ub3VuY2UtaXAKIyAqIGNsdXN0ZXItYW5ub3VuY2UtcG9ydAojICogY2x1c3Rlci1hbm5vdW5jZS1idXMtcG9ydAojCiMgRWFjaCBpbnN0cnVjdCB0aGUgbm9kZSBhYm91dCBpdHMgYWRkcmVzcywgY2xpZW50IHBvcnQsIGFuZCBjbHVzdGVyIG1lc3NhZ2UKIyBidXMgcG9ydC4gVGhlIGluZm9ybWF0aW9uIGlzIHRoZW4gcHVibGlzaGVkIGluIHRoZSBoZWFkZXIgb2YgdGhlIGJ1cyBwYWNrZXRzCiMgc28gdGhhdCBvdGhlciBub2RlcyB3aWxsIGJlIGFibGUgdG8gY29ycmVjdGx5IG1hcCB0aGUgYWRkcmVzcyBvZiB0aGUgbm9kZQojIHB1Ymxpc2hpbmcgdGhlIGluZm9ybWF0aW9uLgojCiMgSWYgdGhlIGFib3ZlIG9wdGlvbnMgYXJlIG5vdCB1c2VkLCB0aGUgbm9ybWFsIFJlZGlzIENsdXN0ZXIgYXV0by1kZXRlY3Rpb24KIyB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KIwojIE5vdGUgdGhhdCB3aGVuIHJlbWFwcGVkLCB0aGUgYnVzIHBvcnQgbWF5IG5vdCBiZSBhdCB0aGUgZml4ZWQgb2Zmc2V0IG9mCiMgY2xpZW50cyBwb3J0ICsgMTAwMDAsIHNvIHlvdSBjYW4gc3BlY2lmeSBhbnkgcG9ydCBhbmQgYnVzLXBvcnQgZGVwZW5kaW5nCiMgb24gaG93IHRoZXkgZ2V0IHJlbWFwcGVkLiBJZiB0aGUgYnVzLXBvcnQgaXMgbm90IHNldCwgYSBmaXhlZCBvZmZzZXQgb2YKIyAxMDAwMCB3aWxsIGJlIHVzZWQgYXMgdXN1YWxseS4KIwojIEV4YW1wbGU6CiMKIyBjbHVzdGVyLWFubm91bmNlLWlwIDEwLjEuMS41CiMgY2x1c3Rlci1hbm5vdW5jZS1wb3J0IDYzNzkKIyBjbHVzdGVyLWFubm91bmNlLWJ1cy1wb3J0IDYzODAKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU0xPVyBMT0cgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgVGhlIFJlZGlzIFNsb3cgTG9nIGlzIGEgc3lzdGVtIHRvIGxvZyBxdWVyaWVzIHRoYXQgZXhjZWVkZWQgYSBzcGVjaWZpZWQKIyBleGVjdXRpb24gdGltZS4gVGhlIGV4ZWN1dGlvbiB0aW1lIGRvZXMgbm90IGluY2x1ZGUgdGhlIEkvTyBvcGVyYXRpb25zCiMgbGlrZSB0YWxraW5nIHdpdGggdGhlIGNsaWVudCwgc2VuZGluZyB0aGUgcmVwbHkgYW5kIHNvIGZvcnRoLAojIGJ1dCBqdXN0IHRoZSB0aW1lIG5lZWRlZCB0byBhY3R1YWxseSBleGVjdXRlIHRoZSBjb21tYW5kICh0aGlzIGlzIHRoZSBvbmx5CiMgc3RhZ2Ugb2YgY29tbWFuZCBleGVjdXRpb24gd2hlcmUgdGhlIHRocmVhZCBpcyBibG9ja2VkIGFuZCBjYW4gbm90IHNlcnZlCiMgb3RoZXIgcmVxdWVzdHMgaW4gdGhlIG1lYW50aW1lKS4KIwojIFlvdSBjYW4gY29uZmlndXJlIHRoZSBzbG93IGxvZyB3aXRoIHR3byBwYXJhbWV0ZXJzOiBvbmUgdGVsbHMgUmVkaXMKIyB3aGF0IGlzIHRoZSBleGVjdXRpb24gdGltZSwgaW4gbWljcm9zZWNvbmRzLCB0byBleGNlZWQgaW4gb3JkZXIgZm9yIHRoZQojIGNvbW1hbmQgdG8gZ2V0IGxvZ2dlZCwgYW5kIHRoZSBvdGhlciBwYXJhbWV0ZXIgaXMgdGhlIGxlbmd0aCBvZiB0aGUKIyBzbG93IGxvZy4gV2hlbiBhIG5ldyBjb21tYW5kIGlzIGxvZ2dlZCB0aGUgb2xkZXN0IG9uZSBpcyByZW1vdmVkIGZyb20gdGhlCiMgcXVldWUgb2YgbG9nZ2VkIGNvbW1hbmRzLgoKIyBUaGUgZm9sbG93aW5nIHRpbWUgaXMgZXhwcmVzc2VkIGluIG1pY3Jvc2Vjb25kcywgc28gMTAwMDAwMCBpcyBlcXVpdmFsZW50CiMgdG8gb25lIHNlY29uZC4gTm90ZSB0aGF0IGEgbmVnYXRpdmUgbnVtYmVyIGRpc2FibGVzIHRoZSBzbG93IGxvZywgd2hpbGUKIyBhIHZhbHVlIG9mIHplcm8gZm9yY2VzIHRoZSBsb2dnaW5nIG9mIGV2ZXJ5IGNvbW1hbmQuCnNsb3dsb2ctbG9nLXNsb3dlci10aGFuIDEwMDAwCgojIFRoZXJlIGlzIG5vIGxpbWl0IHRvIHRoaXMgbGVuZ3RoLiBKdXN0IGJlIGF3YXJlIHRoYXQgaXQgd2lsbCBjb25zdW1lIG1lbW9yeS4KIyBZb3UgY2FuIHJlY2xhaW0gbWVtb3J5IHVzZWQgYnkgdGhlIHNsb3cgbG9nIHdpdGggU0xPV0xPRyBSRVNFVC4Kc2xvd2xvZy1tYXgtbGVuIDEyOAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTEFURU5DWSBNT05JVE9SICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBUaGUgUmVkaXMgbGF0ZW5jeSBtb25pdG9yaW5nIHN1YnN5c3RlbSBzYW1wbGVzIGRpZmZlcmVudCBvcGVyYXRpb25zCiMgYXQgcnVudGltZSBpbiBvcmRlciB0byBjb2xsZWN0IGRhdGEgcmVsYXRlZCB0byBwb3NzaWJsZSBzb3VyY2VzIG9mCiMgbGF0ZW5jeSBvZiBhIFJlZGlzIGluc3RhbmNlLgojCiMgVmlhIHRoZSBMQVRFTkNZIGNvbW1hbmQgdGhpcyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdG8gdGhlIHVzZXIgdGhhdCBjYW4KIyBwcmludCBncmFwaHMgYW5kIG9idGFpbiByZXBvcnRzLgojCiMgVGhlIHN5c3RlbSBvbmx5IGxvZ3Mgb3BlcmF0aW9ucyB0aGF0IHdlcmUgcGVyZm9ybWVkIGluIGEgdGltZSBlcXVhbCBvcgojIGdyZWF0ZXIgdGhhbiB0aGUgYW1vdW50IG9mIG1pbGxpc2Vjb25kcyBzcGVjaWZpZWQgdmlhIHRoZQojIGxhdGVuY3ktbW9uaXRvci10aHJlc2hvbGQgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUuIFdoZW4gaXRzIHZhbHVlIGlzIHNldAojIHRvIHplcm8sIHRoZSBsYXRlbmN5IG1vbml0b3IgaXMgdHVybmVkIG9mZi4KIwojIEJ5IGRlZmF1bHQgbGF0ZW5jeSBtb25pdG9yaW5nIGlzIGRpc2FibGVkIHNpbmNlIGl0IGlzIG1vc3RseSBub3QgbmVlZGVkCiMgaWYgeW91IGRvbid0IGhhdmUgbGF0ZW5jeSBpc3N1ZXMsIGFuZCBjb2xsZWN0aW5nIGRhdGEgaGFzIGEgcGVyZm9ybWFuY2UKIyBpbXBhY3QsIHRoYXQgd2hpbGUgdmVyeSBzbWFsbCwgY2FuIGJlIG1lYXN1cmVkIHVuZGVyIGJpZyBsb2FkLiBMYXRlbmN5CiMgbW9uaXRvcmluZyBjYW4gZWFzaWx5IGJlIGVuYWJsZWQgYXQgcnVudGltZSB1c2luZyB0aGUgY29tbWFuZAojICJDT05GSUcgU0VUIGxhdGVuY3ktbW9uaXRvci10aHJlc2hvbGQgPG1pbGxpc2Vjb25kcz4iIGlmIG5lZWRlZC4KbGF0ZW5jeS1tb25pdG9yLXRocmVzaG9sZCAwCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFVkVOVCBOT1RJRklDQVRJT04gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIFJlZGlzIGNhbiBub3RpZnkgUHViL1N1YiBjbGllbnRzIGFib3V0IGV2ZW50cyBoYXBwZW5pbmcgaW4gdGhlIGtleSBzcGFjZS4KIyBUaGlzIGZlYXR1cmUgaXMgZG9jdW1lbnRlZCBhdCBodHRwOi8vcmVkaXMuaW8vdG9waWNzL25vdGlmaWNhdGlvbnMKIwojIEZvciBpbnN0YW5jZSBpZiBrZXlzcGFjZSBldmVudHMgbm90aWZpY2F0aW9uIGlzIGVuYWJsZWQsIGFuZCBhIGNsaWVudAojIHBlcmZvcm1zIGEgREVMIG9wZXJhdGlvbiBvbiBrZXkgImZvbyIgc3RvcmVkIGluIHRoZSBEYXRhYmFzZSAwLCB0d28KIyBtZXNzYWdlcyB3aWxsIGJlIHB1Ymxpc2hlZCB2aWEgUHViL1N1YjoKIwojIFBVQkxJU0ggX19rZXlzcGFjZUAwX186Zm9vIGRlbAojIFBVQkxJU0ggX19rZXlldmVudEAwX186ZGVsIGZvbwojCiMgSXQgaXMgcG9zc2libGUgdG8gc2VsZWN0IHRoZSBldmVudHMgdGhhdCBSZWRpcyB3aWxsIG5vdGlmeSBhbW9uZyBhIHNldAojIG9mIGNsYXNzZXMuIEV2ZXJ5IGNsYXNzIGlzIGlkZW50aWZpZWQgYnkgYSBzaW5nbGUgY2hhcmFjdGVyOgojCiMgIEsgICAgIEtleXNwYWNlIGV2ZW50cywgcHVibGlzaGVkIHdpdGggX19rZXlzcGFjZUA8ZGI+X18gcHJlZml4LgojICBFICAgICBLZXlldmVudCBldmVudHMsIHB1Ymxpc2hlZCB3aXRoIF9fa2V5ZXZlbnRAPGRiPl9fIHByZWZpeC4KIyAgZyAgICAgR2VuZXJpYyBjb21tYW5kcyAobm9uLXR5cGUgc3BlY2lmaWMpIGxpa2UgREVMLCBFWFBJUkUsIFJFTkFNRSwgLi4uCiMgICQgICAgIFN0cmluZyBjb21tYW5kcwojICBsICAgICBMaXN0IGNvbW1hbmRzCiMgIHMgICAgIFNldCBjb21tYW5kcwojICBoICAgICBIYXNoIGNvbW1hbmRzCiMgIHogICAgIFNvcnRlZCBzZXQgY29tbWFuZHMKIyAgeCAgICAgRXhwaXJlZCBldmVudHMgKGV2ZW50cyBnZW5lcmF0ZWQgZXZlcnkgdGltZSBhIGtleSBleHBpcmVzKQojICBlICAgICBFdmljdGVkIGV2ZW50cyAoZXZlbnRzIGdlbmVyYXRlZCB3aGVuIGEga2V5IGlzIGV2aWN0ZWQgZm9yIG1heG1lbW9yeSkKIyAgQSAgICAgQWxpYXMgZm9yIGckbHNoenhlLCBzbyB0aGF0IHRoZSAiQUtFIiBzdHJpbmcgbWVhbnMgYWxsIHRoZSBldmVudHMuCiMKIyAgVGhlICJub3RpZnkta2V5c3BhY2UtZXZlbnRzIiB0YWtlcyBhcyBhcmd1bWVudCBhIHN0cmluZyB0aGF0IGlzIGNvbXBvc2VkCiMgIG9mIHplcm8gb3IgbXVsdGlwbGUgY2hhcmFjdGVycy4gVGhlIGVtcHR5IHN0cmluZyBtZWFucyB0aGF0IG5vdGlmaWNhdGlvbnMKIyAgYXJlIGRpc2FibGVkLgojCiMgIEV4YW1wbGU6IHRvIGVuYWJsZSBsaXN0IGFuZCBnZW5lcmljIGV2ZW50cywgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUKIyAgICAgICAgICAgZXZlbnQgbmFtZSwgdXNlOgojCiMgIG5vdGlmeS1rZXlzcGFjZS1ldmVudHMgRWxnCiMKIyAgRXhhbXBsZSAyOiB0byBnZXQgdGhlIHN0cmVhbSBvZiB0aGUgZXhwaXJlZCBrZXlzIHN1YnNjcmliaW5nIHRvIGNoYW5uZWwKIyAgICAgICAgICAgICBuYW1lIF9fa2V5ZXZlbnRAMF9fOmV4cGlyZWQgdXNlOgojCiMgIG5vdGlmeS1rZXlzcGFjZS1ldmVudHMgRXgKIwojICBCeSBkZWZhdWx0IGFsbCBub3RpZmljYXRpb25zIGFyZSBkaXNhYmxlZCBiZWNhdXNlIG1vc3QgdXNlcnMgZG9uJ3QgbmVlZAojICB0aGlzIGZlYXR1cmUgYW5kIHRoZSBmZWF0dXJlIGhhcyBzb21lIG92ZXJoZWFkLiBOb3RlIHRoYXQgaWYgeW91IGRvbid0CiMgIHNwZWNpZnkgYXQgbGVhc3Qgb25lIG9mIEsgb3IgRSwgbm8gZXZlbnRzIHdpbGwgYmUgZGVsaXZlcmVkLgpub3RpZnkta2V5c3BhY2UtZXZlbnRzICIiCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFEVkFOQ0VEIENPTkZJRyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIEhhc2hlcyBhcmUgZW5jb2RlZCB1c2luZyBhIG1lbW9yeSBlZmZpY2llbnQgZGF0YSBzdHJ1Y3R1cmUgd2hlbiB0aGV5IGhhdmUgYQojIHNtYWxsIG51bWJlciBvZiBlbnRyaWVzLCBhbmQgdGhlIGJpZ2dlc3QgZW50cnkgZG9lcyBub3QgZXhjZWVkIGEgZ2l2ZW4KIyB0aHJlc2hvbGQuIFRoZXNlIHRocmVzaG9sZHMgY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzLgpoYXNoLW1heC16aXBsaXN0LWVudHJpZXMgNTEyCmhhc2gtbWF4LXppcGxpc3QtdmFsdWUgNjQKCiMgTGlzdHMgYXJlIGFsc28gZW5jb2RlZCBpbiBhIHNwZWNpYWwgd2F5IHRvIHNhdmUgYSBsb3Qgb2Ygc3BhY2UuCiMgVGhlIG51bWJlciBvZiBlbnRyaWVzIGFsbG93ZWQgcGVyIGludGVybmFsIGxpc3Qgbm9kZSBjYW4gYmUgc3BlY2lmaWVkCiMgYXMgYSBmaXhlZCBtYXhpbXVtIHNpemUgb3IgYSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cy4KIyBGb3IgYSBmaXhlZCBtYXhpbXVtIHNpemUsIHVzZSAtNSB0aHJvdWdoIC0xLCBtZWFuaW5nOgojIC01OiBtYXggc2l6ZTogNjQgS2IgIDwtLSBub3QgcmVjb21tZW5kZWQgZm9yIG5vcm1hbCB3b3JrbG9hZHMKIyAtNDogbWF4IHNpemU6IDMyIEtiICA8LS0gbm90IHJlY29tbWVuZGVkCiMgLTM6IG1heCBzaXplOiAxNiBLYiAgPC0tIHByb2JhYmx5IG5vdCByZWNvbW1lbmRlZAojIC0yOiBtYXggc2l6ZTogOCBLYiAgIDwtLSBnb29kCiMgLTE6IG1heCBzaXplOiA0IEtiICAgPC0tIGdvb2QKIyBQb3NpdGl2ZSBudW1iZXJzIG1lYW4gc3RvcmUgdXAgdG8gX2V4YWN0bHlfIHRoYXQgbnVtYmVyIG9mIGVsZW1lbnRzCiMgcGVyIGxpc3Qgbm9kZS4KIyBUaGUgaGlnaGVzdCBwZXJmb3JtaW5nIG9wdGlvbiBpcyB1c3VhbGx5IC0yICg4IEtiIHNpemUpIG9yIC0xICg0IEtiIHNpemUpLAojIGJ1dCBpZiB5b3VyIHVzZSBjYXNlIGlzIHVuaXF1ZSwgYWRqdXN0IHRoZSBzZXR0aW5ncyBhcyBuZWNlc3NhcnkuCmxpc3QtbWF4LXppcGxpc3Qtc2l6ZSAtMgoKIyBMaXN0cyBtYXkgYWxzbyBiZSBjb21wcmVzc2VkLgojIENvbXByZXNzIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgcXVpY2tsaXN0IHppcGxpc3Qgbm9kZXMgZnJvbSAqZWFjaCogc2lkZSBvZgojIHRoZSBsaXN0IHRvICpleGNsdWRlKiBmcm9tIGNvbXByZXNzaW9uLiAgVGhlIGhlYWQgYW5kIHRhaWwgb2YgdGhlIGxpc3QKIyBhcmUgYWx3YXlzIHVuY29tcHJlc3NlZCBmb3IgZmFzdCBwdXNoL3BvcCBvcGVyYXRpb25zLiAgU2V0dGluZ3MgYXJlOgojIDA6IGRpc2FibGUgYWxsIGxpc3QgY29tcHJlc3Npb24KIyAxOiBkZXB0aCAxIG1lYW5zICJkb24ndCBzdGFydCBjb21wcmVzc2luZyB1bnRpbCBhZnRlciAxIG5vZGUgaW50byB0aGUgbGlzdCwKIyAgICBnb2luZyBmcm9tIGVpdGhlciB0aGUgaGVhZCBvciB0YWlsIgojICAgIFNvOiBbaGVhZF0tPm5vZGUtPm5vZGUtPi4uLi0+bm9kZS0+W3RhaWxdCiMgICAgW2hlYWRdLCBbdGFpbF0gd2lsbCBhbHdheXMgYmUgdW5jb21wcmVzc2VkOyBpbm5lciBub2RlcyB3aWxsIGNvbXByZXNzLgojIDI6IFtoZWFkXS0+W25leHRdLT5ub2RlLT5ub2RlLT4uLi4tPm5vZGUtPltwcmV2XS0+W3RhaWxdCiMgICAgMiBoZXJlIG1lYW5zOiBkb24ndCBjb21wcmVzcyBoZWFkIG9yIGhlYWQtPm5leHQgb3IgdGFpbC0+cHJldiBvciB0YWlsLAojICAgIGJ1dCBjb21wcmVzcyBhbGwgbm9kZXMgYmV0d2VlbiB0aGVtLgojIDM6IFtoZWFkXS0+W25leHRdLT5bbmV4dF0tPm5vZGUtPm5vZGUtPi4uLi0+bm9kZS0+W3ByZXZdLT5bcHJldl0tPlt0YWlsXQojIGV0Yy4KbGlzdC1jb21wcmVzcy1kZXB0aCAwCgojIFNldHMgaGF2ZSBhIHNwZWNpYWwgZW5jb2RpbmcgaW4ganVzdCBvbmUgY2FzZTogd2hlbiBhIHNldCBpcyBjb21wb3NlZAojIG9mIGp1c3Qgc3RyaW5ncyB0aGF0IGhhcHBlbiB0byBiZSBpbnRlZ2VycyBpbiByYWRpeCAxMCBpbiB0aGUgcmFuZ2UKIyBvZiA2NCBiaXQgc2lnbmVkIGludGVnZXJzLgojIFRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBzZXR0aW5nIHNldHMgdGhlIGxpbWl0IGluIHRoZSBzaXplIG9mIHRoZQojIHNldCBpbiBvcmRlciB0byB1c2UgdGhpcyBzcGVjaWFsIG1lbW9yeSBzYXZpbmcgZW5jb2RpbmcuCnNldC1tYXgtaW50c2V0LWVudHJpZXMgNTEyCgojIFNpbWlsYXJseSB0byBoYXNoZXMgYW5kIGxpc3RzLCBzb3J0ZWQgc2V0cyBhcmUgYWxzbyBzcGVjaWFsbHkgZW5jb2RlZCBpbgojIG9yZGVyIHRvIHNhdmUgYSBsb3Qgb2Ygc3BhY2UuIFRoaXMgZW5jb2RpbmcgaXMgb25seSB1c2VkIHdoZW4gdGhlIGxlbmd0aCBhbmQKIyBlbGVtZW50cyBvZiBhIHNvcnRlZCBzZXQgYXJlIGJlbG93IHRoZSBmb2xsb3dpbmcgbGltaXRzOgp6c2V0LW1heC16aXBsaXN0LWVudHJpZXMgMTI4CnpzZXQtbWF4LXppcGxpc3QtdmFsdWUgNjQKCiMgSHlwZXJMb2dMb2cgc3BhcnNlIHJlcHJlc2VudGF0aW9uIGJ5dGVzIGxpbWl0LiBUaGUgbGltaXQgaW5jbHVkZXMgdGhlCiMgMTYgYnl0ZXMgaGVhZGVyLiBXaGVuIGFuIEh5cGVyTG9nTG9nIHVzaW5nIHRoZSBzcGFyc2UgcmVwcmVzZW50YXRpb24gY3Jvc3NlcwojIHRoaXMgbGltaXQsIGl0IGlzIGNvbnZlcnRlZCBpbnRvIHRoZSBkZW5zZSByZXByZXNlbnRhdGlvbi4KIwojIEEgdmFsdWUgZ3JlYXRlciB0aGFuIDE2MDAwIGlzIHRvdGFsbHkgdXNlbGVzcywgc2luY2UgYXQgdGhhdCBwb2ludCB0aGUKIyBkZW5zZSByZXByZXNlbnRhdGlvbiBpcyBtb3JlIG1lbW9yeSBlZmZpY2llbnQuCiMKIyBUaGUgc3VnZ2VzdGVkIHZhbHVlIGlzIH4gMzAwMCBpbiBvcmRlciB0byBoYXZlIHRoZSBiZW5lZml0cyBvZgojIHRoZSBzcGFjZSBlZmZpY2llbnQgZW5jb2Rpbmcgd2l0aG91dCBzbG93aW5nIGRvd24gdG9vIG11Y2ggUEZBREQsCiMgd2hpY2ggaXMgTyhOKSB3aXRoIHRoZSBzcGFyc2UgZW5jb2RpbmcuIFRoZSB2YWx1ZSBjYW4gYmUgcmFpc2VkIHRvCiMgfiAxMDAwMCB3aGVuIENQVSBpcyBub3QgYSBjb25jZXJuLCBidXQgc3BhY2UgaXMsIGFuZCB0aGUgZGF0YSBzZXQgaXMKIyBjb21wb3NlZCBvZiBtYW55IEh5cGVyTG9nTG9ncyB3aXRoIGNhcmRpbmFsaXR5IGluIHRoZSAwIC0gMTUwMDAgcmFuZ2UuCmhsbC1zcGFyc2UtbWF4LWJ5dGVzIDMwMDAKCiMgU3RyZWFtcyBtYWNybyBub2RlIG1heCBzaXplIC8gaXRlbXMuIFRoZSBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUgaXMgYSByYWRpeAojIHRyZWUgb2YgYmlnIG5vZGVzIHRoYXQgZW5jb2RlIG11bHRpcGxlIGl0ZW1zIGluc2lkZS4gVXNpbmcgdGhpcyBjb25maWd1cmF0aW9uCiMgaXQgaXMgcG9zc2libGUgdG8gY29uZmlndXJlIGhvdyBiaWcgYSBzaW5nbGUgbm9kZSBjYW4gYmUgaW4gYnl0ZXMsIGFuZCB0aGUKIyBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyBpdCBtYXkgY29udGFpbiBiZWZvcmUgc3dpdGNoaW5nIHRvIGEgbmV3IG5vZGUgd2hlbgojIGFwcGVuZGluZyBuZXcgc3RyZWFtIGVudHJpZXMuIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSBzZXQgdG8KIyB6ZXJvLCB0aGUgbGltaXQgaXMgaWdub3JlZCwgc28gZm9yIGluc3RhbmNlIGl0IGlzIHBvc3NpYmxlIHRvIHNldCBqdXN0IGEKIyBtYXggZW50aXJlcyBsaW1pdCBieSBzZXR0aW5nIG1heC1ieXRlcyB0byAwIGFuZCBtYXgtZW50cmllcyB0byB0aGUgZGVzaXJlZAojIHZhbHVlLgpzdHJlYW0tbm9kZS1tYXgtYnl0ZXMgNDA5NgpzdHJlYW0tbm9kZS1tYXgtZW50cmllcyAxMDAKCiMgQWN0aXZlIHJlaGFzaGluZyB1c2VzIDEgbWlsbGlzZWNvbmQgZXZlcnkgMTAwIG1pbGxpc2Vjb25kcyBvZiBDUFUgdGltZSBpbgojIG9yZGVyIHRvIGhlbHAgcmVoYXNoaW5nIHRoZSBtYWluIFJlZGlzIGhhc2ggdGFibGUgKHRoZSBvbmUgbWFwcGluZyB0b3AtbGV2ZWwKIyBrZXlzIHRvIHZhbHVlcykuIFRoZSBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uIFJlZGlzIHVzZXMgKHNlZSBkaWN0LmMpCiMgcGVyZm9ybXMgYSBsYXp5IHJlaGFzaGluZzogdGhlIG1vcmUgb3BlcmF0aW9uIHlvdSBydW4gaW50byBhIGhhc2ggdGFibGUKIyB0aGF0IGlzIHJlaGFzaGluZywgdGhlIG1vcmUgcmVoYXNoaW5nICJzdGVwcyIgYXJlIHBlcmZvcm1lZCwgc28gaWYgdGhlCiMgc2VydmVyIGlzIGlkbGUgdGhlIHJlaGFzaGluZyBpcyBuZXZlciBjb21wbGV0ZSBhbmQgc29tZSBtb3JlIG1lbW9yeSBpcyB1c2VkCiMgYnkgdGhlIGhhc2ggdGFibGUuCiMKIyBUaGUgZGVmYXVsdCBpcyB0byB1c2UgdGhpcyBtaWxsaXNlY29uZCAxMCB0aW1lcyBldmVyeSBzZWNvbmQgaW4gb3JkZXIgdG8KIyBhY3RpdmVseSByZWhhc2ggdGhlIG1haW4gZGljdGlvbmFyaWVzLCBmcmVlaW5nIG1lbW9yeSB3aGVuIHBvc3NpYmxlLgojCiMgSWYgdW5zdXJlOgojIHVzZSAiYWN0aXZlcmVoYXNoaW5nIG5vIiBpZiB5b3UgaGF2ZSBoYXJkIGxhdGVuY3kgcmVxdWlyZW1lbnRzIGFuZCBpdCBpcwojIG5vdCBhIGdvb2QgdGhpbmcgaW4geW91ciBlbnZpcm9ubWVudCB0aGF0IFJlZGlzIGNhbiByZXBseSBmcm9tIHRpbWUgdG8gdGltZQojIHRvIHF1ZXJpZXMgd2l0aCAyIG1pbGxpc2Vjb25kcyBkZWxheS4KIwojIHVzZSAiYWN0aXZlcmVoYXNoaW5nIHllcyIgaWYgeW91IGRvbid0IGhhdmUgc3VjaCBoYXJkIHJlcXVpcmVtZW50cyBidXQKIyB3YW50IHRvIGZyZWUgbWVtb3J5IGFzYXAgd2hlbiBwb3NzaWJsZS4KYWN0aXZlcmVoYXNoaW5nIHllcwoKIyBUaGUgY2xpZW50IG91dHB1dCBidWZmZXIgbGltaXRzIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGRpc2Nvbm5lY3Rpb24gb2YgY2xpZW50cwojIHRoYXQgYXJlIG5vdCByZWFkaW5nIGRhdGEgZnJvbSB0aGUgc2VydmVyIGZhc3QgZW5vdWdoIGZvciBzb21lIHJlYXNvbiAoYQojIGNvbW1vbiByZWFzb24gaXMgdGhhdCBhIFB1Yi9TdWIgY2xpZW50IGNhbid0IGNvbnN1bWUgbWVzc2FnZXMgYXMgZmFzdCBhcyB0aGUKIyBwdWJsaXNoZXIgY2FuIHByb2R1Y2UgdGhlbSkuCiMKIyBUaGUgbGltaXQgY2FuIGJlIHNldCBkaWZmZXJlbnRseSBmb3IgdGhlIHRocmVlIGRpZmZlcmVudCBjbGFzc2VzIG9mIGNsaWVudHM6CiMKIyBub3JtYWwgLT4gbm9ybWFsIGNsaWVudHMgaW5jbHVkaW5nIE1PTklUT1IgY2xpZW50cwojIHJlcGxpY2EgIC0+IHJlcGxpY2EgY2xpZW50cwojIHB1YnN1YiAtPiBjbGllbnRzIHN1YnNjcmliZWQgdG8gYXQgbGVhc3Qgb25lIHB1YnN1YiBjaGFubmVsIG9yIHBhdHRlcm4KIwojIFRoZSBzeW50YXggb2YgZXZlcnkgY2xpZW50LW91dHB1dC1idWZmZXItbGltaXQgZGlyZWN0aXZlIGlzIHRoZSBmb2xsb3dpbmc6CiMKIyBjbGllbnQtb3V0cHV0LWJ1ZmZlci1saW1pdCA8Y2xhc3M+IDxoYXJkIGxpbWl0PiA8c29mdCBsaW1pdD4gPHNvZnQgc2Vjb25kcz4KIwojIEEgY2xpZW50IGlzIGltbWVkaWF0ZWx5IGRpc2Nvbm5lY3RlZCBvbmNlIHRoZSBoYXJkIGxpbWl0IGlzIHJlYWNoZWQsIG9yIGlmCiMgdGhlIHNvZnQgbGltaXQgaXMgcmVhY2hlZCBhbmQgcmVtYWlucyByZWFjaGVkIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZgojIHNlY29uZHMgKGNvbnRpbnVvdXNseSkuCiMgU28gZm9yIGluc3RhbmNlIGlmIHRoZSBoYXJkIGxpbWl0IGlzIDMyIG1lZ2FieXRlcyBhbmQgdGhlIHNvZnQgbGltaXQgaXMKIyAxNiBtZWdhYnl0ZXMgLyAxMCBzZWNvbmRzLCB0aGUgY2xpZW50IHdpbGwgZ2V0IGRpc2Nvbm5lY3RlZCBpbW1lZGlhdGVseQojIGlmIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVycyByZWFjaCAzMiBtZWdhYnl0ZXMsIGJ1dCB3aWxsIGFsc28gZ2V0CiMgZGlzY29ubmVjdGVkIGlmIHRoZSBjbGllbnQgcmVhY2hlcyAxNiBtZWdhYnl0ZXMgYW5kIGNvbnRpbnVvdXNseSBvdmVyY29tZXMKIyB0aGUgbGltaXQgZm9yIDEwIHNlY29uZHMuCiMKIyBCeSBkZWZhdWx0IG5vcm1hbCBjbGllbnRzIGFyZSBub3QgbGltaXRlZCBiZWNhdXNlIHRoZXkgZG9uJ3QgcmVjZWl2ZSBkYXRhCiMgd2l0aG91dCBhc2tpbmcgKGluIGEgcHVzaCB3YXkpLCBidXQganVzdCBhZnRlciBhIHJlcXVlc3QsIHNvIG9ubHkKIyBhc3luY2hyb25vdXMgY2xpZW50cyBtYXkgY3JlYXRlIGEgc2NlbmFyaW8gd2hlcmUgZGF0YSBpcyByZXF1ZXN0ZWQgZmFzdGVyCiMgdGhhbiBpdCBjYW4gcmVhZC4KIwojIEluc3RlYWQgdGhlcmUgaXMgYSBkZWZhdWx0IGxpbWl0IGZvciBwdWJzdWIgYW5kIHJlcGxpY2EgY2xpZW50cywgc2luY2UKIyBzdWJzY3JpYmVycyBhbmQgcmVwbGljYXMgcmVjZWl2ZSBkYXRhIGluIGEgcHVzaCBmYXNoaW9uLgojCiMgQm90aCB0aGUgaGFyZCBvciB0aGUgc29mdCBsaW1pdCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGVtIHRvIHplcm8uCmNsaWVudC1vdXRwdXQtYnVmZmVyLWxpbWl0IG5vcm1hbCAwIDAgMApjbGllbnQtb3V0cHV0LWJ1ZmZlci1saW1pdCByZXBsaWNhIDI1Nm1iIDY0bWIgNjAKY2xpZW50LW91dHB1dC1idWZmZXItbGltaXQgcHVic3ViIDMybWIgOG1iIDYwCgojIENsaWVudCBxdWVyeSBidWZmZXJzIGFjY3VtdWxhdGUgbmV3IGNvbW1hbmRzLiBUaGV5IGFyZSBsaW1pdGVkIHRvIGEgZml4ZWQKIyBhbW91bnQgYnkgZGVmYXVsdCBpbiBvcmRlciB0byBhdm9pZCB0aGF0IGEgcHJvdG9jb2wgZGVzeW5jaHJvbml6YXRpb24gKGZvcgojIGluc3RhbmNlIGR1ZSB0byBhIGJ1ZyBpbiB0aGUgY2xpZW50KSB3aWxsIGxlYWQgdG8gdW5ib3VuZCBtZW1vcnkgdXNhZ2UgaW4KIyB0aGUgcXVlcnkgYnVmZmVyLiBIb3dldmVyIHlvdSBjYW4gY29uZmlndXJlIGl0IGhlcmUgaWYgeW91IGhhdmUgdmVyeSBzcGVjaWFsCiMgbmVlZHMsIHN1Y2ggdXMgaHVnZSBtdWx0aS9leGVjIHJlcXVlc3RzIG9yIGFsaWtlLgojCiMgY2xpZW50LXF1ZXJ5LWJ1ZmZlci1saW1pdCAxZ2IKCiMgSW4gdGhlIFJlZGlzIHByb3RvY29sLCBidWxrIHJlcXVlc3RzLCB0aGF0IGFyZSwgZWxlbWVudHMgcmVwcmVzZW50aW5nIHNpbmdsZQojIHN0cmluZ3MsIGFyZSBub3JtYWxseSBsaW1pdGVkIG90IDUxMiBtYi4gSG93ZXZlciB5b3UgY2FuIGNoYW5nZSB0aGlzIGxpbWl0CiMgaGVyZS4KIwojIHByb3RvLW1heC1idWxrLWxlbiA1MTJtYgoKIyBSZWRpcyBjYWxscyBhbiBpbnRlcm5hbCBmdW5jdGlvbiB0byBwZXJmb3JtIG1hbnkgYmFja2dyb3VuZCB0YXNrcywgbGlrZQojIGNsb3NpbmcgY29ubmVjdGlvbnMgb2YgY2xpZW50cyBpbiB0aW1lb3V0LCBwdXJnaW5nIGV4cGlyZWQga2V5cyB0aGF0IGFyZQojIG5ldmVyIHJlcXVlc3RlZCwgYW5kIHNvIGZvcnRoLgojCiMgTm90IGFsbCB0YXNrcyBhcmUgcGVyZm9ybWVkIHdpdGggdGhlIHNhbWUgZnJlcXVlbmN5LCBidXQgUmVkaXMgY2hlY2tzIGZvcgojIHRhc2tzIHRvIHBlcmZvcm0gYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgImh6IiB2YWx1ZS4KIwojIEJ5IGRlZmF1bHQgImh6IiBpcyBzZXQgdG8gMTAuIFJhaXNpbmcgdGhlIHZhbHVlIHdpbGwgdXNlIG1vcmUgQ1BVIHdoZW4KIyBSZWRpcyBpcyBpZGxlLCBidXQgYXQgdGhlIHNhbWUgdGltZSB3aWxsIG1ha2UgUmVkaXMgbW9yZSByZXNwb25zaXZlIHdoZW4KIyB0aGVyZSBhcmUgbWFueSBrZXlzIGV4cGlyaW5nIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aW1lb3V0cyBtYXkgYmUKIyBoYW5kbGVkIHdpdGggbW9yZSBwcmVjaXNpb24uCiMKIyBUaGUgcmFuZ2UgaXMgYmV0d2VlbiAxIGFuZCA1MDAsIGhvd2V2ZXIgYSB2YWx1ZSBvdmVyIDEwMCBpcyB1c3VhbGx5IG5vdAojIGEgZ29vZCBpZGVhLiBNb3N0IHVzZXJzIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgb2YgMTAgYW5kIHJhaXNlIHRoaXMgdXAgdG8KIyAxMDAgb25seSBpbiBlbnZpcm9ubWVudHMgd2hlcmUgdmVyeSBsb3cgbGF0ZW5jeSBpcyByZXF1aXJlZC4KaHogMTAKCiMgTm9ybWFsbHkgaXQgaXMgdXNlZnVsIHRvIGhhdmUgYW4gSFogdmFsdWUgd2hpY2ggaXMgcHJvcG9ydGlvbmFsIHRvIHRoZQojIG51bWJlciBvZiBjbGllbnRzIGNvbm5lY3RlZC4gVGhpcyBpcyB1c2VmdWwgaW4gb3JkZXIsIGZvciBpbnN0YW5jZSwgdG8KIyBhdm9pZCB0b28gbWFueSBjbGllbnRzIGFyZSBwcm9jZXNzZWQgZm9yIGVhY2ggYmFja2dyb3VuZCB0YXNrIGludm9jYXRpb24KIyBpbiBvcmRlciB0byBhdm9pZCBsYXRlbmN5IHNwaWtlcy4KIwojIFNpbmNlIHRoZSBkZWZhdWx0IEhaIHZhbHVlIGJ5IGRlZmF1bHQgaXMgY29uc2VydmF0aXZlbHkgc2V0IHRvIDEwLCBSZWRpcwojIG9mZmVycywgYW5kIGVuYWJsZXMgYnkgZGVmYXVsdCwgdGhlIGFiaWxpdHkgdG8gdXNlIGFuIGFkYXB0aXZlIEhaIHZhbHVlCiMgd2hpY2ggd2lsbCB0ZW1wb3JhcnkgcmFpc2Ugd2hlbiB0aGVyZSBhcmUgbWFueSBjb25uZWN0ZWQgY2xpZW50cy4KIwojIFdoZW4gZHluYW1pYyBIWiBpcyBlbmFibGVkLCB0aGUgYWN0dWFsIGNvbmZpZ3VyZWQgSFogd2lsbCBiZSB1c2VkIGFzCiMgYXMgYSBiYXNlbGluZSwgYnV0IG11bHRpcGxlcyBvZiB0aGUgY29uZmlndXJlZCBIWiB2YWx1ZSB3aWxsIGJlIGFjdHVhbGx5CiMgdXNlZCBhcyBuZWVkZWQgb25jZSBtb3JlIGNsaWVudHMgYXJlIGNvbm5lY3RlZC4gSW4gdGhpcyB3YXkgYW4gaWRsZQojIGluc3RhbmNlIHdpbGwgdXNlIHZlcnkgbGl0dGxlIENQVSB0aW1lIHdoaWxlIGEgYnVzeSBpbnN0YW5jZSB3aWxsIGJlCiMgbW9yZSByZXNwb25zaXZlLgpkeW5hbWljLWh6IHllcwoKIyBXaGVuIGEgY2hpbGQgcmV3cml0ZXMgdGhlIEFPRiBmaWxlLCBpZiB0aGUgZm9sbG93aW5nIG9wdGlvbiBpcyBlbmFibGVkCiMgdGhlIGZpbGUgd2lsbCBiZSBmc3luYy1lZCBldmVyeSAzMiBNQiBvZiBkYXRhIGdlbmVyYXRlZC4gVGhpcyBpcyB1c2VmdWwKIyBpbiBvcmRlciB0byBjb21taXQgdGhlIGZpbGUgdG8gdGhlIGRpc2sgbW9yZSBpbmNyZW1lbnRhbGx5IGFuZCBhdm9pZAojIGJpZyBsYXRlbmN5IHNwaWtlcy4KYW9mLXJld3JpdGUtaW5jcmVtZW50YWwtZnN5bmMgeWVzCgojIFdoZW4gcmVkaXMgc2F2ZXMgUkRCIGZpbGUsIGlmIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGlzIGVuYWJsZWQKIyB0aGUgZmlsZSB3aWxsIGJlIGZzeW5jLWVkIGV2ZXJ5IDMyIE1CIG9mIGRhdGEgZ2VuZXJhdGVkLiBUaGlzIGlzIHVzZWZ1bAojIGluIG9yZGVyIHRvIGNvbW1pdCB0aGUgZmlsZSB0byB0aGUgZGlzayBtb3JlIGluY3JlbWVudGFsbHkgYW5kIGF2b2lkCiMgYmlnIGxhdGVuY3kgc3Bpa2VzLgpyZGItc2F2ZS1pbmNyZW1lbnRhbC1mc3luYyB5ZXMKCiMgUmVkaXMgTEZVIGV2aWN0aW9uIChzZWUgbWF4bWVtb3J5IHNldHRpbmcpIGNhbiBiZSB0dW5lZC4gSG93ZXZlciBpdCBpcyBhIGdvb2QKIyBpZGVhIHRvIHN0YXJ0IHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3MgYW5kIG9ubHkgY2hhbmdlIHRoZW0gYWZ0ZXIgaW52ZXN0aWdhdGluZwojIGhvdyB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZXMgYW5kIGhvdyB0aGUga2V5cyBMRlUgY2hhbmdlIG92ZXIgdGltZSwgd2hpY2gKIyBpcyBwb3NzaWJsZSB0byBpbnNwZWN0IHZpYSB0aGUgT0JKRUNUIEZSRVEgY29tbWFuZC4KIwojIFRoZXJlIGFyZSB0d28gdHVuYWJsZSBwYXJhbWV0ZXJzIGluIHRoZSBSZWRpcyBMRlUgaW1wbGVtZW50YXRpb246IHRoZQojIGNvdW50ZXIgbG9nYXJpdGhtIGZhY3RvciBhbmQgdGhlIGNvdW50ZXIgZGVjYXkgdGltZS4gSXQgaXMgaW1wb3J0YW50IHRvCiMgdW5kZXJzdGFuZCB3aGF0IHRoZSB0d28gcGFyYW1ldGVycyBtZWFuIGJlZm9yZSBjaGFuZ2luZyB0aGVtLgojCiMgVGhlIExGVSBjb3VudGVyIGlzIGp1c3QgOCBiaXRzIHBlciBrZXksIGl0J3MgbWF4aW11bSB2YWx1ZSBpcyAyNTUsIHNvIFJlZGlzCiMgdXNlcyBhIHByb2JhYmlsaXN0aWMgaW5jcmVtZW50IHdpdGggbG9nYXJpdGhtaWMgYmVoYXZpb3IuIEdpdmVuIHRoZSB2YWx1ZQojIG9mIHRoZSBvbGQgY291bnRlciwgd2hlbiBhIGtleSBpcyBhY2Nlc3NlZCwgdGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgaW4KIyB0aGlzIHdheToKIwojIDEuIEEgcmFuZG9tIG51bWJlciBSIGJldHdlZW4gMCBhbmQgMSBpcyBleHRyYWN0ZWQuCiMgMi4gQSBwcm9iYWJpbGl0eSBQIGlzIGNhbGN1bGF0ZWQgYXMgMS8ob2xkX3ZhbHVlKmxmdV9sb2dfZmFjdG9yKzEpLgojIDMuIFRoZSBjb3VudGVyIGlzIGluY3JlbWVudGVkIG9ubHkgaWYgUiA8IFAuCiMKIyBUaGUgZGVmYXVsdCBsZnUtbG9nLWZhY3RvciBpcyAxMC4gVGhpcyBpcyBhIHRhYmxlIG9mIGhvdyB0aGUgZnJlcXVlbmN5CiMgY291bnRlciBjaGFuZ2VzIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGFjY2Vzc2VzIHdpdGggZGlmZmVyZW50CiMgbG9nYXJpdGhtaWMgZmFjdG9yczoKIwojICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwojIHwgZmFjdG9yIHwgMTAwIGhpdHMgICB8IDEwMDAgaGl0cyAgfCAxMDBLIGhpdHMgIHwgMU0gaGl0cyAgICB8IDEwTSBoaXRzICAgfAojICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwojIHwgMCAgICAgIHwgMTA0ICAgICAgICB8IDI1NSAgICAgICAgfCAyNTUgICAgICAgIHwgMjU1ICAgICAgICB8IDI1NSAgICAgICAgfAojICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwojIHwgMSAgICAgIHwgMTggICAgICAgICB8IDQ5ICAgICAgICAgfCAyNTUgICAgICAgIHwgMjU1ICAgICAgICB8IDI1NSAgICAgICAgfAojICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwojIHwgMTAgICAgIHwgMTAgICAgICAgICB8IDE4ICAgICAgICAgfCAxNDIgICAgICAgIHwgMjU1ICAgICAgICB8IDI1NSAgICAgICAgfAojICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwojIHwgMTAwICAgIHwgOCAgICAgICAgICB8IDExICAgICAgICAgfCA0OSAgICAgICAgIHwgMTQzICAgICAgICB8IDI1NSAgICAgICAgfAojICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwojCiMgTk9URTogVGhlIGFib3ZlIHRhYmxlIHdhcyBvYnRhaW5lZCBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CiMKIyAgIHJlZGlzLWJlbmNobWFyayAtbiAxMDAwMDAwIGluY3IgZm9vCiMgICByZWRpcy1jbGkgb2JqZWN0IGZyZXEgZm9vCiMKIyBOT1RFIDI6IFRoZSBjb3VudGVyIGluaXRpYWwgdmFsdWUgaXMgNSBpbiBvcmRlciB0byBnaXZlIG5ldyBvYmplY3RzIGEgY2hhbmNlCiMgdG8gYWNjdW11bGF0ZSBoaXRzLgojCiMgVGhlIGNvdW50ZXIgZGVjYXkgdGltZSBpcyB0aGUgdGltZSwgaW4gbWludXRlcywgdGhhdCBtdXN0IGVsYXBzZSBpbiBvcmRlcgojIGZvciB0aGUga2V5IGNvdW50ZXIgdG8gYmUgZGl2aWRlZCBieSB0d28gKG9yIGRlY3JlbWVudGVkIGlmIGl0IGhhcyBhIHZhbHVlCiMgbGVzcyA8PSAxMCkuCiMKIyBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGxmdS1kZWNheS10aW1lIGlzIDEuIEEgU3BlY2lhbCB2YWx1ZSBvZiAwIG1lYW5zIHRvCiMgZGVjYXkgdGhlIGNvdW50ZXIgZXZlcnkgdGltZSBpdCBoYXBwZW5zIHRvIGJlIHNjYW5uZWQuCiMKIyBsZnUtbG9nLWZhY3RvciAxMAojIGxmdS1kZWNheS10aW1lIDEKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBQ1RJVkUgREVGUkFHTUVOVEFUSU9OICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMKIyBXQVJOSU5HIFRISVMgRkVBVFVSRSBJUyBFWFBFUklNRU5UQUwuIEhvd2V2ZXIgaXQgd2FzIHN0cmVzcyB0ZXN0ZWQKIyBldmVuIGluIHByb2R1Y3Rpb24gYW5kIG1hbnVhbGx5IHRlc3RlZCBieSBtdWx0aXBsZSBlbmdpbmVlcnMgZm9yIHNvbWUKIyB0aW1lLgojCiMgV2hhdCBpcyBhY3RpdmUgZGVmcmFnbWVudGF0aW9uPwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIEFjdGl2ZSAob25saW5lKSBkZWZyYWdtZW50YXRpb24gYWxsb3dzIGEgUmVkaXMgc2VydmVyIHRvIGNvbXBhY3QgdGhlCiMgc3BhY2VzIGxlZnQgYmV0d2VlbiBzbWFsbCBhbGxvY2F0aW9ucyBhbmQgZGVhbGxvY2F0aW9ucyBvZiBkYXRhIGluIG1lbW9yeSwKIyB0aHVzIGFsbG93aW5nIHRvIHJlY2xhaW0gYmFjayBtZW1vcnkuCiMKIyBGcmFnbWVudGF0aW9uIGlzIGEgbmF0dXJhbCBwcm9jZXNzIHRoYXQgaGFwcGVucyB3aXRoIGV2ZXJ5IGFsbG9jYXRvciAoYnV0CiMgbGVzcyBzbyB3aXRoIEplbWFsbG9jLCBmb3J0dW5hdGVseSkgYW5kIGNlcnRhaW4gd29ya2xvYWRzLiBOb3JtYWxseSBhIHNlcnZlcgojIHJlc3RhcnQgaXMgbmVlZGVkIGluIG9yZGVyIHRvIGxvd2VyIHRoZSBmcmFnbWVudGF0aW9uLCBvciBhdCBsZWFzdCB0byBmbHVzaAojIGF3YXkgYWxsIHRoZSBkYXRhIGFuZCBjcmVhdGUgaXQgYWdhaW4uIEhvd2V2ZXIgdGhhbmtzIHRvIHRoaXMgZmVhdHVyZQojIGltcGxlbWVudGVkIGJ5IE9yYW4gQWdyYSBmb3IgUmVkaXMgNC4wIHRoaXMgcHJvY2VzcyBjYW4gaGFwcGVuIGF0IHJ1bnRpbWUKIyBpbiBhbiAiaG90IiB3YXksIHdoaWxlIHRoZSBzZXJ2ZXIgaXMgcnVubmluZy4KIwojIEJhc2ljYWxseSB3aGVuIHRoZSBmcmFnbWVudGF0aW9uIGlzIG92ZXIgYSBjZXJ0YWluIGxldmVsIChzZWUgdGhlCiMgY29uZmlndXJhdGlvbiBvcHRpb25zIGJlbG93KSBSZWRpcyB3aWxsIHN0YXJ0IHRvIGNyZWF0ZSBuZXcgY29waWVzIG9mIHRoZQojIHZhbHVlcyBpbiBjb250aWd1b3VzIG1lbW9yeSByZWdpb25zIGJ5IGV4cGxvaXRpbmcgY2VydGFpbiBzcGVjaWZpYyBKZW1hbGxvYwojIGZlYXR1cmVzIChpbiBvcmRlciB0byB1bmRlcnN0YW5kIGlmIGFuIGFsbG9jYXRpb24gaXMgY2F1c2luZyBmcmFnbWVudGF0aW9uCiMgYW5kIHRvIGFsbG9jYXRlIGl0IGluIGEgYmV0dGVyIHBsYWNlKSwgYW5kIGF0IHRoZSBzYW1lIHRpbWUsIHdpbGwgcmVsZWFzZSB0aGUKIyBvbGQgY29waWVzIG9mIHRoZSBkYXRhLiBUaGlzIHByb2Nlc3MsIHJlcGVhdGVkIGluY3JlbWVudGFsbHkgZm9yIGFsbCB0aGUga2V5cwojIHdpbGwgY2F1c2UgdGhlIGZyYWdtZW50YXRpb24gdG8gZHJvcCBiYWNrIHRvIG5vcm1hbCB2YWx1ZXMuCiMKIyBJbXBvcnRhbnQgdGhpbmdzIHRvIHVuZGVyc3RhbmQ6CiMKIyAxLiBUaGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYW5kIG9ubHkgd29ya3MgaWYgeW91IGNvbXBpbGVkIFJlZGlzCiMgICAgdG8gdXNlIHRoZSBjb3B5IG9mIEplbWFsbG9jIHdlIHNoaXAgd2l0aCB0aGUgc291cmNlIGNvZGUgb2YgUmVkaXMuCiMgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCB3aXRoIExpbnV4IGJ1aWxkcy4KIwojIDIuIFlvdSBuZXZlciBuZWVkIHRvIGVuYWJsZSB0aGlzIGZlYXR1cmUgaWYgeW91IGRvbid0IGhhdmUgZnJhZ21lbnRhdGlvbgojICAgIGlzc3Vlcy4KIwojIDMuIE9uY2UgeW91IGV4cGVyaWVuY2UgZnJhZ21lbnRhdGlvbiwgeW91IGNhbiBlbmFibGUgdGhpcyBmZWF0dXJlIHdoZW4KIyAgICBuZWVkZWQgd2l0aCB0aGUgY29tbWFuZCAiQ09ORklHIFNFVCBhY3RpdmVkZWZyYWcgeWVzIi4KIwojIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIGFibGUgdG8gZmluZSB0dW5lIHRoZSBiZWhhdmlvciBvZiB0aGUKIyBkZWZyYWdtZW50YXRpb24gcHJvY2Vzcy4gSWYgeW91IGFyZSBub3Qgc3VyZSBhYm91dCB3aGF0IHRoZXkgbWVhbiBpdCBpcwojIGEgZ29vZCBpZGVhIHRvIGxlYXZlIHRoZSBkZWZhdWx0cyB1bnRvdWNoZWQuCgojIEVuYWJsZWQgYWN0aXZlIGRlZnJhZ21lbnRhdGlvbgojIGFjdGl2ZWRlZnJhZyB5ZXMKCiMgTWluaW11bSBhbW91bnQgb2YgZnJhZ21lbnRhdGlvbiB3YXN0ZSB0byBzdGFydCBhY3RpdmUgZGVmcmFnCiMgYWN0aXZlLWRlZnJhZy1pZ25vcmUtYnl0ZXMgMTAwbWIKCiMgTWluaW11bSBwZXJjZW50YWdlIG9mIGZyYWdtZW50YXRpb24gdG8gc3RhcnQgYWN0aXZlIGRlZnJhZwojIGFjdGl2ZS1kZWZyYWctdGhyZXNob2xkLWxvd2VyIDEwCgojIE1heGltdW0gcGVyY2VudGFnZSBvZiBmcmFnbWVudGF0aW9uIGF0IHdoaWNoIHdlIHVzZSBtYXhpbXVtIGVmZm9ydAojIGFjdGl2ZS1kZWZyYWctdGhyZXNob2xkLXVwcGVyIDEwMAoKIyBNaW5pbWFsIGVmZm9ydCBmb3IgZGVmcmFnIGluIENQVSBwZXJjZW50YWdlCiMgYWN0aXZlLWRlZnJhZy1jeWNsZS1taW4gNQoKIyBNYXhpbWFsIGVmZm9ydCBmb3IgZGVmcmFnIGluIENQVSBwZXJjZW50YWdlCiMgYWN0aXZlLWRlZnJhZy1jeWNsZS1tYXggNzUKCiMgTWF4aW11bSBudW1iZXIgb2Ygc2V0L2hhc2gvenNldC9saXN0IGZpZWxkcyB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIGZyb20KIyB0aGUgbWFpbiBkaWN0aW9uYXJ5IHNjYW4KIyBhY3RpdmUtZGVmcmFnLW1heC1zY2FuLWZpZWxkcyAxMDAwCgo=” header_font=”Georgia|700|||||||” usetabwidth=”on”]IyBSZWRpcyBjb25maWd1cmF0aW9uIGZpbGUgZXhhbXBsZS4KIwojIE5vdGUgdGhhdCBpbiBvcmRlciB0byByZWFkIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsIFJlZGlzIG11c3QgYmUKIyBzdGFydGVkIHdpdGggdGhlIGZpbGUgcGF0aCBhcyBmaXJzdCBhcmd1bWVudDoKIwojIC4vcmVkaXMtc2VydmVyIC9wYXRoL3RvL3JlZGlzLmNvbmYKCiMgTm90ZSBvbiB1bml0czogd2hlbiBtZW1vcnkgc2l6ZSBpcyBuZWVkZWQsIGl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkKIyBpdCBpbiB0aGUgdXN1YWwgZm9ybSBvZiAxayA1R0IgNE0gYW5kIHNvIGZvcnRoOgojCiMgMWsgPT4gMTAwMCBieXRlcwojIDFrYiA9PiAxMDI0IGJ5dGVzCiMgMW0gPT4gMTAwMDAwMCBieXRlcwojIDFtYiA9PiAxMDI0KjEwMjQgYnl0ZXMKIyAxZyA9PiAxMDAwMDAwMDAwIGJ5dGVzCiMgMWdiID0+IDEwMjQqMTAyNCoxMDI0IGJ5dGVzCiMKIyB1bml0cyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSBzbyAxR0IgMUdiIDFnQiBhcmUgYWxsIHRoZSBzYW1lLgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBJTkNMVURFUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBJbmNsdWRlIG9uZSBvciBtb3JlIG90aGVyIGNvbmZpZyBmaWxlcyBoZXJlLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91CiMgaGF2ZSBhIHN0YW5kYXJkIHRlbXBsYXRlIHRoYXQgZ29lcyB0byBhbGwgUmVkaXMgc2VydmVycyBidXQgYWxzbyBuZWVkCiMgdG8gY3VzdG9taXplIGEgZmV3IHBlci1zZXJ2ZXIgc2V0dGluZ3MuICBJbmNsdWRlIGZpbGVzIGNhbiBpbmNsdWRlCiMgb3RoZXIgZmlsZXMsIHNvIHVzZSB0aGlzIHdpc2VseS4KIwojIE5vdGljZSBvcHRpb24gImluY2x1ZGUiIHdvbid0IGJlIHJld3JpdHRlbiBieSBjb21tYW5kICJDT05GSUcgUkVXUklURSIKIyBmcm9tIGFkbWluIG9yIFJlZGlzIFNlbnRpbmVsLiBTaW5jZSBSZWRpcyBhbHdheXMgdXNlcyB0aGUgbGFzdCBwcm9jZXNzZWQKIyBsaW5lIGFzIHZhbHVlIG9mIGEgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUsIHlvdSdkIGJldHRlciBwdXQgaW5jbHVkZXMKIyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZmlsZSB0byBhdm9pZCBvdmVyd3JpdGluZyBjb25maWcgY2hhbmdlIGF0IHJ1bnRpbWUuCiMKIyBJZiBpbnN0ZWFkIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB1c2luZyBpbmNsdWRlcyB0byBvdmVycmlkZSBjb25maWd1cmF0aW9uCiMgb3B0aW9ucywgaXQgaXMgYmV0dGVyIHRvIHVzZSBpbmNsdWRlIGFzIHRoZSBsYXN0IGxpbmUuCiMKIyBpbmNsdWRlIC9wYXRoL3RvL2xvY2FsLmNvbmYKIyBpbmNsdWRlIC9wYXRoL3RvL290aGVyLmNvbmYKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTU9EVUxFUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIExvYWQgbW9kdWxlcyBhdCBzdGFydHVwLiBJZiB0aGUgc2VydmVyIGlzIG5vdCBhYmxlIHRvIGxvYWQgbW9kdWxlcwojIGl0IHdpbGwgYWJvcnQuIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBtdWx0aXBsZSBsb2FkbW9kdWxlIGRpcmVjdGl2ZXMuCiMKIyBsb2FkbW9kdWxlIC9wYXRoL3RvL215X21vZHVsZS5zbwojIGxvYWRtb2R1bGUgL3BhdGgvdG8vb3RoZXJfbW9kdWxlLnNvCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5FVFdPUksgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBCeSBkZWZhdWx0LCBpZiBubyAiYmluZCIgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgaXMgc3BlY2lmaWVkLCBSZWRpcyBsaXN0ZW5zCiMgZm9yIGNvbm5lY3Rpb25zIGZyb20gYWxsIHRoZSBuZXR3b3JrIGludGVyZmFjZXMgYXZhaWxhYmxlIG9uIHRoZSBzZXJ2ZXIuCiMgSXQgaXMgcG9zc2libGUgdG8gbGlzdGVuIHRvIGp1c3Qgb25lIG9yIG11bHRpcGxlIHNlbGVjdGVkIGludGVyZmFjZXMgdXNpbmcKIyB0aGUgImJpbmQiIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBJUCBhZGRyZXNzZXMuCiMKIyBFeGFtcGxlczoKIwojIGJpbmQgMTkyLjE2OC4xLjEwMCAxMC4wLjAuMQojIGJpbmQgMTI3LjAuMC4xIDo6MQojCiMgfn5+IFdBUk5JTkcgfn5+IElmIHRoZSBjb21wdXRlciBydW5uaW5nIFJlZGlzIGlzIGRpcmVjdGx5IGV4cG9zZWQgdG8gdGhlCiMgaW50ZXJuZXQsIGJpbmRpbmcgdG8gYWxsIHRoZSBpbnRlcmZhY2VzIGlzIGRhbmdlcm91cyBhbmQgd2lsbCBleHBvc2UgdGhlCiMgaW5zdGFuY2UgdG8gZXZlcnlib2R5IG9uIHRoZSBpbnRlcm5ldC4gU28gYnkgZGVmYXVsdCB3ZSB1bmNvbW1lbnQgdGhlCiMgZm9sbG93aW5nIGJpbmQgZGlyZWN0aXZlLCB0aGF0IHdpbGwgZm9yY2UgUmVkaXMgdG8gbGlzdGVuIG9ubHkgaW50bwojIHRoZSBJUHY0IGxvb3BiYWNrIGludGVyZmFjZSBhZGRyZXNzICh0aGlzIG1lYW5zIFJlZGlzIHdpbGwgYmUgYWJsZSB0bwojIGFjY2VwdCBjb25uZWN0aW9ucyBvbmx5IGZyb20gY2xpZW50cyBydW5uaW5nIGludG8gdGhlIHNhbWUgY29tcHV0ZXIgaXQKIyBpcyBydW5uaW5nKS4KIwojIElGIFlPVSBBUkUgU1VSRSBZT1UgV0FOVCBZT1VSIElOU1RBTkNFIFRPIExJU1RFTiBUTyBBTEwgVEhFIElOVEVSRkFDRVMKIyBKVVNUIENPTU1FTlQgVEhFIEZPTExPV0lORyBMSU5FLgojIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpiaW5kIDEyNy4wLjAuMQoKIyBQcm90ZWN0ZWQgbW9kZSBpcyBhIGxheWVyIG9mIHNlY3VyaXR5IHByb3RlY3Rpb24sIGluIG9yZGVyIHRvIGF2b2lkIHRoYXQKIyBSZWRpcyBpbnN0YW5jZXMgbGVmdCBvcGVuIG9uIHRoZSBpbnRlcm5ldCBhcmUgYWNjZXNzZWQgYW5kIGV4cGxvaXRlZC4KIwojIFdoZW4gcHJvdGVjdGVkIG1vZGUgaXMgb24gYW5kIGlmOgojCiMgMSkgVGhlIHNlcnZlciBpcyBub3QgYmluZGluZyBleHBsaWNpdGx5IHRvIGEgc2V0IG9mIGFkZHJlc3NlcyB1c2luZyB0aGUKIyAgICAiYmluZCIgZGlyZWN0aXZlLgojIDIpIE5vIHBhc3N3b3JkIGlzIGNvbmZpZ3VyZWQuCiMKIyBUaGUgc2VydmVyIG9ubHkgYWNjZXB0cyBjb25uZWN0aW9ucyBmcm9tIGNsaWVudHMgY29ubmVjdGluZyBmcm9tIHRoZQojIElQdjQgYW5kIElQdjYgbG9vcGJhY2sgYWRkcmVzc2VzIDEyNy4wLjAuMSBhbmQgOjoxLCBhbmQgZnJvbSBVbml4IGRvbWFpbgojIHNvY2tldHMuCiMKIyBCeSBkZWZhdWx0IHByb3RlY3RlZCBtb2RlIGlzIGVuYWJsZWQuIFlvdSBzaG91bGQgZGlzYWJsZSBpdCBvbmx5IGlmCiMgeW91IGFyZSBzdXJlIHlvdSB3YW50IGNsaWVudHMgZnJvbSBvdGhlciBob3N0cyB0byBjb25uZWN0IHRvIFJlZGlzCiMgZXZlbiBpZiBubyBhdXRoZW50aWNhdGlvbiBpcyBjb25maWd1cmVkLCBub3IgYSBzcGVjaWZpYyBzZXQgb2YgaW50ZXJmYWNlcwojIGFyZSBleHBsaWNpdGx5IGxpc3RlZCB1c2luZyB0aGUgImJpbmQiIGRpcmVjdGl2ZS4KcHJvdGVjdGVkLW1vZGUgeWVzCgojIEFjY2VwdCBjb25uZWN0aW9ucyBvbiB0aGUgc3BlY2lmaWVkIHBvcnQsIGRlZmF1bHQgaXMgNjM3OSAoSUFOQSAjODE1MzQ0KS4KIyBJZiBwb3J0IDAgaXMgc3BlY2lmaWVkIFJlZGlzIHdpbGwgbm90IGxpc3RlbiBvbiBhIFRDUCBzb2NrZXQuCnBvcnQgNjM3OQoKIyBUQ1AgbGlzdGVuKCkgYmFja2xvZy4KIwojIEluIGhpZ2ggcmVxdWVzdHMtcGVyLXNlY29uZCBlbnZpcm9ubWVudHMgeW91IG5lZWQgYW4gaGlnaCBiYWNrbG9nIGluIG9yZGVyCiMgdG8gYXZvaWQgc2xvdyBjbGllbnRzIGNvbm5lY3Rpb25zIGlzc3Vlcy4gTm90ZSB0aGF0IHRoZSBMaW51eCBrZXJuZWwKIyB3aWxsIHNpbGVudGx5IHRydW5jYXRlIGl0IHRvIHRoZSB2YWx1ZSBvZiAvcHJvYy9zeXMvbmV0L2NvcmUvc29tYXhjb25uIHNvCiMgbWFrZSBzdXJlIHRvIHJhaXNlIGJvdGggdGhlIHZhbHVlIG9mIHNvbWF4Y29ubiBhbmQgdGNwX21heF9zeW5fYmFja2xvZwojIGluIG9yZGVyIHRvIGdldCB0aGUgZGVzaXJlZCBlZmZlY3QuCnRjcC1iYWNrbG9nIDUxMQoKIyBVbml4IHNvY2tldC4KIwojIFNwZWNpZnkgdGhlIHBhdGggZm9yIHRoZSBVbml4IHNvY2tldCB0aGF0IHdpbGwgYmUgdXNlZCB0byBsaXN0ZW4gZm9yCiMgaW5jb21pbmcgY29ubmVjdGlvbnMuIFRoZXJlIGlzIG5vIGRlZmF1bHQsIHNvIFJlZGlzIHdpbGwgbm90IGxpc3RlbgojIG9uIGEgdW5peCBzb2NrZXQgd2hlbiBub3Qgc3BlY2lmaWVkLgojCiMgdW5peHNvY2tldCAvdG1wL3JlZGlzLnNvY2sKIyB1bml4c29ja2V0cGVybSA3MDAKCiMgQ2xvc2UgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgYSBjbGllbnQgaXMgaWRsZSBmb3IgTiBzZWNvbmRzICgwIHRvIGRpc2FibGUpCnRpbWVvdXQgMAoKIyBUQ1Aga2VlcGFsaXZlLgojCiMgSWYgbm9uLXplcm8sIHVzZSBTT19LRUVQQUxJVkUgdG8gc2VuZCBUQ1AgQUNLcyB0byBjbGllbnRzIGluIGFic2VuY2UKIyBvZiBjb21tdW5pY2F0aW9uLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdHdvIHJlYXNvbnM6CiMKIyAxKSBEZXRlY3QgZGVhZCBwZWVycy4KIyAyKSBUYWtlIHRoZSBjb25uZWN0aW9uIGFsaXZlIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgbmV0d29yawojICAgIGVxdWlwbWVudCBpbiB0aGUgbWlkZGxlLgojCiMgT24gTGludXgsIHRoZSBzcGVjaWZpZWQgdmFsdWUgKGluIHNlY29uZHMpIGlzIHRoZSBwZXJpb2QgdXNlZCB0byBzZW5kIEFDS3MuCiMgTm90ZSB0aGF0IHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIHRoZSBkb3VibGUgb2YgdGhlIHRpbWUgaXMgbmVlZGVkLgojIE9uIG90aGVyIGtlcm5lbHMgdGhlIHBlcmlvZCBkZXBlbmRzIG9uIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4KIwojIEEgcmVhc29uYWJsZSB2YWx1ZSBmb3IgdGhpcyBvcHRpb24gaXMgMzAwIHNlY29uZHMsIHdoaWNoIGlzIHRoZSBuZXcKIyBSZWRpcyBkZWZhdWx0IHN0YXJ0aW5nIHdpdGggUmVkaXMgMy4yLjEuCnRjcC1rZWVwYWxpdmUgMzAwCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0VORVJBTCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIEJ5IGRlZmF1bHQgUmVkaXMgZG9lcyBub3QgcnVuIGFzIGEgZGFlbW9uLiBVc2UgJ3llcycgaWYgeW91IG5lZWQgaXQuCiMgTm90ZSB0aGF0IFJlZGlzIHdpbGwgd3JpdGUgYSBwaWQgZmlsZSBpbiAvdmFyL3J1bi9yZWRpcy5waWQgd2hlbiBkYWVtb25pemVkLgpkYWVtb25pemUgeWVzCgojIElmIHlvdSBydW4gUmVkaXMgZnJvbSB1cHN0YXJ0IG9yIHN5c3RlbWQsIFJlZGlzIGNhbiBpbnRlcmFjdCB3aXRoIHlvdXIKIyBzdXBlcnZpc2lvbiB0cmVlLiBPcHRpb25zOgojICAgc3VwZXJ2aXNlZCBubyAgICAgIC0gbm8gc3VwZXJ2aXNpb24gaW50ZXJhY3Rpb24KIyAgIHN1cGVydmlzZWQgdXBzdGFydCAtIHNpZ25hbCB1cHN0YXJ0IGJ5IHB1dHRpbmcgUmVkaXMgaW50byBTSUdTVE9QIG1vZGUKIyAgIHN1cGVydmlzZWQgc3lzdGVtZCAtIHNpZ25hbCBzeXN0ZW1kIGJ5IHdyaXRpbmcgUkVBRFk9MSB0byAkTk9USUZZX1NPQ0tFVAojICAgc3VwZXJ2aXNlZCBhdXRvICAgIC0gZGV0ZWN0IHVwc3RhcnQgb3Igc3lzdGVtZCBtZXRob2QgYmFzZWQgb24KIyAgICAgICAgICAgICAgICAgICAgICAgIFVQU1RBUlRfSk9CIG9yIE5PVElGWV9TT0NLRVQgZW52aXJvbm1lbnQgdmFyaWFibGVzCiMgTm90ZTogdGhlc2Ugc3VwZXJ2aXNpb24gbWV0aG9kcyBvbmx5IHNpZ25hbCAicHJvY2VzcyBpcyByZWFkeS4iCiMgICAgICAgVGhleSBkbyBub3QgZW5hYmxlIGNvbnRpbnVvdXMgbGl2ZW5lc3MgcGluZ3MgYmFjayB0byB5b3VyIHN1cGVydmlzb3IuCnN1cGVydmlzZWQgc3lzdGVtZAoKIyBJZiBhIHBpZCBmaWxlIGlzIHNwZWNpZmllZCwgUmVkaXMgd3JpdGVzIGl0IHdoZXJlIHNwZWNpZmllZCBhdCBzdGFydHVwCiMgYW5kIHJlbW92ZXMgaXQgYXQgZXhpdC4KIwojIFdoZW4gdGhlIHNlcnZlciBydW5zIG5vbiBkYWVtb25pemVkLCBubyBwaWQgZmlsZSBpcyBjcmVhdGVkIGlmIG5vbmUgaXMKIyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIFdoZW4gdGhlIHNlcnZlciBpcyBkYWVtb25pemVkLCB0aGUgcGlkIGZpbGUKIyBpcyB1c2VkIGV2ZW4gaWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdGluZyB0byAiL3Zhci9ydW4vcmVkaXMucGlkIi4KIwojIENyZWF0aW5nIGEgcGlkIGZpbGUgaXMgYmVzdCBlZmZvcnQ6IGlmIFJlZGlzIGlzIG5vdCBhYmxlIHRvIGNyZWF0ZSBpdAojIG5vdGhpbmcgYmFkIGhhcHBlbnMsIHRoZSBzZXJ2ZXIgd2lsbCBzdGFydCBhbmQgcnVuIG5vcm1hbGx5LgpwaWRmaWxlIC92YXIvcnVuL3JlZGlzLnBpZAoKIyBTcGVjaWZ5IHRoZSBzZXJ2ZXIgdmVyYm9zaXR5IGxldmVsLgojIFRoaXMgY2FuIGJlIG9uZSBvZjoKIyBkZWJ1ZyAoYSBsb3Qgb2YgaW5mb3JtYXRpb24sIHVzZWZ1bCBmb3IgZGV2ZWxvcG1lbnQvdGVzdGluZykKIyB2ZXJib3NlIChtYW55IHJhcmVseSB1c2VmdWwgaW5mbywgYnV0IG5vdCBhIG1lc3MgbGlrZSB0aGUgZGVidWcgbGV2ZWwpCiMgbm90aWNlIChtb2RlcmF0ZWx5IHZlcmJvc2UsIHdoYXQgeW91IHdhbnQgaW4gcHJvZHVjdGlvbiBwcm9iYWJseSkKIyB3YXJuaW5nIChvbmx5IHZlcnkgaW1wb3J0YW50IC8gY3JpdGljYWwgbWVzc2FnZXMgYXJlIGxvZ2dlZCkKbG9nbGV2ZWwgbm90aWNlCgojIFNwZWNpZnkgdGhlIGxvZyBmaWxlIG5hbWUuIEFsc28gdGhlIGVtcHR5IHN0cmluZyBjYW4gYmUgdXNlZCB0byBmb3JjZQojIFJlZGlzIHRvIGxvZyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LiBOb3RlIHRoYXQgaWYgeW91IHVzZSBzdGFuZGFyZAojIG91dHB1dCBmb3IgbG9nZ2luZyBidXQgZGFlbW9uaXplLCBsb2dzIHdpbGwgYmUgc2VudCB0byAvZGV2L251bGwKbG9nZmlsZSAiIgoKIyBUbyBlbmFibGUgbG9nZ2luZyB0byB0aGUgc3lzdGVtIGxvZ2dlciwganVzdCBzZXQgJ3N5c2xvZy1lbmFibGVkJyB0byB5ZXMsCiMgYW5kIG9wdGlvbmFsbHkgdXBkYXRlIHRoZSBvdGhlciBzeXNsb2cgcGFyYW1ldGVycyB0byBzdWl0IHlvdXIgbmVlZHMuCiMgc3lzbG9nLWVuYWJsZWQgbm8KCiMgU3BlY2lmeSB0aGUgc3lzbG9nIGlkZW50aXR5LgojIHN5c2xvZy1pZGVudCByZWRpcwoKIyBTcGVjaWZ5IHRoZSBzeXNsb2cgZmFjaWxpdHkuIE11c3QgYmUgVVNFUiBvciBiZXR3ZWVuIExPQ0FMMC1MT0NBTDcuCiMgc3lzbG9nLWZhY2lsaXR5IGxvY2FsMAoKIyBTZXQgdGhlIG51bWJlciBvZiBkYXRhYmFzZXMuIFRoZSBkZWZhdWx0IGRhdGFiYXNlIGlzIERCIDAsIHlvdSBjYW4gc2VsZWN0CiMgYSBkaWZmZXJlbnQgb25lIG9uIGEgcGVyLWNvbm5lY3Rpb24gYmFzaXMgdXNpbmcgU0VMRUNUIDxkYmlkPiB3aGVyZQojIGRiaWQgaXMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAnZGF0YWJhc2VzJy0xCmRhdGFiYXNlcyAxNgoKIyBCeSBkZWZhdWx0IFJlZGlzIHNob3dzIGFuIEFTQ0lJIGFydCBsb2dvIG9ubHkgd2hlbiBzdGFydGVkIHRvIGxvZyB0byB0aGUKIyBzdGFuZGFyZCBvdXRwdXQgYW5kIGlmIHRoZSBzdGFuZGFyZCBvdXRwdXQgaXMgYSBUVFkuIEJhc2ljYWxseSB0aGlzIG1lYW5zCiMgdGhhdCBub3JtYWxseSBhIGxvZ28gaXMgZGlzcGxheWVkIG9ubHkgaW4gaW50ZXJhY3RpdmUgc2Vzc2lvbnMuCiMKIyBIb3dldmVyIGl0IGlzIHBvc3NpYmxlIHRvIGZvcmNlIHRoZSBwcmUtNC4wIGJlaGF2aW9yIGFuZCBhbHdheXMgc2hvdyBhCiMgQVNDSUkgYXJ0IGxvZ28gaW4gc3RhcnR1cCBsb2dzIGJ5IHNldHRpbmcgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8geWVzLgphbHdheXMtc2hvdy1sb2dvIHllcwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU05BUFNIT1RUSU5HICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojCiMgU2F2ZSB0aGUgREIgb24gZGlzazoKIwojICAgc2F2ZSA8c2Vjb25kcz4gPGNoYW5nZXM+CiMKIyAgIFdpbGwgc2F2ZSB0aGUgREIgaWYgYm90aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNlY29uZHMgYW5kIHRoZSBnaXZlbgojICAgbnVtYmVyIG9mIHdyaXRlIG9wZXJhdGlvbnMgYWdhaW5zdCB0aGUgREIgb2NjdXJyZWQuCiMKIyAgIEluIHRoZSBleGFtcGxlIGJlbG93IHRoZSBiZWhhdmlvdXIgd2lsbCBiZSB0byBzYXZlOgojICAgYWZ0ZXIgOTAwIHNlYyAoMTUgbWluKSBpZiBhdCBsZWFzdCAxIGtleSBjaGFuZ2VkCiMgICBhZnRlciAzMDAgc2VjICg1IG1pbikgaWYgYXQgbGVhc3QgMTAga2V5cyBjaGFuZ2VkCiMgICBhZnRlciA2MCBzZWMgaWYgYXQgbGVhc3QgMTAwMDAga2V5cyBjaGFuZ2VkCiMKIyAgIE5vdGU6IHlvdSBjYW4gZGlzYWJsZSBzYXZpbmcgY29tcGxldGVseSBieSBjb21tZW50aW5nIG91dCBhbGwgInNhdmUiIGxpbmVzLgojCiMgICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlbW92ZSBhbGwgdGhlIHByZXZpb3VzbHkgY29uZmlndXJlZCBzYXZlCiMgICBwb2ludHMgYnkgYWRkaW5nIGEgc2F2ZSBkaXJlY3RpdmUgd2l0aCBhIHNpbmdsZSBlbXB0eSBzdHJpbmcgYXJndW1lbnQKIyAgIGxpa2UgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgojCiMgICBzYXZlICIiCiNyZW5hbWUtY29tbWFuZCBGTFVTSERCICIiCiNyZW5hbWUtY29tbWFuZCBGTFVTSEFMTCAiIgojcmVuYW1lLWNvbW1hbmQgREVCVUcgIiIKI3JlbmFtZS1jb21tYW5kIENPTkZJRyAiIgoKc2F2ZSA5MDAgMQpzYXZlIDMwMCAxMApzYXZlIDYwIDEwMDAwCgojIEJ5IGRlZmF1bHQgUmVkaXMgd2lsbCBzdG9wIGFjY2VwdGluZyB3cml0ZXMgaWYgUkRCIHNuYXBzaG90cyBhcmUgZW5hYmxlZAojIChhdCBsZWFzdCBvbmUgc2F2ZSBwb2ludCkgYW5kIHRoZSBsYXRlc3QgYmFja2dyb3VuZCBzYXZlIGZhaWxlZC4KIyBUaGlzIHdpbGwgbWFrZSB0aGUgdXNlciBhd2FyZSAoaW4gYSBoYXJkIHdheSkgdGhhdCBkYXRhIGlzIG5vdCBwZXJzaXN0aW5nCiMgb24gZGlzayBwcm9wZXJseSwgb3RoZXJ3aXNlIGNoYW5jZXMgYXJlIHRoYXQgbm8gb25lIHdpbGwgbm90aWNlIGFuZCBzb21lCiMgZGlzYXN0ZXIgd2lsbCBoYXBwZW4uCiMKIyBJZiB0aGUgYmFja2dyb3VuZCBzYXZpbmcgcHJvY2VzcyB3aWxsIHN0YXJ0IHdvcmtpbmcgYWdhaW4gUmVkaXMgd2lsbAojIGF1dG9tYXRpY2FsbHkgYWxsb3cgd3JpdGVzIGFnYWluLgojCiMgSG93ZXZlciBpZiB5b3UgaGF2ZSBzZXR1cCB5b3VyIHByb3BlciBtb25pdG9yaW5nIG9mIHRoZSBSZWRpcyBzZXJ2ZXIKIyBhbmQgcGVyc2lzdGVuY2UsIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZSBzbyB0aGF0IFJlZGlzIHdpbGwKIyBjb250aW51ZSB0byB3b3JrIGFzIHVzdWFsIGV2ZW4gaWYgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggZGlzaywKIyBwZXJtaXNzaW9ucywgYW5kIHNvIGZvcnRoLgpzdG9wLXdyaXRlcy1vbi1iZ3NhdmUtZXJyb3Igbm8KCiMgQ29tcHJlc3Mgc3RyaW5nIG9iamVjdHMgdXNpbmcgTFpGIHdoZW4gZHVtcCAucmRiIGRhdGFiYXNlcz8KIyBGb3IgZGVmYXVsdCB0aGF0J3Mgc2V0IHRvICd5ZXMnIGFzIGl0J3MgYWxtb3N0IGFsd2F5cyBhIHdpbi4KIyBJZiB5b3Ugd2FudCB0byBzYXZlIHNvbWUgQ1BVIGluIHRoZSBzYXZpbmcgY2hpbGQgc2V0IGl0IHRvICdubycgYnV0CiMgdGhlIGRhdGFzZXQgd2lsbCBsaWtlbHkgYmUgYmlnZ2VyIGlmIHlvdSBoYXZlIGNvbXByZXNzaWJsZSB2YWx1ZXMgb3Iga2V5cy4KcmRiY29tcHJlc3Npb24geWVzCgojIFNpbmNlIHZlcnNpb24gNSBvZiBSREIgYSBDUkM2NCBjaGVja3N1bSBpcyBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KIyBUaGlzIG1ha2VzIHRoZSBmb3JtYXQgbW9yZSByZXNpc3RhbnQgdG8gY29ycnVwdGlvbiBidXQgdGhlcmUgaXMgYSBwZXJmb3JtYW5jZQojIGhpdCB0byBwYXkgKGFyb3VuZCAxMCUpIHdoZW4gc2F2aW5nIGFuZCBsb2FkaW5nIFJEQiBmaWxlcywgc28geW91IGNhbiBkaXNhYmxlIGl0CiMgZm9yIG1heGltdW0gcGVyZm9ybWFuY2VzLgojCiMgUkRCIGZpbGVzIGNyZWF0ZWQgd2l0aCBjaGVja3N1bSBkaXNhYmxlZCBoYXZlIGEgY2hlY2tzdW0gb2YgemVybyB0aGF0IHdpbGwKIyB0ZWxsIHRoZSBsb2FkaW5nIGNvZGUgdG8gc2tpcCB0aGUgY2hlY2suCnJkYmNoZWNrc3VtIHllcwoKIyBUaGUgZmlsZW5hbWUgd2hlcmUgdG8gZHVtcCB0aGUgREIKZGJmaWxlbmFtZSBkdW1wLnJkYgoKIyBUaGUgd29ya2luZyBkaXJlY3RvcnkuCiMKIyBUaGUgREIgd2lsbCBiZSB3cml0dGVuIGluc2lkZSB0aGlzIGRpcmVjdG9yeSwgd2l0aCB0aGUgZmlsZW5hbWUgc3BlY2lmaWVkCiMgYWJvdmUgdXNpbmcgdGhlICdkYmZpbGVuYW1lJyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZS4KIwojIFRoZSBBcHBlbmQgT25seSBGaWxlIHdpbGwgYWxzbyBiZSBjcmVhdGVkIGluc2lkZSB0aGlzIGRpcmVjdG9yeS4KIwojIE5vdGUgdGhhdCB5b3UgbXVzdCBzcGVjaWZ5IGEgZGlyZWN0b3J5IGhlcmUsIG5vdCBhIGZpbGUgbmFtZS4KZGlyIC4vCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUkVQTElDQVRJT04gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIE1hc3Rlci1SZXBsaWNhIHJlcGxpY2F0aW9uLiBVc2UgcmVwbGljYW9mIHRvIG1ha2UgYSBSZWRpcyBpbnN0YW5jZSBhIGNvcHkgb2YKIyBhbm90aGVyIFJlZGlzIHNlcnZlci4gQSBmZXcgdGhpbmdzIHRvIHVuZGVyc3RhbmQgQVNBUCBhYm91dCBSZWRpcyByZXBsaWNhdGlvbi4KIwojICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICArLS0tLS0tLS0tLS0tLS0tKwojICAgfCAgICAgIE1hc3RlciAgICAgIHwgLS0tPiB8ICAgIFJlcGxpY2EgICAgfAojICAgfCAocmVjZWl2ZSB3cml0ZXMpIHwgICAgICB8ICAoZXhhY3QgY29weSkgfAojICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICArLS0tLS0tLS0tLS0tLS0tKwojCiMgMSkgUmVkaXMgcmVwbGljYXRpb24gaXMgYXN5bmNocm9ub3VzLCBidXQgeW91IGNhbiBjb25maWd1cmUgYSBtYXN0ZXIgdG8KIyAgICBzdG9wIGFjY2VwdGluZyB3cml0ZXMgaWYgaXQgYXBwZWFycyB0byBiZSBub3QgY29ubmVjdGVkIHdpdGggYXQgbGVhc3QKIyAgICBhIGdpdmVuIG51bWJlciBvZiByZXBsaWNhcy4KIyAyKSBSZWRpcyByZXBsaWNhcyBhcmUgYWJsZSB0byBwZXJmb3JtIGEgcGFydGlhbCByZXN5bmNocm9uaXphdGlvbiB3aXRoIHRoZQojICAgIG1hc3RlciBpZiB0aGUgcmVwbGljYXRpb24gbGluayBpcyBsb3N0IGZvciBhIHJlbGF0aXZlbHkgc21hbGwgYW1vdW50IG9mCiMgICAgdGltZS4gWW91IG1heSB3YW50IHRvIGNvbmZpZ3VyZSB0aGUgcmVwbGljYXRpb24gYmFja2xvZyBzaXplIChzZWUgdGhlIG5leHQKIyAgICBzZWN0aW9ucyBvZiB0aGlzIGZpbGUpIHdpdGggYSBzZW5zaWJsZSB2YWx1ZSBkZXBlbmRpbmcgb24geW91ciBuZWVkcy4KIyAzKSBSZXBsaWNhdGlvbiBpcyBhdXRvbWF0aWMgYW5kIGRvZXMgbm90IG5lZWQgdXNlciBpbnRlcnZlbnRpb24uIEFmdGVyIGEKIyAgICBuZXR3b3JrIHBhcnRpdGlvbiByZXBsaWNhcyBhdXRvbWF0aWNhbGx5IHRyeSB0byByZWNvbm5lY3QgdG8gbWFzdGVycwojICAgIGFuZCByZXN5bmNocm9uaXplIHdpdGggdGhlbS4KIwojIHJlcGxpY2FvZiA8bWFzdGVyaXA+IDxtYXN0ZXJwb3J0PgoKIyBJZiB0aGUgbWFzdGVyIGlzIHBhc3N3b3JkIHByb3RlY3RlZCAodXNpbmcgdGhlICJyZXF1aXJlcGFzcyIgY29uZmlndXJhdGlvbgojIGRpcmVjdGl2ZSBiZWxvdykgaXQgaXMgcG9zc2libGUgdG8gdGVsbCB0aGUgcmVwbGljYSB0byBhdXRoZW50aWNhdGUgYmVmb3JlCiMgc3RhcnRpbmcgdGhlIHJlcGxpY2F0aW9uIHN5bmNocm9uaXphdGlvbiBwcm9jZXNzLCBvdGhlcndpc2UgdGhlIG1hc3RlciB3aWxsCiMgcmVmdXNlIHRoZSByZXBsaWNhIHJlcXVlc3QuCiMKIyBtYXN0ZXJhdXRoIDxtYXN0ZXItcGFzc3dvcmQ+CgojIFdoZW4gYSByZXBsaWNhIGxvc2VzIGl0cyBjb25uZWN0aW9uIHdpdGggdGhlIG1hc3Rlciwgb3Igd2hlbiB0aGUgcmVwbGljYXRpb24KIyBpcyBzdGlsbCBpbiBwcm9ncmVzcywgdGhlIHJlcGxpY2EgY2FuIGFjdCBpbiB0d28gZGlmZmVyZW50IHdheXM6CiMKIyAxKSBpZiByZXBsaWNhLXNlcnZlLXN0YWxlLWRhdGEgaXMgc2V0IHRvICd5ZXMnICh0aGUgZGVmYXVsdCkgdGhlIHJlcGxpY2Egd2lsbAojICAgIHN0aWxsIHJlcGx5IHRvIGNsaWVudCByZXF1ZXN0cywgcG9zc2libHkgd2l0aCBvdXQgb2YgZGF0ZSBkYXRhLCBvciB0aGUKIyAgICBkYXRhIHNldCBtYXkganVzdCBiZSBlbXB0eSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBzeW5jaHJvbml6YXRpb24uCiMKIyAyKSBpZiByZXBsaWNhLXNlcnZlLXN0YWxlLWRhdGEgaXMgc2V0IHRvICdubycgdGhlIHJlcGxpY2Egd2lsbCByZXBseSB3aXRoCiMgICAgYW4gZXJyb3IgIlNZTkMgd2l0aCBtYXN0ZXIgaW4gcHJvZ3Jlc3MiIHRvIGFsbCB0aGUga2luZCBvZiBjb21tYW5kcwojICAgIGJ1dCB0byBJTkZPLCByZXBsaWNhT0YsIEFVVEgsIFBJTkcsIFNIVVRET1dOLCBSRVBMQ09ORiwgUk9MRSwgQ09ORklHLAojICAgIFNVQlNDUklCRSwgVU5TVUJTQ1JJQkUsIFBTVUJTQ1JJQkUsIFBVTlNVQlNDUklCRSwgUFVCTElTSCwgUFVCU1VCLAojICAgIENPTU1BTkQsIFBPU1QsIEhPU1Q6IGFuZCBMQVRFTkNZLgojCnJlcGxpY2Etc2VydmUtc3RhbGUtZGF0YSB5ZXMKCiMgWW91IGNhbiBjb25maWd1cmUgYSByZXBsaWNhIGluc3RhbmNlIHRvIGFjY2VwdCB3cml0ZXMgb3Igbm90LiBXcml0aW5nIGFnYWluc3QKIyBhIHJlcGxpY2EgaW5zdGFuY2UgbWF5IGJlIHVzZWZ1bCB0byBzdG9yZSBzb21lIGVwaGVtZXJhbCBkYXRhIChiZWNhdXNlIGRhdGEKIyB3cml0dGVuIG9uIGEgcmVwbGljYSB3aWxsIGJlIGVhc2lseSBkZWxldGVkIGFmdGVyIHJlc3luYyB3aXRoIHRoZSBtYXN0ZXIpIGJ1dAojIG1heSBhbHNvIGNhdXNlIHByb2JsZW1zIGlmIGNsaWVudHMgYXJlIHdyaXRpbmcgdG8gaXQgYmVjYXVzZSBvZiBhCiMgbWlzY29uZmlndXJhdGlvbi4KIwojIFNpbmNlIFJlZGlzIDIuNiBieSBkZWZhdWx0IHJlcGxpY2FzIGFyZSByZWFkLW9ubHkuCiMKIyBOb3RlOiByZWFkIG9ubHkgcmVwbGljYXMgYXJlIG5vdCBkZXNpZ25lZCB0byBiZSBleHBvc2VkIHRvIHVudHJ1c3RlZCBjbGllbnRzCiMgb24gdGhlIGludGVybmV0LiBJdCdzIGp1c3QgYSBwcm90ZWN0aW9uIGxheWVyIGFnYWluc3QgbWlzdXNlIG9mIHRoZSBpbnN0YW5jZS4KIyBTdGlsbCBhIHJlYWQgb25seSByZXBsaWNhIGV4cG9ydHMgYnkgZGVmYXVsdCBhbGwgdGhlIGFkbWluaXN0cmF0aXZlIGNvbW1hbmRzCiMgc3VjaCBhcyBDT05GSUcsIERFQlVHLCBhbmQgc28gZm9ydGguIFRvIGEgbGltaXRlZCBleHRlbnQgeW91IGNhbiBpbXByb3ZlCiMgc2VjdXJpdHkgb2YgcmVhZCBvbmx5IHJlcGxpY2FzIHVzaW5nICdyZW5hbWUtY29tbWFuZCcgdG8gc2hhZG93IGFsbCB0aGUKIyBhZG1pbmlzdHJhdGl2ZSAvIGRhbmdlcm91cyBjb21tYW5kcy4KcmVwbGljYS1yZWFkLW9ubHkgeWVzCgojIFJlcGxpY2F0aW9uIFNZTkMgc3RyYXRlZ3k6IGRpc2sgb3Igc29ja2V0LgojCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFdBUk5JTkc6IERJU0tMRVNTIFJFUExJQ0FUSU9OIElTIEVYUEVSSU1FTlRBTCBDVVJSRU5UTFkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBOZXcgcmVwbGljYXMgYW5kIHJlY29ubmVjdGluZyByZXBsaWNhcyB0aGF0IGFyZSBub3QgYWJsZSB0byBjb250aW51ZSB0aGUgcmVwbGljYXRpb24KIyBwcm9jZXNzIGp1c3QgcmVjZWl2aW5nIGRpZmZlcmVuY2VzLCBuZWVkIHRvIGRvIHdoYXQgaXMgY2FsbGVkIGEgImZ1bGwKIyBzeW5jaHJvbml6YXRpb24iLiBBbiBSREIgZmlsZSBpcyB0cmFuc21pdHRlZCBmcm9tIHRoZSBtYXN0ZXIgdG8gdGhlIHJlcGxpY2FzLgojIFRoZSB0cmFuc21pc3Npb24gY2FuIGhhcHBlbiBpbiB0d28gZGlmZmVyZW50IHdheXM6CiMKIyAxKSBEaXNrLWJhY2tlZDogVGhlIFJlZGlzIG1hc3RlciBjcmVhdGVzIGEgbmV3IHByb2Nlc3MgdGhhdCB3cml0ZXMgdGhlIFJEQgojICAgICAgICAgICAgICAgICBmaWxlIG9uIGRpc2suIExhdGVyIHRoZSBmaWxlIGlzIHRyYW5zZmVycmVkIGJ5IHRoZSBwYXJlbnQKIyAgICAgICAgICAgICAgICAgcHJvY2VzcyB0byB0aGUgcmVwbGljYXMgaW5jcmVtZW50YWxseS4KIyAyKSBEaXNrbGVzczogVGhlIFJlZGlzIG1hc3RlciBjcmVhdGVzIGEgbmV3IHByb2Nlc3MgdGhhdCBkaXJlY3RseSB3cml0ZXMgdGhlCiMgICAgICAgICAgICAgIFJEQiBmaWxlIHRvIHJlcGxpY2Egc29ja2V0cywgd2l0aG91dCB0b3VjaGluZyB0aGUgZGlzayBhdCBhbGwuCiMKIyBXaXRoIGRpc2stYmFja2VkIHJlcGxpY2F0aW9uLCB3aGlsZSB0aGUgUkRCIGZpbGUgaXMgZ2VuZXJhdGVkLCBtb3JlIHJlcGxpY2FzCiMgY2FuIGJlIHF1ZXVlZCBhbmQgc2VydmVkIHdpdGggdGhlIFJEQiBmaWxlIGFzIHNvb24gYXMgdGhlIGN1cnJlbnQgY2hpbGQgcHJvZHVjaW5nCiMgdGhlIFJEQiBmaWxlIGZpbmlzaGVzIGl0cyB3b3JrLiBXaXRoIGRpc2tsZXNzIHJlcGxpY2F0aW9uIGluc3RlYWQgb25jZQojIHRoZSB0cmFuc2ZlciBzdGFydHMsIG5ldyByZXBsaWNhcyBhcnJpdmluZyB3aWxsIGJlIHF1ZXVlZCBhbmQgYSBuZXcgdHJhbnNmZXIKIyB3aWxsIHN0YXJ0IHdoZW4gdGhlIGN1cnJlbnQgb25lIHRlcm1pbmF0ZXMuCiMKIyBXaGVuIGRpc2tsZXNzIHJlcGxpY2F0aW9uIGlzIHVzZWQsIHRoZSBtYXN0ZXIgd2FpdHMgYSBjb25maWd1cmFibGUgYW1vdW50IG9mCiMgdGltZSAoaW4gc2Vjb25kcykgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0cmFuc2ZlciBpbiB0aGUgaG9wZSB0aGF0IG11bHRpcGxlIHJlcGxpY2FzCiMgd2lsbCBhcnJpdmUgYW5kIHRoZSB0cmFuc2ZlciBjYW4gYmUgcGFyYWxsZWxpemVkLgojCiMgV2l0aCBzbG93IGRpc2tzIGFuZCBmYXN0IChsYXJnZSBiYW5kd2lkdGgpIG5ldHdvcmtzLCBkaXNrbGVzcyByZXBsaWNhdGlvbgojIHdvcmtzIGJldHRlci4KcmVwbC1kaXNrbGVzcy1zeW5jIG5vCgojIFdoZW4gZGlza2xlc3MgcmVwbGljYXRpb24gaXMgZW5hYmxlZCwgaXQgaXMgcG9zc2libGUgdG8gY29uZmlndXJlIHRoZSBkZWxheQojIHRoZSBzZXJ2ZXIgd2FpdHMgaW4gb3JkZXIgdG8gc3Bhd24gdGhlIGNoaWxkIHRoYXQgdHJhbnNmZXJzIHRoZSBSREIgdmlhIHNvY2tldAojIHRvIHRoZSByZXBsaWNhcy4KIwojIFRoaXMgaXMgaW1wb3J0YW50IHNpbmNlIG9uY2UgdGhlIHRyYW5zZmVyIHN0YXJ0cywgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHNlcnZlCiMgbmV3IHJlcGxpY2FzIGFycml2aW5nLCB0aGF0IHdpbGwgYmUgcXVldWVkIGZvciB0aGUgbmV4dCBSREIgdHJhbnNmZXIsIHNvIHRoZSBzZXJ2ZXIKIyB3YWl0cyBhIGRlbGF5IGluIG9yZGVyIHRvIGxldCBtb3JlIHJlcGxpY2FzIGFycml2ZS4KIwojIFRoZSBkZWxheSBpcyBzcGVjaWZpZWQgaW4gc2Vjb25kcywgYW5kIGJ5IGRlZmF1bHQgaXMgNSBzZWNvbmRzLiBUbyBkaXNhYmxlCiMgaXQgZW50aXJlbHkganVzdCBzZXQgaXQgdG8gMCBzZWNvbmRzIGFuZCB0aGUgdHJhbnNmZXIgd2lsbCBzdGFydCBBU0FQLgpyZXBsLWRpc2tsZXNzLXN5bmMtZGVsYXkgNQoKIyBSZXBsaWNhcyBzZW5kIFBJTkdzIHRvIHNlcnZlciBpbiBhIHByZWRlZmluZWQgaW50ZXJ2YWwuIEl0J3MgcG9zc2libGUgdG8gY2hhbmdlCiMgdGhpcyBpbnRlcnZhbCB3aXRoIHRoZSByZXBsX3BpbmdfcmVwbGljYV9wZXJpb2Qgb3B0aW9uLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxMAojIHNlY29uZHMuCiMKIyByZXBsLXBpbmctcmVwbGljYS1wZXJpb2QgMTAKCiMgVGhlIGZvbGxvd2luZyBvcHRpb24gc2V0cyB0aGUgcmVwbGljYXRpb24gdGltZW91dCBmb3I6CiMKIyAxKSBCdWxrIHRyYW5zZmVyIEkvTyBkdXJpbmcgU1lOQywgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiByZXBsaWNhLgojIDIpIE1hc3RlciB0aW1lb3V0IGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgcmVwbGljYXMgKGRhdGEsIHBpbmdzKS4KIyAzKSBSZXBsaWNhIHRpbWVvdXQgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiBtYXN0ZXJzIChSRVBMQ09ORiBBQ0sgcGluZ3MpLgojCiMgSXQgaXMgaW1wb3J0YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZQojIHNwZWNpZmllZCBmb3IgcmVwbC1waW5nLXJlcGxpY2EtcGVyaW9kIG90aGVyd2lzZSBhIHRpbWVvdXQgd2lsbCBiZSBkZXRlY3RlZAojIGV2ZXJ5IHRpbWUgdGhlcmUgaXMgbG93IHRyYWZmaWMgYmV0d2VlbiB0aGUgbWFzdGVyIGFuZCB0aGUgcmVwbGljYS4KIwojIHJlcGwtdGltZW91dCA2MAoKIyBEaXNhYmxlIFRDUF9OT0RFTEFZIG9uIHRoZSByZXBsaWNhIHNvY2tldCBhZnRlciBTWU5DPwojCiMgSWYgeW91IHNlbGVjdCAieWVzIiBSZWRpcyB3aWxsIHVzZSBhIHNtYWxsZXIgbnVtYmVyIG9mIFRDUCBwYWNrZXRzIGFuZAojIGxlc3MgYmFuZHdpZHRoIHRvIHNlbmQgZGF0YSB0byByZXBsaWNhcy4gQnV0IHRoaXMgY2FuIGFkZCBhIGRlbGF5IGZvcgojIHRoZSBkYXRhIHRvIGFwcGVhciBvbiB0aGUgcmVwbGljYSBzaWRlLCB1cCB0byA0MCBtaWxsaXNlY29uZHMgd2l0aAojIExpbnV4IGtlcm5lbHMgdXNpbmcgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCiMKIyBJZiB5b3Ugc2VsZWN0ICJubyIgdGhlIGRlbGF5IGZvciBkYXRhIHRvIGFwcGVhciBvbiB0aGUgcmVwbGljYSBzaWRlIHdpbGwKIyBiZSByZWR1Y2VkIGJ1dCBtb3JlIGJhbmR3aWR0aCB3aWxsIGJlIHVzZWQgZm9yIHJlcGxpY2F0aW9uLgojCiMgQnkgZGVmYXVsdCB3ZSBvcHRpbWl6ZSBmb3IgbG93IGxhdGVuY3ksIGJ1dCBpbiB2ZXJ5IGhpZ2ggdHJhZmZpYyBjb25kaXRpb25zCiMgb3Igd2hlbiB0aGUgbWFzdGVyIGFuZCByZXBsaWNhcyBhcmUgbWFueSBob3BzIGF3YXksIHR1cm5pbmcgdGhpcyB0byAieWVzIiBtYXkKIyBiZSBhIGdvb2QgaWRlYS4KcmVwbC1kaXNhYmxlLXRjcC1ub2RlbGF5IG5vCgojIFNldCB0aGUgcmVwbGljYXRpb24gYmFja2xvZyBzaXplLiBUaGUgYmFja2xvZyBpcyBhIGJ1ZmZlciB0aGF0IGFjY3VtdWxhdGVzCiMgcmVwbGljYSBkYXRhIHdoZW4gcmVwbGljYXMgYXJlIGRpc2Nvbm5lY3RlZCBmb3Igc29tZSB0aW1lLCBzbyB0aGF0IHdoZW4gYSByZXBsaWNhCiMgd2FudHMgdG8gcmVjb25uZWN0IGFnYWluLCBvZnRlbiBhIGZ1bGwgcmVzeW5jIGlzIG5vdCBuZWVkZWQsIGJ1dCBhIHBhcnRpYWwKIyByZXN5bmMgaXMgZW5vdWdoLCBqdXN0IHBhc3NpbmcgdGhlIHBvcnRpb24gb2YgZGF0YSB0aGUgcmVwbGljYSBtaXNzZWQgd2hpbGUKIyBkaXNjb25uZWN0ZWQuCiMKIyBUaGUgYmlnZ2VyIHRoZSByZXBsaWNhdGlvbiBiYWNrbG9nLCB0aGUgbG9uZ2VyIHRoZSB0aW1lIHRoZSByZXBsaWNhIGNhbiBiZQojIGRpc2Nvbm5lY3RlZCBhbmQgbGF0ZXIgYmUgYWJsZSB0byBwZXJmb3JtIGEgcGFydGlhbCByZXN5bmNocm9uaXphdGlvbi4KIwojIFRoZSBiYWNrbG9nIGlzIG9ubHkgYWxsb2NhdGVkIG9uY2UgdGhlcmUgaXMgYXQgbGVhc3QgYSByZXBsaWNhIGNvbm5lY3RlZC4KIwojIHJlcGwtYmFja2xvZy1zaXplIDFtYgoKIyBBZnRlciBhIG1hc3RlciBoYXMgbm8gbG9uZ2VyIGNvbm5lY3RlZCByZXBsaWNhcyBmb3Igc29tZSB0aW1lLCB0aGUgYmFja2xvZwojIHdpbGwgYmUgZnJlZWQuIFRoZSBmb2xsb3dpbmcgb3B0aW9uIGNvbmZpZ3VyZXMgdGhlIGFtb3VudCBvZiBzZWNvbmRzIHRoYXQKIyBuZWVkIHRvIGVsYXBzZSwgc3RhcnRpbmcgZnJvbSB0aGUgdGltZSB0aGUgbGFzdCByZXBsaWNhIGRpc2Nvbm5lY3RlZCwgZm9yCiMgdGhlIGJhY2tsb2cgYnVmZmVyIHRvIGJlIGZyZWVkLgojCiMgTm90ZSB0aGF0IHJlcGxpY2FzIG5ldmVyIGZyZWUgdGhlIGJhY2tsb2cgZm9yIHRpbWVvdXQsIHNpbmNlIHRoZXkgbWF5IGJlCiMgcHJvbW90ZWQgdG8gbWFzdGVycyBsYXRlciwgYW5kIHNob3VsZCBiZSBhYmxlIHRvIGNvcnJlY3RseSAicGFydGlhbGx5CiMgcmVzeW5jaHJvbml6ZSIgd2l0aCB0aGUgcmVwbGljYXM6IGhlbmNlIHRoZXkgc2hvdWxkIGFsd2F5cyBhY2N1bXVsYXRlIGJhY2tsb2cuCiMKIyBBIHZhbHVlIG9mIDAgbWVhbnMgdG8gbmV2ZXIgcmVsZWFzZSB0aGUgYmFja2xvZy4KIwojIHJlcGwtYmFja2xvZy10dGwgMzYwMAoKIyBUaGUgcmVwbGljYSBwcmlvcml0eSBpcyBhbiBpbnRlZ2VyIG51bWJlciBwdWJsaXNoZWQgYnkgUmVkaXMgaW4gdGhlIElORk8gb3V0cHV0LgojIEl0IGlzIHVzZWQgYnkgUmVkaXMgU2VudGluZWwgaW4gb3JkZXIgdG8gc2VsZWN0IGEgcmVwbGljYSB0byBwcm9tb3RlIGludG8gYQojIG1hc3RlciBpZiB0aGUgbWFzdGVyIGlzIG5vIGxvbmdlciB3b3JraW5nIGNvcnJlY3RseS4KIwojIEEgcmVwbGljYSB3aXRoIGEgbG93IHByaW9yaXR5IG51bWJlciBpcyBjb25zaWRlcmVkIGJldHRlciBmb3IgcHJvbW90aW9uLCBzbwojIGZvciBpbnN0YW5jZSBpZiB0aGVyZSBhcmUgdGhyZWUgcmVwbGljYXMgd2l0aCBwcmlvcml0eSAxMCwgMTAwLCAyNSBTZW50aW5lbCB3aWxsCiMgcGljayB0aGUgb25lIHdpdGggcHJpb3JpdHkgMTAsIHRoYXQgaXMgdGhlIGxvd2VzdC4KIwojIEhvd2V2ZXIgYSBzcGVjaWFsIHByaW9yaXR5IG9mIDAgbWFya3MgdGhlIHJlcGxpY2EgYXMgbm90IGFibGUgdG8gcGVyZm9ybSB0aGUKIyByb2xlIG9mIG1hc3Rlciwgc28gYSByZXBsaWNhIHdpdGggcHJpb3JpdHkgb2YgMCB3aWxsIG5ldmVyIGJlIHNlbGVjdGVkIGJ5CiMgUmVkaXMgU2VudGluZWwgZm9yIHByb21vdGlvbi4KIwojIEJ5IGRlZmF1bHQgdGhlIHByaW9yaXR5IGlzIDEwMC4KcmVwbGljYS1wcmlvcml0eSAxMDAKCiMgSXQgaXMgcG9zc2libGUgZm9yIGEgbWFzdGVyIHRvIHN0b3AgYWNjZXB0aW5nIHdyaXRlcyBpZiB0aGVyZSBhcmUgbGVzcyB0aGFuCiMgTiByZXBsaWNhcyBjb25uZWN0ZWQsIGhhdmluZyBhIGxhZyBsZXNzIG9yIGVxdWFsIHRoYW4gTSBzZWNvbmRzLgojCiMgVGhlIE4gcmVwbGljYXMgbmVlZCB0byBiZSBpbiAib25saW5lIiBzdGF0ZS4KIwojIFRoZSBsYWcgaW4gc2Vjb25kcywgdGhhdCBtdXN0IGJlIDw9IHRoZSBzcGVjaWZpZWQgdmFsdWUsIGlzIGNhbGN1bGF0ZWQgZnJvbQojIHRoZSBsYXN0IHBpbmcgcmVjZWl2ZWQgZnJvbSB0aGUgcmVwbGljYSwgdGhhdCBpcyB1c3VhbGx5IHNlbnQgZXZlcnkgc2Vjb25kLgojCiMgVGhpcyBvcHRpb24gZG9lcyBub3QgR1VBUkFOVEVFIHRoYXQgTiByZXBsaWNhcyB3aWxsIGFjY2VwdCB0aGUgd3JpdGUsIGJ1dAojIHdpbGwgbGltaXQgdGhlIHdpbmRvdyBvZiBleHBvc3VyZSBmb3IgbG9zdCB3cml0ZXMgaW4gY2FzZSBub3QgZW5vdWdoIHJlcGxpY2FzCiMgYXJlIGF2YWlsYWJsZSwgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcy4KIwojIEZvciBleGFtcGxlIHRvIHJlcXVpcmUgYXQgbGVhc3QgMyByZXBsaWNhcyB3aXRoIGEgbGFnIDw9IDEwIHNlY29uZHMgdXNlOgojCiMgbWluLXJlcGxpY2FzLXRvLXdyaXRlIDMKIyBtaW4tcmVwbGljYXMtbWF4LWxhZyAxMAojCiMgU2V0dGluZyBvbmUgb3IgdGhlIG90aGVyIHRvIDAgZGlzYWJsZXMgdGhlIGZlYXR1cmUuCiMKIyBCeSBkZWZhdWx0IG1pbi1yZXBsaWNhcy10by13cml0ZSBpcyBzZXQgdG8gMCAoZmVhdHVyZSBkaXNhYmxlZCkgYW5kCiMgbWluLXJlcGxpY2FzLW1heC1sYWcgaXMgc2V0IHRvIDEwLgoKIyBBIFJlZGlzIG1hc3RlciBpcyBhYmxlIHRvIGxpc3QgdGhlIGFkZHJlc3MgYW5kIHBvcnQgb2YgdGhlIGF0dGFjaGVkCiMgcmVwbGljYXMgaW4gZGlmZmVyZW50IHdheXMuIEZvciBleGFtcGxlIHRoZSAiSU5GTyByZXBsaWNhdGlvbiIgc2VjdGlvbgojIG9mZmVycyB0aGlzIGluZm9ybWF0aW9uLCB3aGljaCBpcyB1c2VkLCBhbW9uZyBvdGhlciB0b29scywgYnkKIyBSZWRpcyBTZW50aW5lbCBpbiBvcmRlciB0byBkaXNjb3ZlciByZXBsaWNhIGluc3RhbmNlcy4KIyBBbm90aGVyIHBsYWNlIHdoZXJlIHRoaXMgaW5mbyBpcyBhdmFpbGFibGUgaXMgaW4gdGhlIG91dHB1dCBvZiB0aGUKIyAiUk9MRSIgY29tbWFuZCBvZiBhIG1hc3Rlci4KIwojIFRoZSBsaXN0ZWQgSVAgYW5kIGFkZHJlc3Mgbm9ybWFsbHkgcmVwb3J0ZWQgYnkgYSByZXBsaWNhIGlzIG9idGFpbmVkCiMgaW4gdGhlIGZvbGxvd2luZyB3YXk6CiMKIyAgIElQOiBUaGUgYWRkcmVzcyBpcyBhdXRvIGRldGVjdGVkIGJ5IGNoZWNraW5nIHRoZSBwZWVyIGFkZHJlc3MKIyAgIG9mIHRoZSBzb2NrZXQgdXNlZCBieSB0aGUgcmVwbGljYSB0byBjb25uZWN0IHdpdGggdGhlIG1hc3Rlci4KIwojICAgUG9ydDogVGhlIHBvcnQgaXMgY29tbXVuaWNhdGVkIGJ5IHRoZSByZXBsaWNhIGR1cmluZyB0aGUgcmVwbGljYXRpb24KIyAgIGhhbmRzaGFrZSwgYW5kIGlzIG5vcm1hbGx5IHRoZSBwb3J0IHRoYXQgdGhlIHJlcGxpY2EgaXMgdXNpbmcgdG8KIyAgIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMuCiMKIyBIb3dldmVyIHdoZW4gcG9ydCBmb3J3YXJkaW5nIG9yIE5ldHdvcmsgQWRkcmVzcyBUcmFuc2xhdGlvbiAoTkFUKSBpcwojIHVzZWQsIHRoZSByZXBsaWNhIG1heSBiZSBhY3R1YWxseSByZWFjaGFibGUgdmlhIGRpZmZlcmVudCBJUCBhbmQgcG9ydAojIHBhaXJzLiBUaGUgZm9sbG93aW5nIHR3byBvcHRpb25zIGNhbiBiZSB1c2VkIGJ5IGEgcmVwbGljYSBpbiBvcmRlciB0bwojIHJlcG9ydCB0byBpdHMgbWFzdGVyIGEgc3BlY2lmaWMgc2V0IG9mIElQIGFuZCBwb3J0LCBzbyB0aGF0IGJvdGggSU5GTwojIGFuZCBST0xFIHdpbGwgcmVwb3J0IHRob3NlIHZhbHVlcy4KIwojIFRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGJvdGggdGhlIG9wdGlvbnMgaWYgeW91IG5lZWQgdG8gb3ZlcnJpZGUganVzdAojIHRoZSBwb3J0IG9yIHRoZSBJUCBhZGRyZXNzLgojCiMgcmVwbGljYS1hbm5vdW5jZS1pcCA1LjUuNS41CiMgcmVwbGljYS1hbm5vdW5jZS1wb3J0IDEyMzQKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU0VDVVJJVFkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgUmVxdWlyZSBjbGllbnRzIHRvIGlzc3VlIEFVVEggPFBBU1NXT1JEPiBiZWZvcmUgcHJvY2Vzc2luZyBhbnkgb3RoZXIKIyBjb21tYW5kcy4gIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGluIGVudmlyb25tZW50cyBpbiB3aGljaCB5b3UgZG8gbm90IHRydXN0CiMgb3RoZXJzIHdpdGggYWNjZXNzIHRvIHRoZSBob3N0IHJ1bm5pbmcgcmVkaXMtc2VydmVyLgojCiMgVGhpcyBzaG91bGQgc3RheSBjb21tZW50ZWQgb3V0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZCBiZWNhdXNlIG1vc3QKIyBwZW9wbGUgZG8gbm90IG5lZWQgYXV0aCAoZS5nLiB0aGV5IHJ1biB0aGVpciBvd24gc2VydmVycykuCiMKIyBXYXJuaW5nOiBzaW5jZSBSZWRpcyBpcyBwcmV0dHkgZmFzdCBhbiBvdXRzaWRlIHVzZXIgY2FuIHRyeSB1cCB0bwojIDE1MGsgcGFzc3dvcmRzIHBlciBzZWNvbmQgYWdhaW5zdCBhIGdvb2QgYm94LiBUaGlzIG1lYW5zIHRoYXQgeW91IHNob3VsZAojIHVzZSBhIHZlcnkgc3Ryb25nIHBhc3N3b3JkIG90aGVyd2lzZSBpdCB3aWxsIGJlIHZlcnkgZWFzeSB0byBicmVhay4KIwogcmVxdWlyZXBhc3MgbGpwMDMwODM4CgojIENvbW1hbmQgcmVuYW1pbmcuCiMKIyBJdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgZGFuZ2Vyb3VzIGNvbW1hbmRzIGluIGEgc2hhcmVkCiMgZW52aXJvbm1lbnQuIEZvciBpbnN0YW5jZSB0aGUgQ09ORklHIGNvbW1hbmQgbWF5IGJlIHJlbmFtZWQgaW50byBzb21ldGhpbmcKIyBoYXJkIHRvIGd1ZXNzIHNvIHRoYXQgaXQgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUgZm9yIGludGVybmFsLXVzZSB0b29scwojIGJ1dCBub3QgYXZhaWxhYmxlIGZvciBnZW5lcmFsIGNsaWVudHMuCiMKIyBFeGFtcGxlOgojCiMgcmVuYW1lLWNvbW1hbmQgQ09ORklHIGI4NDBmYzAyZDUyNDA0NTQyOTk0MWNjMTVmNTllNDFjYjdiZTZjNTIKIwojIEl0IGlzIGFsc28gcG9zc2libGUgdG8gY29tcGxldGVseSBraWxsIGEgY29tbWFuZCBieSByZW5hbWluZyBpdCBpbnRvCiMgYW4gZW1wdHkgc3RyaW5nOgojCiMgcmVuYW1lLWNvbW1hbmQgQ09ORklHICIiCiMKIyBQbGVhc2Ugbm90ZSB0aGF0IGNoYW5naW5nIHRoZSBuYW1lIG9mIGNvbW1hbmRzIHRoYXQgYXJlIGxvZ2dlZCBpbnRvIHRoZQojIEFPRiBmaWxlIG9yIHRyYW5zbWl0dGVkIHRvIHJlcGxpY2FzIG1heSBjYXVzZSBwcm9ibGVtcy4KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENMSUVOVFMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIFNldCB0aGUgbWF4IG51bWJlciBvZiBjb25uZWN0ZWQgY2xpZW50cyBhdCB0aGUgc2FtZSB0aW1lLiBCeSBkZWZhdWx0CiMgdGhpcyBsaW1pdCBpcyBzZXQgdG8gMTAwMDAgY2xpZW50cywgaG93ZXZlciBpZiB0aGUgUmVkaXMgc2VydmVyIGlzIG5vdAojIGFibGUgdG8gY29uZmlndXJlIHRoZSBwcm9jZXNzIGZpbGUgbGltaXQgdG8gYWxsb3cgZm9yIHRoZSBzcGVjaWZpZWQgbGltaXQKIyB0aGUgbWF4IG51bWJlciBvZiBhbGxvd2VkIGNsaWVudHMgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGZpbGUgbGltaXQKIyBtaW51cyAzMiAoYXMgUmVkaXMgcmVzZXJ2ZXMgYSBmZXcgZmlsZSBkZXNjcmlwdG9ycyBmb3IgaW50ZXJuYWwgdXNlcykuCiMKIyBPbmNlIHRoZSBsaW1pdCBpcyByZWFjaGVkIFJlZGlzIHdpbGwgY2xvc2UgYWxsIHRoZSBuZXcgY29ubmVjdGlvbnMgc2VuZGluZwojIGFuIGVycm9yICdtYXggbnVtYmVyIG9mIGNsaWVudHMgcmVhY2hlZCcuCiMKIyBtYXhjbGllbnRzIDEwMDAwCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTUVNT1JZIE1BTkFHRU1FTlQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgU2V0IGEgbWVtb3J5IHVzYWdlIGxpbWl0IHRvIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzLgojIFdoZW4gdGhlIG1lbW9yeSBsaW1pdCBpcyByZWFjaGVkIFJlZGlzIHdpbGwgdHJ5IHRvIHJlbW92ZSBrZXlzCiMgYWNjb3JkaW5nIHRvIHRoZSBldmljdGlvbiBwb2xpY3kgc2VsZWN0ZWQgKHNlZSBtYXhtZW1vcnktcG9saWN5KS4KIwojIElmIFJlZGlzIGNhbid0IHJlbW92ZSBrZXlzIGFjY29yZGluZyB0byB0aGUgcG9saWN5LCBvciBpZiB0aGUgcG9saWN5IGlzCiMgc2V0IHRvICdub2V2aWN0aW9uJywgUmVkaXMgd2lsbCBzdGFydCB0byByZXBseSB3aXRoIGVycm9ycyB0byBjb21tYW5kcwojIHRoYXQgd291bGQgdXNlIG1vcmUgbWVtb3J5LCBsaWtlIFNFVCwgTFBVU0gsIGFuZCBzbyBvbiwgYW5kIHdpbGwgY29udGludWUKIyB0byByZXBseSB0byByZWFkLW9ubHkgY29tbWFuZHMgbGlrZSBHRVQuCiMKIyBUaGlzIG9wdGlvbiBpcyB1c3VhbGx5IHVzZWZ1bCB3aGVuIHVzaW5nIFJlZGlzIGFzIGFuIExSVSBvciBMRlUgY2FjaGUsIG9yIHRvCiMgc2V0IGEgaGFyZCBtZW1vcnkgbGltaXQgZm9yIGFuIGluc3RhbmNlICh1c2luZyB0aGUgJ25vZXZpY3Rpb24nIHBvbGljeSkuCiMKIyBXQVJOSU5HOiBJZiB5b3UgaGF2ZSByZXBsaWNhcyBhdHRhY2hlZCB0byBhbiBpbnN0YW5jZSB3aXRoIG1heG1lbW9yeSBvbiwKIyB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlcnMgbmVlZGVkIHRvIGZlZWQgdGhlIHJlcGxpY2FzIGFyZSBzdWJ0cmFjdGVkCiMgZnJvbSB0aGUgdXNlZCBtZW1vcnkgY291bnQsIHNvIHRoYXQgbmV0d29yayBwcm9ibGVtcyAvIHJlc3luY3Mgd2lsbAojIG5vdCB0cmlnZ2VyIGEgbG9vcCB3aGVyZSBrZXlzIGFyZSBldmljdGVkLCBhbmQgaW4gdHVybiB0aGUgb3V0cHV0CiMgYnVmZmVyIG9mIHJlcGxpY2FzIGlzIGZ1bGwgd2l0aCBERUxzIG9mIGtleXMgZXZpY3RlZCB0cmlnZ2VyaW5nIHRoZSBkZWxldGlvbgojIG9mIG1vcmUga2V5cywgYW5kIHNvIGZvcnRoIHVudGlsIHRoZSBkYXRhYmFzZSBpcyBjb21wbGV0ZWx5IGVtcHRpZWQuCiMKIyBJbiBzaG9ydC4uLiBpZiB5b3UgaGF2ZSByZXBsaWNhcyBhdHRhY2hlZCBpdCBpcyBzdWdnZXN0ZWQgdGhhdCB5b3Ugc2V0IGEgbG93ZXIKIyBsaW1pdCBmb3IgbWF4bWVtb3J5IHNvIHRoYXQgdGhlcmUgaXMgc29tZSBmcmVlIFJBTSBvbiB0aGUgc3lzdGVtIGZvciByZXBsaWNhCiMgb3V0cHV0IGJ1ZmZlcnMgKGJ1dCB0aGlzIGlzIG5vdCBuZWVkZWQgaWYgdGhlIHBvbGljeSBpcyAnbm9ldmljdGlvbicpLgojCiBtYXhtZW1vcnkgNjBNCgojIE1BWE1FTU9SWSBQT0xJQ1k6IGhvdyBSZWRpcyB3aWxsIHNlbGVjdCB3aGF0IHRvIHJlbW92ZSB3aGVuIG1heG1lbW9yeQojIGlzIHJlYWNoZWQuIFlvdSBjYW4gc2VsZWN0IGFtb25nIGZpdmUgYmVoYXZpb3JzOgojCiMgdm9sYXRpbGUtbHJ1IC0+IEV2aWN0IHVzaW5nIGFwcHJveGltYXRlZCBMUlUgYW1vbmcgdGhlIGtleXMgd2l0aCBhbiBleHBpcmUgc2V0LgojIGFsbGtleXMtbHJ1IC0+IEV2aWN0IGFueSBrZXkgdXNpbmcgYXBwcm94aW1hdGVkIExSVS4KIyB2b2xhdGlsZS1sZnUgLT4gRXZpY3QgdXNpbmcgYXBwcm94aW1hdGVkIExGVSBhbW9uZyB0aGUga2V5cyB3aXRoIGFuIGV4cGlyZSBzZXQuCiMgYWxsa2V5cy1sZnUgLT4gRXZpY3QgYW55IGtleSB1c2luZyBhcHByb3hpbWF0ZWQgTEZVLgojIHZvbGF0aWxlLXJhbmRvbSAtPiBSZW1vdmUgYSByYW5kb20ga2V5IGFtb25nIHRoZSBvbmVzIHdpdGggYW4gZXhwaXJlIHNldC4KIyBhbGxrZXlzLXJhbmRvbSAtPiBSZW1vdmUgYSByYW5kb20ga2V5LCBhbnkga2V5LgojIHZvbGF0aWxlLXR0bCAtPiBSZW1vdmUgdGhlIGtleSB3aXRoIHRoZSBuZWFyZXN0IGV4cGlyZSB0aW1lIChtaW5vciBUVEwpCiMgbm9ldmljdGlvbiAtPiBEb24ndCBldmljdCBhbnl0aGluZywganVzdCByZXR1cm4gYW4gZXJyb3Igb24gd3JpdGUgb3BlcmF0aW9ucy4KIwojIExSVSBtZWFucyBMZWFzdCBSZWNlbnRseSBVc2VkCiMgTEZVIG1lYW5zIExlYXN0IEZyZXF1ZW50bHkgVXNlZAojCiMgQm90aCBMUlUsIExGVSBhbmQgdm9sYXRpbGUtdHRsIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhcHByb3hpbWF0ZWQKIyByYW5kb21pemVkIGFsZ29yaXRobXMuCiMKIyBOb3RlOiB3aXRoIGFueSBvZiB0aGUgYWJvdmUgcG9saWNpZXMsIFJlZGlzIHdpbGwgcmV0dXJuIGFuIGVycm9yIG9uIHdyaXRlCiMgICAgICAgb3BlcmF0aW9ucywgd2hlbiB0aGVyZSBhcmUgbm8gc3VpdGFibGUga2V5cyBmb3IgZXZpY3Rpb24uCiMKIyAgICAgICBBdCB0aGUgZGF0ZSBvZiB3cml0aW5nIHRoZXNlIGNvbW1hbmRzIGFyZTogc2V0IHNldG54IHNldGV4IGFwcGVuZAojICAgICAgIGluY3IgZGVjciBycHVzaCBscHVzaCBycHVzaHggbHB1c2h4IGxpbnNlcnQgbHNldCBycG9wbHB1c2ggc2FkZAojICAgICAgIHNpbnRlciBzaW50ZXJzdG9yZSBzdW5pb24gc3VuaW9uc3RvcmUgc2RpZmYgc2RpZmZzdG9yZSB6YWRkIHppbmNyYnkKIyAgICAgICB6dW5pb25zdG9yZSB6aW50ZXJzdG9yZSBoc2V0IGhzZXRueCBobXNldCBoaW5jcmJ5IGluY3JieSBkZWNyYnkKIyAgICAgICBnZXRzZXQgbXNldCBtc2V0bnggZXhlYyBzb3J0CiMKIyBUaGUgZGVmYXVsdCBpczoKIwogbWF4bWVtb3J5LXBvbGljeSBhbGxrZXlzLWxydQoKIyBMUlUsIExGVSBhbmQgbWluaW1hbCBUVEwgYWxnb3JpdGhtcyBhcmUgbm90IHByZWNpc2UgYWxnb3JpdGhtcyBidXQgYXBwcm94aW1hdGVkCiMgYWxnb3JpdGhtcyAoaW4gb3JkZXIgdG8gc2F2ZSBtZW1vcnkpLCBzbyB5b3UgY2FuIHR1bmUgaXQgZm9yIHNwZWVkIG9yCiMgYWNjdXJhY3kuIEZvciBkZWZhdWx0IFJlZGlzIHdpbGwgY2hlY2sgZml2ZSBrZXlzIGFuZCBwaWNrIHRoZSBvbmUgdGhhdCB3YXMKIyB1c2VkIGxlc3MgcmVjZW50bHksIHlvdSBjYW4gY2hhbmdlIHRoZSBzYW1wbGUgc2l6ZSB1c2luZyB0aGUgZm9sbG93aW5nCiMgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUuCiMKIyBUaGUgZGVmYXVsdCBvZiA1IHByb2R1Y2VzIGdvb2QgZW5vdWdoIHJlc3VsdHMuIDEwIEFwcHJveGltYXRlcyB2ZXJ5IGNsb3NlbHkKIyB0cnVlIExSVSBidXQgY29zdHMgbW9yZSBDUFUuIDMgaXMgZmFzdGVyIGJ1dCBub3QgdmVyeSBhY2N1cmF0ZS4KIwojIG1heG1lbW9yeS1zYW1wbGVzIDUKCiMgU3RhcnRpbmcgZnJvbSBSZWRpcyA1LCBieSBkZWZhdWx0IGEgcmVwbGljYSB3aWxsIGlnbm9yZSBpdHMgbWF4bWVtb3J5IHNldHRpbmcKIyAodW5sZXNzIGl0IGlzIHByb21vdGVkIHRvIG1hc3RlciBhZnRlciBhIGZhaWxvdmVyIG9yIG1hbnVhbGx5KS4gSXQgbWVhbnMKIyB0aGF0IHRoZSBldmljdGlvbiBvZiBrZXlzIHdpbGwgYmUganVzdCBoYW5kbGVkIGJ5IHRoZSBtYXN0ZXIsIHNlbmRpbmcgdGhlCiMgREVMIGNvbW1hbmRzIHRvIHRoZSByZXBsaWNhIGFzIGtleXMgZXZpY3QgaW4gdGhlIG1hc3RlciBzaWRlLgojCiMgVGhpcyBiZWhhdmlvciBlbnN1cmVzIHRoYXQgbWFzdGVycyBhbmQgcmVwbGljYXMgc3RheSBjb25zaXN0ZW50LCBhbmQgaXMgdXN1YWxseQojIHdoYXQgeW91IHdhbnQsIGhvd2V2ZXIgaWYgeW91ciByZXBsaWNhIGlzIHdyaXRhYmxlLCBvciB5b3Ugd2FudCB0aGUgcmVwbGljYSB0byBoYXZlCiMgYSBkaWZmZXJlbnQgbWVtb3J5IHNldHRpbmcsIGFuZCB5b3UgYXJlIHN1cmUgYWxsIHRoZSB3cml0ZXMgcGVyZm9ybWVkIHRvIHRoZQojIHJlcGxpY2EgYXJlIGlkZW1wb3RlbnQsIHRoZW4geW91IG1heSBjaGFuZ2UgdGhpcyBkZWZhdWx0IChidXQgYmUgc3VyZSB0byB1bmRlcnN0YW5kCiMgd2hhdCB5b3UgYXJlIGRvaW5nKS4KIwojIE5vdGUgdGhhdCBzaW5jZSB0aGUgcmVwbGljYSBieSBkZWZhdWx0IGRvZXMgbm90IGV2aWN0LCBpdCBtYXkgZW5kIHVzaW5nIG1vcmUKIyBtZW1vcnkgdGhhbiB0aGUgb25lIHNldCB2aWEgbWF4bWVtb3J5ICh0aGVyZSBhcmUgY2VydGFpbiBidWZmZXJzIHRoYXQgbWF5CiMgYmUgbGFyZ2VyIG9uIHRoZSByZXBsaWNhLCBvciBkYXRhIHN0cnVjdHVyZXMgbWF5IHNvbWV0aW1lcyB0YWtlIG1vcmUgbWVtb3J5IGFuZCBzbwojIGZvcnRoKS4gU28gbWFrZSBzdXJlIHlvdSBtb25pdG9yIHlvdXIgcmVwbGljYXMgYW5kIG1ha2Ugc3VyZSB0aGV5IGhhdmUgZW5vdWdoCiMgbWVtb3J5IHRvIG5ldmVyIGhpdCBhIHJlYWwgb3V0LW9mLW1lbW9yeSBjb25kaXRpb24gYmVmb3JlIHRoZSBtYXN0ZXIgaGl0cwojIHRoZSBjb25maWd1cmVkIG1heG1lbW9yeSBzZXR0aW5nLgojCiMgcmVwbGljYS1pZ25vcmUtbWF4bWVtb3J5IHllcwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTEFaWSBGUkVFSU5HICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBSZWRpcyBoYXMgdHdvIHByaW1pdGl2ZXMgdG8gZGVsZXRlIGtleXMuIE9uZSBpcyBjYWxsZWQgREVMIGFuZCBpcyBhIGJsb2NraW5nCiMgZGVsZXRpb24gb2YgdGhlIG9iamVjdC4gSXQgbWVhbnMgdGhhdCB0aGUgc2VydmVyIHN0b3BzIHByb2Nlc3NpbmcgbmV3IGNvbW1hbmRzCiMgaW4gb3JkZXIgdG8gcmVjbGFpbSBhbGwgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0IGluIGEgc3luY2hyb25vdXMKIyB3YXkuIElmIHRoZSBrZXkgZGVsZXRlZCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzbWFsbCBvYmplY3QsIHRoZSB0aW1lIG5lZWRlZAojIGluIG9yZGVyIHRvIGV4ZWN1dGUgdGhlIERFTCBjb21tYW5kIGlzIHZlcnkgc21hbGwgYW5kIGNvbXBhcmFibGUgdG8gbW9zdCBvdGhlcgojIE8oMSkgb3IgTyhsb2dfTikgY29tbWFuZHMgaW4gUmVkaXMuIEhvd2V2ZXIgaWYgdGhlIGtleSBpcyBhc3NvY2lhdGVkIHdpdGggYW4KIyBhZ2dyZWdhdGVkIHZhbHVlIGNvbnRhaW5pbmcgbWlsbGlvbnMgb2YgZWxlbWVudHMsIHRoZSBzZXJ2ZXIgY2FuIGJsb2NrIGZvcgojIGEgbG9uZyB0aW1lIChldmVuIHNlY29uZHMpIGluIG9yZGVyIHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24uCiMKIyBGb3IgdGhlIGFib3ZlIHJlYXNvbnMgUmVkaXMgYWxzbyBvZmZlcnMgbm9uIGJsb2NraW5nIGRlbGV0aW9uIHByaW1pdGl2ZXMKIyBzdWNoIGFzIFVOTElOSyAobm9uIGJsb2NraW5nIERFTCkgYW5kIHRoZSBBU1lOQyBvcHRpb24gb2YgRkxVU0hBTEwgYW5kCiMgRkxVU0hEQiBjb21tYW5kcywgaW4gb3JkZXIgdG8gcmVjbGFpbSBtZW1vcnkgaW4gYmFja2dyb3VuZC4gVGhvc2UgY29tbWFuZHMKIyBhcmUgZXhlY3V0ZWQgaW4gY29uc3RhbnQgdGltZS4gQW5vdGhlciB0aHJlYWQgd2lsbCBpbmNyZW1lbnRhbGx5IGZyZWUgdGhlCiMgb2JqZWN0IGluIHRoZSBiYWNrZ3JvdW5kIGFzIGZhc3QgYXMgcG9zc2libGUuCiMKIyBERUwsIFVOTElOSyBhbmQgQVNZTkMgb3B0aW9uIG9mIEZMVVNIQUxMIGFuZCBGTFVTSERCIGFyZSB1c2VyLWNvbnRyb2xsZWQuCiMgSXQncyB1cCB0byB0aGUgZGVzaWduIG9mIHRoZSBhcHBsaWNhdGlvbiB0byB1bmRlcnN0YW5kIHdoZW4gaXQgaXMgYSBnb29kCiMgaWRlYSB0byB1c2Ugb25lIG9yIHRoZSBvdGhlci4gSG93ZXZlciB0aGUgUmVkaXMgc2VydmVyIHNvbWV0aW1lcyBoYXMgdG8KIyBkZWxldGUga2V5cyBvciBmbHVzaCB0aGUgd2hvbGUgZGF0YWJhc2UgYXMgYSBzaWRlIGVmZmVjdCBvZiBvdGhlciBvcGVyYXRpb25zLgojIFNwZWNpZmljYWxseSBSZWRpcyBkZWxldGVzIG9iamVjdHMgaW5kZXBlbmRlbnRseSBvZiBhIHVzZXIgY2FsbCBpbiB0aGUKIyBmb2xsb3dpbmcgc2NlbmFyaW9zOgojCiMgMSkgT24gZXZpY3Rpb24sIGJlY2F1c2Ugb2YgdGhlIG1heG1lbW9yeSBhbmQgbWF4bWVtb3J5IHBvbGljeSBjb25maWd1cmF0aW9ucywKIyAgICBpbiBvcmRlciB0byBtYWtlIHJvb20gZm9yIG5ldyBkYXRhLCB3aXRob3V0IGdvaW5nIG92ZXIgdGhlIHNwZWNpZmllZAojICAgIG1lbW9yeSBsaW1pdC4KIyAyKSBCZWNhdXNlIG9mIGV4cGlyZTogd2hlbiBhIGtleSB3aXRoIGFuIGFzc29jaWF0ZWQgdGltZSB0byBsaXZlIChzZWUgdGhlCiMgICAgRVhQSVJFIGNvbW1hbmQpIG11c3QgYmUgZGVsZXRlZCBmcm9tIG1lbW9yeS4KIyAzKSBCZWNhdXNlIG9mIGEgc2lkZSBlZmZlY3Qgb2YgYSBjb21tYW5kIHRoYXQgc3RvcmVzIGRhdGEgb24gYSBrZXkgdGhhdCBtYXkKIyAgICBhbHJlYWR5IGV4aXN0LiBGb3IgZXhhbXBsZSB0aGUgUkVOQU1FIGNvbW1hbmQgbWF5IGRlbGV0ZSB0aGUgb2xkIGtleQojICAgIGNvbnRlbnQgd2hlbiBpdCBpcyByZXBsYWNlZCB3aXRoIGFub3RoZXIgb25lLiBTaW1pbGFybHkgU1VOSU9OU1RPUkUKIyAgICBvciBTT1JUIHdpdGggU1RPUkUgb3B0aW9uIG1heSBkZWxldGUgZXhpc3Rpbmcga2V5cy4gVGhlIFNFVCBjb21tYW5kCiMgICAgaXRzZWxmIHJlbW92ZXMgYW55IG9sZCBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQga2V5IGluIG9yZGVyIHRvIHJlcGxhY2UKIyAgICBpdCB3aXRoIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgojIDQpIER1cmluZyByZXBsaWNhdGlvbiwgd2hlbiBhIHJlcGxpY2EgcGVyZm9ybXMgYSBmdWxsIHJlc3luY2hyb25pemF0aW9uIHdpdGgKIyAgICBpdHMgbWFzdGVyLCB0aGUgY29udGVudCBvZiB0aGUgd2hvbGUgZGF0YWJhc2UgaXMgcmVtb3ZlZCBpbiBvcmRlciB0bwojICAgIGxvYWQgdGhlIFJEQiBmaWxlIGp1c3QgdHJhbnNmZXJyZWQuCiMKIyBJbiBhbGwgdGhlIGFib3ZlIGNhc2VzIHRoZSBkZWZhdWx0IGlzIHRvIGRlbGV0ZSBvYmplY3RzIGluIGEgYmxvY2tpbmcgd2F5LAojIGxpa2UgaWYgREVMIHdhcyBjYWxsZWQuIEhvd2V2ZXIgeW91IGNhbiBjb25maWd1cmUgZWFjaCBjYXNlIHNwZWNpZmljYWxseQojIGluIG9yZGVyIHRvIGluc3RlYWQgcmVsZWFzZSBtZW1vcnkgaW4gYSBub24tYmxvY2tpbmcgd2F5IGxpa2UgaWYgVU5MSU5LCiMgd2FzIGNhbGxlZCwgdXNpbmcgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXM6CgpsYXp5ZnJlZS1sYXp5LWV2aWN0aW9uIG5vCmxhenlmcmVlLWxhenktZXhwaXJlIG5vCmxhenlmcmVlLWxhenktc2VydmVyLWRlbCBubwpyZXBsaWNhLWxhenktZmx1c2ggbm8KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBUFBFTkQgT05MWSBNT0RFICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgQnkgZGVmYXVsdCBSZWRpcyBhc3luY2hyb25vdXNseSBkdW1wcyB0aGUgZGF0YXNldCBvbiBkaXNrLiBUaGlzIG1vZGUgaXMKIyBnb29kIGVub3VnaCBpbiBtYW55IGFwcGxpY2F0aW9ucywgYnV0IGFuIGlzc3VlIHdpdGggdGhlIFJlZGlzIHByb2Nlc3Mgb3IKIyBhIHBvd2VyIG91dGFnZSBtYXkgcmVzdWx0IGludG8gYSBmZXcgbWludXRlcyBvZiB3cml0ZXMgbG9zdCAoZGVwZW5kaW5nIG9uCiMgdGhlIGNvbmZpZ3VyZWQgc2F2ZSBwb2ludHMpLgojCiMgVGhlIEFwcGVuZCBPbmx5IEZpbGUgaXMgYW4gYWx0ZXJuYXRpdmUgcGVyc2lzdGVuY2UgbW9kZSB0aGF0IHByb3ZpZGVzCiMgbXVjaCBiZXR0ZXIgZHVyYWJpbGl0eS4gRm9yIGluc3RhbmNlIHVzaW5nIHRoZSBkZWZhdWx0IGRhdGEgZnN5bmMgcG9saWN5CiMgKHNlZSBsYXRlciBpbiB0aGUgY29uZmlnIGZpbGUpIFJlZGlzIGNhbiBsb3NlIGp1c3Qgb25lIHNlY29uZCBvZiB3cml0ZXMgaW4gYQojIGRyYW1hdGljIGV2ZW50IGxpa2UgYSBzZXJ2ZXIgcG93ZXIgb3V0YWdlLCBvciBhIHNpbmdsZSB3cml0ZSBpZiBzb21ldGhpbmcKIyB3cm9uZyB3aXRoIHRoZSBSZWRpcyBwcm9jZXNzIGl0c2VsZiBoYXBwZW5zLCBidXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMKIyBzdGlsbCBydW5uaW5nIGNvcnJlY3RseS4KIwojIEFPRiBhbmQgUkRCIHBlcnNpc3RlbmNlIGNhbiBiZSBlbmFibGVkIGF0IHRoZSBzYW1lIHRpbWUgd2l0aG91dCBwcm9ibGVtcy4KIyBJZiB0aGUgQU9GIGlzIGVuYWJsZWQgb24gc3RhcnR1cCBSZWRpcyB3aWxsIGxvYWQgdGhlIEFPRiwgdGhhdCBpcyB0aGUgZmlsZQojIHdpdGggdGhlIGJldHRlciBkdXJhYmlsaXR5IGd1YXJhbnRlZXMuCiMKIyBQbGVhc2UgY2hlY2sgaHR0cDovL3JlZGlzLmlvL3RvcGljcy9wZXJzaXN0ZW5jZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCmFwcGVuZG9ubHkgbm8KCiMgVGhlIG5hbWUgb2YgdGhlIGFwcGVuZCBvbmx5IGZpbGUgKGRlZmF1bHQ6ICJhcHBlbmRvbmx5LmFvZiIpCgphcHBlbmRmaWxlbmFtZSAiYXBwZW5kb25seS5hb2YiCgojIFRoZSBmc3luYygpIGNhbGwgdGVsbHMgdGhlIE9wZXJhdGluZyBTeXN0ZW0gdG8gYWN0dWFsbHkgd3JpdGUgZGF0YSBvbiBkaXNrCiMgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBtb3JlIGRhdGEgaW4gdGhlIG91dHB1dCBidWZmZXIuIFNvbWUgT1Mgd2lsbCByZWFsbHkgZmx1c2gKIyBkYXRhIG9uIGRpc2ssIHNvbWUgb3RoZXIgT1Mgd2lsbCBqdXN0IHRyeSB0byBkbyBpdCBBU0FQLgojCiMgUmVkaXMgc3VwcG9ydHMgdGhyZWUgZGlmZmVyZW50IG1vZGVzOgojCiMgbm86IGRvbid0IGZzeW5jLCBqdXN0IGxldCB0aGUgT1MgZmx1c2ggdGhlIGRhdGEgd2hlbiBpdCB3YW50cy4gRmFzdGVyLgojIGFsd2F5czogZnN5bmMgYWZ0ZXIgZXZlcnkgd3JpdGUgdG8gdGhlIGFwcGVuZCBvbmx5IGxvZy4gU2xvdywgU2FmZXN0LgojIGV2ZXJ5c2VjOiBmc3luYyBvbmx5IG9uZSB0aW1lIGV2ZXJ5IHNlY29uZC4gQ29tcHJvbWlzZS4KIwojIFRoZSBkZWZhdWx0IGlzICJldmVyeXNlYyIsIGFzIHRoYXQncyB1c3VhbGx5IHRoZSByaWdodCBjb21wcm9taXNlIGJldHdlZW4KIyBzcGVlZCBhbmQgZGF0YSBzYWZldHkuIEl0J3MgdXAgdG8geW91IHRvIHVuZGVyc3RhbmQgaWYgeW91IGNhbiByZWxheCB0aGlzIHRvCiMgIm5vIiB0aGF0IHdpbGwgbGV0IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyIHdoZW4KIyBpdCB3YW50cywgZm9yIGJldHRlciBwZXJmb3JtYW5jZXMgKGJ1dCBpZiB5b3UgY2FuIGxpdmUgd2l0aCB0aGUgaWRlYSBvZgojIHNvbWUgZGF0YSBsb3NzIGNvbnNpZGVyIHRoZSBkZWZhdWx0IHBlcnNpc3RlbmNlIG1vZGUgdGhhdCdzIHNuYXBzaG90dGluZyksCiMgb3Igb24gdGhlIGNvbnRyYXJ5LCB1c2UgImFsd2F5cyIgdGhhdCdzIHZlcnkgc2xvdyBidXQgYSBiaXQgc2FmZXIgdGhhbgojIGV2ZXJ5c2VjLgojCiMgTW9yZSBkZXRhaWxzIHBsZWFzZSBjaGVjayB0aGUgZm9sbG93aW5nIGFydGljbGU6CiMgaHR0cDovL2FudGlyZXouY29tL3Bvc3QvcmVkaXMtcGVyc2lzdGVuY2UtZGVteXN0aWZpZWQuaHRtbAojCiMgSWYgdW5zdXJlLCB1c2UgImV2ZXJ5c2VjIi4KCiMgYXBwZW5kZnN5bmMgYWx3YXlzCmFwcGVuZGZzeW5jIGV2ZXJ5c2VjCiMgYXBwZW5kZnN5bmMgbm8KCiMgV2hlbiB0aGUgQU9GIGZzeW5jIHBvbGljeSBpcyBzZXQgdG8gYWx3YXlzIG9yIGV2ZXJ5c2VjLCBhbmQgYSBiYWNrZ3JvdW5kCiMgc2F2aW5nIHByb2Nlc3MgKGEgYmFja2dyb3VuZCBzYXZlIG9yIEFPRiBsb2cgYmFja2dyb3VuZCByZXdyaXRpbmcpIGlzCiMgcGVyZm9ybWluZyBhIGxvdCBvZiBJL08gYWdhaW5zdCB0aGUgZGlzaywgaW4gc29tZSBMaW51eCBjb25maWd1cmF0aW9ucwojIFJlZGlzIG1heSBibG9jayB0b28gbG9uZyBvbiB0aGUgZnN5bmMoKSBjYWxsLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gZml4IGZvcgojIHRoaXMgY3VycmVudGx5LCBhcyBldmVuIHBlcmZvcm1pbmcgZnN5bmMgaW4gYSBkaWZmZXJlbnQgdGhyZWFkIHdpbGwgYmxvY2sKIyBvdXIgc3luY2hyb25vdXMgd3JpdGUoMikgY2FsbC4KIwojIEluIG9yZGVyIHRvIG1pdGlnYXRlIHRoaXMgcHJvYmxlbSBpdCdzIHBvc3NpYmxlIHRvIHVzZSB0aGUgZm9sbG93aW5nIG9wdGlvbgojIHRoYXQgd2lsbCBwcmV2ZW50IGZzeW5jKCkgZnJvbSBiZWluZyBjYWxsZWQgaW4gdGhlIG1haW4gcHJvY2VzcyB3aGlsZSBhCiMgQkdTQVZFIG9yIEJHUkVXUklURUFPRiBpcyBpbiBwcm9ncmVzcy4KIwojIFRoaXMgbWVhbnMgdGhhdCB3aGlsZSBhbm90aGVyIGNoaWxkIGlzIHNhdmluZywgdGhlIGR1cmFiaWxpdHkgb2YgUmVkaXMgaXMKIyB0aGUgc2FtZSBhcyAiYXBwZW5kZnN5bmMgbm9uZSIuIEluIHByYWN0aWNhbCB0ZXJtcywgdGhpcyBtZWFucyB0aGF0IGl0IGlzCiMgcG9zc2libGUgdG8gbG9zZSB1cCB0byAzMCBzZWNvbmRzIG9mIGxvZyBpbiB0aGUgd29yc3Qgc2NlbmFyaW8gKHdpdGggdGhlCiMgZGVmYXVsdCBMaW51eCBzZXR0aW5ncykuCiMKIyBJZiB5b3UgaGF2ZSBsYXRlbmN5IHByb2JsZW1zIHR1cm4gdGhpcyB0byAieWVzIi4gT3RoZXJ3aXNlIGxlYXZlIGl0IGFzCiMgIm5vIiB0aGF0IGlzIHRoZSBzYWZlc3QgcGljayBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIGR1cmFiaWxpdHkuCgpuby1hcHBlbmRmc3luYy1vbi1yZXdyaXRlIG5vCgojIEF1dG9tYXRpYyByZXdyaXRlIG9mIHRoZSBhcHBlbmQgb25seSBmaWxlLgojIFJlZGlzIGlzIGFibGUgdG8gYXV0b21hdGljYWxseSByZXdyaXRlIHRoZSBsb2cgZmlsZSBpbXBsaWNpdGx5IGNhbGxpbmcKIyBCR1JFV1JJVEVBT0Ygd2hlbiB0aGUgQU9GIGxvZyBzaXplIGdyb3dzIGJ5IHRoZSBzcGVjaWZpZWQgcGVyY2VudGFnZS4KIwojIFRoaXMgaXMgaG93IGl0IHdvcmtzOiBSZWRpcyByZW1lbWJlcnMgdGhlIHNpemUgb2YgdGhlIEFPRiBmaWxlIGFmdGVyIHRoZQojIGxhdGVzdCByZXdyaXRlIChpZiBubyByZXdyaXRlIGhhcyBoYXBwZW5lZCBzaW5jZSB0aGUgcmVzdGFydCwgdGhlIHNpemUgb2YKIyB0aGUgQU9GIGF0IHN0YXJ0dXAgaXMgdXNlZCkuCiMKIyBUaGlzIGJhc2Ugc2l6ZSBpcyBjb21wYXJlZCB0byB0aGUgY3VycmVudCBzaXplLiBJZiB0aGUgY3VycmVudCBzaXplIGlzCiMgYmlnZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBwZXJjZW50YWdlLCB0aGUgcmV3cml0ZSBpcyB0cmlnZ2VyZWQuIEFsc28KIyB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWluaW1hbCBzaXplIGZvciB0aGUgQU9GIGZpbGUgdG8gYmUgcmV3cml0dGVuLCB0aGlzCiMgaXMgdXNlZnVsIHRvIGF2b2lkIHJld3JpdGluZyB0aGUgQU9GIGZpbGUgZXZlbiBpZiB0aGUgcGVyY2VudGFnZSBpbmNyZWFzZQojIGlzIHJlYWNoZWQgYnV0IGl0IGlzIHN0aWxsIHByZXR0eSBzbWFsbC4KIwojIFNwZWNpZnkgYSBwZXJjZW50YWdlIG9mIHplcm8gaW4gb3JkZXIgdG8gZGlzYWJsZSB0aGUgYXV0b21hdGljIEFPRgojIHJld3JpdGUgZmVhdHVyZS4KCmF1dG8tYW9mLXJld3JpdGUtcGVyY2VudGFnZSAxMDAKYXV0by1hb2YtcmV3cml0ZS1taW4tc2l6ZSA2NG1iCgojIEFuIEFPRiBmaWxlIG1heSBiZSBmb3VuZCB0byBiZSB0cnVuY2F0ZWQgYXQgdGhlIGVuZCBkdXJpbmcgdGhlIFJlZGlzCiMgc3RhcnR1cCBwcm9jZXNzLCB3aGVuIHRoZSBBT0YgZGF0YSBnZXRzIGxvYWRlZCBiYWNrIGludG8gbWVtb3J5LgojIFRoaXMgbWF5IGhhcHBlbiB3aGVuIHRoZSBzeXN0ZW0gd2hlcmUgUmVkaXMgaXMgcnVubmluZwojIGNyYXNoZXMsIGVzcGVjaWFsbHkgd2hlbiBhbiBleHQ0IGZpbGVzeXN0ZW0gaXMgbW91bnRlZCB3aXRob3V0IHRoZQojIGRhdGE9b3JkZXJlZCBvcHRpb24gKGhvd2V2ZXIgdGhpcyBjYW4ndCBoYXBwZW4gd2hlbiBSZWRpcyBpdHNlbGYKIyBjcmFzaGVzIG9yIGFib3J0cyBidXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3RpbGwgd29ya3MgY29ycmVjdGx5KS4KIwojIFJlZGlzIGNhbiBlaXRoZXIgZXhpdCB3aXRoIGFuIGVycm9yIHdoZW4gdGhpcyBoYXBwZW5zLCBvciBsb2FkIGFzIG11Y2gKIyBkYXRhIGFzIHBvc3NpYmxlICh0aGUgZGVmYXVsdCBub3cpIGFuZCBzdGFydCBpZiB0aGUgQU9GIGZpbGUgaXMgZm91bmQKIyB0byBiZSB0cnVuY2F0ZWQgYXQgdGhlIGVuZC4gVGhlIGZvbGxvd2luZyBvcHRpb24gY29udHJvbHMgdGhpcyBiZWhhdmlvci4KIwojIElmIGFvZi1sb2FkLXRydW5jYXRlZCBpcyBzZXQgdG8geWVzLCBhIHRydW5jYXRlZCBBT0YgZmlsZSBpcyBsb2FkZWQgYW5kCiMgdGhlIFJlZGlzIHNlcnZlciBzdGFydHMgZW1pdHRpbmcgYSBsb2cgdG8gaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSBldmVudC4KIyBPdGhlcndpc2UgaWYgdGhlIG9wdGlvbiBpcyBzZXQgdG8gbm8sIHRoZSBzZXJ2ZXIgYWJvcnRzIHdpdGggYW4gZXJyb3IKIyBhbmQgcmVmdXNlcyB0byBzdGFydC4gV2hlbiB0aGUgb3B0aW9uIGlzIHNldCB0byBubywgdGhlIHVzZXIgcmVxdWlyZXMKIyB0byBmaXggdGhlIEFPRiBmaWxlIHVzaW5nIHRoZSAicmVkaXMtY2hlY2stYW9mIiB1dGlsaXR5IGJlZm9yZSB0byByZXN0YXJ0CiMgdGhlIHNlcnZlci4KIwojIE5vdGUgdGhhdCBpZiB0aGUgQU9GIGZpbGUgd2lsbCBiZSBmb3VuZCB0byBiZSBjb3JydXB0ZWQgaW4gdGhlIG1pZGRsZQojIHRoZSBzZXJ2ZXIgd2lsbCBzdGlsbCBleGl0IHdpdGggYW4gZXJyb3IuIFRoaXMgb3B0aW9uIG9ubHkgYXBwbGllcyB3aGVuCiMgUmVkaXMgd2lsbCB0cnkgdG8gcmVhZCBtb3JlIGRhdGEgZnJvbSB0aGUgQU9GIGZpbGUgYnV0IG5vdCBlbm91Z2ggYnl0ZXMKIyB3aWxsIGJlIGZvdW5kLgphb2YtbG9hZC10cnVuY2F0ZWQgeWVzCgojIFdoZW4gcmV3cml0aW5nIHRoZSBBT0YgZmlsZSwgUmVkaXMgaXMgYWJsZSB0byB1c2UgYW4gUkRCIHByZWFtYmxlIGluIHRoZQojIEFPRiBmaWxlIGZvciBmYXN0ZXIgcmV3cml0ZXMgYW5kIHJlY292ZXJpZXMuIFdoZW4gdGhpcyBvcHRpb24gaXMgdHVybmVkCiMgb24gdGhlIHJld3JpdHRlbiBBT0YgZmlsZSBpcyBjb21wb3NlZCBvZiB0d28gZGlmZmVyZW50IHN0YW56YXM6CiMKIyAgIFtSREIgZmlsZV1bQU9GIHRhaWxdCiMKIyBXaGVuIGxvYWRpbmcgUmVkaXMgcmVjb2duaXplcyB0aGF0IHRoZSBBT0YgZmlsZSBzdGFydHMgd2l0aCB0aGUgIlJFRElTIgojIHN0cmluZyBhbmQgbG9hZHMgdGhlIHByZWZpeGVkIFJEQiBmaWxlLCBhbmQgY29udGludWVzIGxvYWRpbmcgdGhlIEFPRgojIHRhaWwuCmFvZi11c2UtcmRiLXByZWFtYmxlIHllcwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTFVBIFNDUklQVElORyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBNYXggZXhlY3V0aW9uIHRpbWUgb2YgYSBMdWEgc2NyaXB0IGluIG1pbGxpc2Vjb25kcy4KIwojIElmIHRoZSBtYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIGlzIHJlYWNoZWQgUmVkaXMgd2lsbCBsb2cgdGhhdCBhIHNjcmlwdCBpcwojIHN0aWxsIGluIGV4ZWN1dGlvbiBhZnRlciB0aGUgbWF4aW11bSBhbGxvd2VkIHRpbWUgYW5kIHdpbGwgc3RhcnQgdG8KIyByZXBseSB0byBxdWVyaWVzIHdpdGggYW4gZXJyb3IuCiMKIyBXaGVuIGEgbG9uZyBydW5uaW5nIHNjcmlwdCBleGNlZWRzIHRoZSBtYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIG9ubHkgdGhlCiMgU0NSSVBUIEtJTEwgYW5kIFNIVVRET1dOIE5PU0FWRSBjb21tYW5kcyBhcmUgYXZhaWxhYmxlLiBUaGUgZmlyc3QgY2FuIGJlCiMgdXNlZCB0byBzdG9wIGEgc2NyaXB0IHRoYXQgZGlkIG5vdCB5ZXQgY2FsbGVkIHdyaXRlIGNvbW1hbmRzLiBUaGUgc2Vjb25kCiMgaXMgdGhlIG9ubHkgd2F5IHRvIHNodXQgZG93biB0aGUgc2VydmVyIGluIHRoZSBjYXNlIGEgd3JpdGUgY29tbWFuZCB3YXMKIyBhbHJlYWR5IGlzc3VlZCBieSB0aGUgc2NyaXB0IGJ1dCB0aGUgdXNlciBkb2Vzbid0IHdhbnQgdG8gd2FpdCBmb3IgdGhlIG5hdHVyYWwKIyB0ZXJtaW5hdGlvbiBvZiB0aGUgc2NyaXB0LgojCiMgU2V0IGl0IHRvIDAgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBmb3IgdW5saW1pdGVkIGV4ZWN1dGlvbiB3aXRob3V0IHdhcm5pbmdzLgpsdWEtdGltZS1saW1pdCA1MDAwCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSRURJUyBDTFVTVEVSICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIE5vcm1hbCBSZWRpcyBpbnN0YW5jZXMgY2FuJ3QgYmUgcGFydCBvZiBhIFJlZGlzIENsdXN0ZXI7IG9ubHkgbm9kZXMgdGhhdCBhcmUKIyBzdGFydGVkIGFzIGNsdXN0ZXIgbm9kZXMgY2FuLiBJbiBvcmRlciB0byBzdGFydCBhIFJlZGlzIGluc3RhbmNlIGFzIGEKIyBjbHVzdGVyIG5vZGUgZW5hYmxlIHRoZSBjbHVzdGVyIHN1cHBvcnQgdW5jb21tZW50aW5nIHRoZSBmb2xsb3dpbmc6CiMKIyBjbHVzdGVyLWVuYWJsZWQgeWVzCgojIEV2ZXJ5IGNsdXN0ZXIgbm9kZSBoYXMgYSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gZmlsZS4gVGhpcyBmaWxlIGlzIG5vdAojIGludGVuZGVkIHRvIGJlIGVkaXRlZCBieSBoYW5kLiBJdCBpcyBjcmVhdGVkIGFuZCB1cGRhdGVkIGJ5IFJlZGlzIG5vZGVzLgojIEV2ZXJ5IFJlZGlzIENsdXN0ZXIgbm9kZSByZXF1aXJlcyBhIGRpZmZlcmVudCBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gZmlsZS4KIyBNYWtlIHN1cmUgdGhhdCBpbnN0YW5jZXMgcnVubmluZyBpbiB0aGUgc2FtZSBzeXN0ZW0gZG8gbm90IGhhdmUKIyBvdmVybGFwcGluZyBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lcy4KIwojIGNsdXN0ZXItY29uZmlnLWZpbGUgbm9kZXMtNjM3OS5jb25mCgojIENsdXN0ZXIgbm9kZSB0aW1lb3V0IGlzIHRoZSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIGEgbm9kZSBtdXN0IGJlIHVucmVhY2hhYmxlCiMgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgaW4gZmFpbHVyZSBzdGF0ZS4KIyBNb3N0IG90aGVyIGludGVybmFsIHRpbWUgbGltaXRzIGFyZSBtdWx0aXBsZSBvZiB0aGUgbm9kZSB0aW1lb3V0LgojCiMgY2x1c3Rlci1ub2RlLXRpbWVvdXQgMTUwMDAKCiMgQSByZXBsaWNhIG9mIGEgZmFpbGluZyBtYXN0ZXIgd2lsbCBhdm9pZCB0byBzdGFydCBhIGZhaWxvdmVyIGlmIGl0cyBkYXRhCiMgbG9va3MgdG9vIG9sZC4KIwojIFRoZXJlIGlzIG5vIHNpbXBsZSB3YXkgZm9yIGEgcmVwbGljYSB0byBhY3R1YWxseSBoYXZlIGFuIGV4YWN0IG1lYXN1cmUgb2YKIyBpdHMgImRhdGEgYWdlIiwgc28gdGhlIGZvbGxvd2luZyB0d28gY2hlY2tzIGFyZSBwZXJmb3JtZWQ6CiMKIyAxKSBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgcmVwbGljYXMgYWJsZSB0byBmYWlsb3ZlciwgdGhleSBleGNoYW5nZSBtZXNzYWdlcwojICAgIGluIG9yZGVyIHRvIHRyeSB0byBnaXZlIGFuIGFkdmFudGFnZSB0byB0aGUgcmVwbGljYSB3aXRoIHRoZSBiZXN0CiMgICAgcmVwbGljYXRpb24gb2Zmc2V0IChtb3JlIGRhdGEgZnJvbSB0aGUgbWFzdGVyIHByb2Nlc3NlZCkuCiMgICAgUmVwbGljYXMgd2lsbCB0cnkgdG8gZ2V0IHRoZWlyIHJhbmsgYnkgb2Zmc2V0LCBhbmQgYXBwbHkgdG8gdGhlIHN0YXJ0CiMgICAgb2YgdGhlIGZhaWxvdmVyIGEgZGVsYXkgcHJvcG9ydGlvbmFsIHRvIHRoZWlyIHJhbmsuCiMKIyAyKSBFdmVyeSBzaW5nbGUgcmVwbGljYSBjb21wdXRlcyB0aGUgdGltZSBvZiB0aGUgbGFzdCBpbnRlcmFjdGlvbiB3aXRoCiMgICAgaXRzIG1hc3Rlci4gVGhpcyBjYW4gYmUgdGhlIGxhc3QgcGluZyBvciBjb21tYW5kIHJlY2VpdmVkIChpZiB0aGUgbWFzdGVyCiMgICAgaXMgc3RpbGwgaW4gdGhlICJjb25uZWN0ZWQiIHN0YXRlKSwgb3IgdGhlIHRpbWUgdGhhdCBlbGFwc2VkIHNpbmNlIHRoZQojICAgIGRpc2Nvbm5lY3Rpb24gd2l0aCB0aGUgbWFzdGVyIChpZiB0aGUgcmVwbGljYXRpb24gbGluayBpcyBjdXJyZW50bHkgZG93bikuCiMgICAgSWYgdGhlIGxhc3QgaW50ZXJhY3Rpb24gaXMgdG9vIG9sZCwgdGhlIHJlcGxpY2Egd2lsbCBub3QgdHJ5IHRvIGZhaWxvdmVyCiMgICAgYXQgYWxsLgojCiMgVGhlIHBvaW50ICIyIiBjYW4gYmUgdHVuZWQgYnkgdXNlci4gU3BlY2lmaWNhbGx5IGEgcmVwbGljYSB3aWxsIG5vdCBwZXJmb3JtCiMgdGhlIGZhaWxvdmVyIGlmLCBzaW5jZSB0aGUgbGFzdCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBtYXN0ZXIsIHRoZSB0aW1lCiMgZWxhcHNlZCBpcyBncmVhdGVyIHRoYW46CiMKIyAgIChub2RlLXRpbWVvdXQgKiByZXBsaWNhLXZhbGlkaXR5LWZhY3RvcikgKyByZXBsLXBpbmctcmVwbGljYS1wZXJpb2QKIwojIFNvIGZvciBleGFtcGxlIGlmIG5vZGUtdGltZW91dCBpcyAzMCBzZWNvbmRzLCBhbmQgdGhlIHJlcGxpY2EtdmFsaWRpdHktZmFjdG9yCiMgaXMgMTAsIGFuZCBhc3N1bWluZyBhIGRlZmF1bHQgcmVwbC1waW5nLXJlcGxpY2EtcGVyaW9kIG9mIDEwIHNlY29uZHMsIHRoZQojIHJlcGxpY2Egd2lsbCBub3QgdHJ5IHRvIGZhaWxvdmVyIGlmIGl0IHdhcyBub3QgYWJsZSB0byB0YWxrIHdpdGggdGhlIG1hc3RlcgojIGZvciBsb25nZXIgdGhhbiAzMTAgc2Vjb25kcy4KIwojIEEgbGFyZ2UgcmVwbGljYS12YWxpZGl0eS1mYWN0b3IgbWF5IGFsbG93IHJlcGxpY2FzIHdpdGggdG9vIG9sZCBkYXRhIHRvIGZhaWxvdmVyCiMgYSBtYXN0ZXIsIHdoaWxlIGEgdG9vIHNtYWxsIHZhbHVlIG1heSBwcmV2ZW50IHRoZSBjbHVzdGVyIGZyb20gYmVpbmcgYWJsZSB0bwojIGVsZWN0IGEgcmVwbGljYSBhdCBhbGwuCiMKIyBGb3IgbWF4aW11bSBhdmFpbGFiaWxpdHksIGl0IGlzIHBvc3NpYmxlIHRvIHNldCB0aGUgcmVwbGljYS12YWxpZGl0eS1mYWN0b3IKIyB0byBhIHZhbHVlIG9mIDAsIHdoaWNoIG1lYW5zLCB0aGF0IHJlcGxpY2FzIHdpbGwgYWx3YXlzIHRyeSB0byBmYWlsb3ZlciB0aGUKIyBtYXN0ZXIgcmVnYXJkbGVzcyBvZiB0aGUgbGFzdCB0aW1lIHRoZXkgaW50ZXJhY3RlZCB3aXRoIHRoZSBtYXN0ZXIuCiMgKEhvd2V2ZXIgdGhleSdsbCBhbHdheXMgdHJ5IHRvIGFwcGx5IGEgZGVsYXkgcHJvcG9ydGlvbmFsIHRvIHRoZWlyCiMgb2Zmc2V0IHJhbmspLgojCiMgWmVybyBpcyB0aGUgb25seSB2YWx1ZSBhYmxlIHRvIGd1YXJhbnRlZSB0aGF0IHdoZW4gYWxsIHRoZSBwYXJ0aXRpb25zIGhlYWwKIyB0aGUgY2x1c3RlciB3aWxsIGFsd2F5cyBiZSBhYmxlIHRvIGNvbnRpbnVlLgojCiMgY2x1c3Rlci1yZXBsaWNhLXZhbGlkaXR5LWZhY3RvciAxMAoKIyBDbHVzdGVyIHJlcGxpY2FzIGFyZSBhYmxlIHRvIG1pZ3JhdGUgdG8gb3JwaGFuZWQgbWFzdGVycywgdGhhdCBhcmUgbWFzdGVycwojIHRoYXQgYXJlIGxlZnQgd2l0aG91dCB3b3JraW5nIHJlcGxpY2FzLiBUaGlzIGltcHJvdmVzIHRoZSBjbHVzdGVyIGFiaWxpdHkKIyB0byByZXNpc3QgdG8gZmFpbHVyZXMgYXMgb3RoZXJ3aXNlIGFuIG9ycGhhbmVkIG1hc3RlciBjYW4ndCBiZSBmYWlsZWQgb3ZlcgojIGluIGNhc2Ugb2YgZmFpbHVyZSBpZiBpdCBoYXMgbm8gd29ya2luZyByZXBsaWNhcy4KIwojIFJlcGxpY2FzIG1pZ3JhdGUgdG8gb3JwaGFuZWQgbWFzdGVycyBvbmx5IGlmIHRoZXJlIGFyZSBzdGlsbCBhdCBsZWFzdCBhCiMgZ2l2ZW4gbnVtYmVyIG9mIG90aGVyIHdvcmtpbmcgcmVwbGljYXMgZm9yIHRoZWlyIG9sZCBtYXN0ZXIuIFRoaXMgbnVtYmVyCiMgaXMgdGhlICJtaWdyYXRpb24gYmFycmllciIuIEEgbWlncmF0aW9uIGJhcnJpZXIgb2YgMSBtZWFucyB0aGF0IGEgcmVwbGljYQojIHdpbGwgbWlncmF0ZSBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgb3RoZXIgd29ya2luZyByZXBsaWNhIGZvciBpdHMgbWFzdGVyCiMgYW5kIHNvIGZvcnRoLiBJdCB1c3VhbGx5IHJlZmxlY3RzIHRoZSBudW1iZXIgb2YgcmVwbGljYXMgeW91IHdhbnQgZm9yIGV2ZXJ5CiMgbWFzdGVyIGluIHlvdXIgY2x1c3Rlci4KIwojIERlZmF1bHQgaXMgMSAocmVwbGljYXMgbWlncmF0ZSBvbmx5IGlmIHRoZWlyIG1hc3RlcnMgcmVtYWluIHdpdGggYXQgbGVhc3QKIyBvbmUgcmVwbGljYSkuIFRvIGRpc2FibGUgbWlncmF0aW9uIGp1c3Qgc2V0IGl0IHRvIGEgdmVyeSBsYXJnZSB2YWx1ZS4KIyBBIHZhbHVlIG9mIDAgY2FuIGJlIHNldCBidXQgaXMgdXNlZnVsIG9ubHkgZm9yIGRlYnVnZ2luZyBhbmQgZGFuZ2Vyb3VzCiMgaW4gcHJvZHVjdGlvbi4KIwojIGNsdXN0ZXItbWlncmF0aW9uLWJhcnJpZXIgMQoKIyBCeSBkZWZhdWx0IFJlZGlzIENsdXN0ZXIgbm9kZXMgc3RvcCBhY2NlcHRpbmcgcXVlcmllcyBpZiB0aGV5IGRldGVjdCB0aGVyZQojIGlzIGF0IGxlYXN0IGFuIGhhc2ggc2xvdCB1bmNvdmVyZWQgKG5vIGF2YWlsYWJsZSBub2RlIGlzIHNlcnZpbmcgaXQpLgojIFRoaXMgd2F5IGlmIHRoZSBjbHVzdGVyIGlzIHBhcnRpYWxseSBkb3duIChmb3IgZXhhbXBsZSBhIHJhbmdlIG9mIGhhc2ggc2xvdHMKIyBhcmUgbm8gbG9uZ2VyIGNvdmVyZWQpIGFsbCB0aGUgY2x1c3RlciBiZWNvbWVzLCBldmVudHVhbGx5LCB1bmF2YWlsYWJsZS4KIyBJdCBhdXRvbWF0aWNhbGx5IHJldHVybnMgYXZhaWxhYmxlIGFzIHNvb24gYXMgYWxsIHRoZSBzbG90cyBhcmUgY292ZXJlZCBhZ2Fpbi4KIwojIEhvd2V2ZXIgc29tZXRpbWVzIHlvdSB3YW50IHRoZSBzdWJzZXQgb2YgdGhlIGNsdXN0ZXIgd2hpY2ggaXMgd29ya2luZywKIyB0byBjb250aW51ZSB0byBhY2NlcHQgcXVlcmllcyBmb3IgdGhlIHBhcnQgb2YgdGhlIGtleSBzcGFjZSB0aGF0IGlzIHN0aWxsCiMgY292ZXJlZC4gSW4gb3JkZXIgdG8gZG8gc28sIGp1c3Qgc2V0IHRoZSBjbHVzdGVyLXJlcXVpcmUtZnVsbC1jb3ZlcmFnZQojIG9wdGlvbiB0byBuby4KIwojIGNsdXN0ZXItcmVxdWlyZS1mdWxsLWNvdmVyYWdlIHllcwoKIyBUaGlzIG9wdGlvbiwgd2hlbiBzZXQgdG8geWVzLCBwcmV2ZW50cyByZXBsaWNhcyBmcm9tIHRyeWluZyB0byBmYWlsb3ZlciBpdHMKIyBtYXN0ZXIgZHVyaW5nIG1hc3RlciBmYWlsdXJlcy4gSG93ZXZlciB0aGUgbWFzdGVyIGNhbiBzdGlsbCBwZXJmb3JtIGEKIyBtYW51YWwgZmFpbG92ZXIsIGlmIGZvcmNlZCB0byBkbyBzby4KIwojIFRoaXMgaXMgdXNlZnVsIGluIGRpZmZlcmVudCBzY2VuYXJpb3MsIGVzcGVjaWFsbHkgaW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUKIyBkYXRhIGNlbnRlciBvcGVyYXRpb25zLCB3aGVyZSB3ZSB3YW50IG9uZSBzaWRlIHRvIG5ldmVyIGJlIHByb21vdGVkIGlmIG5vdAojIGluIHRoZSBjYXNlIG9mIGEgdG90YWwgREMgZmFpbHVyZS4KIwojIGNsdXN0ZXItcmVwbGljYS1uby1mYWlsb3ZlciBubwoKIyBJbiBvcmRlciB0byBzZXR1cCB5b3VyIGNsdXN0ZXIgbWFrZSBzdXJlIHRvIHJlYWQgdGhlIGRvY3VtZW50YXRpb24KIyBhdmFpbGFibGUgYXQgaHR0cDovL3JlZGlzLmlvIHdlYiBzaXRlLgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ0xVU1RFUiBET0NLRVIvTkFUIHN1cHBvcnQgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBJbiBjZXJ0YWluIGRlcGxveW1lbnRzLCBSZWRpcyBDbHVzdGVyIG5vZGVzIGFkZHJlc3MgZGlzY292ZXJ5IGZhaWxzLCBiZWNhdXNlCiMgYWRkcmVzc2VzIGFyZSBOQVQtdGVkIG9yIGJlY2F1c2UgcG9ydHMgYXJlIGZvcndhcmRlZCAodGhlIHR5cGljYWwgY2FzZSBpcwojIERvY2tlciBhbmQgb3RoZXIgY29udGFpbmVycykuCiMKIyBJbiBvcmRlciB0byBtYWtlIFJlZGlzIENsdXN0ZXIgd29ya2luZyBpbiBzdWNoIGVudmlyb25tZW50cywgYSBzdGF0aWMKIyBjb25maWd1cmF0aW9uIHdoZXJlIGVhY2ggbm9kZSBrbm93cyBpdHMgcHVibGljIGFkZHJlc3MgaXMgbmVlZGVkLiBUaGUKIyBmb2xsb3dpbmcgdHdvIG9wdGlvbnMgYXJlIHVzZWQgZm9yIHRoaXMgc2NvcGUsIGFuZCBhcmU6CiMKIyAqIGNsdXN0ZXItYW5ub3VuY2UtaXAKIyAqIGNsdXN0ZXItYW5ub3VuY2UtcG9ydAojICogY2x1c3Rlci1hbm5vdW5jZS1idXMtcG9ydAojCiMgRWFjaCBpbnN0cnVjdCB0aGUgbm9kZSBhYm91dCBpdHMgYWRkcmVzcywgY2xpZW50IHBvcnQsIGFuZCBjbHVzdGVyIG1lc3NhZ2UKIyBidXMgcG9ydC4gVGhlIGluZm9ybWF0aW9uIGlzIHRoZW4gcHVibGlzaGVkIGluIHRoZSBoZWFkZXIgb2YgdGhlIGJ1cyBwYWNrZXRzCiMgc28gdGhhdCBvdGhlciBub2RlcyB3aWxsIGJlIGFibGUgdG8gY29ycmVjdGx5IG1hcCB0aGUgYWRkcmVzcyBvZiB0aGUgbm9kZQojIHB1Ymxpc2hpbmcgdGhlIGluZm9ybWF0aW9uLgojCiMgSWYgdGhlIGFib3ZlIG9wdGlvbnMgYXJlIG5vdCB1c2VkLCB0aGUgbm9ybWFsIFJlZGlzIENsdXN0ZXIgYXV0by1kZXRlY3Rpb24KIyB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KIwojIE5vdGUgdGhhdCB3aGVuIHJlbWFwcGVkLCB0aGUgYnVzIHBvcnQgbWF5IG5vdCBiZSBhdCB0aGUgZml4ZWQgb2Zmc2V0IG9mCiMgY2xpZW50cyBwb3J0ICsgMTAwMDAsIHNvIHlvdSBjYW4gc3BlY2lmeSBhbnkgcG9ydCBhbmQgYnVzLXBvcnQgZGVwZW5kaW5nCiMgb24gaG93IHRoZXkgZ2V0IHJlbWFwcGVkLiBJZiB0aGUgYnVzLXBvcnQgaXMgbm90IHNldCwgYSBmaXhlZCBvZmZzZXQgb2YKIyAxMDAwMCB3aWxsIGJlIHVzZWQgYXMgdXN1YWxseS4KIwojIEV4YW1wbGU6CiMKIyBjbHVzdGVyLWFubm91bmNlLWlwIDEwLjEuMS41CiMgY2x1c3Rlci1hbm5vdW5jZS1wb3J0IDYzNzkKIyBjbHVzdGVyLWFubm91bmNlLWJ1cy1wb3J0IDYzODAKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU0xPVyBMT0cgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgVGhlIFJlZGlzIFNsb3cgTG9nIGlzIGEgc3lzdGVtIHRvIGxvZyBxdWVyaWVzIHRoYXQgZXhjZWVkZWQgYSBzcGVjaWZpZWQKIyBleGVjdXRpb24gdGltZS4gVGhlIGV4ZWN1dGlvbiB0aW1lIGRvZXMgbm90IGluY2x1ZGUgdGhlIEkvTyBvcGVyYXRpb25zCiMgbGlrZSB0YWxraW5nIHdpdGggdGhlIGNsaWVudCwgc2VuZGluZyB0aGUgcmVwbHkgYW5kIHNvIGZvcnRoLAojIGJ1dCBqdXN0IHRoZSB0aW1lIG5lZWRlZCB0byBhY3R1YWxseSBleGVjdXRlIHRoZSBjb21tYW5kICh0aGlzIGlzIHRoZSBvbmx5CiMgc3RhZ2Ugb2YgY29tbWFuZCBleGVjdXRpb24gd2hlcmUgdGhlIHRocmVhZCBpcyBibG9ja2VkIGFuZCBjYW4gbm90IHNlcnZlCiMgb3RoZXIgcmVxdWVzdHMgaW4gdGhlIG1lYW50aW1lKS4KIwojIFlvdSBjYW4gY29uZmlndXJlIHRoZSBzbG93IGxvZyB3aXRoIHR3byBwYXJhbWV0ZXJzOiBvbmUgdGVsbHMgUmVkaXMKIyB3aGF0IGlzIHRoZSBleGVjdXRpb24gdGltZSwgaW4gbWljcm9zZWNvbmRzLCB0byBleGNlZWQgaW4gb3JkZXIgZm9yIHRoZQojIGNvbW1hbmQgdG8gZ2V0IGxvZ2dlZCwgYW5kIHRoZSBvdGhlciBwYXJhbWV0ZXIgaXMgdGhlIGxlbmd0aCBvZiB0aGUKIyBzbG93IGxvZy4gV2hlbiBhIG5ldyBjb21tYW5kIGlzIGxvZ2dlZCB0aGUgb2xkZXN0IG9uZSBpcyByZW1vdmVkIGZyb20gdGhlCiMgcXVldWUgb2YgbG9nZ2VkIGNvbW1hbmRzLgoKIyBUaGUgZm9sbG93aW5nIHRpbWUgaXMgZXhwcmVzc2VkIGluIG1pY3Jvc2Vjb25kcywgc28gMTAwMDAwMCBpcyBlcXVpdmFsZW50CiMgdG8gb25lIHNlY29uZC4gTm90ZSB0aGF0IGEgbmVnYXRpdmUgbnVtYmVyIGRpc2FibGVzIHRoZSBzbG93IGxvZywgd2hpbGUKIyBhIHZhbHVlIG9mIHplcm8gZm9yY2VzIHRoZSBsb2dnaW5nIG9mIGV2ZXJ5IGNvbW1hbmQuCnNsb3dsb2ctbG9nLXNsb3dlci10aGFuIDEwMDAwCgojIFRoZXJlIGlzIG5vIGxpbWl0IHRvIHRoaXMgbGVuZ3RoLiBKdXN0IGJlIGF3YXJlIHRoYXQgaXQgd2lsbCBjb25zdW1lIG1lbW9yeS4KIyBZb3UgY2FuIHJlY2xhaW0gbWVtb3J5IHVzZWQgYnkgdGhlIHNsb3cgbG9nIHdpdGggU0xPV0xPRyBSRVNFVC4Kc2xvd2xvZy1tYXgtbGVuIDEyOAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTEFURU5DWSBNT05JVE9SICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBUaGUgUmVkaXMgbGF0ZW5jeSBtb25pdG9yaW5nIHN1YnN5c3RlbSBzYW1wbGVzIGRpZmZlcmVudCBvcGVyYXRpb25zCiMgYXQgcnVudGltZSBpbiBvcmRlciB0byBjb2xsZWN0IGRhdGEgcmVsYXRlZCB0byBwb3NzaWJsZSBzb3VyY2VzIG9mCiMgbGF0ZW5jeSBvZiBhIFJlZGlzIGluc3RhbmNlLgojCiMgVmlhIHRoZSBMQVRFTkNZIGNvbW1hbmQgdGhpcyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdG8gdGhlIHVzZXIgdGhhdCBjYW4KIyBwcmludCBncmFwaHMgYW5kIG9idGFpbiByZXBvcnRzLgojCiMgVGhlIHN5c3RlbSBvbmx5IGxvZ3Mgb3BlcmF0aW9ucyB0aGF0IHdlcmUgcGVyZm9ybWVkIGluIGEgdGltZSBlcXVhbCBvcgojIGdyZWF0ZXIgdGhhbiB0aGUgYW1vdW50IG9mIG1pbGxpc2Vjb25kcyBzcGVjaWZpZWQgdmlhIHRoZQojIGxhdGVuY3ktbW9uaXRvci10aHJlc2hvbGQgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUuIFdoZW4gaXRzIHZhbHVlIGlzIHNldAojIHRvIHplcm8sIHRoZSBsYXRlbmN5IG1vbml0b3IgaXMgdHVybmVkIG9mZi4KIwojIEJ5IGRlZmF1bHQgbGF0ZW5jeSBtb25pdG9yaW5nIGlzIGRpc2FibGVkIHNpbmNlIGl0IGlzIG1vc3RseSBub3QgbmVlZGVkCiMgaWYgeW91IGRvbid0IGhhdmUgbGF0ZW5jeSBpc3N1ZXMsIGFuZCBjb2xsZWN0aW5nIGRhdGEgaGFzIGEgcGVyZm9ybWFuY2UKIyBpbXBhY3QsIHRoYXQgd2hpbGUgdmVyeSBzbWFsbCwgY2FuIGJlIG1lYXN1cmVkIHVuZGVyIGJpZyBsb2FkLiBMYXRlbmN5CiMgbW9uaXRvcmluZyBjYW4gZWFzaWx5IGJlIGVuYWJsZWQgYXQgcnVudGltZSB1c2luZyB0aGUgY29tbWFuZAojICJDT05GSUcgU0VUIGxhdGVuY3ktbW9uaXRvci10aHJlc2hvbGQgPG1pbGxpc2Vjb25kcz4iIGlmIG5lZWRlZC4KbGF0ZW5jeS1tb25pdG9yLXRocmVzaG9sZCAwCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFVkVOVCBOT1RJRklDQVRJT04gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIFJlZGlzIGNhbiBub3RpZnkgUHViL1N1YiBjbGllbnRzIGFib3V0IGV2ZW50cyBoYXBwZW5pbmcgaW4gdGhlIGtleSBzcGFjZS4KIyBUaGlzIGZlYXR1cmUgaXMgZG9jdW1lbnRlZCBhdCBodHRwOi8vcmVkaXMuaW8vdG9waWNzL25vdGlmaWNhdGlvbnMKIwojIEZvciBpbnN0YW5jZSBpZiBrZXlzcGFjZSBldmVudHMgbm90aWZpY2F0aW9uIGlzIGVuYWJsZWQsIGFuZCBhIGNsaWVudAojIHBlcmZvcm1zIGEgREVMIG9wZXJhdGlvbiBvbiBrZXkgImZvbyIgc3RvcmVkIGluIHRoZSBEYXRhYmFzZSAwLCB0d28KIyBtZXNzYWdlcyB3aWxsIGJlIHB1Ymxpc2hlZCB2aWEgUHViL1N1YjoKIwojIFBVQkxJU0ggX19rZXlzcGFjZUAwX186Zm9vIGRlbAojIFBVQkxJU0ggX19rZXlldmVudEAwX186ZGVsIGZvbwojCiMgSXQgaXMgcG9zc2libGUgdG8gc2VsZWN0IHRoZSBldmVudHMgdGhhdCBSZWRpcyB3aWxsIG5vdGlmeSBhbW9uZyBhIHNldAojIG9mIGNsYXNzZXMuIEV2ZXJ5IGNsYXNzIGlzIGlkZW50aWZpZWQgYnkgYSBzaW5nbGUgY2hhcmFjdGVyOgojCiMgIEsgICAgIEtleXNwYWNlIGV2ZW50cywgcHVibGlzaGVkIHdpdGggX19rZXlzcGFjZUA8ZGI+X18gcHJlZml4LgojICBFICAgICBLZXlldmVudCBldmVudHMsIHB1Ymxpc2hlZCB3aXRoIF9fa2V5ZXZlbnRAPGRiPl9fIHByZWZpeC4KIyAgZyAgICAgR2VuZXJpYyBjb21tYW5kcyAobm9uLXR5cGUgc3BlY2lmaWMpIGxpa2UgREVMLCBFWFBJUkUsIFJFTkFNRSwgLi4uCiMgICQgICAgIFN0cmluZyBjb21tYW5kcwojICBsICAgICBMaXN0IGNvbW1hbmRzCiMgIHMgICAgIFNldCBjb21tYW5kcwojICBoICAgICBIYXNoIGNvbW1hbmRzCiMgIHogICAgIFNvcnRlZCBzZXQgY29tbWFuZHMKIyAgeCAgICAgRXhwaXJlZCBldmVudHMgKGV2ZW50cyBnZW5lcmF0ZWQgZXZlcnkgdGltZSBhIGtleSBleHBpcmVzKQojICBlICAgICBFdmljdGVkIGV2ZW50cyAoZXZlbnRzIGdlbmVyYXRlZCB3aGVuIGEga2V5IGlzIGV2aWN0ZWQgZm9yIG1heG1lbW9yeSkKIyAgQSAgICAgQWxpYXMgZm9yIGckbHNoenhlLCBzbyB0aGF0IHRoZSAiQUtFIiBzdHJpbmcgbWVhbnMgYWxsIHRoZSBldmVudHMuCiMKIyAgVGhlICJub3RpZnkta2V5c3BhY2UtZXZlbnRzIiB0YWtlcyBhcyBhcmd1bWVudCBhIHN0cmluZyB0aGF0IGlzIGNvbXBvc2VkCiMgIG9mIHplcm8gb3IgbXVsdGlwbGUgY2hhcmFjdGVycy4gVGhlIGVtcHR5IHN0cmluZyBtZWFucyB0aGF0IG5vdGlmaWNhdGlvbnMKIyAgYXJlIGRpc2FibGVkLgojCiMgIEV4YW1wbGU6IHRvIGVuYWJsZSBsaXN0IGFuZCBnZW5lcmljIGV2ZW50cywgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUKIyAgICAgICAgICAgZXZlbnQgbmFtZSwgdXNlOgojCiMgIG5vdGlmeS1rZXlzcGFjZS1ldmVudHMgRWxnCiMKIyAgRXhhbXBsZSAyOiB0byBnZXQgdGhlIHN0cmVhbSBvZiB0aGUgZXhwaXJlZCBrZXlzIHN1YnNjcmliaW5nIHRvIGNoYW5uZWwKIyAgICAgICAgICAgICBuYW1lIF9fa2V5ZXZlbnRAMF9fOmV4cGlyZWQgdXNlOgojCiMgIG5vdGlmeS1rZXlzcGFjZS1ldmVudHMgRXgKIwojICBCeSBkZWZhdWx0IGFsbCBub3RpZmljYXRpb25zIGFyZSBkaXNhYmxlZCBiZWNhdXNlIG1vc3QgdXNlcnMgZG9uJ3QgbmVlZAojICB0aGlzIGZlYXR1cmUgYW5kIHRoZSBmZWF0dXJlIGhhcyBzb21lIG92ZXJoZWFkLiBOb3RlIHRoYXQgaWYgeW91IGRvbid0CiMgIHNwZWNpZnkgYXQgbGVhc3Qgb25lIG9mIEsgb3IgRSwgbm8gZXZlbnRzIHdpbGwgYmUgZGVsaXZlcmVkLgpub3RpZnkta2V5c3BhY2UtZXZlbnRzICIiCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFEVkFOQ0VEIENPTkZJRyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIEhhc2hlcyBhcmUgZW5jb2RlZCB1c2luZyBhIG1lbW9yeSBlZmZpY2llbnQgZGF0YSBzdHJ1Y3R1cmUgd2hlbiB0aGV5IGhhdmUgYQojIHNtYWxsIG51bWJlciBvZiBlbnRyaWVzLCBhbmQgdGhlIGJpZ2dlc3QgZW50cnkgZG9lcyBub3QgZXhjZWVkIGEgZ2l2ZW4KIyB0aHJlc2hvbGQuIFRoZXNlIHRocmVzaG9sZHMgY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzLgpoYXNoLW1heC16aXBsaXN0LWVudHJpZXMgNTEyCmhhc2gtbWF4LXppcGxpc3QtdmFsdWUgNjQKCiMgTGlzdHMgYXJlIGFsc28gZW5jb2RlZCBpbiBhIHNwZWNpYWwgd2F5IHRvIHNhdmUgYSBsb3Qgb2Ygc3BhY2UuCiMgVGhlIG51bWJlciBvZiBlbnRyaWVzIGFsbG93ZWQgcGVyIGludGVybmFsIGxpc3Qgbm9kZSBjYW4gYmUgc3BlY2lmaWVkCiMgYXMgYSBmaXhlZCBtYXhpbXVtIHNpemUgb3IgYSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cy4KIyBGb3IgYSBmaXhlZCBtYXhpbXVtIHNpemUsIHVzZSAtNSB0aHJvdWdoIC0xLCBtZWFuaW5nOgojIC01OiBtYXggc2l6ZTogNjQgS2IgIDwtLSBub3QgcmVjb21tZW5kZWQgZm9yIG5vcm1hbCB3b3JrbG9hZHMKIyAtNDogbWF4IHNpemU6IDMyIEtiICA8LS0gbm90IHJlY29tbWVuZGVkCiMgLTM6IG1heCBzaXplOiAxNiBLYiAgPC0tIHByb2JhYmx5IG5vdCByZWNvbW1lbmRlZAojIC0yOiBtYXggc2l6ZTogOCBLYiAgIDwtLSBnb29kCiMgLTE6IG1heCBzaXplOiA0IEtiICAgPC0tIGdvb2QKIyBQb3NpdGl2ZSBudW1iZXJzIG1lYW4gc3RvcmUgdXAgdG8gX2V4YWN0bHlfIHRoYXQgbnVtYmVyIG9mIGVsZW1lbnRzCiMgcGVyIGxpc3Qgbm9kZS4KIyBUaGUgaGlnaGVzdCBwZXJmb3JtaW5nIG9wdGlvbiBpcyB1c3VhbGx5IC0yICg4IEtiIHNpemUpIG9yIC0xICg0IEtiIHNpemUpLAojIGJ1dCBpZiB5b3VyIHVzZSBjYXNlIGlzIHVuaXF1ZSwgYWRqdXN0IHRoZSBzZXR0aW5ncyBhcyBuZWNlc3NhcnkuCmxpc3QtbWF4LXppcGxpc3Qtc2l6ZSAtMgoKIyBMaXN0cyBtYXkgYWxzbyBiZSBjb21wcmVzc2VkLgojIENvbXByZXNzIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgcXVpY2tsaXN0IHppcGxpc3Qgbm9kZXMgZnJvbSAqZWFjaCogc2lkZSBvZgojIHRoZSBsaXN0IHRvICpleGNsdWRlKiBmcm9tIGNvbXByZXNzaW9uLiAgVGhlIGhlYWQgYW5kIHRhaWwgb2YgdGhlIGxpc3QKIyBhcmUgYWx3YXlzIHVuY29tcHJlc3NlZCBmb3IgZmFzdCBwdXNoL3BvcCBvcGVyYXRpb25zLiAgU2V0dGluZ3MgYXJlOgojIDA6IGRpc2FibGUgYWxsIGxpc3QgY29tcHJlc3Npb24KIyAxOiBkZXB0aCAxIG1lYW5zICJkb24ndCBzdGFydCBjb21wcmVzc2luZyB1bnRpbCBhZnRlciAxIG5vZGUgaW50byB0aGUgbGlzdCwKIyAgICBnb2luZyBmcm9tIGVpdGhlciB0aGUgaGVhZCBvciB0YWlsIgojICAgIFNvOiBbaGVhZF0tPm5vZGUtPm5vZGUtPi4uLi0+bm9kZS0+W3RhaWxdCiMgICAgW2hlYWRdLCBbdGFpbF0gd2lsbCBhbHdheXMgYmUgdW5jb21wcmVzc2VkOyBpbm5lciBub2RlcyB3aWxsIGNvbXByZXNzLgojIDI6IFtoZWFkXS0+W25leHRdLT5ub2RlLT5ub2RlLT4uLi4tPm5vZGUtPltwcmV2XS0+W3RhaWxdCiMgICAgMiBoZXJlIG1lYW5zOiBkb24ndCBjb21wcmVzcyBoZWFkIG9yIGhlYWQtPm5leHQgb3IgdGFpbC0+cHJldiBvciB0YWlsLAojICAgIGJ1dCBjb21wcmVzcyBhbGwgbm9kZXMgYmV0d2VlbiB0aGVtLgojIDM6IFtoZWFkXS0+W25leHRdLT5bbmV4dF0tPm5vZGUtPm5vZGUtPi4uLi0+bm9kZS0+W3ByZXZdLT5bcHJldl0tPlt0YWlsXQojIGV0Yy4KbGlzdC1jb21wcmVzcy1kZXB0aCAwCgojIFNldHMgaGF2ZSBhIHNwZWNpYWwgZW5jb2RpbmcgaW4ganVzdCBvbmUgY2FzZTogd2hlbiBhIHNldCBpcyBjb21wb3NlZAojIG9mIGp1c3Qgc3RyaW5ncyB0aGF0IGhhcHBlbiB0byBiZSBpbnRlZ2VycyBpbiByYWRpeCAxMCBpbiB0aGUgcmFuZ2UKIyBvZiA2NCBiaXQgc2lnbmVkIGludGVnZXJzLgojIFRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBzZXR0aW5nIHNldHMgdGhlIGxpbWl0IGluIHRoZSBzaXplIG9mIHRoZQojIHNldCBpbiBvcmRlciB0byB1c2UgdGhpcyBzcGVjaWFsIG1lbW9yeSBzYXZpbmcgZW5jb2RpbmcuCnNldC1tYXgtaW50c2V0LWVudHJpZXMgNTEyCgojIFNpbWlsYXJseSB0byBoYXNoZXMgYW5kIGxpc3RzLCBzb3J0ZWQgc2V0cyBhcmUgYWxzbyBzcGVjaWFsbHkgZW5jb2RlZCBpbgojIG9yZGVyIHRvIHNhdmUgYSBsb3Qgb2Ygc3BhY2UuIFRoaXMgZW5jb2RpbmcgaXMgb25seSB1c2VkIHdoZW4gdGhlIGxlbmd0aCBhbmQKIyBlbGVtZW50cyBvZiBhIHNvcnRlZCBzZXQgYXJlIGJlbG93IHRoZSBmb2xsb3dpbmcgbGltaXRzOgp6c2V0LW1heC16aXBsaXN0LWVudHJpZXMgMTI4CnpzZXQtbWF4LXppcGxpc3QtdmFsdWUgNjQKCiMgSHlwZXJMb2dMb2cgc3BhcnNlIHJlcHJlc2VudGF0aW9uIGJ5dGVzIGxpbWl0LiBUaGUgbGltaXQgaW5jbHVkZXMgdGhlCiMgMTYgYnl0ZXMgaGVhZGVyLiBXaGVuIGFuIEh5cGVyTG9nTG9nIHVzaW5nIHRoZSBzcGFyc2UgcmVwcmVzZW50YXRpb24gY3Jvc3NlcwojIHRoaXMgbGltaXQsIGl0IGlzIGNvbnZlcnRlZCBpbnRvIHRoZSBkZW5zZSByZXByZXNlbnRhdGlvbi4KIwojIEEgdmFsdWUgZ3JlYXRlciB0aGFuIDE2MDAwIGlzIHRvdGFsbHkgdXNlbGVzcywgc2luY2UgYXQgdGhhdCBwb2ludCB0aGUKIyBkZW5zZSByZXByZXNlbnRhdGlvbiBpcyBtb3JlIG1lbW9yeSBlZmZpY2llbnQuCiMKIyBUaGUgc3VnZ2VzdGVkIHZhbHVlIGlzIH4gMzAwMCBpbiBvcmRlciB0byBoYXZlIHRoZSBiZW5lZml0cyBvZgojIHRoZSBzcGFjZSBlZmZpY2llbnQgZW5jb2Rpbmcgd2l0aG91dCBzbG93aW5nIGRvd24gdG9vIG11Y2ggUEZBREQsCiMgd2hpY2ggaXMgTyhOKSB3aXRoIHRoZSBzcGFyc2UgZW5jb2RpbmcuIFRoZSB2YWx1ZSBjYW4gYmUgcmFpc2VkIHRvCiMgfiAxMDAwMCB3aGVuIENQVSBpcyBub3QgYSBjb25jZXJuLCBidXQgc3BhY2UgaXMsIGFuZCB0aGUgZGF0YSBzZXQgaXMKIyBjb21wb3NlZCBvZiBtYW55IEh5cGVyTG9nTG9ncyB3aXRoIGNhcmRpbmFsaXR5IGluIHRoZSAwIC0gMTUwMDAgcmFuZ2UuCmhsbC1zcGFyc2UtbWF4LWJ5dGVzIDMwMDAKCiMgU3RyZWFtcyBtYWNybyBub2RlIG1heCBzaXplIC8gaXRlbXMuIFRoZSBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUgaXMgYSByYWRpeAojIHRyZWUgb2YgYmlnIG5vZGVzIHRoYXQgZW5jb2RlIG11bHRpcGxlIGl0ZW1zIGluc2lkZS4gVXNpbmcgdGhpcyBjb25maWd1cmF0aW9uCiMgaXQgaXMgcG9zc2libGUgdG8gY29uZmlndXJlIGhvdyBiaWcgYSBzaW5nbGUgbm9kZSBjYW4gYmUgaW4gYnl0ZXMsIGFuZCB0aGUKIyBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyBpdCBtYXkgY29udGFpbiBiZWZvcmUgc3dpdGNoaW5nIHRvIGEgbmV3IG5vZGUgd2hlbgojIGFwcGVuZGluZyBuZXcgc3RyZWFtIGVudHJpZXMuIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSBzZXQgdG8KIyB6ZXJvLCB0aGUgbGltaXQgaXMgaWdub3JlZCwgc28gZm9yIGluc3RhbmNlIGl0IGlzIHBvc3NpYmxlIHRvIHNldCBqdXN0IGEKIyBtYXggZW50aXJlcyBsaW1pdCBieSBzZXR0aW5nIG1heC1ieXRlcyB0byAwIGFuZCBtYXgtZW50cmllcyB0byB0aGUgZGVzaXJlZAojIHZhbHVlLgpzdHJlYW0tbm9kZS1tYXgtYnl0ZXMgNDA5NgpzdHJlYW0tbm9kZS1tYXgtZW50cmllcyAxMDAKCiMgQWN0aXZlIHJlaGFzaGluZyB1c2VzIDEgbWlsbGlzZWNvbmQgZXZlcnkgMTAwIG1pbGxpc2Vjb25kcyBvZiBDUFUgdGltZSBpbgojIG9yZGVyIHRvIGhlbHAgcmVoYXNoaW5nIHRoZSBtYWluIFJlZGlzIGhhc2ggdGFibGUgKHRoZSBvbmUgbWFwcGluZyB0b3AtbGV2ZWwKIyBrZXlzIHRvIHZhbHVlcykuIFRoZSBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uIFJlZGlzIHVzZXMgKHNlZSBkaWN0LmMpCiMgcGVyZm9ybXMgYSBsYXp5IHJlaGFzaGluZzogdGhlIG1vcmUgb3BlcmF0aW9uIHlvdSBydW4gaW50byBhIGhhc2ggdGFibGUKIyB0aGF0IGlzIHJlaGFzaGluZywgdGhlIG1vcmUgcmVoYXNoaW5nICJzdGVwcyIgYXJlIHBlcmZvcm1lZCwgc28gaWYgdGhlCiMgc2VydmVyIGlzIGlkbGUgdGhlIHJlaGFzaGluZyBpcyBuZXZlciBjb21wbGV0ZSBhbmQgc29tZSBtb3JlIG1lbW9yeSBpcyB1c2VkCiMgYnkgdGhlIGhhc2ggdGFibGUuCiMKIyBUaGUgZGVmYXVsdCBpcyB0byB1c2UgdGhpcyBtaWxsaXNlY29uZCAxMCB0aW1lcyBldmVyeSBzZWNvbmQgaW4gb3JkZXIgdG8KIyBhY3RpdmVseSByZWhhc2ggdGhlIG1haW4gZGljdGlvbmFyaWVzLCBmcmVlaW5nIG1lbW9yeSB3aGVuIHBvc3NpYmxlLgojCiMgSWYgdW5zdXJlOgojIHVzZSAiYWN0aXZlcmVoYXNoaW5nIG5vIiBpZiB5b3UgaGF2ZSBoYXJkIGxhdGVuY3kgcmVxdWlyZW1lbnRzIGFuZCBpdCBpcwojIG5vdCBhIGdvb2QgdGhpbmcgaW4geW91ciBlbnZpcm9ubWVudCB0aGF0IFJlZGlzIGNhbiByZXBseSBmcm9tIHRpbWUgdG8gdGltZQojIHRvIHF1ZXJpZXMgd2l0aCAyIG1pbGxpc2Vjb25kcyBkZWxheS4KIwojIHVzZSAiYWN0aXZlcmVoYXNoaW5nIHllcyIgaWYgeW91IGRvbid0IGhhdmUgc3VjaCBoYXJkIHJlcXVpcmVtZW50cyBidXQKIyB3YW50IHRvIGZyZWUgbWVtb3J5IGFzYXAgd2hlbiBwb3NzaWJsZS4KYWN0aXZlcmVoYXNoaW5nIHllcwoKIyBUaGUgY2xpZW50IG91dHB1dCBidWZmZXIgbGltaXRzIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGRpc2Nvbm5lY3Rpb24gb2YgY2xpZW50cwojIHRoYXQgYXJlIG5vdCByZWFkaW5nIGRhdGEgZnJvbSB0aGUgc2VydmVyIGZhc3QgZW5vdWdoIGZvciBzb21lIHJlYXNvbiAoYQojIGNvbW1vbiByZWFzb24gaXMgdGhhdCBhIFB1Yi9TdWIgY2xpZW50IGNhbid0IGNvbnN1bWUgbWVzc2FnZXMgYXMgZmFzdCBhcyB0aGUKIyBwdWJsaXNoZXIgY2FuIHByb2R1Y2UgdGhlbSkuCiMKIyBUaGUgbGltaXQgY2FuIGJlIHNldCBkaWZmZXJlbnRseSBmb3IgdGhlIHRocmVlIGRpZmZlcmVudCBjbGFzc2VzIG9mIGNsaWVudHM6CiMKIyBub3JtYWwgLT4gbm9ybWFsIGNsaWVudHMgaW5jbHVkaW5nIE1PTklUT1IgY2xpZW50cwojIHJlcGxpY2EgIC0+IHJlcGxpY2EgY2xpZW50cwojIHB1YnN1YiAtPiBjbGllbnRzIHN1YnNjcmliZWQgdG8gYXQgbGVhc3Qgb25lIHB1YnN1YiBjaGFubmVsIG9yIHBhdHRlcm4KIwojIFRoZSBzeW50YXggb2YgZXZlcnkgY2xpZW50LW91dHB1dC1idWZmZXItbGltaXQgZGlyZWN0aXZlIGlzIHRoZSBmb2xsb3dpbmc6CiMKIyBjbGllbnQtb3V0cHV0LWJ1ZmZlci1saW1pdCA8Y2xhc3M+IDxoYXJkIGxpbWl0PiA8c29mdCBsaW1pdD4gPHNvZnQgc2Vjb25kcz4KIwojIEEgY2xpZW50IGlzIGltbWVkaWF0ZWx5IGRpc2Nvbm5lY3RlZCBvbmNlIHRoZSBoYXJkIGxpbWl0IGlzIHJlYWNoZWQsIG9yIGlmCiMgdGhlIHNvZnQgbGltaXQgaXMgcmVhY2hlZCBhbmQgcmVtYWlucyByZWFjaGVkIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZgojIHNlY29uZHMgKGNvbnRpbnVvdXNseSkuCiMgU28gZm9yIGluc3RhbmNlIGlmIHRoZSBoYXJkIGxpbWl0IGlzIDMyIG1lZ2FieXRlcyBhbmQgdGhlIHNvZnQgbGltaXQgaXMKIyAxNiBtZWdhYnl0ZXMgLyAxMCBzZWNvbmRzLCB0aGUgY2xpZW50IHdpbGwgZ2V0IGRpc2Nvbm5lY3RlZCBpbW1lZGlhdGVseQojIGlmIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVycyByZWFjaCAzMiBtZWdhYnl0ZXMsIGJ1dCB3aWxsIGFsc28gZ2V0CiMgZGlzY29ubmVjdGVkIGlmIHRoZSBjbGllbnQgcmVhY2hlcyAxNiBtZWdhYnl0ZXMgYW5kIGNvbnRpbnVvdXNseSBvdmVyY29tZXMKIyB0aGUgbGltaXQgZm9yIDEwIHNlY29uZHMuCiMKIyBCeSBkZWZhdWx0IG5vcm1hbCBjbGllbnRzIGFyZSBub3QgbGltaXRlZCBiZWNhdXNlIHRoZXkgZG9uJ3QgcmVjZWl2ZSBkYXRhCiMgd2l0aG91dCBhc2tpbmcgKGluIGEgcHVzaCB3YXkpLCBidXQganVzdCBhZnRlciBhIHJlcXVlc3QsIHNvIG9ubHkKIyBhc3luY2hyb25vdXMgY2xpZW50cyBtYXkgY3JlYXRlIGEgc2NlbmFyaW8gd2hlcmUgZGF0YSBpcyByZXF1ZXN0ZWQgZmFzdGVyCiMgdGhhbiBpdCBjYW4gcmVhZC4KIwojIEluc3RlYWQgdGhlcmUgaXMgYSBkZWZhdWx0IGxpbWl0IGZvciBwdWJzdWIgYW5kIHJlcGxpY2EgY2xpZW50cywgc2luY2UKIyBzdWJzY3JpYmVycyBhbmQgcmVwbGljYXMgcmVjZWl2ZSBkYXRhIGluIGEgcHVzaCBmYXNoaW9uLgojCiMgQm90aCB0aGUgaGFyZCBvciB0aGUgc29mdCBsaW1pdCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGVtIHRvIHplcm8uCmNsaWVudC1vdXRwdXQtYnVmZmVyLWxpbWl0IG5vcm1hbCAwIDAgMApjbGllbnQtb3V0cHV0LWJ1ZmZlci1saW1pdCByZXBsaWNhIDI1Nm1iIDY0bWIgNjAKY2xpZW50LW91dHB1dC1idWZmZXItbGltaXQgcHVic3ViIDMybWIgOG1iIDYwCgojIENsaWVudCBxdWVyeSBidWZmZXJzIGFjY3VtdWxhdGUgbmV3IGNvbW1hbmRzLiBUaGV5IGFyZSBsaW1pdGVkIHRvIGEgZml4ZWQKIyBhbW91bnQgYnkgZGVmYXVsdCBpbiBvcmRlciB0byBhdm9pZCB0aGF0IGEgcHJvdG9jb2wgZGVzeW5jaHJvbml6YXRpb24gKGZvcgojIGluc3RhbmNlIGR1ZSB0byBhIGJ1ZyBpbiB0aGUgY2xpZW50KSB3aWxsIGxlYWQgdG8gdW5ib3VuZCBtZW1vcnkgdXNhZ2UgaW4KIyB0aGUgcXVlcnkgYnVmZmVyLiBIb3dldmVyIHlvdSBjYW4gY29uZmlndXJlIGl0IGhlcmUgaWYgeW91IGhhdmUgdmVyeSBzcGVjaWFsCiMgbmVlZHMsIHN1Y2ggdXMgaHVnZSBtdWx0aS9leGVjIHJlcXVlc3RzIG9yIGFsaWtlLgojCiMgY2xpZW50LXF1ZXJ5LWJ1ZmZlci1saW1pdCAxZ2IKCiMgSW4gdGhlIFJlZGlzIHByb3RvY29sLCBidWxrIHJlcXVlc3RzLCB0aGF0IGFyZSwgZWxlbWVudHMgcmVwcmVzZW50aW5nIHNpbmdsZQojIHN0cmluZ3MsIGFyZSBub3JtYWxseSBsaW1pdGVkIG90IDUxMiBtYi4gSG93ZXZlciB5b3UgY2FuIGNoYW5nZSB0aGlzIGxpbWl0CiMgaGVyZS4KIwojIHByb3RvLW1heC1idWxrLWxlbiA1MTJtYgoKIyBSZWRpcyBjYWxscyBhbiBpbnRlcm5hbCBmdW5jdGlvbiB0byBwZXJmb3JtIG1hbnkgYmFja2dyb3VuZCB0YXNrcywgbGlrZQojIGNsb3NpbmcgY29ubmVjdGlvbnMgb2YgY2xpZW50cyBpbiB0aW1lb3V0LCBwdXJnaW5nIGV4cGlyZWQga2V5cyB0aGF0IGFyZQojIG5ldmVyIHJlcXVlc3RlZCwgYW5kIHNvIGZvcnRoLgojCiMgTm90IGFsbCB0YXNrcyBhcmUgcGVyZm9ybWVkIHdpdGggdGhlIHNhbWUgZnJlcXVlbmN5LCBidXQgUmVkaXMgY2hlY2tzIGZvcgojIHRhc2tzIHRvIHBlcmZvcm0gYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgImh6IiB2YWx1ZS4KIwojIEJ5IGRlZmF1bHQgImh6IiBpcyBzZXQgdG8gMTAuIFJhaXNpbmcgdGhlIHZhbHVlIHdpbGwgdXNlIG1vcmUgQ1BVIHdoZW4KIyBSZWRpcyBpcyBpZGxlLCBidXQgYXQgdGhlIHNhbWUgdGltZSB3aWxsIG1ha2UgUmVkaXMgbW9yZSByZXNwb25zaXZlIHdoZW4KIyB0aGVyZSBhcmUgbWFueSBrZXlzIGV4cGlyaW5nIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aW1lb3V0cyBtYXkgYmUKIyBoYW5kbGVkIHdpdGggbW9yZSBwcmVjaXNpb24uCiMKIyBUaGUgcmFuZ2UgaXMgYmV0d2VlbiAxIGFuZCA1MDAsIGhvd2V2ZXIgYSB2YWx1ZSBvdmVyIDEwMCBpcyB1c3VhbGx5IG5vdAojIGEgZ29vZCBpZGVhLiBNb3N0IHVzZXJzIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgb2YgMTAgYW5kIHJhaXNlIHRoaXMgdXAgdG8KIyAxMDAgb25seSBpbiBlbnZpcm9ubWVudHMgd2hlcmUgdmVyeSBsb3cgbGF0ZW5jeSBpcyByZXF1aXJlZC4KaHogMTAKCiMgTm9ybWFsbHkgaXQgaXMgdXNlZnVsIHRvIGhhdmUgYW4gSFogdmFsdWUgd2hpY2ggaXMgcHJvcG9ydGlvbmFsIHRvIHRoZQojIG51bWJlciBvZiBjbGllbnRzIGNvbm5lY3RlZC4gVGhpcyBpcyB1c2VmdWwgaW4gb3JkZXIsIGZvciBpbnN0YW5jZSwgdG8KIyBhdm9pZCB0b28gbWFueSBjbGllbnRzIGFyZSBwcm9jZXNzZWQgZm9yIGVhY2ggYmFja2dyb3VuZCB0YXNrIGludm9jYXRpb24KIyBpbiBvcmRlciB0byBhdm9pZCBsYXRlbmN5IHNwaWtlcy4KIwojIFNpbmNlIHRoZSBkZWZhdWx0IEhaIHZhbHVlIGJ5IGRlZmF1bHQgaXMgY29uc2VydmF0aXZlbHkgc2V0IHRvIDEwLCBSZWRpcwojIG9mZmVycywgYW5kIGVuYWJsZXMgYnkgZGVmYXVsdCwgdGhlIGFiaWxpdHkgdG8gdXNlIGFuIGFkYXB0aXZlIEhaIHZhbHVlCiMgd2hpY2ggd2lsbCB0ZW1wb3JhcnkgcmFpc2Ugd2hlbiB0aGVyZSBhcmUgbWFueSBjb25uZWN0ZWQgY2xpZW50cy4KIwojIFdoZW4gZHluYW1pYyBIWiBpcyBlbmFibGVkLCB0aGUgYWN0dWFsIGNvbmZpZ3VyZWQgSFogd2lsbCBiZSB1c2VkIGFzCiMgYXMgYSBiYXNlbGluZSwgYnV0IG11bHRpcGxlcyBvZiB0aGUgY29uZmlndXJlZCBIWiB2YWx1ZSB3aWxsIGJlIGFjdHVhbGx5CiMgdXNlZCBhcyBuZWVkZWQgb25jZSBtb3JlIGNsaWVudHMgYXJlIGNvbm5lY3RlZC4gSW4gdGhpcyB3YXkgYW4gaWRsZQojIGluc3RhbmNlIHdpbGwgdXNlIHZlcnkgbGl0dGxlIENQVSB0aW1lIHdoaWxlIGEgYnVzeSBpbnN0YW5jZSB3aWxsIGJlCiMgbW9yZSByZXNwb25zaXZlLgpkeW5hbWljLWh6IHllcwoKIyBXaGVuIGEgY2hpbGQgcmV3cml0ZXMgdGhlIEFPRiBmaWxlLCBpZiB0aGUgZm9sbG93aW5nIG9wdGlvbiBpcyBlbmFibGVkCiMgdGhlIGZpbGUgd2lsbCBiZSBmc3luYy1lZCBldmVyeSAzMiBNQiBvZiBkYXRhIGdlbmVyYXRlZC4gVGhpcyBpcyB1c2VmdWwKIyBpbiBvcmRlciB0byBjb21taXQgdGhlIGZpbGUgdG8gdGhlIGRpc2sgbW9yZSBpbmNyZW1lbnRhbGx5IGFuZCBhdm9pZAojIGJpZyBsYXRlbmN5IHNwaWtlcy4KYW9mLXJld3JpdGUtaW5jcmVtZW50YWwtZnN5bmMgeWVzCgojIFdoZW4gcmVkaXMgc2F2ZXMgUkRCIGZpbGUsIGlmIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGlzIGVuYWJsZWQKIyB0aGUgZmlsZSB3aWxsIGJlIGZzeW5jLWVkIGV2ZXJ5IDMyIE1CIG9mIGRhdGEgZ2VuZXJhdGVkLiBUaGlzIGlzIHVzZWZ1bAojIGluIG9yZGVyIHRvIGNvbW1pdCB0aGUgZmlsZSB0byB0aGUgZGlzayBtb3JlIGluY3JlbWVudGFsbHkgYW5kIGF2b2lkCiMgYmlnIGxhdGVuY3kgc3Bpa2VzLgpyZGItc2F2ZS1pbmNyZW1lbnRhbC1mc3luYyB5ZXMKCiMgUmVkaXMgTEZVIGV2aWN0aW9uIChzZWUgbWF4bWVtb3J5IHNldHRpbmcpIGNhbiBiZSB0dW5lZC4gSG93ZXZlciBpdCBpcyBhIGdvb2QKIyBpZGVhIHRvIHN0YXJ0IHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3MgYW5kIG9ubHkgY2hhbmdlIHRoZW0gYWZ0ZXIgaW52ZXN0aWdhdGluZwojIGhvdyB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZXMgYW5kIGhvdyB0aGUga2V5cyBMRlUgY2hhbmdlIG92ZXIgdGltZSwgd2hpY2gKIyBpcyBwb3NzaWJsZSB0byBpbnNwZWN0IHZpYSB0aGUgT0JKRUNUIEZSRVEgY29tbWFuZC4KIwojIFRoZXJlIGFyZSB0d28gdHVuYWJsZSBwYXJhbWV0ZXJzIGluIHRoZSBSZWRpcyBMRlUgaW1wbGVtZW50YXRpb246IHRoZQojIGNvdW50ZXIgbG9nYXJpdGhtIGZhY3RvciBhbmQgdGhlIGNvdW50ZXIgZGVjYXkgdGltZS4gSXQgaXMgaW1wb3J0YW50IHRvCiMgdW5kZXJzdGFuZCB3aGF0IHRoZSB0d28gcGFyYW1ldGVycyBtZWFuIGJlZm9yZSBjaGFuZ2luZyB0aGVtLgojCiMgVGhlIExGVSBjb3VudGVyIGlzIGp1c3QgOCBiaXRzIHBlciBrZXksIGl0J3MgbWF4aW11bSB2YWx1ZSBpcyAyNTUsIHNvIFJlZGlzCiMgdXNlcyBhIHByb2JhYmlsaXN0aWMgaW5jcmVtZW50IHdpdGggbG9nYXJpdGhtaWMgYmVoYXZpb3IuIEdpdmVuIHRoZSB2YWx1ZQojIG9mIHRoZSBvbGQgY291bnRlciwgd2hlbiBhIGtleSBpcyBhY2Nlc3NlZCwgdGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgaW4KIyB0aGlzIHdheToKIwojIDEuIEEgcmFuZG9tIG51bWJlciBSIGJldHdlZW4gMCBhbmQgMSBpcyBleHRyYWN0ZWQuCiMgMi4gQSBwcm9iYWJpbGl0eSBQIGlzIGNhbGN1bGF0ZWQgYXMgMS8ob2xkX3ZhbHVlKmxmdV9sb2dfZmFjdG9yKzEpLgojIDMuIFRoZSBjb3VudGVyIGlzIGluY3JlbWVudGVkIG9ubHkgaWYgUiA8IFAuCiMKIyBUaGUgZGVmYXVsdCBsZnUtbG9nLWZhY3RvciBpcyAxMC4gVGhpcyBpcyBhIHRhYmxlIG9mIGhvdyB0aGUgZnJlcXVlbmN5CiMgY291bnRlciBjaGFuZ2VzIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGFjY2Vzc2VzIHdpdGggZGlmZmVyZW50CiMgbG9nYXJpdGhtaWMgZmFjdG9yczoKIwojICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwojIHwgZmFjdG9yIHwgMTAwIGhpdHMgICB8IDEwMDAgaGl0cyAgfCAxMDBLIGhpdHMgIHwgMU0gaGl0cyAgICB8IDEwTSBoaXRzICAgfAojICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwojIHwgMCAgICAgIHwgMTA0ICAgICAgICB8IDI1NSAgICAgICAgfCAyNTUgICAgICAgIHwgMjU1ICAgICAgICB8IDI1NSAgICAgICAgfAojICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwojIHwgMSAgICAgIHwgMTggICAgICAgICB8IDQ5ICAgICAgICAgfCAyNTUgICAgICAgIHwgMjU1ICAgICAgICB8IDI1NSAgICAgICAgfAojICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwojIHwgMTAgICAgIHwgMTAgICAgICAgICB8IDE4ICAgICAgICAgfCAxNDIgICAgICAgIHwgMjU1ICAgICAgICB8IDI1NSAgICAgICAgfAojICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwojIHwgMTAwICAgIHwgOCAgICAgICAgICB8IDExICAgICAgICAgfCA0OSAgICAgICAgIHwgMTQzICAgICAgICB8IDI1NSAgICAgICAgfAojICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwojCiMgTk9URTogVGhlIGFib3ZlIHRhYmxlIHdhcyBvYnRhaW5lZCBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CiMKIyAgIHJlZGlzLWJlbmNobWFyayAtbiAxMDAwMDAwIGluY3IgZm9vCiMgICByZWRpcy1jbGkgb2JqZWN0IGZyZXEgZm9vCiMKIyBOT1RFIDI6IFRoZSBjb3VudGVyIGluaXRpYWwgdmFsdWUgaXMgNSBpbiBvcmRlciB0byBnaXZlIG5ldyBvYmplY3RzIGEgY2hhbmNlCiMgdG8gYWNjdW11bGF0ZSBoaXRzLgojCiMgVGhlIGNvdW50ZXIgZGVjYXkgdGltZSBpcyB0aGUgdGltZSwgaW4gbWludXRlcywgdGhhdCBtdXN0IGVsYXBzZSBpbiBvcmRlcgojIGZvciB0aGUga2V5IGNvdW50ZXIgdG8gYmUgZGl2aWRlZCBieSB0d28gKG9yIGRlY3JlbWVudGVkIGlmIGl0IGhhcyBhIHZhbHVlCiMgbGVzcyA8PSAxMCkuCiMKIyBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGxmdS1kZWNheS10aW1lIGlzIDEuIEEgU3BlY2lhbCB2YWx1ZSBvZiAwIG1lYW5zIHRvCiMgZGVjYXkgdGhlIGNvdW50ZXIgZXZlcnkgdGltZSBpdCBoYXBwZW5zIHRvIGJlIHNjYW5uZWQuCiMKIyBsZnUtbG9nLWZhY3RvciAxMAojIGxmdS1kZWNheS10aW1lIDEKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBQ1RJVkUgREVGUkFHTUVOVEFUSU9OICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMKIyBXQVJOSU5HIFRISVMgRkVBVFVSRSBJUyBFWFBFUklNRU5UQUwuIEhvd2V2ZXIgaXQgd2FzIHN0cmVzcyB0ZXN0ZWQKIyBldmVuIGluIHByb2R1Y3Rpb24gYW5kIG1hbnVhbGx5IHRlc3RlZCBieSBtdWx0aXBsZSBlbmdpbmVlcnMgZm9yIHNvbWUKIyB0aW1lLgojCiMgV2hhdCBpcyBhY3RpdmUgZGVmcmFnbWVudGF0aW9uPwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIEFjdGl2ZSAob25saW5lKSBkZWZyYWdtZW50YXRpb24gYWxsb3dzIGEgUmVkaXMgc2VydmVyIHRvIGNvbXBhY3QgdGhlCiMgc3BhY2VzIGxlZnQgYmV0d2VlbiBzbWFsbCBhbGxvY2F0aW9ucyBhbmQgZGVhbGxvY2F0aW9ucyBvZiBkYXRhIGluIG1lbW9yeSwKIyB0aHVzIGFsbG93aW5nIHRvIHJlY2xhaW0gYmFjayBtZW1vcnkuCiMKIyBGcmFnbWVudGF0aW9uIGlzIGEgbmF0dXJhbCBwcm9jZXNzIHRoYXQgaGFwcGVucyB3aXRoIGV2ZXJ5IGFsbG9jYXRvciAoYnV0CiMgbGVzcyBzbyB3aXRoIEplbWFsbG9jLCBmb3J0dW5hdGVseSkgYW5kIGNlcnRhaW4gd29ya2xvYWRzLiBOb3JtYWxseSBhIHNlcnZlcgojIHJlc3RhcnQgaXMgbmVlZGVkIGluIG9yZGVyIHRvIGxvd2VyIHRoZSBmcmFnbWVudGF0aW9uLCBvciBhdCBsZWFzdCB0byBmbHVzaAojIGF3YXkgYWxsIHRoZSBkYXRhIGFuZCBjcmVhdGUgaXQgYWdhaW4uIEhvd2V2ZXIgdGhhbmtzIHRvIHRoaXMgZmVhdHVyZQojIGltcGxlbWVudGVkIGJ5IE9yYW4gQWdyYSBmb3IgUmVkaXMgNC4wIHRoaXMgcHJvY2VzcyBjYW4gaGFwcGVuIGF0IHJ1bnRpbWUKIyBpbiBhbiAiaG90IiB3YXksIHdoaWxlIHRoZSBzZXJ2ZXIgaXMgcnVubmluZy4KIwojIEJhc2ljYWxseSB3aGVuIHRoZSBmcmFnbWVudGF0aW9uIGlzIG92ZXIgYSBjZXJ0YWluIGxldmVsIChzZWUgdGhlCiMgY29uZmlndXJhdGlvbiBvcHRpb25zIGJlbG93KSBSZWRpcyB3aWxsIHN0YXJ0IHRvIGNyZWF0ZSBuZXcgY29waWVzIG9mIHRoZQojIHZhbHVlcyBpbiBjb250aWd1b3VzIG1lbW9yeSByZWdpb25zIGJ5IGV4cGxvaXRpbmcgY2VydGFpbiBzcGVjaWZpYyBKZW1hbGxvYwojIGZlYXR1cmVzIChpbiBvcmRlciB0byB1bmRlcnN0YW5kIGlmIGFuIGFsbG9jYXRpb24gaXMgY2F1c2luZyBmcmFnbWVudGF0aW9uCiMgYW5kIHRvIGFsbG9jYXRlIGl0IGluIGEgYmV0dGVyIHBsYWNlKSwgYW5kIGF0IHRoZSBzYW1lIHRpbWUsIHdpbGwgcmVsZWFzZSB0aGUKIyBvbGQgY29waWVzIG9mIHRoZSBkYXRhLiBUaGlzIHByb2Nlc3MsIHJlcGVhdGVkIGluY3JlbWVudGFsbHkgZm9yIGFsbCB0aGUga2V5cwojIHdpbGwgY2F1c2UgdGhlIGZyYWdtZW50YXRpb24gdG8gZHJvcCBiYWNrIHRvIG5vcm1hbCB2YWx1ZXMuCiMKIyBJbXBvcnRhbnQgdGhpbmdzIHRvIHVuZGVyc3RhbmQ6CiMKIyAxLiBUaGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYW5kIG9ubHkgd29ya3MgaWYgeW91IGNvbXBpbGVkIFJlZGlzCiMgICAgdG8gdXNlIHRoZSBjb3B5IG9mIEplbWFsbG9jIHdlIHNoaXAgd2l0aCB0aGUgc291cmNlIGNvZGUgb2YgUmVkaXMuCiMgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCB3aXRoIExpbnV4IGJ1aWxkcy4KIwojIDIuIFlvdSBuZXZlciBuZWVkIHRvIGVuYWJsZSB0aGlzIGZlYXR1cmUgaWYgeW91IGRvbid0IGhhdmUgZnJhZ21lbnRhdGlvbgojICAgIGlzc3Vlcy4KIwojIDMuIE9uY2UgeW91IGV4cGVyaWVuY2UgZnJhZ21lbnRhdGlvbiwgeW91IGNhbiBlbmFibGUgdGhpcyBmZWF0dXJlIHdoZW4KIyAgICBuZWVkZWQgd2l0aCB0aGUgY29tbWFuZCAiQ09ORklHIFNFVCBhY3RpdmVkZWZyYWcgeWVzIi4KIwojIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIGFibGUgdG8gZmluZSB0dW5lIHRoZSBiZWhhdmlvciBvZiB0aGUKIyBkZWZyYWdtZW50YXRpb24gcHJvY2Vzcy4gSWYgeW91IGFyZSBub3Qgc3VyZSBhYm91dCB3aGF0IHRoZXkgbWVhbiBpdCBpcwojIGEgZ29vZCBpZGVhIHRvIGxlYXZlIHRoZSBkZWZhdWx0cyB1bnRvdWNoZWQuCgojIEVuYWJsZWQgYWN0aXZlIGRlZnJhZ21lbnRhdGlvbgojIGFjdGl2ZWRlZnJhZyB5ZXMKCiMgTWluaW11bSBhbW91bnQgb2YgZnJhZ21lbnRhdGlvbiB3YXN0ZSB0byBzdGFydCBhY3RpdmUgZGVmcmFnCiMgYWN0aXZlLWRlZnJhZy1pZ25vcmUtYnl0ZXMgMTAwbWIKCiMgTWluaW11bSBwZXJjZW50YWdlIG9mIGZyYWdtZW50YXRpb24gdG8gc3RhcnQgYWN0aXZlIGRlZnJhZwojIGFjdGl2ZS1kZWZyYWctdGhyZXNob2xkLWxvd2VyIDEwCgojIE1heGltdW0gcGVyY2VudGFnZSBvZiBmcmFnbWVudGF0aW9uIGF0IHdoaWNoIHdlIHVzZSBtYXhpbXVtIGVmZm9ydAojIGFjdGl2ZS1kZWZyYWctdGhyZXNob2xkLXVwcGVyIDEwMAoKIyBNaW5pbWFsIGVmZm9ydCBmb3IgZGVmcmFnIGluIENQVSBwZXJjZW50YWdlCiMgYWN0aXZlLWRlZnJhZy1jeWNsZS1taW4gNQoKIyBNYXhpbWFsIGVmZm9ydCBmb3IgZGVmcmFnIGluIENQVSBwZXJjZW50YWdlCiMgYWN0aXZlLWRlZnJhZy1jeWNsZS1tYXggNzUKCiMgTWF4aW11bSBudW1iZXIgb2Ygc2V0L2hhc2gvenNldC9saXN0IGZpZWxkcyB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIGZyb20KIyB0aGUgbWFpbiBkaWN0aW9uYXJ5IHNjYW4KIyBhY3RpdmUtZGVmcmFnLW1heC1zY2FuLWZpZWxkcyAxMDAwCgo=[/et_pb_dmb_code_snippet]

所有步骤完成后,回到WP 后台下载一个叫Redis Object Cache 的插件。 记得 先别重启 lnmp.

是的,没错。就是这么长。先别管为什么这么去修改,现在不展开来说,以后我另外写一篇关于Redis的文章。现在,先按照复制上去。但有一个你可以自己先去修改的,就是第511项,所设置的密码。你可以修改为自己的密码。我的是ljp030838.

然后把文件扔去(看好路径)/usr/local/redis/bin/ 里面。

接着操作:

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”nginx” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”Li9yZWRpcy1jbGkKI+eEtuWQjui+k+WFpQpzaHV0ZG93biDlm57ovaYK5YaN6L6T5YWl77yaCmV4aXQKI+eOsOWcqOW3sue7j+aKilJlZGlz5YGc5o6J5LqG77yM5YaN5qyh5byA5ZCv5bm26L+Q55So5oiR5Lus5Yia5omN5L+u5pS555qEcmVkaXMuY29uZgouL3JlZGlzLXNlcnZlciByZWRpcy5jb25mCiPmiJHku6zpqozor4HkuIDkuIvmiJHku6znmoTmmK/lkKblkK/liqjmiJDlip/mlrDnmoTphY3nva7mlofku7YKLi9yZWRpcy1jbGkKYXV0aCBsanAwMzA4Mzgo5L2g55qE5a+G56CBKQprZXlzICoKI+W6lOivpeS8muaPkOekuuaVsOaNruW6k+S4uuepuu+8jOetieS9oOW8gOWQr+S6huaPkuS7tuWwseS8muaYvuekuue8k+WtmOS6hueahOaWh+S7tuS6huOAgk9rLOaIkOWKn+S6huOAgumAgOWHuuOAggpleGl0Cg==” header_font=”Georgia|700|||||||” usetabwidth=”on”]Li9yZWRpcy1jbGkKI+eEtuWQjui+k+WFpQpzaHV0ZG93biDlm57ovaYK5YaN6L6T5YWl77yaCmV4aXQKI+eOsOWcqOW3sue7j+aKilJlZGlz5YGc5o6J5LqG77yM5YaN5qyh5byA5ZCv5bm26L+Q55So5oiR5Lus5Yia5omN5L+u5pS555qEcmVkaXMuY29uZgouL3JlZGlzLXNlcnZlciByZWRpcy5jb25mCiPmiJHku6zpqozor4HkuIDkuIvmiJHku6znmoTmmK/lkKblkK/liqjmiJDlip/mlrDnmoTphY3nva7mlofku7YKLi9yZWRpcy1jbGkKYXV0aCBsanAwMzA4Mzgo5L2g55qE5a+G56CBKQprZXlzICoKI+W6lOivpeS8muaPkOekuuaVsOaNruW6k+S4uuepuu+8jOetieS9oOW8gOWQr+S6huaPkuS7tuWwseS8muaYvuekuue8k+WtmOS6hueahOaWh+S7tuS6huOAgk9rLOaIkOWKn+S6huOAgumAgOWHuuOAggpleGl0Cg==[/et_pb_dmb_code_snippet]

接着 输入:nginx -t 

看看有没有问题,没问题的话。输入:lnmp restart. (有问题的,留言问)

重启完后,回到网站目录下,修改一下wp-config.php文件。

大概在文件的第60行输入:

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”nginx” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”Y2QgL2hvbWUvd3d3cm9vdC93d3cuWFhYWC5jb20vCgoj5Zyo6L+Z5paH5Lu25aS56YeM6Z2i5om+5Yiwd3AtY29uZmlnLnBocOOAguWcqDYw6KGM5bem5Y+z5o+S5YWl77yaCgovKioKICAgICAqIHJlZGlzIG9iamVjdCBjYWNoZemFjee9rgogICAgICovCmRlZmluZSgnV1BfUkVESVNfSE9TVCcsICcxMjcuMC4wLjEnKTsgICMgcmVkaXMg5pyN5Yqh5Zmo5Zyw5Z2ACmRlZmluZSgnV1BfUkVESVNfUE9SVCcsICc2Mzc5Jyk7ICAjIHJlZGlzIOacjeWKoeWZqOerr+WPowpkZWZpbmUoJ1dQX1JFRElTX0RBVEFCQVNFJywgJzAnKTsgICMgcmVkaXMg5pWw5o2u5bqT77yI56ys5LiA5LiqMCDvvIznrKzkuIDkuKox77yM5L6d5qyh57G75o6o77yJCmRlZmluZSgnV1BfUkVESVNfUEFTU1dPUkQnLCAnbGpwMDMwODM4Jyk7ICAjIHJlZGlzIOaVsOaNruW6k+Wvhuegge+8jOWwseaYr+WImuaJjeS9oOaDs+S/ruaUueeahOWvhueggQpkZWZpbmUoJ1dQX1JFRElTX0NMSUVOVCcsICdwZWNsJyk7Cg==” header_font=”Georgia|700|||||||” usetabwidth=”on”]Y2QgL2hvbWUvd3d3cm9vdC93d3cuWFhYWC5jb20vCgoj5Zyo6L+Z5paH5Lu25aS56YeM6Z2i5om+5Yiwd3AtY29uZmlnLnBocOOAguWcqDYw6KGM5bem5Y+z5o+S5YWl77yaCgovKioKICAgICAqIHJlZGlzIG9iamVjdCBjYWNoZemFjee9rgogICAgICovCmRlZmluZSgnV1BfUkVESVNfSE9TVCcsICcxMjcuMC4wLjEnKTsgICMgcmVkaXMg5pyN5Yqh5Zmo5Zyw5Z2ACmRlZmluZSgnV1BfUkVESVNfUE9SVCcsICc2Mzc5Jyk7ICAjIHJlZGlzIOacjeWKoeWZqOerr+WPowpkZWZpbmUoJ1dQX1JFRElTX0RBVEFCQVNFJywgJzAnKTsgICMgcmVkaXMg5pWw5o2u5bqT77yI56ys5LiA5LiqMCDvvIznrKzkuIDkuKox77yM5L6d5qyh57G75o6o77yJCmRlZmluZSgnV1BfUkVESVNfUEFTU1dPUkQnLCAnbGpwMDMwODM4Jyk7ICAjIHJlZGlzIOaVsOaNruW6k+Wvhuegge+8jOWwseaYr+WImuaJjeS9oOaDs+S/ruaUueeahOWvhueggQpkZWZpbmUoJ1dQX1JFRElTX0NMSUVOVCcsICdwZWNsJyk7Cg==[/et_pb_dmb_code_snippet]

还没有完结,你还要修改网站的conf 文件。

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”nginx” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”Y2QgL3Vzci9sb2NhbC9uZ2lueC9jb25mL3Zob3N0LwoKI+WwseaYr+i/meS4quaWh+S7tuWkuemHjOmdoueahOaWh+S7tu+8jOS9oOacgOWlveS4i+i9veS4i+adpeWOu+S/ruaUueOAgg==” header_font=”Georgia|700|||||||” usetabwidth=”on”]Y2QgL3Vzci9sb2NhbC9uZ2lueC9jb25mL3Zob3N0LwoKI+WwseaYr+i/meS4quaWh+S7tuWkuemHjOmdoueahOaWh+S7tu+8jOS9oOacgOWlveS4i+i9veS4i+adpeWOu+S/ruaUueOAgg==[/et_pb_dmb_code_snippet]

把下面的配置文件覆盖你的,然后把域名改为你自己的。

[et_pb_dmb_code_snippet _builder_version=”4.3.4″ background_color=”rgba(0,0,0,0)” language=”nginx” style=”atelier-sulphurpool-dark” linenums=”on” body_font=”Georgia||||||||” hover_enabled=”0″ code=”ICDphY3nva7mlofku7YKICB1cHN0cmVhbSByZWRpcyB7CiAgc2VydmVyIDEyNy4wLjAuMTo2Mzc5OwogIGtlZXBhbGl2ZSA1MTI7CiAgfQoKICBzZXJ2ZXIKewogIGxpc3RlbiA4MDsKICAjbGlzdGVuIFs6Ol06ODA7CiAgc2VydmVyX25hbWUgd3d3LmZ1ZW5pdHVyZXNvdXJjaW5nLmNvbSBmdWVuaXR1cmVzb3VyY2luZy5jb207CiAgcm9vdCAvaG9tZS93d3dyb290L3d3dy5mdWVuaXR1cmVzb3VyY2luZy5jb207CgogIGxvY2F0aW9uIC8gewogIHJldHVybiAzMDEgaHR0cHM6Ly93d3cuZnVlbml0dXJlc291cmNpbmcuY29tJHJlcXVlc3RfdXJpOwogIH0KfQoKICBzZXJ2ZXIKewogIGxpc3RlbiA0NDMgc3NsIGh0dHAyOwogICNsaXN0ZW4gWzo6XTo0NDMgc3NsIGh0dHAyOwogIHNlcnZlcl9uYW1lIHd3dy5mdWVuaXR1cmVzb3VyY2luZy5jb20gZnVlbml0dXJlc291cmNpbmcuY29tOwogIGluZGV4IGluZGV4Lmh0bWwgaW5kZXguaHRtIGluZGV4LnBocCBkZWZhdWx0Lmh0bWwgZGVmYXVsdC5odG0gZGVmYXVsdC5waHA7CiAgcm9vdCAvaG9tZS93d3dyb290L3d3dy5mdWVuaXR1cmVzb3VyY2luZy5jb207CgogICPor4Hkuabpg6jliIYKICBzc2xfY2VydGlmaWNhdGUgL3Vzci9sb2NhbC9uZ2lueC9jb25mL3NzbC93d3cuZnVlbml0dXJlc291cmNpbmcuY29tL2Z1bGxjaGFpbi5jZXI7CiAgc3NsX2NlcnRpZmljYXRlX2tleSAvdXNyL2xvY2FsL25naW54L2NvbmYvc3NsL3d3dy5mdWVuaXR1cmVzb3VyY2luZy5jb20vd3d3LmZ1ZW5pdHVyZXNvdXJjaW5nLmNvbS5rZXk7CgogICNUTFMg5o+h5omL5LyY5YyWCiAgc3NsX3Nlc3Npb25fY2FjaGUgc2hhcmVkOlNTTDoxMG07CiAgc3NsX3Nlc3Npb25fdGltZW91dCAxMG07CiAga2VlcGFsaXZlX3RpbWVvdXQgNzVzOwogIGtlZXBhbGl2ZV9yZXF1ZXN0cyAxMDA7CgogICNUTFMg54mI5pys5o6n5Yi2CiAgc3NsX3Byb3RvY29scyBUTFN2MSBUTFN2MS4xIFRMU3YxLjIgVExTdjEuMzsKICBzc2xfY2lwaGVycyAiVExTMTMtQUVTLTI1Ni1HQ00tU0hBMzg0OlRMUzEzLUNIQUNIQTIwLVBPTFkxMzA1LVNIQTI1NjpUTFMxMy1BRVMtMTI4LUdDTS1TSEEyNTY6VExTMTMtQUVTLTEyOC1DQ00tOC1TSEEyNTY6VExTMTMtQUVTLTEyOC1DQ00tU0hBMjU2OkVFQ0RIK0NIQUNIQTIwOkVFQ0RIK0NIQUNIQTIwLWRyYWZ0OkVFQ0RIK0VDRFNBK0FFUzEyODpFRUNESCthUlNBK0FFUzEyODpSU0ErQUVTMTI4OkVFQ0RIK0VDRFNBK0FFUzI1NjpFRUNESCthUlNBK0FFUzI1NjpSU0ErQUVTMjU2OkVFQ0RIK0VDRFNBKzNERVM6RUVDREgrYVJTQSszREVTOlJTQSszREVTOiFNRDUiOwogIHNzbF9wcmVmZXJfc2VydmVyX2NpcGhlcnMgb247CgogICMg5byA5ZCvIDEuMyBvLVJUVAogICNzc2xfZWFybHlfZGF0YSBvbjsKCiAgIyBvcGVuc3NsIGRocGFyYW0gLW91dCAvdXNyL2xvY2FsL25naW54L2NvbmYvc3NsL2RocGFyYW0ucGVtIDIwNDgKICBzc2xfZGhwYXJhbSAvdXNyL2xvY2FsL25naW54L2NvbmYvc3NsL2RocGFyYW0ucGVtOwoKICAjV29yZFByZXNz5Lyq6Z2Z5oCBCgogIGluY2x1ZGUgcmV3cml0ZS93b3JkcHJlc3MuY29uZjsKICAjZXJyb3JfcGFnZSA0MDQgLzQwNC5odG1sOwoKICAjIEdaaXAg5ZKMIEJyb3RsaQogIGd6aXAgb247CiAgZ3ppcF9jb21wX2xldmVsIDY7CiAgZ3ppcF9taW5fbGVuZ3RoIDFrOwogIGd6aXBfdHlwZXMgdGV4dC9wbGFpbiB0ZXh0L2NzcyB0ZXh0L3htbCB0ZXh0L2phdmFzY3JpcHQgdGV4dC94LWNvbXBvbmVudCBhcHBsaWNhdGlvbi9qc29uIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IGFwcGxpY2F0aW9uL3htbCBhcHBsaWNhdGlvbi94aHRtbCt4bWwgYXBwbGljYXRpb24vcnNzK3htbCBhcHBsaWNhdGlvbi9hdG9tK3htbCBhcHBsaWNhdGlvbi94LWZvbnQtdHRmIGFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0IGltYWdlL3N2Zyt4bWwgaW1hZ2UveC1pY29uIGZvbnQvb3BlbnR5cGU7CgogIGJyb3RsaSBvbjsKICBicm90bGlfc3RhdGljIG9mZjsKICBicm90bGlfbWluX2xlbmd0aCAxMDA7CiAgYnJvdGxpX2J1ZmZlcnMgMTYgOGs7CiAgYnJvdGxpX2NvbXBfbGV2ZWwgNTsKICBicm90bGlfdHlwZXMgdGV4dC9wbGFpbiB0ZXh0L2NzcyBhcHBsaWNhdGlvbi9qc29uIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCB0ZXh0L3htbCBhcHBsaWNhdGlvbi94bWwgYXBwbGljYXRpb24veG1sK3JzcyB0ZXh0L2phdmFzY3JpcHQgYXBwbGljYXRpb24vamF2YXNjcmlwdCBpbWFnZS9zdmcreG1sOwoKICAjIERlbnkgYWNjZXNzIHRvIFBIUCBmaWxlcyBpbiBzcGVjaWZpYyBkaXJlY3RvcnkKICAjbG9jYXRpb24gfiAvKHdwLWNvbnRlbnR8dXBsb2Fkc3x3cC1pbmNsdWRlc3xpbWFnZXMpLy4qXC5waHAkIHsgZGVueSBhbGw7IH0KCiAgaW5jbHVkZSBlbmFibGUtcGhwLXBhdGhpbmZvLmNvbmY7CgogIGFkZF9oZWFkZXIgU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eSBtYXgtYWdlPTYzMDcyMDAwOwogICMgYWRkX2hlYWRlciBYLUZyYW1lLU9wdGlvbnMgREVOWTsKICBhZGRfaGVhZGVyIFgtQ29udGVudC1UeXBlLU9wdGlvbnMgbm9zbmlmZjsKICBhZGRfaGVhZGVyICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4iICo7CgogICNyZWRpc+W8gOWQrwogIHNldCAkc2tpcF9jYWNoZSAwOwoKICAjUE9TVOivt+axguebtOaOpeiwg+eUqOWQjuerrwoKICBpZiAoJHJlcXVlc3RfbWV0aG9kID0gUE9TVCkgewogIHNldCAkc2tpcF9jYWNoZSAxOwogIH0KICBpZiAoJHF1ZXJ5X3N0cmluZyAhPSAiIikgewogIHNldCAkc2tpcF9jYWNoZSAxOwogIH0KCiAgI+S4jeimgee8k+WtmOS7peS4i+mDqOWIhgogIGlmICgkcmVxdWVzdF91cmkgfiogIi93cC1hZG1pbi98L3htbHJwYy5waHB8d3AtLioucGhwfC9mZWVkL3xpbmRleC5waHB8c2l0ZW1hcChfaW5kZXgpPy54bWwiKSB7CiAgc2V0ICRza2lwX2NhY2hlIDE7CiAgfQoKICAj5LiN57yT5a2Y55m76ZmG55So5oi35ZKM5pyA6L+R6K+E6K6655qE55So5oi3CiAgaWYgKCRodHRwX2Nvb2tpZSB+KiAiY29tbWVudF9hdXRob3J8d29yZHByZXNzX1thLWYwLTldK3x3cC1wb3N0cGFzc3x3b3JkcHJlc3Nfbm9fY2FjaGV8d29yZHByZXNzX2xvZ2dlZF9pbiIpIHsKICBzZXQgJHNraXBfY2FjaGUgMTsKICB9CgogIGxvY2F0aW9uIC9yZWRpcy1mZXRjaCB7CiAgaW50ZXJuYWwgOwogIHNldCAkcmVkaXNfa2V5ICRhcmdzOwogICNyZWRpc19wYXNzIDEyNy4wLjAuMTo2Mzc5OwogIH0KCiAgbG9jYXRpb24gfiBbXi9dXC5waHAoL3wkKSB7CiAgc2V0ICRrZXkgIm5naW54LWNhY2hlOiRzY2hlbWUkcmVxdWVzdF9tZXRob2QkaG9zdCRyZXF1ZXN0X3VyaSI7CiAgdHJ5X2ZpbGVzICR1cmkgPTQwNDsKCiAgI1BIUOeJiOacrOWPt+acieWHuuWFpeeahOWIq+W8hOmUmeS6hgogIGZhc3RjZ2lfcGFzcyB1bml4Oi92YXIvcnVuL3BocC9waHA3LjItZnBtLnNvY2s7CiAgZmFzdGNnaV9pbmRleCBpbmRleC5waHA7CiAgaW5jbHVkZSBmYXN0Y2dpLmNvbmY7CiAgZmFzdGNnaV9wYXJhbSBQSFBfVkFMVUUgIm9wZW5fYmFzZWRpcj0kZG9jdW1lbnRfcm9vdDovdG1wLzovcHJvYy8iOwogIH0KCiAgI1lvYXN0IHNpdGVtYXAKICBsb2NhdGlvbiB+IChbXi9dKilzaXRlbWFwKC4qKVwueChtfHMpbCQgewogICMjIHRoaXMgcmVkaXJlY3RzIHNpdGVtYXAueG1sIHRvIC9zaXRlbWFwX2luZGV4LnhtbAogIHJld3JpdGUgXi9zaXRlbWFwXC54bWwkIC9zaXRlbWFwX2luZGV4LnhtbCBwZXJtYW5lbnQ7CiAgIyMgdGhpcyBtYWtlcyB0aGUgWE1MIHNpdGVtYXBzIHdvcmsKICByZXdyaXRlIF4vKFthLXpdKyk/LT9zaXRlbWFwXC54c2wkIC9pbmRleC5waHA/eHNsPSQxIGxhc3Q7CiAgcmV3cml0ZSBeL3NpdGVtYXBfaW5kZXhcLnhtbCQgL2luZGV4LnBocD9zaXRlbWFwPTEgbGFzdDsKICByZXdyaXRlIF4vKFteL10rPyktc2l0ZW1hcChbMC05XSspP1wueG1sJCAvaW5kZXgucGhwP3NpdGVtYXA9JDEmc2l0ZW1hcF9uPSQyIGxhc3Q7CiAgIyMgVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgb3B0aW9uYWwgZm9yIHRoZSBwcmVtaXVtIGV4dGVuc2lvbnMKICAjIyBOZXdzIFNFTwogIHJld3JpdGUgXi9uZXdzLXNpdGVtYXBcLnhtbCQgL2luZGV4LnBocD9zaXRlbWFwPXdwc2VvX25ld3MgbGFzdDsKICAjIyBMb2NhbCBTRU8KICByZXdyaXRlIF4vbG9jYXRpb25zXC5rbWwkIC9pbmRleC5waHA/c2l0ZW1hcD13cHNlb19sb2NhbF9rbWwgbGFzdDsKICByZXdyaXRlIF4vZ2VvLXNpdGVtYXBcLnhtbCQgL2luZGV4LnBocD9zaXRlbWFwPXdwc2VvX2xvY2FsIGxhc3Q7CiAgIyMgVmlkZW8gU0VPCiAgcmV3cml0ZSBeL3ZpZGVvLXNpdGVtYXBcLnhzbCQgL2luZGV4LnBocD94c2w9dmlkZW8gbGFzdDsKICB9CgogIGxvY2F0aW9uIH4qIFwuKGljb3xnaWZ8Ym1wfGpwZ3xqcGVnfHBuZ3xzd2Z8anN8Y3NzfGd6fHN2Z3xzdmd6fHR0ZnxvdGZ8d29mZnxlb3R8bXA0fG9nZ3xvZ3Z8d2VibSkgewogIGV4cGlyZXMgMzBkOwogIGFkZF9oZWFkZXIgUHJhZ21hIHB1YmxpYzsKICBhZGRfaGVhZGVyIENhY2hlLUNvbnRyb2wgInB1YmxpYywgbXVzdC1yZXZhbGlkYXRlLCBwcm94eS1yZXZhbGlkYXRlIjsKICB9CgogIGxvY2F0aW9uIH4qIF4vd3AtY29udGVudC8uKi4ocGhwfHBocHMpJCB7CiAgZGVueSBhbGw7CiAgfQogIGxvY2F0aW9uIH4qIF4vd3AtaW5jbHVkZXMvLipcLihwaHB8cGhwcykkIHsKICBpbnRlcm5hbDsKICB9CgogIGxvY2F0aW9uID0gL3dwLWNvbmZpZy5waHAgewogIGRlbnkgYWxsOwogIH0KICBsb2NhdGlvbiB+KiBeL3dwLWNvbnRlbnQvLiouKHR4dHxtZHxleGUpJCB7CiAgZGVueSBhbGw7CiAgfQoKICBsb2NhdGlvbiB+KiAveG1scnBjLnBocCB7CiAgZGVueSBhbGw7CiAgfQoKICBsb2NhdGlvbiB+IC8ud2VsbC1rbm93biB7CiAgYWxsb3cgYWxsOwogIH0KCiAgbG9jYXRpb24gfiAvXC4KICB7CiAgZGVueSBhbGw7CiAgfQoKICBhY2Nlc3NfbG9nIC9ob21lL3d3d2xvZ3Mvd3d3LmZ1ZW5pdHVyZXNvdXJjaW5nLmNvbS5sb2c7Cu+9nQ==” header_font=”Georgia|700|||||||” usetabwidth=”on”]ICDphY3nva7mlofku7YKICB1cHN0cmVhbSByZWRpcyB7CiAgc2VydmVyIDEyNy4wLjAuMTo2Mzc5OwogIGtlZXBhbGl2ZSA1MTI7CiAgfQoKICBzZXJ2ZXIKewogIGxpc3RlbiA4MDsKICAjbGlzdGVuIFs6Ol06ODA7CiAgc2VydmVyX25hbWUgd3d3LmZ1ZW5pdHVyZXNvdXJjaW5nLmNvbSBmdWVuaXR1cmVzb3VyY2luZy5jb207CiAgcm9vdCAvaG9tZS93d3dyb290L3d3dy5mdWVuaXR1cmVzb3VyY2luZy5jb207CgogIGxvY2F0aW9uIC8gewogIHJldHVybiAzMDEgaHR0cHM6Ly93d3cuZnVlbml0dXJlc291cmNpbmcuY29tJHJlcXVlc3RfdXJpOwogIH0KfQoKICBzZXJ2ZXIKewogIGxpc3RlbiA0NDMgc3NsIGh0dHAyOwogICNsaXN0ZW4gWzo6XTo0NDMgc3NsIGh0dHAyOwogIHNlcnZlcl9uYW1lIHd3dy5mdWVuaXR1cmVzb3VyY2luZy5jb20gZnVlbml0dXJlc291cmNpbmcuY29tOwogIGluZGV4IGluZGV4Lmh0bWwgaW5kZXguaHRtIGluZGV4LnBocCBkZWZhdWx0Lmh0bWwgZGVmYXVsdC5odG0gZGVmYXVsdC5waHA7CiAgcm9vdCAvaG9tZS93d3dyb290L3d3dy5mdWVuaXR1cmVzb3VyY2luZy5jb207CgogICPor4Hkuabpg6jliIYKICBzc2xfY2VydGlmaWNhdGUgL3Vzci9sb2NhbC9uZ2lueC9jb25mL3NzbC93d3cuZnVlbml0dXJlc291cmNpbmcuY29tL2Z1bGxjaGFpbi5jZXI7CiAgc3NsX2NlcnRpZmljYXRlX2tleSAvdXNyL2xvY2FsL25naW54L2NvbmYvc3NsL3d3dy5mdWVuaXR1cmVzb3VyY2luZy5jb20vd3d3LmZ1ZW5pdHVyZXNvdXJjaW5nLmNvbS5rZXk7CgogICNUTFMg5o+h5omL5LyY5YyWCiAgc3NsX3Nlc3Npb25fY2FjaGUgc2hhcmVkOlNTTDoxMG07CiAgc3NsX3Nlc3Npb25fdGltZW91dCAxMG07CiAga2VlcGFsaXZlX3RpbWVvdXQgNzVzOwogIGtlZXBhbGl2ZV9yZXF1ZXN0cyAxMDA7CgogICNUTFMg54mI5pys5o6n5Yi2CiAgc3NsX3Byb3RvY29scyBUTFN2MSBUTFN2MS4xIFRMU3YxLjIgVExTdjEuMzsKICBzc2xfY2lwaGVycyAiVExTMTMtQUVTLTI1Ni1HQ00tU0hBMzg0OlRMUzEzLUNIQUNIQTIwLVBPTFkxMzA1LVNIQTI1NjpUTFMxMy1BRVMtMTI4LUdDTS1TSEEyNTY6VExTMTMtQUVTLTEyOC1DQ00tOC1TSEEyNTY6VExTMTMtQUVTLTEyOC1DQ00tU0hBMjU2OkVFQ0RIK0NIQUNIQTIwOkVFQ0RIK0NIQUNIQTIwLWRyYWZ0OkVFQ0RIK0VDRFNBK0FFUzEyODpFRUNESCthUlNBK0FFUzEyODpSU0ErQUVTMTI4OkVFQ0RIK0VDRFNBK0FFUzI1NjpFRUNESCthUlNBK0FFUzI1NjpSU0ErQUVTMjU2OkVFQ0RIK0VDRFNBKzNERVM6RUVDREgrYVJTQSszREVTOlJTQSszREVTOiFNRDUiOwogIHNzbF9wcmVmZXJfc2VydmVyX2NpcGhlcnMgb247CgogICMg5byA5ZCvIDEuMyBvLVJUVAogICNzc2xfZWFybHlfZGF0YSBvbjsKCiAgIyBvcGVuc3NsIGRocGFyYW0gLW91dCAvdXNyL2xvY2FsL25naW54L2NvbmYvc3NsL2RocGFyYW0ucGVtIDIwNDgKICBzc2xfZGhwYXJhbSAvdXNyL2xvY2FsL25naW54L2NvbmYvc3NsL2RocGFyYW0ucGVtOwoKICAjV29yZFByZXNz5Lyq6Z2Z5oCBCgogIGluY2x1ZGUgcmV3cml0ZS93b3JkcHJlc3MuY29uZjsKICAjZXJyb3JfcGFnZSA0MDQgLzQwNC5odG1sOwoKICAjIEdaaXAg5ZKMIEJyb3RsaQogIGd6aXAgb247CiAgZ3ppcF9jb21wX2xldmVsIDY7CiAgZ3ppcF9taW5fbGVuZ3RoIDFrOwogIGd6aXBfdHlwZXMgdGV4dC9wbGFpbiB0ZXh0L2NzcyB0ZXh0L3htbCB0ZXh0L2phdmFzY3JpcHQgdGV4dC94LWNvbXBvbmVudCBhcHBsaWNhdGlvbi9qc29uIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IGFwcGxpY2F0aW9uL3htbCBhcHBsaWNhdGlvbi94aHRtbCt4bWwgYXBwbGljYXRpb24vcnNzK3htbCBhcHBsaWNhdGlvbi9hdG9tK3htbCBhcHBsaWNhdGlvbi94LWZvbnQtdHRmIGFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0IGltYWdlL3N2Zyt4bWwgaW1hZ2UveC1pY29uIGZvbnQvb3BlbnR5cGU7CgogIGJyb3RsaSBvbjsKICBicm90bGlfc3RhdGljIG9mZjsKICBicm90bGlfbWluX2xlbmd0aCAxMDA7CiAgYnJvdGxpX2J1ZmZlcnMgMTYgOGs7CiAgYnJvdGxpX2NvbXBfbGV2ZWwgNTsKICBicm90bGlfdHlwZXMgdGV4dC9wbGFpbiB0ZXh0L2NzcyBhcHBsaWNhdGlvbi9qc29uIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCB0ZXh0L3htbCBhcHBsaWNhdGlvbi94bWwgYXBwbGljYXRpb24veG1sK3JzcyB0ZXh0L2phdmFzY3JpcHQgYXBwbGljYXRpb24vamF2YXNjcmlwdCBpbWFnZS9zdmcreG1sOwoKICAjIERlbnkgYWNjZXNzIHRvIFBIUCBmaWxlcyBpbiBzcGVjaWZpYyBkaXJlY3RvcnkKICAjbG9jYXRpb24gfiAvKHdwLWNvbnRlbnR8dXBsb2Fkc3x3cC1pbmNsdWRlc3xpbWFnZXMpLy4qXC5waHAkIHsgZGVueSBhbGw7IH0KCiAgaW5jbHVkZSBlbmFibGUtcGhwLXBhdGhpbmZvLmNvbmY7CgogIGFkZF9oZWFkZXIgU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eSBtYXgtYWdlPTYzMDcyMDAwOwogICMgYWRkX2hlYWRlciBYLUZyYW1lLU9wdGlvbnMgREVOWTsKICBhZGRfaGVhZGVyIFgtQ29udGVudC1UeXBlLU9wdGlvbnMgbm9zbmlmZjsKICBhZGRfaGVhZGVyICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4iICo7CgogICNyZWRpc+W8gOWQrwogIHNldCAkc2tpcF9jYWNoZSAwOwoKICAjUE9TVOivt+axguebtOaOpeiwg+eUqOWQjuerrwoKICBpZiAoJHJlcXVlc3RfbWV0aG9kID0gUE9TVCkgewogIHNldCAkc2tpcF9jYWNoZSAxOwogIH0KICBpZiAoJHF1ZXJ5X3N0cmluZyAhPSAiIikgewogIHNldCAkc2tpcF9jYWNoZSAxOwogIH0KCiAgI+S4jeimgee8k+WtmOS7peS4i+mDqOWIhgogIGlmICgkcmVxdWVzdF91cmkgfiogIi93cC1hZG1pbi98L3htbHJwYy5waHB8d3AtLioucGhwfC9mZWVkL3xpbmRleC5waHB8c2l0ZW1hcChfaW5kZXgpPy54bWwiKSB7CiAgc2V0ICRza2lwX2NhY2hlIDE7CiAgfQoKICAj5LiN57yT5a2Y55m76ZmG55So5oi35ZKM5pyA6L+R6K+E6K6655qE55So5oi3CiAgaWYgKCRodHRwX2Nvb2tpZSB+KiAiY29tbWVudF9hdXRob3J8d29yZHByZXNzX1thLWYwLTldK3x3cC1wb3N0cGFzc3x3b3JkcHJlc3Nfbm9fY2FjaGV8d29yZHByZXNzX2xvZ2dlZF9pbiIpIHsKICBzZXQgJHNraXBfY2FjaGUgMTsKICB9CgogIGxvY2F0aW9uIC9yZWRpcy1mZXRjaCB7CiAgaW50ZXJuYWwgOwogIHNldCAkcmVkaXNfa2V5ICRhcmdzOwogICNyZWRpc19wYXNzIDEyNy4wLjAuMTo2Mzc5OwogIH0KCiAgbG9jYXRpb24gfiBbXi9dXC5waHAoL3wkKSB7CiAgc2V0ICRrZXkgIm5naW54LWNhY2hlOiRzY2hlbWUkcmVxdWVzdF9tZXRob2QkaG9zdCRyZXF1ZXN0X3VyaSI7CiAgdHJ5X2ZpbGVzICR1cmkgPTQwNDsKCiAgI1BIUOeJiOacrOWPt+acieWHuuWFpeeahOWIq+W8hOmUmeS6hgogIGZhc3RjZ2lfcGFzcyB1bml4Oi92YXIvcnVuL3BocC9waHA3LjItZnBtLnNvY2s7CiAgZmFzdGNnaV9pbmRleCBpbmRleC5waHA7CiAgaW5jbHVkZSBmYXN0Y2dpLmNvbmY7CiAgZmFzdGNnaV9wYXJhbSBQSFBfVkFMVUUgIm9wZW5fYmFzZWRpcj0kZG9jdW1lbnRfcm9vdDovdG1wLzovcHJvYy8iOwogIH0KCiAgI1lvYXN0IHNpdGVtYXAKICBsb2NhdGlvbiB+IChbXi9dKilzaXRlbWFwKC4qKVwueChtfHMpbCQgewogICMjIHRoaXMgcmVkaXJlY3RzIHNpdGVtYXAueG1sIHRvIC9zaXRlbWFwX2luZGV4LnhtbAogIHJld3JpdGUgXi9zaXRlbWFwXC54bWwkIC9zaXRlbWFwX2luZGV4LnhtbCBwZXJtYW5lbnQ7CiAgIyMgdGhpcyBtYWtlcyB0aGUgWE1MIHNpdGVtYXBzIHdvcmsKICByZXdyaXRlIF4vKFthLXpdKyk/LT9zaXRlbWFwXC54c2wkIC9pbmRleC5waHA/eHNsPSQxIGxhc3Q7CiAgcmV3cml0ZSBeL3NpdGVtYXBfaW5kZXhcLnhtbCQgL2luZGV4LnBocD9zaXRlbWFwPTEgbGFzdDsKICByZXdyaXRlIF4vKFteL10rPyktc2l0ZW1hcChbMC05XSspP1wueG1sJCAvaW5kZXgucGhwP3NpdGVtYXA9JDEmc2l0ZW1hcF9uPSQyIGxhc3Q7CiAgIyMgVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgb3B0aW9uYWwgZm9yIHRoZSBwcmVtaXVtIGV4dGVuc2lvbnMKICAjIyBOZXdzIFNFTwogIHJld3JpdGUgXi9uZXdzLXNpdGVtYXBcLnhtbCQgL2luZGV4LnBocD9zaXRlbWFwPXdwc2VvX25ld3MgbGFzdDsKICAjIyBMb2NhbCBTRU8KICByZXdyaXRlIF4vbG9jYXRpb25zXC5rbWwkIC9pbmRleC5waHA/c2l0ZW1hcD13cHNlb19sb2NhbF9rbWwgbGFzdDsKICByZXdyaXRlIF4vZ2VvLXNpdGVtYXBcLnhtbCQgL2luZGV4LnBocD9zaXRlbWFwPXdwc2VvX2xvY2FsIGxhc3Q7CiAgIyMgVmlkZW8gU0VPCiAgcmV3cml0ZSBeL3ZpZGVvLXNpdGVtYXBcLnhzbCQgL2luZGV4LnBocD94c2w9dmlkZW8gbGFzdDsKICB9CgogIGxvY2F0aW9uIH4qIFwuKGljb3xnaWZ8Ym1wfGpwZ3xqcGVnfHBuZ3xzd2Z8anN8Y3NzfGd6fHN2Z3xzdmd6fHR0ZnxvdGZ8d29mZnxlb3R8bXA0fG9nZ3xvZ3Z8d2VibSkgewogIGV4cGlyZXMgMzBkOwogIGFkZF9oZWFkZXIgUHJhZ21hIHB1YmxpYzsKICBhZGRfaGVhZGVyIENhY2hlLUNvbnRyb2wgInB1YmxpYywgbXVzdC1yZXZhbGlkYXRlLCBwcm94eS1yZXZhbGlkYXRlIjsKICB9CgogIGxvY2F0aW9uIH4qIF4vd3AtY29udGVudC8uKi4ocGhwfHBocHMpJCB7CiAgZGVueSBhbGw7CiAgfQogIGxvY2F0aW9uIH4qIF4vd3AtaW5jbHVkZXMvLipcLihwaHB8cGhwcykkIHsKICBpbnRlcm5hbDsKICB9CgogIGxvY2F0aW9uID0gL3dwLWNvbmZpZy5waHAgewogIGRlbnkgYWxsOwogIH0KICBsb2NhdGlvbiB+KiBeL3dwLWNvbnRlbnQvLiouKHR4dHxtZHxleGUpJCB7CiAgZGVueSBhbGw7CiAgfQoKICBsb2NhdGlvbiB+KiAveG1scnBjLnBocCB7CiAgZGVueSBhbGw7CiAgfQoKICBsb2NhdGlvbiB+IC8ud2VsbC1rbm93biB7CiAgYWxsb3cgYWxsOwogIH0KCiAgbG9jYXRpb24gfiAvXC4KICB7CiAgZGVueSBhbGw7CiAgfQoKICBhY2Nlc3NfbG9nIC9ob21lL3d3d2xvZ3Mvd3d3LmZ1ZW5pdHVyZXNvdXJjaW5nLmNvbS5sb2c7Cu+9nQ==[/et_pb_dmb_code_snippet]

完成以后,把修改的文件覆盖之前的。然后回到网站后台,开启redis插件。

打完收工。

Linode VPS+LNMP1.5+WordPress搭建外贸网站

Linode VPS+LNMP1.5+WordPress搭建外贸网站

本文写使用的搭建环境与软件是CentOS 7 + LNMP1.5 + WordPress + AVADA主题,根据本文步骤操作,你可以架设出自己的个人外贸网站。本文主要内容如下:

  1. VPS和域名的配置
  2. 安装lnmp包
  3. 部署虚拟主机+安装WordPress
  4. 设置SSL证书

[sta_anchor id=”vps”]1.VPS和域名的配置[/sta_anchor]

VPS中我选用了Linode VPS的5刀配置的,当然你可以选择其他的VPS也是可以的。但我个人喜欢Linode,毕竟操作简单。至于如何购买Linode,我这里就不说了。如果你真的不懂的话可以参考hunk或者料神的博客。

https://www.imhunk.com/linode-faq/

https://www.liaosam.com/linode-vps-intro.html

调过购买教程后,直接配置VPS。

linode vps

我选了新加坡地区的。

linode vps

Root Password 尽量设置复杂一点,而且必须记下来!记下来!记下来!等下要用到。

linode vps

点了Rebuild后等个10几秒初次化。

linode vps

初次化后直接点Boot,开启!

一切准备好,拿起你的SSH工具,准备开波。Skr,skr

[sta_anchor id=”lnmp”]2.安装lnmp包[/sta_anchor]

工具:Xshell + Xftp,自行去官网下载。官网地址:www.netsarang.com 下载时选择一下你是 home use,即可免费下载。

打开xshell点新建。

xshell

输入自己喜欢的名称,主机填刚才vps的IP地址,端口22,间隔45。然后先别急点确定!

xshell

点击左上角‘用户身份验证’用户名输入root,密码:输入刚才开通配置vps时的密码(就是刚才说记住的那个密码)。然后点确定。

xshell

然后点击链接刚才新建的,在弹框的这里点击“接受并保存”下次链接就不会再弹出来。除非你更改了密码。

xshell

链接后就开始表演真正的技术了…

A.安装Lnmp1.5

LNMP一般来说指的是Linux + Nginx + Mysql + PHP,用这个组合可以快速搭建出轻量级的网站,因此深受喜爱。而LNMP一键安装包(https://lnmp.org/)则是一个集成了安装、配置过程的第三方包,为了快速建站,此处我们选择一键安装包。

此文写作时,LNMP最新的是1.5版本,优化了对SSL的支持,若希望快速完成SSL证书生成+部署到WordPress,使用https协议,建议使用此版本。

CentOS 6.8/ CentOS 7 系统默认未安装 Wget 指令程序,那么执行一下这条命令先安装 wget: (CentOs 系统)

sudo yum -y install wget

 

首先,运行如下代码,通过wget将压缩包下载到本地并解压,并运行install.sh安装。复制下面代码,右键粘贴进Xshell然后回车。

#lnmp1.5安装lnmp包
wget -c http://soft.vpser.net/lnmp/lnmp1.5.tar.gz
tar zxf lnmp1.5.tar.gz
cd lnmp1.5
./install.sh lnmp

安装配置时注意的点:

  • 安装的Mysql版本(直接回车选择默认的5.5.60或者输入2)
  • 设置Mysql的root账户的密码(建议设置刚才VPS的root一样的密码,或重新设置复杂的密码。必须记下来!)
  • 是否开启InnoDB,支持并发与表间引用(直接回车默认开启或输入Y)
  • 安装的PHP版本(选择php7.1.18,我听说PHP7.2现在有BUG。)
  • 是否开启存储分配器(直接回车默认不开启或输入N)

lnmp1.5

接着就是按任意键开始安装了。安装过程需要三十分钟左右。

B.域名解释

趁着安装的时候,我们就去做一下域名DNS的解释。

域名我一般都在namesilo上面购买。这里有个优惠码:030838。购买域名时输入便是。

DNS解释我一般会在cloudflare上做解释,原因是快!5分钟内就解析完成。

namesilo

先在namesilo上的nameserver指向cloudflare.然后去DNS设置那边吧之前默认的解释全部删除。

cloudflare

在cloudflare上添加网址,然后设置NDS解释。做两个A记录:一个是泛解析@,一个是www.都指向刚才的VPS IP地址。

[sta_anchor id=”wordpress”]3.部署虚拟主机+安装WordPress[/sta_anchor]

lnmp1.5 成功安装

等待了大约35分钟,终于安装好!

同时你打开网址会看见这样的显示:

lnmp 成功安装

验证完毕后,我们就可以删除lnmp安装包存放在本地的网页了,删除后,将不会再出现上面的页面。

cd /home/wwwroot/default
sudo rm *.php *.html *.gif

A.配置虚拟主机

虚拟私有服务器VPS和虚拟主机vhost的区别是什么呢?

一个服务器可以被分为多个虚拟主机,每个虚拟主机存放不同网站的数据。

所以,现在我们要做的是,创建一个虚拟主机,用来存放www.fuenituresourcing.com网站的数据。

我们需要借助lnmp帮我们进行配置:

lnmp vhost add

你需要配置下面的选项,请牢记配置中的数据库名字、账号、密码

  1. 输入域名:www.fuenituresourcing.com (你可以用1级域名,而不使用www. 我习惯使用。)
  2. 是否需要输入更多的域名?:fuenituresourcing.com  (若不输入,直接回车,则以后需要自己通过301重定向,把没有www的域名定向到www域名)
  3. 输入存放网站数据的目录(直接回车,默认是/home/wwwroot/www.fuenituresourcing.com)
  4. 是否开启rewrite规则?这里输入y,会问你是什么类型的框架,输入wordpress
  5. 是否允许phpinfo:我选择y(pathinfo的原理就是将index.php/xxxx/xxx类似的网址当做php来执行)
  6. 是否开启数据库日志:虽然日志记录是比较安全、规范的做法,但是会占用大量存储空间,我们的小VPS就不要开启了。
  7. 是否为网站创建数据库,并且创建一个和数据库同名的数据库账号:输入y
  8. 请输出mysql的root密码(这时的密码是不可见的,你直接输入就是,输入正确会说OK。)
  9. 输入想要使用的名字:输入wordpress (你可以输入其他自己喜欢的名字),这样,你的mysql里面名为wordpress的数据库就专门用于存放www.fuenituresourcing.com的网站数据了。你可以通过名为wordpress的账号来管理名为wordpress的数据库。
  10. 输入想要为新账户设置的密码:用来登录上面创建的新账户
  11. 是否使用SSL认证:选择y(我们需要使用https协议,而不是明文传输的http)
  12. 使用自己已有的证书还是使用Let’s Encrypt申请一个:选择2使用Let’s Encrypt申请。
  13. 接着按任意键创建就行了。

添加虚拟主机

 

添加虚拟主机

安装成功后,把这一段信息截图或者复制下来,等下安装WordPress要用到。

B.安装WordPress

去下载最新版本的 WordPress 程序文件。

cd /home/wwwroot/www.fuenituresourcing.com
wget https://wordpress.org/latest.zip

下载完成后,解压文件:

unzip latest.zip

接着在 Xftp 里刷新一下,可以看到已经解压完成。解压出来一个 WordPress 文件夹。

在 Xftp 里双击 WordPress 文件夹,可以看到 WordPress 程序文件都已经成功解压。

接下来,我们要把所有程序文件移动到上一层,保持在 fuenituresourcing.com 目录之下。并把 wordpress这个文件夹删除。

注意,这里要用到移动文件的命令 “mv” 。在 Xshell 上输入:

mv wordpress/* . (注意:星号后有一个空格,一个点)  回车

这样就完成了所有程序文件的移动。至于wordpress这个空文件夹,你可以直接在 Xftp 里面删除了。

xftp

这时候,在浏览器输入自己的网址。进入WordPress 最后安装:

wordpress 安装

Let’s go!

wordpress 安装

输入刚才安装虚拟主机的信息!

wordpress 安装

继续下一步!

wordpress 安装

这里的Site Title 可以先随便填,进去后台可以改。用户名,密码是用来登录你的WordPress后台的。

邮箱地址是用来收一些网站的信息。最后的选项请打上勾,先不要给搜索引擎收录。因为是新网站!先把所有的东西建好才去收录。

wordpress 安装

下一步后,就可以进入后台了。WordPress 安装成功!

现在你的个人网站已经正式上线了,但是如果你尝试安装主题或者安装插件,你可能会发现安装失败,并且向你索要ftp信息,但是,我们不需要安装FTP。

安装失败的原因是,WordPress无法在/home/wwwroot/www.fuenituresourcing.com下进行数据目录的创建和删除,因此尝试使用FTP进行数据操作。我们最好避免这类明文协议安装在我们的服务器上。这时我们只要将目录的所有者改为www,并且增加各用户对此目录的操作权限就行了,-R代表递归操作子目录:

chattr -i /home/wwwroot/www.fuenituresourcing.com/.user.ini
chmod -R 755 /home/wwwroot/www.fuenituresourcing.com
chown -R www /home/wwwroot/www.fuenituresourcing.com

搞定,一切正常!Skr,Skr…

[sta_anchor id=”ssl”]4.设置SSL证书[/sta_anchor]

目前,你的个人网站已经实现了基本功能,其他功能可以通过在各种WordPress社区寻找插件来实现了。但是,你的网站目前默认使用的是http明文传输。正如尽量避免ftp一样,我们也应该避免http协议。

如果你输入www.fuenituresourcing.com和https://www.fuenituresourcing.com,你会发现地址栏上一个是不安全的,一个是带锁的,也就是说我们现在同时支持两种协议,那么接下来我们需要将通过http协议进行的访问请求重定向到https协议访问上。如果你的网站不能进行https访问,请先解决它,不要进行以下操作(一般可能是某个依赖库没安装,安装后通过lnmp ssl add重新申请,或搜索手工配置的技术博客,但一般情况下并不会出现)。

A.301重定向进行全站https传输

目前使用较多的代理服务器有Nginx和Apache,我们使用的是Nginx。如果你使用的是Apache,请通过关键词搜索其他方案。

为了配置代理服务器,我们需要知道本机的Nginx安装在何处,通过whereis命令执行:

whereis nginx.conf

你会看到这样的提示:nginx: /usr/bin/nginx /usr/local/nginx

可以看到,目录在/usr/local/nginx,那么我们进入其配置文件:

cd /usr/local/nginx/conf

你会发现目录下有很多.conf文件,这些都是配置信息,那么怎么修改呢?

代理服务器的对一个网站的服务流程可以概述如下:设置一个server,其中设置了监听端口、服务的域名等配置信息,当监听到对应访问时,通过配置信息进行处理。要注意的是,(域名,端口)组合的server应该是独一的,否则会出现冲突。

基于上述理由,我们在添加配置前要先确认,是否已有对应server:若没有,我们可以直接添加;若有,则需要到对应地方修改。用grep命令进行搜索:

grep -r "fuenituresourcing.com" *
ssl/www.fuenituresourcing.com/www.fuenituresourcing.com.csr.conf:subjectAltName=DNS:www.fuenituresourcing.com,DNS:fuenituresourcing.com
ssl/www.fuenituresourcing.com/www.fuenituresourcing.com.conf:Le_Domain='www.fuenituresourcing.com'
ssl/www.fuenituresourcing.com/www.fuenituresourcing.com.conf:Le_Alt='fuenituresourcing.com'
ssl/www.fuenituresourcing.com/www.fuenituresourcing.com.conf:Le_Webroot='/home/wwwroot/www.fuenituresourcing.com'
vhost/www.fuenituresourcing.com.conf: server_name www.fuenituresourcing.com fuenituresourcing.com;
vhost/www.fuenituresourcing.com.conf: root /home/wwwroot/www.fuenituresourcing.com;
vhost/www.fuenituresourcing.com.conf: server_name www.fuenituresourcing.com fuenituresourcing.com;
vhost/www.fuenituresourcing.com.conf: root /home/wwwroot/www.fuenituresourcing.com;
vhost/www.fuenituresourcing.com.conf: ssl_certificate /usr/local/nginx/conf/ssl/www.fuenituresourcing.com/fullchain.cer;
vhost/www.fuenituresourcing.com.conf: ssl_certificate_key /usr/local/nginx/conf/ssl/www.fuenituresourcing.com/www.fuenituresourcing.com.key;

 

这下我们看到了,vhost/www.fuenituresourcing.com.conf里存在相关server,我们直接进入修改,实现301重定向的模板如下:

server {
 listen 80;
 server_name www.fuenituresourcing.com fuenituresourcing.com;
 return 301 https://www.fuenituresourcing.com$request_uri;
}

在server 段修改。当然你也可以用XFTP把文件下载到本地去修改,再重新上传。

这个模板的意思是:对于www.fuenituresourcing.com:80的访问,server的处理方式是直接return 301+ url ,告诉访问者到这个url。80端口是http端口,433是https端口,所以你也可以return www.fuenituresourcing.com:433$request_uri。

通过这个模板,你可以实现多个域名映射到同一域名,设置无www域名到有www域名的映射等。你甚至可以重定向到百度。

或者你可以直接复制我的配置,只要把网址改回自己的:

server
    {
      listen 80;
      #listen [::]:80;
      server_name www.fuenituresourcing.com fuenituresourcing.com;
      return 301 https://www.fuenituresourcing.com$request_uri;
    }	

server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name www.fuenituresourcing.com fuenituresourcing.com;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/www.fuenituresourcing.com;
        ssl on;
        ssl_certificate /usr/local/nginx/conf/ssl/www.fuenituresourcing.com/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/conf/ssl/www.fuenituresourcing.com/www.fuenituresourcing.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
        ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;

        include rewrite/wordpress.conf;
        #error_page   404   /404.html;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        include enable-php-pathinfo.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /.well-known {
            allow all;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log off;
    }

 

修改完毕后,我们需要重启Nginx服务使配置生效:

sudo nginx -s reload

当然也可以使用lnmp一键包将NM重启:

lnmp restart

此外,我们还要配置WordPress的相关信息.

  • 通过WordPress后台管理“设置”中“常规”里面把“WordPress地址(URL)”、“站点地址(URL)”两个地址的http修改为https,“设置”中“多媒体”的“文件的完整URL地址”改为https。

B.SSL证书的自动续期

lnmp1.5版以后,安装包使用更便捷的acme.sh进行申请SSL证书,而不是certbot(因为certbot需要的依赖包较多。不过现在也有certbot-auto版,能自动安装所需依赖库)。

需要注意的是,SSL证书具有有效期,我们需要按时续期。Lnmp1.5 使用的acme.sh它是自动80天续期的,不必操作。

至此,一套完整的使用https访问的个人网站就搭建完成了。

C.安装AVADA主题

直接到wordpress后台上传AVADA主题,而且我建议也吧AVADA的子主题也同时安装。

其中安装成功后,必须安装Fusion Core,与Fusion Builder这两个插件。不然AVADA无法使用。

AVADA设置

安装完必要插件后,安装子主题并启用。

AVADA设置

然后去到AVADA的System Status 看红字情况。这里是要求把PHP Max Input Vars最小调到1500.

AVADA设置

我们点击他的建议查看PHP Max Input Vars究竟在哪里改。这里明显可以在php.ini里面修改。

AVADA设置

如何查找这个文件?很简单。先去网站目录新建一个123.php的文件。(名字随便改)

如何找到php.ini

然后在文件里面输入以下内容,并保存:

<?php phpinfo(); ?>

然后到浏览器去键入www.fuenituresourcing.com/123.php。这时候在打开的页面按Ctrl+F查找php.ini就可以找到该文件的位置:

如何找到php.ini

这里显示文件在/usr/local/php/etc/php.ini。

你可以用Vi命令去修改,也可以直接把文件下载到本地。

我选择下载到本地修改后上传。打开文件查找”max_input_vars” 把数值改为3000(大概在代码段400位置),并把前面的分号去掉。

PHP

修改完上传,然后重启一下lnmp:

lnmp restart

回到刚才的红字页面,刷新。你会发现已经OK了。

如果你还有其他红字问题照样按照它给你的提示去操作,或者参考这两篇文章:

https://www.imhunk.com/fix-avada-red-system-status/

https://www.liaosam.com/lnmp-wordpres-problems-records.html