From 04a2716b8e88e0b9bc67569b926730d42f0a9ae1 Mon Sep 17 00:00:00 2001 From: "xianping.wen" <931128603@qq.com> Date: Thu, 19 Dec 2019 13:34:21 +0800 Subject: [PATCH] update version 1.2.003 --- TickerConfig.py | 26 +++++++++++++------------- agency/cdn_utils.py | 24 ++++++++++++++++++++---- init/select_ticket_info.py | 8 ++++---- inter/GetPassCodeNewOrderAndLogin.py | 2 +- inter/Query.py | 4 +++- tkcode.png | Bin 13988 -> 14236 bytes 6 files changed, 41 insertions(+), 23 deletions(-) diff --git a/TickerConfig.py b/TickerConfig.py index 62b7502d..f3bd9f0d 100644 --- a/TickerConfig.py +++ b/TickerConfig.py @@ -5,23 +5,23 @@ # 如果这个时候捡漏捡到的话,也是可以付款成功的,也就是说,捡漏+候补,可以最大程度提升抢票成功率 # 刷票模式:1=刷票 2=候补+刷票 -TICKET_TYPE = 2 +TICKET_TYPE = 1 # 出发日期(list) "2018-01-06", "2018-01-07" STATION_DATES = [ - "2020-01-05" + "2020-01-17" ] # 填入需要购买的车次(list),"G1353" # 修改车次填入规则,注:(以前设置的车次逻辑不变),如果车次填入为空,那么就是当日乘车所有车次都纳入筛选返回 # 不填车次是整个list为空才算,如果不是为空,依然会判断车次的,这种是错误的写法 [""], 正确的写法 [] -STATION_TRAINS = ["G1002"] +STATION_TRAINS = ["G1120"] # 出发城市,比如深圳北,就填深圳就搜得到 -FROM_STATION = "深圳北" +FROM_STATION = "广州" # 到达城市 比如深圳北,就填深圳就搜得到 -TO_STATION = "长沙南" +TO_STATION = "武汉" # 座位(list) 多个座位ex: # "商务座", @@ -33,7 +33,7 @@ # "硬座", # "无座", # "动卧", -SET_TYPE = ["硬座"] +SET_TYPE = ["二等座"] # 当余票小于乘车人,如果选择优先提交,则删减联系人和余票数一致在提交 # bool @@ -42,7 +42,7 @@ # 乘车人(list) 多个乘车人ex: # "张三", # "李四" -TICKET_PEOPLES = [] +TICKET_PEOPLES = [""] # 12306登录账号 USER = "" @@ -56,7 +56,7 @@ # 设置2本地自动打码,需要配置tensorflow和keras库,3为云打码,由于云打码服务器资源有限(为2h4C的cpu服务器),请不要恶意请求,不然只能关闭服务器 # ps: 请不要一直依赖云服务器资源,在此向所有提供服务器同学表示感谢 -AUTO_CODE_TYPE = 2 +AUTO_CODE_TYPE = 3 # 此处设置云打码服务器地址,如果有自建的服务器,可以自行更改 HOST = "120.77.154.140:8000" @@ -102,7 +102,7 @@ # 下单模式 1 为预售,整点刷新,刷新间隔0.1-0.5S, 然后会校验时间,比如12点的预售,那脚本就会在12.00整检票,刷新订单 # 2 是捡漏,捡漏的刷新间隔时间为0.5-3秒,时间间隔长,不容易封ip -ORDER_MODEL = 2 +ORDER_MODEL = 1 # 是否开启代理, 0代表关闭, 1表示开始 # 开启此功能的时候请确保代理ip是否可用,在测试放里面经过充分的测试,再开启此功能,不然可能会耽误你购票的宝贵时间 @@ -113,7 +113,7 @@ IS_PROXY = 0 # 预售放票时间, 如果是捡漏模式,可以忽略此操作 -OPEN_TIME = "13:00:00" +OPEN_TIME = "12:59:50" # 1=使用selenium获取devicesID # 2=使用网页端/otn/HttpZF/logdevice获取devicesId,这个接口的算法目前可能有点问题,如果登录一直302的请改为配置1 # 3=自己打开浏览器在headers-Cookies中抓取RAIL_DEVICEID和RAIL_EXPIRATION,这个就不用配置selenium @@ -126,8 +126,8 @@ CHROME_CHROME_PATH = "/opt/google/chrome/google-chrome" # 如果COOKIE_TYPE=3, 则需配置RAIL_EXPIRATION、RAIL_DEVICEID的值 -RAIL_EXPIRATION = "" -RAIL_DEVICEID = "" +RAIL_EXPIRATION = "1577033439142" +RAIL_DEVICEID = "PuV16sVaV-CTGsFZUuL8JLAk4OhuT1wgUYC_W3L2JZfWx8Ygx8LOPkko3PSOrK5_xSKhXjgyTMS8dBmj1RZHL2CKBTmVs6UG_yptlB4NJbGHldltrLMTUEgoDpSkpX2vzpGXgMQsTRzgOXfuQkAWwS4GjCxSmV3C; BIGipServerpassport=820510986.50215.0000; route=9036359bb8a8a461c164a04f8f50b252" # 1=>为一直随机ua,2->只启动的时候随机一次ua @@ -152,4 +152,4 @@ MIN_TIME = 1 # 软件版本 -RE_VERSION = "1.2.002" +RE_VERSION = "1.2.003" diff --git a/agency/cdn_utils.py b/agency/cdn_utils.py index 76486c6e..01b95bc1 100644 --- a/agency/cdn_utils.py +++ b/agency/cdn_utils.py @@ -1,5 +1,6 @@ # encoding=utf8 import datetime +import operator import os import requests from config import urlConf @@ -27,10 +28,11 @@ def run(self): http._cdn = cdn.replace("\n", "") start_time = datetime.datetime.now() rep = http.send(url) - if rep and "message" not in rep and (datetime.datetime.now() - start_time).microseconds / 1000 < 3000: + retTime = (datetime.datetime.now() - start_time).microseconds / 1000 + if rep and "message" not in rep and retTime < 3000: if cdn.replace("\n", "") not in cdn_list: # 如果有重复的cdn,则放弃加入 print(f"加入cdn: {cdn}") - cdn_list.append(cdn.replace("\n", "")) + cdn_list.append({"ip": cdn.replace("\n", ""), "time": retTime}) def open_cdn_file(cdnFile): @@ -50,6 +52,19 @@ def open_cdn_file(cdnFile): return cdn +def sortCdn(): + """ + 对cdn进行排序 + :return: + """ + ips = [] + cs = sorted(cdn_list, key=operator.itemgetter('time')) + for c in cs: + print(f"当前ip: {c['ip']}, 延时: {c['time']}") + ips.append(c["ip"]) + return ips + + def filterCdn(): """ 过滤cdn, 过滤逻辑为当前cdn响应值小于1000毫秒 @@ -71,13 +86,14 @@ def filterCdn(): print(f"当前有效cdn个数为: {len(cdn_list)}") if cdn_list: + ips = sortCdn() path = os.path.join(os.path.dirname(__file__), f'../filter_cdn_list') f = open(path, "a+") f.seek(0) f.truncate() f.writelines("") - for c in cdn_list: - f.writelines(f"{c}\n") + for ip in ips: + f.writelines(f"{ip}\n") f.close() diff --git a/init/select_ticket_info.py b/init/select_ticket_info.py index 7203aa6f..c736f09b 100755 --- a/init/select_ticket_info.py +++ b/init/select_ticket_info.py @@ -39,7 +39,7 @@ def __init__(self): self._station_seat = [seat_conf[x] for x in TickerConfig.SET_TYPE] self.auto_code_type = TickerConfig.AUTO_CODE_TYPE self.httpClint = HTTPClient(TickerConfig.IS_PROXY) - self.httpClint.cdn = self.cdn_list[random.randint(0, len(self.cdn_list) - 1)] + self.httpClint.cdn = self.cdn_list[random.randint(0, 4)] self.urls = urlConf.urls self.login = GoLogin(self, TickerConfig.IS_AUTO_CODE, self.auto_code_type) self.cookies = "" @@ -134,8 +134,8 @@ def main(self): now = datetime.datetime.now() if TickerConfig.ORDER_MODEL is 1: print(f"预售还未开始,阻塞中,预售时间为{TickerConfig.OPEN_TIME}, 当前时间为: {now.strftime('%H:%M:%S')}") - sleep_time_s = 0.5 - sleep_time_t = 0.6 + sleep_time_s = 0.1 + sleep_time_t = 0.3 # 测试了一下有微妙级的误差,应该不影响,测试结果:2019-01-02 22:30:00.004555,预售还是会受到前一次刷新的时间影响,暂时没想到好的解决方案 while now.strftime("%H:%M:%S") < TickerConfig.OPEN_TIME: now = datetime.datetime.now() @@ -162,7 +162,7 @@ def main(self): ) queryResult = q.sendQuery() # 查询接口 - if queryResult.get("status", False): + if queryResult.get("status"): train_no = queryResult.get("train_no", "") train_date = queryResult.get("train_date", "") stationTrainCode = queryResult.get("stationTrainCode", "") diff --git a/inter/GetPassCodeNewOrderAndLogin.py b/inter/GetPassCodeNewOrderAndLogin.py index 3ca20d8e..98d84bef 100644 --- a/inter/GetPassCodeNewOrderAndLogin.py +++ b/inter/GetPassCodeNewOrderAndLogin.py @@ -71,7 +71,7 @@ def getPassCodeNewOrderAndLogin1(session, imgType): img.write(base64.b64decode(result)) return result except OSError: - print(u"验证码下载失败,可能ip被封,确认请手动请求: {0}".format(codeImgUrl)) + print(u"验证码下载失败,可能ip被封或者文件写入没权限") if __name__ == '__main__': diff --git a/inter/Query.py b/inter/Query.py index 3e51349b..26c04ae7 100644 --- a/inter/Query.py +++ b/inter/Query.py @@ -64,7 +64,7 @@ def sendQuery(self): :return: """ if TickerConfig.IS_CDN == 1 and self.session.cdn_list: - self.httpClint.cdn = self.session.cdn_list[random.randint(0, len(self.session.cdn_list) - 1)] + self.httpClint.cdn = self.session.cdn_list[random.randint(4, len(self.session.cdn_list) - 1)] for station_date in self.station_dates: select_url = copy.copy(self.urls["select_url"]) select_url["req_url"] = select_url["req_url"].format(station_date, self.from_station, self.to_station, @@ -169,6 +169,7 @@ def sendQuery(self): "seat": [set_type], "train_no": ticket_info[2], "status": True, + "cdn": self.httpClint.cdn, } elif ticket_info[3][0] in ["T", "Z", "K"] and set_type in ["硬卧", "硬座", "无座", "软座", "软卧"]: return { @@ -176,6 +177,7 @@ def sendQuery(self): "seat": [set_type], "train_no": ticket_info[2], "status": True, + "cdn": self.httpClint.cdn, } else: print(u"车次配置信息有误,或者返回数据异常,请检查 {}".format(station_ticket)) diff --git a/tkcode.png b/tkcode.png index 8416dcabd3807218494c320fec5bd37597bfe4bf..0f7695a9563b10d43a63420b472927e896ff09e9 100644 GIT binary patch delta 12937 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

