From 2aaddd51d5046dcef7f91aede4804d573573b177 Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Wed, 17 Sep 2025 13:12:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=A1=86=E6=9E=B6=E5=8F=91?= =?UTF-8?q?=E5=B8=83:=208.2.40=20=20=201.=20=E4=BF=AE=E5=A4=8D=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AF=BC=E5=87=BA=E7=9A=84bug=20=20=202.=20=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E5=AE=9E=E4=BD=93=E5=A2=9E=E5=8A=A0=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E5=AD=97=E6=AE=B5,=20SYS=5FROLE=20=E8=A1=A8=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=20ORDER=5F=20=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前端核心发布: 8.2.133 1. 修改客户端请求超时时间为 5 分钟 2. 增加统一的错误处理,如果服务端返回的错误没找到国际化消息,则显示 java.lang.Exception 对应的国际化消息 3. 用户选入角色对话框采用百分比宽度,每页100条 4. 角色管理增加排序号,且默认按排序号排序 --- ...20220606__Security_Database_Schema_DDL.xml | 1 + .../sc/platform/system/api/role/RoleVo.java | 10 ++++++++ .../src/views/role/Role.vue | 5 +++- .../src/views/shared/SelectRoleDialog.vue | 17 ++++++++----- .../system/role/jpa/entity/RoleEntity.java | 23 +++++++++++++++++- .../role/jpa/repository/RoleRepository.java | 4 +++ .../role/service/impl/RoleServiceImpl.java | 17 +++++++++++++ .../system/role/jpa/entity/RoleEntity.xlsx | Bin 12118 -> 12160 bytes 8 files changed, 69 insertions(+), 8 deletions(-) diff --git a/io.sc.platform.security/src/main/resources/liquibase/io.sc.platform.security_8.0.0_20220606__Security_Database_Schema_DDL.xml b/io.sc.platform.security/src/main/resources/liquibase/io.sc.platform.security_8.0.0_20220606__Security_Database_Schema_DDL.xml index 84d45542..c46c7050 100644 --- a/io.sc.platform.security/src/main/resources/liquibase/io.sc.platform.security_8.0.0_20220606__Security_Database_Schema_DDL.xml +++ b/io.sc.platform.security/src/main/resources/liquibase/io.sc.platform.security_8.0.0_20220606__Security_Database_Schema_DDL.xml @@ -109,6 +109,7 @@ + diff --git a/io.sc.platform.system.api/src/main/java/io/sc/platform/system/api/role/RoleVo.java b/io.sc.platform.system.api/src/main/java/io/sc/platform/system/api/role/RoleVo.java index 8f436d91..1f5463f3 100644 --- a/io.sc.platform.system.api/src/main/java/io/sc/platform/system/api/role/RoleVo.java +++ b/io.sc.platform.system.api/src/main/java/io/sc/platform/system/api/role/RoleVo.java @@ -13,6 +13,8 @@ public class RoleVo extends CorporationAuditorVo { private String description; //是否可用 private Boolean enable; + //排序号 + private Integer order; //默认首页面模版路径 private String indexPageUrl; @@ -56,6 +58,14 @@ public class RoleVo extends CorporationAuditorVo { this.enable = enable; } + public Integer getOrder() { + return order; + } + + public void setOrder(Integer order) { + this.order = order; + } + public String getIndexPageUrl() { return indexPageUrl; } diff --git a/io.sc.platform.system.frontend/src/views/role/Role.vue b/io.sc.platform.system.frontend/src/views/role/Role.vue index 588fdb75..30eb1b8e 100644 --- a/io.sc.platform.system.frontend/src/views/role/Role.vue +++ b/io.sc.platform.system.frontend/src/views/role/Role.vue @@ -6,11 +6,12 @@ ref="roleGridRef" :title="$t('system.role.grid.title')" :config-button="true" + dnd-mode="server" selection="multiple" db-click-operation="edit" :checkbox-selection="true" :data-url="Environment.apiContextPath('/api/system/role')" - :sort-by="['name']" + :sort-by="['order']" :query-form-cols-num="3" :query-form-fields="[ { name: 'code', label: $t('code'), type: 'w-text' }, @@ -20,6 +21,7 @@ :toolbar-configure="{ noIcon: false }" :toolbar-actions="['query', 'refresh', 'separator', 'add', 'clone', 'edit', 'remove', 'separator', 'view', 'separator', 'export']" :columns="[ + { width: 60, name: 'order', label: $t('order') }, { width: 200, name: 'code', label: $t('code') }, { width: '100%', name: 'name', label: $t('name') }, { width: 70, name: 'enable', label: $t('status'), align: 'center', format: Formater.enableTag() }, @@ -52,6 +54,7 @@ return SessionManager.isPrimaryCorporation(); }, }, + { name: 'order', label: $t('order'), type: 'w-integer' }, { name: 'enable', label: $t('enable'), type: 'w-checkbox', defaultValue: true }, ], }, diff --git a/io.sc.platform.system.frontend/src/views/shared/SelectRoleDialog.vue b/io.sc.platform.system.frontend/src/views/shared/SelectRoleDialog.vue index 5346f93b..ee7b7aae 100644 --- a/io.sc.platform.system.frontend/src/views/shared/SelectRoleDialog.vue +++ b/io.sc.platform.system.frontend/src/views/shared/SelectRoleDialog.vue @@ -2,8 +2,8 @@ diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/role/jpa/entity/RoleEntity.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/role/jpa/entity/RoleEntity.java index 8b2fe96a..bf95d35f 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/role/jpa/entity/RoleEntity.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/role/jpa/entity/RoleEntity.java @@ -51,6 +51,10 @@ public class RoleEntity extends CorporationAuditorEntity { @Column(name="ENABLE_") @Convert(converter=NumericBooleanConverter.class) private Boolean enable; + + //排序 + @Column(name="ORDER_",nullable=false) + private Integer order; //默认首页面模版路径 @Column(name="INDEX_PAGE_URL_", length=255) @@ -95,6 +99,7 @@ public class RoleEntity extends CorporationAuditorEntity { vo.setName(this.getName()); vo.setDescription(this.getDescription()); vo.setEnable(this.getEnable()); + vo.setOrder(this.getOrder()); vo.setIndexPageUrl(this.getIndexPageUrl()); return vo; } @@ -178,7 +183,23 @@ public class RoleEntity extends CorporationAuditorEntity { public void setEnable(Boolean enable) { this.enable = enable; } - + + /** + * 获取排序号 + * @return 排序号 + */ + public Integer getOrder() { + return order; + } + + /** + * 设置排序号 + * @param order 排序号 + */ + public void setOrder(Integer order) { + this.order = order; + } + /** * 获取首页面URL * @return 首页面URL diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/role/jpa/repository/RoleRepository.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/role/jpa/repository/RoleRepository.java index 2e790260..2cecc7b6 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/role/jpa/repository/RoleRepository.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/role/jpa/repository/RoleRepository.java @@ -3,6 +3,7 @@ package io.sc.platform.system.role.jpa.repository; import io.sc.platform.orm.repository.DaoRepository; import io.sc.platform.system.role.jpa.entity.RoleEntity; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -14,4 +15,7 @@ public interface RoleRepository extends DaoRepository { public RoleEntity findByCode(String code); public List findByCodeIn(List codes); public List findAllByOrderByName(); + + @Query("select max(e.order)+1 from io.sc.platform.system.role.jpa.entity.RoleEntity e") + public Integer getNextOrder(); } diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/role/service/impl/RoleServiceImpl.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/role/service/impl/RoleServiceImpl.java index 07ad78fc..13e8b07e 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/role/service/impl/RoleServiceImpl.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/role/service/impl/RoleServiceImpl.java @@ -4,11 +4,13 @@ import io.sc.platform.jdbc.util.SqlBatcher; import io.sc.platform.orm.service.impl.DaoServiceImpl; import io.sc.platform.orm.service.support.QueryParameter; import io.sc.platform.orm.service.support.QueryResult; +import io.sc.platform.security.util.SecurityUtil; import io.sc.platform.system.desensitizer.jpa.entity.DesensitizeFieldEntity; import io.sc.platform.system.menu.jpa.entity.MenuEntity; import io.sc.platform.system.role.jpa.entity.RoleEntity; import io.sc.platform.system.role.jpa.repository.RoleRepository; import io.sc.platform.system.role.service.RoleService; +import io.sc.platform.system.shortcutmenu.jpa.entity.ShortcutMenuEntity; import io.sc.platform.system.user.jpa.entity.UserEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -38,6 +40,21 @@ public class RoleServiceImpl extends DaoServiceImpl queryRolesByCodeOrName(String filter, QueryParameter queryParameter) throws Exception { if(StringUtils.hasText(filter)) { diff --git a/io.sc.platform.system/src/main/resources/io/sc/platform/system/role/jpa/entity/RoleEntity.xlsx b/io.sc.platform.system/src/main/resources/io/sc/platform/system/role/jpa/entity/RoleEntity.xlsx index b5b1f8dda47a6aa4096edc22a65ebffa96730f79..7830e6060b86c2029338025fc46e9a3bbfc3ba55 100644 GIT binary patch delta 6049 zcmZ8lbyU<{w`Le(=p2cmLApB?q&uV=kuK>We}JSkLr9m1Gz>_J(k0R*-3TbxB&YT%D`p*Luxty}7H^L{l8;TY!xxatRk~sOPd3OH0JtXLBXsE(f zi(|1{OcMTbLxsw`P2F-LFYmO3+LOo9zISnlg=ID>5gey?F}purUbEWy>mHHbs^_(L zn@~q?KiB9P4r|3`aXacQObrI>sDm*Onq1V4tYAVg&QV(k-zRi5v~z?E77JkEG0jgN zQr8E>ewYsx&z2Mw8;-;Z0kcqUdU}zyobFyJox0_m9kyvrH84c8(!pgFoSoMWy+4gL zkXp5r;ZPe$5s2Ds%#6g#_($W zqMwl~@AC?z65xFi_(fy+zm*WlJ$Pf~E4i5Dr6uVr*=o;H>(jK`sDRtMipkuTS7iu> zll}T=Z0Pc|F)bZI6t75Sj`QK&Bg^_KyV{KYT5Y%rr2rZe*u^0F<6Puy(^(Px^i7nH zpoA}~2}W_|D8bu7<3U> zh$`mk{JfjF5rI(W_mFx~zg%XPR!=XVA4kAFBFBlZT$DE2H6~M>JKyT3{ID1o7TAwE z8=9%$ti#iyKv9fN+E|R_pGh(o=#=iwDuZkof+(wW+h4U--2uKD3(ezEZ#D>;W*pe! z%!2}Du(1ve_)uTxy5z`p4n3@Oa}4&a4Z&*q5p^mzZSGoddUw{uRb8~ru|0-teATH| zsMx^g!m62PlS3%xEu+sw1Dc-*s#H~?y)jv(w@4OFDhIZ3rc4RR_otll zY~O2y;*}K0p4q(#ZhLSX-Wt{~!{)@aI^(7JM88Sez@WHtoqgnxTM|Iu=qi2&>_pgM zGsSi;v15PC8gnOOD=KMP<=l620s0Qv#-lHBPq~Vr$IE6B()Y?wsd1>~D;6@j!yN`J zSx!KfZE0p87UnnwuhO8Lw`RX$i)*hupbD$~Y@3o(K zeqCfdd*Hqvv+E2S`UF(Bmk(bvF^JL2eMMHOAo3nf!8A8YHK;a~xT6?eyhkb+esHtf zHsDjnK6!8lLH=ITV-E>aQX7yYlP{0^kOLV|Bin%D9@&ps&NSKxH_DT@wwkbF6lM${ zStA-)&z>|L;EBdV1dV#G2uLo72_+ZDN7>)SSqoEL5BVRP5&;gR;bol6l!;29p3h|! z7)I|asSKk;ND`tUf@c)!^lLnZXOcq9CbR8<>jOGb?>a>JeKMC@ITTt2^g+%~O{?u4 z?9@muof~Fx(hGAlD%6)Byxl8F(u;2^v3;7ofSs5tlGNhOoaIUy*ivc8m^<(O6gd(x zz}q74pnTw0Yze%(qi0|@vn0N@>Tyw_^ZSr@p*s$?C{lj`4_a!2?XiMqW3_EDj+ifO zBj=TA24WTIPXiK+FGvOjHfxiw1eLBr`tB%6P$WdQeU-^ql1h;weJuj$L<%8!VfgwX zIblsmN$a33nbu2+<8qpLNA|S=Pig+GX^iLV1EJ`G^}rTCi0bMz09}xO`yFHb<3%6r zq~J;7Z&*Cft%vW#Q^e}GZALc~ql~ma0=M5EI3J&T z%3X#<^>{c&h; zS3Yl_09QM2UbvgSB5Z2=JL{6zfD;?!jXevc7BuyGF zZsraxy}rG9Qb$e*#euTtX>GPX<=}G+1AESTcK#Cd&H1p&byAqUl23K~U4CU@)%=X< z@cgzA_z4v54G(1WhI6eT?;5rUmY}|x6)G3?hv#`4p&e(PF#GogsRQ96-%V=8nwBz{ zgUs8I*XMO^2``!FKZaT_g=26>Z~5&oK$H%V(noX)V3!ZOiQgH6r!Q~Ap(SW*e+da7dIj0E^Na3Fr>$tSBiha$nL-kL4NFRB9hBmAJ)f(&8BryMaeH5nG`m4 zzLw(rinUJ(g3gWIF5VcA&t#7}8ELDDu(GV=J=5ehT-{Nfj8V~sVAmqCT-a7inOP=Y zhPvWTN5SE>9-1#kefS!FO}M6-Mlx`Yb^8@;e$a(*g|Yy5oqqko&?|v2Pna5>UBBId zxQ2Hb3c&DiN9&Uo{0ruOG#t4yj?rj1M?J4lwArkmqST4*cFFnHk}?$WaeK6iZ&6x{ z+HZv^e^}Kvk81A3o6rJ_)5ZQvWF%(8mzv$5k%z>;$qCXt7oH*Vxp#c4NPhD@+~8E*_{b>T z52VAc$gf%Pyjcp)sY}Z8$YcNmLxLA_X1Rt!&7~6@Pd1QI& z*GJzs&aD<)O8gh*DKv|@YI;FLs^fF2T~7Y)+4CRnu=oL+*BdWr zO&Kt31#El`=W?QLnr4)$W(83>?ZMZ+DIPPXO7dWlbVYd)CxD<&?C{*sLPXfY!Uq?! z!#50!2ByC^BDYuit=2O-WTpDr)4}8PJ=NO?m8}mY{6c3&r2jz6<}Y$7SQB?&_5MSm zy5_d z?@Y=`phs=(swn3Q6aE^l#aS4S*hNeZ;G-bZZ5zx^fkQE02tNB>#DIe!Tu06H;ucMo zYf;I~$zEZbaYkO;al}?Fw)ZTxbj-^WZJ@#jM$$ z&{ltEo-n}9Y|fpS9SIqkj)Z(1tl;b)G?z4!?RggbN^ia&IO7Wt4Y*29wpdk}B-+LEI!`dtN7k=EHD(#{O& zMS7ov$_|!LS>;A`ra4iuhN)NUw&~uK^RURg-BenyU4R+ggRC;QKymYkft^u>>dbF# zd8WwL8MUR07p9rbKQ@>w7n@_Ikxgzy6sJ?oGI^OmnOjh6Y}OyBiQ8?dSMkFisLHP9 zkAnFkE9nZ+#wqBD^{!9I zXmqApa&Stj6zxUA?vOZt_b)2UlQYvdXmw+L;`Gpv+{)GPJt+?`vpr0{JCPt^!Rdr7fzY1~o)3XvII|>AWqhPbL*X}>W(qM&AjP;mmInNQoA|=Q&ikcU{A!z_A;w$B zPg?AIsI}yBZGf7jNKI~MolLLM%M!Rf#Uu7QyEKN3_@`shUuKtO3%1|sTUgA2t#3haa_*O9f=>E}>*y7|bks!Om3UYpN?58k z+hjR$-Y#Gg;>4k8F_I7w8Bn&QKwd>FNIxpFd7vVBx7m$yPaxzEKbJ&_>!}=tJW$^t z0m=K544)QS(L7F2g=;v%0hlYgBK_K<>*><{yEV<@Rf+49pRY3qG0mNsiIo`&ixg?u zv7YACYZc!9>H5dL(&mW1r0u#w4fi%CKN7#&VIyz0#@NGR~zFoV* zZ)Gpdy56RaM-S?2#&U#9cy`Xft!E><)XvpLv536bt%oqh8^cu3aqWbr&2hX4-|(12$%F!ZiP8qHC)sG45iW3z86E^;8aLoazSjKHV6Sa6Z=dUb(*BotGE`%` zJ=GxU^CKw6he#Ubc@n?uq7K-5V8mUn5AHb#*7C6H8^g8Z@JB2uF>UY(VtRXAu3l(5 z@VR!M;vZMpd@&VSzgb?B+rvPV?hun6;|S21%H z{kDI}KUSbf9FOaO-k9#2c5b~7OMp_h)&j-VJ{c2a14@!QPA-d>jff&3x zm#|ZadDO>8p6lY@wGRfy{7TDwD}7fcs&0N@E#(^O4ztR((q_~1F+)RZL^u=T zhrR_JBu=F}4$TpN`c-)V(lOY<9Ovn6Ku@jqMVh3&Qjn{Er;WBs7QJU=+A!T2(=7$& zD{`8j!sW!_&(x&jQkBG!7jDxHE2{=B<9>q;;?llp>Zp*<`CWidtTTQ=b1DZEpq3sm z!9U9np){xMjivmpMz$8tg6vok_Vd%MS=4JbGw8IRuTlyL!uC>g2yz${CfD5m0A5$P zXL@$0GrRXo4F44)Y}-n)OCs37ioWAyocfmkG#Upb88TnXPhVSd=s2W8JA)O^#Juf! z%f~HxPxMzhBmc9WK+s~eHf3>qrVN9cKxk;?h%5$LK-+~(j{Fl|XpG%SQH;GUk>Ydz zAeDX16YIxat-o^czmHW5kvWkRM>xtf!B{GwW{Z_IGIn@+i|!Ml*`uy!JbCQoD;m-t z*FIgsKkV_;K5Y0&)5?%=^DVR{iKd7#9^!W6xHEjV4Bm#sIYrtkbt@k-Ogww>E0ZnK zCm{=$9(eyogTB2MVwPg9Ys;b2TP;{%?WDHqqc{RmF2Q6#EacbCQ!HbUy~;~@UxAvu zMfX}vmv)ig!h%T4p=)DR<`VIVp*EIue-C)ut+$cg5{c0Sa}Ze>=+1uS{FHB?n{QWo z=;R}2luwqiV|VE@(r{-9%^u;c?1R@!9RRe2!1sjYvB6)3=li9 zmLc<4+smiWVV?Y4X@{Px4&svYe8$E^%*a+Dd}%L&-mh)jk#P!XomFtea7p$gGlaWB zMIv{9voz)c-u01Xoh}Jc!O!WQWsEw8G8-3Wli0+;xWnznNPh(T1Q15|^2xOX$?)N7TqtDeBSdZoE zP{&3eInn_z6);DF!XE#%C^8NKWf*6Uaz|rTuPJOYN@y@VZ;vdJJ&_xckz^87p_YlN zE=r?Iz{A01dAC-?|I|-9JDUBWnHsnxJuM}l+Dv4aoZPVZK{1IXLs5GpmB)(4IH$I= z%W979lX?#zB62PwKwWS+opSQBfCpW?mr4`vprnfis7b;einr;XKdV)IImLd4Dtiua z2Jup`yzd%g>5#X^SDlf^f9}}BquDUtGQoKukd4vZThy}n)BU9q{|t>>JyE*|3xZ8R zNVR775`g_i!&FY;QjW)2{T%|O<6&hyOO#n)$mAD;vgPw{IAJaQtxGo3UV^(L$q(;o zWNY_FQzP)@OvYg|yaC@62WD|Lh2oQypAz+L^Gj)d#6)+J56uUk==2{bc~ISCgHWMs zG${>D=Lpq1QVbYPve>W){l#Bwsj6`r~6EM0y*3|V%D!G1jCEH&8_naPYX8pd)o z>aAVu+S?rpI*!F9D;g>UR@nO+Cs~23RQZw%l3`fT!9VHL0z)ROi-n`ExMcMb8u=6m z^x}>&;k%EOU@GEWyG>$!Fr%?aWIbF-R8XOe)8r>kI4$4{vtHa)K-`xn{N@qfP5kMp zYBLV{#6N5Yjf<;?wm+q8vd}}RTs2v!9|^w097idEbuEL3JPnk6DG`X><3dkLmcIo%E7YUaOWokd;Le2Z}tZU!;~~ zU~D)n!6|7riC&O+5^SthP|ppI*NU#W6@b=F_>XsgKXK{bdb1Z5rYCV0VYzLUgs{I0 z3fe|6`^7djesl4y^A9ROb{F)*GI+j1+aV07$Ov91XZN6`S614o0wUp_FBj=?ka~7N zI;7G8WiIuA)}FKG+;oR9&Rw}dQwGmY*_8XoNWVj=It?AK47EC4t3WUBFNLl8$zr=o z2XD^lU1R8*>syEju(xkVQ^(T_5jLAu(7}2p+O%Zx(NReY3+SBI9_)$PV`+?DJsug` zD^2-u71xZIC=Fb01Hu-LYv(U=tD#NtB0*}n>hdFskZp}L6ZT4E!;JLuVaX7a&th%& z6@j`_(G7m-4{_vW-P3N$FO)XFcuCm3UT7|ItV)pdgfJ$tw@N%3F~z8!s!4W)#wvG& z_6o`f&z7UDN^P$9l4Iu}7ANvcqaSX+U1Wz@Yma;o_3OMmjoiCk9=p#gpoRW?a$Ggl zs;u=2;kHe83*%Y_qQ=1VC`CdRGNhm5+$(GV;EV_W00B_?g7gR^#LBBc;$f(b>pk{y zFexWbG`EH*O1pU9uW;;O?*K!r8%dNYs_SxpYw0m~uKvwdE-5+ru<3kl=zDOMnK)-c zrnAK}bQFI^j7$RNgy#0-1m2(oVRfY$i+1)%lrxK9_D9@R^EAQv1YT z&kJ-AYq>@Q4kMmkyj)`|qGIlv6?ob1Qpi~pzb}>KTp}`@;$)U6$#~%4-z~fl7|Q?ap7pmDgZAo}3!*{z|f!*DxZ& zNU4LvSG2aDwG8wj%MM1O%)(0d=@qr>WgN}do(g(r{y^|b0ohuHHtwFQ=Q5WTx-=M& z-BA4Te9%SF)gPpVo}dY3+oh##501GIcXAwSYTyXH%?9(o;g2*{grs9t<+Pf#alto@ z7l`zQ#`U|!>zy@fRPf1bej)1c7CNx}F-qr4pZtwAPL$0krN`Xa&SfqIlQtX^vGxQQ zmx%|d=@7j(-$I~Amu!mfUa`7fnsEAbThAcDzpJT8c4K8CR94)Ie9{klHMhSmy|!+% zIyEh=xo3~)#CIu;G~*NU%j*3cZ_6)AX>NBP_H$1~mO)imx~)Yy>qW;J2FmZw26AT; zZ>tDvbE1rRNeu!a*=QfMKDd6D&<0n*DKOZu8$mRA$>wNmOh0=^v4Kbp!oNymOFQFcD@^=wB@mD8@A;h9{>7_mq28EIGO46` zbs3c%bq8_$sYSuRKa~|DODcMpy9VqTU>fAe}90uJKwA0yT&&C z;&|=Q!%)w+lVF&-XE(ho`F+uU^ICk+t%41S?LLFC^m1w7!~fIx((yKX*^B`nzcMs* zq#m2ljHGA3-Gt#O4c6zN?gBzO4Vj!2U6U&ply01wTXh z69rjClqV%8_P~7~)Oa5e6qQOXA)T~~gP&=tLhom4v&U# zTs=(=2~XcUyVjl7btx5tF1Kv59D>r%>Qjtjc<-IF5&QoBdTx`KW}x zte+_$v&RDpwU(RxG@5vldlj^=dA*whdo&06O8ZIn)1tC&;q zA=+zv5Vtk0?8DGQR%Tp{KY#xBclJ>}Te8gpSqcYzOgP%F;%y^2n!dn09wx zfc&w-K{L<(XEMCEHp)I}%G#f*&YD?cVjj8xp8N}&YDw|((cP|YAFdTHm zGRfx%9ZhX=#2Mb&EViZF2r7h{1F`ttze|MrLTE^dt=j&wc$2^*q75R%Kuk1#{K&$8%mf*jYb#L#42Y{^(pWS7y71j14&gu`_-P$KuqEiZFWr7vzvZ)sph2e)-Rv|jByWOU-B?Nj$C zxv!=8L9KEIhu74!Er4?7ZZx{8==WuJJHeHsGH90t>GD1!iG_satDgkzX4+=&)6?iakA{MpO-xC3Ot%(sqK|2z2q#&$y0;IVRPPKs z277HZGku)B?&|1@Bh_D88)nj7Y7q*vBY5mQhb6aSkgC3Yc1|0D;KA27MbUJ6VMDEA z-^;rV-TzJbS0LWOYQq{e{Qhq%y2~n%lMFg0|1@dq+_p}i$h6HEH@13X@hZ#x92=y5 zHGIH~xMF~_i+nnb1WZj&O$Q~_?UFvGW!{WqyGrD?dq)X*IG=7y4#6oP^meC$uRe`` zO%$`>J7CX*CTdbq98w=xsOiiUo})@?6c;^BtTC@t(MVwYnuZfN1?EYZBfyJeW4iRV zJ88qHzyf(lVAHt zjgN66Z{;xVSbs2im(W@vY}pP!&kJ=!@=J7!Q`7K)w=KC{*Ww@SlEkUqufNCs_$W6o zf3T}StcOwrhJf8gUXp94Bp0Fd^001e<0p7-zfo>0+E|@5w;kZY5oG=KB@k+_vPOz> zr2w$J*`_z|(uOZfHrvt{$a>Na^gK}mPl6P3Vk|0O zWD0uP1r=@3e>CPxkeX~vyLh6b?7~ds-Z(=7K(SUEwI|mq#;CF?Z(b@<`oHhij9@nA zDLo%BO3*mWG1NMHh-z<_oHQC;;vX?`<)O&RBqgf@n(<5d?o9kK4s}* z=ibjV{sN`oi-Xl#{=dLxJ-6`P)g18`Rle0Wy_%@`3yE-7U-Ama&wrmt_&@j`_F~*O zd9bn%MIGei!@QW`eN`9e+KQM`2`UBRW}w*bpp^;QIY8c{L26;qid?(x_XYq7RbMD$ z=F07BEO_8!!*Ek);hf}z79A6>k(2iU;glF;{z^BVs^ckw`#GC>`D-o)_97xabB_`g zIHB^NE0_{EZ2PI<{_7=elZWd}6vG~>s|_DJ&lHuMYv$9pCrWyfmz|YbgncY$@-->Q z<^!m3&JVxA{SjA*A3lU!%*T;@vg_>yp1TNYb8lTNCzt3gClXMslrn}~xj=>oL z)ey-sdG*nV@s$D*jEIqH!y_K~q{93ba8YN8uoF*w5DDqdwgLUOAM%PPAHH&t=RUf< zGT^{J`^rt)Bx2W1Ix!+IEqAlCvAQ}yzAT?xq$bOznJmsR(l2v0ZKHP(Nt$Nt@)f^W<(X-ep=VY%1YVB!?CuSPqa=$r8t%n z*MrX?8&SBvMP3}>;1^E#X__^=BxT{6Eu(`SE4GU*?Yn%dOb7_|J9G3m%>+(@TyyAY ziQ2?9qBVP|+4uD5tIVcEJ+G-iiuKOB*h|j@8zzxnhWOdk)5jsa!49U8<~oo z(=kk=3^}0=LHzdCE1$rYuF+^0iKbf&t=@-D4jCE|R+?g)FrS-b>F}d%)GMwJA$~Ul zBitVC1jD3CmM;Abh2?MhVta^Ab8u5fPiB8#AR;P1hwHF^AWbgIqAPDcOs{rsQAST#>3_P0q6`R>c}CD#M_$x${N)`U-k=T*P8 z%F1P@`G64$`5hh73Q+w&9oz)#MiOvpYoAx{Qo(dYNzQOu68EWZWxYY90e&7o7oIUP zyW~JaYFXt*AeIKNuYQ#?faIMmRZ$7xlt=I1Z2D0xlA%UFW&hmk1(rDlQrI!q1a23N*J8l^sU?8reFLvI7Ry}OjQ49^PCl&0SzFH;2* zBd(}fZ|aUT++g+*QS+6PX<7-k<#L2W#C1PXsr3;UMNmVo3PmE3GZy9zEbYv8o0>n@ zZ0yr-^Wz`(yukv$?M0s<5v#SRKJbHb8(KBmvIgfPs&diML$cAwOBdnJG9_f|Wx0zD zoSqN7+3#ws@<*ma7zA`G7Z-kg#AKu9nVArx#8pb+M+BC_EmA%!rQ3SD-BV5lMX++% z;%LRypDBM>L4Iv{!njcVZm~W6^L;CjmOgufRU;++@CUpLtd53rnd$EFc7mrj9R)qL z$HCrJU-l6r!O{XrJ)c~=u*oxGXU5@iIgl@h7wdWJO(>w{4`#QhS3g~GD$}`>drVLP zkAx8rlfy~+A4pxb&-C*Q7-{nsTlSK&aigi;?AKalcH8K^>(6qsccryvB*?Nn!HH2+$^J>z*; zUgz+2-Hb6;stv8lV#3VtSvr#IjGh6q8*ybd9mlMa?|l!~Pkx=H73!AAD}ahjN! z6RUI6n)NU_%d)DXKO1`NVkDJqVNsm#qPb-S;JP{|uDC7_t4H|cfoc@*NU`}xDz0{B zVi3_QuSmUS!mUdV=cs>vH}U&HOji~)XKMhBmPxvo?Yz1N>T6-+Jp6l<5CC53t`RAu z(eJ(~1OfnlsA?7_gpL-2BB+J-hJ0Y9ojD6>sLAtnmv!y)Xw+T!_JR9Tv@~W|`xy@| zaZw$9HY1gL+1hyz4_}_U-2R?1u;zPM zO6ZX#9sGa*v2xX15OQxsX)-i)v-dG>N7cdm{NduT@rki$%{Q2}A4%|h)bP=7KX4Fuuc-+|>>djO^3ju0K26qn2#ORAwz-2QV#O z-QK@xO?Rl7qYc6o1nBuSTyEqJ)W?Eg>3EZ4!r7YefublWUIm~9DwtOoh(J~GqW;@pR^u}U5}J~7;qS+!mkF5LLvEOv2JitgZ#{l|6`Zp0{{$v7vi4)0$BbcCmu=*kBLuT z3yAd)@ISlqzpL`sh5Cp6C;n3qj?#V1#qj^n-v8AtQ7Mn5fF!7a$6{E*q$nFwY7|I- z7YIQq3&;T3QQ-p8SSOsQdjT3$G%p2eU4R}4M%@XBG5lZ8>)(O@Jy8#(C&-7l$@35Q EUt1VLcmMzZ