From 7cd0cc44a15d61c7ca2242ad49c11795daa5721e Mon Sep 17 00:00:00 2001 From: Pierre Jarriges <pierre.jarriges@tutanota.com> Date: Sun, 7 Nov 2021 15:05:28 +0100 Subject: [PATCH] wip admin panel - create article form ok --- .../src/components/create-article-form.js | 112 ++++++++++++++++-- admin-frontend/src/components/root.js | 53 +++++++++ .../src/components/update-article-form.js | 0 admin-frontend/src/constants.js | 3 + admin-frontend/src/index.js | 56 +-------- admin-frontend/src/xhr.js | 10 +- ...{obj-to-html-logo.png => obj2htm-logo.png} | Bin public/assets/images/mental-eau.png | Bin 0 -> 17155 bytes public/assets/images/obj2htm-logo.png | Bin 0 -> 952 bytes public/assets/images/screen_make_frames.png | Bin 0 -> 19795 bytes src/middleware.rs | 5 +- src/service/articles.rs | 4 +- 12 files changed, 171 insertions(+), 72 deletions(-) create mode 100644 admin-frontend/src/components/root.js create mode 100644 admin-frontend/src/components/update-article-form.js create mode 100644 admin-frontend/src/constants.js rename public/articles/software/object-to-html-renderer/images/{obj-to-html-logo.png => obj2htm-logo.png} (100%) create mode 100644 public/assets/images/mental-eau.png create mode 100644 public/assets/images/obj2htm-logo.png create mode 100644 public/assets/images/screen_make_frames.png diff --git a/admin-frontend/src/components/create-article-form.js b/admin-frontend/src/components/create-article-form.js index 39b06fc..792877b 100644 --- a/admin-frontend/src/components/create-article-form.js +++ b/admin-frontend/src/components/create-article-form.js @@ -1,6 +1,7 @@ "use strict"; -const { fetch_post_article } = require("../xhr"); +const { images_url } = require("../constants"); +const { fetch_post_article, fetch_article } = require("../xhr"); class CreateArticleForm { constructor() { @@ -12,10 +13,24 @@ class CreateArticleForm { details: [], images: [], body: "", - } + }, + article_sent: {}, } } + reset() { + this.state.output = { + title: "", + subtitle: "", + category: "", + details: [], + images: [], + body: "", + }; + this.state.article_sent = {}; + this.refresh(); + } + handle_text_input(field, e) { this.state.output[field] = e.target.value; } @@ -128,11 +143,30 @@ class CreateArticleForm { return { tag: "li", style_rules: { - display: "grid", - gridTemplateColumns: "300px 60px", + display: "flex", + alignItems: "center", gap: "10px", }, contents: [ + { + tag: "div", + style_rules: { + display: "flex", + flexDirection: "center", + alignItems: "center", + justifyContent: "center", + width: "150px", + height: "150px", + overflow: "hidden", + }, + contents: [ + { + tag: "img", + style_rules: { minWidth: "100%", minHeight: "100%" }, + src: img ? `${images_url}/${img}` : "", + } + ], + }, { tag: "input", type: "text", @@ -142,6 +176,10 @@ class CreateArticleForm { this.state.output.images[i] = e.target.value; } }, + { + tag: "button", contents: "OK", + onclick: this.refresh_images.bind(this) + }, { tag: "button", contents: "DEL", onclick: this.handle_del_image.bind(this, i) @@ -159,9 +197,60 @@ class CreateArticleForm { } } + render_article_sent() { + const article = this.state.article_sent; + return { + tag: "div", + style_rules: { + maxWidth: "800px", + }, + contents: [ + { tag: "button", contents: "RESET", onclick: this.reset.bind(this) }, + { tag: "h2", contents: article.title }, + { tag: "h4", contents: article.subtitle }, + { tag: "p", contents: article.body.replace(/\n/g, "<br>") }, + { + tag: "ul", contents: article.details.map(det => { + return { + tag: "li", + style_rules: { + display: "flex", + gap: "20px", + justifyContent: "space-between", + }, + contents: [ + { tag: "span", contents: det.label }, + { tag: "span", contents: det.value } + ] + }; + }) + }, + { + tag: "div", style_rules: { display: "flex", gap: "10px" }, + contents: article.images.map(img => { + return { + tag: "img", + style_rules: { height: "100px", width: "auto" }, + src: `${images_url}/${img}` + } + }) + } + ] + } + } + + refresh() { + obj2htm.subRender( + this.render(), + document.getElementById("create-article-form"), + { mode: "replace" } + ); + } + render() { return { tag: "form", + id: "create-article-form", style_rules: { display: "grid", maxWidth: "800px", @@ -170,12 +259,17 @@ class CreateArticleForm { }, onsubmit: e => { e.preventDefault(); - console.log("will post output", this.state.output) - // fetch_post_article(this.state.output) - // .then(res => console.log(res)) - // .catch(err => console.log(err)) + fetch_post_article(this.state.output) + .then(res => { + const id = res.insertedId.$oid; + fetch_article(id).then(article => { + this.state.article_sent = article; + this.refresh(); + }).catch(er => console.log(er)); + }) + .catch(err => console.log(err)) }, - contents: [ + contents: this.state.article_sent._id ? [this.render_article_sent()] : [ { tag: "input", type: "text", placeholder: "category", value: this.state.output.category, diff --git a/admin-frontend/src/components/root.js b/admin-frontend/src/components/root.js new file mode 100644 index 0000000..eb81cfd --- /dev/null +++ b/admin-frontend/src/components/root.js @@ -0,0 +1,53 @@ + +const CreateArticleForm = require("./create-article-form"); + +class RootComponent { + constructor() { + this.state = { + selected_tab: "" + }; + } + + handle_nav_click(e) { + this.state.selected_tab = e.target.tab_name; + obj2htm.renderCycle(); + } + + render_state() { + switch (this.state.selected_tab) { + case "create": + return new CreateArticleForm().render(); + case "update": + return undefined; + default: + return undefined; + } + } + + render() { + return { + tag: "main", + contents: [ + { tag: "h1", contents: "Kuadrado admin panel" }, + { + tag: "nav", + contents: [ + { + tag: "span", contents: "Create article", tab_name: "create", + class: this.state.selected_tab === "create" ? "selected" : "", + onclick: this.handle_nav_click.bind(this), + }, + { + tag: "span", contents: "Update article", tab_name: "update", + class: this.state.selected_tab === "update" ? "selected" : "", + onclick: this.handle_nav_click.bind(this), + }, + ], + }, + this.render_state(), + ], + }; + } +} + +module.exports = RootComponent; \ No newline at end of file diff --git a/admin-frontend/src/components/update-article-form.js b/admin-frontend/src/components/update-article-form.js new file mode 100644 index 0000000..e69de29 diff --git a/admin-frontend/src/constants.js b/admin-frontend/src/constants.js new file mode 100644 index 0000000..ffe6ed3 --- /dev/null +++ b/admin-frontend/src/constants.js @@ -0,0 +1,3 @@ +module.exports = { + images_url: "/assets/images" +} \ No newline at end of file diff --git a/admin-frontend/src/index.js b/admin-frontend/src/index.js index ee56e9a..7be69ac 100644 --- a/admin-frontend/src/index.js +++ b/admin-frontend/src/index.js @@ -1,60 +1,6 @@ const renderer = require("object-to-html-renderer"); -const CreateArticleForm = require("./components/create-article-form"); - -class RootComponent { - constructor() { - this.state = { - selected_tab: "" - }; - } - - handle_nav_click(e) { - this.state.selected_tab = e.target.tab_name; - this.refresh(); - } - - refresh() { - obj2htm.renderCycle(); - } - - render_state() { - switch (this.state.selected_tab) { - case "create": - return new CreateArticleForm().render(); - case "update": - return undefined; - default: - return undefined; - } - } - - render() { - return { - tag: "main", - contents: [ - { tag: "h1", contents: "Kuadrado admin panel" }, - { - tag: "nav", - contents: [ - { - tag: "span", contents: "Create article", tab_name: "create", - class: this.state.selected_tab === "create" ? "selected" : "", - onclick: this.handle_nav_click.bind(this), - }, - { - tag: "span", contents: "Update article", tab_name: "update", - class: this.state.selected_tab === "update" ? "selected" : "", - onclick: this.handle_nav_click.bind(this), - }, - ], - }, - this.render_state(), - ], - }; - } -} +const RootComponent = require("./components/root"); renderer.register("obj2htm"); - obj2htm.setRenderCycleRoot(new RootComponent()); obj2htm.renderCycle(); \ No newline at end of file diff --git a/admin-frontend/src/xhr.js b/admin-frontend/src/xhr.js index d5321e9..1b77ca7 100644 --- a/admin-frontend/src/xhr.js +++ b/admin-frontend/src/xhr.js @@ -53,11 +53,12 @@ async function fetch_post_article(article_data) { body: JSON.stringify(article_data), }) .then(async res => { - const text = await res.text(); if (res.status >= 400 && res.status < 600) { + const text = await res.text(); reject(text) } else { - resolve(text); + const json = await res.json(); + resolve(json); } }) .catch(err => reject(err)) @@ -75,11 +76,12 @@ async function fetch_update_article(article_data) { body: JSON.stringify(article_data), }) .then(async res => { - const text = await res.text(); if (res.status >= 400 && res.status < 600) { + const text = await res.text(); reject(text) } else { - resolve(text); + const json = await res.json(); + resolve(json); } }) .catch(err => reject(err)) diff --git a/public/articles/software/object-to-html-renderer/images/obj-to-html-logo.png b/public/articles/software/object-to-html-renderer/images/obj2htm-logo.png similarity index 100% rename from public/articles/software/object-to-html-renderer/images/obj-to-html-logo.png rename to public/articles/software/object-to-html-renderer/images/obj2htm-logo.png diff --git a/public/assets/images/mental-eau.png b/public/assets/images/mental-eau.png new file mode 100644 index 0000000000000000000000000000000000000000..ed6c2eeced7fbb226d7c30e1a526b7c0b09c6d93 GIT binary patch literal 17155 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 UGUikYLk4S^%c{i*3%8yAe{Z2>W&i*H literal 0 HcmV?d00001 diff --git a/public/assets/images/obj2htm-logo.png b/public/assets/images/obj2htm-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8efda75f697267280b833f5aeb6b1a36b96cee67 GIT binary patch literal 952 zcmV;p14sOcP)<h;3K|Lk000e1NJLTq0077U0077V0{{R3mzF%;0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKpe$iQ>7v;f_4xQ$xxjv6cusQDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_7;J6>}?mh0_0YbgZG^;BHXu55t z5^*t;T@?eb2%sM!#4sW=%b1g-Bsz|-d-(Wz7v))<&;2<<YR+PSPb8jYhG`RT5KnK~ z2Iqa^Fe}O`@j3ChNf#u3<htVV8|Q+{0?!Pa>C`-Nm{=^dvC_t@Xlle$#1U1~DPPEV zta9Gstd*;*c~AbrU`}6I<~q$`B(R7jND!f*iW17O5v5fp#X^eq;~o4%u3sXTLaq`R zITlcX2HEw4|H1EWt^DMKmlTWx-7k*wF$x5Bfkw@7zK<QJaRT_Cfh)b`uhfB=Ptt2G zEpi0(Z37qAElt@2E_Z;zCqp)6SMt*o@_FF>jJ_!g4BP^}YhG{7eVjf3Y3eF@0~{Oz zV+G1y@9^%P_TK(I)9mjDj)HQs_{KmA00006P)t-s00030|No`gpWOfe00Cl4M??UK z1szBL000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jvG64KxSu`<9Xb000?uMObu0 zZ*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0004lNkl<ZSi|j=F>=Hp3`NCII2|ds z3O5PYN|A|uG>*a%C@DN9NEYlG*x4rO^c!n<Sg?O389*cwi9{mN|H|y$f{Qg6$iYEw zgaen)r)or{O12k7Pl)e`jy-{nKqbdO*5@S9V_|ZGCETVY6=G*Z6Y&#b3-LBh$eO@- zdyGV9BIhr;5W^%6WG!oEGx_L=%Ee#1(c?-C+G@9AW_%z!*&B(_4sdsJW^pYDt#lST z+0jixD;|p{P<qF=2bWsuSh~_DT{6|;Sui|Z`C*sJ#y|vb6&o=LQ=Y_=(UoARnFM?t z7r*J)#A|#GdAzgd?Hmdd6MHAH?zl5kC6r|NHa7#c4=$)wx3CAMCQ&Ud6Y?63LqfJS zuPJFsry?i25|>jcUVHY%r4AM*VIYdhHddlbOQ8R1Acjbs5JhC0b;(yDAJhJMGalZj zq?9#WyHUR;eEdUi=Yh0I;X9)H>C#A@E^Sshct-9sk*63;NWJ6JIcf)z<bxy<i9{mN apXe8)qb))s^l9_}0000<MNUMnLSTaQbC!(& literal 0 HcmV?d00001 diff --git a/public/assets/images/screen_make_frames.png b/public/assets/images/screen_make_frames.png new file mode 100644 index 0000000000000000000000000000000000000000..1cad3ad3fa68becd61855f7055cfacfc231ef401 GIT binary patch literal 19795 zcmbq)RZJaB)a}9D-QC^Y-5m~o&?3dPxVu|%Dek8Qirc}VP~6?!rTG8-H@UC(<vvVi z&q^kfotb2>HM1sGQ(XZKnHU)W0H7%;%4!1u&_DnHDgqYfKZMXkh8_T*)%Mc`dTLwv zP`bLi*xG-!q4fObYC~z`Yi|nx_^#IHe{rW3TD1AJ!fS%H`$;N_*tF8m8aySJvQpjA zd-{_}pDw2#(PulB1>oC$7yR+$^%)=Rm%MN=>qpk&_c2D3EcjgV`d4D_ohTqExF=Zo z>E>*~+{{NT_?_^%@L!>Luif39n5r4a=S$y{SlIhZ$C-I=?E9ItdGEiDMvac9piK#k zw57eHhm>A+-l?N#VZYaJRgYdJ4-dlv8I7N}$rgb<Cs&u>35c~;BT32$HIT=8C0@V4 zDt$)sZaq~OeKS`)xQp8}R@|bYqU=?@dhL9YKsf$R8T`2)l>EUeVR^4|z4zv)@WPh$ zz#{*4y<{G7yLNUm^1k<1KwUx}H~3vno$HOOpz-r^<9+ikXX8(1%wl7lUqAZR_npKF zmF{G{9^y~DAm=N`>xK9G_zaicuA3GJVrrcUf%~#W6v@<U55zJ?sBrlo`5v{9UwtLM zf{D_%@fT!)-@LQx1#k7fCdyr;!3lI-uSq_=c)~uLp{>JxL(mk@t>%{!@3+0r?oaHI zjEvb$T|lmest#Mi@%)c{Q(D^f#;#0)?W@Md``04mcx}4ygUEKC{*wz2B$gfXmQ1rk zoGX@q&t^?mr(n|%Ot&itNSYd^NBg}5e#`PJ73PR~7(GoglL8G)Nk$uy^&h5%W21Ae zr$ZjLuBTya$N32mPAp?}g}k$TE-lNE^n3Gqb%~+&Sb2t#(MdxBw_{CvmXTvEbo+|- zM1AwB(V0{8iq7Be`&Hwsz<Z%xMG%O{t9fRG&_iCJeP-V%{Yk^@r`^~uyxPUOHE=s) zQKo^RSIfc@&|{>4pY!LLbLZ91Bc#g^T!td|Q~Syyx5M&9=Z@zrW0%hNB#~h23zpj8 zfOi5z6m!FP4jn)9*Hk_;ulhi9YDD!ocllvUbn7lA7+g=?sQ?Ti1siptJDOQsI_}XQ z>uqEiT-w<hF$Yl;?XL!hA6lCxC!dTiH^JliI;S7O)>Ek+5_gZ^>zr=Z{fJ&YODs=u zHhfgb?AvwKx5;si&)OHes{@^ZtVs*fzX4d4aKvmp!Ttq3XEl=!hV`Z`H|wbD^|<hi zdO3D3CO^J=X`7E+iN2YseHWp7`spCTcb}tV(aG>H@ZFhUQ<P<6?^657bc?06$-l!r z$VDU+Ff<h*IoBK(TFjJ9O>qX?F{;{jBMs+*Nn*bYbaDZBI-RY@vSfa1v+LFO))vD) z&+*yc64_RjV15`V+ciAnt`V*8)Vu9UZ^P-sz7zVADmGlrrP@s<y;dN!Zf5)9p`ME^ zw<B+XKREKQ72THKSXJPU{Pa`d#IX}IIQ&zam?8OKNpW2S;U%cc6^G!-1BA&Fad^Pd zk{M@KQa`%bqSCuEdd=x{#|M&j=a`fOgzZ@&Vj~KXxrk`KiZp+<Hyu9V>kv%dH<(<c z5i<68F;-&rDCO%3-~O=2<#&>XTjXWDTxL8Sy)xEDh3`6sAF~&7acxaC1^auMiq@OX zZGNF`&`Os2s_V*U&bpNS$h7cfJTRY2-=5dW@C-<G(^+YClnw+~UZ~$oE31jBR<7Ca zq@`*S^P$B~tL4BF{3@*2Thi^Zfvo+dqHjw4>QldA3Aa?`BR`#_(To5`>_iX}Qlzdi zv1NGTt)l6@^7CMTAt8=co<o)x;!87>V<(n;&9`mcTu$GeXhB;>JwTV2^EaGnVp6$? z%YZmxpJ!TSWk1~RrWjB_Btts<I-nL9?e0+`Tzn)Y?aT$vKveVO@6)aB?DKbNfimZo z=zoBQ84$EbZ_q#kY%%Ny83;e69m}3+;~H?84mllTBA&{Es=eUxl<t$>@2d?cCBzY+ z>wm4WfKD%AD+<^-XB#A1%S^N1k^&>6@EI)W2@UTa)o^!x6Fsx_3Q|yWY=1M~r$|YV zs6#cW1k!Dy1Za*sWP10TWI9j3S~T;Am2@1_)_f=~@DU@Wtg_hvWIbUa?8-mC?^;au zyHt6s#c@S!GvFD{Vmf2Dw&1AoJMR`a&9uaBZlZ<3=G#A_`b5He&P55Wm4(>%_Hi(* zK!f76kgQg!`?T&Cq5h(Gu-oM53O}d_+b=1e=^^{d29LmcAn`<i8z_cW;m`-sU*1AU zp3n|h>HlQg4_MwCi82yhLbngM$7YVk<VSXOQ^Hfst1}h&Ph0#f6ntctk0ulnzw@0B z^Wo{sw%D>oVE$85H0i`r_iL{1EoHG;e{?Pk-A_=EkmRAP*)B$gPhH1vJq`;O)3!`G zG{CN!a$MIFF9kt5w11cAuXEL*f|OV27DC+hdVbCF*vzp9y@QX34`rr)a_FDTX8dNA zT|53$&CwB0^0)z^CT{@l&Sqr5kJ2sa)X+LX<I)mItZ--ICV0(w2V1fazaIJ~mkR#= z40KL51#j>0HsTm#H37k3lh+UNV0HszrYBuzLBu_wB#m4!tC+k~<St#*HHYs!ec$s4 z<JV+~^xTc$4ze_FQe7gvsBA>*(>@doDFG~DN}4~?-CKmF$t0)Hqy#r&;is4=@A!WP zGDDrR1&D>WX=VBsBzdu5ng+U2hUAYh(pKno!fcN#s%}vc_@wG-2GnIn?uNDee~53# zla>&rxZ(-A^r0MHhBlCgm3FXrgbw{9cS55Fc+cK_w<Hg!Sqz6-!=-cGJe)&>rPpXq z(Bb5qy+c_prJbZ?WH?d=5lYL39WJ)d+}?Lf6t<f%MGcz_^;Hd>*_J&_vxE>2RDCIG zfujX$WX=-RlrWYepljCG^89g7AhP^tT+)i$D#Oo{$IJ%jZrYc(>qP5|PwzKv0LMD% zr4vZhYR)X`gV_=IV=akpb<x3es!S+A70tMS4!U2FyA?%=0f{JIj%`X0I;X>m@VzPW zNZwjlZiMVHd!;}A9v|D59#r8?S>_4*Y@g!2f{M+Bp_FD&W^Y{x@!BSZYM$l4C;Zp_ z`>Y*GMhd!iG9%)q3Jh~@zz(hdlqC2VJ8aHJINQ!qkHOWU&qj$n7oU!!xv7c4wE1UP z#i=#QNirTLXqr-8l5fHk5k)sX?2t?x74y3IsagOq;Dm%`Hn==c4vS)r_RmaoFK*T~ z#7x1Pl1Y<%-lzinIHr%ZNoafkVGGk?l4i$!Agb!=o<3d1aZ{MW<uco*Ap|L1TL;S~ z?}}BwU{uD=uJ7^IpLSsYjDB~$Aa4*dhqY}NGH&ISproWQ_x$nFin>0aBY|50;I+BM z%B2QCqqeI@As!#U5Q>q@{y|_lJ$v~*aGw)r2J40!SK(4_r$^w|zn9O*+#1{H3+z4; zctISn@I&0*L5<TqhJw*VyPqGImIn6+#*ub$f?(*s@%IIr>)h^`KA5JnACmd%HEzB6 z1wOThZeKLc{d*toxLPu8Ut0?FGI$!%4eGhrqJKCN+alZ8a(*^fTkzBgncRcwm#HFV zf(<Mw*7ULf=FrfoJU{TuZmUROz3Pw4RC`_Lo0bbPk2i=&FdbgP)I|;uc4mbYf8FdW zjzvVG>|e&6wJV%0ZULy2(B9x!!8bQ;?tfhfD)tF~lu~Z_WwRfv04JdP^<cnmGV!{Q z*EREAjD*gMGY{!F0dI6=&g*1_#}kS)&=%PaeY7^F4^Fzu)KXCE&}2>j>{ao+X1;`< z32tV~tB<#)t#}4Ili55}ZYa2)Qc_c?xhfZz_x@fmy;ucCrbCf101>=HGlV7$fga|g z`87muA>+J|d#oMvm_r8IY^Ct|SpSCyb^6t$Ju}bNEk<;@S8C0aCHQ^{3f_Tdn857? z#_E8eEWmo|q?{>z^<WZx2+mJkQ$Q|S6g94iipdD0ck9F+xr}ot8$l^@5FgW6YJTny ze*+xpUAu?_&R8q_G}<a0+t)#OB)izQA|?A2v*E663jxIB-Xj(SvZ{pyhQXDqU&ley zFk`ID6;aHKSOlSH-<%&L5Gs-okH&R2&NaD<=mF)5T*x8H$H8XS-yjiiwMII0@q`je zr#qoK+Z`hElsVYr6-vR~C5D#2U6CrxkJaQBExY0-HD)LLX|Acs(|bndr=<aR&pZvV zaLCc(yP<oG`11n!98_qV+VUAE&7zDPA&DIe99RZEDjeuYjEY^lRDzxf2SXNs1C1!| z1lKXVT$fT%KSG@$)TLI7$L^Q%&nYzuUF_qxvksHXEmOnmCoh|)K>MAIrJ>;7$18)6 zGp~(L-u+-<%m2`S1<Iwi7AJ`OnGt3%7763MC0JknNCZXQQ>D5_W{2Ing2z7io}m0B z;5UMIYEgd7Hwqi&)VV<sW^axA^yQ7xF}FcZM@4Z-8>jOGM~B{L3_}Ri?(~&{;xS@= z+fd)s1gkQ>$NWdAHRB(n5NSVgYrcnlC?tHiJ3VDa-YaN-1|4iQzV6jr1{2>(5OIn1 zkeM#MU%6ly4fT06W}J2kB7dr(6nxm<z)e9?9#RE{6={Tfjy+(Ss#=}F3n^a}i^ZF7 zbCWR?I|AsmQ5<feO*zB$dBE~9ZsBAmy#dV@?E3vyn_;1njF+)nl3CQOolXJQdYK`o zzGJXqMWklw7=EO0KPuMAR!h%ZLnA(&wt5%vxBTX|(fD0E5LIdSB0-cQbKJ-W3(OAK zs<N^nf?Y(BEOukq2PwSyI*ZG$%FZsEl<b#p^(j<!pigmtLx_DMrB@c2O&d$*$5J2l zLNE2dETf*y+iwE~>%FCy5%I9^3V#^lj9MF__8_{rq>Ev0c0`C2#QgN%W~LLAA;2?4 zasB}*h)v4Nw4a0oZI9%Y?+ee|r?_)bP+e6Ri{ZIAQ3~8A+iKC@Yb0B0k5zwBN?G9> z>La!<<|IkPu^V2-PkTL32cd}6-b%k<c8Xq4S1r$sG!uh4H0nQ!5&O;^gX`z97e`_( z#!%_|r!kbw6EtESX<ATkvRuVOMSrxC*+^}87gyM0$gm{Rq|cePk#f7BIh6dXj95+A zP>gp>@qQ#;{FiZ*S-GI>wHm(e#CG158l?B10Az0ZtdI>b3i6I-dTjh$;2}!q=EHI# zl@*o0(Ql-siUV+r0GxlbY3Zh5BMfIzM?6N6{3B%h6*AqUHOs3?!{opZYWg7nR?>0n z%Y)(nUFC<IM=hfuKCsQl^wb*nUS9mkPnMymm*%qg>r_4!wURH8SQR8TpR9;iRfv@x zsW%HCn4L26RIuUFNN!I$ODUPLVpp8G&syK;@Oq|2nz<>AAo&}M$pQqX<wr-aYDxa9 zLEM<@(EXC#_Hb7xfU_m1Qq)jfZoIaJ`FAzAAw!G_8ihY3Hus2|fTb{LKE+-j9u`!K za+y&g??mI+``P8BKS*Sojhe!@+3OayjbMfH7P?XAXm5xYIZUxn7z)i#r#m%nSes1_ z8lXhP@R8XTz-`2zKZ;tk&kUh&t)P>2`VIQqUTv?FK&#v&Jxitt>1_}F1{kmMjn!8Y zH;yvIpG3``H-^Em(tdD^9O7_(uE3n+$p^wlB_M)LUj5kgzdQdskrv^4CV3>^i~-75 z9?n}Hs&V17W@{3p#=vVja7(-PQQxR~0uR)TJHwGk$nZ`=9U_*;*cbep-=Kd=>Z>xy zZE5n~7hzs*3qd?##?uXA@)EdB_T?Rp)j(zT!SDkL{oJGK->JD5WNEv$3z)5_PXet5 z!g&UpO3bxZUhPKel(V@X!Z28Z>~FNGgZ0_mLI_0c3Yv>NkcQ-z_3K4s75cY-eRI*# zD^&MFLr&wm)d}6h%HPM6@xW0IqzT&9cjjaaXmA)|o{zjYzUBY!Koi{}n@%?Fsw)<A zEY0NS3-6zL5?s%W;JB`7tkMoe5x#;Nw=fB7u1X4<)pDq!JcNW;MIZZpi&^B|%tMj3 z&i-kT5x5TDk%B@wsch!O!*{wQDckZ~7L_u6taJ^DSe#i>?G>OE7Mp>FVoDb@O#S%n z31VcGB2iyBxBr+8CG`ynO?_JP%UfQOy*C&>>AlROa}@ZE3ivL$lYz<IHk8xVj#w2c zw(dS#j$zfJ)ETX>z>;Dmi7fC}{z+S7*=n$qe}F#s{zqaq!6hWr2<vxF=Bp2H4UsE3 zl^OOXX8x*pA<zO6s6=5}Q0gVGsJ#Dx{}i9l-)|!CPojz-MSEEb!wgl$Gnj%80|0(w zA|^}8fjEmECjL=JIfBCd;y1Z-tTY5VWMNLgWxMEq?T;Zm=1ty@$yuFEVjp!54HNr* z+ns8CYtZJ4fY6p^lv0h|Q7J^2!2j`<MGsSMr+X3oo&8~PV2x`)q-2vG*=iv)p=%;F z4avmiBKFQN)ZLC=w^P(?G#n`#JzOdpu}*);V{WQ69J8gXn}3$KlLy{QmxL1Fpee*y z<@VQjafQ<C=Z^(KQ4=ci>ADj{{p35g0EgJNlfw-!7z#}rknNIke@V~yWqaKD_3`R6 zKmdciz`b2A&#W&%JJSkE0co}QcoMI}hpJ*!q5PK}?VIJiA2cya7&GrxIYIvvDDckN zHC}{R5ZsK>pr>D&l%#Lr6O=_tX`59F`WeDeoTiJB;D}5{ZOLy`ifVM&gkAQpi5NL5 zdYiNuYHlcfPgWB2d}llir5#Dvg-R$%n;{ZedvK$!k+JP{3YgKRBIEqV`$jxe$TDpc zpbQPK;<`2K7s|`QnB6bK80{tnYtKfeBa`B2P@uuX@v>~P;(>I6Ric^nRL)uqODAJK z^P@@`v+;O4U6;$AZeRR>8d&BDKIq(;sg*g9n!oF*_yTb8Fe5pr3WuFc+Z#(PRxg%$ zol3Emki#`buo}W>m{KUn3Wo@~FvtGXi_j=2^Te&Ml7<USlSDKvC5wrJ>ZI(OW#<TY zR`P{U*e|AgYfBqn0BQYE`LjAT;j{a-l>%sx5R#N?*ZN&KyC#&ZI|*SHErj4#)E|u+ zeQ;*K%P{<98ns{?RE0JbiG05OTG{&<D#Ipy9JDPVwDM|gq$wrEb`+JCEuoRk>FQ7e zlQ)PDi2biLBnAUHIjA2yjgdHR2OgYu3!5Juu4fS!u4?MkAC7~2!b2H3bl$>7s1V)I z{H$K?U|_S4rV=O0sOo3G(`{iCAq_3YmF<XzdaOw|Yt@Z>xw_^kri+{u!rj1aBnZP@ zS<{HL2^7rS-o&>u7S@xgbhL2ph8NQuOHo(#Ww`j75V{A5^Cu89bpqrhLHiD($sJV@ z5y{`TWqE126A?DEd(xW1EELEN5^YS3Kq*8aS7_O1IKcWogm!X`+@N{Q<l+i@G*R|( z9Q*s(+7Wq&z94b9Nj<HC;X-DWuJb_{yMT0t{=)Ce2xy*-h<3x*_wqtuNm-K+?RgG@ zyBJHY8(r?oXA5595X8n}KTR4LkvCM8qe{?Pxti6*+kWL(${LGuTEAZap&GMLl<haL zdfp6TcG;=+?-?xYzR15`5fSFwxlXyOA(o7;ev)^d)B??6<C-osSX~l|1gDI0t4VFL z*Cd#ku=x5V3ZCaMkNwv&;lhuKYxYWHBE%)#%-Uk@Aq|y?%*Xnz9OxoCV$FrJ+4$<+ zs(rA*F|Kn&ID?s#VJ5MqvLuPphzksE1@oF76`4J=W6OBADKLF<Br$!gzG}8S>+3Bf z1C6My@mE9Eu-M@=oDO30#RD_Yh;`kP3c?T+@zm0z`Uyv&?>WlsP=_1GjfAh1K~cKp z6-Ke6IK^-UiNNV!EP6fxnJJ|i^)^(DxDJ#oMC^SCM%HT6q&~kn)V}x?*_$7eWkbnh zCSq0z3(BR^;oA)RctW%Ef$DWBQ9b)?IKGi}5Y;zfiO3=-#k`Pjp5VLs$zfw$h|*zI zfYap5Fj#we^r=o5&-?mZ*UAduJ*E3|TrQ17T|@5o1ip=<omi{mF*alpgGRHx_|=Tj zRWXE6uKQ&MUF=z0)Cw#x?fWLiX8bF7mX3WUYkn}IBB)fMX-7D)13!ek!)U>+W0tOi za7JL0M|5Sh-ud@+VI{MjQygD4i{pL9m(G(Eg;OJ^vIKBEjpJE77Vb&Fd_R5g?@0TG z68x6CkgU9joIf*<_kH1sH2pkugaCQuQ^FEi+c4xR_xiQ9p)OqI340r&aJs5?fFfo! z^_uIlCYlZF@(fe<jXq3zR?21Ip#}m6;<vCR+GR&3pgS?4FPt3*?ry&dJ&cTHq-TH& zA^`fuRjFCWw5?kqU>WZhHK<cvA$xl9nAI-6n$GPHP|fjP?u&`@7Y7`1bl;!EH_K== zF`OlgQ~h64{V`X`$PgGo!pgbQMBRIp_D0PUqwdEcL>;kd{XAYPr=>gxsI`8LljV<N z#ht4wI^WgE0;$!&MfYOfi6~TVf1|EK0?9T8Wl-5R!&}&<>miNpC*L(q>9%yDrMr{5 z3tE{=oiwn?fBhD-4`N&BSN#?Q-`o-^Cs-_8Axf)r=1H&>&vd!_MbXre-)z>TQ?-hB zbeXn)`ZMD>@YTQjEPp%=IDnW<`Ivh)?zzZ5ba{haRewj@H`ZK5gCKmQRIOUzooj@! zV1%r$Et39J=_x45<uCyoSqCS!8Bo0ctWNE0=<2k<k+2C-&wWmpTTRIs+f(4<qida9 zP}9%>2;)Fv;1g$xXXq(v*rWwnwhfyn$xgo3r(Q5e!!*=~TuTj-o<p-6)0I7VwG-32 zeMg?@XmpTv#FiR0!LpO1)?4jw8`&m5Hj3ahkQEp19})3OGa4GBTp<#2Rcr8+zLyFe zkA*K@sDc{%LX}k#4CNAR6QwbIA_JS~KIp_w$H%GG19-ouzYM8^anjTNF_v@HovglG zTa|LKiqHWb^Xi*s1~In`b$(A`+HLW~M)C#mM-zX@*I;$3XI4}M?h6K;e!1Fscd$Es zpPTh{zUWnw{82?UK~t}u5;#@URU*a(Nk(7XG)*==_|7?E*g4pSS)c~6;^N{R6v{JW z&dDXRBXKpJuZH=3RmNZwnm=yTY7G#S(XCISp}255n3b~-j;+d^{o0I;9u&gathObr zndP|&mlu5Si-Ymd>jgVLpF*0OCqR+CC=s=QuICHYDSCHe`y32Lh`l-|ePB`e)Y0T{ z*@^jA+<V#hx1fVwb71tN4cmQ0>LMmgl(9k$`$vN9$nSRQujI$8&VKihsTWQ-v?!4d z?`eZ&C?k{>EKk?dmnuJMbYK~sa-U4huNyO;yI<;L95vxfFz`yX6mKANgPESbC$ATS znE9S99XCcpUHqD4zpS;nF@SXAM);3x`GR+<U5oQx6ZczW<<w)LKG=jgkeihB^YK$> z))eWiiwet9x!oEp97KU6mN3S8V>_dT6Dy1*Iv*lML*s=%I(47M=PCA36Dbw3W(38I zE}VF`=y0^~+h@@Y@!u<T<zm%{{gIF~3fVmV5lt|Kox_&T>GiU+&|b=D!ebdC?QA?f zhkFeK6-Zl*ACVFPOM@mNb&DVd3u^EQB9*n(9o4>gw4|ER5gwy~FXl&z+>At+XfbK^ zG`XkMsJAd?`WNF_f>~Am^S}qEfe~i8z?d1Q3Wtf1?Z>5{SwYz6ioJ`eaZ${?BHc>D zs)@P`;Rs`8A(fy({K^q0vURw6*ktvBLJBl~qKfv&4b&js${{z71^gscnWWLq6YM*t zLZVbIZe~*a9J_2kW@(;$8<v0QaGg5Lq!J4oO5^kmcpHCNhG84J<0J<I&hUtfC?)9+ zWYwF19@P=5MLmxVjsWEe35zYAZcogpV%%NpbVcKmc?&_Zq?gkhHzSG2*XhFHPFA0l zqq9_4TtUv#u5;>1U2L!-l8Zw;_zb?+hnx`ghEr%>BR;;Q`o0t9+wkxXJzxaPM}J1{ zFUj&g!2X(#>&n#)6KO{-{A6d<8wbYxgY|Rbm1*54E+h$klt0;Qu>s!3J;!h^7Io9x zZZ#O56bByd+jrH*V#(M|(`<}s2aqoGrJY5DE}kd!vE#2V@vvd-ZVplnZftA<at&2Y z1He9Tn(iUJi7(ALCDp=?4pGiLtzdey^N30cB&k4J+k$U=#zK&OjD$N}c1}u-s8+Eb zl~gI&OjRXB<ec`gID5PdRO2lpOdvB{eC7or-7&T=Q}QAas28^S+vSNWbGL;KMS|?4 z#N68D2odfM#L|Sd)yQtF$($3j!-8E-p}#ln<XddvB=X-G7B*mEdIUn615xu8p`e+` z7jl?2Jv~KnG?Gti7@sff_oZ(Sq;G<&p;zX1zA#nt+ytrGFSKTTZxIaR?!v?Qrgc<B zP6VhE7S@d3Xh}M~Yh%hydelnU?|~8}6iyk1Zq^HQir0p2EupJtb{m6VFA<=0F?ml5 z7)C#a!kI>ro<)jibuP2{`V}`Y*E6WY@f9aRhW8XOzA_4<TXLf7s?BwRg%^^044Gy$ ztOwID-5p7)BkFvCZc*U1r(2P@U7W_sKp|^6&Q$9^)m;!Vtdx=drvp(2Kl$pU6tb7i zG;5WVBOLSNh?kAcrU}~p@;j_|AiY?hU^eK&(u0bKK0ZCtB50;K^@bC3kFGc|>KeUb zd^#!)`HEy_`yAI+KoA}xy>R<&7IPvtiMT+RGuMM0jT+`rOW<{!Y+V@_8`p0P1zVmZ z0I^cJ#LF;|MgW~;u2+X&Wfn(A$W#6F_-BdYn$Csh#jYQsmy?-2)T4|xHoB2Y8$u!V zJHv=R=@OgVN9XA=vb=skwMVAhh)T<u8+QOSrDGhNvR!tOqK;iFt+p-|_QUxlCzeRk zPwk}b9()ZiJB?QkYqaBtsB4xBM!8=rHac}aqDD(b4w3=i$m%<UM}1r=7~NkGW_)jI zG+Xp1IcbIacnMYE-!)UQ%nX}OudjVI=4Q>fXdL^<=A@yXl2D+-=0jhr7`#wdl(mzW zZnfs_5O^Eua;mpO*%0Bb#4Vc7J?DwIvi9@u18&if!9dLE5<06A{}~;f&W`Cja+RYw zXk?YYB6fO+GGtLAu7%oA6zIM%(kX%Bekp7YGL<e16KkJ&jlws-lqRx_(84ZT%9h)! zt)^rYt{os|Xk_6ybF(MD2J4Tr9-O+k6=))WTLeP#V}O0chfMsx(Xu!^K2a=F29QGV z#`qRa5FCrTr!FpVHAUh!=Eq|id(EueK-P|%Sqh@GV@@H=rrIVZQj8{86@LKL|DHP0 z<*KeRc~t_}rFX;mYnH<IFKlgg0!;04$ue?e#IQ<u$X{8_WaImVWg@vDD|q!z#d~kF zseX#MtO(Ga0Cg4WdGT!x;mR#t-tCsnJpqGSfr!G6eiA85vv!DEZd}V5Xn01wirh^l zFN^vmX;{{PN>LRalc^za5~q1r8<wFbFl;$#ajJzFJBmDCV9@h!Rc4MjBv&5;opBm~ z)zG_`W{l^+7eHu4kq}Nx%XBY@9Ykt_Y=Jpd%}{?30PTUH9!(Qgm}8wn&}hCzo+v6} zSJTNpkCYVwvTreRC(xwvQpuALRNcKGDuwxZFDjK^OwNuRuK^{nPK7&1k`{-W?JfKJ zmL-(SYum)Jej=uy=n7TQ{rGM*WFXA(g32C&wEbaoM1d&gw>=%aL^39Nc>z#PEDb<O zqkPWBB~&KHuIm2u0(*;VI4w`MBT-qH#-rR?E@&@M@HJ$z85&`+TTG^oeFr*-Y-S?m zJi<#@8JZtH*ppTxhH9JRR{ddn{Bg#91o%e*45JldmvlUr{_4=6SfTDjO!}2;7Wc%! zljOWw{gHrev@cXG+0}$HI`&j69PSs7weycJh*O@Y6^K<*Vh-b~oIBO6;ZV&KWQWa9 z;IUNcnp0vnO0;|t<f&d50pXg`5fGAh2~9C@ZJy5T>6A(KG(BrjfU0ns2N6{l%HUFv zvV+`-e=8L2ZIf_DN_tg<G^nTLTZpgR@(g-GUF6q{NfGz7mS)<$kg)GoX-=V%X{2bF zHPOtVP?%Jy5=CcO0$YlSialhgWf$SaI0~WkUnjoF^#kw2e3w8VZ5s754AqXbQ+w=& zX0OpIs_>&Sm*b>ksc<WKP)OzkyZ;1+ot&ow4a!%kQEM@%=<vacocwiG5*f@9V@CSY zl$=lo@g?Pe?C-x7;sKgxJfq&rn7<^9oK^=C|FE?4ey-#!AYqXKvki_6i(RIX`xvD@ zOXKD-#dJPBB5&}sJ7i0}!<zY_ElYg2Ec`&8mzBZCivNVCi{Tx7$94W1pWWEkq3kv` zTz}KW{PsfrWBQKTTtc-Y3aMiA8k^?0e+oL)Qqrq|3$lsng}>{V!x>!I_b&)LTw?u- z<IQKw&4wkY5EL6r-?RGACM+>?_0$}k+eD5-=;wJFVi$f`!EYUcaL2OjAOq9s<HknP zdqnpBdFS(_u@$3xx>_goRHF0{0y`PK5O3rMaqU={FC@6PF8m}APruC%Unn*E&uSED zFC(L=BqQ^G-9`U-it+<f#S{lLaU(T!%Bl4bSgHiAtJLvj<w#qQ<*G0pBK65s&0c7D z?G?36Na2>k!X@JM5D31Ql9|9sT_X%mPAbjFDR*%&HOJgQ_5$;L{_b?Y0!s8Pa~JsG z?K+$)u-&-QO|fJeF{h)QVL2&zCbBcjXamm93SX)&Ek!4Kul}BDd*H)BQ{SNSsOI?= z_&Ut-3tr(U0JZdE|Hdk)bx_{WEa4?@2@;s#``QkwRvyOC3|f{%X5!n*>ChC?Ce`Gs zKT8i=W!~X`sn@kg^uHyD@_4z$Ub07{3WZ~p4nu^)`&tZ3!nNw9&02OWdbvm8`HtO= z>+TeiYDI2imtrdMkK(PcKC_7MDGlOQ{66F+9u+#xuGuI&_4IRZUL$0i$F*GG{eYPB zUCFPdS}r-H&}n<OqngRT?*M)J(|WYxTv^IUS{$RRXhy&$bkn%lV<FFYkF*j)GS@b< z3kn@QG!@#W@wuzB)XVwvk@xTk2ARt}5Dyc@<v-UKr>3f|8~_Tyg-p-F#w;!=ZY;&8 zsaGiLj8SgOcdSdLoC!T<H#!_5o03=ARpfd$6!ZH2k{d2w_TOA6OBDrKKnxt2;(r4q zS4Be)000H&e;X7aH=po75W!PPO%CAz8V?;BLqaV|4gjD8D9K9c`mSCSY`Clev$i)@ z3R{Ehl(mrIIF$^&*Kzt5h>Z2&5^c{j=}NzFp8Mj+RYj+=E%RZfw0e(3;m4!_Ix(zN z`I$TyDEr>vx|c78ibIJ7L--%tWM%s9%YjK&v_NBTA-5Dj7E_sV6ueWM&tJL+sX(0% z-F*MADzsM!SMN9L9)HEk>iGTR$272GBfe$~`Zy`DRytHPQ`hmq)L!U^9oTWTo4~Wo zD1%+&mGFU1tu?kSly%y9Eov4EkuBcTplbi<6j?%*Gv)gEjE{zG)gP)Yo5nyxrD5!> zUH_1BWdQPrww_KZG=X$zhsHGLA8JD-=D1m1D%uk;I3vv=GxL{&33atH9P4v;B;I%J zG8r{IZTDO{dvMt)ID@s17CgwE{y;vEwu|h5uOCE6%|yq7T+<M!C<m+myTu~(J=B|7 zo=(tPqSnR<|5~dIik6D=7b6=La_uIkDikXdU=fcllZ><&Oxzd8oJReQ#KK9Qj;kMT z5kuFzZ!n#NT&g7;1azN>vP)}gp*0pKnvL|t$(19RRkOp7d?;LHtuc&7JPWqJ<-pC# z(ff&h=A!`b_-frZ&OuvF4+&$!0q^6K8V1u>eRRX(8&WBu1sZ0u)&jnoIACWX!4%cH zI~H^yC+4~jf-yrQXLneQ4D`zZ>YM5RqAY9zt10Vi5gHBYz&%b}Kx;x<@DJ8r<%Zf& z0D2w&A}cnvn#FvVEgy`^jjyPn*m@k8yO#6UF1<ylQ8nyhhkF|s-t9#jrC&Oj9<1A& zHua+pm)s1c4jqAbjWzaov7@<Am^H7w;SaqSIW0puO=x*;c;tjBg4ad>YtPBbG;dw~ zr~o-e@G`vFjgng5iz!`Qc!J3}-KncJ7_)sp&O8mjEYj%7ENPC3%;l82l+`pfn! z6reJt%3M<WV;*^;Kn#6=x^95yI<3M`F%}27Jot`$;OYW(ftN*!1XZVbtZ4y<SSRu9 za}C{2bM6vaHBbnuP95EM`e71{T>Bu+YePSQ%c_@zIXP=_gIIzAx423Ux{$x!or#3_ zHG<SALPZ(<GbaD=lxwGEs>hE|z}E#cwvQp#G1hf}QJeqt8?ABoA*%%e!PxTp^q_aA zK}HJvx|Scdbc?D3%Czp_9(yw2Hf^}5xbEcYRPvxLZ+u-DO7pq5h}+qf<7<=ebkK(& zXk%$9>hl%sv}nY`UyF^e$lPj13#LzuKPwG?NEWX9^k~bab7?$yV7B;(lIvfa%_y2L zz7m(BGkc%uf1wbr+k)6qFLk%Bp2=K1eBA3hp(j^fDQwft0-JvG0b{!%%;`DW3J)=S zXIn^h5pTO6@gsANfU}Rq_xfmz-`I1p(Z(!K=Ar>2@7ove_0Vc$duy*Oa~L#p92ExC zXkTQU80llYBoKiws3$kYFp+v}_pLfGivv!Eg_*7UEv*2RAjZEzIcer~lg=*nW9H*? z9@QLF50R<Rnz=#OzJ3RhL_o(#Dc=yVX!Scp*|Kilf8C|BX7c6Y{`=hRKyd0oD|eq? zir+uUpnu6tEY&Rp#-BIWI|C;x2u&E;7@Jv;IMuCS=-jqnmdII;JsU<~T(N)A8M>q@ zjN~IGluC~okp*_b$c=d56!^0ptLL57`+@pa0Lt|`1NdW$xNo&EvU`PtLLcG>VCg-{ z9N{46jVOOcU#qV)B(9Ty%P7EwtR`Sd2GKHMYvbZEY3af(79rKWy6^4`I7wDG;`jMo zThrmCwvszTbs7>SZDRwIDY{}reYxKMx$VkX!C<Jrg`y9b`;a5Dx(`UFmC@3N(BgqY zy_E#3&lw4;Q8EWKJ3H@;t@0&<jAsrEFMQk2h`Bn~nNq_;GL<QCS#Ob0!jP?C7u>)( z+L&)CB7urbK4d}B+T}ru@60vsMQ`=z-<+0fz|5?E+y4r*_b5dvfpGwES*aPxDfr{a zg2M;hs0mzQROrvZ`LFeN;5HaHqxaMA7s!bL9SUFno)05<H!Rpc;(>yKwoYu7)xEZb zo;4wP(RNIMa*Y9Q5i1Z92HSjFw)h(Zc9FOw685j2p?V=NP)=fE{!1AN1Ud539)sIa z|7;MF##A>9cAwiZ()ruJr^;we$s6rq@eSL$$49!zi!pQ|BeW9yXFz)k6Bzl8uUxF3 zbcWnbgc3-r9H$P?3c{mq9ZX0wsE3(lMPkvW%%uJV%Q%F7hNXsQwqB|AX%|Ibju#u2 zYZSoLGyHlx+y+r8QU6u6%viT)o8*2S)iV2exzhz>lw#_hjz>YsN{Rqf+`MT;uM@Ld z%$vS&0PCX@;v@f~!)BHnhxns8ns!>5KYsgu-VcHNdR&Ri$mPD-8Ka48vAyh7I<%N1 z<7aKBGmVzDXh{e1AgKfuLi8-e`VlG(>k%E<X1Z)6rTIXUg|5IMo95>g&U;ywqJJS4 zIega+>OVQnp8G%trQ?p1eahRy;9qA9<oHC9juoJOY~rPGIHJqKYYRnON2fdpcd6lO zI4`{gp5}Z=q{caCMr(Xr3%w5Tflp<L4K1r3{Hs4C*beMoeBWzpc}>|m@m8n0U*?$Q zTt8~UDB!gPjzj46F9w(4N6;N*)Ql0nl?<fO-X<d}JESL(Eqd>S9$aLFXG$weA}KOU zU;oCGRPtQUl`AY8+Zu2|t^KQm+qt1b9sW2q3v(F=f!Jf~X5lKumBPh}a(_FA4-$E5 zyESqQ6hRJ!3uq?6Pa_?fO^TTLIWWGl!c}RAfOa<0qAki~*<|Js*Nlk>yI;`O+!U^f zVyBPux1R$1cHQVu?plBH#ff3xYOaprWBiZmth9h(vIpVEb?4KcZ~;*zk9%-ocQ6=x zq{8s;RwD`iubqaWnE~Z40q`ZEAQ?g3=UZXlxNltcViL+?<0c8vCuzfWLDZ(Uf7R{n z_Me5AzY9pnz2<?H%iRR*pcY*<B<m_jy83B@*e*tn@r^?Cv@!AmRZU;RuKmi|$)*I% zST_*4Af+{*WmaQ&SRM}f@gIU8*0O!~TQ=Q!e^aRS@$f$DoScW1LE0>2NQiVME2ISw z9Ek1%mGyXto6lBaXm-1H=qg;wHcgJu8Ul-cBbw~H9SNFCP9b3%pyG}AflgaY7`;9s zh-!?KWhDhGy+g`ci1PaWhK>D$RH7M-=_N~mKghD~HsFwIG5QUVwZ`Nw+IJfsg$0~I z3G2K0sE)MLjgjj3B(xCf?g({30`4Yap$ow>5Z{Ig9kf-Kl$6ln%DrK_zx>eh+#6Qh zazh{J$v>M$9+)0Q)5|F=HG+O<s?t%m2;7#I;hl8U=b)R7u+{qC%=g0OB9ZZ!b*nT> zr2oGHq3q9=3n}R2O%W{L{%}o>FTc|f?mxF%uP;f1uB?4b1H*oT9&4ki5#U%J4ln%? z9ohX6teS&?EB?MwT`c503$p(ee2nB9ioXJLz{6sHj5ut_mFP5LG7_|Ls!Q<#djij! zxJ9*x;E!$}ewee3p968*%}3b7;T0C4+}0gWD30{FROWG*{Ca2>a9~SYUg6FtuIEdy zA>D;Fragn70%3Te^8Nt*(Ts~};I|+wVt&1EKhW!3g0N<gc%ddT>emY*p_xK#YECnC zade`IZ&KvVwZ+u>s9n{(e)ZVe!&)yp1Ct-o$V3Y>v@1YkC4%~y=2f<!`U#_gntbj` z!|B6XrR1;hi>SQ0_cspXvJ_{KI9Y08pKOz8l0}>`8wnTqENG(WE&JasTy;vO#&Cc2 zc)+)b{9m^3R=(lzNbhf3m~z9YO!nXM!kw8+KvolR|DGxFecj!68Wp#~UR2%5^Lf~P z$i`dU=CX)POw3Y6t#$d}Pb(TB!5ftxVuPA^C>&Ug`;!uPZ#cErzNGnl2XmvXBX-N1 z?V>jTr{YhXXl&OUty@^M-;n#0?C{tju>tLjgr?2{xt5>x8y&YtCnCxMS#-_UkfBoe zEorua2r?)Gt6zOJ>MX5F>S8R|+jNGlWYfo(_CpDmnAZ;o`XvkPFK7DQdjCaF>GWS0 zooOw*6gfZ64$NaiS{>Wo&~PWdF23zoOsMh<NL`iXuxkTT-;ifuSuY-tSVPO1>u!(O z#BL~d`apU>diGgm`^kqWW%v$@Hsl52MqIHq#aP0-^uS-%r>c6<<uj1~$Yj+d9MJv_ zJg$0C(!V-Mbp8T{R~xt`MXf`WmL?pUP%Co&L>|`8<WoYXlQ-uH`c;P!MkI|=lE3qP z%nv;ib_vzX(Oa;N;iyKv8j*^oPO}FK6!|QjTWC0}gj);8QdFd?`uIhMFq6>D-BW#& zy$>219!ML<n%S2d>9>kH$6!9zmBMeLTQW9VtuJDv_*P-JkJw|_R!GPEQ`?Zwyw1;* z3*EJJ{BX*lZXao}!N?2f_hF8Uwvw-H8K7snp<AlO+wAdcP`cq*tQzi2iTbA{wmv>L z{Uf5Iy9=0l!Gegy34Sr%D;+%gG@edrl2_sk!@AMmNVSzA?AB@YXlk{4u?uXH@rkQ% zBdccVy`t@IEoy|WjRW3`ABO!fVsX8Ychtimu_%u#wWA+7?a`8Awj6YVpU8-YBW-Cl zI$A*0!P3{CFhkKlp_|L_F7LM)J=&t{&_>8QB9JFrG780csAX?hb1z^G*E?NU3M*H0 zyWs1p=bqv12q3SmhR<#A#IIG=BOHojNAo_a$!DQxEf3ow(yI+BeV8~DHlJIovAjKh z+*t*~V<73@Q0Iha&fO#^0m=W{v-ji|@OabrzOZMWNJpc+us`F=rH#;&eY2CUB`jWf zK;&8oS7VitNAq}tF<VCyu$G8Q2fR2}XyUDlk~MZWwKEl0W#<IUdkt^-ueyyds`449 zDH|ACWjg+6)r*?!*N&iO-9TRAAJD*LzS8{t7$FH78n<v-BE}&6PmI(GCOA0aFV}td ze$|+S+%B*ExA0L?hL8vFa(CNLJt0eZHE?s#CU2-i3ed!s6B4;FjwqcsqYuqW$a841 zV5DvkdeCoc@hvynMtKAUoRHh50OWkumGAp~+Lx9Q*jHoPwCJA>#;!gD*{g90q4IeU zvh%6P0}Jp>SL;zGHcy1jfK={QTb4nDmTyy=_QY96ZckJgEUDAD80UuTtgPCmGfP!) zES}5YzELIHhU@h8{ar42Tw)0G4H@zTnfq=WXD|$~P4u5DD;U-Te9PZ3cYMzqp*MSv z4Xol#&^hZe`l_g-sXNc=)j9m|r$0@#f0h|<9JEj+jDdor*3W!W%DfaMCp=cloQsDX zxp)@6G{OFP5_d#gV_w$zJnBHya0<5N#rbJS{?*_N!rZ!wmx!L(2dOwb$Pk~=H@)OV zo3Lyx>aoVpBKK|oLc9p_(E)Fg;j^kdOA9Z3)d3%Rp50iB5qzSn@gL8q9y^QM6+!Ix z!rk;NCL=t71Ii~no_wH4X&-El4rV{;65_<D-)SQyibHCBHRSPID0MlV2LdRnebfSx zzH?w@hKO9SbUQSi?LSV7YNPocsyc?%ci0s`?f#*(^OO-wB&P>MW;EVN+zboT7=oT7 ze}Jw2M8jZu6@Q)KXt#DqIiDO8*T8Ak&qG}@AoClsRjbDBp;-f*ii?UDFvn6)1DU{* z9=F3Z^-fK3B6nP0tB$!xX2@&a_s{-n%ArbO>SjGS+ZYa5BBEF1%Vh7V1|&+;-ffM# zcix5x$E!hbY{gwHfS9fX_Ax&+^@s)llS%p@In3a~GaHq>R7g&z9x(H8eL+MgACTA( zZZzKO%Zh=*VlW|`d`B|{3|YSa>IE#(93%FXUyIk}H;U#n5G?bu`VC*30~5)oL$Y}C zKG5M~2foY+$8(q{Xv5a$mz`>J3~8xdx~sUI;pcX%9Zo+#Egj6(VKgV4)bs4AVG4O$ zHIzB1TmTwG%MI()U}y0Q5EBP-1RM0ZqS`Hl@X1)@MB~j`ShN$@iTtX2P-RygYg%nO zJ_L!S7DX>6py}VTaO)LjmdM%sZE;x&gR4~2i!A3$Xx46kRta(zeNOldL$1IFjQo&N zYenhLUj@7B0f*Km+uN!eQ2vwmLoD^T$<Hm}%It3@2XPfyjRMiN19AKJ5*alSdbtuu z7tVT-dOIb}<aH0F5f5+07MY!_Euik|N0Y6*=?<vHEdGUsC^!>sJQX-b%?;~vS2AF3 z4wH-4Z&LiJ_1eW_|J)XKUO)9K#Y6@;DXIkUB{_SY&j{k#WIsfEOSf;9wbJNb{r4#Z z!putXGZzB(q;Zpf{+6?&rxV5Xo%wkio6wCLSkt1jSp%n%v|sdfKo3;?R|T|De=Ec^ z3tR7RWZX<YA5rccy-&@m`QI-r69k&NjTdmUp`gfj|7?V4=?C(l$-EzLdi6+-|G9+m z8(JdfK$*;QdADw*7*j&s*ps6Nx+U;+tS9Q^`h3?1VD}@_TKThQ*7iOYN8_e7p%FUW zSDmkGRM>@#kTio)?}fjkV=QNU3feG0A04`hK4$QIzO6GJ+h|_<>G!8eGLr~A!$#YW zS_rZp+2`sT*b<RvQHwS3LHG+;+@l2<*K}C539Njr8>xqik7uE0z}oFA2Gqb__)o*t zEVRDo_fh}FY1n@us75>U4jX;hfvg4vweH8pwir1SPE&;aNlYOIU)J%3WHxauXIS4B zM%Qd9bm%Y~Z6H%e18P_OdQ0YkZU^dx;a>k~5)723oc3ICntP7CDwx_|IL00h)HB;S zcR9ojG7Ag)o1p4g%?*uBQtUd_D#QOyb`#h^KDa5h8{#k>H4u{7=Vf8TqUPjHwwfad z0;;`9#6Z^#_WXBik{ca)Hc&G&1rO)I?&APil__=Ed+$e%eDvO=k7r6m9%QbF)MSH6 zcY0LLapHYPu>5~hReMK~g`Hwc_0`pL-9N~Y3#fGzn(&7f1;5trWNu;3{C=)I*KZDk zg~e5YWVnkK{kNz=*Wh~s9Po#qpC2bitpSU_Cz_bv^6vRYIN9fr^XGoXd-{5b1}IK^ z!8W=`r@i_`ek>ypCT{=b_2L60v?ooTB^F)M;i;~n@hL-&&oD7V6ZU{4d8`P-4w!x% zV;bYWuD#rU^3EVV4?;!=(akp=YMiHf3wFcizzQQX?1E*g6o*O*5nAKFW?>9G)iw6< z3kJ8D1*7Y`m;~v;;Y+`~nr{{baTY`$MDHoU){=DUObFI_*FK{BGm{@j2Z>jEtBg-b zb{J<i+^&RXC>W{Ho8L7)Tl1rbbeLbA|Ck9);N|EZk0Y3!753h%{?66ar2*7JAegk* zH(m>_iC9QYIJ4Sryz1R3{O}^r;_=f3!!H_S7JQ}ja+%vK*wJOe1e&Tj!|z%eC77>f zL?J|=82X2pZ}wYsz3_@#Vo(MVec8R~%SgNV(q!qwEd(al_x7GuTw$m)fCDb@)$Xlb zlGdHH6UYGvL=@mz@^$fNp**juyI+&jXbZkW#`d2|J1ya@T3OLB#*S`^m%HEIlO<bw z;(b=%cl+j9_{50`wPEGP;=V(+%#j<JH5QiQZk>a{DdBheGprHrBxIkDrJ{8gts_4S zeUW=J7O$^W{C$kH>AV2Z=Cv@`>X)#KH=N{}<)PnmoV(%%I6B>g(dEie1W7buob!hb znMepB+P*}m*^rZSaVPw=8vCrjOUC@DpSK@-hS}&|KuKgTQmnc!k3Ie3Pl@URMug}0 z-hLvYWZ{7uV}C{9MP9qe1pa%#CksdSHy=q%>Q5r+4%C!Azee@;dpVzyV#tVDD+o-I zsu~dIU2fG_>OV@#%|#2g%tuR}{`+F@yozw=Jdbi;;hj2}CblD(Kl>?+R+{2>eF*Z3 zqCatuZa~Ap$=a}9Oegtq!dcDcRB5N$SiMbwhkV8fnh`NMbcxgg;^IfjS^S?)4-fyy zwS#OEUQXh#O{9dl&$0f8BFxRnmnx31M?a#Ex1jeJvwimh?n207NM5`!T&p*uPlb5& z+TNvy@A|%i2=yZo30I9=4&NAW1RWvB%`BSZRPq@AyU6$rH1;&EktE{K{rRd0Lgk)& zK)y=Sda7_Y!)~;y`X<Ul=iP;jXmS=7hD5F6U&4h=g;8^K{7Tb=)ZF5ib;H)^>65!Q zm~@!DDeGaX9Xj^C<Fhjle|UW#S9p#cUVYc!$+%+>k?Av!0S$^`lFbO=QQP0-tmy4p zxVb{ImK7F*QhAlIzEWE3hq9y+k@?dcTes5lL|%Rm!zch9%5D#uslRs?vVLdD&sumu z()n|Gym)kmF&YTbC`#N5ocjH1J7IK)Q19vC`Z@^JUat6q5xX5OdYfQ}%m@#ECoFcs z(9M@Ab6BY>ZUeom2L4*?&8UATqeG0+UC`A<?*QB>@?5DpoJ#J;1P4grNsm<-c+zDe z86Ad6O30vQ<oS`Y2>OO*r2?6uuA{P$!t9vAC5@9-==j!388DIfPl6!TBXn;dOvm%z zvrYe%jQADaEM5>dayQ}0;S5_Sj$jbtjm(6mcUdPfD|<p#4_t+FG|#Dmc+wU6>xKbr z3Lya;&{d1nRV(XVatjTHbUWlQkOh$@=u>l^;sL8`V@HaDv>M%U`ynZJ%nUN-!x`71 z10^nZX@@$9FxWQu1xkOhS{VMH0g*k<)mL<1QYg}(NWG8;-N~ey8^DurAk(waWK2$5 z8e1y^%yO}z_%u%FoiGxs#K>J2#W7SJV}h(^p0TUp#t$6a_+xx`NXp*2G=(SJ%YK6U zbPJ~ji0b%X%9{WG1hfoG^P?OVABOsQGDM*`$;5~KHvkrl>OSNr7X-P1_$`ii!-a!O z>IHzFD1qhRmi#d!LJ=+umrxjSI^9+5=|FNv5!7K6P6Mof6j)z}1DSz%K*V@ST3>%A zg;PuMZYAwczr3&$=iSaL14|i6TEDlX2=TZiam$(E<ZDHcUMWh2W@$FWI1K&EXvnK+ z76)zbixM*;M7b$4Di`4T3Jw@dLtZBgKF#jHa3XmT=Y;`8lF*R8PqJ1UhCI?>aSJf^ z7Puji^CSK#7(*xm3g#A^a2|k#ZV_X+0D~NP{Up)t1BD|s^KQQYKX8I7umDLq@EWhC zdpj}%co_3|IW2`(Q=6OJN!SUi(okA-NXz)vrW3yjfc^*EILqPTC5hbYRReA*x%yH{ z4?LC9@wzsvFm%v@Ar<**Pdu?A33tQkkITo`oXF5mClVS>hWd11Mh0FwdOLbM?2Zme z?dY}l+8waj>r}-K*n=H71pAI&av1)4p-7xO83Kn%xn6tR(QEG@TX3}3oa^8->RzAM z%q-p4xF^o)^*ig-?{234!c?hUVq`o;%*^$u+@nq@_24Ni3X8%zcDX!#nDXCCV7>RZ z5jqbQ)_*IxVZl%_D~Art>eAnTT%Pdb!m%GzBrvZ0&JVO-t1(S~Yin5c$9mb*g|3!W zQl(Axh0VdT8xIDVi;U$fIA$HQ^yH59c69}raVFRk9PiSPS+6;IjHND+L%D6+b*6tY zw>hEbMiXVHKIgI_y<Y-1U(zNxx|pwMn_*%Mb2gtgswea_Y_9CQzocFk&XhmEZbCA{ z{5+o)pD3JJKP@xb94vp^sWX7U9vnY2W(mT9uCdSBgX0&+&x~7wW5M8=uPi}JZ%<cG zFxYkT%uUxL*Q4=ZkhFoZ_4vFU9TrEsgK_lqIv6kG=<qTfJ-t?|!+PEF2J-lk71<`{ zS=i(h7n<<9kYE$6s2%p_k;|Xd8!<16r&&nmT-<yg%dqW`2!$?N-H3D*3b2Sl)`>oD z-b!Hk=Mf``I?Tm4u|C#{T!`^ccrG&|jQ>{B#m?V2eE~6_L$WQ_FEGgF8sz55WwRoS zmKPevDoY~6E_Mr04IG<?b2Nta@y*YI<2M1pMSx{_G}iSMY~Jkp+5%V}eH{EacqTah zXzbz`1DoTI+8>PtFIog^Pmis~d)?`@`7Zdb`L27tjMwIK_^$iBUO3i%-AX{9q??}# z|5^au=-y;EUCviY(cjN{pwVyAyo-CLjU($~Ts(VzYI8^sI>pQ9m@C#z*RxG=Wb{Xa z{Nm3cx!-g4D!;t^JtPxYw$~fKWCkX+vh0Mi`T05a8Naa6myV4xG4`2zc_SA4!&&RF zD+X#UdajJJ;nl_YzD)wl!Y?gv@Gi9N=5J*Nf60jA6;Lnh^2YO+IBEt~*G<qN%cI~$ zxZu{`Fu|{b7cZU}`<e+_g2A5wsxy#0cJVisuP%0tb&U~NFy?&MoQ%&4uzGC19s<j9 z&Dn1CdVSZOUIL5ZHedj)@~MB#S`~n0+h7+hD7`uok6#eUZklzmq~}S2b%~>A*{Kay z*&NLRtQb4NEXGvv+%He302Vv(2j(mrPA+aPUd<9%?5{V@YGai}i|3fM2(TvD<Oa$B ztod^;>%=QX>>puM6EPT-o6OJ851^&jizq{2olY$+!kHJKVG{!LDU&{X<-7}+3X8Fr zDOfjyU-SffgJ0xeeN8m$XFWjZi<`mV%`-py3^w7|nX!*=j(;}xPfRdqA*u_y<aPQ0 zme=70g(4drUaz;u2Kv_S>-{Sr6zc|!2rq5+=&)>y>8Dpjs}*2aH#XTt0?T4`u}rN0 z96z;T+vpL*{&UQ{Z3AG5R(6}^7yEy}x<(1C?|McTV{z;Ez;bZ|Km#nRwP%ER2SotZ zcaHBtH*8QRz}oC(H~W7yF#@Af1Xx#Zwa48XF&hCLeg&{5gzl>>u>2__jsUEf6)r?f z>^B1oG^nR*yz7fDfMpqDJ{u=HV7$7he830*00yo}L_t)>gX808z^;Q;9~<u?M$Hmz z2MagG=&*di$JWje&4P^{tIy%+abCBAuC+URC1~0W+fdx?dddmJxY$6m<|lr_BF#AX z(^k=@TWgU4ONNFPnbCQF43ZZa|KfxIx#nS3=$;>8Z0IAF7!`(ttYGiahD~5~BMm!{ z6L!$NU+5Ou2`joaG0zFsd6+%8#TXR1OiUWb_ywy-Y}V4mye)Qv9g4g97onPGmsx<7 zoPZO?&A@6e?12uIq;`$haS5)K?mNrU&l-0Sa+M{c#loggHbIw7o3V;B8_I5!&9G%z z=Sz2aLrJ4(Gqyiw0+wOVa#+rmqp!XE$bM?uv(M*n)k*AW4%Qxg%{`=^u9w_dx@&Q@ zkONO(kzo+et8GCS<4<ckvZMp-hUNikIfYRs?kakP@WM}&4l34FGC)D?M@i0etXNVr z)Op$9LJ|-2_xXC><P$b?jj(MT11y_pLpHFSv2KA?c!A+2{4ms6WddyGJOb~HA<j2D zKf>C;oVqwc+6LE7f~HC_7C^HqaqcD{kpYKKBIvKMNd_Fyn2k){P-Gs8h!$cnxEKcp z*_L#R#H}1T&o8;a9J65HPY=Nqz-lfe>-x2S9w?76=vH!qofkgRJWS%raxoUXM`)O| z%`GzGpw=`p8KC(ifyMrk4R2gwkZ9?LOZ&NXGZu?$S2^8oi7h1h`6*%*#SvEg5x=_h zGG=F8{d{<JgP7BJzl#`XaC;_3iS~4CXeRb^c4~Q3K%)PgYsB`iuQp>a{j=ehV7ElO zwf`(PHM#LAa~^E>`S{SpM$9huTL!>)U?)WTm3|J+ve*IhJ2(kXJC-&CQDiNbCI~Ex zcxB+n0z2}|4mDa9+2y6DX@(i;|CA3eZyX7%a}u=k3bT5LlL#!^#)#&gZNLxOT}TAb zEpqu3(UxZ2s}tajv#tOd<~3L%tHJsdU`a6HS<yQUmcUNE-WXZE6GyI?ZDK)*ks`dt zoZ;eUt;-XO0L#T}oM)E-784g)(g>DGGndZ|pj)qhk1_yj{=Ccj`&UZr+~2X125U46 zUePmlM1W*~b>0OYCb=|lxu=c>*2rJ1PHptN7e58BEZsip-i#GsZT>+x+dtJY1Pu{A zpT=R?@C>@fPWBJ6M6=GjN3UwI&JD89Mu%WPENz^3gP~bur(SIei)Z23yiIuZ=DJoy zhb8u(<)@Z6&JCWQv@OCgd<8X%p8kQM)eUeV-IvdCQ$2C_tC;N>jLK(@-={?{c$oae z2%ISv2UudaO8{N{hS}_1CGPkl*AG7H5owmkDuB5VCO#q~9~?Pu!gEEl_45oTOn%gk z+{8&@W1oM-lMDi56?1mX7PASOp9G6zFnq*&n%At@#A){;=bHG)1|Fsj*0lmDqB%1+ zm~O<zz)K`Wzz-+JMu2q-lt$n}val+KbFi8V3A*LK<svoe9wxDPkjzcGCN&S!?-H%9 zd7G<WAj|Nhfz?Dj$JJauTM{KFY(*cFMWucpTi=B&OSU1g`sqH`PBqbDu$mS2-`W;R zBaJ`USDdn5={Dw=VA)AzvVFf1QsQnf3nwY6oQD;x5-APB+R&O`EPm0|6|}>edMr4e zTQOR%`L2~M4vmpgSV*5hSZDs;672YAKyW75&XDk^D>!~J2)qA0{zdT2SJvQ}@v-38 zXJ6QFejFV8y8WNpgF(&dxAl-ma;&~~_~~&t7_Zgm@bx&aUANi1%ysKV&q;*!@y|XB z{sy#0i<DX)^>lq5ym|3&dcP*Y=0|68k<y-z#~8=}8(Q#Buz9atX!nswsl(>G<|M(t z>o#wP&kN!MfY&Xu>qNrJMM`tQKg*-93X#&AkYo*ZX_3;eEWi1<YwXN#K(j6~?H8Oq zP7?ehky1ym7hqZSNU68i>9slAuQPwKc_Lxm{OpnIZ^navpNo_}`kKVx+k;~_zX-zC z8Au-2Bc*3<x`QNA`Y0DE_34pPJ@l?^c(41e+palbU^<X+B4G_OUG3H$OK%5bvD<rK z2X@C9D;x`s+s|0Wna|)zPlu(Q8Ml1Fj6ntl47uex<LI$EVA6B+z(((dcE-`(+XEHB zQ8*SqnZvMlr1VS^k<tqlQ7dpl(TQ{&4n?d8MJcQgR46P8i^8I?C@cz#3WY^sQCJif zg+*aep|B_{3X8&`uqZ4l6c&X=VNqBV7KKHH!lJM!EDDRlqOhn?SQHk8MPX4`6c!Z< wi^8I?C@cz#!lFW9QCJifg+*aeSXBJ~AAlcoWRa}(R{#J207*qoM6N<$f?8aJiU0rr literal 0 HcmV?d00001 diff --git a/src/middleware.rs b/src/middleware.rs index a239355..1dde054 100644 --- a/src/middleware.rs +++ b/src/middleware.rs @@ -2,14 +2,15 @@ use crate::{ model::{AdminAuthCredentials, Administrator}, AppState, }; -use actix_web::{http::Cookie, web::Form, HttpMessage, HttpRequest}; +use actix_web::{cookie::SameSite, http::Cookie, web::Form, HttpMessage, HttpRequest}; use wither::{bson::doc, prelude::Model}; -/// Returns a actix_web::http::Cookie instance designed to be an authentication cookie. +/// Returns a Secure actix_web::http::Cookie. pub fn get_auth_cookie(name: &'static str, value: String) -> Cookie<'static> { Cookie::build(name, value) .secure(true) .http_only(true) + .same_site(SameSite::Strict) .path("/") .finish() } diff --git a/src/service/articles.rs b/src/service/articles.rs index fe2cf62..38f7849 100644 --- a/src/service/articles.rs +++ b/src/service/articles.rs @@ -40,7 +40,7 @@ pub async fn post_article( .insert_one(article_data, None) .await { - Ok(_) => HttpResponse::Created().body("Article inserted with success"), + Ok(res) => HttpResponse::Created().json(res), Err(e) => { HttpResponse::InternalServerError().body(format!("Error inserting new article {:?}", e)) } @@ -74,7 +74,7 @@ pub async fn update_article( .find_one_and_replace(doc! {"_id": &article_id}, article_data, None) .await { - Ok(_) => HttpResponse::Ok().finish(), + Ok(res) => HttpResponse::Ok().json(res.unwrap()), Err(_) => HttpResponse::InternalServerError().finish(), } } -- GitLab