From 704037ad511ea85afd3de3609434fc49cbf2f1d2 Mon Sep 17 00:00:00 2001 From: lukovnikov Date: Thu, 25 Apr 2019 15:59:39 +0200 Subject: [PATCH] - updated docs for new LR API - added some images for illustration - updated comments in optimization --- README.md | 31 +++++++++++++++++- docs/imgs/warmup_constant_schedule.png | Bin 0 -> 9978 bytes .../warmup_cosine_hard_restarts_schedule.png | Bin 0 -> 22350 bytes docs/imgs/warmup_cosine_schedule.png | Bin 0 -> 17335 bytes .../warmup_cosine_warm_restarts_schedule.png | Bin 0 -> 22315 bytes docs/imgs/warmup_linear_schedule.png | Bin 0 -> 16775 bytes pytorch_pretrained_bert/optimization.py | 29 +++++++++------- .../optimization_openai.py | 4 +-- tests/optimization_test.py | 15 ++++++++- 9 files changed, 64 insertions(+), 15 deletions(-) create mode 100644 docs/imgs/warmup_constant_schedule.png create mode 100644 docs/imgs/warmup_cosine_hard_restarts_schedule.png create mode 100644 docs/imgs/warmup_cosine_schedule.png create mode 100644 docs/imgs/warmup_cosine_warm_restarts_schedule.png create mode 100644 docs/imgs/warmup_linear_schedule.png diff --git a/README.md b/README.md index fde35d23ea..b348fde28c 100644 --- a/README.md +++ b/README.md @@ -984,7 +984,10 @@ The optimizer accepts the following arguments: - `warmup` : portion of `t_total` for the warmup, `-1` means no warmup. Default : `-1` - `t_total` : total number of training steps for the learning rate schedule, `-1` means constant learning rate. Default : `-1` -- `schedule` : schedule to use for the warmup (see above). Default : `'warmup_linear'` +- `schedule` : schedule to use for the warmup (see above). + Can be `'warmup_linear'`, `'warmup_constant'`, `'warmup_cosine'`, `'none'`, `None` or a `_LRSchedule` object (see below). + If `None` or `'none'`, learning rate is always kept constant. + Default : `'warmup_linear'` - `b1` : Adams b1. Default : `0.9` - `b2` : Adams b2. Default : `0.999` - `e` : Adams epsilon. Default : `1e-6` @@ -998,6 +1001,32 @@ The differences with `BertAdam` is that `OpenAIGPTAdam` compensate for bias as i `OpenAIGPTAdam` accepts the same arguments as `BertAdam`. +#### Learning Rate Schedules +The `.optimization` module also provides additional schedules in the form of schedule objects that inherit from `_LRSchedule`. +All `_LRSchedule` subclasses accept `warmup` and `t_total` arguments at construction. +When an `_LRSchedule` object is passed into `BertAdam` or `OpenAIAdam`, +the `warmup` and `t_total` arguments on the optimizer are ignored and the ones in the `_LRSchedule` object are used. +An overview of the implemented schedules: +- `ConstantLR`: always returns learning rate 1. +- `WarmupConstantSchedule`: Linearly increases learning rate from 0 to 1 over `warmup` fraction of training steps. + Keeps learning rate equal to 1. after warmup. + ![](docs/imgs/warmup_constant_schedule.png) +- `WarmupLinearSchedule`: Linearly increases learning rate from 0 to 1 over `warmup` fraction of training steps. + Linearly decreases learning rate from 1. to 0. over remaining `1 - warmup` steps. + ![](docs/imgs/warmup_linear_schedule.png) +- `WarmupCosineSchedule`: Linearly increases learning rate from 0 to 1 over `warmup` fraction of training steps. + Decreases learning rate from 1. to 0. over remaining `1 - warmup` steps following a cosine curve. + If `cycles` (default=0.5) is different from default, learning rate follows cosine function after warmup. + ![](docs/imgs/warmup_cosine_schedule.png) +- `WarmupCosineWithHardRestartsSchedule`: Linearly increases learning rate from 0 to 1 over `warmup` fraction of training steps. + If `cycles` (default=1.) is different from default, learning rate follows `cycles` times a cosine decaying learning rate (with hard restarts). + ![](docs/imgs/warmup_cosine_hard_restarts_schedule.png) +- `WarmupCosineWithWarmupRestartsSchedule`: All training progress is divided in `cycles` (default=1.) parts of equal length. + Every part follows a schedule with the first `warmup` fraction of the training steps linearly increasing from 0. to 1., + followed by a learning rate decreasing from 1. to 0. following a cosine curve. + Note that the total number of all warmup steps over all cycles together is equal to `warmup` * `cycles` + ![](docs/imgs/warmup_cosine_warm_restarts_schedule.png) + ## Examples | Sub-section | Description | diff --git a/docs/imgs/warmup_constant_schedule.png b/docs/imgs/warmup_constant_schedule.png new file mode 100644 index 0000000000000000000000000000000000000000..e2448e9f2c7999497d3e2d252a5dcb22b0ac7da5 GIT binary patch literal 9978 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 literal 0 HcmV?d00001 diff --git a/docs/imgs/warmup_cosine_hard_restarts_schedule.png b/docs/imgs/warmup_cosine_hard_restarts_schedule.png new file mode 100644 index 0000000000000000000000000000000000000000..be73605b9c080cdc7cea8b4ff7e29de90db2d9eb GIT binary patch literal 22350 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 Kqe`^<&Hn^X=;_f#+Y6r3uHT zKmSr(i1GgyKlZjC-*+Rb&rIgQ1JaX|6FTCsG-`b02?oST(9t+KIlo$#6Gn`M3}+-0 z)>OTJ&n7D;CoGDKSRzY8TVFrAvs2MLWbQkBS4dJ)615lKHZwERH9&~0F(n$%_2Q2oSv55j6BRZs%|Vy#4pS~(!l%1+iv$A$177Z6iQ6aa zNl&74L77<}MeR<%XkJl~yoLs`Rt?wFjH{E%*^b%)pUv1>&Pih#2Kf!{)kQAb6d`O>|>j{`Oc3%oqA7U@7)4} zxuN{~$r4^7Kl)NbK7Raoc0}>dQQ|X55u%%4nzNK;7_jlcGVnfpVm(t&z1*Mfn85j{ z0ykGRqkSM-0Sy(;s@i_Ay-@o6m##v3YpX1WUKQcPhY#z*+YEVb=V)YBSEq=dyT>Bg zXgjqK)y;9$Xd3bG$jC_BCyqaQo7$r&jRaEZu`W0`I+hx@h1)vcym>P=KHhQglp;$0 zYLtA3M?llpO27NXS4H{`PPLZ@CXIq+Is9dr{1ut}WpNc-9~aAI6^;1nu?0)B`AM@? zNScn+B`Up%9W(Ig$=Q0KIGY{YtW6&jqlZ(PEW;cMZ+SjE^y{o5>G%{;?;fSdXZy7o zOFe!}jV|RoY*}YSovz|Ccxv|KiP2K`%TwZ8yVI}ixE6|M@O!`N)4FN<=Y3)gtH-%< zlAwX^+C?I5}3sxyR9Xl(@8nl)P=?d4%#;}pU%pq|6MKQH2Tp*tGh-{&- zxrW{#=t`zHPT&z6;p)upy316HHd=Ycg{FEO#Zi(wu(ic!$%K3HB_$;^;$H4`G#dF= znwpvj(b0&*7K5GZC#+n>gQU@dqzAZp?{A*`nz;GtDrYFcZc_mP%U(~ciWH&Yr%|dd zqr17M)#YnOE1%xv_XWPgzeO=|&%&}&QqaI_gQtb1QN7`9(XYh6uXWJTkJ;YfZAr`e z63?*}(-g~iE~Wj9fWzqQLk=T9KmTApg1hGBujx8U5*B4&WtNMmw{PFliHcH2ka0Q; zb@lhR`(s?jYc*9G-p7Z^?mR^lh*LMBex9DzeZdf=t(oRl%`ff|4np#@(*)b9q3^UaK zobJykn3=J>_Sg`n5_i8sDQMfun&CM=ihMDV?u>!E6KU>2{ zlKHI?!O@NnyboGvjR)V|gN(9K;caMb&GCF=GA!fo$@0Nq#u<8{R>c0a2SJSZUUGK- zd|QONfkDiJ0U2&8xiWoW7ZeGQ`h36Tm?AEaPnKbh<5SvWpT?J zh%J4X<>lVn>U5ZvX10HQs(K|=RBigJ-?yXZ3H+btl)OYOA4OVh@GL0H-Rjrm+drsn z&iGo-`Q zw9Q&nyXaqNm#1=Ex3Z{Y4cq;7-Nr)ZY2B%poQbHl;2|etd?*jo=p~uYFItI=ycMx_ zWUNC8NaSEef_8z8Mk4}xb#5>F#%a-mfE&EZm<=tDxa6dhC5fBe&zd**9zDyc$4lC^ zsd{VIwlr=Pqf&+^ccgXY=cCVF@?1nFdE?~R$fEl#p*%iJ!H4uis!f@>NVI!}V#C5| zRo{FkzsYwp8;hk1w2sYHUCB{)XfYiyBT*Zk^y?|#lihw%kFo5`S(Rrc1tHsPc@d`o zuQA^$1N%>+k!&(8am#7khX+QQZ*iWj-(!MJ*H|fIg}KjJZq8;eFuvK-77?b{rz49X zytWe6dE4$S0fBSEg!KhB3Q>D~^G3JFm$_DS?N!VhU)BilRir-qP=(eJPD!=<@+Pl* z@Ue+zAkG~kw#aZbqvY|VI}G3{>fAi^Of^wiugKPgb3+u-#RM7qVcX)RI)N*OcCwc| z7#VN$s!u5e2Pi8PXF-UC*cYOe`sL-|I=y_(>fyM3x~Bi>N+tyl62$>S$lslG321kwtv z+sC@i7PZIYTOp_A_N3a^oanw-VN5b~GDWq^T{5)RM77Iby8WwTS|5z^+Zv2wn^{wR zF=P3`1=MTR7#9b=KaYt^v1Eq#m^sLzBT$C44!YxCHx!A#XpWM!!J-NgYtKGaO>ZA| z-sX;s!fC8pxefo^e({}FDaC_>71`_%C9>>X3!}DS1y1r6%E0Xbzkd7>cPWTZf!0f< z^b)SFkz~GgtZ;~=x!n|T+S7sepWLg;vy+lDxddlWvY^b5I=*@JjxH$+K6Yy>y;L#} z6PA>OgSj^~Y&*-l%^B-4)riGU$v$ecw{_(Nh4PorPI}RMRlW*|GOfyRrh^Um7Bt;R zR9^DWYd$1dolq8E#d~lpLfjfA;}3`4mctDR>gd`;)x{7fu7cYmc6SFXKN$wL6O_s4 zrBmbY@=E65-VX^jT>VOj@}{`g$!^!&phWR3>l0daP85%mZpr5o%+Hst zP^cye2jwsVc}qQ>ckP!L1zJO}5$DCzg^kv?Sdx^~TjhtD=e9|=WAx`oRO*H2Z__7J z*wLC@}{DcTn0MPZyO9>+Egc$*VQ(e8@{Ffuk>&InDdfTIlgWVA|bXAzi(Y_?&w@4{fGa zWii~0#=ojTFiKf^VnI@7mAfk|%ja4eC2Ei0!`B>McL~us^x^{sm+rY5eOEj2ag>Jx zcQ8sfV^>KOn74Q)?!Yy&;N(WaQDN2K(8hrH`#XZmZIN^IS4pm+Zg{+fx&$EVwlesS zYGS?fhbkJ?B1z0@%}7S>FY1c*9Car!QvTZNAK>eI_1%;CFujBR7x&AFA#CY|qp=-|}dn)3NWFD}s;@5xDcSJ7! zD3U-g#TwnGy~WGa+5y|TR63511b9=#-gHa+lc=fSr0yJJ<*>``>qME!>2IW*csvMT zUta&sT&#|cG!?Jkx1Ola9Sjn*i;7bHwuj)LVz+HtsQ{M0`Yyb-BlxW4XOZaw*^cPCD)v!4P(C#k; zq~Lyg!$=&)qr4DeL?H>mA%+VZtI-Lu<60^G>rdlc_|A5phDG7Pb z;^Ly+ZSbxD(tj*9`T5;*l6Upx1ix6=&wj5nA$k0{qHLX68Fpu}b-N(>pMxK@G`Z}r zKHCsz-+1Peg-H-OWC&pul1NMxch`{8WtNBD>6zHWjVaoFvblzj+zh;vw4w%S?bBBr zo|bdUuQ$Bun09oh;&?CjxodUwM{X>Gm+W<#tNBg6M3&&vDv=4Hp({TST>g(sc?>?S zVE9$&m1lQrjzBfK&A*fgOqKV==~ZE8wO+`2GlePns``kflXZN!Trx3vf4gEx|RA1Bl+mNM6b^#q1I+~XfxYI*YsEblaBTpDf;8JZnqM-4Wf~4aB||UeJ^aO zb=y(X(Ft8yS)tjjw4K67%}**;cnR1i)?~@bLT(X zk^DpPe3OY84O>68ir6<5audPN`Nf>_sLzl}v}F z;{r&jiq9D+(+oroNQXsQeO)*q)b$h$?rl;ozTxiuyBXL_M z)r}x0&N+}lKyrm+&ru(2c=7qu{aKxU6-6n?AS`?>p5@-ER=w-CamU)?qN#E+4;n8o z@4@dL?(LQAm}z?hK=L}(4oi<^RY#6z8=s&W=dsnXe$RQO$_i#B+=-355*+!KCz(Tl z3L@w6p~yPdP-f{=WFKpH>7lGJbdQr6c})S?&AcYASXVT{%4App8|WKLk6xyyr;k-+ z5_iA2>+Th!-?C|GXV;ON;T;ZGd}?n7n}9$;Ss6DxJls}y`QL41U6bK$P0b;j{d*%< zH2D|Q)Tvt;W@mCcghi8(Yr-eDzMf`jX$gy<;qdn*oS^x4EqC%=il#+{d_IvuSyhP+?%Y*mHddyl z@Xwc#Dfu18w3x_mZ0^lp-#sE_zS5c)Pde)G@dDcP&E9)BEi&2V$;2HV_z*pqjQuyq z@1_dcwZCA#3xo#kzxt?-U_44SH8tPlt%_}(eno5O=7#-UjER^*KNx>x{B}ru5 z`jJOR?jLl^aUhHpRaDyh(?y9$NG_tTv$F^2OrEapw?&XYJJ>Q>pRW7damGZ9{d;F; zdq9CU6CxdU2Q35OB4hFoz5Mx*|9_v_5BdVf3w|0RVH=V3Qpin97FuP^@s|BaL!h3gqb#fx2YDuK* zk-$pvIs0d<#|&pBl~`RwX9x2^Ppw^vh5euh&CJqW7rGw>b>S05F>?q2gYC{yERL%M za-Mm`B-zlqn4A2kO1bAwnM#d6I{rFp+kQMl8v;R^PE8!wvBvkP^shAM^R)bCC{|9% zh0!+I44OJTS`i@~7Ma`HBD_ifM=_DzY|=BuY{ig}T38E0zf0*D-;D5eP4)eAlZ!mP z_wZ#>2mHmCEw{$~_ zvaMBB>jiu&mO!p()}CKpueHOHB>H4ZVyG0fdd(PLbOs^Lbqtsoz7xS;80{b#bj2~g zrNq!09iVY_BnDAjs?mQ8WP6VgUF=}mD6K$%ZpUxVb-UgOs&D9qKOL4(u~n0~+sgxn zVjM`b(KbNrh>7V&1TB2JO4^j76c##(hU9td%!q|92dhim-;IA}#I)RHX&TTrV{Cl1 zu^t<`LIYjOO#hPm$#okn?;ZOWkYlqX%s!6VZy9q+^c1wdcI02-o1mIt!NYEb&XmXQ3Trk! zg9HD68Ko~h-=djulh#j`qq)hTALyT?G8yQBhAcnLu9b;ci#`ZrOj@(wEl$;AYrn|I z@9Lz7ZiY(`q|ET#_6^WykC3IfM5S!4rkadVjf^Irlrh7^e2b;SJ2V)!b(EOir;2XD z5mmhY(Af4$%hT;0g~985c{l=sn1T7y?Ks8gt>x2T=s~wffk|-PU2Ioco8VcSIxWF& zELs|jBW(Xm$)L)FbpeX_sQX9a303VZ2&_>7&0i4;9SVkU-WF~HKnJP)w}Vuo3CqZj&Oj^5ZVkt+>cbW=%6UeN1S@g#9<+hm-TG#7|)B8N=!y}(fU88 zxvT12D37#%@)39$VuBd?+fB%6V_pOD%3w*`WUWid^U=52>)PF|$?;c$VK2txUkQus z6lE8gkVW({nJaga(%5-)t*?@h`rddZ1zl<=CcRG%ZUn2m$#$y+IN!oft&+9)!?5`p z0r0_~FFWtw?A}asY@ajw(q=NjaN1t92K&D z_nw%bcyt#X(G)+lI8aPYnSwG)`vST9HI44tVyI~InYb9?JtzN8H>wb=&~AyW_2Lto zd5AJNj`qKf`&A(;d+g!-CUQiRqr=P`XDL<&&GSd}Ib}uoH>fj% z^}6YEWMy5>+Yb8dMY27EytbfMWCxwhuI>(z5I78itS>`(*`=bO!GhS^f>!xt$COzm zNsu1gWh{sv>vx<9T1Wyh(Ewe?KMDMK#0Yg;B{QC@tviP|zt3A_6@mwvgZ@6??G^Da zzZ$@%>3a!ca%GL@s<7~HFf*)T{3mN;2tD{7DrepkYT4CO zkzo9}jA~M(ONZzmbu7XJK*e#Da)AHs5G@0dxjYL)mS4x+co)OISNx$-Q9&B{vH&3P zsYRRyYf=SlfVE%UURhtSUGvgVZ7VN4s8PFwa`l!^i-*jydS{8VW$?c7)|l#G39BO} zV1AijxwlO|UrTi;n$47?X|I)}YKHo_A>eoerZl$=rAN=f!SAJ>?E-^SoLrUk=086N zdF`gfpwLhKxpj7ShOnJ`YHTm}KdG+TwqzP(U9k7bqG;jsM&e~9G5GyyiLw3#2d&=r zceM9fWwKl7lfs|rkND4cx#8dcxHmuZ_c!;t$RoV?wjb;E(4t=4qG{HDCFXXsJ%%=> z+-gLmo0x>8)P7Fd^vRRmyoRTPEF1>)RQK-P^Q!nlxxKhOe3Yo7?6F3f{6XNvy)2Z!M&Q>vebemkYeS(mu0Y;e7jm>w{5iejzAj#@;9H4%x!nSi!j%_{h<}G};KLLS z3me-{mf`1sWA4bB$DggKNF9!L;K-@P16@9U(bjjvNJ&YF-p33;Q&(57J7u$Ng3Prr zM~rIRxiwEuRz?KW!ri4Ov>HbNUA$F#6XBfIq)6EikzqY^_;kfbST}r*!l0vh-%@hv zmx~h6i9s^*9#ULMjLgg!V`F1e-DPEEyw0mb`oCld(HEDN=*7fNUhn0rU7y|DocT5P zRN_m4Y*Z6gRKtbK?N5QqBO34xBiL=@US^r?3?DmK8N1_Z8VRKPRdOrc?H~O+ihbiD z=7Oh}MTL<^bPp2`tV>8q31hySXxJQxt$6QV+tKctx|UWj%oNd3iCmAvLqoAT*59ye z7quqbxX)uf%5xPLvlgt~+0)aKarP%ye>2|w;~4q}Q4536v$0P)*WVJeDgcwU#RM4} zm!K`Oh&~5uY`dgm&$Evou#fxKN;hk1*toBeMGntzCny55{7ey|bBYkmty}BLySlbk zYB|iNsjbZjZI!6YhAi|is5c)z;2Lk2esq`XlRZlVYunqAqiS^m7j=a^zzyS$t^Q~znF{Th1kw!M9!u2J}*5}(smQtaa}+}yWH&- zdR1B3y7}USx%@i=u9g~n;Z~1Im)?3Mep~&aaxzn@f&9U}KM|6^MbSZ@la^9T{%5*DF%-B9p2@pPe$}Q!%y4$;gng6 zC^c4#6XxSe_kuP%?BP)3CX5Nds(}TpH9u68eLQG;wa^~<+$3Gdz6e;JDDDwkzEw-& zB#yQ4LqB*Fg~P9F!3hqX5=40Dsum0QWI!{ev8Hi66#ZfZcutvuIIw~HuJdytNC}%z zOF!c{t?(I8YKWM)UZ+`xjJRt4`fEEihmdIkX88~NTW3c$*HDIIy+W)CfTga%d0Vbf zXw)p3VgRruI_4fSmP86@HQpW&t}YGkAD{nya^gMWhC6a#JaYFI9a&kEllIm8y(X!7XKj%S`t)?{-ZIjDZ`b!g|XsB|b ztd`9)Q9DRY5`!#qz9y$@{__en<`RS4qSyc;qV(ciXXm<&{50krJD>?1oA zg%F19&^`52t0vk-td+W+@^{%wKGtDK1PY^Y&%fliLBLZPS_ zN2(99sw(gR#Ws`Y77)&}cR-fhur zdU}a}wh{-%xjztzSoze6lww>t+D2v=G0ugU$N>hn&WSK};(^!@v?Z7-&PjtOF z+!sUO_a%iOqdo$Sb8!hC9iZC)a;wr^P3FBT-y27r8|YEMDI&d1vZQX$0HZ8T5=N- z_@V^{Fv5ar46EcDL+#Y-=dLXB(ED>XA%Jr_ey*z-C$8ZLoXnESYX2GrGzaoXfJKG7 zmo#|IV$>Gmpj%e?cb~g@_rI1Ae)wvlPtnVY8)kpjM+36GRGH_l%!l?VmCzGX35me$AD;h%8LjFsRye$Khqw7_u1Yd zL{BTQZQ3guyThI;LN(#!Z%v|%Qs zMvFv?n+AGehI7MI6QWu8-w6d#t*~1rfs)SL;SpL@_%B^ZAVMc26I&v3=QcnT)g<~ z@9F*maHdnMVmrOJ2*YHjXzssr{l5OnfP6&_UL0k2jZ8Jt0ZFNg@(DMwX{bn}o$s>D zE?N=HB9uP#*a$Y$n+V?Dd)%Bhd}+J!FIDSbQ-jvFS7b=*#5W77sKy7@)3w)nlDIow z@ms|vCI&mNeK!Jf_BscLtdo;d%+c}wX2*S1@gM-9()pV6zba?s<>fJPaBv8Tp8cY! zu6A6WZy}I$s!i%yy7=1*^P&{tR+C>3$~PxpW|ng~hLMP9mjDDR&|?@jjbefRrF1`y zMzmjZ0XSP^EJNTCu@zD$clF&~+sVM3tA&#g;PfwyW}qG6}9XOdS1>^KA)MD6vNC6*y#{nWCwb9$W-tm zxs_3cz7<*2*8||v_dM`J-g~8AWsX~Zwj@wgV3efHovh3PA}$askxq5rI#(+V7I=NC ztZcCsV7z`k@6qA^z@^*OV`dCk1P)j@)e2t4b=kUynM8np6iF}AKGrEU#sDhR9_%36jflHgU%Ora{`&fj8%E>%Qx@(NNVJhDJg(VI|^1r z)a$<%Enqt}_uYE7pwXwa2o~I8RZ3>Hnu;t)D=bD6s7Us(& z+jm?{Yyd&*t5@N>Ya=Et!FboNUq_DQ-)%x+836 zcjc_C*!6u*oyGP>O|S?EI$pACZ><&-X91`OjbK2A!REV~=jGRup-RG>PT%R3&B4J8 zi^+HiAp%lmoxT7{h4KCr0L(@XV z0mr;7dhL|_LGk!hg6~txR!43-Qh3gvcxV%N$CBkV8V`sd*E<(s#(%FEbPvFR!DN?W zFeIp1p~-4j*4L{1*<)&?!YQ%#C@2)qN=kAAH%nfB7?Tp~z#;&;7ar(z5uX#KLp=}V z9&}UP*5z{s+7u;_em(k!-+ZdCo7fBFk$fA2)z&*_seF~VlbN$KyGn_2gc?DzMGhaW zB_9WoO9}_U=A&!HDD@pw+U~)LzNEuK^ir>j7Pm|vG8Wlo9Ny7<%02Au8%tz@K#1S0uwz$H|c0eA4gD7l^Bubr6~I1VJ4h*NUQ zXAoo{fjOvogK0oMghC-n&{6jKH-$iBX=RxA@6iwsOc^22EvSGMW}&5~3(s7;m=L{& zABb)ccU!z^Er53TvTxKUlkAv#6(l=D+57gEwRQXU?OTMhnC_z7I$09)I5v7NO*GQ0 zE^A0;ew}uu%@l03f*;n#5E+Kkn4E{Ib^6Q0SCL|0l1FxlYiRzq_U7D1GsQaBr+u3C z-~&1v3!Zm)cv6;nSenx}S$!@tQ1l`+BkZiF|QK^GK5F~bBbZufzsWN1TD5G*I{qX05$OT;+KLN(p#f% z4eJPLMGUJ(JDz*3ZQs|Y?UikK2xtK#JgcrKoOljZ?oMe_G&(PDFRgKD=bZuKsYyeC z8YKAFa=h>B&IG3)4x@aR2N%+*@SqAF?`U^#H7eqPLI4e=Dd;lWnd44Xtr-FXcVt!w z+Kn(v6kVr6G?2~7RFsi7o;5*%e&VmVXp~H-(Qr5;!(4)W`)EszDR`$Fbkqa4FKfHa z0VM$K6}A+ied#;W5boi*&Kwac_96wDRBX{5=h2knizt|E^9T!EjbHHRVdlCDA|z$P zut}XX(tJ~!SyhU_ z3=!!oyPh?HK%tfX9iJhl6*zBcNbFIYg0MC$!^5Hx^e?(RG_+oZi_~O3mQI<9IFQ_I zf~57Nn*~vrl+L>^CJJQbPfglj-uKD5a)b9=AO(#suK=6x+GUbzA!stInp}6^_E|K+ zlr6KmC9+)dYK&WUGtvqJ|3MEx|D@Z@bK)i4YfwrF+~22>&DRNx)Af1Viat)#mP{9z zpP&++JlSPvy-J&(1wz=o6QDbuk5i2?GEkTqd4=}Qq%s!$h- z;#TlaCMF35kz?$gR+Z3Xy|MGP;Cv;XRE(Ew+hZdFhG#G|fr(e3CPO<1nVCfb*M=`4<88qLpwv$Gv@EqzuwK*|7{0|2m-BqHgnD<)MEo zQ4Y-^{4UZ$!Pw^?&HOG&oMIrT5h0pPnskn5P6V$ig3$KvNFp=pDh-!F`u z-iixTQRg?0=ArUVg@+P4uYv1iKo@x)bKVJLmvbToQ%H!2+=yv|u0T&63j=ACVHx)I ze7lyEaF#SKyY`>qEFeMrI%(9NnI%HS_TJG`pw}QwJ&uj(=_&8cNm|D8vrw!pV^s!q zNfT*BFSEaGx@jZjjS5^%gYhQ+>{d8MheO&kj~lo|1aYB`t=|Em7OOqIsCXsf4<~5Z zGTGNIuW{R+el66e5005XWvW0Q9X#OWep zL+xGegjq_zmO%EKZeLJIg1Yni`=?US$^N51JR4tTHpV5`kuy$~ln*>aQXVt{SUcJu z1>;t@5Cg|)+Zt3VvXRZryz2mk93VLddI_8xEFBmo4tgcoy%wd26fjIL{RM|MYx~>sBmC2IV?eScc;5$|=VRLLG~}>z2XbhRG7> z^yND(M=%{~pE-|LZ{Z(k+Svl!BvbG)BX8~Tg&!cJ;~J@$2ewdqbzEIzBpfuQS4Ju_ z+bsSi%&h5qjx!qH#^b}Bb)k;v+DcF-ot-R(JN?bClj@gBh_234DYGxvDFVL`s39Ld_ojas9_zoT4;Xq+VzRF%`alR85BkdaKO0 zMR?5RHrI=+9GN1X;QfNRs@l|K7?5aG4c{CafaacKWB!D;x5%TM6WDGrwyTR41$t{q zW{+!K%+Lg!1G>ZCOFCs{c;CK#E3ust=}i?R2nq@cjgH<>|GP4ftpi-F_wmGx@j#Z` zXoU@B{eIo%+}2!6GR!hiv(Un|`~2PaF#+=bs)VPI_x|UZIloIZjUZK;U0$XTw@HoG zLx%nbD=0{oE9cEYsO?=QV)|BXKSBcx7;LOozzBP&{FU0kX!P%Pd_d1G;9eQ*l%j?o z$EoTf1pf;98q#7kYvKeRvJ=f0+>VW*f(r@g$DKs$>M^Wq=>y33`LhBOrs8D zM>h9A4_ZK(1I)GO?yz?BN9Z>hcz6giJbz=uEe@@MHe?_KQk{#aNO?v+3Ow(>$1@9u z%Nd&w^nluDdx_K6*SEF5-*9^ANUdPNf9OLUIJ@E0iz~f%a45g}WB@XY`qh;gLj~OT$xDp`k1k+cnr7~fKVWf8 zIJ}XwrKLE_nbdrj#ZPu!|5m<8S=8FoQJK-pEb-XY)z#3U$yNT2jKp1BT%6pxr4U2Y z_QmIH=bu|KtHT9oD7eG(^`}#3XQ#cj_Vp`@s;UYqDk{Y!(&k5hT(9Yha6$++T@0fz z4?*(J&}OSKQM2ZrQI?=d8McLmpw!4@*sCJY;SUEMRTL={5bZwRq#Tbd!S>A@ydaZ{ zk!SU}plVTrw|0rxwFhobFh4HN*?MsoriC#7q9cu%e}Qd*7&yIzv7w~kij2StL^g#Fq8;gu?=e*34W{JVBH=C4p4{NKfexkljXVt!tSpM(YI-ZgWqqim-*8* zT9jr^nSx}}A3vUy+Khet-gn#LKCMS1GQMM$0ZT_C0%!m|$WrmNC{b7?W2jWR+bB?F zPZ7+#!X#k{tRo~Qz7Qt+En85ncw~QN?lT()$9m#!OY{2v#7`%Yz>tuclK!aL-`(t; zy}jpbKxlY)O&RylB{&Ul9$`!v-`$%1D*zCJXiSt0I2?HQ_gsXoPwz_ZtyPR_z37C5 zE2ie=F6>{Rm4q8yb_Xd#LqjyXE}PT8@@Oe3Bj8q#t+O%<2|ksO{h-%{y<=RsG4@#; ztPF1(m>yUjH{izE-9(P2Kx~qK^?%vWyY(b;UPS#%P!)Ym!NC0|b8j;5#fHD9o27n?(_-r!Vn3UQUKSk{*a}%u5KHoVKYx>;?G}9?9%@} z1&Z|QG=2E+TI;+ObcIs~ z-qHt?FRz>Ynw$`AH0)CbCO}Zep?y<(F=7Cnv-u^dqPq-nhCg~!VwHrCMhCb4`Ng*X zyzcSB+nb1o%EHA;8Ts?a4HdgWB7MFL13_CL(!l-SODkjjEGm3hhFMx#3KMU|J9nBg zWkP@!oeBVwM>$Q12p$r2ojO(a^jvyXUkjr_!S}^`?^a-7U}Hzer5Lf_SZr);HN!X9 z*;|0W!=TKaksAbdnNoBXOYeiA?J`3g7EpsO3EQKei@Up(#7_SVV&UTlS5^wP zM^i_@+`8jA@O?<{T`=6-({uTjdB3cblvJe`pMZcdkPd43n((gk(G(jxa?GQGuhbmk4NDk=+z(T?UN#MdJ9w#9qBf|KZ^w zB*l=VByzAw2}~I6HA&= z+#EvdeLYRwLkp&!BtO1naLXzvTrMmuj23|qAc6G)*VnD*K(*Wa;bB=IsD!b|BIF3s zrC_7d4h|oAtiE#~-<5v;yyDHUWe~Z(Ytuu6h>fq?3mrl9GQn8c3Nd8*5IqXQF?Al6 z78ZnXbt=&OwVV9G-h^EcXj_fGycTcHxtm1gJng>5+4SX$>gdNO5wRH=+#LF~IzXwA z<6;J6_k&b12-K(atgH&1U0p;k;^TutXxuxm8HBn21i~ntkcx_9eY8{tcs-)C?HC^{ zpl6z)dQdyNu1~dq3NgswbXB`Kk@FEcs=2~uqQ+)3VqtP}lEZ?JVy=rd;|k~ygWy6Z z7C1)p=goRi!@fW)3vAXcTI zmSuP!IM zn3rB$d@7FcH#kv}f%n5?0h{rAl@rzi^c)<@u4{#rR8P{=)BQn1E^#mm{4siFNr@VY zj!N`-ulh2enG2}7lf#`;aUbpnTuFp+nua zwdLwHbF5q_8ny)5Xp56doih(P*4Ugd9 zkH?xhBUTcLbm z=ne{BLqo&Lnh{!;bd`~Xb0FnVohC^cFo`5&2j8^zS9NwZIRio0cQV$aUa-Eo(@E^z9zi%h=e-jSo&UeOn`G9!>aAcYAH z1tyn~l0y4l^f&^7O=NXyV_!U`Zfy*12uPeAn4Hs^aJl;T@82b!hYl9yx+hy9l1@Vl zrTe&E&(iEZ#iV*AVv<8UElT!JRbN=m&@bM678IuU1xcL9rRW*Y9Xu!l)JsN2Mj*4d zu(n>;`g^oMLq_&}VL7X`l*p_s1+1w9e)Pv(Tth>H?xhm_OQmPCjcADOB33Eqs|BCf zo-Lc07!{*J^tu*uLEz)Zo2b17oY};N&6eh7wfpx6O=il=%f-6XGk&8`7fz7>7ho@7 zl-qmz@&}#L3lL^Z@=+8)p!=9zmi#LWcezneP{JWi3La6u8CgU7v+nh_DFmB-iueD; z59wD(r`RE7H(%y9gxeCMm39U(bJRdpLl&Ki_HcIQ?|&`6CbW^CpO0wufq$iTe!e-4 z2kx7Ykl=U7;M4(hy2Rr0G9x$lm+fR8qYK_!e=A)&ioybnt~NFl7!PInV_~wBrc(_y z6^2qf4f))@S*1m|I@Bgbo*ADSLB~~N_KZYoLT=Tt(Kmo=bzW1K{kq7(qyssZb`ty2 z`@K^sy4ky-Vlu>v^$LUuUfpMWLDHEnyEn53LaX(-+OL|}R;F%?6?c1op86OPa_PZd zM4SJvyZDnIKYxaCl3lK0p(+`+Z0qkIs`P_v<@xDv)*C{;bRVv+hKox`yni43s*lA{ zh-y=xnfcNRyVghgj!l!u)kEYuhxTp0t+)hNgPdBC9<^cQMv8|v+ryC-+uCe3Je$X;{3J{{K~4( z;Lj_iI#7SmAb`TCc zke-2oOyZN_-kqIW(1dlF`olXN7S!{@44;6LY=8%o)6?_6e-p!PbDEe-W7cG;eex-p z>#8!Jr=~r;R9WIt65Pv8hQ9VfxX}xZJ7T{N#U7|oh0!(^b4y^;2NFtS(Fc06OQI!; YDl*B~b1cJuvVpoIry^S{z5bGLrzCwRYwIIV@DS~dm|_-Jx5zh8%Iks{rApB z_6}w?*6*1=GJIsBeQ)aMXv;-U|Gy7>w6Qm#=kVn&hk|+!B`)+?(KYR8#lITsg~|8B;Y z=!BvI3OswfqO!8^y*<-a@K6}7%#@VjuW}4ijf!D7N5( z_my8V`OTG!F{UKZrhtH$2)Di(SBkj;Bx$Z(sF8ieYA)?EU&2<9ux#CEG%3j z@b6i%{I$DT#QiZh;M;>Y}g0+`q#A+RzN{C^*X=X(bRYOR*) zY4~iElrWT(l&=12X=*Mvb_x5TtIRR%KJ>(?;Mh9;{Jm2|HrNyLUWVe=ebc**?QnHE z4Savo;IeLeOp3I;)?dD*+F^yYk;-&w@Mrb~=^c24<6QY92zso_mXZc8BE;iw)HSbg zA6E#>X1hZeh_HU$Hs{O^?l2Jd_T{~|`~Wuf_TfS2lGVq@$K1kVXkuc(kV%gL`=iGf zYwHt?OcyZG*879fFEMH?%inZl{+!vUto}MIn144r<>zhH8e(xMsVIrUBL5!2E+o_( z`lc;W%-U`nqZ0nYnVftfwz0k)$#OR=sc14O2li2i5;R zsi14hm3*Hu{s!UiD*;uQ+{xawQxs^_*{Sr~$QN;nbG9W#F=gEd(p&NJ>PjOg;SNXR z90MMBGGN<`OckMA27ctJ_&0dkQu%{mQ5Ev))ho@Ksl>#@Am!4&r6s)BA%BtFrXyA# zP1e@$+LfY}i82H6mqXV`5+&wl$A{e`E{?5+7N!whgJ-Ss&iPn1+Y31L1oZDK^Foa@ z6x8ZjK-0#x8PfV7%&1mG8CDY}sObUy7ERzdJW`wGB2&3+!e|;*ucoQOIMM%?Gdh%k?Fj zj;Cec zOFTxKF`IFOb1W3h;@)%*lGm~zUEjlLUv&s2db3qS-x8c`an0cIq*u@{%updi8OcS3 z6!4_hz@G?qpj8vUk^cIen}8>s02_6G#8*rwqp6&rFpTDod>dVd)Wm_ZFli#T=9Y&l ztg)Vt$4*ki-QSJ%LWbDiNVReQ6%@+#o3=dcSF)u_Kdznf>ndq(`s=$*S*l5nX>|$> zFFM*d^RVJB4jN#STh=L2t`UsxJK@y6Vs%RoQsp8ms;dv5Z4SKH`&CEdusd$_GwZXf zo7>xW@4Cy>Y6r*1cY09xUyT}2GDh!D7uK53QlEgp(#hkjzuag? ztJ(OS&+ER*^-Mp3R;~LhG%Or4vX$&d&acI8<%`KfwH7xUrxg_Ii=XFPyH#Y>`$`CK zJTEo43d6>NpkFs~pKtxH4-dB@8+-1yPLd)&aWz4NmBzT3`7M@#zkHpN2?+?2?1eSn zK5zP)U23`r9$lTqJU%=beXp(}YMC0hU+WgaXECqmVTa>)8L+s2K0i>OI~m{cqbp7u zrHAfZksG;8Rlks3vrWU_5|o^L+#+na6Z^dI36I^{5KKDJ)2rJbo>r$lEd-4sCLy7} zKLYRYujO>X7oMvbg)6`POplYMkv9dI%qDL@f)ElGX0%!5fkDFl`CIcmD*p~Ug4{a2 zAq1SkB-S6i(=hezC%Yw#*mw3WY!^OU!^Iyi^l*b|@e{`gbn&kcF zwz>Lo{)tBe0(p^knZHC3{V`F#)$$clpIT+2Y@Y$Y)CHa~W)Hg|`+ z?W#Sw>e%15f80t`K1);@lG3gYdz>mM<^PJRY$~_XC3QydgqM%~>SvKs_};J3Oyf6O z^z03v3+2v6)_FE|$^L+7Wk~lKZs`N4qL8a-j%mgB12{})Ky)pe%%d&;X}#S!dzLz|(Pq8dYj6ZtgL&XWBISrRz*Ktw zwNcqpA~eew@{yZ+c_5A-$=we9lj-iM2pBLL|H6>P8ev|)u4TS}6>9{pUr5Hf zwj-k1q+#WB|3rjL;pI->5_i^g(Sq$C7QyGXsg!}9)D$18JgXrVJOEDg2H{YUh=j|gM+fk4D<@jl=82bwY!&HNsF>F1G z?e5{g10y&@P$TsP=f7i))2O0nk@Z$Wsm*TE9>^Zd`(uIJEA8Z?G}H@chu{p5=$!yN5rKrZd#-(wu#JeI3y%@{47h{-_ax zpl*K_a=0>i#3>gU3+v%JKb>UcFr9sL{lk)rMKPSfuBS9yVy+gQ^d^a4Q_dVo$U;X2 zvW5-LmxaG{w?dSLXn#2h)VIQyo*UV--Q_F2a_3;;;S!5RqK*#@x(~P*+S2}EJ6FwK z8tj2-8JpokT=pFx0nN`2Hzt~6T8wmRoK096<6PH<7>xQ|%F=06N?Zx3$TjXJKd#DM*Uw!*?FX@(ykw!EgnzU@Qn z-NvLh$h@&is$IN@_0>;#_-rKptkGbDX*kw0-|n9de~BKO&pa~$>FsR$wM}a-CYe2D zq3XV>z+*A4Uv$2P{ELe&Dcrhq!3|b(40@E)LCGGjEcvdWkbRyzvzoL|)U>OCeoc8h ziR&jtMvfDx`I}IvC!5_^QJ47^!4!S*b>TYog8i*{K|X! zh-WkK$>m(K6sPT$ofBVB^~c|1Ug7H|1W!$Z#s&?V{7p?md(Bs;k^6ztxf?zn4z7;d z)+OfoqAIGO8t?T;9WC|SeDGf{nWs+Mb6Kr$SN^g;Hg^0}RKm)%-J|8%!LI@)5)AVl z%y*>9|2dq0^SH!hc4pNP`7Ey}C$Rd|CXtS-`$Mu6Ip*w2C*KS`zG%A0x=Ki0)X6=o1Os0ohSl!x;k?;R_`Q*(XIUu=rZ@>k ze5b3AlIDo}E;3_1dz*U;+e^<5(~9dw=iq|!ZSy{cw1e9lb=JRx1Ux3(}{es*Xiqh%hSw+ap7sTc7)$$GCS%Fq!;Y&jZ|bfVHemw%(O8zyqRHu-_eYO{hh z=GP{`ko8xfOz)%a&=ZczM$z=2)dkg!U-z=wR=OKC=|^KR83Ng@aib28 z&gZo1b)i8IK{Nz~pWOpJsyEg%IJiw0?0GT=_!sG5$Kb-M8c*8HOcmej@qI)nY~rd@ z@8ds>)R&TRkh`5ZK=BtM&EpJJwiZ)*|1yL$2k!eSEAcYIQc#;8n7{L zW79%YK=wI98lljvap5N>ZTe5>HsvvypmPvXghk}xgpD#wi*)o-xjJi9VCnPZi*M&w z13+vbs2l{fRi*BuL-b_@k(DWPz=qFf9=g*nu$oR8Qc4bHmG?AOvg>v3F ztzVD7P{a$Dda}jhmd~&I3?~W6eoo^zCPigg{F@S*SL(_<%eCI5eYZy3gY@O{TnSZz zVQA9&OkH%xPr;Wi3S8q(I5Xo>F8z+exyom1@|ZTywnF=2-EY!qDtD&SaiF9+itD<~ zDx#Egjh~Auu1KiJD;I{Ur^&#`1!f@EovY)<L4Fm5O*qJ>`vHo6lJBV$$vGLoL>(}vFZ;wW*Z?wMppa<;d~EAaXeR-%q``oTX2L@?(GOmMUFEW{9>AF`TY4=(a(G3Ttp zFmj4Ln@RjOhSfiKYBkpRbxhgeMo8pu5V<(%+rm1a%*3I%M9axmIMV9%Ac>$!z8meR zE$j`*on08G)2K>h9w9oAS2PF zU`akuCpoo|hJYZr8S^Do0v?%Cxr^~6Ye%!~&w6givC2nzdGhrwAqCZ-aK|wjIdhz| z^NG^U-(+c){!I9I(`8+x^v6veQE08+(6b#3hNpDy{9AfuDe<-1Y^AKib?hsS zXw>lsF#}b4JqMM^9CjOIKC3M*r#rWDLIfH|6OA#6r+Z?W8bs9QNK$vUSZ;ms5~AaGM$*f0s$2qp6S)W>}V3BAC``1^wyRkAeOMX94T>da1z^|!|2=J zQ&1E>SNr_+X2C@!5shr!YbF*9)O1{Fb~;Si9C*9n?9;z(%4)vqm4yeXj?tBvwsT3T zE%KsuSR!?zw(Mvt(N)?KVBG^K2?~dt%(jO#NOE7O)^NtNax-H{lUfdWI1yDWukm8r zsI+yPr6ho}6VJ^(*-*z03NLV($u1lMOpWWkV3&h;#?wdg#AB0q+?W8rr2G7M_X-yF zV%6hR>)M^3p8n;_mj^_6Y?hsii+6x>ten?zOixTyad_l-xpX?wh>t=+FhYLW335}$ zs6*>zJj;1lzn!#hbTGE6V>?fVYAJ~XSL?OB1 zt;B#CCRc=;h+a|y^WrYG>!krsJgJZape$aLl$MH1NPOVqd(NpG_?NSS;T@RDm&D<9 zXZiRM3x#K`(T>F1+gnIPgvn?a{rvnKm#(3a$zy+_F%9rdn3_KaJM15}Rhj}!i}C>R zke4nDz=Q2yTX1|!!Jz(|ZqLuG&m|0L>Khq%*HQzW-~rB2TW1*?m|pyvk2XdTbt1++ za^w^gA4%%J@*NE9{NjQU8|n5z$J4*Lql3SxNrk`KZXlB2Xssi2D3(I!@+w;}sK$O< z!uxI;Yt{R~%K2n@2oQWyO0)3|5{gPna+;c+lY*KpR?ah-cAQVYZvPy8zlLhPKYkH2 zg$Q=AZ1HZj3ly{)rzb_WDLeVfrAZDtSb&C$QIYT4%p@Hd4s5heHW|6I)_J4LS3JK8 zh=c9phcS)nM5`~`hjEqxXz+SOdGA|ce0aW288Wf%DGujLCceYK5T3~3rN6%~lFP+r zv&5E@lS3lnOS?Lpcevb>YkxRtq2Zf9TC6?$^QXw?73|W0@<4z6&qxrY3_*Yh6nQOc zz;L!VOgbJXHWAq93{cFX?Vu;q@0l0%tOK>#nwRRBkzuTrmU$W55mz-e#1#_{sWPA{ z54JcI1XNxACgn!G^a~z!cC_2Ox(ALl8X`}`$r(TfLJ<)WvEYu8m40<|b4x74eU@`` zFZcpX0Wr*ohuU0rRtP_>>@X|quEwcYFCdH<$Dtv0Zv zgt|YHz+-lvijwj@GjnWbCruRp&%>+6mKL2$)cJnx2j-6hN|i>FjVFx$CDFmg4+VvoDb8VsnD0w>u&qiA$i<12 zZ>;6EOifLP{P<>{p&k28ZpRB@(hw|KRx-26`SZhRt>q%q8v?Fg1sPsp5fPZ_LK#@y z$J?{f6xPF-Q;lXvDwj1c_SIFazxMQWblb@$84w2O#}5`Z>*c{e>pf>@XL`NCZ^zD= z7fC$8rA}k>#;UaRY+x5%7wT50T}qLt>k3BO0|{+$hF{x>WgpRJ+$D^>~8P^i4!&aT(+JS)TT#&0(%1X_&kP1C#ri&5;Cs zo`WO`pHChN$RYcx-2!yWj^6;vEhx{V;UC5JRi~rD#rl;lH~55zR?M2>>Lp}CxQCJB zNUE1@jx1vBZb70JfbqClAsv2*Rsf!RahbwfwvrwIm?0;b-o;}*+iQ^%yVR&MRD_ml z{nX2U!KF{XW8bve07y&w6zD37N*20{35rk!Z-T$;|6ytl`0;y@_!#QKG*OV#UOuO> z_4IoCyOQeHhA?Q7mXV?L#EYmF?pY$=>q`@lyiD0(5%SmBRfyZOb)HE{Fk(LanegY1 z`qnE*MJV+JXFXp_Cl=AKcT2Y{&m~IWY+bf0k`g2as#RkjL~RwgbxO=5c%Fx>0k8$Z zk~VzEP+xE5vkBUL;CfN47Ea>kQPy?`inCy)QtjCwPJ$(0u_Gz5WhlCT_eU`wk)D<1 z)l4e8b*RUyT3$np1e!E4)pvmR&Utk)wvhL{&SAQ3wIwlQj$soO-oK_b5yEWL`grvs zp9CJU7SO{%_MvuDX4q>Kiu)XxbdFrfQR27ZO-_<3@qSRyn6z_Ls#@ zLX$&1;&JWS{MlW@L;o8uRYlo0eQAslUv^Q$`cE_I462?nxe@IBuoh|?72dyuD;RYM zfR5C+l1~6-z-zTQ+n2tRynbhn&axa4+juJ^N$ZoJ0qK{a8b8`}ZVtwzhqg7Yy1)Z+ zku$gnr{VjdEx8F>;SQ~LJ#QgH)?HmSZvRR!&kb_9^19Gmwu?VIGmPlVKMj>P4m_2L z;PSmY8ll!dJbTGvjuCqg(9ZyMks`G=(Oco7e{$vR;jRZDn2B+}f(0xP_vybvytX$U z_uBF9?t`aTbi54j4)LD?bbCyi-5c2Ql#r+HxJUyfLcE#4_VTd{c%r|C?10h$g9)H3 z(;#SN<_ZQ{4u-S=?=rsA-Z%78~Xg609CZ`<6>zkkAL&N&DI0<*KL!1L0;(Y-0*iR52s7O zV-bxD=I1>BB(}49Tqbb4XkU{#i&t`as586}4<~OdPNye$Y1IDfDrtc|{PVGAaRuvn zZ;7Fr6V?U{VC5|5R?8eLxrv`}*oWl`*Vl3lYyr==|I>_bF*@6kG}~9$Nux5z5#fFJ zywW<$oQ13hKlxxui`EEz`9`hQPESAqvT3<3?qR-sG04U&s~>liT=v1U|5=&2yWBHS zVD~#AoEH(*JVpH_h!bQyl9HBt4JdqQ2CJ;)&ebBd2A8bzvgW07jHM|+E4(8(5zryU5GiFKjr6{xey-av0{WCfI1I^X*~xp!u{J8?(=@$onuabGHZ@q+q*-A6dqhXxInG> z3%1ctA+K`E&T=@Q^n_V?q@<<1lo4C4d2xA|f$ZbU2z6yxys%imrg^PGx$5=bX3EEd ziXd4iL#7XTxEXQ?g09qrE`SkD#wfePMjnynC1s3%y5?8_wv0Qriuh8ld^RU`QS$J7 zq`za$QQ}BC>EFKM5UL;?f7^J_RHz{d2AwAT*>*N{`oCTPLLQG)H}pP>zucW6%ryre zg#;moJM_|oC8}d(G8&Eu!u%y)1>lG3m9{UWe*si19dCMLuH<(x6M5f()6$c$chcWo zb3UyL1mJ!Z&jAc#PrLFDD1VRqO- zK9y|S50gpWJl`eNKXVdFbBSERDRV`RJuDFrK!no5q8OES-YiG_$w5qOCZERhPnD=V zX-?pdTD>5Q93`B@Vffodk)Npq5@Lc3m!UlJgJ@rta#!NeVp%C(DoL4+y$JD=!bFZzDG&=9r|gcpe~y1$ zo~|S7Z`Qu4DN%<+%}IcZ**@Ph$7RnJCA;__Npm5GP$1swYNSj>3z6Ick_ix++4Chh zYwS|{9L~8KVu*xo#mG?fo=s7$8xjF%A^o<`ZTlcC0lt(ft>63cXM6%4lC+x6A)FZz0PvI9is7T zifS<3VVjjnW(+2cM`0KR*5Sp4cw5dLAU|9k3|XKuEhm1@lemGJvfCbVkiK1-P#$(^ z6C;IR<~Pp`Dp+h8vRgO<5imk@JWDy*!%q0Z9`Jtb)G#0@1ClJ-&0N`fXeTyF%2v{Y z|HIP?h|(^g#9Ghx)`Q}CxYI@$F_elyO$2;?mHX}kvm@^QglwopzW%tE*1>LZ+rtQB zK1s;o500+ZHY?NJPXcXP=+Xw6;6bj}_0CX_7cG83K%`0&(~N43k(eV-meI}dRRAF5uqKQO_>wf7IxC*^SAX1iPT$-rD__&BZySbo4{atbWwiPY_R@Ne3Np&1x z_!kUbzRR7|`|IB8mk2jGt-m^_Ev|LHL#LLF!)iE`>V}Ivs9QIZ-aHw5?q_LqkR!AbZh5Dc0E{tINh zxf>^hLs@yXo`H^hXa+A`3q@)izr4JUR%YYT z-+fp*q@0||jg1_EZwMqrMEWs023A(m)6&wy2qPmS*)P*J^uhYWxctd22P@=1e-i$o zb0vD_k;%A{y9`{RPXR`=p6c_JY+hMqZ`8l((wk@#uD zp${HW{$?;2iGhZlg{Y4?61j1Ocy`HLmLsVh#%!HPg0=WRLU_?^4VNiA;A$OCqx$6v zjYrNr`ARgpFa&_o`hIqHmXwU_EfJB=3o5=KYmj~{VAf6A)YnfDR6EPuAQ zKS$;-yiEtoQvnPZQhNr3f6tC~JvdZ8QnaYm4C6wN92$#B<6#poEzt&pGkndPe&%fV z+twQ1!G{M#Z#xW-Fddp35g`5vCuDG68$SVM#2A@1N<5|Q85Jm2)M;XHBky19L2vEu z8Zco0x#@6S3i=0!Hzhu0TpushdfwT$-|gTjm#YVWBldKEwYgAjF#nVW1>7#^SXerj zRiaawdUqK_zrKQC4^Y`zLnR6&f#_q%1TdD>m!*I@2z!oGcAsMd1;|FD?S;%xVeFZP zq6cbVU1=C`ztEO&7vHQuukY32f}il?&U42BZ66@FTG$N+BFVV8Qo!k&D^n9RG$cK3y%=}mr|A42;D*)Nl`&Y!^=}oKJb>%S_oCfHx6kt$Ozon0gH#`4`YWK=1f4&o|Um$A=C z7C@Q>u^zWg`AhdCvwcnK>qX}r->1bs;2e1xY9xqg7Wo+yUZQtFoRj&K1>F&PI>nu6h8Id-kc^x!&`LnHmw)xbY8lb>A zy9LFwB6SiMgTOvV&R6wDjz2y(kWdd~>hggLz+?F{DU!QURGatp^|`vb$|@=vVl9cD zdf4E#Od%$-G2}e&nd%XQi=b^L9_xZo1B_C-$0S~pLodif7c;eb2~I6P=PFm9C8xq& z+beU$G{OKPx$&Vx1A?7B3|W9rMxHB1%j5cj7Z`(tJw<&mqfRRv@$DiYk~~Pu??H4X zGDhm`QM>1-``Wg$NiBZT??3zf8R@VK$ z02o!|{fR2?uY}T%7XEG-zkGan$4?-+bFpx=cH6UIo(IP80BUj7xV!+x@=L?N6_ooJ zA(F`ApIm={u;mRHCYeXWfcPXa@OHjSxYB6#wLuK<9)RhijzMZ}3=kfik)qx}oMqt9 zGOHBIl3&cEti+5_FsA5!%A-&J#uFDwQV|Q}o7Ez0O?;LkKwoY&E9p#n0^MG) zoW7wV7^pyxQ?52nbo1VKR3rG|p1t}Jm`Nz0K=IxEeDncKHBqMCL{?o%5}X&mUw2dl zqRUwWHr9fURTO0Lbv(7kC?WuoISYWfoIw;^@7PO|g_nRy2CyDRcQz8qn~xMsXauOj zAfE0|4g2wxw}JJ=?HW8O4?f+KiRkJ@N-mtUq_#i;>=Z)h%!_ilQYA2cc8NkcW*^1> z)QqalWJ-XLXF&wAUmr-5xf;RXMWO9ho}g&rZE&W)W0EN!idUJh`M`+mYX+^JD?fx> zMkiaW*lK5k<+*Z+KS2X%Ozls`NBciC{%PRmdiiGuMU*2> zp$rHTDL^>t&e2-PWPBnAJ8S_lfdQ8S(BO>cu)tG_AvUU}b6kP8bewk>kcvAPSjUnS z*k!El>REtV3(8L`X524V2qSyKxz0BD&Mh+l zs0rXf`216Y1zuGJuzlPlr$7lIDmH zYSsVq0w47{+nrhNv5T1X9Zql;B88n^Uqj?_E^bQj*Mmf@%>_Ya9H%_X1d&o&zO*csY#5GBZqjWLb_8;wO>dgrt5dFar?^Far)SgN~E^xfngImyqzM zuf#+aU&FgAay-U0P>=T7be5X%gnnu1C_toK|3CL$Dpu*HzlO5w@rHwi+Sir{D_}Z! zXNoTGbriBWG!SG?NJ?duR|2enrmKn%;+76@mduMf7JxJkq&_!*2<$2Qk<}IFxm`^h zQ2_)7Sv*AnD2$ae<;@c-wsAmI2|!b8P}rruCGTtHVzK%JP(|?0bzalUysp~ z>&F0IGLnrwZ?m7EXdXfCF6#Q0;HVf}n^8wxz^9#rrfQD>JL&V&1%N;BlctcPwB7w2 zUJO>ML0_=Vwd6!LJh5X{#=Jc|r;$*SEwk738=!^Eh<<|{kqre@gANg)w;S71z$9Yq zRjs1DQYk3shFt1w2*m&?;D42(+L&l}fZFf$**(pQ;v8f&p-tfbP>ln(uNzFIg4bRF z4-8CB+3GhCF9ADqon~PNIID@68mOkPbuK57T+ht?JfZq4?VA5`8?(Ry#xh)r`~$_- zKo>%d_13(HHXxZ2S(k6R7b2f%+Q!gmPRlN`P&T z0Lm?6SH>mM4JeUiRi&yZCf=CAc9yOY{@&Yv2X-Y2QfoKlzt}-hQKXKq`Rc#%>}?{d z{?KgO+!)&7T`vlDeio9k!Y`h1ygsz%^9w?u{$3wU^Jsyp;#en5{U;zfQI?i$_w=%S zvexZ8CBKP+Bp9VS5kf#6V$1^SP%QvBTS16}oEhK*24$ZrlnE@|Dc?_I0B#}fMnKho z?XeStY|lE_9y9yffW}XNOzOX3L{ac@|AOE~77zFWPq6N?nrf2%QHa0-rNR|ig$f)G zO*f*OKsw*smw!H6`3&C2<2TtGGq&S5PCgKjJ3VL>%Ww!R1i(iG^{4;7=V;=iJRmCO zWxQ+Q!`?sPY)rI5h(y@NXdU&j*iys6>&#*Z|3rr23+!+|i;SFPAIArjCR!g1fc-J{ z7zdc~AcX#P&sWVU#9^RzGnR-}flUg)0TupjJYI36)T z)(y&Jzw!PX_@2ejrM4gRKuLuG$UuSbK_ta@Mxzkx0UAOn>FaFSv`drVKvQ6y#B+M` zhnz_u22-UCp8r1>D81s0X4V)`LI9UI)6?dP;+z=&IuTh0t*(voTlex5c&DYgfLjt7 zlc0MA&kn$q0m=~2^}Vd%G*C+1Gxydt0xH<9ZH(O*l*GgjngQJ*v?G zAWt?jr2}DwXfF`x2!MHay92>cw1xwbJ$WtlVjkM5TzD=o!7NMRqq zf~&VVio$|=@wcWMa#Y1K-32_o?K8~vS8ZTS+6Q5ZR?9bt1VXy2zqW8Ts&+RCoQkIH z?^5U^#pm@?f2{zFIm~uWAkR8@>_P!JOsLbOu>+R*1Avv~+HEN~%*KB zhhWefGLp@6n=FXg7zq21_lK3FnU}{Rz~0@`aIPaNnS-JT-8E=Mm7y+jJ!lw%aFwOLOI*P7_g$6@{taNx1d~ zUK=+ji+-r-R-0n zmy|SbT#RP$;-R2K-HX~*IbE+n%D|?M<<8K<3n@=-7@>Q4H3P%ppq8V069e&XaVc^@ z|6~Hh1quk|!5*~%50w6mETxN!b)KCk!^~VQgpm@pHfFT%v!CsrL>#U97FLOqr2h04 z4yAD@0G5RK8FYQk|Bkvi1FWl`@y=K>bC6Q0@)=;Te(&8rC|AhkiZEI(FaXy-HlHWQ z;e6%p-ej)l&5DbPClIfVR>(_eTv?os=5lsznc_K)r*2=bYH%pz`rc)y&u1XZ8>Bjo}5Nk3NBs9QtnHD*ercPqUig_aRgCEcOGpaej?2T z$US%1ky`cn>y<#K(GRR8t_Q`1gM)**_m}%n;Y9oyU_)nh_)W&~wcYp0z-L5MRk1;L z6*$52>gKDW+Mq>*d4fk!U;l%dnVIEsWAu7Y5Fqe+g5Q#$-{GY8EY_Iwm8UwfS^-u! zw4a%j`a6ZSHFPJU&XK`Cj2CO05;qfNaY=qeCJjI%3LrPX-EGhhnkUHoJ2)WD#(!E1 z*eSbjcUiUnuv7LPq`0EM@3FIN^4w`ZSr7~GlUMvHYR=t|P3!-s3BXNL0Js-8IXiAN zXjQ9x4-U*hw;SI}Xy`*Co3<-VDBOrZuZL?p(7pqS5dQFJ!QtVgjEryD*_U|HH*$L& zsV%~%GKo`q!@Hu9_R&Apbq&r$IY+1H6gcLQD*#m-1OkXE{;53S*ed5NZ7uY;V7`XA z{5w|rG9a5;mR9DDC&)^xUeaU1iu9}R>REN$uiy|kb`>vpEG8R25UC;@<}fXu+qiPe z{$G{=%rzNRIjgL-zfav@6<2Ylt1 zKUX%R%XA|;D)#p5w;4~mQ<+yDJz$aJBaJ4@_6g^I4IyNkvSD4DAjLl;O$w#qv$XPO z!-A4sjE2(WK(qzOjg$nXayStM_n$98+LL6YOc~8`_I}*_cp+8i#!pZ;^t=o@G&pTb zuqo05&%6XcVzT^?`2+}+5a3F9uUoisxr;CY@Q5iUc$XC9UA+J))A|&_T1W02TTghm z&ll9U{I{FSVFmzLfG+(bJhD{8o}3$Y=TD4AsyzeHSSy56M^C>1hG}Wb`lTKx7%*_# zrt8vEFpVcLyY+pfF0nd31umkbi;~iSM>_Rjk|p_2Af3Jwt4gfxHuG;YJw6-;j$=q? z3D`gFd-IMj$NF#QK!eZZRz3d2u5M%#zk#L=h$LechBvy}jcvS8Hf8*yh1^W&(vAke z7HZSNUQgzI5(z4TYoW^7DpySxh#^cva|pCs4AE35a?LqO(o-6&@LlZxRxm<}F*WAx zX-fhsQ~WTGz+S{vP(CGkD1dq_O(5gvdPw*L%Ju{5Bw3ri@hO1*=IrS?4N$vAT+Yq@ znQzhoZ8`*T=e>1?q^E&c4+v0l|IBHSXkA!UroOK_zy04{k;KT)_TREiy+QrYB8g3wPxI|C4(O)>_#5i?7*XUOJ^hp% zH-9hSN@OVp=R>^?uzJ}LD_Dn!qcI?KOOQnhe10sIgmy!kcO-^jigb?A1*p2T$01!H zpb7J6jCvy*#Tj%@mO7TfXaGo6qE0ed&a;QM4oP9V}V)Cnx;niK0JhFo>r6n^4{5@7STXGux@?G`mR9cu-ihTocwk%gszxQbY{G%@WsZ zpk}~zwuWuz>k%Yzb+!iFZC9dHSxT047yGvX2+I=khc4lt}fe!`=kNs+hyrul{_(9uGA_xSHy>~gbu8ydzFlfxm zg;k!V+g`XDY6idk%FTT5{va-{lGDl!ym#SC|Aj}S!VBvV+GMlN7M7-P+tF4CwCt}@ zrO-Fd7LaE0kJ-R}e`s~=x{**1HLC5CUa1HkK!$0@$uS|9wg_db6U&Q3TQY#wM% z0|Au7tswj@Xm{an5!+Y2f{5JMd7%9U&~B7zV!nZsECuEPe1R9I^+OZoaMLE7$dan6#U;z!)O#y|Q(fskYQdIobd94xs!I9irch6F2f| zxuXdU|F=Gn!^mr_ZuQ=}E2FC)e2|clpfa3(YP}95c+f7uCIoih6o7>V!1X-do>#Yn zR;O66if>>KYm8NlYb&iSWq3z`T^TfENgZL$l~vLS0Vhz2+rzUdB^9+Fcp*)_NlK7HB8+pva^p>c zzPw7pLs5vw+#(#J;2T#g3aTkt)f#d5Kyw4pj<4e0*h7mLHx}HQ1K+ta*G5P(g0yNm zdcRyd9y6;)0@&Zv=RH=IcYiAC+~CAYw3325bAbsQIa=%0rdXCeBh!^!ctSm_?XG$K8@yyTzr+5;N~ z2_&H)T9NmOgJ^{e_?iKjy7lSeHuy_hQqbcP9rn)cY6&_{g?%OBXrsA&UNHA1{Dqxa z&HURO&etBC7k8I@JZwd*CCzksXBY2ouWYBU1h(T9Yn)v$b@{60;4~o32G2J_J~`^m z3aZ*YGf^?FkFhIhRC3o0EPCmXCEoy?(kB#sZB?xwLVR&T=gZ;U_0piW7V4Y&^ zjV08h!+p97ke&M5;Bq4;7ym%m*)fX5%)o(U!_?#Z-t`hLBIVoLb|~ZGfPy;ZY@A=` z%TDN|+U(D4v7 zpoM0bHHb8NT8k;^b#22op}l5joZ)u8I#IOV^Zj`Poi+;L+u#ch_kuUfe=juhFy{W$ z1(eCSei}Skw5go<4T5@+{4l{8(S%ed#R%ayk$r#3c^mz^LSa{Hl^4_%muu-_F1yM( z(^5%H!)TjN%lB3t;fparemv3f_#r+Kt#v$;iAGMr-n$yDsZNCDPmZ`|rPXMeJ1WqP ztlWFQJ4fDEXN!`*-JBipvm;%fv&_zJL$hEWX1FIb3jMUj;=wFCDAZ;) zPW{m?f$wfcJvZ=5kT^CgXWX}OB_Mc7%eQ;@P+12yZjp@;^|}jq0p4O`!%ZH6d+W|(uQ_bmiEpe@B()f^i?1RW|JaGh zeLU&d?Ne@VS7L$gz=k;7x&7x&WVGie)7Ky5qYN%oc25r8gce9M^9`53f})K=`X<&} z>u0$a8!UXAxc`}>$sOjIjSe+ZA9hRIw6hjqtZyjoJ(J8TKPQdqo!OI-H(uz`AFp)~ z0Ww9k!J0rqLIR>o^E}^f78MuoSM%}n69HdMa9CImX!L)Jg%xCy>4o|F^=pAKKwCtV zYcy;;-K-6u@IOM;sYeVDdLYr!(Lp<@-W+Y7T5Dx8hEz`II-B|j;h*xe!|RYq546JL z2IKqMjL#Yj`CxrGKSo{Sj5~`qVG&30y)>uh(3H+<`QPstl7id^Z`4OB*L2 z`VJig|BQ7AZ#LQbh>?9rYcCV+-X#kb*RReLacA?49$` z0`ZU6u&@T86G-gKmt$ojJUm3dF5k-bdkNE2(CojwvQllc#)tYAG~2|)#8erN;X?UN zn)*xRcLS(g<#~6meKn%X@Tpi)pmM%vcJ_)es>Vh=A|3M1glp+Xl8@-MM6xJ*rzWFw zifqfB8K=~CMR}Nk*E;--k(Y5K_m!(jJX6rIFPGh0&!$#SORJw{IXzd>qAw&^NcErF zBNypwlWiY0dHIIhg1-&xB)Uh33Mb+3MHVskFix%!pqOeBCrUK)I$zhvHp;GrvO4r{ z^qKN`1S~cLDwBYN)o=28*3^_0{&*Du$M|s;Z~Zf2(%xxgbcTKEJ=0W5rrj|z3YWbpX(R1N;Mhcfj#2~!Wi0aaTqu_>ykY;N?0 zVFO2gXjmAd-G)%M@&75~%EO`T+W2HG@>;?$wycviOZI(<35_*sDiQ`sV~G^9Z`q4P zi0s+3mNioL8oNX(B3rU&>$~UeeZTAau5bRBYp(M=GiRQ2?sMPwIrs1P1NM)rhesRw ziEn>V(}gwlZoL=CpTo(&!!xHOI;>dQ^QR>@jbOezitFzE7JeDMXN>}j{3X30bn7+7 z2ub1HH6@YUYO)xh`srNOfFULY8HCJR?H7-puo!bCr#86eR#(M36yw4=uJczwb2ulz z%Jhn-M_B8bASFNL*o?w9$rOrwD?f@-Y=eY^EdqY~P3PK3yp=CIy6&Vr5={!l zAuIQ7pN=V6L#ogR6f|f(71Ux(vp4;oDxbH8f~$bPRVxaGdOtKonbfuV^k$MiWqRps zsD`J~1lI!L_n6sPPtOgW&34CAt&V%1G3>!vzn5=}B7Oa+Z2fyWO`_3g$CYUcIxv8a zdRMyJ>hhU&FWF~rQk|;x%&aP5&rMDh=SI%W1dVncSj@}X)(F4vrtFN1dG$#j*YeO5ttu9@QmS<7>$KovH-MS0G4zMi8NHu!QH7{?RE4Y6r! zBgUo!A*-TPRcy*8R?Zr?OJ*DltmPewjvgLsnL1>{vv(Jj9$1%q~rWhvX5PFSRxZQ;C*+md@OA4)E)7lnC&aclH$$PLQY0+TS%!WJpCE&TKP z=wZ>VM^fW6((TfVFW9Qr*GO^0_cq~JwahB$7oBi}41bqyU6u|%tIPCG4?O3D?$ z&Cw>p-oGT3+i!`_Q5Krt100&2z5RtM2YY*)u0&x~H6cE}rx*S3_&j4C2m{qP7ZY3Q zl=ue^*1~rw5GjUKmX?-LJa5=+qov-k)pMw5j~alS6Sz%nI6&j$<16==#SRV*9#>Q2 zMwHuiGHvhd(A?rYYiOtg=&hRTV?hAR`w9#ikXg~Svf>W7nBN2dIUCR%VFQMmZX9>a z*~fCERrz8zqw<5B^q-y-_(FV+~?RAsCFUSdeY%i9^1KN-T} zMa9v-hrxEs%)o$_{_qc(3|`LZ9=uHHr59wOT5fM=M3%$HKYd(T%-Nq>TtYe!niYI@ z+sDRFI^&IW9G#p3b+aq##G*FTN#E1qW8B-@EB-*;G+wy><$rIteng%m0w8-#dPF}-*v)2J@rlAb=%yGs^r<(&XfM{*S8b@ zJlh+#N;8$?cK@_1x07rA8H@jG_8O@ne2Q&p(NIuSsy8AUCM1Co=Gmo8menSNmOWp$>TRTf^4h-Ymj~)&#z4PIdic;30A;^+ zcg>ugi;R!)@EA2UH6Okq~5~lICRHrT#j8+*v*;(@MqPH2_=0aBQ)aX%4f}}rTv6T zt1@(w{%KmIM9%Z)(xgkFTACz8W&jtu-UsaH)=XA7_fx1+Mb%W;zU}`|?OZa*Km2Ka zVc`g3W_p@|(FB%}qLPv+4wq_dcJZPCUqVFF!HzTE%Z)sKrpSVt8jFIlS^`g}opk@g z2DuNS_#F<1b6lSzl7A>1Mbt9d$edCSYLpJ_1 z4Su^`rXop$lamsIIeB^ab+dUZ$9$XVqbB&(>=QRqI_%kVSYERA zU3MucDerZnp7;mF-K>R<1pdRcv~5ssASVzAhG`0n^`p%DWME;j zPiQnP)baMNGhSP1qt`ApU-b#11D!rpERT9D6fwyW*e7Z+4Gk(JRXv1)j}OsW5&i(b zhzJb`EEc4w`pAJ-3WC~Tpdy>sh`{hNg2VUUps#OFEHy369Qa;5C_4Nk;xKr0lJHd( zP8^|;KcFd+)H*RS@pQBH#lp>(H{Q{L)*mL<^zMz(I$%UHv#?CPjpOdVPWwcU1(lg-uOclTICU8g%3(-hpufNQN) zk1GiS^D#4faC)EMVOcaZk%2sW_AFS-=h-kiQ4tX>KR;D1ZEfBJ%<%*a1lwS!N7FM! zQUJK9lIN+fuP*}=(^VoXCuekODhg5SPU-q~#0T~vMV4h=<6G6vBMLqon_Z%1SC&3h zpRaS}1tG6+@P&}Q(twBl#~ilSxs9!@=`(j1`72dnwfYGq=`*5G_lk?fqBh~pFh#l@ zEPCr+M0|XF0FX<4*LvkAus=Z53?Sjzrjn@klgL`W3o}J_gnAdGlk}+P=^DbOniDe>P~~;KFM>d zt3LtOyAue-HLM53kVwV9AQ|e$0wg*fA|pU1a0OF~;b9LSvWf@`XWhTgM5b}E_C_vz zuqiA*=ztiT0=O1&TvY^&=?Q-R;7gY;-yVz945AKMEcJt^$jrc?VOp37a0US}qZTSO zLiGR)TCd>6?KL4m0fBf>yHr$G9sr+Tn3wnFsyak0=3~dS`}+E(r=~Ok_RLzFg%57~ zK^+1?cLNIH5G({!40T~G=B6v(!d;ht+`ImUgAk7^5rXD~gamU73%tp|=qM%%c~S_x zKTT*5>q#p^FlO@GY{hX$smKL|gzf{e0QBNajExy!-y9pQn{C`SMo)*vrp^7__k)tP z&Y-{I6Ge|OP!+{Wr$mDb&&|nMxqmD;gq)~ew*7BDg10>2VQIBNDt&$W4uowHXHH{v JO0}*8{Rd6(%o6|r literal 0 HcmV?d00001 diff --git a/docs/imgs/warmup_linear_schedule.png b/docs/imgs/warmup_linear_schedule.png new file mode 100644 index 0000000000000000000000000000000000000000..4e1af31025fafbd9c6b7c74ad6c2948ca2d3ff77 GIT binary patch literal 16775 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 ZbSCxh%Zc<2GU2*VN;lQy3T2F*{x5SSf?NOq literal 0 HcmV?d00001 diff --git a/pytorch_pretrained_bert/optimization.py b/pytorch_pretrained_bert/optimization.py index 7e88b1b61c..03856956ac 100644 --- a/pytorch_pretrained_bert/optimization.py +++ b/pytorch_pretrained_bert/optimization.py @@ -85,7 +85,9 @@ class ConstantLR(_LRSchedule): class WarmupCosineSchedule(_LRSchedule): """ - Cosine learning rate schedule with linear warmup. Cosine after warmup is without restarts. + Linearly increases learning rate from 0 to 1 over `warmup` fraction of training steps. + Decreases learning rate from 1. to 0. over remaining `1 - warmup` steps following a cosine curve. + If `cycles` (default=0.5) is different from default, learning rate follows cosine function after warmup. """ warn_t_total = True def __init__(self, warmup=0.002, t_total=-1, cycles=.5, **kw): @@ -108,7 +110,9 @@ class WarmupCosineSchedule(_LRSchedule): class WarmupCosineWithHardRestartsSchedule(WarmupCosineSchedule): """ - Cosine learning rate schedule with linear warmup and hard restarts (if cycles > 1). + Linearly increases learning rate from 0 to 1 over `warmup` fraction of training steps. + If `cycles` (default=1.) is different from default, learning rate follows `cycles` times a cosine decaying + learning rate (with hard restarts). """ def __init__(self, warmup=0.002, t_total=-1, cycles=1., **kw): super(WarmupCosineWithHardRestartsSchedule, self).__init__(warmup=warmup, t_total=t_total, cycles=cycles, **kw) @@ -125,9 +129,9 @@ class WarmupCosineWithHardRestartsSchedule(WarmupCosineSchedule): class WarmupCosineWithWarmupRestartsSchedule(WarmupCosineWithHardRestartsSchedule): """ - Cosine learning rate schedule with linear warmups and linear warmup restarts. - The same warmup rate is used for warmup restarts as for initial warmup. - The total effective fraction of warmup steps over all cycles is warmup * cycles! + All training progress is divided in `cycles` (default=1.) parts of equal length. + Every part follows a schedule with the first `warmup` fraction of the training steps linearly increasing from 0. to 1., + followed by a learning rate decreasing from 1. to 0. following a cosine curve. """ def __init__(self, warmup=0.002, t_total=-1, cycles=1., **kw): assert(warmup * cycles < 1.) @@ -146,7 +150,8 @@ class WarmupCosineWithWarmupRestartsSchedule(WarmupCosineWithHardRestartsSchedul class WarmupConstantSchedule(_LRSchedule): """ - Applies linear warmup. After warmup always returns 1.. + Linearly increases learning rate from 0 to 1 over `warmup` fraction of training steps. + Keeps learning rate equal to 1. after warmup. """ def get_lr_(self, progress): if progress < self.warmup: @@ -156,7 +161,8 @@ class WarmupConstantSchedule(_LRSchedule): class WarmupLinearSchedule(_LRSchedule): """ - Linear warmup. Linear decay after warmup. + Linearly increases learning rate from 0 to 1 over `warmup` fraction of training steps. + Linearly decreases learning rate from 1. to 0. over remaining `1 - warmup` steps. """ warn_t_total = True def get_lr_(self, progress): @@ -182,8 +188,9 @@ class BertAdam(Optimizer): t_total: total number of training steps for the learning rate schedule, -1 means constant learning rate of 1. (no warmup regardless of warmup setting). Default: -1 schedule: schedule to use for the warmup (see above). - Can be 'warmup_linear', 'warmup_constant', 'warmup_cosine', or a LRSchedule object. - Default: 'warmup_linear' + Can be `'warmup_linear'`, `'warmup_constant'`, `'warmup_cosine'`, `'none'`, `None` or a `_LRSchedule` object (see below). + If `None` or `'none'`, learning rate is always kept constant. + Default : `'warmup_linear'` b1: Adams b1. Default: 0.9 b2: Adams b2. Default: 0.999 e: Adams epsilon. Default: 1e-6 @@ -208,8 +215,8 @@ class BertAdam(Optimizer): schedule = schedule_type(warmup=warmup, t_total=t_total) else: if warmup != -1 or t_total != -1: - logger.warning("Non-default warmup and t_total are ineffective when LRSchedule object is provided. " - "Please specify custom warmup and t_total in LRSchedule object.") + logger.warning("warmup and t_total on the optimizer are ineffective when _LRSchedule object is provided as schedule. " + "Please specify custom warmup and t_total in _LRSchedule object.") defaults = dict(lr=lr, schedule=schedule, b1=b1, b2=b2, e=e, weight_decay=weight_decay, max_grad_norm=max_grad_norm) diff --git a/pytorch_pretrained_bert/optimization_openai.py b/pytorch_pretrained_bert/optimization_openai.py index 0cf0494e20..bff4ebe61f 100644 --- a/pytorch_pretrained_bert/optimization_openai.py +++ b/pytorch_pretrained_bert/optimization_openai.py @@ -48,8 +48,8 @@ class OpenAIAdam(Optimizer): schedule = schedule_type(warmup=warmup, t_total=t_total) else: if warmup != -1 or t_total != -1: - logger.warning("Non-default warmup and t_total are ineffective when LRSchedule object is provided. " - "Please specify custom warmup and t_total in LRSchedule object.") + logger.warning("warmup and t_total on the optimizer are ineffective when _LRSchedule object is provided as schedule. " + "Please specify custom warmup and t_total in _LRSchedule object.") defaults = dict(lr=lr, schedule=schedule, b1=b1, b2=b2, e=e, weight_decay=weight_decay, vector_l2=vector_l2, max_grad_norm=max_grad_norm) diff --git a/tests/optimization_test.py b/tests/optimization_test.py index f52aeb506b..bc12ff8a90 100644 --- a/tests/optimization_test.py +++ b/tests/optimization_test.py @@ -22,7 +22,8 @@ import torch from pytorch_pretrained_bert import BertAdam from pytorch_pretrained_bert import OpenAIAdam -from pytorch_pretrained_bert.optimization import ConstantLR, WarmupLinearSchedule, WarmupCosineWithWarmupRestartsSchedule +from pytorch_pretrained_bert.optimization import ConstantLR, WarmupLinearSchedule, WarmupConstantSchedule, \ + WarmupCosineWithWarmupRestartsSchedule, WarmupCosineWithHardRestartsSchedule, WarmupCosineSchedule import numpy as np @@ -86,6 +87,18 @@ class WarmupCosineWithRestartsTest(unittest.TestCase): self.assertTrue(np.allclose(expected_zeros, 0)) +class TestSchedulePlot(unittest.TestCase): + def test_plot_schedule(self): + import matplotlib as mpl + from matplotlib import pyplot as plt + m = WarmupCosineWithWarmupRestartsSchedule(warmup=.1, t_total=1000., cycles=3.) + x = np.arange(0, 1000) + y = [m.get_lr(xe) for xe in x] + y = np.asarray(y) + plt.figure(figsize=(9, 2)) + plt.plot(y) + #plt.grid(True) + plt.show() if __name__ == "__main__":