From a266e36a4d6afb33cc61600a5fd3fe24d10176b5 Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Tue, 14 Jul 2026 13:37:16 -0600 Subject: [PATCH] feat: add CertMate template Co-Authored-By: Claude Fable 5 --- blueprints/certmate/docker-compose.yml | 33 +++++++++++++++++++++++++ blueprints/certmate/instructions.md | 13 ++++++++++ blueprints/certmate/logo.png | Bin 0 -> 47464 bytes blueprints/certmate/meta.json | 18 ++++++++++++++ blueprints/certmate/template.toml | 20 +++++++++++++++ 5 files changed, 84 insertions(+) create mode 100644 blueprints/certmate/docker-compose.yml create mode 100644 blueprints/certmate/instructions.md create mode 100644 blueprints/certmate/logo.png create mode 100644 blueprints/certmate/meta.json create mode 100644 blueprints/certmate/template.toml diff --git a/blueprints/certmate/docker-compose.yml b/blueprints/certmate/docker-compose.yml new file mode 100644 index 00000000..d7dde9dc --- /dev/null +++ b/blueprints/certmate/docker-compose.yml @@ -0,0 +1,33 @@ +version: "3.8" + +services: + certmate: + image: fabriziosalmi/certmate:2.21.3 + environment: + - FLASK_ENV=production + - SECRET_KEY=${SECRET_KEY} # 🔐 Flask session secret + - API_BEARER_TOKEN=${API_BEARER_TOKEN} # 🔐 API / web UI token + - BEHIND_PROXY=${BEHIND_PROXY} + - CLOUDFLARE_TOKEN=${CLOUDFLARE_TOKEN} + - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL} + - LOG_LEVEL=${LOG_LEVEL} + ports: + - 8000 + volumes: + - certmate_certificates:/app/certificates + - certmate_data:/app/data + - certmate_logs:/app/logs + - certmate_backups:/app/backups + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + +volumes: + certmate_certificates: + certmate_data: + certmate_logs: + certmate_backups: diff --git a/blueprints/certmate/instructions.md b/blueprints/certmate/instructions.md new file mode 100644 index 00000000..6a048e3c --- /dev/null +++ b/blueprints/certmate/instructions.md @@ -0,0 +1,13 @@ +# CertMate + +## Getting started + +1. Deploy the template and open the app domain. +2. Log in with the **API bearer token**: it is auto-generated by the template and stored in the `API_BEARER_TOKEN` environment variable (Dokploy → your service → Environment). The same token authenticates REST API requests (`Authorization: Bearer `). +3. In **Settings**, set your Let's Encrypt email and add credentials for your DNS provider (Cloudflare, Route53, etc.) to issue certificates through DNS-01 challenges. + +## Notes + +- `CLOUDFLARE_TOKEN` can optionally be set as an environment variable instead of configuring it in the UI. +- Certificates, application data and backups are persisted in the `certmate_certificates`, `certmate_data` and `certmate_backups` volumes. +- API documentation is available at `/docs/` (Swagger) and `/redoc/` on your domain. diff --git a/blueprints/certmate/logo.png b/blueprints/certmate/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1a7b34185024bf3d52a8d020f62bf217a695d7d1 GIT binary patch literal 47464 zcmeFZUj1h_P~004kMMfvr6008w_Lxg$-7X|>x0#shheegs%Zo>+spYwYRFkNlu{;Z=%K*22Q8fjst zZI_M`)J1*+q;m9shvbR8j7~HqT~t~5C+2Q9;ND3e!oiQJ9orQc%bAZ$OiEgE)9kn2 zeuLc0l&mGiM8jk%|0&qwusi~2lqQvS>WmCfvb*Z&as9|HeF;C~4G4}t$7 z@c%CYEuf&$6Ftk61$4EI9nz9)DreY}Uz3RIyRuM{*d)HI@}wr0z3}#St-Ht>1E@#J z@T)t!fV|n9A7cw;zA52+%@TU-mK}^Czr)$Beq#|n}8x3fiq4$g~Cc2dEVLf52mA`;puiZ z6=P8I*f72_&h-{c{wvtVdF;+^^5NJ+eZ@zr-L)(tLEe)-f7E=S4?4I3iYq$CfC|FUhgpw&yYlKxREN=vlQXMz6?HQ6!k;buIP|zhDK65Q9I}@dz@J_Jxj`rqts{ykw_f}~ za&H4o9eAJ9p^#Krx5fEGUE$V%UiwRs9K@iYvGzsUv1GRX)VIoA+${;!#mTi*D5anH z_JtUZZvi)jvS?U#i%uFon*6&Cu8ynwpQZs({_s$48jO|rrv(9gFAL^^z%;X89P*Uv zNVR>1b-8MN>?`5E$xxFJwI=JUpsxgN!eNJ%#c>rK9{mfOpld@!PqE;DZ;fQp^%A<8 znI74O=yEhpYA551T&IVp){5QnE5Z1VbJ*B}9(Q3hgX!P7C8{q54elxO4i22#lhQds zbbGmQYWTWpR-%I-MmFeQx7M5~yri2^(*ZD^aY3lSD-BFY*$>fA<0Mp`~gyIsJ zEH6VnszQOmP-xV}n_x#$p3Wys%bgOgdqL8l*|{R?Isgf}(Y7nvD_2N+T~?mr`d{n8@$pT+q6 zlC{zp?CarMAoWP#JK7);3PO!HP>nYOG0-iiebaJ29!y%Zve|hG1zQD?m@lI*K_7G4 ztnMR@vreUIkm(83Q(-T^;u9xPku9j8!-dyW1}@CiI?<64vTi$WSE9Vq+dm&D8*-X# z)YpefMQ`GlS3ctU6_TP;2WznEdPuPVgMSlx-&%1ZKbZTQ5!(dO*4{ETtA!A)P;mX3 z%`ABQv9--zDP(t74CA99PFd`enrS@KB(2zh5-3pse>>-0fi&MSU>3fAAI1vP!RU28 zHXp1h4m>c&C+9Qb`^f`R6yDa2u^mU=pH=s*XC~zYsDHZ0p;tTUd-fD{tep;ZRL|Cv zr3|=F@w;EFgBl^Bzs8H8mzP8@%N*w`)9x8;hg)k)}CJq2_T(ax2}9~_ZJjl_L#i{El-It2h1AOB$1+z z`XXs`k#ch2-2{ddHq872DU=Cj0iMe)8DtHI4@R-U*tR^%C04j7WzWL>#pdU)3he>I zvn%SAwBm67*KU=7{|stA7|>B_@{F-NYS7`o)5YybHcUHg~DRbOn2^4e-8 zw_Q>di>uwqgV&Y)xH&Uii%qrcI0wZsd+>9yd&ZK5sA7+1;#<^u>~DVVOd#@K3gSNr z&}pWx^tUy(Ho94+O>HxWfc7X3R>H!Pgc-y)n}GYNe20FY#mYH9GKPNq4$> zdPCD837)^L0fN*Sw1+)|OJDZ3&F^gE?M9Gif3T3}6{BI`V{@<8)IgkLF;q0ub^4S- z7lCI@&X#psT~*hUmbqS82haJRw^~bnvi~=-JM1aMt0Wg1QGiC@ob5|-ZicK^6h}|C zcsce)Y*hg8y^;9h!=EH<*c{yph0N+?P1P9A!zJiJr_eCpQ0mls{y3E%ac|3|^nr?f z`6s?VK1!3Sbp25ouJHYiNM!DBP0$S?7>tr8gR4PlxfZPT|F97EyU51izWWoQLI5RxEvI$mM*weYfSE^Ct#w+bh zJ@~&Ce_PON@WH0W>m*}@5h+1j+-su3wi-;X^shNlpU73-zI?H}03DZNTv*}oC)fHk z?7Il*47hj34k|z43Y94E_XaXKs=85sJg=g4GZ-*SK9E_yJd8ARcZTFdCX#6i>{4l4 z#Nsc85V!pZ4M!itV-OwFvkEhndKusK@;g(o5g{+rZ=6ILZoDD_UjKv2^z23{mqE^~ z2-ts$u0y;rKl-1WBV^GuzFWPw&6e3Q?#OC5(2nOhSoN4mUeg>r6ZgZ;=_SD`xRu)w z`y8*DG;s#evIQDOiHFn>f3E-D#EZuGIY?Wc_3whFB`Z>G-~df+#PK&z0aI0aF%hz) z3V+@S7AQx$htdf;he+T`2&y7-r!!YIDupJ1gMQmx1W3&0%K{}SD%Q6ad|a2?q=|jb zlUewJRf91FmtieYH+W~MkB&E6VNiubJacE&t6x3KQKs#U=h@sV%(AH_Y8y!;z+3P3 zn(cR1sB8(OxgU(rTM7lA&K8PzrKIMnc7@v1jAWy{ zml9jdx5mfr2&LOBp{(sqyBO6KnC{GJ=Iq)n2qJf72r)OhObQ^@p(d9S>z>;z+PH-I z_0K`Mx0QqRs68pga5Hw*!YN#~m8QN?L0?)5RRJzyGZvPLX$Pz*<|q} zo<=_;`k^`FcusfF@31V?nD+#ao!aA@tEdEhj%R088w)sBPtLp6il&K80&q^+%4ah+ z5eW*aTpxJ{i}+8on9pW6g`tRzhNGvBhdl?cy?gb-X1h9~#0SP{;Ec6~4`s;Xqz-oL z2kmY(^R3r1VXB?gL_tMj7vcdt6hQ1RT`tf~m50DKz->XJp18HF+=2j3_s{&uTqWk< z&2f1?x;&{|e4=A!BBV>7n1FKQ8xa~VGvb~FB9YeA2e`)Jg^rS{i04vu;REV?%qlG7bKBQ}#97))=P60hm+IS7Z${)_ay zA%KqG|9L1Arl7+baW~WUhfX2{Y-lX!V{_j0()uzQOd||mLiLSmsOFeOM26Jl>o^|w zbtUsy)BeU}{hnXf4x1FhiI}Lq6#bbA$x!9%om^0Sz6SpE%68gk-TUy%b{z3O+Oz7hg$n6OTX1i zq~Q8LZ}!{WE(>Gh)X5)5QqF4E>^WjpcTZO78KN9ndjHMfE#u?gHX9bK^gtY`6o7va zug}&HH(}G=Hv-cD8@c&v!=>|j8L4q7W>ctOwEdSTI>U=EJMSB-cu}l$k8x!6DKUfB zQk9anWh^uq57^~&W<+;YV5QCpIflQP603yc18{g^ad(yeZEK=kPC~IP8>Hgjh*I{e zjD(7<%tf8UHrj^)SZy{x?Lgxp{fIO^aqgXzMmM@LcswE@Qa(Y$`7J+$wK%Q74l|Bq zf|wH+7(d)#Ois-b$zJedD(StR9@#Z5C1sA(uk)M<sil^TQo#&fB`Ofnydu8*1$wj%HsZJ)s|m4V~?L z%VpjU1-1lxv(8!M5}`+af-=`Rt>+^z2xWUgrYxq6ja+_G`0qp||Bf(M{u)8TAEcX9 zHcArc;8zKnH1^Br?-qS=E|%&(FWwPb#>IdVr-fi%eN^~e1OelmlM#S|YPy&_b-3PL zlc}Pmy_cP$g~9F!y~No>)@-h3C03iO6vm6ULUb?4Sbo4lUZwH9>N)>qR#Ny?*>9mk zIN-qNy7aF9kCp;RPWS(`FA&gS{C@&l(7IIPZG!FTKg6a&bhE}mSLN9b(+R1Q3hkSi zbT-cKle&Di<)PL{RYYI=$(rWj0m0+yV_r-HlD{m*^c>I1{b&ZL{F?Xk&cKP=Zloik zS~Q3Z_wFQ+&Ofd}UyrtiK$vM=pXv(@tvpGNouBdGM!EOmOBpG4nipE1Vf`|a#QHML z)tmh9yYwbPreEhJmlPR42@yLQ^=nmP&g8d_{^%Y%p5=nR z-(DVD$SiP4Z{@+2^UbmE59l=Qd#&xp5(8B+af0uJ!p1S|3GrtC3Wr7#?9@4=P2UcA zJnlt^r=5n8e)sw>VT=Q`^ZXwMQL zT_XJS9QGHNNW9Mv`l|ppoY(jeGO!HhU?n{|_h(`4eHN3m!p^tHKP!Gn9KUV(K5(^> zoU5I%=o4syRp&RglQTi3keA0li*HLP+yf0;`kR-xumVI~Ys!K6d!O=LLee1PQXAI~ zhu85zAH4f5VQ1!dTUEjDQi4YuG5P%w)|N$@23bne7xPTip+c@lVuN~My%?cGapms< zUfY2yso7y>&HCxv#1dR9nfQ@!yaaKX2OvLYX(x%V9e4t6Oo<$juAc@I)ME~xLmngP z!U?xE%YUZ)I@iE>_TpxJ9nn{;`-#`2mJ;%a(V7k_H^+rERnj#}G%M`&$4yq}NyF_A za39;+Ci9Rb8MooTY-#g*zxp1><6;K@0i>qkT{nuFftzHDUmVNFS)GL3xoo$a~+NxYwQamBF$0hRORiB%~{5z$F|{ z4qr#2c@~Z2vfBW*lFwoBM&{mHiXj7Kl-s+&g_Z0=xDFPp#1f+YpVf$UHCg`D==7QEE^tESdc)>pb~&y{(SjwJc=6(t$|YSQ^+9-|>-o z^@o(!56(?uW^Bnf?;uYf>lYwp0R9OZvuqm5t@nV%-zmv27_xnpB!=lOGz?%)c#xoA zB5+hO14VE0!)T&&digfQix^`^gQ)E^U(-R(NCTne}uZo5-G&DJJ(Q>@w}9k ze|5jCz5YnpIEPydl4opm9O9d#wE945nTHcl!;%V`h^4(|s47#V+Y&g%jg9uS%yJn; zhYiOZ+we`A1!XJ_nJ#ka?egfJGY)YkP)(rOW>P}Yxqzh9GeD6xzxDo!w!K5q0A|4l zrw&m7dfV|T`uED2HG(c{2h;$yTnTIM^Y2Xa#*T9idVW@`_lJYN6vhw0p3|iT3JFoy zP*VSz6o=w(j9RHpnmvMfX zNb#YYLN-UKUK!F*8ofW?^K9(D>d06#(SDw3#FWS<@VjQ8RUb>(t2C3(!nyRrleI6p(GdfCXX)Py&HVzt~;yE*c6*T zfpm|wwflFe{76F+7+5e6m_MlE^m#&I6r8MXW!c2-DNh(KTWBOt^iC8<)|Rq`n^ObvhjyzKaEC*{?6*>V)@jTGS^-T#`loP>HB&F z%D2s7p-BGrM8z>Ma^HnGgHwO8ZiX7+e&Ke{*+s{y z>^fTcBGBrICS9zYLLSRcl@75!jn%`*gQ57` z%SYDsCOl|ma*htiufPA5PB%RQ4Ad-?<8w1o#9ZSKTm$gj?|{eYWexnMl0YuK>~74A zpJL5%fp`>fd`t76+h1%IdU|p4yq4PY+_%pXwxYw#T=}jW+Tr+~6jG`Qq`pF&ckmR98;Z=y^_ z#b$<0$t7*9Mx>YdDQGKCN@xW>i$nM$h(dsWyfD)Kfw6o zD%YSv4gzmLlA7xM+V3-Qe6R#G!7A)N*yKO@Blq3}y_*QaR1qO3As{)=&$oMpk1|RE z^q%zh%&fwQ(L`=*9=1(VUrs7_Z57y@uQ6ARjFh>tFBykn^kXk)qy;?`^RiMNuLGHRpO7t6=7uglKkF)@kJ(H z;H#De?L3Q{h8WavMlChytH-MmpAT~A2eeAmpE74X%}8&nugYyk(F!9}Qr~v}hHz4O znNz3^ml&~RDzm`mNj!OoeSm;3R|4TLwie)hcg_(Cu$Q&Nue*u>F8gR0lSH(zKCFGK zed7jxSD6;64{smy_{vz@-83KnjS}GbpxsWaHb&7N_t&tV|50HUz*$wRiB;O}Q6our zoFtZqzi*fNnxr-Ges+O2vESTayR->!;R1NDJ(fx(eW$6wYIk^yH}bYlDVflJqN-H2 zqv=Y}MXzsI7ysFhPOzAvnN5`G<;;yRo)xN|N^b>Jn)>hj-f3fwB2^fA_kx@l`dTQT zv^FeGjY)CI#+eQy{5(IwhPf{?O3mrJYS(8v%T5+M%Hm;>T=*a_+bSiwU|$ePxEr}+ z(H>5ID;H7yLi|98{ja$Za(K)+F~NzYeGr0#$V-s0z;afvlKiYFNRSwnO8Zh@ymhJy z>{@9=CXrGe%&$E=66Wm7{aygSOKOX=w|p3n=>Gh}teGAi9TO!D%54e?MUQY%{Ouoh zVE>z*mka%Hi45RRsWg;JGzYkE)w@juK3gx;E3l!+;We=oVscpRZ}T%**-7B zqT6N*^wHtzp9pH;z(}_GbM-yjxI?Ceic$6>o!{Mx$CKH3E!dc>~BH(>YBDk)M)A#!V$JwBYDt2<+V7bUQL0suWSiccT6`*{ZMX@-5>to#( z(AQ$@)zx(D4o-8P;4sSb`iP*=0({&b?~joY05^C`3ix*I6tR79%4_;pTQ8alW+f~a zPbwQ3*-atpcmxW@q5o-j0hVbVh}lAyEljL>|1wRcAA-Nj#Z+{`rzU6jOL1ySE6K4CWBH2&E}9x)~n5+Wz#DUj>YvpY$s5GaUw`+#=Hy0Hylh{q!uIZh(v zuAAKQCr74ctbC@U##Aw|^JEZskuTh7q=QW_=ak0#$njXcLhfEz&=7-}iMPq}ZX4<{ zpI1>GGZTYA5i@wf8(a_v%z#waUF7=hC zWli4K4?zFXZ>b`Qekd)0CK-tBNj1 zXL{N@h}_3qx3Lq~ex>Y}zy7GhgaFMXM20dcm5~0JrlPlb%KDl%ESt6XG<#g%$*a?&1%Afc#*&8EteiP}_WTku3vU`r^3X+2=ta15dgr zCTX1vuVvQ@r1yP&x!BHv(f!>Y3k2Jph7h#7y!*h9P!L>eSw}vkMJ5HsEj+Q@v3(B| z0FMKYE2OEQryu;RTwohIFcZM35!lwl1L6KLB8R+OD6~9q#O-FFPsO~5% z^n_x^`IIq2aVSP@=yQsFsL*4XO2dzaqCncU+Px$OkqO`^jb3j_?Ocl%I6ex}{aVV()< zy0|n_Nmj&K(X>Yv=2vR|5-;F4-exOMcu5>Gg@YEoxwYce?oFfY9Y$(|hP+$1N z*nc=C(tNWQ({eTuPda02bajE+oAM@fZO7MyxPw@Thf0wyG6$zu11p^AQT4Bfu6_IE z(B#}ldI78BNuu?qg^O-KBA!ZW{<4!`jEOStvh~T2^NYr~^nBP{kJ72iSf2;PttM$F z1-vY5{4O&TDt@uHs{)P(uZ*!A+IR6imUgCTZMdaNnn64l;DCS>fy$@|9U)T&qSn+qoZN|8l z^vb!(XrTCR%U4?O^ek)a>r-94!$U)muRR{Vg}nYbcf^ zpW>br@_r3;njXsg1P8XsCAiSdrKjYw2WMb6kH-P3E8oy2bc;~f+|?4!*x-gHFw^fC z1pxZNY%v;NdLczu#Fva8Xqd`45&R%zEiN#WT_MnPK737AUz=)eA-!quvLVy6HQ=p2 zdfO5j_LVoVm09AoGgE|> z#{2Gp+mYZ)aI>4XUJ1A6*<#&zGB`}(d(h)+{C$;3vnSzX&*cG`hkX*g)4}3S!2~Cu zdK5}d$=aDL5)MrfiOD=3xW$hS?(w^p>Ge1j8^dT;EBzpFuU-B z?{og{!9rYly;{A^Q;XAz9Tf1e<~M*i9u8~ZHJ&zk-9zy2@%9C6n5mU3C1lle3`BHw26?2oeJS0t(i|3}SeT*HeWRGpJLhQv(uDE79NwYC z%cLd^86!L03sZIGIZjtMS?=939$62`Do?_eqm!(oBFScFm8GQtD~`)c1xl-aGp!mj zQVxqg^MusvMn3y_c@48z5S+aj!Mwk38y9I`cu4W)lY?k%L(z(Sb7k?a57YzZtY}zq zbcH!$h7$0m`&+-?#wZ08DN3c0xtf7#=pC!gjJC%}KPlk!FEsATuMd4qYw&gSUS8!7 zo@cA_A>Ana_iRBNsH!RUQfDDgu6vcI_p86PV(VlPAsIu>EhhhKW(VB+HbkqT|-Z4AYBXGYIkyAYk1Ri zd!D^XLaW-O=AfbR2Qc^=F>#;#c`c9d z3;AOLamMWbpwCQ3L*Oj|Xm_<$L6BnxxML?>hB?~UI$aeLF?h=xx{M)MibUC}mPwR( zFIOuzc&cz(iG#klxg#^9t&QB5Pyc2@*_Y6=gJ;Gv!QNyJ*LGIjg%xX_cbB`obqURk zdQn1cu7Qnl153!G?v+i_SQHwJ>Y{|?K4gBKs(y8%ntnokRS)sMavi|hD?bwVF?QfFJ?xRB z?hGg8i3*K=tC`dpd#I50Mto0E5$HkPPjujzbP^q~nG*Wh1i%$6_iL&T{q0lcEeFoE z@E#!OV1n&Znh0L(rB`B$4Hdb5I*zWJH%(3Rst%A&h-o`^M~Am9{(JimHKP-cxMUos zsnSE{Y_8JxVJP0M-lKqZj6Xo}^>X^^h_ki@M=LSy6_cRU+9P!e>1*>{JXZ_Xa;GgN zyeuyc`&k+{3g%=BO={pUebbgmKeRaerrA*hcZP^Q4|6~nr^v0ZR)j*7|r!d8et+gGhUrUz}5<(CgNs>gw}Pra{HoG9<2Yz6 z>Mp{&`Q>wolZfyKkiu(xNG5L}H(WKUwx|>An#LlB#!rApFn>M-vv)!;Z_deiB8_Whbu8r}`UgqHEV28$$OJy?1_)R)T# zgyQ}F`wpK zgB&Ej3{Tv&)A*bVwnNVQMU9b;1A3sfAJX}4wcNAQ*Z@hjqzxjLFH9atMHF>zU6K|f zp-(y3ZeKWh9p~iBAamf_g>lCXw{CXu=I;d>uESIKBabMzMSgf07u5M6+wzl#TM@2dK2c;@CkX{rSlJ~H`OGg^F)rZt==Pky7>p&nG*W%xn)}LnTIsd#9iNa z&bqMM?10tVJD=KCD+hL@6Lz5JQwj0(7fuwxSkyd2@b^Bab+Jgz{BaKWo@n?`^;EPK zBdU>w2(~5gvN)vUH?+f<+8F8ScUr9!b0m3Fo`}3y-2=hVdgF1DmP)~IHkt?K+a97Y z+H$fws-?vBPUcE8b&3zaE{a%^8Sbk1guC_P!a7z+>SAO(Z8!ko^z0}Cq4Np`)W@GA zRMj$1iaxt0@e%#pU@v+dFXyKq_Ose`k;>lx#`N}85T}9zmShn8p5b`M^-gUA1IKqa z!y{m`1#EIVR}ps-V{$!^A#t+ndt4bzD;aPTUz1CS!iCzsxn=3f$FsQ~Ucq?F3N`1O z`E1(Yx1*}zWgf;+EiA#vc)twbEVtQHGhtsjwVAMS0i0k-%t*pB^{b$vWbnS9498G&fi`mNf8XXJ-OY zI$zV(!jkfjf+ACSRN_}{X3w$Dv@?5clq+)l>C9~W)OUi#H;^dDH$67K zL7W8uaGPR#vyBgBWwO@v4jJ;~v4(iX{LFo6*jYxNSxTSoHy<$5uinmU0~X#_f2JMG z(35#w2u@@^IV9m7#JNC;0GXVwlZr>c-8{nz>^>)NVqxm{I zV8;6$+e{6A(e-^2@!)a5X84oGacYP7C$;l@E%iF9c996o?8#F5#9D}ReduY2sBJlBeiBUJ)UXYFfa9lb|p%Op;c6XAK`k=aql3g zk{N*nfm!M+1ItY4{)mwQ!q%g;xxH&Qj{=hLZ|)qtr*{-_Lp@zS0>$g+C*y_zh!8vz z@;f*$W%#*8x{!ZsDZ54PEw;6-=>bU^m`c^kOamY)AyJQg%B#~IVScsK(BAY<8wB2w zJRKBb_%jdQWbc$TyILe0FmWEf9qrqK&Lushnog4y+|RD!U!rP09T*}ud3j$j94fn& zesvvjV3a0;mX~^13g) zD!N_dA+*wx?a?tlpulw4#`-JRd3Hf{JT0@$6F25%t0=Ks5K*ikdEhmuWqXTHqfGDK zb_zpIZ?k}a>~%-uT|qR!Yi3YcyO2!Y%G&-k9$V;j?LLP7)Kq}47}E61k3nuSVDEoS z`^{meDU;Mr;f7XZ40QLaSewBs7zTf%xN4jDFTC@nZk;h4la)C<$c1wsk5T;!2}8kV z^29lWb>$PfGWI?+AQETgi;e)`TsTitG{D=j8-&=fYP!2c?|s0$w-|2Cy*6*MDSps4|V)WcE9OM>^U6I?Y~)?FDw*j z8Pg+5bXa31;#^e>MXto(9q4ppZ_P0JmJ8mvc&^ln>e2b{4ZpHxETSR<&Z2vY`|t;? zhCfqY>(oUN_h|tJHI{h2V6WMDiwUa7jZYOkMr&1D(%Bw|uK|o_QmQ9gzl%9oWYm6m zM}+jsOLUXR4C(rhe*dS2oC3G+L$i9)CZYCEuvdL&f42;uP7HG-uL6j>Mr_qKf1-W5e zYVnC6-9Yag##{esuOw262RNs!HZ*_i`55#~c542OhSr8LEnZk~_R1bXwj#QbvtWV? z?g3G(9PqLLM|M%^2o%+0T0n0cie3%#8bzE;m- zP3@*i@#6kvy86b@A+z(*sY!LYhN)GI3bYpD7K^yGw?Yk2y))66bNZttY3=pJ)0q zgeh^Qo)(0n|H*i=nfvPEuaRPWg$Q9Nb>(7nh|!R~P2c{0JD|xWdwkEkWd**f>pP2^ z89*SnPCqws2woJ>EALvdlioIv4VXGl->w7*3(sxMQ)mg7F>rNoQDc~Al_G6$9NGKL z#kPi(1HoDF=z!MmK=Lha(oFss64<*LF0y*0I7wC14OmBBm4BTQ;`J3ZB<0ypbs38C zEP_aGVFe(GVI8Gs*S$9{FV-UItoNJi_U4VA)GyIkJVZFu7D~d(!VS<;8_3* zT$b44H2#j>awwiFy4v{5b};Z&!0`ZLGb=}f+R?sq3R;JN2?ls9l&NjO=VCUk_Q-Cb zL)_q-B9bJZnz~y8CKEapRbwh#ch0|M8e=$een$poJAyow%%MFLdT@xH{kh81W?zl* z>(GOH^O#xM6Wo|?Slyjp=>QfON4CfW^A(CeduwWEF1uzHeU0dPJDk~eKKaY#{*$#H zc>Q`nvcBK0dT!Ow<9y-!JOQ1kvpQm0UAljYFKEe~zubNkzt~2Z)j~Ho-*uQ;DR5(8 zx3E9`!J8X)%dC`y{Fewd-rqyKu}vu#_$oL*L8Fr;TrMtU(8Y_Xqn}d3{kO5+v5KoH z{>umBk#dUbratJrJl$SA!+A}l{Ziz|ILRrqTq@Gu8%&mY65mwey%+s>7>2xTd=dYJ zy56L%{IAT86V%Z~;M%f>Rsn|E&C{L%N%8K&wS^j-eu9(HbN4a&``*1;Y6gen3k!fj zR5h(>xoB_UZ7~FauTfhhxv_e=6c6p%^55YzSM!^YoXCWK^9zvq9JJ|Kr;0;Y_tZ#0 zML&5qL6+g{DFArWRUE}bQ-5tWpBLw)GFVP=B-x~72Yi`7$*(L;S)+`C6ML?=PIsOws4Vn)q7RFA_yBRO*T+9TO6=#7=M5;J*qN*>P4 z*81dl*g@?SLt^}!mXrTV+0iVqWqBqKC67CIv1BfPg&>nYdQ%&rBY*kcXjtQyBY9G| zH&jSwB?%Obuny@h=4u;DRP9;eu5X}g9KUSQ{9C0g1<&rg-=O4pKAw4Zo+Vy{O76x+ zV?JdDXr`2Z&;S~)i#L`u3bCE}qBhS-uP@6ygN^Nb6y7Z!o&Ap?YXHyBQ+wAhm9Xh~ z*aqf9>VAxb8bMx{RVy?y{EZBzz=NnRIecjZqvCF_COE{jqZKvDM2Z2WHpC z-*ycfcx2&_CJr;dt=e_`t3t-(wG}hu!L%^K$m)ogXm7em$ZOIN{X5@#SdceRiuRY` z$>MPfwNs`vXX4Rz$_E{oSQm@Itwzy>NoYhy9Xj%$+%w4j<{%T3X z{sdb$#lE%9cFeCo8t?Sl$x{DS8_TObN*jG9@@^FEBL?KG57FImy;aNq`!4{y@0}TP zZy5!B+;_GTMIR^p)pxK2Jgq||&Jw@u&gBv%fty`dd+&T>dhg#=Cb4Kak2!wNr8MD+ z;Zy(^!hvT)A>V}aS_4#(rD@T;Jbe+*Yqbs5gf)3A2OQ&?wq(G`L>kECu@|Rw{#s~9 zJUlvskM>-vatqiN1MsfNNDjas&>1UVi5dO#%zHdp8IHDBw3q;d0p9r&_lpC(X&BG9 zpO>EZL=dI9u!bCgbG)>oqB{Hwfkqrl#doJ-U*&t)q4SpB!{>*xK{LhTAC@C0d+2#l zjA$ckRQJ7Jo!xKL1sxI0t5RrOUp5apM*uYP`o{}^y4u>HB63yH?Ak-a6MCAJlyKFQ z=i18gvl(&+UE+@DdiZ+w^p~gFP(18vf78Pw=-d73Yt}`0Is%`otUouY$PjJa*p-%v zlG*AUYq@d1@!yqBU}7!}8+7&Uvz2N6{OM@rCM%`GB(iPk6?UeW*MhN9Y+2LKUrp2w z`w+j&C9}EycgThH9`6AxywWUtW4zx1y#oxfvKRt*5;kJ}vE3t8nAg9EGA7bjZY$Hs zK0Ta+o#6ueIJfFLA?;DuYp6&hjF7+_*O%!~?`A-X#WawR~BeN)&bPwRWvTKL~3RSmTwnGJ-taS*ty&u?a5L zwnSQC@yvc-Q^A|Hgg61Jy=pU$Bfd@@}z}weYukCBCy? zXbp0}iy&$InniSr z<5NDC2I8bS$KL{WN(GwJI{EU7JUXwm_DHbf3q#wv5|Qy$-A%doLxA!BYCV0stAUZ{)0f);q|^_-!)Bui zyN=V7(^ga~m!^7to=QPZGHg|3*b9IKoCLoJJ=u)|2g(M!wBILB%{2JW+xc`Y$LC+x zUpJ<4I}9IQ>y0po?porfKyI6(UGP&H>{x;|=uWNEJty?YG5KU5(_)hZGMvs}6HZYp z-#lleA-lhDVpETC3r-4s_1%3|O6z0I-8|CO>S4(MK5^uA|JIt-thL>#XX!4M`~I)r zW7@qHR0rg_(UX=YXgc?^`LZ~E-E&p@$a?JKw8vF#Q-8sIbIVzGHW&0rP zlipn^U3^5ujqi?S$b0;H;BD8MdH*Y0@6mC0c(n9Ba`od(c%^=Qq4!cerG4vhcAaps z-JzBG4Q!Fngpv=_^zqUg_mK)^kkJvju&#L_0HnLd=|YDS33P-I$V%i`lPu2z;$=*2mKh%WcU@)dqP(s79}a(W%75ghTb+u!Lg{&T6-*@qQx>{# zzC9{)rP94Fd$PGgfuoL&w*JloWXtaUajUxwDXu5OJ^AO;? zyOlv@G&M7?W%&BvkHvrSQA3+lu4WE-_QO>$o5JcfGkh~ZwgTFtU*V+Qt1JeZ`T2b8 z$|ZoZ2D6}cn*?|OIZ^um5cL&qQGU_Z!!UGrNF$+iH$#dF2nb4dcS*;9q|~TLHz?w_#VckgrdUVE)|4C_%FV>6ovz0=oio|Z4b9+p1PZR|J~ z?(o~C@x_>U5d`B+cl@tm`66fa$pA+nOzP<@g#{2Chi*YE*5;#l4Ll4L8I0S>k3N-x z--=G5Jr-vG^S^{tgX+TMuQZxm?FGBd5)R*PeWPn7_LITLwd%)GB-nEWUM9UXUyvm* zOwYU7PlOCxL8gTu^_=uVP!Yu7x;KOGqgx#8l_CKW)MTvnuqdbUlK!5^% zWtKB~3|$~Ye^K2T{0_B_S-SyYG1u4CsB_0pPZ$v}EJ4o6fS}2uQ7%9z)G+w&keT|{ z`JMm6JhyHvzc<=zhUdf%BQ?J?_-KJ1&lk`t8i)o|#Gl=eQm_?Gggne`s)$P`N&qA& zKN9#x-A|p3%!ZFw5(>05;{tWTzE^2@b<$opGv)EMH$RIaEK!-CqE-&@gt0v&0+}xL zQLAK9XvBOUrA3q8+6{}5t5~Z{O#ZJHl;w%Ji52=uR4P)gR#K{Mb^iK6%w_+xY|RxT z?7D!iGHJAYO$iILJCn!nD3{nts8ID^x|$D`f<>nAGkwfCEy>cCc6N25wnIg2e)na& z%)TQAS?E0rVf3>jF!LEp!)@c%Vozs!+dD-B^G)goH0Bo?6Dz>*Xp-2B`q~;4f_IPs z22L9}p%iz!EfN2Tl)R~*{-zZEFQEkikPSKWmg~vUQ6jP?)Y9eMEgKBbsk0WRfR3D3Q7qMmea)q_yec#LL^_M#(`&CYr*(D z_&6I5Di98#7aKc=h*8x6+XvdGQaYs#^{T6gYyZQ~I-FH6o2XKv;UAY|uuqKF@OyRw z!W3{bPG#{8=?kCyUE*}=^SJ+X_N*+qGw~Dp=NZ|EEu$z30EL0H{C{6+Aw9CYv zq>1>9w0MeoSCsSE@TV}U-vVLCj~Aq<_-_tj_(+Q zzsFaB+h{YN{2qRUaGdzXgl(RWSLHP=2uVMR%$zbKoCVJQf z4MVMTj5K~^=$DW$%pG4K!fVVi@yk`D|F5zhiD2OlYP3bRJCg-|JS4aiw$+$yt|CmM__9;rnwY>8P zqvS3{)^|I|@wmal?{2bIqH?<+NMCwAifVVDb)6qTAaq>gtxrHRjF!s?36ClSL}BeS zp~`M%9LE?S3sQy9%vQx<5;wl~6K&y8@PBwU_*oiRvkhn_sKorSSdsVm@GyQIzo$st zQ)NA&kX1Q?f%YUy;;Y?b9ZLtR>=5*CT=8EuD7~ooUMMjQdR!>vnt~r(=;&1118UEM z+D2ymwKgpDZXpl#<6=m=iuxdCTGhOsNx0_`HmwGD2{gJ%9{A->t(;4;3=dCPtbwZp5bkGW>)^to;jS!c({g6OVP763eASmam{6q0;j!b6 z=usvyz|Rk~U6v|#Fq+iXWU)6BL4CpZn*n*?U&^6SbXtN3xO3W@bkeTCUkcpgJBVm& z)eJ+R*M;Y`N!xbnpJWQ#e}_GoG6eSthU%)d%K$2Y&=0kG4#Q1YMss`rwvv+@S9M?6k~x@~qgT~}3rE*_7(gfS-0-D!-7S_0=I`c) zje%*6(I&?&bzNzgU$Aj@(A{t0(KTDHoU7bF09R-G;f_#!z}z|6hKFG|651c%dXO2m za!r-Uu717|%$Km7$6l$3-GF5lW%h|(>T`Q1Tgmm&-V35{?b<(!$4N=&ipl-{U>od{ zd&qK)8hewzHlZE{T+?alji=js^z2ZY3)26{wjBK%l$K)gqB+jzpGMl;66D%2@-*wh z8B$e99l5h` zoF=kX>J$G=(&a*xZl>c&F)0=Olxp;#fAh`$zyr}FxSpZm?0W(y!2487pDK??|JQPy zFF*adiy<>iL}$~4hDhda6okDAF}W$Z>_>NBRgx7ae5@+#)97-Un?l68^^MKqZ(8@^ zkv>7mZJyHvy4>^kO2*9gH@4$PId%619T?@~DCd*+aiuuY*Bd&Dd3Ee@oNee<-Ypp0hVj*4~|I&)YMLNz#y0r}GWxS|RT%0oekrsP((lhrS3ic9@fXwbj5l zK^ohM-g0e2vCbYrmt$W_-&8{DexGv`Pew~t^KmIqwq`p```94p!FtR^eh5si$hPN| z_xk{9CvcY|$Y^+*q(^|i<@u<`zrnH@V|TNovg|dwd9gCFAZf8R`mzmb31laJLKRPw z`0cQzTkSk|_l}~}G!u%ib&yt}h5_g%0tvLIaU59F48;`PMiyK-@^qnRV^iqdLnQG)d1@(GvLP?*3K6jqRzdsa*?F<@VEOnLp1hpf0GN3irR- zb~AbwQLm`jN2LPxO`Bo0wea<}p$btdGuQt#9;pU9rAX-9?4k!!MqD zc!KpUSOpzq4RZV)LcTTd$DRFp^?Gck_$Mch?a+^2&9B?&~ZBe)JM}xo6C`SMa)o!^h!`O#qHde{83_w$S9rA7Ai-1agC*W zbikqrN=$o+|MMh}%8~QnTE4-$CQ&yF0RAAr?juGKYb?CU{5!$M?a-r*_CnHVPq8dd z>Uc0^O_QeXw7%zUes>r@I*%mbh9#69ZTf97VqYq|i97PR$;<1Vh|dPu6G~)h-6JKn zxR{s1`9dQSW9#O<*~IPf-XUSeAlJJ#>m#D=cI@8}9@S>=p@m{G*^3Pc$6LzUJvK1s z`&(%UrAzB()X7x}BVN9RhqBLms-;dq#y{bpt`}r0-W`?ZT?|1yLx;`(<$h+!aVQ@{ z&(qmKhRuDabi{mDpS?6Yi^vSqLT(%e@0xnl7RsO_<7xI{Nj2@5h=b!3Roj1jP78Mb@Q7eUWfaU@^S0*J!&LHL67<9rjb+CoQ|W`v zuv~e#y;2la^dPtN&w@p5t!r=7snJSw!7}H!MUOkxwZCkOY*e*|^;5Zh3vl^CA@rZH zbWv@iYn(95{$P!l}-wKut=mVMc`qjle$eY*a)@8o^nUQzsH7jy-3AR3qjeW~^>%E{iKd7Z}k{Oo|)&SfH~UHd*&R z62#vajrhs5_>v3Oe$vyFU2X?o`^(vTA~&^;rPhHtqv+U^JFXUR@?zpF&S zVb@f;UJ+M)5hnNHe1=GI%Cui6$5e(tUPPU{D`<&A8Gzvz*6oM%{nb~{i@74dwglEF zdLPu(*`&*o*QX$>r%;Y?oO~RY;EOI~a|56m3~96wxDThWR|Xyiw6lUIDdQ2@?Iv#V zvw_bVx+VZ{e5LlUJ6ZPHuZOGRc}SyWj@E(0g*no#aL#LJJdgQOcPL`>)4D{i8#lAW zseV9R>oi_SV&0q}uOYm}xW(Mketyqq^l^bARSEeg5}mT#K-}Uu@}OdGupFGXLAa2Mkljz%o*q@Z zK?kTojfIWA$*`_@{l%!$e^CT;(H9Z>!Mr`RZW+VLiZ>uwqr(YSnVTL-$bTQr)#@1^!Uu#$?OS@>JPZR0WHTyBp-+uO2+3zwNQvH*0 zh@+ow1G=R}v)3Em<{qytMdU1Tdmo07SX$T6d1^R`Nmgg)o?^iTP6_l!4=S`I#u5gS z>T3j&ux!0C$W;5*U7+L<1zTYE&rY~1N)tTseXeY2rS?bh&vACDj;s_!a-fubLhvx6VjA6qT1_V;r{ z3OnXeZTj9@d}1lO&3TL`R;vnA!je`1Gp{{u!YiuVLO2pDx{XDF@XL{?Ig&e`%qkHrj~`X!cg= zq&0+7LsO8fbVYqDqGsapsS2&cw^Bpqieojl(o;8Gjx*(DqOF-i2954p;m@)kP8??t zU{AeYL_Clx6$E%tt{@D0TcyhQF>;A+M*|MT*L|<BircC6P}bu zkpNfd|7-nAe2brdcX)|g7Gm{HbEquDj`L^eqN_E9(}gCq?cBWgOHwYkg{*)oHWw%v zj1~6rd_hLT??#B)73lMKL$ zhABsx6Uh7Q*8jG1p*4a7JcoJ;qpU=o-L#7S^uKRVJhL1DdAl06IJ5S043}H)=UYz zhh?$yJ~s9z!G5AclTD^}_8N!Q_m+0IpCN|9v~cJ;dEd`GZR*{fXb1-Ik36LNi{;^* zAjw5{;m;`IeeXuJ_8M^Ir%|>7JS-FV)Ks{3SHQ*I7r}F-H=Nl-Elfymfzg~!4NG}< z=5AqXe<@gJdg~3x$ntGi$?OQkoOSh^ii=A_&?Hg$?(g!n0Wm@k&d`U4;>tt~5p7D- z84LvhIHPIG*B;md*5OM~+;93t*+$fA4K&lEv?pi!NoI^GfEJw6@`TKBRJO`!>*DRb zy-F>66J#;L=|?VAJcjq<;{xYnxA^OIJ5u`Pn6KTm(Ze&2asBEP{4ly5k^PxHHMO4R~v>LYe$wf|Vu(B3!t~oU9vzdciY?z(+ zFJcA9<<#ppURaqy!#~6f?|X)xm@EI^BXU0At@pzT`tiiLe$c zX-DwFzRuEfBZ1v_`5uZSR%B`a`h^{MwHq5W*ep$A5^=IpFRwShzY8Zwu>SW`ZS26~ zq^+{dmnkmf)#XRG_YC-e7_h&H2Sp}T#^Z#`cTLZn9kQdaZauj_qt~OAbg$aGM8GW$ z8~F}+V{Y@+E3+euzDFVtjXWH>{^LU-RCrtBt&nHQK-PBxX`hrFVlkStHN?LE~)GGtPlz4DM zE?M*SRAOJwGX&;r`m1(XuCa&q@TOT)_>we8d585g?U}B;A1?WhuK~Fuws;gC@*gYr zSv~q`b%7CDB7Hz-Q?_mT%dI2Q7nJ9g2rvO2HMM@Qm9>D+H476TEmglz23Hib-Az43 zq5gf(C>Pn>!+)!hhkYj~&lxJwK*3nudp)t0M)J$L^tK>m7kDOcvVjcUeh(eu&p!(!<9k171L;&`Cf)bipS$44pr`SiPme)qyWWH&je~UXq zamRM-rwb(1Le1_j#T8QTx}tWKF#3{#Y!K=*F} z+4Ad`Wb(VIItxUhVH_S6k*z2X-~BWm5xX}+zT>i&x|T@vuY>I>2&slaCbIv1+nglJ)?QGd8Z`<#7#4@owtGs9=k+1E22yp;_i2G3^xp!(^XSOkx{Vd=?&QgtQY=esEvj9t-u(83m9%L?2{}*r z3!}SJ6;;tl#pdrNlIml^>14T=*t$yI&RwApLZWf`Dx=0K+qtINGW2V-MEn`+Yx*=) z#XIQ@)jQ!9)Jg1(q@6e8Z*v>QQo6cZfk3`*eP4Pnus&XU{UFKicy>Q0)xM&>Dh^(L zuGiuDurFg)0VreNjxbNm>zSapjJ;F5m)QpERbZtIflx-kVEofDwrykueW=&Lxpptn z5d2!IpWGRMOJP_jov$RtVBkSeWh2&h-#KCh%xw(Mw4_q^Jfz42jmW&77cT{ z;5UH|)0Tt1F$%8vr8|-<*KD#N;*);tRHKIlj_iSL%DR=Co9y6b4yM)RW^obR<~Yvt z4n_!7D1<_~x9BX$D@6`Df!8jNevRK940LL@d>yRN*WIKD_eOTNY+SWwWo0>o4Hpo3 zP*>iZMt}RU)*$9ZosLZ`6s;nKF&i?pxAG5bI0sC=rs#yM&8Vd~07HksRS&%$ zg}JCBhb@n`XbxZj8ImxVqK0h%r&n#1hmQ)Uk5{;CgOp@_3_ zyhOHTWd$C1bgs^UzdqEhEEKv!{InRMql3>+gWkz{E3{VSy}|@A+Q$kl<-y$z0Fr2{ zHYJo8Tj`1O>#5)+@*8Sm9?;+W#tZ|zsemizNuSk06*|!GM8M6H6g;xk<0@|a3_A+V zyClLB2p7LOtT@&NUnthz^uoFO5N|Y%0apDcq@)pG-+hw)$F`OWKxM%n#N+VMlYSy` zq>zf#0h1Zbp4*v1wxfYI$2X{VX+okJ05wKwglpIX@+ScE zUWBc0qb&F?$hVDtwMVvQwm$w&;h_ovuFOM*rAT^&38tCweSGOFU=X_6bJyFO2w*-T zd)L}tOvZw(v1*S4&N-8;mN=Q`x#@B>*1DgpFgd!_KP^csM)SJhtdV*i+G^nzB^{9U zsg1SruAAADB{(k&nq5`;%Xj1PN;Ls*7~5K7dYwRT-ihcuKQb-Uxo zMQK*{Y2rPBAtg6sV{A9Lt!NF%jysOv``M9!H@0jRdukv>P~i1}_8Cq)oJh_Q*9HI@ z#srzg)&`H>_f4QiK1lh*m!*53!=>bE9y3MgZI`Q;GGMt~QqLzB57@{>xvqL#5%_EgT6hiPqHGwNR$IX03H5f8-wQlj$0*{Af9D>si*lnA& zi5i|qlGLO?>Gdb$ITkWsCj!0xuq>2LFN)slvqUXYe(@1fPFSPhpf}RI+j@Uy8wa#k%Oy!jW2+QT%;;B0yx%GKW&hufACcusZbS~Aq31Wyw&tp1d}F2Db4r+(oza4~?@7BlG+H0H zm&V!2jJIF_w9fRAv}PrCx`NeRzZzSvAv7nx-e3 zcYPI)&tYWxnIseBIB z^6e!a+tz9Krd!K0UWRYb!~JTK>*-}fT$!zdq}W3YKg42R@&St&qy&T-1meFO{qFy* zE#J(gEF5FW6?k*BV5RS~;sCnL!ZF09PBEGJJz8k2Dw>1n_D;7GE|2U==bGW943j0RxmzG>Qy_B=LfcC$Zt-P}w_ z!M{}KT@>jk+Tn32`Jlfm7?%?h7SZJFX}j|&q9L~5^_h0N++V>;cc#@P#O02t^x(t~ zpCz<-gfYasuNbvULxV@RYAWQOyyIl#CYMrwoI7Id*b@2296o+I7ghf3Z{LMbSy4bp z&T2+~a3%6=!Bh13e(8I;8A}Fgo~83Hbb~R|K3YV&G}-m@aoyg4Z_=-Sc&kn-a3L2+ ztfGeGs(x=X?v>XxJc@QGM=D66OXQSLyX@!BTI^;YkTA)3K%a>UoHA4d%%i?|7Zj1A z>m9K5o=|3nGfQCj&v`@kQDo=z-<6~WH<-fg4ND|N&E>&`yNcr4Fl{!*#bOg4H6sr5 zF#BjI?T@#9t^@nodlzDi3vuHVE<2$QGGr{^n)!^_npN8Xlaq__kx^FO!+$6*YS;Fhz&x@#gt6IFp=N7`ejF zdbE!9^vonQha|U50!_;7pTmf0>QKt~B~eGA-9_Qr^i~W4x~$sV*0~tT;aCrfN0+2&5BTEld(uFE zMEN-}^7k^2n@*kV15ekqJ_KTJIc|do~4flZM_JucZZfd=%>OET(oO%Q@zH&Fn>X~ zcC3NydaaDqDi-?3xx@a0sF*7i=a=2w z*MFS-SYV&zT$?9bpjS(CsOfK*$U^{hq?L0Y`kv0l*ERmOJv}v}5(CvRSyl-Bys#&| zepUOt;jhuiNE+3lNA&tcV?+raYwKgwxqx(Qa;Pd(s)UfoSkv%8Ru5-XQaaKw<@>T! zgP0w`X>e5rwhQlEIr&!`@_f;;BD6UkGbq8rgQ6J12c~&-^y_UimUGvy`RR-;EBPW& z{m9g&9P`UEcmOcz?yhC*iw6_1f|^0CzGLXf1PE2*cReuQN;VQmuA+(Em~Y_b5|^zdRQr1WiIui0B(S%kTCO7`@2r)dP& z93DKsHZ7D}eD2ztH=5HRU_A$%yf7~k$lq_P!^qw!74eew)X zn{&gZ{m;qXH`3;b1*=z~ixcWK!$IGE$QbuOmv{wG#sA_wKp6{Pi}KWX>Js>{pSlF9 z6!|pdBaUW`hNKnp^S;%KXJJTP-2w_g#BZ6~sD6qxv2S(2xwjs+&oz6>F1Kmx#St5^ z?yJIk^={8QjhCqYdD&;go4+~3KEyn2jyJ4^o1*GW$^hLWfRvu!4}44C!BWta`&Bdz z+xs(V1!u7@+gC&_OGh069EZH0!4IW-Id|q&Mar3YcZ~_?2m+1g{dfO-K61<)N}e_Y zVMR~X1!j4wE=FT~>#ZvgAw6ogapP6DDAk!o$o`+7R2r)-hikhpDSv%R&YSyKnja!s z5W-f=!(F9F#cGzQ3|8d9Bmjw*=Juv{p1{+iuPW4g7p!t;GpiiN>!~D z^aw!3InR(kuYL}6=J{b~XP?8>G5(Ts`?GKa(Fqo8m$J`j?Lo(0-$N`z2)z8zMc)_? zUUE&kk|eMvvy+Zkg$YC`4KOUYGe zoYzvTW=%l&ME0qbvt2vD448K*54U;oE@J0#24v#tcRSX~tz3xLJ%s#Zq|dy$=BQW&cu&ZDpyE%WZ^{TM z#Ip1y4uMvKQ^&(rLKtzw8R@HvWKRsf77c5ch;K6|5@^eDCpT=Gn03nSIkH8*r*L&5 zu^Hvhz$T4EYU0#)MVhJk!Xj6_>F*p3yn+K&4Xvv_)A}?-KFOD6Ve6hU%>U3&3 zEOLd>U`VB6w`0o@HY=A1NCgRMM=t zfN($UdRwY4Eo<4+=lWhKN=;Cf`>{6i`S9tB9}|b`2g3b#FKl&S@=m7S&&~Pt09_^d z%C2yWWvSJ?|EsYo0-#Dlz!qOYdO<}p|F4%Bk0mAVef{DocIME7Kc26P*0rME>;10z zX(NA#Yss-L9YWEg$J&i++r3^+8Q$RL#vRgARHWKlR}ei5hp#O^bPv{?NTHg~mXuW= z+1;G4n2TD**BHqo&h#3o4&7yGza~MmfPBI&op-GGg*h2PEX^c`@KxjP40L9jXu)K> zdiUpZ7MyJgriMk|aVo@2TL&`Edbq=CpY8{yrwj%gVQiUafbPvz5OGd#AO18+_HY!B ze>1pta6B_f8e9TsdX!jJjlZgl|5q61LV3sevkb4jJIBGbr^c{KvcJAnKz1n*@pT$g zzp|$CL^Ud*U9~&N^=!X9U5X)auh*;#eOfv)8TH1@l2~|bIrR~mkPR&SzI|2D;MsEk zCDJwO6kzkNvZr97J>e8%Wtv$k*NcsFb%DE6PF(LWfe$Wr2rQ#IWUz_?NZXfH2+m&n zRV?(EhyxX#O7QW&03b$KTk8banfyU>IhbO;%NWuzJ?n{{=ut)Sf<&3BISRQUKJ)x+o?pKLCog>d`gCfs) zPCoGyK0`-Znl;2fDgri6xhmHdmk7-Qk#HM)?7&aKLlhb#-~jvryFD<-m&(Y?{f;Bs z;YD!&(Dk~%fpL}(&=qS}*m4e%YHv%LuBpA`H_^Br6hZW8XZMkkDx+AyV#}oCFoZY= zt~f(RQO-(DM6BGrZ}sn)DMia{#?{{FTS}`t$CXx}>$-295U}nZ5)GU9_!EA#zaUs3j>OiaT z%W2d9ZW%sZg&SW*Acuy1qh}{J#Gb_3+4_|nZU8-;f;iq>GdHQ@5NJko@OJ$z8IP(B z<-(88Z}rDS9)?*jl}NYu7;Y3=paZM15rJDG9cr|EoJ!25=cu~BJGnzHCRaSigy52k7L7w)@6Rwpss@;D7ern7 zTrNziQYqV=dy8y+q57beSY=Cix6;i#>!`gyTAqPYt|`gW)KCgM?!ms1ebx7?vNN8F zLiN`)r;evjkMY-K{59h+Gq_w&``GETFy4tRK)NZE5tjG274 z_FkYKR|pvdw~hc?iDpD0d#h<4^VBxa83T;x!B9&Y^=$k2;%^ppioeBOE@MbM+8b)L zv5MUo)P43=oA26|HO!5O=dm8tdNoUs6BuZ@_YYpqz~{oZ;*NL~o=?v!TG+)a*t!Hh z#(3kzrB00D-p zj@qBiv?=G_wD&yE8M)&eFB?_~b@dYCnj;xx;sl6v20!Ose(`YV*-og|!=BU;{6%k7 zru8@LL&Sk;(;n)MN>nh2=TQt)Zan7?Zx%gChi4mchdPG7@yW8=@c#fmT3v9@{6;k> zEf{q$;HY*$!gxT-uLyvju20*{hAuNMMNSUmHqean-L8FA1DzS)s>PlZMX&O_Crga* zQ;`XpG>*=D>U`M#>wM0uIkgvAG_|#B+!ucKGR{t|9)%SCi?&Cv)f_GuuTVIU^CH;U zmEUvnIO$GTmW;@)?r}yCfnW7>K9u3i;s)QY?wDHwmdLAO&_?V2|FG&WjK6l%a*>Hvzz8NLvdn}Z)$$pCFk|Vw~2g#!#TfH9urDoegbg`h-l0`P6zl-`!No*%GwC#15`j=}(>VYu{(pO6g{2 z4#k@Y!Q;vo}P0q2bP zB%*bUz-TeiVvpczqX&D(^6~^nxQ+)uKFz=--nFMcbnQP=@vd1Bm;3TgrYh8Osc=x+ zQ172%M9y7Qr~FGni;eC*TRC$NvD)7BK09@z8_U;3p9vIQbDl}L zUFT<8CRaFu3u=Wvu1sekn%~1ORN4L-tZKKvnegba*ddUWE@O%g@Y;P(V_# z>als}xnvXwZ6(F)}a)WyJ)f*>GP10z7@b$GQ z@DA;fnqe_RHAe*D-}@#Bm{7vN!P6c4GaXj9RDm$E7fjp=auC+jjE^> z)TD}8Dh~#uJKAe6aPOz~Q?i?5db|#%v!VWM${RWIh_OjkhBo8U$-lY6Uc2_&J5c;p zZX9J;Aj66I>yLiLR`ZK~PED{p_TaHKZQ76V^b@B;2o*@zwx*F*YCD5p%$r_QtSlAQ;qsP2`1!b)cGa8n7OB7vgHr|2Y6M*do~uZ_kvIy^a9 zO#nV@M$W_R3V7lAf+tJjX=5gj zt(=Y#pl4PSZd=3CQ-Z~Vc4I`yiY#N;Q3|z|ut8Xw%I*)&+|xVY4+RHiYKmK;x$qiI zto#gR(6f_}dp*Gt$1hr|Eehm=+FX8Wn#mB%yWZo=61`dPVuxlpo~`s!nX23;O6-_= zkC8sE%$B)c{rkPI;-*GsCwj245%q9a_<^o7>hK?SuKD{{W#G`lhe(~ON^Q@4ubw72 zvormf9%dNF%}c{(zk#5ygj99JZjeHajrN;0I&p?z^nPyoFR?(MPT5v)X&=iy zUz=NM|MZ2yXh5L$Sxirc=Lh#@G{Hy#IssKE4^6vaW1Y>RJL{zoRR!Mtuv9bAFe8qo zDV_)yk?s$B0gHxM31{7l9(JG`{}anY|DaF7wKS%|w0DLrK!fp_gzqgf?}FwDe!>Kz zAp&TzB|b1Hn>_>ZE?lKO`&g?cyTLa`PUN8tGCXq{x#w;$MoY-jT2-kU8Tc&d8>)$^ zfvtI}jz#QbKqz7+Zz@3j5<@1|pA0}vP*=y-8>ZD^0BO*x;Rkh0q2aJn$3h1_OY@~1 zT{D=b=FB7ooaL#y2HtlLL3x(;iL&7I$G0=O^hHw@4nroD9*PyZVI0hXvJ>qW%8y>; zWD`nATFaT#voq%PVH+9?W88cbb+05b8_mC-D`z5*g`mHXt1pu*W24zrYC(1;V_JC0 zb=ffUSh4079xQzF*MXI;Ae;-eZ^EKRDQNcm+zfnq%DH_3XB3dm%%Y1v*4`8NEl#7% z+$Lncb9ijK`CpKYPwU~l5K26|*m=u>`Q=4t$xu(zC*LEpOlr>^XLISO)`nA#s4@g7 zzdgBXLAujP%tXvLBf~z*#Rsc>WnF*-AE|Vq=*2=p$It1pytWY~3;k`NWY$jn6^-AF zH%YLG2Z)-w2w?Q{A82cB5|!FXnr`vJ!N(3K)$15hNXHN_ir69s%T|tTZ=`>scmms6 zT%<8|6^{NDW8wu--p$Sa`7$@@kfLYkH};7p$`o1oE9A4{w;oDHj2cZkGH;CU-6V}* zg?VS8m;NvEpMozakV{8524r^^N5!~^d#PvWZvMZs!c?9g`+TD46<9DdcEkMk zjH)j4?5r`3uWawdNybQ0vyQJ^-Jm#nypjBm_A2oJz>d0NPr2ci0TU@|IUpjY03c8NvHb)+^rmo zmSKx}tJ+4~g(}pw22kmS5fa?WX7WXU?QWAAu+@iPaj{3#^tb11BUT>R**s2 z;b&IIU#*`7nBJqx#*A*CER$SM5wf>sA{lqa!O|vFN~c^2^7r7D z&B3dP2^kqJzAl_(U)hcEeiy2iIhy4MYd zxmek}^rNA{+>i67&K9BXGbqH~VVJR_;dwjtZTQZ}Xq{|%_*K-`KV9INd;m1=Bd*Vk zF6mSe^d9YltpramPR?<-s8117+_FZ}0No@A6oB~cb@6<1;>sDAgPyAOQ>9Cpu=Se{ zilfa3XKcEeb2m4O4;#k;o)-V6)zRA>P;|}xP8SXAM*P^`3?`F8&AoRQ+3Lku@3JK~ zeF$o<53h)fQXe@l?%63JsWi`_O#7_zr}t17h|}gbKHg)QwH{p-j^=X*TQa?fqP`2O zqZPy-vt?mX_7$al-nW(hF4NGN!%y29ru{*#_O^c5IWv`7sAkzs@)*88FSl;+G_^{X z-#K^JM>MxhB;jqU7(z*>4)+u|=Zo=2R1_T!q8uS_`89i^k9a?a3(I@v<{3LJ~)x3piBOaO}w3TMVIAvTBiHRJ?b$N6=wIf6db( z%atE7>`a%w2cj$Vv7j z9Q-txiW~-_C`=da+p_u!n>=rTqlrrPfejb=ultGvQ?<>)t&)1*FCcciwGC%tqmrX4Orp@g7TF4bj?nP;&oqClwA|iG z{>9uZ70K1))zhvY0rg{RvIPXtg~M3>r@gQ4iz-~Z9=f}`l#m*vYe)g5MWtIxx_ju7 zR6t-T0SQ66duWjuO1g*c4rhR8&Urt>``_8W{R!56UHiUbt+nYXJyYeem7b5TEmyU! zJ;QyRP~~ENC$xZXv+(#Kzf*{Ds=UQpG5}kF@m=p z?KcKjqyp8GA0GAEdjvwXNUO~)EM&u@yC&pYy+mQFT(o1qktmMC*MefFlL?(Z1&#S( zLYKGAl0-E&yPv>YE!Qo|;UOdWSO%Hf^NXrCd1F@|5{$zv(@MH@3r&l#dgI_cem7Ib|7oK5%X3Fy4VexcnSvt2@)|u#Fo*N>@ALe+?q~+)@l)Rk?PxuhG2ewzi7KYf<9Z^$b|=J3J^5i zZ=z<#!JIGC(du`tdLr{chKb^Dp=ruvLqofQ{vexh?^11d#GTvLr;oFWZ{@_gow=`O z|0Np6iSVz}$WfAVzP*2mRv;INXGxYYTTxlnSc{hBgiZ19D4O{Yf+y0A17!^OF8E zzgxG#;0Fq;cn`p9RptSH#Q6`q8YFc?V5|(D_R& z*;b;w-1qIR<@daTe-j}5LN)3?S3W8hdlLnh#7n*tC`L( zT*Hb?1JZ~ZHd4MLB`ihUCsLI!cFt1ETK(i^&dyAOxFP}j<)1|S`+TBf(+pGXyiQQ` z2;N?W_=qKqi;OO&MXD9r#qp(Y*$3#nmMuGGRHRj8IM%*2NRe$cS zeT~fJY-tH27?0?^N_8v@rw3o_bx2xcIG%lkk{q-8YVL*k4Mq_+?^lr;W@W(t9IBDr zo}%wXU^)}VxUWF4;gez(6;Y;Kv{XL$2JW?7xU@_N_ia^j#`Er-wcB%n^t;rQZ^vN( za2KkUK|DV@FY*n!xgsHayz1B8XN9#MO&Yiqof}T*g`S6D8nCV1YEA;Zap$~*rTSUP zqS$mycSWJ3WrH(aLK>Lx@_0)8XY?hGQsiws>^DPjAtnPf>bXs0jgMF$PKgvHJ+&?T zwxYce^9BAs zRfib6UsUJ%2D{))-U@AEx_K$Q76&%caxX(M5?1b~h5;ERqWeqH@w-}MQTpr))TuQl ztOUO!8fR(kIQwaFkCzhpT8}~LvUEwNz3-N(YKd(5mKWMsSReJUhs5*5*zPxcFJy^* zK>x_YZd0I+Z&Gi8G*S(?9r2js^ntq=yUfDK&+Z%t6Ok}m@8ugxOk{2AT;k&nHFZ7q zFYzVGT4%)##W77KR&1fFs;YDBza%#Yhx8rq*s-Py-yW+SUGAB@dvvD32^8vjmAy=c}>A2oHNNjV3vJf9kYo7ogSkm*F-IMunEsiM!seO z@n;Z2I}sKz+Wy@}odkPaS0$%SPfcS>lWtwJM?U2*$drnbL5r1}3~Bdl9OcBn%ZSdS zf#3H!vd)iJ3$1a5osft^G_u{Rg<(5tNvmsJx$X+jdWu{~9Qo^sA&@njQZSklnCOPB zM{~HKHaZJk8?N7|P8bHC-qx`CfQYki_$ zn3tFL6%(KAGw!s?qDVl3aH61Xnw^Ui_tm@y$G`oNGD`E8JJ_h9nB9;!Z47#%Tt>7s zXk}-&5IFPb#Nr_yqOAB<1H!XNKIp5D3#zeyvo}KfCCO>QRp)-o`o=y$AmL{^u9G;b z7;qBLc*}L6f;o!oXS*_xy$FKKNuZ<+Ndg))PH*sZLxJlfBCE?K+*B=|QfI-QW3*_|G?E(zjBAhm~$20n?`;?;CJ+LmXgW^| zDwftHeEGkht8Q>84J%{550;TOG@R1hb}ERn3zPZgEE5q|gC{LRCvQ2pSU3KVLJC{! z+JISa@QR4hj`H^0kcsb24iqO_Ha_sW*f|ODXQ)Jp6A`q7gXcgUd1t$+bXYmC%(htH z<@v2BVNOw5hqyyjm~ z$c4wCD!8mp%~pnIVB;7U$y?-8!(SOywe^b-<$^Z z_&BZxtTd~DV@xjRocXpTkfan`LavNI)tI&?%PWdj721hc1AcrjSx#SDZz@0{J)MT} zswPNZCQ-+m_>IeuwmxR z^@sQSH^N|*jbu@f*xrbPPK&e+Izis9-LVk&MtoxkVjGC*@=Jn%Syr-aqKVCnFcD=G zhJmGrry-g!M~bpCwO)p@R(BQjR1C^s?7#b?zWKLb7av5J0Dw^~_AA-=f`L@$G`qSw(o3@Y?y>9at$k5%w)u zM26MjCai`9Z~~}gjX2N)d#Ty22|Z0Lnk`Q0)hu=rbv1NRZ4tNY1TmTHHaY9RilJ6I zQBv^Pp{drSWpc#+QjOPQn)!x)XPAhf)KaneVS#wQgvKLw#Hlejo}wf(#!|SXU{%^( zcINfcf@XpI1;QkoB?jn3#I=-~^V0{?P+TW^vo}hR9Bt4jmnA=dvqL?E~8p5$QcAc(>8$BbIK3a1Nt%PkaO|Guam22MXMbNI6GWPJrNl>dQ&cB1I`OMUm zAAL{q4#t+(Y^|}==25HTS@lK>#UteIk{LG0%8YTbC0Lq$DIZguges|oG97?97`LMz zYNmbMR|Kwn=f;{gd;~E(^uNNN`2`~e&E63b|5~tqNiF(Bl6X}ub6(1V3=cW3Cl67a zt6L%8Lln3)+m%sJgoViemyC9uh9kHblCkxE|3Kv5AsaiR7VHCHHlK&^tT1gU`>|#W zVpT>nW4MPKNnoX-V0ldWgzHOOMVn>yQTip5a$%_MhGyEjGB;>XdnmMCnQ#AnLGgDf zQ}|y|;_LE*v!Bi?>OF48s_;a!t~8kmN2zB~D^3n&Hzy9UG=V9AJb?V;f)la(w#>bw zM;x1PLLRc`&9bi*6W`POgSZUoWc$--vCYhzt*}N+<+GQ?^n%8OE*D@Q`!!Z5e`j&( zAKeb$g-=@|G>lvo=`o_7J0pJ|c~(DC_KN)LU=Eh1*X2jo17EqLWx%#2M6Lt9!1Bn=OIs{q7+<*eC&+r zh@>Gs{~_ZeCxiT?U58^$lTcc_k)@YNhr#GpwYAQux&hW0PyU`+;#-MK4CFBHt4i6Nr{VL34AjXT$xDlgA`x)A9hr(l^f6~pVp~z;Q7QD!PH%ZC;#`w3E1ba?iss>!Er*$-$lRx_ zlrse@Ewk>B$E-xpHH5XFRyz)IjCHM@sQNN{9Io4gJ+oE-u`mGubCg39HTu)J&(lRx zQj&`F+0xy=orskTzSZ?p{lSFKvqwqrGY2eU8K++r7dK4ifhbwTV3#U@<%Ch%Qd8B% z9vy?u|C>*=g{9_s)3!n8mh`Tp2Ms;C3EOD2!o1;vEiDN?Gd=!QCG!0*Z1u1Y3Ik=E zqWFpEjy=#{N$q0&;$SzwO(kJYqAsTMCjpx3;glTqniaA=Ugf5C;c2`$s4?rhHY8n+ zw{>VB|4#nW&^o4AY&YJoiCI+rPscubZj%E!lM7ISu;!rDbDG-?j$ISIp2q$AtSA<1 z(hUUoOb(jiIBbs24oUL{UEvJeZu%)gW6lt?z~ABoQ>4Fl@K<+kmQ`h{>(RbA(TVh( zuC{`}o^?`D!CwU00l%V?`q^d$uT_Q~oD5H@*0Yulco7|cuVF04;FDlMAJgT9RhxRk z3#38FZXo`j;!N=Z9|3#%lN0|EPWAj@m4#kmR0W0%m)qtebGdV$*{H*Jk5 zWa%U8V|VXs)ok!L`^f0wsqNBI_KiAk9CzrA$Mk?T@@${Tr^hXXbC?SVuTArvsM#8< zzxgG3a&#+tC>ip7st%4C2iL$&J#){+aPOu&H&v6D@5Oh6-0o^)jz#TLlNJ1(UX;AZ z9kNS7lYbejy`KlLQtT z6`&np*psLZJsqli&l;D3UgxXE!)onjt{D2?(c^nl!Qtf^wM%_GMywhUKSL{Sy|vzq+79! zqwgJI-KJW%Pz0;74nQ^t3u}8G9V8?twSKkHo1IxtgFsH3r^o!Nc?L59;F=(xH4ErZ zr2}g1Ds`kt^p|k^@4KtEA9c#^>!9NrtAT~Q7c14BHT#U1UHjY3g1_W$4;Gx~Iy>sb zzrB%1R@$I(5)ROv$Z%`WnthUf427It41a#p+ihU%i(E8wC1mz$z$VT?qpkb)2!XWK zvKvKOZj=O1TAI0$)?h^{6nwF%M89f2to0T*<7g7g)D088FCv4or=8Oe>PCF(jED)) z4-vlEb1%wfFqe;|CY!g!Ynif-kqypm!9`l57eTV~pI{ujOmgt`Hr^rP>Rv*yj&6mu zqB=Jpsk6Ri2_M?{SuMry#vLeh9$1pm_L$!3**~hMUfHH576|qJ?^g!OKh7U&QiWuD4?kCj7ch z%6oeq5oaCEU-pC4XfTr?0%@ zsAF#}4c#q2bre7Tne`%d#!^D;)nxd~63!{`Ma!PPVBpbw{6mDT#m7PvM71bk=6r2+ z_xK|b?j0O926mVS(S!v3OVQ&@)^@&_c&?*tF3gavS#uXPu!ycWX<3=ikKxiF=XlL& zPRfqVQgbKyVJWH~(DKG9{|-(wJPSZrD()58hsCbjC|_-CC4A$hpW9s5^`pbsUo&ma&p)FwsZr!?b+jeCkLA4j37r#k$cw;KSgWVzE@WM!t0ky$JIuoxa`^6(`!dD8|(K#?)eL-KeivUeMTr*uQ>axA0i=P#cj5~>8bo^ zO!W!eRerb7$n*$CYh(5k81-B$N-uZ?^*Y)jGx|9eqoBNb_jW`HBaC>7<0G@d9HAa= zL2te*kr%;=MXY957%+_U2}AWAzns6~UmUq6*Gm#)7J+k)BCR3sf8uH$<`^Rzh>EL@ z*XRUhX7#s;$qit{zRf+wk`(ZiIKSEVBBGIk`IFw>%UU~|Imk7e>4)=y3_PQ|iu$=d zc0R?h=&j4=A`>6_izgI2H%^OSveT2>He#+}B)#s0RR!H<-ocC6?)KBq&E=dAl6gzR zES`4K8M=G}1OLv=Hux0nXcwVX$PcFT2Tw*>05G^JNf-W!IBdb;x@KzWIOa?sLHcm{kmE|r3}>*;Yk7>TEc;C%EC zdOs5DnCD_%7o^0=^r`{_mH`8tovTndg8N{h!1|+xUH`u6#25=1m9i~yFV7HkAKgSj z?V&++1Cx`Do1<(?Qfo>T;_^!$_1$VjGX{P4#@uWZ@EbK5DVi$up-ou{Q+Yj~9M?8K zwXN!~;wj+CGrPOCP;^R%Z#^;mh)&*lHBY-#BI>6Tm2jymr6kt}6H_(>G zNDFg(@npNA%S_+APDDKygGN8ySkyW4i17R`*VfVRW|=-=5%d?92{6k0V~_~tgjCpv z)ZFq2O_t@KJ5$pqIpEY!56`M!VVY@&cGK~*v!c6(L65pS>tHLF?cGmT6$?eiO97M5 z#-#)tn@HJXlM~NMEun2vQ5EcMB|4N6$bxX~+Fk1q0pf?fK1lbawOsqX#me;RhRsr2 z<$eA!VMzul44v_Gsc2(=Ey$tUI;b10zAX~IWXstlykD;mJFWy(cUH`)FQW1M*x>cb z;zv$e#9cZ>tR~F06|7^K`kj+P#?&)u^I5v$V_oTqEl~0bZcCFM9G^s|*1gyRxUUPd z&1N!0GT=FKYL3O|#x=w^{Yi`X^h0c6`*+FsRv=tM7*+)&p{>vUW6d&DQ zf;AlBA?=n;;L8bk>=t7Tq(<|4XPw)OU=5j#8B!Hkb1mK3b!G{U3&lk;p;3w&Da&K7 z;)m@cPG3F^1+IEsIN;2fw~YLL=ZI;IaY3meW1;0-rwf=c0*OJxKFzMdKq3F$Q&UvA zMJU>Ch_LsnmHgEp0^_Q$YleT3_=m%twwG+j1W7#n;?a}+^y#+YboJ(stis&ak~bHR z30e29Ag_C@p})H>v>=JZNyI!+yAdx&vK{6VOrbp7{=Bg=g+PDRqs*ls2gcktQPXKmR=c27fX)!7^O%X@1z=H48Y?vgS~ zP)hI!Mj{6UZIHla=4{MjU2J^G=tHLbcElBJzQ+8vxym8#9M)A_f9l^=mxxVGn_OtG1HS61nfom^)r+4#BI<}Ag@@H|YE){(xB>Q+N z>rEh6JK-FI`zjrbJYN_=+oI&(m92qp|*8sB#gUo3%tJ-0L7-g~;^A zllDnndFQ+DO)v;LJSM~LamEf9HkeKPoG$(eKJ1Jx@JF#Y;gcttiMhgYxXX}mc-(}q z;M|wnmkb1qys3mJp`Sg$<{6=Qti4to(i^HE=VTK~WqEHM&5M<|FYa47+n35hFd){>H45{fKI!KS*`cD2pu}rbd)9{K;P`Iy6z9iWo7VD z_YO-`TJnKpPbr>!YWVq!jfC(!ASZrn&fN6k_&d@hKl>+JK6*k%N&|iKWAyplKuSbHC?2N`j2vX8TpT5^Z6z-4BnrA*r0v;osflA)0?umXke9*udv|B$Ko?8J+-9eP*z!|Tou~d& zuM^zrylsfz`7=MWju3PTz?lDf3JDIyDioS zkgsfOeQ~1cf@_v5CUah#%0<+QW4Hmw309xz44NPHudS8?c5j;pNU4|I>+Sgm$+)O- zfyO6#1PUxsSHQkp-@fgqv$6)lGh8p@3`~EWD>|)sK&|9+;izu#7h9vsP!r#gz+_#r(xnpzGo12(edHGL;7l z#t*s4hsdYfcE|mLxDb<>OS$;jdmP&)FG~<+6UbsYf{u4o>e5IEux@*c^_b}@;G%(f zd3d2w*$h08p{56jiN0LEdcmfM_rM`qcAi|#)2u<4*Y!9$98t|AQuYZeyzxK%6A}6b z?85oSchmo*LyG*wh2L?mV6x2i`GB(>zd^2S4L`iplhk!Kb3xX^+oXjj{X;eh)g(BF zQmtfM(2*&W!V%xbRaM+}i?^_QrF?mu6uKqO*aO4E59-i#`xs#kvPvH0?G~v#HU_UC zjIw5)x-siR(jncqs-^vJ6kK3|;1;NyZ^`v#x0u;PUCT|3`loR}7w?_Yczy5EB3j11 zPq(E0wkw1TnQU&;_O(5Uz)$utgTp8~K^eTu8j0miHMFYSD$@&T%D7m ztDl1*dUGKGZ{UghUIB^m#jdDBZB~aq+^o91STz5C)tHMk|M{+v9Hhg-bSM0tH!#Vx zwOFR3li}gaZypq05;R-LlX3%OO90%$l~>jhFt82ZuQ_l-R_?h?TzzR~8GqyS*f|0= z-MYX@Y_U+>b;{nvL*-1wqUjHrH*YgPs zayU7=t~AXz?O>BGX-?DdF7#i^D~$>DSTsjiYc4_%xh#lj4!k>sAWz!gcGWC{?HJrs zX$ByF=n!cxZj79FB+1X~@JAwpv#h zy(w+H9-OlA(yzHO+oZrzn?87$@JR*l;HiX;(c+2|0S-Wy{T!$oY^T_YRR=ldV#z!y zH5uB>^Z~0i&orjwgZNy3_1(;4(UU>?%^XLXCi;Ib=2z&*#7|^sWP3Q6;oIGBWGC-? zf|<>x+C$Whcd-O3$C6Hn-tH48+}Y8fG5nE~&L7*sp|T-b+wGSI;?G;92vT;UbDda* z1k#?^K3bdPu!7J^@1s&wH{D&`G-nvTBy}}7dS28+Wxi&49ZLbp| zd^rlYQIvQwRYc#;g}}p~(k|FV5B4RxnAu0!| zz_XR5nVLG%EeWAN&dR^y2}ZeN&}rB#XYuznyn7nZEOtH2X z5-vSCO?a&_UwY1QuoAF;z2WQ}Jjm2%8g|W-=?L%)4t@|MX51N*bsOsxe0_ENc26C1 zl>)U*T%|aYD#PvYNAGbqFS{Uq3b=ZFpQZOyS5_oMl^o>Lvv~5+m5uiJc?CzO-)n8L zi!j#;GEUi{Ar`+VVT8##Gvj$1&g9#RMg*8$E!aF#`JSn_9o+C@ zo>j4|GkbVq6vyXy`s>--xE~q)%iXU#zH_5^@dJwBq) z?k=?sZJlpQ^71ztzcP2{H9Oin{JB z8&(|>ol}-;D&g3zc7+9+c1CeCQ`15;^tmp8r1*>!P!+&|@YDH5W;ksdfIO~@MpaE9 z+aXbfVbwT zWXd5v6c=@8{_p)C0{=tce+c{!f&U@!KLq~&A^;6kTYo~6#trdV+gIlYpq|&Sw3Mq9 HEyDi~$kY6g literal 0 HcmV?d00001 diff --git a/blueprints/certmate/meta.json b/blueprints/certmate/meta.json new file mode 100644 index 00000000..f8be746c --- /dev/null +++ b/blueprints/certmate/meta.json @@ -0,0 +1,18 @@ +{ + "id": "certmate", + "name": "CertMate", + "version": "2.21.3", + "description": "CertMate is an SSL certificate management system with a web UI and REST API. It automates issuing and renewing Let's Encrypt certificates via DNS-01 challenges across 20+ DNS providers, with unified backups and multi-account support.", + "logo": "logo.png", + "links": { + "github": "https://github.com/fabriziosalmi/certmate", + "website": "https://www.certmate.org/", + "docs": "https://www.certmate.org/docs/" + }, + "tags": [ + "ssl", + "certificates", + "security", + "self-hosted" + ] +} diff --git a/blueprints/certmate/template.toml b/blueprints/certmate/template.toml new file mode 100644 index 00000000..48d6228d --- /dev/null +++ b/blueprints/certmate/template.toml @@ -0,0 +1,20 @@ +[variables] +main_domain = "${domain}" +SECRET_KEY = "${password:32}" +API_BEARER_TOKEN = "${password:32}" + +[config] +mounts = [] + +[[config.domains]] +serviceName = "certmate" +port = 8000 +host = "${main_domain}" + +[config.env] +SECRET_KEY = "${SECRET_KEY}" # 🔐 Flask session secret +API_BEARER_TOKEN = "${API_BEARER_TOKEN}" # 🔐 API / web UI token +BEHIND_PROXY = "true" +CLOUDFLARE_TOKEN = "" +LETSENCRYPT_EMAIL = "" +LOG_LEVEL = "INFO"