5Lxub=I0K^%xBC
zStwFmoaWrQTQbwy5;rC>uZsQ{+1WjDcdr;Ye(y@;k9rE006>xUe<*E8t^Qgw?GU7K
zd{ZXl@%`}~HTQ}oZNo^<^CSO*QBg6ZNjU0SxYmN@Zd9cWA%zjQQunK!#-BM`s@f_$05gJk?%O
zuvtROLXMxzEg5<9y}<+hT+~wz#FLd8OXm57*}%iKzXx9Xo16p#v6{^Q^uL>;IThFx
zU8m*@Bpg;--fA#6%e##;n<6mHrR%|p@3msP<4P@dhPxy+Xf_|&V_Kj5`cnU1SxobH
zo-?Ly@jO}3MS58C(a%qpSbX}}6SIxd54)UNi)E%h`fqr;##<U
z*lyulJLf%}?K2C%!SNq#>n9YCI5_^|*m3rml%(W9<_&ENdTGzS-`}PXzLzVt)dJPr
zUzkB|ub9x%1XL}CM4Fg*Ae
z+GNG`0*~LC8za(_GeK`#bK&UW#>qHk`j1(`J{X?o1j0{0mL)|F1~Tn*)u$*l;kvR6
z)D!Vl5=QNWE!e!E;!01Y(H4qGyh+fRupXuYXvX6a)KeC?W8)CvGE|BB@n;mnb>z9X
z%tG`ZlY&zC~brU=OL8Ps}1xYqk|j3CzG`(o*$3M)ibH!`~K^^0RdF6UAeFY
zLoKR^K*aM9Tmm82$I4?oEchzOoUs~L@XeHbDh*`zW=FWQQ7vLY=8mgs7mj(Jr-RJ$
zJ~ovGIl+M-bMJaG&(}NTCK({}Lv4g@4fWy!ka;IiZ7Y!bc?HNk=WVy4pB6j|GM`(|
z2>T^KK6P4+2SEs9ed@jUD5C0Eb5h;kJ8gU*$MIxgkDeO&vDihVt_LNrLoWUA6i|lt
z&Vx^S@xgPLF#PDW3T}c9>hHjXB}KAjvR>l;stsD*>3y$#EGO7aGYnrnSF3iHmpo7k
zl;Nn&YtT%+_XWIVeI|1?nKKxahLjNqd4Pey&O~RvaF11^C7v4|K%l0oqE|gjhGA5P!^4p;&XE6NXhYrK=gKcPatI4Hg^KF%
zR1*0a;8UDmZ}-id=;dT~Vl>s+@KICRLM`ctb1W^f0qDgyYZK@Aw2(0r14ZJffW{|#I0|J}m^=e^9-qL;=#QBvK
zREJUn%Sb6<5E6U|6rs$wfy6SV(`si%0BD`g1Gc(|hZJbV(ZtU?tAdZ1kg_lg$Yc_-G3
zgPtQ8$NB}9KnN9u_gaEttG3bT!40fLD}5U(&hQFcIxd-P8+7NF*J4PI(CaqKpr7mY
z%&{Z}qlmF22*RVRlt`3)hc96v!;l^*69~nR;b!chH`YwJxNE7!TP}cZVt5mUPlTjv
zzSe}mcwYq)`K7Zaqu+ppPuC;yi4hsJMJgbn%8tmNUOo9t9V8?chvO5^XAKl7f`nGB
zf4GCZacZl)WIZZ)AykHCTbK-!{AP+HUyoqlXaUAW*XR;9S!vIC>U8uTtc2io`*Pp<
zg+mbPzPt%Ky&4LTBG3$7%g|~GEGhgt{hjNeG`&wZoLS&-E72u+P-PiO74&S;83Iox
zcuLB>Z;g{%vDg?1%;zA&dUst-_1NtjbQM${8BmZ*9uz3J@DpL}Lo-Lu#sRtch
zuPpV=ouJcB1y^7LNqsd+Xp7Pd71C-Dn6%nRctrw%<}Un`AL!@Z2i9>^@N}GL89N!K
z0Hs;Qr926KMn^rj7Kgul`I4BJ2+Uzs+5C64wY9l&0k=MCcJ=i4;~RQ=lK3bBDl01+
zyjGZMjraS%i_s>^BZK6doer;Q%I+|}vYvbS%AF1so!z6UOe-|jCq=ZdtYG2K
z*TKQTU$f1Po`>IKM3_V@SQq7Oy72cqB8*D}Vt{4z=Wy;s?xX#OsEZ>nHLHFN=~AJ%
zf^l4gKUR(V5-#hr&8K$yV7APB0;)vp$(F;uP&We5TW+m?cfNH*u8|%tetaQ+{3kw!
zN$8xXoChfiW9B)m3@~Tq*1*4caS1s&!m@`uYXY(w8XEaKuPC7Hrwgy*@wBz
zyW-{Lg)}uVu(Q7etRoZzmLB{#Xr~=e7x!K<37hd>wA`83{)qaNn42sAV3a?dzK>YL
zv$Q`bvko02uH8H1hj42IR+63(`jAS9b5EDz_aJd{XJP$j*&2SytU
zwUHU2k5Y%gl$A*X7nrft0f*kyI>MLxuIU#TDYJU~<$p*^TuimnD6?pGt@{=+ZsGT~
zuI};Y5@X~bm>8tmimLw4qodF;-Vu*{O#|jh_oCOBVJ7dzY=j8hlW%K$A1
ztf-M9D~Z5bKQpIlm@pY?;wsH^Y+n)X--;5s8*E?^Wy71LO&y@$)xrFj&+`tN1z9i3=
z-^Q)%ahc0b%vTYa+`&~pjDT@*`!eWiWt^j-38h3Y&eyz5ZaN
zHR$APnn$>4DQ~#0xcXgd`njG<{PhooW!G-g(%<3`Y5@~kf`3;UerB+q+@}R|qx{3&
z5WWcEdJ;qZ($%_Z>}{1K`zvQq&y~%%>0Dw`@O++KG-wY9uQf8;yC((lqxqdpcbpmz
z8Rc7}3a(Ebnp_{iJbQ4LLRU2b>>KpYRSe|$xTVh%GzL8+7e=(@v!x%|{eG>YRV26f
zH59m&(!cAEHu`uSq>+hp?`!Xn5K{}eLBc|0KcaA?HkDsb&s+${tEh#96`J#KHBb*m
zRVTAzV!%6bSaB>Y@#4xSHGs58*aH51n>jvuFj56^cWC
zpz*-!Sy%|KW1+t)DQ5+f79c1Ak4e9w99a(uo?^;4Jo$Ji>DTe{SaEkOi~XoNeL7K9
ztC!TTb(XOR&hBt-ORSW)mV}AadGAjC2Wp@Gn-gqP_l8A?sutr36nVfaF)H0yovIN?
zDByQ&52GF%8+)Hs{N@eG5iM;nRp*}1nn}!Klkp}R>wj&+#JPVkKt7e|-BjOT^a6FT
zP58PTLhYV#ly)Vw3Jni`bA2L~Iv3W4%2~c+&mAY|GB!A5hJk0U<@f3>m
z7?f+{nv}Fx;vJSHj&2ngpVoP$i@Y;l$X%
zwmfcYeVVtv@fs5HGE^JX*!Q~_b_l!Li2A>y6d1liez49DO+s7My`AA
zfMdSEr{0&(V*Ow_i4F1T)w7F8MfAnCkE^`k_|O=8D8PgzF&TGxMS}vO3%a`%(N{$h
z<~ll1$CDHZgrEm+EncRnHfQkCi~ZwfH-LktUTr+ahMQZ&AUsW!K(|YVC3WQa$=YH_
z+vn`0GDf&4CDdUR@N?QbU#Hh4#`osO)e&A=IWr#k-F^!m7tF`!xpH%@T7ym
zmMp$4?sMiZ;upV3fiqs}K5v%_T0L29fkTWiI2Ox$1ItJwbZ`qC?b4ch-~J>J+B@$7
zOsn9@ne140xO89A@G98jz18+#vLiP%i<*=95gWRaO$;>14Rzil7$ssu`>jnc<3C0b
z4&=l!jQRv%3*20qQ{jjW3(eb%7m*ux#kMY-fi0QOeW<#F#))IY7Qrd+iEddB!TYz;
z)X{-v4;e)Yad5M}S)6ATC8QSrD4Iwhyy|^nDw?KR8{LpjhxAA)ZSC$t9hV06Pjcs{
z5h|XZp3%USy$r}p;Hzc>V>0X8VwFw;Vd&hiz=kwpK-UvjGWe45xSnk|PFL9?bd8If
zHhM9IQIueK{e>MXQFWlfSL6YP)SSW31gz5%tJ(9+FyAWS2g>32(Ko5g`JE_>lIW*m
zoZM$(eikN(5mMj0@D?Pht{oIgJ;5ZK9A~(&!NEKu6^7yxyQkPqfyMl~YQ)%@>lF@Z
zaRq737nKf9cQ{;Nf+HC3tdJKI0zn|#tUjp$U58r6RD3wDTEzVv428ZHRyOfcj9`7{
zo)8#0lTKYm5rq21$Lual@cq{l?ysV8-_hOCJD{b9CH_+|*nahIHEk9+FI&AX%LkNt
zipH81fiSiGNb(7Wblu|Yjf)DWK57oI7AGzxVjyr{c-@uE4%CBDwK9GH$ZdOav0zA0
zjOx3Z$5gwVM
zKe|y6Fi|ve2h&t@O_md>k)H|^D@Y+Y>ley%JfO~MsD4=yNE`20}E!|a~d8B}DFifkJ
z-6|_bz`3|J&%v+J#sL%P#f%duas2vs?Cmtr_xO1vSX#)hqqOlj-R>NrZlHDPyfbjP
z0^U9zMWqSyQb%2=N>h!zejq}LEifGrBe-7L)|4Zv7VFw@z3pA9!X^;p&UB*=Mn9#d
zb8u_+#^EHc6~vDypl>m6vy2ryb-OW|;O
z#h3q>fOZ>rHZ`4x`PSe1z(fg@G?dk&Wlw>zOTqOp1A_F(czyWeKG!b1Dx8sC0evkv
zhlmh6b>+wVKrK^?ZQ^KQrQi-T+=qvM0$|bP}2XMzp&^
z7WgO<20C#Nd)WY`6i~b+HZ7+5+s@Ge?ZN?p&aHRK#=NOs}7m%
zs9~xKGkcIEFb0-V5!AgP3M5_JE6wagnfr<^r~rk~wthFNsEq95<6w~Feo<5>nx^fi
zEEtZ$O2#z)lk-Jmham!Po1^Rg^EJRySG=t7IT>n(@BPLXl9fE80_OaF@OMX^&L
zVmP!7$b-CpeR1q9)XtR~d8K_rii?{&_U0>}_1S=KHXjK|NpttkOWxQp+;`}}g9i+c
z7hgom9V~L+TQ#)s{e{KWv9WTk>lLX~g0P?eb0YI*Fxrwar&@Kwy4
z%1Y!-wzRKAB9!OnWbVn)g2pq!iux;vQ+#!bK4CKg{6t4bTONI9{;cLsHl3lJTv%*a
z7PvL6qJqEdKB9R;c`4&r1TK#&FVvpedDeaL#!0jD?)!WK*KLojJ%RO-BY&URqB~#9
z9lq4Lzufs~9EVp*pKy@|*yoq}M=~-pLA#A}$~AI`%9xbE93IhFO*SoqjgI4|Q&|QZS2YRj=STqEz6aGrlx*d7N9*qmhh?n`*
z@>x87wducgr_ax)PfCE7BmY%y;DLWx_1w|V8>f1$qy5du3v5@Mlc}{v@DkQ(feYC_
z7XE*f-H$rxr{~Utm@p4V7pj&su&xtjlit}wY9Lw$$D;UYb^EwMY#N_lr==>(%;#G
zhoQ<7`gb~j&E0xbXx7p4cV{{#CdSshKG9rXU(&Asa{Z(Tr6%$s>&N9##?=pDxVFE$
zb0TsL^Uq9o0{6K!e11)Fx1Mp;(HXW)HAl4CGQra8#EKlGa@HCpN5P
zKs5G2yxD5$*+Ca9L~?~iyYx%7{f`AoQV)%E`0>AxWtTYrib7iwG@9l~atf($Gxp`;
zh9Btyzkq~fud|)q%P*s;;y7SiTa+4|ilGDyOOJkc&^7w33k$u>lqd2tTAdf7?KYh~
zd|XxX@K<5x)|TPVG6%QyHk6n`L9s4W_{}2ob?z7^wGDlyyaM*Wiz*)VCV`|Rj~?FC
zCSby!`l#2|JxAUKj#%5hrEWS}DD0D3MQ$$*H%||Yh%|ec6&7V1Q#mLoTsS)UK^KF;
z9Svo6X6jKVZ|iQCygD$bmZ6RFN+mu+o92ZDv@Fn<%VUkY@}e-9Is?{n|#MBfMfh1dN}1*
zEcB#ovdQo`3ATi@iO__brjO8$GF2NDoF|)15;&W3#WG4rXxUhIg8L8j@gToeM6uM`
zWJQ_Oaxb5DEz{0w94_x^UZ@fjQx>2X?nlED=ealM#rpBn)L`|H>BF7FJi)-qDr8xv
zne3yD*B=cjg+5zfgf?kEZ^)Yq5;0@Pi!V!?l)u`BA}fEw0+*f^nugYHcI;d>l~rxg
zQ2Z4dVXn>%O-6{mw$zDl%7XD}Q&wJ031;+TWf4_7>YqQS^{m1%6VS9W0aiEC~DZ&gbEY4gWk9(H@lzuQ^WIbZfsYX{dW$AR#N8zyJ704%_r+K}*l37w@Y1gSNr|S?`LdUHdUR
zWTfLozOj2d2XJQrluk0@U{&dNs_qwTUGUfScA2a6-v17Z^=gjUXx+>{ENeYJ*h}25
z!IRP!LnyCK)a-r?exZNE|HojK*=Cg~8ylN|oJG0+pTo{@-+1{0Vi+~-dw#zO{oRaU
zR#*?8?e1}gV#k}Zldc<$^I`i1f~H5~DY^c44YE!ax#i;yQlTB6R2NxAR-?{I_KLk?
zh2d~5froRE8LA9~M_;M$l{I>FjmJsmB)7u-zJI89^VH*4Q3_Z14$TSJnfx2Md{*Dg
zb7XDqf+PVilAEkHQkv_zeezny`v@q#9RUw#lYg8-FbhdqL3wy1x=}B72l4#fnrWYd
ze*eyxI*>ovAL{ac$@!I%e53Hd>2v9N|Drcw>5LZq_6wX2lIdjh?(P1}bUT%zjow;`Xbs^o{JBUUr*3BOBk4
zHPh+aWq8ts!Y?vO0-wD_X)oWDkl|Zz3kmg*8PN(lP*7kY->?tYs-5~>r$|
zvUdXjSPAq*Z82nd6(UBgKRpgK$FgiY#<=`rKO;}hUW`BkKuK>62Iwt3Ss(r~kzr=%PL!rO?Wq$8&Z#kS;NiL^(
z1_v`h5tt9;5@a_!#b4qKpKX^ni>OX@3J_Y>&^Aw78k
zjkQ7VT#Xe2XG@H$O8hDr$qz23Nx4jYd{2=XH&${)a{D~FHo3q5j8-7#$u@pH>ANMo
zr>DG$Okh3xtASk%!JaXV-Dz!GVP%}=nFGJhY4rOrwaF8~PvU?h)imj-7dGnX%{-D+|>3<+qY
ziGH%cY_|7cL`44Dx}foI1I2h(@v_W6@h5xn_q%aZi!02w6rRt7OcCqZJ=0e=(j2|D
ze0+11E@Y5q)6FWL{b%AoS{RItPP{<>F+MnLaXjc)uf?y`PirS7|4GYn7$8eP|rG{
z(dIk6zSAI(;&Jow#2=LwKMgPaGrNNgAMbZ*LzOhK{T5(D#lE{OZDwXBm@31%U+}x8
z3f=BlSXkJ6nEcAi>DPE`E4P0me(*e$krQy8YD(aNAI?(8&6z(1RnVcqQqa5%Vj+e=
z(6E9tk*hPPrr@AVfCh`_bfBtJ5E?i+A}
zOOA?1Re>6&1~{#U@w>1?m!KhJK(vmFhD@Ov=Daq-`m5+Kb&_MrNn5+iF!%86d
z_#n7K6}~`|#R=GG{CD9S0!nT9P(2C4a}@gOOfD4-`Jan-M^TA_$mp`~K#?NCaCaP~
z1cUp!r*a{vJ}4?U!qi%b{Be0z=b*P$6ue;6cd?}U=ICG!dI2(849_+0e4`buAgaeP
zfcs>434BT!reOsR1fV}vE754Nl$=5O-}GeJ7#<@6A#z7ZDI_?6JR@C|K?S{2tgTJ;
z7;K^lhDzXYHZr>_v?0iZGO~i>Z!vh?)})JM&^(5ZvnVA9TzQ6e5fZ`(`yF~pU#tHK?E1-Rr3t7}1}Y-)
ziMG`>sIFR@Jc6N@$e+@9WjZ4G44GxR>P-&rnCuW`dQ~`CYr3iecYgAki}Pi20@dC}
z)KhY}@)Wy6q{0KLy%ALV6?matq)qWDfnAGWxI*M#6;|Yi>MFDiAsD_8`Oh4(W`-&7
zljUZr26N>vSZJ--~*6#)Q{k9iaT
z?KZnaAb9X{fBhFko&{ualOc>t9S`Umyk+laH2T_|p@!Ix^7C`Df
zTx$p3351oX$>3A^*Uvdg9{Eq~9MJJ#Nat0C@K5o#@0}yZ0meEy{MnTN0^y1mmpV7#
z@(W%JNFYDGOb%3o!j?=Nu?0@H+x;{!085KhDWR`08`h4B0%&n9gATde8!BA}Fm#Kz
zcpG<4?(VzDgn!=#lt9Q0EuknLAZK9AiSd3*RBcRLPN7G9D$X&O**6
z3M^^*lb@J72Eczj0tjrf;3sFkE8ump2|xRQ1m}zauPmlOz3@v63|`;;jIj0(E8sXo
z2X{2LxRls|x~_K(F2V+|3BJw-F{#(O|A(cImAqXKoo^siE
z@&@A?HmnAj00vG2%U%WK){gP;h$=vC9YwSGL0|JLvX{l<{muMe-Rnka!M4YNqRDdG
zTf`JYx@ww>$K(BV9ehSUpnh#^cP|o&>|WmD8W(nx-
zVPk?hnojBQMc{SK$qL`a
zy1?~^71zx5<$eDI!h%L}G(=42`s>4hOd@gJPr>0h?NsHh1}dEhF)q}!;!1f_Xjnp2
zEqj7^MhliEyAvOP|9Qi-U!{ldJlPa{nJrf0eSLK)qO4q!5&Zh%)j(JG?1vmFVaV$r>GR_1Hk?D&xrR#QJtp{W7!_itBE0ej*rs#)t*n{AAvF+3CfByAT}`9sCdo-
z%=@g7x@RX!JsHPw2Q=+2;#{p2S9r|A;YR{Nt`TxdB)0TJ;f}iAm;yD%gSj7t{br1n>Xz>Au>t+;AdRJK5=M97^QH4Gq+qQ=2!Rp$Mew*?xOG0t~4
zL7Q$qFAThd0Spd($Ox#<2x^9%4v=nXLItO=JJ}Wrun`O|x*IGI!T2UKwnxrsL`;}(
zEENa0Z8Q#-eC<+5moi{T!iAOu?&lS7+lTgmjES1J8Bo(RueHwOa9PiZm#+i*!J>o-v0<$r
z)nf~iY}+d6;{Ty}ZUM4m_6-+e!$39)fjgb4_f@7D5z*+V`CDL5uqYBn017gSTNxxp
zxB1KnB2M>DdB6r0mEA(92hc{fQJf~l0Ns!oL~0!lIzFYa4OLVy^iCEH_=OUVG=AH~
z$#OnwtS|Dq?bCz3AMvSz#=54aegl%@m|VGLpuLg0(~Xi+93GGdMP=2vy0|n0m8eDF
z{(Rekw*24fv_%kr`gdx)g~&4_kJf_t>*!ZoE-o(ef0wjv2TqQLPO`-9<1qLul5Y&lENW+;tN@I+
z*}5}YHPjmHsKAAsi^sqFb^B<=H`jH}kLOeA!@ANxt+N)wGkCUB5j+sdr#yRh7Q<-d
z*(X%HwL19-z{?)gJrmM5V{xalSYS-HvcqXvCJy%v%$9XNcc%05oK5&)bfnFre|_RhB-{lqM!%A3A(zNign?vX$sPqpp{^1xJ`
z+SL*euwd#l##-w1WYcYh)Vf;I|Eqo`aN}f_Hu1`>=RR7s!q2Y@2-q$G@HviMJ|{Pq
zeX;)Gw{{={AbQ@pbLZhq8}#1-UqFunGY}}WzNd7XqlxKsJ_JHpczPFr%*d?An=#cl
z4~#5-lwjysZ{=h1FRxJ$7H))7JI(7+ImPf8vv!z&vrWYRx;kT2Bz|
z@%@rO#`{8}tnpU^kPQ$ut3gCaD+n?VSMEI79S%x0UNXLWmwquGr&K>o9-<0uFgu4E
zRXg;S-XSpRxa`Juix}u^2P)mkEChi3-zJOstMzQktxM3Kd@x{_d
zp*W7Z1$Eubr;8gcq>wMAueYmx*=^Zvo_1|~TU4YL7b-V5UboUV?2`Mow5W*Sq~?)I
z3xmUvw7``CF1C99_5Re?p{s8qcBr*j_@0Sa9)l>GRxl~vy4aJhnynNi2{1KXX9Jj>
z8U_pPlz=)jsHXDSID3yZPQyf69{pC$zt(-#SNh~Q$W>DEtli1)NO}Lw%(?!-!IrH`
zoDkd0ZeYv1r3u2fRI~lYxntKK%#;Q$QzNo`hm=0%;srrzE1LHy3oeq&@wG|jKax@K
zQa-s0*QccpGU8bwR*eIh7YK*`-CG!AYw)XtmR)wgmt{S0KKoKOTXq_8Ay?p2d?*BY
zi}Gzl-Z}uCG0;1?qDb$AK6HHmTEwWjsrfG^P{&xyHAhf(<_QAuPMP**y+Bk$GrLh_a&=uw$o4c2
zMgs!R?)W4mbMHe%=Wiuvcg6Tmc{K4N5#RmRnk8SvzJEqLeSsLX(K}rrcIjTX{?DIS
zN@lUs2zG|Au2W|aFIkRW&{Fp9g9ru;ENdBx!
zq$r?V>ZY4}+~=v!#|vjxp2~J;5%Z_VEsX=#3UoYnnBP&v0+BqRO&b*QL10Q*PQB*9
zD{@V4?m6`&jhXFOd&`gUTaP9U&w^O>v^)!Y5ywq%ImHCHw4vc{qIiw%ijUezaAlSC
za^>m~rsL1EUAefunacTqm|u0@kfo-%uR2>#1*>o`PF|59C{_;y*tce9avH^Cl>|X9ldEeDka~yTPj!6@?Q0OcDZdGrj3MouL&MTXb5f7YPAVT+
zvRIq+{wF^&^iApN+*?zFiOfG6U6U6&){YX}uU3_^$k>f4Y|{7Nfsj|6T7Gu<5j$$y
zG@Bdcx5XsZkJkKMr!$Mh=t9Cyp?0eAQu9WK;k;Ou8=pUa&UTRAewC^L2v#x2PX&%6
zFKunJ3mKcThg=TBc5j_My^z8`Ty^Tjok&vS7Ko<^$}8OVbTU+OD6X&&=Top=byV>yOGo?WWMFZZQr(|Zvhb@S3f5*WZP#VbvQyxP9KE}
zo{6`{gg$AlQhojUwQ9@qkH_~y2OKi5upq?;OKq#+Ulco
z+^a2Tw7=A@3hhK~S_T#I%Nri&NG>=K_=hiqe4yStn2~tDdwjSqfB0q7t2=J@8oQMH
za{tErOCByV!8I+Vc4MF7-#HsyLuB~Q;MtFVN8*0iK|#<916gaIYF&v@#p%s5(t7vC
zLHLKAx9fd(w|(;bmk|fBfmq-AN#*7zgXxbVk5F8yphp4ZhxKH#(a`A2bZfaL616&6
zRok4OUnMRiF5X;FXH;r5lp$H{Huu|da9x$`GW7J04+Q|3h8-L{@kKViefzecprE8g
z@Nw_wLYO!h!&3yGA|dHlta-uAn(5xH~b0+
mbJGTw(wr*e721@^PuRVegOhE?YYk3s_EA&TLX|36J^eqGAV@9%
literal 0
HcmV?d00001
diff --git a/Documentation/SymbolsAndFunctions/UtilityFunctions/AcyclicGraphTake.md b/Documentation/SymbolsAndFunctions/UtilityFunctions/AcyclicGraphTake.md
new file mode 100644
index 000000000..e03cb3e4f
--- /dev/null
+++ b/Documentation/SymbolsAndFunctions/UtilityFunctions/AcyclicGraphTake.md
@@ -0,0 +1,21 @@
+###### [Symbols and Functions](/README.md#symbols-and-functions) > Utility Functions >
+
+# AcyclicGraphTake
+
+**`AcyclicGraphTake`** gives the intersectiom of the out-component of the first vertex
+with the in-component of the second vertex:
+
+```wl
+In[] := graph = BlockRandom[
+ DirectedGraph[RandomGraph[{10, 10}], "Acyclic", VertexLabels -> Automatic],
+ RandomSeeding -> 2
+]
+```
+
+
+
+```wl
+In[] := AcyclicGraphTake[graph, {1, 9}]
+```
+
+
diff --git a/Kernel/AcyclicGraphTake.m b/Kernel/AcyclicGraphTake.m
new file mode 100644
index 000000000..22fa843e8
--- /dev/null
+++ b/Kernel/AcyclicGraphTake.m
@@ -0,0 +1,52 @@
+Package["SetReplace`"]
+
+PackageImport["GeneralUtilities`"]
+
+PackageExport["AcyclicGraphTake"]
+
+(* Utility function to check for directed, acyclic graphs *)
+dagQ[graph_] := AcyclicGraphQ[graph] && DirectedGraphQ[graph] && LoopFreeGraphQ[graph]
+
+(* Documentation *)
+SetUsage @ "
+AcyclicGraphTake[gr$, vrts$] gives the intersection in graph gr$ of the in-component of the first vertex in vrts$ \
+with the out-component of the second vertex in vrts$.
+";
+
+(* SyntaxInformation *)
+SyntaxInformation[AcyclicGraphTake] =
+ {"ArgumentsPattern" -> {_, _}};
+
+(* Argument count *)
+AcyclicGraphTake[args___] := 0 /;
+ !Developer`CheckArgumentCount[AcyclicGraphTake[args], 2, 2] && False;
+
+(* main *)
+expr : AcyclicGraphTake[graph_, vertices_] := ModuleScope[
+ res = Catch[acyclicGraphTake[HoldForm @ expr, graph, vertices]];
+ res /; res =!= $Failed
+];
+
+(* Normal form *)
+acyclicGraphTake[_, graph_ ? dagQ, {startVertex_, endVertex_}] /;
+ VertexQ[graph, startVertex] && VertexQ[graph, endVertex] := ModuleScope[
+ Subgraph[graph, Intersection[
+ VertexInComponent[graph, endVertex], VertexOutComponent[graph, startVertex]]]
+]
+
+(* Incorrect arguments messages *)
+AcyclicGraphTake::invalidGraph = "The argument at position `1` in `2` should be a directed, acyclic graph.";
+acyclicGraphTake[expr_, graph_ ? (Not @* dagQ), _] :=
+ (Message[AcyclicGraphTake::invalidGraph, 1, HoldForm @ expr];
+ Throw[$Failed]);
+
+AcyclicGraphTake::invalidVertexList = "The argument at position `1` in `2` should be a list of two vertices.";
+acyclicGraphTake[expr_, _, Except[{_, _}]] :=
+ (Message[AcyclicGraphTake::invalidVertexList, 2, HoldForm @ expr];
+ Throw[$Failed]);
+
+AcyclicGraphTake::invalidVertex = "The argument `1` is not a valid vertex in `2`.";
+acyclicGraphTake[expr_, graph_Graph, {startVertex_, endVertex_}] /;
+ (Not @ (VertexQ[graph, startVertex] && VertexQ[graph, endVertex])) :=
+ (Message[AcyclicGraphTake::invalidVertex, If[VertexQ[graph, startVertex], endVertex, startVertex], HoldForm @ expr];
+ Throw[$Failed]);
diff --git a/README.md b/README.md
index 7787eacc5..bdb1f38e0 100644
--- a/README.md
+++ b/README.md
@@ -203,6 +203,7 @@ ideas. So, if you are interested, please join!
* [HypergraphPlot](Documentation/SymbolsAndFunctions/HypergraphPlot.md)
* [RulePlot of WolframModel](Documentation/SymbolsAndFunctions/RulePlotOfWolframModel.md)
* Utility Functions
+ * [AcyclicGraphTake](Documentation/SymbolsAndFunctions/UtilityFunctions/AcyclicGraphTake.md)
* [IndexHypergraph](Documentation/SymbolsAndFunctions/UtilityFunctions/IndexHypergraph.md)
* [IsomorphicHypergraphQ](Documentation/SymbolsAndFunctions/UtilityFunctions/IsomorphicHypergraphQ.md)
* [HypergraphToGraph](Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphToGraph.md)
diff --git a/Tests/AcyclicGraphTake.wlt b/Tests/AcyclicGraphTake.wlt
new file mode 100644
index 000000000..14f68a607
--- /dev/null
+++ b/Tests/AcyclicGraphTake.wlt
@@ -0,0 +1,95 @@
+<|
+ "AcyclicGraphTake" -> <|
+ "init" -> (
+ Attributes[Global`testUnevaluated] = {HoldAll};
+ Global`testUnevaluated[args___] := SetReplace`PackageScope`testUnevaluated[VerificationTest, args];
+ ),
+ "tests" -> {
+ (* Verification tests *)
+ VerificationTest[
+ EdgeList[AcyclicGraphTake[Graph[{1 -> 2, 2 -> 3, 2 -> 4, 3 -> 4, 4 -> 5, 5 -> 6}], {2, 5}]],
+ EdgeList[Graph[{2 -> 3, 2 -> 4, 3 -> 4, 4 -> 5}]]
+ ],
+
+ VerificationTest[
+ EdgeList[AcyclicGraphTake[Graph[{1 -> 2, 2 -> 3, 3 -> 4, 4 -> 5}], {2, 5}]],
+ EdgeList[Graph[{2 -> 3, 3 -> 4, 4 -> 5}]]
+ ],
+
+ VerificationTest[
+ AcyclicGraphTake[Graph[{1 -> 2, 2 -> 3, 3 -> 4}], {1, 1}],
+ Graph[{1}, {}]
+ ],
+
+ VerificationTest[
+ EdgeList[AcyclicGraphTake[Graph[{1 -> 2, 2 -> 3, 4 -> 3}], {1, 4}]],
+ {}
+ ],
+
+ (* unevaluated *)
+
+ (* argument count *)
+ With[{
+ dag = Graph[{1 -> 2, 2 -> 3}],
+ loopGraph = Graph[{1 -> 1, 1 -> 2}],
+ undirectedGraph = Graph[{1 <-> 2, 2 <-> 3}],
+ cyclicGraph = Graph[{1 -> 2, 2 -> 1}]
+ },
+ {
+ testUnevaluated[
+ AcyclicGraphTake[],
+ {AcyclicGraphTake::argrx}
+ ],
+
+ testUnevaluated[
+ AcyclicGraphTake[x],
+ {AcyclicGraphTake::argr}
+ ],
+
+ (* first argument: graph *)
+ testUnevaluated[
+ AcyclicGraphTake[x, ],
+ {AcyclicGraphTake::invalidGraph}
+ ],
+
+ testUnevaluated[
+ AcyclicGraphTake[loopGraph, x],
+ {AcyclicGraphTake::invalidGraph}
+ ],
+
+ testUnevaluated[
+ AcyclicGraphTake[undirectedGraph, x],
+ {AcyclicGraphTake::invalidGraph}
+ ],
+
+ testUnevaluated[
+ AcyclicGraphTake[cyclicGraph, x],
+ {AcyclicGraphTake::invalidGraph}
+ ],
+
+ (* second argument: vertex list *)
+ testUnevaluated[
+ AcyclicGraphTake[dag, x],
+ {AcyclicGraphTake::invalidVertexList}
+ ],
+
+ testUnevaluated[
+ AcyclicGraphTake[dag, {x, y, z}],
+ {AcyclicGraphTake::invalidVertexList}
+ ],
+
+ testUnevaluated[
+ AcyclicGraphTake[dag, {6, 1}],
+ {AcyclicGraphTake::invalidVertex}
+ ],
+
+ testUnevaluated[
+ AcyclicGraphTake[dag, {1, 6}],
+ {AcyclicGraphTake::invalidVertex}
+ ]
+ }
+ ]
+ },
+ "options" -> <|"Parallel" -> False|>
+ |>
+|>