From 324193a919b80e355eeeead5e73a498a82c79c9d Mon Sep 17 00:00:00 2001 From: zhangmanman <994797151@qq.com> Date: Wed, 24 Nov 2021 10:03:47 +0800 Subject: [PATCH] =?UTF-8?q?[=E4=BF=AE=E6=94=B9=E4=BC=98=E6=83=A0=E5=88=B8?= =?UTF-8?q?=E7=AE=A1=E7=90=86=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=88=91=E7=9A=84?= =?UTF-8?q?=E4=BC=98=E6=83=A0=E5=88=B8=EF=BC=8C=E4=BF=AE=E6=94=B9=E7=AD=BE?= =?UTF-8?q?=E5=88=B0=E9=A1=B5=E9=9D=A2]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apis/interfaces/coupons.js | 11 +- apis/interfaces/user.js | 37 +++- manifest.json | 7 +- node_modules/vuex/package.json | 134 ++++++-------- pages.json | 21 +++ pages/coupons/magDetails.vue | 60 +++++- pages/coupons/management.vue | 45 +++-- pages/found/index.vue | 22 ++- pages/user/coupons.vue | 324 +++++++++++++++++++++++++++++++++ pages/user/couponsDte.vue | 312 +++++++++++++++++++++++++++++++ pages/user/couponsList.vue | 236 ++++++++++++++++++++++++ pages/user/index.vue | 4 + static/imgs/coupon_tips_00.png | Bin 0 -> 5219 bytes static/imgs/coupon_tips_01.png | Bin 0 -> 5153 bytes static/user/userServe-05.png | Bin 0 -> 1995 bytes 15 files changed, 1106 insertions(+), 107 deletions(-) create mode 100644 pages/user/coupons.vue create mode 100644 pages/user/couponsDte.vue create mode 100644 pages/user/couponsList.vue create mode 100644 static/imgs/coupon_tips_00.png create mode 100644 static/imgs/coupon_tips_01.png create mode 100644 static/user/userServe-05.png diff --git a/apis/interfaces/coupons.js b/apis/interfaces/coupons.js index 11ac44a..483d47d 100644 --- a/apis/interfaces/coupons.js +++ b/apis/interfaces/coupons.js @@ -56,11 +56,20 @@ const magCouponsRecommend = id => { }) } +// 优惠券删除 +const magCouponsDel = (coupon_id) => { + return request({ + url: 'coupons/tools/coupons/' + coupon_id, + method: 'DELETE' + }) +} + export { toolsCoupons, pushCoupons, couponsGoods, magCouponsInfo, magCouponsStatus, - magCouponsRecommend + magCouponsRecommend, + magCouponsDel } diff --git a/apis/interfaces/user.js b/apis/interfaces/user.js index 068aca7..ace7b25 100644 --- a/apis/interfaces/user.js +++ b/apis/interfaces/user.js @@ -58,6 +58,37 @@ const userPartne = (data) => { }) } +// 我的优惠券 +const userCoupon = (data) => { + return request({ + url: 'coupons/user/coupons', + data: data + }) +} + +// 我的优惠券-详情 +const couponsInfo = (coupon_grant_id) => { + return request({ + url: 'coupons/user/coupons/' + coupon_grant_id + }) +} + +// 我的优惠券-二维码 +const getQrcodeByGrantId = (data) => { + return request({ + url: 'coupons/user/coupons/qrcode', + data: data + }) +} + +// 我的优惠券-列表 +const userCouponList = (coupon_id, data) => { + return request({ + url: 'coupons/user/coupons/' + coupon_id + '/list', + data: data + }) +} + export { userIndex, userNotice, @@ -65,5 +96,9 @@ export { userHelp, userClause, userInvite, - userPartne + userPartne, + userCoupon, + couponsInfo, + getQrcodeByGrantId, + userCouponList } diff --git a/manifest.json b/manifest.json index 559b190..d365630 100644 --- a/manifest.json +++ b/manifest.json @@ -174,7 +174,12 @@ "uniStatistics" : { "enable" : false }, - "vueVersion" : "2" + "vueVersion" : "2", + "h5" : { + "router" : { + "mode" : "history" + } + } } /* SDK配置 */ diff --git a/node_modules/vuex/package.json b/node_modules/vuex/package.json index e3ddae5..68172f6 100644 --- a/node_modules/vuex/package.json +++ b/node_modules/vuex/package.json @@ -1,37 +1,59 @@ { - "_from": "vuex", - "_id": "vuex@3.6.2", - "_inBundle": false, - "_integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", - "_location": "/vuex", - "_phantomChildren": {}, - "_requested": { - "type": "tag", - "registry": true, - "raw": "vuex", - "name": "vuex", - "escapedName": "vuex", - "rawSpec": "", - "saveSpec": null, - "fetchSpec": "latest" + "name": "vuex", + "version": "3.6.2", + "description": "state management for Vue.js", + "main": "dist/vuex.common.js", + "exports": { + ".": { + "module": "./dist/vuex.esm.js", + "require": "./dist/vuex.common.js", + "import": "./dist/vuex.mjs" + }, + "./": "./" }, - "_requiredBy": [ - "#USER", - "/" + "module": "dist/vuex.esm.js", + "unpkg": "dist/vuex.js", + "jsdelivr": "dist/vuex.js", + "typings": "types/index.d.ts", + "sideEffects": false, + "files": [ + "dist", + "types/index.d.ts", + "types/helpers.d.ts", + "types/logger.d.ts", + "types/vue.d.ts" ], - "_resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", - "_shasum": "236bc086a870c3ae79946f107f16de59d5895e71", - "_spec": "vuex", - "_where": "/Users/WebTmm/Desktop/BlockChainH5", - "author": { - "name": "Evan You" + "scripts": { + "dev": "node examples/server.js", + "build": "npm run build:main && npm run build:logger", + "build:main": "node scripts/build-main.js", + "build:logger": "node scripts/build-logger.js", + "lint": "eslint src test", + "test": "npm run lint && npm run test:types && npm run test:unit && npm run test:ssr && npm run test:e2e && npm run test:esm", + "test:unit": "jest --testPathIgnorePatterns test/e2e", + "test:e2e": "start-server-and-test dev http://localhost:8080 \"jest --testPathIgnorePatterns test/unit\"", + "test:ssr": "cross-env VUE_ENV=server jest --testPathIgnorePatterns test/e2e", + "test:types": "tsc -p types/test", + "test:esm": "node test/esm/esm-test.js", + "coverage": "jest --testPathIgnorePatterns test/e2e --coverage", + "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", + "release": "node scripts/release.js", + "docs": "vuepress dev docs", + "docs:build": "vuepress build docs" }, + "repository": { + "type": "git", + "url": "git+https://github.com/vuejs/vuex.git" + }, + "author": "Evan You", + "license": "MIT", "bugs": { "url": "https://github.com/vuejs/vuex/issues" }, - "bundleDependencies": false, - "deprecated": false, - "description": "state management for Vue.js", + "homepage": "https://github.com/vuejs/vuex#readme", + "peerDependencies": { + "vue": "^2.0.0" + }, "devDependencies": { "@babel/core": "^7.12.10", "@babel/preset-env": "^7.12.11", @@ -70,55 +92,9 @@ "webpack": "^4.43.0", "webpack-dev-middleware": "^3.7.2", "webpack-hot-middleware": "^2.25.0" - }, - "exports": { - ".": { - "module": "./dist/vuex.esm.js", - "require": "./dist/vuex.common.js", - "import": "./dist/vuex.mjs" - }, - "./": "./" - }, - "files": [ - "dist", - "types/index.d.ts", - "types/helpers.d.ts", - "types/logger.d.ts", - "types/vue.d.ts" - ], - "homepage": "https://github.com/vuejs/vuex#readme", - "jsdelivr": "dist/vuex.js", - "license": "MIT", - "main": "dist/vuex.common.js", - "module": "dist/vuex.esm.js", - "name": "vuex", - "peerDependencies": { - "vue": "^2.0.0" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/vuejs/vuex.git" - }, - "scripts": { - "build": "npm run build:main && npm run build:logger", - "build:logger": "node scripts/build-logger.js", - "build:main": "node scripts/build-main.js", - "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", - "coverage": "jest --testPathIgnorePatterns test/e2e --coverage", - "dev": "node examples/server.js", - "docs": "vuepress dev docs", - "docs:build": "vuepress build docs", - "lint": "eslint src test", - "release": "node scripts/release.js", - "test": "npm run lint && npm run test:types && npm run test:unit && npm run test:ssr && npm run test:e2e && npm run test:esm", - "test:e2e": "start-server-and-test dev http://localhost:8080 \"jest --testPathIgnorePatterns test/unit\"", - "test:esm": "node test/esm/esm-test.js", - "test:ssr": "cross-env VUE_ENV=server jest --testPathIgnorePatterns test/e2e", - "test:types": "tsc -p types/test", - "test:unit": "jest --testPathIgnorePatterns test/e2e" - }, - "sideEffects": false, - "typings": "types/index.d.ts", - "unpkg": "dist/vuex.js", - "version": "3.6.2" -} + } + +,"_resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz" +,"_integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==" +,"_from": "vuex@^3.6.2" +} \ No newline at end of file diff --git a/pages.json b/pages.json index ca5dd1e..890314c 100644 --- a/pages.json +++ b/pages.json @@ -303,6 +303,27 @@ "style": { "navigationBarTitleText": "关注公众号" } + }, { + "path": "pages/user/coupons", + "name": "myCoupons", + "auth": true, + "style": { + "navigationBarTitleText": "我的优惠券" + } + }, { + "path": "pages/user/couponsDte", + "name": "myCouponsDte", + "auth": true, + "style": { + "navigationBarTitleText": "我的优惠券" + } + }, { + "path": "pages/user/couponsList", + "name": "myCouponsList", + "auth": true, + "style": { + "navigationBarTitleText": "我的优惠券" + } }, { "path": "pages/vip/vip", "name": "vipIndex", diff --git a/pages/coupons/magDetails.vue b/pages/coupons/magDetails.vue index efbd3de..bd4e0b3 100644 --- a/pages/coupons/magDetails.vue +++ b/pages/coupons/magDetails.vue @@ -27,8 +27,8 @@ {{details.quantity}} - 已发放量 - {{details.grant_quantity}} + 已使用/已领取 + {{details.used_quantity}}/{{details.grant_quantity}} 每人限领 @@ -69,6 +69,11 @@ {{details.description || '-'}} + + + 删除优惠券 + + @@ -76,7 +81,7 @@ {{details.status.value == 4 ? '上架': '下架'}} - {{recommended ? '设为推荐': '已设为推荐'}} + {{recommended ? '设为推荐': '已设为推荐'}} @@ -84,7 +89,7 @@ @@ -164,6 +196,12 @@ border: none; } } + .item-btn { + color: #eca824; + &.active { + color: #9d9d9d; + } + } } } .details{ @@ -244,6 +282,18 @@ color: $text-gray; padding-top: $padding/3; } + .mian-del { + text-align: right; + width: 100%; + color: red; + padding-top: 20rpx; + .mian-del-btn { + padding: 10rpx 30rpx; + border-radius: 10rpx; + display: inline-block; + border: 2rpx #f3bbbb solid; + } + } .mian-goods{ padding-bottom: $padding; .item{ diff --git a/pages/coupons/management.vue b/pages/coupons/management.vue index 44b5bd5..424ad91 100644 --- a/pages/coupons/management.vue +++ b/pages/coupons/management.vue @@ -2,18 +2,18 @@ - 全部 - 服务券 - 代金券 - 提货券 - - - 全部 - 已上架 - 已下架 - 即将过期 - 已过期 + 全部 ({{ counts.all}}) + 服务券 ({{ counts.service}}) + 代金券 ({{ counts.reduction}}) + 提货券 ({{ counts.exchange}}) + + 全部 ({{ statusCount.all}}) + 已上架 ({{ statusCount.shown}}) + 已下架 ({{ statusCount.unshown}}) + 即将过期 ({{ statusCount.expire}}) + 已过期 ({{ statusCount.over}}) + @@ -36,6 +36,7 @@ {{item.goods_count}}商品可用 + @@ -55,6 +56,8 @@ export default { data() { return { + counts: '', + statusCount: '', listType: '', tabsType: '', coupons : [], @@ -86,8 +89,10 @@ type : this.listType, status : this.tabsType }).then(res => { - this.coupons = res.lists.data - this.pages = res.lists.page + this.coupons = res.lists.data + this.counts = res.type_count + this.statusCount = res.status_count + this.pages = res.lists.page }).catch(err => { uni.showToast({ title: err.message, @@ -126,9 +131,15 @@ // 类型 .tabs-type{ display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + box-sizing: border-box; + white-space: nowrap; padding: 20rpx 30rpx; background: white; .item{ + display: inline-block; font-size: $title-size-sm; height: 46rpx; line-height: 46rpx; @@ -163,6 +174,14 @@ justify-content: space-between; flex-wrap: wrap; padding: $padding 70rpx $padding 0; + .coupons-tips { + position: absolute; + top: 20rpx; + right: 20rpx; + width: 94rpx; + height: 94rpx; + z-index: 9; + } .item{ position: relative; padding: 0 $padding; diff --git a/pages/found/index.vue b/pages/found/index.vue index dc6bd12..324a282 100644 --- a/pages/found/index.vue +++ b/pages/found/index.vue @@ -39,7 +39,7 @@ - 再签到{{ sign.nextTask.day }}天额外赠送{{ sign.nextTask.diff }}个贡献值 + 再签到{{ sign.nextTask.diff }}天额外赠送{{ sign.nextTask.crystal }}个贡献值 @@ -64,9 +64,12 @@ @click="JumpUrl(item.url, item.title, item.is_finish)"> {{item.title}} - {{item.remark}} - {{item.is_finish ? '已完成' : item.tips}} - {{item.sub_title}} + + + {{item.is_finish ? '已完成' : item.tips}} + /人 + @@ -145,11 +148,11 @@ }, // 贡献值提示信息 - showHelp() { + showHelp(title, val) { uni.showModal({ - title: '贡献值', + title: title, confirmColor: '#8b64fd', - content: this.energyShard.description, + content: val, showCancel: false }) }, @@ -468,6 +471,11 @@ height: 34rpx; margin: 24rpx 0 0 20rpx; } + .task-label-img { + width: 24rpx; + height: 24rpx; + margin: 28rpx 0 0 8rpx; + } } } } diff --git a/pages/user/coupons.vue b/pages/user/coupons.vue new file mode 100644 index 0000000..6e129f3 --- /dev/null +++ b/pages/user/coupons.vue @@ -0,0 +1,324 @@ + + + + + + diff --git a/pages/user/couponsDte.vue b/pages/user/couponsDte.vue new file mode 100644 index 0000000..39faf74 --- /dev/null +++ b/pages/user/couponsDte.vue @@ -0,0 +1,312 @@ + + + + + diff --git a/pages/user/couponsList.vue b/pages/user/couponsList.vue new file mode 100644 index 0000000..0c0e3ae --- /dev/null +++ b/pages/user/couponsList.vue @@ -0,0 +1,236 @@ + + + + + diff --git a/pages/user/index.vue b/pages/user/index.vue index bb441d1..c001645 100644 --- a/pages/user/index.vue +++ b/pages/user/index.vue @@ -263,6 +263,10 @@ 我的服务 + + + 我的优惠券 + 专属客服 diff --git a/static/imgs/coupon_tips_00.png b/static/imgs/coupon_tips_00.png new file mode 100644 index 0000000000000000000000000000000000000000..a8269ca232ca169ae55deff6c1ec226b8e12573c GIT binary patch literal 5219 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 Z;fiGZY$EcY|K2-*wz|Grjf!2&{{RwC4jTXf literal 0 HcmV?d00001 diff --git a/static/imgs/coupon_tips_01.png b/static/imgs/coupon_tips_01.png new file mode 100644 index 0000000000000000000000000000000000000000..321e9d9af4b4fe803966b408214c0c7e618991e4 GIT binary patch literal 5153 zcmchb=n*Trd(+yw*#sa;Z#?vSNBrIC<^g{51hyAhUdDe009>5z^Eq@;7ilQ8mbe)&MqyMK33fXA(?Ricf3Wu1LOYy)3X2 z4UJSvNmfe7XJx=J8eYi?XqMH~0o(>uKR*uxEl5;n=alv)2p%V)(N3-vyX$?z&mOG_ z+ad!DHOHcN`_I&Q+v(Qt7n6;O-r-`r+I8AMJ$>1hq#H2V7vvPig+PRHFtn+LJ;$|g zB`;HteJp=lQAOpXv_>C!5nb|3*}lT&+250|pMYMQK`uU%t6>CP6iklKdq=rzP)}8K z2JbqsGt%#>=|7FXlz(ArdCqYvV?kzl z_sw40%ec0z-)pEhnz(=YmMGjiPY~F>HHM~%CE?r9IV9!lZVvE7hNkby1+CIOT-p^K z>DFit9Eet+qvq&zp%5wglPLyeaJ07JjiTf_Cu#4EsJ)iU*3U|5%lD9p-SW0|HAJSMz2E3$OIH6AOI#?`a6Y(EsfN$1=LzTt|RCqvp{*5dhqJ@U)gdhVsx zZ)ib#FYMqaN4wNUH6xZdjSxt0=UFquucSo8zCyE6i*hO6TY&kNQsaE`%Cpmij$$yq z4@u2UgZ<<$=M?vyKP^G4aA}v{+fkqnb;Wg;rTzG<$`s+9q~%8tlO+WfndU_lO8=ZE z+>%R_8hVi{ilw;kA1)h|^9EKHWH@~zIf}#ZiCTp$T6v9Kp#n-Sr;TNX<~EMyYx{2G zNA+*Xn<1=Z7*y_yy>f&gTF}tQc#hRC^^lTh$|+6AiR6uW2Tua1Vq+VqE%(MMrz7F` zo_xL;lGmQ^TUJadp1zk5AqYkVEniZa1iQ<@aa15g*a7&pCPwuIZ!QBv=5D#A$795!@!x4?1e$Ztn&J9<;4=gO5&jY1HqExJVSwSP_J`=#)m)QV{#+ z95>ZoN0$AN=zH&(7#A`AkKqb+DMvG<7M5|WReyI1{xiUk0YSbU`G#|n9+7k=9Xzu% zolC?MHC$LE;wuscym~5zLeLhDh1lv1@OWIRcpStZW2=x%VeP)DAZF(92BhuYpCr0H ztXUex_z%~qBSGm518#M~YzIT1MA*2j^!}dks8AjCGF&l(0QZvVew#G0Fu4xuSIg($ zp#zqyZc!yf?32x%@R>UqQUd?3J3_TzM%L&@EZP(vtr{O~0llU__4J8Hml_v+e=65T z_Vu~H6@0Vu?(mojOubkp5{VMHrt@hKe5~Ozn+D-?^=>j<0PrlPz>cQb+jck}W|dG3 z6pgepw*PJ(Mjxs8&N{JN6f1whpJP5}E@ph`_}V7s$iD-%uj}Yo-`H1S#85pUSlHrD z^%>7Qn`8RzrZB4l=Tm3Azh`0i(?KY`p4gOx_kM(K?X#S_5G%!F^~%z2`3fHF(e*Oe zsl&adv6))FGm?!Dv!wJ(1n^wrJcIpNC%cI>2+Lcbi8##-MD-Q?)+3L<&LZ+uWh$Cl z;G~hBP==AxUGc45}%O3XchQ$<+`SC_w2i!C3Fn-4i z_WW$cSrJ`8PwepY7(o<}J`pWBnVA+{E7zer=fFuFBf~jXZ{I~uxSLU6IN)}m=4uFE zHd-0MOs)ido8Az)F5dZqpe5TECw$H7gIewev4&RFno3w!aT~1JB-)4h5I|zQ8&KKq z_!gnpO;<{nsa*C^*kb5cFa@8*1@@qi^n1g|5X$|^V8V8Md4blISTnrPwNFA?yd=@3 z=%!3Xq7LsxS`2VP6~yCjy!>h!@LwlOpC8@3EEBRxpHM|Y_K##prH_)_qz0DNrAu|; zj)v9HkEYPi3&c=qi0sBEvxwsd-C$Q$Hcle8#sK8LgDQaKd49*LVy;+Z{M%R6+QVYb zKdPlct#}=^4H>_Vn{~FR0DW(rJ*)R?X1swD-CtweCpv&v>cca3sE9vWUI_KLD=V%K zS}S5cmnQ#lvrHp@czhjDRlc;bN%K-{_wR<_#=+jte@;l2ksgdQPUy~a5iz(YTeYZS z?XB~}Pb~doLbFwONfhw%VGXTI*b3f?8qWSN+yEc4WeS#{C3IItDT#8NYLgZbbb6x= zM!9)ehGm#s0qyPYL{l9PZ2kUP%ZE*Oy>J|ZjZN&xa^hMb$kSF~N5D_MvG9Q04r_*( z%!~@Jr0o~=H7Gzym`n=ZK;Qe%KM51<+Y=~Pv;}kSxEXR=B7hf8mE-q1vV)EedHqc^ z@#&QS*QRuQXT*O@iN_y~wMOPIro?5hJHE>SE8Nb$yYo|#S}bxWf)G3vq@lw_IM%2! zb0~dNwGA>;yHn`63-5gXYlJ!PV6OdF>Oj}6I>CHExVOc?Z@)3DG2?=kqwI^?*6Fh& zICyrt**Y%$3k6%A0>fy%3(XdQWc+%bl|t`7s3W7uSZ-Aolj}VO(V=m(C;@PLenr%R zyYl_k9jMRpPm^Su?$H)=q(XBDP<>A2Z)wPh{JL&z^PA;C{?~4=jwm^ziag)pjp&>b zSP`J{3~eqzDHClwe$Q(=#74w@xBnie3$dDvn(=ozlC_Yx+;AP&Y<^-|BB?jO#SzWh zW{&or!=GNA#G_6;Z(bja2#PsUk2D2&R~y#{5Nk*dVE|*toEKa$qkZnPiXC;o%aCVz zd7m)f3M3+ZZ1`y|AS`DI!)nJmm$s*!A`h8h3xz90`KM-4g-AY6L=Nv8mlA~GOXeyYPy){=PJ zr+237qjH4q*UZZ{7W6xue|{4i|IGIx zuwBEAkx6c$dRKc>(R6d&)DP}B8oK)ETR8Q(q7r_xl3U!AGts%g%3md1t6UjN*4_6B z_a@a8OTj1I;MsH+ed*DVq`x}Rj)>HZzxS`({cP{&`|pl%hwslup9DR7Iq+uK|D_Sg zh+)X*Z+n3x>sQ<)B4^UxSz#ld?hxw2$_djIJMDPG-OW+wZMf2amsvqOIh8Z!%Q>n7 zYtF^d;EkA-octSID~h<2N9XzhTk07V&7P*V7!~_-)E9Fu5OJx%f9(q@`;@)&B;r(R zn}uAtX? z!FpS|R+=30VJG@STDGL3q^yJj<{~4bRHLGbBTn?Hox@lM{A@@O5>SzD3SbnFCah5i zfy8-!coHp&FFx-?kj43gaV~#IsyEjH^D%vU#TdT(6!jo?NCw#baLwna_nB>68xO!Kv4ilD~@-cE?tu7NwT;~(X#3Me%Sq^Ug_F%|& z_WBhYe|X^gKHoI6AC070+^f~)-RXj;i`!f{ZN7Y180>4?mlmv2V=aw01Lwq-qe_qA*z zud*;oL&eyFmu2VnlE46a45DPE9lCqB*(H`ZU=QQ=lB9sMgbPWCM|+jmE2W?}1*uC~yt^;atsGnJYMae@8lw^vRL_0hpZE=CFow6LML4Vu@RuvI=CS0k;BTh-Ja|W!2 zB+b#Z!g&Yi*VZcqtY?oUdOrd}Of9o9)ni&EE);&kWNQeBfN5vM ztBp}+tBZE=6JL1m}p1s2Cok@Z)?1Fs=i!>+AgL!8t!@sWTdc*OWmw)e$9a$*L1y@H4- z8%^!{vfki2{6f)-3>8?{;A}S_DFb|*gJX9^vQH^i?6D9hf4_`5I3|T>>(G=9w&GaW@nS{T_uHSZ&NvK6zwy7!yn_l*kfPgX(uSX<2I%H&D&zL|g@qA8V)$VCC z`8N&%_QcPYvyF*A zyRiGy+EexU6X0UYsqYX$=iIPjUPd>lno#Hh+Gg?jBTbJb4fRmNh`kT)M-&V{9l@7Jp2+IS(ZN0h;!?nGCB;m_bovj5wquz`? zCO`8}i7P!<(Y7v!kLM*TaCDRf z2en>yVS0r$o}o(K>Yy7+-6IOHSR(`&GVuejdN1=cR5SiCST456tX46h|1_h^%go|)PHS&Q;3 zjiWKGgYru*Ycf0oq)@s| z@)zdFwpZLJ>sdAh)z!P8(8V(9pm9a37O^wA4B59jN=1#7z@cx4>c{TDxn@#IK927F zKk0Y|G{SfE2D&!O3!X&=VoeROH!NU6L$iD(J2$FP?~BXKs9~-oy0t2if-f!@4Bd%iPiF zXHhIZ8#U?spJ)nYvN97)*78j;#H;Ugc&0&H z>pd*|tr;lWoG`c2dGM6|7W(OAJen+U^y@7b{-HIi1)89`8t3>rvADyXPej0LEZyIE z)B;1enYd!gUC)px{Toj(CH;W`Zb=`vLlG;1E{K;f$d#E&M1MVyE%l->K_{7~nn51I zog~^&^pdNSFJS6f>a!$nyXmB@;XcY5&cyZd`pKIi&_(D8gX6aqgW}j;&%f>sO-W8& Jwno}KopWZs$GP|ZUiX|i z93gz$-qzU`hr`+PxAH{T>TP~)tgx@^f!Gz;;)I5Z(MTi_&5&pyT!;)wfB-%$kwYR# zBFju2fY>$XGsy5A~9nqI#`XdaX5C6PA!q9Kq!y^$rUONX{w`>1Sn)2 zQVc`jBT#dpB*oUf8YptFFiN^NMaqv}rV5ql$SSSd zk^&FXN;L{Ksz6kLSy7UJq@f%Vmg#RL!0K1BD(%ZQVGX0|Bx)*1@iCXQ1QZDVKNN;v zp|z+8`aR!271l;&sv)Wf(jsXZDK@x7H*+X8i>rYoD58l%5am)ABa#pl(Iz2kfXf9u zViYPFlA(R;1zaFt@l{$>qLM;<9*2YpP!tLo3#9q-0(^LMUoJ=k!BB31KR1BO2w^gO zdHyseowvm0A<{G$QlU#++3#H6Ww~Z2z-lZq57H>oAz7FPfq@qlvlPqc0xqlfk}F$2 z7uvF1DwYh@Jl8+WdFcu>k9qsbwbRRg|9L_SB&kKpt8752Nr0Y93 z^-bv$`?+O)?qw+s7hgXjI$ikRFk7!i$87^9i&J9P0-jUKwVul-nl4xN65@beGO$_s z#_H=PwyB|T%#fC~BMW)9FvWa6-?@9_hlh&~hZdh}zv0}U54xX`eP8l@gva;;!Nklg z?FgZW@c2>gx+|+QGc!$Yp53HlmX|pV{13i3Z?qHR7i)SA2E%)JLI-|x4$pB54exCo z*%h_r)0&0Vz4_!1V?A3a-Bi!l5~#U)W7cYdi`BNScanF0_V|72-@CVm&`uI_J~vhq zIP+^3EY1Y`G066W;}kHA9kk*)rJYM>@RDYn7MSBr#5YCU1AcGOJSyg|uK6aa&D;83 zQ$oXq^TM(l6V^iIrW%WbPOXA!)2hbF-i^F6$5n%C_9sjiCDOZW$K=E=#`elYY5-60v{%)6#Ilk!a%Vl@LAt)|xTbKrT`rSBpyt zt`mGc%)Hh4G|*`>K_3{nBeB9$d#n@OEl|dQ^|KBmEuFuf%DGnmHy)(pS%CU&`7e2(z_^ERrIR8V={n?MZ=LW5AGQMa0 zE)aI6$k|j|8#>(cFG}j>lh$psU!a1vr^W+${N|kt(ff`kZ_jQ&;gzh2v-`fcJ?A}c zjLk@dpcFU!EXbj10F9nISnay&7q1d=hwHa^qu5&XJ6&t{%NQ1;$f@KgA%6=f0@|mP$>c*w%xiJEXe+Rd(F{1vkb-A^4skLrjpa;2Hf8|t#VZEw0-(k`#5FDz*~e7dhd z93&X-ahc^%Kd6}*z30KH-aHfycIZc^*B3Ms%FBh5^nL$h+(^^b)Vdk0;vUthGJXu~ zPI(Y=`^+;|>W`NM_G=B{67u1m@0_LF5K28XI{N8f=ZODQ+Aso&diJ#WE?yhEW}G-D902zPPo#m-wI2%Fn#Q3j(01 zOK5b9uy<^SW{W5OWR+?Q?6%FE(zq?AVn=tk@Q-OR3YZn!ftHaiinH`DYvAae3%sdm*Rp QlKJ<_4;Avh{9AnPuf%95)Bpeg literal 0 HcmV?d00001