From 8a11344a383ec42d8c0b349877b91567670eaadd Mon Sep 17 00:00:00 2001 From: MiraiMagician <158348508@qq.com> Date: Sun, 6 Jun 2021 11:38:40 +0800 Subject: [PATCH] =?UTF-8?q?=E7=82=B9=E8=B5=9E=E6=90=9C=E8=97=8F/=E6=94=B6?= =?UTF-8?q?=E8=97=8F=E5=A4=B9=E5=8A=9F=E8=83=BD=E5=89=8D=E7=AB=AF=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 33 +-- src/App.vue | 31 +- src/api/auth/auth.js | 33 +-- src/api/comment.js | 19 ++ src/api/like.js | 34 +++ src/api/post.js | 51 +++- src/api/tip.js | 4 +- src/api/user.js | 28 ++ src/assets/app.css | 190 ++++++++++++ src/assets/image/logo-2.png | Bin 11688 -> 18401 bytes src/assets/logo.png | Bin 11688 -> 18401 bytes .../BackTop => component}/BackTop.vue | 11 +- src/component/Comment/Comment.vue | 56 ++++ src/component/Comment/CommentForm.vue | 77 +++++ src/component/Comment/CommentItem.vue | 33 +++ .../Layout/Footer.vue | 33 ++- .../Layout/Header.vue | 27 +- src/component/Pagination.vue | 101 +++++++ src/i18n/index.js | 10 + src/i18n/lang/en.js | 115 ++++++++ src/i18n/lang/index.js | 7 + src/i18n/lang/zh.js | 115 ++++++++ src/main.js | 15 +- src/permission.js | 50 ++-- src/router/index.js | 195 +++++-------- src/store/getters.js | 2 +- src/store/index.js | 2 +- src/store/{modules => module}/user.js | 53 ++-- src/util/auth.js | 10 +- src/util/get-page-title.js | 3 +- src/util/scroll-to.js | 58 ++++ src/view/Home.vue | 55 ++-- src/view/auth/Login.vue | 66 ++--- src/view/auth/Register.vue | 266 ++++++++--------- src/view/card/LoginWelcome.vue | 16 +- src/view/card/Promotion.vue | 7 +- src/view/card/Tip.vue | 22 +- src/view/error/404.vue | 10 +- src/view/post/Author.vue | 91 ++++++ src/view/post/Create.vue | 149 ++++++++++ src/view/post/Detail.vue | 205 +++++++++++++ src/view/post/Edit.vue | 129 +++++++++ src/view/post/Index.vue | 270 ++++++++++++++++-- src/view/user/Profile.vue | 135 +++++++++ src/view/user/Setting.vue | 118 ++++++++ 45 files changed, 2416 insertions(+), 519 deletions(-) create mode 100644 src/api/comment.js create mode 100644 src/api/like.js create mode 100644 src/api/user.js create mode 100644 src/assets/app.css rename src/{components/BackTop => component}/BackTop.vue (82%) create mode 100644 src/component/Comment/Comment.vue create mode 100644 src/component/Comment/CommentForm.vue create mode 100644 src/component/Comment/CommentItem.vue rename src/{components => component}/Layout/Footer.vue (58%) rename src/{components => component}/Layout/Header.vue (85%) create mode 100644 src/component/Pagination.vue create mode 100644 src/i18n/index.js create mode 100644 src/i18n/lang/en.js create mode 100644 src/i18n/lang/index.js create mode 100644 src/i18n/lang/zh.js rename src/store/{modules => module}/user.js (71%) create mode 100644 src/util/scroll-to.js create mode 100644 src/view/post/Author.vue create mode 100644 src/view/post/Create.vue create mode 100644 src/view/post/Detail.vue create mode 100644 src/view/post/Edit.vue create mode 100644 src/view/user/Profile.vue create mode 100644 src/view/user/Setting.vue diff --git a/package.json b/package.json index aaa0b05..b36761c 100644 --- a/package.json +++ b/package.json @@ -9,44 +9,25 @@ }, "dependencies": { "axios": "^0.21.1", - "buefy": "^0.9.5", + "buefy": "^0.9.7", "bulma": "^0.9.2", "core-js": "^3.6.5", "darkreader": "^4.9.31", + "date-fns": "^2.21.1", "dayjs": "^1.10.4", "element-ui": "^2.15.1", + "font-awesome": "^4.7.0", "js-cookie": "^2.2.1", "nprogress": "^0.2.0", + "vditor": "^3.8.5", "vue": "^2.6.11", + "vue-i18n": "^8.24.4", "vue-router": "^3.5.1", "vuex": "^3.6.2" }, "devDependencies": { "@vue/cli-plugin-babel": "~4.5.0", - "@vue/cli-plugin-eslint": "~4.5.0", - "@vue/cli-service": "~4.5.0", - "babel-eslint": "^10.1.0", - "eslint": "^6.7.2", - "eslint-plugin-vue": "^6.2.2", + "@vue/cli-service": "^3.0.5", "vue-template-compiler": "^2.6.11" - }, - "eslintConfig": { - "root": true, - "env": { - "node": true - }, - "extends": [ - "plugin:vue/essential", - "eslint:recommended" - ], - "parserOptions": { - "parser": "babel-eslint" - }, - "rules": {} - }, - "browserslist": [ - "> 1%", - "last 2 versions", - "not dead" - ] + } } diff --git a/src/App.vue b/src/App.vue index d1909a0..549d659 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,27 +1,32 @@ diff --git a/src/api/auth/auth.js b/src/api/auth/auth.js index 4df1758..301ea53 100644 --- a/src/api/auth/auth.js +++ b/src/api/auth/auth.js @@ -1,27 +1,20 @@ import request from '@/util/request' -// export function userRegister(userDTO) { -// return request({ -// url: '/ums/user/register', -// method: 'post', -// data: userDTO -// }) -// } - -export function userRegister(RegisterDto) { - return request({ - url: '/user/register', - method: 'post', - data : RegisterDto - }) +export function register(registerDto) { + return request({ + url: '/user/register', + method: 'post', + data: registerDto + }) } + export function login(loginDto) { - return request({ - url: '/user/login', - method: 'post', - data : loginDto - }) - } + return request({ + url: '/user/login', + method: 'post', + data: loginDto + }) +} export function getUserInfo() { return request({ diff --git a/src/api/comment.js b/src/api/comment.js new file mode 100644 index 0000000..05f70f8 --- /dev/null +++ b/src/api/comment.js @@ -0,0 +1,19 @@ +import request from '@/util/request' + +export function fetchCommentByTopicId(topic_Id){ + return request({ + url: '/comment/get_comments', + methods: 'get', + params: { + topicid: topic_Id + } + }) +} + +export function pushComment(data){ + return request({ + url: '/comment/add_comment', + method: 'post', + data: data + }) +} \ No newline at end of file diff --git a/src/api/like.js b/src/api/like.js new file mode 100644 index 0000000..e611eec --- /dev/null +++ b/src/api/like.js @@ -0,0 +1,34 @@ +import request from '@/util/request' + +// 关注 +export function like(id) { + return request(({ + url: `/post/like`, + method: 'get', + params: { + topic_id: id + } + })) +} + +// 关注 +export function unLike(id) { + return request(({ + url: `/post/unlike`, + method: 'get', + params: { + topic_id: id + } + })) +} + +// 验证是否关注 +export function hasLiked(id) { + return request(({ + url: `/post/hasliked`, + method: 'get', + params: { + topic_id: id + } + })) +} \ No newline at end of file diff --git a/src/api/post.js b/src/api/post.js index 0e6da9a..1af27ff 100644 --- a/src/api/post.js +++ b/src/api/post.js @@ -1,9 +1,50 @@ import request from '@/util/request' -export function getList(pageNo,size,tab){ +export function getList(pageNo, size, tab, userid) { return request(({ - url:'/post/list', - method:'get', - params:{pageNo:pageNo,size:size,tab:tab} + url: '/post/list', + method: 'get', + params: { + pageNo: pageNo, + size: size, + tab: tab, + userid:userid + } })) -} \ No newline at end of file +} + +export function createPost(post) { + return request({ + url: '/post/create', + method: 'post', + data: post + }) +} + +export function deletePost(id) { + return request({ + url: '/post/delete', + method: 'delete', + params: { + id: id + } + }) +} + +export function getPost(id) { + return request({ + url: '/post', + method: 'get', + params: { + id: id + } + }) +} + +export function updatePost(post) { + return request({ + url: '/post/update', + method: 'put', + data: post + }) + } \ No newline at end of file diff --git a/src/api/tip.js b/src/api/tip.js index 8a83600..fe38154 100644 --- a/src/api/tip.js +++ b/src/api/tip.js @@ -1,8 +1,8 @@ import request from '@/util/request' -export function getTodayTip() { +export function getTip(){ return request({ - url: '/tip/today', + url: '/tip/random', method: 'get' }) } \ No newline at end of file diff --git a/src/api/user.js b/src/api/user.js new file mode 100644 index 0000000..dd9884f --- /dev/null +++ b/src/api/user.js @@ -0,0 +1,28 @@ +import request from '@/util/request' + +// 用户主页 +export function getInfoByName(username, page, size) { + return request({ + url: '/user/' + username, + method: 'get', + params: { + pageNo: page, + size: size + } + }) + } + // 用户主页 + export function getInfo() { + return request({ + url: '/user/info', + method: 'get' + }) + } +//更新 +export function update(user){ + return request({ + url: '/user/update', + method: 'post', + data: user + }) +} \ No newline at end of file diff --git a/src/assets/app.css b/src/assets/app.css new file mode 100644 index 0000000..eb0e3ac --- /dev/null +++ b/src/assets/app.css @@ -0,0 +1,190 @@ +* { + margin: 0; + padding: 0; +} + +body, +html { + background-color: #F0F8FF; + color: black; + width: 100%; + font-size: 14px; + letter-spacing: 0.03em; + font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, + Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, WenQuanYi Micro Hei, + sans-serif, Apple Color Emoji, Segoe UI Emoji, Noto Color Emoji, + Segoe UI Symbol, Android Emoji, EmojiSymbols; +} + +/*背景图*/ +/*body { + background-image: url('./../assets/image/Leimu.png'); + background-repeat:no-repeat; + background-position:center; + }*/ + +@media (min-width: 768px) { + .container { + width: 760px; + } +} + +@media (min-width: 992px) { + .container { + width: 980px; + } +} + +@media (min-width: 1200px) { + .container { + width: 1080px; + } +} + +/*滚动条*/ +::-webkit-scrollbar { + width: 10px; + height: 10px; + /**/ +} + +::-webkit-scrollbar-track { + background: rgb(239, 239, 239); + border-radius: 2px; +} + +::-webkit-scrollbar-thumb { + background: #bfbfbf; + border-radius: 10px; +} + +::-webkit-scrollbar-corner { + background: #179a16; +} + +.header { + position: fixed; + z-index: 89; + top: 0; + width: 100%; + min-width: 1032px; + background: #fff; + box-shadow: 0 1px 0px rgba(26, 26, 26, 0.1); + height: 53px; + font-size: 16px; +} + +a { + color: #1d1d1d; + text-decoration: none; +} + +a:hover { + color: #f60; + text-decoration: none !important; +} + +.shadow-1 { + box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), + 0 0 0 1px rgba(10, 10, 10, 0.02); +} + +.navbar-dropdown { + font-size: 15px; +} + +/*统一卡片样式*/ +.el-card { + /*border-radius: 3px !important;*/ + margin-bottom: 16px; + /*border: none;*/ +} + +.my-card { + cursor: pointer; + transition: all 0.1s ease-in-out; + position: relative; + overflow: hidden; +} + +.my-card:hover { + transform: scale(1.03); +} + +::selection { + text-shadow: none; + background: rgba(67, 135, 244, 0.56); +} + +/* 搜索框 */ +.search-bar input { + border: none; + box-shadow: none; +} + +/*按钮居中*/ +.button-center { + display: block; + margin: 0 auto; +} + +.ellipsis { + display: block; + display: -webkit-box; + margin: 0 auto; + line-height: 1.4; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +} + +.is-ellipsis-1 { + -webkit-line-clamp: 1; +} + +.is-ellipsis-2 { + -webkit-line-clamp: 2; +} + +.is-ellipsis-3 { + -webkit-line-clamp: 3; +} + +.vditor { + border: 1px solid #DCDFE6 !important; + border-radius: 4px !important; +} + +.vditor-reset { + font-size: 14px !important; +} + +.like{ + color: rgb(64, 158, 255); + background: rgb(205, 228, 255); + height: 30px; + width: 110px; + border-radius: 15px; + border:1px; + } + +.like:hover +{ + color: rgb(255, 255, 255); + background: rgb(64, 158, 255); +} + +.liked{ + color: rgb(255, 255, 255); + background: rgb(64, 158, 255); + height: 30px; + width: 110px; + border-radius: 15px; + border:1px; + } + +.liked:hover +{ + color: rgb(255, 255, 255); + background: rgb(0, 128, 255); +} \ No newline at end of file diff --git a/src/assets/image/logo-2.png b/src/assets/image/logo-2.png index f9f01a31bc1a5a7e5471472913661b59f43e2c41..c2e7bcd64593ac6cb9dc1ed484a5a4b9a6b4ea5c 100644 GIT binary patch literal 18401 zcmeIadHUHFQZgL+1eB5*5&3g`>L^B4+pdU9I-kT%246|TNH6KvVs(CsYqL$1C^jJHak zl{}Te{2>=B2R3$3J56}+j+?!{xqY+yc72XnX@c^aROeg!dHm{F=9f>_z<)M%_~iHM z*)v`=k>}5zeR+rb?AdqR|GoX+IQ%aN{%_K%!y;&@*EGdmiieI6fV<4EoSu3+Z+Ae^orE%5BkNo5v=U$Q~pO=pn2F4@(n zEGan;w2r+-Fg}FJ`ZN%-Stc()%O`MG>STlNhT@p7^$xeD(`EIiz5$6eY5c*K?FzAW zOB~AgiWNPAwuAoYCe}|;QD^cU2w#_s0i@0EuS~pk0%Ves^>*-QE?8j}%AcC7PmcKu z;>n}24FfA1d-)Yl41_?M3Nmj=4ertgUVm-mYc&p|%TbF7h&TN95_u@CiVOc26tF(5?28MD@xV^O+3UReuWVWG=36GSC z44LHOfJ?F)?dfQXIYg?e-x;H}~YRPavMsQHQ~A(&0Bfo^VW$3^(8h7@j+f3DnhgX|XL(*@cqyqfvOMU#6< z855U&4LA2Dv=ma7m>{20fmtu@wxtZWn_0z}mb`F-xY-oijNs3fqgIFeWo?}PU#wFT zKX+-vr1(?Zs$Tm02eHAy?JSKwEq+^1-H7PQrJcRXmq8axGyDl|v*Bfgs(-Zib*gQ@ zu5_ZkM#H}fJqzhVmUpyTS=&K6W!QO%qKGlP45?#$YR+mlFE~c@Rcw@53B~S#tfF>j9N#FonwN;LR)u!E_ko`>3Co@{yr2-wUyp$ zKj}@_tYy5&^fV<1#$oi&HdG_R$J^=>&vEY5vR#KG11NvxIY9 zot6G^t;g=DdV8rd#ii<6{o3E3Dl~k3ZlpA;ua?;K2^!GEgZFMNM`Ghh?|_%SsxNH%y=9jAC$)- z)Q!9)Wk>Zz(Rlbr;eLujLlnShR+uaJp$w7JYAVv&5_d>kF7eY6Yp{pO4ta3+2Nb@f zwo|+&nkoo3aqK{_`J8FvpK5)XRYWu5+{+_g%2E%f@zatRuZ#3kRX}e?{MCG-dFj=qxn} zf6vOtYLPaXal!L&R!iL+9s=ZxE>DQhy^hpaK!0J)4d#}YsoG{=Gm)pGzT2<+<_di~ z%%!T$u7=d`Z?EE_=+7jv?9P<9Tlf!Lo!;UyZhz)fy2LR!%ccko508y1ms<@Xw>5oS z>YQTD5@iXVBa>FWSKWK?kRjO_T818#Zueww@5)a&6_x3W8(FwOua0(bsj+I1Rj}~$ zgqqx%FIzt+C~$rd?yQuR;jR7QH1i#i)Z!tH+E=pQkhR$4&!hh!a8FRQskoPwMM)4V+d%iM;ly3$MW z>BrSUZcEV-LoCUjRk6!!;t(Y*A$T@iT&z~~-sebwCykB+BCH9|xiCq3`^0dY8qby0 zo4A1(kowu&5_F&GYTL@YH)lg-faPT<(NAj^cWdZ#F{w2S+6;76BN-Zn>F2>NUZbg> zEse!2`hm6ST;QCA!#w z#)SFH+Us8_VtAK8v)(6OEupUHqhZ9h=?C9>7ruHx`wo^#(RuXRRQ+NtR>nKZ>LfCNU1ujK5k9+f$XC_w zgealPAoA2QTHQbyjJPz^mPfbVcj479ijWuu0*Qmg>l%TLTP`Bj`sEyhhH;L#Orcdf~)4eh~1^c#MG%AtK`=&Bah|N4}ad6eMQzgb)|B(q`yGPp5@J(?r;QV;j zSyo0N>ym0r>*AOZ8^T&1L#6R%UJ9Rvtg~i8)d9iDi$1iMf7ltcMw1v6hqBdDkZ^xn zF~9VhzLo9L@Hw1r%tpiWHn8`8-R+UE6x4EaEgbADhYHN5ucz_~?C};~9<_O#kCh;~ zw5RAjv_;#+*0kwTXKa(*-yd1i*kp4jEw8%}1r&KLTuZSYwbvk0ZN{`C)plN(m1tm8 z_K{<%Z0QsIYzQM$QCzB8?`g)zg6Dgwq^*DM29Px0igX_O^1szsq9hlJU`jX`J1~W? zJkG`1FR~!SijXhqQ&nZswS;yPc&t7@BFi)SxspN-I09rQN?P)QX+Xe(Z5OD$q1i;6 zp-o;k!2e06m&=KM^S3&)!(~`^Vm*pSd{v)dn&(425$v~zm(}&(S6Ysa9)3Q~P1=gt z;b|=ks@3+c!p_Wmh;+x@>N7Ys*~50!!(FSi#lx{thoGIJZuQ^2aJ{y~<3FXXEqOj5 zm?Z8utUtmreGqj?Fl(#&2BHi$gI7tWJ=b%S8z_6#D2LfOvb}Z4yT`kxp1$T{x#D*m)sx?npS$GV)B1i-y-C zO~~gx=DVGh)kc>}p|ZdA$NEnA@p5r@?0tvKbH)lR3-;e|c4=HVL5wP@M@cynV3uxhO*NoDt>CFYNaP#@hz6T;DeDoi}rx z_B);guc*wsXvFV_);7s8f{oKm1M%bPxE9jpE6#%iD$*be=<}$ zJ-(-e&g0pTv3MuccMeBG4pkmqMksn9;KKTX=J8S`e|GkV!p1`s6Dn~GHovNqz;bV^ zspeXDzef#-DsY`UA)Y+hjCU<-h;pnvWOxOSm|M_&$=wg1r)J^97uv!=l>=UB)Svfo zB4C8jMLMCt2+6tCiaBte_ND$wQ9+XLyL)66&TqohE&GU}mv_I(M5=ny%5AHN3B80F zh{Q31Z-9)RiJY_9*%?%pG=|Ada^NN55wao*Gn=mz3hq2#bvI~x`9XzS>qiO7xg~2~ zBUkao{-IDKYdy)zMBq^rdiTM@DHf0TMsV9Zaq6Z=!s|<>WvynkoDYH>n8QjTy3@;7 zf;(!DCx^c>s)f#0UaqHk-|$9#aUU=_DC1dZ)U$Cjxap$cX;kejPFkwEl6CjeTDNFYc%clKhBt?cG3bTyESf z;?W*nkTc((gUoL}$j$*<*kQP;_ZqI>*^eNj`#w| zt{X4zgL8&KUr{A-ht2OIlZ|C~8%p!i%+R-g!P>~KmkW6fKynZ|t(HXn9(=tBqH!y(fz5}kiyWRY; zmumiruhYxx;7lm`DyDZps_%qXCityno&5yKvAtqt2;#Bdpb;qgkN1%EtW>r2pQdt8 z43aE0oyH-B8}~nu2atxan{Ts*5`+xME(TkhN^G@^I=VI^2kP&;IwWk4V1pl#>lxc` zn>`gqQxZe74JD_AF6lB==yju(HyEC-`+iY{SV>xlXV)D~EcmV&g zh@!KQ>5Oh4fh@;cS)F-~xi7(G_^P}|;Dbn~Gwd3)RD7a-oM!;u)f&2$BY=-Op&P*0 z1gToJdG-#br%RIp2NwwW{Ok~uT13kJSiIueko= zUNiXn?-j3le5I!4WUgAB8hz;ALta;QkRs+ecg6FxD3~nwE2HRln5JJtYGO!l`ueR( z^QfW)HvIh7rtIrLv#20#dgW?JSL+)Z&9F#xl^P_GPF-s22xOS8fI@je{4=7>MIGG2 z8+wCD7+0aeXav#skpgq zDGtr7jP%4&O70vP1|jgx{G2A()3ZG(raU9yDvP(?8t`K$^i_C5{}n3)270Y3114mn zxrs>BU$eU&CSD@VI?jpZZ{bI{>{Za2d&!8LtZHLr$^s{ zu22@d@Gqc)39|O?4?dWF1aWnVU+n}+*f^Twxa@R!s z8*it!q^he04vw)`eyDdlAHQ?z~DFxq6Xz*zoGR zcW>zOk_edfodcgndETS#n7}2~Jg~8VB7_|mmJX^y?d_Ft2;$J2{~py(FzlGm_4ol> zjGw{@HCA-6;F|b|Qv2rf^6$CJQot4^4r_&&FEqJWPp?7;cR1;_atWbTyBV2`B7aaf zxUFPSlenB>urIox0rg;^9J!aswS@Ibmw}F{eSH3t6nx#7+eq&cr7k~`ZAQbdtJp2Gz{ z{BkQcOoy9^DA2mj{2t0_c9J z>Sx$f2T9~?`@a{tjQ{H}CwVb}7@!#=`0T-F`oE?i2^HF`_DV*ScIyly%o< zJK6&s?k84#V&LI`lLIq_eEEo3UjG9v2D^Q^Vy%m{R8hY%^($D=2JO>!DVHr*#l_72 z`i<6(u#P168y+v#hd-%BIADgfCKwkNp#K8uQYkpOKco{TUB$RI0gNm%R4OGJ#@dsFF ziY`~mVWY3Zh$$lo6>bhDtFH6b^M=5W7S+nF>>D9zxj*8Nh#xw%2pcKmc}-;gZZ`+N zVJfy$Y!hjw^~I#1RTa7fVQrIu+n?^~&U)A}2m-ton&GznX)=CR-lxcx=;F@S-REHM1NqDOa!I~KGutNW8>=~ER-|_sb1^&bL*A*w$;h(L6@Q9 z3No~0A|j!8o?@B{O!yyuAof1%R_~e9y$fz9){GYT{u~$1fR>J`r`@3LFwbIBYV^2X zD?cGuq3Uj|byF$JHSAVL>ufF5S_L5m;q4q6uZWPz394F~IzTV~6~3O3WPbB}6>`XsFM5o9EK+_8NM} zyak0YNH^NSR>Ea-7t3ojJTGVI8>I=D7bM(JqV!ir08GCess%Z1j0N$rqY)5e1i`JQVa@vOQ^6iF$*4&dw?uEWF zylafY!weTCdAhaWL|YOSQBETjY19{9qiSz)>8q^$yu0m&0?2g+Tyz6P}8)& zVV2q7;_S1qTb*lbefop}tj1JnBL1k_sSqU=1?|zv|2oHni-mwGOZb}(RMBE(4Je&q zZ*d1}%?-Q_0zH1Fv+CC5Jsj1)q1(!Z6;`b3=3Usb73+P?8LF@VuYKk`O|Re)b#e`j zfBS|`FHaWgVZ3q#x$ICa8w2SY52MHUyhhuafa#*la8H%VF{|8Tq2_=HXX5{r^5FbAKk&DD{fNkV z^TR$2;q+@Sh#_{6y}l+Hrll+ej!vy*=qneCj8>aeBkLCDZl)*zJ@TkC=s8^45O{FP zs}ThiB^KRN8|=uYa|kxg6gjtB>-3)5ba=~KNa9?M9R|t&^7&YUiky_Mj^A%~sG4ar zwSIj2vG?O(QLFnDov80_J=4SOxL?i1tX&4df|_k!vslZFJ)#{liXQ3guv@|h)nBXZ zNJcdKui`OBr?VeYhQ~!k%U)$@&@R590MOc8X(Uy%22{>USn}&nz^_=nnDRz_SACBh~=Vx2zaOexIQhC$MjaQ^|}%3F#~xUDV>p0VR&(8yTA)NF@ z=;mlP)^4rXfbmxQY$xiD{?YB^$ynp&JoIzd zs{B89=jL)h>~CG=5#aG*e3<>i{W3_d?6E}AVQA~D6S<`h9M^2^3U1prJiQGHDt|j# z9^|!=L1Vsq;Ut1HE7is^u}9+*#fU0gz9hUgj{|LdUlpn#71!8*=TpWBuW|>A{IpEb ze6N0U`rNPl7nZerRLJYhgQ*HKa^)?ICEn0++X=%qYeqC*156p4%cii`#ivd9(m)S!Dyg9($17s~|u~ zmdC0PezcNOM6BnwF77#DF)4TLsk~S{Qs*az&Me;-VZN6^^TW zavz(uXd3damGX5y(OI*BZ^7ZOxt@}?|KJ_(2_mrKrPJ*rr@RU`9+7iAERWLQ7CS-} zsVbWqr#4}g>-TS0?e}JJ(+wu3eOw%%Tf7CeWnZSvxIQtMi-G^7FK!2AYB0Py)0B!j zj!=$l7)=7Y?MZct&VwpsC%X-?Z4#c94sl3U#CX$hp%Ob^;(*zjU5U2I@Alp<{ZVF` zCQ=o~)ff(DPyJy+FrG1tlBlemNI*I6yC^Yy7->Tn4NJ(wCU7F18YU`AK0Mjho>uu@ zo?F$Pinky*Sm{TruUyLR@ysOTpx9HU__!fz&m<+jiY~gzyCFCimxZ_^L4ja{yG(() zbQm-aYnN-Jg=v#E>+c<=4$Nm+i-P||lU?=rSknB!oc_>{Yr5+)aY2?^FMCN8jQb{q z=9k|B0HAGlPB*bvji;tlQ z-xcyGf>rkws5afT{{6ajrR`SlVzAuBZsydB>`c#711~d;)Xh7Cm5j}*Ci8)*{Y8VJ zwF;LIZ_`&Cm4)wuLI=xQa|W2sMN^rvDZO?uYzVV(1DM>2>jGvH-LS_f{{8&-oEn4~-Err!ggE8AR=16lSMuC79qHT$a=0%Bm zc`r)qX=rpK!6Zm;aCBS`j<|cO2&GMg;iclv8Nh8LQk4o;l;#e}ogr)HsuK;kM5#j; z5S>oK-(78|^3MzC(&R8_zPxHc`FRT5dU(J3xY zZyIae22GDd`+q@IpWo5ikBg8I5i#Wz`Bb_|`C(f!h$1$Ol1;%&y8qASb53A~=t3Dp z8k+s;>e`UjM`eQ3Q2Hna&LPl{JT@r)NQGz)*r{kplt#sA>|;(ZF-q%3*K0#!;_^ep zEZ8?@vkyHsEc_L(P$~gkmuTy@(j9e8H~-2uY_b3ui`3trj82od)W@qSWX&om&$4)A z|Lqq%bs4mpRf~G!FW-+ zRemD&P_KQ)+?Gt0GJK0{QcMDKya|kLAL*0soWnZl-{v6G2Y$< z{kj7J&Z~m0`<$K^q2Tc#q4U($DZk?1bgD-~qbJ)ZsAE(fAfeP&MO3)k)K8XycWW}N zGxS8M#lfuU>tVVg>1=UP>|YMpkuAIO_Y%}%(zbzow8Q1vHqp&aXVm-S=9a@>C%%<0 zefiI&BhL`x082Num9aSym@OU#(F(aF5?8Vl%kUCgO*YJZACNJr(zE3CrW;(=%Y{b(y9eMXz|a{ki}#Y3I>=Z3?FxWK zjQ$+C2Aw1 z7O?~6^Tq@#r49Q^$V?)3%dE2|EtPj8$h8j_gD%HHL|WuELt)?-T^F?M^pRzSHn>7>?ZQmye(f@E^%EPx9pCg(C(Cv9F$Sc`c;0Usw>;S zvCZacp+Hq}>lsZh&+)6{b&J|p0UN2AIC*M#q$m`W^DBSUFM>~NOQc<8k<(`C*?nF4 zX!8;oDPk2{rF?k>Qka*0MgjkQmpX2g{F<@x4OwVqKyIl%F`b42pny=2mb0i3=-J1gT^Uv@}u39w53bFyiD+ zF(iClYx!o-l%;Z#JJG(WC{YS1>d4fYf24b?3)-*AZQTY3NL~)qsv8wh7Q@{LE5Om! z$}df*WRn4Biv9craxcH^duF2~$ZIsoTWb~0Lf2PEN>fUEl<{=wtyxsGs^Yp*Tt|V7 zQsv+{Q6eLlQ&aS;|Wb70N~lyI)U7`ex2M*-sH zu|ZYG)uZj_HFmg0KMp|=95(Z;^un!}(XLcJG_^Ts(#!HdS_hAhUu}n|2q{xMuNW8; zt&(%h0>F~ED1mr@*Cwde-ZJ0~o{eqAtUeW=qaisUQN>D4(Dd4=S|WWk;AC^wK5?lh zJ`j_<8XfW%G4wfLR15Qo>3LD_@$((EZ=29^ah=>(ar9uE3qW=0=_kf*1kDZCcJc(Z zw#onKp`^|fsT6l>bP{&+=NbDxJ3~;fcdu6r2q1q3=iJX8j^{!RP;ko#lFoRoHxveH z!B&Tkw3s;+GV->O{nboHmNiSa#%^Jn-A-yS+EO*Pt zzpv))+wsSm*V~#>u0gc6*4*d5D7_)xx?KI$YR$j*0(K_e=JAwdw)bv*x-G7mKAU5a z+iQTwP`#o5A~?Q+1FibvjmI<7q64%bJd|^5vQGp$Z=%qzS>70M(GY5Upam5JinZ}7 z0*&~Yc97>Ck4;|JQD={6eYw*E+jfQ0mkAnqEx4p()5g%d5p1CGiPVOgVvOow4x zb0Y#v5Y74CBUZc0UPT^BJmNTZcs8ZK|DzDN-BN#gN!M=6iKv;ssP4{Ra{`FUr==EY19e_RVee?GgU4bIc@FOUUA(7x_qv#8DGmh zUVo4>Q#>ON2ehu)oA^u&4m*7C65JkgnZ%Z<+ix+^mtWXhTf%WUuN!boJ(aX@C|2^$ zN%TIx^|k1(+R*L%fJatVx?3z8r5wC6iuAq!kk|an@V>nT5S=VOF8e3Z5hPTF)}!tf zj}8uzJyuF+9(O&wDoGXmg*5rsYyPl%?Wx-vV)^P0G0WCQFeU)gSm^NpsrKlZGk~_l zKi&=?oqGUf5S&P(naojva<*7Vi}xn|xm{(1P&H$@%d^kR5lqW|`+qIs4X$958?xPg zy77bIDiSC}XrZ$VW5XHq-V@^CV-Fxvx^|vp zo1KBdkGsR}-z3C)f^341D4N?`q;-p(=49eaK*nwlgsF`*3E$bFDF^k(9=G!#O2qjO z_cRv7K!Br`DiO@RFlksz3GCaf$byrTZ(5rP=ZRmTc=QJgPBAV$uuXerw^o19G z;FT2iy8L}BnHZoYe_^5$SQ$9C9kW(I?b5LvitDXE3W+C&=0WS;|7?YnvpWMJyrTsb zEa7{H>zubjT~vu@IlVm5moZAdiQy!sY9ynTId!$`K>CirR>8%{BIvPMK>0}J-_Sm3 z#mMBBZPZ8Y#a(~CKP2PvRD$q{rW{e=-E*$L<{_;O^S#2HEElq3grd>u!qy1blms*&X$yV{yJ;Nd^ zYA-f2Z}3Z_EoRBbe4Qbmde;IwG19fve|LX+jdu6CFMb9sfq#`EMMF1>`3oG|1RC&NaYkMbQn0s`UF!2fqaPkVmOYZPm(&z-|&B zGCaj%*CR9DPV$$?J_tofa;W_UDisGHz|%1*c$d}|{Z6^li}|BS!7w~0t^Q^9yQhMK zhi`|5e!peHRmzCl!U{hd+@RkpuAlEORXx9~X`)TxqoyUZo$pt$yG}C+fyjSXE_S=; zDt5Kw6PhQqc`E4WD{5y#(}6~gL&r~Hrxr&pOQbRvPu#4M9{R7gn(|Am07TWS#l5VF zU9f$jwZZ9Oyo+I28`1q5{i-iKk8TtM820Gz>xa0~NHj(!>i+(@ZdiwQS4mb7k#3W` z5dn{PK7KLoQlC!S{*~}`9#3IOfM*j?b>siObJCZ)gh>Hfkl^*jbJdC07G&lL_Nk^B zbdw^!Zg4_-N?t+3mOr+Fr#NW)9>rUF=_IX#)OFJ%kL!!)EU~4UN_%6jl{%9xuRjFi z`~p&7r`I5*Nzv?B548Kw<-`;kP-b2aq}&AA z_#J81Fi{}gTLTX9gIAGmdDurGp#iBadZ(4O5w15m1?y*dnZwsJWs=NyAi|&7*+`cU zm~Qo4CxNX@$?ne5P4jc>z{c7!@4ETAe{$XMF@C6cjH_u4HK)x-|x2_%} zTrYn%A?9CYugo9sqK^>#1UbH6t`1q~xY^AMp5%d7Z^z=$45>Ew%AV294(-pDHW z>LioC!9KFBimQXlEV1Ajn&U>pQD1Y82CgJ7kSh+Vx;8sm9@`lOtTeWEN=Z6<%JpP4 z<_|_DUYF{~_hWQGva5t+i?2#1=chO8Z6T4_(G>(h3zSjhoaC)8Hai!0Y3&d6+wNvI zn;9+>y?FIr&9xEtt9s6a*t}b5zc~dPKr<(E66(A^i7fAKuN7lZ2!e3aP6{`!ZI+v> zPCJEacmbp1n=dzW@;ijM(R;%u&rxX~dF}I?f6WD~k34_?-=q1G^^KxU%Rf_jTD@^j z$Wui%9ht~)yVcLAsVkm*x8DD({&>aGmZa|*pssfmu!LFysnGY%Bybvs(L>7?^v*eA zuwTY}>G3-**_uZzjHs@R>wFWDjQeM5r&uw{i8`oX#}+ax`{%g3P63|p&0X>IGxj}# zVXYS7$G=_nQ`JHa32Fl9uj|`PRRg5u)95i{@M2Lc?uXV-q~l&V!6c;|0zJIeHAYeK zeb!aV*~%-u2m%Gk@H)z%zh<>nsYwF+kgqDZ$dpsv-p)<{fSqN;Kcc8u$l2lLvh34iMa2CW$;DE;5`W$2=ly3k=+v3o zq{o~q!iJ8YeY%Fs4;~tTl?0d>nx0kaQuxU=dY3-t+amYXmKoL~0xr3lW_#;}%qWW_ zZ~Bb;U^W*tslT|sc684et}nYxxXnuV%9Y&0-}#a%j}LwyL^M9VooxGZGy++|ayuEH z*?MhY8`@USefDFo)gg0n?$XlDjtQvVTbM6Gr2Gm$19#Zv>slTlmUCo_Ax3%?oy>-lB!! zZd8^MCY|>StV6<*i`~Ou`@pKhs=J2W78nFH**$LL zo>&GPFtx9AdyObf-;c2=wN1M!?$rb-m=b-6*BM{&ld(;@Np00RJ^7Ek;uUbF!G#_0kfQa%A>#GHV!SziK6USJ^zzO-B>O0)(qGAvA|{n@P)2tr10Da=oJ8=pJGMGHjZ*uj%7c0~fv-r*{rPS4B%IxZj_eqv_U2J**YScox4i!{oz)VDeW}y`&DLH_#(P}<`#RSL0m%Urt2?TY?*e`vBeHwL+Spa z;a%jML1JJ;MTot+SQ2k7&mhm970*}8&s#2g;E`(gXz3l26)l1`QOMR$iyab}nF~#N zYF3Ibl$-Qm^t$Q2o}c_vKz!_Oa@{JsU45hh!mIR`K)gSo zg#x$ONcGM6z0A*LSAZM_Sd*i8%C5B)ZDOCVp=;;_J?PiQJe5=479ywmh*O13l!df9 zxGPz`=Oxe=m5w#u2G7{E(&t_{*ewS z?!tFO!~?qtDDt-_sEkf2znwH9iZC;!qBthDuHphfaex}3%~Mxp@k1I#0=IV5jAmzV z`bol#ssC0jcOQTn$1;CI#e(1Baso)9<{s!;oUy5<*~*=xk&niQ=MD$R-@awKYs@|r zY)cahK5C{cRjZ_o7${W2>>RP50J(^kL}J`QYu(dteXTc`MfYtcsFUGL{w!M=Bl$ye zKI^&Tf2ww}^UB&kp{t|JT|g14XiSjeydu)}9uCxcE|q-f@BRI`_u(c1>8qNXNJ&(d zX{!P}@jp!8|MY^iUN8J|n^|?OI(VuJxc!SFX!*4SRMMcLYZ_tI&BC1Sr}crmrOuTp z>S616MaH18)Scx~)eOFTB-gT5+pqBmchf*%LUWrBAUGqu@G8D&^QQv8j;@83D>V|? zF-{BJA>eca20*t(5yQviI94g0%k~IY>b{2MWEKn(chqy!JE}Qw;=rrrR*V>zhzZsV zuPWxsGaP)-Dd@1_f$v6^Q?v#y*9SvF&_SYo?IHbYPEgngL$2Z(Z|%PWMY=W^f46JV ziIW}K3f(%Hm{ZsiPvC@h^Pq|fqcRy|K>+pdL6CD zvO-G^dbHI^zUpXwAkZ?(b?j`#4Vk)H=Rk*P+!TFY+8Uluc!N^w)_Wbuu%j|ntvwJM z4=i=|B}_5IxrDm=!k?qcf>$$c?c>u{;E7YmbOAb6J)^(*Uh@5JNb;VP3};JBXaO1j z7@VB&}%Mgy89|*9HT<$=qLi4NkXEz`@$vLK|7cA#gBCKh5$VN^90X+-7n#J(kJl zg`YSRz~Kx3qTvSB_taIM^pDO9CPNdoBspc0~G*x`Zj&Uq06b5 z^;JW^R%6mVihv4N;Knudl4=qvr--T1*nSp1h|4PKpH>ln{_ZsD% zG#2K^I{TC&s*U@DJPKxnwYOtSYsP)aXi8H)UBz=;*K`&0%p-}P=)E=`WOSw((mv<+ z8kS1}T{Ogb0EJs7o-WodK;;KUDvPYr#udqVLHrO(yz?r8If^n}eT*-+S!aotI;s}- zUt60$HZIC!hgWslZ1xq}MBvCn&Scxoxn5gi9s3?s?4IRe2(Mvd1y+*} zQv=S#cu|HDWhLr;oY<(sYdJ(7jjaq~*2$UD-)z8ZK9s14tNBOi>z9+6G%(vOv6=ErS+sh+hk`VNIs^i`3u z{3eh|gqhHaxVxTqfKvwABqvYXSu_DhiA)}gO#w^w{=Wh6|hOU3q(1v=KC{ZSt#LE|3|14_FT|`E+gFE*0aPXNZdYg4V)Xx@mA&e+qL)UY zook9^`?mL4{8dynj&E`EgE^h+X<_HLd+JlCz>%1Y9o+W05v%2+NPfo!8!VCoEuOkB zKG=7wdeD-DdALO(4WiC-)Q<%IU}4{RF?HrQ+n0e%+}88n`}Xe($}s9Spri>k!Ye>j z$Ho!@GDk{FuPu^;~w~oV#Y~+_Uw0WAi9n0?9-^Q3oy|qANoXRz#fUbRGoDrEP zNZwBR;IVtskY*nEc`wF{>AvQOQp@Z_AXE6T#YB6o?^0z2^Tx#k098WFS}0X-dy-O! zVt!g_8xl{B3+DfD3eoa9A^fMMcQDDjDfR$5;xR|loqj6|fz(Bii)q*hnw zScIBi%DBN(YtbSJ`3R?ImgC8tD^r@??xpK9fLTf5BKKP!&n0N_bfTwv?RT`RWiKhh z|A6|m)OiwL#S#lA1#EInJYW< z9Lq)!h9tdOVZUCo730TOJZU3s*_gP)dZZa0=zhZl4SP@c0&5tV)fB4oh#QZA9PH$%}?wtB^goY|vD~d_uFyU!vXJ* zsYv?ohZyOm+DpZHR?f@8QdnE6sSJR3S<_l$X0sE@MY8@ph1?X#uB(loJyE>>kL}nhywXa^Ib(oV>K6^!eYn60f9g zh$ByJl!`Y6fy_`B3PK0Y4ImWXmNb-JDJ$8upO|ICXV-|flPzCDQ zE8L$#a{=5-;l=n5V92%tbwFnQhc-(P-Cd&5WAagAGu6hTo)zzQrhYVH`qvH6I&D~* zk^(NSVI9!whvjhtN4mOn8I8gdedRypqUwCoKcoDh7%#x5Zv7d9o&MuGdRKB-PyeN@B8=d zzg1hiTYI{`?yl-nUHx^R+vnWxp4a);H2|)xq>Lm04h{f-`?~>NmjIstsL04D$VjLt zC@5%XsOXr4SeO_Xn56gwIE0jBKq^Wy3JPlacTCi@Y;+V9Z$C1#z5l??%?)JY7v|#> zddJ1h`H!2xp`oE+VqlVBVUcjsP|$GxU)yUZ01p+839y0yM+<<*gG0cBd+h-L|2`)Y z+&>NQ-wh5P0TBrq1r-e)kkBjF|ub6SMy$_CI(n0x%Ka{(d|JJOBuA`|vjRJNiG7#|==F zAkBskd;1s6IOrB|7NZU?oab9qRLEl!Y;)UAOVNX>>FXx3%$lF@N)_lAw0>^eR3LW6-wq z1<5Aop=9VKVOsO)bJWF{El96^iSWEm&e;Zy#L!<;AgV3&L2a^(l)}|PmH7ZFMYOhL zes12AY}CeRVcV^*YaUDI&l_;u^lNjmJqQ7TXbp&^|AKcK=De`d%xOh@N?ErjCex&* zRFpHIBpi*BdYhJ(Y)cJ3VUW%hOLRBL#&NRBs~%TY&k<%6g~D} zW-&NB);&e3*12+{y**p6fN{-~4spkCKAAZ8n{S@aKwY&Sf%E&CCd~u4c%}PWYx>#* z$DFT#NR23!Sf?loPk)??O62$Ap56a+PB4tb-kYHFEE@9r5T>tjK|TzWp}J4y(&MnK zv?iwa$x?1w1O=&IN^LE?xc>35*KMA)Ieupr_l9$ro|E1&7MkRS?F8<+5I)pUQJUYX z49p+`Q>qeTOAzIZ5GqOl{v8tBnL7ACfvhab(Aey2c`y&hrkO zoyMyiRTySXL(W3F|IijR+U!(UGHN{dkNk0!Qho)%ZXtAg4D<;L#icSmv(D8pRw;g8?MZ9AydB$vyBty%rR(px}B zwRi9APS!Q-T*>b@m7CPG6CH}?Fy+2ow(Wm@xf-}+%Tqubl7)a;XkP(}(c4$w2Q@MjDE`)p^`i{p2nx{bysK$jSOkM&5$5e)MbkM z_XzmMIg`~Tkfch0J+LXmdx?2O=~HyF31=BlRPw`N=Jozc+4u|XAQJS~)Hq)V7%opY zJ7rs)T!m_WaNL{X3c1j;H&2UmJJtM`m3xUr6Q3pd$ve--EUR5TH}`kPO=%^s0O1mj zMN3n!&}6O;djfFtI93|j_i!MO3+qglfzt}j8MnQUW4GLqj!=y_57J^gKbLOGgYp{6 z7KL+M=43K>yYy6{%~REEMj809cH4HHC^^8VU9VJ!wB=cuTEa91`I#`?BnK2iI2XAS z%R^>iwDR$fJN;0LrSHbdhobo4UJw3)%ZvA5s-QTHTbk=q$7*-xbUaaVGS@{3mVTNZ z^FZS#kv|ICx}Oz~kM(>{ChK94vTo1H#a!OFtks?-alcScU*mhD+H}vn4h-!h>4Ph6 zmuA>eUc7r^4Y(32CaAu%=c8@$WIgMW^hSZ_f{tF208 z@HV%euj`)~=pR|=pWp_hz_$K;Dp#(c!gQ;&FJj}*OUjg{8Dv$F-Y_4OJocY4joCspO-Hj%)ud)G!s{99NlCXamm4G`yU|_s@=pVbQYf z*1~Eqhu`7@MBx-z>%poPFgu znca!}{pik1h+6>>>RQ=IivR#NfRZ)qOk%`66KxV={0%WNwia%s`Vv@Tle$-yV-dyw zk;(1v;QN3?s3`iMKq(-k`USTJBI9vuJ6EkwjZ7}5!R&rX1uqx2OO5y}fsJ#M0 zE9LVx*p)xQw6D3JA% z3=a*3Uo#=x!zdIf%R8N#K(Ua+->_lV4R&E^%+fyNzqJ5j^c)f94HoxX^#L^(-keZIa2!U8G8*MVFzxlK7v#ZO8t4=f3 zq@4^jVm-qsN}jN>z(lJN6LR!QjP#N$-4kJD^T}V*oc(8PsHCg7evg{=8* zDB7XVDDJI|y#kmDD0=7P*G=OWtON>=o|{S&;ADqJ8p!xpldl%(1)t$J5 zz^zHj$YnURK>$ zSUs^>ze9k9tSHsfZ@?O((C~L+lmn2Z_3TKV6w{_yx+vI6Lu&+)3Nj#00bqPTM`v2M zBA>P5_)yFbPHvk`FP0SjJ*UClnw2S2EW_?Zjdz5+Bi z1SMVpZVPGmvFgLvyBuxCOIPDWcYa#Uyv=%0V=$l64j-eMZC**|@j&Sd^_%t?d%`zs3R~AUZ`!DIo~cr^jA;yG8Gy2n2kkup)C#8 z@15{C;w#~&LM%eWISB7^9_5z$>kob+wY{#9p zFM?t8o%Hejb(q*Ipk|J)_+@<2ET?!yuf5GP+L23EMLeI`NQTnqkkfu)YQnGdoNe>@ zPy#eq=8|JOWWYegE6pX2L27k!Q6*`kAy_KkD z&$$dxt$#~m6A&Bs-bvm%uijtK+M;4Zx4I`Rq&*B7@DvD;`_}|YY+r&9ZkGySGAej8 zi)1ktN*_nMej7Ow@!^U-x~mBk@?bgrWGwXCk@A4O>%p!M224hILDCz8IY!EGD5`wf zPR?kl*`@YH$?BO)_qI+Il%tbsGDUo@>d|hLlw`VA1qFUi42to+-%`7{_q-mFx|`JS z5q$+5&V4d27D=hl)b9~BHT*7*Ky`Q*5w>N&{V395&+DtEis@yr1>D#2EVkrMneo|z zmv|@{HJBZ%^C6||U&{7BSQIsgb$8j?auBZad}bLzKPaVacux`YAzniSo67Bnv5zTJ zin%-f@YaVNM!KCvA5PRoAAz}VxHuJZ5jxG-dcW$DL6OdvcagorQkW>iYOFiIIEks( zj#a5Q>6&s_W8%H&a`F(SY6+B9vr}Z#U98oBk38lbA=?eK(IeaiWCIKL;{afEHqsomWVb#k`Xrq^GZQOFG=Jd7kfJF zy>9zzMV20-D}&YUfbA9=S$2nsetk;F!WhrfJF>)9F*D4Em}GM$ zA69FQmTNW!3rYvFFIk&JAo2C_KU;iJw)nErLOW~zN4Q+{lI=iY5)7Iu4;yZk**Mox zyTu*GjG;m1CoE&dl^GCZd9oHt4J4K7mz1yc_HD zCI&a(M9l0ufdzU~M_aXZs+syC+b`gq{kCx>6obFzFMy>jI_N6n|8o|??<))U80T+FP=+SKYt)Qt*@9(EqfZ;!x7o6aBkAH z@g%hH(mphHUmp+UZbMP_Lyk1$$VL<{ScvE=SV|0!pTEHIj@7G8z1#eTMOEaKA2ZBM zdV&hM?FNxtuMm?QLs93H>%YO*MX9M$r8TYG1zhL($Xia=l}G1ZhV2;E^4fC>WIWEF z^do)2Z@lS0OzoR&e}AW}0%vE(FkN83-u(5Q->OdZIMKr5fq+{cuGg1g>*S@JFjWIT zI*HJq+j6UYW-QR{re>(eHv(38I%;#Q`DbCDvK-zj^W-Fvz=qKQnQ=<*x2Kg_^W7yVB2)o_ZZiVTiE5V>|iz@1s2=q&-RJ*oU>S!{8?R(VcA zoC@bm@)?fGCt)k5mc|%~W_tY({(;JY-{1h4>R9=fZ?v}eRhGLM@?)DG;(V;9Tr_Ri zTvY3(r@=CmT52Z?yM$k)Ga98KURt{hp0~iWL>Z!ysUg~68%8xYRe5qirdMjq?%>wF z*ubY5?CX@$A%)0LCVq*(^K9?g9otgv3A4az9wlW?=NMZv z!CYxYZU-Z!QDGnP0u zL6R+&JgD1mu@)QE3X@@K7WlP`WiZM?xi8?GP(f5To7djrW(+2DOwb0y^{w<*`uPg? zI`w~7Fcf2N`!Q&9nJI6*;!EMpKXvp|orhC}Y{%HJe26JC zH{@2RQv6J^rLv0&3dLL6qy;Y-H9WSOcEIWVSW|%4vq&AXB3RZQw`G$fXQ5eKAVnnJ zT8nBVIzgUV{*H-v_FhD>*Hm{;HfoLxtdVcrv~J|xa3!$CzP~)vBnW zZXQ>R;aB1U!3fwZoqO&k1anyC0aNfw;8 z9xz=WqF6|eIP6nQlCvY_)o>RUeH4uTWFH@Dil?!-PEXS9=z9J3{1g03&eg^gN=Lha zt10!^O{#oNl#yrAkh-$CwAeEmfBBvQPG1d+!$8D>t;ioRKwDjTwS+}3-_|izZWN}W zm@Y*Yh)+Z+gneBbrd30@G=CxIWZ_Mei^Vej0xHyB<$vs+f$=761VSgXL-xXkt$N0t zDVHS8bgq6QeR2{p0HN=?+A8g8&J=buIZeqfH601UsV#qeqJvEot)_nU@ip?xF0p~3 z<;tmR*Uh-LSckLo*cgTscgvc_4uZG@)9r2m02HEH$KKZDmwlokE8Y&nHavgXW6b<# zP!HJw>C^DH&AS-jh)PYY_4;3_&EPH|@5==D4#AbF>5GZ_^!F|Fdyy%#>KXP*WU+=6 z21LJ_-yH=$S`m;RzqX|Z=o)#-v8{%cWZ&l2asJP-oqd&!t>3@6fA$IpIE8H5=t$?T z{#li}SHBnp1$uC1e^w#w`i|^VR(aP@o}t{^>>G$-7t{&9{4qUZ7=ttE_zLh*XHlz8 zgZ0b3UC{Bjzs3jN;9Qj6#M-1D4{WEyU7@pVl_cwUmb|D8oJ|H(lBWh31!b)tR_OQD z*Q?2p3ym=KLH(j<8hz@pIr`4Z{1&dYho+*@&MpRP~FxZho~*~162cZt;H0_u#jB6MeWeXJF2`Vv6B1_%fYDMYGx?b(%M@JI;o(JqRR=^#xEA-Nwps?_6RU0uy5s?7#i!J^6!Bv zC&+eML13Ja@>P!dU#$|XY*HvF^b{pW9zs;tLsnX|V~zFp9%8tVZPE7#?@5_veso?9 zR)BCcwe|Ktnr@ zs&R)pP4>P5B&J z;5CcMsN;7udm6rVVGJG!{`n5w$n8;QKDRf~Ke^N5oJMWJ`kxEP6%MexufuNi1K(u& z1r|WrM=Pd_slqz>o;6^<79vdx#%{viR>(W#hP?&+3#Fb3PXc;r&OQ!~SgmrbKm#sy z*70^WD@GjbPlbKbUi%JruYgR;Ap4PHU?gKdk-Kr~1z3!nV51f_wqQ~whNk10AHO|jeiy#&h7W7tk&-Rf*$ao?&PVq?^Q&xq}(i| zdNm1(+?g_JOFAM(HEB;~2?!)LXr*uxkGdb_2!FycFT8V-GtwmKt3lISc`*nZ{f^+u zhJpF8wOQaYacBL4SJ38_HV*w#vJz}mjk_dfPDjc=NZVu|A}~5BRy0fyu1GezU9vp& zfgW@7hrggZf4SDSoAhGqbG|(z_D*Jo){l{IskMJipRM(tprpgJEus>be z3XLR(?6CyE0pwJgSHhnP>R9vbhwG+&}K2mFZVYq)+fTFKu6MxO3Y!W5ec* zVoat&c;@zo|4~x;ms)>eL_sWIE3_ume z#*qE8lu5CdXetzP^?P+T)#DvAJyLDz2VCok6PKI1mdx28O#C{(?;z$Um69jx*ycL) zsSgzIG@g-&G4`Ej+X-H;M?dw;9dnn-njd4_m$+%1!g9_X%^GZOb&G{wBU}Bvt%u5Y zAn7~}YawM<8xphnX%ob^p`Tm)3LsE{k|Mf&#VEaxsD|$c*ck{sqm}R68!YYdODM?i zMy1#-8?qHHdzzBp8@2car|Q&C=&dgIOb&CEOGDl-sn{`5Z3l0wU-KW6>;6y)3bwk3 z1US9ZSmVNm>pa!ENlLu1!tcj8QIFKY&3~tIOpX8EgLSI4m65kXtCTY^X#}RhryR}c z&aK$<5%;U#c6yl1jSz4mwP5{d-&bh1?j%;BS%oSexBJQrct%#gze7i}#+fhFrb5WF0U0J%07H-!+UNh;{`qiJ!;uJlvV=sF7$3fG|ZNS^ib-g~{2v&ydv5 zO6rr|J>(lD3!H0Fk&lS5PX3{MH|uwrJ^XBWY=5lgB533-SAgl#BKh_S)1%j@D=Vu`)uK;TY{jIJR*&*0bGbqY-aJ-`na z6Ac*ijKm00VHi3wxvQ1GH=I%Q)leT!Tjcbx@4UWYnrZ?c-{>whQ84s;^*h~|liI)` z?Jis%Hnp|98H_Q~J%+xa;}gP{$DyMzk6&!0+0af&{bDjT^)~55+RO~^G6q?F2M~qq z>0Vy+wy0@AGE(!CE$Ony6l`@$`dTtpH4SeNcrFv&tm1B%4m3X2)AbV4UnG`1QK;1# z6e$1h-EUyf??~15Uf2tk@%-HTyri=tJw5h3xF?Kas&Dv^I-2QGw=Z#2MmQZs%&)@9 zd8=EL8#{Bo=Verr@Oe9DK>>ALerh(e%(zqwrGAF^0H?Z2u+S19mrvymbUH|FhCJc~4}VjH_1h;Sli*DQ+&~2~l*@@pAM}D7 zQ*vy3gd&!HMQ}!(4?K&OKBN)Y6J}o$_$$<672QVb5%mEh)v?a1vL4aiF7ttty@-}NOu{cT1yTaG(w(QF;Opk$!UG9L+sQF``fL7ikzl5*3ON~VV{djM!G`L+ zc9gRj_jsxDF}Q}vTC28|-+dQ?08fN5urQKTadf>^!<_J^vEK@%l|!H_vi>R8vK3;t z#K}I`<2k>e&ZfT)PUG&O_Jg7SMIVS^nDec=+T+m5;6wVQoE(qI=d_n zx*YfD2FVWHcD-aw{PPBH<)!hRN~IMcz60REx^#m3v`RD4b&0#*IqCou=m+-@uZmO> zX{p7_)4Bgef~dOh-*Xd@o_33e4t?$Ch!vuAcs~R+*0h-o4<3_7d@-7Mi}&27DH9Ho z&Vh;<3qlCj**H8Yiw8SiN!x{~GH4IgFUh4B2@=CK#n((kRJCl)z9sL{ushYvqJ;C| z)g4*Hgy8&HQulG_?AwySFB|dEz0pi(z2J+Lek4;oo%>6I!8d}1v0CpCq6Iz_bcp(+#=wr%YHsd12+$&t-1 zO5^hA!`*CYkvNh9jNa`^kR0bSJILkrn6(0V5e+bK0@BJh}6E}9q#>gnd$9gre zkv$EmH7fPJ;9|uQ$HFhM7@!m#c!;t>4H`~#e1SNSc=7T-^d4o7E_vI~MHX z9=J!uZe_E5{-`|wceSp5!lP2-di>6|)ff9(!KZGir&x!?)?3xSP`vx&9j(O{sq%fm zf$#yz^pRMM$XZx-i6nMidq!E|D|Y45G7SY zr}o_KP0*S&2EV#eHQx4Fz(+M~vNL^RrdWaY_rR#!ko zYGOdtDP#h#DK9K~tWmq)9F>IVaKJlVUYgCFhNdQxlSFr2uFH7L{cHw1Uv!a9=i+Ix zbwUw4;fknqjMb|!tgzJjC3Vys;nd=EFkUb2wJncj&SE7c$EGUlX&246Ok#(K>xt_u z;gZ^URx-2uqY^vI`OPp*6tRg}pMwgfiHV6nh%9#z^CEY&U>vysfthB_1}`82cmDUd z%}qHaGkdgTB5!(w8~?H7;Zc3L*z=}$F^azPm!eMFa^p|8)lKb1@iLC<8E)Xkn^T3v zRTwc+L&DgE*IW85B`@@PR0CA%fMu6r%ZjlOm53K&LPaqeG5YT)N}lL(U1hY@nzV>0 zp$&|lxL{zg;++~KqhQr)1S_9yGCqLIyBM@4Rk@y8>$mQ;#41)AKmjXot1T46NQYO6 zN*SjUB5Rk?y7`dcDXRm~NA8SI=%q}gzJsE?Z48veb?NfRg#&lY8A#vx6S8QfXAkl`6VRo-~>w;sdscpo6TIr zB!bZE`tYg}FE)IXwJu1_+>G-*zjyV06nM8%1Ug9~VH5qXz!NIMl(X+k4a;vhE0aB@ zaE}Kip#_F24ZQ-u&SLb$fdaWdCqy>C&Hc|7Iuv$@2l*G6W+6IkPAZ;F)G+$-%fw4UmlX(`r;Jl; zUII+AUtQnueBsyE7U$0;5tJr1cI&D896;1k)A%#`v`_TuL6x@nZm7(720>pYK}`u2 zk*Ysdvq6t)@>JfAdr1?gBn06;OpP_GX$?;N3g8au?#g7Zo+>w&&=r6}PW(bLWB1&!n>CcuXcXGH! z69+#(mWguR2dFNsn_k&bVQDd#Zfnr7;^ZjDN(2>|y9`2}fQIG>TH-Y!1y{kXz!&Qvwr!)*FZ!lJ;HVn5EmDh#ibef&0)7TI+s~I^rPG}w<#Q(Ru}D$-3jhl|b^Op({K{ve zC#iw6rAI&v7ifQ)mpfC{V#iczpU%KVl6%7K&?#&5M(i+fB=zeLSX=I&^*_Oe)NSQ) ze;2rg8I7N+wd&i+C(G{}rrEze+#6(#?1ZBT2yxEIx3?K2COVJwzkvI+uOZR$cdih< z1j{Kw>2YON(+(QFfzsj}6(ocz62b#Frj+!k;594`8P`J>mSr-h8f gPIx5uUmAt})i9I|AMtN}edHUHFQZgL+1eB5*5&3g`>L^B4+pdU9I-kT%246|TNH6KvVs(CsYqL$1C^jJHak zl{}Te{2>=B2R3$3J56}+j+?!{xqY+yc72XnX@c^aROeg!dHm{F=9f>_z<)M%_~iHM z*)v`=k>}5zeR+rb?AdqR|GoX+IQ%aN{%_K%!y;&@*EGdmiieI6fV<4EoSu3+Z+Ae^orE%5BkNo5v=U$Q~pO=pn2F4@(n zEGan;w2r+-Fg}FJ`ZN%-Stc()%O`MG>STlNhT@p7^$xeD(`EIiz5$6eY5c*K?FzAW zOB~AgiWNPAwuAoYCe}|;QD^cU2w#_s0i@0EuS~pk0%Ves^>*-QE?8j}%AcC7PmcKu z;>n}24FfA1d-)Yl41_?M3Nmj=4ertgUVm-mYc&p|%TbF7h&TN95_u@CiVOc26tF(5?28MD@xV^O+3UReuWVWG=36GSC z44LHOfJ?F)?dfQXIYg?e-x;H}~YRPavMsQHQ~A(&0Bfo^VW$3^(8h7@j+f3DnhgX|XL(*@cqyqfvOMU#6< z855U&4LA2Dv=ma7m>{20fmtu@wxtZWn_0z}mb`F-xY-oijNs3fqgIFeWo?}PU#wFT zKX+-vr1(?Zs$Tm02eHAy?JSKwEq+^1-H7PQrJcRXmq8axGyDl|v*Bfgs(-Zib*gQ@ zu5_ZkM#H}fJqzhVmUpyTS=&K6W!QO%qKGlP45?#$YR+mlFE~c@Rcw@53B~S#tfF>j9N#FonwN;LR)u!E_ko`>3Co@{yr2-wUyp$ zKj}@_tYy5&^fV<1#$oi&HdG_R$J^=>&vEY5vR#KG11NvxIY9 zot6G^t;g=DdV8rd#ii<6{o3E3Dl~k3ZlpA;ua?;K2^!GEgZFMNM`Ghh?|_%SsxNH%y=9jAC$)- z)Q!9)Wk>Zz(Rlbr;eLujLlnShR+uaJp$w7JYAVv&5_d>kF7eY6Yp{pO4ta3+2Nb@f zwo|+&nkoo3aqK{_`J8FvpK5)XRYWu5+{+_g%2E%f@zatRuZ#3kRX}e?{MCG-dFj=qxn} zf6vOtYLPaXal!L&R!iL+9s=ZxE>DQhy^hpaK!0J)4d#}YsoG{=Gm)pGzT2<+<_di~ z%%!T$u7=d`Z?EE_=+7jv?9P<9Tlf!Lo!;UyZhz)fy2LR!%ccko508y1ms<@Xw>5oS z>YQTD5@iXVBa>FWSKWK?kRjO_T818#Zueww@5)a&6_x3W8(FwOua0(bsj+I1Rj}~$ zgqqx%FIzt+C~$rd?yQuR;jR7QH1i#i)Z!tH+E=pQkhR$4&!hh!a8FRQskoPwMM)4V+d%iM;ly3$MW z>BrSUZcEV-LoCUjRk6!!;t(Y*A$T@iT&z~~-sebwCykB+BCH9|xiCq3`^0dY8qby0 zo4A1(kowu&5_F&GYTL@YH)lg-faPT<(NAj^cWdZ#F{w2S+6;76BN-Zn>F2>NUZbg> zEse!2`hm6ST;QCA!#w z#)SFH+Us8_VtAK8v)(6OEupUHqhZ9h=?C9>7ruHx`wo^#(RuXRRQ+NtR>nKZ>LfCNU1ujK5k9+f$XC_w zgealPAoA2QTHQbyjJPz^mPfbVcj479ijWuu0*Qmg>l%TLTP`Bj`sEyhhH;L#Orcdf~)4eh~1^c#MG%AtK`=&Bah|N4}ad6eMQzgb)|B(q`yGPp5@J(?r;QV;j zSyo0N>ym0r>*AOZ8^T&1L#6R%UJ9Rvtg~i8)d9iDi$1iMf7ltcMw1v6hqBdDkZ^xn zF~9VhzLo9L@Hw1r%tpiWHn8`8-R+UE6x4EaEgbADhYHN5ucz_~?C};~9<_O#kCh;~ zw5RAjv_;#+*0kwTXKa(*-yd1i*kp4jEw8%}1r&KLTuZSYwbvk0ZN{`C)plN(m1tm8 z_K{<%Z0QsIYzQM$QCzB8?`g)zg6Dgwq^*DM29Px0igX_O^1szsq9hlJU`jX`J1~W? zJkG`1FR~!SijXhqQ&nZswS;yPc&t7@BFi)SxspN-I09rQN?P)QX+Xe(Z5OD$q1i;6 zp-o;k!2e06m&=KM^S3&)!(~`^Vm*pSd{v)dn&(425$v~zm(}&(S6Ysa9)3Q~P1=gt z;b|=ks@3+c!p_Wmh;+x@>N7Ys*~50!!(FSi#lx{thoGIJZuQ^2aJ{y~<3FXXEqOj5 zm?Z8utUtmreGqj?Fl(#&2BHi$gI7tWJ=b%S8z_6#D2LfOvb}Z4yT`kxp1$T{x#D*m)sx?npS$GV)B1i-y-C zO~~gx=DVGh)kc>}p|ZdA$NEnA@p5r@?0tvKbH)lR3-;e|c4=HVL5wP@M@cynV3uxhO*NoDt>CFYNaP#@hz6T;DeDoi}rx z_B);guc*wsXvFV_);7s8f{oKm1M%bPxE9jpE6#%iD$*be=<}$ zJ-(-e&g0pTv3MuccMeBG4pkmqMksn9;KKTX=J8S`e|GkV!p1`s6Dn~GHovNqz;bV^ zspeXDzef#-DsY`UA)Y+hjCU<-h;pnvWOxOSm|M_&$=wg1r)J^97uv!=l>=UB)Svfo zB4C8jMLMCt2+6tCiaBte_ND$wQ9+XLyL)66&TqohE&GU}mv_I(M5=ny%5AHN3B80F zh{Q31Z-9)RiJY_9*%?%pG=|Ada^NN55wao*Gn=mz3hq2#bvI~x`9XzS>qiO7xg~2~ zBUkao{-IDKYdy)zMBq^rdiTM@DHf0TMsV9Zaq6Z=!s|<>WvynkoDYH>n8QjTy3@;7 zf;(!DCx^c>s)f#0UaqHk-|$9#aUU=_DC1dZ)U$Cjxap$cX;kejPFkwEl6CjeTDNFYc%clKhBt?cG3bTyESf z;?W*nkTc((gUoL}$j$*<*kQP;_ZqI>*^eNj`#w| zt{X4zgL8&KUr{A-ht2OIlZ|C~8%p!i%+R-g!P>~KmkW6fKynZ|t(HXn9(=tBqH!y(fz5}kiyWRY; zmumiruhYxx;7lm`DyDZps_%qXCityno&5yKvAtqt2;#Bdpb;qgkN1%EtW>r2pQdt8 z43aE0oyH-B8}~nu2atxan{Ts*5`+xME(TkhN^G@^I=VI^2kP&;IwWk4V1pl#>lxc` zn>`gqQxZe74JD_AF6lB==yju(HyEC-`+iY{SV>xlXV)D~EcmV&g zh@!KQ>5Oh4fh@;cS)F-~xi7(G_^P}|;Dbn~Gwd3)RD7a-oM!;u)f&2$BY=-Op&P*0 z1gToJdG-#br%RIp2NwwW{Ok~uT13kJSiIueko= zUNiXn?-j3le5I!4WUgAB8hz;ALta;QkRs+ecg6FxD3~nwE2HRln5JJtYGO!l`ueR( z^QfW)HvIh7rtIrLv#20#dgW?JSL+)Z&9F#xl^P_GPF-s22xOS8fI@je{4=7>MIGG2 z8+wCD7+0aeXav#skpgq zDGtr7jP%4&O70vP1|jgx{G2A()3ZG(raU9yDvP(?8t`K$^i_C5{}n3)270Y3114mn zxrs>BU$eU&CSD@VI?jpZZ{bI{>{Za2d&!8LtZHLr$^s{ zu22@d@Gqc)39|O?4?dWF1aWnVU+n}+*f^Twxa@R!s z8*it!q^he04vw)`eyDdlAHQ?z~DFxq6Xz*zoGR zcW>zOk_edfodcgndETS#n7}2~Jg~8VB7_|mmJX^y?d_Ft2;$J2{~py(FzlGm_4ol> zjGw{@HCA-6;F|b|Qv2rf^6$CJQot4^4r_&&FEqJWPp?7;cR1;_atWbTyBV2`B7aaf zxUFPSlenB>urIox0rg;^9J!aswS@Ibmw}F{eSH3t6nx#7+eq&cr7k~`ZAQbdtJp2Gz{ z{BkQcOoy9^DA2mj{2t0_c9J z>Sx$f2T9~?`@a{tjQ{H}CwVb}7@!#=`0T-F`oE?i2^HF`_DV*ScIyly%o< zJK6&s?k84#V&LI`lLIq_eEEo3UjG9v2D^Q^Vy%m{R8hY%^($D=2JO>!DVHr*#l_72 z`i<6(u#P168y+v#hd-%BIADgfCKwkNp#K8uQYkpOKco{TUB$RI0gNm%R4OGJ#@dsFF ziY`~mVWY3Zh$$lo6>bhDtFH6b^M=5W7S+nF>>D9zxj*8Nh#xw%2pcKmc}-;gZZ`+N zVJfy$Y!hjw^~I#1RTa7fVQrIu+n?^~&U)A}2m-ton&GznX)=CR-lxcx=;F@S-REHM1NqDOa!I~KGutNW8>=~ER-|_sb1^&bL*A*w$;h(L6@Q9 z3No~0A|j!8o?@B{O!yyuAof1%R_~e9y$fz9){GYT{u~$1fR>J`r`@3LFwbIBYV^2X zD?cGuq3Uj|byF$JHSAVL>ufF5S_L5m;q4q6uZWPz394F~IzTV~6~3O3WPbB}6>`XsFM5o9EK+_8NM} zyak0YNH^NSR>Ea-7t3ojJTGVI8>I=D7bM(JqV!ir08GCess%Z1j0N$rqY)5e1i`JQVa@vOQ^6iF$*4&dw?uEWF zylafY!weTCdAhaWL|YOSQBETjY19{9qiSz)>8q^$yu0m&0?2g+Tyz6P}8)& zVV2q7;_S1qTb*lbefop}tj1JnBL1k_sSqU=1?|zv|2oHni-mwGOZb}(RMBE(4Je&q zZ*d1}%?-Q_0zH1Fv+CC5Jsj1)q1(!Z6;`b3=3Usb73+P?8LF@VuYKk`O|Re)b#e`j zfBS|`FHaWgVZ3q#x$ICa8w2SY52MHUyhhuafa#*la8H%VF{|8Tq2_=HXX5{r^5FbAKk&DD{fNkV z^TR$2;q+@Sh#_{6y}l+Hrll+ej!vy*=qneCj8>aeBkLCDZl)*zJ@TkC=s8^45O{FP zs}ThiB^KRN8|=uYa|kxg6gjtB>-3)5ba=~KNa9?M9R|t&^7&YUiky_Mj^A%~sG4ar zwSIj2vG?O(QLFnDov80_J=4SOxL?i1tX&4df|_k!vslZFJ)#{liXQ3guv@|h)nBXZ zNJcdKui`OBr?VeYhQ~!k%U)$@&@R590MOc8X(Uy%22{>USn}&nz^_=nnDRz_SACBh~=Vx2zaOexIQhC$MjaQ^|}%3F#~xUDV>p0VR&(8yTA)NF@ z=;mlP)^4rXfbmxQY$xiD{?YB^$ynp&JoIzd zs{B89=jL)h>~CG=5#aG*e3<>i{W3_d?6E}AVQA~D6S<`h9M^2^3U1prJiQGHDt|j# z9^|!=L1Vsq;Ut1HE7is^u}9+*#fU0gz9hUgj{|LdUlpn#71!8*=TpWBuW|>A{IpEb ze6N0U`rNPl7nZerRLJYhgQ*HKa^)?ICEn0++X=%qYeqC*156p4%cii`#ivd9(m)S!Dyg9($17s~|u~ zmdC0PezcNOM6BnwF77#DF)4TLsk~S{Qs*az&Me;-VZN6^^TW zavz(uXd3damGX5y(OI*BZ^7ZOxt@}?|KJ_(2_mrKrPJ*rr@RU`9+7iAERWLQ7CS-} zsVbWqr#4}g>-TS0?e}JJ(+wu3eOw%%Tf7CeWnZSvxIQtMi-G^7FK!2AYB0Py)0B!j zj!=$l7)=7Y?MZct&VwpsC%X-?Z4#c94sl3U#CX$hp%Ob^;(*zjU5U2I@Alp<{ZVF` zCQ=o~)ff(DPyJy+FrG1tlBlemNI*I6yC^Yy7->Tn4NJ(wCU7F18YU`AK0Mjho>uu@ zo?F$Pinky*Sm{TruUyLR@ysOTpx9HU__!fz&m<+jiY~gzyCFCimxZ_^L4ja{yG(() zbQm-aYnN-Jg=v#E>+c<=4$Nm+i-P||lU?=rSknB!oc_>{Yr5+)aY2?^FMCN8jQb{q z=9k|B0HAGlPB*bvji;tlQ z-xcyGf>rkws5afT{{6ajrR`SlVzAuBZsydB>`c#711~d;)Xh7Cm5j}*Ci8)*{Y8VJ zwF;LIZ_`&Cm4)wuLI=xQa|W2sMN^rvDZO?uYzVV(1DM>2>jGvH-LS_f{{8&-oEn4~-Err!ggE8AR=16lSMuC79qHT$a=0%Bm zc`r)qX=rpK!6Zm;aCBS`j<|cO2&GMg;iclv8Nh8LQk4o;l;#e}ogr)HsuK;kM5#j; z5S>oK-(78|^3MzC(&R8_zPxHc`FRT5dU(J3xY zZyIae22GDd`+q@IpWo5ikBg8I5i#Wz`Bb_|`C(f!h$1$Ol1;%&y8qASb53A~=t3Dp z8k+s;>e`UjM`eQ3Q2Hna&LPl{JT@r)NQGz)*r{kplt#sA>|;(ZF-q%3*K0#!;_^ep zEZ8?@vkyHsEc_L(P$~gkmuTy@(j9e8H~-2uY_b3ui`3trj82od)W@qSWX&om&$4)A z|Lqq%bs4mpRf~G!FW-+ zRemD&P_KQ)+?Gt0GJK0{QcMDKya|kLAL*0soWnZl-{v6G2Y$< z{kj7J&Z~m0`<$K^q2Tc#q4U($DZk?1bgD-~qbJ)ZsAE(fAfeP&MO3)k)K8XycWW}N zGxS8M#lfuU>tVVg>1=UP>|YMpkuAIO_Y%}%(zbzow8Q1vHqp&aXVm-S=9a@>C%%<0 zefiI&BhL`x082Num9aSym@OU#(F(aF5?8Vl%kUCgO*YJZACNJr(zE3CrW;(=%Y{b(y9eMXz|a{ki}#Y3I>=Z3?FxWK zjQ$+C2Aw1 z7O?~6^Tq@#r49Q^$V?)3%dE2|EtPj8$h8j_gD%HHL|WuELt)?-T^F?M^pRzSHn>7>?ZQmye(f@E^%EPx9pCg(C(Cv9F$Sc`c;0Usw>;S zvCZacp+Hq}>lsZh&+)6{b&J|p0UN2AIC*M#q$m`W^DBSUFM>~NOQc<8k<(`C*?nF4 zX!8;oDPk2{rF?k>Qka*0MgjkQmpX2g{F<@x4OwVqKyIl%F`b42pny=2mb0i3=-J1gT^Uv@}u39w53bFyiD+ zF(iClYx!o-l%;Z#JJG(WC{YS1>d4fYf24b?3)-*AZQTY3NL~)qsv8wh7Q@{LE5Om! z$}df*WRn4Biv9craxcH^duF2~$ZIsoTWb~0Lf2PEN>fUEl<{=wtyxsGs^Yp*Tt|V7 zQsv+{Q6eLlQ&aS;|Wb70N~lyI)U7`ex2M*-sH zu|ZYG)uZj_HFmg0KMp|=95(Z;^un!}(XLcJG_^Ts(#!HdS_hAhUu}n|2q{xMuNW8; zt&(%h0>F~ED1mr@*Cwde-ZJ0~o{eqAtUeW=qaisUQN>D4(Dd4=S|WWk;AC^wK5?lh zJ`j_<8XfW%G4wfLR15Qo>3LD_@$((EZ=29^ah=>(ar9uE3qW=0=_kf*1kDZCcJc(Z zw#onKp`^|fsT6l>bP{&+=NbDxJ3~;fcdu6r2q1q3=iJX8j^{!RP;ko#lFoRoHxveH z!B&Tkw3s;+GV->O{nboHmNiSa#%^Jn-A-yS+EO*Pt zzpv))+wsSm*V~#>u0gc6*4*d5D7_)xx?KI$YR$j*0(K_e=JAwdw)bv*x-G7mKAU5a z+iQTwP`#o5A~?Q+1FibvjmI<7q64%bJd|^5vQGp$Z=%qzS>70M(GY5Upam5JinZ}7 z0*&~Yc97>Ck4;|JQD={6eYw*E+jfQ0mkAnqEx4p()5g%d5p1CGiPVOgVvOow4x zb0Y#v5Y74CBUZc0UPT^BJmNTZcs8ZK|DzDN-BN#gN!M=6iKv;ssP4{Ra{`FUr==EY19e_RVee?GgU4bIc@FOUUA(7x_qv#8DGmh zUVo4>Q#>ON2ehu)oA^u&4m*7C65JkgnZ%Z<+ix+^mtWXhTf%WUuN!boJ(aX@C|2^$ zN%TIx^|k1(+R*L%fJatVx?3z8r5wC6iuAq!kk|an@V>nT5S=VOF8e3Z5hPTF)}!tf zj}8uzJyuF+9(O&wDoGXmg*5rsYyPl%?Wx-vV)^P0G0WCQFeU)gSm^NpsrKlZGk~_l zKi&=?oqGUf5S&P(naojva<*7Vi}xn|xm{(1P&H$@%d^kR5lqW|`+qIs4X$958?xPg zy77bIDiSC}XrZ$VW5XHq-V@^CV-Fxvx^|vp zo1KBdkGsR}-z3C)f^341D4N?`q;-p(=49eaK*nwlgsF`*3E$bFDF^k(9=G!#O2qjO z_cRv7K!Br`DiO@RFlksz3GCaf$byrTZ(5rP=ZRmTc=QJgPBAV$uuXerw^o19G z;FT2iy8L}BnHZoYe_^5$SQ$9C9kW(I?b5LvitDXE3W+C&=0WS;|7?YnvpWMJyrTsb zEa7{H>zubjT~vu@IlVm5moZAdiQy!sY9ynTId!$`K>CirR>8%{BIvPMK>0}J-_Sm3 z#mMBBZPZ8Y#a(~CKP2PvRD$q{rW{e=-E*$L<{_;O^S#2HEElq3grd>u!qy1blms*&X$yV{yJ;Nd^ zYA-f2Z}3Z_EoRBbe4Qbmde;IwG19fve|LX+jdu6CFMb9sfq#`EMMF1>`3oG|1RC&NaYkMbQn0s`UF!2fqaPkVmOYZPm(&z-|&B zGCaj%*CR9DPV$$?J_tofa;W_UDisGHz|%1*c$d}|{Z6^li}|BS!7w~0t^Q^9yQhMK zhi`|5e!peHRmzCl!U{hd+@RkpuAlEORXx9~X`)TxqoyUZo$pt$yG}C+fyjSXE_S=; zDt5Kw6PhQqc`E4WD{5y#(}6~gL&r~Hrxr&pOQbRvPu#4M9{R7gn(|Am07TWS#l5VF zU9f$jwZZ9Oyo+I28`1q5{i-iKk8TtM820Gz>xa0~NHj(!>i+(@ZdiwQS4mb7k#3W` z5dn{PK7KLoQlC!S{*~}`9#3IOfM*j?b>siObJCZ)gh>Hfkl^*jbJdC07G&lL_Nk^B zbdw^!Zg4_-N?t+3mOr+Fr#NW)9>rUF=_IX#)OFJ%kL!!)EU~4UN_%6jl{%9xuRjFi z`~p&7r`I5*Nzv?B548Kw<-`;kP-b2aq}&AA z_#J81Fi{}gTLTX9gIAGmdDurGp#iBadZ(4O5w15m1?y*dnZwsJWs=NyAi|&7*+`cU zm~Qo4CxNX@$?ne5P4jc>z{c7!@4ETAe{$XMF@C6cjH_u4HK)x-|x2_%} zTrYn%A?9CYugo9sqK^>#1UbH6t`1q~xY^AMp5%d7Z^z=$45>Ew%AV294(-pDHW z>LioC!9KFBimQXlEV1Ajn&U>pQD1Y82CgJ7kSh+Vx;8sm9@`lOtTeWEN=Z6<%JpP4 z<_|_DUYF{~_hWQGva5t+i?2#1=chO8Z6T4_(G>(h3zSjhoaC)8Hai!0Y3&d6+wNvI zn;9+>y?FIr&9xEtt9s6a*t}b5zc~dPKr<(E66(A^i7fAKuN7lZ2!e3aP6{`!ZI+v> zPCJEacmbp1n=dzW@;ijM(R;%u&rxX~dF}I?f6WD~k34_?-=q1G^^KxU%Rf_jTD@^j z$Wui%9ht~)yVcLAsVkm*x8DD({&>aGmZa|*pssfmu!LFysnGY%Bybvs(L>7?^v*eA zuwTY}>G3-**_uZzjHs@R>wFWDjQeM5r&uw{i8`oX#}+ax`{%g3P63|p&0X>IGxj}# zVXYS7$G=_nQ`JHa32Fl9uj|`PRRg5u)95i{@M2Lc?uXV-q~l&V!6c;|0zJIeHAYeK zeb!aV*~%-u2m%Gk@H)z%zh<>nsYwF+kgqDZ$dpsv-p)<{fSqN;Kcc8u$l2lLvh34iMa2CW$;DE;5`W$2=ly3k=+v3o zq{o~q!iJ8YeY%Fs4;~tTl?0d>nx0kaQuxU=dY3-t+amYXmKoL~0xr3lW_#;}%qWW_ zZ~Bb;U^W*tslT|sc684et}nYxxXnuV%9Y&0-}#a%j}LwyL^M9VooxGZGy++|ayuEH z*?MhY8`@USefDFo)gg0n?$XlDjtQvVTbM6Gr2Gm$19#Zv>slTlmUCo_Ax3%?oy>-lB!! zZd8^MCY|>StV6<*i`~Ou`@pKhs=J2W78nFH**$LL zo>&GPFtx9AdyObf-;c2=wN1M!?$rb-m=b-6*BM{&ld(;@Np00RJ^7Ek;uUbF!G#_0kfQa%A>#GHV!SziK6USJ^zzO-B>O0)(qGAvA|{n@P)2tr10Da=oJ8=pJGMGHjZ*uj%7c0~fv-r*{rPS4B%IxZj_eqv_U2J**YScox4i!{oz)VDeW}y`&DLH_#(P}<`#RSL0m%Urt2?TY?*e`vBeHwL+Spa z;a%jML1JJ;MTot+SQ2k7&mhm970*}8&s#2g;E`(gXz3l26)l1`QOMR$iyab}nF~#N zYF3Ibl$-Qm^t$Q2o}c_vKz!_Oa@{JsU45hh!mIR`K)gSo zg#x$ONcGM6z0A*LSAZM_Sd*i8%C5B)ZDOCVp=;;_J?PiQJe5=479ywmh*O13l!df9 zxGPz`=Oxe=m5w#u2G7{E(&t_{*ewS z?!tFO!~?qtDDt-_sEkf2znwH9iZC;!qBthDuHphfaex}3%~Mxp@k1I#0=IV5jAmzV z`bol#ssC0jcOQTn$1;CI#e(1Baso)9<{s!;oUy5<*~*=xk&niQ=MD$R-@awKYs@|r zY)cahK5C{cRjZ_o7${W2>>RP50J(^kL}J`QYu(dteXTc`MfYtcsFUGL{w!M=Bl$ye zKI^&Tf2ww}^UB&kp{t|JT|g14XiSjeydu)}9uCxcE|q-f@BRI`_u(c1>8qNXNJ&(d zX{!P}@jp!8|MY^iUN8J|n^|?OI(VuJxc!SFX!*4SRMMcLYZ_tI&BC1Sr}crmrOuTp z>S616MaH18)Scx~)eOFTB-gT5+pqBmchf*%LUWrBAUGqu@G8D&^QQv8j;@83D>V|? zF-{BJA>eca20*t(5yQviI94g0%k~IY>b{2MWEKn(chqy!JE}Qw;=rrrR*V>zhzZsV zuPWxsGaP)-Dd@1_f$v6^Q?v#y*9SvF&_SYo?IHbYPEgngL$2Z(Z|%PWMY=W^f46JV ziIW}K3f(%Hm{ZsiPvC@h^Pq|fqcRy|K>+pdL6CD zvO-G^dbHI^zUpXwAkZ?(b?j`#4Vk)H=Rk*P+!TFY+8Uluc!N^w)_Wbuu%j|ntvwJM z4=i=|B}_5IxrDm=!k?qcf>$$c?c>u{;E7YmbOAb6J)^(*Uh@5JNb;VP3};JBXaO1j z7@VB&}%Mgy89|*9HT<$=qLi4NkXEz`@$vLK|7cA#gBCKh5$VN^90X+-7n#J(kJl zg`YSRz~Kx3qTvSB_taIM^pDO9CPNdoBspc0~G*x`Zj&Uq06b5 z^;JW^R%6mVihv4N;Knudl4=qvr--T1*nSp1h|4PKpH>ln{_ZsD% zG#2K^I{TC&s*U@DJPKxnwYOtSYsP)aXi8H)UBz=;*K`&0%p-}P=)E=`WOSw((mv<+ z8kS1}T{Ogb0EJs7o-WodK;;KUDvPYr#udqVLHrO(yz?r8If^n}eT*-+S!aotI;s}- zUt60$HZIC!hgWslZ1xq}MBvCn&Scxoxn5gi9s3?s?4IRe2(Mvd1y+*} zQv=S#cu|HDWhLr;oY<(sYdJ(7jjaq~*2$UD-)z8ZK9s14tNBOi>z9+6G%(vOv6=ErS+sh+hk`VNIs^i`3u z{3eh|gqhHaxVxTqfKvwABqvYXSu_DhiA)}gO#w^w{=Wh6|hOU3q(1v=KC{ZSt#LE|3|14_FT|`E+gFE*0aPXNZdYg4V)Xx@mA&e+qL)UY zook9^`?mL4{8dynj&E`EgE^h+X<_HLd+JlCz>%1Y9o+W05v%2+NPfo!8!VCoEuOkB zKG=7wdeD-DdALO(4WiC-)Q<%IU}4{RF?HrQ+n0e%+}88n`}Xe($}s9Spri>k!Ye>j z$Ho!@GDk{FuPu^;~w~oV#Y~+_Uw0WAi9n0?9-^Q3oy|qANoXRz#fUbRGoDrEP zNZwBR;IVtskY*nEc`wF{>AvQOQp@Z_AXE6T#YB6o?^0z2^Tx#k098WFS}0X-dy-O! zVt!g_8xl{B3+DfD3eoa9A^fMMcQDDjDfR$5;xR|loqj6|fz(Bii)q*hnw zScIBi%DBN(YtbSJ`3R?ImgC8tD^r@??xpK9fLTf5BKKP!&n0N_bfTwv?RT`RWiKhh z|A6|m)OiwL#S#lA1#EInJYW< z9Lq)!h9tdOVZUCo730TOJZU3s*_gP)dZZa0=zhZl4SP@c0&5tV)fB4oh#QZA9PH$%}?wtB^goY|vD~d_uFyU!vXJ* zsYv?ohZyOm+DpZHR?f@8QdnE6sSJR3S<_l$X0sE@MY8@ph1?X#uB(loJyE>>kL}nhywXa^Ib(oV>K6^!eYn60f9g zh$ByJl!`Y6fy_`B3PK0Y4ImWXmNb-JDJ$8upO|ICXV-|flPzCDQ zE8L$#a{=5-;l=n5V92%tbwFnQhc-(P-Cd&5WAagAGu6hTo)zzQrhYVH`qvH6I&D~* zk^(NSVI9!whvjhtN4mOn8I8gdedRypqUwCoKcoDh7%#x5Zv7d9o&MuGdRKB-PyeN@B8=d zzg1hiTYI{`?yl-nUHx^R+vnWxp4a);H2|)xq>Lm04h{f-`?~>NmjIstsL04D$VjLt zC@5%XsOXr4SeO_Xn56gwIE0jBKq^Wy3JPlacTCi@Y;+V9Z$C1#z5l??%?)JY7v|#> zddJ1h`H!2xp`oE+VqlVBVUcjsP|$GxU)yUZ01p+839y0yM+<<*gG0cBd+h-L|2`)Y z+&>NQ-wh5P0TBrq1r-e)kkBjF|ub6SMy$_CI(n0x%Ka{(d|JJOBuA`|vjRJNiG7#|==F zAkBskd;1s6IOrB|7NZU?oab9qRLEl!Y;)UAOVNX>>FXx3%$lF@N)_lAw0>^eR3LW6-wq z1<5Aop=9VKVOsO)bJWF{El96^iSWEm&e;Zy#L!<;AgV3&L2a^(l)}|PmH7ZFMYOhL zes12AY}CeRVcV^*YaUDI&l_;u^lNjmJqQ7TXbp&^|AKcK=De`d%xOh@N?ErjCex&* zRFpHIBpi*BdYhJ(Y)cJ3VUW%hOLRBL#&NRBs~%TY&k<%6g~D} zW-&NB);&e3*12+{y**p6fN{-~4spkCKAAZ8n{S@aKwY&Sf%E&CCd~u4c%}PWYx>#* z$DFT#NR23!Sf?loPk)??O62$Ap56a+PB4tb-kYHFEE@9r5T>tjK|TzWp}J4y(&MnK zv?iwa$x?1w1O=&IN^LE?xc>35*KMA)Ieupr_l9$ro|E1&7MkRS?F8<+5I)pUQJUYX z49p+`Q>qeTOAzIZ5GqOl{v8tBnL7ACfvhab(Aey2c`y&hrkO zoyMyiRTySXL(W3F|IijR+U!(UGHN{dkNk0!Qho)%ZXtAg4D<;L#icSmv(D8pRw;g8?MZ9AydB$vyBty%rR(px}B zwRi9APS!Q-T*>b@m7CPG6CH}?Fy+2ow(Wm@xf-}+%Tqubl7)a;XkP(}(c4$w2Q@MjDE`)p^`i{p2nx{bysK$jSOkM&5$5e)MbkM z_XzmMIg`~Tkfch0J+LXmdx?2O=~HyF31=BlRPw`N=Jozc+4u|XAQJS~)Hq)V7%opY zJ7rs)T!m_WaNL{X3c1j;H&2UmJJtM`m3xUr6Q3pd$ve--EUR5TH}`kPO=%^s0O1mj zMN3n!&}6O;djfFtI93|j_i!MO3+qglfzt}j8MnQUW4GLqj!=y_57J^gKbLOGgYp{6 z7KL+M=43K>yYy6{%~REEMj809cH4HHC^^8VU9VJ!wB=cuTEa91`I#`?BnK2iI2XAS z%R^>iwDR$fJN;0LrSHbdhobo4UJw3)%ZvA5s-QTHTbk=q$7*-xbUaaVGS@{3mVTNZ z^FZS#kv|ICx}Oz~kM(>{ChK94vTo1H#a!OFtks?-alcScU*mhD+H}vn4h-!h>4Ph6 zmuA>eUc7r^4Y(32CaAu%=c8@$WIgMW^hSZ_f{tF208 z@HV%euj`)~=pR|=pWp_hz_$K;Dp#(c!gQ;&FJj}*OUjg{8Dv$F-Y_4OJocY4joCspO-Hj%)ud)G!s{99NlCXamm4G`yU|_s@=pVbQYf z*1~Eqhu`7@MBx-z>%poPFgu znca!}{pik1h+6>>>RQ=IivR#NfRZ)qOk%`66KxV={0%WNwia%s`Vv@Tle$-yV-dyw zk;(1v;QN3?s3`iMKq(-k`USTJBI9vuJ6EkwjZ7}5!R&rX1uqx2OO5y}fsJ#M0 zE9LVx*p)xQw6D3JA% z3=a*3Uo#=x!zdIf%R8N#K(Ua+->_lV4R&E^%+fyNzqJ5j^c)f94HoxX^#L^(-keZIa2!U8G8*MVFzxlK7v#ZO8t4=f3 zq@4^jVm-qsN}jN>z(lJN6LR!QjP#N$-4kJD^T}V*oc(8PsHCg7evg{=8* zDB7XVDDJI|y#kmDD0=7P*G=OWtON>=o|{S&;ADqJ8p!xpldl%(1)t$J5 zz^zHj$YnURK>$ zSUs^>ze9k9tSHsfZ@?O((C~L+lmn2Z_3TKV6w{_yx+vI6Lu&+)3Nj#00bqPTM`v2M zBA>P5_)yFbPHvk`FP0SjJ*UClnw2S2EW_?Zjdz5+Bi z1SMVpZVPGmvFgLvyBuxCOIPDWcYa#Uyv=%0V=$l64j-eMZC**|@j&Sd^_%t?d%`zs3R~AUZ`!DIo~cr^jA;yG8Gy2n2kkup)C#8 z@15{C;w#~&LM%eWISB7^9_5z$>kob+wY{#9p zFM?t8o%Hejb(q*Ipk|J)_+@<2ET?!yuf5GP+L23EMLeI`NQTnqkkfu)YQnGdoNe>@ zPy#eq=8|JOWWYegE6pX2L27k!Q6*`kAy_KkD z&$$dxt$#~m6A&Bs-bvm%uijtK+M;4Zx4I`Rq&*B7@DvD;`_}|YY+r&9ZkGySGAej8 zi)1ktN*_nMej7Ow@!^U-x~mBk@?bgrWGwXCk@A4O>%p!M224hILDCz8IY!EGD5`wf zPR?kl*`@YH$?BO)_qI+Il%tbsGDUo@>d|hLlw`VA1qFUi42to+-%`7{_q-mFx|`JS z5q$+5&V4d27D=hl)b9~BHT*7*Ky`Q*5w>N&{V395&+DtEis@yr1>D#2EVkrMneo|z zmv|@{HJBZ%^C6||U&{7BSQIsgb$8j?auBZad}bLzKPaVacux`YAzniSo67Bnv5zTJ zin%-f@YaVNM!KCvA5PRoAAz}VxHuJZ5jxG-dcW$DL6OdvcagorQkW>iYOFiIIEks( zj#a5Q>6&s_W8%H&a`F(SY6+B9vr}Z#U98oBk38lbA=?eK(IeaiWCIKL;{afEHqsomWVb#k`Xrq^GZQOFG=Jd7kfJF zy>9zzMV20-D}&YUfbA9=S$2nsetk;F!WhrfJF>)9F*D4Em}GM$ zA69FQmTNW!3rYvFFIk&JAo2C_KU;iJw)nErLOW~zN4Q+{lI=iY5)7Iu4;yZk**Mox zyTu*GjG;m1CoE&dl^GCZd9oHt4J4K7mz1yc_HD zCI&a(M9l0ufdzU~M_aXZs+syC+b`gq{kCx>6obFzFMy>jI_N6n|8o|??<))U80T+FP=+SKYt)Qt*@9(EqfZ;!x7o6aBkAH z@g%hH(mphHUmp+UZbMP_Lyk1$$VL<{ScvE=SV|0!pTEHIj@7G8z1#eTMOEaKA2ZBM zdV&hM?FNxtuMm?QLs93H>%YO*MX9M$r8TYG1zhL($Xia=l}G1ZhV2;E^4fC>WIWEF z^do)2Z@lS0OzoR&e}AW}0%vE(FkN83-u(5Q->OdZIMKr5fq+{cuGg1g>*S@JFjWIT zI*HJq+j6UYW-QR{re>(eHv(38I%;#Q`DbCDvK-zj^W-Fvz=qKQnQ=<*x2Kg_^W7yVB2)o_ZZiVTiE5V>|iz@1s2=q&-RJ*oU>S!{8?R(VcA zoC@bm@)?fGCt)k5mc|%~W_tY({(;JY-{1h4>R9=fZ?v}eRhGLM@?)DG;(V;9Tr_Ri zTvY3(r@=CmT52Z?yM$k)Ga98KURt{hp0~iWL>Z!ysUg~68%8xYRe5qirdMjq?%>wF z*ubY5?CX@$A%)0LCVq*(^K9?g9otgv3A4az9wlW?=NMZv z!CYxYZU-Z!QDGnP0u zL6R+&JgD1mu@)QE3X@@K7WlP`WiZM?xi8?GP(f5To7djrW(+2DOwb0y^{w<*`uPg? zI`w~7Fcf2N`!Q&9nJI6*;!EMpKXvp|orhC}Y{%HJe26JC zH{@2RQv6J^rLv0&3dLL6qy;Y-H9WSOcEIWVSW|%4vq&AXB3RZQw`G$fXQ5eKAVnnJ zT8nBVIzgUV{*H-v_FhD>*Hm{;HfoLxtdVcrv~J|xa3!$CzP~)vBnW zZXQ>R;aB1U!3fwZoqO&k1anyC0aNfw;8 z9xz=WqF6|eIP6nQlCvY_)o>RUeH4uTWFH@Dil?!-PEXS9=z9J3{1g03&eg^gN=Lha zt10!^O{#oNl#yrAkh-$CwAeEmfBBvQPG1d+!$8D>t;ioRKwDjTwS+}3-_|izZWN}W zm@Y*Yh)+Z+gneBbrd30@G=CxIWZ_Mei^Vej0xHyB<$vs+f$=761VSgXL-xXkt$N0t zDVHS8bgq6QeR2{p0HN=?+A8g8&J=buIZeqfH601UsV#qeqJvEot)_nU@ip?xF0p~3 z<;tmR*Uh-LSckLo*cgTscgvc_4uZG@)9r2m02HEH$KKZDmwlokE8Y&nHavgXW6b<# zP!HJw>C^DH&AS-jh)PYY_4;3_&EPH|@5==D4#AbF>5GZ_^!F|Fdyy%#>KXP*WU+=6 z21LJ_-yH=$S`m;RzqX|Z=o)#-v8{%cWZ&l2asJP-oqd&!t>3@6fA$IpIE8H5=t$?T z{#li}SHBnp1$uC1e^w#w`i|^VR(aP@o}t{^>>G$-7t{&9{4qUZ7=ttE_zLh*XHlz8 zgZ0b3UC{Bjzs3jN;9Qj6#M-1D4{WEyU7@pVl_cwUmb|D8oJ|H(lBWh31!b)tR_OQD z*Q?2p3ym=KLH(j<8hz@pIr`4Z{1&dYho+*@&MpRP~FxZho~*~162cZt;H0_u#jB6MeWeXJF2`Vv6B1_%fYDMYGx?b(%M@JI;o(JqRR=^#xEA-Nwps?_6RU0uy5s?7#i!J^6!Bv zC&+eML13Ja@>P!dU#$|XY*HvF^b{pW9zs;tLsnX|V~zFp9%8tVZPE7#?@5_veso?9 zR)BCcwe|Ktnr@ zs&R)pP4>P5B&J z;5CcMsN;7udm6rVVGJG!{`n5w$n8;QKDRf~Ke^N5oJMWJ`kxEP6%MexufuNi1K(u& z1r|WrM=Pd_slqz>o;6^<79vdx#%{viR>(W#hP?&+3#Fb3PXc;r&OQ!~SgmrbKm#sy z*70^WD@GjbPlbKbUi%JruYgR;Ap4PHU?gKdk-Kr~1z3!nV51f_wqQ~whNk10AHO|jeiy#&h7W7tk&-Rf*$ao?&PVq?^Q&xq}(i| zdNm1(+?g_JOFAM(HEB;~2?!)LXr*uxkGdb_2!FycFT8V-GtwmKt3lISc`*nZ{f^+u zhJpF8wOQaYacBL4SJ38_HV*w#vJz}mjk_dfPDjc=NZVu|A}~5BRy0fyu1GezU9vp& zfgW@7hrggZf4SDSoAhGqbG|(z_D*Jo){l{IskMJipRM(tprpgJEus>be z3XLR(?6CyE0pwJgSHhnP>R9vbhwG+&}K2mFZVYq)+fTFKu6MxO3Y!W5ec* zVoat&c;@zo|4~x;ms)>eL_sWIE3_ume z#*qE8lu5CdXetzP^?P+T)#DvAJyLDz2VCok6PKI1mdx28O#C{(?;z$Um69jx*ycL) zsSgzIG@g-&G4`Ej+X-H;M?dw;9dnn-njd4_m$+%1!g9_X%^GZOb&G{wBU}Bvt%u5Y zAn7~}YawM<8xphnX%ob^p`Tm)3LsE{k|Mf&#VEaxsD|$c*ck{sqm}R68!YYdODM?i zMy1#-8?qHHdzzBp8@2car|Q&C=&dgIOb&CEOGDl-sn{`5Z3l0wU-KW6>;6y)3bwk3 z1US9ZSmVNm>pa!ENlLu1!tcj8QIFKY&3~tIOpX8EgLSI4m65kXtCTY^X#}RhryR}c z&aK$<5%;U#c6yl1jSz4mwP5{d-&bh1?j%;BS%oSexBJQrct%#gze7i}#+fhFrb5WF0U0J%07H-!+UNh;{`qiJ!;uJlvV=sF7$3fG|ZNS^ib-g~{2v&ydv5 zO6rr|J>(lD3!H0Fk&lS5PX3{MH|uwrJ^XBWY=5lgB533-SAgl#BKh_S)1%j@D=Vu`)uK;TY{jIJR*&*0bGbqY-aJ-`na z6Ac*ijKm00VHi3wxvQ1GH=I%Q)leT!Tjcbx@4UWYnrZ?c-{>whQ84s;^*h~|liI)` z?Jis%Hnp|98H_Q~J%+xa;}gP{$DyMzk6&!0+0af&{bDjT^)~55+RO~^G6q?F2M~qq z>0Vy+wy0@AGE(!CE$Ony6l`@$`dTtpH4SeNcrFv&tm1B%4m3X2)AbV4UnG`1QK;1# z6e$1h-EUyf??~15Uf2tk@%-HTyri=tJw5h3xF?Kas&Dv^I-2QGw=Z#2MmQZs%&)@9 zd8=EL8#{Bo=Verr@Oe9DK>>ALerh(e%(zqwrGAF^0H?Z2u+S19mrvymbUH|FhCJc~4}VjH_1h;Sli*DQ+&~2~l*@@pAM}D7 zQ*vy3gd&!HMQ}!(4?K&OKBN)Y6J}o$_$$<672QVb5%mEh)v?a1vL4aiF7ttty@-}NOu{cT1yTaG(w(QF;Opk$!UG9L+sQF``fL7ikzl5*3ON~VV{djM!G`L+ zc9gRj_jsxDF}Q}vTC28|-+dQ?08fN5urQKTadf>^!<_J^vEK@%l|!H_vi>R8vK3;t z#K}I`<2k>e&ZfT)PUG&O_Jg7SMIVS^nDec=+T+m5;6wVQoE(qI=d_n zx*YfD2FVWHcD-aw{PPBH<)!hRN~IMcz60REx^#m3v`RD4b&0#*IqCou=m+-@uZmO> zX{p7_)4Bgef~dOh-*Xd@o_33e4t?$Ch!vuAcs~R+*0h-o4<3_7d@-7Mi}&27DH9Ho z&Vh;<3qlCj**H8Yiw8SiN!x{~GH4IgFUh4B2@=CK#n((kRJCl)z9sL{ushYvqJ;C| z)g4*Hgy8&HQulG_?AwySFB|dEz0pi(z2J+Lek4;oo%>6I!8d}1v0CpCq6Iz_bcp(+#=wr%YHsd12+$&t-1 zO5^hA!`*CYkvNh9jNa`^kR0bSJILkrn6(0V5e+bK0@BJh}6E}9q#>gnd$9gre zkv$EmH7fPJ;9|uQ$HFhM7@!m#c!;t>4H`~#e1SNSc=7T-^d4o7E_vI~MHX z9=J!uZe_E5{-`|wceSp5!lP2-di>6|)ff9(!KZGir&x!?)?3xSP`vx&9j(O{sq%fm zf$#yz^pRMM$XZx-i6nMidq!E|D|Y45G7SY zr}o_KP0*S&2EV#eHQx4Fz(+M~vNL^RrdWaY_rR#!ko zYGOdtDP#h#DK9K~tWmq)9F>IVaKJlVUYgCFhNdQxlSFr2uFH7L{cHw1Uv!a9=i+Ix zbwUw4;fknqjMb|!tgzJjC3Vys;nd=EFkUb2wJncj&SE7c$EGUlX&246Ok#(K>xt_u z;gZ^URx-2uqY^vI`OPp*6tRg}pMwgfiHV6nh%9#z^CEY&U>vysfthB_1}`82cmDUd z%}qHaGkdgTB5!(w8~?H7;Zc3L*z=}$F^azPm!eMFa^p|8)lKb1@iLC<8E)Xkn^T3v zRTwc+L&DgE*IW85B`@@PR0CA%fMu6r%ZjlOm53K&LPaqeG5YT)N}lL(U1hY@nzV>0 zp$&|lxL{zg;++~KqhQr)1S_9yGCqLIyBM@4Rk@y8>$mQ;#41)AKmjXot1T46NQYO6 zN*SjUB5Rk?y7`dcDXRm~NA8SI=%q}gzJsE?Z48veb?NfRg#&lY8A#vx6S8QfXAkl`6VRo-~>w;sdscpo6TIr zB!bZE`tYg}FE)IXwJu1_+>G-*zjyV06nM8%1Ug9~VH5qXz!NIMl(X+k4a;vhE0aB@ zaE}Kip#_F24ZQ-u&SLb$fdaWdCqy>C&Hc|7Iuv$@2l*G6W+6IkPAZ;F)G+$-%fw4UmlX(`r;Jl; zUII+AUtQnueBsyE7U$0;5tJr1cI&D896;1k)A%#`v`_TuL6x@nZm7(720>pYK}`u2 zk*Ysdvq6t)@>JfAdr1?gBn06;OpP_GX$?;N3g8au?#g7Zo+>w&&=r6}PW(bLWB1&!n>CcuXcXGH! z69+#(mWguR2dFNsn_k&bVQDd#Zfnr7;^ZjDN(2>|y9`2}fQIG>TH-Y!1y{kXz!&Qvwr!)*FZ!lJ;HVn5EmDh#ibef&0)7TI+s~I^rPG}w<#Q(Ru}D$-3jhl|b^Op({K{ve zC#iw6rAI&v7ifQ)mpfC{V#iczpU%KVl6%7K&?#&5M(i+fB=zeLSX=I&^*_Oe)NSQ) ze;2rg8I7N+wd&i+C(G{}rrEze+#6(#?1ZBT2yxEIx3?K2COVJwzkvI+uOZR$cdih< z1j{Kw>2YON(+(QFfzsj}6(ocz62b#Frj+!k;594`8P`J>mSr-h8f gPIx5uUmAt})i9I|AMtN}e -
@@ -19,8 +20,8 @@ \ No newline at end of file diff --git a/src/components/Layout/Header.vue b/src/component/Layout/Header.vue similarity index 85% rename from src/components/Layout/Header.vue rename to src/component/Layout/Header.vue index b5dcfd4..195037c 100644 --- a/src/components/Layout/Header.vue +++ b/src/component/Layout/Header.vue @@ -6,7 +6,7 @@ > @@ -32,8 +32,9 @@ 检索 + >{{ $t('Header.search') }}

