From c5dff684e0bebdf7094342a180b16f8b0d9b16cc Mon Sep 17 00:00:00 2001 From: Eric Hutton Date: Fri, 17 Jun 2022 10:41:13 -0600 Subject: [PATCH] feat: add plot subcommand (#13) * add "ww3 plot" subcommand * fix bug related to error reporting of a bad date * add an example that uses "ww3 plot" * add matplotlib as a dependency * add impage of hurricane julia * add news fragments [skip ci] --- README.rst | 19 ++++++ bmi_wavewatch3/cli.py | 77 +++++++++++++++++++++++- bmi_wavewatch3/source.py | 2 +- docs/source/_static/hurricane_julia.png | Bin 0 -> 50560 bytes news/13.bugfix | 3 + news/13.feature | 5 ++ pyproject.toml | 1 + 7 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 docs/source/_static/hurricane_julia.png create mode 100644 news/13.bugfix create mode 100644 news/13.feature diff --git a/README.rst b/README.rst index c240d0d..236e3be 100644 --- a/README.rst +++ b/README.rst @@ -97,6 +97,25 @@ This will download new datasets as necessary and load the new data into the ``da Example ------- +Plot data from the command line +``````````````````````````````` + +Running the following from the command line will plot the variable *significant wave height* +from the WAVEWATCH III *at_4m* grid. Note that the time of day (in this case, 15:00) is +separated from the date with a ``T`` (i.e. times can be given as ``YYYY-MM-DDTHH``) + +.. code:: bash + + $ ww3 plot --grid=at_4m --data-var=swh "2010-09-15T15" + +.. image:: https://raw.githubusercontent.com/csdms/bmi-wavewatch3/main/docs/source/_static/hurrican_julia.png + :width: 100% + :alt: Hurricane Julia + +Plot data from Python +````````````````````` + +This example is similar to the previous but uses the *bmi_wavewatch3* Python interface. .. code:: python diff --git a/bmi_wavewatch3/cli.py b/bmi_wavewatch3/cli.py index 2b45c16..2412f59 100644 --- a/bmi_wavewatch3/cli.py +++ b/bmi_wavewatch3/cli.py @@ -10,10 +10,12 @@ from multiprocessing import Pool, RLock import click +import matplotlib.pyplot as plt from tqdm.auto import tqdm from .downloader import WaveWatch3Downloader from .errors import ChoiceError, DateValueError from .source import SOURCES +from .wavewatch3 import WaveWatch3 out = partial(click.secho, bold=True, file=sys.stderr) @@ -26,7 +28,7 @@ def validate_date(ctx, param, value): source = SOURCES[ctx.parent.params["source"]] - for date_str in value: + for date_str in [value] if isinstance(value, str) else value: try: source.validate_date(date_str) except DateValueError as error: @@ -39,7 +41,7 @@ def validate_quantity(ctx, param, value): if not value: return sorted(source.QUANTITIES) - for quantity in value: + for quantity in [value] if isinstance(value, str) else value: try: source.validate_quantity(quantity) except ChoiceError as error: @@ -47,6 +49,30 @@ def validate_quantity(ctx, param, value): return value +def validate_data_var(ctx, param, value): + data_var_to_quantity = { + "dirpw": "dp", + "swh": "hs", + "perpw": "tp", + "u": "wind", + "v": "wind", + "swdir": "pdir", + "swell": "phs", + "swper": "ptp", + } + source = SOURCES[ctx.parent.params["source"]] + try: + quantity = data_var_to_quantity[value] + except KeyError: + raise click.BadParameter(ChoiceError(value, list(data_var_to_quantity))) + + try: + source.validate_quantity(quantity) + except ChoiceError as error: + raise click.BadParameter(error) + return value + + def validate_grid(ctx, param, value): source = SOURCES[ctx.parent.params["source"]] if not value: @@ -244,6 +270,53 @@ def clean(ctx, dry_run, cache_dir, yes): out(f"Removed {len(cache_files)} files ({total_bytes} bytes)") +@ww3.command() +@click.argument("date", callback=validate_date) +@click.option("--grid", default=None, help="Grid to download", callback=validate_grid) +@click.option( + "--data-var", + help="Data variable to plot", + default="swh", + callback=validate_data_var, +) +@click.pass_context +def plot(ctx, date, grid, data_var): + """Plot WAVEWATCH III data by date.""" + verbose = ctx.parent.params["verbose"] + silent = ctx.parent.params["silent"] + source = ctx.parent.params["source"] + + data_var_to_quantity = { + "dirpw": "dp", + "swh": "hs", + "perpw": "tp", + "u": "wind", + "v": "wind", + "swdir": "pdir", + "swell": "phs", + "swper": "ptp", + } + quantity = data_var_to_quantity[data_var] + + if not silent: + out(f"source: {source}") + out(f"grid: {grid}") + out(f"date: {date}") + out(f"data_var: {data_var} ({quantity})") + + ww3 = WaveWatch3(date, source=source, grid=grid) + if not silent and verbose: + [out(f"source file: {url}") for url in ww3._urls] + + ww3.data + if not silent and verbose: + [out(f"cache file: {ww3._cache / url.filename}") for url in ww3._urls] + + ww3.data[data_var][ww3.step, :, :].plot() + plt.gca().set_aspect(1) + plt.show() + + def _retreive_urls(urls, disable=False, force=False): tqdm.set_lock(RLock()) p = Pool(initializer=tqdm.set_lock, initargs=(tqdm.get_lock(),)) diff --git a/bmi_wavewatch3/source.py b/bmi_wavewatch3/source.py index 9063509..4da3ac6 100644 --- a/bmi_wavewatch3/source.py +++ b/bmi_wavewatch3/source.py @@ -121,7 +121,7 @@ def validate_date(cls, date): try: datetime.datetime.fromisoformat(date) except ValueError as error: - raise DateValueError(error) + raise DateValueError(str(error)) date_in_range_or_raise(date, lower=cls.MIN_DATE, upper=cls.MAX_DATE) return date diff --git a/docs/source/_static/hurricane_julia.png b/docs/source/_static/hurricane_julia.png new file mode 100644 index 0000000000000000000000000000000000000000..a4393782b4b503c09288cd87acea370b6ced3b62 GIT binary patch literal 50560 zcmeFZ1zS~X6g9dwY#QkX>68XR5Tv9*5rYtgMfw(}vU6-qY)*+ihtv88ImlPA6|~ zcdxVJ;W-^kG8Jswaa(RfKrY(m^krn7ks+Yy=clK8R)RqE5zs>B6&kyq)3t)BhTxb1{zU{7zM`NyO7sfu$?RtECtKjI+mpjJ0)M#Lz>qQaCNesV=S~+(D zF<4b9_@zFghL`%^-$ttb-#`7|H6Skf|6Bv>^({O!b|MAkrKF|rJ$iIwDL{mQ%vIKm zd34t2)P_tZLG$sEf@TVP(zn-U#h0Jx#>U3t{!~vS8z}9z&+N|kJvyJS6msdU z^EE61LE-rrik-hd+`Jxb&t_RpzZb|?-f#9EBDgVXFU5R!j6-uc{Dkdl-M&*UBj~_FEM(3>T5`R>yTww5GPhLxH9 z6!ozb>C2VB!hK)8RhbJztbts7bat>9F|Tr>W)Qu8^>4x{{CBP+k!4MLq?C%Qh|kkdc`CUEQboh-}Hk=fB#uSC3meI}R)-4|sLF$wQi+9x+OG}PADZ~yz}$Bn+R za%+6wmGLD03l9tId+zU+TEo+2%X{(PC1;NOm~*CBD}|j&DOk>-H+yQ(MX>+FtH>mLD1)8%qqg+_AU_KSi@@l+b#V zJXm5(S?~MDb7ZbRe`T6JJf0@x|b8Ffqyiw<^YGicZa!fdt zghJ>@6DyZH={46oh4?!=zbwnT{4`fNEU%|B*X1BDXn9IiRaH@1`U*$T#>X@A$Pqll zf-MA9gHAgC!8bEEpIVDF-oxEguJisD%?`@P2hxs-Ys}IPHHnmLa;ZQ5_=c`cci>q@ zRWE*j>%vHcgVrdkPZzZu#2Vxas-N-1Q|yN_u`E1B(6SK>-b z-nk(7HqY4)cq@kH>p{&uJe}KXGbze*$j-Z4Kh_)P(hZcRxVX52w|)<@A;&v2DG9;H zw|=|}@G-Ewls!?gv*SNrb@L1NM2SQg`uDRJ9-f|po8KGmd!!(bG&z0ZZm!D`ukrnJ z{Y77XUS1z&)vLKDK8?{U&sQ06=s~^1Xn`PKUz-{GB{_+4 z_%W`=(F)+0+H&Q+R)3e26+!fs|M;`;^#yI{@uA<(pFbx%7%kP|?x@+>liAM&`g>~y z?@YzinF;gqVo69yGEGCqJ8y55*Cyu{s}uahESoFLd|zZq``z$txXhUJ2>_v0Wfx-W+-o0$3Bi#rn+% z6*YB)?5*#UhuafG$mXvvL=Z3hNKMV|#auZIGMQ`psYs({cP_`e`iEhyr@i9NWRzU! zK}}Bx9O7t)j}NEzSDLl<|NcS0UaWaSKUa=A?dm~IQR}7Q?X}NO^q8dVh@TqdC!?|O z`@3b>A$?q2T%EATK!IwF=d5n&#=F~N@ylcN#c-|i5!cv+gf{7Z#V9gHv4#2Ig@S+3NhZ2=YSBd|uG% z_Cy%Idnlp5XSH;vxthdN{ReoROn+AqFNfB#SQ+G1Jr^mx#U#_`di$I(H+E0YSm zH;(#ZI3elPK*i@HA}nDZt{8E;npkJXr4$Cnz16a`%7h zVNs<#2{B!G{jGCsV&d1X(4$?)Dv0Qz+V8{nc(h1E@*$Tn55By1-rKvXOFj&~TsF7r zaN{~#!l1K{yulA;?}b$3ZM^Wgk2&>;UG41!&Vw&4URTQ{vdEAoFp77UTep?p{KAiZ z{=#4hqnJelF_JCk!Ob4Ls*1RKY;?4@BS>Dr9CIR*B;N6Ef7t4;XZbb|A#$ESiEr2c zk=OO+)C9>*vUxXp5l~cYjnV6125%%3|XQyYbwtS`1Q7 zt=bL0ze}d=U0pNt`C*+!8VRd?3M-Sp2TR!J<$af!(9+P6z-ZfZUlgrhN88QEQ^^X; z1GcIwutZhPgSw1AHOKvDPE_6c!2l~nP!KFMQtig!(4Uv|+N|0J5|Y#4%gnCSjA{3! zVM%p$b)214Vd&vrwuE(L*Uk{caseD6?j~0*4T)w}(e%EEFv=IK43;HWE z9=vhEb*zqlW4>SO&-b_ILYY_ZL$=};6Qke=JCM9DVtV;!0BMvt-f=AMX{#e<=#}Y} zYC5>LQ$t~z0fsLw^9AqydbU@+3ZZS)9!u>sS|h2nza)LwfF26;s+yXFt*x!@zrPCU z=P5GxpW9|*5Ho+CKlIkc__Wgi0tKNXh9fk4KExnbE~3t7G4O3CJS+X#h*ZNC%Bm@UidG@YL3xIP5VT zqsd9Dlx^V;L6?|(mq+7nkJVZK?7p`*d~SQRSh>uyS*fU~2toe*sP?P%-CiCudFRSJ z*Y_v^PW-PKzwrP87FpNWfQ`ASL1W9oF1TbYT2Z&h{5X&Tv+CP59y5dt;ueXLww*s+ zZY&O!aTt|Z+?ZU9OGy#`^fMkU)f^$4)Ns-)ofb_zJ*E2cl~eGEC>A_QbaZqUzP)C> zn5X#5bGbk@YI8opl z(?mWj#dP&VXxqW=#u^lh#f`u4wSh8a<>i_g3dMufHgp?qkJdyav7WJkuMJn&5<#Jv zTMuP^eUk+Zhm`*v4d_NOid(b;cKg&AX*eQIHZ6K8*QI z{8`VRyKrUQtUj*xsgI8x9e6*K{%zF1lu z>GbvaJ>&VCuA?>7=kJoYL{Ta|H`7S^ne{PeqT*oH;bLEan9IGjsJ0yWw6ruTM#h*5 z+b(V>_HdC7NTQOV2mY}|3+r!AADJU6bQ&RfpZzHtW}#?z1g$j2Fj@vvL-utVDm}U6 zTW>rRx;vX?l{mH5#o-qa0x;ESq|#oDi-CpZB^h(lcw>+){Qu5!{fc>eyuy{I`fDHX z7+F|;4}NdtI(P15zv2dYXY$De$lLULdvF7VH@`fsO}ihsy^Nl@y2M8ceiZ5a7g~)i zL+(H-BC1@f%3wPecr|PSMN5e%6&TP`b6?bqP~|;mnbGTqdH!@zjP|w`Z2{n=@{+&> zG~vYSjW#OW`hGg=uzsb96%cdF!l&Z35y$*O0AYI-fIq&>u-(}m>t8hAUaM@#I@8|K zQ3wEnNx@g-^XJb46}DQ3J+>bHlMzJm=d`Tv$;Dh%7f3^X4x`QNe zkHLZp5bhe&y!W5)GIoxRi(aJ`jc1KVAI**b^}PXzj`hs#cBn!TaH24mM3ST(dU3*K z4UsG|&I>~iKRRU98kL&I0R}42%{&FAx_xVLh?^^Xr_)}~@O zrr~tm`RH(7O$~3Z_dyil36`Hhe@5Oow#W~OMlXLYG48jY_!982q=~af7c!LL8;6g< z{TN*%34?42jKdo=qvS51Z4BHxh4A^VLl6^FQuc4;K}2slnfg&0q}nqBCTN2djRK5Q z1m~HUg5s`7kJCg`V}jnG^V{hMj(IJkwO*2reQYSwDNa#peQsF1Ie_2E)O7gQtO1Hu z_PHS0ys)DH$gz_ZUF>ZDDfF)L)^EV!v)x?yG~5_eoq%jcSBE*Gt-<83-%kJu7Kh4) z_qRO-6cyQiRJ(P-&!CZf0MH^fF0KU^fxq@yPkeT-xy7tXBC+yujYlvYKGP2DpY2Pd z*QChK&vXMSR#vlxMZGqH2H3FCu;atnl$0(=lHQ-3AH$Q#1@E|*dfa*?Xp{xTZw3w) z?t!$Uxsub^JlY*>R0T3P-0<-57zUUEcq>USOAM_K+6D$)t5a>C&>&LW4!XHg&9Lvc zvua)CGIUWnbgq}#yvDsydqve6R;m+vCP|;)SD^+npxd4x-V_TF!`KY{K+}*ji88cO zA*FKKoPMs4gY-EI8ZP2?TXGni+%d-o8~t(~)9PX^go4XwkR8AwXuU`oGJbJcBP>L7 z^k1bv*!*H(^42+1Nj$ZhZxIea$1Bq}i2sTfXKS%#i0aiW5+a|a8> zDH8S{=pZPwbQ-eHeA9G0?yKs85ZEESn>-DqJk{V}MK!f` zG1qUkUXHza=U9~wH`5bX{o#0t&EMqsxf~|o*0^=QE5O#qW}w7aT;zHcF*MmVXhJ)Ax(w$*Ya9X-s<0#SDHyIHCx}z)*!*!z{#j%w1LXH1EpNT zrk%LC&Nx(}bD+{*k5@pz7B*(Dp9daIHb>NWI$QGZ502Cpu6qQj-9$9u?$>?MKJQsx zASoPjXdq6}Z|ec8unNf0wl$gr;JO?QEiH=P(a?mBqWJdgdmsSPo~a0lDEKbn(5+io za7yG*R?1R%2W=iP85w?oi4O{SHh&M2!NRH8+3`Yq9St4x324@ndVInTx3a`8r<_zE zL;}y;1q8LQ==QxzXm5KZ<$b!qc{&Xgi=lx5=UWo;cbU1|9n&GGzSJjACc&!Dz#n%Y zNKptm{m5_J!viy~p{|Za7Yywp;2*T|Lrso?Hp~haj;Xb|Q#JG|({!ZXuS`s>%Jqf{ zwLaP<57_)Dy`gXbpim=$LG%(lCzKgFK!(ZV1Q_=tvF5$sCEB{Wk%I9~pNa@>Hy`>c z9&UbtE=v6G@>oLhNd;~>Ii{O8Z=$vT;TgAN$NUhZW@BJGR+rxNPyc+M?gaaYcJ(4= z@5lkzxJJxgQ?&PG$OI%a1K6IhAh;Y~cWnYvH78sNAPbV}W}*(w7g<$w3Ls@+qgOaU zQc+MK(awCOaoa+y$9bkR$*?&zq+w?|VKSG8n;XwEcuk{JPL&7F=+K?s51GO@l24xX zCPslE%3MIc$Jta&9v`h7yDtoIp+C1<%DlSlw*+|-&6%HywJ4zqP(m#muJPcxFLooo zez}eeVzI0z7jhe7{`%paU4@{nLE}$=Dbbw;#MB8y%PJiABGWexwQBMo)-ArTJT_u@ zPiq;v%ZF|`T%7~@S^Rl6c;2qro-Fi-kpbJA#;;7!YF!LX{SIIVuMpF2N`ta`IHx9! zfikeJPlIB~W1Ox4$4E6U2=SB8f4 zAjhpqD065&4g${$3Anx7;ntrk-EffvwnRT!9ME{iEt; zo3L?d?`tFBGUGCK4tY=BX7{Pc(2GV!3>*?x2ml`z$HduF?oE)%$03f{+1Psj_$r{F zI}BEA7jW2?S5;AqkdRQrg&f&Y=eO(G*-T1MAG0Fs?IZqf&)rN&O8U6{z2S&|V;bnK zDS#@ovN=gw>guaUhx;24u_8kgk-ipAPJ(6TwNfk4*(nFC^Ah0%4Dyydmf`5G=G?9m z8rlIY5dbWsKSXALySoG>3CWb`^{UDD@86G3xzp7+xP^8d?aWYy0anJPvu7_c~DJ1ByF&KRexOPZj8L%Gfz_117o}U5!a5hD0 zPY`|3>K}g;6%}(QfDH+TTqidFB^2$ii!4TT6erI{0|1@=cxIvM*X1OykP~@0yS<78Kb;0poUS4TXWGpVy9EY7cFC`_l3UpRL=4sUoaftl8Q1r=W zx>B_C^~r(zn_1+$W&&-+UHCw3!;Um}iJ3>K05Av>B+;C~IuOm3m6e-;_tYm>KM0o< zK*w1FC=IB~8S^Jmv6Z&nsa(JzaRfIeN@-k9SBZZ^9dV*IoCJtyZj}LZoK~_X!w-Vd z&8J>J@hGgi3G~sC2Ig*i=4-hj+W+;PxKuqWVRC4QG$Bh;F)-XMFPHFM7{CBl>D_(^ zyP^a##rNvYb`+c#H^PrN|7h8>$e*TY=~$ z*Y9{G!@(+m)M&9~B}O4-{BGLZ@+z-RD{OQk+PDLxVecOSKnM3SCv`tHH5`%`kAMJ? z!<*U#GR}rbtd-;r9N0@GMxvJDQ7Eggm3!8QRL14o=9W|gHxEyn{e<(|xe@6jz+|Bvl$<>`=gckjEGnK`>= z0@ULw@Rv1-w?--n;7Wx%%~FvcaQ{YR;apxuORpu+4F)884*0}(e}U{wiKnj0GM_`>!!CE!nuA|Bpen6OKp{rK{jmGmv=5f zAkQBUYB01US`eNn3k59|J(7C={#{7YzvqWun=wNFEu)#t76-%`EpXpmu;6Prd`h~2 zkLpteXTv*GN~+ZxY2aAE+9dRo|6xDg_IhnIglQ-l5!wqT`=2KRYuExs2%Y<3nHq>a zf|t=lLZX6>b%-TCoFz;Z3`-@;{-4u8hX3&eUNMzvjp{Y+40e{)|Ca8<36d5AyhQ7b z!NDercuSrrRk6G2282R5l^940FbCR=ki<=`Zk-}78a@B-GOcbpFJ;)uuZQ=FtoG_x z9t4o^MNkp^H*j24NSn4m)TxO{@a&S4!o)YX(mv34q+oa%-3zX8VJBg{fHp?ON{G7(_NvRhhfE^D0+1Gq$7DgT-SOs62Y2gs>Vg>T+DK_X;%sNQc1&kv8BFw zlZkKsS8m>DcjmK&tZIfHo&~ZDWC^r8D0cEZsRttvKptBm2_2X3>+wLGU4`4a)ShqJ z8*+&*V`fC&%7M0q*ZNDdTXD%i&+KWMpo=@Ad@P2Fz`b5WXVvQE>LlAFTQ3(zo?`O5%qkm^ z?2YU9U6g1-YwvNX6p2`IbKqS^D43gx*2pnJhc~Cx`kgWQ{G1|m5^ zn4(iVqjxOt<9EMr>HHcHFrE@^Iev+p(~t@yi~zjAUz%v<0Qj-yuP7u$0`0S!tExr8bCu`^i<-@*e7d%92m8a;ih&GUe?jLb6;@;C zf&RsWe5dlinD|xvjBI67!rOK>GcO350=Te-7-DUVKhS^Z9s_cY_~@|V-v{HDSITbR zUNL{Kx)}xaH5lOA!pNIvT`n-%i$NKX97t4dGHrtzPM0Dm7>ZGf;{4m|uLG_Vp_PX|okUTXm5PapHg~$8x90jGZ)y9s zj+FZhq3qMfU-dFXOf-(E{*u2DhMDU{!BnYuup-~J?*5)% zHXpH&*RP)YwHDl2qtxlG+Fj_d=WN5Rg;zQe9=xph&aO-}DeF8{bkO1084Z_Z;syWQ>CYqrx zIijyKog3M&Mx&xsUz*alz7^S~r+N~eIBmZ^_iR26SFm77iIz6c3z2^$iLY^&3)%8T zcROppJi{`2JEGWE#?DBFt0bO4-kM)q7Bkw*X~tw%GC3-OXP3@R#g~BGwwZLmRO%pS zNG6Lsa}&tTks3k4JB1{XtMYaz4tXBVdw1*3rCJ()b*3X)Wqh?QVr^NCO-%S~ybb;| zdHnv+$Lz;7!L@1R)02o}>Y%@JXU6$ddSR|1kvmeH1g0NWuNj%gTM|E9Iv+uSR*YEW zX~|Ccc+Q!MU95Y8&aWoJlCwB@v8or*sm)%K&uuV_%)Bm`+voeZ?ocpsX3%_&2tEAXE1fF5a{Dc3~-^lLT$x6%>IQ|6kC5n=dG4XDGh~uZ>i(b z2L{ZDHUF^qhwfK4pS$>^>0CIBZ4bx=iwxwSFW}3x83&cdDO@;zHlt1d0--~$kiB*6 zWi7&}rQ7dBe{QK;okvwI+~L}FH`&~;u%UZ9$>zDJ=}t^O`j|u!GxRctQ?8)qCNpQk zfCek0V%Vy*X~h91+|~EZ4)g0kbLv3I(Cu{M6^{jVoxorsC3OM4oKwLl!JGI zb(+0f@jJ@!wg2Z58}{iqNfT6RB+bxfR0=;_{UYM7kB5`5FsdGbYi|XZ&Gv0kt(D! zh-s{wXqZPJj7gb-hXgnq><2*-f!-= zJmF%#l0!qjnPOqWtih#DN)hgg_jJtl6c4Z{#b8hVBc!Xj}Q;QT2g2r>v9^;jMZ^+HDj?##FbH z-hp>EsAg)J#kV&3Rmdy_Nr%^rE?+fWtHHlRY1pSt97^*_^<+1f5#R3l>aX(BVLoI9 z&re?A*eE}m^*q5U6)N_C-4rHJ#t`{GG+PC-g6St~zc-(?G&_i2|_eoil_mdV?1o?mapk};gEnyhVM1$q`C}(5Vx3V(Frqk=?Ieh%mQSh+5 z&~c4L;I!Sblw3ZCF8`YG_`MqB1(Q+3w7Fge<$s?^`%agmZb_i(0p5snWVTSG4!L4Z z#C!6z4pTxxO)jTlziL9~*46nD-XlB=1z|0dWO(ie99EHc4Mi+MB3gLqcEl9Sy)7+v zZ{5m%7KY@+SLEeCd;Kfnz5N~wapdZWe`!>(?D5eF$(JnAtVT$<>lq%oLqb{hM{z&c z^Ad8c?&fk5#+Di>+v;1Didah>V6i{(_(>x}ThSwvae-MlqGSl?$s6t^5kr1khNq%K zuiQ>s!rqgZVvyU3_{d9qw}@QLfUWi>w<)GaLCUdXJQjBs%L#B=-of^Jje@hrFB=5-yB zq5jq;z~%6ss>)yGExvXW_dt%PqMbh&@)MV{PmsJ8;3?d)vzxd|W^VU#KWmZCCeg=Au@g_K5+TI1|AUtY5~1(! zZY2y1Tmosq^wIuGms|7U{S_I2t5%7#-$M_#hNc_5TlEB??9(QR?X5_5+j(58RO0ve69~F z4}5E-5Ws9j&iZ8>i|_(;knhI3O~YlXp@Oifa`PsnRx1ppQuh)Fl5k%Cg=-jXSFcsQ z3+Mh~Q>#Tiv}aj|porj>lA?i|IS-?NjYe7cA7D*SEz!i;{F76*_G>%KF^oD8E-|>j zd2X_WmHE_0ArTWTS}(x0Hm8#sDXQ}PBo&iBV_D=i(nvdc>s@0tUwbmoNDU1|Jh5eq zZGUCPH7&gIQ63M%7ff^Jf4(Osl4p6843d@%UZ33h_3IZB4mvr!{#%1D>7h6O^jL?s zVe_-z0?eqWjr8dl{w0HsFfNvPB!F*)>91UMUvI%d?F&<>t`lvgk%(%I()4c>j8 z7HVgLGm_o>s?@g}=7|Ekmc4L`cYig8*5YtBuDX&=NM)R=thC%K@=>fiEhkyHNUQ03 z2Pf921O#QR>a~S6Pt2=aTn1mxN-6!<)ALQZ$j>v$IMbn{W|;qq^l#YM*pz$!x?FX8 zjK$Q{)PMew-@p?+#>bBz`&Y3fv&ei{-0IIc)4%8?eCl8A)6Kqpf82^eI(v-5=!q2D zr%W6h4HB-yHp&}5t4&op8=j-lZ6s|6xW@=vaQT}CwTJoDXg0=d_Wt?r6Ir!%0S=Yx z>Hr(C?uPP~jG^I<)$XdMt?GAv0@@Z^3m7*!2JMAB8*t1p1?b*xfQdvQG!%QGKm(vM zgoeN0UDydGBk+mL|8D>JL8OzmDUYh0VvAxyrN~&L8Ts#AR{U}Z#p=^x_`^qDQ3=PK zf60n(N{8b$ebMho-Esj>U-^K%(D0n=-Y@#Yz52RdJVs`=7H(eYC|5&`Tpe1s4@xs^ zxsq8;P2YM8G_@KCjn~SoIinLO@Mz}hpI>)>u zVR25(FQ^H$H)NiP{Bo-#;cRg?zGr>-i7qeG^>rpMKStKE?&b?@rjaXnQ)G6@HvAEE z%LkzA!AF3D{wW2rKV2AO5dAOGr>pYK8_B>;C-jEl=7Ih0K*a>G)AhLht%XncA^U$j z;H-ZFni;`?{$Z_^OuWFcKktrNFu|RFu}PA4H3(}}tr|~!myVGj=E7B}fRFL}MwL=g zt5*_aO5#}digWJt^C|V;sHvSX`qnY4*!H%zox|stSn#J!C&KXedLNllB4}PcM>wP% z$U766uRPy(5;3jBf`qOUgo(+yxok-Idpk7{cfnjdm;0mXr+-k`keH@z509VLaVBXHA;7gwC1=k+d#Y*3E#a}rc1%Bu zQ`Yz@X}soGe(?T#wi8v@?Z`_j-=-WyGc>9uDbkX5b8!9EP^?MHod<) zFI-%E+K$hnp2t5>74qk7@lKEJm(uqx(((EiqMf(!bPfn8t_!42yB_sIJbi+sdfIiE z3Ih5JNI(z-pOCzO+)A9}|6r#c=)IJiN4d1FXcF3iH;x9VMhBfng9f9*_tuou9yE*v z-E6&u*I5-!7Hf#L9iAqfnUQ0pFUe;(o|lR-OS`M|G;hX6^|T3@jN z8h4y>(Sd~LPwniF4!Mc}G$5$m+W{UYw?tfW>Opuih7C^Wa_v0(!MyTu3&>SB*MLO_ zMJXZZFTQlWG7_GinOTD$m;}MaT8Ae|q@VzAMv6?JTUocLlrHD05oVKu!f(APhhasD}8~zCpScvYOa4ysZG8)G{+L9XG=LRu^rr0 ze`(Wc#~QantGz=V(Sm;Hiz@<4WA%)n0$_rK0W*?F;JvJ2XxU_8QOn6mV3j3y!yP0f zSrtto`$Zt(MTJVhRK>sq9@Q7VzWx@k;3_Y0WC|7`TZ8{7H@oZnv7{8$W}G7zbafaB zv(iNBuBX#)#|L#$5Vi&Ueldx7`4N=dSLBzoCEAJ{(5#q$|Gn$$QPc0n7bRL9>T@05 znEe0-cTi)YlVcH!2BspxX_&zSk0^kO(65PGbE^JjI=^7QZr>bE>Z9b2a0ocDD4wgfo9OuCmVb zTG4y+(=HC3GEg)@ZZO~vk&&qJ4Wz3eoM+Ge6Sser(G<_CM)4Y8IKfSyql+q}DsJea zp?W+Rh0MU1K?C&dK+dI>L<_c3y8r6vu~WGeQe}>C*4}sb z5L$ipTk{4s{-O(~RXOp?FN;NzWgWF7EtUf5gDJ$pVwO#bpw*;?&4?1|5$i%n6)8h# z6@)o^c!$l}Z+27;;njZ*K&N7QTH17FKT}(V&=pijlm99Ph$&4I;u=#d;{%$-XD#yC zy*S?I%jTta_)$V)X4UPKV$aWBIOkABSI2aN91~u*I3#Mu)O~VAYdQtNn;~)%suEGSrR_!cb{+s~Tw_q`gAFy|ct) zI5D}bB2l>|-;_GIo#+BO14GGmYnh&QEHg(>ic4$vQfm~~{24uHB<}@ulmb)tUsGn| zl~7cpV`73rj?CN|Gu=F$0{&~J*m(z8D59|uIan3D55@QYxP*HMGN=eXd0c~NP>~{7 z3VxxE!nfHjzo`bB}0iYimBK>gH)LjDL@4HQn#vP9{{b^A%2KhLJjzx`u#Ipad2B z)As#1a&x-O)_w-VKfij+>-=gQc06TjqcD|Ra|S`BO3Rk|(Fo~RxVqGf$Ch+FLpVI+fjRCL*VyfRW*RK%kr0E8a9YyyOz+9MU4JMO3yu6Qb zUh?zVGA{S^6l8(>OXHTb;mjVyyGlWHCLx>?N9}Ol$X;51i0{ckLJXGt>9?a9{fZ-@ z2aV=FD^iZ0L_~i}QP!oyei9dfgu|p>en`@- z*PtxU*w0oozlQD&d*fNraQ^t1y5x|RCSLh%t8KXQg!3;3&T5ST_wnO#u0;;RcY=l_ z8jK!CJ0T8Jt#|xE4-F24a`&m$;Qo`ct|k#1jfa1KFr9XyLM3>>;LpbMxPrR8;@jd1 zEK1##j1S|$BJf3?TDMC`+iYRRpZTCwXjDuYsfuN>!FwCB-9I|ElD5MWo5m?G&zy4Z zFB8bb($dp66jLPUG7-hFBSmyL4~e(VTu+BnsX#8X5txtoBu+uoX8w+)F5W?kA_li_ z@uwGU40tHdlhxiKv80Zb41e+B1$#bYCY-547_|6UZS zN(Ok6m%sjdt`5EzEleGs1i|; z%+Bt7{$jsg(Z6Rdd~wn z9ANrPE6#+?fr6=Px+B3WN&H6LRktty1Kkn)X~zl<3-%O@Sdsb* zzjg{41Nv@sQA%WZO(AxruAMaEqqp)ogA>V(mOf5ESF z)YhP?riyNO@)5?@_Z~d>wRJ8_#55A53>od~hZLP}4{j=hbo=p>C$qoFg4d=sfJxeW zL@&X^gFiJj1%gy9XoJiCO>uY!PZDH*oRpR3Bu*9O@7NO{*8N+igD_@%7S~mES}3&` zlPJoHHuSB+gpbiM~VYeke z-VQsSU&|JZhrTg!NYtqfED7LO3)jE66+m7<{d(`60;p@xw6?W{lyd_=Ph;p!diK-E z@`>AH=Q3zBtZf@OkS9h3IKkzVRXsdO61yMoZgu2Ec_o9#31_!{@o2Qhqj-3G)A&FQ zdFMPxnkXsJ>3L|ytD^?F33Q4fHEM9xJHUKUEp|nc;nj?AVhL2K!|q-W)A#w~Dbde8 zfS4W=hZTVe_=p|fj<|e1$!(1c^V}YfL(!iK{8q#yB%e}DMHqnc zAOb&Nc#4r0l{zO^G*;MPGqS&r@@$q`KY5_2N@wkqy!}4Skpbs*BngVZG?*s4fK6~m zks)&<;N)%p8`cC?oHLAg?(09_gFd~YqC#6+TSZ?#u`CNJ5|Rc)p@}-5%#5-7-y?dg ziq*yKGXA5hLlXUMzqP2M-4?+3fV!PfH&OL?pv#@b88e!lI|w!d*Nf^UKpfFzL8?j> z5kK~nSo!T7#~G9T_0}5)0aA&<+aqLrHQJGaN)gL=N8meKh1;8f*xKH@{6RF72f?5f z4OM!Aw{vmv2~3exVAMrGR*BEm5-u2?P-HXq#k|RRDIY3*)zL50rn~x9NcclUZ8~LD z%U|*a?nn%A`T9Hpm`h9XV)GeeALJRhwm`==1Lacv`gInVubZP)uLu{p6#gEjWCSfj z2cD0fC)d`7K5D(BU=Xmg>_roXogzb>A>d1x2K~qSzuU9Ne3c4;N~^>e)?~!qIq@58 zvW6GSO^|ewQCB?umvvu6!)~ixs@{>5VW6t*$j6l*lF@`kAGc1q+Fbd%c=!NRzns$2 zw15oG1ODuFc+;~6pnBKIewL`2CY;Z3CI)6(jPml~9l6i?qv}nuItSFVCztML@)?+fZY6 zn9D8R|Cn;?9%Pf9JdV&E41iHJa3qlVi~%RsaJG!wj($HA!G?ph#dddnRxWT;kjWNx zae*vS>yZiwillPHM9wq#iWY| zr%3Ej5Cn2Ks8}AqKJ$UL9D`C>;5yq7`3;l7sS}FAdI6{T1DTX(zV=#{lBwTn5HZ%F z;)^mOu9M4AmIjhh5ya%E9tYZBp_^625`77@{MRc-1Lhy0*1Agjo=snO5Mx6}j9Z)O zS_7}juK%6V3=LbiNKW14_NTNsQT`_cx!pL8S%q@f%j)^A3>lsh*KJ~*cfZ7+$G`gb zj^J7QwFiY`#UoncD&&<60qnm58A3yyk|#o&NFvv(7nfg(3f`;&7RF-27H(a`(n=mz zW{v|Ns}FS;VkPxJ!l9Q5n%>SBVIE>`tAXFgEvW~E{2?kOThBtC*2F1C3W~d1z?8jN z@zK>$N4gRIZ_rpQRysxaB4OIagf zCllI($gxo%;Ulh{Z~B!IpjPbq`#_n&%b_sPs{Si3>~nP5xcs?2L7T=7CcqEFMcnF# zHkgpxz<7!($Xn#mNR|L2E!yi>k9z7wcpX4~K<&(+hy`WW9jNczr%%%XC8O!!z>j*> z2+P|2b}|VDY$~i;A_-8-0V;cElXFL)KUIT=c=fG_=nbebY9@`2G?=e&oOq<_xpmAJ z>#1hyhyi&mEm(dupkoA?oCn~c8E{z%uh#t^GQzx}A{Vfc)qwIJ5C_RC%Vu^E&ZWNQ#lyDz=Irp`M>qOH@)ISB3V1>`35v;HG z;WMdE6FR1)*jZT0PS#y@mFoi2IidXRIL=`2Tr3v+AP`JOg>#aUlJrINWU5q6ss~%*=Kc%(-42|J*W%>w z3QW!4rnbAyeUI~isw3VwSHx=eQ{(f>LFcVgyn1?_P%*nVazQX$2m>TBTZk!>reJwb zPfsh^oQ(z}J(du-2X}DKMo8X;8%52~t7mV5`=vBnIZO!@=AR1F?rP|ml z!|^~DfexP9GGvP$728{i-+{aubB#1+mxYKa)uKOo@-(x}yY&}cW0AIr49dEMTp#fH zt`R;3KZn>1i2XXD<0h@SZwtL%%}lbw0IafNzXGt>&>)$2!ha^+<)CLE0J+W2fLl7e zN&Er=#h|-E6E8Xis`qm{05tdf`rA|EV7V!q6YSr~L|&QKdNxfkkhTHHtMFg5L9s3} zP<8W){=?HGsAfMLY*1VR2zhVt5K{NW{32p3|Z_QvLrhwT=D>NCTibGcfC=F(oopg$&9sAm$AmZe; z%+1XU*9pP8oQ!%E!FSOG3T>_)DbzIqZrNTwA>K<6^*f*fw)*^72Xyp473s>(-(JN* zUf=?&DN+s@#Cv7@Bv_bL0IFjUF!YIOaE;-sl0*`lSMn@53o#LPV!FfWuy#b!!=CHO z;Q~`y8ALU8^z(r#ac_n7g=_v_1C+U-+uq)%L2*AL1?ErrY<>Q#pn0Eg0Vh0{4h~q<9Q;QP(B3slmy$ZWYpUL+Sk(+xm`AGme*DlKClU2Nd~z~XgdC`3GV(cA z#p-UaequrxlCHXZsG}vGXM>KR16Y#Ow6sW=PB8difK~oKgsSh)98n_d0Y9ln;X|1e z{mXlHpz25WD<89gYSbrUy9~&2V8$Q2fp}MB^`S~@85Z@tTb|m`O^Z%ZK4OCN44-mx za}7uUfZRpsJ2=2X1_KFdW@gh7~HHFht(yp88)s1=v)cdS<{=83*g};Bz^2L*&jzt?==p+yX+#Jy;2U)C{ z)CvZ-3YQ@<5zD60lAZeF!i~3Q1cV?Y!Wck`=t8fpt)U)R zAc{R8T?Fi}_wd0^po;#%0H|e3Xs-pXsrjIBXyMQ%4=^n^yn+Btz`z3{2Vlco*8f;Du5rs!ux`w z1YC`%lLoa{q3%!gB-|lmWH7-ayrh)!_9rC|ysH81!gq~bLN`BYZ6!`Y$+CeCVh7Aj zlAu;s)N9AmByP0c586Bj6p@_&DkpHKSt|j+x5|O30j2n$C7gn++zCblA8IFFm{b5# z2b%~bO7f>{TzDWw02TkEOkQ4|#d9W9`Ed7fPN(WSQ%)i?bkbK(l9tIOpdKxPmni&A z`RS2(_On&nT7t=x63xuP9!|VyAcuic%lhqj*Ec1wgkOcYl0JZaH;_Mh`@wQ`z8iS2 z)Bv}w?JbtoCsKlL6-^0HU{?kef#K?a42#(@Id%z(t=IAmz!(OqPNX@@Bwc@ zbllk}p`%D30{i z4`|rY1_$adT=@Ki44DL0p#znW1MgZkhq{GPp9FNSg|KX>f)af%!Br4h(itx+XXs%} zuFB1eiJ9}D)@abbuD@3Jc?+Wtw?jsGg0MQ9bL8VB|J_Mxif#u&F{#<~B%zUp>mkYp zt>WT69M70kK%58ILBaRW_dD`lbEv5_a_sg$5jaYBI1S)RV`>U zyj4&VbiS@0Csp}14=rn$-J>qITII9n@IErxI^WEA~u#Cyml=)}%?mD58gxUKyAExge89LI1D{&0L)kmY*600DT2$6_Ad@*Bs;V$Z8=@dDMuH1- zuQC+gH>waEiFd4qD1`tGURT%Dkvn_ysfr2 z_w`pD6}K#2R>W&$bnmzNK>JGX85DjP0p^gcmgzU{2apsoYv@Cr%+Ydg17xgSaQ6Wujtkj2_%7v#_eWDsc)r3ZT6qh zp1Quj9ker)w;e>I_9DH@X$Ypx#8_eiNPdr8kA@>w0|hc zdHngMqfqzkf~qbeCWgYgsCI!`4h;B2$Q%lTY-E-vy|MMpjk$Jx3=Yrk^;4SBnirP(21mhtKc68mz|1aYPJ#nc9(0w7m_Ofuh6JT9 ziWESbArJj_%^a)2bAv519eCxNy7%lP!~F*3)=hA#p!}Ni)_0VG2TdWW8M;Cud4prF zKJ(LAe>>AQ9hRRv?aopw9$d~@n)s@*{N&k@vdZLSbJys7{1YD3TvwKbahcc!GALa4 zfQj(Ijb<|J;E4zNkQ0*&TgKN=;thJ?MnlyE-1zXL=dVCI1cq~OjVgs`N}J_wJ8kQ; z);e}o`xs1+5ov5(NGt_ik9;O9DOkCUT}I4kcx_4ILtzMVuiGN|+Qd*gAE!W8>Ua)n9XoU90mxQ!gq0x%;^= zg8^T-_?rHL=hO%9o2HYttorJtS>`(_V}In41qB7K5d#fIyqG70_SP~vl+}r#O}-r) zl;VcQ(ER98L%6KSJP0*%DIDvlzCx(IhwzmDl8p2xuPikXutiHNnuH`!ueg7!RsJDg0{E?zg-w$p%4lx zKIAeKS013LgJCD)##qYa?_rJL?-G@{_PC`D#e8YRiO5CxH`$e zlg$EXF?azaBqnY|s8dXZ!1-0({pYHF&lg`6iHy>$mBE8zqHm5^Y+($_f6U_>CL1ti zUJ4@5tNNHrqAtz~1ea>gLbBb+Jww$ zy8zBXfHJTHP+-kb8w&C9@n}|Ud$?sa-OUjrBmJLluqIy*q9vh<+BiXR8tJ}!DVo{k zIpOjZk4A3gL_VM1b?z=InMljSaJ`uFjboV{X+<|)O}W0zkf2s4k6B;XP>B6TF_ljd z#%63~Vqq~_1nFuns9qi++)lZbFh+vMAPIz5gdtfOWgAS7mlDmBhnznXa#-5bxb6cc z0XNp8yajNKjWBP>wK&JC;7QHS}{l{Inh*J3V_Lh`0#8H^Qk9;w$Q5 z>x(Bf6nJ>oqx`Br1kjOnM9YCym&NeG!2XN03`2faiA4(>v3Cda>EpAyD${h-5{sR_ zGs`q?D{%1?-#QkH;^Ls@Nz zAlEuoqqYO=l4yRGzf9a_?mSC|BA~!|(+>!!8eE6)8+u~*R}%$NkV_VKk%gbC#E;WA zEBW=HeW=rx^X4X8hPQ8Yjyi|u^onUI~WwS>EKv7PtMA)UuS3A5hg~w z!QjT(-av_SkcbxkWI?X-w#9#5ufPs*Ph^cYgu@Z~SZA9py z09l)cl$m~_u;3>Nxire5X9G_?vy#OygXg^8@BIFi=&O2$j7wV%|Hs~IO*ln}wb&aU z*sY%l64_$PI{QC z%OtR6h+Q)m)A;kX0nJu0#H-VCW!1HDZl!BSV?nTIRoV5d9-x`@$rhT_w_*(vv&D#% z4qFpd(E}l$>eqGgIg>C_zHw3=xAeNTbQxebf3Za{_i*{zG9dhSbOtRL!ZO|yVS(B# zuX^=~aXJr8!PDVYnNq(sMX~UdBz>lHAHgWO&-du!4YBpUX(N_0V*(5c(YcPmrVAba zD4nv78#^J*1s2WR*Q;CnP#Yn-2D0LSXuB6Yz=lCVwSy~w)L1|14N2GqNi7C>4F+j7 zp=J}CswkhPTg+DC4(s8>@8o~~Cnf}6GTHx7N2F115jZ_P?BdZes{v?h%9Yd|se=VSEIJh=7;iSM31 z{&+YJ;haEmvag#fx2a%@fK<31GNt5Vx5l;Omk+)l%FszqRq5VtaoP!8$xj}%Z(2IV z+i|0N|4o%Z3ac*^VGMYvg^(!0ut%x9F9ZbLdJ21+on`njpdgIo^G)yaX+R<=2tWsC zpbqGXJJq-|B-Zoxz+En#?Ca|xAsb(oTm_k@?l@7HtV2Iyg8+Nl888@wCI%^#N@qT3 zq z@lAVpOBB39D6AM@famfHI9*8Rfmy_R??U;xMr;c(Rm(72nu02|#cA-{$Ii|$`d=Xl z@y8?%qq#6ln?1mPjYj+t5r@z}0m~LA!mxDwSvu_eFpL#E$G_IBX@w?@i4j~d51YVm z&y<#XZMF7n1-mfZy{>XERr|Rkd!};-h1D-PwHYk!{>CO{n1HhKXyrHPlU$!R1x@K8 zEBuu!SKyY%0^8T@KcA-B)L)~g(M6q4hYYd^<3xreL&~J_p_sHG^EkhJKxA#>ZAHsjaalqNQ0yt z3iK8S`FI6zKOUg4Baa_yWq~v_1^*a~krgx0w*r3$z(a$|{9IhOr8YqzMMMSfcBOcl zlPde7cug#NrTY2eC!=g!I$KAN1#MeCODMThpv@KoVlo%#sHjG9!|7nd9oXnQ6PPwaCnvoicL%w!nw9X0Ll;` z1raz0+CAhaL~^UfFrpqo>n;R@E>Q5s+apz>7_Ruemnn2hk_y7Zv*1B9080-mK>gsW z7lYgeNHB^IF@H{DBzS62+I)XajsT9O_vZ`QiJZ1?*PpK~T7TjV;*7QVm?03wEF1SU z<1>7Fl#rhU!J`Yb+}haPzkWR=GJ&v01g-BTJl8zxXT5HOpzu0Cgk&)c4MO{_2qUnM z2FL}RrCI_rF=AkL8-EzCh!P(`!zi$ghz#+Q_D+Ch0Gb6@c5mIe6B+8lt{*N0F)re} zG3mQyt`tGpFSi$8Oj~e9wwgJJtQfIST5%QezSZ>bHBZJjK#8fY$R2yCXcClCWxrP> zNRos&{zg7oVB}4K+&=#OeV1ROUEfX=#gx?jK>mmfH_toF%8T~uBLX`=&z~Xv^LwQ0cTpCN z2#p*2!aq7Nq76pQ4%{*nxPW-UibFSpWWRanvrur)yg0(FnUKsMQ69?mHF-VP(IU?q z$p-LZrqa{X`}sPE{lHNKfuvU+gF+Aqc~FWA!t)3{1_=t2wVA>YfO=5EWlIJr6J)6% z7=yA!Yf@OhVM)GqwmRQB3AJHstM$2SH%UPr}v0Z9c;66HjVn>M`p$xx$>Mg=ge zD30CTX@*9G3_~nn0BtV3OWc%?@g^&T;0TJiK$q(YO7dnHXwD!br^7@kQqvx8CDgXU z4@QQee+x#TGe~X*L>Ho>g4&00Z^*xo4tJbse0uN9pqubDr3Qqz%DqwsJd^E_Uit>6ft3~+DM$HO+)*rF}G zFFz*hs}K2j{0;Y9!v(z|c2I3WE)2Q10!JJ& zMN@tNjL?Tia8s`I31^U|EO&}jubLw%4zZ@98-}2DN@YR;0BL9=cxm@~Buu(^Y8cbs&uZ;|Y0~qQD@t2XMp3x44hwNW}NV z0}KEXOqI%CDM%i6p=sjr)Q(rir$zfN`H^F6P8L+zB0-hBnci}#LNU9pXVK_?GSMn91sFz4o9IJsnYhvkvB8g3BL`;d4fWh89(G_e*Idv06C5P zVM=}ucj4<0JjfjUr=O1x0+7ZO1(@8`I9dktITkEP*Af5$1d}dfB5(YqQ)lviov^HT z7$S%t`u%>QW9gjtIl=N9C&<3^vO!j^$`b>3HSv|E@V}A4pXc@fR1olN23Klo`rx{P zGA_}vyA#>n+uNER3*%gnd~HkS4@a%bAsFz`kaG0NaKxJpQ6TeY;1A{H-O@f zA`YvCvQkp?kg?nB;5uoVa}XdPL^|@n6p+l&mud#JpVSD2e9P&TI@KpX**uV#9`4Rb zx8pI(539wuoNIVCMRf4u!z*CJg2tE#QE~&x56?|EyF|U{SjXjB1U>(>|1IdOoOY+9rhhW0KhT=5FaDK1hZ_B;%1yUnhnF0 z%S&UWn_Vq>Q_0J*7o0{bFt2fk=N-++=r!HoO$dfPUFVJ{UXeXBncZBY(&0!bQ*;M58xEMhYAy=Soa3UQmqRhCT^D=(LXsy3g-Y(m%k})5rvUvVIi!y~Ik1yXgl9*fWi38{%0Vfz(gd%L6?BgcE@+lt9{}Yy|}T!iF?g+LCo3NXdvZ zNJ-Cyhtd}#KsP2JCT6I;3rA8*RlFgb>GLmQ#K3~t2t4PXt&((zD#Oub_u^!pHe;Qx z=Ca~^*H;yR!_=#n_Of`Ck|=fR(=sgr^^WNT4(<;L@%JmoWmZgQ2H)<*aFY!2Cc%vK zY~&$9G(KeUN2pY3S?Z-(>gk!>j30)xd9^v3$W-iO%oCQVOO40WMC2T)sF84c{mjGT z_f?cxxS zhvAt)E~myZS4bSdjONA6kJ5T54m91NDAfXcIR_J;8UcQJcd#9ZV1w5Z5-3DOL~;fu z3PZfSy-VQ0fB;u7ysXcSorRSQ$aw-;Jmrx^voF^(I+0@+BVFPxDTI3{UnHR4^~5CK zwROd%{3MoFQ+(1Q4iY9fom!{K6uM+D?%V{bi-{vWtMg(3>7K)6YgT)+Ih)Ga==%f} zZx=p(<)GgOh?I0%2EDM89rAG|s+TSbD{vH&fjc10)LGC=^hZG|ZZe2KHtCV~MBS8l z>51DBy~Tb%w)8!+r~1|@8Ilq;q+^}2LqBh%x%l@pnzMA2-txe}Gd7!b%j#ND+<(PI z*EXQ7hBwcD6R(j;3yRPX6RQ3+z#T5yYNKTmpx5cKP~1QBQR`z+txnf>3cLwoF~O#V z5}2wWRJ#^%f?x`UhyER(?hei-wBKQm(n$i;a(E~!!Mmgf+Ddf$PlW?@t614qvK`BD z3krO10;W@E+?C$F95b0k5p?iq_?zyAUa-Lj6iAP$5WB*0bJNk_(GMzy>X(mM4tI_(3S(G=A7ek)gzi-CnAD7lK}5uYMOasqsu z@tls*?hi&65`HdDcBurV(bhX!nvzoDC2ujV#00)RF3?00qbZHLIr`!tJ={B!)478g zhW0$n4Ri9HlKPC3EyCkhKGepOF`U6D+Ewq?;vteq}A=gtWI@Kygc6TWl zz78;^j48zVsRZ4o(`;H5F{ID?@qEqBa1S&C5q{XF(}ZC+gu8z6sQ7l+D}29sSXCi6GFYnM zJw+g!i~n|)M0rR{6618ud-fm8ofiz_1ZehK_Il&duo|$-$3Gr}APVG7fPESV8k;9f z_|Y-{y2>h@3gmGk7&9Qp5(ri^AYk-Bm0TP6{!q=5>c1vBpwqI$T)s5pH-uxs;<@a1 z8G5V|khG!V7g=gultI8hf(N6t>GY}a$Md+Lovn?{A5bEBfSVr7%+F$3z~lM|d?wIu zbn87mVL8vz%L9uLtcB_rW>dTG9=lk5R^|8w(hR{v!Xy!=B-`!+U(vYNI zR-(3-POhKEQBimEF&XoD$M{Ir6zs!f$9F#7fCf&=I zNtdn(W*S_?IBe_k?aj+J*JmW_F}4Il$0(nZzspsFsr0W`_x&)wdR1*_AgpscDh>7% z!B6uH%4#%`gAFx$Anl3IH%zswx=-UUHN5sx>HRR{fEBj0Lh+gGfv*o=gq)koyzExGXQW*ww3fx` zl#^zn0@$668VqfHK|5ezOpL6z$RGm6!!y_$@amq+yGrRPcf97cRf&0pG`RXnwYItv?nXdRbdQFxVb2Wf5CEohLGcW58W(_78 zEul3T4$hwh=$joSXobB(9Av$vt`6K?4{>WqlX8jfeEYM=zSLic<`I1uZ9t4U%vw-+ z0mT|p+1n$38^XC41Q^w*%5WZDILL;46p@>Z`yv%ba0@_{UpTdXoczI~BMc=DTC#E_ zE35Pgw)CNW?{$^arAfmE0u{e#W>d>kA8P#Uh^$Y(5#IlkTx%c(^SUY!O&8aO8 zxDe4;fhNjadrTGLA>PM8LPKV4G@e9aiI<}xeCd^O&kW$Fb8C?0cx9j+RiGfr%rNdz zDprv5wg5oyUt2N6?i@N}G}Y!&--K3uz~pr!B7By3>#cAh?LLBEbLOpe2k^;hhoX_xK<)_e!=1OcR4Eyh0Bs&=c1iX z?c-*x?%2_A`3Bmby7znfaqjVN=RucbhQxu?i#0F+gw$=FLUew;S6gdRWHcD~fgVSG z&$SLu!w$ghASz|gLDt4yxBtc?ZF>K@=gv>U`CcB>Ns_iIFc_J?_Nw&h`38RfUP_$@ zG{ki|5y9qPMTuq)i(X33is=C@@C)WMc~yPU zoHg=o#|zV=?Fa0~WF?+ZQ1v-iGoNJ5)tRm0lLI4=N$^ueUAtjf-3O=n)7B$>jyw<- znwV{WePTX5tcLMVHPwL`Qt1`ZHaU=mlsaKC9B8u;L{jhT)z=pnb)_o>4bK6T57%&m zRM@_yo97K}-GPrcy5r(UDDhwiEWw!r>e;%)Z!O%+y8Ssg9v1cHBgQ&HU;qyD6j^IK<f8Wb_$t)!z$4l) zqLQF;4`iU`(9djezdBwU{7nyeK{RiL5h)mTBhJM@i-S5|V4v6I*w5`YJ8V_?1XV|+ zwKcyOxYF!Zy84K=9VdNJCVnKWLu^xjUQ1QtKydb#Rpm-9t?aj_^&p3Mb9Thy=PcVE znT!uD0_T2L?dTC6{~*d(U%PB^e)!;C=SN>A%%fj*3o11=i1B+929s1m-fD1BEm?X{ z2v+Jja$t^0VUNiK^}}Ubu3d4-3dHNw;cz;7mHnCDd?w2G+}d?c|K4Dg(&liipVOSh z+boz}eQSbJ1B@-^pi#l)Jh;jStIE2-nq3R#bRg^?AqXbF0CPzh+h;PMsKrev40#Co zSl6|0VHy0#M^=|umZoN^C6y((&S@}^! zuFDdGXvk~xfcY7#CSEabc<+Sg?!--{2J0xdwVBZMUDvklgZL6Fg`nzT`P)`HPaexG~9-4c{>=_^D6seWsw- zpqxv;wbSE%h4s2@f=I5DzZ$midWzGzVsFCGKzt>-o^MmbX>^6PN5oi-ZKMb4*^MX0 zd0DD^7AUfEQ?=dJYK{tkK(Y2kqn8JKze{Tm(a8uiY0W68$5HkXnP$<_yklA$UR~Vz zo>75hBCBE*{b4=R+_seUJ>QH(1@ix>8^S4j!7~ki~Wk~TGD*gp2tV)?+M=t_^m=urnoyC}_O3sS* zam(a=*-Y?vq%l>TGE8{dv%NUIlYE{fGFz z?ZOPWR1Cm6XM(YH2tx9^&;5MQm-&hSx=ep_v(>(rYf{ZO?o5Sdw_ZM@W!V~6_pURn z#AaT$Ca8R4U$42lvS32mv&F5?9?yg%-|GdGxi#mwv@qG3RM(%`Iv3pZb5?Wn2Nq9otV>|kDg5A#sNUWbIV(PM{We{>M9 z($1dYyP?YV)JXJ*r9b%>8L&mawz{V=Z)rN8!e&1~vXaB&YS~rHrjpBkM=_}4_oG`>bj(bk&{6YyVY>0#oTPl}ffB?*qw_|3K$G47RFwXiN zwpiVS7Qvy-1Zb-BA$)!xdb}@81cNo){!5=O7jz1?vaYjTqW4FZKMyk4XeVXN~ z$V(EyT@t(KBKhT2{-UmJbD^6x^ z*(;Scke1Mr(V5X)t@nY^Z*H!KoQlrd?{rY7TDyin<-0WLA)pP}VrLT`hZwbbz1g!U z@Fi8ia+=(moxF;xRw0F)0{f90K*R4>zi3B(VKJ_5FP&@$^u#H+NzvL3dB}?-+z}Eh z3;|5hi%NCL`gQWHA)Fe#mJs3!o+A+?Y(;N9co+D1P&VIH<*s(-vj_z|*XU8^Afk3t zy{vO+=ZmmsYZ*Y9JaNHXyx*J6J6&vxVr^a~jRB`7lC~NtI44)Oz1K5SGMQkMm>;%R z?HEmLp&q9^m+w2OmQWkA5YD*Po@0#^t)Yf1KbU#q#mCU7AASqX2UptRt&g_V_NNt` zG|9?@=@zVvpg}Rv^XJdsYr*k?Cu#>QLJKfEzPADk4M6p7`O0mR6l68zV)JIO=(4NG z8$8+8TpKMQFA4A?9Xi<3s%)7`mSZvOl!{?w_$&rH0OlDaxV4eJ?5S)qD5RFcW&apA z)%HyUZ;PQ>q?KxHQV7$Wp#B$VQ)}Nmtc+EIEl)$&RhgMJf3mqfzR)f1$SQF+iNNx!>CP0 zsdR^k6it!q`$k)9d9;n27drx|u4S0^PK9$&8?z)_NZ(WTD$YCI9lUHbbY~wJFQIS40jt9k_-ezYXy0|Sd0a%e%Dik5@H zFxedz78NK-5N2M-UtHD5Y0JFltGxbAg)KI2sN~ZX(|neL68a-JDzDVItE2a%#K<&+ zIB-(YGg=oy^3|9j;=6QzJ=KwKZjtYG>^{6gP@`eb*F_7KvZI7n0xXdQNfhJPisIo) zGtl;_b3o?lbbigZl`Uv=1+O)7492jTH*PRt>)(Mv4B4f;B(^df)} z5o7~cVV^OQc7X0Ozc`z_=WH3i?B4aZX2qrXY)13x8jt0dQ3e!esmhiW)e5>XDbiK! zcqXsjZEVGf3(t1tU)kMn@l8$#4ocUrDEj;K#wE!9P_$|Kl{3bP8(uR?M!iC%fi0Fi# zaF`(3vkm_Ahv?DYv@L|~*CTknlcl9PTz@m`f4lgC{mXLGuF>mGVuG}Isi{iEXpG40 zSV9^hz_w$AR;8zU;L9lPaB!>5Si_mC9=SQT$7GJT<)4(}B`~DC;fp^aFQFD7#HVt& zU?_J6+BLN}SDH+f=3w@wMfD6`t-7M;dd=7n~C%7>-e;`Bxs3ng;97cu+P~vL3 z$G)Bc2n_saFBd~#H;)@pYDF_Wq%4cx(=^K7^_OFNHJ78M_2l?k*6F6NUDb)B0!@TqUO-UvROG}#y2 zYeeh#Z`oRY#dvx%&_$oYn4HbQWrH-2lhe>}jvZEig3wL;{P#{^z{gAm3;?&Oc%CYZ z!c{B3@spgTW5XL?39Z-%KWEp`*QuB56B3}~i?_wN)kzj|sSJ#Jelsgj0%;##IbKOlw;x-;BmyHS%o<@r04@5xhISM(k(6UUJ)JI;KN4P)4`UC5O zAcT#e36kvM+|&jH3M5_2I)LUj1@aQgXuxvX3>YfTfCDJ((-k9RZFZAwd^P?vTd=pT z_>9Y~Kav{BZi=BaRx@PYplC_$)Agdi_*hKufg^_*{^^&pR{qlmH#>#nC`XDEOF8?gm*bHtVTFbEsgdG)hxL1qsP z96*9H7h^|NGpH!JlYZOmMQwyjkRyl9VoLeEzaT@_g3};}Astyfw$#-<|D3Uk*xA-P z{Al-dblp#G<8@AF%S(YyFDQ?{>kejmQ?*s!XGfNvHfg6=aFb&<#zyK^z1&*Jks$tT z1KWaYynMPih020wCBL1GeW;Y^B-+ohQn1#d%mbM4j=*#dZF2|z`RxU8ceG!dhc^-0 zR)+3TFtDQ3J}5p$QBhH+q~8HtfDEutZb%J*oXdf?O=p-fbfCajNd(u$X4tth`nD_8 zy<`famt8HW`c>Hr%4@eYB1NFtwabz&P<*b(mLts|BPZu*>G>l7Ut$;9ei~rU>ZIq| zU81xn&T5HI%20+3D)vv>GPqgZcO~6r$r)uzR__|R%2N7I)xDO}o#EpR9yWDjUQF)m(;B(FwNGuCIvIwW|c)+w&4 zip??J>%x0qeyz~vx9wnF|EghR;bj-|9?obh;t8?WAGJ@59g~S+dxNA`n6snRX^1ca z8SO;YSVED(720?LQXk-4M$UH>ErtHcbErUGCO9sR7^G|#{F!X?z|9v{g5QrB4^Z7} z=DVuSR_}PJ>-Y@j&7Pyr!p@Ojc}e#H-K5ysZ+)-k;7HHf;)m~;xu}L;1@7;CN=EaB zP(V(jPAFjPc{@)Kax!R4{Kv%c$A_l=O(Pc3ql70|9t8w3kVG5=K9CvMbA~n&mfpO% z0$xu~h&BD|oqJ~N;NVbK8I`ZP-eYFUW-R!*aM@3yDoI?mJotQsI+rrPWhJw?W6oE6 zSw<~p7NPPfsnPV)Yp2`AA6AaMI20r9qE`hs;k!c$*AVQ}sstOX;XWzjHwLc3}qf{9c`KnYqCD}OVCw+;ry_NqM*Z*eyY z{5Fq!ss!miqdwI$o6jqpdmt%GE<)^Ho?w7S=0O|?es6?y`iA0yH21pnB&S8kRx74* zjofi0qa58lpq3N-@*J&T#hB%qrC7JQ0iWL@3>`nw{#1|yt+xja`=1?QM(b$7^?(`+ zK^h!PtENZ!P(B`>Vzgy4C4~k?xBO^P2Le#SP$GYcewiHk?qE9eE+)y_dl4 z8rG$nCTXUm+QgvKcX$q^)QP!c}l88C_zFClc>wVT83;opp2^x% z@?k;+A_NmV8b>Ct1NRN}`i_rBojdpZ%stWKlflvT$1x&;lv8J`b?;?sHb}@6Eg6{d zClot~hCF&o`2oG8Std;cz_P>-(a9v(hfR&X9Wv~p{d$1DK#woHYV0QY5Oo7Oc(nBf zngk>Sat{1hu*X4ubc+88%$O_y4$_ovKSQo&KfQxx%;GilxHxb@r$wt9Q(v;l-q(9B zMD0mb&NLDFdZ&h9U?c>b^URlu#2cJdEpd(Wd@LgO9LT*5X#C!r{R|Q1HRq^6yOIp1 zL6$oSo8B-12$BCKZ|}kyZqOP^?L(YfLo4)XwJyMQpEIzwW`pT$GQhz%BP6`(X88Dq zJ4hb`_s%bhvc?R^DjJr4PV0}5Qo&lst*3X@M6T-gks;uC14fT^N$Xv{N0E0>uxp0` zO57)lk>{6wNjfN|vBekDY2SXb8(a_=R1nw~krHp+W+`#HyGy`J9k2Oayz2stQn|M# zi1vI4mH^5i3|aPq7y_VWdK92R8=>tgNB`5}45a?`;u7DlmT64BV7n|pmnPZWyjfV0 z;pE68BNuc8s@Mu9h>yb7%HANOl(p&a3HSv zCG0|k+5Yg@ptwC4!hWipd$$+8?;w1EBESHBgXQfw7=b5&Lz=Ryt7|hHtOqi6iCk%A z-LG|6$_ysHdTD+*I_f|-^vx=I7%Vvou%%+-T4}HO*uKoKVkub^eSEJQ?BiBC@k zT?&z?*BP_z+>3T$!h{|<=e3+1H(<?trCy@!ul-5gaN|6+$csCOs$^1ekQ?oDslJ%_fy zf&O#)-U>K9r>_|C_aDbD@0pFBF98!MXL$5188l8B8HDAksw$5YbN4xde|u&9F9=2m zt>w(2dIn7!$m|ds#h}j_nw(jiH1U>mz?vJ3Y8lEz7}(W^9N9>OLKgOdssh%7pWhe< zsIz9~dc;c`=^gbFAF7z=;BM$iuaYBE?=nB5OD+DUlMiFJ`F0BDrTf_sH%xlltSyfaCPuGkJoc+JC3}`b%#q=i~bMJKZrMW-Q8EJ3W~lG@XeqFn24PYPNunQzThj7 znVSKO#jCrv3YxaGrItZ+(s!#k9aN%beElT2#K>+--+MiK+&aFRyCL_5tQgs4mh2Fw zUI9nSl&hvy0@>b>Q|7zU)kn*9WuN3Dci&8DzwhpiYkbWO)bhn)7bvrZaFpf#SvHlo zs^~0<+rlX?L`eq;2s#E~^~~(-i)b+|hS*6SP)>yb53~K6CxV>(FE0Mvn#L?=CkrBQ zVgzUh5mHP>JAGOqbiopFG|_%~OHdV~MlSuod&-zIo>bdaj!}xymYQ4sS*G)2cFjNY z?e6TzS%ak6vrGlIL}KMk?5d)&7zPatIIa!f7H)90rD0ktkiIx;j5nw9qOX6HTcG{s zljN@)+T6&NP+_YljW3jj1nfepvth+rCV=FqP+bOWSQt?;Vh~wF6zAScKkl8<`@ezn zSCs$kjS<9@({I0-ex&{cxSMtEkEy^g_DO*~avDtJASvZMX~xAbOTA*zd0)MVbqDl( zIpA0*WRZ!JpShLnd7~}Fv)a~c@GP(`iQl<_4Jbr znE^O2_RuC-Zrhogd7-85<~ngDVuFQs+FfL@DMdSqXZ+(`+DEc9LG%Ki4A4wUiXAOX zfkx~Rlc?|lq@DjOSU>D1j%p7~ZxFEt?XaJmoWwPR&}Cmy{GYfRv=$RXD^r0* z|Nl$jFsgH9*UeFhy}U0qNipXcZ8hcf&xi1B(le$Oy0R1p(@byI1bE18UnhSfO$vQa zCaAa<&){*J{2w+q$}@H@+|dN8Oy`KjvgTpjMpL z;D5z5@67oW+d8_r0&G0zVmhyW(PlYObN*(@c+syCAu<*Qp=T_SC%X$0w`Tml56Z%( zn~vu5-}azvHFS5=06Y<2{;#d9JZeD#AEJM|e4S`vhcucYXez4@J7BB`i{v?BMGW2j zXVq?<9VBI-tGI*vxx%0+R?^+VQG6B*!3MBtBtHR zIgc-zWrNW9zqx4h_mn;Yqi#Ha_}c?K={>HGVVo%kQ42(^Q@gOl=jC`_J!Wft#pC1S zBJgV?r)=<}b9KbrR3lfS#Tt&O`+doaUaDD!ZdDZM&qifi{ z{1JK!5+REbf`<+r8rcx7m~_pCc4c^!|AEjH&|TpSfGiiHVL^5293#M$MhTIvjR)ri zQ|K;ny*!{R%W#?_ia!x{s`xdx#g#m`6cSWWV;VG0X{;MBLzTz}cy67cEFj(Kzt)bY z5rF5+863k1!WFgB!!6?pc2!+)CTaBUl97OQhXz!WKq~8oHOi=OLV}2a>tl4rf_u{) z&M0sXORoOsJqX+{Ea(0*)I+)~tELtrG>`sqyK`ATd!;`jnbCrV?wYsdwougxszx>6 zW1=UDIZmHvx_ijl3yxHFa_)k9X3}}Vz0yw-_KuqOF|ne+d#7cuBMEV-ATn0*{m$*% z)9_XUE}#yyFY^CwTTHRTj}KupjOgTq8mt?n&|2U#ArI2VhdYqiL8&)D@utI=gVU_} z>Hm84ENsntPx?$wmIrsKoBY9pEwH!VH zO9$il6?Yhp6p~F)7=v_H$=f3~`DM51!u*t#&F4L&k9S=gvRRDdY28_A(*n9gi6Y{a zH>rX+I5~Y-47@vCm5Jnmu$Hh{pjb%U)!WcA#~?_6OrKAeC5J}Hta*aM%WOO=^g{IS zjHBG2r9=B(|1XJ391=*Z1;fx2McKfep48M}^r_+eQ@-S*H$McO-+pUVCA$1V|MK)fLYWxR zIn|@np}CEkbuc1pRrZp-epsnj3UAFX=OM({tf z!qqnL;Ddp_J|5=bXs>Tr*t+)#R&eawR*aNO!H);%_J=hf2sd+d1HzHq{BUr`x$qbz0W#XX;5vE^&?I=5)53K<0+r=5RG4`!l4`6j z^=qEzpRieN*Fq2g@wDJM4sKg=5@>y>P7b)y=dt{ULQh)wJfGjN!NB+G06uN^#{_N)M^)jncx6ZpP`A?woL-|ro$H-+vP zKHwPc0NC;$#0l7fF(*pz0dKXvKv77j^pO6opFAI>qC1)2K}(NXV~9kVY748WLB4i~ z1aflp#Q_TcmhAYqo8jsS9y9~d{P zTM+!;k9vQYrVicE+zZD*CHLduhaYeYPSW*4@F$KJVNs9JD)WvSeRK1eYb4__?QJFW z=mXLA!7CYl`}$}X@c07b4BeJ++LBHxxt=d_kDXe>fcXmBL^%Oa zK8ytF!rb}yFGVt^Z-meBdU<(GLVDH^fMw6YFbgd75|9~e-+DIRTaLh*p_Du08;5?# z%r7bXZUd(pHkY9(C(6*m!FpHF_gwNAxenxj@46E00)7{nc6`hiJ#fH&gBJyIp+ZMv zThCqw9tNstHe*v$;z#NP1}rrtW$RMW1u`%!R1Pf?OG$o>rC=}Jd=NbQdAv>-Y|JSD z#3sjLb~b$Bl}?Z57q?Gwelff^$b+%5vTpFk7E!!_R%~#X5#BavkpWCAsbN`NU@J_3 z1wf_*80=AcR z6dniK0P250_|R(^fmP{G;MU22TD2H5WeyL+e{Hx^&tx;~Hw(}dBb*%}!H zyRG@dngUQVN1K8V1HJ*stq*ezik@(x3llpt-#`H1#A%d5hVIk=4ARBobYMrNgq4PX z=h=fHvK&f)xDHo*_rQ$x^*{M;wbQTPz8?4pY;wzhc=d$if`xT!ttPgIoLPgAnF+g! zk1%U~nswe(p(4OI%4QxIn4X~Wei%0Vr|0i?`M5qMJqZP4F|Z8aBEjN~9`BbQ;6pU# zRJNv(p8&+}vhtel*Q&?Mk6xO6Kok7)}^NSJiSLJS9puxGq$j=H03pnpyee)JWH*m;1G zg%mD4UH~bq+dEJapi#Z-TZ*tVoOU44HHvR7e1(McO-U)9TYy-0hjmFO)ez(MY_=U zfa@Lot^f?;t!1pN2;&P5N?jct4BWEIP|ik3JVCbrD{w-~;?^e#tI<5 zexN9d4WP#;M1zOW2T)ZCwPRh6DI(Sw(5=t3uW`iy(GPI7H=#O0fd=l7qwt?Iux6y* zQ11MOb8Yas^lk%Ocj&?*;xyE_$tifK@R6Q@*n}7fHlYD=J`u+36tIn?K(*ci{tMnj znjFdWnaY94iooS}u&(25NC=tQ^<=V1sJ#06`-AsN`_(xhvkQbvayHWA<8hy6XIu8c zm(f3G(N2RIP|Q5ZFlq{X|EvQR-{~AZ%7ir^6#sna!h5Mx;6OpOZ$@)-^R=gHtgKev zCr5)a-72}skc+ksFtb}DyIaR9B8k%-6J;qmt#etB!k(CL-k$WEfk!OO*@a}Q-q*SD zjYlURs0QvmM9%T%U}50It}TK_i4`79Yw$zE`5A}X>EMU z{(H{BCR1S5>hB-p=Hf~s5HN9KJn)k}VC@1TKSJ%B2wZd6InIJMI^>5OgCCVL20+2K z`#TvCjhG$-C`)i#2f!{Mlh1)I1G!@cRF*K{Z$gmZ)I`u@Mr4Tt8;PHKlfHgO^|4+D z2gdU}wv0ZbOgBrrJZg_5l1ksY+w7B*7=B#(7BcjsRJPCY)_ih0FTd~QV3bti;fS-9 zpuo0UX_sp3$`%}nn( z11mW|N5Sn{F{cP0Jo$|>XCjg8n%aT>H)&L<6+|6drExw70sA$Ycq?#9mzEJHEM;QrwAs`@wSB}-f^XZeec||WZk*t z!b#`>)~G*hlOi4@E@>V_Dyi5!!(zcvPRxmDOd~VwA#3v>Sezq?3{O7A7%!K;)~xgk zc|av;@I4X7c=v<#f+a@*2Q{C;80auPZ|*LL`(08B`d)9%@ig3KcKg#ubj)5cN@OBu zFsRmJvPje&#lK{bE8jzhe|3V=)&Or~K5TD$kuJ{a9I5=I++8NPI99&$`v;Mg-}KD+qUW zL)0$nSR9vW#O@B~so$Jqp!-&Oh+NO&;@y+^@wygxyKizjc=>U68@}4q|EIby|Hm?Y z!@li8i6}z!w8`2+(Skw?EeOdL8hax&S|mNjC{bz360$_f5{W`06fKXkRFbU85?Z7r zMc(7oe1Ci2Kj59u%x7l$JllQW*L9ued7Q_299&nNu1`zj z`xn>Fz2e(4X9ax9=BSAEt}_*vU-?v2=oqiGw-)>XOt=CE zJe4AdoQ^nqin^n1I9uWq6G67{k1S4%jXjC9kmJl&Iz_SV@MU))^P}-wTnAlExCA5= zizGyp!t!s`Ns4gS1>fgB@x_(#s<@gb8zM{bXG5U`+L8z5)Zk)uf3U=ffW*amvX>qlOt z4=0z2l8VMX$H6*|rG$L(-^FwZ7I410^W+=gNZ8fen~EHba=6&md*c1XT(NWIP5xvrm0yxH!)p6#2aa-Op>*xxfNf8~m^!^`)T1Q5!eNHuilCG!r)IrhBDdxYPs9rSk>+DnZ|)smvUploc*e}T zA*&2J3KR~ewTUXIsnvWKg5pti%bGX%7g}lPWBJ~hBPp4-ugcmC@~SNCJy%le4667}q`7%& zpW(VT1+c7-Owvxvf!#h~oo%1hS!p@9$uJqk*~?m}MnFnMj1pB5#*>Ru{2|3bEr+#f z>uw33nx!E%B)8;Z;X2jab=tAQA1WUk>Hcg!)myjdoukxs_h~i;?EPc0%!B2lCbH9B zv4YR;PmmlnbzGvcHlm}P`=-bv!yHxSb^*iG6{gR-+CQ5|3NC#!ndn7Oso)R3WbWAx zikk5)A^V!sE89Xb3-Fz@%s6T?MP9S4*L{ioi)29uMQ^=Z?)dz2`xmut*Ir+rp{c>E zl_Z*4#T*Hhc76NA`@*$c0q$>1a`L5evC9?ds|wHk{F1W&?aKI`mZYLO$8-;|@$mfx zTN~Pr@nO(Se8vn4nQ#};E4z#TxP0Y`<#%nWVzz8~5_MF|LTK_PJo0_b^;}z~GJX9G zPxe9+*&54*+Q+!sFWQ)A^e&umo}H|e+xm<4;I@vp0;*Or})IWt3`1zJ(nmmb0V*4z8CiqlP zOGQW{fB!N;-nuQ^i{sX+@CUgpXIAvCtq*gN^JLx&No)<`oGkxXk~`xO2|WyTZ6>$K zM>RE67!u?H`4S!mCc&^cNxQ19qEZR5ix5<0ECq$hc`wY9`v7Fzsnc%m7$!J!B;#61 z$r{q?S-G-s{hs+KATuKapC`}s_z~?HrmrSvz=3YANbad~GCvci^Y{l%+g!~4eCIQP}YIZ`X{x(Myw>hbpA@qy)D zrQf8brp6@Y`e+~6$o2A5;OVmVF)7NoAI)33YUD>qidJFpa_;FqYQwJT9y3*hUK>~_ zWO6^fti_|7|HbuARg;Gzf4SoU{=+%9Wy1KSgt%^K$B6!8dGl1VoQbBZ|A~R|oOWBo zYH{wWmviQ)2>lLVO{zi?`4vrrSCnG7)rZYyn{p`%Y49+7RrU#ehJO2+c4+kasvDUa zCn|UB&?vv4zC=Q3i>n-)`{L>46^+B&KjF!hwQ0E|pO4U2 z%ks_&d1m}>dQOr$Uzor6)E_P^=4-3|SGLK1e)*JD5BXka8}8xFjacye_Vs3-um=K4 zHJ18~0=HjEsY#v^uXkShJ9zeVu1oSAb=VeSBYY{#F!zvWvd*{bR{Dv*09(_gUIz$q)hN`^n49k9pHDABS#eoN81l}2$ZxG&{QGWf^<%rHcqq}8?vMvos z8)ntLJH125WLWP+dg5d?JI8&)yVh&gH=M0n{=P1reZ;xo$8E2e24|ZMo+%P#A1|$r zReQ5+N!OIgr|_;<`)x@AU$M9>&!#!vuT)TJo36e8yOK_gdOi}k;M1bA2fqv4T;U6A zei!5adr8@js+oG*vc4Vpjd4u9!+y+jfNKVo>&y54E*0aFjarK?^1UDVucEELxY43* zd*JEGg1GFB6mHKRDi=fhr3)sp4jI&#qW``40M~he_uLB!Z*d)4!Jxf7k30f2+@JA= zrF4X=-}Szui+-(QSm%Kj2o|3pD1u<`OW8m{^g+B(i+|vB1H&D~(Y{n2b;*ns@a3`q z?odreD4~>2fEEo4eV{vLk#NOgT%oL|P?eoXO{9^Q{i0-`L9?`j_k_ty=?0pERw~iU z+IN_kuu*u8uUWZr7IQWxW~cJug{+j~>ft-JU;3M z+*U~l{K*LEf2rU7?vybA7LsQ4b_6PQ^xX`h@l%+;ZrHYTDq|dmjy1p(nn>||4v@guBS3@zU-L70h@CL}01?h1$~i{x?G6%bVxS!Hns zXhAYM1)38QUN%lUcqeiq^!kZ^@gc|GK^Pq!Bim6b+vYOh2+PCE)1zGk^wQS z($^u;ARQ3$sfYSg8)q4<>g>U0W)kOKo((sJckCCeaB_Xo>Z)8)2-Fj)%sReQeMJG1UFRK_VvC>n?6x9E(km! zaOt;mMp=!*>n2zJ#=vI2EhxbDxzA2EcVr1H3i`hGKTIaGNJM1giP5$H+an^(Kr)$0 z6c6O+1K9*Wid5G2ARS73<_xbufZ-5tl0rG@4LMGhva)em(z$cohNdlNKwYoB$}wGb zEN2f;IsZ7UDQclWe-TZcdv*s~Lng-CC$ew(n!D~Qv0EgmS`Gd*d2ymiLSc-Cm~h)# zpS_6k&)Br9->6g;PVjK5F@%8BbSbG&^n9aVw?1kfHnZy<3|SSs`k)#VvXa%!5+Wo2 z0f}T_#E=&+T~9BcKAjC>50RX`YSS}*Oy8O{wC>kwE(f{D|2H7=1rv4207}T}5Tg}@ zebQ!uM6XxvZ0s(C-{C!NC5Lq^&U7BGuBjmxHOA1?d!+T?fct|pa^dhtdkZwF3Mc?1 z_q1D}oPmtfFGq!aaNu%^vou_BP`3nA@(>#vD~10Bni~R9T(j*vcJ`;SoVfzZ>IQ1;B8yk{L_YA*zEtI1qFuL;6s!w1fbL#<^`05E0fpfT!!Msn#+qOjm zDt_VpQ7Pw|Z)9X#oDwYEvH}A^b66U?We6x-e~P}2Wz#IM=NR)O!zz{R>D_c6T!jh+wA+mH+JBo=^_}uRMa(Pxc;H zPhIBh^Equ57e~z)s1ygW(3f?aH(p2+F!92hn;F<}_5>@ogeE@*ba znx4NSe%LJ5x9GcB0vPrIFtXKx7Uwyn`Z$=Ofn9X85iMBsMSdK#OC7$nxj}Tu^CF+^ z!;^v!BIF~WOmztdFvCX5N^M@kp6w5JOO~KNL^JaI(_};OJID~2A>n*TyvpKce#bf@ z{XyibB$M{#q;DjwX<4KyM`DV%E?$(q@YDr1KX=kjgXFhu+qTm^x7S3e3U}D}aYycs zMu*PS;_ci*{_M>OP3iwclInB?J+vnu{~(F1EB?*B>4UN zz0BR6>QSl!9jpEFa2`TOYOb!XJP=NDUwd8fXO@6BgzUWfQd3gM7lzTam1i-Tc_Jb_ zddD6zxo2b`f`OIQ{VnE(rN*I^nwpZRb9sn>G6g-U3apJR0XBxV8rz=(A-oBuDX0up zXw&=yLA4i7i#ci=H)C;g@r%x}^^o1O%K%~8+;yh%H6`cC$EaQn3IVxg(3A!`&IAA^ z9_pM@Sy`EkZPTq&J8J+NGedaTX<6(b2-T!tkKBM=;XvYw^#B1PYQI>Pny1O$HCse& zHN+6&1rcKl6YYYu$9^s-YYYo$Y%rBinPQL;Fny5-Gd|}Idm#6JsAH}p&m`)IvvSGo z({9ZL*)~5w(k^<+t(Jk^1n@r1rMcne5XZCyTRivRCwm$+@oG#>O*KU|0<_ub?AK%x{b$E-B!f=wE8thSz9|&$1@^AedIR8vy`#F5L-Rw zw=X!Xw9$uryiotu-`KOUZ~)|1T(MWH4$>l8yp!OmRhx0wJnNeCB!2k=K^=L~+OSDH?Y(xsV;E}Cc_ z24`x4ipmxwVGCBTw$W9yElR$+t6*;|x(Knl$L^A3_7KpbunLE>K#5QhA(VDk&DtG_ zISf+>11W+W8wvTjKG+B0TufSgB6Po{je|on#$gJd^g?rgJ(fi`L=U5&B(|9(jOm=p zj?%yE&*>EQW0~E^L)ViAw*J6)tuMMryPyMt9}5%IgI_gpSJp(OsWntXX3QBc7(#%1 zG;4RjTrBiuK-vsmbBMWIDX zSN6WG)aGN^L?9l~zbG)rr5o(zb9R+4<}iI3Z8m-L45huR^4X-`gMg9eP{9q!)(CJ2 zH^5Ax3k-4RE4tntY+inT4*K$cU<1)>D7IWbHlAhXd{vp2(BJ!yC7IEXf9tbSkS=_o zP!-J6sTc4wR~gOQ!Myu3P^ zJ#e6(Pd%$SV<$rq%OIZ{i6D&D!83Gsn@W!qHZRY-qf;WyU;_>>bE*_9^h6hN2u-Hw zSZZ@cV>uLhQU`^~hn@D`#ZF;@8~v%}8vMJWza-;zLhOo>?!##^EA~iI?h7ZH@!~3{ zpem=uQFpPZgMxy-_v%iZgu&~(#)lAk2JNnR_SOs08JJd=S&>c5g?B)C-U$L6DB z=Up#Sj@Y#bNDMVEv|TNtk|bqiPhpI+(350<$!REUEtHyNr)`X_Zi_6uycMw`w(rA% z)$km9GyM7DuQQW1R1z{Kva3ULEo)3=@gD8CJnM{> zG%TLPoZjT&BPHbI>|Fd)>q8NSUs~BeK3QFk=DBGU9y4}i^y`z(7?$opNwlj>Vc#qi4-zyOiGaAv;PlxNOfQ-lD!*V^O;2d&mzq=Og>a=}&XA=@W6v$Zo->EPiU{HLs z6zi8%@q-IEku73J|wWBl3RwBP?`m=AxkKhc{!V6y|rBBB95lEd`C2{nRBZ##kTe)lz0r ziU%6iDdMEUOkTn8UKbP*F+j~Z2p#)@5j(p?5_AKVBp6Lil&g)|Q4hQd_n@VZU&@8@ zEtDpwQT6x?M60&(U4(TdA~H$(`5%;LsFK1AoNskIOyA&ex*X0&-VRj%xvm}m`dm@F z(AZ!JT9I_VVv|x~{0nVvi~gUZpdOJ#9gYhpSPLO4{gI(TUaN={j<>8yjk*Lm9o%Am zjHACk6>B57!NU+)@n_Jji~W2+QV|SGA;T~<$$}a@s&M{^Fjht0b8#^|Sq)*>Y$ac6 zR(mBKg+@Q9v4XgE5{fq4v18J(A`oRjPT4Pi#EeUz3>TqF^Fb;k6xF(8a%coJkeQ$q zkl*x-?Q4Pn#`leg%Ilnhpz92}jgZ2m!4cqhviK>e4;cn|mcFS3dUZF~9|njZf;wyg zb?zva2fK3+OHto|_=5Lc^84HoQrMVEk&{3ARg7k0!NMxMl|@r(q*?%Tp-L2~CrV06 zs?W587As9zgj%C=-%vbgPj>@fQYF&=Vlnw`sy>B}R4)32G;2u_m}Zxd_~$;E`dYmg z55By8;@3f9ArK#fs#O}vR)yYjKrjs{18jT%PW=-229V&}A)Lxw$h1ku4a=nx7Jh6H zINl;fQvdRWs4X~@XQRxalo-R|Y|@A)7B=lmJV~motZurAF|MUV!$w9(sn?2qZPx_e zg@lCQp%M)l>=I>=S{>$oKb`S&yB|7k4Y?AvYHIvs?ZxtYEAbZ3zAS*$$JoVXM)CzKF4fi{8o z^yvynyClW_#f*gz(*%###2zfE==5~O@ij_HMj+zkBsG6H;Qsn%24L#w(c3H*V(QQX znSDjwe}bO#j1n2oeI=id1GpXNMH_jtq-k-<-waQeU%Sw`osrd`M6{|SHE8N|AyrTx zIkH$;7imiw?XeH90R+!ScA;B_KGz>;2z$Bf{CGDHkr%uTRJ-BzZjspK=Vjvw z+Zq^9PQmE5r)13#A2?^#L zEJD3*SHI1$b>4*`H;uioOmxdoSU7{Q;e4ev*D;tmi##*taM||}eFJj~pmXM1;IMsa z!#uB|H~iz)$S>-P{XAhT)!)d?!&47_#Q2(p3;9XEn?Y^XiOi)4-HhR%D2H$rbsE{$ zU*hBA!*LNP3;G)INl+@zJjnA2UA58CQ8;MCG#?Qb7On?Qp!}l*G6(1llz*_s+#N14 zH3=*aIdmpcZK^Naf1?)|s6)F290?Y>K7a0Y{QN1i2%vty?gZ8(VM+)p$H7z|X#4>8 z?G0W))=5(iP)1AQ`J^Oja`52Y4=}PoR<2Yy6FH@Hq%9ni-4V_s<~il%dZbxT%wKE; zU}XXziI0s1fKM?8=YSMOrb#o29C7Kb;N_o2&V6WXFDs=VkY&2mVpqGr#C!%8s%T5E zGmSL+q}r5i)t0Zm(W1fZlX9D+omfutekxu2GqYMg?ox?X_O~?TB)iYH5BO|IXxodm zpjh?aDY=L#-ojpPBE+ev3c&d$4{gfz8yRG!a@m4+HTeO%5VUFbPnz^V8e_Vx%qnOTu+U{2Onr zmK=B?2x1b|Yu$6yO07D|SR_DQ46$Rmv}`Jg-iO-lopYX*3OU@tqC13Rl898EEJM5+ zjS>%n3W|PfRm0BRc0J3*#l_FU_Z{P*WERYj<&OW@d+bz#`e@pfNlS#NVy5`J&S$oK`JTvRVh`;kqjYJL7nNqoAj&Hz8Y4G6SMkJeB z2Z_bgvLanQ;;Qehy-nf=?#Q9Dy^vt_06=Sp@K0+ZdDRn;-DtaiDkUly*Bm%zg~JuW zGypybw4TKP`e9T@sBx-Tz2xWD@AO&nroPJ_fTh?4d5Ci;VWtQQo`v`MBYff4pJdG! z|5bsN2Xgn~UuEZ?x}1mWixIl`h|$&XN|=Wm648PH+a353$Fe$H1*V5rb$+{s^T^27 z_9C)^$M;2bRS?xOo99oDf4UH&EdL@Kcdtth!i}(>6ZqY+aLS^%D~~}GNCUMI7{X=L z{LgT_Jbv^@5eL4fcxdSU6hj0BI*n1JF9spdKjRaX;l6lYoAvbAxXT>SAJx&CZ2aWv z;=(~pRzaeIxn#`Q2dZ zMZ<@R>Jem5(mDY}IGK&MZ99W(bT{g8)cM8%0VQK^T3Ni7AA{_NjeQ0O_RMR sG_WSC9JHnA6AcW8fsy@x@b+KwtZ+@=;El5$F!*b;;WmSu^$vgkA2de(Q2+n{ literal 0 HcmV?d00001 diff --git a/news/13.bugfix b/news/13.bugfix new file mode 100644 index 0000000..a045302 --- /dev/null +++ b/news/13.bugfix @@ -0,0 +1,3 @@ +Fixed a bug in the reporting of an error caused by an invalide datatime +string. + diff --git a/news/13.feature b/news/13.feature new file mode 100644 index 0000000..b66b45d --- /dev/null +++ b/news/13.feature @@ -0,0 +1,5 @@ +Added a new subcommand, *plot*, to the *ww3* command-line program. +``ww3 plot`` with download (if the data files are not already cached) and +create a plot of the requested data. + + diff --git a/pyproject.toml b/pyproject.toml index 63ffab8..55369f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,6 +38,7 @@ dependencies = [ "bmipy", "cfgrib", "click", + "matplotlib", "tomli", "tqdm", "xarray",