(Y 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 delta 12678 zcmaiaRZv_}yJh2n5C{nb2p$|lu;5ODOXCi~2~N|v9VC!I&?Z12Sa5e}tZ`_Z;O_43 zHrzW?_1}k?nulGr9!`Dr?X!2Sv(8#yvSXHgSr9tlqRqTaHZQwiWUW0}W|SR)s0-WR zvFoMKIWW~(Tb2<$A2D3epK9GS=#PC`eLHc z%F3On>SRA&!xIEbW&!C&3Zlde)#g)=y+0^gZ3x^Uu8Ae1$K$Q>AfFtXNmVdxS$^ES4%=&_g<9u(N*@!d zt)lB_G`RBUf8b!#dhCGd?m<}fs#1iY|Ib3{p7Ri0xl}!MIDBXOrMl0l{24(FrU8Ca z5lQMM8o5~=$95CZnCWOWtHO_}tyo)?ls7sFcKK^4-$@9hvwxc#mtaC;!?g`JsOQc2$UfRb} z6N;+kERQkS>`)67FqS*mW--RZh*J7HwFc^wEE>gxJB z_*e7=6%ws338Y!rmAVxyfGpj_TBk9{(FV^|5B$jzLISm7D9SB|GgaAQ%GwiU#xS$#YqJwsYZCjOe)J zeXTF)$lFFxA-o!m{XnxjN>OQ;mcn> ze>(mj%@@-W5t%z{7qgtYGB%|JmiHLm35~)ox(;PED`431y3V?d^UW^Fsp+dphKy|q zZ?%6oG6V;^xRYszvDPOXAd)&2&3v91`A!xi5!E>d+62K4W3A_ zl2nTxGxOJ448pjft6qWZe~L~@d2I)`K7Clz@7DE`*C6*0d9`(I7EWgyrme4~sWV6e z{U51|$fUKHgblKvp{6aHhk)pwS-6wX1CN3x{CK>2e=ys1rQzx1YGZRxX1;6_Hdr>>Oo(w44-up zs%prpsv7jiUz{kh+DGzy7}x^!lsHg$Yy7b0}%Sm6*-y7U@H@j^-aYt)e!c+cA z5t$R#H}>J+)yi{LFmQglmWWLfipe!~;Dyp9(6eNk;ki1T9*JwiXSep^5hUENESTzB zA>ML9_-s0(j3M%X;bFWyX%`EhC%MF2TNzsR%B_Y&9E&nDX*NVNk!U!GmC0Df$@?Gr zFI8DD71UwX1eIkzpM}JY%v1e-3kOUT_0-&?1pZ=u)J~!{8z7ao!O&(&e?FtrvPIZ9 znQJLt>^m({THaOI@;bNPqP!aa&oa4gG$;ls#Zd>I2p<2tvUqx_nJ%Mo$^YzJMDC7Nq5bCI@5*e% zD>B;@32Hb@&T&0bT9b*;uFoo3hoj5c2`tfyE5ltKlJlp0XG~Sfg^=*Aq!UYJrQ(A; zC&>4Ls@r>{78kaho7{@Ul6whr`(mz3RkJk z^3oJ=6_RzBnBJ61tf#TFdIXg!HjnRp9H+8t2qQnkonk!Ny_)>x(RO@zzCQL5p=wf% zo%p+x7E%Q~qgw9TI}>O_ILIzAXtFS6PA=q4Bb!Y)U?-9GjipwHKWmauxhU z^1#U71DsLj&eTSr-dyO5#6zoIa?al#{;`REMi3~cf{7>iq61|Vcg%&g_>+oUDLpqb z{Al2WZy{{N7euonYw9gAA3+Bgne4UORR6GJ@>Q`Z-_>p&RnU{3bMv&tW1Q$|9$R>_2#ZR~LS6s7@P%$5FeOAir=6yU~)+PSi4Q z*aGuLD^^?S)Q=#4e?;xW+qG=MoVzH;mr3n8H|6E+>sEp|ox43x4`g9v-!W$#foyjso>hM7R;z~=kC9ZuflGT!ZWILO3Pfxy=B9c0T&1dh(htdRR@1} zPqNFwhL`L|g!}PCQT$R`^0q+4OiARnS;Xk-hDPvFI!ikXo}M2X+7*!2nALN6DzvkI)6hIC<@#B1(r1QbsF)1W;*bUw_ zg1ERrS2!EO^1?!S89G<`ih&Qu(U$tssQd}Bx5!o%Fg4~{Bo{W(y4O5nJp4q;sa&5U z)>d%cpPzpX64h|+Yuj50NDbbK!^$upl&v+2MVTsb5=4l z{HSa{y`&kZ59z%_3g7LIhO?81cw7dmnOHeJ7xlDHhsjc}mVyEWA1Gn^c_#`6UA)oq z-+d@it`qCcQd4%u)TXLU73m^jL+dRi&oODK{XImuFfsW_md*uAZLTy6wl3U=S$Xao z-QD@#@xSuUJ~ana3Wy|O_~5o@H|g0$ zSFbgs;&*uU2%-seqAfpu@y%(#*N#2$1Xg4v^qtWUEW*7A!o`a-rNW;@zVCTeroHNQ zhq$7?Bu4{+hOox8dF&Lz#@18ZkA8i;s7>9_JzzAWt?TRQ!I~_Ui2VJKQC0f>m4aPG zWjv$xYHadD+T^x^i3#=}%YMN~u39v#Tq?!QyrGh3^EIPu^}qBp4*ukW@K9FSB0)>5 zxj;J(>#PxyE>mbr_sB=yrO>dk98^9V>3zKa;L8dW1}SQg!n7@Eg9n|Q!K9lvR1&J& zZ|U@W0FO#IV>rrUz|}-=L4ZH&NUoeTua)mxt;k$XUxs2U<`C8pomnAs4fXZ#*Rj#Q zBKRZaew?!d&}FjE0cae}k`hDU4`6XyMCv?a=x{A=gB%6Kpt(ayen{cy?zPc%4sX4N z>MJ0`be8<`=4}F=CY$o!$2u0N%(kjJrO1T5R!)^|&sY05nQ5CzLCQD_w(i0YIi*Hl zW(=DO*~&~|2D4=tAY-3=8EQYCPvAKB?!TgDr}+Jkpa^IuJ>!-)f1<#@@H97DDNd+k$BB@PQd(XUrXGn>(1#~KY=J6jZFcwI|ysT!FUVLiLZ_nRse-%&oPn3vxOsc&kg)+-;d zUKU%!g@7Uv&cu5~e0gMG6Mbt>a$aI}*_IVzG!Yb9G_e%t1t5_`dPqdzaG@$g3Q!u# z_?i*6B@ogqe|r6-BA1Dd&mTc)bRm5jHQX~@C@5CorXPsu3WHQGS&H3%WjE zVV0mdT)H~4LNGrg`)x)J!ph390F-m@+at;I>0S|T(!I$Mxzk!efsZB8%_X^~ysfwk z_@e-sYMUQCMZiv7fethB{2;HU6AIcPnY%2@6@IK}Aqs>#fs*0sSL zFvfGB55#nq|BHc5=gbGGDy5MdA}RR`nJGIXn;bi2KcGW-%Sq7~12{`z0BK@BS0B*y z$9iy($8VxcighLMGVNlKgu5(QbCR{VC@r+YuQ)t5YFOfP+-4#nr%`LxBK|8r3T6x` z>GyvmtMq+O-h3^}kPU)m`3~=P`4)ByOPE<$tG36Yk;A%QQ zRF}`-Qh0p@`7iwhZyhQGcG(Jkj=xFZ%r_Ha?_RGp%!*7r-&^pf)a_7aOqO`@vx@{< zi!wW|CQo?j^}Ed4I86AL$}5^neRN7?tXzcK1I^Jz!g2)a@j?Hk^U$|% z4)d0NYSJd1&*RT{{cX_NLWY#=YH`x%iXcR2o9%`PUR@juH#$X}uGs^G9hOp=FcIw}~ zgO!Xd&zi259^IHxre?Wxf^%k-Tzv_({#90mhrW&JVa(eMhv<&<)Jwy_DJh{2R|4lP z=Tyb^)=7xsxU6G9DYuob!|y;^yps%W6tula^y=*-bWe{dqrUfT3)fP3P%FuPb$*Q(XpjhvdT-N1lxdZ2!rZmCXpm%MwQJJ(vEfm~HiUBCc)=hFuqodt{ zK|~hbe2+t7tMKMgPpSC0qkYj{%7M-*>9b5|S~}@aX$=?Pfmv6~^$1dr?2=o7ztT^q zvND{NGq9qI`DaB@PdUZY8T$7vOxsHMXl}1niD6?@qo!JRRhK-X1$EZh^RT505IkcO zQVQ&1D`#gseBHx17Td#*T-Ql@ff(N?<<0jb1qH_B8`#qZwXV5Secv4S$FL2_%Fp?? zrFLPfLRbZ;8ZwG&V;x%}_a6vrqAW7)5z?Kb`{3Hu5|Q1;610`GKr!qY_)G@;5u~gr zT-SO(m+XW+V5PleSw&Gm+kU~DdXrM{BUIPKf`jwq;m{OVd~h`)#f4^d_+$k|dkFi* z30_lL=54zZjYZ(_a~8g67W{yx@kCKo?yp;2(E&(FWQPo+Vf$b#Zv=s+9{yRUZn9Jpzp!VlV>D_upZS_I# zad|eIC}yE885_o=1>UshAFz!PtjfcIIpeqEsSN!5MpDwQM3r`FNs|1k-BfyVyj}AV zF95x@cGPLQ#M82oC`C81&1$nAjvw)OLdoUZnmP4W+DX!EwB#^b(Tx>3vzdS?*X?9q z+x!oj4mr#MmAfoV8Px)T6?gIsqQv9DRi?TRNWS>A1^e%4QR-o1Sq@SlPego$EBG64 zv8O$8nzyY;MknQddO^2PG^ARNQJ^HP4S+it>M-laK$$eP(kxq?2egtAuDiI&Y1xF3Mq2crg%6!swne z{00SyjtfajsLPo6BL#eKt$GB7J_wDLtTXIbkL>WwCwJ&h`AL2z+9BG|a^uqj0A#V` zeX&DU&DeW%Tfw$2{@*O-+%BX9e&*Ua>=SwYdfmt5yY@L*Q7oS`B;p~_{5++)l<&%G z#y+lv?L5noU^1>qH^#%~7t>Rl!lQH~u&!``M{d|oyTz{0vM0twdWb`=(u$poIHGrN z$lY#yJ1Ue2GbEndYYP)?QgjOdt0M?swv15J52)#6n#3S&sucvoaAs}&Eg@{M0T|1F zKTU1EPs)D>nXESPWc#EZKU`(VDU4}T;1lfh3F@gZRX8Cnj+i&BC zYp{v2O5zUH&!YCZ{;0S&c&XLl`p($4V>tt+QT3LdYak|#Zsd4{z}?lp3fSZFdtZ3W zE9Pf^DhN?xTkdYOlA8z-71i*hvme>1ik`*}EJ6AFtJz}Uqxt>&e-WmdC<;Evf}qh{ zBbm*8J$Y6ASkodsjY~ki$9X44T=z#3xKgUGW6i4Yg70NVBiSub=R~5o4Ocr$pczU6oWSRyK!?7w^rlRz(1A#OV$) zSa6Zbg}MSQwM%Vv9qGZn^8%&}1Q%vy0d6HoWJjz@TA47O9~eZ9RTF&gkEPN=e!?v- z&bdG0&sypG*UdLMZs<4~>*_pxrfb-4svsL4r#f7j{NQtM(_-W`vJw|fuus7qFc$X9 zTa9RdiG;9)>B+}p9q{8b_yfk6k)_iZOb>ehbc^4wJ>BH9f^{EYseLs9=LLriDzdju zKZ>JuV-u$j2zQ`b7=+H`$nSJY8dNAz@mmu!Tx>joUdJGGu+Ds(UnYa=r zrrAC#Lw)n!d9wtNF#4N$_dH55CF_roeoCjaXgfS0IsE#2P^!%yfSD1woc*@D{liGJ z+0B!Mbg1LaIN%bcWR|g2?^r0TySD-3pJ7$gaW-E9-ke>_p#!N^=ZWdR{z7qo`b$Hm zsCJE(nz1t_g2#^!FTOks7P7bI`AtHdZn{ndNY!osVW3d~GX*TZsz_#uy&>vb^Ae8H za^w?%Evu4Fk~`1)Z!#c)AF!wSloXlH^wq>-$DHnnI1D^vuD;t~%;eQj6LbrwTr-AM z_tyZ@jtO-eyh%Qn&e$KY;z%CekT9MU2UiCYc9=QlcW>@?dTHOWEC@_E`}*}gf~H5o zZRrwNx=ZJnlcf)0Dyt0VQjF+TR+*|&M0NgZeDfcxR4{qtmiL8Z#(2nfW#DbgzioIyBTI@(1PIoi?3RKWP<1E88SiLRvuI z*L%8b6W&`A_{Al$Kh}6Dy5h4KRWnj_ui);RaBY$FZ7=)WA3Vf05yB0|G@2HU+>mxo zx^oK9jdq^?o$yyPmYeeEv=!b*(0!a%&6VlIO!5B8u0Z6jHOGAdnGUX%(Cs~o0Z}Wj zXVi~U*si`H^i!F5egb16%9^pac{ngJnBwS2_>Vc<(|Faf1k5wG13U}KEa>#(X=a1r zGdfOlr~OXe1e&+?Uf%I?Vmz^F(~8jjpV9{rgSf9s1Jhr@hymw_D)YkG3}zBeJcz$E z)@0sY!9*})qAe6#ZI4hc{8ByH&$X)QW&0stM=IxS$v5}gah|B);E3f!c7U6d@zPIA zaI?vl*<{D?W0+Uv-;6NUQPQ~5tDlNT1L5vT#qAR4upe>pjIr+}_}fs$+hU*OVUl*} zM?*-jwHG3Iw*bq$rdF3!;y_%0Dw1`m`76=O!PxVY598+Uox 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 CHVa<>