From 379c9594df70bd73619faa6b95d00bdbbaa005e6 Mon Sep 17 00:00:00 2001 From: Wenqi Li Date: Fri, 26 Jun 2020 11:24:33 +0100 Subject: [PATCH] model parallel training research (#616) * adds network * adds basic training * update loading * working prototype * update validation set * [MONAI] Add author; paper info; PDDCA18 (#6) + Author + Early accept + PDDCA18 link * Update README.md * adds network * adds basic training * update loading * working prototype * update validation set * [MONAI] Update TRAIN_PATH, VAL_PATH (#8) + Update TRAIN_PATH, VAL_PATH * [MONAI] Add data link (#7) + Add data link https://drive.google.com/file/d/1A2zpVlR3CkvtkJPvtAF3-MH0nr1WZ2Mn/view?usp=sharing * fixes typos * tested new dataset * print more infor, checked new dataset * [MONAI] Add paper link (#9) Add paper link https://arxiv.org/abs/2006.12575 * [MONAI] Use dice loss + focal loss to train (#10) Use dice loss + focal loss to train * [MONAI] Support non-one-hot ground truth (#11) Support non-one-hot ground truth * fixes format and docstrings, adds argparser options * resume the focal_loss * adds tests * [MONAI] Support non-one-hot ground truth (#11) Support non-one-hot ground truth * adds tests * update docstring * [MONAI] Keep track of best validation scores (#12) Keep track of best validation scores * model saving * adds window sampling * update readme * update docs * fixes flake8 error * update window sampling * fixes model name * fixes channel size issue * [MONAI] Update --pretrain, --lr (#13) + lr from 5e-4 to 1e-3 because we use mean for class channel instead of sum for class channel. + pretrain path is consistent with current model_name. * [MONAI] Pad image; elastic; best class model (#14) * [MONAI] Pad image; elastic; best class model + Pad image bigger than crop_size, avoid potential issues in RandCropByPosNegLabeld + Use Rand3DElasticd + Save best model for each class * Update train.py Co-authored-by: Wenqi Li * flake8 fixes * removes -1 cropsize deform * testing commands * fixes unit tests * update spatial padding * [MONAI] Add full image deform augmentation (#15) + Add full image deform augmentation by Rand3DElasticd + Please use latest MONAI in https://github.com/Project-MONAI/MONAI/pull/623 * Adding py.typed * updating setup.py to comply with black * update based on comments * excluding research from packaging * update tests * update setup.py Co-authored-by: Wentao Zhu Co-authored-by: Neil Tenenholtz Co-authored-by: Nic Ma --- .../README.md | 53 ++++ .../__init__.py | 10 + .../data_utils.py | 66 +++++ .../fig/acc_speed_han_0_5hor.png | Bin 0 -> 131358 bytes .../test_unet_pipe.py | 52 ++++ .../lamp-automated-model-parallelism/train.py | 242 ++++++++++++++++++ .../unet_pipe.py | 171 +++++++++++++ setup.py | 2 +- 8 files changed, 595 insertions(+), 1 deletion(-) create mode 100644 research/lamp-automated-model-parallelism/README.md create mode 100644 research/lamp-automated-model-parallelism/__init__.py create mode 100644 research/lamp-automated-model-parallelism/data_utils.py create mode 100644 research/lamp-automated-model-parallelism/fig/acc_speed_han_0_5hor.png create mode 100644 research/lamp-automated-model-parallelism/test_unet_pipe.py create mode 100644 research/lamp-automated-model-parallelism/train.py create mode 100644 research/lamp-automated-model-parallelism/unet_pipe.py diff --git a/research/lamp-automated-model-parallelism/README.md b/research/lamp-automated-model-parallelism/README.md new file mode 100644 index 0000000000..321d7a2cdf --- /dev/null +++ b/research/lamp-automated-model-parallelism/README.md @@ -0,0 +1,53 @@ +# LAMP: Large Deep Nets with Automated Model Parallelism for Image Segmentation + +

+LAMP on Head and Neck Dataset +

+ + +> If you use this work in your research, please cite the paper. + +A reimplementation of the LAMP system originally proposed by: + +Wentao Zhu, Can Zhao, Wenqi Li, Holger Roth, Ziyue Xu, and Daguang Xu (2020) +"LAMP: Large Deep Nets with Automated Model Parallelism for Image Segmentation." +MICCAI 2020 (Early Accept, paper link: https://arxiv.org/abs/2006.12575) + + +## To run the demo: + +### Prerequisites +- install the latest version of MONAI: `git clone https://github.com/Project-MONAI/MONAI` and `pip install -e .` +- `pip install torchgpipe` + +### Data +```bash +mkdir ./data; +cd ./data; +``` +Head and Neck CT dataset + +Please download and unzip the images into `./data` folder. + +- `HaN.zip`: https://drive.google.com/file/d/1A2zpVlR3CkvtkJPvtAF3-MH0nr1WZ2Mn/view?usp=sharing +```bash +unzip HaN.zip; # unzip +``` + +Please find more details of the dataset at https://github.com/wentaozhu/AnatomyNet-for-anatomical-segmentation.git + + +### Minimal hardware requirements for full image training +- U-Net (`n_feat=32`): 2x 16Gb GPUs +- U-Net (`n_feat=64`): 4x 16Gb GPUs +- U-Net (`n_feat=128`): 2x 32Gb GPUs + + +### Commands +The number of features in the first block (`--n_feat`) can be 32, 64, or 128. +```bash +mkdir ./log; +python train.py --n_feat=128 --crop_size='64,64,64' --bs=16 --ep=4800 --lr=0.001 > ./log/YOURLOG.log +python train.py --n_feat=128 --crop_size='128,128,128' --bs=4 --ep=1200 --lr=0.001 --pretrain='./HaN_32_16_1200_64,64,64_0.001_*' > ./log/YOURLOG.log +python train.py --n_feat=128 --crop_size='-1,-1,-1' --bs=1 --ep=300 --lr=0.001 --pretrain='./HaN_32_16_1200_64,64,64_0.001_*' > ./log/YOURLOG.log +``` diff --git a/research/lamp-automated-model-parallelism/__init__.py b/research/lamp-automated-model-parallelism/__init__.py new file mode 100644 index 0000000000..d0044e3563 --- /dev/null +++ b/research/lamp-automated-model-parallelism/__init__.py @@ -0,0 +1,10 @@ +# Copyright 2020 MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/research/lamp-automated-model-parallelism/data_utils.py b/research/lamp-automated-model-parallelism/data_utils.py new file mode 100644 index 0000000000..b4825c1910 --- /dev/null +++ b/research/lamp-automated-model-parallelism/data_utils.py @@ -0,0 +1,66 @@ +# Copyright 2020 MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import numpy as np +from monai.transforms import DivisiblePad + +STRUCTURES = ( + "BrainStem", + "Chiasm", + "Mandible", + "OpticNerve_L", + "OpticNerve_R", + "Parotid_L", + "Parotid_R", + "Submandibular_L", + "Submandibular_R", +) + + +def get_filenames(path, maskname=STRUCTURES): + """ + create file names according to the predefined folder structure. + + Args: + path: data folder name + maskname: target structure names + """ + maskfiles = [] + for seg in maskname: + if os.path.exists(os.path.join(path, "./structures/" + seg + "_crp_v2.npy")): + maskfiles.append(os.path.join(path, "./structures/" + seg + "_crp_v2.npy")) + else: + # the corresponding mask is missing seg, path.split("/")[-1] + maskfiles.append(None) + return os.path.join(path, "img_crp_v2.npy"), maskfiles + + +def load_data_and_mask(data, mask_data): + """ + Load data filename and mask_data (list of file names) + into a dictionary of {'image': array, "label": list of arrays, "name": str}. + """ + pad_xform = DivisiblePad(k=32) + img = np.load(data) # z y x + img = pad_xform(img[None])[0] + item = dict(image=img, label=[]) + for idx, maskfnm in enumerate(mask_data): + if maskfnm is None: + ms = np.zeros(img.shape, np.uint8) + else: + ms = np.load(maskfnm).astype(np.uint8) + assert ms.min() == 0 and ms.max() == 1 + mask = pad_xform(ms[None])[0] + item["label"].append(mask) + assert len(item["label"]) == 9 + item["name"] = str(data) + return item diff --git a/research/lamp-automated-model-parallelism/fig/acc_speed_han_0_5hor.png b/research/lamp-automated-model-parallelism/fig/acc_speed_han_0_5hor.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a8254832bf7201bcd0d7d3f260ee8b7f693076 GIT binary patch literal 131358 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�hx;= z{`hVX3v2I!n#)!Lca_Rj;X8(#jq6K2cQB?cE3n5WQ)Q{ih-|H4B;EH(+Muh2iawl* z+9Yeb5G*)#UcX8b`Wg5|<)6LHA`XQZqh?V~*kyhfu}j^6d*Z&#mhFlb%BzTNvQx1; zv7IdvVEElM=+XwM17M+`GW=*<|BU6yfvl*do!9kh>VwTNT<)YImu*UITkX<@IPR8# zYCpO0K;YxI2l!q=_f^$nHmQ_S=}v7jUiEFumuG19Q8^(9tr!uF*JV!c_Q4t9heXdw ztUnN44io=kc%zQzGqjyM;AW|Fd(Dr6?9z%s9e*|qpN8E6pMmnoa+@JG@p!FOKP3(h zr>f{L6?2{NdhFVV(IVk2_iJsK_IE&`Unnpl8V)opHk7pcK{cu)ITDk4iQ@H|Z-j@V zYx#waT~W?Ifz3Se*<{sTe(`N-B`I%>_BK-QKr|<_Zl$jpdW9^-JtaUG?o0P3QbQQ- zq(uKof-j_^D#lzB&*=U5XGtLg#24Q~*xyIYA{Hf$pnSRBYsVnflC(tq#D7LR4Ghl} zkZsW4vJ5D9JD^#2TfKIa>0gJ?r+)?H`z_?86WGGYV`-r|4LZn8k*H?*G*F1jLX$S!)}cL0@V^=0(Dd z!N@P-I*7fg<|T%Nfo*5oy`5n`!(aUT{2JDG=TC8!-vIr0JWyFMd$ci*9|4}Vsw>5* z!Q$8GD^xj75>@`ZGsXh)nZGltZ7~zqq^r0jnEx2cRo8319k-hQr?k*xL37;+BSACB8X|x{ zMY=`?#%dC>gMM#8&Od6C8Wt|{pCcoT?ZMxae(fd5pnQN9xdl4&X~TJejME>hB9GTG7v*a)Rfu3M33LRcNAX8#} zxY$LgLJ+4IhEVQi^t}@=%gktAA8kX&USKZ3(cCLm*mx<}%J%x-60nQ_6|RrUb}{YkEg-@EYY^Af((%0l~nYt|lVU8U*lQF*@x*H~xjxRTzdhV3z1$ z^&6SwmWuW)n;65;F*)iBr9#OJr%|0^khymMQiolfVbg+KZZLu|iJVUT-hDUE&FC6# zY#1$Tn#a4WXNIbh@|Y+D-n*`laY7DD1`h{cM&w)e99mRTLdeO(aD)1wmCN2feP<}) z+KjzJwY7q?yZ6pzRZ41VWodRo^3w~jhot#6x)QEZfa)-5-$UzVJGZb zBnyvHFxt8O%wSM*tGv9DnmOW+g%W3kGv!9vxPQDX0K@(k4LX=~Gqw0-Or`a;$9xh{Qcq>8SuT&M8G+`a1U zJWfUm-T^X``%3Be5lvFy9j|(kc?L$KiN@+L=P8CTHaAF$Wzw(=-DYE)kFLN>27B^^ zxh9W+duY<|oow~wH_5$`9!lKDH@mxzew6X?<}ndeWgJR))^Gr_4|Po3K;zDf?&%SD zaUquE0gogVyd}rQ@f5}7uv`i}_uYpjqGS;@9(*INot1xP@X7yaRqJclAF8A>MVGf} zqtzOSk2a%hWqt-vM>6etk#DVR1XJGBDS;h&3YOs@@pyP^vBDARlNJ#)mTJJ|C(-TO ztt$MmZS;P2Z>CU-g;iOMg#|<6p0?VO*5(l7iw1hU|Hs!?09CcU@xlS*5CVq=K}s4) zk?syj=>|~&K~iZsbR&&`NVl}o-5pA(ba$7OZym2U{_oAanKN_mjBwa{?X}nX)~~(; zZPN_j@l~+7Cl~=XnuF}fWq_-@hC))udX(y{E0)@=yc8%)v5(zF2EVw2MviY^KVtq+ z_MlA$R&G+V3=nPZIL;~w!zoZC*gcTDng)hU`u=<0C5_!yi0Z&M761jZY`r}z*mmq* zhp*kyg6cAFOC<}yUf^uz)q5z2hTn7hvwO zr!UC8RtN7Pn^S`H;Pqm_Uoy>ID7At;VBz!aX6lSz_LK&Q!U^B<`mh*d7$Us{JxJau z>y4Y?q9JwMHsyZI4XT7v^M%Kkq1(|%N>Or7yxL%YyDf=d^L55`DIz!NVI$SzuJ_e} z+>fM(BXwJf{oq7$QX;`BrJe?QBs*Lqa94)(hb+Q`K#laYs^uEBH~f7|fO>THd;_1r z^mZ3UeBHU)JLs?<7`{|k8E8vTD>D=!`SF&6xrdm;0E+L%UdFjI+n56A30cr_m+L8(MkJyj>5ex-l0YZL zgVC+3ye%dz2}ikw{dN%V$JcTTIr4`ulENK)A=pYIZ2?&Hl%msI3lr!8k4TvEgQGQU znl=lIo}`i|F-EuC$tIn}t5~=2UD(eEx=UL_%ra^u0T(MaQWU=hx$x4xOQUwn?0U@d zbo-nCpvt^Ph%3jmDt)5St9OPRt3Kx(rcN_1lQ6;u_g;2226n1f3;MF5?X>BE5@xNw z+bPNwl^fNok)1|$0^UojqO8;LM6?|J#M1uV-&nwYFcO;>!WP4Hhb0i&7rJ|si|d={ zIPyVCJzo({d&}l6BVX&y^<}@Xo|<{O{q}TiEU3%Z91H7KlwLk?KYmWmW$s@L5eT#k z89REr;WZr}eNRs(wAi+?qGBB&t$bQy`z2@;dpJjzV*2Uj7oOBn5&Ae{;26GP97})=(nhp2S zfr{7amz$%}+}fV9h>BMzJc*?4e?DFqU-b~2fL?yBb$WJPHD{^&B5vJMD{l|he=7hs z!B1ZTWlZzFumZUQFd$QTZ|YTr$@Z)aLZkW(xFn17R=C(?Kx#(PKvoW)kH>Sc9G$R~ z_9azwVBX#zi8b*{n2jG>w}zA-i5vnX@&T| z*|9X|IZv14;{|80!2}BDS-h#IbFW1{3|LvWgw3Mnl8i4N$XortkhPCw5EoUjDU&hHq24gAQAyd%YT~ z$B}T`SWp~_X;z1b-0UYH7gkK{QZrDMS#2)~A(Du?#ojYcmGzzcE^9Rv`mU%w!Y(5x9prJ&;L-IsAR%(SZ5Hj1_1y)@q%S!%~)uT&1Qn zy8MYS*IW{j1HS= zTT_KP)CE;gbJQ+V>P-Oun6Suyf4UF{S-YbU$EFFNZk_}(R1#vA9^Bax!e1`BdZI|~ z;Y9R5tPqM`AUPcII=t4+{|wjOXRz03A*qL_g-q zO~o_W4{G}ev+FLQYmPNb+Ck@oa0?hqf<(O*ZDKW~Y8 zDEMx5_a!&bcgqKCISj;H;x8fyEZQRX-S%B`|9+Q{=+p|p-Dwx>AI^u1cfxw)A93D} zp=2)!N&2J(19Z!m#{c^2f{noqhJmV?6_)^2BW97AMzkx*RzjV5g(MCHiyF!AvE(x5 zZ^u)76MtNzN_mj>@1>K%^JTyhKELs#Vc%Y|MIcc(No}e-BztIMWQ2pYr`bQC#rs?mQlqz#7yO2T%g*`vZFL8g2eY!q|MPGV ztSXtBJsbu#LQQ2eUsz5~Qj2B!6no2#S^d;-Cn@aTAp}|*D)7@Xb0TX*K{SvF((r2aSX@>=)9Slktyx=g{?kE!N=%H|e{Tzk zjvCxoI2EcaH8vj9W>R`SWp*aqaaJ)i#?y)Ner6iI!A=sYw(5Aa(IyT~Q z(_IcIeWAfP?Dqcv6MvOFOj6)cFx4+KOz%s#gz$2uu5S@7lQn7;cn&+5KNbEj)s%^e zm~xx1j?CMM;8mLkgd|((KEoVL8NQh@`}#Npuly&k7r*^ypmS)!Kzx_9Nj3Alz3E-|`mkxa3fAh^zxySI8bp|kX z+9DgNgeGV(gzh^3XDG_3%Ybd<0#yE1;AHmL&`=q8GO^z~_AxszhA`^u3*sP>miqeo z93R&(yKIaF#KgoX-^aNtEPu2%oH*I;lKgO7SWx*sB|16|MS1`hiH3p#hRe?Pcu)qc z^KV#KflZ|9^`3EPRMa0pyY2_fey}r)MAO?_^pnkGB>4lp7oBDdHPtOI0pgCpX5Ccv zL4&VO=UZ zl}_!PO?{wQ9GxLSzha2_6#w3@*jAC>gA=Tb3TRbvP@Oh=3RD}I0kC@mMD=H2aWsrL zUjW1<7c}?#@px_5^y>V;8B`YUlGArf>UU#YK+px37qDUE9=$>@ZN3o{xmeFS{0g*J zk3dW2Xd|8|7d0f0vsawACyVuBeb5NGb-4cktHNHOdF$BgIj^-stDbQxV6d5$n@6{t zP_d6P@jQ^Ro^7a|v0`CjN>4O)4?&zTzBhVQ+omAg$`287$RbqXirO8%a6yw;*ggt! z9%;FKRWN-uZD^^?957WUttboJVEYhlBbseq*spu$0Pq4xn^P%3Ve_KM-(2KK{`_hs6$| zUSqcO06@+$kc58$7PIXKvYafS=DfA(`AD_}7Z@z>bD1x!CkMOGl~LnZJy#LK zTVVh5GROP2WbjI-+@-aqGu&F7>1G&R?GC~B&y$jx?29aQ>If59^q|JTz<2=S!vIbj z%QXNvMHMjL(Y*jcoo&1r5t|?h+J~uPuK=isFL+tmasi3ax# z`A%;JDlGfMyQup{5J%92D9}tT98qd&5k+5$dR>riLG&<+h2X?9Iou-_9z1t@c=4!m zS2i_Nibodmi@eIS^~eR)e#s`m0x;5fn13If6nSgr58O zjPr7_QWz1G&&HifJ6J`=lkCv9P3rt{KEp@E=g$jh_bhlaQ#(uIxeELvU`G*j)~r+Z zu?DCwcI_WMuCVCF(F*Uo{_Uv4Qb(AP`8zuboMv~!LPN7<)`0IpZu0R@+6M44x8y zDjgxzm}GpHEiLiUp~C_)Sm*+k_e(n>*#?vqZ@yT@}tKUXx&B)MR!yJ(us@a zEO2Hb1-L=T;o;#u6yP@djU3C&PvplK(j{!Z`E~h$nS+F|3>+mj?d;g$0eIT%%X<(@ zk%zjykAct3;fBetWVNW+ampgHY?=o5N3mXII6DFl4aa)G(!lm&w&7d$!0o#fx>zNN zU&?H|LX+;Z8TLZ`86ey$FB02di?VWHGjAi?Zidi?IK`a1h$PqNn1(@*Z*)3HAK*Tk zchmm8_W0j{t3Fg`J$-3-J2SG)JR^sj zOvJs)lP2g;DC`#D-&p|ZJ@?X~E$%26hk#R1tsAAM51GT~^CfYAtxY)c!*5ggD_S4( z#1#U3Ea*hW z3*D?dw>}ESr(J$gzn^_R6k`9ASW#D3zE>ji{a$izD2bged|qP$9E`sR)J!epP_Tyw z+ZF~hy>18%SJ(2&P~jqjp7J^=@?ct9BoE=qE79IrNLQE(HaB| zig4RXF`qqEu7Z#6ZIw1ZOr{GWg(^zQOwkgvy!Ksdg}TChv|#->Ix^TcA4ipHs`w3Y zpd7bPN)I4tf4xA!y$*vfTgb%nm&d!lAjiKQ6IJ>CmSZ4IE{2^Wf*`!FSJCmj+IpM? z;V@U;Hmv{L*l!60*YpJGqYA9z7=GM3M7|WJAkd_;kx&;IQA}tWrW&<_AMd}{C-08^ zPUtoJU=o*91@ZS!lUvR?nEq75V!s-^zcaO;sACvj%(IZ**-Dw|`l6puI%AH=wPFxBrJJO z{+aMJsUg11@4mTsz;8t+yoDO6bM<_<^Uk&_3;RGq?~4rA$4bXEcQ<>U($+*u#rz0O zDywT_Rj-K)tKnfGD2Z~Q{pJ*!juutWvUM-X`HKfWFMe&0A+*?nI;!PX0QP~R8a}nh z={AjS=)CnaMzs-BWboi7<==E8eH4n5e~pNF;;+U0{)q}S(#}r%1&YOGD<)zPlvZM- zsYz-0AfB3pq-0IORKm|O`%AaS=F*@(LT6D?7e{MCYW}O(*MA1+dWb$6)oZ5#LNr*0 zz4^+~M)M0-ac=s!&d;`e3Lkpz$MS+-pRn$W$=z;6$RP4rP>YGni|s8Rp_*>Ybcmf3 z-1F_Fk$Z?w6q;&&p7HEYIhM~4abah`H)x_Z5%(l=$^lv8eWWe=DY6cp5DfPFNUJ)nfm z{5h6P#~rxKCdh@z0(Gmw!(U(~X5+gLaQX6gMywz2kfOW@N?T5K8ahzGXm_10{sdU? z$7Z?OV$R(gzUy~D)$h5@*;Zl8MvTOC&cO1e4Od! z$910IhC0!21{hP;f8W}Dlb#AlzGq;h>5pwqj5%Jb9&hyxZl(`g@Zt#D~*% zaAPF4e*RFSGEvNG(J9czx%xhUPOX20h(3G+HzlpUw#t^(kShw4kX|=!x)86Tkg8k<7< zs~VAZhvdo7egh(cehhB7J2``aK%6>`d!!X=z+} zWMzPX8|9g;7e7{5komdOxGgBEy9xkFsrFI-Q}~iNp{WGGAMuwtoESM8_I<;3r0(dN ziDRq38v_}98rhUJL&qC!B3~ocL#I*&oO<4C^^SA87bnqvwI6@@_QYPnu)(#QD?46> zfDx}7(dBz&?L$~iPu6b-xS$I~s0X<0gOdGJQe+Y!&Pn2FU84XUImWn2KDMU|QkLA} ziVV3+Y(f!+7Qywm0>K_O;^H5YeGs>9XH!^` z>7hF%4#`{w%|X&r?CKO49&5WyNg=y}KHBst8HH2=j@f7Bu7$Bw9?O?w7NgU*M?pl7 z^-SHT7m%ltcosE|YyMlyK&-RgaR@zA5czompz;}`u_CAR?4U8M{&>m&5kk=c7ldfb zRm20+kt9r9UAFBdy{gDb+&vfd?u@!9-0_eD@I+)=$lx_Kq>8E`d8tw>?8u9IVw8mb zl)PUCUxW^cNL4Y=Xx@9hdylk6o8o;s^kN9mu|m!>P)S0CG~(aS4F*S=?oST~wQ2-H zN>P9<5h8wQ#)Q|O$ib-V949Vd-z^WF5W(ZCAz;#_&Mm`qRB3I4kUK-ob4}eKSafX4 z>5ol5zaaalSJ|~5Dr^EWXn7-9E0KJ0%BVIK3yQWnyStTQa5-@##l3K?e*tNeLMNYy zh!K7rn_-Qb#$r1qL0|OH6X*&ddxmwRDUZLeex3^DyS>}lb}+8sXFf6V{@?|`<*4RIA{ z0Z3I#uOP(o4a$7BEX9t=>l~Bm9KS#zP*pi3)8X`u**vKqbOE^Mbpf_5OF3Zq-hFxT zT>h2>t+3>eP z_Eh5^)!cEo$7jDZf%C3xtYPb}fZO4dr73+M8QilU_sxtVlWwTr1cd=OC#D#V09@?t%%sGsuI^*g(FZ@(4kV3{br zyWaSQM@PAYoxifK#4each3aYH%f>t1K1y42VYG1!9vee*IOqRYG^~ z$;8I>DAn`0WEQWDWMh7i#tNZn%jhbt*3ZGOl2X`yWT_bwWw zYqKoVkE+f|(Pg=4aY~+jrrvf$RS;6CV?U@|C%+@Ad4h;lJ4resGNQv98m42@SF1VQ zonh_e*&o|sewJW!kH!0zgR;GrKQBi4Bm40$3T!Oi0f(@Pii+%U%#h$lqPP0uTveK7 z+g(0IjMKlwhjD?KF|dWity&mEmv$5ve8luhVgJoNQQTit9Q5$+V6-gqM_Q3vbWL)X!mPxtKWP-w2UXhIO{-@<{h3$?EQm^ z!QEY94%|^5eU!De?8;|1T<-fj|W_ z_!1I{YJp3XA(@!uv^Yff(P6ptc(TBRR~_Y@X(Q#3Yjr1sfUgj zrjeECM)seY_&0=3orwpa;!Hb64hC|(p0YBAyM&=h@)EEcrDp&aZw_jJ{5gVx|Ll{4 zFKq}6y~7R3fQw6dvgI&zlf^O<2~M?2b#^&S5f}SY3Mhs2DYm~75O(aod)&DQJ`51BiEP+&KPf>k+ea1z&wqpfZ z33)CHHGYbEr2S0#tE&G)0tDkBAo#a;di#UfQNcBQQ=Wnu;UbkL{0p_W-38y*c0+s! z$%Mg`vCQPOJDAKH2djCWMgM=lj0^Ck0ny0fiXNFY&fWTM#eMBo3W&Os2cZJW_DuQVk@r6i;l7W0+t^;ohh zSZgwOf3BkagLjYmfbSi(Pjrib1^q@iI3x`T9P&VwnHm6l{mWJ2zXR4GCx{9_h+}ZZ zzo;6hso~!Q>1k$rDzA2@6@XGA{s#!vWa8zG2UMQ~5WwaFy0~s@^MIlY1Y+`jG-*zI zwLK+)2q?7x!JlxDio0Dd#uxkowYWG0wv-(FBf*_kT{%X6)ie8wf%pYo-<*8hG;PI8 zmeN1GJOV_|#DoXyAd;<^5h5Y4rUGybLAy=CKk|7F{JC|2on`{v%v4$sgb$<@BY5E* zx7YEYkk0@)4kG|^R_*NURC&a83UD@6u#@wHK%C(XVI667h_(!y`TCZ_r8z->RxzXc zDO>lTFn<&g7drWWB+hWCIQ60t0T$M^)3*vuU;AdUt9>c!xu!-XdTd)oMaAd9q0Dq~ zuWS~o5)@>4*}xH^cw09Zx_49@fVqDliSS=3^inHgWeOJmB|2Q zUXqB|i^Mj9Kbyhtxz~aN53UYwWm$>f{%rMy;R2NCx5L4WJ&)5e12MzSzz#r;sRq;l z&(}vXz82|lSpWEZA4n3SMpl7{BMWT9g?7e!W|r;3)QAqwApR|m9rTmv8yLt&xE_ES zS`Or!#jm}&+~IQvU$zdo+{ErH)ngi@w#X}Ae2WD=-!{>Y?*3Pax6HbUEv%%=g3JFg zqk;K>Cjpi2F-X}GLeP)}Wi@u{-m4&vg%cQ7-A>j=+rOd_R{%Bk9YspQ(huGjA?e}F zAo+&*z4Mp?g3#7l`Qm+Xydisuz@ufuNzEuMra@9HUhz{fw0^}wW8Hv>RR2mepH}1a zYm}d*-2I-59X|7Hq18-B=>FP9e*9i=FpPCtDvp#HE4;2dp5#9(B{3@PEbnNA@sD;t zblkoqc9%nhesM~d=YfgW36U*`9C)aps+tGHbMN9f$0z5mL7i{4H`^$ChJfgqwgM3C z)A;@4!|B~&WnCdMgl2MvE}70u7RgVBM{)iqZByKp&UE5oo5y|c;kzBAwY9YsZ}j!a zjX;EfiUlI~N|tg6XvBZ;<4Ducw5Fz$WK+J1Nlbk9xE<1s-}swI2(U4i4$({{t!I?| zdcD&5&lsymiho6ZN{`NYeiIo+2&qudV5j%SVWI z8vo-V_yRzfG!+NNOw_s9=&=LN061ZKgw5q5`ORI5uNy_00GJYy8;l|ZoaYe${bN7v`0(cD9fHa!*hFZe{l=QWv-Nih389_CSNcl(Hrl%Bm+7N$rjTL0 z-uFVVmHT3K#TwBD+a#IaPY+^YpI#Yb|8-$L@Rm>_Rwz{`--{{gxqyB4SAEQRBO#1w z&#TIb5h^dhPgQ9DxVt3vT07nrX)q~w zR>bVARxLOdThc})?dYbl1Qb2_22j$+40nlt*kG=9aUW34eBso3Wn9LefKZ593ccFS zudq1`=!2af&G}hAo2_k`vh#AYT$ZTxcGml5==kE!u5+!dH?fgqJEN};l30`k(tC~# ze7L)zTVZdYAPIeRtN*Z&@z1AMwD`2x4eh^p3Fk4-u^<|Dzd9ZMs+8S6tn^l1Z8|k~zF2^<8r+>j?uTc&( z;EE>byiVe>koUYDZ2>Z};(#nj=2@ykpu=rdw2TY_dBL|edKlA`<$zt&(YBp!cn8GA z_o%)i&IbF`0lqDSCF|ExW}>5%xa~0zlyi(uCa{J=aQ@nU5S@_ zlIMEP$k;mQXu!+n2N5#)iUwIY6gE%OF?0yX@Nd13TdNg)hj{Oay{5E2P0il7j|#69 z{5|GDYl964EHf#Il+5qt^|e213Vuzs-f)rAh4C+Y+|Hg9QTI1m6KgP@ZuLotvq0t>T=Y<&P%FCaJ zD~NDLHGuewm}AM13i$4zo}raQ3M!--)feW6>C0d%DqC6o3}cHcDk`b#qn~x1ifh4t z1q_$@QeTW~2=UqU+8(J+EQN)0gih@*v~K{+{jJwQ&;ke{%Rr~{RI}c8-4`E%iwV93 z>y*(&-KMsP8?F2=ahm0%Plae=0`Hh;c9DqUTQ=F7rWUfy40#n*zCziT-`U^faS>Tk z%3;XdS*A75_qXmS&h=duRS9d;VZT~fc{YkcUIK+6CLOYKQ??Rn+m4&zC+qlV10pUB zpd^cSP_>2w4XGe#g%HzpeQIz4-f3nsvEbzOJ-YLx+Z^;JGODbocagSux4XVv&R2u+ ze6_TGG&zj*T0s!loL4SC7)Mpu%^bXHn&1+q+;VVsRXus_HL(Wkn*<;j^ZlqKlyh=` z|40X;ea!);VQ0|octeZ5pEDU)2Og!#31{r)1iIC?O|AIEJJYfdad}!L0p%bvb5li) zM^ZX3>$m1N%`AdD2UK{i?-XGuS((+eSMNaYJ}*R!VjXa?MC^K997mf#K)${Fb1XOD zNnM_V)@a=_@G)WX)Pp|6(ek=Z-tc&?s$Hvex8%J>7CUdT?Ttj?rU2TN`_Hz*h9W~) z`;-d-nwyHn8ZKiGTCk6?H!+Ggx~sSt!oi3;QlpeZGrx6IBeDg3Wb`@8PVghLmMYs> zLvJrf?#|*FgNQ&Hxuu|CU6X!O)L6{odhwDMBeT;dQ@l9l4dC*_MpN&;nAH-@7#L8_ zA_L-OHP85PYzb1A$H14gJ5I`L{Z-8$8C*2}D>@_l20t z=2tG91EKZ)PYcm#oqe(5%-Rsk;Y6E!?1-H4RK-JCM-whNtT&qlSDS#0&G{z&Vd^IH0D%Nv>QdC{eiiq6L z58TQq@h>1ygM!#sO^r7crlXqdVTHH%vasO6d1c)@&V7szIqK}V|2nS4Nb(4EB9(}<=cTd^uh5(W)-}qalTG1JRCysn7(Ws zNv9x0pN0%60#gh#n8xqf6mV{_%-rlZVKPWGylGp)BxW^gA!LU>$ga;X47$Ux`8Dt@ z<;;7{Pe)I2A3D-%WEa(Y0PqdU%=dHDur2=bjKl^S|O2*$lSOy@8 zu5zOcuggskLGkVRPvD*BQ~3dNCuOWfr2ORS zfrB7h0ne^!MB3_QQe}Al1ADRa)z-fg08GDbMC8A+hS*M}ywvD&eiDa&OR8@$k2l+W zV|9+M@nh)<$kQP;N)K)X62~rwsy_^9D+ZDuQsgyJHWIK?2ZevQ0Os!vK=sFG2tvK! z^!PuWVcICT1oR-w?!7b0C-18uoBZ!B^<|)bAMe}}i4)ariL0q_EIdj(t$a3|uq7^( z?E$HkXHxpgY|i;+(?n-F+ByGDkhtp1vJgO&T>7d^DxXI5q7&6(HW1BJ>%2MNxnQ-q zJH%@>)=`2nDT4udw-}_6xGmpLAJ|FHOEk1MNYT$m(EG(Hfj_eLj}8h?4b?g<$`kj) z+}G^zm45N%!~S)}DftY4mzN9ny;vR6DnMzW*#li{#S1EJ{)M_IxWIX<;lsWt#$9B3 z0Nb(H&eUm9x;M(X-d-$@lR&offx6WKPR^>u2RX0;T}NKGCN3R!`lmB4SE|(e@6s&D z&1|aF#>iIas7I~*c$}TLBv+B>~!Kc(}FrNdc{!&l&B_t^oBC zt|>3s1FGmJ+3$$TiyNR-!3(EPj~~u0`yCB-|E&W9_g~yMl}+!leE!C6ICeL<%wH=I zKQL@Qz@++usR%?$OXx-?Ca#_6A8_O5iq$__&WhocriN7q{}|&VR_H?EWIfdd(`z zTTy%nnNOxc%;E~{zr9Z;s0UG;XlE;1)7BN!(`lpmq?a{f`*MmtXK3sN*I~tzX)Owy zYM`Cu;1_XcZ|*hlTdnPvod3 zZ0Gv@Tyc>4DU);0nX|4;)3z`FuIih;LtEi3%k&Z6A?3_C>y>QkP2t(m^atW@YE-og zT&P=vK<@ISj!IX|nL%t^XRe({wVGjLO|7f{2KZK=e#EJ@V9JwsK$W$H@}r0k@9ve8eqy^_Hc=qf?X0A0rl7GU0%(3NQ*@N}0I}}<(J^QJ=l?cDK z)l_*DZLgOlfRGd>@tgz)Un?}p?skz$a}zd5X<}%73>bBAZmz%@SlWb7bo+!YfPNzu zDQgmZ1xrz(D%m zMsaY9U-!*Hq(6yG0~O7X+^@GdB=w+hOBAPt<1UoN{bbFEi5gG&>9O0 zwm<2Cv=$>Af%g3&v`GQa^$C-f=$F`bFQ|o`I;+re>HIyXFyc5HUTXzR1JO>^%MX4I z8qEx|atAliLYLPN@@tSf9n-=Fh3Ap98Mhd&D*ytz@3!d8kC5HdTDPO83d;*ya&J^^ zv=UeiP3Y}q$=tlmj>SEbPm(RV!nxRtL3}~HT^x(f9ymv?gL&137vqC_;J-kto)at) z7WjkeuJd`?1>LhWHwLrzNzx97RvjXVI8Iv+{CiJib6s`o!CB4bM*|3KLUbPMFD34| zx~<9WOA5md;Xv&ZoBGV7BTESxA})tUz}nvr@<%+MTZ{C-K9kn&pm6<@Y=0Xr=xZ-U z8t=a%U4*@0?!{LeRu;LiLUD(X+p{Jx1_{~Y0h^5dr%D2*=VeG*(s4G~%@!@!IEvXq z@NrzWH)*J8dg*C8p2%gW3rkIm@UUEbyeF>h3{Wg`LV6QylG$RSf#AL*U}K>3g>-q7^@jV}`B9aM!Br>Ho!7<)SDZ9R2`cWivbz3-RI1G?7o z(rt<^#tTe5_GSz4Dp6Ur0V)$w0|2~Vv%^L8yMbq%^l4MYT0*+XaqD~T)GbIT)vRHp z-wP?q3!95X*kk}dPXT8{f;eI_W$aHmGWOZx+H&3!-S>z=Kst<|=5VXjc8!J;!7}fV znl9S|fB3$z=D-@Y85|KP9OEo~;)mRBy(0y&GV-B{^T1n&-{(#O%ZDx}eAR{r5)T)* zb`SA^aRb?!u7J~%9w5!t(TjtCC7QBmoBaEEL7;_MN%&bvcxi~YRi1_23lf< zOkzt13J}Q(kTM{QU$CyMEAib&vn65EHLa87#Q9saN$mrQ(}Z74g*26pbo?p<%;h|+ z=9^7Nzoq+daT@za!xro1$lWn^7(z`Fm?EAMJmgcI5)X6Z%F%~kDsHrCiQ++<5_9 zljJmn6R%wQVhYrf3^hy4$fJ7cXv7cS`Y^%oP&*oK6#Md{$3V-teFxQgd!p$YUmF5S)YLUKpeb37P@WN0$4mIi5ArX!w59g%Gr_qDptT?jJHo6b zxdw!ZE|H?uu+fsF(k}aag1vZ$SHnb`2XqlL({>dHqi^smf=?sJdB=+UG;jufC8sOD z=ja1(fq08GEKC>EgDqjH!v~PhzgLGypR_OiGo9(-Xc_=Gzo$6|!bjGVZAzm1@ZzAH zn38aDQ7)0!#BnIE!~L6o-3S>02+1xFiiXuesO<(aJ~zNQm+>BXAfkKm*dZ#htZov* zuY+C8t7y7F26T#o#a~6Bf-Tyt-9ShfYmB48SYUGr@;6_5mKzkucTbXe4i@!f65boIErLox<9QF z*Bs6CZQ*hV_tsw^qxd;3QWzE?N6rfgnsac5uq8n~j0O|4_gK^&MZ_4}Dy-?}>YeK< zO)`$FSD~b<+?IWWzHP{L&d@j_rf07povR2CVgUYXjWr7=bPC9n8ypFwMGZz~{Iu{e z_kc6sYP!aOJuk?+ZQ+*mSqnfkRj_ppXfHp%2wH!7pD`b>{$gues=sVcci_AT+`WlfqKRz zB#Fjkia6~~;FqE6qkTPn_wL<b5ERlpv?yL*g>N=-q2d!nk znVNN5mi1<^?pv0y1b%t|1*ps9U4yvqN5Q3jLV0~FIefl37&UY{2*=p5W`!pZ%J+8k z2{wwUv<%|DNVw@k=;8s~Tj|VG6^UHuvAiE}0t-zq^{p-Z>AuysvBi63%i%^HFuY=E z?o)7s({`Onf-EBuDn@vdl$AwN+w#%#^w8^pT@2m&=hxl($2}tt;q~JA5mhS~nS;O9 zlC&Cag1;;8hoybvf`Sn17TT6KcTmC@qqMnD+kU$F%V6zVA#xg*$-qm0oWxUP{=9bY z{f7@6MnqNvL))o?B^ z!il<}GITd@Zoe_dB4)!Y4s2sW=Vv6hpG!Z5zOglC^$MAwdg)fk(4`c)B2O&^MJ-}j zE&l1=E;QvxtJ8r^c2~g%Ri1hcI^QWkR;1huL7~Y3I+TmVV!_7E5KEcixG0xT=tU7z zTdSY*pKpdb`Q9Pq4KCH7 z*|3~qyz!#g7Xn?l8lMwa4|15lf_U#qlrvY**4=IR%DiU#OVI0Rv zR93sWA_%!TSQA^FiGARHjt#HXCAEZ?+yK`;-LL`=C8?+7=*GKk`jKwEo&N ziS1A$C|SbXJ;Xy2a$F;!SEX~S^81;$>JW$wv|YexGmAb}aN%C!5Ad;o{5?qGxp?!T zy1COBr+%pT)bmUm{YhW79N$g5PF!o*!REHVIDvs- z0W7}JOC=~mSAu-?Y6-R?xV@&n2Tf4q8^ofHKGJtH3VriU)Thl4Ch%2H%dU2;mbsKs^a zKLafE7x)zN3J7f0acZ>L7bx$1f z*XNy-kFW0PG}fs7_4M+xE&B$MC-rJT2DtZ%M<){%42^nTrQxdK^VD*+_NY7-P;{fHh4XQgf{h**YC zf(xLW<^X*(N(K*G(W!cVylnnhdYk-#d>;C7!H4hnRxvxPl@rZ9KG$eKvaB{@gE+~i z!dfbIF9>yGp8a#1-&DYDex8#!72AVeeYW@0k_&&ekJn{ZEu(Wr^8r=RM0#d@*3ZabL_(#c!y0% zt?Wa)>HIfbddgfi08413&dC>=ar)IjP%Gk7}slUL5sq?o(fr>jL70 zA6IG{PC;l`#87X}*#ksZ8jvQlW0{Ym0>X?h$vo!a=r8I_vYj`^4uPyq2~<8+Zz_cL z8Z=WDP0Gy!PSsBly-hRCE~_-2wDwsY&N<{^T)c&ODbg}x!D0U_52@5GMCGY95fsv* zuzZb-IN?`rckYMF@Yq4k_;8=I2Yo8I`{-55v!m6)hoF~wP(M&C<_A;)_Rk6#J5aD} zGl1x$?To&*g~DkJBB#^C#Kl4!`jD&Uz{z{O40f*d0T;GfEl6g!{y(*Oxs z27=kD97e2LVnpALJB_zOTnhJ2^0c$P6loZ-eE+?=Vn%TZwyl>m=x?J?t#w#~6-jv{ zr_^^EK0*U6(21l8=Ba;zyNn05y%OM6R)Cd-u=4u}m`yfwMm-)N7~YEK1nda$O6;{A zgi)L4K%6gsvKi2}2&Neu!2PVmzr7Vbsh4HZ!DBYjUhWv`d-FZO!}*4GM>A9a4QT=6 zpJi+UKi%4VVpi~#@EiuI+4jY=r>=#}47C36`^7}bNR@l`%iB0X6pq0n0b=D79}TcP zooQYGm~seYZh26`mhi}nj6h8?HmS|hQS_2Z=))fBm4CT(0H?j}_s1Cgzx)x^V|S$D zx&vDE$m0SH`fs4s-wjPa;1{=9-W3H$n*Sp8Rugc>GUwbs0JM}+XDHF9@=!wk zrb7hHd~B;!jgKnxol;5cucF(;yK}0?@`66bxD;1 z@dDlN@Y%6x6+RxlY%|qw0`2(j%5}%R-ufaI!4Rui z@qa9I!!K3A9A(XSc3_~`W1<@QIO}6W2#{azN1Bh4YXbcd@=Hi?*_u zXr>)Bf$;VARK}zEdMq=`+c!O?J+%Bx@zS;}CwvaF|#|>a|)LJm_#MWn! zE_!=~W?(+0|EIQtAZk0`ln!=Kd`MHPHAV2#vyeRf{z?1EQFxmZ;;;SrP`5+X@cPT{ zwC#d2vO^+W*WsJdLRpLNoi6mWqwv3f$_JG@7zwQ$yN+xd6XUJ;73!-1sQJ=jX*m5q z(_fyt6KuITq?|>J$oTTO@EM{y)Q43Imn}|d(SPqYZ^duH(#s?N{hHG_A^B5zIANl# z2kWv=TzgBdhjXh}>m6+?@v?A$q=UvKRb5JpqF~-i8G`^Wz$``vNZO6w%U<#XBE(Di?XzvlT~$CWPPd;#v}5vI zMX97be00eafXudU^CdT8yZ)u~9?HJ0phXvUtB6m38tBi_1L#{ikglH&$cT~Zof?i7 zPp^!qXI=8t?vP{9kCJs&`9AVM=OZzSO@52`M(HDipOV&hEO+kBOZg1TQgJG?<3qj) zQpHm*BUYz(Ekwg6z+;*kC3?Z+zX8+-8}H^y(@2b=*UgLN-FGWpj(2B-vTv9AgIcLO z0T_Rs8Y-mYL3O}yfO}yG`eevqB$)Lh`d}sqEcg?&t=``Zi(Xvwd4Vi;atJAG#cLB9c`^I)Gj+V(@b24NPlls;@WsEePil!lsP)tSAxQz?JXIM08-=s|r-2e4Ukg8*E&jhw_|EZ)ZlZ2>?C&_kqS zxR8>gTW*dptX&un$6+Dbu`~cI*%3JKNc0k^@es|B>aG>zS?IO!Jbtbuu7DPjBvmlg zbKop?=9(S`2)l8l@S%KxR#C$LDepVnx%}U^dH0r?nN?=?p4qdkWbc(N60&zzWF#Yd z%ZO}+sBGC0QAlMggt7_Gb@v&+@Ar2+&tLEyhoeJB@80))zwXz#uJbz2^O7sQ3-yHh z7$!l)XbtJsN-g4KBq!wX3CC)&KPBna`pfG;5iGo$!E00_2S#U{Ov-U%c0nfx_S7E#%rmab+B{tw6SY@Mf}ytuW7q^#EvyIf2`l6>Ls~3T2+MD(V(GEjyrC$+ z7k$=5T`iem0C`yim?cJ`YwYa5hfRE(uKMan#D15O{F4Mwt5|-?y!C5s-*llt^Qiyb zsX1?Fw>ghbuz(!h?_XCATuvgN-5!>uZ+SGa2bQ~^rZ#ofDLMwRDgw8Ed@`i-|Hhb< zoYVv2i%GY3BU}TYN3_$NDScIvnTOz7C?eGJ{xSQT)t z3JgA$zjt=>0!$iKuoZr>?06?#B-WZ#1F>;ECwAp{1YPlng~?Tsn;JaIVKeO}p3rVc zN}e>>&ugqOJnC}X8BRZ`WkRBygmY-`jY%GQ^Ai&U8Rkd|31ln+Z9iK)sp(5tNqA{>Rpn;)oas=z1R7f%L{?CiEo}w+^rQ zYa>&v@V0<166Id7OlR%qkElF_(o7nNfla}b)9HPUgy*k5woe{LK7o+xGUo=#PlU_e zZO5Wi0SwbAr&eM5c!v`^ZaqZYpjeeW=ltuBw;?pqdFAcw<4yY&jDOT0bjLh-OT*d$ zCaJEz(J=RpaMsvAiPya6pJ@Lp4Pl=E8U&8vI_=T`BTx-_D0vj+=$X0gF!vASXN&3$R)Hf;4Z{*-tqc!PuMjO_#YA|-RUbv=hYqRulUH63TA3G z`|n_QoPNV6@Mt{KD7!PJEAkXTE0J6kSU8uqjZ)#}=i%lOGe;tn6n_joZr= zRD@&~RT(%fZjbC{_nWNVzboZDW{HAgB3^&rGVAkD(+r00GNXsOLS=bt1jtrhl!-BhZ|G#iuzGrO z{ez1Mmz_^q3QzHFi`xC$0b{YJ_&$?cQwznXDXI06D#c-rxgU>7Yd@B|6tn77)%km$ zl5KXx>(f_EF{JA=8mWeRy@Cu!A?$7Zsjlz>2A5yIrjd#SDT6QjR~?-vYShE48Of!A z$$jAL&8QWBujv>}X!Y|2sji2Z%mZlWNkUZ@l1NaYl!1X+0bO%Y_Wd{{az`rwgu4U{Ysh< zM|iykdb6V*L}^(CxU?KmEaCAH5Vr_El3Qdl3rk;N+>O>I9_TfFqXCgh(fzin&yovY z=UtMESC@*OgeI8K`Z>D?-WS4CO-&kjDZ~7*Oyos9ff`;pJsbc-4bEZZfGdD6l*y?OeG;NI&+nP_uOmL5=xKMislX1Z>Wp= z%lO}TAo`HY`sX7XaR?L!S+ou|+ghA6IiHytOLA&6^5^_POA-pvWhvE#ft(bEE#!N) zZ*XqwZSL;js8>^=msi9yr+oI7X5ON%Mf zHb_@Evzx!P3m3*-dw@T5&qM4&3t%`E!#q^O`%t+&Q$gvUay8SmG;B5+$o^wO<(~u@ z^bTv3D}8@Xd~k-w%qVY(4oFdLXWBv=IE*y9$_flaEFaup8-9=#b-_!HVM z=o~RZs;McjR=6mOjICmR-Lw088seVQf~$E}9IMI~S)=q;6LmWmERi6)EnZHYWg`32 zcae-b+gPW`mTL`nzCPYlNZ}w0x-+nQ!_@BJ@E~aXzIwGz!xKG2lqL6L-`cs+y2F!E z=dWK{-qc8(ohR9sXXp%Kd3~O#EgxkNlkd1pKKmhX?;kG!hI}h5_C!lPruj-6unsbb zA}~DZzIcZ~n|!;UsNEXeI|QAlgzr*!oH1~_gjMR0$q$Am@&Sn`gLgHeoT)hKJ3u&Ta$Fbgq*UKep%(7mFNMAR46V}SLW&In%P3C6#J$%UtMY32M z>jfT*me)KwwbqK2I^SMgy8pVnB!y>ztbOIYfiuF4&$0PXVQhj^2_U6rbaUV4ksWF! zq`p%HlQ7nXq(jR>*e0U779=3bjxy`3K-fgEw+AFLR-t5^F%zeYW#Zh-%OYK=kt5+>-vRonULJJDwn7}gn@gDAW6|Xx zWhSaQ3ALdtjCOm#jZF4KFi3wN0S!8Ek0nE5y2mD7+8|E$#5cfqB*@; z+uQ^V&NCe&9pZJFS8Sg3T=42Vwe8}hQ~MQ9FKb?sFH2k@;Y0XKV5N*Iu2el_<*_M_ z(D(f)OdC2S%lrLLw2g)R=EQY~A4Fb2p2b!sR8_u={UY0gwQHX#8wasF=#Vr_&J!Ky zJYvC_8vRz#Y~u`HBI%p=B@T-e$^4w9Ni0Hjj^q6X*z&ksnzJaie$AY+U8YkqOFEep z%yR3S@ub|B4l}-q-gUiL8bY?La8F=4*Fn0En}}@?Y$}QO@HnzVm7o0I(bpo@A*@6{teP|=etN*dVj$!XI#fP>Y5I{x%OF@ z3i4qFObgV*vigME@&2lr`gi8Du!pj+yLap~Ona{ID+Nlsd( z14cT=y~ebauR*%#Nl`l9&e4!3!ImBmfoWGi)8NZj5vc&QMBEmv{K&xGIr{<^QoL4? z73-l+TF^Q;@Xeb;9?_QjiYYz5TLo{laA$U@ib*WDM5WV2 zxsZ8!+h2KJ2z_WK`O1L)XS$S#+xGo~DYE^UZ@Fws+|S>D9HO4SB4^Fw#q(rd?e1z{ zv+r7b_xKx}CI!U}#lJ-GqZyG7K2ymOv8#-x> zXxXm;m_8JCtj_;K7COT6>>HHnUAyR+0VHgZXd*AQ(j9qAAOU;-&k9_kz9-<-6kp@&3*j5?dNZzzzSd@sV;U|$4r=Sj$WI|eE^3_5C!{7W&jLh7 zsjq<~U{YKU&3ODP9Ow-w+7Y0c634;yOYBkX(Ym=;c#AC#ffhS9458_`>|9cD zhiBXjDvU?~A!G=(CEd(^V7eqeWVF*h`ny}-HCtLTX_9;O5~e09cWXq5jqDo34*Hq1 z3}^d*HeVx2aDPZx;qI9T3>uk0->zrthbbAq5+u~ZruG)uFSnJh=<+Sak^WX2X^eN& z?`|kjYmTf`e%db%(zb>J0bUlp!&L31b=vwD+zhQ*5t3B~=~q?|$FV!cuZfh%!j=nv zMJ$InTf@5l71Y zs#=93O*2cnpJuC@LtMg$@Bxxly5GYXo2xktC&zuhGD}CzJ#mgs%E;2Q!&&;>Lg=l4 z3R{JX9Y6Rw%X+}ijdSA62dHcj7c%gtkG%HtXr4m%yhlWP4aQ#ssq%2w8?SlL*Ty3z z6eCMN)&0fpkr7F6Cs+p4j)^x1`dKX!OwX2A1fQNfQ4Q!)C7}^~_4a7q`rg@d=nvfU zxJHWGFNcG?LUGkbvoM}-yQEx8qFcvVja(PpRLADs)L;HcIUQWe+tH}pC{9-OdFJ+; zgnZ_vmKA=%{Y%5w7)V2n0+STV9(=sUK!R%Va7+D#^{jix_qK>$(d@Zs;Wy8ii4#LM z0%MIHQL8W0i}q7sj4)no&y@(woOt;>3$J)kMz9 zWP*2PI?yuH=h`l?tcwO#J=ItK5y_YN^Ub5kfG+FDZ(je|JdvF!jEcY;aK4tKUOLE| z7g#VW%$RLbIE*(LiXfdgIDMpFVkli(@h#)m$c1(OgW6yBnqBtaTwqvhcV`M}qNtgQ z9OwJ3LtC1e?$}Y0hgQjVzzsLj$i}!FQt*S!^v@25oPNClsPkRFg7App8e*ZpR&L+8 z_R&1_MsTzfujiNa`NHK*BqI9rBbbZ;ip>IR6fk)n;jnwW(rLPFX}A4P$O^X(KerH= z_($&~1AJ%-7Xl4QcM+9;kX+(i_=?Ry-xSEvC~?Bq$O>(i%^E8K)kaQcIM9Tk9zGek zH{k=v@;4kky`UR0X?%mPY*KnZ97HU~{s%6ZiF~(^tB5j+SqqJh;n1W_A;Nd^J#PGO z`0@hsF(xMwMfg}a`U(=|kk5X$eE-+YGAHZ-1iE;9o&kfjmkcF5k;o>R*~$DDC>y%Q z0FNTMP8M(t5_|Sg)f|PG6y6HEPnQyZaN!M8GyQ|zGK30~<};)!O*jE4laGUYo{#wH zgh0)i)mD6|W$M2l4W6zj8lGM_^rjG8oLVlwpCmMALQZHmRL)oFp8-nXh1W5vnE3-f zeqI{$!W#QwKpWj(g9Cp$z`u%-!0Y%GDaVpt!>29wh3C1V_lfa80N$Tb{9o6xg)Gwf z2CbXI2VLnAtnmM->LfRNadho+HF-En~_(#6!=Ck1Vod&}8iR+Ty?DsC=p55h;58?i& z0(6ZzVJmC`kXar82u#&_Rg>8tTco=ZP#QpG%i_uA6)0?RR*KX?NYG27Ov703__X?m z+kI#@&<9L1+oi#bmtUY4_2iw_W82f?y^pP8<#qz_o`@Z!b!=A>`&A2c6uBMB#z^!{ z1kAKB&q`kSl5fxvOZ+4kv(o&5G0s(eB*!Q3aA{hk0MDp^I^z4c_b*0f7UU5(*bPuL zfuDYYet#MtUzTY3_)BK=E(b2LG1lMjj5#S}itC->vAZAvwII6MSl|>K+N3S$fcx%- z2vxpHq+l$+1~x^@;xTV&8qe~O02`0<0#3VJ4a{bi?3o$jC5Ss&gz?&_le6>F7LVLnHnhVfuNO2&`)i5~%F>5jX3qZQ_|g z?uG2FfUY_H<#x*3)%j>{XchJl>DgnR=5=8#m{rq&(AtJzf+&pd1Gr74-RT1x0;3Hf zZ9e@LKVM`aqe8>FFFE(bB;R@_%4E>RaJXj1_DrwxKCVHBIpx#wI~zMxr^nC}(iY~Z z&TC({CWy&wIGbH(uTX;-8SfS}4pPk!w38ZWg?~V@$mUb0IfeR{%Xq#gV<4F3)GuR3 z*m5n8s_(j6Stb8-P{qg%m9r88|D%AUn}WxL8LSl|n#Ffkxgx9OF;~J6b3n`Il2;(g zum$K~wEnhX^G}5HYErxjRLrz{gc9tfo(u0Sf+laXWAGV*oqsNk$Dn`?_ySd);9#m( zhJROm_YqhE7Ie_qx;I4-P~i|!Os3f5F%w)X)7_;J&X|=WJrwY71nI3MJijqKyvX&K z@4oBX%O87z99jeznR^E=TQ3AqE5;W-=1)Z}4@+_~aV zKF9A(`gRSR?`TT}z@JT|s0~bg}WI@iuV1GF8H@w&XaIKWn8z0hk@%!5eeNY(^~=$@7n4fTn*V02wwLR ziA{!TD(@|0t(>KL2Jk=gKYoN}B#^apd71D|w$|s1Ur);>yBEFk-3Y?Iq!sjD&+(Ys9is+T&{LyyTBf8E{g_Q zJNc3JT>gblIsvi{TpL9-`dEv{}m-pkH4WYv_YcF$4t_Bdi?dY4=j|tWC|&$%)S95>BTjzi{Tdeo{<1n zeqv4fJ~3|4kAu5#5z|Q7?BLF2#~pU=7p+ql3>0mTMw_4f@HwUxJ!i8>OhE*jk$1-B z+o=u7jnIO#X(kNcv$-bb5U664B4aVBgIS`Q<$@jk)^)SMB_lU7c+;Z2f1#6vu+XY_ zg!WgnrVGVCq#!v~;@$vx0wr<8O(cMi!Pe^DE6KL~`vF3~p32VXE-jGs#z%9);4|U(y!h`oNz~Lc@>% zcGwyhzlNU5ha-BtL%e%T_P^EmgNPX`azJJ_Wx*KUWc?;4gWFs2D|5Pirg%@{UHA8v z*?;dDF}ZSI@U0zfUNz&h<@y%Pth&2~blxNbDNK2*0|??)e*u1J{2-Qi4h92K_FupR ziu#3hGp5UP`ni3)fo6v`^|yqBt>ppe2*!DOyb^;s6^Dr49AQsZpE{Af5<8wgs6>lg` z;^i8$E(GKeVE^H)LO{--i?dMAunPyLsnGjIMnj9c^~-nNTA4YP-%ROwx+>vl_O}|9{>Pho^*vd@!!|TKJ{CmZpzFVx1W}8`Ow++_X=6bT#z;y2ektzx#lWu9Gzg)%9MLPCuDNH$l)-O1{>Qgt zgU$p@iwX6Re#RDwt3R;$Ox9fiY&5-Y2Xc_nm2lU7n(Jc6+wZ*sd_y}8xr~gnWbVE^ z4kKi|18!(0y`9$$w6Uqs2ol2n)n4&4d4ncugp55PD)}Mjo_XN~Z96Z!uuQ>Sw<`=` zSC={oCDp*GhrNFqhPpnkt39vk>cZ_bI#h1%Z}5Dss)$&v6HJ*a9u@o(mA z1!MeBCg0M_g=Q_g*RIYYxI6MQb7`hQVO^Csv-H``JfEPhv6x4@^@UNAs*Uc+?{po; zWZ6Xm_g%9Lou3iCH1T~2R?{UQ{}ZWBlYQ1PUHc~4Kk5B5yX&T+hm~VgHs#?>5XO%x z$vwpoS0#2IYvDQaDG%qsj>}MvqoMYag#vrozzfhS=f?_i7rh^kOdw|4TwzMO*RYwb zbzjb@DR3=`R_agT7H%!U3SBqJGtOodMD;Yt55$jWEJ_|)KwZ7wor2?C!P{FmQ-pp=d>*eR%tJb*-PR2hS7#rNh+ zQ=!ZgBc_WZyK>Tb^_)z4k3L&$YVrN1ztUU)d^^VRS#iul2K_SjuMYBzd57nPJ#+se z)F73i-s|HErTElVXB}lH#^`v*ziNr|ZR#3| zpRhJu1V=a77jh{aeCr?k`!xOR}BB)8mxm;v>wqi~l1pWrN z9^(Xm&y2t32Z9|lY@h}9a(VU-!Y)5|2>bMcvV!#`)}`dg{!0}_R@4)REW|TD{4KY!KmC zx#C^l>B8uef&=*9B#|Msf+4}MTVlH03Van3p&cdDO4b;32KyoF1d-`Wf-!U+6gCom zxegwJV}2x#Rj&gVMM{$S=6Dp;927~Fs=T|;yK&gl-zsN<^O*F)S<6+)Wc0?fwxuc zH2KVAkuNcz-us6M*#3n6hS@nKss-CqK^bAW^*#q%Ma#k7+9VTjgOk9~YXDBhx(&hf zR;5=2^)Df2xS34M4hXU{d;u1dyra#^rUw8lu zcmz3?YKcZpk*`}2WfZPMoL#Pz-?PDNab4)hyZ~8cDjqp!k!N^zJja`?l$4Fh=gL3^ zV}||}Nzf!i6`b!7lHuqR^^23hMc0*Kt&3h}3Mx0K91T8mwDvrn#;uFw&^Y54VNGc4 zr5fqiIM|%J_EV7Plns*3k?^5S&tnE$g3;A^RRQ>J9!FWAf>+JYR0lv}C13=u0 z7?iKJ*8^s64ir6D>jU_jw;vU@uqr#9LN{;~N9Zu>flK4JkVvw8W{K^jbt!Og`Y3%s z`UtoJ(#sCdda{XzmCIPmN{p+pOFtnAyC764rN_YitRJKgi{WG%34p8gLukm3XbDQm zIgINZ60^a+PY}dA;kEgnG0&WJxU8Z(3C<0yj`|vel56~xH$%P0uD>v7mTRT@bq}#p zTX;6Wiv-oh&TZN8x31=Ror5q-^W`vb;*$_E;Mjv21FUR_wxnRLm_%HpPUSYf1XQh8 z1Q$iPIc&nGCRx(V3i6suYk+okI5`dQLnY}`8I4=xb&&L%5lVc^FRJTP70knEAY_<1 zRVe1kKRq=luQ##V0py6hp7cre{OKx!K8!h5$!KoV5A`VEE-Cw!?tm5GI0wCx`CDa{ zcAd)tlh%P}$3<@rribuRBFB)*hPm%-M2M7QtATq z&PBWaWH+R_Y6;X{MR>@$;Qfe8WIW=pfWM0)y6wVU_WNTZ@G%Upbx>v8Ux;SIESpf> zeCA>PL(u~`bQGHU+(|ZQ3GcOUmRRQc1!Cw;tFdQ2`G^Udy=98vOfj0 z9YRd1GB#2;^$Q%m3*@#+f5U0GHr@VZ)fPR}W2-fIERo84VwQ27B8hIk#v! z1&kT^<#SKC-}&HH?Klkb+Y z?laqK+KvP*w2{;SWXUnHmYV9XSr>oK-A3(3aNHwUN>(N%uJ1@Nz=MhUCdcF9G3)`D zHf2!1ZS$*ObN!6D$H;2g%6tY_;kqU0YejAg4n}y$m}JL>Gj4*6wigJy%(ufGMhB&^_n}UomG6ODswm4^mvjHwXwIE1bzD1$7Q1S9)r3 z%`GI!vkm~a{qe12;M7Ao0v|HaCa^nFxBQKq8)43Eb zh-2xil*(seJ~K$oHwDP2VTbdxu(eAe@sHm*v|s-YTuugX87lMK_;RDFdDlde*dYrj zsvmQEF3twVrkR~22S7f*=1pcay$)ed|Jl5>Ep6wj!rD07AN+$g{s@)zRiaKtP5gwU zUCZQ>A<=2n!LeXtW$4pZ1Je=U-b=u7!K?HRNUgLx~3VT5{f{WvLHc$<(JG;^rG6O;a zyxEMRT{a0I>(|>v*lF%P?>ARrcywngu`Js0?4o;{V>0dp69q?UYmSO>!ArW=B`D|4 zG-Ei46pg1yb|SeER&jdZ3X$ff7m^ivnln`2!|l}%2#pPoRDp7vmzTv`>Ue{PLutH+k& zAFB%#*&`{vRI(f(SuhvJ$4mW+s(b+*yyBketTw%L169~$pl@nfv*Wc}c`3Fsn2jpF z;C7e|hAQ2mL>l$7J>NmV)fU*6Ew)qXD(3Hz|;*^Nw3Pwed`MW(;|4 zU{?GzQ>so=%Qr5cEQR|&AG*pn+v14WW)i=)A1qS#=t`3yL%iD|`xh$NjcO*|AGPiP z(y|&XYZXqIr$uvv2mLj&yAaWQIQxL#NJ@Ejlu4TjaJv8*YZihj408&{JFk9-JO!5^ z4%R>=lk?&*@|fFS9F4}hIMKV`5L^!-pCd5|?I~os9R16Wq~qB-4ycIgr}^&PjWKf5 zf0Ra7ambKwXr(Lt3vM~lYg|V?d#5Bh#C_Lc)u)_eO2JS;eC4^lmX}JGf)IflG~iMC zNICSa$10Nc=BM!dD3)7JM)n9{0#-lk+vzHNPAf-?^wMTa|9q|D`!Uvn<8IR}c^%U9 zjQh0iy^ICIc%Bw;W*d^v;I^#@MFg5Ty!c_A|>i#KgId zD2t$jV)nP}*UxN35qD2pLHMw)ii-{@+-bpP(zea){t z*-gp>`0A{BptX2h-MV@4i5`)c*TlvQ<+MdQn`TAo5OW`jICAr<%e?fk~5^A5t>VHSt=`mup4aaIH!2?(FB2gT-Mawj+71mHQvojw*Y@^6P5?j)pk0cv`h@}@=>{%(7?|$or zdXe>T61m&3^8Re-%M6P)Y+mD7m^pYf&*Wxh|$lpq}jFB)wDLlBi3O@&+@a$faeWNxj5Fj(OCwIonqX zp!e=4L>rs%1UxCIEjbd0dx;hNGB8rQK+H2$`{K^mFWvLet}@+MdG-d{>@Vet??-J= z&dk4a{&6AoMs3W79c5c}+|2gt?D!Q~MiX^{nlnkJYsmz78a>vHQ^^50X7reyMl#c_A9p&&o)UPAss89O`=Gp-KWZ{BFH^is z=bFQIpvYie9-SS3a9LAFz+{nGbcWgwiiSO(W2ZEiN{?;hOln=v649-h4qyIgX7edL zKG(AKp{j~U@++dO5;!Fohqb=;`!U|eojJ9a!iOq}v2tbV{n)FxR&gdx^;@V@pN^LW z7Bhj{Or6`d#9E(jpq8wQB*f{j;*#qIchy9pKCUs5*!N1K_(va~kflLFveItVM`gjE zZv*mj?;mVE&JS;c)2lmZQ3Ar+WCZsNCxeeyEl^)2%x9r`0NbeF8}l%$I5-%!k$eYY zlr#wQdd;s|#17MB^{Nb!`u?c@XbT5E=KR$QOH8Q1p{DVgO*_I{?V(!&={UnSEc~}d zixQ+Q%{|`U;1fQV-1#}=*mOyvqRTo0A9GlOioty&;_?B%50S(-2Fc~espr(uQstDq zW~Im6FVC@aq!A)jX5H)_8Wva3^u)M-s8GfpuR#jUu#FZ!G_o2V0;5p|my{E*am5)s zJsu+yr}ywIumw~7OG^!s`3uoC(({4a?Puh<^^|N>c}cV=+Gy-}Wo8B3?1oa4zN1Ew7f z>s&U!#}i=o49&fH(5W*MNbn$%l8l*nHHK>0hTU~%@3oI2_cp1n`@=TS0Ycz^D5iQU zG9zET>mu$LF-R@$ZrjDkC2P|lHFj&POld-J<#u#oV8ktbrL8>dI7j^qK?keDM0jDh;6{KYqE7Dfq8-|6C zE|bwZHMl@9LSffJ!-Bzt`yX)6_GuH6Pq)3e!3{Hy!esCw7v{csIG#v$LV3Ii$pa6W zvzH1O{-(tL7s!&}j@o8Qb?6LW5-pt28Qh#Bs_&Y6e3?inOLR% z(XiY=eHX|JHGY1HP__xc1tn3y25rDU>;{CG1ke{N(qa;_;69*;=GNurS24wjUHK>t znQ77ZKn&cg-~%9k2(AXzh{8ztsair?%4bk2f2#F3jOOn42;mSO^pf^kcsG(Mmh%gC*hudeFUr4(B$ z^l}mO{Pu2!TMC$Lz2vBs*$;@0`_E*Ei3%YlrP&FNIZ;pNXDp)3k@RW!n79EB24yLr_jBBMS+}kW zcKEc}*x1_}LqG(1XUGRWmcWHo#&yJ0OmQqIlu`XAsOsPY)E;U$tzarN$%m9huk`i) z!8sMx<&M*=Uxnyb&+rGI{0=Dsx{3xUkXA$LX2^V`*Bkp@0F#&O;Q`fk)Proa0O%mZiak5bG*H**t~c+Q%Ud*~`pe^Ke!*nJHUnjQL%s$& zR{L(kJGYaofZ&>?^VR?dTLDfZI7-w8{+y`bys z?Wth1X=w0-z?Y!Vt)guXO$ z4YAyWCYDnRi0lL`m0gC_7m{@~1V$R;z|g-5A~~}Q!Vbjxexd`Vc)yc4Ca0&J<7vc4 zbN%0{51PilN7omyeIpv&Ot$kBh0Z+1=;csJLSU0+$0D!RD7y3$IVW%z?0x9>J7Krs$mNV$diQ{gL(Y7u9p zc$G_b+Bb@R0srLXnR;m<13U4dLdwL|pWF+oo_n2j5jL019($LB8-DVse>v;>Q&|)m zQnD?>gMIL8JzU{3944hVm9x{%1&sgA?nRn0na(Jd&jig&iAOI@6*r)HNsN)GAVOUV zU79153Y6uzBzZlZp5hx-igSGuEMs6-odprrM)yPU`xQni7{~8WvFQ2z=zii5_ z?15l7YD&`P6;UCRV_vMZrXsVk+4zHcgX>r6t&*?)7=F)XWqwx%@Z;?rz?5}N`?mU% zuHX8j?;|wu1Mt{+`1q1m=jF2cbTWP!-7$of_Tq-v?t~52&85%s&A5)8+^j!fMTm}s z*nrw<5pFXT$v7Ek*-D=SxlV$%{7p5a{3>*;fbiRj!ih6^_jDov3Kde!t^l7I;YZc9 z-IrEsq8f|IrKK=em^I}{VWc*zy`x#_H0fdv)x^<8HyfzBg%+#49^~pgXP)N4Sqc1T zgM={00#mQy+xZh8u|waY?TWe;9&GP__W3%w`*?|(hC%G*_&I?OzG0@c0;9R_d{^wL z;i?5Ja`F`p2hY8b(=aLngFrGH$Pf)QEu{g}JT=tr45;VJeeS8NkxbNPpTn@!lG)zB zNVaHw&Oyt%F$}IupX}_KN4lFYK^)QWdEh?z_4MDv;TWQ5*0%90t|6{Jyt|~pzxT(s zxR^zehtKDA5vG)RxYmDBXXQ|-7%dH4TeBakDGAJ`@9urx_2*T{zyED_#1p(a4i7)6 ze(+6d_W~5JL6ZNqRiN{vf>Kvy?mm>*9XiQ_jP4WByYRJ_US~z`FCPIx%h~WZK^#?i zWG_z1ATe{wZ9G%n%&1o`_4aBP{i2`HY#~FB9r|c;M1A+spPAC8j**IEl`$;lAHm_A zP5CCK9jV>YD!)3ipCit%A>y3Ec>D{{DvGtc9@Q8MOb)Dt^wI8K_|}OPib@0MgGT}l zMpM`A%*7~sq<{c)QnD8%zw>VOg!3w^KW{$Y#O;r-d^XZwrQm_$d)HJ>cDm!y5vn`9 z*%nHV<9)8*Dg*obz}}VPGi;!%4sU8`1pM>X9c<2E4k2wezc5zj@}{N7@;N zJvb+m0mk`~Lt`kF8I&F~zldjH+1<{!5~lmbGu)^={e9AB3K=&)8aKy!%k2=! zG!W0Q5uLnvL_4>*wA)JY+M0a22b9L&TRHZhaG5qZwb_Z4-j~0y@2q<#67%CU+oq&_ z*x|l)0aDCdzzFR*?^df@4?1i$otS z$(H(r^B)b?HuV_mxs_f34z4cJv+pw&)sMC&TrIwsbIcC9u?r+&vIf43_7{L{v`Y+;tMp!s zG*Yn)B}N(Phm3atf$4@t=Lu&8^Y-dTKIS`(;hM6?dK(tFX+0Yk!ui+kMvKlYjwKtG z-E;>NgVhxNG3@qVQA}~0|4pmDg_M`4S`Yf?ph%EPO?(UbIH~T3U z-5{$b!HMv_rPvnJ&huhghxtZKWck!>`=gf*BbP4PGbdvhyo{ZqU4Q9B14_OR zSgyxKNg8-OX5k!KH!foa{kA@5bo{1_DqN6kb8lstZSb>_%zmbjnlE!`AVT}6Ul;5F z#%015dYaEmOBWnFDWB^QcRtiPtFn+AuwJ{j261pQ(xGe1Q^|S}Pkt1QldQ)gBzz@) z;>Zi&z$tvkZOELP%Or zj<~v%eR?y5@IFFBL&5SATdY5#EXg#Y|CQd-lU#87_5Ygw{jsV3+oIxmDlWr9>*y8) z(Dy$zmpII*bVe#ByZ12BaV5F_s@<{Fg^_12OT8GbRiiF6rRoS0pvsCCZ8X$sHmIr9 zbb)Ew;P3NEBoW-9LMz~u;J$r_R`O3u5{kCG`?i#~(yU3ajmXe)XiyeXS8Fo?>;6AGsd5|GW@r4UNM-6aD}-^m7Vy zisaey0!JZRxgy9cFq>VgjWY20yRCjlX4K6vEp35<$VqVbIacJ%%gnR_Vu3(R>u; zPk>^TEazytFM?ypTuZj-Pkdg`g;YdSec!C$zZUJPvu=<^K#}^6fZ&~6Z&yDrjUhHR zj-%Edf*L-;Sa;bpQU3|vfljp*5)H}Ck*KrYL;9j)sHlSuZn*0 zEo@s(vnVyGFQZU+tylfKpP?CE^Arw3JogkSWkYoREs8qhM8Z_~hDJ5vq0vB6SKA|B zu_NZhCZgkpnl^d*c8_BpoUk|FrZX{BU>!#2#l5Y5>sibdIqPpR1Av=zlGdb0b@C*> zfRax8xsx`_&syTQKQ#X|IRIjAmic4=w0*^r-N(O&5!p&c^|kFp{zX5d0g5pJ8+(sV z*o=>z9cQS+175TfTRsi$?pra#_iMxm$zg#c6r=%dh21AbX7uHvym`m8SuHg%K zr}K>`LjcOXeEzKwi5josHIgPTzDN*JGi_JiVfm_kKxZ()xtuxcp8eBJ+9UZq80SwSU&4%hMW!0s$qTjBNn1ji}y^gWlD@$JD*5P5{IvB&{_VQULpH^e@yT92<_ea5P|;3sY%@^MzTckRs9 zs!%qG4c1wM@5D2o`kU|cCEqJFMz@Nn%TzP%ZYW$t809V&D(v>%WKVwp9p|d!$13M6 z_i{%@0pnv8R>N)lHKh6VkAw?07{MO0uC$oHkG8)vtrXv|eD;}tGT`#h+6;ed@hgjj zTrxOX5f5%+b#H&#FwZ=QeR;gnsalfpF`ZBK-N@a|!=AcjLyH2Bj`FuN!WDBF{E&mS zV9Jvz} zXaDhxiaMhy5t~TNcw5tlLSAf1<@8KOAG1KCX&@i&N?>uzoNp#*@qG&6V{4!=S^Hm~DxWK-r^uLiZogCX|5Dbt%KXzc(?U z)rxCJ!4LZRJ(?1tI&3=;MAz*ACyA{-$Ng|6Y@5FE+aZe%f^Z#CGn^&!rEibC6a;It7ltFFw59{a} zi|f>_l0L{1n30O4=gJtzEw4_r!EPo728PWw1$jN98-Um#)}W|XPb5wPPGh%(`&Ns) z-oIb+*Dus+kmyqfdQ4pY=kEV{9H$bU&_N1xD>6qogRU^>pi 1, the loader assumes that the full image sizes are the same across the dataset + train_dataloader = torch.utils.data.DataLoader(train_dataset, num_workers=4, batch_size=bs, shuffle=True) + else: + # draw balanced foreground/background window samples according to the ground truth label + train_transform = Compose( + [ + AddChannelDict(keys="image"), + SpatialPadd(keys=("image", "label"), spatial_size=crop_size), # ensure image size >= crop_size + RandCropByPosNegLabeld( + keys=("image", "label"), label_key="label", spatial_size=crop_size, num_samples=bs + ), + Rand3DElasticd( + keys=("image", "label"), + spatial_size=crop_size, + sigma_range=(10, 50), # 30 + magnitude_range=[600, 1200], # 1000 + prob=0.8, + rotate_range=(np.pi / 12, np.pi / 12, np.pi / 12), + shear_range=(np.pi / 18, np.pi / 18, np.pi / 18), + translate_range=(sz * 0.05 for sz in crop_size), + scale_range=(0.2, 0.2, 0.2), + mode=("bilinear", "nearest"), + padding_mode=("border", "zeros"), + ), + ] + ) + train_dataset = Dataset(train_images, transform=train_transform) # each dataset item is a list of windows + train_dataloader = torch.utils.data.DataLoader( # stack each dataset item into a single tensor + train_dataset, num_workers=4, batch_size=1, shuffle=True, collate_fn=list_data_collate + ) + first_sample = first(train_dataloader) + print(first_sample["image"].shape) + + # starting validation set loader + val_transform = Compose([AddChannelDict(keys="image")]) + val_dataset = Dataset(ImageLabelDataset(VAL_PATH, n_class=N_CLASSES), transform=val_transform) + val_dataloader = torch.utils.data.DataLoader(val_dataset, num_workers=1, batch_size=1) + print(val_dataset[0]["image"].shape) + print(f"training images: {len(train_dataloader)}, validation images: {len(val_dataloader)}") + + model = UNetPipe(spatial_dims=3, in_channels=1, out_channels=N_CLASSES, n_feat=n_feat) + model = flatten_sequential(model) + lossweight = torch.from_numpy(np.array([2.22, 1.31, 1.99, 1.13, 1.93, 1.93, 1.0, 1.0, 1.90, 1.98], np.float32)) + + if optimizer.lower() == "rmsprop": + optimizer = torch.optim.RMSprop(model.parameters(), lr=lr) # lr = 5e-4 + elif optimizer.lower() == "momentum": + optimizer = torch.optim.SGD(model.parameters(), lr=lr, momentum=0.9) # lr = 1e-4 for finetuning + else: + raise ValueError(f"Unknown optimizer type {optimizer}. (options are 'rmsprop' and 'momentum').") + + # config GPipe + x = first_sample["image"].float() + x = torch.autograd.Variable(x.cuda()) + partitions = torch.cuda.device_count() + print(f"partition: {partitions}, input: {x.size()}") + balance = balance_by_size(partitions, model, x) + model = GPipe(model, balance, chunks=4, checkpoint="always") + + # config loss functions + dice_loss_func = DiceLoss(softmax=True, reduction="none") + # use the same pipeline and loss in + # AnatomyNet: Deep learning for fast and fully automated whole‐volume segmentation of head and neck anatomy, + # Medical Physics, 2018. + focal_loss_func = FocalLoss(reduction="none") + + if pretrain: + print(f"loading from {pretrain}.") + pretrained_dict = torch.load(pretrain)["weight"] + model_dict = model.state_dict() + pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict} + model_dict.update(pretrained_dict) + model.load_state_dict(pretrained_dict) + + b_time = time.time() + best_val_loss = [0] * (N_CLASSES - 1) # foreground + best_ave = -1 + for epoch in range(ep): + model.train() + trainloss = 0 + for b_idx, data_dict in enumerate(train_dataloader): + x_train = data_dict["image"] + y_train = data_dict["label"] + flagvec = data_dict["with_complete_groundtruth"] + + x_train = torch.autograd.Variable(x_train.cuda()) + y_train = torch.autograd.Variable(y_train.cuda().float()) + optimizer.zero_grad() + o = model(x_train).to(0, non_blocking=True).float() + + loss = (dice_loss_func(o, y_train.to(o)) * flagvec.to(o) * lossweight.to(o)).mean() + loss += 0.5 * (focal_loss_func(o, y_train.to(o)) * flagvec.to(o) * lossweight.to(o)).mean() + loss.backward() + optimizer.step() + trainloss += loss.item() + + if b_idx % 20 == 0: + print(f"Train Epoch: {epoch} [{b_idx}/{len(train_dataloader)}] \tLoss: {loss.item()}") + print(f"epoch {epoch} TRAIN loss {trainloss / len(train_dataloader)}") + + if epoch % 10 == 0: + model.eval() + # check validation dice + val_loss = [0] * (N_CLASSES - 1) + n_val = [0] * (N_CLASSES - 1) + for data_dict in val_dataloader: + x_val = data_dict["image"] + y_val = data_dict["label"] + with torch.no_grad(): + x_val = torch.autograd.Variable(x_val.cuda()) + o = model(x_val).to(0, non_blocking=True) + loss = compute_meandice(o, y_val.to(o), mutually_exclusive=True, include_background=False) + val_loss = [l.item() + tl if l == l else tl for l, tl in zip(loss[0], val_loss)] + n_val = [n + 1 if l == l else n for l, n in zip(loss[0], n_val)] + val_loss = [l / n for l, n in zip(val_loss, n_val)] + print("validation scores %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f" % tuple(val_loss)) + for c in range(1, 10): + if best_val_loss[c - 1] < val_loss[c - 1]: + best_val_loss[c - 1] = val_loss[c - 1] + state = {"epoch": epoch, "weight": model.state_dict(), "score_" + str(c): best_val_loss[c - 1]} + torch.save(state, f"{model_name}" + str(c)) + print("best validation scores %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f" % tuple(best_val_loss)) + + print("total time", time.time() - b_time) + + +if __name__ == "__main__": + parser = ArgumentParser() + parser.add_argument("--n_feat", type=int, default=32, dest="n_feat") + parser.add_argument("--crop_size", type=str, default="-1,-1,-1", dest="crop_size") + parser.add_argument("--bs", type=int, default=1, dest="bs") # batch size + parser.add_argument("--ep", type=int, default=150, dest="ep") # number of epochs + parser.add_argument("--lr", type=float, default=5e-4, dest="lr") # learning rate + parser.add_argument("--optimizer", type=str, default="rmsprop", dest="optimizer") # type of optimizer + parser.add_argument("--pretrain", type=str, default=None, dest="pretrain") + args = parser.parse_args() + + input_dict = vars(args) + print(input_dict) + train(**input_dict) diff --git a/research/lamp-automated-model-parallelism/unet_pipe.py b/research/lamp-automated-model-parallelism/unet_pipe.py new file mode 100644 index 0000000000..d563de8257 --- /dev/null +++ b/research/lamp-automated-model-parallelism/unet_pipe.py @@ -0,0 +1,171 @@ +# Copyright 2020 MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from collections import OrderedDict +from typing import List + +import torch +from monai.networks.blocks import Convolution, UpSample +from monai.networks.layers.factories import Act, Conv, Norm +from torch import nn +from torchgpipe.skip import Namespace, pop, skippable, stash + + +@skippable(stash=["skip"], pop=[]) +class Stash(nn.Module): + def forward(self, input: torch.Tensor): + yield stash("skip", input) + return input # noqa using yield together with return + + +@skippable(stash=[], pop=["skip"]) +class PopCat(nn.Module): + def forward(self, input: torch.Tensor): + skip = yield pop("skip") + if skip is not None: + input = torch.cat([input, skip], dim=1) + return input + + +def flatten_sequential(module: nn.Sequential): + """ + Recursively make all the submodules sequential. + + Args: + module: a torch sequential model. + """ + if not isinstance(module, nn.Sequential): + raise TypeError("module must be a nn.Sequential instance.") + + def _flatten(module): + for name, child in module.named_children(): + if isinstance(child, nn.Sequential): + for sub_name, sub_child in _flatten(child): + yield f"{name}_{sub_name}", sub_child + else: + yield name, child + + return nn.Sequential(OrderedDict(_flatten(module))) + + +class DoubleConv(nn.Module): + def __init__( + self, + spatial_dims, + in_channels, + out_channels, + stride=2, + act_1=Act.LEAKYRELU, + norm_1=Norm.BATCH, + act_2=Act.LEAKYRELU, + norm_2=Norm.BATCH, + conv_only=True, + ): + """ + A sequence of Conv_1 + Norm_1 + Act_1 + Conv_2 (+ Norm_2 + Act_2). + + `norm_2` and `act_2` are ignored when `conv_only` is True. + `stride` is for `Conv_1`, typically stride=2 for 2x spatial downsampling. + + Args: + spatial_dims: number of the input spatial dimension. + in_channels: number of input channels. + out_channels: number of output channels. + stride: stride of the first conv., mainly used for 2x downsampling when stride=2. + act_1: activation type of the first convolution. + norm_1: normalization type of the first convolution. + act_2: activation type of the second convolution. + norm_2: normalization type of the second convolution. + conv_only: whether the second conv is convolution layer only. Default to True, + indicates that `act_2` and `norm_2` are not in use. + """ + super(DoubleConv, self).__init__() + self.conv = nn.Sequential( + Convolution(spatial_dims, in_channels, out_channels, strides=stride, act=act_1, norm=norm_1, bias=False,), + Convolution(spatial_dims, out_channels, out_channels, act=act_2, norm=norm_2, conv_only=conv_only), + ) + + def forward(self, x): + return self.conv(x) + + +class UNetPipe(nn.Sequential): + def __init__(self, spatial_dims: int, in_channels: int, out_channels: int, n_feat: int = 32, depth: int = 4): + """ + A UNet-like architecture for model parallelism. + + Args: + spatial_dims: number of input spatial dimensions, + 2 for (B, in_channels, H, W), 3 for (B, in_channels, H, W, D). + in_channels: number of input channels. + out_channels: number of output channels. + n_feat: number of features in the first convolution. + depth: number of downsampling stages. + """ + super(UNetPipe, self).__init__() + n_enc_filter: List[int] = [n_feat] + for i in range(1, depth + 1): + n_enc_filter.append(min(n_enc_filter[-1] * 2, 1024)) + namespaces = [Namespace() for _ in range(depth)] + + # construct the encoder + encoder_layers: List[nn.Module] = [] + init_conv = Convolution( + spatial_dims, in_channels, n_enc_filter[0], strides=2, act=Act.LEAKYRELU, norm=Norm.BATCH, bias=False, + ) + encoder_layers.append( + nn.Sequential(OrderedDict([("Conv", init_conv,), ("skip", Stash().isolate(namespaces[0]))])) + ) + for i in range(1, depth + 1): + down_conv = DoubleConv(spatial_dims, n_enc_filter[i - 1], n_enc_filter[i]) + if i == depth: + layer_dict = OrderedDict([("Down", down_conv)]) + else: + layer_dict = OrderedDict([("Down", down_conv), ("skip", Stash().isolate(namespaces[i]))]) + encoder_layers.append(nn.Sequential(layer_dict)) + encoder = nn.Sequential(*encoder_layers) + + # construct the decoder + decoder_layers: List[nn.Module] = [] + for i in reversed(range(1, depth + 1)): + in_ch, out_ch = n_enc_filter[i], n_enc_filter[i - 1] + layer_dict = OrderedDict( + [ + ("Up", UpSample(spatial_dims, in_ch, out_ch, 2, True)), + ("skip", PopCat().isolate(namespaces[i - 1])), + ("Conv1x1x1", Conv[Conv.CONV, spatial_dims](out_ch * 2, in_ch, kernel_size=1)), + ("Conv", DoubleConv(spatial_dims, in_ch, out_ch, stride=1, conv_only=True)), + ] + ) + decoder_layers.append(nn.Sequential(layer_dict)) + in_ch = min(n_enc_filter[0] // 2, 32) + layer_dict = OrderedDict( + [ + ("Up", UpSample(spatial_dims, n_feat, in_ch, 2, True)), + ("RELU", Act[Act.LEAKYRELU](inplace=False)), + ("out", Conv[Conv.CONV, spatial_dims](in_ch, out_channels, kernel_size=3, padding=1),), + ] + ) + decoder_layers.append(nn.Sequential(layer_dict)) + decoder = nn.Sequential(*decoder_layers) + + # making a sequential model + self.add_module("encoder", encoder) + self.add_module("decoder", decoder) + + for m in self.modules(): + if isinstance(m, Conv[Conv.CONV, spatial_dims]): + nn.init.kaiming_normal_(m.weight) + elif isinstance(m, Norm[Norm.BATCH, spatial_dims]): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + elif isinstance(m, Conv[Conv.CONVTRANS, spatial_dims]): + nn.init.kaiming_normal_(m.weight) diff --git a/setup.py b/setup.py index 83372856ea..5158fa1fb9 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( version=versioneer.get_version(), cmdclass=versioneer.get_cmdclass(), - packages=find_packages(exclude=("docs", "examples", "tests")), + packages=find_packages(exclude=("docs", "examples", "tests", "research")), zip_safe=False, package_data={"monai": ["py.typed"]}, )