From 4950578310f8b3471935ef8b13ce4c8834b62323 Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Fri, 1 Dec 2023 17:49:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AF=86=E7=A0=81=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/lihongjie/coal/common/Constants.java | 1 + .../controller/PasswordDictController.java | 52 +++++++ .../dto/CreatePasswordDictDto.java | 11 ++ .../passwordDict/dto/PasswordDictDto.java | 11 ++ .../dto/UpdatePasswordDictDto.java | 11 ++ .../entity/PasswordDictEntity.java | 17 +++ .../mapper/PasswordDictMapper.java | 22 +++ .../repository/PasswordDictRepository.java | 11 ++ .../service/PasswordDictService.java | 137 ++++++++++++++++++ .../lihongjie/coal/runner/InitDataRunner.java | 5 + .../sysconfig/service/SysConfigService.java | 1 + .../coal/user/service/UserService.java | 26 +++- src/main/resources/passwordDict/dict.zip | Bin 0 -> 38337 bytes 13 files changed, 302 insertions(+), 3 deletions(-) create mode 100644 src/main/java/cn/lihongjie/coal/passwordDict/controller/PasswordDictController.java create mode 100644 src/main/java/cn/lihongjie/coal/passwordDict/dto/CreatePasswordDictDto.java create mode 100644 src/main/java/cn/lihongjie/coal/passwordDict/dto/PasswordDictDto.java create mode 100644 src/main/java/cn/lihongjie/coal/passwordDict/dto/UpdatePasswordDictDto.java create mode 100644 src/main/java/cn/lihongjie/coal/passwordDict/entity/PasswordDictEntity.java create mode 100644 src/main/java/cn/lihongjie/coal/passwordDict/mapper/PasswordDictMapper.java create mode 100644 src/main/java/cn/lihongjie/coal/passwordDict/repository/PasswordDictRepository.java create mode 100644 src/main/java/cn/lihongjie/coal/passwordDict/service/PasswordDictService.java create mode 100644 src/main/resources/passwordDict/dict.zip diff --git a/src/main/java/cn/lihongjie/coal/common/Constants.java b/src/main/java/cn/lihongjie/coal/common/Constants.java index 7c08bc10..10c61721 100644 --- a/src/main/java/cn/lihongjie/coal/common/Constants.java +++ b/src/main/java/cn/lihongjie/coal/common/Constants.java @@ -39,6 +39,7 @@ public class Constants { public static String SYSCONFIG_SESSION_TIMEOUT = "session_timeout"; public static String SYSCONFIG_ACCOUNT_MAX_ONLINE = "account_max_online"; public static String SYSCONFIG_RESETPWD_ENABLE = "resetpwd_enable"; + public static String SYSCONFIG_PASSWORD_DICT_DETECT = "password_dict_detect"; public static String SYSCONFIG_RESETPWD_TIMEOUT = "resetpwd_timeout"; public static String SYSCONFIG_RESETPWD_MAX_FAIL_COUNT = "resetpwd_max_fail_count"; public static String SYSCONFIG_SESSION_GLOBAL_RATE_LIMIT_PER_MIN = "session_global_rate_limit_per_min"; diff --git a/src/main/java/cn/lihongjie/coal/passwordDict/controller/PasswordDictController.java b/src/main/java/cn/lihongjie/coal/passwordDict/controller/PasswordDictController.java new file mode 100644 index 00000000..b11f0d20 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/passwordDict/controller/PasswordDictController.java @@ -0,0 +1,52 @@ +package cn.lihongjie.coal.passwordDict.controller; + +import cn.lihongjie.coal.annotation.SysLog; +import cn.lihongjie.coal.base.dto.CommonQuery; +import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.passwordDict.dto.CreatePasswordDictDto; +import cn.lihongjie.coal.passwordDict.dto.PasswordDictDto; +import cn.lihongjie.coal.passwordDict.dto.UpdatePasswordDictDto; +import cn.lihongjie.coal.passwordDict.service.PasswordDictService; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/passwordDict") +@SysLog(module = "常见密码字典") +@Slf4j +public class PasswordDictController { + @Autowired private PasswordDictService service; + + @PostMapping("/create") + public PasswordDictDto create(@RequestBody CreatePasswordDictDto request) { + return this.service.create(request); + } + + @PostMapping("/update") + public PasswordDictDto update(@RequestBody UpdatePasswordDictDto request) { + return this.service.update(request); + } + + @PostMapping("/delete") + public Object delete(@RequestBody IdRequest request) { + this.service.delete(request); + return true; + } + + @PostMapping("/getById") + public PasswordDictDto getById(@RequestBody IdRequest request) { + return this.service.getById(request.getId()); + } + + @PostMapping("/list") + public Page list(@RequestBody CommonQuery request) { + return this.service.list(request); + } +} diff --git a/src/main/java/cn/lihongjie/coal/passwordDict/dto/CreatePasswordDictDto.java b/src/main/java/cn/lihongjie/coal/passwordDict/dto/CreatePasswordDictDto.java new file mode 100644 index 00000000..ece81787 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/passwordDict/dto/CreatePasswordDictDto.java @@ -0,0 +1,11 @@ +package cn.lihongjie.coal.passwordDict.dto; + +import cn.lihongjie.coal.base.dto.CommonDto; + +import lombok.Data; + +@Data +public class CreatePasswordDictDto extends CommonDto { + + private String pass; +} diff --git a/src/main/java/cn/lihongjie/coal/passwordDict/dto/PasswordDictDto.java b/src/main/java/cn/lihongjie/coal/passwordDict/dto/PasswordDictDto.java new file mode 100644 index 00000000..58169239 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/passwordDict/dto/PasswordDictDto.java @@ -0,0 +1,11 @@ +package cn.lihongjie.coal.passwordDict.dto; + +import cn.lihongjie.coal.base.dto.CommonDto; + +import lombok.Data; + +@Data +public class PasswordDictDto extends CommonDto { + + private String pass; +} diff --git a/src/main/java/cn/lihongjie/coal/passwordDict/dto/UpdatePasswordDictDto.java b/src/main/java/cn/lihongjie/coal/passwordDict/dto/UpdatePasswordDictDto.java new file mode 100644 index 00000000..e9092c8a --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/passwordDict/dto/UpdatePasswordDictDto.java @@ -0,0 +1,11 @@ +package cn.lihongjie.coal.passwordDict.dto; + +import cn.lihongjie.coal.base.dto.CommonDto; + +import lombok.Data; + +@Data +public class UpdatePasswordDictDto extends CommonDto { + + private String pass; +} diff --git a/src/main/java/cn/lihongjie/coal/passwordDict/entity/PasswordDictEntity.java b/src/main/java/cn/lihongjie/coal/passwordDict/entity/PasswordDictEntity.java new file mode 100644 index 00000000..a4f4467e --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/passwordDict/entity/PasswordDictEntity.java @@ -0,0 +1,17 @@ +package cn.lihongjie.coal.passwordDict.entity; + +import cn.lihongjie.coal.base.entity.CommonEntity; + +import jakarta.persistence.Entity; +import jakarta.persistence.Index; +import jakarta.persistence.Table; + +import lombok.Data; + +@Data +@Entity +@Table(indexes = {@Index(columnList = "pass", name = "idx_password_dict_pass")}) +public class PasswordDictEntity extends CommonEntity { + + private String pass; +} diff --git a/src/main/java/cn/lihongjie/coal/passwordDict/mapper/PasswordDictMapper.java b/src/main/java/cn/lihongjie/coal/passwordDict/mapper/PasswordDictMapper.java new file mode 100644 index 00000000..6fd325b4 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/passwordDict/mapper/PasswordDictMapper.java @@ -0,0 +1,22 @@ +package cn.lihongjie.coal.passwordDict.mapper; + +import cn.lihongjie.coal.base.mapper.BaseMapper; +import cn.lihongjie.coal.base.mapper.CommonMapper; +import cn.lihongjie.coal.passwordDict.dto.CreatePasswordDictDto; +import cn.lihongjie.coal.passwordDict.dto.PasswordDictDto; +import cn.lihongjie.coal.passwordDict.dto.UpdatePasswordDictDto; +import cn.lihongjie.coal.passwordDict.entity.PasswordDictEntity; + +import org.mapstruct.Mapper; +import org.mapstruct.control.DeepClone; + +@Mapper( + componentModel = org.mapstruct.MappingConstants.ComponentModel.SPRING, + uses = {CommonMapper.class}, + mappingControl = DeepClone.class) +public interface PasswordDictMapper + extends BaseMapper< + PasswordDictEntity, + PasswordDictDto, + CreatePasswordDictDto, + UpdatePasswordDictDto> {} diff --git a/src/main/java/cn/lihongjie/coal/passwordDict/repository/PasswordDictRepository.java b/src/main/java/cn/lihongjie/coal/passwordDict/repository/PasswordDictRepository.java new file mode 100644 index 00000000..93f59faa --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/passwordDict/repository/PasswordDictRepository.java @@ -0,0 +1,11 @@ +package cn.lihongjie.coal.passwordDict.repository; + +import cn.lihongjie.coal.base.dao.BaseRepository; +import cn.lihongjie.coal.passwordDict.entity.PasswordDictEntity; + +import org.springframework.stereotype.Repository; + +@Repository +public interface PasswordDictRepository extends BaseRepository { + int countByPass(String password); +} diff --git a/src/main/java/cn/lihongjie/coal/passwordDict/service/PasswordDictService.java b/src/main/java/cn/lihongjie/coal/passwordDict/service/PasswordDictService.java new file mode 100644 index 00000000..ea44dbb0 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/passwordDict/service/PasswordDictService.java @@ -0,0 +1,137 @@ +package cn.lihongjie.coal.passwordDict.service; + +import cn.lihongjie.coal.base.dto.CommonQuery; +import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.base.service.BaseService; +import cn.lihongjie.coal.common.Constants; +import cn.lihongjie.coal.passwordDict.dto.CreatePasswordDictDto; +import cn.lihongjie.coal.passwordDict.dto.PasswordDictDto; +import cn.lihongjie.coal.passwordDict.dto.UpdatePasswordDictDto; +import cn.lihongjie.coal.passwordDict.entity.PasswordDictEntity; +import cn.lihongjie.coal.passwordDict.mapper.PasswordDictMapper; +import cn.lihongjie.coal.passwordDict.repository.PasswordDictRepository; +import cn.lihongjie.coal.sysconfig.service.SysConfigService; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; + +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.convert.ConversionService; +import org.springframework.core.io.Resource; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +@Service +@Slf4j +@Transactional +public class PasswordDictService extends BaseService { + @Value("classpath:passwordDict/dict.zip") + Resource dictFile; + @Autowired SysConfigService sysConfigService; + @Autowired private PasswordDictRepository repository; + @Autowired private PasswordDictMapper mapper; + @Autowired private ConversionService conversionService; + @PersistenceContext + private EntityManager em; + + public PasswordDictDto create(CreatePasswordDictDto request) { + PasswordDictEntity entity = mapper.toEntity(request); + + this.repository.save(entity); + return getById(entity.getId()); + } + + public PasswordDictDto update(UpdatePasswordDictDto request) { + PasswordDictEntity entity = this.repository.get(request.getId()); + this.mapper.updateEntity(entity, request); + + this.repository.save(entity); + + return getById(entity.getId()); + } + + public void delete(IdRequest request) { + this.repository.deleteAllById(request.getIds()); + } + + public PasswordDictDto getById(String id) { + PasswordDictEntity entity = repository.get(id); + + return mapper.toDto(entity); + } + + public Page list(CommonQuery query) { + Page page = + repository.findAll( + query.specification(conversionService), + PageRequest.of( + query.getPageNo(), + query.getPageSize(), + Sort.by(query.getOrders()))); + + return page.map(this.mapper::toDto); + } + + public boolean isInDict(String password) { + + return this.repository.countByPass(password) > 0; + } + + @SneakyThrows + public void initDict(){ + + if (sysConfigService.isEnable(Constants.SYSCONFIG_PASSWORD_DICT_DETECT)) { + if (this.repository.count() == 0){ + + log.info("开始初始化密码字典"); + AtomicInteger count = new AtomicInteger(); + + try (var i = new ZipInputStream(dictFile.getInputStream())){ + + ZipEntry entry = i.getNextEntry(); + + while (entry != null){ + + BufferedReader reader = new BufferedReader(new InputStreamReader(i)); + + reader.lines().forEach(x -> { + PasswordDictEntity dict = new PasswordDictEntity(); + dict.setPass(x); + + + this.repository.save(dict); + + int increment = count.getAndIncrement(); + + if (increment % 10000 == 0){ + log.info("已经初始化 {} 条密码", increment); + em.flush(); + } + + + }); + + entry = i.getNextEntry(); + } + + em.flush(); + + } + + } + } + } +} diff --git a/src/main/java/cn/lihongjie/coal/runner/InitDataRunner.java b/src/main/java/cn/lihongjie/coal/runner/InitDataRunner.java index bbafa28b..47c27f8a 100644 --- a/src/main/java/cn/lihongjie/coal/runner/InitDataRunner.java +++ b/src/main/java/cn/lihongjie/coal/runner/InitDataRunner.java @@ -4,6 +4,7 @@ import cn.lihongjie.coal.coalParameterDef.service.CoalParameterDefService; import cn.lihongjie.coal.dictionary.service.DictionaryService; import cn.lihongjie.coal.organization.entity.OrganizationEntity; import cn.lihongjie.coal.organization.service.OrganizationService; +import cn.lihongjie.coal.passwordDict.service.PasswordDictService; import cn.lihongjie.coal.permission.service.PermissionService; import cn.lihongjie.coal.resource.service.ResourceService; import cn.lihongjie.coal.script.service.ScriptService; @@ -47,6 +48,8 @@ public class InitDataRunner implements CommandLineRunner { @Autowired UserMapper userMapper; + @Autowired PasswordDictService passwordDictService; + @Override @Transactional public void run(String... args) throws Exception { @@ -74,6 +77,8 @@ public class InitDataRunner implements CommandLineRunner { scriptService.initFromResource(); + passwordDictService.initDict(); + } finally { SecurityContextHolder.clearContext(); diff --git a/src/main/java/cn/lihongjie/coal/sysconfig/service/SysConfigService.java b/src/main/java/cn/lihongjie/coal/sysconfig/service/SysConfigService.java index 7fa96d65..e0e523d6 100644 --- a/src/main/java/cn/lihongjie/coal/sysconfig/service/SysConfigService.java +++ b/src/main/java/cn/lihongjie/coal/sysconfig/service/SysConfigService.java @@ -173,6 +173,7 @@ public class SysConfigService extends BaseService { @Autowired RoleService roleService; + @Autowired SysConfigService sysConfigService; + + @Autowired PasswordDictService passwordDictService; private Pbkdf2PasswordEncoder passwordEncoder; @PostConstruct @@ -92,7 +97,11 @@ public class UserService extends BaseService { checkDuplicateUserName(request.getUsername()); try { stopWatch.start("encode"); - request.setPassword(passwordEncoder.encode(request.getPassword())); + String password = request.getPassword(); + + checkPassDict(password); + + request.setPassword(passwordEncoder.encode(password)); stopWatch.stop(); UserEntity entity = mapper.toEntity(request); @@ -108,6 +117,14 @@ public class UserService extends BaseService { } } + private void checkPassDict(String password) { + if (sysConfigService.isEnable(Constants.SYSCONFIG_PASSWORD_DICT_DETECT)) { + if (passwordDictService.isInDict(password)) { + throw new BizException("当前密码为常见密码,请重新设置"); + } + } + } + private void checkDuplicateUserName(String username) { if (this.repository.countByUsername(username) > 0) { @@ -119,6 +136,7 @@ public class UserService extends BaseService { StopWatch stopWatch = new StopWatch(); checkDuplicateUserName(request.getUsername()); + checkPassDict(request.getPassword()); try { stopWatch.start("encode"); request.setPassword(passwordEncoder.encode(request.getPassword())); @@ -181,6 +199,8 @@ public class UserService extends BaseService { throw new BizException("两次输入的密码不一致"); } + checkPassDict(request.getNewPassword()); + user.setPassword(passwordEncoder.encode(request.getNewPassword())); repository.save(user); @@ -191,7 +211,7 @@ public class UserService extends BaseService { public void resetPwd(String userId, String password) { UserEntity user = repository.findById(userId).orElseThrow(() -> new BizException("用户不存在")); - + checkPassDict(password); user.setPassword(passwordEncoder.encode(password)); repository.save(user); @@ -240,7 +260,7 @@ public class UserService extends BaseService { adminuser.setUsername("adminuser"); - adminuser.setPassword(passwordEncoder.encode("abc@123")); + adminuser.setPassword(passwordEncoder.encode("adminuser@123")); adminuser.setOrgAdmin(true); adminuser.setName("超级管理员"); diff --git a/src/main/resources/passwordDict/dict.zip b/src/main/resources/passwordDict/dict.zip new file mode 100644 index 0000000000000000000000000000000000000000..392c87081557ba13ac9a0f4b4ec92d091e8c9963 GIT binary patch literal 38337 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%0D(R&x4iCLbX$ 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оSW-dL!!%b|nGf(ByCKVYj&6*k zgu^(_ClD}Hl_bNgx@V|!Hc)Pz>>)D3;c%W--1=(Fv8a6>y-vAfnk>efbc)k7$y;>X zX)a^7HkICsGP1 zy*s8SyFM)0aV`-YKPZ%i*7}C%8_d6B^toRRN-PV+IyA%!Iw?GrGT(Nm%l*M2c9}j6 z;^Y++LV!Xu=W-HF3lgInKYnT(B^80j$yDs8m-lSBH)gp*UAeb=iQW0BcN4nG*5*yc z(T&qHYC8?B10ytNRWZeGpd zqCEL)kjI`GCh%s1Z-e~2ZijX}AD>VUL)`(XhkVYn8jZ~nG?q&Y!KdNFo$M*e1V!7p zKu;Ht18}r5iwpZXd1(|yS<0zVWHP1|a@%GJhvCwX$kI4JI`--!JN16YK*7dO&(imG z`!QPh=~+2UNZ`=^2+rB5!-l0_WZo}kjvqGOI97I%C%*pMWd#KeKZb+u*0~pp*?Y%0Xe5DM=3LFFPQ|#rnIUp zU4iE~I@FY$zSvvS+SVKXkEC(z<8$TGhst5h!q0eaKPVu|fnyrlSi2oZ@p*`s#{RRS z6led&GOt{ARJn7m{!Zp>htvfZ=@&|C1%mk|Z_x`}p(oWyY*~BA+TY-KEO!@}YA~pw zNzEVBB5}YT*`EIEA4~YtkH38U$d+|IGo^-MhuERWYg&z3kl94f`PU8VFpqt+^lmT& z>_TP8i|tb|WrJ&YmLr%6=~4;?1oJN8`QqwC?iYyf&{NJ^2X*2+AuZCAK$x;c^b-Uk z8u?l59vJB80e@97_sjr1DFsaGoVY4Ip{05B%A&;?LE<9FvYIlNkwgVWQ}{S-P~?5! z>6G?(1RQtAT4q4J+-f1=sAY$s87C1DWY#X!E!2_CRD4@xuA}<0$0%r1ddJyk9OSHk2 zhvV%RG-N$ajbe_|Ihxz9TA2ht|w7u(bKS zNSttK#E8aLoH}b0j@0isj+?LNa^)H%8#@3^c*zdNv48nCD|jMy99%o^QB4#R+Bv+)H`{S|U7d=s=|kF_7IyeND( zq!k1EVX*o$KdF5cWf!UMhDwjLX>=v@d91QgcH+Oc^U^HyyRl34RL#9vw)Q!993Xc$ z1&2nJUe;vJGuveWd;7efy!%DreYC6LwU4e{I#7PyASE!7rw;uotx+!1z&dH(E)ujQ}x| zrSmjyM?5g&k(85jfK@&H>f4q9qVv&=73IWib>9QPSUPC%-{ijnkcvkO^QHX^g2hGz zjA=N9<^d+Wkm@nrUUyhUfW$()64^4+R;WT02KyNK2c7wYYMw`pJbYehlnWU2CwMM{ zIZm^5X_}v8j=@1qUUHSWmQWTAbO7*XOH<+>fBx6^N@AhJfsB^Jq)Q*}xH)}aH>8}+ z(^cA5Wc%F?0gE8{^j4LZ4o7m#pdamt05B3)Pu%s4U~DX_m2ejBKnLbQ#-7s|8Ov(t zd^$yc`R9NB{eOP`Cy6d)Ls!qsbkHz!N+Rxj0*)F2+rK~Xfz#g^2iHV8Iwx`nrO9%c zHk^t~hX>o`)~gZ9K&%<0eu_`;fmQ;rD*7{+FbF>HUK5N2?oaiGe^RJU70|34IF*-pzIfl31lymAiHrrD^&>9oPK0)s_|N9GP6pvI@S zJW9u(bjNrI%)Eqt6*Q<-Pw&?@NJl-QD25FnNhD+0LI?vV{b`<}rp&MbuZt9tjY7_) zIA)41lWa4evQs|@)7lxawNurqPq;xL%+wh#X=%$Bz0ej~gAvo*`(ka|Qe0>QrotvY z*Nd-9_}aQ_J;j}PpZM>1Hy!&&xNCJ|KNOoB;jn%(HU zn^}|0ol@Flb*@_{Rc+P2bt--9WDEW#NsQ|U4zI&Ru{)gD7K#@}AacCOdTL%2UIq&P z9j$+H_HVgrNdJEe-N$+o1#%|;mEG_BCgQnJQtvce%p)0KpJfNf* z2b+gX<#BpbopevJ0~E2h;n5OQ&7_x5Mj*$i8u!saYQFn-n4}v!b7rctF#3 z>IYy6jkm`G&<(Tteqv!#zuqiGZRwdup*ETpr%4+Q?3b=fk5xCa1rf<41x8AZ6dE`s zg9xyDa|}-?B|flHdnmOEbY~RFOTc$|fKBWr^eAP+Of4uJUJ><#&@Chs1`Y^!I3_^E z`-ERBOpiCXAFL2s!AbGfx#oLe!r_s22NV7(keY)OLWsW?%tA*zVF(fcPnszurye;k z$4Lnvq$&WNK{5rl1IO?Ny?bARuRx}xN?JisAX9UScKOA$o#4YV<) z@M76<9tN1ussYm}ESL1_+*)#Qi>y*AEui>8a1<)ltc8X{1=JT{GsxXTZWa(7eC)t- zng-Mc>`@O8&>_d@b_caLrqY7|pF`HS3^TMw=0(qf z^#biwE^@Wokq;UHkS)3;K;rg|xxMnyAo!8FylQ5f2j+BnMmj<4sh1az_*}15(mqjCH@#T&iNzR|cG_|QqvL@bI5KGs zGx>H5&5#xpNwcT~5bsflT*6RlXs;H*cvKeMW167!e%wI*WHF<%j zybRNUc-MKOm%a>P@JjgYhwuLU^B+<@DU6dD5eHBz7Y9`f$;lu^r;mQa)_+Czv#JD9 zP6v{)=1&JZ$bax;%xYXU%d@u8p&rMbx#FsEDV-N)h4ffQqld0nP)soxNbO`neqbX6 zRQeH5%}{R@d3!j)$6;OJ5;pcv$YH_WTWEX=24BmZJM1!sYk=WePpaHcVU{U(=7@Hr z*f(Hj3DY%{%dHI@&@fh!aiXk~>*ahpVp8jm>nl=fa-zADN=C+%M!h_pfO;5AhGoN7 z4o(h%M3bd|oD)oOmtMW9C*Ai_W4Lw0I56s$wq!EFEy^|K7&mozCSagxVi{0w{s(|1rZS4ecgot%time>M*hdwA%;`}5P}993%7#Z(UQ@XF;#cnVmc@yy53QfJLX^41 zP-C<`9QY1;r;gs+{=(UMtTO&S4&$f3_%!h{*A|7ZEp`uy{LA)N%Z-m(%XNU&Rhs#z zmAP&ya~fghvs>!L&XZhq%b~zq^;J|+_=35xqJ+Pm_|7GEBDNo>sXrU(ezK~ufsJp9 z)@8fDg`UDLg*5GD;v?Q}R8t#}hu^98D&^I{S3p*r_D#r69?YE6&6P;wa9!;e+8r2U zr}Bk2-Thqh;s1s1Pu5R5k6uA$rlsslEaP3LLw@&tN@m5YF;CQ#E`eUUYUhKOPW{RE zjf&SXP=AubS&OA#?B)xNS2aZpbslSchwf0RZDuGxHB&;LonzlM#bp`$lu3$F;tP2L zB#Te3QR$p?m#1=++0Rh8hhMB102y{0 zUIZRjwcGl(1=c%ARJxgrRtimJR`xR zGr*JuDr8_dj8sJM-DmutQl~Xe8xb5Y^}qms{T-w4Pv8Ca`}e;B(Ilv8T-n=pAGBy* zUnu&>mxQN2*iT@z5A?*)&mR^pphCIthxwN6*ItNV>o| z0UAfWynH|>mDd}V^dRQL-1+u4EDu&tX!Dtsr=dp2n_Wm>)~O{rwojvcofv&c`7LZU zmFOP6C7Kl8o44McGmHYeatZ0NMh_VA;vYP0-HAaC6OCvNQ};5D@+_CBkfR}>&4m_| zFD<+iean$o9aiZ@qwgr)hd0t`lfLD9QK-GK^`# z<)EiWLFPw6=I2}%+v%?2e>t!-pMY!_tejL;`vrGZ#)hx`k1DI&wyP?A2#kI9tGqln zeo?xQ(@xH+yga)um`JFPZ=41>`+aH^8?VY50-5?sKHa}L>7el{oY-jC?DYM@q13{S zXbb1@*M8wMqS~9-=mbmuZ$MOY2U0WV>XRT=_+*%PUET|H=De}eHOwR(G+u=(C+t^W zXT`=Q!@a^Pc=b#EsYH+PDrng}OGYC>q<(1uw{?vAJAJr$?*pvH$(pOSt+Ur37(ZJYW%l z{yfLEP1kYleyg=h1S)62RleA(yl_`81k;PuNOU_6jQ_N-FPtq16EEI$rm>GFH!5@N z?3maaAzZ{BYPc8kU8&l*Ka@{Wk1mwiKhM=Y-tUU_5e zK=cPQ=GjvQ7+j$!kQyHD594XbPncnYMP?yX3;?i- zUc=#lbVP@HWhVXjxUn*?+$q9_KT&=jqq7)!gm`Dniz<(xZv}+*bo*u{*QyMy*&3cf zC9sG^kdIjk%hbxi4`tc3jdVuj8ZtqRrl56fTVVDjOS9B38hEZK&dlW==!*f13;7xD z+u(g5SxM>?P5tk^OvU#eE|oM`11}GuaZeKZUPcFbF!Cd4xrV%AAz>M~?d^P=FE5zu zEXZy}{M!Sn)LVdV1t79MFk&4Kv?;f!EsVpoZ`S4DW$L*{My{+($;0(FsSFov?Z zDU8uwW*Q+DggT3PU?8znf5e0^Bz%?;x|32q0Z`Ng;>-Iw(@twqrT(x$tiQqDutz-V zQF=}IBjBem1mHf4ia?#71bO)rD0Apr0^2SWd!*)N=bp6i1GfRW80DFe4V|smn zUA<~gu`)sD{**V>(w%#K45|;F;M&d%2Rd2ro6zaONq^S3Jyb_E37S-22gn)jL||dd z$1DGD7-%{Yj_PpTDcBU+p(8#n(|!*B0i^DgWtn8K1j%!-{?L9Tc5rLo(d=`*Bh9*0 zZN7FHrLS25ET`x&91O0VG2=4c)W=u@o*QdEFicl-ZH7_|cc#)c_uuV-u6$_U|~ z9Y*6F#(v@BzIGGMm*HOLem$g9k3UEqZA~3*H7k?SS`VH3cb|pK$NlOn0Fb#(uprg( z1N|s2-j`>Z^<7KuqcX&sebo28snGz4*H5ZM-!hE>L^3 zvb(pH-lO~*WKcNgr*vR@=lo>O`6%9|Aas#FnU?6`L2njm5ZxeLkJhcpgwI{@xm=y>;P{Pe8LzxahV znP0>XAndq7J+BGZV#Fb0vRg9Dt`;H-Y z8^73DSF!KoWA80vwv_57*|;vg_zK)R^QrM7(z5c%JJMN$X@QLzH5u>H+UHnXoOLaG7 z8*uV($usS(5G=f<13OpcK znh(G(E~uyvIsQlKj%LlfW*)_!56R?mUx6bu#X_TyGQ3dKAZ?oI@WTmBkN&}I3o;Qf0QrcS&c@|^acFkZ~yOa-~Aa$ z0fP~}@HLKp=oxp(ZTXaNSB@9aU%&tP*S~(x9XXU6r?4)ES9IJi(%o+8kGhGe0Ug36 zurjC5?ol%;j?!|S7#|Sm+tN$>e8a+?Tk?fFau}KbVqs7Qg4d8=FTFNJ{gg#~+oEn< zLU(5m1+S>i8d?~uF`}(w+K?GR&+vfP3p~&%P7xCPKB198t#l!bcQHz1{+>PpBTzV9c2z^8+#q zUIf;tn~?tIyZ`?4uiyWHO*x;az*lMLW+GiR&ezx--?=SE=aM<2Dswy_bF0HF**h0s zpF2dHIbff~pFm0Out?*Z@YJ!7(l5LZv7%)SN$xB0(mRvJFKR6sffXpp zzbq?sTfR#)awm~lgOtTC$*_sl8k^Yn7<(I2J8yX3sn>qNoqFS2_QJ_%?u6j)6MKUc zJ6;oiTE=Ey*X>d+&5hdE?Zi@QC#@BZwdAhB^98))_PC(ecfFI={EsRpzq#>)UF?<# zl{1@nigRHo4KW$-T->L?E(+hCl)gQwec4}nbCj6_rV2_*U;pnL{l<4CmB*+|9zVVx9urd_F`=#2w5xpS*4S5hZN8_>qe z7EVc0Ia6S#3>3bAp-X4!>y+9rV(+R-zbG8|sod|Hm{7WVM)>Z<)QZ0NGTL_G)}L&P zN(XiFFa1#+``RV7wrF<{!}~aKG0q*1@#i&mkM7u8)Y#c4c99$Jk06diQ|YHSSz;_d zZvcHjGS+wI%NoUZaO1#|7`zsFVEWIrp{&BGY$db<>_p>#5^8TC|9kcfl79BR9O}&8 zm0A1{7{ZIwkLKP$M#hqI9g+g_3-UH>( zH%)s(D+F5&_ANJeslN5_d@#SXTL9y3Am0JOa@U}FbmRCcqKkf$-iO;QX@#zPDEG*Y zi2cwNluk7-8dud64J#rzTQF_T(+c3@Je}5o96^!`&+1xw4&$be10W(bEI3JbONff*&nhI$ls7DN7!d_j{ibF@oNR68UbEuNd(nd`WxA0I&q=H7O4UkEAOA zR||(88zFN2q&cZTBRelGqM_XWc-UQUD1BbDj5Q_r0H@Lsi$5}d2&&yjyBqnp*os^~IJ%u^uA>7T&=WcD|;?XO@VqesU|!smqb9wTfNh zT6k-QBXO<_d!JtAe1gj_VV1$_!yrdP(i8uF8K$UucON|0fROC2nA9^pet-U$tNC>#)+9 zC%emN>W+h@r;#;o7mNm{WV=+Gb@06B!;qcAJ+8q_zWGw^S*>V~f3?v%IX#6+-=c74 zrE*Xjccv*Fd@8+zDxGwhdn;w1BkbCtbwC@X9>z^_cg!hw;$`f_OAiXEckyuHyRY24 zBakyaKi#1{(?I0z8&R2W1eahgnDCn|c4fHkzR&_We>Zlk$JoC()bXwTHd!-d>sS!!kFbkiQkn*X=_+@7@Q-ZhtUR4+>>;MFWLJGPhr4_<#0cR=Ard(R0y+o{r8G%<=iwJ!NcX z_5%Q+BWd!Q0P%)42ARk5p!5~>e(iM;1`C}Ry%*OHpg|yUg3&@d#qD$eG4nznTI3nS zxZ?Pd+8@nQ=x53!*yse?RDf0mt~vd~sE{zb9WeYJ2ss3W6McmI@0w0eN<5{^*2^@} z^x_F2WfEm%eBB>s_kLcY5k`b}C`6=N*}SWnkSq*v3DM4~g@BbsKX=%2QJ2Tv7tJW% zVc~EGY34lv=X0e3t;v5G=x9s! z3mU5rTtkm7%{_6U4XdOMxEO@m8-)}2(sV=)u{=Yoax>Ay8SgKRI23=L=(*)ML~@00)l+$sS8CIBP=00000001BW00000001#CEp2IRY-w+9EpTCT zb9ZlYWG!rIb960qZ*VO!FfcGME_8Tw3IHGg000000RR{PP?q*kJ0#ix$vdleJ0#ix hQqJU1J0#ixP)h{{000000RRC2cmMzZGnD`U007pzeSrV~ literal 0 HcmV?d00001