Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 88

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 218

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 219

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 220
PK!ę,752161aedc0d6ed781ada8f3aa9db4973e187d1f.zipnuIwPK ^1Q# phpDocumentor-TypeResolver-6a467b8/UTc_PK ^1Q|8* phpDocumentor-TypeResolver-6a467b8/LICENSEUTc_]RKo0Wzj%qo8q͑KpF;CV] { i w{ Kmr>}??AZxmFUv:dwop1.d-=}3lC3N.6nthag&}4|ăηco>6q0tj%sɆ80pc;;^h|: }y7'9ޝ#&%m&㛟 a`PSCOx[Q̥ǯN\`4"g:+6R~~9 ?3Xjv^}DW tUo7;{[QD!]3O36%VKZEf";^c|FZK^n,J,\ 2י,as‡,#Q@7()j+NW̥&l)MIKCŵ:T->CRK,yDV́xsb|5TU[-WV*&E.Th*͹,x<E3jJP8~$*0A|nd-ZִVEh8f+V _.-k9by/{dPK ^1Qܵ\' #, phpDocumentor-TypeResolver-6a467b8/README.mdUTc_YoFŦAR`K$NꋁyiP؁"WW%zKC.pE({曙DN7g_YY.d˴S7f2\M}_<7Z*{SDOrM@0̪812[&(륲ʙZثZkCVI(:t~d@& kn(]HzAA #Jbs/񦊧J]+ %Suv>zr*rJε+O:m[[''7d~~yJ9umHWI@)*3 !NB?&rbF"UTN\5*0u,Y\$*)]4J!sgDfV4k,%XJ[e!J(pʹJ˷txxhE*k*Qi6_5)Q "T<3WnO)JegҳIřg":ڛz@<%O_CKbR J/s$AX23ۋ  6+IƹHDli:7@,!8ۚk reD+lCQz&ҩ*53WQMrN0~ tOcz\Y>XbpBX,gmE(;5Q=C-0gD=Y ѹQr+L`}ScEofԽь8_D S*zF$ds_fJt Bq=o,*p/_qFJ3/7t YUw8J/:A)$.N\#ˣwoO^=b]w$05-zW҆ɹJʇ;&`q}_?źd6'<3~ڮ0sahc?4ڇLl7+c\84 JV旿0~ɏk ȸ2UNc~n̼j<[G3y\ ǜmqf<_@T Uƪ>~ "^i[Oy47Y!]<&t1uSi{Alލ7u' z:#bt+@n1\(Yx'҈EOVZxp8Tg۱>,es@ v[qS:cmnh*I٧ƔV8 u: rT[Ac}?U[+NaeEfݡ!/~{ɓ'x"j?Ovph֎̄^V\']lt$~HGpZ-: rr:mռ%9g=R{ n;FQ>mM}WjƋK^|!gg6G"_#q{WPBK;e=`*u:D?,jT HMEwNȂFƦ!Mϟs1C_üNM1cN3Ft{>)j]<=JJ qKѢk[:ފFaA D< Q`B[h\1$)-۰@v{Qt0d0gcx˹*/ppo:&P}j)1?7a妪?٘ieYQ. } l84\g&K~n $ NL;(dA]HPN׳k2{$v^ M? LZ58no 2/͜/_W;?cvV[U*W3HKIcA_YBvts&E'UdM:լdotc"~FJWJoij[p-5wtwfAߵx!(w zg'VɂI&x\hk3VVīz uѰycZm_LӥQG(Z iyӚy\C몽m elT1SL?!:m.ִ$o/1Qmo7&/D:o6(_n’8ԼU,v7r PK ^1QqMa0 phpDocumentor-TypeResolver-6a467b8/composer.jsonUTc_RO0Wh((ht 2|阯 lP \cdkZX3o6+͜яdoEi=g=7ucE* OQ\až:vy'K/l~݄ aZYj`#7?Ʌ|-C9و4/ fۉhzӼzy6vB:|7hdr"XI֒3d[wY7⿭w͒}8]Ͷox KU J;>y3U2+agx|ug/a/M44{B>-όbdfH{J>Qx՗Z6,q+S0291#.֬ݥč@:9徵8lmejlHBZmYK\_<ɺ@/HƎYbAtGY4gٍr 1B9R6a&$rOInnpAp=N_ŨGfɟdUӆ*Jduu&-a3ɨ7VlPK ^1Q' phpDocumentor-TypeResolver-6a467b8/src/UTc_PK ^1QG6xj8 phpDocumentor-TypeResolver-6a467b8/src/FqsenResolver.phpUTc_Uo0~_qHN] }Lt IӪ!AW@9?#q&n)3231lJC돸3HhmD\x}{!3×<$&!ČS">qԤy|B)q@L4xJ/P]ͫ~HQR[_?{p՗ɔ FUbS-ݳ%X\v_@3-x"7^ݫ\pQ[ykѢS*',חR})@Ajҙ! Իhꄁc!cvCLLLc'Ȋ0`y9m^h612 z’Ex{i$9<4sjQlQߪiz`7,Lbg cְ];~PK ^1Q3 phpDocumentor-TypeResolver-6a467b8/src/PseudoTypes/UTc_PK ^1Q"WAs= phpDocumentor-TypeResolver-6a467b8/src/PseudoTypes/False_.phpUTc_Rn1+iTqmA  ZqZiسY׶{RyMUIe-_Rwgp ]z2r,lcVO[ُi~&>rwEwB,ئ#PK ^1Q)xo< phpDocumentor-TypeResolver-6a467b8/src/PseudoTypes/True_.phpUTc_Rn0 +xs zm7mX EGdIe4Mm|a>>>7MJ8#ή玷 ɕR\ #;֏/#\`y3EǴnmt0]" 1] +aqC_6PK ^1Q28)4/ phpDocumentor-TypeResolver-6a467b8/src/Type.phpUTc_UPJC1+>bQ+Q(yɾ&4/ Rwq/;3s{MBr2,Stn+! uܣLa>U&҂sH@a,΁ HY>3C$ :ap/ݦR{d$Yfж %֒CI _kg Z{Zty/(GsYNS!98l 9*)$ABB1P([uYa,{ iJ5Ē\P_z,'& ;gsXBnϕPK ^1QrTPҭ7H7 phpDocumentor-TypeResolver-6a467b8/src/TypeResolver.phpUTc_kSV;ab;@g\bL ҵ"K^IơusCWҕ}zvi,y476<NIn:J<9xyfaép;qʢ1"w1a۰ WD1KAhiʜc0#qϜԏ.܁g>_ҾUҩ0G)O`IEr 3Ltzx:3ؗC撏"\űx؁{4|p؁oλ"IoQǁ$Wq8i> 4썖".S%me$i )GgGǽebŨq04|N S<oL{ }']^~e\6FӇG#'cIeoxq9X`45 ~o΋n FiZ(=`y=㬏ݲd։Ȇ.#7ZVm1VӷJ\bSEœ s{Sal(_5[=vD,$|E5Բ:CxhCc9jY Y)DnNqٰe"_v˃g0J[g0J3IZ=Sy>}s:[Ez!1H.<0RvNf9ZWWVֆw77촺yGo[NX^ >HǧR*EA1XQEdQ+C@WFHO8Il$vKBrZcpI/M3r$ p&-E*3$J9|߈Dq҅<N%|ԔUw2.WvYNv B<D[!%Xa/6hBn܋?_DXTXVoUMԥ| IT@@$XH(+z"}4WNO_Ybh@rH,c!n+Fv<zՂtr=|bdB3%V^Sr2KW%[ԿNxJ9'r߀GlVj3_2hql`?}J*hK%QO[bfٺNKoɶ1DtO$[eJ'|#6po}r_]pSjVhjq.ַ!-][ uTו/ZrCݬ F2ڴx J(KMB4ގc9=F5S8bu@9XSwڔ[8xtQ~h@ʤc$Ҵ0ix>pmp}EE}17sg@r'tH&&tF1J:ENnl8L|A4A4]$()(5O^uJhuC5)4S_E݇2T=bc|Bоld[n96v^rGs AsB 5V_a=#^15i~)Q-a> 5 zM?s]ضF#VaK0pTU4TK\AHF]"f:uQ%ʢIؽQ}/DŰ@ZLyj41\,OYe4 jihD' *6kDz71k+kxOnpڍz~J: 3Gy8E'g҃y)5^XcA/C)o鋺ETF;!&Z BΑG֫7 :V2_$zEWQ{+n4ȕ!$6b%t?PPQN5](3o' >Aj> >wT>̢|M.RHWi#jK|P2%5-o3:䧫ynbQ1cS_fzS%[.hۆ4u|] &P ٔNiDpr kB- #V{* ҩxN&a܍Av5,\i4DV@U"R}YUO~*$2 '4FUP8%jVŪ,UcjfT 6TM-Љ& بЩݨc`H<ޤQ6M &V,X=JD9۝obx4[~P 6Ѝ:sG cAX`7X?9T o 1ApLPV:FѴӁA@ࡔ1uLy1@B%)/|qBF;%}!z@Ys{Uk/ZT=I's4R䂠׎/ZZ&^֛~¶cGfAZBO vOyi:PئY2.]2mAe@U V>y/J2'$\j>-0 JC!dt,W@F{ f|uڇ l,<3)b tBXr:AJbBp9rk*+=AIV)PxL`q={ 3om4R!#т _ HD%HsC`Z$tD~ͧ4L'(eSC+e{D-0y-%\,{>,$= HkF/H_ΗNs\rcbƜ_NMLǒ[n$ y@ʐ_ǩ)5 jd(I*ƣpC >iR/A;ͶL OtX5&hy o|ԥe+gJr2Q^8K3q"Z݂֙U[NKoU(a땙a!iճ됪t4گ{U,ܪapeE9[:[jt*'R"uJNtA}*5VU-P𹯻wn7vͬ:@]>tz[ۛʺ14L&H T* ˡ!"݇]V* PK ^1Q`! ? phpDocumentor-TypeResolver-6a467b8/src/Types/AggregatedType.phpUTc_VnF+n/(Cm9v0E]b#R3C)FϙMQ4܈soߵe:R*dńVhK PYWsc?&[2]UQG-ץ%TɌMt-T͔ڊζw^ϻۏmyvP.rYi'm1S=J6Oimf>\eJq?OJhN.cf2IQi,}EřICe- t7浰O "E#rÏKZmE sNaUu:JĨ͠@\7"TwYIL˙NK i.Xs!?N¬%|P|Bt\3YGC]FTLugŪbfġ8s`I2oecϵX!C|`Bv36QUj7k:Hgf 8/7jYт< WwPPnbXG_=vۭЇC1-jlUҴMr{Pg,Pio=&]<)I'Dg'N7O gPW}-ЖM/NR^M:zC\ʂ"R4J 5wG ֗`5w\_ 1RpEɯP@Y!cvw~zv^e@,i,'λ\!&iGj@$8- ۋ2/GO'j idJcζՎ NUWb_IdW*ۜNrig-u4PR~od\G}ݽ82rjoXs0"0]jnN_lKb=ÒHV: U!-`LUqXSy<GUV;:~ICPۓ+DU{J~PK ^1Q]ַ7 phpDocumentor-TypeResolver-6a467b8/src/Types/Array_.phpUTc_UR_o0mUjH &`vɧ9 "U5=ڞ&aMvhr%&)0 ?nImN*x Jn;D7qkxdTLS.h"i{XHT mwnX+kC;ɇ)~mX/|x_PK ^1Q~Te|o`8 phpDocumentor-TypeResolver-6a467b8/src/Types/Boolean.phpUTc_QKK1W̭h>P (hT(dv76db;Zd. {yEhMomh`9| | *O9F>[ ʇh@: (tGIEww{ZQFI )Lakh kI>GLG5nDmYjV''LA2#UѵZN4f,mFx^ Cp=tP ILS&Yx)K#R.1CD1r6>Su?%Np>[ {ҼKf=w7MX?qnۇcHY;u|vR?ćPK ^1Q$&tm: phpDocumentor-TypeResolver-6a467b8/src/Types/Callable_.phpUTc_QKK1W̭ZW(jAl$l2MB2w_xr.YvgaBhTVFxL4 tZP>4X%^:GIƻ#%{3rQV{4HLMafB [CwK9*C\Z6Pk MDW3{7B89b q$Ѷi)֠3$^YN ?{PK ^1Q9:; phpDocumentor-TypeResolver-6a467b8/src/Types/Collection.phpUTc_Tn0+`@vRi-z bC*Iu[{ `Ǔ"/(D0]c5OhN{GQ4:8rn TQ%UzH0RlB@)4D!3r%Pdmq\_\.gsfa ܩSXsi1 Rkg'Onm1Hh EdK4 S&N+/G\))`$ZT(pgMB&"}?,?R Y%im͓0 s] \͸9Eu;%:n>㦁גb5@ATuFȾ[9XzǧV32 u_έ/es&R0cY$[9BcPl4>nmEdajk-gF{wzj0#, %xJ:-?<$J2݉WjZ婪 8;=Ot H;$uxr잎78yھmv.oF%0o_=Cpv(HI*mQ{Ή(H"uH/t.?mPK ^1Q ݲ49 phpDocumentor-TypeResolver-6a467b8/src/Types/Compound.phpUTc_Sn0 +x$u[ +;Hʒ ɼ^J4l@z||[_j"Ҽcn(E xh)BMA^WP?;whمR` iF] *93ͷ7Tǭbث%u۞=q+7%>hFN . 'OW˥.]h~YVuXIC@@PG[Fam@ŃD^'kc ^Š5)O8]@uSZ@ IDc )}4NB Lmg w<ʹmy9]%I*@RMSսp!7щT4Wв"+Rw٩ Wvm$vhdžQ-u]jk0W@i 8 phpDocumentor-TypeResolver-6a467b8/src/Types/Context.phpUTc_Vo6_q}M4]`)M,]w;R$Ŧ'y;*$EYC筒o*t7$9?=Mr SVz0?K m7Ƃ(@jc" t Й1T Z[)\s?}xG\xX btc kszCXDJbPz ɽ. hj?O-Jts;f_1+P2K@kTtXP[紾HHN?Y]9}h=ud K0RE,JT+tZ3=xXjfw`֔TJc.Sm&j(D,]U䤘LjGYK@a @f+sn"L"Y \XJːvcjBC.7TR)l !:*vUt@%w~50::ZK?lDc#lp= tvm:0sQ իW)f.`w fhg M!Cf5]'Au$[Q??402.N)M0^ۤgDxe gd{=2hpx`s8Jwwr#w73Nym]jW{m77bsw?[ NE{fmy@%V>c;?=K.|5GK0KG6i TmQӞzfN4ځt|4~xFܦ!үIW??PK ^1Q-bM j:? phpDocumentor-TypeResolver-6a467b8/src/Types/ContextFactory.phpUTc_ZS۸=z\BB~kʗfh7[!~;#ˡJ-vо!H/Z~vy3/uOÜ%7˗-ςL;\xJ ;`<93Fi/?f&|`Mc~GEG]2E%pt<1ӄj7I} f0$q=|i. ["mPԏ^o`~ՊK-\i<MOAX0NaѮ:4 <6G:5[iTQ"h$LbH9 *&x%U37L8`(w^N6ǃhLp2F'nqepE|" Cwwj!d0r.N=>x8NONgrBy6?t0 ƣÏ=3:?;n]LI>N[q189>:>ik%Mg ,KR$ D!º0,> Bƛ\F)\ 2F r>ɈhY*"x|'E6xsd%uD`p@ K9)k %;MBA؇rQq#Yv($R`قx-(wzO۔ݤL<"X-l핬2,(?ֲR]K5+>"X_ E4ЅWBS>V.yBbv#djN"A`OWg%&62jZh^h`V٘N[ =PO/D !(`Pd #h,bX* C٬>Oؤ7qieLR\udNCIj5,Ty\4Ǿ=pK\3y紹QPڠ]||`A,l i \,pQ\l8#Q<6ɯ cM[YDݮE%K4L"/m3ʋl"aniv?P /qbyى6X0nnQ[yP6୐l0aػ?:"|GB$2Kj]V6Z7t7~+L4Y%X5g =374\y3o3 E~-#Lg$ -{^4I!r'$9/~Ovd ,iSgJ^/i̷ݘ5|h6\q˦_i@c**5g~i)Ezcq_U.o3I6/g9e1}SP]Xfxbi՝M`oo5wZw/Vhzo";*IfuJ&I^7K-iN i1@G`N| j>n,٠*RNe{MC\_໡->n?)t5(#dOJOqW=m |R+?j864HBu{E[AV~g!c3˜<[ֵ}^SJ+./cOjY?PK ^1QtV@-; phpDocumentor-TypeResolver-6a467b8/src/Types/Expression.phpUTc_M0sXzv?h҅Rdi!(%!e{Gr!4ؑf>{׺Pjq+IK9 Fb:0VF_TzZnUSVM#Lm}'HYs N്myc1KGe=jVT[E Za`B2kOKnS,oxZFt /s5"`1\(:f4G1pQ`үed̯LO_ߞXA _yqAn.Xi2"eTYvY?FӢ\m7o47>lp.ދFA9{ɸ09;X.5|Q0IFOUܽ v*y=#EoBfP'sسLAm8>SDH/ n4zE깰,ųo`'GO'mRd1M܃K_PK ^1Qgr_7 phpDocumentor-TypeResolver-6a467b8/src/Types/Float_.phpUTc_QMK1W̭hUQQPl76dbw\fͼ"AʈD([t~29NL7 :c 2zUБ3n+Kz.[ ʇh=tQp$sww{\Qu`/hSصPP| yoָ¼ijNd vU~*iYڌоp"mAzI?Cv86ÐI+8ɆYg攭 &.VH9#:B)fw-jhX0E]YvyM}CnP|?WEfCwv~)+u >PK ^1Qpb8 phpDocumentor-TypeResolver-6a467b8/src/Types/Integer.phpUTc_QMK1W̭u.^I(dv76dbw\2}y牢Q`)D4xMX^{'tJ獏@#B{4H k#\$xw7ۊZ?ʨG$u]&԰54r$B&ҸWpa@=#Q8i[Z8p Sc{zy*iYڌWB11¸nလ E$td),VaqC28BЉQUrx@%4Fg $Z`gC`[ vvi,m]u 5G 8TKO9 q4[ߝ؉OPK ^1Qz;= phpDocumentor-TypeResolver-6a467b8/src/Types/Intersection.phpUTc_SAn0{(Hm$)=ii%mCIU=C.SuqvfvvyɵX龕@h&|lM8e߱/KHb=ŖҺKFR"-%S[ߩ(֜Ӭo/|u_on~d[U]'plKRTzJ(h+ iI<;f(qXV:- Z_~oN>!QYq(E-mOgB49&Ao,AFKxGtJW>[ ʇM4ˁ@: (t[QEoUws}yhk@BeB kCg% ;3k j DiT{qF'GLA [TXOi3!bXb a]eŎ $iC3JN퍓숕)|"t:yIE7- |]bH9g;-BP\+&gCȉˌcxaZ-^5 rueh[wl[Ngp^k3O C1t2u&["VT|9KarKNۊ}_ˍK$B6yBf!eۊPK ^1Qr7 phpDocumentor-TypeResolver-6a467b8/src/Types/Mixed_.phpUTc_KOC!6FGb+ s{\ 0XwW\s9: }B2(Q4V0B4 <&Ag,AFK/:qeGւ-uO k-\ x۪:_.UzI )tm&԰5 $BH75nuDa4 F'LA{,P"`9Sѣ}W"&Vf-xzJ?!I;a$[3NrV7E3p^$A\b5{]Nc|JET}Z6y*,bg֫_S[U߰Z_0z4zSRѰ>[ -|+n5o-o`l?v<9|JJFE账ŻPK ^1Q"B1eG9 phpDocumentor-TypeResolver-6a467b8/src/Types/Nullable.phpUTc_[O1W "J˥*!URس)^۲ljޱ@B[/|p4U#i*`:}7|4ண-Yy| "uѱc)+_}l-hVr,itIZ^1yw o e}|y}{YZy)J`2%q'+’|e-%d"뱏sY4S=Dg[p=ܕN)z^ٌ}SV!bDAn fŎH'JotUh-l?\d%' ٨zۏz %(4ͯ"XXiJsΫ -(DZ(F8(dkf-\Wi/ȩ=s4Qy&AΈAt͚aX׮sPƎζp[ L@DǾb(ʞ1P ԝxwNFkQ$g%3e_|M+ծ50+K9d~|{:e++t?}x~[+OoPK ^1Q^8 phpDocumentor-TypeResolver-6a467b8/src/Types/Object_.phpUTc_TQo0~ϯ8Iie/*746Q;wN64~sfK$9fJ8dfamO^Odt|1ܗC!Z(ɪ%`ܐ88%BQ)k'esP2C.[ U(ho%1}z7rJQx%WsxM2$[JWFD47иD%z+(- 3pPq+d~1p3CA`0uHQԥ5~+*OoC*^`vEtB@t6ZKײӿ83f! .?MiÁ͇a;:.J>ky@n@`TŌp2 Cz4m [ϰTP[/D.UsqԅB5j*3K[' + I}Y'W" DKWZI[$-UKYQ][gVkɡhONFt`tf= B͜3n:tI^͘LpUzgQX~̪Ej[&axdPd'8wxAӃq^'W1"_zy$46C6{J6 ⠂`_:H_ !%- 1ts'9|MN޶f܉ڱ-kUL&E<C|cM7u:;^*~Y+'@|MBZ?PK ^1Q 8 phpDocumentor-TypeResolver-6a467b8/src/Types/Parent_.phpUTc_Mo1 ]-;ڂ@@TiI<;$JVC%<~7-xZ=go_]3l66p3S4H?%N4s*3B}`@cqJeL)n!ru_|v}}<[IH țtf ;`d)kהTCC91h!xȈ8Q^4{kH|q~\^^Q};ͰohaIF٠,[ z8t2 "ԒP%?(%iNMxZSуv%YȘ2qRj1^ySGAC3@b1a $H$TtXTcnmQ Km_~M{WFkn;c,|rMzkCP FbE4 @i>oo[QnǴe|"w!N{U?PK ^1Q٬6 phpDocumentor-TypeResolver-6a467b8/src/Types/Self_.phpUTc_RMk\1 Wdפ!BI!r ,~ډml9K(ꋍfF-EtJ\aP+L> u!H0&6cTV\&SrS Loo7+S*&r@ͱWn}+{Cr9T3onn1u0W}@=BzԻdۈRsD~Ih@[`SLtXDS !4|N|cy/ `g*8/֍7V,r#G[5łdl~uьX3 ϏI$`'/o` 73 .1 HSZ$Jo=d0`Ru 0( *UD@f+x27%0֦EYh8@MAJTvf?])N4ȣI[5/0c﵏N$d $ܝų`LURD+(H;(}H60ȬUzM,5o~"UjjY3xTd1QnHR  K#>dB~YEV nFȚ&uޭ^t/?PK ^1Q/%F&Цk3;%2Wָwaګk7B89` q,,YTErQ"`93ѫ}.D #[W_%S n=:H I C&Z:$GgeJRW`ΩHPHŧ(*q ̑rt $3;CB*4}Z6 b֫!|3>~a"W4>3؛{=brp:؉/PK ^1Q=K5 phpDocumentor-TypeResolver-6a467b8/src/Types/This.phpUTc_RMk0W̡d٬5ihiB,ȒFYޑ&)Ȗͼ}ǨEt̉ o1_}ume3?P ߖyS$hu;~1/PK ^1Q# phpDocumentor-TypeResolver-6a467b8/UTc_PK ^1Q|8* JphpDocumentor-TypeResolver-6a467b8/LICENSEUTc_PK ^1Qܵ\' #, phpDocumentor-TypeResolver-6a467b8/README.mdUTc_PK ^1QqMa0 phpDocumentor-TypeResolver-6a467b8/composer.jsonUTc_PK ^1QF|B 0 IphpDocumentor-TypeResolver-6a467b8/composer.lockUTc_PK ^1Q%0 phpDocumentor-TypeResolver-6a467b8/phpbench.jsonUTc_PK ^1Q' phpDocumentor-TypeResolver-6a467b8/src/UTc_PK ^1QG6xj8 #phpDocumentor-TypeResolver-6a467b8/src/FqsenResolver.phpUTc_PK ^1Qҟn5 phpDocumentor-TypeResolver-6a467b8/src/PseudoType.phpUTc_PK ^1Q3 IphpDocumentor-TypeResolver-6a467b8/src/PseudoTypes/UTc_PK ^1Q"WAs= phpDocumentor-TypeResolver-6a467b8/src/PseudoTypes/False_.phpUTc_PK ^1Q)xo< phpDocumentor-TypeResolver-6a467b8/src/PseudoTypes/True_.phpUTc_PK ^1Q28)4/ phpDocumentor-TypeResolver-6a467b8/src/Type.phpUTc_PK ^1QrTPҭ7H7 ? phpDocumentor-TypeResolver-6a467b8/src/TypeResolver.phpUTc_PK ^1Q- J0phpDocumentor-TypeResolver-6a467b8/src/Types/UTc_PK ^1Q|= 0phpDocumentor-TypeResolver-6a467b8/src/Types/AbstractList.phpUTc_PK ^1Q`! ? 3phpDocumentor-TypeResolver-6a467b8/src/Types/AggregatedType.phpUTc_PK ^1Q]ַ7 7phpDocumentor-TypeResolver-6a467b8/src/Types/Array_.phpUTc_PK ^1Q~Te|o`8 :phpDocumentor-TypeResolver-6a467b8/src/Types/Boolean.phpUTc_PK ^1Q$&tm: ;phpDocumentor-TypeResolver-6a467b8/src/Types/Callable_.phpUTc_PK ^1QUx!< =phpDocumentor-TypeResolver-6a467b8/src/Types/ClassString.phpUTc_PK ^1Q9:; 6@phpDocumentor-TypeResolver-6a467b8/src/Types/Collection.phpUTc_PK ^1Q ݲ49 qCphpDocumentor-TypeResolver-6a467b8/src/Types/Compound.phpUTc_PK ^1Q>@i 8 FphpDocumentor-TypeResolver-6a467b8/src/Types/Context.phpUTc_PK ^1Q-bM j:? JphpDocumentor-TypeResolver-6a467b8/src/Types/ContextFactory.phpUTc_PK ^1QtV@-; VphpDocumentor-TypeResolver-6a467b8/src/Types/Expression.phpUTc_PK ^1Qgr_7 XphpDocumentor-TypeResolver-6a467b8/src/Types/Float_.phpUTc_PK ^1Qpb8 QZphpDocumentor-TypeResolver-6a467b8/src/Types/Integer.phpUTc_PK ^1Qz;=  \phpDocumentor-TypeResolver-6a467b8/src/Types/Intersection.phpUTc_PK ^1Q"PB:: ^phpDocumentor-TypeResolver-6a467b8/src/Types/Iterable_.phpUTc_PK ^1Qr7 `phpDocumentor-TypeResolver-6a467b8/src/Types/Mixed_.phpUTc_PK ^1Q?*wj6 bphpDocumentor-TypeResolver-6a467b8/src/Types/Null_.phpUTc_PK ^1Q"B1eG9 dphpDocumentor-TypeResolver-6a467b8/src/Types/Nullable.phpUTc_PK ^1Q^8 fphpDocumentor-TypeResolver-6a467b8/src/Types/Object_.phpUTc_PK ^1Q 8 pjphpDocumentor-TypeResolver-6a467b8/src/Types/Parent_.phpUTc_PK ^1Q9sq: qlphpDocumentor-TypeResolver-6a467b8/src/Types/Resource_.phpUTc_PK ^1Q67 EnphpDocumentor-TypeResolver-6a467b8/src/Types/Scalar.phpUTc_PK ^1Q٬6 nx*O Q O A)%"B%B8A&^UVy)LEؙ5{7F$ga5nҬ 1lȥu$X*%0Bh&[wJ;^ )H )c?h DDpFF OŨ"`JoתJ7I@l 5n۾/W(eIʙ'P) :'j6*F3s8SZ3~w{|;ns~|~:xz{Qxtwv<8e(ЀRdW\;ц fPM+ހ#Ϫ%c)t(Fs7Bs=`.[Y'R|i@9Q}L+5[i}ԍ&vL l2:AQf$T,/`07Br8,bBMvs­d~ÌQƞ^@=Z۟Fz>]e֬Q -SWa/LF-NAzR=ҐO 9`],p>d%m+$fi0v mhhvApUw+% x¹Ys3&ԋ[!RaݍVF57jbBd 8ud\T64wUxUBcPLV?S,`4(#2%&T/+.zMVa¯-u^n#I- _rK#"dye(6zZ5.= [՟ N LY>G"pӛ@Ѥq Ѱ(&9> ).?CKayh'iތj6.JV+=PK }WRP|8* phpDocumentor-TypeResolver-7462d5f/LICENSEUT.4L^]RKo0Wzj%qo8q͑KpF;CV] { i w{ Kmr>}??AZxmFUv:dwop1.d-=}3lC3N.6nthag&}4|ăηco>6q0tj%sɆ80pc;;^h|: }y7'9ޝ#&%m&㛟 a`PSCOx[Q̥ǯN\`4"g:+6R~~9 ?3Xjv^}DW tUo7;{[QD!]3O36%VKZEf";^c|FZK^n,J,\ 2י,as‡,#Q@7()j+NW̥&l)MIKCŵ:T->CRK,yDV́xsb|5TU[-WV*&E.Th*͹,x<E3jJP8~$*0A|nd-ZִVEh8f+V _.-k9by/{dPK }WRPHU(+ phpDocumentor-TypeResolver-7462d5f/MakefileUT.4L^N0S7dTBiQBb9ǶjJkIMڑRFc+l$4 r.\A9(5rpQG@L{6uU2޽вx7DYFv?nXh/ aFZ6Ρ<3i3Id|CفyPK }WRP^$( #, phpDocumentor-TypeResolver-7462d5f/README.mdUT.4L^YoFŦAR`K'@4(\+qkVtmfv\4 ffy:QSaVKw0|2ԍLe:Wpt'*j磖,T6QccܟwG.j:Nb̖I*Jc'zr&Vv2j)n^ڐéE=[HW*;P dO atn( wTzs).>Y8u/z4#*/”ʧQv7ɽ$7\׶aFY:B87DdrIh8T #R: S;l%Qyz_^'k.Juq7g/ߜqlC ڍzGL;n|ɚ+iCw%ek}pwǯb]S2ddB6$xF%-z2skL^5x}YqiJqEq [PGy8zA<5IJC6z5{7Lw8 {ȤТz@$"ɽ y.q΁~ "^i[Oy47Y!]<&t1uSi{Alލ7u' z:#bt+@n1\(Yx'҈EOVZxp8Tg۱>,esD v[qS:cmnh*I٧ƔV8 u: rT[Ac}?U[+NaeEfݡ!/~{ɓ'x"j?Ovph֎̄^V\']lt$~HGpZ-: rr:mռ%9g=R{ n;FQ>mM}WjƋK^|!gg6G"_#q{WPBK;e=`*u:D?,jT HMEwNȂFƦ!Mϟs1칸CüNM1cN3Ft{>)j]<=JJ qKѢk[:ފFaA D< Q`B[h\1$)-۰@v{Qt0d0gcx˹*/ppo:&P}l)1?7a妪?٘ieYQ. } l84\g&K~n $ NL;(dA]HPN׳k2{$v^ M? DZ58no 2/͜/_W;?cvV[U*W3HKIcAOYBvts&E'UdM:լdotc"~FJWJoij[p-5wtwfAߵx!(7 zg'VɂI&x\hk3VVz uѰycZm_LӥQG(Z iyӚyO\C몽m elT1SL?!:m.ִ$o/1Qmo7&/D:o6(_n’8ԼU,v7r PK }WRP딿=? phpDocumentor-TypeResolver-7462d5f/composer-require-config.jsonUT.4L^MN1 DQpCE9 !ެM1v 8ѼdBzƯC6cxsਜC&'sRWSisb\6e_Uc{D#Qgs<1V8*K:&۰hwg<9[馟q!1Pn-3ZPK }WRP'\'0 phpDocumentor-TypeResolver-7462d5f/composer.jsonUT.4L^KO@I״јҨ $&̣;% L_7Φ3;s!cQ3+ YC1Y4(s' '|߰'X#fv'blᭈqBb MXr<4c%*L_͔nculwg-7l&Aէk h.Uh^UE:jurQc>  .drUV ByUIrUN]@ VlNqw[0&OܗfY/>a|5i:kip'K #_Dw]\IND,֜\8ٗYPK }WRP\/s90 phpDocumentor-TypeResolver-7462d5f/composer.lockUT.4L^[r۸ڒv\Im?eK/,dxs+?qӂ&y9ee,(ȍ@rJQJkZ$ Teh^5ռHDBݔmĒ~Gx**NNF"&h*e-&5*JPnVzVdlF#F#55Wi};?fm3\ϮiI9"Ȫ?F*%-1b 9焮~āXƶsǍjLn0V>%A\j xNǜf9ċU^Uy=lFVmiv5tLn U*LN3`W6~M4{_(8}MpL}?\#iq^yly2!|53)^ax'G IDdSY7pX߅=h[ީq{U~ Ϲ|c9K8L?IK25pΰ{F|Y>iw~kiׂ^ z^$8?Ԟ,;RY.ۑDU?_na7"ӊ=qXBhKW o%eo:A ̴o`GnmRA8e݌@HjA2GYT) ۡVQ7t~[;?+<Z;qE*&D\0)HxeGN|wb[e%?xr# 9^a(gQci1 rSG4S/m{Q`_~ z;[`owWiqB"7*L.S<h^j/tS't=J&L*\iMt{f S@*د}(O-M3;^X~x^Qpb?lqN"-|-+.UJuLFr'6{)0 KtK+8vi=u Hm)Qif˦ADCefI av ͖[+lbp*0 -n3jZgUA`r(x]g~ )u50`e!D oÛInpr 2O1$z{X6ZV7# K*o+27~w\:y~̢}.d6 qK[ڱ]1sT"H?$_iT%qP;籇. (I=~DYZlZGi@pYy=XĆ ǻ‰M<$~a:O"}V% ReCfqBh(R۳qqsEC8Z@Nw^풲,=wuVOI% 'k_?q'Y^?zz=2Ab IGqOAvʁE#X[&cpNy9gPK }WRP3, phpDocumentor-TypeResolver-7462d5f/phive.xmlUT.4L^ENK 0M]iڝ'Э`LhEoom3,aAy=,ޮ]}`REJ=Stb)C1X,̔FUq9!w9\/빼,44TPK }WRPn1 phpDocumentor-TypeResolver-7462d5f/phpcs.xml.distUT.4L^}Qn +j;!\XUu}N_\@;;38ΣeD4ʧt". &Shw7PK }WRP\H , phpDocumentor-TypeResolver-7462d5f/psalm.xmlUT.4L^n0{] M.EZ,ܞy}}s 7yF4&1!阔+'iX2fy_h** E,3c%.4eSFy~Y_Wh+Jq:1.ɶ*פ=g G8189m(lHݭ̍H1]A@*EATrKjU`E*7,9=rd/6&Ll|@c ٯF0@whܿT?rL>PK }WRP' phpDocumentor-TypeResolver-7462d5f/src/UT.4L^PK }WRP!L8 phpDocumentor-TypeResolver-7462d5f/src/FqsenResolver.phpUT.4L^UMO@WL%$chԆ @gXvu]c'`/<3o>,͂`1(;mAwo/=Nq"e@&@g2ΟP:f=ϥ"$9EEj s,F B$R=EIцcD W.p4Z(ϤUalu9IBh) N8ԘRswZ"zBEl ETՅXFj\1fZgv~S) >7Ʌ>gz˞{K gRS-F1A-U/~d)0ahڐh{8N 3TJ ϱ[FPhdp}9;R;=V5Ilm8NAIW+~\9اEStkidi4,km+4t]X}cԨ<&sćar(ec:هhhXH+h`K` i9r:˄3M͏\ŷyo-w[b<۠'Si4ojBHETex#ќί( J9Z{ e Vhd`)XosĤJtpN!Iy|Z}mfa-/QaӖ%aEG 4-{Xv-]݇)! w DC fH4s*Nu_h7T ޾*k¾Hp;F*mFJP3]YۘQOtKZ kPK }WRPﻸ'/ phpDocumentor-TypeResolver-7462d5f/src/Type.phpUT.4L^UAK1 9هMQ xvF[˺cݴ\Rɓ>Etƫ%a-A[ L> HN:3"}&SO\Z e`0Pdp :Z`,2"NO=kH}zv Xٳ٠,G| ts$a^oѣ a/Ӫ |[EzE@C/Mρh >5x G5=1OdoBL"ǠQw =GY0ֹ`-O/fz9^{xLk8zDz8$Âhwv3al-1̒'@,alioDl JQFjŦ4p}8 Kc#]_P[ (PATj=ph7kj'Kf#/LymȒy##'v[ p h`/)=p@2(#XmzG.9񎅘)7s6i@|L؟ H׋n *e0 WH(;TaSˇfmm6SkI=;Cb6O"c(S\*N`'awp D<9L­_2!;Sw g?dF "͎!uZg#Hp",C<2@Y\. b'8K8^ ^3F8w 1QZ5;KyE1((G3 ;R+ļ#Jmnyv6U8AJIC`Ng$C:_fDQ 94@D/%~oU0Yʻlۤ4㶉$ lU^"&a";鋴7fCc b 2֪̾eP@>笴غtVw=?vGG~[cE6!5-g@zk}upu nuF[dh]#d)^ٲd8-Qu*PN (Eɐ&D) "V(4 ,'zA!!.TnOQ_뎖aqZ0m3D$mC Mva03EcT@M^vdl%>3J,*B+Y Ҋ]vJZ  ۦ"вq)(Q ov T&v4H@µUryˉð0dRe>;}.v}P9 %|/z"i2FxYk2~VǽJu)>uϟA£;IZ{*TY uzy-K*(ŁDSNj3ô7b# 4sTWxzBxc9 yR,?En$sZᶑ^p7y+tpyG,n 0Oo 'Xe2juʚ*OF=qEDak]m` ^]j@uK`ՠJukjj| ]N?H>_VqZF_ < /i4tge{EVEž(A PT\Q RY~\؝^(B ihpzRߌ~9'!б?k7}*f7~qSivσU.w['٘+\bRp!]frZ>zS6+B'Ng,/?O)$F\L9LuѨ{a?mְ$δˑ>Fz%դ~%s70cYQلBTz $ b x)kUJkuT&NBe۪uF)9KQMRNAwe[_Y*bmܮ+]td)iy;'f阋EIWqV z}H?m{]S܎nIJ~N@'^[b} ,p@';?p ?πܐy l26EzO36e-CJH/kxCJ?'9 }P^?fͻH_EF"R@cezb!оW:*CMRmrD's.NQlձR`5GuM5<#AA6*[X 58/eoHڻצa G7,7Bm3sm-{FˤaКa2@‡&: AhF<Ş)D1J UI PQ {"jhɽVHjjR'J#,1ݶ4SKS&ADšS$\41˪ǟ;XX=d1J1")*0ɍ[zL"z| j)EbO_C_Jj:_gŷDf,|ZNՍh!<{rHb[0&EEMޒ3BJupKE)'-%J RKr}}’.ss$|?.Lxa\?Rg9S9$@5M=οw3 g8*5(t׀yecF_|ى5Vs1τTꞒ{c\JiZ,w-RiʰM#v5 ,d++ߓfJUMU _ȑsK,4>Fs:cUQe1=iwvYp0`J7ԢT\ G[go( BNB=joBĐ !U+G9byE=\9EӷWqX%Η5BLyLmw(Wp_g .8N=*E/OcqL\@jƎ!?#nZ+&͍iVb_.trRFhIٕN5 ?I);s'QM}𢳐4C( FC5Vbrzt/HPO8N)/gZ<ŎMhOy:F>dyJu){‘cōuՠoZ*TA'`?WMt>6ĮCpf^$!ŕ2EGlwkIsP15zВ}3R*8J zēuPK }WRPԨ.7 phpDocumentor-TypeResolver-7462d5f/src/Types/Array_.phpUT.4L^URn!sKb9kR/i&JSRZEvzj*gf 2 7ށ?P$-F:M9y >]}b1 6 :c 0f/cm󫏐5A[ ҇1΀N5\blCoohswonn T3 @3)L|Z$&RtPpeB]:pXPeB8Q sGYECB]ƈ#$Y2Z_-ϧ=* !%WC(]_4>OulHfKcMxIgӻ'\bJ3O~gR듢 5P=3Am~98bv$))@n*TmD<R^\HS35s&x۲0xPK }WRP@hO8 phpDocumentor-TypeResolver-7462d5f/src/Types/Boolean.phpUT.4L^QMKC1WͶH^[EVD- %/&!X_x2uQctu1 ьFFMXy1{z.[ ʇc4۞@: (t)\^Eop;Z UG$8um&p0s$B[5nDa4,T{5qF'd vUѵ^N4f"mFxn_ C a=tPWq2seLB-E1Q)G09 )于^e83-hΜAbfڍzfxa͆v&v~)'V!pֲi>PK }WRPK083jV: phpDocumentor-TypeResolver-7462d5f/src/Types/Callable_.phpUT.4L^QMK1WͶ.^[EVDOB&4 RI“sɲ3{o/Ш8J5Lv20$E7H{`Wy|lxL4 ZP> iFKLzww,Jfp_qwjQ>$^&Ц2;%" q[5i۲PUN0ɸ?^[TESoFf1DL0nZ; i8 YO{ fǁM xGPjK]bΈNc4|EJ|:v9vkնkr᛹j k+NmFcBuSOX~28PK }WRPW2_}< phpDocumentor-TypeResolver-7462d5f/src/Types/ClassString.phpUT.4L^QO@ )J)VBhOH$7wٝ. L+yho翝iDÑ'$E?8et2`wP)߭pNleؠ! E: ZSuC L ZI4Kʺ eh5 op\].oTG t@XNQf68ܨāB+iړAK+ jÖ Vp7Xi.Z@kb>~: |](8lrRNG!c:/k`.mڰq!y \lDpj B8:A(RB_;g_ҢEK@Mײ=ÚwΧ`ZIk8;H'}sՍr|6HzgODok`V+??Y#%N}CR='@mHPcVP|6|R%'WI[dH݆0 F{_^ m8{#OyCxgS PK }WRP ~y; phpDocumentor-TypeResolver-7462d5f/src/Types/Collection.phpUT.4L^T]O0}ϯҢҊI{)1&Z'$pؙ]IHAyhsϹ9"I2Zgwn]=>&po/=] t/qsЏO6y6y)%p]/0% kĜЪDFW!S|nLxua+tBZ. GJaT Z8WCi>fN$Q m(ns뺻% }tӢ:|㉞8 9 D Md, q3O7jLV=kp``4J/U1x8;o¾~d^ɃGہϸn>b^kI)3S:z?d?yXzƧV32u_ޭPFO2kY ٌ}yJ$~L9pdBC*?D #!tJ 'ƁlJۯImZXEWIaѲkEK〯#KgcUcvz6 hەm:W9W? y?ڼ]i v/M/Vs7nFݿpcB-t1 RRKWV(諣KI{ĀqWJ̓f_hDUӃVcH#.mwB iqVviZ[14]'aI^,zEI6?PK }WRPX^߶ 9 phpDocumentor-TypeResolver-7462d5f/src/Types/Compound.phpUT.4L^Vo6~_qTR{m5uHCK'L $em#)Ŗ{h`;M$IY- 6l?OΓdvz)TR!k&|78+VN)̼oڐ)Ȳr$TNXYP6+Vg, ~zUFXʥGl紑Xݚ(E-ry3h6%gIĊm#pn—k.jaKQ`i-hz Gpw=iG xo( ""=?OCf} n$m~DSÀ*I14d9 E`r Q[>Dy ( ЭkZϺxsZ2F3|2,NĻ*}lv!U}Gp:7}Nc?B[kld:ς!^%/A#6 PK }WRP?4 8 phpDocumentor-TypeResolver-7462d5f/src/Types/Context.phpUT.4L^VMo8WAm^un ƶ[45ˤu;CJb;MP^c7H$IQy*I md@RX&:7vBx獱s* Y=B$jG!tfFxemO>ȡB> p*F[{l_*i6Ax0"}Fuq[9ⲠR$u_02|l0oA`j)mm4i6_Ŧz,z7Yh/[m'ɰ$RZ&ASjIrVF]1]eVN@}03xC7KlUaWGK)f*`ǻF `h% Mr Qy$cβ+j^ÌqqM,o"ag_]?'Gr`7.x]Qӽ~¾=E_Y }^9h}G^c3hX Ak^ݚ$zGc%3-z)nw &ćq`4t8b& m?#S&_& 6yTMYb/~$PK }WRP 0? phpDocumentor-TypeResolver-7462d5f/src/Types/ContextFactory.phpUT.4L^Z[S#7~PRTl&`&٢YR#eڥVq{ZݶCF/ؒEG;YΗVȂ I9%K{?ퟴZG>r3R2bF I)$DtaHsFY YE4KByH(`<|Q2f#RtWgx<9hJ{$ *sX]$A!3#Qc. Z.X@~Ħ1 P4?Bd¦5uɟi}1S/["]Z9iN%Һ ⯫$|Nr̛!cMD|*@SI~?տ'ןCw?R zϧQlQƟaޛOƃQz䮌oFsA+g#ч0pdF%#W%" ~)%9'd)XLY,߈PZC $~9Py|DcR"G}"JxM@pBZeb"yB=a>cQɯG4%rh7``1/.[D8diECf1i^@_DA.IZtc ^a M.j8aȷ*$"J)Gwڷ|0ߏ*<&MejZ @s\f-Km^?{SP\rYFQW 9;7qhgAQ3а)jdodϝm3k:6)f a<8i7zFa9IzjRBOۀ+7gLE)d~;kŇ@dsN<4=q|.NƷ*3UBwa.i[Q#QXStHgtZ-کXbZ 7@ٱ$jil݃dBB~m;y8-z=.VstfzxnRy0i%;w0՚Wv4U&e`sx}.i%ԃCGG䂦P"T^i8rW+ Snb^iY,—~LA951Sak#Atd1$Xح7+SOzS) J{w7&-|$EW*TNF2 U.MSdU"5w#Ep5fx?hS3 \6]sU~!cnn  >lN%v^ٯw R|dogAw34VH,VTyzױS|2_{9ɐ攘vQ?F@^aq,n o!fȮclhV^h7Ĩ{[$ @ձ>!ه|̮"W`-2ƻA\)ak^ab޷y-'em})v5)uu5*1l& emH_Upv9 MIY„%azdžJGւͶ'N5 ]b d`Qr➟/i@n 5 \a-稐iQpgA(ۖj\opr)HYa5΢*Vb?MI^7\!bbq[0^RSwIvʔ5=PJ)J[bs]bNcd |kla|6,] b֫]7 _6^_n;Rγ IPK }WRPItL8 phpDocumentor-TypeResolver-7462d5f/src/Types/Integer.phpUT.4L^AO!ݘnZ&Cc.) ;< {waBhTVF&Fс.l)D4 &Ag,AF[_#:qβ|h@貵|DiFKw7,J0x}*4HLM;fB gC0K9*4[ ʇu4@: (t)\RnEɽG~qswQ=$J&Ц2'%![gָaӰP9!\b q,8Y\U*`!i?uuݸD)31?SFl3PK }WRPlq[7 phpDocumentor-TypeResolver-7462d5f/src/Types/Mixed_.phpUT.4L^QKK1W̭u]VEIXdMB2;x2|=$AʈD(i0 5I0w |lt^4" ZP>YiFK< >Nw,J{5˻2( 26E*jZQ!iQpj@=#QXt ^> )HEUt=/K?~3z6#ܯ^ Cl8edPCI$eeJp[=) xOe*]TNcT|fJ|VFs bCg֫M=w+^U9uR}/=*f PK }WRPl1kS6 phpDocumentor-TypeResolver-7462d5f/src/Types/Null_.phpUT.4L^QJC1+f[=VB[<JMlZDEPK }WRPY>09 phpDocumentor-TypeResolver-7462d5f/src/Types/Nullable.phpUT.4L^N1)$D*ZRgS۲ljwIJB x?>4AmUAH N 7d4j`w=%"=;/^9:q,i%=B*ҬgP΀%.I 8WLAۂpY]},<R%0Th`IKDXQ 2%^=s8Lx=q&I85I΢.\wџIOT6#|oI"I*@7T[HXDPKQf\:rBS!An@  Viջw)  FæY+GLR´yOTd h Mͨ0L;c<5\e6 %/ 4u+!,Ǯ:pZ c/sC8Ystω_IEDg0^|/U\9$gk-K9)z:tV~7Щ>v;l<6PK }WRPE" 8 phpDocumentor-TypeResolver-7462d5f/src/Types/Object_.phpUT.4L^TQo0~ϯ8IiҊ׎!$46ˤM.!ΝMG/M_$IY%,231&gI2:=MK預a=(%*8R[%BQWdl\ʡ*G%TRxLV!ջݔK<_ k n^{a-}I'fH@9 .*CXf<\gCmt>J%茠N XT1{ەZJo"Nfh8,-qb& [@]vUiRHeT tn;n@Fgs$A(9`j>DaB(;+Iy9c LzFk K1|bQYr JsW f9qzn: ThE5 3-U1g &q:' +a!QO+W#qtm|%+%$+ h|f,B{ wr+ѾQ$6X-/^"D\~[鴞mܙn6c2֙aR`!+ ȋ:E£&axdُp4! XN<8ZU}pG[#/dvv K  `ZH!!% Z  1tvs')~M^io͸g[ @L3}'0^Mp0u:;~ z @&!--PK }WRP8 phpDocumentor-TypeResolver-7462d5f/src/Types/Parent_.phpUT.4L^RMoT1 Wv'--V*&m6U߱Z*N{@#ibMi{Od{^-Nt݊<)zMа6쌈ysk|<1E[gA_]a yzϗMp -_0\9f6=-C]ʻRF,a$Vp4Zi ؘ C_<0/,gSq~u!lTna ΡV+=MBOPK }WRPhZ: phpDocumentor-TypeResolver-7462d5f/src/Types/Resource_.phpUT.4L^QJ1+f[dQhBInldb)w+\yo7סBhTVF$Fъp"D; 7 :c2zUޡ#䃏@=B!MO k-\NE +nPK }WRPuiw7 phpDocumentor-TypeResolver-7462d5f/src/Types/Scalar.phpUT.4L^]kT1+VQ (tW%'s̈́ĥHX+^97>M .Y*`}ʘi1+,1![, \;b❖ʏ ai)q 6{Ha:"/G+JB?"FOﯿO8 >vusp4Z*5v!HSXZ,6FS9[ZR0Z,\>5ʭYLH=K-XX"5V4;!ٮܖqbw  Js^a\3wk ʷ%u.Rfy^h˳H[OY&4_| s>nU%fl@=A]a H9jOV Aވ P0:քnq}V{H ]*c" Y X~yx\JheiTY),&LW?#t)<2=n⸓(BHhyH0儎"CTo{nQj2X)q{}PU#xdM#9yN/^/PK }WRPoeT8 phpDocumentor-TypeResolver-7462d5f/src/Types/String_.phpUT.4L^QJC1+fg[^ܶVD- %MƦIH&"w'\9@fΜ\^>QYq(E+:LWÉh$`$E7H;`Wy|lxL>#tZP>iFKu>$!Xnp_qOw|KLMQ΄zsTDXP' eګ [!a q,,gYTErQ"`93ѫe]"&FJpV,YSutIʔ`^+0;0%(Ň(>*C̐rt $S8B)D|Bs b#֫m󵯭ok>UcZ?) a 'uTB~,Mj(PK }WRP,*45 phpDocumentor-TypeResolver-7462d5f/src/Types/This.phpUT.4L^Rj1 +t($Y4MPZHBOkkvxlc]%ͩxғ{yxt<\wWƬ  x@Al C@kFNe%i%ah!KPh72!XDR,SK&wܷnjޏG˰<)mc'%"\jjš4xbp(>A?#s\OnNkcf+WpZ [OҋG?mh?$ s*=\V->%F ZrKBWLVZ#Pij-ms6LO4M):*AtH eeį`g7!ͲEAn%J@ц#D4cZY]ǫ" S^a'[PL&$:[;l,e쓃͆ӽSܝ_%3g>zf!]glPK }WRP#{Jݳ6 phpDocumentor-TypeResolver-7462d5f/src/Types/Void_.phpUT.4L^Rj1 +tK;M PZHBN;̸둌-ﰔ{eStmg}S4al,Cŕ1je`0kIܗI85frɏ%HY!h4[L zwo~=TO&+ Wv"`2r\R+ZL"딨~i3h? 8+j/7l(ƄY+09 afphpDocumentor-TypeResolver-7462d5f/src/Types/Nullable.phpUT.4L^PK }WRPE" 8 hphpDocumentor-TypeResolver-7462d5f/src/Types/Object_.phpUT.4L^PK }WRP8 1lphpDocumentor-TypeResolver-7462d5f/src/Types/Parent_.phpUT.4L^PK }WRPhZ: %nphpDocumentor-TypeResolver-7462d5f/src/Types/Resource_.phpUT.4L^PK }WRPuiw7 ophpDocumentor-TypeResolver-7462d5f/src/Types/Scalar.phpUT.4L^PK }WRPiT΋6 qphpDocumentor-TypeResolver-7462d5f/src/Types/Self_.phpUT.4L^PK }WRP 8 sphpDocumentor-TypeResolver-7462d5f/src/Types/Static_.phpUT.4L^PK }WRPoeT8 4vphpDocumentor-TypeResolver-7462d5f/src/Types/String_.phpUT.4L^PK }WRP,*45 wphpDocumentor-TypeResolver-7462d5f/src/Types/This.phpUT.4L^PK }WRP#{Jݳ6 zphpDocumentor-TypeResolver-7462d5f/src/Types/Void_.phpUT.4L^PK++/|(7462d5f123dfc080dfdf26897032a6513644fc95PK!HU((MakefilenuIw.PHONY: install-phive install-phive: mkdir tools; \ wget -O tools/phive.phar https://phar.io/releases/phive.phar; \ wget -O tools/phive.phar.asc https://phar.io/releases/phive.phar.asc; \ gpg --keyserver pool.sks-keyservers.net --recv-keys 0x9D8A98B29B2D5D79; \ gpg --verify tools/phive.phar.asc tools/phive.phar; \ chmod +x tools/phive.phar .PHONY: setup setup: install-phive docker run -it --rm -v${PWD}:/opt/project -w /opt/project phpdoc/phar-ga:latest php tools/phive.phar install --force-accept-unsigned .PHONY: phpcs phpcs: docker run -it --rm -v${PWD}:/opt/project -w /opt/project phpdoc/phpcs-ga:v1.0.0 -s .PHONY: phpstan phpstan: docker run -it --rm -v${PWD}:/opt/project -w /opt/project phpdoc/phpstan-ga:latest analyse src --no-progress --configuration phpstan.neon .PHONY: psaml psalm: docker run -it --rm -v${PWD}:/opt/project -w /opt/project mickaelandrieu/psalm-ga .PHONY: test test: docker run -it --rm -v${PWD}:/opt/project -w /opt/project php:7.2 tools/phpunit .PHONY: pre-commit-test pre-commit-test: test phpcs phpstan psalm PK!^$## README.mdnuIw[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) ![](https://github.com/phpdocumentor/typeresolver/workflows/Qa%20workflow/badge.svg?branch=master) [![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/TypeResolver.svg)](https://coveralls.io/github/phpDocumentor/TypeResolver?branch=master) [![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/TypeResolver.svg)](https://scrutinizer-ci.com/g/phpDocumentor/TypeResolver/?branch=master) [![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/TypeResolver.svg)](https://scrutinizer-ci.com/g/phpDocumentor/TypeResolver/?branch=master) ![Packagist Version](https://img.shields.io/packagist/v/phpdocumentor/type-resolver?label=Packagist%20stable) ![Packagist Version](https://img.shields.io/packagist/vpre/phpdocumentor/type-resolver?label=Packagist%20unstable) TypeResolver and FqsenResolver ============================== The specification on types in DocBlocks (PSR-5) describes various keywords and special constructs but also how to statically resolve the partial name of a Class into a Fully Qualified Class Name (FQCN). PSR-5 also introduces an additional way to describe deeper elements than Classes, Interfaces and Traits called the Fully Qualified Structural Element Name (FQSEN). Using this it is possible to refer to methods, properties and class constants but also functions and global constants. This package provides two Resolvers that are capable of 1. Returning a series of Value Object for given expression while resolving any partial class names, and 2. Returning an FQSEN object after resolving any partial Structural Element Names into Fully Qualified Structural Element names. ## Installing The easiest way to install this library is with [Composer](https://getcomposer.org) using the following command: $ composer require phpdocumentor/type-resolver ## Examples Ready to dive in and don't want to read through all that text below? Just consult the [examples](examples) folder and check which type of action that your want to accomplish. ## On Types and Element Names This component can be used in one of two ways 1. To resolve a Type or 2. To resolve a Fully Qualified Structural Element Name The big difference between these two is in the number of things it can resolve. The TypeResolver can resolve: - a php primitive or pseudo-primitive such as a string or void (`@var string` or `@return void`). - a composite such as an array of string (`@var string[]`). - a compound such as a string or integer (`@var string|integer`). - an array expression (`@var (string|TypeResolver)[]`) - an object or interface such as the TypeResolver class (`@var TypeResolver` or `@var \phpDocumentor\Reflection\TypeResolver`) > please note that if you want to pass partial class names that additional steps are necessary, see the > chapter `Resolving partial classes and FQSENs` for more information. Where the FqsenResolver can resolve: - Constant expressions (i.e. `@see \MyNamespace\MY_CONSTANT`) - Function expressions (i.e. `@see \MyNamespace\myFunction()`) - Class expressions (i.e. `@see \MyNamespace\MyClass`) - Interface expressions (i.e. `@see \MyNamespace\MyInterface`) - Trait expressions (i.e. `@see \MyNamespace\MyTrait`) - Class constant expressions (i.e. `@see \MyNamespace\MyClass::MY_CONSTANT`) - Property expressions (i.e. `@see \MyNamespace\MyClass::$myProperty`) - Method expressions (i.e. `@see \MyNamespace\MyClass::myMethod()`) ## Resolving a type In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver` and call its `resolve` method like this: ```php $typeResolver = new \phpDocumentor\Reflection\TypeResolver(); $type = $typeResolver->resolve('string|integer'); ``` In this example you will receive a Value Object of class `\phpDocumentor\Reflection\Types\Compound` that has two elements, one of type `\phpDocumentor\Reflection\Types\String_` and one of type `\phpDocumentor\Reflection\Types\Integer`. The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. ### Resolving nullable types Php 7.1 introduced nullable types e.g. `?string`. Type resolver will resolve the original type without the nullable notation `?` just like it would do without the `?`. After that the type is wrapped in a `\phpDocumentor\Reflection\Types\Nullable` object. The `Nullable` type has a method to fetch the actual type. ## Resolving an FQSEN A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this: ```php $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); $fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()'); ``` In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`. The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. ## Resolving partial Classes and Structural Element Names Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class names. For example, you have this file: ```php namespace My\Example; use phpDocumentor\Reflection\Types; class Classy { /** * @var Types\Context * @see Classy::otherFunction() */ public function __construct($context) {} public function otherFunction(){} } ``` Suppose that you would want to resolve (and expand) the type in the `@var` tag and the element name in the `@see` tag. For the resolvers to know how to expand partial names you have to provide a bit of _Context_ for them by instantiating a new class named `\phpDocumentor\Reflection\Types\Context` with the name of the namespace and the aliases that are in play. ### Creating a Context You can do this by manually creating a Context like this: ```php $context = new \phpDocumentor\Reflection\Types\Context( '\My\Example', [ 'Types' => '\phpDocumentor\Reflection\Types'] ); ``` Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector object or by providing the namespace that you'd like to extract and the source code of the file in which the given type expression occurs. ```php $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); $context = $contextFactory->createFromReflector(new ReflectionMethod('\My\Example\Classy', '__construct')); ``` or ```php $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); $context = $contextFactory->createForNamespace('\My\Example', file_get_contents('My/Example/Classy.php')); ``` ### Using the Context After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver class as second argument and the Resolvers will take this into account when resolving partial names. To obtain the resolved class name for the `@var` tag in the example above you can do: ```php $typeResolver = new \phpDocumentor\Reflection\TypeResolver(); $type = $typeResolver->resolve('Types\Context', $context); ``` When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be `phpDocumentor\Reflection\Types\Context`. > Why is the FQSEN wrapped in another object `Object_`? > > The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN. Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To resolve that you can do the following: ```php $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); $type = $fqsenResolver->resolve('Classy::otherFunction()', $context); ``` Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the `resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to `\My\Example\Classy::otherFunction()`. PK!3 phive.xmlnuIw PK!88LICENSEnuIwThe MIT License (MIT) Copyright (c) 2010 Mike van Riel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PK!==composer-require-config.jsonnuIw{ "symbol-whitelist" : [ "null", "true", "false", "static", "self", "parent", "array", "string", "int", "float", "bool", "iterable", "callable", "void", "object", "XSLTProcessor" ], "php-core-extensions" : [ "Core", "pcre", "Reflection", "tokenizer", "SPL", "standard" ] } PK!nphpcs.xml.distnuIw The coding standard for phpDocumentor. src tests/unit */tests/unit/Types/ContextFactoryTest.php */src/*/Abstract*.php PK!''' composer.jsonnuIw{ "name": "phpdocumentor/type-resolver", "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "type": "library", "license": "MIT", "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" } ], "require": { "php": "^7.2", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { "mockery/mockery": "~1", "ext-tokenizer": "^7.2" }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": "src" } }, "autoload-dev": { "psr-4": { "phpDocumentor\\Reflection\\": "tests/unit" } }, "extra": { "branch-alias": { "dev-master": "1.x-dev" } } } PK!L!.github/workflows/push.ymlnuIwon: push: branches: - master pull_request: name: Qa workflow jobs: setup: runs-on: ubuntu-latest steps: - uses: actions/checkout@master - name: Restore/cache vendor folder uses: actions/cache@v1 with: path: vendor key: all-build-${{ hashFiles('**/composer.lock') }} restore-keys: | all-build-${{ hashFiles('**/composer.lock') }} all-build- - name: Restore/cache tools folder uses: actions/cache@v1 with: path: tools key: all-tools-${{ github.sha }} restore-keys: | all-tools-${{ github.sha }}- all-tools- - name: composer uses: docker://composer env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: args: install --no-interaction --prefer-dist --optimize-autoloader - name: composer-require-checker uses: docker://phpga/composer-require-checker-ga env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: args: check --config-file ./composer-require-config.json composer.json - name: Install phive run: make install-phive - name: Install PHAR dependencies run: tools/phive.phar --no-progress install --copy --trust-gpg-keys 4AA394086372C20A,D2CCAC42F6295E7D,E82B2FB314E9906E,8E730BA25823D8B5 --force-accept-unsigned phpunit-with-coverage: runs-on: ubuntu-latest name: Unit tests needs: setup steps: - uses: actions/checkout@master - name: Restore/cache vendor folder uses: actions/cache@v1 with: path: vendor key: all-build-${{ hashFiles('**/composer.lock') }} restore-keys: | all-build-${{ hashFiles('**/composer.lock') }} all-build- - name: Restore/cache tools folder uses: actions/cache@v1 with: path: tools key: all-tools-${{ github.sha }} restore-keys: | all-tools-${{ github.sha }}- all-tools- - name: Setup PHP uses: shivammathur/setup-php@master with: php-version: 7.2 extension-csv: mbstring, intl, iconv, libxml, dom, json, simplexml, zlib ini-values-csv: memory_limit=2G, display_errors=On, error_reporting=-1 coverage: xdebug pecl: false - name: Run PHPUnit run: php tools/phpunit phpunit: runs-on: ${{ matrix.operating-system }} strategy: matrix: operating-system: - ubuntu-latest - windows-latest - macOS-latest php-versions: ['7.2', '7.3', '7.4'] name: Unit tests for PHP version ${{ matrix.php-versions }} on ${{ matrix.operating-system }} needs: - setup - phpunit-with-coverage steps: - uses: actions/checkout@master - name: Restore/cache vendor folder uses: actions/cache@v1 with: path: vendor key: all-build-${{ hashFiles('**/composer.lock') }} restore-keys: | all-build-${{ hashFiles('**/composer.lock') }} all-build- - name: Restore/cache tools folder uses: actions/cache@v1 with: path: tools key: all-tools-${{ github.sha }} restore-keys: | all-tools-${{ github.sha }}- all-tools- - name: Setup PHP uses: shivammathur/setup-php@master with: php-version: ${{ matrix.php-versions }} extension-csv: mbstring, intl, iconv, libxml, dom, json, simplexml, zlib ini-values-csv: memory_limit=2G, display_errors=On, error_reporting=-1 pecl: false - name: Run PHPUnit continue-on-error: true run: php tools/phpunit codestyle: runs-on: ubuntu-latest needs: [setup, phpunit] steps: - uses: actions/checkout@master - name: Restore/cache vendor folder uses: actions/cache@v1 with: path: vendor key: all-build-${{ hashFiles('**/composer.lock') }} restore-keys: | all-build-${{ hashFiles('**/composer.lock') }} all-build- - name: Code style check uses: phpDocumentor/coding-standard@master with: args: -s phpstan: runs-on: ubuntu-latest needs: [setup, phpunit] steps: - uses: actions/checkout@master - name: Restore/cache vendor folder uses: actions/cache@v1 with: path: vendor key: all-build-${{ hashFiles('**/composer.lock') }} restore-keys: | all-build-${{ hashFiles('**/composer.lock') }} all-build- - name: PHPStan uses: phpDocumentor/phpstan-ga@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: args: analyse src --configuration phpstan.neon psalm: runs-on: ubuntu-latest needs: [setup, phpunit] steps: - uses: actions/checkout@master - name: Restore/cache vendor folder uses: actions/cache@v1 with: path: vendor key: all-build-${{ hashFiles('**/composer.lock') }} restore-keys: | all-build-${{ hashFiles('**/composer.lock') }} all-build- - name: Restore/cache tools folder uses: actions/cache@v1 with: path: tools key: all-tools-${{ github.sha }} restore-keys: | all-tools-${{ github.sha }}- all-tools- - name: Psalm uses: docker://mickaelandrieu/psalm-ga env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} bc_check: name: BC Check runs-on: ubuntu-latest needs: [setup, phpunit] steps: - uses: actions/checkout@master - name: fetch tags run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* - name: Restore/cache vendor folder uses: actions/cache@v1 with: path: vendor key: all-build-${{ hashFiles('**/composer.lock') }} restore-keys: | all-build-${{ hashFiles('**/composer.lock') }} all-build- - name: Roave BC Check uses: docker://nyholm/roave-bc-check-ga PK! ~yysrc/Types/Collection.phpnuIw` * 2. `ACollectionObject` * * - ACollectionObject can be 'array' or an object that can act as an array * - aValueType and aKeyType can be any type expression */ final class Collection extends AbstractList { /** @var Fqsen|null */ private $fqsen; /** * Initializes this representation of an array with the given Type or Fqsen. */ public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) { parent::__construct($valueType, $keyType); $this->fqsen = $fqsen; } /** * Returns the FQSEN associated with this object. */ public function getFqsen() : ?Fqsen { return $this->fqsen; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { $objectType = (string) ($this->fqsen ?? 'object'); if ($this->keyType === null) { return $objectType . '<' . $this->valueType . '>'; } return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; } } PK! src/Types/Static_.phpnuIwvalueType = $valueType; $this->defaultKeyType = new Compound([new String_(), new Integer()]); $this->keyType = $keyType; } /** * Returns the type for the keys of this array. */ public function getKeyType() : Type { if ($this->keyType === null) { return $this->defaultKeyType; } return $this->keyType; } /** * Returns the value for the keys of this array. */ public function getValueType() : Type { return $this->valueType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { if ($this->keyType) { return 'array<' . $this->keyType . ',' . $this->valueType . '>'; } if ($this->valueType instanceof Mixed_) { return 'array'; } if ($this->valueType instanceof Compound) { return '(' . $this->valueType . ')[]'; } return $this->valueType . '[]'; } } PK!K083VVsrc/Types/Callable_.phpnuIwfqsen = $fqsen; } /** * Returns the FQSEN associated with this object. */ public function getFqsen() : ?Fqsen { return $this->fqsen; } public function __toString() : string { if ($this->fqsen) { return (string) $this->fqsen; } return 'object'; } } PK!Itsrc/Types/Integer.phpnuIwadd($type); } } /** * Returns the type at the given index. */ public function get(int $index) : ?Type { if (!$this->has($index)) { return null; } return $this->types[$index]; } /** * Tests if this compound type has a type with the given index. */ public function has(int $index) : bool { return isset($this->types[$index]); } /** * Tests if this compound type contains the given type. */ public function contains(Type $type) : bool { foreach ($this->types as $typePart) { // if the type is duplicate; do not add it if ((string) $typePart === (string) $type) { return true; } } return false; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { return implode('|', $this->types); } /** * {@inheritdoc} */ public function getIterator() { return new ArrayIterator($this->types); } private function add(Type $type) : void { // if the type is duplicate; do not add it if ($this->contains($type)) { return; } $this->types[] = $type; } } PK!00src/Types/ContextFactory.phpnuIwcreateFromReflectionClass($reflector); } if ($reflector instanceof ReflectionParameter) { return $this->createFromReflectionParameter($reflector); } if ($reflector instanceof ReflectionMethod) { return $this->createFromReflectionMethod($reflector); } if ($reflector instanceof ReflectionProperty) { return $this->createFromReflectionProperty($reflector); } if ($reflector instanceof ReflectionClassConstant) { return $this->createFromReflectionClassConstant($reflector); } throw new UnexpectedValueException('Unhandled \Reflector instance given: ' . get_class($reflector)); } private function createFromReflectionParameter(ReflectionParameter $parameter) : Context { $class = $parameter->getDeclaringClass(); if ($class) { return $this->createFromReflectionClass($class); } throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); } private function createFromReflectionMethod(ReflectionMethod $method) : Context { return $this->createFromReflectionClass($method->getDeclaringClass()); } private function createFromReflectionProperty(ReflectionProperty $property) : Context { return $this->createFromReflectionClass($property->getDeclaringClass()); } private function createFromReflectionClassConstant(ReflectionClassConstant $constant) : Context { return $this->createFromReflectionClass($constant->getDeclaringClass()); } private function createFromReflectionClass(ReflectionClass $class) : Context { $fileName = $class->getFileName(); $namespace = $class->getNamespaceName(); if (is_string($fileName) && file_exists($fileName)) { $contents = file_get_contents($fileName); if ($contents === false) { throw new RuntimeException('Unable to read file "' . $fileName . '"'); } return $this->createForNamespace($namespace, $contents); } return new Context($namespace, []); } /** * Build a Context for a namespace in the provided file contents. * * @see Context for more information on Contexts. * * @param string $namespace It does not matter if a `\` precedes the namespace name, * this method first normalizes. * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. */ public function createForNamespace(string $namespace, string $fileContents) : Context { $namespace = trim($namespace, '\\'); $useStatements = []; $currentNamespace = ''; $tokens = new ArrayIterator(token_get_all($fileContents)); while ($tokens->valid()) { switch ($tokens->current()[0]) { case T_NAMESPACE: $currentNamespace = $this->parseNamespace($tokens); break; case T_CLASS: // Fast-forward the iterator through the class so that any // T_USE tokens found within are skipped - these are not // valid namespace use statements so should be ignored. $braceLevel = 0; $firstBraceFound = false; while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { if ($tokens->current() === '{' || $tokens->current()[0] === T_CURLY_OPEN || $tokens->current()[0] === T_DOLLAR_OPEN_CURLY_BRACES) { if (!$firstBraceFound) { $firstBraceFound = true; } ++$braceLevel; } if ($tokens->current() === '}') { --$braceLevel; } $tokens->next(); } break; case T_USE: if ($currentNamespace === $namespace) { $useStatements = array_merge($useStatements, $this->parseUseStatement($tokens)); } break; } $tokens->next(); } return new Context($namespace, $useStatements); } /** * Deduce the name from tokens when we are at the T_NAMESPACE token. */ private function parseNamespace(ArrayIterator $tokens) : string { // skip to the first string or namespace separator $this->skipToNextStringOrNamespaceSeparator($tokens); $name = ''; while ($tokens->valid() && ($tokens->current()[0] === T_STRING || $tokens->current()[0] === T_NS_SEPARATOR) ) { $name .= $tokens->current()[1]; $tokens->next(); } return $name; } /** * Deduce the names of all imports when we are at the T_USE token. * * @return string[] */ private function parseUseStatement(ArrayIterator $tokens) : array { $uses = []; while (true) { $this->skipToNextStringOrNamespaceSeparator($tokens); $uses = array_merge($uses, $this->extractUseStatements($tokens)); if ($tokens->current()[0] === self::T_LITERAL_END_OF_USE) { return $uses; } if ($tokens->current() === false) { break; } } return $uses; } /** * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. */ private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens) : void { while ($tokens->valid() && ($tokens->current()[0] !== T_STRING) && ($tokens->current()[0] !== T_NS_SEPARATOR)) { $tokens->next(); } } /** * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of * a USE statement yet. This will return a key/value array of the alias => namespace. * * @return string[] * * @psalm-suppress TypeDoesNotContainType */ private function extractUseStatements(ArrayIterator $tokens) : array { $extractedUseStatements = []; $groupedNs = ''; $currentNs = ''; $currentAlias = ''; $state = 'start'; while ($tokens->valid()) { $currentToken = $tokens->current(); $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; $tokenValue = is_string($currentToken) ? null : $currentToken[1]; switch ($state) { case 'start': switch ($tokenId) { case T_STRING: case T_NS_SEPARATOR: $currentNs .= $tokenValue; $currentAlias = $tokenValue; break; case T_CURLY_OPEN: case '{': $state = 'grouped'; $groupedNs = $currentNs; break; case T_AS: $state = 'start-alias'; break; case self::T_LITERAL_USE_SEPARATOR: case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } break; case 'start-alias': switch ($tokenId) { case T_STRING: $currentAlias = $tokenValue; break; case self::T_LITERAL_USE_SEPARATOR: case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } break; case 'grouped': switch ($tokenId) { case T_STRING: case T_NS_SEPARATOR: $currentNs .= $tokenValue; $currentAlias = $tokenValue; break; case T_AS: $state = 'grouped-alias'; break; case self::T_LITERAL_USE_SEPARATOR: $state = 'grouped'; $extractedUseStatements[$currentAlias] = $currentNs; $currentNs = $groupedNs; $currentAlias = ''; break; case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } break; case 'grouped-alias': switch ($tokenId) { case T_STRING: $currentAlias = $tokenValue; break; case self::T_LITERAL_USE_SEPARATOR: $state = 'grouped'; $extractedUseStatements[$currentAlias] = $currentNs; $currentNs = $groupedNs; $currentAlias = ''; break; case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } } if ($state === 'end') { break; } $tokens->next(); } if ($groupedNs !== $currentNs) { $extractedUseStatements[$currentAlias] = $currentNs; } return $extractedUseStatements; } } PK!iTΧsrc/Types/Self_.phpnuIwfqsen = $fqsen; } /** * Returns the FQSEN associated with this object. */ public function getFqsen() : ?Fqsen { return $this->fqsen; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { if ($this->fqsen === null) { return 'class-string'; } return 'class-string<' . (string) $this->fqsen . '>'; } } PK!l[[src/Types/Mixed_.phpnuIw Fully Qualified Namespace. */ private $namespaceAliases; /** * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) * format (without a preceding `\`). * * @param string $namespace The namespace where this DocBlock resides in. * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. */ public function __construct(string $namespace, array $namespaceAliases = []) { $this->namespace = $namespace !== 'global' && $namespace !== 'default' ? trim($namespace, '\\') : ''; foreach ($namespaceAliases as $alias => $fqnn) { if ($fqnn[0] === '\\') { $fqnn = substr($fqnn, 1); } if ($fqnn[strlen($fqnn) - 1] === '\\') { $fqnn = substr($fqnn, 0, -1); } $namespaceAliases[$alias] = $fqnn; } $this->namespaceAliases = $namespaceAliases; } /** * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. */ public function getNamespace() : string { return $this->namespace; } /** * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent * the alias for the imported Namespace. * * @return string[] */ public function getNamespaceAliases() : array { return $this->namespaceAliases; } } PK!Y>00src/Types/Nullable.phpnuIwrealType = $realType; } /** * Provide access to the actual type directly, if needed. */ public function getActualType() : Type { return $this->realType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { return '?' . $this->realType->__toString(); } } PK!ZZsrc/Types/Resource_.phpnuIwkeyType) { return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; } if ($this->valueType instanceof Mixed_) { return 'iterable'; } return 'iterable<' . $this->valueType . '>'; } } PK!#{Jsrc/Types/Void_.phpnuIw List of recognized keywords and unto which Value Object they map * @psalm-var array> */ private $keywords = [ 'string' => Types\String_::class, 'class-string' => Types\ClassString::class, 'int' => Types\Integer::class, 'integer' => Types\Integer::class, 'bool' => Types\Boolean::class, 'boolean' => Types\Boolean::class, 'real' => Types\Float_::class, 'float' => Types\Float_::class, 'double' => Types\Float_::class, 'object' => Object_::class, 'mixed' => Types\Mixed_::class, 'array' => Array_::class, 'resource' => Types\Resource_::class, 'void' => Types\Void_::class, 'null' => Types\Null_::class, 'scalar' => Types\Scalar::class, 'callback' => Types\Callable_::class, 'callable' => Types\Callable_::class, 'false' => Types\Boolean::class, 'true' => Types\Boolean::class, 'self' => Types\Self_::class, '$this' => Types\This::class, 'static' => Types\Static_::class, 'parent' => Types\Parent_::class, 'iterable' => Iterable_::class, ]; /** @var FqsenResolver */ private $fqsenResolver; /** * Initializes this TypeResolver with the means to create and resolve Fqsen objects. */ public function __construct(?FqsenResolver $fqsenResolver = null) { $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); } /** * Analyzes the given type and returns the FQCN variant. * * When a type is provided this method checks whether it is not a keyword or * Fully Qualified Class Name. If so it will use the given namespace and * aliases to expand the type to a FQCN representation. * * This method only works as expected if the namespace and aliases are set; * no dynamic reflection is being performed here. * * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be * replaced with another namespace. * @uses Context::getNamespace() to determine with what to prefix the type name. * * @param string $type The relative or absolute type. */ public function resolve(string $type, ?Context $context = null) : Type { $type = trim($type); if (!$type) { throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); } if ($context === null) { $context = new Context(''); } // split the type string into tokens `|`, `?`, `<`, `>`, `,`, `(`, `)[]`, '<', '>' and type names $tokens = preg_split( '/(\\||\\?|<|>|, ?|\\(|\\)(?:\\[\\])+)/', $type, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); if ($tokens === false) { throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); } $tokenIterator = new ArrayIterator($tokens); return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); } /** * Analyse each tokens and creates types * * @param ArrayIterator $tokens the iterator on tokens * @param int $parserContext on of self::PARSER_* constants, indicating * the context where we are in the parsing */ private function parseTypes(ArrayIterator $tokens, Context $context, int $parserContext) : Type { $types = []; $token = ''; while ($tokens->valid()) { $token = $tokens->current(); if ($token === '|') { if (count($types) === 0) { throw new RuntimeException( 'A type is missing before a type separator' ); } if ($parserContext !== self::PARSER_IN_COMPOUND && $parserContext !== self::PARSER_IN_ARRAY_EXPRESSION && $parserContext !== self::PARSER_IN_COLLECTION_EXPRESSION ) { throw new RuntimeException( 'Unexpected type separator' ); } $tokens->next(); } elseif ($token === '?') { if ($parserContext !== self::PARSER_IN_COMPOUND && $parserContext !== self::PARSER_IN_ARRAY_EXPRESSION && $parserContext !== self::PARSER_IN_COLLECTION_EXPRESSION ) { throw new RuntimeException( 'Unexpected nullable character' ); } $tokens->next(); $type = $this->parseTypes($tokens, $context, self::PARSER_IN_NULLABLE); $types[] = new Nullable($type); } elseif ($token === '(') { $tokens->next(); $type = $this->parseTypes($tokens, $context, self::PARSER_IN_ARRAY_EXPRESSION); $resolvedType = new Array_($type); $token = $tokens->current(); // Someone did not properly close their array expression .. if ($token === null) { break; } // we generate arrays corresponding to the number of '[]' after the ')' $numberOfArrays = (strlen($token) - 1) / 2; for ($i = 0; $i < $numberOfArrays - 1; ++$i) { $resolvedType = new Array_($resolvedType); } $types[] = $resolvedType; $tokens->next(); } elseif ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION && $token[0] === ')') { break; } elseif ($token === '<') { if (count($types) === 0) { throw new RuntimeException( 'Unexpected collection operator "<", class name is missing' ); } $classType = array_pop($types); if ($classType !== null) { if ((string) $classType === 'class-string') { $types[] = $this->resolveClassString($tokens, $context); } else { $types[] = $this->resolveCollection($tokens, $classType, $context); } } $tokens->next(); } elseif ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION && ($token === '>' || trim($token) === ',') ) { break; } else { $type = $this->resolveSingleType($token, $context); $tokens->next(); if ($parserContext === self::PARSER_IN_NULLABLE) { return $type; } $types[] = $type; } } if ($token === '|') { throw new RuntimeException( 'A type is missing after a type separator' ); } if (count($types) === 0) { if ($parserContext === self::PARSER_IN_NULLABLE) { throw new RuntimeException( 'A type is missing after a nullable character' ); } if ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION) { throw new RuntimeException( 'A type is missing in an array expression' ); } if ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION) { throw new RuntimeException( 'A type is missing in a collection expression' ); } } elseif (count($types) === 1) { return $types[0]; } return new Compound($types); } /** * resolve the given type into a type object * * @param string $type the type string, representing a single type * * @return Type|Array_|Object_ */ private function resolveSingleType(string $type, Context $context) { switch (true) { case $this->isKeyword($type): return $this->resolveKeyword($type); case $this->isTypedArray($type): return $this->resolveTypedArray($type, $context); case $this->isFqsen($type): return $this->resolveTypedObject($type); case $this->isPartialStructuralElementName($type): return $this->resolveTypedObject($type, $context); // @codeCoverageIgnoreStart default: // I haven't got the foggiest how the logic would come here but added this as a defense. throw new RuntimeException( 'Unable to resolve type "' . $type . '", there is no known method to resolve it' ); } // @codeCoverageIgnoreEnd } /** * Adds a keyword to the list of Keywords and associates it with a specific Value Object. * * @psalm-param class-string $typeClassName */ public function addKeyword(string $keyword, string $typeClassName) : void { if (!class_exists($typeClassName)) { throw new InvalidArgumentException( 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName ); } if (!in_array(Type::class, class_implements($typeClassName), true)) { throw new InvalidArgumentException( 'The class "' . $typeClassName . '" must implement the interface "phpDocumentor\Reflection\Type"' ); } $this->keywords[$keyword] = $typeClassName; } /** * Detects whether the given type represents an array. * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. */ private function isTypedArray(string $type) : bool { return substr($type, -2) === self::OPERATOR_ARRAY; } /** * Detects whether the given type represents a PHPDoc keyword. * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. */ private function isKeyword(string $type) : bool { return in_array(strtolower($type), array_keys($this->keywords), true); } /** * Detects whether the given type represents a relative structural element name. * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. */ private function isPartialStructuralElementName(string $type) : bool { return ($type[0] !== self::OPERATOR_NAMESPACE) && !$this->isKeyword($type); } /** * Tests whether the given type is a Fully Qualified Structural Element Name. */ private function isFqsen(string $type) : bool { return strpos($type, self::OPERATOR_NAMESPACE) === 0; } /** * Resolves the given typed array string (i.e. `string[]`) into an Array object with the right types set. */ private function resolveTypedArray(string $type, Context $context) : Array_ { return new Array_($this->resolveSingleType(substr($type, 0, -2), $context)); } /** * Resolves the given keyword (such as `string`) into a Type object representing that keyword. */ private function resolveKeyword(string $type) : Type { $className = $this->keywords[strtolower($type)]; return new $className(); } /** * Resolves the given FQSEN string into an FQSEN object. */ private function resolveTypedObject(string $type, ?Context $context = null) : Object_ { return new Object_($this->fqsenResolver->resolve($type, $context)); } /** * Resolves class string */ private function resolveClassString(ArrayIterator $tokens, Context $context) : Type { $tokens->next(); $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); if (!$classType instanceof Object_ || $classType->getFqsen() === null) { throw new RuntimeException( $classType . ' is not a class string' ); } if ($tokens->current() !== '>') { if (empty($tokens->current())) { throw new RuntimeException( 'class-string: ">" is missing' ); } throw new RuntimeException( 'Unexpected character "' . $tokens->current() . '", ">" is missing' ); } return new ClassString($classType->getFqsen()); } /** * Resolves the collection values and keys * * @return Array_|Iterable_|Collection */ private function resolveCollection(ArrayIterator $tokens, Type $classType, Context $context) : Type { $isArray = ((string) $classType === 'array'); $isIterable = ((string) $classType === 'iterable'); // allow only "array", "iterable" or class name before "<" if (!$isArray && !$isIterable && (!$classType instanceof Object_ || $classType->getFqsen() === null)) { throw new RuntimeException( $classType . ' is not a collection' ); } $tokens->next(); $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); $keyType = null; if ($tokens->current() !== null && trim($tokens->current()) === ',') { // if we have a comma, then we just parsed the key type, not the value type $keyType = $valueType; if ($isArray) { // check the key type for an "array" collection. We allow only // strings or integers. if (!$keyType instanceof String_ && !$keyType instanceof Integer && !$keyType instanceof Compound ) { throw new RuntimeException( 'An array can have only integers or strings as keys' ); } if ($keyType instanceof Compound) { foreach ($keyType->getIterator() as $item) { if (!$item instanceof String_ && !$item instanceof Integer ) { throw new RuntimeException( 'An array can have only integers or strings as keys' ); } } } } $tokens->next(); // now let's parse the value type $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); } if ($tokens->current() !== '>') { if (empty($tokens->current())) { throw new RuntimeException( 'Collection: ">" is missing' ); } throw new RuntimeException( 'Unexpected character "' . $tokens->current() . '", ">" is missing' ); } if ($isArray) { return new Array_($valueType, $keyType); } if ($isIterable) { return new Iterable_($valueType, $keyType); } /** @psalm-suppress RedundantCondition */ if ($classType instanceof Object_) { return $this->makeCollectionFromObject($classType, $valueType, $keyType); } throw new RuntimeException('Invalid $classType provided'); } private function makeCollectionFromObject(Object_ $object, Type $valueType, ?Type $keyType = null) : Collection { return new Collection($object->getFqsen(), $valueType, $keyType); } } PK!!src/FqsenResolver.phpnuIwisFqsen($fqsen)) { return new Fqsen($fqsen); } return $this->resolvePartialStructuralElementName($fqsen, $context); } /** * Tests whether the given type is a Fully Qualified Structural Element Name. */ private function isFqsen(string $type) : bool { return strpos($type, self::OPERATOR_NAMESPACE) === 0; } /** * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. * * @throws InvalidArgumentException When type is not a valid FQSEN. */ private function resolvePartialStructuralElementName(string $type, Context $context) : Fqsen { $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); $namespaceAliases = $context->getNamespaceAliases(); // if the first segment is not an alias; prepend namespace name and return if (!isset($namespaceAliases[$typeParts[0]])) { $namespace = $context->getNamespace(); if ($namespace !== '') { $namespace .= self::OPERATOR_NAMESPACE; } return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type); } $typeParts[0] = $namespaceAliases[$typeParts[0]]; return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts)); } } PK!\/s99 composer.locknuIw{ "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "2442731855d696520d47913fd007c143", "packages": [ { "name": "phpdocumentor/reflection-common", "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", "shasum": "" }, "require": { "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "~6" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.x-dev" } }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jaap van Otterdijk", "email": "opensource@ijaap.nl" } ], "description": "Common reflection classes used by phpdocumentor to reflect the code structure", "homepage": "http://www.phpdoc.org", "keywords": [ "FQSEN", "phpDocumentor", "phpdoc", "reflection", "static analysis" ], "time": "2018-08-07T13:53:10+00:00" } ], "packages-dev": [ { "name": "hamcrest/hamcrest-php", "version": "v2.0.0", "source": { "type": "git", "url": "https://github.com/hamcrest/hamcrest-php.git", "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", "shasum": "" }, "require": { "php": "^5.3|^7.0" }, "replace": { "cordoval/hamcrest-php": "*", "davedevelopment/hamcrest-php": "*", "kodova/hamcrest-php": "*" }, "require-dev": { "phpunit/php-file-iterator": "1.3.3", "phpunit/phpunit": "~4.0", "satooshi/php-coveralls": "^1.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0-dev" } }, "autoload": { "classmap": [ "hamcrest" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD" ], "description": "This is the PHP port of Hamcrest Matchers", "keywords": [ "test" ], "time": "2016-01-20T08:20:44+00:00" }, { "name": "mockery/mockery", "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", "reference": "5571962a4f733fbb57bede39778f71647fae8e66" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/mockery/mockery/zipball/5571962a4f733fbb57bede39778f71647fae8e66", "reference": "5571962a4f733fbb57bede39778f71647fae8e66", "shasum": "" }, "require": { "hamcrest/hamcrest-php": "~2.0", "lib-pcre": ">=7.0", "php": ">=5.6.0", "sebastian/comparator": "^1.2.4|^3.0" }, "require-dev": { "phpunit/phpunit": "~5.7.10|~6.5|~7.0|~8.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.2.x-dev" } }, "autoload": { "psr-0": { "Mockery": "library/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Pádraic Brady", "email": "padraic.brady@gmail.com", "homepage": "http://blog.astrumfutura.com" }, { "name": "Dave Marshall", "email": "dave.marshall@atstsolutions.co.uk", "homepage": "http://davedevelopment.co.uk" } ], "description": "Mockery is a simple yet flexible PHP mock object framework", "homepage": "https://github.com/mockery/mockery", "keywords": [ "BDD", "TDD", "library", "mock", "mock objects", "mockery", "stub", "test", "test double", "testing" ], "time": "2019-11-24T07:54:50+00:00" }, { "name": "sebastian/comparator", "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", "shasum": "" }, "require": { "php": "^7.1", "sebastian/diff": "^3.0", "sebastian/exporter": "^3.1" }, "require-dev": { "phpunit/phpunit": "^7.1" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ "comparator", "compare", "equality" ], "time": "2018-07-12T15:12:46+00:00" }, { "name": "sebastian/diff", "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", "shasum": "" }, "require": { "php": "^7.1" }, "require-dev": { "phpunit/phpunit": "^7.5 || ^8.0", "symfony/process": "^2 || ^3.3 || ^4" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Kore Nordmann", "email": "mail@kore-nordmann.de" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ "diff", "udiff", "unidiff", "unified diff" ], "time": "2019-02-04T06:01:07+00:00" }, { "name": "sebastian/exporter", "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", "shasum": "" }, "require": { "php": "^7.0", "sebastian/recursion-context": "^3.0" }, "require-dev": { "ext-mbstring": "*", "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.1.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" }, { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" } ], "description": "Provides the functionality to export PHP variables for visualization", "homepage": "http://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "time": "2019-09-14T09:02:43+00:00" }, { "name": "sebastian/recursion-context", "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", "shasum": "" }, "require": { "php": "^7.0" }, "require-dev": { "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "time": "2017-03-03T06:23:57+00:00" } ], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { "php": "^7.2" }, "platform-dev": { "ext-tokenizer": "^7.2" } } PK!\H psalm.xmlnuIw PK!Yww phpstan.neonnuIwparameters: level: max checkGenericClassInNonGenericObjectType: false checkMissingIterableValueType: false PK!ę,752161aedc0d6ed781ada8f3aa9db4973e187d1f.zipnuIwPK!,S2c8696b6cc4243b079e2f016d2da20c00c38c3e0.zipnuIwPK!HU((1MakefilenuIwPK!^$##  README.mdnuIwPK!3 Dphive.xmlnuIwPK!88oELICENSEnuIwPK!==Icomposer-require-config.jsonnuIwPK!ngKphpcs.xml.distnuIwPK!''' Mcomposer.jsonnuIwPK!L!P.github/workflows/push.ymlnuIwPK! ~yyisrc/Types/Collection.phpnuIwPK! psrc/Types/Static_.phpnuIwPK!=a;tsrc/Types/AbstractList.phpnuIwPK!K083VV|src/Types/Callable_.phpnuIwPK!l1SSMsrc/Types/Null_.phpnuIwPK!uiwsrc/Types/Scalar.phpnuIwPK!src/Types/Parent_.phpnuIwPK!Ԩ.src/Types/Array_.phpnuIwPK!oTTsrc/Types/String_.phpnuIwPK!E"Tsrc/Types/Object_.phpnuIwPK!Itsrc/Types/Integer.phpnuIwPK!X^ߠ src/Types/Compound.phpnuIwPK!00ɠsrc/Types/ContextFactory.phpnuIwPK!iTΧsrc/Types/Self_.phpnuIwPK!@OOsrc/Types/Boolean.phpnuIwPK!ĜHHXsrc/Types/Float_.phpnuIwPK!W2_}}src/Types/ClassString.phpnuIwPK!l[[src/Types/Mixed_.phpnuIwPK!4 4 Isrc/Types/Context.phpnuIwPK!Y>00src/Types/Nullable.phpnuIwPK!ZZ8src/Types/Resource_.phpnuIwPK!,*44src/Types/This.phpnuIwPK!q!W##Osrc/Types/Iterable_.phpnuIwPK!#{Jsrc/Types/Void_.phpnuIwPK!ﻸ src/Type.phpnuIwPK!.ŻFFsrc/TypeResolver.phpnuIwPK!!Fsrc/FqsenResolver.phpnuIwPK!\/s99 Ocomposer.locknuIwPK!\H psalm.xmlnuIwPK!Yww dphpstan.neonnuIwPK(('