From 76627e5a1921fe95f566eb1252d29d47042db972 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Fri, 5 May 2023 22:21:24 +0300 Subject: [PATCH] NAS-121592 / 23.10 / Add mumble to `community` train (#1149) * mumble init commit * extend config * add cert * update readme * only use probes on ci * update probes * add metadata * one less zero * Add email attr * default '' -> empty false * Update library/ix-dev/community/mumble/templates/_mumble.tpl --- library/ix-dev/community/mumble/Chart.lock | 6 + library/ix-dev/community/mumble/Chart.yaml | 25 +++ library/ix-dev/community/mumble/README.md | 16 ++ library/ix-dev/community/mumble/app-readme.md | 16 ++ .../community/mumble/charts/common-1.0.6.tgz | Bin 0 -> 54959 bytes .../community/mumble/ci/basic-values.yaml | 15 ++ .../community/mumble/ci/cert-values.yaml | 104 ++++++++++ library/ix-dev/community/mumble/item.yaml | 3 + library/ix-dev/community/mumble/metadata.yaml | 8 + .../ix-dev/community/mumble/questions.yaml | 189 ++++++++++++++++++ .../community/mumble/templates/NOTES.txt | 1 + .../mumble/templates/_configuration.tpl | 25 +++ .../community/mumble/templates/_mumble.tpl | 119 +++++++++++ .../community/mumble/templates/common.yaml | 7 + .../ix-dev/community/mumble/upgrade_info.json | 1 + .../ix-dev/community/mumble/upgrade_strategy | 31 +++ library/ix-dev/community/mumble/values.yaml | 29 +++ 17 files changed, 595 insertions(+) create mode 100644 library/ix-dev/community/mumble/Chart.lock create mode 100644 library/ix-dev/community/mumble/Chart.yaml create mode 100644 library/ix-dev/community/mumble/README.md create mode 100644 library/ix-dev/community/mumble/app-readme.md create mode 100644 library/ix-dev/community/mumble/charts/common-1.0.6.tgz create mode 100644 library/ix-dev/community/mumble/ci/basic-values.yaml create mode 100644 library/ix-dev/community/mumble/ci/cert-values.yaml create mode 100644 library/ix-dev/community/mumble/item.yaml create mode 100644 library/ix-dev/community/mumble/metadata.yaml create mode 100644 library/ix-dev/community/mumble/questions.yaml create mode 100644 library/ix-dev/community/mumble/templates/NOTES.txt create mode 100644 library/ix-dev/community/mumble/templates/_configuration.tpl create mode 100644 library/ix-dev/community/mumble/templates/_mumble.tpl create mode 100644 library/ix-dev/community/mumble/templates/common.yaml create mode 100644 library/ix-dev/community/mumble/upgrade_info.json create mode 100755 library/ix-dev/community/mumble/upgrade_strategy create mode 100644 library/ix-dev/community/mumble/values.yaml diff --git a/library/ix-dev/community/mumble/Chart.lock b/library/ix-dev/community/mumble/Chart.lock new file mode 100644 index 0000000000..d9812d95d7 --- /dev/null +++ b/library/ix-dev/community/mumble/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.6 +digest: sha256:2f1f31c15fb7f92db141a66adbb8d23a8598727730050a3883a211763a4e5472 +generated: "2023-04-20T17:45:03.548828895+03:00" diff --git a/library/ix-dev/community/mumble/Chart.yaml b/library/ix-dev/community/mumble/Chart.yaml new file mode 100644 index 0000000000..41a665302c --- /dev/null +++ b/library/ix-dev/community/mumble/Chart.yaml @@ -0,0 +1,25 @@ +name: mumble +description: Mumble is a free, open source, low latency, high quality voice chat application. +annotations: + title: Mumble +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: 'v1.4.230' +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: +- name: common + repository: file://../../../common + version: 1.0.6 +home: https://www.mumble.info/ +icon: https://github.com/mumble-voip/mumble/blob/master/icons/mumble.svg +sources: +- https://github.com/mumble-voip/mumble-docker +- https://github.com/truenas/charts/tree/master/community/mumble +- https://www.mumble.info/ +keywords: +- voice diff --git a/library/ix-dev/community/mumble/README.md b/library/ix-dev/community/mumble/README.md new file mode 100644 index 0000000000..9aca2cb8d0 --- /dev/null +++ b/library/ix-dev/community/mumble/README.md @@ -0,0 +1,16 @@ +# Mumble + +[Mumble](https://www.mumble.info/) is an Open Source, Low Latency, High Quality Voice Chat Home Downloads Documentation Blog Contribute About + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Mumble` directories. +> Afterward, the `Mumble` container will run as a **non**-root user (`1000`, Cannot change). + +You can change the server configuration by adding additional environment variables. +Prefix the configuration variable with `MUMBLE_CONFIG_` and it will be added to the configuration file. +View the [Mumble Configuration File](https://wiki.mumble.info/wiki/Murmur.ini) for more information. + +For example you can set `autobanAttempts` like this: + +- Name: `MUMBLE_CONFIG_autobanAttempts` +- Value: `5` diff --git a/library/ix-dev/community/mumble/app-readme.md b/library/ix-dev/community/mumble/app-readme.md new file mode 100644 index 0000000000..9aca2cb8d0 --- /dev/null +++ b/library/ix-dev/community/mumble/app-readme.md @@ -0,0 +1,16 @@ +# Mumble + +[Mumble](https://www.mumble.info/) is an Open Source, Low Latency, High Quality Voice Chat Home Downloads Documentation Blog Contribute About + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Mumble` directories. +> Afterward, the `Mumble` container will run as a **non**-root user (`1000`, Cannot change). + +You can change the server configuration by adding additional environment variables. +Prefix the configuration variable with `MUMBLE_CONFIG_` and it will be added to the configuration file. +View the [Mumble Configuration File](https://wiki.mumble.info/wiki/Murmur.ini) for more information. + +For example you can set `autobanAttempts` like this: + +- Name: `MUMBLE_CONFIG_autobanAttempts` +- Value: `5` diff --git a/library/ix-dev/community/mumble/charts/common-1.0.6.tgz b/library/ix-dev/community/mumble/charts/common-1.0.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ad2bcf3d3de508898fa7542fc1b513b3e5aab47c GIT binary patch literal 54959 zcmV)kK%l=LiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0POvFciT9!Fb>b({uFpQ?q{sNwk+?r{d6+N?W8lgoy8|h&wFof zo*bBjB#bG7At5`S#NYjQuo4>=Emk^dan5us5-3z*DO42-RWX@NNVa=Eh6U~4!b$p< z>VEN5B84^_6GZZ8SL#J9v%J#4DJCJ@0peq7JnHm z+?Gq+H}b$NBNS3hvhs8T0E%gfPQf{!72p}ZEMRd9`0Ut#IsP3LB_`P^xZdA@d0ze8 z+elCu7dWT<_ZdiK)tFTULs9_z{|7IJLmXq6f^$e=N=6$Kh%*XthKllZV+Uk#f=&S~ zrYM8u1_09{Jq2S*^YV0e_vYrNFF*BTGTGe_rNso^ptm_XRjqDZE5!EtgZ}Zx*Y4y$ z@FUm%HB6_dye9_Gvi?u@_YU3lf3mk;|0{X^3U+qDRzl)(_toRGN6#PkCrNK(l#)xB zGKP@COO%$U;Pc%E04B2#Zzec>zp)_F-$raq!cPH!LK0{j)c zdHLw&DR>TVFA*ro1ko|hMgXNH`nzr$PY{_3WB^FbZcjlJv5gImqZ=ESupB=PL0}&=jKlt6fB&EvQcg-bDo`1Orao$jdq@5KW_V$0OB7EF zOmELgM$sqA+KGwWPsJczynXuU6dWD@C;#>K`Pu8=PC+yn@a6z0rrBBff@H4^y zUcW6-QB~!yo)l!78}ATIUS{bntNklZQF&WZG%?`7G$l6|1-`~98llH!3{xoNgCR^y zQ6^WP6Z36};+RbGi-HVsiqwP?d;F_u#wL+uB>Ynhb9jkUOfk}n1t!TUc=ulZN(!Rq zEdV>)t~m$Q<>G-aFC=g*)oG_W??Ck z*zB0U@`@TlinZLT*HW1JD=5dXK%6K26{sbs7^4N#=p=7#KS9^! zcyezjBC=p&VhCd-dG553d-1#X_uU3#yX8_EI!6V?LmWf8B!It@bgGau*DMz# zFQ#ew8pQ>oWhGr!FTF}JCwc;NURwVO@D5g8iEtcJn7hbL$>c8bl~<#TJpVA9W-*sBc0c4y0xC-(aOCqDhg$4EM|*q6w*6;+aD1@0w*Rc+`TTkJNAL>K zX_1v&%*rsWv`9e5kb)upgi2t{1n}eT-Q5PSdJfZ62yJQ#oo;;o3~&~w(*%JCf9hZF z^~Egf!#wXBU?Q-U;FyBw?bAmQQ@ud+ME}Kh&j>^epQs1!?l!oI7iUHf+NFr+TKa2{HD`Qq!)+wwg``38=M819^Uz?yy z_GK%@r2#RD$0)vvdIk(U1R0@VYcehAKVT`*5)f25QE~`z3byhBXLJan3!~f5^$gqr z?^w?_We-WI4Xd6VT0TUCHB_DnluiNQiC#55YU|{{uS-h&B^kMBx4Z1$2xuT>t_s0X`;vSP+}#1b?>!v?{vMZrf7urQfE@DXSwHc8!|IaF zE!F4`Q`ue*?4XZ)E;2@ZcL&~s|MP$Bq9d>96IryTS54Ysfj~?O)~$W;TJ~wb-#5E; zh(B>TuY3^kSyX*PYECtQ$C+;6SNy3FJX?TKVD$JZW=gfy>nw*tx%fI3bmt&L&k;Ov6FKi9ikfI_`>(s1Pvowrx6MrNmLmMX7|Ju^*`kD1< z)&JyS)!fQotNypQKRDTQ^}oIS{k8tLipSRf^w}iHNdj lHu469R^u%bRM_2IMyU zyg)nCd{n>$fq#)p#tbiEd^OD(`veK3@Di42A?;D(r&Y%cPMDfly^n-R?S=h*CoWLJ zz6yLUARR{_+Et%Fh}RK_w6GTed2-U%uY?-PTC~(qE@_e>r_t=c-Ky6r%~TaoraxYJ zt3V&8xIl>mO%zeR&-&bIgVBUCieXxARCHOm@fVbUl9B@P+M?h#!1Qk=f1$DbTM2Sr zUnA@Gk8xsY;rvR!6-PuSjtaWO@SJUT&)F_+qWRA;qGMDD9h~il6{eL;2uNY=o3^+m z%b2=5o0Lp4pkp-QS}8&aO8N$nic}7+2YzQNia2B}Pqmc6KX$PL=vioJ)R|J}Ggpfb zl{RJtQ?^wngXlu_=nfF(XE9T72~?Q~^sCyY8oX&t4u**F(?G{x3?77P@G3CXI|G&! zmJI;-6Fgt)W2lZl{q&RjL8_3>msXWgl(N)Z z@z~0)TzO38W&NOQ^hL3LoKJzF^8iB~4we@m%_=Cn{OKTw_FeL}I_1yXNz@Yw<7*n71Td#|EtMsW)A(Fa_z!MO!HZ^7p0 ziQv@i+U{iDHt} zxx-MnnPGNY`Ag~MPE#J)K7TKcr z4Xd!y*A)m-rbbECf(%VK zkAAt+I%;Iq&PN}T=_Cg`JIN*Mfd?i=ub$n3ogMC`#`?t&uJ7)4ZSWs9w-QJZ_>Uj{ zd*_GA&JW3lAO5lP!}FaVUibRt#}s_|qRe{`rzqj-5JOq%LQ#Mw!C$~o8U*imtFez| zK{O$3k8rhv;D)5n;%Y1oJ2%iXG_Y4}xY*xXqof2}A|NKm5-bV-gp87~HG$*QVp5pF zDBzOlTLpNDWt#?sNxYNdDmr5pgP`XP2vS@0CR86&`c@coUcq;l8ew~6~3RXxT+1;=JpGGl|RCa`gf zkrfhu2a8$v8(CT7MX&-B7ez_-SD;AC-s|<4>2f7|gKxj;Z)2aWI)Rrke%{?}?Ck8= z_qF#nt}xqv#85wn`NjlMm{?uNHoXc=KhrxOZ%_6c+tVl0l0HYp2!SoLf-F%<32gX# zU@JUZQheE0IP_tfKI65citaDmpZmYzB(>X|(X%H^kaQP~-8mX-=7jzA}r=*sMj(A^Uw- zj-)1P183?uvfanG3m02@qsYD9dO;Eki@7+-{o$KC=rytW>iJ4cUp*f4H}UE=nT^+_ zKAEnHbl4v_ADC-28AT?N1NY$SYfI|)^VI2oiS~(GTm@{?|BjCiT>bB4u)hDhl85Vg zl>_85RKRNL{K2%qip-9Rph?NbD9e&Y&ZwMdqy6Dl1< zpv;54J+p-LX53b&%Q!;IvGg&t^jTk*U6mfY8Xa~u`s*KBcU`&O>gufSvi?utVCSl; zUrSA0xr+KNsi*g&ntnyKG^mnxnyd1asfDgu1NA&7??wKv)Bl!r_VO7cZ>`pS2Ws6?&-m8*&{`i_>qCo7$+bST z)`!5KLLd6GJ$3qDCek~cQ3~Vn1ZDIQlbtb}J2UHrt@l3;-1xuy`v-%y{v}Sm z2dG9HRKvXt&9GrMecf9kjg&Xv9BHlE%UN+z1?DM5MLX_S0tDS-q30h=WCCbU5*uHf4K|%7n~(H8_9L9 zf327MdbzKcyS3a&ie#K2m}42Bu6EsR0I=}B+OoW~?9q({+3Dw&$cwtQE|FbgyMHb< zulA|a|74EBrD%XH`rqN;XwTLEPEL;2`rj%ZuIkB1Y)jAp#kBdlI-s1ojapz;ri&g} zl@_t)STUYD%KIJ;2&BGu(&bbaF4-ALhO>JkQ_@8*bNF$JA}2o@`egMuE!%F=Yp))9O;KYb zuZ^rEP~WJMiy44tmwVSj=~^hgU!l~_(x;O(x(h(&d$f3fw_bZaGkVhu+(h_irDZ=Z zsJ9|`2N}gHN$&Fa5M^;y`wHELYv%>Nh7?_)+i>N1coVPKcNtHx{l-SEG2kdLv78n- z8$Ggma^6T-bHu{3QCrK%-~CfB|8sqB74g501Mxrij@SMlD|w{+&j))s3IGSSx_bb! zK`w7^i+t5LI8AFV1Sm=cl+F^lq-kj)xt7VVVow}h%IbyhNp7xgEBlU5RV$U|6yX4IDVe1|F#s%YP@0-+n2~CtW9!}x-5*f)KCqr; zbJJR*A|-`}#qe%W()pzQrnK=!fAxF3hoQHiq>)dLU@c<(7j% zw`{iqLc7*1W(D0v_n!OXwbkG^B?GTz%0GcjSs}}GP6S{o@|nRjB{zT)K(0|y-~<88 z%@a8)Ku!{H2}@jVgA~!fm0%2uM0Y18(sDIQ$t6rvnK2MfDVeY}V6TWbr z&Mg9nIn>vgF8k(Onne}>kx021flcuTh_29W1U9eGZBMvW-edHj3jYnAC@8p}x6o^B z4$C<;5M9Aa$UhAbRGufe?klXz_X}`rpyo z|8pgem5uosxj`l6XAl3tqcQtioL#`O#G_2CPJU#U-5Pm}u|6r9cf&Bx?wqXeeRCep ztViDK{%}E(ww<9nVN2a4!~qe9%=x-Io~euTGLR93K*eg+2@> zg$YoCJj)V3bNQ*KB*TDbnYU|z29HFX^c;3Sd1rFoZe+Qp+2uq(WTc|MI*|jHQ>w_x z3p|0vZIBx4cv6;I62dhni_SPpxb~@}Jqy_su6ztOEqk_yi8@i0(=;%FG*PVB8zN+0 zwm8gsVr2P2rQv^J6kvb4saItC-jTG~P%uxAS>OTKqIqh+Q;U!3)i|SpW}N{5_Q^WG zIj1>6KP5Lku$59tvTB9H?#Y+BqQ+do8I^ z=k7~O5a^cVj3t(Jlb~iB<2%cKEyntGQkEsU$wI>Cj2Do9+H51_cxTvnt>bK8`Y|@2 z%C~MZE$JhK@^g~kN-KaP_o;Y(px^VhbIG+`H@J{R;D-|IR1=H|D#8R%av)NOiF6QLWQ=-_bE3I-s$q^akrC*-o)vZn331iIz;q+KK|tVPE?`z-TH&FN%MaTCv;Nn{Ba$KIq^PI)wT{Yd zcZK%&OSHpZ64H}2AkVXp)d);e`+I{-Ub}8NDsBbN-KjGvOM8y7k>|6EWI>&(^E6Q1 zQmZG-CoE|T1sfICCe8qpm-r&c3&dy<7cvbWXA?&)VEx&>J^aU$|5ALpYuvfwa-i5t z<`w|k{6CHl-T0q_!QSCo{#(VPebvv6dv;tRSwQkL=1*TvpScCTWmxc3$qKCwX1gE} zv&wRH@}QRWP(hzQ;${d+UUS2NCBWgNXYs-3@Ct!)T3EyY^a+==biA&W^SHe+F+z=@ zE+f}3oy$|sW@c9j$ySj$eRja(Pq`4TGLr3}NltIU&o+>UVJ~|ZldUinE=IB+UH5+H zG%Adu*^yj;{uw6^!Mh(mzGvGD?^?Fu`1pH`wq6(5Oyq00YnNNh6Hw&o+pM@)#6?cN3Vu-{uERBSNLW1;^y&unP_rxod6gD?efW z&qV6o4?M2o5+VS!>3;_YZv3y~gQK4{?sj*>c00bWvA1_=?s@+TjnJp(+)y6 z-fyWtcK-fl=kMxA@AF{$c<)aA+>AsMO?xNrJ@fE@)*D=VfEj>k zK8D$Jf(jgq9*tostQat+sOW>Ilv`!xoB)5@`CFfRsW5W*7EHl}l#~sCu2uFOY-@K} zDbN*&?f1N!#rkDGHO+u!!3bGY%d9+Zr`@9vUlM{w?pVfG?mxc?x3$ zqW_3M^dXvU=6!9(`i(q|`#+(p*#GwihyMP5a=hOESMhXN%0$}@j(jVS^f8xw^VZ%lPe zV`HLFb7Nn7g07!?eZu^o$0?e?d>Pii4)(vpeb@fCf4KJlU&*8NKQZ3Rvi>P}i`f1e zuW45;biAQ$RR~9EHi~pHDF$g=frZaERQiMLy0-mwIZH_F0I5@X-gXi6W z`zU=L9E7Ko$y3lbBSz@tmxhC$43MRvq&yZ}-}CL0biji9B-oAcxApDJ>KthQT5l3d zc-r_s`wp{(u79-4{{z?lb8>XJ&i}cR$KwBTu$Q<6NQmFXE}&^y@(g`y+UnrMG-D;ifcs%V%4LdVmE2F)UFjqW%bTm%IoBhZGfHf{GC; z`JwqG0@2SIP9H{rpb!?CIOC1Es9MNAP^ov6Xa2R3ZpT+y_zPZBbe8}U+7+D*S$3HL z;MamoPR-sc(6BUpqm?o4H+1_74SBTgxIk3@9AcCv?9YH=$lV7K*h*0bwl=T97jT7c z%U%!c^`u{+$_7<^1z*4r7bWcpRC<1&HH3cB)mNXPIR0e%B-$UP}M z&%%EZoPlT?M6zY`jfG!H3VN32W7zZJ{0HJxY@$y&%*1uI(_oBz?O+l`ZsoAQdh?k0 zJ!V|exE8?l98o_{-79$H@?We;ZUT^%{5yh%Rk@$}u}C_PmtkIJa=;J5ed%H3SsZHm zIfRdo@dD^vq1zU0^h+~ESYPA=)9cdhWa%@dByG`$frSrzV~fmR!D@*K_ELwX4w7w7 z!v~$}HTSa#FW4TYXd=R%R7ug4AB~#0($%Zyw&C1j30)Ky4b+6-;1wTOS2Zf1C9k-e zHP(U1%##LZlI<`tK;NcLzz?O2I>$u@ee--Ph7*)>mn=z%;{?_+43g3znP!1-NM;#N z4oJMyAFn^qN45#qt|O=UK+ql^_s%q_;SjKwJ|2u7b?c^PY&6|V8YH>Qw;Z3eh9J3N zZ_p}CPY?}{6;%S2bgZ1wENbuO)fQ51`U;kMaq8|nd?c^?>bv;k0@85+cYXfY%8`9= z4VFD~(K?XA{9$_CeiAwinjADsMD%C~CAYiPrQ{ORV`Qj`W_1QxFtgbE8$MWt`0%Gb6UOu=C# z@N3wE?T~3qISNu-8H_udDol>CTotTtC=A_$A71iFtt@PA{+ky;#q2xuP3a*2Kf~o> z3BcO?KMqfhJ^BCmWG(-%;_>AFXG`<_kW=S-k^coP_j4GCvd~c=ABr9SsErkOg}#{# zHGD-&DKEgw#G%~d>YxqaQXb9O5!=7Q>7*D1x#6gO@D3_<2U#qt@&8}hU@y-LM9rP=Vh5;*S?U(B z`y)8JCO82ZPC-s^Mp5BL^0NZrnT%26WZN8S@}yT3IANo`a1Ylw!SEdBWhk<3fdoG; z`!9Zf`snG|hx4Zt^w{PD*rOfAUVr{QgeKbmiw z10w~^L?N6W+Sa0JhCfb`c4MjcX9yq?8jo0xgt{Y;rV)r@GRdbrGTxNp6w})XM56-c zV;q+eh^}#hNXTj!!<>(*(KP`PLwkVm@*IPCEP>(9(gwE6&Ym9v0rt-<;TB62%VazJ zD7GLI9$l|VyVUF5&DImcG@hnB7UArXOs(8$o4i*TMrkGB@egnQ$CUzg2fq0qGa-qy zB;Wjx3FYncv)8}X0uo>AVR>}x9uYN7LN4Bl*rmaS_{VwL;T3mG2B>Y<0q?E4rh7fG zg+8*erVWL_z+s)d@g|CDX4~$MK+llm*Vj)9GR=7s9$2z1NQ8kmlVqv(p7>qp1M+8& zi2Z$*=L`$^PR`4#2t;rGhw*@jO(~NHbgRq&I{EzzD-)r(~XpzPWeO8A;2g|WygZrd-W*;)CvL@WSlW zN35!xaRSQhAl|-y{OZHvP!@*37=r@wWIhm2UcG#K@nLZ=K?pUIj1cJpw2W0vTNWrjFAhRNj^pP5im` zf@G}793Alb_`|EmXOBL-eDUnRKfHSRQZlt@FSz2umK_0f=WAL|D*4|qpZHGR{B51# zM3_qcEXI*P!P92{!4o(_Du(NvMxYk^&%yq_7yspCZ|(oHlE({_$p_pB(=p=$4c8qx#zGG~*Sr6#pR1)!qIY2 zp>Q-C4qM*kWD}{`4QLK7a$ySKt_i4`8#;cF)%Ywum`~I6f}}XUtuvPDi5gX9BM?0u zz996XKqbm(Lx82toK?WcG}YNvqqFn|-j+<4L)WN?9DUffyM^%9O)S*w6~Kq>MmS>x z40BwCM+na*Tc+;gubK38{phDn{!8%?#kX;a?l1q>!QkY?mH+kzdu#b`6^|wV>A_x( z(5JzD7XqI_&9a5PF(FsxwviX;H6?ijqMVfUHH8JWHj7P>>#(YTKA|`Q(U{U){!>~N zJdv;(X>%iyHVcN%w)m$?HQRTNf4mKg6_=#UcR5(&^bq{az;xK1%solA%>V6h|5wQe z6_tI~t6|Jr1uPSH2IgVZ83VfqO;p4%FW#9Pq1if9w(O!5>Q}yko}Wq5(i#l^=+%loK{8dR_zUPEU-ECPha+2tb_FmWlbvkDxR+kCL`~AM-(>ru9uu_%l z?Lxp40eW!BQ_lN&!^7~LM0Pv&)vMhfd9ItBB;s6Jl4NBgH)M-O(5Ar4`bXzK_iw3K z{a14vEg-@nH@Jh5?!NRB-E)CUlBP1ehbVIpzi3PbKM&gV7uhQuOwhKZpmX4h?%WoC z8WYwY6~R?pv^MqP3eQ`wOIs$djk-c7m}tNA1g?SEG=r^KtVyh&%g%hRZ^fJwWz9@( z=-ZlDAb|-|JGVQ|Z_zf&irQITH`9aDe7Q6^*YJWxjmc3nf^t7$gB6~DKCXeas|#H) zIBeZ`qtCw>K6FL_-nb7n6in1^DAZj}kq2Ol$3C*(R(I_DX6tVG(Kx>-2qiH|O?w56 z^Ez{dRXvw=)urMss|VD_dMCpnOw&skUp*4v_1>v)3Wjqtx>75Ax-FZcU|;I84`i-% zQ(>({{xP0b{ZBCE-xo;()T00G9~?OMKlk^J57z!4D|yWPuc#=&FR;Y%^3nh)^~s$@ z^ElCSUNMu>=C|5eLu=9Uw98|LDTXQjx4Q0OId_j?sbqIYCsUsvOYzhdeL3(a1dwY> zZ$+7XIY>(4nUKOOVa0JMXQF(L;=bW-X^8tm+OZ@ZB{h4hq3M_C3f3-7hInS`jhlOH*L}v`8zn%MM1TR(8 zm=pVr#RbnOn<7|Jj;gYm}j~j6lS;C@lZx$;79* z?FPUBym5R1EUj9p+M^ zN+A|Xch%)cT(UCh9%==awIDWVt+xGBVZSZ^_QbBLBkS+iYA9xR%t4;OV5UQUv%Ts^ zOZ>V`YznQG0q%1!6gCH3CoW<`TC6EqYoM;`I#N)zE<(pAo=vDK?ZA-+6OL8TH^gYD z#(%oOP!gUA9GJ1N=korLbAf@HeL~1)s~-(cAJyc&yW^XOY4A|J z5ly{NBa745;M%ecI_j1yKmvv25(UWyy1!9*vZ82NVx=op@-o#gQ}U#0gle)l)NPWg znky}YBfpe6ih+(N_VOAPHwC6h?5pa?kXn;P@2vW@xSRVN6(dwZs6L0)5KJA zG8U%0M<|82uTf00go(>+cbyjK&A342n4}34y{B=E%F=u#o3EEu$F?D#-bl$jYGLIQ)n5+fk=6k)@ZKze)_F%oIy<-+MMDnA52SHdy`q8aak z2t!k&&{>9d4%g%y^>rXu@2R>%g$qy})_2FL2lf^r-36yQVh@l^1c&8CqgK(`l9~du zPMqFpG6E%7MR#I4wcO9Fic5i0#r@2x*c02SV1H!At!eL+w!VS&C7(a$(`Nsxg0I}y z{hz)4gM&lw{?E}m|NBZFOMH8!275V@o1Q!0h16zHvus142HhBMuR+qX%V^P}dL5Rc zs_#v}Lc8}&VVkZ4$G%l(R#-?`vOpiFsHElT1^{tBJ(a<_6*Tp^ALmoyr7}SiQry;- z6Q6;3W@Qvh@dQ)8KZ(CiH*E8dTT(VFWZDZ@mN*-M!8W+TY0Bj@InyxR1``B%$faq< z>sCi+imZM(S8`+fnw-T@FgmRfi&aGEYEYWH>77q5-U5Zhl6lwMB>mCZm>_If4iTE; zs7Py~MD^3;ccXl&wi+u8qOCGLxp>>)1Rui`v0)ErNL5WnV@L;RJ<3qv8Gvw*Y{Md6 z);loEC0dlo@RuEG<=6ACs4x#W8COJT5A5WHId(SvuyS5>z55C13(+JO&Wt zkWy4E$pdj7X>^7iT-TB%H9cb4&bdQhhdmc9bs-?Gv!1$mdkXm3+Uf3Yfkx=l-hel^ zTkJkM{0Esn-QBDFxORU8&mTXpt?=T-#qax%%nBTd5#nM1??dOp1^`jaq>JePZ4LhS zfBWzDc7A&Qh5z^6VCSdzKlZlRTlVLd$=`dMkzZYirwoEoZR_3Ri#Jc6|MnjL{R`r+ z{-gKzP1`2|6$L4tm!o>r4D_}xQiwC~G^1$5S2h~;!Cr40Z2g)NNac$`|A@VMj#JEp zfAR8YFqrgw#BJoaL}q1_2x0#5?#1q#-6y-xcYjlDJzBd)BlpKd5zkv>WL6i56JMwyb zdtoEQxjAdxe()S{OeI~{+zDpkZyf~(5iYd&Se(~(l#h`BQ5|h%>8;w!#qOm9eA_A9 z0jE!MUNK(!oL5vhG3F`}F=Q00{a!fLT$e)*cb>R8I@!)PBxy=+ShGV?Odu`8@xl1< zj|hSxQdTPdE3tQQ4#-zc7mNHiGn`F-ZQJU%@U+?g-7x+0oC37i|Mw2P_^*2hhwJ=5 zD|sw4TE#40%V7s9f5uXTaAz`o7smn~O-nr-u&)^DEE3TuC6_Rb0Li)Qk|mk{fwG>k zF*9PX3sto)FuN-JwnRm^B>SR^@!SF7aw2I4D;SIo?^gsS`6;=2op{x%PyE0h#W9)W7X=yOl>1V$J=CjY7Za|j=IMqAjL}#;dPZWH zj!8))Q8iV+RpTv<=Hg%A`ZvTdhnG0T6eE6=QrVi~YED%}`b;t4Fkq6Ly7F~vB>;9B z4luMiLpK24y$_@=XvQ!pNG>3-zdGYsRhtD#-h_{(Z#y|x3v=aMyOAe+^ZeVSZpp{I z+VI&i5t5}3bu&V?!mPiXvG`8IG?_;T<>w^#VuQC(sW5nXjfw&%(nV00`CA!k-V18! zv|+2E2Cm`5aHBxKp_8iH#N{@CCAdLgf=6S@3Qlu@R5ndhrTW1kMFp6!#sW8YZC$$B z4I-ZAEx4mZATqa2c~8jSzFa;0+E#lFa)a8p75ZCV<+yfLxUTx9JNlJd;X4M}(JDDN zV7rv5VhZ%N&*QbD0ncf?P*R2JR4zFzqvt#)P1$$L^U-YRQ=HLNbg5!!wNgS?4(8Ef zgYoWb)%*BLvBWfIzM5tfPmuIvjx5n9dYi>06HptYvA2j*y4~3Wvv(uC`vo3}MhnKx zf%9h+AVWv+?UG~XWBHaYQUIM<0!SujyvFo>r*o=WI!y6y?wM@@={~Q6%nK%Ln_v>7 z%djxhUIP5eCZV0}mnn`>B;YNBMOgx}!LJxSVasBb_JN_$%_`5S58L3~&{+Ms4DPIf zk}b#11d8^WN$h*Oz)Z$@dD6Xaey_5VIRUdR7k$z$jLss?*G zrUL`ucVR5B=vlIPVAJe<<-7o*2`WoCLKl#ZBM?Q^3zeS8KBD)OViW3)>s{P8pu1jR zRbC_$gpJRZed)brf3};fQZZRq_r>ee2VvM=Q9Iuf(|#im{VH!Sz9G-ZsC=0{E(%ga z?)K_mz^~1+G>gz z_8b)@E-A`l6m-<9y>zbb4^;J49HZ(@b@w6^A;7R6=>4bW2tfsB_I;r&imgni!7WXf zj4~O?!p6T#O_BN9yjtH-c*6dXl8)asef`;pKplBvMi6p2y{v~TKh6$S9R!5I>Wu6a zT&{3;0xf7QNDfCzoUiSXs#JgkYqku50i!;$zcNGk4Ti$|>-g=)t&_7f6%pL!mADcx zewLG@+%>MguqH)yx311$KY>>Wlqf3^7?J{9$KeR@{3eHwt_#+8hBFv|ef6SxUyaI+ z7wGh{yh#!Y&hO!=uAQ_X>RcN##;z$zhwh5dy&NkWM`$8B?SBD`g@yecb%s)xVYNc7 zzf2Tr$F(6&U>>=R`!z#)!w;pcFj!di&5#@K7(?{6gcwdx8p9GvE?nQW%6#ge8Ky80 z#NRcBTRlBHt;SKcPxTCh&4hm-zHw_Vj^@i`TW(L(%}?1pKWY~0uiOOb7*cs|e2F-( zW!!}AmSv7&Jj8KbKw@L!Yd#P@(AJ;TF@S|~kg~e@J2O|R8=95@vv?Sra@B1*l{yD@ z2p?^;x4CcCElj;n`OId0DXE!4lF@7hhV|R0oRR8^S)HUCp6)|^G6b8jWv4}?v4JUR zW(H6JVIzc~A!h`vL?+`3P}X#sRm-$=b%$AL_>60{Si#gj!Xsp(A^rrS-6(`&^NE|Y ziBy>J3xyOGR4^RKILi$z5>TeF9D{ee@8`#TGq3vGy*BiMWGDjBKS)X65N#TZK=cbv zaDjM?J(&7|oS?aq{E^+VZFCJ&z{Rb_t0LHe6^Jg@y1HI;&*W{i8i?pPbzHX`1x`u$ zGZC&TSspnEX0wp1T}V7ke2SdBH@Zruli%pM?3Ab$FE6Ira7t-4$La!M7x$PFFC%}r ziEqN(+X3WFLxY0qZ8PZ4Uom`ri~Wy>Hrvs8WOrn!%-s*@6NKIth#_8%>8~ZSYOU?BimSRQ{`kWh18oYIWet>t1nslc-vG$#{iEYG|6j#p@qam}_p$}l=jiy3HULfJS5^d;y9F?+mbC?_GLVj0 znP}JQt1=!Vk+?wShq!4MV46}Z z3o3g!EZxUuphIyJQTMqUIq;8ToLoQm{>&@?X^pOf1lX$opSbql!=sb6{I`H zb!`NgUj{VD{Jty!G+vq%cwdG9-S=y2K*uM@|IsIkiVUVtGm45KjM46gDirPPw*XrB z|Ka|@u^a#G-P8Qh&yonTwzFd2@!-gHo zqaBxejo4KN4a8h3TCg{^DGN|j_UQl;IERx(+Gh3VXwp}*=V+G$X=-z?7@dp6xEAY&VEi^Q_|;BphFFUR89$(~EP1Cu9M_MY&gGN*M-Q z8LH_Uw^zFlt2v}$tR8YQe)jNr2yVtGv$_?FYYOi~vG>hW6MbwU#`V<;&gGh(47i}p zIKS&UBSf@IaE%9@X94p1)WKWWe)^t0M|MU(K_zvsSICR|IqXQ z+uJ`mT+9Efc!XTf8SDh+OA`B?`O~kaPn*y$Y(kOa&p(H`X9I8@K~&+|f-LId)aKRjw{bL6A=8+HY`^PO3h1 zYwI{E3PBZ=B!Fi&+2K&wq}O-S{7Shl92M|4N>f?EecG{Wbtd z;U!9CVm0x1?OqN5%rZiSq9|$@FB+=dpRBN;xzN?Py{%B_aZg#RfHeywL#xp+A%z|6 zRn8@Mr~M`aP$MFud2MK9GXawf7PqGD=eow&n23}TwWtSUq*hXavH2TYtK68vVNm(C zX}9m~sHrn|fqlFd1%j}yRxJ+l{|Tay5xe^Vrs-L=faVMU)x!S=M|)oW|C7CS{-2dR zLZL8tBtJ-j1p+Wh#L+n8{$drBi);#NQuXaQ6@g7~ch}*hy|%tuEDWh>QJ{>bx6-J} zxC+lfm?VIqSZwpfjgZ!bn(rv-HboW$t6A>;_05Zl?d$&;-*V>;{@OwQ8=MU6^}ly= zyuVDHWl$Vl7p-x3x8NGw-7UC72=49>oWU&++%>^1Xn+KF2=4Cg?l67l{chc=TQ&1z zYJN<2Po2|yul=mmoseNb6gw$rf0h2r&ze8F9hLtUR)|Vcf&@4A(EDSKYucS_DsHfY-@W9aPR*JQ_SP1hWz&@gmA5JR!# zhS+1GqZz<5Gp~Ouroo<&qYf=G!yQ)O8f~6eTy2=dM;4*?CyoyD)5MtgCZFC%~V9_naX!{G?xc6!p`RYc1nMIyLek{3> zhoX;g7FmEx&2)i<`mL!J@D~R@kU;>Sj+EW^-;jDF|KN6$j{V(tGAO>%;kC!TApM>l zu2Gf%RQ6OWfAO-pX>bYr2d5WYV}0(W!%h4_17>f!5FUQWQOrK9VVza3vm-{pTRa~A zs!cO^oO6~jizs1Fc_2S)-K&_{)mE?-6NZBN_k8Q`f9MN0B6n*y{wtfG`z^}a`Z1Ad z&Z5q)>R4@-vu(D|3lF#_(a41$UJVt{d(I%hfmwY5z@4OkziazW zlHQ2DS1aA-Ioy?|B(JRtrbu&ztSGB8x5A-n>tEI#j#75~v-M0TS&6=Md?^KSl$H$(obu=xgveoa@ z`}v)2dHhhl*$(dVPI9NZnB$vOw4xW7++ESo--9Hw7A&1SMv_UW1&V$;G2AqDEAg z>^mD6(yB@g{8beNG>S%LMI+pgdh=(U0|V$AlLd8IJ+ms;(fWz!2}(G^d-zKO;GQ98 zzK-dth&<`WP)nOT!1;O~Y50SfKa3C3)NQ?hE-5}x)I39G0;g{o=+DL0!-UINnT8v1 z{^`Npj}*XTD6J7S(2UDl^?k~nG(f9m5aoLAy_wzgf1?wAn7&Zu@MPNWqcjpX_IitB ziz>7yK0^nzzFFVGHtD7E!aMQPJGFe}qtP)E*lQvDxQzAegu+cr1F4fL{WaNu2QDv7 zIYP!E%GsjOA_Sb)u{<5925Q~_pSr_*;6uS#&G~=&4;bWJmRnG;Jf!n-=#ttBt#_s|Xc*0hNk1 zPuWi5?5#28iOopnBkmN{_ckBZxqRD&(cu;Tl#-W;=SFIjZyH6cEu`sa|3nzGQ(DC( ztwsh74&k`O#A-XUMp|v49VYN7TzPx4CB09y^IWa2^XCgMoDlYk3zafq$i_OTd{t(S z;oJhhx@n`EHkz+hNTa&P5FBg3CcXdhtCFD0BDj|Nbf=vjgj}g5kGv4OV;6FK{%7e~ z&E`m`>?B!JQBQy?BpMOW?!=MS3{J+$*GIKl1Tjl0KoMxzuw^xc?l7lbnUC=K@ zu7y>ZCYG||SuG}%3dV+pa0;VS{`&=D9k#sQP6_^tN&fGb%_vy3zd-#)pv`#Uvwl+h zU$1#R#}{I@3_hiGU*7Q(n}wAG=l8dg955gh#gCc={pAjLPoaT`{NU>^|KWf;px7VA z!_$45Is3)W5BDII;pB0sbvQ}#kZo^($SXas7Zd!$z=ujR`((3M`LxUlS8k#;n_jh5 znNW(t>WWL&86moo2yRE8aMHI`pJWg3?$kRiGSao*JP3@Wt%hyq-wxweV z>ZcXA>I+7TWc1OFt_e(8l7u$2^j?)8O>(*QSKH8+o5;(QFv*M+)vH|7z2xt%Y%*oC zM$}PrJw7zf2gaKTvM=49ZP2cW1g!~<}-JhJ@&xbY@f z0ie4b-b8D*Ogb)>r=Qf4nz%iu28l4qju?8Ae6Jujzo$Fs=!sc71&wP+j)|~QwW}D4 zHIR9o$xrk+ED)vApo#IvYl|tVn(WcR1&Sv$U27PI)y@HG{W*70ZJk~4zE?ZKY(ixM z0w_ld53cgxs@tYETZS5dXD2`wGOxst*eY<8 zQh2l66H$bsiIIozlxm^tVpcCq&@x=Ah_JMm)Hk@3rb7flw3kUbZ*9Y(pK%h})Svq; z`oVapU2%qa-6(VHi$6#Uy6Tz7$B^v39zl#0DD$?VV&Ab!k7*?)bA!0H_X7HitOZFc< z?ExLHm~8v@&^L`$J_jR;BM-9bH-qkD{ta~?TLFEZ0es6N5$+8?#ZY!jZMfQ5Rb~v} z{*1V@@sDh*`ZM3N@Jcb{41VmH-uS;GG2k{TKx2P0>S_E0B95omkRTwK?*Hl(!}xCb zL84)LmR~)H7u?~YIfJYjcB8KKl<;SF?iN(4n+M6YvDFYZU4;}APu&SX{Q>0e%L1NE z{Y*I&pfTa1T;P(vZ@|Oy&KGrN!!8HhI0YblnD~wGd}Hk7_O0m`D?A631l^yZ3qj?! z=7ifQsYNJSSaDJ!u`~H?&j919YE1$p%*_pfsu7yN(a*;pIJP!s1ZsI`a)o2lUC;;eGyhj$1+d{w=mM%{Bk0b6dwImo32?35=LfJ0 zS#Py&4|loy9aV&8k&sQkM2%d+X}GIL2ZEPM&y$C<$M{=840_x%doy&?HSiu%1}Q;) z{pa#oPU>71?J2TYHh|5K`*@`?BFw$r%sv{`;4RcD^h;xwN9PB93t8<$>1ss$#l2{V z?j(0Q6Hk~ojD1S zCtBK05o7dU7F?RC*S`CDheQX)JQ-VXJYL~me;&14`TfL0fzKiNv(-z@HD%)<{jst8 zr@h1?FK_37Gog@?>GgpMop9Y>CvWt9z7yZ9#We-(+6a;wkh4$)@!fK2tZI z;m=HEtP}(p?$rRj@U7&;x%Hh?gC={)rVF7rc)=_xRUtll#fM2m`7sg26s|g|GpYEiK{9q^( zDW%YoPc2~iXZ)u;;pYbSsV_J{uT=|ds|N_~T-tpj_)#wUw~v--Y&DDu+q8?Z zn4d4oL^53J|I7I@?cXa;=FcdEhlGr5;r`enZS$&stEOCwD4$D)#ETCgMUAa8a?DRclZT*ANpbvG_s3&50PkO*zu}m`*N$uq)Gk+ zDLQxS#uAy&`EJ7c!#02NzPPw!37+SI6(U z7hksuawwo8=fR{4Xv5oO2?r~1hhE@ywyh?X$V|m|3+T!!OLz^`Y`9t`TRZ!Cw`_Oa zUz`!?dA*>wcv!lJKuKI(yvvoxCj8u^M~i!EL?Cu3y@Op?Y5p@-DFP<|D?S>Db_+Vn zl;Wkkup3_>sGVKNJlieJ#8+KHW)O+!uKwlP=QHyC0nu(B1NQy}6!KI`b?_vGvE>8? zF~ITzlOxj*_4^RQiU1(GNW%drL-pGh`YHaZM`3N2*R4$?gmS(UU0y@_45lLe3n&9m z0dVj~?JxY|?pm_^lk9NbEG@*lx>2G=cn|w#1O&nVC78&hQ{FN6A2+pTY&r7r=KD0J zUO7S|#>+FRjj-ZE8~*gU65;E>e<$&qnof-T-fu(qlxKS?I_Zy1x$5HjH5T}0C`T#8 z{%H`5f*mjRE8SMKwi&v>Ly1njHhqXIB0TaPl&v8mdC0^vN_a!Q6yVf!21LO=f)~YJ zH~s#T*DnF{VQ7lm5<@r-hUpe&1fOsg1Dr(G*2ms-W;g-urM8;httw;~rGf94uoj=e zk#96eZizjSFS#ldhss0ZxGk0U=U)OdY1ttt^fogrXz^ZQWp$P1Om6pGL#zfZX>uDM zX1_@SN=ptu_-6(LN<0oQBTk>s3ia<>V=0HJcMcnO5EHhlN`EYe%o0%wJd)EgYiM@& zs5`7m!ZqWR*i>Z0kP<^xY!OE&f96|>ITk!_IzP2$yQ+AwojMu95X~|v&#t0?FncB^ z;JxyLJNFkNW@`i$3>iMN_0Ca%e8!6sydEWJUB3zah6yX<2-&D5&}sRT?~A+M#yKNm zk503Ae$^kgkNr!Lo0x+pq)M13Ailv#@WxT;O4aS6Hp4o1>HboRpm7kFMrA;+p1TIZ z5J8;p8M^ehvOK{A&%l=H6*=1p`%BK0NV8cJ@HxsB!d2#D0 zJn53|+zL|U%_4Fkt6#a-#XC-Q^s$*CuQ~>su+VI$`)BWN=^PUNSbcP1)Z646PsD|; zmx>8hO;P$2b=K|J@ttMpJ|rYag_yGy6G}N*^mTnA&`8yp(t1MpAGgHWf+V-6Mp)+a zeJvZi1NmIy(twMtjFYRs5lem|q^8v0UgTTFikrVP32RT;cvtVd3^OUE{tewKDXUX? zu@N7mo5HI7b>~Z>(OX3Z5J&c?hC)u&grR@692}~{S9!9M>(fAsgB^* zhm9>UE1n9#nID5m{s)S;$_W8eH$jX3wPC`Jn%Gz4P_garWN04dQ(h6y6gLPpEi*d$ zmbqx&VTxiSoc{M}*~0AA-{;*b-Ot`%`R6q+ z@5yj{k29pJl<^m0$l`ebL)ogHchO<|!rHye>!N>P?5{ssn z+gZ1N`UXP%o`LM**^%BqUEmoy0O(8s+#tz8rXT*Z!$Cf?MFwarn@r@o=w2*7vFjhS zU>><^r?wU|e$#lzcPvUg%sqfUTI_e_Rzlc`^mX+k4?Za^M*bJuKTp;gW- z;u`j=_)7~#B!>zl4vj9Q%HRVo%7-})$#^+f=<`))V$%6{=NUFVssv%L2igIeFUr%+ z*-_?$5fj8UV)mkz+UKO-J<;WJcdF}TJW2a4@J#9vNOOm(8-EG4li4&o4@DS={L+UV zGkzN8kZ>;R>vCmpWeB#hJMmWT);aSq`aFnX6UwbQqe$A<;C$9!|NG6l<-bae)|%QP z&7E&S?n(2cByPwD6LtAq?k=guvR-uLDkjAFtbzHSnd7$li9MLW2c|O^%?9~j`CWJ2 zpduS~(3|=|xgYSm@K6peVBay*LxxWzf{AxwA^$`P<=EcRU~_AfW%B2wQ*G zK{H z{#BY%yY9uqw#W+KO*l?(OW7aynw!Yz500()YSQw1T*A+TQI2K$HAJJzi1kfn4gw!R zJ5NS+dH4Aan+Me^2^mTIhLVLi<9Q_UbM=-(SL+0NI;g;2y7&_}H^foZmq`RDtM(uUk{gw$e|`pwL4kxm zWk2cD7St;`Z}jr@OJ?CeZ8V}7dvRR-&nBBVXn_Us$^K`O1&Ot<#(7SccmY^k}yzU5LfVOmjOidHV<>Ee|zf!c^>5hxnu>^x4^Hx z`aKZmoT<`sj^F4!ti2B4qJpd*&a%p&eBbuZ6IZr*%h8!vS6|7muJegH{Qgf0+IA%! zO0S_}OeKpp&UDKCOSH7+C*tYNHGiAZZ!<*cgzzLgYLqMSAANd`ig;&KA_V9p`W1Fx z#Vvcs|3C0SI7ydu1ex$nd*{K5sv%rvunkG3YX^_GULK`yh0e*kTeFo79fHVk(^5CYu(we{JRm3^gqmtDUyTDDGJ`d7=ri;#bkz z(-wy4rc2;oe}Kz%0fy9d0i*|{fZQlwyGTy2|t7kSoL0C z$16qdgq1g_Et4kaHoP0$UH`Vu-=_Ap;1Z1R6$-*vZlrARxhie1qqe^yT#EIyONz*Nk4Pg<&6sT%kHqbAqRqVHdwey?(oFzqK)r!$YIU;Z|9T z>p+6PQmQxJ>6tXyZXxwAE<-_ckF{JZasp1$TVL>8yfU%T%Guu<$ov>oQ+A})g^yJ{(lTE4a%k2l8Z zZ9mp5o+N7wO$KeO-fT3g8#Pgkf<8ZV$192v>X8HV`)lCJKFBTY6yn6kzwHXX||nBNyS;NBK2L9)ZibiixZ0~MCZ=5yxmMAXsW7bSum&W}f<1Vo(5(}Euv z$#;k}=X?TXhMtllw3jL>^A4~?c^jo?>N~X>{`cZa(f+9WJyBs`lYL=P5%TKHfeela zGdMQhyJ3H1)`Jh@;TH}7-v;lU6(B(k!QmN%uVw)*uxTw8iDJ#c`gR0c-I?NYkWhl% z{<42&cnS*{WTJjfEr-Lgg4%~!I`F4RK-T6`9jc6BRX|(_S+0?>g;}}(W;(?3>ev%W zfyCdwwkD~AQdDAvVXwH|xP2~qE*R;koWcBeMIlCn7=>s$+caB-<=Sxp{><+Mj(JH7?74pZV(2(WFHh3=dCGwJ4Gia@}^bRNgtUDpWr#X{6cC ze4^RoAee~fNw^noJdMkz+gajzEh`-oqBv|lf40V)utV3t)=Z=xp5#sB7R*bP38cK~ zzDb_Nv7xzQs|#voLsq~Z^IP38Jd6Z3UJ+JfEDM}ve_7Rext>_6tZ+D&Dd_}zq>>G4 zwy3{7;G0|i1f$*)`v|bmX7de$26&7VpB8n2$rKBA@F^q$M>Zh^5S87(ffEx8S#Zx^ zrFe9aI6(I@{TbP5MD@_Hz!mKZ_J44CDnD2yymC{t?W0Tn@B0i* z#%cC;g44f7UP%o6P4}4pY~4m#=U8EPm%@amzDU;)$to}b+Zx0qNBf#bsu9Z-4vDS3 z=2CrN6V+!f6GJ%LWeAh3*8UDy<^jIE2~I!~O{YvwLU?OB42)5OrDXSJu8vkIHMRb* zZitwwTS)SQlj1Ej!j>7_Q&$HGLGgUHFR2;SXPVwP9A}wxS5)5O;JU%NO)vDIE(U1y zx31Xlpsr`&LG|I$5GZ)>@Ompt6A1+xc|EA&WxGzzOfp}UUS}`mvLjSFodvcq+PR=i z8FFbRRi6g4=pT9UdEnd2mk)<#;?7DPu2^>hxGk&oR=S>D`X=bkLf=@~Lb%l0B+&#i zO~JmT1=)A#Hu^tv%15LN4L=Rmy~R^RH0&g?kllALlrGmA*S)V(^wcW54g@GMWAWdX z!iSEq2LDxA)YPB0@$_AvuHBntZ@f!4*b}HDvUaS}^=V!|WQ3Q}Fx$;z zAGrPGu8h|IER5)oRCZ3SzVfs)H}WY|iucZc@=Ln>{WCV=O8M8(Qn>vET@{jE5nC0)uL-M|8DuV}>uQiuRQwhBhU~Ce9qA{b zd*RPQ6JkQzntC*SrpgbTw82#;Z$WAHsuUENkJT&6M7X&f97{L_wivkNC3`rffsK~K zMr^zzT-%XryN3G9Gz*j(!*3QMB)7A;nQjW3X|Jq`B)X+yW7@KNsaiS?di!GxIj3c# zvn&An5Y!wCaEbo#@YwO%g$UW-|7)YzN1vfv`W8!It_=A{Oc>1Uj3r`bupq2N;&0=a4`SY?~jqhOnEhF zipSL_MBX|qaR<0~tV@kGbY)(o<8?<%QzNX0{_{)1qtuoGkHgx`%A-#=^bLX9!%zA- z!GF!pTSrAb7ZIu2Hv0aw%hWhwm>?N%jrSx{+ATZzKOVzT8vI2R54Oh&{RL$& zVSSI_+KRsG&1@k!&IOX#v*~S1baz~RXQ2*QZ_iROG+_!uMe@IOYj$qfa$hEq-`KJH z!wKUdMD*vNQ+Am+Dx+ve?0Lnz&)&yo+tE4w_BSiZsZDy>G?)Rfx_K6ytZ9FxB7m5M za=lxSnsWh6RY*=uLRg;{xMf~s;u%z}%rlyZyz_6P(OevA6>j()+Il(=tv|yI-Vte0 z=l&4_r-I!`T93Tcl)V@36T~#MEja@Hrq|iaz1}I#+fD)7y8mKscB?@aJ{djGXs(+i zn04wVH~PUt2xHFt@O=0y@f1^wSK;&ujd`+TZ4hGDRiOVGUcoJ3wHNuzdl%-~J;>7& zg3=g|Xf=XswvFf+>YzYXB0W?)`BvdqnM4jCZo*ns2hGOp64xUcHkfH{oIakD<&!G^ z>_U>6!tAi=$nU73{bNL5JME3A?|}M8=T)cO&tX@Fr%W8~eraj-R?ll);H+vlx{9VY zkE__clj8|XSq@|cTP?V6Q0L`UCtW#hzTsIJulai>0!fre`JS;UIBYoI;Q0CYRQ+Af zq&XGOFT1>RS?w%JN7Z{3Oigro~t z)$2)n`F|ig!kc%QE}~krhP_u^elB-4mQPGOjh$t|2j|gqM;s#3wAi{Pf%lKRH=mB$ z+J)lJ?6QDgFp0HJl8X~jBRB^G~H`OVIHxRGHEPqf-b zOD~)+4<0go#!=doL-(D6ZNuGtESOY92-{giolq4lKHky~D>}SjHOEAX*xH3UQ-X^H zC)$CG-rd#omjyEVyi@(n15kpRf}dju`E#k>us-V1C?H|2Y%O1`qnK1p549d?3}Wc|-Ud zXOq=yc*TuRoTO`YMzeaJ<=v8@7is<%GYFOnBM^_vReSD`-;+f@M&ReC)NO7kR*uik zyex|kni=jFr7g<6{Dxoh0U=fSDpxG8L*P0IAGkd_3UC1aWSQpyc1Rg%2G%+OK@p+V4Zx*%ZvvDj z;lawbqkA!96{@8j{8GvJF)n-rKPEXZXk7@~F>DzB7wvH5L}y-E%d~Tw1i@eVUp@p2 zPb^39&PA=&(mp~60|JD9V_b&V4U5|4fU7v;G%6;Z^X8zPO>?&bAgzwWY-T^#~YmHOL|--hq&QZ|D$kj}1HhcGvK^S9tq?S}Gi3fE^kxkMb)1S~`{T;t14T5XF;P)s=d z^UIf`&Sx9MVBjZx;g9=Tk;nCvmg{=sJ`&ezfa&Gxw3h4Rsq;nqR36t1&1YXIXYew& zR13+mT_aPi>u6Ke&Rp+KkySqTvXpyCrV)<5$s(Pb=Calb!~Xue!#-)_olNF3Nk zN;L~$s(XVA$O=|oHv633fN{LEj+g{4ioN-Is34SEW>?5VTVT#4?J2@vd`;&54B@5J zoovyDuuptF>v8ChyG;h*pPw?iso@^<;`{`g-m){+G>}vZ=!s`qt3J^B@sB6}L@7;J^-_?9- z{an$ySv9@I65i^5D4`kd#9NW4%viG&s1^zpm4cZxDV&yJWpSHFWs7ns!d6L;^5x5> zr_I%96xN0`S@)_0ZJXoWxEGF^ddp(Uhmj77gZalAjVayz=b-^fj*z?Cv{BsWCTXRI z8HrCKjp00`X>P2pn&Gzz{V%+vNuI5pqA$GmL@Z9 zXhKUwj%6@9)PRSc6NZ~;Q{fm-iz;6+i(;pQVcb)fA!&Y>rzV$8xLvhP`u#bgcng(7HI!NNXemKiY6V21>aUKetgRpaW13m zzXgpLG7R%c3ddtAVuJR^*?0T%kZ|!jlsUuxt-NRcSOtWA0$BXaoA^*+2rj?7cG5Ch-e-_1WpeKz($)pm9^K18&Mqf|0a z-K5^YqCmf&s@jxdpd?&K6$xhE$?-=C4sh$AYQv>f7{`=zQSc#tIYPaWH`Tjt5*5pm zdvRl)Hr@YM{bub@Z+@T@Mkk(jQY!Krq3HChsN(Iy@HLgyXL<#3Dr>>0PT`%26^Ux zdR;@G-go3tIcEb_x60TN-Sc35r7zT%ppq&l31yj7r6$xxF)2&XkIg_0wzK1gBtGAK z5Eza=B0o8^IkKgD*wu9t2cheHNAChQvT*)wP!E<_!wM1qCZtQ+^P6*p)N@98geWd8 zPt(0Au*iRUTVpG;h^^o6)lgNpzCrcvw>$XxS>l(c8?&ikqZ1l3G5Og^`5=DN@E#gS zy6PK{ZsWbIBzWgQHW`?b)?*y(*CU(heXkAwqLM22DFsS_*#9`jGT5FcssG0wU40yX z@8ptM(R7p8m-x#G4OP^F$*-rV12l)Qlo)?L)7Mtb*U}T#ke%OsJ4F%;XEes&kR5Qd z;&+W+zBSalQOo|y@Hij&cg|936P0G5grO0p$i~u)1PH;uclbDeV`2?tXTyNkHfY-y zfYT-{VBfJW4RX(Ne*jh0zc-^-WFNvA9l&(!vR)^!1}484u7(QVy_Q~-tG5;YH$}N+u+mQe$Y_z2k7Iy7?YxMU8ECx-^c~`}ZGp16#joeMRIS*}GKU_-52@ zd*%7d(c4%&34Cb`k~?+MO;V=j z_sv*+sKsJ^2ExRaZY7mg6dT_SL&e`_E99&}`E70OdrA2ZwBE^!B>U$EG3NcdZzFlc zr}$@UAJs0J&|w|#lbpsH4B>R)%lFNknzN~AZ&IDjhZ)$QLbs$XasNC?4!LJ7Qv6+; z->ce?!W;dayZ?Rr8%he+;4RF0Q`DCq^C(7E6AMo>|xXl2VQFnZ8CXkP&A&@SrF`OviojVrsdI$AK{JLFpkDp z=uhcTNaQYx`SUJOsVy>y$&>L^vBz+o;CNinVkjmlInbAI_R|d>=M{&nSv`=Yl6&#S zK+42SqJo@%;OG=tc0HhYUA;TnOg40&bbD(e?l=iImj?_*Jh==V+86*pJf7PaV1&;4 zgspj2lZ{`F@w6~Sf9fFXC+ve_j4g4YfyTo{e-=R0+7yWm#TKZG^q$^X5&N93*&X*_ z9qHfLH*Cpep?7w+uH9!?5X9{?Mod2#_`S@-M%K;TU7+>Gbp_6r;BtcYt8ZZ&!$WwZ z&?bv(o~Xu+3QzQBn<*Z2oeUTwkGQ|||55_tgt&$B2Hnxkj@@NOdZ$V}mj??Bit#2v zFoAd!0g;k*?fWe(yobP+kE`u6s30HGkaal~M-RLq>|hlp4%|j>CB|g3%)B1+sq+83 z3HvgZDTWs6tSaHxaHJ=`X zb)^mu60cO|h04o>P3-j|wK%X{!ps)_eiSzrahaD2Kb&C>_hg=rkmTLjl-f#S{7ued(4;-Ikk&C(-X+24HzCe%aE3p( zcr)7KO8+;havqR*1Z3KDob_f%Lbbvkh7_#4fywSJph5^7HbvbkJnf;Bfb`q(F>~km)+0J`)Q|(Zf_;d) znl~gGvV71}?EUwHCz?YNrHFtE&(U4vdCZ_RdcSRd6f>|dnf82?H(4^be;ku0EoB`& z53~$#w0OeW)XSipVzuvF!Lgq0RiLU+{gWx0PSfx{px_qflWh1$I|7H#k30r!JFnU- zF1Uymn`u-NQp!EI;p1JlpI6Vf*Dw@?3+oK}LV_`w- zbVajIN&Ob$jnTfu$YjcrIbI|^eoqo#I3y4i*u^hxHoViDZ5oc}d0 zT@rtn%Sb4|_-0kWt?_7dRSb~BBWcbNrqTBJJqPJD$e)^i7fP!Rhd{KPc8ni+eiY`^ zA2r!voh*f^Bc!*PqWR4dqb#G+CLiUzyYz85K8ML`{F?-w4uX(b|2y9x^C5uvzlHBy zI{exd>V%|TKaeg8MzyA?!2o&}ON5|BaxCxNqs+-=G=vjh-DyZd4Zo2t-~_Gv@9Ogl0+BzaINkcte?DcQ+5^{{mpp)h{so{Qzrf`Z;MXiR+e#pu)brX=YWt@<)c)3=n(@0z zvso0i04`AI7Spy%e~*hZUdae6ZwwCT-=pfkgxRHpatSrrLZ7ckuK5${2YhWoH0<2} zy>2dG_)g9~)Ii4HLuk@xfXIp6b_5`QF=_^A&DhkDlQ%+g6J}GWlL=rJ(vt&co(@1u*3Sp=!5!h0&YEE7uSaW7Sc!_U|+2_hFB~~Mqq|Gld$Rm z?-yn7r)8@06wwN&(nH-?xS4v5_IDY*0i$w+74f>m1Iy2hUpFvdlOf=5*;^9EOR{DV z*d|0^F&B7$3UIX_1rDQDZ$UJ46o9uZB8VWad_JilaABuTt;}vz#`^sGV`)-g4%|7b z@R*UA#p$H`yN;U!C_)PFbbMxQ(}CpW{ayT|qBg^$Z@1G^sOdpqD*lSbh_B}{ zz9J5Kyfm@m{t_0)dOPAlLTaBT7G{r=Mr5m@J?!F_VjmhKbSCn*h$}=$&_oJWxBwLO zRmH|LipP>&U16|L96k#4xA--bnL5r{3*zs&Oj zcH5dAQ>N>Ke`?Oj)ZOq2ynh4L(OY_s-RUA#X#Y~8vN~ka=dRM<0xZL8R0cu9WMmYC zJ6(B>x8lylEZAi#0e;-Fg;lzedM=L#$L0fx&ZC+KFrA{%_hXh9VS(I70R$hVJnc3; zf2B-nhc9n~U3QOmWnBFaigTyqn&x0@G!q0`%Na zeV&sU4bTs=!vF9$Xx!r3yF~=qxX#F3v7#L*65Y2$u&1o{C|n6VGeqp-f_Dq~fcpl^} z)<278?ym=}0 zjJA1Olcf@W$Z;nuOeup~(YGFN&NFC|$nISMtex8Y`9&Rr6RnO0L-sSM4A^vY&eyHL{; zvtohKLTaxqSHEtXCavFGaCQ|AkAcNyXz@Oxl~uyif?Z#qzZ%1@)Q!@lG4%0I>CYn0=HVvh(xl` z5B&&Nuv<1vPm+@Fk~ZEO+fWVmH=OvsmXueYuqc!Ejmrs}rl>Lf@`%)&^{Cr%pdTAN za<8L1m^$T~8jEmn71QW%ta56{H#D#Y_Q+q6Xz}7xplHz$GtFcK7j|jy_H;s2Q%mM) z9vLaIV_&zdV-Ljp8Lj?6?VU?)&>uQWtF66sn~OiwlYIo|s9W-k5tmk5O$%=0GPYWg zsR{{G_G06_maLN&AWeL^uFD;nv@PQiMBx$E;-fsLZfid z8Bh`w!jZN9GqbTcx2hd~FM1j+0__<}(glSmpNfM4IkQI?nmP9f`(Lnm^gX5~3@kFJLAH^qER;x$aDeUJ12miy$2-YLpbVoX15lz1;&X+vtz?2$46Bye{r% zre2HI{j16p53RnRvhHkYnd{<~H_j%?WJ|~?y$5ua$Xl;GPN>RW?gz}<_S=$C4%|D) zoEszSCxDhiG*X=?qc(e!T3F@kCxJ(HcH?&6<$`BO%$zFV@wpBV5E5P;1TB3U!RS2H z84?1~fAkbmD*(UmyswV7)JAR{uxBi8J)5v?YzB`yTs^F#``q5_oTIn;A_fH@vuzr0 z8ny?$-@yC0J%jgea~1)gm!{e2HU>BfAT(6J^I7efZ){*nERX!DzX&l-W(oKI0PH{$ zzp2T2)z9)!JJ{iMdVO%oexM*q;)tJ@SRTrgm?RP3c$LmRAQS9?Tf`m^lDpa6pXq;} zl9@VVXdiSs*EsYzmk|)5B~WLl+BSt@9GqpsiO?%)p6CHmAutKGNsRo&LtqAR$WRD5 zP>+b@v|01|xaW+EQlp52IGzLOO)R#&u6HHMMp_qb)DfXtCQA(8JOtCE>L=PG*vA4?sDhx?ab68*oLpVWkf4k{_ zyT#uBvx@-j005VE0I1XdoSfVKf9J=8t^Q{t<=0;io_3TX#IpM>>b|wTUT$JYrFTw_ zJnY=z&>w2Q0%dR8(N;~v4ggZnG?noRxHPBATk1*^pFa2v{E`rcfKaoFiV^fAm|Waf z@i<>QfVU{1!@LQHwzv}S`r7*FwfLFOba?W;-j0^9e__&M>;sE$0CoDGlcQq(ue0s? z-$)Vb|Hix`6Waiy0CFDfHb{`TZ4q1*6e0iQCZVHL3l4@0oYExC?>t~O#i40DqL`$9 z>4u`FTHXa%T%z5lH)!h0?b>j?6*bg11*6s6c9PkK_R}x%7-*|L)rv4}yiUer{3Umj zXEtGarQFMq)8=ahs-HpXsRnZ<7EkECcQcO!#`+UsclMjMu>sxsebv38=I}B1zG9f? z-2P{8c&6!$#!=P;>E$6%*P7OQCm7y;7fhjWQl__tHH)|vD6L~W7+SbEdSM}8{-P1` zh8a@3BnG?amu!H#&t-(E%d2h=?4nu3=IP5`Pr{S>v9w~bi=KWZ>!&~Ec)2V6`YQ_k zjCh8vVv5>Z;-f1Pv#yDTm;tIr{`2&gG*1<`Eh*AM`p^J1Cm=OR>bgg0RCD%V-Lk>8 z=9jg+`{ME_HIh`wc8!kRE8``-Fni!Pz+yZzM)pWHr_b!V$z5}}8)y6XbF?=q&CmbO zV%Qep0_yZXgOfAc|M%?hWPAQ^qKNZfB?gz)G6=}aUA`ee-xm@7VQ@vHE+hufVgVW- z>w4WAC#!M1-AUQ=c_>dAi@N%gC?DvLH}So;vcJ&@Bab5JrKwI!DoZpTEqU&#XWof zKRMs-{~IZ${wH+=Gse4gb2sY9Ej=bdpmw+zhWy%y+0k`L;`=_3yz5 z-YPqU1vY>>{_p6hu>McC_kWuyivMFtoL=(BB#N=vg~$Fif2k+oG6$xON<`8Dwaj1nuca)t8%~hVaxZwYDelpnR|J+D1`9Gz-rBfIq zA3!fAl-93)tv%*TS6gj}c~fz{r__gi$r3i#*=4HxzBE+6NUhI+P?ksiyW|$dA!3O3 zF*!&L__!Ec_{71OI-y8I2Y>%|p1*6YESew>YE> zhF;b8vFz^K3=FTDUZ126uEJgD+QL}YR@xZd9W#uI<16)176)Vq{zSXk=lwf0H+~8A z5Xf#>tiQHejEd4||CiHXUH88yMf?BrqvP%U??#H)t6qMIw7-8Y$-T75FWaKb&BbwH zyQ}@>Gfk(DJ=V+WhB`xney?_DadWA+2VUvjJ&I%OBXJFsgdR9MRyRWOjumwGyFJkQ zUNB+v;hN-MB9@HH>Ht8c;e1RF%^A6>}s#57c#NZWcD4gc*)0 z*(8vB?&%zS-sjxgCNsH+W-%tFmG3%i3_Cj=AI*X(TRX<2s5K=;3NLHBdF(QGrj^a3#y&p1kUlufysNep~LixC4; z>aXdR%V^HAqKehZ)>cK$maEJlu>!iEnh)+a;W~RQX>ThPa*7apD9pW38bgVl5BffU zfJ&gLyOptR;xWi(JHQlBRBkot=+%N-W3$z2EmCWvC@j{DN?8)MY`x~cb}Z|y^5)wt zHT=Ik;808tKBMp+$0QU=(srUi4gY^UIJD!xAD(XGe{H6i_8-OwgL@cbcpIQ{rEfYl z`o?!ZtIv$R4TbmmsSx|Koy^+ysW(NlG~^}v8=7ZEVyQ)#39ai*k$0!+1(@oXo4wp_ zX?`MA1wX}PW~75(7cMg6mfY#pkH4Y0#%|xR*fcRz9Gqdgp5iQx+)_yI(Riq$thhmC z2;>3sa);(+AMmrq){N;hVO_Km^%f*ev7%H6m0UZ!u0%?wfBF4)_57!98|LL`sL%T% z`J5OS%Rs5$tfi=#0N2;0nAWZPTqBu{<)E4)s~rcvlA{<=RNOe;P5B4WbBAgrUmSM<6HGyeW>=*p;3Xs3Hbf@u59-zMJMO_kzu)U8@cA|KO*sh zPQZ2d{{uV!_tD_+Y-|6yk&<8k(oTNK^{+n{Cg(J-g3QeIm9f6TopLVa%bqmW7yCq3 zdEw1Mz;bLA+E~BK!70q8X}!>p@8@m%1(?jhUpjG_pBc4s&$WrYxuZywri3!>yQTj& zpy)?pUonmKi;(0k%kRHuGLwK1$~%bSMfjEn+?K3V@Bi6V1U>kiFua%%Sk3-_bT}9k z?0>iM|29+d`@eDZq^)4@W%(mh*EbYl@T=k?KjFE_8Mh_^9 zAw!e-fd<#4pYq9P8X-^lJScDi-_(rZFug$2@5P~_n;e?Hy6H#V_egrschj$vh#zd% z>N6mL7!I!@w(9Hk63mzp5%GVZt>#5U{6{u7@}A=^NIAcjR-{rFcLv3Bj8uyW<{841 z834dVt0s2rf_^e|KxQKEGQ4!I>3&X)x8)eVt5SXbhlo9p_zs7YgU|kA&VLQ`KgTBp z|DVC(Hvhv$inN4ydkvm9+N-h&(f31|`=*;22J?5BJ|q1hji+<(au&PlO9@qdDSt?( z?li(jR>=wou{HZ`TdLQ8j3`NB57C3q9$GN^L%sgzY*1MLhiB*8^}mUdXJJ^Jpo1|~ z!Djf7<1rTYsF(tH4{;!_^>7IAm*?5r@>|k$0`)nt&*}zm4Qk=OOUom_=ZL_j#HYSHKXLCpx_fl z0%5ndIH3yK_L8wko6EJ&8=oN7_FFSLQvu^Bxec(FRhOUl&5007>rp$5i4>&>WqFUl$#?B6blGw&{u z0b2uq&8yS&b#d7+}{XA&ec^oAs%iuPD<`Jv`WX7+KB2Xh%d*D$)P7f>ynbK}0OMXMB1Cq~d0frS+VEq`S& z^6$%xQ|e4sQU^XU5rwS`M@&Q~)x%P*lPaIEbi)(0gc(YsUYE>OdqSGF{3UbPH7&DQ zSvq^!crjsOnlmbr4UFd^aEU{8w{zZ}drDGyHnR_!ys_2?v)%33M03BM&%~cZ|sy|5g|PW6glMfz5r3uBRRJ> zt%E-DL0cj@Scm3B``SF!w^SPP|9qF_d&JLjFT*5kAqUj(|HtQNw*B|f@!8h@VN05<{u=tj}bcO_y%|41+;H9+3Z;w;|&m$a8NN zvM%USeiC+lbl(MCl@_C$KLjNU)K8zKfO*rOBMy;90cNiS)Prty)!hforX*qMv#!xx zT3@99|2(4;@rl;WT!!L&2YQ8oKhZuA42jm4Kp<;~w~36j4<`5?g&-m%0H{9!qk~z< z4j2sY4k(!+UUdX8RbM_#QH&s!wMLvD%j%DWk`5~@&=)w10z~^FWQN@Zt!P8PfL&p2 zpLTfAleF)F-GG5z{rEQ!ps)vy^Pn_1p*=FlVmGIgmXx$t99auj7b-`^+D*`DfYKpH ziTSsmWu(5(_atzj)~c~ItbP#z5x;*5se>^2#jzmiji#%eZqv0dk|-No#Sb*w2I^Ug zDEf=F=#jPLv*ng*X7j8032*7M4#(tVH|zP&;hJ5T|t=$P_-lK zhD(^fbYw(?#Kp%(e7^kXX!ji5mHgEeA2HF;Ma{5P4}lYSaX2mvjN# zLW+DqLZEaD)y7KAv<8+wt9FBVVkj=Opz2ed`Hy4RXamXa`<~=9B^p*L1UH1`$d~i& zNTX`~uOsbyT59kA&(7`q?}P3A&t}RFP{F@d9(Ivn{H+WYdhJco40SsDRwCb_NTYQX z;~9+SLoj;sQxXJx>5RmScWjDcYChk8a$SfdIO^7e`40x*|SZ z0Lm5dHH1`GC8|6(Z*0`-F`m4EQ6510IO~xYBWB~OBRPp09t;pL>>DkJD7LD;{K8Ni z!T?-`48>!SGkJu+>_2&*MI+po`|qgJc?N#cQC`9RGcd~65&>mXxE6X0#dJ@`Qe@MZJOCI1A+tR4P4N#@)c)@ikFMl(ZuUNS?WH0cy)!K;AW!a(SaUdRhX+L19*iL{mmbV`!I7aENa$?(&+A{=ix zK|Y93tOJR6egl6)b6cCzw)_SF5cv@KpYQeUAbZ^t;@O&jHqw{88z*|l(9&4Krd&}oN%KD4^tG1-A4+cB2Bf- zKCdrJ19Xpqx(=wg)K@yn%L+RHM$EH2pu>NsQDw@yp)1yofU4MF3|e+zlx7JZIXX}| z1}5^g9f(j&F=Z&M?L^xSXw#HYZVF}1Rd>Ry*kBFd86t^m2g`N9+J$PS&^1Ef76s(N zu?BQ|>QjXVqyrY~7Ibo*kse|9C`42_WjPk$5F8GqO`AEl)2I0f zGX$sNsXYq%x!t)TI8=76_-i6@)B%9Ytt^RJqj2iP;HU(Hvq32xMx&7$#h1$Jz!*2l z;108>Jpzn~IxZM&{gXw3491z}93eB5W_0UX0ecn(Vldi6!1>`$hxawNa5(goiyZ>a zbaFE1*}@@Up7B^#P5Gk^02UK7OwD3b=*DEWr*ri{md&QJ`BXlm$|iPUYJW|H@ifd?rP zI4MohVoD)H1(eqTx^{j9z$n19?Zhyl?h5}q&2+ez6SYYM{%aJSCL9mEreXA1#J*HPB^I zj*;NrRk%L~%8M+&YM{%aoJA*eezX|M)j(H(vWkZ2MtPwfqZ;V4DD!D|5nxE2o9Kcl zR|8!ZWkv!Nm)^TV;`l7N& z!{7nVDPZtUM3V84k3tXi%20+0Bf{1?Z!mU4?ohb!CRYt~St`pUvSJWl#n3}nIhDG& zzbx0WmQIXHpe<1D{MY}yzYlKSy?8eSm$N7)BBpmL2~)7Y|17VIHMMv*{~Ur3H_zQM zxquFebut)OVX^-F3b%-#1x)@#R^I0)eJ7(be_A|VhcYaW@-A2BSoSb?QVhX`n2H?$ zjDWOCbN3UDDU)xqfU`hbxML!f5K$pmGp)kGcvEwFeEs$4?z#E^+n5UO_|9 z6?)E!S(^2!a$*d@@xZC2x<+0SV>SnBZEiJEE7nLEOKz>YspX82)~kogZID#WIDHs2 zque5bf<3n@X;*??zi`L7KJ;=?b!bcU`d1$=UzDM@$U!6EIYh!Z2}2xC0Hh!$g!LMt z_uAY8dli!;dYtH~ z*g|}8f5HKxbIQ={(G0He>b;8bJr2+Wz2t|Pj{5l+(2F!?wkhD_K#wBNBeUo#CS#nt zJXmmBUMqTimYT0ExbLkOy(p#P<3P{MVUz#-Q4DS_#SZlS9C`~#{p&=}k4f|x(2Gc| zN%1NfDwj^U2EG2+d6t>zeYHc)K<~NmqbRBmzvjy2=+PvK0wjDz0tX$x^4#mwIrUh% zbHn=4Yo>T{=v=Jc3_AeqfPKTg5a=30jL<6}7aoj?kDePcdJ`CMaF$dw%dG4|XRFDh)S?Vd)L)U2JpFR~mar=snO@HHe<-!0(jUUiQ%k_6AQ2(d z*%W~>;ad&=<&p3ng<_Y^JYgFCzyJ*AY|2{{q0~51q0(A%I?1qV zV0RS484?YTdV2t~A1L@&LK%PtqW#V#e+~mm0MuWKOL9tPB36)e^=5w?w3=JeUzb2@pM) z!4OVRd@x19Y+q_@4|X!@@8eM7h)LK}<8OG;<@`;Doz6b^$jKiN=zrSPe`SuzJzgO_ zwLa~pe_B&Q3pMKi4 zpI8_wC4Y*j`mJllx6u2v%l}QkQ>Gf9cJ*JmH%3qZRl|6atEpoGq#*%R{latoRY(}3 zpLWH6;+Y)GxBT}|xdclUA_dTk38msp`Mz zOU5Pic};QMc`H*4Ll61jc5a}gXR7dr7!|>dfa(Fq4hE9-IY^>O41MVs(O*l@1k?ZD zoaC!)qb~mE;M|J;d3bz&y3PNzk+PG;C24W-ReH(gbi&sRW5au{=677p?z60iO|P^B z9_f;(rH7@;&|c-bSe{hMr(DoRUw3+XASi%Tg!ZNeMY6@2olENmmGTysix4NCAn#3rywTIRZ7n#EflFJ~|~n|0zuj zPDKG!w|C~GsKLYxQm_(COn`ZGYB2F3gDvKXd{8xG1wds*kSB`v@4JX11Y-)YJoeLr zFRiU*R26bcgv>{>ZXrn0Oa(~-yRnQ&B>J^4qKl|M&3e6Z@3geuup`wV2A!mIu4b~K zpD_K{3QlMZ-OwD~Y>R`^dGsw99RLWMqIkbqw+c{xOBElpBw!c>I7I0qq3)3Fa2e-o zpI+OtY_a%1Tbf!)8#Vmj*>NHN-^uyWHvZp6%1)+N?sP6FO=d{?Yw^uMDSW1o0tliQ zjqw-0-H)_j-cN;fb;3l%zmAYMYH38(*k-B?C)vtWs;y;IBPLRx$4V#P&ombf#;w(T zSQ-DQE(jF+n9-pEi5$bAcT!=^B*Lqe!Yu2FzIM&jDLt&}tQ4UEK>qm&Y|VX5E} zG+;z1z?x7Zl7SzWp~N*}cGn>VCg3_GDD!b>%n2KboM7Qb;$ez71Hij32Ny`7Bo=Cv z21qbA&rQsgAi;rVDAe3^k;K$=9=nbGNw}RK^NNdX%##a;9niIGb?U z?O=X%hepbQVgs@in~^2A2M*;=yL;&q3Xd2-es-+3e#!i%Nzsqu;Kq?dq`$7h%S z+|&B?5#VX-|uf#6U~cT{#VSzirT1=|Bnt&2L<{6@OUf#Z=&pgi+Dm; zC;C@1<(67NZvHoht@JvXj;1BYoRk|Ut%C(=#j5Z%s_7dll;q@5K}=yUYOjEkF7 z1V)@RqdxdR(Krc&e3eiXXC2|_2zKDrhs(8!p?!hL_amb4?hN_ACJa5o!(6(x{q)85 zIDW*%eg0<}hE=ptm;dMNEOk=D}<$}31M3Q!L-EKi=%;|E6 z<_FShs!hqE+E2|6|Ayx8(b$FRGE}{XF&6iuLL#kgtPQID(2n|5qlY(*{z|Bt8DSQH zFNNxzy)V?Fnx|?dss-Rnp^CmlF!bMv6i*@qTFnJ{9@Pa9WhsgeHqq@ul5Kv{_?FC8+ zsxZPoqnH->pdzZ3RJBkogW43;&NI$%;+TXp6tZ+|sF^Nigu?q#>Q6;I81fgK?eG&3 zKAuU-na(qCi`WA~p|p5b)6H;XqFj&FZ)VIy~HBcQk3B4X)rF$6Qjpbr`BJMqi5)gib)+~AE# zss2Y<=&hoS8vV}+e^=1|pKkR(n5|2aI`^8cGClKAh%?F)^EwH>QPVDom3~nkinr3hrT~ z8XBc3LUp&VpI^LwDa>;Dldci<#MB!9thL77rs`zb+G9{DulKMQ{rs*Dd)_1au$L!l zszJ35QFLqg_Wa*O z*#STCv3?X*V2vXXJ4zaq*ilyPGE}A?Y#raYSy{P1k?25ra#+I`v2W?l>@@?{!wBdHI&py9@dGX@&ySK0Z@%jC`cf9?>kus_k>EA}~ zbPXdwVlXljK^W>@4w3rFVQp3k(+(cnJEmkMZyG$^kBphe#P;8_5R(5 zD}nJVj`0nVy6v&9&au!-G9o_MeTk(a-B`ZrwUH51nkO%UmD&nkyubYU<$Jy(T>NNw*9JxD2@gi?8$gSJk&HpT7x5o~pr@{%pz*SZ%o6k`t_yhRV6 z|3TuryvSL|l$#adX%ruP*4frWkj=G^aXi)V9Hn||D`>!`+-U?cc?;ra&DKu+oe76740?bfp*T9 zXxI+=I!ZrBLBQ>S@__kP4;FIQH$<|uO?_$BbN3)3**ucS=`5DO=m95A+a5^iCuVyl zS|*h<%$Ax(Q$pFIvnbz#^e>|a9Qq!(`!m&&n^X?HdjT%57U-CJ3=CJEC3`SBD2@S# zzOo@G83V?mzaZ$Nm^R&u>QY#kV_-nXA!jvY>M#&N9Mjf)TWe5@Eb`;`BYviR%FB@I zn6L#)nMsrHKLy7UM;r`b2EE9G*TJj5@Y>ngg?8u zg+W>JB4PI4As99(Rd>imw7#BzS(NBn-7wb(pQ|eC7h>fu)s(29go%;GWV?V>!Of^u zmWrG3B4VkKCc3jSDOt@VwU-C@9)*b3kn8bNiIXPni|AWJ2ohD ztb|Mkl|(dX%BW=O zs4Qe05hWD~EVb40RMP69R#aM(63j&pfej?aazsQq|~ay=s~L7Y^x0`qmrqwvXH4h;~Z2fQIj<(i=J`q)NQqM ztBgvNOMfC~FbrOx0M4(GM?#-ER$MKWT<`M6f@2s2x6r#&QXB0HRBrGLk%U>8xsa0f zkXB9}yAlooRe!cEl~jsQjER4p1HCdTS=NYc2$jc6SuEyPT&~6v^l3mPCUMM>X@yi; zlt>m@E-G17mL*dqmBtVUNsMl$F``ov_^YMTqC_fS^?UIepipNyI#p7MCZ2~VePmQB zVCA4vp^ibN-Bc9j455}~W(j2g1`klU&4a^Uo=R)HEKw=3zMq>C*`fShfu^~AgHQ$= zo4zi!ntoVAFrMyvR6IHyO5boOpSpUfRxY)F5kC9OvQ?9NO4|{K?>~k>3@a zRqQRnS;<}zg-WUFqx}#uukj_+cSA0Sm2v3U>AM! zE}rGVBUEuZoa7uNQ+73bU3H6sJEp!x)JPqQ6hmg z55G}~o&e}z_;c@_NR}WtLo*W3TOe42pMqD=l-L#AK}#}#0iIz-E9PLOYo!}W1=Db< z%v}(Qmlc!Hg`gf_#}HQ_ScRT3!Y%~M2e<@5MekM!R^n%juoJ=30oGop(3>hvCYwSA zu*{%rL|+k(bZNUI2A{ikpf6L7$7F z!g}9A6a~Z_b4fPoR$D3?_*MfzUk)#qE!u1jrYd>ly-Y63MVP9B*|mqJqzL zlTg$|eiz)%`BR3&iM&Y>B%)w<$AlpS!b#u})>ejH+;ResBb0ym1=1hlcR2pXGxuF>GLjlHKkon^Wl(6=msu8h5NgJiqY^p2(P@^Cf#i&4LW~?06%Uf|eXwgq&M>uGa-eWC8i)OJp zGBli803jl#RaRloT1pEMIOFTnLZV?1qeu%`Wd+1=(!v?7Maqf!FyXCf(U1ym1d4KH zNyQ~{O4>-lARrG{F}}wEnxL1|g8>wK_R_RyMvBt*3u=_onhR0GMTPgZ z@;ow&u3|FAxqu0)StHG;VIkqxc3YK}TqX6iFwFD|sZ!e0Vi7_}3|xwJS3O5q$oEOe z@C+%@Zx6iIp2U0LLnvY$hT68gh89seKk~H5vQ!I=aN2;htL-hpYn32S?dX zsjYrfe0$lvXs++KkYBylzmz)S7T|IWV75buc$o%kbOVu zbgO51-M7hWISidrF?I+}&;DF|C8RpXJExT6fL|s8xbjbCEVAouezChFEW9p@m!Lip zCWi-%9HYB6GZUg%M5PbY(J>|37Wej%l`n9-H$OncMd8PE7R)P1+=E)w2 z(G1OQWil(hJaOm+iI2eO`Nh@eky2ImJ3o;aAUTisoZ$4kVcyswSP4RS#z$km# z|HIsLxb^=G#WNg=nYaQAu)6#|M<<82{nzo~*8XcFWe413WBoW(|4l8xmW%bbN~^8~ zb>adCW2qJC(9}w%5M#*zS}P7%SoCLzQaC{>%l$H0fD9}YQ0cJeHYagoK?3YKOq!O& zLPB-fEv=EoGBEj$*ejz~`E%ZwM?-MnqkHpM*$>FXSzCAh;$mFWk>;sN-g@?EBzz?#>|2GsR4pH ztKtd-|3U(vW;s%&Dh5~QZmdVJ5K*O=5xE*coyAwjIiY~W;DroyLQBZm3c�qQGtS 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 literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/mumble/ci/basic-values.yaml b/library/ix-dev/community/mumble/ci/basic-values.yaml new file mode 100644 index 0000000000..a25ceb99fc --- /dev/null +++ b/library/ix-dev/community/mumble/ci/basic-values.yaml @@ -0,0 +1,15 @@ +mumbleConfig: + serverPassword: supersecret + superUserPassword: superuser + iceSecretRead: letmelook + iceSecretWrite: letmechangestuff + welcomeText: Welcome to Mumble Test! + +mumbleStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# Enable probes on CI runs only, +# so we can check if the container is ready +ci: true diff --git a/library/ix-dev/community/mumble/ci/cert-values.yaml b/library/ix-dev/community/mumble/ci/cert-values.yaml new file mode 100644 index 0000000000..b6bddb0346 --- /dev/null +++ b/library/ix-dev/community/mumble/ci/cert-values.yaml @@ -0,0 +1,104 @@ +mumbleConfig: + serverPassword: supersecret + superUserPassword: superuser + iceSecretRead: letmelook + iceSecretWrite: letmechangestuff + welcomeText: Welcome to Mumble Test! + +mumbleStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +mumbleNetwork: + certificateID: 1 + +ixCertificates: + "1": + certificate: | + -----BEGIN CERTIFICATE----- + MIIEdjCCA16gAwIBAgIDYFMYMA0GCSqGSIb3DQEBCwUAMGwxDDAKBgNVBAMMA2Fz + ZDELMAkGA1UEBhMCVVMxDTALBgNVBAgMBGFzZGYxCzAJBgNVBAcMAmFmMQ0wCwYD + VQQKDARhc2RmMQwwCgYDVQQLDANhc2QxFjAUBgkqhkiG9w0BCQEWB2FAYS5jb20w + HhcNMjEwODMwMjMyMzU0WhcNMjMxMjAzMjMyMzU0WjBuMQswCQYDVQQDDAJhZDEL + MAkGA1UEBhMCVVMxDTALBgNVBAgMBGFzZGYxDTALBgNVBAcMBGFzZGYxDTALBgNV + BAoMBGFkc2YxDTALBgNVBAsMBGFzZGYxFjAUBgkqhkiG9w0BCQEWB2FAYS5jb20w + ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7+1xOHRQyOnQTHFcrdasX + Zl0gzutVlA890a1wiQpdD5dOtCLo7+eqVYjqVKo9W8RUIArXWmBu/AbkH7oVFWC1 + P973W1+ArF5sA70f7BZgqRKJTIisuIFIlRETgfnP2pfQmHRZtGaIJRZI4vQCdYgW + 2g0KOvvNcZJCVq1OrhKiNiY1bWCp66DGg0ic6OEkZFHTm745zUNQaf2dNgsxKU0H + PGjVLJI//yrRFAOSBUqgD4c50krnMF7fU/Fqh+UyOu8t6Y/HsySh3urB+Zie331t + AzV6QV39KKxRflNx/yuWrtIEslGTm+xHKoCYJEk/nZ3mX8Y5hG6wWAb7A/FuDVg3 + AgMBAAGjggEdMIIBGTAnBgNVHREEIDAehwTAqAADhwTAqAAFhwTAqAC2hwTAqACB + hwTAqACSMB0GA1UdDgQWBBQ4G2ff4tgZl4vmo4xCfqmJhdqShzAMBgNVHRMBAf8E + AjAAMIGYBgNVHSMEgZAwgY2AFLlYf9L99nxJDcpCM/LT3V5hQ/a3oXCkbjBsMQww + CgYDVQQDDANhc2QxCzAJBgNVBAYTAlVTMQ0wCwYDVQQIDARhc2RmMQswCQYDVQQH + DAJhZjENMAsGA1UECgwEYXNkZjEMMAoGA1UECwwDYXNkMRYwFAYJKoZIhvcNAQkB + FgdhQGEuY29tggNgUxcwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwEwDgYDVR0PAQH/ + BAQDAgWgMA0GCSqGSIb3DQEBCwUAA4IBAQA6FpOInEHB5iVk3FP67GybJ29vHZTD + KQHbQgmg8s4L7qIsA1HQ+DMCbdylpA11x+t/eL/n48BvGw2FNXpN6uykhLHJjbKR + h8yITa2KeD3LjLYhScwIigXmTVYSP3km6s8jRL6UKT9zttnIHyXVpBDya6Q4WTMx + fmfC6O7t1PjQ5ZyVtzizIUP8ah9n4TKdXU4A3QIM6WsJXpHb+vqp1WDWJ7mKFtgj + x5TKv3wcPnktx0zMPfLb5BTSE9rc9djcBG0eIAsPT4FgiatCUChe7VhuMnqskxEz + MymJLoq8+mzucRwFkOkR2EIt1x+Irl2mJVMeBow63rVZfUQBD8h++LqB + -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- + MIIEhDCCA2ygAwIBAgIDYFMXMA0GCSqGSIb3DQEBCwUAMGwxDDAKBgNVBAMMA2Fz + ZDELMAkGA1UEBhMCVVMxDTALBgNVBAgMBGFzZGYxCzAJBgNVBAcMAmFmMQ0wCwYD + VQQKDARhc2RmMQwwCgYDVQQLDANhc2QxFjAUBgkqhkiG9w0BCQEWB2FAYS5jb20w + HhcNMjEwODMwMjMyMDQ1WhcNMzEwODI4MjMyMDQ1WjBsMQwwCgYDVQQDDANhc2Qx + CzAJBgNVBAYTAlVTMQ0wCwYDVQQIDARhc2RmMQswCQYDVQQHDAJhZjENMAsGA1UE + CgwEYXNkZjEMMAoGA1UECwwDYXNkMRYwFAYJKoZIhvcNAQkBFgdhQGEuY29tMIIB + IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq//c0hEEr83CS1pMgsHX50jt + 2MqIbcf63UUNJTiYpUUvUQSFJFc7m/dr+RTZvu97eDCnD5K2qkHHvTPaPZwY+Djf + iy7N641Sz6u/y3Yo3xxs1Aermsfedh48vusJpjbkT2XS44VjbkrpKcWDNVpp3Evd + M7oJotXeUsZ+imiyVCfr4YhoY5gbGh/r+KN9Wf9YKoUyfLLZGwdZkhtX2zIbidsL + Thqi9YTaUHttGinjiBBum234u/CfvKXsfG3yP2gvBGnlvZnM9ktv+lVffYNqlf7H + VmB1bKKk84HtzuW5X76SGAgOG8eHX4x5ZLI1WQUuoQOVRl1I0UCjBtbz8XhwvQID + AQABo4IBLTCCASkwLQYDVR0RBCYwJIcEwKgABYcEwKgAA4cEwKgAkocEwKgAtYcE + wKgAgYcEwKgAtjAdBgNVHQ4EFgQUuVh/0v32fEkNykIz8tPdXmFD9rcwDwYDVR0T + AQH/BAUwAwEB/zCBmAYDVR0jBIGQMIGNgBS5WH/S/fZ8SQ3KQjPy091eYUP2t6Fw + pG4wbDEMMAoGA1UEAwwDYXNkMQswCQYDVQQGEwJVUzENMAsGA1UECAwEYXNkZjEL + MAkGA1UEBwwCYWYxDTALBgNVBAoMBGFzZGYxDDAKBgNVBAsMA2FzZDEWMBQGCSqG + SIb3DQEJARYHYUBhLmNvbYIDYFMXMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF + BQcDAjAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAKEocOmVuWlr + zegtKYMe8NhHIkFY9oVn5ym6RHNOJpPH4QF8XYC3Z5+iC5yGh4P/jVe/4I4SF6Ql + PtofU0jNq5vzapt/y+m008eXqPQFmoUOvu+JavoRVcRx2LIP5AgBA1mF56CSREsX + TkuJAA9IUQ8EjnmAoAeKINuPaKxGDuU8BGCMqr/qd564MKNf9XYL+Fb2rlkA0O2d + 2No34DQLgqSmST/LAvPM7Cbp6knYgnKmGr1nETCXasg1cueHLnWWTvps2HiPp2D/ + +Fq0uqcZLu4Mdo0CPs4e5sHRyldEnRSKh0DVLprq9zr/GMipmPLJUsT5Jed3sj0w + M7Y3vwxshpo= + -----END CERTIFICATE----- + privatekey: | + -----BEGIN PRIVATE KEY----- + MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC7+1xOHRQyOnQT + HFcrdasXZl0gzutVlA890a1wiQpdD5dOtCLo7+eqVYjqVKo9W8RUIArXWmBu/Abk + H7oVFWC1P973W1+ArF5sA70f7BZgqRKJTIisuIFIlRETgfnP2pfQmHRZtGaIJRZI + 4vQCdYgW2g0KOvvNcZJCVq1OrhKiNiY1bWCp66DGg0ic6OEkZFHTm745zUNQaf2d + NgsxKU0HPGjVLJI//yrRFAOSBUqgD4c50krnMF7fU/Fqh+UyOu8t6Y/HsySh3urB + +Zie331tAzV6QV39KKxRflNx/yuWrtIEslGTm+xHKoCYJEk/nZ3mX8Y5hG6wWAb7 + A/FuDVg3AgMBAAECggEAapt30rj9DitGTtxAt13pJMEhyYxvvD3WkvmJwguF/Bbu + eW0Ba1c668fMeRCA54FWi1sMqusPS4HUqqUvk+tmyAOsAF4qgD/A4MMSC7uJSVI5 + N/JWhJWyhCY94/FPakiO1nbPbVw41bcqtzU2qvparpME2CtxSCbDiqm7aaag3Kqe + EF0fGSUdZ+TYl9JM05+eIyiX+UY19Fg0OjTHMn8nGpxcNTfDBdQ68TKvdo/dtIKL + PLKzJUNNdM8odC4CvQtfGMqaslwZwXkiOl5VJcW21ncj/Y0ngEMKeD/i65ZoqGdR + 0FKCQYEAGtM2FvJcZQ92Wsw7yj2bK2MSegVUyLK32QKBgQDe8syVCepPzRsfjfxA + 6TZlWcGuTZLhwIx97Ktw3VcQ1f4rLoEYlv0xC2VWBORpzIsJo4I/OLmgp8a+Ga8z + FkVRnq90dV3t4NP9uJlHgcODHnOardC2UUka4olBSCG6zmK4Jxi34lOxhGRkshOo + L4IBeOIB5g+ZrEEXkzfYJHESRQKBgQDX2YhFhGIrT8BAnC5BbXbhm8h6Bhjz8DYL + d+qhVJjef7L/aJxViU0hX9Ba2O8CLK3FZeREFE3hJPiJ4TZSlN4evxs5p+bbNDcA + 0mhRI/o3X4ac6IxdRebyYnCOB/Cu94/MzppcZcotlCekKNike7eorCcX4Qavm7Pu + MUuQ+ifmSwKBgEnchoqZzlbBzMqXb4rRuIO7SL9GU/MWp3TQg7vQmJerTZlgvsQ2 + wYsOC3SECmhCq4117iCj2luvOdihCboTFsQDnn0mpQe6BIF6Ns3J38wAuqv0CcFd + DKsrge1uyD3rQilgSoAhKzkUc24o0PpXQurZ8YZPgbuXpbj5vPaOnCdBAoGACYc7 + wb3XS4wos3FxhUfcwJbM4b4VKeeHqzfu7pI6cU/3ydiHVitKcVe2bdw3qMPqI9Wc + nvi6e17Tbdq4OCsEJx1OiVwFD9YdO3cOTc6lw/3+hjypvZBRYo+/4jUthbu96E+S + dtOzehGZMmDvN0uSzupSi3ZOgkAAUFpyuIKickMCgYAId0PCRjonO2thn/R0rZ7P + //L852uyzYhXKw5/fjFGhQ6LbaLgIRFaCZ0L2809u0HFnNvJjHv4AKP6j+vFQYYY + qQ+66XnfsA9G/bu4MDS9AX83iahD9IdLXQAy8I19prAbpVumKegPbMnNYNB/TYEc + 3G15AKCXo7jjOUtHY01DCQ== + -----END PRIVATE KEY----- + +# Enable probes on CI runs only, +# so we can check if the container is ready +ci: true diff --git a/library/ix-dev/community/mumble/item.yaml b/library/ix-dev/community/mumble/item.yaml new file mode 100644 index 0000000000..c74e8e29c3 --- /dev/null +++ b/library/ix-dev/community/mumble/item.yaml @@ -0,0 +1,3 @@ +icon_url: https://github.com/mumble-voip/mumble/blob/master/icons/mumble.svg +categories: + - voice diff --git a/library/ix-dev/community/mumble/metadata.yaml b/library/ix-dev/community/mumble/metadata.yaml new file mode 100644 index 0000000000..0707a5b397 --- /dev/null +++ b/library/ix-dev/community/mumble/metadata.yaml @@ -0,0 +1,8 @@ +runAsContext: + - userName: mumble + groupName: mumble + gid: 1000 + uid: 1000 + description: Mumble runs as non-root user. +capabilities: [] +hostMounts: [] diff --git a/library/ix-dev/community/mumble/questions.yaml b/library/ix-dev/community/mumble/questions.yaml new file mode 100644 index 0000000000..d00fe56f3b --- /dev/null +++ b/library/ix-dev/community/mumble/questions.yaml @@ -0,0 +1,189 @@ +groups: + - name: Mumble Configuration + description: Configure Mumble + - name: Network Configuration + description: Configure Network for Mumble + - name: Storage Configuration + description: Configure Storage for Mumble + - name: Resources Configuration + description: Configure Resources for Mumble + +questions: + - variable: mumbleConfig + label: "" + group: Mumble Configuration + schema: + type: dict + attrs: + - variable: serverPassword + label: Server Password + description: The password for the Mumble Server. + schema: + type: string + empty: false + required: true + private: true + - variable: superUserPassword + label: Super User Password + description: The password for the Mumble Super User. + schema: + type: string + empty: false + required: true + private: true + - variable: iceSecretRead + label: Ice Secret Read + description: The Ice Secret for Read Operations. + schema: + type: string + empty: false + required: true + private: true + - variable: iceSecretWrite + label: Ice Secret Write + description: The Ice Secret for Write Operations. + schema: + type: string + empty: false + required: true + private: true + - variable: users + label: Users + description: The maximum number of users for the Mumble Server. + schema: + type: int + default: 100 + required: true + - variable: welcomeText + label: Welcome Text + description: The welcome text for the Mumble Server. + schema: + type: string + default: Welcome to Mumble! + required: true + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Mumble. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: mumbleNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: serverPort + label: Server Port + description: The port for the Mumble Server (UDP & TCP). + schema: + type: int + default: 30000 + min: 9000 + max: 65535 + required: true + - variable: icePort + label: Ice Port + description: The port for the Ice. + schema: + type: int + default: 30001 + min: 9000 + max: 65535 + required: true + - variable: certificateID + label: Certificate + description: The certificate to use for Mumble + schema: + type: int + "null": true + $ref: + - "definitions/certificate" + + - variable: mumbleStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: data + label: Mumble Data Storage + description: The path to store Mumble Data. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: data + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + + - variable: resources + label: Resources Configuration + group: Resources Configuration + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for Mumble. + schema: + type: string + default: 4000m + required: true + - variable: memory + label: Memory + description: Memory limit for Mumble. + schema: + type: string + default: 8Gi + required: true diff --git a/library/ix-dev/community/mumble/templates/NOTES.txt b/library/ix-dev/community/mumble/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/mumble/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/mumble/templates/_configuration.tpl b/library/ix-dev/community/mumble/templates/_configuration.tpl new file mode 100644 index 0000000000..3d9b976266 --- /dev/null +++ b/library/ix-dev/community/mumble/templates/_configuration.tpl @@ -0,0 +1,25 @@ +{{- define "mumble.configuration" -}} + +{{/* Configmaps */}} +configmap: + mumble-config: + enabled: true + data: + {{ if .Values.mumbleNetwork.certificateID }} + MUMBLE_CONFIG_sslCert: /certs/public.crt + MUMBLE_CONFIG_sslKey: /certs/private.key + {{ end }} + MUMBLE_CONFIG_database: /data/mumble-server.sqlite + MUMBLE_CONFIG_port: {{ .Values.mumbleNetwork.serverPort | quote }} + MUMBLE_CONFIG_welcometext: {{ .Values.mumbleConfig.welcomeText }} + MUMBLE_CONFIG_users: {{ .Values.mumbleConfig.users | quote }} + MUMBLE_CONFIG_ice: {{ printf "tcp -h 127.0.0.1 -p %v" .Values.mumbleNetwork.icePort }} +secret: + mumble-secret: + enabled: true + data: + MUMBLE_SUPERUSER_PASSWORD: {{ .Values.mumbleConfig.superUserPassword | quote }} + MUMBLE_CONFIG_serverpassword: {{ .Values.mumbleConfig.serverPassword | quote }} + MUMBLE_CONFIG_icesecretread: {{ .Values.mumbleConfig.iceSecretRead }} + MUMBLE_CONFIG_icesecretwrite: {{ .Values.mumbleConfig.iceSecretWrite }} +{{- end -}} diff --git a/library/ix-dev/community/mumble/templates/_mumble.tpl b/library/ix-dev/community/mumble/templates/_mumble.tpl new file mode 100644 index 0000000000..f4b5762abf --- /dev/null +++ b/library/ix-dev/community/mumble/templates/_mumble.tpl @@ -0,0 +1,119 @@ +{{- define "mumble.workload" -}} +workload: + mumble: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: false + containers: + mumble: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: 1000 + runAsGroup: 1000 + envFrom: + - configMapRef: + name: mumble-config + - secretRef: + name: mumble-secret + {{ with .Values.mumbleConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + # Probes are disabled because it fills the logs with + # "connection attemps" + liveness: + enabled: {{ .Values.ci }} + type: tcp + port: "{{ .Values.mumbleNetwork.serverPort }}" + readiness: + enabled: {{ .Values.ci }} + type: tcp + port: "{{ .Values.mumbleNetwork.serverPort }}" + startup: + enabled: {{ .Values.ci }} + type: tcp + port: "{{ .Values.mumbleNetwork.serverPort }}" + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" 1000 + "GID" 1000 + "mode" "check" + "type" "install") | nindent 8 }} + +{{/* Service */}} +service: + mumble: + enabled: true + primary: true + type: NodePort + targetSelector: mumble + ports: + tcp: + enabled: true + primary: true + port: {{ .Values.mumbleNetwork.serverPort }} + nodePort: {{ .Values.mumbleNetwork.serverPort }} + targetSelector: mumble + udp: + enabled: true + port: {{ .Values.mumbleNetwork.serverPort }} + nodePort: {{ .Values.mumbleNetwork.serverPort }} + protocol: udp + targetSelector: mumble + ice: + enabled: true + type: NodePort + targetSelector: mumble + ports: + ice: + enabled: true + primary: true + port: {{ .Values.mumbleNetwork.icePort }} + nodePort: {{ .Values.mumbleNetwork.icePort }} + targetSelector: mumble + +{{/* Persistence */}} +persistence: + data: + enabled: true + type: {{ .Values.mumbleStorage.data.type }} + datasetName: {{ .Values.mumbleStorage.data.datasetName | default "" }} + hostPath: {{ .Values.mumbleStorage.data.hostPath | default "" }} + targetSelector: + mumble: + mumble: + mountPath: /data + 01-permissions: + mountPath: /mnt/directories/data + + {{- if .Values.mumbleNetwork.certificateID }} + cert: + enabled: true + type: secret + objectName: mumble-cert + defaultMode: "0600" + items: + - key: tls.key + path: private.key + - key: tls.crt + path: public.crt + targetSelector: + mumble: + mumble: + mountPath: /certs + readOnly: true + +scaleCertificate: + mumble-cert: + enabled: true + id: {{ .Values.mumbleNetwork.certificateID }} + {{- end -}} +{{- end -}} diff --git a/library/ix-dev/community/mumble/templates/common.yaml b/library/ix-dev/community/mumble/templates/common.yaml new file mode 100644 index 0000000000..df732cd288 --- /dev/null +++ b/library/ix-dev/community/mumble/templates/common.yaml @@ -0,0 +1,7 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "mumble.configuration" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "mumble.workload" $ | fromYaml) -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/mumble/upgrade_info.json b/library/ix-dev/community/mumble/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/mumble/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/mumble/upgrade_strategy b/library/ix-dev/community/mumble/upgrade_strategy new file mode 100755 index 0000000000..8d55579f9a --- /dev/null +++ b/library/ix-dev/community/mumble/upgrade_strategy @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'v[0-9]\.[0-9]\.[0-9]+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t: t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/library/ix-dev/community/mumble/values.yaml b/library/ix-dev/community/mumble/values.yaml new file mode 100644 index 0000000000..1cff314570 --- /dev/null +++ b/library/ix-dev/community/mumble/values.yaml @@ -0,0 +1,29 @@ +image: + repository: mumblevoip/mumble-server + pullPolicy: IfNotPresent + tag: v1.4.230 + +resources: + limits: + cpu: 4000m + memory: 8Gi + +ci: false + +mumbleConfig: + serverPassword: '' + superUserPassword: '' + iceSecretRead: '' + iceSecretWrite: '' + users: 100 + welcomeText: Welcome to Mumble! + additionalEnvs: [] +mumbleNetwork: + serverPort: 30000 + icePort: 30001 + certificateID: 0 +mumbleStorage: + data: + type: ixVolume + hostPath: '' + datasetName: data