From 5891c32bf613c6b31aa36051f307e6f34561350c Mon Sep 17 00:00:00 2001 From: Zhou Fang Date: Fri, 12 Jan 2024 21:17:43 -0800 Subject: [PATCH] Update docs (#56) --- README.md | 56 ++++++++++-------- docs/design.md | 26 ++++++++ ...{space_overview.png => hybrid_storage.png} | Bin docs/pics/overview.png | Bin 0 -> 41942 bytes notebooks/incremental_embedding_index.ipynb | 2 +- notebooks/label_studio_tutorial.ipynb | 2 +- notebooks/segment_anything_tutorial.ipynb | 2 +- notebooks/tfds_coco_tutorial.ipynb | 2 +- 8 files changed, 60 insertions(+), 30 deletions(-) create mode 100644 docs/design.md rename docs/pics/{space_overview.png => hybrid_storage.png} (100%) create mode 100644 docs/pics/overview.png diff --git a/README.md b/README.md index fddbe92..03b0ff8 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,45 @@ -# Space: Storage Framework for Machine Learning Datasets +# Space: Unified Storage for Machine Learning [![Python CI](https://github.com/google/space/actions/workflows/python-ci.yml/badge.svg?branch=main)](https://github.com/google/space/actions/workflows/python-ci.yml)
-Space is a hybrid column/row oriented storage framework for Machine Learning datasets. It brings data warehouse/lake (e.g., Iceberg/DeltaLake/Hudi + Spark) features, e.g., data mutation, version management, OLAP queries, materialized views, to ML datasets, for simplifying DataOps and MLOps. +Unify data in your entire machine learning lifecycle with **Space**, a comprehensive storage solution that seamlessly handles data from ingestion to training. -For each row of data, Space stores bulky unstructured fields in random access row oriented format (record fields), and stores the addresses (pairs of file and row ID) together with the other fields in columnar files (index fields). By decoupling unstructured data and processing only addresses, it can efficiently support all OLAP/columnar style data operations, e.g., sort, join. It automatically reads data from addresses in its APIs when needed, e.g., feed data into training frameworks. +**Key Features:** +- **Ground Truth Database** + - Store and manage data locally or in the cloud. + - Ingest from various sources, including ML datasets, files, and labeling tools. + - Support data manipulation (append, insert, update, delete) and version control. +- **OLAP Database and Lakehouse** + - Analyze data distribution using SQL engines like [DuckDB](https://github.com/duckdb/duckdb). +- **Distributed Data Processing Pipelines** + - Integrate with processing frameworks like [Ray](https://github.com/ray-project/ray) for efficient data transformation. + - Store processed results as Materialized Views (MVs), and incrementally update MVs when the source is changed. +- **Seamless Training Framework Integration** + - Access Space datasets and MVs directly via random access interfaces. + - Convert to popular ML dataset formats (e.g., [TFDS](https://github.com/tensorflow/datasets), [HuggingFace](https://github.com/huggingface/datasets), [Ray](https://github.com/ray-project/ray)). - + -## Ecosystem Integration +**Benefits:** +- **Enhanced Efficiency:** Save time and cost by unifying storage and avoiding unnecessary data transfers. +- **Accelerated Insights:** Quickly analyze data with SQL capabilities. +- **Simplified Workflow:** Streamline your entire ML process from data ingestion to training in one graph of transforms and MVs. +- **Ecosystem Integration:** Leverage open source file formats for effortless integration with existing tools. -Space uses [Arrow](https://arrow.apache.org/docs/python/index.html) in the API surface, e.g., schema, filter, data IO. It supports the following file formats: +## Space 101 -- [Parquet](https://parquet.apache.org/) for storing columnar data. -- [ArrayRecord](https://github.com/google/array_record), a high-performance random access row format for ML training. [ArrayRecord](https://www.tensorflow.org/datasets/tfless_tfds) is the successor format in [Tensorflow Datasets](https://www.tensorflow.org/datasets) after [TFRecord](https://www.tensorflow.org/tutorials/load_data/tfrecord). +Space uses [Arrow](https://arrow.apache.org/docs/python/index.html) in the API surface, e.g., schema, filter, data IO. Data operations in Space can run locally or distributedly in [Ray](https://github.com/ray-project/ray) clusters. -Because these file formats are native for the most popular OLAP engines and ML frameworks, ecosystem integration is easy: data can be moved between Space and other frameworks, with zero or minimized file rewrite. In addition, Space can be easily integrated with frameworks using Arrow, e.g., [Ray](https://docs.ray.io/en/latest/index.html). Data operations in Space can run locally, or distributedly in Ray clusters. +Please read [the design](docs/design.md) for more details. -We expect to support more file formats (e.g., [TFRecord](https://www.tensorflow.org/tutorials/load_data/tfrecord), [Lance](https://github.com/lancedb/lancedb)) and compute frameworks (e.g., [Dask](https://www.dask.org/)) in future. +## Onboarding Examples -## Table Format Design - -Data warehouse/lake features are empowered by a simple, copy-on-write open table format. Its metadata files use [Protobuf](https://protobuf.dev/) and Parquet files. The metadata Parquet files (aka, manifest files) store the information of data files, i.e., file path, storage statistics, and column statistics (min, max). One row represents one data file. There are two types of manifest files, for index/record fields respectively. - -Users can query the manifest files as Arrow tables to get insights of the storage (method `index_manifest`). See more details in the [Segment Anything example](/notebooks/segment_anything_tutorial.ipynb). - -Space uses **relative file paths** everywhere in metadata that gives us superior portability. A Space dataset stored in Cloud Storage can be mapped to local files using [FUSE](https://en.wikipedia.org/wiki/Filesystem_in_Userspace). And it is immediately usable after downloading or moving. It is perfect for incrementally publishing or sharing datasets. - -## More Readings - -### Examples -- [Load TFDS datasets into Space: COCO as example](notebooks/tfds_coco_tutorial.ipynb) -- [Labeling training data using Space as DB: LabelStudio as example](notebooks/label_studio_tutorial.ipynb) -- [Load custom data and build transform pipeline: Segment Anything as example](notebooks/segment_anything_tutorial.ipynb) -- [Incrementally build embedding indexes using materialized views](notebooks/incremental_embedding_index.ipynb) +- [Manage Tensorflow COCO dataset](notebooks/tfds_coco_tutorial.ipynb) +- [Ground truth database of LabelStudio](notebooks/label_studio_tutorial.ipynb) +- [Transforms and materialized views: Segment Anything as example](notebooks/segment_anything_tutorial.ipynb) +- [Incrementally build embedding vector indexes](notebooks/incremental_embedding_index.ipynb) ## Quick Start @@ -213,7 +217,7 @@ huggingface_ds = load_dataset("parquet", data_files={"train": ds.index_files()}) ``` -## Staus +## Status Space is a new project under active development. ## Disclaimer diff --git a/docs/design.md b/docs/design.md new file mode 100644 index 0000000..797ef65 --- /dev/null +++ b/docs/design.md @@ -0,0 +1,26 @@ +## Space Storage Design + +### Data Files + +Space has a hybrid column/row oriented storage layer. For each row of data, Space stores bulky unstructured fields in random access row oriented format (record fields), and stores the addresses (pairs of file and row ID) together with the other fields in columnar files (index fields). By decoupling unstructured data and processing only addresses, it can efficiently support all OLAP/columnar style data operations, e.g., sort, join. It automatically reads data from addresses in its APIs when needed, e.g., feed data into training frameworks. + + + +Space supports the following file formats: + +- [Parquet](https://parquet.apache.org/) for storing columnar data. +- [ArrayRecord](https://github.com/google/array_record), a high-performance random access row format for ML training. [ArrayRecord](https://www.tensorflow.org/datasets/tfless_tfds) is the successor format in [Tensorflow Datasets](https://www.tensorflow.org/datasets) after [TFRecord](https://www.tensorflow.org/tutorials/load_data/tfrecord). + +We expect to support more file formats (e.g., [TFRecord](https://www.tensorflow.org/tutorials/load_data/tfrecord), [Lance](https://github.com/lancedb/lance)) + +## Metadata Design + +### Open Table Format + +Data warehouse/lake features are empowered by a simple, copy-on-write open table format. Its metadata files use [Protobuf](https://protobuf.dev/) and Parquet files. The metadata Parquet files (aka, manifest files) store the information of data files, i.e., file path, storage statistics, and column statistics (min, max). One row represents one data file. There are two types of manifest files, for index/record fields respectively. + +Users can query the manifest files as Arrow tables to get insights of the storage (method `index_manifest`). See more details in the [Segment Anything example](/notebooks/segment_anything_tutorial.ipynb). + +### Relative Paths + +Space uses **relative file paths** everywhere in metadata that gives us superior portability. A Space dataset stored in Cloud Storage can be mapped to local files using [FUSE](https://en.wikipedia.org/wiki/Filesystem_in_Userspace). And it is immediately usable after downloading or moving. It is perfect for incrementally publishing or sharing datasets. diff --git a/docs/pics/space_overview.png b/docs/pics/hybrid_storage.png similarity index 100% rename from docs/pics/space_overview.png rename to docs/pics/hybrid_storage.png diff --git a/docs/pics/overview.png b/docs/pics/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7f0954aaf3220ee0c2c08db06827e434f49491 GIT binary patch literal 41942 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 z

&5H#?8!aGZ?8-vBE$bGh0NybH7l1W44YyX65i6dGU+5zcR+x?q(kJJ<8x)!`h) zYrbA7z2jgpR!jUr{5vB_CZCP6YuuSa(}_E2DeQ|z1|5Bc1N2KgVMH&_s(E6nm*?y~ zQJ1<=(;0Wkt=h@;z9Sc7SvoB{K{2$)s3EJPLF|fRo-j^Lq;P(TF#pK&p@UNcqcWMH zI8mH4#sk|`xxB)k#t#|;sHZG@l5V6axO8m3rJV>bb+Brf(Y^f2!5nEx*@?xOiPzey zm@D{w5l9digUuD(@FssLXX~1;nRX<9=?;>c$md=L-Y&06>qJegK}IC4L(H%Q1ysq4 zxr*t`<~}k9!gCpcl`Rq(_BZzxF^!dgnh3woU*HIdnq`FbX7+R01_Vo4i3k<=7kxpR&n&7IIGy&SF zDqD{`Jqye#>2+HGtNImq^&-^`%1;B#{T0yCXeGCwnE{9jA4#$=TFRbCs2NTzNQ8a& z9AM_l<)0~^0OV(cltb>2+k}xvknGti7&`_5Cg8m|9hNb|kZDtksT3i)D#G+SNGxC3 z-RkCWfw_6u9^oD`LMjjT!KO^%QUeb_`0o2uu)Mb%$HkJK28iRs#?Cjn^nZ2{ZORj1via z9^BeBQDClsmQ!!lS~=GZhB6__9bF7{E;9wMoa`pb7z86&HV6Bg*ZZv?ePmkFAuf$V zzAr<(w3q#iY34=yCj6QxtK|^!d(y%;Is-t}Dk&FpKZW)$9FKccq~t_*$Jm0=4fE5^ zgFgv$+{15M9X`k)-LmfF#P9L$(A^p**ObhfRD*}*0Xlun>(T%RtJ?%SH!ET~BJpPd zE&~mFYbVqr;T*~momTV%ph7`KfU51XfLs3B)e(_GXr&vGRSQ)0D0T$@;KqYAp!efX z$y}Qv7lmPr{YFALo)`U6BDX8d4nv{hzkqrBjHu!q@{E;|4omOhG8EPE8$v<#3T z@UD-n+VsrVsip!@!x0K6{9ce218CGqXJW=3097%QG==ylO#F%Zuo|p4FI4IQkG%t9&8@ozW_VHQI95FxG^N9b>fu>ff$u z5`6Z8$$NZdOO8Cdr#Dooo{+fP2fP~Yh?8r(Cn&b0fjrsOqi1n@Jr5sZu<{_B1CgYJOj^o{p$9kF9`sc za3srMgu1u!YdS!j7urJ0xioKGLm~5pMfnWBBRybhyso|>V7mf;QZw^LZLGNJ+UMDo zUjY(O09^o5BxK0YX3ad)Yi|Bl-?v5{vu;_cu^d6nAG%ron)Hn2!y2QC&Z6Tcp?Cy_ zUu@PIT>mh|`Rj%PJ#41&95vw}DrCO@L`NVJC3Cr3CmtHWyhe>e`=KY$8R23GgAaBjC{jqSf_nL#(~(@Bb3kW0H|^CNz4d-qcxnFHTE2-iXsm_KIZTT7OA*<%=Q);S2w`MpP1b)vlOE=8r4MyR>FqNV^7#$)J>B2v9wMrVwR6%nLw`(tXyklJr-g z%{S8k^|!7JXGKY3MC_x(rQNy*Lb+u3ooDxo8a&)cL%9#N4cmJTg36<^7nacu-ue!S0r|{3bWd4# zHF0U2lY1BC3;qQBl)}m$I|(w)D5aKknvO}Dh#y3kYLvJQ>@5$Ejny$wvpFDp>GrzOj<#$TC{yLd!H15B3Xxz)(!sjXQ zRfFI4bFRIz@@y9oPw)NQNM9)D5N0Oob0(TNX;H$w5b}gY z)COmaZ;BG)ccC3`E7x&$d{wgs-))VRq36^vD|mbV(Y)kb+4EQg!dheXkar`ilov&?Wrli9vxdr)1@>8Z)*%5Nw?r7JHB7 zgC~1c0+sue%Sxrc*K}0KM_pN z;tiIdqhXrv58tquXt!tmvv;U-xmON16J`=^l%UhgkputMELjS%rLM$xN>REgZ(P(B= z0IOZ$vOKw0wF0l%haHPm;zSp=PM5yoNowk|x>;lC2qZhXbq+UU9{oH28X3p_wL0E7 zDs8qR+Ijt%HA|aj$bh7R!Av)CZfZa(BDQ0V{MUQF>3Lq*-kU}|wjEth@24rL#n|@< zEEg;w@^^8XGw$m^)u0r^taTgg&yP{NM#W#h*3Q}82xDVe$W@EWo?08dF|9&)5o8T4@&<=KfzknxWG2tiSp{UOz*;gG zqNz3~=Y=oG5w0hHrDUf7Nd&*+ZRX2lIiRGdxJ0dhyeMl7cND{A(r&)dhXMeI0ozXL z5_6#}_3Kh&BkeDEy5JJEJe;3w#-N)8j_+U+fX}frE@e`fm03KPyzbY>1?u0tA>8Cf z@QbseIx^Vr6pIn2k3xUzdUFBCb3hy+EWWs1DU3MMShT^wJir6s%zdmI0VoZZl!;C^ zwh#c()$*Jk+dr!A{{qfTLiF&13gk6FNs~BZdVe4Y`1vzYz~RGsc{ofA3~1M9YIYn| zCA0r|XY$s7n(R7k3HT@fD;6ed6SEw=x$A9tp*;S9=Gz^5jz-tzK2>8E4_^1G zn)33NXgxC?D)iF91zIq|q96sYYV1m6YHw(BybGWhmnbU$jA{#uI{$301Xa58#K`^X z0p6;`t2lNx;htu|`s+~vG9ogY>DDD}1QotVoAj1%&M%MjTlP{NqxtIQ9q0?k_)9vj zHYnjM)K*xAt*URG*yB+7aUC#3Z-U&G?DgQbFFjaQAf@uVONIy_#-#4*IXF0YXV_br zh7;*A;mLvhR7isg6+l>`AIHx;Mh~)2+*Ds1kyj}p&}TM$d2?tNouEV}SG6=C0^1w~ zdJrXrnV!==bzd*}iq$ct+6^bZgfz|jOh^~xAHIAlF`XBaz&r8IArmY2IE zIqbTsWz2pbc1OfWgpptYK2youe^2GfWjYxQCTkR6H|2D27~vAFAYIP%qx%>+y$0lr zM6-bzu-A_#Ng5~gpFP8L#KOb{i;+^Xl|QShs(v!#T{DiX_4-WyEUJoD^^ph;{92Ue_BHmanj_uJd8G+-dM|AvKr_;B9hVfKY{2#GLmHL20n0NYWI zz0oSiIbZDroAX>Z90o=b^oD?SQkjw#C=<}ypR86u3?B8f2mldm*c6TNn+ z3l+dfr5dp55#N0#M68sx<72CW`UlXih_8F=^9%7F_qf0|AWVfnBI_J9$NF7N6(k$7 zTQl_OIs8*;X^3&1BrFe$TR1U+EvYIP?PxeNLY?X$TChR&tR355Hahx*Ka}f9NVN0H zrPM>j)h~asI2jIMo}a)*&F*r{4_Ri7oy0l4jdV$2lq7DxVM4`9{+1@jlE2EW)c6PC z+B4a3Q1>*csrU-G@-1Qo$1DOQ#5-%8_Kr$J&hriQC66kfME&;(Ip7G`^6hI=Z*LV~ zHiVEz2K%kY50idxY{YnZ`t#$sozhx`IH5uZ!^P2K6e+WByO&sOs^f%bynJn$#@dNZ ze}52R3MA`@N8$(7zGC@{^L`E_!FI1S6Or{)ZaK%BU5WsbJo}ZD#y@%vK$hSc2+a?A zy1Fh=%*l2@-0)(G?$=q9pnY7prw_tUZnr3q0M4lX_;Gts#;H-r&S8GtWXRSyGt*25 zU951_IXuVbFZBehB7Ja%;FT{@)3H=*gcLH>(S741spS(8cY+e+*CjX-9Qh+{s_gu5_Z!9)~b z>;cDvH{_v|chAKySth3%#A2IEgJnR^6wg+z{RsG2O8=zHAIH`8S>L;N4>#pKBjn>n z9kW0Pd5*334ph#)dd>Q&0{R*MSh*E+hYn$+;KJU1)GmVdpc=AH5Kles{~X-p{t#t_ z!jw2^lGbieiWIdIiNG^8>DL1i6~O`uxP6vy{YF%V3+FTNBH#EMJoq_W3N+s+-_hP; zjqOcSU26J-){V7-S`(%0Hw|9HGRyGO3Vo_UM$?<&2h0GZEjhcmU<)$kY!zzS;5j!F z3sdp8!_htrPoFoEco6kD?h76uv|>4e7~buQ>|xIHYX*DE$d4GZ*3{0%QkRpPLmreI zgh#FX!;=uXwoOF~moKL&wcXMU4j}fL^%zy(0=1DWna|AJN(qDSSKbn>U6&7W5i)%N z?Yg#4VhxI}Gczu|!@|6CHOR7{SfH`&K-R zzSORZ!Qvv?{g~45NeI*OX(luKvd1xugN{TnsqIc?14LT@KEipA`Tf>0lUHPT{s37M z5#IwT)Vl`Qr*_!(($cMF?;X~?dwD)LN@X;Be*M01kHGp2n-aw@Hxiq| ztoFK&mxb<^D$0D(#5cBRR~1W4Ob76dAlgs0=x$=za&@LEVENzPBy`x$6it+BFrmDc z9JGXrfhjwtf00f9GUaI$f414M)4VVT^onq2sv>`(;Nh&UC#@GpUbmh^O|;(lH082} zdxkLu3mVyO^_nqeuiQd_j>+%*a0GC|0^Ylx7~T>l#s+lX*iWjfJzrE9@#ps1A7!75 zkCmZ`+++Mqy>c!c3lTOg)mOV4H64LbD`&DQu&t$Uo^v6wm1G{xXcuklDc@OZ#)wY9 zr}(}I%?p9ZmgLaxV?Td^X1GuzC=F)vlKq7Bo)jJsjq|f!76z{-LS27n@}l_f`&|PV z8U^y>evd|{cJjgo>fE|A>X$TCKL8;_dDY2ZA1-zBAya4R#@PZ83ZWfH6@iR`<)%>m z8|~0m75GWs>u3ss0^WvDe%~gyD)_5k!FksA6jE@3x%;f&dA2anY4ot$Q~Tm=xSu|) zy|%E=I;4av19@eSR@zZ%+GKv=^BV<{zO`=AdGS%^rP`S1$D@_IFvZG2DauX5U8ygB z(DRqdjb!CbL<~60(G}Sq(OeItum{LH8S$*P{0}e>U)`KHcjV-}8A>Ri2z78M2HdZ~ z3HmUBi`(|4613{Iam@&`i0u0^K9;*L_+43N-M$RkHy!qgVqcQk1m?;06CK|_d0Mbp z`06u#nEQk7k+yjOydM$^Kmkc{o)_GAY%!P&fSRvn+`hW~rh{qIDUCw@ehE8#1vQ6lS8fuS5;@ zn7UHF{2&pvW6@SWLQx8EPwT}Gy@+y9wfmG~YzbF2E- z3~5^AwQG*BCoH8%p6Ul17{308W4~P(acnD)7JgZeS_D%g8O^BqrtOF!G?zqF3BI`klC3V-W6 zNKkag!t{2TWM~+oAis%ae_U8XqZ;3u3K&8yRniY>?;bAJEwhrE^HJJDZC?_IQ`HQ2 zI#_0A;Ew%*cF4aYd0BLvzGd7f-DJf%9!lZ3#S>-YnOftpew0N3u`==gR%6j&q6|gv zR}>=8=BxLl%;u%VD^lI<*;c%fWo^r~kR+19#qUyP7oTUOHJnDrh^TH{XRW}zJI8i< z-@*{O!7)SjDDxDDTJPh^(PGOCg@F(+3EH@(XC35Jf!~2{X|Co;T%D%UrfAjUr<+FS z=GY6}aZ~(-0a?-22VUY0yDh3Q=YEJKfw+1SD0XAi#5bFHW z!3-(XZq2;!hQX8dP`Cah`uXtY7nx^8S5SVzbqex!Py(<`AWnPm6gpr0w!gFdOcXJ+ z+x{xTP|a(Wzqc^$1c^bHor`vWHFnakoycmgCGd%HcWR?(lNWk46DF7#P$3Y_H{s+v z6LFTBOuG|)*4}|TA%w_e_9A5)%3?jb#e%=#FshOgqzxs?kU&MV)<;l^AYSg-`Z<)dpOtz+eo)?VDvF~yJdxm zqm`8b!O6xusq^~w125SFPZ?R(Z{NS4(%$ni*06RGum0(nMjr1E%B1CLS{8fz(8Etu=9 z)G*bEd1uh>sC(5+LE}9$xUV$QST?Hi-hC@@?&=m_1+PYU>OFTXbej#*rJ07CO+Bzf z-?3j9a`u}|7~3r+f{rP-8qPC$Im`8Lwh9(n7VWvUNlp+eP1_D2&LvTqm#O%Bb7En( zVTOA$3jnfC1S$1e2spk6mWKmDhiOrH?R8{y4{j}4tl)7cbW`&0My(z-Riuy`81$A| zjU#&3$Fo*#SmViZu`uFonJ)2hH@c#~>f6LbX?Cn@oQP!u{qHyQijP{_92iU!N&>a; z#bZ;;pp33z$9`fRYh1FqF|LlNLZP+!ml+b_AGrmYYPvoZe~T(knhb6dV5L=6qdIz5 z_X>l3Uqx7ZZMX(6;Auj_XBjw+K=Tg_Ja(<`%HdIXZbrWbdb0)Q+HitJv&Ev1@zx!y zu~yX_-M#Fa0>jcysxoAWXOyVVn*rx=bhM$}3IEeQM5iEjj8a|k7wQl!3}$wW;_)n; zS{cvvmOSH!2y5{!=uRoW^9Tqm6eEFFcf`{DbIeVE;=P~S*(KVJU<70rP($H?8l$%%wY$?S8 zb@3pGp^}mmsXM(&MtdX7%H}y~J;IJv@VoidyTgJMpCqDCYTgS8?Pqt*>OYIoOrEt# zj;FQ6+Eq+pv#E?+u9n=(Yg!Nzfx^!#+rk{lf#@*Tp7cj}tc;QgGyl-;=mXJ894~R1 zg3Qq48lBjNUz8n^@e__wt}+EGwLp?e4XgnQI%s1DVi!JQm-A5r#VU&J56@=-z0-}rB&G)}$|l06{$mV2&* z!i+Frl?Ouoi#3hdL4;PMfzO$pUw}l9v26T&QH9YN%5uUrej2U7-#~;bbavAC^*-&G zxD~?ez$ko5jQqVMnPSzY*v>=o7-t_Jw6;sj4C&VDUvBZ`38D9aLaVg6*_m==E=878 zxZh{3i))=uFPT~Esb>QAq(^?#Se@w#6eGkF2ag=GEk;duLMcegMSVK#irsp05&T=v z7Sf^->#d^RTgXs~C0j^e<4hg`f{?Tn|6Gp8Yrgh$-oqctPRL|JrvUGI9S-Ub0o9X> zS26jtdmJ0=5Y<-^{oeZOV!)Byj`(Ql0H*#6 z(Cy_?7qYv8MlfRPr0(2#nhsMp5$h>q$&qjf1r|os1d2?z6l*79kO&;h{+MfJ`-&=GCY!bLBG)#e0c?i!@hwirpdsuEe z+5|I`dL8O^LljD?P2&V4gDG)vPiXDYVvC(^hY5IYPXuI|$aAiI1se{kPu+0=VJUNj zLH31IIadI=;#R77JCJHpgU|mYnl^d*v~p$|rTFqHLzz~l^p;h4Awz6(H=i05!Ema)}ILjG0TZ*Z2;7IqPEz;X(?$4=Dr;9-n ze94rfudna@RuxDAy7f6CA z0kJzmpcogbDsTXf%Ia$R^sDr~)Mc2g%LHr{Q6Ob0jsDn6!5MCJaxKhdH zCf}dg+%>uC5d#50v5-9GWIkuvC}$JaNuanb8_tQRuwCA`RuvLdSW7N0zhMLPxY~pS z!sIJE5I1m-8hXq(YOk&Ts3on) z(e*Jcyi6E)j*n_(v@=K`z5?{fFEfq}e3weE!@mv8nE^fe2jSyO2|^MUSxI*&vscJp zW_RBwo~2!LDd~kNwQ$5FI%48{BIGAkabGDDHm}Q@orLe zJjo>37l}=01z8$T)1MtGi;|9U@1k}aRyz(ow!A4A$M;;e!_w~LDf2q#T=X-N62lVs z;CRt6DdudiU}hGQ*=s%ZVxYe|v0bdm`~$A)tiEBF`E=e(wJR!i?Mp=u za{0YZsxOyye*T8dis3uSCQpVJA$e0l;M}GJG@7cl)l2|^2GQ*Py-w}-_^)5TU`KaD z@Uk-PzD%H5V6Y!w_=dv^B*vw@6^M-bkj_;ekI@66W^a=INHtw4?a&D)h*N@|MGc6Y z5xq(W2KNsOSlrPCbz4@AC|=`O!*O-dH4;C< zghEinJmAs&n9odRybnGKUW>T;xF>*aJN+U4$19N`N_97tIj-VJwX+@H@xsTES|T*q zo=2kBi?`R;v$7s#XxR8>VRw#!{8RDix=j7q#?Ck2ANP)}LIk22_t3Mi&rBI&C(sba zQ~d|m{bdtX&RO3$m7o%cTsHSJ{hJ?U`#EGzDt!o|-SnAkDx)Y%_K|m)x`|ZCRrs~% zrm;Ipt_u~7%VgGdkvfrI_kVt3Zpq_KyeGttt=#2%D-c&rkGqgfD-9jtxp1u5BnR{FskvR)b+VN3Ra+I}LLjL{e zF^)P8^jME%Wkj6UEttTvAc{qUD*mSJ&G-GhaU+&QAG{pD;=u@Jq*-ygg(u4S)k|&6 zxFJ|<+!8eo27R10j3JWZS>sh6>|kE0rt6f2V82O%q78H=A=-V z)kn!n!D*n{bdWf9m)X&0;W28Q%X@g%9xx|G_Uikt?@{L2Db|Lrc3nhEGUpii(epq8~~xa!aresDwI5%ovi(y1Jk<1fZFK^Tb4 z_COb*e*dv@5*jV-o}gSiuOpl6946}Dcz0k}z4KIQ%J=gCOZEA$KUR>p=n}%_+3x!Y z?*%IVhp=!yWTnyWln6H?`-)&Dn#Ga@Dy4y#6n8r!ruADY~#5b8F|?G8#>=|!NDlY4HhRl_zF!2O%eG~dt{2M0@Xa(ZoQt7C*UWZ7YNbus)~rskv41U2Fk|$9yQJ#(3~y(IlJ{1GX|fLAaP=|S8XV;LV zjy&&*l{=ao&Ged2HA~VmTu@A@oJO!5WE|q|B(4xqv|^WujuiY=Zd1~i9~bI$XMIXi zZH~!snlAqh)72QYt7fCEG>!`FuH~^jpuV$RP2h z&URsERapv#(_h`uu0E}{NrR~;t)L8iB4|gsM&d9qHTfgu(#Y(M56$nEPd2Ij?+!7* zbtmHEcLIj8JEkQ6iwwz<*Zh?&`IZVGR6?BsgA~pF_1L0B2OdIMn($=x@su|(n z6+nngzOjgGZ05Q-`!$uzaQVEo8P9F3aftm*`QXvs@lV^fM;F*8Cp3xV z!m7?*Jm_RKTY<)HE@Ga?>1^jGttZKbNrdcitH|4*eQ;u%KFFr@zx|`iJ=Q|{7{QV< zzYxp!%fOALXaTJdQA_OPYVX2Rb7i~(9rt1ryz^hW=mpL6~)A?Zdh9rR&$H43RL zB<qM1Ik8%K8L!+%`dsRApfhZV}2<#A|yMV)ACqc&Gg)%vq(kZs2z zr{z)FH&_*nS>iqkV12q?nwgYFD5d+R#N2wL2FE$LLDkuBVZW>w7rixRj$&Fdp?9u!RbW^e?T=t9*xTDx>8K zQuiZ0(KF%1EOd~@o!_o>`MEY}itK{FmPf!nl2Gi?9wxI-7}wR=X3Lb?3YQw}(Z-@SFDLz~a`d!*@+e*9ca7eh(hk#KiM_9IHKg4<{j?LzLq3fbh#?NfU z&CzV;!NG0&@}?HLqoOUhRI$XHh&EkV?4D=94J6|OGsH2@_(zSSDhmGv{1M`46X#|s z+ZU$+oZM$OCUH{ZEHE!K!VhF2N_e~V-%v5!x#)q{nKn$&!J*Q6*aXIYD&n0m!csvM zJ&rTtl@Nbr(tYO@6$?yXzl2zU3lgJ(6Bx@abMxZdyLoM?x^4nT#r+ye2U-&^Pg)v| z>%z)TF}fqN;btcBOfzD+P!;-1~~X8*OERasvs`02%LG^aD>x$GbmOm)1;?y`9-#>5)b+J3TTomTC@% zVn3iJ(kD`b^m&6^@{dlHV@M!*KAlFl(0F^Q!Vgr+%jE3w8nO5aKW3E$VFD!_xIT~y z4VuF=C;X#@Agt!zE#GeW>RHOFy}`1@hP%oFFEc}S#U@Oi8Z^2t76BdPA1NB&e|Q4f zBHDKn#ZleMQFQMz9LM720QIcvx|yw<=+LP@$g=&mAM0^;SkK}L-Hnl$Pq_?&*^0GI zO#wu+Zu5VdAWJ>*D!1dwncrgjTUL7aWryO{0tENY`z{jDyF(DM=2D{{6RG!yK888; z=U%ZetHYbZ_;bE|E-s^>4}U&1$l=0(z@YR7^K^v1VwtwN4sJut{_NF#S+Dtn>9p7s zB*JbK7N&fj&`Le7meUW;p?y$j5B+`4{~Ni z*lOfB2i1Fd{io0yhWI8Y-CWj_x;kb}omrW6B&7=3JN$4F<3`O^bY!Rg&y%lOVVX}{ zf4cY)9XDS;Qe}voOt;;mN}aPr4sCoe5<-6`FfTyM26>u z`mF}l81e}}uPBfA6nSyZ^6%c{cK;Y{9cH2vKs%cTi{CbuH`2M6QrNWLiDIx%8Jl+)^Y)ynyt~R zJD5d7G|#B)Nw?v=d3)d{v<)TM);Ei9oEc^=xv+2Sk-&vvn>iA*TrFY$=#$GG*W}TB zSTI(8Yhz}qNP^S3b4&IEf5kj};=}j} z)d=I7KHETK9#Gjxq;cw5?21wc4Md8*MO9n0y?gPZq@)5!XO03GlG#(TEdV;z`;nLVFtnl|Zzq!G$)gCr|?g@D4!D&+2cr|5HyhL?3}25T-a5#q@yaI6c( z5o1}n@kR2)0Nq9rjvP(a?HWs+vdU2i7bSKfci_j@vpz|MuBjzZksH;^LVmaTtm>P{ zY{%r#gG_@gx(<<%{YVx3m1P*^>;$o#6S|3;Nc@3%P>>y4C?Ln%`WH0(Y!PtB%b0c(8HMtNk z&XwqZm`%#n?Y#V=gOJL|m?~?VT`7%ZXP&fZ{otZXRV6JT7&YwdxdfOoylM{ZSw3l~ zOurxk_|cGdSogf|d$Xet!qOtj56akHaULlQj=JQ+R8!3Z!bYw!$@i)j7H3W{&q7A( zdbSXvjOIlp`(AR#a-9d%nQjHC@7X@qv8pw*Za(388k^$r$r7(<H;yudevz=fo@ z)sF;PqwMd#m6_Q>d*zb`ajUrdm7)TFFmbWgeLj5G<~+fP5d~HAm3Mn;lHXZ86KSn_q^) z85U@L3$LZpet<2F6K&da(``o3Y)m13dT~~Xq<{D>qO*PfM|k#Fs%W2Vn?e)EHC zV8*eWM{GPraP&LgEMwC<(P_=>RTI(-Bu)iaM=sso@>r&$DG+R&TI4i9SMIG0wv<{70IK`pI@6G76wHwAJ`6J4Wl;F@n~M^q&AkxFq<9y{w4 zj=0<+_l{~#1S4GSthXn6c!Dgi))ByGJCiDD$_9K*uBEm-py3N;lF=z8hLdz3joo3> z$Z*Q%a}b;7A@6n^U&M0R!IhH1jz*WxX5U?g zX^(HVY@{zg=^X4&;#^#T`|0j~)_WPeYm+^dtH@xtO|H~X5t#+Q>Q;1WbO%O2TQvql9K#QLXF>)c+pts+ z->z8Qs(^5?;K>lRyCfN)oW+TYo*2UsAMdYej9R-;(8p!MYPiB(4Xw3k#n+#P?9Z}D zu)^}aaRo<=nQ~E0p|Z_oFR8ccbs!w}U+MkCWqh-&ZX(hojRYlhm0M79y|SuD?)wbQ zbPW6&leBKfFGpVH*O3?^0*&qQ&CNq#mHd&>_)DK2ng8f+YOe`6$&zCIR$p}|?b#sO z^16zE-4f!EFY3uh^oK);(sZ9Lw{S(}t2ZteeuFU2r-XkRh0Q4-w*>4mzj8Q#bU2Pc zEv7GQDdx>Meab#QE7FK)Ejk@s`82=$!qo)QQhaNYzyo*Ri}eL+Uy@PWazeyE$SzEz zw(p*RD5>T0aO8KPe$A-LpU{s<3a9jbFrp`&OL!HJS5c(vuRL3*1kNdV;@MDs~wN(7Z~5HCGNdf`Bf|fEzpfl zUpMu@u!+`p2t-#3UG=bm_>cakXs^>`Xq%rAg#~_I)=BGZxko*7cSLO4Ia=L@uSCgy z#A^}LX(`aPe6?hs>zPyULH~Wtg{Azs?VxZU2OTT!oO;_N2Fqc0F5Bk_@(3UU~%G`!b1s6n;c7^Kl@2 zyt&369RHp?CGy2@LQ%-MNyCS)i)UPDp0(^JQLNR<^;`N+b`J9-F)ZAbF6AU$TC z)P;j9GNCyqBE9#h{&=F%)e?)CP1S;?)@0P|EQzSqs%~Q z+Fu1v4}TBVw7V>{FVP<0qOmn%%cZAoZGtwmCoVtc$Z*QL>syeC9ZZ7a$p|F<2vbaH z8CGO7`jtw);yh4g--`a=vYl{bp>N1skTM`)aZKiEV!CqA&bjjVq`{@GpmQpOz(<(= zs{ev8maPp^{HZIsTjfjL5D`3WIQ`A}q@9tI_qCdUo8>5PtgX6%=93SG{_rg2=^dBAyLYmb!r^UqhvHmHUZ;u%;m4H7*a`RY1ijE>dpNZ4 zH9I=sx(9RbzP~F*_%;NV-X)*mru^=-@{0dN-Ez&1fA}s zX5WcZNHQ2xplpYY4&_h83jH}|cyYq*_i9<$h>28(%IJw#8LMg8&Hi*(mYYYszwSzo@>@!}o%3JQ{@#?EF!Rs5&1hX+;?d+dcm zi}5E+>4fCHeT#U5X2Mz*7}jhBPg}f@?e~jbE08EV7dx_tt@e5?G7WW|K~9=}`u2%5 z$S73T$znuX{jOl_+MPP}d_(NAny&d+bGKVJ21zQIyd%+Z>dZ71;(Y&&nof6L5z^0l z=p#%NJou4CCQxT6+)9u?E2mcMIJi1>MMX|J(IXQdPQ$7-NJCmZ?UMP225BtL{dt>I zLf~wFw5A6=mC&+*d8yttVEsT4NyE~b)a|XXi~ZF{E!X9JPC7PJ^L?xBd^%YwgvgW< zG})Wg_SX4b@i2n`?%P!Jc9!#P*@grYRB$x*P;+w3*2jQ;Mu+8$e0k4kf(nLtyX(fQ zEvid~EVXsvB`zii%#-N#$Cv4tH|YLCQ*A0_^UhiaWJ{6-&yGfmg72P+5E*D23;S`9 zw=PUW1xl44__Gw%1z~a|I4-A;H{=)y<=4RHT}s8iGk;pSM9)T}n(~ed0zamc59P+z z-$dS6ul&Uti4BxZo~O!BuDvZhHl^%d;>)c_w_*_8P%RuS%_q=AZP9rRgAAXC&#FBw zLu}|aVxsvSvWT#~KURfAH3Wc1xs7fkK{y0xKwWHKFGRbT1l|l%$X?519!q+l8u1DrR-d zAoMKE$^FH6W)NV zB-iLeciPI%;eL~S&>vkl73t2<_jmJOiu23Ib>B~z?G!iTs_lC$i=5XLC~>Ln2{ z5rR!^^cjdD#-SclVvf#@cwQtX#Mzw`?2Ec<>VS`@BRX|o~m4KcM&+1M`6Zu-63 zlycVln~qRi7h{Pi^tNyL9pjM&jdrEFg<4#;d?c9 zqoZR}oiohNhK2Tp+~4n%JH!Qca%GzuHZ7OCeVhN%tE`x1ZaOVLDt;juP3a@D;W6Lk zY|kSzW`PiC$+N}Ro0kY-cgx@%mFb$XTrmH6p6nOmP_%>oCipU(JojlP>ru~g*LNFV zQpp876R~9S>;$+>6UST^sy`rnDz5US*6l@1eHQ{(G-a%tv-#|WbYRx!ZS9aD0poWu zN)}{&{^4^h%pUsUe1_H};-Kj2)qcnLV?=Q6!e-xflANGL|CAd_Ip*Jw5nDV}H8oEC zSwu=cq$z?spFnDQ~9d65&F%tQKDse0}2d`tUn7(wT+wzAmZu9;%fED#(%EvJbu z0O@g06X^8KF%I1YmFUM_vo30DQ;_Vfia8%-W`2UUd|d(mv~{wne#C@(daOO@rIt^` zU;DX$Wg7I1(XR*EyO&u|B3k|;zbwYb_=pQZ=r&bcG@Ve6O_&)#u_zv}-SYHusV4V+ z8BL3|ZDh$HA0%aQ)UFPn^&^%1^Ts3aIn4{cRed(uK+MT#kzwUyWR{;}vcu8lR6aoZ zj{j1T0aaLa(Bb39-~1~gR;C2xU;R8`l8ERu2L}2s6wsx9y*^E@NOv6S;u+-qv#F_R z+x2gI`Bf|DtK3@e6VG}paF4pmvlKDK&nFQ9M`gwuWw$zg3yedZgUYjL+CicFY%;)- zdfp&L1P~X%uybI+;j=KfrPrZ+p!g);s6SghJptUKEbC@__4diVNrqWg)x67i1>R8f z#@VFgec3D7=_>>ygAegbgAWtQtFtWLTO8qf)h6X%cE1ZD4`4B7StdCm-T}DhuC#H* zBCgvZ6K%eV_;CzkuZsvQN@!={(nKJ$N^K$mN zJS9L-Hmk?%_k*{|^jS&mO6#=i07Nkz-iE~S-*ezOD6jhmETI$BobPs+gkE$)M_vCl znw+;_mW|>`o~U+&qoQIh&W15Q;`m%2Gj!a(f#7^&z$SP8Ihb^m^4;I-bAqnoG{(p= zEnLo;=0ki5ivW;wIXXIC^a>!~d~_Bw=14E)y3~4bjq;!C&0Sh?@Gu-Ku?C}}TF)=1 zk8#*k(HqENb@>2t^cF37!$bvAg0j`Cty#pnFR?{kf$7o)z}9!pCOf6Py)WD^O>hfr zB|IqFL3ay_wd59zwe3)bRQ{NjOw3|U6=-FJJHoiBIhhY!(p*b{{NEeMc|UKCAR7Xv zoxU?jmBaXf+_AMD|8Eyc>Lw@z;L^j!bsxz`&K=hNKEXSh-u6@#M0N*J}_~ZZ3+?xP5x` z&vPOGSBk4ts3lkVUb0n^{+CD)>Euvzx|Day$M_szmyn(crBa782AvAwMPG) z$Q<))Z)**iM<$~^wSBj9Y(W-Q1MYi%IFWqWK#hNfL}GRrzW<2U%-eDe7Ifh@D9%hj zah@sRWTq)6%AbAN)%3C&P*M-H1+#DeQd#l@_p91QBgxFq!?r3q&_@JaJm-{cBg z@{s(0hr2mvTJ=iTsF4j|nfL)XyRv|vVPek|pd#uYh4Y#>H@c&jlfj5(Py-_Bm%V)I zA1QGcP4Q%m-}%>5PD#iku%>FFqc(-sXM~bRYU>#=l&#dI4JGdX$4-8?LsY21S?WLD zHnI~>PNNwCj^nq1I3<`SPJxR0apBLtN_wWV}XLG%?YX;%3{nxeij9&lT8QU{)Nf;Pyb`(Y^6&pgAzLE zSEetG%y4^*fX0`M?>0{fRH>ZnoN8?^o)8CabfjdY*)L4I;<*s2}{tlF_L zbDsZwo1jW^8dKmse^;)9zxM&27W{9Ri;xEb{;w2ohxn2I&me*Cfy4bj!S0lavONcE zp|>CW@0}^zinihxo_0DBJ(eK@N#N-*;3lXPc2^S1xhqT@&6>GmcqNZ#~Rg)5k%A z{tqLI_u$`eFJzVRziUFss=@#1|0R*~hH9coxFihjjAmTNDjnr5!%zIQVEIV?f0vRR z){oXxD;~;LBGXE1b^oqDA*n<@CVPr++=UdIkBzdxcG?JPbJ=cdci-qp?SY74(b9#nXt-f zT>m_KHDr8zyfnYPymxbuO)0EV0z~(qw{K>tuevI(bM>5&+~91MNYD3aB49$?mDR#u zj4SXl#hJ|HP1{=K1cjR-(gE=*8-(6scPWKGU0U0t{@Yc>@> z8H)8^X%p8(`BF(X`!HuJL3CcFMKsF~&U{$%k?-=Y^Lm8(cSxRLq|B#|vN{X#?|V4Q zq?+V9^$ujojgp@_lh6w^cT*MV~v0B|6JhD+f#?KyJgS~{Jv(Jn%1yFB)2aszyQs) z+`qDgi*s)wy9G_ULI(In!v1wOOJ~?Y6T$cEKe8M@v5x(^fW8#@c2CpXcW9uv#SE z@{jv}O1tuKsQS0xBF4UE$(9yNln}-`MX1MKPeKwVRD>bRSZ1<^nDp4U35Bu^G6;jQ zX3shryO=Nx#x^sIcb;GMzVCItf4=9B^T)ZabFOoLm(P9QpYOep76oxLH&Cs%4<4{| zENWu=SBr5j9QJtkyb@5e{a-y?qH08OqU9oV-j@_$eQZd}F%zl8UGC;!-fHGe&w#0y zvA9QgiyVMAx4>enM;9pV5Gm5CtcuWX7g&j-?tR(XV%gHOXRs~$h?&Kfaj)f)|@=23tWDNgcN z_KM$^J$Eqga7Ga=?eY-?^6WoG1{DTwiFIj#M_z0@X<3DqyYm64u5n1ZmEswZCx1+KTQp zr3MhLyAMTGa}iG`g~B;^6_}dxxf^D>-I(3MIPu1ghD^5+5ID(k`;6?0<^wxyczsF+6mnTzb;%~OgenG}J=L->9 z*I4H`k1_Qx@o0NC)4%gYemxhW9LaNYkf6|q`Z1`|RsD|LlIh#_UFunFkjJ7~mGWZD zHwzLi(Vn^f(*B8!zE^wy{CLQ_8*@k$r+7x|h!07BvRNujM1*Zx;bB2kY}?;1w8%=_ zdg`qv-FKmbJ?_0FyQSCGVYZ#jsdam!6x9U{N&^dz_ zBGixZ1h8bxezctt!Kj!-oX)K#mVVyuR08SGls|Q z@VV+nq%OilQ{&J_+i1K8&3qT;Xcq;P#Lx^^j2ee)Iaj`}{y1$cU-u+S-tq7Xn{x+^ zJzFS0(rXFkAX9VUgd!i-#|eJl3&ycN`mY3++;wLb(wbapMJtqcOcR*y*#SE-(}?;| zf#7$up?q2u53IJF83-Sc)(|Bf2rpk{-j5svhE^i4N|H4S((yARPu849)Z5VM3}Wg( z-cZHZ?|t_2>|?25-OPQN!2zZG6ba`=SXR=4`@lAQI#6PK_D~ffG9QfC$kU`lq-!y@ zGNflqo9e@%M>;9=gWB<057=VDz7O5NO&_0G zPe&$Z^iWE=^F?w`ZiqYWz_j{&V1_H|cR^^4-d)RH=J;)+4Z1I`xXATPr^Yv60$7AH}InlAgvloay{& z=<2{Y349l@#VV-bVRPH#I)X+AWg^wBLo}aw#mWxi_g$OtginrKA5ENwL*|HU;;;Sw`6y0hm@>19803^ru8*8ed#ik0|@wb8<(YI5(D z&%_7u0C$Dx?fva6VGqtDj|#=+wOXAO&124(_;J&poivhTeQ5ANpifhQ5=hIQ{IFuG zV^kFyVArqyY~#%0GI9F2)_{_o#HHVu^dBwy|GCY3hOTB~rM;#`u9-ADhYtzkjDT`FY$O*8ZPw^X`b^GXBF$^tmzr8^{fB zrmSf*`u+MBKzUje&yki#X6|=Yy1!zb3;*BmDfx0njL3g%QepJFn6Ca8x^;H;E_zLy zTXGcAb55K)B*~53h2L+ffQRb|Bj@b@*w}j8m(JRw3pWoL&18@Iu>J#|WS%f=I8efY zzC(0wFMw_E4dGyaTpcwvE>~pX!ZF0|K(<&vgy>ko?plkkI@#ci-e6AeTHE^lEB#IS z@uDE*Eq^na;V_aJE*N7}S6XYHq~pzKI!l_>kkS!UV}~->`_a~JNnJ)cD}NTr0a1)( zJIx?4Xr#t7i7qwJGR+;;cbz&JuqB(2zqrHtbcCjwL_0}Tz!jsMQS4bw9-Wci=rt|N z8QqNmL-E1|-=;M*e*MwBa{P6QX~ooDonnKTE4Rm6_-UdQ#%TI#LzAGNK#V7eA#0zB>@I^b;g9H#AB3@s=BPMZ;&xsNWTHb@29)c#78?&M$epB7TI)_Xr(%|-fjAAg(AXO4ptqw zTVQ~oR;ZHx1J2Nm<0(p;USjU|lFWldoaV_^-0hM7inTyG>h3y>_ z)PuK`=d*-fK_C@=Ug?vqtBJQKaDvfm))LDst4UD46O_hWJEM1#T)t)M zrNQExbbCU%N)ro2#2#;Mw1|5N@yY&TKkqgj8Pl9~bOn-`jC$apjzhcJ>h8516u(`= zJ!xI_*W0+!#r0wo2|-2Uc%1N&)GHB}Uw3cNOe#R#D>{XhHJ_;C79|WW^B3~#vPo=t zA|hJKH=2=iJ5TtT4Ll2~CbAs;E!}O)mnXI(r!^WpT%A+!t8>z`>tUq;$C`~0!14!_ zkz;+OIu{;2d-!}Zq4C8Wt`<&cXX`NZa+Z~uscvzPWmCJwEa{1Oi%NbKia6M z!M6#Dp0}#lOCM)KLq3a(3R=x;e`g%AbiyMJRaSH&d|T9&lZsio-8qB)>FlX2+Ix;8 z!0{D=jX$jt8aLe>ish)ptX)*d0q~N4g?JAFN(^Xvx}Fb+HRKaJf=5>FTu(oApAndT zFyuPJN;Ly(?ln@K9mSs4S0&R}hqZ+o;FA>Qbn#{I0Mvz(qfRvtb)yq4kKx`RwYt69 zQ^%%wi#A-TJQ#b7OwE8JaE!7&|Bmg?R-oeFa%Wr&F?sis!rE@~M=qTgh_pIb1)tZmg;N zp4b*htvMQ7S+f}<$lgM)tn2)&!tq z=XFLFgGn3bEvalNaRweqMwV7iI0$h-o|9uSy`Tayl_lgMQ2OX~Pa$w-VZcpAVSj^O zWkry)tgA1b^pU!mmY1R{)*55wVoWGMRC2687VKk_f;7(%n!WHumdrskwXd2*L_i@r zEZh>>T?va_-DB+#IQ}47Iey{$@Q?xcm?-NTUEy6e;?7U4J*i^&sTI0i(Ev1&_9l6v zryIorKTjndKr!amR+&70Ey-=;EYf0#lAtTcUY|S1$KvhxR`H29slilzl5{tGs=M(F zqWT3)Os?lJ`h!MJjc{CsQ(it#t-w@2`vz?_DF|!hS@J>B2a{T}crxjN3oG6tRZCH~9JgY%7?tIeC@rzwJXjbPAz7>}QHnjA2F>CWw3 zlb25E(A>FP3CE@)f>4Dd9@esZcYAxjzOwWK;#T)*tWY_Nbp|*rb&D3I$=yb~h@Lv! z^p^rSrj(CZUBfhJMWoI%@6rfr3B~g1aBt-}v*>b+`TGcKtt*7i{lamrJ*Xr$%;!pN(+rEc9&$&a6^hR%HC# zOY)y_Iun9yMZSx50DSzG!|$}%AxegP9LeG;BrfldZzQ zvqv@k2mCQdQPoa>-h4(^AeAxPFr#yM{G~xWMIUC#D>5R`1r1t z+9u-ak$*Zm$Gu?KFj?;w8R%Z0Cp1O*iq_03)#Sq({PaC3d`B{h?O@uzC;rqQVOt~) z+)@yt;NR!?@c*K%+oPts~QG-_VW`FYww9aQZ&4-#zTbJ$@HUfRNNz;;2ds zE!cQR+0>w1e6REK&Y*ILsjR-mO!+e5{jC-P(atvCIdFydCWg!(5b5=k$IK3ZQD95u z)JuaV+dhM+N!?qK>6eyt+XQFzc!AJOq;?qg5bF{4Jb8(CH<*!zK*b!l1ft_VECwvk zDD_F0<2zMzIYLPx+gdb}tVieKkl!R1d^6=rd@|c!&)474SABg6wMKIC4B8;*9%Rv2 z`R`f2xw23fsoZAM8c~%4Cdl|cNFKKll-~mvlRP)279XC*PI}158-vXcXhX`sheDUj zfR(s8B8j?cn~)yDhAt)>j44j*vEH9i~KX~likRb3y zeAnwdi4X6`HNZ~HzV9+^pFo`fFMuab=9pbDywSZ_)NQPx!5-re(_Z66fgRvVl8B=o z$SJvgY4h-@IC5GF1?2;43OJm13;c)N*~VHLP}cPI`JHPpA?prlYjBYc2%bX#{xF5W z>WY&U2FUDsz$zY6zZdLw;gOK2jG z{od;ugTSI>MQOcrY9f64Aq!NGR#@4KL|OGvs|XjPU4Q=GqNe0|lR4|{vI1aJ$J(dbJuQcw=<3(u zmKW@Kk&kpt6s$^VnG~flSL;AfiVwZ2gw@6$mY(nZs!mngtKr2#NI+EH7<6;OE8E2b zN%?vFiqC0uA&x-X?jC$rj6SXfMtj7_iuD+Oh zw@=V0=i+bp#S}oJrf*`#1b3MVX~vEumv#NFni!et6*k=ZU1Djxe(D^JZT0h>G zUzsq96?Q9~gwIL_z;frGb4xp>J*r_Rs@oCwmrUl(KTyV+v8s_Zjv6q~8;S4%YWPzd zm}h`OLjnZn_i_f3M7h3V-hyG)QYvC}f%(JR^GwB> z`dLLl8Tpy<mkC0DQabWug&5 z(8JN6+M6#N1a|Z|Aph{zzij1S8}Qc>`{M=u|DV0W^c