From 0d5cddb7f5e87843f87ba14499fe82ee7f9b7d91 Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Mon, 14 Oct 2024 12:44:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=BA=94=E7=94=A8=20Certimat?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Meng Sen --- .github/README.md | 1 + README.md | 1 + apps/certimate/0.2.0/data.yml | 17 +++++++ apps/certimate/0.2.0/docker-compose.yml | 20 ++++++++ apps/certimate/0.2.0/scripts/init.sh | 15 ++++++ apps/certimate/0.2.0/scripts/uninstall.sh | 10 ++++ apps/certimate/0.2.0/scripts/upgrade.sh | 15 ++++++ apps/certimate/README.md | 58 ++++++++++++++++++++++ apps/certimate/data.yml | 16 ++++++ apps/certimate/logo.png | Bin 0 -> 17936 bytes 10 files changed, 153 insertions(+) create mode 100644 apps/certimate/0.2.0/data.yml create mode 100644 apps/certimate/0.2.0/docker-compose.yml create mode 100644 apps/certimate/0.2.0/scripts/init.sh create mode 100644 apps/certimate/0.2.0/scripts/uninstall.sh create mode 100644 apps/certimate/0.2.0/scripts/upgrade.sh create mode 100644 apps/certimate/README.md create mode 100644 apps/certimate/data.yml create mode 100644 apps/certimate/logo.png diff --git a/.github/README.md b/.github/README.md index 39ae73de3..b8b7596d3 100644 --- a/.github/README.md +++ b/.github/README.md @@ -87,6 +87,7 @@ | 🟢 | | Artalk | https://artalk.js.org/ | 一个自托管的评论系统 | | | 🟢 | | Bark | https://bark.day.app/ | 一款注重隐私、安全可控的自定义通知推送工具 | | | 🟢 | | Casdoor | https://casdoor.org/ | 身份和访问管理(IAM)/单点登录(SSO)平台 | | +| 🟢 | | Certimate | https://docs.certimate.me/ | SSL证书管理工具 | | | 🟢 | | Cookie Cloud | https://github.com/easychen/CookieCloud/ | CookieCloud是一个和自架服务器同步浏览器Cookie和LocalStorage的小工具 | | | 🟢 | | DeepLX | https://deeplx.owo.network/ | DeepL免费API(无需TOKEN) | | | 🟢 | | Dockge | https://dockge.kuma.pet/ | 面向堆栈的管理器 | | diff --git a/README.md b/README.md index 7765df399..bd63c97f6 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ | 🟢 | | Artalk | https://artalk.js.org/ | 一个自托管的评论系统 | | | 🟢 | | Bark | https://bark.day.app/ | 一款注重隐私、安全可控的自定义通知推送工具 | | | 🟢 | | Casdoor | https://casdoor.org/ | 身份和访问管理(IAM)/单点登录(SSO)平台 | | +| 🟢 | | Certimate | https://docs.certimate.me/ | SSL证书管理工具 | | | 🟢 | | Cookie Cloud | https://github.com/easychen/CookieCloud/ | CookieCloud是一个和自架服务器同步浏览器Cookie和LocalStorage的小工具 | | | 🟢 | | DeepLX | https://deeplx.owo.network/ | DeepL免费API(无需TOKEN) | | | 🟢 | | Dockge | https://dockge.kuma.pet/ | 面向堆栈的管理器 | | diff --git a/apps/certimate/0.2.0/data.yml b/apps/certimate/0.2.0/data.yml new file mode 100644 index 000000000..c01683633 --- /dev/null +++ b/apps/certimate/0.2.0/data.yml @@ -0,0 +1,17 @@ +additionalProperties: + formFields: + - default: "/home/certimate" + edit: true + envKey: CERTIMATE_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 8090 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: Web UI 端口 + labelEn: Web UI port + required: true + rule: paramPort + type: number diff --git a/apps/certimate/0.2.0/docker-compose.yml b/apps/certimate/0.2.0/docker-compose.yml new file mode 100644 index 000000000..cd6888012 --- /dev/null +++ b/apps/certimate/0.2.0/docker-compose.yml @@ -0,0 +1,20 @@ +networks: + 1panel-network: + external: true + +services: + certimate: + image: usual2970/certimate:v0.2.0 + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:8090 + env_file: + - /etc/1panel/envs/global.env + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${CERTIMATE_ROOT_PATH}/data:/app/pb_data diff --git a/apps/certimate/0.2.0/scripts/init.sh b/apps/certimate/0.2.0/scripts/init.sh new file mode 100644 index 000000000..77b849120 --- /dev/null +++ b/apps/certimate/0.2.0/scripts/init.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/certimate/0.2.0/scripts/uninstall.sh b/apps/certimate/0.2.0/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/certimate/0.2.0/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/certimate/0.2.0/scripts/upgrade.sh b/apps/certimate/0.2.0/scripts/upgrade.sh new file mode 100644 index 000000000..77b849120 --- /dev/null +++ b/apps/certimate/0.2.0/scripts/upgrade.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/certimate/README.md b/apps/certimate/README.md new file mode 100644 index 000000000..23b05c6c0 --- /dev/null +++ b/apps/certimate/README.md @@ -0,0 +1,58 @@ +# Certimate + +SSL证书管理工具 + +![Certimate](https://file.lifebus.top/imgs/certimate_cover.png) + +开源的SSL证书管理工具,可以帮助你自动申请、部署SSL证书,并在证书即将过期时自动续期。 + +An open-source SSL certificate management tool that helps you automatically apply for and deploy SSL certificates, as +well as automatically renew them when they are about to expire. + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 简介 + +做个人产品或在小企业负责运维的同学,需要管理多个域名,要给域名申请证书。但手动申请证书有以下缺点: + +😱麻烦:申请、部署证书虽不困难,但也挺麻烦的,尤其是维护多个域名的时候。 + +😭易忘:当前免费证书有效期仅90天,这就要求定期操作,增加工作量的同时,也很容易忘掉,导致网站无法访问。 + +Certimate 就是为了解决上述问题而产生的,它具有以下特点: + ++ 操作简单:自动申请、部署、续期 SSL 证书,全程无需人工干预。 ++ 支持私有部署:部署方法简单,只需下载二进制文件执行即可。二进制文件、docker 镜像全部用 github actions 生成,过程透明,可自行审计。 ++ 数据安全:由于是私有部署,所有数据均存储在本地,不会保存在服务商的服务器,确保数据的安全性。 + +## 概念 + +Certimate 的工作流程如下: + ++ 用户通过 Certimate 管理页面填写申请证书的信息,包括域名、dns 服务商的授权信息、以及要部署到的服务商的授权信息。 ++ Certimate 向证书场商的 API 发起申请请求,获取 SSL 证书。 ++ Certimate 存储证书信息,包括证书内容、私钥、证书有效期等,并在证书即将过期时自动续期。 ++ Certimate 向服务商的 API 发起部署请求,将证书部署到服务商的服务器上。 + +这就涉及域名、dns 服务商的授权信息、部署服务商的授权信息等。 + +## 支持的服务商列表 + +| 服务商 | 是否域名服务商 | 是否部署服务 | 备注 | +|------------|---------|--------|------------------------------------------| +| 阿里云 | 是 | 是 | 支持阿里云注册的域名,支持部署到阿里云 CDN,OSS | +| 腾讯云 | 是 | 是 | 支持腾讯云注册的域名,支持部署到腾讯云 CDN | +| 七牛云 | 否 | 是 | 七牛云没有注册域名服务,支持部署到七牛云 CDN | +| CloudFlare | 是 | 否 | 支持 CloudFlare 注册的域名,CloudFlare 服务自带SSL证书 | +| SSH | 否 | 是 | 支持部署到 SSH 服务器 | +| WEBHOOK | 否 | 是 | 支持回调到 WEBHOOK | + +## 安装说明 + +> 用户名 `admin@certimate.fun` +> +> 密码:`1234567890` + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/certimate/data.yml b/apps/certimate/data.yml new file mode 100644 index 000000000..9284f5490 --- /dev/null +++ b/apps/certimate/data.yml @@ -0,0 +1,16 @@ +additionalProperties: + key: certimate + name: Certimate + tags: + - WebSite + - Tool + - Middleware + - Local + shortDescZh: SSL证书管理工具 + shortDescEn: SSL Certificate Management Tool + type: website + crossVersionUpdate: true + limit: 0 + website: https://docs.certimate.me/ + github: https://github.com/usual2970/certimate/ + document: https://docs.certimate.me/docs/intro/ diff --git a/apps/certimate/logo.png b/apps/certimate/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e95ace5ca795543a199e2b9607c7ec5d68e96fb2 GIT binary patch literal 17936 zcmV+rM(??aP){QRb~A@@b~AOy9_YHKFo}OONt_zORlN8n``dU_nW3xmSu**%z*hT30qWV z29&bCmT9SNsJWK8ucW2q8m4H92(y4}1H;_qoX_tM5LsrQd(Y?Gd)}{qf|+~I^CkzL z_kGTD&Jk4w5rx>r5^ozivOJ!3%6%6VqRvoJ9jYS3pgL3`Lj^hnz#stzDliB@0>BUe zv5o(`xl#b}t-h84uy(7jtpeZySPdX8z&Zum0IXAyRpRR^h^!LmDpgsj;;(WPEt#0V zY~aAoD|M7bj@07Ql+Rh4Jr-WcC;#sIQ|_&NrHF#?QMV3Z2VMNw`YvoBPz zOcX5wEK|XU@UcW4`4G@Wj`)k?e*8n!FIjG#lPIcK0EqHwqPXolRBSK6&W`FXfU}E2 zcLuNvfSmyhFivP~J%D!rybF0dWu6owthzcDG08wvUEb;W9 z%3VeL{Q%j|2lf+SUkC3{9l;9q|G`QQ6XUgAnM9Qann0g z>@L7TzK_p};6MPoW5eb;3Xd#+1q%Gr5xk(lKN6+Q3wR2FsBs6lE*`6fIN64oEra!vr`EkmCUC4M418kqIA=R{{S~ z6?rsSI^a1>f3Mv-6j4xE0I2AtYb*AGIwuJ9SOpFPFTJCVt%u@Sg+3}O4<}|dy>1_{bAzcScsef=&sh0s30v;;9&?JOqLFKl&b?&Y*+xOI9xeqL?+{% zs;Z{~I1aq_o^op)6pskx{r51Bo;j=3-9c zGV4G@J;ee*;Ww?kER%K4P;tHl=&=A?>qtZ$$O8JP0Dp+D*L!ed%hpdY7tH>S6MNNO>vkNGUSO6$gQqxB7Ccgi_P`wbq4%T^y za-dNZcdDbmPSiEOW*vs;V=Mqj)Pm{ZT_Elih!)K z0Faq<&FJw^??MQ^0brPQ9-;uXD)0wK_2==1=2xx5P&BasP_QPAOQsWR&Q_IgiQrJ{ zI7HSI@|=kNB9SV)8*>(>tn*NGumDgX+NPCn7xUdq6!?ZH%B}Mdg^d6$3j8wbc|RXG zds(A(9x8q;0F+mmsiQyR``*O@oDZPHIuB6+NJDU+1DzeKYkuB33>7aH0Lr}?;-p(E z&jfTbfJ3a~5EUwgJSXsHC(2sx#dP(p^H6bN0ifKOG%lG*ww|wwS^(p$;}8`OeM>~@ z;;FJbxKDs`g$026Z(4a-%5%Re&>BF-SjQnMRsuAu$p0m>?bl=W%2n2RsIajBP~S}% zJ3Q@VCIk2mfFag#h$3VaAafG&#Pzsl(MszuRG3%*sQ0cMGa{YNPQiwWzsx!gQG~4l zFel;1XY&!o)LSe7)N@yk8IjI--+}7o;3s~fFj*^#ThgBXgpVhto?-!@?tObyX?mdh zZK!@1ocM{tY%LTwCgSO9aP5lK)?p~zSOBPVGxkhmT9;o4;A#abtm6<-k9`D@xd4gis=BxTE`)xK2m%jj{G3LsOdI7l9;x}0zg|xRac!P zqICc!SZ5)koO#U`OfIQwdcrygg$D}&0RYl9RTBW63E*VwEJTzy52~Y=CucUlYaN8_ zu>eF|+qClSVxId$02cyqjN=ed{-vO}J`wYNjO&)QT8AM!EC5k;vBXnl6_*HbHGsj^ zafm2b3M>ckqvQw8KjZ#@Xkr0~p!Vv@V;sR8@H{^ess76mcXF(L=`+?*C|E225t5ox z`6&_1g5WgkEJPG43Sh1ubElSEyW|7wFcb_HfGC(Dv2<%i4S=fv46u$vL?NYUQ%8P~ zENz;N>6*2UL;1x5P~~AH$$<%brvEj7_SQC>+$-=7p;R({;&WPt0`j#q}}W^ zs9p&mZXJh+3QkrOKaV@O5_L`Mtiw?5u>cgIY|VCu`|y4V$ZpnIh^XNGR|OX*>zW?3 z4nn!b0#Hn*j2)hKGWFPSO}`kYA)?};s<(-MJuhtP;RgQ6p2)AzB^APC`A$0#GPsh?8!un2HS#@8Na* zL=-k@K)#puL@Itz7; z&wmfObalm9u6VC-@+YD~pukbCmwh8$TlppHEYvlw0EE@F^0Kt&{1lK2tfLSS_0cVf z_5NktAQ(<803npBF5gwe{WE|)tg{di^^d*DK_xF+#I^HrFuo^=>v0SJdH z$Bf9Nvwu+FIO`}xMENAZQz^k0OY53itg}QN3xKgq^{9PSoIeBD(K-teQ9u@pFK5SR zHU85&NR)98fT2uv#rZ1EJaFL?pK- z{Mf~qwRpXClBi(;2w2nub>A@M@S@y{4Ev!%&8NR+Su1SmbFY7aR2 z7XUk0XCWdAnI)ona=fAWRqG&8!94&0N!3;!3rFXHlRptrM@Fm2Q|+~tM_UJp3KoC> zWU8w!6vbZw46)8aL=<8}9mT_$n#ylj2Z;g}fP4~>bZylSRP(*%ij4vl>U&RQ zr&b(louyc?0OUZbw(<*(;z0mq)>(*%ir5g}lSfiD6?}4P4zK|9Q@W<&Tv6N&V1RWN zBBG)v7$}ej(zO+5SVt*zECBtGs;RsTklVp){E3Kyl!VHk(zR6+t%DRY7JxoVRaevq za6JItsDg+ncyXxyK2u%!RqG&yiUpt#(zR97M5N9-2N6-kxhl9hRa<$vb&x{D0?~rH5FG`2Prfx0KJf|t-6|%KM_$_Y6*%Gp!$9597II)G1>aJ)6%t7SKDMMJS+e`kglnk0pJSj97IIa4b|_bYbyEgbr0}a z0NqGcSJZIB9}!VuQPt{XL-Q=_9AU-+(1lcW#S{@~u+Bk5M7^dWxHw+d^egKiVZ{Q_ ziBwJHWgD;aCnBQ4WcFq@>_6^1QAi8%c$V2WL?t()dI3^a5sRMbrvEb%89i4{%OfsEq}8P5+*DFn`y7EI?56KD}WN~EJQ? zoD*a9OP{fh5*91~8)a&$4p8Xh;3IvBh>F!}aonThGnf3!I!G9>003yOt=!2~Jg-27 zbrvEb${z)m!}mX%oYnGj+?lA8cCwN+nH)myA{5D}3%706fO^^L!^ z4idD;6@d2Isv{lMhXEw4vk(zcC}dP{QnIe;G3y{fic|qe*HldabRK}A)>(*%C{)(K z$6<+CO|M%A2})%40JKdmuLAV1;N(w4MB5q+2lua=I;zq-NKm3t049w~#$5Ma06SPm zAtIvC+A;1s_h81JkvK&hi2{&HwEhghfz~;Qh$!?9PPKk?gLQ}?6#X86Oijg?6>^(( z4k98d9HRJIyrHS6uNEun0+6X5wXcdZ55NHHEJQ?9P};?JJ{O<0^d;*c`BJ>60H%x` zuHxJcPX0th)O#f={@thWzz7%Hxm?2Ku$^IU|PS#O~h^Rmbw$H%(BPNP#9VH)% zvH+x8M_mKx@zyzrh^VkBa7=ppimR=2b&y;sngWpaoSy<1Z=HjPh>F%8sS@XU>kzq86sG_-p7+1YItP&@8Bzrd z-ySl2EM(YN$k6S8(vgrs!+?Rqfq}yyu>_D92)OYr-|S_8bQ?6A2HI8vZ7ZPbRsw66 zLsu<@u3QXVu^3qK0d#ev%^#2`EENBfXlVMAb&UQh_yVwg+L$q}mwgq$aO*5YfpB7w zs@);m?+d4D!iHa0?GBU#boQ%#4Ycu1Xycpk8y7%7cp2Kb0PwwF#wW73%8$8wmt4E# z1M49DQP>4whB%qliboYV+BynR-nel%J01YpkR z!hd%j^t~4WKWm+eC~p+{O!9-4qcK+tw)qxx0Z7+Yeiw?LSmz+hH7OefnecfyqJC3ry^66b&Yk_Ir^$#3qWS-=+CI{Jr5uf zk8Pv~7&sKpgwMm->kDwk9|bru>qNPsK6KGb@LzoZ{ww!ETU)FX5#>roAcw~58(*{z z(ieqU0BS1-rB&wxvYT}jqJD8)IOC6jbMSd^#vcPXMR~{3Pxx8*Z$1Y9g*)KC^(6NV zP~j82nJ9Jl$Mhv_)=_$^AU|THe9RW%&K@T~ zS2x1{$M4`j|686Spu(ltJ=N+rB!O>PN9nDCTLDPdRGbdTJ=Qsh`a(v23eI6)g?rF> zK)l2{PB?fO_^;dx@5!G*o8GccL)0g#I4#-GbiZ|u-YBR7&^E1nyO`&`24IAB7NXve zF?+#1e(Hv0e&J&(I;0AJ!6WbmsNCESy)gtOn-fE3Lgw}YiV{1^WO@1bjWZKQ`TvSy7N&c zt9uN(zPZ^tNOub2qe(iOm<>+;6mrhE!x5kQ9Ng1>$jLvK5(D9Wz6SA{C*kaTh;}X<)_vmdLr~I0PWRPM>(R81K5IgyMa1J_;=lSzZ75=~OLiWC^HaxV5 zD7569M15nZA5s_Y0x)Crz;vtk8i1XxqY!n(+5K3!6K6rnMp;LR6kXE{Z|-FH|9QeX z3Q=d867l2&T(c;&O*Pb~0Mcvy8Q|nkVH8WkJ^e?Bef4%u{sv@l1!7Rxoa`F!msT_~^cm4`zpVO?P5N*xz zMQ*~y63V$Olm#HYwxSjypRvwCw22dgd-C@XJNFkrVxV;z+FEiDV&~no;gom<|z{=#RF{q03S`x@&g zL>nmD{J6V&$+b&9u#U31(5(Q7gW2HZPaz@0w@3Wa2RZo{5NF)sh+p~uWY`$%C`20w z20GbngLRCpg=z&LRa0@CKpwHqK?DFYcAt&A{L8JQP#@@;W@LYT9-k*bp`p+dlJ(6G zTj%&#cvb*r?3oatAnu+-#ZPuR2=R;W( z(rZ7O49ITQIf$HH4n_Q;-}839#UMEdv9H|@XV)XGlMn&Ggj89@rPd)n7K&2Hv_SRbri~_Y#Q0$eiimsP$*UaVxId$ zaPlW(&bY%7JO5Xl{EJa6f!Kw&!Wn=yAng*drlN}F0 z{Of-Nl7pm(Fy9(?SZnAK#uL)Cr-K%@?w{K=4v{`7`({+#@a zUwi=KU%d^o-5%CSDB4`OGSfPQX#q&pR-LTCah4e<+GI!-Vqd+D8~&oCWH4eE{SGp8 zJL@DAWvVBnYATMmj9^y)CW@N5UMKNCukH6gR6@;s}-Z8ibU z*r_Dly8dkdV}l=@2yjpS9^9isb2)DQ_#SlShtOs3Zn!sodn>fP6-c)MsdXD(lNGf7vnY`++YNITrh*>WWa%N*+V*XMaPlV; z&R(a$J@VVuF>)`n9{&3;LjU^$wE1o5vUfL3{MmHhju%U8C<5g>Ln?NKeCl90J01wc zOLCjrn0w6S(8aI7|95Ea&`Qy=Ln_hwjikYyaD!g~m{wkv@!WS57!~ZmM1YLi1@X)N z1|*B%wiBw*MK8gB`)T;^&Vw$R-}lMBr(y{>JM0hHZ(~4$i)3!a4ANA>})pX6Y~e@HJ$9dNSZ;tfNpADZZCzX!>!GLk3#_ zYDSMt!}~7)UUNl(b5FSn?va;R$LO1E8vgt{;r;XX8$RiWknDH>+ynm?&VJ_rZfKr& z(ktHMH^6)78tWJoO{){}m&4#5@lER(y_Z=J@7Z4> zbIn1>-dP>m$sYjp{TGp)I|Z4a90>2Zn}JNbb);T%kGd4{se`R!P&5rmXVRAkIbd)r z09TF~kxpmd0}B8JEjbAB>ZdmBYA+P&Hh9n74DXqnfVCf4r|AFgA6@+SlC30D-<=GsHx&%e_;PLIim9pD~cYaN54X-GPozAUK0f>{BWGIn^{$-D=Ex80&Z z$@cpqe(8gN6aL3d=tqm--FqecHy^i-k{8Z|1$*m^5N=IuTz4U}$~^BHEI3$c2cVd98JfuB}^v>>s~V)DwS4 zoC(Jv_CIrgfy1n$bSZmh4g7!HVI6~_XJul&zddejS)0#6^1cF)PA0wuPW}|M0YeZw zeyVkfF6jp^BXh&?k(>O1jjI6-M?>HLr*)JrxhG!12L_RaVW|PmSMohbeha{)aY?8K zvXnuzIrsC`z@XvQF*@Zv`%7eg_66vQ#nw^G=;}sfetssrdAC?c>6Da?gnMkDS7s3b z00fwfiIUfIPdS?zs}) zecuo5z5w^Iukn%5WMQZD_LXPkbAbF6fQjNNP?NXg6LrEpZVC`fSjX6w?;(3vExbqS zt&@a~_w28b{nKUPEJd*-++zZ}GK*+4n%DD~c`E=Lo6ER-9iONpGGa$K`%kovv8`+h z+24GH8_K%izcd%w-(Cb{1Ai)Nx158{EvS1*P|-LbTQlmgd>uTGrvP+H{*F!5G56TX z;kysL?;(4~H{maM#5zgn`TzbKvcJ0o@IC7&TXN%YkKtYb3Z4(AI$y`mO99B#Y_}hP z&*tOUM4germ2f_Drge-hsUmy#RQPW^WSyj7_^i?JzyAi_6LYL%6fE!2S@2)D-8#k= z+(Rw|5(BMcP{fGpg_u-Tp6lc0ya2>}_Ywdh+=5NT%-Qc8V89UT7@O$gSCGB$`_?fE zUiRMq2VL^Ib&O98913SYe!ii=4M->aZ{_-+xh(*b#w8W_Moy1O)C2B8=UPYj#QN39 z-f=PDWvr7FzHA!V+rAF8udzG+y+M3M7l3Zkya z*nJ?QKW!ajlkD6n(2o{b$0!>5(fi2WnYWG5y(VM#4%N>aMS}tr>9xyqy30AI1wbL+ z%;oWjdcr;UJnIOX_<#Qm{MY|t9i!;@uRai}{Q#j_aiYjjAg6O|&I&-frfPx+4$al^ zhDtOYb9KC& z6#x}nnyX_G^^~*Q(V=--n|J?oVEt=Tkt|L;Bz|CM{KV-!7q{+;mOdCocp0KnP%H0uZyK`J;OwUvW% zajcvafQ;|{4}frd45R3XCE@IToOKGo%OHDqZD^lnS8Tj{t_;N$7S5h0g!7?ORP2Uk zd^sl<2g*qSP{mhsaU7!FaCSKqC@Hg!0sqB6LR;Rkju9E!{5JggcUi{(N(RIE6z_OW z!Slt>$t@}ST>w(m<+}nnCGk z=TcKf?b6@l^t%9vI9~%G{XGs*Z#m=X$yVn@ixooqv>&wKqF@*cmzeBXssjDrjxYnp)~>noTj zZhsEYuL6)-Q*i=-s{R~{&vy=U{6aU3OSx1OG|0VnX2F{KLT1TLW67Am#eBTSewDK}2PU+9! zM13VY9bg-vZ590g*nj$rI{)7f18pl!GYAU+Sy7zPpL+uIxd3Fm*qIRU!PpeM(h-mm zw&(x-SMCL}Y10e@z{|jY^?uU`GHMrK;4sq+6j_7Pz!&=Z<~|ny1^&0M?18lM(4y623rV*3{Aar!$v!>(As9ntWrBHM!a0Dh*mG}02y)FO= z7iae6eMGq+gDZeo(rkQfc?Y_t$!vV;n67TLy(M#e0Ax^~PQw!Af}2Tdub++H`-xoS z%wE5TC|8D!F&$pt|EKBr)H!|cMcV+wx3?XiB287#>g{`aR{*XYGeUtQdpihGu88qJ zvV81scxlT*)A9LC0J0^=;=4Qa>V_1(Dgc>`cPhC1pA5+m+ec5Z0ECzIe;XM(+H`!1 zym%(l-mAOw_NoA=uc!4c4^fT{8g4qg^&~@`)8+5l1~C5FBvPPP`v7`g049w~Lcp8< zkSWuRR$d0Wa_;83%n zb>(8f%b1N%-S9Hdl}qf#=kox_UTG@X`njIIxaTVX;-B27I7B%lh6MoY*Vv6sJ=1RY z-$+;hC;+)Qz6K)788>b>HVZ)LnU=Iz!ftG$Pkbs}GrC7lOzYVSfI27i zD-KbvSpFkx`RS5+#Ak|VnMZs!GH(ulzT_Q`b|A|fIR#D17oUe?(+J1qdIc;YYsZeAi0 z5fM?o#ZsPgaA)7_v;c@G@BT+bL{z{8&S9N>uk!)`bbA*eA|fIRG1XqK08A8Df&KFq zh=_=Y@=tIeW_0|ZiVnY+-eJ@p06N_`Ktx1D1z~8qwQ_t%-{`Oa2;`vr<{=^?qWsZK zzmiT)19Vsbd>I)}<$G{l#rp0M!3XAaRI@h$tB9?Ys4t zwkZIV0Kol$hL_|bIM6vCM`z;H=L~#LpI;cQIL_`#by|%t1;1<70 zjUBl&fB}I05m8a{yC?v{0zgDWRGd0n0obrRaJQi25D^hkAa;kyrl$mLDgYaI z2l5I4A|j&VRJwlZ=+PhlW>WzWU}u{=L_|as1o6FHKK}Kl0^s;M&L$2K5fKH!Ro%7# zKpd_B5D^g-G2Lvne^UX_%~}Bw5fK%m4p#uc0zgDWRMcdv0w5w#>|~aQh=_=Su+=Gm z>g`5AFwiUx5fKpup$y;MVHmKn0Aw6&Z<~jRh=_ua&bE&QHWmO?Z>((`A|fIRg2LIX z06YkL2v>V)w_x$HW6=+=sUAr9cv-!In6o-g_I1gK>YGYdiSQxdiZZW1^<e_B;u(3vLF)>Hft;QKyRR9T&rY^?vIlRJ{B|S##1^KWM}#aPp@-k&!zg_NAY3 z@+ayk5yU3Wh79NZ*(h(Ebt^}WaAM-{{6FQ5d%_h!f_IrF>XqamxF>$sIt3N6cpMdu z?@GCK5GqbGVh1>TpK2Y0s31A}oDLZ_#ySQSDc_fJN7NZ=9fXRLv&RWNzrLS{wj=^) z&l9avP?2(=Lmlz`Vb(#YILS^2T1Ox%XtL8m))A;kiO4WVMOXkRFJv&UE+y&@8C+o< zfr^x`I@AF$#5xESsewGZMAR>XhFd3~A|)b29EI>-X(A$`2odNoN1$8*AR;1)5QPkN z0F+t>AtEB804Yix0eF`dA|j$_8Q>^TIL~7xA|j%GQ|JH(Tmc{=B8n6d8R!7Q0zgDW z6eWUz4xl^*Ktx0oC5i!#3QDYV5D^hka0D3Oh$3bkgoucUf}=pp0ayTth=?M_b)ayq zQxFjmQJ`WDgav?zh$v!Q2VempA|i^I7z+Rq5mEHGj&%YeA|eW&1HiKmK}1AEf$~@Y zh=_=yC+k320Emc)BF1wdEC57AL=lsX0mxdXAfkY@t%R;y0i@PJ+t&a9q+~FV90VCO z0vI^dI3N)P#EYpQD{7sCh;mI^TcGdEga6;>p-UG)m%R(Lt?c?ugN8%OcZO6=fV1;w zAv+%mDJu^qFcAetfNV?@?bbnvC^vLX6a1I&fj|Fl=+ZZOe}Hu>pzBsZ-+vMQ^S=cE z$mmbQ+3##P`%kZ9<1AoCIfS=oKJ-Xy|cuQV~ z_u$oV_B;{pQQv`#-8-ja5K+Jc>tlenS?3_4zR`^nv%m1!{14`P@Lzin{%a4y+4V@c zr+go>-5&WLmxyvt(G~;10zgz~)~|;5NIkrHx8(d2e^2;tKLvmGGjR4h8?jSo00V~w zo`Hz^PF33+0oGdwA)=o1-~Br>^+&>c_E#p8|0e3ge`zi<4M#)Yd%-RT5%rot);r1- z0HVU6KDaTVLTmc{oBk!SW;J@)#>ll6Jzj7bEM`u~b zAfgU9Dl54MfGC9gHy?xd)Q#3L`ptWERza>{5EVOxu69)YZk`T8L_yNl7G(c$X>nXq zr~ZaN%eocTNr-4OK4g{SIJ(R_2oZh4yYDKXt%w%p)_#QSgEOpC5Yc8F2hC0@B|%^G5_CxgMRp$b&R~x4`1VkK%x*3U^(Wh=WP59PXiDc z^B%w6Izry@vOpqx3bX*g#|5CpHV#p=>4&dD7r$y9Bky$4OVGvz)-i}8?c)#q4gjbk zJdYM5iXi{RKUhZyjQ`SH>j*@VrjSNpV*voL*f0xGwE0@?We6H1kQi!DeDMC zk>$hrqyRYZSpbNPXasMNqwmbKjzAPy;%s&bATDth03suP9??y6{bnlw!U8}PwDvXD3GDC` z08#LKY+C?CeXhq51x(vpts|JxD3>21BjRA&Qvg0!0EmL;xYh~Gh!eApKomJ%M|%Ji z;0gdyz$9K`9l=gwpmhSG$Wh1L_7p%#Y4aig>rE07Mb&_z)(Pwk7;K$@C~DRYn7L%h z$G`bx6X1090pZ;_hyo--M_WfQBg4j6M<9xt1yI$Gf8%WVJ>`SCiGnnItaSo2GL!{? zC|Fz0@mm!DumBJRNJ>XS23J_e2%HQZ4GfI%=?@|UDoz&#K)`2o5(P}g>}4Gxa58ou z>j*?q)Oi6=-;3T;Nr;Tejt5#t2%PMAfOQ0-$kDD&0VEeMf0qvhA_|r>{%Gq6fpf+m zV;zAgYSwPN+HaFBPXWwT4}#YNjYJf2QZ*q`JK|-;j*yCR)-i}8MIoU+qWqI9leN%^2^zOA|PTNBmcyKv;P;ZQxHXu z;+3txv`qm3R{)3tCnG-vXZPc*W8|Il>60K4zV`u<8Q1N;0L0U!uK~ye5{QU4agV;# zIzryLM}FHn0#OvDN{Qm01E(-75DQskjmYxW8{ofO@MpMW!5o> zB1^^T`3gXyw0Qx5HF-@$L>-GI5Ig_ZKuMW(lKx8$LhRgM6z6FTqQbB$(XjNbj=s@h z0l;+i1$Z&9k%*{MGHMsZ&aNx$djp6d_Qe~DYBhtX;E22cRqg0o9TxxqD(G;@fQW+O z>~lKY6TfR6qtD!vzYk}xQ>*vJDwrf%rG?f^*P$)=`M)V~VG{`gWHEK%p!EL?I$Oe-`oTr{H}0 zWa}uKID4Ifc=eNzoer{&LPVRuVkeBq^|K8OLx-0;gwRi;}ujVuo5#@xl*C~kCJ`4Aht01K# z0~=S$M#25Ubi}7V3un(00~?o!dSyOluUysD3u4_L!+#VIKEjJAjN&D5kGur#pe;c%ML0*QE?e>8C+4JG-|3x5Pl9w@vC`Sa3cK4F5R{#L0NVf+eB4hCZ8#W16 zKLPiMZ|3~)?va-uKIL&ZpS^&SKT!d2yzb}jZVN!Nbii`}*5@P<5#?XW;5;0&2%bwo z6dmhg+0t(B=G$!n!1VXp1?conLPSJF6e>?*&cal8FY3Mk0PuMlfQX2wAZQQH{{uZN z00Moee{qP2h$s+_`*4q5){_?{>YCmF@Ls@?h=}rSO-bp<9$&TB z;{t#=3sX=$)~85BL`0Ntf5Y@Q(mj1~&kFzmf%N#?0ud1r1xWRQ-n_h51t9LX-wU9} z?ShDihysyLBuaXxe?#F{G0GQLb3?jTK z5D^iPCB;LSwRlBe-rBbU06^6LeP7>8L_|b6@rS;?vCjn{F7jsp>-zeBA|fK{mvsrJ z=MVqcTAvF5>YCO8eIJ;Jh=}?_{=9K6?vuV3001g-dw9V=%AAW`4AKq2#Tbvz;>BKm{?PbFqG z{ySI4%UJ;c0D=F1xjY^b5fN>mik!}|IV}K*^x(Txuq>CyBqAb;Isuv!gGb(z%VXxW z0AS9-lt8!&Ktx28L#p}h=_=akA4^* zT>i&=j*!;^fSWXl^=UEx!c-Kr-gv1Yl*p#~~sjDiSM_>-}Hn zdyu>r09?1M6_B6ieHZ7&cf`KfqY;NrT_p)c&P?(6@Z9{s57e*UOKRi^MMtBjg98# zfsIE*L{vyrX9xA^9|*Dl07xWavjD6Ka!ev3q5`lo;iqp1a=<_f0Dkh}M^NS60f~r+ zHYcbH^3y*MbO8X6Xx9b-nu8vfh=?eR1ZYV(Uf>($11|u$v1P3!Jh)yD88uaHUO_$jZZ{G zWbBpr;+Ef84Q^HdFjqZaWwP1$L_|b}9A7TST=mSxw;C7#N*WrUgyJ5{3`9gk2Ij_Q zH9l<_z_b7WfGTPLv|HyOA|eV%yYI;~>k#GzAUUh)zfc5v_ah=AA~S-9lG%;#TgNaj z005APc|QiwXq|(Ih$zpNB-;E?+zTfZ1pwDAYZb-!tYZ)n5#^QY6}Yiwt#u3_ECm2S zd~ow`0K90OgNTSIPyUgZWp~-%) z1d$omIf#geazO>(A24hA66+jW3ta&KfJ9l-ECBPZa}W^`_0x;VMa@684$+ZN7644w ztf+nsK*l->5fM=zWkvmqE${c=m2egS0P%+ASD~0?or8#os80mf#T!~)wvN%6&=vpy zNMy>U1Ne`14k99=-jTNxr2~FsouVtDE&!ObFy;92P4M0TL_}0L)EE60roR{J2i=9c z004;1YJ6H1w^-*OA|mPuh1^t9*Yt#Sj_!oM002NTo~{NEx=SdCh={h*nDp91cg=rC z3Zeku+7+t-x!gJi^-_55cu7>4eBU|&^_J+jF?;1I>li&z7zF@8qQ3DiDDJV&LA|hU zxpe}ff~ISiSx2B=(Yq3L%>^@06-)sDfUNI*TLI201wvOXwT?hk*!Xv-ULJ$ z9KBIc1z_OpWsQKG4_*~e5d62Fv5r7g(ENq`J5(Ul7hE*x`sQZqAiYsg1pok&^^Fgy z;Fs1psC)jKj{@10bqu1yluf~Z^D*lb)B_6rMY68x0qY#SRd59W0FtHd6z~Q?;kWi9 zc=K+xPC-8hpho|t1DgSwXz@xO%WOA7K4_Jvsh0K{i5`4>d4vd%%>Xj_Twtrq~9_0~y<3PWc7 zhQBjy1#u-=q^ata@tG~JSm)@gf-L|5kSJ}c6Cm_=TZ%ee@;WmAcQ$lQLG6zr3Y@NK z-tc#2$?Mips2c)2njGA6y>*WM5H0YVwXB~qatkY2UR(k60J)mL9V(TFNQSb!-0Ma!TX99A!bq?wosTc=m z@6+InKN=XmJ*0G`btIy|Y3njzDW0RVt> zP30{BzG9t&h=_`p0>4bwH(hLm2z| zlm!6O)lc||^8ozUItmdH6|6;ZxL?9t^{j*BLva=W0GPFSg{YnhMM2)9nTUu?wF{iH zP`_lkb&z~1-U0w1-q8Fipha=LCJ_+@M?@}(*DsxKog<%$x&Qz`qM`W?h5Vm&4k98d z45Ij1ysok6pJiV31pok&>C(#qykMP!h=@Y(@A1JStF1!>p=fRe+?{n(M^(ms=Xn4- zT4y05qELD-EjYNeuBpX3NDv}Z001C8dAr@=`ttw`v(7?9M4_@8g2NJZO>bBS2}&eR z0embmd+D2wFJ}NqS!W?4qR`0rinF3L`2!Iv000o1)%Y|vJT)*nOCLl;)EO1ki%J@r z9=8q>w8#|z07%p~{Q)9Hd1oggBI*Uz>G6i<+pJ?)h}0f{Er>|Ert&vXJ>NPC5fPdA zL!zPiTtsvtjN}Rc06-#Tw$4ICM0vAH9RI|U`lXAkgMf=--q3uTs!X!ZK}1Boq5`=zUf*=Hb&xP)0q91u zq47o)Ot#KJL_|F#^4)lSbRP!P z2kF|XX;8h^ItLLEbwF`lqM_*u>llTCD*(N)p;gK>0BlV}L}8+O6(|4R;R-+>WNIqD zsgN7N0!2h*O%<4&tZ%x(I!K{m0qCQ2O~tu@{02bGItvj|M0q0e^>|(5t=2&b5eq;+ zq-!frgW^vBlGa&>h$1Ep$hnF7#=ES86e<>geo9qWog|`n0T^JNg@`C3QV@JGQP*^z zb&x{F0+0jQDOE@Kjy?dO%sLAZQIT7xg42_AO^;azDRe9VIg*`Paj5UhUjPiT&O$^~ zq*ghiC&lWTpSKQD47iIuM`AOZ=ZWJUEkLt%79ye|)FkR3&B;G^SO9V;K6A;xJWmb= zu)sPC5m6EOw-4vwctgv})58orT#eS6OE% zHe3P7huJGv#mh#X0Fm3QqYx1lF8xisY~+cY{PTk=0Qn>$>6*%^P`w6#SjQnEDi8{h zs}uE2Gr&nIZ&&~Vkgl%$A_TtyP-2~hh$!UJ0=+0+-+a4ukYdLI5RmrT%A*~{-2jGK zXCWdAsg=ISnI(0NPgw_v0v3P(rKXM=C%*F+0OPE)5D|sUd+?l-6SJ4TX&odgxCt;o z$(bz+Gmd{afETQ@5D|sQ-_wGFIr#^R1t4I9X0|jX%9=k1#dX$Mh={By@XJKm$fHW@ znp&*0L=8^?7)n=HoCnBF5Dc`=LPQj>c2Rsg-q3W5b&#lH0Wg-CI%*&Fox1^i$~p@X zQ6Ll_h{)OT`o>q15K%Ewi2N{7)^ZAFEnZ-|Gi@oVcWL_~e1ieDuJ z`*ZRSC$0d5T)MX645<7HzzFLsL_|Hb3W9GX>YDy&9fUf^0#E?fU0zWUkKtB8PPEQK zMAQ`l9?$yO3kJ+uzQj5Ub&Um}P|Oe~wYIWaRDT2@VI7BvXe%j&{=Z~H%Pc;^w=l2( z6qs~v<(^Rd9^4>EL}4L#Q+)s2ctgv})={YExCyYpBSg~CF`0Vu+Bn#!xex6maK1nIOF)A0dT){ z79xrek-M`Q{WK^4!p0SVB9X4HI!7J7Q55CYS%|1;H39OSM1A93)id<&u=+CHnH$kz#brvEj z6!Nk_z8o62N7J!IbcX>rcEGAbA z@HGIgbsi$hyLJc~62LX6Yg%U=hU~Ba5C9-uGkQG4yBdmftg{eN-aP0FCY97Ry=NVS z?6CmQ7E)6yJ}Jb!JLoQScjo-V*#L^n^s5|z0P4NT!-l3~C6`0>GH^wJ$kIwcuTR7> zH{jY8tF6OOVPOHFzMDL3Xxd3!29ZeshFixWija?>dP5?fnZt>n`icdB`ft*>WG24m ziz>Jhkln1~5EZc|h}@KLQ?ohoQ-84lQ0`0=H@$u38Gu#;IM_N4Q4#sKK!5C{xM8&^;I(QY%&=)-~77++5vtW_Etx z4iZ?DwC4Dmo%y_ObDH<*;WH1<{2rDAN$ehxvB==dU~JC5(YF&_tmPWh0FbiEubXyj zV!Yt+97cWY9+5GifU(_RV|v4>uGleBy)*#i`siqFE->=EVQU>)V&{ld8iPJJd#hLs zZ#Hb{>xduYrDSVn^U0&JW281|07!hDt@XuoVP&xJtYJ$4i=8A=2JXh! zN$_{l6YD-=eeY20AgOH{08&wgUuvC^O2RX^uLf?3-6L`h^y0kl9^TGwI^7*RM&wT# z08*JcEy)kIEH!KuumWg|og^{}gJ7RH;l1pH(|h$QUa3SH08;rnTk8vhr4_)_z(YVL za*@bCDFC12e30?<4mR}+#|{#?5)A+uTV8FOTFe)p#Ox`D2Y^)UB&lg52Kz8ROqbHz z*wph|>>!c$daSi8HZ-M6QMgfK-PU zCpQ&SnMWO#gDnFl#!ix|at>n`!FOcR#ZUDj9;pTz08)KcT59B`+&#gQM@U$Xb9?M0 z8Iz7X?7`TXZEW79LwcmzXaGpnD|EEZaVtG+uoUNhpdogXRHXC3R}Q=J(r4L?{XfMH z5-BGQ0I4mV^D-CDpIMZ+FU44fb0>O`uvV3TZ!x||O18Uh($oX`l`pkK13+rq+Lp$A zeX`K7d(C~Z!xA7HJ4?!<1bk=CH;(Pkc->w-wJ)_y13=_*Yg-!g4YtTavKaS;7z=<& zv9si=41jfE9CUnt77noC)P>klB9%e|K;%j~Eh!96n`6d;;J(n{ZeT8uj-4idQ3MXV z(Uk-{=)t-&TYmWgUEoCil?H&wXsxz%p<&u>W???qe2jL7yMQUN(`v+d;770{jvq=9 z4%LP1A)UM@GCCRnBG<^!%em>PkZQ-73$)|RHRBFoLhQEkbIR}%$2@Qh<1p9}0*7&q zWG0k#aJ#;dRs7j4(T8KFgiiBsLrOS->o6VjNu2Ip8>WH(0m9v65N0 zC#ml7ulM%q7QRUNXaI=B^vcZ1g?zrvjhP8P!_C^jW*9!*;Rb`8Lk>t{r;buE=y&Kh z=yU8Oc#q*d!R>@OKW9AO!{)OCu|q{_l?H%FrCVvK3peL->5(KCQsff1DTX%%_a;lM z$=sV9Yr?5FV?w~j89ts%2Oed(^e=|X2gEpF{NKK17`S-Z=K%c9r8nGNaQC6aEbq=B z#*pCyZZ_b-2a?3jdhmge*x95+f3Ys~H#GF0)@^!`%Jv6^+>KX#@Nl^R0000