@@ -55,7 +56,7 @@ passive-type="is-warning" type="is-dark" > - {{ darkMode ? "夜" : "日" }} + {{ darkMode ? $t('Header.night') : $t('Header.day') }} @@ -69,14 +70,14 @@ tag="router-link" :to="{ path: '/register' }" > - 注册 + {{ $t('Header.signUp') }} - 登录 + {{ $t('Header.signIn') }} @@ -89,20 +90,20 @@ tag="router-link" :to="{ path: `/member/${user.username}/home` }" > - 🧘 个人中心 + 🧘 {{ $t('Header.personalCenter') }} - ⚙ 设置中心 + ⚙ {{ $t('Header.settings') }} 👋 退出登录 + > 👋 {{ $t('Header.signOut') }} @@ -119,7 +120,7 @@ export default { data() { return { logoUrl: require('@/assets/logo.png'), - doubaoImg: require('@/assets/image/logo-2.png'), + Img: require('@/assets/image/logo-2.png'), searchKey: '', darkMode: false } @@ -150,7 +151,7 @@ export default { methods: { async logout() { this.$store.dispatch('user/logout').then(() => { - this.$message.info('退出登录成功') + this.$message.info(this.$t('Header.successOut')) setTimeout(() => { this.$router.push({ path: this.redirect || '/' }) }, 500) @@ -161,7 +162,7 @@ export default { if (this.searchKey.trim() === null || this.searchKey.trim() === '') { this.$message.info({ showClose: true, - message: '请输入关键字搜索!', + message: this.$t('Header.blankSearch'), type: 'warning' }) return false diff --git a/src/component/Pagination.vue b/src/component/Pagination.vue new file mode 100644 index 0000000..f4d64e0 --- /dev/null +++ b/src/component/Pagination.vue @@ -0,0 +1,101 @@ + + + + + \ No newline at end of file diff --git a/src/i18n/index.js b/src/i18n/index.js new file mode 100644 index 0000000..2f6e768 --- /dev/null +++ b/src/i18n/index.js @@ -0,0 +1,10 @@ +import Vue from 'vue' +import VueI18n from 'vue-i18n' + +Vue.use(VueI18n) + +import messages from './lang' +export default new VueI18n({ + locale: 'zh', + messages +}) \ No newline at end of file diff --git a/src/i18n/lang/en.js b/src/i18n/lang/en.js new file mode 100644 index 0000000..7a61f19 --- /dev/null +++ b/src/i18n/lang/en.js @@ -0,0 +1,115 @@ +export default { + Header: { + homePage: 'Home', + searchHint: 'Search for post, tag or user', + search: 'Search', + day: 'Day', + night: 'Night', + signUp: 'Sign up', + signIn: 'Sign in', + personalCenter: 'Profile', + settings: 'Settings', + signOut: 'Sign out', + successOut: 'Successfully sign out!', + blankSearch: 'Please enter a keyword!' + }, + Footer: { + slogan: 'An intelligent community system for XD people', + admin: 'Admin' + }, + BackTop: { + title: 'Back to the top' + }, + Login: { + signIn: 'Sign in', + account: 'Username', + password: 'Password', + remember: 'Remember', + reset: 'Reset', + blankAccount: 'Please enter your account', + errAccount: 'The length should be 2-15 characters', + blankPassword: 'Please enter your password', + errPassword: 'The length should be 6-20 characters', + successIn: 'Congratulations! Login successfully' + }, + Register: { + newOne: 'New Account', + account: 'Username', + password: 'Password', + password2: 'Confirm password', + email: 'Email', + signUp: 'Sign up', + reset: 'Reset', + rePass: 'Please enter your password again', + matchPass: 'Two input password does not match!', + blankAccount: 'Please enter your account', + errAccount: 'The length should be 2-15 characters', + blankPassword: 'Please enter your password', + errPassword: 'The length should be 6-20 characters', + checkPassword: 'Please enter your password again', + blankEmail: 'Please enter your email address', + errEmail: 'Please enter the correct email address', + successUp: 'Account registration successful!', + failUp: 'Registration failed' + }, + card: { + post: 'Post', + posting: 'Publish idea', + settled: 'Sign up', + signIn: 'Sign in', + changeBillboard: 'Change billboard', + changeSentence: 'Change daliy sentence', + promotion: 'Promotion', + detail: 'Not received related promotion!', + sentence: 'Daily sentence' + }, + post: { + author: 'Author', + theme: 'Theme / Release theme', + theme2: 'Theme / Update theme', + enterTopic: 'Enter the topic', + enterTopic2: 'Enter the new topic', + enterTag: 'Please enter tags, limited to 15 characters and 3 tags', + post: 'Post', + reset: 'Reset', + blankTopic: 'Please enter the topic', + errTopic: 'The length should be 1-15 characters', + enterContent: 'Enter content here...', + hintContent: 'Content cannot be empty', + hintTag: 'Tags cannot be empty', + views: 'Views', + edit: 'Edit', + del: 'Delete', + update: 'Update', + latest: 'Latest topics', + release: 'Released', + view: 'Views', + hot: 'Hot Topics', + star: 'Favourites' + }, + user: { + score: 'Score', + join: 'Join', + bio: 'Bio', + topics: 'Topics', + blankTopic: 'No topic', + settings: 'Settings', + info: 'Basic Info', + account: 'Username', + name: 'Nickname', + avatar: 'Avatar', + submit: 'Submit', + email: 'Email', + blankEmail: 'Please enter your email address', + errEmail: 'Please enter the correct email address', + phone: 'Phone', + success: 'Profile updated' + }, + comment: { + title: 'Comment', + placeholder: 'Add a comment...', + submit: 'Submit', + success: 'Comment successfully', + failed: 'Cannot comment to this post, {0}' + } +} \ No newline at end of file diff --git a/src/i18n/lang/index.js b/src/i18n/lang/index.js new file mode 100644 index 0000000..0567432 --- /dev/null +++ b/src/i18n/lang/index.js @@ -0,0 +1,7 @@ +import zh from './zh' +import en from './en' + +export default { + zh, + en +} \ No newline at end of file diff --git a/src/i18n/lang/zh.js b/src/i18n/lang/zh.js new file mode 100644 index 0000000..9051eae --- /dev/null +++ b/src/i18n/lang/zh.js @@ -0,0 +1,115 @@ +export default { + Header: { + homePage: '主页', + searchHint: '搜索帖子、标签和用户', + search: '检索', + day: '日', + night: '夜', + signUp: '注册', + signIn: '登录', + personalCenter: '个人中心', + settings: '设置中心', + signOut: '退出登录', + successOut: '退出登录成功!', + blankSearch: '请输入关键字搜索!' + }, + Footer: { + slogan: '只属于西电人的智慧社区系统', + admin: '管理员登录' + }, + BackTop: { + title: '回到顶部' + }, + Login: { + signIn: '登录', + account: '账号', + password: '密码', + remember: '记住', + reset: '重置', + blankAccount: '请输入账号', + errAccount: '长度在2-15字符', + blankPassword: '请输入密码', + errPassword: '长度在6到20个字符', + successIn: '恭喜你,登录成功' + }, + Register: { + newOne: '新用户入驻', + account: '账号', + password: '密码', + password2: '确认密码', + email: '邮箱', + signUp: '立即注册', + reset: '重置', + rePass: '请再次输入密码', + matchPass: '两次输入密码不一致!', + blankAccount: '请输入账号', + errAccount: '长度在2-15字符', + blankPassword: '请输入密码', + errPassword: '长度在6到20个字符', + checkPassword: '请重新输入密码', + blankEmail: '请输入邮箱', + errEmail: '请输入正确邮箱', + successUp: '账号注册成功!', + failUp: '注册失败' + }, + card: { + post: '发帖', + posting: '发表想法', + settled: '马上入驻', + signIn: '社区登入', + changeBillboard: '修改公告栏', + changeSentence: '修改每日一句', + promotion: '推广', + detail: '未收到有关推广!', + sentence: '每日一句' + }, + post: { + author: '作者', + theme: '主题 / 发布主题', + theme2: '主题 / 更新主题', + enterTopic: '输入主题名称', + enterTopic2: '输入新的主题名称', + enterTag: '请输入主题标签,限制为15个字符和3个标签', + post: '发表帖子', + reset: '重置', + blankTopic: '请输入话题名称', + errTopic: '长度在1到25个字符之间', + enterContent: '此处输入内容...', + hintContent: '话题内容不能为空', + hintTag: '标签不能为空', + views: '查看', + edit: '编辑', + del: '删除', + update: '更新', + latest: '最新主题', + release: '发布于', + view: '浏览', + hot: '热门主题', + star: '收藏夹' + }, + user: { + score: '积分', + join: '入驻', + bio: '简介', + topics: '话题', + blankTopic: '暂无话题', + settings: '个人设置', + info: '基础信息', + account: '账号', + name: '昵称', + avatar: '头像', + submit: '提交', + email: '电子邮箱', + blankEmail: '请输入邮箱地址', + errEmail: '请输入正确的邮箱地址', + phone: '手机号', + success: '信息修改成功' + }, + comment: { + title: '评论', + placeholder: '此处输入评论...', + submit: '提交', + success: '评论成功', + failed: '无法在此帖发表评论, {0}' + } +} \ No newline at end of file diff --git a/src/main.js b/src/main.js index 9fa1621..3e242ff 100644 --- a/src/main.js +++ b/src/main.js @@ -6,21 +6,30 @@ import 'buefy/dist/buefy.css' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' +import 'font-awesome/css/font-awesome.min.css' import '@/assets/app.css' import router from './router' import store from './store' - +import format from 'date-fns/format' import '@/permission' import relativeTime from 'dayjs/plugin/relativeTime' import 'dayjs/locale/zh-cn' +import i18n from './i18n' const dayjs = require('dayjs'); + dayjs.extend(relativeTime) + dayjs.locale('zh-cn') dayjs().locale('zh-cn').format() + Vue.prototype.dayjs = dayjs; +Vue.filter('date',(date) => { + return format(new Date(date), 'yyyy-MM-dd') +}) + Vue.use(Buefy) Vue.use(ElementUI) @@ -29,5 +38,7 @@ Vue.config.productionTip = false new Vue({ router, store, + i18n, render: h => h(App), -}).$mount('#app') \ No newline at end of file +}).$mount('#app') + diff --git a/src/permission.js b/src/permission.js index 81cc692..590360c 100644 --- a/src/permission.js +++ b/src/permission.js @@ -1,42 +1,38 @@ import router from './router' -// import store from './store' +import store from './store' import getPageTitle from '@/util/get-page-title' - -import NProgress from 'nprogress' // progress bar +import NProgress from 'nprogress' import 'nprogress/nprogress.css' -// import {getToken} from "@/util/auth"; // progress bar style +import {getToken} from "@/util/auth"; -NProgress.configure({showSpinner: false}) // NProgress Configuration +NProgress.configure({showSpinner: false}) router.beforeEach(async (to, from, next) => { - // start progress bar + NProgress.start() - // set page title + document.title = getPageTitle(to.meta.title) - // determine whether the user has logged in - // const hasToken = getToken(); + + const hasToken = getToken(); next() - // if (hasToken) { - // if (to.path === '/login') { - // // 登录,跳转首页 - // next({path: '/'}) - // NProgress.done() - // } else { - // // 获取用户信息 - // await store.dispatch('user/getInfo') - // next() - // } - // } else if (!to.meta.requireAuth) - // { - // next() - // } - // else { - // next('/login') - // } + if (hasToken) { + if (to.path === '/login') { + next({path: '/'}) + NProgress.done() + } else { + await store.dispatch('user/getInfo') + next() + } + } else if (!to.meta.requireAuth) + { + next() + } + else { + next('/login') + } }) router.afterEach(() => { - // finish progress bar NProgress.done() }) \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index 736f45a..52c5cb2 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,140 +1,87 @@ -// import Vue from 'vue' -// import VueRouter from 'vue-router' - -// Vue.use(VueRouter) - -// const routes = [{ -// path: '/', -// name: 'Home', -// component: () => -// import ('@/view/Home') -// }] - -// const router = new VueRouter({ routes }) - -// export default router - - import Vue from "vue"; import VueRouter from "vue-router"; +import { getLang } from "@/util/auth"; Vue.use(VueRouter); -// const routes = [ -// { -// path: "/", -// name: "Home", -// component: () => import("@/view/Home"), -// }, -// { -// path: "/register", -// name: "register", -// component: () => import("@/view/auth/Register"), -// meta: { title: "注册" }, -// }, -// // 登录 -// { -// name: "login", -// path: "/login", -// component: () => import("@/view/auth/Login"), -// meta: { title: "登录" }, -// }, -// // 发布 -// { -// name: "post-create", -// path: "/post/create", -// //component: () => import("@/views/post/Create"), -// meta: { title: "信息发布", requireAuth: true }, -// }, -// // 编辑 -// { -// name: 'topic-edit', -// path: '/topic/edit/:id', -// //component: () => import('@/views/post/Edit'), -// meta: { -// title: '编辑', -// requireAuth: true -// } -// }, -// // 详情 -// { -// name: "post-detail", -// path: "/post/:id", -// //component: () => import("@/views/post/Detail"), -// meta: { title: "详情" }, -// }, -// { -// name: 'tag', -// path: '/tag/:name', -// //component: () => import('@/views/tag/Tag'), -// meta: { title: '主题列表' } -// }, -// // 检索 -// { -// name: 'search', -// path: '/search', -// //component: () => import('@/views/Search'), -// meta: { title: '检索' } -// }, -// // 用户主页 -// { -// name: 'user', -// path: '/member/:username/home', -// //component: () => import('@/views/user/Profile'), -// meta: { title: '用户主页' } -// }, -// // 用户设置 -// { -// name: 'user-setting', -// path: '/member/:username/setting', -// //component: () => import('@/views/user/Setting'), -// meta: { title: '设置', requireAuth: true } -// }, -// { -// path: "/404", -// name: "404", -// component: () => import("@/view/error/404"), -// meta: { title: "404-NotFound" }, -// }, -// { -// path: "*", -// redirect: "/404", -// hidden: true, -// }, -// ]; - -const routes = [ +const routes = [{ + path: '/', + name: 'Home', + component: () => import('@/view/Home') + }, { - path: '/', - name: 'Home', - component: () => - import ('@/view/Home') + path: '/register', + name: 'register', + component: () => + import('@/view/auth/Register'), + meta: { + title: getLang() === 'zh' ? "注册" : 'Sign up' + } }, { - path: '/register', - name: 'register', - component: () => - import ('@/view/auth/Register'), - meta : {title : "注册"} + path: '/404', + name: '404', + component: () => + import('@/view/error/404'), + meta: { + title: "404 not found" + } }, { - path: '/404', - name: '404', - component: () => - import ('@/view/error/404'), - meta : {title : "404 not found"} + path: '/login', + name: 'login', + component: () => + import('@/view/auth/Login'), + meta: { + title: getLang() === 'zh' ? "登录" : 'Sign in' + } }, { - path: '/login', - name: 'login', - component: () => - import ('@/view/auth/Login'), - meta : {title : "登录"} + path: '/post/create', + name: 'post-create', + component: () => import('@/view/post/Create'), + meta: { + title: getLang() === 'zh' ? '发布帖子' : 'Create Post', + requireAuth: true + } }, { - path: '*', - redirect: '/404', - hidden : true + path: "/post/:id", + name: "post-detail", + component: () => import('@/view/post/Detail'), + }, + { + name: 'post-edit', + path: '/post/edit/:id', + component: () => import('@/view/post/Edit'), + meta: { + title: getLang() === 'zh' ? '编辑帖子' : 'Edit post', + requireAuth: true + } + }, + { + path: '*', + redirect: '/404', + hidden: true + }, + //用户主页 + { + path: '/member/:username/home', + name: 'user', + component: () => import('@/view/user/Profile'), + meta: { + title: getLang() === 'zh' ? '用户主页' : 'Profile' + } + }, + //用户设置 + { + path: '/member/:username/setting', + + name: 'user-setting', + component: () => import('@/view/user/Setting'), + meta: { + title: getLang() === 'zh' ? '设置' : 'Settings' + } } ] @@ -147,4 +94,4 @@ const router = new VueRouter({ routes, }); -export default router; +export default router; \ No newline at end of file diff --git a/src/store/getters.js b/src/store/getters.js index df4b170..6936f44 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -2,4 +2,4 @@ const getters = { token: state => state.user.token, // token user: state => state.user.user, // 用户对象 } - export default getters \ No newline at end of file + export default getters diff --git a/src/store/index.js b/src/store/index.js index d1c8797..ec4b60e 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,7 +1,7 @@ import Vue from 'vue' import Vuex from 'vuex' import getters from './getters' -import user from './modules/user' +import user from './module/user' Vue.use(Vuex) diff --git a/src/store/modules/user.js b/src/store/module/user.js similarity index 71% rename from src/store/modules/user.js rename to src/store/module/user.js index 42e60bb..315f7f3 100644 --- a/src/store/modules/user.js +++ b/src/store/module/user.js @@ -1,5 +1,13 @@ -import { getUserInfo, login, logout } from "@/api/auth/auth"; -import { getToken, setToken, removeToken } from "@/util/auth"; +import { + login, + getUserInfo, + logout +} from "@/api/auth/auth"; +import { + getToken, + setToken, + removeToken +} from "@/util/auth"; const state = { token: getToken(), // token @@ -16,31 +24,41 @@ const mutations = { }; const actions = { - // 用户登录 - login({ commit }, userInfo) { + login({ + commit + }, userInfo) { console.log(userInfo); - const { name, pass, rememberMe } = userInfo; + const { + name, + password, + } = userInfo; return new Promise((resolve, reject) => { - login({ username: name.trim(), password: pass, rememberMe: rememberMe }) + login({ + name: name.trim(), + password: password + }) .then((response) => { - const { data } = response; - commit("SET_TOKEN_STATE", data.token); - setToken(data.token); - resolve(); + const { + data + } = response; + commit("SET_TOKEN_STATE", data); + setToken(data); + resolve(data); }) .catch((error) => { reject(error); }); }); }, - - // 获取用户信息 - getInfo({ commit }) { + getInfo({ + commit + }) { return new Promise((resolve, reject) => { getUserInfo() .then((response) => { - const { data } = response; - //console.log(data) + const { + data + } = response; if (!data) { commit("SET_TOKEN_STATE", ""); commit("SET_USER_STATE", ""); @@ -49,7 +67,7 @@ const actions = { reject("Verification failed, please Login again."); } commit("SET_USER_STATE", data); - resolve(data); + resolve(); }) .catch((error) => { reject(error); @@ -57,7 +75,6 @@ const actions = { }); }, - // 注销 logout({ commit, state }) { return new Promise((resolve, reject) => { logout(state.token) @@ -73,7 +90,7 @@ const actions = { }); }); }, -}; +} export default { namespaced: true, diff --git a/src/util/auth.js b/src/util/auth.js index bedb031..9cdcf43 100644 --- a/src/util/auth.js +++ b/src/util/auth.js @@ -1,7 +1,7 @@ import Cookies from 'js-cookie' const uToken = 'u_token' -const darkMode = 'dark_mode'; +const darkMode = 'dark_mode' // 获取Token export function getToken() { @@ -28,4 +28,12 @@ export function setDarkMode(mode) { export function getDarkMode() { return !(undefined === Cookies.get(darkMode) || 'false' === Cookies.get(darkMode)); +} + +export function setLang(lang) { + return Cookies.set('language', lang, {expires: 365}) +} + +export function getLang() { + return ('undefined' === Cookies.get('language')) ? 'zh' : Cookies.get('language') } \ No newline at end of file diff --git a/src/util/get-page-title.js b/src/util/get-page-title.js index b2463e9..5bebfde 100644 --- a/src/util/get-page-title.js +++ b/src/util/get-page-title.js @@ -1,4 +1,5 @@ -const title = "长安南论坛——西电智慧论坛" +import { getLang } from "@/util/auth" +const title = getLang() === 'zh' ? '长安南论坛——西电智慧论坛' : 'Chang\'an Nan Forum——XD Smart Forum' export default function getPageTitle(pageTitle){ if(pageTitle){ diff --git a/src/util/scroll-to.js b/src/util/scroll-to.js new file mode 100644 index 0000000..331ef47 --- /dev/null +++ b/src/util/scroll-to.js @@ -0,0 +1,58 @@ +Math.easeInOutQuad = function(t, b, c, d) { + t /= d / 2 + if (t < 1) { + return c / 2 * t * t + b + } + t-- + return -c / 2 * (t * (t - 2) - 1) + b + } + + // requestAnimationFrame for Smart Animating http://goo.gl/sx5sts + var requestAnimFrame = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) } + })() + + /** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param {number} amount + */ + function move(amount) { + document.documentElement.scrollTop = amount + document.body.parentNode.scrollTop = amount + document.body.scrollTop = amount + } + + function position() { + return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop + } + + /** + * @param {number} to + * @param {number} duration + * @param {Function} callback + */ + export function scrollTo(to, duration, callback) { + const start = position() + const change = to - start + const increment = 20 + let currentTime = 0 + duration = (typeof (duration) === 'undefined') ? 500 : duration + var animateScroll = function() { + // increment the time + currentTime += increment + // find the value with the quadratic in-out easing function + var val = Math.easeInOutQuad(currentTime, start, change, duration) + // move the document.body + move(val) + // do the animation unless its over + if (currentTime < duration) { + requestAnimFrame(animateScroll) + } else { + if (callback && typeof (callback) === 'function') { + // the animation is done so lets callback + callback() + } + } + } + animateScroll() + } \ No newline at end of file diff --git a/src/view/Home.vue b/src/view/Home.vue index c61c0a2..d061ad5 100644 --- a/src/view/Home.vue +++ b/src/view/Home.vue @@ -1,46 +1,47 @@ \ No newline at end of file diff --git a/src/view/card/LoginWelcome.vue b/src/view/card/LoginWelcome.vue index 62ab836..a0b5c6d 100644 --- a/src/view/card/LoginWelcome.vue +++ b/src/view/card/LoginWelcome.vue @@ -1,27 +1,27 @@ diff --git a/src/view/card/Promotion.vue b/src/view/card/Promotion.vue index 6d58c03..a9e20d1 100644 --- a/src/view/card/Promotion.vue +++ b/src/view/card/Promotion.vue @@ -1,10 +1,10 @@ @@ -16,9 +16,6 @@ export default { data() { return { } - }, - created() { - }, methods: { diff --git a/src/view/card/Tip.vue b/src/view/card/Tip.vue index ec8c434..b549854 100644 --- a/src/view/card/Tip.vue +++ b/src/view/card/Tip.vue @@ -1,7 +1,7 @@ diff --git a/src/view/post/Create.vue b/src/view/post/Create.vue new file mode 100644 index 0000000..2dbef22 --- /dev/null +++ b/src/view/post/Create.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/src/view/post/Detail.vue b/src/view/post/Detail.vue new file mode 100644 index 0000000..977d84d --- /dev/null +++ b/src/view/post/Detail.vue @@ -0,0 +1,205 @@ + + + \ No newline at end of file diff --git a/src/view/post/Edit.vue b/src/view/post/Edit.vue new file mode 100644 index 0000000..c0e9fc6 --- /dev/null +++ b/src/view/post/Edit.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/view/post/Index.vue b/src/view/post/Index.vue index e4c8d49..be7cdfe 100644 --- a/src/view/post/Index.vue +++ b/src/view/post/Index.vue @@ -1,45 +1,263 @@ + - \ No newline at end of file diff --git a/src/view/user/Profile.vue b/src/view/user/Profile.vue new file mode 100644 index 0000000..fe886a6 --- /dev/null +++ b/src/view/user/Profile.vue @@ -0,0 +1,135 @@ + + + + + \ No newline at end of file diff --git a/src/view/user/Setting.vue b/src/view/user/Setting.vue new file mode 100644 index 0000000..dfa077a --- /dev/null +++ b/src/view/user/Setting.vue @@ -0,0 +1,118 @@ + + + + + \ No newline at end of file -- Gitee