From df31b3aa147448d0efb4e7a9d373d3981c17abe5 Mon Sep 17 00:00:00 2001 From: colin Date: Tue, 11 Aug 2020 17:18:53 +0800 Subject: [PATCH] add mlir file support,add test --- README.md | 2 +- mlir-highlight-0.0.3.vsix | Bin 0 -> 136566 bytes package.json | 27 +- syntaxes/mlir.json | 590 ++++++++++ test/a.mlir | 21 + test/b.td | 251 ++++ test/c.cpp.inc | 1279 ++++++++++++++++++++ test/d.h.inc | 338 ++++++ yarn.lock | 2308 ------------------------------------- 9 files changed, 2502 insertions(+), 2314 deletions(-) create mode 100644 mlir-highlight-0.0.3.vsix create mode 100644 syntaxes/mlir.json create mode 100644 test/a.mlir create mode 100644 test/b.td create mode 100644 test/c.cpp.inc create mode 100644 test/d.h.inc diff --git a/README.md b/README.md index ee56170..3a78846 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ TextMate grammar used is based on the one from the official [LLVM repository](ht ## Features -- Syntax highlighting +- Syntax highlighting, Support .inc .mlir .td ## Build diff --git a/mlir-highlight-0.0.3.vsix b/mlir-highlight-0.0.3.vsix new file mode 100644 index 0000000000000000000000000000000000000000..e00571b77cd7bbf4501931a1c3ee9ca5b460a1a3 GIT binary patch literal 136566 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

qUvL;ITr0{L-MyQJS5ZF&*l9(wLl_EK)Dy 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 z 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

5>|y*!5Z*rZ1)O$4$EH}h5Si`pf=9` zE=;sY#Bo|^qr2)o&rJW+h4m)!xlWXrL`O%vyStAEJ^~)8-()<_?@gyUCg&E{o-3yT zb5Ce*KF#p2q7T1{5Oi!p+~!>`jesiyjk}INu~*Rjkdioj%%WUeTpYN$q5k~r?14E- z3?!%LI(Yx6@-;GohtSZ_=%SHPkdE!Erz0XFz$N@CAjo}3;5sJhKxjTZ)k}m^7qb;= zUBmG9ytz|r3f+2!jey?Kiv9Br<^pe|2q&OMNTKy=#=vU#v;MueVFIB!ik6$2{tyq# zrxx|x10#ktkLO#83D0XE`6_)Rz zVm=<1N^&`p5NMQRv9s5vCL~yKVslk*HeUF6WOx{04xs2Xh4Ha5ZqmvuvyXfS0ks%} zY&XBt#QwSLOkPpZ{&cmYV)k)leT`Sv#*P4W{dT-=7?+lA^2w5aR}>EVw?{Yb2ynN} z^~ASWJ5@sydN-BJ9!81M`R?8^+?JnK_GUjid>p|^ulm;8pzfSkcWG}KDw-&Hx6FB@t_Kr_l7N5Q;jE5?cSF%x2WLzrKaeN%af%MijDfV}_l zNI;Ko`#i7YR`#?vHYOA})5A+6jU=KNZ8h><+IMLoy=;Zx|H zj)v0Cdbk%wXwpok>n?RKivAS)(-`cq?sE+fp$O8=NLMM3)ha%X*PnVrU#c(qcG(o~ zSR0D+w}%%y5x&yd=6h4TN2!DJR$ZDL^Crpaz zIXPKFLxYtSmce^Uhye*pOG|5NP9E+3l^%5YnyNK>BfC(kE$3uq*OOFHi*rq!Bbg^tIZ(-#%{y%_c)4H~-CJ+?hHvF-}io zf;ShLtYq8eM{u-l84_vd?I_WgL{fYz2`uflY5kPCfk?H*5zN?GghGw)mTo_vQJSRG zH0U^OcQNYRf2;1YKX?M@MdP)MlZu3?g#|K1MC7}Ecd+)oyxh4Z;1NYED<>zB7dsqG zcw>aM8Vb~4A0h~9^VgSa#n=}tin}gv#0hx1C@KyL-5!KD?(4gWioT1E9=W@jyL;5< z;OaV8VV$_pXbr{@&`*-CDU7hhctG;o5B$V{tFN!G8|{Q4NHc$QZcd1ry1l<&UPyp~ zg5udT@$`Ww4TD2NLr1gqo;0MwFy0Qu;&=2d{)@f~k^jG=@8$baQc`XknX!<5Q)vkJ zVQ)C_|J2`tz%2Aw%m}W9mz^p={?XLuqnBE)iPA%7f1&nMc2metI@7}1y0^QV&wlZj zlC22>N}UcIRoLBnM|_z|B=1UPzbf~7$=@(>{PNV+>IMIoGB4r9Sn5|yBb;!4dmrp` zMaNNdG#q1>=gfR+XUK;+i8fZAN4}9Ii_(P^O;d4av~<`3JANR97umgH*e~uyrUQh4 z`)IO{OjA+nE9}pgVPni?=PrclbOiUjZMm$I{u?4 z=`P@)CuSxM2bmGqIeca|Bh32_7v>v1uBXY{yDD&g4?EXYm99?OM&mF}QMR6gJ9=ow z^&cO8$ftEDtPub{{)cUvHcPxfOTq?cS)Km@67H?%^!xSk6 zoGn?BDqXa!tSqFUr`K;<%1elbixnZ20mKT-z5X>#ElnZg`}dgGSS+LuD!Hou0Rf6M zUlI}$j*pMq+9a&hfKRlyw-*r+!AAD)Uo$f{p02Vt5_XiKVkajT%~mGnvD2?&>W$kj zV*32PzVBrioL|6cf%BEzJxJKsDPnCq8>>fFDoN3OcVsH7U}i)`dwvCTV})(>EBTjG zLya5g5s{(JTO7i(LB2E3Xm1E(b#<6FYOmf72ddnXarZkq2RtsPoqyl&sL~ypH({$61F} zYSyn?YTD~ptp!gTEe*!i&6n}x%1T<>5ikDFy1i z(WxYvrdM^UdI=nMNjq8ve-2#$=LI}^e)+`{b|sxrIOef+{qRqYYPPesW(vIzQU>yA zsT#1XgajQPOgR~thZu)(Aj!k<_N4>2a!moA5GhKFvIHON z#Ep))-g?fvaVtRh8@5i(=~UMn;ZA?+P+M|^s>$AoLAd?q42K`xZKKN=5FHwtI@ zVX54Cqs@#+l48K>XY1-t_vQ*yV4J6Z{)`C$VXEGBeR1UI=m=!hJ^i)5q^r}NqtjC+ zX6DMuN_1po%}N^`YimXb2>~vTKS?fy+g8`jtx7SQfre(h!Q0c!EX(E&kaH33g?zXk zOGXOnEB4ogi>gYVLc(g{+CrA@sZ#^pmBBWn@WPgr+dy~-&)9_rS}Y9Wam@V?0WL{ytQFA^Rt-BfJ`VW-fRN7o2?yt`&BRSf zX$&p_sFHLyK6ve%rN-r*gxkwkV+2zGsW%DCbl^=b%;Fy-BK*PBa;lSpdiWOr6?dgugKNg5a! zdR69I&NO&IEZkHtmxC8v_g_5sPfGgP*Suj-p3uJ}q>A%r4aR`H!RcXs<4ZdgiGfR+ z9DXK3w06_dmY+X)2<5D;cizGyCNIOk2Y&Y(DgjoRbET|d%_b~6u1iex*9w-qEW1RR32H%!}qV4-?zCam!uScsMWSX8L zT}Oc$&}L6LVwkqn#dk4N#M!BPQxk`D;+eGN$`W^msW)I%t)SJ{*QXd$Q*`wA>y?=g z0R5xRplWFNO@XG)yB8eXRJ>uClj`yC zP3NpJVMf`;d~g;CGN%0POupEF6n>JNhhaBprZKW0qH z#pEUQg&Eg!IKNa3(`)ki3PC(fc^`Ov#fuDY%p5F{4uC#Em42Awloe%y7 z)PJ0d`VS1f$HGqqL(GHHS&kw*RO-vX@#FUg6Wv+${F7m1^DFv}#yf|vmA@|S9`AAE z3ZC3vds9+UF0a7a{Ra;k)*DED%_k-%#wGoQS=I-Zkq!~Lw@W`u_QtcadRdIee3hT9 znNm(@$ZEI?CE)IhV}%D}TE)`RQdf622#Y$|gPuZteg~7q{#sJ9FC#y=hqlqXqGsVK z=kT*F0li+&pGj_$?08plE{5t$_I8E&^tDx+x`|S;wZ13adds+4ai5K{JnPHXs)^f# zs(@AA>lYvP-gj!a+=Ol99%gfAYHAAG*GgKt#`A1<-IMp*@UXIA%3Uw_9Dn*vco-m` ztQ4QF6^E3QqjU|})cLQ8i3DhYwVr1-9v&V>MienCTU%EL?Idcds<%fecf-*@ON9mn zJw!zXKHSRImYJS@s@AoTiJOVZ=3ucE1S(jP#nvC7Zg`j1_r3cf$%$DcSS)`foR>6` zXz!)|7YS!w?1mz~`u#4f-CwRhtAK)v?b584t{-%b$;run!7CZ2*sJsN-{u@TG8j*u#Kp#PyY6bU#pfy0760P2 z9OZfb+~;h@6*ySnR`1=rcgcr}gw)g)`rsD=(jgxE|A>_5{~LhE?@Kk*{}w9e z&sTXCJ&B=eo4mc%qqB@ftSW!yQE|KW^&o722iSEZmh54i!tPu&xhghvrIAx@vPb6 z3M{A{;)YczSS<--WDV|j3)OT>+Wx!F=?ZnWC-l1vZT?gIVqxrTe%efh zg@q(vcUM+$2nZ~JkzgYOE(7fG5OU-9=}q7yCMM>-?<$@&(Ilx=~YHyd1V-cZ>0)uoza6ggDT9GdL1^GaGyChxo_pB_vdXJNrVapL6 z#)ky9b&m-NWk@k>W@MfhB{rKF`lcN%L|SPjVDKBK1g^z_X7{vEahE-+&mDy2#i zxVISC*k3+>KHT%Yn`&-O%gI6hKPN~1N-+HFa9yXFp0u`6x1kW38FauwJyk&Lj-$uo z7!0o(@PhJOzKqXx%XKX}nryqYa?_|$sN!N><8?S3WW!a?e0$k6n$rKstrVAP`I2kE zj292n_u5w1MCb52^}vXMq%Kk_OgmF<)^+pONP<+wQAB&NDAhe-*S(hUg8W*^%+U^& zO_xq1FM-EFF9?abd5FT>v4X^2#Pbl^bT~nz7)WArzry|@T3RNirfg^HE{3y}4h{}# zU3NTn%Ev@SMT?RwITCCeE>`m^XD?S1ZE+dYS!`$dAq-^y$jC@wuZVsb85te0CKWGZ zDy4;nh9)Q|NWg8QUF~4v<8zCY9}au&oX8qercnzzSbUOBea+`*lW96Fhx7GBTo~ti1jJ{_^U| z)5C+GpFhA$j}UDQKnG?}MnOSef4}XrD;Z`GJ^=x2vvPL!^z`&M9Fu-f*9_>RVBBPfKin;{fGyXS6a1!Ej<`RE`k{w7fJOj?s5;keTgB zBhhn4;HNZmPh3lsvN;<$%huHx8hTrp&MtmN76?J}a+YIBqfFZ;8^8uVtKCZC&iHDn z+487a^03(Ckbae1>0sKn+uOJtH;=?3*34M%)Xk3Pym~q7i|qNj6YJA-8Cs-NS$S!+ z)2kv&4R6&^RSRz3Wn2Xjhjs#N)Us1AJ+D`N@zDhQ65@ zxA&zJQ*6jher8tI-I~x{JdZtaZ`Q`f%O_i7#U^5iXoN^;Xvy5R$u=c-9g!5s{-S9L z%Bre007uu>u#gZeEw{qL!pI1ak&u4mXaFb{tfCKO`h=_=KjXpO( z*tNE{df$bd!^6Y(f8~XT?Q>6vmX(^S|AG6PGTqtkOk#BO%Gw%;)zc>3F)FI6t1Bx8 zb3!njvXW^kGv)|Na85j{O(?=!ZCh2vwlGu|HB^7cR4Hz?{?tV3;^HFwM5puLt6RUP z4G9VOH?nYVg|mj75B@552X+k2&(EhSWV#F)sI!Wa!pbnyZp{Aj7MP)aj)b|r`Wj(X@287U5W*yHYN+ZKH6Mg@A$Kdg;VS9 zoG(k-(cmj)&`~L!#-F7qp&vhf_))_umG8m#QIrXOUC0?9A4fufo4NK76Kes&$=Spy zgxbT?^Ip^R^z}v?0_XwY$L1QmFN07Yq*qjowzYjvTUfZv2ncv^V-I%|7W$NZHS*DY z1O!4MA3`W6H#g|Tx7u1hE(CQ|)wUIf39E|0KuIgB?ZM1fQBhGqZkCsqhlF&;>iIl` zaBy&dzZ%l>XCVxgP|}38F2iCjAlsd{MuD|TQDQ>o78b#uK5^_9k#;z8{UzH&H7m16 zb50!pt7lc*`=bG5W*h(YlPV|dn_mld07fjCMmYPvE~?K=H&;|nxNRIaq0ysiir<64 zy{8U25Vv8~qZu{7s%-CRS+aw`cWc%w)tml)M}>!H;@hT>Bj0TENv)q!+LM9K#b9<%|IJ!r)nE6`D*i-v9H z8q$jIeg`iY`o6t5@Y)J};<6(km+hxprys+1>5UU@bQf&1BDwYjy9dM4=6}xxa6#RQ zmPp^&+{6a~b^fP|i_21bxV)6q$MA4Oh=PK`YFv2iZONbZ9uXaQ4!IP;`l2EhQc@_e z1&mE26Di8iHaI_#?05(hd(lu(mh5;yAA#ZdWX2UXd8S1Uxx%?}fRR|&l8y1nI7+rC z-R@)g5_|99Bo$6SPB^vWsdP z=u_byt_U&PTec;7IawX{} zl)FU*=w2*@B?bteoxQYuvu$2CveVdXjV$IT@Hsp@JnLNG9nM2uE!7?;bQP-h!p{R+ z-dI^_*Lye{!rCIhw+GXDe&8$t0Rbv1D)ne~vp&jOc@2$;2o>EhsOQWzfQ9 zIhoFDc<#cl-_YuD##Nu=9b`y3_ zSV>9A-u}RIuYPT537`^y7oqEYG4NN2$9eNhR@T~2f0Xu60z4d?R>NYs6k?unt|oxd zva+(=wzJy+SQi&d3|o=6x1O=E6y@aPZ1@I;glsrH$NgwERbdT?gNcc$udnan!-uM> zs$f*Jb8qZ-BC4FM zY-mWxD>*qXcJ`$Mx2I2^zRx{!q)rqyDs~!F*iSZ%P-%mFR39pOu;y87g5` zC8lpoaxP|LoxTg?#>*Z~K&fblAu4+COCG8&3F7)%gXvsC%RyxlxcW z%yb04df`h~?NYWqN^zxcVUeSlT~k~8$S1^CiJ#aOcy_>Z+I4QlirKK0yto+j)YaFQ zmyZE|W{+%6RobQqdTaXP5<)<1U$ha}GH8^1kfJm^BR@Sm^F8Y2hVkdS`zQr^jk=18 z?~<@32cA>Wz?xL0`|Whp_^kEHSgB$WhlOplk209uYZyk)snwKFld(I z{k^f;?Z7Zvy4?Hf6vR3ZSmNX3ot>P(c*P-*&CbuCDK=^cP^9a7a{?s0^;CsHC3$!% zz?k~8*^toCnL2lNw7^=&wLW07MbY;p!}#l}D*^q~*9(x6&i5tpfhY#Z8MZ0L-rm~L zMT*zq!<2sT+nz^C)%o1i6iAzxtR!$+I^|*nSb4y*TF2IZI-FpdVvQ#f7Z*HAD+F7Z6`uBed`xzorBo^ z$bD-`-}k7+|GGKNj8wq!J7xOICG#{Jx%*=&BZcFF&Q8z00U(CgI_xlu<&FR{Ut3=0 zKQwhhfPf($9Ua{zn^pZi2XcNVZ~shCyMu%TpW1D;qJhn_gt30VZHA=p_QC$Knk5CS z+DYl{Kl5L|r~k@~J;DBG673&H{wEJ;SvmeisWOufS=1CADIG=q(!`u*ZNK)j4YV8t z-)z|^y}3-jy#2dIE?YT2Ki}Qmom%dz+h+bJ{kN5`ntmOCpdM90$Ch<{Ip_t16mO~3Xw-$al>XnS*gMZxxBj;Hmv$lOmPMo(MqU5O-1x!7lt&$jN@ukrDP zW!kJsFacqiSn4e!B>}4{GdQ~~f<2|>$9sL&JahrHSYI;H%6q2Xo}Ms5-p^mYIGyd5 zda$WlSkR^P-vJ4jJa8-74n+HqywHk6wP@OYJlC&3EBsDRPuuZK&(yjO4Gj?x5EL`$ z>CJ@;-By*99H!h|XBE@|cOWApqpzQunP~zfHHbU2^`6ev_V)H6c+7oWU4JSl=>IB_ zWA|o8I-KUeiSsiMiKU@DA?n|hc?ba^2VjCUQp(522k2CX>N|MGW;YT|nm2>1k#8+l%%LX_kS9g}K}{2Kh0 zn+RtIsNyM?Q$w-7xwiJD=~;F74kC{^Z^7o5fFmkyrGTpS^u3DMJ?~)?#|1@ z!@}fYD9G6=}KFYXla~~R*E{5|Gex_au)qv9Y#w5^K=Pt zSCT>&J2ofI`=ciQa>?aQ>}*?uw`XBi&-EPb#eQ8DuW~>%RT{^WOuJ`hcQennJgo7~ z%5}8G;NT$G)EgI`JPqYDlWzMOxLUes6v$j?78aBsYrf|m9rRh0Ea zi8%K~?ANc`J3C1U3736*dw}*>;$>!hkPt)_6cnVTyBhCqY!MLyb8_ey>eU9uXt(bB zp}my1oonfQY#IEr>)^;D)FnCV=)0JB3{~6ESF2i&WfiaH9$GZ@rw`x3Xy?wO_if?D zUi%W{ybjUN-RH8g)GWy-`oxIok>e4dnfhQd$43KM1IWJ=p@=S(#m9&Q#|w5mPnq}M<&s$g3pqbOx0GU+$)9J>3@0OZGm$k40DG zQZ0WqiDH{nJ@%Sp9h+s^Cz%NDZPS8XU0oeuuY!Lj)2g-mmJW8OtKp%ewf_FzUPfkS zTPrJ|r>T?V&Q4DsK%Smgsi~>3;qvX9C@IEQAzxww+ti^AZ60-MO=JZaJ+}gwBu8{kvTgoc_+Q^=XQj{ksGkV(lc>fg7~{cY4jW>YQtDtmf)a zkW-JQVT^0={$2x_7dVz_MoUePk38SV~VZCrv>C`vxW=-RgwsI9rB;_ zTc)NWqFQlDMM-&S>%xQNE6LX;Ji5BN?styszsVTvTZ3`T`jdM>k62sZ>{QPA{FPkO z*SI>{V`gN;K|*ldo$l=HY!-Bu|2aPHc6GXAZEejKpO=wgygVAnu8o5qy1KV_*Mcqt zZtB|U&J=L2Ksj=7a<*E`RN1Ek0pHko*AveUG;?u9h0o73Hov5#nd6P2yOTm+U@Dy4 z+*w&!;56Bmhz*i!^ND{iAD^z})(m=sl1S{Ljj zd?@~!K%&j$3M3DZKb}CB-4O)wXYM5Lx46W7V9TI6_+4V0+a!G*Ig}c;4N5Te0YwefZO@+u`r} z*NlQrPEHWu-ZtxVaB%p|E(Xoc>Ow5s+`cs-2t-6g_B;R$LGr%S4c=GBSWi(UK=23+ zeKd+FBPRC#mgnv6G;?fs@e+TDpP%1SdpNwXvomL;6p+g80Z?~WSCuwXV(;nx{>RWz zof@Y%4h|)X*<}?KF81~phuzHgQonsO1l@57vnLFBlb3Q&=yK|Oo&?up-q!bks^Ib9fgXqHi-o!n< zgt*(=wEhqO)vTCrDdYElNat58kMTGL8#y~7PR*JwWe&mf<*}IK+=uMM#*-P^@TyzA z($v#;=7`zR!&~kN3msdY$ekpJWZhioGKF|kdpj+EQkdim=05yjtQarz{CM2WQRygR zqebQQU+Ffwq@R6q3m5|Qg&`NIU3%{)6sCAo}owwEmC^@11P(+4QgMZbz+c=|Q0Wg%b-2U_o+FsdIk=g`s7 zF=`JZ(jM>Yv$;M$0OEeU>|?swaA>HQ zjS}-^C9(m+f0(2GX_pT{B)Jr*{mGiCbzJm9&j07q*0*GMy8lN~4M*$aucd{ff;kg@av*KKS5AZAQ3g z+Hdo+#;MTBM~@yUWyukJ6*TyXK#1mgzHeZa4~4W2_P53ip{XOkPdW?@CAoG*<;Ahq z-%9^6I5-FgD}SiDwJg_!-^))OFb~j951*!Ii{IYn|D_lg6N9T$2sI51ye4(~)wDd4 zt5#ed3_r+AC}(7}1Y$PUpLVu0#XWxu_eq9oYh$DNdjSt&Up%`R=3Q1^o>d3kb7MB% z=g*(BvpX)eg_1|ou(BQikJadQ@XbeEEK@P%av9|vKhFOox7I_QVofCH<8uq!!b&!= z&9E2~3(H@WjEk>h?TA^Yrp)KYgPEBbP#_^8AwGUiZl+>3fU?g~QDgty!Af%GZOv#O zSFx2w)39S@@;YwsccxBkzUTMCDdz2Rzk5c85~ChXTVl;v?|4nv(xCxQgv-{ct7dYl z+&*S@X`Ecxv}6}%lnwq<9-0$}^d$Oc>YTp&1V6qP9*qDcRBz1FwP;j3n7FubaUtBC z*@G^zwcP_4j~l{i@bkl;Y+DUBq^YU-@x|g7S|zBdxp^ToR(G%vT`YQp618l?uN4Po z?JAb#j$e?esVPi-BTK`Fk_hQG8bQB@hn2OpuV+2?F3!&Zb^@7-E_98d)oZsoOe-(n z?~j5PM!?Mk2)5NQNl?J9$lC8cB6>nXg3WB*L`zFcYpV%}spDg>^!4>sR8)rUu<`JQ zHk=qRCMv9_t}l)NjD1Z?!otMN%gZa!sWr8**xcRqxi~b@iKbU8ST7WP((|8G?|#V4 z$XK`G6^Rh~^8Z%Cjb~BT@A-cx<94$9M5g!3xmWv+1S_T@*aXk!2##vfVB>AyQs~DI zt`sCppDwePCkINjD9Yq2Ii~t* z%qQ2U9Nm3Ks_T{)jGMDqsG^}9L!M8LQuA?~ZoM+~+ec*a7fk-a(;pD35s)xQF)*bL zua?H+{3&H$YgQ)plkoGhAN5`JEl{ojcy(+exTu@x^(jrfDGVl^x8o^RpB@{_>U?s? zQ8cj)d$i;Sk&uu?N)7-1?e}3tOG|5MY3XctCO0z^(24WTBqwf2Ce0HPl1A&P3g@j+ z1C}St8ZY8yTvmJHccv-}HA=q&#z{>TPF_6IDyOKbfweAlp!yQNe$A6W7`Po#)9W-Y z0oV?(+rr@i28GJXG40BDu~BfKprD{(@%eDJ(%ZLhYhCx+mJWdH&dkh|;>fJ1I0ekp z(9n?Lb@)4e#4Z_9#R z)J+!^lCfcG+XoJ^s9zN;VM8)Vujgd<%U$oVD4#telV7+S2&kj&;IQxUL?z4F-`__< zL7A#?wv_MJJ1EEP@I)0lpNG#37Ysvm7ik?xmt3*c@DrXTnkSZuLX(s9JXQX-cKy_q zj(Ur+Vh@fIv-8)lMfEn~c z7I*o{_V%`Jo!dPkxQ^O~pRi<}2i{e9h4Io><}7H>DnYY86tEs^<@sg5e2aByDA|j$`fJ`JCmckHlqL<~AE6WBx*0~hP)8{?k5hMm&OMU&{b92lfIUBibNy56-Ija(B8@Ei*#mdYb(&wM1+J0(2Ex@KE5DFeXz8=%)!DE5fP!Fsd-6d zrbw&K;4)QV4VYadeE@vfD;b&X^>yJKegT1->+6p%3_U$PrKN+t(ie`8j}y6VpY!mj zYiIz8oWf)Ou6qRz;1#dlOWWJp>gq_4aGC-z zPb#YK85syrlWA$B0|JN<Zj*x1O=XlQ7tsk1UNUeHC;SsPhd zF+@v`oWZ}nCi~GtO*)V2+JL8dyx4i08(8J7ZALHY9=-N;#d5n&37L7P_hUz)`}stU z!1o6)pr)jhJsWA`5*@OL&h@rj6FDGN;v4Hac&(iO25ikWw0kg(d_{O^vf*2hNP_3K*~>6jbRe2E{A zYXdxLLQLb%P?70*cDh$J$*i4N%wywm&r)v2yq`7o3hrqb%}-cHsvSkp-1IXh3Es)@ zUEkcWzEAoVXuZ8I5OYC#Ja-qXql?!t>6{R>ko(q+{lntGen_Rwmr=K=DH;K_OLZbh zc}JmhyTEv}GjJQWGq|EK;J&lGbG%?;5!{Ku#d-VZ94 ztdzyXjA~&I5WafV-O6crVP zAb#ThsVUEvfJcyDQ4x#npY~QbHHZmtBj{7_tJC`k2+PaMKgI;_y?5Q6eq&)#<9m18 z(IKU!HIc@a_dK%^Od$b~p-sTW z#RcG`ud8bk$o-Z;baX-<7Uxan>fytcZX-iO*q)~W0Tosg@2~-s<6&cyqBTDOp&>m# zUq?+%O;wc&{Q;1C&CSgKp6Q72-Z%fq%iG@DE6mN+s&gy8e0_X+%EiqM`urI+_0`oC zR?x2l>&3-IVAY&_^uYNCcQK!05~wxrH$_vcOJ{9(UvlI_SDy97G?k2KU|e zO`DzRI<~{Z>9q6Qf%Z2D;IBX0Z9L3a|B3W;2C>+ zdk+o{0Ez&C3hBRj1DlV6g{7pbIyyTG&ILzqN%D$N7NcX}B}9KSeqr@twFNx`M1gZj_&e$r^k51TzBesirME6{ug_19aiP{{(C+kf`ovyw6t`0i-0spcS?6lDgpvh zA|l-_-3`($EiK($(r0Zy=llE3nL2Zwm^m|Z*5w~w?9Jxc>$&6ox}STkb#;Si=WfQK z(a!NbK+JEGQy@3PSNf*!%yMfBL!llSl4dE8@i~nNy4_qk8)Oy8FNv{r)Tk zUo3cGLL|Gy+z;T~#O^`zTu4#nF+^eP7qd z=k{b{`1R}8aZEZv?Ms;XAkTnL2IBc(K?uMx2-!Tu{RE7Rj6j(xCh;n3XiUw_Bt%6S z8X2)UuggLHH8t*LW^3U@JlZ-sW22)01=WjnpW`?BTyw|ugWG{YD){#hD{#ZXhZPqy zXNLmkdigR?m7a-(#Q>Ps95nzP9dPXcCt-)AFD<3>j-`!lN$X~1WV~-P%p?0KO;zu( z1P|`BoE+?wFTXo)Rn>98%?rDyqU0^u^t7*VUO36x7v3D24HqV+zAJtgE&Obpfp?ri zQ-8M0-Vd7+OjgvZ$e>@dvx|+MuR;2uk6mc;avwl30Gze_j4+%gTH1!2h;Q}e(pz|O zU;qs=G&7^d3+wK{g@fd1#s&xXegvWdqfF4D{wf{Sq7sjG>ED?K2Px`TB6>1Am2)%r zj?}vpPh=8CNYKB=`M%<2ohObI@TPv6CB@S2dt`fB6$EM8azd@249Q7JY&TjGtjinT zZs>e!8oA;fF00A%{_3{T5?hE6E*@C&<`f;}HJO@)#X>4+r#Jj1@i>@une1ZiDw&1d zwSEoZ_<(?bmKKp%na-6X$Ui!oN50PI@|YTHATCp~fnGI)+yDhVH~*yV5F#R?JxieMr0M>xVMlkUHA!-z+p`#;POmAgPjX|x05y%x+XFEX1yrhT*TBfLIuQ!Gk z4l*+{BlEi{Gsb&QPlfeL88)88%7lOX2y56WDY5tS6H$RZcJ1YRC+h2`dWFDFP89p8 z4?`+DGqftzKw$3Yr7_l?imbf6JfLw+#`PnQ6+iRt8w-ja)4qcbGW}y?V@QaIAg(nw zHaa;wA1ts!QrDPu*t?_6&Dc1h194gce$(XhJKM3@@yL(o^>F7Z=IY z%4iDs-ow2!6!o-etjboitfP+}8Bs=0%v8-voSGkey{soMDuG*YjQlw!2CyZ6&d-hx zDt2~uARNM2nt}I$lutn+?sIQa+;!w=lRZ_fvbU{F|6aG4(DyYbMzKYNG?jLZ-TWUX z9F*)nddPn{LC82(f?{iH3$}!Q@z;+Z#xs?cAV~L=f2^+N#^R15QqqMDZy+01S54jB zFXrZS3B!ZL)3LCyqPY3_`HvY9xYCs9KtNz&VL=Q~*3n7)`jxwE5%bZiyX4x8n3MsM zW#3L6jTy?*OIB9FRAm_%yaJa%)ZgF{y?cSc> z$R$H0e1Xxq>hkS&PS=orh-yy2Bn44(0&dj_l8bBQW5*JOw5M&N%2wI)1CJ{&l^55l zPER8bVm@|1-P)o5ng;!<3sp#YFXANR=V9v7_>unf>?}lL*FDEC*^JG1o1=b;h z5?JrFhVq#~G+PDNI@)E1EuXcA$w1>`qUFVwN@dUtE&1r=BqCH=UjBKOC02&ZyZXH} zl@+^`hCMD`SXG(wXOywYNtzlI$k5hye&LScUGM0q3YCVV9A7}2g`FKbGBWaG*l6-N zTK=|yiirT<_WL(^xl5-Z>;8NL{uL?^nldj}4a+qB{O&=D2f6<2{2Vyn{$k7hQhRWy z-Q#zn9y?(ym_0gT*@}mG`%f?bT{<+XHbhPu0r8f-bWAg*p-+v4WA&Qi_llF)=Y6 zPTyy0Ss-24RE*31fJ=idk8s}yF^-v;8JjyTVs^d_-&-!x{eGHAC}VnbOl0c)he`2t z{tqZE9SrpI&pk$A%|;0z^O8wRVtgn0~9+?mF|cJhtKLou_JDdncdbhuxG zOFH!vak^#i{7k}NiJBArn)GW-?j|Kg4@FN27A9s?LPF?=w0nNtI;YOR#{x&mWGjGM zbqk`$R0$GPSyg4k`mN4+10MSR{X1+u$IItsnjq)MXO1}VCPhS`tNa=pYhO9~%3^>H zdumc0zu%4abPybRcmtaM zESCRlEJyw|CmQr~bo6+0B(uruf}f91nGVO?d?Nq}gJK#Dcwc!%#r0u31}tT6Y)ECR z*e~A22Ai-LG=FMeqM)S2XV$f_w%*y<3A<_hxpfM(##aN6)6FL#65_O+h9n zC%d|6czJ*I^lav)`uH~GxBTx!e^r=cpa&Ng77946e)MMJ<>vm{X&e|FymI8hotXUP3#We4;G2HR zVC;2Y*VnCB*TGg~@L!z0$3nGU8w@_-XupM^e2o5*SV2WkP15=wYje5QotdAJhNmCT zO(BPrO^fV%EUqoK?bLa<1#H;N$f0H>*>T7d1uU%H^0RG=JQUGm^39PHXn&JX9Kn6e zO7-Jizk5o}?bR|HdN6iaCy*owpNEE@4-S7 zh#~-er;7DV$}~gY1L+4?49IN~!~n6BmtT5K&4-evfy7PVvZiNXKt(}WeeT<$Ch)%S z@3=YKo+#|??X{A?+%xbwibKv>-;;7ImD)-rjV)yOBR-turM&_)HzXyb$;$OB}U)qiKZk*@1CD03238x z!xk48ckrw1MM_|r>KUwqa6yn5ooBkl=DjElqLrL9Hv20ZoqgWH514232nJpkB4R2k zSjRYbWVStt@8z(&8@n+xP%tneOG`_ObZX8|^SrFqhf$76+cAXyh;C&@u88R?Ii7AR zU+UnIN4X=_B8_GRjE$rS#cuNXbtU)pz75-JfI=kL+1M_NdhHHqRPx6=JE=K1PBh3Q zgCS^lcNb`+y99LbXH{HWDkUhCV;=G$3J5gdv*?QkL&tXTD+n<|OD#;PCJKE;R=jZ+ zIQ})MMUP?Cw;rAUMYYZv>HoMi_g`M;<2*yI_PU|8xXdNwUKltO!T;vKN9Wp}5lLf3 zfWWI6Z?-$f3fFdlH}J=8HrReXr3D>i%IUwuh5t6P`r)xc3#_|q(4R<483b#xA5UH{*4QtOX3N4s#%167*WQ?$FV;G)6j>{`6H4jK3|I!U z?|0fB4KaGAXv}lI3Vn<4;&Nh_XSZYM^YV(IIpVY?>O*~((=6cvkCBl={ngA)=eWTt z8u<}2(xbnS-GwH&T? zbabq)$vb4q3X-NqM?b;CoBYYDC1BFo)#b#S#9=-pr*ehWrPtLx&3AHhySq6V?(gq!`Lm4b=|zlQ<9YIiKiSU0;@9-F7LX20 zKOTBAg>@bu9ld(>s?KdMAp?&lCS*5^H{S$EGoFQJMbQ-TZL)p)-GuJ~)KFS|{nhE# z7?2iW_$=rsC|D?gb#-+yx%-jt+jnGpe2#;Xc@fv^?6iI&ooaT`uk z3hz1W*_`MWaX)>$Tso6TfQnwEL-_UcZP1$=zP$YWkjTh5GBRUX*Emm!=X&ao_!AWNUkSHf7-M>KdPzIA+1w ziEhbBh{Z#=0&K{Sef$z3;w!pbP-=9uL-z0A(d%}q|8KRk4>v9Wpe3Yjo`q1-GC{II#%7X}%h#56SGI*se< z>$i7yoOzS7va$eev2BAaU7%J7{7qXsfj-9jDJq^yZ_wL%mH6G@;~AiWl5YcoTN+Ao zGkxw3gpo#_t!E7eL*0rpcC1XA>yI8mX#ry9yK^4L>zQjOIV|5KNrA0R?R6^>&93W2 zW$?U(gE}%ZiH1yjs-hmB)i66(W@8@J^V{CMV|b}1GT9_iFc6;mp;%Kez-C~7`Tpkk ztciZhH~z+%Bhrs;)gCo(6{G+wg#(N=*W+Pry77&jxTnjdJ})S^DE?m)~&Y#i3@G`Xpao|5Gb)M1^gh0l^o|}0+9$uEM1A< zlhXlqxFmz#M>Wd#ZH7wPGSx|wqoZ%bC=yI8EuTJp>bWynl$MqTg06fbH;8A?)UK|s zU<*l*k@;LUqvGSWq@^E0{@p8{US9UUO5q?(JiPTi*kHnZ#5n?J7w}i5{bIAfzkgB^ z@!1Tm;o(rS0HD{4gGI8ZPc5yjiEwbJ;sB|_I{v%DiB67>-S%d(v(L`QV%+y;US_Lg zW@NY>EDUa(0B?!5Ztv=PbFn|KrKL4nWAFFpaOvFxq#T80`Z(=oZ%;Y7PpPSkKY#uN zED$9Q)a(2A@Ey+x+LQR4fsWqU-tOz`TWy2l<+yoyYaN!vvsa8+31VYoZ*Om1U0s1G zs*8j!EG(?AuLCUsz|qgok0P448KAZfjxjKAJp2rHJnLQ5#{rNQ7N95iGF&;f)QZvV;22~cMr#GfS& z7MB2h{~Z7^14AJQd3AMs!on#M6ny;r@DOl)SSO6JF}UKH*;(*g(H;*%B#hbPpFe*N zbYD?HfpM9pva<5T#Dw&{=Y)K2c^Cvqm56xgE>cX*{u-Gb!sm2ou%2zG^Ld{$q(Aoj z3i59>50`zTWej`x!py6iAEmd#DLg8YqhUC$fm7gCB+ zi@*2!f+kaZ1?V3_tT8r%$u{212V4CqckgG`$#x9raTi5X7hCs=ZPxF$>s-rIu5RrX z{g6shtv-mjoTaFq7c^$)itujHK;%t%^k*ZAEi)MJh4mNbe&{MH+I!=6eiEmM;lyt< zWL?KwM|knW;|Zk+r8BBCj@53HA3Q~YgM&lQUEt}dOV-b+DIP%Tw6wwfYr;NPr@>^t z9tTYqQ3bMb%(%F?RW&tJQ&Z+|-cV@FC#Dq^dTo#A12lRks-&cprVlIoV1`KGz5wZ2%VHeis>b-HDmH^18+z>W@r2*bI# zx%aoXRSG^zW`gh_ojrPdeB2p^->)}XTU(ng8>e6IVtIdeOG-)_%JG;#IilkwJv}`E zTF}+Ij}jTE_{^;F105X_L_~=v8^cmBUovS|ZVoD7ARG&%JAIa5qpCTr?!z!RZ>+z3 zx=9Ffws_O~7ftWis%&r0dDtjuX_4YjEj|Js98Bb?s;taX*#d#C`}^U<_&6PD#)t)0 zNCybUFN9NvH%rRfr@H0n(N<0WE3`c~% zJwXGxcJD^RS>8?Kz&osrN1JSe@BHhR;nDq@8mBeY8khaLZzk`%edH4HSGT-R-wHzs z3%vIobnDnX8)<+XRq0(P3e=9@0OCCE1>SUXdz-IH4?Dr})2BwuzP#D0K z2L{l};L`K+U$H5Ww_KnGimwV521{n@wfK@iN_u+XZH9P^n*JZ4u&}Urxg0R3KLSx7 zJa{lwVn9Yp%8V8ADLmZP*7om?7<3E_*MC+baVs!YpG8ZD{vCO$RuU2&OYOk`_O7q5 zqi6j6A^9O>gyZYXQQ9cD={!?aUtW3=wePn#GfP23_%Rl7+E!Lp%gf6h#%z(@ME3#$ z>r&WaG_QSWRkc%6QiNGqe{XDTtgXc+CVBx20tANqD@0BdaOscwbu;IpLY;*E1TVA_LZNm9z2}FDSby2{0cae(CPg(b10mT8QX-f51RG(8)NMFAmI|^rFWXzFI z#3LsD#298_ZB1$PpboC{?}%eDfNgT^?mj#?m_1@aheQAD8JuNiW+vsZxY7fZ!19`! zi{oPu?tw(Hw6w&&26*Ocu3Ajua_SnD)0kqdk`on;@u2;|jo6({g_ixuBOxIn_V`bo z##}Zcf`S7}4j>G3#e0B@85&XmWV;&mm&B-^gbcnhDf^{W(G`)MoxPT5-#p#u>8!4f zho$i8<41x;Ip_V`xlK-=ZF;ZS$%Q-o1g!2~W^)vejn>=R_09&h+$U74QEDhj=7KHy6Kc(zFf7n?L)X)xG~-)xBe# zv#^K-M7s;Au#I$xmGbxe8=bzFg6mp-S1n|9011>7 zi7I9j_pM~BvcEAV*fk$KsL_8{nxmFU^g>ir)XIt;>;2u1!&)D%lvFps0s2^eki%dF zK7$rg=;!2QP@CcUP%R1Rt-7yX#D*7v!clDI8aC6bvc@owg4mo{0>0Jbfu)^WDHWlkER@R^{)LxL;LL*B1!zN1*xfIu`*3QUN)t+ zXu!3)mK>s^qd`J~Z8vdt_R?2>)8*~UmoNKS1mB(luy_{HbF|W}QKD}PJj28Uo0!S9BZ8+-r>Cd0v$AX!8ZU1yPl}3UD2zr%MvkQv z$fMj*VozFxjTYnQ{Meq}y_4mha_9WwNWZF9H@u%-^^~ z{R5aq>_;Djyv~0+z&h9{r6PLp158Xzv>4SrJa|bX%`2t>!LM{q+f)lW@fz)G@H}KJ z^UFJbCd${%Q}m7NY=W4LV-5p~x+=ZV?mhVuyq3GnRFfipZTv0`v$RSRtb!!rY+?a7xuc)m-BOHr zsr;_=tgH?|0(l5F7Zw&)R^o)@j89Ic2>Z-TOBX=?$;-P3tDPH1;h6Vw| z0ObK=W)_ykGLv9IRI&VR*fw8Hp1j0%hl|snJAuz@iY;hkfo?J~G6HgVZ%g@Nd>|EfRVawe`|#bU6j^sbW7_iO zNak@3qbT_Sx&ubmE2P{^Ausw7=eth=u`y?Ov+i(MA*RO0$2u|d3-Vbi`C(zQZ{Dnz z2!BF{gMLj<19G|HA_0FkYje{gL?VL*)d|hb&5cFB(H|XdbsnJ$nI^g2Pe-^r>5I;U z1M|Ui?+grBk?w%;C$0ZKRXRvl;Gh4!hkW4wR_n+i(NySfDen>dDe~Vpy@USk#Yg}C zoBw)|{NLUW{p-c|X-)mkc8~qewx)Pt>?N=9j=-vF&akbbg_-GY_oR^ni zdWOJG^?|Y?h(OWO2#`fH5*ETSb7sC`8Xxy+Jj1%@OEc1~%^gfx&KZ*no-zPxK$OBm zKy$?P4-O4AJFax;Ol1UdMO0VDkD;5*h0QJ}YaI)g)LRpw#!%!-^cN@T1z-(;~u3zl^3mug00|&Q0N)t8(vWy%bYxnr0l;G>A^z z70qYlQ1j6QJr-P^wa8J#Ht7Z2tKi_^e455r_Fd`?2?^=#Py8(z=OHKzY>koed%97% zTUTg!_?iQ+`A|}P)*Wq7Ow8Cwrc}J#x~V;$T(*i9<0J?wz${<9cp)w>?(EE=vbMW> zbGeZk7Z>Mu)QNw54h-#Neb9w}{^!rqii(Qb+CMKnVA`r?g->SaavkhifFnEWDuL(+|I8LS|U4*Us60#sWs_Fx3=CXX}PN} zEbO0~OOnid?k4?r+wd)yD*|9(moe!>v<{UnhU_<=PQzuV&9t?(+bP?R3t~~#zbCc) zkWT$MI(wCxak^c-0r}&eG-=9ylMd(?%ZH%HQ|P6d-`~9x^Yd%bWSs1FLK97~Nf6U%z}w8`)&isrGpLc6(=M3P8ya zfs3oF7UNeCfSQ|ygWF%p$N)Mc%#09E|E^snLxlwtRz7=gT$$msSev|DKqS6&CG(<* zi_;<=e;TfTL@OgPRJ7C$RB*C&82+rXZA85^BPJz-4uA9MkV1KuD@+M?`|R!TN66cC zLT9?v0>f_yQ%9IE^*xkOAo?SHzAUG_~K+1=mQSMPa3qtXoGGaywCjtY=5X%$nvPX>A5 z-}y^Z0i{Oq7zp|(3?gnD;KpCSel;IXIlH(x*xP#uAs``Phjf69=a9Uh{fppc+=f*9cF7f87itA!`-AurkZ#c)zP7eS85Dq_H#ax=oY#2;1n}|j;2|YC zoMeT_kdWukpTj|=(>7VefSiG>)Nl5_1b77^*ziW-(}#iL$S5d%y}jUV(K6XGvjjv$ zve_zUx1!{JkLaDzka^pa4+8O;Jj(C4pV^U3P4_A5uko2*5(*rA`627YL2+zN>RW9U znGg2_a@g2tNW_XaKWW~3a%v-EYA0iA^-b>g(o%Fn!uIMa=Q}tcNC1mi}V`YIzw@D6;shsQL!H(C@U*la1vS)lalUlZh{MH0I76fKn^94;s7aJ zvZ20SQcBA2danjhF-XzUmp>1sYYagco)F>XJbvrgp=rQ!_4Y1LqJDIUhT^t3J!L=R z={f|#EAX_`KVR;f7s7Y0y?Hl0#qu)q%kH;N?N%2UVdEHXh|{$>MX1vbS`@KdE~meg z6oZrC{e!`Pgivfl+0Ya zM}7R#x9~h9!~!sfnW^b&kxtF~_wTW=v3YD~R@cwz>oZGAVCTt2MMb>`Mvsq=5B%@} zf;u`sfi**UBY6@Q4RE`Tk89amRZ zi;0OjJ?G)60Ychlu9l63#eS+-Pg~nwM935TN0pw7p56+`2XA2!c6O{fZW|jL*rvv@ zv9NtWf-%ToJ6vv$=R4)E^~ZI0bo{xz1R!BMUHw%>4ZP^z`O|RZT=@)YR0})$uVhGV<|FFD{bxaudAx z&sOQC#wH_^ru2Nhvm5I&Dq1)$rkn8f!cU)as@=+wT5u+`8S?V-0wqQN6`(af4$h-M zaqdJt0|N|5v+1oXm?WShot>S%y#+%goLpQGAWdy;aJ5|>9bdrrtf>LNMR|mX71CkK z{#r!^2sLdrwNB%*jEsze!oujglY&GAGkiEGLf`MOw)tgoO<875GKZe=5)$}#X=!PqO>Sy= zSkJIR0C8;$B^Ls7yt{!N6kcxD@4!n;p$3M&K66Yjpfhu0V`Ceen;?^?0fB*m4Gq^J z*t8(UYU}7=V_|_i{AMT#89F>aFaG|$(Q!o*sAG_w0LJviGOWF?v0q$wssoq@fCpG9 z1aT7D+StrZOk}G*370I)%Zrl9UR#4bX878W<>=@r8^_$_vNd{ldo3g=h+|IZ!cP(s zrmCvSN`Q9u;7N!CKC`YNdpr;x+}zw7!>N&>q1u%eBZV6xb^Mlij+t`m9ett>5HWsky6z|>kQ%+FUA zl*k;R!U`FDLmBK1tGXq|$HT$eIy#JxzSUAd{=KI4b#;2R4$l}EWSt8;u#k^6=wqId zl@f45{x*4JoBOQYbK{t~VROExE_XYX!(2SK9qn7G_ZmIeX!#oN#M6Ij)3ue>S{q6W zQnaNR)Va|4!$WDxc@fQG>6(lz!Hs%2C&;VLN?;1CEgbY*iZoklU*> z0P7UdJ->eanw&ge?Tvx_%gf6nMea1&P{nYuLbCE;qu=lU2shXA+vi!%7 z9{pTR5+!dDq4$A*8Wk=hxfYx`s@ypCG16mYkBP@eujpI@NN{Ot#=snvtCH&IrB?r7|W$I_sF-J zj@tbFp9sn(g_aZ?pI%Sh(%=0)#1Wbgib$EqcZMLudj8uVMi6u#*V@`*CxQqK#LFN6 zzkFP{x2v(a?&^M0-yIhj5#jVJX_1QJKdq(3`=29!%oA4=7IShs2JqI6lkn}EgrsCn zZZ1r?0u`Z1?PmTLDG^n80?`5g&bDGo=1Gjx&OQZRcfjvxp7nk9bD=SZ|qQLU>Z=4QZ z5R}Ax_fdjIpwsyF_7?{!>A*|mWBu)By zu0vTQPjlrhY{7!-XwJaOo|&i6Z<{rXSKhZ_ZbgjN$zwBS6>*=@q$}vE<$~_LPZrM$ zIfKmlzf#lEwp>~j(mOdh!JcSZj8M?W5)u;jtsF&7h@l6+*3_&uA0`EY4<)eNv=>WJ zQL*leCS$YLg`J1TpP^)dOYi2euzm#9FiGmhcWr^HC=e7mfv#Duq;F;`^YO-Fx+&Fw z^W@KD4ubV-_-Q4w{835kXVegs0XH=BMYMGb9@@W~lWyHA|H`k4_4t0NP8w14?t}(v zjq+Gsa*kjzX%j^K+(g}JJ~Ahu#=_~nNzTu&opOsF4`~$ZI=Z-^p`igJ2bcxhZ}jSH z2Mz*~4n&RpxjG19U|?9KmUj9dq)2vMeRcPLM<3kpIP~M845z&`#b53;7Y1@ce!o8t zo{>B@OG5Ef+pqAlU^)#xFBEZ{9TgE&n$@43E)h)LAXx&FhX8LhoFc?aTwGkd-xE!F z-1+5!L1TNirs<=#(@nsu$3xFCRdC>#f$cHKVOv^dUhin#` zeFhV_Vq;?;K74qL)3R7V(l!AbYQ7$4+Y_s+rd$*s&r6!GWN2byzkEp&@=}lC@F&Qp z&sBWh9YOM1@bu{DNmysDLNW>(+FX+t4{7AV_BK5e)60zKRaI308qUwoZdYRzfu%)| zi9`s7en(`E1F3xhP)1LWG!BZIfq{Xh=0{URQ&ZEP#H#<|^{fE~{5=Awu)eqBICxKW z(&jdIwEvxztC64MtZuf%7EJOk8^V`>X)r&)9={*`H9g(raRh(I9WDk^d~L1in>Tmc z?VFg8e{!;(g2Ir&*fVJvnb3%cuhLXj<>cK^i%XRIQ-Xi1JAL}EZ%F$;?QR?24dV^k zBfXF6%L=&|wjA}~XkVP4#4QPH(NBm~KE5UThV)Hm|fge#7@ z<$m6WN#S2OY;t|h-z7E%zabT2q$axjUKoDakjr746R3(vDrjFHWk3_%w@}>X_xyj= zqP8ag-S6L9)PAx$GE86*5%n)Q3?=b#yt-9HqovISA%;DEpm%}sn@o1O=6B%dnM!#< zK|uiV*Vo@<^-WJ-o(zkyu&~@Ohq0{gIr7e}4<>H8)TgH#nVXwCIvxe0;;&XQ;`MiT z(^6Bf%~V;3YJZcXDQ8*EiU1Ha?{O^*=ZTWeXN?`t$mT(X!H#blw90X_`v_D5idItt>j{8}FcG=tA4GIo6F)@*q zk@;zH`jtsXP)O+P?9AHA3dbA`P#>6f5L^rlQrnlPsHp+Ygeyy>E2$T018apHXcWKN zuUQ%;!#zG0+h;2BWy&sX@L-or@Mhj;sV6TWc6w2FT`PgWn00f8dm-?K9X%2Q@;FRl z!hpsrkMQJq+~bYj{XsaJOL<#-oNS&Aak?IL<1D*W&TnY?`fT(LGbKa*g`FbyX-v`# zd0#9V{TL*$|3B7qCPoW>04yFI9UZXu;NT#wLeg)iItaE;9dh80_FxRkqnnu-?UyeB zWR8rCIIj;ly16kkG9o}}N_70mq}bR1!{H&rifL)S_kn>xxHWoT!ul_e5#Uor&QbFo z{r|iyrL=z`#k!bZ=lmcdS#TC@0|zj0l*S{d_$x4$hZv z-)b$#Xn1NgMo4^oZb6g|{P2O8-=$|@fRTy{0RrNyv8jp2<`)Ek)OK^R#l+r?KD^^|UI&71YGMLNi{1b@_IMiy2ZyB}fim5IhUgg> zuCK3mwzu(E^uPP!G&MB=Gc__Y>h0~lyStOFZX@{5E(UE(srFrM+&^AnSR2GmzD=$h z-f!Bp${J3~-!?xM%^X2PY;S8zFE3Xq6BH3?NlO!@!zrKMy}Eh}wQf%oR+N{^$jBrl zCa$ck0Jh4^q=Z^Q^qH98qM^wF-?OPnNJNAzgeOXxiY6xh^XGEcoymd%dZ7Jqans+$sLX)U&Qxso$5pjw0ZFFI!#bqys& z?!Q&q6eS+`pklYPnH+tyF3QbJeyv~P+e6~>-hMw8mJ;sk_2gQ&Naug&M@}F@1k0t6 z|DBQYDdKRG_1DwKj~_rezg;GXzLWmb?KRGO@i3t6o6a|EG~|S^e_!|+rUYB~Y3W@@ zAB}90>i?0Rn3%ZS@0pMg$@9~*v%&uU{@>r#i({;oGHPvIVaLp{(uEY}uDDU+(Sg zflwVEAK#;PL9@BNodU#qX66fWOdK4Xys2UoH3|uekYMZC% z!7pH)$9?_%X6(~VUKet5a-YJ(7abT)N=r)}+}%YSmnHP{^Z>q!i-UmDIS|hQ2Q4ft z0Mp>Ho3pUBm6w&ZwzSl$bIR5|Jl~tuW!7NC6Y)4~ot(sj{3SEP!^469exc78u>kY0 zl3&@_=zX-@=@iGw%xt$cnjOciH`C(R5*!@7EEk}VOX(OL8j6A#knT%P5xw~%5LJ$b zgN<#Zt7{$hgiBdD43Ft;#n^*)Hwt-4RLW?*Oie|{?QudS`_zc_h>}+yluCXpl^A;3 ze4S&EWl^)H%eJ~~+qUhhF1xyH+paF#wz_QFwr!hpz8fL*KkOK^)e`AqKG1V9=5E7MV+Bdw&yU z>;OR7Q37u|IdNrcc(8Cby_m342=v^w#mUKedi6x%OZnkwpC@2FAY!zq*ULWMvG*3y ze$&*`wb3M^p2LUsrz};(?Tth)w3(Ng>C-1&`AiNDeHaC`Z13(3{kuOxme`derY8p+%&4ex=Cuh4e8r0qdM05u zq~U*YD<8=$Pxi2+1seDexwEmVUjkc~E>^XpfX+UkH2f-$@InfGBEE;6<;O?2A25H%J$8~z09@4{{-Mj z2*i}GzjGpXXA5sVvZYW}Q)bN3{47OX*JI0A7^hdD$0Y3~C#OXY!{-LE9fQso)`E6b zo0Rrfy-=)hJlZIED0gCbFd*fN2$(cxWJQ zEHoB!%K|cVbHk!Pqm@?6H+d%!+Jf#|Ilvt9h@V%bjKxRB6m4ekne&7aJ5vLz1pVRR z5uhL?jpnTLcnIBa@xqPMrZX1z<#*)S=iof=0Y&O;tfG|^75Vxizr5=loLpQ)oRJWh z@JlkTcyD1qPW0zJE*vVWDdj*U<*D8WzHrAF zv@gB7`vfR*uCLdTD7|4|NwktE-oj_o@TzNlx&Evi$AW@4t*LzOyFw#*y3NmjYU#i5 z=i6=%h-u*$^e8t~6$mgZTO#4Uf zl5InF_f_oe{8?4`8W8J{Pwp+uW!K6*i!vCh39eC@{d4lb zKqMSjVXjyq)&=*~KbIMpF;&4DPV~@+IeA!&Fa7 z?$V>8J-@)hU95D{lG%467fe)D8;ZC@poE(>ttqb#xq_<5%iHZ25MXCt-ujCcgud+I z;W0KmT%uy!;_7H&W)@aGC@NX+7u|5>z}i^h9XroC}@<$4t-^eU(JmJYV^P*ecxA zE|iNai_@t#>;TU#hO>3_wfN|ed;C|f!4Cw7vAH=^8C2Z+$NQrH8M#!<+n-$= zT(E?Afv8o)$vSx;YDZQkM^?hK#wWngc%t|+W^ae< zst3Hcd2(EaBRX(?Zi#b!5kk&@CT&eY*3OX2pYMY@Q5qmcRMS%_sK&|`aKEXkhcSZ( z3O(avcWgMM($ThFywfA|mq#SGXBs$oTIiN4ex%#~5noh7#g*UCaP?uZh8~-{UE=-S z>ER&+9DKd|thiXf%M<@j1*|a9{P)Hn=&z~@M>e)8X(>&h&kbYGP99w$^2;x#!-GRPqHOiT{5#|jdoU_X(d83n59 z#(xVdqc9;W8G62tes<2RJrC~X2dQtIpHo}sI)P~vA0ZltQg_82I7-BL@BhXC^|8-X zRTD7zXS(D z1~Os><^aeLR@<-zr#S%bChRCO-P_ySF@&f@Lw)6}mWUwaZ^W2ga@1Pz_V=iO8G0nd z(NRHX@I6*m+R0Nnn#)cI9s`eE=|gks`Go}*=4dYg6$U!G@+S*vD(sjiPY}gX@I&N$?2&<|$Cmrk!daTc-L|M8>AjjaF>9%+x(dhF`oTG!ibt)mii;UI; zva4&BZ49_I@+|<5zVY!@`=)}dd866bG|&{}@1^7;s2_y@7$@`(eO=AepF6R8{B^&j z)|mL8a)$_Us_#mJ=h~N##M1A|%O|^=U#OuUv0d5~+ppuu_hm1WbIdTXsq14RXFE(+ z5sZq$S&?A1Y9(7=THwej+M;rD<+jvoHA(nUPJBM^Nr|^iNvj&*5%{@uBn9dDS&8L2&lK+ng* z!h-PM1b&*r$g_da*ykGVGy<`H4}>~sw6=enh}LdZ+B=fkA{mH-v|5@8bCAr z`CJ}4iXQ@A`vXCMzI4&uFNfPWtW6#p)L8%+#S5uXG`M?VkYha4Y-s+OK!0NG>j>A6?@u|m8I1HJ8x!gE~Frh#KXEA8jzOkH`zQ+JFBWe))Q?~|T za#~tA-lDE9UFrlhPPvcqxoOq0p}D!yLlXxjC2MBwBxj5?TO@h^ebbl+5cx$sspZ^U zu4Zs;PgLT6Oj#9o;@}JIT4lNmco*nmm)Rxiav=Kov{q+A`i`EB%ygErGGBxgGYXcI zBEL7p5!^zxgbYt#`mLOKDQ8?w>!P=w+R?9I_L!s=j1y)tgdkcQKL-=$KXn8w=q``! z)#D(5u5q&iRN)=>-{0E_siORQpO)6-%Ne;mE*2M6CBmpADU*{+58i5r779sOrex)` z=k&WgT~^_dxDMGuZUeoN-c07?v zC~a@@ZU1{RQ7S)g#&`)qLBW)B7R-Z#gPZL>p@Q~ysd-hjwAi%tbbyE&uqy(zhmXxF zB!7f5U=By(|1n*T+9J;!EG=!P9UdOeZ(rML>22F3qyyBu0Ld(QSsmFwf0E7YtZ^9` zy35P!lmU&`w>P3u&x*9*IQx>}oXdsb#X(VquEd6hsw^E-v5V4Em94Kp zW$JwyYg*hvndoo6S8eala51vodQzg=TIRKpRB(|?Kq)~XN0fs6ysUCTROTQnR#t9E zN(J2+GIPyttpi2@oLX4^>3303I?!lNf9%4eQ4MhDMz8cu7e~$`gKNRn_6cHkVFyq&$~U)KtifeK{pA=T7MwPK6+!Wdw?*5{*zQxGJZ=B zA77P~wc898o3OmBygd1x+ucO!jz5t7Zg!T~_S}O-Iyi@5YBIL&$%yD`5y5??XMCUJ z0|N0VJ!YEXa4}SO8lkoW4{+RoYpUg}y7i9384-eAurp^i#ePf_9!(J56p&|Q7%k4K zzPwk`|EX}T^-+8nsQTvV#4^f1jQRy!Al-4P5sQ=%xIIBL*9kdz%US1DTt&thP#|{D zE@IT_Wh<|!@mfQJI~YgN7)jL*Z!6}Y5|W9$v~=P!jkEa-`&aLm>*^{~uL*wddzG@v zFGDi|K@t*@Zoe@1c9aPGSJz%!uuWGstINmB%gAa2GP=0;puj+|%@+YN@#UoC5bw{` zjHT68D4yQuDFXnAf1=C<);fDEa+P5W`NigL=LT7amd{FU13=$&py*SYn=gU!kds$f@%iCr6U}5?a~b z_{eebo+vUdR@WY*&EX!|fWObyb zh6WA#5W)sSV&LuSq%N`HjRc544Nml?RJ8!;O%TxRv^0aJEwFfYGBUAe8e^PoHbzU6 zM95zs55T?(U{U~qKE}yOR8r31qb~#HE3F*3{eG^GpI^K5#ONgJ2kYT+M$k+>;GdYa z&JBfXt<7&yP=kWzVPJr+r&c<~T_JpuMt2zr#>c1dK>y-fqH5ElcyH1i3 z-reN8fLaFEBsK%Z7yR^)myKvguIkC(wlNSttkn^4*C^N6K(pYMvkqMCt-bOeAT=aH zb3DAbr46c3_vj1v@sMO>NB*NXJsZg`&V+&h`=OcJ{^b-AqHrDuJDVvNA3}V=CrxB^ z6ZZ|irtt?HrivYV#ou4ibAf@{@`_zl7y!Adr0t{SEdA1G#WH1={$Q*v9+p(~tg++! z{>PZ8yOLA=NAefm*=k-FHX^TT6_ame{p)@@S)!LqDTlX20jC>v5@ud?^_2WAbeYkC z$Cr5Q>Ra`a8ZK=WL1>jTCuLmzAif9Zhrk9%;a68W6cuOtM~Hs6e{j3wp`lTILZXNW zJ_%H5n4oaNWJ3@<*g(AqU3B3RbVRsdWcbgsTvE7>o?iDRvag#^a3bnnLH~K?rf2dK z8kmEF15qzd_Kkc4v3W(=r@IR9;okPP-bXCKEh2szCXS4vDCjH#B7u%2VrUQ^91Kk> zd?by_*ZUINsi{n}*4_JxNk`>o~6$sts5Q|_MX0dVj z9nV#yC9S!?c#@Q~HM|Q}u$AG-mwpdYGQD(fZ5BmY^(+;>0^2Y2-rdlfh|696sQz8+ zsWLP(HM?N*vO_t>mkM2k}@2TiE4?qi)x)ET_Z@HL7b&rd(`Hp-DEs{O=awS9=H5i&TxDC zRo{BjX?9~KFyr*%8=F1Z&-BwG4ysYVfJ73Js_&Ww-K_j`2GxXyhs=$wW$(L@MaNPh z7(ZmFuWo2agtVTJAlDJG)6v0_gfeEgGaQ+6e7rYD5YozDO0=So7cPVi#C5s9Um&P( zxdK*St%n8{OkU2xu9yvg{l2|j3ejn^TWkg7CcaTyzSJt zu21!JC6))?d(a??=`eO?g;=~}0>i~$XnL)#qRq7W1=jz*uB9Y3rfqRNN^v&x1lyl+ zYzxL(i$I@3v{4R31j20%xa`h&${77)0kaO)B6ba$B>PI^MAhIiu zGb31yc3)5(#|=C&RA@FerEZAaT*ysL9e`b?#^`ElXi(l|yPXspYX~-C_CJCq>wrwh`h7XNqL1FQ~*c z07kC3Uo@hjW^BW5`ysL%fP!S1=l7OeeG(V%V>!j>$cu~1t-TRp*1<@*^gKif8#H8u zVYo{RgTPee6ZF?&rIk{jFZ}X}(Ey)b#mz&|0ElvQf=dDVpI$S+4~TQVJ4WAn=0a|> zuQf<{;R;1~m#2X(c1uh+b|!v3*5*Ce#v!z-*>6fstRy_X=ts^FQK6>2ooW?9?lWzz zV=(YNQfe+9Zuw-b%}BLgfAR@^4mQ@)7O-vAF~#2g5sqWRgNAf<^tQ*Lwk2EhlWRR) z6%|yJg0d>_!gg#*a(K3;c_(O}ufsYu3RDk40#VZ?o=5H?S(Ar*+8Aa~o;p~D22>>;UN-U8Hg~HP0! z2NtpKrqz_IfazM}$5*T|SOW4~=Tta2R-P5*@#Qo8qL`?HLF&%*I%vLhj}=x435irt znv3-Gxnh$2y(61XK0$LcGsv924!76<6U^~tAdnd-K3?9e8P9~vVfecajz3Xfxqe%A z2!t_^AZ5#2;Aq!oGf46*;e#zLuiwqRE7+(P=H}s z8}&nh?$FxYbG^u_7Fs#f!?&ePCKaoBrR!Qy-tUm3^72MFxQWpg5{6Dix-?ub3WKI*vRL{S zU!}!23+@?O+oT<#(!@{63#8w(95&|eU`kpEO1C+tCR|I!VPYH7rZ*9Px${IaI;o9* zg{Nj<=;SX(30p%{qAx z_%c#^`+LBEis-&MYF&j9c9<)^wu?&9Kj5-C^<@&~`wfaNuTCyG9DQw%GbVGD3!|+c z<~Y5fKf&7-Xwf*GM*6?R#wcj7+5K^@wWo_C(cgtBi{T=&4a2kK!EpG;Gw#$ z`+&ViD z-VZoV&NDOL0(P=caduSL!VC@@E49B{T5`w7nEo~B&$aXQP>4Nv=CgsJakbu>N^pV> zEGPg})pqE>|7^_7cgbg}%aM_h+dwZaPOrtONs)ecch5gRd$l-keSCZ<5l&H;PIY&8 zYsIqg?X`FElDQOVKAx*d8yOk7HV<8_AQFw%mKRh+YW337Q9%Bx$Zc3cwYa`U@Xe}F zvE^xDQm-1vUBjUZHA>=bm6nu*BBhM87X?;+Uj&!|11nS2B$+?BY=b5xOlnPEQ0X&z z<#P69<*d_LVq13F+*Kl}Gp_aOIaPJV>*=X^l9s4&6<>w{Cljpd$AsB^rp@y8y5hW< zq%q9rPor0Itekp%Jlh<$!51o~S!0LWV=_@$s4AndksZCINhyo`donU3HQ+0-o8AMU z@W-QJ>g%6iJHVe|VEXb-{S6Kquw%oclcsTLy}LkbpC1x|32X8%42x=iWaZ#}@D>z? zpQ;fLEw&T|HgX6=y}0q^lLTB&nGy}LOQu9PF;!B;ftOJ$Sjy}b0Ve@j@K6&X7}Oo|{i;ne@yHQCs4>gm!uaa7pr z6=LYx&%t&u?_N6YNEx?NU3C2=q+U<{lJduq`n-waC%YCIn~2lS~Q5KJa^Us$cbo z@Fv2}&TXc$9nQk%eWt`m1%P>#5p1&G51m8U+~BQ*{Yp)#4;54L95xiX&A8r-*+5bz-9mM1}B;ZHWkh_f}R|0H~g7<;t z|FGRnjSdd}=`?w|-=`fru%``_3OS(RMxZM8$HNm4*j&co+Eig=WL14Xin_$L#Di*y zhBHQDnx8){Y6ZMw`W>!Ux3@?gv}H%h8KDpe862ZTK<%0f0fY~|Q?*r9Nl8iGul6Lv z=QWcLCo@8$?d|zqc$K_PK1a{}SM57kUW+nTgR7afIBKfzmjfRy;=B$}t4khixc{jA ze29_t{2E*$3YdrOLUK3`$ngMtd}Ob*A*0*4vc*_*2_p$L~)baf9~@(2XF znc0t%}cz0y!4Db*aTfjjPE&a9Kwf`l$Y~V&jUP5GOCoU z+=GFY$@!q)hm3*LWx9PjbRt`bh>5k%W45fEhy}MyC0$=B+4_yUEay;0uPb=SZU||h zs3{L*c@CnjKLz7%znU)0o%wRA9X|<8V}g@NXG_U0wAHISbwao3ogvTV^or3tZ)X+AG(M15a-%d2a`rHxlEaYAS zA9KMY2nG^0+qXm3=rmd4*wm2u+VS>X$^~D`$pUiRt{gj;NdXlhco8pTyNk&*5p|+y}^WCQ49!Hj5TQ` z7A7Xp8hoI$5G6mmI+IddSYqO-P#nNW!WcO6Un{Po3s49@BO}n`+jgx!6U^hQ@4cg= z9zIYstj3(}^!ok8C}H)lc|xF#X+joIXHvV@s4e+l0Krx<7>~>C=V%{tBv#N5lXb3u@4g@6Kxk^D}&u4qYUjJ z7!Pt^x#r}rxjaK;q!&`W#o@1kfpskmXknyN9df>;@Vxngf?=)=?MsFoY2(+;%wBv} zZSNX^i4@W!t#;z{bpnSUtH198jq-e7q?ay~h+v*5_byq2`k6Q~EEtgE^IiUZ83>}_ z89)$dMgAQPy9Jl$=OA#l_6EBrPS$ejE?!mYa2M&nC7PXPL%7+$kQFEOw{RlW8lTAltrA?){kNIW$fOYT|EHaH2>MrXNOGCBYB$XuuV zUkLO?Mb9+zzf}Crlt)=wXcH3V*Ol(}LZ0LOuD@lyzjdlGjcE$$uia6Li_K);2?Gmc|{{8aaML1)(;|@HG*|;y9)7^b~ts#2Ds@bCc`-#gK zo~!Bb$YBw9_cQP}=s1W_in_Yn^`_xy8%casmhmYSq>FT4h`y!8-zFuJ-XBd(4QH%h zb_!~yj`rIFkIARzb}yZHhSO)QB^66xLO>thK0dIpu)ucUUM#GKoC&1^$O0?a!U3_d zGX*)Q0~U{i%P9k;`J1K;#x|+C9XeV3-iC&TPEHHs^Ya@UUatR4Eh`|D>gPb2#fUd3Fac7P^P>m;5Ty&?psIciaU>$8qWh=U)s50nSEM6_FNo7$vwUUQ+)^co6C#CV zT;mi11UdddeqO_vz@%@r`mQFC04#BcKZKI{HRu^7C8?;r1kztEtuJIC2>>Awfbw>8 zGxQdKRZ$s+MBE-K5EYoUs1lWj=H}*)zJdUPi^Se#vHSWwT*ws&uL05iBJ}ieQn|Z^ zAK1qvte>DA>HK@mRH0Y(huriIg_Qf1Cz0HI0_CP#R4Ov*-&#axiD)OM&2H`H`e_ts zBve8izC--p45oKm6^xLu;3G*@lMOynKv%9Psl+MxX*h^)3pAXzqCiRjp|rF#kJm?f zsc*waWe~vr7$`bD>Y6^1Wix%H&-`tpHsgoEItq}#f0o!j96t#|m~$SL!^oNQJ!@4N zm6R{GSsBow=k{S!2ObNqWE4^_rl4w{UDu3Rg1$`dTaE!%2ql|`ajzj$TV5Q^Tr2W( z%Wze})voA&wvTm4>tUNPXV+VEK^@oeW+Z^N$ly^>(7^7Ly<9woQz`y#C!3?Qr2SK? ze9t$@;PWzeVWB4>6m=x!J8?-+x-mmv`=yTm3;P~p_2S4CzrbN)>90s9@7u?4Ok>;n9(9F>j}DVssz~keY|yHpVEql$4Zx%jTiGmqwzB%CoC$!3j?St6{V#uxFH# zHKRIvbNhq7uK#EdO%b9QN;}T>+}7OP`Wlxf;zj7slE@NjV-6Xa%u}Gk&Nh^Zw4^k4 zFZ>v-o_+h3?;;F0<=gmiJP*lwj`49QyakNgom}Vvw8ck@$ZRSMg#$OS1SBMqV_tXj zmx~Gd=Y1zJTQYmukoF=CHH>PE;lBx8kUV=Prmy4UW1vNGG4bgue1fXjEIa~|(!kI# z9#01}h*A}ju0YLUHpE7?oEZF?EeoAOLSw zFNOE70^5U2=?_Y-FbG)XEXS9ltsM%3`nWQ3Fv@!=I3g{ct+~Fz@pV3~^x0-0(Kg$y zOrC)>bMukXQU@lczP`RZS#K0)?|w;U11%KXXdchl23xIdKjj4VBr?88ys`*#;+5;^k873HD7D2OPL>Ai-@$;pA0 z1ylW^qfifb{Rw~a2mw>zgxuO%^B3oXg173wbHi*$-?pL55%PDPTwJnu_#l{RgjS2o zTGP^A4qq|hQJrQR!4~(vd>|(PjaMBnKuN^k00;y;xTxl%rZF0hyr_js55@@69x-?8 zVO&~>&Z3tE$bgHBD}WQ=N(8JC+SA$ebZq9Op@d8^KYh>L+6N%>GNn?lThPTB;4H*Zaf`5D2M*5HFdG#KztD8)@%2fWIMJ7(wH0? zE3dAW)At7vg$qBld-Ok#h={m*Ao%qX`JN{0B3=(PyzlGV*->wlQHA@k7i6{(_|05a zOHMvPcv>|glcu2&n8XZ^;onF`2xVhyJ6+3nWo<1xHr|g<-ix@^6B7X<=i$W`e72pi z#$ej|Q!gzUr)Q;iBkye8tqAmT&xQ^asah5cpTH>~n)O$1zo+e8^#-K0k>Bryh;Ujv zSMjT}f@6=Ds{GGTh=sV4uU#mTDcfY_xi^=qO;a|J$eiNVt!9nQWsvpVYG~DW zcXtPeWJMrwmKpg4vIH0qmH{bO3+zsv)U^2yK8lZ|`)yn-11oFe^%DqC@^Oqkgka$E zFT_bc6N5UIyxxNV$65y(Sg2Etcl_8uZ#omZ+Nr*Eq(kUuq01L(_3!&{U<8EeYVA2m zCt&qw|5$~>N2I8#bq8Ht<$5Zm(YB^)8zW~`z_NMs20$21RFw*P`%1*TWPg$l!|utv zJ8$>Jfw^A*e4>Q9w)waO_(KQi*bEsnBkZh&g>4DTVw=rs*dx7I(2Tl{R#{>HYz&y= zU}FOeVwWZEzlen-rDSA`ceuAVS9g#1H1+i%r4;i{%E!IKqO0<%WD9k|l36?I?}xT< z1jNNXQA1b}7GDq%++SY>k7i^QUVJ{9x9>B00b>vm;Spiv8Z{gg;0U`#CMoZ0Df(Sn zY=P%OYN*q5^SFyk-Rc*HnL4Tg@IIW<54;w${KVnubFHg};f8(rFfPq4keF1boyi6s zOln8CXqe&APLqb}s~qY?M3MNX#_pVsu5QL6+PYh->z-D&HM5q1sRDzG!^1Zq_M?>Q z)x@vYm5iEUfHGiE^9$t1hbJtH$Di%{9>#}~{;=tas0Y+FIu7;zyzZ@&LV-}(*Ct9r zZLEVRnX7NrKpw6g2fW7~K?tW-T}Os}YT`Q>b@!4@P=O~f^IU81iwIj)A&!j3Zq`HA zfd+zSY?KgPJzDpSf`CjeeAst1040;sn4o5o{@|;|rHqmVR)OzOg)X@^cnyUikJq@S zOwaRpc+#F+!HZ6!9Hqno4h}9`6ff@7RWepOa(Hr>m|Ht22h}w3b-2N8Z;x7qQpyZ6?BO6}mQb1f&mpNjk6Kkq3dUvT5lcFuwPt&Oa8UEw7>}yJ zPaTsmeh?o#4D>%{wh%%Q5s}^ta}Rgic=qAxyK7;y6I991xk8Eh`forp@-A|P3y2sG zANyDAl{qN14zQ?F#MP#1&)!Rg9T4db0NPD9bso)L)6Py+ z^7CbbhX!w@5ag$^^e~5C4#jc%zR*|2mOp7}Z7n@c5W2_R+3nqBkSZf+T3EH(bJ{@~ z>)mvxYYCktS=CMJw$?taSR zhjFE~sgU1P>~*@#166_^D#9C7h+zM!vq=aS*P(VpJt!3ZAag`3`h;6Y*Xh)bMRbg8 zX-a9JGQbz!_+U99#=2wCTsDt${Z4Io)DnmY_@$j9L}C8z-JMcE*_l>MMiz=|azBTt zMQyd)F{u`mH#j%fWizYthcw{)YlI*kM{U4O34HE*F3-s5odW{h^2h}+rI=|L8kmr9 z%%yE&CPmM|z+fP+gGk_c7dbLCghikCcbQODuGTIc&SB71JNhtR5Ri{o=CA`s=X>I07AR?5um{jUjzu0TQ`QK7_%Tf zCmC3OGFNf&wGNK+FhDi12ScE1k3l?}{#=ZhX5qQj{yQrFoMU90C>AMu`wR{5xVEh= zQXvOOj84|n>AI{tIq)euRZ)$FiXFpaACK&4_}$YRVAtfRuzz$!woI84ZbmHgG`LnS zbTi3|A>Og*mZ|y_GZK=1=ksu0lb$%KZ&vAN8s&KVyoEUOV(ddP70TVRn>iwV*UIEb zUX6Q_og{fcGRD)h%hn}qi+xlmy15xkqA6ET3VqM=CEjYe!^tV?96}^YCjABLjK#r9 zNo8F%xybr}4yQDNbzQQHot>ASo-WpKA#UpAWd9l#`t0hapw4wd!@|wU69xfZ9=<65 zOcGnYj-~cfFc3t?$CKKGc2TYD=;06Dj|~oPYWT(GC!7bce&viuaUwh!9~TFVE^f)S zwnp|;m;}~YvkJd6m~=k1M$3+>8S+rv?ThJXraw%is_xbNw~L^mudZNyZ_s}WMbw95BHg2bsv=Hw_ugLb`k#R?;F40a;82;0$+F}2Q4w785rkpY}I$Bl~Qp9tB0Oad9>yK^! zJQ%cc(nNgO_b&PHBLf#V@iMTAEeY4dCy`PTW3OC%vxE%iz`~55!rkASOSC}?WY^=* zxoFc4%DDmH3Y(bn^tCZgTb#Hipaf~@RvKbOzt{)x6MA;6x1UPLBeGxeKa_9=i^HyM zzNipBuPfrA9iqVDQ7&8B)(l1F{k~UM#U(|Z{&d@OUt8J8La{zhuj6rElaD^!u&M%! zoGJFLzD^4|>thX-4~H9ibt3k|c}wQgkkxQCG=BX8!>^awS=;W>246Fd`R51sWnx}D zT9+UkQo}9)p~$6-d_wL8?$*!GayU3K*9QclhF`aEGeEq>kxKXNRsHZ>I{e&{M7sK7 zVNr`kW9IVtT45CI22V{zMMOjM!Jki!{VO|1=3W^(x#)FbBm(ToA-3jgkRI<%kB z4M`N%oPjA4UP+~^Yu@Zaw`6K8D@!H^H#<>B$Gw%~6|;DMfQavqXhugN@+`uL{_jX8D>ULLOO&(0$4rtn~WQvN)I zJ#W`kr_&UnqZ4V%vr2W5g(hrg`LgX?hO3 zohG7m&%mZWr#@zBA-T7$whe?k)85)1k@@JsSv$yQ7m^sB8Z`Uv=`8H=s{NMoQu{zZ zp5OgaNYPC2M$&Mcmsa*b@!b9aQIvs%8gF59^kfGH5;6b=Qj`G&Lj!_>f&!w5fK>we zZx8SGy`__#?NB_QT@WKu=*ws1 z@0Oy!1@&%I1ZC|da1iuhL$7fHTKVBWdN>Ja*yS>zo^^vx$6Y6v4=@f&R5laCJf1@y zq!y-FIy)Ez$hf~b!$YiOtFhXdq9+6x+)vc`vA$P1MGd@IAsu zS0bLGz}zk*p>N2s)hH*-y=o8s@aqjRnpUi~1`6jF^YZ;^4o@rp`#EAmaK+vTZo@3h zkB>vXvXe8OUsu6W`92W6292S&&PayL zPI$U_tNOP^@X{^(e{OaF0vruCFc1(gDA51sW~2X)n=LCPA||gQMh|e6&{dX+U1vn< z{`eiuc_lsf>`>v!5}~F!L#Dc}z~yEb>7v&XnB(r5$nF{gFw zW!~<|y9!ni=II`qhzAPtNxy7sKLBiLt{Apwav4Yd>eIPcIJAdxj^uq{c^I_JaZ-q9 zgePTp3N-Wj?vrp)amd`NJ}A`1ElUEvx~+~@=6Lpb=Y#TV^_v%g(t<+v!of6gUtvSEV)k|WrK?A=aTu|>P;`&R z7()AL`lneX<-!J%VD5Yg1aJ4zbxE7X*=1*7dK)9Oy>*6c1ji!9(guivm0=2F5yZVM6gf_L`VJ@Rol4f=P0DG_`EHaMw!VL}0Mz3{1XgaUtR8|y|eT@h7;Q$DM` zhJ%es`*d6Al2)xMnIgZ)x^fEaU+My+Vh=&JssQ(XNL87f6Vjnq>@BN%$Z{>4CT|^V zjS5~=jVxH_;ghyjX~QzslX^+Q18_eyRB589Kdi1UkeS7KC}$3z#o`qSMnx5@*tyUp zi^u5g@yU|@R+@9d7+UDig)YRxa-`ujL&+iP@Hg~$BY?MCv-Bq0KeEByaf& zs8H4tv$0d7HuMU#VASw$`KSJI1HOEjp?ldXh48O2?5Hc- zvlXR9+S}RVyZ^GP3moE(`20!-!%m_MN}2S$yhd!AzLy+q_)~Lx6_NKOiXBD0@3*jjGyTB{IJe?7COv?y%MIVc_wBPsWj0x8~#j* zw5lr5HDq*NKDIzS6}jh)JM^z7qm9k-N_ujUctX~j>hZj#r{v+cuGHBzT@ZnTt2y=I1{+itni%ib0zGEYt5jC@xO zjxajPl{ulK&@f_ddsI}ygo@tiES zA3f&G`nmRvLl1au!9RcaY;2(0R)ZpZ1`^-z%QnNkV5?*L8B}t zBq}FHZ)4&TC!=u52p975hMw{VbiaA6Aqd=!g>aCN9m-;J*#^`@H3k;02cLs6{Djz1 z@8tDCvky@9MOayNe^;1G`wN>$G1@`-3Rj3DUMr)6OE|NTq>-lp$2|X=%sqM_8gywm z%NehARru!Hz8~&tF8;f-#EeUV2oqC8FqA9Nl7+R^TAB8*GU+K-NQ=l$$8vty#(b`Y z^qSQE)>a=S^O3O?B*nqzq7BUQ$A}{MNLK5m&4G$B=pUly2F~1SN)bhf4uay8*~xzo zCLAHz_a~)KA6a3MJz9NO`IEA1X)x>p5?_#+FN^17$YnupRbt$f_X}%p(`i?(l>up- z;PCXYo`_38v2A1xA~7E_4V%5eS3w}O1^f9rqcY*CS=Z&s_qS7)sRntH?{p4JCGtL~ zN$r8MdTRDU3Uvgw3SV;vk)B48@B) z4_jwLcT*<@3tMA)XB*l7o%jFijlS&i@ylXgX8iQy4@s2Mjzv|-Of6~Cq3CX~nV<40 zweYj4@0dBdyB%POo(c_sW^~<*`?`#c(G&CsLtzA!XO)A8BEsv+c5-&sYw{x4u-GRPZO~1*~ zyISR$c)IlV!wR1EJzaJBSafpjXY*{Z=Q~-}twEDqbto9UGhTV-eXQcXPeu)VLP??Q89404^5O0Pr`dJl)-}o7sHz_TkO}pRoI1WW8gQ zZNbtdTDEQ5wt337ZQHhO+dO64wr!lUt6qKgcK7J_-k-?5A~JLRS~+&ih@A81kOuAJ zRP9##XLH^1FFrTE;S!VC4^4BL6!+)z60~fu&W6HOaI3r^x%@^AGVM$T3?gVaxQ+aFT@|x^{yuz^mle} zL4z70a8FQpK%g(Qnb-5$PwHgG$iXL=m=sj7fB|$T@rR({jlBJKMmMzD+X0&|@$$~O zDFK)K2AJ-?+*QBESnZ#wz}h&~=c$Sx0x=)k^;|1)u8`GJ89{kko(}+-y7kU?__?`4 z$bwAljfnT1Ob^#$0N6>{Pz~On4K=Lw671<}x0z)Vgc;QQ2*b_1&3&9{JP`iO9VjQP zjfxG<;*`pE2kaE_aXtE!(J_r$o?vqtcBnnBRZZISRWAJXCd`2X5H0ZBk$8$18X`z$ z=$H^>Drw@eR-UI?7K8~Zd!NW~E3t!t=apcAV@9J$BVjXC5jr6bwKHJF5n2s!T;mji z4F>KoDp$8SxPL$5a`U_6Bv{*+q)FqgN#l5)e7S{}5`nu{F*jQQr*?8;UTzC0k1%?B zr%G*n8PeaNtHQ29x;#azKe#bsoy9G{BG-myp=2<=tx((0EbwDr?@LZ*@u+4b47k^L z(PGJ9M6YJgRJvhsyJX3p^e+^J0#`4LFUn^wt1sHSf?uuLM48UiX-~*6&WSsI9a(@5 zy_^W^@e zC!D@A6a>3GFd3P`&o=j`$B&SZVz0k?bFY8uM9=q(8~MI%fBde#hMT_7$?@@hB?+!+ z^PXQ9!#@zZ=RVOIgxl^1+x}5L}*np#I6=4q)by2 z-EQtyuriW|sng5l%-w4T1KZR|bIAr9r$tx>E3=ETv9N1>IlnAG2GzFO2`!l{r2|u3 zM@xo>yN;yWDDuAG=2~-?;53ULMXN;N%DZhcQ0}e`(}~T9RW{70Oqm9K6&j;2+}#w# z;+Aijl;6-@h(9Nw8DZwu6m*2c9a@;r?r`35z^wRQXYZgiWetFAZ^02w*}X9$&(r6u zolMZDt|Zf@ju*J6gZyDrKO96AN!*i&k{F}5+oQO=Xp{p{4WT$P7Xf` zHEIq#h0%hLhNw^o@{^bPv9|%R8FZjih~_^QgT-7zc99nS`FO}&1d^3FsH-HHdvfsAG`zZZZpyHH5l!o%z zN1=`n_;`Gm92{1P!gNy2!?v4W?8+caL~?O+v}A+XKxLO?8Xn8jk~v#VPhHm%hb9>1 z6aMzwkzUC>n}l7;g)KYy^tQ35xQv$0hjM{hfI4%t)kq!?1_|2XIq>v5_-Q@)%IbX} z7s-*4=TPFat1 zJqrXyTC56BHJasf;dx@Dm;7EtUo{~8o_mq>?kY%ma8!uZ~lAp2%4 zKl_}|xjT+Zc$4=l$q>u+!Qac_TDy5APv}kZ!wa4l zdhx<{(Uu~8iF8YfMZcrQXTUV2hdwFwUe)N^hdegOI*F@vEQ#;)&j7euzBndLLM$b#5;{vtPRP?x?w= zeaG4Z2H^0YXs@82%(n)L%?;1qmQ!tqcHJph#|>me@cx0XdPC6O(>-mi^{GRtW9Z|_ zU?_F*nRZ9hEg$EIjs6A3_rmiTjYstEFdY=BxNVaS1y!!$RZM;D#kBtHu3tr82f^X;v6eK)#JVQtL~c)-pqbh{PfuM%i`)Vv^OSn94|IDpy^ z6)8O$MED26csM16cfwEb2cXUPN^@i{ z4j)Wp5`FV4oHRj09iJ{LE2mlM8DU!(5pVR)6@k-bE@ft}#v1yjgNRL_K6q#d(gFNw z)^V7E?dM={VFvIAN}Y$6Q|3`uJLeJ2`0vIf8Bvj^id+7fQ`unw9>?6NSWel<23#HH zwsP9D2gEBY!_&fHnPiV}!dEu`?Z^CRZ4SW7^B$taL`WKEd}rU`&Xks&>m8anQt8Z} z;NuFM<}yq;13kq_03Wi{SX)iBJiX&`6Cihe3&GwDh<$aLvzu3Yyio5ItwdZ={IzSwk6KIm zxc=2u9^|V43L5qux|2DNXx|-e9^cC57Uze zKwE!lE?ke?qu|J0WD^eDnIdGLgO#$n1~8l!0ht|iyQU5Kft#PvIt#j9*%j zY5aplJe|Bal1w(EKpa0IEyG5^@gZNy-wUpWMo=-#6hs`hle?w0d63a(|D+AiK21tc z%_?!GZTs66X-_CP?#N`^x(-~9A6@-I>ksH8I=J6r$1?Q{GEfT`SOb;1aL=BKZu4p@<(>jPWOqR5_kc z4W*qNoXl35umDY^PyOAdRvj^4l40U6Icve`Dm5Vf8q4o{x~(d-%M29m)3CBXhf@ch z?UouoRp>19A%{>wWJ>@H=0f;em;Pk7|5hJy&;m@LXZ3DVePUKR|A~gA+0 zMK{2neOQ0QqwCpR6Os2S*v!WZ9rQHuG@Gb$rkf8rQ>)Al$qUBV;c~LB^9}_Y!d;X` z!|0rN#?y9m8Da*6)g6_Hff1@Nct|7)+3d{prsbHE);c%H;gN`glb;3h)f@Lc z5B)AKJ1eO1&;9)z#Nbh`sK}F&#P1B-yN%1~0(e{{y3$$wdPsw8CftKOxa9LR2R6%T zwOMkGNn4c`RBvOy^U3mR#GJ&8^;iu#HucN%ozvyiVsHB6O1h7C{Nf?Az#W+Z?pg}% z%%zokghj)74p&zQBQYf(U{!54H{cS$P@ zpv2VJMemz;r&HlT+XDb(L6JbCQyPdmByH|!Sc$w&wwnhJghOfsbAlOPpv+C#KVZfI z-*14?;Lf<2{=W<>%Dw)!A%uTYTQ2MNzL+xiXY-%b?8S6wmnS0DQN^-$7Us#`t09T*+q9i!poLo3ksmpvhyKFLS+O8@A02q# z(01)HwL4$AwNVOV$lTcj&Gr5BTt&- zZYKbt#1S3|#l4D_0AIdkTWlj7nnK{(4TwP+FjCIbF;+@%k+ebH5D6ee6*ggb5(XY< z0tp=)t(w#w6@VWjmHeeB(8)8vLg+9%bzlPT@w%y&|1rRk3KvO6fPoL`JLk2`#wTV8 ze09}dyhiwLg}jZ^%B~Ki5K{+6V3!y51k}c@>Bi8Rdwe9mm~`HCn(;MWdN7FD(ZnXEff4l z_ph5;;LKer7@wi^Ss_fHC?W|Wq}k`wpMlMpIkkbrpsOzeBBXG|i|(S1qGiy%`;h@u z1bfuvJ|H!^oUImL4-w*QLO1~5sI9oZ?O-=~9<4iZ7Zf}s)=H*zm zT8|g%2}OGsY%E}6z4JdkiP*c-$Z*7V>y=$5lSP|VpP++|+YDAU+F-tobqe(diqG`-1#zx0n*=RP`pWUe@JTLkZ z$GsSoLy~!(si34p)+EXCtc_AI8i>?H9iVcB-AxL!A*f-|j^YwGmvot_-qj81M42#u zRl^e+p|eLE=`8eI4>QZ^5N*r*jE|heR?nK|j~F_{N=~qJiU?gQ=2<&(8ySkM9y!N* zqH7h-&75QIYmkb6gY;s2CeAUntvnY|^Q;r?wz?ZlV?drZIU7B**tiwmvEU`vP*wL8 zYvHQLQWsj`KGp&MD5&?qc40Fbw8x$3&DcgUho6p%X{s=SF1*!4UTHf7JC)c+;3rwp zX!ky#(P-le)!`F4=2)A7cuU=tj`jMTVgyIPbIw^7&J40}XAKCca zh&{db`-c3%huEJWzW{h@4LRJzf3KO4{>))VRZM65JrpX0quvVTS6j2HrGKDbo(*p3 zT@2=5+T&dmSPbpD?WgQTL7mJGAeN1dc3*3_y9TXxKp0Z0Q|`C2YlS50GC>!_ydqlZ%2F8|dcsG${wU@a+2e$S64 zRg#3=hX++})>J|^OBj);drla&*oG`bIdDb&PzLb~58Pw%16~B7UTQ3q2}~*p2SNlp!+v7Q;!6Z?_&wLCdJ$a=Wf^ZWhWu z*`V}TOv#D4g2uEMp|47}Jpo{*V%RaLe?E;7(~PGI?f}!6lV&n5ooC=fx)GU{dHkyMM*) z)6;Fk6{6QHB^t*EkIR3)Z@aiP9x7PV_fv3Upv_UaNypsY^qCY{-@E?x5QRl(GP3tiRxTHF^^8RT$`xUjv3eyN-sai zyOBH_{0Nn=;oKKV`H|B+*{*$d8GRj=Pqa7|3rvvC9Ynl?*zw-LnG##j&z^xOm5Dv# zxz!|RGa+PTSBMy|qwEr+8nT}0oyytJDs&@>0H@p8EEQiKndKeEJ2Q)S{d+24L?~eD zgr?)(?9^b7*w-g_s%{Qum@}e1z-X2>IH8XWu)6LXng@2RM$`sF@k?(UcQQ?b-t5_i z1V5dx7}g&U#3Uj(A_7S)vXQ5Jj(YX(#NJ46gKkZUhDViIq}0Aq&EjOvqt|s_NQMqb znNHn1#QdW0UATTifR`rNyJ2iGkXFGf!*AD-*ZmK$5VDTdq(Fy#aE(0=r0i zs&Yu@RUXa~x`nu))XY3v;doNNN6aNb!Nl}Xe+FWAf3YRF+?f1GpWw|um8WuB=V0KI zAe7uNC5&u+BB*124FMT7@#P+e%huFrY);uze0u$#`C{)-`Hl{P5j%`6Mxo;hA`9;3 zwvql!AVUo&En~!iykR8op&W)|+HosJ{9h=X2 z5$Ay9|n?URsJ{p z3G!aXZ-x>4O}6hdlOWPjw;q`!)o+D2@uI%$m9%%(=bOi~P{MkChIR%J&q zjM&scCRgHo!XF9!`)0pu{`)olPCMv0!s%kfzQptW&rWAr|JR0Ycd&dR%-B(beN6DobmkE*akF9>oR5 znAIm=pkI;C{C_ZX!!2nIU)K{3G1uf4RBEA zu&a?*Er_Iu+b)28GjH&5cWCJrmAz7cT?23sW1|qU3OO%l7F@TOI{3rO!Pj?&9zLws zcXyh*r+M;mtT}qQaP~5Tjq%=>ZA>2Q~FL0Vl=fSZW{w^lG#W5hh)#Up>Am zgHD}@`w)SkfCR_Wn5hGWIuQrc)Y!3)f{v$@QC>-U^eD_@-tZ>khi*7C(2Ww0RL+~6 z!C2HJ5u_xM9i=Am0Y6f65|kp68``eT4g;u!SQ3HOhhQuG8fqg_HOVDJQ>4MZBe?POuV zpJr~PblwBgx2s-zwQ)9+}l2g)BtDkgn2FCULHrJ?CY|%PFI1TM97ms#h3zj z;SY<;+FWD5@u8Fy`GPmu_H6Ncag;hyiK&k~qrNn|P$$Bn7qX2Z9X$L9IWN znq~@(lBGyw+{F%YFc8#*Q`FiMJAd@$WMMb-DNbi(R)c077N;7|a85gvb5;_YVc$Or zD=hqS2)M`o3It!v}O=T4}5Ax1H>`OD3a<`rovt6#fq7fb#+WyOyox5h=&cORwkW~3`s zHgg2pP}b8$0$O1}BYFNOW2v8WkBr?*Iv0Plbr)WHD|OvE>_uNhr|Z~yRy{Y6|NM~) zis=`a0dV?KIsaRyvB-W&T*oMT0hG-1RAXz_DY;CG=ooqcxDQVmKRSHNlW*5ad74G@vd+BNCK}|qjpFm zj^mTIo|Eq)y?HfuM$H1`<8dGp+`PPc@X2kOCqhdkCj%)0{esP84ngZ+%f0*5+7lOkY zG=?7@T`NhbuxepeoZen2PKI)+04?#w8>0uvz$7XI_Yp|=*wBIhRi@ky|bW%DUkfpI~s*(8{IAsMD8ml{hPy6YkJ~o8dzL&%88Z+@_N}n9f zMP`5O4~i!HCVC6U4#ei1R_)4(jk-O{aU8pjTc|=;k9s(GGokH4TM|2J?TU%4iWOz+ z?Op`HlRZtkjpBd%Fl`*esV?4($k``GaB)dt_ylnU_=PH|TVmzThKo`4gAayWT~iOb zY=45KfDFq0d&8{+WXQN0#PuGMF$4v=CcGDwu=;KV@8bbdh zBCP&RSoqeQ%ueWRBBrD5!R8!OJ_n5sRk3M3nh|p5a#AXj54xTM*c|(Vs=$PyL~1Dw zV-6I7OTHj_Wy1cQA!utHOU?^ehUrvEYQWHUQ%y?;$*cV>PiYdks^rdTFxUl+ApVFU49#9xzNxzFQQX&+_ZxR_@n`MW(zhc;|2b15C% zRA5w%W`yGYA~UOLom@dhFPpA&amtyXY2THN%TeAn2OXD%gTy$>zd*=2$|WrKo1t8` zz6Jx;=DM*MzSQX^cqN0y9RZRqgc%J@M878~<#hDm>e@(&3@@9iVtn$kpC@~}1ntf+ zU#G|5(pohN^lttLTJY|+k6d!54{s)Mn5ASa!|*p{HhHp36nAo*Y%KLJ{vF0S8Jf^f zurWxm4L+0P{*=ijKD)kWcZkhz-eezzIM8E-@_hM`Cfbs@Z6r-{vC4N{?KsgF@p&m zt-}q%x>IBqzEcd<&fW&LYbdDRrm(l9oPk6;Ib5!pmw@0Znt;&OOqPHkITkWZ_p;@- zrs+V=53J$0r^cD~^NAgS-ARPtqb~Dj+s*m?85WP#zv})b zuvsjgO_bRKe^*t@C^F$DUV}xLULy{vfO*V7Uh`00@O?Q4rF0qG5Gq5lp!GF5o<>D< zdeT*2V>UZ18v@(bbPCSq`6Jf%xA=AyByx*FP3yHYU5@>;FYAwRJ z%*T-9mx{FpGXXbbhbN&(lz^K8PnjDucjP(kP;YT7I-D~Z4@2GTm#Y?Ev@IP7Eq-@O z9MB}FKuLk@2Mjv@#@8)@P?^5E8|Y(-W~MY*USeHtAye#JZ&{noC_i70bS!yN5;-~X zUzu1GF9U0*o3#gLx1@(0aBjiiz*M;O`nV=honN4T&P({V_0R1`y6!I?peajVajQFg zzC4h!oW|K*47lldpKZc0de4ZHhKzED$k+vt7dQ;jyZo)>qT_x8l|Ghu86| zc5c>o!qNOmh#d+*QaB0;w%=DKYcbGyj~COM$teXp(pISv(_1=@uP8fCSpDv6!ybL@ z!r)?=VT0nV?7-M&%7H!;s|aGRW;6!Byhb#mJhtOiPM!5M7%br9W z5{NQ!N_fFi`yruaBcNMw$sjj(HgX_axM67!py2RYSPEsdvXe1hpV0C@=A)k?EE~@6SySY?0F;BF$Mr(vSk4 z1NGLfI6^!TS=Wdy5mRRqdSRA{8c2NYU z!C;O3jGcsd_8F;zupz{>pc&gRd_LF{naT@)eA5(7fWTlvTV`xWGrG}mZoYNo8OVF6 z+k}oh1XN!9&DvF|*(&-@Z12cDZ4Q{g{fZv#hovUiBqldV`9mU}d;%Q;@1 zQCTD|{V;^WX_5_z!ebO$u3<8WZ>VLUr1sS%Wb?7Db_%__EOL;x4rxu zVOyZMK_k1q=^u@pCM5u9Jb5y>Z1t}2hqVRy;~0+tZj=Cl@P2_zRZJ!E=-CmcdcHw@ zQHcqu`+m`l{;n`61#Nq?@b1&Bd{{gBobUfHw`N57Pi_r)ZQ-^r%&E_bG6Jd5BoRD< zsUlnGwWuJYda1Oeos4WRA@tk~$+;^B@sZ;#P=&iJ%Trdg6TWY8Qb5aTNr6RJjvWJ= z$=q)ubg!E$JUVR+gPAFLoA@_w4ja?v9esI^4xt#}EYlx5v^?7dM8>UaOoD;IOb{nt zd{h{}Z$NanHVx8zg{0^IO0&yB&LBWo0zpyprhp&aK&tE!pnxF?07?PW;l#rz?iiqh zy?MS&9WVc#kMHCdJ4WeeYLR=jb&b~`zNdK$JI)W;iS6d!&%oVo`+2f-JUENoE$`$Y z4v^Xhc;>LbDpWJk-daHbdnTnE9LgyqE60_oL%!zE zrd-rA)~4!2#Re*{kj)eIUV%3#1};re&|e$eYTak`1zwX?rD~jcC8x*~VT?@55#Pjq z8^KZTY{Lt&E1R-(XT1upVa+SN-h4{eB7i`JEtbfv>xO8Bt*LI-$gID8*u&EcvlO;i z!!ku}7AWk)HVlzjVh)QGwy9nV|Kpy%L1EYVn1U}{%W<$d=IRw!c{X+AkjX8Uks7m^CjqL zGjUQ^Se2MM(5!M+JpeE>jqrY$CjGyPkhV|@WJKTchzNHmwIxoEmoJwDt|x~c^?Xm+wQJy!v-N>&PZn;mYwws;mB?fV z*yqWwBU9nArXb~JdU==uDwT31i$Vh|#-!H43B}v(&lX{}-Q=uGQ4}?b59q{4JUJ!2 zQPm-roGTUAA0Dko?HK5bK=|Prvv!kP`**v(BIk0?zVEl=xI<1ic-u#cVsD>^-0h>| zM+Q9{Z4XJC;iJ++Pq!}GKZgSkcm^5FP!uTWV;(Av)R3khx!8oMKralU8y^W~;-^^J zmI;CZm?i3|$?MeyO^+Fpjeum=(&TMmP8#bDtl5?|7tlA1VA(BNZKXb>Ds3v~RoI`b zTFq6j6OlW0*9f#)MEiSY#uDsYDp4(ib3KwFM8(0@j;G4(=Y&hfj@s(Tbhr-qGJNF91M~@YT)f%eXDWz;i^+x^CzH zX^#lzr-6o96@ZKH!DfW6rvU}#7qnbvz?UXv{&;N0oU3GW;f%P$C+L)BwB{H4-`PzuERwiriK^Hjq>}>L} z;A1x~S>91p^08CtPcDDsd%^5}_*}i_JTf6|hF~DZt#Uba7qG?oFhir=$$qb}8}(u; zmBxNt-h!^eq>)SF0Ys<@8dhM;j!KLoKDZMW;SHkILkYI}+u z5NdJ$UW`ift^urEr(s-y=y8swGE~quXMP-nrkKI5pD!r53&W9#~!?Hz>e71P%p6974z` zfV#Afyd^QXR|=L*mylM|Yu48dqg(5aeaG^5CTho5ZP<#_)8b*WjgWsyDtiVO$A8-d zsu|!S9#5X_$tGLSA&*{>X9i;7`H=p}W#R{z z;WEo7PM$wDdV+8DW25P->90>{x4cM0j?$Xa+qd(zXE`vf=ZOBk?6B09)6YS-dO6Co zZ_F7}w!8>hdR&PrY{Flt!nKJmi3`+8@7{IY+OatcZK7SxX*pgm53W{L{z{@&$w_P* zKpz$bA{}$3-GKbYx^?l1R3ga|)K9E4A8j%t%P4Mf9#XDYBFV*cTSRV&;GjXb4hS5+ zrH|0<%V|9klEaAN zhPj*O-s<6n3OS##Y@G6r<|G<_Ot>i4tDehnqrVN33_h{4pbk4Zx(d0+ zCc!$}1%pLc57>xpnGe|RoWO-3PEy%K9e-ihm>h;#O#q?6^(HK)$Ihb$`%53IE>uqNEGvW@?`D%2}^6|7b zzfAA3w}R#O*z5w0EB7)De)fxBZde4DdSuHP(pOWD3msOJe@a1YGWHF`{M06&k3C@Y z9x}Z(Tn1{~p`0!}Cc)8i{6m{|hq9}$y)57K{B}QS*baUkbsIUh_|v2_4EcjUDnc5I zick|OLq>~+Kod=3c^bJvJ#8;zLK;xB?Kto^r%rpP+OgvB51jv)CmY7p8uuRB>-oIQSqA(GfvKTSlmS1CXBYj708QPH5r$J)!jfj`C)7c1T1d4^Zf=&6aZmaWs$MJcRVxJE6=b-VdL6y#r_4O*{1c>EzS zZ6(2#=aDIEb)Hgn7z2ymT6iq^3Mfh11Utv9W0=f6$ zS{b)ZE}TXdO*AnL(Mqnsv?bOj$=iSKr!_nts=Goy3_`F6ZO6KZbY^VW+5bcZdT!7f32>1^qG0>5F9MKSS=tesJI z5BLWy+nW2>CxlD0z~S*4;T1 zsA)6p;7XsTRNHSEdx}yzLo<}9nbWT)N}r>)4nQLu@|CEiPdZ zH4NcKv&;o*T1>D!-Mg-l%|^;@!zqD3uySUf$)AUIf7FV38~y=dtCIBW;fdJ`fe(Ue zp6TwXMANqoAFUV6n$g|(I`-Q@|1ko-|D0(LG;<7aP57iv z*)HJAB(cCL2;6SC7EV`M{2omeya$?X;6TCDVmz6uo6=SK-g2m!K+ z0RkcLiO!qw)UP@!3PAlkUjvMLgYr8nSGU*ai7Mluw+(+j)h+TzNOsEt?wYxaJNKa1 zA8^jr9m>!CvNqpA&H0yrL8<{n4AJ@fa9mD}MR&&CnBXVyC~W%)f)C6YdINQ)G>>SEM$y0bCJ|xmpSm)L4t?)7Qh!H;&w`f1t`EI-$J=~c#{lHUM zJ{~fN73*&$t7nn?Uu_%7jp1d0J17F!zIooUI*!XqzP1U|uGd$nq-{!~(q4VbFXE05 z7NX>j^K$WTfXi3pasI3X&e_p!_o=H{vYgvElu+f^Py^#Y+)n{e@Yh@@w12z>EU&57 zga6cp4WwrR^D@SQ`4BKMeF?NQGznLJWH3mIra%gN357xy2Q%@+E9+1PzZp3(Fd1*q z*eYJ(o|(_*7AZR22@J5qZvTPBMl)~hMtkBay>8(&Wf{3TP1(k-yNCkE^&sOl?Vh8m z?2V8|_IrRr#3ml{Bo={%za`om0)E_CfB>H;GN2t-Q`#XNc7BX76x~Pu(TQXQy;bCq%zc&BAB${`DOA1>EmZmJ zlecOI2xVOd9w~tVi#8DbEli=b*Wk#F4kU&{5xjQ8Pz+ue7eh|SbOP+7-h*C_vsL4>kQ^F|W=dOlo2}S>*`u*c@ zTWB$=y9k-Kj%h|a)ckwgZ{QhW4LIz#8AGTl{TXBlafQ3ga@mkd?}={?j|u9|WyZPd zhfNK3kj|Rb2cHmjK*)I}04ft$;1MXh*8{8|54S z5T!{_Y~m}&U?{~d&=E&)21gtl47!7aMqUQrM+%F&u#h8wz+Rq}5Q{_AT7eluH_SBC zg>WQyMjv+a1lN>#L`%i)?iK)H?#mDt_YtyVb2b$=`yaD9A3Ad;gWYXW#BTFg8ne?p zpT*|6C}y|u|8agtKb8`P3DkM0of*@wC-ZkJugVD=HJP0|9IRdsBw^8S-$Pr!{)wc=gA-4b`DBzV2{!sY0*y(!m34Jg%zR0NgHap|(Q zoAhx{=vn=}R%V+3Q%WEGVb7}m;fznm9)(!F^s!2xdRp3+?xlDlmk`sw8hH63^oBth z71wnG zslw>rUH4Xm9%l-Ll!=JWllvPfVJ!+rkC)DH*C$a2j~DQUgtp$lF+*Q1*byJ5#0A`K zB{4&LFJMSWOZq``d6KnQ4cF!8xZG&%yNHyxzePCMnH&IDl5@K-Zv1lO=@#+05&l?< zQF6j}aYkA>^(l#Ptm>TH;6L->mwIct-1wcjr`hW}9L{L6XRpj=y`)*B+GC1GDXN?A6xL8warP26fzS=+5erT`g z1n-rK20y+C2mfwc$>4r^YB)Z%gNMJbPhTHIy2J6bVHw^-VX6*>xKV#KVD->ZP9^H2QzN~RQ z)t;ccIOseWmTT^@sPrqt66pceN~YK{t|XV&U;oj((X;0hfRTW^UA#034t z@yI7EcE|X7b=i)bzPQnBuklrdBvhl|3|WT~va-<2;X)gdx9_0T$tT@tF0Y(}vuF=N z;XUT7ZP`pXq-BZdz`#ywV!=C)4Q}JKi{~MUo}w?h`4u8zNJC!(k z6aD$$PWwYCT?5a}uRYaAJL}FJun#q#f~`Fz$$2#ob@H91WsvVxWln!4oB8l?HJeA_ydke;k4e9{NTBeuJ_;XhHwAudw07$ z&L(E1K zLxjwjO(kpVDmLThP{)*|SZi_3nCsHCj%CHk^O9OUItTI9fwj}gY`q+g0#;p;9uj&a z6SJ&tN=WoimlIvs0Sc+Xep4;AT$`B2iC9Y5-;y=ythr7*2D2_nBmx#a(nwS=P-+GE zwtE7F>Idhq^-{bVUf)@f{+ztQaLKvGME2Y6#|2@p*f(joMzNZdaXrZSH<@V|#BkT! z%ZmKdn8mN7$1yUb=VX7J3r5PO6ieT7ElCR=oE2-i8(c`$?n{Hp>qasq7$VGHn+eVB zEJ$yKGj!V4JVh6!8oxq8uM_D;8Z-8y@#q`V(OCEz+oiv}F7)>xx?I(qf92lFmwhMqTMTM(An5NV$C^v}L={Qx0aJ!^djm+Qw!x#-ej#EY-9tmsd3; zMy(>&QmdjG#C9usIk_Q|NmXgYazb4Ovx?G))ug&KdKtyX=s$zW;s2h1D{S~b9%YU1 z|Bk#IBbJdr|6OE3{J&?N2>jOr`5XQ3FGPwFORAc2bs5Nh#{c!2all{p_y5FQ1TJEh zl_yoC_cOVxBlx2Cst2a13Au(yjN^4QBE_g#I zxGDQt&jM`Us%%e&JFsWV_lQZknM5Zx4P(9AgY$QfzZHX<#UeZky%X%=|J95kopE(z z*d$U8K7|5FCJHGGj6!e?n6Hb$o9wZL+}X$;t}rUc@NYbhnCp2kNHVMG^7v|@-Z+%B z3VgfXc$j?JDC@wMHi>`xyQhCY+L(hxu}0FWP#O%LY54BL1%X>y_2fT&8HU&%86DsS z&6Sx+lqJY>juj>ut|<-D^iVfC>RTAaRbc*t9luB!bFo&-DAHlGM?F|cs;09l+sZje z-gXjF7#f64IT<%t5oWY0L*}c70k1?mi*B>H`+v}N|J+&HYYhwv{Wih$Kf6{1-B$IX z{a9dDC@YHuuIx56QB##{RU6e81D;r+{|{^L93@HDbq|(pv&*(^+je!?wr$(WvTb&C zsmnIHY8F}Ky$ymAL#@&0LoE503$x3yg&Fa%Vl~fFm zDO8=fM23dz)f*1umjUbRUs4YO9mNiO@VZAJAQlCH;1@AH$hJ(cy^WgT2_02*7)*&tNEL^>sLudf)U>O7 z6-{WTq2 zHDO3?e45SD19j1C3vH8B#K%L!aro%$G^z;6SuEa~V>Ip-Rnf}+E5IyuV;v2N;Eqir zCDPLYIkCphH>466@R}AST5j85V^-K63=8qr{%x1vH>ynIq19Z{aSCUO7lgzHh6M}7 z1`*sP%=h6dczt>iNpeK*+Hf_C4zr#L6Jg8GCyStp`@OC3^G#iezlC)r4ibr`he(hOlXrr3#=};gDn;hpOUw5>xbl*JZSH5g!F(=j%72e zB^=O~ozQI-ebCF}q1aJTi?V~w?4&9CLbPFRC}(!j*-@S1{QhB023ujMrvoJlu}4zA z;16GPa_kbS&WWpAzhpymn)3SxJqeZ@h^dlFTTZbF>57m@C)pTTQ&kuePL^)v^o)r} zGL3T^V2liP#0NMhdJxygF%yMYoV3h(Ia+UfFLb?|*_dBiIYi;*`7S`OlrBM|sxv2d zy%2p~q=Jp-H=30WU3Y(JnXa`LqZ{&!ib!>2C?c++=Y9YKREF~!rz>udl|+2n(TdXB z4u1`YjMsgAipv#pelwD}m#oS-c&c?3Wk-(kM^qj4pV;eU=5AOa>~k({i7DFaBjneD z>xf&13&cSRR+b$T&Bv*{=~c>nudAKojERn@AvnShmP_~-tHY5Z8|$<8wLItH11~0y zQA-6;JTTZlLs95&dBM)MrY!LcsSGI$sMLn|Tu0-Xj(=v!tRQ6|HwNZ%n~oX05GP^* zBbUqZjUDNGX}i?n#wyAePPG|&a}Te+~tPPyz(Odir5I8NfuZ?s2AT>(yEHo1_+r)5+=TPGaOXVr9$8_z=_W6Aq4Caj2ZRi%Srk`MamD3Y6L~Z za=JP(-$94a8j`-fi>j$LE5$s_u2kR`3ojG1p-m@=feD;YV1zA#ClKf|J}Oz?69 ztd+nM;8N-m<$XP(Kw))LmLhz3GZB&^tOSSs3nH7p+G(t}R1CwF9#=W>X``Wkbf8FH z71wU+CF**1J;ykeA2|DbY@gx0^yLyt))0LtCiBe>-(lUzA`La5*{Si}<~!o|bs0l>6WUU;+;x6_UACn#yo zJutgM=oDY#cCw{57St~6%J6bAaSmfW`|?rql<7=IIvT(~hz=Omdy0B}+uQ?9lLjcJ6r z7r!B^6osGjN1@+lWzmNfAfIGmf81rh<{$NZag$5(3&UTO_U5=8m&I_5wy+@S;=EVW zS9$D*ln3twW)&;2^=p*QB>~yQ`@C5i4+|P876XC0Un@dS)fR^DH)j4;AC-2i^p7tk z|Eb&T_FuY&i0Cb~LEc4vjnEh@gW-C-+F;n-B_lH?e1!_=`Jv!9^qfUjGgnvmHcKgTN8TDv5?ip5XeG0j>!9nO<3d=~Ws)cPnUtf`-AkUx@sDyvgQ)UuzGL|*z$BXe+wh^2bh z1Wb^5N#R{U))}$37Aby%KaMJ7FkJx9WtBSD6-V|*4Gk%vMgJk0j+&V#XLJ?E zjaTvy0+DaH|Io^G?v_cT8(%S#*z{pSrlX z`$4&+kM6KsBs-;p>_^379QP=~^dtVXvqmCnYzvR9g4uYoR*ZSp1@&kd)U|7#a5VO` zupM&Ub6X$&!?;Rn=7tNQP!h6|u z_h*V2)UjplK8QHpKCqmV;o*9V#@r^47)fGV3t!%ceA@37cY1ewdtAbv{8oioElau-^7ISNLxU=LCr?O{o{bhnjC*Aw zJvO=DgNoQX|_m7ubhw~}XQ zFKSc;Hd3Lj)t!)TLS4kaN^9dOmD;^P&)5egq^o803d@pi7zePvHDj5Park&>=ecQ< zPs^atd@-7Xg&HHoD3<)poh}wIKm2ovheZF81&Qr|7Jy!5A^+F(F5i3!L=SfgpfX4s zRE=p^E7VXB$H3Jhvr;0uvJ#~OL!-PhN*u80T5M!Q8DGd7nqSBpc8fJmQeEIyr=k{H z$O8`FobydF+Ia8Ike3m^YiRwtZem5%m4gIZvC!_Z%XlgB=lK z#P~ViZ*Ck%2_WelF;O0zJtiS9s@l zQFKFypkJqsAiVMG=I)nPVn)YQIC`{tH{7B16mT27Cw@on?rDXC_{uO-*9ZAY5}Qf zG)1A&3pSh!xjL@6uELA1dMX-Dl{IvWN-Al;W*Oj0jnxBh1!9l}RA-i$AKn}z>AS&1Mw zl9bEA^wdzl`=`_4*c*&1-hYUBBY9uK)TSQNsM!|)Lp_UwoAs;E_@8N1f{hhYbJvKShLJc)sv$&XT9Q9h1BSasTQGcwGP3aN3$b zr$pC)$=vir(d)DTCoQv!aUyFj+YCiKNXTWx>34|LhR_#OJTOs^m0;7VQBZPLk~b7b zX>^psD2!go2%)ScBM3sWa!+q(6!^=`TU83di4uo875^T5DC>}!(4BrX`6b zWpY7+A}F5yA;#7Y3q}RhNxls|BOeG91ihs3IHc-jx%&VsD2PBo! zx-lbYqIq!dbVmUNnbZptwG^);&cd-l?tV~SFKNPQ5&n)qc#eSNboQ}mR*C7>?P^$V zK0M+kLjQRc(PTXOhh=n8qCJ!*Kv&U9`WXrEz)REo&LYv~F1@BcnXv%l$-nJh9xJm< zksA&bU5uh7=GmFH0b-5{Et3)Al!3Mg$fN}N( zMepK;Isk8Xz_nMI!mWoneRC_o)i`l^f}H8VsQQH(3)XGY{cE zi%tBQp|f64;hn?zQBgcsEC2u(za6Ib+x&o4Ek7A_&_Z1EKKt1FAAh^*78yw+>y35e z#U62P)2MK~##?K(ady6pmT@zH;GPLIhw@A1`c@>iMPu~tvxychqhA>dDS0Q}M<*X_ zY_XpEq;M5vw>oa~#uDlUXK^y$?o6VF$DgJX)KguGpRH#PE0JGTD5`LRt8)wf;<1DQ zW(t-L_S!F-YaP;|5wblA*c(?V@Z*;07Epq62@0tD&J#lXi_P9=Z%qH`d?o%+OP!tSeanbvU}5b#>eU`LaJFq9#xL5bOi4>0tr+q}xc{9_PFU?|#hO zy-o26mYanNmYfTi=n^LRG2k!NXb)TTeHC$W)H_Htt3*m4<9q=Lv%fmMn4b^2ej|SJ zV_!J&{A%vHLCsJujGICc-wqJW_J;U`mFQA^n(PB=vby)D@_rq6(BtS6A{)3yC5CA= z+_xjR+#ykaky6$<|F%YS_078u0|=$?OroS&rkr{L7QILmZ200+(xZL01`7>9->P6M}x?dTJwGw|=Tw>41WL=~xJE zZV*kCF8Ru+8hyVNq0XPcS8KKtlQ7r4HEhV{+a)ClAT-4BMIg;iKXas%xRp@C6bNnY z4z0lJd7VHqo-ZDMkQ!1A=GPz@OTy3Ty~)?+X4MdZGSO4${cIHa&k0l3S1EWdIUrp& zlBg#|?#u5H`Yxy$bMt-qDeauL>dm7erRQaCh1e4(yxTYv&}z1!tF(0J!H`h`e7ptC za2#ThsaWzS2^>FoC$Z%IM>Jw>|0Nn}$X3HM_^vJyzl`SWtz*Upo3my1EX$Q_{*P#6 zhl*(x*W@~jIirW!Lv&73tJ6C~sjeSRy=SdmcLeVEIDT4|O<{F(j9p z%@0KBm4hks2)!V!?w-5AYUW^_9did6+n#02HWw$=&WfQ4_+2LFQ%eWjcVFQ4n(SaK zKDf5PCQ816U*uCoDPXLJl+tf!X27SB6`jRbUXX>Lg;#ocg0`pC79wa{c+7gs==^UY zrLj<-4-wuYgP&&2Jv6(0C`KHEpSN|{;LEDR6?9Uz(&Mk2%vDx)+sG>TOZ5M@Z%^=8 z73=jd#6D!_8ZYHlRVtk^O}m3IL;cZ);l2owa zk5#B`A?DUHioCV~xNqA=pzeEtxUtve5};MH-+b(Rq_7N7ex`@qkQJWE?7d!vPLW>T zM^)M{ zag2GQDA@RbofEXmMI!Xc|2BGd;~u zEK5A!5^xvbhAdOEP>o0p5pyDLfobexUnKYIV0YjN4C`hy4+;}r=7Wu}SR#bcp3#PYN`7)D{pi#D|fLz0n&z7qq5EcfcB#2cgWqaU+l zYN3IKNpy(ed1)mG`Z`d9aA^_~*^V7B$I@r(%qwmE4 zn6jV0oF6Ox$QuVyaYR7$egx^x}Da~S>ZS^>&k2ay4EwY#IQ+FWxPoCPP=)73dKkF>rFY7u9*u1ed z<$IX$MAhsaWg47Qd|OLOPuabKCM_u&_-ROZ)9d^`jJg_^ zwdGhak#zLq!`NMlS81cBjS0|Q*5M=Ny>Vmc2_u!xUP9koH-Oj z*WbP5qgNGeo2{bHz__1P>ir!aLyLK_J_Xj$ejA5 zuwEJ|RRMU}r)kl_RaZjfLvR|I)u49nE7#5u#`_GD+gmS*qY-9-4};jkw#*+ZANS}A zgW8GNYw>VpH9YOXikbe+Y`M=8HK~WOOWl_{2zwZV2>u4u)=G8<*femB@cJbDWo_Nw{BtF=O4}6RSl7|DpTe^cf9h{ z2tthazbP5`YFK$cRcY0&uIX4GYgzBfNrcF`+5U*1@!i+1d3008nf3zfaW1#7+ss~T z{uDaUqFIQx5N>UguEl&`Li;&cqE|5zG$u;uvYj#w!Z|AVeLqCW$S-67rw}T(BVgS? zay5+tv=%*Jg?$5pH~#I(6(3};AZc)>g#!#CJXKwP7p0K4r;3h%7b0nDJEaP|m;La| zD2&!&INUptw>F4!YHeksZ~S8P1|w@DJcBa<6(|oPCZvS;>X(HiSdantIw@k=K(~|{ zenPlQ3lJ2_%ZwTO{)Rff0{QG%o`ZaXMuzFJpRnq^k4=|817BV5x!pBYGnJ((O>YHv zjP9vRZ2O^!{LIT;VA`GE&*>Oq7R4bbC)&S+iZ!<}C@Iv(@B1o0cLHO7~hEPF7P_|G(4)E}CgvUY^B1q@Q+(=+3 z&%-mIRD6W^CZmBwkYRYNq>yuDtfW>2h$X~Kgy05{+WkSv*j9u9i0WuKKF0h0nc%Sd z0%K(ONMcrCl|=ITqHtMsq*`)F{N%BWHx@7PQzp2E|r6*7FN>R z84&Fn=fmc(UF2vNgv+a=z+~cu4i;E^UR=|k;CnEV_v*vaiov*Qw~NVO#GT}?4x8Rd z3BI$JP=j;S>b4Sz-iOJZ!3QwYSbT)NVdG^ANkc;vWAkO#3C$I63$YBFl9x~-a6fj5 zDs>vv)kRz`>0P|v$gL=>4wLuCP@z1lG)Y(yY9h-ABa2Jy`{eD&N&V`K)$|<>r>Jeh zNgo8^8Dqx$)v`;J`TG)@8d^1pxLNSYIbS~4O$3w-G}Z(`f*OZtkVEck3qYYu;hznQ zvQ85+!_jb}P@Ag7!cwoRQa7lltMx~A+Sctk7TPYPhX)GUpoN&A?jL~*jLO0pPvX2X z-IB*{ma1}Pj73R*4+m!1Pr=$b*U?#U1xYp zjvnMGqFL5Q576^Kbiv_w!RasfPmjL9yCuHExnZ-rRiHh72X9xIHUi%K=aH!*+1+_P z|MhTS2&@NVw8)eiEp=;wx z^4z3erh-3M56-RPS52&*UBsnz4Y(V=e-CTcy?FAL#T>4jSFu$7Yb4tVun`X53v)o& z7|o)22Jg_m+Tm91w;uXKoNk-Vh$Z;Lq<6SO9M(f-?R)X)EsI$i;P1`H6MfU@RXB7n zg?Bk$8?SR3^9SOB54mD7dIspT`mxTHKd{e*w{YmZg7q|gA-cXcWUgDxwpsTgKj1Eq zy<#u0*({hgAH%!Ng8np2znwP3yj`-G#XTQ9Wmy?EOdsD^pDQwWEpLm(=}{`?u(}tI z-723w@-t@hieZZV=8G*jbeMX|Vv}cdN9}B{5wDNy3a{U7S8@j7I_3xA3XkK8E#_4$ zX^(c28o(5Ff3STNr4~#4KI19>wb4UulQ*FYu>dr+Uc6X2|CcJ_*a^NMC&ph1%IhraCtdQ>11!_Tr|;>a7iuVPQ7cciIdr}VpJ zqI;C-Q&bdlLKMnY5+o#m*P2Fddrod7!t1CHi0p8FJ)Gl#%DNH>ugP2#G zo8$0UegB&pfVt$2HLKa;3Nbap1tE;g|vZ!~bWGkiq1eW{RzCkHNZgZM!bR zAq3Y&WJIvxuAgQ@(6+NfZH>+04d6EP)>Ih0n&e2Ai{+BPQ}n{{M9@*Q(;4Gk>?&~D z@T8$jmSvR#`=Xhqp92HQ~M-nXGce;o)T)|{ME3bz`cs~g0?4{2lIT&)cs50 z*h~Q8#=)>vJ@z7lxkJs5h!5uK0gWFJfqI7bXxt$#D)Im0(k*w*IMs!BF#u~tnhrN4 zh_-8cA0KebAikVr=@qVw9Vk2rjnf-CsAzdBSMSj<#xro`cWaxGCh^h&NN0=CvYhLLk+9n_ zHKmLx{+xaZ*KYW;@H=?fzE_EwWVH5{^uB0^xRBSF_5^K$*&2M27aoO3k@Y$6m<|Rc z4}5y78|DzL3@b_L)EKFT<`iSatPrb&R=Si0R(FtFksR%D7@`oTvWb7z%F)0XcN2AL zAcISD+5;5K2gVy_D&f1?5=|Rj!`P?zU%U?s`rOWcxq`)bpoTmupJ68h1soA~OZ*%N zXds+5V1R|pHs0`l<*7gt(C~H32xgZa&Q+XjkX8>+Y}dVcMtLFa;t#Tc>^?e#Xt6 zqaz#dzWwANQOGVFhxn5&=m`F{atv4Puo{F;g%!YnQk3rA*7Ig7(_i((3i@vn9x z;`v9`X7j5Y54;|O;K(riu*XGBo1Y9v3)GoE$?FFePQV&-oI>kG^`}AnnJHVF2;^yb zY>9dBIcWwpII)A^6`08|?_=8d#!_^5XrXQWlBl*oBC*ZXp2NrYqQ9I9M07Z<&Aju_ z*FG|XDy8&wN)Y{2&S6?G`I5V3RMl$TL5sfsW*hU6qh7S>Ccj~bP5RTH+D)UhlD@+> zCMhDCienj3!X~`~FNDKfLPeWWYvToTCMAmlCHxERQrE*Vcv^=UqwyLc4i^SBZYbn8 z<1VKxXB-0+Ubu%n9mkV0;((GR=Suj4@mP6%ppqd)Qeq>%0U$txdShku!$5EoAPhwZ zLQkndu28;xBtr&P`T7cfaY6R#MdpCpPYo=bpuIJO>FhhFD^G^IZnjJRL>$c%uRkN| z=x#I#7I@)Pi|Ea9VENwR*?$d-ZVZXzVD>Vkq zTWf(#gukhB@{4k(eOq0h2SJ2PmsywfSNf{8m}DOMK$`kh&;)!Gof9h3V(f6O06Lf) zE-QhTrn(G+c@{y#71lEFU+*MM1v)ST{7#Fnx-pDj{5`9t$|hAOy0h3IO9GD4jm`ma ze{t&ti&&f*rD8U#X7OR|;sDavxpJd2I36;40CW3tV6IgOYh@G}1Q8J%h;lF)njnW} z(UXabcT zDwUBSN^Asv+B^NKzwt&g z7y-i%HSk43h+zCysmlR0!41+x4?8TxuttG`cl8cK(zIN6-){7|2xZoYTt)fVay;RI zkt+6WX<(MG53)?$@VcW{fN4*T%n*6J5?{}t-QmUPh=gzxvm*S(!E|xiSmPAyF#B1L z;?*Gg*=vcL@@Yv<_m>y}Pr)is*8|mtoDY)p7DOYlT&|CECpWurjFagv#{xj^)Ir2l za6-3%N1)v0xhvjIc62{kM|Zyf$!7fc5J#EN&Mt0qp19zP#l`XLEgnx4!A9AGnN<9@ zw4_VEy=06%*?3FojshoJbh31naf2JRgI;7mE56m@r|bA*+bgB)osJ2PFYk^G(u$)2T9`mF`ZCauMcz(S6a_F=QKp6t1LTIVTRz&5iTR` z-f`;WmQjTiLU0MbM7A>4Gx+-K%gW>AY4uY*a+Gn{Ldy4{MKvrbdWmL5Zsrj@@zsbR zgl0FCg+S$7jOx_U1P;x60Ys_voHBSaGwlPTs&ZD6Yc7NlgQe5X0#V`c+^R?IMfPAc zpy~Ql+Zu-D=G@wFK9BToO`jq`=%X64*iefNuYB<)!vjr=0m!W^D3|#rlI1_M+h0C> ztJN&aiE?}IsL*=yp^!++2=;YEx?G7uLGvh5<+pfgz3;jAq$FQ(SQPrGIV`6-xvKmH zhl2(gR&&WfZ;eT4?3~E`i!wr%ZZik{o&|D;vPvHY)e0UfWVjwH?IIp8Uyp>HW`3J> z5>ScP&4Ky|NDD?dwr1&E)Nj{|vMHJ426K_Eq* zU`7P%#iYKZoq0FnWSL2@czA^u(#*rz7&m!hYAc0}PsZjQw=<=%_Q%yTkJD)P(zlgF zzKn&&6rnwosr$L;l}p@|w*{_X`^MwQ`2lSK1PKN+mml1w*~(+bX* zApD5c^q*1}Jss^DAR1Ktar-txP(0BYnE_W;hWDolo@oON>+vO(NuI9B+EiIX3Ugj` z*SLdQt1;*$FxiVMxUnTaxJ9Xjh~>KHBi6J?P6=M7rX@v2G0l!BfTd{RvFFe*q&3+2 zz957g9*oEg<_}SK`C3b3lBAw#GF2nl{?DZEWhaSgjxF}O7q}X)KNou)TNwBoC@khU z*E!sdew}MqYZk0>_m8pmb&kLP^x6(}>y_U^Bp3d^{}&*V9{z@4O{^OE z3v80qeR(lmzJKAc7W7YNjn!Aszc_Z*--A%~0^v`07H4cNWT)5>DuS1fHK|n0WyLBH zdsse;hi)BbOlyfI0WV?7N$vUd#JC3mPmN?)$&{4|imC!R35T^1s8a}anBw1It;LCR zF$Xv4x#_+5@Xpt0cSs=B9|H7YN&ve@>7T=ce;xi*NK*7`1gy14UGQa1=)>$)3?YXG z%VsfH5Qz_XFu521i`tzCe=Q3C+3g=>!&iTR{}?}sB`%-JrQ`^Frlju5R9C|h3Y~9G zl2D)$V@?1o7%~DK!AdAc;v$1v8b+4M9uQg7d-ric1FShKDOwP*&|gM+@a^~S-IzFh zjn7_NE(Qk1blH%;(?4wvK<#qfYv2)!;=S2pcpPIxKCcM06dSKB!asMxUo-*ea@^)W zf>z#bn`MR;g<>VZB<~$9v5~-4nz0-T{U+FMraC&|gcq*LuLk>Zzcd_Xhu~l|5Kz>u z^T7o(jc%?&+td&E=twqzAPtsDcx2zx40_9)VRg!+g_+!!L^^0|t34T0)HdX;G^3>% ztelXLpBF^;&yg=hH{Bg8Ti5mW`+{9Jjm^c2bO>lEI`_p*y{k%Dxw z{;lzg2$oIGdWEs2&vkVEJ-lM~KZEP*TFn;pqv(*jzkGp@BC>udDp^HrYp?C{e0w!l zwdwQ)coMCdPXnDq@SVr~$+FH`F7k9*4abQ+>{w0Cdv@g!PC@iZj`WYv6O6UC#m30XWe?cg#4DTxime!#oI>fa<_Lt<8*g= zVC{5wl%4-&`0;VGo^PM`nZwujG5K=RX5jDtRr*G2O(6gC=4fJDzYMzX)2`=vgkU=V z{f$E2>+V*A^7&zU`t#!v^Zspp`;(z!XEooS|MTIhF7Hz)Z|m)mrsMgjZ}owH!O#2sFn(KKi$VYWk>M=8ZTh3%-rxK61)h%Cwt?+# zW8)5R7S2Sy`)B*p`g)-x-Fc0|V-Q$CTK%d_u%?0g!NWbLO_KbR; zDBH*FNR!4=-Smg;`};w*z^u2V_rvKy{#B$I<$MCZ9~}N~(hS$10{%}&&W}%f?p_kiANOxuJ(_)e?<75+cdM{IpL_0S z&wc)0AFsGC*L$n^=Z}8`@;*cQixm8OpMM`HJS|T63;6x0ZEp4d-I>?p_Xz9qR_Fg= z^8S7?p>hBC+_zoOTKMfLnYYj5^%NcZYZ{2-^KH!Q;hZgoyY~|`7XDXQ{>RN**(c<7 zVU|HL{qvFYnSn>fcEP3p4NCl-eV>5;I}HfvfK0&%>d7?6wBI}a%U!+)ebL7BR69#wI!~r*liKcv(j@kEqa~N-Kg7SI$a-py~S;t`T`6%)D z^xDKB@cw)8&cA54*s^aX6Oqr7PsBGU|MLS5-lwx$zxU&0aXmj@XEl7EM@8Ru{ z$LjaQr*EGBQ!=0cqR%InUKI{rKS0;mu3;y|KQ;No<6~k%z$j60yZ5b)6<*`*@bfhn z?fo@dz|Ze_Pb^K4hu2qBh2L8ku^wmcsBIWbQ?mZh;3MVr*zxjYt9avg@N37&mr=)o zz?8r(K_8vZd+Rk<|Hmm;mU;YF%{od+V_=LV&5&}{Lmi_+`%pkHItFYc!+1b1Qvb6s z&><{x3ImuR2CNSa^-WE=WJ=hfG`|Wx@HB1+#TakD0wY@^*Kpp)8>DvQIdJ8d#pc(w zDDy#-e#^kmkT-lDC}&)&*lrqc4?Dd*-+NdJ@4FM8N4C51>GgbHnxMan38Jm0lOH{pjB%9NDb)LM}qkAk@dsoC&1!cshQLd59TGsy$4H^&%DRA$f zY&E{T2r!`nAT&QUN;FvMNG*UBF{6Xqt9M}3_T2+@ag|gE{X&T_g_Uw4?p=j|rS!X$ z#<4;tv;Q30*iYj0ehBjITLb^Wwp5+-;XPlbo5@d*z*_R|kB1{wCN!x6&fZ@K&o|3$ zpPsjss%~7FGU9AvRs>ckFhB6%l|!81cRzzrKF;g~V2Yj=$EH7@AQv7^(+T`B)}RzV z6?S5j_s$3msv^7j`i58lD+C5iv55D+rTET(1RC3=?a!y7z0nzBf>p4T6uS-)91I5`BGM&wU+sATNfM+eAZsVFO{XkLeHn*~{G& zJ699Q$@e%5r7rthj5QArW77hXv)8xj`JV$`F9-1gACIS#**?Su-yNj=0#e6iW{9`n zwhjFH!N(`IcWMm$nz!CQZd)Fj`6rrQXt$TlpLIaB1;;R^4f2#0+Zb$Cj&iwWB zx_tp@*T1hA{9jKpABGeJhO|%mR)L)5wq8#93=XgS#<%m(@{9piAoJ1A(468O8hP(E z_frIb^eC$9C4wSwfxef4m-x>odVdPccxdXT&v%r==c;YLU>Wu(4L6fq20aEhUq|=d zm0vhympOHNn;mYkH%Fb!ZEUCcJ5jJhdl>x9p9MoD zI~%@C4jGb*YU43aiX2Z@KLAc_ZJ*d7r#)v!mzXw-mt4znWu*E%MAn?8y0j|}AN$~L zZ}$u&uKw^E@8Ym|A9yCYM#1Yd&g3x70x>MXKc05yPw5gBxVxfed5yGQ%dpH3Z$=xX zH}+z+AuJ?;11=sBJ8cIT`L);5+wYKu zAIIAq7TnFZa~1mD&)ogFK3_I)Y;egmIorXv8}UtxwX2qI@L{=}e6#u4Hj3{+B}Kv` zWi4sz#!UQ6RuctG3In2W?O|rjO=sO3J31H+#;hP>X&@jtH__Me9)$fgPKxp;P-i_tPa4=Z~V6nj#Xu0OBfkQTV6NYNWIq88*Y2Nkh_dorfGBej2Q)O9l1khJuafK`1T^wVx-9J>!s{H^Dbb|{;kzpB4; zBq}j}ob3*!9K1sOMxl%1(XXORV|#(#jP4<4$FtumV#o9HilFZx(lN4B6^YnaqcQQS z?ZYfF$=)c~y>f}~xp_(!7D89US?hZOsdO&C-qU8{C5mXUev4C~rj>YR;1w4-8eesU z0FfV9u3_TpjYG@Rt$TQormr^Y4_3Sg<6x9VM@^Be^2EW#13Wpl;6roW0VZmxbT+`!-x&DIF?z<_SQr?beIwE;C{ppM7X36JDy z5vtiR0F%cbfHt#D$iP}?hVd)7@Y4zprT&6+riADZ8^F%$1ozt_RkWskW4hwfDbBBD_)4o=7M9#JZPV+=BNF^q|^@+iN`+D&>DH%6RaVlw- z$3U5oDP0K9ga)qsXDkZ4T%m{LU2ZlQcXDFtk6l|QV6yr+prSwwO8!i6n}&(QUGAZU#qI<=&B$QXT$0zfc zBgG>O`|j9~^^%~JTpr!X7JmKfD8VN2Hq8^-iN3p>s$S5l6Ysay|eqstiA(1>15m9<6Wz}DH*cepq%X^Dx@Gb7A-c;IFd4Q*} zs|EQ4!r^uDf)oK{hbRsd5Dj~b_V zBwzq@Xhgp?@R6}9@|>risPSxC3M^;;9+`x`JWmvmK3`B5C0$LBx%S6uNkj1iJ3ej1Q#zrjhPDkVE}bG^a(_DM=1P)e3zwj5e1# zN~`EWP_G~qk1%51Vm3q+l#ll&iWWPxv3eFQ-~oCD-$TZZ^c1;- ze^LDrw^k=4N{Jv2M?_!Xt&`97l$afTGjYIgtB6)elWAOJ-B|XL;$m#}^=C6(cm=T= zA~P0;7B)xV)}F{6J$^p4{o-V~)YysNj8dl1kIU)k+vG|*f-X5Qe{b_>8li|NBXbMY17!XbPAI9b}QhW21fjWU(86y4Ni|Tp>qjN{D3YWJl7x$X zJc)l)sa{RSj*Lti;NcIAi0v?i&~#3a2Rp7b8#~(iE+>C=!!LD9rLLz_+bK#m(JqA> z$QyzaBp(&;yD;BSBwyQz(l>z>f)$pkvy;1H5;jLp*qnSlY^NTSF_TL$=$ za2ZRDg#eOOi7JGZLrccZY1Eu7+C-Se=W1@WS8XFza6o(DBSn!S2~mVdgVv%7`m)53 zSoBb`kiMEvnnfcyr%~2e7JHz2)i3s#t2S}d)^P8W{yZel>FyhIWx7e%qM4|-3$w5I64g&vtvq)AgG zDHD5QW!PhK;B~EJJ3`nsnAMtB9Px3vXy2S&@Kz&qk!UPs9?6TR z?!`DB8!ei`ow)Ti6YspyN1w2zwihN6Z@frm6jRdi(QgtK!hhRi`y}-+ZtF~oV$@aI zWUbgp0=j(-?W&Ed=-Ib9RY?^hxzHuP5c0pR`I6}*NhF+I>vz;4LamwwdZQJ)Rco*0 zS(703O4v$Lb2njV09w$r4pBSFHxTgdbs__x13mHQxT}}tSkToDNu)$VVj)pCdSTSR zt5p>hM4JI zt=0(huXQn8E%EmwW2!1F#K!bQMdCtH;mC8-f4jt>Q|8qLU8RNk@QAQ7mE{7eHKRUi z_rewfI>>zu_p|Y6bzxZvVUy3@R~|6}*c>4zK`l!iIO2*6Bbnu8FJ66w zPl4S0I$nyaqNRYIh1-llmi%=O@euDOdlssZWq^P#$MVI7l*}S6h>{xzxW7TVVGk4J z@mo9)>ZdO=*G@kd7ZQ*!qt{!;=I1Lm;rA?%Kj-k>0_OgG`LcfI{_*?ZydG2^AAPfw zpq5W<_ap@qnY-T~Zec`8^#?|E0_Zi5Ml5ii%pL8zMfq)b7qIDtwgpWe}5@Y(f)w z&Rv5>De+hbOSz>0k-rfaw(04)&_3Q$+6CO ztHnwb2F6>S2$5zzBAF~?zX0h+{rEX|hvArU0PWEkpu1YztO&eV^am*qe4EhZ|6=Z~ zV;gOvHP0|}hZ#G}%*@OT4yVJ+%*;$3?l3cBhnbm~nKSvmdw1r}&i!Mhl~(JLtdjLg zugkJs&#C8k&e>}mvs&!hMF&j)|?r-|*98&6`xmh17{S#hhoFtV&a;yJ?aB?bVwk75nZJ z#Ho%tcPPD@K7joHV*l(hJUBeI^BO|E`e22nsj?&Z%%pK5Y3tVdI&NvKrDz`TMZ7-H zYng;gjr3l8KDoWUW>6o9NZn~AbM3`dkS)pIzF^lmg{~Z5?}9RKpwDJ>Iqa`qQ!dex zQnH3jB0wqzs^1tx3EH6$--z_r<8T!kbM&XQsz&4_f}LM%*Oc+B_l#3)@Ke*~wv^(7 zya-NrevBD~17Ql~byxHWu>JU**=CXQotXJ5z+b8Gg17crbi~7ncyYo_9y6pNo4lsJ zIw~|uuB)vkPp`rR*GNl~k+v1)c3xtgywX;BV2ih6R*5O=Un48w%KTm$a-x!RzrlEH zYKo7-L#y878Mrc!9s~rvh&viBqLedIPzYQ45&8ulGckEkMh{=_(Dm2DN%39 z6)w4vmZhPNu@%pp6)8`Wml{z*(W)U!uBftAcKl@a5O2aFV~(Zd;mO)H*%feMsZh&B zWl`{xAojVP%Dp6w9%CVPft_e7xU`a@)44xdh%v|K_hzJhAJ#Ox4y%cxUx zg@lach$oG4&YnXLtOa>Z8nu`7qj{XH^oz&VOy%qOyj)(O$6$Nf8-aCjy&*F5W{t3i ziJ=Y)`44#=nl;`Ds8Ew>144wA7^eM)<(i|J(b8R(^cqg+WbhBJ&w2M*AcpWFqM>{WKX7%j1V5z_*z5rb0y<-10_wNsM$Wo!+QQR(_X;G6 zRrN~W2xoH%;5VG*Vjus~<=P#%YZ(p!!`M0{b7nU5Rno`+0U4qtKOD~RV*guV@~x`V zsGlNzTlzfcCfjeD*b6fd-G2u2G1HNubX!7sTqc*?#TYGgj;4=$J7YW2d`-1qmECTJ zOcG1|TguAaZMLK5kD&V6^T-=;qn`!@Q{JIt({Dw%9l~n(RYe3YDKxRdLh?oI(x96J z=5JjHTo55q=wh)jk=F2}PIjz+?)PEoQ~v;k0Z{q8_ZT!@ooT$Q6`E&OYAViHNWvc+ z=mVxR$76jJH(=^_VS`OL@(yZnKTdg!^?`1FCUq{6N}6%Gbv6kv<+RRWXMw-(eg7pJ zeZ~r~nES@QmtRG-rmuIqBixkuRL&}VP=DUUf3 z!tuul!sPaVGpV^F1op*>dkrUy8O=~7rGnh#z^b1wq@f=RVy@;c+ESqvWmSPL?>ew} z9pzVcQ^iN+HC=%`7(0psIA{V-T&{(14r#kj+BSPDjiL_EI=-o<=R2s|bx7~y$&R?( zr{?Ch8QZG`yw58lGAC*jc-?#%ua>ml)K&hej;5A3QV}b(3!&X0gmy*2ta&7-Oo+Bu z3(Q_+@i&_)Bewp_aCHH|biCWIRY3QazBz=Ff$dtJIX~7j=JTzLh`UKH&_u9ulHj|G z*AE(8l+};2Og?=S2-Rr~(NfdWmO+tZytjHGm4t1)Kh{nW!&M%G8a|mjDq~6C8u#A? zckD$qbi)fk0gWT6C6Ob=|0oiT-2m9^U2_UG)pGZzPdS+ z#<8p@c^8hLaH$<$mXDx!fA$Yp_oZAxX+vql@%N=v4yDYhx2LtqZY#a!H%U;A~2PV|A8IxJmqv9{0XfrMBxC^FXGF6xe2gfd65;d)4|h4Ozf=!_m+IE0!U8j zK47|Q;JQyvOB1?;%QKDpz=HTl`@r^pc?mI*;z0koH{ko;Fv3*-+?z{)&?f#1^o5^- zEba?*QT!7zXg;}hNH)1Qg}6 z*d$CPLn_DWCC~s+jPEtV1}TBG3K)3rg9s|>XR~;`qo_?D3dk4`4(S5&F@O=Hd5%7TDWA`M-t8~Y0CG9EdJk`f#ofILL zIa)5LoPY|35qzfl>!{@@LEeqc$(b|_+xfNipZ8*avSc2aaaTd{526YS0qUQ>L5on3 z(vJ+GJu?kEN8zz@DU^%A1OkbFYbhcJXULF0eB{IZn$dQKVr8I0i~Ez1h2GGBx3Y__ zuXW3P^!O9XOh|V`mcj7}1HK;zu$X`2YBH|HqS|P(m`@g-#`f8zhuhV@pTKRf z>M&kjR0zIs|4tI*P|ga&!~0SMd5y)W(PzP0uZ#ly+XB=FiFm2K%cG4r5L2dIXl>%% zv^_|Wg;^huK!2Q9Om1GMvW%{BPoFH%4NNAV|4Ax=m~A;&zI2*gZokl$fL3lwYob%y zq=|kq%33LRrd~Y6YCVT`5}{TQl59@mz&-toP$*GL&l%m(`xjI8WvMSSg-|n?ABkCn z4|F_!;^HNJ#j|98_gPP%-~;YBavxln-`@dv;RlN-b{&sxvK|IIB0Uf)aYjeM!?8)O zp0&vbJYf9qk@MN*!-Z9eN!DC}3iTJUo6-D33&^C)nDe|sA7x*44h5lENeFy3>)#V- z>7p`SL94HV5AE~s#u-`@>?Quqr&U?bjw6fGwuwJ9@MRwxU<(Z$CRQcdkt?-vDC?t| zhrkqyF4D@d?QZs-l?{X`?Bi6`y2VZ^5gH>oZXVxEkhtq_Xf*2JoAAe)J4)Q@r?Se< z@qR-u14+$MYi!A_)GdY!%>_|Wl3B0rM#qP}lx8Uj^uka_91k@}C3eVptK168=q0`kx^e=d{!yo=%rkmkBw3RsVMa`LAqa=s(` z$L_b00sh9RY*=65GxMfzD!o}_cS*jBb1!neI>#FYt2=mY#MotgGw2Pm#0wdwoOOKg zmd4Ry%W!o~XLXBjgWjrOiBA12+Nky6Mnm7r-aPe_o4@5Ix1lP~`QYPY4^p4cFcVi_ z?omu%&TIQ-#R%QuFzu=0c)xm3YY^)7HnN&Lk^G5(pNo6=DD*tX z8%r>zI)^~ZtabMJZeDxaXI1{`N#CRPjeinVYIDoiVcZ;mBL=yPeX^TWi*m?dayZsX zcs`UpsJ`rHKiGbLL4QdvWOgdXutxZ`pz4t9rngJ>C9}J)Kk~Lu+S(;m)w$2r8sNKm zjCp#C`^D7NMi1XLU6qbQ!~cG>S8bcEj=`_{x#9EDe=pl`-OVG-4Trh23a!cdG{dGf zLAx$!xwE2tM0IU?>M_YtpE9>BB;CrDsZvU`L8Uo4!L3k--Tf6tiG}gUf*HC6$OLv zv`gMk#9auhcThh`0;hCg9ZS2ja=G&k7#Ego+R>>!32hC#Sf1oAIrXJ%#%YhFSISd= zM!jRb|A4etNRk2U~f5+muo9Rz*t@eUiWNk-)VraUzj#2ibkAi%PNooRK0SE zpX|==fI7td5<7#*F32F>XA3Ugn9p}i+U)R0;5om@SGalT88Bce9=o0xaD(>0-LqFpPh;GC^U{{{Z|S-qlTi zH8*Wbb03IS1aJdWq8w$4yk#Z=mf#w~rP_d;TU*mMwEUZxyqna{4=set`j8oz{iWx* zo*(KN6<^dv3Ds14kE1vTcky4l_#wynfdjqlDmt?+D{OQVLY6N|gB z`6K&RPqFX-Gy!ZMnV2qA?ND*6^v@32tYB5Qi4ixnj+>WltT_`XrTGRA+hYm!^(NdN zqs>+qAy_aUFp_oOH}Rd9&tTv+S{?&F%U}QU$VGDwhuB$f(+LF*v3xG#K8_xl8q)BA zOi)JIko9Z+SZ4u>Q(dV@;_>${HWKiKi>;VW?*Ljjp-9-bOOuJLya*3W&dotTtL(cH zj%=CydQe)&JMplLen%JZlEJ1k_%VwK&+D8FrR!4^VA13dbD2x*?yCIO^caRh61Wqn z{z~4y8Vd&G$`$pV6t>6f$98W;a}*d^Ayd;2?++&?>__a2>8hTI8LKOEA4~%r=0`Pr zpk*{E7eIF#xlv}8=6K0z_-&B=8rIOYU z=GiR7=-~K=6CsQdrJ0KX^@?~pxB~zD-bm*ZT3-P0Tp{}HxkBm`ONsif0+jaxBqd|-` zcI1b91z0tbyO7tsW%1Us@>V{&q}NHQVD$i+#9piim#Cc>KE~gR-)e!MGVzn(fmY9p zFsMPg&W3#%8%fOk9Gr0H17OZQ#vZ)6v(Q#r5J@gWO77x1X6EKNKXQb`P#eLjIhj?% zRb*7ew+P4v9Ti?S#CW8@;e~v4`N4y8I6izR{wi@Y;dQN2wdO9Qny7ru7L;Qke8o+~ z5I@aUKR-)P=|6YMmGl>6_@>Vrd#k6mV`8VECjBmoa2UGkP?{}PS#fsJewR0Vv|LPlW%kCQOy4Gq@Oa?{45dRA!;h zX;zC)sq0qs!s18d#K!A2d@@g>>yZCnUenGI);s67*(6|`ejdH8e;am$5*{lSE0#EN zF!Qh3gb95xGf^j?gL|ck%ioI7b+D{1Sxc6}CxsI!)%NKU` z+RrM%Y#$IQ0WU)aF5J${l{Yqut5 zmxlWr2<>Cox{S$^kA^!NUAJb{tyWyXH2xU5hh!f19yXyHn!hTd8tSOou%3on#D_ZN z_I>DvI`6r4N{OPdR9Lk78PI^hTCK0cHN}40p}At=*LV~J^E!*UwcYQ*XG?W{9%qj} zafC|ex-W1tdsXP^fdit{2?yxJ-QJXVS&g==;K34Kl643WX(k*m z=IRCeBWfMdq;G(51LP=}yI}A`Rf1fd+53#jqP;JVwLA!)L?FFT$-p%#Pp}r3)W@ z%z|4a>M-LZpVe-5IOTmJ(Jh}kW0Na{9LeoevV6DjB#BVWf$G;W?1V^mu_3=R89(&? zug1DxIes@H-Lg~EVM=n?gV8HrInZnZ4);BvPdK!7sp3PX-gPtbJT4-+Zv2vFhi_(t zGxEojRv7Pv-g5=6Ijl@T(47}bFNg5Kok3Gj+w-5Fkq4YC7!FLeiFUjstx&o^o`0r5 zMfqQlf+}2GV}f4<$1m+}1%v@X8XF93J4Eo|Fa29vPO}y=H6mL(vci znh}6S%^e4MriXpzUX8%)0x5-jaPWH6?VYd()99Nj*XL*9-?k1HUW>KrLWwws{fhz= z=+4>`aw2NiKVT@CrXj$~8cm{42R;?alMT4&J)EVX9tXPg0EAR)6lXv|5|p_7GW<3M zOpY-h*I*DHQj_i%__TwA$i21h|L@QG(+7>|3-f4@vq|1e(;rbr(Q?p7>}yh)!;uNr z4JOeB8(tDze%gaUKsS9IT#SShD(wSqDZkKvD0)%gZAyICJ8p1bICzejwRN8x==|e^ z9!8fCE)-!cCK_R8E{e2n`)U*fLskT$UIEpw-9@Zx&2 z0R;;~JD^-+?cg-{;vK6lG@+;5V&*ktdD-Z+RmKpDQi!^9;sJGnto7X(gvHn}yd#2o zbsH$=t_%%5j77Vjyeh50cO>tdmGekJ+wjaWzU1wUiBqCQj8^Lu610A140)W3M7NJ9 zTd!VCF|ot5)Q%b%Y~bbeU|(uFK=mrpN}O5NtdJbZI7T{QzQEX9(H^3&XNq+&9@A#qAf3J{y8e*_zOoYSK>~+4beh-;WpFhUx&cjvRjnen|xtsuHK*c6cIWn z`H%YAZ+rqggrjbb0jyY2_{evR5#QS4q1Z!~i4$xGS1Y+Ejv-rN%dMQh zIW~i)^8Xs}h{*air#N2^Vq7W|Cyom1en$%5%`HgdvE$@WO5K+3b($aj;}>>+$$M`X zo3!$4Db5PKRyRnQZvAZv!Bq-?cKE(9PPv15oZJYGbd@guBEM;H+C@=xq(PU3u(Lte zxZ?h9lg@){n%K+pF*3(`aOQ66_}E>k0w+!`!ue*BA=hJh2qJ5N*Ja5O1jek8k zkN!2&_XYuh2&})X?kOWguDb<@!!}D zJB$BmH#l@|!Qc$C8y66I*8rcmqW|MHR6YY8;Jktan>vHeTBu=M!QEL<^9jC$tY4Y` zr(phGf7GRG2*SP$`MSZ-drLwD$t;9J%CYUzOVdpJjg&A}D2w%B^AINXubt`3*0Vd= zgyop*2xWAWm1r6Z3*^>B=uvV$>!om-b)}+cIyHnZ6NF3Fd}Un;kNEpC8xtc3S6PpA zgXa6z2p$nc&*u9iBFPurBhOQPG;M$gjZ>c*5$i+M#AMd4CYb=*F0(g%JwVa~^#^_{ zoMbNb2wI6A8{9tW@Ttqb$z#Xo?@@=?{fxHS3z&+Vx7f70yyx-EwK8O)=H{LfLq~5r zLXbl1C}2bY?kzD#=4BTCqPAD~ffzp>QT zdxSPg{TD*8|EKkZPk@>*gO}@VLl;YS%hk!NUNheE=#g$YJ6shU8ufzp1Z(p6U|qza zqKws6zid)A+P76qR+7?@((rH)m){BZ^1%F1h+aYHIZ&$TdAh&Kzg7iY~Q%XO0 z+fFN1y7wEv1#$L=jI9y0HC{-ZN`K-l2!=+?FQ zmDL2?65vh>D}g>tFcKiOsy{j4Mk}<#~ISQu;8^P%hl= zC7U~YzLmeyjV*iqH!<-W*Zq8G_Eo7qRc-XY(xnwLLxwnqohQVdy0E~kA+@KN=b&{V ztnW9yp9j2w;eT^Bo0V*Mec}cAVHrz{c=Ke#dz?pFEm1Qz@0N5({L4WXOe-!3^hqJuV zL~I+>^UNpB6_;XF-i}byl{*8McCM6818c*{YhtG!1|71F3V%~_+%Ux%#Z2%jc%jHM z@%|)kM>WOs{^1)sHJ*3}Io*;(NvC3HG@{}kzELO!500gDOr;kd{Y(vY^bMsSh#w<$ znKzQ-GejFK?6uO3ccW>szyN44l6#LzyQuSt~4x#rmmz zor?hBx@_S4Q^pp_{GEfW-tA?3znX;RWXe~0%%zMMnoN1)KTfMw2W6Pyrx>jt@n=)j znjwjNSvwa>-FerVZn0Eu8tS;YLYFNxgq4AnL34D4Zucozcr2RTCF!vC6Nr2pD77Wu z#B`Zl+^N(&d@4MtT<#Vzr=bIjcOT^kRXtm*Z0LURM@i&Xc{2UlKt3(C(3C8q5}31x zEH)zfDBUm8fvTPjY68wG==x>t-&NvCtn4nu=p|?YnI}&g$oNI`>E{jCja8oa4)=8j zm)oQD0EDYlA@5{MMgollv(xPa@uS0+z@d0^! z?1$_W%&ERYO>SmYl;XvokaM47AM+wy)5~53_fbeRggrYosL`)hDn7No;2D#I=-?ILwAIU;4C-~ zlq!y&710b)Z7P!EUlwko<6NY`*LgSRz!_W!}wRBLr9%BrW|BC28|B7fu z~ zMWM|q6o*a5d)Lc&LLb1&NA7bhkEIWUA=)q;MHsDmNpdIhfCPfAece9piy%?nGH@pQ zMut=IB_Y_7*2Lgyai%$ViJmlfSnTSlaKVaTjEE3Tu+>*^=|`V~3_bzV7}~^qBd0RR zTU&A4#E`$4$Q1hd-lhZr+4N#QA37XdbXvFw{vFC?}Jzkn@3}p#6_(3>r@|?GwxTsQ0z_YJoU5DXGD0urMPOLTz5Jm9! zl&JTVH0++I!Bb&de6wNrLG0_xQrwRJwK@p&ak1SH|;xzc>FG91^ z?N6!;lc(2!w!1fpi zj0-cH*T#*3E4LBeg||GSAaO=A@a3E}ZNZJ{GAEJ79rKim3{hCw5j(#53_nEM2eK%U_G+G@uTZbOkCMfRWHswSQ`z0Dz<59;(~yoL0?D!3g4ULo?W%bkHUhP zCB~N%bEk}th1L`Ed+V2++!(PXMG5hOG4|muGs5r~G4=&1@q*0nuK*7hb|*AryDLkZ zVa@SzmJ{TZSasd46DRHl15{e3oOsFHj5OluN|P7YtDj8d--7BGixV#=E&}f#M+Jyu zGfo1pE<@s*F%xaH@a%$+g>%3stlFTr;{VQ^1i0|x^j=xf7`|tmreUwcjDbz2_3OI0 z%-?(YEbz&xa7M%$KiY}k{ez4c7h!gBLB<+O!1u)^#L>onko=U{v%GP@DNgLWnEM%0 z062=M-jF7k?`QA+!|EYdAaYt!MhYYeMYw02eSj%pcs}MnO0&hK5-R8ogsdK@By$bXxnUd$#_v9jr~^GZm@9{t<^})E4SwgWn6MQSLRi8W#;s60 za8iZ{ioylL;K-*ULA(<6jHCAY5o0FdJB1rC;Eovr1t!3Yo08mtg-KF;4#;Su^zwf#xCVbQi~gP2he6RgLMH4kL5I~wU_GifE4KqX zOAt)|ry{TqYys(sH?wd?n4P-lPGu?dgVCz*Kl0PHH?e-^X$=$im0acP3B@49qoOTSMEFGr|vYr@6ZdA=7TGxOa0GUi?hnA zkF`WX+rw%&;kw+@p8h;-S;eyu084Hjl6J%sVj167$o*{-t~wu5Nr(2_5$z_i-;B(y zY_9_Ob6-)av~41$JpXsF>BD%T?}S z5W>bzk!RX%P$!PKRP^Z@xc}|QQUFb5=%;i;O-al!q(Iz1^6amv3h{;=N;v!fnGbZh z{E#a5NHKxSb(KnIVC8@(&|3A^<8C(iRk#Ic(yqiF#Ki3qbyMoDFnQDh0ab5VnqIDA zDbJg;Iq`+5X^N=iT!YXb5j>Y^q!9;1&GVhF#bAyxLtBkFYk2NS^!U$zug*9hf6he1 zKBs0e^HVGeom)KhnH>md8=#P89VJ2yVNvBm)|1T-ez!QFnaXR8OWbkkV=dSxb`lH_ z@Xi5k^o0^q`+uGkG{3C}R1`H$M$QhGmt``Lap@MH_-|s+wf5gYjPG-Fsb!YnU7`tB z8@Qu&mwapm_&i6xsuL!#{<<@v2WE z?&2UNn2HEByCH!z7>yw2oSaJxFS?Ax!5|z}snE&hlj0e|)~n!tPV?VB) zfLrTyE%HFhM6ZZ=V7ml|hb)slgPI1X{aY0@5Kz6%lbrdmwK<3xx$Q+=AVuUC`(zn+1NYe$m zmBEM6dSEQe@u9AvDI z6Fb*ToFf7#X)=|mvWKE#45?Q#rk7o!5s)jpKxUIHSA+g+`7vO3W!msmn9ubZRN9Kz zKx$>;+>B+yl3jhJ%#|8bZ46}L_iai!wqXIYl&mGT8#%6;M~fTXdn(MP|IXDctv2{8 z4>?E2#lvz%d))mXlL|2M90dVO3Sl3^mIVwxfE62T)9(EQ_AO^1W;HrzXEBFa3vBg% z0qV<8fN-8~gf3VurV+%9ahUH+D}$=I7={Lb&va{A6|e9P8>}0ftQ)s>Ax^YAc{P=} znqElBxfaJp6TWSbSa@jhy*51dcx0DLq*vrQ-5yx|qxULZCT!ld6Wn|A+!O&%u zEd5!Ok@Tzo+XAQJoU}1kO3l*wkAp?)7TbRg8ynag-dW8x@fLeB*G6rNfO~`U85N zgA?<HcrWQ9 zK-}gXv+GOwAeLv)lWm2h+!alkUT$PD^jq=RE)f+3R^MplQZ4@?TJr8)V53m)AC$~o z*lkPcEq0UgPVFtmOlp9$kvM}%?Tv2kYBrP<{>yWumN8_M^A=z~!rXWYht>!99y{;V zSS9I(ZwTe6=^z)E1I8@ihq`OVETR_|+*r}Q#ujXBh0d@I#CP$3%Q-He>z}8Ko^FQ9 zon`Q*eQmALr!Q4$O;~q3DGV*)F170V7 zFSmy*+i>ql)>gucq+uoYj0@c8;<=fE>+@7|e*(wXuhA`b*-;j|E-6 zS~qTT9^(EWe%G|}TFM*a+L_C7oL+X>vH>A}VUt#iO;ElTS4kB!doirG@b{<*w%LG( zsadxn_|(W@ElJgp#U?VJFZtKlBECV`nI!@UwjY2@bjNI@{uZnpXPqX;k&y#j|^k0posl} z?Bf^L_tzxkUlqO_k|txKK!a7Bp7Cd#tvQL#n!a0mu*pB)>Zq@+D`L0Rd=Wfw_8!!7 z>^IRQT>z<-yfE-^ffrBfo;F24;QqlkF#o|fm|L~e%>M)5Fte(jpl!<~UhGd!M`ctR z;PV9g#hFckN%RlH&$@rPoKQ|2ecGjVE+=S9@Ip9ZMPQ~_}y3T(T zoOuEHf3Zlwe*7~c=8!&Rp8zX)Rw;x^_0VI8)`^LxU(bTru1Q!Zp5nxN20_V~pl}P* z(F1=5%DL~nn5(A4?kj05a^=2?=6p}?^|?NpFC-&;XYfBGS@XL4&{;AsCiz2Yd^l0Z z@5Fj_AOvrI>eam5)v(nwe<^Ic!3XD%p0vkcYT1h-H+Q`3&;7p7apQj3fvnoi9k>L_ikM@sh}3K)EiEM z_3#S`We5i8*!+l$Kb|bL+%$3Caf>r$9>Jk;$uk{CPI(NEp_1Q6laoi2vrLoom4o}x zEd$>>E17f(D8=ln*bFSPnMl)9M;j|or2lUnwcTuT4m$rj)w9s1(bw1g7qEgfB-9jm z(aL8F5Kx~wERcdUC>Sab6ciMYWH_uM(0_U0e$P$ZoJ?#SEo^P*9o=o50B$CZ^ww4u z4s^d9ZEXg%tz*~NP(E|?Yn_#QHiv8y9wRK{iDhR|;cq=8tAOb?VH!kM29)UYD6Y6n zKHnzdl4zt0$;v6)dZb8M_jzy=n1vnQkD}}ACC53u+s7;zUvAEMQ3VwH($fTPchOOx zGR(je)0cq@7-c8rX8SXm(#=F)^t2+0&csV$!Ezl>cdGjw)r)fuPnx@5{PHFjw3IS)ug zJ3!C_q>u_69o|mdW)8kg*z`Be2Gl3fpKNE zA7LlxqzJ{TsS-%p5*XubH;FKSgkfv2;Ag(>5C z8EDOQ zC8Za}>qf?Kl2o=imL@DD6(M)3oqyn^<$5IKls`{C{R)nKUTdfN{Nz^s)J}$*1?NM_ zfWoGhoFo46OImn3nc2M5c4qSiy3h||ID-!9$O2aV$x5+?)YWC3FdO5%K-+%rwv%00 z79Q56wWAtaXnJtzIW2ptm^|z#5|KO9EdxTEL-*18GI?7PZZ4y1yt951$uF*$kXZCK>k2gzZAzlB##2QU8X71+j>}mz zO$Az7Rj5i8A(B9iT%A)QL8u_K&PlTea|ySK3EmBHD*APS(S%=Hj*tB{ycPx_lHoUE zwNADhi6~an(r+WM01F`pRRvDDAb2)NLXNGU$HuJ(&wnwV@uCd#elXX(M|xruEd1rj zv{iw;b)`U{`9ym?`+@KCcc=U7htwdWO{$Y?a=1A?OU2B=O@@&8cbbvV56-_OhDH)R zGC75}{ss-`FT^=zga(Y^+CmH)Z8aH{B=JRU=`OwAR$?)S1Rvr)586xN;IM1QGPkM;IgBH zOxfY=nB4J18nC*3fUo6>DDP}bgCO`pS@n`x-B2`hKGkvJuEG4}sr6cO%Q;1l?Pt`H z-!c8=lm>72S^>mCdE*5UDmxPWn-oT)P|X01E-;LY4P4Z+msl5MlpcwNO1R7=>h_P; z&@a&-1C^+|FRJO795AOJPgZ>lqqc6gH!VL9;3ss^WSr+GfpufA6Lf7`J=H?E=N_|@BHowidxE1(Eoz&85eDhn!4Ket>_jf(h}v)>kiyrPg6cJ2ktnyq96 z(-|$qgM#be!l49vheIJaz<7oBp#xCfCJp+Lk&dmC<(M@~1Vt!ysVV9jE4ppEY z`I9XkW>9Ou#F+9(2j?iVCF@bs!9~-Lj+cey15O^f8$Xt;8o*@q*HGM&iq-%iKt~Rd zemB`SC~F~BKsW^r!}S3W)M5r?(>gX)n8wtvyuc|@A=Umaho_m%Q=xhK@d3fW^v3!3 z1u~igU<*73uV@S>b^wcrn?$&s2F5Nbb1aj7g~JTC=}Zn2WU@N>gx3T~4SI~KRd zdiXC|1cIEjv+{WVNRwcFkkUMV1;E6ayJG6^Ixty3AFDirfIz;GlR(#05fyitf;ouG zevf*P4};Z!pE76D=DPXX>S_pFh}`!x32w5H@FO=u)wEGdvAG|vX;H)qnX9vpcTg7#{R0(23D)6KOoA?noFbQLV_WS|%ToZ(3ykYsR)I}Y9X z;-Jl#Yt!E9KXi42$c2bZa2pk&AjlW$m3La|-5_nfH$dkk2BQL1iI2zjk{BtiU0_Cp zj@8^se;FPxXY7In-9VDGM;n?XX5}qRa3&sNS;A6SOc`Qq^(j>fc3WA&#C838SD8 zh_;=FbwqpM<`JmTlnRs$F?EkN(+7Sfblbx6_cSynt$#1z_EW+jD2Cyyl&sNX8A?QLqGJvJZ_|b7D^zFxI$DDb32{+0C1Za!tW@`u9Ljy zEhB9qV1wpfyYh22=(5T*PFC-vaud-x(Zl?n z)Uq;4%9^U<00yZ)ykziAkBjSTIZM$M%x*Eok9S&YkQ8n>_dSn1c7D6C zTt|bLOs4UoPn(VbkFxTS*qUDY5EFh=dv~NF5Zb|A^I1?38xv@Ge4B?UPI<8>k(;rn zc7-M$46lvv73Vd54J9RS7R0iI0(muI^66DQa` zW*C~HYZdS2^|_z7&SMmt50bYamihSO>elHA+x!X*b(+^$4q0jLCfRqLb`q7$i03n*3>Yf9AQf3~$L0sy)phSUl*BFbu ztNBL;Xw?4iC|Drw&NA-xP_?v&1){IooOIV$uROg4^KeIM%PXTKKag42t^KUJumvxm zeG)qf1N7A->$_w(7o8hY5kfV#h=p(=#LVJOO+P~ms95LyhJhS?DgEp$J*PfLVRHyM z`b;do5iq18LPol3*g8^Qp73&*3XafQ1J2a}30_lxRoDU&mpac}oX2EZfzN`WVF1L; z%5j!p1EOv%t={QTr5h?e0Iz^4tPNR;DXc5z@wn*m%Byq#;zz7ta+Vnwe)Jj_`?2lT zP!b%`c?kJ4Mf=h--{@p?YpVO(>Z$EtR1hv~`hF8O< zCBE%c8$0dhjq`>rNBBlFu(*V7$(`Ok9z5D*pxfPt26k=8Ss^2LuGc z5A&9nX0!4453J(d%J z(dDLcsRr?6r_uDI4waoy8fLDieyI9q>Cy!*SU23~IpSAatCR9%l8bGZo{sNndk!Li zUY0Z1jsdrYeJQsKP8SEXZ)_^(OtwLeU*P%r8c4wg+z#a^1ZH!Xv`9(5+L~dD3n)L_ zEHqubx~H}>2(ZCv7r@PR5rtXOZy}`$bXR6As+4a*uArqgjwcJEfeOlTrRDaMCwBoO zy6_Wpgqtdr2nG_fsV@cEH>m8v1FPsVyKrK%m7Zm*()PLjl14%1>`@ri{*@cec@5P< zw&>5)RgXP74~L`hPll;srmFg=_t9BgM{?%K)z>_ zWuOQoj2nWbPs=z;Ee6gnZBkbHd_xh^>RKI0Dgo?`IM3-x}o$9pcUO9(EKb0Un{!zZ`nI+p_-U0eu}d6vwp%Fb$- zT!|{GNh(Yk+IXq$;!>(SC9@xw&I%@+Kn|kX1oxdzOZP=)Fqdj{%hTyec6q>DJ)|C)i48}JId!c67DQ=khzg&@|C+| z-`o$u4FAlz9{c2YRh$=;So2DIf3#g-oN)u|4RO)P$KPhp{Qf`Osaovg=hL&-ztJt* z#Cg4~B*<5zmuGG60@1F+@75>(HRSm`z13os@kaiGUCX}Jr3*iObLouB#XZU=pU&Cw zmuZLAlMaz>`Fqdv>MKl55iv?I*$lfb8J)mk;9Lw~LxkeFyEZu#S( zK)c0<;8S;Zv2RnH^jon{$>xis??XN#_U*rataeg4f6*%VL8bh$le^nD@)(tQe^1^X z^e+6f?c$XxMUVSecR6-{-E+Q8eyyXH){f*{lZtzHUfCGzknyQ;`{H!sQtmUCy5%x= z=SugxOyaro&c#bHdCQeuK^xzDYpl3b)SPQ{b=85H8nv^1dY(BgZe3BCx93fFMhWlz ztN^KSmq|g1ljXcUw>iakIBkFXif!(n2;Q^t_Q_YK7}(j@o9^m3e6jm+1lNru`Iq~H z+YdiTvglg8qFvf+)kV%Vx&0AuB7bDdu-YED&mmqD+!girU$D@jZjFw^cF*dk8a#dG zp`m}TIcQ14b8ky|x5681kA?mcHR@$O|6sC8DC;Ke42jl4lPaeRfovC#CT?wfe%+yH zlF^mT;q26J=ffTb&f@oKZ!lgUKF-{ z*_>qyrsbIQEdJ2?{NpMY)rTdCuijMsf3N$uVX_dLp_IWkJ^!tufei9{a?Vc1d)w`cv-dK|Jjlpj z`D#kwR+h}%nF&*p-8l8XaXessx}az8*<}kuX6_VOb3OjuhvtLVs`h_A)6wSS@oLWg zlDYOCfioJnwRfedMdkK|Ze=mIZW7Je$30Vi=lAf9$zC@nF3dmQB)=f)lCtj12T_-{ zTsyurVK-0DxphY)GxNHytiE=$bLIA|8us7D_qpHwxF=(IcrIIB|F)0Et==)eeN+f-X=vcGut`Hhb5W8d&+ji(Q66`T0?_{Fq; zUlz`Iwr+u}yK2@<#yXi;!M!=JR^9Pw+N&sKa4q%r1N*oe>yF*~WEVXzvDPOt`o>?G z<)wvJK5tE#cFFGQS!Y}G>4s*DcXgd_QuuJ!_K~^yk(UoQ$W8QK(XuG&#M#3FRlz&| zaINBR|5D$*S41`Bw$*>0+k2niTz>!ITzm1|Tc4kG*%lRW?T`8wZm)a3_DY}S&R_h| z|K!!%6uX^r>XW^{q*={QD5-3H7S1^<#&0rP*7l1}zf^s)npu0S?+|NBbkr8Uy^u_v zdeumBJ}{G)aDg&8Ba=O|2m^5Rli@kABDbD>#rY!>1H)EM1_m*tfzU0DAP#&eRIjW! zvm!S!FEcH*xCGsdjd9lUkAbTBf#wLKn4t=^HQG5p4>+J&5+71okXjt8SCN~8Za`=- zo5)n4#@#@S>Ih2~BuD5wdpP>JyZZRM>*c1v%m9tzf?6b}wwo4JnK3drCNMHcqd08+lYIesei6aCCsa5k)c5$QId1A5UjjzhGCrk_vbjgSivnpjICY zY-wEQjBEgW+&nWc8L9b);waeYJ8~NnH2Mw$zy$agtC{ezc=S+4uFFteXTrsV6mf9Z rVQHbFn~9utK(!zYY-tqZLpBq&P7Ls7Wdo_?0m4*ZGWsnD3~>ekY1?#% literal 0 HcmV?d00001 diff --git a/package.json b/package.json index ec8b5a9..1350ef4 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "mlir-tablegen", - "displayName": "MLIR TableGen", - "description": "Syntax highlighting for TableGen.", - "version": "0.0.2", + "name": "mlir-highlight", + "displayName": "MLIR highlight", + "description": "Syntax highlighting for MLIR.", + "version": "0.0.3", "publisher": "colin-liang", "engines": { "vscode": "^1.22.0" @@ -15,7 +15,8 @@ "mlir-tblgen", "tblgen", "llvm", - "tablegen" + "tablegen", + "mlir" ], "contributes": { "languages": [ @@ -41,6 +42,17 @@ ".td" ], "configuration": "./language-configuration.json" + }, + { + "id": "mlir", + "aliases": [ + "MLIR", + "mlir" + ], + "extensions": [ + ".mlir" + ], + "configuration": "./language-configuration.json" } ], "grammars": [ @@ -53,6 +65,11 @@ "language": "tablegen", "scopeName": "source.tablegen", "path": "./syntaxes/tablegen.tmLanguage" + }, + { + "language": "mlir", + "scopeName": "source.mlir", + "path": "./syntaxes/mlir.json" } ] }, diff --git a/syntaxes/mlir.json b/syntaxes/mlir.json new file mode 100644 index 0000000..e56b558 --- /dev/null +++ b/syntaxes/mlir.json @@ -0,0 +1,590 @@ +{ + "fileTypes": [ + "mlir" + ], + "repository": { + "attribute": { + "match": "\\W[\\w_][\\w\\d_.$]*\\s*=", + "name": "meta.attribute.mlir" + }, + "branch_target": { + "match": "\\^bb[\\w\\d_$\\.-]+", + "name": "entity.name.label.mlir" + }, + "comment": { + "match": "\/\/.*$", + "name": "comment.line.double-slash.mlir" + }, + "identifier": { + "match": "[\\%#@][\\w_][\\w\\d_.$]*", + "captures": { + "0": { + "name": "variable.mlir" + } + }, + "name": "meta.identifier.mlir" + }, + "numbers": { + "match": "(?<=\\W|e|E)(-)?([0-9]+)(((x|-)[0-9]+)*|\\.[0-9]+)(?=\\W|e|E)", + "name": "constant.numeric.mlir" + }, + "string": { + "end": "\"", + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.mlir" + } + }, + "patterns": [ + { + "match": "\\\\[nt\"]", + "name": "constant.character.escape.mlir" + }, + { + "match": "\\\\.", + "name": "invalid.illegal.mlir" + } + ], + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.mlir" + } + }, + "name": "string.quoted.double.mlir" + }, + "types": { + "match": "\\b(index|i[1-9][0-9]*|f16|bf16|f32|f64|u8|ui32|si32|memref|tensor|vector)\\b", + "captures": { + "1": { + "name": "storage.type.mlir" + } + }, + "name": "meta.types.simple.mlir" + }, + "memref-size": { + "match": "(?<=<)\\s*(((\\?|[1-9][0-9]*)\\s*x\\s*)*)(i[1-9][0-9]*|f16|bf16|f32|f64|u8|ui32|si32|!quant\\.uniform|vector|tensor|memref|!)\\b", + "captures":{ + "0":{ + "name": "storage.type.mlir.size" + }, + "1":{ + "name":"constant.numeric.size.mlir" + } + }, + "name": "meta.type.mlir.size" + }, + "affineOps": { + "match": "\\baffine\\.(for|apply|if|load|store|dma_start|dma_wait|min|max|parallel|prefetch)\\b", + "name": "entity.name.function.mlir.affineOps" + }, + "affineOpsP": { + "match": "(?<=\\W)\"affine\\.(for|apply|if|load|store|dma_start|dma_wait|min|max|parallel|prefetch)\"(?=\\W)", + "name": "entity.name.function.mlir.affineOpsP" + }, + "affineStructures": { + "match": "\\baffine_(map|set)\\b", + "name": "entity.name.function.mlir.affineStructures" + }, + "llvmType": { + "match": "(^!llvm|\\s!llvm)[\\.<]", + "captures": { + "1": { + "name": "variable.mlir" + } + }, + "name": "meta.types.llvm.mlir" + }, + "llvmFunc": { + "match": "\\bllvm\\.(?=func)", + "name": "keyword.function.llvm" + }, + "llvmReturn": { + "match": "\\bllvm\\.return\\b", + "name": "keyword.return.llvm" + }, + "llvmIntArith": { + "match": "\\bllvm\\.(add|sub|mul|udiv|sdiv|urem|srem)\\b", + "name": "entity.name.function.mlir.llvmIntArithm" + }, + "llvmFloatArith": { + "match": "\\bllvm\\.(fadd|fsub|fmul|fdiv|frem)\\b", + "name": "entity.name.function.mlir.llvmFloatArith" + }, + "llvmMemOp": { + "match": "\\bllvm\\.(alloca|getelementptr|load|store)\\b", + "name": "entity.name.function.mlir.llvmMemOp" + }, + "llvmAggregateOp": { + "match": "\\bllvm\\.(extractvalue|insertvalue)\\b", + "name": "entity.name.function.mlir.llvmAggregateOp" + }, + "llvmTerminatorOp": { + "match": "\\bllvm\\.(br|cond_br|call)\\b", + "name": "entity.name.function.mlir.llvmTerminatorOp" + }, + "llvmComparison": { + "match": "\\bllvm\\.(eq|ne|slt|sle|sgt|sge|ult|ule|ugt|uge|bitcast|select|icmp)\\b", + "name": "entity.name.function.mlir.llvmComparison" + }, + "llvmOps":{ + "match": "\\bllvm\\.(extractelement|insertelement|shufflevector)\\b", + "name":"entity.name.function.mlir.llvmOps" + }, + "llvmMLIR": { + "match": "\\b(llvm\\.mlir\\.)((addressof|constant|global|null|undef))", + "captures": { + "1": { + "name": "keyword.other.llvm" + }, + "2": { + "name": "entity.name.function.mlir.auxilary" + } + }, + "name": "meta.llvm.mlirAuxilary" + }, + "gpuFunc": { + "match": "\\bgpu\\.(?=func)", + "name": "keyword.function.mlir.gpu" + }, + "gpuReturn": { + "match": "\\bgpu\\.return\\b", + "name": "keyword.return.mlir.gpu" + }, + "gpuModules": { + "match": "\\bgpu\\.(module|container_module|kernel_module)\\b", + "name": "keyword.other.mlir.gpu-modules" + }, + "gpuKernel": { + "match": "\\bgpu\\.kernel\\b", + "name": "keyword.other.mlir.gpu-kernel" + }, + "gpuOpsP": { + "match": "(?<=\\W)\"gpu\\.(launch_func|thread_id|block_dim|block_id|grid_dim|all_reduce|yield|shuffle|barrier)\"(?=\\W)", + "name": "entity.name.function.mlir.gpuOpsP" + }, + "gpuOps":{ + "match": "\\bgpu\\.(launch_func|thread_id|block_dim|block_id|grid_dim|all_reduce|yield|shuffle|barrier)\\b", + "name": "entity.name.function.mlir.gpuOpsP" + }, + "gpuLaunchAndTerminator": { + "match": "\\bgpu\\.(launch|terminator)\\b", + "name": "keyword.other.mlir.gpu-launchAndTerminator" + }, + "gpuTestPromoteWorkgroup": { + "match": "\\bgpu\\.test_promote_workgroup\\b", + "name": "keyword.other.mlir.gpu-testPromoteWorkgroup" + }, + "nvvmID": { + "match": "\\bnvvm\\.read\\.ptx\\.sreg\\.(tid|ntid|ctaid|nctaid)\\.(x|y|z)\\b", + "name": "entity.name.function.mlir.nvvm-id" + }, + "nvvmLaneId": { + "match": "\\bnvvm\\.read\\.ptx\\.sreg\\.laneid\\b", + "name": "entity.name.function.mlir.nvvm-laneid" + }, + "nvvmBarrier0": { + "match": "\\bnvvm\\.barrier0\\b", + "name": "entity.name.function.mlir.nvvm-barrier0" + }, + "nvvmMma": { + "match": "\\bnvvm\\.mma\\.sync\\b", + "name": "entity.name.function.mlir.nvvm-mma" + }, + "nvvmShflBfly": { + "match": "\\bnvvm\\.shfl\\.sync\\.bfly\\b", + "name": "entity.name.function.mlir.nvvm-shflbfly" + }, + "nvvmVoteBallot": { + "match": "\\bnvvm\\.vote\\.ballot\\.sync\\b", + "name": "entity.name.function.mlir.nvvm-voteballot" + }, + "nvvmWarpSize": { + "match": "\\bnvvm\\.read\\.ptx\\.sreg\\.warpsize\\b", + "name": "entity.name.function.mlir.warpsize" + }, + "tflMath": { + "match": "(?<=\\W)\"tfl\\.(abs|add_n|add|cos|div|exp|floor_div|floor_mod|floor|log|log_softmax|mul|pow|round|rsqrt|sin|softmax|sqrt|square|squared_difference|sub|sum|tanh)\"(?=\\W)", + "name": "entity.name.function.mlir.tfl_math" + }, + "tflLogic":{ + "match": "(?<=\\W)\"tfl\\.(equal|greater_equal|greater|less_equal|less|logical_and|logical_not|logical_or|neg|not_equal|select|select_v2|where)\"(?=\\W)", + "name": "entity.name.function.mlir.tflLogic" + }, + "tflStats": { + "match": "(?<=\\W)\"tfl\\.(arg_max|arg_min|average_pool_2d|max_pool_2d|max_pooling_with_argmax_2d|max_unpooling_2d|maximum|mean|minimum|non_max_suppression_(v4|v5))\"(?=\\W)", + "name": "entity.name.function.mlir.tflStats" + }, + "tflConv": { + "match": "(?<=\\W)\"tfl\\.(conv_2d|convolution_2d_transpose_bias|depthwise_conv_2d|transpose_conv)\"(?=\\W)", + "name": "entity.name.function.mlir.tflConv" + }, + "tflLSTM": { + "match": "(?<=\\W)\"tfl\\.(basic_lstm|lstm|unidirectional_sequence_lstm)\"(?=\\W)", + "name": "entity.name.function.mlir.tflLSTM" + }, + "tflPseudo": { + "match": "(?<=\\W)\"tfl\\.(pseudo_const|pseudo_qconst|pseudo_sparse_const|pseudo_sparse_qconst)\"(?=\\W)", + "name": "entity.name.function.mlir.tflPseudo" + }, + "tflTransformations": { + "match": "(?<=\\W)\"tfl\\.(batch_to_space_nd|depth_to_space|expand_dims|resize_bilinear|resize_nearest_neighbor|space_to_batch_nd|space_to_depth|sparse_to_dense)\"(?=\\W)", + "name": "entity.name.function.mlir.tflReshaping" + }, + "tflRELU": { + "match": "(?<=\\W)\"tfl\\.(elu|leaky_relu|prelu|relu_n1_to_1|relu6|relu)\"(?=\\W)", + "name": "entity.name.function.mlir.tflRELU" + }, + "tflMatrix": { + "match": "(?<=\\W)\"tfl\\.(matrix_diag|matrix_set_diag|mirror_pad|pad|padv2|rank|transpose)\"(?=\\W)", + "name": "entity.name.function.mlir.tflMatrix" + }, + "tflOps": { + "match": "(?<=\\W)\"tfl\\.(cast|ceil|concatenation|densify|dequantize|fill|gather_nd|gather|logistic|pack|quantize|range|reshape|svdf|shape|slice|split|split_v|squeeze|tile|unique|unpack|while|yield)\"(?=\\W)", + "name": "entity.name.function.mlir.tflOps" + }, + "tflLongOps": { + "match": "(?<=\\W)\"tfl\\.(embedding_lookup|external_const|fake_quant|fully_connected|hard_swish|NumericVerify|one_hot|segment_sum|strided_slice|topk_v2|zeros_like)\"(<=\\W)", + "name": "entity.name.function.mlir.tflLongOps" + }, + "tflNormalization": { + "match": "(?<=\\W)\"tfl\\.(l2_normalization|local_response_normalization)\"(?=\\W)", + "name": "entity.name.function.mlir.tflNormalization" + }, + "tflReduce": { + "match": "(?<=\\W)\"tfl\\.(reduce_any|reduce_max|reduce_min|reduce_prod)\"(?=\\W)", + "name": "entity.name.function.mlir.tflReduce" + }, + "tflSequence": { + "match": "(?<=\\W)\"tfl\\.(reverse_sequence|reverse_v2|unidirectional_sequence_rnn)\"(?=\\W)", + "name": "entity.name.function.mlir.tflSequence" + }, + "vectorOps":{ + "match": "\\Wvector\\.(broadcast|contract|vectorfma|print|constant_mask|create_mask|shuffle|matrix_multiply|outerproduct|reduction|strided_slice|transpose|type_cast)\\b", + "name":"entity.name.function.mlir.vectorOps" + }, + "vectorExtract":{ + "match" : "\\Wvector\\.(extract|extractelement|extract_slices)\\b", + "name": "entity.name.function.mlir.vectorExtract" + }, + "vectorInsert":{ + "match" : "\\Wvector\\.(insert|insertelement|insert_slices|insert_strided_slice)\\b", + "name" : "entity.name.function.mlir.vectorInsert" + }, + "vectorReshape":{ + "match" : "\\Wvector\\.(reshape|shape_cast)\\b", + "name": "entity.name.function.mlir.vectorReshape" + }, + "vectorTransfer":{ + "match" : "\\Wvector\\.transfer_(read|write)\\b", + "name" : "entity.name.function.mlir.vectorTransfer" + }, + "vectorTuple":{ + "match" : "\\Wvector\\.(tuple|tuple_get)\\b", + "name" : "entity.name.function.mlir.vectorTuple" + }, + "loopOps":{ + "match" : "\\bloop\\.(for|if|parallel|reduce|yield)\\b", + "name": "entity.name.function.mlir.loopOps" + }, + "tileFunctions":{ + "match" : "\\btile\\.(constant|contract|index|reshape)\\b", + "name": "entity.name.function.mlir.tileFunctions" + }, + "tileQuotedFunctions":{ + "match" : "(?<=\\W)\"tile\\.(constant|contract|index|reshape)\"(?=\\W)", + "name": "entity.name.function.mlir.tileFunctions" + }, + "tileKeywords": { + "match": "\\btile\\.(name)\\b", + "name": "keyword.other.mlir.tileKeywords" + }, + "eltwiseFunctions":{ + "match" : "(?<=\\W)\"eltwise\\.(add|div|sconst|cmp_lt|select|sub|exp|cast|neg|mul|sqrt|ident)\"(?=\\W)", + "name": "entity.name.function.mlir.tileFunctions" + }, + "CHECK": { + "match": "(\/\/)\\s*(CHECK\\s*:|CHECK-\\w+\\s*:)(.*)$", + "captures": { + "1": { + "name": "comment.line.double-slash.mlir" + }, + "2": { + "name": "comment.other.CHECK.mlir" + }, + "3": { + "patterns": [ + { + "include": "#CHECK-CODE" + } + ] + }, + "name": "comment.other.CHECK.mlir" + } + }, + "CHECK-CODE": { + "match": "([^0-9a-zA-Z%\"@]*)?([0-9a-zA-Z\"\\.%_\\-@]*)([^0-9a-zA-Z\"\\.%_\\-].*)?$", + "captures": { + "1": { + "name": "comment.line.double-slash.mlir" + }, + "2": { + "patterns": [ + { + "include": "$self" + }, + { + "match": "(\\b|x)(index|i[1-9][0-9]*|f16|bf16|f32|f64|u8|memref|tensor|vector|func)\\b", + "captures": { + "1": { + "name": "comment.line.double-slash.mlir" + }, + "2": { + "name": "storage.type.mlir" + } + } + }, + { + "match": "\\b([0-9]+)(x.*)?", + "captures": { + "1": { + "name": "constant.numeric.mlir" + }, + "2": { + "patterns": [ + { + "include": "$self" + } + ] + } + } + }, + { + "match": "(.*)", + "name": "comment.line.double-slash.mlir" + } + ] + }, + "3": { + "patterns": [ + { + "include": "#CHECK-CODE" + } + ] + } + } + } + }, + "patterns": [ + { + "match": "\\b(func)\\b\\s*(@[\\w_][\\w\\d_.$]*)", + "captures": { + "1": { + "name": "keyword.function.mlir" + }, + "2": { + "name": "entity.name.function.mlir" + } + }, + "name": "support.function.mlir" + }, + { + "match": "\\b(attributes|br|call|constant|loc|return)\\b", + "name": "keyword.module.mlir" + }, + { + "include": "#identifier" + }, + { + "include": "#branch_target" + }, + { + "include": "#attribute" + }, + { + "include": "#memref-size" + }, + { + "include": "#numbers" + }, + { + "include": "#affineOps" + }, + { + "include": "#affineOpsP" + }, + { + "include": "#affineStructures" + }, + { + "include": "#else" + }, + { + "include": "#CHECK" + }, + { + "include": "#llvmType" + }, + { + "include": "#llvmFunc" + }, + { + "include": "#llvmReturn" + }, + { + "include": "#llvmIntArith" + }, + { + "include": "#llvmFloatArith" + }, + { + "include": "#llvmMemOp" + }, + { + "include": "#llvmAggregateOp" + }, + { + "include": "#llvmTerminatorOp" + }, + { + "include": "#llvmComparison" + }, + { + "include": "#llvmMLIR" + }, + { + "include": "#llvmOps" + }, + { + "include": "#gpuFunc" + }, + { + "include": "#gpuReturn" + }, + { + "include": "#gpuModules" + }, + { + "include": "#gpuKernel" + }, + { + "include": "#gpuOpsP" + }, + { + "include": "#gpuOps" + }, + { + "include": "#gpuLaunchAndTerminator" + }, + { + "include": "#gpuTestPromoteWorkgroup" + }, + { + "include": "#nvvmID" + }, + { + "include": "#nvvmLaneId" + }, + { + "include": "#nvvmBarrier0" + }, + { + "include": "#nvvmMma" + }, + { + "include": "#nvvmShflBfly" + }, + { + "include": "#nvvmVoteBallot" + }, + { + "include": "#nvvmWarpSize" + }, + { + "include": "#tileFunctions" + }, + { + "include": "#tileQuotedFunctions" + }, + { + "include": "#tileKeywords" + }, + { + "include": "#eltwiseFunctions" + }, + { + "include": "#tflMath" + }, + { + "include": "#tflLogic" + }, + { + "include": "#tflStats" + }, + { + "include": "#tflConv" + }, + { + "include": "#tflLSTM" + }, + { + "include": "#tflPseudo" + }, + { + "include": "#tflTransformations" + }, + { + "include": "#tflRELU" + }, + { + "include": "#tflMatrix" + }, + { + "include": "#tflOps" + }, + { + "include": "#tflLongOps" + }, + { + "include": "#tflNormalization" + }, + { + "include": "#tflReduce" + }, + { + "include": "#tflSequence" + }, + { + "include": "#vectorOps" + }, + { + "include": "#vectorExtract" + }, + { + "include":"#vectorInsert" + }, + { + "include":"#vectorReshape" + }, + { + "include":"#vectorTransfer" + }, + { + "include": "#vectorTuple" + }, + { + "include": "#loopOps" + }, + { + "include": "#comment" + }, + { + "include": "#types" + }, + { + "include": "#string" + } + ], + "name": "MLIR", + "scopeName": "source.mlir" +} \ No newline at end of file diff --git a/test/a.mlir b/test/a.mlir new file mode 100644 index 0000000..0ad94ea --- /dev/null +++ b/test/a.mlir @@ -0,0 +1,21 @@ + + +module { + func @multiply_transpose(%arg0: tensor<*xf64>, %arg1: tensor<*xf64>) -> tensor<*xf64> { + %0 = toy.transpose(%arg0 : tensor<*xf64>) to tensor<*xf64> + %1 = toy.transpose(%arg1 : tensor<*xf64>) to tensor<*xf64> + %2 = toy.mul %0, %1 : tensor<*xf64> + toy.return %2 : tensor<*xf64> + } + func @main() { + %0 = toy.constant dense<[[1.000000e+00, 2.000000e+00, 3.000000e+00], [4.000000e+00, 5.000000e+00, 6.000000e+00]]> : tensor<2x3xf64> + %1 = toy.constant dense<[1.000000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00, 5.000000e+00, 6.000000e+00]> : tensor<6xf64> + %2 = toy.reshape(%1 : tensor<6xf64>) to tensor<2x3xf64> + %3 = toy.generic_call @multiply_transpose(%0, %2) : (tensor<2x3xf64>, tensor<2x3xf64>) -> tensor<*xf64> + %4 = toy.generic_call @multiply_transpose(%2, %0) : (tensor<2x3xf64>, tensor<2x3xf64>) -> tensor<*xf64> + %5 = toy.generic_call @multiply_transpose(%2, %3) : (tensor<2x3xf64>, tensor<*xf64>) -> tensor<*xf64> + %6 = toy.transpose(%0 : tensor<2x3xf64>) to tensor<*xf64> + %7 = toy.generic_call @multiply_transpose(%6, %3) : (tensor<*xf64>, tensor<*xf64>) -> tensor<*xf64> + toy.return + } +} \ No newline at end of file diff --git a/test/b.td b/test/b.td new file mode 100644 index 0000000..4a56edb --- /dev/null +++ b/test/b.td @@ -0,0 +1,251 @@ +//===- Ops.td - Toy dialect operation definitions ----------*- tablegen -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Defines the operations of the Toy dialect. +// +//===----------------------------------------------------------------------===// + +#ifndef TOY_OPS +#define TOY_OPS + +include "mlir/IR/OpBase.td" +include "mlir/Interfaces/SideEffectInterfaces.td" + +// Provide a definition of the 'toy' dialect in the ODS framework so that we +// can define our operations. +def Toy_Dialect : Dialect { + let name = "toy"; + let cppNamespace = "toy"; +} + +// Base class for toy dialect operations. This operation inherits from the base +// `Op` class in OpBase.td, and provides: +// * The parent dialect of the operation. +// * The mnemonic for the operation, or the name without the dialect prefix. +// * A list of traits for the operation. +class Toy_Op traits = []> : + Op; + +//===----------------------------------------------------------------------===// +// Toy Operations +//===----------------------------------------------------------------------===// + +// We define a toy operation by inheriting from our base 'Toy_Op' class above. +// Here we provide the mnemonic and a list of traits for the operation. The +// constant operation is marked as 'NoSideEffect' as it is a pure operation +// and may be removed if dead. +def ConstantOp : Toy_Op<"constant", [NoSideEffect]> { + // Provide a summary and description for this operation. This can be used to + // auto-generate documentation of the operations within our dialect. + let summary = "constant"; + let description = [{ + Constant operation turns a literal into an SSA value. The data is attached + to the operation as an attribute. For example: + + ```mlir + %0 = toy.constant dense<[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]> + : tensor<2x3xf64> + ``` + }]; + + // The constant operation takes an attribute as the only input. + let arguments = (ins F64ElementsAttr:$value); + + // The constant operation returns a single value of TensorType. + let results = (outs F64Tensor); + + // Specify a parser and printer method. + let parser = [{ return ::parseConstantOp(parser, result); }]; + let printer = [{ return ::print(p, *this); }]; + + // Add custom build methods for the constant operation. These method populates + // the `state` that MLIR uses to create operations, i.e. these are used when + // using `builder.create(...)`. + let builders = [ + // Build a constant with a given constant tensor value. + OpBuilder<"OpBuilder &builder, OperationState &state, " + "DenseElementsAttr value", [{ + build(builder, state, value.getType(), value); + }]>, + + // Build a constant with a given constant floating-point value. + OpBuilder<"OpBuilder &builder, OperationState &state, double value"> + ]; + + // Invoke a static verify method to verify this constant operation. + let verifier = [{ return ::verify(*this); }]; +} + +def AddOp : Toy_Op<"add"> { + let summary = "element-wise addition operation"; + let description = [{ + The "add" operation performs element-wise addition between two tensors. + The shapes of the tensor operands are expected to match. + }]; + + let arguments = (ins F64Tensor:$lhs, F64Tensor:$rhs); + let results = (outs F64Tensor); + + // Specify a parser and printer method. + let parser = [{ return ::parseBinaryOp(parser, result); }]; + let printer = [{ return ::printBinaryOp(p, *this); }]; + + // Allow building an AddOp with from the two input operands. + let builders = [ + OpBuilder<"OpBuilder &b, OperationState &state, Value lhs, Value rhs"> + ]; +} + +def GenericCallOp : Toy_Op<"generic_call"> { + let summary = "generic call operation"; + let description = [{ + Generic calls represent calls to a user defined function that needs to + be specialized for the shape of its arguments. The callee name is attached + as a symbol reference via an attribute. The arguments list must match the + arguments expected by the callee. For example: + + ```mlir + %4 = toy.generic_call @my_func(%1, %3) + : (tensor<2x3xf64>, tensor<2x3xf64>) -> tensor<*xf64> + ``` + + This is only valid if a function named "my_func" exists and takes two + arguments. + }]; + + // The generic call operation takes a symbol reference attribute as the + // callee, and inputs for the call. + let arguments = (ins FlatSymbolRefAttr:$callee, Variadic:$inputs); + + // The generic call operation returns a single value of TensorType. + let results = (outs F64Tensor); + + // Specialize assembly printing and parsing using a declarative format. + let assemblyFormat = [{ + $callee `(` $inputs `)` attr-dict `:` functional-type($inputs, results) + }]; + + // Add custom build methods for the generic call operation. + let builders = [ + OpBuilder<"OpBuilder &builder, OperationState &state, " + "StringRef callee, ArrayRef arguments"> + ]; +} + +def MulOp : Toy_Op<"mul"> { + let summary = "element-wise multiplication operation"; + let description = [{ + The "mul" operation performs element-wise multiplication between two + tensors. The shapes of the tensor operands are expected to match. + }]; + + let arguments = (ins F64Tensor:$lhs, F64Tensor:$rhs); + let results = (outs F64Tensor); + + // Specify a parser and printer method. + let parser = [{ return ::parseBinaryOp(parser, result); }]; + let printer = [{ return ::printBinaryOp(p, *this); }]; + + // Allow building a MulOp with from the two input operands. + let builders = [ + OpBuilder<"OpBuilder &b, OperationState &state, Value lhs, Value rhs"> + ]; +} + +def PrintOp : Toy_Op<"print"> { + let summary = "print operation"; + let description = [{ + The "print" builtin operation prints a given input tensor, and produces + no results. + }]; + + // The print operation takes an input tensor to print. + let arguments = (ins F64Tensor:$input); + + let assemblyFormat = "$input attr-dict `:` type($input)"; +} + +def ReshapeOp : Toy_Op<"reshape"> { + let summary = "tensor reshape operation"; + let description = [{ + Reshape operation is transforming its input tensor into a new tensor with + the same number of elements but different shapes. For example: + + ```mlir + %0 = toy.reshape (%arg1 : tensor<10xf64>) to tensor<5x2xf64> + ``` + }]; + + let arguments = (ins F64Tensor:$input); + + // We expect that the reshape operation returns a statically shaped tensor. + let results = (outs StaticShapeTensorOf<[F64]>); + + let assemblyFormat = [{ + `(` $input `:` type($input) `)` attr-dict `to` type(results) + }]; +} + +def ReturnOp : Toy_Op<"return", [NoSideEffect, HasParent<"FuncOp">, + Terminator]> { + let summary = "return operation"; + let description = [{ + The "return" operation represents a return operation within a function. + The operation takes an optional tensor operand and produces no results. + The operand type must match the signature of the function that contains + the operation. For example: + + ```mlir + func @foo() -> tensor<2xf64> { + ... + toy.return %0 : tensor<2xf64> + } + ``` + }]; + + // The return operation takes an optional input operand to return. This + // value must match the return type of the enclosing function. + let arguments = (ins Variadic:$input); + + // The return operation only emits the input in the format if it is present. + let assemblyFormat = "($input^ `:` type($input))? attr-dict "; + + // Allow building a ReturnOp with no return operand. + let builders = [OpBuilder< + "OpBuilder &b, OperationState &state", [{ build(b, state, llvm::None); }] + >]; + + // Provide extra utility definitions on the c++ operation class definition. + let extraClassDeclaration = [{ + bool hasOperand() { return getNumOperands() != 0; } + }]; + + // Invoke a static verify method to verify this return operation. + let verifier = [{ return ::verify(*this); }]; +} + +def TransposeOp : Toy_Op<"transpose"> { + let summary = "transpose operation"; + + let arguments = (ins F64Tensor:$input); + let results = (outs F64Tensor); + + let assemblyFormat = [{ + `(` $input `:` type($input) `)` attr-dict `to` type(results) + }]; + + // Allow building a TransposeOp with from the input operand. + let builders = [ + OpBuilder<"OpBuilder &b, OperationState &state, Value input"> + ]; + + // Invoke a static verify method to verify this transpose operation. + let verifier = [{ return ::verify(*this); }]; +} + +#endif // TOY_OPS diff --git a/test/c.cpp.inc b/test/c.cpp.inc new file mode 100644 index 0000000..62b0e6e --- /dev/null +++ b/test/c.cpp.inc @@ -0,0 +1,1279 @@ +/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ +|* *| +|* Op Definitions *| +|* *| +|* Automatically generated file, do not edit! *| +|* *| +\*===----------------------------------------------------------------------===*/ + +#ifdef GET_OP_LIST +#undef GET_OP_LIST + +toy::AddOp, +toy::ConstantOp, +toy::GenericCallOp, +toy::MulOp, +toy::PrintOp, +toy::ReshapeOp, +toy::ReturnOp, +toy::TransposeOp +#endif // GET_OP_LIST + +#ifdef GET_OP_CLASSES +#undef GET_OP_CLASSES + + +//===----------------------------------------------------------------------===// +// toy::AddOp definitions +//===----------------------------------------------------------------------===// + +AddOpAdaptor::AddOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs ) : odsOperands(values), odsAttrs(attrs) { + +} + +AddOpAdaptor::AddOpAdaptor(AddOp& op) : odsOperands(op.getOperation()->getOperands()), odsAttrs(op.getOperation()->getAttrDictionary()) { + +} + +std::pair AddOpAdaptor::getODSOperandIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::ValueRange AddOpAdaptor::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(odsOperands.begin(), valueRange.first), + std::next(odsOperands.begin(), valueRange.first + valueRange.second)}; +} + +::mlir::Value AddOpAdaptor::lhs() { + return *getODSOperands(0).begin(); +} + +::mlir::Value AddOpAdaptor::rhs() { + return *getODSOperands(1).begin(); +} + +::mlir::LogicalResult AddOpAdaptor::verify(::mlir::Location loc) { + return success(); +} + +::llvm::StringRef AddOp::getOperationName() { + return "toy.add"; +} + +std::pair AddOp::getODSOperandIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::operand_range AddOp::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(getOperation()->operand_begin(), valueRange.first), + std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)}; +} + +::mlir::Value AddOp::lhs() { + return *getODSOperands(0).begin(); +} + +::mlir::Value AddOp::rhs() { + return *getODSOperands(1).begin(); +} + +::mlir::MutableOperandRange AddOp::lhsMutable() { + auto range = getODSOperandIndexAndLength(0); + return ::mlir::MutableOperandRange(getOperation(), range.first, range.second); +} + +::mlir::MutableOperandRange AddOp::rhsMutable() { + auto range = getODSOperandIndexAndLength(1); + return ::mlir::MutableOperandRange(getOperation(), range.first, range.second); +} + +std::pair AddOp::getODSResultIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::result_range AddOp::getODSResults(unsigned index) { + auto valueRange = getODSResultIndexAndLength(index); + return {std::next(getOperation()->result_begin(), valueRange.first), + std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)}; +} + + + +void AddOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::Value lhs, ::mlir::Value rhs) { + odsState.addOperands(lhs); + odsState.addOperands(rhs); + odsState.addTypes(resultType0); +} + +void AddOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::Value lhs, ::mlir::Value rhs) { + odsState.addOperands(lhs); + odsState.addOperands(rhs); + assert(resultTypes.size() == 1u && "mismatched number of results"); + odsState.addTypes(resultTypes); +} + +void AddOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes ) { + assert(operands.size() == 2u && "mismatched number of parameters"); + odsState.addOperands(operands); + odsState.addAttributes(attributes); + assert(resultTypes.size() == 1u && "mismatched number of return types"); + odsState.addTypes(resultTypes); +} + +::mlir::ParseResult AddOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { + return ::parseBinaryOp(parser, result); +} + +void AddOp::print(::mlir::OpAsmPrinter &p) { + return ::printBinaryOp(p, *this); +} + +::mlir::LogicalResult AddOp::verify() { + if (failed(AddOpAdaptor(*this).verify(this->getLoc()))) return failure(); + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSOperands(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("operand #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + auto valueGroup1 = getODSOperands(1); + for (::mlir::Value v : valueGroup1) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("operand #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSResults(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("result #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + return ::mlir::success(); +} + + +//===----------------------------------------------------------------------===// +// toy::ConstantOp definitions +//===----------------------------------------------------------------------===// + +ConstantOpAdaptor::ConstantOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs ) : odsOperands(values), odsAttrs(attrs) { + +} + +ConstantOpAdaptor::ConstantOpAdaptor(ConstantOp& op) : odsOperands(op.getOperation()->getOperands()), odsAttrs(op.getOperation()->getAttrDictionary()) { + +} + +std::pair ConstantOpAdaptor::getODSOperandIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::ValueRange ConstantOpAdaptor::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(odsOperands.begin(), valueRange.first), + std::next(odsOperands.begin(), valueRange.first + valueRange.second)}; +} + +::mlir::DenseElementsAttr ConstantOpAdaptor::value() { + assert(odsAttrs && "no attributes when constructing adapter"); + ::mlir::DenseElementsAttr attr = odsAttrs.get("value").cast<::mlir::DenseElementsAttr>(); + return attr; +} + +::mlir::LogicalResult ConstantOpAdaptor::verify(::mlir::Location loc) { + { + auto tblgen_value = odsAttrs.get("value"); + if (!tblgen_value) return emitError(loc, "'toy.constant' op ""requires attribute 'value'"); + if (!((tblgen_value.isa<::mlir::DenseFPElementsAttr>() &&tblgen_value.cast<::mlir::DenseElementsAttr>().getType().getElementType().isF64()))) return emitError(loc, "'toy.constant' op ""attribute 'value' failed to satisfy constraint: 64-bit float elements attribute"); + } + return success(); +} + +::llvm::StringRef ConstantOp::getOperationName() { + return "toy.constant"; +} + +std::pair ConstantOp::getODSOperandIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::operand_range ConstantOp::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(getOperation()->operand_begin(), valueRange.first), + std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)}; +} + +std::pair ConstantOp::getODSResultIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::result_range ConstantOp::getODSResults(unsigned index) { + auto valueRange = getODSResultIndexAndLength(index); + return {std::next(getOperation()->result_begin(), valueRange.first), + std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)}; +} + +::mlir::DenseElementsAttr ConstantOp::valueAttr() { + return this->getAttr("value").cast<::mlir::DenseElementsAttr>(); +} + +::mlir::DenseElementsAttr ConstantOp::value() { + auto attr = valueAttr(); + return attr; +} + +void ConstantOp::valueAttr(::mlir::DenseElementsAttr attr) { + this->getOperation()->setAttr("value", attr); +} + +void ConstantOp::build(OpBuilder &builder, OperationState &state, DenseElementsAttr value) { + build(builder, state, value.getType(), value); + +} + + + +void ConstantOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::DenseElementsAttr value) { + odsState.addAttribute("value", value); + odsState.addTypes(resultType0); +} + +void ConstantOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::DenseElementsAttr value) { + odsState.addAttribute("value", value); + assert(resultTypes.size() == 1u && "mismatched number of results"); + odsState.addTypes(resultTypes); +} + +void ConstantOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes ) { + assert(operands.size() == 0u && "mismatched number of parameters"); + odsState.addOperands(operands); + odsState.addAttributes(attributes); + assert(resultTypes.size() == 1u && "mismatched number of return types"); + odsState.addTypes(resultTypes); +} + +::mlir::ParseResult ConstantOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { + return ::parseConstantOp(parser, result); +} + +void ConstantOp::print(::mlir::OpAsmPrinter &p) { + return ::print(p, *this); +} + +::mlir::LogicalResult ConstantOp::verify() { + if (failed(ConstantOpAdaptor(*this).verify(this->getLoc()))) return failure(); + { + unsigned index = 0; (void)index; + } + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSResults(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("result #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + return ::verify(*this); +} + +void ConstantOp::getEffects(::mlir::SmallVectorImpl<::mlir::SideEffects::EffectInstance> &effects) { + +} + + +//===----------------------------------------------------------------------===// +// toy::GenericCallOp definitions +//===----------------------------------------------------------------------===// + +GenericCallOpAdaptor::GenericCallOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs ) : odsOperands(values), odsAttrs(attrs) { + +} + +GenericCallOpAdaptor::GenericCallOpAdaptor(GenericCallOp& op) : odsOperands(op.getOperation()->getOperands()), odsAttrs(op.getOperation()->getAttrDictionary()) { + +} + +std::pair GenericCallOpAdaptor::getODSOperandIndexAndLength(unsigned index) { + bool isVariadic[] = {true}; + int prevVariadicCount = 0; + for (unsigned i = 0; i < index; ++i) + if (isVariadic[i]) ++prevVariadicCount; + + // Calculate how many dynamic values a static variadic operand corresponds to. + // This assumes all static variadic operands have the same dynamic value count. + int variadicSize = (odsOperands.size() - 0) / 1; + // `index` passed in as the parameter is the static index which counts each + // operand (variadic or not) as size 1. So here for each previous static variadic + // operand, we need to offset by (variadicSize - 1) to get where the dynamic + // value pack for this static operand starts. + int start = index + (variadicSize - 1) * prevVariadicCount; + int size = isVariadic[index] ? variadicSize : 1; + return {start, size}; +} + +::mlir::ValueRange GenericCallOpAdaptor::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(odsOperands.begin(), valueRange.first), + std::next(odsOperands.begin(), valueRange.first + valueRange.second)}; +} + +::mlir::ValueRange GenericCallOpAdaptor::inputs() { + return getODSOperands(0); +} + +::mlir::FlatSymbolRefAttr GenericCallOpAdaptor::callee() { + assert(odsAttrs && "no attributes when constructing adapter"); + ::mlir::FlatSymbolRefAttr attr = odsAttrs.get("callee").cast<::mlir::FlatSymbolRefAttr>(); + return attr; +} + +::mlir::LogicalResult GenericCallOpAdaptor::verify(::mlir::Location loc) { + { + auto tblgen_callee = odsAttrs.get("callee"); + if (!tblgen_callee) return emitError(loc, "'toy.generic_call' op ""requires attribute 'callee'"); + if (!((tblgen_callee.isa<::mlir::FlatSymbolRefAttr>()))) return emitError(loc, "'toy.generic_call' op ""attribute 'callee' failed to satisfy constraint: flat symbol reference attribute"); + } + return success(); +} + +::llvm::StringRef GenericCallOp::getOperationName() { + return "toy.generic_call"; +} + +std::pair GenericCallOp::getODSOperandIndexAndLength(unsigned index) { + bool isVariadic[] = {true}; + int prevVariadicCount = 0; + for (unsigned i = 0; i < index; ++i) + if (isVariadic[i]) ++prevVariadicCount; + + // Calculate how many dynamic values a static variadic operand corresponds to. + // This assumes all static variadic operands have the same dynamic value count. + int variadicSize = (getOperation()->getNumOperands() - 0) / 1; + // `index` passed in as the parameter is the static index which counts each + // operand (variadic or not) as size 1. So here for each previous static variadic + // operand, we need to offset by (variadicSize - 1) to get where the dynamic + // value pack for this static operand starts. + int start = index + (variadicSize - 1) * prevVariadicCount; + int size = isVariadic[index] ? variadicSize : 1; + return {start, size}; +} + +::mlir::Operation::operand_range GenericCallOp::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(getOperation()->operand_begin(), valueRange.first), + std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)}; +} + +::mlir::Operation::operand_range GenericCallOp::inputs() { + return getODSOperands(0); +} + +::mlir::MutableOperandRange GenericCallOp::inputsMutable() { + auto range = getODSOperandIndexAndLength(0); + return ::mlir::MutableOperandRange(getOperation(), range.first, range.second); +} + +std::pair GenericCallOp::getODSResultIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::result_range GenericCallOp::getODSResults(unsigned index) { + auto valueRange = getODSResultIndexAndLength(index); + return {std::next(getOperation()->result_begin(), valueRange.first), + std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)}; +} + +::mlir::FlatSymbolRefAttr GenericCallOp::calleeAttr() { + return this->getAttr("callee").cast<::mlir::FlatSymbolRefAttr>(); +} + +::llvm::StringRef GenericCallOp::callee() { + auto attr = calleeAttr(); + return attr.getValue(); +} + +void GenericCallOp::calleeAttr(::mlir::FlatSymbolRefAttr attr) { + this->getOperation()->setAttr("callee", attr); +} + + + +void GenericCallOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::FlatSymbolRefAttr callee, ::mlir::ValueRange inputs) { + odsState.addOperands(inputs); + odsState.addAttribute("callee", callee); + odsState.addTypes(resultType0); +} + +void GenericCallOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::FlatSymbolRefAttr callee, ::mlir::ValueRange inputs) { + odsState.addOperands(inputs); + odsState.addAttribute("callee", callee); + assert(resultTypes.size() == 1u && "mismatched number of results"); + odsState.addTypes(resultTypes); +} + +void GenericCallOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::llvm::StringRef callee, ::mlir::ValueRange inputs) { + odsState.addOperands(inputs); + odsState.addAttribute("callee", odsBuilder.getSymbolRefAttr(callee)); + odsState.addTypes(resultType0); +} + +void GenericCallOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::llvm::StringRef callee, ::mlir::ValueRange inputs) { + odsState.addOperands(inputs); + odsState.addAttribute("callee", odsBuilder.getSymbolRefAttr(callee)); + assert(resultTypes.size() == 1u && "mismatched number of results"); + odsState.addTypes(resultTypes); +} + +void GenericCallOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes ) { + odsState.addOperands(operands); + odsState.addAttributes(attributes); + assert(resultTypes.size() == 1u && "mismatched number of return types"); + odsState.addTypes(resultTypes); +} + +::mlir::LogicalResult GenericCallOp::verify() { + if (failed(GenericCallOpAdaptor(*this).verify(this->getLoc()))) return failure(); + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSOperands(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("operand #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSResults(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("result #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + return ::mlir::success(); +} + +::mlir::ParseResult GenericCallOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { + ::mlir::SmallVector<::mlir::OpAsmParser::OperandType, 4> inputsOperands; + ::llvm::SMLoc inputsOperandsLoc = parser.getCurrentLocation(); + (void)inputsOperandsLoc; + ::llvm::ArrayRef<::mlir::Type> inputsTypes; + ::llvm::ArrayRef<::mlir::Type> allResultTypes; + + ::mlir::FlatSymbolRefAttr calleeAttr; + if (parser.parseAttribute(calleeAttr, parser.getBuilder().getType<::mlir::NoneType>(), "callee", result.attributes)) + return failure(); + if (parser.parseLParen()) + return failure(); + + if (parser.parseOperandList(inputsOperands)) + return failure(); + if (parser.parseRParen()) + return failure(); + if (parser.parseOptionalAttrDict(result.attributes)) + return failure(); + if (parser.parseColon()) + return failure(); + + ::mlir::FunctionType inputs__allResult_functionType; + if (parser.parseType(inputs__allResult_functionType)) + return failure(); + inputsTypes = inputs__allResult_functionType.getInputs(); + allResultTypes = inputs__allResult_functionType.getResults(); + result.addTypes(allResultTypes); + if (parser.resolveOperands(inputsOperands, inputsTypes, inputsOperandsLoc, result.operands)) + return failure(); + return success(); +} + +void GenericCallOp::print(OpAsmPrinter &p) { + p << "toy.generic_call"; + p << " "; + p.printAttributeWithoutType(calleeAttr()); + p << "("; + p << inputs(); + p << ")"; + p.printOptionalAttrDict(getAttrs(), /*elidedAttrs=*/{"callee"}); + p << " " << ":"; + p << " "; + p.printFunctionalType(inputs().getTypes(), getOperation()->getResultTypes()); +} + + +//===----------------------------------------------------------------------===// +// toy::MulOp definitions +//===----------------------------------------------------------------------===// + +MulOpAdaptor::MulOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs ) : odsOperands(values), odsAttrs(attrs) { + +} + +MulOpAdaptor::MulOpAdaptor(MulOp& op) : odsOperands(op.getOperation()->getOperands()), odsAttrs(op.getOperation()->getAttrDictionary()) { + +} + +std::pair MulOpAdaptor::getODSOperandIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::ValueRange MulOpAdaptor::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(odsOperands.begin(), valueRange.first), + std::next(odsOperands.begin(), valueRange.first + valueRange.second)}; +} + +::mlir::Value MulOpAdaptor::lhs() { + return *getODSOperands(0).begin(); +} + +::mlir::Value MulOpAdaptor::rhs() { + return *getODSOperands(1).begin(); +} + +::mlir::LogicalResult MulOpAdaptor::verify(::mlir::Location loc) { + return success(); +} + +::llvm::StringRef MulOp::getOperationName() { + return "toy.mul"; +} + +std::pair MulOp::getODSOperandIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::operand_range MulOp::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(getOperation()->operand_begin(), valueRange.first), + std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)}; +} + +::mlir::Value MulOp::lhs() { + return *getODSOperands(0).begin(); +} + +::mlir::Value MulOp::rhs() { + return *getODSOperands(1).begin(); +} + +::mlir::MutableOperandRange MulOp::lhsMutable() { + auto range = getODSOperandIndexAndLength(0); + return ::mlir::MutableOperandRange(getOperation(), range.first, range.second); +} + +::mlir::MutableOperandRange MulOp::rhsMutable() { + auto range = getODSOperandIndexAndLength(1); + return ::mlir::MutableOperandRange(getOperation(), range.first, range.second); +} + +std::pair MulOp::getODSResultIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::result_range MulOp::getODSResults(unsigned index) { + auto valueRange = getODSResultIndexAndLength(index); + return {std::next(getOperation()->result_begin(), valueRange.first), + std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)}; +} + + + +void MulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::Value lhs, ::mlir::Value rhs) { + odsState.addOperands(lhs); + odsState.addOperands(rhs); + odsState.addTypes(resultType0); +} + +void MulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::Value lhs, ::mlir::Value rhs) { + odsState.addOperands(lhs); + odsState.addOperands(rhs); + assert(resultTypes.size() == 1u && "mismatched number of results"); + odsState.addTypes(resultTypes); +} + +void MulOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes ) { + assert(operands.size() == 2u && "mismatched number of parameters"); + odsState.addOperands(operands); + odsState.addAttributes(attributes); + assert(resultTypes.size() == 1u && "mismatched number of return types"); + odsState.addTypes(resultTypes); +} + +::mlir::ParseResult MulOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { + return ::parseBinaryOp(parser, result); +} + +void MulOp::print(::mlir::OpAsmPrinter &p) { + return ::printBinaryOp(p, *this); +} + +::mlir::LogicalResult MulOp::verify() { + if (failed(MulOpAdaptor(*this).verify(this->getLoc()))) return failure(); + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSOperands(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("operand #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + auto valueGroup1 = getODSOperands(1); + for (::mlir::Value v : valueGroup1) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("operand #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSResults(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("result #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + return ::mlir::success(); +} + + +//===----------------------------------------------------------------------===// +// toy::PrintOp definitions +//===----------------------------------------------------------------------===// + +PrintOpAdaptor::PrintOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs ) : odsOperands(values), odsAttrs(attrs) { + +} + +PrintOpAdaptor::PrintOpAdaptor(PrintOp& op) : odsOperands(op.getOperation()->getOperands()), odsAttrs(op.getOperation()->getAttrDictionary()) { + +} + +std::pair PrintOpAdaptor::getODSOperandIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::ValueRange PrintOpAdaptor::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(odsOperands.begin(), valueRange.first), + std::next(odsOperands.begin(), valueRange.first + valueRange.second)}; +} + +::mlir::Value PrintOpAdaptor::input() { + return *getODSOperands(0).begin(); +} + +::mlir::LogicalResult PrintOpAdaptor::verify(::mlir::Location loc) { + return success(); +} + +::llvm::StringRef PrintOp::getOperationName() { + return "toy.print"; +} + +std::pair PrintOp::getODSOperandIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::operand_range PrintOp::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(getOperation()->operand_begin(), valueRange.first), + std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)}; +} + +::mlir::Value PrintOp::input() { + return *getODSOperands(0).begin(); +} + +::mlir::MutableOperandRange PrintOp::inputMutable() { + auto range = getODSOperandIndexAndLength(0); + return ::mlir::MutableOperandRange(getOperation(), range.first, range.second); +} + +std::pair PrintOp::getODSResultIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::result_range PrintOp::getODSResults(unsigned index) { + auto valueRange = getODSResultIndexAndLength(index); + return {std::next(getOperation()->result_begin(), valueRange.first), + std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)}; +} + +void PrintOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Value input) { + odsState.addOperands(input); +} + +void PrintOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::Value input) { + odsState.addOperands(input); + assert(resultTypes.size() == 0u && "mismatched number of results"); + odsState.addTypes(resultTypes); +} + +void PrintOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes ) { + assert(operands.size() == 1u && "mismatched number of parameters"); + odsState.addOperands(operands); + odsState.addAttributes(attributes); + assert(resultTypes.size() == 0u && "mismatched number of return types"); + odsState.addTypes(resultTypes); +} + +::mlir::LogicalResult PrintOp::verify() { + if (failed(PrintOpAdaptor(*this).verify(this->getLoc()))) return failure(); + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSOperands(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("operand #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + { + unsigned index = 0; (void)index; + } + return ::mlir::success(); +} + +::mlir::ParseResult PrintOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { + ::mlir::OpAsmParser::OperandType inputRawOperands[1]; + ::llvm::ArrayRef<::mlir::OpAsmParser::OperandType> inputOperands(inputRawOperands); ::llvm::SMLoc inputOperandsLoc = parser.getCurrentLocation(); + (void)inputOperandsLoc; + ::mlir::Type inputRawTypes[1]; + ::llvm::ArrayRef<::mlir::Type> inputTypes(inputRawTypes); + + if (parser.parseOperand(inputRawOperands[0])) + return failure(); + if (parser.parseOptionalAttrDict(result.attributes)) + return failure(); + if (parser.parseColon()) + return failure(); + + if (parser.parseType(inputRawTypes[0])) + return failure(); + if (parser.resolveOperands(inputOperands, inputTypes, inputOperandsLoc, result.operands)) + return failure(); + return success(); +} + +void PrintOp::print(OpAsmPrinter &p) { + p << "toy.print"; + p << " "; + p << input(); + p.printOptionalAttrDict(getAttrs(), /*elidedAttrs=*/{}); + p << " " << ":"; + p << " "; + p << ::llvm::ArrayRef<::mlir::Type>(input().getType()); +} + + +//===----------------------------------------------------------------------===// +// toy::ReshapeOp definitions +//===----------------------------------------------------------------------===// + +ReshapeOpAdaptor::ReshapeOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs ) : odsOperands(values), odsAttrs(attrs) { + +} + +ReshapeOpAdaptor::ReshapeOpAdaptor(ReshapeOp& op) : odsOperands(op.getOperation()->getOperands()), odsAttrs(op.getOperation()->getAttrDictionary()) { + +} + +std::pair ReshapeOpAdaptor::getODSOperandIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::ValueRange ReshapeOpAdaptor::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(odsOperands.begin(), valueRange.first), + std::next(odsOperands.begin(), valueRange.first + valueRange.second)}; +} + +::mlir::Value ReshapeOpAdaptor::input() { + return *getODSOperands(0).begin(); +} + +::mlir::LogicalResult ReshapeOpAdaptor::verify(::mlir::Location loc) { + return success(); +} + +::llvm::StringRef ReshapeOp::getOperationName() { + return "toy.reshape"; +} + +std::pair ReshapeOp::getODSOperandIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::operand_range ReshapeOp::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(getOperation()->operand_begin(), valueRange.first), + std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)}; +} + +::mlir::Value ReshapeOp::input() { + return *getODSOperands(0).begin(); +} + +::mlir::MutableOperandRange ReshapeOp::inputMutable() { + auto range = getODSOperandIndexAndLength(0); + return ::mlir::MutableOperandRange(getOperation(), range.first, range.second); +} + +std::pair ReshapeOp::getODSResultIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::result_range ReshapeOp::getODSResults(unsigned index) { + auto valueRange = getODSResultIndexAndLength(index); + return {std::next(getOperation()->result_begin(), valueRange.first), + std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)}; +} + +void ReshapeOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::Value input) { + odsState.addOperands(input); + odsState.addTypes(resultType0); +} + +void ReshapeOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::Value input) { + odsState.addOperands(input); + assert(resultTypes.size() == 1u && "mismatched number of results"); + odsState.addTypes(resultTypes); +} + +void ReshapeOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes ) { + assert(operands.size() == 1u && "mismatched number of parameters"); + odsState.addOperands(operands); + odsState.addAttributes(attributes); + assert(resultTypes.size() == 1u && "mismatched number of return types"); + odsState.addTypes(resultTypes); +} + +::mlir::LogicalResult ReshapeOp::verify() { + if (failed(ReshapeOpAdaptor(*this).verify(this->getLoc()))) return failure(); + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSOperands(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("operand #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSResults(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!((((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64()))) && ((v.getType().cast<::mlir::ShapedType>().hasStaticShape())))) { + return emitOpError("result #") << index << " must be statically shaped tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + return ::mlir::success(); +} + +::mlir::ParseResult ReshapeOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { + ::mlir::OpAsmParser::OperandType inputRawOperands[1]; + ::llvm::ArrayRef<::mlir::OpAsmParser::OperandType> inputOperands(inputRawOperands); ::llvm::SMLoc inputOperandsLoc = parser.getCurrentLocation(); + (void)inputOperandsLoc; + ::mlir::Type inputRawTypes[1]; + ::llvm::ArrayRef<::mlir::Type> inputTypes(inputRawTypes); + ::mlir::SmallVector<::mlir::Type, 1> allResultTypes; + if (parser.parseLParen()) + return failure(); + + if (parser.parseOperand(inputRawOperands[0])) + return failure(); + if (parser.parseColon()) + return failure(); + + if (parser.parseType(inputRawTypes[0])) + return failure(); + if (parser.parseRParen()) + return failure(); + if (parser.parseOptionalAttrDict(result.attributes)) + return failure(); + if (parser.parseKeyword("to")) + return failure(); + + if (parser.parseTypeList(allResultTypes)) + return failure(); + result.addTypes(allResultTypes); + if (parser.resolveOperands(inputOperands, inputTypes, inputOperandsLoc, result.operands)) + return failure(); + return success(); +} + +void ReshapeOp::print(OpAsmPrinter &p) { + p << "toy.reshape"; + p << "("; + p << input(); + p << " " << ":"; + p << " "; + p << ::llvm::ArrayRef<::mlir::Type>(input().getType()); + p << ")"; + p.printOptionalAttrDict(getAttrs(), /*elidedAttrs=*/{}); + p << " " << "to"; + p << " "; + p << getOperation()->getResultTypes(); +} + + +//===----------------------------------------------------------------------===// +// toy::ReturnOp definitions +//===----------------------------------------------------------------------===// + +ReturnOpAdaptor::ReturnOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs ) : odsOperands(values), odsAttrs(attrs) { + +} + +ReturnOpAdaptor::ReturnOpAdaptor(ReturnOp& op) : odsOperands(op.getOperation()->getOperands()), odsAttrs(op.getOperation()->getAttrDictionary()) { + +} + +std::pair ReturnOpAdaptor::getODSOperandIndexAndLength(unsigned index) { + bool isVariadic[] = {true}; + int prevVariadicCount = 0; + for (unsigned i = 0; i < index; ++i) + if (isVariadic[i]) ++prevVariadicCount; + + // Calculate how many dynamic values a static variadic operand corresponds to. + // This assumes all static variadic operands have the same dynamic value count. + int variadicSize = (odsOperands.size() - 0) / 1; + // `index` passed in as the parameter is the static index which counts each + // operand (variadic or not) as size 1. So here for each previous static variadic + // operand, we need to offset by (variadicSize - 1) to get where the dynamic + // value pack for this static operand starts. + int start = index + (variadicSize - 1) * prevVariadicCount; + int size = isVariadic[index] ? variadicSize : 1; + return {start, size}; +} + +::mlir::ValueRange ReturnOpAdaptor::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(odsOperands.begin(), valueRange.first), + std::next(odsOperands.begin(), valueRange.first + valueRange.second)}; +} + +::mlir::ValueRange ReturnOpAdaptor::input() { + return getODSOperands(0); +} + +::mlir::LogicalResult ReturnOpAdaptor::verify(::mlir::Location loc) { + return success(); +} + +::llvm::StringRef ReturnOp::getOperationName() { + return "toy.return"; +} + +std::pair ReturnOp::getODSOperandIndexAndLength(unsigned index) { + bool isVariadic[] = {true}; + int prevVariadicCount = 0; + for (unsigned i = 0; i < index; ++i) + if (isVariadic[i]) ++prevVariadicCount; + + // Calculate how many dynamic values a static variadic operand corresponds to. + // This assumes all static variadic operands have the same dynamic value count. + int variadicSize = (getOperation()->getNumOperands() - 0) / 1; + // `index` passed in as the parameter is the static index which counts each + // operand (variadic or not) as size 1. So here for each previous static variadic + // operand, we need to offset by (variadicSize - 1) to get where the dynamic + // value pack for this static operand starts. + int start = index + (variadicSize - 1) * prevVariadicCount; + int size = isVariadic[index] ? variadicSize : 1; + return {start, size}; +} + +::mlir::Operation::operand_range ReturnOp::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(getOperation()->operand_begin(), valueRange.first), + std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)}; +} + +::mlir::Operation::operand_range ReturnOp::input() { + return getODSOperands(0); +} + +::mlir::MutableOperandRange ReturnOp::inputMutable() { + auto range = getODSOperandIndexAndLength(0); + return ::mlir::MutableOperandRange(getOperation(), range.first, range.second); +} + +std::pair ReturnOp::getODSResultIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::result_range ReturnOp::getODSResults(unsigned index) { + auto valueRange = getODSResultIndexAndLength(index); + return {std::next(getOperation()->result_begin(), valueRange.first), + std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)}; +} + +void ReturnOp::build(OpBuilder &b, OperationState &state) { + build(b, state, llvm::None); +} + +void ReturnOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange input) { + odsState.addOperands(input); +} + +void ReturnOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes ) { + odsState.addOperands(operands); + odsState.addAttributes(attributes); + assert(resultTypes.size() == 0u && "mismatched number of return types"); + odsState.addTypes(resultTypes); +} + +::mlir::LogicalResult ReturnOp::verify() { + if (failed(ReturnOpAdaptor(*this).verify(this->getLoc()))) return failure(); + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSOperands(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("operand #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + { + unsigned index = 0; (void)index; + } + return ::verify(*this); +} + +::mlir::ParseResult ReturnOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { + ::mlir::SmallVector<::mlir::OpAsmParser::OperandType, 4> inputOperands; + ::llvm::SMLoc inputOperandsLoc = parser.getCurrentLocation(); + (void)inputOperandsLoc; + ::mlir::SmallVector<::mlir::Type, 1> inputTypes; + + if (parser.parseOperandList(inputOperands)) + return failure(); + if (!inputOperands.empty()) { + if (parser.parseColon()) + return failure(); + + if (parser.parseTypeList(inputTypes)) + return failure(); + } + if (parser.parseOptionalAttrDict(result.attributes)) + return failure(); + if (parser.resolveOperands(inputOperands, inputTypes, inputOperandsLoc, result.operands)) + return failure(); + return success(); +} + +void ReturnOp::print(OpAsmPrinter &p) { + p << "toy.return"; + if (!input().empty()) { + p << " "; + p << input(); + p << " " << ":"; + p << " "; + p << input().getTypes(); + } + p.printOptionalAttrDict(getAttrs(), /*elidedAttrs=*/{}); +} + +void ReturnOp::getEffects(::mlir::SmallVectorImpl<::mlir::SideEffects::EffectInstance> &effects) { + +} + + +//===----------------------------------------------------------------------===// +// toy::TransposeOp definitions +//===----------------------------------------------------------------------===// + +TransposeOpAdaptor::TransposeOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs ) : odsOperands(values), odsAttrs(attrs) { + +} + +TransposeOpAdaptor::TransposeOpAdaptor(TransposeOp& op) : odsOperands(op.getOperation()->getOperands()), odsAttrs(op.getOperation()->getAttrDictionary()) { + +} + +std::pair TransposeOpAdaptor::getODSOperandIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::ValueRange TransposeOpAdaptor::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(odsOperands.begin(), valueRange.first), + std::next(odsOperands.begin(), valueRange.first + valueRange.second)}; +} + +::mlir::Value TransposeOpAdaptor::input() { + return *getODSOperands(0).begin(); +} + +::mlir::LogicalResult TransposeOpAdaptor::verify(::mlir::Location loc) { + return success(); +} + +::llvm::StringRef TransposeOp::getOperationName() { + return "toy.transpose"; +} + +std::pair TransposeOp::getODSOperandIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::operand_range TransposeOp::getODSOperands(unsigned index) { + auto valueRange = getODSOperandIndexAndLength(index); + return {std::next(getOperation()->operand_begin(), valueRange.first), + std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)}; +} + +::mlir::Value TransposeOp::input() { + return *getODSOperands(0).begin(); +} + +::mlir::MutableOperandRange TransposeOp::inputMutable() { + auto range = getODSOperandIndexAndLength(0); + return ::mlir::MutableOperandRange(getOperation(), range.first, range.second); +} + +std::pair TransposeOp::getODSResultIndexAndLength(unsigned index) { + return {index, 1}; +} + +::mlir::Operation::result_range TransposeOp::getODSResults(unsigned index) { + auto valueRange = getODSResultIndexAndLength(index); + return {std::next(getOperation()->result_begin(), valueRange.first), + std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)}; +} + + + +void TransposeOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::Value input) { + odsState.addOperands(input); + odsState.addTypes(resultType0); +} + +void TransposeOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::Value input) { + odsState.addOperands(input); + assert(resultTypes.size() == 1u && "mismatched number of results"); + odsState.addTypes(resultTypes); +} + +void TransposeOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes ) { + assert(operands.size() == 1u && "mismatched number of parameters"); + odsState.addOperands(operands); + odsState.addAttributes(attributes); + assert(resultTypes.size() == 1u && "mismatched number of return types"); + odsState.addTypes(resultTypes); +} + +::mlir::LogicalResult TransposeOp::verify() { + if (failed(TransposeOpAdaptor(*this).verify(this->getLoc()))) return failure(); + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSOperands(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("operand #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + { + unsigned index = 0; (void)index; + auto valueGroup0 = getODSResults(0); + for (::mlir::Value v : valueGroup0) { + (void)v; + if (!(((v.getType().isa<::mlir::TensorType>())) && ((v.getType().cast<::mlir::ShapedType>().getElementType().isF64())))) { + return emitOpError("result #") << index << " must be tensor of 64-bit float values, but got " << v.getType(); + } + ++index; + } + } + return ::verify(*this); +} + +::mlir::ParseResult TransposeOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { + ::mlir::OpAsmParser::OperandType inputRawOperands[1]; + ::llvm::ArrayRef<::mlir::OpAsmParser::OperandType> inputOperands(inputRawOperands); ::llvm::SMLoc inputOperandsLoc = parser.getCurrentLocation(); + (void)inputOperandsLoc; + ::mlir::Type inputRawTypes[1]; + ::llvm::ArrayRef<::mlir::Type> inputTypes(inputRawTypes); + ::mlir::SmallVector<::mlir::Type, 1> allResultTypes; + if (parser.parseLParen()) + return failure(); + + if (parser.parseOperand(inputRawOperands[0])) + return failure(); + if (parser.parseColon()) + return failure(); + + if (parser.parseType(inputRawTypes[0])) + return failure(); + if (parser.parseRParen()) + return failure(); + if (parser.parseOptionalAttrDict(result.attributes)) + return failure(); + if (parser.parseKeyword("to")) + return failure(); + + if (parser.parseTypeList(allResultTypes)) + return failure(); + result.addTypes(allResultTypes); + if (parser.resolveOperands(inputOperands, inputTypes, inputOperandsLoc, result.operands)) + return failure(); + return success(); +} + +void TransposeOp::print(OpAsmPrinter &p) { + p << "toy.transpose"; + p << "("; + p << input(); + p << " " << ":"; + p << " "; + p << ::llvm::ArrayRef<::mlir::Type>(input().getType()); + p << ")"; + p.printOptionalAttrDict(getAttrs(), /*elidedAttrs=*/{}); + p << " " << "to"; + p << " "; + p << getOperation()->getResultTypes(); +} + + +#endif // GET_OP_CLASSES + diff --git a/test/d.h.inc b/test/d.h.inc new file mode 100644 index 0000000..6d0ba58 --- /dev/null +++ b/test/d.h.inc @@ -0,0 +1,338 @@ +/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ +|* *| +|* Op Declarations *| +|* *| +|* Automatically generated file, do not edit! *| +|* *| +\*===----------------------------------------------------------------------===*/ + +#if defined(GET_OP_CLASSES) || defined(GET_OP_FWD_DEFINES) +#undef GET_OP_FWD_DEFINES +class AddOp; +class ConstantOp; +class GenericCallOp; +class MulOp; +class PrintOp; +class ReshapeOp; +class ReturnOp; +class TransposeOp; +#endif + +#ifdef GET_OP_CLASSES +#undef GET_OP_CLASSES + + +//===----------------------------------------------------------------------===// +// toy::AddOp declarations +//===----------------------------------------------------------------------===// + +class AddOpAdaptor { +public: + AddOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs = nullptr); + AddOpAdaptor(AddOp& op); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::ValueRange getODSOperands(unsigned index); + ::mlir::Value lhs(); + ::mlir::Value rhs(); + ::mlir::LogicalResult verify(::mlir::Location loc); + +private: + ::mlir::ValueRange odsOperands; + ::mlir::DictionaryAttr odsAttrs; +}; +class AddOp : public ::mlir::Op::Impl> { +public: + using Op::Op; + using Adaptor = AddOpAdaptor; + static ::llvm::StringRef getOperationName(); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::Operation::operand_range getODSOperands(unsigned index); + ::mlir::Value lhs(); + ::mlir::Value rhs(); + ::mlir::MutableOperandRange lhsMutable(); + ::mlir::MutableOperandRange rhsMutable(); + std::pair getODSResultIndexAndLength(unsigned index); + ::mlir::Operation::result_range getODSResults(unsigned index); + static void build(OpBuilder &b, OperationState &state, Value lhs, Value rhs); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::Value lhs, ::mlir::Value rhs); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::Value lhs, ::mlir::Value rhs); + static void build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {}); + static ::mlir::ParseResult parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result); + void print(::mlir::OpAsmPrinter &p); + ::mlir::LogicalResult verify(); +}; + +//===----------------------------------------------------------------------===// +// toy::ConstantOp declarations +//===----------------------------------------------------------------------===// + +class ConstantOpAdaptor { +public: + ConstantOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs = nullptr); + ConstantOpAdaptor(ConstantOp& op); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::ValueRange getODSOperands(unsigned index); + ::mlir::DenseElementsAttr value(); + ::mlir::LogicalResult verify(::mlir::Location loc); + +private: + ::mlir::ValueRange odsOperands; + ::mlir::DictionaryAttr odsAttrs; +}; +class ConstantOp : public ::mlir::Op { +public: + using Op::Op; + using Adaptor = ConstantOpAdaptor; + static ::llvm::StringRef getOperationName(); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::Operation::operand_range getODSOperands(unsigned index); + std::pair getODSResultIndexAndLength(unsigned index); + ::mlir::Operation::result_range getODSResults(unsigned index); + ::mlir::DenseElementsAttr valueAttr(); + ::mlir::DenseElementsAttr value(); + void valueAttr(::mlir::DenseElementsAttr attr); + static void build(OpBuilder &builder, OperationState &state, DenseElementsAttr value); + static void build(OpBuilder &builder, OperationState &state, double value); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::DenseElementsAttr value); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::DenseElementsAttr value); + static void build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {}); + static ::mlir::ParseResult parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result); + void print(::mlir::OpAsmPrinter &p); + ::mlir::LogicalResult verify(); + void getEffects(::mlir::SmallVectorImpl<::mlir::SideEffects::EffectInstance> &effects); +}; + +//===----------------------------------------------------------------------===// +// toy::GenericCallOp declarations +//===----------------------------------------------------------------------===// + +class GenericCallOpAdaptor { +public: + GenericCallOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs = nullptr); + GenericCallOpAdaptor(GenericCallOp& op); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::ValueRange getODSOperands(unsigned index); + ::mlir::ValueRange inputs(); + ::mlir::FlatSymbolRefAttr callee(); + ::mlir::LogicalResult verify(::mlir::Location loc); + +private: + ::mlir::ValueRange odsOperands; + ::mlir::DictionaryAttr odsAttrs; +}; +class GenericCallOp : public ::mlir::Op { +public: + using Op::Op; + using Adaptor = GenericCallOpAdaptor; + static ::llvm::StringRef getOperationName(); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::Operation::operand_range getODSOperands(unsigned index); + ::mlir::Operation::operand_range inputs(); + ::mlir::MutableOperandRange inputsMutable(); + std::pair getODSResultIndexAndLength(unsigned index); + ::mlir::Operation::result_range getODSResults(unsigned index); + ::mlir::FlatSymbolRefAttr calleeAttr(); + ::llvm::StringRef callee(); + void calleeAttr(::mlir::FlatSymbolRefAttr attr); + static void build(OpBuilder &builder, OperationState &state, StringRef callee, ArrayRef arguments); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::FlatSymbolRefAttr callee, ::mlir::ValueRange inputs); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::FlatSymbolRefAttr callee, ::mlir::ValueRange inputs); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::llvm::StringRef callee, ::mlir::ValueRange inputs); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::llvm::StringRef callee, ::mlir::ValueRange inputs); + static void build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {}); + ::mlir::LogicalResult verify(); + static ::mlir::ParseResult parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result); + void print(OpAsmPrinter &p); +}; + +//===----------------------------------------------------------------------===// +// toy::MulOp declarations +//===----------------------------------------------------------------------===// + +class MulOpAdaptor { +public: + MulOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs = nullptr); + MulOpAdaptor(MulOp& op); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::ValueRange getODSOperands(unsigned index); + ::mlir::Value lhs(); + ::mlir::Value rhs(); + ::mlir::LogicalResult verify(::mlir::Location loc); + +private: + ::mlir::ValueRange odsOperands; + ::mlir::DictionaryAttr odsAttrs; +}; +class MulOp : public ::mlir::Op::Impl> { +public: + using Op::Op; + using Adaptor = MulOpAdaptor; + static ::llvm::StringRef getOperationName(); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::Operation::operand_range getODSOperands(unsigned index); + ::mlir::Value lhs(); + ::mlir::Value rhs(); + ::mlir::MutableOperandRange lhsMutable(); + ::mlir::MutableOperandRange rhsMutable(); + std::pair getODSResultIndexAndLength(unsigned index); + ::mlir::Operation::result_range getODSResults(unsigned index); + static void build(OpBuilder &b, OperationState &state, Value lhs, Value rhs); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::Value lhs, ::mlir::Value rhs); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::Value lhs, ::mlir::Value rhs); + static void build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {}); + static ::mlir::ParseResult parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result); + void print(::mlir::OpAsmPrinter &p); + ::mlir::LogicalResult verify(); +}; + +//===----------------------------------------------------------------------===// +// toy::PrintOp declarations +//===----------------------------------------------------------------------===// + +class PrintOpAdaptor { +public: + PrintOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs = nullptr); + PrintOpAdaptor(PrintOp& op); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::ValueRange getODSOperands(unsigned index); + ::mlir::Value input(); + ::mlir::LogicalResult verify(::mlir::Location loc); + +private: + ::mlir::ValueRange odsOperands; + ::mlir::DictionaryAttr odsAttrs; +}; +class PrintOp : public ::mlir::Op { +public: + using Op::Op; + using Adaptor = PrintOpAdaptor; + static ::llvm::StringRef getOperationName(); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::Operation::operand_range getODSOperands(unsigned index); + ::mlir::Value input(); + ::mlir::MutableOperandRange inputMutable(); + std::pair getODSResultIndexAndLength(unsigned index); + ::mlir::Operation::result_range getODSResults(unsigned index); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Value input); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::Value input); + static void build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {}); + ::mlir::LogicalResult verify(); + static ::mlir::ParseResult parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result); + void print(OpAsmPrinter &p); +}; + +//===----------------------------------------------------------------------===// +// toy::ReshapeOp declarations +//===----------------------------------------------------------------------===// + +class ReshapeOpAdaptor { +public: + ReshapeOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs = nullptr); + ReshapeOpAdaptor(ReshapeOp& op); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::ValueRange getODSOperands(unsigned index); + ::mlir::Value input(); + ::mlir::LogicalResult verify(::mlir::Location loc); + +private: + ::mlir::ValueRange odsOperands; + ::mlir::DictionaryAttr odsAttrs; +}; +class ReshapeOp : public ::mlir::Op { +public: + using Op::Op; + using Adaptor = ReshapeOpAdaptor; + static ::llvm::StringRef getOperationName(); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::Operation::operand_range getODSOperands(unsigned index); + ::mlir::Value input(); + ::mlir::MutableOperandRange inputMutable(); + std::pair getODSResultIndexAndLength(unsigned index); + ::mlir::Operation::result_range getODSResults(unsigned index); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::Value input); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::Value input); + static void build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {}); + ::mlir::LogicalResult verify(); + static ::mlir::ParseResult parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result); + void print(OpAsmPrinter &p); +}; + +//===----------------------------------------------------------------------===// +// toy::ReturnOp declarations +//===----------------------------------------------------------------------===// + +class ReturnOpAdaptor { +public: + ReturnOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs = nullptr); + ReturnOpAdaptor(ReturnOp& op); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::ValueRange getODSOperands(unsigned index); + ::mlir::ValueRange input(); + ::mlir::LogicalResult verify(::mlir::Location loc); + +private: + ::mlir::ValueRange odsOperands; + ::mlir::DictionaryAttr odsAttrs; +}; +class ReturnOp : public ::mlir::Op::Impl, OpTrait::IsTerminator> { +public: + using Op::Op; + using Adaptor = ReturnOpAdaptor; + static ::llvm::StringRef getOperationName(); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::Operation::operand_range getODSOperands(unsigned index); + ::mlir::Operation::operand_range input(); + ::mlir::MutableOperandRange inputMutable(); + std::pair getODSResultIndexAndLength(unsigned index); + ::mlir::Operation::result_range getODSResults(unsigned index); + static void build(OpBuilder &b, OperationState &state); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange input); + static void build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {}); + ::mlir::LogicalResult verify(); + static ::mlir::ParseResult parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result); + void print(OpAsmPrinter &p); + void getEffects(::mlir::SmallVectorImpl<::mlir::SideEffects::EffectInstance> &effects); + + bool hasOperand() { return getNumOperands() != 0; } + +}; + +//===----------------------------------------------------------------------===// +// toy::TransposeOp declarations +//===----------------------------------------------------------------------===// + +class TransposeOpAdaptor { +public: + TransposeOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs = nullptr); + TransposeOpAdaptor(TransposeOp& op); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::ValueRange getODSOperands(unsigned index); + ::mlir::Value input(); + ::mlir::LogicalResult verify(::mlir::Location loc); + +private: + ::mlir::ValueRange odsOperands; + ::mlir::DictionaryAttr odsAttrs; +}; +class TransposeOp : public ::mlir::Op { +public: + using Op::Op; + using Adaptor = TransposeOpAdaptor; + static ::llvm::StringRef getOperationName(); + std::pair getODSOperandIndexAndLength(unsigned index); + ::mlir::Operation::operand_range getODSOperands(unsigned index); + ::mlir::Value input(); + ::mlir::MutableOperandRange inputMutable(); + std::pair getODSResultIndexAndLength(unsigned index); + ::mlir::Operation::result_range getODSResults(unsigned index); + static void build(OpBuilder &b, OperationState &state, Value input); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::Value input); + static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::Value input); + static void build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::llvm::ArrayRef<::mlir::Type> resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {}); + ::mlir::LogicalResult verify(); + static ::mlir::ParseResult parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result); + void print(OpAsmPrinter &p); +}; + +#endif // GET_OP_CLASSES + diff --git a/yarn.lock b/yarn.lock index 384f112..fb57ccd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,2311 +2,3 @@ # yarn lockfile v1 -ajv@^6.12.3: - version "6.12.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" - integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= - dependencies: - ansi-wrap "0.1.0" - -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-wrap@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - -arr-flatten@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1, array-uniq@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" - integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -beeper@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak= - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chalk@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - -chalk@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -clone-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= - -clone-stats@^0.0.1, clone-stats@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= - -clone-stats@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" - integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= - -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8= - -clone@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -cloneable-readable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" - integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== - dependencies: - inherits "^2.0.1" - process-nextick-args "^2.0.0" - readable-stream "^2.3.5" - -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" - integrity sha1-+mihT2qUXVTbvlDYzbMyDp47GgY= - -commander@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" - integrity sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM= - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -convert-source-map@^1.1.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -dateformat@^1.0.7-1.2.3: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - -dateformat@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" - integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI= - -debug@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= - dependencies: - ms "0.7.1" - -decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -deep-assign@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b" - integrity sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s= - dependencies: - is-obj "^1.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -diff@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" - integrity sha1-fyjS657nsVqX79ic5j3P2qPMur8= - -duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= - dependencies: - readable-stream "~1.1.9" - -duplexer@^0.1.1, duplexer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= - -duplexify@^3.2.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -end-of-stream@^1.0.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -error-ex@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" - integrity sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE= - -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -event-stream@3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - integrity sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE= - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - -event-stream@^3.3.1: - version "3.3.5" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.5.tgz#e5dd8989543630d94c6cf4d657120341fa31636b" - integrity sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g== - dependencies: - duplexer "^0.1.1" - from "^0.1.7" - map-stream "0.0.7" - pause-stream "^0.0.11" - split "^1.0.1" - stream-combiner "^0.2.2" - through "^2.3.8" - -event-stream@~3.1.5: - version "3.1.7" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.1.7.tgz#b4c540012d0fe1498420f3d8946008db6393c37a" - integrity sha1-tMVAAS0P4UmEIPPYlGAI22OTw3o= - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.2" - stream-combiner "~0.0.4" - through "~2.3.1" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend@^3.0.0, extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fancy-log@^1.1.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" - integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - parse-node-version "^1.0.0" - time-stamp "^1.0.0" - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= - dependencies: - pend "~1.2.0" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= - -for-in@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -from@^0.1.7, from@~0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fstream@~0.1.28: - version "0.1.31" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-0.1.31.tgz#7337f058fbbbbefa8c9f561a28cab0849202c988" - integrity sha1-czfwWPu7vvqMn1YaKMqwhJICyYg= - dependencies: - graceful-fs "~3.0.2" - inherits "~2.0.0" - mkdirp "0.5" - rimraf "2" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-stream@^5.3.2: - version "5.3.5" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" - integrity sha1-pVZlqajM3EGRWofHAeMtTgFvrSI= - dependencies: - extend "^3.0.0" - glob "^5.0.3" - glob-parent "^3.0.0" - micromatch "^2.3.7" - ordered-read-streams "^0.3.0" - through2 "^0.6.0" - to-absolute-glob "^0.1.1" - unique-stream "^2.0.2" - -glob@3.2.11: - version "3.2.11" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" - integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0= - dependencies: - inherits "2" - minimatch "0.3" - -glob@^5.0.15, glob@^5.0.3: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glogg@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" - integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== - dependencies: - sparkles "^1.0.0" - -graceful-fs@^4.0.0, graceful-fs@^4.1.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -graceful-fs@~3.0.2: - version "3.0.12" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.12.tgz#0034947ce9ed695ec8ab0b854bc919e82b1ffaef" - integrity sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg== - dependencies: - natives "^1.1.3" - -growl@1.9.2: - version "1.9.2" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" - integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= - -gulp-chmod@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/gulp-chmod/-/gulp-chmod-1.3.0.tgz#8bb6e8c11895dcbf9b42520c874347a5022bcb0d" - integrity sha1-i7bowRiV3L+bQlIMh0NHpQIryw0= - dependencies: - deep-assign "^1.0.0" - stat-mode "^0.2.0" - through2 "^2.0.0" - -gulp-filter@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-4.0.0.tgz#395f58a256c559cdb9e0d157f1caaf5248a38dcb" - integrity sha1-OV9YolbFWc254NFX8cqvUkijjcs= - dependencies: - gulp-util "^3.0.6" - multimatch "^2.0.0" - streamfilter "^1.0.5" - -gulp-gunzip@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/gulp-gunzip/-/gulp-gunzip-0.0.3.tgz#7b6e07b0f58fd3d42515c48ead5a63df0572f62f" - integrity sha1-e24HsPWP09QlFcSOrVpj3wVy9i8= - dependencies: - through2 "~0.6.5" - vinyl "~0.4.6" - -gulp-remote-src@^0.4.0: - version "0.4.4" - resolved "https://registry.yarnpkg.com/gulp-remote-src/-/gulp-remote-src-0.4.4.tgz#4a4d18fac0ffedde94a7855953de90db00a1d1b1" - integrity sha512-mo7lGgZmNXyTbcUzfjSnUVkx1pnqqiwv/pPaIrYdTO77hq0WNTxXLAzQdoYOnyJ0mfVLNmNl9AGqWLiAzTPMMA== - dependencies: - event-stream "3.3.4" - node.extend "~1.1.2" - request "^2.88.0" - through2 "~2.0.3" - vinyl "~2.0.1" - -gulp-sourcemaps@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" - integrity sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw= - dependencies: - convert-source-map "^1.1.1" - graceful-fs "^4.1.2" - strip-bom "^2.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - -gulp-symdest@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/gulp-symdest/-/gulp-symdest-1.1.1.tgz#b0a6df3d43a0537165946ab8e38c1b7080a66fac" - integrity sha512-UHd3MokfIN7SrFdsbV5uZTwzBpL0ZSTu7iq98fuDqBGZ0dlHxgbQBJwfd6qjCW83snkQ3Hz9IY4sMRMz2iTq7w== - dependencies: - event-stream "3.3.4" - mkdirp "^0.5.1" - queue "^3.1.0" - vinyl-fs "^2.4.3" - -gulp-untar@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/gulp-untar/-/gulp-untar-0.0.4.tgz#635cc7d67d3d48aec0dbc69822623fc7c33f7d37" - integrity sha1-Y1zH1n09SK7A28aYImI/x8M/fTc= - dependencies: - event-stream "~3.1.5" - gulp-util "~2.2.14" - streamifier "~0.1.0" - tar "~0.1.19" - through2 "~0.4.1" - -gulp-util@^3.0.6: - version "3.0.8" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08= - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp-util@~2.2.14: - version "2.2.20" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" - integrity sha1-1xRuVyiRC9jwR6awseVJvCLb1kw= - dependencies: - chalk "^0.5.0" - dateformat "^1.0.7-1.2.3" - lodash._reinterpolate "^2.4.1" - lodash.template "^2.4.1" - minimist "^0.2.0" - multipipe "^0.1.0" - through2 "^0.5.0" - vinyl "^0.2.1" - -gulp-vinyl-zip@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/gulp-vinyl-zip/-/gulp-vinyl-zip-1.4.0.tgz#56382f2ccb57231bb0478c78737ccd572973bee1" - integrity sha1-VjgvLMtXIxuwR4x4c3zNVylzvuE= - dependencies: - event-stream "^3.3.1" - queue "^3.0.10" - through2 "^0.6.3" - vinyl "^0.4.6" - vinyl-fs "^2.0.0" - yauzl "^2.2.1" - yazl "^2.2.1" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U= - dependencies: - glogg "^1.0.0" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= - dependencies: - ansi-regex "^0.2.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - integrity sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4= - dependencies: - sparkles "^1.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-extglob@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - -is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-valid-glob@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" - integrity sha1-1LVcafUYhvm2XHDWwmItN+KfSP4= - -is@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/is/-/is-3.3.0.tgz#61cff6dd3c4193db94a3d62582072b44e5645d79" - integrity sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -jade@0.26.3: - version "0.26.3" - resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" - integrity sha1-jxDXl32NefL2/4YqgbBRPMslaGw= - dependencies: - commander "0.6.1" - mkdirp "0.3.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= - dependencies: - readable-stream "^2.0.5" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U= - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc= - -lodash._escapehtmlchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" - integrity sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0= - dependencies: - lodash._htmlescapes "~2.4.1" - -lodash._escapestringchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" - integrity sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I= - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= - -lodash._htmlescapes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" - integrity sha1-MtFL8IRLbeb4tioFG09nwii2JMs= - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= - -lodash._isnative@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" - integrity sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw= - -lodash._objecttypes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" - integrity sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE= - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - integrity sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo= - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - integrity sha1-WLx0xAZklTrgsSTYBpltrKQx4u0= - -lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" - integrity sha1-TxInqlqHEfxjL1sHofRgequLMiI= - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - -lodash._reunescapedhtml@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" - integrity sha1-dHxPxAED6zu4oJduVx96JlnpO6c= - dependencies: - lodash._htmlescapes "~2.4.1" - lodash.keys "~2.4.1" - -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= - -lodash._shimkeys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" - integrity sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM= - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.defaults@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" - integrity sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ= - dependencies: - lodash._objecttypes "~2.4.1" - lodash.keys "~2.4.1" - -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg= - dependencies: - lodash._root "^3.0.0" - -lodash.escape@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" - integrity sha1-LOEsXghNsKV92l5dHu659dF1o7Q= - dependencies: - lodash._escapehtmlchar "~2.4.1" - lodash._reunescapedhtml "~2.4.1" - lodash.keys "~2.4.1" - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= - -lodash.isequal@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= - -lodash.isobject@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" - integrity sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU= - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.keys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" - integrity sha1-SN6kbfj/djKxDXBrissmWR4rNyc= - dependencies: - lodash._isnative "~2.4.1" - lodash._shimkeys "~2.4.1" - lodash.isobject "~2.4.1" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= - -lodash.template@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" - integrity sha1-nmEQB+32KRKal0qzxIuBez4c8g0= - dependencies: - lodash._escapestringchar "~2.4.1" - lodash._reinterpolate "~2.4.1" - lodash.defaults "~2.4.1" - lodash.escape "~2.4.1" - lodash.keys "~2.4.1" - lodash.templatesettings "~2.4.1" - lodash.values "~2.4.1" - -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8= - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU= - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - -lodash.templatesettings@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" - integrity sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk= - dependencies: - lodash._reinterpolate "~2.4.1" - lodash.escape "~2.4.1" - -lodash.values@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" - integrity sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ= - dependencies: - lodash.keys "~2.4.1" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" - integrity sha1-ih8HiW2CsQkmvTdEokIACfiJdKg= - -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ= - -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-stream@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= - dependencies: - readable-stream "^2.0.1" - -micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.0" - -minimatch@0.3: - version "0.3.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" - integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0= - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.1.tgz#827ba4e7593464e7c221e8c5bed930904ee2c455" - integrity sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg== - -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" - integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4= - -mkdirp@0.5, mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -mocha@^2.3.3: - version "2.5.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" - integrity sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg= - dependencies: - commander "2.3.0" - debug "2.2.0" - diff "1.4.0" - escape-string-regexp "1.0.2" - glob "3.2.11" - growl "1.9.2" - jade "0.26.3" - mkdirp "0.5.1" - supports-color "1.2.0" - to-iso-string "0.0.2" - -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= - -multimatch@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= - dependencies: - array-differ "^1.0.0" - array-union "^1.0.1" - arrify "^1.0.0" - minimatch "^3.0.0" - -multipipe@^0.1.0, multipipe@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - integrity sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s= - dependencies: - duplexer2 "0.0.2" - -natives@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" - integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== - -node.extend@~1.1.2: - version "1.1.8" - resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.8.tgz#0aab3e63789f4e6d68b42bc00073ad1881243cf0" - integrity sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA== - dependencies: - has "^1.0.3" - is "^3.2.1" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= - -object-assign@^4.0.0, object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -ordered-read-streams@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" - integrity sha1-cTfmmzKYuzQiR6G77jiByA4v14s= - dependencies: - is-stream "^1.0.1" - readable-stream "^2.0.1" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -parse-node-version@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -pause-stream@0.0.11, pause-stream@^0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU= - dependencies: - through "~2.3" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -queue@^3.0.10, queue@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/queue/-/queue-3.1.0.tgz#6c49d01f009e2256788789f2bffac6b8b9990585" - integrity sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU= - dependencies: - inherits "~2.0.0" - -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.3.5, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= - -replace-ext@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" - integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== - -request@^2.67.0, request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -resolve@^1.10.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -rimraf@2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -"semver@2 || 3 || 4 || 5", semver@^5.1.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= - -signal-exit@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -source-map-support@^0.3.2: - version "0.3.3" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.3.3.tgz#34900977d5ba3f07c7757ee72e73bb1a9b53754f" - integrity sha1-NJAJd9W6PwfHdX7nLnO7GptTdU8= - dependencies: - source-map "0.1.32" - -source-map@0.1.32: - version "0.1.32" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" - integrity sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY= - dependencies: - amdefine ">=0.0.4" - -sparkles@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" - integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -split@0.2: - version "0.2.10" - resolved "https://registry.yarnpkg.com/split/-/split-0.2.10.tgz#67097c601d697ce1368f418f06cd201cf0521a57" - integrity sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc= - dependencies: - through "2" - -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8= - dependencies: - through "2" - -split@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stat-mode@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" - integrity sha1-5sgLYjEj19gM8TLOU480YokHJQI= - -stream-combiner@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" - integrity sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg= - dependencies: - duplexer "~0.1.1" - through "~2.3.4" - -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ= - dependencies: - duplexer "~0.1.1" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -streamfilter@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/streamfilter/-/streamfilter-1.0.7.tgz#ae3e64522aa5a35c061fd17f67620c7653c643c9" - integrity sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ== - dependencies: - readable-stream "^2.0.2" - -streamifier@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/streamifier/-/streamifier-0.1.1.tgz#97e98d8fa4d105d62a2691d1dc07e820db8dfc4f" - integrity sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8= - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= - dependencies: - ansi-regex "^0.2.1" - -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-bom-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" - integrity sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4= - dependencies: - first-chunk-stream "^1.0.0" - strip-bom "^2.0.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - -supports-color@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" - integrity sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4= - -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -tar@~0.1.19: - version "0.1.20" - resolved "https://registry.yarnpkg.com/tar/-/tar-0.1.20.tgz#42940bae5b5f22c74483699126f9f3f27449cb13" - integrity sha1-QpQLrltfIsdEg2mRJvnz8nRJyxM= - dependencies: - block-stream "*" - fstream "~0.1.28" - inherits "2" - -through2-filter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" - integrity sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw= - dependencies: - through2 "~2.0.0" - xtend "~4.0.0" - -through2-filter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" - integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== - dependencies: - through2 "~2.0.0" - xtend "~4.0.0" - -through2@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" - integrity sha1-390BLrnHAOIyP9M084rGIqs3Lac= - dependencies: - readable-stream "~1.0.17" - xtend "~3.0.0" - -through2@^0.6.0, through2@^0.6.3, through2@~0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.0, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through2@~0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" - integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s= - dependencies: - readable-stream "~1.0.17" - xtend "~2.1.1" - -through@2, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.4: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= - -to-absolute-glob@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" - integrity sha1-HN+kcqnvUMI57maZm2YsoOs5k38= - dependencies: - extend-shallow "^2.0.1" - -to-iso-string@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" - integrity sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE= - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -typescript@^1.8.5: - version "1.8.10" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-1.8.10.tgz#b475d6e0dff0bf50f296e5ca6ef9fbb5c7320f1e" - integrity sha1-tHXW4N/wv1DyluXKbvn7tccyDx4= - -unique-stream@^2.0.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" - integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== - dependencies: - json-stable-stringify-without-jsonify "^1.0.1" - through2-filter "^3.0.0" - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -vali-date@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" - integrity sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY= - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vinyl-fs@^2.0.0, vinyl-fs@^2.4.3: - version "2.4.4" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" - integrity sha1-vm/zJwy1Xf19MGNkDegfJddTIjk= - dependencies: - duplexify "^3.2.0" - glob-stream "^5.3.2" - graceful-fs "^4.0.0" - gulp-sourcemaps "1.6.0" - is-valid-glob "^0.3.0" - lazystream "^1.0.0" - lodash.isequal "^4.0.0" - merge-stream "^1.0.0" - mkdirp "^0.5.0" - object-assign "^4.0.0" - readable-stream "^2.0.4" - strip-bom "^2.0.0" - strip-bom-stream "^1.0.0" - through2 "^2.0.0" - through2-filter "^2.0.0" - vali-date "^1.0.0" - vinyl "^1.0.0" - -vinyl-source-stream@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz#62b53a135610a896e98ca96bee3a87f008a8e780" - integrity sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A= - dependencies: - through2 "^2.0.3" - vinyl "^0.4.3" - -vinyl@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" - integrity sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI= - dependencies: - clone-stats "~0.0.1" - -vinyl@^0.4.3, vinyl@^0.4.6, vinyl@~0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc= - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - integrity sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4= - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vinyl@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" - integrity sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ= - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vinyl@~2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.0.2.tgz#0a3713d8d4e9221c58f10ca16c0116c9e25eda7c" - integrity sha1-CjcT2NTpIhxY8QyhbAEWyeJe2nw= - dependencies: - clone "^1.0.0" - clone-buffer "^1.0.0" - clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - is-stream "^1.1.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" - -vscode@^0.11.0: - version "0.11.18" - resolved "https://registry.yarnpkg.com/vscode/-/vscode-0.11.18.tgz#04adab8127a7c3f7b3458d1ca964851fdfa00768" - integrity sha1-BK2rgSenw/ezRY0cqWSFH9+gB2g= - dependencies: - glob "^5.0.15" - gulp-chmod "^1.3.0" - gulp-filter "^4.0.0" - gulp-gunzip "0.0.3" - gulp-remote-src "^0.4.0" - gulp-symdest "^1.0.0" - gulp-untar "0.0.4" - gulp-vinyl-zip "^1.1.2" - mocha "^2.3.3" - request "^2.67.0" - semver "^5.1.0" - source-map-support "^0.3.2" - vinyl-source-stream "^1.1.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -"xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -xtend@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= - dependencies: - object-keys "~0.4.0" - -xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - integrity sha1-XM50B7r2Qsunvs2laBEcST9ZZlo= - -yauzl@^2.2.1: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yazl@^2.2.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35" - integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw== - dependencies: - buffer-crc32 "~0.2.3"