From 9956737e0b407b9e6dd0dbfc57cc4c9a0fe2ff37 Mon Sep 17 00:00:00 2001 From: Sukarn <10946339+sukarn-m@users.noreply.github.com> Date: Sat, 15 Jan 2022 16:02:14 +0530 Subject: [PATCH] feat(trillium-notes): Add Trilium Notes (#1715) * Add Trilium Notes * Update charts/incubator/trilium-notes/Chart.yaml * Update charts/incubator/trilium-notes/values.yaml * Updated with requested changes + additional fixes * Update values.yaml * Update values.yaml * Update charts/incubator/trilium-notes/Chart.yaml * Update charts/incubator/trilium-notes/values.yaml * Update charts/incubator/trilium-notes/values.yaml * Update values.yaml * This port is now free * Update values.yaml * Update questions.yaml * Update docs/apps/app-requests.md Co-authored-by: Kjeld Schouten-Lebbing Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> --- charts/incubator/trilium-notes/.helmignore | 26 ++ charts/incubator/trilium-notes/Chart.yaml | 31 ++ charts/incubator/trilium-notes/questions.yaml | 315 ++++++++++++++++++ .../trilium-notes/templates/common.yaml | 1 + charts/incubator/trilium-notes/values.yaml | 20 ++ .../img/appicons/trilium-notes-icon.png | Bin 0 -> 20024 bytes docs/apps/app-requests.md | 2 +- docs/manual/default-ports.md | 3 +- 8 files changed, 396 insertions(+), 2 deletions(-) create mode 100644 charts/incubator/trilium-notes/.helmignore create mode 100644 charts/incubator/trilium-notes/Chart.yaml create mode 100644 charts/incubator/trilium-notes/questions.yaml create mode 100644 charts/incubator/trilium-notes/templates/common.yaml create mode 100644 charts/incubator/trilium-notes/values.yaml create mode 100644 docs/_static/img/appicons/trilium-notes-icon.png diff --git a/charts/incubator/trilium-notes/.helmignore b/charts/incubator/trilium-notes/.helmignore new file mode 100644 index 00000000000..4379e2b3014 --- /dev/null +++ b/charts/incubator/trilium-notes/.helmignore @@ -0,0 +1,26 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +# OWNERS file for Kubernetes +OWNERS +# helm-docs templates +*.gotmpl diff --git a/charts/incubator/trilium-notes/Chart.yaml b/charts/incubator/trilium-notes/Chart.yaml new file mode 100644 index 00000000000..5042ecd7862 --- /dev/null +++ b/charts/incubator/trilium-notes/Chart.yaml @@ -0,0 +1,31 @@ +apiVersion: v2 +appVersion: "0.49.4" +dependencies: +- name: common + repository: https://truecharts.org + version: 8.13.0 +deprecated: false +description: Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases. +home: https://github.com/truecharts/apps/tree/master/charts/incubator/trilium-notes +icon: https://truecharts.org/_static/img/appicons/trilium-notes-icon.png +keywords: +- trilium +- notes +- note +- information +kubeVersion: ">=1.16.0-0" +maintainers: +- email: info@truecharts.org + name: TrueCharts + url: https://truecharts.org +name: trilium-notes +sources: +- https://hub.docker.com/r/zadam/trilium +- https://github.com/zadam/trilium +type: application +version: 0.0.1 +annotations: + truecharts.org/catagories: | + - media + truecharts.org/SCALE-support: "true" + truecharts.org/grade: U diff --git a/charts/incubator/trilium-notes/questions.yaml b/charts/incubator/trilium-notes/questions.yaml new file mode 100644 index 00000000000..3b7765f3cda --- /dev/null +++ b/charts/incubator/trilium-notes/questions.yaml @@ -0,0 +1,315 @@ +# Include{groups} +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" +questions: + - variable: portal + group: "Container Image" + label: "Configure Portal Button" + schema: + type: dict + hidden: true + attrs: + - variable: enabled + label: "Enable" + description: "enable the portal button" + schema: + hidden: true + editable: false + type: boolean + default: true +# Include{global} + + - variable: controller + group: "Controller" + label: "" + schema: + type: dict + attrs: + - variable: advanced + label: "Show Advanced Controller Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: type + description: "Please specify type of workload to deploy" + label: "(Advanced) Controller Type" + schema: + type: string + default: "deployment" + required: true + enum: + - value: "deployment" + description: "Deployment" + - value: "statefulset" + description: "Statefulset" + - value: "daemonset" + description: "Daemonset" + - variable: replicas + description: "Number of desired pod replicas" + label: "Desired Replicas" + schema: + type: int + default: 1 + required: true + - variable: strategy + description: "Please specify type of workload to deploy" + label: "(Advanced) Update Strategy" + schema: + type: string + default: "Recreate" + required: true + enum: + - value: "Recreate" + description: "Recreate: Kill existing pods before creating new ones" + - value: "RollingUpdate" + description: "RollingUpdate: Create new pods and then kill old ones" + - value: "OnDelete" + description: "(Legacy) OnDelete: ignore .spec.template changes" +# Include{controllerExpert} + + - variable: env + group: "Container Configuration" + label: "Image Environment" + schema: + type: dict + attrs: +# Include{fixedEnv} + +# Include{containerConfig} + + - variable: service + group: "Networking and Services" + label: "Configure Service(s)" + schema: + type: dict + attrs: + - variable: main + label: "Main Service" + description: "The Primary service on which the healthcheck runs, often the webUI" + schema: + type: dict + attrs: +# Include{serviceSelector} + - variable: main + label: "Main Service Port Configuration" + schema: + type: dict + attrs: + - variable: port + label: "Port" + description: "This port exposes the container port on the service" + schema: + type: int + default: 10080 + required: true + - variable: advanced + label: "Show Advanced settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: enabled + label: "Enable the port" + schema: + type: boolean + default: true + - variable: protocol + label: "Port Type" + schema: + type: string + default: "HTTP" + enum: + - value: HTTP + description: "HTTP" + - value: "HTTPS" + description: "HTTPS" + - value: TCP + description: "TCP" + - value: "UDP" + description: "UDP" + - variable: nodePort + label: "Node Port (Optional)" + description: "This port gets exposed to the node. Only considered when service type is NodePort, Simple or LoadBalancer" + schema: + type: int + min: 9000 + max: 65535 + - variable: targetPort + label: "Target Port" + description: "The internal(!) port on the container the Application runs on" + schema: + type: int + default: 8080 + + - variable: serviceexpert + group: "Networking and Services" + label: "Show Expert Config" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hostNetwork + group: "Networking and Services" + label: "Host-Networking (Complicated)" + schema: + type: boolean + default: false + +# Include{serviceExpert} + +# Include{serviceList} + + - variable: persistence + label: "Integrated Persistent Storage" + description: "Integrated Persistent Storage" + group: "Storage and Persistence" + schema: + type: dict + attrs: + - variable: config + label: "App Config Storage" + description: "Stores the Application Configuration." + schema: + type: dict + attrs: + - variable: enabled + label: "Enable the storage" + schema: + type: boolean + default: true + hidden: true + - variable: type + label: "Type of Storage" + description: "Sets the persistence type, Anything other than PVC could break rollback!" + schema: + type: string + default: "simplePVC" + enum: + - value: "simplePVC" + description: "PVC (simple)" + - value: "simpleHP" + description: "HostPath (simple)" + - value: "emptyDir" + description: "emptyDir" + - value: "pvc" + description: "pvc" + - value: "hostPath" + description: "hostPath" +# Include{persistenceBasic} + - variable: hostPath + label: "hostPath" + description: "Path inside the container the storage is mounted" + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: medium + label: "EmptyDir Medium" + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "Memory" + description: "Memory" +# Include{persistenceAdvanced} +# Include{persistenceList} + + - variable: ingress + label: "" + group: "Ingress" + schema: + type: dict + attrs: + - variable: main + label: "Main Ingress" + schema: + type: dict + attrs: +# Include{ingressDefault} + +# Include{ingressTLS} + +# Include{ingressTraefik} + +# Include{ingressExpert} + +# Include{ingressList} + + - variable: advancedSecurity + label: "Show Advanced Security Settings" + group: "Security and Permissions" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: securityContext + label: "Security Context" + schema: + type: dict + attrs: + - variable: privileged + label: "Privileged mode" + schema: + type: boolean + default: false + - variable: readOnlyRootFilesystem + label: "ReadOnly Root Filesystem" + schema: + type: boolean + default: true + - variable: allowPrivilegeEscalation + label: "Allow Privilege Escalation" + schema: + type: boolean + default: false + - variable: runAsNonRoot + label: "runAsNonRoot" + schema: + type: boolean + default: true +# Include{securityContextAdvanced} + + - variable: podSecurityContext + group: "Security and Permissions" + label: "Pod Security Context" + schema: + type: dict + attrs: + - variable: runAsUser + label: "runAsUser" + description: "The UserID of the user running the application" + schema: + type: int + default: 568 + - variable: runAsGroup + label: "runAsGroup" + description: The groupID this App of the user running the application" + schema: + type: int + default: 568 + - variable: fsGroup + label: "fsGroup" + description: "The group that should own ALL storage." + schema: + type: int + default: 568 +# Include{podSecurityContextAdvanced} + +# Include{resources} + +# Include{advanced} + +# Include{addons} diff --git a/charts/incubator/trilium-notes/templates/common.yaml b/charts/incubator/trilium-notes/templates/common.yaml new file mode 100644 index 00000000000..a6613c2ce21 --- /dev/null +++ b/charts/incubator/trilium-notes/templates/common.yaml @@ -0,0 +1 @@ +{{ include "common.all" . }} diff --git a/charts/incubator/trilium-notes/values.yaml b/charts/incubator/trilium-notes/values.yaml new file mode 100644 index 00000000000..513ecaa1d11 --- /dev/null +++ b/charts/incubator/trilium-notes/values.yaml @@ -0,0 +1,20 @@ +image: + repository: tccr.io/truecharts/trilium-notes + pullPolicy: IfNotPresent + tag: v0.49.4@sha256:af932e6cd1e60f3b0c84f94c28a036c17e062d68c0d80491fc51836edad3b453 + +service: + main: + ports: + main: + protocol: HTTP + targetPort: 8080 + port: 10080 + +env: + TRILIUM_DATA_DIR: "/trilium-data" + +persistence: + config: + enabled: true + mountPath: "/trilium-data" diff --git a/docs/_static/img/appicons/trilium-notes-icon.png b/docs/_static/img/appicons/trilium-notes-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..591715a6f50f0e57849d089d08875486aa27c137 GIT binary patch literal 20024 zcmeFYWmsIxx-N>l2iFFg;O_3wxHb?Rnnpw85(w_@t|4gSL4!j`kPzH0Xt1Ec5(qhD z&bil`>z;l0Is3VH|6AQpcaKr^e(zWHN!1uNs$;Y@m2t5su@Ddta8*DGx{trZzdsmg zkKeUMb%h8Bq>+C5MxMG>J^)vD7h8wtP=MzPS117L>tKt3;Je(C>)=NvoE7m4Leh;g z_RgKFeD8qf^5RZXQT5GNkpgZNwN?;m9Loltoy=6hukWWv4{=4)#y)SG&6R5lizF_h zKct;lNPqiI^)m25O8RKK`|M}?-AhJymh)_LZsnJB($sq|e0yn6zr7p!PKO*If%&27 z;wp0K?)EBIfwmFa6g3(;QutNLG}EkGv*D_X{UR;aIpOZnkW?u&HTcgXV|>&v{N-ZwQqITFyboR*2kAb8S*opgqB)6My% z*n^<<&zJX^^GVyU?mZ;}%%2A4>HO+&zZZHB~z^*O@U_ZjVZSpn1jug8H1a*qFHCAJ`!0buk>!jU2So2NDGbqes$1U+^2oE zKT?1F8XtqgNW!vyxeA1k{+)p)$^8O_*ui7oV zwp60}4!d`$w?n-7Cv7l++wp*n90PJsq`n+(&-+C=Kw`l?Ie!xC5XCCitMv99Xz2vo z$Sdr2p(2M(QQ^#6F&w|t=u}6?(#Ub(Gf}e93TUyn4SUs&t}18kC132E{+v}yD;s%h zrZKE+4o#?Ss-~jQ|DdI9{cc}q3xt==6&6Sx5O4KCF(D;Ei^?whlgP|i)0o)GR}XcQ z^oh~xnvUf|Cyo_2<~D~NGoO`!Bxh!7)q@>9P08a+{zNm?gN~x*9eAkZmu#%}?w^KjY@E@e{1e{C`kZPJN*!GYrSdF=?GM47yS2i+YSGyBT z`Ezjd;BtjFvcp#^`K%&TOG8Ym3C=64-))gG$Ft`q94gu*A)U@OQ2Dxh8#>(1dI`c@qQ;J{uWTeaZkD=3%XH)n)L_5E`5ZX`9Y2~b zqjW+`Ry~>BjDAs}s)){(3irdfAnmKkNA{e8@_$~+cHjQ`!ima+q2v<<+CmMhmx+BJ z@m^z(w+58o_Xx`W0f*%2j>Bq2#?(BuX}~&(wHVXqWA_Ap_C;A_Jr%3j02h-oE(3e7 z`7Uo!)&Y;;F=$Tfbw@$Y?o!o;`)iT~yJ}*0x;A5J%xhf?yqvFTUP$yurg94|yRV@Y zLi0?fyv|K&KU#eIUwD*hy}pfS{NTm^4LqC=JCL%|fFYMbJ;>WU-7})wT#+x#kv9-fgK{c9=K>z2LL|1Bsv|<_tz_gEXDoko7g1BI2b~lu=vel8|^YjjfQ_DG{ zBbV2@k?!-N3#3SKTyD(_Yfl#FpIVA+QiK%BdmCeiVW!Tew+S|QU-GM%7e?KvtY+(~ zH7&P~yjSl!Dc;z_4QOeAG0r=cD!#^uV4Z7-4k-JzwHn1{$GK3iiq5%1Tv2|&Rz{+k zA%rZuCs{=;=243fV!X&WL(`c!*vE~~4PCouB<6k2qkNWQ%+|rFE0w;e6_AZ2kldQz63uLP+h-xF#E#<{XWKs`5#OKcvxxd&iIB<6Apf%VuTs zo&r?P5Q&JcTBt8tv$Ic#$&xV={{@3YUsH%f@nWYGkRm^4f%Ycz3+=8zU* z7MCVGk7L+m##tEZI$Qo|pZ4@P;XrD_ew*G0I|4%#4e>0WFLlg`qoWtA{^|bt2vH&k zoZZa1VQ6Kchk+jDiJ%>);vB1|7J z4?47qUUht-FkWu-No94Nzs}LRIUj7uK{i3Rz_($(9$!%$lJkyyqxgxmPUikVlnt|a zS7SreV6h=%V|a)5$?erPfEF|?@R6OQcWOqR+GCZ~p3N#DK~w%Vi4o6S=YNwe&gCgBt1+O^a2L+WU`1kU#ct!<&F z4MI$zOb|Ry?O%a}?#SJkE~U~89W{V@?O6~(wLWn=XNODVl;fKWpbmP( zg@GJ!1)08#7iP*sQ7nFeJYKI+WP=n)wH21N`EHXUC=1SfnxgS`LkUn_2d_Gql{O|v z6PGI@(Ul8XuPjPWo(Z8lB^GRKReF2ywsHEEg-4XzQuGhee_6%1npD8VS;=^EK}ssn2`v^ql~oui^f>;qOAqaf5|1w}^HYJ2 ztza%uhH@Zp@}ll9g-C4m1{dl9KgZXRvb!jLNva)88hjnWw<7l}iO0N-06IZqu>T^W z-*xo>$1}O*$u-)7x3!_4DM-IAkJC`DV@AxU%<=;X@IoG9%Ot62+ncP;wO>?{Y1Q}P z@utPKRu36Zp#@U_>6qu4HVP(9qXF*_iutC$GSHJE1%7Qk;iNJsMsq`rrI>4= zM03mXvs~We>I;r$j?=fZnhajVqbx$?lNn}|gsl+s7W3lvp#(Efoe^m&5_t|VaHK^# zmg7q1g2?FhE-eV22&F54Nan;@!u*<@WAWtp7q)mNRZ@}nLc&)RC|%WkFVJY-tt@K` z*0@4GJ#CLFFgji`iC0A?xPz}zRu$FIyhA`SOuKY2^KW#&oNg=*TYvXi+n#(|2nmN; zXzTTGFs`$-g2&^`jeYjqeh`^BLX}ZqDTAj#hM#?n zFrg+2w*r!%+P5~NHg#u*DM7HqUM=CJZ0ntsiER41cQ0qp*a==N$zrZv*-%j z(p=qtZB$*fI%C{*cX_EGKqni^k^OoiOM2|PgWL^7*gG}+YVH9e6h9ZgX4;i6EAdQ5 z#4Dy#R>@M%o*^Ev`-X77rXi7$plL zh4@FscH!8bw{_Dp_K|4A%rS5ZVZpeYNEUjv9noOBF9= z%2eq(%t^Bo!*TwVGx`{k{sFd5h3G4W9V9dP_aV{*JWQ1)ahPt2-;AvqgB|67eL)p9 z8hkrjs`g&+s(CSUV=G1bttapiCvpL!_**d-PFqw*rUNa};TM#JPpcv=?KVjcq?8@9JS^ZX_Z<{GHrurc_h_$2mHNSDpMTfC(E-5D6VI)Tg>(Q4L;M zAEL}dNm?_UdwQ&gN2?W7^_-UQ`y{>)O*4~r+#R*5Ntf`=4RT!4ZZl1yc< zI=ns@_rtV@^?k zlG%dOTAgI}!%Uqagqt0;GAqs{RJwB~W|x)50!vR_=@UnEu~LbKVm1ea&FrH(l+|4{ zkgC#OwY0RjxY_rKMp#h%Dy`-H`m7g0j@9Ev&kxlO8(j0r91EkgK?o5^SJAVjM-{4Y zd|k;Qd^WKIk}mPF_1v9*VD!`y-P0G75QA#Xn6~x_Z?un09&$ac{WaZ&D-f`w=9#?q zlKve!!)$Mtb2Q#-+`Z>4t{f;^>^OW%-! z^kQs$GLTUybj74Ducjj~@g-%?Cj9BrD|IiMSa;G9lzZ#_;P;Zz7=93+-Mpt^y`1PT zu^$Igv^m4Es&|NpO?Te()kYT+l@d@oyMN%R7K#wT&68EL3qi7xX0`IYzThoE8kLvj zB6+bm<^Hr$oiv{yZjKF~!=?zJgj#&OOUbH)KLFMTClEgw{iRYH=J*v*k%HZDtz^!C z(ci6*Mdrz8TpbnJJP1WDPpY%ZWm5-J%3Z$=%EW|o2YomO%l-X|4nr;usQ z5*eTu_U|Kuk_|1g#m7sU%ncu%Crq^c>$?zl#rLPno%x{I(wpL1_JtvRH zT3>WVKna*n>5V=!$fAxSII%?Ei2b&xpT*5VE=xkaJp>D<@8`_~-#p{tcRtW$Riv>} zuJ>19dDybbKPc*!Efru0l>&u#^pY+_{I$IhxWF%4Cff-_j6d3ije5qwA3S4=Txo;)rrOdL#d z>^*%xY?EjfV6vIBi+K=lVaTKGI@scAJH`OQca+>HYNH=M-JjmuO6#JEjo>LtytyIz5&W4KDdDWL|)vYnOjhW(;gWTVu=X;;wAo`mboZNeaT>2do~#;HZztX zOX0HiosGsrjt$f1Jxty%8_8K-J>ZC5o|J+bRNuV4&^ypelwLr{O5-&)^d{A%V#^e@ z3p3?9S-kv?u-H5tRo`BxPdeNWENUd;{O0*u>aGWsrGUs^#S~b{eVwi%V#}><*ifP&w zJTWIFxKXc-m+eL}Qqd$2RCq|1qBuhN$s;P=kTwLI&|;=!XY^(UaZxB65{HQM@@P^h zzQB{xUs-tG(H!I36;*e7b~>8qw|!z1(z56vRJZCP)a>hYw$>ak@a-6t0CeSCe)#N_ zzGK1|c6rh6iCKv!TY_zS(?IY=%OWKV;F9_SDG5M!NXqXoxTG97E?8yvnQmU@tID8m zu5V6)E?3@?2~v^8emawIS5r{TeULE0HMmWLuY+>|JbF!YkUMFYs@EVfoNruQbH|Zx z;qB{=&(U{kxzb1Qb)+f`k&^*NL@rs#9mUYBP3hbmo~)}Xb4?W!vG1Uj)hL42$TdT; zZ1Wz7xWHE-II;J^c*-16vB%Y~;|W4*Q3z#NgBMi}|Ebr6u#LD38A0{*s|jaORhRv^ zXL@5e6t_cM){Di$Xgc2!GQh%wg{Q5i1k()~`=9tWUQii*tYDA%ID7N%DLjXISCaH9 z^h#z=&vddJ>x%WPit2n$rKUVKPiODTMrY51Y6K2}jgj?qz(Pc8N@-Me3O$b@t}6F<3^#U|b^$fgWDE==40rz_G9uAY$JE7Fp& zvUtHV7|5qx1I!K0Q)_$V^I^h|3vdS3&u3&PzIL57mkrKMQc&k>em88+q+M*rLotoX zws+~XX7#T0`dac%0Au!@k9!;X=^dE@r*MQ70s>;BgS@=9ioE=Ptbsr3$qz`81ijNH zj?mI8V*sPGM~m20YLY4_qL9_f5we9FzXGGDWj$bMP^J=-DfhQ*Y)n|s^}l~+h;ArL zaF6Kb>8|UULUgKz#cADj=1aG?=HYuPB~zJ^ZQGK7lncwNQZOB}F&vy^N7`2+pV?2# zfsU!_67^hpX|3t|@D}cVzOnPF5{*MdO!1ARDA(xHlz8hvm46e%Si@31xHri7)GYZn z50BKpCu2@sfVKar8x8lL5TpgXDMYccK9= zVvd^8Qu>fc>1D%1v4pfk6UdLnSV?s~X>ZQ)+XG`vvEB;x4f7`P2@KcK-Qx#N%#S7| zy-?W{nS9t1p_7-fC#y81*}GeGJ7ktQqiCPbdvM3i{sHV>o-I+9nGkYyTboUn+;B(V z58|`Y^DYB$(ifqxPweNtkvZj@e0%t*)-7=c9iY*qx{iPz)#n=WX5r=f+LTyZkU!Q=&;LXP%g$0msx3Lw| zRZ#ki;_*z9!QRu;Rg9b4$H#}uho8&E-Hw}AR8*9khmV_&kMj}1>G1;QY30ia^I-f< z@h67@)C1!F7|{+cFu-q4D{B`oPe}%b$9lkDho_?VKlS~m z5+3@G4~MvQp&l+??hvS=Hx%Z{_;;nQ&%HeUuG7l{`n%|lc0aeV<$i3`ADaIzqpYH# z{STSnX0&r~cKt)*H~Q~L8^}L!u3qlX|G?NlxS`LX&W{c8cx2}N7rdu~?LQs#Fa7yl z^S?FZQQbfI{{{UY_WGkOf7n$_!3E;=Td9hIB*X9airKh89Bjn?IOMYtXDqw;gLrGYGrN1CnUlt zB>X5SUx@Nx0{vqby3m8Y$XyR#&N zx&zG1_n#H|4$e?LPpjWX;}sI%;}sI*72y};5#<#W_$SB!>hAFvW3f z2aBw`r;m%fla{-dwIdYb`Cs$=XW)M@={}Bi9-i(mRQ?a0`hVag{tQ>pqpXYji@)jD zgS!2B_UC}~+~E&X0RVpt0%BH>Kh5u9 z&LllASJ&qbQ1^dz^nV2Y{|oMK@_!}S|4IDsus@~cU0h#04np>xT0XG5=>XnGmppZk_*2-h;l4>zK@0Io+=uO=wA@=aKza`*4xF8MHHTj zMxOF6&cAO05&pW}0Qfj~+5>*yn;3@Rks%-e5L6Uo^?jF*3tsr@?_Lc_r$qo!kdTN5 z*xrOuMXQmZW*L*Ecgz~U@0cqCS68+u9+}s)7&L>c%}VEM^WH=U&*P%TJ{&5c>XR^&8Jr_SfGw?2ZCfBJ1lh3{j*+nb)xH(&RH`z?9ManQp4Z+{}Y>F7IA zBFiTOL0l%J2K-;X)4TQB9V%kqLYS6JGVWqPy$vACjY#f$L*^PZeKd{)`KUBvk zH_bMm9@4J~(5WAfa213LMHD~@kd~3B^HuNpSURx{bj9ikx;=tJ3 z|3W>@t$p+ZbI5vXHjXsaFjaB)hZtitJ-GtMDs?flD+&*#2quflS@Or=Qv^C?i9&qO z`RyBIwEa_<>L5~vlovb`jF1OLy z*+7Kz`84)}~ajkujBxt7)LEf)K>ng%P7F5lh>+9^pR?W`!Q*y4``Ydg3jlwIC zP!jSs-&Hy2Cg22d6&~44H=e^C@_Np)7xgv-4zBt@*5}bjZ249-vtb3s8%my=O8&j? zCb)>ckVRS>+cc^DrHf7rysS~aY}97M*|Lfb$Q$}~ZD$|ro>F9JZ!Mscatc|cS6en= znZpGk2<>6wr%j2?BcywW976&hXC;bzh|3a<2l497+({ke2T5E4;Epo!;Te7`K9~E0 zB<(HxmMmYi{&)1Vb|R=@7ZKCPy0vvgGSP9w2iqO{aOw@YjHf{|rmHDL3&3HiVuJ!K z35~7(o&en4KK%{amNIMAwC9}$IdSWDt&knFfPx@=L&1UJDG99Lclz+>$WrKV^um># z(NWb_jw%7nH(4r){T+hm?e&&IX9!#0;fRY}&(S?jOs!CsurYLT?y<=? zXRM^j=vmxs?5G2v_W2kcZW7F5$~1sS;N6)zYW{B!9Q+K!5pGYlVL2u&tYqmScf z4*JWoQt~*3yQt=1F*4ky;GkyFm*oUT&C$GD9Sbzqb%G$1RL_4`a(o@~F2n$_7ET#`RhcY4s zmS%6v8`R2{xM!sth1Mj~LrPh+ySEFQ3?)0pN1qseX{eVMU^hynN<9O>a%uMT#j=i}(ZJV1j^dES zn-H-0z=7xC!Vmx*giX_XQTq@-o5H*$%Z5xlQ{=vYwu0V{FH&^*36EQ^N{HRu+9os> zjH9lQo67V(9l?uIrHnnD=yzA@P~ zVq}k=fAmfnreIoU2fuXo?wxkJj#kA%Hw%tS)?_W1@um4>2zeQjC0yb0#+uc&^TY@& zMP1*0;?50Mc#FHQo0|8Ie(fT))uYS$Ciln2?RU4Y`+=Zj;S{cjpLvah-j$n@Xykhg z$`}qJ!l=G1pGMAc&dj2yGe`t;rkd&d-)C1dfA{b5*^k@(WQ4UECm@Vad>4LI)gle# zSw!@uhhaLS0gP&nWF+DeFr_LiV>6viVE8xl3gKPQ$Dqf>i5`2;lmdT(Aje7 zl?n5tSzhOLtthvg0wcXkp{_JsoG~#dcRY5X=1$Th3(@D0(sGAw785GLk?YadYrtmW zoOjlWDMZe5lM-^0H1ZkL-#_J_`2lAxor}fKbXlqv;3oU?dWlhpC zx4U5-mQ+Go zrQ{=O42mdAG3}!?hF^^{3c0J-HrGY96sAqf8LKwZg6+H@RF%{A?dF}2^zvdn0=(v@&7|TFl<^6s3~Z|^*m;)P{>FQ+YB>#SwIZ$ucdMj8VUQd# z1I1@@vPF_|)k9*w%1^IskX^yFPclWHv=^vYpxVv{%>EId+DvNs0Qt!JbAszLx6v@O zb#ciz)zbY^Zq6`cl08ws*J+aTSBH`xXY%-riu{pcMh*PvW1M!DEG1!Z$37PW#x9*3 z53*-b^mQvwriahgYZZL;3b5nAp_@`s#Tz+G*s#^!DM{r}t(#_m=p;>z0{6~Ky2L9r z;I%eILIYr3tgP;FuH{u@g-B^(aKMsd_OEm z;FKpATGz&zj0>R80moz~%$oPg$XjWZEY|1XS~U>yP+4wKG=8M_D_R=YaYjR{%ngj$ zQR_BDR`2wrS6stdbsT*McZWKDyJ+)DBaND(`)F+XUQ7dbeVhL>^jhf+^i*k^3~@uE zR2=QID2KO%$0X_+&DGP&{Br!{=3D#%gYeBmC50f}k(4T{-XEIHM#$w~4akn$Js1cE ztG|bNvAxX4awpIL|JeC3?#VXhodzLVf1_TVv747{eL7IM&pd+l(8Tc0Rt--q zt>tXw@M z4i0%BN$qc_wDsYvH$Q(nC^BHBT$WcnVaNA@9(PYyF0m3t$2~l`@)qJdk^gC4aowCu z(>wgKQq~$<;a*y@ z=cx{&>5Rmnmmh<+@OivYyuX+Kj#J0o?F;sl#Xe>PXdK((y-wL3?JDX$@Ey|-(5pFF z^&rH*%`0V_0eEPf9oY%uOug1ASICLq*?;a?pp^&@4@-8R@?abmro(*rNgjibGMD@1 zuCGa3`3AG>3jc6CkeTR}7AZ+z88og<<3ys8vq+*dHlwNa?U8z&?D8tHEsvcIRXrUAo+Go1D#OS)~!Er+RQ!z4wXzH zKA1-6JxvO3h0!nny8p5B#hNbBq8dK4Gak0g_c&l&(zf)Pw1_>MOVwXhvzz&`Y!~&> z)Qc@0nUz_&G&ZAJ{ZsRSoFW@*KG(hrBh7>D(J#RtH_uCbk37AQICNV|{bfEMS(=qz zk;H~k=Dzz*XcK^ec|G^qEa`{Qkn7+#a?iF)FsN;a`f8L(7iWQbT{mg&warH}@uiA)u6LJDoHcxCRwfy%&C&-hq?9mUlrPwp8H{Q)U=fQJ9d4=gWM1W zR&B6jvHAW89L7;je~pwHaWADyeJKw#8=Od8PxIR3s4^r{L{xbi+Ku1_K8n?pq`mM;+B_|5B!fQm#I8?0IFU$3gE$ zquZ|z3k?Krsmhj52TYCjD4v}sf^S*2qM7@C#r znX}9?{hChq<_#X}=1=k}IESLO3Rq*YxOT4nq)OMeU5wnXlAkfj@~#5R_!g{{BBOWE z3;;cWXX$Nvg~WbUFXX?#oDP7((rH8t6Q7T8^;b@7$?>Ab=t0D(!3y=gVFGee z`D3`CW9^J1ohwhpEs@gW30B&qU&4YCZ@pd730yW^wqLrGQ4R)0%Oxfg-3Icpdj)iw zr`^R=@@fhD5*6q~PwTw@=AfF1NTHgZl#EopfY9^Hlr@OPgl=X<%Q>x6V)3a(<+5%q z3dL)0ZHeqxnyEB|J2G>94s7rFQ9V+yCfZcqxWJZ)2KyVv>804Pm5Is)x6CEYgMKia z%$N!y$(P!BAl#gIlbwmbsVuxW5UR^-T@xMRC{;d70}7cys$l^348S`=9|suq=UpSq z5Pw2eS>r0?jdmRO#MLCb7inf>#x*_gQo)k~m$)NRC%g!+JqWhn~-tGC|e> z{o(h+ut6%enR}&Ho$Z$lUd`XH`<;&_2xE%Iv{T1aHnM9SOn>Rbmf8wLp}T!*A$OHk zZo9m7h)jmiOq+bgFnc0SU8MugT;J()*yR=9^XAM=pA77eww;>F8T~#{}yQ<|{yyH$0 zlK-W!rCHikn?e*iYm(t*UBM#S!FVz|MPUuaa>- z`SX^`lo7T&5nTZ5rK)*$$SkBxY0hk0$UM{dJaEP`W`9N@%& zIhU@sdYG#6h(C7WP$IMnqJkFZK#trkpjQ@gDg>flEMXfSLjb>W#6Mk$86>u4@SO&G=LpcBGc4nrJc@MENttZ z!3OW2>1PNz?)$QT5{R(x_wr1Cs4;N3hd<}poaUXtw>?yhiwC5j-6iAEmzzCPH`m;E z0#1C92kYHmth5>6KhpyCJLmWXJVd3J!1P&LO~8y5%MFaKax7z3AX~?v01jcisvph) z$KO>o%^y6e_NbRzHGLi!fV#8}F2}J9@6GKd`txt9+T!8UVmEj%(^XqMmGN7|Co+%d zIxtzEe*~4h$4JAOh88&H)0-Jh9NMG@O@Y^wSz}+x?o#|*g%EK3 z?Ir2fbhj$C>lsc?Wcx^cifVW#ZqVK32!2RT^IbYbQAe3AMVP-93*Bk$PLC|C293#% z0w_}?W~QtkH%?K)yGz*y*AB1X9~+KDaAL@B5UAZn*k(n5r;ci#$K32S(_ct#_*D}P zKx~0xY1`O?@-K)82|dyPQXBYoZM&EK3FQcva$-rQ>W7ggKO&TvUK8#$^NoIJP|gRG z5FApkNlX*&Mk~7$Z3)@Aq*6P`CzG=og1k;PLAz#b%1q30Ln%KJBuh7F_=R{6whtvw z`m*@8UyiRn+zNLuedCC=tF+T;YSsfzSt~ZPD*+NiM2%l-w1cv*0B+9T+ zu2f=eU8_gT?Bv7bkRqpMN1kq`((cjgbxrTm9?KvF;{%pZ{mTZU%TX$5@=>qO4kGfU zn=$4-R~%^}5>Zo^D!Ce7UG7w>&I{veZXyCf-}8rV$N)^!{ugZ190ZGTHt2a%-Xa;n z=pc81(&y)eKVWuypX=Z^LE;HL*5p-Iz0x`)PQzt)GkfXQa(oLAg6Xppecc(NR-#+( zR6c%^tUYIoWKw@zS^eA{M&8gnP(9_XM)by2UXZb_ z&_w#)L^9@dn?*}&>L!+Uy^OSZ5)?V>UL!*!mO$>Gf`WK%eVjy0V3z3HVQgLF7D4$% zYZHDRokbl)zL+!TM}x55VJHQ2f%C|lrb0!j?M z&gy>DtTv7zq)k{iB`e<0KFiOCv~u(tTW&ac0y$x+D>c?oipio57SLnSeYc>J zUIXS65xXM;&E9&_(xx{#z2?{>R=g=0VS!3}7d zkWSgzJIq0uBt5MBfp0L^st2t~@mFWcAjWj6<1>Bz`S62p)wmixwhFR{+_a)&--XrY zI{i~Dt$|-lw2dIfo{KP_`9y1**tvqiajC*YrOFIy`qDRi>;Al| zBeT+xjD3&x!oPR047x!&t`Zs$6`*OqGaMZMoH;neMqT>B--R)T5a@hfyY)lp9XjKA za>}PJsO0pI;qJ<)RHF)CbmU~e2N(i>B<*wIL5x&$$BZp)8;)<2BI`m$l4>p!np;lP zah{Q5((RSQuvkK%wVplXxxJvXS9gtRY4>7T^cr8)=lDWPqjt!r z8W}-4GxgEEyf>Oa*@lzgP^7)aK%m7&Mnq}HWyYyb{2GuE6ju!f6v7)Zy8@o%)?aNc z?2bc*Hna+q?QHh7NW-(e_hr4C;sKnoaVbX146bh+))c-qIeo0^Q$&zoX=@Uoby7QC_~eJ){n8 zXV~w?D2I%U*sI%KpS|*4hzGEy(Hd4_ZKKYCMmwlhmYNi+EN(81gORaKR&WJEQKEEk zv1`Z=GWSV335DyaW|F&V4UujSA<3&e*tC?gq3^`Sy~Tn8@vEdRV`=t5dl)Z++v9^0 ziS52e$XSzFP{adz;D!bEQu1x0&nw(a3g$tpB^U>M?$T%P$blEJO`u;n3`)t}eb?lL z;m4bq0I#}jZZ^ACU`{4yT20J+XeKH2a1T0<}$LE?_gmm~F>kKOE)QqQIo| zm7e(0`kL!a|2C$kFO-zBd<14-unK9)wIVa+a#X9q2(KC0WnMHHTw-M6c^S%B(~3O` zrfN4O?$^C{^zU>qh+;y90TbT{C*~#Fm2iCrWpC-?1wzRW-Be_T5;C~K(ec!`gl8;g zHmOB3==+X!=BLArYLn#K{<9UzS4=%@{k{YT8i$jEP6c9VY^6o>mNqiwWX;MKAEa8v zorng>?)UqU^QC*s;skZU%M^-GN4%6F2QIp9Tt4LoV5!yW2cYHwk9~T=bDmIO*bf7% zAw`Ks9E#bd_`$oFmPEPWFUb{$nKNEfN8w|yhv5@SLgcb9WtAx%1-f^VsR+5*1(7GWs?FDPdYCOQ76;Eb*$`G(kT&LKPW%}jZ*V$fT zpP3MI$1^PG@$dFIaq6W%Vp8EK&bT%_p|=t1!!`>p2>kkrKb{c{RYz;5z=^t)g#oV# z=ik4gGfymSl_)LkAqz5{QzDT6$>2}tb}r^XSFzD8;T=Z%v0%AJydUBzH+}qzc*v>q zRm%aWaKX$^3XL(E+x2kB$H`3(j}P9brr^iy+I{jMN=U?{^HS@xA?1)$ef({YRcGzG zrCTxv&I=z}628!-f=}Y{gOY|`j;p`am?jA3FPzo91koq% z`d~FG1VJ0g?;=k6LTK@>D7Hex2ydBP+mA%+Gs5LB3*V=Ox+BWmnSS&Y4n=Wk@HqoW zp2)Ki{)+Z(Sp7!WjrQQ442xgc_C1~wpi34YmrWH~^!NAujAMhbS8q05!Hz3xly`0* zORih;-s5w}2B$6L(P7~V%1<6|JleD957_Xo4ZU!I83A!ar!$ea4CfKIS!%YAPfkB{ zDpP-1k9pGX3H%YLHMo78@^zVj=$uPqs}MSL-eC%ynxf`aBKY-+(?bsP@VsR>y{faM zi?;JCLyF@%V=>r|F=G=j8E zVh{m^kcvK>cgStskhdsXGns@eAqL(!rn*Skq3|k1k*b5~k7d}mCvUcEDMn;FI@?eS zvCoL%pf0~DOOzOVblZgriBBcp{mvBJN*}u7;-m49I^zLK$s0A_mVe0jP^3b3nJ<#j zuy==>s~&d)t9<36lGP1XJ}V5N!ro&zU`{*t8AuPS?W?okc$hvZd>nzqQJ99fk&_wP zkmwkgIszg5+TUj*6TBG{0R6AZUuph)R?3_AS$9Xq=2F&-0Hsm!wB*OKgC4GVDN~3EJ-aKcADf-!R>dS?jwd!T8$ufdAM11-g_9hPczVVv3BHRwV z+tix#=bhMIaEkKOq7G3wD3a$xm`4R`qEVOlY^`Sny-~5 zjFS*6{O`>n!8su2TME!knwfW}dT1$5RF_F_e^7#en+cU{K7KM+thx7bV@I)tnsrkr z@d1VfE(b#oF@^jSj3p)zbzO>W1$=WIlQmGxV5AAbr3q15CRao2!%F-&=i&Hw&$v$W z`hg(FP2-nM!RM-pY=chClsQwIsLBklvCI8l2ASBfffGM5351rSs=x>RFZqFG?^q`S zfHCqGiL=GNG{^xABNJZ2kEu2!JzwKtTq%uasv+XK8Y(?8i%V z^wqAf>^G(%hW6A$?R2MtdyKP)4WHime@nR}d7Ks`^=o&lAs^s*~}j?Qpax( zE=W#-EaX?)%t1s9=jp`^&wUdKflqLJvv7HyP{g$gq0$v3B?JnE+F;Q>GyXgrAjCKM zZ7o=uPhktP{g^13{VwxDha(Lb2NQRIej$Ax%*U%MBd=+=Bdm+r! zbH@eh4OJkL)Cl^W!qd&jciyiO067Vpr$3|Ub!*$P4{|S%fklTCgD`?A>gT={gf^!# z4rVkYn++zpv-InAbO5uBphSJDr`8pVHmpsu*A#dEYb+{8b}}n1WLSAthc90A*!6*v z`&3{_@J)14%IaTNxK}pHGs~QvXZm4sV=*Y3)pDKZkvq`&`@P}v<;`BxgQw`!PLzvw z6HxB(oUZX=iPlXc_V(@hJ Kb6Mw<&;$US&U