From 9afa4987690a35cf595c9b9687e212d3f8569453 Mon Sep 17 00:00:00 2001 From: Kayo Kuri Date: Tue, 11 Feb 2025 21:00:04 -0500 Subject: [PATCH 01/27] preliminary implementation of backend - not working but committing for credit --- nodebb-theme-harmony/templates/partials/topic/post.tpl | 4 ++++ public/openapi/read/topic/topic_id.yaml | 3 +++ public/openapi/write/posts/pid.yaml | 3 +++ public/src/modules/quickreply.js | 9 +++++++++ src/posts/create.js | 2 ++ src/posts/data.js | 2 +- src/topics/create.js | 1 + 7 files changed, 23 insertions(+), 1 deletion(-) diff --git a/nodebb-theme-harmony/templates/partials/topic/post.tpl b/nodebb-theme-harmony/templates/partials/topic/post.tpl index d3248d3..6524233 100644 --- a/nodebb-theme-harmony/templates/partials/topic/post.tpl +++ b/nodebb-theme-harmony/templates/partials/topic/post.tpl @@ -30,7 +30,11 @@ + {{{if !posts.anonymous }}} {posts.user.displayname} + {{{ else }}} + Anonymous + {{{ end }}} {{{ each posts.user.selectedGroups }}} {{{ if posts.user.selectedGroups.slug }}} diff --git a/public/openapi/read/topic/topic_id.yaml b/public/openapi/read/topic/topic_id.yaml index f0fde1b..c0e6bfa 100644 --- a/public/openapi/read/topic/topic_id.yaml +++ b/public/openapi/read/topic/topic_id.yaml @@ -59,6 +59,9 @@ get: tid: type: number description: A topic identifier + isAnonymous: + type: boolean + descripton: Whether the post was made anonymously content: type: string timestamp: diff --git a/public/openapi/write/posts/pid.yaml b/public/openapi/write/posts/pid.yaml index 593a7ac..ccf8dba 100644 --- a/public/openapi/write/posts/pid.yaml +++ b/public/openapi/write/posts/pid.yaml @@ -32,6 +32,9 @@ get: tid: type: number description: A topic identifier + isAnonymous: + type: boolean + descripton: Whether the post was made anonymously content: type: string timestamp: diff --git a/public/src/modules/quickreply.js b/public/src/modules/quickreply.js index 55aea0b..cdcae7c 100644 --- a/public/src/modules/quickreply.js +++ b/public/src/modules/quickreply.js @@ -63,6 +63,15 @@ define('quickreply', [ handle: undefined, content: replyMsg, }; + + + // 1. Get the checkbox element from the DOM + const anonymousCheckbox = document.querySelector('#qr-anonymous-checkbox'); + if (anonymousCheckbox && anonymousCheckbox.checked) { + // 2. If it’s checked, add an 'anonymous' flag + replyData.anonymous = true; + } + const replyLen = replyMsg.length; if (replyLen < parseInt(config.minimumPostLength, 10)) { return alerts.error('[[error:content-too-short, ' + config.minimumPostLength + ']]'); diff --git a/src/posts/create.js b/src/posts/create.js index d541564..609fec1 100644 --- a/src/posts/create.js +++ b/src/posts/create.js @@ -16,6 +16,7 @@ module.exports = function (Posts) { // This is an internal method, consider using Topics.reply instead const { uid } = data; const { tid } = data; + const anonymous = data.anonymous || false; const content = data.content.toString(); const timestamp = data.timestamp || Date.now(); const isMain = data.isMain || false; @@ -33,6 +34,7 @@ module.exports = function (Posts) { pid: pid, uid: uid, tid: tid, + isAnonymous: anonymous, content: content, timestamp: timestamp, }; diff --git a/src/posts/data.js b/src/posts/data.js index 3a4d303..b6f95f7 100644 --- a/src/posts/data.js +++ b/src/posts/data.js @@ -5,7 +5,7 @@ const plugins = require('../plugins'); const utils = require('../utils'); const intFields = [ - 'uid', 'pid', 'tid', 'deleted', 'timestamp', + 'uid', 'pid', 'tid', 'anonymous', 'deleted', 'timestamp', 'upvotes', 'downvotes', 'deleterUid', 'edited', 'replies', 'bookmarks', ]; diff --git a/src/topics/create.js b/src/topics/create.js index 0d6ee1b..eefed8d 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -238,6 +238,7 @@ module.exports = function (Topics) { ]); postData.user = userInfo[0]; + postData.topic = topicInfo; postData.index = topicInfo.postcount - 1; From d24be442f534baa25dde8be1992cd136d25b817b Mon Sep 17 00:00:00 2001 From: Emily Xie <30580023+emiilyxie@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:19:54 -0500 Subject: [PATCH 02/27] fix: edit censorBannedMarkdown func to replace text with markdown --- src/utils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils.js b/src/utils.js index 2e62507..fcd5f1b 100644 --- a/src/utils.js +++ b/src/utils.js @@ -116,9 +116,9 @@ utils.censorBannedMarkdown = function (content) { return content.replace(bannedWordsRegex, (match) => { if (match.length <= 2) { // Replace single-character words with "*" - return '**'; + return '\\*\\*'; } - return match[0] + '*'.repeat(match.length - 2) + match.slice(-1); + return match[0] + '\\*'.repeat(match.length - 2) + match.slice(-1); }); }; From 284a1e1b37af02784d5c65b5e6f3434bd85212ff Mon Sep 17 00:00:00 2001 From: Emily Xie <30580023+emiilyxie@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:20:20 -0500 Subject: [PATCH 03/27] test: update test for censorBannedMarkdown --- test/topics.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/topics.js b/test/topics.js index 0c78e3d..36309db 100644 --- a/test/topics.js +++ b/test/topics.js @@ -102,7 +102,7 @@ describe('Topic\'s', () => { content: 'apple banana grape', cid: topic.categoryId, }, (_, result) => { - assert.strictEqual(result.postData.content, 'a***e b****a grape'); + assert.strictEqual(result.postData.content, 'a\\*\\*\\*e b\\*\\*\\*\\*a grape'); meta.config.bannedWords = oldValue; done(); }); @@ -133,7 +133,7 @@ describe('Topic\'s', () => { content: 'op grape', cid: topic.categoryId, }, (_, result) => { - assert.strictEqual(result.postData.content, '** grape'); + assert.strictEqual(result.postData.content, '\\*\\* grape'); meta.config.bannedWords = oldValue; done(); }); From 3428766400c633b139b1d3ab7c062bcef4ddc92c Mon Sep 17 00:00:00 2001 From: Emily Xie <30580023+emiilyxie@users.noreply.github.com> Date: Thu, 20 Feb 2025 18:40:39 -0500 Subject: [PATCH 04/27] feat: anonymous posting for quickreply works --- .../templates/partials/topic/quickreply.tpl | 2 +- public/openapi/read/topic/topic_id.yaml | 2 +- public/openapi/write/posts/pid.yaml | 2 +- public/src/modules/quickreply.js | 10 ++-------- src/posts/create.js | 4 ++-- src/topics/create.js | 2 ++ 6 files changed, 9 insertions(+), 13 deletions(-) diff --git a/nodebb-theme-harmony/templates/partials/topic/quickreply.tpl b/nodebb-theme-harmony/templates/partials/topic/quickreply.tpl index d26fdea..877d99d 100644 --- a/nodebb-theme-harmony/templates/partials/topic/quickreply.tpl +++ b/nodebb-theme-harmony/templates/partials/topic/quickreply.tpl @@ -17,7 +17,7 @@
- +
diff --git a/public/openapi/read/topic/topic_id.yaml b/public/openapi/read/topic/topic_id.yaml index c0e6bfa..c37b9f9 100644 --- a/public/openapi/read/topic/topic_id.yaml +++ b/public/openapi/read/topic/topic_id.yaml @@ -59,7 +59,7 @@ get: tid: type: number description: A topic identifier - isAnonymous: + anonymous: type: boolean descripton: Whether the post was made anonymously content: diff --git a/public/openapi/write/posts/pid.yaml b/public/openapi/write/posts/pid.yaml index ccf8dba..d819d2c 100644 --- a/public/openapi/write/posts/pid.yaml +++ b/public/openapi/write/posts/pid.yaml @@ -32,7 +32,7 @@ get: tid: type: number description: A topic identifier - isAnonymous: + anonymous: type: boolean descripton: Whether the post was made anonymously content: diff --git a/public/src/modules/quickreply.js b/public/src/modules/quickreply.js index cdcae7c..42013c5 100644 --- a/public/src/modules/quickreply.js +++ b/public/src/modules/quickreply.js @@ -58,20 +58,14 @@ define('quickreply', [ } const replyMsg = components.get('topic/quickreply/text').val(); + const anonymousCheckbox = components.get('topic/quickreply/anonymous').get(0).checked; const replyData = { tid: ajaxify.data.tid, handle: undefined, content: replyMsg, + anonymous: anonymousCheckbox }; - - // 1. Get the checkbox element from the DOM - const anonymousCheckbox = document.querySelector('#qr-anonymous-checkbox'); - if (anonymousCheckbox && anonymousCheckbox.checked) { - // 2. If it’s checked, add an 'anonymous' flag - replyData.anonymous = true; - } - const replyLen = replyMsg.length; if (replyLen < parseInt(config.minimumPostLength, 10)) { return alerts.error('[[error:content-too-short, ' + config.minimumPostLength + ']]'); diff --git a/src/posts/create.js b/src/posts/create.js index 609fec1..f178dd0 100644 --- a/src/posts/create.js +++ b/src/posts/create.js @@ -16,8 +16,8 @@ module.exports = function (Posts) { // This is an internal method, consider using Topics.reply instead const { uid } = data; const { tid } = data; - const anonymous = data.anonymous || false; const content = data.content.toString(); + const anonymous = data.anonymous || false; const timestamp = data.timestamp || Date.now(); const isMain = data.isMain || false; @@ -34,7 +34,7 @@ module.exports = function (Posts) { pid: pid, uid: uid, tid: tid, - isAnonymous: anonymous, + anonymous: anonymous, content: content, timestamp: timestamp, }; diff --git a/src/topics/create.js b/src/topics/create.js index eefed8d..ffba386 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -180,6 +180,8 @@ module.exports = function (Topics) { await guestHandleValid(data); data.content = String(data.content || '').trimEnd(); + data.anonymous = data.anonymous || false; + if (!data.fromQueue && !isAdmin) { await user.isReadyToPost(uid, data.cid); Topics.checkContent(data.content); From eb398b0160283719449a846081a94f6e4a0efd0b Mon Sep 17 00:00:00 2001 From: Emily Xie <30580023+emiilyxie@users.noreply.github.com> Date: Thu, 20 Feb 2025 18:43:15 -0500 Subject: [PATCH 05/27] fix: lint --- public/src/modules/quickreply.js | 2 +- src/topics/create.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/public/src/modules/quickreply.js b/public/src/modules/quickreply.js index 42013c5..d6a7552 100644 --- a/public/src/modules/quickreply.js +++ b/public/src/modules/quickreply.js @@ -63,7 +63,7 @@ define('quickreply', [ tid: ajaxify.data.tid, handle: undefined, content: replyMsg, - anonymous: anonymousCheckbox + anonymous: anonymousCheckbox, }; const replyLen = replyMsg.length; diff --git a/src/topics/create.js b/src/topics/create.js index ffba386..1cae3ca 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -240,7 +240,6 @@ module.exports = function (Topics) { ]); postData.user = userInfo[0]; - postData.topic = topicInfo; postData.index = topicInfo.postcount - 1; From 884b078401e0b242d4f3a229c24635daf808a96c Mon Sep 17 00:00:00 2001 From: Eric's PC Date: Sun, 23 Feb 2025 17:51:15 -0500 Subject: [PATCH 06/27] Fixed how group titles are displayed in the chat room. --- dump.rdb | Bin 285386 -> 96664 bytes src/messaging/data.js | 23 ++++++++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/dump.rdb b/dump.rdb index 0f9b366781c8c9b6b04495b906220cf8d350b1fd..aa9f7e272e2e5bce05c99d3a7e3a83d08cafbbbe 100644 GIT binary patch delta 4455 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 literal 285386 zcmdRX34B}SmG9lOOWxPSiLYckaT3ec>P3WbWoLyXq*>TP(0XMnktJ1EPU2Ep1=^u4 zg>H1ZcTAzoba|b=Sz72S@U$~6eQ%ieX6^EN2~$d;w9UfO(kAbG-*>NcWyuTB1p4DA z?D*=F?){dt{LlZKvwz#xT?bq)*Vyk&IWeA;oX5qSet6I|=pO!^nfxW1%u7Y#ce+?U zIW0c=@F)Lj@^{7=NsK$E#py@C{L^;och*QI;mqd5$aFL%7O4x=%R!m7>ETVefM-7V z>EM^RFVPhB1)go(NKt5TE*+T`&FmgAsSDTXrPR!%nVlBu>W*fT>3AeBn&p3QyZh;T zd2gfHoQg>KOgfcJi&ptz@xEumtwz0+kK|`0qrTADZM06tv$;?#la|DEzV0l;&Lrcy zbBr+?k)#uuTzA~Oxz`ivb$fazve5%K9GwoPf>*mHrjETi<)0WGzP39tbp6iJZHbv< zsq04l{@t<3?bH5)$FKJ9a_vrKU6CzRb8$y^K$?nNpNnL(V!ZV%W6DWVD4#hdrY*f= z?h$|7)9p_<$NVE6r*FjNc1GPU(K+ggdR_iue>CbIUT1Ea%w=Y>2b1}fXtf@8926t5 zDLd8eI8tZL<}!(7N<5wvPe^s=7;`?8O~zuGnRMQIo@T5;&YI0gc{KfX@}aY%r}UIb zXb$%pEaw?xVkVV}9B!o;!wE4eCG(<*VvMOwERs)V(tMlI7)|E#Q}M_wZ{bW*ax!h- z%H%`~KctI9Gc);Veu%ngbK-jo#FFuVFObb8kHg(eic$doSqk9$kpfa|N{r8>#ChSF z;3jSptY|;ac6U$|hgMU+zV`68s_`2*wBX@E#_4m)^dRLdC@+~BY&6GUALT{#uvYoN zOV`3Cn6a2mXwTrev&j5OszIi_-P_U;*lzKrGmIrJO0irriyqlVF&5aEQ8Cvsfo9Nl zj?qsg<8d){%St&10^Crq5{0;wpz3D8|44YoqS${Qby#3;vXGAG4wVq+Db8Uv* zV&u43cjlt4zdSpx8nc6zEr9M%nirl7c5z)WF`e3paiEE*9@!`b%0qj}oNQp6E|`-I zFemU5@XyLA`Fd<0Ovy3YY!bS3%8aZ|qZt`o>5M$T$c+3If7i-p#A;P`#PLjClzMt7 zisIpArKq#a8Ri_k&co|@c)b9x7nw5`tqrlMNIsCuWTpe2z;rSWbM@=sUT!bU)dbI) zJrwmjM(!K<%`fidZJhaKMqXdE7%tSY@_l>gXTlx&3-zr0@w4VRtFD2SKU8mpUm98Y z$4#y9OA{-9_ru-rOEW89o$G;LT3GoVpB;r?T3PwQTQ|cmZLGZG`wTl zgOv|HwF`dfWaX}x_rWi#SlM0ora3FOnw8sTidL?Rl^=b3(W+a+%BTBpnp?-MW#v!4 z1b^seWy9AF&voi}R{pQAPQh3^D?c1K3S%9t{Ll^XmL69AdfhR2OD`*j4y6Pu4d<*k zoyjK?Npd))0GgAK2mW)9c*k60o)Mqh?{m)wHwCwI+hJy|P) z^qE}Vvi|Vlu-{m^71=O4=cP9o1#kE6OnTDXvN_AglesG$k(qqPv1M}eP5zw~+beFn!!Rx8CdFNGlUcY$=w;vPv2wykY=rl+}9KhyOjg5@V2M2@KaM!@B3a`hkw&Gdsten+ET%av@W>@2x zZ4(Mzp{hIAPHYTKtQ#iwliG>?Lfjk^n zEUKjDW;o^z@Zu=ydFCt}^K%z%o66$RTSGi5q9QJ)#5|~up9lN6K3D~ZRzminFRC8g zQc@jc^m-yB2N=`uDgYK&9xSeT;pt#M*AL&)r(M!@wUu7$!r}d7 zO`SyXIblteSJ7FyreDK~PpVwg?&D}pJu6+)#cY8u^Y2^Xnp)s6pw&bxf)yW_KjbvX z+X~M-jh55=0waI$7Q8`pZkZ0!y!SLz{(hZXBL;1eO@izINk~4b?0k zL}v~?zOfGPHQ0)UPO72U2|LPat5AIN<6~Q+TogX&dicC86xBuU3fshBM=3`pN9-}n zTDf=yI0NXjdu8kT=4ARf*tyO~EGB02Vtk#vb?rSeH&mzD&FH3NDqI-l*2(|#opXgD z*jFLBbx5YB*dh6jznmNGYQx&MTH4A;{)N9Lo9%`%pU=}FpZx6a8?RB}wJl+nu=elR*db`o>8T0!)b`bZwoR~Oe)nik9XyKs)hStLr`(@;r*3T6;~yTjKg@jd zhNCiTpO+{%e>?vi{QoiLU$S=zb|jv9%6k}2VwJa&odGjsUieYa#@W!G(MqK?NGeqi zvPuCws+$O-UdHJG1=9&BmXZXG0_a1W8}L|A0)q@XXG#5b|?NFjwO<2ek{%4*wxp= zP%z?=dOF9Py=dD|o@lprqKQ62&P#|W=J>pDI@ry1!PR}0n$0I;uwlT&#vXehIy(W==*8N-g-oAJ9m$aShG{e_26@2i z5^lHw-msg@GYfu@?!sEuplDJP9cN9*@db2aI%@$}<0fn$m<`C1hxImTZD}T%_QpDjVqsV4&NBox(2b`ulait2!gI)ncL>ehJl-li zdUPH@A;2W!GhnMI)=zJv%(%?^A~^t}nm2CFZjn33y0Ixez$IZm^>vAe6Fep<8_9|} zXQsgrot&u8q%t{^p=WeB8u3LE#8Zakv3o9N0?}!fMLOf08=R@6ef&(g86R9OK_% zZUJX+g3KkqgWV_Q_VI&E+shX%?PRg`sq!x#$ec*SDb_A%6Vh?2*G(>KR}ADr4|2KD zig8y|sAvNH1Qw{&l4@R{f(;yUQLXrnoa7qv+rZC6ep^weIG*rtVf^r6{5DD5LQ~1? zAW`Lm+B$1@-0FyBGRKmlBXFxDlS@t}L4NFsoD5F#jXJl-H8$)L zsO|xWcru&JiIOAW@VGpFr_1B?cn`YW0k<#U^$f1^_`Nqd1{_oQeD>OOYSt0R=VrtK z2lAA8H#Nks(o5h~A4ul;Lk*7Ik&}+w1{^UdmpF(JO1`OkEHV~#`^LuNBk_?j*NEtf zCVayQ(HHYaM#qLn-Q8}tKLOf#7%ZHzL?q$yx?+(rZ^9e*fCe9nc~`r9Be9W~KkAEm z{9s}v{BgI>H7a_%?qQL?p*t}aiI2uSF26V$@g+phsOTCSiN_;;->4@N^}E0Tnqw2N z`S~wWxAGq|AZ!+G4*+`{Xie-UzLlL8^AVwuPG@xAxfP5)6O`uOs%tCITOC0wb;T zsx%q)VM8rbX)>(IA(O$itjVCD$BUr=U*zvDn+!{#$JP#HsCfuNSAyFByMl&jNDuG|csT zX{r%4%5*Zn4>0&-`Vc}2n?W;?&7*JF3j%L^+-Q@gGABTwhzEtX&ib0~|` zN$o2(o0?u`>Or$dlcG#Dag7&FvJHZd*%nXARFs8iK$}djm)TBTN3o%fYZ8X|I0ML2 z@m6EY8KzN0L4)v(`ke$!v3r{8@Oc}L#Ev1&Ej65FY{KT|35d>sKz)l?|2RbnwBCZk z1e=ZM)Pf1n5aSIpdz^ni)g&~_#(a1Kwa32Iejne(pJt1X8@Rb|2zz99wXNef#eb!B zt*TdQb z_lhSD!7<%0@}qPzHtwXQKDm20)h!!#b9+F1IwPUVJ-e2E*C$9mB!Mq-3R-=D9JU4w)qf$J^=FGkja&3YlvI z+`mDlorMJ5be?aPsf}~Z7C`VVGazjbf`Qv(H`|I0>$#Q)@?OHXG)M=hW~QTQfU?`p zG6={zCG||&4uVn9q)&s;j--qou%?D!7Gh<`BPqd7tt#57rtkq>5J$>Ba|hMp_)#PB zG{9IoluczKajD@9(;8lH5aZh+p0(|yJv8y7HmTj7O-~LS%}x$Pr?Uh3llcJ%oMi>h zGCeSz^$koW6FnU>;jPquelNW{*?aOdHOsDgnQ52xtLcf1;{z<%QJs#zp&G+)9&hJ% zW~Rk`J-VJe)f{f2_Vm8nmdvKa@kkuPXAmc>zwavHQxmu98jF;XvyJaDX1Cq2Yx~wn zKGORS)`msNbjr8;}`Jzu1EP4gk{`eZymB~zcKR!^kuH_5uSY*Xmvp^&QNG2Da!i>>~lx zcp=8NzsR)DT~q8}4&-w&hV4Adw9V}?9Dr~l#9?!DlT?RrJJm9`nhr)C_fvc3I=Qyu z(=1o?3wJQmuJqQwHtdHOK*t%TW6moyJ@9DZ&!|LfCXM9z1Vl;_35ee|M#1Epj^vJ=roP2BzrfT*__fs5b>F9AlV4qTAJxpKAEcRA3iamvF@0Ta83HNRPXUaMGnf2e3scVpVHpyQz{$io;cAj#s|3BkTQk}hL ziuG|1XfdRAj% zFajVYT zZV+DApQ4<}HB^_pdV~FkbZS=a*brPzJH-v(ll2>9(*txOvtymCe*m_f^?~s>QLAO$ z{U8Oc{ZsMqAjm%5Ahkv|4i+{t;66B3!6n@Qd|KUrE`>tDYh~RgYJ*(2iABKVhV>jG zKt%g)V!?yiBUOu)GArGUN$`({K~srU@OV`hvBP?2P5y}-^0v^Yh>N^ z)LPlNQMf)lIR3X3FRylv|5~;<@APp8@{yF-yOWk0`q%9Wyt}Dq-_Aa&srSUr`fYoQ z%~T`bOxdCzC^l~W6lE3eEjCbfyn|}oG{zxUI~o6ou$yXLmxsf6x9$K2>3f3xZz+1H zReTrSEQLF$t#_|A9ss+0e74n;8wgUzuRcXtoO)q&uAAMJZnR7%DJlFG+SVfL*XZ9g zlZ+i}(-$0+@gFC|=YLKcCujfB6kh!_)2Zvc(9f>TuG?lm7ik+{*3on@VgJ9I9;Z_L z4=H}@ovbLvrSCkq=V@j-lI^_{OfIgS*?-_b-%XTl>y!N2@E)C1Up!B9_FJCiVtw@b zx5`|T{eB~mI@*gb(pl?u?}4 z_J87!(w&n+y$%E#kQ644MK(~^?f5Rc`YhAMKRf3RzMY=k`yBHbowW8WvpOl8hN)cx zMJl)HbJQBgPucpM7_&b{?RoTPRO8OSqgMarC#e15)zrl8e^1SB`~%3YHTM4d0z=#Q zRa89uK1#CpQ=N0e;b*u5Gf^qFiQl?v=RZ;{5tnWPnRPjPp5MivV%uJ3nq;>9t}D2f z3mxnl{@L{%;j3l#|Gv8&+{z1-G+3an+xTlLp880*f79owcK+8~Y9=lo+BH4+MOuu9 zJ1J@Xn<+~;xnaz;mIa%>Q4qpFEXa&U(&?!W_dmkEc_x`FoM3|SI7l$5{}HO;otf~b z!)dzdrT)01m6_d|-04ukF-*;sDg1Xu3Bl+0WR*n%{j4qolb}R`& z^P^8u!A&B6`d8H5{K1V+QT02&S7`R+lfhn*I(fB`I$%FN_@9)tv6rgrrKt(WTKi6+ zX~R=Y+f3FGGKhzAsq2&Zscq*>yV7y-WXD;iCC2wtnGK^7| z-xYliamidG#mqJJo$7sOpPp}`Omls@T+Bi-b(>yd^3sXOG=Gw50PxRI_5=Z3RspIK zod_w*dEtjaGiL@5(4h4IyO0N1J;ovh(4e)%^Xp-pen5(Q!1IGwxQ8}_FKksgLk;%3 z04NSsdVQ@?Y+^?nKK!IJJlF z|50H`2S;}8b!V+Si?)QxR`^Z_i@CQbI^k>f( zfa+&s<;SiBs^9x{g!Km$I)(Dr`6o*G16E)kD}N87)|mTOM|OeAahMP4gFRdi%rq~s zoqz#?4-O1tU8ywSe~=6;l%^)MhpGxWbgq1UT`@e7Kpl;8+`N zsw;fNybsX535Y*}ylvt6&>nr>X;!;8Llzx^XnK9i^FFhHMP;Sxq)pW_D(=nLW#t>BbN) zu0;|p(Nt6#%6!ln+{x{P?Q^AKKfMkl(Y8uDV>}+m5!en0&@pjcn{bB3!`^~>b_LJ5atff>CTR#Go?1L-b3)jzEru2fTXDEXP##)N3PApjk`xezpWzLaN}(D1JjW`P!Yj-QSS-?2krkk^ zo&IZ~?Nn26mD%lto922WvfC3&u-lc}){3pm!EOfvpTcg}(5sj5eMr^}+G~r^tE&f> z>D6R(nO=>&$qITkWiA-ZBqxVNRWB8{dVVn_xgaOUARdQ<92gef{&tWOZ-o~~3Cu## zcVIaW_&v_%!5}S!@&Tk>rDTRxGN&vi{C<>{U@4nlraT6)4*>z_9K^ZHq^w6&Dk>{N zIQ~V2LpQuAhpv`3FCPjoW_v=8+#4_DV`_;*q1^W6J`_NSC5OW5D(mtJW+MJ`2@uFf zCQCYe1#I~-)&8qy%Wtm5mcNp){z)gu?t1c)QKgeDllUi9m&37W|| z0KmucE-`q4vNF__Ku9*<1F{nW-eF zl_8K1_6i(y4fs{fTvp8mg4Dc{-9EASZr@sKw{OF{-D*l^6)WnhtKe~c@Pc{ikHjNB zSIjpO8IC4^Cnow_zJzyV)E`eoM_e&?Bq7E}-J&PHQT{rl@DhAOquHtrA@#wOte2${ zhpGpIW+TT=8C}+F$dFPrTNr*87bFf5L+Vl~H%;P@#*jL_(2%lfR=oPz)JL1iqOkER zS@Bk6C8E7sE#KN|t#~_G@rH#5V}4lJ!R>&B-^#NlGddLMQTSlqq5}#r5T9k*!n9xW zi()$i2D(gHSPGlvG#nX{6AmekZx4Qu`ykxQ`*^m6*XD%lgFx@dq>bT5k`}Iy%r$D# z!k>?#^w+TkY2mjGB&*WGv9gEEI3*3doCSVEESvXS-5t3$A3w1#nm*||=!x#%du=v# z+`VfeeqeNVM>0B_iZx`8y(xG|x@PuJUK$>E4{xc?0@sNs`O?q~p@|s*z>l10J~0@Z zo*9HR>DK!2>TZ-H1+ltmG2RFS11uDA%C5BuXgiRQwK@$nBtkEB9BHY@`(~`d)0(tz zpyZvR5dItP?Y6v7k$)bK0aJ6>14PI~9MaE6qury%SdYixAX9~<*WVlMwWZIU@F z)d5y)M8q_A0O*#m08}fy;2@V7Wj- z`(`y{+iKHMRT0aFZ>q-v*_NnIGPoSRL58P7w5=7s8O4U@Wgy#XG-q}Ark=<&v*mg=P+hWK!&KlNcbpcRS3J*e*McvqDZ8q^TI1JF?A(`(DS!IC0 z$F-{rD7SsNT~5e&R9sGy7=ml0RBH;2q9|KrM}#Dogw1ygs2bROB^O2wRW!-pQa5AG z0Ccg~WzbLJk|ai;`mqKno8Fz^ zttCm)%)Id9U<20xD$=G^k!x$KNShQO!+4?}`-pz*1N{iExxPx>`1Io+0P8JQsTc1GAU6Jaq(Ir1y=!KQT?_PHe4bZ))27t;iuRsH6kgRHiwlP#YzaPf4`b+Efs>F9l((%{5HTd0|%g822&Q!1wZOGq7W1>Pz>MSpkUz0i379 z76{l_nDY<)B5cuLfXY4KE6!QLEVt6vJXq+XFLc3g-#${N7fw@x?60`ct{ zc$c5=gqY8q7lNOi^uMfwUyi|hAn4P{79R%Xt+9^0H3(>017|66OZC`Ats_*BWC`o& z>NkRQRJL$E!c8~9+FTDW6|aI+GO)~1K@Sryw&g^n*eqJqs#|sSY8tvqX)Pl-mYQlN zOKfT40hYDpCE3;5+Fgsw`sKoO)gu=HXHnIFCBWI>8v>jy`8ob-)bfS$E?^;?uhXtS zkbG9|=vbEn_fU}rb@7GqaoC9?@Zta#u2gjma+?ZU)nZw-D;F#Rj2Intov9(&8lZb|e%Kwt=O>IpyH_pY^8gby2l&}@RS-Oc679YS!4Ru zcIW-`!ac%Ya(@YP{TVRtwC+5~jeafeJOCnn3frf)H;>Zf`2=SGD(NJY-vhUvIeg@z z)q)-d4jGD>zfy08jXm$-d(rP2;u-ZBa`1y|8hps>0-zDzL(vr<*z$dQ0i*lNYq@hApW zcF^^PcTxe_xJgFbZNE%)KMIB``?gkg{5SQ za@&_%ra(=uYMHXQ&9N|oduePAO^KgstG48BBIr~#&gO+_;STN&kOC)xPz&L{8aNh# zKKM0iRK8qhuy!c9*kvjKTic5&vPDa#ViUq%HH?Z{@lWN9LOf?FMn&~VpiAPRyxtI* ztjVn_fblLY;MO%=E^ghDsWZMZbXP5RRJ8=9OfXPWUb;)Bm^5l~$$eCjk+b~WygCf6 zY;k#NSzKKji)#TB+fZ(cbQtiYIxGKED@RB)qC2B^BW#3u}uJ*hQfvdyIf~(6E%YKOeP#Ij+ zpk`;PP&19+x5UO+o~~FucyYQSa=RC!D+*YzUMfb%O6iKV^s36~ce~spV?Mtd3Z)GM zfmi{%WwWwdUI$KpYbB?DDv4=;?Z`5tfztohGNr$C-&(~QQYrl({o_#je^7(c4}~B> zv0e!Q5DjN*CY=PnCj!w?ecO2vrG%wZOPAIr z>1cInM@g5WC{bqtYf}vvS}k)_kwZM1rNGeYu_Z8+3@(R?5q)?GF!YU)>8GjA48aQs zq0Rdi#)|(@4bK4>1EsPcRt(@Zl=+1eH;5H~@Z(_%io#W}4;Ger)&yxaF=e->I->B0 zGW52PF9<1e3y?QROIC`iS5XYKuo5mlT@f49&~(sA=vB-ASzER6e|}1w7M+rq*J4ZX zb{7(+AfGOBdZg?EZXF`<6loS7yGW}5@_g{`#`WDjJw5#OVhV^1BA?IjvrrL$$0=ew z6mR19W*SkQDIO}a%}m?P=7Yf0<9SAR0*FR@gdc)WjPb&zCiFFY3hJpyd@6ZN9OQ!% z-(JU8V1xt0%`_k5+n~@7RKSCK4-Xq}UN7;uq!sUKi}MPyJ!n3d;bSvUMteFbiNYwA zE4+gp;3uJ4TKG!(Ff=W>h2|&tfGw9v@%tiaF?FPWaBzrc!l&2`gZzziZ)t%@TQV`r zL){`iB4wczkHlvZG7}PRu;!pzVKNvWLDvtN|>zcs`}$!y-pAHHupw>1-+ndW~IzNY?2KPvtw z1%`&=nV2+~wkP$`=wK!{xj}I2CoKx_& zgW;jZ)V);FeuA2Xi~32ZH82w$AYN&y-|B2Fx)yX zoD@FIeHygNhk#E4xrK0=N>ns}UaxxByCKIFWW?5@g@rlUQMBkl0Bl=(PoW1T!~Wv& z55RRuhJ6;ULn`cZa2--%0h}oG;0)Lw+~avBoYJEV*nJO=KmsYG!0zcC6;J{xNn!Gn z+-_n&Em#7T4RX<{@fK=v6)Fq3tIHs4-3m`O1}{M2YdCpjvO*PIrCBazJ8O$SRI3ar zkbrVNOBH{p9s|W6(4cbh2c%v~#UCndU{dGcbuRv3t=B|E5vGmTNu}JO;3sxDfVNl@ zlv7iHYnL*e7ye1fZ~bR55=%)h6}49@K)Epl%5^VSZq=&RTgBhbuQMJwa)pA%T}cIs zZF=Qy3X|Z0>@Y*sb%Mz?5KJyVx77+IL_p5!2^z;AI8JiD28+_rl7Mt~r1^m9jRerbYH5Ho`J(I@(yKL6OT6AIbKosopgJv=tzXZ;?3LR)Q?f6@pYe8z?$ zUC?ch7_zUj*ev7rdieM9bnpiLpBB`JrBWuv<8t|LTQ>NEYWe>O27mBvYyHW~k!uMJ z4+v0eBUbI`ys$&q&FuzF7=+p`0C^(&78E#(O7B8#mprexX&AxQNl~Wh*1EFcWGR~w zDi_{2FWfHN$=wMb`VJ7>P4J;$Q$WT9392-d=vt`9Q+m=OHkGNvJk7W*CYj<*79H+W zU|?h6s~YtYXvqhu61qvKypT8O^AWylRUX=$X>VjJs+$icJ5c3$AN@SIE7+95y{B+x z@P+O{DLDy@Bq&~i;jxQ0BgwY}$L08OcmxSvB}zYGuvM~!TJh5@gwV9PmNlaJ+WS`d zMTFx2hYD}Inrya+x4k@aO>+KfdE2#9{!{qw9{T0?rl zJ_l0aL1CJkhW!);qz3p1#EvF=w$hYVEa;v}3mSKc18e!2@J`$%PPLcSgEuPNcOQH@ zvf7tBblNkAnkraKrMp$i?L%uCTv`@$6~HV_iJdHfxjLAns>6s1U>da<#pV1Ja0Jvt zi3CfD)Pb11)x8^(W_lO3_;alz@XGM#>Q7h(e@3j$rSRt~Fw*)u>f-)T!hWP+h!8?2>ZR z$=dBapo?TBuLRA$l1GL6PY&?7^`zRe5_POZ`Atg0N~F>T7Y@NqI+StP$uth3_en!; zBf>oQLN2+ceI)(}^mp7q68apLS+4GCmMc``TZZL|tDPZxsT2{^Vy$JCt3}g=s^Z9D z1FgCj%W`cJiSS;5t6Pn!Eq=Z=Z4zs_x`dVdI-hSXUAQ{vS2FAt(jzWaELp7-gjF$t z*%ly&->r-a5Jj#<4z&%+s(}d*<;yiFs~%L{pbViHi!>-Bf#BD>L7664UTw}Q`BIp2 zs^X9H!X;;B)>0+qVk}Cly+1X|q}m}+)qt0&|1R_+RJ`V;XO;8-g#Np4yb?D{k;atU zzT8;EeW>S~9l9F-{%t@0s1>!FviUVB!?@*qU~EkEL6@dcCv-83I(_13)EONai8$S3 zqTlOs#r)p5S11&~lD!RHkUpjqDp)ktc$E%+u%UM)pS+G>&CXcWf_Ogc>OVG>S zKxm;k6BK)BBb=p$bx-GoqVN>=6xm$6? z*V*eU6TrM9H7NIeixa?9gsW`sm3u5!ht}&5cIJTw$hfzWG=frA2H*vJY<@Y2-XXvI zOSLsqxjQ0|X^#f)=kAAtJ_n~^9l(MJPdKM^M{L?5LQg*k4MR%;2wY26!24QCy%KqA zw{3k8;>nR1jG;i zcuWJ8PbLgJkl?iL>49)NZF3pgg_v?bjTD(hlUvX|xQVy&#~$khS70mvz&sNiaD zbe)upi_u8VnaDs6dTu`WzVU(1!?!xf+n{6SRDL=IozI~0V+6Wv7V7E(j?Lt~d@_FJ z%?_w8ezOD67C>$I2GkTU4?WNL?!qbqA9p5F;z?fM+CcK9W~S2smjICBOhT7B$qA)m zh27ngk*w3rPe+}en;lzjPT!p03_WGjTlPWMuF@kK`9{rud`gcqBK= zqng*wIA3RhlzouePUw9GtrB}E)I1W3OY)ELAJK)PsYv=5-^fDyw*+6`sB(M&Q35~- z(R=ul)L!0d7$4s}6an}q{C1gsx7_eHe!tuhw+;;{93BwcLxr1*dObvfvQyF!KX1(E zl2K?#m6P}ay*VjU{|#|@o^(Jhbg)CoEqtUIB1&@83-p!=nYk|P=LP6PNpBuH^+{@r z{U;n|Puc&SHw*8Le7#Uds$@ck(!)oJ7Q;?hlkET#3C+xHw;j=fuH-n7XI?;jD7Qqm zTCwMc>H~sC?dpPKjj9rX2-Xu33_&bt2b$CYM?ympsNU$MBeFc9xOy<)CJGsej4oG+ z)8Hlrz(?l>sB-<&o%oboD$r!5gyO++K0qz+dSR3T!JLEKAjqFhTARBc5z(v1*DVNh z@T+ti2@QRSl=m0{5{U8=;AeQKl7;hagplwjDw*i^w;&tcx2%o63={qD_zx^*p;ro$ zMMC5Y8fMN1UBNxv9+;SMWnvcNTzdezG;6R+=*clC^mS{&P6fFn73_{2@uA!})9isM zFf=S1frc|`OhQ|1oPQ@9u8`?rdcY_QcjM%@Wq8-OcZI5(eQG@ZDB@jvteo&^o4yQK zo@0!HsU9JwW({O2IN{Da8Zcn$IdWtTVe%M* zaRc}xm7A*RX0)mLmfciKIerk!{B!>Hm2E05xv>^lNo*y=LsiXyl^9B|GV4Vn8LJV) zl5A6pfc^YcRfZ;`%aTz;o+6U5^5o-=I{c*)jvDgRQYM5|Q`M$gxTyt;)CKD9hApa) z^UBd$`57fdtHfp%-X$u7BWY_2ya2s)tTq6P1E62P!2uLRd-*IX6<>BBTs0hs7L5au zsOaPJ4pajinT(}S#1am~BH|8&#)ub~Nh4#BV&Z|SUw;BACUnTd)9n@at%c!miU|^R z6)7gKUewh}G3lH^Wxr60iA6(Rm=``MJjy)^`{k>E^sL25k4lM0c0F)`0pMAL2n;X} z)D8zCu)+w&?Qxc31aqXy4(W}9nZfU`%?#FTuv(RhS~VN2vQf~3w{Cs~8%!zcIU>C6 zZ7>73!mAV~C!80hP>`nLdgrns^YV#XwBkC@r-|o;i+w`5M@>RYt>cX%g6iS^<8Yd_ zeCowL~5BB2R2E(e4!S{wwd!kDHR z$Y{abe%Yr&RdU062GY;@^_0K3p6Zk9uQjMn8b8G4#r5)V(FMJN+g$t*9q&W@w_dqp zkcC9!buv9fIpq2wTsN6?U+I-citm*hzFBY@)LP&&?UEaAnfn!Z;gd3Ri`?*y!YxK( z=d6=Qi}%QFLoCW@ler;ko!t6M79DKC&GgG-#faSSo4IcnK1i*HPoXx-tx*mq>lS=$ zd_caUn1BoQ{<(xv1?o1)vf0@EE*_44jPjgrc!au2?pQw_Vb;n*aebso zwp=^+g-0KO*4EKS_12%iVKB`2B9VE%N9&c<&SKUsCQpdY5eZ;M{Lc z(|1u5#qUJV%N9@JJEwK$sjWpne3;dLJA7h)^byL7?sP|SAFRuGL}rv5ed5tasGY?d zw09c$jNCFP-XT-BM5D50=+u_m&rrM2+&kyK8GS##y}JsBPyGRI@9N?a_)Ftmr)l`R z`-z40(z>NCPeO_CI<68xo!}sBP3qJ}!hhh%d@~cAlN!mf}mpfn%3-fq4 zz|h9%Y272#fnoxFFU=sn&C@h|u&1%A<-wuijMC?zovD+rgOcgE1A>==PVTGW987N9 z1RbP{BV3dGQgq*4yGjKX=v-vuZaztWB{tV-(ZaihE~Z(2sMr+?P_8GgcNom?H_8{)p2DyGfN6>=E8GQgt+D(uh7KOgpk$T)i8Wk}|b>aHuuN6NO zJta4}BRM!2^ib@A+%(i9uu`A=_2MltnAO4Y9fh0WJkqciZw@=(`v;~^{zmcUCmOB| z4+`&wQ%euX4Tm|UX_XE&t&+c4JWQ>AqW*1;9J5CLR&gEGFW0Yog8eL&aDI!~D1W=? zjWJKOHtV3yXd;7-6N_wyO?T>{db4bJ;neM43_t!WZtXib;rEaIoa>XfKoZs<)h2un z`gu=$oavA!K)QCyMmsfq`*WF9n6#Xe|ln2p)i+&j%+i{5Lm7C;_Bd6Z;&YNLNHy2?89Vram zX~P@nmj&lj)Lz&%Fh`be6kJcyYpIsv`=4l7TX283fOp#m@B32W4B0uqL}$_UGy2z5 zYw<&gQ|K&y=rsFNW z<`~?@FN#C7dEdW$ULUv0--l$fH-9=p%a(21*E~t@)WtW*KnNB*D5zK}0yipLe?91v zYv2W%54W!PZJ8vsAfy4^92X>_mOYZ{XxWMam#@@UzD89P)lCd`*J@(0hcsy^`(U*K zgsaOY^1|HPHslG=D|Et^3#BNU?3HtwUY(r?Tz^tNN{x9*n>N8Z^YDU*WedTnN=2iF z$G}f)lW~Uyc;Ji6VI8k7k@MAI9oAJO@~X980i;ah8sEY#LY~XRLnQ&i0}NRyb6h)* zt~nBmiCGBzt&`O>G&6vibqjJD<@!->2o*UMM$vI0i6I{08gxzsc&SMtkPQNN25B59 zcNW67rC^{1+I6Qg{Pme!sFS!+4aWf+>|jjOVf zNeOjzD50)Wq^qzNB3-K%k8}b4PdUTubY>HZOcYwGtL-=5h$CG|*6<>u4{y^c)%lia z)aS=m{{Y;q9+h~7HXrz?K)4IF=2OF6g>N4re+T!W0oup7JtM%b2Yx*Q{}+VG)SeT_ zo&K#FFDINl_hQ}qAWPssl%B~N!R8fiz8P+8AG}n-cD}qk`a~T4XVj*gOh2IXvZ#T# zR7*Du`T*`$4f>n|(8s#Othwhso4L(!U!zbP7uY!!wJFfV6`?2v?qK*lZ$TXl+nEau z7fIw=!e1Cej+(YD;W-91CVW9j5_W5ogtZe)NGQa3hgs892CqC=$Y=v(PbA{X*5}Ur7zJKXN9QX6?#8e;=~XL@xInT$lpL!R=_)& z<4H-_xfI4unv=L|G$)~{nozVxnt0tPPxp-oMJo-AYgIb}aYF7}D^4y)wWBLeL4O$x zMK>U^jB_?2>IS(UQ03@W;ZxkFK$CnBa_1n-28y?ozW@sKRd#Dvy0cqqbZ0-QztC6i zX>M&tR+(FqORAV;TAc&;5mx)%!Tmi}N-5Qxuv(z%E0B)W!eX@9S>X$)Hop;oet~l`FX)r0_H;F(vF2 z4sZux{7wiUfmyo1Ak);A(h!4j$f%kaY*|+}FDfQUjj2~BA!+^7S|MW+zE*(J^2A=6 zQlxyX9j<&SnXN08K7&vW4`tzl^dMmc-iDesEy=46qtaa3#_QGepHhUJIFUaKc5~g} z_jYLsGCe5TQ9ZP&Vr;qbI^qo}jn@nCGrW;D$9TOpFCt9bDii9^Yiqm?rPGxI2uD$x zg^2SsZvqO#${Vlann)lrL4jxs2vt-nQ(}E%!bd&=n-v8eUQ58ihF4k*yw~Gc!z;{~ zezqcG`ga$tkYE`}&E}Ia@Q5HfgzPEACV>Wb0o*dF1EixG)-SiYyRZ(V4>8+7c+8MS zY+6U^EOUlAhhq9GYhtkw$+;var6wcRGcSBd_#fQ=fT#Q`*s)rmfHb+U1PaX2a$~;b zkOFfeVspj-q&?=$SP5FtRs$_KjM0K)oB=SvN&e4OUaYnNRJCGWz5rD9n5qI$NP{m@ z01EJ2pq{nN zg?I`IrBur8f{m3C;Q|3z71gL~>C7?=x>Pml>XD0Zv=PB-36AzYJfp8ON84J5)S?UQ z{$vW8-lj2y3Xyn0NdqAYkf^gDM9(qL11fc%c^(?i)qs~Yd6y%eVb>UB!o2agNeOX5 z`CBbF$w%(H$|1bO+@v3%E+N<<94#Aw)#nuSVpV3CDn6D@8^I}Eu=Q)EjqFk4FBKZH z8lEZ{NaUocUwrA@3hux4NZVtL3UE#I2rChO*80@ zN}uqdYM+p{G{}bCbQ5@mizZaIZbxNX`4dSdF7h&cw7cCxyqv|HMB}vLB_8L?B+et1 z08^!tSgJVX5cwfC|ftt*^!seXhb1eYwKPsBps+qqpR%B1OBn zlTkf%F((5RZCS#}7{(gn4dG;fSU@P%mKC^h5RIsGe$^D%A>_vq3Qz!oWA`XoVE2Jb z2xYx-)a}JmVYXOU-(mocetKUrZu%{wgvyMQVu3c9F)E@r4-XaUyC+33Y{4gk9%0kj za~rD0xKh2$Jov)Ev3CRfl#$UE1CtZ zkkNYmO7<@?H5AaNG7oxQ_*PBOr}AA5D(F+0EqzE4*MJp!RIGTVkk3-2c_mwVMTidw zGGzgw``9NGr{(jofZ(Fx1$?2rfV{p9deEs$_)=*JH%_Qlo}c6(Ed;VPV%U*jZcPr7{|jG{sZ~d^Ddghs;e7FULXi zL`7TBauB(k)ed`(e|rgL4iZ11ffjoMOE#m`+0kI|fDOA=kX#VvWPr z%O$fYHOkf}bE`X{RQY5ihYP8ry74G29SWT1XV*g#yH`zOccLWruFWKgeTXEnTOh?T zI+KE8UAeRkr?96o)||=ElZZ#Wz9>#%rwn|37&;;og;4JvipcCETq90i|GsUaB6*#E z!kD+6Q#ZwFUVj(ooQ^xacGjG74mX%F*KR^sOA#n4cI%kSGval-eI4>m_y0(?PFNx4<#LaCyd84SbzlZ-E z^RCa1qR$$3Luw0uC-eDRH^XIW#NI&reD(v(o|D`0SD`kDyq$p#e{jz%DliNGf|9Rr zk^chi8FK^~$IC!(wKJpcQTs<2==hG`2=+gh;4KS_liS z3@M$j$Rl3DT_u3-ys&t-T=n2`9x)kR&X%icOjH@jAIGNp>zpm8?Y36^Y$f%!ObvqS zk&ED4nik2mY7ktu7Ri;qXJzWJb>8V&qKxmHzAjJ+Yb=sOs0J;T1Hh1!06F}pz^~Hc zU&?K3@vqBKt{X(DQh2OP>K&_*Sh=Q5>Rmu%KHU#RwvYm>LG-Jt%%ZL4SJS**u9{!< zpz3OV$fsYVnjbFW!oS|t{D9}CgxjtWXQlbz{_(xsUclBSz}Ogo7(_V+7o7zQD&TFF znXT_4Dxk?$Q52$HX4c(Z=rHRrK53Bm{q-}22Fez0m>Z`(^#D=n>af*Y?9{s(WLcX2 zMfhgfIID9v%lCcnqlKp)<+?J@!oa7FoB6 z_B6;e(Em?zo@P0G?cA_z?4tbqhv{!0EgaD4vBKd+rf54>XrxR}P+K^Q{F8g{E3{BH znQGwz(M%rQ6NPUKM;04p>naXM8f9h`)hyHg@G9XT)hg3t@IS-a@J&>^O!L$#*}$Lr zHx5+^>5}O_ss;Wh)7?}X{7+Yh`;|F1GSIKg{xPbd*tx(ssNOXTjf2Zw++6D$*Sb3b zH&^<`m(0o2K;N~@s8}8MCE>rtQORnxz8ETr^!gI0Bx%F=I-`PIV0%d66_KiO zc^|pljOeLOl9CTKFH=x8QlgY=_1Lp;;#q<6ZKc1%9ZhGBqmI3}FtKw6&{%a$n{urb zxN-s|WU@3=>2m6X5l-l51O=?rfop&+lb#fvP_hoiA!ePZU@mG3jHY?RR zhc_ZF4=kc20r@wCl3~;<%@tR0=)QEVQN3C8nXzN=9O|eR^$PT2iNu}JSu`Q)#d;}n zTnwRdJLDlK7kP$NWFw#j3q_$isdOTek4=Rn_+a%dEz?P;$(a{J$RiC&!1_U7s*G<^ zFGjM-5U#*3l`bWcCqw9i@g$+?EMLM8i0&o?RYRd*OD3m|!WlyNMni=Dq+Vz(k0G2V zvgMWgXeH0F@DX_Ol%2{-;U^&bGBg#DrbLNS-q8v-3!QJEuM6HIVjS&~($!|XX+y}X zD&KGe`Rp~&i#aET)I$@;(xzcyZXr%4yD9I9=3T7j^oU9R0>5Buw7x|pjUJV zmsg>b0qr>vc2_hd;);xD3Y{3}QLlHVBgd1Iq%JFYW8A4clJW`Yk?{P7$P+6IuUzHH zAh=J|?iq;-m5dR>(;%r|)T(YPa+gvF^VHR=jmpfRr-2gyIla(vkjMyWCaMgDR?DF* zJSIZe)XN*yU~{N+szXqkC?uXtO6YWk%45|bb?ROtbEp2fJ`P)GCY28*U`F5&s(){Z zrJ(o+nbkNf8*cfmUbK~;3KmuUYg6g3r9E4^6pf_QAWPAPmO|L%Rxh=bW=?zYHv*o9 zCS`4LU|yLa(w6QO>i$9* zDD_&a65I_*uo@t;NO>mpYI`IehkcCL5g`x{u%@9z3eAA>t*d6z5Xg>XL8_JZR|wb9 zl_;4!Q7aZaWLPLVt9+Vz6$A=?DDOqLWeckB=|DTYGz~Zy9Rh`yimPvEgzX?@Qb{PREGo~bJVg5>bgBwL znh_j;M5eq4smGOvR1c2?^N5P9qv@B_tDR_TrDw7s&}|{DpfA0n6~BXsOtJ&e;Z(;r zkgIr(FxaeKuwg+AWGnJ@MRGG8Gg?jna6JqJDuST=n>(+=i5~3!R zH?&vmZ@hdJ*KOE}f-R41p3?KQX)W&Z*HUxjaoZM|%hKg6XnRlyAn(9v%&2-&x!kA- zBh5l8SAg%5fSH;idtOnpP_R4`ODcAc`VII&lqIabzYcUz)bpOqhCm9y$HM%p51^g~ zFmFMlNU%0}Q16rZDeC>of@)7BJ|~iTi5z=?nUP6a{_fKCPP|h~^`&aOqa6-y9%@Nx znIqtrLSrcWe@P()Ll0+olwgYp1%$h+RLPU_ezc0~1! z;f;)>KGG*($w;6UD(fq)m3zQ-O5X+>PRSf9*7z53WOG~?haoKy!jm%fPDfN*3p z>b2Ea1UZ3c3&vPHISJ$tC!{Q*{@A6@t;42a`2qKldudcxCj;`B*bK^*b&3wmiO4Ge zRYVR9%wRT`K}}h~Q~L+zbA~bG6Y97@+gdeIsuD(IFOVYr~!xJ8bbtJaB z`j$1yHiy2K#BPSp29q<$IfL_2y61Ki=DasrjdZYQPy^0}~GjV)+!P${0wT{D)fDI#uFuS~htg!dY;+tkHSE;T9- zsca}@I4W1{poyoGaHhz@V|!G=ZIolJzH>E5T`)DsUtxzt(5_Xes_J{1(CtgeoB+Xs z4X`-XpzJvOWSaR`{@#uu3N)#xgeRN{r8}uQ&WfeT4AD>OA2t4>>i&>#SqAeP0g|83 z_ovrip4|53#{7VZNH9NA_yCu^QcCD*v8#%LOq#|pwIa;usFMPxuPo`XQ3V#!IqSs) z*zg9%sYyBvL-JvGLnRD-*^&-50lEKL7?3L^1VO#tj|=y4_W=*_QxK53bc}c%*mCK- zp@I)TC3Y_0!=u*YIGg}{_|43Px(cRYEp7sly$XX2Engqk2jK{ZHn`MB=!_-7ppebW zOhe*Kl$nMoC0gm^OzQGe<&GtdI4Am2(F|AEu|!LJ^#&F`*emC@kUEh38kH2W#z=CX z8|2z$Ad6jPy2RdMBcV(5m*^791i_UxL&|k_UU-E;aP8olLGS_&hF6|BLWH~wLGY!B zkhY<6c(j`JP}wC0dw}!8uY+#R4cmE8yPY?n?Ogo<9W_2-6A?--(rCs7b+MI~fPYp_ z(!-cQFz3M@vT_zM5QGE-owNwR9#K(%&uY560iOq7+>GyCIiaP9G{ z4i>%g<3~cawT|D`T2)xLX^-Fbs^e!}rj-flsjZ~(%x@OPxp9#GBe2DQiC&W}rKZ;y zOSO>@X$rIK%Iy-oz8cLU9c9|+!dkEo-9Q>RmU*MvRy#~G%b7~GEiY;#$JJY3!bP*@ zg~h1_)ng!XjEuN)EeUY29o zp4ZNYWs7qmZ^^#11Xdn7(hj|sAYHJ$B^k>`c%Ri~*;v@MZ^1lbLSrk~cW7)y(365> z-(R#VEoY4K8mP1c!;@fpSJjMXa(ZBG9iJ#+l~lU6TAlfcwxgGH6zAG0VmR5^YLXD` zks`LACPv(Vt>!dRF-45ahY_jBCL(vKKp_YS%f+~k${Ll{I(#i~#?@!&gHWiYN{A8D z;gP=fm`^?lwDmar00)867OCO|5)+}2UtuEZjgd*D#trDb_yA%fUm)1XCwq1iV`lf@ zwxRGVp=lz!{bB3By^^QM-+3?N1JJK}BsE^~{8EI0Jrf1PMP4qE!JAo7HhG9Ouqaej zM?>DLC`i=v9aSA?d#LJe&fT=4+PZ_j;0f=^>olSua%H<(8P30;oU5gNUpVz`pvNX7-J1mH{z7k&T0;QnZIe`D_d zYi4;Rky_?j8A4CXg89ehv!Q2Uo!+RIsf zMNVHIY=2&FoLfIPQ3-Lxhf`~>>Fv32bGR3ra?|P5_=XpjY%6-eJbMZ%d&TS33nB z=CNb20#btvK-dyZ?y?>xZ^1(D$YtGD=a{v3Sts2fAkPP^a%dK6R|F08i#dUd2FC*3 zy_&yHYKjy&fdUKkyBsudHADkf*Y|Qj+f>TtP&>)%xRh55j`|XZG_k}NGKu^uGekM& zg87YDO{j)!1#iG@kozOVLMGyeP!uxJ+KN>#Wa5xTJ!CdD^sU2NIgwr6j`p=1h70ZTpLQ zt@--!Fc=_rLF&C~i)e{@^j%IxYq-pXQ_mz99k!PNk{L_ghApl9kM<>R^5fqFwT6xcPrp4`QL z4*Qr#cmXuIhd9vVzq3J)9gGAh_dF4MGV~-|wa4MASr`e=>xhxiI1HEv!2UDF7UOUd zO2|$@6I=p-l!^?h|T7j~0_ zk}!Xw$pT0q_z1}Zd&c%8C_X~40^kzjHb6q-;O?=xPX>BV&;MDFVkCU2ZPf381K3}v z2T)Zj^tAB~$IrnTg5MWH6I`*KOtRYE1aAm1ajL4=j!0QoU6~tpv!0p|%d0C}HqLNO zJ<2vmeOoZE#acowKom_zaJ>OA5=8MX=M_A9?&aaBTwsm+oGDn3af|z$gRdm#++656 zOR&o+bn@$sjC0NsPw&QKNyz`Ly`&@a)IcaEP9-OXN#mJIkV5E zrq+=*@m!bqErHC?+}8G8{40Cu2k$h%EtE#P2&f0&3kmv0ONz@I}N%V<9y}G zlY3~z%lh~^ZD_u^43{_m+RBaC=)Hb-e6ya}Ju~-;NJEGuDwG4hQR>{3@#*FSU@}Fn zf%t}85CV@EMjV$;0)xx(IGIO)=vfG^3$?R3C6>B4wG2Uy=c>!3b+hL7x$1^)S0jVZ zUx%{U=N0v#g~O=(+-Oo5X6c)SgnO=UKt+qv7J)Q(ke+`O+SHtfw43pvBxHytCLc?T z&-VBA4VY(0+Ws!^QEWbNAUSwCae9AmV(`?d-ofPlQ@yA5?Mw7V4t^!1JH85kdk zY;^*HE}ffY#8|ey3t1jKZbvMS8>T?8{=qaEp8DpR;Hp3iu@@ZZ;H5|#)8j3#0s2vC zcUg1HoCr<8oCIhW;5f+l3gqlw7vNH;Oau10ac6owY4ygeaeM}(gJia^o|i!s7|u9M z@E9ubW~ZhM175ZkegJvl#CWQm7G;j-Au8#?{d33Y$&V@hJaM^*YQ!cdb9RUoE(}3F z#BWQH;48tiIyF0ym<}_3*+zQCRg>))ItzJ6$?08l9ndtcUEMUU;&dVmseaQ*6mZ!_ z5eL2jyT&~ns(?GiVPOU(XWS5K$PS*8#smQQ$TS<7Is3U9CoD_y1z?gv$R<#AE{x-zy5(* zIDh{5bAc{6|BXK9Px3w0=fCz>Xdi&7Pz7K~o-zKw?gOyUz1M&$Lj&{3rbl3rqBX|%X+EDxWWqoi@Tke=^17x8{;D2wK8_*ts{{rB2TY~c+2Ia}|OYf1S9Bgv@ z()r@yuWKL4b4>HjFgLqg0)%t)4};M$#OH1@ z!>(ne#6!_NlE6_NNBpN`Df_T$To3 zOUoOENaTlj8hGghwxZR5oV0+pgYJ$5jmoed8@UVWmQJ@%Zz|$~a?Di5*b8@Zi?cnL zDRJj|F;h$lS!HJGoIt;fMYbtVU_Aj_DwsuLu`H;{XTa(pnj4Db1#{l~LFfmdzkQbv zDAebVYoH$FT)4&E2I0k1Bk26AG6$_T2vxTe@3FGS2{Z;kHK2(mDnK~Zg(zmcTZ6`X ztPR4&!VCd!3-?N-%sS;3Mr&VF_!jc1zM@RePxZaAu!NAoKq{N$jdxzRGlgFX7yolf z)_4aS4fjj?YxuC|eFqKza5uCqzxnz~olQ~x>@*tYp^4bK`7$NiXn2MDN`3VWKxCw^ zRL$D_&^BDh#CRT?wi@{oHf=Tdbv14kS)i@n7oA>Fnr`gZMwYSj!-aYym6UL)m>;;ow?e7LvJC|({Pwi}>+)OdSgT$n!xQKPm((HM&> z#(pb}DtP#H*=m@^3$~2hu%IyXDV5uJy@k%!r=PEP%i3aA8 z*^d=;CAtxdK_rz#pKUi{4d=TS&)ep${>jSXWOcGKp%+(Oq5DEpnm1Oew6M@*aFF|D>*+|7~AP!%m!QtcVEVKNUjjSxWo4GP|@c_wc=bQ)sn;U zpjzw%x5`w@YooG=OR;g%>s%JMhKRO3%rg%)|85r%ob{`peJ?$0mue&XkW!V2Wfyz& ziAk0(JMl(ElI2z*$&z>4I!Tr_bwnS5>;?-IWx>pvZwtK*Zr2l_BGhVH-8cl0FCKz4 z@XX9%NN-pZOrJho#zG!-BgyFz0D-7mYzjum4$aqVwMKnYC3)&GK!^yJB`1529IU8F zj7^z!TGd=#sOD_?T+)2y+Pl)TGs!wlkEExPlP3Ul=2T)jQ)`?FoL-9TbwUrKUgEAQ zC4e557=OhpVBI91-}EZco|Q z>m0bqAZ_Mq!Qw5LKaTAP?SND3;q}<97#^{M$}EwmS(v{Kwb@;IFJZB}U|-lTr|oiY z&Mj17nssZm#-l`|9ayeL`{%|}g=w^`&T_!K;|`#06Mj~`AIYGCq-$1_b=6@DuGA^M zipENllJ~5MKGgqEbl<>%KC3g>&1hVYqw~`-uGc>#tXnXyqmhvLo*GDnvO-r-Sz=bz zkwTYn`vVU^_QC8#GBafMYP-zVdH`SDX+%$++<+-nmAlQhip=h4nC4Oa12jwF^QeqN zWu$-FkFaSoh1*695TN8dfx`vocz!b=@fOu^{N}7HChQS1#?iU~N1KSokg8;To?z0^qabM-Zn<75K{GWDiA#()eIbR@a3H_Pid>P*OTlBv# zMe5LRL$nwQEVN)Ab+?R!(eLg*j=C$5+Gp3CgG>WZZvX5Hlki_a+ZlQGy^wMMYVG}? z*2Z@Op&eDXn0ga;ZOP{j8K}S|I8TADtI-w=M2!<;ZwN=f&9`0VR_A?G;eM4lAo2 zP-3|kf>Oo`5&yUOV(3NSFwgTUT(f+1Su1L68&G5002CULpOFH_KA5XoEB^jMvr%Pa$c(ATV;-qu>4_4GGTI z>T*T1-&QpD?9;;}4b@0`~H+oRPwxu-*L zUuk#D^>FlHm0Z&=0of43xdMcA75?))D7qHJ>kvQ+cExswc7x@%6Ry2g6nTvmMTSPf z$x!YTL6$+kXibM|$J&k&a1JEL8#Pv>L;66IuF<4|l9oBvk!l^NbBsmz9vIv!t8*;h zvwOxk9jc@?j{9Xbj!+IuZbi1H11ixaeW0O2sGu6hH>heHf1j&yG=Jn(gTjC~a#I)(tf9vcDU`s{ zAKrEV)!u5568?prd*Y9n?x*kI3P$`&MFIuYiqv#EJ{!>+l^Ftz>;?1dv5HUy-1d+W z)LM=54q6e|PK3OCO8Mjll=NK~Y3u??4?nZZt>=G%`m9d6-7-yaBJ8&=SJ=PTcvFGG zp38L=wOX46qX}a%;1!HNH#u@TIXw;FwL^n_gVc~SfH{Lpl%zbPaR`PYDM6qzdU4xQ zq}7?q)B|ku+HWfebhXc!UrYv6D%$690`+4hMK5K`Q-gEs!Sp;2s?3(kgrPeh;4T2&R2c)O~Fom5HRfo z26 zWU~xivV}*NY_-uPgPE#aTebmwSJhmzHP_|CTj#B&2EG;!*%L1!^+c%>fY4ksq~`& z`w8{z*(R~hbj^JMC@=i=_Nh!|(*s@kdB0sJo6FME##{6XV1F%RP_8yaN{}FM4L)&2 zzUiN~vDzxocK-UC7pc0kRKu|f87mVxhF4!k@d-YC8HxYet1lyhXsvQzMm}dv)Xl7W zKw?H-Icwrf1v))Z?O4uQT!K!28`TqTK+YO>e*|=T9*j!l4c3;p1dWyAdGH|IuYK?X z6a=c~_Pqm7FAymk@=!ng2 zj*kNcCg2B7x;p6A2h4peN!@2d(KVO!ickQ{Az$qb{de$2r${uU<-g+ zVjrLh1A3uA%OTP~XQ;m!s=^7D>(HJ`2nf>5@+b$ICd({8@Z&x-9bv_vXZ5d35ze0} zat_;=wlY901;g8)Szrx+H69tI+l5~;kA#lEKD`2AmEqj5c-yEUHQR7*5J|PGxFNO* z*wxwU5cu?e=e=7?(k% zyaK$-AW1zncInM8yQ+#shGyT{;;V|^LugZee(#f=-}~wLx!f}X69FDV%qvTP zEtvl9lFM`%GIz;U*($E_?vfW=?vfX&yToNB%lzG7o$Ca-i8S0x$l=bv{*!> zc=Kvf&HmG}rA{OJcf#es{hMQ(Lz{sGb#mMvuy$!2Ed(x*!ouYmDEKzVKQw$`Z)lGz zMqX8gzQgi?-R1)wG(-+kWmo|N93V0B^>VHc_{JngZk)H7z7z(yun_sbd4$M$@;V@q z*zDAbE=B#gb+<*C{R!EjeKKEWNB1toTDbIdE6HK8UM{mMQD)2Y9Q+P0%nq(9x_5W> z!O~^*k|3);Rl2PHj+dL{{42+$v|A|VCPa6?cY7tUqNzC z*oAsor>%->$FOs$1FWsMP*>Q6n)SX=uUBbN@8xq&zFh+-UrIHK3oG@D&Y67A{yE<; z&!hARWO~a**-d(k=hUyYIkl{ZpG-yPFT7U)o;Vjw7k;vnZM@$xU9ytOnGaGidjs4~ zo~1JtbnQd^3+5-eU=sKZf}p&B&muT$lm`)GccUFmx?)9>>PgC#F-l4zjZt$=7y&lQ z8~Pzxsx8nvW3~Y@_l{5#i60q_&53hU)wv0aMOyJA3?Dt_3Limx0v0~HWMl1C)ex|{ zWCDuAjCbkPkXy*5P>APZA4~C?`-iP1id_5;WwiHE6gt6EE(?p3Wt?xR<=)<@{>tah~)C*h)^pCpf{ z38zva>5H@1I%+fC2@6RdNQd}YSW-BF)1T|*lI1rNPP{^JZJ#v0>X3~mrz*!b=nKcr zo%l)UCyko+tPyPgjey3&iscx`uB^$NOXnn{kD%^lFA1SIn5#O%ZjsVA*r^`up_ zZ^@y=#j;HGVr?)IuW1G^L3(mL132z=tWx~YEOZevDuUqOu8DUw#Gvuuxv7~<-8H=q zdiXp7fz6z@DZKcKU=#Ju+?9;)m~YjZjn=iaVag$BKYy|MWxYN%nVLx@CPwBPs~TR` z>n4*IPNkALts%5#@zG$tIjG+{p2}&bf(_8*DHqt93$~TD&ezw58qD3sxDMbW0M6ZX zNnb+|edG77KMK%C>FJA&(C&!x?t|cACrWds{<2;w%4>i zH~-Ipvb7e{_*C#ja&kPrPiyIXh1Qn65`z95vorAx!O^qR$WTX*Uo)GW zO@gAZ-uy~Dk_+#w-grr8XwA1i8v9D{Fo253((&EF_AL)|B|hKT)p?}`(#^Vdb{(N% zVdKuOd*>SUlRcYq6$dMiCokL$4F9gAu|JR+JJ=h@bmuybX&t$WW1%|}smYnnr*()$ zn6p}EuH&e-rt7?(IyW2t$H=kdkO(resch4X));Tn z?%e#gn$*-p@?c^d%C*;C*6Tj_D)arruPs|MuT_R>4>gb?YzRcKA?YCb9V|k^1!X z)Y-)3t&dKnrY|1)%T2G<+BTJM`gq{BbH+oVdsE{xXLH&IwD#f2&iiv^8-oq=FY4yn z;KRwWnOtD7tYQAGjYKtGTYfZ|I&*fW(QMWla{9sWYi6OR{mjLt#gX8fUYYnC^HXK@ z^N_aP@a1*4&OTllY`Us9%zZN#TpOBS(n4$JdShKWShI6|!Imrf+PS`5d8-bl(tLl# z2y~2r9)jc9v0%#!ddu7$^R4=cndvcIYwO-McW1>322L|~Mr$=6*P7(WMjV+Y@62topnzf3Js?LKQyPU(^?LOwY6O@<+MKS(5AaieW9#n z{=Y+N>)bkRXv=4fecDVecz@YwdgS<#uCC4Vo5~+aCZ}Q(6Xrk1<5ijVOM2wY_|)`6 zo2RyPhQ@0z>#e6glnWmI@U7+RAoCp5qRr3V+Fuia?h~0AXe0owNh2-YZ`UrEYXQDI zNfd_6t0#||U)9?#>rc#SBTu|TJCc0urny#@u`xV51Eu-3SM)Wf(&TEeqra<-Z~hZ)&2T1o9>PsItx0P%o8J7{Z)-1T z8KWuCmicm7h$PF5Z`~Z2nmC+JR6+NsDf7^+!A&Paq~gB`+IYkUy4M@6!R8nAy7{TO z9lqefS@> z-ZLNC`gb|)j^OEu#2Mp`gD+&eA2+n#t^aiJyIn5~?})F{#$s;+zTDFD_4!9O|3u4d z+tl-Q;J#X7xKcZ3HXJ@4f91EeXy+@nCiA=wz__aU(W)V(+My6=F0Z&OaYM@yW!OMCUU(eg}s;(W5D zqVxX^jRA^b)!c980v(6GrZwlZjatjI!Q+SbXb-*dWS}jQ3$_Mo*X4pW@hv?QT5oED zwm#Rst@B?46Bl!>+hXm3-sHBw%aw1-RedCII(=kIuKXiFc#)4Be2vzgEBi3;!AQ^9 z@%S#_er3C~4Y|r)+3h-HXm_oHKb7r-r`7H(n;;!ZHs;E9XxnnNJA$Ok#I~&=TDI4H ze-N5X?8uev*IILx`#1mJqix!{T-nxK)#qZLd23$)D7XA`@T$tu#5;_)>$AxXxw3n; zjk(J0=DqP<2meAda_zkb|1($J`S;b`5h z$LAZhHAbUWbLzL}*BpAk7BSyBPrx3!v^6^pgosZ*HU7KiF|BdSjMi%YX4#2kVtVZC zrdZEo^ZnX7V|}186K~ZH{pQBX6Y1%hgBRCUP4A3p=WlRSSV*y+yyv*Q_U!uVIsIP{hv1ggN(uo8JQZai~SV>%@uf`?Z=w-!(SI z?<~vI&0h_KIv@N=XskQ1_1AKthRzRH&dg?7=3fYe>ff}d>>kq2Fm-e>&=B0(6)0=? z>KAf>)<9GE_6uA8B?Mg&Bej3@zqH%NZo3_rf9$PCe>DHuJC7KjhE4iFAT^N-Hg!L& zwPu?tGUsNdMyC^#ol}A7neMoro>;e~?C@U&56=Q;IJTt>Qts-sTg^kgn$~vY*XP%l z#WIIdnW^4ii@kp9f4u#j+L7Tm29HAZZRdYC9uBmfG3&~JrGfT0{77P(cF&Q&3ASI> z*Bd{Xi^kp%xOn`h`iIIg8!zkasa(}w?Y5os+VqY;(KdAbd$11R$vgjtcITJBudO-y z-?a8W`hD%Lc)K?I_@}jt+kXMvYeQ$x2ZwgwYOK@7kYYJ%dg)OYFca!ZZLkbwKaZwF8F`m)}nRn zT+}kVvf4e{|5F>E_}zHVj*n?A#(#z;X2+9v-*#@-#{Y%m7f35F76J&g$Z>82@Xk4+n}$n&TRklxgo74S9a9+xN%+^>q%yh=0e*8)n~hg zgT0`Q?0j2A%`@47ZwJcj;$Sh)o*GYgy)Q5cT7wpeH*Ct?`JS%7%GUk;>o&b*?4_z> z>Gag_+2q(Gx4!+|J)Z^|(vKz1JgaREwJeSY*FYnyFFmg{4u21TP$swS(UKoK6iJ9{XkCz~q!YRbnRNdef( z8sqPG1@w`L+0J{kyGQ<|_n#hqS&Qv>%y{AdY9BIE+h5k|j{aM=vHxwUdp19&J$m~F z?L_AbyMC%=wja=HH#cj;T?3sb&4z8j!e^(tW-5|*Pfy&NnmK#8vg)?U@#Leem-VJG zqen|`yHgt){yqr)iK)@Vsoe*G^Jpz&pU8gD+_>Yv-TLsRvs$|Ajj5ymG_SW^(|a%H z0xjLCip0gn`EQnmnm>FdFg)A8^PH}oFqX8;&Yy$qJG;3nFf_CKBY{X+|1W}xiHgc> zLnt*KZkmjC>(H$vULWY4+WM_fdNR>m7q1NrWx7YY|7R#Qy++gL8oJ-T`MurkMuS#0 z*IhO}R;}r^J8Sfr%!S0`#-lp4XVN!d%T{W>Q@%6=$??$K54&TBf}MdmfdlD z^!Vt!=8E44Mm*SHSZMT3Wh+fFFcx96I?&eN%mQL8fD_;BHuG;8HR1R>dKB61R3PbaLHY?`toiw(e1rEZpsKNpEM;Ba}%*n$C!L9ce zQu{TlCW;F(qIeXEqClS$#xT8b2t0jGINi(VL<2P-mDDWiv! zK+KI(Z};n6$Te&y zka``V4$xNC^V-TLqOFLE9)Rr9xkg##nbf4Te_?#PQD$y;v%T$PVMdAlS$&{L3T|M? zL(_Pr!WJMB2J+J@xG;nu5=a`XD-7Y@n@eRmi`MwsmE49<44C8GztcV?JsR;#=-d?l#xZGudk^vxH+)GJOVR$4Mqo_VDdiBF?Q z@_L#W!)jtX zB3tHBG%>hDE>TEX#8yBRv^ZH^1xXx70&Ip-b$mD=}AamNJetnug$Nm zEYHk9vyn_?dA6;&lED*)=`E!d<&o$0h&g0VR1g58+Fae>++7580D6{JUvnqU%d`+* z$Ez?&;&>%mhr;pt2$id=?0DsCA!WWL#`21z(hJs!$*A;En@SC2%J>R&l`}8-5ID)f zZJuAAdId^U0X7g|{x}IIyIa)l>*<#iX36}L9^T@ACSS4I-r^dcW<10pIRrXKX2JY! zam{$_nbKxFCN$)U=k?=3Lv)q<@$mYyhXBWXHZSB@ak3gYmK3WpX_SS3=XP?*aPOpK zvQna`K;&4y;!q5exHQ6Iq`|#vpX7ZqX>dQ427C#O7#)DcFpg8akMxHY*Ab=Dk7Vol zF|LOqT}J`q&O*B0Csbu0qfa(!f>49?TCBm!Vhz@t=4n0ln!z~WOfE&l*q_DF`hcCe zi>wK7rHz2+r+6A7Nr^G6^S#JyA2|QM7P`y5kmIM_qUy=Lc2tNn@{QapBTSUV3d$ABNI>D zQt(RfSeJOG`H+yzIxnKo=CH+8WV*u<_Qxfj(Mz>!G;#}YlnC4B;V2meAwmO#x675|APrl)X@PPHe@&(SH)R5&_GmWqd?Ge+;lYKK<%h`&@4Q|B+A zsp45xCOpD7;!lDJUJ?IWsd!lJh(G7)l@T(pJrr|QOQd7Yhw9;jvDo|%xvF9)y~O(b zZW2`%Cp%WFo6YOJq=d_5wYp=cG&g94ATnG&RIk`6!kk$Rt|&f+Aj|CnQIO@YM_K+j z0%LHy>QP{6?W%|H6u7ygBD!~#6;*nuh<|xg2v5#@@DQGY`LJTLlh1*bF38UnD^3z! zu`~c|>#S~S{~0}&)z(?L0%a+|GF!LkL+2;RxsFLD+zG7(wEBPCauC2_L$6Go&+ z{(PLuiV~AQeUe)WPs!zOi|9wNRZZcx-0iDrB4&Y9v6F)qh(>`RpY8P&z}JMy9(?V; zM2-N@@nvbcZtQUXz%62`$pW`>NHsoiJ0t{d`P8v~nQ>X5FH4xJ^ktF!C=Xv&l3uTy z$d@IB!(+Qryiu`iM7-#}h1hx-y3QI4U1#iUYGOQUA>tK|u0uKph2*V+s-pVcpRf^-n!?@_6$18!6E;Ae#2MzD`q7inESZH|P@x*cA6lsCmI~HNlB8#e@^2`^H z)O1&Bgy8bvm&1eNP534Yp;uJK2jqbcX|j-oE#q=s2&$#SzXjKYzd$Kb&~rX^uZWC~ zk6oOq;!CvN!-Fqhhpi$A73a2Cv41aY6>+*3whEC; zUf3$5lmKofY!%T-WIOaMMe9duY!zX)S5h-^GkGL6(AhTvbr$@A<~Fx2dBaky zJv}Gf0SVOST#E7u?IitaY%nwkgcIcnXFDMr z@d-YSIY>^JS7VM}q3mz98*}jTPZ9}pspVd&G$Q#qPDxbit=N;^OL(8lDaobMpnrX} zQ)xO-?ovsbm$G(ZRFUJsI^8b0yEaTg!bu)P{~hGufyP`3Zqf_m?|TuhnauY>1hK;R za&|es7as`u!hJ8COH8^Cj0%h9VZEw3fLu3P`*H!km`!%G*ki);m!l5u6cm*%@*UP28(BGHHdAlK{`^x?@74Z+b z!6w$8B486eg@R3}KsVlJJXv5GnOGG=zATz2##q+1)vVnGr0Q|IiZ3rH4a1yIN{|+x z;$<&>IoJw8>YkVPLO}OC?@bXdip}IPD?y#HC}JZtxaK+;ixiBLc~j!>Z#=I;xP#ud z8{kdhq{BDzr9(|c@;rc24-J~X_j}--csKl@c_ppb0MO|fKtC+6Cy0iCUU(+iI|fjJ zXOaz7_W!54iKc<(84AroAlI_XdU;}uv?8gjm`-LWf?D|uMP#cKvwQf~l9-5un|r z#*&#Jp#yT3&`V}=2FS!Ep=2&nUkN2ll1M0mf2@#De?i&vDoZF=+P-LH+LxioqSDg1 zYz?1Sq-JZpO68eYBs{`5v4|)XUWrAW^op!_6;H30pW+jIJPRas)6284 z|7P$kxaeBAs4gjIY2}3!C*EnXb1}vCxGcr?)nYVV;^x2uvn@Jx?v;2}>iX5Z4BPzr zRjj;NDNl#IJ&{Q$Y0jJP`L>OhJ^>uL=usG)teyH&X8^~uMr@ejXaL66Mtk=OI^ z;rE{i;dfuMW8%F?c3L9YaasB@*3SGp-%z6diIc>xOMX+fsf_)70tw{+LG$qCoDqaH?Vi2}+$FnXk4Oo1Fj|NO48eSSOrWUMn zY%Nkpt`0%I7|H-Zd2+m~3+_(`^3Mv|AY`Z?+GAG|?K3$&6b(ZcW~WsjbQY7f>H|j# zw(282vZ0X&I76mW(D1Dcy0jM1@hx_6aBpa^-|j4SIxT=XkyOqM$eP0Cu9H1>AyG6!}$Ii8B>dRzyGZsIqz&Q5=j_ zuCj8a@JWouJV&8*cHX)fwarz!*#S#mk|SB|$tQ0vZYropHWMx(WxYfMAcuEBN^M_k zG&Bky`Wiq1+5%2s;>3NC@vcf}cx0GWwPA;S0r#pio1rgaU=6f@iCEncbCsJqu*G!M z=|u0@#JO|H>1wX?=)u_jgQ3`A89NK_+ij#Fap%n)Ao1*GiO||fk!9N&oyH)5Z`-IgiB1ItnHnm;vH&^ExbWmjVeQJgzm~p`Hl(&d*aL0gacoW>@O{F#9t+8RU`7#;;&MP#SVN5m(019 z=XCT);Sy$hWOetGV53J?_c3b!-+&Y@Pj0){NAxN5+U{-;d+Xo_fq+`Ic;k0orj+L0 zS9Pyau?myhdAzV(@*MH}xptn*DMd7=mD=_KdzHGfqXnW`&W$ZCHWA_Ys`SRX?NNVM zB;Hh+Ju1g9;qB1{+a4teY+uPX5SXooN0qI*#W=bckA>nTmk z;@2bNPjbb-ko_smYUaZ*LaDaR7K(LIeO!H3a^!P7D=z)RLlNf}b3N2>o)d{4q~bke z*BObs1zZ=<+Km8{43SQ%ghEJILzULg=Os%yE0P%R9Jk2c+jsPN>riER$zNiBT#D>- z&OwuB>*ZUwf^c7t0$yU4j(1YJ#)zLf_AO2l zW8Va?fW=z!W8bvR%&Nz}xeFyNdlyN;GoMO`Kl$cUk!X}xKGi-dvQ{~tiq}QNW6xl8 z*dkN!J5peGA^u#{<`d887R;3c#@X)NSSgh-RR;4Re;Dfub%7_TgAc@RCOk@<+vw;) zWbziQZrlL~MuaXHENmA3jqh+L??)+FEDsh|6{-AF<2Or)*UFr9zVTXNk|bX1Dq(QP zYj2Jc242w>7=UxYRsxOMmKEuPQ*?2#WD%L0@KAD-wUThQJQ}}Wu zYS{!NYBmgMR62}?I(XYaV{`EEWOLYB7+qv>C3qmR;dpqA=BD@qQIEDLgAKL8Fi5^X=!o4&$LNnYT}|b+IJ5b-LZ$O7s6ctHWq2rW6_lQMsU?g zqq4z;jiNNlo`obQRbnY0eeN*jDoAqDVIs+~IY|DpIr-$D!{&=i9^OBjk7jYLNYt_k$Vb^QBx>m}k*L`mBqP}zb{ZBl z;tx+Y+(n~tevj3oEgEIRkw(?SZ5n0c@xpkFPfjFfk{TP0lq4I?(ddZZXS!&VjaEOI zqfs^%Y1CsCl$=bz{bS2uG|Gk}^~s*iKU6)6(kOct(x|MWg}vIQ(dTZZ92IF)HUVjr z4MQ504ijmV%|RNK&0%X{G@8SeAQ{Pq<8jzz#Kt2TsmC+j;2C_ndNKHPi>BFdqz(1M zsn*EG`YpubxwsJZli98iyy_Yqu+k8!Hh=PaHKxjvyqSD zL)D{@kK!mKIk5;W!)&Ifa2S%ZY#3XiP0CrEfHW$bfJf}oN7)=C3)vj@5{r-GEAT*M z!|@fCK8mA}qSd2qik`ypNE)*7Y%x@2#IfpyyXiUZ_h=kW>6wl7`$)DWzN6Wqkw!;w z9Y~`dpGe7x4OV|6do-g_HXNx>_H6#4>QTr?ah*t`vd9Cn#oQrIAC(Rh*&>^RbS<01 zzRITSXYeJs4IUHNfz0D@JU-cQ7mc#fNTce}HjT3J>czO}?rB^MlC=8qlWXFahNy|RbemJn*r*I`meX_xnMtw(78fBv>jYgHB1}%=S zr1T~o#@1)k+Xzmed{jCCkJ!aW*&MoO(mCuU?C?x{1*JOaaD0VLb!!qgaJFL=TzLF{@qTK!~PHoYrsEG0UxRZw!O_uCJ) z48}*1-`*w0h}oiZ*dENJ;9&P)hP0%XWp( zbD!Uqu(2rX*=VFu*(&VOz!>ZC(dsW`gDo1x;YfY5XCsaJjY1m5QAne*oDHPW`GbzE z7t^fl_>7A!vN=fCvPZM8vg!J1dqfg;zq*3)~n?~7q^x&SjpL)$`@se?8fC+g zMrF^YG&+J0Rga=H%0?lL$^uA8qXs?<=}k6_t}fcuJ#etlz@fXZk*w?FymM9IitB zWHuK0C>yQ*L^hg{9UG1$E&D|K;Xu;Q;7XACWP>S<`i`PB%0?ma$$YKs#WwLh_bPfA zNYt_kNYrc?(x`NpXk@WDxM#9CY%T2Yp23yifyjotXq1gc8dZMgO!i15*;aUn=_9*d^r#0INZ%^uANnhi%9l|7q2 zbPiXb9z|)CjY1lg`C8elZ5r*v$0Ci&CLoQnVMwFWVIqyPIk*k7IczPAF6wb5cp$Rj zE*fQ{kw(>{Z5n0c)r)acl2+Ja*wWc(q&wMS*q0KLe(sf&DX2e_jYZzbMysF9Q8XKi zH0rSmN=`XkhI&8PGAyQx!;$)A&qhA#HwyVEjzW@?`C5_Wp2A^B%Ccc>g*GW?aRSn) zYy$3;OV+bFxDB#7>?Q1=r|=a>b+Y033Y+TKcsy+NcxGe8@#%h}*;+<$w0h}oiZ*dL zQj%;b>`Mua_W6zFsE&Dj<1BaM2jf|66c-xsn+Ga6;Xkw#_DrVrKdq3ThT zMxXm7PISwBtw^IL4nvZY4wJA&oP%^No5Q}!rfUNy;6Zy#V07`^E9laZMrFhEXf%i8 z@c`B18I3-Jqt%OXQ{8-F4`)kfqmf3{OQG`nX?(JJEJx3CeyecNC>yQ*L^s(zg%3xP zmMz+TIOwBU9E{W_8%$|*%5M~<(KwDmJ}UFIB8|@9Lg@i%R60zg(Wh|^(x_|>`zD)4 z=Wqh!(x`eoqtPjRy5DHF7B*VFbT>uE@!?2!>ZMQ`^&QK$ zk?`CRzeU?*MD$TM8i`J}3VSpVor#ZDe<2&p_$V8WG%9;GrO`fosCpEoQGS%#g`XR8 zSe9%QTc1sB&)|64>qRymPs}Cg*%V3>vMKBp79+wJ&>fSF&Lhux98OO|J)BYJ(>PeU z5;wWA(LRr6%VvXV^Ca0i*hdm_oAX&R8;Vk!4OTuEmrO~X4OM;}doCljr*IYYGI=bR z5?mI?QmB8~*n$R8qGV5^q$~5SBHtXr_faB~juP1>n?l)|Yzq5$n~qI<1>G!<@$7W_ za5N=K+2}l?WWy=tsE0G6G<;U#CQ3G%(u4ZZlpfenpH;9g^m{HxzxB9a<#S#1%Le=H zv!zGkqbX6!zRrF$uvQJnQlgZNr9|mBh!Q0mM2S-7Ol89SfWs+eqw*>2X&g_9ST-Kd z)x{~<6uMcmDeM*O$focGlqhAR^N5lSr^luq&WJLO&sMI)O_Xf3&!gG0*}<61!5mStp~?lj zh_W76LCMTx!IXm7Smlb@gDnEaCsTTpJsBz2XAp{S97Ksy=EFy#d}fa$zGb7>>TI?* zkK-v(%En8Gl1-r-Ae+Ko!D!)Wd;vWN*=QG0vcZ%n)q`!KWW$v!aTCuRu7nbg`r&9} z6trmeg?`Uv`#~iAQ$EjSL(wK;gOy*$1~WoqqbUi?zRrF$@e$!NC{fDBQlj)5M2V6O zqC_ck+9Oep;QJ`2l#OC*vx(Bg@sucK<0VANrqIojO<}LF7!-F7ve7Q0G;px;(QYbZ zqbUiiA8nH`8&0o>$8fCVV1p?I%LcQLB$QU~^My7!5JiyTIHn<9JGxvhfn4WK$^R z$fmGYSVW00pp+vUjW4h%rw@ly%25xutZy8wTuB}c7xZYhYy$^V;*qU`eIzAHpXain z$o}emmdplQa@J=RJPG4aO2QrsMtZ}sl-^`x3mSyt8=pjpQs$ONqRb9BhK_WUXy~vh zl#XRn*gn~GJcX~Iq~I~0oo*aQQ!0~<#(lNSX&g)`SUuRLVD@a~O58*_f)A&3rhYhD z$ptN%eWBlTIr=qyp6jAtHdy&}Zu(`TDN)M4&VDqA?><}xB}&;?N|b(sC{eOOc>s=D zJ-$Hb=b=5oXZ zWzJjNS&JbS^ED+l$>xC0Wf2axxt6T37Ia-ewzyv5GD*r_4fn`;Yav87tR}J}G9o*Q z4FJo@#t-$I_uU8QcpQFV=t%%AaLTUev_I`-JqQ4Q@V~6?q*ZOBXOjlIxJLT4LHey2 zbj|I2f7!H!yT|v=?3d9o9zE~v@xpo&AK{1fM$w18u-=Z}3|Mb2$R-(C;5MOt;R)F! zO!k0m>Ib+p56GsIHw9!9kLfLQXX4JVa%=0(Tn_+Fd57@+yzY;e^(zdN7d!}*3yPq; z9F(UBspVjmQGMU@a0Sm9Ib6mu=xjM2SC$^K8>tN8pKkyjmlx``tL?P#an83{jCjHH zXge*;_ij5)u(7?`PGf7l)owdYyJcl4WsRk0CubTPflEXCaMEq?ihfDItY33ArT36# zsOMWZq!6jHe7syK(ralVt~AVh9)iDL;EfK2(c4qZ-aJT{BLGfHaGxKNN!&O}Tn@I- z3%U!>YQa>)7K*byU<>;RoTCS9A??tzOxQwcD?+Wp{G{=Y;(;xtjNT6$SDYkb<8ru` z`PjG@h|aR=*tlGC+faS^A5}+XDE#|ncl7{|!aroA@CPzg^8|yRSJpi0H?2FY#@7@lJIWf)cH}vQ*!NJ@ zdTs_~t)>Yvd)Ss>(7K!B#zIRIxUx7gXHovL2aht~i!V zoKMz54@%B%lL=Xw9rM%JU}z9zM3e_5rjB#*2|m3&38uGKZ_huY%xjfhQXiGJzO5h z^;P@6!OgSo8|VTb=RvM3Z%?Nt?@IpaY|{Am;Mz;>+vaplJg^Y!jvWpihI=#&_sHs+ z_%qfuv3%@oYGOQUb?uvKo=K6ei5C)+lL_Ng(!eH%qy_#;1SZqjsyrPp-KuIW>_=W*RQ* zWn<7iAyZLnyiwIE@%>z@M03%rRieBHLI2RKtN*J@e92VeLVXQUVX`B>&{M&QFCSmS z4=B~$0CSY1x^L%G9d9hibT6r^p%6pr0rGWnW8tJs0eKLO1+Mj-jGNkqKVhohk9CAP z;1%n6Swp?`;?xGtX^nfMgpz`UnUKp6WgVq>-;j9|7!$v^*B8+Q`ED z2=sFO71W+t%PGHL{v@^|v;!!tho>+Mw+hpnVPEmKSo60bmFr#pzerLVR!t zERWP!G7}{J@gPL3EYCQv`}E7Ak;G>4(tX59Vq1p(C~Tdr`?z;)^rkS}`W>Q@1$u0j z1?e`90e83gVCX?G4^9AOm4kb0I(Y_~#3rYcO-O)_@*keiIxo+4!2Qz#j$Zu$F+Cmk~O@~|p; z!b2R-r4vNB_J>|f(sIOFXXhOe+iCg8WUZNc*&kiKe`Qja(F{byyn6qNGZnpmiSNUs z_wRj_`P_ge>t3f8sl`}0)orJfljeiudOQF>L(>-51s7imF17_1e->P94KBVMTxxa4XLCg_y5Bq{#&Kk|D0kFD3cdM3)4mP_sP^2y3u z$+)J=Tgk-1H#^_!=I4WypRZJZPR=LGNx|>sOTn6o}%uv*P_+g;FGw_Rm|7Pam zRI_wDL~|3s@pGs#D1%9~J*_TuO%Xj++`Of>Vs z;$G{Rf=LKAUtV%CBk^9_%4>1VNb_Pw0gD;&nF{?fnc+H3>lPGZ1C-d9F-$lCTngy3 zr)sUoi#gE;o*6>TLoMdSIUwf9BuC5#*tV>GZ@z`T}r}Fmzki;JxtUTRM3K*NaT3dDP+-V%FA0nZ^DX{jvzXt)Ttq-PY&z z+#4)$6X8^3(SriVVe80=qGB9Bq%V-gIDRBs@Q?Wz$4|r<2Op>u%sZQC3b;^W%8ti{ z;(LY5F4P@2gHYt%L{X7>THFGiw#8g0LrrvDvNPO-M8~&n6#c-~a!5vSF^f5*Ud&+09o1DBS0Uk$OOkL%fW$*KL@w!-AVt7+o*maL|s$}Hmxa*df+(|l4< zWUEBO#fl$$q@oCuomifbib9UoBNb&26~U_=%j2vbnNNvb{o;HGM=Vc;%%64C*6_pZ z;Xq&uyKf2I0)nE?2sTt|+GRa=yY-AKdTwIAI(Svjy&nDn6XEe}HR1G5=sUU)yC?R( z(EEVV{~pKaFSF2h^C(HaXN>Qnv1P4s91;%>9&D{1PiDrZQ^@zX#y4wY^P6>$$ws(r z+&Fd7m@$4Sn3_CeWOoF%fi&1-O9SJU4h)P}o=)_RolTBC66ONrvFP3dgTcMLSg2xR zp*gzSd=h+E9|-hL8ei%-b*fb@Ag=1+AR)_aO-JN;nSgjfr}Cj((`^B9n@m8wLnR>o zl#7_h4jFF>5&`kSluI`7-PM)7DT)#Js4vSdwp?9S3jCu~;JX}Ag8XsJL{zn`gSK~G741;YD3-c~ z@cj6gf@j^4P+Z_!cSPz7yy}jyzTkE4@Zjbw2@mcoG(4!vx&EB-PA5Fb`S-8n`}ZTf zp(;DJA`I29S%OU_9KUV}M;CjMr1tvip5iJ+-IEKG=Vy8ECkt71-ILErk!*tdHs9#{ zW}eyf3+@<@0K|vm@I3$JVdz7~Y|hG{Q<62vxC80ZuMYDfcY*5(0zX zk@i<5YrZ2%NX-C`{NQHND=ndIh$fx6Q(}O?!G+p zk-z&733uP+zg$*WLaa>l2uskEHIF#oXQ)tFDHmpev3g#X%T*pyKvfvYP~`;7&ajMR z9-0%C6TNa{*NPxO^{}$%K|m zk%4eBNf8Kl=X>28fp9KoSSA1%hsB*x=M0NeRXM{XuiGPM*rYdOm2-w&I;Si`<`EJ?$Q6qGfMx%aa_ zy1g5+Gf{XqR!q{lQYK{_O>}P*wjYO?Y?liDBQn7+6SQnQ+`h>|uFR};9Jb)Ev;_YJ znF;nN%6-o45z|e0-4)W#JpncZmC^%XgOo9_D2NPT<92#&Za@^oGm)5cgGt?TNGHWw zr=|JiT!y=vXt8w6BG*EwrZk@_pEfCD{HPSDwMB7`kTyx=pCWA%6{A&7o8(VK6d1O= zDBfvHt!ZLEi1#=xyT{Y$zToT$8GV$@R!Rgi;g%!9Z76o5TY+44(znD8^-N?a%L6@lgue0Ni;2jFN{Jv90ruyN>$vtkHZd_iQOvggeRJ;yenu^6^ zQ3z=x&N-kVNyyLe7Zk)_4SO?Eg5XIoeldM}s0Mhv&Pom?{V2Pq#}8LRCR z#zJB2)uoopVv0N;DaKH`mr;R4Ex%8u|J{#jId@rPB9ViBwidH>E70M3q(w<`^bV$n zF1Y|8MT5#dLMu(rGa@L=_l^h>iQ*Lze26m6RgMU{0$wssh4;09Ivf#O$t&PRgo;PN z>p6N&Ryp9sGY@%{1sDTF-y)7%FL5hQc9LHOARAKh=aKxn?M8`P&RZ%1+0;%=%mT!F zW+*W>lR6I{|A_h8&}-p7LcziY$U|*rMY%Yvcl;FI;nquf(_CAlth=mloNJ%EvtcZK4u~*0-8-HgU6=V}LBI8VOJ3beVnH-3*eRTYaPwFe%txGB0R%X8$b04WN`?}-5N1mMWy z#}}U-&FAII_@TY2MIwxp2-DAN{6dZ(C@{sQOJLop%(|ABo$~1tuNBfIcu$guFXQM} z#XI;))Fiklj!dsXVOD$;hbHwAccUzdbHGwIc+!!o(>ComTK{!$=Wz-BgA1{?SWl=2 zmfFp^&z@Ic*;UZOElmffS#8HiVmgx?Z`5=Nblsuh1A9Yzq?!4ZgS)dQJHlK#{#8}I zR>Amn(ro;~@auA3_;tLpBfHy39+uiz6^HK7mZ*wAXU@$H&>w#HYd(aRp(yMl#*}+;9qCR zxti(F+zJiRA1Jsh%S_k)L+s=q_b9eIofTN)#lbfayq_VuK|Ed4#-iO z{eV~s2ga00HU6hKS6Kv3H^!p~{5HBT z%OiS~Ayzp4CnqTdYa6zOP#$Ylw_xU!d1m6&GMqbCU1sH&VPK0%Npt&Lbwjrc87->Xv4<$%t|>GRVb;68`Sq&$=J#^-&E~hgEGoXJL-cam zRztD*UnN#baW|}gK$42Ul=I?l*jd6%RknYM{n0HXW$!LRND9+Eg(UH$dkM+YH-(U7 zIFEbG_q+$RpLf9znoLnx$19+E5V*(ssp-`D)I{=35|9BBlV_3*Rrdd<8vB0O;TrTO zH4}W~vc>vfIq^cLCo9X&OeZF1D#~XPP>3>9DF%jkRLEPbbET+|(B+C^q7DvOn5cDi zut)%-B;ig#FtOHvGH&b`I}&HMgd!% zB5*bV%>hdF6+q6t3O|A|&(oe*SjKkFIY9sN{LfL+k-33CFN@QDiFX4p*lu7_p8pkE zp3nIp_b$ZD*jqzy1(x|FColnYgLdVqbAyWX*RJ8D=VZ;+_y#}|+2BSK*{ebmDNL|h zAR=q_?lxZsAR_PX=98dXFhAE4rWl_Qb7q>(z77`eLRK-VMo!Bu3+0zPPTt8?td zIRXMd!FsTB?A;Za1LQibIyA9gh>(f-ZR2O4ihb|(yam{E}d(XS0v6@UI=%k8)Zgn~Qa))|WXw!PG56#n~K0CsK?R1cRh{QohRAc^3Yi%L{_h8k-g3<^{J1b@?Gg zCp0MeG~>t3#tQL6lm=w&T8`SDExrt{H1rQXeClP!6phbx{tN zPl@eBS1M7g6mVA=*%X_laeYA?c`_2!4Y=`0)x~?)O6yS^Sx0+501Hi>OAcAEv%S=Q z=35YeRolvJba%p+s6`e48YfI5Y8E+{4y=yY3@pl{ZSBvfs9$Y0i;J^*c-yQkkj=AbBRP~cc-EBB$#W-O`E{3hLD>Eoy`FzbGKy*0h#r& z|Gva?ICb*6wZC4LjyT)H(&0oS0i_obL}>2&3dzR8EgdclD1M#onzNj%3+9iN{oKUq z&BA=EpBwfQWe(1)teqRSrd?hXP!-+zbH1IMr&i^J4Epyh#5!d7*=-hnHdZlOEk#Sh z&jzGaS2~u1pS=h0vjf#t*$UcARP=2SX0OK1{+WQC{l%h77z@JAj?_`7*FM|dS`Q9k ztp^v`*dX$)aUM}_jMTNogC{E>hD7b+jpPlYybJLP1 zuk3VjvPUr(NdfjK27BFgu=`YZ(Pj5}-bKzLmU>H>-RHYA;$-#CPzW!No%uASnHyjc zd+y9uCjm$dtY?NYsWX#_nb~Pb=+DL4LT%u~ZRSg%I?0_CC)RT_H=#P!gE9FYC^m&( zF3{t)gt5vr<*qVaH$kdQdzV{f`cdQUj(@;wH~7Xy((Gks?Uew{Q(F3RO^=V% ziuYH1FSb6k9?qwYKc6lPB-nAY3?^78Iu#N&=h3NfkW%a_cPeyMddR>E{QRq;o-F!T zqon3W;a}~(Dg3Kkg`B87*@WRXGyStTu%=QL1^R?68t_SFsr}Q~Lxi&iJjj=^U3J!_ zI2W@2c%JQK{}B@A5}~qrz2=dGmzM~o64WjLFi$qa9iBAt2iZ)qIT8q+DuqCiH{=px zIbz0{!($5Y;RtfT%ZEd1sZ>53L^4`!9}ZWyEQFb1UzjYQUUbK#^*5|btos?{B!O6< zWnYKlJ&`5$0BggbHQfb_S!0=1YP_QZbaqmT3w??%L%f=cTa)guuGqDd;@r7s{!W5B zsZ&VCwT{cU)~os0^@tt2w$PsWAb}_=oC`tQ1FPZi#Hp$v0Tnh}Mt^>gU@H|k%S%>N z@hle{o)^#JlUjv)4x7SCvZ;TC)H!s8xgDvSkla+fk9N~r=8ScFLuWrWByg);ItbQ4zF3(4~)8F3)1 zECEpmvr?oYO`et_iZnIrE}(?HUzqJt!rt#w!j5@&D<#zm#BAns_XXN>m|G!EJ8`;~ z(~fhYNS$^x0%a`Eg`#p46z;U+Qq-k^5#HcZ^L}xviucn*4iDb{D>no0cO`R(r*7*W z#fKeBvx=)l-2=Q3gF~QzaD94tv_;vX(M~Kf6NF51u(=6M+nFG4f5uIb3BuPO%dEsw zRoK#?clfBIhuKqn)Uh-(eo;`;6&<~!Lu2X58OV(e21iGa1xH8j2#%f@b!qf!{e;-tUTHs~^H&9M zONMf2@g?= zPKO(CD4u2(AF1$5@bQ8t6D6J+o{WewE>PiuCqswX%0wv&h9~2r@B)kgD6LG6F}J)| z6keR|5rrp7w#-E(jlxs7{Z)^`^ZCXqM!jHuGgcF-0gF7$TjU#vMJ`7BL=&{1MEMjZ z=&xM|f4E9{Il-IChPHgii=5ctrR(WG)#XJ34Mw=I#_6`{Z>%;oI!H zQ@qku8nUxob&uw&?mQP1Oz^x#dquLvq9P}Q89&*{V2%>=-6Mnf(v6DOazb0oVCHjm z1<~iwIl6(pIH9P`aNc?$S6A@XyRDti(!IF>t_@Gw$r@?yC&4}cxDj0652-clf{QN&7u$l1KMO9l1{Yrr zE;a`je;!wtxZ3%{nVSRRDSSv}|Tnj%aiUi`i ztP@K6xqfwtZ%8NiFce;rTOf|Y8a{QIM8NtN_L@gRM__fY07MrEf!SHh2Dt~hby$$w z4*y)!bGN`hFX*`pEzi|A2r)Hy;J^_0oKj=SOpsJZlM3ewX5_kh@`wt*r56`(!F`Qf z2%;>?(Cxm?{^&}6N|F?&dnQQ|7VDKHi3L5&^YE+Um<1?EvGb!U3nA6-39z3h}C z%Xmvm*5_lo-Wd4=FIEjyB+gX=714?cE~p#d;l9!@Q&GIU{G8%oDpbQf0gGiAD z^BYQ&TAUFyi7%mq^fQEq%){x~~ExY6R=<(5c&E?$}7>A>MQwzKp zHdtb>Ew1ykR25)s*$H(1M{HMU7hK>SyoaQRcu2(go;dGOKb-exDUq)-&bur8AqZmU zyoygK!gL&I&|aR8gF$=Fdg~W25ZpRiY3b*r7pJP6^fX-W;iShlCO5!(VPHNojAf}re|1u@i)ovL_VR!~??VpF?5ui{cF7qN_cnU;y=F(ln z68YuaoD#83H#@0;Qazl>t8c~XL-oMmYIp{>k-C6|`(Fc}L8lp*z26PB?8FDu4e9&z z=l1^`r*`6)JA1$7G)czV?wgF&I-H)JoT*Xyfd9aFOMyOMKCM>GL3q{93$R#pA^8Co zQ-6>bVDS}tpH>;Lm=ElV>;Y5O9Qo{@eR+LLG;4fdZp5JEg89?fU}z8sJIWLGc0$-< zShLL%Bs>}HL?Vysy#&P~3N#MCIQ(*t^8F28T|kCnnMtlG7PQ){Cm}e8E%;3~`PiFbKe|LSW3@3<86XEPEwV`1yea zV_xY8CIM6rKk(nvUAY08gr|3$_b-ZJP&k%P*8~2Q+WiAvOg~IM!28ZM6y#W`-3+QZ?`)6}t2=?mVy}hZD3wUC<)lyrVl@y9{jJb%L9phc5p1m0v`X^- zC$N;^vc&kg)MQ1xKA3^dW;v~Xj5T#OYr7_{8k@0@3&t zdViMZtyh_J1?S`QXwougy)ECI{z(g_f0--huE=sxOohT&|2ze)*K5iq{S{wc_-mgCq_FfZjr=LYxhWxvVafO}7+3WH6lGH=ls{zrUMJ=9La2|*FPU_INiGJ0K!PTYus(m$BF$%vRNyXg|H^ArUdD}U~SS&LD#gi{0yB^@*{B;qw65c1e@;oCz!Xtbm zK;%@sB0w}t$he6jK*A@&E)|O!be+wq8V)%TdPlT#sF7PV4O_gdvyc;MbC#%uoLD(k zXaif)Z7H;We^uF-Sr@FR*fbE=9K^)EyR#2=RC_jrm`Vq{P!nGgP!n%29X0Vg#*^Wu z%TMyS|tzku{vK8#{X#xfr}qfeLHO0Y-F@qHI|;bXq=u- zpQ|PvO{&JGQ%If_@s{AZWEHdoTWhrh%W3Vh)+Mp%!99D2Z6ZDG5NRZOV7GZMAj+pZ zYL`Q(i;PfTXSXhq66%{(txG-xtxIfp&nq5;%EvjpvL?{-Rwo;ZbCt=4v?l=<=*Ukt zoTV~yd4Z1QCmZq@X|nJWcY!^VFon6weW8AHk9|Sc`AxJh9+rYHcAPj@85biiQEprE z<6`$wMRR%Evh286q(i6?VCM1A$ca(t80F@x0Gi9`V4^Vz(%z=8sfml8btM8*_K5p( zwREz|NVG*)#+OofWh9@+CEOloXV4%i#v&{c2A>CW7m9dbJ*7uUO2l~MEM_U`umu$j zfp?kNw_&mC)K!^KzJ?j1oX=KF?6DC4)u}Dw9KmNx(ti{_+c>@btL(Go%}kN8ad(*{ z?0;X`LRXxsYBo<;BA3|`-!4lKU7nSxlAs0m(dARd#PlWW+VJ@sUMXYZ6MRy}NIH~P z%Ge)L!dc~%Fj8QK8Ck~$Ve2@A`s(;-8DZu$Cgo(o3&rFnzdJ7NKH%_ zxHmPS3KC5&uNmBJHbI(U)5bc!1L@-yUv&3qe_~$Rqa9);)n*&%%3cdOy>H8&42@S^ z*2CFw#q`~&@yHduK3fwQADy4o8**>Xo(yP95iZk7EnxVYVo5!32kZrF-F##c&8)`U zqwJ4MeCd@3x_0rezmJ-Dn!H@`e)dOKqLs)1EjEGYr zuP(PY-}BlVvB=HQ5DUm_5~zmrcnf(=gl=3OZ!Mgy2$SweksMaYt<=U8nAa59h$RQJ zljoDusneqJ#)E;yqY~b zmAmQyi#Xc@=7=PZaW_$DHbjxzRw%&Y3a4^c@&B*x+Job~uKH@VdhV|6*s&eQCi)uN zt?R_GcO}cV%3~GNIB7CTT01EzZKAcbmPKSqNb4jHkg5dw4{s=K=>tp|9s>;JQHIAb zLztc6G4KZi!ymk+qRPS!%852q5XG=!{9U)E?HhSwuqy z8XW_z-=dhAD#(NuF@4OOttM$uN~9CUloEehHmF0~+$h~4j7AlT8)A0)bAp3{tFABr z>@j`xyhzb#M5M?_SQFP5ZiQ)8;uF@Y35>HU*Ep;4GPWw;5m=Q#%^anFhz|-sr1oI{ zWM$IO#UYbMtqz$q!hab|8sxuJ7OgX&Ke^Znvb1bCj$ zx7&_AF6D!>h1%OEAxUIR`3y*Tm5K4%$3G5X*N?*&3C5$n z*~ZSH;QuM!DPc;G7g1Jek18SV?d`8mi*n&$-|TXIp*hgstV3Uab8yFUV-_g7jb)8$ zcH$UqMF$(bjk%e=H#f?tQGw3C4PRK2Mg_Xw*{C2V=(-ve-YH#1mm3wzyVM~-+^dEU z33_#_cCNNkSb_7r==I(SIzDvM*M{#H(D)Lva%+Qk^lg)zZ10hNUBc_z-m|iS$>r>0 zR>4^YQe4J7?$F$l?`FQ~o8T`TgD)6iccea3A3HHUcB(#p@zSa3lZ~+xW0yuxojy5p z>Efvq)0O(A#?0wTqdIeR?HjZw!f6{8^~lzwAU3n}An9VT-p0O!)*GoBimc6R5gz16 z#fRGp9wfpcUm$Q0)SBkTVSXV!Ox2K*U=-wcb9-*u#3j+6P3-wg~L!vzZW<09u}C5F1FuYfuVim z!QI`@+zxjaM;0t)BRp}J95r2Pi!5a4z9X`D^md3Wj8-WMHsQV~)g8Nv0nN~Gtx^J; zT3V$x{v>ly1Y1v>!R4v9}!2flTySkirt6gZO%xs zi(!BNj`xwUzXTb-o5c9}z_nU?|NFuHKLcMS;JZu2ss%Z(sR`#hd^oF6>2{wyG^o@! zpb-s&Pd)y8Sc1=+8-^(%q}mXC#?!hr1Hr>Q35x z9F&KM!f3SB{Xw}ior!ysQy$RHP`B#aSdEt4H6K~lv~{=toUo+uO#_?LR@U$+RG_VY zbCQ5E8>IpB_bRQ)y$Ez@{@z#esx2iyT`36Oo~G^fmGd)|0+9B0XwqJ7569ViaPstn zlMi9e-pG(_jqC5LRE|$q1`u8E%lV=Js@tZYo0b|l>-k|}KUd2KO6&Q-nYoqv#rej} z@Or*)ae1b(Jn(wH0F&#V_pSzPy+=4&=_@w2-Y0;qcdl<}ZsmMqy7mv{;(Ff7E5&x6 zb;mOF5U@1Osbw6Eg3&$=Wg=KI&F9G`oLCxHTNJcMe+*DDj%f<~eOj+Y5Z)|*lm#(!IctyD3GX}W=uL?K1 zUEoD(mTZAnF>W0)y(GEK$n=VGu0^I-(QLad)9b1>O5!9g92nI`Yza9)?mxJcN*fB6 z18ISB;CNy>QAuQ>O|saLF15vuGRNqM9TlwUc2x>7Cpq_!$s8vu6Bh5LRc!DIWEdR+ zUTjpS&P~mva9M4-IOJbNCt64$8$S)FX9QM*=4qKBqpCUKrBJJNb{El>|lz_ zh*O-GBF^T9W=WDVFdJ`^WC#N6T>Ad9o64o{uPA%% zDF)dHD#`Wz5fq^39okfXd-NMgVm-2r8O8icE<+bRE<34AU;jFSDYb8j_T9*%S*5z4cT~HsM9SUe)Y}a9=Ypv0vXp(Y7kMEI3)a~dI z0arJ7GOm4$Twh1JLEK(MAd03Nl%VPs09RL*85e4ZAr*!uxqQ+k-{G?Jc4qx=Zj^S* ze3PJ|O}todPG6o7YI6PW+Wk?GptBCEwA&m9Sha%qrXx*aYu zo()x{k2KYJC4={+*8P>eHmp|L)2B4BUMu!rXJM3NOD#!0nxY0N8aUt zsH7e_?9S!6`I+U$0(OZ1Bc=i(l*wfWv*i+$=nac9c@a^GGO?g37f}brn{4jo?H1{6-kC}iTO;)?;(Eex#3+e?erEec_4Jw^yJgt zFL-=jxm>@pR9t&h|8(5Dz@{q=Pn%}@vSllc&%=2*|MRFkSenn1tpNyQH^;|GS$ogu zY~|HbN)eIU5}YSLHS?r>gfjvZoc}fzkoA7Q?QL)kL4QJou}tHPuILzCp=!J}cUUd5 zIJ8>IoQDO*D&h)psvlRRH{OEe9kS=N>WpH7WN~eh3W4mD=IdH7awh8~WwMZOp~MV8 zl~^S;$#?@bF_psv4{@L3oHZJFSVaS9GN+5}29MCyuRxdDNX8Y^3B3y3liE?Uy=7G1 zpe^8>xN=Lly@kAvAQVW@nnf4e+gl<}>$OO0mJ$@{%+oR?>e168ty!32JJy;UnXDCR z@FutGDft+2=2AWDQQ2{s>QdnZ?cf=TdeYjat<}9hV0)Dju8soxxrjc^Y~y+ zZ2ndrupc5Dv45QpZ_<&Cktl*pG=y#^C$N$x7_xF@F06fhZ`!hHIoCpFy zEf>J!7Z|>)gjw>v7tUYk1)<5(4#_Z)pBcUh^ILhajZ>8D-4?#BRkM>%=^~M$6stzm zyqQBjr71{Jn!e)mVtd-0rEaT3eA@eP82h_?Md<(zIfC|dzhS*~{2hgNzCN?fE81 z%IOh2IA6uG-ux|0>6Nl^-Z0qW!a$YgOaQj%VmsJE8n#?7v7%>m8EoMMu%n)kK3va6 z(bFP3a>A2(T#-omT|wppKT+xw;2yh4xdP1Q0RPEWqv*4u81B~b8Ix@C);g7>*K(c-ug*(~$+~XWD zdP1?l5d3xI1+?F=%O%mpU}y}lqcbM?V?xaVv7N5pkG#gW%RAF4E7MAbU&=_`f)r*# zZz>Z2c6AH7vftkluYaIE8>(9fI+3q#u?qjJMbs_SeBv!ow{Su_l(?f9752n%Non3u zwz$oJgpPNV2ojR@Zb*0{1`__Ryu)3FggEqb;TgR_`pDcpn{v9YE%ZAWcpg+#V>5h# zkrTSzc77IJYvpIjny7=HH7Pz@n^iSiT$Grfg?Ve#Uj^06{J@og%MR4P~5#v zWiNg(VfF&|c#JZYH`BSdYK|TcvfSC@Au`CW9*^}+K(IDyWAct!E_VeF$xo$ZH**YwO@6^o!=8q$X1y6 z1OJ;F_!hI51hdgLqq7%R&B(n9E@g& zJ*?$hh_!s1Ob9RGY$0z~i5JOmUsAv=r9`x86})|7i(cyIfp1kel61#3DDc)Qa4M-*Tv2z9Rir zdmRThzm<6Q8cy)AxX6EY@iTl$h9~ssW`YN1_@WFC=h1JAZXVQfP_4Em4^EyboB`iA zj$01)=#~R16Hw7D2isN40W|L|UGuIqhM?nMchGT=+s}0zP=W7ZU*LPFT0OoxKT<>r z-?-^up;?wq2R%aJ`|Egx@2`EOS4n)o9JC$0i)%Z0)z)_KQ_yzsu$K7#Z|{5UZ3hS- zR=8l^M6mHpe^r9u@bzCMPT=noJkI(E%8JP)8kv~cruEKlug8W{!RgF||pRBr70 zz9Qxjt{%wmTI*51S{;o`9ag{3PVU(@wDe4ctH^~?S@jaZYtWh~-~kLJ`RLnjt@$Jk&~wB_ej z4<4$F@wPv%GDcT1l`(1UEtN5;q~mqDGKQxF(FCio3bFe@9wfI9LL}F+50Y%$?R_Zi zRa$TY(W;IpKQ_R0Yp_YL1U3l;y^c4ZKGMmSy2Xf{J;xCBrZGSn2ln}<9kJG1M~)Yc zLpJFU^yC2D8Iq*)+HHtkRf*E?R?Rr5CP`5^+(@Mi5$Lhnv(R+4L*P^3c$9=DQ=4V= zrR!6hQKU%!x*(oSXW0{0a*#L{8%xKDW6?#Fm?c@37GhRS#tiKdvuq5@#KbJ4p2d_t z{b!~Rz(w98c5}%^-V+AYMc#WzJf}9xS+CD~=}4E91A80LHrB8eQ&sYhw0_>#a3zhqs2S zI*t^bp4J82yg)R6zD&du;!^Sc{7IoNg z^JBNH!v+;9$^2L&0YIHk03K4`n2ZfJr~>Xnta1K;uC@9D$q8}z12r+e+x`Ia1G$H- z`~fEHI0u4~9}zncR5V??27-QzbPgE@g5Gsj4(78#jl=^%OS18LT#9$YpEx(Of_do> zUo4{d;${E8#|t4_NibsGH(XNy;d&K9S91*tEpzCOQI&ell+-yuohkd9lr3M%Mx ziwnDU0d5oe&Oije0gdd?%x-9Ia9AbS0L&za&vYtg8_Mns>I@>UOo#JvKTq>vLA>7_?kLswmeKp@bp}9ct~8h3vw!Y zF316$J0Z)DCWV%B`J&Qv_pOHwbbreG-eiFaF8$cyK|pk~b9?DxyZ(Uy2?%pX#io?1 ze`hdvVzH@`>;+kRDfI}l6(exzImTnOYG0fjDU5*4Ie=}>L1A;~(w)fN)@KeY({nU`ETVNc zb=1_1xGv34dzELK`T0ff`_r2rN{0+Rg5Rj?(2*qQ&H+PWhQKI2ozB=FBj$I(5PV(8 z--b6vGuSfXIeta4L_heV7?5`$QbN z);bYK^e+368#fW>qw<*Ai`;Das>GVsSX-Bad1_nIHg;vicvxeUz6M=IiDUdwCa#U~ zBXxQljGsTY9G-z|_bk$jt=-dAOzplRY_Fwuf4@v!beY3oBsQ6voU*$aIM5kW;i%b| zdbq$@r{vCNqXk$dAK80?jJ@PyI<=YUkw&&8vGH-ZxvUluDu8Gt&#)%FwsInV<#z(Anxx-*jzz z@4&#pOH;WKpPJcMIdOccGC-M`+oT?}re+Fe<^i6WdBfL(z8VlSAK{3Zuh@v0pTK(1 zpLgg%<75x3RE1B?)wx3#hZR=!BEqC^C8l#{WUG?Cs3b&G`^yLqQK%PWN|WLt`Xl1- zkaV&xJoJ~+(RLdTp;8r>SHev_ty(;panolE;f8$9<@gsopiDU$^2u^nleL5ft|sfZ z%Uj;%CTsluIhW@95cPtET-@QpVKAfjV*Gem;77XHF61EiI)1X36LOFlPOme`79-i~ zO15C{%B2<5waEaSep$R)*g{6j=T|s_^=D<71gm1wt;WEqRkPRZ=}JrEjyNGl9HaR#J86opwHL`ni0UYkKQEtjd#M&%0yQyd3g2AHd&2vYGRd7yg$gIc zs-sK@62Mfq9wl9CKPEKnd=-u>%59su9gYd_OQnr{p=+)CQi<7@|CG6MJH?rGIs}e zLQ!)}$KL3%V4!W!jA~|yQ~8Q4cLHru)pP-EMcBQKfHsYlgQuH-%1lx{;oBip z=9oZRW_mh=v=hG_Ox7h4RYkobf2AMRyCmzQ(rs%OE@prvcz@`^gUf4D*naf3fWoLtmpa`5(gYM*M+i%-kt>81Xb-jNMnhO7EYn^HYjfD2^%91# zM#7nJ4uZYW3Fox*J{*CD1t%HYBYJT(hE&0Qmt#mQdr2+0vihO#+3LmtnI;&r?Rm5x^~4r~~)s@&gxV z&o0g{E)NYH{N}S~#tSFMF-auU?}CZp&$g%E_2tdf@A`s6zY8bjDL{(`Y_6m{UG2~v z5kL6;Lo~Kv`&TW9=8L_%*Yl<8dj=kB)L&?9Ti?KYLu-lP86!{3f%XVz z7I83@Zwxt@vUAelV44j#N-VE4dt;zIXCeYwA6kxqy)iQp@w&=#C{PcViFk%9p1+UH zL}*>*GGZfAH>htluBNnV|1mjM7y~;|!3>C_JOg4M_ap9C-8hx}G2vD#&;^peis%L$PudM=!|T88{aDzJgDM;A(c6uEE1M5h{w%F;&6W(sc^Wpb z@}HW~roS0d!l-YIHo}EZ-1xmoa>ChEoG}@Mn2Z35tNsN$8HBF12sjARgHHyTf`3j$ zMx?$^8sRMhELoOa8RTy>+oW z>6VJ14Zk)NY)9x_(UyLtB(Vj-w#zZ$aF)w2`hS}4o3PJbri(*ZtXAutQJvog?+tZL z)a5Jc%&z>3mvr_rQhua0dSO}O6c6btu4_V+^etTzH|0KbyK4fegwoPbc=NTCnNG{N zNfvV4n=PI{r{j5?2I8KqNvMsl-KemULrmv5#Pl$Wn1nd!BT5_;mHAn;>u2DS)FX)p za@He-8*W~>#(6ef}jR^W6y_hga>U}Uu`026-B5r9dE+aXcRJ?&$}X6QhNw}x#?Hq%PXq1&-v9CIluZ6)@8azb(wIt5$8Dk zXJd3mc20jD#k=$!2G3C8TWvg&#JlJHyUH{_JjLzW(@G->2`I9R_RKl;jFfiumQU8+ z|9*JK??!L=mhqO~2;cI7$Xiy~yczYJ@4?UcRsEceWCwkd=95fw2r7pL1}GRx5J-yg zNi@=dLX)_`oq!AK>Oi3@EgdK#_3P+B`EhAkwjk-?wCUL3awin{I(KUW?G3b3_>sls zS{wd&6D)4q9ViKdYhB~FHh*PK}#@%Mi@#DG+7q`tXPS@ur<`-w- z9Vq?Bm87$9aju-DON3a{l`E%9t(<9b{)pZftg^F!hhP3_GWZ*3Tj7Ig0dK$$+s$oAk2 zy$8F~Fss4;HF>IV3U0#~z76+@+dw@>tloogA1=Lzf0kyl%X$y|#L234khbBAIYZ_f z8(nE}C{&TvC^@H=hwO-oNLm`nIaF&=vn@L1h?6Q*VHG-e#P77iWU18(iv+sE3ae4_ z8A;~8_^>TaW~k6P4bTIq!<8I(n61&3msaiHCm$$008j8f`~;6kLIzpCm;QjG$~GT| z>67Bh90xvz|FxDoZdzz5MC83_@-g1>vfyKkwadr&4ev)1TIk|*z1f&uT)s9@t+Xab zxbc&_HEnIFz6^=P4vn9z!1&3Y;?U~AzO!>PMQ-+_YxLw-33cuFIfbK57(I!Cbk3}s z45Tfurzx%e>V%vJCY;O4_U+(yODfO-ZTXE7O5sz?C88ODOf(2|mmu$TrSK01DSSj5 za4?#6CfUx>r;9_bH|bRs=E=eJ{%Qw_WS4-$v8le7_8glHStoXESOAyn?g(Qp{gRX9(|<-B zxQIq*Dwm%Qq4MdtV}Zu;+%?u8YBS6WZvUiwksv*jrTz1UeLr63>I=72Y8!DHxb5)I zCd3^7ipb)3!4MEBBltFfIp}iNFf9=m`;>-N_~%;g0TXe&Am4L)lm^?)O+L78pX&RQ z`H!IO@1&T4fZP5sb%+2j?WJ0^zn|Pu*a0`TjN#fnGGZdDIO>o9X%_0x@5$ZjGIhv^ zcSh~??*#D+i>nlxhB!ZeiN80K! zQ^PRQ_JeAq?W=O6EiQ9zY8pr>NwU8266XtMm2bp__|0?F84JxQcA;P~xN`m|3_GKP zuC;P$1jIxNcTq0QN948ZGMA=QR-;tKZG%Co*l^s48V<)1stRHn!;$S2OWV}=uy0!g z6(|Va@i4X<`L*L>O9h65!E9^^i+dHy_GyUZYPh1S9Sv7vHkI#1L6! z%X2Sy*Ak`-ai*C|fhl7WJMV-nwe`lxLb#(h<{zaMX)hqRT{0seNA+IX8-si+%{9O! z^P@i1Kktx_B@fU_-jRt44b7OGG z_K*60P%2JpgODTy$i{(FGu*4}40qhO!GVsn{8E+L;rOL|W(V_2>D*78lye-ay6pDZ zVRWf&c34CvEjl|)NmjOJ0&G0B#EM2(d62@S;HIbU>dY8>j3MIB703PsGt$-w=AACPU}zsCL|RUs>l^Vx(K z=`dHCR_oB2AgfVkQ7sRd6mqDmky$iz)RJw}?KUUebVU9*jOFBmv?ogFT5F<2gvtoZ zMH3~epSL|MXT!M3n~rcH*Pe^kH^xr(q_;opa#pLuF6YQ7)u`5*>IrJkPT4?iV(}jf z5gX{nW>Ew0A8T@CoSvW%P8K@~;iAOhD1`r(jGo%tK-UFi2o1LiFSr z46@vr!4NDtR|Z24Q}eoTK?+NXb{Z31@1!wFoZzA{osvMI%QU7EDnUD@ z#bG9e_OR}JPqHRe?Af_sEi2Z}R*%Qj)2cn8i8rHFvr|v$kBFn5Rz>yDMLoSN?@X7e zr-l?d^+;)K4$URFY>t!|OSw>#Fc zi`#nWH?MNj~R#!cXZX*?x{ibzLl;jaTn)b{WU24mGi3%!WqeU}cKeh?U z@3u2vI2~9a*fhi^F&sU*)W*@1e0;Pk(H5ZJ+=N}Rfm)*^;L2WbQj|f!g(7a^)@+B3GU_U#PYX6$WnBNx+EqjsmHbt@s|c9uBINSh zilEQ#d(Z zr{W9PnseSp!NClgz1jGPiW6QD!RQ3w93aFH7I39d#7q8;0V#^(U z)=S#Bg=2fi#w3dE$$EEeFE+;&+rQ;@i0$K&u{gMPDL_#p7U&SEoMWg%gp#pSkd(cC zpP8ecmIh!8lCj7DP#q$aOr&0&IKeH}LdGtdTuS(GDT*sEYVX7qS6&L-6)tyjPL~Z= z;|GW2|EkoSJRDe zC&bTGo>G{Tb1rl8ur?<+<4yrb2v?GLWxC$!l_jmq<&{6wj#rLR$xPfhTq^knRl48( z`ysl8)}`EFE(e_H{Oj=b27KMj-`v1Wj?`*_E07k?%tqUr9O+MpX>t_S&(-88-HX@d zCP&OcrZ^=qfBLrR*w$UUNH(0Vgv5#2VA?{CEONz9$SueySL{n%*pgw%<%)6q$d$1o@7E=9L6rlY zo~j}eg)UF^7jlETT^mM9T#o%w&@!22J?+B;mhW}O|K^6lHs-S8_|fWLoP=#Gl|uyG zjJB0L&gCngP;JRb_@PQKe&A#@#&!_C$ZC{mjl6_q^gUUp5cP+ zY5PPrxfF)FqPV!mJ+Na6 z)eJ~{J5g!XK2!T#;d79K_%*M$xCi1#G5-L@AY5JT&p`=$1j_7J>T?TEg6iard|z{} zIo}xAaX}10xUjf1H|^yv)b1EootOPPE61DOzMf;v+CG?2c3s~ge9X9QAMCA1526_ku-$ej)*Yj zf`og)4UVH+(3KX-g$NQIlnXU;r^}QJo@zQ8rJABbBnNra(>JpXNrL{2%$XPfhEot3 zi|5gD2Zfn)We4w* z-mKf%!R>wtVy>|=A%yo@wbv)l7tX^eJ?Zt{QO)K0rYjSb$^az&r>mgDJvG=nI#C(* z2K$C&O~SjU=Tvd6r_@tDvDRD4RmFddiT@b)O1Z)7wVtuzwVq<`j8|O!7H=VUdM$S- zU!6GV-L)T(;?gzm((>Y!iOQL6P;6Leyy%IKFmbBn{d8{0`@Y->@8iS6sy^XWCQf^M zazm@-o{7rT2VX1I;H#%v@n+ZH+K!6fc+xA4^e-M4ztIr7HS`i)`!uwz(4 zoTLa{YLgU^U8oL8kr(9EY)?^UA%T^t1>XXkfKoR#Ip}5lwJ8l_J^!b*^&A3CPhb*PDyWEBg4bX@Q?p4UPn3 tBQ9-jKv*X>BCA~pSd8#$=i3Twgbs!@>~EA#jr_~QfBzFt{~vphLYDvl diff --git a/src/messaging/data.js b/src/messaging/data.js index dcb77bc..129ec4d 100644 --- a/src/messaging/data.js +++ b/src/messaging/data.js @@ -59,19 +59,24 @@ module.exports = function (Messaging) { messages = await user.blocks.filter(uid, 'fromuid', messages); const users = await user.getUsersFields( messages.map(msg => msg && msg.fromuid), - ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'groupTitle'] + ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'groupTitle', 'groupTitleArray'] ); messages.forEach((message, index) => { - message.fromUser = users[index]; - message.fromUser.banned = !!message.fromUser.banned; - message.fromUser.deleted = message.fromuid !== message.fromUser.uid && message.fromUser.uid === 0; - - const self = message.fromuid === parseInt(uid, 10); - message.self = self ? 1 : 0; + message.fromUser = users[index]; + message.fromUser.banned = !!message.fromUser.banned; + message.fromUser.deleted = message.fromuid !== message.fromUser.uid && message.fromUser.uid === 0; + + if (message.fromUser.groupTitleArray && message.fromUser.groupTitleArray.length > 0) { + let rawTitle = message.fromUser.groupTitleArray[0]; + let cleanTitle = rawTitle.replace(/"/g, ''); + message.fromUser.groupTitle = cleanTitle.charAt(0).toUpperCase() + cleanTitle.slice(1); + } - message.newSet = false; - message.roomId = String(message.roomId || roomId); + const self = message.fromuid === parseInt(uid, 10); + message.self = self ? 1 : 0; + message.newSet = false; + message.roomId = String(message.roomId || roomId); }); await parseMessages(messages, uid, roomId, isNew); From 7c1ad3058f0de64e036997d483c93f16f2317d4d Mon Sep 17 00:00:00 2001 From: Eric's PC Date: Mon, 24 Feb 2025 00:30:17 -0500 Subject: [PATCH 07/27] Users can display up to 3 groujp titles by hiding or displaying the corresponding badges in their profile. --- src/messaging/data.js | 9 +++++++++ src/views/partials/chats/message.tpl | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/messaging/data.js b/src/messaging/data.js index dcb77bc..fd5c443 100644 --- a/src/messaging/data.js +++ b/src/messaging/data.js @@ -66,6 +66,15 @@ module.exports = function (Messaging) { message.fromUser = users[index]; message.fromUser.banned = !!message.fromUser.banned; message.fromUser.deleted = message.fromuid !== message.fromUser.uid && message.fromUser.uid === 0; + message.groupTitle = ''; + if (message.fromUser.groupTitle && message.fromUser.groupTitle.length > 0 && message.fromUser.groupTitleArray[0] !== undefined) { + let rawTitles = message.fromUser.groupTitleArray.slice(0, 3); + let cleanTitles = rawTitles.map(title => { + let formattedTitle = title.replace(/"/g, ''); + return formattedTitle.charAt(0).toUpperCase() + formattedTitle.slice(1); + }); + message.groupTitle = cleanTitles.join(', '); + } const self = message.fromuid === parseInt(uid, 10); message.self = self ? 1 : 0; diff --git a/src/views/partials/chats/message.tpl b/src/views/partials/chats/message.tpl index 3f80116..257318f 100644 --- a/src/views/partials/chats/message.tpl +++ b/src/views/partials/chats/message.tpl @@ -7,8 +7,8 @@ - {{{ if privileges.isAdminOrMod}}} + {{{ if privileges.isAdminOrMod }}}
Admin
{{{ end }}}
diff --git a/public/openapi/components/schemas/PostObject.yaml b/public/openapi/components/schemas/PostObject.yaml index ea91579..0b8278f 100644 --- a/public/openapi/components/schemas/PostObject.yaml +++ b/public/openapi/components/schemas/PostObject.yaml @@ -37,6 +37,9 @@ PostObject: displayname: type: string description: This is either username or fullname depending on forum and user settings + adminrole: + type: string + description: This checks whether the poster is an admin or not userslug: type: string description: An URL-safe variant of the username (i.e. lower-cased, spaces diff --git a/public/openapi/components/schemas/TopicObject.yaml b/public/openapi/components/schemas/TopicObject.yaml index ee34558..d205e6f 100644 --- a/public/openapi/components/schemas/TopicObject.yaml +++ b/public/openapi/components/schemas/TopicObject.yaml @@ -47,6 +47,9 @@ TopicObject: type: string description: An URL-safe variant of the username (i.e. lower-cased, spaces removed, etc.) + adminrole: + type: string + description: This checks whether the poster is an admin or not reputation: type: number postcount: @@ -87,6 +90,7 @@ TopicObject: - status - icon:text - icon:bgColor + - adminrole - banned_until_readable teaser: type: object @@ -101,6 +105,8 @@ TopicObject: tid: type: number description: A topic identifier + adminrole: + type: string content: type: string timestampISO: @@ -178,6 +184,8 @@ TopicObject: description: A topic identifier thumb: type: string + adminrole: + type: string pinExpiry: type: number description: A UNIX timestamp indicating when a pinned topic will no longer be pinned (i.e. the pin has expired) @@ -199,6 +207,8 @@ TopicObjectSlim: uid: type: number description: A user identifier + adminrole: + type: string cid: type: number description: A category identifier diff --git a/public/openapi/components/schemas/admin/tokenObject.yaml b/public/openapi/components/schemas/admin/tokenObject.yaml index fab6c26..c45749d 100644 --- a/public/openapi/components/schemas/admin/tokenObject.yaml +++ b/public/openapi/components/schemas/admin/tokenObject.yaml @@ -4,6 +4,9 @@ TokenObject: uid: type: number description: A valid user id + adminrole: + type: string + description: This checks whether the poster is an admin or not description: type: string description: Optional descriptor to differentiate tokens. diff --git a/src/api/users.js b/src/api/users.js index c4f4add..d0e4cf2 100644 --- a/src/api/users.js +++ b/src/api/users.js @@ -180,7 +180,7 @@ usersAPI.follow = async function (caller, data) { toUid: data.uid, }); - const userData = await user.getUserFields(caller.uid, ['username', 'userslug']); + const userData = await user.getUserFields(caller.uid, ['username', 'userslug','adminrole']); const { displayname } = userData; const notifObj = await notifications.create({ diff --git a/src/categories/topics.js b/src/categories/topics.js index 12a009e..9b8b858 100644 --- a/src/categories/topics.js +++ b/src/categories/topics.js @@ -16,6 +16,26 @@ module.exports = function (Categories) { const tids = await Categories.getTopicIds(results); let topicsData = await topics.getTopicsByTids(tids, data.uid); topicsData = await user.blocks.filter(data.uid, topicsData); + + const adminRole = await Promise.all( + topicsData.map(async (topic) => { + const isAdmin = await user.isAdministrator(topic.uid); + if (isAdmin) { + return 'Admin'; + } else{ + return 'user'; + } + }) + ); + + topicsData.forEach((topic, index) => { + if (adminRole[index] == 'Admin'){ + topic.adminrole = 'Admin' + } + else{ + topic.adminrole = 'User' + } + }); if (!topicsData.length) { return { topics: [], uid: data.uid }; } diff --git a/src/controllers/user.js b/src/controllers/user.js index 6c924ac..8b925cb 100644 --- a/src/controllers/user.js +++ b/src/controllers/user.js @@ -12,7 +12,16 @@ userController.getCurrentUser = async function (req, res) { } const userslug = await user.getUserField(req.uid, 'userslug'); const userData = await accountHelpers.getUserDataByUserSlug(userslug, req.uid, req.query); + const isAdmin = await user.isAdministrator(req.uid); + let role = 'None' + if (isAdmin){ + role = 'Admin'; + } + else{ + role = 'User'; + } res.json(userData); + userData.adminrole = role; }; userController.getUserByUID = async function (req, res, next) { diff --git a/src/topics/posts.js b/src/topics/posts.js index 73eb29b..db4aa68 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -1,4 +1,4 @@ - + 'use strict'; const _ = require('lodash'); @@ -139,11 +139,16 @@ module.exports = function (Topics) { postObj.votes = postObj.votes || 0; postObj.replies = replies[i]; postObj.selfPost = parseInt(uid, 10) > 0 && parseInt(uid, 10) === postObj.uid; - + const isAdmin = user.isAdministrator(postObj.user); + postObj.user.adminrole = 'User'; + if (isAdmin){ + postObj.user.adminrole = 'Admin'; + } // Username override for guests, if enabled if (meta.config.allowGuestHandles && postObj.uid === 0 && postObj.handle) { postObj.user.username = validator.escape(String(postObj.handle)); postObj.user.displayname = postObj.user.username; + postObj.user.adminrole = 'Guest'; } } }); diff --git a/src/views/partials/data/category.tpl b/src/views/partials/data/category.tpl index 3de7588..9b68a7a 100644 --- a/src/views/partials/data/category.tpl +++ b/src/views/partials/data/category.tpl @@ -1 +1,10 @@ -data-tid="{topics.tid}" data-index="{topics.index}" data-cid="{topics.cid}" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem" \ No newline at end of file +
+ + {topics.adminrole} + \ No newline at end of file From 6df986fa32a226df6696139203453b29d8d23317 Mon Sep 17 00:00:00 2001 From: Justin Zou Date: Mon, 24 Feb 2025 20:39:51 -0500 Subject: [PATCH 10/27] changed it so the star isn't showing up based on the account you are logged in as anymore --- nodebb-theme-harmony/templates/partials/topic/post.tpl | 4 +++- public/openapi/components/schemas/PostObject.yaml | 3 --- public/openapi/read/topic/topic_id.yaml | 2 ++ src/topics/posts.js | 6 ++++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/nodebb-theme-harmony/templates/partials/topic/post.tpl b/nodebb-theme-harmony/templates/partials/topic/post.tpl index 2a1a9d1..bb035b8 100644 --- a/nodebb-theme-harmony/templates/partials/topic/post.tpl +++ b/nodebb-theme-harmony/templates/partials/topic/post.tpl @@ -13,8 +13,10 @@ [[global:{posts.user.status}]]
- {{{ if privileges.isAdminOrMod }}} + {{{ if posts.user.adminrole }}}
Admin
+ {{{ else }}} +

Admin role does not exist.

{{{ end }}}
{{{ if posts.user.adminrole }}}
Admin
- {{{ else }}} -

Admin role does not exist.

{{{ end }}}
{{{ if posts.user.adminrole }}} -
Admin
+
{{{ end }}}
{buildAvatar(messages.fromUser, "18px", true, "not-responsive")} {messages.fromUser.displayname} - {{{ if messages.fromUser.groupTitle }}} - ({messages.fromUser.groupTitle}) + {{{ if messages.groupTitle }}} + ({messages.groupTitle}) {{{ end }}} ({messages.fromUser.status}) {{{ if messages.fromUser.banned }}} From 94fce225e765c81f3e765db6a56a702dcfe48b92 Mon Sep 17 00:00:00 2001 From: Eric's PC Date: Mon, 24 Feb 2025 08:35:00 -0500 Subject: [PATCH 08/27] Resolve linting problems --- src/messaging/data.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/messaging/data.js b/src/messaging/data.js index fd5c443..1bcb6b0 100644 --- a/src/messaging/data.js +++ b/src/messaging/data.js @@ -67,10 +67,11 @@ module.exports = function (Messaging) { message.fromUser.banned = !!message.fromUser.banned; message.fromUser.deleted = message.fromuid !== message.fromUser.uid && message.fromUser.uid === 0; message.groupTitle = ''; - if (message.fromUser.groupTitle && message.fromUser.groupTitle.length > 0 && message.fromUser.groupTitleArray[0] !== undefined) { - let rawTitles = message.fromUser.groupTitleArray.slice(0, 3); - let cleanTitles = rawTitles.map(title => { - let formattedTitle = title.replace(/"/g, ''); + if (message.fromUser.groupTitle && message.fromUser.groupTitle.length > 0 && + message.fromUser.groupTitleArray[0] !== undefined) { + const rawTitles = message.fromUser.groupTitleArray.slice(0, 3); + const cleanTitles = rawTitles.map((title) => { + const formattedTitle = title.replace(/"/g, ''); return formattedTitle.charAt(0).toUpperCase() + formattedTitle.slice(1); }); message.groupTitle = cleanTitles.join(', '); From 66c68eca048e9369c01de47dd21d285c5ef4adfa Mon Sep 17 00:00:00 2001 From: Justin Zou Date: Mon, 24 Feb 2025 19:31:59 -0500 Subject: [PATCH 09/27] made it so you can see from the discussion board who is a user and who is an admin --- .../templates/partials/topic/post.tpl | 2 +- .../components/schemas/PostObject.yaml | 3 +++ .../components/schemas/TopicObject.yaml | 10 ++++++++++ .../components/schemas/admin/tokenObject.yaml | 3 +++ src/api/users.js | 2 +- src/categories/topics.js | 20 +++++++++++++++++++ src/controllers/user.js | 9 +++++++++ src/topics/posts.js | 9 +++++++-- src/views/partials/data/category.tpl | 11 +++++++++- 9 files changed, 64 insertions(+), 5 deletions(-) diff --git a/nodebb-theme-harmony/templates/partials/topic/post.tpl b/nodebb-theme-harmony/templates/partials/topic/post.tpl index 8487537..2a1a9d1 100644 --- a/nodebb-theme-harmony/templates/partials/topic/post.tpl +++ b/nodebb-theme-harmony/templates/partials/topic/post.tpl @@ -13,7 +13,7 @@ [[global:{posts.user.status}]]