From 4d81678c1d810832d642e888cae49d4cd36ec817 Mon Sep 17 00:00:00 2001 From: olikol <78661364+olikols07@users.noreply.github.com> Date: Sun, 24 Aug 2025 01:30:12 +0200 Subject: [PATCH] Added basic admin page --- .gitignore | 1 + main.go | 18 +++++- src/Admin.go | 1 + file_handlers.go => src/FileHandlers.go | 15 ++++- src/UploadHandlers.go | 36 ++++++++++++ static/css/admin.css | 67 ++++++++++++++++++++++ static/css/global.css | 22 ++++++++ static/js/admin.js | 71 ++++++++++++++++++++++++ templates/admin.html | 32 +++++++++++ templates/ascii.html | 19 +------ templates/images.html | 16 +----- uploads/DSC_0094.jpg | Bin 0 -> 1712423 bytes 12 files changed, 262 insertions(+), 36 deletions(-) create mode 100644 src/Admin.go rename file_handlers.go => src/FileHandlers.go (85%) create mode 100644 src/UploadHandlers.go create mode 100644 static/css/admin.css create mode 100644 static/css/global.css create mode 100644 static/js/admin.js create mode 100644 templates/admin.html create mode 100644 uploads/DSC_0094.jpg diff --git a/.gitignore b/.gitignore index ceeb05b..a98563f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /tmp +/uploads/* \ No newline at end of file diff --git a/main.go b/main.go index 4c3c743..ae897ae 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "Advertisement_Panel/src" "fmt" "html/template" "net/http" @@ -23,11 +24,12 @@ func main() { templ, _ = template.ParseGlob("templates/*.html") fmt.Print("Now running server!\n") + // Serves index http.HandleFunc("/", index_handler) // Serves json for html to find file names - http.HandleFunc("/files", file_handler) + http.HandleFunc("/files", src.FileHandler) // Serves ascii page http.HandleFunc("/ascii", ascii_handler) @@ -35,8 +37,19 @@ func main() { // Serves images http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./static")))) + http.Handle("/uploads/", http.StripPrefix("/uploads/", http.FileServer(http.Dir("./uploads")))) + + // Serves administration page + http.HandleFunc("/admin/", admin_handler) + + // Handles image upload + http.HandleFunc("/upload", src.UploadHandler) + + fmt.Print("Webserver running on http://localhost:8080\n") + // Serves what ever the user is requesting base on above urls http.ListenAndServe(":8080", nil) + } func index_handler(w http.ResponseWriter, r *http.Request) { @@ -46,3 +59,6 @@ func index_handler(w http.ResponseWriter, r *http.Request) { func ascii_handler(w http.ResponseWriter, r *http.Request) { templ.ExecuteTemplate(w, "ascii.html", nil) } +func admin_handler(w http.ResponseWriter, r *http.Request) { + templ.ExecuteTemplate(w, "admin.html", nil) +} diff --git a/src/Admin.go b/src/Admin.go new file mode 100644 index 0000000..c6d5f54 --- /dev/null +++ b/src/Admin.go @@ -0,0 +1 @@ +package src diff --git a/file_handlers.go b/src/FileHandlers.go similarity index 85% rename from file_handlers.go rename to src/FileHandlers.go index d593d0e..382c3a5 100644 --- a/file_handlers.go +++ b/src/FileHandlers.go @@ -1,4 +1,4 @@ -package main +package src import ( "encoding/json" @@ -10,8 +10,19 @@ import ( const staticDir = "static" +type FileData struct { + ImageNames []string + SpicyImageNames []string + AsciiFiles []AsciiEntry +} + +type AsciiEntry struct { + Name string + FontSize int +} + // move FileData and AsciiEntry here if you want, or leave in main.go -func file_handler(w http.ResponseWriter, r *http.Request) { +func FileHandler(w http.ResponseWriter, r *http.Request) { data := FileData{ ImageNames: []string{}, SpicyImageNames: []string{}, diff --git a/src/UploadHandlers.go b/src/UploadHandlers.go new file mode 100644 index 0000000..3ac2f18 --- /dev/null +++ b/src/UploadHandlers.go @@ -0,0 +1,36 @@ +package src + +import ( + "fmt" + "io" + "net/http" + "os" +) + +func UploadHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + file, header, err := r.FormFile("image") // "image" is the name of the file input + if err != nil { + http.Error(w, "Error retrieving file", http.StatusBadRequest) + return + } + defer file.Close() + + dst, err := os.Create("./uploads/" + header.Filename) + if err != nil { + http.Error(w, "Error creating file on server", http.StatusInternalServerError) + return + } + defer dst.Close() + + if _, err := io.Copy(dst, file); err != nil { + http.Error(w, "Error saving file", http.StatusInternalServerError) + return + } + fmt.Fprint(w, "") + fmt.Fprintf(w, "Image uploaded successfully: %s", header.Filename) +} diff --git a/static/css/admin.css b/static/css/admin.css new file mode 100644 index 0000000..edf1fb7 --- /dev/null +++ b/static/css/admin.css @@ -0,0 +1,67 @@ +body { + font-family: Arial, sans-serif; + width: 100vw; + height: 100vh; + background: #101010; + color: #fff; + display: flex; + align-items: center; + justify-content: center; +} +.container { + background: #212121; + padding: 24px 32px; + border-radius: 8px; + max-width: 400px; + box-shadow: 0 2px 8px rgba(0,0,0,0.08); +} +.active { + background-color: #007bff; + color: white; +} +main { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + max-width: 400px; + background: #121212; +} +nav { + padding: 10px 18px; + border-radius: 8px; + width: 100%; + box-shadow: 0 2px 8px rgba(0,0,0,0.08) +} +h2 { + margin-bottom: 20px; + color: #ccc; +} +label { + display: block; + margin-bottom: 8px; + font-weight: 500; +} +input[type="file"] { + margin-bottom: 16px; +} +button[type="submit"] { + background: #007bff; + color: #fff; + border: none; + padding: 10px 18px; + border-radius: 4px; + cursor: pointer; + font-size: 1rem; +} +button:hover { + background: #0056b3; +} +.preview { + margin-top: 16px; + max-width: 100%; + max-height: 200px; + display: none; + border: 1px solid #ddd; + border-radius: 4px; +} \ No newline at end of file diff --git a/static/css/global.css b/static/css/global.css new file mode 100644 index 0000000..ec922ea --- /dev/null +++ b/static/css/global.css @@ -0,0 +1,22 @@ +body { + margin: 0; + background: black; + display: flex; + justify-content: center; + align-items: center; + color: white; + height: 100vh; + cursor: none; +} + +pre { + white-space: pre; + font-family: monospace; + font-size: 14px; + line-height: 1.2; +} + +img { + max-width: 100%; + max-height: 100%; +} \ No newline at end of file diff --git a/static/js/admin.js b/static/js/admin.js new file mode 100644 index 0000000..47c5f0e --- /dev/null +++ b/static/js/admin.js @@ -0,0 +1,71 @@ +const imageInput = document.getElementById('imageInput'); +const preview = document.getElementById('preview'); + +let currentFile = null; + + + +imageInput.addEventListener('change', function() { + currentFile = this.files[0]; + if (currentFile) { + const reader = new FileReader(); + reader.onload = function(e) { + preview.src = e.target.result; + preview.style.display = 'block'; + } + reader.readAsDataURL(currentFile); + } else { + preview.style.display = 'none'; + } +}); + +document.getElementById('imageForm').addEventListener('submit', function(e) { + e.preventDefault(); + + // Add your upload logic here + const formData = new FormData(); + formData.append('image', currentFile); + if (!currentFile) { + alert('Please select an image to upload.'); + return; + } + fetch('/upload', { + method: 'POST', + body: formData + }).then(response => response.text()) + .then(data => { + console.log(data); + alert('Image uploaded successfully!'); + window.location.reload(); + }) + .catch(error => { + console.error('Error:', error); + alert('Error uploading image.'); + }); +}); + +function openTab(evt, tabNumber) { + // Declare all variables + var i, tabcontent, tablinks; + + // Get all elements with class="tabcontent" and hide them + tabcontent = document.getElementsByClassName("tab-container"); + for (i = 0; i < tabcontent.length; i++) { + tabcontent[i].style.display = "none"; + } + + // Get all elements with class="tablinks" and remove the class "active" + tablinks = document.getElementsByClassName("tab-button"); + for (i = 0; i < tablinks.length; i++) { + tablinks[i].className = tablinks[i].className.replace(" active", ""); + } + + // Show the current tab, and add an "active" class to the button that opened the tab + console.log("tab-"+tabNumber); + let currentTab = document.getElementById('tab-'+(tabNumber)) + if (currentTab) { + currentTab.style.display = "block"; + } else throw new Error("Tab not found: " + tabNumber); + currentTab.style.display = "block"; + evt.currentTarget.className += " active"; +} diff --git a/templates/admin.html b/templates/admin.html new file mode 100644 index 0000000..2d0889f --- /dev/null +++ b/templates/admin.html @@ -0,0 +1,32 @@ + + +
+ +A7ikRjf24~)#y)2m~%>F{?KSSE%?5#=`sZ4hJ)BTHv3KtB)kjNtKDm2@HkKyu zjQd@B;z!W514crEW`T*%I878UxlH|8b!NY;rWaF _q3ar?f};8$bduUYb1Q7Csq!bEAs`De_!?j)&& zTeEhE*|#N}-oo%iX2#3&A-+rM(yn+!YcosD>o;8fN9)QnvAm0>JD01=_5EbIcl*Tj z&-%9EVS>E-FFsV{WSO{C>)4e02I;FOK2cTIvP!U=Aele)PxsR)JLTGDs~)wxd*!zP zd(fU$XTPNF4_-OP{i>k;v*TBuCLNT1QomL$JAX-sQ@6L5fl0ywp)L2?4_r2QF0=gA zrl*J13{SLpyK}M2E!y(DW1=(j5w45A{Bb*Zb}Z#MGV#yT!?TR1tX`_wp|fsDZ{CmE zxFvNTF0hFxe3fH2`fYB`a(+&fwX?hk``3y7t5lp47GL#K3|R2kNz={9K1%A+#I!u$ z8n(k%Vk|P$%Izi`+Vh_wGjW~n+Si9=j(EKim7Y|zVAZVB-@5-!8~v8x%u1J;_|T}o zQ^Nb PkFynPus2w-EEU4%z&$ig%Pf~sNVh!~lDgPNP z4gdJqYcv1Rm>s=yX~iRt)UVt%DvKHScUq^q8>pSk`EWLXr#tMku%o#2Oyw<(Uczn@ zJN|`6J(#wlsN+$Zfn3p-jok0ei}K72#p-`%%zgx#>zT_Is;F7({^!P~M?G~DKYFR{ z*flRd=;M=0{<06>*p~@%-N-rcWM9?>XP)!NEL0};ryT3jKRG$$mUFbf%w_kNm%q)J z{y1JpWAW38Q|D!*n451CSeO`UpVGf+>(Z*V+5c9YbjfKlkC(YVJ;Cdfjlhb3U;gNv zejvX7k8sLbmWJn^ms<>ue=V8OBJ8;_YgXxN|F1 =#$9@Z|IRD#p{h#dFdgo^Joc(Sg^+M7;O}@~|)*^guaiJyi$?HkSH9lvW zcl>9VbR^+YDd)M>ymwwo_NJsdl?P-Ps~HH|gj_2U(z SCV!v1 znOkl1o}Ct7mVEL1vj6m7+jq&nZV#VLys?7EGvL&o4qJAgBlDKI2n&Ac)8F2DQYwLi z<@0}rB{TO
FfCQ@pt;%M*tYtDK$LFrnL)A{;wqVenQ znkY3-@nF(4xx*T8uKq#MJL9?;9sSS!Uu7G2$gPb3lCUy&_0Mv@{W~|$6rQ@KZpn0^ z&uKEZCx$Tm{`7dJ{nTk5kv4G)<)78_{|Xn1Iwx7>TI}?5^0`mCyXra>L!~s;<{2I_ zGQ4G~{@D8CSM&c2%El(Kvy>;e^oM@<@HhTYZJyfVSWSmhe@%aMZJ+se&u_VAy|t=G z*Dl?)YRj~O& Bl4f_v(HjB4%AKKjp4`RBU+#!voT z%fEWbzuf=${yD$2olW;HE}s|T>b21!``BJ@xhc0z1P^L@xKu6G-4Xj`6GxNZMcJVF z20y1e?f>-0Ds_{m+Cq_~XS%lV9=NdX_q_cdEcd>NJ9*{76`9M1ZN_}^;lI-_|M*wD z>TTYoqmwyWe3q3x?6IHU@#{Z>{F!8_RlcQ9?mFG5d$}OdBr#$dql1b4*1eLMGi4W8 zlp4(aTlnx_w%?SG2~)CPO#eDBGxe!%bYSTuiJridmpttR_c#3Z{hnaykf7jgaiLy4 zdDZDE?z#Q%-37n6ncKhVOFAEX=e~^Wn+uih9+!2Q*JORtJFr27`KH^=UQ3Ui0v$Zg z=i(AB Y{#lY3AKCAIt-5iOJ9?R7{`tohA)I42zXPURf**)&xR-Qb6`9fMu z$%EoT)j9J#eUHsv#qoI0?xv*aY@OO6)9hr=)>TeYc08_jF>IIGnpY|PzH_HmZ47q& z-eb+z6I^Y}$}0Dt;X>C|HnS<>EM*D&hbJ1zo<20&QLZsxQgmC-`XfF3_6t_ {Cr@AIx1a;u7z7v~$3Zf}XpkHW z=s-pWhDaI4C o!({MV0y>Qja;6}|1O^7s;bt2c7#RFI7$g`NN6*k>9z8>E$> KBNZ}beksiSA;O&>i&Z}bek z(KGa>X^ftsH+qI%#^@P(qi5)io}o8-hTiBIdZTCPjh>-5dWPQU8G55<=#8GCH+qKN z=oxyWXXuTdq4#j~4874a^hVFn8$CmB^bEbxGxSE!&>KBNZ}bek(KGZ$&(Iq^LvQp9 zz0ouD_(#vs8$CmB^bEbxGxSE!&>KBNZ}bek(KGZ$&(Iq^LvQp9z0ouDI7iRW8$CmB z^bEbxGxSE!&>KBNZ}bek(KGb2SC5{dH+qKN=oxyWXXuTdp*L;x4874a^hVFn8`fv& zfzPW`g`AjIRsZrxfqSt{OSJj|_1T}}{y*Z0@N{;L4+!#i^Yn3LU}R)q;PLRu%*$sI zU|`72D=7+ccT$Lmj8b4f$H2tE$-u^7$iR@8TwLHA>=ptt)6>;ip*YCh3B*R=Z`T+Y zLA=Yl9svppAQlN&Fu9nSp_^g@J(~r@W*9Bn~?DPb4WD#AX7W z_9s#l5gEn6z$C%Iz#x(iVe5d{Nf5RJh@Fy~m%_ln1afmhN^S~>eT0F5p`)xcHHCqJ z*@uCFp{*=4wVZ*0`3eIAgGx?mZYBc*^AC{T+| -Y^NbDpec1dbQ3CQox`303lnduoN3L43p3Wk=J778Az IG*7?>v@#FAz*Fl=vSV34?l5K~#ez`) &P)fVALpPDh2+wrGKf4VTQaaRa53;Rh%iVp$T280XfWt9 z7%`YLSTi^ J`7-kZ<~PhgS=d;F zSrk}wS*%$+SVCEnSqfR|SbA7yv8-U(#&U$^GRs4j4=n#!d0AyxwOOrLJy|1I(^<<| z+gPWuE@R!wdX)7l>r>WmY;0^|Z0c<0Y#wZpY*}p8Y&~pq+19fiV7tinnC&Y&JG&&i zHoGmmKYJp3340s+O!hVG``ItCKV|>H!ObDhVZ`Ca5yg?m(Zn&0V-?3fj!PWRIev2r zaH?`zar$$na8`2mb1vcB#d)6dDd%r4K`wPJTdokUEUreb8C>hQj&j}M`pnJEt;B7~ z9mt)@-M~GAdjt0g?uXnzd4zbhc$|4+cuINtc$V`V;JL~3nU|MWjn{!UinoNfk9Q^S zVcvVZKlp_C^!PmaQuylmX7g?1yTtd7pOase-;qC#zlwhv|7QO4{BHy}1=Iwb1ri17 z1ZE5D6u2(%RZv*aP|#m6SFlHLmEcLi7eeepYC^6;DMBqmi-isgJr-sbRu*;^P8Mz! zULt%{_^Ak+h`NZUNR~*q$XbzeA|FJBL`_7)L@PvRi|!SDAjT}FCgv%YBi1jrN$i@~ zFL7CMNAXngPVsf(m&CtINJ}_Kq)K#2te3bd@k>%c(p55Ba-!sR$-7c4Qd&}hQsq+f zq>f6xkrt7*mQI%LlHMeJONL2COD0IBT4u4#8JVxLa b+ys*5Te5U*q`Tg>*6hsvq6>=12C>&AvpeUp0p;)T8Q1P7NZzXl5P^BiN^-6b@ zxs)xG)0C$uA5#9HBCq1BQlqk3<(4X^s)cHX>U7oPs^8Vr)xy=<)wZj>P?u2mRIgHB zt$s&?SHoVTP-BtC6-_ox3(aiJxtbTWn6yl_GPGuEo!4g4Hq*}3o~wOPhgHW?Cr@XQ z&UIZLT}RzA-PO7e^~Cgi^qTax>%G%g(T~!fsDE7lpMj}Cj=>Ux+lE4hUWQGEy9_@W zX&EIO%{IDX%xmmsTyMO?_@jxoNvg>_lN+YOroN`_riV=bnwgswnXNN>X|7_PU_QtE zx`l{EfJKkR2}@Q>C(C-vJ(fSM%&bbRHd(#5*0s*IUS<8lM%^aWW{J&XTP52>+l96d z>=f)0>=xKPuvfHCv|nWZ$U)g5#bKGlb4N|bEXOsD@0<*rik!AOeRsBUu5~`(!tCPi z(&ci_Rme5eb(ZTrHzl`px7BVR+)dr9-4A%MdU$(G^tkRR>zVAi(({9txmT^%5pN#v zVDDMpk9@RzihOqYGWmM>PWHXyr|OsIx80w?-_w7x|J?xffWm;?foy>RfwKdj1sMj_ z1RW0+4vr6A75pv4DWpH-cBn>ZY3QLa{;-&^m0{n*UBV}YKZwwesEs%sDHWL+xg&}_ zDlBSQ)YoX&=&8|9V@zY(Vy?xi$5zCijFXDXiQ5~`AD XMHY5ZbI(PJfXboyd(K?`4#yW3$zQ`3LX?%6;3VuP~=^-teCMl zws=R0NJ&A-nNp3?*3yS%c4f26ew2rmZ>|um$g4P0sa4ro`Mk=lYH2k~b#nEg8pWE% znuoQHwF~PQ>yqjY)hpMx)IV)-Z&=aD)tKFQw#lGrQqz~_@aA1DvMmiQk6YbaSGV!C z6}4S&w{D-`!P1f0ajw(2b7tqiu9U7*-3Hy$y8rYf_nhiA?48m3zb~!tT)$cWya{X* z@+MrHXg_hqB*95llO9j@oxE*|!j!HlU#7-SJvq%}+WhHU(@Up6nBg;H$4r%(6K4LI zl`-q;Y^T}l=g7?Iob!Ed%G^uy9OkW?FFU_`{;vg@3vMiQU$||N+M;QT*%p^AezqiR z$?>HYOII$FTGqYn@AACm4^{-NII_}w<;qnutNK?ntu9^ta!t&d3u|50?pUY0ZsB^d z_1zm7Hk597wJ~AiwN2ie4sEvByl#u?mN{F6w{~q~+*Y~m!}g5r4|YWExVY16=b>HJ zySDDu+r4~`;-1-iMfdja 6xu(P0wyUXLfGedGqr-E?8dJb )&tM-U_~*^G@U4miG?t&wPmZ@bqKR$N!&tK1+UH{>9|Wp|1g7?|sYt_WOI+ z56K@Zep>uI{ww^~^WWuv*#FG VRW&tPL;QIMFNom!%hl$xHIXRGvn_kJaX%oJOta8q9c-vZ~ }1OnC3`zAn+mIn+=ATHl0=1y+?>2(s|s5su;EsD#a19;eI*63l9Fs&B}b60 z3K6~m3eNdOsS2igX1d9SCI$-TmU@O}1}3J4ItoSxhUWSPruqhEx(0?;1{PLEh6+%i zWXGjoQ 2beX(nTMP_a;idDrWu4N_obrgqG7NqJ2r55Lx z7A2>;mZj#EC?i{1ToROu2y3jtfoeohY8r|GDamjL6qFX_fa578SwA%=H8(Y{q*&ij z&k)7U$wkF*4Jg(nC+4OWCF&L>mg^R$mXu`XrGqpZKr~n67FanKr6!i-7lq{K=fIMj z52&M8l%JogV4`QDpb?my%yztO@oYNQ-ZNN@iN6OJYf?trF-^dR;>UT?5MyLklZI zBP&BAZ381K0|U5fum!0|stqi34a`Ff&8!SetqjcdED=h5Q%e$45=#=16yr2Hv9!V} zIJGD {oV$kf;zVj4)+CpE9wGcPUQR>{!9K;O_n!PFE?8JmJRX8MMx zYC-Ds40KIR^$Zkpa~0C`jrB}*P4cK7kwPVyk3mY62JY%uP&Bg}K1k(A)wp<5*Bo zlwXmVn^= nqHhQdAb7g90{IydR4LF<#Tib%zE&>z$)%u_ z;OSzkRFPYtmy(%cWs;U;Y-D0!sB2=7lB{czVq&UmX_jQ9YiM9(nUZK^X=r3<1a=)b zOIZ0AWu|B5CFUR-W$tKT?&M@-XkuV#;9_LvYG`5R=;&f>Xy)wf>SW^Rf~4Iu58@q| z3o=P@K}xb!T7FS(Vu`I%CMW>)vkFqv!G *(w lwpE1B&vKQ;Ulcl7@Pa7zP;{o{?FS>XeuRi2~=+;*$Ja zxXzH&+=A4i#FEmYR9huua|1}6gS3TY=9SngX&XV}6(r(XQIKC;T9j&JU}$8kq-&sO zXb3mQIX|zYD6zN%BByN*m+;6;&&UB~t73?ht|`L6;EY62{(?won?T|SWE0rQPz~Cq z2(LKhBqnD=#dQr428E DOSp?%QZo{(Qf-wG#)f4k6+uEr z7vZB|P@p7&3VvH9T|=a>PAp2yO)V+POoloi*`xrtq)TE^b}@D-a4CaB4iQ|~^+N0n zF38C&u~jlMg?kENv2SKdNq$}`R0&exA(X%^fhsabm=m0lSX7XgT3l?aWP%7FuxM&t zP-04EX|b)6HgfWU%DJSLBxdHIxCtubnv$OCn^>HknU{|2C!f;X%sf!22j}MJmt=rt zkrEqR+Alw|I5j9Wr8F577cgs({Dng$EJY&Q>71XFUxaEPii@$xW3dp6Du^E-;fCZi zkJ41fl&sR?5>Sa1l$wI<78E)EqQty(lr)JV9hsVwlV6Tgw|h})Y93Bm$HLM?oRUsC zrMRsPC@m_;!7c5Zn4X$ff?_rz)8O HGn}xfzzilViZDY7iz19b!lDK}jIby{4 #5NVvQhe)H@?O0lp?~_=P zT9laM?1=0wP+K*iC_gPTC)G7CF$uM}0ZIBM=9MPqfZCAxMW7nMF*m;y)G|Q?Tv%p$ zUTR56DyED}YFbfdUV17d5fYO3C{6Xrw^cGmn2f65qcqhc(^d)E&<3?rVDjMXgxh$q zG}LsYS`|e%)NnI| Ne z1M-VYoQv`c(BoLw2+|V)n~J8!H#4OmAKZFHO5NxNxuqtSWPmzPc+>>tm*%BFDs`l2 zL9;Emq!Jtgh^82t0(f@B)*^vqbx2zqVMkDE3R><9N=?CDCc)Aca{PeBuqy|Z*l0$B zgs?02FH0>d%1lZ1$ 1?UR|8npgx^;SBDG zL-RPSryX39n3s}Rl!9HAOJ;g%aS5nHV(x6|XlY?+>Sk`}XliI? {FiN(Rtu?1VDkfKsVuz=ERNPYo0 zk((oWLm*+F)U*=h*aC?;<(HJ?gNl1SOCv;A10)j!>O0vgA^IgCLC3swP?|#|7?7ZI zeqM12C>Mp~hbI<+tcC}VM`AHZ1)3WjbBa _8)1Hjs|8M`m$J zeo-Y@2r?WNoLUIsLAW`YAk_*A3gD3=t3+@U-Bu|zC9@ axshGd8uM^S+2%O__X29j88Qj)E}RbnwD?SRL79dk+`JXqocjs9BYB!c># z6}l;qB?L-#SZ{}f1VK(F!~h5nW}b~cs%11hY |)_+;Ogw`W@zGMVdmuMXl?+llN7-A1eX>R E=@7XZ8d#bdnpnEII2l{Im^&Jnnmai<85vku7@NBqxf+6} zt3bgA@;cUn2^zGp5(PAQ1uimkGO-m-P}Mn^c1A`z3WjEAA&!tXG0;&kMk~8O?f?~o zIhl5bM&>#ShDPQ%^&1(P=qMN&qZf_{3yeTE7@6R90rv7!K>=bV!oQGYfjw-%DFjUl zR-(atgD?r L|n56OB+DnQESka7o-7|_cE z?1~|3L75Sx7n>T0SdfdG9hZ$hcn%vhpAAwC%4W31kh+4lb|{QmLQ(*a2G?kCkrV nwP%|mwl010PRQ+MFS<}Z!i(EpAUER#xlQlxa z!lgDHy7cH%N^{BNmej?Y4_|()X_5B1RLj!J!_zAwGAcbIGpnq;qOz*Bt-YhOYs%DV z(`U?_wPfkC 4yE*}?dQZtndF>_5(=PGWV>{bGDZ)j?1n0ZSp*ukGQrKT*|a^%XB zFH@IpJ$m)&R}J^@G>fvfY0I`9yY}o`dU^Zw<=c;6fBxMgBBP>X#)=&$ZoK$m=^2?> z**SCN&XYG^{?xMaipr|$nzd@zsavmp{lCS)!_2_ID99wpV9#*L*j9E~5bKHRtgXGR z>z21(POhu`RejPfZi4E8byc1_*DX C8ntV41Kld zrLE@+8Nb@=c6(Qo>cUSiLvMar+x7P5(n&`39hbBXHAHp9UM>5k@~fWV&VPo6Z~Zeb z|4H;eA=h2zuAlXwkH`II)w+FWT>C4ZJ#yvDx*5@G9=-W~bN!1-^IyMRRlTAc<6BA; zH?XK|{b%eqVd<2A4hlu~*Zwo)p8U^H`R%rWUFCm<@L&6{PHhnUR(d4rNX&nR_}BmT z?!VDrDx&b*Hs{*b o4EqtKPNl_9KBEobz@Uzv21ze6nJnC41MA z1bP1-`{d_){bzV9S1Gn%A)@%`za{g(iG3G5W-3+r)pDz|;d=i0jQ`@l)+M=Je7&dd zjp1>h!y*5S8GLo#uKU&2)Y!@1{AJ_Tb(Y`OM7z2Px%t{pcR2fa-nY5S>X%lAoY4-* zd{SFgdb;G=i=!t#&dPk2aKz}iuf{~TWx;E0T|GAJ*!kr4?TxukHAe&X+Gd{HZF_4v zAFKPvwZ<=_l9zqFQoZZC#jV+O{!MvK>lW0Xm1av|-M{?D?}|6Y1}j+lrn;Y%HWk~> zwEyMwKmQqC{i`*-Qu^%i;w1G2Q(br1S(a?SbRbT<*8V@TE1|?dM 3(6t23?m(AJXkzxKuI_xr3~r^frOw9QETmA&WQ z{wuZi>#zK?m%Gfy{OP4j>>M}8zw=-H*>z6mbV2S<8RiquUsf0Y`}*%=eg{{{!i?7e zSN=1EFX#VSch14I{rSs-8|3D{X{z{DXV-jhv!ATR!WA~>pFVwJfA;Bh?f5^O%JV<6 zaNl}#ApYgQAKP9BetvmD`%_N+>eJuq&d=9w$YWn|r>|tf{nzpfmHypIJbrz7vxX`2 z?zc<%e_Q@%P>(qrcmGk{{=QOfquG59{~6+MyJj)2tEx<4>Hk{wQU29`2K|6f`#-SN zGDNt%Dd}Tp|C>Gk sY!*@>G9*K!oJ!IVA z$nb10pYFbQ*JI|_Z_Cq93tPjX65c Qp$361owqywT`FF3^oXuIg)2_3wS`o#=$B_PM`OWL0 z;^iSbR5oldWA^we;F*x0ztZk DsPW;d=L3fS4B_Wx%j~Z!#N6TLF8*twcKDC|`fXJu@-vzL z#&7?pzfv=8gK~g&Hsilr-?l6NEqwRtt@LVr!AnO%Cu9@`xc}OJwXccq*zGM!O;smW zUh(*FhVkRH(CJ^@wUoNMJ@b$6+4+rq{=2o`E7q)EpUuJTHRtkK|8+*%hvpVPe?Rlh zvAg>|#lHP^ar?{t?{fGq-En5HC=c2znriGaRns6NvQv?t=V id8EK0iBq z$GQg}A5M^%uQadpb-VSx^VOU4nDg)GMp^H88F2XY6*=~|^7ej{3xhp%Zsp}kOtYJ7 zf2D25uHLwd+~pI0d|CR;rEkko!`J`Tf30nrAOGg#tTmxiO)KYA9As$i%=2bGdUC&+ zz5nZXrr(uk_UpVYjy?7;%v80v$S(ewZR+#8^|x4`|Gj5^CwH31^MsA7H4>K=#oO2% zW&F=z?j|&O{er_!GoCk06P%h9(=e<3!Tc2)AHV$f@x7q_-+QxbZmoZ?OJz6H4wYFl zOxk_B8aLP8)v+|5xvl!_R`*uPFjK~`#T_PJ9v;4YdSTi$|2x$&+yWkEf8Ble?TLSx zT~~YHyK|t*JoPm@Zm0f@Wa_&WET8|Y{qu1@lVc7lQ-s8vE>4Zs+TNr2mDTLuiLD2A z?tFeLd+9~4#^Z~5*A=V2z14W2ezpAc=|MU@2cwQgHy;#x5F=2p{K|Hk_Lfq^y}b2y zEv`yaTZ$Tz?O&a(V*Wij|38D!@#Eh 2!AC*;BVazE}JAe$KgX(R-$S z-|l?yQU>SWn~4J2otwlrp581>GG)$A)CyXPVDOU>JQu@HRVP`{jt4Y zIE2=nsOZ~Q+7Z;L^>?qv#b$*S6Ppa3&vt}yFaOHT#2s~K^2z;MIjlWx4Yfm7eqJ7# zw4yfS;@W1`AV;a0>sZ^DY+D Go9f4Yx0`<6X6+VLNfm*%|@`6y)*HSxEA>l(d=vjMM|#Zz IB|8 zVBngZ;J9yg{GZw>x@Xt;i9HHfFyGj(O?yk;_KTLcb8e*tIxqAN{v_*n@~zgDNESgc zgA*>V)1sOpCr*34R7#tvu7SI@c11ns?nSkM^Vk Sr+T4Rz?bu#z8P26)u%@;;$o8ZNa6`PS~As1 z=LAD^Z~7Guh5rogm+!AUE?XIqDXQ#Yo8D&mV5Mn*y5TON6_HVQ3^#n)EWmE|pJC$4 z-dc+ {H?{O?X+lV!Uge+qwkLh&CaG&( z9bdkXsyMb}(v;)p*X%$1Q6$-?`&pu-mW=KcS)F-)cH3 aN~{sBdgiv zeY$P6sz~x%*`gJ5o@i>Uykj8fxwM4oq>}ETX@9m&6%&)`|JuLHSE1BP{^;coPN!EG zJlOjB_I7>|ZpWCe*G$JYT5=r8atk$6_Fv{y8#DR*@7#B0OO-tv-aNb =CIw1Gjmg0N$h*}h3srTM~!E+L0k!6~bs_P<@WVyZHi zU*oA=yCNq~*zX%R!BXk|8yUSPEV{R^GOdmBKYGn$0*hAjOc7CY*03X40oQmIU;q02 z (eUc*~0tyy3S(%6%*w)9%5jd9;p0}_rNc~_a*17z81K9*=+H5 z_xJad7EBW|);*c8blW38;NnvE)h|!}XNbRb+^M7UGS`7^>!wGit%@j|cscyve}=nj zeF_dL@GRh%v6$)6EyrxFdHP?rZw$NeOXrlO)vPV-e`Bmz^RGS2Jte8k>=ZDocK^fm z9 QCH%2FLSTpItTg*uZpRG5hn+FE)8E-hAg` zXGNdK=cN^WGdBvH?OMH3R50^*ROJ(;Ji$W^yz3avlk@7={%5$Z(RKIjvWcl)qU` Ap5=no#y_Ta{MqFd@>p&8nn_KILyDbF%;I#ozV~3-7yc`b%JaYW zZ<@I_W&51lr! Xs^dE-uh&8P_{GD~` zdYPQsoMlh?a*h;Nb4P#JYU3e(P<`W$FR>;8cg}3*+52%$?cRht)pb!!n=hZp`glg< zu)+?N30!memS0}d9d|&$eb?PcPmYfv!h)Y)eTa9qmMG Adm96H7%VKmWJ>YyFC%S!P87H`+>7w=!`bf0ej2XVDA0<=xHi zzMQlAAgTQPTK*Qni4xN?_0L|B(>wHHso2r|D_LS{E9L(BtqI9m>K~)NP)I1UOZSQ3 z%c3(Se?zzGbJZ>Wb^lN8wK-KE9X!6gmK0_GbLrHsi%i<4S5`zz%yQb6u)>k)eq6== zT@$Y!n$;D)-d&{8`&IU8%?ZsXt=yK{Y}A?`kY|6R_`O5=YOQ&;I%Vs^ysUDL)MsQp zUMc9LFgfVeCu8Z?xm9k{RsLCQ|8;0x^qy?jI}I%!n_L8%Kikyn*-v-qE5GshUf-d( zw+|*=d*ioeU#iHr`7bu8$WMGJ8{0CE>zO7?r)Z3Jv=^6r*mmuT^G_BA>9PNoPYu3# zTBLbP!%bO^q}`pzBtqS)3YHu?uOn= 9?e2J|e|R!s zR;K)`zjLc1r) YgFYexo{T(J~heks!~>ZS$7KPVJlU(X0N@^ `4*~QGS9KOb>n5TQTQ?>s$_dMI} z2fEBMkFPIje9y&uP~Z1k#I31UCC;Ar-Tb-qM%FL0{|uVT*DqW=ZPUDncT1g(57{mF zTYvqV@wb;{kI&CpD)*ktbDQZaomKa_m1R}rx9ycL+JA{J@n-8EC2!?|#w#DRJXlJ- z>t%Ltf4)2|Vbkp9q%@81>+JKw9DCOYZ1X0_Sw z`%mLt`|SQyz20~JPIaKx_Gwky8C&j17cEM3{dUu86;Eqii1y2(Wx@_6{}}@6miJdo zJYjb+x9<7xnP=uK-uV8R?W9|ls$CB>YO^Grn4=2WTK?>6*y((G?f$ttZx=s(yS?PY zw;k8q`=YW|^|$TM=WF%vk^Q=Tpa0iI@1uOOl2^a@BpNa28rO=0Q9pjIaN6T~qs_f* z+1$g;*@FK*h<-1>9ee&3Uv_L$?7=6!4~5)~t{FUd@L{RfMCXg*_C>1q74zS2iSbiw zS&=en3Xjdpc!P>B!jFC*f8?KCmYeVM+-%$3*)<2}o_Kq(^NzIJG{wM4$4>`}`h;Bd zcb75BG8CE>eT8HDPVHaY-@jM-G ~w6(T0VxCevjY! zo8HRdJ}WL=<-N%y@oSR=Ykoled>`A^kLo|Go^765EnSu~Z{LBu^50oAH%_S(z5P=) z>qgI%o-N$4*>kF4^$4&bF`8{Jr=0ZMV!kw$JUJwcWaRfuWLH_mTdf2U{~IS;%~q z >|zC zm%_LjHXE?rih5J=-Lh!;_m#Czx21&LU%2(on#ZfArKYTuSS%PA__FbpRsWN3n b5#i2ThXB>~&}Kd~>CFZeCK^HKSpHmll$oij3JM4fF_8q{^aZrt$eKSR&& z)BhRn^Y3w0VV+sLk4=x|&?!Hg7aosaUgUkg<+t_XZqK_ac1tGC*Q%ekSLE;8KmB!q z4|>*b+a&E?dR#h=(R=!D&m~+Yn^uJ!W6BQxV$OcgyJ-3MZNDXV{m|U^_IjC7oze-9 zKP!wc6g|Fq`<>bBRc00j%0It^Z8!gP_Gj~k Hw3|REPTYlA5RH*Z*hOoo}?lY|ej%Y@SI>3=>)u_|$hzG5PfPpOf_ajGuiH zM-C=U4Y<~Ir`GUd-l;F)xo PiAS|Db3Yv?AkbQT13~)8PioCc}K``KKc01?%1@N^BdxWUz*R(^!z6& z@SmaK%cR`R1&yn9d%Enh+<#h4XfU!Yt!M~3z0#{UJjCqL6FL5CPxsDoFBMrGGC`m! z*;}_%Q^xApCYF+Xxfv4=Y+!$}JW?+|;m@S}AO9H`-@X^fT%j~K=flG*H)@J!B&1rU zOxZZW*mUY4W&I8YQ{e-TzCG?Q7ZT9o_dTU8!QSpHckyf<-=;%(u`jnKEI$=yr?r@K z>d~v(Qa00WoeeqYJZI6`P}Qc|$=P9>H*H|y(|zN;&1bt(wd9R8MozE%1@E-fT|T_X zdd9q~kMHO{=C$%zHg&;*(zSIC>8-W4R_kS7O*y^C+$S*Tc>nTl+o=K<4#^*O O*)s;5c8LIi66Xc&> z=9r+t9Kh0?s(y9hn)^#M6^g4Tf3fdRDLL@cHS?Ok@ru;_7iyL4SHCXTUSXL0WBZry z4;WvUDlJ~qX}$ZE`7V8(nljy5@6}g4RQS*TJ}&pgVXa+l)pGSUCr)%P3(jMGdc|f} zY(GN`!wTLt_UnKAUdeK8ZiZChYZX_o# fGredXCYvU$Snk6YW}m=}z2#hAXw~ zdmEjd46iq;D}0?=)4-789dpBAx4@Dc8p)>> &mdo?P?f%RQs(iMT4y8~Sy;KQ zU2^NyJgjB$Kx?~A|M%6|t2G~3ec;)nzIwvpFLz$DHk&QE^u*v#AM5@bZz{j;ld(Ga zU3`zC^QK)dl9Tv0lxC-yl_}hi{#!5iN4)XV>s#mf4XVzl1~lln<}j8fNu8+c *N!VJN+)S1NTsAtcqunkC+y9>1=qNidTwpBzy5b`$(*kbPB+Kxat{p+ zv|Yz3^`r2l*&j_E9gqFj|2{5J`SALx$iY`mXG(eXUtAW+VeH|{@znAD{F0@i-u`v< zSG&m92Y!{Fypb8Ce$CnFFUN&-I&W4dKGE@Q|50cAqtN2j*$+KGzus!E<=Wiv>t@cf zQ+GCH{#wm^(B7N>b$zw+(`&8%^RlmNEUEK0@mAVk)xP{v)UVPy{lc>c8R|ERFF(DO zDSPs~O_j@Ae(iNwRkv`>{a%G>Vp`Kx?) YV|_H|5I-J8_cb``x6aX(z^ z!L^Hn|3vmDi|4l+-G#4~3P+VrIIH8JtjQvls=~mjSlS+(yzJNm?)x9?mf!2Twzoov zJ!aqIkk*-Ux7ubKO;PpOP;f-R{n7Ug_K)9}9C%%N@_1z2QXRoX-dW6Hll)a~of71o z{({5)`n^Mce%-W?crCDMd79$%V~bp`mbxlTQ+eUEL@YJC@h|)1*Y6&3oUO{)aL(${ zv3X9bC5v;lN?uy&a274TyhQNt{1rC*WdYgq_J-P6J>lw&n#-wkDn?o}SLw;hO~)2b zVBK#Ye}4C68LOQZwu!mil`Pw|7EV9L*2-OfkTp8cexAeg*Y88tX wfJq(i`=YbtdUtDC=m->_9}Z^l;5>)sK240mNRd$3GiF*WJ%OSy(+NB%SH{a3qe z{`U23ue(ojb62u0U|_6OI goV{b5{xdexPH3tx}e ;C;HagW zv@MBgf=<+t{|syMOJAq-JeDohEYcTgyS^j5&SX;)V~7qj_XoRaa&P7sU+b;ukGQpJ zv9m~;!V1R2F)MYvH)&oj;1H83e0Sx19Lt5v>+FxD=Xyo(d&mDalVSZD5hM6@!^ZEg z0>18=?6+6W`L`8^d5{HTX|(@Bzlpidq5t;3{c%&aYER+y>{y?Oh6rOr-t1OBCvoNg z=40#^X3zfpZL;4MiIA^T!nHhBq+Yt1$zq_O@X+_T!m9fpPdvK!D&)CbZH&QE&hxQ< zuLSMt*NiyH@KP(JDZJzME8Y6HOrC%4-|LzfQ<~touIj+$V4;0mxl}JSyx6Hexu|6A z`Y+GE@86wiH`l!X`4#s$I{lA}0+ToQ-{wvVG4AsSTrvM7L-E1yxe_cNUoB_(dM1U5 z@zqWhO`Fw1x+k( *H6pKW-iU_e-`S z#$)T^S=X1w8E-eArs*;v&!#0s=%4v4hXdWx3wck+zv6s+n}2(hmuv3zwSPmdtnbQ> zYnfwz>fNP7FF(AC=~|Pu)N}Q;Ti(*YyfXv8{1QC=qc+NS(bcHc66?dngEX(CWKDd1 z;pn#i3^U|&5@#yaJlU%3|Lv=htQLn(WC&XV|LRwImEUH)PVNdm5PYeje$rm;?fWaD zcHNl#*_L0r_~*R5RVBSf6E24=Wbp8sT)K;K1>3blhx@-bzFFlL=XK$L=BLM(p59Ys z7ZTc^@FMk4z0n!o{9f%B34FQ*Is$iIMsF4h$&|l#&F=Klr L&)2$F>Q8|Jof4S zYEQGmLwdwNzi>TP_C6+E(9OOiVBcD;`A@l4oyuXjT#~)@{TFfemv5Kf&KFyLaQzL( zSEsA972Zx?+N$^R_E+wOMiH+XS2`M8Sr~Y1soAer_Ok`^^1ptYyY{)4SZn*!%Znmr z?Mh+){PIR<(3J%ltCT|YpFF&9BVupcG%Mz&JpZr%wrx&-^YY-6?8~+>-UhXXH*;hq zO=e8>ZPuGy;Bm>{{`#-#o3FFuX1a<`zxr@j1INBa+`KLZVcVCTs(ix0zpJz`Zc$jW z+gu05s|Dxs!erGRXzsMX&~!(>j(v62*K^a_)H*V{9<)A~Yb7HPar3mnmHQJ<{%6Q9 zuLxf@yW#cK84HdXoPJgPl1GA9fw%tF-Yfj;FVye(z0#&CJJjUwUh|L#i>91?(!t={ zEdDqo?I64O4(+o${%te+c5{Vo=8RYD%QOrHUI}axt~9B7bL4*b>g&JaURF=={Lhg8 z?$)mF%VV!T(o7Cm)fINg_~qu;+R}H|l(PT&%gO$C 51;48yi$b zXHGn%VI+EqZMOLr`G xU~c^LmQ$kp3@y}q^J zrR~I9i=1i-nYdQ^hA9XvVO0@$Ahz*W#QJS9&)fZ#`6kVjowrHDrTyA=kDE*k2O=ij zTH`3b{R{iY^V<$HRF$MJDRsLxO;Ueh__d>XU9R1R`5tCFvisM|{4R}Jv^R7^)$1Qx zySA-x`p@9sE1kE)y%w YpiVqt1e?PeLa|HgM ^Glr!Z03JopU3ua-b`g%!>ex>ar0^~xiM3;<7$1_2B%knr84z# zwz~uURupAal+0Uo>+`mSl7GW>c9j}c&8VAT%Ayec@dxvtGC!*o@%qz!+gVL5cB?Lv z+V6EYQe?$7Wv(OKpK?$9slHlK`qtL5Cg*hWqcp3lUxbtL_DtQpSU~sqqvwCCZ!MU7 zZDv)kE`zFfB}aPj>X*wsY&Nj0Q15fxxPRB==4&snWM+yPb>!Xp8l(C(qOCSOjc0#f z-So$QYA=NCpC0{M{I*HPv$KlPlUMF_u$|Lpekn%Cx6%CH{`n ~hrZ}-k5J{NA(QQIr#eJXHLjr9E6mzecG7S|* @{P! zbMHxXfS4KcuY32-Bs}Z3jOv@BzUXvc`0lQ?B3<_%zOXq}nxFiTnQg(!g!V~Y*A(vX z`RlIG|8eWzS>-!#R8J<@-RoX*^Si}S7heDAp3c5|3O`k dT*8F(d@j5 z8iq}o$5%VN>}}qXxpAVx(cs-%qQozhFih79En#rh{MB4tzy95{&!?I Uk$o+kk=+$RWah4!M6SDY|Z30*xzodJy|VtR<|W5YT5DyeQ$Q<-I|xY z;9l28EtRTFyCvGI)u!h9=^T~Z>%jWx@Zas5Cq9kqTHRGD$m?e3sp87Ftz@3{BoX!< zd3nB#`6vGTXNWHoW!r01^DFGpqO2X$Qo@SY9jN7+6z0UYv2@@5SC0P~ !H!|LUQT9SLRxh#}F z9tc`ntHb{MPo>=5z&lon|D;M3DuRM+Ccd1}-5aB+p?e@(JSpHWZ{zmu`}HQzn-(In znM1k6+v<+iM%750npF&X+kQp-XW0HL>XqSTl`o$iecp$zG+BFs;kLu(CWeAV&raoj z{q{ieB+8g{ir@nlpw|?PIbCzij7BCoWZqP5zfBo+DN4Z(H_Wtgbq7(QR>^@o| zq|dcV|BK#{+b@&<9lpKg)jsz%AC5k_X!@q_h0Xy3`76D?3mB6R*Khxx{Pc3t+_ZTn zeVb3PPI7$BTC2Lok?Eh&!n|wSRsQDX)_zzX{n<8sxx$f8he8j!e3{P5dh3{x-tsH@ z#rf-Zm%dvbyhrqd*4~K+FD_}WcVv-`Z;HAT>$`vX^TX%Yms}0Fv?5}**F psWc`um(?7nXdi(rPTbGsbDj7-| zml;;A{3>(bGr^Q;dg536`QLtjeeHg3ZerHXAd$9`tD1IV<_{{a{bz7a;P2^Q{`mf` z3!h$3wX!K()8QB-D;hH;iMz^S>))7|dhg#?4X?etQpr-Zr*VH?V0mPYXuQYstIG~B zIqo$3^?SqP>nlIK$}tr_EEB)uut%zp;nsI0EB0GWVXU6~@Am!GeyiO17I+GT&Pp#= zo#SPxb&WeI(s!Nzm5;@FwJ%cU?R|c&Ld {k>oQ4qf*!BDIA=oRCBhC8?a*i@~QbzR?>>^d=df5#05&+4`fkLM=H zpTB;;e|eN#Y>`prg2;m`%jO5YV%^H%Ecms$i0PAlebwu$2VYP4d$dD9HbOM@SL5ob z32cjI@vg0ZnSJlt_c$A?$Ew Y7 z>qSkl?$vg?Emz{69hm)!?b)|q)i*xBc4uC3)nT=}Mb8xHH5>LesOo*!viLIpqx{>y zzt;=Cys~Rsq?}eqN3x>$mAbVHJ=xBdhKg@w{%5}5Zsm2!Q(~SDL1&kliSOzb$UBp# z=dbjQVfO7``D_0(%w881v}TH)Pv)9_)&BJXthv8(JXM4X&+o4+eYYU!NWZ`Kzg#Y`-;}@fP5xKq?)ca57O(A-wOD=Bz%$NN>VSB1t&ZOWreEDf zb7t4szQ4X+@N!wWw6ao&+jgzSDU0ujMbA||@t+|m|Lfj=`~JpleP-1u*sr$nMCju+ z%hOn==IAY`s+4kC|K-=m_jU1h+kNDAoOx!U+U0-OEp;M?{E}&58+3Hmth&Sa#lC;} z-m0&QuT||(n$$Db@ovckM(!8drKuM#{3DT`Ml^;^g9A8X6&F>mXG5pFzIr)z_b;|1VssFF5jm zjit$HhZ#fM{lLHMzrO8#|6Zxgjp-r(`DOW8NyX3ode $2A#%Mn_KmIo_x)XM+zj7dhX={CcXy>gBS@$A6lb)(f@$g`Ku&Muw zhq(El`H2suZ31Q$h`b2QdNEIH@{#`xvlr~SA7B$vSiewa9{Z2}Ob^qa%ojVB&D+`i z*Z=YBzqtwS@_x1V+NQqR@v6@LvaL05cxGtsi5-t$ImbwUes@&l*sVr|FRKnkD(!1H zawXyLA6qHkZd>QjphN3U&C@vDeec;V*DI5B^YrU0F1}a0nJRX@wCuvl9m+iJ1!oOE zy p$ARSH3$X zx14KPW@tp0yw|TkyAH(fsoieqzQeI_6FURby@bgzA^-GGe=AL#>;Gx<>S}#;Z+BB3 z`Er{Lhmt30TJ#vMO^|=#&)d05+S8`SB=<4? zX8&Qe@7}r}+pq1upPF1;fB0qB)yv2Amzk)rd&>u2UXf}3=Rd>x 0R zrSm5xO|#_h4F7ag^S9L=`AWUiO%?N;YJ`fipFjQlVnWH0y{tDaSq}ewXJ(l)bLD|) z9(tRsGrw{RNPTN3ll?i&n>OpO_*wPEe(Ud}#V+2DymR&me0@~&!md`*?(Dyq z2%dj;CtGh#UOvT>bE1^SG)IkX3!g?D;E{}}wcPM;&y?#j>pmZNy=3Y#UL(81SC*c# zuevEzon3oAMx$Od+kdM4>8sM;+dZG}>MsmQE}CK#?EEC9=fv8_Jnd7$@^XJ}+$rDP zza)Flr?=1Uu5#~q$$t6tiLdi)df%}fKNl9TMZ6=ggC%5rfysj3#V> -{Sp-(P)%Zw-GbyZrezr>h%s zEFXV7Zl1r;Os0Na{XN?`B?~PYYU{7mAN=;8p?TWGqx)L^y0d>gdbGFw%XcTkPcJX5 z(sb_n&oKLM$bW`}(g*bng dJeqxs2e11*a%vZ{WYl1A4 zuXHW>#oK8UBlx#= Pb=i-_DOKvE9SokmUC41nO k&o#WV)yC>d(&P!^r?3BYUYFAxwZSI7&td0wbDP^Q zk6*sMTBFN|ndj^F29p;LzBT__|IKPbkH?eQF%$F;D$EafbmTw7k!q*2VJg4Aq;tzE zEf; dR~XGdNXj*r?k1Yx|e|_D%KIzQ5m)G*?rB$yY;jQf=M++yB S4^MQlEvQsTY1sj-_y fJtk zuy^HhlNS??@jrN}!(FjNhJp3A=YNI?wO^!f@D=U5zvk@PFRe2)A5~QL{OsFt`1{Lm zud|-+p1Zr?cCK=V@@0n5##IwPy<2$9Ak$x=RWQiRfiW}MyJ&IKzV&P0>HfQY&%c#x zm%~Zh;=;Kz56ic@R++?_cL{W;m1OH0TznG!^2=&N9 &g#wkJIcv@6=u6{Ccf*tA$6It*I!<_>!aLU{;7d&0SA~4Wc}h___W`u zuHiq!zCRD{Zdn?cal^Khxu`LvKO!I|{m;Moum0s;aeS+6pqRfrY@UUB_q@uz{~4BV z&R!nMwe{U`$GeLxBYc%LKfH3yeEIZWyx;N*ZNbV03e&6{Hw3Km*xI;v-=6qawF`Ic z helbw7H1!SH#UJccLEOY`eeXPVS~X*VctOdkF@9`|wij<>rX@f$p+j z92W-1G*kp!XbwD57wdE+_vo^-TQimzUY=E{H7Qoy-^XvYu-SwLU!%Ht9>Mh=jZ*Jh z+=>4*>2103tErI=?46=3?RK#LEEUN4Gke>ce-C5cT?>2B=Bm^zazMtSVEr_HPq`Bl zQx~mh*%?-q-e>QSWYf3GYw4Sim E7TsSJr5MUbv9?`l7|^5ou4SzkAp@Pcr2SS94Lz9f4W}1`qZRynmlfefKai zzfvd2Z`FejDy2u}uAj8Czu?x}_qp4C%H3@jSl0gLWv2Jl%}0G@wkCOsnk+dj@qqc& z)~jCKvkQE`*6(4;`+H#1_MMYXM%pC!vKD1N_cy%elv`gqFLCdUx0X{nrSp=uW(7K0 zUXCjKWXpa3MK`|~m({VwPHPxV16FH#9#K8DWLM55)$2j`?#CDYUA}vnT+X&zaxZop z_np^Oxzuu<{qmY6_w1fZ3s=k5o?E8UUhEyLaB1#?mCIJWde}27xZhFC&M|mGw>VGU z!K@~aKTI6;f{gAfw)Z`W5&S0~UunGav)KJ@H)e+QoSM~tTK?7Xm{m{n^UUw%Jd4=& zEv;9so+lt=;;NR$!`IbiIj{a^v+=c6%j(%#%sy|Kr81AS h z_V}Io@4~L1x&81~h*k{Sf}e99fBy7Zwf6V#rN!}^?e06C+r+u_*3;hX6-=(Kr9uW< zL{+2;jywGGS{1eGWom){v^1_)YmO#|IV9W7UpD{v)!Gx~4V_DL=h-IJojK$!9TFh& zn0ayFh223ib5pf;?7wThq-UX=hlBf6PF2QKXW2KFyJPCxw0?g+w_Rp;%IByPVJTc9 zS9&HN{u?*9boM*tw|1w`Ec^Akc7x~JsZs83qC8u &ZNIxw)zLP5++x zyXV=vg#CB^ux#HxBQQX#S48B}@?OK|uP-{^x2}2g`c=j&Q30>@IzEdhgr1r)`%{dZ z{=dVG@2xG(Yno^8OuAj!!1X|?a)L$w#MjOHeipgRyH>q$chSUjGbeY$?8B^Aebuk5 zUq8cE(cnhg+L>2ci+0^uz;t@~pBqA=K{|VGJ)WOF@%Bs!jpKngcL=(#xG*=?!$>7x zSJx(0Vp{iXQS}#*PB%Mv+%MewE_XjfhT-M3DU%#z+=Dl2$M(#9s#UA7F}qc7yNZzo z+xgX>&nx_8zi>)G$?0AKUzduIXQ5O;rsA#$$- ZM<{x)2ica_HZn>KLDtdOG z{o$MZSH0!71mC`JGUwsMq@uY;(pPk)Pd%ZlIC;9piEWRrYxzI8-TnEW-KAHiD)a58 z>o|2WU0%v2RvPINq E1ba zN#Lu}d}TlTSN|Cj3?jbX*lgGMYExv+%3t2GCBmy;Sg7~awzz8kTmQ9w^*4_@ex5In zZZziD_u}@UQX}Cdx7;p8om)EHQ~cM*<6ocO>gSls|MXI^7Mr1*%GWNH>K~_!T)Li_ z`?_QrRq7qS rPHAnXK=>vd@3{*7fRT z_kt$21&;pH&o9|sx^dctt*5R&S$SUY<>m7qH_ke;(c@9u+B2Ls`2`|-FTbk{IFf0$ zw?q6tL-LywaowlO4n%5c*`L0|wz=AS%K|kmDdC?FzARgH_`G-Mwnb|+O(a)&X3lM1 ztd*INtT=&%?Sy_&?)l%$C(XX~L`cpMnQ8xM7nkcE_S%!W7uHPsRA`s}^xyfoldkSt zr_G9<@ab3BY)?5?EuX1ITCoRoEac~Z-Pd!kLfYxrVXHlR>(ZA>XUBe4nXKK*8WJ*V zf-QT1@l?UI7yJJ8CVQ**B}z>+a9FTf!aGarjO#m#?dIQNcgDEa$`m_o`DC}3qbys} z?68XP4)s8bwZ>O?_w=?cl+;{$VST_#v29%a${X|;FWG8{aQ83&&6mB^Yj@GfN?nbN z#n0-m{#zgWKJ0kOhiyMju2^kqv#W09p}&7i{h~Zej|VK<9Fa10^2H|?L^8#aw#lt# z%+J!#;kh0Z`$|r_oZnvmYyIlhvbkq<-|DX6nlI@$Indv3mX^VCLr;IDGtWHbB3>@4 z6uG;Ibx#h%!x@T~d>gkj{bz9NT{%nRN${}+^|P1nTO0H!L-PseZ+`#TrDwKm40w8N z *JVD )&q1<}8_d;hWO^`QMv&%IsRU(Nk |l zyXn;1sApF*jVc$KT#nZgJiOqP#xhZTmJ_F352TszZZ5ZKXAu1}o4dQ3ZQ_v |hgHsyGrcR0`MMZT nqSo4t8J_7J7s$~`%cbMhT}SXEtP>&`Zu3nEW7LB+x)e9!H@bv^KUr5 zej)zxdHMR(FX?{yJ0es6eJ(wB^@P{M#`s+lCp1@^8od%16?t1%Z~u0mitYEOnU(tY z@(X{ag(%#9clqV|4_kT;e_D7v@+8YX8-Y6vPA9q!ze(VCo)a>Sf#XI4` 1uU{AZ}_`smnG@;rFiG1q9 =-+X#`A~i#;E# ;&VBZs zHMN%2`{=is9R)K_uF&|;kW^JUb*Wd?!jlRazka`#-! #
Xge~;)-*!5lc zZtU|ZiX~6KZVJqk5I7~-c&Xxv;O7_YZ)&VV?mRv>yI+4{>{ea>7L6=ZImw@2et$e& z@OFOhePiuk`+27>nZ0KB_N?4L^CT`^a}9Lux%0l)nTIDi%_F61m*?YOeOwK;x9{$q zUGm-grpU9m$MZ^_t?hf4QtRcshslX^`3&u)`{##0pS!x?`Tl(Q8R?r!@0IQD6n(Wt zSJcn_)XW!K|IEA*xwidt@z(EYH{H7pw H|g4?fS%H_GL4eY+7${bb;Q3i z x)w6?A@U^Q)T~-R%bpN zhCdxAY^C+5-F|Mm?YHtn^XkN+pIk9|?`~HI7H4|L2ea}PCx4PywQ5JU=A(%UGnXzo z>AgN`JLi}0e7}uP|IYocTmAk-_%%bjhv~&d7lj%&wF|Lod8}Bh@$eOY;P&m-wo|`d zeK%h_HsZ+j08h=HO-&~Qu3W0<`BkD@c08wyKk7e&!MpXh UX X^ z!`r{ZEoUAH3SGQc*ELVCDQd@}6%kz Wt_q%za zyE32Fx`UqUdBXNORP#<<_i)eKGV@KMTW6)ZDR=N>243WT)jxY?@9B^JwKc70-%6yP z{`#&W;GOK&*43BR_v`llXV7c%eBAHpRrOdQY{RCg{|uKEf8KugHGT8%&8O$xc^iG( zJ%5)|N>^rx+y~Cfj 7X=-|8MyZ(YXGI-jr!mr )hEF{5`K!wDso1*|`^@fB0%%b@ mxt%`=>2Dy zUF`N;(Op*N#;r5zA6_nKF=294n5Xqz{TJ*0Uw31F_y7H}U4Ac1%;oLxce9j9U%Ro< zkmG3cnyIX-9esMZO1Xdco|aD6JH2h)t$3eXojlneCLTU7pFiKFSh#gTv%JXEB=@D6 z3hlanYYuojT1Gr&$+8kN&Hm4@^3k_nf){6NujC7PetN~(hf!Qz{dTLj?=?Kkdq?`a z%ta%P&zD1-Bzf`!eItE+W4*18IV5d0`O0{3Z`Z`^>SyA+&63XFsmtq>F-d!~L21f6 zhKWCA mZ ;kpqiR<}0Fwaol1%NQivJAE|Ms#AUT%22rt7Ux zgJ|fCbt}0iCmj$?dl)iJ`Q^c#{}~eBm#lo9xU#E$_22kcUrudh^%gFA@kFdn?5XQ| z*&D6defkIF-~I{zR+<}|615>DtJ8D?M``3=GljdRaYtr1@XLK&Zc}w@pO#zIiA}Gx z*ruraK2?~%K+2J2s+*beukQNxy{!jd-`bxa7s>SEiqq<>0R5Fwze1*_s9n Tf30udpQ*l{ZK?4!m-&|%Ch{%L z^_JVoc*P-L)istW%CGA`e2=w!c |z+Ws(2B`e$#er-TCW3!-j41wy$nj9y4j7YHiSZhD}ow zmk1^w=dN{KQ#XhI#P_!*%cHOGN3u2lp16>Kb<-r3T!&8%ZsopN``^?r?cXbqd3}1H z)gv3T3!BYfX_>6lX`h?ut#F0gUWU)!?oMD&- %T?zjc6U;O#VocMP0 zXU9MOwY|gh;kC>2{+Pv6j#pgsjXKg|G*@*_gy<&buhB8Ln-BbJy7Kw8!=*)gi$wWO zFWI)}OoaTp#nP`gUM uf@fv(x*9vucgCZBrjx}bk1ATJjv_B(RRJ)*$p}V zdtbax{d{=ctes1Ab}^*>RcT(k*!dS%gJXg}!+(bD-#2VAeSLIwpx=(akEXJ}F3gnd zoiIOGc&X@CYsCk}*`QMa@>rMqZhkB`H^DPGO=nj#TmI_ElBwne!k;|FpFQ~e{thpH z6#Mx#xdA<%ktMB+TY9q|9@s2!V8WgL^X&a!|K2{Wy!O@4uU(!z{V(RQgvlAL$#dK+ zuORks``+_P_x{*?yguW4 @)|Fx&=q3B_`?F?e8w$Yx(+C|5EMi`<^X0wdx~NkBahy z#R2LL;@P#lKenx3e)--35f!=ZD_%Xk-sU2fqIE{uYQlEzq{=HCJbe53?fuv9eQ`AV z+Se=d7E4|Fv~kyhB&W3vLEn-XF8N>3|7!pG_szJAeJiBZZHpt5i&jf2RNY}t@HbO+ zmR`ZLjs5TAU*=9$8x%gg=3H42u#(6BrGmWbv~QP}aNntqvp@X#{ei;QN1l}SzIs|} zzeA^S+Vg;P<=^2<=QX%=tDEyz?BBhr-)~jazS@GE>8(ZyXDI5Fh=^K4-(FoZ2$^ z=>H7;kMC{?H#r~mk!f=9(`&+$L&CN#P1~3k_ANQZsxxfszy0$n_wUbGxjycrgN)U& zqQWVROZKha$aSQxy1p}Mn||S6_OJW*vzQ+E{Ms$_>nrJyUh|&1C-b%?u6od-?y*6y zRQSBje}=tQ>|7sS&1x6C#&*KW_}-%j*(%fbPMENbN3ipGQ~i3mHv)1iQk3?(#cX*c z=Ej)JSaNK;-nB0;12~c*yFM5Ht$lx3#^%?B9SK?$rRRSvW?|gYq~}u~)b7u6xBp6E z{ekZfrY^sI?N74*{FwT_*pMATwF+#zySFyl{0jB_w|%GF9fO{)!Ns9beH-iwr)&sQ zyzY@I<#g}hULW5R{~7pS|GRy6k05v>*y<;@W4;Sme4S~$;-JK|>Q}D6gw8#C?ls}C zlZDxnfBgF;d^4 |!ZBx#`5?OQ%-9ytF33XsVe?|I%A`y8rsiRDbB`N?vPn;QFV3 zv7R{xa`m;AGrc;vwflx<^6@3y5!~^=ey=)uY;MlkAT9O?w;*x3wThu7%*Cs&ajvM! zVX*nn(EH=tgO0wvkD9MDPx4+VHK*Z>*xQ#q9}n`T?JoSc!|qS=Id{J`4f9X0+xNGA z)6tsdrmmRv*BdyQUe&eCKmP09i;E?{HY|_TbG)+lS@yO?9=gT(C%LYDskL8VQ&;=@ zFx%d}7IL$S=WS9eTIl&P^vuenQj>LT6Fe>)kY@WD?SH*LcZSHE1%KySsjRd-?q{<5 zxS_|jZe6R1N&Hi9eY2mWqWnTP`#*z!X|+bwl0)|C(e9!rWwl;dw^t^2WX0UgVv1lD z_F`vvc}a3lmr1Semv57N7hOv@c;%l<|A&$nJ5m(Zd;f7iRd@Et4$b-N3Kj+mE-ep} zo3z}ySN-+sk6*sK-&~k_iPviVH3QQH>z%&c|M~ppjAgy|^#k=ac13Koa@^Z_%~bwn zcCGDnd;JM#7c^-;zk2L}e>vOF63e&upT+Nb>7|+=#PD*B!~vZJ8Vd7Qibcy+*hl}? znLRDdsw33mrBC&diI0z&u%9Wh&Yk}(w_Qceug_dZa^|0Tt7F8Ozp~`|)GwERSUuhI z^ksbsxxHGke-BE8$!}h`n*YzCU5|}6E{$lC*Hri3SY+C&>dbC+uz;WK(Y0T3CuXOW zK3pL`-}}+MMTJ2N3_q=RYU6+UpCLFU#pAZVsI{lk23-vuM&(O)H0}HtwzmI1zs>Kq zs>4Td<>mV;4n6obukBBGWoci8TjqCHPQ6EGpS9d+EQ(lrqV$1ao$kNwyUcDEEe^Qk ze)~Uz=;iw8JdgJa+0QTCtM=;FOjV}Yw*6Cf?9#fz%N22F0}oe&{q+s|)&5=d%-1qY zwzb%9;NjpIw%6O`$eBkOS&vIEztZ@)ePV=JTiH$rC9_}BAAfG#92GU6@ufqmeMj(` z$&WLibHC^cSQv40>J+U>Yo0pGU%95-