phangorn/0000755000176200001440000000000013502336243012067 5ustar liggesusersphangorn/inst/0000755000176200001440000000000013502203731013037 5ustar liggesusersphangorn/inst/phangorn_sticker.png0000644000176200001440000006323013475602514017124 0ustar liggesusersPNG  IHDRʧagAMA a cHRMz&u0`:pQ<bKGDtIME'١ewIDATxwi " I{s223;;;;=S{/ylﴛ3ݳ=UUUN)o轷I$"b?De:"p~6ooooqf^ |!ry)uw ??9oxKo=조}o0UL=4:MkE{^ǁ/4K*{c5~[1\Y2<[<'.=Hd1*;CC4_JJrjڨ $S?ӏ. -O,U[B4:ǀ)HFY* { }-O^kMz[Uο5JSSV$e2׻]TK{J-O["V8j<¶ւ?[t^f=crBDbƽ;f?ߺ["?`kZ~fSQ+^<ɸO^o^9M1xK85]4?A *NEddYF_nEVV߸9t>5Ya~>7biun LQ42 Oov<%Yc_l8]y?p[Bo|Pxy yŝE?1XQ EQTTDžv _X%+BiI!ӳKO E>"%/;Xx"N3_"r+y:&`<`hus DIJ:FX\Z'Ln(KI[_󊢤{M#u#D^ђU'Z=`hjp8& }TH$[f|b[N! M('ZQde!JݟoO<'"ΐ,)_LI( (RQ^žvFcaz:[hjƠ! AͰ⠦JV7 tCrR~|c`f0~u`'>y EsJ{K>6d&j>AIyy9\iU[46TL՜!Ea˹$FmLL39H$C<@!(%߆vo}8Ie"zcյB4ZG;(XLF:ikù\k0xJ#OLHJKvFh4tw600<IN?o&ɿ ŔUJiڪ9UNcKA;(hZ*i%H2:>( QSUF#HEp8"3 .igYx( /w;o.j/,.lCE? tITZRžvrO-lkpqx| NnwX_EUU)K N@\Nw#o C|܍ OKYK7TԊqT,[.ciҊrzZE93&gIB]Md[-23L,8Mƥ_7v>)ť8߃pݛNeeAQc-Nc;(Zlk315ONNz(-)̐e@$s `2l"K004}rZ2 9e;.wD>)RTVc7Z+BqSee 5e\mGFfI&%zZDռ4( a']XZ6\ OQd{4SóiBL7ȇx; Oo9QV(.Bo;LM/ޥF,f#oÓlm\GYI!3sˌM ENv7 "%;??tuM ajdUV֊R5$YYV z͍5t dz*+^6DQ xb y24crb"vfv9xFZ@,-oWZ P}ҲrUE R,pPYBL,.S[]NC] L tRNOb؟;7 lFoW"Vf[io',D)d|=m13ºccetĹ˓I<٘^`bzp8zrBHJH\\kJDQy#4CTu)5:#teYj1Hks[f),T7w+r)DQbiNtrV2*o7KaBgdMYSJV.82*['ϢшS]YByarw{kn/CjTră=˝]o||RzXQXRؒG:DSE\Hcx~RVhԿpK_I=^?C#SٷhuFfGHώm M U;ӳKDc~).*{}.AiZ@ԙ땽"4?DzeYl2ZOg[#|ₗ*+W5G1 tw4O$bumrz2[ϒ9689]^1_5OSqVoFGjmG`t|D( Fcvܽ7p-+2 99|bמ¢["hVNA( }25hkxmyE;;pn\GyiQF` §rBvGbApMeeKR~SOEx(BvfX[dnݝMGg_X%HLhw2#[V$%|-ݑ^#p ]{t]RhTY9ʊQfc_V>h?8f+*>3Q#tqY EISC5]Mo|^WZOaA LN-DO I N/;+ς'FTy93Q'I`3Ɩ陥T+6 lYB$Ibi(ٌbqNtݑ5߬?t,E-VDA[u9A8|L`6iO;Ƨ}e}r4FfI'Cm;8zxwзt"[Sy.*j}0k {AQ}o|'wϭPVVHks]&4 9a@N۱]{ [ [ ~_o -.)by6&vik},kԨ>/[=42ŖsZˋ_ad|`Tr: GSÀ^>ꝎYJomƟZvPW TXslAih4i{m})=]͘MFFg[X!?IƓp}Kv&‘(O'Yw;J"yoÀ-4Gʕa0FcO(= }:Fg t5)+Db#s3*G7yjCrwש* "À|k;Zfq>`-o˫Y/˲Au{{FVOS]U(F}'A巿C FRQ^D}m% d .7EdY k z*K)-)du}EJJ iELFDLg~]ݜUfuwɘ$s,M 9dݼάӔ>6Gj1sWz<d2;hiE<gnq Qt|.-MD1V73E7s Lc kDB}m%V[RO" nDЬ?ʭMQm{ϕ<ӟ jr1^o^d2h`?ȵak71 |% sx24ŝdgY0D"1DQ P\OiI􂥣"o!6*$i‘(mTU݂EԊن^e`#Li_#Mg, %N(b_;9<3'MQ@AAVJ (,eq{(^C$_LJH̖sY9 bw8[TKg[[BȲɨ Gg#GY^unHP9.R;PP*||x<8A]M޸@NT2Ap8&,n\%]MT ɲZ2]zc >@R sߒbo*^ı$+tu4L,7 IYOdW ʡ:&:;7ȵeÏ(i9YTWY[";ʅvt:-F, nn}tJ "ZͼEˊNelOe泰S㬮mrAN*ZT"'yZu}NQrt G\E]MEFV~VQ;L.ш\Y1tT  (BB5k8c3H( v5SUYį4:*K盻t5rR7 'ɤT6{= 堏̊rh"u{OaA,Hug DG[3ux P]UAxNAĢ(g_g˹GK:#ȲlntZ-+k{'(*'8*/:Nq@N{L.NqQ>7o\< I D1$IFQ זMve j?>[.RfYV[3ѨF_xɇg)N &&Ek{( $ fVHJj<>zI[OBTUT%9nY8W5TVP>imjRqfVnA0/PG8޹kMZiom8J ?ķ aGHJ5Ue@!xpH$( r.C@`{gϿ~:u|C3/t]`rfMQDE$P;Ӌ۷H$fs XotG_!HW{_z%wȂ ɔ<`iN(g_Q-/^DYYۤK/E!HpIYF}cvM(9{DVY\;nV3FH4̐Hc2,Ƶ> lMH&%޽ϕK] fV^n^b1;@QTj}]% u.>ljFc}H-X: %E3J8Uh3Uu^s@(,I۷x28(Cadhc1HL4Öŏ~pϗL8T|SK/ H$%H%~UOڰ_#bBdR!ש(iajZO?fh#+ Ӌ|yã3SXUˮr3Hǯ?3sTWqx"T" Q̹7\ M29",X,&޽֏^㛻 M [MoM& f嵵GQ6p>xF~ 0ʯ~ >_QT-cnA.PVbtZ-귏ME FcHv^$,.7r'cMX_h`eaiLJA(4#}+r":csdgYyGZgNV 2]0Ueܺյ rr.DZM2DrB'y9J&%>f˹jfݾŗ<"gHZQ^;Wtȓ O20<\[6347`4N IziׁIBhZ[Y]`t|OEY1߼Daa޾X^qE;YoX>s6HEY1YY0[ԤEtOoG68#c3x}j*.gtb.SL}]%Ó<`M/vZj3יyD ăG$쥮9@׎o?! "-4Zn^GEC }czf}|J>a)ߧ>3pMGgX\^GE;z[w Iy?g^[SUɇ^_qIn^`m}6h&-MaF-V6h1JL=D4S7זMIqk#Q;|ZF.]^ z=KkF# Gůdum3m_EyX6:>K"Bop9mt5ǂx<øvTUpJFSj*xZ:6cw^=Bn}q( 5<("zϯ23s۝QݭԱdE"1&0 TVd2rr7q_|[DQ E2J-~tښƸ}o G_A0M Lqzn^j5 4#cr,,ߠiFg3jŅt5PQ6UTON/j"P")H$\E-;cg4WO" uM&ܾ?Eys?Ei&g3*m-u|WjEȽ zn\U-d eFer(/+bm} ?$t6D^nS b1V6YYUl-.Z-' F]~m66().j0|T&:P8B 7UH~-C_b`xE$IFѰnb;j&[YgIy40'c$V:3r~`҉Y<2|>z/fgǃ h56;bqט]BJJ\IsSΜȂ 07§_j5/~~ݾ7\|!|^Ȳ _}VO~.SRV7YZ#"yy6DQdgtfzQG[ׯPTGeyI42iϳaIQ m?nh4^#+LՂdDסш `-Mv<ܺ׎ ^LE ETR~olu Fjod ln082m9|u*KRBm a"Lh0RWSAC}%9Y/\Mt΄Ȓ,'P# _m;9$Pf޽qAHƆ*{ڎyV3)jTSKUe)h5=GVc-IFy;&HIq%{_qy ݪ@Z5o7CaP~._DҀ?Det:-VA#Q(R'eE(Ycۥ3? u5 n%Oj0 MFt:;=K z 01x]-|e5=/±V\>W(t6P]Y zt:i4bf!r15q_h(oMe]/Eyܼq45`60)܉g[=k{ɶP^AmKj:hI{iUߞ&"톽,T"H`0+=ms[uTfZkɶfG!˦^1/s!!I2Ӌьe͵e{?z/S~tiYӑV<w$jR^qޙYQJy NLJjo;tp:)&vQ ()?o.k5W3 '/!Ir':&4H[*dYfpdѱ_ 5/֟-28sej1g~( XݱFyEoC~&5vJE!P#uZ--Mh*\[EA2ėgL.q/t٬hDc'([u8DH4>пdsEN7_/HMTÅTW%Ixd5z-=]-Tų8Dv@MLITBj,h'IgtXXZ;wUԂ ۏ(+N4-vh&͵s㪝gKKvvDc1>ZD"BU=1Ζ}KvtZ-%n~u"1޽ޏ٬61sǃ$ &#/t~+f9d  mn(ز(-)$pl:RUuH)b8%4qKApnﰴljUs-nH$Z̼s?{n,,a69z.7Ɩ FCMU9Zf*'"Eyi1j,[]&{1 ʵHqvv=_~A(NM > 5UeXDh4~h ZDQF&%HKc47EdYͩ_+PTF#ƉDcX& ͠( ]MTU+R^VDKS-+7ՑƵՔX_MўW5s9Feμ"+BYI!E,.꠱*ӗaemD2IEy1YgD*:5H tZ<" S]Uʅsݖc_=vva ŅyLv%<^+^2=7^Et`"et`XV#jU Fp8frfͭ,fZ̩ӵ{:˂eE|gE~aG^(vtٗF-*ʊ1 a|YV3 C*ˋ);b`DVUG' h4z[VcÑ(+k zj8%klmP]UFey+۞&e#O0>@"!Q\Mqѫuk /Ȃ d>ه.k#;斋7YY@MUZFC"jPSU:k뛬;vzR|dAh זEued@0csŕuN~+B"Gc0n=E}+"bfwj%3;La~wNHM&%K+/rybdisx<+BnN65Ue1FwG3,dY!OolƦ`0$K :jik?C)EQ`y&SƂ "+# %A)D1$YAAAVdEp /b]\)e}A@{2)!0%E^tF%<^?dq  l U%45PZRoy #QFeӜ:EQX\Y!A~Πg b|r|  YV %EHccyB{XgF)Zxp?JNY}F<^?CۺZ,B)))$'ˊFS_$9);6.`w81tw40GS<'KRY^;AǦI$%:(/->v#+I2k<nwH&(/-^lK%ڌ ӳK#Q̩Lf 3Vnz-'p8Wk D"1I Q/% K j˩(+z.˵N4 }ز1jh s#N @(frf?LeE u<y\.7V#XҤ2<޷pAO[k3:˵+K"r"'h4u\47a^׉lA;|=>z*{.P8BREu)_.n$RT{7.o=o2ƺ}RHI$a[Q[Xש3@N'Aq{CAgH齰4m7PZRNk+O=q{xdU$IƖcB_;mM{M&!m~7|t OEQ$I`0hTomw/=:(  ~V ͍5_/5="je|?d|jImTז$F&Bdٲ͜k$3s$2f&z:ZNu;!!kMt: \MqaҗTJ~g_cw{W.Ge<^?f Nkͧ_Ɩ^ /NӋȊL{K ~[QXwl1ռC73l6ތ^=q=EA`auE4 < glr7N =TUI81k. .68`(b6>~w2yBQj+klYx~!K+Ȋǧ2 =|'f޽HC]s$IN͡E!/7JVV7W]yEgl Db11$?/=SUL-z'QSU~&{ӝم>S( 6:(.ʧ:ӈEZ|]v=>wE ^~qm;Wi{(FCwGӡ_/ (PS]";^wTf*2#3=~rh9e2m:rH&%6 LN"l6Dog[i4]mugN3u:-.f|[*(B}M%޼c :d䝫σX,4p8UOWwr5BiQYl9ln*/ԯՍ-&g8!8RR:] Nl'hb_ǙYd2I(aվ[;$2Vʒo8ЋBQx"<"(rj*hFϻH 0=&}2WQ&*ʋqllؤNG4`kp ?c6iblri0 `jv QPꟷ",\4e2`, zVAQd /uy2<ۣ*o, :ݙ$IF#q:5,RkOsGdQ',.1<6æsD"V+7hǓ(BEY] N!]޹bV aƩ(+u_::\.WVKOg %Ed2I4O qeVܔVLrR}3Xx@Yleͮ:|g2*87DN]t2:1xAG}]9ՕeL,vmTPVZG,,ٙY&pV_.,&;E(d[$$ ",zGCc(^p8J4#SE$Պ j:HhDY<:>K~妴\`r^ɤVLY뽙VKQa>Et78]n.տ!VV65"&E݀擟Cnn:rXcվǣHLue){h,F "?5;K[Fj1RGw{sjУ!&$fj*1PB~M>ucDcqsςԿUXwl2>9$ITUS_S nKt #uKK "<?;nۻ캽BLӚ7NCנD1-6[s+z|lonpmZ-$˔CEarz/@nn6=.g8al>>fv~0^YQW.v|N`p8JqQ>M /azf-Uy62rCa AP)$ˌϢ( jpŕuښ*j1nq7V{7.`ȵM(+n}Y\t"wQMAcseduZJ ()*?PjH_L=7u j;uG6˳X_MaAd`0`emkV-<8V<@H[9DQ۸=>Jζf^ ,8hE.;WhL5vup{|a1^) $Y!huՕ'7J9o0M$IN|%r4lb6KJGu(.gjfYy[! "  ȩƓi4",ϏpJJ_K+H$169G4F}m!NQQ.>cDcL'SR5\˵}T}?W/uc4XZqwqv<( S $qύ_"ުVE"1FǾee9{^Osc-?&?%;>NA}:CoQvtz-kί'g1u\Ş{dDQbo'7o\b6/f*M^&H{HēVr+/M^d2k \g/ZM͡l ]/+kD^Ay̜l+۸=~crz(rK]m/A0ɀcs/ĺcLY#q![N7EyཫrHk,N.^eEX-w] +ZCuLـ/U7FĨhNeht EQhmbohmk ŭ9^EI$<W^kYBBԂ͖׫fWj__YQvV$LűMԜ0-ݰQ[U%ܸҏ]c]5ܼD^^#V6&N0> ž|.Ո,.3<:M2)sxc3"%%dY&LPXh;?ctbW{4Tcz VgTOnRRϮᄎ_U:g:Ζ3EP`rz]Yז4p`awz(PRTL Ȳ̪})V$jmŌDb6?,VQJ |=66]|}$I[{}s P\> ^k(#';WYdEfnaGpxQʊbl9YFM@:fvxt¡(: ڛtGx}J _Ņ|u>.[;|CIЎD|s .,w_x7UCQ\#^^iX,4ƈDbXf:jctbY͜r+vv~GQ.wRS]^#HPRT:˫v_+-M~_z;OvO$`zD_3_9'Qא$ʊn\$x<>dY&ז:^G[K=:ɶ" ,jdy’f:T%s>?~uuFޮSYF&GDζ+!:`wׇNKO >$pP2>* |5j*i4V"H'UPsl|=)2+'ZfAP=Kr5'yL(Hl+.wT+xH4(=+jT{dIb;tCƏn^嗟~Ύ$sZ}xL"/7w, ^ZMQ'}oH$FqQ>?:MϤjQɶrTIdELs&dE O>A~~XGy湂 3mu߹OIqŷK! WI&4WOnRUQvMFc zN6)?x\‘(01=z}ߺz }4Uk.YQF%%45׎?u.,əEQ(/-]#;B8AW툢H0[Y^Pou6v*~|dFÍ}jWyqVV (`1NݻUCK+|]0_yίlGZrv|gDV[:mqlRgwCE! !K2FK/qvPh9{}oF 7VoTy 𭿽ߵDA$O<58~E !"Č15s#OE#MzE&@޻qԣB( Dq;)BqZdg=aeu6^aeE`ПKQPP#*.7v ']H jס}ΝYZ``x$qBgx>kS]frz_mut7b1$D1S} je{Ǎcsu[ݧ"&ي^ E%H:-"ƮÓ8wimeFg|>lՕ=g(l9wPWSAo; ϲN_OȒL"DDLC]U;˫\.xIPVRjZDvNG< Zc `yfV(+WŶC#affydA۳ ;t6pB'n/ƙ[b_;%veR]lHڱ株! xU©Ѡ$2*J8fSj,u(+)Dժw~+k ݼ}naL&#^'LV6 '?-m‡My/enxh3 hpADA dh5{eTBNN^c{(jȲZqn?4 `rzI͡*ʊ SIfutrm9z"(jޒ8 !տnͱœI‘d[ezvH,LEQpND5>2ŧ釘?F}zΧ5h+Q搏K:tX^u㦡Z'#c36^ 5 )3HJH4b_7\O~n7!Z kx}VE{.'=>?at|RzZrǪJ!%|mw#^ SXjy0&MM-d1|$Poţ}= Fg6jʞ0Ր$x"d\02>KQQ.?9AnC( LM/QTG{k=n'Cl9٦H i5Bۡ- z*%RdN{ " w#>ϲwDEgubA8Hv,.c2iC28299YX-gͼ.K&z|sQ,؉DTUiKymHϳx`ǃ,)'͡?ܺ%|@ik"ónþ+"6[G`@k:tf]8;O vuB; MEhпj!ш,, E٬T}þ!Hr˹{,,RGSC 3s+ܹ7Ȧs'3((wwfvlndPTw"sN~_ɘޢjRAG]d:niŎ*VO#lt:k::u׋N0%S| y24IIqzq{u:=)!M+%)ߪoߚY4y'^kf(dBqB?,y'ЭCD!^)+- ;SVV|}1.=242cx~poFxq'{O3-8K>) YI9wYԙŢFqYo颪\.7# l 7uoa6='H7w15Hc}5m ,8#cW&O{ P `=4$y3>IF=X >ZLQ Y\homUfjڲވnZ?} EQhjF?] QT/ Ol.w u58TNƤ9=WϲwA7mIu%L8-C/{VZzc~ϒgL[tz^S*¡m5uDA4k[deYȲZε!jb~iH$FeE yopN$ӳ|sgx, F?apdP(rr8-);C?8lsl{(n.aY!rȿZYV3]hY+ȁDRbs&y6[Dc M3=/+Mv=>lV*޼0\ڰNn`ͱEwG35eMq]Ʌ_lOh㫘/jmkӜc^82Ɩl+V|t:Wx~Vӹv/Ҳ<q<[y<8A :,FܑtᭇHr7vXL`\g-jd"+Rp3_?uvY[ j| % N[ٌd`xP(Fkw7tZ-7[nA 9s/wXX^*ffs-|{gj_]qF}kq+|p]R\{W}wޢ_,67X_y!%w/_DQMZZ^'Q^VLnN'9(+d6vv=ܺ;ɤ|R&)MNxW|zw({{ON{^ SNe@!Ϣw*F V Z^_u$]-gqَb$;FU;o,^@4`|j;DЈ"w261G$;IVVl9`wfv儼WV>,qH /\<[w"nwXЊz.K;^emZiEQ^ܭjx}llEs/i+}=08<'cx`ERQo7[c`N"r<s# ^}nwCdp6OfΤ+5b.qUvlnSUQBg[#rw+&uqN$HG^g%=!ghl*+oNLrWbPΜ9~rx^y3u#ë2'w#MƼ˾/6#ZTCC0K+v| mT1"Z-uFkvYYֽZ@[w2s[ēewŷ'r/#gFW}8BˀEϸ")z^iJKU]ť5zZȲem},/wkZkMb8_r<57w'\؉dރaGgO%+o\x/a)&9<|WԀL4^w\Tj)vyWfYgjb!r$ɪܽA~^]b1/]N&@l+%/NnyᤫRF'p4r }wƭ?x7"ɳ+%p?ƞ3rݿ=ћu;ZDԈ9?G1V6qnRWSAks-۪-Ir^m184Ui$%#+}{8Uetw4cwlq-dD"t/x=?(,p[;5Ӓ=jw>V]^{&F;EAR_[Aoɤ,V?[/.U浲j\QLL35DIQ>m-zx24ɶ}jeYKˁ/D9O-F|lB@Cۡq~r]>hVgIzy&s<ֱCq74zVkcYׇ\EQVvu6Xñ2e%eҽlBÇ+ke&t:C#S`ER<o ί܋Zܣ܈sO̚x<>*3ڌy=dZPc4pȉ4I FqQ3Kllhi\O})bnj{]m-uVyjP(r(D(Ƚs|{"׍ػ;,'E )D>xY罄nr*ˋ; d3XԊEǽ(h4"Օe\kG0:>K,Jtg8I0/RYQJSC5 '#캽ꅟ$+G3~G[#{@܇J҃qGG6>xӈw3&Aw#aT'9) YwHCV=utu4';…6Jmf~DA O0,V&"(C;'rR¿vo.sFM%?pˡ3i%rHgu#;E!'JOWK&bNuU)]-lON'Fctu4a6enax~(b_fv3r(y+<śNЙ L%X-kj[t ݬ//7v^:hod2?v±Msc -2:>K >)3 pbл֘sXIaUb8^µ]k*j/1{#EQj4Vӆ({ۨ.?TPd\\@[sVee8bb`+a7i8--nT>y/%"ヲsA0T^؞אGz ƖeHGk= vI~j yuh3|(BqowPow $ө"O&O? &.9*dY\W*|_zO.oCiL]Eݹu?֛uO\K bqyd4镊;n{kϲw#Nyu&\:h1J{*CA)n8y욢(D0pw פ#D&+{$ avyViqWяZ[&7GU;}&r}ttQA -M`*]4CfQ+; [rr*Œ1ok-T o[">rhQcI夜iac=/8,]tuKO͞ץ7ki~A%tѽOdZV>K%r49&-=:zT{ݷxA%0'rĿ[ToH%tEXtdate:create2017-06-14T19:22:39+00:00- %tEXtdate:modify2017-06-14T19:22:39+00:00tEXtSoftwareAdobe ImageReadyqe<IENDB`phangorn/inst/CITATION0000644000176200001440000000252513475602650014214 0ustar liggesusersnote <- sprintf("(phangorn %s).", meta$Version) citHeader("Use 2011 to cite phangorn in a publication; 2017 for plotting phylogenetic networks. As phangorn is evolving quickly, you may want to cite also its version number", note) bibentry(bibtype = "Article", title = "phangorn: phylogenetic analysis in R", author = personList(as.person("K.P. Schliep")), journal = "Bioinformatics", year = "2011", volume = "27", number = "4", pages = "592--593", url = "https://doi.org/10.1093/bioinformatics/btq706", textVersion = "Schliep K.P. 2011. phangorn: phylogenetic analysis in R. Bioinformatics, 27(4) 592-593") bibentry(bibtype = "Article", author = "Schliep, Klaus and Potts, Alastair J. and Morrison, David A. and Grimm, Guido W.", title = "Intertwining phylogenetic trees and networks", journal = "Methods in Ecology and Evolution", volume = "8", number = "10", issn = "2041-210X", url = "http://dx.doi.org/10.1111/2041-210X.12760", doi = "10.1111/2041-210X.12760", pages = "1212--1220", keywords = "exploratory data analysis, networks, phangorn, R, trees", year = "2017", textVersion = "Schliep, K., Potts, A. J., Morrison, D. A., Grimm, G. W. (2017), Intertwining phylogenetic trees and networks. Methods in Ecology and Evolution, 8: 1212--1220. doi: 10.1111/2041-210X.12760" ) phangorn/inst/README0000644000176200001440000000123213475602650013731 0ustar liggesusersThe following persons and institutions helped in the development of phangorn at one stage or another. Emmanuel Paradis and all the other authors of the APE package. Tim White for provinding some C-code to compute the Hadamard distances. Bennet McComish for providing the allTrees function. Francois-Joiseph Lapointe for feedback on clans and clips. Further thanks to all the user that send bug reports/fixes and have helped to improve this package. Financial support was provided by the Alan Wilson Centre of Molecular Ecology and Evolution and the Muséum national d'Histoire naturelle and Universidade de Vigo. phangorn/inst/extdata/0000755000176200001440000000000013475602650014505 5ustar liggesusersphangorn/inst/extdata/Blosum62.dat0000644000176200001440000000561013475602650016612 0ustar liggesusers 0.735790389698 0.485391055466 1.297446705134 0.543161820899 0.500964408555 3.180100048216 1.45999531047 0.227826574209 0.397358949897 0.240836614802 1.199705704602 3.020833610064 1.839216146992 1.190945703396 0.32980150463 1.1709490428 1.36057419042 1.24048850864 3.761625208368 0.140748891814 5.528919177928 1.95588357496 0.418763308518 1.355872344485 0.798473248968 0.418203192284 0.609846305383 0.423579992176 0.716241444998 1.456141166336 2.414501434208 0.778142664022 0.354058109831 2.43534113114 1.626891056982 0.539859124954 0.605899003687 0.232036445142 0.283017326278 0.418555732462 0.774894022794 0.236202451204 0.186848046932 0.189296292376 0.252718447885 0.800016530518 0.622711669692 0.211888159615 0.218131577594 0.831842640142 0.580737093181 0.372625175087 0.217721159236 0.348072209797 3.890963773304 1.295201266783 5.411115141489 1.593137043457 1.032447924952 0.285078800906 3.945277674515 2.802427151679 0.752042440303 1.022507035889 0.406193586642 0.445570274261 1.253758266664 0.983692987457 0.648441278787 0.222621897958 0.76768882348 2.494896077113 0.55541539747 0.459436173579 0.984311525359 3.364797763104 6.030559379572 1.073061184332 0.492964679748 0.371644693209 0.354861249223 0.281730694207 0.441337471187 0.14435695975 0.291409084165 0.368166464453 0.714533703928 1.517359325954 2.064839703237 0.266924750511 1.77385516883 1.173275900924 0.448133661718 0.494887043702 0.730628272998 0.356008498769 0.858570575674 0.926563934846 0.504086599527 0.527007339151 0.388355409206 0.374555687471 1.047383450722 0.454123625103 0.233597909629 4.325092687057 1.12278310421 2.904101656456 1.582754142065 1.197188415094 1.934870924596 1.769893238937 1.509326253224 1.11702976291 0.35754441246 0.352969184527 1.752165917819 0.918723415746 0.540027644824 1.169129577716 1.729178019485 0.914665954563 1.898173634533 0.934187509431 1.119831358516 1.277480294596 1.071097236007 0.641436011405 0.585407090225 1.17909119726 0.915259857694 1.303875200799 1.488548053722 0.488206118793 1.005451683149 5.15155629227 0.465839367725 0.426382310122 0.191482046247 0.145345046279 0.527664418872 0.758653808642 0.407635648938 0.508358924638 0.30124860078 0.34198578754 0.6914746346 0.332243040634 0.888101098152 2.074324893497 0.252214830027 0.387925622098 0.513128126891 0.718206697586 0.720517441216 0.538222519037 0.261422208965 0.470237733696 0.95898974285 0.596719300346 0.308055737035 4.218953969389 0.674617093228 0.811245856323 0.7179934869 0.951682162246 6.747260430801 0.369405319355 0.796751520761 0.801010243199 4.054419006558 2.187774522005 0.438388343772 0.312858797993 0.258129289418 1.116352478606 0.530785790125 0.524253846338 0.25334079019 0.20155597175 8.311839405458 2.231405688913 0.498138475304 2.575850755315 0.838119610178 0.496908410676 0.561925457442 2.253074051176 0.266508731426 1 0.074 0.052 0.045 0.054 0.025 0.034 0.054 0.074 0.026 0.068 0.099 0.058 0.025 0.047 0.039 0.057 0.051 0.013 0.032 0.073 phangorn/inst/extdata/RtREV.dat0000644000176200001440000000136213475602650016143 0ustar liggesusers 34 51 35 10 30 384 439 92 128 1 32 221 236 78 70 81 10 79 542 1 372 135 41 94 61 48 18 70 30 90 320 91 124 387 34 68 1 24 35 1 104 33 1 1 34 45 18 15 5 110 54 21 3 51 385 38 593 123 20 16 309 141 30 76 34 23 235 57 1 1 156 158 1 37 116 375 581 134 1 7 49 1 70 1 1 7 141 64 179 14 247 97 24 33 55 1 68 52 17 44 10 22 43 1 11 460 102 294 136 75 225 95 152 183 4 24 77 1 20 134 258 64 148 55 117 146 82 7 49 72 25 110 131 69 62 671 5 13 16 1 55 10 17 23 48 39 47 6 111 182 9 14 1 55 47 28 1 131 45 1 21 307 26 64 1 74 1017 14 31 34 176 197 29 21 6 295 36 35 3 1 1048 112 19 236 92 25 39 196 26 59 0.0646 0.0453 0.0376 0.0422 0.0114 0.0606 0.0607 0.0639 0.0273 0.0679 0.1018 0.0751 0.015 0.0287 0.0681 0.0488 0.0622 0.0251 0.0318 0.0619 phangorn/inst/extdata/MtZoa.dat0000644000176200001440000000261313475602650016233 0ustar liggesusers 3.3 1.7 33.6 16.1 3.2 617.0 272.5 61.1 94.6 9.5 7.3 231.0 190.3 19.3 49.1 17.1 6.4 174.0 883.6 3.4 349.4 289.3 7.2 99.3 26.0 82.4 8.9 43.1 2.3 61.7 228.9 55.6 37.5 421.8 14.9 7.4 33.2 0.2 24.3 1.5 48.8 0.2 7.3 3.4 1.6 15.6 4.1 7.9 0.5 59.7 23.0 1.0 3.5 6.6 425.2 0.2 292.3 413.4 0.2 0.2 334.0 163.2 10.1 23.9 8.4 6.7 136.5 3.8 73.7 0.2 264.8 83.9 0.2 52.2 7.1 449.7 636.3 83.0 26.5 0.2 12.9 2.0 167.8 9.5 0.2 5.8 13.1 90.3 234.2 16.3 215.6 61.8 7.5 22.6 0.2 8.1 52.2 20.6 1.3 15.6 2.6 11.4 24.3 5.4 10.5 644.9 11.8 420.2 51.4 656.3 96.4 38.4 257.1 23.1 7.2 15.2 144.9 95.3 32.2 79.7 378.1 3.2 184.6 2.3 199.0 39.4 34.5 5.2 19.4 222.3 50.0 75.5 305.1 19.3 56.9 666.3 3.1 16.9 6.4 0.2 36.1 6.1 3.5 12.3 4.5 9.7 27.2 6.6 48.7 58.2 1.3 10.3 3.6 2.1 13.8 141.6 13.9 76.7 52.3 10.0 4.3 266.5 13.1 5.7 45.0 41.4 590.5 4.2 29.7 29.0 79.8 321.9 5.1 7.1 3.7 243.8 9.0 16.3 23.7 0.3 1710.6 126.1 11.1 279.6 59.6 17.9 49.5 396.4 13.7 15.6 0.068880 0.021037 0.030390 0.020696 0.009966 0.018623 0.024989 0.071968 0.026814 0.085072 0.156717 0.019276 0.050652 0.081712 0.044803 0.080535 0.056386 0.027998 0.037404 0.066083 Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val // end of file Rota-Stabelli, O., Z. Yang, and M. Telford. 2009. MtZoa: a general mitochondrial amino acid substitutions model for animal evolutionary studies. Mol. Phyl. Evol. phangorn/inst/extdata/wag.dat0000644000176200001440000000577713475602650015775 0ustar liggesusers0.551571 0.509848 0.635346 0.738998 0.147304 5.429420 1.027040 0.528191 0.265256 0.0302949 0.908598 3.035500 1.543640 0.616783 0.0988179 1.582850 0.439157 0.947198 6.174160 0.021352 5.469470 1.416720 0.584665 1.125560 0.865584 0.306674 0.330052 0.567717 0.316954 2.137150 3.956290 0.930676 0.248972 4.294110 0.570025 0.249410 0.193335 0.186979 0.554236 0.039437 0.170135 0.113917 0.127395 0.0304501 0.138190 0.397915 0.497671 0.131528 0.0848047 0.384287 0.869489 0.154263 0.0613037 0.499462 3.170970 0.906265 5.351420 3.012010 0.479855 0.0740339 3.894900 2.584430 0.373558 0.890432 0.323832 0.257555 0.893496 0.683162 0.198221 0.103754 0.390482 1.545260 0.315124 0.174100 0.404141 4.257460 4.854020 0.934276 0.210494 0.102711 0.0961621 0.0467304 0.398020 0.0999208 0.0811339 0.049931 0.679371 1.059470 2.115170 0.088836 1.190630 1.438550 0.679489 0.195081 0.423984 0.109404 0.933372 0.682355 0.243570 0.696198 0.0999288 0.415844 0.556896 0.171329 0.161444 3.370790 1.224190 3.974230 1.071760 1.407660 1.028870 0.704939 1.341820 0.740169 0.319440 0.344739 0.967130 0.493905 0.545931 1.613280 2.121110 0.554413 2.030060 0.374866 0.512984 0.857928 0.822765 0.225833 0.473307 1.458160 0.326622 1.386980 1.516120 0.171903 0.795384 4.378020 0.113133 1.163920 0.0719167 0.129767 0.717070 0.215737 0.156557 0.336983 0.262569 0.212483 0.665309 0.137505 0.515706 1.529640 0.139405 0.523742 0.110864 0.240735 0.381533 1.086000 0.325711 0.543833 0.227710 0.196303 0.103604 3.873440 0.420170 0.398618 0.133264 0.428437 6.454280 0.216046 0.786993 0.291148 2.485390 2.006010 0.251849 0.196246 0.152335 1.002140 0.301281 0.588731 0.187247 0.118358 7.821300 1.800340 0.305434 2.058450 0.649892 0.314887 0.232739 1.388230 0.365369 0.314730 0.0866279 0.043972 0.0390894 0.0570451 0.0193078 0.0367281 0.0580589 0.0832518 0.0244313 0.048466 0.086209 0.0620286 0.0195027 0.0384319 0.0457631 0.0695179 0.0610127 0.0143859 0.0352742 0.0708956 A R N D C Q E G H I L K M F P S T W Y V Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val #Symmetrical part of the WAG rate matrix and aa frequencies, #estimated from 3905 globular protein amino acid sequences forming 182 #protein families. #The first part above indicates the symmetric 'exchangeability' #parameters, where s_ij = s_ji. The s_ij above are not scaled, but the #PAML package will perform this scaling. #The second part gives the amino acid frequencies (pi_i) #estimated from the 3905 sequences. The net replacement rate from i to #j is Q_ij = s_ij*pi_j. #Prepared by Simon Whelan and Nick Goldman, December 2000. # #Citation: #Whelan, S. and N. Goldman. 2001. A general empirical model of #protein evolution derived from multiple protein families using #a maximum likelihood approach. Molecular Biology and #Evolution 18:691-699. phangorn/inst/extdata/jtt-dcmut.dat0000644000176200001440000000564613475602650017125 0ustar liggesusers0.531678 0.557967 0.451095 0.827445 0.154899 5.549530 0.574478 1.019843 0.313311 0.105625 0.556725 3.021995 0.768834 0.521646 0.091304 1.066681 0.318483 0.578115 7.766557 0.053907 3.417706 1.740159 1.359652 0.773313 1.272434 0.546389 0.231294 1.115632 0.219970 3.210671 4.025778 1.032342 0.724998 5.684080 0.243768 0.201696 0.361684 0.239195 0.491003 0.115968 0.150559 0.078270 0.111773 0.053769 0.181788 0.310007 0.372261 0.137289 0.061486 0.164593 0.709004 0.097485 0.069492 0.540571 2.335139 0.369437 6.529255 2.529517 0.282466 0.049009 2.966732 1.731684 0.269840 0.525096 0.202562 0.146481 0.469395 0.431045 0.330720 0.190001 0.409202 0.456901 0.175084 0.130379 0.329660 4.831666 3.856906 0.624581 0.138293 0.065314 0.073481 0.032522 0.678335 0.045683 0.043829 0.050212 0.453428 0.777090 2.500294 0.024521 0.436181 1.959599 0.710489 0.121804 0.127164 0.123653 1.608126 0.191994 0.208081 1.141961 0.098580 1.060504 0.216345 0.164215 0.148483 3.887095 1.001551 5.057964 0.589268 2.155331 0.548807 0.312449 1.874296 0.743458 0.405119 0.592511 0.474478 0.285564 0.943971 2.788406 4.582565 0.650282 2.351311 0.425159 0.469823 0.523825 0.331584 0.316862 0.477355 2.553806 0.272514 0.965641 2.114728 0.138904 1.176961 4.777647 0.084329 1.257961 0.027700 0.057466 1.104181 0.172206 0.114381 0.544180 0.128193 0.134510 0.530324 0.089134 0.201334 0.537922 0.069965 0.310927 0.080556 0.139492 0.235601 0.700693 0.453952 2.114852 0.254745 0.063452 0.052500 5.848400 0.303445 0.241094 0.087904 0.189870 5.484236 0.113850 0.628608 0.201094 0.747889 2.924161 0.171995 0.164525 0.315261 0.621323 0.179771 0.465271 0.470140 0.121827 9.533943 1.761439 0.124066 3.038533 0.593478 0.211561 0.408532 1.143980 0.239697 0.165473 0.076862 0.051057 0.042546 0.051269 0.020279 0.041061 0.061820 0.074714 0.022983 0.052569 0.091111 0.059498 0.023414 0.040530 0.050532 0.068225 0.058518 0.014336 0.032303 0.066374 A R N D C Q E G H I L K M F P S T W Y V Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val #JTT rate matrix prepared using the DCMut method* #------------------------------------------------ # #The first part above indicates the symmetric 'exchangeability' parameters s_ij, #where s_ij = s_ji. #The second part gives the amino acid equilibrium frequencies pi_i. #The net replacement rate from i to j is q_ij = pi_j*s_ij. # #This model is usually scaled so that the mean rate of change at #equilibrium, Sum_i Sum_j!=i pi_i*q_ij, equals 1. You should check this #scaling before using the matrix above. The PAML package will perform #this scaling. # #// # #*Prepared by Carolin Kosiol and Nick Goldman, December 2003. # #See the following paper for more details: #Kosiol, C., and Goldman, N. 2005. Different versions of the Dayhoff rate matrix. #Molecular Biology and Evolution 22:193-199. # #See also http://www.ebi.ac.uk/goldman/dayhoff phangorn/inst/extdata/HIVw.dat0000644000176200001440000000317513475602650016022 0ustar liggesusers 0.0744808 0.617509 0.16024 4.43521 0.0674539 29.4087 0.167653 2.86364 0.0604932 0.005 0.005 10.6746 0.342068 0.005 0.005 5.56325 0.0251632 0.201526 12.1233 0.005 3.20656 1.8685 13.4379 0.0604932 10.3969 0.0489798 0.0604932 14.7801 0.005 6.84405 8.59876 2.31779 0.005 18.5465 0.005 0.005 0.005 1.34069 0.987028 0.145124 0.005 0.0342252 0.0390512 0.005 0.005 0.16024 0.586757 0.005 0.005 0.005 2.89048 0.129839 0.0489798 1.76382 9.10246 0.592784 39.8897 10.6655 0.894313 0.005 13.0705 23.9626 0.279425 0.22406 0.817481 0.005 0.005 3.28652 0.201526 0.005 0.005 0.005 0.005 0.0489798 0.005 17.3064 11.3839 4.09564 0.597923 0.005 0.005 0.005 0.362959 0.005 0.005 0.005 0.005 1.48288 7.48781 0.005 0.005 1.00981 0.404723 0.344848 0.005 0.005 3.04502 0.005 0.005 13.9444 0.005 9.83095 0.111928 0.005 0.0342252 8.5942 8.35024 14.5699 0.427881 1.12195 0.16024 0.005 6.27966 0.725157 0.740091 6.14396 0.005 0.392575 4.27939 14.249 24.1422 0.928203 4.54206 0.630395 0.005 0.203091 0.458743 0.0489798 0.95956 9.36345 0.005 4.04802 7.41313 0.114512 4.33701 6.34079 0.005 5.96564 0.005 0.005 5.49894 0.0443298 0.005 2.8258 0.005 0.005 1.37031 0.005 0.005 0.005 0.005 1.10156 0.005 0.005 0.005 5.06475 2.28154 8.34835 0.005 0.005 0.005 47.4889 0.114512 0.005 0.005 0.579198 4.12728 0.005 0.933142 0.490608 0.005 24.8094 0.279425 0.0744808 2.91786 0.005 0.005 2.19952 2.79622 0.827479 24.8231 2.95344 0.128065 14.7683 2.28 0.005 0.862637 0.005 0.005 1.35482 0.0377494 0.057321 0.0891129 0.0342034 0.0240105 0.0437824 0.0618606 0.0838496 0.0156076 0.0983641 0.0577867 0.0641682 0.0158419 0.0422741 0.0458601 0.0550846 0.0813774 0.019597 0.0205847 0.0515639 phangorn/inst/extdata/VT.dat0000644000176200001440000000353213475602650015533 0ustar liggesusers 0.233108 0.199097 0.210797 0.265145 0.105191 0.883422 0.227333 0.031726 0.027495 0.010313 0.310084 0.493763 0.2757 0.205842 0.004315 0.567957 0.25524 0.270417 1.599461 0.005321 0.960976 0.876213 0.156945 0.362028 0.311718 0.050876 0.12866 0.250447 0.078692 0.213164 0.290006 0.134252 0.016695 0.315521 0.104458 0.058131 0.222972 0.08151 0.087225 0.01172 0.046398 0.054602 0.046589 0.051089 0.020039 0.42463 0.192364 0.069245 0.060863 0.091709 0.24353 0.151924 0.087056 0.103552 2.08989 0.393245 1.755838 0.50306 0.261101 0.004067 0.738208 0.88863 0.193243 0.153323 0.093181 0.201204 0.21155 0.08793 0.05742 0.012182 0.02369 0.120801 0.058643 0.04656 0.021157 0.493845 1.105667 0.096474 0.116646 0.042569 0.039769 0.016577 0.051127 0.026235 0.028168 0.050143 0.079807 0.32102 0.946499 0.038261 0.173052 0.399143 0.12848 0.083956 0.160063 0.011137 0.15657 0.205134 0.124492 0.078892 0.054797 0.169784 0.212302 0.010363 0.042564 1.817198 0.292327 0.847049 0.461519 0.17527 0.358017 0.406035 0.612843 0.167406 0.081567 0.214977 0.400072 0.090515 0.138119 0.430431 0.877877 0.204109 0.471268 0.178197 0.079511 0.248992 0.321028 0.136266 0.101117 0.376588 0.243227 0.446646 0.184609 0.08587 0.207143 1.767766 0.030309 0.046417 0.010459 0.011393 0.007732 0.021248 0.018844 0.02399 0.020009 0.034954 0.083439 0.023321 0.022019 0.12805 0.014584 0.035933 0.020437 0.087061 0.09701 0.093268 0.051664 0.042823 0.062544 0.0552 0.037568 0.286027 0.086237 0.189842 0.068689 0.073223 0.898663 0.032043 0.121979 0.094617 0.124746 1.230985 0.113146 0.049824 0.048769 0.163831 0.112027 0.205868 0.082579 0.068575 3.65443 1.337571 0.144587 0.307309 0.247329 0.129315 0.1277 0.740372 0.022134 0.125733 0.078837 0.051238 0.042313 0.053066 0.015175 0.036713 0.061924 0.070852 0.023082 0.062056 0.096371 0.057324 0.023771 0.043296 0.043911 0.063403 0.055897 0.013272 0.034399 0.073101 phangorn/inst/extdata/mtArt.dat0000644000176200001440000001142413475602650016270 0ustar liggesusers 0.2 0.2 0.2 1 4 500 254 36 98 11 0.2 154 262 0.2 0.2 0.2 0.2 183 862 0.2 262 200 0.2 121 12 81 3 44 0.2 41 180 0.2 12 314 15 0.2 26 2 21 7 63 11 7 3 0.2 4 2 13 1 79 16 2 1 6 515 0.2 209 467 2 0.2 349 106 0.2 0.2 3 4 121 5 79 0.2 312 67 0.2 56 0.2 515 885 106 13 5 20 0.2 184 0.2 0.2 1 14 118 263 11 322 49 0.2 17 0.2 0.2 39 8 0.2 1 0.2 12 17 5 15 673 3 398 44 664 52 31 226 11 7 8 144 112 36 87 244 0.2 166 0.2 183 44 43 0.2 19 204 48 70 289 14 47 660 0.2 0.2 8 0.2 22 7 11 2 0.2 0.2 21 16 71 54 0.2 2 0.2 1 4 251 0.2 72 87 8 9 191 12 20 117 71 792 18 30 46 38 340 0.2 23 0.2 350 0.2 14 3 0.2 1855 85 26 281 52 32 61 544 0.2 2 0.054116 0.018227 0.039903 0.020160 0.009709 0.018781 0.024289 0.068183 0.024518 0.092638 0.148658 0.021718 0.061453 0.088668 0.041826 0.091030 0.049194 0.029786 0.039443 0.057700 // this is the end of the file. The rest are notes. Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val This model has been derived from 36 artropoda mitochondrial genomes. Each gene of the given species was aligned individually. Then, alignments of the whole set of 13 genes where concatenated and passed through GBlocks (Castresana, 2000, in JME) with parameters and output: Minimum Number Of Sequences For A Conserved Position: 20 Minimum Number Of Sequences For A Flanking Position: 32 Maximum Number Of Contiguous Nonconserved Positions: 8 Minimum Length Of A Block: 10 Allowed Gap Positions: With Half Use Similarity Matrices: Yes Flank positions of the 40 selected block(s) Flanks: [6 22] [26 44] [61 70] [77 143] [145 185] [208 236] [309 640] [644 802] [831 941] [956 966] [973 1062] [1085 1339] [1343 1702] [1754 1831] [1840 1911] [1916 1987] [2011 2038] [2097 2118] [2125 2143] [2179 2215] [2243 2268] [2277 2288] [2333 2347] [2476 2518] [2539 2558] [2600 2613] [2637 2672] [2738 2759] [2784 2839] [2882 2924] [2948 3097] [3113 3123] [3210 3235] [3239 3322] [3348 3392] [3406 3526] [3588 3617] [3660 3692] [3803 3830] [3909 3928] New number of positions in MtArt-strict.phy.fasta-gb: 2664 (67% of the original 3933 positions) The species included in the analysis were: Harpiosquilla harpax [NCBI_TaxID 287944] Ixodes uriae [NCBI_TaxID 59655] Heptathela hangzhouensis [NCBI_TaxID 216259] Triops longicaudatus [NCBI_TaxID 58777] Gryllotalpa orientalis [NCBI_TaxID 213494] lepidopsocid RS-2001 [NCBI_TaxID 159971] Locusta migratoria [NCBI_TaxID 7004] Drosophila yakuba [NCBI_TaxID 7245] Ostrinia furnacalis [NCBI_TaxID 93504] Megabalanus volcano [NCBI_TaxID 266495] Periplaneta fuliginosa [NCBI_TaxID 36977] Thermobia domestica [NCBI_TaxID 89055] Aleurochiton aceris [NCBI_TaxID 266942] Schizaphis graminum [NCBI_TaxID 13262] Pteronarcys princeps [NCBI_TaxID 285953] Aleurodicus dugesii [NCBI_TaxID 30099] Pollicipes polymerus [NCBI_TaxID 36137] Gomphiocephalus hodgsoni [NCBI_TaxID 221270] Habronattus oregonensis [NCBI_TaxID 130930] Speleonectes tulumensis [NCBI_TaxID 84346] Hutchinsoniella macracantha [NCBI_TaxID 84335] Haemaphysalis flava [NCBI_TaxID 181088] Scutigera coleoptrata [NCBI_TaxID 29022] Vargula hilgendorfii [NCBI_TaxID 6674] Tricholepidion gertschi [NCBI_TaxID 89825] Varroa destructor [NCBI_TaxID 109461] Bombyx mandarina [NCBI_TaxID 7092] Thyropygus sp. [NCBI_TaxID 174155] Tribolium castaneum [NCBI_TaxID 7070] Pagurus longicarpus [NCBI_TaxID 111067] Limulus polyphemus [NCBI_TaxID 6850] Tetrodontophora bielanensis [NCBI_TaxID 48717] Penaeus monodon [NCBI_TaxID 6687] Daphnia pulex [NCBI_TaxID 6669] Apis mellifera [NCBI_TaxID 7469] Anopheles gambiae [NCBI_TaxID 7165] The topology used for inferring the model was: (((Daph_pulex,Trio_longi),((((((Aleu_aceri,Aleu_duges),Schi_grami),lepi_RS_20), ((((Ostr_furna,Bomb_manda),(Dros_yakub,Anop_gambi)),Apis_melli),Trib_casta)), ((Gryl_orien,Locu_migra),(Pter_princ,Peri_fulig))),(Tric_gerts,Ther_domes)), (Scut_coleo,Thyr_sp),Varg_hilge,Hutc_macra,((((Ixod_uriae,Haem_flava),Varr_destr), (Habr_orego,Hept_hangz)),Limu_polyp),(Poll_polym,Mega_volca),(Gomp_hodgs,Tetr_biela), ((Pagu_longi,Pena_monod),Harp_harpa),Spel_tulum)); Note this is not the ML topology but the consensus one (based on morphological data, phylogenetic reconstruction using nuclear genes, etc). Where relationships are not clear, a polytomy was introduced (it contains quite a lot of polytomies!). The model was estimated using Ziheng Yang's Paml software package. A four-categorized gamma distribution was used to account for heterogeneity (alpha was estimated to be 0.47821). Sites with ambiguity data were taken into account. Reference Abascal, F., D. Posada, and R. Zardoya. 2007. MtArt: A new Model of amino acid replacement for Arthropoda. Mol. Biol. Evol. 24:1-5. phangorn/inst/extdata/HIVb.dat0000644000176200001440000000337413475602650015776 0ustar liggesusers 0.307507 0.005 0.295543 1.45504 0.005 17.6612 0.123758 0.351721 0.0860642 0.005 0.0551128 3.4215 0.672052 0.005 0.005 1.48135 0.0749218 0.0792633 10.5872 0.005 2.5602 2.13536 3.65345 0.323401 2.83806 0.897871 0.0619137 3.92775 0.0847613 9.04044 7.64585 1.9169 0.240073 7.05545 0.11974 0.005 0.005 0.677289 0.680565 0.0176792 0.005 0.005 0.00609079 0.005 0.103111 0.215256 0.701427 0.005 0.00876048 0.129777 1.49456 0.005 0.005 1.74171 5.95879 0.005 20.45 7.90443 0.005 0.005 6.54737 4.61482 0.521705 0.005 0.322319 0.0814995 0.0186643 2.51394 0.005 0.005 0.005 0.303676 0.175789 0.005 0.005 11.2065 5.31961 1.28246 0.0141269 0.005 0.005 0.005 9.29815 0.005 0.005 0.291561 0.145558 3.39836 8.52484 0.0342658 0.188025 2.12217 1.28355 0.00739578 0.0342658 0.005 4.47211 0.0120226 0.005 2.45318 0.0410593 2.07757 0.0313862 0.005 0.005 2.46633 3.4791 13.1447 0.52823 4.69314 0.116311 0.005 4.38041 0.382747 1.21803 0.927656 0.504111 0.005 0.956472 5.37762 15.9183 2.86868 6.88667 0.274724 0.739969 0.243589 0.289774 0.369615 0.711594 8.61217 0.0437673 4.67142 4.94026 0.0141269 2.01417 8.93107 0.005 0.991338 0.005 0.005 2.63277 0.026656 0.005 1.21674 0.0695179 0.005 0.748843 0.005 0.089078 0.829343 0.0444506 0.0248728 0.005 0.005 0.00991826 1.76417 0.674653 7.57932 0.113033 0.0792633 0.005 18.6943 0.148168 0.111986 0.005 0.005 15.34 0.0304381 0.648024 0.105652 1.28022 7.61428 0.0812454 0.026656 1.04793 0.420027 0.0209153 1.02847 0.953155 0.005 17.7389 1.41036 0.265829 6.8532 0.723274 0.005 0.0749218 0.709226 0.005 0.0410593 0.060490222 0.066039665 0.044127815 0.042109048 0.020075899 0.053606488 0.071567447 0.072308239 0.022293943 0.069730629 0.098851122 0.056968211 0.019768318 0.028809447 0.046025282 0.05060433 0.053636813 0.033011601 0.028350243 0.061625237 phangorn/inst/extdata/mtREV24.dat0000644000176200001440000000414113475602650016342 0ustar liggesusers 23.18 26.95 13.24 17.67 1.90 794.38 59.93 103.33 58.94 1.90 1.90 220.99 173.56 55.28 75.24 9.77 1.90 63.05 583.55 1.90 313.56 120.71 23.03 53.30 56.77 30.71 6.75 28.28 13.90 165.23 496.13 113.99 141.49 582.40 49.12 1.90 96.49 1.90 27.10 4.34 62.73 8.34 3.31 5.98 12.26 25.46 15.58 15.16 1.90 25.65 39.70 1.90 2.41 11.49 329.09 8.36 141.40 608.70 2.31 1.90 465.58 313.86 22.73 127.67 19.57 14.88 141.88 1.90 65.41 1.90 6.18 47.37 1.90 1.90 11.97 517.98 537.53 91.37 6.37 4.69 15.20 4.98 70.80 19.11 2.67 1.90 48.16 84.67 216.06 6.44 90.82 54.31 23.64 73.31 13.43 31.26 137.29 12.83 1.90 60.97 20.63 40.10 50.10 18.84 17.31 387.86 6.04 494.39 69.02 277.05 54.11 54.71 125.93 77.46 47.70 73.61 105.79 111.16 64.29 169.90 480.72 2.08 238.46 28.01 179.97 94.93 14.82 11.17 44.78 368.43 126.40 136.33 528.17 33.85 128.22 597.21 1.90 21.95 10.68 19.86 33.60 1.90 1.90 10.92 7.08 1.90 32.44 24.00 21.71 7.84 4.21 38.58 9.99 6.48 1.90 191.36 21.21 254.77 38.82 13.12 3.21 670.14 25.01 44.15 51.17 39.96 465.58 16.21 64.92 38.73 26.25 195.06 7.64 1.90 1.90 1.90 19.00 21.14 2.53 1.90 1222.94 91.67 1.90 387.54 6.35 8.23 1.90 204.54 5.37 1.90 0.072 0.019 0.039 0.019 0.006 0.025 0.024 0.056 0.028 0.088 0.169 0.023 0.054 0.061 0.054 0.072 0.086 0.029 0.033 0.043 Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val S_ij = S_ji and PI_i for the mtREV24 model (Adachi and Hasegawa 1996). The PI's used to sum to 0.999 and I changed one of the freq from 0.168 into 0.169 so that the sum is 1. Prepared by Z. Yang according to data sent by Dr M. Hasegawa. This matrix was obtained from the 12 mitochondrial proteins encoded by the same strand of the DNA from a diverse range of species including bird, fish, frog, lamprey, as well as mammals (see Adachi and Hasegawa 1996 for details). The other matrix (mtmam.dat) included in the package is based on the same proteins from mammals only. Adachi, J. and Hasegawa, M. (1996) MOLPHY version 2.3: programs for molecular phylogenetics based on maximum likelihood. Computer Science Monographs of Institute of Statistical Mathematics 28:1-150. phangorn/inst/extdata/trees/0000755000176200001440000000000013475602650015627 5ustar liggesusersphangorn/inst/extdata/trees/RAxML_bestTree.3moles0000644000176200001440000000053413475602650021535 0ustar liggesusers((((Hma:0.03262045163347984666,Mur:0.03886458455630492637):0.00225499947410235475,Uth:0.02580682933153511174):0.00059392541543651757,(Uam:0.02931596331419318927,(Uar:0.00602522464221224522,Uma:0.00593640374580924231):0.02934241311799383120):0.00269684120306867619):0.06379221863907107160,Tor:0.09747395533792581335,Ame:0.24240784786309346743):0.0; phangorn/inst/extdata/trees/RAxML_bipartitionsBranchLabels.AIs0000644000176200001440000000055513475602650024205 0ustar liggesusers(Ame:0.02681059329595153473,((Hma:0.00312706379726812329,(Uth:0.00121026052477198292,Mur:0.00312046250563168155):0.00087036069658183684[39]):0.00122506270256386740[42],((Uar:0.00052373856518729458,Uma:0.00247018618187345041):0.00167792487939210548[83],Uam:0.00184159984063642979):0.00107249327886021345[41]):0.00382497683824970002[100],Tor:0.00848622429823414105); phangorn/inst/extdata/trees/RAxML_bootstrap.mtG0000644000176200001440000001062413475602650021323 0ustar liggesusers(Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); (((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); (((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,((Uth,(Hma,Uam)),(Mur,(Uma,Uar))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,((Uma,Uar),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,((Uma,Uar),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,((Uma,Uar),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,((Hma,(Uth,Uam)),(Mur,(Uma,Uar))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,((Uth,(Uam,Hma)),(Mur,(Uma,Uar))),Ame); (Tor,((Uma,Uar),(((Uth,Uam),Hma),Mur)),Ame); (Tor,(Mur,((Uma,Uar),((Uth,Uam),Hma))),Ame); (Tor,(Mur,((Uma,Uar),((Uth,Uam),Hma))),Ame); (Tor,((Uma,Uar),(((Uth,Uam),Hma),Mur)),Ame); (Tor,((Uma,Uar),(((Uth,Uam),Hma),Mur)),Ame); (((Uar,Uma),(Mur,((Hma,Uam),Uth))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uar,Uma))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Uth,(Hma,Uam)),(Uar,Uma))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uar,Uma))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uar,Uma))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uar,Uma))),Tor,Ame); (Tor,(Mur,((Uth,(Hma,Uam)),(Uma,Uar))),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,((Hma,(Uam,Uth)),((Uma,Uar),Mur)),Ame); (Tor,((Uma,Uar),(Mur,(Uth,(Hma,Uam)))),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Ame); (Tor,(Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Ame); (Tor,(((Uma,Uar),(Hma,(Uth,Uam))),Mur),Ame); (Tor,(((Uma,Uar),(Hma,(Uth,Uam))),Mur),Ame); (Tor,(((Uma,Uar),(Hma,(Uth,Uam))),Mur),Ame); (Tor,((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,((Hma,(Uth,Uam)),(Mur,(Uma,Uar))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); (((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); (((Hma,(Uth,Uam)),(Mur,(Uar,Uma))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); (((Uar,Uma),(((Uam,Uth),Hma),Mur)),Tor,Ame); ((Mur,((Uar,Uma),(Uth,(Hma,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Tor,Ame); (((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Tor,Ame); (((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Tor,Ame); (((Uar,Uma),(((Uam,Uth),Hma),Mur)),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); (((Uar,Uma),(((Uam,Uth),Hma),Mur)),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),(Uth,(Hma,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Tor,Ame); phangorn/inst/extdata/trees/woodmouse.mrbayes.nex.con0000644000176200001440000000064313475602650022606 0ustar liggesusers#NEXUS [ID: 2542150086] begin trees; [Note: This tree contains information on the topology, branch lengths (if present), and the probability of the partition indicated by the branch.] tree con_50_majrule = (No305,No1114S,((((No304,No0913S)0.98,No306)0.90,(No0906S,(No0910S,No1202S)0.92)0.54,No0908S,No1206S)0.80,((No0909S,No1007S,No1208S)1.00,(No0912S,No1103S)0.50)0.94)0.80); end; phangorn/inst/extdata/trees/Splits.txt0000644000176200001440000000427713475602650017660 0ustar liggesusersSplitWeight Bootstrap Color 0.07060404 100 Blue 0.04792795 100 Blue 0.042704593 100 Blue 0.030850368 100 Blue 0.023994952 100 Blue 0.02331487 100 Blue 0.012582252 100 Blue 0.007275392 97 Blue 0.0051821293 0 Pink 0.0036041164 99.2 Blue 0.0032304472 96.4 Blue 0.0026902487 0 Pink 0.0022065418 100 Blue 0.0019132489 81.3 Blue 0.001341845 0 Pink 0.0009478839 0 Pink 0.0008527216 3.2 Blue 0.0002126253 0 Pink 0.0001476501 0 Pink 0.015339644 100 Blue 0.0023547208 2.6 Blue 0.0014287664 0 Pink 0.0008373248 0 Pink 0.0006076867 2.6 Blue 0.0006041702 0 Pink 0.000297436 0 Pink 0.0002735536 0 Pink 5.794991E-05 0 Pink 3.466567E-05 12.1 Blue 1.5231282E-05 0 Pink 0.0012366334 41.9 Blue 0.0009923275 0 Pink 0.0009782094 0 Pink 0.0009185735 0 Pink 0.0007710702 54.9 Blue 0.0006963874 0 Pink 0.0006019617 10.4 Blue 0.0003462597 0 Pink 0.0089485 100 Blue 0.0020022863 0 Pink 0.0010558827 71 Blue 0.0004692516 0 Pink 0.0004601492 5.8 Blue 0.020771 100 Blue 0.0008540598 0 Pink 0.000244999 0 Pink 0.0009483108 0 Pink 0.0007954276 0 Pink 0.0003385545 47.9 Blue 0.0001838823 1.3 Blue 0.0012166464 55.1 Blue 0.0008818683 29 Blue 0.0002556656 0 Pink 0.000698773 0 Pink 0.0006747867 1.2 Blue 0.0006746581 44.1 Blue 0.0001867169 0 Pink 0.0008441487 0 Pink 0.00001 87.1 Green 0.00001 53.7 Green 0.00001 45.8 Green 0.00001 42.6 Green 0.00001 36.4 Green 0.00001 36.1 Green 0.00001 34.7 Green 0.00001 26.1 Green 0.00001 24.5 Green 0.00001 22.3 Green 0.00001 21 Green 0.00001 13.8 Green 0.00001 12.7 Green 0.00001 11 Green 0.00001 9.9 Green 0.00001 9.2 Green 0.00001 8.1 Green 0.00001 7.6 Green 0.00001 6.1 Green 0.00001 5.6 Green 0.00001 5.5 Green 0.00001 4.8 Green 0.00001 4.6 Green 0.00001 4.3 Green 0.00001 4.2 Green 0.00001 4.2 Green 0.00001 4.1 Green 0.00001 4 Green 0.00001 3.4 Green 0.00001 3.2 Green 0.00001 3.2 Green 0.00001 3 Green 0.00001 2.9 Green 0.00001 2.6 Green 0.00001 2.5 Green 0.00001 2.5 Green 0.00001 2.4 Green 0.00001 2.4 Green 0.00001 2.1 Green 0.00001 2.1 Green 0.00001 2 Green 0.00001 1.8 Green 0.00001 1.7 Green 0.00001 1.6 Green 0.00001 1.6 Green 0.00001 1.5 Green 0.00001 1.5 Green 0.00001 1.4 Green 0.00001 1.4 Green 0.00001 1.3 Green 0.00001 1.2 Green 0.00001 1.1 Green 0.00001 1.1 Green 0.00001 1 Green 0.00001 1 Green 0.00001 1 Green phangorn/inst/extdata/trees/woodmouse.nxs0000644000176200001440000007751513475602650020421 0ustar liggesusers#nexus BEGIN Taxa; DIMENSIONS ntax=15; TAXLABELS [1] 'No305' [2] 'No304' [3] 'No306' [4] 'No0906S' [5] 'No0908S' [6] 'No0909S' [7] 'No0910S' [8] 'No0912S' [9] 'No0913S' [10] 'No1103S' [11] 'No1007S' [12] 'No1114S' [13] 'No1202S' [14] 'No1206S' [15] 'No1208S' ; END; [Taxa] BEGIN Characters; DIMENSIONS nchar=965; FORMAT datatype=DNA missing=? gap=- symbols="atgc" labels=left transpose=no interleave=no; MATRIX 'No305' nttcgaaaaacacacccactactaaaanttatcagtcactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggagtctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatacatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacattttcatagaaacatgaaacatcggtgtggtccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaanttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagccacactgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgtccacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcagaccctata 'No304' attcgaaaaacacacccactactaaaaattatcaaccactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtagtccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattncaaatttactntcagcaattccatacatcggaactaccctagtagaatgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactctagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaaccctgtn 'No306' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagaatgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacnncatattaaaccagaatgatacttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaaccctata 'No0906S' attcgaaaaacacacccactactaaaaatcatcaatcactccttcatcgatttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtatgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataataatttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaatacnnnn 'No0908S' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagccccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttctccatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggggctacagtaattacaaatttactatcagcaattccatatatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatcctcccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No0909S' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaactatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacactttcatagaaacatgaaacatcggtgtgatccttctattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcgggactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaatcctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No0910S' attcgaaaaacacacccactactaaaaattatcaatcactctttcatcgatttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccagatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggcgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttgcaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No0912S' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacggggaatgtattacgggtcatacattttcatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgctttccacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagacattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No0913S' attcgaaaaacacacccactactaaaaattatcaaccactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatgcatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagaatgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggcgtactaataatagtttccttcctaataactctagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No1103S' attcgaaaaacacacccactactaaaaattattaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacattttcatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No1007S' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgccgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacactttcatagaaacatgaaacatcggtgtgatccttctattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcgggactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaatcctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No1114S' nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggagtctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagnaacccatatttgccgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatatattacggctcatacattctcatagaaacatgaaacatcggtgtggtccttttattcgcagtaatagtcacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttcctatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaggatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccattccttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No1202S' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgatttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccagatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgccgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggcgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No1206S' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgatttgccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttctccatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgtgcacctcttgtttcttcatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagacctcttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No1208S' nnncgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgccgagacgtaaactatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacactttcatagaaacatgaaacatcggtgtgatccttctattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccctctgaggagctacagtaattacaaatttactatcagcaattccatacatcgggactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaatcctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn ; END; [Characters] BEGIN Distances; DIMENSIONS ntax=15; FORMAT labels=left diagonal triangle=both; MATRIX [1] 'No305' 0.0 0.016684046 0.013541667 0.018789144 0.016701462 0.016701462 0.017745303 0.014613778 0.018789144 0.012526096 0.016701462 0.015317286 0.016701462 0.016701462 0.018828452 [2] 'No304' 0.016684046 0.0 0.0052083335 0.0135557875 0.0114702815 0.015641293 0.012513034 0.0135557875 0.0052137645 0.0114702815 0.015641293 0.016429354 0.0114702815 0.012513034 0.017782427 [3] 'No306' 0.013541667 0.0052083335 0.0 0.0093847755 0.00729927 0.0114702815 0.008342023 0.0093847755 0.0052137645 0.00729927 0.0114702815 0.015334063 0.00729927 0.008342023 0.013598327 [4] 'No0906S' 0.018789144 0.0135557875 0.0093847755 0.0 0.012486992 0.016649324 0.009365245 0.014568158 0.012486992 0.012486992 0.016649324 0.020765027 0.008324662 0.01144641 0.018789144 [5] 'No0908S' 0.016701462 0.0114702815 0.00729927 0.012486992 0.0 0.014568158 0.01144641 0.012486992 0.012486992 0.010405827 0.014568158 0.020765027 0.010405827 0.009365245 0.016701462 [6] 'No0909S' 0.016701462 0.015641293 0.0114702815 0.016649324 0.014568158 0.0 0.015608741 0.010405827 0.016649324 0.008324662 0.0020811656 0.020765027 0.014568158 0.015608741 0.0020876827 [7] 'No0910S' 0.017745303 0.012513034 0.008342023 0.009365245 0.01144641 0.015608741 0.0 0.013527576 0.009365245 0.01144641 0.015608741 0.019672131 0.003121748 0.010405827 0.017745303 [8] 'No0912S' 0.014613778 0.0135557875 0.0093847755 0.014568158 0.012486992 0.010405827 0.013527576 0.0 0.014568158 0.004162331 0.010405827 0.018579235 0.012486992 0.013527576 0.012526096 [9] 'No0913S' 0.018789144 0.0052137645 0.0052137645 0.012486992 0.012486992 0.016649324 0.009365245 0.014568158 0.0 0.012486992 0.016649324 0.018579235 0.008324662 0.013527576 0.018789144 [10] 'No1103S' 0.012526096 0.0114702815 0.00729927 0.012486992 0.010405827 0.008324662 0.01144641 0.004162331 0.012486992 0.0 0.008324662 0.015300547 0.010405827 0.01144641 0.010438413 [11] 'No1007S' 0.016701462 0.015641293 0.0114702815 0.016649324 0.014568158 0.0020811656 0.015608741 0.010405827 0.016649324 0.008324662 0.0 0.018579235 0.012486992 0.015608741 0.0020876827 [12] 'No1114S' 0.015317286 0.016429354 0.015334063 0.020765027 0.020765027 0.020765027 0.019672131 0.018579235 0.018579235 0.015300547 0.018579235 0.0 0.01748634 0.021857923 0.020765027 [13] 'No1202S' 0.016701462 0.0114702815 0.00729927 0.008324662 0.010405827 0.014568158 0.003121748 0.012486992 0.008324662 0.010405827 0.012486992 0.01748634 0.0 0.009365245 0.014613778 [14] 'No1206S' 0.016701462 0.012513034 0.008342023 0.01144641 0.009365245 0.015608741 0.010405827 0.013527576 0.013527576 0.01144641 0.015608741 0.021857923 0.009365245 0.0 0.017745303 [15] 'No1208S' 0.018828452 0.017782427 0.013598327 0.018789144 0.016701462 0.0020876827 0.017745303 0.012526096 0.018789144 0.010438413 0.0020876827 0.020765027 0.014613778 0.017745303 0.0 ; END; [Distances] BEGIN Splits; DIMENSIONS ntax=15 nsplits=43; FORMAT labels=no weights=yes confidences=no intervals=no; PROPERTIES fit=97.76178978414268 cyclic; CYCLE 1 12 3 2 9 13 7 4 14 5 11 15 6 8 10; MATRIX [1, size=1] 0.007878401 1 2 3 4 5 6 7 8 9 10 11 13 14 15, [2, size=4] 9.67039E-4 1 4 5 6 7 8 10 11 13 14 15, [3, size=7] 3.0405898E-4 1 5 6 8 10 11 14 15, [4, size=4] 8.927283E-5 1 6 8 10, [5, size=1] 0.006068427 1, [6, size=1] 4.1818016E-4 1 2 4 5 6 7 8 9 10 11 12 13 14 15, [7, size=3] 6.354771E-4 1 4 5 6 7 8 10 11 12 13 14 15, [8, size=7] 0.0018286711 1 6 8 10 11 12 15, [9, size=3] 3.1608884E-5 1 10 12, [10, size=2] 0.0030639141 1 12, [11, size=1] 0.0020751753 1 3 4 5 6 7 8 9 10 11 12 13 14 15, [12, size=2] 0.0022168073 1 3 4 5 6 7 8 10 11 12 13 14 15, [13, size=1] 0.0012816527 1 2 3 4 5 6 7 8 10 11 12 13 14 15, [14, size=3] 9.066461E-4 1 2 3 4 5 6 8 10 11 12 14 15, [15, size=4] 7.542655E-4 1 2 3 5 6 8 10 11 12 14 15, [16, size=5] 1.0719955E-4 1 2 3 5 6 8 10 11 12 15, [17, size=6] 6.0168037E-5 1 2 3 6 8 10 11 12 15, [18, size=1] 7.864587E-4 1 2 3 4 5 6 7 8 9 10 11 12 14 15, [19, size=2] 0.0011441667 1 2 3 4 5 6 8 9 10 11 12 14 15, [20, size=3] 3.7099395E-5 1 2 3 5 6 8 9 10 11 12 14 15, [21, size=4] 7.577939E-4 1 2 3 5 6 8 9 10 11 12 15, [22, size=6] 8.6808155E-5 1 2 3 9 10 12, [23, size=5] 1.3156666E-4 1 2 3 9 12, [24, size=1] 0.0020897626 1 2 3 4 5 6 8 9 10 11 12 13 14 15, [25, size=3] 1.0902213E-4 1 2 3 5 6 8 9 10 11 12 13 15, [26, size=4] 1.458757E-4 1 2 3 6 8 9 10 11 12 13 15, [27, size=1] 0.0051963497 1 2 3 5 6 7 8 9 10 11 12 13 14 15, [28, size=3] 1.40733355E-5 1 2 3 6 7 8 9 10 11 12 13 15, [29, size=1] 0.004156471 1 2 3 4 5 6 7 8 9 10 11 12 13 15, [30, size=2] 0.0010121305 1 2 3 4 6 7 8 9 10 11 12 13 15, [31, size=1] 0.004199673 1 2 3 4 6 7 8 9 10 11 12 13 14 15, [32, size=2] 8.544509E-4 1 2 3 4 5 6 7 8 9 10 12 13 14, [33, size=3] 0.0051881927 1 2 3 4 5 7 8 9 10 12 13 14, [34, size=4] 6.061471E-6 1 2 3 4 5 7 9 10 12 13 14, [35, size=5] 0.0010072162 1 2 3 4 5 7 9 12 13 14, [36, size=1] 0.0010342944 1 2 3 4 5 6 7 8 9 10 11 12 13 14, [37, size=2] 0.0010670845 1 2 3 4 5 7 8 9 10 11 12 13 14, [38, size=4] 2.1973468E-5 1 2 3 4 5 7 9 11 12 13 14, [39, size=2] 3.0782125E-5 1 2 3 4 5 7 9 10 11 12 13 14 15, [40, size=3] 7.4452415E-5 1 2 3 4 5 7 9 11 12 13 14 15, [41, size=1] 0.0030889313 1 2 3 4 5 6 7 9 10 11 12 13 14 15, [42, size=2] 0.0010669535 1 2 3 4 5 6 7 9 11 12 13 14 15, [43, size=1] 9.133177E-4 1 2 3 4 5 6 7 8 9 11 12 13 14 15, ; END; [Splits] BEGIN Network; DIMENSIONS ntax=15 nvertices=130 nedges=215; DRAW to_scale; TRANSLATE 2 'No305', 3 'No1114S', 4 'No306', 5 'No304', 6 'No0913S', 7 'No1202S', 8 'No0910S', 9 'No0906S', 10 'No1206S', 11 'No0908S', 12 'No1208S', 13 'No0912S', 14 'No1103S', 117 'No1007S', 123 'No0909S', ; VERTICES 1 -0.006068427 0.0 s=n, 2 0.0 0.0 s=n, 3 0.0015083641 0.0043967813 s=n, 4 -0.009464912 0.002829434 s=n, 5 -0.008871745 0.006696938 s=n, 6 -0.010746697 0.0074311504 s=n, 7 -0.013563724 0.0042226063 s=n, 8 -0.015113663 0.004792512 s=n, 9 -0.017300652 0.003006176 s=n, 10 -0.016641626 -2.3478366E-4 s=n, 11 -0.015087945 -0.0022330103 s=n, 12 -0.009807543 -0.009778595 s=n, 13 -0.0059371023 -0.004773448 s=n, 14 -0.00708383 -0.002765694 s=n, 15 -0.009065388 -6.370236E-4 s=n, 16 -0.009096996 -6.370236E-4 s=n, 17 -0.0061406503 5.2473253E-5 s=n, 18 -0.009137611 -5.845503E-4 s=n, 19 -0.009169219 -5.845503E-4 s=n, 20 -0.009257255 -6.823234E-4 s=n, 21 -0.009185032 -7.3479663E-4 s=n, 22 -0.009153423 -7.3479663E-4 s=n, 23 -0.009327484 -7.3334796E-4 s=n, 24 -0.009255261 -7.858212E-4 s=n, 25 -0.010392839 7.7441713E-4 s=n, 26 -0.010480874 6.7664403E-4 s=n, 27 -0.010551103 6.256195E-4 s=n, 28 -0.006172433 3.5486656E-4 s=n, 29 -0.009169393 -2.82157E-4 s=n, 30 -0.009201002 -2.82157E-4 s=n, 31 -0.010424622 0.0010768104 s=n, 32 -0.010512657 9.790374E-4 s=n, 33 -0.010582887 9.280128E-4 s=n, 34 -0.010479588 0.001101283 s=n, 35 -0.010567623 0.00100351 s=n, 36 -0.010637853 9.5248537E-4 s=n, 37 -0.01060607 6.50092E-4 s=n, 38 -0.010566315 0.0011642933 s=n, 39 -0.01065435 0.0010665202 s=n, 40 -0.010724579 0.0010154956 s=n, 41 -0.010692797 7.1310234E-4 s=n, 42 -0.009016237 -0.0016912675 s=n, 43 -0.008944014 -0.0017437408 s=n, 44 -0.008873785 -0.0016927161 s=n, 45 -0.008842176 -0.0016927161 s=n, 46 -0.0056889136 0.0011923469 s=n, 47 -0.008685874 5.553234E-4 s=n, 48 -0.008717483 5.553234E-4 s=n, 49 -0.009941103 0.0019142908 s=n, 50 -0.009996069 0.0019387633 s=n, 51 -0.010082795 0.0020017736 s=n, 52 -0.010587498 0.0025623022 s=n, 53 -0.011071017 0.0017248219 s=n, 54 -0.011159052 0.0016270487 s=n, 55 -0.011229281 0.0015760242 s=n, 56 -0.01192156 0.0018842467 s=n, 57 -0.011416858 0.0013237182 s=n, 58 -0.011385076 0.0010213249 s=n, 59 -0.012067436 0.0018842467 s=n, 60 -0.011562734 0.0013237182 s=n, 61 -0.011530952 0.0010213249 s=n, 62 -0.010838672 7.1310234E-4 s=n, 63 -0.010751946 6.50092E-4 s=n, 64 -0.009015604 -0.0016972957 s=n, 65 -0.00894338 -0.001749769 s=n, 66 -0.009004617 -0.0017163253 s=n, 67 -0.008932394 -0.0017687986 s=n, 68 -0.008933027 -0.0017627702 s=n, 69 -0.008862798 -0.0017117457 s=n, 70 -0.008831189 -0.0017117457 s=n, 71 -0.009744729 0.0025186655 s=n, 72 -0.009799696 0.0025431379 s=n, 73 -0.009886422 0.0026061484 s=n, 74 -0.010391124 0.0031666767 s=n, 75 -0.010844447 0.0039518555 s=n, 76 -0.01104082 0.0033474807 s=n, 77 -0.01152434 0.0025100003 s=n, 78 -0.011612375 0.0024122272 s=n, 79 -0.011682604 0.0023612028 s=n, 80 -0.0123748835 0.0026694252 s=n, 81 -0.012520759 0.0026694252 s=n, 82 -0.012404897 0.0026912317 s=n, 83 -0.012550773 0.0026912317 s=n, 84 -0.01209745 0.0019060532 s=n, 85 -0.012657413 0.0027138987 s=n, 86 -0.01220409 0.0019287202 s=n, 87 -0.0121740755 0.0019069137 s=n, 88 -0.011669374 0.0013463852 s=n, 89 -0.011637591 0.0010439919 s=n, 90 -0.012217856 0.0019257942 s=n, 91 -0.012187841 0.0019039877 s=n, 92 -0.01168314 0.0013434592 s=n, 93 -0.011651357 0.0010410659 s=n, 94 -0.011544717 0.0010183989 s=n, 95 -0.0108524375 7.1017636E-4 s=n, 96 -0.010765712 6.4716605E-4 s=n, 97 -0.009557918 -0.006857067 s=n, 98 -0.009546931 -0.0068760966 s=n, 99 -0.009474708 -0.0069285696 s=n, 100 -0.0094248885 -0.0069838986 s=n, 101 -0.008882575 -0.0018241275 s=n, 102 -0.008883209 -0.0018180992 s=n, 103 -0.00881298 -0.0017670747 s=n, 104 -0.008781371 -0.0017670747 s=n, 105 -0.00951301 0.0047233286 s=n, 106 -0.009567976 0.0047478015 s=n, 107 -0.009654703 0.0048108115 s=n, 108 -0.010159405 0.00537134 s=n, 109 -0.010612727 0.0061565186 s=n, 110 -0.013170495 0.0035415133 s=n, 111 -0.013316371 0.0035415133 s=n, 112 -0.01342301 0.0035641803 s=n, 113 -0.012575984 6.293953E-4 s=n, 114 -0.012469344 6.067283E-4 s=n, 115 -0.011777065 2.9850577E-4 s=n, 116 -0.011690339 2.3549546E-4 s=n, 117 -0.009821957 -0.007669698 s=n, 118 -0.00981097 -0.0076887277 s=n, 119 -0.009699429 -0.0087499665 s=n, 120 -0.00943539 -0.007937335 s=n, 121 -0.009363167 -0.007989809 s=n, 122 -0.009313349 -0.008045138 s=n, 123 -0.009297958 -0.008071796 s=n, 124 -0.0094094975 -0.0070105568 s=n, 125 -0.008867184 -0.0018507856 s=n, 126 -0.008004 -0.002477925 s=n, 127 -0.008019391 -0.002451267 s=n, 128 -0.008020026 -0.0024452389 s=n, 129 -0.007949796 -0.0023942143 s=n, 130 -0.007918187 -0.0023942143 s=n, ; VLABELS 2 'No305' x=12 y=9 f='Dialog-PLAIN-16', 3 'No1114S' x=11 y=14, 4 'No306' x=-15 y=26, 5 'No304' x=-19 y=28, 6 'No0913S' x=-34 y=29, 7 'No1202S' x=-39 y=27, 8 'No0910S' x=-77 y=16, 9 'No0906S' x=-79 y=11, 10 'No1206S' x=-79 y=6, 11 'No0908S' x=-77 y=2, 12 'No1208S' x=-34 y=-19, 13 'No0912S' x=-25 y=-16, 14 'No1103S' x=11 y=4, 117 'No1007S' x=-37 y=-18, 123 'No0909S' x=-31 y=-24, ; EDGES 1 1 2 s=5 w=0.006068427, 2 15 1 s=10 w=0.0030639141, 3 16 15 s=9 w=3.1608884E-5, 4 17 1 s=4 w=8.927283E-5, 5 18 15 s=4 w=8.927283E-5, 6 18 17 s=10 w=0.0030639141, 7 19 16 s=4 w=8.927283E-5, 8 19 18 s=9 w=3.1608884E-5, 9 20 19 s=23 w=1.3156666E-4, 10 21 16 s=23 w=1.3156666E-4, 11 21 20 s=4 w=8.927283E-5, 12 22 15 s=23 w=1.3156666E-4, 13 22 21 s=9 w=3.1608884E-5, 14 23 20 s=22 w=8.6808155E-5, 15 24 21 s=22 w=8.6808155E-5, 16 24 23 s=4 w=8.927283E-5, 17 25 19 s=8 w=0.0018286711, 18 26 20 s=8 w=0.0018286711, 19 26 25 s=23 w=1.3156666E-4, 20 27 23 s=8 w=0.0018286711, 21 27 26 s=22 w=8.6808155E-5, 22 28 17 s=3 w=3.0405898E-4, 23 29 18 s=3 w=3.0405898E-4, 24 29 28 s=10 w=0.0030639141, 25 30 19 s=3 w=3.0405898E-4, 26 30 29 s=9 w=3.1608884E-5, 27 31 25 s=3 w=3.0405898E-4, 28 31 30 s=8 w=0.0018286711, 29 32 26 s=3 w=3.0405898E-4, 30 32 31 s=23 w=1.3156666E-4, 31 33 27 s=3 w=3.0405898E-4, 32 33 32 s=22 w=8.6808155E-5, 33 34 31 s=17 w=6.0168037E-5, 34 35 32 s=17 w=6.0168037E-5, 35 35 34 s=23 w=1.3156666E-4, 36 36 33 s=17 w=6.0168037E-5, 37 36 35 s=22 w=8.6808155E-5, 38 37 27 s=17 w=6.0168037E-5, 39 37 36 s=3 w=3.0405898E-4, 40 38 34 s=16 w=1.0719955E-4, 41 39 35 s=16 w=1.0719955E-4, 42 39 38 s=23 w=1.3156666E-4, 43 40 36 s=16 w=1.0719955E-4, 44 40 39 s=22 w=8.6808155E-5, 45 41 37 s=16 w=1.0719955E-4, 46 41 40 s=3 w=3.0405898E-4, 47 42 23 s=35 w=0.0010072162, 48 43 24 s=35 w=0.0010072162, 49 43 42 s=4 w=8.927283E-5, 50 44 21 s=35 w=0.0010072162, 51 44 43 s=22 w=8.6808155E-5, 52 45 22 s=35 w=0.0010072162, 53 45 44 s=9 w=3.1608884E-5, 54 46 28 s=2 w=9.67039E-4, 55 46 3 s=1 w=0.007878401, 56 47 29 s=2 w=9.67039E-4, 57 47 46 s=10 w=0.0030639141, 58 48 30 s=2 w=9.67039E-4, 59 48 47 s=9 w=3.1608884E-5, 60 49 31 s=2 w=9.67039E-4, 61 49 48 s=8 w=0.0018286711, 62 50 34 s=2 w=9.67039E-4, 63 50 49 s=17 w=6.0168037E-5, 64 51 38 s=2 w=9.67039E-4, 65 51 50 s=16 w=1.0719955E-4, 66 52 51 s=15 w=7.542655E-4, 67 53 38 s=15 w=7.542655E-4, 68 53 52 s=2 w=9.67039E-4, 69 54 39 s=15 w=7.542655E-4, 70 54 53 s=23 w=1.3156666E-4, 71 55 40 s=15 w=7.542655E-4, 72 55 54 s=22 w=8.6808155E-5, 73 56 55 s=21 w=7.577939E-4, 74 57 40 s=21 w=7.577939E-4, 75 57 56 s=15 w=7.542655E-4, 76 58 41 s=21 w=7.577939E-4, 77 58 57 s=3 w=3.0405898E-4, 78 59 56 s=26 w=1.458757E-4, 79 60 57 s=26 w=1.458757E-4, 80 60 59 s=15 w=7.542655E-4, 81 61 58 s=26 w=1.458757E-4, 82 61 60 s=3 w=3.0405898E-4, 83 62 41 s=26 w=1.458757E-4, 84 62 61 s=21 w=7.577939E-4, 85 63 37 s=26 w=1.458757E-4, 86 63 62 s=16 w=1.0719955E-4, 87 64 42 s=34 w=6.061471E-6, 88 65 43 s=34 w=6.061471E-6, 89 65 64 s=4 w=8.927283E-5, 90 66 64 s=38 w=2.1973468E-5, 91 67 65 s=38 w=2.1973468E-5, 92 67 66 s=4 w=8.927283E-5, 93 68 43 s=38 w=2.1973468E-5, 94 68 67 s=34 w=6.061471E-6, 95 69 44 s=38 w=2.1973468E-5, 96 69 68 s=22 w=8.6808155E-5, 97 70 45 s=38 w=2.1973468E-5, 98 70 69 s=9 w=3.1608884E-5, 99 71 49 s=7 w=6.354771E-4, 100 71 4 s=6 w=4.1818016E-4, 101 72 50 s=7 w=6.354771E-4, 102 72 71 s=17 w=6.0168037E-5, 103 73 51 s=7 w=6.354771E-4, 104 73 72 s=16 w=1.0719955E-4, 105 74 52 s=7 w=6.354771E-4, 106 74 73 s=15 w=7.542655E-4, 107 75 74 s=14 w=9.066461E-4, 108 76 52 s=14 w=9.066461E-4, 109 76 75 s=7 w=6.354771E-4, 110 77 53 s=14 w=9.066461E-4, 111 77 76 s=2 w=9.67039E-4, 112 78 54 s=14 w=9.066461E-4, 113 78 77 s=23 w=1.3156666E-4, 114 79 55 s=14 w=9.066461E-4, 115 79 78 s=22 w=8.6808155E-5, 116 80 56 s=14 w=9.066461E-4, 117 80 79 s=21 w=7.577939E-4, 118 81 59 s=14 w=9.066461E-4, 119 81 80 s=26 w=1.458757E-4, 120 82 80 s=20 w=3.7099395E-5, 121 83 81 s=20 w=3.7099395E-5, 122 83 82 s=26 w=1.458757E-4, 123 84 59 s=20 w=3.7099395E-5, 124 84 83 s=14 w=9.066461E-4, 125 85 83 s=25 w=1.0902213E-4, 126 86 84 s=25 w=1.0902213E-4, 127 86 85 s=14 w=9.066461E-4, 128 87 59 s=25 w=1.0902213E-4, 129 87 86 s=20 w=3.7099395E-5, 130 88 60 s=25 w=1.0902213E-4, 131 88 87 s=15 w=7.542655E-4, 132 89 61 s=25 w=1.0902213E-4, 133 89 88 s=3 w=3.0405898E-4, 134 90 86 s=28 w=1.40733355E-5, 135 90 9 s=27 w=0.0051963497, 136 91 87 s=28 w=1.40733355E-5, 137 91 90 s=20 w=3.7099395E-5, 138 92 88 s=28 w=1.40733355E-5, 139 92 91 s=15 w=7.542655E-4, 140 93 89 s=28 w=1.40733355E-5, 141 93 92 s=3 w=3.0405898E-4, 142 94 61 s=28 w=1.40733355E-5, 143 94 93 s=25 w=1.0902213E-4, 144 95 62 s=28 w=1.40733355E-5, 145 95 94 s=21 w=7.577939E-4, 146 96 63 s=28 w=1.40733355E-5, 147 96 95 s=16 w=1.0719955E-4, 148 97 64 s=33 w=0.0051881927, 149 98 66 s=33 w=0.0051881927, 150 98 97 s=38 w=2.1973468E-5, 151 99 67 s=33 w=0.0051881927, 152 99 98 s=4 w=8.927283E-5, 153 100 99 s=40 w=7.4452415E-5, 154 101 67 s=40 w=7.4452415E-5, 155 101 100 s=33 w=0.0051881927, 156 102 68 s=40 w=7.4452415E-5, 157 102 101 s=34 w=6.061471E-6, 158 103 69 s=40 w=7.4452415E-5, 159 103 102 s=22 w=8.6808155E-5, 160 104 70 s=40 w=7.4452415E-5, 161 104 103 s=9 w=3.1608884E-5, 162 105 71 s=12 w=0.0022168073, 163 105 5 s=11 w=0.0020751753, 164 106 72 s=12 w=0.0022168073, 165 106 105 s=17 w=6.0168037E-5, 166 107 73 s=12 w=0.0022168073, 167 107 106 s=16 w=1.0719955E-4, 168 108 74 s=12 w=0.0022168073, 169 108 107 s=15 w=7.542655E-4, 170 109 75 s=12 w=0.0022168073, 171 109 108 s=14 w=9.066461E-4, 172 109 6 s=13 w=0.0012816527, 173 110 82 s=19 w=0.0011441667, 174 110 7 s=18 w=7.864587E-4, 175 111 83 s=19 w=0.0011441667, 176 111 110 s=26 w=1.458757E-4, 177 112 85 s=19 w=0.0011441667, 178 112 111 s=25 w=1.0902213E-4, 179 112 8 s=24 w=0.0020897626, 180 113 93 s=30 w=0.0010121305, 181 113 10 s=29 w=0.004156471, 182 114 94 s=30 w=0.0010121305, 183 114 113 s=25 w=1.0902213E-4, 184 115 95 s=30 w=0.0010121305, 185 115 114 s=21 w=7.577939E-4, 186 116 96 s=30 w=0.0010121305, 187 116 115 s=16 w=1.0719955E-4, 188 116 11 s=31 w=0.004199673, 189 117 97 s=32 w=8.544509E-4, 190 118 98 s=32 w=8.544509E-4, 191 118 117 s=38 w=2.1973468E-5, 192 119 118 s=37 w=0.0010670845, 193 119 12 s=36 w=0.0010342944, 194 120 98 s=37 w=0.0010670845, 195 120 119 s=32 w=8.544509E-4, 196 121 99 s=37 w=0.0010670845, 197 121 120 s=4 w=8.927283E-5, 198 122 100 s=37 w=0.0010670845, 199 122 121 s=40 w=7.4452415E-5, 200 123 122 s=39 w=3.0782125E-5, 201 124 100 s=39 w=3.0782125E-5, 202 124 123 s=37 w=0.0010670845, 203 125 101 s=39 w=3.0782125E-5, 204 125 124 s=33 w=0.0051881927, 205 126 125 s=42 w=0.0010669535, 206 126 13 s=41 w=0.0030889313, 207 127 101 s=42 w=0.0010669535, 208 127 126 s=39 w=3.0782125E-5, 209 128 102 s=42 w=0.0010669535, 210 128 127 s=34 w=6.061471E-6, 211 129 103 s=42 w=0.0010669535, 212 129 128 s=22 w=8.6808155E-5, 213 130 104 s=42 w=0.0010669535, 214 130 129 s=9 w=3.1608884E-5, 215 130 14 s=43 w=9.133177E-4, ; END; [Network] BEGIN st_Assumptions; uptodate; chartransform=Uncorrected_P; disttransform=NeighborNet; splitstransform=EqualAngle; SplitsPostProcess filter=dimension value=4; exclude no missing; autolayoutnodelabels; END; [st_Assumptions] phangorn/inst/extdata/trees/RAxML_bootstrap.3moles0000644000176200001440000012771013475602650022003 0ustar liggesusers((((Hma,Mur),Uth),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),(Mur,(Uth,Uam))),Hma),Tor,Ame); ((Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); ((Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Tor,Ame); ((((Uar,Uma),Hma),((Uth,Uam),Mur)),Tor,Ame); ((Hma,((Uth,Mur),(Uam,(Uar,Uma)))),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((((Uar,Uma),Uam),(Uth,Mur)),Hma),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Uar,Uma),(((Uam,Uth),Mur),Hma)),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Tor,Ame); ((((Uam,Uth),(Uar,Uma)),(Hma,Mur)),Tor,Ame); (((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); ((Mur,((Hma,Uth),(Uam,(Uar,Uma)))),Tor,Ame); (Tor,((Uma,Uar),((Mur,(Uth,Uam)),Hma)),Ame); (Tor,((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Mur,(Uma,Uar)),((Uam,Uth),Hma)),Ame); (Tor,((Uth,(Hma,Mur)),((Uma,Uar),Uam)),Ame); (Tor,(((Uth,Hma),((Uma,Uar),Uam)),Mur),Ame); (Tor,(((Uma,Uar),Uam),((Mur,Uth),Hma)),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Ame); (Tor,(Hma,((Uth,((Uma,Uar),Uam)),Mur)),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Ame); ((((Uam,(Uma,Uar)),(Mur,Uth)),Hma),Tor,Ame); (((Uma,Uar),(Hma,(Mur,(Uam,Uth)))),Tor,Ame); ((Hma,(Mur,(((Uma,Uar),Uam),Uth))),Tor,Ame); (((((Uma,Uar),Uam),Uth),(Hma,Mur)),Tor,Ame); ((((Uma,Uar),(Uam,Uth)),(Hma,Mur)),Tor,Ame); ((((Uth,(Uam,(Uma,Uar))),Mur),Hma),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Tor,Ame); ((Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Mur,Hma),((Uma,Uar),(Uth,Uam))),Tor,Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,(Mur,((Uar,Uma),((Uth,Uam),Hma))),Ame); (Tor,((Uar,Uma),(((Uth,Uam),Hma),Mur)),Ame); (Tor,((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Ame); (Tor,((Hma,(Uar,Uma)),((Uam,Uth),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Uth),Mur)),Ame); (Tor,((Uar,Uma),(Mur,(Uth,(Hma,Uam)))),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Ame); (Tor,((Mur,(Uam,Uth)),((Uar,Uma),Hma)),Ame); (Tor,(Mur,((Uam,Uth),(Hma,(Uar,Uma)))),Ame); (Tor,((Uam,(Uar,Uma)),(Mur,(Hma,Uth))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,(((Uar,Uma),(Hma,(Uth,Uam))),Mur),Ame); (Tor,((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),((Uth,Hma),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),((Uth,Hma),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Ame); (Tor,((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,((Uth,Uam),((Hma,Mur),(Uma,Uar))),Ame); (Tor,((Mur,(Uth,Uam)),((Uma,Uar),Hma)),Ame); (Tor,((Mur,(Hma,(Uth,Uam))),(Uma,Uar)),Ame); (Tor,((Mur,(Hma,Uth)),(Uam,(Uma,Uar))),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); ((((Hma,Mur),Uth),((Uma,Uar),Uam)),Tor,Ame); (((Mur,(Uth,Uam)),((Uma,Uar),Hma)),Tor,Ame); ((Uth,((Uam,(Uma,Uar)),(Hma,Mur))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); ((Hma,((Uth,((Uma,Uar),Uam)),Mur)),Tor,Ame); (((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Hma,(Mur,(((Uar,Uma),Uam),Uth))),Ame); (Tor,(((Uar,Uma),Uam),(Uth,(Hma,Mur))),Ame); (Tor,(((Uar,Uma),Uam),(Hma,(Mur,Uth))),Ame); (Tor,(((Uth,(Uam,(Uar,Uma))),Hma),Mur),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Ame); (Tor,((((Uam,Uth),Hma),Mur),(Uar,Uma)),Ame); (Tor,((((Uam,Uth),Hma),Mur),(Uar,Uma)),Ame); (Tor,(Mur,((Uar,Uma),((Uam,Uth),Hma))),Ame); (Tor,((Uar,Uma),(((Uam,Uth),Hma),Mur)),Ame); ((((Uth,Uam),Hma),(Mur,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); (((Mur,(Uth,((Uar,Uma),Uam))),Hma),Tor,Ame); (((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Tor,Ame); (((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Tor,Ame); ((((Uar,Uma),(Uam,Uth)),(Hma,Mur)),Tor,Ame); ((((Uar,Uma),(Hma,(Uam,Uth))),Mur),Tor,Ame); ((Hma,(Mur,(Uth,(Uam,(Uar,Uma))))),Tor,Ame); (((Mur,(Hma,(Uth,Uam))),(Uar,Uma)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),((Uam,Uth),Hma)),Mur),Tor,Ame); (((Uar,Uma),(Uam,(Uth,(Hma,Mur)))),Tor,Ame); (((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((Hma,Mur),(((Uar,Uma),Uam),Uth)),Tor,Ame); (((Hma,Mur),(((Uar,Uma),Uam),Uth)),Tor,Ame); ((Hma,(Mur,(((Uar,Uma),Uam),Uth))),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); (((Uth,(Mur,Hma)),(Uam,(Uar,Uma))),Tor,Ame); (((Uth,(Mur,Hma)),(Uam,(Uar,Uma))),Tor,Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Uth),Mur)),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,(((Uth,Hma),Mur),(Uam,(Uar,Uma))),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,((Hma,(Uth,Uam)),((Uar,Uma),Mur)),Ame); (Tor,((Uar,Uma),(Hma,(Mur,(Uth,Uam)))),Ame); (Tor,((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,(((Uam,(Uar,Uma)),Uth),(Mur,Hma)),Ame); (Tor,(((Uam,(Uar,Uma)),Uth),(Mur,Hma)),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Mur,Hma)),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Mur,Hma)),Ame); (Tor,((Mur,Uth),((Uam,(Uar,Uma)),Hma)),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uar,Uma))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((Mur,(Uam,Uth)),((Uar,Uma),Hma)),Ame); (Tor,((Uma,Uar),(((Uam,Uth),Hma),Mur)),Ame); (Tor,((Uma,Uar),(((Uam,Uth),Hma),Mur)),Ame); (Tor,((Uma,Uar),(((Uam,Uth),Hma),Mur)),Ame); (Tor,((((Uma,Uar),Uam),Uth),(Hma,Mur)),Ame); (Tor,(((Uma,Uar),Uam),((Mur,Uth),Hma)),Ame); (Tor,((Mur,(Uth,Uam)),(Hma,(Uma,Uar))),Ame); (Tor,((Uth,(Mur,Hma)),(Uam,(Uma,Uar))),Ame); (Tor,(((Uth,Uam),Hma),((Uma,Uar),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Ame); (Tor,((Uth,Uam),(Hma,((Uma,Uar),Mur))),Ame); (Tor,(Mur,(Hma,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,(Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Ame); (Tor,(Hma,((Mur,(Uth,Uam)),(Uma,Uar))),Ame); (Tor,(Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Ame); (Tor,((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,(((Uth,Uam),Mur),((Uma,Uar),Hma)),Ame); (Tor,(((Hma,(Uth,Uam)),Mur),(Uma,Uar)),Ame); (Tor,(((Hma,(Uth,Uam)),Mur),(Uma,Uar)),Ame); (Tor,(((Uma,Uar),(Hma,(Uam,Uth))),Mur),Ame); (Tor,((Uma,Uar),((Mur,Hma),(Uam,Uth))),Ame); (Tor,((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uma,Uar))),Ame); (Tor,((Hma,((Uam,(Uma,Uar)),Uth)),Mur),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Ame); (Tor,(Hma,(Mur,((Uam,(Uma,Uar)),Uth))),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Ame); (Tor,(((Uma,Uar),Uam),(Mur,(Uth,Hma))),Ame); (Tor,(Hma,((Uma,Uar),((Uth,Uam),Mur))),Ame); (Tor,((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Ame); (Tor,((((Uam,(Uma,Uar)),Hma),Uth),Mur),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,((Hma,(Mur,Uth)),(Uam,(Uma,Uar))),Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); (((Mur,(Uth,(Uam,(Uma,Uar)))),Hma),Tor,Ame); (((Mur,(Uth,(Uam,(Uma,Uar)))),Hma),Tor,Ame); (((Uma,Uar),(((Uth,Uam),Hma),Mur)),Tor,Ame); (((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uam,Uth),((Uma,Uar),(Mur,Hma))),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Tor,Ame); (((Uma,Uar),(Mur,((Uam,Uth),Hma))),Tor,Ame); ((((Uam,Uth),Hma),((Uma,Uar),Mur)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); ((((Uth,Uam),Mur),((Uar,Uma),Hma)),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uam,Uth),Mur),((Uar,Uma),Hma)),Tor,Ame); ((((Hma,(Uam,Uth)),Mur),(Uar,Uma)),Tor,Ame); (((((Uar,Uma),Uam),Uth),(Mur,Hma)),Tor,Ame); (((Uar,Uma),((Uth,Uam),(Mur,Hma))),Tor,Ame); (Tor,((Hma,(Uth,Uam)),((Uar,Uma),Mur)),Ame); (Tor,((Mur,(Uth,Uam)),((Uar,Uma),Hma)),Ame); (Tor,(Mur,((Uar,Uma),((Uth,Uam),Hma))),Ame); (Tor,(Mur,((Uar,Uma),((Uth,Uam),Hma))),Ame); (Tor,(((Hma,Mur),Uth),((Uar,Uma),Uam)),Ame); (Tor,(((Uth,Mur),Uam),(Hma,(Uar,Uma))),Ame); (Tor,(Hma,((Uar,Uma),((Uth,Uam),Mur))),Ame); (Tor,((Uar,Uma),(Hma,((Uth,Uam),Mur))),Ame); (Tor,((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,((Uam,Uth),((Mur,Hma),(Uar,Uma))),Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Tor,Ame); (((Mur,(Uth,(Uam,(Uar,Uma)))),Hma),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Tor,Ame); ((((Hma,(Uam,Uth)),(Uar,Uma)),Mur),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Tor,Ame); ((((Uar,Uma),(Hma,(Uth,Uam))),Mur),Tor,Ame); (((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (Tor,((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Ame); (Tor,((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Ame); (Tor,((((Uam,Uth),Hma),Mur),(Uma,Uar)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Ame); (Tor,((Mur,(Uam,Uth)),((Uma,Uar),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Hma,Mur)),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Mur,((Uam,(Uar,Uma)),Uth)),Hma),Tor,Ame); ((((Mur,Hma),Uth),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Hma,((Uam,(Uar,Uma)),(Mur,Uth))),Tor,Ame); ((((Uth,Uam),(Uar,Uma)),(Hma,Mur)),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); ((Mur,((Hma,(Uth,Uam)),(Uar,Uma))),Tor,Ame); ((((Uma,Uar),(Hma,Mur)),(Uam,Uth)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Tor,Ame); ((Uam,((Uma,Uar),((Mur,Hma),Uth))),Tor,Ame); ((Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); ((Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Tor,Ame); (((Mur,(Uth,Uam)),((Uma,Uar),Hma)),Tor,Ame); (((((Uth,Uam),Hma),Mur),(Uma,Uar)),Tor,Ame); ((((Hma,Uth),Mur),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); ((Mur,(((Uam,(Uma,Uar)),Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); ((((Uam,(Uma,Uar)),Uth),(Hma,Mur)),Tor,Ame); ((((Uam,(Uma,Uar)),(Mur,Uth)),Hma),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uma,Uar)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Hma),Mur)),Tor,Ame); (Tor,((Mur,(Uth,(Uam,(Uma,Uar)))),Hma),Ame); (Tor,(((Mur,(Uth,Uam)),Hma),(Uma,Uar)),Ame); (Tor,((Uma,Uar),(((Uth,Uam),Hma),Mur)),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Mur,Hma)),Ame); (Tor,((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Hma,Mur),((Uma,Uar),(Uth,Uam))),Ame); (Tor,(Hma,(((Uam,(Uma,Uar)),Uth),Mur)),Ame); (Tor,(Mur,(Hma,((Uam,(Uma,Uar)),Uth))),Ame); (Tor,(((Mur,Uth),(Uam,(Uma,Uar))),Hma),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,(Mur,(Hma,(Uth,(Uam,(Uar,Uma))))),Ame); (Tor,(((Uam,Uth),Mur),(Hma,(Uar,Uma))),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Uth,((Uar,Uma),Uam)),(Mur,Hma)),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Mur,Hma)),Ame); (Tor,((Mur,Hma),(((Uar,Uma),Uam),Uth)),Ame); (Tor,((Hma,Mur),((Uth,Uam),(Uar,Uma))),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,(((Uar,Uma),(Mur,(Uth,Uam))),Hma),Ame); (Tor,(((Mur,Hma),Uth),((Uar,Uma),Uam)),Ame); (Tor,(((Uar,Uma),Uam),(Hma,(Mur,Uth))),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,((Uam,(Uar,Uma)),(Mur,(Hma,Uth))),Ame); (Tor,((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Ame); (Tor,((((Uam,Uth),Hma),(Uar,Uma)),Mur),Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Uar,Uma),(Uth,Uam)),(Mur,Hma)),Tor,Ame); (((Uar,Uma),(Mur,((Uth,Uam),Hma))),Tor,Ame); ((((Uth,Uam),Hma),((Uar,Uma),Mur)),Tor,Ame); ((Mur,((Uth,Hma),(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,((Uth,Uam),Mur)),(Uar,Uma)),Tor,Ame); (((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Tor,Ame); ((Mur,(((Uam,(Uar,Uma)),Uth),Hma)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); ((Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Tor,Ame); (((Uar,Uma),((Mur,Hma),(Uam,Uth))),Tor,Ame); (((Hma,(Uar,Uma)),(Mur,(Uam,Uth))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((((Uam,Uth),Mur),(Hma,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Mur,Hma))),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Mur,((Uam,(Uma,Uar)),Uth)),Hma),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((Hma,(Uam,(Uma,Uar))),(Uth,Mur)),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uma,Uar),(((Uth,Uam),Hma),Mur)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((((Uth,Hma),Mur),(Uam,(Uma,Uar))),Tor,Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),((Uth,Hma),Mur)),Ame); (Tor,((Uar,Uma),(((Uam,Uth),Mur),Hma)),Ame); (Tor,((Uar,Uma),(((Uth,Uam),Hma),Mur)),Ame); (Tor,(((Uam,(Uar,Uma)),Uth),(Hma,Mur)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uar,Uma),(((Uth,Uam),Hma),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,((Uar,Uma),(((Uth,Uam),Hma),Mur)),Ame); (Tor,((Uar,Uma),(((Uth,Uam),Hma),Mur)),Ame); (((Uar,Uma),((Mur,(Uth,Uam)),Hma)),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),(Hma,(Uth,Uam))),Mur),Tor,Ame); ((((Hma,Mur),Uth),((Uar,Uma),Uam)),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); (((((Uar,Uma),Uam),Uth),(Mur,Hma)),Tor,Ame); (((Mur,(Uth,Uam)),(Hma,(Uar,Uma))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uar,Uma))),Tor,Ame); ((((Uth,Uam),Hma),((Uar,Uma),Mur)),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); ((((Hma,Uth),(Uam,(Uma,Uar))),Mur),Tor,Ame); ((((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Tor,Ame); (((Uth,(Hma,Mur)),((Uma,Uar),Uam)),Tor,Ame); (((Uth,(Hma,Mur)),((Uma,Uar),Uam)),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Uth,Mur))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Uth,Mur))),Tor,Ame); ((Hma,((Uth,Mur),((Uma,Uar),Uam))),Tor,Ame); ((Hma,(Mur,(((Uma,Uar),Uam),Uth))),Tor,Ame); ((((Mur,Hma),(Uma,Uar)),(Uam,Uth)),Tor,Ame); ((((Uma,Uar),Uam),((Mur,Uth),Hma)),Tor,Ame); (((((Uth,Uam),Hma),Mur),(Uma,Uar)),Tor,Ame); ((Mur,((Uth,((Uma,Uar),Uam)),Hma)),Tor,Ame); (((Mur,(Uth,Uam)),((Uma,Uar),Hma)),Tor,Ame); (((Uma,Uar),(Hma,(Mur,(Uth,Uam)))),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (((Hma,(Uth,Uam)),(Mur,(Uma,Uar))),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); ((((Uth,Uam),(Uma,Uar)),(Mur,Hma)),Tor,Ame); ((Hma,(((Uam,(Uma,Uar)),Uth),Mur)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Uth),Mur)),Tor,Ame); (Tor,((Hma,Mur),(((Uma,Uar),Uam),Uth)),Ame); (Tor,(((Uma,Uar),Uam),(Uth,(Hma,Mur))),Ame); (Tor,((Uma,Uar),(((Uth,Uam),Hma),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,((Mur,(Uth,(Uam,(Uma,Uar)))),Hma),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Ame); (Tor,((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Ame); (Tor,(Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,(((Uar,Uma),Uam),(Uth,(Hma,Mur))),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,((Uth,Uam),((Hma,Mur),(Uar,Uma))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,(Hma,(Mur,((Uam,(Uar,Uma)),Uth))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,((Uar,Uma),(((Uth,Uam),Hma),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Mur,(Uth,Uam)),((Uar,Uma),Hma)),Ame); (Tor,((((Uth,Uam),Hma),Mur),(Uar,Uma)),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,(((Uam,(Uar,Uma)),(Mur,Uth)),Hma),Ame); (Tor,((Uar,Uma),((Mur,(Uam,Uth)),Hma)),Ame); (Tor,(((Uar,Uma),((Uam,Uth),Hma)),Mur),Ame); (Tor,(((Uar,Uma),((Uam,Uth),Hma)),Mur),Ame); (Tor,((Uma,Uar),(Mur,((Uth,Uam),Hma))),Ame); (Tor,(Mur,(Uth,((Uam,(Uma,Uar)),Hma))),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uth,Mur),(Hma,(Uam,(Uma,Uar)))),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Ame); (Tor,((Uth,Uam),((Uma,Uar),(Hma,Mur))),Ame); (Tor,((Hma,Mur),((Uth,Uam),(Uar,Uma))),Ame); (Tor,((Uam,(Uar,Uma)),(Mur,(Hma,Uth))),Ame); (Tor,(Mur,(Hma,(Uth,(Uam,(Uar,Uma))))),Ame); (Tor,((Uth,Uam),((Uar,Uma),(Mur,Hma))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Uar,Uma),((Mur,(Uth,Uam)),Hma)),Ame); (Tor,((Uar,Uma),(Mur,((Uam,Uth),Hma))),Ame); (Tor,(((Uam,Uth),Hma),((Uar,Uma),Mur)),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Uam,Uth),((Uar,Uma),(Hma,Mur))),Ame); (Tor,(Mur,((Hma,(Uam,Uth)),(Uar,Uma))),Ame); (Tor,(Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,(Hma,(Mur,((Uam,(Uar,Uma)),Uth))),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Ame); (Tor,((Mur,Hma),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uar,Uma))))),Ame); (((Mur,(Hma,Uth)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uth,(Uam,(Uar,Uma))),Mur),Hma),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); ((Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); ((((Uth,Uam),Hma),((Uar,Uma),Mur)),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Tor,Ame); (((Uma,Uar),((Mur,Hma),(Uth,Uam))),Tor,Ame); (((Uth,(Mur,Hma)),(Uam,(Uma,Uar))),Tor,Ame); ((((Uth,Mur),(Uam,(Uma,Uar))),Hma),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uma,Uar),(Mur,((Uam,Uth),Hma))),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Uma,Uar),(Mur,(Uam,(Hma,Uth)))),Tor,Ame); (Tor,(Mur,((Uar,Uma),((Uam,Uth),Hma))),Ame); (Tor,((((Uar,Uma),Uam),Uth),(Hma,Mur)),Ame); (Tor,(((Uar,Uma),((Uam,Uth),Hma)),Mur),Ame); (Tor,((Uar,Uma),(((Uam,Uth),Hma),Mur)),Ame); (Tor,(Hma,((((Uar,Uma),Uam),Uth),Mur)),Ame); (Tor,(((Uar,Uma),Uam),(Uth,(Mur,Hma))),Ame); (Tor,(((Uth,Mur),((Uar,Uma),Uam)),Hma),Ame); (Tor,(((Mur,Uth),Hma),((Uar,Uma),Uam)),Ame); (Tor,(((Mur,Uth),Hma),((Uar,Uma),Uam)),Ame); (Tor,((Mur,Hma),((Uar,Uma),(Uth,Uam))),Ame); (((Uma,Uar),((Uam,(Hma,Uth)),Mur)),Tor,Ame); ((((Uth,Mur),(Uam,(Uma,Uar))),Hma),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (((Mur,Hma),(((Uma,Uar),Uam),Uth)),Tor,Ame); (((Mur,(Uma,Uar)),(Hma,(Uam,Uth))),Tor,Ame); ((Hma,((((Uma,Uar),Uam),Uth),Mur)),Tor,Ame); ((((Uma,Uar),Uam),((Mur,Hma),Uth)),Tor,Ame); ((((Uma,Uar),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uma,Uar),(Uth,Uam)),(Mur,Hma)),Tor,Ame); ((((Uma,Uar),(Uth,Uam)),(Mur,Hma)),Tor,Ame); (Tor,((Hma,Mur),(((Uar,Uma),Uam),Uth)),Ame); (Tor,(Hma,((Mur,Uth),((Uar,Uma),Uam))),Ame); (Tor,((Mur,(Uth,Uam)),(Hma,(Uar,Uma))),Ame); (Tor,((Mur,(Hma,(Uth,Uam))),(Uar,Uma)),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,(((Uar,Uma),(Hma,(Uth,Uam))),Mur),Ame); (Tor,((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Ame); (Tor,((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); ((((Uam,Uth),Mur),(Hma,(Uar,Uma))),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); ((((Uam,(Uar,Uma)),Uth),(Mur,Hma)),Tor,Ame); ((((Uar,Uma),(Uth,Uam)),(Mur,Hma)),Tor,Ame); (((Mur,(Uth,((Uar,Uma),Uam))),Hma),Tor,Ame); ((((Uar,Uma),(Uam,Uth)),(Hma,Mur)),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uar,Uma))),Tor,Ame); ((Hma,(((Uar,Uma),Uam),(Mur,Uth))),Tor,Ame); ((((Uar,Uma),(Hma,(Uth,Uam))),Mur),Tor,Ame); (Tor,((Uth,Uam),((Hma,Mur),(Uma,Uar))),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Uth),Mur)),Ame); (Tor,((Hma,(Uma,Uar)),((Uth,Uam),Mur)),Ame); (Tor,((Hma,Mur),((Uma,Uar),(Uth,Uam))),Ame); (Tor,(((Uma,Uar),(Hma,(Uth,Uam))),Mur),Ame); (Tor,(Hma,((Mur,Uth),(Uam,(Uma,Uar)))),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uma,Uar),(Mur,((Uam,Uth),Hma))),Ame); (Tor,((Uma,Uar),(Mur,((Uam,Uth),Hma))),Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((((Uam,Uth),Hma),(Mur,(Uar,Uma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); (((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((Hma,Mur),(((Uar,Uma),Uam),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Uth,Mur),Hma)),Tor,Ame); ((Hma,(((Uar,Uma),Uam),(Uth,Mur))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((Mur,(((Uth,Uam),Hma),(Uar,Uma))),Tor,Ame); (Tor,(((Uth,Mur),Hma),((Uma,Uar),Uam)),Ame); (Tor,(Hma,((Uth,((Uma,Uar),Uam)),Mur)),Ame); (Tor,(Hma,((Uth,((Uma,Uar),Uam)),Mur)),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Mur,Hma)),Ame); (Tor,(Hma,((Mur,(Uth,Uam)),(Uma,Uar))),Ame); (Tor,((Mur,(Hma,Uth)),(Uam,(Uma,Uar))),Ame); (Tor,(Mur,(Hma,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Ame); (Tor,(((Uth,Mur),Hma),((Uar,Uma),Uam)),Ame); (Tor,((Hma,(((Uar,Uma),Uam),Uth)),Mur),Ame); (Tor,((Uar,Uma),(Mur,((Uam,Uth),Hma))),Ame); (Tor,((Uar,Uma),(Mur,((Uam,Uth),Hma))),Ame); (Tor,((Hma,(Uar,Uma)),(Mur,(Uam,Uth))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Mur,Hma)),Ame); (Tor,((Uam,(Uar,Uma)),(Mur,(Uth,Hma))),Ame); (Tor,((Hma,(Uar,Uma)),(Mur,(Uth,Uam))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Mur,((Uam,(Uma,Uar)),Uth)),Hma),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,(Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Mur,(Hma,Uth))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,(((Uth,Uam),Hma),(Mur,(Uma,Uar))),Ame); (Tor,((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Ame); (Tor,(Hma,(((Uam,Uth),Mur),(Uma,Uar))),Ame); (Tor,(((Uma,Uar),Mur),(Hma,(Uam,Uth))),Ame); (Tor,(((Uth,Uam),Hma),(Mur,(Uar,Uma))),Ame); (Tor,((Hma,Mur),(((Uar,Uma),Uam),Uth)),Ame); (Tor,(Mur,(((Uar,Uma),(Uth,Uam)),Hma)),Ame); (Tor,(((Uth,Mur),((Uar,Uma),Uam)),Hma),Ame); (Tor,((Mur,(((Uar,Uma),Uam),Uth)),Hma),Ame); (Tor,(((Uar,Uma),(Uam,Uth)),(Hma,Mur)),Ame); (Tor,(((Uar,Uma),(Hma,(Uam,Uth))),Mur),Ame); (Tor,((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,((Hma,(Uar,Uma)),((Uam,Uth),Mur)),Ame); (Tor,((Hma,(Uar,Uma)),((Uam,Uth),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Ame); (Tor,((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uma,Uar))),Ame); (Tor,(Hma,((Uam,(Uma,Uar)),(Uth,Mur))),Ame); (Tor,(Hma,((Uam,(Uma,Uar)),(Uth,Mur))),Ame); (Tor,(((Uth,Uam),(Uma,Uar)),(Hma,Mur)),Ame); (Tor,(((Uth,Uam),Mur),((Uma,Uar),Hma)),Ame); (Tor,((Hma,(Uth,Uam)),(Mur,(Uma,Uar))),Ame); (Tor,(Hma,((Uth,Mur),(Uam,(Uma,Uar)))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Tor,Ame); ((((Uma,Uar),(Hma,(Uth,Uam))),Mur),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Mur),Hma)),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Hma),Mur)),Tor,Ame); ((Mur,((Uma,Uar),((Uam,Uth),Hma))),Tor,Ame); (((Hma,Mur),((Uma,Uar),(Uam,Uth))),Tor,Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Ame); (Tor,(((Uma,Uar),Uam),((Uth,Mur),Hma)),Ame); (Tor,(Hma,(((Uma,Uar),Uam),(Uth,Mur))),Ame); (Tor,(Hma,(((Uma,Uar),Uam),(Uth,Mur))),Ame); (Tor,((Uth,Mur),(Hma,((Uma,Uar),Uam))),Ame); (Tor,(((Uma,Uar),(Hma,(Uam,Uth))),Mur),Ame); (Tor,(((Uma,Uar),Uam),(Uth,(Hma,Mur))),Ame); (Tor,(((Uma,Uar),Uam),(Mur,(Uth,Hma))),Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); ((Hma,(Mur,(((Uma,Uar),Uam),Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((Mur,((((Uma,Uar),Uam),Uth),Hma)),Tor,Ame); ((((Uma,Uar),Uam),((Uth,Hma),Mur)),Tor,Ame); (((Uma,Uar),((Uth,Uam),(Hma,Mur))),Tor,Ame); ((Mur,((Uma,Uar),((Uth,Uam),Hma))),Tor,Ame); ((Mur,((Uma,Uar),((Uth,Uam),Hma))),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Hma),Mur)),Tor,Ame); (Tor,(((Uar,Uma),(Hma,Mur)),(Uth,Uam)),Ame); (Tor,(((Uar,Uma),Hma),(Mur,(Uth,Uam))),Ame); (Tor,((Hma,(Uth,(Uam,(Uar,Uma)))),Mur),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Ame); (Tor,(((Uam,(Uar,Uma)),(Uth,Mur)),Hma),Ame); (Tor,(Mur,((Uth,(Uam,(Uar,Uma))),Hma)),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,(((Uar,Uma),((Uth,Uam),Hma)),Mur),Ame); (Tor,(((Uar,Uma),(Hma,Mur)),(Uth,Uam)),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Uth,(Mur,Hma)),(Uam,(Uar,Uma))),Ame); (Tor,(Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Ame); (Tor,(((Uar,Uma),(Hma,(Uam,Uth))),Mur),Ame); (((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Uth,Mur))),Tor,Ame); (((((Uar,Uma),Uam),Uth),(Hma,Mur)),Tor,Ame); ((Mur,((((Uar,Uma),Uam),Uth),Hma)),Tor,Ame); ((((Uar,Uma),(Uam,Uth)),(Hma,Mur)),Tor,Ame); (((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Tor,Ame); ((Hma,(Mur,((Uam,(Uar,Uma)),Uth))),Tor,Ame); ((((Uam,(Uar,Uma)),Uth),(Hma,Mur)),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Uma,Uar),(Mur,((Uam,Uth),Hma))),Tor,Ame); ((Mur,(((Uam,Uth),Hma),(Uma,Uar))),Tor,Ame); (((Hma,((Uam,Uth),Mur)),(Uma,Uar)),Tor,Ame); ((Hma,(((Uam,(Uma,Uar)),Uth),Mur)),Tor,Ame); ((((Hma,(Uam,(Uma,Uar))),Uth),Mur),Tor,Ame); ((((Hma,(Uam,Uth)),(Uma,Uar)),Mur),Tor,Ame); ((Hma,((((Uma,Uar),Uam),Uth),Mur)),Tor,Ame); ((((Uma,Uar),Uam),((Uth,Mur),Hma)),Tor,Ame); (((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((((((Uma,Uar),Uam),Uth),Mur),Hma),Tor,Ame); (Tor,(((Mur,(Uam,Uth)),Hma),(Uar,Uma)),Ame); (Tor,(((Uam,Uth),(Uar,Uma)),(Hma,Mur)),Ame); (Tor,((Mur,(Uam,Uth)),((Uar,Uma),Hma)),Ame); (Tor,((Mur,(Uam,Uth)),((Uar,Uma),Hma)),Ame); (Tor,((Mur,(Uam,Uth)),((Uar,Uma),Hma)),Ame); (Tor,(Mur,((Hma,(Uam,Uth)),(Uar,Uma))),Ame); (Tor,((Hma,Mur),(Uth,((Uar,Uma),Uam))),Ame); (Tor,(((Uar,Uma),Uam),((Uth,Mur),Hma)),Ame); (Tor,((((Uar,Uma),Uam),Uth),(Mur,Hma)),Ame); (Tor,((((Uar,Uma),Uam),Uth),(Mur,Hma)),Ame); ((Hma,((Uma,Uar),(Mur,(Uth,Uam)))),Tor,Ame); (((Uam,(Uma,Uar)),(Mur,(Hma,Uth))),Tor,Ame); (((Mur,(Uth,(Uam,(Uma,Uar)))),Hma),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); ((((Uma,Uar),((Uam,Uth),Hma)),Mur),Tor,Ame); (((Uma,Uar),((Uth,(Hma,Uam)),Mur)),Tor,Ame); (((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Tor,Ame); ((Hma,(Mur,((Uam,(Uma,Uar)),Uth))),Tor,Ame); ((((Uam,Uth),Hma),(Mur,(Uma,Uar))),Tor,Ame); ((((Mur,(Uam,Uth)),Hma),(Uma,Uar)),Tor,Ame); (((Uth,(Hma,Mur)),((Uma,Uar),Uam)),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((((Uma,Uar),Uam),((Uth,Mur),Hma)),Tor,Ame); ((((Uma,Uar),Uam),(Mur,(Hma,Uth))),Tor,Ame); (((Uth,(Mur,Hma)),(Uam,(Uar,Uma))),Tor,Ame); (((Mur,Hma),((Uam,(Uar,Uma)),Uth)),Tor,Ame); ((((Uam,Uth),Hma),(Mur,(Uar,Uma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); (((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((((Uar,Uma),Uam),Uth),(Hma,Mur)),Tor,Ame); (((((Uar,Uma),Uam),Uth),(Hma,Mur)),Tor,Ame); (((((Uar,Uma),Uam),Uth),(Hma,Mur)),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Uth),Mur)),Tor,Ame); (Tor,((Uma,Uar),(Mur,((Uth,Uam),Hma))),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Hma,Mur)),Ame); (Tor,((Uma,Uar),((Uam,Uth),(Hma,Mur))),Ame); (Tor,((Mur,(Uma,Uar)),((Uam,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,(((Uth,Uam),Mur),((Uma,Uar),Hma)),Ame); (Tor,(Hma,((Mur,Uth),(Uam,(Uma,Uar)))),Ame); (Tor,(((Uam,(Uma,Uar)),Uth),(Hma,Mur)),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,(Mur,((Uar,Uma),((Uam,Uth),Hma))),Ame); (Tor,(((Uar,Uma),Uam),((Hma,Mur),Uth)),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,(((Uar,Uma),Uam),(Uth,(Hma,Mur))),Ame); (Tor,((Hma,Mur),(((Uar,Uma),Uam),Uth)),Ame); (Tor,((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Ame); (Tor,((Uth,(Mur,Hma)),(Uam,(Uar,Uma))),Ame); (Tor,(((Uth,Mur),(Uam,(Uar,Uma))),Hma),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uar,Uma))),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uar,Uma))),Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((((Uam,Uth),Mur),(Uar,Uma)),Hma),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Uar,Uma),(((Uth,Uam),Hma),Mur)),Tor,Ame); ((((Uth,((Uar,Uma),Uam)),Hma),Mur),Tor,Ame); ((((Uar,Uma),(Uam,Uth)),(Hma,Mur)),Tor,Ame); (((Uar,Uma),(Hma,(Mur,(Uam,Uth)))),Tor,Ame); (((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Uth),Mur)),Tor,Ame); (Tor,((Hma,((Uam,Uth),Mur)),(Uma,Uar)),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Ame); (Tor,(((Uam,(Uma,Uar)),(Mur,Uth)),Hma),Ame); (Tor,(((Uma,Uar),Hma),((Uth,Uam),Mur)),Ame); (Tor,((((Uma,Uar),Hma),(Uth,Mur)),Uam),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (((((Uar,Uma),Uam),(Mur,Uth)),Hma),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Hma,(Uth,Uam)),(Uar,Uma)),Mur),Tor,Ame); (((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((((Uth,Uam),Hma),Mur),(Uar,Uma)),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uth,Mur),(Uam,(Uar,Uma))),Hma),Tor,Ame); (((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (Tor,((Hma,Mur),(((Uma,Uar),Uam),Uth)),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Uth),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Ame); (Tor,(((Uth,Uam),(Uma,Uar)),(Hma,Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,(Hma,(((Uam,(Uma,Uar)),Uth),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Tor,Ame); (((Hma,Mur),((Uar,Uma),(Uth,Uam))),Tor,Ame); ((Hma,((Mur,Uth),((Uar,Uma),Uam))),Tor,Ame); ((Hma,(Mur,(Uth,((Uar,Uma),Uam)))),Tor,Ame); ((Hma,(Mur,(Uth,((Uar,Uma),Uam)))),Tor,Ame); ((((Mur,Hma),Uth),((Uar,Uma),Uam)),Tor,Ame); ((Hma,((Uth,((Uar,Uma),Uam)),Mur)),Tor,Ame); (((Mur,(Uth,Hma)),((Uar,Uma),Uam)),Tor,Ame); ((Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Tor,Ame); (((Uma,Uar),((Hma,(Uam,Uth)),Mur)),Tor,Ame); (((((Uma,Uar),Uam),Uth),(Mur,Hma)),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uma,Uar)),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); (((Hma,Mur),((Uam,Uth),(Uma,Uar))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); ((Hma,((Uam,(Uma,Uar)),(Mur,Uth))),Tor,Ame); ((Mur,((Hma,Uth),(Uam,(Uma,Uar)))),Tor,Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Uth),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Uth),Mur)),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Hma,Mur)),Ame); (Tor,((Hma,(Uam,(Uma,Uar))),(Mur,Uth)),Ame); (Tor,(Mur,((Hma,(Uth,Uam)),(Uma,Uar))),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,((Mur,(Uth,(Uam,(Uma,Uar)))),Hma),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Ame); (Tor,((Uma,Uar),(Hma,(Mur,(Uth,Uam)))),Ame); (Tor,(((Uam,(Uma,Uar)),(Uth,Mur)),Hma),Ame); (((Hma,(Uth,Uam)),(Mur,(Uar,Uma))),Tor,Ame); (((Uth,Uam),((Hma,Mur),(Uar,Uma))),Tor,Ame); (((Mur,(Uth,Uam)),(Hma,(Uar,Uma))),Tor,Ame); (((Mur,Hma),(Uth,((Uar,Uma),Uam))),Tor,Ame); (((Mur,Hma),(Uth,((Uar,Uma),Uam))),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Hma),Uth)),Tor,Ame); ((((Uar,Uma),(Hma,(Uam,Uth))),Mur),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Tor,Ame); (Tor,((Mur,(Uam,Uth)),((Uar,Uma),Hma)),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,((Uar,Uma),(Hma,((Uth,Uam),Mur))),Ame); (Tor,(((Uth,Uam),Mur),((Uar,Uma),Hma)),Ame); (Tor,(((Hma,(Uth,Uam)),Mur),(Uar,Uma)),Ame); (Tor,(((Uar,Uma),Uam),((Mur,Hma),Uth)),Ame); (Tor,((Mur,Hma),(Uth,((Uar,Uma),Uam))),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,((Hma,(Uam,Uth)),((Uar,Uma),Mur)),Ame); (Tor,(Hma,(Mur,(((Uma,Uar),Uam),Uth))),Ame); (Tor,(((Uma,Uar),Uam),(Uth,(Hma,Mur))),Ame); (Tor,(((Uma,Uar),Uam),(Hma,(Mur,Uth))),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Ame); (Tor,(Hma,((Uth,((Uma,Uar),Uam)),Mur)),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,(((Uth,Uam),(Uma,Uar)),(Mur,Hma)),Ame); (Tor,((Hma,(Uam,(Uma,Uar))),(Mur,Uth)),Ame); (Tor,((Mur,((Uth,Uam),Hma)),(Uma,Uar)),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,((Mur,(Uth,Hma)),(Uam,(Uma,Uar))),Ame); (Tor,((((Uma,Uar),Uam),Uth),(Mur,Hma)),Ame); (Tor,((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Ame); (Tor,((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Ame); (Tor,((Mur,(Hma,(Uam,Uth))),(Uma,Uar)),Ame); (Tor,(Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Ame); (Tor,(Hma,(Mur,(Uth,((Uma,Uar),Uam)))),Ame); (Tor,(Mur,((Uma,Uar),((Uth,Uam),Hma))),Ame); (Tor,((Hma,(Mur,Uth)),(Uam,(Uma,Uar))),Ame); (Tor,((Hma,(Mur,Uth)),(Uam,(Uma,Uar))),Ame); (Tor,((Hma,(Uam,Uth)),((Uar,Uma),Mur)),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,(Mur,Uth)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,Mur),(Uth,((Uar,Uma),Uam))),Ame); (((Uth,(Hma,Mur)),((Uma,Uar),Uam)),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,((Uma,Uar),Uam)),(Uth,Mur)),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); ((Hma,(Mur,(((Uma,Uar),Uam),Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Uth,Uam),((Hma,Mur),(Uma,Uar))),Tor,Ame); (((Uar,Uma),((Mur,(Uth,Uam)),Hma)),Tor,Ame); (((Uar,Uma),(Mur,((Uam,Uth),Hma))),Tor,Ame); (((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Tor,Ame); (((Uth,Uam),((Hma,Mur),(Uar,Uma))),Tor,Ame); ((((Uth,Uam),(Uar,Uma)),(Mur,Hma)),Tor,Ame); (((Uth,Mur),(Hma,(Uam,(Uar,Uma)))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Uar,Uma),(Mur,(Uam,(Uth,Hma)))),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Mur,Hma)),Tor,Ame); (((Uma,Uar),((Hma,(Uam,Uth)),Mur)),Tor,Ame); (((Uma,Uar),((Hma,(Uam,Uth)),Mur)),Tor,Ame); (((Hma,(Uam,(Uma,Uar))),(Uth,Mur)),Tor,Ame); (((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Tor,Ame); ((((Uam,Uth),Mur),(Hma,(Uma,Uar))),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uma,Uar)),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uma,Uar)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); ((((Uth,Uam),Hma),(Mur,(Uma,Uar))),Tor,Ame); ((Mur,((Uth,((Uma,Uar),Uam)),Hma)),Tor,Ame); (Tor,(((Uam,Uth),(Uar,Uma)),(Mur,Hma)),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Ame); (Tor,((Uar,Uma),(((Uam,Uth),Mur),Hma)),Ame); (Tor,((Hma,((Uam,(Uar,Uma)),Uth)),Mur),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,((Uar,Uma),((Uam,Uth),(Mur,Hma))),Ame); (Tor,((Hma,(Uar,Uma)),((Uam,Uth),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((((Uth,Uam),Hma),(Uar,Uma)),Mur),Ame); (Tor,((Mur,(Uth,Uam)),(Hma,(Uar,Uma))),Ame); ((((Hma,Mur),Uth),((Uma,Uar),Uam)),Tor,Ame); (((Hma,Mur),(Uth,((Uma,Uar),Uam))),Tor,Ame); (((Hma,(Uth,Mur)),((Uma,Uar),Uam)),Tor,Ame); (((Hma,(Uth,((Uma,Uar),Uam))),Mur),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Hma),Mur)),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Hma),Mur)),Tor,Ame); (((Mur,Hma),(((Uma,Uar),Uam),Uth)),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Mur,Hma))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Mur,Hma))),Tor,Ame); (Tor,(Mur,((Uam,(Uar,Uma)),(Hma,Uth))),Ame); (Tor,(((Hma,(Uth,Uam)),(Uar,Uma)),Mur),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uar,Uma))))),Ame); (Tor,(Hma,((Uam,(Uar,Uma)),(Mur,Uth))),Ame); (Tor,(Mur,((Uar,Uma),((Uam,Uth),Hma))),Ame); (Tor,(((Uam,Uth),Hma),(Mur,(Uar,Uma))),Ame); (Tor,(Mur,((Uar,Uma),((Uam,Uth),Hma))),Ame); (Tor,((Hma,Mur),(Uth,((Uar,Uma),Uam))),Ame); (Tor,(((Uar,Uma),Uam),(Hma,(Mur,Uth))),Ame); (Tor,(((Uar,Uma),((Uth,Uam),Hma)),Mur),Ame); ((Hma,((Uar,Uma),(Mur,(Uam,Uth)))),Tor,Ame); ((Hma,(Mur,(Uth,(Uam,(Uar,Uma))))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); (((Mur,Hma),((Uam,(Uar,Uma)),Uth)),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),(Hma,(Uth,Uam))),Mur),Tor,Ame); (((Hma,Mur),(((Uar,Uma),Uam),Uth)),Tor,Ame); ((Hma,(Mur,(((Uar,Uma),Uam),Uth))),Tor,Ame); ((Hma,(((Uar,Uma),Uam),(Uth,Mur))),Tor,Ame); ((Hma,(((Uar,Uma),Uam),(Uth,Mur))),Tor,Ame); (Tor,((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,(((Uth,Uam),Mur),(Hma,(Uma,Uar))),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Ame); (Tor,(((Uth,Mur),(Uam,(Uma,Uar))),Hma),Ame); (Tor,((Hma,Mur),((Uth,Uam),(Uma,Uar))),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,((Hma,(Mur,(Uth,Uam))),(Uma,Uar)),Ame); (Tor,((Uth,Uam),((Uma,Uar),(Hma,Mur))),Ame); (((Uam,(Uar,Uma)),((Uth,Hma),Mur)),Tor,Ame); ((((Uth,Uam),Mur),(Hma,(Uar,Uma))),Tor,Ame); ((((Uth,Uam),Mur),(Hma,(Uar,Uma))),Tor,Ame); ((((Hma,(Uth,Uam)),Mur),(Uar,Uma)),Tor,Ame); (((Uth,Uam),((Mur,Hma),(Uar,Uma))),Tor,Ame); ((Hma,(Mur,(Uth,((Uar,Uma),Uam)))),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); (((((Uam,Uth),Hma),(Uar,Uma)),Mur),Tor,Ame); (((((Uam,Uth),Hma),(Uar,Uma)),Mur),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (Tor,(((Hma,Mur),Uth),((Uar,Uma),Uam)),Ame); (Tor,((((Uth,Uam),Hma),Mur),(Uar,Uma)),Ame); (Tor,(((Uth,(Uam,(Uar,Uma))),Mur),Hma),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Mur,Hma)),Ame); (Tor,((Mur,((Uam,(Uar,Uma)),Uth)),Hma),Ame); (Tor,(((Uam,(Uar,Uma)),Uth),(Hma,Mur)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,(Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Ame); (Tor,(((Uar,Uma),Hma),((Uth,Uam),Mur)),Ame); (Tor,(Mur,(((Uar,Uma),Hma),(Uth,Uam))),Ame); ((((Uth,Mur),Hma),((Uar,Uma),Uam)),Tor,Ame); (((Mur,(Hma,Uth)),((Uar,Uma),Uam)),Tor,Ame); ((((Mur,Uth),((Uar,Uma),Uam)),Hma),Tor,Ame); ((((Hma,Mur),Uth),((Uar,Uma),Uam)),Tor,Ame); (((Uar,Uma),(Hma,(Mur,(Uam,Uth)))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),((Uth,Hma),Mur)),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); ((Mur,((Uth,(Uam,(Uar,Uma))),Hma)),Tor,Ame); ((Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Tor,Ame); ((((Mur,Hma),Uth),(Uam,(Uma,Uar))),Tor,Ame); (((Mur,(Hma,Uth)),(Uam,(Uma,Uar))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((((Hma,(Uth,Uam)),Mur),(Uma,Uar)),Tor,Ame); ((Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); ((((Uth,Uam),(Uma,Uar)),(Hma,Mur)),Tor,Ame); (((Uth,Uam),((Uma,Uar),(Hma,Mur))),Tor,Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,(((Uam,(Uar,Uma)),Uth),(Hma,Mur)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,(((Uar,Uma),(Mur,(Uth,Uam))),Hma),Ame); (Tor,((Mur,(Uth,Uam)),(Hma,(Uar,Uma))),Ame); (Tor,((Mur,(Hma,(Uth,Uam))),(Uar,Uma)),Ame); (Tor,((Mur,(Hma,Uth)),(Uam,(Uar,Uma))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Mur,Hma),(Uar,Uma)),(Uam,Uth)),Tor,Ame); ((Uam,(Uth,(Mur,(Hma,(Uar,Uma))))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uam,(Uar,Uma)),Uth),(Hma,Mur)),Tor,Ame); ((((Uam,(Uar,Uma)),Uth),(Hma,Mur)),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uar,Uma))),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uar,Uma))),Tor,Ame); (((Uar,Uma),(Hma,(Mur,(Uth,Uam)))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); (((Uar,Uma),((Mur,(Uth,Uam)),Hma)),Tor,Ame); ((((Uth,(Uam,(Uar,Uma))),Hma),Mur),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Mur,(((Uma,Uar),Uam),Uth)),Hma),Tor,Ame); (((((Uma,Uar),Uam),Uth),(Hma,Mur)),Tor,Ame); ((Mur,((((Uma,Uar),Uam),Uth),Hma)),Tor,Ame); (((Mur,(((Uma,Uar),Uam),Uth)),Hma),Tor,Ame); ((((Uma,Uar),(Uam,Uth)),(Hma,Mur)),Tor,Ame); ((((Mur,Uth),(Uam,(Uma,Uar))),Hma),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Tor,Ame); (((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Mur),Hma)),Tor,Ame); (Tor,(Hma,((Uam,(Uma,Uar)),(Mur,Uth))),Ame); (Tor,(Hma,((Mur,(Uth,Uam)),(Uma,Uar))),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,(Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Ame); (Tor,(((Uma,Uar),(Uam,(Uth,Hma))),Mur),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,(Mur,(Uth,(Hma,(Uam,(Uma,Uar))))),Ame); (Tor,(Mur,(((Uth,Uam),Hma),(Uma,Uar))),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uma,Uar))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,(((Uma,Uar),((Uth,Uam),Mur)),Hma),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Hma),Mur)),Ame); (Tor,(((Uam,(Uma,Uar)),Uth),(Mur,Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Ame); (Tor,((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Ame); (Tor,(Hma,(((Uam,(Uma,Uar)),Uth),Mur)),Ame); (Tor,(((Uth,Uam),(Uma,Uar)),(Mur,Hma)),Ame); (Tor,(((Mur,(Uth,Uam)),(Uma,Uar)),Hma),Ame); (Tor,(Hma,(Mur,(((Uar,Uma),Uam),Uth))),Ame); (Tor,(((Uar,Uma),Uam),(Hma,(Uth,Mur))),Ame); (Tor,(((Uar,Uma),Uam),(Hma,(Uth,Mur))),Ame); (Tor,((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Ame); (Tor,((Uar,Uma),((Uam,Uth),(Mur,Hma))),Ame); (Tor,(((Uam,(Uar,Uma)),(Uth,Mur)),Hma),Ame); (Tor,(((Uam,(Uar,Uma)),(Uth,Hma)),Mur),Ame); (Tor,((Uth,Mur),(Hma,(Uam,(Uar,Uma)))),Ame); (Tor,((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Ame); ((Hma,((Uam,(Uar,Uma)),(Uth,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Tor,Ame); (((Hma,(Uam,(Uar,Uma))),(Mur,Uth)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Mur,(Uth,Uam)),((Uar,Uma),Hma)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uma,Uar),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); (((Uth,Uam),((Mur,Hma),(Uma,Uar))),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Uth),Mur)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Mur,(Hma,Uth)),(Uam,(Uma,Uar))),Tor,Ame); ((((Uma,Uar),(Uth,Uam)),(Mur,Hma)),Tor,Ame); ((Uam,((Uth,(Mur,Hma)),(Uma,Uar))),Tor,Ame); ((((Uma,Uar),Hma),((Uam,Uth),Mur)),Tor,Ame); phangorn/inst/extdata/trees/RAxML_bestTree.Wang.out0000644000176200001440000000254213475602650022036 0ustar liggesusers(((t2:0.14211731987709066982,t3:0.06053783689898680626):0.01915320533263515854,(((t26:0.10076663346788350406,t27:0.09012377576079726171):0.00617748657056873228,(((t24:0.05083401775033660058,t25:0.04968730003684527358):0.12390520932858628544,(((t18:0.22659556680242753934,t17:0.09828171476802796680):0.01533921899764495791,((t19:0.10129875525132767122,t20:0.12134488266574683379):0.00849558744650705938,(t21:0.14505926027183771443,t22:0.17551017119642836617):0.00877793060138474905):0.00308912190361631612):0.00325025398389936155,t23:0.13360283374445222626):0.00171491633371120703):0.00160215446139677989,(((t15:0.03914802254136381943,t14:0.07040398566638517153):0.03746247464686409262,t16:0.07327896602473775445):0.00145565313441271263,((t12:0.05709523870354735187,t13:0.05346362539908256634):0.06851532854988398591,(t11:0.11034742412225925778,((t9:0.09630285720604085664,t10:0.09806651845861839856):0.01228546588769166559,(t8:0.05668846472663713332,(t6:0.06757767233543143792,t7:0.07178189518727731699):0.05036938539158694605):0.02478913815739459264):0.01159461463256000746):0.04912118273441323790):0.00191152082391572308):0.00157222714633921249):0.00574371179431406795):0.00298952648360721086,(t5:0.10213446240655763009,t4:0.08638068218703777446):0.04442405900560150028):0.00219766117784960489):0.08957057546751605315,t1:0.08141632437271865974,t0:0.18549589738394117733):0.0; phangorn/inst/extdata/trees/RAxML_bootstrap.AIs0000644000176200001440000006025613475602650021256 0ustar liggesusers(((Hma,Mur),((Uar,Uma),(Uth,Uam))),Tor,Ame); (((Hma,Mur),((Uar,Uma),(Uth,Uam))),Tor,Ame); (((Hma,Mur),(((Uar,Uma),Uam),Uth)),Tor,Ame); (((Uma,((Mur,Uth),Hma)),(Uar,Uam)),Tor,Ame); (((Uth,(Mur,Hma)),((Uma,Uar),Uam)),Tor,Ame); (((Mur,Hma),((Uma,Uar),(Uth,Uam))),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uth,Uam),((Uma,Uar),(Mur,Hma))),Tor,Ame); (((Uth,(Mur,Uam)),((Uma,Uar),Hma)),Tor,Ame); ((Hma,((Uam,(Uth,(Uma,Uar))),Mur)),Tor,Ame); (Tor,(((Uma,Uar),Uam),(Hma,(Mur,Uth))),Ame); (Tor,((Uth,Uam),((Uma,(Hma,Mur)),Uar)),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uma,Uar))),Ame); (Tor,(((Hma,Mur),Uth),((Uam,Uar),Uma)),Ame); (Tor,(Uam,((Uth,(Uar,Uma)),(Hma,Mur))),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Uam,(Uth,Mur)),((Uar,Uma),Hma)),Ame); (Tor,((Hma,Mur),(((Uar,Uma),Uam),Uth)),Ame); (Tor,((Hma,(Uar,Uma)),((Uth,Mur),Uam)),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uar,Uma))))),Ame); (Tor,((((Hma,Mur),Uma),Uar),(Uam,Uth)),Ame); (Tor,((Hma,((Uam,Uth),Mur)),(Uma,Uar)),Ame); (Tor,(Uam,((Mur,Hma),((Uma,Uar),Uth))),Ame); (Tor,((Hma,(Uma,Uar)),(Uth,(Uam,Mur))),Ame); (Tor,((Mur,((Hma,(Uma,Uar)),Uth)),Uam),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,(((Uth,Uam),(Uma,Uar)),(Mur,Hma)),Ame); (Tor,((Uar,(Uma,(Hma,Mur))),(Uth,Uam)),Ame); (Tor,((Uar,(Uma,(Hma,(Uth,Mur)))),Uam),Ame); (Tor,(((Uth,(Uar,Uma)),(Hma,Mur)),Uam),Ame); (Tor,((Hma,Mur),((Uth,Uam),(Uar,Uma))),Ame); (Tor,(((Mur,Uth),Uam),((Uar,Uma),Hma)),Ame); (Tor,(((Mur,Hma),Uth),(Uam,(Uar,Uma))),Ame); (Tor,((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Hma,(Uar,Uma)),(Mur,(Uam,Uth))),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Ame); (Tor,((Mur,(Uth,Uam)),((Uar,Uma),Hma)),Ame); (Tor,(((Hma,Uma),(Uam,(Mur,Uth))),Uar),Ame); (Tor,(((Uar,Uma),((Mur,Uth),Hma)),Uam),Ame); (Tor,((Mur,Hma),(Uam,(Uth,(Uar,Uma)))),Ame); (Tor,((Uth,Mur),(Hma,(Uam,(Uar,Uma)))),Ame); (Tor,(Hma,((Mur,(Uth,Uam)),(Uar,Uma))),Ame); (Tor,(Hma,((Uam,(Mur,Uth)),(Uar,Uma))),Ame); (Tor,((Uam,Uth),(Uar,(Uma,(Hma,Mur)))),Ame); (Tor,(Uam,(Uar,(Uma,(Hma,(Uth,Mur))))),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Hma,Mur)),Ame); (Tor,((Mur,(Uam,Uth)),((Uma,Uar),Hma)),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,((Mur,(Uam,Uth)),(Hma,(Uar,Uma))),Ame); (Tor,(Hma,((Uar,Uma),(Mur,(Uam,Uth)))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,(((Uth,Uam),(Uar,Uma)),(Hma,Mur)),Ame); (Tor,(((Uma,Uar),Uam),(Hma,(Uth,Mur))),Ame); (Tor,((Hma,(Uma,Uar)),((Uth,Mur),Uam)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,(Uam,((Uma,((Uth,Mur),Hma)),Uar)),Ame); (Tor,(Uam,((Uth,Mur),(Hma,(Uar,Uma)))),Ame); (Tor,((Uth,Uam),(((Hma,Mur),Uma),Uar)),Ame); (Tor,(Uam,(((Hma,(Uth,Mur)),Uma),Uar)),Ame); (Tor,(Uam,((Hma,Mur),(Uth,(Uar,Uma)))),Ame); (Tor,((Uth,Uam),(((Hma,Mur),Uma),Uar)),Ame); (Tor,(((Mur,Uth),Uam),(Hma,(Uma,Uar))),Ame); (Tor,(((Uth,Hma),Mur),((Uar,Uma),Uam)),Ame); (Tor,((Hma,(Mur,Uth)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,(Mur,Uth)),((Uar,Uma),Uam)),Ame); (Tor,(((Mur,Uth),Uam),(Hma,(Uar,Uma))),Ame); (Tor,((((Hma,Mur),Uth),Uam),(Uar,Uma)),Ame); (Tor,((Uth,Uam),((Mur,Hma),(Uar,Uma))),Ame); (Tor,((Mur,((Hma,(Uar,Uma)),Uth)),Uam),Ame); (Tor,((Hma,Mur),((Uth,Uam),(Uar,Uma))),Ame); (Tor,((Hma,(Uth,Mur)),((Uam,Uar),Uma)),Ame); (Tor,((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,Mur),((Uar,Uma),(Uth,Uam))),Ame); (Tor,((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,(Uma,Uar)),((Mur,Uth),Uam)),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),(Mur,(Uth,Hma))),Ame); (Tor,((Uth,Uam),((Uma,Uar),(Mur,Hma))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Ame); (Tor,(Uam,((Uth,(Uar,Uma)),(Mur,Hma))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,((((Uth,Mur),Uam),(Uar,Uma)),Hma),Ame); (Tor,(((Uth,(Mur,Uam)),(Uar,Uma)),Hma),Ame); (((Uam,(Uth,(Uar,Uma))),(Hma,Mur)),Tor,Ame); ((((Uar,Uam),Uma),(Hma,(Uth,Mur))),Tor,Ame); ((((Uth,Mur),((Uar,Uma),Hma)),Uam),Tor,Ame); (((Uth,(Uar,((Hma,Mur),Uma))),Uam),Tor,Ame); (((Hma,(Uma,(Uam,Uar))),(Uth,Mur)),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uma,Uar))),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uma,Uar))),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Tor,Ame); (((Hma,(Uar,Uma)),(Uam,(Uth,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Tor,Ame); ((((Uar,Uma),(Uth,Uam)),(Hma,Mur)),Tor,Ame); ((Uar,(Uma,(((Mur,Uth),Uam),Hma))),Tor,Ame); ((Uam,((Hma,(Uar,Uma)),(Mur,Uth))),Tor,Ame); (((Uth,Uam),((Uar,Uma),(Hma,Mur))),Tor,Ame); ((((Uam,Uar),Uma),(Hma,(Uth,Mur))),Tor,Ame); (((Uam,(Mur,Uth)),((Uma,Uar),Hma)),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); ((((Uma,((Hma,Mur),Uth)),Uar),Uam),Tor,Ame); (((Hma,(Mur,Uth)),((Uar,Uma),Uam)),Tor,Ame); ((Uam,((Hma,(Mur,Uth)),(Uar,Uma))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Uar,((Hma,Mur),Uma)),(Uth,Uam)),Tor,Ame); ((((Hma,Mur),Uth),(Uam,(Uma,Uar))),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uma,Uar))),Tor,Ame); (((Uam,(Uth,Mur)),(Hma,(Uma,Uar))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Uth,Mur))),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uma,Uar),(Uam,(Mur,Uth))),Hma),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); ((Mur,((Uth,Uam),((Uar,Uma),Hma))),Tor,Ame); ((Uam,((Uth,Mur),((Uma,Uar),Hma))),Tor,Ame); ((((Uma,Uar),Hma),((Uth,Uam),Mur)),Tor,Ame); ((((Uma,(Uam,Uar)),Hma),(Mur,Uth)),Tor,Ame); (Tor,((((Uma,Uar),Uth),(Mur,Hma)),Uam),Ame); (Tor,((((Uth,Mur),Hma),Uma),(Uam,Uar)),Ame); (Tor,((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uma,Uar))),Ame); (Tor,((Mur,Hma),((Uth,(Uam,Uar)),Uma)),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,((Hma,(Uar,Uma)),(Mur,(Uth,Uam))),Ame); (Tor,((Uar,(Uma,((Mur,Uth),Hma))),Uam),Ame); (Tor,(((Mur,Hma),(Uar,Uma)),(Uth,Uam)),Ame); (Tor,((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Ame); (Tor,(((Uma,Uar),Uam),((Mur,Uth),Hma)),Ame); (Tor,(((Uth,(Uma,Uar)),Uam),(Mur,Hma)),Ame); (Tor,(Uam,(((Uth,Mur),Hma),(Uar,Uma))),Ame); (Tor,((Uth,((Uar,Uma),Uam)),(Mur,Hma)),Ame); (Tor,(((Uar,Uma),Hma),((Uth,Uam),Mur)),Ame); (Tor,((Hma,Mur),((Uar,Uma),(Uth,Uam))),Ame); (Tor,((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((((Uar,Uma),Uth),(Mur,Hma)),Uam),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); ((((Mur,Hma),((Uar,Uma),Uth)),Uam),Tor,Ame); ((((Uth,Uam),(Uar,Uma)),(Mur,Hma)),Tor,Ame); ((((Mur,Uth),Uam),(Hma,(Uar,Uma))),Tor,Ame); (((Uth,(Uam,Mur)),(Hma,(Uar,Uma))),Tor,Ame); (((Uth,Uam),((Mur,Hma),(Uar,Uma))),Tor,Ame); (((Uth,Uam),(Mur,(Hma,(Uar,Uma)))),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Hma,(Uar,Uma)),(Uth,Uam)),Mur),Tor,Ame); ((((Uam,Uar),Uma),((Mur,Uth),Hma)),Tor,Ame); ((((Mur,Hma),((Uma,Uar),Uth)),Uam),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); ((((Uth,Mur),Hma),(Uma,(Uam,Uar))),Tor,Ame); (((Uth,Mur),(Hma,(Uma,(Uam,Uar)))),Tor,Ame); (((Uam,Uth),(Uar,((Mur,Hma),Uma))),Tor,Ame); (((Uth,(Mur,Hma)),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,Mur),(Hma,(Uam,(Uma,Uar)))),Tor,Ame); (((Hma,(Uth,Mur)),(Uma,(Uar,Uam))),Tor,Ame); (((Uth,Mur),(((Uam,Uma),Uar),Hma)),Tor,Ame); ((((Uth,(Hma,Mur)),(Uma,Uar)),Uam),Tor,Ame); (((Uth,(Hma,Mur)),((Uma,Uar),Uam)),Tor,Ame); (((Uth,Uam),(Uar,((Hma,Mur),Uma))),Tor,Ame); ((((Mur,Uth),Hma),((Uma,Uar),Uam)),Tor,Ame); ((Uam,((Uma,((Mur,Uth),Hma)),Uar)),Tor,Ame); ((Uam,((Uth,(Hma,Mur)),(Uar,Uma))),Tor,Ame); (((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((Uam,Uar),(Uma,(Uth,(Hma,Mur)))),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); ((Uam,((Uar,Uma),(Hma,(Mur,Uth)))),Tor,Ame); (((Uar,(Hma,Uma)),((Mur,Uth),Uam)),Tor,Ame); ((((Mur,Uth),Hma),((Uma,Uar),Uam)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); ((Uam,(((Uar,Uma),Uth),(Mur,Hma))),Tor,Ame); (((Uam,(Mur,Uth)),(Hma,(Uar,Uma))),Tor,Ame); ((Uam,((Hma,Mur),((Uar,Uma),Uth))),Tor,Ame); ((Uam,((Hma,Mur),((Uar,Uma),Uth))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((((Hma,Mur),((Uar,Uma),Uth)),Uam),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); ((((Uth,Uam),(Uar,Uma)),(Hma,Mur)),Tor,Ame); ((((Uth,Uam),(Uar,Uma)),(Hma,Mur)),Tor,Ame); (Tor,((Uma,(((Uth,Mur),Hma),Uar)),Uam),Ame); (Tor,(Uam,(Uar,(Uma,(Uth,(Mur,Hma))))),Ame); (Tor,(((Mur,Hma),((Uar,Uma),Uth)),Uam),Ame); (Tor,((Hma,((Uar,Uma),(Mur,Uth))),Uam),Ame); (Tor,((Mur,Hma),((Uma,Uar),(Uth,Uam))),Ame); (Tor,(((Mur,Uth),Hma),((Uma,Uar),Uam)),Ame); (Tor,(((Uam,(Mur,Uth)),Hma),(Uma,Uar)),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uma,Uar))),Ame); (Tor,((Uth,Uam),(((Hma,Mur),Uma),Uar)),Ame); (Tor,((Hma,(Uth,Mur)),((Uma,Uar),Uam)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Ame); (Tor,((Uam,(Mur,Uth)),((Uma,Uar),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Ame); (Tor,(((Uth,Uam),(Uar,Uma)),(Hma,Mur)),Ame); (Tor,(((Mur,Uth),Uam),((Uar,Uma),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,(((Uth,Uam),(Uar,Uma)),(Mur,Hma)),Ame); (Tor,(((Mur,Uth),Uam),((Uar,Uma),Hma)),Ame); ((Hma,((Uam,(Uth,Mur)),(Uma,Uar))),Tor,Ame); (((Uam,(Uth,Mur)),(Hma,(Uma,Uar))),Tor,Ame); (((((Uma,Uar),Uth),(Hma,Mur)),Uam),Tor,Ame); ((((Uma,Uar),Hma),((Uth,Mur),Uam)),Tor,Ame); (((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uma,Uar))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uma,Uar))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Hma,Mur)),Tor,Ame); (((Uam,(Uth,Mur)),((Uma,Uar),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Hma,Mur)),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Tor,Ame); (((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Mur,Hma),((Uth,Uam),(Uma,Uar))),Tor,Ame); (((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((((Uma,Uar),Uth),(Mur,Hma)),Uam),Tor,Ame); (((Uma,Uar),((Uth,(Mur,Hma)),Uam)),Tor,Ame); (((Uth,(Mur,Hma)),(Uam,(Uma,Uar))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Uth,Mur))),Tor,Ame); ((((Uth,Mur),Uam),(Hma,(Uma,Uar))),Tor,Ame); (((Uth,Uam),((Mur,Hma),(Uma,Uar))),Tor,Ame); (((Uth,Uam),((Hma,(Uma,Uar)),Mur)),Tor,Ame); ((((Uma,Uar),Hma),((Mur,Uth),Uam)),Tor,Ame); ((Uam,((Hma,Mur),((Uma,Uar),Uth))),Tor,Ame); (((Hma,(Uth,Mur)),((Uma,Uar),Uam)),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uma,Uar)),(Uam,(Mur,Uth))),Tor,Ame); (((Hma,(Uma,Uar)),(Mur,(Uth,Uam))),Tor,Ame); (((Uam,(Uth,Mur)),((Uma,Uar),Hma)),Tor,Ame); ((Uth,(Uam,(((Hma,Mur),Uma),Uar))),Tor,Ame); ((Hma,(Mur,((Uam,(Uma,Uar)),Uth))),Tor,Ame); ((Uam,((Hma,Mur),((Uma,Uar),Uth))),Tor,Ame); (((Uma,(Uar,(Hma,(Uth,Mur)))),Uam),Tor,Ame); ((((Uth,(Mur,Hma)),(Uma,Uar)),Uam),Tor,Ame); (((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Tor,Ame); ((Hma,((Uam,(Uth,Mur)),(Uma,Uar))),Tor,Ame); (Tor,((Uth,(Mur,Hma)),((Uma,Uar),Uam)),Ame); (Tor,((Uma,Uar),(Uam,(Uth,(Mur,Hma)))),Ame); (Tor,((Uma,Uar),((Mur,(Uam,Uth)),Hma)),Ame); (Tor,(((Mur,Uth),Hma),(Uam,(Uma,Uar))),Ame); (Tor,(Uam,((Uma,Uar),(Uth,(Hma,Mur)))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,(Uam,((Uar,Uma),(Hma,(Mur,Uth)))),Ame); (Tor,(Uam,(Mur,(Uth,((Uar,Uma),Hma)))),Ame); (Tor,(Uam,((Hma,Mur),(Uth,(Uar,Uma)))),Ame); (Tor,((Hma,Mur),(Uth,((Uma,Uar),Uam))),Ame); (Tor,(Uam,((Mur,Hma),((Uma,Uar),Uth))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uma,Uar))),Ame); (Tor,((Uma,((Uth,Mur),Hma)),(Uam,Uar)),Ame); (Tor,((Mur,Hma),((Uth,Uam),(Uar,Uma))),Ame); (Tor,((Uth,Uam),((Uar,Uma),(Mur,Hma))),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,(Uam,((Uar,Uma),(Hma,(Uth,Mur)))),Ame); (Tor,(Uam,((Uth,(Uar,Uma)),(Hma,Mur))),Ame); (Tor,(((Uam,Uth),(Uar,Uma)),(Hma,Mur)),Ame); ((((Uma,Uar),Uam),((Uth,Mur),Hma)),Tor,Ame); ((((Uma,Uar),Uam),((Mur,Hma),Uth)),Tor,Ame); (((Mur,Uth),(Hma,((Uma,Uar),Uam))),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); (((Hma,(Uth,Mur)),((Uma,Uar),Uam)),Tor,Ame); ((Uam,(((Hma,Mur),Uth),(Uma,Uar))),Tor,Ame); ((Uam,((Mur,Uth),(Hma,(Uma,Uar)))),Tor,Ame); (((Uth,Uam),(((Hma,Mur),Uma),Uar)),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Mur,((Uma,Uar),Uth))),Hma),Tor,Ame); (((((Uma,Uar),Uam),Uth),(Mur,Hma)),Tor,Ame); ((((Uma,Uar),Uam),(Mur,(Uth,Hma))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uam,Mur),Uth),((Uma,Uar),Hma)),Tor,Ame); (((Mur,Hma),((Uar,(Uam,Uth)),Uma)),Tor,Ame); (((Mur,Hma),((Uam,Uth),(Uma,Uar))),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Hma,(Uma,Uar)),((Uam,Uth),Mur)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,(((Uma,Uar),Uam),(Hma,(Uth,Mur))),Ame); (Tor,(Uam,(Mur,((Hma,(Uma,Uar)),Uth))),Ame); (Tor,((Mur,Hma),((Uma,Uar),(Uam,Uth))),Ame); (Tor,(((Uth,Uma),(Mur,Hma)),(Uar,Uam)),Ame); (Tor,(Hma,(Mur,((Uma,Uar),(Uam,Uth)))),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Hma,Mur)),Ame); (Tor,(((Uam,Uth),Mur),((Uma,Uar),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,(Uam,(((Uar,Uma),Hma),(Uth,Mur))),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,(Uam,((Uma,Uar),(Hma,(Mur,Uth)))),Ame); (Tor,((((Uam,(Uma,Uar)),Uth),Mur),Hma),Ame); (Tor,(((Uth,Uam),Uar),(Uma,(Hma,Mur))),Ame); (Tor,(Uam,((Uar,Uma),(Uth,(Hma,Mur)))),Ame); (Tor,((Hma,Mur),((Uth,Uam),(Uar,Uma))),Ame); (Tor,(((Hma,Mur),(Uth,(Uar,Uma))),Uam),Ame); (Tor,(((Hma,Mur),(Uth,(Uar,Uma))),Uam),Ame); (Tor,((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Ame); (Tor,(((Uar,Uma),Hma),((Uam,Uth),Mur)),Ame); ((Uam,((Uth,(Uar,Uma)),(Mur,Hma))),Tor,Ame); ((Uam,((Hma,(Uar,Uma)),(Mur,Uth))),Tor,Ame); ((Uam,(((Hma,Mur),Uth),(Uar,Uma))),Tor,Ame); ((Uam,((Hma,Mur),(Uth,(Uar,Uma)))),Tor,Ame); (((Uar,(Uth,Uam)),((Hma,Mur),Uma)),Tor,Ame); (((Hma,Mur),((Uar,Uma),(Uth,Uam))),Tor,Ame); (((Uth,(Uma,(Hma,Mur))),(Uar,Uam)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((Uam,((Uth,Mur),((Uar,Uma),Hma))),Tor,Ame); ((Uam,(Uma,((Hma,(Uth,Mur)),Uar))),Tor,Ame); (((Mur,Hma),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); ((((Uam,Mur),Uth),(Hma,(Uar,Uma))),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((Mur,((Uam,(Uar,Uma)),Uth)),Hma),Tor,Ame); ((Uam,(Uar,(Uma,((Hma,Mur),Uth)))),Tor,Ame); (((Uth,Uam),(Uar,((Hma,Mur),Uma))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uma,(Hma,Mur)),((Uth,Uam),Uar)),Tor,Ame); ((((Uma,(Hma,(Uth,Mur))),Uar),Uam),Tor,Ame); ((((Uth,(Mur,Hma)),(Uar,Uma)),Uam),Tor,Ame); ((Uam,(((Hma,(Uth,Mur)),Uma),Uar)),Tor,Ame); ((Hma,((Uma,Uar),((Uth,Mur),Uam))),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((((Hma,Mur),Uth),Uam),(Uar,Uma)),Tor,Ame); ((Uam,(((Hma,(Mur,Uth)),Uar),Uma)),Tor,Ame); (((Hma,Mur),(Uma,(Uth,(Uar,Uam)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Uma,Uar),(((Uth,Hma),Mur),Uam)),Tor,Ame); (((Mur,(Hma,(Uma,Uar))),(Uth,Uam)),Tor,Ame); (((((Hma,(Mur,Uth)),Uma),Uar),Uam),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); (((Uth,(Uma,(Uar,Uam))),(Hma,Mur)),Tor,Ame); (((Hma,(Uth,Mur)),((Uma,Uar),Uam)),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); (Tor,((Uth,Uam),((Uar,Uma),(Mur,Hma))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,(((Uth,Uam),(Uar,Uma)),(Mur,Hma)),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Ame); (Tor,(Uam,((Uth,(Uar,Uma)),(Mur,Hma))),Ame); (Tor,((Mur,Hma),((Uth,Uam),(Uar,Uma))),Ame); (Tor,(((Mur,Hma),((Uar,Uma),Uth)),Uam),Ame); (Tor,((Mur,Hma),((Uar,Uma),(Uth,Uam))),Ame); (Tor,((Mur,Hma),((Uar,Uma),(Uth,Uam))),Ame); (Tor,(((Uth,Mur),Hma),((Uar,Uma),Uam)),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,(Uam,(((Hma,(Uth,Mur)),Uar),Uma)),Ame); (Tor,((Mur,Hma),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,(Uam,(Uar,(((Mur,Uth),Hma),Uma))),Ame); (Tor,(Uam,((Uth,(Hma,Mur)),(Uma,Uar))),Ame); (Tor,((Uam,(Uth,(Hma,Mur))),(Uma,Uar)),Ame); (Tor,((Hma,(Mur,Uth)),(Uma,(Uam,Uar))),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uma,Uar))),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Ame); (Tor,(((Uma,Uar),((Hma,Mur),Uth)),Uam),Ame); (((Uth,Uam),(Uar,(Uma,(Mur,Hma)))),Tor,Ame); ((((Mur,Hma),Uth),(Uam,(Uar,Uma))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uth,Mur)),(Hma,(Uar,Uma))),Tor,Ame); (((Uth,(Mur,Uam)),(Hma,(Uar,Uma))),Tor,Ame); (((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((Hma,Mur),(((Uar,Uma),Uam),Uth)),Tor,Ame); (((Uar,(((Mur,Uth),Hma),Uma)),Uam),Tor,Ame); ((((Mur,Uth),Hma),(Uma,(Uam,Uar))),Tor,Ame); (((Mur,Hma),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uth,Uam),((Uma,Uar),(Hma,Mur))),Tor,Ame); ((((Mur,Uth),Uam),((Uma,Uar),Hma)),Tor,Ame); (((Uth,Uam),(Uar,((Mur,Hma),Uma))),Tor,Ame); ((Uam,(Uar,(((Uth,Mur),Hma),Uma))),Tor,Ame); ((Uam,(((Uma,Uar),Uth),(Mur,Hma))),Tor,Ame); ((Uam,(((Uma,Uar),Uth),(Mur,Hma))),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((((Hma,(Uma,Uar)),(Mur,Uth)),Uam),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); ((Uam,(Uar,(Uma,(Hma,(Mur,Uth))))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); ((Uam,(Mur,((Uth,Hma),(Uar,Uma)))),Tor,Ame); ((Uam,(Mur,((Uth,Hma),(Uar,Uma)))),Tor,Ame); ((((Uam,Uar),Uma),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),(Hma,Mur)),(Uth,Uam)),Tor,Ame); (((Uth,Uam),((Uma,(Hma,Mur)),Uar)),Tor,Ame); (((Uth,(Mur,Uam)),(Hma,(Uar,Uma))),Tor,Ame); ((Uam,((Mur,Hma),(Uth,(Uma,Uar)))),Tor,Ame); (((Mur,Hma),((Uam,Uth),(Uma,Uar))),Tor,Ame); (((Uam,Uth),(Uar,(Uma,(Mur,Hma)))),Tor,Ame); ((Hma,((Uar,Uma),(Uam,(Mur,Uth)))),Tor,Ame); (((Uar,Uma),(Uam,((Hma,Mur),Uth))),Tor,Ame); (((Uam,Uar),(Uma,(Hma,(Mur,Uth)))),Tor,Ame); ((Uam,((Uar,Uma),(Hma,(Mur,Uth)))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); ((((Uar,Uma),(Hma,Mur)),(Uth,Uam)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (Tor,((Hma,(Uth,Mur)),((Uam,Uar),Uma)),Ame); (Tor,(((Uth,Mur),(Hma,(Uar,Uma))),Uam),Ame); (Tor,((Mur,(Hma,(Uar,Uma))),(Uth,Uam)),Ame); (Tor,((Uth,Uam),((Mur,Hma),(Uar,Uma))),Ame); (Tor,((Mur,(Uth,Uam)),(Hma,(Uar,Uma))),Ame); (Tor,(Uam,((Hma,Mur),((Uar,Uma),Uth))),Ame); (Tor,(Uam,((Hma,Mur),((Uar,Uma),Uth))),Ame); (Tor,((Hma,(Uar,Uma)),((Uth,Mur),Uam)),Ame); (Tor,((Hma,Mur),((Uam,Uth),(Uar,Uma))),Ame); (Tor,((Hma,Mur),((Uam,Uth),(Uar,Uma))),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,(Uam,((Uar,Uma),(Uth,(Hma,Mur)))),Ame); (Tor,((Uar,Uma),((Uth,(Hma,Mur)),Uam)),Ame); (Tor,((((Uar,Uma),Uth),(Hma,Mur)),Uam),Ame); (Tor,((Hma,(Mur,Uth)),((Uar,Uma),Uam)),Ame); (Tor,((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,Mur),((Uar,Uma),(Uth,Uam))),Ame); (Tor,(((Hma,Mur),((Uar,Uma),Uth)),Uam),Ame); (Tor,((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Ame); (((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Tor,Ame); (((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Tor,Ame); ((Uam,((Uth,Mur),((Uma,Uar),Hma))),Tor,Ame); (((Hma,Mur),((Uma,Uar),(Uth,Uam))),Tor,Ame); (((Uth,Uam),((Hma,Mur),(Uma,Uar))),Tor,Ame); (((Uth,(Mur,Uam)),(Hma,(Uma,Uar))),Tor,Ame); (((Mur,Hma),((Uma,Uar),(Uth,Uam))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Mur,Hma),((Uth,Uam),(Uma,Uar))),Tor,Ame); ((Hma,(((Uam,Uth),Mur),(Uma,Uar))),Tor,Ame); (((Uth,Mur),((Uma,(Uam,Uar)),Hma)),Tor,Ame); ((Hma,((Uth,(Uam,Mur)),(Uma,Uar))),Tor,Ame); (((Mur,Hma),(Uam,((Uma,Uar),Uth))),Tor,Ame); (((Mur,((Uma,Uar),Hma)),(Uam,Uth)),Tor,Ame); ((((Uma,(Uam,Uar)),Uth),(Hma,Mur)),Tor,Ame); (((Mur,(Uth,Uam)),((Uar,Uma),Hma)),Tor,Ame); (((Uma,(Uam,Uar)),(Hma,(Uth,Mur))),Tor,Ame); ((((Uam,Uth),Mur),((Uma,Uar),Hma)),Tor,Ame); ((((Uam,Uth),Mur),((Uma,Uar),Hma)),Tor,Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,(Uam,((Uth,Mur),((Uar,Uma),Hma))),Ame); (Tor,((Uar,Uma),(Uam,(Uth,(Hma,Mur)))),Ame); (Tor,((Mur,Hma),((Uar,Uma),(Uam,Uth))),Ame); (Tor,((Mur,Hma),((Uar,Uma),(Uam,Uth))),Ame); (Tor,((Mur,(Uam,Uth)),(Hma,(Uar,Uma))),Ame); (Tor,((Uam,(Uth,Mur)),(Hma,(Uar,Uma))),Ame); (Tor,((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Ame); (Tor,(Uam,((Hma,Mur),(Uth,(Uar,Uma)))),Ame); (Tor,((Uar,(Hma,Uma)),(Uth,(Uam,Mur))),Ame); (Tor,((Uam,(Mur,Uth)),(Hma,(Uar,Uma))),Ame); (Tor,(Uam,((Hma,(Mur,Uth)),(Uar,Uma))),Ame); (Tor,((Hma,(Mur,Uth)),((Uar,Uma),Uam)),Ame); (Tor,(Hma,(Mur,(((Uar,Uma),Uam),Uth))),Ame); (Tor,(Uam,(Uar,((Hma,(Mur,Uth)),Uma))),Ame); (Tor,(Uam,(Uar,((Hma,(Mur,Uth)),Uma))),Ame); (Tor,(((Uth,(Hma,Mur)),Uma),(Uam,Uar)),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uma,Uar))),Ame); (Tor,(((Uam,(Uth,Mur)),Hma),(Uma,Uar)),Ame); (((Uma,(Uth,(Hma,Mur))),(Uam,Uar)),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uar,Uma))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); ((Uam,(Uar,(((Uth,Mur),Hma),Uma))),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Tor,Ame); (((Uam,Uth),(Uar,((Hma,Mur),Uma))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Tor,Ame); ((Uam,(Uar,(Uma,((Uth,Mur),Hma)))),Tor,Ame); ((Uam,(Uar,(Uma,((Uth,Mur),Hma)))),Tor,Ame); (((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Tor,Ame); (((Uam,(Mur,Uth)),((Uma,Uar),Hma)),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uma,Uar))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,Uam),((Uma,Uar),(Hma,Mur))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); ((Uam,(((Hma,(Mur,Uth)),Uma),Uar)),Tor,Ame); ((((Uma,Uar),Hma),((Uth,Uam),Mur)),Tor,Ame); ((((Hma,Mur),((Uma,Uar),Uth)),Uam),Tor,Ame); (((Hma,Mur),((Uma,Uar),(Uth,Uam))),Tor,Ame); (((Hma,((Uma,Uar),(Mur,Uth))),Uam),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Tor,Ame); ((((Uma,Uar),Uam),((Mur,Hma),Uth)),Tor,Ame); ((((Uma,Uar),(Uth,Uam)),(Mur,Hma)),Tor,Ame); (((Mur,Hma),(((Uma,Uar),Uam),Uth)),Tor,Ame); ((((Mur,Hma),((Uma,Uar),Uth)),Uam),Tor,Ame); (((Mur,Hma),((Uma,Uar),(Uth,Uam))),Tor,Ame); (((Mur,Hma),((Uma,Uar),(Uth,Uam))),Tor,Ame); (((Uth,(Mur,Hma)),((Uma,Uar),Uam)),Tor,Ame); (((Uma,Uar),(Uam,(Uth,(Mur,Hma)))),Tor,Ame); (((Hma,(Uth,Mur)),((Uma,Uar),Uam)),Tor,Ame); (((Uth,Uam),((Uar,Uma),(Hma,Mur))),Tor,Ame); (((Uth,Uam),((Uar,Uma),(Hma,Mur))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((Uam,(Uar,(Uma,(Uth,(Mur,Hma))))),Tor,Ame); (((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Tor,Ame); (((Uma,(Uam,Uar)),((Uth,Mur),Hma)),Tor,Ame); (((Uth,Mur),(Hma,(Uma,(Uam,Uar)))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (Tor,(Uam,(Uar,(Uma,(Hma,(Uth,Mur))))),Ame); (Tor,((Hma,((Uth,Mur),Uma)),(Uam,Uar)),Ame); (Tor,(Uam,(((Hma,(Uma,Uar)),Mur),Uth)),Ame); (Tor,(((Uma,Uar),(Mur,Hma)),(Uth,Uam)),Ame); (Tor,((Uth,(Mur,Hma)),(Uam,(Uma,Uar))),Ame); (Tor,(((Uma,Uar),(Mur,Hma)),(Uam,Uth)),Ame); (Tor,(((Uma,Uar),Hma),(Mur,(Uam,Uth))),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Hma,Mur)),Ame); (Tor,((Uam,(Uth,Mur)),((Uma,Uar),Hma)),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); ((((Uar,Uma),((Hma,Mur),Uth)),Uam),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); ((Uam,((Uar,Uma),(Hma,(Uth,Mur)))),Tor,Ame); ((((Uam,Uar),Uma),(Hma,(Uth,Mur))),Tor,Ame); (((Mur,Hma),((Uam,(Uar,Uma)),Uth)),Tor,Ame); (((Hma,(Uam,(Uar,Uma))),(Uth,Mur)),Tor,Ame); ((((Uth,(Mur,Uam)),(Uar,Uma)),Hma),Tor,Ame); ((((Uar,Uma),(Hma,Mur)),(Uam,Uth)),Tor,Ame); ((((Uar,Uma),Hma),((Mur,Uam),Uth)),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Uar,(Uma,(Hma,(Uth,Mur)))),Uam),Tor,Ame); (((Mur,Hma),(((Uar,Uma),Uam),Uth)),Tor,Ame); (((Mur,Hma),((Uar,Uma),(Uam,Uth))),Tor,Ame); (((Mur,Hma),((Uar,Uma),(Uam,Uth))),Tor,Ame); (((Uar,((Mur,Hma),Uma)),(Uam,Uth)),Tor,Ame); ((((Mur,Hma),Uma),((Uam,Uar),Uth)),Tor,Ame); (((Uth,((Uma,Uar),Uam)),(Hma,Mur)),Tor,Ame); ((((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Tor,Ame); (((Uar,Uam),(Uma,(Uth,(Hma,Mur)))),Tor,Ame); ((((Uam,Uth),(Uar,Uma)),(Hma,Mur)),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); ((((Uth,Mur),Hma),((Uar,Uma),Uam)),Tor,Ame); ((((Uth,Mur),Hma),((Uar,Uma),Uam)),Tor,Ame); (((Uth,((Uar,Uma),Uam)),(Mur,Hma)),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,Mur),((Uma,(Uam,Uar)),Uth)),Tor,Ame); phangorn/inst/extdata/trees/RAxML_bipartitionsBranchLabels.3moles0000644000176200001440000000055613475602650024734 0ustar liggesusers(Ame:0.24240784786309346743,(((Hma:0.03262045163347984666,Mur:0.03886458455630492637):0.00225499947410235475[36],Uth:0.02580682933153511174):0.00059392541543651757[30],(Uam:0.02931596331419318927,(Uar:0.00602522464221224522,Uma:0.00593640374580924231):0.02934241311799383120[100]):0.00269684120306867619[60]):0.06379221863907107160[100],Tor:0.09747395533792581335); phangorn/inst/extdata/trees/RAxML_bestTree.YCh0000644000176200001440000000053413475602650021016 0ustar liggesusers((((Mur:0.00215666997155560154,Uth:0.00192023592185219349):0.00016696946772137622,Hma:0.00368686670740361357):0.00018687639400160564,(Uam:0.00135720565202207934,(Uma:0.00118651800822575332,Uar:0.00101739764390293918):0.00033775695210929856):0.00157503466397103213):0.00634369057289599098,Tor:0.00989995418842323435,Ame:0.02707461606876413254):0.0; phangorn/inst/extdata/trees/RAxML_bipartitionsBranchLabels.mtG0000644000176200001440000000055713475602650024262 0ustar liggesusers(Ame:0.42623829669506568818,(Mur:0.07919097361296209558,((Uar:0.01286960617186264609,Uma:0.01148014536527527073):0.05944338095871280064[100],((Uam:0.06376626308156593814,Uth:0.05419104627017570786):0.00666893477206217944[92],Hma:0.06896198930015005890):0.00974981555038798714[100]):0.00145717534115081442[66]):0.13909717574901725445[100],Tor:0.19825987246617926552); phangorn/inst/extdata/trees/RAxML_bestTree.AIs0000644000176200001440000000053413475602650021007 0ustar liggesusers(((Hma:0.00312706379726812329,(Uth:0.00121026052477198292,Mur:0.00312046250563168155):0.00087036069658183684):0.00122506270256386740,((Uar:0.00052373856518729458,Uma:0.00247018618187345041):0.00167792487939210548,Uam:0.00184159984063642979):0.00107249327886021345):0.00382497683824970002,Tor:0.00848622429823414105,Ame:0.02681059329595153473):0.0; phangorn/inst/extdata/trees/RAxML_bipartitions.woodmouse0000644000176200001440000000142213475602650023303 0ustar liggesusers(No305:0.00622878382196208596,(((No1007S:0.00000170671604060440,(No0909S:0.00108390188878723214,No1208S:0.00108436668237289475)52:0.00108405665369984980)99:0.00776063902846151413,(No0912S:0.00328637227135690751,No1103S:0.00109428209179901806)77:0.00000170671604060440)74:0.00223367776102044056,((No0908S:0.00552992494657482316,(No1206S:0.00557570157809361960,((No1202S:0.00108229934579785574,No0910S:0.00222680065047513396)95:0.00225951139716124754,No0906S:0.00571167759421415972)73:0.00108738027363135628)52:0.00108364136649804653)49:0.00000170671604060440,(No306:0.00000170671604060440,(No0913S:0.00331906405569605848,No304:0.00275623272441480370)81:0.00275326022717664034)76:0.00218358914928350797)74:0.00218629437313406583)88:0.00379919491759181556,No1114S:0.01098665288440475382); phangorn/inst/extdata/trees/RAxML_bestTree.mtG0000644000176200001440000000053413475602650021062 0ustar liggesusers((Mur:0.07919097361296209558,((Uar:0.01286960617186264609,Uma:0.01148014536527527073):0.05944338095871280064,((Uam:0.06376626308156593814,Uth:0.05419104627017570786):0.00666893477206217944,Hma:0.06896198930015005890):0.00974981555038798714):0.00145717534115081442):0.13909717574901725445,Tor:0.19825987246617926552,Ame:0.42623829669506568818):0.0; phangorn/inst/extdata/trees/RAxML_bipartitionsBranchLabels.YCh0000644000176200001440000000055613475602650024215 0ustar liggesusers(Ame:0.02707461606876413254,(((Mur:0.00215666997155560154,Uth:0.00192023592185219349):0.00016696946772137622[63],Hma:0.00368686670740361357):0.00018687639400160564[81],(Uam:0.00135720565202207934,(Uma:0.00118651800822575332,Uar:0.00101739764390293918):0.00033775695210929856[94]):0.00157503466397103213[100]):0.00634369057289599098[100],Tor:0.00989995418842323435); phangorn/inst/extdata/trees/RAxML_bipartitions.YCh0000644000176200001440000000054413475602650021751 0ustar liggesusers(Ame:0.02707461606876413254,(((Mur:0.00215666997155560154,Uth:0.00192023592185219349)63:0.00016696946772137622,Hma:0.00368686670740361357)81:0.00018687639400160564,(Uam:0.00135720565202207934,(Uma:0.00118651800822575332,Uar:0.00101739764390293918)94:0.00033775695210929856)100:0.00157503466397103213)100:0.00634369057289599098,Tor:0.00989995418842323435); phangorn/inst/extdata/trees/RAxML_bipartitions.mtG0000644000176200001440000000054513475602650022016 0ustar liggesusers(Ame:0.42623829669506568818,(Mur:0.07919097361296209558,((Uar:0.01286960617186264609,Uma:0.01148014536527527073)100:0.05944338095871280064,((Uam:0.06376626308156593814,Uth:0.05419104627017570786)92:0.00666893477206217944,Hma:0.06896198930015005890)100:0.00974981555038798714)66:0.00145717534115081442)100:0.13909717574901725445,Tor:0.19825987246617926552); phangorn/inst/extdata/trees/woodmouse.mrbayes.nex.run2.t0000644000176200001440000025045013475602650023162 0ustar liggesusers#NEXUS [ID: 2542150086] begin trees; translate 1 No305, 2 No304, 3 No306, 4 No0906S, 5 No0908S, 6 No0909S, 7 No0910S, 8 No0912S, 9 No0913S, 10 No1103S, 11 No1007S, 12 No1114S, 13 No1202S, 14 No1206S, 15 No1208S; tree rep.1 = ((((3,(((4,(8,(15,5))),2),((14,11),12))),(9,13)),7),(10,6),1); tree rep.10000 = (12,(((8,((15,6),11)),10),((((2,9),3),(14,((7,13),4))),5)),1); tree rep.20000 = (12,((8,((6,(11,15)),10)),(((14,((13,7),5)),4),((9,2),3))),1); tree rep.30000 = (12,(((3,(9,2)),(5,((14,4),(7,13)))),((8,10),((6,15),11))),1); tree rep.40000 = ((((12,5),((2,9),3)),(14,((7,13),4))),((8,((11,15),6)),10),1); tree rep.50000 = (((((11,(6,15)),(8,10)),((4,((13,7),14)),5)),((2,9),3)),12,1); tree rep.60000 = ((10,(8,(((4,(((9,2),3),((7,13),14))),5),(11,(15,6))))),12,1); tree rep.70000 = (12,((10,(((11,15),6),8)),((((13,7),4),(5,14)),((9,2),3))),1); tree rep.80000 = (12,(((3,(9,2)),(((7,13),4),(14,5))),((8,(11,(15,6))),10)),1); tree rep.90000 = (((((((13,7),4),5),((2,9),3)),14),((10,8),((11,15),6))),12,1); tree rep.100000 = (12,((10,8),(((9,2),((13,7),4)),(((5,14),(6,(11,15))),3))),1); tree rep.110000 = (12,((((7,13),4),(14,(5,((9,2),3)))),(10,(8,(11,(6,15))))),1); tree rep.120000 = (((10,(8,((6,15),11))),((5,(3,(2,9))),(14,(4,(13,7))))),12,1); tree rep.130000 = (((((4,((7,13),14)),5),(3,(2,9))),(8,(10,((15,6),11)))),12,1); tree rep.140000 = ((((10,8),((15,11),6)),((((7,13),(4,14)),5),(3,(2,9)))),12,1); tree rep.150000 = ((((5,(((9,2),3),14)),((7,13),4)),12),((8,10),((15,11),6)),1); tree rep.160000 = (((((11,(6,15)),10),8),((5,(((7,13),4),14)),((9,2),3))),12,1); tree rep.170000 = (12,((((10,8),((15,6),11)),4),((((9,2),3),5),(14,(7,13)))),1); tree rep.180000 = ((((3,(9,2)),(5,(4,(14,(13,7))))),((8,((15,11),6)),10)),12,1); tree rep.190000 = (12,(((((9,2),3),5),((14,4),(13,7))),((((6,15),11),8),10)),1); tree rep.200000 = (12,((14,((5,(7,13)),(((((11,6),15),10),8),4))),((9,2),3)),1); tree rep.210000 = ((((5,(3,(9,2))),(((13,4),7),14)),((8,10),((15,11),6))),12,1); tree rep.220000 = (12,(((((13,7),14),4),5),(((9,2),3),((11,(6,15)),(8,10)))),1); tree rep.230000 = (12,(((6,15),11),(((5,((13,(4,7)),(3,(9,2)))),14),(8,10))),1); tree rep.240000 = ((((13,7),(((11,(6,15)),(8,10)),((5,4),14))),((2,9),3)),12,1); tree rep.250000 = (((4,(13,7)),((5,14),((2,9),3))),(((10,8),((11,15),6)),12),1); tree rep.260000 = ((((((4,(13,7)),14),(3,(2,9))),5),(8,(((15,11),6),10))),12,1); tree rep.270000 = (12,((8,(10,((11,15),6))),(3,((13,7),(((9,2),5),(4,14))))),1); tree rep.280000 = (((((9,2),3),(5,((7,13),(14,4)))),(((11,15),6),(8,10))),12,1); tree rep.290000 = ((((((7,13),14),4),((3,(2,9)),5)),((10,8),(11,(15,6)))),12,1); tree rep.300000 = ((((((8,(6,(11,15))),10),5),((9,2),3)),(((13,7),14),4)),12,1); tree rep.310000 = (12,(((((2,9),3),5),(((13,7),14),4)),(8,((11,(15,6)),10))),1); tree rep.320000 = (12,((10,((6,(15,11)),8)),((5,((4,(13,7)),14)),((2,9),3))),1); tree rep.330000 = (12,(((8,10),((6,15),11)),(((13,7),(4,(5,14))),((2,9),3))),1); tree rep.340000 = ((((((11,15),6),((((2,9),3),5),(4,((13,7),14)))),10),8),12,1); tree rep.350000 = (12,((8,(((15,6),11),10)),((((9,2),3),5),(14,(4,(7,13))))),1); tree rep.360000 = ((((((11,15),6),8),10),((5,((9,2),3)),((7,13),(14,4)))),12,1); tree rep.370000 = ((((((11,15),6),(8,10)),(3,(5,(9,2)))),((4,(7,13)),14)),12,1); tree rep.380000 = ((((((14,(7,13)),4),(3,(9,2))),5),(((6,15),11),(10,8))),12,1); tree rep.390000 = (12,((14,((((9,2),3),((13,7),4)),5)),(((11,(6,15)),8),10)),1); tree rep.400000 = (12,((5,((14,((7,13),4)),(3,(9,2)))),(10,((6,(15,11)),8))),1); tree rep.410000 = (((10,((6,(15,11)),8)),(((3,(9,2)),5),(((7,13),14),4))),12,1); tree rep.420000 = (12,((5,((7,13),((14,4),((9,2),3)))),((11,(15,6)),(10,8))),1); tree rep.430000 = ((((7,13),5),((((9,2),3),4),14)),((10,(8,(6,(11,15)))),12),1); tree rep.440000 = (12,(((4,(14,(13,7))),(5,(3,(9,2)))),((8,((15,11),6)),10)),1); tree rep.450000 = (((((9,2),3),((((7,13),4),14),5)),((8,10),((11,15),6))),12,1); tree rep.460000 = (12,((((15,11),6),(10,8)),((4,((9,2),((3,5),(13,7)))),14)),1); tree rep.470000 = (12,((8,((6,(11,15)),10)),(5,((3,(9,2)),((7,(13,4)),14)))),1); tree rep.480000 = (12,(((5,((9,2),3)),((11,(15,6)),(8,10))),(((7,13),14),4)),1); tree rep.490000 = (12,(((((13,7),4),(5,14)),(3,(9,2))),(((6,15),11),(8,10))),1); tree rep.500000 = (((((13,7),4),(14,5)),(12,((9,2),3))),((8,((11,15),6)),10),1); tree rep.510000 = ((((8,10),(6,(15,11))),((7,13),(((9,2),3),(5,(14,4))))),12,1); tree rep.520000 = (12,((((((9,2),3),((5,14),(13,(7,4)))),(6,(15,11))),8),10),1); tree rep.530000 = (12,((5,(((2,9),3),((13,7),(4,14)))),((10,8),(11,(6,15)))),1); tree rep.540000 = ((((((15,6),11),8),10),((((7,13),4),(14,5)),(3,(2,9)))),12,1); tree rep.550000 = ((((12,(9,2)),(4,(13,7))),((14,5),3)),(((15,6),11),(10,8)),1); tree rep.560000 = (12,((((7,13),((9,2),3)),(4,(14,5))),((10,8),((6,15),11))),1); tree rep.570000 = (12,((((5,14),(4,(7,13))),((2,9),3)),((6,(15,11)),(8,10))),1); tree rep.580000 = (12,(((8,10),((6,15),11)),(((13,4),7),(((2,9),3),(14,5)))),1); tree rep.590000 = ((5,(3,(9,2))),((12,(10,(8,(6,(11,15))))),((4,14),(7,13))),1); tree rep.600000 = (12,(((8,(15,(6,11))),10),(((9,2),3),(((7,13),(5,14)),4))),1); tree rep.610000 = (12,(((3,(2,9)),(5,((4,7),(14,13)))),(8,(((15,6),11),10))),1); tree rep.620000 = (((((6,(11,15)),8),10),(((14,((7,13),4)),5),((2,9),3))),12,1); tree rep.630000 = (((((2,9),3),(5,(14,((7,13),4)))),(((11,(15,6)),10),8)),12,1); tree rep.640000 = (12,(((((9,2),3),(13,(7,4))),(14,5)),(10,(8,((6,15),11)))),1); tree rep.650000 = (12,((8,(((15,11),6),10)),(((3,(9,2)),(4,(7,13))),(14,5))),1); tree rep.660000 = ((((3,(2,9)),(((13,(7,4)),14),5)),(((15,11),6),(8,10))),12,1); tree rep.670000 = ((((11,(15,6)),(8,10)),(((14,(7,13)),4),(5,(3,(2,9))))),12,1); tree rep.680000 = (((((11,15),6),(8,10)),(((4,(14,(7,13))),5),(3,(9,2)))),12,1); tree rep.690000 = (12,(((8,10),((11,6),15)),((3,(9,2)),((14,4),(5,(7,13))))),1); tree rep.700000 = (((((5,(7,13)),14),(((2,9),3),4)),((6,(11,15)),(8,10))),12,1); tree rep.710000 = (12,(((10,8),(11,(6,15))),((((14,(7,13)),4),(3,(9,2))),5)),1); tree rep.720000 = (12,((5,((3,(9,2)),((4,14),(7,13)))),(8,(10,(11,(6,15))))),1); tree rep.730000 = ((((13,7),((3,(9,2)),(((15,6),11),(10,8)))),((14,5),4)),12,1); tree rep.740000 = (12,((8,(10,((15,6),11))),((3,(9,2)),(4,((7,13),(14,5))))),1); tree rep.750000 = (((5,((((8,10),((11,15),6)),12),((2,9),3))),((7,13),4)),14,1); tree rep.760000 = (12,(((14,4),5),((((8,10),(11,(6,15))),(3,(2,9))),(13,7))),1); tree rep.770000 = ((((14,(7,13)),4),(((((11,6),15),(8,10)),((2,9),3)),5)),12,1); tree rep.780000 = (((((3,(2,9)),((8,10),((11,15),6))),(14,5)),(4,(13,7))),12,1); tree rep.790000 = (((((4,(13,7)),14),(5,(3,(9,2)))),((10,8),(6,(11,15)))),12,1); tree rep.800000 = (12,(8,((10,(((14,(4,(7,13))),5),((9,2),3))),(11,(6,15)))),1); tree rep.810000 = (12,(((10,((6,15),11)),8),(14,(((4,(13,7)),(3,(2,9))),5))),1); tree rep.820000 = ((((5,(14,((13,7),4))),(3,(2,9))),((10,8),(11,(15,6)))),12,1); tree rep.830000 = ((4,(13,7)),((14,((((2,9),12),3),(((6,15),11),(8,10)))),5),1); tree rep.840000 = ((((10,8),(6,(11,15))),((14,((7,13),4)),(5,(3,(2,9))))),12,1); tree rep.850000 = (((8,(10,((15,11),6))),((((9,2),3),14),(((13,7),4),5))),12,1); tree rep.860000 = (12,((((6,(11,15)),8),10),((4,(7,13)),((14,5),((9,2),3)))),1); tree rep.870000 = (12,(((4,(7,13)),(((9,2),3),(14,5))),(8,(((15,6),11),10))),1); tree rep.880000 = (12,(((3,(9,2)),(((4,13),7),(5,14))),((((11,6),15),8),10)),1); tree rep.890000 = (((2,9),((5,(((13,7),14),4)),3)),(12,((11,(15,6)),(10,8))),1); tree rep.900000 = (12,(8,((((3,(9,2)),(5,((4,(13,7)),14))),((15,11),6)),10)),1); tree rep.910000 = ((12,5),(((((7,13),4),((((15,11),6),8),10)),((2,9),3)),14),1); tree rep.920000 = (((((9,2),3),((14,(4,(13,7))),5)),((11,(6,15)),(8,10))),12,1); tree rep.930000 = (((8,((6,(15,11)),10)),(((14,(5,4)),(7,13)),((9,2),3))),12,1); tree rep.940000 = ((((10,8),((15,11),6)),((7,13),(14,(((2,(9,3)),4),5)))),12,1); tree rep.950000 = (((5,(3,(2,9))),(14,((4,7),13))),(12,(8,(10,(6,(15,11))))),1); tree rep.960000 = (((((((6,15),11),8),10),5),(4,((3,(9,2)),(14,(13,7))))),12,1); tree rep.970000 = ((((10,((11,15),6)),8),(((3,(2,9)),((14,4),(7,13))),5)),12,1); tree rep.980000 = (12,((3,(2,9)),((((8,((15,11),6)),10),5),((4,(13,7)),14))),1); tree rep.990000 = (12,(((14,((7,13),4)),(((9,2),3),5)),((10,((6,15),11)),8)),1); tree rep.1000000 = ((((6,(11,15)),8),(10,((((9,2),3),((7,13),4)),(14,5)))),12,1); tree rep.1010000 = ((((10,(11,(15,6))),8),(5,(((2,9),3),(((13,7),4),14)))),12,1); tree rep.1020000 = ((((10,(11,(6,15))),8),((5,(14,(4,(13,7)))),((9,2),3))),12,1); tree rep.1030000 = ((((5,(4,(3,(9,2)))),(14,(7,13))),(8,((11,(15,6)),10))),12,1); tree rep.1040000 = ((((((11,15),6),8),10),(4,((14,(5,(3,(9,2)))),(13,7)))),12,1); tree rep.1050000 = (12,((5,(14,4)),((((9,2),3),(13,7)),(10,(8,((11,6),15))))),1); tree rep.1060000 = (((((4,(7,13)),(5,14)),(3,(9,2))),((10,8),((15,6),11))),12,1); tree rep.1070000 = ((((10,(11,(15,6))),8),((((9,2),14),((13,5),7)),(4,3))),12,1); tree rep.1080000 = ((((10,8),(11,(15,6))),(((2,3),5),(14,((9,4),(13,7))))),12,1); tree rep.1090000 = (12,((8,(((6,11),15),10)),(((4,5),(14,(13,7))),(3,(2,9)))),1); tree rep.1100000 = (((11,(6,15)),((4,(((7,13),(14,5)),(3,(9,2)))),(8,10))),12,1); tree rep.1110000 = ((((((4,13),7),14),5),(3,(9,2))),(12,(10,(8,(6,(15,11))))),1); tree rep.1120000 = ((((((13,7),14),4),(5,((9,2),3))),((10,(15,(6,11))),8)),12,1); tree rep.1130000 = (12,((10,(8,((15,11),6))),(5,(((9,2),3),(14,(4,(7,13)))))),1); tree rep.1140000 = (12,(((4,((6,(11,15)),(8,10))),14),(((2,9),3),((7,13),5))),1); tree rep.1150000 = (12,((((6,(11,15)),8),10),((5,((2,9),3)),((7,13),(4,14)))),1); tree rep.1160000 = (12,((((3,(2,9)),((7,13),4)),(5,14)),(8,(((15,11),6),10))),1); tree rep.1170000 = ((((3,(2,9)),(((7,13),14),4)),5),((10,8),((11,(6,15)),12)),1); tree rep.1180000 = (((5,14),(((7,13),4),(3,(2,9)))),(12,((8,((15,11),6)),10)),1); tree rep.1190000 = (((7,13),(4,(14,(5,(3,(9,2)))))),((((15,6),11),(10,8)),12),1); tree rep.1200000 = ((((10,(11,(6,15))),8),(((13,7),4),(((9,2),3),(14,5)))),12,1); tree rep.1210000 = ((((8,((6,15),11)),10),(((3,5),(2,9)),((14,4),(7,13)))),12,1); tree rep.1220000 = (((((15,(6,11)),8),10),(((5,((9,2),3)),14),(4,(13,7)))),12,1); tree rep.1230000 = (12,((4,((((2,9),3),((13,7),14)),5)),((10,(15,(11,6))),8)),1); tree rep.1240000 = (12,(((10,8),(6,(11,15))),((5,((2,9),3)),((13,7),(14,4)))),1); tree rep.1250000 = ((12,(3,(9,2))),(((10,8),((15,6),11)),(5,((14,4),(7,13)))),1); tree rep.1260000 = (((14,(7,13)),(4,(((9,2),3),5))),(12,(10,(((15,6),11),8))),1); tree rep.1270000 = (12,(((15,6),11),(10,(8,((((9,2),3),(14,(4,(13,7)))),5)))),1); tree rep.1280000 = ((((10,8),((15,11),6)),(((5,14),(4,(7,13))),(3,(9,2)))),12,1); tree rep.1290000 = (((14,5),(((3,(2,9)),(((10,8),(11,(15,6))),(7,13))),4)),12,1); tree rep.1300000 = (12,((((10,(6,(15,11))),8),5),(((7,13),(14,4)),(3,(2,9)))),1); tree rep.1310000 = (((((15,11),6),(((7,13),(14,4)),(((9,2),3),5))),(10,8)),12,1); tree rep.1320000 = (12,(((14,5),((4,(7,13)),(3,(9,2)))),((6,(15,11)),(8,10))),1); tree rep.1330000 = ((((3,(2,9)),((13,7),14)),(4,5)),((8,(10,(6,(15,11)))),12),1); tree rep.1340000 = ((((10,8),((6,15),11)),((5,(3,(2,9))),(((13,7),4),14))),12,1); tree rep.1350000 = (((((14,(7,4)),13),(((9,2),3),5)),((10,(11,(6,15))),8)),12,1); tree rep.1360000 = (12,((((15,11),6),(8,10)),((7,13),((4,14),(((2,9),3),5)))),1); tree rep.1370000 = (12,((((5,(14,(13,(7,4)))),3),(2,9)),(10,((15,(11,6)),8))),1); tree rep.1380000 = ((8,((11,(15,6)),10)),((12,(14,((7,13),4))),(5,((2,9),3))),1); tree rep.1390000 = ((((3,(2,9)),(4,((7,13),14))),5),(((((6,15),11),8),10),12),1); tree rep.1400000 = ((((13,7),((5,(2,9)),(4,((10,(6,(11,15))),8)))),(14,3)),12,1); tree rep.1410000 = ((((6,(11,15)),(8,10)),(((3,(9,2)),((14,5),(13,7))),4)),12,1); tree rep.1420000 = (12,((((13,7),4),5),(((((11,15),6),(8,10)),((9,2),3)),14)),1); tree rep.1430000 = (12,(((6,(11,15)),(8,10)),(((13,7),((14,5),4)),(3,(9,2)))),1); tree rep.1440000 = (((((3,(9,2)),5),(14,(4,(13,7)))),(8,(10,((15,6),11)))),12,1); tree rep.1450000 = (12,(((5,(((13,7),4),14)),(3,(9,2))),((8,((15,6),11)),10)),1); tree rep.1460000 = (((11,(6,15)),((10,8),(((5,14),((9,2),3)),((13,7),4)))),12,1); tree rep.1470000 = ((((11,(15,6)),(((14,5),((13,7),4)),(10,8))),12),(3,(9,2)),1); tree rep.1480000 = (((12,(8,(((15,11),6),10))),((2,9),3)),(((4,(7,13)),5),14),1); tree rep.1490000 = (((10,((6,(15,11)),8)),((5,((2,9),3)),(14,((7,13),4)))),12,1); tree rep.1500000 = (12,((5,(14,((3,(9,2)),(13,(4,7))))),((8,(6,(11,15))),10)),1); tree rep.1510000 = (12,(((5,((9,2),3)),(4,((7,13),14))),((10,8),(6,(15,11)))),1); tree rep.1520000 = (12,((((14,(3,(9,2))),(5,((13,7),4))),(10,8)),((15,6),11)),1); tree rep.1530000 = (12,(((8,10),((11,15),6)),(((3,(9,2)),5),(((13,7),4),14))),1); tree rep.1540000 = ((((11,(15,6)),(10,8)),((((13,7),4),(14,5)),(3,(9,2)))),12,1); tree rep.1550000 = (12,((((8,(10,(11,(15,6)))),(5,14)),((3,9),2)),((13,7),4)),1); tree rep.1560000 = (((((3,(2,9)),((13,7),(14,5))),4),((11,(6,15)),(10,8))),12,1); tree rep.1570000 = (12,((6,(15,11)),((10,(4,(((3,(2,9)),(14,(13,7))),5))),8)),1); tree rep.1580000 = (12,((((2,9),3),(5,((14,4),(7,13)))),(10,(((15,6),11),8))),1); tree rep.1590000 = ((((10,8),((11,15),6)),((4,5),((3,(9,2)),((7,13),14)))),12,1); tree rep.1600000 = (12,((10,8),((14,((3,(9,2)),(((13,7),4),5))),((11,15),6))),1); tree rep.1610000 = ((((5,(((13,7),4),14)),((2,9),3)),(10,(8,(6,(15,11))))),12,1); tree rep.1620000 = ((12,((3,(2,9)),(((14,4),5),(7,13)))),(((6,(11,15)),8),10),1); tree rep.1630000 = (12,((4,((14,(5,(7,13))),(3,(2,9)))),((8,10),((15,11),6))),1); tree rep.1640000 = (12,((((10,8),(11,(15,6))),((3,(9,2)),((14,4),(7,13)))),5),1); tree rep.1650000 = (((((6,15),11),(10,8)),(((3,(9,2)),5),((7,13),(14,4)))),12,1); tree rep.1660000 = (((((11,15),6),10),8),(12,(14,(((7,13),(3,(2,9))),(5,4)))),1); tree rep.1670000 = (((((2,9),3),((((13,7),4),14),5)),(((6,15),11),(10,8))),12,1); tree rep.1680000 = (((10,(8,(11,(15,6)))),(5,((((7,13),4),14),(3,(9,2))))),12,1); tree rep.1690000 = ((((3,(9,2)),5),(4,(14,(7,13)))),(12,((11,(15,6)),(8,10))),1); tree rep.1700000 = (((((13,7),(4,14)),((9,2),3)),(12,(((6,15),11),(10,8)))),5,1); tree rep.1710000 = (((((14,((7,13),(5,3))),4),(9,2)),((10,((15,6),11)),8)),12,1); tree rep.1720000 = (12,(((((13,7),4),(5,14)),((9,2),3)),((10,8),((15,11),6))),1); tree rep.1730000 = (((((6,(11,15)),10),8),(((2,9),3),((14,(5,(13,7))),4))),12,1); tree rep.1740000 = (((((9,2),3),(14,5)),((13,7),4)),(((8,10),((11,15),6)),12),1); tree rep.1750000 = (((8,(11,(15,6))),10),(((3,(9,2)),12),(((4,(7,13)),14),5)),1); tree rep.1760000 = (((((13,7),4),(14,((3,(2,9)),5))),12),(8,(10,(6,(15,11)))),1); tree rep.1770000 = (((10,8),(11,(15,6))),(((13,7),4),((5,14),(12,((2,9),3)))),1); tree rep.1780000 = ((12,((5,(14,((13,7),((2,9),3)))),4)),(((6,15),11),(8,10)),1); tree rep.1790000 = (12,((6,(11,15)),(((((9,2),3),4),((13,7),(14,5))),(10,8))),1); tree rep.1800000 = ((((3,((13,7),(14,4))),5),(9,2)),(12,((15,(6,11)),(8,10))),1); tree rep.1810000 = (12,((((15,6),11),(8,10)),(((5,(3,(2,9))),(4,(13,7))),14)),1); tree rep.1820000 = (((((((15,11),6),(10,8)),((9,2),3)),5),(((13,7),4),14)),12,1); tree rep.1830000 = ((((10,8),((6,15),11)),((5,(((13,7),4),14)),(3,(9,2)))),12,1); tree rep.1840000 = (((12,(11,(15,6))),(8,10)),((((9,2),3),(7,13)),((14,4),5)),1); tree rep.1850000 = ((10,((((14,(((7,13),5),4)),((2,9),3)),((6,15),11)),8)),12,1); tree rep.1860000 = (((((4,(13,7)),((2,9),3)),(5,14)),((10,8),((15,6),11))),12,1); tree rep.1870000 = (((10,(8,((6,15),11))),((5,(3,(9,2))),((4,14),(7,13)))),12,1); tree rep.1880000 = (12,((10,(((15,6),11),8)),((7,13),(((4,5),14),((9,2),3)))),1); tree rep.1890000 = ((((3,(2,9)),((14,5),((7,13),4))),12),(10,(((11,15),6),8)),1); tree rep.1900000 = (((8,10),(6,(15,11))),(12,(((3,(2,9)),5),(14,(4,(7,13))))),1); tree rep.1910000 = ((((14,(((13,7),4),(9,2))),(5,3)),(((6,(11,15)),10),8)),12,1); tree rep.1920000 = (12,((3,(9,2)),((((13,7),5),(4,14)),(8,(10,((6,15),11))))),1); tree rep.1930000 = (((((5,(4,(7,13))),14),((9,2),3)),((10,8),(11,(6,15)))),12,1); tree rep.1940000 = (12,((13,(4,(((9,2),3),(7,(14,5))))),((10,8),((15,11),6))),1); tree rep.1950000 = (((8,10),(11,(6,15))),((((((13,7),4),3),((9,2),14)),5),12),1); tree rep.1960000 = ((((14,((13,7),4)),(((2,9),3),5)),((10,8),((6,15),11))),12,1); tree rep.1970000 = ((12,((10,8),(6,(15,11)))),((14,5),(((9,2),3),(4,(7,13)))),1); tree rep.1980000 = (12,(((((15,11),6),8),10),(5,(((9,2),3),((13,7),(4,14))))),1); tree rep.1990000 = (12,(((((2,9),3),(5,(14,(4,(7,13))))),(10,8)),((11,15),6)),1); tree rep.2000000 = (12,((((7,13),3),(14,(((9,2),5),4))),((10,8),((6,11),15))),1); tree rep.2010000 = (12,((((15,6),11),(8,10)),((5,(((4,7),13),14)),(3,(9,2)))),1); tree rep.2020000 = ((14,(((9,2),3),((4,(13,7)),5))),(12,(8,(10,(11,(15,6))))),1); tree rep.2030000 = (((((3,(9,2)),((7,4),13)),(14,5)),((10,8),(11,(15,6)))),12,1); tree rep.2040000 = ((5,((3,(9,2)),((((6,(11,15)),8),10),(((7,13),4),14)))),12,1); tree rep.2050000 = ((12,(5,(((9,2),3),(14,((13,7),4))))),((10,((11,15),6)),8),1); tree rep.2060000 = ((((((11,15),6),8),10),12),((4,((14,5),(7,13))),(3,(9,2))),1); tree rep.2070000 = (((14,(5,(((9,2),3),((7,13),4)))),(((15,6),11),(10,8))),12,1); tree rep.2080000 = (((((9,2),3),(((7,13),4),14)),(5,((8,(11,(15,6))),10))),12,1); tree rep.2090000 = (12,(((11,(6,15)),(10,8)),(((4,14),(13,7)),(((2,9),3),5))),1); tree rep.2100000 = ((((((15,6),11),8),10),((3,(2,9)),((14,(4,(13,7))),5))),12,1); tree rep.2110000 = (12,(((14,(((2,9),3),5)),((7,13),4)),(10,(8,((15,6),11)))),1); tree rep.2120000 = (12,((8,(((15,6),11),10)),((14,(4,(13,7))),(((9,2),3),5))),1); tree rep.2130000 = ((((((15,11),6),8),10),(((5,14),((2,9),3)),(4,(7,13)))),12,1); tree rep.2140000 = (((6,(15,11)),(10,8)),(((5,(3,(2,9))),(14,((13,7),4))),12),1); tree rep.2150000 = (12,(((8,10),((6,15),11)),((5,14),(((2,9),3),(4,(13,7))))),1); tree rep.2160000 = (12,((((9,2),3),((14,(5,4)),(7,13))),(8,(10,(11,(6,15))))),1); tree rep.2170000 = (((11,(15,6)),(10,8)),(((((13,7),(14,4)),(3,(9,2))),5),12),1); tree rep.2180000 = ((((6,(15,11)),(8,10)),(((14,5),(4,(3,(9,2)))),(13,7))),12,1); tree rep.2190000 = (12,((5,((14,((7,13),4)),((2,9),3))),((8,10),((15,6),11))),1); tree rep.2200000 = ((((((14,5),3),4),((13,7),(2,9))),(((15,6),11),(8,10))),12,1); tree rep.2210000 = ((((((((7,13),4),((2,9),3)),(14,5)),((11,15),6)),10),8),12,1); tree rep.2220000 = (((8,((6,(11,15)),10)),(((13,7),4),((14,5),(3,(9,2))))),12,1); tree rep.2230000 = (12,(((8,10),((4,(7,13)),((5,14),((9,2),3)))),(11,(15,6))),1); tree rep.2240000 = (((((5,(7,13)),14),(4,((2,9),3))),(10,((6,(11,15)),8))),12,1); tree rep.2250000 = (((((15,6),11),(10,8)),((5,(3,(9,2))),((7,13),(4,14)))),12,1); tree rep.2260000 = (12,(((5,(14,(7,13))),(4,((2,9),3))),(10,(8,((6,15),11)))),1); tree rep.2270000 = (((((14,(13,7)),(4,5)),((2,9),3)),(8,((11,(6,15)),10))),12,1); tree rep.2280000 = ((((10,((6,15),11)),8),(((14,(7,13)),4),(5,((9,2),3)))),12,1); tree rep.2290000 = ((((8,10),(14,(((9,2),3),(5,((7,13),4))))),12),(11,(15,6)),1); tree rep.2300000 = (((((11,6),15),(8,10)),(((9,2),3),(5,(14,(4,(7,13)))))),12,1); tree rep.2310000 = (12,(5,(((4,(7,13)),14),(((2,9),3),(((15,6),11),(10,8))))),1); tree rep.2320000 = (12,(((4,14),((2,9),3)),(((8,(((6,15),11),10)),(13,7)),5)),1); tree rep.2330000 = ((((10,8),(11,(15,6))),(((14,5),(((7,13),4),(2,9))),3)),12,1); tree rep.2340000 = ((((5,(7,13)),((3,(2,9)),(4,14))),12),(10,(((11,15),6),8)),1); tree rep.2350000 = ((((((9,2),3),((4,14),(7,13))),5),(10,(8,(11,(15,6))))),12,1); tree rep.2360000 = (((5,(((4,(7,13)),14),((9,2),3))),((6,(15,11)),(10,8))),12,1); tree rep.2370000 = (12,((((11,15),6),(8,10)),(((7,13),((4,((9,2),3)),5)),14)),1); tree rep.2380000 = ((8,(10,(15,(6,11)))),(12,((3,(9,2)),(14,((4,(7,13)),5)))),1); tree rep.2390000 = (((((14,5),(3,(9,2))),(4,(7,13))),((10,8),((15,6),11))),12,1); tree rep.2400000 = (12,(((6,(11,15)),(10,8)),(((4,(14,(13,7))),5),((2,9),3))),1); tree rep.2410000 = (((((3,(2,9)),5),((7,13),(14,4))),(((11,(6,15)),8),10)),12,1); tree rep.2420000 = ((5,(((13,7),(14,4)),(3,(9,2)))),(((10,8),(6,(11,15))),12),1); tree rep.2430000 = ((((6,(11,15)),10),8),((5,12),((3,(9,2)),((13,7),(14,4)))),1); tree rep.2440000 = (12,((((8,10),(6,(11,15))),((9,2),3)),((7,13),((5,14),4))),1); tree rep.2450000 = ((12,((8,(10,(6,(15,11)))),(14,((7,13),(4,5))))),((2,9),3),1); tree rep.2460000 = (12,((5,(((13,7),14),((10,8),((6,15),11)))),(((9,2),3),4)),1); tree rep.2470000 = ((((10,8),(6,(15,11))),((4,(13,7)),((3,(9,2)),(5,14)))),12,1); tree rep.2480000 = (12,((((4,(7,13)),((8,10),(6,(15,11)))),((9,2),3)),(5,14)),1); tree rep.2490000 = ((((7,13),(14,(4,(((9,2),3),5)))),(8,((6,(15,11)),10))),12,1); tree rep.2500000 = ((((((9,2),3),((13,7),5)),(14,4)),((10,(6,(15,11))),8)),12,1); tree rep.2510000 = ((12,(((2,(3,9)),5),(((7,13),4),14))),(8,(10,(6,(11,15)))),1); tree rep.2520000 = (12,(((11,(15,6)),(10,8)),((14,(((13,7),4),(3,(2,9)))),5)),1); tree rep.2530000 = ((((11,(15,6)),8),10),(12,(5,(((14,(13,7)),4),((2,9),3)))),1); tree rep.2540000 = ((((11,(6,15)),(8,10)),((5,((9,2),3)),(((13,7),14),4))),12,1); tree rep.2550000 = (12,(((10,8),(6,(11,15))),((5,(14,((7,13),4))),(3,(2,9)))),1); tree rep.2560000 = (12,(((14,(4,(13,7))),((5,3),(9,2))),((6,(11,15)),(10,8))),1); tree rep.2570000 = (((11,(15,6)),(10,8)),(12,((14,5),((4,(7,13)),((2,9),3)))),1); tree rep.2580000 = (12,((((3,(2,9)),5),(4,(14,(7,13)))),(((11,(15,6)),8),10)),1); tree rep.2590000 = (((10,((11,15),6)),8),(((5,(3,(9,2))),((14,4),(13,7))),12),1); tree rep.2600000 = ((((5,((14,((13,7),4)),3)),(2,9)),(((11,(6,15)),8),10)),12,1); tree rep.2610000 = (((8,(((15,6),11),10)),12),(((14,5),(3,(9,2))),(4,(7,13))),1); tree rep.2620000 = (((11,(6,15)),(10,8)),(((((7,13),(14,5)),4),(3,(9,2))),12),1); tree rep.2630000 = (12,(5,((((4,14),(13,7)),((9,2),3)),((8,10),((6,15),11)))),1); tree rep.2640000 = (12,(((5,14),((4,(7,13)),(3,(9,2)))),(10,((6,(11,15)),8))),1); tree rep.2650000 = (12,((5,(((14,(13,7)),4),((9,2),3))),(10,(8,(11,(15,6))))),1); tree rep.2660000 = (12,((7,(((13,14),(5,(3,(9,2)))),4)),(10,(8,((11,15),6)))),1); tree rep.2670000 = ((8,10),((6,(11,15)),(((5,((9,2),3)),(((7,13),14),4)),12)),1); tree rep.2680000 = ((((5,((7,13),((2,9),3))),(4,14)),((15,(11,6)),(8,10))),12,1); tree rep.2690000 = (12,(((10,(6,(15,11))),8),(((((7,13),4),14),5),((9,2),3))),1); tree rep.2700000 = ((((8,10),((6,15),11)),((5,((3,(9,2)),14)),((7,13),4))),12,1); tree rep.2710000 = (((4,((13,7),14)),(((2,9),3),5)),(((10,8),(11,(15,6))),12),1); tree rep.2720000 = (((5,(((4,(13,7)),(3,(2,9))),14)),((8,((15,11),6)),10)),12,1); tree rep.2730000 = (((((13,7),4),(5,(14,(3,(9,2))))),((10,8),((15,11),6))),12,1); tree rep.2740000 = (12,(((8,10),(6,(11,15))),(5,((((7,13),14),4),((9,2),3)))),1); tree rep.2750000 = (((((13,7),(14,4)),((3,(9,2)),5)),((8,((15,6),11)),10)),12,1); tree rep.2760000 = ((((((13,7),(2,9)),3),((4,14),5)),((11,(6,15)),(8,10))),12,1); tree rep.2770000 = ((((14,(3,(2,9))),(5,(4,(13,7)))),((10,8),(11,(15,6)))),12,1); tree rep.2780000 = (12,((((5,14),(((2,9),3),4)),(13,7)),(((11,15),6),(8,10))),1); tree rep.2790000 = (12,(((13,7),4),(((14,5),((2,9),3)),((10,((15,6),11)),8))),1); tree rep.2800000 = ((((8,((6,15),11)),10),((((2,(3,9)),((7,13),14)),4),5)),12,1); tree rep.2810000 = ((((5,(3,(9,2))),(14,(4,(7,13)))),(((11,(6,15)),10),8)),12,1); tree rep.2820000 = (12,(((10,((11,15),6)),8),((4,((13,7),14)),((3,(9,2)),5))),1); tree rep.2830000 = ((12,((11,(6,15)),(8,10))),(((9,2),3),(5,((14,4),(7,13)))),1); tree rep.2840000 = ((10,(8,((11,15),6))),((5,(14,(((7,13),4),(3,(9,2))))),12),1); tree rep.2850000 = (((11,(6,15)),(8,10)),((((9,2),3),((((13,7),4),14),5)),12),1); tree rep.2860000 = ((((15,6),11),(10,8)),(((12,5),(3,(9,2))),(14,((7,13),4))),1); tree rep.2870000 = (12,(((((13,7),4),((2,9),3)),(5,14)),((8,10),(11,(6,15)))),1); tree rep.2880000 = ((((8,10),(15,(6,11))),(((7,13),((3,(2,9)),(4,14))),5)),12,1); tree rep.2890000 = (12,(((10,(6,(15,11))),8),((7,13),(((5,14),((2,9),3)),4))),1); tree rep.2900000 = (12,((5,(3,(9,2))),((8,((6,(11,15)),10)),(((7,13),4),14))),1); tree rep.2910000 = ((((10,((15,6),11)),8),12),((((14,4),(13,7)),((2,9),3)),5),1); tree rep.2920000 = (12,((((6,15),11),(10,8)),((5,(((4,(7,13)),14),3)),(9,2))),1); tree rep.2930000 = (((((9,2),3),(14,(5,(4,(13,7))))),((8,10),(11,(15,6)))),12,1); tree rep.2940000 = (12,(((3,(2,9)),(((13,7),(14,5)),4)),(((11,(6,15)),8),10)),1); tree rep.2950000 = ((((((7,13),14),4),5),(12,((2,9),3))),((8,((11,15),6)),10),1); tree rep.2960000 = (((4,(((13,7),3),((2,9),5))),14),(12,((10,8),((6,15),11))),1); tree rep.2970000 = (12,(((((13,7),(14,5)),4),((9,2),3)),((6,(15,11)),(10,8))),1); tree rep.2980000 = (((10,(8,((14,(5,((7,13),(3,(2,9))))),4))),((11,15),6)),12,1); tree rep.2990000 = (((((6,11),15),(8,10)),(((14,4),(13,7)),((5,3),(2,9)))),12,1); tree rep.3000000 = (12,((5,(((2,9),3),(((15,11),6),(10,8)))),(14,((13,7),4))),1); tree rep.3010000 = ((((((13,7),4),14),((3,(2,9)),5)),((6,(11,15)),(8,10))),12,1); tree rep.3020000 = (12,(((14,5),(((9,2),3),(4,(13,7)))),((11,(6,15)),(8,10))),1); tree rep.3030000 = ((((8,(11,(15,6))),10),(((9,2),3),((5,14),((13,7),4)))),12,1); tree rep.3040000 = ((((8,(6,(15,11))),10),(5,((4,(14,(7,13))),((2,9),3)))),12,1); tree rep.3050000 = (12,((((((13,7),14),4),((2,9),3)),5),((8,10),((15,6),11))),1); tree rep.3060000 = (12,(((10,8),(6,(11,15))),(((7,4),13),((3,(2,9)),(14,5)))),1); tree rep.3070000 = ((((11,(15,6)),10),8),(((3,(2,9)),(((13,7),(14,5)),4)),12),1); tree rep.3080000 = (12,((8,((6,(11,15)),10)),((((13,7),(4,14)),(3,(2,9))),5)),1); tree rep.3090000 = (12,((((3,(2,9)),5),((14,(7,13)),4)),(10,(8,((15,6),11)))),1); tree rep.3100000 = (((((15,6),11),(((2,9),(5,(14,(4,(13,7))))),3)),(10,8)),12,1); tree rep.3110000 = (((10,((11,(15,6)),8)),((3,(2,9)),((14,5),(7,(4,13))))),12,1); tree rep.3120000 = (((((14,4),(13,7)),(((2,9),3),5)),((8,(11,(15,6))),10)),12,1); tree rep.3130000 = ((12,((6,(11,15)),(8,10))),((((2,9),3),(14,(4,(7,13)))),5),1); tree rep.3140000 = (((10,((11,(6,15)),8)),(((4,(14,(7,13))),5),((2,9),3))),12,1); tree rep.3150000 = (((10,8),((((9,2),3),((14,((7,13),4)),5)),((6,15),11))),12,1); tree rep.3160000 = (((10,(((15,11),6),8)),((5,14),((4,(3,(2,9))),(7,13)))),12,1); tree rep.3170000 = ((5,(((((13,7),4),12),(3,(2,9))),14)),((10,8),((15,6),11)),1); tree rep.3180000 = ((((((9,2),3),((4,(14,5)),(13,7))),(6,(11,15))),(8,10)),12,1); tree rep.3190000 = (((((15,11),6),(10,8)),(5,(((9,2),3),(((13,7),4),14)))),12,1); tree rep.3200000 = (((((15,11),6),8),10),(12,(((5,(4,(13,7))),14),(3,(9,2)))),1); tree rep.3210000 = (((((3,(9,2)),(7,13)),(4,(5,14))),((11,(15,6)),(8,10))),12,1); tree rep.3220000 = (((5,((4,(14,(13,7))),((9,2),3))),((10,((15,6),11)),8)),12,1); tree rep.3230000 = ((((((4,(13,7)),14),((9,2),3)),5),((10,8),((15,6),11))),12,1); tree rep.3240000 = ((((5,((3,9),2)),(14,(4,(13,7)))),((10,(11,(15,6))),8)),12,1); tree rep.3250000 = (12,(((15,(11,6)),(10,8)),(4,(((14,5),((9,2),3)),(7,13)))),1); tree rep.3260000 = (12,((8,((11,(6,15)),10)),((((7,13),4),((2,9),3)),(5,14))),1); tree rep.3270000 = (((14,(4,(5,(13,7)))),(((((6,15),11),8),10),(3,(2,9)))),12,1); tree rep.3280000 = (((10,(8,((6,11),15))),12),((4,14),((3,(2,9)),(5,(13,7)))),1); tree rep.3290000 = (((8,10),((15,6),11)),((14,((7,13),(5,(12,(3,(2,9)))))),4),1); tree rep.3300000 = ((((5,((2,9),3)),((4,14),(7,13))),((10,8),((11,15),6))),12,1); tree rep.3310000 = (((10,((6,(15,11)),8)),(5,(((9,2),3),((14,4),(13,7))))),12,1); tree rep.3320000 = ((((((14,(4,13)),7),5),(3,(9,2))),((10,8),(6,(11,15)))),12,1); tree rep.3330000 = (12,((8,(((15,11),6),10)),((14,(7,13)),(4,(5,((9,2),3))))),1); tree rep.3340000 = (12,((3,(9,2)),(5,(((4,(13,7)),14),(10,(((6,11),15),8))))),1); tree rep.3350000 = (12,((10,(((15,11),6),8)),(((9,2),3),((14,5),(4,(7,13))))),1); tree rep.3360000 = (12,(((10,8),(((14,(13,7)),4),(5,(3,(9,2))))),((11,6),15)),1); tree rep.3370000 = ((12,((14,(13,7)),4)),(((9,2),(5,3)),(((11,15),6),(10,8))),1); tree rep.3380000 = ((((4,((14,5),(7,13))),(3,(2,9))),(8,((6,(15,11)),10))),12,1); tree rep.3390000 = ((((3,(2,9)),5),((14,4),(13,7))),((((15,11),6),(10,8)),12),1); tree rep.3400000 = (((10,((11,(6,15)),8)),(((7,13),(14,(5,4))),(3,(9,2)))),12,1); tree rep.3410000 = (12,((((9,2),3),((((13,7),4),14),5)),(10,(((15,11),6),8))),1); tree rep.3420000 = (12,(((((4,(13,7)),((2,9),3)),(((6,15),11),(8,10))),14),5),1); tree rep.3430000 = (12,(((7,13),((4,((3,(2,9)),5)),14)),((10,8),((11,15),6))),1); tree rep.3440000 = (((14,((3,(2,9)),5)),((10,(((11,15),6),8)),(13,7))),(12,4),1); tree rep.3450000 = ((((4,(7,13)),((5,14),((9,2),3))),((15,(11,6)),(10,8))),12,1); tree rep.3460000 = (((((15,6),11),(10,8)),(((3,(9,2)),5),(14,((13,7),4)))),12,1); tree rep.3470000 = ((((9,2),3),(5,((4,14),(7,13)))),((((15,6),11),(10,8)),12),1); tree rep.3480000 = (12,(((8,(11,(6,15))),10),((((9,2),3),(14,5)),(4,(7,13)))),1); tree rep.3490000 = (((5,((3,14),(((7,13),4),(9,2)))),(10,((6,(15,11)),8))),12,1); tree rep.3500000 = (12,((((2,9),3),(5,(((13,7),4),14))),(10,(8,(15,(11,6))))),1); tree rep.3510000 = (12,(((14,5),((4,(7,13)),(3,(9,2)))),(10,(((15,6),11),8))),1); tree rep.3520000 = ((12,(((3,(2,9)),(5,14)),(4,(13,7)))),(((11,(6,15)),8),10),1); tree rep.3530000 = ((((6,(11,15)),(10,8)),(((13,7),4),((2,9),(3,(5,14))))),12,1); tree rep.3540000 = ((((5,(3,(2,9))),((4,(13,7)),14)),((10,8),((6,15),11))),12,1); tree rep.3550000 = (12,((3,(2,9)),((5,14),((4,(13,7)),((10,8),(11,(6,15)))))),1); tree rep.3560000 = (12,((((((9,2),3),(7,13)),5),4),(((8,(15,(11,6))),10),14)),1); tree rep.3570000 = ((((10,8),(11,(6,15))),((5,(14,(4,(13,7)))),(3,(9,2)))),12,1); tree rep.3580000 = (12,((((9,2),3),((5,14),((7,13),4))),(8,(10,(15,(11,6))))),1); tree rep.3590000 = ((((8,(6,(15,11))),10),(((9,2),3),((14,(4,(13,7))),5))),12,1); tree rep.3600000 = (12,(((((4,(7,13)),14),(((6,(15,11)),10),8)),5),((9,2),3)),1); tree rep.3610000 = (((5,((14,(4,(7,13))),(3,(9,2)))),((8,10),(11,(6,15)))),12,1); tree rep.3620000 = (12,((((((7,13),(8,(10,(11,(6,15))))),5),14),4),((9,2),3)),1); tree rep.3630000 = ((12,((6,(11,15)),(10,8))),((5,14),((3,(9,2)),(7,(4,13)))),1); tree rep.3640000 = ((((8,(11,(15,6))),10),((5,((2,9),3)),(((13,7),4),14))),12,1); tree rep.3650000 = (((5,(3,(9,2))),((14,4),(13,7))),(12,(10,((11,(15,6)),8))),1); tree rep.3660000 = ((((4,(7,13)),(5,14)),((9,2),3)),(12,((8,10),((11,15),6))),1); tree rep.3670000 = (12,((((11,(15,6)),8),10),(5,(4,(((9,2),3),((7,13),14))))),1); tree rep.3680000 = ((((((9,2),3),((4,(7,13)),14)),5),(((15,6),11),(10,8))),12,1); tree rep.3690000 = (12,(((8,10),((15,11),6)),((3,(9,2)),((14,((13,7),4)),5))),1); tree rep.3700000 = ((14,(((4,(7,13)),5),((9,2),3))),(12,(8,((6,(15,11)),10))),1); tree rep.3710000 = ((((5,14),(((7,13),4),(3,(2,9)))),12),(8,((11,(15,6)),10)),1); tree rep.3720000 = (12,(((5,((2,9),3)),((7,13),(4,14))),((8,((15,6),11)),10)),1); tree rep.3730000 = (12,(((5,((9,2),3)),((14,(7,13)),4)),((15,(6,11)),(8,10))),1); tree rep.3740000 = (((4,(9,(13,7))),((3,2),((14,5),(((11,15),6),(8,10))))),12,1); tree rep.3750000 = ((((14,5),(((7,13),4),(3,(9,2)))),12),((10,8),((15,6),11)),1); tree rep.3760000 = (((8,10),((5,((9,2),(((4,(7,13)),14),3))),((11,15),6))),12,1); tree rep.3770000 = ((((5,(((13,7),4),(3,(9,2)))),14),((10,((11,15),6)),8)),12,1); tree rep.3780000 = (12,(5,((14,(4,(13,7))),(((11,(15,6)),(8,10)),(3,(2,9))))),1); tree rep.3790000 = (12,((((10,8),((15,6),11)),((3,(9,2)),(14,(13,7)))),(5,4)),1); tree rep.3800000 = (((((11,15),6),(8,10)),(((9,2),3),(14,(((7,13),4),5)))),12,1); tree rep.3810000 = ((((6,(11,15)),(8,10)),(((7,13),(4,((9,2),3))),(5,14))),12,1); tree rep.3820000 = (((((15,6),11),(8,10)),((((13,7),4),14),(5,((9,2),3)))),12,1); tree rep.3830000 = (((((15,6),11),8),10),((5,((9,2),3)),((12,14),(4,(13,7)))),1); tree rep.3840000 = (12,((((13,7),4),(((3,(9,2)),14),5)),((10,(11,(6,15))),8)),1); tree rep.3850000 = (12,(((14,(4,(7,13))),(5,(3,(9,2)))),(10,(((15,6),11),8))),1); tree rep.3860000 = (((4,(13,7)),(((2,9),3),(5,14))),(((8,((11,15),6)),10),12),1); tree rep.3870000 = (12,(((((6,15),11),10),8),((4,((((9,2),3),(7,13)),14)),5)),1); tree rep.3880000 = (((5,((14,(4,(13,7))),(3,(9,2)))),(10,((11,(15,6)),8))),12,1); tree rep.3890000 = (12,(((3,(9,2)),(((4,(7,13)),14),5)),(((11,6),15),(8,10))),1); tree rep.3900000 = (((((9,2),3),((14,(4,(13,7))),5)),(10,(((15,11),6),8))),12,1); tree rep.3910000 = ((((3,(9,2)),((7,13),14)),(5,4)),(((10,(6,(15,11))),8),12),1); tree rep.3920000 = ((((8,10),((11,15),6)),(((4,(7,13)),14),(5,((2,9),3)))),12,1); tree rep.3930000 = (((12,(14,(4,(13,7)))),((3,(2,9)),5)),((10,8),(11,(15,6))),1); tree rep.3940000 = (12,(((4,((14,5),((9,2),3))),(13,7)),(((15,(11,6)),10),8)),1); tree rep.3950000 = (12,(((10,(6,(15,11))),8),(((14,5),(4,(13,7))),((9,2),3))),1); tree rep.3960000 = (12,(((3,(9,2)),((5,14),((7,13),4))),((10,8),((11,15),6))),1); tree rep.3970000 = (((14,((((7,13),4),5),(3,(9,2)))),((8,10),(6,(15,11)))),12,1); tree rep.3980000 = (((5,((((9,2),3),14),((13,7),4))),(10,(8,(11,(6,15))))),12,1); tree rep.3990000 = ((((4,((14,5),(3,(2,9)))),((8,10),((15,11),6))),(7,13)),12,1); tree rep.4000000 = (12,(((((2,9),3),5),(14,(4,(7,13)))),(10,((6,(11,15)),8))),1); tree rep.4010000 = ((((15,6),11),(10,8)),((12,((9,2),3)),((5,14),((13,7),4))),1); tree rep.4020000 = (12,((((15,6),11),(8,10)),(((((2,9),3),(14,5)),4),(7,13))),1); tree rep.4030000 = ((((((9,2),3),((8,10),(11,(15,6)))),(((13,7),4),14)),5),12,1); tree rep.4040000 = (12,(((((11,15),6),10),8),((13,(7,4)),((((9,2),3),14),5))),1); tree rep.4050000 = (((8,(10,((11,15),6))),(5,((4,((2,9),3)),(14,(7,13))))),12,1); tree rep.4060000 = ((((6,(11,15)),(10,8)),(((13,7),14),(((2,9),3),(5,4)))),12,1); tree rep.4070000 = ((((((3,(2,9)),5),((13,7),4)),14),(((15,6),11),(8,10))),12,1); tree rep.4080000 = ((((((2,9),3),5),(14,(4,(13,7)))),12),(((11,(6,15)),8),10),1); tree rep.4090000 = (((((13,(7,4)),(5,14)),(3,(2,9))),(8,(10,((15,11),6)))),12,1); tree rep.4100000 = (((((9,2),3),(5,(14,((7,13),4)))),((6,(11,15)),(10,8))),12,1); tree rep.4110000 = ((((10,8),(11,(6,15))),((3,(9,2)),((4,(14,(13,7))),5))),12,1); tree rep.4120000 = (((((9,2),3),(((4,14),(7,13)),5)),(10,(8,((15,6),11)))),12,1); tree rep.4130000 = ((((10,8),(11,(6,15))),12),((3,5),((9,2),((7,13),(4,14)))),1); tree rep.4140000 = (12,((4,((14,(7,13)),(5,((9,2),3)))),((8,10),((15,11),6))),1); tree rep.4150000 = (((10,(8,((6,15),11))),((5,((14,4),(7,13))),((9,2),3))),12,1); tree rep.4160000 = (12,((5,(((9,2),3),((4,14),(13,7)))),(((6,(15,11)),10),8)),1); tree rep.4170000 = (12,(((((9,2),3),((14,(7,13)),5)),4),(((15,11),6),(8,10))),1); tree rep.4180000 = (12,(((5,(3,(9,2))),((4,14),(7,13))),(10,(((15,6),11),8))),1); tree rep.4190000 = (((((15,6),11),(8,10)),12),((5,(3,(2,9))),((13,7),(4,14))),1); tree rep.4200000 = ((((8,(6,(15,11))),10),(((3,(2,9)),((7,13),(14,4))),5)),12,1); tree rep.4210000 = (((((11,15),6),8),10),((((((13,7),14),4),5),(3,(2,9))),12),1); tree rep.4220000 = ((((7,13),4),(((5,((10,8),((6,15),11))),(3,(2,9))),14)),12,1); tree rep.4230000 = (((((11,15),6),(10,8)),12),(4,((5,((7,14),13)),((2,9),3))),1); tree rep.4240000 = ((((14,((7,13),4)),5),((9,2),3)),(((((11,15),6),8),10),12),1); tree rep.4250000 = (((((15,6),11),(10,8)),(((4,(3,(2,9))),(14,(7,13))),5)),12,1); tree rep.4260000 = ((((3,(2,9)),(4,(14,((13,7),5)))),((10,8),((15,6),11))),12,1); tree rep.4270000 = (5,((((11,(6,15)),(10,8)),(((13,7),4),14)),(12,((9,2),3))),1); tree rep.4280000 = (((10,((15,6),11)),8),(12,((5,(((2,9),3),(4,14))),(7,13))),1); tree rep.4290000 = ((12,(10,8)),(((15,6),11),((5,((14,(13,7)),4)),((9,2),3))),1); tree rep.4300000 = (12,(((((9,(3,2)),4),(7,13)),(14,5)),(10,((15,(6,11)),8))),1); tree rep.4310000 = (12,(((((13,7),4),14),(5,(3,(9,2)))),((10,((15,11),6)),8)),1); tree rep.4320000 = (((10,(8,(6,(15,11)))),(4,(((13,7),((2,9),(14,5))),3))),12,1); tree rep.4330000 = (((10,(((15,6),11),8)),(((13,7),4),((14,5),(3,(9,2))))),12,1); tree rep.4340000 = (((12,(5,(((4,14),(7,13)),(3,(9,2))))),(10,(11,(15,6)))),8,1); tree rep.4350000 = (12,((14,((13,7),4)),((((6,15),11),(10,8)),(((9,2),3),5))),1); tree rep.4360000 = ((((10,8),(6,(15,11))),(((7,(13,14)),4),(5,(3,(2,9))))),12,1); tree rep.4370000 = ((((((2,9),3),((14,4),(13,7))),5),((8,(6,(15,11))),10)),12,1); tree rep.4380000 = (((((9,2),3),(5,((7,13),(4,14)))),(8,(10,(6,(15,11))))),12,1); tree rep.4390000 = (((10,(8,(11,(6,15)))),(((14,(4,(7,13))),(3,(2,9))),5)),12,1); tree rep.4400000 = ((10,((11,(15,6)),8)),(12,(((5,14),(4,(7,13))),(3,(9,2)))),1); tree rep.4410000 = ((((((11,15),6),(10,8)),((((13,7),(9,2)),5),(3,4))),12),14,1); tree rep.4420000 = ((12,(((5,(9,2)),((14,4),(7,13))),3)),((10,8),((15,11),6)),1); tree rep.4430000 = ((((11,(15,6)),(8,10)),(14,(5,((3,(2,9)),(4,(13,7)))))),12,1); tree rep.4440000 = (12,((((7,13),4),((14,5),((2,9),3))),(10,(8,((11,15),6)))),1); tree rep.4450000 = (12,(((((7,13),4),((2,9),3)),(5,14)),((11,(6,15)),(10,8))),1); tree rep.4460000 = (((10,8),((11,(6,15)),12)),((((7,13),4),14),(5,(9,(3,2)))),1); tree rep.4470000 = (12,((((11,15),6),(10,8)),((5,((14,(7,13)),4)),((2,9),3))),1); tree rep.4480000 = (((8,10),((6,15),11)),(12,(((5,14),((7,13),4)),(3,(2,9)))),1); tree rep.4490000 = (((((2,9),3),((8,10),((15,6),11))),((5,(14,4)),(13,7))),12,1); tree rep.4500000 = ((((8,((6,11),15)),10),((14,((((9,2),3),5),(13,7))),4)),12,1); tree rep.4510000 = ((5,(12,((2,9),3))),((((6,15),11),(10,8)),(14,((13,7),4))),1); tree rep.4520000 = (((8,(10,(6,(15,11)))),(((5,((((9,2),13),7),14)),4),3)),12,1); tree rep.4530000 = (((15,6),11),(12,((((((9,2),3),(14,(4,(13,7)))),5),8),10)),1); tree rep.4540000 = (12,((((((((2,9),3),5),((13,7),4)),14),10),8),((6,15),11)),1); tree rep.4550000 = (12,(((((2,9),5),3),((13,7),(14,4))),(((6,15),11),(10,8))),1); tree rep.4560000 = (((((2,9),3),((4,(13,7)),(14,5))),((10,(6,(15,11))),8)),12,1); tree rep.4570000 = ((((10,(8,(6,(15,11)))),((2,9),(3,12))),5),(14,(4,(7,13))),1); tree rep.4580000 = (((((14,((13,7),4)),5),(3,(9,2))),((8,(6,(15,11))),10)),12,1); tree rep.4590000 = (12,(((5,14),((3,(9,2)),((7,13),4))),(((15,6),11),(8,10))),1); tree rep.4600000 = (12,((((3,(2,9)),((13,7),(4,14))),5),((15,(11,6)),(10,8))),1); tree rep.4610000 = ((((7,(13,4)),((8,10),((15,11),6))),((5,((2,9),3)),14)),12,1); tree rep.4620000 = (((10,(((6,11),15),8)),((5,((9,2),3)),((4,14),(7,13)))),12,1); tree rep.4630000 = ((((5,((4,((13,7),(3,(9,2)))),14)),((11,15),6)),(8,10)),12,1); tree rep.4640000 = (((10,8),(6,(15,11))),(5,(14,(((7,13),4),(((9,2),3),12)))),1); tree rep.4650000 = (((7,13),(((((((11,15),6),(8,10)),5),(2,(9,3))),4),14)),12,1); tree rep.4660000 = ((((2,9),3),(((14,(7,(13,4))),5),((6,(15,11)),(8,10)))),12,1); tree rep.4670000 = (12,(((3,(2,9)),(((7,13),4),(5,14))),((10,((15,6),11)),8)),1); tree rep.4680000 = (((((9,2),3),(5,(14,((7,4),13)))),((10,(11,(15,6))),8)),12,1); tree rep.4690000 = (12,(((14,5),(((13,7),4),(3,(2,9)))),((8,((6,15),11)),10)),1); tree rep.4700000 = (12,((10,(((15,11),6),8)),((4,(13,7)),((5,14),((2,9),3)))),1); tree rep.4710000 = (((10,(((6,15),11),8)),12),((3,(2,9)),((((13,4),7),14),5)),1); tree rep.4720000 = (12,(((((4,(7,13)),14),5),((2,9),3)),((6,(11,15)),(10,8))),1); tree rep.4730000 = (12,((8,((11,(15,6)),10)),(5,((3,(9,2)),((4,(13,7)),14)))),1); tree rep.4740000 = (12,(((11,(6,15)),(8,10)),((5,((14,4),(7,13))),(3,(2,9)))),1); tree rep.4750000 = (12,((((2,9),3),(((13,7),4),(5,14))),(((15,11),6),(8,10))),1); tree rep.4760000 = (((((15,6),11),(8,10)),(((14,5),((13,7),4)),(3,(2,9)))),12,1); tree rep.4770000 = (((14,((13,7),4)),(((2,9),3),5)),(12,((10,(6,(15,11))),8)),1); tree rep.4780000 = (((((10,8),(((13,7),4),(5,(11,(6,15))))),14),(3,(9,2))),12,1); tree rep.4790000 = ((((3,(2,9)),((13,7),4)),(14,5)),(12,((10,(6,(15,11))),8)),1); tree rep.4800000 = ((((((3,(9,2)),((7,13),4)),14),5),((10,(11,(15,6))),8)),12,1); tree rep.4810000 = (12,((((11,15),6),(10,8)),((((3,(2,9)),((7,13),4)),14),5)),1); tree rep.4820000 = (12,(((8,(6,(15,11))),10),(((2,9),3),((4,(7,13)),(14,5)))),1); tree rep.4830000 = (12,(5,((((8,10),(11,(6,15))),(14,(13,(7,4)))),((9,2),3))),1); tree rep.4840000 = (((10,(((11,6),15),8)),(((14,5),((7,13),4)),(3,(2,9)))),12,1); tree rep.4850000 = (12,((((4,(13,7)),(14,5)),((9,2),3)),((10,(11,(6,15))),8)),1); tree rep.4860000 = (((((3,(9,2)),5),((14,4),(13,7))),((((6,15),11),8),10)),12,1); tree rep.4870000 = ((((((10,8),((6,11),15)),((9,2),3)),(4,(14,(7,13)))),5),12,1); tree rep.4880000 = ((((8,10),(11,(6,15))),(5,((((4,7),13),14),((2,9),3)))),12,1); tree rep.4890000 = ((((((9,2),14),(3,(5,4))),(7,13)),((10,8),(6,(15,11)))),12,1); tree rep.4900000 = (((10,((15,6),11)),8),(12,((((2,9),(14,(4,(13,7)))),3),5)),1); tree rep.4910000 = ((((((15,11),6),10),8),((4,((7,13),14)),((3,(9,2)),5))),12,1); tree rep.4920000 = (((8,10),((15,11),6)),((((7,13),(14,4)),(((9,2),3),5)),12),1); tree rep.4930000 = (((14,((5,(3,(9,2))),(4,(13,7)))),(10,(((6,15),11),8))),12,1); tree rep.4940000 = (12,((((14,4),(7,13)),((8,10),(6,(11,15)))),(((9,2),3),5)),1); tree rep.4950000 = (12,((((15,6),11),(8,10)),((3,(((4,(7,13)),14),5)),(2,9))),1); tree rep.4960000 = (12,((8,(10,((15,6),11))),(((3,(9,2)),5),(((7,13),4),14))),1); tree rep.4970000 = ((3,(9,2)),(((5,14),((6,(11,15)),(10,8))),((13,7),(12,4))),1); tree rep.4980000 = (12,(((3,(2,9)),(5,(((13,7),14),4))),(((11,15),6),(10,8))),1); tree rep.4990000 = (((((6,11),15),(10,8)),12),((3,(((14,(7,13)),4),(2,9))),5),1); tree rep.5000000 = ((((((2,9),3),((10,8),((15,11),6))),(5,14)),(4,(7,13))),12,1); tree rep.5010000 = (((((((4,(7,13)),14),3),(((11,15),6),(8,10))),(2,9)),5),12,1); tree rep.5020000 = (((((2,9),3),(4,(5,((13,7),14)))),(8,(10,(11,(6,15))))),12,1); tree rep.5030000 = ((((6,(15,11)),(10,8)),((14,5),(((7,13),4),(3,(2,9))))),12,1); tree rep.5040000 = (12,(((((13,7),14),5),(4,(3,(2,9)))),(((11,15),6),(10,8))),1); tree rep.5050000 = ((4,(((3,(2,9)),(7,13)),((5,(8,(10,((15,11),6)))),14))),12,1); tree rep.5060000 = ((((4,(14,(7,13))),(((2,9),3),5)),((8,10),(11,(6,15)))),12,1); tree rep.5070000 = ((((((15,11),6),(10,8)),(3,(9,2))),((13,7),((5,14),4))),12,1); tree rep.5080000 = (12,(10,((((15,11),6),(((3,(9,2)),14),((4,(13,7)),5))),8)),1); tree rep.5090000 = ((((8,10),((15,6),11)),((4,((13,7),14)),((3,(9,2)),5))),12,1); tree rep.5100000 = (((((6,15),11),(10,8)),((5,14),((4,(7,13)),((2,9),3)))),12,1); tree rep.5110000 = ((((((13,7),4),14),(((2,9),3),5)),((((15,11),6),8),10)),12,1); tree rep.5120000 = (12,((((14,4),(7,13)),((3,(9,2)),5)),(((11,15),6),(10,8))),1); tree rep.5130000 = (12,(((5,((9,2),3)),(4,((13,7),14))),(10,((11,(15,6)),8))),1); tree rep.5140000 = (((10,((6,(11,15)),8)),(5,((3,(9,2)),((4,14),(13,7))))),12,1); tree rep.5150000 = ((((((15,6),11),10),8),((((13,7),4),((9,2),3)),(14,5))),12,1); tree rep.5160000 = ((((3,((((7,13),4),14),5)),(9,2)),(8,(((15,11),6),10))),12,1); tree rep.5170000 = ((((7,13),((5,(4,14)),((9,2),3))),((10,((6,15),11)),8)),12,1); tree rep.5180000 = ((((((9,2),3),((4,(13,7)),14)),5),(10,(8,((15,6),11)))),12,1); tree rep.5190000 = ((12,(8,(((15,6),11),10))),(((9,2),3),((14,((13,7),4)),5)),1); tree rep.5200000 = (((((7,13),(4,14)),(5,(3,(9,2)))),((8,(6,(15,11))),10)),12,1); tree rep.5210000 = (12,((10,(8,(6,(15,11)))),((3,(9,2)),(5,(4,((13,7),14))))),1); tree rep.5220000 = ((((((4,(7,13)),((9,2),3)),14),5),(((11,6),15),(8,10))),12,1); tree rep.5230000 = (12,(((8,(11,(6,15))),10),(((4,(13,7)),(14,5)),(3,(9,2)))),1); tree rep.5240000 = ((((((4,(13,7)),14),(3,(9,2))),5),(10,(8,((6,15),11)))),12,1); tree rep.5250000 = ((12,((10,8),(6,(11,15)))),(((14,4),((13,7),5)),(3,(9,2))),1); tree rep.5260000 = (12,(((8,10),(11,(15,6))),((14,((4,(13,7)),((9,2),3))),5)),1); tree rep.5270000 = (12,((14,(((2,9),3),(((7,13),4),5))),((8,(11,(6,15))),10)),1); tree rep.5280000 = (((((6,15),11),(10,8)),(((14,5),(4,(7,13))),((2,9),3))),12,1); tree rep.5290000 = (((((13,7),(14,4)),(((2,9),3),5)),(((6,15),11),(8,10))),12,1); tree rep.5300000 = ((14,(13,7)),((4,(((2,9),3),5)),(12,((8,((6,11),15)),10))),1); tree rep.5310000 = (12,(((10,8),(6,(15,11))),(5,(((3,2),9),(14,(4,(7,13)))))),1); tree rep.5320000 = (12,((((9,2),3),((4,5),(14,(13,7)))),(8,(10,(11,(15,6))))),1); tree rep.5330000 = ((((((7,13),4),(5,14)),(3,(9,2))),((15,(6,11)),(8,10))),12,1); tree rep.5340000 = ((((((13,7),4),14),(5,(3,(9,2)))),((8,(6,(15,11))),10)),12,1); tree rep.5350000 = ((((4,(13,7)),((5,14),((2,9),3))),((8,(11,(6,15))),10)),12,1); tree rep.5360000 = (((((6,15),11),(10,8)),((3,(2,9)),(((14,(13,7)),4),5))),12,1); tree rep.5370000 = ((((8,10),(11,(15,6))),(((((7,13),4),14),((9,2),3)),5)),12,1); tree rep.5380000 = ((((5,(((7,13),4),14)),(3,(9,2))),(((6,(11,15)),8),10)),12,1); tree rep.5390000 = (((5,((3,(9,2)),((4,(13,7)),14))),(8,(10,((15,11),6)))),12,1); tree rep.5400000 = (12,(((7,13),((14,5),(((2,9),3),4))),((8,10),((15,6),11))),1); tree rep.5410000 = (12,((((2,9),3),((((13,7),4),14),5)),(10,(((11,6),15),8))),1); tree rep.5420000 = (12,((5,(((13,(4,7)),14),(3,(2,9)))),(10,((11,(15,6)),8))),1); tree rep.5430000 = (12,(((3,(((4,(7,13)),(2,9)),14)),5),((10,(6,(15,11))),8)),1); tree rep.5440000 = (((10,(8,(11,(6,15)))),(((5,(3,(9,2))),(4,(13,7))),14)),12,1); tree rep.5450000 = ((((10,(6,(11,15))),8),((14,5),(((2,9),3),((7,4),13)))),12,1); tree rep.5460000 = ((((2,9),3),((((6,(15,11)),(10,8)),5),(((13,7),4),14))),12,1); tree rep.5470000 = (12,(((5,(14,((7,13),4))),(3,(2,9))),(((6,15),11),(10,8))),1); tree rep.5480000 = ((8,(10,(11,(6,15)))),(12,(5,(((2,9),3),(((7,13),4),14)))),1); tree rep.5490000 = (((((6,15),11),(10,8)),(((((7,13),4),14),5),(3,(9,2)))),12,1); tree rep.5500000 = ((5,((14,((9,2),3)),(4,(13,7)))),((8,((6,(11,15)),10)),12),1); tree rep.5510000 = ((12,((((4,(13,7)),14),((9,2),3)),5)),((10,((6,15),11)),8),1); tree rep.5520000 = ((12,((10,(6,(15,11))),8)),(((14,(4,(7,13))),5),(3,(9,2))),1); tree rep.5530000 = (12,(((3,(9,2)),((13,7),(4,(5,14)))),(((6,15),11),(10,8))),1); tree rep.5540000 = (12,((8,(10,(6,(11,15)))),(((4,(7,13)),(3,(9,2))),(5,14))),1); tree rep.5550000 = (((((15,(11,6)),8),10),(5,((14,((7,13),4)),((9,2),3)))),12,1); tree rep.5560000 = (12,(((14,5),(((7,13),4),((9,2),3))),((((6,15),11),8),10)),1); tree rep.5570000 = (((((2,9),3),((5,14),(4,(13,7)))),(((15,6),11),(8,10))),12,1); tree rep.5580000 = (((((4,((13,7),14)),(3,(9,2))),5),((((11,6),15),8),10)),12,1); tree rep.5590000 = (12,(((((5,((8,10),(11,(6,15)))),9),(2,3)),14),((7,13),4)),1); tree rep.5600000 = (12,(((10,8),((15,6),11)),((((3,5),14),(2,9)),((13,7),4))),1); tree rep.5610000 = (12,((((((((8,10),((6,11),15)),14),(13,7)),4),5),(2,9)),3),1); tree rep.5620000 = (12,((8,(10,((11,15),6))),(4,((13,7),((3,(9,2)),(14,5))))),1); tree rep.5630000 = (12,((5,(((2,9),3),((4,(13,7)),14))),((11,(6,15)),(10,8))),1); tree rep.5640000 = (((((3,(9,2)),((14,((7,13),4)),5)),(11,(6,15))),(8,10)),12,1); tree rep.5650000 = (12,(((3,(8,(10,((15,6),11)))),(((4,(7,13)),(2,9)),14)),5),1); tree rep.5660000 = (12,((((2,9),3),((7,(13,4)),(5,14))),((10,(11,(6,15))),8)),1); tree rep.5670000 = (((((11,(6,15)),(10,8)),(5,14)),(((2,9),3),(4,(7,13)))),12,1); tree rep.5680000 = (((((15,11),6),(10,8)),(4,((7,13),((3,(2,9)),(5,14))))),12,1); tree rep.5690000 = (12,((((15,11),6),(8,10)),((5,(14,((7,13),4))),(3,(9,2)))),1); tree rep.5700000 = (((((6,15),11),(10,8)),(5,(((9,2),3),(4,(14,(7,13)))))),12,1); tree rep.5710000 = (12,((8,(10,((11,15),6))),((5,4),(((7,13),14),((2,9),3)))),1); tree rep.5720000 = (((((15,11),6),(8,10)),12),(((2,9),3),((7,13),((5,14),4))),1); tree rep.5730000 = ((((15,(11,6)),(8,10)),(3,((5,((13,7),(4,14))),(2,9)))),12,1); tree rep.5740000 = (12,(((8,10),((15,11),6)),((((2,9),3),5),(14,((7,13),4)))),1); tree rep.5750000 = (12,((((4,((7,13),((2,9),3))),14),5),(((15,11),6),(8,10))),1); tree rep.5760000 = (((((2,9),3),((7,13),((5,14),4))),(8,((11,(15,6)),10))),12,1); tree rep.5770000 = ((((2,9),3),(((5,(13,7)),(4,14)),((((6,15),11),10),8))),12,1); tree rep.5780000 = (((10,8),((15,6),11)),(12,((((4,14),(7,13)),(3,(9,2))),5)),1); tree rep.5790000 = (((((9,2),3),((14,(4,(7,13))),5)),((((6,15),11),10),8)),12,1); tree rep.5800000 = (((3,(2,9)),(12,(((7,13),(4,14)),(((6,(15,11)),8),10)))),5,1); tree rep.5810000 = (12,(((11,(15,6)),(((((7,13),14),4),((3,5),(2,9))),8)),10),1); tree rep.5820000 = ((((3,(9,2)),((10,8),(11,(15,6)))),(5,((4,(7,13)),14))),12,1); tree rep.5830000 = (12,(((3,(9,2)),((4,(14,(13,7))),5)),(((11,(15,6)),8),10)),1); tree rep.5840000 = (12,(((10,(6,(11,15))),8),((4,((13,7),14)),(5,((9,2),3)))),1); tree rep.5850000 = (12,(((11,(6,15)),(8,10)),((4,(7,13)),((14,5),(2,(9,3))))),1); tree rep.5860000 = (12,(((4,((14,5),(7,13))),((9,2),3)),((11,(15,6)),(10,8))),1); tree rep.5870000 = (12,((14,(9,2)),((5,3),(((10,8),((15,6),11)),((7,13),4)))),1); tree rep.5880000 = ((12,((3,(9,2)),((((7,13),14),4),5))),(((11,(6,15)),8),10),1); tree rep.5890000 = (((((11,15),6),8),10),(12,((((13,7),4),14),(5,(3,(9,2))))),1); tree rep.5900000 = (((3,(2,9)),(5,(4,((7,13),14)))),(12,((10,8),((15,6),11))),1); tree rep.5910000 = (12,(((5,((13,7),(14,4))),((2,9),3)),((8,10),((15,11),6))),1); tree rep.5920000 = ((((15,(11,6)),(8,10)),12),((((13,7),14),((3,(2,9)),5)),4),1); tree rep.5930000 = (((3,(2,9)),((4,((7,13),14)),(5,((11,(15,6)),(10,8))))),12,1); tree rep.5940000 = (12,(((13,7),4),((3,(2,9)),(((10,8),((11,15),6)),(5,14)))),1); tree rep.5950000 = (12,(((((6,15),11),8),10),(((4,14),(7,13)),((3,(9,2)),5))),1); tree rep.5960000 = (12,(((5,(14,(4,(13,7)))),((2,9),3)),((10,8),(11,(15,6)))),1); tree rep.5970000 = ((14,((5,((9,2),(((8,((15,6),11)),10),12))),3)),(13,(7,4)),1); tree rep.5980000 = (12,(((((9,2),3),5),(14,((7,13),4))),((((15,11),6),8),10)),1); tree rep.5990000 = ((((8,10),(6,(15,11))),(((14,(9,2)),(5,3)),(4,(13,7)))),12,1); tree rep.6000000 = ((((5,((9,2),3)),(14,(4,(13,7)))),12),((10,8),(11,(15,6))),1); tree rep.6010000 = ((((4,(13,7)),((9,2),3)),(14,5)),((((15,11),6),(8,10)),12),1); tree rep.6020000 = ((10,(8,(6,(15,11)))),((((3,(2,9)),((4,(7,13)),5)),14),12),1); tree rep.6030000 = (12,((((2,9),3),((14,5),(4,(7,13)))),((8,10),(6,(15,11)))),1); tree rep.6040000 = (12,((((15,(6,11)),10),8),((((13,7),4),(3,(2,9))),(5,14))),1); tree rep.6050000 = ((((6,(15,11)),(8,10)),(((13,7),(14,4)),((3,(2,9)),5))),12,1); tree rep.6060000 = ((((8,(11,(15,6))),10),((((2,9),3),(5,14)),(13,(4,7)))),12,1); tree rep.6070000 = (12,((((4,(14,5)),(13,7)),((9,2),3)),((8,10),(11,(6,15)))),1); tree rep.6080000 = (12,(((10,8),(11,(15,6))),(((9,2),3),((14,5),(4,(13,7))))),1); tree rep.6090000 = (12,(((((2,9),3),(14,4)),((13,7),5)),(((11,15),6),(10,8))),1); tree rep.6100000 = ((((((8,(10,(11,(15,6)))),3),(12,(9,2))),(4,(7,13))),14),5,1); tree rep.6110000 = (((8,10),(11,(15,6))),(((((9,2),3),((12,14),4)),(7,13)),5),1); tree rep.6120000 = (((5,((3,(9,2)),(14,(4,(13,7))))),(8,((6,(15,11)),10))),12,1); tree rep.6130000 = (((12,((14,((13,7),4)),5)),((9,2),3)),(((11,15),6),(10,8)),1); tree rep.6140000 = (((8,(10,((15,11),6))),(5,((3,(9,2)),(14,(4,(13,7)))))),12,1); tree rep.6150000 = ((((10,(11,(15,6))),8),((5,(((7,13),4),14)),((2,9),3))),12,1); tree rep.6160000 = (12,(((8,((15,6),11)),10),(((14,5),((2,9),3)),((13,7),4))),1); tree rep.6170000 = (12,(((((2,9),3),(14,(4,(13,7)))),5),((10,8),((11,15),6))),1); tree rep.6180000 = ((((3,(9,2)),((((13,7),4),14),5)),((11,(6,15)),(10,8))),12,1); tree rep.6190000 = ((((((10,8),(11,(6,15))),((2,9),3)),(7,(13,4))),(14,5)),12,1); tree rep.6200000 = (12,(((10,8),((15,6),11)),((14,(4,(13,7))),(((9,2),3),5))),1); tree rep.6210000 = (((5,(((2,9),3),((7,13),(14,4)))),(10,(8,(15,(6,11))))),12,1); tree rep.6220000 = (((((13,7),4),((5,14),((2,9),3))),(((11,15),6),(10,8))),12,1); tree rep.6230000 = (12,(((5,((3,(2,9)),14)),(8,((6,(15,11)),10))),(4,(13,7))),1); tree rep.6240000 = (12,(((((2,9),3),((14,(7,4)),13)),5),((8,10),((15,11),6))),1); tree rep.6250000 = (((((15,6),11),10),8),((12,(3,(2,9))),(5,((14,(13,7)),4))),1); tree rep.6260000 = (12,(((3,(9,2)),(((4,(7,13)),14),5)),((((15,6),11),8),10)),1); tree rep.6270000 = ((((((6,11),15),8),10),(((4,((9,2),3)),((13,7),14)),5)),12,1); tree rep.6280000 = (((((15,6),11),(8,10)),12),(((3,(9,2)),((4,(13,7)),14)),5),1); tree rep.6290000 = (((((14,4),((9,2),3)),((7,13),5)),12),(10,(8,((15,11),6))),1); tree rep.6300000 = (12,((5,(((4,13),7),14)),((3,(9,2)),((8,10),(11,(15,6))))),1); tree rep.6310000 = (12,((((11,(15,6)),(10,8)),(14,(((13,7),4),((9,2),3)))),5),1); tree rep.6320000 = (12,(((((2,9),3),5),((4,(7,13)),14)),((10,8),(15,(6,11)))),1); tree rep.6330000 = ((10,8),(((5,(3,(9,2))),(12,((4,(13,7)),14))),(6,(11,15))),1); tree rep.6340000 = ((((10,(11,(6,15))),8),((5,((13,7),(4,14))),((2,9),3))),12,1); tree rep.6350000 = (12,((((13,7),(14,((3,(2,9)),4))),5),((8,10),(6,(15,11)))),1); tree rep.6360000 = ((((8,(11,(6,15))),10),((14,((7,13),4)),(5,(3,(2,9))))),12,1); tree rep.6370000 = ((((((7,13),4),(3,(9,2))),(14,5)),(((6,(15,11)),8),10)),12,1); tree rep.6380000 = ((8,((6,(15,11)),10)),(((14,((13,7),4)),((3,(9,2)),5)),12),1); tree rep.6390000 = ((((6,(15,11)),(10,8)),(((3,(2,9)),((13,7),4)),(5,14))),12,1); tree rep.6400000 = (((((13,7),4),14),(5,(3,(2,9)))),((((11,(15,6)),10),8),12),1); tree rep.6410000 = (12,((10,(8,((11,6),15))),(((14,(4,(7,13))),5),((2,9),3))),1); tree rep.6420000 = (12,(((5,(4,((7,13),14))),((9,2),3)),((((15,11),6),8),10)),1); tree rep.6430000 = ((((10,((11,15),6)),8),(3,((9,2),((4,(13,7)),(14,5))))),12,1); tree rep.6440000 = (((8,(10,((15,6),11))),(5,(3,(14,(((13,7),4),(9,2)))))),12,1); tree rep.6450000 = (12,(((14,4),(((7,13),5),((9,2),3))),(((6,15),11),(8,10))),1); tree rep.6460000 = ((((((13,7),4),((3,(2,9)),5)),14),(10,(8,((6,15),11)))),12,1); tree rep.6470000 = (12,(((6,(15,11)),(10,8)),(((13,7),(4,(14,5))),((2,9),3))),1); tree rep.6480000 = ((((3,(2,9)),((14,5),(4,(7,13)))),((6,(11,15)),(10,8))),12,1); tree rep.6490000 = ((((3,(2,9)),(((4,14),(13,7)),5)),((10,8),(11,(15,6)))),12,1); tree rep.6500000 = (((8,10),((15,6),11)),(5,((14,((13,7),4)),(12,(3,(9,2))))),1); tree rep.6510000 = (((8,((6,(11,15)),10)),(((9,2),3),((14,5),((7,13),4)))),12,1); tree rep.6520000 = ((((((9,2),3),5),((14,4),(13,7))),((8,((11,15),6)),10)),12,1); tree rep.6530000 = (12,((((3,(9,2)),(14,(4,(13,7)))),5),(8,(10,((6,15),11)))),1); tree rep.6540000 = (12,((5,(((13,7),(14,4)),(3,(9,2)))),(((11,(15,6)),8),10)),1); tree rep.6550000 = ((8,(10,((15,6),11))),(12,(5,((((7,13),14),4),((9,2),3)))),1); tree rep.6560000 = (12,(((6,(11,15)),(8,10)),(((13,7),(14,4)),(5,((9,2),3)))),1); tree rep.6570000 = (((((6,15),11),(10,8)),12),((14,5),((4,(7,13)),(3,(9,2)))),1); tree rep.6580000 = ((((8,10),((15,11),6)),12),((14,4),((7,13),(5,(3,(9,2))))),1); tree rep.6590000 = (12,(((5,(3,(9,2))),(14,((7,13),4))),((8,10),((11,15),6))),1); tree rep.6600000 = (12,((((6,(11,15)),10),8),(((13,7),(4,(5,14))),((9,2),3))),1); tree rep.6610000 = (12,((((11,15),6),(8,10)),(5,((14,(4,(13,7))),((9,2),3)))),1); tree rep.6620000 = (((((((2,9),3),14),(4,(13,7))),5),((8,10),(6,(15,11)))),12,1); tree rep.6630000 = ((12,((10,8),(11,(6,15)))),(((14,(9,2)),((4,(13,7)),5)),3),1); tree rep.6640000 = ((12,((8,(6,(11,15))),10)),(5,((14,(4,(13,7))),((9,2),3))),1); tree rep.6650000 = ((((8,10),(6,(11,15))),(((14,5),((7,13),4)),(3,(2,9)))),12,1); tree rep.6660000 = ((((6,(15,11)),(10,8)),(((5,(4,(7,13))),14),(3,(2,9)))),12,1); tree rep.6670000 = ((((12,((8,((15,11),6)),10)),5),((9,2),3)),(4,((7,13),14)),1); tree rep.6680000 = (12,((((15,6),11),(10,8)),(((4,(14,(7,13))),((9,2),3)),5)),1); tree rep.6690000 = ((((6,(11,15)),(8,10)),((3,(9,2)),((((13,7),14),4),5))),12,1); tree rep.6700000 = (12,(((11,(6,15)),(8,10)),((((2,9),3),5),(4,(14,(7,13))))),1); tree rep.6710000 = (12,((10,((15,11),6)),(8,((((13,7),4),(3,(9,2))),(14,5)))),1); tree rep.6720000 = ((14,((((9,2),3),5),((13,7),4))),((((15,6),11),(8,10)),12),1); tree rep.6730000 = ((((10,8),((11,15),6)),((((2,9),3),((14,4),5)),(7,13))),12,1); tree rep.6740000 = (((((13,7),(14,4)),(3,(9,2))),5),(12,((8,10),(11,(15,6)))),1); tree rep.6750000 = ((((14,((9,2),3)),((4,(7,13)),5)),(8,(((6,15),11),10))),12,1); tree rep.6760000 = (12,(((((9,2),(14,5)),((7,13),4)),3),(10,(((15,6),11),8))),1); tree rep.6770000 = (((((((11,15),6),(8,10)),5),(3,(9,2))),(14,((7,13),4))),12,1); tree rep.6780000 = (((10,8),(11,(6,15))),((5,(((2,9),3),(4,(14,(13,7))))),12),1); tree rep.6790000 = (((((3,(2,9)),(((13,7),14),4)),5),((10,(11,(6,15))),8)),12,1); tree rep.6800000 = ((((8,10),(11,(15,6))),((((2,9),3),((13,7),5)),(4,14))),12,1); tree rep.6810000 = (12,(((8,(11,(15,6))),10),((((14,(9,2)),((7,13),4)),5),3)),1); tree rep.6820000 = ((8,(((15,6),11),10)),(12,((13,7),(((5,(3,(9,2))),14),4))),1); tree rep.6830000 = (12,(((((11,15),6),8),10),((14,5),(((7,13),((2,9),4)),3))),1); tree rep.6840000 = ((((8,(11,(15,6))),10),((5,(((2,9),3),(4,14))),(7,13))),12,1); tree rep.6850000 = (((((10,8),(6,(11,15))),4),(((7,13),(((2,9),3),12)),14)),5,1); tree rep.6860000 = (12,(((((4,((7,13),14)),3),(9,2)),5),(((15,(11,6)),8),10)),1); tree rep.6870000 = (12,(((6,(15,11)),((9,2),((14,(((13,7),4),3)),5))),(10,8)),1); tree rep.6880000 = (12,((((6,15),11),(8,10)),((3,(9,2)),(5,(14,(4,(13,7)))))),1); tree rep.6890000 = (((((6,(15,11)),8),10),((((7,13),14),5),(4,((2,3),9)))),12,1); tree rep.6900000 = ((((8,10),(15,(11,6))),(3,((4,((9,2),((7,13),14))),5))),12,1); tree rep.6910000 = (12,(((8,(11,(6,15))),10),((3,(9,2)),(((13,7),(4,14)),5))),1); tree rep.6920000 = ((((((6,15),11),10),8),(((2,9),(((5,(13,7)),4),3)),14)),12,1); tree rep.6930000 = ((5,(((8,10),(11,(6,15))),((((13,7),4),14),(3,(2,9))))),12,1); tree rep.6940000 = (12,((5,((14,(4,(7,13))),(3,(2,9)))),((6,(11,15)),(10,8))),1); tree rep.6950000 = (12,((((2,9),3),(14,((4,(7,13)),5))),(8,(((15,6),11),10))),1); tree rep.6960000 = ((((8,10),(6,(15,11))),(((5,14),(3,(9,2))),((7,13),4))),12,1); tree rep.6970000 = (((((11,(6,15)),8),10),(((9,2),3),((4,(13,7)),(5,14)))),12,1); tree rep.6980000 = (12,(((14,((2,9),(3,5))),((7,13),4)),((8,10),(15,(11,6)))),1); tree rep.6990000 = (12,((8,((6,(11,15)),10)),((5,14),(((4,13),7),((9,2),3)))),1); tree rep.7000000 = ((((8,10),((3,(2,9)),(5,((7,13),(4,14))))),(6,(11,15))),12,1); tree rep.7010000 = ((8,(((3,((((4,7),13),14),(5,(2,9)))),(6,(11,15))),10)),12,1); tree rep.7020000 = ((((14,5),((13,7),4)),((8,(10,(11,(15,6)))),((9,2),3))),12,1); tree rep.7030000 = (12,(((4,((3,(2,9)),(5,14))),(7,13)),(10,(((11,15),6),8))),1); tree rep.7040000 = (((((13,7),(((11,(6,15)),(8,10)),(5,((2,9),3)))),4),14),12,1); tree rep.7050000 = ((((8,10),((15,11),6)),(((3,5),(13,7)),((14,4),(2,9)))),12,1); tree rep.7060000 = (12,((((4,(7,13)),(5,14)),((9,2),3)),((11,(15,6)),(8,10))),1); tree rep.7070000 = (12,(((10,((15,6),11)),8),((((7,13),4),14),(5,(3,(2,9))))),1); tree rep.7080000 = (12,(((8,10),((11,15),6)),(5,(((2,9),3),((4,(13,7)),14)))),1); tree rep.7090000 = ((((6,(15,11)),(10,8)),(5,(((9,2),3),((13,7),(14,4))))),12,1); tree rep.7100000 = (((5,(((9,2),3),(14,((13,7),4)))),(8,(((15,6),11),10))),12,1); tree rep.7110000 = (12,((((6,15),11),(8,10)),((4,((14,5),((2,9),3))),(7,13))),1); tree rep.7120000 = ((5,(((9,2),3),(4,(14,(7,13))))),((((15,11),6),(10,8)),12),1); tree rep.7130000 = ((((11,15),6),(8,10)),((4,(14,(7,13))),((3,(2,9)),(12,5))),1); tree rep.7140000 = (((((4,((7,13),9)),(14,5)),(3,2)),(((15,11),6),(10,8))),12,1); tree rep.7150000 = (((((6,(11,15)),10),8),12),(4,(((9,2),3),((7,13),(14,5)))),1); tree rep.7160000 = (12,((((11,15),6),(8,10)),(((3,(9,2)),(((13,7),4),14)),5)),1); tree rep.7170000 = (((10,((((4,(13,7)),14),(((2,9),3),5)),(6,(15,11)))),8),12,1); tree rep.7180000 = ((14,((13,7),(((10,8),((15,11),6)),((3,(9,2)),(5,4))))),12,1); tree rep.7190000 = (((6,(15,11)),12),(((3,(2,9)),((4,14),5)),((7,13),(10,8))),1); tree rep.7200000 = (((((13,7),5),14),(((10,8),((11,15),6)),(4,((9,2),3)))),12,1); tree rep.7210000 = ((12,((((4,14),(7,13)),5),(3,(2,9)))),((10,8),(11,(6,15))),1); tree rep.7220000 = ((((10,((15,11),6)),8),(((5,((13,7),4)),14),((9,2),3))),12,1); tree rep.7230000 = ((8,(((15,11),6),10)),(12,((((9,2),3),(14,((7,13),4))),5)),1); tree rep.7240000 = ((12,((5,4),((14,(7,13)),((9,2),3)))),(10,((11,(15,6)),8)),1); tree rep.7250000 = ((((3,(9,2)),(((13,7),4),(5,14))),(8,(10,(11,(15,6))))),12,1); tree rep.7260000 = (((((9,2),3),14),(5,((4,7),13))),(12,((8,10),(6,(11,15)))),1); tree rep.7270000 = (((((6,15),11),(10,8)),(14,((13,7),((4,(3,(2,9))),5)))),12,1); tree rep.7280000 = (((10,8),(11,(15,6))),(12,(((14,(7,13)),(4,((9,2),3))),5)),1); tree rep.7290000 = ((((((11,15),6),10),8),((((13,7),(3,(9,2))),4),(14,5))),12,1); tree rep.7300000 = (12,((14,((3,(2,9)),(5,(4,(13,7))))),((((6,15),11),10),8)),1); tree rep.7310000 = (12,(((14,5),(((3,(2,9)),(7,4)),13)),((((6,15),11),10),8)),1); tree rep.7320000 = ((((3,(2,9)),(((7,13),4),(5,14))),((15,(6,11)),(8,10))),12,1); tree rep.7330000 = (((5,((2,9),3)),(((13,7),14),4)),((((11,(15,6)),10),8),12),1); tree rep.7340000 = (12,(4,(((14,(13,7)),(5,((15,(6,11)),(8,10)))),((3,9),2))),1); tree rep.7350000 = (12,(((9,2),3),((5,(((15,6),11),(10,8))),((4,(7,13)),14))),1); tree rep.7360000 = (12,((3,(9,2)),(5,(((4,(13,7)),14),((10,8),(11,(6,15)))))),1); tree rep.7370000 = (12,((((7,13),((9,2),3)),(5,(14,4))),((((6,15),11),8),10)),1); tree rep.7380000 = (12,((((4,((7,13),14)),5),((2,9),3)),(((15,11),6),(8,10))),1); tree rep.7390000 = ((((10,8),((15,6),11)),(14,((4,(13,7)),(5,(3,(9,2)))))),12,1); tree rep.7400000 = (12,(((14,(4,(7,13))),(5,(3,(9,2)))),((8,10),((6,15),11))),1); tree rep.7410000 = (12,((3,(((4,(5,14)),(13,7)),(9,2))),(8,((11,(15,6)),10))),1); tree rep.7420000 = (((((11,6),15),(8,10)),(((2,9),3),((13,7),(5,(14,4))))),12,1); tree rep.7430000 = ((5,(((7,13),(14,4)),((9,2),3))),(12,(8,(10,(11,(15,6))))),1); tree rep.7440000 = ((((5,14),(3,(2,9))),(((((11,15),6),10),8),12)),((4,7),13),1); tree rep.7450000 = (12,(((5,(((7,13),4),14)),((9,2),3)),(((6,15),11),(10,8))),1); tree rep.7460000 = ((((5,((3,(9,2)),(4,(13,7)))),14),(8,(10,(6,(15,11))))),12,1); tree rep.7470000 = ((10,8),(((((4,(13,7)),((12,3),(2,9))),(6,(15,11))),14),5),1); tree rep.7480000 = ((((3,(2,9)),(((4,14),(13,7)),5)),(10,(((15,11),6),8))),12,1); tree rep.7490000 = (12,(5,((((7,13),14),4),(((6,(15,11)),(10,8)),(3,(9,2))))),1); tree rep.7500000 = (((5,(((2,9),3),((14,4),(13,7)))),(((6,(11,15)),10),8)),12,1); tree rep.7510000 = (((((6,(11,15)),8),10),12),(((2,9),3),(((4,(7,13)),5),14)),1); tree rep.7520000 = (12,(((3,(9,2)),(5,(14,((7,13),4)))),((11,(6,15)),(8,10))),1); tree rep.7530000 = (((((6,15),11),(10,8)),((3,(9,2)),(((14,4),(13,7)),5))),12,1); tree rep.7540000 = ((((4,5),(14,(7,13))),((12,3),(2,9))),((8,(11,(15,6))),10),1); tree rep.7550000 = (12,((8,(10,(15,(11,6)))),(5,((((9,2),3),14),(4,(13,7))))),1); tree rep.7560000 = ((((((6,15),11),8),10),(5,(((4,14),(7,13)),(3,(2,9))))),12,1); tree rep.7570000 = (12,(((5,(3,(9,2))),(4,(14,(7,13)))),((11,(6,15)),(10,8))),1); tree rep.7580000 = ((((((11,15),6),8),10),(((7,13),((5,(3,(9,2))),14)),4)),12,1); tree rep.7590000 = ((((6,11),15),(10,8)),(((3,(((14,4),(13,7)),12)),(2,9)),5),1); tree rep.7600000 = (12,((8,(((5,((4,(13,14)),7)),(3,(2,9))),(11,(6,15)))),10),1); tree rep.7610000 = ((5,((3,(9,2)),((4,(14,(7,13))),(((11,(15,6)),10),8)))),12,1); tree rep.7620000 = (12,((10,(((15,6),11),8)),((5,((14,(13,7)),4)),(3,(9,2)))),1); tree rep.7630000 = ((((6,(15,11)),8),10),(12,(((2,9),3),((4,(13,7)),(5,14)))),1); tree rep.7640000 = ((14,((5,(4,(7,13))),(3,(2,9)))),(((8,10),((11,15),6)),12),1); tree rep.7650000 = ((((2,9),((5,3),(14,((7,13),4)))),((8,10),(6,(11,15)))),12,1); tree rep.7660000 = (((((5,3),(4,((7,13),14))),(2,9)),((8,10),(6,(11,15)))),12,1); tree rep.7670000 = (12,((((7,4),13),((((2,9),3),14),5)),((10,(11,(15,6))),8)),1); tree rep.7680000 = (12,((10,((6,(11,15)),8)),(14,((((7,13),4),((2,9),3)),5))),1); tree rep.7690000 = (((((6,(11,15)),10),8),((4,((((9,2),3),5),14)),(7,13))),12,1); tree rep.7700000 = (((((2,9),3),(((10,8),(15,(6,11))),(7,13))),(4,(14,5))),12,1); tree rep.7710000 = (((((15,6),11),(10,8)),((3,(2,9)),(5,(14,(4,(7,13)))))),12,1); tree rep.7720000 = (12,(((7,13),(4,(14,(((9,2),3),5)))),((8,(11,(15,6))),10)),1); tree rep.7730000 = ((((5,(6,(11,15))),(((14,4),(13,7)),((9,2),3))),(8,10)),12,1); tree rep.7740000 = (12,((8,(10,(6,(11,15)))),((4,((5,14),(3,(2,9)))),(13,7))),1); tree rep.7750000 = ((((10,8),(6,(15,11))),((((3,(2,9)),5),14),(4,(13,7)))),12,1); tree rep.7760000 = (12,((((14,(7,13)),((3,(9,2)),5)),4),(((6,(11,15)),8),10)),1); tree rep.7770000 = (5,(4,(((12,((11,(15,6)),(8,10))),(13,7)),(14,((9,2),3)))),1); tree rep.7780000 = (((((9,2),(((11,(15,6)),(10,8)),3)),(14,5)),((7,13),4)),12,1); tree rep.7790000 = (12,(((4,(13,7)),(5,(14,(3,(9,2))))),((((15,6),11),10),8)),1); tree rep.7800000 = (((8,10),(((5,14),(((9,2),3),(13,(4,7)))),(6,(15,11)))),12,1); tree rep.7810000 = (((((6,15),11),8),10),(12,(((9,2),3),(((14,(7,13)),4),5))),1); tree rep.7820000 = ((((9,2),3),(((7,13),(4,14)),((((6,(11,15)),8),10),5))),12,1); tree rep.7830000 = ((8,(((((5,((2,9),3)),14),((4,7),13)),((11,15),6)),10)),12,1); tree rep.7840000 = (12,((((4,(13,7)),14),(((2,9),3),5)),((8,((15,11),6)),10)),1); tree rep.7850000 = (12,((5,(((7,13),4),(14,(3,(2,9))))),(((11,(15,6)),10),8)),1); tree rep.7860000 = ((12,(3,((2,9),(14,((13,7),(5,4)))))),((10,(11,(6,15))),8),1); tree rep.7870000 = (((10,(((6,15),11),8)),(((9,2),3),(5,((14,4),(7,13))))),12,1); tree rep.7880000 = (12,(((9,2),3),((((((15,11),6),8),10),((5,14),(7,13))),4)),1); tree rep.7890000 = (((5,((((13,7),14),4),((9,2),3))),12),(10,(8,(6,(15,11)))),1); tree rep.7900000 = ((((12,(14,5)),((9,2),3)),((13,7),4)),((8,10),(11,(15,6))),1); tree rep.7910000 = (((3,((9,2),((14,5),(4,(7,13))))),(((6,(11,15)),10),8)),12,1); tree rep.7920000 = ((12,((10,8),(11,(15,6)))),((5,(14,((13,7),(3,(9,2))))),4),1); tree rep.7930000 = ((((6,(11,15)),(10,8)),(((9,2),3),(5,((7,4),(14,13))))),12,1); tree rep.7940000 = (12,(((15,(11,6)),(8,10)),((14,((3,((13,7),4)),5)),(2,9))),1); tree rep.7950000 = (12,(((4,(13,7)),5),((((8,10),((15,6),11)),((2,9),3)),14)),1); tree rep.7960000 = ((((((14,4),(7,13)),(3,(2,9))),5),((10,8),((15,11),6))),12,1); tree rep.7970000 = (((3,(2,9)),((5,(10,(((6,15),11),8))),(14,(4,(7,13))))),12,1); tree rep.7980000 = (12,((((6,(15,11)),8),10),((((3,2),9),5),((13,(7,4)),14))),1); tree rep.7990000 = ((((((7,13),14),4),5),(3,(2,9))),(12,((10,8),((11,15),6))),1); tree rep.8000000 = (((((11,15),6),(8,10)),((3,(2,9)),(5,((7,13),(14,4))))),12,1); tree rep.8010000 = (12,(((4,(9,(3,2))),((((10,8),((11,15),6)),14),5)),(13,7)),1); tree rep.8020000 = (((3,(((2,9),5),14)),((13,7),4)),(12,(((15,11),6),(8,10))),1); tree rep.8030000 = (12,(((3,(2,9)),((14,((7,13),4)),5)),((10,8),((6,15),11))),1); tree rep.8040000 = ((((10,8),((11,15),6)),(((2,9),3),(14,(4,(5,(7,13)))))),12,1); tree rep.8050000 = ((((10,8),((6,11),15)),(((5,14),((7,13),4)),(3,(2,9)))),12,1); tree rep.8060000 = (12,(((8,10),((15,6),11)),(5,(((7,13),(4,14)),((9,2),3)))),1); tree rep.8070000 = ((((4,(7,13)),((14,5),(3,(2,9)))),(10,(8,((11,15),6)))),12,1); tree rep.8080000 = (((8,(10,((6,15),11))),(((3,(9,2)),5),(14,((7,13),4)))),12,1); tree rep.8090000 = ((((((7,13),4),(5,14)),(3,(9,2))),(10,(8,(11,(15,6))))),12,1); tree rep.8100000 = (((14,((4,(13,7)),(5,((2,9),3)))),((((6,11),15),8),10)),12,1); tree rep.8110000 = (((((6,15),11),(10,8)),(((14,(4,(13,7))),((2,9),3)),5)),12,1); tree rep.8120000 = (((5,(((9,2),3),(14,((7,13),4)))),(8,((15,(6,11)),10))),12,1); tree rep.8130000 = ((((8,10),((6,15),11)),(((13,7),4),((5,(3,(9,2))),14))),12,1); tree rep.8140000 = (12,(((8,((6,15),11)),10),((4,(13,(14,7))),((3,(9,2)),5))),1); tree rep.8150000 = (((5,((((7,13),4),(3,(2,9))),14)),((((11,15),6),10),8)),12,1); tree rep.8160000 = (12,((((((7,13),5),4),((9,2),3)),14),(8,(10,(6,(15,11))))),1); tree rep.8170000 = (((((9,2),3),(((13,7),4),14)),((((11,6),15),(8,10)),5)),12,1); tree rep.8180000 = (12,(((((6,15),11),8),10),(((3,(5,(2,9))),(4,14)),(13,7))),1); tree rep.8190000 = (12,(((8,(6,(15,11))),10),((5,(3,(2,9))),((4,(13,7)),14))),1); tree rep.8200000 = (12,((5,((3,(9,2)),((4,(13,7)),14))),(((15,11),6),(10,8))),1); tree rep.8210000 = (((2,9),(5,(((((6,15),11),(8,10)),(((13,4),7),14)),3))),12,1); tree rep.8220000 = ((((3,(2,9)),((((7,13),14),4),5)),12),((8,10),(6,(11,15))),1); tree rep.8230000 = (((((3,(2,9)),(14,((7,13),4))),5),(8,((11,(15,6)),10))),12,1); tree rep.8240000 = (((((11,(6,15)),10),8),(((3,(2,9)),12),5)),(((7,13),4),14),1); tree rep.8250000 = ((((((13,7),14),4),(5,(3,(2,9)))),((((6,15),11),8),10)),12,1); tree rep.8260000 = (12,(((11,(6,15)),(10,8)),((((13,7),(4,14)),5),((2,9),3))),1); tree rep.8270000 = (((((4,14),(13,7)),(((2,9),3),5)),((8,(6,(11,15))),10)),12,1); tree rep.8280000 = (12,(((((6,(11,15)),10),8),(((13,7),(14,4)),(3,(2,9)))),5),1); tree rep.8290000 = (((10,(8,((11,15),6))),((2,(9,3)),(5,(((7,13),4),14)))),12,1); tree rep.8300000 = ((((8,10),((11,15),6)),(5,((((13,7),4),(3,(9,2))),14))),12,1); tree rep.8310000 = (12,(((5,14),(((13,7),4),(3,(2,9)))),((10,8),(6,(11,15)))),1); tree rep.8320000 = (12,((10,(8,(11,(15,6)))),(((3,(2,9)),((13,7),4)),(14,5))),1); tree rep.8330000 = ((14,((8,(10,(6,(11,15)))),(((13,7),4),((3,(9,2)),5)))),12,1); tree rep.8340000 = ((((((2,9),3),(((7,13),4),14)),5),(8,(10,(11,(15,6))))),12,1); tree rep.8350000 = (12,((10,((6,(15,11)),8)),(14,((4,(((2,9),3),5)),(7,13)))),1); tree rep.8360000 = (12,((8,(10,((11,15),6))),(((3,(9,2)),(14,(13,(4,7)))),5)),1); tree rep.8370000 = (12,((10,(((6,15),11),8)),((4,(14,(13,7))),(5,((9,2),3)))),1); tree rep.8380000 = ((((9,2),3),((4,(13,7)),(5,14))),(12,((((6,11),15),10),8)),1); tree rep.8390000 = (12,(((((14,5),4),(7,13)),((9,2),3)),(((11,15),6),(8,10))),1); tree rep.8400000 = (12,((8,((11,(6,15)),10)),((((14,(7,13)),4),5),((2,9),3))),1); tree rep.8410000 = (((((11,15),6),(8,10)),(((((7,13),14),4),5),(3,(9,2)))),12,1); tree rep.8420000 = (12,(((10,8),(11,(15,6))),(((13,(7,4)),14),((3,(9,2)),5))),1); tree rep.8430000 = (12,((((7,13),4),((5,((2,9),3)),14)),(((11,(6,15)),8),10)),1); tree rep.8440000 = (5,((14,((7,13),4)),((12,(3,(9,2))),(((11,15),6),(10,8)))),1); tree rep.8450000 = ((4,(((7,13),((12,14),5)),((2,9),3))),((((15,11),6),10),8),1); tree rep.8460000 = (((3,(2,9)),((4,(13,7)),((5,14),((8,10),((15,11),6))))),12,1); tree rep.8470000 = (12,(((5,((9,2),3)),(14,(7,(13,4)))),((6,(11,15)),(8,10))),1); tree rep.8480000 = (12,(((((15,6),11),10),8),((3,((14,(13,7)),4)),(5,(2,9)))),1); tree rep.8490000 = ((((5,4),(((3,(2,9)),(((6,15),11),(8,10))),(13,7))),14),12,1); tree rep.8500000 = (12,(((10,8),(6,(15,11))),((5,(3,((4,14),(7,13)))),(9,2))),1); tree rep.8510000 = (((14,((((6,(11,15)),(10,8)),((2,9),3)),5)),(4,(7,13))),12,1); tree rep.8520000 = ((((4,((13,7),14)),((3,(9,2)),5)),(((6,(15,11)),8),10)),12,1); tree rep.8530000 = (12,(((5,(((7,13),4),14)),((2,3),9)),((8,10),((11,15),6))),1); tree rep.8540000 = (12,(((8,10),(11,(15,6))),((5,(((13,7),4),14)),(3,(2,9)))),1); tree rep.8550000 = ((((6,(15,11)),(10,8)),(((13,7),4),(12,((9,2),3)))),(14,5),1); tree rep.8560000 = ((((10,8),((15,11),6)),((((9,2),3),5),((13,7),(4,14)))),12,1); tree rep.8570000 = (12,(((10,((11,15),6)),8),(5,((3,(9,2)),(14,(4,(7,13)))))),1); tree rep.8580000 = (((((15,6),11),10),8),(12,(((4,(13,7)),14),(5,((9,2),3)))),1); tree rep.8590000 = ((((3,((13,7),(2,9))),(14,(5,4))),((((6,15),11),10),8)),12,1); tree rep.8600000 = (((5,((2,9),3)),(4,((8,10),((6,15),11)))),(((7,13),14),12),1); tree rep.8610000 = (((((7,13),4),(5,(((2,9),3),14))),((10,(6,(11,15))),8)),12,1); tree rep.8620000 = (((10,(11,(15,6))),8),((5,((14,(4,(13,7))),(3,(2,9)))),12),1); tree rep.8630000 = ((((((15,11),6),8),10),(((5,(3,(2,9))),14),((4,7),13))),12,1); tree rep.8640000 = ((((5,((8,10),(6,(15,11)))),(((7,13),4),14)),((2,9),3)),12,1); tree rep.8650000 = (12,(((((9,2),3),(4,(5,(13,7)))),14),((10,8),((11,15),6))),1); tree rep.8660000 = (((12,5),(9,2)),(((3,((8,((11,15),6)),10)),(14,4)),(13,7)),1); tree rep.8670000 = (12,(((8,10),((15,6),11)),(((14,4),(7,13)),(5,(3,(9,2))))),1); tree rep.8680000 = ((((14,((13,7),4)),(5,(3,(2,9)))),((6,(11,15)),(10,8))),12,1); tree rep.8690000 = (((((3,(9,2)),(4,((13,7),14))),5),((10,8),((15,6),11))),12,1); tree rep.8700000 = (12,((10,((11,(6,15)),8)),(5,(((7,13),(14,4)),(3,(9,2))))),1); tree rep.8710000 = (12,((10,8),((((9,2),3),((14,((13,7),4)),5)),(11,(6,15)))),1); tree rep.8720000 = (12,(((3,(9,2)),(14,5)),(((7,13),4),((10,(11,(6,15))),8))),1); tree rep.8730000 = (12,(5,(((4,14),((7,13),((9,2),3))),(((6,15),11),(8,10)))),1); tree rep.8740000 = (((((((13,7),4),14),(3,(9,2))),5),((6,(11,15)),(8,10))),12,1); tree rep.8750000 = (((10,(8,(11,(15,6)))),((((13,7),4),((2,9),3)),(5,14))),12,1); tree rep.8760000 = ((((((2,9),3),((7,13),(4,14))),5),((10,((6,15),11)),8)),12,1); tree rep.8770000 = (((((11,(6,15)),(10,8)),((((7,13),4),((2,9),3)),14)),5),12,1); tree rep.8780000 = (12,(((5,((14,((7,13),4)),((10,8),((15,11),6)))),3),(2,9)),1); tree rep.8790000 = (12,(((10,8),((15,6),11)),(((5,14),(3,(9,2))),((7,13),4))),1); tree rep.8800000 = (12,((((5,14),(4,(13,7))),(3,(9,2))),((8,10),(11,(6,15)))),1); tree rep.8810000 = (((((15,6),11),(8,10)),((((4,(13,7)),14),5),((2,9),3))),12,1); tree rep.8820000 = (12,((3,(2,9)),(((14,5),((6,(15,11)),(10,8))),((7,13),4))),1); tree rep.8830000 = (12,(((3,(2,9)),(((14,5),4),(13,7))),((10,((6,15),11)),8)),1); tree rep.8840000 = ((12,((((3,(2,9)),4),5),(14,(7,13)))),((((11,15),6),8),10),1); tree rep.8850000 = (12,((3,(9,2)),(((((15,11),6),8),10),(5,(14,(13,(4,7)))))),1); tree rep.8860000 = (12,((3,(5,((9,2),((13,7),(14,4))))),(8,(((6,15),11),10))),1); tree rep.8870000 = (12,((((2,9),3),((14,5),((10,(6,(11,15))),8))),(4,(7,13))),1); tree rep.8880000 = (12,((((9,2),3),((14,4),(13,7))),(5,((8,10),((6,15),11)))),1); tree rep.8890000 = (12,(((((13,7),4),5),14),(((9,2),3),(((15,6),11),(8,10)))),1); tree rep.8900000 = ((((6,(11,15)),(8,10)),(((3,(2,9)),(13,(7,(4,14)))),5)),12,1); tree rep.8910000 = ((5,(((8,10),(6,(11,15))),(((7,13),(14,4)),((2,9),3)))),12,1); tree rep.8920000 = (12,(((((7,13),4),(14,5)),((9,2),3)),(((11,(6,15)),10),8)),1); tree rep.8930000 = (12,(((8,((15,6),11)),10),(((14,(4,5)),(13,7)),(3,(2,9)))),1); tree rep.8940000 = (12,(((3,(2,9)),((13,7),(14,(4,5)))),(((6,(15,11)),10),8)),1); tree rep.8950000 = (12,(((3,(2,9)),((5,4),(14,(13,7)))),(((11,15),6),(10,8))),1); tree rep.8960000 = ((12,((10,(11,(15,6))),8)),((3,(2,9)),(5,(14,((7,13),4)))),1); tree rep.8970000 = (12,(((3,(2,9)),((14,((7,13),5)),4)),(10,(8,((15,6),11)))),1); tree rep.8980000 = (12,((((14,5),(13,(4,7))),((2,9),3)),((((15,6),11),8),10)),1); tree rep.8990000 = ((((11,(6,15)),(8,10)),12),((((((9,2),3),5),14),4),(13,7)),1); tree rep.9000000 = ((((3,(9,2)),((((13,7),4),14),5)),((10,8),((15,11),6))),12,1); tree rep.9010000 = ((((8,(11,(6,15))),10),(((3,(9,2)),14),(((13,7),4),5))),12,1); tree rep.9020000 = ((((3,(5,(9,2))),14),(4,(7,13))),(12,((8,10),(6,(11,15)))),1); tree rep.9030000 = ((((13,7),(4,14)),(5,(3,(9,2)))),(((10,((6,15),11)),8),12),1); tree rep.9040000 = ((((7,13),4),(((2,9),3),(14,5))),((10,(8,((11,15),6))),12),1); tree rep.9050000 = ((((((9,2),3),4),((10,(8,((6,15),11))),(14,(13,7)))),5),12,1); tree rep.9060000 = (12,((((6,15),11),(10,8)),(((9,2),3),(((14,(7,13)),4),5))),1); tree rep.9070000 = (((10,8),((((14,4),(7,13)),5),((11,(15,6)),((2,9),3)))),12,1); tree rep.9080000 = (12,((((13,7),(14,4)),((8,10),(11,(15,6)))),((2,9),(5,3))),1); tree rep.9090000 = (((((2,9),3),((((7,13),14),4),(((15,6),11),(8,10)))),5),12,1); tree rep.9100000 = ((((((2,9),3),(4,(7,13))),(5,14)),(((15,11),6),(10,8))),12,1); tree rep.9110000 = (12,(((3,(9,2)),(((13,7),4),(14,5))),(8,(10,((11,15),6)))),1); tree rep.9120000 = (12,(14,((2,9),(((7,13),(5,((((15,6),11),(8,10)),4))),3))),1); tree rep.9130000 = ((((14,(7,13)),(4,((3,(9,2)),5))),((((6,15),11),10),8)),12,1); tree rep.9140000 = (((((((6,15),11),(8,10)),(14,(4,(13,7)))),(9,(2,3))),5),12,1); tree rep.9150000 = (((8,((11,(15,6)),10)),(((3,(2,9)),((7,13),(14,4))),5)),12,1); tree rep.9160000 = ((12,((10,(11,(15,6))),8)),(((((7,13),4),14),(3,(2,9))),5),1); tree rep.9170000 = (((((6,(15,11)),10),8),((((4,(7,13)),14),((2,9),3)),5)),12,1); tree rep.9180000 = ((((9,2),3),((((11,15),6),(8,10)),((13,7),(4,(5,14))))),12,1); tree rep.9190000 = ((((11,6),15),(10,8)),(12,(5,(((2,9),3),(14,((7,13),4))))),1); tree rep.9200000 = (((((2,9),3),((6,(15,11)),(10,8))),((14,4),((7,13),5))),12,1); tree rep.9210000 = ((10,(8,((15,11),6))),((5,(((7,13),(14,4)),((2,9),3))),12),1); tree rep.9220000 = (((10,(8,((((13,7),(((9,2),3),4)),14),5))),((6,15),11)),12,1); tree rep.9230000 = (((((((7,13),(14,4)),(((2,9),3),5)),12),8),10),((15,6),11),1); tree rep.9240000 = (12,((10,(8,(15,(6,11)))),((5,((13,7),(14,4))),((9,2),3))),1); tree rep.9250000 = (((((4,(13,7)),5),(((9,2),3),14)),((6,(15,11)),(8,10))),12,1); tree rep.9260000 = (((((15,6),11),(8,10)),(((7,13),14),(4,(5,(3,(2,9)))))),12,1); tree rep.9270000 = ((14,(5,((4,(13,7)),((((11,(15,6)),8),10),((9,2),3))))),12,1); tree rep.9280000 = (((((3,(2,9)),((4,14),(7,13))),5),(8,(10,((11,15),6)))),12,1); tree rep.9290000 = (12,(((11,(6,15)),(8,10)),(((2,9),3),(4,((13,(5,14)),7)))),1); tree rep.9300000 = (((8,10),(11,(6,15))),(12,(((3,(2,9)),5),((14,(13,7)),4))),1); tree rep.9310000 = ((((15,6),11),((((13,7),4),14),((2,9),(3,(12,5))))),(10,8),1); tree rep.9320000 = (12,(((8,10),(6,(15,11))),((13,(((14,((9,2),3)),7),5)),4)),1); tree rep.9330000 = (12,(((5,14),((3,(2,9)),(((15,11),6),(10,8)))),(4,(7,13))),1); tree rep.9340000 = (12,(((((2,9),3),5),((14,(13,7)),4)),(((15,6),11),(10,8))),1); tree rep.9350000 = (((((((13,7),14),4),5),(3,(9,2))),((8,10),(11,(15,6)))),12,1); tree rep.9360000 = (12,((5,((3,(9,2)),((4,(7,13)),14))),((10,((11,15),6)),8)),1); tree rep.9370000 = ((((3,(9,2)),(14,(5,((13,7),4)))),(((11,15),6),(8,10))),12,1); tree rep.9380000 = ((((6,(15,11)),(10,8)),(((4,(7,13)),(5,14)),(3,(9,2)))),12,1); tree rep.9390000 = (12,(((((3,(2,9)),5),4),((13,7),14)),((8,10),(6,(11,15)))),1); tree rep.9400000 = ((((3,(9,2)),(((13,7),14),4)),5),(12,((10,((6,15),11)),8)),1); tree rep.9410000 = ((((3,(2,9)),(((7,13),4),14)),5),(12,(8,(10,((11,15),6)))),1); tree rep.9420000 = (12,((8,(((15,6),11),10)),((4,((7,13),14)),(5,((9,2),3)))),1); tree rep.9430000 = (((3,(9,2)),((((11,(6,15)),(10,8)),((4,14),(7,13))),5)),12,1); tree rep.9440000 = ((12,(8,10)),(((15,6),11),((((2,9),3),4),((14,5),(13,7)))),1); tree rep.9450000 = (12,((8,10),(((11,6),15),(5,((3,(2,9)),((4,(13,7)),14))))),1); tree rep.9460000 = (((14,(((2,9),3),4)),(((((11,15),6),8),(12,10)),(7,13))),5,1); tree rep.9470000 = (12,((((7,13),4),((10,8),(15,(6,11)))),(5,(((2,9),3),14))),1); tree rep.9480000 = ((3,(((((8,10),(11,(15,6))),5),(14,((7,13),4))),(2,9))),12,1); tree rep.9490000 = (12,(((3,(9,2)),((((7,13),4),14),5)),(((15,6),11),(10,8))),1); tree rep.9500000 = (12,((((3,(2,9)),(4,(14,(13,7)))),5),((10,((6,15),11)),8)),1); tree rep.9510000 = ((((5,14),(((2,9),3),((13,7),4))),(((6,15),11),(10,8))),12,1); tree rep.9520000 = (((((9,2),3),12),(5,((4,(7,13)),14))),(((6,15),11),(8,10)),1); tree rep.9530000 = (12,((5,(((14,4),(13,7)),((2,9),3))),((11,(15,6)),(10,8))),1); tree rep.9540000 = (12,((10,(8,((11,15),6))),(((((13,7),4),14),(3,(2,9))),5)),1); tree rep.9550000 = (((((2,9),3),((4,(13,7)),14)),(5,(((11,(6,15)),8),10))),12,1); tree rep.9560000 = ((12,(10,(8,(15,(6,11))))),((3,(2,9)),(((4,(7,13)),14),5)),1); tree rep.9570000 = (((10,((6,15),11)),((((5,14),(7,13)),(4,(3,(2,9)))),8)),12,1); tree rep.9580000 = (((14,((13,7),4)),((3,(2,9)),5)),(12,(((6,(15,11)),8),10)),1); tree rep.9590000 = (((((((2,9),3),5),(4,(7,13))),14),12),(((11,15),6),(10,8)),1); tree rep.9600000 = ((((8,10),(15,(11,6))),(5,((4,((7,13),14)),((9,2),3)))),12,1); tree rep.9610000 = (((((6,15),11),(8,10)),((3,(9,2)),(((13,7),4),(5,14)))),12,1); tree rep.9620000 = (((((14,(4,(7,13))),((9,2),3)),5),(((6,(11,15)),10),8)),12,1); tree rep.9630000 = (((5,((9,2),3)),(((6,(15,11)),(8,10)),(14,((7,13),4)))),12,1); tree rep.9640000 = (12,((5,(((7,(13,4)),(((11,(15,6)),8),10)),14)),((9,2),3)),1); tree rep.9650000 = ((((5,(3,(2,9))),(14,(4,(7,13)))),12),((8,((15,6),11)),10),1); tree rep.9660000 = (12,((8,((6,(15,11)),10)),((3,(2,9)),(((5,(13,7)),4),14))),1); tree rep.9670000 = (12,(((6,(15,11)),(8,10)),((4,(7,13)),((14,5),(3,(2,9))))),1); tree rep.9680000 = ((((6,(11,15)),(10,8)),((14,((13,7),4)),(((2,9),3),5))),12,1); tree rep.9690000 = (((((2,9),3),(((13,7),4),14)),(((6,(15,11)),(10,8)),5)),12,1); tree rep.9700000 = ((((6,(11,15)),8),10),((5,(3,(9,2))),((((13,7),4),12),14)),1); tree rep.9710000 = ((((13,7),((5,14),(4,((9,2),3)))),((8,10),(6,(15,11)))),12,1); tree rep.9720000 = (12,(((8,10),(11,(6,15))),(((5,(3,(9,2))),(4,(7,13))),14)),1); tree rep.9730000 = (((10,8),((15,6),11)),(((2,9),((5,(13,7)),3)),(12,(4,14))),1); tree rep.9740000 = (12,(((8,10),(6,(15,11))),(((3,(2,9)),5),(14,(4,(13,7))))),1); tree rep.9750000 = (((((9,2),3),(5,(4,((7,13),14)))),12),((8,10),((6,15),11)),1); tree rep.9760000 = (12,(((5,((9,2),3)),((4,14),(13,7))),((((11,15),6),10),8)),1); tree rep.9770000 = ((((10,((6,15),11)),8),((9,(2,3)),((4,((7,13),14)),5))),12,1); tree rep.9780000 = ((((14,(5,(3,(2,9)))),(7,(4,13))),12),(10,(((11,15),6),8)),1); tree rep.9790000 = (12,(((((9,2),3),(4,(13,7))),(14,5)),((6,(11,15)),(8,10))),1); tree rep.9800000 = (12,(((10,8),((6,15),11)),((5,((4,(13,7)),14)),((9,2),3))),1); tree rep.9810000 = ((((6,(15,11)),(8,10)),((5,14),((7,(13,4)),(3,(2,9))))),12,1); tree rep.9820000 = (((((3,(9,2)),((7,13),(4,14))),((6,(15,11)),(10,8))),5),12,1); tree rep.9830000 = ((12,((3,(9,2)),(((4,(7,13)),5),14))),((((15,11),6),10),8),1); tree rep.9840000 = (12,(((((11,15),6),10),8),(((14,((13,7),4)),5),((9,2),3))),1); tree rep.9850000 = ((12,(((4,((2,9),3)),(14,(7,13))),5)),(10,(8,((6,15),11))),1); tree rep.9860000 = ((((11,(6,15)),(10,8)),(14,(((7,4),13),(5,(3,(9,2)))))),12,1); tree rep.9870000 = (((8,((6,15),11)),10),(12,(3,((14,4),(((9,2),5),(13,7))))),1); tree rep.9880000 = (((14,(((4,(13,7)),5),((2,9),3))),((((6,15),11),8),10)),12,1); tree rep.9890000 = (12,(((5,((13,7),(4,14))),((2,9),3)),((((11,15),6),10),8)),1); tree rep.9900000 = (12,(((10,8),(6,(15,11))),(((14,((7,13),4)),5),(3,(9,2)))),1); tree rep.9910000 = (12,(((((14,4),(7,13)),((8,((11,15),6)),10)),(3,(9,2))),5),1); tree rep.9920000 = (12,((10,((6,(11,15)),8)),((5,14),((3,(9,2)),(4,(7,13))))),1); tree rep.9930000 = (((3,(9,2)),(((14,(7,13)),4),(5,(10,(8,(11,(6,15))))))),12,1); tree rep.9940000 = ((((5,((9,2),3)),((13,7),(14,4))),(8,(((11,15),6),10))),12,1); tree rep.9950000 = (12,(((10,((15,6),11)),8),(5,(((13,(14,7)),4),(3,(2,9))))),1); tree rep.9960000 = (12,((((4,((7,13),14)),((9,2),3)),((8,10),(11,(15,6)))),5),1); tree rep.9970000 = ((((3,(2,9)),(10,(8,((11,6),15)))),(4,((5,14),(7,13)))),12,1); tree rep.9980000 = (((8,(10,((11,6),15))),((((14,(7,13)),4),5),((2,9),3))),12,1); tree rep.9990000 = (12,((8,(10,((15,11),6))),((((13,7),(14,4)),((9,2),3)),5)),1); tree rep.10000000 = (((((6,(11,15)),10),8),(((4,(13,7)),(5,(3,(2,9)))),14)),12,1); end; phangorn/inst/extdata/trees/RAxML_bipartitions.3moles0000644000176200001440000000054413475602650022470 0ustar liggesusers(Ame:0.24240784786309346743,(((Hma:0.03262045163347984666,Mur:0.03886458455630492637)36:0.00225499947410235475,Uth:0.02580682933153511174)30:0.00059392541543651757,(Uam:0.02931596331419318927,(Uar:0.00602522464221224522,Uma:0.00593640374580924231)100:0.02934241311799383120)60:0.00269684120306867619)100:0.06379221863907107160,Tor:0.09747395533792581335); phangorn/inst/extdata/trees/RAxML_bootstrap.YCh0000644000176200001440000002576213475602650021270 0ustar liggesusers((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,Mur),(Hma,(Uam,(Uma,Uar)))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uma,Uar))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((((Uam,(Uma,Uar)),(Mur,Uth)),Hma),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uam,(Uma,Uar))),(Mur,Uth)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); ((((Uam,(Uma,Uar)),Hma),(Uth,Mur)),Tor,Ame); (((Uam,(Uma,Uar)),((Uth,Hma),Mur)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uar,(Uam,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uam,(Uma,Uar))),(Mur,Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uam,(Uma,Uar))),(Mur,Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uam,(Uma,Uar))),(Mur,Uth)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uam,(Uar,Uma))),(Mur,Uth)),Tor,Ame); (((Hma,(Uam,(Uar,Uma))),(Mur,Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uar,(Uma,Uam)))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Tor,Ame); (((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Mur,Uth),((Uam,(Uar,Uma)),Hma)),Tor,Ame); ((((Hma,Mur),Uth),(Uam,(Uar,Uma))),Tor,Ame); ((((Hma,Mur),Uth),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,(Mur,Uth)),(Uar,(Uma,Uam))),Tor,Ame); (((Hma,(Mur,Uth)),(Uar,(Uma,Uam))),Tor,Ame); (((Uma,(Uam,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); (((Hma,Mur),(Uth,((Uma,Uar),Uam))),Tor,Ame); (((Uma,(Uar,Uam)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,((Uma,Uar),Uam)),(Uth,Mur)),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,((Uma,Uar),Uam)),(Uth,Mur)),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Uma,Uar),Uam),((Uth,Mur),Hma)),Tor,Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Mur,Uth),((Uam,(Uar,Uma)),Hma)),Ame); (Tor,((Mur,Uth),((Uam,(Uar,Uma)),Hma)),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uar,Uma))),Ame); (Tor,((Mur,Uth),(Hma,(Uam,(Uar,Uma)))),Ame); (Tor,((Mur,Uth),(Hma,(Uam,(Uar,Uma)))),Ame); (Tor,((Hma,(Mur,Uth)),(Uma,(Uam,Uar))),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Hma,Mur),(Uth,(Uma,(Uam,Uar)))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((Uar,(Uma,Uam)),((Hma,Mur),Uth)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); (((Hma,Mur),(Uth,((Uar,Uma),Uam))),Tor,Ame); (((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((Hma,Mur),(Uth,((Uar,Uma),Uam))),Tor,Ame); (((Hma,Mur),(Uth,((Uar,Uma),Uam))),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); (((Hma,Mur),(Uth,((Uar,Uma),Uam))),Tor,Ame); ((((Uth,Mur),Hma),((Uar,Uma),Uam)),Tor,Ame); (((Hma,Mur),(Uth,(Uar,(Uma,Uam)))),Tor,Ame); (((Uma,(Uam,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,(Uam,(Uar,Uma))),(Uth,Mur)),Tor,Ame); (((Hma,(Uam,(Uar,Uma))),(Uth,Mur)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); (((Hma,Mur),(Uth,(Uma,(Uam,Uar)))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); ((((Uam,(Uar,Uma)),Hma),(Mur,Uth)),Tor,Ame); ((((Hma,Mur),Uth),(Uam,(Uar,Uma))),Tor,Ame); ((((Hma,Mur),Uth),(Uam,(Uar,Uma))),Tor,Ame); (((Uar,(Uma,Uam)),((Mur,Uth),Hma)),Tor,Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Hma,(Uam,(Uma,Uar))),(Uth,Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Uar,(Uam,Uma)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,((Uma,(Uar,Uam)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (((Hma,Mur),(Uth,((Uar,Uma),Uam))),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((((Uar,Uma),Uam),(Uth,Mur)),Hma),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); (((Hma,Mur),(Uth,(Uar,(Uma,Uam)))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); phangorn/inst/extdata/trees/RAxML_bootstrap.Wang.out0000644000176200001440000045657013475602650022314 0ustar liggesusers(t1,((((((t14,t15),(t13,t12)),((t11,(((t6,t7),t8),(t9,t10))),(t24,t25))),t16),(((t17,t18),((t22,t21),(t20,t19))),t23)),((t2,t3),((t4,t5),(t27,t26)))),t0); (t1,((t2,t3),((t4,t5),((((((t14,t15),(t13,t12)),(t11,(((t6,t7),t8),(t9,t10)))),t16),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23))),(t27,t26)))),t0); (t1,((((((t11,(((t6,t7),t8),(t9,t10))),(t16,(t14,t15))),(t13,t12)),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23))),(t27,t26)),((t2,t3),(t4,t5))),t0); (t1,(((((t16,(t14,t15)),((t13,t12),(t11,(((t6,t7),t8),(t9,t10))))),((t24,t25),((((t17,t18),(t21,(t20,t19))),t22),t23))),(t27,t26)),((t2,t3),(t4,t5))),t0); (t1,(((t27,t26),(t2,t3)),((t4,t5),(t16,((t14,t15),(((t13,t12),(t11,(((t6,t7),t8),(t9,t10)))),((t24,t25),(((t17,t18),((t20,t19),(t21,t22))),t23))))))),t0); (t1,(((t2,t3),(t4,t5)),((((t24,t25),(((t17,t18),((t20,t19),(t21,t22))),t23)),((t16,(t14,t15)),((t13,t12),(t11,(((t6,t7),t8),(t9,t10)))))),(t27,t26))),t0); (t1,((t2,t3),((((((t17,t18),((t20,t19),(t21,t22))),t23),((t13,t12),(((t24,t25),(t11,(((t6,t7),t8),(t9,t10)))),(t14,t15)))),t16),((t27,t26),(t4,t5)))),t0); (t1,(((t2,t3),(t4,t5)),(((((t17,t18),((t20,t19),(t21,t22))),t23),((((t13,t12),(t24,t25)),(t11,(((t6,t7),t8),(t9,t10)))),((t14,t15),t16))),(t27,t26))),t0); (t1,(((t2,t3),(t4,t5)),((((((t24,t25),((t17,t18),((t20,t19),(t21,t22)))),t23),((t13,t12),((t11,(((t6,t7),t8),(t9,t10))),(t14,t15)))),t16),(t27,t26))),t0); (t1,((t2,t3),((t4,t5),(((((t17,t18),((t20,t19),(t21,t22))),t23),((t14,t15),(t16,(((t24,t25),(t13,t12)),(t11,(((t6,t7),t8),(t9,t10))))))),(t27,t26)))),t0); (((t2,t3),((t5,t4),((t26,t27),(((t16,(t15,t14)),(((t12,t13),(t24,t25)),(t11,((t9,t10),(t8,(t7,t6)))))),(((t18,t17),((t19,t20),(t22,t21))),t23))))),t1,t0); (((t2,t3),((t5,t4),((t26,t27),((((((t12,t13),(t24,t25)),(t11,((t9,t10),(t8,(t7,t6))))),(t15,t14)),(((t18,t17),((t19,t20),(t22,t21))),t23)),t16)))),t1,t0); (((t5,t4),(((t26,t27),(((t11,((t9,t10),(t8,(t7,t6)))),(((t12,t13),t16),(t15,t14))),((t24,t25),(((t18,t17),((t19,t20),(t22,t21))),t23)))),(t2,t3))),t1,t0); (((((((t15,t14),(t11,((t9,t10),(t8,(t7,t6))))),t16),(t12,t13)),((t24,t25),(((t22,(t18,t17)),((t19,t20),t21)),t23))),(((t2,t3),(t5,t4)),(t26,t27))),t1,t0); ((((t26,t27),(t5,t4)),(((((t15,t14),((t24,t25),(t11,((t9,t10),(t8,(t7,t6)))))),(t16,(t12,t13))),(((t18,t17),((t19,t20),(t21,t22))),t23)),(t2,t3))),t1,t0); ((((((t15,t14),((t24,t25),(t11,((t9,t10),(t8,(t7,t6)))))),(t16,(t12,t13))),(((t18,t17),((t19,t20),(t21,t22))),t23)),((t2,t3),(t27,((t5,t4),t26)))),t1,t0); (((t2,t3),((t5,t4),(((((t15,t14),((t24,t25),(t11,((t9,t10),(t8,(t7,t6)))))),((t12,t13),t16)),(((t18,t17),((t19,t20),(t21,t22))),t23)),(t26,t27)))),t1,t0); (((t2,t3),((t5,t4),(((((t15,t14),((t24,t25),(t11,((t9,t10),(t8,(t7,t6)))))),((t12,t13),t16)),(((t18,t17),((t19,t20),(t21,t22))),t23)),(t26,t27)))),t1,t0); ((((t26,t27),(t2,t3)),((t5,t4),(((t16,(t15,t14)),((t11,((t9,t10),(t8,(t7,t6)))),(t12,t13))),((t24,t25),(((t18,t17),((t19,t20),(t21,t22))),t23))))),t1,t0); ((((t5,t4),(((((t18,t17),((t19,t20),(t21,t22))),t23),(((t11,((t9,t10),(t8,(t7,t6)))),((t12,t13),(t15,t14))),(t16,(t24,t25)))),(t26,t27))),(t2,t3)),t1,t0); (((t2,t3),(((t26,t27),((((((t9,t10),((t6,t7),t8)),t11),((t12,t13),(t25,t24))),((t15,t14),t16)),(((t18,t17),((t22,t21),(t20,t19))),t23))),(t4,t5))),t1,t0); (((t4,t5),((((t2,t3),((((((t9,t10),((t6,t7),t8)),t11),((t12,t13),(t25,t24))),((t15,t14),t16)),(((t20,t19),((t18,t17),(t22,t21))),t23))),t27),t26)),t1,t0); ((((t27,t26),((((((t22,t21),(t20,t19)),(t18,t17)),((t25,t24),t23)),(((((t9,t10),((t6,t7),t8)),t11),((t12,t13),(t15,t14))),t16)),(t4,t5))),(t2,t3)),t1,t0); (((t4,t5),(((t27,t26),(((((t22,t21),(t20,t19)),(t18,t17)),((t25,t24),t23)),(((t12,t13),(((t9,t10),((t6,t7),t8)),t11)),(t16,(t15,t14))))),(t2,t3))),t1,t0); (((t4,t5),((t16,((t15,t14),(((t25,t24),(t23,(((t22,t21),(t20,t19)),(t18,t17)))),((t12,t13),(((t9,t10),((t6,t7),t8)),t11))))),((t27,t26),(t2,t3)))),t1,t0); ((((t4,t5),(((t23,(((t22,t21),(t20,t19)),(t18,t17))),(((t16,(t15,t14)),(((t9,t10),((t6,t7),t8)),t11)),((t25,t24),(t12,t13)))),(t27,t26))),(t2,t3)),t1,t0); (((t4,t5),(((t23,(((t22,t21),(t20,t19)),(t18,t17))),(((t16,(t15,t14)),(((t9,t10),((t6,t7),t8)),t11)),((t25,t24),(t12,t13)))),((t2,t3),(t27,t26)))),t1,t0); (((t2,t3),((((((t25,t24),t23),(((t22,t21),(t20,t19)),(t18,t17))),((t16,(t15,t14)),((((t9,t10),((t6,t7),t8)),t11),(t12,t13)))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),((((t23,(((t22,t21),(t20,t19)),(t18,t17))),(((t12,t13),t16),(((((t9,t10),((t6,t7),t8)),t11),(t25,t24)),(t15,t14)))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),(((t23,(((t22,t21),(t20,t19)),(t18,t17))),((((((t9,t10),((t6,t7),t8)),t11),(t25,t24)),((t15,t14),(t12,t13))),t16)),((t27,t26),(t4,t5)))),t1,t0); (t1,((t3,t2),(((t5,t4),(t27,t26)),((((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20))))),((t12,t13),((t15,t14),(((t10,t9),(t8,(t6,t7))),t11)))),t16))),t0); (t1,(((t27,t26),(t3,t2)),((t5,t4),(((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20))))),((t16,(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13)))))),t0); (t1,((t5,t4),((((t23,((t17,t18),((t22,t21),(t19,t20)))),((t16,(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),((t25,t24),(t12,t13))))),(t27,t26)),(t3,t2))),t0); (t1,((((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20))))),((t16,(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13)))),(((t5,t4),(t27,t26)),(t3,t2))),t0); (t1,((t3,t2),((t5,t4),(((t23,((t17,t18),((t22,t21),(t19,t20)))),((t16,(((t25,t24),(((t10,t9),(t8,(t6,t7))),t11)),(t15,t14))),(t12,t13))),(t27,t26)))),t0); (t1,((t3,t2),((t5,t4),((((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20))))),(((((t10,t9),(t8,(t6,t7))),t11),(t15,t14)),(t16,(t12,t13)))),(t27,t26)))),t0); (t1,((t3,t2),((((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20))))),((t15,t14),(t16,((t12,t13),(((t10,t9),(t8,(t6,t7))),t11))))),((t27,t26),(t5,t4)))),t0); (t1,((t3,t2),((((t23,((t17,t18),((t22,t21),(t19,t20)))),(((t12,t13),(((((t10,t9),(t8,(t6,t7))),t11),(t15,t14)),t16)),(t25,t24))),(t27,t26)),(t5,t4))),t0); (t1,((t5,t4),((t3,t2),((((t16,(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13))),((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20)))))),(t27,t26)))),t0); (t1,((t3,t2),((((t16,(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13))),((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20)))))),((t27,t26),(t5,t4)))),t0); (t1,(((t4,t5),(t27,t26)),((t3,t2),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((t16,(t15,t14)),((t12,t13),((t25,t24),(t11,((t10,t9),(t8,(t7,t6)))))))))),t0); (t1,((t3,t2),(((((((t22,t21),(t19,t20)),(t18,t17)),t23),(t16,((t15,t14),((t11,((t10,t9),(t8,(t7,t6)))),((t12,t13),(t25,t24)))))),(t27,t26)),(t4,t5))),t0); (t1,((t3,t2),((t16,((t15,t14),(((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13)),((t25,t24),((((t22,t21),(t19,t20)),(t18,t17)),t23))))),(((t4,t5),t26),t27))),t0); (t1,((t3,t2),(((((((t22,t21),(t19,t20)),(t18,t17)),t23),(t16,((t15,t14),(((t25,t24),(t12,t13)),(t11,((t10,t9),(t8,(t7,t6)))))))),(t26,t27)),(t4,t5))),t0); (t1,((t3,t2),(((((t25,t24),((((t21,(t19,t20)),(t18,t17)),t22),t23)),(((t12,t13),(t11,((t10,t9),(t8,(t7,t6))))),(t16,(t15,t14)))),(t26,t27)),(t4,t5))),t0); (t1,((t3,t2),((t4,t5),(((((t18,t17),((t21,t22),(t19,t20))),t23),(t16,((t15,t14),(((t25,t24),(t12,t13)),(t11,((t10,t9),(t8,(t7,t6)))))))),(t26,t27)))),t0); (t1,((t4,t5),(((((t21,(t19,t20)),((t18,t17),t22)),t23),(t16,(((t15,t14),((t11,((t10,t9),(t8,(t7,t6)))),(t25,t24))),(t12,t13)))),((t3,t2),(t26,t27)))),t0); (t1,((t3,t2),(((t26,t27),(((t25,t24),((((t22,t21),(t19,t20)),(t18,t17)),t23)),(((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13)),((t15,t14),t16)))),(t4,t5))),t0); (t1,((t3,t2),(((t26,t27),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t15,t14),((t25,t24),(t11,((t10,t9),(t8,(t7,t6)))))),(t12,t13)),t16))),(t4,t5))),t0); (t1,((t3,t2),(((t26,t27),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t12,t13),(t25,t24)),(t11,((t10,t9),(t8,(t7,t6))))),(t16,(t15,t14))))),(t4,t5))),t0); (((((t23,((t21,(t18,t17)),(t22,(t20,t19)))),(t16,((t15,t14),(((t25,t24),(t12,t13)),(t11,((t8,(t6,t7)),(t10,t9))))))),(t26,t27)),((t4,t5),(t3,t2))),t1,t0); (((t3,t2),((t16,(((t15,t14),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9))))),(t23,((t25,t24),((t18,t17),((t21,t22),(t20,t19))))))),((t26,t27),(t4,t5)))),t1,t0); ((((t26,t27),(t4,t5)),((t3,t2),(((t25,t24),(((t18,t17),((t21,t22),(t20,t19))),t23)),((t16,(t15,t14)),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))))))),t1,t0); (((t3,t2),((((t25,t24),(((t18,t17),((t21,t22),(t20,t19))),t23)),((t16,(t15,t14)),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))))),((t26,t27),(t4,t5)))),t1,t0); ((((t26,t27),(((t15,t14),(((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))),((t25,t24),(((t18,t17),((t21,t22),(t20,t19))),t23)))),t16)),((t3,t2),(t4,t5))),t1,t0); (((t4,t5),(((t26,t27),((((t18,t17),((t21,t22),(t20,t19))),(t23,(t25,t24))),((t16,(t15,t14)),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9))))))),(t3,t2))),t1,t0); (((t3,t2),(((t4,t5),(t26,t27)),(((t23,((t25,t24),((t18,t17),((t21,t22),(t20,t19))))),((t15,t14),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))))),t16))),t1,t0); ((((t3,t2),(t26,t27)),(((((t18,t17),((t21,t22),(t20,t19))),t23),((t15,t14),((((t25,t24),(t12,t13)),(t11,((t8,(t6,t7)),(t10,t9)))),t16))),(t4,t5))),t1,t0); (((t4,t5),(((t3,t2),(t26,t27)),(((t25,t24),(((t18,t17),((t21,t22),(t20,t19))),t23)),(((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))),(t16,(t15,t14)))))),t1,t0); (((t3,t2),(((t26,t27),((((t18,t17),((t21,t22),(t20,t19))),t23),((t16,((t15,t14),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))))),(t25,t24)))),(t4,t5))),t1,t0); (t1,((t5,t4),((t3,t2),(t27,(t26,((t23,((t18,t17),((t19,t20),(t22,t21)))),(t16,(((t15,t14),((t25,t24),(t11,((t9,t10),(t8,(t6,t7)))))),(t13,t12)))))))),t0); (t1,((t3,t2),((t5,t4),((t27,t26),((t23,((t25,t24),((t18,t17),((t19,t20),(t22,t21))))),(((t11,((t9,t10),(t8,(t6,t7)))),(t15,t14)),((t13,t12),t16)))))),t0); (t1,((t5,t4),(((t3,t2),(t27,t26)),((((t18,t17),((t19,t20),(t22,t21))),t23),(((t13,t12),(t15,t14)),(((t25,t24),(t11,((t9,t10),(t8,(t6,t7))))),t16))))),t0); (t1,((t3,t2),((t5,t4),((t27,t26),((((t25,t24),((t18,t17),((t19,t20),(t22,t21)))),t23),(t16,(((t15,t14),(t13,t12)),(t11,((t9,t10),(t8,(t6,t7)))))))))),t0); (t1,(((t27,t26),((((t18,t17),((t19,t20),(t22,t21))),(t23,(t25,t24))),(((t13,t12),(t11,((t9,t10),(t8,(t6,t7))))),(t16,(t15,t14))))),((t3,t2),(t5,t4))),t0); (t1,(((t27,t26),((((t18,t17),((t19,t20),(t22,t21))),t23),(t16,((t15,t14),((t13,t12),((t25,t24),(t11,((t9,t10),(t8,(t6,t7)))))))))),((t3,t2),(t5,t4))),t0); (t1,((t5,t4),(((t27,t26),((((t18,t17),((t19,t20),(t22,t21))),t23),((((t13,t12),(t25,t24)),(t11,((t9,t10),(t8,(t6,t7))))),((t15,t14),t16)))),(t3,t2))),t0); (t1,(((t3,t2),(((t25,t24),(((t18,t17),((t19,t20),(t22,t21))),t23)),((t13,t12),((t11,((t9,t10),(t8,(t6,t7)))),((t15,t14),t16))))),((t27,t26),(t5,t4))),t0); (t1,((t3,t2),((t5,t4),((((t25,t24),(((t18,t17),((t19,t20),(t22,t21))),t23)),(((t13,t12),((t11,((t9,t10),(t8,(t6,t7)))),(t15,t14))),t16)),(t27,t26)))),t0); (t1,((t5,t4),((((((t18,t17),((t19,t20),(t22,t21))),t23),(((t11,((t9,t10),(t8,(t6,t7)))),(t25,t24)),((t16,(t15,t14)),(t13,t12)))),(t27,t26)),(t3,t2))),t0); (((t2,t3),((t4,t5),(((t16,(((t14,t15),(t11,(((t7,t6),t8),(t9,t10)))),((t13,t12),(t25,t24)))),(t23,((t18,t17),((t22,t21),(t19,t20))))),(t26,t27)))),t1,t0); ((((((t11,(((t7,t6),t8),(t9,t10))),((t13,t12),(t25,t24))),(t16,(t14,t15))),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t26,t27),((t2,t3),(t4,t5)))),t1,t0); (((t4,t5),(((((t13,t12),((t25,t24),(t11,(((t7,t6),t8),(t9,t10))))),(t16,(t14,t15))),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t2,t3),(t26,t27)))),t1,t0); ((((t16,((t14,t15),(((t25,t24),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12))))),(t2,t3)),((t4,t5),(t26,t27))),t1,t0); ((((t4,t5),((t26,t27),((t23,((t18,t17),((t22,t21),(t19,t20)))),(t16,((t14,t15),(((t25,t24),(t11,(((t7,t6),t8),(t9,t10)))),(t13,t12))))))),(t2,t3)),t1,t0); (((((t25,t24),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t16,(t14,t15)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12)))),((t4,t5),((t2,t3),(t26,t27)))),t1,t0); (((t2,t3),((t4,t5),((t26,t27),(((t25,t24),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t16,(t14,t15)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12))))))),t1,t0); ((((t26,t27),(((t25,t24),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t16,(t14,t15)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12))))),((t2,t3),(t4,t5))),t1,t0); (((t4,t5),(((t26,t27),(t2,t3)),((t23,(((t18,t17),((t22,t21),(t19,t20))),(t25,t24))),((t16,(t14,t15)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12)))))),t1,t0); ((((t2,t3),(t4,t5)),((t26,t27),(((t23,(((t18,t17),((t22,t21),(t19,t20))),(t25,t24))),((t13,t12),((t14,t15),(t11,(((t7,t6),t8),(t9,t10)))))),t16))),t1,t0); ((((t4,t5),(t27,t26)),((t3,t2),((t23,((t18,t17),((t22,t21),(t20,t19)))),((((t12,t13),(t24,t25)),(t11,((t8,(t6,t7)),(t9,t10)))),(t16,(t14,t15)))))),t1,t0); ((((t3,t2),(t4,t5)),((t27,t26),(t16,((t23,((t18,t17),((t22,t21),(t20,t19)))),(((t24,t25),(t12,t13)),((t14,t15),(t11,((t8,(t6,t7)),(t9,t10))))))))),t1,t0); (((t4,t5),(((t27,t26),((t23,((t18,t17),((t22,t21),(t20,t19)))),((((t12,t13),t16),(t14,t15)),((t11,((t8,(t6,t7)),(t9,t10))),(t24,t25))))),(t3,t2))),t1,t0); (((((t3,t2),(t27,t26)),((t23,((t18,t17),((t22,t21),(t20,t19)))),((((t12,t13),t16),((t14,t15),(t11,((t8,(t6,t7)),(t9,t10))))),(t24,t25)))),(t4,t5)),t1,t0); (((((t3,t2),(t27,t26)),((t23,((t18,t17),((t22,t21),(t20,t19)))),(((t14,t15),(((t12,t13),(t24,t25)),(t11,((t8,(t6,t7)),(t9,t10))))),t16))),(t4,t5)),t1,t0); (((((t3,t2),(t27,t26)),((t16,(t14,t15)),(((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),((t11,((t8,(t6,t7)),(t9,t10))),(t12,t13))))),(t4,t5)),t1,t0); (((t3,t2),(((t27,t26),(t4,t5)),((t23,((t18,t17),((t22,t21),(t20,t19)))),((t16,((t14,t15),(t11,((t8,(t6,t7)),(t9,t10))))),((t24,t25),(t12,t13)))))),t1,t0); (((t3,t2),((t4,t5),((((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),((t16,((t14,t15),(t11,((t8,(t6,t7)),(t9,t10))))),(t12,t13))),(t27,t26)))),t1,t0); ((((((t16,(t14,t15)),((t24,t25),((t12,t13),(t11,((t8,(t6,t7)),(t9,t10)))))),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t27,t26)),((t3,t2),(t4,t5))),t1,t0); (((t3,t2),((t4,t5),((((t16,(t14,t15)),((t11,((t8,(t6,t7)),(t9,t10))),((t24,t25),(t12,t13)))),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t27,t26)))),t1,t0); ((((t27,t26),((t16,(t15,t14)),(((t24,t25),(t23,((t17,t18),((t19,t20),(t21,t22))))),((t13,t12),(t11,((t8,(t6,t7)),(t9,t10))))))),((t5,t4),(t2,t3))),t1,t0); ((((t27,t26),(t5,t4)),((t2,t3),((t23,((t17,t18),((t19,t20),(t21,t22)))),((t16,(t15,t14)),(((t11,((t8,(t6,t7)),(t9,t10))),(t24,t25)),(t13,t12)))))),t1,t0); ((((t5,t4),((t27,t26),((t23,((t17,t18),((t19,t20),(t21,t22)))),((t15,t14),(((t13,t12),(t11,((t8,(t6,t7)),(t9,t10)))),((t24,t25),t16)))))),(t2,t3)),t1,t0); (((t5,t4),(((t2,t3),(t27,t26)),((t23,((t17,t18),((t19,t20),(t21,t22)))),((t24,t25),((t16,(t15,t14)),((t13,t12),(t11,((t8,(t6,t7)),(t9,t10))))))))),t1,t0); ((((t27,t26),((t23,((t17,t18),((t19,t20),(t21,t22)))),((t16,(t15,t14)),((t13,t12),((t24,t25),(t11,((t8,(t6,t7)),(t9,t10)))))))),((t5,t4),(t2,t3))),t1,t0); (((t5,t4),(((t2,t3),(t27,t26)),((t23,((t17,t18),((t19,t20),(t21,t22)))),((t16,(t15,t14)),((t13,t12),((t24,t25),(t11,((t8,(t6,t7)),(t9,t10))))))))),t1,t0); (((t2,t3),(((t27,t26),((t23,((t17,t18),((t19,t20),(t21,t22)))),(t16,(((t24,t25),(t13,t12)),((t15,t14),(t11,((t8,(t6,t7)),(t9,t10)))))))),(t5,t4))),t1,t0); (((t2,t3),(((t27,t26),((t23,((t17,t18),((t19,t20),(t21,t22)))),((((t24,t25),(t11,((t8,(t6,t7)),(t9,t10)))),(t15,t14)),((t13,t12),t16)))),(t5,t4))),t1,t0); (((t5,t4),((t2,t3),((t27,t26),((t23,((t17,t18),((t19,t20),(t21,t22)))),((t16,(t15,t14)),((t13,t12),((t24,t25),(t11,((t8,(t6,t7)),(t9,t10)))))))))),t1,t0); (((t2,t3),(((t26,((t23,((t22,(t17,t18)),((t19,t20),t21))),(((t11,((t8,(t6,t7)),(t9,t10))),(t16,(t15,t14))),((t13,t12),(t24,t25))))),(t5,t4)),t27)),t1,t0); (((((t5,t4),(t27,t26)),(((t16,(t14,t15)),((t12,t13),((t24,t25),(t11,((t8,(t6,t7)),(t10,t9)))))),(t23,((t17,t18),((t19,t20),(t22,t21)))))),(t3,t2)),t1,t0); (((t5,t4),((t27,t26),(((t16,(((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))),(t14,t15))),((t24,t25),(t23,((t17,t18),(t22,(t21,(t19,t20))))))),(t3,t2)))),t1,t0); ((((((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))),((t14,t15),t16)),((t24,t25),(t23,((t17,t18),((t19,t20),(t22,t21)))))),((t3,t2),((t5,t4),(t26,t27)))),t1,t0); (((t3,t2),((t5,t4),((t26,t27),((t16,((((t24,t25),(t12,t13)),(t11,((t8,(t6,t7)),(t10,t9)))),(t14,t15))),(t23,((t17,t18),((t19,t20),(t22,t21)))))))),t1,t0); ((((t16,((((t23,((t17,t18),((t19,t20),(t22,t21)))),(t24,t25)),((t14,t15),(t12,t13))),(t11,((t8,(t6,t7)),(t10,t9))))),((t3,t2),(t26,t27))),(t5,t4)),t1,t0); (((t3,t2),(((t26,t27),(((t16,(t14,t15)),(((t24,t25),(t11,((t8,(t6,t7)),(t10,t9)))),(t12,t13))),(t23,((t17,t18),((t19,t20),(t22,t21)))))),(t5,t4))),t1,t0); (((t3,t2),(((t26,t27),((((t11,((t8,(t6,t7)),(t10,t9))),((t14,t15),t16)),((t12,t13),(t24,t25))),(t23,((t17,t18),((t19,t20),(t22,t21)))))),(t5,t4))),t1,t0); (((t3,t2),(((t26,t27),((((t14,t15),t16),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9))))),(((t24,t25),t23),((t17,t18),((t19,t20),(t22,t21)))))),(t5,t4))),t1,t0); (((t3,t2),(((t26,t27),((t16,(((t11,((t8,(t6,t7)),(t10,t9))),((t24,t25),(t12,t13))),(t14,t15))),((t22,((t17,t18),(t21,(t19,t20)))),t23))),(t5,t4))),t1,t0); ((((((t12,t13),((t11,((t8,(t6,t7)),(t10,t9))),(t24,t25))),((t14,t15),t16)),(((t17,t18),((t22,t21),(t19,t20))),t23)),(((t26,(t5,t4)),(t3,t2)),t27)),t1,t0); (((t2,t3),((((t23,((t24,t25),(((t21,t22),(t19,t20)),(t17,t18)))),((t12,t13),((t16,(t15,t14)),(t11,((t8,(t6,t7)),(t9,t10)))))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),((((((t21,t22),(t19,t20)),(t17,t18)),t23),(((t15,t14),((t12,t13),((t11,((t8,(t6,t7)),(t9,t10))),(t24,t25)))),t16)),((t4,t5),(t26,t27)))),t1,t0); ((((t4,t5),(t26,t27)),((t2,t3),(((((t21,t22),(t19,t20)),(t17,t18)),t23),(((t12,t13),((t11,((t8,(t6,t7)),(t9,t10))),(t24,t25))),(t16,(t15,t14)))))),t1,t0); (((t4,t5),((((t24,t25),((((t21,t22),(t19,t20)),(t17,t18)),t23)),(((t11,((t8,(t6,t7)),(t9,t10))),(t12,t13)),(t16,(t15,t14)))),((t26,t27),(t2,t3)))),t1,t0); (((t2,t3),(((((((t21,t22),(t19,t20)),(t17,t18)),t23),(t16,(((t15,t14),((t24,t25),(t11,((t8,(t6,t7)),(t9,t10))))),(t12,t13)))),(t26,t27)),(t4,t5))),t1,t0); (((t2,t3),(((((((t21,t22),(t19,t20)),(t17,t18)),t23),((t16,(t15,t14)),(((t24,t25),(t11,((t8,(t6,t7)),(t9,t10)))),(t12,t13)))),(t26,t27)),(t4,t5))),t1,t0); (((t2,t3),(((((((t21,t22),(t19,t20)),(t17,t18)),t23),(t16,((t15,t14),((t11,((t8,(t6,t7)),(t9,t10))),((t12,t13),(t24,t25)))))),(t26,t27)),(t4,t5))),t1,t0); (((t2,t3),(((((((t21,t22),(t19,t20)),(t17,t18)),t23),(((t12,t13),((t24,t25),(t11,((t8,(t6,t7)),(t9,t10))))),(t16,(t15,t14)))),(t26,t27)),(t4,t5))),t1,t0); (((((((t24,t25),(((t21,t22),(t19,t20)),(t17,t18))),t23),((t12,t13),(((t15,t14),(t11,((t8,(t6,t7)),(t9,t10)))),t16))),((t2,t3),(t26,t27))),(t4,t5)),t1,t0); ((((t26,t27),((((t22,(t19,t20)),(t21,(t17,t18))),t23),((((t12,t13),(t11,((t8,(t6,t7)),(t9,t10)))),(t16,(t15,t14))),(t24,t25)))),((t4,t5),(t2,t3))),t1,t0); (((t4,t5),(((((t15,t14),((((t10,t9),((t6,t7),t8)),t11),((t24,t25),(t13,t12)))),((((t19,t20),(t21,t22)),(t17,t18)),t23)),t16),((t26,t27),(t3,t2)))),t1,t0); ((((t26,t27),(t3,t2)),((t4,t5),(((t15,t14),(((((t10,t9),((t6,t7),t8)),t11),(t24,t25)),(t16,(t13,t12)))),((((t19,t20),(t21,t22)),(t17,t18)),t23)))),t1,t0); ((((t26,t27),(t4,t5)),((((((t10,t9),((t6,t7),t8)),t11),(t16,((t13,t12),(t15,t14)))),(((((t19,t20),(t21,t22)),(t17,t18)),t23),(t24,t25))),(t3,t2))),t1,t0); (((t3,t2),(((t26,t27),(t4,t5)),(((((t19,t20),(t21,t22)),(t17,t18)),t23),(t16,((t15,t14),(((t24,t25),(((t10,t9),((t6,t7),t8)),t11)),(t13,t12))))))),t1,t0); (((t4,t5),((((((t19,t20),(t21,t22)),(t17,t18)),t23),((((t24,t25),(((t10,t9),((t6,t7),t8)),t11)),(t15,t14)),((t13,t12),t16))),((t3,t2),(t26,t27)))),t1,t0); (((t4,t5),((t26,t27),((((t24,t25),((((t19,t20),(t21,t22)),(t17,t18)),t23)),((t16,(t15,t14)),((t13,t12),(((t10,t9),((t6,t7),t8)),t11)))),(t3,t2)))),t1,t0); (((t4,t5),((t3,t2),((t26,t27),(((t24,t25),((((t19,t20),(t21,t22)),(t17,t18)),t23)),((((t10,t9),((t6,t7),t8)),t11),(t16,((t15,t14),(t13,t12)))))))),t1,t0); (((((t3,t2),(t26,t27)),(((((t19,t20),(t21,t22)),(t17,t18)),t23),((t16,(t15,t14)),(((((t10,t9),((t6,t7),t8)),t11),(t24,t25)),(t13,t12))))),(t4,t5)),t1,t0); (((((t3,t2),(t26,t27)),(((((t19,t20),(t21,t22)),(t17,t18)),t23),(t16,((t15,t14),((((t10,t9),((t6,t7),t8)),t11),((t24,t25),(t13,t12))))))),(t4,t5)),t1,t0); ((((t3,t2),((t26,t27),(((((t19,t20),(t21,t22)),(t17,t18)),t23),(((t13,t12),((((t10,t9),((t6,t7),t8)),t11),(t24,t25))),(t16,(t15,t14)))))),(t4,t5)),t1,t0); (t1,((t5,t4),((((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23)),(((t12,t13),(t11,((t9,t10),((t7,t6),t8)))),((t15,t14),t16))),((t26,t27),(t3,t2)))),t0); (t1,((t5,t4),((t26,t27),((t3,t2),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((t11,((t9,t10),((t7,t6),t8))),((t15,t14),(((t24,t25),(t12,t13)),t16))))))),t0); (t1,(((t3,t2),(((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23)),(((t12,t13),(t11,((t9,t10),((t7,t6),t8)))),(t16,(t15,t14))))),((t5,t4),(t26,t27))),t0); (t1,((t3,t2),((t5,t4),((t26,t27),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t24,t25),(t12,t13)),(t11,((t9,t10),((t7,t6),t8)))),(t16,(t15,t14))))))),t0); (t1,((t5,t4),((t26,t27),((t3,t2),(((((t22,t21),(t19,t20)),(t18,t17)),t23),(((t24,t25),(t12,t13)),(t16,((t15,t14),(t11,((t9,t10),((t7,t6),t8)))))))))),t0); (t1,(((t3,t2),(t5,t4)),((((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t24,t25),(t12,t13)),(t11,((t9,t10),((t7,t6),t8)))),(t16,(t15,t14)))),(t26,t27))),t0); (t1,(t27,(((t26,(t3,t2)),(t5,t4)),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t12,t13),(t11,((t9,t10),((t7,t6),t8)))),(t16,(t15,t14))),(t24,t25))))),t0); (t1,((t5,t4),((t27,t26),((t3,t2),(((t12,t13),(t16,((t15,t14),(t11,((t9,t10),((t7,t6),t8)))))),((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23)))))),t0); (t1,((t3,t2),(((((((t22,t21),(t19,t20)),(t18,t17)),t23),(((t12,t13),((t24,t25),(t11,((t9,t10),((t7,t6),t8))))),((t15,t14),t16))),(t27,t26)),(t5,t4))),t0); (t1,((t3,t2),((t27,t26),((t5,t4),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((t24,t25),(((t12,t13),(t11,((t9,t10),((t7,t6),t8)))),(t16,(t15,t14)))))))),t0); (t1,(((t5,t4),(t27,t26)),((t16,((t14,t15),(((t24,t25),(t23,((t21,(t18,t17)),(t22,(t19,t20))))),((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13))))),(t2,t3))),t0); (t1,(((t2,t3),(t26,t27)),((t5,t4),(((t24,t25),(t23,((t18,t17),((t21,t22),(t19,t20))))),(((t11,((t10,t9),(t8,(t7,t6)))),(t14,t15)),((t12,t13),t16))))),t0); (t1,(((t2,t3),(t26,t27)),((t5,t4),((((t18,t17),((t21,t22),(t19,t20))),((t24,t25),t23)),((t16,(t14,t15)),((t12,t13),(t11,((t10,t9),(t8,(t7,t6))))))))),t0); (t1,((t2,t3),((((t24,t25),(t23,((t21,(t18,t17)),(t22,(t19,t20))))),(((t11,((t10,t9),(t8,(t7,t6)))),(t14,t15)),((t12,t13),t16))),((t5,t4),(t26,t27)))),t0); (t1,((t5,t4),(((t2,t3),(t26,t27)),(((t24,t25),(t23,((t18,t17),((t21,t22),(t19,t20))))),(((t11,((t10,t9),(t8,(t7,t6)))),(t14,t15)),((t12,t13),t16))))),t0); (t1,((((t23,(((t18,t17),((t21,t22),(t19,t20))),(t24,t25))),((t14,t15),(((t12,t13),t16),(t11,((t10,t9),(t8,(t7,t6))))))),(t2,t3)),((t5,t4),(t26,t27))),t0); (t1,((((t23,((t18,t17),((t21,t22),(t19,t20)))),((t16,(t14,t15)),(((t24,t25),(t12,t13)),(t11,((t10,t9),(t8,(t7,t6))))))),(t5,t4)),((t26,t27),(t2,t3))),t0); (t1,((((t23,((t18,t17),((t21,t22),(t19,t20)))),((t11,((t10,t9),(t8,(t7,t6)))),((t16,(t14,t15)),((t24,t25),(t12,t13))))),(t5,t4)),((t26,t27),(t2,t3))),t0); (t1,((t5,t4),(((t26,t27),(t2,t3)),(t16,(((t14,t15),((t12,t13),(t11,((t10,t9),(t8,(t7,t6)))))),((t24,t25),(t23,((t18,t17),((t21,t22),(t19,t20))))))))),t0); (t1,((t5,t4),(((t26,t27),(t2,t3)),((t23,((t18,t17),((t21,t22),(t19,t20)))),((t16,((t12,t13),((t11,((t10,t9),(t8,(t7,t6)))),(t24,t25)))),(t14,t15))))),t0); (t1,(((t2,t3),((t26,t27),((t23,((t17,t18),((t19,t20),(t22,t21)))),(((t14,t15),t16),((t11,((t9,t10),(t8,(t7,t6)))),((t12,t13),(t25,t24))))))),(t5,t4)),t0); (t1,((t2,t3),(((t26,t27),((((t25,t24),(t23,((t17,t18),(((t19,t20),t21),t22)))),((t11,((t9,t10),(t8,(t7,t6)))),((t14,t15),(t12,t13)))),t16)),(t5,t4))),t0); (t1,(((t26,t27),((t23,(((t17,t18),((t19,t20),(t21,t22))),(t25,t24))),(((t14,t15),(t11,((t9,t10),(t8,(t7,t6))))),(t16,(t12,t13))))),((t5,t4),(t2,t3))),t0); (t1,((t27,((((t25,t24),(t23,((t17,t18),((t19,t20),(t21,t22))))),((t16,(t14,t15)),((t11,((t9,t10),(t8,(t7,t6)))),(t12,t13)))),t26)),((t5,t4),(t2,t3))),t0); (t1,((t2,t3),((((t23,((t17,t18),((t19,t20),(t21,t22)))),(((t16,(t14,t15)),((t11,((t9,t10),(t8,(t7,t6)))),(t12,t13))),(t25,t24))),(t26,t27)),(t5,t4))),t0); (t1,((t2,t3),((((t23,((t17,t18),(t21,(t22,(t19,t20))))),((t16,(t14,t15)),((t11,((t9,t10),(t8,(t7,t6)))),((t25,t24),(t12,t13))))),(t26,t27)),(t5,t4))),t0); (t1,(((t2,t3),(t26,t27)),((t5,t4),((t23,((t17,t18),((t19,t20),(t21,t22)))),(t16,((t14,t15),((t11,((t9,t10),(t8,(t7,t6)))),((t25,t24),(t12,t13)))))))),t0); (t1,((t27,((t2,t3),t26)),((t5,t4),((((t23,(((t19,t20),t21),(t22,(t17,t18)))),(t25,t24)),((t12,t13),(t11,((t9,t10),(t8,(t7,t6)))))),(t16,(t14,t15))))),t0); (t1,(((((t23,(((t19,t20),(t22,t21)),(t17,t18))),(t25,t24)),((t12,t13),((t11,((t9,t10),(t8,(t7,t6)))),(t14,t15)))),t16),(((t2,t3),(t26,t27)),(t5,t4))),t0); (t1,((t2,t3),((((((t19,t20),(t22,t21)),(t17,t18)),((t25,t24),t23)),((t16,(t14,t15)),((t12,t13),(t11,((t9,t10),(t8,(t7,t6))))))),((t5,t4),(t26,t27)))),t0); ((((((t24,t25),(t11,((t9,t10),(t8,(t6,t7))))),((t15,t14),(t16,(t12,t13)))),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),((t5,t4),((t26,t27),(t2,t3)))),t1,t0); ((((t26,t27),(((t16,(t12,t13)),((t11,((t9,t10),(t8,(t6,t7)))),(t15,t14))),((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))))),((t2,t3),(t5,t4))),t1,t0); (((t2,t3),((t5,t4),((t26,t27),((t23,((t21,(t19,t20)),(t22,(t18,t17)))),(((t16,(t15,t14)),((t12,t13),(t11,((t9,t10),(t8,(t6,t7)))))),(t24,t25)))))),t1,t0); (((t5,t4),(((t2,t3),(t26,t27)),((t23,((t18,t17),((t19,t20),(t21,t22)))),((t15,t14),(t16,(((t11,((t9,t10),(t8,(t6,t7)))),(t24,t25)),(t12,t13))))))),t1,t0); (((t5,t4),(((t2,t3),(t26,t27)),((t23,((t18,t17),((t19,t20),(t21,t22)))),((((t11,((t9,t10),(t8,(t6,t7)))),(t24,t25)),(t15,t14)),(t16,(t12,t13)))))),t1,t0); ((((t26,t27),(((t24,t25),(((t18,t17),((t19,t20),(t21,t22))),t23)),(((t15,t14),t16),((t12,t13),(t11,((t9,t10),(t8,(t6,t7)))))))),((t5,t4),(t2,t3))),t1,t0); (((t2,t3),((((t24,t25),(((t18,t17),((t19,t20),(t21,t22))),t23)),((t12,t13),((t11,((t9,t10),(t8,(t6,t7)))),((t15,t14),t16)))),((t26,t27),(t5,t4)))),t1,t0); ((((t26,t27),((((t24,t25),(((t18,t17),((t19,t20),(t21,t22))),t23)),((t15,t14),((t12,t13),(t11,((t9,t10),(t8,(t6,t7))))))),t16)),((t5,t4),(t2,t3))),t1,t0); (((t2,t3),(((t26,t27),((((t18,t17),((t19,t20),(t21,t22))),t23),((t16,(t12,t13)),((t15,t14),((t24,t25),(t11,((t9,t10),(t8,(t6,t7))))))))),(t5,t4))),t1,t0); (((t2,t3),(((t26,t27),((((t18,t17),((t19,t20),(t21,t22))),t23),(((t24,t25),(t11,((t9,t10),(t8,(t6,t7))))),((t16,(t12,t13)),(t15,t14))))),(t5,t4))),t1,t0); (((t2,t3),(t27,((t5,t4),(t26,((t16,((t14,t15),((t24,t25),((t12,t13),(t11,((t9,t10),(t8,(t7,t6)))))))),(t23,((t18,t17),((t22,t21),(t19,t20))))))))),t1,t0); ((((((t12,t13),t16),((t11,((t9,t10),(t8,(t7,t6)))),(t14,t15))),((t24,t25),(t23,((t18,t17),(t22,(t21,(t19,t20))))))),(((t2,t3),(t26,t27)),(t5,t4))),t1,t0); (((t2,t3),(((t26,t27),(((((t12,t13),t16),((t11,((t9,t10),(t8,(t7,t6)))),(t14,t15))),(t24,t25)),(t23,((t18,t17),((t19,t20),(t22,t21)))))),(t5,t4))),t1,t0); (((t2,t3),(((t26,t27),(((t16,(t14,t15)),((t11,((t9,t10),(t8,(t7,t6)))),((t24,t25),(t12,t13)))),(t23,((t18,t17),((t19,t20),(t22,t21)))))),(t5,t4))),t1,t0); (((t2,t3),(((t26,t27),((((t12,t13),(t11,((t9,t10),(t8,(t7,t6))))),((t14,t15),t16)),((t24,t25),(t23,((t18,t17),((t19,t20),(t22,t21))))))),(t5,t4))),t1,t0); (((t2,t3),(((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),((((t11,((t9,t10),(t8,(t7,t6)))),((t12,t13),(t24,t25))),(t14,t15)),t16))),(t5,t4))),t1,t0); (((t2,t3),(((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),(((t14,t15),((t11,((t9,t10),(t8,(t7,t6)))),(t24,t25))),((t12,t13),t16)))),(t5,t4))),t1,t0); ((((t26,t27),((t23,((t24,t25),((t18,t17),((t19,t20),(t22,t21))))),(t16,((t11,((t9,t10),(t8,(t7,t6)))),((t14,t15),(t12,t13)))))),((t5,t4),(t2,t3))),t1,t0); ((((t26,t27),(t2,t3)),((((t24,t25),(((t18,t17),((t19,t20),(t22,t21))),t23)),((t11,((t9,t10),(t8,(t7,t6)))),((t14,t15),(t16,(t12,t13))))),(t5,t4))),t1,t0); ((((t5,t4),((t26,t27),(((t24,t25),(((t18,t17),(t22,(t21,(t19,t20)))),t23)),((t12,t13),((t16,(t11,((t9,t10),(t8,(t7,t6))))),(t14,t15)))))),(t2,t3)),t1,t0); ((((t27,t26),((t23,((t18,t17),((t20,t19),(t22,t21)))),((t16,(t14,t15)),((t12,t13),((t11,((t10,t9),(t8,(t7,t6)))),(t24,t25)))))),((t5,t4),(t2,t3))),t1,t0); (((((t2,t3),(t27,t26)),(((t24,t25),(t23,((t18,t17),((t20,t19),(t22,t21))))),((t16,(t14,t15)),((t12,t13),(t11,((t10,t9),(t8,(t7,t6)))))))),(t5,t4)),t1,t0); ((((((t24,t25),(t23,((t18,t17),((t20,t19),(t22,t21))))),((t11,((t10,t9),(t8,(t7,t6)))),((t14,t15),(t12,t13)))),t16),(((t5,t4),(t2,t3)),(t27,t26))),t1,t0); (((t5,t4),((t2,t3),((t27,t26),((t23,((t18,t17),((t20,t19),(t22,t21)))),(((t12,t13),((t24,t25),(t11,((t10,t9),(t8,(t7,t6)))))),(t16,(t14,t15))))))),t1,t0); (((((t23,((t18,t17),((t20,t19),(t22,t21)))),(t16,((t14,t15),((t11,((t10,t9),(t8,(t7,t6)))),((t12,t13),(t24,t25)))))),(t5,t4)),((t2,t3),(t27,t26))),t1,t0); ((((((t24,t25),(t23,((t18,t17),((t20,t19),(t22,t21))))),(((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13)),(t16,(t14,t15)))),(t5,t4)),(t27,(t26,(t2,t3)))),t1,t0); ((((t27,t26),((t16,(t14,t15)),((((t18,t17),((t20,t19),(t22,t21))),((t24,t25),t23)),((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13))))),((t2,t3),(t5,t4))),t1,t0); ((((t27,t26),((((t24,t25),(t23,((t18,t17),((t20,t19),(t22,t21))))),(((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13)),(t14,t15))),t16)),((t2,t3),(t5,t4))),t1,t0); (((((t2,t3),(t27,t26)),(((t14,t15),(((t24,t25),(t23,((t18,t17),((t20,t19),(t22,t21))))),((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13)))),t16)),(t5,t4)),t1,t0); ((((((t23,((t18,t17),((t20,t19),(t22,t21)))),((t14,t15),(t16,((t11,((t10,t9),(t8,(t7,t6)))),((t24,t25),(t12,t13)))))),(t2,t3)),(t27,t26)),(t5,t4)),t1,t0); (((t2,t3),(((((t25,t24),(((t20,t19),(t21,t22)),(t17,t18))),t23),((t26,t27),(t5,t4))),((t13,t12),((t16,(t14,t15)),(((t8,(t6,t7)),(t9,t10)),t11))))),t1,t0); (((t2,t3),((t5,t4),((((((t13,t12),(((t8,(t6,t7)),(t9,t10)),t11)),(t14,t15)),((t25,t24),((((t20,t19),(t21,t22)),(t17,t18)),t23))),t16),(t26,t27)))),t1,t0); (((((((t13,t12),(((t8,(t6,t7)),(t9,t10)),t11)),(t16,(t14,t15))),(t23,((t25,t24),(((t20,t19),(t21,t22)),(t17,t18))))),(t26,t27)),((t2,t3),(t5,t4))),t1,t0); ((((((t16,((((t8,(t6,t7)),(t9,t10)),t11),((t13,t12),(t25,t24)))),(t14,t15)),((((t20,t19),(t21,t22)),(t17,t18)),t23)),(t26,t27)),((t2,t3),(t5,t4))),t1,t0); ((((t2,t3),((((t13,t12),(((t8,(t6,t7)),(t9,t10)),t11)),((t14,t15),t16)),((t25,t24),(((t20,t19),((t21,t22),(t17,t18))),t23)))),((t26,t27),(t5,t4))),t1,t0); ((((t2,t3),(t5,t4)),((((((t8,(t6,t7)),(t9,t10)),t11),((t14,t15),((t13,t12),t16))),((t25,t24),((((t22,t21),(t20,t19)),(t17,t18)),t23))),(t26,t27))),t1,t0); ((((t2,t3),((((t14,t15),(((t25,t24),(t13,t12)),(((t8,(t6,t7)),(t9,t10)),t11))),t16),((((t22,t21),(t20,t19)),(t17,t18)),t23))),((t26,t27),(t5,t4))),t1,t0); ((((t2,t3),((((t13,t12),(((t8,(t6,t7)),(t9,t10)),t11)),(t16,(t14,t15))),(((t25,t24),((t21,((t20,t19),t22)),(t17,t18))),t23))),(t27,((t5,t4),t26))),t1,t0); (((t5,t4),(((t26,t27),(t2,t3)),((t16,((t14,t15),(((t25,t24),(t13,t12)),(((t8,(t6,t7)),(t9,t10)),t11)))),((((t20,t19),(t22,t21)),(t17,t18)),t23)))),t1,t0); ((t27,(((t2,t3),t26),(((((((t8,(t6,t7)),(t9,t10)),t11),(t25,t24)),(((t13,t12),t16),(t14,t15))),((((t20,t19),(t22,t21)),(t17,t18)),t23)),(t5,t4)))),t1,t0); (t1,(((t23,((t18,t17),((t21,t22),(t20,t19)))),(((t14,t15),((t11,((t8,(t6,t7)),(t10,t9))),((t25,t24),(t13,t12)))),t16)),((t5,t4),(t27,((t3,t2),t26)))),t0); (t1,((t5,t4),(((t3,t2),(t26,t27)),((t23,((t18,t17),((t21,t22),(t20,t19)))),(((t11,((t8,(t6,t7)),(t10,t9))),((t13,t12),(t14,t15))),((t25,t24),t16))))),t0); (t1,(((t5,t4),(t3,t2)),((t26,t27),((t23,((t18,t17),((t21,t22),(t20,t19)))),(t16,((t14,t15),((t11,((t8,(t6,t7)),(t10,t9))),((t25,t24),(t13,t12)))))))),t0); (t1,((t3,t2),(((t26,t27),(((t25,t24),(t23,((t18,t17),((t21,t22),(t20,t19))))),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),(t16,(t14,t15))))),(t5,t4))),t0); (t1,((t5,t4),((t3,t2),((t26,t27),((((t18,t17),((t21,t22),(t20,t19))),((t25,t24),t23)),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),(t16,(t14,t15))))))),t0); (t1,((t3,t2),(((t5,t4),(t26,t27)),(((t25,t24),(t23,((t18,t17),((t21,t22),(t20,t19))))),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),(t16,(t14,t15)))))),t0); (t1,(((t23,((t18,t17),((t21,t22),(t20,t19)))),((t14,t15),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),((t25,t24),t16)))),((t5,t4),((t3,t2),(t26,t27)))),t0); (t1,((t16,((((t23,((t18,t17),((t21,t22),(t20,t19)))),(t25,t24)),((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12))),(t14,t15))),((t3,t2),((t26,t27),(t5,t4)))),t0); (t1,((t16,((t23,((t18,t17),((t21,t22),(t20,t19)))),(((t11,((t8,(t6,t7)),(t10,t9))),((t25,t24),(t13,t12))),(t14,t15)))),((t5,t4),((t3,t2),(t26,t27)))),t0); (t1,(((t3,t2),(t26,t27)),(((t23,((t18,t17),((t21,t22),(t20,t19)))),(((t25,t24),(t13,t12)),((t16,(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9)))))),(t5,t4))),t0); (t1,((t2,t3),((((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t12,t13),(((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),(t15,t14))),t16)),(t27,t26)),(t5,t4))),t0); (t1,((((t23,((t17,t18),((t22,t21),(t20,t19)))),((t15,t14),((((t24,t25),(t12,t13)),(t11,((t8,(t7,t6)),(t10,t9)))),t16))),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,(((t2,t3),(t27,t26)),((t5,t4),((t23,((t17,t18),((t22,t21),(t20,t19)))),((((t24,t25),(t12,t13)),(t11,((t8,(t7,t6)),(t10,t9)))),(t16,(t15,t14)))))),t0); (t1,((((t24,t25),(t23,((t17,t18),((t22,t21),(t20,t19))))),((t12,t13),((t11,((t8,(t7,t6)),(t10,t9))),(t16,(t15,t14))))),(((t2,t3),(t27,t26)),(t5,t4))),t0); (t1,(((((t24,t25),(t23,((t17,t18),((t22,t21),(t20,t19))))),((t16,(t15,t14)),((t12,t13),(t11,((t8,(t7,t6)),(t10,t9)))))),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,(((((t24,t25),(t23,((t17,t18),((t22,t21),(t20,t19))))),((t16,(t15,t14)),((t12,t13),(t11,((t8,(t7,t6)),(t10,t9)))))),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,(((((t24,t25),(t23,((t17,t18),((t22,t21),(t20,t19))))),(((t12,t13),t16),((t15,t14),(t11,((t8,(t7,t6)),(t10,t9)))))),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,((((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t12,t13),t16),((t15,t14),((t24,t25),(t11,((t8,(t7,t6)),(t10,t9))))))),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,((t5,t4),(((t2,t3),((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t15,t14),t16),(((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),(t12,t13))))),(t27,t26))),t0); (t1,(((t2,t3),((t23,((t17,t18),((t22,t21),(t20,t19)))),((((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),((t12,t13),(t15,t14))),t16))),((t27,t26),(t5,t4))),t0); (t1,((((((t18,t17),((t20,t19),(t21,t22))),t23),(t16,(((t24,t25),(((((t7,t6),t8),(t9,t10)),t11),(t13,t12))),(t14,t15)))),(t27,t26)),((t4,t5),(t2,t3))),t0); (t1,((((((t18,t17),(t22,((t20,t19),t21))),t23),(((t13,t12),(t24,t25)),((((((t7,t6),t8),(t9,t10)),t11),(t14,t15)),t16))),(t27,t26)),((t4,t5),(t2,t3))),t0); (t1,((t2,t3),((((((t18,t17),((t20,t19),(t21,t22))),t23),((t14,t15),(t16,(((((t7,t6),t8),(t9,t10)),t11),((t24,t25),(t13,t12)))))),(t27,t26)),(t4,t5))),t0); (t1,((t4,t5),((((t24,t25),(((t18,t17),((t20,t19),(t21,t22))),t23)),(((t13,t12),t16),(((((t7,t6),t8),(t9,t10)),t11),(t14,t15)))),((t2,t3),(t27,t26)))),t0); (t1,(((t4,t5),(t2,t3)),((t27,t26),((((t18,t17),((t20,t19),(t21,t22))),t23),(((t24,t25),(t13,t12)),(((((t7,t6),t8),(t9,t10)),t11),(t16,(t14,t15))))))),t0); (t1,((((t24,t25),(((t18,t17),((t20,t19),(t21,t22))),t23)),((t16,(t14,t15)),((t13,t12),((((t7,t6),t8),(t9,t10)),t11)))),((t4,t5),((t2,t3),(t27,t26)))),t0); (t1,((t4,t5),(((t2,t3),(t27,t26)),((t23,((t24,t25),((t18,t17),((t20,t19),(t21,t22))))),((t16,(t14,t15)),((t13,t12),((((t7,t6),t8),(t9,t10)),t11)))))),t0); (t1,((t2,t3),(((t27,t26),(t4,t5)),(((t24,t25),(((t18,t17),((t20,t19),(t21,t22))),t23)),(((((t7,t6),t8),(t9,t10)),t11),(t16,((t14,t15),(t13,t12))))))),t0); (t1,(((t26,(t4,t5)),(((((t24,t25),(((t18,t17),((t20,t19),(t21,t22))),t23)),(((((t7,t6),t8),(t9,t10)),t11),((t14,t15),(t13,t12)))),t16),(t2,t3))),t27),t0); (t1,((((((t18,t17),((t20,t19),(t21,t22))),t23),(((t14,t15),((t24,t25),((((t7,t6),t8),(t9,t10)),t11))),(t16,(t13,t12)))),(t2,t3)),((t26,t27),(t4,t5))),t0); (t1,(((t26,t27),(((((t21,t22),(t19,t20)),(t17,t18)),t23),(((t12,t13),((t24,t25),(t11,((t10,t9),(t8,(t6,t7)))))),((t14,t15),t16)))),((t3,t2),(t5,t4))),t0); (t1,((t3,t2),((t5,t4),((t26,t27),((((t24,t25),((((t21,t22),(t19,t20)),(t17,t18)),t23)),((t11,((t10,t9),(t8,(t6,t7)))),((t14,t15),(t12,t13)))),t16)))),t0); (t1,(((t3,t2),(((t24,t25),(((t22,((t19,t20),t21)),(t17,t18)),t23)),((t11,((t10,t9),(t8,(t6,t7)))),((t14,t15),(t16,(t12,t13)))))),((t5,t4),(t26,t27))),t0); (t1,((t5,t4),((t26,t27),((t3,t2),(((((t19,t20),(t21,t22)),(t17,t18)),t23),((t16,(t12,t13)),(((t24,t25),(t11,((t10,t9),(t8,(t6,t7))))),(t14,t15))))))),t0); (t1,((t3,t2),((t5,t4),((((t24,t25),((((t19,t20),(t21,t22)),(t17,t18)),t23)),(((t14,t15),t16),((t12,t13),(t11,((t10,t9),(t8,(t6,t7))))))),(t26,t27)))),t0); (t1,(((t3,t2),(t26,t27)),((t5,t4),((((((t19,t20),(t21,t22)),(t17,t18)),t23),((t14,t15),(((t24,t25),(t12,t13)),(t11,((t10,t9),(t8,(t6,t7))))))),t16))),t0); (t1,((t3,t2),((((t24,t25),((((t19,t20),(t21,t22)),(t17,t18)),t23)),((t16,(t14,t15)),((t12,t13),(t11,((t10,t9),(t8,(t6,t7))))))),((t26,t27),(t5,t4)))),t0); (t1,(((t3,t2),(t26,t27)),((t5,t4),(((t24,t25),((((t19,t20),(t21,t22)),(t17,t18)),t23)),(((t12,t13),t16),((t14,t15),(t11,((t10,t9),(t8,(t6,t7))))))))),t0); (t1,(((t26,t27),((t3,t2),(t5,t4))),(((t24,t25),((((t19,t20),(t21,t22)),(t17,t18)),t23)),(((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13)),((t14,t15),t16)))),t0); (t1,((t5,t4),((((((t19,t20),(t21,t22)),(t17,t18)),t23),((((t24,t25),(t11,((t10,t9),(t8,(t6,t7))))),(t12,t13)),((t14,t15),t16))),((t3,t2),(t26,t27)))),t0); ((((((t24,t25),(((t18,t17),((t22,t21),(t19,t20))),t23)),((t13,t12),(((t14,t15),t16),(t11,(((t6,t7),t8),(t10,t9)))))),(t27,t26)),((t2,t3),(t4,t5))),t1,t0); ((((t27,t26),(t4,t5)),((((t24,t25),(((t18,t17),((t22,t21),(t19,t20))),t23)),(((t14,t15),t16),((t11,(((t6,t7),t8),(t10,t9))),(t13,t12)))),(t2,t3))),t1,t0); (((t2,t3),(((((t24,t25),(((t18,t17),((t22,t21),(t19,t20))),t23)),(((t14,t15),t16),((t11,(((t6,t7),t8),(t10,t9))),(t13,t12)))),(t26,t27)),(t4,t5))),t1,t0); (((t4,t5),((t2,t3),((((t14,t15),t16),(((t11,(((t6,t7),t8),(t10,t9))),(t13,t12)),((t24,t25),(((t18,t17),((t22,t21),(t19,t20))),t23)))),(t26,t27)))),t1,t0); (((t2,t3),(((((t24,t25),(((t18,t17),((t22,t21),(t19,t20))),t23)),((t14,t15),(t16,((t11,(((t6,t7),t8),(t10,t9))),(t13,t12))))),(t26,t27)),(t4,t5))),t1,t0); (((t4,t5),((t2,t3),(((((t18,t17),((t22,t21),(t19,t20))),t23),(((t14,t15),t16),((t13,t12),((t11,(((t6,t7),t8),(t10,t9))),(t24,t25))))),(t26,t27)))),t1,t0); ((((((t16,(t13,t12)),((t14,t15),(t11,(((t6,t7),t8),(t10,t9))))),((((t18,t17),((t22,t21),(t19,t20))),t23),(t24,t25))),(t26,t27)),((t4,t5),(t2,t3))),t1,t0); (((t2,t3),(((((t18,t17),((t22,t21),(t19,t20))),t23),((t14,t15),(t16,((t13,t12),((t11,(((t6,t7),t8),(t10,t9))),(t24,t25)))))),((t26,t27),(t4,t5)))),t1,t0); ((((t4,t5),((((t24,t25),(t23,((t18,t17),((t22,t21),(t19,t20))))),(((t14,t15),(t16,(t13,t12))),(t11,(((t6,t7),t8),(t10,t9))))),t26)),(t27,(t2,t3))),t1,t0); (((t4,t5),((((t23,(((t18,t17),((t22,t21),(t19,t20))),(t24,t25))),(((t13,t12),(t11,(((t6,t7),t8),(t10,t9)))),(t16,(t14,t15)))),(t26,t27)),(t2,t3))),t1,t0); (t1,((t3,t2),((((t25,t24),(((t18,t17),((t21,t22),(t19,t20))),t23)),((t16,(t13,t12)),((((t9,t10),(t8,(t6,t7))),t11),(t15,t14)))),((t4,t5),(t27,t26)))),t0); (t1,((((((t18,t17),((t21,t22),(t19,t20))),t23),((t16,(t13,t12)),(((t25,t24),(((t9,t10),(t8,(t6,t7))),t11)),(t15,t14)))),(t27,t26)),((t3,t2),(t4,t5))),t0); (t1,((t4,t5),((((t25,t24),(((t18,t17),((t21,t22),(t19,t20))),t23)),(((t13,t12),(((t9,t10),(t8,(t6,t7))),t11)),((t15,t14),t16))),((t27,t26),(t3,t2)))),t0); (t1,(((t4,t5),(t3,t2)),((((t25,t24),(((t18,t17),((t21,t22),(t19,t20))),t23)),(((t13,t12),(((t9,t10),(t8,(t6,t7))),t11)),((t15,t14),t16))),(t27,t26))),t0); (t1,((t4,t5),((((t25,t24),(((t18,t17),((t21,t22),(t19,t20))),t23)),(((t13,t12),(((t9,t10),(t8,(t6,t7))),t11)),((t15,t14),t16))),((t3,t2),(t27,t26)))),t0); (t1,((t4,t5),((t27,(t26,((((t18,t17),((t21,t22),(t19,t20))),t23),(((t25,t24),t16),((((t9,t10),(t8,(t6,t7))),t11),((t13,t12),(t15,t14))))))),(t3,t2))),t0); (t1,((t3,t2),((t4,t5),((((t16,(t13,t12)),((t15,t14),(((t9,t10),(t8,(t6,t7))),t11))),((((t18,t17),((t21,t22),(t19,t20))),t23),(t25,t24))),(t27,t26)))),t0); (t1,((t4,t5),(((((t15,t14),((((t9,t10),(t8,(t6,t7))),t11),((t25,t24),(t13,t12)))),(((t18,t17),((t21,t22),(t19,t20))),t23)),t16),((t27,t26),(t3,t2)))),t0); (t1,(((((t25,t24),(t13,t12)),((t16,(t15,t14)),(((t9,t10),(t8,(t6,t7))),t11))),(((t18,t17),((t21,t22),(t19,t20))),t23)),(((t27,t26),(t3,t2)),(t4,t5))),t0); (t1,(((((t16,(t15,t14)),((((t9,t10),(t8,(t6,t7))),t11),(t13,t12))),((t25,t24),(((t18,t17),((t21,t22),(t19,t20))),t23))),(t3,t2)),((t4,t5),(t27,t26))),t0); (((t5,t4),((((t25,t24),(t23,((t18,t17),((t19,t20),(t22,t21))))),((t16,(t15,t14)),((t12,t13),(t11,((t10,t9),((t7,t6),t8)))))),((t3,t2),(t26,t27)))),t1,t0); (((t3,t2),(((t5,t4),(t26,t27)),((t16,(t15,t14)),(((t12,t13),(t11,((t10,t9),((t7,t6),t8)))),((t25,t24),(t23,((t18,t17),((t19,t20),(t22,t21))))))))),t1,t0); (((t5,t4),(((t3,t2),(t26,t27)),(((t25,t24),(t23,(((t18,t17),((t19,t20),t21)),t22))),((t16,((t15,t14),(t11,((t10,t9),((t7,t6),t8))))),(t12,t13))))),t1,t0); ((((t3,t2),(t26,t27)),((((t25,t24),(t23,((t18,t17),((t19,t20),(t22,t21))))),((t11,((t10,t9),((t7,t6),t8))),(((t12,t13),t16),(t15,t14)))),(t5,t4))),t1,t0); ((((t3,t2),(t5,t4)),((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),((((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),(t16,(t15,t14))),(t25,t24))))),t1,t0); (((t5,t4),(((t3,t2),(t26,t27)),((t23,((t18,t17),((t19,t20),(t22,t21)))),(((t15,t14),((t11,((t10,t9),((t7,t6),t8))),((t25,t24),(t12,t13)))),t16)))),t1,t0); ((((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),(((t25,t24),(t12,t13)),((t16,(t15,t14)),(t11,((t10,t9),((t7,t6),t8))))))),((t5,t4),(t3,t2))),t1,t0); ((((t26,((t23,((t18,t17),((t19,t20),(t22,t21)))),(((t25,t24),(t12,t13)),((t16,(t15,t14)),(t11,((t10,t9),((t7,t6),t8))))))),((t5,t4),(t3,t2))),t27),t1,t0); ((((((t23,((t18,t17),((t19,t20),(t22,t21)))),(t25,t24)),((t12,t13),((t16,(t15,t14)),(t11,((t10,t9),((t7,t6),t8)))))),((t27,t26),(t3,t2))),(t5,t4)),t1,t0); ((((t5,t4),(t3,t2)),(((t23,((t18,t17),((t19,t20),(t22,t21)))),((t25,t24),((t12,t13),((t16,(t15,t14)),(t11,((t10,t9),((t7,t6),t8))))))),(t27,t26))),t1,t0); (((t5,t4),((t26,t27),(((((((t9,t10),((t6,t7),t8)),t11),(t12,t13)),(t16,(t14,t15))),((((t18,t17),((t20,t19),(t22,t21))),t23),(t25,t24))),(t2,t3)))),t1,t0); (((t2,t3),(((t5,t4),(t26,t27)),(t16,((t14,t15),(((((t18,t17),((t20,t19),(t22,t21))),t23),(t25,t24)),((((t9,t10),((t6,t7),t8)),t11),(t12,t13))))))),t1,t0); (((t5,t4),(((((t25,t24),(((t9,t10),((t6,t7),t8)),t11)),(((t12,t13),(t14,t15)),t16)),(((t18,t17),((t20,t19),(t22,t21))),t23)),((t26,t27),(t2,t3)))),t1,t0); ((((t5,t4),((t27,t26),((((t18,t17),((t20,t19),(t22,t21))),t23),((((t25,t24),(((t9,t10),((t6,t7),t8)),t11)),(t12,t13)),(t16,(t14,t15)))))),(t2,t3)),t1,t0); ((((t5,t4),((t27,t26),((((t18,t17),((t20,t19),(t22,t21))),t23),(t16,((t14,t15),(((t25,t24),(((t9,t10),((t6,t7),t8)),t11)),(t12,t13))))))),(t2,t3)),t1,t0); (((t5,t4),((t27,t26),((t2,t3),((((t18,t17),((t20,t19),(t22,t21))),t23),(((t14,t15),((t25,t24),(((t9,t10),((t6,t7),t8)),t11))),(t16,(t12,t13))))))),t1,t0); ((((t2,t3),((((t18,t17),((t20,t19),(t22,t21))),t23),((t16,(t14,t15)),(((t12,t13),(t25,t24)),(((t9,t10),((t6,t7),t8)),t11))))),((t5,t4),(t27,t26))),t1,t0); ((((t5,t4),((t27,t26),((((t18,t17),((t20,t19),(t22,t21))),t23),((t16,(t14,t15)),(((t12,t13),(t25,t24)),(((t9,t10),((t6,t7),t8)),t11)))))),(t2,t3)),t1,t0); ((((t5,t4),((((t18,t17),((t20,t19),(t22,t21))),t23),(((t16,(t14,t15)),((((t9,t10),((t6,t7),t8)),t11),(t12,t13))),(t25,t24)))),((t27,t26),(t2,t3))),t1,t0); (((t5,t4),(((((t18,t17),(t22,(t21,(t20,t19)))),t23),(t16,((t14,t15),((((t9,t10),((t6,t7),t8)),t11),((t25,t24),(t12,t13)))))),((t27,t26),(t2,t3)))),t1,t0); ((((t26,((t4,t5),(((((t24,t25),(t12,t13)),((t15,t14),(t11,((t8,(t7,t6)),(t10,t9))))),(t23,((t18,t17),((t22,t21),(t20,t19))))),t16))),t27),(t3,t2)),t1,t0); (((t4,t5),(((t16,(((t12,t13),(t15,t14)),(t11,((t8,(t7,t6)),(t10,t9))))),((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19)))))),((t27,t26),(t3,t2)))),t1,t0); ((((t16,((t15,t14),((t11,((t8,(t7,t6)),(t10,t9))),(t12,t13)))),((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19)))))),(((t27,t26),(t3,t2)),(t4,t5))),t1,t0); ((((t27,t26),(t3,t2)),((t4,t5),((t16,(((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),((t12,t13),(t15,t14)))),(t23,((t18,t17),((t22,t21),(t20,t19))))))),t1,t0); ((((t4,t5),((((t16,(t15,t14)),(((t11,((t8,(t7,t6)),(t10,t9))),(t12,t13)),(t24,t25))),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t27,t26))),(t3,t2)),t1,t0); (((t4,t5),(((t16,((t15,t14),((t11,((t8,(t7,t6)),(t10,t9))),(t12,t13)))),((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19)))))),((t3,t2),(t27,t26)))),t1,t0); (((t3,t2),(((t27,t26),(((t15,t14),(((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),((t12,t13),t16))),(t23,((t18,t17),((t22,t21),(t20,t19)))))),(t4,t5))),t1,t0); (((t3,t2),((t27,(t26,((((t11,((t8,(t7,t6)),(t10,t9))),(t12,t13)),(t16,(t15,t14))),((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19)))))))),(t4,t5))),t1,t0); (((t4,t5),((t3,t2),(((t23,((t18,t17),((t22,t21),(t20,t19)))),(((t12,t13),((t11,((t8,(t7,t6)),(t10,t9))),(t24,t25))),(t16,(t15,t14)))),(t27,t26)))),t1,t0); (((t3,t2),(((t23,((t18,t17),((t22,t21),(t20,t19)))),(((((t12,t13),(t11,((t8,(t7,t6)),(t10,t9)))),t16),(t15,t14)),(t24,t25))),((t4,t5),(t27,t26)))),t1,t0); (t1,(((t5,t4),(t26,t27)),((t3,t2),(((t25,t24),((((t22,t21),(t20,t19)),(t18,t17)),t23)),((t16,(t15,t14)),((t12,t13),(t11,((t8,(t7,t6)),(t10,t9)))))))),t0); (t1,(((t5,t4),(t26,t27)),((t3,t2),(((((t22,t21),(t20,t19)),(t18,t17)),t23),((t16,(t15,t14)),((t12,t13),((t25,t24),(t11,((t8,(t7,t6)),(t10,t9))))))))),t0); (t1,(((t5,t4),((((t11,((t8,(t7,t6)),(t10,t9))),(t16,(t15,t14))),(t12,t13)),(((((t22,t21),(t20,t19)),(t18,t17)),t23),(t25,t24)))),((t26,t27),(t3,t2))),t0); (t1,((t3,t2),((t5,t4),(t27,(t26,(((t15,t14),(((t11,((t8,(t7,t6)),(t10,t9))),((t25,t24),(t12,t13))),t16)),((((t22,t21),(t20,t19)),(t18,t17)),t23)))))),t0); (t1,((t5,t4),((((((t11,((t8,(t7,t6)),(t10,t9))),(t12,t13)),(t16,(t15,t14))),((t25,t24),((((t22,t21),(t20,t19)),(t18,t17)),t23))),(t27,t26)),(t3,t2))),t0); (t1,((t3,t2),((t5,t4),((((((t22,t21),(t20,t19)),(t18,t17)),t23),((t16,((t15,t14),((t11,((t8,(t7,t6)),(t10,t9))),(t12,t13)))),(t25,t24))),(t27,t26)))),t0); (t1,(((t3,t2),(t27,t26)),((t5,t4),((((t12,t13),((t15,t14),(t11,((t8,(t7,t6)),(t10,t9))))),((t25,t24),((((t22,t21),(t20,t19)),(t18,t17)),t23))),t16))),t0); (t1,((((((t12,t13),(t11,((t8,(t7,t6)),(t10,t9)))),(t16,(t15,t14))),((t25,t24),((((t22,t21),(t20,t19)),(t18,t17)),t23))),((t27,t26),(t5,t4))),(t3,t2)),t0); (t1,((t5,t4),((((((t25,t24),(t12,t13)),(t11,((t8,(t7,t6)),(t10,t9)))),(t16,(t15,t14))),((((t22,t21),(t20,t19)),(t18,t17)),t23)),((t3,t2),(t27,t26)))),t0); (t1,((((((t25,t24),(t12,t13)),(t11,((t8,(t7,t6)),(t10,t9)))),(t16,(t15,t14))),((((t22,t21),(t20,t19)),(t18,t17)),t23)),(((t3,t2),(t27,t26)),(t5,t4))),t0); (((t5,t4),((((t16,(t14,t15)),((t13,t12),(t11,((t8,(t7,t6)),(t9,t10))))),(((t25,t24),(((t19,t20),(t22,t21)),(t17,t18))),t23)),((t3,t2),(t27,t26)))),t1,t0); (((((t16,((t25,t24),(t13,t12))),((t11,((t8,(t7,t6)),(t9,t10))),(t14,t15))),((((t19,t20),(t22,t21)),(t17,t18)),t23)),((t3,t2),((t27,t26),(t5,t4)))),t1,t0); (((t5,t4),((t3,t2),(((t16,(((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),(t14,t15))),((t25,t24),((((t19,t20),(t22,t21)),(t17,t18)),t23))),(t27,t26)))),t1,t0); (((t5,t4),((t16,((((t25,t24),((((t19,t20),(t22,t21)),(t17,t18)),t23)),((t13,t12),(t11,((t8,(t7,t6)),(t9,t10))))),(t14,t15))),((t27,t26),(t3,t2)))),t1,t0); (((t3,t2),(((((((t19,t20),(t22,t21)),(t17,t18)),t23),(((t13,t12),((t11,((t8,(t7,t6)),(t9,t10))),(t25,t24))),((t14,t15),t16))),(t27,t26)),(t5,t4))),t1,t0); (((t5,t4),((((((t19,t20),(t22,t21)),(t17,t18)),t23),(t16,(((t25,t24),(t13,t12)),((t14,t15),(t11,((t8,(t7,t6)),(t9,t10))))))),((t3,t2),(t27,t26)))),t1,t0); (((((((t19,t20),(t22,t21)),(t17,t18)),t23),(t16,((t14,t15),((t25,t24),((t11,((t8,(t7,t6)),(t9,t10))),(t13,t12)))))),((t3,t2),((t27,t26),(t5,t4)))),t1,t0); (((t3,t2),(((t27,t26),(((t25,t24),((((t19,t20),(t22,t21)),(t17,t18)),t23)),(((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),(t16,(t14,t15))))),(t5,t4))),t1,t0); ((((t27,t26),(((((t25,t24),(((t19,t20),(t22,t21)),(t17,t18))),(((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),(t14,t15))),t23),t16)),((t5,t4),(t3,t2))),t1,t0); (((((t3,t2),(t27,t26)),(t16,((t14,t15),(((t25,t24),(t23,(((t19,t20),(t22,t21)),(t17,t18)))),((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))))))),(t5,t4)),t1,t0); (t1,((t5,t4),(((t27,t26),((t16,((t14,t15),((t13,t12),(t11,((t10,t9),(t8,(t6,t7))))))),(t23,(((t17,t18),((t22,t21),(t20,t19))),(t25,t24))))),(t3,t2))),t0); (t1,((((t16,(t14,t15)),(((t25,t24),(t23,((t17,t18),((t22,t21),(t20,t19))))),((t13,t12),(t11,((t10,t9),(t8,(t6,t7))))))),(t3,t2)),((t5,t4),(t27,t26))),t0); (t1,((((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t11,((t10,t9),(t8,(t6,t7)))),((t25,t24),(t13,t12))),(t16,(t14,t15)))),(t3,t2)),(t27,(t26,(t5,t4)))),t0); (t1,((((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t25,t24),((t11,((t10,t9),(t8,(t6,t7)))),(t13,t12))),(t16,(t14,t15)))),((t27,t26),(t3,t2))),(t5,t4)),t0); (t1,((((t23,((t17,t18),((t22,t21),(t20,t19)))),((((t13,t12),((t25,t24),(t11,((t10,t9),(t8,(t6,t7)))))),(t14,t15)),t16)),(t27,t26)),((t5,t4),(t3,t2))),t0); (t1,(((((t25,t24),(t23,((t17,t18),((t22,t21),(t20,t19))))),((t16,(t13,t12)),((t11,((t10,t9),(t8,(t6,t7)))),(t14,t15)))),((t27,t26),(t3,t2))),(t5,t4)),t0); (t1,(((((t25,t24),(t23,((t17,t18),((t22,t21),(t20,t19))))),((t16,(t13,t12)),((t11,((t10,t9),(t8,(t6,t7)))),(t14,t15)))),((t27,t26),(t3,t2))),(t5,t4)),t0); (t1,((t3,t2),((((t23,((t17,t18),((t22,t21),(t20,t19)))),((t16,(t13,t12)),(((t25,t24),(t11,((t10,t9),(t8,(t6,t7))))),(t14,t15)))),(t27,t26)),(t5,t4))),t0); (t1,(((((t25,t24),(t23,((t17,t18),((t22,t21),(t20,t19))))),(((t11,((t10,t9),(t8,(t6,t7)))),((t14,t15),t16)),(t13,t12))),(t27,t26)),((t5,t4),(t3,t2))),t0); (t1,(((((t25,t24),(t23,((t17,t18),((t22,t21),(t20,t19))))),(((t13,t12),t16),((t11,((t10,t9),(t8,(t6,t7)))),(t14,t15)))),(t27,t26)),((t5,t4),(t3,t2))),t0); ((((t26,t27),(((t24,t25),(t23,(((t21,t22),(t19,t20)),(t18,t17)))),(((t14,t15),t16),((t13,t12),(((t10,t9),(t8,(t6,t7))),t11))))),((t5,t4),(t2,t3))),t1,t0); ((((t26,t27),(((t24,t25),(t23,(((t21,t22),(t19,t20)),(t18,t17)))),((((t10,t9),(t8,(t6,t7))),t11),((t14,t15),(t16,(t13,t12)))))),((t5,t4),(t2,t3))),t1,t0); (((t2,t3),(((t26,t27),((t23,((t19,t20),((t18,t17),(t21,t22)))),(((t13,t12),((t24,t25),(((t10,t9),(t8,(t6,t7))),t11))),(t16,(t14,t15))))),(t5,t4))),t1,t0); ((((t2,t3),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t13,t12),((t24,t25),(((t10,t9),(t8,(t6,t7))),t11))),(t16,(t14,t15))))),((t5,t4),(t26,t27))),t1,t0); (((((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t24,t25),((((t10,t9),(t8,(t6,t7))),t11),(t13,t12))),(t16,(t14,t15)))),(t26,t27)),((t2,t3),(t5,t4))),t1,t0); (((((((t24,t25),t23),(((t22,t21),(t19,t20)),(t18,t17))),((t13,t12),((t16,(t14,t15)),(((t10,t9),(t8,(t6,t7))),t11)))),((t26,t27),(t2,t3))),(t5,t4)),t1,t0); ((((((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),((t16,(t13,t12)),((t14,t15),(((t10,t9),(t8,(t6,t7))),t11)))),(t26,t27)),((t5,t4),(t2,t3))),t1,t0); (((t2,t3),((((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((((t10,t9),(t8,(t6,t7))),t11),((t16,(t13,t12)),(t14,t15))),(t24,t25))),(t26,t27)),(t5,t4))),t1,t0); ((((((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),(((t14,t15),(((t10,t9),(t8,(t6,t7))),t11)),((t13,t12),t16))),(t26,t27)),((t5,t4),(t2,t3))),t1,t0); (((t2,t3),((((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t16,(t14,t15)),((t13,t12),((((t10,t9),(t8,(t6,t7))),t11),(t24,t25))))),(t26,t27)),(t5,t4))),t1,t0); (((((t23,(((t20,t19),t22),(t21,(t18,t17)))),((t24,t25),((t13,t12),((((t10,t9),(t8,(t6,t7))),t11),(t16,(t15,t14)))))),(t27,t26)),((t5,t4),(t2,t3))),t1,t0); (((t2,t3),((((((t13,t12),((((t10,t9),(t8,(t6,t7))),t11),(t15,t14))),((t23,(((t20,t19),(t21,t22)),(t18,t17))),(t24,t25))),t16),(t27,t26)),(t5,t4))),t1,t0); (((((t23,(((t20,t19),(t21,t22)),(t18,t17))),((t24,t25),((t16,(t15,t14)),((t13,t12),(((t10,t9),(t8,(t6,t7))),t11))))),((t2,t3),(t27,t26))),(t5,t4)),t1,t0); (((((t23,(((t20,t19),(t21,t22)),(t18,t17))),((t24,t25),(((t15,t14),(t16,(t13,t12))),(((t10,t9),(t8,(t6,t7))),t11)))),((t2,t3),(t27,t26))),(t5,t4)),t1,t0); (((t2,t3),(((t26,t27),(t5,t4)),(t16,((t15,t14),(((t13,t12),(((t10,t9),(t8,(t6,t7))),t11)),((t23,(((t20,t19),(t21,t22)),(t18,t17))),(t24,t25))))))),t1,t0); (((t5,t4),((((t23,(((t20,t19),(t21,t22)),(t18,t17))),((t15,t14),(((t13,t12),(t24,t25)),(t16,(((t10,t9),(t8,(t6,t7))),t11))))),(t2,t3)),(t26,t27))),t1,t0); ((((t26,t27),(t2,t3)),((t5,t4),(((t24,t25),(t23,(((t20,t19),(t21,t22)),(t18,t17)))),((t16,(t15,t14)),((t13,t12),(((t10,t9),(t8,(t6,t7))),t11)))))),t1,t0); (((t5,t4),(((t23,(((t20,t19),(t21,t22)),(t18,t17))),((((t24,t25),(((t10,t9),(t8,(t6,t7))),t11)),((t15,t14),(t13,t12))),t16)),(t27,((t2,t3),t26)))),t1,t0); ((((t2,t3),(t26,t27)),((t5,t4),((t23,(((t20,t19),(t21,t22)),(t18,t17))),((t24,t25),(((t13,t12),(((t10,t9),(t8,(t6,t7))),t11)),((t15,t14),t16)))))),t1,t0); (((t5,t4),(((((t13,t12),(((t10,t9),(t8,(t6,t7))),t11)),((t15,t14),t16)),((t23,((t21,(t22,(t20,t19))),(t18,t17))),(t24,t25))),((t2,t3),(t26,t27)))),t1,t0); (((t3,t2),(((t27,t26),(((((t22,t21),(t20,t19)),(t18,t17)),t23),((((t24,t25),(t13,t12)),(t11,((t8,(t6,t7)),(t10,t9)))),(t16,(t14,t15))))),(t4,t5))),t1,t0); (((((((t22,t21),(t20,t19)),(t18,t17)),t23),(((t13,t12),((t11,((t8,(t6,t7)),(t10,t9))),(t24,t25))),(t16,(t14,t15)))),((t4,t5),((t3,t2),(t27,t26)))),t1,t0); ((((((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23)),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),(t16,(t14,t15)))),(t27,t26)),((t4,t5),(t3,t2))),t1,t0); ((((((t24,t25),(((t20,t19),((t18,t17),(t22,t21))),t23)),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),(t16,(t14,t15)))),((t3,t2),(t27,t26))),(t4,t5)),t1,t0); (((t4,t5),((((((t24,t25),(t11,((t8,(t6,t7)),(t10,t9)))),((((t18,t17),((t22,t21),(t20,t19))),t23),((t13,t12),(t14,t15)))),t16),(t27,t26)),(t3,t2))),t1,t0); (((t3,t2),((t4,t5),(((((t18,t17),((t22,t21),(t20,t19))),((t24,t25),t23)),((t13,t12),((t11,((t8,(t6,t7)),(t10,t9))),(t16,(t14,t15))))),(t27,t26)))),t1,t0); (((t3,t2),((t4,t5),(((((t18,t17),((t22,t21),(t20,t19))),((t24,t25),t23)),(((t14,t15),((t13,t12),(t11,((t8,(t6,t7)),(t10,t9))))),t16)),(t27,t26)))),t1,t0); ((((t3,t2),(t16,((t11,((t8,(t6,t7)),(t10,t9))),(((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),((t14,t15),(t13,t12)))))),((t27,t26),(t4,t5))),t1,t0); (((t4,t5),(((t23,((t18,t17),((t22,t21),(t20,t19)))),((((t24,t25),(t11,((t8,(t6,t7)),(t10,t9)))),(t14,t15)),(t16,(t13,t12)))),((t3,t2),(t27,t26)))),t1,t0); ((((t4,t5),(((t23,((t18,t17),((t22,t21),(t20,t19)))),((t14,t15),(t16,((t13,t12),((t24,t25),(t11,((t8,(t6,t7)),(t10,t9)))))))),(t27,t26))),(t3,t2)),t1,t0); (t1,(((t2,t3),((t16,(t15,t14)),(((t11,((t8,(t7,t6)),(t10,t9))),(t13,t12)),((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23))))),((t5,t4),(t27,t26))),t0); (t1,((((t27,t26),(t2,t3)),(((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23)),((t16,(t15,t14)),((t11,((t8,(t7,t6)),(t10,t9))),(t13,t12))))),(t5,t4)),t0); (t1,(((t27,t26),(t2,t3)),((((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23)),((t13,t12),((t16,(t15,t14)),(t11,((t8,(t7,t6)),(t10,t9)))))),(t5,t4))),t0); (t1,((t5,t4),(((t27,t26),(t2,t3)),(((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23)),((t16,(t15,t14)),((t11,((t8,(t7,t6)),(t10,t9))),(t13,t12)))))),t0); (t1,(((t27,t26),(t2,t3)),((((((t22,t21),(t19,t20)),(t18,t17)),t23),(((t15,t14),((t11,((t8,(t7,t6)),(t10,t9))),(t16,(t13,t12)))),(t24,t25))),(t5,t4))),t0); (t1,((((t27,t26),(((((t22,t21),(t19,t20)),(t18,t17)),t23),(t16,((t15,t14),(((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),(t13,t12)))))),(t5,t4)),(t2,t3)),t0); (t1,((((t27,t26),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),(t13,t12)),(t16,(t15,t14))))),(t5,t4)),(t2,t3)),t0); (t1,((((t27,t26),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),(t13,t12)),(t16,(t15,t14))))),(t5,t4)),(t2,t3)),t0); (t1,((((t27,t26),(((((t22,t21),(t19,t20)),(t18,t17)),t23),(((t13,t12),(t24,t25)),((t16,(t15,t14)),(t11,((t8,(t7,t6)),(t10,t9))))))),(t5,t4)),(t2,t3)),t0); (t1,((t5,t4),((t2,t3),((t27,t26),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((t16,(t15,t14)),(((t11,((t8,(t7,t6)),(t10,t9))),(t24,t25)),(t13,t12))))))),t0); (t1,((t2,t3),((t4,t5),((t27,t26),(((((t25,t24),(t12,t13)),(t11,((t9,t10),(t8,(t6,t7))))),(t16,(t15,t14))),(((t18,t17),((t22,t21),(t19,t20))),t23))))),t0); (t1,((t2,t3),((t4,t5),((t27,t26),(((t15,t14),((((t25,t24),(t12,t13)),(t11,((t9,t10),(t8,(t6,t7))))),t16)),(((t18,t17),((t22,t21),(t19,t20))),t23))))),t0); (t1,((t2,t3),((t4,t5),(t27,(t26,((t16,((t15,t14),(((t25,t24),(t12,t13)),(t11,((t9,t10),(t8,(t6,t7))))))),(((t18,t17),((t22,t21),(t19,t20))),t23)))))),t0); (t1,((t2,t3),((t4,t5),(((((t12,t13),((t11,((t9,t10),(t8,(t6,t7)))),(t25,t24))),(t16,(t15,t14))),(((t18,t17),((t22,t21),(t19,t20))),t23)),(t27,t26)))),t0); (t1,(((t27,t26),(t2,t3)),((t4,t5),((t16,(((t15,t14),(t12,t13)),(t11,((t9,t10),(t8,(t6,t7)))))),(((t25,t24),((t18,t17),((t22,t21),(t19,t20)))),t23)))),t0); (t1,((t2,t3),((t4,t5),((t27,t26),(((t12,t13),((t11,((t9,t10),(t8,(t6,t7)))),(t16,(t15,t14)))),((t25,t24),(((t18,t17),((t22,t21),(t19,t20))),t23)))))),t0); (t1,((t4,t5),(((t2,t3),(t27,t26)),(((t16,(t15,t14)),((t12,t13),(t11,((t9,t10),(t8,(t6,t7)))))),((t25,t24),(((t18,t17),((t21,(t19,t20)),t22)),t23))))),t0); (t1,((((t16,(t15,t14)),((t12,t13),(t11,((t9,t10),(t8,(t6,t7)))))),((t25,t24),(((t18,t17),((t19,t20),(t22,t21))),t23))),((t4,t5),((t2,t3),(t27,t26)))),t0); (t1,((t4,t5),(((((((t25,t24),(t11,((t9,t10),(t8,(t6,t7))))),((t15,t14),(t12,t13))),(((t18,t17),((t19,t20),(t22,t21))),t23)),t16),(t2,t3)),(t27,t26))),t0); (t1,((t2,t3),(((t27,t26),(((t15,t14),(((t12,t13),(t11,((t9,t10),(t8,(t6,t7))))),((t25,t24),(((t18,t17),((t19,t20),(t22,t21))),t23)))),t16)),(t4,t5))),t0); ((((((t24,t25),((((t22,t21),(t19,t20)),(t17,t18)),t23)),(((t13,t12),(((t9,t10),((t7,t6),t8)),t11)),((t15,t14),t16))),((t5,t4),(t26,t27))),(t3,t2)),t1,t0); ((((t5,t4),((t26,t27),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(t16,((t13,t12),(((t24,t25),(((t9,t10),((t7,t6),t8)),t11)),(t15,t14))))))),(t3,t2)),t1,t0); ((((t5,t4),((t26,t27),(((t16,(t15,t14)),((((t9,t10),((t7,t6),t8)),t11),(t13,t12))),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(t24,t25))))),(t3,t2)),t1,t0); (((t27,(t26,(t5,t4))),((((t16,(t15,t14)),((((t9,t10),((t7,t6),t8)),t11),(t13,t12))),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(t24,t25))),(t3,t2))),t1,t0); ((((t5,t4),(t27,t26)),(((((t15,t14),((((t9,t10),((t7,t6),t8)),t11),(t13,t12))),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(t24,t25))),t16),(t3,t2))),t1,t0); (((((t3,t2),(t5,t4)),(t27,t26)),(((t15,t14),((((t24,t25),(((t9,t10),((t7,t6),t8)),t11)),(t13,t12)),((((t22,t21),(t19,t20)),(t17,t18)),t23))),t16)),t1,t0); (((t3,t2),((t5,t4),((t27,t26),(((((t22,t21),(t19,t20)),(t17,t18)),t23),((t16,(t15,t14)),((((t9,t10),((t7,t6),t8)),t11),((t13,t12),(t24,t25)))))))),t1,t0); (((t3,t2),((t5,t4),((t27,t26),(((t24,t25),((((t22,t21),(t19,t20)),(t17,t18)),t23)),((t16,(t15,t14)),((((t9,t10),((t7,t6),t8)),t11),(t13,t12))))))),t1,t0); ((((t27,t26),(t5,t4)),((((((t22,t21),(t19,t20)),(t17,t18)),t23),((((t13,t12),t16),(t15,t14)),((t24,t25),(((t9,t10),((t7,t6),t8)),t11)))),(t3,t2))),t1,t0); (((t5,t4),((((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t15,t14),((((t9,t10),((t7,t6),t8)),t11),((t13,t12),(t24,t25)))),t16)),((t3,t2),(t27,t26)))),t1,t0); (t1,((t5,t4),((t26,t27),((t2,t3),((t23,(((t18,t17),t22),((t21,t19),t20))),(((t15,t14),t16),((t13,t12),((t25,t24),(((t9,t10),((t7,t6),t8)),t11)))))))),t0); (t1,((t5,t4),((t2,t3),((t27,t26),(((t25,t24),(t23,((t18,t17),(t22,(t21,(t19,t20)))))),((((t9,t10),((t7,t6),t8)),t11),(((t15,t14),t16),(t13,t12))))))),t0); (t1,((t2,t3),(((t27,t26),(t5,t4)),(((t25,t24),(t23,((t18,t17),((t19,t20),(t22,t21))))),((((t9,t10),((t7,t6),t8)),t11),(((t13,t12),t16),(t15,t14)))))),t0); (t1,((((t25,t24),(t23,((t18,t17),((t19,t20),(t22,t21))))),((((t9,t10),((t7,t6),t8)),t11),((t13,t12),(t16,(t15,t14))))),(((t2,t3),(t27,t26)),(t5,t4))),t0); (t1,((((t23,((t18,t17),((t19,t20),(t22,t21)))),(((t15,t14),(((t25,t24),(((t9,t10),((t7,t6),t8)),t11)),(t13,t12))),t16)),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,((((t23,((t18,t17),((t19,t20),(t22,t21)))),(((((t9,t10),((t7,t6),t8)),t11),((t13,t12),(t25,t24))),(t16,(t15,t14)))),(t2,t3)),(t27,(t26,(t5,t4)))),t0); (t1,((t2,t3),((t5,t4),((t27,t26),((t23,((t18,t17),((t19,t20),(t22,t21)))),(t16,((t15,t14),(((((t9,t10),((t7,t6),t8)),t11),(t13,t12)),(t25,t24)))))))),t0); (t1,(((t27,t26),((t23,((t18,t17),((t19,t20),(t22,t21)))),((t15,t14),(((((t9,t10),((t7,t6),t8)),t11),(t13,t12)),(t16,(t25,t24)))))),((t2,t3),(t5,t4))),t0); (t1,(((t27,t26),((t2,t3),((((t23,((t18,t17),((t19,t20),(t22,t21)))),(t25,t24)),((t15,t14),((((t9,t10),((t7,t6),t8)),t11),(t13,t12)))),t16))),(t5,t4)),t0); (t1,(((((t23,((t18,t17),((t19,t20),(t22,t21)))),(t25,t24)),((t13,t12),((t16,(t15,t14)),(((t9,t10),((t7,t6),t8)),t11)))),((t27,t26),(t2,t3))),(t5,t4)),t0); ((((((((t20,t19),t21),t22),(t17,t18)),t23),((t16,(t14,t15)),((t11,((t8,(t6,t7)),(t10,t9))),((t25,t24),(t12,t13))))),((t5,t4),((t3,t2),(t27,t26)))),t1,t0); (((t5,t4),(((t3,t2),(t27,t26)),((((((t20,t19),(t21,t22)),(t17,t18)),t23),(((t25,t24),(t12,t13)),((t14,t15),(t11,((t8,(t6,t7)),(t10,t9)))))),t16))),t1,t0); (((t5,t4),((t3,t2),((t27,t26),(((((t20,t19),(t21,t22)),(t17,t18)),t23),(((t12,t13),(t16,(t14,t15))),((t11,((t8,(t6,t7)),(t10,t9))),(t25,t24))))))),t1,t0); (((((t25,t24),(((((t20,t19),t21),(t17,t18)),t22),t23)),(((t14,t15),((t11,((t8,(t6,t7)),(t10,t9))),(t12,t13))),t16)),(((t5,t4),(t3,t2)),(t27,t26))),t1,t0); (((((t3,t2),(t27,t26)),(t16,(((((t20,t19),(t22,t21)),(t17,t18)),t23),(((t25,t24),(t11,((t8,(t6,t7)),(t10,t9)))),((t12,t13),(t14,t15)))))),(t5,t4)),t1,t0); ((((t3,t2),(t27,((((t25,t24),((((t20,t19),(t22,t21)),(t17,t18)),t23)),((t16,(t14,t15)),((t11,((t8,(t6,t7)),(t10,t9))),(t12,t13)))),t26))),(t5,t4)),t1,t0); ((((t3,t2),(((t23,((t25,t24),(((t20,t19),(t22,t21)),(t17,t18)))),((t16,(t14,t15)),((t11,((t8,(t6,t7)),(t10,t9))),(t12,t13)))),(t26,t27))),(t5,t4)),t1,t0); ((((t3,t2),(((((((t20,t19),(t22,t21)),(t17,t18)),t23),(((t25,t24),(t11,((t8,(t6,t7)),(t10,t9)))),((t12,t13),(t14,t15)))),t16),(t26,t27))),(t5,t4)),t1,t0); ((((t3,t2),((((((t20,t19),(t22,t21)),(t17,t18)),t23),((((t12,t13),(t25,t24)),(t11,((t8,(t6,t7)),(t10,t9)))),(t16,(t14,t15)))),(t26,t27))),(t5,t4)),t1,t0); (((t3,t2),(((((((t20,t19),(t22,t21)),(t17,t18)),t23),((t25,t24),((t12,t13),((t16,(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9))))))),(t26,t27)),(t5,t4))),t1,t0); (((t3,t2),(((t27,t26),((t16,((t14,t15),((t11,((t10,t9),((t6,t7),t8))),((t24,t25),(t13,t12))))),((((t20,t19),(t21,t22)),(t18,t17)),t23))),(t4,t5))),t1,t0); (((((t3,t2),(t27,t26)),(((t14,t15),(((t11,((t10,t9),((t6,t7),t8))),((t24,t25),(t13,t12))),t16)),((((t20,t19),(t21,t22)),(t18,t17)),t23))),(t4,t5)),t1,t0); (((t3,t2),(((t27,t26),(((t13,t12),((t16,(t14,t15)),(t11,((t10,t9),((t6,t7),t8))))),(((t21,(t22,(t20,t19))),(t18,t17)),((t24,t25),t23)))),(t4,t5))),t1,t0); (((t3,t2),(((t27,t26),((t23,(((t20,t19),(t21,t22)),(t18,t17))),((t16,(t14,t15)),(((t24,t25),(t13,t12)),(t11,((t10,t9),((t6,t7),t8))))))),(t4,t5))),t1,t0); (((t4,t5),(((t27,t26),(t3,t2)),(((t24,t25),(t23,(((t20,t19),(t21,t22)),(t18,t17)))),((t13,t12),((t11,((t10,t9),((t6,t7),t8))),(t16,(t14,t15))))))),t1,t0); (((t3,t2),((((t24,t25),(t23,(((t20,t19),(t21,t22)),(t18,t17)))),((t16,(t14,t15)),((t13,t12),(t11,((t10,t9),((t6,t7),t8)))))),((t27,t26),(t4,t5)))),t1,t0); (((t4,t5),(((t27,t26),(t3,t2)),(((t24,t25),(t23,(((t20,t19),(t21,t22)),(t18,t17)))),(((t13,t12),t16),((t14,t15),(t11,((t10,t9),((t6,t7),t8)))))))),t1,t0); (((t3,t2),((((t24,t25),(t23,(((t20,t19),t22),(t21,(t18,t17))))),((t13,t12),((t11,((t10,t9),((t6,t7),t8))),(t16,(t14,t15))))),((t27,t26),(t4,t5)))),t1,t0); (((t4,t5),(((t23,((((t20,t19),t21),(t22,(t18,t17))),(t24,t25))),((t16,(t13,t12)),((t11,((t10,t9),((t6,t7),t8))),(t14,t15)))),((t3,t2),(t27,t26)))),t1,t0); (((t3,t2),(((t4,t5),(t27,t26)),(((t24,t25),(t23,((t18,t17),((t20,t19),(t21,t22))))),(((t14,t15),((t13,t12),(t11,((t10,t9),((t6,t7),t8))))),t16)))),t1,t0); (((t4,t5),((((t25,t24),(t23,((t18,t17),((t22,t21),(t19,t20))))),(((t14,t15),(t11,((t9,t10),(t8,(t7,t6))))),(t16,(t12,t13)))),((t2,t3),(t26,t27)))),t1,t0); (((t2,t3),((t4,t5),((t26,t27),(((t25,t24),(t23,((t18,t17),(t22,(t21,(t19,t20)))))),(((t16,(t14,t15)),(t11,((t9,t10),(t8,(t7,t6))))),(t12,t13)))))),t1,t0); (((t2,t3),(((t23,((t18,t17),((t19,t20),(t22,t21)))),(((t14,t15),((t25,t24),(t11,((t9,t10),(t8,(t7,t6)))))),(t16,(t12,t13)))),((t4,t5),(t26,t27)))),t1,t0); ((((t2,t3),(t4,t5)),((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),(t16,((t12,t13),((t14,t15),((t25,t24),(t11,((t9,t10),(t8,(t7,t6))))))))))),t1,t0); (((t2,t3),((t4,t5),((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),((t16,(t14,t15)),(((t12,t13),(t25,t24)),(t11,((t9,t10),(t8,(t7,t6)))))))))),t1,t0); ((((((t25,t24),(t23,((t18,t17),((t19,t20),(t22,t21))))),((t14,t15),((t11,((t9,t10),(t8,(t7,t6)))),(t12,t13)))),t16),(((t4,t5),(t26,t27)),(t2,t3))),t1,t0); (((t2,t3),((t4,t5),(((t23,((t18,t17),((t19,t20),(t22,t21)))),(t16,(((t11,((t9,t10),(t8,(t7,t6)))),((t25,t24),(t12,t13))),(t14,t15)))),(t26,t27)))),t1,t0); ((((t2,t3),(t26,t27)),((t4,t5),(((t25,t24),(((t18,t17),((t19,t20),(t22,t21))),t23)),(((t11,((t9,t10),(t8,(t7,t6)))),(t12,t13)),((t14,t15),t16))))),t1,t0); (((t2,t3),(t27,(((t23,((t18,t17),((t19,t20),(t22,t21)))),((((t25,t24),(t11,((t9,t10),(t8,(t7,t6))))),(t16,(t12,t13))),(t14,t15))),((t4,t5),t26)))),t1,t0); (((t2,t3),(((t27,t26),(((t25,t24),(t23,((t21,(t22,(t18,t17))),(t19,t20)))),(((t14,t15),t16),((t12,t13),(t11,((t9,t10),(t8,(t7,t6)))))))),(t4,t5))),t1,t0); (((t3,t2),(((t27,t26),(((((t20,t19),(t22,t21)),(t17,t18)),t23),(((t15,t14),((t13,t12),((t25,t24),(t11,((t10,t9),(t8,(t6,t7))))))),t16))),(t5,t4))),t1,t0); ((((t27,t26),((((t21,((t20,t19),t22)),(t17,t18)),t23),(((t11,((t10,t9),(t8,(t6,t7)))),((t13,t12),(t25,t24))),(t16,(t15,t14))))),((t5,t4),(t3,t2))),t1,t0); (((t3,t2),(((t27,t26),(((((t21,(t20,t19)),(t17,t18)),t22),t23),((((t13,t12),((t25,t24),(t11,((t10,t9),(t8,(t6,t7)))))),(t15,t14)),t16))),(t5,t4))),t1,t0); (((t16,((((t17,t18),((t21,t22),(t20,t19))),t23),(((t11,((t10,t9),(t8,(t6,t7)))),((t13,t12),(t25,t24))),(t15,t14)))),((t3,t2),((t27,t26),(t5,t4)))),t1,t0); (((((t3,t2),(t27,t26)),(t5,t4)),(((t25,t24),(((t17,t18),((t21,t22),(t20,t19))),t23)),(((t13,t12),(t11,((t10,t9),(t8,(t6,t7))))),(t16,(t15,t14))))),t1,t0); (((t5,t4),((t3,t2),((((t25,t24),(((t17,t18),((t21,t22),(t20,t19))),t23)),(((t13,t12),(t11,((t10,t9),(t8,(t6,t7))))),(t16,(t15,t14)))),(t27,t26)))),t1,t0); (((t5,t4),((t27,t26),((t3,t2),(((t25,t24),(((t17,t18),((t21,t22),(t20,t19))),t23)),((t13,t12),(t16,((t15,t14),(t11,((t10,t9),(t8,(t6,t7))))))))))),t1,t0); ((((t5,t4),(t3,t2)),(((((t17,t18),((t21,t22),(t20,t19))),t23),(((t11,((t10,t9),(t8,(t6,t7)))),(t16,(t15,t14))),((t25,t24),(t13,t12)))),(t27,t26))),t1,t0); ((((((t25,t24),(((t17,t18),((t21,t22),(t20,t19))),t23)),((t16,(t15,t14)),((t13,t12),(t11,((t10,t9),(t8,(t6,t7))))))),((t3,t2),(t27,t26))),(t5,t4)),t1,t0); ((((t27,t26),((((t17,t18),((t21,t22),(t20,t19))),t23),(((t25,t24),(t13,t12)),((t11,((t10,t9),(t8,(t6,t7)))),(t16,(t15,t14)))))),((t5,t4),(t3,t2))),t1,t0); (((t4,t5),(((t26,t27),(t3,t2)),((t16,(((t12,t13),(t15,t14)),(t11,((t10,t9),(t8,(t6,t7)))))),((t25,t24),(t23,((t21,(t20,t19)),(t22,(t17,t18)))))))),t1,t0); ((((t3,t2),(((t16,(t15,t14)),((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13))),((t25,t24),(t23,(((t22,t21),(t20,t19)),(t17,t18)))))),((t4,t5),(t26,t27))),t1,t0); (((t4,t5),((t26,t27),((t3,t2),((((t25,t24),(t11,((t10,t9),(t8,(t6,t7))))),((t23,(((t22,t21),(t20,t19)),(t17,t18))),((t12,t13),(t15,t14)))),t16)))),t1,t0); ((((t3,t2),((((t25,t24),(t23,(((t22,t21),(t20,t19)),(t17,t18)))),(((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13)),(t15,t14))),t16)),((t4,t5),(t26,t27))),t1,t0); ((((t3,t2),((t26,t27),((t23,(((t22,t21),(t20,t19)),(t17,t18))),((t16,(((t25,t24),(t12,t13)),(t11,((t10,t9),(t8,(t6,t7)))))),(t15,t14))))),(t4,t5)),t1,t0); ((((t3,t2),((t26,t27),(((t23,(((t22,t21),(t20,t19)),(t17,t18))),((((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13)),(t25,t24)),(t15,t14))),t16))),(t4,t5)),t1,t0); (((t3,t2),(((t26,((t23,((t25,t24),(((t22,t21),(t20,t19)),(t17,t18)))),(((t11,((t10,t9),(t8,(t6,t7)))),(t15,t14)),((t12,t13),t16)))),(t4,t5)),t27)),t1,t0); (((t4,t5),((t3,t2),((t26,t27),((t23,(((t22,t21),(t20,t19)),(t17,t18))),((((t25,t24),(t11,((t10,t9),(t8,(t6,t7))))),(t15,t14)),((t12,t13),t16)))))),t1,t0); (((t3,t2),(((t26,t27),((t23,(((t22,t21),(t20,t19)),(t17,t18))),(((t15,t14),((t12,t13),((t25,t24),(t11,((t10,t9),(t8,(t6,t7))))))),t16))),(t4,t5))),t1,t0); (((t3,t2),(((t26,t27),((t23,((t17,t18),(t22,(t21,(t20,t19))))),(((t12,t13),(t25,t24)),((t11,((t10,t9),(t8,(t6,t7)))),(t16,(t15,t14)))))),(t4,t5))),t1,t0); (t1,((t3,t2),(((t26,t27),(((((t21,(t19,t20)),t22),(t17,t18)),t23),((t25,t24),(((t13,t12),(t11,((t9,t10),((t6,t7),t8)))),(t16,(t14,t15)))))),(t5,t4))),t0); (t1,((t5,t4),((t3,t2),((t26,t27),(((t25,t24),((((t19,t20),(t22,t21)),(t17,t18)),t23)),(t16,((t11,((t9,t10),((t6,t7),t8))),((t14,t15),(t13,t12)))))))),t0); (t1,(((t26,t27),((t23,((t25,t24),(((t19,t20),(t22,t21)),(t17,t18)))),(t16,((t13,t12),((t11,((t9,t10),((t6,t7),t8))),(t14,t15)))))),((t5,t4),(t3,t2))),t0); (t1,((t5,t4),((t3,t2),((t26,t27),(((t25,t24),((((t19,t20),(t22,t21)),(t17,t18)),t23)),((t11,((t9,t10),((t6,t7),t8))),((t16,(t14,t15)),(t13,t12))))))),t0); (t1,((t3,t2),(((t26,t27),((t23,(((t19,t20),(t22,t21)),(t17,t18))),(((t14,t15),((t13,t12),((t25,t24),(t11,((t9,t10),((t6,t7),t8)))))),t16))),(t5,t4))),t0); (t1,((t3,t2),(((t23,(((t19,t20),(t22,t21)),(t17,t18))),(((t14,t15),((t25,t24),(t11,((t9,t10),((t6,t7),t8))))),((t13,t12),t16))),((t5,t4),(t26,t27)))),t0); (t1,((t3,t2),((t5,t4),((t26,t27),(((t25,t24),(t23,(((t19,t20),(t22,t21)),(t17,t18)))),(((t13,t12),(t11,((t9,t10),((t6,t7),t8)))),(t16,(t14,t15))))))),t0); (t1,((((t3,t2),(t26,t27)),(((t25,t24),(t23,(((t19,t20),(t22,t21)),(t17,t18)))),(((t13,t12),(t11,((t9,t10),((t6,t7),t8)))),(t16,(t14,t15))))),(t5,t4)),t0); (t1,(((t26,(t27,(t3,t2))),((t23,(((t19,t20),(t22,t21)),(t17,t18))),((((t13,t12),(t11,((t9,t10),((t6,t7),t8)))),(t16,(t14,t15))),(t25,t24)))),(t5,t4)),t0); (t1,((t3,t2),(((t26,t27),((t23,(((t19,t20),(t22,t21)),(t17,t18))),(((t14,t15),(((t25,t24),(t13,t12)),(t11,((t9,t10),((t6,t7),t8))))),t16))),(t5,t4))),t0); (t1,((t2,t3),((t5,t4),((((t12,t13),((t11,((t8,(t6,t7)),(t10,t9))),(t16,(t15,t14)))),((t24,t25),(((t18,t17),((t21,t22),(t20,t19))),t23))),(t26,t27)))),t0); (t1,((t2,t3),(((((((t24,t25),(t12,t13)),(t11,((t8,(t6,t7)),(t10,t9)))),((t15,t14),t16)),(((t20,t19),((t18,t17),(t21,t22))),t23)),(t26,(t5,t4))),t27)),t0); (t1,((t2,t3),((t5,t4),((t26,t27),((((t24,t25),(t11,((t8,(t6,t7)),(t10,t9)))),((t15,t14),((t12,t13),t16))),(((t18,t17),((t21,t22),(t20,t19))),t23))))),t0); (t1,((t2,t3),((t5,t4),((t26,t27),(((t24,t25),(((t12,t13),t16),((t11,((t8,(t6,t7)),(t10,t9))),(t15,t14)))),(((t18,t17),((t21,t22),(t20,t19))),t23))))),t0); (t1,(((t2,t3),((((t15,t14),(((t24,t25),(t12,t13)),(t11,((t8,(t6,t7)),(t10,t9))))),t16),(((t21,t22),(t20,t19)),(t23,(t18,t17))))),((t5,t4),(t26,t27))),t0); (t1,(((t2,t3),(t5,t4)),((t26,t27),((((t15,t14),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9))))),t16),((t24,t25),(((t20,t19),((t18,t17),(t21,t22))),t23))))),t0); (t1,((t2,t3),((t5,t4),((t26,t27),((((t18,t17),((t21,t22),(t20,t19))),t23),((((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))),(t16,(t15,t14))),(t24,t25)))))),t0); (t1,((t5,t4),(((t2,t3),(t26,t27)),((((t12,t13),t16),((t15,t14),(t11,((t8,(t6,t7)),(t10,t9))))),((t24,t25),(((t18,t17),((t21,t22),(t20,t19))),t23))))),t0); (t1,((t5,t4),((t26,t27),((((t16,((t12,t13),(t15,t14))),(t11,((t8,(t6,t7)),(t10,t9)))),((t24,t25),(((t18,t17),((t21,t22),(t20,t19))),t23))),(t2,t3)))),t0); (t1,(((((t15,t14),(t16,(t12,t13))),(t11,((t8,(t6,t7)),(t10,t9)))),((t24,t25),(((t18,t17),((t21,t22),(t20,t19))),t23))),(((t26,t27),(t2,t3)),(t5,t4))),t0); (((((((t15,t14),t16),((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13))),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23))),(t27,t26)),((t4,t5),(t3,t2))),t1,t0); (((t3,t2),((t16,((((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13)),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23))),(t15,t14))),((t27,t26),(t4,t5)))),t1,t0); (((t3,t2),((t4,t5),(((((t17,t18),(t19,((t22,t21),t20))),(t23,(t24,t25))),(((t15,t14),t16),((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13)))),(t27,t26)))),t1,t0); (((t4,t5),((((((t17,t18),((t22,t21),(t20,t19))),t23),(((t15,t14),t16),(((t24,t25),(t11,((t10,t9),(t8,(t6,t7))))),(t12,t13)))),(t27,t26)),(t3,t2))),t1,t0); (((t4,t5),((t27,t26),((t3,t2),((((t12,t13),((((t17,t18),((t22,t21),(t20,t19))),t23),(t24,t25))),(t11,((t10,t9),(t8,(t6,t7))))),((t15,t14),t16))))),t1,t0); (((t4,t5),((t3,t2),((((((t17,t18),((t22,t21),(t20,t19))),t23),(t24,t25)),(((t11,((t10,t9),(t8,(t6,t7)))),(t15,t14)),(t16,(t12,t13)))),(t27,t26)))),t1,t0); ((((((((t17,t18),((t22,t21),(t20,t19))),t23),(t24,t25)),(((t11,((t10,t9),(t8,(t6,t7)))),(t16,(t15,t14))),(t12,t13))),((t3,t2),(t27,t26))),(t4,t5)),t1,t0); ((((t4,t5),(t3,t2)),((t27,t26),((((t17,t18),((t22,t21),(t20,t19))),t23),((((t24,t25),(t11,((t10,t9),(t8,(t6,t7))))),(t15,t14)),(t16,(t12,t13)))))),t1,t0); (((t4,t5),((t3,t2),((t27,t26),((((t17,t18),((t22,t21),(t20,t19))),t23),((t15,t14),(((t12,t13),(t11,((t10,t9),(t8,(t6,t7))))),(t16,(t24,t25)))))))),t1,t0); (((t3,t2),(((t4,t5),(t27,t26)),((((t17,t18),((t22,t21),(t20,t19))),t23),((t16,(t15,t14)),(((t24,t25),(t12,t13)),(t11,((t10,t9),(t8,(t6,t7))))))))),t1,t0); ((((((((t25,t24),t23),((t18,t17),((t21,t22),(t19,t20)))),((t14,t15),((t12,t13),(t11,((t9,t10),((t7,t6),t8)))))),t16),(t26,t27)),((t2,t3),(t4,t5))),t1,t0); ((((((t16,(t14,t15)),((t12,t13),((t25,t24),(t11,((t9,t10),((t7,t6),t8)))))),(t23,((t18,t17),((t21,t22),(t19,t20))))),(t26,t27)),((t2,t3),(t4,t5))),t1,t0); (((((t2,t3),(((t12,t13),((t16,(t14,t15)),(t11,((t9,t10),((t7,t6),t8))))),((t25,t24),(t23,((t18,t17),((t21,t22),(t19,t20))))))),(t26,t27)),(t4,t5)),t1,t0); ((((t2,t3),((((t16,(t14,t15)),((t11,((t9,t10),((t7,t6),t8))),(t12,t13))),((t25,t24),(t23,((t18,t17),((t21,t22),(t19,t20)))))),(t26,t27))),(t4,t5)),t1,t0); ((((t26,t27),(t2,t3)),((t4,t5),(((t11,((t9,t10),((t7,t6),t8))),((t12,t13),(t16,(t14,t15)))),((t25,t24),(t23,((t18,t17),((t21,t22),(t19,t20)))))))),t1,t0); ((((t2,t3),(((t16,(t14,t15)),((t11,((t9,t10),((t7,t6),t8))),(t12,t13))),(t23,(((t18,t17),((t21,t22),(t19,t20))),(t25,t24))))),((t26,t27),(t4,t5))),t1,t0); (((t2,t3),((t4,t5),((((t16,(t14,t15)),((t11,((t9,t10),((t7,t6),t8))),(t12,t13))),((t25,t24),(t23,((t18,t17),((t21,t22),(t19,t20)))))),(t26,t27)))),t1,t0); (((t4,t5),(((((t16,(t14,t15)),((t11,((t9,t10),((t7,t6),t8))),((t25,t24),(t12,t13)))),(t23,((t18,t17),((t21,t22),(t19,t20))))),(t26,t27)),(t2,t3))),t1,t0); ((((t26,t27),(t2,t3)),((t4,t5),((t16,((t14,t15),((t12,t13),((t11,((t9,t10),((t7,t6),t8))),(t25,t24))))),(t23,((t18,t17),((t21,t22),(t19,t20))))))),t1,t0); ((((t26,t27),(t4,t5)),(((((t12,t13),(t11,((t9,t10),((t7,t6),t8)))),(t16,(t14,t15))),((t25,t24),(t23,((t18,t17),((t21,t22),(t19,t20)))))),(t2,t3))),t1,t0); (((t4,t5),(((t23,(((t19,t20),(t22,t21)),(t18,t17))),((((t13,t12),(t11,((t9,t10),(t8,(t6,t7))))),(t16,(t15,t14))),(t25,t24))),((t3,t2),(t26,t27)))),t1,t0); ((((t26,t27),(t4,t5)),(((((t13,t12),(t11,((t9,t10),(t8,(t6,t7))))),(t16,(t15,t14))),((t25,t24),(t23,(((t19,t20),(t22,t21)),(t18,t17))))),(t3,t2))),t1,t0); ((((t4,t5),(t3,t2)),((t26,t27),(((t11,((t9,t10),(t8,(t6,t7)))),((t16,(t15,t14)),(t13,t12))),((t25,t24),(t23,(((t19,t20),(t22,t21)),(t18,t17))))))),t1,t0); (((t3,t2),(((t26,t27),(t4,t5)),(((t13,t12),((t11,((t9,t10),(t8,(t6,t7)))),(t16,(t15,t14)))),((t25,t24),(t23,(((t19,t20),(t22,t21)),(t18,t17))))))),t1,t0); (((t3,t2),((t4,t5),(((t23,(((t19,t20),(t22,t21)),(t18,t17))),((((t11,((t9,t10),(t8,(t6,t7)))),((t15,t14),(t13,t12))),(t25,t24)),t16)),(t26,t27)))),t1,t0); ((((t26,t27),(t4,t5)),(((((t11,((t9,t10),(t8,(t6,t7)))),((t13,t12),(t15,t14))),((t25,t24),(t23,(((t19,t20),(t22,t21)),(t18,t17))))),t16),(t3,t2))),t1,t0); (((t3,t2),((t26,t27),(((((t13,t12),((t15,t14),(t11,((t9,t10),(t8,(t6,t7)))))),((t25,t24),(t23,(((t19,t20),(t22,t21)),(t18,t17))))),t16),(t4,t5)))),t1,t0); (((t3,t2),(((t23,(((t19,t20),(t22,t21)),(t18,t17))),(t16,(((t25,t24),(t13,t12)),((t15,t14),(t11,((t9,t10),(t8,(t6,t7)))))))),((t4,t5),(t26,t27)))),t1,t0); (((t4,t5),((t26,t27),((t3,t2),((t23,(((t19,t20),(t22,t21)),(t18,t17))),(((t15,t14),((t25,t24),(t11,((t9,t10),(t8,(t6,t7)))))),(t16,(t13,t12))))))),t1,t0); (((t3,t2),((t4,t5),(((t23,(((t19,t20),(t22,t21)),(t18,t17))),((t15,t14),(t16,((t11,((t9,t10),(t8,(t6,t7)))),((t25,t24),(t13,t12)))))),(t26,t27)))),t1,t0); (t1,(((t5,t4),(t27,t26)),((((t12,t13),(t16,((t11,((t10,t9),(t8,(t6,t7)))),(t15,t14)))),(((t21,(t19,t20)),(t22,(t18,t17))),((t25,t24),t23))),(t2,t3))),t0); (t1,(((t5,t4),(t27,t26)),((((t16,(t12,t13)),(((t25,t24),(t11,((t10,t9),(t8,(t6,t7))))),(t15,t14))),(t23,((t18,t17),((t19,t20),(t21,t22))))),(t2,t3))),t0); (t1,((t2,t3),(((t27,t26),((((t12,t13),(t11,((t10,t9),(t8,(t6,t7))))),((t15,t14),t16)),((t25,t24),(t23,((t18,t17),((t19,t20),(t21,t22))))))),(t5,t4))),t0); (t1,((t5,t4),(((t2,t3),(t27,t26)),((t23,((t18,t17),((t19,t20),(t21,t22)))),((((t12,t13),(t11,((t10,t9),(t8,(t6,t7))))),((t15,t14),t16)),(t25,t24))))),t0); (t1,(((t5,t4),(t2,t3)),((t27,t26),((((t16,(t12,t13)),(t11,((t10,t9),(t8,(t6,t7))))),(t15,t14)),((t25,t24),(t23,((t18,t17),((t19,t20),(t21,t22)))))))),t0); (t1,((t5,t4),((t2,t3),((t27,t26),((((t12,t13),(t11,((t10,t9),(t8,(t6,t7))))),(t16,(t15,t14))),((t25,t24),(t23,((t18,t17),((t19,t20),(t21,t22))))))))),t0); (t1,((t5,t4),((t27,t26),((((t11,((t10,t9),(t8,(t6,t7)))),((t16,(t15,t14)),(t12,t13))),((t25,t24),(t23,((t18,t17),((t19,t20),(t21,t22)))))),(t2,t3)))),t0); (t1,((t5,t4),((t2,t3),((t27,t26),(((t16,(t15,t14)),((t12,t13),(t11,((t10,t9),(t8,(t6,t7)))))),((t25,t24),(t23,((t18,t17),((t19,t20),(t21,t22))))))))),t0); (t1,(((t2,t3),(t5,t4)),((t26,((t23,((t18,t17),((t19,t20),(t21,t22)))),(((t16,(t15,t14)),((t12,t13),(t11,((t10,t9),(t8,(t6,t7)))))),(t25,t24)))),t27)),t0); (t1,((t5,t4),(((((t11,((t10,t9),(t8,(t6,t7)))),((t16,(t15,t14)),(t12,t13))),((t25,t24),(t23,((t18,t17),((t19,t20),(t21,t22)))))),(t27,t26)),(t2,t3))),t0); (((t3,t2),((t5,t4),((((t15,t14),(t16,((t12,t13),((t24,t25),(t11,(((t7,t6),t8),(t9,t10))))))),(((t17,t18),((t22,t21),(t20,t19))),t23)),(t26,t27)))),t1,t0); (((t5,t4),(((t3,t2),(((t15,t14),(((t24,t25),(t11,(((t7,t6),t8),(t9,t10)))),(t16,(t12,t13)))),(((t17,t18),((t22,t21),(t20,t19))),t23))),(t26,t27))),t1,t0); (((t5,t4),(((((t15,t14),(t11,(((t7,t6),t8),(t9,t10)))),((t12,t13),t16)),((t24,t25),(((t20,t19),((t17,t18),(t22,t21))),t23))),((t26,t27),(t3,t2)))),t1,t0); ((((t5,t4),(t27,t26)),((((t11,(((t7,t6),t8),(t9,t10))),(((t12,t13),t16),(t15,t14))),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23))),(t3,t2))),t1,t0); (((t3,t2),(((t27,t26),(((t11,(((t7,t6),t8),(t9,t10))),(((t12,t13),t16),(t15,t14))),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23)))),(t5,t4))),t1,t0); (((t3,t2),((((((t11,(((t7,t6),t8),(t9,t10))),(t12,t13)),t16),(t15,t14)),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23))),((t5,t4),(t27,t26)))),t1,t0); (((t3,t2),(((((t11,(((t7,t6),t8),(t9,t10))),((t12,t13),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23)))),(t16,(t15,t14))),(t27,t26)),(t5,t4))),t1,t0); ((((t3,t2),(t16,((t15,t14),((((t17,t18),((t22,t21),(t20,t19))),t23),(((t24,t25),(t11,(((t7,t6),t8),(t9,t10)))),(t12,t13)))))),((t27,t26),(t5,t4))),t1,t0); ((((((t17,t18),((t22,t21),(t20,t19))),t23),((((t24,t25),(t11,(((t7,t6),t8),(t9,t10)))),(t12,t13)),(t16,(t15,t14)))),(((t3,t2),(t27,t26)),(t5,t4))),t1,t0); (((t3,t2),((((((t17,t18),((t22,t21),(t20,t19))),t23),((((t11,(((t7,t6),t8),(t9,t10))),(t12,t13)),(t16,(t15,t14))),(t24,t25))),(t27,t26)),(t5,t4))),t1,t0); (t1,((t4,t5),(((t3,t2),(t26,t27)),(((t16,(t15,t14)),((((t9,t10),(t8,(t6,t7))),t11),((t25,t24),(t12,t13)))),(((t18,t17),((t19,t20),(t21,t22))),t23)))),t0); (t1,((t4,t5),(((t3,t2),(t26,t27)),(((((((t9,t10),(t8,(t6,t7))),t11),(t25,t24)),(t12,t13)),(t16,(t15,t14))),(((t18,t17),((t19,t20),(t21,t22))),t23)))),t0); (t1,(((t3,t2),(t26,t27)),(((((t25,t24),(t12,t13)),(t16,((((t9,t10),(t8,(t6,t7))),t11),(t15,t14)))),(((t18,t17),((t19,t20),(t21,t22))),t23)),(t4,t5))),t0); (t1,((t4,t5),(((t3,t2),(t26,t27)),((((t12,t13),(((t9,t10),(t8,(t6,t7))),t11)),((t15,t14),t16)),((t25,t24),(((t18,t17),((t19,t20),(t21,t22))),t23))))),t0); (t1,((t4,t5),((t3,t2),((t26,t27),((t16,(((((t9,t10),(t8,(t6,t7))),t11),(t25,t24)),((t12,t13),(t15,t14)))),(t23,((t18,t17),((t19,t20),(t21,t22)))))))),t0); (t1,((((t16,(t15,t14)),(((((t9,t10),(t8,(t6,t7))),t11),(t25,t24)),(t12,t13))),(t23,((t18,t17),((t19,t20),(t21,t22))))),((t26,t27),((t3,t2),(t4,t5)))),t0); (t1,((((t15,t14),(((t12,t13),(((t9,t10),(t8,(t6,t7))),t11)),t16)),((t25,t24),(((t4,t5),(t26,t27)),(((t18,t17),((t19,t20),(t21,t22))),t23)))),(t3,t2)),t0); (t1,(((t4,t5),(t26,t27)),((((t15,t14),(((t12,t13),(((t9,t10),(t8,(t6,t7))),t11)),((t25,t24),(((t18,t17),(((t19,t20),t22),t21)),t23)))),t16),(t3,t2))),t0); (t1,((t3,t2),((t4,t5),((t26,t27),((((t18,t17),((t19,t20),(t22,t21))),t23),(((t16,(t15,t14)),((t12,t13),(((t9,t10),(t8,(t6,t7))),t11))),(t25,t24)))))),t0); (t1,((t3,t2),((t4,t5),(t27,((((t16,(t15,t14)),(((t25,t24),(t12,t13)),(((t9,t10),(t8,(t6,t7))),t11))),(((t18,t17),((t19,t20),(t22,t21))),t23)),t26)))),t0); (((t3,t2),((t5,t4),(((t16,(((t12,t13),((((t10,t9),(t8,(t6,t7))),t11),(t24,t25))),(t15,t14))),((((t20,t19),(t22,t21)),(t17,t18)),t23)),(t26,t27)))),t1,t0); (((t3,t2),((t5,t4),(((t16,(((t24,t25),(t12,t13)),((t15,t14),(((t10,t9),(t8,(t6,t7))),t11)))),((((t20,t19),(t22,t21)),(t17,t18)),t23)),(t26,t27)))),t1,t0); (((t3,t2),((t5,t4),((((t16,(t15,t14)),(((((t10,t9),(t8,(t6,t7))),t11),(t12,t13)),(t24,t25))),((((t20,t19),t22),(t21,(t17,t18))),t23)),(t26,t27)))),t1,t0); ((((((t24,t25),((t16,(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13)))),((((t20,t19),(t21,t22)),(t17,t18)),t23)),((t3,t2),(t26,t27))),(t5,t4)),t1,t0); (((t3,t2),((((t5,t4),t26),t27),((((t15,t14),((((t10,t9),(t8,(t6,t7))),t11),((t24,t25),(t12,t13)))),t16),((((t20,t19),(t21,t22)),(t17,t18)),t23)))),t1,t0); (((t3,t2),(((t5,t4),(t26,t27)),((((((t10,t9),(t8,(t6,t7))),t11),(t12,t13)),(t16,(t15,t14))),((((t20,t19),(t21,t22)),(t17,t18)),((t24,t25),t23))))),t1,t0); (((t3,t2),(((((t12,t13),(t16,((t15,t14),(((t10,t9),(t8,(t6,t7))),t11)))),((t24,t25),(t23,(((t20,t19),(t21,t22)),(t17,t18))))),(t26,t27)),(t5,t4))),t1,t0); (((t5,t4),((t3,t2),(((((t15,t14),t16),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13))),((t24,t25),(t23,(((t20,t19),(t21,t22)),(t17,t18))))),(t26,t27)))),t1,t0); (((((t5,t4),(t16,((((((t10,t9),(t8,(t6,t7))),t11),(t12,t13)),((t24,t25),(t23,(((t20,t19),(t21,t22)),(t17,t18))))),(t15,t14)))),(t26,t27)),(t3,t2)),t1,t0); (((t5,t4),(((t23,(((t20,t19),(t21,t22)),(t17,t18))),((((t15,t14),t16),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13))),(t24,t25))),((t26,t27),(t3,t2)))),t1,t0); (t1,((t5,t4),((t26,t27),((((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),((t13,t12),(t16,((((t9,t10),(t8,(t6,t7))),t11),(t15,t14))))),(t2,t3)))),t0); (t1,((t5,t4),((t26,t27),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t13,t12),(t15,t14)),(t16,((t24,t25),(((t9,t10),(t8,(t6,t7))),t11))))),(t2,t3)))),t0); (t1,((((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t13,t12),(t16,(t15,t14))),((t24,t25),(((t9,t10),(t8,(t6,t7))),t11)))),((t26,t27),(t2,t3))),(t5,t4)),t0); (t1,(((t26,t27),(t2,t3)),((t5,t4),((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t15,t14),((((t24,t25),(((t9,t10),(t8,(t6,t7))),t11)),(t13,t12)),t16))))),t0); (t1,((t2,t3),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),((((t13,t12),(t24,t25)),((t15,t14),(((t9,t10),(t8,(t6,t7))),t11))),t16)),((t5,t4),(t26,t27)))),t0); (t1,((t2,t3),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t24,t25),((t16,((t13,t12),(t15,t14))),(((t9,t10),(t8,(t6,t7))),t11)))),((t5,t4),(t26,t27)))),t0); (t1,(((t2,t3),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t15,t14),(((((t9,t10),(t8,(t6,t7))),t11),(t24,t25)),((t13,t12),t16)))),(t26,t27))),(t5,t4)),t0); (t1,((t2,t3),((((t23,(((t22,t21),(t19,t20)),(t18,t17))),((((t24,t25),(t13,t12)),((t15,t14),(((t9,t10),(t8,(t6,t7))),t11))),t16)),(t26,t27)),(t5,t4))),t0); (t1,(((t2,t3),(t16,((t15,t14),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t24,t25)),((((t9,t10),(t8,(t6,t7))),t11),(t13,t12)))))),((t26,t27),(t5,t4))),t0); (t1,((((t26,t27),(t2,t3)),((t23,(((t22,t21),(t19,t20)),(t18,t17))),((((t24,t25),(((t9,t10),(t8,(t6,t7))),t11)),((t15,t14),(t13,t12))),t16))),(t5,t4)),t0); (((t5,t4),(((((t15,t14),t16),((t13,t12),(t11,(((t7,t6),t8),(t10,t9))))),((((t21,t22),(t20,t19)),(t18,t17)),((t25,t24),t23))),((t3,t2),(t27,t26)))),t1,t0); (((t5,t4),(((t3,t2),(t27,t26)),(((t11,(((t7,t6),t8),(t10,t9))),(((t15,t14),t16),(t13,t12))),((t25,t24),(t23,(((t21,t22),(t20,t19)),(t18,t17))))))),t1,t0); (((((t5,t4),(t27,t26)),(((t11,(((t7,t6),t8),(t10,t9))),((t15,t14),(t16,(t13,t12)))),((t25,t24),(t23,(((t21,t22),(t20,t19)),(t18,t17)))))),(t3,t2)),t1,t0); (((t5,t4),(((t3,t2),(t27,t26)),((((t15,t14),((t13,t12),(t11,(((t7,t6),t8),(t10,t9))))),t16),(((t22,((t20,t19),t21)),(t18,t17)),((t25,t24),t23))))),t1,t0); ((((t3,t2),(t27,t26)),((t16,((((t13,t12),(t11,(((t7,t6),t8),(t10,t9)))),((t25,t24),(t23,(((t20,t19),(t21,t22)),(t18,t17))))),(t15,t14))),(t5,t4))),t1,t0); (((t5,t4),(((t3,t2),(((t25,t24),(t23,(((t20,t19),(t21,t22)),(t18,t17)))),((((t13,t12),(t15,t14)),(t11,(((t7,t6),t8),(t10,t9)))),t16))),(t27,t26))),t1,t0); (((t3,t2),(((t23,(((t20,t19),(t21,t22)),(t18,t17))),(t16,(((t13,t12),(t11,(((t7,t6),t8),(t10,t9)))),((t25,t24),(t15,t14))))),((t27,t26),(t5,t4)))),t1,t0); ((((t5,t4),(((t23,((t18,t17),(((t20,t19),t21),t22))),(t16,((t13,t12),((t15,t14),((t11,(((t7,t6),t8),(t10,t9))),(t25,t24)))))),(t27,t26))),(t3,t2)),t1,t0); ((((t5,t4),(((t23,((t18,t17),((t20,t19),(t21,t22)))),((((t13,t12),(t11,(((t7,t6),t8),(t10,t9)))),(t25,t24)),(t16,(t15,t14)))),(t27,t26))),(t3,t2)),t1,t0); ((((t16,(((t11,(((t7,t6),t8),(t10,t9))),(t15,t14)),((t13,t12),((t23,((t18,t17),((t20,t19),(t21,t22)))),(t25,t24))))),(t27,t26)),((t3,t2),(t5,t4))),t1,t0); (((t2,t3),((((t16,(((t11,((t10,t9),((t7,t6),t8))),(t13,t12)),(t14,t15))),(((t19,t20),((t18,t17),t21)),((t23,t22),(t24,t25)))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),((((((t18,t17),((t21,t22),(t19,t20))),t23),((t16,(t14,t15)),((t11,((t10,t9),((t7,t6),t8))),((t24,t25),(t13,t12))))),(t27,t26)),(t4,t5))),t1,t0); (((((((t18,t17),((t21,t22),(t19,t20))),t23),((t16,(t14,t15)),((t11,((t10,t9),((t7,t6),t8))),((t24,t25),(t13,t12))))),(t27,t26)),((t4,t5),(t2,t3))),t1,t0); ((((((((t24,t25),(((t18,t17),((t21,t22),(t19,t20))),t23)),((t13,t12),(t11,((t10,t9),((t7,t6),t8))))),(t14,t15)),t16),(t27,t26)),((t4,t5),(t2,t3))),t1,t0); ((((((((t11,((t10,t9),((t7,t6),t8))),(t24,t25)),(t13,t12)),((t14,t15),t16)),(((t18,t17),((t21,t22),(t19,t20))),t23)),(t2,t3)),((t27,t26),(t4,t5))),t1,t0); ((((((t11,((t10,t9),((t7,t6),t8))),(t16,((t13,t12),(t14,t15)))),((t24,t25),(((t18,t17),((t21,t22),(t19,t20))),t23))),(t2,t3)),((t27,t26),(t4,t5))),t1,t0); (((t2,t3),(((((t14,t15),(t16,((t11,((t10,t9),((t7,t6),t8))),(t13,t12)))),((t24,t25),(((t18,t17),((t21,t22),(t19,t20))),t23))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),((((((t18,t17),((t21,t22),(t19,t20))),t23),((((t11,((t10,t9),((t7,t6),t8))),(t13,t12)),(t14,t15)),(t16,(t24,t25)))),(t27,t26)),(t4,t5))),t1,t0); (((t4,t5),((t2,t3),(((((t18,t17),((t21,t22),(t19,t20))),t23),((((t11,((t10,t9),((t7,t6),t8))),((t24,t25),(t13,t12))),(t14,t15)),t16)),(t27,t26)))),t1,t0); (((t4,t5),(((((t19,t20),((t18,t17),(t21,t22))),(t23,(t24,t25))),((t16,(t13,t12)),((t14,t15),(t11,((t10,t9),((t7,t6),t8)))))),((t27,t26),(t2,t3)))),t1,t0); (t1,(((t5,t4),(t27,t26)),((t2,t3),(((t25,t24),(t23,((t17,t18),((t21,t22),(t19,t20))))),((t16,(t14,t15)),((t12,t13),(t11,(((t6,t7),t8),(t9,t10)))))))),t0); (t1,(((t23,((t17,t18),((t21,t22),(t19,t20)))),(((t25,t24),(t12,t13)),((t11,(((t6,t7),t8),(t9,t10))),(t16,(t14,t15))))),(((t5,t4),(t27,t26)),(t2,t3))),t0); (t1,((t2,t3),((t5,t4),(((t23,((t17,t18),((t21,t22),(t19,t20)))),((t16,(t14,t15)),((t12,t13),((t11,(((t6,t7),t8),(t9,t10))),(t25,t24))))),(t27,t26)))),t0); (t1,((((t23,((t17,t18),((t21,t22),(t19,t20)))),(((t11,(((t6,t7),t8),(t9,t10))),((t12,t13),(t25,t24))),((t14,t15),t16))),((t2,t3),(t27,t26))),(t5,t4)),t0); (t1,((((t25,t24),(t23,((t17,t18),((t21,t22),(t19,t20))))),((t12,t13),(((t14,t15),t16),(t11,(((t6,t7),t8),(t9,t10)))))),(((t2,t3),(t27,t26)),(t5,t4))),t0); (t1,(((t2,t3),(t5,t4)),(t27,(t26,((t23,((t17,t18),((t21,t22),(t19,t20)))),((t16,(t12,t13)),((t14,t15),((t25,t24),(t11,(((t6,t7),t8),(t9,t10)))))))))),t0); (t1,((t5,t4),((((((t12,t13),(t11,(((t6,t7),t8),(t9,t10)))),(t16,(t14,t15))),((t23,((t17,t18),((t21,t22),(t19,t20)))),(t25,t24))),(t27,t26)),(t2,t3))),t0); (t1,((t5,t4),(((t2,t3),(t27,t26)),(((t11,(((t6,t7),t8),(t9,t10))),(t16,((t14,t15),(t12,t13)))),((t23,((t17,t18),((t21,t22),(t19,t20)))),(t25,t24))))),t0); (t1,((t2,t3),((((t16,(t14,t15)),((t11,(((t6,t7),t8),(t9,t10))),(t12,t13))),((t23,((t17,t18),((t21,t22),(t19,t20)))),(t25,t24))),(t27,(t26,(t5,t4))))),t0); (t1,((t5,t4),((t27,(((t16,(((t14,t15),((t25,t24),(t11,(((t6,t7),t8),(t9,t10))))),(t12,t13))),(t23,((t17,t18),((t21,t22),(t19,t20))))),t26)),(t2,t3))),t0); (((t4,t5),((t27,t26),((((t24,t25),(t23,((t18,t17),((t19,t20),(t21,t22))))),((t13,t12),((t11,((t9,t10),(t8,(t7,t6)))),((t15,t14),t16)))),(t2,t3)))),t1,t0); (((((t27,t26),((t23,((t18,t17),((t19,t20),(t21,t22)))),(((t13,t12),(((t24,t25),(t11,((t9,t10),(t8,(t7,t6))))),(t15,t14))),t16))),(t2,t3)),(t4,t5)),t1,t0); (((t2,t3),((t4,t5),((t27,t26),((t23,((t18,t17),((t19,t20),(t21,t22)))),((((t24,t25),((t13,t12),(t11,((t9,t10),(t8,(t7,t6)))))),(t15,t14)),t16))))),t1,t0); ((((t2,t3),(((t23,((t18,t17),((t19,t20),(t21,t22)))),(t24,t25)),(((t13,t12),(t11,((t9,t10),(t8,(t7,t6))))),((t15,t14),t16)))),((t4,t5),(t27,t26))),t1,t0); ((((t2,t3),((t23,((t18,t17),((t19,t20),(t21,t22)))),((((t24,t25),(t13,t12)),(t11,((t9,t10),(t8,(t7,t6))))),((t15,t14),t16)))),((t4,t5),(t27,t26))),t1,t0); ((((t23,((t18,t17),((t19,t20),(t21,t22)))),(((t24,t25),(t13,t12)),((t11,((t9,t10),(t8,(t7,t6)))),((t15,t14),t16)))),(((t4,t5),(t27,t26)),(t2,t3))),t1,t0); (((t4,t5),(((((t13,t12),t16),((t11,((t9,t10),(t8,(t7,t6)))),(t15,t14))),((t23,((t18,t17),((t19,t20),(t21,t22)))),(t24,t25))),((t2,t3),(t27,t26)))),t1,t0); (((t2,t3),(t27,((((t23,((t18,t17),((t19,t20),(t21,t22)))),(((t15,t14),((t24,t25),(t11,((t9,t10),(t8,(t7,t6)))))),((t13,t12),t16))),t26),(t4,t5)))),t1,t0); (((t4,t5),((t2,t3),((t26,t27),((t23,((t18,t17),((t19,t20),(t21,t22)))),((t16,(t15,t14)),(((t24,t25),(t11,((t9,t10),(t8,(t7,t6))))),(t13,t12))))))),t1,t0); (((t4,t5),((t2,t3),((t26,t27),(((t24,t25),(t23,((t18,t17),((t19,t20),(t21,t22))))),((t16,(t15,t14)),((t11,((t9,t10),(t8,(t7,t6)))),(t13,t12))))))),t1,t0); (t1,((t5,t4),((t3,t2),((t26,t27),((((((t9,t10),(t8,(t6,t7))),t11),((t25,t24),(t13,t12))),((t15,t14),t16)),(((t18,t17),((t21,t22),(t19,t20))),t23))))),t0); (t1,((t3,t2),(((t26,t27),((((t25,t24),(t13,t12)),(((t15,t14),t16),(((t9,t10),(t8,(t6,t7))),t11))),(((t18,t17),((t21,t22),(t19,t20))),t23))),(t5,t4))),t0); (t1,(((t26,t27),(((t25,t24),(((((t9,t10),(t8,(t6,t7))),t11),(t13,t12)),(t16,(t15,t14)))),(((t18,t17),((t21,t22),(t19,t20))),t23))),((t5,t4),(t3,t2))),t0); (t1,((t3,t2),(((t26,t27),(((t25,t24),(((((t9,t10),(t8,(t6,t7))),t11),(t13,t12)),(t16,(t15,t14)))),((t22,(((t19,t20),t21),(t18,t17))),t23))),(t5,t4))),t0); (t1,((((t3,t2),(t26,t27)),((t16,((t15,t14),((((t9,t10),(t8,(t6,t7))),t11),((t25,t24),(t13,t12))))),((((t19,t20),(t22,t21)),(t18,t17)),t23))),(t5,t4)),t0); (t1,(((t3,t2),((t26,t27),(((t15,t14),(t16,((t13,t12),((t25,t24),(((t9,t10),(t8,(t6,t7))),t11))))),((((t19,t20),(t22,t21)),(t18,t17)),t23)))),(t5,t4)),t0); (t1,(((t3,t2),((t26,t27),((((t15,t14),((t13,t12),((t25,t24),(((t9,t10),(t8,(t6,t7))),t11)))),((((t19,t20),(t22,t21)),(t18,t17)),t23)),t16))),(t5,t4)),t0); (t1,((((t3,t2),(t26,t27)),(((((t9,t10),(t8,(t6,t7))),t11),((t16,(t15,t14)),(t13,t12))),((t25,t24),(t23,(((t19,t20),(t22,t21)),(t18,t17)))))),(t5,t4)),t0); (t1,(((t3,t2),((t26,t27),(((((t13,t12),t16),(t15,t14)),(((t9,t10),(t8,(t6,t7))),t11)),((t25,t24),(t23,((t19,t20),((t22,t21),(t18,t17)))))))),(t5,t4)),t0); (t1,(((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),((((t13,t12),(t25,t24)),((t15,t14),(((t9,t10),(t8,(t6,t7))),t11))),t16))),((t5,t4),(t3,t2))),t0); (t1,(((((t24,t25),(t23,(((t21,t22),(t20,t19)),(t18,t17)))),((t16,(t15,t14)),((t11,(((t6,t7),t8),(t9,t10))),(t13,t12)))),(t27,t26)),((t2,t3),(t4,t5))),t0); (t1,(((t4,t5),(t27,t26)),((t2,t3),(((t24,t25),(t23,(((t21,t22),(t20,t19)),(t18,t17)))),((t11,(((t6,t7),t8),(t9,t10))),((t16,(t13,t12)),(t15,t14)))))),t0); (t1,((((t23,((((t21,t22),(t20,t19)),(t18,t17)),(t24,t25))),((t16,(t13,t12)),((t15,t14),(t11,(((t6,t7),t8),(t9,t10)))))),((t27,t26),(t2,t3))),(t4,t5)),t0); (t1,((t2,t3),((((t23,(((t21,t22),(t20,t19)),(t18,t17))),(((t24,t25),(t11,(((t6,t7),t8),(t9,t10)))),((t16,(t13,t12)),(t15,t14)))),(t27,t26)),(t4,t5))),t0); (t1,((t2,t3),((t26,((t4,t5),((t23,(((t21,t22),(t20,t19)),(t18,t17))),((t16,(t15,t14)),((t11,(((t6,t7),t8),(t9,t10))),((t24,t25),(t13,t12))))))),t27)),t0); (t1,(((t4,t5),((t23,(((t21,t22),(t20,t19)),(t18,t17))),((t16,(t15,t14)),((t11,(((t6,t7),t8),(t9,t10))),((t24,t25),(t13,t12)))))),((t2,t3),(t27,t26))),t0); (t1,(((t4,t5),(((t23,((((t21,t22),(t20,t19)),(t18,t17)),(t24,t25))),(((t13,t12),t16),((t15,t14),(t11,(((t6,t7),t8),(t9,t10)))))),(t27,t26))),(t2,t3)),t0); (t1,(((((t24,t25),(t23,(((t21,t22),(t20,t19)),(t18,t17)))),(((t13,t12),t16),((t15,t14),(t11,(((t6,t7),t8),(t9,t10)))))),(t27,t26)),((t2,t3),(t4,t5))),t0); (t1,((((t24,t25),(t23,(((t21,t22),(t20,t19)),(t18,t17)))),((t13,t12),((t16,(t15,t14)),(t11,(((t6,t7),t8),(t9,t10)))))),(((t27,t26),(t4,t5)),(t2,t3))),t0); (t1,(((t4,t5),((t27,t26),(((t24,t25),((t18,t17),(t23,((t21,t22),(t20,t19))))),(((t13,t12),t16),((t15,t14),(t11,(((t6,t7),t8),(t9,t10)))))))),(t2,t3)),t0); (((t2,t3),((t5,t4),((t27,t26),(((t15,t14),(((t25,t24),(t23,(((t20,t19),(t21,t22)),(t17,t18)))),((t13,t12),(t11,((t9,t10),((t7,t6),t8)))))),t16)))),t1,t0); ((((t27,t26),(((t23,(((t20,t19),(t21,t22)),(t17,t18))),(((t25,t24),(t13,t12)),(t11,((t9,t10),((t7,t6),t8))))),(t16,(t15,t14)))),((t2,t3),(t5,t4))),t1,t0); ((((((t25,t24),(t23,(((t20,t19),(t21,t22)),(t17,t18)))),((t15,t14),((t16,(t13,t12)),(t11,((t9,t10),((t7,t6),t8)))))),((t27,t26),(t2,t3))),(t5,t4)),t1,t0); ((((t27,t26),((t2,t3),((t23,(((t20,t19),(t21,t22)),(t17,t18))),(t16,(((t15,t14),(t13,t12)),((t25,t24),(t11,((t9,t10),((t7,t6),t8))))))))),(t5,t4)),t1,t0); (((t2,t3),((((t23,(((t20,t19),(t21,t22)),(t17,t18))),((t16,(t13,t12)),(((t25,t24),(t11,((t9,t10),((t7,t6),t8)))),(t15,t14)))),(t27,t26)),(t5,t4))),t1,t0); (((t2,t3),((((t23,(((t20,t19),(t21,t22)),(t17,t18))),(((t25,t24),(t11,((t9,t10),((t7,t6),t8)))),((t15,t14),(t16,(t13,t12))))),(t27,t26)),(t5,t4))),t1,t0); (((t2,t3),((((t23,((t25,t24),(((t20,t19),(t21,t22)),(t17,t18)))),(((t11,((t9,t10),((t7,t6),t8))),((t15,t14),(t13,t12))),t16)),(t27,t26)),(t5,t4))),t1,t0); (((((t25,t24),((((t20,t19),(t21,t22)),(t17,t18)),t23)),(((t15,t14),t16),((t13,t12),(t11,((t9,t10),((t7,t6),t8)))))),((t27,((t5,t4),t26)),(t2,t3))),t1,t0); (((t2,t3),(((((((t20,t19),(t21,t22)),(t17,t18)),t23),(t16,(((t25,t24),(t11,((t9,t10),((t7,t6),t8)))),((t15,t14),(t13,t12))))),(t26,t27)),(t5,t4))),t1,t0); (((((((t22,((t20,t19),t21)),(t17,t18)),t23),(((t11,((t9,t10),((t7,t6),t8))),((t13,t12),(t25,t24))),((t15,t14),t16))),((t2,t3),(t26,t27))),(t5,t4)),t1,t0); (((((t27,t26),(t5,t4)),(((t24,t25),(t23,((t18,t17),((t21,t22),(t19,t20))))),(((t13,t12),t16),((t15,t14),(((t9,t10),((t6,t7),t8)),t11))))),(t3,t2)),t1,t0); ((((t5,t4),((((t24,t25),(t23,((t18,t17),((t21,t22),(t19,t20))))),(((t13,t12),t16),((t15,t14),(((t9,t10),((t6,t7),t8)),t11)))),(t27,t26))),(t3,t2)),t1,t0); (((((t23,((t18,t17),((t21,t22),(t19,t20)))),(((t16,(t15,t14)),(((t9,t10),((t6,t7),t8)),t11)),((t13,t12),(t24,t25)))),((t27,t26),(t5,t4))),(t3,t2)),t1,t0); (((((t5,t4),(((t23,((t18,t17),((t21,t22),(t19,t20)))),(((t15,t14),((((t9,t10),((t6,t7),t8)),t11),(t24,t25))),(t16,(t13,t12)))),t26)),(t3,t2)),t27),t1,t0); (((((t23,((t18,t17),((t21,t22),(t19,t20)))),((t16,(t15,t14)),(((t13,t12),(((t9,t10),((t6,t7),t8)),t11)),(t24,t25)))),((t27,t26),(t5,t4))),(t3,t2)),t1,t0); ((((t3,t2),(t5,t4)),(t27,(((t23,((t18,t17),((t21,t22),(t19,t20)))),((((t13,t12),(((t9,t10),((t6,t7),t8)),t11)),((t15,t14),t16)),(t24,t25))),t26))),t1,t0); (((t3,t2),((t5,t4),(((t23,((t18,t17),((t21,t22),(t19,t20)))),((((t13,t12),(((t9,t10),((t6,t7),t8)),t11)),((t15,t14),t16)),(t24,t25))),(t26,t27)))),t1,t0); (((t5,t4),((((t23,((t18,t17),((t21,t22),(t19,t20)))),(((t15,t14),t16),(((t24,t25),(t13,t12)),(((t9,t10),((t6,t7),t8)),t11)))),(t26,t27)),(t3,t2))),t1,t0); (((t5,t4),((((((t9,t10),((t6,t7),t8)),t11),((t15,t14),(t16,(t13,t12)))),((t24,t25),(t23,((t18,t17),((t21,t22),(t19,t20)))))),((t3,t2),(t26,t27)))),t1,t0); (((((t23,((t19,t20),((t18,t17),(t21,t22)))),((t13,t12),((t24,t25),((t15,t14),(((t9,t10),((t6,t7),t8)),t11))))),t16),((t3,t2),((t5,t4),(t26,t27)))),t1,t0); ((((t4,t5),(t26,t27)),((t2,t3),(((t15,t14),((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t11,((t8,(t7,t6)),(t9,t10))),((t24,t25),(t13,t12))))),t16))),t1,t0); (((t2,t3),((t4,t5),((t26,t27),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t11,((t8,(t7,t6)),(t9,t10))),((t24,t25),(t13,t12))),(t16,(t15,t14))))))),t1,t0); (((t4,t5),(((t26,t27),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t24,t25),(((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),(t15,t14)))),t16)),(t2,t3))),t1,t0); (((t4,t5),((t26,t27),((t2,t3),(((t11,((t8,(t7,t6)),(t9,t10))),((t16,(t15,t14)),(t13,t12))),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t24,t25)))))),t1,t0); (((t4,t5),((t26,t27),((t2,t3),(((((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t24,t25))),(t15,t14)),t16)))),t1,t0); (((t4,t5),((t26,t27),((t2,t3),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t24,t25)),(((t11,((t8,(t7,t6)),(t9,t10))),(t15,t14)),(t16,(t13,t12))))))),t1,t0); (((t2,t3),((t4,t5),((((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t24,t25)),((((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),(t15,t14)),t16)),(t26,t27)))),t1,t0); (((t2,t3),((t4,t5),(((t23,((((t22,t21),(t19,t20)),(t18,t17)),(t24,t25))),(((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),((t15,t14),t16))),(t26,t27)))),t1,t0); (((t4,t5),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t15,t14),((t24,t25),(t11,((t8,(t7,t6)),(t9,t10))))),(t16,(t13,t12)))),((t2,t3),(t26,t27)))),t1,t0); ((((t26,t27),(t4,t5)),((((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),((t16,(t15,t14)),((t11,((t8,(t7,t6)),(t9,t10))),(t13,t12)))),(t2,t3))),t1,t0); (t1,((t2,t3),((((t23,((t22,(t21,(t20,t19))),(t18,t17))),((t16,((t14,t15),((t12,t13),(((t9,t10),((t7,t6),t8)),t11)))),(t25,t24))),(t26,t27)),(t4,t5))),t0); (t1,((t2,t3),(((((t12,t13),((((t9,t10),((t7,t6),t8)),t11),((t14,t15),t16))),((t25,t24),(t23,(((t20,t19),(t22,t21)),(t18,t17))))),(t26,t27)),(t4,t5))),t0); (t1,((t2,t3),((((((t14,t15),t16),((t12,t13),(((t9,t10),((t7,t6),t8)),t11))),((t25,t24),(t23,(((t20,t19),(t22,t21)),(t18,t17))))),(t26,t27)),(t4,t5))),t0); (t1,(((t14,t15),((((t12,t13),(((t9,t10),((t7,t6),t8)),t11)),t16),(t23,((((t20,t19),(t22,t21)),(t18,t17)),(t25,t24))))),(((t2,t3),(t26,t27)),(t4,t5))),t0); (t1,(((((t25,t24),(t23,(((t20,t19),(t22,t21)),(t18,t17)))),(((t14,t15),(t12,t13)),(((t9,t10),((t7,t6),t8)),t11))),t16),(((t26,t27),(t4,t5)),(t2,t3))),t0); (t1,(((((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t14,t15),(((t12,t13),((t25,t24),(((t9,t10),((t7,t6),t8)),t11))),t16))),(t26,t27)),(t4,t5)),(t2,t3)),t0); (t1,((((t23,(((t20,t19),(t22,t21)),(t18,t17))),((((t14,t15),((t25,t24),(((t9,t10),((t7,t6),t8)),t11))),(t12,t13)),t16)),(t26,t27)),((t4,t5),(t2,t3))),t0); (t1,((t4,t5),((t26,t27),((t2,t3),((t23,(((t20,t19),(t22,t21)),(t18,t17))),(((t14,t15),(((t12,t13),(t25,t24)),(((t9,t10),((t7,t6),t8)),t11))),t16))))),t0); (t1,(((t2,t3),((t23,(((t20,t19),(t22,t21)),(t18,t17))),((((((t9,t10),((t7,t6),t8)),t11),(t12,t13)),(t16,(t14,t15))),(t25,t24)))),((t4,t5),(t26,t27))),t0); (t1,((((t2,t3),((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t16,(t14,t15)),((t12,t13),((((t9,t10),((t7,t6),t8)),t11),(t25,t24)))))),((t4,t5),t27)),t26),t0); (t1,((t2,t3),(((((((t21,t22),(t19,t20)),(t18,t17)),t23),(t16,((((t25,t24),(t13,t12)),(t11,((t9,t10),((t7,t6),t8)))),(t15,t14)))),(t26,t27)),(t4,t5))),t0); (t1,((t2,t3),((t16,(((((((t21,t22),(t19,t20)),(t18,t17)),t23),(t25,t24)),((t13,t12),(t11,((t9,t10),((t7,t6),t8))))),(t15,t14))),((t4,t5),(t26,t27)))),t0); (t1,((t2,t3),((t26,((((((t21,t22),(t19,t20)),(t18,t17)),t23),(((t13,t12),((t25,t24),(t11,((t9,t10),((t7,t6),t8))))),((t15,t14),t16))),(t4,t5))),t27)),t0); (t1,((t2,t3),((t4,t5),((t27,t26),(((t25,t24),((((t21,t22),(t19,t20)),(t18,t17)),t23)),(((t11,((t9,t10),((t7,t6),t8))),(t13,t12)),((t15,t14),t16)))))),t0); (t1,((t2,t3),((t4,t5),((t27,t26),(((t25,t24),((((t21,t22),(t19,t20)),(t18,t17)),t23)),(((t11,((t9,t10),((t7,t6),t8))),(t16,(t13,t12))),(t15,t14)))))),t0); (t1,((((t25,t24),((((t21,t22),(t19,t20)),(t18,t17)),t23)),((t11,((t9,t10),((t7,t6),t8))),((t13,t12),(t16,(t15,t14))))),((t4,t5),((t2,t3),(t27,t26)))),t0); (t1,(((t2,t3),(t27,t26)),((((t25,t24),((((t21,t22),(t19,t20)),(t18,t17)),t23)),((t13,t12),((t16,(t15,t14)),(t11,((t9,t10),((t7,t6),t8)))))),(t4,t5))),t0); (t1,((t2,t3),(((t27,t26),((((t21,(t22,(t19,t20))),(t18,t17)),t23),(((t25,t24),(t13,t12)),((t16,(t15,t14)),(t11,((t9,t10),((t7,t6),t8))))))),(t4,t5))),t0); (t1,((((t2,t3),(t27,t26)),((((t21,(t22,(t19,t20))),(t18,t17)),t23),((t16,(t15,t14)),((t11,((t9,t10),((t7,t6),t8))),((t25,t24),(t13,t12)))))),(t4,t5)),t0); (t1,(((t27,t26),(((t25,t24),((((t19,t20),(t21,t22)),(t18,t17)),t23)),((t16,(t15,t14)),((t11,((t9,t10),((t7,t6),t8))),(t13,t12))))),((t4,t5),(t2,t3))),t0); (((t3,t2),((((t5,t4),t26),((t23,((t18,t17),((t20,t19),(t21,t22)))),((t16,(t25,t24)),(((((t8,(t6,t7)),(t10,t9)),t11),(t12,t13)),(t14,t15))))),t27)),t1,t0); ((((t5,t4),(t26,t27)),((t3,t2),(((((t8,(t6,t7)),(t10,t9)),t11),((t12,t13),(t16,(t14,t15)))),((t23,((t18,t17),((t20,t19),(t21,t22)))),(t25,t24))))),t1,t0); (((t3,t2),(((((t14,t15),(((((t8,(t6,t7)),(t10,t9)),t11),(t12,t13)),((t23,((t18,t17),((t20,t19),(t21,t22)))),(t25,t24)))),t16),(t26,t27)),(t5,t4))),t1,t0); (((((t23,((t18,t17),((t20,t19),(t21,t22)))),((t16,((((t8,(t6,t7)),(t10,t9)),t11),(t14,t15))),((t12,t13),(t25,t24)))),(t26,t27)),((t5,t4),(t3,t2))),t1,t0); (((t3,t2),((((t23,((t18,t17),((t20,t19),(t21,t22)))),((((((t8,(t6,t7)),(t10,t9)),t11),(t25,t24)),((t12,t13),(t14,t15))),t16)),(t26,t27)),(t5,t4))),t1,t0); ((((t3,t2),(t26,t27)),((t5,t4),(t16,((t23,((t18,t17),((t20,t19),(t21,t22)))),(((((t8,(t6,t7)),(t10,t9)),t11),(t25,t24)),((t12,t13),(t14,t15))))))),t1,t0); ((((t5,t4),(((t23,((t18,t17),((t20,t19),(t21,t22)))),((t14,t15),((((((t8,(t6,t7)),(t10,t9)),t11),(t25,t24)),(t12,t13)),t16))),(t26,t27))),(t3,t2)),t1,t0); (((t5,t4),(((t23,((t18,t17),(t22,((t20,t19),t21)))),(((((t8,(t6,t7)),(t10,t9)),t11),((t25,t24),(t12,t13))),(t16,(t14,t15)))),((t3,t2),(t26,t27)))),t1,t0); (((t5,t4),((t3,t2),((t26,t27),((t16,(t14,t15)),(((t25,t24),(t23,((t18,t17),((t20,t19),(t21,t22))))),((((t8,(t6,t7)),(t10,t9)),t11),(t12,t13))))))),t1,t0); (((t3,t2),(((t26,t27),((t23,((t18,t17),((t20,t19),(t21,t22)))),((((t25,t24),(((t8,(t6,t7)),(t10,t9)),t11)),(t12,t13)),(t16,(t14,t15))))),(t5,t4))),t1,t0); (t1,(((((t24,t25),(t23,((t18,t17),((t22,t21),(t19,t20))))),(((t14,t15),t16),((t12,t13),(t11,((t10,t9),((t6,t7),t8)))))),(t26,t27)),((t5,t4),(t2,t3))),t0); (t1,(((t26,t27),(t2,t3)),(((t23,((t18,t17),((t22,t21),(t19,t20)))),(t16,(((t24,t25),(t12,t13)),((t11,((t10,t9),((t6,t7),t8))),(t14,t15))))),(t5,t4))),t0); (t1,(((t5,t4),((t26,t27),(((t23,((t18,t17),((t22,t21),(t19,t20)))),(t24,t25)),((t16,(t12,t13)),((t11,((t10,t9),((t6,t7),t8))),(t14,t15)))))),(t2,t3)),t0); (t1,(((((t23,((t18,t17),(t22,(t21,(t19,t20))))),(t24,t25)),(((t11,((t10,t9),((t6,t7),t8))),((t14,t15),(t12,t13))),t16)),((t5,t4),(t26,t27))),(t2,t3)),t0); (t1,((t5,t4),(((t2,t3),(t26,t27)),(t16,(((t23,((t18,t17),((t19,t20),(t22,t21)))),(t24,t25)),((t14,t15),((t12,t13),(t11,((t10,t9),((t6,t7),t8))))))))),t0); (t1,(((t23,((t21,(t18,t17)),((t19,t20),t22))),((t16,(t14,t15)),((t12,t13),((t24,t25),(t11,((t10,t9),((t6,t7),t8))))))),((t5,t4),((t2,t3),(t26,t27)))),t0); (t1,((t5,t4),((t2,t3),((t27,t26),(((t24,t25),(t23,((t18,t17),((t19,t20),(t21,t22))))),((t16,(t14,t15)),((t11,((t10,t9),((t6,t7),t8))),(t12,t13))))))),t0); (t1,((((t2,t3),(t27,t26)),((t23,((t18,t17),((t19,t20),(t21,t22)))),(((t24,t25),(t12,t13)),((t16,(t14,t15)),(t11,((t10,t9),((t6,t7),t8))))))),(t5,t4)),t0); (t1,(((t16,((t14,t15),(((t11,((t10,t9),((t6,t7),t8))),(t12,t13)),((t24,t25),(t23,((t18,t17),((t19,t20),(t21,t22)))))))),(t2,t3)),((t5,t4),(t27,t26))),t0); (t1,((t5,t4),(((t23,((t18,t17),((t19,t20),(t21,t22)))),((((t14,t15),((t11,((t10,t9),((t6,t7),t8))),(t24,t25))),(t12,t13)),t16)),((t2,t3),(t27,t26)))),t0); ((((t27,t26),(((t23,((t18,t17),((t21,t22),(t20,t19)))),(t16,(((t24,t25),(((t9,t10),(t8,(t6,t7))),t11)),((t12,t13),(t15,t14))))),(t2,t3))),(t4,t5)),t1,t0); (((t2,t3),((t27,t26),((t4,t5),(((t24,t25),(t23,((t18,t17),((t21,t22),(t20,t19))))),(((t15,t14),t16),((((t9,t10),(t8,(t6,t7))),t11),(t12,t13))))))),t1,t0); (((t4,t5),(((t2,t3),((t23,((t18,t17),((t21,t22),(t20,t19)))),(((t15,t14),t16),((((t9,t10),(t8,(t6,t7))),t11),((t24,t25),(t12,t13)))))),(t27,t26))),t1,t0); (((t4,t5),((t2,t3),(((((t24,t25),t23),(((t18,t17),(t21,(t20,t19))),t22)),(((t15,t14),t16),((((t9,t10),(t8,(t6,t7))),t11),(t12,t13)))),(t27,t26)))),t1,t0); (((t2,t3),((((t24,t25),(t23,((t18,t17),((t20,t19),(t21,t22))))),((((t9,t10),(t8,(t6,t7))),t11),((t12,t13),((t15,t14),t16)))),((t4,t5),(t27,t26)))),t1,t0); (((t2,t3),(((((t18,t17),((t20,t19),(t21,t22))),t23),(((t15,t14),(t12,t13)),(t16,((t24,t25),(((t9,t10),(t8,(t6,t7))),t11))))),((t4,t5),(t27,t26)))),t1,t0); (((t4,t5),(((((t18,t17),((t20,t19),(t21,t22))),t23),(t16,(((t24,t25),((t12,t13),(((t9,t10),(t8,(t6,t7))),t11))),(t15,t14)))),((t2,t3),(t26,t27)))),t1,t0); (((t4,t5),((((((t18,t17),((t20,t19),(t21,t22))),t23),(t24,t25)),(t16,((((t9,t10),(t8,(t6,t7))),t11),((t12,t13),(t15,t14))))),((t2,t3),(t26,t27)))),t1,t0); (((t4,t5),((t2,t3),((t26,t27),(((t15,t14),(t16,((t12,t13),((t24,t25),(((t9,t10),(t8,(t6,t7))),t11))))),(t23,((t18,t17),((t20,t19),(t21,t22)))))))),t1,t0); ((((t4,t5),(t26,t27)),((((((t9,t10),(t8,(t6,t7))),t11),((t16,(t12,t13)),(t15,t14))),((t24,t25),(t23,((t18,t17),((t20,t19),(t21,t22)))))),(t2,t3))),t1,t0); (t1,((t5,t4),((t26,t27),((((t25,t24),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),((t16,(t15,t14)),((t12,t13),((((t7,t6),t8),(t9,t10)),t11)))),(t2,t3)))),t0); (t1,(((t16,((t15,t14),(((t12,t13),((((t7,t6),t8),(t9,t10)),t11)),((t25,t24),(t23,(((t22,t21),(t19,t20)),(t18,t17))))))),(t2,t3)),((t5,t4),(t26,t27))),t0); (t1,((t2,t3),(((t26,t27),(t16,((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t25,t24),(t12,t13)),((t15,t14),((((t7,t6),t8),(t9,t10)),t11)))))),(t5,t4))),t0); (t1,((t2,t3),((((t12,t13),(t16,((t15,t14),((((t7,t6),t8),(t9,t10)),t11)))),((((t22,t21),(t19,t20)),((t18,t17),t23)),(t25,t24))),((t26,t27),(t5,t4)))),t0); (t1,((((((((t7,t6),t8),(t9,t10)),t11),(t12,t13)),(t16,(t15,t14))),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t25,t24))),(((t26,t27),(t5,t4)),(t2,t3))),t0); (t1,(((((t12,t13),((t16,(t15,t14)),((((t7,t6),t8),(t9,t10)),t11))),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t25,t24))),((t2,t3),(t26,t27))),(t5,t4)),t0); (t1,(((t26,t27),((((t15,t14),(((((t7,t6),t8),(t9,t10)),t11),(t12,t13))),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t25,t24))),t16)),((t5,t4),(t2,t3))),t0); (t1,(((t26,t27),(((t16,(t15,t14)),(((((t7,t6),t8),(t9,t10)),t11),(t12,t13))),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t25,t24)))),((t5,t4),(t2,t3))),t0); (t1,((((t2,t3),(t26,t27)),((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t25,t24),(((((t7,t6),t8),(t9,t10)),t11),(((t12,t13),t16),(t15,t14)))))),(t5,t4)),t0); (t1,((((t26,t27),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t16,((t15,t14),((t12,t13),((t25,t24),((((t7,t6),t8),(t9,t10)),t11))))))),(t5,t4)),(t2,t3)),t0); (t1,((t3,t2),(((t26,(((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t24,t25),(t12,t13)),((((t8,(t6,t7)),(t9,t10)),t11),((t14,t15),t16))))),(t4,t5)),t27)),t0); (t1,((t4,t5),(((t26,t27),(t3,t2)),(((t14,t15),(((t24,t25),((((t22,t21),(t19,t20)),(t17,t18)),t23)),((t12,t13),(((t8,(t6,t7)),(t9,t10)),t11)))),t16))),t0); (t1,((t3,t2),(((t26,t27),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t24,t25),(((t8,(t6,t7)),(t9,t10)),t11)),(((t12,t13),t16),(t14,t15))))),(t4,t5))),t0); (t1,(((t26,t27),((t3,t2),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t24,t25),(t12,t13)),(((t14,t15),t16),(((t8,(t6,t7)),(t9,t10)),t11)))))),(t4,t5)),t0); (t1,(((((t14,t15),((((t24,t25),(((t8,(t6,t7)),(t9,t10)),t11)),(t12,t13)),((((t22,t21),(t19,t20)),(t17,t18)),t23))),t16),((t26,t27),(t3,t2))),(t4,t5)),t0); (t1,((t3,t2),((((t24,t25),((((t22,t21),(t19,t20)),(t17,t18)),t23)),((t12,t13),((t16,(t14,t15)),(((t8,(t6,t7)),(t9,t10)),t11)))),((t4,t5),(t26,t27)))),t0); (t1,((t4,t5),(((t3,t2),(t26,t27)),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t24,t25),(t12,t13)),((t16,(t14,t15)),(((t8,(t6,t7)),(t9,t10)),t11)))))),t0); (t1,((t27,((t3,t2),t26)),((((t12,t13),((((t8,(t6,t7)),(t9,t10)),t11),(t16,(t14,t15)))),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(t24,t25))),(t4,t5))),t0); (t1,((t27,(t26,(((((t22,t21),(t19,t20)),(t17,t18)),t23),((t24,t25),((t16,(t14,t15)),((t12,t13),(((t8,(t6,t7)),(t9,t10)),t11))))))),((t4,t5),(t3,t2))),t0); (t1,((t3,t2),((((((t24,t25),(((t22,t21),(t19,t20)),(t17,t18))),t23),(t16,((t14,t15),((t12,t13),(((t8,(t6,t7)),(t9,t10)),t11))))),(t27,t26)),(t4,t5))),t0); ((((t26,((t5,t4),(t3,t2))),t27),(((t16,(t14,t15)),(((t24,t25),(t13,t12)),(t11,((t8,(t6,t7)),(t9,t10))))),(((t18,t17),((t19,t20),(t22,t21))),t23))),t1,t0); (((t3,t2),(((t27,t26),(t5,t4)),(((t13,t12),((t16,(t14,t15)),(t11,((t8,(t6,t7)),(t9,t10))))),((t24,t25),(((t18,t17),((t19,t20),(t22,t21))),t23))))),t1,t0); (((t3,t2),((t5,t4),(((((t18,t17),((t19,t20),(t22,t21))),t23),((t16,(t14,t15)),(((t24,t25),(t11,((t8,(t6,t7)),(t9,t10)))),(t13,t12)))),(t27,t26)))),t1,t0); (((t5,t4),((((((t18,t17),((t19,t20),(t22,t21))),t23),(((t13,t12),(t24,t25)),((t16,(t14,t15)),(t11,((t8,(t6,t7)),(t9,t10)))))),(t27,t26)),(t3,t2))),t1,t0); (((((((t18,t17),((t19,t20),(t22,t21))),t23),((((t14,t15),((t11,((t8,(t6,t7)),(t9,t10))),(t24,t25))),(t13,t12)),t16)),(t27,t26)),((t3,t2),(t5,t4))),t1,t0); ((((t3,t2),((((t18,t17),((t19,t20),(t22,t21))),t23),((t24,t25),(((t14,t15),(t11,((t8,(t6,t7)),(t9,t10)))),((t13,t12),t16))))),((t27,t26),(t5,t4))),t1,t0); ((((t27,t26),(((t16,(t14,t15)),(((t24,t25),(t11,((t8,(t6,t7)),(t9,t10)))),(t13,t12))),(((t18,t17),((t19,t20),(t22,t21))),t23))),((t5,t4),(t3,t2))),t1,t0); (((((t11,((t8,(t6,t7)),(t9,t10))),(((t13,t12),t16),(t14,t15))),(((t18,t17),((t19,t20),(t22,t21))),((t24,t25),t23))),(((t3,t2),(t27,t26)),(t5,t4))),t1,t0); (((((t14,t15),t16),(((t24,t25),(t23,((t18,t17),((t19,t20),(t22,t21))))),((t13,t12),(t11,((t8,(t6,t7)),(t9,t10)))))),((t3,t2),((t27,t26),(t5,t4)))),t1,t0); (((t3,t2),(((((t24,t25),(t23,((t18,t17),((t19,t20),(t22,t21))))),(((t13,t12),(t11,((t8,(t6,t7)),(t9,t10)))),((t14,t15),t16))),(t27,t26)),(t5,t4))),t1,t0); (t1,((((((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),(t16,(t14,t15))),((t24,t25),(((t21,(t20,t19)),((t18,t17),t22)),t23))),((t2,t3),(t27,t26))),(t4,t5)),t0); (t1,((t2,t3),(((t27,t26),(((((t24,t25),(t11,((t10,t9),((t7,t6),t8)))),(t12,t13)),(t16,(t14,t15))),((((t22,t21),(t20,t19)),(t18,t17)),t23))),(t4,t5))),t0); (t1,((t4,t5),(((t2,t3),(t27,t26)),(((t16,(t12,t13)),((t14,t15),(t11,((t10,t9),((t7,t6),t8))))),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23))))),t0); (t1,(((t2,t3),(t4,t5)),((t27,t26),(((t16,(t14,t15)),((t11,((t10,t9),((t7,t6),t8))),(t12,t13))),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23))))),t0); (t1,((t4,t5),(((((t24,t25),(t12,t13)),((t16,(t14,t15)),(t11,((t10,t9),((t7,t6),t8))))),((((t22,t21),(t20,t19)),(t18,t17)),t23)),((t2,t3),(t27,t26)))),t0); (t1,((t2,t3),((t4,t5),((t27,t26),(((t16,((t12,t13),(t14,t15))),(t11,((t10,t9),((t7,t6),t8)))),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23)))))),t0); (t1,(((((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),(t16,(t14,t15))),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23))),((t4,t5),((t2,t3),(t27,t26)))),t0); (t1,((t2,t3),(((t27,t26),((((t16,(t12,t13)),(t11,((t10,t9),((t7,t6),t8)))),(t14,t15)),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23)))),(t4,t5))),t0); (t1,(((t2,t3),((((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),((t14,t15),t16)),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23)))),((t4,t5),(t27,t26))),t0); (t1,((t2,t3),(((((t16,(t12,t13)),((t14,t15),(t11,((t10,t9),((t7,t6),t8))))),((((t22,t21),(t20,t19)),(t18,t17)),(t23,(t24,t25)))),(t27,t26)),(t4,t5))),t0); (t1,((t4,t5),((t26,t27),((t3,t2),((((t18,t17),((t22,t21),(t20,t19))),t23),(t16,((t14,t15),((t24,t25),((t12,t13),((((t6,t7),t8),(t10,t9)),t11))))))))),t0); (t1,((t4,t5),(((((t18,t17),((t22,t21),(t20,t19))),t23),((t16,(t14,t15)),(((t24,t25),(t12,t13)),((((t6,t7),t8),(t10,t9)),t11)))),((t26,t27),(t3,t2)))),t0); (t1,((t3,t2),((((((t18,t17),((t22,t21),(t20,t19))),t23),(((t12,t13),t16),((t14,t15),(((((t6,t7),t8),(t10,t9)),t11),(t24,t25))))),(t26,t27)),(t4,t5))),t0); (t1,((((t3,t2),(((t24,t25),(((t18,t17),((t22,t21),(t20,t19))),t23)),(((t12,t13),t16),((t14,t15),((((t6,t7),t8),(t10,t9)),t11))))),(t26,(t4,t5))),t27),t0); (t1,((t4,t5),(((t3,t2),(((t14,t15),((((((t6,t7),t8),(t10,t9)),t11),(t12,t13)),((t24,t25),(((t18,t17),((t22,t21),(t20,t19))),t23)))),t16)),(t27,t26))),t0); (t1,(((t3,t2),(((t24,t25),(((t18,t17),((t22,t21),(t20,t19))),t23)),((t16,((t14,t15),((((t6,t7),t8),(t10,t9)),t11))),(t12,t13)))),((t27,t26),(t4,t5))),t0); (t1,((t4,t5),(((t3,t2),((((t24,t25),(((t20,t19),((t18,t17),(t22,t21))),t23)),(((((t6,t7),t8),(t10,t9)),t11),(t12,t13))),(t16,(t14,t15)))),(t27,t26))),t0); (t1,((t3,t2),((t4,t5),(((((t18,t17),((t22,t21),(t20,t19))),t23),((((t14,t15),((((t6,t7),t8),(t10,t9)),t11)),((t24,t25),(t12,t13))),t16)),(t27,t26)))),t0); (t1,((t3,t2),((t4,t5),((((t24,t25),(((t18,t17),((t22,t21),(t20,t19))),t23)),((t16,(t14,t15)),(((((t6,t7),t8),(t10,t9)),t11),(t12,t13)))),(t27,t26)))),t0); (t1,((t4,t5),((((((t18,t17),((t22,t21),(t20,t19))),t23),(((t24,t25),(t12,t13)),((t14,t15),(((((t6,t7),t8),(t10,t9)),t11),t16)))),(t27,t26)),(t3,t2))),t0); ((((t27,t26),(((((t24,t25),t23),((t17,t18),((t21,t22),(t19,t20)))),((t16,(t14,t15)),((t12,t13),(t11,((t9,t10),(t8,(t6,t7))))))),(t3,t2))),(t5,t4)),t1,t0); (((t5,t4),(((t27,t26),(t3,t2)),((((t14,t15),(((t24,t25),(t12,t13)),(t11,((t9,t10),(t8,(t6,t7)))))),(t23,((t17,t18),((t21,t22),(t19,t20))))),t16))),t1,t0); ((((t27,t26),(t3,t2)),((((t16,(t14,t15)),((t12,t13),(t11,((t9,t10),(t8,(t6,t7)))))),((t24,t25),(t23,((t17,t18),((t21,t22),(t19,t20)))))),(t5,t4))),t1,t0); ((((t27,t26),(t3,t2)),((((t16,((t12,t13),(t14,t15))),(t11,((t9,t10),(t8,(t6,t7))))),((t24,t25),(t23,((t17,t18),((t21,t22),(t19,t20)))))),(t5,t4))),t1,t0); (((t27,(t3,t2)),((t26,((t16,((t12,t13),((t14,t15),((t24,t25),(t11,((t9,t10),(t8,(t6,t7)))))))),(t23,((t17,t18),((t21,t22),(t19,t20)))))),(t5,t4))),t1,t0); (((((t16,(((t12,t13),(t11,((t9,t10),(t8,(t6,t7))))),(t14,t15))),(t23,((t24,t25),((t17,t18),((t21,t22),(t19,t20)))))),(t3,t2)),((t26,t27),(t5,t4))),t1,t0); (((((((t24,t25),(t12,t13)),((t11,((t9,t10),(t8,(t6,t7)))),((t14,t15),t16))),(t23,(((t21,t22),(t19,t20)),(t17,t18)))),(t26,t27)),((t5,t4),(t3,t2))),t1,t0); ((((((t14,t15),t16),((t12,t13),(t11,((t9,t10),(t8,(t6,t7)))))),((t24,t25),(t23,(((t21,t22),(t19,t20)),(t17,t18))))),((t26,t27),((t5,t4),(t3,t2)))),t1,t0); (((t3,t2),(((((t12,t13),((t11,((t9,t10),(t8,(t6,t7)))),((t14,t15),t16))),((t24,t25),(t23,(((t21,t22),(t19,t20)),(t17,t18))))),(t26,t27)),(t5,t4))),t1,t0); (((((((t14,t15),t16),(((t24,t25),(t12,t13)),(t11,((t9,t10),(t8,(t6,t7)))))),(t23,(((t21,t22),(t19,t20)),(t17,t18)))),((t3,t2),(t26,t27))),(t5,t4)),t1,t0); (((t4,t5),((t27,t26),(((t16,(((t13,t12),(t14,t15)),((t24,t25),(t11,((t10,t9),(t8,(t6,t7))))))),(((t20,t19),((t22,t21),(t18,t17))),t23)),(t2,t3)))),t1,t0); (((t16,((t14,t15),(((t11,((t10,t9),(t8,(t6,t7)))),(t13,t12)),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23))))),(((t4,t5),(t2,t3)),(t27,t26))),t1,t0); ((((t4,t5),(t2,t3)),(t27,((((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23)),((t13,t12),((t16,(t14,t15)),(t11,((t10,t9),(t8,(t6,t7))))))),t26))),t1,t0); ((((t4,t5),(((((t22,t21),(t20,t19)),(t18,t17)),(t23,(t24,t25))),((((t13,t12),t16),(t14,t15)),(t11,((t10,t9),(t8,(t6,t7))))))),((t26,t27),(t2,t3))),t1,t0); (((t4,t5),((((((t22,t21),(t20,t19)),(t18,t17)),(t23,(t24,t25))),(((t11,((t10,t9),(t8,(t6,t7)))),(t13,t12)),(t16,(t14,t15)))),(t27,((t2,t3),t26)))),t1,t0); ((((t4,t5),((((((t22,t21),(t20,t19)),(t18,t17)),t23),((t14,t15),(((t24,t25),((t11,((t10,t9),(t8,(t6,t7)))),(t13,t12))),t16))),(t26,t27))),(t2,t3)),t1,t0); ((((((((t22,t21),(t20,t19)),(t18,t17)),t23),((t14,t15),((t11,((t10,t9),(t8,(t6,t7)))),((t13,t12),(t24,t25))))),t16),((t2,t3),((t4,t5),(t26,t27)))),t1,t0); ((((t2,t3),(t26,t27)),((t4,t5),((((((t22,t21),(t20,t19)),(t18,t17)),t23),((t13,t12),((t14,t15),((t24,t25),(t11,((t10,t9),(t8,(t6,t7)))))))),t16))),t1,t0); (((t4,t5),((((((t22,t21),(t20,t19)),(t18,t17)),t23),(t16,((t13,t12),(((t24,t25),(t11,((t10,t9),(t8,(t6,t7))))),(t14,t15))))),((t2,t3),(t26,t27)))),t1,t0); (((t2,t3),((((t4,t5),t26),t27),(((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23)),((t11,((t10,t9),(t8,(t6,t7)))),(((t13,t12),t16),(t14,t15)))))),t1,t0); (t1,((t2,t3),(((t26,t27),((((t13,t12),(t11,((t8,(t7,t6)),(t10,t9)))),(t16,(t14,t15))),(((t25,t24),(((t22,t21),(t20,t19)),(t18,t17))),t23))),(t5,t4))),t0); (t1,((t2,t3),(((t26,t27),((((t14,t15),((t11,((t8,(t7,t6)),(t10,t9))),((t25,t24),(t13,t12)))),t16),(((t18,t17),((t22,t21),(t20,t19))),t23))),(t5,t4))),t0); (t1,((((t2,t3),(t26,t27)),((((t14,t15),((t13,t12),((t11,((t8,(t7,t6)),(t10,t9))),(t25,t24)))),t16),(((t18,t17),((t22,t21),(t20,t19))),t23))),(t5,t4)),t0); (t1,(((t26,t27),((((((t11,((t8,(t7,t6)),(t10,t9))),(t25,t24)),(t14,t15)),(t16,(t13,t12))),(((t18,t17),((t22,t21),(t20,t19))),t23)),(t2,t3))),(t5,t4)),t0); (t1,((((t26,t27),(((t14,t15),(t16,((t13,t12),(t11,((t8,(t7,t6)),(t10,t9)))))),(((t18,t17),((t22,t21),(t20,t19))),((t25,t24),t23)))),(t2,t3)),(t5,t4)),t0); (t1,((((t16,(((t13,t12),((t25,t24),(t11,((t8,(t7,t6)),(t10,t9))))),(t14,t15))),(((t18,t17),((t22,t21),(t20,t19))),t23)),((t2,t3),(t26,t27))),(t5,t4)),t0); (t1,(((t26,t27),((((t13,t12),(t11,((t8,(t7,t6)),(t10,t9)))),((t14,t15),t16)),((t25,t24),(((t18,t17),((t22,t21),(t20,t19))),t23)))),((t5,t4),(t2,t3))),t0); (t1,((t2,t3),((t27,(((((t18,t17),((t22,t21),(t20,t19))),t23),((((t13,t12),(t11,((t8,(t7,t6)),(t10,t9)))),((t14,t15),t16)),(t25,t24))),t26)),(t5,t4))),t0); (t1,(((t2,t3),(((t14,t15),(((t25,t24),(((t18,t17),((t22,t21),(t20,t19))),t23)),((t13,t12),(t11,((t8,(t7,t6)),(t10,t9)))))),t16)),((t26,t27),(t5,t4))),t0); (t1,(((t26,t27),(((t25,t24),(((t18,t17),((t22,t21),(t20,t19))),t23)),((t13,t12),((t16,(t14,t15)),(t11,((t8,(t7,t6)),(t10,t9))))))),((t5,t4),(t2,t3))),t0); (t1,((t2,t3),(((t26,t27),(t5,t4)),((((t24,t25),(t12,t13)),((t11,((t8,(t7,t6)),(t10,t9))),(t16,(t15,t14)))),(t23,((t18,t17),((t22,t21),(t19,t20))))))),t0); (t1,((t5,t4),((t2,t3),(((((t12,t13),(((t11,((t8,(t7,t6)),(t10,t9))),(t24,t25)),(t15,t14))),t16),(t23,((t18,t17),((t22,t21),(t19,t20))))),(t26,t27)))),t0); (t1,((t2,t3),((((((t15,t14),t16),((t12,t13),(t11,((t8,(t7,t6)),(t10,t9))))),((t23,((t18,t17),((t22,t21),(t19,t20)))),(t24,t25))),(t26,t27)),(t5,t4))),t0); (t1,((t16,((((t12,t13),(t11,((t8,(t7,t6)),(t10,t9)))),((t23,((t18,t17),((t22,t21),(t19,t20)))),(t24,t25))),(t15,t14))),((t5,t4),((t26,t27),(t2,t3)))),t0); (t1,((t5,t4),((((t23,((t18,t17),((t22,t21),(t19,t20)))),((t24,t25),(((t15,t14),t16),((t12,t13),(t11,((t8,(t7,t6)),(t10,t9))))))),(t26,t27)),(t2,t3))),t0); (t1,((t2,t3),((t5,t4),((((t16,(t15,t14)),((t12,t13),((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))))),(t23,((t18,t17),((t22,t21),(t19,t20))))),(t26,t27)))),t0); (t1,((t5,t4),((t26,t27),((t2,t3),(((t16,((t11,((t8,(t7,t6)),(t10,t9))),(t15,t14))),((t12,t13),(t24,t25))),(t23,((t18,t17),((t22,t21),(t19,t20)))))))),t0); (t1,(t27,(((t2,t3),(t26,((((t11,((t8,(t7,t6)),(t10,t9))),((t15,t14),(t12,t13))),t16),(((t24,t25),t23),((t18,t17),((t22,t21),(t19,t20))))))),(t5,t4))),t0); (t1,((t5,t4),(((t26,t27),(t2,t3)),(((t16,(t15,t14)),((t12,t13),((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))))),(t23,((t18,t17),((t22,t21),(t19,t20))))))),t0); (t1,((t5,t4),(((t26,t27),(t2,t3)),((((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),((t15,t14),((t12,t13),t16))),(t23,((t18,t17),((t22,t21),(t19,t20))))))),t0); (t1,((t4,t5),((((t11,((t10,t9),(t8,(t6,t7)))),((t16,(t12,t13)),(t14,t15))),((t24,t25),(t23,((t18,t17),(t22,((t19,t20),t21)))))),((t2,t3),(t27,t26)))),t0); (t1,(((t4,t5),(t27,t26)),(((t16,((t14,t15),(((t24,t25),(t12,t13)),(t11,((t10,t9),(t8,(t6,t7))))))),(t23,(((t22,t21),(t18,t17)),(t19,t20)))),(t2,t3))),t0); (t1,((t2,t3),(((t27,t26),((((t12,t13),((t11,((t10,t9),(t8,(t6,t7)))),(t24,t25))),(t16,(t14,t15))),(t23,((t18,t17),((t19,t20),(t22,t21)))))),(t4,t5))),t0); (t1,((t2,t3),(((t27,t26),((((t11,((t10,t9),(t8,(t6,t7)))),((t24,t25),(t12,t13))),(t16,(t14,t15))),(t23,((t18,t17),((t19,t20),(t22,t21)))))),(t4,t5))),t0); (t1,((t2,t3),(((((t12,t13),((t11,((t10,t9),(t8,(t6,t7)))),(t24,t25))),(t16,(t14,t15))),(t23,((t18,t17),((t19,t20),(t22,t21))))),((t4,t5),(t27,t26)))),t0); (t1,((t4,t5),((t2,t3),((t27,t26),(((t12,t13),((t11,((t10,t9),(t8,(t6,t7)))),(t16,(t14,t15)))),((t24,t25),(t23,((t18,t17),((t19,t20),(t22,t21))))))))),t0); (t1,((((t2,t3),(t27,t26)),(((t12,t13),(t16,((t14,t15),(t11,((t10,t9),(t8,(t6,t7))))))),((t24,t25),((t18,t17),(((t19,t20),(t22,t21)),t23))))),(t4,t5)),t0); (t1,((((t2,t3),(t27,t26)),((((t18,t17),((t19,t20),(t22,t21))),(t23,(t24,t25))),((t11,((t10,t9),(t8,(t6,t7)))),(t16,((t12,t13),(t14,t15)))))),(t4,t5)),t0); (t1,((((t27,t26),((((t18,t17),((t19,t20),(t22,t21))),t23),(((t16,(t14,t15)),((t12,t13),(t11,((t10,t9),(t8,(t6,t7)))))),(t24,t25)))),(t4,t5)),(t2,t3)),t0); (t1,((t4,t5),((t2,t3),((t27,t26),(((t16,(t14,t15)),((t12,t13),(t11,((t10,t9),(t8,(t6,t7)))))),((t24,t25),(((t18,t17),((t19,t20),(t22,t21))),t23)))))),t0); (((t3,t2),(((t5,t4),(t26,t27)),(((t24,t25),(t23,((t19,t20),((t21,t22),(t18,t17))))),((t16,(t15,t14)),((t13,t12),(t11,((t10,t9),((t7,t6),t8)))))))),t1,t0); (((t5,t4),((t26,t27),((((t15,t14),(((t13,t12),(t11,((t10,t9),((t7,t6),t8)))),((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))))),t16),(t3,t2)))),t1,t0); ((((t5,t4),(((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),((t16,(t15,t14)),((t13,t12),(t11,((t10,t9),((t7,t6),t8))))))),((t26,t27),(t3,t2))),t1,t0); ((((t5,t4),(t26,t27)),((t3,t2),((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t16,(t15,t14)),(((t24,t25),(t13,t12)),(t11,((t10,t9),((t7,t6),t8)))))))),t1,t0); (((t5,t4),(((t26,t27),((t23,((t22,(t19,t20)),(t21,(t18,t17)))),(((t13,t12),t16),((t15,t14),((t11,((t10,t9),((t7,t6),t8))),(t24,t25)))))),(t3,t2))),t1,t0); (((t5,t4),((t26,t27),((((t24,t25),(t23,(((t21,t22),(t19,t20)),(t18,t17)))),((t16,(t15,t14)),((t11,((t10,t9),((t7,t6),t8))),(t13,t12)))),(t3,t2)))),t1,t0); ((((t26,t27),(t3,t2)),((t5,t4),((t23,((t22,(t19,t20)),(t21,(t18,t17)))),((((t24,t25),(t11,((t10,t9),((t7,t6),t8)))),(t13,t12)),((t15,t14),t16))))),t1,t0); (((t5,t4),((t26,t27),((t3,t2),(((t24,t25),((((t21,t22),(t19,t20)),(t18,t17)),t23)),(((t13,t12),(t15,t14)),(t16,(t11,((t10,t9),((t7,t6),t8))))))))),t1,t0); ((((t26,t27),(t3,t2)),(((((((t21,t22),(t19,t20)),(t18,t17)),t23),((t15,t14),((t11,((t10,t9),((t7,t6),t8))),((t13,t12),(t24,t25))))),t16),(t5,t4))),t1,t0); ((((t26,t27),(t3,t2)),(((((((t21,t22),(t19,t20)),(t18,t17)),t23),((t24,t25),(((t13,t12),(t15,t14)),(t11,((t10,t9),((t7,t6),t8)))))),t16),(t5,t4))),t1,t0); (t1,((t3,t2),(((t26,t27),((t23,(((t20,t19),(t22,t21)),(t18,t17))),(((t12,t13),((t25,t24),(((t9,t10),((t6,t7),t8)),t11))),(t16,(t15,t14))))),(t4,t5))),t0); (t1,(((t26,t27),(((t25,t24),(t23,(((t20,t19),(t22,t21)),(t18,t17)))),((((t9,t10),((t6,t7),t8)),t11),((t16,(t15,t14)),(t12,t13))))),((t4,t5),(t3,t2))),t0); (t1,(((((t25,t24),(t23,(((t20,t19),(t22,t21)),(t18,t17)))),((t16,((t12,t13),(t15,t14))),(((t9,t10),((t6,t7),t8)),t11))),(t3,t2)),((t26,t27),(t4,t5))),t0); (t1,(((((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t12,t13),((t25,t24),((t15,t14),(((t9,t10),((t6,t7),t8)),t11))))),t16),((t3,t2),(t26,t27))),(t4,t5)),t0); (t1,((t3,t2),((t26,(((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t16,(t15,t14)),((((t9,t10),((t6,t7),t8)),t11),((t12,t13),(t25,t24))))),t27)),(t4,t5))),t0); (t1,((t27,(t3,t2)),((t26,((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t16,(t15,t14)),((t25,t24),((((t9,t10),((t6,t7),t8)),t11),(t12,t13)))))),(t4,t5))),t0); (t1,((t4,t5),(((t26,t27),(t3,t2)),((((t16,(t15,t14)),(((t9,t10),((t6,t7),t8)),t11)),(t12,t13)),((t23,(((t20,t19),(t22,t21)),(t18,t17))),(t25,t24))))),t0); (t1,((t4,t5),((t26,t27),((t3,t2),((t23,(((t20,t19),(t22,t21)),(t18,t17))),(((t15,t14),((((t9,t10),((t6,t7),t8)),t11),(t25,t24))),(t16,(t12,t13))))))),t0); (t1,(((t3,t2),(((t25,t24),(t23,(((t20,t19),(t22,t21)),(t18,t17)))),((t16,(t15,t14)),((t12,t13),(((t9,t10),((t6,t7),t8)),t11))))),((t4,t5),(t26,t27))),t0); (t1,(((t3,t2),((t23,(((t20,t19),(t22,t21)),(t18,t17))),((((t25,t24),(((t9,t10),((t6,t7),t8)),t11)),(t12,t13)),(t16,(t15,t14))))),((t4,t5),(t26,t27))),t0); (((((t16,((t14,t15),((t11,(((t7,t6),t8),(t9,t10))),((t24,t25),(t13,t12))))),(((t18,t17),((t22,t21),(t19,t20))),t23)),(t27,t26)),((t2,t3),(t4,t5))),t1,t0); (((((((t14,t15),t16),((t13,t12),(t11,(((t7,t6),t8),(t9,t10))))),((t24,t25),(t23,((t18,t17),((t22,t21),(t19,t20)))))),(t27,t26)),((t2,t3),(t4,t5))),t1,t0); ((((t16,(((t13,t12),(t11,(((t7,t6),t8),(t9,t10)))),(t14,t15))),((t24,t25),(t23,((t18,t17),((t22,t21),(t19,t20)))))),((t4,t5),((t27,t26),(t2,t3)))),t1,t0); ((((t27,t26),(t2,t3)),((t16,((((t13,t12),((t24,t25),(t11,(((t7,t6),t8),(t9,t10))))),(t14,t15)),(t23,((t18,t17),((t22,t21),(t19,t20)))))),(t4,t5))),t1,t0); (((((t16,((t14,t15),(t11,(((t7,t6),t8),(t9,t10))))),((t13,t12),(t24,t25))),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t4,t5),((t27,t26),(t2,t3)))),t1,t0); ((((t27,t26),(((((t14,t15),((t11,(((t7,t6),t8),(t9,t10))),((t13,t12),(t24,t25)))),(t23,((t18,t17),((t22,t21),(t19,t20))))),t16),(t2,t3))),(t4,t5)),t1,t0); ((((t27,t26),((((t14,t15),(t16,((t11,(((t7,t6),t8),(t9,t10))),((t13,t12),(t24,t25))))),(t23,((t18,t17),((t22,t21),(t19,t20))))),(t2,t3))),(t4,t5)),t1,t0); ((((t27,t26),((t23,((t18,t17),((t22,t21),(t19,t20)))),(((t13,t12),t16),((t24,t25),((t14,t15),(t11,(((t7,t6),t8),(t9,t10)))))))),((t2,t3),(t4,t5))),t1,t0); (((t2,t3),((t4,t5),((t27,t26),((t23,((t18,t17),((t22,t21),(t19,t20)))),((((t24,t25),(t13,t12)),(t11,(((t7,t6),t8),(t9,t10)))),(t16,(t14,t15))))))),t1,t0); (((t2,t3),((t4,t5),((t27,t26),((t16,(t14,t15)),((t23,((t18,t17),((t22,t21),(t19,t20)))),((t13,t12),((t11,(((t7,t6),t8),(t9,t10))),(t24,t25)))))))),t1,t0); (t1,((((t25,t24),(t23,((t18,t17),((t21,t22),(t20,t19))))),(((t11,((t9,t10),(t8,(t6,t7)))),(t13,t12)),(t16,(t14,t15)))),((t5,t4),((t2,t3),(t27,t26)))),t0); (t1,((t5,t4),(((t2,t3),(t27,t26)),(t16,((t14,t15),(((t25,t24),(t23,((t18,t17),((t21,t22),(t20,t19))))),((t11,((t9,t10),(t8,(t6,t7)))),(t13,t12))))))),t0); (t1,((t2,t3),(((t27,t26),((t23,((t21,(t20,t19)),(t22,(t18,t17)))),((t14,t15),(((t11,((t9,t10),(t8,(t6,t7)))),(t25,t24)),((t13,t12),t16))))),(t5,t4))),t0); (t1,((t2,t3),(((t27,t26),(((t25,t24),(t23,(((t22,t21),(t20,t19)),(t18,t17)))),((t16,(t14,t15)),((t11,((t9,t10),(t8,(t6,t7)))),(t13,t12))))),(t5,t4))),t0); (t1,((t5,t4),((t27,t26),((t2,t3),((t23,(((t22,t21),(t20,t19)),(t18,t17))),((t16,(t14,t15)),((t11,((t9,t10),(t8,(t6,t7)))),((t25,t24),(t13,t12)))))))),t0); (t1,(((t23,(((t22,t21),(t20,t19)),(t18,t17))),(t16,((t14,t15),((t11,((t9,t10),(t8,(t6,t7)))),((t25,t24),(t13,t12)))))),((t27,t26),((t5,t4),(t2,t3)))),t0); (t1,((((t23,(((t22,t21),(t20,t19)),(t18,t17))),(((t13,t12),((t11,((t9,t10),(t8,(t6,t7)))),(t25,t24))),(t16,(t14,t15)))),((t27,t26),(t2,t3))),(t5,t4)),t0); (t1,(((t2,t3),((((t25,t24),(t23,(((t22,t21),(t20,t19)),(t18,t17)))),(((t13,t12),(t11,((t9,t10),(t8,(t6,t7))))),(t16,(t14,t15)))),(t27,t26))),(t5,t4)),t0); (t1,((((t23,((((t22,t21),(t20,t19)),(t18,t17)),(t25,t24))),((t11,((t9,t10),(t8,(t6,t7)))),(t16,((t14,t15),(t13,t12))))),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,(((t5,t4),((t23,(((t22,t21),(t20,t19)),(t18,t17))),(((t25,t24),(t13,t12)),((t11,((t9,t10),(t8,(t6,t7)))),(t16,(t14,t15)))))),((t27,t26),(t2,t3))),t0); (t1,((t5,t4),(((t27,t26),(((((t13,t12),(t24,t25)),(t16,(t11,(((t6,t7),t8),(t9,t10))))),(t15,t14)),((((t20,t19),(t21,t22)),(t17,t18)),t23))),(t3,t2))),t0); (t1,(((t27,t26),(t3,t2)),((t5,t4),(((((t13,t12),(t24,t25)),((t11,(((t6,t7),t8),(t9,t10))),(t15,t14))),((((t20,t19),(t21,t22)),(t17,t18)),t23)),t16))),t0); (t1,((t3,t2),((((((t24,t25),(t11,(((t6,t7),t8),(t9,t10)))),((t15,t14),(t13,t12))),t16),((((t20,t19),(t21,t22)),(t17,t18)),t23)),((t5,t4),(t26,t27)))),t0); (t1,((t5,t4),(((t26,t27),(t3,t2)),(t16,(((((t20,t19),(t21,t22)),(t17,t18)),t23),(((t24,t25),(t11,(((t6,t7),t8),(t9,t10)))),((t15,t14),(t13,t12))))))),t0); (t1,((((((t20,t19),(t21,t22)),(t17,t18)),t23),((((t15,t14),t16),((t11,(((t6,t7),t8),(t9,t10))),(t13,t12))),(t24,t25))),((t26,t27),((t5,t4),(t3,t2)))),t0); (t1,(((((((t20,t19),(t21,t22)),(t17,t18)),t23),(((t16,(t13,t12)),((t15,t14),(t11,(((t6,t7),t8),(t9,t10))))),(t24,t25))),((t3,t2),(t26,t27))),(t5,t4)),t0); (t1,(((t3,t2),(t26,t27)),((t5,t4),(((t11,(((t6,t7),t8),(t9,t10))),((t16,(t13,t12)),(t15,t14))),((t24,t25),((((t20,t19),(t21,t22)),(t17,t18)),t23))))),t0); (t1,(((t3,t2),(((t11,(((t6,t7),t8),(t9,t10))),(((t24,t25),(t13,t12)),((t15,t14),t16))),((((t20,t19),(t21,t22)),(t17,t18)),t23))),((t26,t27),(t5,t4))),t0); (t1,(((t26,t27),(t3,t2)),(((t16,(((t13,t12),(t11,(((t6,t7),t8),(t9,t10)))),(t15,t14))),((t24,t25),((((t20,t19),(t21,t22)),(t17,t18)),t23))),(t5,t4))),t0); (t1,(((t5,t4),(t3,t2)),((t26,((((t13,t12),t16),((t11,(((t6,t7),t8),(t9,t10))),(t15,t14))),((((t20,t19),(t21,t22)),(t17,t18)),(t23,(t24,t25))))),t27)),t0); (t1,((t27,(t3,t2)),((t4,t5),(t26,((t23,(((t22,t21),(t19,t20)),(t17,t18))),(((t14,t15),t16),((t12,t13),((t25,t24),(((t8,(t7,t6)),(t10,t9)),t11)))))))),t0); (t1,(((t26,t27),((t3,t2),(t4,t5))),((t23,(((t22,t21),(t19,t20)),(t17,t18))),(((t14,t15),t16),((t12,t13),((t25,t24),(((t8,(t7,t6)),(t10,t9)),t11)))))),t0); (t1,((t3,t2),((t4,t5),(((((t25,t24),t23),(((t22,t21),(t19,t20)),(t17,t18))),((((t14,t15),t16),(((t8,(t7,t6)),(t10,t9)),t11)),(t12,t13))),(t26,t27)))),t0); (t1,((t3,t2),((t4,t5),((((t25,t24),(t23,(((t22,t21),(t19,t20)),(t17,t18)))),(((t14,t15),t16),((((t8,(t7,t6)),(t10,t9)),t11),(t12,t13)))),(t26,t27)))),t0); (t1,((t4,t5),((((t25,t24),(t23,(((t22,t21),(t19,t20)),(t17,t18)))),(((t14,t15),t16),((((t8,(t7,t6)),(t10,t9)),t11),(t12,t13)))),((t3,t2),(t26,t27)))),t0); (t1,((t3,t2),((t4,t5),((t26,t27),((t23,((t22,(t21,(t19,t20))),(t17,t18))),((((((t8,(t7,t6)),(t10,t9)),t11),((t25,t24),(t12,t13))),(t14,t15)),t16))))),t0); (t1,(((t3,t2),(((t25,t24),(t23,(((t19,t20),(t22,t21)),(t17,t18)))),(((t14,t15),t16),((((t8,(t7,t6)),(t10,t9)),t11),(t12,t13))))),((t4,t5),(t26,t27))),t0); (t1,((t4,t5),((((t14,t15),(((((t8,(t7,t6)),(t10,t9)),t11),(t12,t13)),((((t19,t20),(t22,t21)),(t17,t18)),((t25,t24),t23)))),t16),((t26,t27),(t3,t2)))),t0); (t1,(((t26,t27),((t23,(((t19,t20),(t22,t21)),(t17,t18))),((t16,(t12,t13)),(((t25,t24),(((t8,(t7,t6)),(t10,t9)),t11)),(t14,t15))))),((t3,t2),(t4,t5))),t0); (t1,((t3,t2),((t4,t5),((t26,t27),((((((t8,(t7,t6)),(t10,t9)),t11),(t14,t15)),(((t12,t13),(t25,t24)),(t23,((t21,((t19,t20),t22)),(t17,t18))))),t16)))),t0); (((t2,t3),(((t23,((t17,t18),((t19,t20),(t21,t22)))),(t16,((t14,t15),(((t24,t25),(t13,t12)),(t11,((t8,(t6,t7)),(t10,t9))))))),((t4,t5),(t26,t27)))),t1,t0); ((((t4,t5),((t26,t27),(((t24,t25),((t17,t18),(((t19,t20),(t21,t22)),t23))),(t16,(((t13,t12),(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9)))))))),(t2,t3)),t1,t0); ((((t4,t5),((t26,t27),(((((t17,t18),((t19,t20),t21)),t22),t23),(((t24,t25),(t13,t12)),((t16,(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9)))))))),(t2,t3)),t1,t0); (((t4,t5),(((t26,t27),(((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23)),((t16,(t14,t15)),((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12))))),(t2,t3))),t1,t0); (((t2,t3),(((t4,t5),(t26,t27)),((((t24,t25),(((t19,t20),((t22,t21),(t17,t18))),t23)),((t13,t12),((t14,t15),(t11,((t8,(t6,t7)),(t10,t9)))))),t16))),t1,t0); (((t2,t3),(((t4,t5),(t26,t27)),(((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23)),(t16,(((t13,t12),(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9)))))))),t1,t0); (((((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23)),(((t16,(t13,t12)),(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9))))),((t2,t3),((t4,t5),(t26,t27)))),t1,t0); (((t2,t3),((t4,t5),(((((t17,t18),((t19,t20),(t22,t21))),t23),((t16,(t14,t15)),((t11,((t8,(t6,t7)),(t10,t9))),((t13,t12),(t24,t25))))),(t26,t27)))),t1,t0); (((((((t17,t18),((t19,t20),(t22,t21))),t23),(((t16,(t24,t25)),((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12))),(t14,t15))),(t26,t27)),((t2,t3),(t4,t5))),t1,t0); ((((((t24,t25),(t23,((t17,t18),((t19,t20),(t22,t21))))),((t13,t12),((t16,(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9)))))),(t26,t27)),((t2,t3),(t4,t5))),t1,t0); ((((t26,t27),((t23,((t18,t17),((t22,t21),(t20,t19)))),(((t14,t15),t16),((((t9,t10),(t8,(t6,t7))),t11),((t12,t13),(t24,t25)))))),((t5,t4),(t3,t2))),t1,t0); ((((t3,t2),((t23,((t18,t17),((t22,t21),(t20,t19)))),((t14,t15),(t16,((((t9,t10),(t8,(t6,t7))),t11),((t12,t13),(t24,t25))))))),((t5,t4),(t26,t27))),t1,t0); (((t5,t4),(((t26,t27),(((t24,t25),(t23,((t22,(t18,t17)),(t21,(t20,t19))))),(((((t9,t10),(t8,(t6,t7))),t11),(t12,t13)),((t14,t15),t16)))),(t3,t2))),t1,t0); ((((t26,t27),(((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),(((((t9,t10),(t8,(t6,t7))),t11),(t12,t13)),((t14,t15),t16)))),((t3,t2),(t5,t4))),t1,t0); ((((t26,t27),(t3,t2)),((t5,t4),((((t14,t15),t16),((((t9,t10),(t8,(t6,t7))),t11),((t24,t25),(t12,t13)))),(t23,((t18,t17),((t22,t21),(t20,t19))))))),t1,t0); (((t5,t4),(((((((t9,t10),(t8,(t6,t7))),t11),(t24,t25)),((t14,t15),((t12,t13),t16))),(t23,((t18,t17),((t22,t21),(t20,t19))))),((t26,t27),(t3,t2)))),t1,t0); (((t5,t4),(((((((t9,t10),(t8,(t6,t7))),t11),((t24,t25),(t12,t13))),(t16,(t14,t15))),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t26,(t27,(t3,t2))))),t1,t0); (((((t16,((t14,t15),((((t9,t10),(t8,(t6,t7))),t11),((t24,t25),(t12,t13))))),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t26,t27)),((t5,t4),(t3,t2))),t1,t0); (((t3,t2),((((t16,((t14,t15),((((t9,t10),(t8,(t6,t7))),t11),((t24,t25),(t12,t13))))),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t26,t27)),(t5,t4))),t1,t0); (((t5,t4),(((((t12,t13),((((t9,t10),(t8,(t6,t7))),t11),(t24,t25))),(t16,(t14,t15))),(t23,((t18,t17),((t22,t21),(t20,t19))))),((t3,t2),(t26,t27)))),t1,t0); (t1,(((((t16,(t14,t15)),((t11,((t9,t10),((t6,t7),t8))),(t12,t13))),((t25,t24),(t23,((t17,t18),((t19,t20),(t21,t22)))))),(t26,t27)),((t3,t2),(t4,t5))),t0); (t1,(((((t16,(t14,t15)),((t11,((t9,t10),((t6,t7),t8))),(t12,t13))),((t25,t24),(((t19,t20),(t21,t22)),(t23,(t17,t18))))),((t4,t5),(t26,t27))),(t3,t2)),t0); (t1,((t4,t5),((((t11,((t9,t10),((t6,t7),t8))),((t12,t13),(t16,(t14,t15)))),((t25,t24),((((t19,t20),(t21,t22)),(t17,t18)),t23))),((t26,t27),(t3,t2)))),t0); (t1,(((((t16,(t14,t15)),(((t25,t24),(t11,((t9,t10),((t6,t7),t8)))),(t12,t13))),((((t19,t20),(t21,t22)),(t17,t18)),t23)),(t26,t27)),((t4,t5),(t3,t2))),t0); (t1,((t4,t5),((((t11,((t9,t10),((t6,t7),t8))),(((t25,t24),((((t19,t20),(t21,t22)),(t17,t18)),t23)),((t14,t15),(t12,t13)))),t16),((t26,t27),(t3,t2)))),t0); (t1,(((t16,(t14,t15)),(((t11,((t9,t10),((t6,t7),t8))),((t25,t24),(t12,t13))),((((t19,t20),(t21,t22)),(t17,t18)),t23))),(((t4,t5),(t26,t27)),(t3,t2))),t0); (t1,((t4,t5),((t16,((t14,t15),(((t12,t13),(t11,((t9,t10),((t6,t7),t8)))),((t25,t24),((((t19,t20),(t21,t22)),(t17,t18)),t23))))),((t26,t27),(t3,t2)))),t0); (t1,((t4,t5),((t3,t2),((((t25,t24),((((t19,t20),(t21,t22)),(t17,t18)),t23)),((t16,(t14,t15)),((t12,t13),(t11,((t9,t10),((t6,t7),t8)))))),(t26,t27)))),t0); (t1,((t4,t5),((((((t19,t20),(t21,t22)),(t17,t18)),t23),((t16,(t14,t15)),(((t25,t24),(t12,t13)),(t11,((t9,t10),((t6,t7),t8)))))),((t26,t27),(t3,t2)))),t0); (t1,((t4,t5),((((t14,t15),(((t12,t13),(t11,((t9,t10),((t6,t7),t8)))),((t25,t24),((((t19,t20),(t21,t22)),(t17,t18)),t23)))),t16),((t26,t27),(t3,t2)))),t0); (t1,((t4,t5),((((((((t7,t6),t8),(t9,t10)),t11),((t24,t25),(t12,t13))),(t16,(t15,t14))),(t23,(t22,(((t20,t19),t21),(t18,t17))))),((t2,t3),(t27,t26)))),t0); (t1,(((t4,t5),((t27,t26),(((t12,t13),(t16,(((((t7,t6),t8),(t9,t10)),t11),(t15,t14)))),((t24,t25),(t23,(((t20,t19),(t22,t21)),(t18,t17))))))),(t2,t3)),t0); (t1,((((t4,t5),(t26,((t23,(((t20,t19),(t22,t21)),(t18,t17))),((((t12,t13),((((t7,t6),t8),(t9,t10)),t11)),((t15,t14),t16)),(t24,t25))))),(t2,t3)),t27),t0); (t1,((((t23,(((t20,t19),(t22,t21)),(t18,t17))),(((t16,(t12,t13)),((t24,t25),((((t7,t6),t8),(t9,t10)),t11))),(t15,t14))),((t4,t5),(t27,t26))),(t2,t3)),t0); (t1,((t4,t5),(((t27,t26),(((t23,(((t20,t19),(t22,t21)),(t18,t17))),((((t12,t13),(t24,t25)),((((t7,t6),t8),(t9,t10)),t11)),(t15,t14))),t16)),(t2,t3))),t0); (t1,(((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t16,(((t12,t13),(t24,t25)),((((t7,t6),t8),(t9,t10)),t11))),(t15,t14))),((t2,t3),((t4,t5),(t27,t26)))),t0); (t1,((t2,t3),((t27,(t26,(t4,t5))),((t23,((((t20,t19),(t22,t21)),(t18,t17)),(t24,t25))),((((((t7,t6),t8),(t9,t10)),t11),(t12,t13)),((t15,t14),t16))))),t0); (t1,((t2,t3),(((t27,t26),((t23,(((t20,t19),(t22,t21)),(t18,t17))),(((t24,t25),((((t7,t6),t8),(t9,t10)),t11)),((t16,(t12,t13)),(t15,t14))))),(t4,t5))),t0); (t1,(((t27,t26),((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t16,(t24,t25)),((((((t7,t6),t8),(t9,t10)),t11),(t15,t14)),(t12,t13))))),((t4,t5),(t2,t3))),t0); (t1,((t4,t5),((t2,t3),((t27,t26),(((((((t7,t6),t8),(t9,t10)),t11),(t16,(t15,t14))),((t24,t25),(t12,t13))),(t23,(((t20,t19),(t22,t21)),(t18,t17))))))),t0); (t1,(((t23,((t18,t17),((t22,t21),(t20,t19)))),((((t24,t25),(t11,(((t7,t6),t8),(t9,t10)))),(t15,t14)),((t13,t12),t16))),(((t26,t27),(t3,t2)),(t5,t4))),t0); (t1,((t5,t4),((((t11,(((t7,t6),t8),(t9,t10))),((t15,t14),((t13,t12),t16))),((t23,((t18,t17),((t22,t21),(t20,t19)))),(t24,t25))),((t26,t27),(t3,t2)))),t0); (t1,(((t5,t4),(t26,t27)),((t3,t2),((((t13,t12),(t11,(((t7,t6),t8),(t9,t10)))),(t16,(t15,t14))),((t23,((t18,t17),((t22,t21),(t20,t19)))),(t24,t25))))),t0); (t1,(((t3,t2),(t26,t27)),((t5,t4),(((t11,(((t7,t6),t8),(t9,t10))),((t16,(t15,t14)),((t24,t25),(t13,t12)))),(t23,((t18,t17),((t22,t21),(t20,t19))))))),t0); (t1,(((t3,t2),(t5,t4)),((((t16,(t15,t14)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12))),((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19)))))),(t26,t27))),t0); (t1,(((t3,t2),(t5,t4)),((((t16,(t15,t14)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12))),((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19)))))),(t26,t27))),t0); (t1,((((t16,(t15,t14)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12))),((t24,t25),(((t22,t21),(t20,t19)),(t23,(t18,t17))))),((t5,t4),((t26,t27),(t3,t2)))),t0); (t1,((t5,t4),((t3,t2),((t27,t26),(((t16,(t15,t14)),((t11,(((t7,t6),t8),(t9,t10))),((t24,t25),(t13,t12)))),((((t22,t21),(t20,t19)),(t18,t17)),t23))))),t0); (t1,(((t27,t26),(t3,t2)),(((t16,((t15,t14),((t11,(((t7,t6),t8),(t9,t10))),((t24,t25),(t13,t12))))),((((t22,t21),(t20,t19)),(t18,t17)),t23)),(t5,t4))),t0); (t1,(((t3,t2),((((t11,(((t7,t6),t8),(t9,t10))),((t24,t25),(t13,t12))),(t16,(t15,t14))),(((t21,(t22,(t20,t19))),(t18,t17)),t23))),((t5,t4),(t27,t26))),t0); (t1,(((t16,((((t24,t25),(t13,t12)),(t11,((t9,t10),(t8,(t7,t6))))),(t15,t14))),(((t17,t18),(t22,(t21,(t19,t20)))),t23)),((t5,t4),((t27,t26),(t2,t3)))),t0); (t1,((t2,t3),((t5,t4),(((((t13,t12),(t11,((t9,t10),(t8,(t7,t6))))),((t15,t14),t16)),((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23))),(t27,t26)))),t0); (t1,((t5,t4),((((((t17,t18),((t19,t20),(t22,t21))),t23),(((t16,(t13,t12)),((t11,((t9,t10),(t8,(t7,t6)))),(t15,t14))),(t24,t25))),(t27,t26)),(t2,t3))),t0); (t1,((t5,t4),((((t11,((t9,t10),(t8,(t7,t6)))),((t15,t14),(t16,(t13,t12)))),((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23))),((t27,t26),(t2,t3)))),t0); (t1,((t2,t3),((t5,t4),(((((t15,t14),t16),((t11,((t9,t10),(t8,(t7,t6)))),((t24,t25),(t13,t12)))),(((t17,t18),((t19,t20),(t22,t21))),t23)),(t27,t26)))),t0); (t1,(((((t15,t14),t16),((t13,t12),((t11,((t9,t10),(t8,(t7,t6)))),(t24,t25)))),(((t17,t18),((t19,t20),(t22,t21))),t23)),((t2,t3),((t27,t26),(t5,t4)))),t0); (t1,((((((t15,t14),t16),((t11,((t9,t10),(t8,(t7,t6)))),(t13,t12))),((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23))),((t2,t3),(t27,t26))),(t5,t4)),t0); (t1,(((t2,t3),(t27,t26)),((t5,t4),((((t17,t18),((t19,t20),(t22,t21))),t23),(t16,(((t11,((t9,t10),(t8,(t7,t6)))),(t15,t14)),((t13,t12),(t24,t25))))))),t0); (t1,((t16,(((t13,t12),((t11,((t9,t10),(t8,(t7,t6)))),(t15,t14))),((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23)))),(((t2,t3),(t27,t26)),(t5,t4))),t0); (t1,((t5,t4),((((((t17,t18),((t19,t20),(t22,t21))),t23),((t16,((t11,((t9,t10),(t8,(t7,t6)))),(t24,t25))),((t13,t12),(t15,t14)))),(t2,t3)),(t27,t26))),t0); (t1,(((t16,((t15,t14),((t12,t13),((((t10,t9),(t8,(t6,t7))),t11),(t25,t24))))),(((t18,t17),((t20,t19),(t22,t21))),t23)),(((t5,t4),(t27,t26)),(t2,t3))),t0); (t1,((((((t16,(t12,t13)),(((t10,t9),(t8,(t6,t7))),t11)),(t15,t14)),((t25,t24),(((t18,t17),((t20,t19),(t22,t21))),t23))),(t5,t4)),((t2,t3),(t26,t27))),t0); (t1,(((((t12,t13),(((t10,t9),(t8,(t6,t7))),t11)),(t16,(t15,t14))),((t25,t24),(((t18,t17),((t20,t19),(t22,t21))),t23))),((t5,t4),((t2,t3),(t26,t27)))),t0); (t1,((((((t12,t13),(((t10,t9),(t8,(t6,t7))),t11)),(t16,(t15,t14))),((t25,t24),(((t18,t17),((t20,t19),(t22,t21))),t23))),(t2,t3)),((t26,t27),(t5,t4))),t0); (t1,(((t26,t27),(((((t10,t9),(t8,(t6,t7))),t11),(t16,((t15,t14),(t12,t13)))),((t25,t24),(((t18,t17),((t20,t19),(t22,t21))),t23)))),((t2,t3),(t5,t4))),t0); (t1,((t2,t3),(((((t18,t17),((t20,t19),(t22,t21))),t23),(t16,(((t12,t13),(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),(t25,t24))))),((t5,t4),(t26,t27)))),t0); (t1,((t5,t4),((t2,t3),((t26,t27),((((t18,t17),((t20,t19),(t22,t21))),t23),(t16,((t15,t14),((((t10,t9),(t8,(t6,t7))),t11),((t25,t24),(t12,t13))))))))),t0); (t1,((t2,t3),((t16,(((t15,t14),((t12,t13),((((t10,t9),(t8,(t6,t7))),t11),(t25,t24)))),(((t18,t17),((t20,t19),(t22,t21))),t23))),((t5,t4),(t26,t27)))),t0); (t1,((t2,t3),((t5,t4),((t26,t27),(((((t10,t9),(t8,(t6,t7))),t11),((t16,(t12,t13)),(t15,t14))),((t25,t24),(((t18,t17),((t20,t19),(t22,t21))),t23)))))),t0); (t1,((t5,t4),(((t2,t3),(t26,t27)),(((t16,(t12,t13)),((t15,t14),(((t10,t9),(t8,(t6,t7))),t11))),((t25,t24),(((t18,t17),((t20,t19),(t22,t21))),t23))))),t0); ((((t27,t26),(t4,t5)),((t2,t3),((t23,((t18,t17),((t22,t21),(t20,t19)))),(t16,((((t24,t25),(t12,t13)),(t11,((t10,t9),((t7,t6),t8)))),(t14,t15)))))),t1,t0); (((t2,t3),((((t23,((t18,t17),((t22,t21),(t20,t19)))),((t14,t15),(t16,(((t24,t25),(t12,t13)),(t11,((t10,t9),((t7,t6),t8))))))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),(((((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),(((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),((t14,t15),t16))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),((((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t16,(((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),(t14,t15)))),((t27,t26),(t4,t5)))),t1,t0); (((((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),((t11,((t10,t9),((t7,t6),t8))),((t14,t15),((t12,t13),t16)))),(((t27,t26),(t4,t5)),(t2,t3))),t1,t0); (((t4,t5),(((t23,(((t18,t17),((t22,t21),(t20,t19))),(t24,t25))),((t12,t13),(t16,((t11,((t10,t9),((t7,t6),t8))),(t14,t15))))),((t2,t3),(t27,t26)))),t1,t0); (((t4,t5),(((t23,((t21,(t18,t17)),(t22,(t20,t19)))),(((t24,t25),(t12,t13)),((t11,((t10,t9),((t7,t6),t8))),((t14,t15),t16)))),((t2,t3),(t27,t26)))),t1,t0); (((t4,t5),((((t24,t25),(t23,((t18,t17),((t21,t22),(t20,t19))))),((((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),(t14,t15)),t16)),((t2,t3),(t27,t26)))),t1,t0); (((t4,t5),((((((t18,t17),((t21,t22),(t20,t19))),((t24,t25),t23)),(((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),((t14,t15),t16))),(t27,t26)),(t2,t3))),t1,t0); (((t4,t5),(((t2,t3),((t23,((t18,t17),((t21,t22),(t20,t19)))),(((t24,t25),(t12,t13)),(((t14,t15),t16),(t11,((t10,t9),((t7,t6),t8))))))),(t27,t26))),t1,t0); (((t3,t2),(((((((t25,t24),(t11,((t8,(t6,t7)),(t10,t9)))),(t13,t12)),((t15,t14),t16)),((((t22,t21),(t20,t19)),(t17,t18)),t23)),(t27,t26)),(t5,t4))),t1,t0); ((((((t25,t24),((t11,((t8,(t6,t7)),(t10,t9))),((t15,t14),((t13,t12),t16)))),((((t22,t21),(t20,t19)),(t17,t18)),t23)),((t3,t2),(t27,t26))),(t5,t4)),t1,t0); (((t3,t2),(((t27,t26),((t16,(((t11,((t8,(t6,t7)),(t10,t9))),((t13,t12),(t25,t24))),(t15,t14))),((((t22,t21),(t20,t19)),(t17,t18)),t23))),(t5,t4))),t1,t0); ((((t27,t26),((((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),((t15,t14),t16)),((t25,t24),((((t22,t21),(t20,t19)),(t17,t18)),t23)))),((t5,t4),(t3,t2))),t1,t0); (((t3,t2),(((t27,t26),((((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),((t15,t14),t16)),((t25,t24),((((t22,t21),(t20,t19)),(t17,t18)),t23)))),(t5,t4))),t1,t0); (((t5,t4),(((t27,t26),(t3,t2)),((((t15,t14),(t11,((t8,(t6,t7)),(t10,t9)))),((t13,t12),t16)),((t25,t24),((((t22,t21),(t20,t19)),(t17,t18)),t23))))),t1,t0); (((((((t15,t14),((t25,t24),(t11,((t8,(t6,t7)),(t10,t9))))),(t16,(t13,t12))),((((t22,t21),(t20,t19)),(t17,t18)),t23)),(t27,t26)),((t5,t4),(t3,t2))),t1,t0); (((t5,t4),(((t3,t2),(t16,((t15,t14),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),((t25,t24),((((t22,t21),(t20,t19)),(t17,t18)),t23)))))),(t27,t26))),t1,t0); (((t3,t2),((((t25,t24),((((t22,t21),(t20,t19)),(t17,t18)),t23)),(((t11,((t8,(t6,t7)),(t10,t9))),((t15,t14),(t13,t12))),t16)),((t27,t26),(t5,t4)))),t1,t0); ((((t27,t26),(t5,t4)),((t3,t2),(((((t22,t21),(t20,t19)),(t17,t18)),t23),((((t11,((t8,(t6,t7)),(t10,t9))),(t15,t14)),t16),((t25,t24),(t13,t12)))))),t1,t0); (t1,(((t4,t5),((((t14,t15),t16),((t11,((t10,t9),((t7,t6),t8))),(t13,t12))),((t24,t25),(t23,((t17,t18),((t22,t21),(t19,t20))))))),((t26,t27),(t3,t2))),t0); (t1,((t4,t5),(((((t24,t25),(t13,t12)),(((t14,t15),t16),(t11,((t10,t9),((t7,t6),t8))))),(t23,((t17,t18),((t22,t21),(t19,t20))))),((t26,t27),(t3,t2)))),t0); (t1,((t3,t2),((((((t14,t15),t16),((t11,((t10,t9),((t7,t6),t8))),((t24,t25),(t13,t12)))),(t23,((t17,t18),((t22,t21),(t19,t20))))),(t26,t27)),(t4,t5))),t0); (t1,((((((t11,((t10,t9),((t7,t6),t8))),(t24,t25)),((t13,t12),((t14,t15),t16))),(t23,((t17,t18),((t22,t21),(t19,t20))))),((t3,t2),(t26,t27))),(t4,t5)),t0); (t1,((((((t14,t15),t16),(((t11,((t10,t9),((t7,t6),t8))),(t24,t25)),(t13,t12))),(t23,((t17,t18),((t22,t21),(t19,t20))))),(t3,t2)),((t4,t5),(t26,t27))),t0); (t1,((((((t11,((t10,t9),((t7,t6),t8))),((t13,t12),(t14,t15))),t16),(((t24,t25),t23),((t17,t18),((t22,t21),(t19,t20))))),((t27,t26),(t3,t2))),(t4,t5)),t0); (t1,((t3,t2),((((((t11,((t10,t9),((t7,t6),t8))),(t13,t12)),(t16,(t14,t15))),((((t17,t18),((t22,t21),(t19,t20))),t23),(t24,t25))),(t27,t26)),(t4,t5))),t0); (t1,(((t3,t2),((((t17,t18),((t22,t21),(t19,t20))),t23),((t14,t15),(t16,(((t24,t25),(t11,((t10,t9),((t7,t6),t8)))),(t13,t12)))))),((t27,t26),(t4,t5))),t0); (t1,((t4,t5),((((((t17,t18),((t22,t21),(t19,t20))),t23),(((t11,((t10,t9),((t7,t6),t8))),((t13,t12),(t24,t25))),((t14,t15),t16))),(t27,t26)),(t3,t2))),t0); (t1,((t3,t2),((t4,t5),(((((t17,t18),((t22,t21),(t19,t20))),t23),(((t13,t12),((t24,t25),(t11,((t10,t9),((t7,t6),t8))))),((t14,t15),t16))),(t27,t26)))),t0); (((t4,t5),(((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t15,t14),(((((t6,t7),t8),(t10,t9)),t11),(t25,t24))),((t13,t12),t16))),((t2,t3),(t26,t27)))),t1,t0); (((t2,t3),(((t26,t27),(t4,t5)),((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t15,t14),(((((t6,t7),t8),(t10,t9)),t11),((t13,t12),(t25,t24)))),t16)))),t1,t0); (((t4,t5),((((t23,((t17,t18),((t22,t21),(t20,t19)))),((t15,t14),(((t25,t24),(((((t6,t7),t8),(t10,t9)),t11),(t13,t12))),t16))),(t2,t3)),(t26,t27))),t1,t0); (((t2,t3),((t4,t5),((t26,t27),((t23,((t17,t18),((t22,t21),(t20,t19)))),((t25,t24),((((((t6,t7),t8),(t10,t9)),t11),(t13,t12)),(t16,(t15,t14)))))))),t1,t0); (((t4,t5),(((t2,t3),(t26,t27)),((((t15,t14),(((((t6,t7),t8),(t10,t9)),t11),((t25,t24),(t13,t12)))),(t23,((t17,t18),((t22,t21),(t20,t19))))),t16))),t1,t0); ((((t2,t3),(t26,t27)),(((((t13,t12),(((((t6,t7),t8),(t10,t9)),t11),(t25,t24))),(t16,(t15,t14))),(t23,((t17,t18),((t22,t21),(t20,t19))))),(t4,t5))),t1,t0); ((((t2,t3),((((((((t6,t7),t8),(t10,t9)),t11),((t25,t24),(t13,t12))),(t15,t14)),(t23,((t17,t18),((t22,t21),(t20,t19))))),t16)),((t4,t5),(t26,t27))),t1,t0); (((t2,t3),(((((t25,t24),(((t15,t14),t16),((t13,t12),((((t6,t7),t8),(t10,t9)),t11)))),(t23,((t17,t18),((t22,t21),(t20,t19))))),(t26,t27)),(t4,t5))),t1,t0); (((t2,t3),((((t16,(((t13,t12),((((t6,t7),t8),(t10,t9)),t11)),(t15,t14))),((t23,((t17,t18),((t22,t21),(t20,t19)))),(t25,t24))),(t26,t27)),(t4,t5))),t1,t0); (((t2,t3),(((((t13,t12),(((((t6,t7),t8),(t10,t9)),t11),((t15,t14),t16))),((t23,((t17,t18),((t22,t21),(t20,t19)))),(t25,t24))),(t26,t27)),(t4,t5))),t1,t0); (t1,((t2,t3),((t4,t5),((((((t13,t12),(t24,t25)),(((t8,(t7,t6)),(t10,t9)),t11)),((t15,t14),t16)),((((t22,t21),(t19,t20)),(t17,t18)),t23)),(t26,t27)))),t0); (t1,((t2,t3),((t4,t5),((((t15,t14),(t16,(((t13,t12),(t24,t25)),(((t8,(t7,t6)),(t10,t9)),t11)))),((((t22,t21),(t19,t20)),(t17,t18)),t23)),(t26,t27)))),t0); (t1,((t2,t3),((t4,t5),((((t16,(t15,t14)),((t13,t12),((t24,t25),(((t8,(t7,t6)),(t10,t9)),t11)))),((((t22,t21),(t19,t20)),(t17,t18)),t23)),(t26,t27)))),t0); (t1,(((t2,t3),(t16,((t15,t14),(((((t8,(t7,t6)),(t10,t9)),t11),(t13,t12)),((t24,t25),((((t22,t21),(t19,t20)),(t17,t18)),t23)))))),((t26,t27),(t4,t5))),t0); (t1,((((t24,t25),(((t8,(t7,t6)),(t10,t9)),t11)),(((t15,t14),(t13,t12)),(t16,((((t22,t21),(t19,t20)),(t17,t18)),t23)))),(((t2,t3),(t26,t27)),(t4,t5))),t0); (t1,((t2,t3),(((t26,t27),(t4,t5)),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t16,(t15,t14)),(((t8,(t7,t6)),(t10,t9)),t11)),((t24,t25),(t13,t12)))))),t0); (t1,(((t26,t27),(t4,t5)),((((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t16,(t15,t14)),(((t8,(t7,t6)),(t10,t9)),t11)),((t24,t25),(t13,t12)))),(t2,t3))),t0); (t1,(((t26,t27),(((t24,t25),((((t22,t21),(t19,t20)),(t17,t18)),t23)),((t16,((t15,t14),(((t8,(t7,t6)),(t10,t9)),t11))),(t13,t12)))),((t2,t3),(t4,t5))),t0); (t1,((t4,t5),(((t26,t27),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(((((t8,(t7,t6)),(t10,t9)),t11),((t16,(t15,t14)),(t13,t12))),(t24,t25)))),(t2,t3))),t0); (t1,((t2,t3),((t4,t5),((t26,t27),(((t16,(t15,t14)),((t13,t12),(((t8,(t7,t6)),(t10,t9)),t11))),((t24,t25),(((t19,t20),((t17,t18),(t22,t21))),t23)))))),t0); (t1,((((((t17,t18),((t21,t22),(t20,t19))),t23),(((t11,((t10,t9),((t7,t6),t8))),(((t14,t15),t16),(t13,t12))),(t24,t25))),(t26,t27)),((t3,t2),(t4,t5))),t0); (t1,((t4,t5),((((((t17,t18),((t21,t22),(t20,t19))),t23),((((t14,t15),t16),((t13,t12),(t11,((t10,t9),((t7,t6),t8))))),(t24,t25))),(t26,t27)),(t3,t2))),t0); (t1,((t4,t5),(((t26,t27),(t3,t2)),((((t11,((t10,t9),((t7,t6),t8))),(t14,t15)),(t16,(t13,t12))),((t24,t25),(((t17,t18),((t21,t22),(t20,t19))),t23))))),t0); (t1,((((((t11,((t10,t9),((t7,t6),t8))),(t14,t15)),(t13,t12)),((t24,t25),(((t20,t19),((t17,t18),(t21,t22))),t23))),t16),((t3,t2),((t4,t5),(t26,t27)))),t0); (t1,(((t4,t5),(t26,t27)),(((((t17,t18),((t21,t22),(t20,t19))),t23),((t16,(t14,t15)),(((t13,t12),(t24,t25)),(t11,((t10,t9),((t7,t6),t8)))))),(t3,t2))),t0); (t1,((t3,t2),(((t26,t27),((((t17,t18),((t21,t22),(t20,t19))),t23),(((t13,t12),(t24,t25)),((t14,t15),((t11,((t10,t9),((t7,t6),t8))),t16))))),(t4,t5))),t0); (t1,((((t24,t25),(((t17,t18),((t21,t22),(t20,t19))),t23)),((t11,((t10,t9),((t7,t6),t8))),(t16,((t13,t12),(t14,t15))))),((t4,t5),((t26,t27),(t3,t2)))),t0); (t1,((t3,t2),((t4,t5),((((((t17,t18),((t21,t22),(t20,t19))),t23),((((t11,((t10,t9),((t7,t6),t8))),(t16,(t13,t12))),(t14,t15)),(t24,t25))),t26),t27))),t0); (t1,((t4,t5),((((((t17,t18),((t21,t22),(t20,t19))),t23),((t16,(t14,t15)),(((t24,t25),(t11,((t10,t9),((t7,t6),t8)))),(t13,t12)))),(t26,t27)),(t3,t2))),t0); (t1,((((((t17,t18),((t21,t22),(t20,t19))),t23),((t14,t15),(((t11,((t10,t9),((t7,t6),t8))),((t13,t12),(t24,t25))),t16))),(t26,t27)),((t3,t2),(t4,t5))),t0); (t1,((t2,t3),(((t27,t26),((((t15,t14),t16),((((t9,t10),(t8,(t7,t6))),t11),((t25,t24),(t12,t13)))),(((t18,t17),((t19,t20),(t22,t21))),t23))),(t4,t5))),t0); (t1,((t2,t3),(((t27,t26),((t16,(((t12,t13),((((t9,t10),(t8,(t7,t6))),t11),(t25,t24))),(t15,t14))),(((t18,t17),((t19,t20),(t22,t21))),t23))),(t4,t5))),t0); (t1,((t2,t3),(((t27,t26),((((((t9,t10),(t8,(t7,t6))),t11),((t25,t24),(t12,t13))),((t15,t14),t16)),(((t18,t17),((t19,t20),(t22,t21))),t23))),(t4,t5))),t0); (t1,((t4,t5),((t2,t3),((t27,t26),((((((t9,t10),(t8,(t7,t6))),t11),(t12,t13)),((t15,t14),t16)),((t25,t24),(((t18,t17),((t19,t20),(t22,t21))),t23)))))),t0); (t1,((t2,t3),(((t4,t5),(t27,t26)),((((t18,t17),((t19,t20),(t22,t21))),t23),(t16,(((((t9,t10),(t8,(t7,t6))),t11),((t25,t24),(t12,t13))),(t15,t14)))))),t0); (t1,((t2,t3),((t4,t5),((t27,t26),((((t18,t17),((t19,t20),(t22,t21))),t23),(((t12,t13),((((t9,t10),(t8,(t7,t6))),t11),(t25,t24))),((t15,t14),t16)))))),t0); (t1,(((t2,t3),((((t18,t17),((t19,t20),(t22,t21))),t23),((t12,t13),((((((t9,t10),(t8,(t7,t6))),t11),(t25,t24)),(t15,t14)),t16)))),((t4,t5),(t27,t26))),t0); (t1,((t4,t5),((t27,t26),((t2,t3),(((t15,t14),(((((t9,t10),(t8,(t7,t6))),t11),((t12,t13),(t25,t24))),(((t18,t17),((t19,t20),(t22,t21))),t23))),t16)))),t0); (t1,((t2,t3),(((((t18,t17),((t19,t20),(t22,t21))),t23),((((t25,t24),(((t9,t10),(t8,(t7,t6))),t11)),((t15,t14),(t12,t13))),t16)),((t4,t5),(t27,t26)))),t0); (t1,((t4,t5),(((t2,t3),(t27,t26)),((((t18,t17),(t22,(t21,(t19,t20)))),t23),(((t25,t24),(((t9,t10),(t8,(t7,t6))),t11)),((t15,t14),(t16,(t12,t13))))))),t0); (((t3,t2),((t5,t4),(((t23,((t17,t18),(t22,(t21,(t19,t20))))),((t24,t25),(t16,(((((t6,t7),t8),(t10,t9)),t11),((t14,t15),(t13,t12)))))),(t26,t27)))),t1,t0); ((((t3,t2),(t26,t27)),((t5,t4),((t23,((t17,t18),((t19,t20),(t22,t21)))),((t24,t25),(((t13,t12),((((t6,t7),t8),(t10,t9)),t11)),((t14,t15),t16)))))),t1,t0); ((((t3,t2),(t5,t4)),(((t23,((t17,t18),((t19,t20),(t22,t21)))),((t24,t25),((t16,(t13,t12)),(((((t6,t7),t8),(t10,t9)),t11),(t14,t15))))),(t26,t27))),t1,t0); (((t3,t2),((t5,t4),(((((t14,t15),(((t24,t25),(t13,t12)),((((t6,t7),t8),(t10,t9)),t11))),(t23,((t17,t18),((t19,t20),(t22,t21))))),t16),(t26,t27)))),t1,t0); (((t3,t2),(((t16,((t14,t15),((t13,t12),((((t6,t7),t8),(t10,t9)),t11)))),((t24,t25),(t23,((t17,t18),((t19,t20),(t22,t21)))))),((t26,t27),(t5,t4)))),t1,t0); ((((t5,t4),((t23,((t17,t18),((t19,t20),(t22,t21)))),((t14,t15),(t16,(((((t6,t7),t8),(t10,t9)),t11),((t13,t12),(t24,t25))))))),((t3,t2),(t26,t27))),t1,t0); ((((t5,t4),((t26,t27),(((t24,t25),(t23,((t17,t18),((t19,t20),(t22,t21))))),(((((t6,t7),t8),(t10,t9)),t11),(t16,((t13,t12),(t14,t15))))))),(t3,t2)),t1,t0); (((t5,t4),(((t3,t2),(t26,t27)),((t23,((t19,t20),((t22,t21),(t17,t18)))),(((t24,t25),(t13,t12)),(((((t6,t7),t8),(t10,t9)),t11),((t14,t15),t16)))))),t1,t0); ((((t23,(((t22,t21),(t19,t20)),(t17,t18))),(((t14,t15),((t13,t12),t16)),((t24,t25),((((t6,t7),t8),(t10,t9)),t11)))),((t3,t2),((t5,t4),(t26,t27)))),t1,t0); ((((t3,t2),(t5,t4)),((t26,t27),((((t24,t25),t23),(((t22,t21),(t19,t20)),(t17,t18))),(((t13,t12),((((t6,t7),t8),(t10,t9)),t11)),((t14,t15),t16))))),t1,t0); (((t5,t4),((((t25,t24),(t23,((t17,t18),((t19,t20),(t22,t21))))),(((t11,((t8,(t7,t6)),(t10,t9))),((t14,t15),t16)),(t13,t12))),((t3,t2),(t26,t27)))),t1,t0); (((t3,t2),((t5,t4),((t26,t27),((t23,((t17,t18),((t19,t20),(t22,t21)))),(((t14,t15),((t13,t12),((t25,t24),(t11,((t8,(t7,t6)),(t10,t9)))))),t16))))),t1,t0); (((t5,t4),(((t3,t2),(t26,t27)),((t23,((t17,t18),((t19,t20),(t22,t21)))),(((t13,t12),(t25,t24)),(((t14,t15),(t11,((t8,(t7,t6)),(t10,t9)))),t16))))),t1,t0); (((t3,t2),(((t26,t27),((t23,((t17,t18),(t21,((t19,t20),t22)))),((t25,t24),(((t13,t12),(t11,((t8,(t7,t6)),(t10,t9)))),(t16,(t14,t15)))))),(t5,t4))),t1,t0); (((t5,t4),((t26,t27),((t3,t2),((((t14,t15),((t13,t12),((t25,t24),(t11,((t8,(t7,t6)),(t10,t9)))))),(t23,((t17,t18),((t19,t20),(t22,t21))))),t16)))),t1,t0); (((t3,t2),((((((t11,((t8,(t7,t6)),(t10,t9))),(t13,t12)),(t14,t15)),((t25,t24),(t23,((t17,t18),((t19,t20),(t22,t21)))))),t16),((t5,t4),(t26,t27)))),t1,t0); ((((t5,t4),((t26,t27),((t23,((t17,t18),((t19,t20),(t22,t21)))),((((t11,((t8,(t7,t6)),(t10,t9))),(t13,t12)),(t16,(t14,t15))),(t25,t24))))),(t3,t2)),t1,t0); (((t5,t4),(((t26,t27),((t23,((t17,t18),((t19,t20),(t22,t21)))),((((t11,((t8,(t7,t6)),(t10,t9))),(t13,t12)),(t16,(t14,t15))),(t25,t24)))),(t3,t2))),t1,t0); (((t3,t2),((t5,t4),((t26,t27),((t23,(((t17,t18),((t19,t20),t21)),t22)),((((t11,((t8,(t7,t6)),(t10,t9))),(t14,t15)),((t25,t24),(t13,t12))),t16))))),t1,t0); (((t3,t2),((t5,t4),((t26,t27),((t23,((t17,t18),((t19,t20),(t21,t22)))),((((t11,((t8,(t7,t6)),(t10,t9))),(t14,t15)),((t25,t24),(t13,t12))),t16))))),t1,t0); phangorn/inst/extdata/trees/primates.dna0000644000176200001440000001010013475602650020127 0ustar liggesusers 14 232 Mouse ACCAAAAAAA CATCCAAACA CCAACCCCAG CCCTTACGCA ATAGCCATAC AAAGAATATT Bovine ACCAAACCTG TCCCCACCAT CTAACACCAA CCCACATATA CAAGCTAAAC CAAAAATACC Lemur ACCAAACTAA CATCTAACAA CTACCTCCAA CTCTAAAAAA GCACTCTTAC CAAACCCATC Tarsier ATCTACCTTA TCTCCCCCAA TCAATACCAA CCTAAAAACT CTACAATTAA AAACCCCACC Squir MonkACCCCAGCAA CTCGTTGTGA CCAACATCAA TCCAAAATTA GCAAACGTAC CAACAATCTC Jpn Macaq ACTCCACCTG CTCACCTCAT CCACTACTAC TCCTCAAGCA ATACATAAAC TAAAAACTTC Rhesus MacACTTCACCCG TTCACCTCAT CCACTACTAC TCCTCAAGCG ATACATAAAT CAAAAACTTC Crab-E.MacACCCCACCTA CCCGCCTCGT CCGCTACTGC TTCTCAAACA ATATATAGAC CAACAACTTC BarbMacaq ACCCTATCTA TCTACCTCAC CCGCCACCAC CCCCCAAACA ACACACAAAC CAACAACTTT Gibbon ACTATACCCA CCCAACTCGA CCTACACCAA TCCCCACATA GCACACAGAC CAACAACCTC Orang ACCCCACCCG TCTACACCAG CCAACACCAA CCCCCACCTA CTATACCAAC CAATAACCTC Gorilla ACCCCATTTA TCCATAAAAA CCAACACCAA CCCCCATCTA ACACACAAAC TAATGACCCC Chimp ACCCCATCCA CCCATACAAA CCAACATTAC CCTCCATCCA ATATACAAAC TAACAACCTC Human ACCCCACTCA CCCATACAAA CCAACACCAC TCTCCACCTA ATATACAAAT TAATAACCTC ATACTACTAA AAACTCAAAT TAACTCTTTA ATCTTTATAC AACATTCCAC CAACCTATCC ATACAACCAT AAATAAGACT AATCTATTAA AATAACCCAT TACGATACAA AATCCCTTTC ACAACTCTAT CAACCTAACC AAACTATCAA CATGCCCTCT CCTAATTAAA AACATTGCCA GCTCAATTAC TAGCAAAAAT AGACATTCAA CTCCTCCCAT CATAACATAA AACATTCCTC CCAAATTTAA AAACACATCC TACCTTTACA ATTAATAACC ATTGTCTAGA TATACCCCTA TCACCTCTAA TACTACACAC CACTCCTGAA ATCAATGCCC TCCACTAAAA AACATCACCA TCACCTCCAA TACTACGCAC CGCTCCTAAA ATCAATGCCC CCCACCAAAA AACATCACCA TCACCTTTAA CACTACATAT CACTCCTGAG CTTAACACCC TCCGCTAAAA AACACCACTA TTATCTTTAG CACCACACAT CACCCCCAAA AGCAATACCC TTCACCAAAA AGCACCATCA CCACCTTCCA TACCAAGCCC CGACTTTACC GCCAACGCAC CTCATCAAAA CATACCTACA TCAACCCCTA AACCAAACAC TATCCCCAAA ACCAACACAC TCTACCAAAA TACACCCCCA CCACCCTCAA AGCCAAACAC CAACCCTATA ATCAATACGC CTTATCAAAA CACACCCCCA CCACTCTTCA GACCGAACAC CAATCTCACA ACCAACACGC CCCGTCAAAA CACCCCTTCA CCACCTTCAG AACTGAACGC CAATCTCATA ACCAACACAC CCCATCAAAG CACCCCTCCA ACACAAAAAA ACTCATATTT ATCTAAATAC GAACTTCACA CAACCTTAAC ACATAAACAT GTCTAGATAC AAACCACAAC ACACAATTAA TACACACCAC AATTACAATA CTAAACTCCC CACTAAACCT ACACACCTCA TCACCATTAA CGCATAACTC CTCAGTCATA TCTACTACAC GCTCCAATAA ACACATCACA ATCCCAATAA CGCATATACC TAAATACATC ATTTAATAAT AAATAAATGA ATATAAACCC TCGCCGATAA CATA-ACCCC TAAAATCAAG ACATCCTCTC GCCCAAACAA ACACCTATCT ACCCCCCCGG TCCACGCCCC TAACTCCATC ATTCCCCCTC ACCCAAACAA ACACCTACCC ATCCCCCCGG TTCACGCCTC AAACTCCATC ATTCCCCCTC ACCCAAACAA ACACCTATCT ATCCCCCCGG TCCACGCCCC AAACCCCGCT ATTCCCCCCT AATCAAACAA ACACCTATTT ATTCCCCTAA TTCACGTCCC AAATCCCATT ATCTCTCCCC ACACAAACAA ATGCCCCCCC ACCCTCCTTC TTCAAGCCCA CTAGACCATC CTACCTTCCT ATTCACATCC GCACACCCCC ACCCCCCCTG CCCACGTCCA TCCCATCACC CTCTCCTCCC ACATAAACCC ACGCACCCCC ACCCCTTCCG CCCATGCTCA CCACATCATC TCTCCCCTTC GCACAAATTC ATACACCCCT ACCTTTCCTA CCCACGTTCA CCACATCATC CCCCCCTCTC ACACAAACCC GCACACCTCC ACCCCCCTCG TCTACGCTTA CCACGTCATC CCTCCCTCTC ACCCCAGCCC AACACCCTTC CACAAATCCT TAATATACGC ACCATAAATA AC ATCCCACCAA ATCACCCTCC ATCAAATCCA CAAATTACAC AACCATTAAC CC ACCCTAACAA TTTATCCCTC CCATAATCCA AAAACTCCAT AAACACAAAT TC AATACTCCAA CTCCCATAAC ACAGCATACA TAAACTCCAT AAGTTTGAAC AC ACAACGCCAA ACCCCCCTCT CATAACTCTA CAAAATACAC AATCACCAAC AC AATACATCAA ACAATTCCCC CCAATACCCA CAAACTGCAT AAGCAAACAG AC AATACATCAA ACAATTCCCC CCAATACCCA CAAACTACAT AAACAAACAA AC AATACACCAA ACAATTTTCT CCAACACCCA CAAACTGTAT AAACAAACAA AC AACATACCAA ACAATTCTCC CTAATATACA CAAACCACGC AAACAAACAA AC AGCACGCCAA GCTCTCTACC ATCAAACGCA CAACTTACAC ATACAGAACC AC AACACCCTAA GCCACCTTCC TCAAAATCCA AAACCCACAC AACCGAAACA AC AACACCTCAA TCCACCTCCC CCCAAATACA CAATTCACAC AAACAATACC AC AACATCTTGA CTCGCCTCTC TCCAAACACA CAATTCACGC AAACAACGCC AC AACACCTTAA CTCACCTTCT CCCAAACGCA CAATTCGCAC ACACAACGCC AC phangorn/inst/extdata/trees/RAxML_bootstrap.woodmouse0000644000176200001440000042331013475602650022615 0ustar liggesusers(((No1007S,(No0909S,No1208S)),(((No0906S,(No0910S,No1202S)),((No0912S,No1103S),(No0908S,No1206S))),(No306,(No0913S,No304)))),No1114S,No305); (((No306,((No0906S,(No0913S,(No0910S,No1202S))),(((No1208S,(No1007S,No0909S)),(No0912S,No1103S)),No304))),(No0908S,No1206S)),No1114S,No305); (((No0909S,(No1208S,No1007S)),((No0912S,No1103S),((No0908S,No1206S),((No304,No306),(No0906S,(No0913S,(No0910S,No1202S))))))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((No0906S,(No0908S,(((((No0913S,No304),No306),No1103S),No1206S),No0912S))),(No0910S,No1202S))),No1114S,No305); (((((No0908S,No1206S),(No304,No306)),((No0913S,(No0910S,No1202S)),No0906S)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (No1114S,(((No0908S,((No0910S,No1202S),(No1206S,No0906S))),(No306,(No0913S,No304))),((No1208S,(No1007S,No0909S)),(No0912S,No1103S))),No305); ((No1114S,(No306,(No0913S,No304))),(((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No0910S,No1202S),((No0908S,No1206S),No0906S))),No305); ((((No0906S,(No0910S,No1202S)),No1206S),(No0908S,((No0909S,(No1208S,No1007S)),(No0912S,No1103S)))),(No306,(No0913S,(No1114S,No304))),No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No304,No0913S),No306),(((No0906S,(No0910S,No1202S)),No1206S),No0908S))),No1114S,No305); (((No0912S,No1103S),((No1007S,(No0909S,No1208S)),(((No304,No0913S),No306),((No0906S,(No0910S,No1202S)),(No1206S,No0908S))))),No1114S,No305); ((((No1103S,No0912S),(((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S)))),((No1208S,No0909S),No1007S)),No1114S,No305); (((((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S))),(No1103S,(((No1208S,No0909S),No1007S),No0912S))),No1114S,No305); (((((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S))),(No1103S,(((No1208S,No0909S),No1007S),No0912S))),No1114S,No305); ((((No0906S,(No1206S,No0908S)),(No306,(No304,((No1202S,No0910S),No0913S)))),((((No1208S,No0909S),No1007S),No0912S),No1103S)),No1114S,No305); ((((No0908S,(((No1202S,No0910S),No0906S),No1206S)),(No306,(No304,No0913S))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((No306,((No304,No0913S),(No0908S,(((No1202S,No0910S),No0906S),No1206S)))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((((No306,(No0913S,(((No1202S,No0910S),No0906S),No1206S))),No0908S),No304),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); ((((((No0913S,No304),No306),No0908S),(((No1202S,No0910S),No0906S),No1206S)),(((No1007S,(No1208S,No0909S)),No0912S),No1103S)),No1114S,No305); ((((((No0913S,No304),No306),No0908S),(((No1202S,No0910S),No0906S),No1206S)),(((No0909S,(No1007S,No1208S)),No0912S),No1103S)),No1114S,No305); ((((((No304,No0908S),(No306,(((No0913S,(No1202S,No0910S)),No0906S),No1206S))),(No0909S,(No1007S,No1208S))),No0912S),No1103S),No1114S,No305); (((No1103S,(No0912S,(No0909S,(No1007S,No1208S)))),(((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S)))),No1114S,No305); (((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),((No0908S,(((No1202S,No0910S),No0906S),No1206S)),(No306,(No1114S,(No304,No0913S)))),No305); (((No1103S,No0912S),(((No0908S,(((No1202S,No0910S),No0906S),No1206S)),(No306,(No304,No0913S))),(No1007S,(No1208S,No0909S)))),No1114S,No305); ((No1103S,(((((No1202S,No0910S),No0906S),(No1206S,No0908S)),(No306,(No304,No0913S))),(No0912S,(No1007S,(No1208S,No0909S))))),No1114S,No305); ((((No306,(No304,No0913S)),(No0908S,(((No1202S,No0910S),No0906S),No1206S))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); ((((No306,(No304,No0913S)),(No0908S,(((No1202S,No0910S),No0906S),No1206S))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); ((((No306,(No304,No0913S)),(No0908S,(((No1202S,No0910S),No0906S),No1206S))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((No306,(No0908S,((((No1202S,No0910S),No0906S),No1206S),(No304,No0913S)))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); ((No0908S,((No306,(No304,No0913S)),((((No1202S,No0910S),No0906S),No1206S),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No0908S,No1206S),((No1202S,No0910S),No0906S)),(No306,(No304,No0913S)))),No1114S,No305); (((No0913S,No304),(No306,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306))),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1007S,No1208S))),(((No1206S,(No0910S,(No1202S,No0906S))),No0908S),((No0913S,No304),No306))),No1114S,No305); (((No0909S,(No1007S,No1208S)),(No0912S,(No1103S,(No306,(((No0913S,No0910S),No1202S),(No304,(No0906S,(No0908S,No1206S)))))))),No1114S,No305); (((No306,((No304,No0908S),(No0913S,(No1206S,(No0906S,(No0910S,No1202S)))))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No1114S,No305); (((No1103S,No0912S),(((No0908S,(No306,(No304,No0913S))),(No0906S,((No1206S,No1202S),No0910S))),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((No1103S,No1114S),No0912S),((((No1206S,No0908S),(No306,(No304,No0913S))),(No0906S,(No1202S,No0910S))),(No0909S,(No1007S,No1208S))),No305); (No1114S,((No0912S,((No1007S,(No1208S,No0909S)),No1103S)),((((No306,(No304,No0913S)),((No1202S,No0910S),No0906S)),No1206S),No0908S)),No305); (No1114S,((No0912S,((No0909S,(No1007S,No1208S)),No1103S)),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(No306,(No304,No0913S)))),No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),((No306,((No0910S,((No0913S,No304),No1202S)),No0906S)),(No0908S,No1206S))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),((((No0913S,No304),No306),(((No1202S,No0910S),No1206S),No0906S)),No0908S)),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No1202S,No0910S),No0906S),(((No0913S,No304),No306),(No0908S,No1206S)))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((No1202S,No0910S),No0906S),(((No0913S,No304),No306),(No0908S,No1206S)))),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No0908S,No1206S),(No304,(No306,(No0913S,((No1202S,No0910S),No0906S)))))),No1114S,No305); (((No1208S,(No0909S,No1007S)),((No0912S,No1103S),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),((No0913S,No304),No306)))),No1114S,No305); ((((No0908S,(No1206S,((No1202S,No0910S),No0906S))),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); ((((No0908S,(No1206S,((No1202S,No0910S),No0906S))),((No0913S,No304),No306)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((No1007S,(No1208S,No0909S)),((No0912S,No1103S),((No0908S,((No0906S,(No1202S,No0910S)),No1206S)),((No0913S,No304),No306)))),No1114S,No305); ((((No0908S,((No1202S,No0910S),(No1206S,No0906S))),((No0913S,No304),No306)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(((No306,(No304,No0913S)),(No1206S,No0908S)),(No0906S,(No0910S,No1202S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No306,(No304,No0913S)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S)))))),No305); (No1114S,((No304,No0913S),(((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(No0908S,No1206S)),(No0906S,(No0910S,No1202S))),No306)),No305); (((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No306,(No1114S,(No304,No0913S)))),((No0912S,No1103S),(No1007S,(No1208S,No0909S))),No305); (No1114S,((No306,((((No304,No0913S),(No0910S,No1202S)),No0906S),(No0908S,No1206S))),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No305); (No1114S,((No306,(No304,No0913S)),((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(No0908S,(No1206S,((No1202S,No0910S),No0906S))))),No305); (No1114S,((No1103S,No0912S),((No306,(No304,No0913S)),((((No1202S,No0910S),No0906S),(No0909S,(No1007S,No1208S))),(No0908S,No1206S)))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((No0908S,(No306,(No304,No0913S))),(No1206S,((No1202S,No0910S),No0906S)))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((No0908S,(No306,(No304,No0913S))),(No1206S,((No1202S,No0910S),No0906S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No306,(No304,No0913S)),((No1202S,No0910S),((No0908S,No1206S),No0906S)))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),(((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),((No0913S,No304),No306))),No305); (No1114S,((No0912S,No1103S),(No0906S,((((No1202S,No0910S),(No1007S,(No1208S,No0909S))),((No0913S,No304),No306)),(No0908S,No1206S)))),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(((No0913S,No304),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S)))))),No305); (No1114S,((No0912S,No1103S),(((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),((No0913S,No304),No306)),(No0909S,(No1007S,No1208S)))),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); ((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),(No1114S,((No0913S,No304),No306))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),No305); (((((No0913S,No304),No306),(No0908S,(((No1202S,No0910S),No0906S),No1206S))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((((No0913S,No304),No306),(No0908S,(((No1202S,No0910S),No0906S),No1206S))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); ((No0908S,((((No1202S,No0910S),No0906S),No1206S),((No0913S,(No1114S,No304)),No306))),(No1103S,((No0909S,(No1007S,No1208S)),No0912S)),No305); (No1114S,((No1007S,(No1208S,No0909S)),(((((No1103S,No0912S),No1206S),(No0906S,(No1202S,No0910S))),No0908S),((No0913S,No304),No306))),No305); ((((((No1206S,No0908S),No0912S),(No0906S,(No1202S,No0910S))),No1103S),((No0913S,No304),No306)),((No1114S,(No1007S,No1208S)),No0909S),No305); (No1114S,((((No1206S,(No0906S,(No1202S,No0910S))),No0908S),((No0913S,No304),No306)),(((No1007S,No1208S),No0909S),(No0912S,No1103S))),No305); (No1114S,((((No1206S,(No0906S,(No1202S,No0910S))),No0908S),((No0913S,No304),No306)),(((No1007S,No1208S),No0909S),(No0912S,No1103S))),No305); (No1114S,(((No1007S,No1208S),No0909S),((No306,(No1103S,(((No0906S,(No1202S,No0910S)),No1206S),(No0908S,No0912S)))),(No0913S,No304))),No305); (No1114S,(No0912S,(No1103S,((No306,((No0906S,((No1202S,No0910S),No1206S)),((No1007S,(No1208S,No0909S)),No0908S))),(No304,No0913S)))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),((No0908S,No1206S),(((No304,No0913S),No306),(No0906S,(No1202S,No0910S))))),(No0912S,No1103S)),No305); (No1114S,(((No0910S,(((No0908S,No1206S),No1202S),((No304,No0913S),No306))),No0906S),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No305); (((No0912S,No1103S),(((No1206S,(No0906S,(No0910S,No1202S))),(No0908S,((No304,No0913S),No306))),(No1007S,(No1208S,No0909S)))),No1114S,No305); ((No304,(No306,((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(No0908S,No1206S)),(No0906S,(No0913S,(No0910S,No1202S)))))),No1114S,No305); (((((No1208S,No0909S),No1007S),(No0912S,No1103S)),((((No0906S,(No0910S,No1202S)),No1206S),No0908S),(No306,(No304,No0913S)))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((No0906S,(No0910S,No1202S)),(No1206S,No0908S)),(No306,(No304,No0913S)))),No1114S,No305); ((No0912S,(((((No0906S,(No0910S,No1202S)),No0908S),((No0909S,No1208S),No1007S)),((No306,(No304,No0913S)),No1206S)),No1103S)),No1114S,No305); ((((((No0906S,(No0910S,No1202S)),No1206S),(No306,(No304,No0913S))),No0908S),((((No0909S,No1208S),No1007S),No1103S),No0912S)),No1114S,No305); (((((((No0913S,No1202S),No0910S),No0906S),(No0908S,No1206S)),(No306,No304)),(No1103S,(No0912S,((No0909S,No1208S),No1007S)))),No1114S,No305); (((No304,((No1206S,((No0913S,(No1202S,No0910S)),No0906S)),(No306,No0908S))),(((No0909S,No1208S),No1007S),(No1103S,No0912S))),No1114S,No305); (((((No1206S,((No0913S,(No1202S,No0910S)),No0906S)),No0908S),(No304,No306)),(((No0909S,No1208S),No1007S),(No1103S,No0912S))),No1114S,No305); ((((No0908S,(No306,(No1206S,((No0913S,(No1202S,No0910S)),No0906S)))),(((No0909S,No1208S),No1007S),(No1103S,No0912S))),No304),No1114S,No305); (((((No0909S,No1208S),No1007S),(No1103S,No0912S)),((No306,(No0913S,No304)),(No0908S,(No1206S,((No1202S,No0910S),No0906S))))),No1114S,No305); (((No1103S,No0912S),(((No0909S,No1208S),No1007S),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(No306,(No0913S,No304))))),No1114S,No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),(No0912S,(No1103S,(No1007S,(No0909S,No1208S))))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),(No0912S,(No1103S,(No1007S,(No0909S,No1208S))))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),(No0912S,(No1103S,(No1007S,(No0909S,No1208S))))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),(No0912S,(No1103S,(No0909S,(No1208S,No1007S))))),No305); (No1114S,(No304,((((No0906S,(No0913S,(No1202S,No0910S))),No306),(No0908S,No1206S)),(No0912S,(No1103S,(No1208S,(No1007S,No0909S)))))),No305); (No1114S,(((No0908S,((No0906S,(No1202S,No0910S)),No1206S)),(No0912S,(No1103S,(No1007S,(No0909S,No1208S))))),((No304,No0913S),No306)),No305); (((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((((No1114S,(No304,No0913S)),No306),No0908S),((No0906S,(No1202S,No0910S)),No1206S)),No305); (No0912S,(No1103S,((((No306,((No1114S,No304),No0913S)),(No0906S,(No1202S,No0910S))),(No1206S,(No1007S,(No0909S,No1208S)))),No0908S)),No305); (((((No1206S,No0908S),(No306,No304)),(((No1202S,No0910S),No0913S),No0906S)),No1114S),((No0912S,No1103S),(No1208S,(No1007S,No0909S))),No305); (No1114S,((((No306,No304),(((No1202S,No0910S),No0913S),No0906S)),(No1206S,No0908S)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),(No0912S,(No1103S,(No1007S,(No0909S,No1208S))))),No305); (No1114S,((((No304,No0913S),No306),((No0908S,No1206S),(No0906S,(No1202S,No0910S)))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,(((No0913S,(No306,No304)),No1103S),(No0908S,(No1206S,(No0906S,(No1202S,No0910S)))))),(No1007S,(No0909S,No1208S))),No305); (No1114S,(((No0908S,No1206S),(((No0913S,(No306,No304)),No0906S),(No1202S,No0910S))),(((No0909S,(No1208S,No1007S)),No0912S),No1103S)),No305); (No1114S,(((No0908S,No1206S),((No306,(No304,No0913S)),(No0906S,(No1202S,No0910S)))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,(((No0908S,No1206S),((No306,(No304,No0913S)),(No0906S,(No1202S,No0910S)))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (((No1114S,(No306,(No304,No0913S))),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),No305); (No1114S,((No0909S,(No1208S,No1007S)),(((No306,(No304,No0913S)),((No0906S,((No1202S,No0910S),No1206S)),No0908S)),(No0912S,No1103S))),No305); (No1114S,(((No306,(No304,No0913S)),((No0908S,No1206S),(No0906S,(No1202S,No0910S)))),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No305); (No1114S,(((((No1202S,No0910S),No0906S),No1206S),(No0908S,(No306,(No304,No0913S)))),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),(No306,(No304,No0913S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((((No0906S,(No1202S,No0910S)),No1206S),No0908S),(No306,(No304,No0913S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((((No0906S,(No1202S,No0910S)),No1206S),No0908S),(No306,(No304,No0913S)))),No305); (No1114S,(((No0912S,No1103S),((No1007S,No1208S),No0909S)),((No0906S,(No1202S,No0910S)),((No306,(No304,No0913S)),(No1206S,No0908S)))),No305); (No1114S,(((No0912S,No1103S),((No1007S,No1208S),No0909S)),((No1206S,(No0906S,(No1202S,No0910S))),((No306,(No304,No0913S)),No0908S))),No305); (No1114S,(((No0912S,No1103S),((No1007S,No1208S),No0909S)),((No1206S,(No0906S,(No1202S,No0910S))),((No306,(No304,No0913S)),No0908S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))))),No305); ((No1208S,(No0909S,No1007S)),((No1114S,(No306,(No304,No0913S))),((No1206S,No0908S),(No1103S,((No0906S,(No1202S,No0910S)),No0912S)))),No305); ((((((No1202S,No0910S),No0906S),(No1206S,No0908S)),(((No1208S,No1007S),No0909S),(No0912S,No1103S))),(No306,(No304,No0913S))),No1114S,No305); ((((((No1202S,No0910S),No0906S),(No1206S,No0908S)),(((No1208S,No1007S),No0909S),(No0912S,No1103S))),(No306,(No304,No0913S))),No1114S,No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),(No306,(No304,No0913S)))),No305); (No1114S,((No1007S,(No0909S,No1208S)),(((((No306,(No304,No0913S)),(No0908S,No1206S)),(No1202S,No0910S)),No0906S),(No0912S,No1103S))),No305); ((((No1114S,((No304,No0913S),No306)),No0906S),((No0908S,No1206S),(No1202S,No0910S))),((No0912S,No1103S),(No1208S,(No1007S,No0909S))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),(No0912S,No1103S))),No305); ((((No1206S,(No0906S,(No1202S,No0910S))),No0908S),(No1114S,((No304,No0913S),No306))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),No305); (No1114S,((((No304,No0913S),No306),((No0908S,No1206S),((No1202S,No0910S),No0906S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),((((No1206S,((No1202S,No0910S),No0906S)),No0908S),((No304,No0913S),No306)),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No1206S,((No1202S,No0910S),No0906S)),No0908S),((No304,No0913S),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,(((((No1202S,No0910S),No0906S),(No0908S,No1206S)),((No304,No0913S),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (((((No0906S,(No1202S,No0910S)),No1206S),(No306,((No0913S,No304),No0908S))),(No0912S,(No1103S,(No1208S,(No1007S,No0909S))))),No1114S,No305); (((No0906S,((No306,(No0913S,No304)),((No0908S,No1206S),(No1202S,No0910S)))),((No0912S,(No0909S,(No1208S,No1007S))),No1103S)),No1114S,No305); (((((No1206S,(No0906S,(No1202S,No0910S))),No0908S),(No306,(No0913S,No304))),((No0912S,(No1007S,(No0909S,No1208S))),No1103S)),No1114S,No305); (((((No1206S,(No0906S,(No1202S,No0910S))),No0908S),(No306,(No0913S,No304))),((No0912S,(No1007S,(No0909S,No1208S))),No1103S)),No1114S,No305); ((((((No1206S,No0908S),No0906S),(No1202S,No0910S)),(No306,(No0913S,No304))),(No0912S,((No1007S,(No0909S,No1208S)),No1103S))),No1114S,No305); ((No304,((((No0908S,((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),(No1206S,(No0906S,(No1202S,No0910S)))),No306),No0913S)),No1114S,No305); (((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(((No0908S,No1206S),(No0906S,(No1202S,No0910S))),(No306,(No1114S,(No0913S,No304)))),No305); ((((No1103S,No0912S),(No0909S,(No1208S,No1007S))),(((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No0913S,No304))),No0908S)),No1114S,No305); ((((No1103S,No0912S),(No0909S,(No1208S,No1007S))),(((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No0913S,No304))),No0908S)),No1114S,No305); (((No0906S,(No1202S,No0910S)),(((No1103S,No0912S),(No1007S,(No0909S,No1208S))),(No0908S,No1206S))),(No1114S,(No306,(No0913S,No304))),No305); ((No304,(No306,(((No0912S,(No1103S,(No0909S,(No1208S,No1007S)))),(No0908S,No1206S)),(No0906S,(No0913S,(No1202S,No0910S)))))),No1114S,No305); ((No304,((No306,((((No1202S,No0910S),No0906S),(No0912S,(No1103S,(No0909S,(No1208S,No1007S))))),(No0908S,No1206S))),No0913S)),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1208S,No1007S))),((No0908S,No1206S),(((No0913S,No304),No306),((No1202S,No0910S),No0906S)))),No1114S,No305); ((No0908S,(((No0913S,No304),No306),(((No0912S,No1103S),(No0909S,(No1208S,No1007S))),((No1202S,No0910S),(No1206S,No0906S))))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0913S,No304),No306),((No0906S,(No1202S,No0910S)),(No0908S,No1206S)))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((((((No1202S,No0910S),No0913S),No304),No306),((No0908S,No1206S),No0906S)),(No0912S,No1103S))),No1114S,No305); ((No304,(No306,(((No0908S,((((No1208S,(No1007S,No0909S)),No0912S),No1103S),No1206S)),No0906S),((No1202S,No0910S),No0913S)))),No1114S,No305); ((No304,(No306,(((((No1208S,(No1007S,No0909S)),No0912S),No1103S),(No1206S,No0908S)),(No0906S,(No1202S,(No0910S,No0913S)))))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(((No304,No306),(No1206S,No0908S)),(No0906S,(No0913S,(No1202S,No0910S))))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No306,(No0913S,No304)),((No1206S,No0908S),(No0906S,(No1202S,No0910S))))),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No0908S,No1206S),(No0906S,(No1202S,No0910S)))),(No1114S,(No306,(No0913S,No304))),No305); (No1114S,(((No306,(No0913S,No304)),((No0908S,No1206S),(No0906S,(No1202S,No0910S)))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,(((No306,(No0913S,No304)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),(No1007S,(No1208S,No0909S)))),No1103S),No305); (No1114S,(No304,(((((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),(((No1007S,(No1208S,No0909S)),No0912S),No1103S)),No306),No0913S)),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No306,(No0913S,No304)),((No0906S,(No1202S,No0910S)),(No0908S,No1206S)))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No0912S,No1103S),((No306,(No0913S,No304)),((No0908S,No1206S),(No0906S,(No1202S,No0910S)))))),No305); (No1114S,((No306,(No0913S,No304)),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No1103S,(No0912S,(No1007S,(No1208S,No0909S)))))),No305); (No1114S,((No0913S,(((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(((No1007S,(No1208S,No0909S)),No0912S),No1103S)),No306)),No304),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(No0908S,((No306,(No304,No0913S)),(No1206S,(No0906S,(No1202S,No0910S)))))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(No0908S,((No306,(No304,No0913S)),(No1206S,(No0906S,(No1202S,No0910S)))))),No305); ((((No0912S,(No0909S,(No1007S,No1208S))),No1103S),(((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No0910S,No1202S)))))),No1114S,No305); ((((No0912S,(No0909S,(No1007S,No1208S))),No1103S),(((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No0910S,No1202S)))))),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),(((No304,No0913S),No306),(No0908S,(No0906S,((No0910S,No1202S),No1206S))))),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),((((No304,No0913S),No306),(No0906S,(No0910S,No1202S))),(No0908S,No1206S))),No1114S,No305); (((No0909S,(No1007S,No1208S)),((((No304,No0913S),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S)),(No1103S,No0912S))),No1114S,No305); ((No304,(No306,((No0913S,(No0906S,(No0910S,No1202S))),(((No1103S,No0912S),(No0909S,(No1007S,No1208S))),(No0908S,No1206S))))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0908S,(((No306,No304),No0913S),(No0906S,((No0910S,No1202S),No1206S))))),(No0912S,No1103S)),No1114S,No305); (No0908S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(((No0906S,(No1202S,No0910S)),No1206S),(No306,(No1114S,(No0913S,No304))))),No305); ((((No1103S,No0912S),(No1208S,(No0909S,No1007S))),((No306,No304),((No0908S,No1206S),(No0906S,(No0913S,(No1202S,No0910S)))))),No1114S,No305); (((No0909S,(No1007S,No1208S)),(((No0908S,No1206S),((No0906S,(No1202S,No0910S)),(No306,(No0913S,No304)))),(No0912S,No1103S))),No1114S,No305); (((No0912S,(((No0906S,((No0910S,No1202S),No1206S)),(((No304,No0913S),No306),No0908S)),No1103S)),(No1007S,(No1208S,No0909S))),No1114S,No305); (((No0912S,No1103S),((No1007S,(No1208S,No0909S)),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No304,No0913S),No306)))),No1114S,No305); (((((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No304,No0913S),No306)),((No0912S,No1103S),(No1208S,(No0909S,No1007S)))),No1114S,No305); (((No0908S,(((No1206S,No0906S),(No0910S,No1202S)),((No304,No0913S),No306))),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (No0908S,((No1206S,(No0906S,(No0910S,No1202S))),(((No1114S,(No304,No0913S)),No306),((No0912S,No1103S),(No0909S,(No1007S,No1208S))))),No305); (No1114S,(((((No0909S,No1007S),No1208S),No0912S),No1103S),((No306,(No304,No0913S)),((No0908S,No1206S),(No0906S,(No0910S,No1202S))))),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(No0908S,((No306,(No304,No0913S)),(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(((No0910S,No1202S),No0906S),((No306,(No304,No0913S)),(No0908S,No1206S)))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No0912S,No1103S),((No306,(No304,No0913S)),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))))),No305); (No1114S,(((((No1206S,((No0910S,No1202S),No0906S)),No0908S),No306),(No304,No0913S)),(((No0909S,(No1007S,No1208S)),No0912S),No1103S)),No305); (((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),(((No0913S,No304),No306),((No0906S,(No0910S,No1202S)),(No1206S,No0908S)))),No1114S,No305); ((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),((No1114S,((No0913S,No304),No306)),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),((((No0913S,No304),No306),((No0906S,(No0910S,No1202S)),(No1206S,No0908S))),(No1007S,(No0909S,No1208S)))),No305); (No1114S,(((((No0906S,(No0910S,No1202S)),No1206S),(No0908S,((No0913S,No304),No306))),(No1007S,(No0909S,No1208S))),(No0912S,No1103S)),No305); (No1114S,(No304,((No306,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(((No0906S,(No0910S,No1202S)),No1206S),No0908S))),No0913S)),No305); (No1114S,((((No1007S,(No0909S,No1208S)),No0912S),No1103S),((((No0906S,(No0913S,(No0910S,No1202S))),No1206S),(No304,No0908S)),No306)),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No304,No306),(No0906S,((No0913S,(No0910S,No1202S)),(No0908S,No1206S))))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),No0908S),(((No304,No0913S),No306),((No1007S,(No0909S,No1208S)),(No0912S,No1103S)))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((((No304,No0913S),No306),(No1206S,(No0906S,(No0910S,No1202S)))),No0908S)),No305); ((((No0912S,No1103S),(No0908S,(((No0913S,No304),No306),(No1206S,(No0906S,(No0910S,No1202S)))))),(No1007S,(No0909S,No1208S))),No1114S,No305); ((((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),((No0913S,No304),No306)),No1114S,No305); ((((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),((No0913S,No304),No306)),No1114S,No305); ((No0912S,No1103S),(((No1206S,((No0906S,(No0910S,No1202S)),((No1114S,(No0913S,No304)),No306))),No0908S),(No1007S,(No0909S,No1208S))),No305); (No1114S,((No0913S,No304),(No306,((No0908S,((No1206S,No0906S),(No0910S,No1202S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((No0912S,No1103S),((((No0910S,No1202S),No0906S),(No1206S,No0908S)),(No306,(No304,No0913S))))),No305); (No1114S,((No0912S,No1103S),(((((No1206S,No0908S),No0910S),(No1202S,(No306,(No304,No0913S)))),No0906S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No0913S,(No0906S,(No0910S,No1202S))),No306),((No1206S,No0908S),(((No0909S,(No1208S,No1007S)),No0912S),No1103S))),No304),No305); ((((((No0906S,(No0910S,No1202S)),(No304,No0913S)),(No1206S,No0908S)),No306),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),No1114S,No305); ((((((No1206S,No0906S),(No0910S,No1202S)),((No304,No0913S),No0908S)),No306),((No1208S,(No1007S,No0909S)),(No0912S,No1103S))),No1114S,No305); (No1114S,(((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(No0906S,((No0910S,No1202S),No1206S))),((No0913S,No304),No306)),No0908S),No305); (No1114S,(((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),No0908S),(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0908S,No1206S),((No0906S,(No0910S,No1202S)),(No0913S,No304))),No306)),No305); (No1114S,(No0912S,((((((No0908S,No1206S),No0906S),(No0910S,No1202S)),(No306,(No0913S,No304))),(No1007S,(No0909S,No1208S))),No1103S)),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),No0908S),(No306,(((No0912S,(No1007S,(No0909S,No1208S))),No1103S),(No0913S,No304)))),No305); (No1114S,(((No1208S,(No1007S,No0909S)),(No1103S,No0912S)),(No0908S,((No306,(No304,No0913S)),(No1206S,(No0906S,(No0910S,No1202S)))))),No305); (No1114S,((No1103S,No0912S),(((No0908S,(No306,(No304,No0913S))),(No1206S,(No0906S,(No0910S,No1202S)))),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((No1103S,No0912S),(((No1206S,(No0906S,(No0910S,No1202S))),No0908S),(No306,(No304,No0913S))))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((No1103S,No0912S),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No304,No0913S))))),No305); (No1114S,((((No0913S,(No0906S,(No0910S,No1202S))),(No0908S,No1206S)),(No306,No304)),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No305); ((((No1103S,(No0912S,((No1208S,No0909S),No1007S))),No0908S),(No1206S,(No0906S,(No0910S,No1202S)))),(((No0913S,No304),No306),No1114S),No305); (((((No1208S,No0909S),No1007S),(No1103S,No0912S)),((No0908S,No1206S),(((No0913S,No304),No306),(No0906S,(No0910S,No1202S))))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No1103S,No0912S)),(((No0913S,No304),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No1114S,No305); (((No0909S,(No1007S,No1208S)),(No0912S,(((No1114S,(No0913S,No304)),No306),(((No0910S,No1202S),(No0908S,No1206S)),No0906S)))),No1103S,No305); (No1114S,(((No0913S,No304),No306),(((No0908S,No1206S),((No0910S,No1202S),No0906S)),((No1208S,(No0909S,No1007S)),(No1103S,No0912S)))),No305); (No1114S,(((((No0913S,No304),No306),((No1206S,(No1202S,No0910S)),No0906S)),No0908S),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,(((((No1202S,No0910S),No0906S),(No0908S,No1206S)),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,(((((No1202S,No0910S),No0906S),(No0908S,No1206S)),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,(((((No1202S,No0910S),No0906S),(No0908S,No1206S)),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No1103S,No0912S),((((No1202S,No0910S),No0906S),(No0908S,No1206S)),((No0913S,No304),No306)))),No305); ((((No1103S,No0912S),(((No0913S,No304),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),((No1208S,No0909S),No1007S)),No1114S,No305); (((No1103S,No0912S),(((No1206S,(No0906S,(No0910S,No1202S))),(No0908S,(No1208S,(No0909S,No1007S)))),((No0913S,No304),No306))),No1114S,No305); ((((No1206S,(No0906S,(No0910S,No1202S))),(((No0913S,No304),No306),((No1103S,No0912S),(No1007S,(No1208S,No0909S))))),No0908S),No1114S,No305); (((No0912S,((No0909S,(No1007S,No1208S)),No1103S)),(((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No0913S,No304),No306))),No1114S,No305); (((No0912S,((No1007S,(No1208S,No0909S)),No1103S)),(((No1206S,(No0906S,(No0910S,No1202S))),((No0913S,No304),No306)),No0908S)),No1114S,No305); (((No1007S,(No1208S,No0909S)),((No1103S,No0912S),(((No1206S,(No0906S,(No0910S,No1202S))),((No0913S,No304),No306)),No0908S))),No1114S,No305); ((((No0908S,No1206S),((No0910S,No1202S),No0906S)),(No1114S,((No0913S,No304),No306))),((No1103S,No0912S),(No0909S,(No1007S,No1208S))),No305); (No1114S,(((((No0908S,No1206S),No0906S),(((No0913S,No304),No306),(No0910S,No1202S))),(No1208S,(No0909S,No1007S))),(No1103S,No0912S)),No305); (No1114S,((No0906S,(((No0913S,No304),No306),((No0908S,No1206S),(No0910S,No1202S)))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No305); (No1114S,((((No0913S,No304),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S)))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No305); (((No0912S,No1103S),((No1007S,(No1208S,No0909S)),(((No306,(No304,No0913S)),No1206S),((No0906S,(No1202S,No0910S)),No0908S)))),No1114S,No305); ((((No306,(No304,No0913S)),((No0908S,No1206S),(No0906S,(No1202S,No0910S)))),((No0912S,No1103S),(No1208S,(No0909S,No1007S)))),No1114S,No305); (((No1007S,(No1208S,No0909S)),((((No0908S,No1206S),(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))),(No0912S,No1103S))),No1114S,No305); (((((No0908S,No1206S),(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((No1007S,(No1208S,No0909S)),(((((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S))),No0912S),No1103S)),No1114S,No305); (((No0908S,(No306,((No304,No0913S),((No0906S,No1202S),(No0910S,No1206S))))),(((No1007S,(No1208S,No0909S)),No0912S),No1103S)),No1114S,No305); ((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(No1114S,(((No1206S,No0908S),(No0913S,((No1202S,No0910S),No0906S))),(No306,No304))),No305); (No1114S,((((No1206S,No0906S),No0908S),(((No1202S,No0910S),(No304,No0913S)),No306)),(No0912S,(No1103S,(No1007S,(No1208S,No0909S))))),No305); ((((No1114S,(No304,No0913S)),No306),((No1206S,No0908S),(No0906S,(No1202S,No0910S)))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),No305); ((((No304,No0913S),No306),((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(No0908S,((No1206S,No0906S),(No1202S,No0910S))))),No1114S,No305); (No1114S,((No0912S,(No1103S,(No0909S,(No1007S,No1208S)))),((((No0910S,No1202S),No0906S),(No0908S,No1206S)),(No306,(No0913S,No304)))),No305); (No1114S,((No0912S,(No1103S,(No0909S,(No1007S,No1208S)))),(((((No0910S,No1202S),No0906S),No1206S),No0908S),(No306,(No0913S,No304)))),No305); (No1114S,((No0912S,(No1103S,(No0909S,(No1007S,No1208S)))),((((No0910S,No1202S),No0906S),(No1206S,No0908S)),(No306,(No0913S,No304)))),No305); ((No0912S,No1103S),((No0909S,(No1007S,No1208S)),((((No0910S,No1202S),No0906S),(No1206S,No0908S)),(No1114S,(No306,(No0913S,No304))))),No305); (No1114S,(No306,((No0908S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No0910S,No1202S),(No0913S,No304)))),(No1206S,No0906S))),No305); (No1114S,(No306,(((No0908S,(No1206S,((No0910S,No1202S),No0906S))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),(No0913S,No304))),No305); (No1114S,((No1007S,(No1208S,No0909S)),(((((No0913S,No304),No306),No0908S),(No1206S,((No0910S,No1202S),No0906S))),(No0912S,No1103S))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))),((No0912S,No1103S),(No1208S,(No0909S,No1007S)))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))),((No0912S,No1103S),(No1208S,(No0909S,No1007S)))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No305); (No1114S,((No0912S,(No1103S,(No1007S,(No1208S,No0909S)))),(((((No0910S,No1202S),No0906S),No1206S),((No0913S,No304),No306)),No0908S)),No305); (No1114S,((No1007S,(No1208S,No0909S)),(No0912S,(((((No0910S,No1202S),No0906S),(No0908S,No1206S)),((No0913S,No304),No306)),No1103S))),No305); (No1114S,((((No1206S,((No0910S,No1202S),No0906S)),No0908S),((No0913S,No304),No306)),(((No1007S,(No1208S,No0909S)),No1103S),No0912S)),No305); (No1114S,((((No1206S,((No0910S,No1202S),No0906S)),No0908S),((No0913S,No304),No306)),(((No1007S,(No1208S,No0909S)),No1103S),No0912S)),No305); (No1114S,((((No1206S,((No0910S,No1202S),No0906S)),No0908S),((No0913S,No304),No306)),(((No1007S,(No1208S,No0909S)),No1103S),No0912S)),No305); (No1114S,((((No1206S,((No0910S,No1202S),No0906S)),No0908S),((No0913S,No304),No306)),(((No0909S,(No1007S,No1208S)),No1103S),No0912S)),No305); (No1114S,((No306,(No0913S,No304)),(((No0910S,No1202S),No0906S),(((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),(No0908S,No1206S)))),No305); (No1114S,(((No0913S,No306),((((No0906S,(No0910S,No1202S)),No1206S),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No0908S)),No304),No305); (No1114S,((No1103S,(No0912S,(No1007S,(No1208S,No0909S)))),(((No304,No0913S),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S)))),No305); (No1114S,((No1103S,(No0912S,(No0909S,(No1007S,No1208S)))),(No306,((No0908S,((No0906S,(No0910S,No1202S)),No1206S)),(No304,No0913S)))),No305); (No1114S,((No1103S,(No0912S,(No1007S,(No0909S,No1208S)))),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),((No0913S,No304),No306)))),No305); (((No0909S,(No1208S,No1007S)),No1114S),(((((No0908S,No1206S),((No0910S,No1202S),No0906S)),((No0913S,No304),No306)),No1103S),No0912S),No305); ((((No1103S,(No0912S,(No1007S,(No0909S,No1208S)))),((No0910S,No1202S),No0906S)),(No1206S,No0908S)),(No1114S,((No0913S,No304),No306)),No305); ((((No1103S,No0912S),(No1007S,(No0909S,No1208S))),(((No0910S,No1202S),(No1206S,No0906S)),(No0908S,((No0913S,No304),No306)))),No1114S,No305); (((((No1007S,(No0909S,No1208S)),No0912S),No1103S),((((No0906S,No0910S),No1202S),(No0908S,No1206S)),((No0913S,No304),No306))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),No0912S),No1103S),(((((No0910S,No1202S),No1206S),No0906S),No0908S),((No0913S,(No1114S,No304)),No306)),No305); (((No0912S,(((No0908S,(((No0906S,No1202S),No0910S),No1206S)),((No0913S,No304),No306)),(No0909S,(No1208S,No1007S)))),No1103S),No1114S,No305); ((No0908S,(((No0913S,No304),No306),(((No0906S,(No1007S,(No0909S,No1208S))),(No0912S,(No1202S,No0910S))),(No1206S,No1103S)))),No1114S,No305); (((No0912S,No1103S),(No0908S,(((No0913S,No304),No306),(No0906S,((No1202S,No0910S),No1206S))))),((No0909S,(No1208S,No1007S)),No1114S),No305); (No1114S,((No0912S,No1103S),(((No0906S,(No1202S,No0910S)),((No0908S,No1206S),((No0913S,No304),No306))),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((No1103S,(No0912S,(No1007S,(No0909S,No1208S)))),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),((No0913S,No304),No306)))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),(((No0908S,No1206S),(No0906S,(No1202S,No0910S))),((No0913S,No304),No306))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(((No0908S,No1206S),(No0906S,(No1202S,No0910S))),((No0913S,No304),No306))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(((No0908S,No1206S),(No0906S,(No1202S,No0910S))),((No0913S,No304),No306))),No305); (No1114S,((No1103S,No0912S),(((No0906S,(No1202S,No0910S)),((No0909S,(No1208S,No1007S)),(No0908S,No1206S))),((No0913S,No304),No306))),No305); (No1114S,(No1103S,(No0912S,((No0909S,(No1208S,No1007S)),(No0908S,(((No0913S,No304),No306),(No1206S,(No0906S,(No1202S,No0910S)))))))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),((((((No1202S,No0910S),No0913S),No304),No306),No0906S),(No0908S,No1206S))),(No1103S,No0912S)),No305); (No1114S,((No0908S,(No1206S,(((No0913S,No304),No306),((No1202S,No0910S),No0906S)))),((No1103S,No0912S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,(((((No0913S,No304),No306),((No1202S,No0910S),No0906S)),(No0908S,No1206S)),((No1103S,No0912S),(No0909S,(No1208S,No1007S)))),No305); ((((No0908S,(No1206S,((No1202S,No0910S),No0906S))),((No0913S,No304),No306)),(No0912S,No1103S)),(No1114S,(No1007S,(No0909S,No1208S))),No305); (((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(No1114S,(No306,(No0913S,No304)))),No305); (No1114S,(((No1206S,No0908S),(((No1202S,No0910S),No0906S),(No306,(No0913S,No304)))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,(((No306,(No0913S,No304)),(No0908S,(No1206S,((No1202S,No0910S),No0906S)))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,((No0909S,(No1208S,No1007S)),((No0912S,No1103S),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(No306,(No0913S,No304))))),No305); (No1114S,((((No306,No0913S),(((No1202S,No0910S),No0906S),(No0908S,No1206S))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No304),No305); (No1114S,((((No0909S,No1208S),No1007S),(No0912S,No1103S)),((No306,(No304,No0913S)),((((No1202S,No0910S),No0906S),No1206S),No0908S))),No305); (No1114S,((((No0909S,No1208S),No1007S),(No0912S,No1103S)),((No306,(No304,No0913S)),((((No1202S,No0910S),No0906S),No1206S),No0908S))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No306,(No304,No0913S)),(((No1202S,No0910S),No0906S),(No1206S,No0908S)))),No305); (((No1103S,No0912S),(((No306,(No304,No0913S)),(((No1202S,No0910S),No0906S),(No1206S,No0908S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); (((No1103S,No0912S),(((No306,(No304,No0913S)),(((No1202S,No0910S),No0906S),(No1206S,No0908S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); ((((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(No306,(No0913S,No304)))),No1114S,No305); ((((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(No306,(No0913S,No304)))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(((No0908S,No1206S),No0906S),(No306,(((No1202S,No0910S),No0913S),No304)))),No1114S,No305); (((No0913S,(No306,((((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(No0908S,No1206S)),(No0906S,(No1202S,No0910S))))),No304),No1114S,No305); ((((No1206S,(No0913S,(No0906S,(No1202S,No0910S)))),(No306,(No0908S,((No0909S,(No1208S,No1007S)),(No0912S,No1103S))))),No304),No1114S,No305); (((No0908S,((No306,(No304,(No0913S,(No1202S,No0910S)))),(No0906S,No1206S))),((No0912S,No1103S),(No1208S,(No1007S,No0909S)))),No1114S,No305); ((No304,((No306,((((No1202S,No0910S),No0906S),No1206S),(((No0912S,No1103S),(No0909S,(No1208S,No1007S))),No0908S))),No0913S)),No1114S,No305); (((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((No0908S,(((No1202S,No0910S),No0906S),No1206S)),(No306,((No0913S,No304),No1114S))),No305); (No1114S,((((((((No1202S,No0910S),No0906S),No1206S),No306),No0908S),((No0912S,No1103S),(No1208S,(No1007S,No0909S)))),No0913S),No304),No305); (No1114S,(((No0912S,No1103S),(No0909S,(No1208S,No1007S))),((No306,(No0913S,No304)),((No1202S,((No1206S,No0906S),No0910S)),No0908S))),No305); (((No306,((No304,(No1206S,(No0906S,((No0910S,No1202S),No0913S)))),No0908S)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); ((((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); ((((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); ((No304,((((No0906S,(No0913S,(No0910S,No1202S))),(No0908S,No1206S)),No306),((No1208S,(No1007S,No0909S)),(No0912S,No1103S)))),No1114S,No305); (((No1007S,(No0909S,No1208S)),(No0912S,(No1103S,((No0908S,((No1206S,(No0910S,No1202S)),No0906S)),((No304,No0913S),No306))))),No1114S,No305); ((((No1007S,(No0909S,No1208S)),((No0908S,((No1206S,(No0910S,No1202S)),No0906S)),((No304,No0913S),No306))),(No0912S,No1103S)),No1114S,No305); ((((((No0906S,(No0913S,(No0910S,No1202S))),No306),(No1206S,No0908S)),(((No1007S,No1208S),No0909S),(No0912S,No1103S))),No304),No1114S,No305); ((((((No0913S,No304),No306),(No1206S,(No0906S,(No0910S,No1202S)))),No0908S),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No1114S,No305); ((((((No0913S,No304),No306),(No1206S,(No0906S,(No0910S,No1202S)))),No0908S),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No1114S,No305); ((((((No0913S,No304),No306),No0906S),((No0910S,No1202S),(No0908S,No1206S))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No1114S,No305); (No1114S,(No306,((((No0913S,No304),No0908S),((No1103S,(No1007S,(No0909S,No1208S))),No0912S)),(No1206S,(No0906S,(No0910S,No1202S))))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(No0908S,((No1206S,(No0906S,(No0910S,No1202S))),(No306,(No0913S,No304))))),No305); (No1114S,((No0912S,No1103S),((No1007S,(No0909S,No1208S)),((No306,(No0913S,No304)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))))),No305); (No1114S,((No0912S,No1103S),((No1007S,(No0909S,No1208S)),((No306,(No0913S,No304)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))))),No305); (No1114S,(((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,(((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((No0909S,(No1208S,No1007S)),((((No306,(No0913S,No304)),(((No0910S,No1202S),No0906S),No1206S)),No0908S),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),((No0909S,(No1208S,No1007S)),((((No306,(No0913S,No304)),No0906S),(No0908S,(No0910S,No1202S))),No1206S))),No305); (No1114S,(((No0908S,(No306,(No0913S,No304))),(((No0910S,No1202S),No0906S),No1206S)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No1206S,No0908S),((No0910S,No1202S),No0906S)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),(No306,(No0913S,No304))),No305); (No1114S,(((((No0913S,No304),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S)))),(No1103S,No0912S)),((No1208S,No1007S),No0909S)),No305); ((No304,((No0913S,No306),(No0908S,((No1206S,(No0906S,(No0910S,No1202S))),(((No1208S,No1007S),No0909S),(No0912S,No1103S)))))),No1114S,No305); (((No0912S,No1103S),((((No1206S,(No0906S,(No0910S,No1202S))),((No304,No0913S),No306)),No0908S),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((((No1114S,No304),No0913S),No306),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),No305); ((((((No0910S,No1202S),(No1206S,No0906S)),No0908S),((No304,No0913S),No306)),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),No1114S,No305); ((No0908S,((((No304,No0913S),No1114S),No306),((No0910S,No1202S),(No1206S,No0906S)))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),No305); ((((No0908S,((No0906S,(No0910S,No1202S)),No1206S)),((No304,No0913S),No306)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((((No0906S,(No0910S,No1202S)),(No1206S,No0908S)),((No304,No0913S),No306)),(No0912S,No1103S))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((((No0906S,(No0910S,No1202S)),(No1206S,No0908S)),((No304,No0913S),No306)),(No0912S,No1103S))),No1114S,No305); (((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),((No304,No0913S),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); ((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),((No306,(No304,No0913S)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No1114S,No305); ((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),((No306,(No304,No0913S)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No1114S,No305); ((((No306,(No304,No0913S)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),No1114S,No305); ((((No306,(No304,No0913S)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),No1114S,No305); ((No0908S,(((((No1007S,(No0909S,No1208S)),No0912S),No1103S),(No306,(No1114S,(No304,No0913S)))),(No0906S,(No0910S,No1202S)))),No1206S,No305); (No1114S,((No306,(No304,No0913S)),(((((No1007S,(No0909S,No1208S)),No0912S),No1103S),No1206S),(No0908S,(No0906S,(No0910S,No1202S))))),No305); (No1114S,((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),((No0908S,(No1206S,(No0910S,(No0906S,No1202S)))),(No306,(No304,No0913S)))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(No0908S,((No306,No304),(No1206S,(No0906S,(No0913S,(No1202S,No0910S))))))),No305); (No1114S,((((((No1206S,(No0906S,(No0913S,(No1202S,No0910S)))),No0912S),(No1103S,No306)),No0908S),(No1007S,(No0909S,No1208S))),No304),No305); ((((No304,No1114S),No0913S),No306),(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),No305); ((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),(((No306,(No304,No0913S)),((No0910S,No1202S),No0906S)),(No1206S,No0908S))),No1114S,No305); ((No1103S,(No0912S,(No0909S,(No1208S,No1007S)))),((No1114S,(No306,(No304,No0913S))),((No1206S,((No0910S,No1202S),No0906S)),No0908S)),No305); (No1114S,((No306,(No304,No0913S)),(((No0910S,No1202S),No0906S),((((No1208S,(No1007S,No0909S)),No0912S),No1103S),(No0908S,No1206S)))),No305); (No1114S,(((((((No0908S,No1206S),No0906S),(No306,(No304,No0913S))),(No0910S,No1202S)),(No0909S,(No1208S,No1007S))),No0912S),No1103S),No305); (No1114S,((No0909S,(No1208S,No1007S)),((No0912S,No1103S),((No304,No0913S),(((No0908S,No1206S),(No0906S,(No0910S,No1202S))),No306)))),No305); (No1114S,((((No0906S,((No0910S,No1202S),No1206S)),No0908S),((No304,No0913S),No306)),(((No0909S,(No1208S,No1007S)),No0912S),No1103S)),No305); (No1114S,((((No0906S,((No0910S,No1202S),No1206S)),No0908S),((No304,No0913S),No306)),(((No0909S,(No1208S,No1007S)),No0912S),No1103S)),No305); (No1114S,((((No0906S,((No0910S,No1202S),No1206S)),No0908S),((No304,No0913S),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((((No0906S,((No0910S,No1202S),No1206S)),No0908S),((No304,No0913S),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),((((((No0906S,No0910S),No1202S),No1206S),No0908S),((No304,No0913S),No306)),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((No1103S,(No0912S,(No0909S,(No1208S,No1007S)))),(((No0913S,No304),No306),(No0908S,(No1206S,((No1202S,No0910S),No0906S))))),No305); (No1114S,((No1103S,No0912S),((No0909S,(No1208S,No1007S)),(((No0913S,No304),No306),(No0908S,(No1206S,((No1202S,No0910S),No0906S)))))),No305); ((((No0913S,No304),No306),No1114S),(((No1103S,No0912S),((No0909S,No1208S),No1007S)),(No0908S,(No1206S,((No1202S,No0910S),No0906S)))),No305); (No1114S,(((No0912S,No1103S),((No0909S,No1208S),No1007S)),(No0908S,((No0906S,(No1206S,(No1202S,No0910S))),((No0913S,No304),No306)))),No305); (No1114S,((No0912S,No1103S),(((No0909S,No1208S),No1007S),(((No0906S,(No1202S,No0910S)),No1206S),(((No0913S,No304),No306),No0908S)))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,((No0906S,(No1202S,No0910S)),No1206S))),((No0912S,No1103S),((No0909S,No1208S),No1007S))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,((No0906S,(No1202S,No0910S)),No1206S))),((No0912S,No1103S),((No0909S,No1208S),No1007S))),No305); (No1114S,((((No0913S,No304),No306),(((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),(No1103S,((No0909S,No1208S),No1007S)))),No0912S),No305); (No1114S,(((No0912S,No1103S),((No0909S,No1208S),No1007S)),((No0913S,(No304,No306)),(No0908S,((No0906S,(No1202S,No0910S)),No1206S)))),No305); (No1114S,(((No0912S,No1103S),((No0909S,No1208S),No1007S)),(((No306,(No0913S,No304)),(No0906S,(No1206S,No0908S))),(No1202S,No0910S))),No305); (No1114S,(No304,((No0913S,No306),(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((No1206S,((No0910S,No1202S),No0906S)),No0908S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0906S,(No1206S,(No0910S,No1202S))),No0908S),((No304,No0913S),No306))),No305); (No1114S,((No0912S,No1103S),((No0909S,(No1208S,No1007S)),(((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),((No304,No0913S),No306)))),No305); (No1114S,(((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306))),((No0912S,No1103S),(No1208S,(No1007S,No0909S)))),No305); (No1114S,(((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306))),((No0912S,No1103S),((No1208S,No0909S),No1007S))),No305); (No1114S,(((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306))),((No0912S,No1103S),((No1208S,No0909S),No1007S))),No305); (No1114S,(((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306))),((No0912S,No1103S),((No1208S,No0909S),No1007S))),No305); (No1114S,(((No0906S,((No0908S,No1206S),(No1202S,No0910S))),((No304,No0913S),No306)),((No0912S,No1103S),((No1208S,No0909S),No1007S))),No305); (No1114S,(No304,((No0913S,No306),(No0908S,(((((No1208S,No0909S),No1007S),No0912S),No1103S),(No1206S,((No1202S,No0910S),No0906S)))))),No305); (No1114S,(((No304,No0913S),No306),((((No1202S,No0910S),No0906S),No1206S),(No0908S,((((No1208S,No0909S),No1007S),No0912S),No1103S)))),No305); (No1114S,((((No304,No0913S),No306),((No1206S,No0908S),((No0910S,No1202S),No0906S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),(((((No0910S,No1202S),(No1206S,No0906S)),No0908S),((No304,No0913S),No306)),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),((No304,No0913S),No306)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),((No304,No0913S),No306)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306))),(No0912S,(No1103S,(No0909S,(No1208S,No1007S))))),No305); (No1114S,(((No304,No0913S),No306),(((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No0908S,No1206S),((No1202S,No0910S),No0906S)))),No305); (No1114S,((No1208S,(No1007S,No0909S)),((No0912S,No1103S),(No306,((No0908S,((No1202S,No0910S),((No304,No0913S),No1206S))),No0906S)))),No305); (((No0912S,((No1007S,(No0909S,No1208S)),No1103S)),((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306)))),No1114S,No305); ((((No0912S,No1103S),((((No1202S,No0910S),No0906S),(No0908S,No1206S)),((No304,No0913S),No306))),(No1007S,(No0909S,No1208S))),No1114S,No305); (No1114S,((No0912S,No1103S),((((No0908S,No1206S),((No1202S,No0910S),No0906S)),((No304,No0913S),No306)),(No0909S,(No1208S,No1007S)))),No305); ((((((No0908S,(No0909S,(No1007S,No1208S))),((No0906S,(No0910S,No1202S)),No1206S)),((No0913S,No304),No306)),No0912S),No1103S),No1114S,No305); (((((No0910S,No1202S),No0906S),(((No0913S,No304),No306),(No0908S,No1206S))),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((((No0910S,No1202S),No0906S),(((No0913S,No304),No306),(No0908S,No1206S))),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((No1103S,No0912S),((No0909S,(No1007S,No1208S)),(((No0913S,No304),No306),((No0908S,No1206S),((No0910S,No1202S),No0906S))))),No1114S,No305); (((((No0913S,No304),No306),((No0908S,No1206S),((No0910S,No1202S),No0906S))),((No1103S,No0912S),(No1007S,(No1208S,No0909S)))),No1114S,No305); (((No1103S,No0912S),((No0909S,(No1007S,No1208S)),((((No0913S,(No0910S,No1202S)),No0906S),(No304,(No0908S,No1206S))),No306))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306)),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306)),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((No1103S,No0912S),((No0909S,(No1007S,No1208S)),(((((No0910S,No1202S),No0906S),No1206S),No0908S),((No0913S,No304),No306)))),No1114S,No305); (((No0913S,No304),(No306,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(((No0910S,No1202S),No0906S),(No1206S,No0908S))))),No1114S,No305); (((No0912S,No1103S),((((No0913S,No304),No306),(No0908S,(No0906S,((No0910S,No1202S),No1206S)))),(No1208S,(No0909S,No1007S)))),No1114S,No305); (((((No0913S,No304),No306),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((No0913S,No304),No306),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((((No1007S,No1208S),No0912S),No1103S),No0909S)),No1114S,No305); ((((No1208S,(No0909S,No1007S)),(No1103S,No0912S)),((No0913S,(No1114S,No304)),No306)),((No0908S,No1206S),(No0906S,(No0910S,No1202S))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306))),No305); ((No1007S,(No1208S,No0909S)),((No1103S,((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),No0912S)),((No0913S,(No1114S,No304)),No306)),No305); ((No304,((No1206S,(No0906S,(No0913S,(No0910S,No1202S)))),((((No1103S,No0912S),(No0909S,(No1007S,No1208S))),No0908S),No306))),No1114S,No305); ((No0912S,((((No304,No0913S),No306),((No0908S,No1206S),(No0906S,(No0910S,((No1007S,(No1208S,No0909S)),No1202S))))),No1103S)),No1114S,No305); ((((No1202S,No0910S),(((No304,No0913S),No306),((No0908S,No1206S),No0906S))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No1114S,No305); ((((No306,(No304,No0913S)),(((No0910S,No1202S),No0906S),(No0908S,No1206S))),(((No1007S,(No1208S,No0909S)),No1103S),No0912S)),No1114S,No305); ((((No306,(No304,No0913S)),(((No0910S,No1202S),No0906S),(No0908S,No1206S))),(((No1007S,(No1208S,No0909S)),No1103S),No0912S)),No1114S,No305); (((((((No0910S,No1202S),No0906S),No1206S),(No306,(No304,No0913S))),No0908S),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No1114S,No305); (((((((No0910S,No1202S),No0906S),No1206S),(No306,(No304,No0913S))),No0908S),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No1114S,No305); (((((No0910S,No1202S),No0906S),(No0908S,No1206S)),(No306,(No304,No0913S))),(((No0909S,(No1007S,(No1208S,No1114S))),No0912S),No1103S),No305); (No1114S,((No306,(No304,No0913S)),(((No0906S,(No0910S,No1202S)),No1206S),((((No1208S,(No1007S,No0909S)),No0912S),No1103S),No0908S))),No305); (No1114S,((((No1208S,(No1007S,No0909S)),No0912S),No1103S),(((No0910S,No1202S),No0908S),((No306,(No304,No0913S)),(No1206S,No0906S)))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No306,(No304,No0913S)),((No0908S,No1206S),(No0906S,(No0910S,No1202S))))),No305); (No1114S,((No0912S,No1103S),(((No304,((No0906S,(No0910S,No1202S)),No0913S)),((No0908S,No1206S),No306)),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No1007S,(No0909S,No1208S)),No0912S),No1103S),(No0908S,(((No0913S,No304),No306),(No1206S,((No1202S,No0910S),No0906S))))),No305); (No1114S,((No0912S,No1103S),((No0909S,(No1007S,No1208S)),((No306,(No304,No0913S)),((No0906S,(No1202S,No0910S)),(No1206S,No0908S))))),No305); (No1114S,(((No0908S,((No0906S,(No1202S,No0910S)),No1206S)),(No306,(No304,No0913S))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No305); (No1114S,((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),(No306,(No304,No0913S))),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No305); (No1114S,((No0912S,No1103S),((No1007S,(No1208S,No0909S)),(((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),(No0913S,(No306,No304))))),No305); ((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),(No306,((No1114S,No304),No0913S))),((No0912S,No1103S),(No0909S,(No1007S,No1208S))),No305); ((No304,(((No0906S,((No1202S,No0910S),No0913S)),(((No0912S,No1103S),(No1208S,(No0909S,No1007S))),(No1206S,No0908S))),No306)),No1114S,No305); (((No0912S,No1103S),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No306,(No0913S,No304)))),((No1007S,(No1208S,No0909S)),No1114S),No305); (((No1206S,No0908S),((No306,(No0913S,No304)),((No1202S,No0910S),No0906S))),(No1114S,((No1103S,No0912S),(No1007S,(No1208S,No0909S)))),No305); (No1114S,(((No0908S,((No306,(No0913S,No304)),((No1202S,No0910S),(No1206S,No0906S)))),(No0912S,No1103S)),(No1007S,(No1208S,No0909S))),No305); (No1114S,((No0908S,(((No306,(No0913S,No304)),((No1202S,No0910S),No1206S)),No0906S)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (((No0912S,No1103S),(No0909S,(No1007S,No1208S))),((No0908S,((No0906S,(No1202S,No0910S)),No1206S)),(No1114S,(No306,(No304,No0913S)))),No305); (No1114S,(((No0908S,(((No0906S,No0910S),No1202S),No1206S)),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),(No306,(No304,No0913S))),No305); (No1114S,((((No0910S,(No0906S,(No0908S,No1206S))),No1202S),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),(No304,(No0913S,No306))),No305); (No1114S,((No0912S,No1103S),((No0909S,(No1007S,No1208S)),((((No304,No0913S),No306),No0908S),(No1206S,((No1202S,No0910S),No0906S))))),No305); (((No0912S,No1103S),(No1208S,(No0909S,No1007S))),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(((No1114S,No304),No0913S),No306)),No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No1206S,((No1202S,No0910S),No0906S)),(((No304,No0913S),No306),No0908S))),No1114S,No305); (((No0912S,No1103S),((No0909S,(No1007S,No1208S)),((No306,((No0906S,(No1206S,(No1202S,No0910S))),No0908S)),(No304,No0913S)))),No1114S,No305); (((((No306,(No1103S,((No1202S,No0910S),No0913S))),((No0906S,(No1208S,(No0909S,No1007S))),(No0908S,No1206S))),No0912S),No304),No1114S,No305); ((((No306,((No0912S,No1103S),(No0908S,No1206S))),(No0906S,((No1202S,No0910S),No0913S))),No304),((No1007S,(No1208S,No0909S)),No1114S),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No0913S,No304),No306),((No0906S,(No1202S,No0910S)),(No0908S,No1206S)))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),(((No0913S,No304),No306),(No0908S,((No1206S,No0906S),(No0910S,No1202S))))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No1103S,No0912S),(((No0913S,No304),No306),(No0908S,(No0906S,((No0910S,No1202S),No1206S)))))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(((No0906S,(No0910S,No1202S)),((No0913S,No304),No306)),(No0908S,No1206S))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(((No0906S,(No0910S,No1202S)),((No0913S,No304),No306)),(No0908S,No1206S))),No305); (No1114S,(((No1103S,No0912S),(No0909S,(No1007S,No1208S))),(((No0913S,No304),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S))))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((((No0913S,No304),No306),(((No0910S,No1202S),No0906S),No1206S)),No0908S)),No305); (No1114S,(((No1103S,No0912S),(No0909S,(No1007S,No1208S))),(((((No0913S,No304),No306),(No0910S,No1202S)),(No1206S,No0906S)),No0908S)),No305); (No1114S,(((No1103S,No0912S),(No0909S,(No1007S,No1208S))),((((No0913S,No304),No306),(No0906S,(No0910S,No1202S))),(No1206S,No0908S))),No305); (No1114S,(((No1103S,No0912S),(No0909S,(No1007S,No1208S))),((((No0913S,No304),No306),(No0906S,(No0910S,No1202S))),(No1206S,No0908S))),No305); (No1114S,(No304,(No0913S,(No306,(((No1206S,No0908S),(No0906S,(No0910S,No1202S))),((No1103S,No0912S),(No1007S,(No1208S,No0909S))))))),No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),((No1206S,((No0908S,No0906S),(No0910S,No1202S))),((No0913S,No304),No306))),No1114S,No305); ((No0912S,((((No0906S,(No0910S,No1202S)),((No1206S,No0908S),((No0913S,No304),No306))),(No0909S,(No1007S,No1208S))),No1103S)),No1114S,No305); (((No0906S,(((No1206S,No0908S),((No0910S,No1202S),(No0913S,No304))),No306)),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((No1103S,No0912S),((No1007S,(No1208S,No0909S)),(((No1202S,(No0906S,No0910S)),(No306,(No0913S,No304))),(No1206S,No0908S)))),No1114S,No305); (((No0909S,(No1007S,No1208S)),((((No0906S,(No0913S,(No0910S,No1202S))),(No306,No304)),(No1206S,No0908S)),(No1103S,No0912S))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No306,(No0913S,No304))),(No1206S,No0908S)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((((No0906S,(No0910S,No1202S)),No0912S),No1103S),(No0908S,No1206S)),(No306,(No0913S,No304))),(No1007S,(No1208S,No0909S))),No1114S,No305); (((((No306,(No0913S,No304)),((No0910S,No1202S),((No0908S,No1206S),No0906S))),No1103S),No0912S),((No0909S,(No1007S,No1208S)),No1114S),No305); (((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),(No306,(No0913S,No304))),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No304,No0913S)))),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No306,(No304,No0913S)))),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No304,No0913S)))),No1114S,No305); ((((No1208S,(No0909S,No1007S)),(No0912S,No1103S)),((((No0906S,(No0910S,No1202S)),No1206S),(No306,(No304,No0913S))),No0908S)),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No0906S,(No0910S,No1202S)),No1206S),((No306,(No304,No0913S)),No0908S))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(No306,((No304,No0913S),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))))),No1114S,No305); (((No0912S,No1103S),((((No304,No0913S),No306),(No0908S,No1206S)),((No0906S,(No0910S,No1202S)),(No1007S,(No1208S,No0909S))))),No1114S,No305); (((No0909S,(No1007S,No1208S)),(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No0910S,No1202S)))),(No0912S,No1103S))),No1114S,No305); (((((No304,No0913S),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S)))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No1114S,No305); (((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),((No304,No0913S),No306)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No1114S,No305); (No1114S,((((No0906S,(No0910S,No1202S)),((((No304,No0913S),No306),No0908S),(((No1208S,No1007S),No0909S),No1206S))),No1103S),No0912S),No305); ((No0909S,(No1208S,No1007S)),((No1103S,((No0908S,No0912S),((No0906S,(No0910S,No1202S)),No1206S))),(No1114S,((No304,No0913S),No306))),No305); (No1114S,((((No304,No0913S),No306),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),(No0912S,(No1103S,(No0909S,(No1208S,No1007S))))),No305); (No1114S,(((((No0906S,No1206S),(No1202S,No0910S)),(No0912S,(No1103S,(No1007S,(No0909S,No1208S))))),No0908S),((No304,No0913S),No306)),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((((No304,No0913S),No306),((No1202S,No0910S),No0906S)),(No0908S,No1206S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((((No304,No0913S),No306),((No1202S,No0910S),No0906S)),(No0908S,No1206S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((((No304,No0913S),No306),((No1202S,No0910S),No0906S)),(No0908S,No1206S))),No305); (((No1007S,(No0909S,No1208S)),No1114S),((No0912S,No1103S),(((No304,No0913S),No306),((No1206S,((No1202S,No0910S),No0906S)),No0908S))),No305); (No1114S,((No0912S,No1103S),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),((No1007S,(No0909S,No1208S)),((No304,No0913S),No306)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No304,No0913S),No306),(No0908S,(No0906S,(No1206S,(No1202S,No0910S)))))),No305); (No1114S,((((No1208S,No1007S),No0909S),(No0912S,No1103S)),(((No1206S,No0908S),No0906S),((No0910S,No1202S),((No304,No0913S),No306)))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(((No1206S,No0908S),(No0906S,(No0913S,(No0910S,No1202S)))),(No304,No306))),No305); (No1114S,((No0912S,No1103S),(No306,((No1007S,(No0909S,No1208S)),((No0908S,No304),(No1206S,(No0906S,((No0910S,No1202S),No0913S))))))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((((No0913S,No304),No306),(No0906S,(No0910S,No1202S))),(No1206S,No0908S))),No305); (No1114S,((No0912S,No1103S),((((No0913S,No304),No306),(((No0906S,(No0910S,No1202S)),No1206S),No0908S)),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((((No0913S,No304),No306),(((No0906S,(No0910S,No1202S)),No1206S),No0908S)),((No1208S,(No1007S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((((No0910S,No1202S),No0906S),(((No0913S,No304),No306),(No1206S,No0908S))),((No1208S,(No1007S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((((No0910S,No1202S),No0906S),(((No0913S,No304),No306),(No1206S,No0908S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((((No0910S,No1202S),No0906S),(((No0913S,No304),No306),(No1206S,No0908S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); ((No0908S,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(No1206S,((No0910S,No1202S),No0906S)))),(No1114S,((No0913S,No304),No306)),No305); (No1114S,(((No0912S,No1103S),((No1208S,No1007S),No0909S)),(((No304,No0913S),No306),((No1206S,No0908S),(No0906S,(No0910S,No1202S))))),No305); (No1114S,(((No0912S,No1103S),((No1208S,No1007S),No0909S)),(((No304,No0913S),No306),((No1206S,No0908S),(No0906S,(No0910S,No1202S))))),No305); (No1114S,(((No0912S,No1103S),((No1208S,No1007S),No0909S)),(((No304,No0913S),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No304,No0913S),No306),(No0908S,(((No0906S,No1202S),No1206S),No0910S)))),No305); (No1114S,((No0912S,No1103S),((((No304,No0913S),No306),(No0909S,(No1208S,No1007S))),(No0908S,((No0906S,(No1202S,No0910S)),No1206S)))),No305); ((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),((No1114S,(No304,No0913S)),No306)),(No1103S,((No0909S,(No1208S,No1007S)),No0912S)),No305); ((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),((No306,(No0913S,No304)),No1114S)),(No1103S,((No0909S,(No1208S,No1007S)),No0912S)),No305); (No1114S,((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),(No306,(No0913S,No304))),((No1208S,(No1007S,No0909S)),(No0912S,No1103S))),No305); (No1114S,(((No0906S,(No1206S,No0908S)),(No306,(((No1202S,No0910S),No0913S),No304))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,(((No0913S,No304),No306),(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(No0908S,(((No1202S,No0910S),No0906S),No1206S)))),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No1103S,No0912S),(No306,((No0908S,(No1206S,(No0906S,(No0913S,(No0910S,No1202S))))),No304)))),No305); (No1114S,((No306,((No0913S,No304),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),(No306,(No304,No0913S))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No0912S,No1103S),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No304,No0913S))))),No305); (No1114S,((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No304,No0913S))),(((No1208S,(No0909S,No1007S)),No0912S),No1103S)),No305); (No1114S,((((No1206S,((No0910S,No1202S),No0906S)),No0908S),(No306,(No304,No0913S))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((((No1206S,((No0910S,No1202S),No0906S)),No0908S),(No306,(No304,No0913S))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,(((No0906S,((No0910S,No1202S),((No304,No306),No0913S))),(No0908S,No1206S)),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No305); (No1114S,((((No304,No306),No0913S),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((No1208S,(No0909S,No1007S)),(No1103S,No0912S))),No305); (No1114S,(No304,(((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No306),No0913S)),No305); (No1114S,((((No0909S,(No1007S,No1208S)),No0912S),No1103S),((No306,((No0913S,No304),((No1202S,(No1206S,No0910S)),No0906S))),No0908S)),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No306,(No0913S,No304)),(((No1202S,No0910S),No0906S),(No0908S,No1206S)))),No305); (No1114S,((No0912S,(No1208S,(No0909S,(No1103S,No1007S)))),(((No306,(No0913S,No304)),(No1206S,((No1202S,No0910S),No0906S))),No0908S)),No305); (No1114S,(((No0912S,(No0909S,(No1007S,No1208S))),No1103S),((((No1202S,No0910S),No0906S),(No1206S,No0908S)),(No306,(No0913S,No304)))),No305); (No1114S,((No0912S,((((((No1202S,No0910S),No1206S),No0906S),((No0913S,No304),No0908S)),No306),(No1007S,(No1208S,No0909S)))),No1103S),No305); ((No0909S,((No1114S,No1007S),No1208S)),((No0912S,No1103S),((No306,(No0913S,No304)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S)))))),No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((No1206S,(No0906S,(No1202S,No0910S))),No0908S),(No306,(No0913S,No304)))),No1114S,No305); (((No1103S,(No0912S,(No1007S,(No0909S,No1208S)))),(((No306,(No304,No0913S)),((No0906S,(No0910S,No1202S)),No1206S)),No0908S)),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(((No0906S,(No0910S,No1202S)),No1206S),(No0908S,(No306,(No304,No0913S))))),(No0912S,No1103S)),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No304,No0913S))),((No0912S,No1103S),(No1208S,(No1007S,No0909S)))),No1114S,No305); (((No0912S,No1103S),((No0909S,(No1208S,No1007S)),((((No0906S,(No0910S,No1202S)),No1206S),No0908S),(No306,(No304,No0913S))))),No1114S,No305); ((((((No0906S,(No0913S,(No0910S,No1202S))),(No1206S,No0908S)),No306),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No304),No1114S,No305); (((No0912S,No1103S),((No0909S,(No1208S,No1007S)),(((No304,No306),(No1206S,No0908S)),(No0906S,(No0913S,(No0910S,No1202S)))))),No1114S,No305); (((((No0910S,(No0906S,No1202S)),(No1206S,No0908S)),((No304,No0913S),No306)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No1114S,No305); ((((No306,((((No0910S,No1202S),No1206S),No0906S),(No304,No0913S))),No0908S),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((No0912S,No1103S),(((No0909S,No1208S),No1007S),((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No304,No0913S),No306)))),No1114S,No305); (((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),(((No304,No0913S),No306),No1114S),No305); (((No1103S,(No0912S,(No1007S,(No0909S,No1208S)))),(((No306,(No304,No0913S)),((No0906S,(No0910S,No1202S)),No1206S)),No0908S)),No1114S,No305); ((No1103S,(No0912S,(No0909S,(No1208S,No1007S)))),((No306,(No1114S,(No304,No0913S))),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),No305); ((No1103S,(No0912S,((No0909S,(No1208S,No1007S)),((No1206S,(No306,(No304,No0913S))),((No0906S,(No0910S,No1202S)),No0908S))))),No1114S,No305); (((((No0908S,No1206S),(No306,(No304,No0913S))),(No0906S,(No0910S,No1202S))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No1114S,No305); ((((No306,((No304,No0913S),No0908S)),((No1206S,No0906S),(No0910S,No1202S))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No1114S,No305); ((((No1103S,No0912S),(No1208S,(No1007S,No0909S))),(((No1206S,(No306,(No304,No0913S))),((No0908S,No1202S),No0906S)),No0910S)),No1114S,No305); ((No304,((No306,(((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),((No1206S,No0908S),((No0910S,No1202S),No0906S)))),No0913S)),No1114S,No305); (((No1103S,(No0912S,(No0909S,(No1208S,No1007S)))),(No0908S,(((No0910S,No1202S),No0906S),No1206S))),(No1114S,((No0913S,No304),No306)),No305); (No1114S,(((No0908S,(((No0910S,No1202S),No0906S),No1206S)),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),((No0913S,No304),No306)),No305); (No1114S,((((No0908S,((No0913S,(No0910S,No1202S)),No306)),(No1206S,(((No1208S,(No1007S,No0909S)),No0912S),No1103S))),No0906S),No304),No305); (No1114S,(((No0908S,No1206S),((No1202S,No0910S),((No306,(No304,No0913S)),No0906S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); ((No0906S,(((No0908S,No1206S),(No1202S,No0910S)),(No306,(No304,No0913S)))),((No1114S,(No1007S,(No0909S,No1208S))),(No0912S,No1103S)),No305); (No1114S,((((No1007S,No0909S),No1208S),(No0912S,No1103S)),((No0908S,(No1206S,(No0906S,(No0913S,(No1202S,No0910S))))),(No306,No304))),No305); (No1114S,((((No1007S,(No0909S,No1208S)),(No0912S,No0908S)),((No1206S,(No0906S,(No1202S,No0910S))),No1103S)),(No306,(No0913S,No304))),No305); (((No0908S,(No306,(No1114S,(No0913S,No304)))),(No1206S,(No0906S,(No1202S,No0910S)))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),No305); ((((No0908S,No1206S),(((No306,(No0913S,No304)),No0906S),(No1202S,No0910S))),(((No0909S,(No1208S,No1007S)),No0912S),No1103S)),No1114S,No305); (((((((No0908S,No1206S),(No0906S,(No1202S,No0910S))),(No306,(No0913S,No304))),(No1007S,(No0909S,No1208S))),No0912S),No1103S),No1114S,No305); (((((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),((No0913S,No304),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (No1114S,((((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No0913S,No304),No306))),(No1208S,(No1007S,No0909S))),(No0912S,No1103S)),No305); (No1114S,(((No0912S,No1103S),(((No0913S,No304),No306),(No0908S,(No1206S,((No1202S,No0906S),No0910S))))),(No1007S,(No0909S,No1208S))),No305); (((((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),((No0912S,No1103S),((No1208S,No1007S),No0909S))),(No306,(No0913S,No304))),No1114S,No305); ((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),((No306,(No1114S,(No0913S,No304))),((No0906S,(No1202S,No0910S)),(No0908S,No1206S))),No305); (((No1007S,(No0909S,No1208S)),(((No0913S,No306),No304),((No0912S,(No0906S,(No1202S,No0910S))),(No1103S,(No0908S,No1206S))))),No1114S,No305); (No1114S,((No0912S,No1103S),((No1007S,(No0909S,No1208S)),(((No0908S,No1206S),(No0906S,(No1202S,No0910S))),((No0913S,No304),No306)))),No305); (No1114S,((No304,No306),((((No0912S,No1103S),(No0909S,(No1208S,No1007S))),No0908S),(No1206S,(No0906S,(No0913S,(No1202S,No0910S)))))),No305); (No1114S,(No304,(No306,((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),No0908S),(No1206S,(No0906S,(No0913S,(No1202S,No0910S))))))),No305); ((((No0912S,No1103S),(No0909S,(No1208S,No1007S))),(((No0913S,No304),No306),(No0908S,(No0906S,((No1202S,No0910S),No1206S))))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(No0908S,(((No1206S,No0906S),(No0910S,No1202S)),((No0913S,No304),No306)))),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1208S,No1007S))),(((No0906S,(No0910S,No1202S)),((No0913S,No304),No306)),(No0908S,No1206S))),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1208S,No1007S))),(((No0913S,No304),No306),(No0908S,(No1206S,(No0906S,(No0910S,No1202S)))))),No1114S,No305); (((((No0909S,No1208S),No1007S),(No0912S,No1103S)),((No306,(No0913S,No304)),((No0906S,(No1202S,No0910S)),(No0908S,No1206S)))),No1114S,No305); (((No306,(No0913S,No304)),(((No1202S,No0910S),((((No0909S,No1208S),No1007S),(No0912S,No1103S)),(No0908S,No1206S))),No0906S)),No1114S,No305); (((No0909S,(No1208S,No1007S)),(((No306,(No0913S,No304)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),(No0912S,No1103S))),No1114S,No305); ((No1114S,(No306,(No0913S,No304))),(((No1206S,(No0906S,(No1202S,No0910S))),No0908S),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No306,(No0913S,No304)))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No306,(No0913S,No304)))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No306,(No0913S,No304)))),No1114S,No305); ((((No0912S,No1103S),(No1208S,(No1007S,No0909S))),((No0906S,(No1202S,No0910S)),((No1206S,No0908S),(No304,(No306,No0913S))))),No1114S,No305); ((No304,((((No0906S,((No0912S,No1103S),((No1007S,No0909S),No1208S))),(No1206S,No0908S)),No306),((No1202S,No0910S),No0913S))),No1114S,No305); (((((No0909S,No1208S),No1007S),((((No0906S,(No1202S,No0910S)),No1206S),No0908S),(No306,(No304,No0913S)))),(No0912S,No1103S)),No1114S,No305); (((((No0913S,No304),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))),(((No1007S,No1208S),No0909S),(No0912S,No1103S))),No1114S,No305); (((((No0913S,No304),No306),(No0908S,(No1206S,(No1202S,(No0906S,No0910S))))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((((No0913S,No304),No306),(No0908S,(No1206S,(No1202S,(No0906S,No0910S))))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((((No1206S,No0908S),(No0906S,(No1202S,No0910S))),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((((No1206S,No0908S),(No0906S,(No1202S,No0910S))),((No0913S,No304),No306)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((No0913S,No304),No306),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((No1208S,(No0909S,No1007S)),((No0912S,No1103S),(((No0913S,No304),No306),((No0906S,(No1202S,No0910S)),(No0908S,No1206S))))),No1114S,No305); (((No1007S,(No1208S,No0909S)),((No0912S,No1103S),((No0913S,No304),(No306,(No0908S,(No1206S,(No0906S,(No1202S,No0910S)))))))),No1114S,No305); (((No1208S,(No0909S,No1007S)),((No0912S,No1103S),(((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),((No0913S,No304),No306)))),No1114S,No305); ((No1114S,((No0912S,No1103S),(No0908S,(((No0913S,No304),No306),(No1206S,(No0906S,(No1202S,No0910S))))))),(No1007S,(No0909S,No1208S)),No305); (((((No0913S,No304),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))),(((No1007S,No1208S),No0909S),(No0912S,No1103S))),No1114S,No305); ((((((No0913S,No304),No306),((No0910S,No1202S),(No1206S,No0908S))),No0906S),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); ((((((No0913S,No304),No306),((No0910S,No1202S),(No1206S,No0908S))),No0906S),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),No1206S),(No0908S,((No0913S,No304),No306))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((No0913S,(No306,(((No0906S,(No0910S,No1202S)),No1206S),(((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),No0908S)))),No304),No1114S,No305); (((No0912S,No1103S),(No1206S,((No0906S,No0908S),((No0910S,No1202S),((No304,No0913S),No306))))),(No1114S,(No1007S,(No1208S,No0909S))),No305); (No1114S,(((No0912S,No1103S),(No0909S,(No1007S,No1208S))),(((No304,No0913S),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No305); (No1114S,(((No0912S,No1103S),(No0909S,(No1007S,No1208S))),(((No304,No0913S),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No305); (No1114S,(((No0912S,No1103S),(No0909S,(No1007S,No1208S))),(((No304,No0913S),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((((No304,No0913S),No306),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),(No0912S,No1103S))),No305); (No1114S,((No1103S,(No0912S,(No1007S,(No0909S,No1208S)))),((((No304,No0913S),No306),(No1206S,No0908S)),(No0906S,(No0910S,No1202S)))),No305); (No1114S,(No1103S,(No0912S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No0910S,No1202S)))),(No0909S,(No1208S,No1007S))))),No305); (No1114S,((((No0909S,No1208S),No1007S),(No1103S,No0912S)),(((No304,No0913S),(No306,No0908S)),(No1206S,(No0906S,(No0910S,No1202S))))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),((No0906S,(No0910S,No1202S)),(((No304,No0913S),No306),(No0908S,No1206S)))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),((No0906S,(No0910S,No1202S)),(((No304,No0913S),No306),(No0908S,No1206S)))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),((No0906S,((No0910S,No1202S),(No0908S,No1206S))),((No304,No0913S),No306))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(No306,((((No0910S,No1202S),(No304,No0913S)),No0906S),(No0908S,No1206S)))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(((No0908S,No1206S),((No1202S,No0910S),No0906S)),(No306,(No304,No0913S)))),No305); (((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(No1114S,((No1206S,((No1202S,No0910S),No0906S)),(No306,(No0908S,(No304,No0913S))))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((((No1206S,((No1202S,No0910S),No0906S)),(No306,(No304,No0913S))),No0908S),(No0912S,No1103S))),No305); (No1114S,((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),((No0913S,No304),No306)),(No1103S,(No0912S,((No1208S,No0909S),No1007S)))),No305); (No1114S,((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),((No0913S,No304),No306)),(No1103S,(No0912S,((No1208S,No0909S),No1007S)))),No305); (No1114S,((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306)),(No1103S,(No0912S,(No0909S,(No1007S,No1208S))))),No305); (No1114S,((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306)),(No1103S,(No0912S,(No0909S,(No1007S,No1208S))))),No305); (((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No1114S,(No0913S,(No304,No306)))),(No1103S,(No0912S,(No1208S,(No0909S,No1007S)))),No305); (No1114S,((No306,((((No0909S,(No1007S,No1208S)),(No1103S,No0912S)),(No1206S,No0908S)),(No0906S,(No0913S,(No0910S,No1202S))))),No304),No305); ((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(((No306,((No0913S,No304),No1114S)),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),No305); ((((((No0913S,No306),(No0906S,(No1202S,No0910S))),(No0908S,((No1007S,(No1208S,No0909S)),(No0912S,No1103S)))),No1206S),No304),No1114S,No305); (((No0908S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No0913S,No306),(No1206S,(No0906S,(No1202S,No0910S)))))),No304),No1114S,No305); (((((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),((No304,No0913S),No306)),(((No0909S,(No1007S,No1208S)),No0912S),No1103S)),No1114S,No305); (No1114S,((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),((No0913S,No304),No306)),(No1103S,(No0912S,(No0909S,(No1007S,No1208S))))),No305); (No1114S,(((((No0906S,(No0910S,No1202S)),((No0908S,No1206S),(No0913S,No304))),No306),(No1208S,(No0909S,No1007S))),(No1103S,No0912S)),No305); (No1114S,(((No0908S,(((No1206S,No0906S),(No0910S,No1202S)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S)))),No306),(No0913S,No304)),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No306,(No0913S,No304))),((No1208S,(No0909S,No1007S)),(No1103S,No0912S))),No305); (No1114S,((No0906S,((No1206S,No0908S),((No306,(No0913S,No304)),(No0910S,No1202S)))),((No1103S,No0912S),((No1208S,No1007S),No0909S))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((((No0906S,(No0910S,No1202S)),No1206S),((No306,(No0913S,No304)),No0908S)),(No0912S,No1103S))),No305); (No1114S,((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No0913S,No304))),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No305); (No1114S,((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No0913S,No304))),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No305); (No1114S,((No306,(No0913S,No304)),((((No0906S,No1206S),(No1202S,No0910S)),No0908S),((No1208S,(No1007S,No0909S)),(No1103S,No0912S)))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),(((No306,(No0913S,No304)),((No1202S,No0910S),No0906S)),(No0908S,No1206S))),No305); (((((((No304,No0913S),No0908S),(No306,((No1202S,No0910S),(No1206S,No0906S)))),(No0909S,(No1208S,No1007S))),No1103S),No0912S),No1114S,No305); (((No1007S,(No0909S,No1208S)),((No1103S,No0912S),((((No0906S,(No1206S,No0910S)),No1202S),((No306,No304),No0913S)),No0908S))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No306,(No304,No0913S))),(No1206S,No0908S)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((No0906S,((No0910S,No1202S),No1206S)),(No306,(No304,No0913S))),No0908S),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((No0906S,((No0910S,No1202S),No1206S)),(No306,(No304,No0913S))),No0908S),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((No306,(No304,No0913S)),(((No0908S,(No0906S,(No0910S,No1202S))),No1206S),((No1007S,(No0909S,No1208S)),(No0912S,No1103S)))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((No0912S,No1103S),((No306,((No0906S,(No0913S,(No0910S,No1202S))),(No304,No0908S))),No1206S))),No1114S,No305); (((No304,No306),(((((No1007S,(No0909S,No1208S)),No0912S),No1103S),(No0906S,(No0913S,(No0910S,No1202S)))),(No0908S,No1206S))),No1114S,No305); (((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),((No306,(No0913S,No304)),((No0906S,(No1206S,(No0910S,No1202S))),No0908S))),No1114S,No305); (((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),((No306,(No0913S,No304)),((No1206S,((No0910S,No1202S),No0906S)),No0908S))),No1114S,No305); (No0906S,(((No0912S,((No1208S,(No1007S,No0909S)),No1103S)),(No306,(No1114S,(No304,No0913S)))),((No1206S,No0908S),(No1202S,No0910S))),No305); ((((No0912S,No1103S),((No306,(No304,No0913S)),((No1206S,No0908S),((No1202S,No0910S),No0906S)))),(No1208S,(No1007S,No0909S))),No1114S,No305); (((No0912S,No1103S),(((No0908S,((No1202S,No0910S),(No1206S,No0906S))),(No306,(No304,No0913S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); (((((No0913S,(No1202S,No0910S)),((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(No0908S,No1206S)),No0906S)),No306),No304),No1114S,No305); (((No0913S,(No306,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(((No0906S,(No1202S,No0910S)),No1206S),No0908S)))),No304),No1114S,No305); (((No0912S,No1103S),((((No0910S,(No0906S,No1202S)),(No0908S,No1206S)),(No306,(No0913S,No304))),(No0909S,(No1208S,No1007S)))),No1114S,No305); ((((((No1206S,(No1202S,No0910S)),No0906S),No0908S),((No306,No304),No0913S)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((((((No1202S,No0910S),No1206S),No0906S),No306),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No0908S),No0913S),No304),No1114S,No305); (((No0913S,No304),(((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(((No1202S,No0910S),No1206S),No0906S)),No0908S),No306)),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))),No0908S)),No1114S,No305); (No1114S,((No1103S,((No1007S,(No1208S,No0909S)),No0912S)),(((No304,No0913S),No306),((No1206S,(No0906S,(No1202S,No0910S))),No0908S))),No305); ((No1114S,((No304,No0913S),No306)),(((No1206S,(No0906S,(No1202S,No0910S))),No0908S),(No0912S,(No1103S,(No1007S,(No1208S,No0909S))))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((((No306,No0908S),(No1206S,(No0906S,(No0913S,(No0910S,No1202S))))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No304),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No306,No304),((No0906S,(No0913S,(No0910S,No1202S))),(No0908S,No1206S)))),No305); (No1114S,((((No1208S,(No0909S,No1007S)),No0912S),No1103S),((No306,No304),(No0908S,(No1206S,(No0906S,(No0913S,(No0910S,No1202S))))))),No305); (((No0908S,(((No0910S,No1202S),No0906S),No1206S)),(No306,(No0913S,(No1114S,No304)))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),No305); ((((No0908S,(((No0910S,No1202S),No0906S),No1206S)),(No306,(No0913S,No304))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); ((((((No0908S,No1206S),((No0906S,(No0913S,(No1202S,No0910S))),No306)),(No1103S,No0912S)),((No0909S,No1007S),No1208S)),No304),No1114S,No305); (((No0906S,((((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),(No0910S,(No0908S,No1206S))),No1202S)),(No306,(No304,No0913S))),No1114S,No305); ((((((No0906S,No1206S),(No0910S,No1202S)),(No306,(No304,No0913S))),No0908S),((No1208S,(No0909S,No1007S)),(No1103S,No0912S))),No1114S,No305); (((No306,(No304,No0913S)),((No1206S,((No0906S,No0908S),(No1103S,((No1202S,(No1007S,(No1208S,No0909S))),No0910S)))),No0912S)),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((No1206S,No0908S),(No0906S,(No0910S,No1202S))),(No306,(No304,No0913S)))),No1114S,No305); (((No304,No0913S),((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))),No306)),No1114S,No305); ((((No0912S,No1103S),((No0909S,No1208S),No1007S)),((No1206S,(No0906S,(No0910S,No1202S))),(No0908S,(No306,(No0913S,No304))))),No1114S,No305); ((No304,(((No0906S,(((No0910S,No1202S),((No0912S,No1103S),((No0909S,No1208S),No1007S))),(No0908S,No1206S))),No306),No0913S)),No1114S,No305); (((No0912S,No1103S),((No0909S,(No1208S,No1007S)),(((No0906S,No1206S),((No0913S,No1202S),No0910S)),(No0908S,(No306,No304))))),No1114S,No305); ((((No0908S,((No0913S,No304),(No0909S,(No1208S,No1007S)))),(No1206S,(No0906S,(No0910S,No1202S)))),No306),((No1103S,No1114S),No0912S),No305); ((((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((No306,(No0913S,No304)),(((No1206S,No0906S),(No1202S,No0910S)),No0908S))),No1114S,No305); ((((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((No306,(No0913S,No304)),(((No1206S,No0906S),(No1202S,No0910S)),No0908S))),No1114S,No305); ((((No0908S,No1206S),((No1103S,((No1202S,No0910S),No0906S)),(No0912S,(No306,(No0913S,No304))))),(No1007S,(No1208S,No0909S))),No1114S,No305); (((No0908S,((((No1202S,No0910S),No0906S),No1206S),(No306,(No0913S,No304)))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No1114S,No305); (((No0908S,((((No1202S,No0910S),No0906S),No1206S),(No306,(No0913S,No304)))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No1114S,No305); ((No304,((No306,((No0908S,No1206S),((No0912S,No1103S),(No1007S,(No1208S,No0909S))))),((No1202S,No0910S),(No0913S,No0906S)))),No1114S,No305); ((No304,(No306,((((No0908S,No1206S),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),(No0906S,(No1202S,No0910S))),No0913S))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No0908S,No1206S),((((No1202S,No0910S),No0906S),No0913S),(No304,No306)))),No1114S,No305); (((No1007S,(No1208S,No0909S)),(((No0906S,(No1202S,No0910S)),((No0912S,No1103S),(No0908S,No1206S))),((No0913S,No304),No306))),No1114S,No305); (((No1007S,(No1208S,No0909S)),((No0912S,No1103S),(((No0913S,No304),No306),((No0906S,(No1202S,No0910S)),(No0908S,No1206S))))),No1114S,No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(No306,((No0906S,(No1206S,((No304,No0913S),No0908S))),(No0910S,No1202S)))),No305); (No1114S,(No304,(((((No0906S,(No0913S,(No1202S,No0910S))),No1206S),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No0908S),No306)),No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No0906S,(No1202S,No0910S)),((No0908S,No1206S),(No306,(No0913S,No304))))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No0906S,((No1202S,No0910S),No1206S)),(No0908S,(No306,(No0913S,No304))))),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1007S,No1208S))),((No306,(No0913S,No304)),((No0910S,(No0906S,No1202S)),(No1206S,No0908S)))),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1007S,No1208S))),((No306,(No0913S,No304)),(No0908S,((No0906S,(No1202S,No0910S)),No1206S)))),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1007S,No1208S))),((No306,(No0913S,No304)),(No0908S,((No0906S,(No1202S,No0910S)),No1206S)))),No1114S,No305); ((No1103S,(((No0909S,(No1007S,No1208S)),((No0908S,(No0906S,((No1202S,No0910S),No1206S))),(No306,(No0913S,No304)))),No0912S)),No1114S,No305); ((((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No306,(No0913S,No304))),(No1103S,(No0912S,(No1007S,(No1208S,No0909S))))),No1114S,No305); (((((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),(No306,(No0913S,No304))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No1114S,No305); (No1114S,(((No0912S,No1103S),(No0909S,(No1007S,No1208S))),(((No304,No0913S),No306),(((No0910S,No1202S),(No0908S,No1206S)),No0906S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No304,No0913S),No306),((((No0910S,No1202S),No1206S),No0906S),No0908S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No304,No0913S),No306),((((No0910S,No1202S),No1206S),No0906S),No0908S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No0913S,(No306,No304)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No305); (No1114S,(((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306)),(No1007S,(No1208S,No0909S))),(No0912S,No1103S)),No305); (No1114S,((((No0906S,(No0910S,No1202S)),No1206S),(No0908S,((No0913S,No304),No306))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),(((No304,(No306,No0913S)),((No0906S,((No0910S,No1202S),No1206S)),No0908S)),(No1007S,(No1208S,No0909S)))),No305); (No1114S,((No1007S,(No1208S,No0909S)),((No0912S,No1103S),(No0908S,((No306,(No0913S,No304)),(No0906S,((No0910S,No1202S),No1206S)))))),No305); (No1114S,((No0912S,No1103S),(((No0908S,(((No0906S,No0910S),No1202S),No1206S)),((No304,No0913S),No306)),(No0909S,(No1007S,No1208S)))),No305); (No1114S,(((No0908S,((No0906S,(No0910S,No1202S)),No1206S)),((No304,No0913S),No306)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); ((No1208S,(No1007S,No0909S)),((((No306,No0913S),(No1114S,No304)),((No0908S,No1206S),((No1202S,No0910S),No0906S))),(No1103S,No0912S)),No305); ((((No306,(No304,No0913S)),(No0908S,((No1007S,(No0909S,No1208S)),(No1206S,((No1202S,No0910S),No0906S))))),(No1103S,No0912S)),No1114S,No305); ((((No1206S,((No1202S,No0910S),No0906S)),((No306,(No304,No0913S)),No0908S)),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No1114S,No305); (((No1103S,No0912S),((((No306,(No304,No0913S)),No0908S),(No1206S,((No1202S,No0910S),No0906S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); (((((No306,(No304,No0913S)),No0908S),(No1206S,((No1202S,No0910S),No0906S))),(((No1007S,No1208S),No0909S),(No1103S,No0912S))),No1114S,No305); (((((No306,(No304,No0913S)),No0908S),(No1206S,((No1202S,No0910S),No0906S))),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No1114S,No305); (((((No306,(No304,No0913S)),No0908S),(No1206S,((No1202S,No0910S),No0906S))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No1114S,No305); (((((No306,(No304,No0913S)),No0908S),(No1206S,((No1202S,No0910S),No0906S))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No1114S,No305); (((((No306,(No304,No0913S)),((No1202S,No0910S),No0906S)),(No0908S,No1206S)),(((No0909S,(No1007S,No1208S)),No0912S),No1103S)),No1114S,No305); (((((No306,(No304,No0913S)),((No1202S,No0910S),No0906S)),(No0908S,No1206S)),(((No0909S,(No1007S,No1208S)),No0912S),No1103S)),No1114S,No305); (((No0908S,((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),No1206S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No1114S,No305); ((No304,(No306,((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),(No0908S,No1206S)),((No0906S,(No0910S,No1202S)),No0913S)))),No1114S,No305); (((No1103S,No0912S),(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No306,No0913S),No304)),(No1208S,(No1007S,No0909S)))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((No0912S,No1103S),(((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No304,No0913S),No306)))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No304,No0913S),No306)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No1114S,No305); (((No0912S,No1103S),((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No304,No0913S),No306)),(No0909S,(No1208S,No1007S)))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No304,No0913S),No306)),((No1208S,(No1007S,No0909S)),(No0912S,No1103S))),No1114S,No305); (No1114S,(((((No0906S,(No0910S,No1202S)),(No0908S,((No304,No0913S),No306))),No1206S),(No1007S,(No0909S,No1208S))),(No0912S,No1103S)),No305); (No1114S,((((No304,No0913S),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S)))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); ((((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No1114S,No305); ((((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No1114S,No305); ((((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No1114S,No305); (((No1114S,(No306,(No0913S,No304))),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),No305); ((((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No1206S,No0908S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No1114S,No305); (((No1103S,No0912S),(((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No1206S,No0908S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); ((((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No1206S,No0908S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(((No1206S,No0908S),(No306,(No0913S,(No0906S,(No0910S,No1202S))))),No304)),No1114S,No305); ((((No1103S,((No304,No306),(No0908S,(No1206S,(No0906S,((No0910S,No1202S),No0913S)))))),No0912S),(No1007S,(No0909S,No1208S))),No1114S,No305); ((((((No0913S,No304),(No0906S,(No0910S,No1202S))),(No306,(No0908S,No1206S))),(No1007S,(No0909S,No1208S))),(No0912S,No1103S)),No1114S,No305); (No0912S,(((((No0908S,No1206S),(No0906S,(No0913S,(No0910S,No1202S)))),No304),No306),((No1114S,(No1007S,(No0909S,No1208S))),No1103S)),No305); (No1114S,(((No0908S,((No0906S,No1206S),(No0910S,No1202S))),((No0913S,No304),No306)),((No0912S,No1103S),(No1208S,(No1007S,No0909S)))),No305); (No1114S,((((No0908S,No1206S),((No0913S,No304),No306)),((No0910S,No1202S),No0906S)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No0908S,No1206S),((No0913S,No304),No306)),((No0910S,No1202S),No0906S)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No0908S,No1206S),((No0913S,No304),No306)),((No0910S,No1202S),No0906S)),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((No0912S,No1103S),((No1208S,(No1007S,No0909S)),((((No0910S,No1202S),No0906S),((No0913S,No304),No306)),(No0908S,No1206S)))),No305); (No0908S,(((No1114S,((No0913S,No304),No306)),(No1103S,((No0909S,(No1208S,No1007S)),No0912S))),(((No0910S,No1202S),No0906S),No1206S)),No305); (No1114S,((((((No0910S,No1202S),No0906S),No1206S),No0908S),((No0913S,No304),No306)),((No1103S,No0912S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((((No0906S,((No0909S,(No1208S,No1007S)),No0908S)),(No1202S,(No1206S,No0910S))),((No0913S,No304),No306)),(No1103S,No0912S)),No305); (No1114S,(No0912S,(((No0909S,(No1208S,No1007S)),((((No0906S,(No0910S,No1202S)),No1206S),No0908S),((No0913S,No304),No306))),No1103S)),No305); ((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No306,((No1114S,No304),No0913S)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(No0908S,((No1206S,(No306,(No304,No0913S))),(No0906S,(No1202S,No0910S))))),No1114S,No305); (((No0909S,(No1007S,No1208S)),((No0912S,No1103S),(((No0908S,No1206S),(No306,(No304,No0913S))),(No0906S,(No1202S,No0910S))))),No1114S,No305); ((((No306,No0913S),(((No1206S,No0906S),(No1202S,No0910S)),(No0908S,((No0909S,(No1007S,No1208S)),(No0912S,No1103S))))),No304),No1114S,No305); ((((No1103S,No0912S),((No0909S,No1007S),No1208S)),((No306,(No304,No0913S)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S)))))),No1114S,No305); ((((No1103S,No0912S),(No0909S,(No1007S,No1208S))),(((No0910S,(No306,(No304,No0913S))),(No0906S,(No0908S,No1206S))),No1202S)),No1114S,No305); (((No1103S,No0912S),((No0909S,(No1007S,No1208S)),(((((No0910S,No1202S),No0906S),No1206S),No0908S),(No306,(No304,No0913S))))),No1114S,No305); (((No1114S,(No306,(No304,No0913S))),(((No0910S,No1202S),No0906S),(No0908S,No1206S))),((No1103S,No0912S),(No1208S,(No0909S,No1007S))),No305); (((((No0910S,No1202S),No0906S),(No0908S,(No1206S,(No306,(No304,No0913S))))),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); ((((((No1206S,((No0910S,No1202S),No0906S)),No0908S),(No304,No0913S)),No306),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); ((((((No0913S,No304),No306),(No1206S,(No0906S,(No1202S,No0910S)))),No0908S),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((((No1206S,No0908S),((No0913S,No304),No306)),((No1202S,No0910S),No0906S)),((No1103S,No0912S),((No1007S,No1208S),No0909S))),No1114S,No305); (((No1007S,No1208S),(No0909S,((No0910S,((No1202S,((No0913S,No304),No306)),(No0906S,(No1206S,No0908S)))),(No1103S,No0912S)))),No1114S,No305); (No1114S,((((No1206S,No0908S),((No0906S,(No0913S,(No0910S,No1202S))),No304)),No306),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No305); (No1114S,(No1103S,(No0912S,(((No0906S,(No0913S,(No0910S,No1202S))),(No304,No306)),((No1206S,No0908S),(No0909S,(No1208S,No1007S)))))),No305); (No1114S,((((No0913S,No304),No306),((No1206S,No0908S),(No0906S,(No0910S,No1202S)))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No305); (((((((No1206S,No0906S),(No0910S,No1202S)),No1103S),(((No0913S,No304),No306),No0908S)),No0912S),(No0909S,(No1208S,No1007S))),No1114S,No305); ((((((No1206S,No0906S),(No0910S,No1202S)),((No0913S,No304),No306)),No0908S),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No0913S,No304),No306)),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No1114S,No305); (((((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No0913S,No304),No306)),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No1114S,No305); ((((No1103S,No0912S),(No1007S,(No0909S,No1208S))),(((No0908S,No1206S),(No304,No306)),(No0906S,((No1202S,No0910S),No0913S)))),No1114S,No305); ((((No304,No306),((No1103S,No0912S),((No1208S,(No1114S,No1007S)),No0909S))),(No0906S,((No1202S,No0910S),No0913S))),(No0908S,No1206S),No305); ((No304,((No0908S,((((No1208S,No1007S),No0909S),No0912S),No1103S)),((No1206S,(No0906S,(No1202S,No0910S))),(No306,No0913S)))),No1114S,No305); (((No1007S,(No0909S,No1208S)),(No1103S,(((No0908S,((No0906S,(No1202S,No0910S)),No1206S)),(No306,(No304,No0913S))),No0912S))),No1114S,No305); ((((No1206S,No0908S),(No306,(No304,((No0906S,(No1202S,No0910S)),No0913S)))),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No1114S,No305); ((((((No0906S,(No1202S,No0910S)),No1206S),No0908S),(No306,(No304,No0913S))),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No1114S,No305); (((No0912S,No1103S),((No1208S,(No1007S,No0909S)),((((No0906S,(No1202S,No0910S)),No1206S),No0908S),(No306,(No304,No0913S))))),No1114S,No305); ((((((No0906S,(No1202S,No0910S)),No1206S),No0908S),((No0913S,No304),No306)),(No0912S,No1103S)),(No1114S,(No1007S,(No0909S,No1208S))),No305); (No1114S,((((No0909S,No1208S),No1007S),(No1103S,No0912S)),((((No0906S,(No1202S,No0910S)),No1206S),No0908S),((No0913S,No304),No306))),No305); (No1114S,((No0908S,((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),(((No0906S,(No1202S,No0910S)),No1206S),((No0913S,No304),No306))),No305); ((No304,(((No0908S,((No0906S,(No1202S,No0910S)),No1206S)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),(No306,No0913S))),No1114S,No305); (((((No0909S,(No1007S,No1208S)),No0912S),No1103S),((No0908S,(No306,(No304,No0913S))),((No0906S,(No1202S,No0910S)),No1206S))),No1114S,No305); (((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No0908S,(No0913S,(No306,No304))),((No0906S,(No1202S,No0910S)),No1206S))),No1114S,No305); ((No1103S,(((No304,(No306,(No0908S,((No0906S,(No0913S,(No1202S,No0910S))),No1206S)))),(No1007S,(No1208S,No0909S))),No0912S)),No1114S,No305); ((((No1103S,((No1007S,(No1208S,No0909S)),No0912S)),((No0906S,(No0913S,(No1202S,No0910S))),(No1206S,No0908S))),(No304,No306)),No1114S,No305); (((((((No1007S,No1208S),No0909S),No0912S),No1103S),(((No0908S,((No0910S,(No0913S,No1202S)),No0906S)),No306),No1206S)),No1114S),No304,No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,(((No0913S,No304),No306),((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(No0908S,No1206S)),(No0910S,(No1202S,No0906S)))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((((No0913S,No304),No306),(No0908S,No1206S)),(No0906S,(No0910S,No1202S)))),No305); (No1114S,((((No0908S,No1206S),(((No0910S,No1202S),No0913S),No0906S)),(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),No306)),No304),No305); (No1114S,((No1103S,No0912S),((No0908S,((No1206S,((No0910S,No1202S),No0906S)),((No304,No0913S),No306))),((No1208S,No0909S),No1007S))),No305); (No1114S,((No1103S,No0912S),(((((No0910S,No1202S),No0906S),(No0908S,No1206S)),((No304,No0913S),No306)),((No1208S,No0909S),No1007S))),No305); (No1114S,(((((No0906S,No1206S),(No1202S,No0910S)),((No304,No0913S),No306)),No0908S),(((No0909S,No1208S),No1007S),(No1103S,No0912S))),No305); (No1114S,((No1103S,No0912S),((((No1206S,((No1202S,No0910S),No0906S)),((No304,No0913S),No306)),No0908S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((((No304,No0913S),No306),(No0908S,(No1206S,((No1202S,No0910S),No0906S)))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No305); (No1114S,((((No0908S,No1206S),((((No0913S,No0906S),No0910S),No1202S),No306)),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No304),No305); (No1114S,((No1103S,No0912S),((((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))),((No1208S,(No1007S,No0909S)),(No1103S,No0912S))),No305); (No1114S,((No0909S,(No1208S,No1007S)),((No1103S,No0912S),(((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))))),No305); (No1114S,((No1103S,No0912S),(((((No0913S,No304),((No0910S,No1202S),No0906S)),(No0908S,No1206S)),No306),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((No0908S,((No1206S,((No0910S,No1202S),No0906S)),(No306,(No304,No0913S)))),(No1103S,((No0909S,(No1007S,No1208S)),No0912S))),No305); (No1114S,(((((No0910S,No1202S),No0906S),(No0908S,No1206S)),(No306,(No304,No0913S))),(No1103S,((No1007S,(No1208S,No0909S)),No0912S))),No305); (((((No0910S,No1202S),No0906S),(No0908S,No1206S)),(No306,(No1114S,(No304,No0913S)))),(No1103S,((No0909S,(No1007S,No1208S)),No0912S)),No305); (((No1007S,(No1208S,No0909S)),((No0912S,No1103S),(((No306,No304),No0913S),((No1206S,((No0906S,No0910S),No1202S)),No0908S)))),No1114S,No305); (((No1007S,(No1208S,No0909S)),(No0912S,(No1103S,(No0906S,((No1202S,((No306,(No304,No0913S)),No0910S)),(No1206S,No0908S)))))),No1114S,No305); (((((((No1206S,No0908S),No0906S),(No306,(No304,No0913S))),(No0910S,No1202S)),(No1007S,(No1208S,No0909S))),(No1103S,No0912S)),No1114S,No305); (((No1103S,No0912S),(No0909S,(No1007S,No1208S))),((No0906S,(No1206S,(No0910S,No1202S))),(No0908S,(No1114S,(No306,(No304,No0913S))))),No305); ((No0909S,((No1114S,No1007S),No1208S)),(No0912S,(No1103S,(No0908S,((No306,(No304,No0913S)),(No0906S,(No1206S,(No0910S,No1202S))))))),No305); (No1114S,((No0912S,No1103S),((((No306,(No304,No0913S)),(No1206S,((No0910S,No1202S),No0906S))),No0908S),(No0909S,(No1007S,No1208S)))),No305); (No1114S,(((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((((No1202S,No0906S),(No0910S,No0913S)),(No304,No0908S)),No1206S),No306)),No305); (No1114S,((((No1208S,No1007S),No0909S),(No1103S,No0912S)),((No306,(No304,No0913S)),(((No0910S,No1202S),No0906S),(No0908S,No1206S)))),No305); (No1114S,((((No1208S,No1007S),No0909S),(No1103S,No0912S)),((No306,(No304,No0913S)),(No0908S,(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,((((No1208S,No1007S),No0909S),(No1103S,No0912S)),(((No306,No304),(No0913S,(No0910S,No1202S))),((No0908S,No1206S),No0906S))),No305); (No1114S,(((No306,No304),No0913S),(((No0912S,(No0908S,(No1007S,(No0909S,No1208S)))),(No1206S,(No0906S,(No0910S,No1202S)))),No1103S)),No305); (No1114S,((((No0906S,((No0912S,No1103S),(No1208S,(No1007S,No0909S)))),(No0908S,No1206S)),(No0910S,No1202S)),((No0913S,No304),No306)),No305); (((No0912S,No1103S),((No1208S,No1007S),No0909S)),((((No0913S,No304),No306),No1114S),((No0908S,No1206S),(No0906S,(No0910S,No1202S)))),No305); (No1114S,((((No0906S,((No0913S,No304),(No0910S,No1202S))),(No0908S,No1206S)),((No0912S,No1103S),((No1208S,No1007S),No0909S))),No306),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,((No1103S,No0912S),((No0909S,(No1208S,No1007S)),(No0906S,(((No306,(No0913S,No304)),No0908S),((No1202S,No0910S),No1206S))))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((((No306,(No0913S,No304)),No0908S),(No0906S,(No1206S,(No1202S,No0910S)))),(No1103S,No0912S))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((((No304,(No0906S,(No0913S,(No1202S,No0910S)))),(No0908S,No1206S)),No306),(No1103S,No0912S))),No305); (No1114S,((No1208S,(No1007S,No0909S)),((No1103S,No0912S),(No1206S,((No0906S,(No1202S,No0910S)),(((No304,No0913S),No306),No0908S))))),No305); (No1114S,((No1103S,No0912S),((No0909S,(No1208S,No1007S)),(((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))))),No305); (No1114S,((No1103S,No0912S),((No0909S,(No1208S,No1007S)),(((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))))),No305); (No1114S,((((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,(((No0906S,((No304,No0913S),No306)),((No1202S,No0910S),(No0908S,No1206S))),((No1103S,No0912S),(No1208S,(No1007S,No0909S)))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No0909S,No1208S))),((No1206S,(No0906S,(No1202S,No0910S))),((No306,(No0913S,No304)),No0908S))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No0909S,No1208S))),((No1206S,(No0906S,(No1202S,No0910S))),((No306,(No0913S,No304)),No0908S))),No305); (No1114S,(((No1103S,No0912S),(No0909S,(No1208S,No1007S))),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No0913S,No304))))),No305); (No1114S,((No1007S,(No0909S,No1208S)),(((No306,(No0913S,No304)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),(No1103S,No0912S))),No305); (No1114S,((((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No0913S,No304)),No306),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No305); (No1114S,(((((No304,No0913S),No306),(No0908S,No1206S)),(No0906S,(No1202S,No0910S))),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No305); (No1114S,(No304,((((No0906S,(No0913S,(No1202S,No0910S))),(No0908S,No1206S)),No306),((No1208S,(No1007S,No0909S)),(No1103S,No0912S)))),No305); (No1114S,(No304,((((No0906S,No1206S),(No0910S,No1202S)),((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),No0908S),No306)),No0913S)),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No0909S,No1208S))),(No0908S,(((No0913S,No304),No306),(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,(((No1103S,No0912S),(No0909S,(No1208S,No1007S))),((((No0910S,No1202S),No0906S),(No0908S,No1206S)),((No0913S,No304),No306))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No306,(No0913S,No304)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S)))))),No305); (No1114S,((No0912S,No1103S),((No1208S,(No0909S,No1007S)),((No306,(No0913S,No304)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))))),No305); (No1114S,((No306,(((No0913S,(No0906S,(No0910S,No1202S))),No304),(No0908S,No1206S))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); ((No0908S,((No306,(No0913S,(No1114S,No304))),(No1206S,((No0910S,No1202S),No0906S)))),((No0912S,No1103S),(No0909S,(No1007S,No1208S))),No305); (((((No306,(No0913S,No304)),(No0908S,((No0910S,No1202S),No0906S))),No1206S),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((No0908S,((No1206S,((No0910S,No1202S),No0906S)),(No306,(No0913S,No304)))),((No0912S,No1103S),(No1208S,(No0909S,No1007S)))),No1114S,No305); ((((No1202S,(((No0908S,No1206S),No0906S),No0910S)),(No306,(No0913S,No304))),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No0913S,No304))),(No0912S,(No1103S,(No0909S,(No1007S,No1208S))))),No1114S,No305); (((((No1206S,(No0906S,(No0913S,(No0910S,No1202S)))),No0908S),(No304,No306)),((No1208S,(No0909S,No1007S)),(No0912S,No1103S))),No1114S,No305); ((((No1103S,(No1007S,(No1208S,No0909S))),No0912S),((((No0910S,No1202S),No0906S),(No0908S,No1206S)),(No0913S,(No304,No306)))),No1114S,No305); ((((No1208S,No0909S),No1007S),(((No306,(No304,No0913S)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S)),(No1103S,No0912S))),No1114S,No305); ((((No306,(No304,No0913S)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S)),((No1103S,No0912S),(No1208S,(No0909S,No1007S)))),No1114S,No305); (((No306,(((No0909S,(No1007S,No1208S)),(No304,No0913S)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S)))),(No1103S,No0912S)),No1114S,No305); (((No306,(No304,No0913S)),(((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No1208S,(No0909S,No1007S)),(No1103S,No0912S)))),No1114S,No305); (((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No306,(No304,No0913S)),((No0908S,No1206S),(No0906S,(No0910S,No1202S))))),No1114S,No305); (((No306,((No1114S,No304),No0913S)),(No0908S,(No1206S,(No1202S,(No0906S,No0910S))))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),No305); (((((No306,(No304,No0913S)),No0908S),(No1206S,(No0906S,(No0910S,No1202S)))),((No0912S,No1103S),((No0909S,No1208S),No1007S))),No1114S,No305); ((((No0909S,No1208S),No1007S),(((No0908S,No1206S),(((No0906S,(No0910S,No1202S)),No0913S),(No306,No304))),(No0912S,No1103S))),No1114S,No305); ((((No0909S,No1208S),No1007S),((No0912S,No1103S),(No0908S,((No306,(No304,No0913S)),(No1206S,((No0910S,No1202S),No0906S)))))),No1114S,No305); (((No0912S,No1103S),((No0906S,((((No304,No0913S),No306),(No0908S,No1206S)),(No0910S,No1202S))),((No0909S,No1208S),No1007S))),No1114S,No305); ((((No1208S,No0909S),No1007S),((((No306,(No304,No0913S)),(No0906S,(No0910S,(No1202S,No1206S)))),No0908S),(No1103S,No0912S))),No1114S,No305); (((((No306,(No304,No0913S)),((No0906S,(No0910S,No1202S)),No1206S)),No0908S),((No1208S,(No0909S,No1007S)),(No0912S,No1103S))),No1114S,No305); ((((No306,(No304,No0913S)),((No0906S,(No0908S,No1206S)),((No1007S,(No1208S,No0909S)),(No0910S,No1202S)))),(No0912S,No1103S)),No1114S,No305); (((No1206S,(No0906S,(No0910S,No1202S))),(No0908S,((No0912S,No1103S),(No1007S,(No1208S,No0909S))))),(No306,((No1114S,No304),No0913S)),No305); (((No0912S,No1103S),(No1208S,(No0909S,No1007S))),(((No306,((No1114S,No304),No0913S)),(No1206S,(No0906S,(No0910S,No1202S)))),No0908S),No305); ((No0912S,No1103S),((No0909S,(No1007S,No1208S)),((((No306,(No304,No0913S)),No1114S),(No1202S,(No0906S,(No1206S,No0910S)))),No0908S)),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((((No0910S,No1202S),No0906S),(No306,(No304,No0913S))),(No1206S,No0908S))),No305); (No1114S,(((No0912S,No1103S),(No1208S,(No0909S,No1007S))),((No0908S,((No0910S,No1202S),(No1206S,No0906S))),(No306,(No304,No0913S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No0908S,((No1206S,No0906S),(No0910S,No1202S))),(No306,(No304,No0913S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No1206S,(No0906S,(No0910S,No1202S))),No0908S),(No306,(No304,No0913S)))),No305); (No1114S,(((No0912S,No1103S),(No0909S,(No1208S,No1007S))),((No1206S,((No0910S,No1202S),No0906S)),((No0908S,(No304,No0913S)),No306))),No305); ((((No1007S,(No0909S,No1208S)),No0912S),No1103S),(No1114S,((No306,(No0913S,No304)),(No0908S,(No1206S,((No0910S,No1202S),No0906S))))),No305); ((No0912S,No1103S),(No1114S,((No306,(No0913S,No304)),(((No0909S,(No1208S,No1007S)),No0908S),(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),((No0908S,No1206S),((No306,(No0913S,No304)),((No0910S,No1202S),No0906S)))),(No0912S,No1103S)),No305); (No1114S,((No0906S,((No306,(No0913S,No304)),((No0908S,No1206S),(No0910S,No1202S)))),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); (((No0908S,(No0906S,((No0910S,No1202S),No1206S))),(No306,(No0913S,No304))),(((No0912S,No1103S),(No0909S,(No1208S,No1007S))),No1114S),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No306,(No0913S,No304))),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((No0913S,((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))),No306)),No304),No305); (((No1007S,(No0909S,No1208S)),(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No306,(No304,No0913S))),(No0912S,No1103S))),No1114S,No305); (((No0912S,No1103S),(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No306,(No304,No0913S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); (No0908S,((No0912S,(No1103S,(No0909S,(No1007S,No1208S)))),((No1114S,(No306,(No304,No0913S))),(No1206S,(No0906S,(No0910S,No1202S))))),No305); (((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),No0908S),(No1114S,(No306,(No304,No0913S)))),(No1206S,(No0906S,(No0910S,No1202S))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),((No306,(No304,No0913S)),No0908S)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),((No306,(No304,No0913S)),No0908S)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),((No306,(No304,No0913S)),No0908S)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),((No306,(No304,No0913S)),No0908S)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),((No306,(No304,No0913S)),No0908S)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); ((((No0908S,No1206S),(No0906S,(No0910S,No1202S))),(No1114S,(No306,(No304,No0913S)))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),No305); (No1114S,((No306,(No304,No0913S)),((No0908S,No1206S),(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(No0906S,(No0910S,No1202S))))),No305); (((No0912S,No1103S),(No0909S,(No1007S,No1208S))),((No0906S,(No0910S,No1202S)),(((No0913S,(No304,No306)),No1114S),(No0908S,No1206S))),No305); (No1114S,(No306,(((No1208S,(No0909S,No1007S)),(No0912S,No1103S)),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No304,No0913S)))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No306,(No304,No0913S)),(((No0906S,(No0910S,No1202S)),No1206S),No0908S))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No306,(No304,No0913S)),(((No0906S,(No0910S,No1202S)),No1206S),No0908S))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No306,(No304,No0913S)),(((No0906S,(No0910S,No1202S)),No1206S),No0908S))),No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),((((No0906S,No0910S),No1206S),No1202S),((No306,No1114S),(No0913S,No304)))),No0908S,No305); (((((No0910S,No1202S),No0906S),No1206S),(No0908S,(No1114S,((No0913S,No304),No306)))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),No305); (No1114S,(((No0913S,No306),((((No0908S,No1206S),No0906S),((No1208S,(No0909S,No1007S)),(No0912S,No1103S))),(No0910S,No1202S))),No304),No305); (No1114S,((No0912S,No1103S),((No0909S,(No1007S,No1208S)),(((No304,No1206S),(No0906S,(No0913S,(No1202S,No0910S)))),(No306,No0908S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No1206S,(No0906S,(No0910S,No1202S))),No0908S),((No0913S,No304),No306))),No305); (No1114S,((No0912S,No1103S),((No1007S,(No1208S,No0909S)),((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)))),No305); ((((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),(((No0913S,(No1202S,No0910S)),No0906S),(No0908S,No1206S))),(No304,No306)),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No306,((No304,No0913S),((No1202S,No0910S),No0906S))),(No0908S,No1206S))),No1114S,No305); (((No0912S,No1103S),(((No306,(No304,No0913S)),(No0908S,(((No1202S,No0910S),No0906S),No1206S))),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((((((No1202S,No0910S),No0906S),No1206S),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),(No306,(No304,No0913S))),No0908S),No1114S,No305); ((((No306,(No0908S,No1206S)),(((No0913S,(No1202S,No0910S)),No0906S),No304)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No1114S,No305); (((((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((No1114S,(No1007S,No1208S)),No0909S),((No0906S,(No1206S,(No1202S,No0910S))),No0908S)),(No1103S,No0912S)),(No306,(No304,No0913S)),No305); ((((No1103S,No0912S),((No1007S,No1208S),No0909S)),((((No306,(No304,No0913S)),No1206S),No0906S),((No1202S,No0910S),No0908S))),No1114S,No305); ((((No306,(No304,No0913S)),No1114S),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),((No0912S,No1103S),(No1007S,(No1208S,No0909S))),No305); ((((No0913S,(No306,No304)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),((No0912S,No1103S),(No1208S,(No0909S,No1007S)))),No1114S,No305); ((((No0912S,(No1208S,(No1007S,No0909S))),No1103S),((((No0913S,No304),No306),(((No0910S,No1202S),No0906S),No1206S)),No0908S)),No1114S,No305); ((((No0912S,(No1208S,(No1007S,No0909S))),No1103S),((((No0913S,No304),No306),(((No0910S,No1202S),No0906S),No1206S)),No0908S)),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(((No0908S,No304),((((No0913S,No0910S),No1202S),No0906S),No1206S)),No306)),No1114S,No305); ((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),((No0908S,(((No1202S,No0910S),No0906S),No1206S)),((No0913S,No304),No306))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),((No0908S,(((No1202S,No0910S),No0906S),No1206S)),((No0913S,No304),No306))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),((No0908S,(((No1202S,No0910S),No0906S),No1206S)),((No0913S,No304),No306))),No1114S,No305); ((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),((No0908S,(((No1202S,No0910S),No0906S),No1206S)),((No0913S,No304),No306))),No1114S,No305); (((No1103S,No0912S),((((No0908S,No1206S),((No0913S,No304),No306)),((No1202S,No0910S),No0906S)),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((No1103S,No0912S),(((No0908S,((No0913S,No304),No306)),((No1202S,No0910S),(No1206S,No0906S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); ((((No0913S,No304),No306),(((No1206S,(No0906S,(No1202S,No0910S))),No0908S),((No0909S,(No1208S,No1007S)),(No1103S,No0912S)))),No1114S,No305); (No1114S,(((No0906S,(No0913S,(No1202S,No0910S))),((No0908S,No1206S),(No304,No306))),(No1103S,((No1007S,(No0909S,No1208S)),No0912S))),No305); (No1114S,(((No1206S,(No0906S,(No0913S,(No1202S,No0910S)))),(No0908S,(No304,No306))),(No1103S,((No0909S,(No1208S,No1007S)),No0912S))),No305); (No1114S,(((No1206S,(No0906S,(No0913S,(No1202S,No0910S)))),(No0908S,(No304,No306))),(No1103S,((No0909S,(No1208S,No1007S)),No0912S))),No305); (No1114S,((((No0908S,No1206S),(No0910S,(No1202S,No0906S))),((No0913S,No304),No306)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,((((No0906S,No0910S),(No1206S,No1202S)),((No0908S,(No0913S,No304)),No306)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),(No0908S,((No0913S,No304),No306))),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),No305); (No1114S,(((((No1206S,No0908S),((No0906S,(No0910S,No1202S)),No306)),(No1007S,(No0909S,No1208S))),(No0913S,No304)),(No0912S,No1103S)),No305); (No1114S,((No306,(No0913S,No304)),(((((No1007S,(No0909S,No1208S)),No0912S),No1103S),No0908S),((No0906S,(No0910S,No1202S)),No1206S))),No305); ((((No0912S,(No0909S,(No1208S,No1007S))),No1103S),((No0908S,(No306,(No0913S,No304))),((No0906S,(No0910S,No1202S)),No1206S))),No1114S,No305); ((No0912S,No1103S),((No0909S,(No1208S,No1007S)),((No1114S,(No306,(No0913S,No304))),(((No0906S,(No0910S,No1202S)),No1206S),No0908S))),No305); (No1114S,(((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),((No0906S,(No1202S,No0910S)),((No306,(No304,No0913S)),(No1206S,No0908S)))),No305); (No1114S,((No1007S,(No1208S,No0909S)),((No0912S,No1103S),((No306,(No304,No0913S)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))))),No305); (No1114S,((((No0906S,(No1202S,No0910S)),(No306,(No304,No0913S))),(No0908S,No1206S)),(((No0909S,No1007S),No1208S),(No0912S,No1103S))),No305); (No1114S,((((No0906S,(No1202S,No0910S)),(No306,(No304,No0913S))),(No0908S,No1206S)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))),No0908S),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))),No0908S),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),(((No306,(No304,No0913S)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),(No1007S,(No1208S,No0909S)))),No305); (No1114S,(((No306,(No304,No0913S)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),(((No304,No0913S),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),No306)),(No0909S,(No1007S,No1208S)))),No305); (No1114S,((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(No306,(No0908S,(No1206S,(No0906S,(No0913S,(No1202S,No0910S))))))),No304),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No306,(No304,No0913S)),((No1206S,No0908S),(No0906S,(No1202S,No0910S))))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No306,(No304,No0913S)),(No0908S,((No0906S,(No1202S,No0910S)),No1206S)))),No305); (((No0908S,((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),((No1114S,(No306,(No304,No0913S))),(No0906S,(No1202S,No0910S)))),No1206S,No305); (No1114S,((No306,(No304,No0913S)),(No1206S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(No0908S,(No0906S,(No1202S,No0910S)))))),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No306,(No304,No0913S)),((No0908S,No1206S),(No0906S,(No1202S,No0910S))))),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(No306,((No304,No0913S),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))))),No305); (No1114S,(((No1208S,(No0909S,No1007S)),(No0912S,No1103S)),(((No1206S,No0908S),No0906S),((No1202S,No0910S),(No306,(No0913S,No304))))),No305); (No1114S,(((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(No1206S,((No0906S,(No1202S,No0910S)),(No0908S,(No306,(No0913S,No304)))))),No305); (No1114S,((No0912S,No1103S),((No0908S,No1206S),((No0906S,(No1202S,No0910S)),((No0909S,(No1007S,No1208S)),(No306,(No0913S,No304)))))),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(((No1206S,(No0906S,(No1202S,No0910S))),No0908S),(No306,(No0913S,No304)))),No305); (((No1103S,No0912S),(No1007S,(No0909S,No1208S))),(((No0908S,No1206S),((No0910S,No1202S),No0906S)),(No1114S,(No306,(No304,No0913S)))),No305); ((((No1103S,No0912S),(No1007S,(No0909S,No1208S))),((No0908S,(No1206S,((No0910S,No1202S),No0906S))),(No306,(No304,No0913S)))),No1114S,No305); (((No0909S,(No1208S,No1007S)),((((No0908S,No1206S),(No0906S,(No306,(No304,No0913S)))),(No0910S,No1202S)),(No0912S,No1103S))),No1114S,No305); ((((No306,(No304,No0913S)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S)),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),No1114S,No305); (((((No306,(No304,No0913S)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S)),(No0909S,(No1208S,No1007S))),(No0912S,No1103S)),No1114S,No305); ((((No0913S,No306),(((No0906S,((No0910S,No1202S),No1206S)),No0908S),((No1007S,(No0909S,No1208S)),(No0912S,No1103S)))),No304),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No1206S,((No304,No0913S),No306)),(No0906S,((No0910S,No1202S),No0908S)))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No0908S,((No304,No0913S),No306)),(((No0910S,No1202S),No0906S),No1206S))),No1114S,No305); ((((((No1007S,(No0909S,No1208S)),No0912S),No1103S),No0906S),((No0908S,No1206S),(No0910S,No1202S))),(No1114S,((No304,No0913S),No306)),No305); (((No0909S,(No1208S,No1007S)),((No0912S,No1103S),(((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No304,No0913S),No306)))),No1114S,No305); (((No1103S,(No0912S,(No1007S,(No1208S,No0909S)))),((No1206S,(No0906S,(No0910S,No1202S))),(((No304,No0913S),No306),No0908S))),No1114S,No305); (((No1103S,(No0912S,(No1007S,(No1208S,No0909S)))),(No0906S,(((No0908S,No1206S),((No0910S,No1202S),(No304,No0913S))),No306))),No1114S,No305); (((No0909S,(No1007S,No1208S)),(No1103S,No0912S)),((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No1114S,(No306,(No304,No0913S)))),No305); (No1114S,(((No306,(No304,No0913S)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,(((No306,(No304,No0913S)),((No1206S,No0908S),(No0906S,(No1202S,No0910S)))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((No1007S,(No0909S,No1208S)),(((No0906S,((No1202S,No0910S),No1206S)),((No306,(No304,No0913S)),No0908S)),(No1103S,No0912S))),No305); (No1114S,(No304,((No0908S,(No1206S,((No0906S,(No0913S,(No1202S,No0910S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))))),No306)),No305); (((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(No0908S,(((No306,No304),No1114S),(No1206S,(No0906S,(No0913S,(No1202S,No0910S)))))),No305); ((No0908S,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((No0906S,(No1202S,No0910S)),No1206S))),((No306,(No0913S,No304)),No1114S),No305); (((No0912S,No1103S),((((No0906S,(No1202S,No0910S)),No1206S),((No306,(No0913S,No304)),No0908S)),(No1208S,(No1007S,No0909S)))),No1114S,No305); (((No1103S,(No0912S,(No1007S,(No1208S,No0909S)))),(((No0906S,((No1202S,No0913S),No0910S)),((No1206S,No0908S),No306)),No304)),No1114S,No305); (((No1103S,(No0912S,(No1208S,(No0909S,No1007S)))),((No0906S,(No0913S,(No0910S,No1202S))),((No1206S,No0908S),(No304,No306)))),No1114S,No305); (((No1103S,(No0912S,(No1007S,(No1208S,No0909S)))),((((No0906S,(No0913S,(No0910S,No1202S))),No306),(No1206S,No0908S)),No304)),No1114S,No305); (((No1103S,(No0912S,(No1208S,(No0909S,No1007S)))),(((No0913S,((No0910S,No1202S),No0906S)),(No304,No306)),(No1206S,No0908S))),No1114S,No305); (((((No1208S,(No0909S,No1007S)),(No1103S,No0912S)),((No1206S,((No0910S,No1202S),No0906S)),No0908S)),(No306,(No304,No0913S))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((((No306,(No304,No0913S)),No1206S),((No0910S,No1202S),No0906S)),No0908S)),No1114S,No305); (((No0912S,No1103S),((No0909S,(No1007S,No1208S)),((No306,(No304,No0913S)),(No0908S,((No1206S,(No0910S,No1202S)),No0906S))))),No1114S,No305); ((((No0908S,(((No0913S,(No0910S,No1202S)),No0906S),No1206S)),(No306,No304)),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No1114S,No305); (No1114S,(((No0909S,(No1007S,No1208S)),((No0908S,(((No0910S,No1202S),No0906S),No1206S)),(No306,(No0913S,No304)))),(No0912S,No1103S)),No305); (No1114S,((((No1206S,No0908S),No0906S),(No306,(((No0910S,No1202S),No0913S),No304))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No305); (No1114S,((((No306,(No304,No0913S)),(No1206S,(No0906S,(No0910S,No1202S)))),(No0912S,(No1103S,(No0909S,(No1208S,No1007S))))),No0908S),No305); (No1114S,((((No306,(No304,No0913S)),((No0906S,(No0910S,No1202S)),No1206S)),No0908S),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,(((No0908S,No1206S),((No306,No304),(No0906S,(No0913S,(No0910S,No1202S))))),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,(No0906S,((No306,(No0913S,No304)),(((No0908S,No1206S),(No0910S,No1202S)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(((No0908S,No1206S),((No0906S,(No0913S,(No0910S,No1202S))),No306)),No304)),No305); (((No0912S,No1103S),(No0909S,(No1208S,No1007S))),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),(No1114S,((No0913S,No304),No306)))),No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),((No0913S,No304),No306))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((((No0913S,No304),No306),No0912S),(No1103S,((No1206S,(No0906S,(No1202S,No0910S))),No0908S)))),No1114S,No305); (No0908S,((((No1007S,(No0909S,No1208S)),No0912S),No1103S),((No1114S,((No304,No0913S),No306)),(((No1202S,No1206S),No0910S),No0906S))),No305); (No1114S,((((No304,No0913S),No306),((((No1202S,No0910S),No0906S),No1206S),No0908S)),(((No0909S,(No1208S,No1007S)),No0912S),No1103S)),No305); (No1114S,(((No0912S,(No1007S,(No1208S,No0909S))),No1103S),(((No1206S,No0908S),((No0913S,(No0906S,(No0910S,No1202S))),No304)),No306)),No305); (No1114S,((No0912S,No1103S),((No1007S,(No1208S,No0909S)),(No304,(No306,((No1206S,No0908S),(No0906S,((No0910S,No1202S),No0913S))))))),No305); (No1114S,(((No1208S,(No0909S,No1007S)),(No0912S,No1103S)),(((No304,No0913S),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S)))),No305); (No1114S,(((No1208S,(No0909S,No1007S)),(No0912S,No1103S)),(((No304,No0913S),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S)))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No304,((No0910S,No1202S),No0913S)),No306),((No1206S,No0908S),No0906S))),No305); (No1114S,(((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((No0913S,No304),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((((No0913S,No304),No306),(No1206S,(No0910S,No1202S))),No0906S),No0908S)),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No0913S,No304),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S))))),No305); (No1114S,((No1208S,(No0909S,No1007S)),((No0912S,No1103S),(((No0913S,No304),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S)))))),No305); (No1114S,((((((No0913S,No304),No306),(No0908S,(No0906S,((No0910S,No1202S),No1206S)))),(No0909S,(No1007S,No1208S))),No0912S),No1103S),No305); (No1114S,((No0912S,(No1103S,(No0909S,(No1007S,No1208S)))),((No304,No306),((No1206S,No0908S),(No0906S,(No0913S,(No0910S,No1202S)))))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No0912S,(No1103S,(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),(No304,No0913S))))),No306)),No305); (No1114S,((((No0908S,No1206S),(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))),((No1208S,(No0909S,No1007S)),(No0912S,No1103S))),No305); (No1114S,((No306,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No0906S,((No1202S,No0910S),No1206S)),No0908S))),(No0913S,No304)),No305); (No1114S,((((No0909S,(No1007S,No1208S)),No0912S),No1103S),((No1206S,No0908S),(No0906S,(((No1202S,No0910S),No0913S),(No304,No306))))),No305); (No1114S,(No304,((No306,((((No1206S,No0906S),(No1202S,No0910S)),No0908S),(((No0909S,(No1007S,No1208S)),No0912S),No1103S))),No0913S)),No305); (No1114S,((No1007S,(No1208S,No0909S)),((No0912S,No1103S),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),((No0913S,No304),No306))))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No0912S,No1103S),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),((No0913S,No304),No306))))),No305); (No1114S,((No0912S,No1103S),((No0908S,((No0909S,(No1007S,No1208S)),((No0913S,No304),No306))),(No1206S,(No0906S,(No1202S,No0910S))))),No305); (No1114S,((No1007S,(No1208S,No0909S)),((No0912S,No1103S),(((No1206S,(No0906S,(No1202S,No0910S))),((No0913S,No304),No306)),No0908S))),No305); (No1114S,(((No306,(No0913S,No304)),((No1206S,No0908S),(No0906S,(No1202S,No0910S)))),(((No1208S,No0909S),No1007S),(No0912S,No1103S))),No305); (((((No1206S,No0906S),(No1202S,No0910S)),No0908S),(No1114S,(No306,(No0913S,No304)))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),No305); (No1114S,(((No306,(No0913S,No304)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No305); (No1114S,((No0906S,(((No1206S,No0908S),((No0913S,No304),(No1202S,No0910S))),((No0912S,No1103S),(No0909S,(No1007S,No1208S))))),No306),No305); (No1114S,(((No0906S,((No0913S,(No306,No304)),(No1202S,No0910S))),(No1206S,No0908S)),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No305); (No1114S,(((No306,(No304,No0913S)),((((No1202S,No0910S),No0906S),No1206S),No0908S)),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No305); (((No306,((No1114S,No304),No0913S)),((((No1202S,No0910S),No0906S),No1206S),No0908S)),((No0912S,No1103S),(No0909S,(No1007S,No1208S))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S)))),(No0912S,No1103S)),No305); (((No306,(No304,No0913S)),No1114S),((((No1202S,No0910S),No0906S),(No1206S,No0908S)),(No0912S,(No1103S,(No1007S,(No1208S,No0909S))))),No305); (No1114S,((No0912S,No1103S),((((No1202S,No0910S),(No1007S,(No1208S,No0909S))),(No0906S,No1206S)),((No306,(No304,No0913S)),No0908S))),No305); (No1114S,((((No0908S,((No306,(No304,No0913S)),(No1206S,(No0906S,(No1202S,No0910S))))),(No1007S,(No1208S,No0909S))),No1103S),No0912S),No305); (No1114S,(((No306,(No304,No0913S)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,(((No306,(No304,No0913S)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,((((No1202S,No0910S),(No306,(No304,No0913S))),((No0908S,No1206S),No0906S)),(No0912S,((No1007S,(No1208S,No0909S)),No1103S))),No305); (No1114S,((No0908S,((No306,(No304,No0913S)),(No1206S,(No0906S,(No1202S,No0910S))))),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); ((((No1202S,No0910S),(No0908S,No1206S)),((No306,((No1114S,No304),No0913S)),No0906S)),((No1208S,(No0909S,No1007S)),(No1103S,No0912S)),No305); (((No0906S,No1206S),(No1202S,No0910S)),(((No306,(No304,No0913S)),No1114S),(No0908S,(((No0909S,(No1007S,No1208S)),No1103S),No0912S))),No305); (((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No306,(No304,No0913S)),((No1206S,((No1202S,No0910S),No0906S)),No0908S)),No1114S),No305); (No1114S,(((No306,(No304,No0913S)),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),((No1206S,((No1202S,No0910S),No0906S)),No0908S)),No305); (((No1103S,No0912S),(No0909S,(No1007S,No1208S))),(((No1206S,No0906S),((No306,((No1114S,No304),No0913S)),No0908S)),(No1202S,No0910S)),No305); phangorn/inst/extdata/trees/RAxML_bipartitions.AIs0000644000176200001440000000054313475602650021741 0ustar liggesusers(Ame:0.02681059329595153473,((Hma:0.00312706379726812329,(Uth:0.00121026052477198292,Mur:0.00312046250563168155)39:0.00087036069658183684)42:0.00122506270256386740,((Uar:0.00052373856518729458,Uma:0.00247018618187345041)83:0.00167792487939210548,Uam:0.00184159984063642979)41:0.00107249327886021345)100:0.00382497683824970002,Tor:0.00848622429823414105); phangorn/inst/extdata/trees/woodmouse.mrbayes.nex.run1.t0000644000176200001440000025045013475602650023161 0ustar liggesusers#NEXUS [ID: 2542150086] begin trees; translate 1 No305, 2 No304, 3 No306, 4 No0906S, 5 No0908S, 6 No0909S, 7 No0910S, 8 No0912S, 9 No0913S, 10 No1103S, 11 No1007S, 12 No1114S, 13 No1202S, 14 No1206S, 15 No1208S; tree rep.1 = ((((((3,((((((13,6),15),(5,9)),12),2),11)),7),8),4),10),14,1); tree rep.10000 = (12,((8,(10,(11,(15,6)))),(((14,((7,13),4)),(3,(9,2))),5)),1); tree rep.20000 = (((8,(10,((6,15),11))),(((2,9),((14,5),3)),(4,(7,13)))),12,1); tree rep.30000 = (((4,(((7,(9,13)),(3,2)),(14,5))),((10,8),((15,6),11))),12,1); tree rep.40000 = (((((6,11),15),(10,8)),(((3,(2,9)),(4,(14,(13,7)))),5)),12,1); tree rep.50000 = (((((7,13),4),((11,(6,15)),(10,8))),((3,(2,9)),(14,5))),12,1); tree rep.60000 = (12,(((8,10),((15,6),11)),(((4,(7,13)),(5,(3,(9,2)))),14)),1); tree rep.70000 = (((4,(13,7)),(((((9,2),3),12),5),14)),((8,10),(11,(6,15))),1); tree rep.80000 = (12,(((5,(14,((7,13),4))),(3,(2,9))),((8,((11,6),15)),10)),1); tree rep.90000 = (12,((((2,9),3),(14,(5,(4,(7,13))))),(((11,(15,6)),8),10)),1); tree rep.100000 = (((((9,2),3),(5,((14,(13,7)),4))),(8,(((15,6),11),10))),12,1); tree rep.110000 = (((((6,15),11),(8,10)),(5,(((4,14),(7,13)),((2,9),3)))),12,1); tree rep.120000 = (12,(((5,(14,(3,(9,2)))),((7,4),13)),(10,(((6,11),15),8))),1); tree rep.130000 = (12,(((10,8),(11,(6,15))),((3,(2,9)),(5,((4,(13,7)),14)))),1); tree rep.140000 = (12,(((3,(9,2)),((15,(11,6)),(10,8))),((5,(13,7)),(14,4))),1); tree rep.150000 = (((4,(((9,2),3),(5,(14,(7,13))))),12),(((11,(6,15)),10),8),1); tree rep.160000 = (((5,((14,((3,(9,2)),4)),(7,13))),(((15,11),6),(10,8))),12,1); tree rep.170000 = (12,((((15,6),11),(8,10)),((14,(((13,7),4),5)),((2,9),3))),1); tree rep.180000 = (((((7,13),4),5),((10,(8,(11,(6,15)))),(((9,2),3),14))),12,1); tree rep.190000 = (12,((3,(9,2)),(((8,10),((15,6),11)),(5,(14,((13,7),4))))),1); tree rep.200000 = ((((6,(11,15)),(10,8)),(((4,(13,7)),((2,9),3)),(14,5))),12,1); tree rep.210000 = (((8,(10,(11,(15,6)))),(((13,7),4),(5,((3,(2,9)),14)))),12,1); tree rep.220000 = ((((4,(7,13)),(((3,(9,2)),5),14)),(10,((11,(15,6)),8))),12,1); tree rep.230000 = (12,((14,((((8,(11,(15,6))),10),(((13,7),5),4)),3)),(2,9)),1); tree rep.240000 = ((((14,((2,9),3)),((((6,(15,11)),8),10),5)),(4,(13,7))),12,1); tree rep.250000 = (12,(((6,(11,15)),(10,8)),((3,(9,2)),(5,((14,(13,7)),4)))),1); tree rep.260000 = (((((11,(15,6)),10),8),((((3,(2,9)),14),(4,(13,7))),5)),12,1); tree rep.270000 = (12,((5,14),((((8,10),((6,15),11)),((9,2),(4,(7,13)))),3)),1); tree rep.280000 = ((((((7,13),((2,9),3)),(5,14)),((11,(15,6)),(10,8))),4),12,1); tree rep.290000 = (((8,(((11,6),15),10)),((5,((2,9),3)),((4,14),(7,13)))),12,1); tree rep.300000 = (12,((((3,(5,((7,13),4))),(2,9)),14),(8,(((11,15),6),10))),1); tree rep.310000 = (((11,(6,15)),((5,((14,((13,7),4)),(3,(2,9)))),(10,8))),12,1); tree rep.320000 = (12,((((15,6),11),(10,8)),(((3,(2,9)),(4,(14,(7,13)))),5)),1); tree rep.330000 = ((((((11,(6,15)),(10,8)),(5,((7,13),(4,14)))),3),(2,9)),12,1); tree rep.340000 = ((((10,8),(11,(15,6))),(((((2,9),3),(4,14)),(7,13)),5)),12,1); tree rep.350000 = (12,((5,(((6,15),11),(10,8))),(((2,9),3),(4,(14,(7,13))))),1); tree rep.360000 = (12,(((((6,15),11),8),10),((5,((2,9),3)),((14,(7,13)),4))),1); tree rep.370000 = (12,((4,(14,((7,13),(5,(3,(9,2)))))),((11,(15,6)),(10,8))),1); tree rep.380000 = (((((14,5),(4,(13,7))),((2,9),3)),(8,((6,(15,11)),10))),12,1); tree rep.390000 = ((((((7,13),4),5),((2,9),3)),((((11,(15,6)),10),8),14)),12,1); tree rep.400000 = (12,(((9,2),3),((((6,11),15),(8,10)),((14,5),(4,(7,13))))),1); tree rep.410000 = ((5,((((4,(13,7)),14),((10,8),((11,15),6))),(3,(9,2)))),12,1); tree rep.420000 = ((((8,(11,(15,6))),10),(5,((14,((13,7),4)),(3,(9,2))))),12,1); tree rep.430000 = (12,((((9,2),((7,13),4)),(14,(3,5))),((8,(11,(6,15))),10)),1); tree rep.440000 = (12,((5,((4,((3,(9,2)),(13,7))),14)),((8,((11,15),6)),10)),1); tree rep.450000 = ((((8,10),((6,15),11)),(5,(((2,9),3),(14,((13,7),4))))),12,1); tree rep.460000 = (((14,((5,((2,9),3)),(4,(13,7)))),((8,10),((15,11),6))),12,1); tree rep.470000 = (((4,(13,7)),(14,(5,(3,(2,9))))),((10,((11,(15,6)),8)),12),1); tree rep.480000 = (12,((((15,6),11),(8,10)),((((2,9),3),((4,(13,7)),14)),5)),1); tree rep.490000 = ((((10,8),(11,(6,15))),(((9,2),3),(((4,(13,7)),14),5))),12,1); tree rep.500000 = (12,(((10,(6,(15,11))),8),(((2,9),3),(5,(((7,13),4),14)))),1); tree rep.510000 = (12,((8,(((11,6),15),10)),((4,(((2,9),3),5)),((13,7),14))),1); tree rep.520000 = ((((11,(6,15)),(8,10)),12),((4,(13,7)),((5,14),(3,(9,2)))),1); tree rep.530000 = (12,((((13,7),4),(14,5)),(((9,2),3),((15,(11,6)),(8,10)))),1); tree rep.540000 = (12,((14,((4,((13,7),9)),(2,(3,5)))),((((15,11),6),8),10)),1); tree rep.550000 = ((((3,((9,2),(14,((7,13),4)))),5),12),(10,(((11,15),6),8)),1); tree rep.560000 = (12,((5,(3,((14,(4,(13,7))),(2,9)))),((10,8),((15,6),11))),1); tree rep.570000 = (((((6,(15,11)),10),8),(((3,(2,9)),(((7,13),4),14)),5)),12,1); tree rep.580000 = ((((5,(14,(7,(4,13)))),(3,(9,2))),(8,(10,(6,(11,15))))),12,1); tree rep.590000 = (12,((5,(((4,(7,13)),14),((2,9),3))),(8,(10,(11,(6,15))))),1); tree rep.600000 = ((10,(((((7,13),4),(5,(3,(2,9)))),14),8)),(12,((11,6),15)),1); tree rep.610000 = (((((3,(2,9)),(14,((4,13),7))),5),(10,(8,(6,(15,11))))),12,1); tree rep.620000 = (((3,(9,2)),(((((7,13),4),14),(((15,11),6),(8,10))),5)),12,1); tree rep.630000 = (12,((((15,6),11),(8,10)),((((13,7),(14,4)),((2,9),3)),5)),1); tree rep.640000 = (((((14,(7,13)),4),(3,(9,2))),(5,12)),(8,(((15,6),11),10)),1); tree rep.650000 = (12,(((((11,15),6),10),8),(((5,3),4),(14,((13,7),(9,2))))),1); tree rep.660000 = ((((6,(15,11)),(8,10)),(14,(((9,2),3),(((7,13),4),5)))),12,1); tree rep.670000 = (((((11,(6,15)),8),10),(14,((7,13),(((3,(2,9)),5),4)))),12,1); tree rep.680000 = (12,(((((2,9),3),5),(4,(14,(13,7)))),(8,(10,(11,(6,15))))),1); tree rep.690000 = (((((13,7),((14,5),4)),(3,(9,2))),((10,8),((15,11),6))),12,1); tree rep.700000 = (((5,((4,(3,(2,9))),(7,(13,14)))),(((6,11),15),(10,8))),12,1); tree rep.710000 = (((5,14),((7,13),(4,((2,9),3)))),(12,(8,(((15,6),11),10))),1); tree rep.720000 = (((2,9),3),((7,13),(5,(4,(14,((10,(8,(6,(11,15)))),12))))),1); tree rep.730000 = (((((11,15),6),(10,8)),((4,(14,(7,13))),(5,(3,(2,9))))),12,1); tree rep.740000 = ((12,((11,(15,6)),(10,8))),((14,4),(((7,13),5),((2,9),3))),1); tree rep.750000 = (12,(((((9,2),3),(14,((13,7),4))),5),((10,8),((15,11),6))),1); tree rep.760000 = ((((10,8),((11,6),15)),(5,((4,(14,(13,7))),(3,(2,9))))),12,1); tree rep.770000 = (12,(((3,(2,9)),((10,((6,(11,15)),8)),(5,14))),((13,7),4)),1); tree rep.780000 = (((3,(2,9)),(5,(14,(((8,10),((11,15),6)),12)))),(4,(13,7)),1); tree rep.790000 = (12,(((14,(((3,(2,9)),(7,13)),4)),5),(8,(10,((15,6),11)))),1); tree rep.800000 = (12,(((((9,2),3),5),(14,(4,(7,13)))),((8,((15,6),11)),10)),1); tree rep.810000 = (12,((((15,11),6),(10,8)),(((9,2),3),((14,5),(4,(7,13))))),1); tree rep.820000 = ((((14,(4,((7,13),(3,(9,2))))),5),(10,(8,(11,(15,6))))),12,1); tree rep.830000 = (12,((((3,(2,9)),5),(14,(4,(7,13)))),(8,(10,(6,(15,11))))),1); tree rep.840000 = ((((8,10),(11,(15,6))),(((14,(13,7)),4),(5,((2,9),3)))),12,1); tree rep.850000 = (12,(((10,((15,11),6)),8),(((5,((7,13),4)),14),(3,(9,2)))),1); tree rep.860000 = ((((((3,(9,2)),(14,(13,7))),4),5),((((6,15),11),10),8)),12,1); tree rep.870000 = (12,(((((9,2),3),(5,14)),((8,(11,(15,6))),10)),((4,13),7)),1); tree rep.880000 = ((((14,4),(13,7)),((((2,9),3),(10,((15,(6,11)),8))),5)),12,1); tree rep.890000 = ((((4,(13,7)),(14,(5,(3,(2,9))))),(10,(((15,6),11),8))),12,1); tree rep.900000 = (12,(((8,10),((6,15),11)),((5,14),((3,(2,9)),(4,(7,13))))),1); tree rep.910000 = (((((14,(7,13)),((2,9),3)),(4,5)),(10,(8,(6,(11,15))))),12,1); tree rep.920000 = ((12,(((9,2),3),(5,(((13,7),4),14)))),((8,(11,(6,15))),10),1); tree rep.930000 = (((((3,(9,2)),5),(14,((13,7),4))),((8,((6,15),11)),10)),12,1); tree rep.940000 = (12,(((8,10),(11,(15,6))),((((3,(2,9)),(7,13)),(5,14)),4)),1); tree rep.950000 = (((((6,(15,11)),8),10),(((13,7),(14,4)),(5,(3,(2,9))))),12,1); tree rep.960000 = ((((8,10),((6,15),11)),((((7,13),14),4),(((2,9),3),5))),12,1); tree rep.970000 = ((((((4,14),5),(3,(9,2))),(7,13)),(8,((11,(15,6)),10))),12,1); tree rep.980000 = (12,(((((14,4),(8,(10,(11,(15,6))))),5),(7,13)),((9,2),3)),1); tree rep.990000 = (((5,((3,(9,2)),((7,(14,13)),4))),(10,(((6,11),15),8))),12,1); tree rep.1000000 = (12,(((5,(((13,7),14),4)),((2,9),3)),((11,(15,6)),(10,8))),1); tree rep.1010000 = (12,((((14,5),(((15,6),11),(10,8))),(4,(13,7))),(3,(2,9))),1); tree rep.1020000 = (12,(((6,15),11),((4,(5,(((2,9),3),(14,(13,7))))),(8,10))),1); tree rep.1030000 = (((5,3),((4,(7,13)),((2,9),14))),(((((15,11),6),8),10),12),1); tree rep.1040000 = (12,(3,(((((14,4),((8,10),(6,(11,15)))),5),(13,7)),(2,9))),1); tree rep.1050000 = (12,(((5,((4,(13,7)),14)),(3,(2,9))),(10,(8,(6,(15,11))))),1); tree rep.1060000 = ((((4,((13,7),14)),(5,((8,10),(6,(15,11))))),(3,(2,9))),12,1); tree rep.1070000 = (12,((((8,(10,((15,11),6))),14),((((9,2),3),5),(13,7))),4),1); tree rep.1080000 = ((((10,8),((15,11),6)),12),((5,(14,(3,(9,2)))),(4,(7,13))),1); tree rep.1090000 = (12,((10,8),(((6,11),15),((((7,13),(3,(2,9))),(5,14)),4))),1); tree rep.1100000 = (12,((((13,(7,14)),(5,4)),(3,(2,9))),((8,((15,11),6)),10)),1); tree rep.1110000 = ((((10,8),(6,(15,11))),((4,(((13,7),14),(3,(9,2)))),5)),12,1); tree rep.1120000 = (((10,((6,(11,15)),8)),(((7,13),14),((4,5),((2,9),3)))),12,1); tree rep.1130000 = ((((((9,2),(14,((13,7),4))),5),3),(8,(((15,11),6),10))),12,1); tree rep.1140000 = ((((5,((10,8),((6,15),11))),((9,2),3)),(((13,7),14),4)),12,1); tree rep.1150000 = ((10,8),((12,((5,3),((2,9),((4,(7,13)),14)))),((11,15),6)),1); tree rep.1160000 = (12,(5,(((2,9),3),(((6,(15,11)),(10,8)),((13,7),(14,4))))),1); tree rep.1170000 = (((14,(((7,13),4),(5,((9,2),3)))),(8,((6,(15,11)),10))),12,1); tree rep.1180000 = ((((10,(11,(15,6))),8),(((7,(4,13)),14),(5,((2,9),3)))),12,1); tree rep.1190000 = (12,((5,(((4,(7,13)),14),((9,2),3))),(8,(10,((6,15),11)))),1); tree rep.1200000 = ((((14,(4,(7,13))),5),(3,(9,2))),(((10,8),((15,6),11)),12),1); tree rep.1210000 = (12,(((8,10),((11,15),6)),((((13,7),4),5),(((9,3),2),14))),1); tree rep.1220000 = ((((9,2),3),((14,((6,(15,11)),(8,10))),(((13,7),4),5))),12,1); tree rep.1230000 = (((((9,2),3),((4,14),(13,7))),5),(12,((8,10),(11,(15,6)))),1); tree rep.1240000 = ((((8,10),((15,11),6)),((5,((13,7),14)),((3,(9,2)),4))),12,1); tree rep.1250000 = (12,((10,8),(((15,11),6),(14,((4,(13,7)),(5,((9,2),3)))))),1); tree rep.1260000 = ((((((6,15),11),10),8),((14,((7,13),4)),((3,(9,2)),5))),12,1); tree rep.1270000 = (12,(((7,13),(((2,9),3),((5,14),4))),((((6,11),15),10),8)),1); tree rep.1280000 = ((14,((((10,8),((6,15),11)),5),(((3,(9,2)),(7,13)),4))),12,1); tree rep.1290000 = (12,((8,(10,(11,(15,6)))),(((4,7),13),(14,(5,(3,(9,2)))))),1); tree rep.1300000 = (((((13,7),((14,5),((9,2),3))),4),(10,(((6,15),11),8))),12,1); tree rep.1310000 = ((((8,((6,15),11)),10),((3,(2,9)),((14,5),(4,(13,7))))),12,1); tree rep.1320000 = (12,((((2,9),3),(5,((4,(7,13)),14))),((10,((15,11),6)),8)),1); tree rep.1330000 = (12,(((3,(2,9)),(14,((5,4),(13,7)))),((((15,6),11),8),10)),1); tree rep.1340000 = ((8,((((15,11),6),(5,(((4,14),(13,7)),((2,9),3)))),10)),12,1); tree rep.1350000 = (((((5,14),((4,7),13)),((2,9),3)),(((11,(6,15)),10),8)),12,1); tree rep.1360000 = ((12,((((15,11),6),8),10)),(5,((14,((7,13),4)),((9,2),3))),1); tree rep.1370000 = ((((8,(6,(11,15))),10),(((5,14),((7,13),4)),(3,(9,2)))),12,1); tree rep.1380000 = (((((13,7),14),(5,4)),((12,(2,9)),3)),((8,10),(6,(11,15))),1); tree rep.1390000 = (12,(((4,(7,13)),((5,14),((2,9),3))),(10,(8,((15,11),6)))),1); tree rep.1400000 = ((12,(8,(((15,6),11),10))),(((3,(9,2)),5),(14,((13,7),4))),1); tree rep.1410000 = (((3,((5,(9,2)),12)),((4,(7,13)),14)),((10,((15,6),11)),8),1); tree rep.1420000 = ((((10,(11,(15,6))),8),((14,5),(((9,2),3),(4,(7,13))))),12,1); tree rep.1430000 = (12,(((11,(6,15)),(8,10)),((3,((13,7),4)),(((9,2),5),14))),1); tree rep.1440000 = ((((5,((14,(4,(7,13))),((2,9),3))),(8,10)),(6,(11,15))),12,1); tree rep.1450000 = (((((14,(5,(2,3))),4),((10,8),((11,15),6))),(9,(7,13))),12,1); tree rep.1460000 = ((((((4,(13,7)),((5,14),(3,(9,2)))),10),8),(6,(11,15))),12,1); tree rep.1470000 = (12,((8,(10,(11,(15,6)))),((((4,(7,13)),14),((2,9),3)),5)),1); tree rep.1480000 = (((((7,(4,13)),(5,((9,2),3))),14),(((6,(15,11)),8),10)),12,1); tree rep.1490000 = ((12,((3,(9,2)),((((7,4),13),14),5))),(((6,15),11),(8,10)),1); tree rep.1500000 = ((7,((5,(14,((3,(2,9)),(4,((10,8),((15,6),11)))))),13)),12,1); tree rep.1510000 = (((((6,11),15),(10,8)),((((13,7),14),4),(((2,9),3),5))),12,1); tree rep.1520000 = ((((14,5),(((7,13),4),((2,9),3))),((8,10),((15,11),6))),12,1); tree rep.1530000 = ((5,((4,(7,13)),(14,(3,(2,9))))),(12,(8,(10,(11,(15,6))))),1); tree rep.1540000 = (12,(((3,(2,9)),((4,((14,13),7)),5)),(10,(8,((6,15),11)))),1); tree rep.1550000 = (12,(((11,(15,6)),(10,8)),(5,(((9,2),3),(14,((7,13),4))))),1); tree rep.1560000 = ((((3,(9,2)),((4,(13,7)),(5,14))),((11,(15,6)),(8,10))),12,1); tree rep.1570000 = (((15,11),6),(5,((2,9),(((14,((4,3),12)),(13,7)),(10,8)))),1); tree rep.1580000 = ((((11,(15,6)),(10,8)),(((4,(7,13)),14),(((2,9),3),5))),12,1); tree rep.1590000 = (((((2,9),3),(4,((7,13),(14,5)))),((8,(6,(15,11))),10)),12,1); tree rep.1600000 = ((((11,(15,6)),(10,8)),12),((((14,4),(13,7)),((2,9),3)),5),1); tree rep.1610000 = ((((10,8),((11,15),6)),((((2,9),3),5),(14,(4,(7,13))))),12,1); tree rep.1620000 = (((((2,9),3),((14,5),(4,(7,13)))),(10,(8,((6,15),11)))),12,1); tree rep.1630000 = (((((7,13),((5,4),14)),((9,2),3)),(10,(8,(6,(11,15))))),12,1); tree rep.1640000 = (((((14,5),((2,9),3)),(4,(13,7))),((11,(6,15)),(8,10))),12,1); tree rep.1650000 = (((((3,(9,2)),(((13,7),14),4)),5),(((6,15),11),(8,10))),12,1); tree rep.1660000 = ((((10,((15,11),6)),8),(4,(((14,(7,13)),5),(3,(2,9))))),12,1); tree rep.1670000 = (((14,(((13,7),4),(5,((9,2),3)))),(8,(10,((15,11),6)))),12,1); tree rep.1680000 = (12,(((8,10),(11,(6,15))),(((7,13),(4,14)),(((9,2),3),5))),1); tree rep.1690000 = (((8,((6,(15,11)),10)),(5,((14,((13,4),7)),((9,2),3)))),12,1); tree rep.1700000 = (12,(((4,(5,(13,7))),(((9,2),3),14)),((8,(15,(6,11))),10)),1); tree rep.1710000 = (((((((9,2),3),(4,(7,13))),((8,10),(6,(11,15)))),5),14),12,1); tree rep.1720000 = (((8,((6,(11,15)),10)),(((14,4),(13,7)),((3,(2,9)),5))),12,1); tree rep.1730000 = (((5,((4,14),(13,7))),((2,9),3)),((((11,15),6),(10,8)),12),1); tree rep.1740000 = (12,(((((2,9),3),5),(((13,7),4),14)),((8,((15,6),11)),10)),1); tree rep.1750000 = (12,((((4,(5,14)),(7,13)),((9,2),3)),(10,(8,(11,(15,6))))),1); tree rep.1760000 = ((((5,(14,((7,13),4))),(3,(9,2))),((11,(15,6)),(10,8))),12,1); tree rep.1770000 = ((10,(8,(6,(11,15)))),((((14,4),(13,7)),(5,(3,(2,9)))),12),1); tree rep.1780000 = (12,((((((7,13),4),14),5),((2,9),3)),((10,8),(6,(11,15)))),1); tree rep.1790000 = ((((8,10),(11,(15,6))),((3,(2,9)),(((7,13),(4,14)),5))),12,1); tree rep.1800000 = (((10,8),(11,(6,15))),((((((4,(7,13)),9),3),2),(14,5)),12),1); tree rep.1810000 = (((10,(8,(11,(15,6)))),(((((9,2),3),(7,13)),5),(14,4))),12,1); tree rep.1820000 = (12,((4,((3,(9,2)),(5,((7,13),14)))),((10,8),(11,(6,15)))),1); tree rep.1830000 = (12,((((11,(6,15)),8),10),((14,5),((4,(13,7)),(3,(9,2))))),1); tree rep.1840000 = (12,(((4,(14,((13,7),(3,(9,2))))),5),(((11,(15,6)),10),8)),1); tree rep.1850000 = ((((14,(9,2)),(7,13)),5),(4,(3,(12,((10,8),((15,11),6))))),1); tree rep.1860000 = ((((8,10),(6,(15,11))),((14,5),(((7,13),((9,2),3)),4))),12,1); tree rep.1870000 = (12,(((8,10),(11,(6,15))),(((3,(9,2)),5),((4,(7,13)),14))),1); tree rep.1880000 = ((((((14,((13,7),4)),5),(3,(2,9))),(10,8)),(6,(15,11))),12,1); tree rep.1890000 = ((((10,(11,(6,15))),8),(((7,13),4),(((9,2),3),(14,5)))),12,1); tree rep.1900000 = (12,(((14,5),((3,(2,9)),((13,7),4))),((((6,15),11),8),10)),1); tree rep.1910000 = (((((11,15),6),(10,8)),(5,(14,((7,(13,4)),((2,9),3))))),12,1); tree rep.1920000 = (((((9,2),(5,(7,(4,(14,13))))),3),(10,((6,(15,11)),8))),12,1); tree rep.1930000 = ((((9,2),3),(5,(((13,7),4),14))),(12,(((6,(15,11)),10),8)),1); tree rep.1940000 = (12,((((9,2),3),(5,(((13,7),4),14))),(10,((6,(11,15)),8))),1); tree rep.1950000 = ((((((13,7),(5,4)),((2,9),3)),14),(10,(8,((11,15),6)))),12,1); tree rep.1960000 = (12,(((3,(2,9)),((14,4),((13,7),5))),(((11,(6,15)),10),8)),1); tree rep.1970000 = (12,(((((7,13),(14,5)),4),(3,(2,9))),((10,8),((15,6),11))),1); tree rep.1980000 = ((((6,11),15),(8,10)),(((3,(2,9)),(5,(4,(14,(13,7))))),12),1); tree rep.1990000 = (((8,(10,((15,6),11))),((3,(2,9)),((5,14),((13,7),4)))),12,1); tree rep.2000000 = ((((6,(11,15)),(8,10)),(5,(((((2,9),3),4),14),(7,13)))),12,1); tree rep.2010000 = ((((10,8),(11,(15,6))),((((4,(13,7)),5),14),((2,9),3))),12,1); tree rep.2020000 = (12,(5,(((6,(11,15)),(10,8)),((3,(9,2)),(((13,7),14),4)))),1); tree rep.2030000 = (12,(((((15,11),6),8),10),((((4,(13,7)),14),5),(3,(2,9)))),1); tree rep.2040000 = (8,(((15,11),6),(((((3,(2,9)),((4,14),(13,7))),5),12),10)),1); tree rep.2050000 = (((((15,11),6),(((((7,13),4),14),((2,9),3)),5)),(10,8)),12,1); tree rep.2060000 = ((((8,(11,(15,6))),10),((3,(2,9)),((14,((7,13),4)),5))),12,1); tree rep.2070000 = (12,(((5,((3,(2,9)),14)),(4,(13,7))),((8,((11,15),6)),10)),1); tree rep.2080000 = (12,(((15,6),11),((10,8),((4,(13,7)),((9,2),((14,5),3))))),1); tree rep.2090000 = (12,((((((7,13),4),((9,2),3)),5),14),(((15,11),6),(10,8))),1); tree rep.2100000 = (((9,2),(((((8,10),(6,(15,11))),(((13,7),4),14)),5),3)),12,1); tree rep.2110000 = ((((14,(7,(13,4))),(((2,9),3),5)),((10,8),((11,15),6))),12,1); tree rep.2120000 = (12,((((8,10),(6,(11,15))),(((7,13),4),(5,14))),(3,(9,2))),1); tree rep.2130000 = (12,(((5,(3,(((7,13),4),14))),(9,2)),(((15,(6,11)),8),10)),1); tree rep.2140000 = (12,(((10,8),(6,(11,15))),((7,13),(4,((((2,9),3),5),14)))),1); tree rep.2150000 = (12,((((6,15),11),(10,8)),(((14,(4,(7,13))),(3,(2,9))),5)),1); tree rep.2160000 = ((((((4,14),5),(7,13)),((2,9),3)),((8,10),(11,(15,6)))),12,1); tree rep.2170000 = ((((((13,7),4),14),5),(3,(2,9))),(12,((11,(15,6)),(10,8))),1); tree rep.2180000 = ((12,(((3,(9,2)),((4,(13,7)),14)),5)),((10,(6,(15,11))),8),1); tree rep.2190000 = ((((8,((3,(2,9)),(5,((4,(13,7)),14)))),10),(11,(15,6))),12,1); tree rep.2200000 = (12,(((9,2),3),((((8,10),((15,11),6)),(14,((13,4),7))),5)),1); tree rep.2210000 = ((12,((((15,6),11),8),10)),(((2,9),3),(5,(14,(4,(13,7))))),1); tree rep.2220000 = (((5,(12,((2,9),3))),((4,(13,7)),14)),(((15,11),6),(10,8)),1); tree rep.2230000 = (((5,((4,(14,(13,7))),((9,2),3))),((((15,6),11),8),10)),12,1); tree rep.2240000 = (12,((((11,(6,15)),10),8),((5,(3,(9,2))),(((13,7),4),14))),1); tree rep.2250000 = ((((((3,2),9),(14,((13,7),4))),5),12),((8,10),((6,15),11)),1); tree rep.2260000 = ((((8,10),(11,(15,6))),(((3,(9,2)),4),(5,((14,7),13)))),12,1); tree rep.2270000 = (((8,10),(11,(6,15))),(((((14,4),(13,7)),5),(3,(2,9))),12),1); tree rep.2280000 = (((((6,(11,15)),8),10),(((2,9),((14,5),((13,7),4))),3)),12,1); tree rep.2290000 = (12,(((14,(4,(7,13))),((9,2),3)),(((10,8),(11,(6,15))),5)),1); tree rep.2300000 = (12,((((4,(14,(13,7))),(3,(2,9))),5),((11,(15,6)),(10,8))),1); tree rep.2310000 = (12,(((4,((13,7),(5,14))),((2,9),3)),((6,(11,15)),(10,8))),1); tree rep.2320000 = ((((4,(7,13)),(((3,(9,2)),((10,8),(11,(15,6)))),14)),5),12,1); tree rep.2330000 = (12,((4,(13,7)),(((5,((9,2),3)),14),(((6,(11,15)),8),10))),1); tree rep.2340000 = (12,((((3,(9,2)),5),(14,((7,13),4))),((8,10),(15,(6,11)))),1); tree rep.2350000 = (12,(((4,((13,7),14)),(5,((2,9),3))),((10,8),((11,6),15))),1); tree rep.2360000 = (((((6,15),11),(10,8)),(5,(14,((4,(13,7)),((2,9),3))))),12,1); tree rep.2370000 = (12,(((13,7),(5,((14,4),((10,8),((15,11),6))))),(3,(9,2))),1); tree rep.2380000 = (((6,(15,11)),(8,10)),(12,((5,(14,(7,(4,13)))),(3,(2,9)))),1); tree rep.2390000 = ((((10,8),((6,15),11)),(((14,5),((7,13),4)),(3,(2,9)))),12,1); tree rep.2400000 = ((((10,8),((11,15),6)),((5,14),((4,(7,13)),((9,2),3)))),12,1); tree rep.2410000 = (((8,((11,(15,6)),10)),12),(((5,14),((9,2),3)),((7,13),4)),1); tree rep.2420000 = (12,((((13,7),(4,14)),((((15,6),11),(8,10)),5)),(3,(9,2))),1); tree rep.2430000 = (((((5,14),(4,(13,7))),((9,2),3)),(8,(10,((11,15),6)))),12,1); tree rep.2440000 = ((((13,((14,7),4)),(((9,2),3),5)),12),((10,8),(11,(6,15))),1); tree rep.2450000 = ((((((6,15),11),8),10),((3,(9,2)),(((5,14),4),(7,13)))),12,1); tree rep.2460000 = ((((5,(((7,14),4),13)),((9,2),3)),((10,(15,(11,6))),8)),12,1); tree rep.2470000 = ((((5,14),(7,13)),(((9,2),3),4)),((((6,(15,11)),8),10),12),1); tree rep.2480000 = (((14,((3,(9,2)),(5,(4,(7,13))))),(((15,11),6),(8,10))),12,1); tree rep.2490000 = (12,((((8,((15,(11,6)),10)),(((7,13),4),14)),5),((9,2),3)),1); tree rep.2500000 = (12,(((((9,2),3),5),(14,((13,7),4))),((15,(11,6)),(10,8))),1); tree rep.2510000 = ((6,(15,11)),(8,(10,(12,((5,(14,(4,(7,13)))),(3,(2,9)))))),1); tree rep.2520000 = ((((10,((11,15),6)),8),(((2,9),3),(5,(14,(4,(7,13)))))),12,1); tree rep.2530000 = (14,(((4,(12,(3,(9,2)))),((13,7),5)),((8,10),((11,6),15))),1); tree rep.2540000 = ((((8,(11,(6,15))),10),((4,(13,7)),((3,(2,9)),(14,5)))),12,1); tree rep.2550000 = ((((5,14),(((13,7),4),((9,2),3))),(((15,6),11),(10,8))),12,1); tree rep.2560000 = (12,(((11,15),6),(8,(10,((((7,13),5),(14,4)),((9,2),3))))),1); tree rep.2570000 = (((14,(((13,7),4),5)),((9,2),3)),(12,((11,(6,15)),(10,8))),1); tree rep.2580000 = ((((8,10),((6,15),11)),(3,((9,2),(((14,4),(7,13)),5)))),12,1); tree rep.2590000 = (12,(((10,(11,(15,6))),8),((14,((3,(9,2)),5)),((13,7),4))),1); tree rep.2600000 = ((((10,8),(6,(15,11))),(5,(((13,7),(14,4)),(3,(9,2))))),12,1); tree rep.2610000 = (((8,(((14,(4,(7,13))),(5,(3,(9,2)))),10)),(6,(11,15))),12,1); tree rep.2620000 = (12,(((10,8),(11,(6,15))),((5,(7,13)),(((2,9),3),(4,14)))),1); tree rep.2630000 = ((((2,9),3),((5,14),(4,(13,7)))),((10,(8,((11,15),6))),12),1); tree rep.2640000 = (((10,8),((11,15),6)),(((((7,13),14),4),(((9,2),3),5)),12),1); tree rep.2650000 = (12,(((5,((13,7),4)),(((2,9),3),14)),((8,(11,(6,15))),10)),1); tree rep.2660000 = (12,(((14,((7,13),4)),(5,(3,(2,9)))),(8,((15,(6,11)),10))),1); tree rep.2670000 = ((((8,10),((6,15),11)),(((4,(7,13)),((3,(2,9)),5)),14)),12,1); tree rep.2680000 = (((8,10),((15,6),11)),((((((2,9),3),5),14),(4,(7,13))),12),1); tree rep.2690000 = ((((((14,4),(7,13)),5),(3,(9,2))),(8,((6,(15,11)),10))),12,1); tree rep.2700000 = (((5,(((7,13),4),14)),(3,(9,2))),(12,(((11,(15,6)),10),8)),1); tree rep.2710000 = ((((6,(11,15)),8),10),(((14,5),(((9,2),3),((13,7),4))),12),1); tree rep.2720000 = (((((10,8),(11,(15,6))),((2,9),3)),(4,(5,((7,13),14)))),12,1); tree rep.2730000 = (((10,((15,6),11)),8),(12,(5,((((4,14),7),13),(3,(2,9))))),1); tree rep.2740000 = (12,((((11,15),6),(10,8)),((5,4),((13,7),(14,(3,(2,9)))))),1); tree rep.2750000 = ((((8,10),((15,11),6)),12),(((2,9),3),(((7,13),4),(5,14))),1); tree rep.2760000 = (((((5,14),(3,(2,9))),((13,7),4)),((8,(11,(15,6))),10)),12,1); tree rep.2770000 = (12,((4,((5,(14,((9,2),3))),(7,13))),((8,(11,(6,15))),10)),1); tree rep.2780000 = (12,((3,(9,2)),((7,(4,13)),(((8,((15,6),11)),10),(5,14)))),1); tree rep.2790000 = (12,((10,((11,(15,6)),8)),((4,((14,5),(7,13))),(3,(9,2)))),1); tree rep.2800000 = (((((11,(15,6)),8),10),((4,((14,5),(13,7))),(3,(2,9)))),12,1); tree rep.2810000 = (((12,((9,2),3)),(5,((11,(15,6)),(10,8)))),((4,14),(7,13)),1); tree rep.2820000 = ((((6,(11,15)),(10,8)),((5,((2,9),3)),((13,7),(4,14)))),12,1); tree rep.2830000 = ((((10,8),(11,(15,6))),((4,((13,7),((9,2),3))),(14,5))),12,1); tree rep.2840000 = (((5,((((2,9),3),14),(4,(13,7)))),(10,(8,(6,(15,11))))),12,1); tree rep.2850000 = ((((((13,7),(3,(2,9))),(14,5)),4),(((11,15),6),(10,8))),12,1); tree rep.2860000 = (12,((5,(((14,(13,7)),4),(3,(2,9)))),((6,(15,11)),(10,8))),1); tree rep.2870000 = (((5,((((13,7),4),((2,9),3)),14)),((10,((15,6),11)),8)),12,1); tree rep.2880000 = ((((10,8),((11,15),6)),((14,(((9,2),3),(4,5))),(7,13))),12,1); tree rep.2890000 = (12,((((3,(2,9)),(14,((13,7),4))),5),((11,(6,15)),(8,10))),1); tree rep.2900000 = ((((((7,13),4),(5,14)),(3,(2,9))),((((6,15),11),10),8)),12,1); tree rep.2910000 = (12,(5,(((7,13),4),((14,((9,2),3)),((11,(6,15)),(10,8))))),1); tree rep.2920000 = (12,(((((3,(9,2)),(13,7)),4),(5,14)),((8,(11,(6,15))),10)),1); tree rep.2930000 = ((((10,8),(11,(6,15))),((((4,(13,7)),14),5),((2,9),3))),12,1); tree rep.2940000 = (((((2,3),9),(((5,14),(13,7)),4)),(((6,(11,15)),10),8)),12,1); tree rep.2950000 = ((((5,((7,13),(((2,9),3),4))),14),(((11,(6,15)),10),8)),12,1); tree rep.2960000 = ((((10,((11,15),6)),8),(((9,2),3),(((4,(13,7)),14),5))),12,1); tree rep.2970000 = (12,(((3,(9,2)),((5,14),(4,(13,7)))),(8,(10,((15,11),6)))),1); tree rep.2980000 = (12,((((11,(6,15)),10),8),(5,(14,((3,(2,9)),((7,13),4))))),1); tree rep.2990000 = (((5,14),((((2,9),3),4),(7,13))),(((11,(6,15)),(8,10)),12),1); tree rep.3000000 = ((((14,5),(3,(9,2))),(((10,8),(6,(15,11))),(4,(7,13)))),12,1); tree rep.3010000 = (12,((((3,(2,9)),5),((13,7),(14,4))),((8,10),((15,11),6))),1); tree rep.3020000 = ((((6,11),15),(10,8)),(((3,(2,9)),12),(5,((4,(13,7)),14))),1); tree rep.3030000 = (12,(((8,10),(6,(11,15))),((5,((2,9),3)),(((7,13),4),14))),1); tree rep.3040000 = (((((4,(7,13)),14),(5,(3,(9,2)))),((10,8),(15,(6,11)))),12,1); tree rep.3050000 = ((((13,7),4),(5,((((11,15),6),(8,10)),(((2,9),3),14)))),12,1); tree rep.3060000 = (12,(((10,((11,15),6)),8),(4,(((7,13),14),(5,(3,(2,9)))))),1); tree rep.3070000 = ((((6,(15,11)),(8,10)),(((5,(14,4)),(7,13)),((2,9),3))),12,1); tree rep.3080000 = (12,((14,(((5,7),(13,4)),(3,(9,2)))),((10,(6,(15,11))),8)),1); tree rep.3090000 = ((((4,(7,((14,(3,(9,2))),13))),5),(10,((6,(11,15)),8))),12,1); tree rep.3100000 = ((((((7,13),4),(5,14)),((2,9),3)),((((15,6),11),10),8)),12,1); tree rep.3110000 = (((((7,13),((((15,11),6),(10,8)),4)),14),(((9,2),3),5)),12,1); tree rep.3120000 = (((8,(10,(15,(11,6)))),((((2,9),3),5),(4,(14,(7,13))))),12,1); tree rep.3130000 = (((((((13,7),14),4),(3,(9,2))),5),(((11,(6,15)),10),8)),12,1); tree rep.3140000 = (((((9,2),3),((7,13),4)),((((15,11),6),(8,10)),12)),(5,14),1); tree rep.3150000 = ((((14,(7,13)),4),(3,(9,2))),((8,(10,(11,(15,6)))),(5,12)),1); tree rep.3160000 = ((14,(5,(((3,(9,2)),(7,(4,13))),((10,8),((11,15),6))))),12,1); tree rep.3170000 = (12,(((8,10),(6,(11,15))),((5,(14,((13,7),4))),((9,2),3))),1); tree rep.3180000 = ((((9,2),3),(((4,14),(7,13)),5)),(((11,(6,15)),(10,8)),12),1); tree rep.3190000 = (12,((((9,2),3),((4,14),((13,7),5))),((6,(11,15)),(10,8))),1); tree rep.3200000 = ((((3,(9,2)),(((6,15),11),(8,10))),((4,(7,13)),(14,5))),12,1); tree rep.3210000 = (12,((((3,(9,2)),(((7,13),14),4)),5),((8,10),(11,(6,15)))),1); tree rep.3220000 = (((10,8),((11,15),6)),((((3,(9,2)),((4,(13,7)),14)),5),12),1); tree rep.3230000 = (((((15,6),11),(10,8)),(((2,9),(((13,7),4),14)),(5,3))),12,1); tree rep.3240000 = (((5,(8,(10,((6,15),11)))),((3,(9,2)),(14,((13,7),4)))),12,1); tree rep.3250000 = ((12,(((14,((13,7),4)),5),(3,(9,2)))),((10,8),(11,(15,6))),1); tree rep.3260000 = ((((((((9,2),3),5),(4,(13,7))),14),(11,(15,6))),(8,10)),12,1); tree rep.3270000 = (12,((((4,(13,7)),((9,2),3)),(5,14)),((11,(6,15)),(8,10))),1); tree rep.3280000 = (((8,10),((11,15),6)),(((3,(9,2)),((5,14),((13,7),4))),12),1); tree rep.3290000 = ((((14,((13,7),4)),5),((2,9),3)),(12,((11,(6,15)),(10,8))),1); tree rep.3300000 = (((((9,2),3),(5,((4,(13,7)),14))),((6,(11,15)),(8,10))),12,1); tree rep.3310000 = (12,((10,8),(((((4,5),14),(7,13)),(3,(9,2))),((15,11),6))),1); tree rep.3320000 = (((14,((13,7),4)),((((10,8),(6,(11,15))),(3,(9,2))),5)),12,1); tree rep.3330000 = (12,(((((5,((((13,7),4),14),(9,2))),3),10),8),((15,11),6)),1); tree rep.3340000 = ((((14,5),((7,13),4)),(3,((9,2),12))),(((6,15),11),(10,8)),1); tree rep.3350000 = (12,((((9,2),3),((5,14),((13,7),4))),(((6,(15,11)),10),8)),1); tree rep.3360000 = (12,((((((6,15),11),((7,13),(4,14))),(3,(2,9))),5),(10,8)),1); tree rep.3370000 = (((3,(9,2)),(14,(((13,7),5),(4,(((15,11),6),(8,10)))))),12,1); tree rep.3380000 = ((((14,5),((3,(9,2)),((7,13),4))),(10,(8,((6,15),11)))),12,1); tree rep.3390000 = (12,(((10,((15,11),6)),8),((3,((9,2),5)),(14,(4,(13,7))))),1); tree rep.3400000 = (((((4,(13,7)),5),14),((10,(((11,15),6),8)),((2,9),3))),12,1); tree rep.3410000 = (((5,(((2,9),3),(((13,7),4),14))),((11,(6,15)),(8,10))),12,1); tree rep.3420000 = (12,(((14,(5,((13,7),4))),((9,2),3)),(((11,(15,6)),8),10)),1); tree rep.3430000 = (12,((((6,(15,11)),8),10),(((3,(9,2)),5),((4,14),(13,7)))),1); tree rep.3440000 = ((((10,8),(11,(15,6))),(((7,13),4),(14,((3,(9,2)),5)))),12,1); tree rep.3450000 = (12,(((5,(3,(2,9))),(((4,13),7),14)),((8,10),((15,11),6))),1); tree rep.3460000 = ((((6,(11,15)),(8,10)),(((((13,4),7),14),(3,(2,9))),5)),12,1); tree rep.3470000 = ((((10,(6,(11,15))),8),((((13,7),(14,4)),((2,9),3)),5)),12,1); tree rep.3480000 = (((3,(2,9)),12),(((4,((13,7),14)),5),((10,(6,(11,15))),8)),1); tree rep.3490000 = (12,((((9,2),3),(5,(4,(14,(7,13))))),(10,(8,((11,15),6)))),1); tree rep.3500000 = (12,(((8,10),((6,15),11)),((3,(9,2)),((5,(4,(7,13))),14))),1); tree rep.3510000 = (12,((5,(3,(2,9))),((4,(14,(7,13))),(8,(10,((11,15),6))))),1); tree rep.3520000 = (((5,((3,(9,2)),(14,((7,4),13)))),(10,(((11,15),6),8))),12,1); tree rep.3530000 = ((((8,10),((15,11),6)),12),((5,(4,((7,13),14))),(3,(9,2))),1); tree rep.3540000 = (12,(((((2,9),3),5),(14,((7,13),4))),(10,(8,(11,(15,6))))),1); tree rep.3550000 = (((((5,14),(4,(13,7))),((9,2),3)),((8,((6,15),11)),10)),12,1); tree rep.3560000 = ((((10,(11,(15,6))),8),(4,(((13,7),(3,(2,9))),(14,5)))),12,1); tree rep.3570000 = (((3,(2,9)),(5,(14,(13,(4,7))))),((((15,(6,11)),8),10),12),1); tree rep.3580000 = (((((9,2),3),(((4,(7,13)),((8,((15,11),6)),10)),5)),14),12,1); tree rep.3590000 = (12,(((5,((4,(13,7)),14)),((2,9),3)),(10,(((6,15),11),8))),1); tree rep.3600000 = (12,((((14,5),(4,(13,7))),((2,9),3)),((((6,15),11),8),10)),1); tree rep.3610000 = ((((((11,15),6),10),8),((5,(3,(2,9))),((4,(13,7)),14))),12,1); tree rep.3620000 = (12,(((10,8),(6,(11,15))),(((7,13),14),(((9,2),3),(5,4)))),1); tree rep.3630000 = (12,(((((13,7),(4,14)),5),(8,(10,((6,15),11)))),(3,(2,9))),1); tree rep.3640000 = ((((6,(15,11)),(10,8)),(4,(((13,7),(5,14)),(3,(2,9))))),12,1); tree rep.3650000 = (12,((14,(((10,8),(11,(15,6))),((7,13),5))),((3,(2,9)),4)),1); tree rep.3660000 = ((((((6,15),11),10),8),((5,(((13,7),4),14)),(3,(9,2)))),12,1); tree rep.3670000 = ((((15,6),11),(10,(8,(5,((((7,13),14),4),(3,(9,2))))))),12,1); tree rep.3680000 = ((8,10),((5,((((9,2),3),12),(14,((13,7),4)))),((15,6),11)),1); tree rep.3690000 = (((5,((((13,7),4),(3,(9,2))),14)),((10,8),((6,15),11))),12,1); tree rep.3700000 = (((((3,(9,2)),((5,14),(7,13))),4),((10,8),(6,(15,11)))),12,1); tree rep.3710000 = (12,((((11,(6,15)),8),10),(5,((((7,13),4),14),((9,2),3)))),1); tree rep.3720000 = ((((13,4),((7,((2,9),3)),(14,5))),((10,8),(11,(15,6)))),12,1); tree rep.3730000 = (12,((((15,11),6),(10,8)),((14,(5,(13,(7,4)))),(3,(2,9)))),1); tree rep.3740000 = (((5,((14,((13,7),4)),(3,(9,2)))),((10,8),(11,(6,15)))),12,1); tree rep.3750000 = (12,((((13,7),(5,((9,2),3))),(14,4)),((11,(6,15)),(10,8))),1); tree rep.3760000 = (((((4,(7,13)),14),((3,(9,2)),5)),((8,10),(11,(6,15)))),12,1); tree rep.3770000 = (13,(7,((3,(2,9)),(14,(((12,((10,8),((15,6),11))),4),5)))),1); tree rep.3780000 = (((((2,9),3),(13,(4,7))),(14,5)),(12,(((11,(15,6)),10),8)),1); tree rep.3790000 = (12,(((((4,(13,7)),14),(5,(3,(2,9)))),(11,(15,6))),(10,8)),1); tree rep.3800000 = ((((3,(2,9)),(((4,13),7),(5,14))),12),(10,((6,(11,15)),8)),1); tree rep.3810000 = (12,((8,(10,(6,(11,15)))),(((2,9),3),((4,((13,7),14)),5))),1); tree rep.3820000 = (((5,(((14,(13,7)),4),((9,2),3))),((8,10),(11,(15,6)))),12,1); tree rep.3830000 = ((((10,8),((6,15),11)),((4,(13,7)),(((2,9),3),(14,5)))),12,1); tree rep.3840000 = (12,(((((9,2),(14,5)),(((11,(15,6)),10),8)),(4,(7,13))),3),1); tree rep.3850000 = (12,(((14,5),(3,((9,2),(4,(7,13))))),(((15,11),6),(10,8))),1); tree rep.3860000 = (12,(((10,8),((15,11),6)),(((14,(4,(7,13))),5),((2,9),3))),1); tree rep.3870000 = (12,(((14,((13,7),4)),(5,((2,9),3))),(((11,(15,6)),8),10)),1); tree rep.3880000 = ((((((8,10),(11,(15,6))),5),(14,(4,(13,7)))),((2,9),3)),12,1); tree rep.3890000 = (((((11,(15,6)),(8,10)),((9,2),3)),((14,4),((13,7),5))),12,1); tree rep.3900000 = (((((6,11),15),(10,8)),((5,((4,(13,7)),14)),(3,(9,2)))),12,1); tree rep.3910000 = (((5,(((8,10),(11,(15,6))),(((2,9),3),((7,4),13)))),14),12,1); tree rep.3920000 = (12,(((((15,6),11),10),8),((((7,13),4),(5,14)),((9,2),3))),1); tree rep.3930000 = (12,((9,2),((((10,8),(11,(15,6))),(3,5)),((14,(13,7)),4))),1); tree rep.3940000 = (12,(((3,((2,9),5)),(4,((7,14),13))),(((11,(15,6)),8),10)),1); tree rep.3950000 = (12,(((10,(11,(15,6))),8),(((13,(7,(14,4))),(3,(2,9))),5)),1); tree rep.3960000 = (12,((((((13,7),4),(5,14)),3),(9,2)),((8,10),((11,15),6))),1); tree rep.3970000 = ((((14,(4,(13,7))),((3,(9,2)),5)),((((6,15),11),8),10)),12,1); tree rep.3980000 = (((((14,5),((7,13),4)),(3,(2,9))),((10,8),((11,15),6))),12,1); tree rep.3990000 = (((5,(14,((13,7),4))),(((2,9),3),12)),(10,(8,(11,(6,15)))),1); tree rep.4000000 = (12,((4,(((7,13),((2,9),3)),(14,5))),(((11,(6,15)),10),8)),1); tree rep.4010000 = ((12,(14,(5,((3,(2,9)),((7,13),4))))),(((15,11),6),(8,10)),1); tree rep.4020000 = (12,(((14,((5,(3,(9,2))),(7,13))),4),(((6,(15,11)),8),10)),1); tree rep.4030000 = (12,((((10,8),(6,(15,11))),5),(((9,2),3),(14,(4,(7,13))))),1); tree rep.4040000 = (((((14,5),((9,2),3)),((13,7),4)),12),((10,8),(6,(11,15))),1); tree rep.4050000 = (12,(((14,(((11,15),6),(10,8))),(7,13)),((5,(3,(2,9))),4)),1); tree rep.4060000 = ((((4,(((14,13),7),5)),(3,(9,2))),(((11,(15,6)),8),10)),12,1); tree rep.4070000 = (12,(((5,((7,(4,13)),14)),((9,2),3)),((6,(11,15)),(8,10))),1); tree rep.4080000 = (12,((((((15,11),6),(8,10)),((3,(9,2)),((13,7),4))),5),14),1); tree rep.4090000 = ((((((13,7),5),4),((3,14),(9,2))),(8,(10,(11,(6,15))))),12,1); tree rep.4100000 = (12,(((((4,((3,(9,2)),5)),((7,13),14)),10),8),((11,15),6)),1); tree rep.4110000 = (((((15,11),6),10),8),(((5,(14,(4,(7,13)))),(3,(9,2))),12),1); tree rep.4120000 = (12,((((11,(6,15)),10),8),((((9,2),3),(14,((7,13),4))),5)),1); tree rep.4130000 = (12,((((2,9),3),(8,(((6,15),11),10))),(5,((4,14),(13,7)))),1); tree rep.4140000 = ((((13,7),4),((12,(3,(2,9))),(5,14))),(10,((6,(15,11)),8)),1); tree rep.4150000 = ((((14,((13,7),4)),((9,2),3)),5),(8,((6,(15,11)),(10,12))),1); tree rep.4160000 = (((13,7),4),(((14,5),((2,9),(12,3))),((11,(15,6)),(10,8))),1); tree rep.4170000 = ((5,((3,(2,9)),((14,(13,7)),4))),(12,((6,(15,11)),(10,8))),1); tree rep.4180000 = ((((2,9),3),(((4,(13,7)),14),((10,(8,((15,11),6))),5))),12,1); tree rep.4190000 = ((((14,5),((7,13),4)),(3,(9,2))),((((15,6),11),(8,10)),12),1); tree rep.4200000 = (12,((((8,10),(6,(11,15))),(3,(2,9))),((((13,7),14),4),5)),1); tree rep.4210000 = (12,((((10,8),(6,(15,11))),(14,(4,((7,13),(3,(2,9)))))),5),1); tree rep.4220000 = (((8,(((15,11),6),10)),((5,((7,13),4)),(14,((9,2),3)))),12,1); tree rep.4230000 = (12,(((5,((2,9),3)),(14,((13,7),4))),((8,(11,(15,6))),10)),1); tree rep.4240000 = (((((4,(7,13)),((9,2),3)),(14,5)),((10,8),(11,(6,15)))),12,1); tree rep.4250000 = (12,((((3,(9,2)),5),(14,(4,(7,13)))),(((15,6),11),(8,10))),1); tree rep.4260000 = (((8,(6,(11,15))),10),(12,(4,((7,13),((5,14),(3,(2,9)))))),1); tree rep.4270000 = (12,((((3,(9,2)),5),((13,7),(14,4))),(((15,6),11),(10,8))),1); tree rep.4280000 = ((((((15,6),11),10),8),(((7,13),((2,9),3)),(4,(14,5)))),12,1); tree rep.4290000 = ((((((2,9),3),14),(5,((13,7),4))),(8,((6,(15,11)),10))),12,1); tree rep.4300000 = (12,(((8,10),(11,(6,15))),(((((2,9),(3,(13,7))),5),14),4)),1); tree rep.4310000 = (12,(((5,((4,(7,13)),14)),(3,(9,2))),((10,(11,(15,6))),8)),1); tree rep.4320000 = (((8,(10,(6,(11,15)))),((((9,2),3),(4,(5,(7,13)))),14)),12,1); tree rep.4330000 = ((((8,10),((6,15),11)),(((5,(3,(9,2))),((4,7),13)),14)),12,1); tree rep.4340000 = (12,(((3,(2,9)),(((13,7),5),(4,14))),(8,(10,(11,(15,6))))),1); tree rep.4350000 = ((((5,(3,(2,9))),(14,(4,(13,7)))),12),((8,((6,15),11)),10),1); tree rep.4360000 = ((((10,8),((15,6),11)),((((14,4),(13,7)),5),(3,(2,9)))),12,1); tree rep.4370000 = (12,(((5,(3,(2,9))),(4,((13,7),14))),(((15,6),11),(8,10))),1); tree rep.4380000 = (((((13,(7,4)),14),(((2,9),3),5)),12),((((15,6),11),10),8),1); tree rep.4390000 = (12,((((15,11),6),(10,8)),((((9,2),3),((4,14),(7,13))),5)),1); tree rep.4400000 = (12,(((4,(14,5)),(((9,2),3),(7,13))),(10,(8,(6,(15,11))))),1); tree rep.4410000 = ((((((5,14),(13,7)),((9,2),3)),4),(8,(10,(11,(15,6))))),12,1); tree rep.4420000 = (12,(((8,10),(6,(11,15))),((4,((7,13),14)),(5,(3,(2,9))))),1); tree rep.4430000 = (((((15,6),11),(10,8)),(((5,((9,2),3)),(4,(7,13))),14)),12,1); tree rep.4440000 = (((((2,9),3),(5,(14,(13,(7,4))))),(10,(8,(11,(15,6))))),12,1); tree rep.4450000 = (((((6,(11,15)),10),8),(((3,(2,9)),((5,4),14)),(13,7))),12,1); tree rep.4460000 = ((12,((8,10),((11,6),15))),((5,(14,(4,(7,13)))),((9,2),3)),1); tree rep.4470000 = (12,((((11,15),6),(10,8)),(((3,(2,9)),((4,14),(7,13))),5)),1); tree rep.4480000 = ((((((10,((6,15),11)),8),((13,7),4)),5),((3,(9,2)),14)),12,1); tree rep.4490000 = (((6,(11,15)),(8,10)),(12,((4,(13,7)),((14,5),((9,2),3)))),1); tree rep.4500000 = ((((((15,11),6),10),8),(((4,(7,13)),14),(((2,9),3),5))),12,1); tree rep.4510000 = (((3,(2,9)),((5,14),((7,13),4))),(12,((8,((11,15),6)),10)),1); tree rep.4520000 = (12,((10,((11,(6,15)),8)),(((14,(13,7)),4),((3,(9,2)),5))),1); tree rep.4530000 = (12,(((8,((6,15),11)),10),((4,(5,(14,(3,(2,9))))),(7,13))),1); tree rep.4540000 = ((((8,10),((15,6),11)),((14,((7,13),4)),(5,(3,(2,9))))),12,1); tree rep.4550000 = (12,((((14,(4,(13,7))),(3,(9,2))),5),((((11,6),15),10),8)),1); tree rep.4560000 = (12,((((6,15),11),(10,8)),((((2,9),3),((7,13),4)),(5,14))),1); tree rep.4570000 = (12,((((7,13),((2,9),3)),((4,14),5)),(((15,11),6),(10,8))),1); tree rep.4580000 = ((12,(((4,((9,2),3)),5),(14,(7,13)))),((8,10),((11,15),6)),1); tree rep.4590000 = (((5,((14,(4,(7,13))),(3,(9,2)))),12),((10,8),(11,(6,15))),1); tree rep.4600000 = (12,((8,10),(((14,5),(4,(13,7))),((2,9),((11,(6,15)),3)))),1); tree rep.4610000 = (12,((((4,14),(13,7)),(5,((9,2),3))),((8,10),(6,(11,15)))),1); tree rep.4620000 = (((((4,(7,13)),(14,5)),((9,2),3)),(((11,(15,6)),10),8)),12,1); tree rep.4630000 = (12,((((11,15),6),(10,8)),((((4,(13,7)),14),5),((9,2),3))),1); tree rep.4640000 = (12,((((3,(9,2)),5),((14,4),(7,13))),(((15,11),6),(10,8))),1); tree rep.4650000 = (12,(((2,9),3),((13,7),((14,4),(((10,8),(11,(15,6))),5)))),1); tree rep.4660000 = ((((14,(4,(7,13))),((5,(9,2)),3)),12),((10,8),((15,6),11)),1); tree rep.4670000 = (12,((((3,9),2),(5,(((7,13),4),14))),((10,8),((6,15),11))),1); tree rep.4680000 = ((7,(4,13)),(14,((((10,(11,(6,15))),8),12),(5,((2,9),3)))),1); tree rep.4690000 = (12,(((15,11),6),((((3,(9,2)),(5,((4,(13,7)),14))),10),8)),1); tree rep.4700000 = (12,((10,(((11,15),6),8)),(5,((3,(2,9)),((4,(13,7)),14)))),1); tree rep.4710000 = (12,((4,(7,13)),(((((10,(11,(6,15))),8),14),5),((9,2),3))),1); tree rep.4720000 = (((((3,(2,9)),5),(14,(4,(13,7)))),(8,((15,(11,6)),10))),12,1); tree rep.4730000 = (12,(((((3,(9,2)),(14,(7,13))),5),(10,(8,(6,(15,11))))),4),1); tree rep.4740000 = ((((4,((7,13),14)),5),(((9,2),3),12)),(8,((11,(6,15)),10)),1); tree rep.4750000 = (((((15,11),6),(10,8)),((5,((((9,2),3),14),(13,7))),4)),12,1); tree rep.4760000 = ((((8,(6,(15,11))),10),((14,(5,(3,(9,2)))),(4,(13,7)))),12,1); tree rep.4770000 = (12,((8,((6,(15,11)),10)),((((13,7),14),4),(5,(3,(2,9))))),1); tree rep.4780000 = ((5,(((4,(13,7)),((((15,6),11),(8,10)),12)),14)),(3,(9,2)),1); tree rep.4790000 = (((((4,14),(13,7)),(5,(3,(2,9)))),((8,10),(11,(6,15)))),12,1); tree rep.4800000 = (12,((5,(((((6,(11,15)),10),8),(3,(9,2))),(4,(13,7)))),14),1); tree rep.4810000 = (((10,((6,(11,15)),8)),(((5,4),(((2,9),(7,13)),3)),14)),12,1); tree rep.4820000 = ((((6,11),15),(10,8)),((((4,(14,(13,7))),5),((2,9),3)),12),1); tree rep.4830000 = ((((14,((13,7),((3,(9,2)),5))),4),12),(10,((6,(11,15)),8)),1); tree rep.4840000 = ((((((4,(7,13)),14),(3,(9,2))),5),12),(10,(((6,15),11),8)),1); tree rep.4850000 = (12,(((6,(11,15)),(10,8)),(((2,9),3),(5,((4,(13,7)),14)))),1); tree rep.4860000 = (5,((((9,2),3),(14,(4,(13,7)))),(12,((((6,15),11),10),8))),1); tree rep.4870000 = ((((10,8),(11,(6,15))),(5,(((2,9),3),(4,((7,13),14))))),12,1); tree rep.4880000 = (12,((((3,(2,9)),(((7,13),4),5)),14),((10,(11,(6,15))),8)),1); tree rep.4890000 = (12,(((8,10),((11,15),6)),((4,((13,14),7)),(((2,9),3),5))),1); tree rep.4900000 = ((((5,((4,(13,7)),14)),((9,2),3)),((8,10),((15,11),6))),12,1); tree rep.4910000 = (12,(((2,9),(3,(((4,14),5),(13,7)))),((10,((15,6),11)),8)),1); tree rep.4920000 = (12,(((10,((11,15),6)),8),((((9,2),(13,7)),((5,14),4)),3)),1); tree rep.4930000 = (12,(((((15,11),6),10),8),(((4,((9,2),3)),((7,13),14)),5)),1); tree rep.4940000 = (((((4,5),((9,2),3)),((13,7),14)),((8,10),(6,(15,11)))),12,1); tree rep.4950000 = ((((3,((9,2),(14,5))),(4,(7,13))),(((11,15),6),(10,8))),12,1); tree rep.4960000 = ((8,(10,((6,15),11))),(12,(4,((5,(14,(7,13))),(3,(9,2))))),1); tree rep.4970000 = (12,(5,((((4,(13,7)),14),((9,2),3)),(((15,6),11),(10,8)))),1); tree rep.4980000 = (12,((((6,(15,11)),8),10),((((13,7),(4,14)),5),((9,2),3))),1); tree rep.4990000 = ((((4,((9,2),3)),((7,13),(5,14))),(8,((15,(11,6)),10))),12,1); tree rep.5000000 = (12,(((10,8),((11,6),15)),(((7,13),4),(((9,2),3),(14,5)))),1); tree rep.5010000 = ((((3,(9,2)),(4,((7,13),(5,14)))),((10,8),(11,(15,6)))),12,1); tree rep.5020000 = (12,(((5,((3,(2,9)),((7,13),4))),14),((8,((6,15),11)),10)),1); tree rep.5030000 = (((((4,(7,13)),(5,14)),((2,9),3)),(8,((11,(6,15)),10))),12,1); tree rep.5040000 = (((8,10),(11,(6,15))),(12,((((7,13),(14,4)),(3,(9,2))),5)),1); tree rep.5050000 = (12,(((11,(15,6)),(10,8)),((7,13),(4,((14,5),(3,(9,2)))))),1); tree rep.5060000 = (12,((((5,14),((4,(13,7)),(2,9))),3),(((11,(15,6)),8),10)),1); tree rep.5070000 = (((5,((7,13),((14,4),((9,2),3)))),(10,(8,(6,(15,11))))),12,1); tree rep.5080000 = (12,(((14,(((7,13),5),4)),((2,9),3)),((10,8),((15,11),6))),1); tree rep.5090000 = (12,(((8,(6,(15,11))),10),((3,(2,9)),((13,((7,14),4)),5))),1); tree rep.5100000 = (((8,(((15,11),6),10)),(5,(((2,9),3),(14,(4,(7,13)))))),12,1); tree rep.5110000 = ((((9,3),2),((((7,13),4),14),(((8,10),((6,11),15)),5))),12,1); tree rep.5120000 = (12,(((((8,10),((15,6),11)),((2,9),3)),(4,(7,13))),(14,5)),1); tree rep.5130000 = (12,(((((8,10),((6,15),11)),5),14),(((13,7),4),((2,9),3))),1); tree rep.5140000 = ((9,2),((12,((14,((4,(7,13)),(8,(10,(11,(6,15)))))),5)),3),1); tree rep.5150000 = ((((6,(15,11)),(10,8)),((3,(9,2)),(5,(14,((7,4),13))))),12,1); tree rep.5160000 = ((((5,(3,(2,9))),(((13,7),4),14)),(((11,(15,6)),8),10)),12,1); tree rep.5170000 = (((5,((3,(9,2)),(((15,6),11),(10,8)))),(((7,13),14),4)),12,1); tree rep.5180000 = (5,((((8,((15,6),11)),10),12),((3,(2,9)),(14,((7,13),4)))),1); tree rep.5190000 = ((((11,(6,15)),(8,10)),((3,(9,2)),(5,((4,14),(13,7))))),12,1); tree rep.5200000 = ((((((15,6),11),10),8),((3,((13,(7,4)),(5,14))),(2,9))),12,1); tree rep.5210000 = (((((7,13),((14,5),(3,(9,2)))),4),(8,((11,(15,6)),10))),12,1); tree rep.5220000 = (12,(((((15,6),11),8),10),((((9,2),3),14),(((13,7),4),5))),1); tree rep.5230000 = (12,((((6,(11,15)),8),10),((9,2),((3,5),((7,13),(4,14))))),1); tree rep.5240000 = ((((4,(7,13)),(((9,2),3),5)),14),((6,(11,15)),(12,(10,8))),1); tree rep.5250000 = (12,(((8,10),((6,15),11)),((14,((13,7),(5,4))),(9,(3,2)))),1); tree rep.5260000 = (12,(((((7,13),4),14),((3,(2,9)),5)),((15,(11,6)),(8,10))),1); tree rep.5270000 = ((12,(((14,4),(13,7)),(5,(3,(2,9))))),((10,8),(6,(15,11))),1); tree rep.5280000 = ((((10,((15,6),11)),8),(((5,(14,4)),(13,7)),((9,2),3))),12,1); tree rep.5290000 = ((12,((((2,9),3),5),(14,((13,4),7)))),((10,(11,(6,15))),8),1); tree rep.5300000 = (((((11,(15,6)),8),10),(5,((4,((2,9),3)),((13,7),14)))),12,1); tree rep.5310000 = (((((15,6),11),(8,10)),(5,((((3,(9,2)),14),4),(13,7)))),12,1); tree rep.5320000 = ((((7,13),(14,((5,4),((10,8),((15,11),6))))),(3,(2,9))),12,1); tree rep.5330000 = (((10,(8,(11,(15,6)))),(((7,13),(9,2)),(3,(14,(4,5))))),12,1); tree rep.5340000 = (12,((10,(8,((6,15),11))),(5,((4,(13,7)),(((9,2),3),14)))),1); tree rep.5350000 = (12,((((14,(4,(13,7))),(3,(2,9))),5),(((11,15),6),(10,8))),1); tree rep.5360000 = ((((((((15,11),6),(10,8)),((7,13),4)),(3,(9,2))),14),5),12,1); tree rep.5370000 = (4,(((5,(7,13)),((10,(((11,15),6),8)),(12,(3,(2,9))))),14),1); tree rep.5380000 = (((5,(((9,2),3),(((7,13),4),14))),((6,(15,11)),(10,8))),12,1); tree rep.5390000 = (12,((((4,(7,13)),14),((3,(2,9)),5)),(10,((11,(6,15)),8))),1); tree rep.5400000 = ((((((14,(7,13)),4),(3,(9,2))),5),((10,(6,(11,15))),8)),12,1); tree rep.5410000 = (12,(((10,8),((15,6),11)),(5,(((4,(7,13)),14),((2,9),3)))),1); tree rep.5420000 = ((((3,(2,9)),(14,(4,((7,13),5)))),((8,10),((11,15),6))),12,1); tree rep.5430000 = ((((6,(11,15)),(((((13,7),4),14),5),(3,(9,2)))),(8,10)),12,1); tree rep.5440000 = ((((10,(11,(15,6))),8),((((9,2),(4,(13,7))),3),(14,5))),12,1); tree rep.5450000 = (((5,4),(((13,7),(((10,8),(11,(6,15))),(3,(9,2)))),14)),12,1); tree rep.5460000 = ((8,(((6,15),11),10)),((((14,4),(7,13)),5),(12,(3,(2,9)))),1); tree rep.5470000 = (12,((((15,11),6),(10,8)),((14,(4,(5,(7,13)))),((9,2),3))),1); tree rep.5480000 = (((6,(15,11)),(10,8)),(12,((5,(14,4)),(((2,9),3),(7,13)))),1); tree rep.5490000 = (((10,(8,((11,15),6))),(((4,14),(13,7)),(((2,9),5),3))),12,1); tree rep.5500000 = ((((((7,13),(4,14)),5),((2,9),3)),((8,10),(15,(11,6)))),12,1); tree rep.5510000 = (12,((((((3,(2,9)),14),(7,13)),4),5),((10,8),(6,(11,15)))),1); tree rep.5520000 = (12,((((6,(15,11)),10),8),((14,5),((3,(2,9)),((13,4),7)))),1); tree rep.5530000 = (((((13,7),4),((5,(3,(2,9))),14)),(8,((6,(11,15)),10))),12,1); tree rep.5540000 = (12,((((10,(15,(6,11))),8),(4,(((9,2),3),(14,(7,13))))),5),1); tree rep.5550000 = (((((7,13),4),(((2,9),3),(5,14))),(10,(((15,11),6),8))),12,1); tree rep.5560000 = (12,((10,(8,((15,11),6))),(((3,(2,9)),(5,14)),((13,7),4))),1); tree rep.5570000 = (((((10,8),(6,(15,11))),3),(5,(((7,13),4),((9,2),14)))),12,1); tree rep.5580000 = (((((2,9),3),((((8,((6,15),11)),10),(14,(13,7))),4)),5),12,1); tree rep.5590000 = (12,(((3,(2,9)),(((14,4),(7,13)),5)),(((11,(6,15)),10),8)),1); tree rep.5600000 = (12,((((11,15),6),(10,8)),(5,(((7,13),(14,4)),(3,(2,9))))),1); tree rep.5610000 = ((((14,((13,7),4)),(5,(3,(2,9)))),(10,(8,(6,(11,15))))),12,1); tree rep.5620000 = ((((10,8),((6,15),11)),(((5,(4,(7,13))),14),((2,9),3))),12,1); tree rep.5630000 = (12,((((11,(15,6)),10),8),(((13,7),4),((3,(9,2)),(5,14)))),1); tree rep.5640000 = ((((6,(15,11)),(8,10)),(5,(((13,7),(14,4)),((9,2),3)))),12,1); tree rep.5650000 = (12,(((3,(2,9)),((7,13),((14,4),5))),((10,8),((11,15),6))),1); tree rep.5660000 = (((((4,(7,13)),14),(((2,9),3),5)),(8,(((6,15),11),10))),12,1); tree rep.5670000 = ((12,(5,(((9,2),3),((4,14),(7,13))))),(10,(8,((11,15),6))),1); tree rep.5680000 = ((((6,(11,15)),(10,8)),(5,((((13,7),4),14),(3,(9,2))))),12,1); tree rep.5690000 = (12,(((((7,13),4),14),(((2,9),3),5)),(((6,(15,11)),8),10)),1); tree rep.5700000 = ((14,(((5,((13,7),4)),12),((9,2),3))),(10,(8,(6,(15,11)))),1); tree rep.5710000 = (12,((5,(((7,(14,13)),4),((9,2),3))),((10,8),((15,6),11))),1); tree rep.5720000 = ((((13,7),4),14),(((9,2),3),(((((15,11),6),(8,10)),12),5)),1); tree rep.5730000 = (12,((((5,14),((13,7),4)),(3,(2,9))),(((11,(6,15)),10),8)),1); tree rep.5740000 = (((((7,13),14),((4,(3,(2,9))),5)),((8,10),((15,6),11))),12,1); tree rep.5750000 = (((((2,9),(5,3)),(4,(14,(7,13)))),(10,(((15,11),6),8))),12,1); tree rep.5760000 = ((((8,(11,(15,6))),10),((5,14),((3,(9,2)),(4,(7,13))))),12,1); tree rep.5770000 = (12,((((11,(15,6)),8),10),((((2,9),3),(((4,7),13),14)),5)),1); tree rep.5780000 = (((10,(8,((11,15),6))),((4,((7,13),(14,5))),(3,(9,2)))),12,1); tree rep.5790000 = ((((4,(7,13)),(14,((3,(2,9)),5))),((10,((15,11),6)),8)),12,1); tree rep.5800000 = ((((3,((4,(13,7)),14)),(5,(2,9))),(8,(10,((15,6),11)))),12,1); tree rep.5810000 = (12,(((8,((11,15),6)),10),(((7,13),4),((((2,9),3),14),5))),1); tree rep.5820000 = ((((3,(2,9)),12),((10,8),(6,(15,11)))),(((14,5),4),(7,13)),1); tree rep.5830000 = (((10,8),(11,(6,15))),(12,(((14,5),((4,13),7)),(3,(2,9)))),1); tree rep.5840000 = ((((13,7),(5,(4,(14,(3,(2,9)))))),(10,(((11,15),6),8))),12,1); tree rep.5850000 = (((((3,(9,2)),5),((6,(15,11)),(8,10))),((14,(13,7)),4)),12,1); tree rep.5860000 = (12,((5,(((4,(7,13)),14),((2,9),3))),(10,(((6,11),15),8))),1); tree rep.5870000 = ((5,(((9,2),3),(((7,13),4),14))),(12,((6,(15,11)),(10,8))),1); tree rep.5880000 = (((((2,9),3),(((7,14),(13,4)),5)),(8,(10,(11,(15,6))))),12,1); tree rep.5890000 = (((((6,15),11),10),8),(((14,5),(3,((9,2),12))),((13,7),4)),1); tree rep.5900000 = ((((11,6),15),((5,(((9,2),3),(14,((13,7),4)))),(8,10))),12,1); tree rep.5910000 = ((((8,10),((6,15),11)),(((5,(4,(7,13))),14),((9,2),3))),12,1); tree rep.5920000 = ((((11,(6,15)),(10,8)),((5,((14,(13,7)),4)),(3,(2,9)))),12,1); tree rep.5930000 = ((((4,(3,(2,9))),(((7,13),14),5)),((10,8),((11,15),6))),12,1); tree rep.5940000 = (12,(3,(((5,(9,2)),((13,7),(14,4))),((((15,6),11),10),8))),1); tree rep.5950000 = (((5,14),(((13,7),4),((2,9),3))),(12,((6,(15,11)),(8,10))),1); tree rep.5960000 = (12,(((10,((11,15),6)),8),(((14,5),(4,(13,7))),((9,2),3))),1); tree rep.5970000 = (12,((((9,2),3),((4,(13,7)),(5,14))),((11,(15,6)),(8,10))),1); tree rep.5980000 = (12,(((10,((11,15),6)),8),((7,13),(4,((14,5),(3,(9,2)))))),1); tree rep.5990000 = ((((2,9),3),((5,(14,((10,8),(11,(6,15))))),(4,(13,7)))),12,1); tree rep.6000000 = (12,(((8,10),((15,11),6)),(((2,9),3),((14,((13,7),4)),5))),1); tree rep.6010000 = (12,((10,(8,(15,(6,11)))),((((9,2),3),((13,14),(7,4))),5)),1); tree rep.6020000 = (12,((((5,(2,3)),14),(4,(9,(13,7)))),(8,(((6,15),11),10))),1); tree rep.6030000 = (((((14,(7,13)),4),(5,(3,(2,9)))),((((6,15),11),8),10)),12,1); tree rep.6040000 = ((((4,14),(7,13)),(5,((2,9),3))),((10,((6,(11,15)),8)),12),1); tree rep.6050000 = ((((2,9),(((14,5),(4,(7,13))),3)),(10,((11,(15,6)),8))),12,1); tree rep.6060000 = (12,(((5,((3,(2,9)),(4,(7,13)))),14),((((6,15),11),8),10)),1); tree rep.6070000 = (12,(((3,(9,2)),(((7,13),(4,14)),5)),((15,(11,6)),(10,8))),1); tree rep.6080000 = (((5,(((13,7),(((9,2),3),14)),4)),((8,10),(11,(15,6)))),12,1); tree rep.6090000 = (((8,10),(11,(15,6))),((((9,2),3),(5,((4,(13,7)),14))),12),1); tree rep.6100000 = (12,(((3,(9,2)),((14,5),(4,(7,13)))),(8,(10,(6,(11,15))))),1); tree rep.6110000 = (12,((((9,2),3),(5,(4,((13,7),14)))),((10,8),((11,15),6))),1); tree rep.6120000 = ((((6,(11,15)),10),8),(12,(5,(((2,9),3),(4,(7,(13,14)))))),1); tree rep.6130000 = ((((((13,7),4),((14,5),(3,(2,9)))),8),((6,(15,11)),10)),12,1); tree rep.6140000 = (((8,(((11,15),6),10)),12),((((2,9),3),(14,(4,(13,7)))),5),1); tree rep.6150000 = (12,((((6,15),11),(8,10)),(5,((3,(2,9)),(((13,7),4),14)))),1); tree rep.6160000 = ((10,(((15,11),6),8)),(12,((3,(9,2)),((((13,7),4),5),14))),1); tree rep.6170000 = (((((10,8),(11,(6,15))),(14,((7,13),4))),(((2,9),5),3)),12,1); tree rep.6180000 = (12,((5,(14,(4,(13,7)))),(((6,(15,11)),(10,8)),((9,2),3))),1); tree rep.6190000 = (12,((5,((3,(2,9)),((4,(13,7)),14))),((15,(6,11)),(10,8))),1); tree rep.6200000 = (12,(((8,10),(11,(6,15))),(((3,(9,2)),5),(4,(14,(7,13))))),1); tree rep.6210000 = ((((3,(9,2)),((5,7),((14,4),13))),((8,(11,(15,6))),10)),12,1); tree rep.6220000 = ((((((2,9),3),(14,((13,7),4))),5),((10,8),(11,(6,15)))),12,1); tree rep.6230000 = (((((4,(14,(13,7))),((3,(2,9)),5)),(10,8)),(6,(11,15))),12,1); tree rep.6240000 = ((((11,(6,15)),(8,10)),((((2,9),3),14),(5,(4,(7,13))))),12,1); tree rep.6250000 = ((((6,(15,11)),(10,8)),(14,((((13,7),5),(3,(9,2))),4))),12,1); tree rep.6260000 = (((((15,11),6),(10,8)),((4,((13,7),14)),(5,(3,(9,2))))),12,1); tree rep.6270000 = (12,(((((4,(13,7)),14),5),((9,2),3)),((11,(15,6)),(8,10))),1); tree rep.6280000 = (((10,(((15,11),6),8)),((((2,9),3),((7,13),5)),(14,4))),12,1); tree rep.6290000 = ((((10,8),((11,15),6)),((((13,7),(3,(2,9))),14),(4,5))),12,1); tree rep.6300000 = ((12,((8,10),((6,11),15))),(((3,9),2),(5,(((13,7),4),14))),1); tree rep.6310000 = (((10,(8,((15,6),11))),(4,((((7,13),14),5),(3,(9,2))))),12,1); tree rep.6320000 = (12,(((2,9),3),(5,(4,(((7,13),14),((8,10),((11,6),15)))))),1); tree rep.6330000 = (12,((10,((11,(15,6)),8)),(((7,13),(((9,2),3),(5,14))),4)),1); tree rep.6340000 = (12,(((15,(11,6)),(8,10)),(((14,(13,(4,7))),((2,9),3)),5)),1); tree rep.6350000 = (((((9,2),3),(5,((14,4),(7,13)))),(8,(10,(6,(11,15))))),12,1); tree rep.6360000 = ((((((7,(13,4)),14),((10,8),(6,(15,11)))),5),(3,(9,2))),12,1); tree rep.6370000 = (((10,8),((15,6),11)),(12,(14,((5,4),((3,(9,2)),(7,13))))),1); tree rep.6380000 = ((((((2,9),3),((4,(13,7)),12)),5),14),((8,10),(6,(11,15))),1); tree rep.6390000 = (12,((((11,15),6),(8,10)),((((2,9),3),((4,(7,13)),14)),5)),1); tree rep.6400000 = (12,(((8,(15,(6,11))),10),((((13,7),4),14),(5,(3,(2,9))))),1); tree rep.6410000 = ((((8,10),((6,15),11)),((((9,2),3),((14,5),4)),(7,13))),12,1); tree rep.6420000 = (((10,(8,((11,15),6))),(5,((3,(9,2)),(14,(4,(13,7)))))),12,1); tree rep.6430000 = ((((((4,(7,13)),14),5),(3,(2,9))),((6,(15,11)),(8,10))),12,1); tree rep.6440000 = (12,((((14,((7,13),4)),(3,(2,9))),5),(8,(10,(11,(6,15))))),1); tree rep.6450000 = (12,(((11,(6,15)),(8,10)),(((3,(2,9)),(5,14)),((13,7),4))),1); tree rep.6460000 = (12,((3,(9,2)),(((((6,15),11),8),10),(((4,(13,7)),14),5))),1); tree rep.6470000 = (12,((((((2,9),(4,3)),(7,13)),5),14),(10,(8,((15,11),6)))),1); tree rep.6480000 = ((10,(((6,15),11),8)),(12,(((9,2),3),((14,((7,13),4)),5))),1); tree rep.6490000 = ((((10,8),(6,(11,15))),(((3,(2,9)),5),(14,(4,(13,7))))),12,1); tree rep.6500000 = (12,((10,((11,(15,6)),8)),((14,(4,(13,7))),(5,((2,9),3)))),1); tree rep.6510000 = (12,(((5,(3,(2,9))),((14,(7,13)),4)),((8,(6,(11,15))),10)),1); tree rep.6520000 = (12,((((((9,2),3),14),(4,(7,13))),5),(((6,11),15),(10,8))),1); tree rep.6530000 = ((12,((((2,9),3),((5,14),4)),(13,7))),((6,(11,15)),(10,8)),1); tree rep.6540000 = ((((((4,(13,7)),14),5),((2,9),3)),(8,((6,(11,15)),10))),12,1); tree rep.6550000 = (12,(((2,9),3),(((4,(7,13)),(5,14)),((11,(6,15)),(10,8)))),1); tree rep.6560000 = (12,(((3,(2,9)),(((13,7),4),(5,14))),(8,(10,(6,(15,11))))),1); tree rep.6570000 = (12,(((5,(4,14)),(((11,(15,6)),(8,10)),((2,9),3))),(13,7)),1); tree rep.6580000 = ((((8,((15,6),11)),10),((3,(2,9)),((5,(4,(7,13))),14))),12,1); tree rep.6590000 = (((4,(3,(2,9))),((7,13),((14,(10,(8,((15,6),11)))),5))),12,1); tree rep.6600000 = (12,((((14,(4,(13,7))),5),((2,9),3)),(((6,(15,11)),8),10)),1); tree rep.6610000 = (12,((((7,13),4),(((2,9),3),(14,5))),((8,((11,15),6)),10)),1); tree rep.6620000 = ((((6,15),11),(8,10)),(((3,(9,2)),(5,(((7,13),14),4))),12),1); tree rep.6630000 = (((8,((11,(6,15)),((5,(((13,7),14),4)),(3,(2,9))))),10),12,1); tree rep.6640000 = ((((3,(2,9)),((14,5),4)),(12,(13,7))),((10,8),((6,15),11)),1); tree rep.6650000 = ((5,((((8,(10,((6,11),15))),((2,9),3)),4),(13,(14,7)))),12,1); tree rep.6660000 = ((((10,8),((11,15),6)),(((3,5),((14,(7,13)),4)),(2,9))),12,1); tree rep.6670000 = ((((4,(13,7)),(14,5)),((2,9),3)),((((15,6),11),(8,10)),12),1); tree rep.6680000 = (((((((9,2),3),(((13,7),14),4)),5),(8,10)),(6,(11,15))),12,1); tree rep.6690000 = ((((3,(9,2)),((4,14),(5,(7,13)))),(8,(10,(11,(15,6))))),12,1); tree rep.6700000 = (12,((11,(6,15)),(((3,(((13,7),(14,4)),(9,2))),5),(10,8))),1); tree rep.6710000 = (12,(((8,(6,(15,11))),10),((4,((14,5),(((2,9),3),7))),13)),1); tree rep.6720000 = (12,((((3,(2,9)),((13,7),(14,4))),5),((8,10),((15,6),11))),1); tree rep.6730000 = (12,(((4,(3,(2,9))),((14,5),(7,13))),(10,(((11,15),6),8))),1); tree rep.6740000 = (12,(((8,(6,(11,15))),10),(((4,(13,7)),(((2,9),3),14)),5)),1); tree rep.6750000 = (12,(((((6,15),11),8),10),((14,(5,(4,(7,13)))),((2,9),3))),1); tree rep.6760000 = (12,(((((4,(7,13)),14),5),(3,(2,9))),(10,((11,(15,6)),8))),1); tree rep.6770000 = (((((9,2),3),(((13,7),(5,4)),14)),((8,((15,11),6)),10)),12,1); tree rep.6780000 = (12,(((((13,7),4),(14,5)),(10,(8,(11,(6,15))))),(3,(2,9))),1); tree rep.6790000 = (((((11,(15,6)),10),8),((((14,(13,7)),5),(3,(2,9))),4)),12,1); tree rep.6800000 = (((10,(8,((11,6),15))),((3,(2,9)),(5,(14,(4,(13,7)))))),12,1); tree rep.6810000 = ((((((11,15),6),8),10),(((((13,7),4),14),5),(3,(2,9)))),12,1); tree rep.6820000 = ((((8,(15,(11,6))),10),(((5,((2,9),3)),(4,(7,13))),14)),12,1); tree rep.6830000 = (12,(((6,(11,15)),(8,10)),((((7,13),(4,14)),5),((2,9),3))),1); tree rep.6840000 = (12,(((((6,15),11),8),10),((((7,4),13),(5,((9,2),3))),14)),1); tree rep.6850000 = (((5,(((4,(7,13)),14),(3,(2,9)))),((10,((15,11),6)),8)),12,1); tree rep.6860000 = (12,((((3,(9,2)),(((7,13),14),4)),5),((10,8),((11,15),6))),1); tree rep.6870000 = (((((14,(4,(7,13))),5),((9,2),3)),((((6,15),11),8),10)),12,1); tree rep.6880000 = (12,((((((9,2),3),4),(5,14)),(13,7)),((10,8),((15,11),6))),1); tree rep.6890000 = ((((14,(13,7)),((5,((2,9),3)),4)),((10,8),(15,(11,6)))),12,1); tree rep.6900000 = (12,(((14,(4,(7,13))),((3,(2,9)),5)),(10,(((11,15),6),8))),1); tree rep.6910000 = ((((3,(2,9)),(((4,13),(7,14)),5)),(((11,15),6),(10,8))),12,1); tree rep.6920000 = (((((7,13),4),14),((3,(9,2)),(((((6,11),15),8),10),5))),12,1); tree rep.6930000 = (12,((((2,9),3),(5,(14,((7,13),4)))),((6,(15,11)),(10,8))),1); tree rep.6940000 = (12,((5,(((6,11),15),(10,8))),((3,(9,2)),(14,((13,7),4)))),1); tree rep.6950000 = ((((9,2),3),(((7,13),14),(((8,(((15,11),6),10)),4),5))),12,1); tree rep.6960000 = ((((10,8),((15,6),11)),(5,((((7,13),4),14),((9,2),3)))),12,1); tree rep.6970000 = ((((14,((3,(9,2)),5)),((13,7),4)),(8,(10,(15,(6,11))))),12,1); tree rep.6980000 = ((((5,((9,2),3)),14),(4,(7,13))),(12,(((11,(6,15)),10),8)),1); tree rep.6990000 = ((((8,10),(11,(15,6))),(5,(((2,9),3),(((7,13),4),14)))),12,1); tree rep.7000000 = (12,(((10,8),((11,15),6)),(5,(14,(3,((2,9),((13,7),4)))))),1); tree rep.7010000 = ((4,((5,((6,(15,11)),((8,12),10))),14)),(((9,2),3),(7,13)),1); tree rep.7020000 = (12,((8,(10,(11,(15,6)))),(((4,(13,7)),5),(14,(3,(9,2))))),1); tree rep.7030000 = ((((10,8),((6,15),11)),((4,(7,13)),((14,5),(3,(9,2))))),12,1); tree rep.7040000 = (((10,((6,(11,15)),8)),(((3,(9,2)),(14,(4,(7,13)))),5)),12,1); tree rep.7050000 = (12,((10,(((6,15),11),8)),((5,((9,3),2)),(((4,14),13),7))),1); tree rep.7060000 = (12,(((3,(9,2)),((14,(4,(13,7))),5)),((11,(6,15)),(8,10))),1); tree rep.7070000 = (((((14,4),((7,13),((10,8),((11,15),6)))),5),(3,(9,2))),12,1); tree rep.7080000 = (((5,14),((13,7),((12,((6,(11,15)),(8,10))),(3,(2,9))))),4,1); tree rep.7090000 = (12,((8,(10,(11,(15,6)))),((5,(((13,7),4),14)),(3,(2,9)))),1); tree rep.7100000 = (12,((5,(3,((2,9),((7,13),(14,4))))),((8,10),(11,(6,15)))),1); tree rep.7110000 = ((((10,8),((15,11),6)),((13,7),((5,(3,(9,2))),(4,14)))),12,1); tree rep.7120000 = (((8,(10,((6,15),11))),((14,((13,7),4)),((3,(9,2)),5))),12,1); tree rep.7130000 = (12,(((10,8),(6,(11,15))),((((14,(7,13)),4),5),((9,2),3))),1); tree rep.7140000 = (12,((10,(((11,15),6),8)),(((14,((13,7),4)),5),(3,(2,9)))),1); tree rep.7150000 = (12,(((8,(11,(15,6))),10),(5,(((2,9),3),((4,(13,7)),14)))),1); tree rep.7160000 = (12,(5,(((2,9),3),(((((6,15),11),(10,8)),14),(4,(13,7))))),1); tree rep.7170000 = (((4,(7,13)),((14,5),(3,(2,9)))),((8,10),(((15,11),6),12)),1); tree rep.7180000 = ((5,((((2,9),3),14),((4,(13,7)),(10,(8,((15,6),11)))))),12,1); tree rep.7190000 = (12,((10,(8,((11,15),6))),(((3,(9,2)),5),(14,((7,13),4)))),1); tree rep.7200000 = ((((11,(6,15)),(10,8)),(((3,(2,9)),5),((4,14),(13,7)))),12,1); tree rep.7210000 = (((14,(7,13)),(((10,8),((6,11),15)),(4,((3,(2,9)),5)))),12,1); tree rep.7220000 = (12,(((7,13),4),(((5,14),(8,(((15,6),11),10))),(3,(9,2)))),1); tree rep.7230000 = (12,(((6,(11,15)),(8,10)),((5,14),(((9,2),3),(7,(4,13))))),1); tree rep.7240000 = (12,((4,((5,((7,13),14)),((9,2),3))),((11,(15,6)),(8,10))),1); tree rep.7250000 = (12,((10,(8,(11,(15,6)))),(((2,9),3),((5,14),(4,(13,7))))),1); tree rep.7260000 = (12,((((5,((9,2),3)),(4,(13,7))),14),(10,(8,((11,15),6)))),1); tree rep.7270000 = ((((((((6,15),11),(8,10)),14),(5,4)),(3,(2,9))),(7,13)),12,1); tree rep.7280000 = ((((14,((7,13),(5,4))),((2,9),3)),12),(8,(10,(11,(15,6)))),1); tree rep.7290000 = (12,((((11,(6,15)),8),10),((5,(14,(3,(2,9)))),(4,(7,13)))),1); tree rep.7300000 = (((5,(12,(3,(2,9)))),(14,(4,(13,7)))),(((15,6),11),(10,8)),1); tree rep.7310000 = (((((5,((9,2),3)),((7,13),4)),14),((8,10),(6,(15,11)))),12,1); tree rep.7320000 = (12,((14,(((9,2),3),(5,((4,7),13)))),((8,10),(6,(15,11)))),1); tree rep.7330000 = (((10,((6,(15,11)),8)),((5,(14,((7,13),4))),(3,(9,2)))),12,1); tree rep.7340000 = (12,((((9,2),3),(5,(((13,7),4),14))),((8,((6,11),15)),10)),1); tree rep.7350000 = ((((5,((2,9),3)),((4,(13,7)),14)),((8,10),((15,6),11))),12,1); tree rep.7360000 = (((3,(2,9)),(((6,(11,15)),(8,10)),(((7,13),(4,14)),5))),12,1); tree rep.7370000 = ((((((13,7),(4,14)),(3,(9,2))),5),(((15,11),6),(8,10))),12,1); tree rep.7380000 = (((3,(2,9)),((14,(7,13)),4)),((12,((8,10),(6,(11,15)))),5),1); tree rep.7390000 = (((10,((6,(15,11)),8)),(((13,7),4),((14,5),(3,(2,9))))),12,1); tree rep.7400000 = (12,(((3,((9,2),5)),(4,((7,13),14))),(((6,(11,15)),10),8)),1); tree rep.7410000 = (12,((5,(((4,14),(13,7)),((9,2),3))),((8,((11,15),6)),10)),1); tree rep.7420000 = (((6,(15,11)),(((3,(2,9)),12),(5,(((13,7),14),4)))),(8,10),1); tree rep.7430000 = (12,(((2,9),(8,(10,((11,15),6)))),((14,(4,(13,7))),(5,3))),1); tree rep.7440000 = (12,(((((2,9),3),(14,(4,(13,7)))),5),((10,8),((15,6),11))),1); tree rep.7450000 = (((((11,(6,15)),10),8),((14,((4,((9,2),3)),(13,7))),5)),12,1); tree rep.7460000 = (((((2,9),3),(((14,(13,7)),4),5)),(8,((11,(6,15)),10))),12,1); tree rep.7470000 = (((((13,(4,7)),14),(3,(2,9))),5),((8,(10,(11,(6,15)))),12),1); tree rep.7480000 = ((((10,(6,(11,15))),8),((5,((2,9),3)),((13,7),(14,4)))),12,1); tree rep.7490000 = (12,((((15,11),6),(8,10)),(3,((((7,13),4),14),((9,2),5)))),1); tree rep.7500000 = ((4,(((7,13),(3,(9,2))),((14,5),(10,((6,(15,11)),8))))),12,1); tree rep.7510000 = (((5,(((7,(4,14)),(3,(2,9))),13)),(8,(10,(11,(15,6))))),12,1); tree rep.7520000 = (12,((((13,7),(4,14)),(3,((9,2),5))),(((15,11),6),(10,8))),1); tree rep.7530000 = (((((5,14),((9,2),3)),((13,7),((8,10),(15,(6,11))))),4),12,1); tree rep.7540000 = (12,(((10,((11,15),6)),8),(14,(5,(((7,13),4),(3,(9,2)))))),1); tree rep.7550000 = (((((6,15),11),(8,10)),(5,(3,((2,9),(4,((7,13),14)))))),12,1); tree rep.7560000 = ((((5,((4,(7,13)),14)),(3,(2,9))),((10,8),((15,6),11))),12,1); tree rep.7570000 = (12,((((10,8),(11,(15,6))),(14,(4,(13,7)))),(5,((2,9),3))),1); tree rep.7580000 = (12,(((((5,14),4),(7,13)),((2,9),3)),(10,(8,((15,6),11)))),1); tree rep.7590000 = (12,((((11,(6,15)),10),8),(((((4,(7,13)),14),3),(2,9)),5)),1); tree rep.7600000 = (((10,8),(11,(6,15))),(12,(((13,7),(4,14)),(((2,9),3),5))),1); tree rep.7610000 = (12,(((7,13),(((3,4),(14,5)),(9,2))),(10,(8,((11,15),6)))),1); tree rep.7620000 = (12,((5,14),(((10,(8,((6,11),15))),((2,9),3)),((13,7),4))),1); tree rep.7630000 = (((((6,(15,11)),10),8),((14,5),((3,(2,9)),(4,(7,13))))),12,1); tree rep.7640000 = (((((2,9),3),((13,7),((14,4),5))),((((15,11),6),8),10)),12,1); tree rep.7650000 = (12,((10,(8,((6,11),15))),(5,(((2,9),3),((4,(7,13)),14)))),1); tree rep.7660000 = (12,((((14,(3,(9,2))),5),((4,7),13)),((8,((11,15),6)),10)),1); tree rep.7670000 = (12,(((((13,7),4),(14,5)),((9,2),3)),((8,(11,(15,6))),10)),1); tree rep.7680000 = ((((3,(9,2)),((14,5),(4,(7,13)))),(((6,(15,11)),8),10)),12,1); tree rep.7690000 = ((12,(((4,(7,13)),(14,5)),(3,(2,9)))),(8,(((15,11),6),10)),1); tree rep.7700000 = (((((11,(15,6)),8),10),(((14,5),((2,9),3)),((7,13),4))),12,1); tree rep.7710000 = (((5,(((4,14),(13,7)),((2,9),3))),((8,10),((15,6),11))),12,1); tree rep.7720000 = (12,(((5,((9,2),((13,7),(4,14)))),3),(8,(10,((15,6),11)))),1); tree rep.7730000 = (12,((((3,(9,2)),(14,5)),(4,(7,13))),(((15,6),11),(8,10))),1); tree rep.7740000 = ((((3,(9,2)),(5,(14,((13,7),4)))),(10,((6,(11,15)),8))),12,1); tree rep.7750000 = (((((15,11),6),(8,10)),((((13,7),4),14),(5,((9,2),3)))),12,1); tree rep.7760000 = (((11,(6,15)),(8,10)),(((2,9),3),(12,(5,((13,7),(14,4))))),1); tree rep.7770000 = (12,((((6,(11,15)),8),10),((14,(((9,2),3),(5,4))),(7,13))),1); tree rep.7780000 = (12,((((3,(9,2)),(14,5)),((7,13),4)),(((15,11),6),(10,8))),1); tree rep.7790000 = (((5,(((9,2),3),(14,((13,7),4)))),((8,(11,(15,6))),10)),12,1); tree rep.7800000 = (((((6,(11,15)),8),10),(((14,(7,13)),4),((5,(2,9)),3))),12,1); tree rep.7810000 = ((((8,10),(11,(6,15))),((5,((4,14),(13,7))),((2,9),3))),12,1); tree rep.7820000 = ((5,((4,(13,7)),((3,((12,2),9)),14))),(8,(((6,15),11),10)),1); tree rep.7830000 = (12,(((8,10),(11,(15,6))),((13,7),((14,5),(((9,2),3),4)))),1); tree rep.7840000 = (12,((5,((((2,9),3),14),(4,(13,7)))),(((6,(15,11)),10),8)),1); tree rep.7850000 = (((((3,(2,9)),((4,(13,7)),14)),5),(((15,11),6),(10,8))),12,1); tree rep.7860000 = (12,(((((6,11),15),8),10),((((2,9),3),(((14,13),4),7)),5)),1); tree rep.7870000 = (12,((3,(9,2)),(((((6,15),11),(10,8)),5),(14,((7,13),4)))),1); tree rep.7880000 = (12,(((8,10),(14,(5,(((13,7),4),(3,(9,2)))))),((11,15),6)),1); tree rep.7890000 = (12,(((15,(6,11)),(10,8)),(((9,2),3),(4,(((7,13),14),5)))),1); tree rep.7900000 = (12,((((5,((13,7),(14,4))),(2,9)),3),(((11,15),6),(8,10))),1); tree rep.7910000 = (((((14,4),(2,((7,13),5))),9),3),(((10,((11,15),6)),8),12),1); tree rep.7920000 = (((((3,(2,9)),5),((14,4),(7,13))),(8,((6,(15,11)),10))),12,1); tree rep.7930000 = ((3,(2,((((4,(14,(13,7))),((11,(15,6)),(10,8))),5),9))),12,1); tree rep.7940000 = ((((((13,7),(4,14)),5),(3,(2,9))),(((11,6),15),(8,10))),12,1); tree rep.7950000 = ((((10,8),((15,11),6)),((5,12),(3,(9,2)))),((4,14),(13,7)),1); tree rep.7960000 = (12,((((11,(6,15)),10),8),(5,((13,7),((14,4),(3,(9,2)))))),1); tree rep.7970000 = (((10,(8,(11,(15,6)))),((((2,9),3),((7,13),5)),(14,4))),12,1); tree rep.7980000 = (12,(((3,(2,9)),(((8,10),((15,6),11)),(4,5))),(14,(13,7))),1); tree rep.7990000 = (12,((((((14,(4,(13,7))),5),(3,(2,9))),10),8),(6,(15,11))),1); tree rep.8000000 = (12,(5,(((2,9),3),(14,((13,7),(4,((15,(6,11)),(10,8))))))),1); tree rep.8010000 = (((((2,9),3),(((13,7),(5,14)),4)),((11,(6,15)),(8,10))),12,1); tree rep.8020000 = ((((8,10),(6,(15,11))),(((2,9),3),(((4,13),7),(14,5)))),12,1); tree rep.8030000 = (((3,(9,2)),(14,(((7,13),4),5))),(((10,((6,15),11)),8),12),1); tree rep.8040000 = (((((11,(15,6)),10),8),((((9,2),3),5),(((7,13),14),4))),12,1); tree rep.8050000 = ((((((11,15),6),10),8),(((7,13),(5,(3,(9,2)))),(14,4))),12,1); tree rep.8060000 = (((((15,11),6),(10,8)),((5,(4,(13,7))),((3,(2,9)),14))),12,1); tree rep.8070000 = (((8,10),(5,(((((7,13),4),14),((2,9),3)),((15,11),6)))),12,1); tree rep.8080000 = (12,(5,((((14,4),(7,13)),(3,(9,2))),(((11,15),6),(10,8)))),1); tree rep.8090000 = (12,(((10,((15,6),11)),8),(((7,13),4),((14,5),(3,(9,2))))),1); tree rep.8100000 = ((((15,6),11),(10,8)),(((((9,2),3),5),(((13,7),4),14)),12),1); tree rep.8110000 = (12,((5,((3,(2,9)),(14,(4,(13,7))))),(8,(10,((15,11),6)))),1); tree rep.8120000 = (((5,(4,((3,(9,2)),(14,(7,13))))),((6,(11,15)),(10,8))),12,1); tree rep.8130000 = (12,((14,(5,(((9,2),3),((8,10),(15,(11,6)))))),(7,(4,13))),1); tree rep.8140000 = (((((3,(9,2)),((14,4),(7,13))),5),(8,(10,(11,(6,15))))),12,1); tree rep.8150000 = ((((10,8),((15,6),11)),((4,(13,7)),((14,5),(3,(9,2))))),12,1); tree rep.8160000 = ((((4,(13,7)),(((14,5),(2,9)),3)),((6,(15,11)),(10,8))),12,1); tree rep.8170000 = ((((15,6),11),(((5,((9,2),3)),(14,(4,(13,7)))),(8,10))),12,1); tree rep.8180000 = (12,(((((8,10),(6,(15,11))),5),(14,((7,13),4))),(3,(2,9))),1); tree rep.8190000 = (12,((5,((14,(13,7)),((3,(2,9)),4))),((((11,15),6),10),8)),1); tree rep.8200000 = ((((((6,15),11),10),8),(14,((7,13),4))),(12,(5,((2,9),3))),1); tree rep.8210000 = (12,((5,(((14,(13,7)),4),((9,2),3))),((10,8),((15,11),6))),1); tree rep.8220000 = ((((14,5),(((9,2),12),3)),((7,13),4)),((15,(11,6)),(10,8)),1); tree rep.8230000 = (12,((((15,11),6),(8,10)),((((7,13),(5,14)),4),((2,9),3))),1); tree rep.8240000 = (12,(((3,(2,9)),((4,(7,13)),(5,14))),((8,10),((11,6),15))),1); tree rep.8250000 = (12,((((6,15),11),(8,10)),((14,(4,(13,7))),(((9,2),3),5))),1); tree rep.8260000 = (12,(((3,(2,9)),5),((((7,14),4),13),((8,10),(15,(11,6))))),1); tree rep.8270000 = (12,((((6,15),11),(8,10)),(5,((14,(13,7)),(3,(4,(2,9)))))),1); tree rep.8280000 = (12,(((((7,13),4),((2,9),3)),(5,14)),((8,10),(6,(15,11)))),1); tree rep.8290000 = ((((5,((4,(14,(13,7))),(3,(2,9)))),(8,((6,15),11))),10),12,1); tree rep.8300000 = (12,(((((7,13),4),(5,14)),(3,(9,2))),((6,(15,11)),(10,8))),1); tree rep.8310000 = (12,(((10,8),((((4,(13,7)),((9,2),3)),5),14)),((15,11),6)),1); tree rep.8320000 = ((((5,(((9,2),3),4)),(14,(13,7))),((10,8),((6,15),11))),12,1); tree rep.8330000 = (12,((((11,(6,15)),8),10),((5,((2,9),3)),((4,(7,13)),14))),1); tree rep.8340000 = (12,(((9,2),3),(((4,((8,10),(6,(11,15)))),5),((13,7),14))),1); tree rep.8350000 = (12,(((14,(3,(2,9))),(((7,13),5),4)),((6,(11,15)),(8,10))),1); tree rep.8360000 = (12,(((9,2),(3,((7,13),(4,(5,14))))),(10,(((11,15),6),8))),1); tree rep.8370000 = (((((15,6),11),(10,8)),(((2,9),3),(5,((14,4),(7,13))))),12,1); tree rep.8380000 = (12,(((5,14),((10,((15,11),6)),8)),(((13,7),4),(3,(2,9)))),1); tree rep.8390000 = (12,((((5,14),((9,2),(3,4))),(13,7)),((8,(6,(11,15))),10)),1); tree rep.8400000 = (((((4,14),5),((7,13),((9,2),3))),((10,8),((15,6),11))),12,1); tree rep.8410000 = ((5,(((12,((13,7),4)),14),((9,2),3))),(10,(8,((15,6),11))),1); tree rep.8420000 = (((5,((15,(11,6)),(8,10))),(((13,(7,4)),14),((2,9),3))),12,1); tree rep.8430000 = (12,(((5,((4,(7,13)),14)),((2,9),3)),(8,((11,(15,6)),10))),1); tree rep.8440000 = (12,(((14,5),(4,((10,8),((11,15),6)))),((3,(9,2)),(7,13))),1); tree rep.8450000 = (12,((((13,7),(4,14)),((3,(2,9)),5)),((11,(15,6)),(8,10))),1); tree rep.8460000 = (12,((5,((14,(13,7)),((3,(9,2)),4))),(((15,6),11),(10,8))),1); tree rep.8470000 = (12,((11,(15,6)),(8,(10,(((13,7),4),(5,((3,(9,2)),14)))))),1); tree rep.8480000 = ((((((4,(7,13)),14),(3,(9,2))),5),(8,(((11,15),6),10))),12,1); tree rep.8490000 = (12,(((10,8),((6,15),11)),(((4,(7,13)),14),(5,((9,2),3)))),1); tree rep.8500000 = (((((11,15),6),(10,8)),((5,((14,4),(7,13))),(3,(9,2)))),12,1); tree rep.8510000 = ((((5,4),(3,(9,2))),(7,(14,13))),(12,(((11,(15,6)),8),10)),1); tree rep.8520000 = (((8,10),(6,(15,11))),(12,((((13,7),(4,(14,5))),3),(2,9))),1); tree rep.8530000 = (((((4,(14,(7,13))),5),((2,9),3)),((10,8),(11,(6,15)))),12,1); tree rep.8540000 = (((10,(((15,11),6),8)),(((5,14),((9,2),3)),(4,(7,13)))),12,1); tree rep.8550000 = (12,((10,(((15,11),6),8)),(5,(((2,9),3),((13,7),(4,14))))),1); tree rep.8560000 = ((((3,(9,2)),(4,((14,5),(13,7)))),(((15,6),11),(10,8))),12,1); tree rep.8570000 = ((((3,(9,2)),(((14,(13,7)),4),5)),((10,8),((6,15),11))),12,1); tree rep.8580000 = (((5,14),((3,(2,9)),(((8,10),(11,(15,6))),(4,(7,13))))),12,1); tree rep.8590000 = (12,((((4,(7,13)),(14,5)),(3,(9,2))),(8,(((11,15),6),10))),1); tree rep.8600000 = (12,((14,((((13,7),4),5),((2,9),3))),(((15,(6,11)),8),10)),1); tree rep.8610000 = (12,((5,(((14,4),(13,7)),((2,9),3))),(((15,6),11),(8,10))),1); tree rep.8620000 = (((14,5),(((3,(9,2)),((7,13),4)),((6,(15,11)),(8,10)))),12,1); tree rep.8630000 = (12,(((8,10),(11,(15,6))),((5,((4,(14,13)),7)),((2,9),3))),1); tree rep.8640000 = (12,(((8,((15,11),6)),10),((5,(14,(4,(13,7)))),(3,(9,2)))),1); tree rep.8650000 = (((14,(4,(7,13))),((((8,10),(6,(15,11))),5),(3,(2,9)))),12,1); tree rep.8660000 = (12,(((10,8),(15,(6,11))),(((3,(9,2)),((4,(13,7)),14)),5)),1); tree rep.8670000 = (((((14,5),(4,(13,7))),((9,2),3)),(8,((6,(11,15)),10))),12,1); tree rep.8680000 = ((12,(((11,(6,15)),8),10)),(5,((3,(9,2)),(((7,13),14),4))),1); tree rep.8690000 = (((((((2,9),3),5),(4,14)),(13,7)),((((15,6),11),10),8)),12,1); tree rep.8700000 = (((4,((5,(3,(2,9))),(14,(13,7)))),12),(8,(((11,15),6),10)),1); tree rep.8710000 = ((((12,(2,9)),3),((14,5),((10,(15,(11,6))),8))),((4,13),7),1); tree rep.8720000 = (12,(((4,(7,13)),((14,5),((2,9),3))),(8,((11,(15,6)),10))),1); tree rep.8730000 = (12,((((2,9),3),(((13,7),4),(5,14))),((6,(15,11)),(10,8))),1); tree rep.8740000 = (((10,8),(11,(15,6))),(12,(((4,(13,7)),14),(5,(3,(2,9))))),1); tree rep.8750000 = ((10,((((4,(13,7)),(14,5)),(((2,9),3),12)),((6,15),11))),8,1); tree rep.8760000 = (12,(((3,(9,2)),(((4,(13,7)),14),(10,(((15,6),11),8)))),5),1); tree rep.8770000 = (((4,(13,7)),((((((11,15),6),10),8),((9,3),2)),(5,14))),12,1); tree rep.8780000 = (12,((14,((5,(3,(9,2))),(4,(13,7)))),(10,((6,(15,11)),8))),1); tree rep.8790000 = (((4,(13,7)),((((2,9),12),3),14)),(((10,8),(6,(11,15))),5),1); tree rep.8800000 = ((5,((3,(9,2)),((4,14),(7,13)))),((8,(10,(6,(11,15)))),12),1); tree rep.8810000 = ((10,(8,(11,(6,15)))),((5,(4,(14,(7,13)))),(12,((2,9),3))),1); tree rep.8820000 = (12,(((8,10),(6,(11,15))),(((((4,5),14),(7,13)),3),(9,2))),1); tree rep.8830000 = ((((((3,(2,9)),5),4),14),(13,7)),(12,((8,10),(11,(6,15)))),1); tree rep.8840000 = (12,((10,(8,(6,(15,11)))),(5,((4,(13,7)),(14,((9,2),3))))),1); tree rep.8850000 = ((((10,((15,11),6)),8),((3,(9,2)),(4,((14,5),(7,13))))),12,1); tree rep.8860000 = (((((4,14),(13,7)),5),(((8,10),((6,15),11)),((2,9),3))),12,1); tree rep.8870000 = (12,(((8,10),((((4,(7,13)),14),5),((2,9),3))),(11,(15,6))),1); tree rep.8880000 = ((((15,11),6),(10,8)),(12,((5,((4,(7,13)),14)),((2,9),3))),1); tree rep.8890000 = (((((13,7),(14,4)),(((11,(15,6)),(10,8)),((2,9),3))),5),12,1); tree rep.8900000 = ((((((15,6),11),8),10),(((((7,13),4),14),((9,2),3)),5)),12,1); tree rep.8910000 = (((((4,13),(14,7)),(((9,2),3),5)),((10,(11,(15,6))),8)),12,1); tree rep.8920000 = ((((8,10),(11,(6,15))),((((7,(13,9)),14),4),(5,(2,3)))),12,1); tree rep.8930000 = (12,((((3,(9,2)),5),((13,7),(14,4))),(10,(8,((6,15),11)))),1); tree rep.8940000 = (12,(((5,((4,(7,13)),14)),((2,9),3)),((10,8),((15,6),11))),1); tree rep.8950000 = (12,((8,(((15,6),11),10)),(((3,(2,9)),5),(((13,7),14),4))),1); tree rep.8960000 = (12,((((3,(9,2)),5),((14,(7,13)),4)),((((15,6),11),8),10)),1); tree rep.8970000 = (12,(((6,(11,15)),(10,8)),(((3,(9,2)),((4,(13,7)),14)),5)),1); tree rep.8980000 = ((((5,((14,4),(7,13))),((9,2),3)),(((15,6),11),(10,8))),12,1); tree rep.8990000 = ((((3,(9,2)),(((4,(7,13)),5),14)),((((15,11),6),10),8)),12,1); tree rep.9000000 = (12,(((3,(2,9)),((4,(14,(7,13))),5)),(((6,15),11),(8,10))),1); tree rep.9010000 = (12,((((2,9),3),((4,(5,(13,7))),14)),(((6,15),11),(10,8))),1); tree rep.9020000 = ((((6,(15,11)),8),10),((((13,7),4),(12,(((2,9),3),14))),5),1); tree rep.9030000 = (((8,((11,(15,6)),10)),((14,((2,9),3)),(5,((13,7),4)))),12,1); tree rep.9040000 = (12,((10,(8,(11,(6,15)))),(((14,5),((13,7),4)),(3,(2,9)))),1); tree rep.9050000 = (((((14,(13,4)),7),((3,(2,9)),5)),(((6,15),11),(8,10))),12,1); tree rep.9060000 = ((((5,(7,13)),(12,((9,2),3))),(4,14)),(((11,15),6),(10,8)),1); tree rep.9070000 = (((((7,13),((3,(2,9)),(14,5))),4),((10,8),(6,(11,15)))),12,1); tree rep.9080000 = ((((10,((15,11),6)),8),(((((13,7),4),14),((9,2),3)),5)),12,1); tree rep.9090000 = ((((10,(11,(6,15))),8),(((3,(9,2)),5),(14,(7,(4,13))))),12,1); tree rep.9100000 = (12,(((((((13,7),(5,(3,(2,9)))),4),14),(11,(6,15))),8),10),1); tree rep.9110000 = (((((6,15),11),(8,10)),((5,((2,9),3)),(14,(4,(13,7))))),12,1); tree rep.9120000 = ((((8,(11,(6,15))),10),(((9,2),3),(5,((14,(7,13)),4)))),12,1); tree rep.9130000 = (((((14,5),(4,(7,13))),(3,(9,2))),(8,(((15,11),6),10))),12,1); tree rep.9140000 = (12,((((14,5),((9,2),3)),(13,(7,4))),((8,10),(6,(15,11)))),1); tree rep.9150000 = ((5,((((4,(7,13)),14),((9,2),3)),((6,(15,11)),(10,8)))),12,1); tree rep.9160000 = (12,(((((2,9),3),(5,14)),(4,(7,13))),((8,(6,(11,15))),10)),1); tree rep.9170000 = ((((8,10),((15,6),11)),((((9,2),3),5),(((7,13),14),4))),12,1); tree rep.9180000 = ((((15,(11,6)),10),8),(12,(((9,2),3),(((7,13),(14,4)),5))),1); tree rep.9190000 = ((((8,10),(11,(15,6))),(((3,(9,2)),4),((14,5),(13,7)))),12,1); tree rep.9200000 = (12,((((3,(9,2)),(4,(7,13))),(5,14)),((8,10),(11,(6,15)))),1); tree rep.9210000 = (12,((((6,15),11),(8,10)),((((14,(7,13)),4),((9,2),3)),5)),1); tree rep.9220000 = (12,(((4,(7,(14,13))),(((10,8),((15,11),6)),(9,2))),(5,3)),1); tree rep.9230000 = (((((15,11),6),(8,10)),(((4,14),(7,13)),(5,((2,9),3)))),12,1); tree rep.9240000 = (((((2,9),3),5),(14,(4,(13,7)))),(12,((10,8),((11,15),6))),1); tree rep.9250000 = (12,(((8,(6,(15,11))),10),(((3,(9,2)),4),(5,(14,(7,13))))),1); tree rep.9260000 = ((((8,10),(5,((14,(4,(13,7))),(3,(2,9))))),((15,11),6)),12,1); tree rep.9270000 = (((((2,9),3),(((7,13),(4,14)),5)),(10,(8,((11,15),6)))),12,1); tree rep.9280000 = ((((5,(4,((13,7),14))),((9,2),3)),((11,(15,6)),(8,10))),12,1); tree rep.9290000 = (12,((((6,(11,15)),(8,10)),(14,((13,7),4))),(((9,2),3),5)),1); tree rep.9300000 = (12,((((3,(9,2)),((4,(7,13)),14)),5),(10,((11,(6,15)),8))),1); tree rep.9310000 = (12,(((((9,2),3),(4,(7,13))),(5,14)),(((11,15),6),(8,10))),1); tree rep.9320000 = (12,(((6,(11,15)),(10,8)),(((3,(2,9)),((13,(14,7)),4)),5)),1); tree rep.9330000 = (((((15,6),11),(10,8)),(((13,(4,7)),14),((3,(2,9)),5))),12,1); tree rep.9340000 = ((((9,2),3),(((4,(((8,10),(11,(15,6))),14)),5),(7,13))),12,1); tree rep.9350000 = (12,(((((15,6),11),8),10),((14,5),((4,(13,7)),(3,(9,2))))),1); tree rep.9360000 = (12,((((3,(9,2)),(((7,13),4),(5,14))),(15,(6,11))),(8,10)),1); tree rep.9370000 = ((((((9,2),5),3),(((7,13),4),14)),(10,(((6,15),11),8))),12,1); tree rep.9380000 = ((((3,(9,2)),((4,(7,13)),(5,14))),12),((((15,11),6),10),8),1); tree rep.9390000 = ((((9,2),3),((((13,7),4),14),((8,((11,(6,15)),10)),5))),12,1); tree rep.9400000 = (((13,7),(((14,(4,5)),((9,2),3)),12)),((8,10),(15,(6,11))),1); tree rep.9410000 = ((((8,10),(6,(11,15))),((((9,2),3),(4,(7,13))),(5,14))),12,1); tree rep.9420000 = (((8,10),((11,6),15)),(((3,12),(9,2)),(((7,13),4),(5,14))),1); tree rep.9430000 = ((((5,((7,(4,13)),14)),(3,(2,9))),((8,10),(11,(15,6)))),12,1); tree rep.9440000 = (12,((9,(3,2)),((((4,(13,7)),14),5),(10,(8,((15,6),11))))),1); tree rep.9450000 = ((14,((((11,(6,15)),(8,10)),(5,4)),(((2,9),3),(7,13)))),12,1); tree rep.9460000 = (((((3,(9,2)),5),((14,(7,13)),4)),(10,(8,(11,(6,15))))),12,1); tree rep.9470000 = (((5,((2,9),((((13,7),14),4),3))),((11,(15,6)),(10,8))),12,1); tree rep.9480000 = ((((14,(7,13)),(4,((3,(2,9)),5))),12),((6,(15,11)),(10,8)),1); tree rep.9490000 = ((((10,(11,(15,6))),8),((((13,7),4),(14,5)),(3,(2,9)))),12,1); tree rep.9500000 = (12,(((((11,6),15),10),8),((5,((7,(13,4)),14)),((9,2),3))),1); tree rep.9510000 = (12,((((11,(6,15)),8),10),(((2,9),3),((((7,13),4),5),14))),1); tree rep.9520000 = ((((6,11),15),(8,10)),(((3,(2,9)),(4,(7,13))),(12,(5,14))),1); tree rep.9530000 = (((((5,((7,13),14)),4),(3,(2,9))),(((11,(15,6)),10),8)),12,1); tree rep.9540000 = (12,((10,(8,((6,15),11))),((14,5),(((13,7),4),(3,(2,9))))),1); tree rep.9550000 = (12,(((8,10),((6,15),11)),(((9,2),3),(5,(((14,4),7),13)))),1); tree rep.9560000 = (((10,(8,((11,15),6))),((14,((9,2),3)),(((7,13),4),5))),12,1); tree rep.9570000 = (((14,(3,(2,9))),(5,((13,7),4))),(12,(8,(((15,6),11),10))),1); tree rep.9580000 = (((((9,2),(((7,13),14),4)),(3,5)),(((11,15),6),(8,10))),12,1); tree rep.9590000 = (12,(((9,2),3),(5,((((6,(11,15)),(10,8)),((13,7),4)),14))),1); tree rep.9600000 = (12,((5,((((10,8),(11,(6,15))),((4,7),13)),(3,(9,2)))),14),1); tree rep.9610000 = (12,(((10,((15,6),11)),8),((13,7),(((14,5),(3,(9,2))),4))),1); tree rep.9620000 = (((11,(15,6)),(10,8)),((3,((2,9),(14,((4,(13,7)),5)))),12),1); tree rep.9630000 = (((((11,(15,6)),8),10),((((9,2),3),((14,4),(13,7))),5)),12,1); tree rep.9640000 = (12,(((5,((9,2),3)),(4,(14,(7,13)))),((10,8),(6,(11,15)))),1); tree rep.9650000 = (((5,((14,(4,(13,7))),((9,2),3))),((8,((15,11),6)),10)),12,1); tree rep.9660000 = ((8,(10,((6,15),11))),(((3,(2,9)),((14,(5,(13,7))),4)),12),1); tree rep.9670000 = ((((10,8),(6,(11,15))),((3,(2,9)),((((7,13),5),4),14))),12,1); tree rep.9680000 = (((11,(15,6)),(10,8)),(12,(((2,9),3),(((14,(13,7)),4),5))),1); tree rep.9690000 = ((((6,(11,15)),(8,10)),((((5,14),(3,(9,2))),4),(13,7))),12,1); tree rep.9700000 = (((((((3,(9,2)),5),(14,((7,13),4))),8),10),(11,(15,6))),12,1); tree rep.9710000 = (((11,(6,15)),(((((9,2),3),5),(((13,7),4),14)),(8,10))),12,1); tree rep.9720000 = (12,((10,(8,((15,6),11))),((((4,(7,13)),14),5),(3,(9,2)))),1); tree rep.9730000 = (12,((((7,(14,5)),(3,(9,2))),(13,4)),((8,10),((15,11),6))),1); tree rep.9740000 = (12,(((10,8),((15,11),6)),((5,((9,2),3)),(4,((7,13),14)))),1); tree rep.9750000 = (12,((((11,(15,6)),(8,10)),(5,(14,((7,13),4)))),(3,(9,2))),1); tree rep.9760000 = (((8,10),(((11,15),6),((((9,2),3),5),(((13,7),4),14)))),12,1); tree rep.9770000 = (((((14,5),(3,(9,2))),((7,13),4)),(8,(10,(6,(11,15))))),12,1); tree rep.9780000 = ((((((((6,15),11),8),10),((13,7),4)),((3,(2,9)),14)),12),5,1); tree rep.9790000 = (12,(((4,(13,7)),(14,(((9,2),3),(((11,15),6),(8,10))))),5),1); tree rep.9800000 = ((((3,2),9),((((6,(11,15)),8),10),(14,((4,(13,7)),5)))),12,1); tree rep.9810000 = ((((10,(11,(6,15))),8),((14,(((9,2),3),5)),(4,(7,13)))),12,1); tree rep.9820000 = ((10,(((11,15),6),8)),((((((7,13),14),5),4),(3,(9,2))),12),1); tree rep.9830000 = (12,(((14,((4,(13,7)),((9,2),3))),5),((10,8),(11,(15,6)))),1); tree rep.9840000 = (12,(((6,(15,11)),(10,8)),(((9,2),3),(14,(5,(4,(7,13)))))),1); tree rep.9850000 = (((((6,15),11),(10,8)),((((2,9),3),(((7,13),4),14)),5)),12,1); tree rep.9860000 = ((((3,(2,9)),(5,((7,13),(4,14)))),(8,(((11,15),6),10))),12,1); tree rep.9870000 = ((8,((((5,((14,7),(13,4))),((2,9),3)),((6,15),11)),10)),12,1); tree rep.9880000 = (((4,((14,5),(((11,15),6),(8,10)))),((3,(2,9)),(7,13))),12,1); tree rep.9890000 = ((((5,(((13,7),(2,9)),4)),(14,3)),((10,((15,6),11)),8)),12,1); tree rep.9900000 = (12,(((6,(11,15)),(10,8)),(14,((((7,13),4),5),((9,2),3)))),1); tree rep.9910000 = (12,((5,(((9,2),3),((4,(7,13)),14))),((10,8),((15,11),6))),1); tree rep.9920000 = ((((((2,9),3),(4,(13,7))),(5,14)),(8,(((15,6),11),10))),12,1); tree rep.9930000 = (12,(((10,8),((11,15),6)),((4,(((14,13),7),(3,(2,9)))),5)),1); tree rep.9940000 = (12,((5,(14,(((9,2),3),((7,13),4)))),(8,(((15,11),6),10))),1); tree rep.9950000 = ((((((9,2),3),5),((14,(7,13)),4)),12),(((6,(15,11)),8),10),1); tree rep.9960000 = (12,(((2,9),3),(14,(13,(5,(4,((8,(((15,11),6),10)),7)))))),1); tree rep.9970000 = ((12,(10,(8,((15,6),11)))),((14,((7,13),4)),((2,9),(5,3))),1); tree rep.9980000 = (12,(((14,((((6,15),11),(8,10)),((2,9),3))),5),(4,(13,7))),1); tree rep.9990000 = (((10,(8,((11,15),6))),((13,7),(14,((4,(3,(9,2))),5)))),12,1); tree rep.10000000 = (12,((((5,14),4),((13,7),(8,(10,((15,11),6))))),((3,2),9)),1); end; phangorn/inst/extdata/trees/woodmouse.fasta0000644000176200001440000003447113475602650020701 0ustar liggesusers>No305 nttcgaaaaacacacccactactaaaanttatcagtcactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggagtctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatacatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacattttcatagaaacatgaaacatcggtgtggtccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaanttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagccacactgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgtccacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcagaccctata >No304 attcgaaaaacacacccactactaaaaattatcaaccactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtagtccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattncaaatttactntcagcaattccatacatcggaactaccctagtagaatgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactctagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaaccctgtn >No306 attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagaatgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacnncatattaaaccagaatgatacttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaaccctata >No0906S attcgaaaaacacacccactactaaaaatcatcaatcactccttcatcgatttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtatgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataataatttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaatacnnnn >No0908S attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagccccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttctccatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggggctacagtaattacaaatttactatcagcaattccatatatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatcctcccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No0909S attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaactatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacactttcatagaaacatgaaacatcggtgtgatccttctattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcgggactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaatcctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No0910S attcgaaaaacacacccactactaaaaattatcaatcactctttcatcgatttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccagatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggcgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttgcaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No0912S attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacggggaatgtattacgggtcatacattttcatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgctttccacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagacattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No0913S attcgaaaaacacacccactactaaaaattatcaaccactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatgcatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagaatgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggcgtactaataatagtttccttcctaataactctagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No1103S attcgaaaaacacacccactactaaaaattattaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacattttcatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No1007S attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgccgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacactttcatagaaacatgaaacatcggtgtgatccttctattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcgggactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaatcctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No1114S nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggagtctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagnaacccatatttgccgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatatattacggctcatacattctcatagaaacatgaaacatcggtgtggtccttttattcgcagtaatagtcacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttcctatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaggatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccattccttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No1202S attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgatttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccagatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgccgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggcgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No1206S attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgatttgccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttctccatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgtgcacctcttgtttcttcatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagacctcttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No1208S nnncgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgccgagacgtaaactatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacactttcatagaaacatgaaacatcggtgtgatccttctattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccctctgaggagctacagtaattacaaatttactatcagcaattccatacatcgggactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaatcctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn phangorn/inst/extdata/trees/RAxML_distances.Wang.nxs0000644000176200001440000014142413475602650022242 0ustar liggesusers#nexus BEGIN Taxa; DIMENSIONS ntax=28; TAXLABELS [1] 't0' [2] 't1' [3] 't2' [4] 't3' [5] 't4' [6] 't5' [7] 't6' [8] 't7' [9] 't8' [10] 't9' [11] 't10' [12] 't11' [13] 't12' [14] 't13' [15] 't14' [16] 't15' [17] 't16' [18] 't17' [19] 't18' [20] 't19' [21] 't20' [22] 't21' [23] 't22' [24] 't23' [25] 't24' [26] 't25' [27] 't26' [28] 't27' ; END; [Taxa] BEGIN Distances; DIMENSIONS ntax=28; FORMAT labels=no diagonal triangle=both; MATRIX 0.0 0.258843 0.409325 0.343611 0.386997 0.415368 0.467334 0.473925 0.408069 0.420966 0.43411 0.394818 0.389391 0.391833 0.378215 0.350729 0.345639 0.384907 0.508726 0.36965 0.401646 0.425956 0.475112 0.398581 0.446356 0.436988 0.369089 0.354247 0.258843 0.0 0.323278 0.239842 0.290738 0.303712 0.355727 0.361451 0.303126 0.328877 0.330235 0.305238 0.287997 0.28925 0.273233 0.243648 0.237544 0.285948 0.408866 0.273934 0.300483 0.316453 0.371314 0.289605 0.336424 0.335047 0.274434 0.251616 0.409325 0.323278 0.0 0.192319 0.275137 0.292431 0.35189 0.362158 0.296773 0.310806 0.326997 0.296513 0.272283 0.273158 0.265655 0.23153 0.229852 0.269492 0.391463 0.269358 0.28426 0.330917 0.349753 0.285794 0.307787 0.311625 0.257636 0.248276 0.343611 0.239842 0.192319 0.0 0.198776 0.213667 0.27468 0.280565 0.218724 0.241622 0.240754 0.218819 0.204383 0.202528 0.189195 0.15777 0.149061 0.201101 0.313442 0.193414 0.209843 0.237999 0.269041 0.214494 0.250222 0.253596 0.178383 0.171646 0.386997 0.290738 0.275137 0.198776 0.0 0.18134 0.319484 0.333494 0.263994 0.288442 0.294154 0.26471 0.243803 0.240583 0.227367 0.205057 0.198308 0.234238 0.355626 0.239961 0.25183 0.273172 0.3179 0.251589 0.285163 0.292887 0.221681 0.211134 0.415368 0.303712 0.292431 0.213667 0.18134 0.0 0.333731 0.340654 0.278111 0.300698 0.31011 0.28522 0.256139 0.258498 0.242481 0.221987 0.217595 0.24785 0.376793 0.252101 0.265266 0.293642 0.330253 0.272678 0.301029 0.302205 0.236378 0.229261 0.467334 0.355727 0.35189 0.27468 0.319484 0.333731 0.0 0.134287 0.168048 0.234852 0.24194 0.242607 0.30195 0.305477 0.288246 0.259075 0.256117 0.302991 0.41738 0.288657 0.317827 0.340062 0.383568 0.3144 0.350638 0.345894 0.292802 0.279407 0.473925 0.361451 0.362158 0.280565 0.333494 0.340654 0.134287 0.0 0.168357 0.231526 0.237933 0.239547 0.309204 0.307881 0.30116 0.27246 0.262342 0.317714 0.443878 0.299024 0.320617 0.343873 0.390457 0.316104 0.350009 0.345356 0.296305 0.28984 0.408069 0.303126 0.296773 0.218724 0.263994 0.278111 0.168048 0.168357 0.0 0.18008 0.181142 0.185641 0.244912 0.248834 0.236322 0.207572 0.201513 0.24871 0.372027 0.240296 0.259989 0.292156 0.320957 0.261104 0.294639 0.291276 0.240866 0.224824 0.420966 0.328877 0.310806 0.241622 0.288442 0.300698 0.234852 0.231526 0.18008 0.0 0.188549 0.209353 0.26783 0.265944 0.259007 0.231976 0.232078 0.276663 0.390486 0.266511 0.289918 0.309126 0.350459 0.278135 0.310626 0.303923 0.262268 0.254853 0.43411 0.330235 0.326997 0.240754 0.294154 0.31011 0.24194 0.237933 0.181142 0.188549 0.0 0.200935 0.276708 0.271141 0.260416 0.23615 0.238456 0.275479 0.390198 0.26919 0.289665 0.316638 0.352527 0.291514 0.320199 0.321656 0.269881 0.254806 0.394818 0.305238 0.296513 0.218819 0.26471 0.28522 0.242607 0.239547 0.185641 0.209353 0.200935 0.0 0.254629 0.248918 0.238901 0.214572 0.209137 0.247335 0.362256 0.244905 0.267859 0.289265 0.340281 0.26744 0.293766 0.290507 0.242726 0.227337 0.389391 0.287997 0.272283 0.204383 0.243803 0.256139 0.30195 0.309204 0.244912 0.26783 0.276708 0.254629 0.0 0.106404 0.215913 0.18846 0.188488 0.229021 0.350267 0.227728 0.243568 0.27675 0.298806 0.241919 0.279501 0.27594 0.228754 0.217302 0.391833 0.28925 0.273158 0.202528 0.240583 0.258498 0.305477 0.307881 0.248834 0.265944 0.271141 0.248918 0.106404 0.0 0.215622 0.188337 0.187822 0.231728 0.359961 0.226188 0.246065 0.271509 0.301748 0.242827 0.27931 0.272526 0.223715 0.214143 0.378215 0.273233 0.265655 0.189195 0.227367 0.242481 0.288246 0.30116 0.236322 0.259007 0.260416 0.238901 0.215913 0.215622 0.0 0.105689 0.170273 0.214167 0.335401 0.21004 0.227981 0.248821 0.290917 0.229404 0.267494 0.265412 0.20581 0.199473 0.350729 0.243648 0.23153 0.15777 0.205057 0.221987 0.259075 0.27246 0.207572 0.231976 0.23615 0.214572 0.18846 0.188337 0.105689 0.0 0.143812 0.184106 0.311927 0.183622 0.201611 0.220634 0.253471 0.201767 0.235578 0.234455 0.175537 0.16857 0.345639 0.237544 0.229852 0.149061 0.198308 0.217595 0.256117 0.262342 0.201513 0.232078 0.238456 0.209137 0.188488 0.187822 0.170273 0.143812 0.0 0.184446 0.309875 0.181246 0.200167 0.221079 0.254232 0.201279 0.233194 0.23272 0.174841 0.166217 0.384907 0.285948 0.269492 0.201101 0.234238 0.24785 0.302991 0.317714 0.24871 0.276663 0.275479 0.247335 0.229021 0.231728 0.214167 0.184106 0.184446 0.0 0.30631 0.205173 0.220753 0.263666 0.288162 0.231847 0.273379 0.270824 0.212613 0.200892 0.508726 0.408866 0.391463 0.313442 0.355626 0.376793 0.41738 0.443878 0.372027 0.390486 0.390198 0.362256 0.350267 0.359961 0.335401 0.311927 0.309875 0.30631 0.0 0.328767 0.345767 0.375018 0.413708 0.353073 0.377324 0.383577 0.326556 0.324104 0.36965 0.273934 0.269358 0.193414 0.239961 0.252101 0.288657 0.299024 0.240296 0.266511 0.26919 0.244905 0.227728 0.226188 0.21004 0.183622 0.181246 0.205173 0.328767 0.0 0.20445 0.244817 0.276658 0.231816 0.269496 0.272141 0.210992 0.20783 0.401646 0.300483 0.28426 0.209843 0.25183 0.265266 0.317827 0.320617 0.259989 0.289918 0.289665 0.267859 0.243568 0.246065 0.227981 0.201611 0.200167 0.220753 0.345767 0.20445 0.0 0.26742 0.303242 0.250707 0.278888 0.278873 0.227446 0.228395 0.425956 0.316453 0.330917 0.237999 0.273172 0.293642 0.340062 0.343873 0.292156 0.309126 0.316638 0.289265 0.27675 0.271509 0.248821 0.220634 0.221079 0.263666 0.375018 0.244817 0.26742 0.0 0.317486 0.270538 0.308484 0.306739 0.264346 0.244066 0.475112 0.371314 0.349753 0.269041 0.3179 0.330253 0.383568 0.390457 0.320957 0.350459 0.352527 0.340281 0.298806 0.301748 0.290917 0.253471 0.254232 0.288162 0.413708 0.276658 0.303242 0.317486 0.0 0.305015 0.339609 0.342366 0.282416 0.276724 0.398581 0.289605 0.285794 0.214494 0.251589 0.272678 0.3144 0.316104 0.261104 0.278135 0.291514 0.26744 0.241919 0.242827 0.229404 0.201767 0.201279 0.231847 0.353073 0.231816 0.250707 0.270538 0.305015 0.0 0.285912 0.284949 0.228325 0.220458 0.446356 0.336424 0.307787 0.250222 0.285163 0.301029 0.350638 0.350009 0.294639 0.310626 0.320199 0.293766 0.279501 0.27931 0.267494 0.235578 0.233194 0.273379 0.377324 0.269496 0.278888 0.308484 0.339609 0.285912 0.0 0.097874 0.268769 0.255562 0.436988 0.335047 0.311625 0.253596 0.292887 0.302205 0.345894 0.345356 0.291276 0.303923 0.321656 0.290507 0.27594 0.272526 0.265412 0.234455 0.23272 0.270824 0.383577 0.272141 0.278873 0.306739 0.342366 0.284949 0.097874 0.0 0.270444 0.256659 0.369089 0.274434 0.257636 0.178383 0.221681 0.236378 0.292802 0.296305 0.240866 0.262268 0.269881 0.242726 0.228754 0.223715 0.20581 0.175537 0.174841 0.212613 0.326556 0.210992 0.227446 0.264346 0.282416 0.228325 0.268769 0.270444 0.0 0.183681 0.354247 0.251616 0.248276 0.171646 0.211134 0.229261 0.279407 0.28984 0.224824 0.254853 0.254806 0.227337 0.217302 0.214143 0.199473 0.16857 0.166217 0.200892 0.324104 0.20783 0.228395 0.244066 0.276724 0.220458 0.255562 0.256659 0.183681 0.0 ; END; [Distances] BEGIN Splits; DIMENSIONS ntax=28 nsplits=90; FORMAT labels=no weights=yes confidences=no intervals=no; PROPERTIES fit=98.91263210217491 cyclic; CYCLE 1 3 4 5 6 17 15 16 13 14 12 10 11 9 8 7 26 25 19 18 21 20 23 22 24 27 28 2; MATRIX [1, size=1] 0.1279713 1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [2, size=2] 0.017143281 1 2 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [3, size=4] 0.0013902244 1 2 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [4, size=9] 1.5893235E-4 1 2 7 8 9 10 11 12 18 19 20 21 22 23 24 25 26 27 28, [5, size=3] 0.002769119 1 2 28, [6, size=2] 0.08403672 1 2, [7, size=1] 0.17367192 1, [8, size=1] 0.057841897 1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [9, size=3] 1.7729466E-4 1 2 3 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [10, size=5] 3.662799E-4 1 2 3 7 8 9 10 11 12 13 14 16 18 19 20 21 22 23 24 25 26 27 28, [11, size=2] 0.0060906718 1 3, [12, size=1] 0.08134686 1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [13, size=2] 0.038590923 1 2 3 4 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [14, size=4] 0.0018195357 1 2 3 4, [15, size=1] 0.09856205 1 2 3 4 5 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [16, size=8] 4.167727E-4 1 2 3 4 5 24 27 28, [17, size=4] 0.0012588556 1 3 4 5, [18, size=1] 0.0688266 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24 25 26 27 28, [19, size=3] 8.21237E-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 18 19 20 21 22 23 24 25 26 27 28, [20, size=12] 8.992125E-4 1 2 3 4 5 6 18 19 20 21 22 23 24 25 27 28, [21, size=8] 0.0022681346 1 2 3 4 5 6 27 28, [22, size=1] 0.0665534 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28, [23, size=2] 0.03262534 1 2 3 4 5 6 7 8 9 10 11 12 13 14 17 18 19 20 21 22 23 24 25 26 27 28, [24, size=3] 4.7089203E-4 1 2 3 4 5 6 7 8 9 10 11 12 14 17 18 19 20 21 22 23 24 25 26 27 28, [25, size=4] 4.685271E-4 1 2 3 4 5 6 7 8 9 10 11 12 17 18 19 20 21 22 23 24 25 26 27 28, [26, size=9] 0.0010168224 1 2 3 4 5 6 17 27 28, [27, size=1] 0.03859058 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28, [28, size=3] 3.5754856E-4 1 2 3 4 5 6 7 8 9 10 11 12 15 17 18 19 20 21 22 23 24 25 26 27 28, [29, size=1] 0.052748006 1 2 3 4 5 6 7 8 9 10 11 12 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [30, size=2] 0.06064433 1 2 3 4 5 6 7 8 9 10 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [31, size=7] 0.0010652957 1 2 3 4 5 6 7 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [32, size=9] 7.895848E-4 1 2 3 4 5 6 15 16 17 18 19 20 21 22 23 24 25 27 28, [33, size=1] 0.05142635 1 2 3 4 5 6 7 8 9 10 11 12 13 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [34, size=4] 0.0011806624 1 2 3 4 5 6 7 8 9 13 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [35, size=8] 1.787175E-4 1 2 3 4 5 6 13 15 16 17 18 19 20 21 22 23 24 25 27 28, [36, size=9] 8.855418E-4 1 2 3 4 5 6 13 15 16 17 18 19 20 21 22 23 24 27 28, [37, size=1] 0.0914247 1 2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [38, size=5] 0.0012966593 1 2 3 4 5 6 7 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [39, size=6] 0.038550336 1 2 3 4 5 6 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [40, size=9] 0.001203692 1 2 3 4 5 6 13 14 15 16 17 18 20 21 22 23 24 27 28, [41, size=1] 0.092642605 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [42, size=2] 0.0044335932 1 2 3 4 5 6 7 8 9 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [43, size=4] 0.0014246248 1 2 3 4 5 6 7 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [44, size=5] 0.012698617 1 2 3 4 5 6 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [45, size=7] 2.5534217E-4 1 2 3 4 5 6 12 13 14 15 16 17 18 19 20 21 22 23 24 27 28, [46, size=1] 0.09702029 1 2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [47, size=4] 0.0010406735 1 2 3 4 5 6 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [48, size=1] 0.05344081 1 2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [49, size=3] 0.021949023 1 2 3 4 5 6 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [50, size=14] 3.9997647E-4 1 2 3 4 5 6 10 11 12 13 14 15 16 17, [51, size=1] 0.06783958 1 2 3 4 5 6 7 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [52, size=2] 0.04591966 1 2 3 4 5 6 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [53, size=3] 2.8627258E-4 1 2 3 4 5 6 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28, [54, size=4] 4.0487162E-4 1 2 3 4 5 6 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 27 28, [55, size=1] 0.064194575 1 2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [56, size=1] 0.047182973 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28, [57, size=2] 0.10500158 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 27 28, [58, size=3] 0.0014762296 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23 24 27 28, [59, size=5] 0.001466786 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 20 22 23 24 27 28, [60, size=8] 8.702291E-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 24 27 28, [61, size=9] 0.0010516174 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 27 28, [62, size=1] 0.044313457 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 28, [63, size=2] 0.004750093 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23 24 26 27 28, [64, size=6] 1.337294E-5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 22 24 26 27 28, [65, size=1] 0.20566262 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23 24 25 26 27 28, [66, size=2] 0.013317523 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27 28, [67, size=4] 0.0021476466 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 22 23 24 25 26 27 28, [68, size=8] 0.0015038507 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 25 26 28, [69, size=1] 0.09029672 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 20 21 22 23 24 25 26 27 28, [70, size=2] 1.5751319E-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 20 22 23 24 25 26 27 28, [71, size=4] 0.0019187863 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 22 24 25 26 27 28, [72, size=1] 0.109228075 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28, [73, size=2] 0.006326371 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 22 23 24 25 26 27 28, [74, size=4] 0.0023116763 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 24 25 26 27 28, [75, size=1] 0.089916565 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 28, [76, size=2] 1.050739E-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 22 24 25 26 27 28, [77, size=3] 0.0016833246 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 24 25 26 27 28, [78, size=1] 0.17474917 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28, [79, size=2] 0.0022174222 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 24 25 26 27 28, [80, size=3] 0.001391344 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 25 26 27 28, [81, size=5] 4.242624E-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 25 26, [82, size=1] 0.13961297 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28, [83, size=2] 0.0013124112 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 25 26 27 28, [84, size=1] 0.1194786 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 25 26 27 28, [85, size=2] 4.8682792E-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 25 26 28, [86, size=1] 0.09366718 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28, [87, size=2] 0.0045568696 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26, [88, size=1] 0.08093566 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27, [89, size=2] 0.0015117239 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27, [90, size=1] 0.076351464 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, ; END; [Splits] BEGIN Network; DIMENSIONS ntax=28 nvertices=346 nedges=600; DRAW to_scale; TRANSLATE 2 't0', 3 't2', 4 't3', 5 't4', 6 't5', 7 't16', 8 't14', 9 't15', 10 't12', 11 't13', 12 't11', 13 't9', 14 't10', 15 't8', 16 't7', 17 't6', 18 't25', 19 't24', 20 't18', 21 't17', 22 't20', 23 't19', 24 't22', 25 't21', 26 't23', 27 't26', 28 't27', 29 't1', ; VERTICES 1 -0.17367192 0.0 w=2 h=2 s=n, 2 0.0 0.0 w=2 h=2 s=n, 3 -0.11768977 0.045046512 w=2 h=2 s=n, 4 -0.19602421 0.041381847 w=2 h=2 s=n, 5 -0.17523988 0.08842624 w=2 h=2 s=n, 6 -0.17898935 0.1143971 w=2 h=2 s=n, 7 -0.24188966 0.07239327 w=2 h=2 s=n, 8 -0.2543338 0.10839781 w=2 h=2 s=n, 9 -0.26945123 0.082165845 w=2 h=2 s=n, 10 -0.30659822 0.12002788 w=2 h=2 s=n, 11 -0.31904063 0.11555596 w=2 h=2 s=n, 12 -0.3723963 0.09579757 w=2 h=2 s=n, 13 -0.40555912 0.08773562 w=2 h=2 s=n, 14 -0.4215746 0.07218595 w=2 h=2 s=n, 15 -0.40375552 0.03841092 w=2 h=2 s=n, 16 -0.46578634 0.021180429 w=2 h=2 s=n, 17 -0.457186 0.0051984675 w=2 h=2 s=n, 18 -0.4112275 -0.0713001 w=2 h=2 s=n, 19 -0.40493098 -0.082802355 w=2 h=2 s=n, 20 -0.41573197 -0.17496379 w=2 h=2 s=n, 21 -0.32123187 -0.093300976 w=2 h=2 s=n, 22 -0.29972327 -0.1157434 w=2 h=2 s=n, 23 -0.27406484 -0.09962054 w=2 h=2 s=n, 24 -0.23216128 -0.17543635 w=2 h=2 s=n, 25 -0.2095651 -0.12994294 w=2 h=2 s=n, 26 -0.19596717 -0.09110639 w=2 h=2 s=n, 27 -0.19119321 -0.05464892 w=2 h=2 s=n, 28 -0.1878907 -0.030641899 w=2 h=2 s=n, 29 -0.10504844 -0.018586801 w=2 h=2 s=n, 30 -0.25718024 0.009409128 w=2 h=2 s=n, 31 -0.26323262 0.008727189 w=2 h=2 s=n, 32 -0.17972429 -6.819389E-4 w=2 h=2 s=n, 33 -0.25987992 0.010025315 w=2 h=2 s=n, 34 -0.2659323 0.009343375 w=2 h=2 s=n, 35 -0.2677404 0.009139652 w=2 h=2 s=n, 36 -0.2650407 0.008523465 w=2 h=2 s=n, 37 -0.26892862 0.008723878 w=2 h=2 s=n, 38 -0.2662289 0.008107692 w=2 h=2 s=n, 39 -0.2644208 0.008311415 w=2 h=2 s=n, 40 -0.18091251 -0.0010977125 w=2 h=2 s=n, 41 -0.26934275 0.008770542 w=2 h=2 s=n, 42 -0.27159664 0.008516592 w=2 h=2 s=n, 43 -0.27118248 0.008469928 w=2 h=2 s=n, 44 -0.27258795 0.008290328 w=2 h=2 s=n, 45 -0.27217382 0.008243664 w=2 h=2 s=n, 46 -0.27272007 0.007912797 w=2 h=2 s=n, 47 -0.2723059 0.007866133 w=2 h=2 s=n, 48 -0.2713146 0.008092397 w=2 h=2 s=n, 49 -0.2690607 0.008346348 w=2 h=2 s=n, 50 -0.26636103 0.007730161 w=2 h=2 s=n, 51 -0.27223247 0.009152431 w=2 h=2 s=n, 52 -0.2732238 0.008926167 w=2 h=2 s=n, 53 -0.2733559 0.008548636 w=2 h=2 s=n, 54 -0.25981095 0.010168508 w=2 h=2 s=n, 55 -0.26586333 0.009486569 w=2 h=2 s=n, 56 -0.26767144 0.009282845 w=2 h=2 s=n, 57 -0.26885965 0.008867072 w=2 h=2 s=n, 58 -0.2692738 0.008913736 w=2 h=2 s=n, 59 -0.27152768 0.008659785 w=2 h=2 s=n, 60 -0.2721635 0.009295625 w=2 h=2 s=n, 61 -0.27315485 0.00906936 w=2 h=2 s=n, 62 -0.27386624 0.009411948 w=2 h=2 s=n, 63 -0.2739352 0.009268755 w=2 h=2 s=n, 64 -0.27406728 0.008891224 w=2 h=2 s=n, 65 -0.27472958 0.009609 w=2 h=2 s=n, 66 -0.27479854 0.009465806 w=2 h=2 s=n, 67 -0.27493063 0.009088275 w=2 h=2 s=n, 68 -0.27421924 0.008745687 w=2 h=2 s=n, 69 -0.2735834 0.008109848 w=2 h=2 s=n, 70 -0.27600223 0.009465806 w=2 h=2 s=n, 71 -0.27613434 0.009088275 w=2 h=2 s=n, 72 -0.27542293 0.008745687 w=2 h=2 s=n, 73 -0.2747871 0.008109848 w=2 h=2 s=n, 74 -0.27392375 0.007912797 w=2 h=2 s=n, 75 -0.27636832 0.008063024 w=2 h=2 s=n, 76 -0.27565694 0.0077204364 w=2 h=2 s=n, 77 -0.2750211 0.007084597 w=2 h=2 s=n, 78 -0.27415776 0.0068875453 w=2 h=2 s=n, 79 -0.27295408 0.0068875453 w=2 h=2 s=n, 80 -0.2725399 0.0068408814 w=2 h=2 s=n, 81 -0.27489826 0.009668026 w=2 h=2 s=n, 82 -0.27496722 0.009524833 w=2 h=2 s=n, 83 -0.2761709 0.009524833 w=2 h=2 s=n, 84 -0.27630302 0.009147302 w=2 h=2 s=n, 85 -0.27653703 0.008122051 w=2 h=2 s=n, 86 -0.27682444 0.0073006563 w=2 h=2 s=n, 87 -0.27665576 0.0072416295 w=2 h=2 s=n, 88 -0.27594435 0.0068990416 w=2 h=2 s=n, 89 -0.27530852 0.006263202 w=2 h=2 s=n, 90 -0.27444518 0.0060661505 w=2 h=2 s=n, 91 -0.2732415 0.0060661505 w=2 h=2 s=n, 92 -0.2742768 0.004571756 w=2 h=2 s=n, 93 -0.2730731 0.004571756 w=2 h=2 s=n, 94 -0.2727857 0.0053931507 w=2 h=2 s=n, 95 -0.27237153 0.005346487 w=2 h=2 s=n, 96 -0.27213752 0.006371738 w=2 h=2 s=n, 97 -0.2711462 0.0065980023 w=2 h=2 s=n, 98 -0.26889235 0.006851953 w=2 h=2 s=n, 99 -0.27469912 0.010076149 w=2 h=2 s=n, 100 -0.27556247 0.0102732 w=2 h=2 s=n, 101 -0.27573115 0.010332228 w=2 h=2 s=n, 102 -0.2758001 0.010189034 w=2 h=2 s=n, 103 -0.2770038 0.010189034 w=2 h=2 s=n, 104 -0.2771359 0.009811503 w=2 h=2 s=n, 105 -0.27725914 0.010189034 w=2 h=2 s=n, 106 -0.27739123 0.009811503 w=2 h=2 s=n, 107 -0.27655837 0.009147302 w=2 h=2 s=n, 108 -0.27679238 0.008122051 w=2 h=2 s=n, 109 -0.2770798 0.0073006563 w=2 h=2 s=n, 110 -0.2769111 0.0072416295 w=2 h=2 s=n, 111 -0.2761997 0.0068990416 w=2 h=2 s=n, 112 -0.27556387 0.006263202 w=2 h=2 s=n, 113 -0.31339082 0.022921404 w=2 h=2 s=n, 114 -0.31364617 0.022921404 w=2 h=2 s=n, 115 -0.31377825 0.022543872 w=2 h=2 s=n, 116 -0.31294537 0.021879671 w=2 h=2 s=n, 117 -0.27556828 0.00625058 w=2 h=2 s=n, 118 -0.27531293 0.00625058 w=2 h=2 s=n, 119 -0.2744496 0.0060535283 w=2 h=2 s=n, 120 -0.27428123 0.004559133 w=2 h=2 s=n, 121 -0.27307752 0.004559133 w=2 h=2 s=n, 122 -0.26563498 0.009772938 w=2 h=2 s=n, 123 -0.26744306 0.009569215 w=2 h=2 s=n, 124 -0.26863128 0.009153441 w=2 h=2 s=n, 125 -0.26904544 0.0092001045 w=2 h=2 s=n, 126 -0.2712993 0.008946154 w=2 h=2 s=n, 127 -0.27193514 0.009581993 w=2 h=2 s=n, 128 -0.27292648 0.009355729 w=2 h=2 s=n, 129 -0.31455907 0.023484003 w=2 h=2 s=n, 130 -0.31481442 0.023484003 w=2 h=2 s=n, 131 -0.3149465 0.02310647 w=2 h=2 s=n, 132 -0.32719463 0.02630971 w=2 h=2 s=n, 133 -0.32732674 0.02593218 w=2 h=2 s=n, 134 -0.3261585 0.02536958 w=2 h=2 s=n, 135 -0.3253256 0.024705378 w=2 h=2 s=n, 136 -0.2779943 0.0061538764 w=2 h=2 s=n, 137 -0.27782562 0.00609485 w=2 h=2 s=n, 138 -0.27711424 0.005752262 w=2 h=2 s=n, 139 -0.27647838 0.0051164227 w=2 h=2 s=n, 140 -0.27648282 0.0051038004 w=2 h=2 s=n, 141 -0.27622747 0.0051038004 w=2 h=2 s=n, 142 -0.27536413 0.004906749 w=2 h=2 s=n, 143 -0.27519575 0.0034123538 w=2 h=2 s=n, 144 -0.27399206 0.0034123538 w=2 h=2 s=n, 145 -0.272813 0.0042274315 w=2 h=2 s=n, 146 -0.27280858 0.004240054 w=2 h=2 s=n, 147 -0.27252117 0.005061449 w=2 h=2 s=n, 148 -0.272107 0.005014785 w=2 h=2 s=n, 149 -0.271873 0.006040036 w=2 h=2 s=n, 150 -0.27088168 0.0062663006 w=2 h=2 s=n, 151 -0.26862782 0.0065202513 w=2 h=2 s=n, 152 -0.26879618 0.008014646 w=2 h=2 s=n, 153 -0.2660965 0.007398459 w=2 h=2 s=n, 154 -0.25863382 0.010908152 w=2 h=2 s=n, 155 -0.2646862 0.010226212 w=2 h=2 s=n, 156 -0.26445782 0.010512582 w=2 h=2 s=n, 157 -0.26626593 0.010308859 w=2 h=2 s=n, 158 -0.26745415 0.009893085 w=2 h=2 s=n, 159 -0.26786828 0.009939749 w=2 h=2 s=n, 160 -0.27297893 0.009821311 w=2 h=2 s=n, 161 -0.2732073 0.009534941 w=2 h=2 s=n, 162 -0.2739187 0.009877529 w=2 h=2 s=n, 163 -0.27475157 0.010541731 w=2 h=2 s=n, 164 -0.27561492 0.010738782 w=2 h=2 s=n, 165 -0.2757836 0.010797808 w=2 h=2 s=n, 166 -0.27661845 0.011632663 w=2 h=2 s=n, 167 -0.276566 0.011167082 w=2 h=2 s=n, 168 -0.27663496 0.011023888 w=2 h=2 s=n, 169 -0.27783865 0.011023888 w=2 h=2 s=n, 170 -0.31422567 0.023756258 w=2 h=2 s=n, 171 -0.31539392 0.024318857 w=2 h=2 s=n, 172 -0.31564927 0.024318857 w=2 h=2 s=n, 173 -0.32802948 0.027144564 w=2 h=2 s=n, 174 -0.32937416 0.027615089 w=2 h=2 s=n, 175 -0.3285393 0.026780235 w=2 h=2 s=n, 176 -0.32867143 0.026402703 w=2 h=2 s=n, 177 -0.3304083 0.027731607 w=2 h=2 s=n, 178 -0.32957345 0.026896752 w=2 h=2 s=n, 179 -0.32970557 0.026519222 w=2 h=2 s=n, 180 -0.3283609 0.026048698 w=2 h=2 s=n, 181 -0.32719263 0.025486099 w=2 h=2 s=n, 182 -0.32635975 0.024821898 w=2 h=2 s=n, 183 -0.3300877 0.026385501 w=2 h=2 s=n, 184 -0.32874304 0.025914976 w=2 h=2 s=n, 185 -0.3275748 0.025352377 w=2 h=2 s=n, 186 -0.3267419 0.024688177 w=2 h=2 s=n, 187 -0.32570776 0.024571659 w=2 h=2 s=n, 188 -0.31332752 0.02174595 w=2 h=2 s=n, 189 -0.2769405 0.009013581 w=2 h=2 s=n, 190 -0.2771745 0.00798833 w=2 h=2 s=n, 191 -0.27746195 0.0071669356 w=2 h=2 s=n, 192 -0.27837646 0.006020156 w=2 h=2 s=n, 193 -0.27820778 0.0059611294 w=2 h=2 s=n, 194 -0.27749637 0.0056185415 w=2 h=2 s=n, 195 -0.27686054 0.004982702 w=2 h=2 s=n, 196 -0.27686495 0.0049700798 w=2 h=2 s=n, 197 -0.27590507 0.001385226 w=2 h=2 s=n, 198 -0.2747014 0.001385226 w=2 h=2 s=n, 199 -0.27378684 0.0025320055 w=2 h=2 s=n, 200 -0.2749162 -5.2149536E-4 w=2 h=2 s=n, 201 -0.2740017 6.252841E-4 w=2 h=2 s=n, 202 -0.27329236 0.002652412 w=2 h=2 s=n, 203 -0.27302784 0.0023207103 w=2 h=2 s=n, 204 -0.2746574 -0.0028186364 w=2 h=2 s=n, 205 -0.27374285 -0.0016718569 w=2 h=2 s=n, 206 -0.27303353 3.55271E-4 w=2 h=2 s=n, 207 -0.272769 2.3569324E-5 w=2 h=2 s=n, 208 -0.2725542 0.0019302907 w=2 h=2 s=n, 209 -0.27254978 0.0019429132 w=2 h=2 s=n, 210 -0.2643192 0.0106231235 w=2 h=2 s=n, 211 -0.26612732 0.0104194 w=2 h=2 s=n, 212 -0.26731554 0.010003626 w=2 h=2 s=n, 213 -0.26772967 0.01005029 w=2 h=2 s=n, 214 -0.2717524 0.01038264 w=2 h=2 s=n, 215 -0.27274373 0.010156376 w=2 h=2 s=n, 216 -0.27279618 0.0106219575 w=2 h=2 s=n, 217 -0.27302456 0.010335588 w=2 h=2 s=n, 218 -0.27279618 0.011092849 w=2 h=2 s=n, 219 -0.27302456 0.01080648 w=2 h=2 s=n, 220 -0.2732073 0.010005834 w=2 h=2 s=n, 221 -0.2739187 0.0103484215 w=2 h=2 s=n, 222 -0.27475157 0.011012622 w=2 h=2 s=n, 223 -0.27310413 0.011155064 w=2 h=2 s=n, 224 -0.27328685 0.010354417 w=2 h=2 s=n, 225 -0.27399826 0.010697005 w=2 h=2 s=n, 226 -0.27483115 0.011361206 w=2 h=2 s=n, 227 -0.27483115 0.010890314 w=2 h=2 s=n, 228 -0.2756945 0.011087365 w=2 h=2 s=n, 229 -0.27586317 0.011146393 w=2 h=2 s=n, 230 -0.27669802 0.011981247 w=2 h=2 s=n, 231 -0.3516546 0.026519222 w=2 h=2 s=n, 232 -0.3520367 0.026385501 w=2 h=2 s=n, 233 -0.35069206 0.025914976 w=2 h=2 s=n, 234 -0.3495238 0.025352377 w=2 h=2 s=n, 235 -0.34869093 0.024688177 w=2 h=2 s=n, 236 -0.3523158 0.026321799 w=2 h=2 s=n, 237 -0.35097113 0.025851276 w=2 h=2 s=n, 238 -0.34980288 0.025288677 w=2 h=2 s=n, 239 -0.34897003 0.024624474 w=2 h=2 s=n, 240 -0.327021 0.024624474 w=2 h=2 s=n, 241 -0.32598686 0.024507957 w=2 h=2 s=n, 242 -0.31360662 0.02168225 w=2 h=2 s=n, 243 -0.2772196 0.00894988 w=2 h=2 s=n, 244 -0.2774536 0.007924628 w=2 h=2 s=n, 245 -0.27774104 0.007103234 w=2 h=2 s=n, 246 -0.27865556 0.005956454 w=2 h=2 s=n, 247 -0.2798097 0.00503604 w=2 h=2 s=n, 248 -0.2795306 0.0050997417 w=2 h=2 s=n, 249 -0.27936193 0.0050407154 w=2 h=2 s=n, 250 -0.27865055 0.004698127 w=2 h=2 s=n, 251 -0.27801472 0.004062288 w=2 h=2 s=n, 252 -0.27801913 0.0040496653 w=2 h=2 s=n, 253 -0.27763698 0.004183386 w=2 h=2 s=n, 254 -0.27738163 0.004183386 w=2 h=2 s=n, 255 -0.2765183 0.0039863344 w=2 h=2 s=n, 256 -0.2763499 0.0024919398 w=2 h=2 s=n, 257 -0.27705923 4.648119E-4 w=2 h=2 s=n, 258 -0.2733683 -0.003312977 w=2 h=2 s=n, 259 -0.27265897 -0.0012858491 w=2 h=2 s=n, 260 -0.27239445 -0.0016175507 w=2 h=2 s=n, 261 -0.2721796 2.891706E-4 w=2 h=2 s=n, 262 -0.2721752 3.017931E-4 w=2 h=2 s=n, 263 -0.27179077 -0.0028711085 w=2 h=2 s=n, 264 -0.27157593 -9.64387E-4 w=2 h=2 s=n, 265 -0.27157152 -9.517645E-4 w=2 h=2 s=n, 266 -0.27194607 6.893556E-4 w=2 h=2 s=n, 267 -0.2722049 0.0029864965 w=2 h=2 s=n, 268 -0.2719175 0.0038078912 w=2 h=2 s=n, 269 -0.27150333 0.0037612275 w=2 h=2 s=n, 270 -0.24245258 0.016570218 w=2 h=2 s=n, 271 -0.24850495 0.01588828 w=2 h=2 s=n, 272 -0.24827658 0.016174648 w=2 h=2 s=n, 273 -0.24813797 0.01628519 w=2 h=2 s=n, 274 -0.23883942 0.037707303 w=2 h=2 s=n, 275 -0.24002762 0.03729153 w=2 h=2 s=n, 276 -0.24044177 0.037338194 w=2 h=2 s=n, 277 -0.2691433 0.04351305 w=2 h=2 s=n, 278 -0.2693717 0.043226678 w=2 h=2 s=n, 279 -0.26945123 0.043575265 w=2 h=2 s=n, 280 -0.2948607 0.068602376 w=2 h=2 s=n, 281 -0.2948607 0.068131484 w=2 h=2 s=n, 282 -0.29572403 0.06832854 w=2 h=2 s=n, 283 -0.29589272 0.06838756 w=2 h=2 s=n, 284 -0.29672757 0.06922242 w=2 h=2 s=n, 285 -0.3331282 0.029973902 w=2 h=2 s=n, 286 -0.33416232 0.030090421 w=2 h=2 s=n, 287 -0.39794675 0.021180429 w=2 h=2 s=n, 288 -0.39660206 0.020709904 w=2 h=2 s=n, 289 -0.3954338 0.020147305 w=2 h=2 s=n, 290 -0.39460093 0.019483104 w=2 h=2 s=n, 291 -0.3687171 -0.05082817 w=2 h=2 s=n, 292 -0.368438 -0.050764468 w=2 h=2 s=n, 293 -0.36826932 -0.050823495 w=2 h=2 s=n, 294 -0.3675579 -0.051166084 w=2 h=2 s=n, 295 -0.36692208 -0.051801924 w=2 h=2 s=n, 296 -0.3669265 -0.051814545 w=2 h=2 s=n, 297 -0.37028533 -0.055173367 w=2 h=2 s=n, 298 -0.28137794 6.908425E-4 w=2 h=2 s=n, 299 -0.2809958 8.2456315E-4 w=2 h=2 s=n, 300 -0.28074044 8.2456315E-4 w=2 h=2 s=n, 301 -0.27987713 6.275116E-4 w=2 h=2 s=n, 302 -0.27970874 -8.668832E-4 w=2 h=2 s=n, 303 -0.28041807 -0.002894011 w=2 h=2 s=n, 304 -0.2875034 -0.01417028 w=2 h=2 s=n, 305 -0.28414458 -0.0108114565 w=2 h=2 s=n, 306 -0.28299043 -0.0098910425 w=2 h=2 s=n, 307 -0.28178674 -0.0098910425 w=2 h=2 s=n, 308 -0.28200155 -0.011797764 w=2 h=2 s=n, 309 -0.2820536 -0.011946438 w=2 h=2 s=n, 310 -0.27496824 -6.701694E-4 w=2 h=2 s=n, 311 -0.2747094 -0.0029673104 w=2 h=2 s=n, 312 -0.27541775 -0.009253902 w=2 h=2 s=n, 313 -0.2753657 -0.009105228 w=2 h=2 s=n, 314 -0.2744512 -0.0079584485 w=2 h=2 s=n, 315 -0.2740766 -0.009599569 w=2 h=2 s=n, 316 -0.27406484 -0.009703982 w=2 h=2 s=n, 317 -0.27335653 -0.0034173902 w=2 h=2 s=n, 318 -0.2726472 -0.0013902623 w=2 h=2 s=n, 319 -0.27238268 -0.001721964 w=2 h=2 s=n, 320 -0.271779 -0.0029755216 w=2 h=2 s=n, 321 -0.27104664 -0.0050685094 w=2 h=2 s=n, 322 -0.27105838 -0.0049640965 w=2 h=2 s=n, 323 -0.27084357 -0.0030573749 w=2 h=2 s=n, 324 -0.27083912 -0.0030447524 w=2 h=2 s=n, 325 -0.2701409 -0.004156003 w=2 h=2 s=n, 326 -0.27087325 -0.0020630148 w=2 h=2 s=n, 327 -0.27124783 -4.218947E-4 w=2 h=2 s=n, 328 -0.27150667 0.0018752463 w=2 h=2 s=n, 329 -0.27121925 0.002696641 w=2 h=2 s=n, 330 -0.2708051 0.0026499773 w=2 h=2 s=n, 331 -0.27046084 0.002305738 w=2 h=2 s=n, 332 -0.2711591 0.0034169883 w=2 h=2 s=n, 333 -0.2717628 0.004670546 w=2 h=2 s=n, 334 -0.27152878 0.005695797 w=2 h=2 s=n, 335 -0.27053744 0.0059220614 w=2 h=2 s=n, 336 -0.26828358 0.0061760116 w=2 h=2 s=n, 337 -0.26442516 0.003751611 w=2 h=2 s=n, 338 -0.2647694 0.0040958505 w=2 h=2 s=n, 339 -0.2649378 0.005590245 w=2 h=2 s=n, 340 -0.2622381 0.0049740584 w=2 h=2 s=n, 341 -0.26081118 0.0044747675 w=2 h=2 s=n, 342 -0.2646696 0.0068991682 w=2 h=2 s=n, 343 -0.26493412 0.00723087 w=2 h=2 s=n, 344 -0.26480204 0.007608401 w=2 h=2 s=n, 345 -0.26299393 0.007812124 w=2 h=2 s=n, 346 -0.17948562 -0.0015970032 w=2 h=2 s=n, ; VLABELS 2 't0' x=12 y=6 f='Dialog-PLAIN-10', 3 't2' x=12 y=9, 4 't3' x=11 y=11, 5 't4' x=9 y=13, 6 't5' x=3 y=20, 7 't16' x=-3 y=22, 8 't14' x=-5 y=23, 9 't15' x=-8 y=23, 10 't12' x=-11 y=23, 11 't13' x=-13 y=17, 12 't11' x=-16 y=20, 13 't9' x=-19 y=13, 14 't10' x=-27 y=11, 15 't8' x=-22 y=9, 16 't7' x=-22 y=6, 17 't6' x=-22 y=3, 18 't25' x=-27 y=1, 19 't24' x=-25 y=-1, 20 't18' x=-15 y=-13, 21 't17' x=-13 y=-15, 22 't20' x=-11 y=-16, 23 't19' x=-8 y=-16, 24 't22' x=-5 y=-16, 25 't21' x=-3 y=-15, 26 't23' x=-1 y=-13, 27 't26' x=9 y=-1, 28 't27' x=11 y=1, 29 't1' x=12 y=3, ; EDGES 1 1 2 s=7 w=0.17367192, 2 30 1 s=6 w=0.08403672, 3 31 30 s=11 w=0.0060906718, 4 32 1 s=11 w=0.0060906718, 5 32 31 s=6 w=0.08403672, 6 33 30 s=5 w=0.002769119, 7 34 31 s=5 w=0.002769119, 8 34 33 s=11 w=0.0060906718, 9 35 34 s=14 w=0.0018195357, 10 36 31 s=14 w=0.0018195357, 11 36 35 s=5 w=0.002769119, 12 37 35 s=17 w=0.0012588556, 13 38 36 s=17 w=0.0012588556, 14 38 37 s=5 w=0.002769119, 15 39 31 s=17 w=0.0012588556, 16 39 38 s=14 w=0.0018195357, 17 40 32 s=17 w=0.0012588556, 18 40 39 s=6 w=0.08403672, 19 41 37 s=16 w=4.167727E-4, 20 42 41 s=21 w=0.0022681346, 21 43 37 s=21 w=0.0022681346, 22 43 42 s=16 w=4.167727E-4, 23 44 42 s=26 w=0.0010168224, 24 45 43 s=26 w=0.0010168224, 25 45 44 s=16 w=4.167727E-4, 26 46 44 s=50 w=3.9997647E-4, 27 47 45 s=50 w=3.9997647E-4, 28 47 46 s=16 w=4.167727E-4, 29 48 43 s=50 w=3.9997647E-4, 30 48 47 s=26 w=0.0010168224, 31 49 37 s=50 w=3.9997647E-4, 32 49 48 s=21 w=0.0022681346, 33 50 38 s=50 w=3.9997647E-4, 34 50 49 s=5 w=0.002769119, 35 51 42 s=20 w=8.992125E-4, 36 52 44 s=20 w=8.992125E-4, 37 52 51 s=26 w=0.0010168224, 38 53 46 s=20 w=8.992125E-4, 39 53 52 s=50 w=3.9997647E-4, 40 54 33 s=4 w=1.5893235E-4, 41 55 34 s=4 w=1.5893235E-4, 42 55 54 s=11 w=0.0060906718, 43 56 35 s=4 w=1.5893235E-4, 44 56 55 s=14 w=0.0018195357, 45 57 37 s=4 w=1.5893235E-4, 46 57 56 s=17 w=0.0012588556, 47 58 41 s=4 w=1.5893235E-4, 48 58 57 s=16 w=4.167727E-4, 49 59 42 s=4 w=1.5893235E-4, 50 59 58 s=21 w=0.0022681346, 51 60 51 s=4 w=1.5893235E-4, 52 60 59 s=20 w=8.992125E-4, 53 61 52 s=4 w=1.5893235E-4, 54 61 60 s=26 w=0.0010168224, 55 62 61 s=32 w=7.895848E-4, 56 63 52 s=32 w=7.895848E-4, 57 63 62 s=4 w=1.5893235E-4, 58 64 53 s=32 w=7.895848E-4, 59 64 63 s=50 w=3.9997647E-4, 60 65 62 s=36 w=8.855418E-4, 61 66 63 s=36 w=8.855418E-4, 62 66 65 s=4 w=1.5893235E-4, 63 67 64 s=36 w=8.855418E-4, 64 67 66 s=50 w=3.9997647E-4, 65 68 53 s=36 w=8.855418E-4, 66 68 67 s=32 w=7.895848E-4, 67 69 46 s=36 w=8.855418E-4, 68 69 68 s=20 w=8.992125E-4, 69 70 66 s=40 w=0.001203692, 70 71 67 s=40 w=0.001203692, 71 71 70 s=50 w=3.9997647E-4, 72 72 68 s=40 w=0.001203692, 73 72 71 s=32 w=7.895848E-4, 74 73 69 s=40 w=0.001203692, 75 73 72 s=20 w=8.992125E-4, 76 74 46 s=40 w=0.001203692, 77 74 73 s=36 w=8.855418E-4, 78 75 71 s=61 w=0.0010516174, 79 76 72 s=61 w=0.0010516174, 80 76 75 s=32 w=7.895848E-4, 81 77 73 s=61 w=0.0010516174, 82 77 76 s=20 w=8.992125E-4, 83 78 74 s=61 w=0.0010516174, 84 78 77 s=36 w=8.855418E-4, 85 79 46 s=61 w=0.0010516174, 86 79 78 s=40 w=0.001203692, 87 80 47 s=61 w=0.0010516174, 88 80 79 s=16 w=4.167727E-4, 89 81 65 s=35 w=1.787175E-4, 90 82 66 s=35 w=1.787175E-4, 91 82 81 s=4 w=1.5893235E-4, 92 83 70 s=35 w=1.787175E-4, 93 83 82 s=40 w=0.001203692, 94 84 71 s=35 w=1.787175E-4, 95 84 83 s=50 w=3.9997647E-4, 96 85 75 s=35 w=1.787175E-4, 97 85 84 s=61 w=0.0010516174, 98 86 85 s=60 w=8.702291E-4, 99 87 75 s=60 w=8.702291E-4, 100 87 86 s=35 w=1.787175E-4, 101 88 76 s=60 w=8.702291E-4, 102 88 87 s=32 w=7.895848E-4, 103 89 77 s=60 w=8.702291E-4, 104 89 88 s=20 w=8.992125E-4, 105 90 78 s=60 w=8.702291E-4, 106 90 89 s=36 w=8.855418E-4, 107 91 79 s=60 w=8.702291E-4, 108 91 90 s=40 w=0.001203692, 109 92 90 s=68 w=0.0015038507, 110 93 91 s=68 w=0.0015038507, 111 93 92 s=40 w=0.001203692, 112 94 79 s=68 w=0.0015038507, 113 94 93 s=60 w=8.702291E-4, 114 95 80 s=68 w=0.0015038507, 115 95 94 s=16 w=4.167727E-4, 116 96 47 s=68 w=0.0015038507, 117 96 95 s=61 w=0.0010516174, 118 97 48 s=68 w=0.0015038507, 119 97 96 s=26 w=0.0010168224, 120 98 49 s=68 w=0.0015038507, 121 98 97 s=21 w=0.0022681346, 122 99 62 s=31 w=0.0010652957, 123 100 65 s=31 w=0.0010652957, 124 100 99 s=36 w=8.855418E-4, 125 101 81 s=31 w=0.0010652957, 126 101 100 s=35 w=1.787175E-4, 127 102 82 s=31 w=0.0010652957, 128 102 101 s=4 w=1.5893235E-4, 129 103 83 s=31 w=0.0010652957, 130 103 102 s=40 w=0.001203692, 131 104 84 s=31 w=0.0010652957, 132 104 103 s=50 w=3.9997647E-4, 133 105 103 s=45 w=2.5534217E-4, 134 106 104 s=45 w=2.5534217E-4, 135 106 105 s=50 w=3.9997647E-4, 136 107 84 s=45 w=2.5534217E-4, 137 107 106 s=31 w=0.0010652957, 138 108 85 s=45 w=2.5534217E-4, 139 108 107 s=61 w=0.0010516174, 140 109 86 s=45 w=2.5534217E-4, 141 109 108 s=60 w=8.702291E-4, 142 110 87 s=45 w=2.5534217E-4, 143 110 109 s=35 w=1.787175E-4, 144 111 88 s=45 w=2.5534217E-4, 145 111 110 s=32 w=7.895848E-4, 146 112 89 s=45 w=2.5534217E-4, 147 112 111 s=20 w=8.992125E-4, 148 113 103 s=39 w=0.038550336, 149 114 105 s=39 w=0.038550336, 150 114 113 s=45 w=2.5534217E-4, 151 115 106 s=39 w=0.038550336, 152 115 114 s=50 w=3.9997647E-4, 153 116 107 s=39 w=0.038550336, 154 116 115 s=31 w=0.0010652957, 155 117 112 s=64 w=1.337294E-5, 156 118 89 s=64 w=1.337294E-5, 157 118 117 s=45 w=2.5534217E-4, 158 119 90 s=64 w=1.337294E-5, 159 119 118 s=36 w=8.855418E-4, 160 120 92 s=64 w=1.337294E-5, 161 120 119 s=68 w=0.0015038507, 162 121 93 s=64 w=1.337294E-5, 163 121 120 s=40 w=0.001203692, 164 122 55 s=10 w=3.662799E-4, 165 123 56 s=10 w=3.662799E-4, 166 123 122 s=14 w=0.0018195357, 167 124 57 s=10 w=3.662799E-4, 168 124 123 s=17 w=0.0012588556, 169 125 58 s=10 w=3.662799E-4, 170 125 124 s=16 w=4.167727E-4, 171 126 59 s=10 w=3.662799E-4, 172 126 125 s=21 w=0.0022681346, 173 127 60 s=10 w=3.662799E-4, 174 127 126 s=20 w=8.992125E-4, 175 128 61 s=10 w=3.662799E-4, 176 128 127 s=26 w=0.0010168224, 177 129 113 s=38 w=0.0012966593, 178 130 114 s=38 w=0.0012966593, 179 130 129 s=45 w=2.5534217E-4, 180 131 115 s=38 w=0.0012966593, 181 131 130 s=50 w=3.9997647E-4, 182 132 130 s=44 w=0.012698617, 183 133 131 s=44 w=0.012698617, 184 133 132 s=50 w=3.9997647E-4, 185 134 115 s=44 w=0.012698617, 186 134 133 s=38 w=0.0012966593, 187 135 116 s=44 w=0.012698617, 188 135 134 s=31 w=0.0010652957, 189 136 109 s=59 w=0.001466786, 190 137 110 s=59 w=0.001466786, 191 137 136 s=35 w=1.787175E-4, 192 138 111 s=59 w=0.001466786, 193 138 137 s=32 w=7.895848E-4, 194 139 112 s=59 w=0.001466786, 195 139 138 s=20 w=8.992125E-4, 196 140 117 s=59 w=0.001466786, 197 140 139 s=64 w=1.337294E-5, 198 141 118 s=59 w=0.001466786, 199 141 140 s=45 w=2.5534217E-4, 200 142 119 s=59 w=0.001466786, 201 142 141 s=36 w=8.855418E-4, 202 143 120 s=59 w=0.001466786, 203 143 142 s=68 w=0.0015038507, 204 144 121 s=59 w=0.001466786, 205 144 143 s=40 w=0.001203692, 206 145 121 s=81 w=4.242624E-4, 207 146 93 s=81 w=4.242624E-4, 208 146 145 s=64 w=1.337294E-5, 209 147 94 s=81 w=4.242624E-4, 210 147 146 s=60 w=8.702291E-4, 211 148 95 s=81 w=4.242624E-4, 212 148 147 s=16 w=4.167727E-4, 213 149 96 s=81 w=4.242624E-4, 214 149 148 s=61 w=0.0010516174, 215 150 97 s=81 w=4.242624E-4, 216 150 149 s=26 w=0.0010168224, 217 151 98 s=81 w=4.242624E-4, 218 151 150 s=21 w=0.0022681346, 219 152 49 s=81 w=4.242624E-4, 220 152 151 s=68 w=0.0015038507, 221 153 50 s=81 w=4.242624E-4, 222 153 152 s=5 w=0.002769119, 223 154 54 s=3 w=0.0013902244, 224 155 55 s=3 w=0.0013902244, 225 155 154 s=11 w=0.0060906718, 226 156 122 s=3 w=0.0013902244, 227 156 155 s=10 w=3.662799E-4, 228 157 123 s=3 w=0.0013902244, 229 157 156 s=14 w=0.0018195357, 230 158 124 s=3 w=0.0013902244, 231 158 157 s=17 w=0.0012588556, 232 159 125 s=3 w=0.0013902244, 233 159 158 s=16 w=4.167727E-4, 234 160 128 s=25 w=4.685271E-4, 235 161 61 s=25 w=4.685271E-4, 236 161 160 s=10 w=3.662799E-4, 237 162 62 s=25 w=4.685271E-4, 238 162 161 s=32 w=7.895848E-4, 239 163 99 s=25 w=4.685271E-4, 240 163 162 s=31 w=0.0010652957, 241 164 100 s=25 w=4.685271E-4, 242 164 163 s=36 w=8.855418E-4, 243 165 101 s=25 w=4.685271E-4, 244 165 164 s=35 w=1.787175E-4, 245 166 165 s=34 w=0.0011806624, 246 167 101 s=34 w=0.0011806624, 247 167 166 s=25 w=4.685271E-4, 248 168 102 s=34 w=0.0011806624, 249 168 167 s=4 w=1.5893235E-4, 250 169 103 s=34 w=0.0011806624, 251 169 168 s=40 w=0.001203692, 252 170 113 s=34 w=0.0011806624, 253 170 169 s=39 w=0.038550336, 254 171 129 s=34 w=0.0011806624, 255 171 170 s=38 w=0.0012966593, 256 171 12 s=37 w=0.0914247, 257 172 130 s=34 w=0.0011806624, 258 172 171 s=45 w=2.5534217E-4, 259 173 132 s=34 w=0.0011806624, 260 173 172 s=44 w=0.012698617, 261 174 173 s=43 w=0.0014246248, 262 175 132 s=43 w=0.0014246248, 263 175 174 s=34 w=0.0011806624, 264 176 133 s=43 w=0.0014246248, 265 176 175 s=50 w=3.9997647E-4, 266 177 174 s=47 w=0.0010406735, 267 178 175 s=47 w=0.0010406735, 268 178 177 s=34 w=0.0011806624, 269 179 176 s=47 w=0.0010406735, 270 179 178 s=50 w=3.9997647E-4, 271 180 133 s=47 w=0.0010406735, 272 180 179 s=43 w=0.0014246248, 273 181 134 s=47 w=0.0010406735, 274 181 180 s=38 w=0.0012966593, 275 182 135 s=47 w=0.0010406735, 276 182 181 s=31 w=0.0010652957, 277 183 179 s=54 w=4.0487162E-4, 278 184 180 s=54 w=4.0487162E-4, 279 184 183 s=43 w=0.0014246248, 280 185 181 s=54 w=4.0487162E-4, 281 185 184 s=38 w=0.0012966593, 282 186 182 s=54 w=4.0487162E-4, 283 186 185 s=31 w=0.0010652957, 284 187 135 s=54 w=4.0487162E-4, 285 187 186 s=47 w=0.0010406735, 286 188 116 s=54 w=4.0487162E-4, 287 188 187 s=44 w=0.012698617, 288 189 107 s=54 w=4.0487162E-4, 289 189 188 s=39 w=0.038550336, 290 190 108 s=54 w=4.0487162E-4, 291 190 189 s=61 w=0.0010516174, 292 191 109 s=54 w=4.0487162E-4, 293 191 190 s=60 w=8.702291E-4, 294 192 136 s=54 w=4.0487162E-4, 295 192 191 s=59 w=0.001466786, 296 193 137 s=54 w=4.0487162E-4, 297 193 192 s=35 w=1.787175E-4, 298 194 138 s=54 w=4.0487162E-4, 299 194 193 s=32 w=7.895848E-4, 300 195 139 s=54 w=4.0487162E-4, 301 195 194 s=20 w=8.992125E-4, 302 196 140 s=54 w=4.0487162E-4, 303 196 195 s=64 w=1.337294E-5, 304 197 143 s=67 w=0.0021476466, 305 198 144 s=67 w=0.0021476466, 306 198 197 s=40 w=0.001203692, 307 199 121 s=67 w=0.0021476466, 308 199 198 s=59 w=0.001466786, 309 200 198 s=71 w=0.0019187863, 310 201 199 s=71 w=0.0019187863, 311 201 200 s=59 w=0.001466786, 312 202 121 s=71 w=0.0019187863, 313 202 201 s=67 w=0.0021476466, 314 203 145 s=71 w=0.0019187863, 315 203 202 s=81 w=4.242624E-4, 316 204 200 s=74 w=0.0023116763, 317 205 201 s=74 w=0.0023116763, 318 205 204 s=59 w=0.001466786, 319 206 202 s=74 w=0.0023116763, 320 206 205 s=67 w=0.0021476466, 321 207 203 s=74 w=0.0023116763, 322 207 206 s=81 w=4.242624E-4, 323 208 145 s=74 w=0.0023116763, 324 208 207 s=71 w=0.0019187863, 325 209 146 s=74 w=0.0023116763, 326 209 208 s=64 w=1.337294E-5, 327 210 156 s=9 w=1.7729466E-4, 328 211 157 s=9 w=1.7729466E-4, 329 211 210 s=14 w=0.0018195357, 330 212 158 s=9 w=1.7729466E-4, 331 212 211 s=17 w=0.0012588556, 332 213 159 s=9 w=1.7729466E-4, 333 213 212 s=16 w=4.167727E-4, 334 214 127 s=19 w=8.21237E-4, 335 214 7 s=18 w=0.0688266, 336 215 128 s=19 w=8.21237E-4, 337 215 214 s=26 w=0.0010168224, 338 216 160 s=19 w=8.21237E-4, 339 216 215 s=25 w=4.685271E-4, 340 217 161 s=19 w=8.21237E-4, 341 217 216 s=10 w=3.662799E-4, 342 218 216 s=24 w=4.7089203E-4, 343 219 217 s=24 w=4.7089203E-4, 344 219 218 s=10 w=3.662799E-4, 345 220 161 s=24 w=4.7089203E-4, 346 220 219 s=19 w=8.21237E-4, 347 221 162 s=24 w=4.7089203E-4, 348 221 220 s=32 w=7.895848E-4, 349 222 163 s=24 w=4.7089203E-4, 350 222 221 s=31 w=0.0010652957, 351 223 219 s=28 w=3.5754856E-4, 352 224 220 s=28 w=3.5754856E-4, 353 224 223 s=19 w=8.21237E-4, 354 225 221 s=28 w=3.5754856E-4, 355 225 224 s=32 w=7.895848E-4, 356 226 222 s=28 w=3.5754856E-4, 357 226 225 s=31 w=0.0010652957, 358 227 163 s=28 w=3.5754856E-4, 359 227 226 s=24 w=4.7089203E-4, 360 228 164 s=28 w=3.5754856E-4, 361 228 227 s=36 w=8.855418E-4, 362 229 165 s=28 w=3.5754856E-4, 363 229 228 s=35 w=1.787175E-4, 364 230 166 s=28 w=3.5754856E-4, 365 230 229 s=34 w=0.0011806624, 366 231 179 s=49 w=0.021949023, 367 231 15 s=48 w=0.05344081, 368 232 183 s=49 w=0.021949023, 369 232 231 s=54 w=4.0487162E-4, 370 233 184 s=49 w=0.021949023, 371 233 232 s=43 w=0.0014246248, 372 234 185 s=49 w=0.021949023, 373 234 233 s=38 w=0.0012966593, 374 235 186 s=49 w=0.021949023, 375 235 234 s=31 w=0.0010652957, 376 236 232 s=53 w=2.8627258E-4, 377 237 233 s=53 w=2.8627258E-4, 378 237 236 s=43 w=0.0014246248, 379 238 234 s=53 w=2.8627258E-4, 380 238 237 s=38 w=0.0012966593, 381 239 235 s=53 w=2.8627258E-4, 382 239 238 s=31 w=0.0010652957, 383 240 186 s=53 w=2.8627258E-4, 384 240 239 s=49 w=0.021949023, 385 241 187 s=53 w=2.8627258E-4, 386 241 240 s=47 w=0.0010406735, 387 242 188 s=53 w=2.8627258E-4, 388 242 241 s=44 w=0.012698617, 389 243 189 s=53 w=2.8627258E-4, 390 243 242 s=39 w=0.038550336, 391 244 190 s=53 w=2.8627258E-4, 392 244 243 s=61 w=0.0010516174, 393 245 191 s=53 w=2.8627258E-4, 394 245 244 s=60 w=8.702291E-4, 395 246 192 s=53 w=2.8627258E-4, 396 246 245 s=59 w=0.001466786, 397 247 246 s=58 w=0.0014762296, 398 248 192 s=58 w=0.0014762296, 399 248 247 s=53 w=2.8627258E-4, 400 249 193 s=58 w=0.0014762296, 401 249 248 s=35 w=1.787175E-4, 402 250 194 s=58 w=0.0014762296, 403 250 249 s=32 w=7.895848E-4, 404 251 195 s=58 w=0.0014762296, 405 251 250 s=20 w=8.992125E-4, 406 252 196 s=58 w=0.0014762296, 407 252 251 s=64 w=1.337294E-5, 408 253 140 s=58 w=0.0014762296, 409 253 252 s=54 w=4.0487162E-4, 410 254 141 s=58 w=0.0014762296, 411 254 253 s=45 w=2.5534217E-4, 412 255 142 s=58 w=0.0014762296, 413 255 254 s=36 w=8.855418E-4, 414 256 143 s=58 w=0.0014762296, 415 256 255 s=68 w=0.0015038507, 416 257 197 s=58 w=0.0014762296, 417 257 256 s=67 w=0.0021476466, 418 258 205 s=77 w=0.0016833246, 419 259 206 s=77 w=0.0016833246, 420 259 258 s=67 w=0.0021476466, 421 260 207 s=77 w=0.0016833246, 422 260 259 s=81 w=4.242624E-4, 423 261 208 s=77 w=0.0016833246, 424 261 260 s=71 w=0.0019187863, 425 262 209 s=77 w=0.0016833246, 426 262 261 s=64 w=1.337294E-5, 427 263 260 s=80 w=0.001391344, 428 264 261 s=80 w=0.001391344, 429 264 263 s=71 w=0.0019187863, 430 265 262 s=80 w=0.001391344, 431 265 264 s=64 w=1.337294E-5, 432 266 209 s=80 w=0.001391344, 433 266 265 s=77 w=0.0016833246, 434 267 146 s=80 w=0.001391344, 435 267 266 s=74 w=0.0023116763, 436 268 147 s=80 w=0.001391344, 437 268 267 s=60 w=8.702291E-4, 438 269 148 s=80 w=0.001391344, 439 269 268 s=16 w=4.167727E-4, 440 270 154 s=2 w=0.017143281, 441 270 3 s=1 w=0.1279713, 442 271 155 s=2 w=0.017143281, 443 271 270 s=11 w=0.0060906718, 444 272 156 s=2 w=0.017143281, 445 272 271 s=10 w=3.662799E-4, 446 273 210 s=2 w=0.017143281, 447 273 272 s=9 w=1.7729466E-4, 448 273 4 s=8 w=0.057841897, 449 274 211 s=13 w=0.038590923, 450 274 5 s=12 w=0.08134686, 451 275 212 s=13 w=0.038590923, 452 275 274 s=17 w=0.0012588556, 453 276 213 s=13 w=0.038590923, 454 276 275 s=16 w=4.167727E-4, 455 276 6 s=15 w=0.09856205, 456 277 218 s=23 w=0.03262534, 457 277 8 s=22 w=0.0665534, 458 278 219 s=23 w=0.03262534, 459 278 277 s=10 w=3.662799E-4, 460 279 223 s=23 w=0.03262534, 461 279 278 s=28 w=3.5754856E-4, 462 279 9 s=27 w=0.03859058, 463 280 226 s=30 w=0.06064433, 464 280 10 s=29 w=0.052748006, 465 281 227 s=30 w=0.06064433, 466 281 280 s=24 w=4.7089203E-4, 467 282 228 s=30 w=0.06064433, 468 282 281 s=36 w=8.855418E-4, 469 283 229 s=30 w=0.06064433, 470 283 282 s=35 w=1.787175E-4, 471 284 230 s=30 w=0.06064433, 472 284 283 s=34 w=0.0011806624, 473 284 11 s=33 w=0.05142635, 474 285 174 s=42 w=0.0044335932, 475 285 13 s=41 w=0.092642605, 476 286 177 s=42 w=0.0044335932, 477 286 285 s=47 w=0.0010406735, 478 286 14 s=46 w=0.09702029, 479 287 236 s=52 w=0.04591966, 480 287 16 s=51 w=0.06783958, 481 288 237 s=52 w=0.04591966, 482 288 287 s=43 w=0.0014246248, 483 289 238 s=52 w=0.04591966, 484 289 288 s=38 w=0.0012966593, 485 290 239 s=52 w=0.04591966, 486 290 289 s=31 w=0.0010652957, 487 290 17 s=55 w=0.064194575, 488 291 247 s=57 w=0.10500158, 489 291 18 s=56 w=0.047182973, 490 292 248 s=57 w=0.10500158, 491 292 291 s=53 w=2.8627258E-4, 492 293 249 s=57 w=0.10500158, 493 293 292 s=35 w=1.787175E-4, 494 294 250 s=57 w=0.10500158, 495 294 293 s=32 w=7.895848E-4, 496 295 251 s=57 w=0.10500158, 497 295 294 s=20 w=8.992125E-4, 498 296 252 s=57 w=0.10500158, 499 296 295 s=64 w=1.337294E-5, 500 297 296 s=63 w=0.004750093, 501 297 19 s=62 w=0.044313457, 502 298 252 s=63 w=0.004750093, 503 298 297 s=57 w=0.10500158, 504 299 253 s=63 w=0.004750093, 505 299 298 s=54 w=4.0487162E-4, 506 300 254 s=63 w=0.004750093, 507 300 299 s=45 w=2.5534217E-4, 508 301 255 s=63 w=0.004750093, 509 301 300 s=36 w=8.855418E-4, 510 302 256 s=63 w=0.004750093, 511 302 301 s=68 w=0.0015038507, 512 303 257 s=63 w=0.004750093, 513 303 302 s=67 w=0.0021476466, 514 304 303 s=66 w=0.013317523, 515 304 20 s=65 w=0.20566262, 516 305 257 s=66 w=0.013317523, 517 305 304 s=63 w=0.004750093, 518 306 197 s=66 w=0.013317523, 519 306 305 s=58 w=0.0014762296, 520 307 198 s=66 w=0.013317523, 521 307 306 s=40 w=0.001203692, 522 308 200 s=66 w=0.013317523, 523 308 307 s=71 w=0.0019187863, 524 309 308 s=70 w=1.5751319E-4, 525 309 21 s=69 w=0.09029672, 526 310 200 s=70 w=1.5751319E-4, 527 310 309 s=66 w=0.013317523, 528 311 204 s=70 w=1.5751319E-4, 529 311 310 s=74 w=0.0023116763, 530 312 311 s=73 w=0.006326371, 531 312 22 s=72 w=0.109228075, 532 313 204 s=73 w=0.006326371, 533 313 312 s=70 w=1.5751319E-4, 534 314 205 s=73 w=0.006326371, 535 314 313 s=59 w=0.001466786, 536 315 258 s=73 w=0.006326371, 537 315 314 s=77 w=0.0016833246, 538 316 315 s=76 w=1.050739E-4, 539 316 23 s=75 w=0.089916565, 540 317 258 s=76 w=1.050739E-4, 541 317 316 s=73 w=0.006326371, 542 318 259 s=76 w=1.050739E-4, 543 318 317 s=67 w=0.0021476466, 544 319 260 s=76 w=1.050739E-4, 545 319 318 s=81 w=4.242624E-4, 546 320 263 s=76 w=1.050739E-4, 547 320 319 s=80 w=0.001391344, 548 321 320 s=79 w=0.0022174222, 549 321 24 s=78 w=0.17474917, 550 322 263 s=79 w=0.0022174222, 551 322 321 s=76 w=1.050739E-4, 552 323 264 s=79 w=0.0022174222, 553 323 322 s=71 w=0.0019187863, 554 324 265 s=79 w=0.0022174222, 555 324 323 s=64 w=1.337294E-5, 556 325 324 s=83 w=0.0013124112, 557 325 25 s=82 w=0.13961297, 558 326 265 s=83 w=0.0013124112, 559 326 325 s=79 w=0.0022174222, 560 327 266 s=83 w=0.0013124112, 561 327 326 s=77 w=0.0016833246, 562 328 267 s=83 w=0.0013124112, 563 328 327 s=74 w=0.0023116763, 564 329 268 s=83 w=0.0013124112, 565 329 328 s=60 w=8.702291E-4, 566 330 269 s=83 w=0.0013124112, 567 330 329 s=16 w=4.167727E-4, 568 331 330 s=85 w=4.8682792E-4, 569 331 26 s=84 w=0.1194786, 570 332 269 s=85 w=4.8682792E-4, 571 332 331 s=83 w=0.0013124112, 572 333 148 s=85 w=4.8682792E-4, 573 333 332 s=80 w=0.001391344, 574 334 149 s=85 w=4.8682792E-4, 575 334 333 s=61 w=0.0010516174, 576 335 150 s=85 w=4.8682792E-4, 577 335 334 s=26 w=0.0010168224, 578 336 151 s=85 w=4.8682792E-4, 579 336 335 s=21 w=0.0022681346, 580 337 336 s=87 w=0.0045568696, 581 337 27 s=86 w=0.09366718, 582 338 151 s=87 w=0.0045568696, 583 338 337 s=85 w=4.8682792E-4, 584 339 152 s=87 w=0.0045568696, 585 339 338 s=68 w=0.0015038507, 586 340 153 s=87 w=0.0045568696, 587 340 339 s=5 w=0.002769119, 588 341 340 s=89 w=0.0015117239, 589 341 28 s=88 w=0.08093566, 590 342 153 s=89 w=0.0015117239, 591 342 341 s=87 w=0.0045568696, 592 343 50 s=89 w=0.0015117239, 593 343 342 s=81 w=4.242624E-4, 594 344 38 s=89 w=0.0015117239, 595 344 343 s=50 w=3.9997647E-4, 596 345 39 s=89 w=0.0015117239, 597 345 344 s=14 w=0.0018195357, 598 346 40 s=89 w=0.0015117239, 599 346 345 s=6 w=0.08403672, 600 346 29 s=90 w=0.076351464, ; END; [Network] BEGIN st_Assumptions; uptodate; disttransform=NeighborNet; splitstransform=EqualAngle; SplitsPostProcess filter=dimension value=4; exclude no missing; autolayoutnodelabels; END; [st_Assumptions] phangorn/inst/extdata/FLU.dat0000644000176200001440000000721113475602650015626 0ustar liggesusers 0.138658764751059 0.0533665787145181 0.161000889039552 0.584852305649886 0.00677184253227681 7.73739287051356 0.0264470951166826 0.16720700818221 1.30249856764315e-005 0.014132062548787 0.353753981649393 3.29271694159791 0.530642655337477 0.145469388422239 0.00254733397966779 1.4842345032161 0.124897616909194 0.0616521921873234 5.37051127867923 3.91106992668137e-011 1.19562912226203 1.13231312248046 1.19062446519178 0.322524647863997 1.93483278448943 0.116941459124876 0.108051341246072 1.59309882471598 0.214757862168721 1.87956993845887 1.38709603234116 0.887570549414031 0.0218446166959521 5.33031341222104 0.256491863423002 0.0587745274250666 0.149926734229061 0.246117171830255 0.21857197541607 0.0140859174993809 0.00111215807314139 0.0288399502994541 0.0142107118685268 1.62662283098296e-005 0.243190142026506 0.0231169515264061 0.296045557460629 0.000835873174542931 0.00573068208525287 0.00561362724916376 1.02036695531654 0.016499535540562 0.00651622937676521 0.321611693603646 3.51207228207807 0.474333610192982 15.3000966197798 2.6468479652886 0.290042980143818 3.83228119049152e-006 2.559587177122 3.88148880863814 0.264148929349066 0.347302791211758 0.227707997165566 0.129223639195248 0.0587454231508643 0.890162345593224 0.00525168778853117 0.0417629637305017 0.111457310321926 0.190259181297527 0.313974351356074 0.00150046692269255 0.00127350890508147 9.01795420287895 6.74693648486614 1.33129161941264 0.0804909094320368 0.0160550314767596 0.000836445615590923 1.0600102849456e-006 0.10405366623526 0.0326806570137471 0.00100350082518749 0.00123664495412902 0.119028506158521 1.46335727834648 2.98680003596399 0.319895904499071 0.279910508981581 0.659311477863896 0.154027179890711 0.0364417719063219 0.188539456415654 1.59312060172652e-013 0.712769599068934 0.319558828428154 0.0386317614553493 0.924466914225534 0.0805433268150369 0.634308520867322 0.195750631825315 0.0568693216513547 0.0071324304661639 3.01134451903854 0.950138410087378 3.88131053061457 0.338372183381345 0.336263344504404 0.487822498528951 0.307140298031341 1.58564657669139 0.580704249811294 0.290381075260226 0.570766693213698 0.283807671568883 0.00702658828739369 0.996685669575839 2.08738534433198 5.4182981753166 0.183076905018197 2.14033231636063 0.135481232622983 0.011975265782196 0.60234096342392 0.2801248951174 0.0188080299490973 0.368713573381758 2.90405228596936 0.0449263566753846 1.52696419998775 2.03151132062208 0.000134906239484254 0.54225109402693 2.2068599339404 0.195966354027106 1.36942940801512 0.000536284040016542 1.4893873721753e-005 0.0941066800969967 0.0440205200833047 0.155245492137294 0.196486447133033 0.0223729191088972 0.0321321499585514 0.431277662888057 4.97641445484395e-005 0.0704600385245663 0.814753093809928 0.000431020702277328 0.0998357527014247 0.207066205546908 0.0182892882245349 0.0998554972524385 0.373101926513925 0.525398542949365 0.601692431136271 0.0722059354079545 0.104092870343653 0.0748149970972622 6.44895444648517 0.273934263183281 0.340058468374384 0.0124162215506117 0.874272174533394 5.39392424532822 0.000182294881489116 0.392552239890831 0.124898020409882 0.42775543040588 3.53200526987468 0.103964386383736 0.0102575172450253 0.297123975243582 0.0549045639492389 0.406697814049488 0.285047948309311 0.337229618868315 0.0986313546653266 14.3940521944257 0.890598579382591 0.0731279296372675 4.90484223478739 0.592587985458668 0.0589719751511691 0.0882564232979724 0.654109108255219 0.256900461407996 0.167581646770807 0.0470718 0.0509102 0.0742143 0.0478596 0.0250216 0.0333036 0.0545874 0.0763734 0.0199642 0.0671336 0.0714981 0.0567845 0.0181507 0.0304961 0.0506561 0.0884091 0.0743386 0.0185237 0.0314741 0.0632292 phangorn/inst/extdata/Dayhoff.dat0000644000176200001440000000250613475602650016562 0ustar liggesusers 27.00 98.00 32.00 120.00 0.00 905.00 36.00 23.00 0.00 0.00 89.00 246.00 103.00 134.00 0.00 198.00 1.00 148.00 1153.00 0.00 716.00 240.00 9.00 139.00 125.00 11.00 28.00 81.00 23.00 240.00 535.00 86.00 28.00 606.00 43.00 10.00 65.00 64.00 77.00 24.00 44.00 18.00 61.00 0.00 7.00 41.00 15.00 34.00 0.00 0.00 73.00 11.00 7.00 44.00 257.00 26.00 464.00 318.00 71.00 0.00 153.00 83.00 27.00 26.00 46.00 18.00 72.00 90.00 1.00 0.00 0.00 114.00 30.00 17.00 0.00 336.00 527.00 243.00 18.00 14.00 14.00 0.00 0.00 0.00 0.00 15.00 48.00 196.00 157.00 0.00 92.00 250.00 103.00 42.00 13.00 19.00 153.00 51.00 34.00 94.00 12.00 32.00 33.00 17.00 11.00 409.00 154.00 495.00 95.00 161.00 56.00 79.00 234.00 35.00 24.00 17.00 96.00 62.00 46.00 245.00 371.00 26.00 229.00 66.00 16.00 53.00 34.00 30.00 22.00 192.00 33.00 136.00 104.00 13.00 78.00 550.00 0.00 201.00 23.00 0.00 0.00 0.00 0.00 0.00 27.00 0.00 46.00 0.00 0.00 76.00 0.00 75.00 0.00 24.00 8.00 95.00 0.00 96.00 0.00 22.00 0.00 127.00 37.00 28.00 13.00 0.00 698.00 0.00 34.00 42.00 61.00 208.00 24.00 15.00 18.00 49.00 35.00 37.00 54.00 44.00 889.00 175.00 10.00 258.00 12.00 48.00 30.00 157.00 0.00 28.00 0.087127 0.040904 0.040432 0.046872 0.033474 0.038255 0.049530 0.088612 0.033618 0.036886 0.085357 0.080482 0.014753 0.039772 0.050680 0.069577 0.058542 0.010494 0.029916 0.064718 phangorn/inst/extdata/cpREV.dat0000644000176200001440000000352413475602650016162 0ustar liggesusers 105 227 357 175 43 4435 669 823 538 10 157 1745 768 400 10 499 152 1055 3691 10 3122 665 243 653 431 303 133 379 66 715 1405 331 441 1269 162 19 145 136 168 10 280 92 148 40 29 197 203 113 10 396 286 82 20 66 1745 236 4482 2430 412 48 3313 2629 263 305 345 218 185 125 61 47 159 202 113 21 10 1772 1351 193 68 53 97 22 726 10 145 25 127 454 1268 72 327 490 87 173 170 285 323 185 28 152 117 219 302 100 43 2440 385 2085 590 2331 396 568 691 303 216 516 868 93 487 1202 1340 314 1393 266 576 241 369 92 32 1040 156 918 645 148 260 2151 14 230 40 18 435 53 63 82 69 42 159 10 86 468 49 73 29 56 323 754 281 1466 391 142 10 1971 89 189 247 215 2370 97 522 71 346 968 92 83 75 592 54 200 91 25 4797 865 249 475 317 122 167 760 10 119 0.0755 0.0621 0.0410 0.0371 0.0091 0.0382 0.0495 0.0838 0.0246 0.0806 0.1011 0.0504 0.0220 0.0506 0.0431 0.0622 0.0543 0.0181 0.0307 0.0660 A R N D C Q E G H I L K M F P S T W Y V Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val Symmetrical part of the rate matrix and aa frequencies, estimated for plant chloroplast proteins, under the REVaa model. The first part is S_ij = S_ji, and the second part has the amino acid frequencies (\pi_i). The substitution rate from amino acid i to j is Q_ij = S_ij*PI_j. This is the cpREV model used in protml 2.3b6 (12/10/98), described by Adachi, J., P. J. Waddell, W. Martin, and M. Hasegawa. 2000. Plastid genome phylogeny and a model of amino acid substitution for proteins encoded by chloroplast DNA. Journal of Molecular Evolution 50:348-358. phangorn/inst/extdata/mtmam.dat0000644000176200001440000000726613475602650016325 0ustar liggesusers 32 2 4 11 0 864 0 186 0 0 0 246 8 49 0 0 0 0 569 0 274 78 18 47 79 0 0 22 8 232 458 11 305 550 22 0 75 0 19 0 41 0 0 0 0 21 6 0 0 27 20 0 0 26 232 0 50 408 0 0 242 215 0 0 6 4 76 0 21 0 0 22 0 0 0 378 609 59 0 0 6 5 7 0 0 0 0 57 246 0 11 53 9 33 2 0 51 0 0 53 5 43 18 0 17 342 3 446 16 347 30 21 112 20 0 74 65 47 90 202 681 0 110 0 114 0 4 0 1 360 34 50 691 8 78 614 5 16 6 0 65 0 0 0 0 0 12 0 13 0 7 17 0 0 0 156 0 530 54 0 1 1525 16 25 67 0 682 8 107 0 14 398 0 0 10 0 33 20 5 0 2220 100 0 832 6 0 0 237 0 0 0.0692 0.0184 0.0400 0.0186 0.0065 0.0238 0.0236 0.0557 0.0277 0.0905 0.1675 0.0221 0.0561 0.0611 0.0536 0.0725 0.0870 0.0293 0.0340 0.0428 A R N D C Q E G H I L K M F P S T W Y V Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val //End of File Symmetrical part of the rate matrix and aa frequencies, estimated from the 12 mt proteins (atp6 atp8 cox1 cox2 cox3 cytb nd1 nd2 nd3 nd4 nd4l nd5) on the same strand of the mitochondrial DNA (3331 sites). The data are from 20 species of mammals and three close outgroups (wallaroo, opossum, and platypus). The model used is REVaa+dGamma(K=8) with the estimated gamma parameter to be 0.37. The first part is S_ij = S_ji, and the second part has the amino acid frequencies (PI_i). The substitution rate from amino acid i to j is Q_ij=S_ij*PI_j. The data are from Cao, Y. et al. 1998 Conflict amongst individual mitochondrial proteins in resolving the phylogeny of eutherian orders. Journal of Molecular Evolution 15:1600-1611. The species are listed below 1 SB17F Homo sapiens (African) # D38112 2 CHIMP Pan troglodytes (chimpanzee) # D38113 3 PyGC Pan paniscus (bonobo) # D38116 4 GORIL Gorilla gorilla (gorilla) # D38114 5 ORANG Pongo pygmaeus (orangutan) # D38115 6 Ponpy Pongo pygmaeus abelii (Sumatran orangutan) # X97707 7 Hylla Hylobates lar (common gibbon) # X99256 (lar gibbon) 8 Phovi Phoca vitulina (harbor seal) # X63726 9 Halgr Halichoerus grypus (grey seal) # X72004 10 Felca Felis catus (cat) # U20753 11 Equca Equus caballus (horse) # X79547 12 Rhiun Rhinoceros unicornis (Indian rhinoceros) # X97336 13 Bosta Bos taurus (cow) # J01394 14 Balph Balaenoptera physalus (fin whale) # X61145 15 Balmu Balaenoptera musculus (blue whale) # X72204 16 Ratno Rattus norvegicus (rat) # X14848 17 Musmu Mus musculus (mouse) # J01420 18 Macro Macropus robustus (wallaroo) # Y10524 19 Didvi Didelphis virginiana (opossum) # Z29573 20 Ornan Ornithorhynchus anatinus (platypus) # X83427 The results and details of the model are published in Yang, Z., R. Nielsen, and M. Hasegawa. 1998. Models of amino acid substitution and applications to Mitochondrial protein evolution, Molecular Biology and Evolution 15:1600-1611. Prepared by Z. Yang, April 1998. phangorn/inst/extdata/lg.dat0000644000176200001440000000361513475602650015606 0ustar liggesusers 0.425093 0.276818 0.751878 0.395144 0.123954 5.076149 2.489084 0.534551 0.528768 0.062556 0.969894 2.807908 1.695752 0.523386 0.084808 1.038545 0.363970 0.541712 5.243870 0.003499 4.128591 2.066040 0.390192 1.437645 0.844926 0.569265 0.267959 0.348847 0.358858 2.426601 4.509238 0.927114 0.640543 4.813505 0.423881 0.311484 0.149830 0.126991 0.191503 0.010690 0.320627 0.072854 0.044265 0.008705 0.108882 0.395337 0.301848 0.068427 0.015076 0.594007 0.582457 0.069673 0.044261 0.366317 4.145067 0.536518 6.326067 2.145078 0.282959 0.013266 3.234294 1.807177 0.296636 0.697264 0.159069 0.137500 1.124035 0.484133 0.371004 0.025548 0.893680 1.672569 0.173735 0.139538 0.442472 4.273607 6.312358 0.656604 0.253701 0.052722 0.089525 0.017416 1.105251 0.035855 0.018811 0.089586 0.682139 1.112727 2.592692 0.023918 1.798853 1.177651 0.332533 0.161787 0.394456 0.075382 0.624294 0.419409 0.196961 0.508851 0.078281 0.249060 0.390322 0.099849 0.094464 4.727182 0.858151 4.008358 1.240275 2.784478 1.223828 0.611973 1.739990 0.990012 0.064105 0.182287 0.748683 0.346960 0.361819 1.338132 2.139501 0.578987 2.000679 0.425860 1.143480 1.080136 0.604545 0.129836 0.584262 1.033739 0.302936 1.136863 2.020366 0.165001 0.571468 6.472279 0.180717 0.593607 0.045376 0.029890 0.670128 0.236199 0.077852 0.268491 0.597054 0.111660 0.619632 0.049906 0.696175 2.457121 0.095131 0.248862 0.140825 0.218959 0.314440 0.612025 0.135107 1.165532 0.257336 0.120037 0.054679 5.306834 0.232523 0.299648 0.131932 0.481306 7.803902 0.089613 0.400547 0.245841 3.151815 2.547870 0.170887 0.083688 0.037967 1.959291 0.210332 0.245034 0.076701 0.119013 10.649107 1.702745 0.185202 1.898718 0.654683 0.296501 0.098369 2.188158 0.189510 0.249313 0.079066 0.055941 0.041977 0.053052 0.012937 0.040767 0.071586 0.057337 0.022355 0.062157 0.099081 0.064600 0.022951 0.042302 0.044040 0.061197 0.053287 0.012066 0.034155 0.069147 phangorn/inst/extdata/JTT.dat0000644000176200001440000000252713475602650015646 0ustar liggesusers 58.00 54.00 45.00 81.00 16.00 528.00 56.00 113.00 34.00 10.00 57.00 310.00 86.00 49.00 9.00 105.00 29.00 58.00 767.00 5.00 323.00 179.00 137.00 81.00 130.00 59.00 26.00 119.00 27.00 328.00 391.00 112.00 69.00 597.00 26.00 23.00 36.00 22.00 47.00 11.00 17.00 9.00 12.00 6.00 16.00 30.00 38.00 12.00 7.00 23.00 72.00 9.00 6.00 56.00 229.00 35.00 646.00 263.00 26.00 7.00 292.00 181.00 27.00 45.00 21.00 14.00 54.00 44.00 30.00 15.00 31.00 43.00 18.00 14.00 33.00 479.00 388.00 65.00 15.00 5.00 10.00 4.00 78.00 4.00 5.00 5.00 40.00 89.00 248.00 4.00 43.00 194.00 74.00 15.00 15.00 14.00 164.00 18.00 24.00 115.00 10.00 102.00 21.00 16.00 17.00 378.00 101.00 503.00 59.00 223.00 53.00 30.00 201.00 73.00 40.00 59.00 47.00 29.00 92.00 285.00 475.00 64.00 232.00 38.00 42.00 51.00 32.00 33.00 46.00 245.00 25.00 103.00 226.00 12.00 118.00 477.00 9.00 126.00 8.00 4.00 115.00 18.00 10.00 55.00 8.00 9.00 52.00 10.00 24.00 53.00 6.00 35.00 12.00 11.00 20.00 70.00 46.00 209.00 24.00 7.00 8.00 573.00 32.00 24.00 8.00 18.00 536.00 10.00 63.00 21.00 71.00 298.00 17.00 16.00 31.00 62.00 20.00 45.00 47.00 11.00 961.00 180.00 14.00 323.00 62.00 23.00 38.00 112.00 25.00 16.00 0.076748 0.051691 0.042645 0.051544 0.019803 0.040752 0.061830 0.073152 0.022944 0.053761 0.091904 0.058676 0.023826 0.040126 0.050901 0.068765 0.058565 0.014261 0.032102 0.066005 phangorn/inst/extdata/dayhoff-dcmut.dat0000644000176200001440000000565713475602650017746 0ustar liggesusers0.267828 0.984474 0.327059 1.199805 0.000000 8.931515 0.360016 0.232374 0.000000 0.000000 0.887753 2.439939 1.028509 1.348551 0.000000 1.961167 0.000000 1.493409 11.388659 0.000000 7.086022 2.386111 0.087791 1.385352 1.240981 0.107278 0.281581 0.811907 0.228116 2.383148 5.290024 0.868241 0.282729 6.011613 0.439469 0.106802 0.653416 0.632629 0.768024 0.239248 0.438074 0.180393 0.609526 0.000000 0.076981 0.406431 0.154924 0.341113 0.000000 0.000000 0.730772 0.112880 0.071514 0.443504 2.556685 0.258635 4.610124 3.148371 0.716913 0.000000 1.519078 0.830078 0.267683 0.270475 0.460857 0.180629 0.717840 0.896321 0.000000 0.000000 0.000000 1.127499 0.304803 0.170372 0.000000 3.332732 5.230115 2.411739 0.183641 0.136906 0.138503 0.000000 0.000000 0.000000 0.000000 0.153478 0.475927 1.951951 1.565160 0.000000 0.921860 2.485920 1.028313 0.419244 0.133940 0.187550 1.526188 0.507003 0.347153 0.933709 0.119152 0.316258 0.335419 0.170205 0.110506 4.051870 1.531590 4.885892 0.956097 1.598356 0.561828 0.793999 2.322243 0.353643 0.247955 0.171432 0.954557 0.619951 0.459901 2.427202 3.680365 0.265745 2.271697 0.660930 0.162366 0.525651 0.340156 0.306662 0.226333 1.900739 0.331090 1.350599 1.031534 0.136655 0.782857 5.436674 0.000000 2.001375 0.224968 0.000000 0.000000 0.000000 0.000000 0.000000 0.270564 0.000000 0.461776 0.000000 0.000000 0.762354 0.000000 0.740819 0.000000 0.244139 0.078012 0.946940 0.000000 0.953164 0.000000 0.214717 0.000000 1.265400 0.374834 0.286572 0.132142 0.000000 6.952629 0.000000 0.336289 0.417839 0.608070 2.059564 0.240368 0.158067 0.178316 0.484678 0.346983 0.367250 0.538165 0.438715 8.810038 1.745156 0.103850 2.565955 0.123606 0.485026 0.303836 1.561997 0.000000 0.279379 0.087127 0.040904 0.040432 0.046872 0.033474 0.038255 0.049530 0.088612 0.033619 0.036886 0.085357 0.080481 0.014753 0.039772 0.050680 0.069577 0.058542 0.010494 0.029916 0.064718 A R N D C Q E G H I L K M F P S T W Y V Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val # #Dayhoff rate matrix prepared using the DCMut method* #---------------------------------------------------- # #The first part above indicates the symmetric 'exchangeability' parameters s_ij, #where s_ij = s_ji. #The second part gives the amino acid equilibrium frequencies pi_i. #The net replacement rate from i to j is q_ij = pi_j*s_ij. # #This model is usually scaled so that the mean rate of change at #equilibrium, Sum_i Sum_j!=i pi_i*q_ij, equals 1. You should check this #scaling before using the matrix above. The PAML package will perform #this scaling. # # # #*Prepared by Carolin Kosiol and Nick Goldman, December 2003. # #See the following paper for more details: #Kosiol, C., and Goldman, N. 2005. Different versions of the Dayhoff rate matrix. #Molecular Biology and Evolution 22:193-199. # #See also http://www.ebi.ac.uk/goldman/dayhoff phangorn/inst/doc/0000755000176200001440000000000013502203731013604 5ustar liggesusersphangorn/inst/doc/Trees.pdf0000644000176200001440000024113613502203731015370 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3478 /Filter /FlateDecode /N 89 /First 728 >> stream x[Ys۶~omc!ɌMǮIh,98;".(̝"@Y" 0cYȔ1LPH{eE1$EcJ:dRQ'4xj$F!$ekb2bJ*0*L@1f*FfeX` :cT*K ,,twɴ@1`%.`ALzf&1+4[fq K:B;V밮Py4sBc9,3FV,,0iz;W"m0)C|5X4YzȢx))ⶠ V)BHƐTBQ@O# ÚQeC 1Dف! QvD1*RF`(C\  yTuei -MDA>(;He(+} P@Yё~i:PVSu J.稀_R2aTѨ;'I,4猟γQ:NfPp_?oQ 巇}Mn-t 3$Oe?zu|g_݁tܰx qd:y'SdϦ|kvt7e4}X :\̯NwfJ2'qFɏS _99Pg̹.&hנ*KE nAWϜ4Y2f,AB4ޛYѼ`T/B g^J)gmTJH1Kq,-awvkQc+3Y1Eb!`\ȭCyAv5dA'cz?gS2J&e)[\1 oX#vLM3zRu2LFl/jPjXi`Xiji79𐌇o Qkn#(d0a8}%L[b3\&~JڥLbjt i)CkT -@^Eߠ98rzKwKlXРRUuYpkK!򮢨zN=eL'~E;=ϙg4 E48,W8je|!?G}/+~_3'??0k~=EvdeyJd_"89F1o01`Xԗ!!g3< md hG>2Mg_'|ο  h^5VF=H]Үe7~pT*Z) zh7]O&L<㢷-D]ـy_߁ۛfH\ךfE[ e[Kټ9O<˖K'Ѭ\_`ղ\`]-N7%U(JUmru){4~?S\mK-Mvai JH=!p2LKHZ a$͏Itގ&3j:1`2Mp VUTټnڼ[ZJMemkl:zR z˫W/>x 'lȖ: s@tYgY@ knW_|Dm +sŮ_ð\b,6L%60;ջT7!i<^7k܇f6 s2CTT)hR= +=9t"߱m]i_(#QQYVt(,(߅P6G[ih)iXX~w腅|<:xKd4k#5\_+z=60:YY❆=ڑfl#+aWkH)$q鷌&Vl)!µ<=-lqQmXw*1d{G4%(!$}d$/+-KcU}x NRQ֒ʆbu(Ng]ɇ݅xwH@]rAn'ԧwhfv:e\9z:MM-G"Erհg$[:fDM&rz󢻆-2$f$?-2/[:d&~mw/utX}^ ZZXC8ڇ*Vwt;R3ئZv93B'>En9rkm,)NsCIb_}h3f Ne3A*D#AoNBO?ߡ̕g<+ʠ{}^]v $=.VFIɡX1^{-&wra*cCW8sJO\~6s$5q$0zrbI~rN\)*8,AEvZER9YOΨk^endstream endobj 91 0 obj << /Subtype /XML /Type /Metadata /Length 1557 >> stream GPL Ghostscript 9.26 2019-06-18T11:48:41-04:00 2019-06-18T11:48:41-04:00 LaTeX with hyperref package endstream endobj 92 0 obj << /Filter /FlateDecode /Length 3695 >> stream x[I\G#P?j_8ƁdƳYdY̬ze[A=YKf~VO;Ӊ]t]~Sp;ߝ^zbջ`sRܝޟ`s0GsG :[#(eg0f`n3ANງ=l4,亷lfoBUG59h;\笼i5=ʾD2Z0:>JJ9ky P}F%ݽcl hs!l`"~Le|*pax|V)<>N uH}ǜқoPa]o]0ma;;5'ܒlNYINdgt}TZw1sT`0zF.L]]D|Uf.9O y8OY~?׌C6bktoL+|Ü;= UDW[:3fy\`n7;:W`p:9 Z{DK?쭆sBrlPN`?b.+0X<pN&rLt'k&d_ON;&#zIhb84hǂGOѾ*u*kD ŏlS\e 6XiS(r,' Ai~,N>pX->D nC˄V g5XxmL#]j<"8؈FUS5L:XfP΀O@Y1A!3A>^Hi`Ǐ& )rr~շx|$΅4fr6[} Vg?CJGdV c9ri1UGy~KBV֎~ &iMi6j7e tT>E;;buFx3hi@ۛGV\ xeS%ŷ#(M T*)[17ZaAd w(l4:܌Ɨ4p  @0C*Npx ښl!I|$uc!*5G`ӻhl"E 8IP ~)y9s2,'`>`cS> 61ʜ"m0QsP+]{_EP+6h/CX31I,2Ld6fiL |3_Onj17WFL/tZJ+V@/ͨ0ӫ9@"=^?O ڒH^Ua(p{iVt0L;խPMͽHR:eOS\"d& xftB .!Nx(Ӱ'4[ì$"Xlf%eDFT_R}\nrX"N|^tpL;9, a@m1N\BVYE|f(tndF7}d<9 þVN&)~j:Ьu&B{q?OfZQx2S@B6> c)fvp%\8Tpt rRըHU`lBPD׭d\YF-,G5 "c*auڇoEDdPMKzg EKI9ᯄ5\{xtlzXRPo `b甘 } D36u`! dp6յVȔ  DXB NP#*#wmM确Bo[m]mPL $t[DF6rd|6c9UA.ssV|9-qZV:_E2ɷM^gSuQ/VøD¨0%Q? }6#/j(r4;c>VPjB{hdޟOy* xR5`s'DBJԯUT6Azlsp7+ִ6TZbV`xsN[pGz = ?+g٩M.1|ʹdsjV[S M X n["}SlHެbt2xp G~7A "ѷӴFq$beӆhhX  ;+Tvk=b5&irknUa"=DV2O2` s' /Dʲ̃ ŦqQMZ7y ri;I .,gگ$hdlkVr9:zrn4&CA6̵IopbӍ#1ɫ[+WGB N즳#k5:~ҿƾJҔ+Pev TJs2$ z`:y Y=y_SKo͇ S[ǩ#[#骮іaYƧ\ ič$rSEt"G+<ᮾEЦOf!n_,W6fE Acu()G]h+-g:m0XZ۽'`ږP;}Rm^j{KknAr"Cl%N]8ѡB.9Kzz x,tR6Aˣ@؂Z #vGg p7mjhڹE@(%OtƺІK鸢 " \}Wn -YD:zVa;/i<&6l~hy-ȑ>EfMn]O4cRRz3׫[7Yc/94A^q;2l@-O!XzfqD  =i.ܛqS&]| (7kɥ(omc0TE"nUcӱkkkƹ1-jg/1@_=TY YFGM6pWəѥi'j.0¼G@Rs[-jjdv pSqK>TM+͟>Z3F`zO]QJ綢@~T{z< "ru>h1VcMNӓoO}8Qv'ڏ#w'߭<Іl|_N{u[+f">7fpa lR|*Bt~WBSyl«GSst\Ek5dΒ34+鹭϶wn !բZ%3]ϸ~xXB؝Q> stream x[[o\~W#?/ER@ERFbMheIu%ο CpyVr긅ǹC1CW|݁8x%u:b&I`zw?\m\y''m J DVǰ <%_v2"NjE_YC%8Lj|Dqk;:I† N#utfdYFncpRA | U#^%%2#ڤkF8A͚Dg쓤I=5o/ZemBhWht2fGyJɂcnN(z̍./g<T,Ά1o qJ+ Io>X27y>Z ". "wcJV7kI.Kp`9Q3 .ٝ2-jj^snF?T.>){ǏQ9#`Qo&`)nihB PW/}tEl[叆{?ˢ/d-3[K+Z$0Qtnbj=&G҅ 52m|C`ۼ14~;f#@o+u!XBֆy"6{B{*C5%<DL1sP( oB1*N)$ֵ|SRٚ`G-I{E7kMbN5)݉yŚ: ̺}+FFED`jZfI S iQ\6]ygΒZ0>dΕL&P<x8p,$FN/ԭQG*{ {}*`#nGB}wy]J n75pޚ[Nb@y9)%#*F 54J nR'x2EӔ?'ön!=XIW2q! ?endstream endobj 94 0 obj << /Filter /FlateDecode /Length 3059 >> stream xZ[s[~G~Nәfi=N?HԵD٢|Y\ bSv[/_J[\;Eo}(Zp>:(n@$Fi =z=^Q:'9 o+h&Zq`_T\ 9*fb%̨goq+I 7/W[5\*>1p-?-lK3\/%հARY7)Mhz2X-0/콗9ļJ.ȱH`syrs:gS>0L hyS…0|lJ6L@>b63QxL0#-9}I2Zk:/In(?z-LO`q_MocElzNNS~AEAsM`qr#\s\]pkT lQ#U$|8$A5 Џ|O`2.^Q97~n*8 Jj G8E<)2C1&w@ژ%xǕ_1Gk9NI+92.O!PܻD QߍMY{c9#3;'!J!6˼x/Oĝev~[z)8VY< Q#R)ٰm#yD8DNH"TGkB1l͌_V;!2>{c&1i9 yF 2m<IVD"'Kt@]OES_)ߗܝzʚ=eulI$vbFsOZR !hm6hr9 4jH2SF[":nvj nV0چr6c;=l@vMVCnT`c`˓S)b4`dA1g>DjOmy vhs}=_2^\^5[_ 1]bM[_xF&-+,Ih`!I^ PI4a3MҴ*Lq*^Ugu A§0 J;g4^K% ]P1*Ri#I>!@FFb؅Uv&]=Dr^"\hXV"!@^ߢ[=JخuNq^?k\e?S®!O:~i Wy^s;Ue;90؎- \+* @7.N{oκTdX c4q֓#(@N土5*'GQ5d5S$~O+τ8NJB`52isKOWJIr >I-t5pa)J1p"t׽Jj+$>^TF-U{Ӻg1*1*0! &S *k l3aif0}*,,Apɦ&? mQt',1Ɔ0B/L(bK2;7GMȻY&Md'K]۽xw>a\G"JoNf\֗Z@݁#X9"9Y &f^ZBL}Pv-lS~je \6}] +Khp76}Cce QPAۑx̓;B@b1ZWA7endstream endobj 95 0 obj << /Filter /FlateDecode /Length 3201 >> stream x[Ys3?E">\؊T*ʃ <EdWǧgfw{KH҃AL_sBr!ҿCgwbqv@oDRZ8:=(rc.>~\ auf)z]@+B:g^-WwBFJD-Cw8OUgQu[ g3wQJZx(6 @B/ cȌ`Q&B"뼐y=ܦyz\KU)b.Y[\EcslG3 OI>.GN]d7+aÚ뇱7˕`TmXѳ]5u5J,Hc L˪֥$ ^r%ܫa41N5 i BHcc $!q"|X 6tu|>k S;ɘ 6:lJPtަqi*" *9M)0Ή7eD$Lj`un46B}`#tM[ XcOsE>tC8I<0J#'Y@ 2Mv> *%Si_;$c1CG~"气v>y(iȺM!#ԦH^~,$<`)YTTc$$fHy N-~]?JhAOS2Кf<'~H\脂l0c iehVyc&cO4+>Տ%O`3?́D 2 NWv л0(S5LJ +!c ۦK\!U|@9kRdFȯ*(E:8%% MS4Ac 5 jX/'Fm(`e:fG}WbO,!MPW35o1P,f",Wo|[.Fyw+SH,'IՐqA!$ 0c2{JcMm2SA|ob&kETFa?Q3fN|!j0;Ϝ vP T'HIz>Myn ˤJ yrEqևh AEȔ >;q Ӝ`c'L8ݐE ҾܳUׁĪrs06 ߻Q+f=2}EO%kfx3dۂ.h+*;s*H#\d Y0}#1綑1/ #O64ĊX9ƭԶmp_j֔NFjR72w˕w% e :zԶ@qVݷmtF6}ܲmȩ80U%ԆOVчE6_YOXihG46~htA:j>Q IPF76,Q%8DCŒs #eúFG)"҄ԉ;UhigeWxڵ hlfG#4;֮[s^;6|[ ŴܝIYٮ-oXD\5rNt|vʛ>5pNUH%--R/^6^ߥKGua3O7(5a ISȇ됮/3pKdgB9(FY,E5&7*yj=inǿ5޷!٧.>Nh3"2I%sc]bdbylN &W}!sq_ޜ]4  P%.7]=vƮ$ȚZ<Ԓ`ctG v{h5j'N-FmeÝl7adt!ij񨰼"سY/?*a'Vh9~cv`'&:<M9B3b f u[kΠo֘9pGwgߡ?cTm?n| f62ciYuWJ66sUG nDUA$ZBv.ߎXP,m[+G-6mV-9ri}!W-&*= K"RFE B+񐚐_wοxUz!ᴶog߸a^_q|:}R@=b[&L<9 csendstream endobj 96 0 obj << /Filter /FlateDecode /Length 2549 >> stream xZKoG #'Xt8MA"$R4Iѿꞙa )HRUu=ztF#rt9a'(ךɘRF@fX6蔀;YnGt "aLZ$] .cӦ ̶n:x:S?2)Y4׭\ @}TnZOHu_k?Щ+0uaH^>>8~>َ0NҡTjxղnNARumD"WIl[݀)2 s-Lբ*Bt-wv9Y-(TG F2$m?brU!uoVht^-Ie! np\?Y^?WNZMԄY܉? nXC&ÅMXxP99ַVZZjTA ?N=$8Gv(?wK"uĮcdTMTyּ4Q͕,(FM4Wo\^i* u=췢Z&=V>ds*: G\$2bH;SE`tHLr\֞ۛfawTaa&.oSo 7ک19כ#p<;5ԊAg1ˍšW>m\r˶.Jwۛi 9 _qmdy[jXJ]M£D2_,,z Ahl7p2TU/v3d<܄_>PF\͐Π KA #}t0NWi-9쮀 V] JElkգ~/ IH=Or>CuȩLO&߼on$EUxE$ '%D*,75KFUTQcEJP|!ܐlj:Or^ɵlH7Imh5YIvHbm)(? x!@k;% DlߖT_uq7)d@4qEQ|;7$V 'l2R:[ү9]|$qw<)Ixg:<` wE%37t*? >G|ItEjQdd $CYNy M q ,M_QΑzgIoN%zC bh4_ؓpwF|Hr䬚"-6\qf}k:|il+^_Oߦ>'8,H ¸quT>Hfm!1jy`G=`E4%}2$%Kwde~`MVSeNyJ &ZOJA5=d)#is~CWE粻tM[-*D]1_)&76jH;#~@5n?D鉾"kjސVe% 2{^jf!\ YxYKQ1s aj~$jOf9';Cft-J޾F /#Dvqg͜feE9&snVJYCrK2.n%Usru!> {M _"7Q̂>%#pwwM C" _n R ?g~/Pqf-f"{od\&OcZ*(JUi_,&O]Άvr< I:hv}|}!SJuN.F+^rKF"̒ 2dNl@?G\z@b}"3XwQT&x_GJ~.C z'/ɦI)Y K;4'#?}t5@5jQmcy0 G*:z;(㔧]=EíF:W3*}Hvzi=NE T٠/K  x2ddz> stream xZK0 I;RY2,0ه]rH.MÛ_jfJd_}]=F#luJv'btuۉߎ?$44֌'IUPMMW'fAn頀cxL;{`El>UIyoMtVoNzTkTߑpmK W/՗mS)ʈQ.=YZ/TNL^[٨vYFP+V4]se9Uֻazi/0%SÌ毷lu/<~J<ЄdFCgt'#҅<&2fr#k/]h;6Ϲ.imW9Y!(f /.[8/\?_[hhvgVK,U}`@h ,4B'qOfRL~N)S+b8;,1R,UzO$}u{Y_l74JݱYp≃X>zA9ĺ2vx[2%ggf w*+bNi*Ϳ_O%nK; ! wxyuK&+b kE09 ~߫c8(dDm𾜗/Yn̎l9 > $xcNrF<>5۟xlKٍeWlo ͦ Ɯ60_{l?1*̃<ϒ;99 |K,75y:HAHWELm}XT.|Ƶ2tp2lj)UՃuZdW_8TiGx {{endstream endobj 98 0 obj << /Filter /FlateDecode /Length 3314 >> stream x[[s~wGl _:L‰6:ᜢ|c&PiI3Y%x`,4a-b񞐓6>mIAa&^k19g[Ǡb]nZ85FM7YwV7M7s-|7?MiYm·ތ3j0 yZ%Us~#Gᛛ4ah5IgK$ݛhubќ$]Nauym,l4 #3)b7[8\_84a `7;TsF&Fr0QHiTh?Y&/)Ѐh[qys܀f~ސF* 0/4+$`\Uzí l[dV)D7\BtggY#^f?VR-`T:9.|A݋ո~l&(z%ֆ^`xP=)# 2a{ 1{WөI#q*<ل z5$5N >_W$LjPn56tYͿ6Tiip$XE?hS45܌ $ηZv6+d#퍍M\HCK'0c} Nuwq1/ȧΚ@'JHO,nc тzdНD3?myAaFj78an)h.@0+2."(  Ҙ,j<﷽vqzq8PK#>E(XhwV+q k"nBG'Ԙk5zyēG%`fOW,-nƜKb3˝%%,6QvaDeDw89풕3R(rQejxD@ ĊޘϮ.!.^#GC/*;V*ݼ/$FhM&yxH[B:$!EEČwNx`:嚯yڷDӥݥ%ܷ;o:H ]JdkA&*mΐ/z]8"`HMxِ L@RU컜\h^v$CPp7*f60{;×<Ĉ?4eZk.VXȷv6BFr17AHy89^8I+7 ŽrAXQ g.8{^E6\4Fo2Ǥaf ?뵂tFp@#⪑C~V$'s[j t̓S]Xm|[ЉfiaP/N{ H\s66F>d.)I ԓh|[Ei.d._ b}Ȍ37 5CLz@gg==̠))lqvH6&aYV@ĠȔq8!ң%VDӽ6d, }Uax:GIpZ ylհ" ?(?hۉv8 ;+$[EnͿ._7l[E#ި1DID5(0Va$Pėe7ʴ|]'zU~y"Z5Hv]E?::=\[1<$W0 Ѻ(y[a0<Za{(STSp L oqc=`uQ8ը{Lߒ{hZ~_d;{] W+,9|S^@.~=. ;n.nHQn޴>p׽Wy44?㛕t;dN" |1Ѝ4z #"f碑x  t&wd2DW`q5NܒRB5[5HJnaFn<ܠCkh;LmUj6GK\'V xjvrzȧeM7-hbXƤ9ڝpABŅL@*jx6*_ZbtWZkiU[/ xץc[DQ![^} .>f`fM{4ebгP8*'|:͞SV !)E>PP2KY 6]GpKwb`yQT\xb5ڛ}%]3O5@P<^-<%}3.V>Sk1Mp}d*i@̓R=)4Vy't dDyY'2\2$^ ?yW+e ER4v\4XR?-Sp7'rc")GQ0 ~ 'Xe|"ܙJt11*=hsOxTO*.F V;,%t2vVP;>!~b7(#@GnPxٴ,/qB-I?.)pQXA>40+w ҂gKFɒ:<:8# 7B4=C1`0&l \$B",w zZ$BK~N7:!Vf\uQ|+ƨ^>a?iH ZUv&t -"$0E,u[r+9R'.5KU:b ^LWpB`. 렿< wY=xo$|ɟ:pa_B7=^ ε,nqf[e탍¿|endstream endobj 99 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1966 >> stream xU{PS`U(Φ]7;+ R]qquU ,  !R^A8 @$! \G6R]hi]u>.G0>3i9s~!iIϟIn4npxY6?7zG, &o 4f! $UjV'׉㥋IW\"eo(eZTR$N2Dǿw $_+k CDY[DlPtYL["tL<3a2&jNre" fojuI*˓+ N ^%v.zmbBEl"6iVbE#)#oN{}mKQҨ/N 1z=g~IFrtQ4\16g?5X},dTFCu8!̟!谝~JYA}2z76c?rO d/B/&|IL&,/9.F$"?}08gKׯ q 뾫MPm}F<7'~*@jmT:gOyhΊG /UQ8'Bc#W/s;GZX6/=%[zӱ40:E]C{ T/2 xaُ1+XzШX$\UX,ENanA(i><fDFxd' Ha4\ M0 kBnf@_)nln ?C^)mYo7 ѩ%ϭ'QI­Z*LA@cGӒe!K[C-)ޕ=c n7xer:TЌ8rweMG4d4t7Y'㨩-3aJg@1ԍ[ۖDx _ZЃJrH>'\e|Y7u͟/H]憹 P[)?:޼'.yIli9f7tuV @ZfQm;[䦽 GF{.gVt趈;jJe9 C"-+coǼKǙsGG\ǝ<$#sdӯK>4ڵv#@>ku rp4i;ڝdSw.@}-e♚-PZSA RlW.=dbV콊$7)\dT\nkO|ºW4Dqk2 Yn:uGKn_2fةfaЪy'E.\tן𕕯Yjs[Vna3{yPG;En:Mu-BѾs$@oZK{}eu촧\Y-*  oki@*7jThi{DnB2FN0Z w4h?/:4On?rBjxɂK7{'g{1|pvNX 9[Ko1W2s뛐F*<3̌2bf=11owoendstream endobj 100 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7511 >> stream xy TSWZ{-8\*8 (y) !N 3 s@eEEkU[mjUk[;Ю$Qk__PYss~+vD"eDo"aPm?|lLzkzv;hxPoׇ*IÒӝcBۍ8cƴ1v&̰)s N>ح 9{{xx㣢y k?.?|j0HoEAp垁>v惎3j*]IQԊ A, ]8%K aD[Fg6@Twa'6ۂB)}N=PGFsT,h #[mtYRסҲi)@|˅ 1X `D.U(GP[os?)Q' d%䤺ޚKɗh:Wɖ%!-Es8onPP3f VQqX("m)2|5$ 5dnSA,$%x 6+2ӳAk[/i tr6H!Be ȓwН^UR&C-\z &J!_F6h*g%Un 1ަ|Ti>#q5Z aH"YBR7w{(>`Ju /YG*dN\T)Av(䟔}tn0&oqx" G}CoH~hdt,GYwe isg.o[ A'owEO= o7$ށDz,-pP݁%z7lg9hӖh=E[b;5J%Y $ Bsp^:e0&\9d&5(TT!?o|Rs`l;/0yWɔXVF@b<06NbU7wcџ/>m}iT\J4fI%:]am}pT4Nѯ3i1\ꘈ= L"̲ʋ|=;rɁ}%0:OР 1- g`#$~'(/qşu{1<*,`9'nlsFuNg)g3^2|VޤLL<[:)yTNZE֗/8/y1=uwgȏ4lp(\~GUH[qݰ`,i`&҈ϳ2ЋSHѿ^ԠbhWa m ,dZ}"LG\_:~rB^h ba ͭ(=pQMT q2+J<oFy Ԩi2R`d keiK/@CsmF^ِ.%<s? h2G6eSHvV_ʴӝvؼ5reΙ@^^_MLծjx\,BJebGPŅRS@rCʂ`bQu͠'' Rn#wk,;ZPM+ؑ5+lFjy!ّi[gH";-;w7I mܢݥUm>ddg3&CwDmnRt,aV}wo-rfRiy|eUiiUs(MoB}xh9ka)>p[zwᶭ(As 4?5F4d_sI1oҘ #B|)BdH|A7cY|/ﬢݒ`gR%zZ3) gej䶚tҘ ?e1Uh ڝGMLnQ*F{PkhQo;|${Iy >$=-)TA8&',i3'EfZ.dBR4Xǡ\FX23Pb,=ä[?9@-g H/"(+,ijcgSA))Mj4`C6lZ1݌S+ȭYƥEKISמ]{Kvs?qe 4%UM ǀ%}OGxlW[L0&z.ulDl ^ISp7HIDߑЕ bgk/Q IRǚĝI6XӊS4%̓H{9xIT)X *[V" #|y1D6O"9f$"Hηb4P[D5;՜%pڑ^Ų bt$_ :Ѹ,eF7q'̓E" ~5ڄK;?aIa۷I7d{xCrZ]栉_! V5&Hl\a#x2]h4b4MB[8| ?`6ߢ\DߣSAG脙QNDqIY0I>ܖSL+U eKvUVT56-͑~o27UD:H9߷=zKV@T4Ǟzzis!#p%쑀V+֦k=ZrR.AXS(۾{g\<X-7/O14G%ag=^zߟQnCF!bey堇ҬҼ"{; UA[i-_n m|4P L-FhchEp &y-l;l氫 vb׌(A4Fc>l.=b7J=Ej<]ڙ Gܾ*~oki&Z)4>Q%O34H=):tR} 3#O/Slu(Ɨ.wȮz4'!x̆qOY}}& M+;a ȎTePTlH][̌-`.@%3s6zɛcL+Աb(t5A!UU e5rBsVޝG }q癮 ] mFkEg3b-La7nm>C+T,Ny/|%j~tHHv,t~I;~l*uo4/J; kw-%Dui_ݭfds9& Hvu9~(x{hkwChȇυx3w aaA!5UUaFkR@Q8W)'ڦ2,,46&lSGȉ I42I"!q˃3ΧQrmBD6Sb| ׇJC+k+uI.d蟯щ:bѸ՚ )e$(~(|dτO)\Mbx%-]Ib Hڌ,[ (.,x0 4ũS$NZS(Pk{=IQdLp =LTcXpFSĦJM^MhIm幋5U؝>_9SLS6 }Md%\×ĂS^FGZ "ڄ[ߡwPDW D:#ƪUȴKlY8xۦJr qѤzGrO 1f5brGb}Uq4Z<&2s)>ZF+6#8N<jrƧ( 1~VRT2U-*O3pzЋ-Q"+Z:ѳZ)\e7 EVe*iғ5a!6sR3ȑI]m`\z|Dv#v 7:Cd}r\en5}׿+%DAhM~^Ɖ Wl/ d8ƽ@Y^DHf23rd ΠxLp<J$j v}b\6?؛DunWs#8NԪnn|ϖďӡ9G9<UǘKW._i۪ܢu,5&p,7w~KH[< _B*tAY4mEغP.Klʂf"<$dWlK}B(U஗'.mMᓖ:9|<|W 4i+5t`ؘsL=3s,Y,?רA\3ouЧlQByO1ѥP L:wb&64#A3yZwB ꞗk3L\0ލ0<pop(=N}{YJ2Sz(<iX)C} f%9R0reO=یgB.tAVYxwǸ?V" PO"\pFsfb(gͣ;=%Qgk 5BVon _h@/"f53 `0C5YdE?yF Vqt*)9EF-%#4ү%;Ixc2>a/ FЪQ>**U⪵n˅ȿ%"lgvW^]/|sK,,5]H ɽ䊬?_4mʅ4O?w]?p B& lA4ph82UHքQP^^=iCK=]zvyg/lVendstream endobj 101 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 415 >> stream x];OPWaqqdp2$ C)##/J͕8IM 6DjNNr|is{=Nve[hR.XrO*vSQsbY7l^Z(J6O,J6o, u]GX?sL?WfEN&QxW#bX*v\eӣP>e8;.mt2`֒d(M}v8tTz"A^Vnn+9Mjqi1>e7D&0Ju؎5toX⟰eع!> stream xW PT׶mC߫"N*1ދ1*P58(*J$8t#25 36ݻdYlDQ5O~DMR/U~.眽k-clz12uuWWiLz4BdË./LysFmn;945 5Mo#Z7(G]g̘6q ǹAUa@PUa`TԶcbb&B#'#>71&(*q]LI=?ԡۢ#=~a Ì6?"raT*7nA!\'OӦ0o3/cf4|81+Uxfqc1IƝYȸ2f ,efQQ&'OI/79A{)ȬJ\䲻4} z};88#$'C{>6иD]#@ ,8, m=qd ywOmg1(LO{ ,`zϏvZC;pƋ #,Q*+]Oh:-2|Ko[yΑJiǭ!?׿R'gCk}KNX>pâKzѼ9`o!1E8_jsIK>iy 2sQ ;Si%:Y7\'K!'!]i B.ESo.2m]!dw>r͚ŝj!`tQ"aX嘠LWz$$S8c A+/χ܅P& +JlA4";#8Lޕ-H#2e&GfA1I!*XNWD~ hOJ.8qqOUGrUJ09nUL"8_Q"6\.ke_)1@;z'''gGގZkBj5.VZJϵfLZƿ.vedVg^TvŰUE0~ٶS ͢dC+]Cy(cAEXɗNbdM b=nFj5зZ @'ΑޤO4ՁR9 J%ɔMD\̥>mm+]Q* Q\jb4?qZ\:_.^ !Ozauwliy^/Nl[-(B՞+,C&'jAɞ5A+aXͮ#svdJ2]Rv-`{WN|+u-%%eN"Sa!l9XAYo.Xdּم;w3F=90$.ݠIou4U^޽r){)o0$gm##'9cġ84>`0 Na{uyӞc /̒~rƱZ\`+=&=^RyQhhQh!<3Nc.J4}M7^HkHdVN*8锑wdC dǺ^ÌV"VԘB]OGJ,$@i?}/[yUmdK7պ38QGSJjE%xղ5IB_SժhOɮh3oKoDZGʥ5WfCuc{GA yVR]RCCw6b\Xz`C.3H*O[$X DbsɠRӶ| n_EcQ[K@|"'0zybҕKO/jŽc8R)p>Af]2C|9GHsoJ<:Ì08DudLjgٷ8OCN}w=19O-YbePWi c+,-;Rj4o_'ᓏc![#=`ua.k# %0:MaT$7Qm,al~*\:z.ݻ6T4^NZ15N7 מ Uc?$/߶fYcCfl G:8Aڇ-}x /m+uA;S8 +남\Do{Љۆ ~-xPX#+)֠M2kC4jXڋ;r;c$QƓHiY3>1L%3E{@"X(.9߲7$߿>\"ă6ޙ?K)kdK{Xv^} i)T v{r!KWX ir]DnFv%E ?z]IUNL!b!BVkcvN1 w-waƇ٭_?ZC຃1nlm 54wc }~Lh+G],_`a"URA>{YAD%j'٫Gv4:!L̫:+!uv$PqV4Q73}Pd*KBe}c֐;ˁ{6m*7_HBILj-fvi(ࠃwF =t[wكQ>a$a4Y >%긖Z_UXJ:̸O#~"5j<7n_`msڃG+S-@6p=44s0Az}!ƐOׁ2P֓N%ցt;-㥹jΈ8=$$ r[%" "SGo+)OSR (@hm QT[-$oQCN~[KOvr$*l_M'%ZΤ.R6jJYɘ[((llK ?tQ{W4l ~i'uh?gGR~I쳿Qv y r×Yhmo@EQWm\@Mԁ}撶| $fE@0{tDHߘ%fe,"NfN4Mlj3`X'9ʚrXSmuMfg>7L@6@2nW)b>_ǩ[ ض*hėKsΛC5c#C EpONEm \w}M<{:$;}8q?{ʚb6VSӽ;f@=cՕ7*\U Qk53gF9ywܸz&?w1sg'H^,@A6䰖>(+Vf׻!evv ]Qendstream endobj 103 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3789 >> stream xwtwGcbLIE0lIH$@B fimddY4eUw˖ r0l `PC=6^rF;' I6ἼT3~;<"`F.X$|m8}q;m>83mu!̇mNC1HA:eٳ}̰١Jw %ĦHXYvdwf̜>]";5Ry8C.Y芘N~Y IMːJC#$X. B?5_ m4]D43&{g86nU|šȔeb% xXML&":b=;b:E'6 "Cb1N|D,! o b B#"޵a#z)# R= iz5̨ii~&3:lwpK/ <SJdu 9 f^bsACm2{*N@y7˔kN0UW[Vh7A+1-ri`|X|0h5$khAw=Ofgyl@ >2:z@9۸MJWܜM8T/4*1-<׫#E*Bb/>/vJ|۠~jhin!UVDC>h$sܿ O֞x. ӆ U1o7O]FfK Dk#^5%:5 FC%[v}.ϽM 뮠4&Sp˜Јtǹ ٞ&w,&[%fxyh 7Wh*2L:40zPi&F5-%p2NE#guwjЪFqAs6zq - K8z[#3Ѫ*;;ͦ ,9k{ьa6>:˿='Th@*1tx͍-&[ZN; }.<hҽ?\aFG&>r}q|q ۫G&r2cE;$)@Fh%*2^f0N%t0(QgkXM K9=W0jzZJL"c$5YLVy鳁 29L-qڱBdtt%PTUDաE7 E"r G ̊n0dA_-Á9.aQI/sa@J+Um(s&V?UsnާѲ|v< 3'|e\p¤qr̭W a-7"~cY:djM@-֯]q" =.Ҭv%j/ʓmTE/nq>r_*]&vCS%Ue % -G `[cRg #Q)Kq=˷[˰Z0XQ QK1 }X)%e%l2ZzjמsS\ n;sSX"VGTTfM _ĥK*wW3 @L޷Bnoro ("+Q2 2CWSxzygwlۜS@ء3@A,qU+ [aA(suⵚŸ[(uv2w@'t3EvܛȒJ+|~jg,iLeagݺ/3!I,^ȴ] r=6inPj·"A uCEF3؀li`SwN .3㞬Z< jR&S^Zq@`WTyL Wlxr mSTF.4^)ه^STqrh^|]( 5жvuYHԏ8g%xa pԥ1PFcV_bI0wH3ڊ J0*!*9:^i )t2%\QɬJ?B}7clPjȂtRZs8;}1+;IWDcoSfS۵Q/x_QZ##vp~Q(L|O 'XVhYxTݸ   }2a{5qF r|IeD:1[e7Z=lv]?6& 6 &ɡYfC p*#}k ?mLN(۰ }l]jȋn*6J(i7&قshLT*#d@ROKjozKkitmԍ "]<^ ޸Up$n_kXGa]rE[nߝU@v{$;LXyK\zĮ 7\G:DPѦ*SVz:ߕ;Wل (K-u eUA;*QRxF7EZRhq@CΠ|#4=t1@W]q F`"3;tJw)DShgW! j܅]:͍:d)cFisb28S;zob4 @ϡoXA͋jɎ-eyƽ;(-0`$qma)ݾ MLJC&Fth}[6gOUZvk@Р3 6Li { 1Xa Sڋ[> stream xXTTWkC X%jTbĮhFS(M a UXXQ-jc4=aD{-]Ks2A ۄN  aN|(oܡ[7%@}ٮ!P $ڋeR[l'L>cOK#CCJWxIe֣gzK3ƍ l+lmu+Kz8@j`{YK@Q㼀-, ^$]$!1Iym˶{p[cq'DM4yivæ1b٣جXF-S˨j9!JVP(7j4VQQ1j>1RO)[j5ZHQj@MPNTʙr~\?5rRR,>eIYQBjeF ̩GTOʚEͤP}ٔDRFROn= k8xWq9I?9D/y՞k{Xᄑ zGmhQ`~G95`耪f|n⻵g)֙-cϼ7cx?߲eU2CdC~:ghгy-tHf] An=aHQlr߾WP]T냑?_ f0f}-E z_c>vSė0_0.!ԠbtqMgxBEXD#L ڄ=UeIq\\.KI^Zc/ŽG (6:2)"wF&F v*` yԓSg7+U! 4 X]5F,aMKW hEO@77'MѾۤ:~EgZ[4'YӹyO Zᅮ?hz؇0 &d;xl~ɟ9Iqe L\BɔΚ-CU~($ Wll! f,~[< Z*<(N3Fb's?ʕ[_p6-K)pK752pt7-a eH؄*˹EXu@]);+W B[B,AfJTwd#ţdb+F5nc4#4uBSh>], yoC onffW| w5BndG+iܖjwF26-dzZ;o'݋ٟx'1|m=jrIE)H ({}ҀpF'7_>T4d|1(K+K)0"!V34pT#ثZRENVtuNr 613fp}w~}רB^%)Gy;‡"?.wזM c [Aϖe{wAUsZёI$,ahC2nTQ'q&mϵS/^UJ_?ʥ-u"f:^͛rC-xF4-AQ<}Ğ<+ o$UChS^B(Gݔ.;nQ73;B6D{8wN}5jT]|t6'_Ҹѫv&x4PI^kU:on&ICI,zI?)i^4|JTQ%>C#.,$qA3|Ѯo'Гf("bצ 2T(QGKeQbǶ ?ܿs)mo.\[E쭮yKby\(Ӧ"?+s ["cՠ1?bbJ5?fyT!(=rnsiUʘLzv}U콌!34kZ'>N׮w`ʬJe*e!*@Uh7j#1 X<9lmv˥O/d=1ՆTgEYB=ý#6,x?lB5ڼ3ӌq۰*CC{X)a<4z>Ix#u71o6Fajܹ#fj^U7ibgc}(Z 0]~қkӹ?u #nj;J N9`p '?v%uT_g iUo_\G5nψG( M+%g*U,TEH%QR-ǟ⺻ R·RJ\,NB)3$שSrTeJRy6e!H qӰQ5(1Vf[+\DZ1PW[Z]. t:O uaJQ*`Ul.8e?&TĴC(V["VĘގ!D3.`<{hee9b>++;%}\vU{djc IAEn2rz. Ed怗6#fV+dCR8CKQf h~AknZ u$z@¡:/ -:upx#.`ǣ1'ct}-:cVl@ rFVƭ ELxWwb o]A\jζg栨9lȭmTඏM`;UPsv]% i`S1cۘ@Z'7e*׍7DzVXتiVAVhy6*WedM1{5&ZUOS"&gWyT d_޷'G O ڹ@ȻT#l%ؽt"60/@ٵ={б-W%k3U|UqGMrɆ; \T-qsվ?0tSgﴚx6ѓ Q\J:fF|򞊄 )[dЙ6_e0·[iI}քUH$aaIEXMMEE !܆ii0z=Fԉ p~7LơrXn]k7a9s&-kޚz&Kr34F\'Abf3}ĥ016sp7_N<@}e ~ˁҬtbf9s7OlZȩcvja:'XeDz}%7`P|ImV2@B#d3B/]&Xi `3b[sp&i2ާo 2c_ M-ĐwbmB9+Wr< DW2;ŋou{gL`c.&L"`AwglFW[ l%I>9EqȾh#'5"bvB AZihmF%:6;kinP*[uDAT<">wtJILIDV꜒L#ka/2,p%#vy-094͙Nl/ׯ_mh'l1夔nŨ6 B7Z֖*}$ 1n z([\ ?↢%9q—|@=^N̞<ͣ9%<1+)+:yY7Ml <+RRP^ѕYd*fԝ/V9`Fp.ds+,w4j㩢teRgdr:'аdFߒZX*Auh'R* pͬ꨷J|[zr>TF+v:|Oa-T``cQ0dw$ꠠp=k+ , ,:?PTno[Շ>;G^v\^RUJEz8R0.+fvFhWsJ7LgYp]Ff<$+!+1J JF mexZHGNM/, 3o@2:xI]MVWv3 6l8w9j@xNuؓ}M iQ( .ܓ޲;xb Wy04CJl/roQ.Hl 7sD@yAOZfyPCG2FBܱ \ V_gԺ 堋aղ(.5MVGs.NQ"@]ȋp1חZwZ^P^Hv}(_׀ xx?fPS?t&"jd d^-w21C(Yl,_C v"s|bɬBbte2X[l+ 30Y#Eyz>K* [έ%E#,Î]n,蕏uFpWנdQ[[-kF{=ǤԻ^^P\SP_U4U^B̿x%Q I=5}h/>endstream endobj 105 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 387 >> stream xcd`ab`dd v 5070qH3aQ#UA6%EeB``fdS5t-(-I-ROI-SMCL,3sK2;oglҏHrNo~}W&.k8pY۪T$U$T'VVurTά3sV-X`Ղ&CFf͚:WNcoZ0ujn93g]Z0rĹ mmֹs'-нcn¢*朲천2/9fjM7GE]mec_cOÞ:I?f}띹w\{帘p20endstream endobj 106 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2078 >> stream xTiPSi}!{ڈ 7n{deFv7ĥ] @$YrDE HFDivv\l[zzFkVKom*LyK}s="ՅDAg};'8'D ^ wH\21&"w'x#jFCJ,)SrTI8tj4Y3gΗ.U24T+d'QkҥS?h̘'SԱJS5qz:D^r8zsicjd;\x>Jq?x=(' Ae,жv[0n&ndTphyŹ$>P! tf' %Lh.|15|q b>Lɂt3 h,/L&0*o]0T X?ե>摒9";H,/6\?'8cQ0S Es  !;)˭Q)_wRU%'[YpJ8B[ĸd; Fh2qvMz-urW'Ag:notCyIsY}Jt"M Gr?I=g>|Yz:_@SXW)VfF8<_QTb[X^pW,bo,yQL&$g7P4i  eƿ4z^@qy~S~NaB.4+.A/4 Npo1vcgĵ1t%xVUk?a[I2$U5hApL EuN_㾾{U|馢SdAWl&4dq᪲Ԉ('k(,8F2HAbܞ&#!GטٱmՠH5&mz}H3ͭ s?2M`qfV]o̢a,aI/k.--RHɤ6%oYqCkKV*SR GQ&~S:30cOE[tłTC"v>tng F  Ƽۻ7׏x|7u_Yd1#st2l%k#p[g=|!hLq.rK !_I_3XI~ p2D\L\Hތ\qqic! 2wGڜ LК~zK{š4C:5;PYrN}p#]*> stream xWMsF WTg]`{K2;Mez '4cn~Kd(2$X`{e4)#l~]drYYI[ȧ9N+nFՏ{|W.+"MjתA= kQmgͧwC@P@xGIxGx^؇aK]85jR Woio",8dmRP$Der((>pTop ~@1kX2AY('CUGDwcO29|X樓,l6$M~Z&(XIC`)3pR<9}UPMKAj#_2A%%$G%[ E5汯jI* -`r˝a IFj38u{\C,58lGzEt%\Io<621FebZ]:tm4,&7r!I/8Og^y.}Ne)L'l ,t3ca6LYg6n 2q&ܛ(Ncay~F=sͿ%(D~)SjAIZ6߿k6k"Af{|ul!G$Q]^,B=όrPWhxؔ5?> stream xSmlSU>۽uסڵt !>#tcN זݰ:#K9`tL#Y̘ ڒ `EK &Fs=xo: =]}Yz=sUL 8R!k0u'O:uYX=t. ]VlX8dknl)v8Jj"=ΰ ȵ# C+x wސ ?iPm^l.Fh!F5rTrJV>FDž4MMR7LU/VFҠpJqjT~V t䡟vF6 K%W? CT!=Km%@P%݈TC%ț={kԣBT2>EA O /$-cWAOM>c: ~QR'oi fA5"<=IPs -䜸LR|a77] NJNI-ْ̉EhNj@JN1KH?jysmVˑ=خxӳͦWpÁѷP"F&KUֺ+Gᙡ8@V8V@{es| +DS,t ޛ\\]=f-C/JuV[붺Z׵nXMu w4ӧ.2/A~z`WOy]MR< 3_ 7K> #<-a-c[3f#w?xxؠ۴BZ'R6έ[/LFOegFt-IYGEKsES/;ZpWݫpl% Y. DC!R ePHY R4e܆G5>> stream xWiX׶('n.Rnn3qFqB dPPfPiIAQ2#̣a" 8ħT`n}N9{^xM=|C=]tx(.yJܿK~F3) 3Ur:((3J[mf .2Fu.[iE#H%љG.B=|~b? WIYxߞosHJnsu3oZlc{oz+V^vRs)K+ʊQ6- 5vQ -!2PƔ.eJQz6j2,?Rꔀb9Ҡ4)-ZH@TxR%Q:ߩhX|ϟo h'SUU5H Ov~[gp4LәOg fJuCJmP=*Qns#sUȌ;bgtt#]cڍU{:t"R'OiؾaF3.@7&_ C:8[{2@›5-mҊŌHu}Ϙ\:\X t47mDȔ~~Ijy+H*;~;|?go|JwWt?,d-=A#\%]6`7"Mkw^ⲽYVDo`j-yy5 (hUv5W'=<<dKnV-< 8,^ :lW9_+_Uutu_DF5D^X6[ AYL7)M`1K] xFA3MsF҄ZۥE&}yo;:o:<$rLD$bPE:4|`ǫ]K.f[BSlg&N"w3{=7ԉ7USJ:4Cg0ˉ!݈9]I?ln3͆˾ n!ӿڂ.#mHf0_}4 07bո A#s\*~w>>ҙfv =w3쨐|kfO>L{&6` uvfGAcR|r|h9mp\ D1뺝44~4ͧT/W1/ɐ@v1\ޅZ`ZBqGEjAtjU9t>I8j 5ͰZPE-h=y^AcD8_"üɀsT(,3\GLKDM(P[i `1Rpr*.w !.v;8bILUf{NNIϡ?TU ~$zȴMyf $A)Ӛ>LXf t6|)a_aӦظJ\sEDuKÊ; J t4ic*@}u uYv=}ΰ.bVo޵ҊCס^t7aIb{GipHFHuNT0p3ʰm)uCx"\M']wN2w#郼:ac}A[0vZW6YDl!҃k;YTޔQ1UF!jxrCJ^rC qh $dUB- TEԹwQdyΠN;*#O~" DN cBtՄԄssI.ӂhsIunVjv#\UٮU=\G8$rB 8/rN2E ?YB.+rMqR,꣯NίW460!26Χȭ>;7W_#pZpICz0Q |#<%R7ˈud*=>91G>p* B5Cv4 5[-G3vd}EoH{ҰKnh3&|܆[؁ӯniwMES!9~g#. >#}Lw8c{snMaGSUGo&__mPQWS 3'w.Vó/M[*JONO)ߏw.q6Q* Bخ?"k#c?P3e'胆|.V Di23gΤClendstream endobj 110 0 obj << /Filter /FlateDecode /Length 3538 >> stream xr1ό?bK/Y1\VRrr.?(~yRxq> `tKl~XND7|WJNtÞL߮>n%eUUЩ}^oD*BV`'69+/)f}nᣔڭ#th?tP‡UtpΩ=8.'{>;!wmϠ*)r"CHGo1:'u[!tD>0u?oJ|=e":/5<)2zY*} ˽7OhR@4&K߁H}98'fReeP(:SdO3RsA(x9OTep·T>ҁ1~h[ rLQVtVF'3k}u/?FK> &]|uU|>YR¯HqہGā@Ҫ:. ;PV H3jpTI㵍cl)^Q[ĸO-]h͠ 3T ZH0v0p]d&nZ%k-۳w@` :vGf&k3R;ʈê.'FeG 9!꧶3O,2 lhLqJw|-7 `:O_e{2:{alC\֯@}l&DqoNz S!uG(^nwy#׿Gx/1}QT;_M9 ۬/* pһ](S-pfg ЧV4O8YGjBw`xf 1'V^ ɟS֩8EP=%lψhRVЈji(2ŒڭmS*3JrŤ4hC: )Yhpq4J-R$HPy=GJ1mzbgMF|삒f^H*8F&~4^>M^%!ͥ ߪwl$(]~;hW*uCZ[|bgsSSx5EOQ8FUA𿠚 Hq՝ʧ>jN^(_)1O/{T\(\ P66a,C 3QnTE N^Bb_7-†z[ȷ;vyۆ% uӖWhu0ÊϩwFE=RzRisE$qh &4c|OPRR>vZH<ɇEAcMlW{ْo]|(KO/_ C s\t GʝlY&tp㝢]ƺʚ`:B%,ؿ}JMwbyLsGĦ' xrӺ{N5!o\nswYaɴQ]?Hs&(я!fN| %b\w0 cΩ' pmokÆ=3v 3㜉M9Nx{=iCͽ!4d}1Ž<1dn53~n{?b&["&OM.tt`d-OcOm/U﫶iG-7mߙa2O[{ L݇2W9>#㇚I>[1e {p]] uϑV_QgL-G}~e;߶mOxeY,3?:vP렧XKa-zaĎijVcQUP .tNIQ ̫W<)ǧa~m7ϊK%+'SU=dUN/W{ƍeҙEa !"yF#C|1!v8W÷0&ݲUaaGpƩMUCdݦY=m[?2 C}PjR-Y!M{obDŽUo;6 焳dx7 IV8KN E]r6#L.̝d?mG x}S5+td1ndDRUY8%(o-TFcywϼiB-ʧO ZW,97-f`ث91N6z_6, G~fY_)oYr.yQ^|YG8*Eu2 $ K^-.lK>>',0wɚ |_s ޕ.9Z%6S;ZvBrDBpjTqkGюd_+X-̶f}ZRV"n9x:nXlնLsqOxus$`F> stream xcd`ab`dd v 1420qH3a',lJ|2_c7s79B``bdr-(-I-ROI-S,H-/000030dGgb*e?}Q.=SO ZYW]]WS!|7'/5}S)}˺Wqfзo¾}R;W*kiwl'-<͞U|endstream endobj 112 0 obj << /Filter /FlateDecode /Length 2876 >> stream x[Y~>;X^Yi^YV{YjקHvUl&<&ŏu|Um:>c_?rv>`˃x|:sz=a3qyluqr$:89Xj.;3X2x̤3S\h>}=_n|ݜ _e=,OXWyh=cQӲ/2dz䶓 XwH9:tSKd zp11צeEYT _ǟ% Wh 2<HHQnƒ)cf;:7FI€^y55͆G1(qoasS>r%e9sIOKc^gOЉQ(*Ac3>GOKlYb#{Wb\]YgVɍT*xFWyt|D;2(@'2{ss)N[ Υy+b"30 2,ok(cP $~ӈ;C' Tcpq0<!OΥ ܢ AFև$Pg (tY:c 60Fj Nf< X^I&jdOż6:E8J 8b :<u[Y#^<ȆC%EB00d** ; D 7[ Y4n`Q,:DtA7D鬂6R'V^4ppn|h\+,"ճa{#g3$ gI5%F&cVˤKbˑԮnp!rxVy$C)\^6hLac6Qb18ZDL<@s2+8%)̏f툁]RFaX3SF/+BMLjSp|TU;Xp:8YOZHTy17VicwF)@Tnj4 V~B'3Iyr7IPBw=!?8uA4I#N&ve;AQuS~s:A hfǤrFWhE~Ty߸T\,ߦqM >Os3S3g`+I <T;^j^E 8 b=VgЯ'ب8#[(ܨ%V5u#LR8I*S'QQgf ԄD )HA{cg\" fIVWIF0#4ad=Zʪ E%9 yЮY0D$qK6 ûL(NU^ b{(`As,D%utLrLۺ\C6`fb`G' ԦIR{вτMu2 f%Θ*?Ę"y?uW41kB R0KPf:11KҪ!l]EZ9RnuPXpM9>X/T4&Wȏ59Xyĵ!_btR`&v̈1s['xFv ꛾S7OS0ڠ `1:Ya GmR[}AdžuSP33}MjUDY%єsJĿ=LT?@]B՞C2)~/~A}RD< g8t}J `6v4ܫC0QA! 0p+YBA j0]A.b+&M4lr'4NqK \6h8r̊sŰU+x$ PVg3~1 7HCyl5]jLFhhJ;8]qWCiq尨['Gon;*J`7 ^4[a{S4x@ʫwFx,0h(1DIWt^w^QiX+(.2;4|GƯ6(\F9w; ox篷ӊ 6<۾*vg?uou>f׽yTe͞/K-!w`|ZAnlM KU7q"ww-!1amaK0l`b(^˒ݪ \l%njKVm~u+&|L_7cǃYolӼDɽ m"f!Yc6k _UBɦU!The+p?s\!'▽Mw{{&dDݚ 1]> stream x[ms6_'Z+\swN%v:Ij;@.+ -^v*żϋw_?Tˬj/{S7i'\YTr;;V׳?gijٹ7FWf~ܙR.|)u=_~.˪U%/>,Җ+[\JT9]\RoRR{(dPT^Vj흮eqͅt޵J'=>[,#t<}k[ ߵ =9u,*o= muп[> fNg^~Z<+mJ"n{bV0412تRek-u(w2+e[ym]HmX\ier%XsiܙP3 ^{hbU=v׊fܛRy ih`5&$uY#džk-"D^[1_0[m "7M-'TFHY-Dom薡 e JE:#X7ä$YrGP50~RXz`IPTr4K|.\ph\: B2YĜ&pj0V1[PV"gg B< :q_/N 46BABop46vzpӃ\7t0ʾwz0ӼڃX=ӃIqzwC (%1ATZp)et[GtSG0(Y˺T)_7Cӑ& v4][#1*nHĉI?1H#eۏ@c8pO4Zq-"%РMT֪!#x kC\vH @7s cW0Ҹ bm< FJ3a[1{CVlFh-` pI3)T2ԓrz8O0+ܥTh~͹Ut);:m&`A&0:%@I|K7M}y ξe]- P=pYΤmҧ>BՖ`!q^$SR3;" R`i 6]=AF$j]nsۥ'RHĻ| XPqA Q-g0q(TghyxN/rU\Qv8GT һ܅Un[E41KABCl!'' -d?(-:80$,d9 Ԩ G;⣙\Vyey,BuXq%w,ɀ{,~;QF"hw bhvj$@4iԹd/ K'z!7D@ q؅rTY1"Wwq<ԹG&+)sEMdEXg#-X=aL綣Dǖ\L2-䶃 wRU r7dj/5UTu`rc2͈m&[veӞ=L4}!6 jI.SVv@Sw]ڜ )0OqjФ8V4Bxq`x蜄tɠ 6zV4HY R5 Eab×Q^+9H+-U;+9ʹAqǡ9Ά)j]}&Ƨ)4m+ m{2X{ZkL`*B)6fx[m86g\EO(lB|`e6[PzJ- e2xq_f[Nj[u'Rg'Lt~3 ?A PyC=ˌ=Cwq8QDv8j*tz[;G:~$Kin\Sseoh|p!i&WD"XS9xZsD_4R!e}L8\K]w R!F4sKM%1oѴú'yDjȥ5TSl ݞQJ>|H;A'ȻabPK#C\ uzǐޖROJҩ|4Jendstream endobj 114 0 obj << /Filter /FlateDecode /Length 2686 >> stream xZYo#~ׯ < qaDlgda/AKRZVֿw1URlCiVWWW}ut|X7G~+rsfGxu-ofߜT3{]Dog{৛sKo|Ig- +.47\t7mb^{9Шfu9(8b;:O2YS+}z2V-y3浗 [qjhWA!fc ^!%%xżHh_ zrRyr]S49ݠodJ&>Ѵe#]:mj ڋWf YKECM:,Qe@84 @@Шomnju/l{sE @P\,nPtsaz..5ZDZS`a=9ĢqT\)8ìPO)CVM0UݥQ iQ`c^ _㟞2S&Eڹ LQ{c#)s["<3.|YgSeJ}X?,MEcPg yCqqdIm(SR&9Y/n)- ;i!yC 20QYj7k=?LUŭ<\F)` |:hͫbE@[&Zikg'ɸZ<~[7t\FQ w%i|GmZoDz8U2"̲5xcR.Br۴M ckڛum i:aT;UMng9;MϱtX)ߚX)^>H}zBp4O7-3 wVFߏդžwHd]? W0Ҍm(wFap$kZ-u/WE1Ȃ%| #~u( F䋐㨇D)yi@͛ud ӻ?Fz1B.G̍ ߓ(48mn_àrS2\Nֽk ;GjYN;9->B)ߞԦ6Mm2ڗ•Gb5rd|ȹYhtNnDYqx0prcv8*apGǿM"ߡ._@5,1n\on aJ}_kgendstream endobj 115 0 obj << /Filter /FlateDecode /Length 2234 >> stream xWKsﯘa`j(*J*2S99,D$5y`C*VVj4~}x2?i'ݗʄY|GIY]ݿ.(?v1(ϝ&*8~,#cab7IV9N"i$+D˲UfdQ4)O5\BN&J$3в^;$i@$k2_*%*eOU%K`l΃W19E4Il$)\v%Yk,8`y'FylQ0 `¢W\puVlLUOumoLUlLUmL{N[sZFzZO'ݗC;DCY{hqSbrUz'-8#n^КjĦT.K7.9(i4-  ^*z?1[AQcEܠ#3E0zqK~re\ +zlYN1WJ^Kn H@\u(ak SvS`%Zh4ȣȏqRM|M[J@}IPԁ P0EKȍ۠E[$h'p2G? ۈ3."5 ڐRCnSziϙpˬ$/;FҠx`ZVm9Xrf^ߵ5[2 CRs8Y@#FltM%)#~0D,abcmi%r^7T6 Ћu8P P £ZJh)D [Z 0MbQtdS񊨠x&Ou`ITpI|o+/WX@&f)1>6cMBTf#[3-[B)`1E2/_<Cl ,mS $^46JD8-"uQm e7rS %i1. 1q1V՛ "%p&־~UlV#ADN {#BuT㩗?  V&@&W 8@l#.93ZuUGBfwPڎ<%ɤa!S(;DY'PUc</xXfliۆeL^mFyI&1S=x}/;^yR/r0Df_ .HӬkf)ʑce/o 'kW-> stream xRmL[e~/]-7|[]BlPu:@Q tReĭs3dcXhD"Pٲh΋/?&99_ O04So:7+uP*fҾa"e$Xi*f?0<Z_$aĽg#ڕzDSPmVƩbʊ&>}P Sz:cmEc򠮮7 !MNH|! !?$G xQ FR$D%3EyR(w P) !D%ߠM\Xк@g䒐E~smqp) únL3krosmw޻n~umss|Mk%C4"h4.9#'+_fصjUa*R{sB<{1+mڍ9_qꁄOk Lo4 ;œlkŏ/_99GVsT,4Us@ <20'T:!1˛NozE{׳f9g&8'hzt\n:Ⱦؼc>KgO9d_.ɞFCendstream endobj 117 0 obj << /Filter /FlateDecode /Length 4204 >> stream x[Iw+<3&/ѶVl)6 J"iO>UݳTtp$޻ꫯy$zy$o~WJ]>GO?ףhUث#|::~Cj1sە[<6Q't9^H]w??պ#)hµ>'Z^N`?@!:tJZHu41aZ؝~ gԮ桝3tfV*N<-iC&QWt/`M>N nh0Q*/&F Zx/HunMDQ"xH8^Bht p(ɯݳnnW5ȍ*zE"xcGN1ΧjSET@6B04x%-׫d^Azy\:&C/}@?,S[yHm Xq7lv̖_FlfN=>ΘrPR5@-tvt)9oݸ lB{+˧ d1%*16/8*܉l .k~Ie=~.pZ9NK~tV 4ȧ~ [PƋyA' @ ʧ@M݀ zHu :_@6Wr  fWhi#0]M0Z+`'JSMi#4Ф[Ўil q> JV-j8^CؐuYSYNvo?X?ޞ'(A.`wLD|I&m.wG 5= 87Id.Ivҹ'C6§3!=KK62rFdV8f3 gwd %01`̖2>Pb*8[1Uu_OI鈡+iK62[zw vƔfi:wɎIaRI L%<藆؇4\ln& .(/L&` axGvx~p16 5R7y16 + 왣^3%:Bye`~]؉NJEA"SY)Lʪ'4`s.оcq-Ac~6,=,kB:N.ڸkx|fd K|e!ˠPP7pP51\*E+ߤ1< `#u"nQp !#&`́e=߇*f p#g56F4q?~RhZ#;Bq dӪdݔn FW8kiUiB&뗑. 4>quR[-,\`_.-n&B|W`s#+3IcAVW|>V~5jR̳5%.̜㒟'?x-oD l8gi%E>yۥ! | & gBH=U6=ִQKYm(Toi+UMt*WU7B%5_!3' %a1G OgYh[ \=UTD81E-~>F`ջS@lI)=#c ^`bͧn7w^a!4 q Nz:?h 9!>.$-4v3ZB@N<~ (%n0^C+?7`Ε4l*<5Aêy-i& +D]BWvd&NWf!LӠa5~wOћpqAI!0Kh9Pp6^~hV0hF p4`#0Oœ-4S!^,9+L!X- 1I6eN~^L10u Md"q|bq (0J;nx-&10Z}p:3+x{ԡ݋4 FFb+mZp|18]yuPg2k1 T|",KxxzUd ̱r73QWQ/elLhQgv2)!Lifٟ^=naTⓘ4NLuLy-h)C0u. w劳9wR(֓.\C) Ia; ֤υĸ6B.dۡۢ(*@C]Dpu]EpR ieޔC a PJ\n,V; ^B-ALm?=6ԫZbIӎ * j-TbKLy*WP8b;{Ĝ#MxO~۝9\.Dw&jv+)"z4C+)u" 9ge-'C]=9r|nD821""3ުAȨXϠoUi)L.۫,lN\سֽqs@H6X<\e5SYɵ :4Og՚SRGDRlpH,KgP:6;&1Ƒ C|Q!*վcAM»\8A*CiyU3My^!1aŔ\ .˹7h)#m>Y%ocZjݙ)P^/=}ǒ g 3|3:h;=Z"5 !c O[E<>u, +!C"V(a97Qӫ4‘L^e3֗rj,#:}c;6)E3Sem?cB{oBa - ]OJj CUo k75)wN|"sendstream endobj 118 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 340 >> stream xcd`ab`dddw 641~H3a!O/VY~'ٔpnn }=U19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUTB9)槤1000103012սgf|v[?θV ؾ^3+=lY#];qqr\,y8N>{endstream endobj 119 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 206 >> stream xcd`ab`dd v 5420qH3aÏUA6%Eewo\0012:)槤)& 2000v00tgtgvBWլuVкǟ> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 121 /ID [<6ee5396f85c8c75b3521a0e4ebff15c2><6bf327748715ba5e3ff0480f167f3562>] >> stream xcb&F~0 $8JP? -6w; D\v`,b "98@&D |tDHV!0'"]$#Ol Vo 6yشu` - endstream endobj startxref 82116 %%EOF phangorn/inst/doc/Networx.R0000644000176200001440000000265213502203730015401 0ustar liggesusers## ---- eval=TRUE---------------------------------------------------------- library(phangorn) data(Laurasiatherian) data(yeast) ## ---- eval=TRUE---------------------------------------------------------- set.seed(1) bs <- bootstrap.phyDat(yeast, FUN = function(x)nj(dist.hamming(x)), bs=100) tree <- nj(dist.hamming(yeast)) par("mar" = rep(1, 4)) tree <- plotBS(tree, bs, "phylogram") cnet <- consensusNet(bs, .3) plot(cnet, "2D", show.edge.label=TRUE) ## ---- eval=FALSE--------------------------------------------------------- # plot(cnet) # # rotate 3d plot # play3d(spin3d(axis=c(0,1,0), rpm=6), duration=10) # # create animated gif file # movie3d(spin3d(axis=c(0,1,0), rpm=6), duration=10) ## ---- eval=TRUE---------------------------------------------------------- dm <- dist.hamming(yeast) nnet <- neighborNet(dm) par("mar" = rep(1, 4)) plot(nnet, "2D") ## ---- eval=TRUE---------------------------------------------------------- nnet <- addConfidences(nnet, tree) par("mar" = rep(1, 4)) plot(nnet, "2D", show.edge.label=TRUE) ## ---- eval=TRUE---------------------------------------------------------- tree2 <- rNNI(tree, 2) tree2 <- addConfidences(tree2, tree) # several support values are missing par("mar" = rep(1, 4)) plot(tree2, show.node.label=TRUE) ## ---- eval=TRUE---------------------------------------------------------- cnet <- nnls.networx(cnet, dm) par("mar" = rep(1, 4)) plot(cnet, "2D", show.edge.label=TRUE) phangorn/inst/doc/Trees.Rnw0000644000176200001440000003265713475602650015407 0ustar liggesusers%\VignetteIndexEntry{Constructing phylogenetic trees} %\VignetteKeywords{Documentation} %\VignettePackage{phangorn} %\VignetteEngine{Sweave} \documentclass[12pt]{article} \usepackage{times} \usepackage{hyperref} \begin{document} \SweaveOpts{concordance=TRUE} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\R}{\textsf{R}} \newcommand{\pml}{\Robject{pml}} \newcommand{\phangorn}{\Rpackage{phangorn}} \newcommand{\ape}{\Rpackage{ape}} \newcommand{\multicore}{\Rpackage{multicore}} \newcommand{\term}[1]{\emph{#1}} \newcommand{\mref}[2]{\htmladdnormallinkfoot{#2}{#1}} % leave comments in the text \SweaveOpts{keep.source=TRUE} % Ross Ihakas extenstion for nicer representation \DefineVerbatimEnvironment{Sinput}{Verbatim} {xleftmargin=2em} \DefineVerbatimEnvironment{Soutput}{Verbatim}{xleftmargin=2em} \DefineVerbatimEnvironment{Scode}{Verbatim}{xleftmargin=2em} \fvset{listparameters={\setlength{\topsep}{0pt}}} \renewenvironment{Schunk}{\vspace{\topsep}}{\vspace{\topsep}} <>= options(width=70) foo <- packageDescription("phangorn") options("show.signif.stars" = FALSE) @ \title{Estimating phylogenetic trees with phangorn} %$ (Version \Sexpr{foo$Version})} \author{\mref{mailto:klaus.schliep@gmail.com}{Klaus P. Schliep}} \maketitle \nocite{Paradis2012} \section{Introduction} These notes should enable the user to estimate phylogenetic trees from alignment data with different methods using the \phangorn{} package \cite{Schliep2011}. Several functions of \phangorn{} are also described in more detail in \cite{Paradis2012}. For more theoretical background on all the methods see e.g. \cite{Felsenstein2004, Yang2006}. This document illustrates some of the \phangorn{} features to estimate phylogenetic trees using different reconstruction methods. Small adaptations to the scripts in section \ref{sec:Appendix1} should enable the user to perform phylogenetic analyses. \section{Getting started} The first thing we have to do is to read in an alignment. Unfortunately there exists many different file formats that alignments can be stored in. The function \Rfunction{read.phyDat} is used to read in an alignment. There are several functions to read in alignments depending on the format of the data set (nexus, phylip, fasta) and the kind of data (amino acid or nucleotides) in the \ape{} package \cite{Paradis2004} and \phangorn{}. The function \Rfunction{read.phyDat} calls these other functions. For the specific parameter settings available look in the help files of the function \Rfunction{read.dna} (for phylip, fasta, clustal format), \Rfunction{read.nexus.data} for nexus files. For amino acid data additional \Rfunction{read.aa} is called. %When using the \Rfunction{read.dna} from \ape{} the parameter the we have to use as.character=TRUE. We start our analysis loading the \phangorn{} package and then reading in an alignment. <>= library(ape) library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") @ \section{Distance based methods} After reading in the alignment we can build a first tree with distance based methods. The function dist.dna from the ape package computes distances for many DNA substitution models. To use the function dist.dna we have to transform the data to class DNAbin. For amino acids the function \Rfunction{dist.ml} offers common substitution models (for example "WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa" or "mtREV24"). After constructing a distance matrix we reconstruct a rooted tree with UPGMA and alternatively an unrooted tree using Neighbor Joining \cite{Saitou1987,Studier1988}. More distance methods like fastme are available in the \Rpackage{ape} package. <>= dm <- dist.ml(primates) treeUPGMA <- upgma(dm) treeNJ <- NJ(dm) @ We can plot the trees treeUPGMA and treeNJ (figure \ref{fig:NJ}) with the commands: <>= layout(matrix(c(1,2), 2, 1), height=c(1,2)) par(mar = c(0,0,2,0)+ 0.1) plot(treeUPGMA, main="UPGMA") plot(treeNJ, "unrooted", main="NJ") @ \begin{figure} \begin{center} <>= <> @ \end{center} \caption{Rooted UPGMA tree and unrooted NJ tree} \label{fig:NJ} \end{figure} Distance based methods are very fast and we will use the UPGMA and NJ tree as starting trees for the maximum parsimony and maximum likelihood analyses. \section{Parsimony} The function parsimony returns the parsimony score, that is the number of changes which are at least necessary to describe the data for a given tree. We can compare the parsimony score or the two trees we computed so far: <>= parsimony(treeUPGMA, primates) parsimony(treeNJ, primates) @ The function optim.parsimony performs tree rearrangements to find trees with a lower parsimony score. The tree rearrangement implemented are nearest-neighbor interchanges (NNI) and subtree pruning and regrafting (SPR). The later one only works so far with the fitch algorithm. However is also a version of the parsimony ratchet \cite{Nixon1999} implemented, which is likely to find better trees than just doing NNI / SPR rearrangements. <>= treePars <- optim.parsimony(treeUPGMA, primates) treeRatchet <- pratchet(primates, trace = 0) parsimony(c(treePars, treeRatchet), primates) @ For small data sets it is also possible to find all most parsimonious trees using a branch and bound algorithm \cite{Hendy1982}. For data sets with more than 10 taxa this can take a long time and depends strongly on how tree like the data are. <>= (trees <- bab(subset(primates,1:10))) @ \section{Maximum likelihood} The last method we will describe in this vignette is Maximum Likelihood (ML) as introduced by Felsenstein \cite{Felsenstein1981}. We can easily compute the likelihood for a tree given the data <>= fit = pml(treeNJ, data=primates) fit @ The function \Rfunction{pml} returns an object of class \Robject{pml}. This object contains the data, the tree and many different parameters of the model like the likelihood. There are many generic functions for the class Robject{pml} available, which allow the handling of these objects. <>= methods(class="pml") @ The object fit just estimated the likelihood for the tree it got supplied, but the branch length are not optimized for the Jukes-Cantor model yet, which can be done with the function \Rfunction{optim.pml}. <>= fitJC <- optim.pml(fit, TRUE) logLik(fitJC) @ With the default values \Rfunction{pml} will estimate a Jukes-Cantor model. The function \Rfunction{update.pml} allows to change parameters. We will change the model to the GTR + $\Gamma(4)$ + I model and then optimize all the parameters. <>= fitGTR <- update(fit, k=4, inv=0.2) fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE, rearrangement = "NNI", control = pml.control(trace = 0)) fitGTR @ With the control parameters the threshols for the fitting process can be changed. Here we want just to supress output during the fitting process. For larger trees the NNI rearrangements often get stuck in local maxima. We added two stochatic algorithm to improve topology search. The first (set rearrangement="stochastic") performs stochastic rearrangements similar as in \cite{Nguyen2015}, which makes random NNI permuation to the tree, which than gets optimised to escape local optima. The second option (rearrangement="ratchet") perform the likelihood ratchet \cite{Vos2003}. While these algorithms may find better trees they will also take more time. <>= fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE, rearrangement = "stochastic", control = pml.control(trace = 0)) fitGTR @ \subsection{Model selection} We can compare nested models for the JC and GTR + $\Gamma(4)$ + I model using likelihood ratio statistic <>= anova(fitJC, fitGTR) @ with the Shimodaira-Hasegawa \cite{Shimodaira1999} test <>= SH.test(fitGTR, fitJC) @ or with the AIC <>= AIC(fitJC) AIC(fitGTR) AICc(fitGTR) BIC(fitGTR) @ An alternative is to use the function \Rfunction{modelTest} to compare different nucleotide or protein models the AIC, AICc or BIC, similar to popular programs ModelTest and ProtTest \cite{Posada1998, Posada2008, Abascal2005}. <>= load("Trees.RData") @ <>= mt = modelTest(primates) @ The results of \Rfunction{modelTest} is illustrated in table \ref{tab:modelTest} \begin{center} <>= library(xtable) print(xtable(mt, caption="Summary table of modelTest", label="tab:modelTest"), include.rownames=FALSE) @ \end{center} The thresholds for the optimization in \Rfunction{modelTest} are not as strict as for \Rfunction{optim.pml} and no tree rearrangements are performed. As \Rfunction{modelTest} computes and optimizes a lot of models it would be a waste of computer time not to save these results. The results are saved as call together with the optimized trees in an environment and this call can be evaluated to get a "pml" object back to use for further optimization or analysis. <>= env <- attr(mt, "env") ls(envir=env) (fit <- eval(get("HKY+G+I", env), env)) @ At last we may want to apply bootstrap to test how well the edges of the tree are supported: %, results=hide <>= bs = bootstrap.pml(fitJC, bs=100, optNni=TRUE, control = pml.control(trace = 0)) @ %$ Now we can plot the tree with the bootstrap support values on the edges and also look at consensusNet to identify potential conflict. <>= par(mfrow=c(2,1)) par(mar=c(1,1,3,1)) plotBS(midpoint(fitJC$tree), bs, p = 50, type="p") title("a)") cnet <- consensusNet(bs, p=0.2) plot(cnet, "2D", show.edge.label=TRUE) title("b)") @ %$ \begin{figure} \begin{center} <>= <> @ \end{center} \caption{a) Unrooted tree (midpoint rooted) with bootstrap support values. b) ConsensusNet from the bootstrap sample} \label{fig:BS} \end{figure} Several analyses, e.g. \Rfunction{bootstrap} and \Rfunction{modelTest}, can be computationally demanding, but as nowadays most computers have several cores one can distribute the computations using the \multicore{} package. However it is only possible to use this approach if R is running from command line ("X11"), but not using a GUI (for example "Aqua" on Macs) and unfortunately the \multicore{} package does not work at all under Windows. \newpage \section{Appendix: Standard scripts for nucleotide analysis}\label{sec:Appendix1} Here we provide two standard scripts which can be adapted for the most common tasks. Most likely the arguments for \Rfunction{read.phyDat} have to be adapted to accommodate your file format. Both scripts assume that the \multicore{} package works on your platform, see comments above. <>= options(prompt=" ") options(continue=" ") @ <>= library(phangorn) file="myfile" dat = read.phyDat(file) dm = dist.ml(dat, "F81") tree = NJ(dm) # as alternative for a starting tree: tree <- pratchet(dat) # parsimony tree tree <- nnls.phylo(tree, dm) # need edge weights # 1. alternative: quick and dirty: GTR + G fitStart = pml(tree, dat, k=4) fit = optim.pml(fitStart, model="GTR", optGamma=TRUE, rearrangement="stochastic") # 2. alternative: preper with modelTest mt <- modelTest(dat, tree=tree, multicore=TRUE) mt[order(mt$AICc),] # choose best model from the table according to AICc bestmodel <- mt$Model[which.min(mt$AICc)] env = attr(mt, "env") fitStart = eval(get("GTR+G+I", env), env) # or let R search the table fitStart = eval(get(bestmodel, env), env) # equivalent to: fitStart = eval(get("GTR+G+I", env), env) fit = optim.pml(fitStart, rearrangement = "stochastic", optGamma=TRUE, optInv=TRUE, model="GTR") bs = bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE) @ \newpage \section{Appendix 2: Standard scripts for amino acid analysis}%\label{sec:Appendix2} You can specify different several models build in which you can specify, e.g. "WAG", "JTT", "Dayhoff", "LG". Optimizing the rate matrix for amino acids is possible, but would take a long, a very long time and you will need to have a large alignement to estimate all the parameters. So make sure to set optBf=FALSE and optQ=FALSE in the function \Rfunction{optim.pml}, which is also the default. <>= library(phangorn) file="myfile" dat = read.phyDat(file, type = "AA") dm = dist.ml(dat, model="JTT") tree = NJ(dm) # parallel will only work safely from command line # and not at all windows (mt <- modelTest(dat, model=c("JTT", "LG", "WAG"), multicore=TRUE)) # run all available amino acid models (mt <- modelTest(dat, model="all", multicore=TRUE)) fitStart = eval(get(mt$Model[which.min(mt$BIC)], env), env) fitNJ = pml(tree, dat, model="JTT", k=4, inv=.2) fit = optim.pml(fitNJ, rearrangement = "stochastic", optInv=TRUE, optGamma=TRUE) fit bs = bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE) @ <>= options(prompt="> ") options(continue="+ ") @ \newpage % \cite{Sugiura1978} \bibliographystyle{plain} \bibliography{phangorn} \section{Session Information} The version number of \R{} and packages loaded for generating the vignette were: <>= toLatex(sessionInfo()) @ \end{document} phangorn/inst/doc/phangorn-specials.R0000644000176200001440000000714113502203723017350 0ustar liggesusers### R code from vignette source 'phangorn-specials.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: phangorn-specials.Rnw:48-51 ################################################### options(width=70) options("show.signif.stars" = FALSE) foo <- packageDescription("phangorn") ################################################### ### code chunk number 2: phangorn-specials.Rnw:73-79 ################################################### library(phangorn) data = matrix(c("r","a","y","g","g","a","c","-","c","t","c","g", "a","a","t","g","g","a","t","-","c","t","c","a", "a","a","t","-","g","a","c","c","c","t","?","g"), dimnames = list(c("t1", "t2", "t3"),NULL), nrow=3, byrow=TRUE) data ################################################### ### code chunk number 3: phangorn-specials.Rnw:82-84 ################################################### gapsdata1 = phyDat(data) gapsdata1 ################################################### ### code chunk number 4: phangorn-specials.Rnw:87-90 ################################################### gapsdata2 = phyDat(data, type="USER", levels=c("a","c","g","t","-"), ambiguity = c("?", "n")) gapsdata2 ################################################### ### code chunk number 5: phangorn-specials.Rnw:94-109 ################################################### contrast = matrix(data = c(1,0,0,0,0, 0,1,0,0,0, 0,0,1,0,0, 0,0,0,1,0, 1,0,1,0,0, 0,1,0,1,0, 0,0,0,0,1, 1,1,1,1,0, 1,1,1,1,1), ncol = 5, byrow = TRUE) dimnames(contrast) = list(c("a","c","g","t","r","y","-","n","?"), c("a", "c", "g", "t", "-")) contrast gapsdata3 = phyDat(data, type="USER", contrast=contrast) gapsdata3 ################################################### ### code chunk number 6: phangorn-specials.Rnw:165-171 ################################################### library(ape) tree = unroot(rtree(3)) fit = pml(tree, gapsdata3) fit = optim.pml(fit, optQ=TRUE, subs=c(1,0,1,2,1,0,2,1,2,2), control=pml.control(trace=0)) fit ################################################### ### code chunk number 7: phangorn-specials.Rnw:234-246 ################################################### library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") tree <- NJ(dist.ml(primates)) dat <- dna2codon(primates) fit <- pml(tree, dat, bf="F3x4") fit0 <- optim.pml(fit, model="codon0", control=pml.control(trace=0)) fit1 <- optim.pml(fit, model="codon1", control=pml.control(trace=0)) fit2 <- optim.pml(fit, model="codon2", control=pml.control(trace=0)) fit3 <- optim.pml(fit, model="codon3", control=pml.control(trace=0)) anova(fit0, fit2, fit3, fit1) ################################################### ### code chunk number 8: plotAll ################################################### trees <- allTrees(5) par(mfrow=c(3,5), mar=rep(0,4)) for(i in 1:15)plot(trees[[i]], cex=1, type="u") ################################################### ### code chunk number 9: figAll ################################################### getOption("SweaveHooks")[["fig"]]() trees <- allTrees(5) par(mfrow=c(3,5), mar=rep(0,4)) for(i in 1:15)plot(trees[[i]], cex=1, type="u") ################################################### ### code chunk number 10: phangorn-specials.Rnw:281-282 ################################################### trees = nni(trees[[1]]) ################################################### ### code chunk number 11: phangorn-specials.Rnw:293-294 ################################################### toLatex(sessionInfo()) phangorn/inst/doc/Networx.html0000644000176200001440000114465313502203730016155 0ustar liggesusers Splits and Networx

Splits and Networx

Klaus Schliep

June 18, 2019

We first load the phangorn package and a few data sets we use in this vignette.

consensusNet

A consensusNet (Holland et al. 2004) is a generalization of a consensus tree. Instead of only representing splits (taxon bipartitions) occurring in at least 50% of the trees in a bootstrap or MCMC sample one can use a lower threshold and explore competing splits. Note that, in its basic implementation used here, the consensusNet edge lengths are proportional to the frequence of the corresponding splits in the provided list of trees.

The input for consensusNet is a list of trees i.e. an object of class multiPhylo.

In many cases, consensusNet will return more than two incompatible (competing) splits. This cannot be plotted as a planar (2-dimensional) graph. Such as situation requires a n-dimensional graph, where the maximum number of dimensions equals the maximum number of incompatible splits. For example, if we have three alternative incompatible splits: (A,B)|(C,D) vs. (A,C)|(B,D) vs. (A,D)|(B,C), we need a 3-dimensional graph to show all three alternatives. A nice way to get still a good impression of the network is to plot it in 3D.

which will result in a spinning graph similar to this

rotatingNetworx

rotatingNetworx

neighborNet

The function neighborNet implements the popular method of Bryant and Moulton (2004). The Neighbor-Net algorithm is essentially a 2D-version of the Neighbor joining algorithm. The Neighbour-net is computed in two steps: the first computes a circular ordering of the taxa in the data set; the second step involves the estimation of edge weights using non-negative Least-Squares (nnls).

The advantage of Neighbor-Net is that it returns a circular split system which can be always displayed in a planar (2D) graph. The plots displayed in phangorn may (however) not be planar, but re-plotting can give you a planar graph. This unwanted behavior will be improved in future version. The rendering of the networx is done using the the fantastic igraph package (Csardi and Nepusz 2006).

Adding support values

We can use the generic function addConfidences to add (branch) support values from a tree, i.e. an object of class phylo to a networx, splits or phylo object. The Neighbor-Net object we computed above provides no support values. We can add the support values from the tree we computed to the splits (edges) shared by both objects.

Analogously, we can also add support values to a tree:

Estimating edge weights (nnls)

Consensus networks, on the other hand, provide primarily information about support values corresponding to a split, but no information about the actual difference between the taxon bipartitions defined by that split. For example, one may be interested how the alternative support values correspond with the actual genetic distance between the involved taxa. Given a distance matrix, we can estimate edge weights using non-negative Least-Squares, and plot them onto the consensusNet splits graph.

Import and export networks, advanced functions for networx objects

The functions read.nexus.networx and write.nexus.networx can read and write nexus files for or from SplitsTree (Huson and Bryant 2006). Check-out the new vignette IntertwiningTreesAndNetworks for additional functions, examples, and advanced applications.

References

Bryant, David, and Vincent Moulton. 2004. “Neighbor-Net: An Agglomerative Method for the Construction of Phylogenetic Networks.” Molecular Biology and Evolution 21 (2): 255–65. https://doi.org/10.1093/molbev/msh018.

Csardi, Gabor, and Tamas Nepusz. 2006. “The Igraph Software Package for Complex Network Research.” InterJournal Complex Systems: 1695. http://igraph.org.

Holland, Barbara R., Katharina T. Huber, Vincent Moulton, and Peter J. Lockhart. 2004. “Using Consensus Networks to Visualize Contradictory Evidence for Species Phylogeny.” Molecular Biology and Evolution 21 (7): 1459–61. https://doi.org/10.1093/molbev/msh145.

Huson, D.H., and D. Bryant. 2006. “Application of Phylogenetic Networks in Evolutionary Studies.” Molecular Biology and Evolution 23 (2): 254–67.

Schliep, Klaus Peter. 2011. “Phangorn: Phylogenetic Analysis in R.” Bioinformatics 27 (4): 592–93. https://doi.org/10.1093/bioinformatics/btq706.

phangorn/inst/doc/IntertwiningTreesAndNetworks.html0000644000176200001440000143715613502203727022364 0ustar liggesusers Intertwining phylogenetic trees and networks: R Example Script

Intertwining phylogenetic trees and networks: R Example Script

Klaus Schliep, Alastair Potts, David Morrison and Guido Grimm

June 18, 2019

Description: This script provides examples of the new functions available in the phangorn library to ‘intertwine’ trees and networks, i.e. compare trees and networks and data transferrance. It also provides a step-by-step guide for users new to R.

Methodological advancement: The major advancement in this phangorn update is the introduction of a generic network object with a wide range of related transfer and analysis functions. These new functions provide the first means to directly transfer information amongst a wide range of phylogenetic trees and networks, as well as means to visualise and further analyse this information. This should provide a platform for individuals to easily conduct tree-network comparisons and stimulate further function development by the community.

What next?: By implementing full network handling compatibility in R, and providing exemplar scripts (such as this) and support, the scientific community now has an easy means to analyse and compare the results of phylogenetic trees vs. network approaches. We hope this will open a largely unexplored world to the general phylogenetic audience.

Installing R

  1. Download R
    Select the nearest mirror to your location at https://cran.r-project.org/mirrors.html
  2. Select your operating system and download the relevant installation file.
  3. Install R following the instructions.

Installing the phangorn library

Open R and run the two lines of code below in the command line.
(You will need to select a region from which to download the library)

Set the working directory

This is often a major stumbling block for new R users. You need to specify where in your folder structure you wish to work. i.e, where are the files stored that you wish to input?

This is done using the setwd() function, e.g. setwd("C:/TreesNetworks/Example Files").

We now set it to the folder of the phangorn package, which contains the files we want to load for this example.

Read in the example file datasets:

This example files are based on the woodmouse dataset available in the ape library. Ultimately, this dataset is from this study: Michaux, J. R., Magnanou, E., Paradis, E., Nieberding, C. and Libois, R. (2003) Mitochondrial phylogeography of the Woodmouse (Apodemus sylvaticus) in the Western Palearctic region. Molecular Ecology, 12, 685-697.)

## 1001 phylogenetic trees
## 1001 phylogenetic trees

All example files read into R.

Interwining trees and network functions

1C:

Frequencies of bipartitions found in the bootstrap pseudoreplicates mapped on the corresponding edge bundles of the NN network using a threshold of 10% (i.e. any edge is labelled that occurs in at least 100 of the 1000 ML-BS pseudoreplicates). Edge bundles not found in the ML tree are labelled using grey edges.

Extras…

We can also compare the neighborNet with a consensusNet (Holland BR, Huber KT, Moulton V, Lockhart PJ,2004, Using consensus networks to visualize contradictory evidence for species phylogeny. Molecular Biology and Evolution, 21, 1459-1461). Furthermore, we can extract the support values from the consensus network, and place these on to the NeighbourNet (this is similar to the process explained in 1C above).

There are four possible data patterns in phylogenetic reconstruction: (1) patterns that are well supported in the network and appear in the bootstapped trees; (2) patterns that are well supported by (part of) the data/network but do not appear in the optimised trees, i.e. they are incompatible with the tree; (3) patterns that are weakly supported by the network but appear in the optimised trees anyway, i.e. they are compatible with the tree.

Here we demonstrate these patterns by showing the relationships between splits weights, from a NeighborNet splits graph, bootstrap bipartitions support and bootstrap percentages plotted on the optimised tree for a dataset of Wang, Braun, and Kimball (2012).

(An advanced user figure…)

##                              SplitWeight Bootstrap  Tree
## ..||........................   0.0171433       100  TRUE
## ..||||......................   0.0013902        14 FALSE
## ..||||......|||||...........   0.0001589         0 FALSE
## ||.........................|   0.0027691         1 FALSE
## ||..........................   0.0840367       100  TRUE
## ...|||......................   0.0001773         0 FALSE
## ...|||........|.|...........   0.0003663         0 FALSE
## |.|.........................   0.0060907         0 FALSE
## ....||......................   0.0385909       100  TRUE
## ||||........................   0.0018195        34  TRUE

Figure 4

There are several option plotting a co-phylogeny. In the following we use the cophylo function of the phytools package.

library(phytools)
par(mfrow=c(2,1))
obj <- cophylo(YCh, mtG) 
plot(obj, mar=c(.1,.1,2,.1),scale.bar=c(.005,.05), ylim=c(-.2,1))  
title("A. YCh                                    B. mtG")
obj <-  cophylo(ncAI, all_data)
plot(obj, mar=c(.1,.1,2,.1),scale.bar=c(.005,.05), ylim=c(-.2,1))
title("C. ncAI                              D. All data")

Unfortunately this function does not (yet) offer to add confidences to some splits, but we can do this easily with more basic plot functions.

We can compare this with consensus network with the different bootstrap values for the different genes.

Schliep, Klaus, Alastair J. Potts, David A. Morrison, and Guido W. Grimm. 2017. “Intertwining Phylogenetic Trees and Networks.” Methods in Ecology and Evolution 8 (10): 1212–20. https://doi.org/10.1111/2041-210X.12760.

Wang, Ning, Edward L. Braun, and Rebecca T. Kimball. 2012. “Testing Hypotheses About the Sister Group of the Passeriformes Using an Independent 30-Locus Data Set.” Molecular Biology and Evolution 29 (2): 737–50. https://doi.org/10.1093/molbev/msr230.

phangorn/inst/doc/IntertwiningTreesAndNetworks.Rmd0000644000176200001440000003345313475602650022140 0ustar liggesusers--- title: 'Intertwining phylogenetic trees and networks: R Example Script' author: "Klaus Schliep, Alastair Potts, David Morrison and Guido Grimm" date: "`r format(Sys.time(), '%B %d, %Y')`" bibliography: phangorn.bib output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{IntertwiningTreesAndNetworks} %\VignetteEngine{knitr::rmarkdown} %\usepackage[utf8]{inputenc} --- [comment]: # (output: html_document) --- nocite: | @Schliep2017 ... ```{r setup, echo=FALSE} # set global chunk options: images will be bigger knitr::opts_chunk$set(fig.width=6, fig.height=6) #, global.par=TRUE options(digits = 4) knitr::knit_hooks$set(small.mar=function(before, options, envir){ if (before && options$fig.show!='none') par(mar=c(.5,.5,.5,.5)) }) ``` *Description:* This script provides examples of the new functions available in the phangorn library to 'intertwine' trees and networks, i.e. compare trees and networks and data transferrance. It also provides a step-by-step guide for users new to R. *Methodological advancement:* The major advancement in this phangorn update is the introduction of a generic network object with a wide range of related transfer and analysis functions. These new functions provide the first means to directly transfer information amongst a wide range of phylogenetic trees and networks, as well as means to visualise and further analyse this information. This should provide a platform for individuals to easily conduct tree-network comparisons and stimulate further function development by the community. *What next?:* By implementing full network handling compatibility in R, and providing exemplar scripts (such as this) and [support](https://github.com/KlausVigo/phangorn), the scientific community now has an easy means to analyse and compare the results of phylogenetic trees vs. network approaches. We hope this will open a largely unexplored world to the general phylogenetic audience. ### Installing R 1. Download R Select the nearest mirror to your location at https://cran.r-project.org/mirrors.html 2. Select your operating system and download the relevant installation file. 3. Install R following the instructions. ### Installing the phangorn library Open R and run the two lines of code below in the command line. (You will need to select a region from which to download the library) ```{r, eval=FALSE} install.packages("phangorn", dependencies=TRUE) # install latest development version needs devtools install.packages("devtools", dependencies=TRUE) library(devtools) install_github("KlausVigo/phangorn") ``` ### Getting started ```{r} library(phangorn) # load the phangorn library library(magrittr) ``` ### Set the working directory This is often a major stumbling block for new R users. You need to specify where in your folder structure you wish to work. i.e, where are the files stored that you wish to input? This is done using the `setwd()` function, e.g. `setwd("C:/TreesNetworks/Example Files")`. We now set it to the folder of the phangorn package, which contains the files we want to load for this example. ### Read in the example file datasets: This example files are based on the woodmouse dataset available in the ape library. Ultimately, this dataset is from this study: Michaux, J. R., Magnanou, E., Paradis, E., Nieberding, C. and Libois, R. (2003) Mitochondrial phylogeography of the Woodmouse (*Apodemus sylvaticus*) in the Western Palearctic region. Molecular Ecology, 12, 685-697.) ```{r} ## automatically set the correct working directory for the examples below # setwd(system.file("extdata/trees", package = "phangorn")) # for this vignette we create a path to the files we want to load fdir <- system.file("extdata/trees", package = "phangorn") ## in your case it may look something like this... # setwd("C:/TreesNetworks/Example Files") ##DNA Matrix, maybe not needed woodmouse <- read.phyDat(file.path(fdir, "woodmouse.fasta"),format="fasta") ## RAxML best-known tree with bipartition support (from previous analysis) raxml.tree <- read.tree(file.path(fdir,"RAxML_bipartitions.woodmouse")) ## RAxML bootstrap trees (from previous analysis) raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.woodmouse")) ## MrBayes consensus tree (50% majority rule) (from previous analysis) mrbayes.tree <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.con")) ## MrBayes sample runs 1 and 2 (from previous analysis) run1 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run1.t")) run2 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run2.t")) ## How many trees are in the MrBayes tree sample? run1 run2 ## Combining the two runs and removing 25% burn-in mrbayes.trees <- c(run1[251:1001],run2[251:1001]) ## NeigbourNet Nexus file generated by SplitsTree (from previous analysis) Nnet <- read.nexus.networx(file.path(fdir,"woodmouse.nxs")) ``` All example files read into R. ### Viewing the data ```{r} par(mfrow=c(1,2), mar=c(1,1,1,1)) # Setting plot parameters ### Plotting trees with support values: ## RAxML plot(raxml.tree) nodelabels(raxml.tree$node.label, adj = c(1, 0), frame = "none") ## MrBayes plot(mrbayes.tree) nodelabels(mrbayes.tree$node.label, adj = c(1, 0), frame = "none") par(mfrow=c(1,1)) # Setting plot parameters # NeighbourNet plot(Nnet,"2D") ## alternatively, # plot(Nnet,"2D") ``` ### Interwining trees and network functions ### 1A: Identification of edge bundles (in black) in a neighbour-net (NN) network that correspond to branches (labelled 1-12) in a tree (a maximum likelihood tree, in this case). ```{r, fig.width=7, fig.height=4, small.mar=TRUE} # create a vector of labels for the network corresponding to edges in the tree edge.lab <- createLabel(Nnet, raxml.tree, raxml.tree$edge[,2], "edge") # could be also 1:27 instead of raxml.tree$edge[,2] # Show the correspondingly labelled tree and network in R par(mfrow=c(1,2)) plot(raxml.tree, "u", rotate.tree = 180, cex=.7) edgelabels(raxml.tree$edge[,2],col="blue", frame="none", cex=.7) # find edges that are in the network but not in the tree edge.col <- rep("black", nrow(Nnet$edge)) edge.col[ is.na(edge.lab) ] <- "red" # or a simpler alternative... edge.col <- createLabel(Nnet, raxml.tree, "black", nomatch="red") x <- plot(Nnet, edge.label = edge.lab, show.edge.label = T, "2D", edge.color = edge.col, col.edge.label = "blue", cex=.7) # the above plot function returns an invisible networx object and this object also # contains the colors for the edges. ``` ### 1B: Bootstrap support for all branches (branch labels) in the ML tree mapped on the corresponding edge bundles of the NN network. The edges in the network which are not found as ML tree branches are highlighted in red. ```{r, small.mar=TRUE} # the scaler argument multiplies the confidence values. This is useful to switch # confidences values between total, percentage or ratios. x <- addConfidences(Nnet,raxml.tree, scaler = .01) # find splits that are in the network but not in the tree split.col <- rep("black", length(x$splits)) split.col[ !matchSplits(as.splits(x), as.splits(raxml.tree)) ] <- "red" # simpler alternative... split.col2 <- createLabel(x, raxml.tree, label="black", "split", nomatch="red") # Plotting in R out.x <- plot(x,"2D",show.edge.label=TRUE, split.color=split.col, col.edge.label = "blue") ``` Again we can write to SplitsTree for viewing... ```{r} # write.nexus.networx(out.x,"woodmouse.tree.support.nxs") ## or we can also export the splits alone (for usage in software other than SplitsTree) # write.nexus.splits(as.splits(out.x),"woodmouse.splits.support.nxs") ``` ### 1C: Frequencies of bipartitions found in the bootstrap pseudoreplicates mapped on the corresponding edge bundles of the NN network using a threshold of 10% (i.e. any edge is labelled that occurs in at least 100 of the 1000 ML-BS pseudoreplicates). Edge bundles not found in the ML tree are labelled using grey edges. ```{r, small.mar=TRUE} y <- addConfidences(Nnet, as.splits(raxml.bootstrap)) edge.col <- createLabel(y, raxml.tree, label="black", "edge", nomatch="grey") y <- plot(y,"2D",show.edge.label=TRUE, edge.color=edge.col) ## Write to SplitsTree for viewing # write.nexus.networx(y,"NN.with.bs.support.nxs") ``` ### Extras... We can also compare the neighborNet with a consensusNet (Holland BR, Huber KT, Moulton V, Lockhart PJ,2004, Using consensus networks to visualize contradictory evidence for species phylogeny. Molecular Biology and Evolution, 21, 1459-1461). Furthermore, we can extract the support values from the consensus network, and place these on to the NeighbourNet (this is similar to the process explained in 1C above). ```{r, small.mar=TRUE} cnet <- consensusNet(raxml.bootstrap,prob=0.10) edge.col <- createLabel(cnet, Nnet, label="black", "edge", nomatch="grey") cnet <- plot(cnet, "2D", show.edge.label = TRUE, edge.color=edge.col) edge.col <- createLabel(Nnet, cnet, label="black", "edge", nomatch="grey") z <- plot(Nnet, "2D", show.edge.label = TRUE, edge.color=edge.col) obj <- addConfidences(Nnet,cnet) plot(obj,"2D",show.edge.label=T, edge.color=edge.col, col.edge.label = "blue") ## Write to SplitsTree for viewing # write.nexus.networx(obj,"Nnet.with.ML.Cnet.Bootstrap.nxs") ``` ### There are four possible data patterns in phylogenetic reconstruction: (1) patterns that are well supported in the network and appear in the bootstapped trees; (2) patterns that are well supported by (part of) the data/network but do not appear in the optimised trees, i.e. they are incompatible with the tree; (3) patterns that are weakly supported by the network but appear in the optimised trees anyway, i.e. they are compatible with the tree. Here we demonstrate these patterns by showing the relationships between splits weights, from a NeighborNet splits graph, bootstrap bipartitions support and bootstrap percentages plotted on the optimised tree for a dataset of @Wang2012. (An advanced user figure...) ```{r, fig.width=7, fig.height=6} Nnet <- read.nexus.networx(file.path(fdir,"RAxML_distances.Wang.nxs")) raxml.tree <- read.tree(file.path(fdir,"RAxML_bestTree.Wang.out")) %>% unroot raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.Wang.out")) bs_splits <- as.splits(raxml.bootstrap) tree_splits <- as.splits(raxml.tree) %>% unique %>% removeTrivialSplits # we overwrite bootstrap values and set the weights # to 1e-6 (almost zero), as we plot them on a log scale later on attr(bs_splits, "weights")[] <- 1e-6 # combine the splits from the bootstrap and neighbor net # and delete duplicates and add the confidence values # we get rid of trivial splits all_splits <- c(Nnet$splits, bs_splits) %>% unique %>% removeTrivialSplits %>% addConfidences(bs_splits, scaler=100) # For easier plotting we create a matrix with the confidences and # weights as columns tab <- data.frame(SplitWeight = attr(all_splits, "weights"), Bootstrap=attr(all_splits, "confidences"), Tree=FALSE) # we add a logical variable pto indicate which splits are in the RAxML tree tab$Tree[matchSplits(tree_splits, all_splits, FALSE)] = TRUE tab[is.na(tab[,"Bootstrap"]),"Bootstrap"] <- 0 tab[,"Bootstrap"] <- round(tab[,"Bootstrap"]) rownames(tab) <- apply(as.matrix(all_splits, zero.print = ".", one.print = "|"), 1, paste0, collapse="") tab[1:10,] col <- rep("blue", nrow(tab)) col[tab[,"Bootstrap"]==0] <- "green" col[tab[,"SplitWeight"]==1e-6] <- "red" pch = rep(19, nrow(tab)) pch[tab$Tree] <- 17 par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE) plot(tab[,"SplitWeight"], tab[,"Bootstrap"], log="x", col=col, pch=pch, xlab="Split weight (log scale)", ylab="Bootstrap (%)") legend("topright", inset=c(-0.35,0), c("Pattern 1", "Pattern 2", "Pattern 3", "Pattern in the\nbest tree"), pch=c(19,19,19,17), col=c("blue", "green", "red", "black"), bty="n") ``` ### Figure 4 ```{r} YCh <- read.tree(file.path(fdir, "RAxML_bestTree.YCh")) mtG <- read.tree(file.path(fdir, "RAxML_bestTree.mtG")) ncAI <- read.tree(file.path(fdir, "RAxML_bestTree.AIs")) all_data <- read.tree(file.path(fdir, "RAxML_bestTree.3moles")) YCh_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.YCh")) mtG_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.mtG")) ncAI_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.AIs")) all_data_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.3moles")) ``` There are several option plotting a co-phylogeny. In the following we use the `cophylo` function of the `phytools` package. [comment]: # ({r cophylo, fig.width=7, fig.height=7}) ``` library(phytools) par(mfrow=c(2,1)) obj <- cophylo(YCh, mtG) plot(obj, mar=c(.1,.1,2,.1),scale.bar=c(.005,.05), ylim=c(-.2,1)) title("A. YCh B. mtG") obj <- cophylo(ncAI, all_data) plot(obj, mar=c(.1,.1,2,.1),scale.bar=c(.005,.05), ylim=c(-.2,1)) title("C. ncAI D. All data") ``` ![](cophylo.png) Unfortunately this function does not (yet) offer to add confidences to some splits, but we can do this easily with more basic plot functions. ```{r} par(mfrow=c(2,2), mar = c(2,2,4,2)) YCh <- plotBS(midpoint(YCh), YCh_boot, "phylogram", p=0, main = "YCh") mtG <- plotBS(midpoint(mtG), mtG_boot, "phylogram", p=0, main = "mtG") ncAI <- plotBS(midpoint(ncAI), ncAI_boot, "phylogram", p=0, main = "ncAI") all_data <- plotBS(midpoint(all_data), all_data_boot, "phylogram", p=0, main = "All data") ``` We can compare this with consensus network with the different bootstrap values for the different genes. ```{r, small.mar=TRUE} par(mfrow=c(1,1)) cn <- consensusNet(c(YCh, mtG, ncAI)) cn <- addConfidences(cn, YCh_boot) %>% addConfidences(mtG_boot, add=TRUE) %>% addConfidences(ncAI_boot, add=TRUE) %>% addConfidences(all_data_boot, add=TRUE) plot(cn, "2D", show.edge.label=TRUE) ``` phangorn/inst/doc/Ancestral.pdf0000644000176200001440000045101313502203731016217 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3406 /Filter /FlateDecode /N 72 /First 581 >> stream xZ[o8~_bВEJ\ 4qyp%ֱS[nR%vLX$(:$wnTS$,f1L3̰J0"2ifYz)XA?:eRh表^3i 0iud¢ؠ1eldR"ɔPQĔˑbqbmZsicf4!AKQwILc0Y0(V%0wRX,\%0R)I- 4G0] ]l,R'jЉSf [KVGBuM1 E jPXLJOmT*$X;(#0X)#̊x.,c<s,'lk h"͠5 iL/#e:(Gq FrI m.І'x7!iLLD?d8+WVBN0+(BIec}7[GbcV܎'Whd"E~g$FXm"Mߪ~Q]yqnA{2ɮ} axr5uW=f tNxZL`Mdl٠pzy1̨T.ck<X5?1⿀)Z2nB} C*xNͩlTLY;Wys(LlDo'Y4g(bﬠe+wA7g2eh]L${(@ A"L (Kʲv6- `o"I!pH~O52SvT !xqU˨LˑaߍG$GbG ü~ĺy~-Nȼrq"mp( +ajz6+JD-x XJFe)VG]!z&N[ ʪ9-TҟfnY|yogSb3 hc4][ "i!(<s}$*OdUqKH%ʿ(e,IVt,~QC;Z@=nحc:-M. ,ţA$B g:~s>#>b]4!$_|§1񟯜_Ggؿwެ@Miwai,d}.k >Lc>@A88n&@Y}FmI,YCRxl դT^M>غɞN.Cǩը_UWHwu|o.K$QlQ4@o&=N)ʽYLi9d5*zIZťWSgWu4G AZ{comw;!?=O)?=~/g0ʿNbeLYx8ϯ77FW-ϾC= ;~ͯ{D^08X‹F@7 P} g":ive%&&eSj kۆui]aa9$z۟8==ԉ:, IٶL}aY@b&^q.^4sz[Xh04x6cRb3\>x~a7/ sٶHSve7Us&0km~ars$5&,eקW 3;Ơށ> }d,kmR#^CٮԂy!WbFM)i2DsCcVV&ˏݏ]L(uRD7)K` )D7`n--ݕXs+WRx٤f"--tZ>tHng>FWd:ON`dxMJߪ WՆk @mj{/Ք|Kȗw}rΑHbR9RĨuwM&Kĸktd.^ln97_ K)_ߍۑ--~J_g}.*J( ih>/tJ>`:4fg)7TSjIY/Ajo#ZҪ)$Al,S5;I+ˊNʲYYtrVeM_()mW{{ˆ?"-?\Nkz ((*ڢ^\G>Ro?fEd{#Ai3cuVr6\[%YomnWs!W0uyH] Ph s2;)B[=%RaiZLiƻ̼A,Ig?[^z힬kH̲ Bap &v.Φ|0ZvR,qatvM X߅XFk [fy S +ƾncu`l gCt=#KDw? L(~qT.cQ8 2]+m{GsTRclU6XYNYejےuu-t“z0N5,K5"f 0MhV[ƐN6(uiRҤVkjW{wԩDہA喋9@{#')wqT\7b|4.KLOZJNpCr,[X \%O.ڹ _SM;m|>'c #wIx!ƕcfkH G}qfprz5=endstream endobj 74 0 obj << /Subtype /XML /Type /Metadata /Length 1557 >> stream GPL Ghostscript 9.26 2019-06-18T11:48:41-04:00 2019-06-18T11:48:41-04:00 LaTeX with hyperref package endstream endobj 75 0 obj << /Filter /FlateDecode /Length 3836 >> stream xn]]G\po{} - $B_?kkd9wfH3%%q"9Ùv%&_W?I:ӽ{uwx>BؕsʮOVaRĕq2/^يIh[_n0CtBe#-~ Qq}"`\Wi~j!&]xk^~K1wtFDƁTh#%G>^ aΨ_mKE+t&퐝IGYi2U*UTqs1 $AN"C_@<8#9KM$ }@XcVh֧tF3qpt>r=idtXmԫ#Є_֌l39jwtA>ղ:mm)DkU-a7n46Nnj *:tW~ H&J4]B"+ZI~ (aDB p>|1y5bEP~>^bWqN RretrQM2\I:ݥs}p*百ak9 d9enKwEb 4.߉ YIIk8$V[I)@D5“7HϠ"(0I3.@.l9EkIbrbCfGB+.m8EB1Ն`:煴)p,24XVG|C|Ԏ ֜3`6[9Ixw6sQ@B պ:55BLp42ے˃wp-oF뼮唨2^yR%*|u< l}2*֞$d͈Æ"c,+R55266p&hNeWܫtBزj|Pt}vpyzh$垉XPMrJ5֭Q-[#q:pZɌq2"i6} ϓyɖMS;|btQ`BiŒS=V=5(@+w`(&8c[ Lc}u;wO8{Z;Yϑ]u۱.⑟ʽvQDv%STmμCxص~yICob!> Z0l|@a>:WEZ˛o%푣}cZ՚u$S4SiO!8닧'cľR*t] sNf8Џ(!)j$3m54-kHĸk-4'"½:<4_>a)bBc5xnrC0FUモ-.ɻ9'f^ڶR଺O'mC{> :Vܯh4%O"nA5dEduRs}W?jI"طwR>##g@.A8DOm3[\igDŽY@geYGڼK/5C7"HR^k*>OP8w+-yma󷽷\d(qAi㚜-ܚ_(ݟsr ՌlI0uS{]qx4HjS^Ev1 NZk^e^t^{]I8[:qHKs$ȧ|2GĠc?0m&qRnKRNnrF>i<Ʃog=SR)06=YQeǚSb+bOY u+rqF)ط*CSMkt/cO)C\6Kɓu=Ρ`c|ARaةQڊZ;|l-e[']\7)a+\ևPOhS, K]yx16ABdg&N,9#22[f.c`tg6]ٙ#M|QE@ըuR`8N 7gl[M6U* %M &_ *9FYSըemF㨃qi~rJU6]3):e#a&¦( s8'O7gh ("wErtRwcIf6\Hi`s#R˨xs2κom3|Dz"CHZqUƪ3Y`v\G9ߙ|۾̀q' Cy<"2%YԲ_ )NSN9L *b6[W43`VCgN6TIB.mp Kd:YdRnd3Np["PjP)7k6٠ʀ"uG)n;c\OKVW]Heh6lϗ)ڞO.rk6{9 5ƶCs ?QALce]nI-$j59mFzFޏ{2կ{b=Б LR.~~^yʯ}VQ3pb=[r>L=7j>Xwdо<,^gYH24~e DMJQ/@z40h9NBq߅w?-4p'bgL!#*oFuGJAfm `?⯑t?niendstream endobj 76 0 obj << /Filter /FlateDecode /Length 3469 >> stream xn7}O= O/#l8<:c$ǫdU{4#ہЃEX~?g=.ff'3>@=Z,M$z8;.f,t%L:ӝ-XМ#%Vvwq(/E}xWRP|D ޖѧuK*:;BGIFQ~дL;h"0.)"h#z"~^>?E?}92m7:4*R^1'K-z!H\,9,ba1Zsjۅ`V$ Ț +5°yߝl$LU=DFyxr1\2/oH0%rTJԴ݇U7•a*zmX XŅ1N.O\ ix0Y07FII@՟8-@eA>BfJtǃuU#E֫!lI(VNRyvX&7 \a9%Š0GZCD!vHZg)c֒iI¤4APb L&Qyɂ{L-nB~hB$qXN88]^$ʇ*ҍ =XדYHL ~Nq\}U c.5wK 8UNXo$TLQvݿau0/Dz xѩr]xc7)!kNR$z8;(#]c(LG0R);ah^vT=k( @xH)KmK|<: ^TJ${ь?C@дfQwC}阶k个kbƺoO qۢEEX6ke-D !ㆤWe)^+_n+LV9B6bF_Rf\ɾFYՠŦl9feŶ2c``4R|@,3@`kNӑe0.`nќB`C03ΆK*z-/&%2Zw#")al 阈z a"iZMVlx6rP*ZF1gJbNVyMV)G.vW1 ӂDxk"[|NjPPlp-8:#S :AGsXtQYk4rЭMT5c/MZm!0դ9CD2B abU]osݷ=$|zʕFg.D5BD ?~I4bqj~1^kYFgMÕ{0K,. ֩b8oQ0@:myCS X}N^ =-^v'Bu BJ2S$ Zo j/v!ZO'ggi˲v"v`60NKS/RMU):xݵ<̰$>(BM_S4nX wMPܿPTF䩶W֍|Z{J8Kc1J9c C‰X8KT_UCXiPqEMq5E>=I_ʜ=x)m/e.M<:b)e}?v7Lhfn M>"?kDGcQpa ku5֙I+icXFʦw ;h2'/CӕT7iM="gz)Z1WY,y {>$HqɛPlcfS.! H$9EѸ_״ϭ7V"rJ(ۨ餞 '7޵ g_"޹6T2v{6X@_FIV:TyLjGo[}4+ 0CTNP kRpRȪf47XNop u7yƋ;XP;=tm|SʁZn3F6&-BUrYıݳ3dWDw(Î N#5!LmTX;ClI<:Ȇ15tt2jR[8zw>m$~.A\jAяx/JrPdLܪxQvY}b]>ȳO}qh{lc???SfkQt7jۗvQs֞ZÿATԸݡNq>pqW?.t~S %z͆'$'1]~_etG5'\1z>zT?o|t6>/`2KF'ZMNir]Ckm :F)ZkZ @3MźDXNfa1 oEnxLjK!suVJ"i]`m>}6,pmޝ_-t{lxe^鰇H2m#)>CE % _y6|>prHʂQ1? \0L JmD}R3]QB1^5MS! tyh I0v(tiendstream endobj 77 0 obj << /Filter /FlateDecode /Length 3227 >> stream x[r}W|WחĻ(](KVL(mgq1)C"h>ڟ'ſ˽C*&=29Ggq9q$J&ЕNmD{oSBa[Fm~΄_(k~`nk)1}&DI"iih6mmL*|Ym7qZao6h&KSRiyWJp\/6Wi3ʨhv+7Uù`8Pq Bt wQDJ"-M]bR0"0xH "V 'i)=Oi;9t]8C1bmn* I\/Vgkgu@]_)a!)mu] xZ-RGy>ZE5 Bu͛o糉*.%|2X`aa ,1ʔvG˫Ӻ2I031n0+J00R a0q *is!I}6AUAEX6D&VI8Bf9`uVg(H87}_F Ɔz*dH G˜D:`{?mE!˝#TVqAn<aēp#!*[xu>vrV]H3GNQewJ|J3Eqra[u:5ϼbd͂w:a]k$ؖ Yr+p))Zc &#]Lp0I `E8C!'ʀRc42*5!_r@HhW[E6CWI`[bh]n"bZhnLwЭ6S$S;a L׎?a(<$d`oPnd5Xk|}ֈ[ w{@[5e3ب5][j !v]ą>czRͯw>kWJU[ƇaHUy*;oLDu*(Ӏĩj,^BP-r_ފTUY1GjI ᪆{1 \,.^*kXU-jDRUQ7Zyo/gDq_SNɢP^ !q>Kk/L[1SW̦:'R)@^`:r`صnbt$ـڌ(}7uUu?ej܋GR[*% ܓ#qZmؓmP,p$-.`Pnf -{Vryqs 5]0۝p3~uZ!a(Z][ t]wRO1yدp?/^'ҠeU:(9u )KFҨY j>Rrk!R"+b Wʗ!}Ec@MoHrTALlVX!bj# l"Q_Y;endstream endobj 78 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2503 >> stream xV{TW!N:I[Vcmg'!1GD䗐I *Sjk][]떮j_wn'9$ww}C~IȨC"I~?Ydp`ĸoLި/@M=d"ܙ^Nѥ%%*54iĜ9_>G@HKvJdB%vHרI N2OѤ Ci J(ъtEZ"AXS#}KRHyjUJF&R'(vԂԴtMFLHT&X!Yb%XMDkb-@,$2b9E&'D,hBG*;~[|8Qר"e*ji-}st^A.}p S\ŕC>p\|Uv|Tuu>6[ [-6KM F5|[p`Z6jBM@i\w1(5 AI azߒ簦bgT*_^I[(x`{.A1ԗ?rٲM,zmU_rMP93o0Щ < D"]4[q4i] G-]=-ane&8h7ދ^v=>'B)5fJYv47oIhSVn.WK>P m,Kwam7ПX"t^b*IJ)āsZ9_dU!Rp2+=Uץۀ %ʍD}:oDhW^~{= B[&J}_k+ "Ř7}\ =4B!2#ɿZM6B{\d.2L9yPo4$m5WG5 u<˩[.S) Pxpf9c(X q^uUnc%.is)VRAaz7DDUtqwXj̴2 BR-^A!WčϣX։6p^J ]HȎ^fvU`GBmd@dvBb;[sKX;X-oQowזc0 JJUk(tIvEiJAYI@ϋZ~l_bd2J[{m%ۨU"՛J],(2|=-gy'n_Ui]4V>7NuYQbb_keO6Z[-Zxy^K"}hՠT%/.yw3ӄ2/c-J M\$untV+>mG2Q B\y,c 2]&Cdj=u,W >]# pGWq$sxpr7 |:lK:g kg.^{4 yYtzDBsqcEE&];zgFr!p( n@@h yۍϋ`#G6t77e`g9y֍=6L@1Jb]uB4 U[$i qB/=b5qV-M &gzG?|MĠnOML \k)BȀ,ƒ-'8/&-*LOh1yebnL 0s򹁅@ ?Ej؉, \*DA+9-3̜d69xXg2G өeۍDՈtP_XeN1+1lN8 U%5Sendstream endobj 79 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6758 >> stream xy XS"걠'gP:, 2+y0&Y yNPgPZZjkVZjmo'nz﷓hmo '{kw݋DeM9 D^ ,̘j:5=Be6`-{04y"4254,>"( 0m{3w8q o2@(GP xgFEtt9!4"`8ؠ@~~1~ BQ˽C`a,/BJQyRЍaߋX(zq̒Xq}.[2 puКkw9aSFN6bvd=n~5ZAAfRoRw(j 5ZKS:j Km\qFʕOyP {#H-EbjL-PnTjNRWWA`Pk-ՋR(CfQ!Tje#K-"9zS QQ^^wA⣽G.BJN 1O;~Ǭo@Gy%gvzeP`~0Nl-{gmžVh;#-vC=?mX'?z}뾯qN%' rcV0_'^3YŊ$HO{cyُh+?xu2ȋ)l3 G0J ) R.teD #ĢAcѤnYr"yS}l+UQyNm0LĽqKK|Tu!4$j!U,6gK@yLi&q=niU%CVM7Trɒ_ZE՜!)GVђt<"/ϖ'{X' z Ec2䎇!Gd_HJL [yTʿZExcX\9GNpK0u;x q{MxG1nk0T0N4 ´N sB~SB,\LM!U~ ].t;ȍpw-.aQ%ơo؂* b X~&R U.ŽQsf@cWdtD(֓Ih-08jԙŐ 9;l{ƒ5P/GsW$0So/yJCJhajvE'ϿϠ^T?,~$U?0'I-;(8PBzَF-jȶkh=9IbYXc%]ySv,,!;r|PͲAhz ^֔lmyAv^Nc :uF': v:!!Hvm۳ nKڤꚊHl~NN9̬"~t@t5ȴ$?8Q-d\or٢9-j ز}eC74P #Q.F{P kh߭w>$1 ~$=-)Qg@$d-i;'yNFAR4VC}x["'Х|lWVn# mj貜-2; J)ZMR| W&N#)"wǍ|_K/iYTk1$`ހ%x co=r?yGzN7Z n"`x}G@CH|+dY2Ha +5UI }w$&q!Ձ%;-Z8gua*/%$9"?sˮ-Y`5=9q6M܆0C:keZCEnEa)DNՕQQk z`QQ-!bLj~z_[_UZsYs7;/.:L]gwSgIR0D?J^r=):iba&><|}o;Je}КR׏0 n-Ku Ks E2%BH e^ymzWebH2 TC>@:`nN޼! PCdѠG# i0 pXo~NwRY}Л@{T/>#_a ij >d>>us4 Oݚ˩!AWɳ`W:}s)t~kSWۜI|sɤҌ#QMywˊxpg]QQ녳4;\8׷旵CwQQ<| dx!$q}EhFDWE5jkj8< ĵS)IMJ Q\&_K&{uBedDB|W>8wRLw5"Mqq&Ho(E-șHWdbz t$9pRnOP 4Ԫ sy@A@)v6U:F&1cg,A/9қ4W"(pB`V(Sa'0VB }cʺ􇧾\YL^ $'eƐDrFԚei1QEch$Xl?no#WN҆o!f$h`Cld2Im6Yhn)w'^ \׿gc<򽪉n޿bogUn_YoXYj8 x%~p-?juu/R/YeLy"(ı5ߘGn ( . oœRk<u Ϲm&1'M m;=D<$rr4e&׆ t"ĦX]OR,mJ#GbG#Q!qUlDQu}̛׷vU0_?=M 0c\Z{98q] [ioW2Ru2n*.k29Q)% ?/E07eyhK"n8Hj&uYT\dF7ؑjRc'똞J:@< JՏ=C9}$yqi'IDb "AV3=u5i/WeS 1)?Dg.|{ʆ+ MURi/uW;Nz)Kc)hn+HNI/я#jA&4wXIQD_!s U'%FыlOe_:_+҉֣7h1{ YI4r4G -ʯ$ŰYM Ldq4k8Re *b`ugtoټPEZQ_!<">"b25W\T4.:cK+R|IR.A~D|",`3@T^_YI~AQeP#-N쪨)n:МFL#n"'pm<+MꝜ;tgb> stream x]NPE|  ʠ!JAA(D@*+qh 888Chu5''9Y>tBh};.UGHq5K YSj)ʂUz6wv1< [-Nr|+'Ab4-]sf+Uceasu1+d8/MD9FTŚ֫kJRGuYWTِiM'Y`;3/Ԍ<2 zendstream endobj 81 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2582 >> stream xV PSg ElԢPQ@RV> R W(oI`AE%"`4 j-ZvZVN[k3'l33{3sw󳌻ò,7+ti(+=& Y`dO|a+ 9Fo𒁗{^S`3?F=X֐leؘIRY* ((pjj^[SjbzM 7iRUc^IJ_JJK}K/WbToj Fm*ZkU}eoLN&B Qڄ8aC4 SEiׇż 8i2,f˜p-f d&0+&0!$f>3YȄ2@fdR|weqnݪeCdegɇSp|<1q3]'XMAR_\]eG35:N;T8M yKgی^X^2 Jwɳd )"o(ɳ׎Uvn| Ѱ "WD)xKk{2d'ɔ|-޶kپuLZLA^>7Uy2yqMR5-0L'MSVAiF6gM|ahd,g_ņ|[hܖ~?/m򪭅i${LEZ[u8 >' y/ޖ[<+YmArx;AYɜ"0k+T_uBA8v_ J #0\3̿}4sג._f97m͢) O G@Í4+p!%rjVQrȽL{`q8>'}=PD[Fh.ѽ9{mv.3#φ 8E:ɩʛ3pٟXReڝV.@ڵA:L$?)8Y-/Bf+lLqa!:S7ߥ>L~M:Fa N1ǡXiKa=ĹjNoU6[L9W,ٱe9R,(dyVH<Ȼd6O:`8x9C{Ggggl J *%cU}p΄cm6=eR z(+6AN՚/8x 8BKXV*Yk״l?zp%KH:lyG?ȗ>.rS$힙ɳKZLya$"o>'VZe?!Rhy%4tk[SgJ:Smkyoi[qjl)cL>*j:·A#< ;82ҭ<1~~1zSb{Q{akjZ܇2UƟHQ~;cp(i+/ZJi`O[klOdZ #g*=e4ze p1l E_6i%NUk?\$HG*Ec}SAsC DGjNYAf<|m3: BZw i/@n _ ǕuUG!n1|Jkt Ev\kōrޱbXܛ+QW+i , {:&z'hl {d"cuZm.$2oEh{رPi-Vس72,*Ԛ/vUdpPlkCi0ι*LfkfA2fEX!çv}ՎL}ywn'WXj۳ W_'؄rn(Ny.Eaa6l{}ײ>߻Fo#2u)q.PŊpHꓟ=܂E$(~O ' p15p;+*~\eV>'25#kmY|D$AahMxH]΁UBG(; Vou%ۚb-|Z 84S`1VnIH@F@{x(nQ=9XJ$\"ygWHaez[.>%xV{y(BΫ_7pZendstream endobj 82 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3534 >> stream xyxSuOHPrNaUP *BV-]Ӆii''o4KӽtI7 ,8ϕ8qw/҂2yW4x#"W/|{{fo_~0j>e傛 1-,3 M/}:I}̛\(7{7_Ehz͡98QϕMhBiP{/C-;7fqiޕ1 CBͽQ,S ,k~_Fb!Kd[&GO"ޭvs/`R|n \"zͅ~ }𯗾Q DJ,jrA xKW&]KR\-eZcivd=?pLrGZLڜr%Xfu[hXr豠 )Gǹ;KڲIMωcRV7ܢkǚq-V d$ h'w;;3gWzz^l*ڮ+*6D=vZ:WOiXJ-fN4z?r~p l QS|z;xpTDY`3YF#Ͳ2ލ<\aG?@w<0c4a-7[+Jté09ydvv͝}zVzRr(-*KVAQ:X<ӣ:gf[[GׯUbn]ROiC)AА[RR^mz.ޕ5VVIFQ7FoUs/yDk}3|AT+܍5}kٱIur)T5뇊!dMHVyDIخָS=Vibz8=a{n*k Cp߈柮X߯)k%JV;) ;;bœ]@Vv"h,7?o"N@\Ri-_ܥϒ2E1@d;I:nO4$9M{P.8]; Tj("/W+S[XFIIrnR3{hGcW &g_/8^; 4z{2ZFi3LY!nޠ<=T3]5`-{w+wB29lݰC֫U p|!!-0I9mG c[+{{5:i  7*qA FӥK&m2KNxZWԠETK2׽H#;k_5b)m<}t hxc!-(gU`[u1 Wjוh&TM[MtŎsknZ;Iߴ  մjOqLJLdy H@\=j1ܢJYg7}w_7cܣ 7IԔ YA, zf[)zηvCg4zKě*{ T C'G96y k$Tܽgn]`L, T#RSwwP2&+^xa Nn3z7,83%b,!^( D6/Ƌck7@/ ip8sCBq_6Ԛ L/g*Lj䑘VY@ԊN'CEi[I]}L`\@z/B4c0o3[9g8O(+s_[meMG/bQ1Ƽʃ^͓@WoQ3/7/΃O\{q*WI@IVjk(ii9 ^vgF+GXuAPW3 5ڭ e2Y^jBljt@vFG/@oV_cG!dn`ap<c F|xN' SϏ{v,Qi bݮߺ}N)+糴Ijz|#ܜ7aIR'. JAtC%YH nKܴm4Q6Q~W1͘C%KtIϪ[c׫! f m,2`9kl-v C$z/ W5qI"1Vpkfh?^ZtBOx> >'?}2Js }cH`D;֖H+ebuo\;'έݺ`8%4n?a`R pqoZri95[GT贗8B_znO`^OCO棫~>Upeqt7նQ;Ɇ"P]_u3^q6p\+JmMX?3:[L]6WQrg3Fͬ/Boam RoЂ3l4E׉6PxN 81mɴ'o%jN[lͥ ҆Shҽ@19> stream xX T׶Pz1U<5 QqV4I" 274 t25myD1ė6QDc1mӬ YxW:sgPFC(@ sڴi\hh&Ѽ-rM+㷩Q+v'dB4ĉ!cyM qx8D.+xsg^l*Gl) EFTnaW* Y2kVddgPXo H?O$gq3BwQk;qPHGb$# (vUx]%kJׅGDzʼN{}\u۸)`s`Y̝7"IKYl3)jBM\%jFM6RӨM%PR[([jeGͤܩ)kj55ZCͦRsu=5rS (Gj!D9Shj eJQ,52)!ESoSSCaRj$2H^(#*z,$("1pш3J0ziO^(WI Uqa]' 1uD9dIϨ^vbkLǚ7vجwMWNfߌos?lYٗS#?4i'MHY-hgH$@G0&TH6071,q`؟K?S`9w"ater3݉7UհI-,SO#⎢RoΞJ,6q~Fr@({=ߍ^7uEK%xhؾ+*!}hv}{纻ziQ~ ڃpx,` Fwڷc"S 0^z\oTjw; 1lK<~?߿L9۰vN_=}k>ҎﻮF@8y^V%7bݴUnxdlWRs0KJsy?|% 1vׅ ũ4*Gj-kzrT+'ri <-G'b0k9!-0|GD ٣ @/T*" !L0csvS04M*q5TL9h,JTeL$0L<|k kkxS4+mvFwV8xõkj_⤻?D/Zfk$^ 8 f/JHw̗f I[PmwEԒ\ңW_imy=jnjp-@䢌.k߁<ԕWԶ{o[уPwT}T+ b/I)VAJR էoA&ٷ }5{sW_dy⼮2Pcڇdi]"IyՋVysJOIwc&fzφ/#Ҵ" bȍ")h~/N|ւpB0WJ,I*D%ǧq+w!sځI&m*pܓs$j3 teJjELmUYթh^ [,&Opy^uwBU>plWd⌢c>gE""z @#߫JJH(70+xuf(78WW=6TEqP{Pr"1>^{`:3b>k:6ţZnDx݆~>UǝBbࢹDq+vـ52 B+?^b?)s8) viWA%6iq"$ UWBGaiDQ176PK68Ȑ G׌"[@3YD T,h>"5!`5M᝸OŞC%9^ttƕn)ށ!g䄖o <1H9_֑7} r{\ZbV{.Rh3 F"M9䡒40׾wq_?UQFؾzu3kcy'TuW[ ^glPWo=n;i#ǞCW jEFU~塍1Dm^z:$,(=,1)[N^F 3--ߠ?e`{H /5 IdDRP]x~Twc5-z-:w_A2"]ǹZb= ϊ܊HmWJټeߦpeA"s}*&3D1wqդDe_wvL潏˲Ks(2g:罰˒em5aaC+hYЫn6ZJD%a'%ÌT}x!6_u9|ܫi}M"3 |p#I>[%XĻ&F;܀3 6oݲ"PM$3!:w–x@= /pZnemiSURnJ6Wzabreii(\{/\2 15C~Du8˰ X_On4o LGLMtUXDdlLI_{Vne3t UgZ}f7e {u7MXvAZXu u~ 56 2QnHd !5.\^SYWY_[{U{7\ytٳGUxYUMEEU!;vBy쪹~si}s;qnggvܮInuFZ^X0(U25.=CKJ'5EI)p' 80>ǧXmG5Bxɖ$G-x[ֆZQcW;98/LEy||̒Eȋ xhǎD;%$'#yDe\Wf|AoMn,*I_~0=CO[a X<+-Ӣ0> stream xcd`ab`dd v 5070qH3aQ#UA6*eB``fdS5t-(-I-ROI-SMCL,3sK2;oglҏHrNo~}W&.k8pY۪T$U$T'VVurTά3sV-X`Ղ&CFf͚:WNcoZ0ujn93g]Z0rĹ mmֹs'-нcn¢*朲천2/9fjM7GE]mec_cOÞ:I?f}띹w\{帘p20*V-endstream endobj 85 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2076 >> stream xTiPSi}!{ڈ 7ŒqP\ڕqGD@H!M "KM@ !(efqm)[-a1T͟Խw=#\](Hz̡/xc1+anKOئڟ bp=|o<ꅚ(D Ub:.&V#5U0]:k@\%SJW4rL#$HCUQqrMtʧM3RRRdd?:fҔ8Mt"6~|zH bݽU cЙ]P#Iu;Oo>p\D䡑p6s/[PpGo#A?'0sԫjҒ9ݎ?n3{;m}->EeeyUJW\,p 8}vXJ;joj/kZ,~7-еE_X nN( m*/18LO۵-/1:S[,ާǙ, m%_9tbH})ֺ,:x &= kD),+~+w#qn}o(q[X^pW,aԯ-yYJG$g/"~T4f/2^OC=/)?0@!a+D5hZ'555Δ;NSgu:Tbv<76X L$U 8&b::I_߽u | (2 uͤg((1xp%N ']& XQxm8 O;STh1F͒]vDV3i2qMIO, ĸ%*JemV[kㆣz|?w}IG{-jA!e;9w5Kw1ǢG^^ls4;Sc/,ǒdMuȑ z4 42B; V_?.Py87#E,tCXH̽᫶(rFh3_ zHcnk@*Q_!endstream endobj 86 0 obj << /Filter /FlateDecode /Length 51121 >> stream x]8wߣ%R4|8ގ8#@c_EתҒ(Haϟ?߿_wy>}_ ~○|oۿmݿ_'3;~v]wOdwO'rx^?޿ײK|T}8 osfȰŇDɭo>uFc@iy7ǟl&x".z'g{v,mLˡu"׍HYrxϗy0G :gi;/~xMt͜N7€__ ΍s[6}n[=;Fzx8)D sU?\{w[ZNdbv';z~o9l \6F9jٸl\8#g|_,w"O<Ӹg Fi/,}P1trgl2ӿ_]_;^{j8 _\\Ey)}:pf{=s:K͇yo|um3 9<>p^u^׿Iq쯟_lˆY'2b\oř%#g⯹0; ^gEbv.<>*~eFy1/xJv[{Yχn.s7Á{S> 1m;َ}_'X~h8 緤tĉDzDFA^LԐn9,9ܵgBx҉t,,Juǿ3͵\",u]""QZ}iJ ^ğB˫~y=׺'8A kfW|R^W൷sVc<|aXl}oTP;MQS*~1y&\pwrqÇ,#?ngp]$9?&BʉDvEDS1N=4wZH$~9?'K Uش3^.'{ H1DQGR6$l~֔uvM(rh2.ןeNID=YJܩe`"/zX: '=xK1QmۯH온9nr;to1goJy{~IkϜ5;DpN jy&~ 4DsȶkAnYS>8ж%厅(+r?wڟ++OV1糄lE=v/P#|hu+{xDŽ|""= i&VE,8t_y5<=ە鑰B 3~|։d'\ݚ:\$k16=@q-gD#IþӲ1fl7Oaue{2ߢW,:nKOlQ[o[.IωXTnkղ2|\oNY~q?yvL,0ڤpPx|an_,m|RQ%۸ۅ7֕oy+,A ksn ;g50Pݺ|kejeabʆ jɉt^mzߡB {lzr%bCOsHbZL]DqOmDϤ?Н/}oեrKU]h)>zf m;;)=[VI:84]Ʋu7J[ ?fmv=h's{#`?1"̓_,.Rp#;?\/kΎX r6r@]_^1{w. {Ǚ9d gxYa@h6^A~<_2+Ԁ>Odc2ٍ)Gif4eu6sMc,~oI]~q37b07rӅ)`"}-"+z_ƃM,oyj%pXh=NlkZ;P/skK@i-'9m-\"3 0TjDzV:ȝŎ̓9%2e +ayK^=[a܌EӀC +ggs~Ȫ0`դެ/kV jUEվkCn-¦Wv+X{ll -Fնv^ۣJ_ lcg=O^3w#a\Ħz#ňɽv>j߬}]q@ޅɖ'-7b^rǫ{jE{Kv3߹9\:wE#{ K69ĮbhY=U[kM+kvnQ6#wHܹq|g̞MM e3cN_3W`=$T%:p,:=uѕ|}jl ~"lY8j\[==t8l+lvFTM.L?yƕ2m~J6uyr$^+;ҟ'û?FŖ ,w ۷;{W,yhda^ГŒ8Dԧql w@1DRDҳ,|bmKPi7;'}JA4; oai`[/Ű. . &(<¿- K~S"-s*"vG0*/Dl n_&HJuGB^ͤ7l'eԣW?_|, 3 !bR`ȸlʝX [. +L`<=ſ@fQ2*H{j>9"eڰ[/;+?D+GT\_CѯR.*Aǀm[ٯ֭ LGbWt&~ IM y<UrcђW f0ٯ!۽HJ ݜd7(՚QjpK_c[_ei_ػa?l/5~/bm_~9~aL_\_wnkaYyBGƮ%ٯS8O {Xu~64 ծ!d) /DP -R2BdD"'Nr~L%I  kN__% )IS^ .-D.Mᯛ2^"aC~݄H_@( 9 ~!`S_dg$L_xֻ+u*}^ ;v /D u_k~!u iT B*v/˘^Y_ enRv. n?en ~!Bö/~+d,ЄBS_Q+I~E ]1W;I}ŕ_W|¾&Wɢx L/>W!G@_e}@cU/g8{!~ wP/B}]P_!89/bB}qꋳP_1*" }qjM'Ɣ :.}q9K@_\%7 e/}q+`_he/B}1;P_L2b""ԗ*}1)@_LbT3+} /&qB}y'SA- ŌR/f}13٫P_pb,墾K ՂI)P_Lۋbf/X!*B/VB}P_jb##X@ "K/b~Rd?GŪQ/VB}`_bb+aX1 E`_bm.wX E@/  (GEB/B}QP_P"EEG/>B}QP_Uu*e EK/WĄb&U5 EuN/'u@ E=Q/jB}QҥP_7*eR( EU/JB}j+](E}X/j}Qf諽S7?Sb _eW0EqA(Em]/ߋr}^/J|Q-t@ Aؼ A拍aL aؔ拍a?|C$H|$Q|c%Z|y㫈/ƄbL/bMx/o |½Z{ {!^{^xݑލ½s+F%Y]^"vE^^Xi" 4g,a^6.l^xBFQ^1셈UI{!lQUhQJ{!{ãPJ]a/[8^6զ+셏H {52{VWa/,~gfy "\j^- )H۩&Pڊz_jIȆ@9*ԫ%gW$%z!q^Do^H- 2U"V'| ^H J [B^W~z!І^KQ=Brܜ"@,$T ɬ^Iz!2I/DZW y\Jz!Oh[x J (ꅈIzE^_"h;U&< ꅪ`D0G8^qLwý(,[K u۾c^͛zEUY/^E?MMH/jg(:xJz!b\cמONd^X%i0jKBo$1/~@`^'~MJ BR^\]Q/rX^eY5Y/(!xZb _^X8JÂB رNI{5o rN^P|h nŽ7BV+ ?9=yޤX› vis#Ws [h/D4,_m{AsMy/DWy欐^w^, {!b9fFĎuzA1Y/D\d3b?ɧSY/DpCB)`^V L{5{!b'%\^e2RJ"^T^؉zI{E߶hƭlI{!`'զ,ҕj|Qґ_%e*bsk%1bWu_- g]_]6 |Qb_ jIEGK i )|%P( E)UpD{Q܋^v+b" Bs^\-%m({ A^υ.{Q܋Z~^bK@x/ž^=D^d؋M(؋p؋MظثŞ̄L)؋M"u\~g 9UKn}#ORڛ5lUgUHϳDl}r/ڦKPxW[Fo7pOħ 3}{E\o`ƃ<U~wdϣ}\><ѓLJ|;Q]W)8##||v}wt;fbX[/>*uY:wO?vn"#"R߇"ct E:"2?Fw"nT$#"ct1۾OZPGD#$ +uDd|?Fw};RD"n3uDxuo7+uܷmK"Ǔ?^w^4숈 ;B}< DeyѼwަu/(MH;">^wr^xG??^w.qx!bX_dwH>Vw\juLuâz)Uzl)ͦ;wo q>hŸZaVcu^ ^w\H>VwE ݂nma w\۶|&]~>'i]_kCbkt\ZF`b}rpGD݂txjw4kT#"n-??ǵ&+q-Ox\α*qMWƊDж|5p0ɿ|%"~mNq/95/.yɎjΉk &hnA$3Ɍ'I<.Gx\UW'#"vP[lVnd!w\'W#e x\PSx~nQӇw\;.Ew\FpGDnvX㺟?NA}V$/;"r}xNhmC}t%yG>Vw!?Vw#\ wDXݭu9Vx^⎈X咸|([́ w\Ww\C+n1?](ȭB"搗CGu+xHfwH12njd_"A=/N1xb)1Ba5 {[QcܮwG>|p'>r, &#Ǥ>l|_G!>-o||+#j AG >r3>YLGx=rV3p\{,#'i9 ^G.ٔ\X|#࣯O=r ˜p ŲG=r`\{^ܣ'=z #hdDG&,=2쑉`L {dT#+ =<%@^e BLGk=Sq"H쑵`/{d *#TծPzd,#+kY} ]GV=j`T { E>2!# )pHDG %>RL𑂋d|n##)HHGH>RjrTT|tQKG^=Rڙ|'t=RjT|j(#E> HRG>)#P) HIUGʮ=R򭀏x| \#b& HYGn-#mA)6yJ>RF/JT}`/#E ހClCVlgȖl։llVlȖPя ΒЏ> Џb NЏȆl Ⱦޚ;ʌg$ >wx1C} ûP Wlg^ ]HD&&Lr<,{) n+1Ca\jxgSnd̾E@"H?~w<;Dc6D}l -Op J.E 7@"vACaE30 L!ҕb?4-[HA`$WZMs` y>vwHg4"Hd""VyC7OCN?vwm@ZDB>vwa;@2 L>vwH/H.DD?vw~!C+~Ygl R_h!~D"W$HD*va;T!k(RHSJ$"ny^|cD?nw(۝c] HTl7N3E@.O:Dݡ|4$ (1Dݡ0C}P$ g#{Z(wD|JA" s@P2;CH>E@B;6&H- D$ KE@r+iPq.t BRW#cvEiLcR;Pv@\⏈Y ϝ$%|i45 GDҏնXښ#9snNBY#$qC8A\;DrqCd|C>>B;DӝIts}y>Nw;ht?ZV3Kq)uCx-ߛ.#" 3v,x!hя"]0˼AӠGjZ{} ]s?f$G|2cF# ?f$ ?f$ ?M1E]>-1nz`}Wc5_Da YG>r^s^$#)9 NGN?rS~-= ?r \,~DG_q}=->rK\})#PA ȥXG.>rI/q#scP- |CG&(=2yp̅{d#*t i`{NGB=z(#H=摹`W{dN+#^ Y63ixqԅ{d6/ܣ=$ep+G=DUpt{ZHGK=*Ufe&ca,"e}jrVfnRܣ=5`k{d+#cc[ha{d-.#uUPTzzPԣ =R*PT2tк!c-ꑢIaU{ߢ)HGG&plVplȖpŁw8l]"s;#~!?.w\w8-Q"j~!r}\PZ"_\ Ed5ѯd9rqCܽ7q{7(R "_׷=Lnz(HܽHMGݷ~!/rHܽţCď+/p#>Wa{_|_owê""ɯ?N%q{7%;Q_\;t^۝&I tq{ R"%q{ !'fB8A+ܕz_VZ_/q>>w:^׋Su>>wMD%N{owP, Tf%/D{J {_8GBļz/ϲ z/)뽦> BzfW{yQ{5[z/O.[}!V!K`+l&_ *(NY #b"گąpmySOݼoiko/嚑~~6V53!)OWko }㗐_{ۢW^[ɯ^+pQb}vk+^KЯ*kJk/&`|v~mI>^w{nܒnCqxTT_{z\"_RkO?)מ^KE~a!6Y"m [" 9 }svJQb_J}~E}mfIE}A.@_}F I}mK\"^Uľv2}!ts4/ڥ巸M, cs}wa_ba_<]) }]r_TCĎIk&vTJ/DŪ5S"cs}!bPr_|\6¾y>.wU}ᾀ4mžAb_3愗"}!2>6w"D͵AS"֕I qC˝qHB_Q+& /+b_q [Wv!^|B{ !ǐ^g{PڋUp/h8Ch/;B{ڋ^|O,w8'yCh/-B{qڋsT^L'gC8c IUp/N{qrkvy|܋ b!ŅIx/.^{qދ_\( Tx/{qE½5_`/B{1wڋ^9^Lcb#ӡb1ŌJX/f]zybVS7A<ҋ ^b)sM!v0Vwļo[{B.:>ЌM1/n~tB},"x!r}弐]yX;Db^'rvQΪRI8MP3)-H;qC% 弶m\UaB8^P("&$eq^K LyYz v~׽z!bWgDa?Vw;Zݡ`y!`y7:09/(z!r$qC} LċWh;(6&qN|RݙBA&YPvB}6x) cvi*fwNu}zZDk{+cvȣfw^5C!r݊{AY;Dϩ;V"n, ?fw8S7=̽cv!rkhE|!0BmR|!2>vw`B/ $6K"* Ca!_PusKk8A?~w&OEYĉ _A1D j|V-lͫ_"wg"wg%$$2RI+#I|U$;$_3|*+h_|c)+]_xPW8`R/8 _|k&DA 7Z/|qf'!8)H/NSB|q*g;8! IS/N|q_ąD/a`EE/.(sFAW S/~1\A dY/& IP4L b.{AX2A/~žbXŲE/V6~_^C 2/Vb}՚P\H88zEե_@b*+YX _~sAX *_/*~Q-B_.! oȰ"E!/j-~߂(EYGS\!(! EI/JQQl%1\=+_~Qr_zNg>mrQ/])eN5\ r_T*Ya( EW/~Q)j_T(-ka(n E\/~QHb_f/u¿( _A([ B !;Ey/C/vņ_lƊ_l_lF_ņ?޽:[Υ_gf=;I"HZ~ {PgWD?' Uޭl$s>2sПr4|w#߫TO#Ur=3Ry,uÔ߾R. VC{@˶]Ov>CfǷ+Yk.ʸ_fvCub6YēSEl ;X[۵4e%[3"x%iMǎ;8w[f=L;=K(E1E!n.# R󝃽R&[dНgWcQV"tNx߱E"F9.wt^bl#ͱսIObea+Qde;C*嬛'E #e1q)nәwRf^R-bt^q/~'BwCleMl1mpڵ<߹u03t]3m/7NcyIrGE؊,v\D?E̵,6ow$FH- ;ȵYgbu"oyMo(=1!Dp.ڈO֮xQ \F]iɯMqf6bfrwyr59>c\.4zzD7O;R;M"z:afEnri>a YD8{ǣaf"6PbWJo/IEns3m]GdW|]1{_s] [b,(;"/@7@D{],z/#k4,+F6>I{n|tՕ+Su'Tpz?d.?._2iX ɉy3|j҉uYrxG߃<Z$N63Zwud26׊4<6{W@f {Iew@ f)C4x<=fL_3#a :nGe1pvH#IaDXʖhvP7&"sRŴYX$D&85C=-b xʎ͐R;?[pA\km;{x/Oxr\{૏'"vC& 版i:7F׽ޑڱ_s[xoF, -s1H0o7~w|ǡv/_Y߸s&eZ.m܏bT}F@t"k="F>o<._6Xğr<"o񰇠#0HS,bg*4//)[=ޘT O3}Z,6S^>gWı.-wnL?n^ʇWh#|V I-Cd\4vR"V ف}Ɵa=ȡM}=F }lS"󺢵z^k̩(Wl>})&YcTUPLgIƘyd8ЈbfYS,v:39gjb \枹n21;W1vS5fu92˿ϒBe 6w\sMj| C.DY`~Vk;r銎 \q$Pf8˓hzf 87Y ܚ,,ZOp.IA_I Ǽ}s3DWdcZf}8Bu"oΰ&Z!D_ R8ş.@1Ї 0ىDSdDNi4o8ljÎS&VAOt0ϭ4o @?s}b`3?8(Swvd6pKG Xv"?"u|!<NjehG4I-̙r̙Ya^Og΂TLľF53?]iEĮwߓ۳Sġ38,Xx)..-SF7eqt r苣MKP=iY9C_6?'"v=bP|e\6K]7G Gn kWߓ O~ȬBş+qhG 7 s%xEϛgyE^8_>aJG)hx[i4u]ܙ(?yghTsF=oG=lgWk7;_H;w9>Z=Ɗ-"VČ;f86P|KDn9afʍl"}A;Rfۙ+2J?tu 1cؗX+wSPț!@ͦ;GÏF~6|cΟiSOᒇWO1fL!Z;qQ]7lq1~Fz|ۦٲuɕ_O+zFip~J2Nїe[{hl^]@~dۉr\)>+V.Xy:\_$t ր=ng"vg}nZa v[GoDlDc[`Q<@>7 weo4Xq{f˨OMZfhީl+*hTnoJ;CS~Lz}%MJd+%SzhxZSmni+<؎kmV2O~ [)wJe̘}|ۦp7;%jX:ߘ#ϰFiL0*p鑇-,?&؜=f뉄$6"3$vO\r2AAf"0u_=/yYlތ#’w=#+Fܚgx6L<(No*.W53 X{ZDaefm|],`7)$MʞE͸ְW*!0vYM%yl-8f`vo>1}n;"d3ͅ‡et~@#M3n c^j>ɬhK>1l3j?#SYjFW6^=g%ۜVn9,|* HƧ{8[d|z{l-Y 0ރ e$֐}b'MB=qڒEL.yvc.-xnO.{aw d+UM ZyF>4rY8Tz򶈥AI[wGpb0wό"Ed?əE")/j#tkݿFX~#%2-RZ_EddX޹6JbD7;+k,q9S@GcEMc|:WrF'%J ==WT&&w 17dRIInr(x='vRw ŷ=<<q\գoRc¼P;GZcF= TmRs],ϫK6Q3#pjp8fekH)+E~}wD!N{ [S{n?SE{ߏ)P8oFlk[J:O] $N$jx]Ёqbh^lZROnw슴Jn\A4ˉB?-"&BAv鹙yIH.hZmoIS9OdQވXKǓ] o@`.Vs1л e^0X(Z{Ė'{v^lˆH'fi؞l#HF*dn,by7d0alTuQ{뽻γ^ag>;Xuۈ{EdpϳqJ <yiukGE<]]pϳyuK,ЦǏy-<؎8"?yŽ7 -be]O}wDZ&}EM\=,GmtUgc?D3g?}Cg#B723].6x6K iO p8IlGM7,bfWӁ돟"[y N\~|y`Sy5>i6O+2ϳȽOyYBx<~ yhy^7;-"qy^ؿ" "Rc+>?ܩy/?,bԛCeq.3;'3}̀-gidlObG/$0n䧹}^lfy#-!=q%%8[{^$8ph8.9:7 |ϗkauihYux^fVul7, :N[5, ,rZBc:N0*Nv&NrD),r ;#CkϏPYES3}_$u/?":F7㥿.Fbngy˂QKaq>QUaqq*w`DW#PPOua;z::4p;ࣺsQqݛpgk0bnuOb]Y83\3i&};y$`㌣_ec꽒t_,>Dm#beS˞Ph7y';y>\fgn:[ ֜[uP2On"Xuc2UгHc~cZ蝈-q@g}|Y-i׻׭egGL^Աu?,NdM;z;,,,bNXKXuAc!b"y qgг9^G_`bg;z'`^FegL , =Xz'ry;%,,뀰lYv#z^GڈO/w"ץ ,2YwfLz6l8Yr =X6Hf =X%zN SxzVٱw{V&z agg&z-agLi^&z=WH&zQ(^E#eDhW0ҫ?Fzy}i_!k^ފ4FzyG:w=ɔ^<ҋ'\^z1 #b4M9G\yŨ,3e (3xKM/ޤrӋu,+x_J/ҋbn(+?J/昲ҋybq8^xebYYVz1^LetYD^Vz1ٗ^,]FYRVz^,PeXYBWVz\ I/tҋb-+XJ/Vҋ>2Ӌ<"(3HGM/RӋ");HN/2Yۓ=*;N/2Ӌd"+CH P/2ԋܲ ",C=YlE[~z ^$9uE]~z^X^T eDEQvzQ^T-eMESvzQ ^Qe:+7(M/J:QT)o֓-nzQa^Tj鱘-3wL/j2Ӌ.7M/jrӋ:/7M/4 ]B{H?=eFQvz!^%eJRvz˔^h7eNTvz!^HIerS$vzZr B+CP/42  (Օ^ye_*Xz^e dHYz!d 9^ek8[vz!^eBpV\vz'^HetP.7M/] BHO7M/ ɾBO;PN/eӋ.CE# YQ~z(?hz^4FO/' cMSvz);h^O/FӋSEU~z*?膥^4R=rԋ[YEg,{WzƘDJK=HXY9LZYbg/0&ҴW.:꟰ԋyv( `_",|g ԳȜgz6Qߛx-sضeg3 VT"HT"VHT'%z⩗oz 9MO=~LO= d1GԳe-K=R"mzXMqԳtԳ%fpԳMBg C= ?IC= 5 ;Z^ӵg8gEgQ nP9Y.b.K=`g(B3mKYL`ȟ愥gT[,,Kz1G\mE-z{Xez&NqԳN:enz~],,bktؓyzE(K=}HK=],,c5,,b pXYfs/eg jbI-zVC76թzQᖏ^TerE5]FzQq^T{9鱸/#H/42 !BjjDb!nSՐQK壌rn:酀NzXH/7MB7L #H/2 qB*#H/,pGB+#I/tr B+'I/dr )B.,'PI/TDz eR /J/N%7L-'II/r Ȗ^enQ-PG/ 9}B.G/ ѻ|DH=jez_6zҗ^(iG\P.z2H*^tG/ 2ҋ&G9Fz*)#FH/Z.em9#2ҋN%Fz&R#x+TGʆIV}G;plYv8fe8͜ᙀAa8"vtBZ. eĭlV6!ve iW6^?8[w~]"Xveؒve× +CĠ܆rd[mF_I?DYDG0 gO2;X%o;$ne-2IhĿiM#/pE~ī ;& -"PDy'O>1?쬤*C2.O'Īl_*iUc7͑(ib|qU"FJUHvSZ OĪOLjTex 3bWeJ:%+P#P/i?ɦ,ʰƧ,pnQk($ܸl7Ű(G},ʰ;ڨ(%P6Ig,/2;DnAٰ/coN6$d84'C:px챥;"vҝywN9p9va] o}< ~~ĚyZ*k2lN&{5tps&8=^:5=?eMfo2Dӛ iNDd4ddء4'{9CɰQNibG Lm]?bPf; , !‰A"v I=.KA"eϢړe2"ۥAVIӑҠ u IYO|J*aTd]d֗dN1q'{\.s2LMww=.;qjNczrַҝ1P1j" 'dIk2Nkn9=Ә,&1YExS\|ٷ+WeKl6-t(Wx`Jl˕,Fq)Y 2%,OICd!VJռl(N{:.d! YBr!fAEClr(J Yt.ʄ,eB2!.IE'LȢR&dѐIٔ Yuʅ,z?BJT.dg*EU-UeC=!c۫\Ȣ1V.d<+2ʄ,Zpe96?nr!b^ƙ`#b{rG~Ϭ aB6| /dŅ,r!,҄WM[L04!QЅ `&dc!rjB6-2 KXty 2Y<SoA?}]^Ӥ t+j҄ sJ2s0w+iӄ֎GLȆoW2DX% ֈ L|4!R>9?A/+ɇ~7|ӄ .dviBSslzޜ\iB6xf ?!V\̲d "v7҅,ܗH!vTЛ-?\21!C8R>("'IHʄ oMiBf<2"~ąlǁ1+2lO1˄9ey ă [Ӄ̒զ&dFO5!Ӥԃ ӜdXdO-2D[MȐ&dCʄ &dا m mU2h~Y^}[W= g 2#R#&iBH^rϯ{iMdOY2) ~px *2Dܧ,Ć"˂ ʆYm6ٸ9 $S҃l9iAŖ<Ƅ#d28µ< )dz Ydܸ C:TdتdlZM2hV? |q F5pdZF$.'D{ {= { ̱=ξqU.ZcVG)@Kw \0 )nC>xwGǠUέc^.uC$2e^d07 1D ( >f>>fm&cPdm^=,G} } }}6/u3xm"PEV!bDE!ڏ:ctrȇӹ/5=cdN(-% EioYU>J<8{]W/un1lgPV$cZw2Ĝ{ ȡ D'_豸b=(XܧbŽ,ow{,Z{,~Ǣ{,QǢ{,cǢ{,uǢ{,^bSxNJ=a]|=|Ǣ[(XlKǢw{bEOV1vvEcg},բE[蟋>}xmg|b((X Ec1}tHU1؊;#_qbt,XAc;qc1u,EJPԱH:yEQ" u,ŽES18E,c)%v,ĎEU1fdE-cu,rE~XԱ!:yfQ"-XEIu,RŽ1{̯9xQ"OOXEtcQu,ʆEiQԱ(?j?(Q eLQǢ)XCbT( :hfqV(XdEAYԱ(::v .nQXt,䂎E%-vAǢ /X¾cQu,1  %cV$u, i=:F]бM :JBǨu;6Rrc!t,Ġ^TбД :SAB*XW cjGPʊ9jZ1Bq+Xr}w qc!t,D‚Xб :8((Z&t,tM]P,X ct,؂^[бt :oAB.XDŽ\бP :*5c!ct,^бP :# :|QǨt,$4@Abc1Pбp(XIt,- :ƩbG1bc1Ri)X$t,&l ::S/昹7# CwO"mI"gȱOK"61Z1K0ǰRfK-Z{/9M%/ar \'r Pf>rlKScsl[s96}*a!b -9oknoX91_@uw0Ǧܲ6v:BcْB!cPq 9fz1Ͷ7cuA{&lvMzKcОTM 8zܭ& tGc1[Fِf s'p ph3.F|B͍@!`9 .o<'q ’8f! d\c,"I<2}rq"Ё]n:?2Lc n52%csl 10_S2 *c3L21ׂA?h[̴ⶐc&7C\x`wpI 훧-cX:b$َ1O[ي N2%rvHbZ9e'& M1D! `E<,0%k$aqߒ8f\7ǰ}xU9 p kd*1"5$ V&lcFc0qicŞEzSN *Lyt3&9̻ S1Lگ|,uZp`(&!g0н٘@ۣ>/1ؘ/1=z|#1,Sf fu<1,npP_c96|Map&&tltr5l a 4s %s ˢvMNc`%1/1r?uJzXd[c^1ʬa X q1Lp~1o~2l@( c3jqxx#̱Tcc>cN3i7cXBfcbjjXcBdžmJ+̱hJ'fVW"TŸ1V[nH$slPK,)96(I&slfC.clKcH<9ai9zB!3Ȋdža89d2ƾlKyca"Da&r )r +1D ]ȱck"0jΑD!bKrd9f\ ˱D!b>D z q; pm@cl'c[ۛ&8v+1m p p> s_YA|Ay 1>8Fc8ƞc8Nc8ݦر oA o olCxcT7ƁGxc78 nà8To8 oeq.q31 y."1+cJ#1=cjT1fOcv%1f`cV1&rc'1&c(1O+7SpcN7 Vxcr7DXxcL7|Zxc̹7ƴ\xcL݋7^c8*Ac^HpXp5XpX p%Xf qX q%O"IG!P!RYAbAy,1Bc-1Bc/1Bs9@cT 8FUAcT 8FqBc08FCcB8FDcT8暋ǨpʍǨpQ"e$QjQU-Q1Q=6Q:!Q?!QC!(1D)1ʘ)1ʡBd*1ʪ*1ʳ+1ʼ\1ł,1΂0- -1+p2zǨ pj|( p5Qg7qxc>'*7 qCxc'N7qFc'r8qBc38ƹ'q~Jc8Sad8&1ι prܝ𾜯3Cȩ1Df1DveM_(1DFWXt4c)l R"-٧662,rRXc=l TC` ľ9C7k!b( _*b9$ac )"6~0|Le y`cr)ؘ?Cacw{ژ?i 1:LƆc7 I`c,*klÀΦW>UXc5fKQc>$j|bJfǩ1$7^}fһ Ģ2Lq8347"1$_@JX$hCghN<ۖ-S1c%f $Xd3ʩ+$dꡘ1dc f +f ꩔PƆ0ص+f縉1)f %f,ŒY6<3f4Ōd+O?C=]lrPCIsuŌ!r:Ám)f #[AbƐ;wksC1m$t ߮Z8cQXgS9c<ކ,+,(䌡NΘM<")sw9'1cV_C`C~\3R0T^b ]1cޕ3a3tYŤ1/v kB܅2>24 Gee AR1D/.Y2NQP1)c 11cUT$M.fS1cfN*ɩ1pAcйFƘYOe 2A2L5)ca ^1D0e je,iA_C /g3,\8c]1DZW؈L79cX Gp8=LΘ y]0cPLA+̘YŌ!1ދ36|{C!@cHƠ("ȅ41͒46|ٿL+^J(Em46'(","P@cf\ C 46lf `a1|Yb,3X 3Če$1cIG3ČUd3LX\EbB3f7cq 2w cq 2 c 27!c|16"[ Mclc-tf/1#1bB[(1,1NA(c72ƮE(c~26blR؍ɞ.2P(c22nU(cz3Y0c…3n^8c 3B8cR4aGHc4KHc4cL}Θ8+1Ų*kqH/G}13X*31 11'1Θ^cv&1O2O(c2\Q0c'3ƜS8c f`Ƙ f `Ƙ$ f \[xMLNj2ƌ](c2_(c,2B(c*|,D2bE^ePX f`X\ff&XXPgkSV0fKJ@U`X flseV}xYK7_W1Vʂc-1Vc.1V1Y5Z⌹P1J W!1*wHGi ,X,-̘'E"X[&l 5#XR\1Bp$1KsI(cP d"[.&1ˊ1悚 ƨ b,lbҝ ( b ( bJ \l˜ˑbpRb4ťAScF0( _"( `bƨ a%aQ5Q|jQnQ s!.12/1/1Na 0ƙqAc('-0Ɖ գc 'Q0,T~MK.֔\liBR4}!w1}![xXg gA6$L"N2}!b I'u>,X]iBhwZSB񅈵t|!kBx {!bn؈4{,RN"^W "v>Nzry1aVᄑG 6^we" ӭNiqweljq[p31jf62 mwjϖ'kk-n/l[w 9/"5d 1%.\pKܻ^ELS녭ɍg^69y 0^"x$Mr5oRV/v#݈z^ V95=IČISd-^/lnkz *^S%kz*^/D f&^sX_V9\-6i?Zk-6rsI"ߣkkza15=U"V:ݡWi̒5Ob셈i"*^W^ 5]iB-u{MJfYT5Kvi.^>Đ tES^Yq{M"@)^U9^uEyqSϟ ~5^&y1 _/@pWYO' _&iB>/Dl4|M/Mm靆/DlC4|2|!bUL Dȡ~/|4~)"K^ kz=#~/D{k( K^IEv{e$g> W~qڽ2v8{ Ynn/2{/ًV^|bbۑ(f/Y1{]ًm_^|?wH^|wQ^|_wZ^|žA^?>F^ž^O^ŞS _\X _3֔k溓zrmJvWr} {qX{qx01|qB1|q,GT1|qGfq|q.r|1q|1 q|1%|1|1E*˗'Qb%/abV/sb'/b(/fbb*/fbb&+/fbbB,/&eb^-/O\_L__ZA_'%8(1|1|D(1|11|d wMڻE|q~XAUXժXъUXճ8XaU8Xռ8X㋪XX@"X(dbX(5q|-{Qtu{Q{Qe"1|$~/M U~/jV%~/J_<&~/g&~/pV'~/yrO^TEP^TER^)E!S^;EAT^MEaU^_ؽ(݋2ؽ(݋jؽ\P%gq{QEДEy[^e}0er1|QJ/v1|Q/E{1|Q/q||A^>Pv/NBAbdؽ|C^M3+b䋘|~F^yũzqH^댝tI^S[W8A&F/Nыlb\8_'LZQY MjB`^2{GH"viZO^kz/!f/tYVäkyQ*f/DGf/ /5{!bT >Vr˺ݩn/tPrƵ1Z t{!^iZˊk9ɯ^ -"e85ڽA:Sv/wY&~/DНphMf'M],_(Pи/D:+4|!0mVle]-_Wk9\,_R%rxA{+)}iZ <_f7_z/#65}pck%_B/D̰x@q|!7|v|-Dj| c RWdB?:#_N5|N5|BRBLq|:&͚BCzr|͋1S6 =p7bBv{P"%kR1|EaY uZj{)jT5Hj8\tFBB}jB սJ٠j`&  Ft|Mg Bi/LYbN'"օ mٔ/h3ס/D̪PtȮ/@Tn<8TkR:p?t*Ó"Zi2k Z/pe^L_/nf O"gS"T;K\Ȯ/h~J"]-_-̅ԓk:PW,_ +Dɲ|!b`%meB|M7 k[,_V/QZ ⮧k^(˗iK-_C-_ G|!2^r|!1_Vr|X| /_ L˄]_в1s^/D0_y0}!bk+FL_Z4}e$M_yzjHZ*<|5+.3-_q'w\_qG7\_`\_ml_l&bC F[/oeb_1}_21}=U1}}ӗb /bb"/v@bebG&/vvbb(/vb~U<_z彳X؁勝X8勃X8勃X80cX8Cx8L㨸8֊+C8#<9W,*s2}1 S1}131}1+30}1/q}1C8}1A}1cJ}1S}y+/b,X\_LdZpIyپ틹ؾ%ؾXF+ؾXUK#}|ۗWXb Ŀ,IYjk)kO}>kX}y+/Vb,X!Z//ź\L_^L_E@L_EA\_T$EB\_T6B HZ( xbpy(Ԉbxbmqy\e#|QZ'|Qe,YiGKL_Eɬ\_+p3i&X]/ VqEPL_EQ\_$y%v ?ET|_QEU_cEV_uEW_TEY_TE!Z_EA[_Ea\_E]_E^_E__ ř~X8?Q/NabTX8]"/Q']ʼn~qF_+h+*Dڿr*ju?:\CqDjA511${SFdϵۨ:}T].HCujkC~>Å%lN$Qu&<׊`6koE!2lf}y"mT'aX֏2'$:to}}4\ CqĽWUO"MNz;bǦ{j۝-6>#b3>b̶sELi_- I:ˌvb۵<p :bZE[\7B80^X>gacqcE owW gD'pޭY7y V-d|[w;,S ީZĶ:(0t[ ;fMn;m`Ni;U[cdf N&HuE:L]]Rtxnxq4Fr- Fm#B'.X5xm/١qٸݱwiդElQ}vtbӾ>Ch挾# 3`!ak0Cp}#lO9]gwx򇷅/~1P㻋x|Eb b֊h-sؽ_c[Ѫw']n}uIq.č4rhiS-쭱GYü#~X}"H7_&-=> WFtj7_=NW^;^ac3ߊM A|lpNn3%r1CM43"6#f=lgu[^]׊Df 6'ְ5kGܪ!_ۣbCrl"NJ峥[PiW',cD";GzvyU50(Ƥ4M]<H:tlYS[8g͍?dsψpo7!,9_ 5|'V=[wxy[n^WGD|n9DzE1";||v$"V NEf[-\.Dva5꘬/̳atKXJ،-njF ~o`T2|k;<ox`ކ#Rƭ:rMN [~tuXo}t3xks4c\y˽4cSڰztmXXe;F[l%ER}z%{b|xUm3VoM~<]͕݄+;;kBzT_11]w􇘟e›v-Vϖo{޳q%{sϴ=8v>X\NJ|09O8cҀNDz-P݈TQ9QR\=kȕĻ㌛>Rc7kUK|y%).RLK=S1ܐLf`=ةG64HI=);pg<!7373EnΓ@1\q`33L33aյf])-zxC=w5 C~k.Hfd W spl|y_39Xbon08[Du`2Nڪ9J`Z$=kE=7*YZe**' xڪ}Q~+ϯg5\12El5#p]""|/OE:#{h'&k advn Ynen@KX3fAPBx[g{CV1$>31ye$%o0_BT\^ $Mm6UƱJ|cFrw'mc'岒u K1Δ&*h}g}kW-ˬg+^ޣsm`'a YɎͥ;TCssp3S<2qٶ~/\mt#eB[q!ΆxK]TMs=ps`7F]>57o+U/5"C"c FՐ?WKSڣ  xg\|6zH&ݑ8`vo1"Vjq:as*Y`-1#]?Ɋ:|,!;)3h|Fdn(w9BIhGݘqs~ +'h+" `LlSyM?f U s2>rg`]hDYKrf S6yf{AߎU+ twV/ۤlghaa$U˫YfSa1;5]oX[TYXH߫zXc"C9Rrލ3)*0Oxfb&Gkwחc2bEfS^3{7ڑ?>9ղX f9ϑ}/9q6`me쩬t tص-g,MXFN#ze:EN(toc<Ý|(0jHl`H bEB4R{^d#}I,Y=وf9M#@d%硙8$Ӳ?twr˓*Ft 8{X"1jqw`Kg/Lt٢r֔;MoҼY+ϳ<$|tZcJSHf-S$_5s\ڢbpqrrLbbquT- C-`2H=^w吴BGlgUm}g$^=kgmcF(l;7:FSMw[5a[$G"0bepC=^ZxGd{qrU'ƴ}v4ɭ!ۮwz#K9>}O ҏOӑҧ]Z fs6|bvOYvo[2fȽu[g 0E rOŽ0hboo_ek&;0$WN帧ʮkXCcEc^»wgOMuU#Wle^Õ]4qA ih]-P9JBYk6(`{P%]5d~V,!Q=l(rCGcd##ԑqfr/䌽H<}X5E{W-PD5V}ǟڨ\3nޫ|x`ĮBX-k5jɅv o[D^ k쒸(%8}Us{cMLr ^Q\$SzJCxF|dILr =GLu!\9 0#QLQBX*rf}b!Oof1,9Ih9ҎCd vAbz槖q8biN6 ":"5h;vGyfX10:Jc" țE!5}y݄Y #nOΛEK8oPŗfa ΛE;2|'YO!Y Hl "[6e yA-Q8Ho]PowwzYQc^,b4@uwy G[RB'"%8ܑ Y5!upHa:l5jkٱ3y.¼ݑ݉my338o10]p:2mp܎7"A`0.Pp:ySֱ7-<9ow*Ia,s7,Pp:ºuhyMy'`Bc4-~z[7[uYB޺)7m%{S%H֡e ʛ 8;BWP:1Hy$!OʛE%]AziAzXTn ul" H,b G~譛" o턃AzZp,bgޮ᰽H[oQy#v'[cfֱ5иPn9ftw w.pS$n G$VՏ-/ny IwL[ވ [Ϥ=O[<ų+[<» -ZIؐ mn mnѮ mn|=oP-+[vnF-bEPl==Lݢ*[T5wʾn-bEYl7vηnAڍ}xݢ/[ ~ v!n1ڍ#Sb*[ pEvAn1P&ٍCib-[v㠝\7!n-2bErQLH@I,cb"SLHvdYCt)nL 9W!ݘ%-"ErWDH9b"#s"E>ZD7tn-E\@ȱix"UO[dEtc_@ ĈúnQ[-BERHc N!ݢ*[LbbYUH(LY,,jnQQ-B0-[ԮEtVourݢ.[Et\Xۋ}ݢ/[hEtP@7 s )xn!W-$⹅QՒ ǀՔEtcY@L kݢ-E\@\ @5yݢn/[Etn-t$Qi([ht nihuݣn(7n!$-bSLjbN1B)[Bu ᨠn!.-HUPdyŮQ+[[jt 存nT;n!-DXT zbQBs,[jp鲨n!o9%ТLZTRrkQB-[ȶEu in-⢺\TPbtQB.[zwQqTЋ"{QB/[hEuP uBAbn1GT(g: &ńIAbRn1RT)[L-&yƔdS[L%P&si栓"N)n]n;"sdzI.u !ןyu{} WBk]/vy&Ӈb~|[(:r{ouv-+/ՇML߿w~.lo|/U⣽y+*"GurTFcڌ9qZzTF(l+"G#>#rH2g:`+"G+"G!N9*#r|ýe=*#r9rTF(娌Qܡ@afrPF( rTFWm\[}o߿~C; O~ן|'xGLʛ>|io߁tz?g?q޹͛O>/vbx/ڱGQU|1ntGa&"zRW9|ﶔm!Qi娈<.O=x-r\EW8_>zX/ ;yf;gWɆ gv?gG:Gםwꗿ/g|}9=VV|=|mc/_ڝh|z;۝)|ػ/ Ay.Pq}o߯ow>/pwoߣ2>_~X1|5)p>@x8w~ļ_MBl&ۅZo*ڶ?/_ho1BNҟϝuߏǰ35~W]ZI\ɣ9lu73vyono6o>|+z}[{G<'9 خc>4y f|9/4Ww =ΘV߼:7o t?@F?/߿z2?oXeEUاy~w4}|,ozc?ӳ>9_JggY}rFd??]Ooo<֛huˋK cs{J?|~|4}~ImOR?˧-g3??DQinhkOZޝ: 7.(0`M)pޗ$yLS!7nd>ߣYmWcbVsF z~=^Y+pFX ?=]z_:Tv;ÉRS|moO_p}oZ)eI<rx_[뇟y~ ;#;}'Չ: zgXγ,^ȆMzl?*TZ;T;>V)mYLIX3g|pX>癿=C)k816/oO hL~vhÖ_xy׉'5H{ZCa+_'7g&_ǾmٞքU)ui M~O>(Ov=ܟ/3XXz)m|a<yƈ`#}-HWY+޷dkGo_ŷ>ysxgNk?h1t$%?j 7?vcYn s+K%ݿ.oZ/\Zd栩Ϸ&\ki 9(z̯qy XF`AZIөu>wgg~Z[ o϶][?!Cle}=.\[eDn|_DYun>ݎ]q/2* 5UA]y.U~h#B5Gg8Jxߏ]jB /ӻ.h#:$ʅ%=RD= ӫT<߽}&YSnk_ cm?~/͝UЗTT_'џJz?;`kՋ.̓]v?Xo 2f2W׃ahׁ`_UþZ+uR]G$u3;_|Ǻ xcoqұg]5'I}'r/JgHTRٓEB/>>}e>WtdRCsczhOIJ߻J=t(˧OW[t_?}'6>/?Ϩ SП}I~ѿkOԹg]|~6H?d\oa{=FC\:endstream endobj 87 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2057 >> stream xT{8U^fu ^!*H% ]hJO7_3)҅RE)՞fR9s΢yu^ m-B dnIKOJzg.DX}ps'DzڕT!\2m3!~!\ "-IOM˓8:,t$K"MMOI,-)YYޚti\Y6Ga"KHO IMϴsXuA!Z" "%D D$ C&M&)105!e U0UZ —BN;H[- ١K sqPϵ2.'P#9WLA~pwcj1 ';,Ŵ'ySj?O**hS +3|ƒ0~'C`xD"pC"PbF'E< UB.gg /Ym֘ rO[FӨoSNVl<Ծ:ʉ-kz@/YB,q93 Aa0fay3l`¨L/'mVǑʌ ҐipQjtWpTF(750쿽Ԗ޼6ƞ ^0*f] Y`ܮ|!oJ.f'Q4Qj@>y56\mv&zD\w/ퟤ$g !R4j29LsrUWƴ9gœ\*~IZii'8jdZs/aI: ߍU]{.߭kD ZN=D0 љ87Q.Ǧ^yQT/0`lHtD}4Żt'Iz|B:o^4W&x<$[NOҩ5@Ak?0?K4BHeV`Uy6ϡ~̀-X AUlxckHu<_ߴqbw17^E"JfD=*­b|jT  s rGT_]Um:L޽܎ugB+ 3䑖KU6bB=CZG`+ {)9MLɩY1&fNuֱ-ėf=IsoJ s_\b́Y [,_CMGϟ(t.7c=g&ogswg_SDM>>j7K;cp 94RP)^%J ~ v]*D~) ۜ6FXƪ|׀8L´_wGэ(>`nAO^j>ϽyNq9s4=*P:?4lL~"ArgP'9f֖XM5_ѣsw" q+]"޼`*SV#zzz3?Cendstream endobj 88 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1400 >> stream xkLSgϡq4 tc.9.jf%2 D^i˵rwʭ7PDDPT6ܢ,6}Y/iKvO&oy~O/ 0Ǘݴelz!pB(KVٕqԔ )H'OC7r%~x-AaPɫk4yy[7J7IwTziAFVW5TetFQvN*Sg5wn(55OejQV)^#-,If-. u F4TT 9anm {c[ʇń9;S.@#58#XbDqA%Cp AFa BoqZ) xcOQ9`q;Luf F?x# 3pvp -HU;c ^,F29{/#<Fq]ͫÖTIP^7'.svc<.Cq Zs-EG@b4v{}#$"-AZX[~](w"1e5;lJ2 jc ( a`mDj" 8> X?!/vŽ%҃a1`1`P5i/H&"[, =C5@'ᱹlivmn.㒹@/j)`^yc8xw^nY1.B$"_!}\=燯6WRQt9tS()_t1@)z@Kai)d(-JE"lv}{'~ZE(SȻF*sN>D{kPpkz ;}%SudzuNWʶS-+6[ );W}q\jŽ!FUzLx.AK8|G4;]> stream xmYlwwq.CH\ 4h(#eIB's8񑵽]s; $"PB[!}AR_F3of>K8_XtKČq&G{gb>SE7J!Si}3LE)|RL$8^UkWUke%yN|˗?Xx|uR]V*4J&5T7˔?;L\IkK1I!vyqT&vK8fA[܎pp.9 ARBDP4S4]&vG~9/6 м;Q+. MƱ<*FGŇ$_O/=$ea\ ǙLmw-DX.6y(!$]CM[[8R!b&sI_^ M8/W62;;4QKw OC1sLD]+uxű{Ɇ;@C 5=-ہ#L=2xQ z:|ͺ 1j` M: zIif}5T sIr쾱hAAԋV\&h85D˻U~pnwۻ_xb F> Rg[\f@'bAF}z:M V305- ._@=Ds?DXcYX!Sm :&jnTVֵ5#ycVFh9\r$Y1F+S?;vB  cFSVmӕ4 ?O2q>݌C;>[l& sa#hɱ2~:rf`v7y - \ Nd 636XJ2)ِ]NC{ԯ1ŀ @u5TuBt iCƐ ݽ3\`w@ \Vp 0c‷jIqe7A@IG{^a~h"9+oF{#!{zJ7-KvլD  AJpl9=C]ЕgΥ9/##wljoQHl!蜸FmIІVϧ'>U*n 3Pug{ ig9331o endstream endobj 90 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 372 >> stream xcd`ab`dddwu041~H3a!Wu7,lT~c _c7s7˲oW ~/^,Ș_29(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU8UB9)槤悌M(a``` ``b`bddkCd73J?͍] S{/k[Y^u[on?lp4_u?$~(}g^r?6u/tug]9}.n9.|͓xxendstream endobj 91 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 619 >> stream xM_HSq׭GijBaM娬ls3][raۙ˶I9MK{zz@~w"8p9/58nפ5Y,.GQmuil 広T9@ZCZq4<* k Vd'gEAíxѭT!%eԷxeTcc0ŀMN7XIЧxI;B?9/r- iV$(L:~A C(3ЌMU{H1nF%- YXϼJee3MZނUl,w_.np_64g4=Y\n:uYSC]O`-:Ύ0ژe<ӖtY01Tn}cy}ioi_Px!#endstream endobj 92 0 obj << /Filter /FlateDecode /Length 12721 >> stream x}K^qG1;Ca Z()EP}a2Їu둕y2+zp.&{(.eܔR%4r~bn^?ͫGBH?7p8rySz̗o%DC^>jR9rӐC1eui#\jaK+/ k\BA1ʥ$CFV -%_9Հ.$hR6!\ʠѯT_4 R 5_* aNXYP]^b]oAK,DRȆJ8.=ڥ%C/,0%.u|y.ˠXa^)(h>#_R6D#5.9ZM>ԕs"9oėj!& ҇!\J:sdSKTG2ėja\KwJ4 c!9.uowҜF|m= +oy_ͯy޽pXÕU׼^sԎꊖP*| fwOi,4D>0|!KPDT߿@.$J/|樷h{IJnB h=ݾy&UɧcD|/$Hˆ$P;7/^|@)_.j˘EW7_<<PqqmD/(w|#ʠz2HnKI:^?!g_=STQ!͋$-}g- )`)WXq~+1rvǼ}[)H3 tj2kϿ C/^|e +۾wげNyK]dOoGOU:uCbt; 1M4ůݾ6h4D"QyI;Llmz >'HD,-_&}S'20pc-:|@D`@=D[rԏ/Д ?% ?D$ W&Sdk^}/kn$x?hrk ߯Z/} 'P"yw )sѠ) c ԅ&vPٸeD F ! O4R[Q!FOP/gn1LFHHz( arSP_c0DAhi}7QI+4E$M+hH@LX_1y%] 8qՙB^P qzx=JH%"!$t4NjL`X2-!un@)C7s!aLpKHe.!I e -D_1QPڇ U KH[:@ZA u4_tV:* ,:JHtY{"7>9pZiU;gI+դ~8w8OB_LKu/ yvȰC<3xGy:8w4Xغ&VŦJ8AB I_^iJ}v>ќqtZ ,fF'>jUӦm!Nb7꠵t]ԉf4cT։XIEJDwxDw7IDLF@x\F @{Wp`P[UVib[Vrt[uWз[B7nXY ?u cTWyEWļYaE՛9VeE盁VIjEJn-61ZslR]Mt+Mkcn#2/a,$3oc5H{Aբ>wNwBw@]}xiyy5.|woUM3d7% DU'b_YzpnažlTvBX}+o# I = h ASmds sZHĥS& h+# #M֜ (#Mv 7˳k*0Q[`̹d79Rq%:*B:r2ސ$+2IDyw MɅ"$9*r\,I+oaQxOQ%@78.㬫TϾD^y #:Hr]/.#e ҥ3[Eex0L& Gy꘦w{@X;_$sGF:8Ty+E!#䕒N 4Xa^-a~c֙2 ݫ T;(b|Pĝ>>s[g{*d($]q30jlfjYf#X0H}[ݴ(VFsB1*UZZXK̶2u"x[ [/eR4גmcyt<}Pvx&y<8Vrr {۽'c?lhx:/!~#6RcbFͿBX5A[5E0tv`Z'_ p=!IL]!"IW5$3257+wVE7@@IϤغ/̕W)BD^$ۥ]2Ħx /(I2WB5rC !梣sLST-(ߢ >QE5d`7KC@{2s؃̏>PE(aߕ'Mgmf]ҝD;ب|kPN!t?IapsH[ h-'>_B"((Gȷ#1"(D[W9Y:L0MA/HK@M{VϮkGO<-ȟ":u_ɼUǮ4u.ђi?ǧ=%&ċ-{Q"ӋinFβ٤!+e~g>%b?V_S!D/fWإp͌hm> 9;(maR?nr6Z,3N-c=`eՒg3 c(M!އZyGBCTI懆T.Uo "W$T,jlAXY7vHť< N-cWxbWP3ihwO#;QQ%Ue,R%})jP_Rs!2"90&>ErFkʢL3\=iVl@+#g[1"[VSe j#aX "?кP1?& ٍ&?2B '>Um%˳L|ɼпRJD馷DҩؼE~IeN i4۸id],ڴ*5./yL |jRwYsggErX:{-/ q6MA`=5T<{[2ÔQ*wv:*u^:dݕ[2#aE1,  ճo*㺛Zfx!k3=yRq EU9o?>Ox:tTw?:ߧ.3؃K0 aB"Bq;v?:l:R6e).]ӚR5Q_lRߥBh,f= m A^X3k~ˣ(wwTH32]攑 3# e`Ѝ B*EH6Aǡ_΄t]Fx{>&\1g3~F֬-7";3LO~Nm.ےW :K?҇hxMr]~H?&.H2hCI.nT _ ]7dh ep9G6ס$Ǽ32z2,Bq.#M฽ [#(H;ΓG?ŋ My!)sF}(iM&dJq8W\V!WE.51Жq{d*8DZIr'sulpCdJeUQj$$#(U4.߳ʿ³opDL Ҿ0}U/&]3{=)}MR[Rm#9FVkm/ѫ5ۡa3nћPuѡq o8E,^s&zfF8V\g\f ƥy‹eqmY qy$ǖrq(-633m:Fqb~GvH6$&׀h`-)#WW`״i=n05&p K# 'P>5@qӢA9 tj0@%$S9E)FfN5xs Sj kCe=m:҈ԙFJ5u{]oG&lr_zL~X|4.,~wdiV-_VID@+ &?gN͟n^ѠqQ!?]C~!Ʒ_ۗǶd[D|Wܤ Y3O|(&΋  yI˭y[Z/Wy.80=/K-,Ȗ;qD AfKUr(;A8_]?Zr`/Y KH;XZNOX1O ypaGF`#\XV# 9j_ 'C$ʾk!^l ;C(pYԥX|>8abI^ʵb1D+=-PxRx !CpC`q Je3vQCZȡuQ F4 BD c]U 9(!0|cJ6_jwJ6㵹ƺo|/<޸!wEEoÛo$$ EW7_<<Ixn |2(c#Q>/(,¢K#-}g-FRp ;dFAWXq~+ AQ1 ;WJN"+5%kϿ C/^|eFܻRϾ{q7(EDdk h,ݳWow#:=ÇRF~nw`7,9,L>qKZ**yrȟ- ?- )c/_v{zV.E۟ o}GTrecJ?vt~x B%OD!L^8K3 ;h H^Re7#B#+QD  ,,Yr G|;1h87BHR@'("-˅[$.#ܥ@=LN2dkC+#m'D@pĻe\z5#EU_E PyMG #DG~LYFE+҈2=vB8CH1-_.R$o0fOv4ޛd' (!}!GW"Oʐ:ZM2j" ݀c5RRIG:yO_ԏr+c!R $ A,AF2RdSDuъWEպ YڢkTAT\8 "EKX& {1&.OHzy!mRLkR` HKZ KŢ :jiv t֮A@_)+"$/.#duP('2&!AB5>eƢ_Bl_͈28!kXJ a0 NT!o51ҽbD}qqzOb!_yZi5"LWٚP-k}Ӳݓ(e%!kq',Y;qʊK\V~V$3gN~v%5@^K8OjS[$RR"^i9kZ+N5C4΄$L<5UE۠5l^N4-CSW],ed0#)˒Y&m%4fTh8KKZZhRq7AA4_9Fs4GaJs&4cOsJ5ǵ3˹xOC< 6OwnOl*i[nO 'dpj_߯ ȠO5Æٌ ^~$֛xCGKםa; pַ_GF]C\f6e9ʂ "y}񦾄LET3[/O'TKy22e(~ +!q$㑧KӾx( T"ݽ@C+``wnUW4-E+7;5T{J׺1[['=dKy+!uO~+!M)H4Y$~#k $27'(ˆcIϴ&B qv[ B !#IʈbHŁw2"jG5l?9|#\E徭]Nru/z䇐&Fw XMY[ZIB'Q38<čq:`0kQvMr2h 9hSmƅİieˈ撴N{XYi!p:"#9z!D- j.i*N{L,";:P"#1m֌ȺʻVJY!<G$GtDψ\ADX*%nu<)hyY#ulŀܸ 2< L_5SvƠߍSC' #4p2p]C77ָͱGN 4raS' ŜiRC:9ЙL$t16S9f>Hw-`6bzqF/YK: Fuϫ 1EK 8?k}dP.le.ŖbrL{Aբ>O7x nt^7x|]wyb?Wy}軷{T7۰*u9_> stream xVgTY(0t3YFƀ dP4Q$K%#4؀L QDPa3z נ;z}~PS!8w`wh璝^oE| ? R&`*V+&zwt[$,puZxkD* ]|TsD;L+ ?DzK;DA^av0]p@ޯ9Ao * fjrN_?[}@`R%&6-aG #D[˜XJaN$Մ%aE %8WP<rΨpUUUP=fVvCޡ )WG]]=L#MΈQ6~fLg9r%A5v1v~2M&zl.3eRxBo#|,HχcFG'WP,5h2'l'r?~FjGcK-NIݶjz\K m8P*{ͶRr׆Ȍz~Vb&5b,ERwK zG3 bqcwL=o)t޼ŸU54:d& \[8W+SltF@Z&N÷Ntۄ7c>̻aIU/#lT׃m  lX~&lY6]+?չsg Pۘ i4F߼~wePa+xm.YI)a:aQQB_s#lG=$g: `{>BKc;Л=}|}N>Fqr^sS0jfR0f _h/ZZ ^O VR`W>sG>U/owKYE%W2GPG~N;%QZ5IEr0c%eH҆Aqq@oe WP!^@ YgV JICB6)9Qq: 莚 9-Y( F#YUxMJDԡΞ|wH &}ly[6i$W~yRVGEYz^CC ;9v>"{q;/v왬Zf7Pjq1;J2E2c{Tŋ)lP}hTE ˹\ ReHʒm# ,mj{QU\FWO.HMLK8UoVܸ%Z*A]x#}M\¬#Qr% syBQXdn]D(?Lo|a=|X#ѩ2`yD]b+ >Ds4iM%,t/T+#pY&dg еl9{M`u Y(3*Xaaaɋ@߾$9v"MJrj{&:9 xc yŹG=+Z3!B4K ^JǕ@T\).VUo;xzSt:ȘCh#)sJlQ'g.tz QFjF~r oJiMUeꤜmOVm=5)`D}lQvf1t*ӂҋ/2P#="ufǁӈ75qaOhyzNVw@0}ͮҒSc[\O0U )sݚٹ~FvG ʻЌh $xн٥uC>x\.+t,Pqvk^xum'LƊSL-h5|Ґܽ%o"8%f9:t/ ӤiBo OT46 ZrĥZ &Y/nng]X}]Ҍ`s*)/RTZs|B\계)W3)hJ@W'^aR82ʌ(f*zbCv^ M=QUz8L6J}/okzlH s2K!1I߼0FzVuCpr]?y_"2vS0Y6VWjZ{\L(_]bHJ;CppD%MI*K!|2֑mS~{ Ql9Ah"s%(S5S687S}?`G4M`qgBj\jp#i:V~_H op 3#3/ _Q`bmscL`~E(Q؟`[=vsrdu`+dP'"dPH 8sl/CB]1endstream endobj 94 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 J ]ZUm?eB:t8K结ϲ(-n H0dY hqgy⬼Ml2Ly)diZB 'mUu1 > stream xSoLSW{)>e*m uN's**(ØR)BBu +S+Rb+40ebejFes\-3..n!nsK[\}އws޹rH!CE/5Z LDcjz6#HED>##,fg9}}ڴEM"E;㍤bCEqQ6X M&CeE`K6;BD!4jaꢊwr^EQJEh-ң( %d4 E C2I,No˷ˇZ8܀%Y")<z h\L<$ -A), tAP*ʘA L0yjp`, pc6GT;ۻoǗ/tָa$*%-4)2/U* ]P Urv=` CU$QݐԂ)0Wp4늚$ё$zօl!QJ=)c^~çݞUQ\ч5JI@q:$CMADŽXr!nkx&y6KB;Mv2#a vjyAs4U_qq[Wә}m@t]HQOo>?j*| ^K<[Ol>XHw9SĨtvovA%X)_T&haDR06ϸpckaY ġ[B}J)bo%jz(¬68;j?qo5vn|; /f(/~^_a٫>ܝ9{I?S %LbP6Ӷ_=,u`Ќ!24Q :endstream endobj 96 0 obj << /Filter /FlateDecode /Length 35781 >> stream xKq:.a׊*!+1Jݯsi q4*Aˀghvj-\7#%a:^ ~pF9lU.v~vd (ma@VIiב/FgWnW7n}qa·\j럡7.]Y-~%ސB뭀z@g |FfO*#6_#'gmJj/_}A>v=M5Ϙዿo~͗_~xZ?}_/gOWo_͇s_9/~|ϰ.e7_~e~7Y|v7ħ__?/8U6Oa'/߿8y3>O77#Y^[+_e>"]G}^<6O/g܇ҿw}oJ]kULāmՇj?#}&Vl^:h[sVP>|ǙM:T??CBPQ{k?a1h8pvH09Ok|t0G2Iv(NCG 5#nq*;:^9I:]|`p|w~>8r͗E?%9"1:!^[ 5p>VߺGLȽԩ a G86 h79l(fF:WRCF+99M.W f }iM H{]hr/~Hj4!a県ޏQn>Ih9]]M@,|}& gY04u~7}}Rþx-'<7؇yGIA,0Tc|sj$^cf$Dƹ?aGi/jxx샜e#pa!x!14%> u~c8TXG]ipq t5?wr$>諭l03V @4޳$ qf> 9"24˃x!qx;6 ,C m $ }6kxu&@1X|-L5žP+w Nji[χr}0Na|XkuH7g¹E5G)2Zn[454bHU 9\*js#b+W! sko_D}ʿ<$i=f4ϽqnBbRPnb0rCe=Hv뼈0s?,sI~fE[{h=WPdEX k}Qm+ğעʊ9$k^ HǀA=v@m] e5t@PzC̐HyYD;?tuݤw95 Cb yԇ 5pHAg d5'Cm;8rlg2v[ {XܨAkXE3A2b6=b 9+4~wb*\jُQS9Y_k0s4g f82G> Cnp 9˟&MkIL?\lbxtH5iC#,T )ć!3n!a. D*u y$p:yVHi>a oO@|{:l{SkKYo=:ikul6!Ґ!yu=~s졙w}Jۧ}Jۧ.moV'?=G݅axlE \@AlUMA1MW3lzR۫&[h.&'S|\0 .%;闈w&T6Eŕԗ.A]c:_/EL> PMٓ‡ \lf.d%[)4Nr1@IZ9]vRS0JIuAAV\x<^ 9Z/-pM.{0AFȶH@%|yjbJPqz#딱 +vfNWWa />< Qj|'_|z;/Mw,}F8jAa LH l8GЛyD}t!.ILwA]JtҮ:`i]f  nۮfdZfvךaCU{G9߷Ͻ٫O%{w6Ļle1A vw:HerEoZU ҹm,fb} ⰛA 9qxňAA&wZ!M$ҵƽRo![užt<@I@~4 NfLN-;$pB~G!OSycz"R0ɚky,l ߫;׸7DDwd+^40gu(ᩄ{߽dհ_\p^i߼|n)'Xǎ@\&Gfm3"hD֠]A{9ԠT!fߠȴέAסCS4d\]pr8`lWVl'z &~s$,=g /P.WO #Ob7gq{l86&hPt@hņz,I: /3M/TWR Jq Idy'?iϔ?y~#o^{w}h2ݻxsbW%Mi:g4[ǭ~sXA|NyUCO^Å3P{F_דwǣ][DR⭾LlM|Z9Otl"t9J /o&H[k tŃto}O|Vaoe[NPձe-`Ы4I++[ ^h,޵p`J]Rx'Q3 np[(O#Wώ(&{XyH5e'"꿽)"'q( 3L-f(/?Y6C2n ^/0 t^ i@ߴdjm4ȴ@OTQݤKۊy1*yɔ8t߶{nғJ8Ie= I8>)hi% #Tj^8eٷÐeÉi$5 'o}0Ngeq۾j-yLx$tOBWBݜ.+2tn,|lܪ'x¨jEwuÃ3]<~Xv<_.)ʉ)Ѭ%:< c69M?9J pò4Dfv3UWT{b)LSqNqatݺ2,])LQ`(z5,kH~Bc JKZ,:/v+~({Y LqvpMWGݧ*b) 7 X[O;3bs%\e5)ުC1Rk, SEˈ}?٥J鞦^Jl-J4m)drd,v[,RS]]{:Կj͞%hR3FSM<">տ1<" ,i_E~&Jt4⳨:hl(y*Qq'Mkv\J` WU H3ΡoE[ ԞnᾟoOQOQ. mFo~ 7"/Ej wgr#'38MJdx7Ui łdP;W%Zq-_e%}H(}\QBv>~)٭hP%?!y*hTjZ t ^UfHn19Fj-MsJ7?(d[$v3c;rS_áW7esyq܃nw3O#~|m>2NeB%m D(6wGzO84GF{uu䭯XzMKu:~E4iR5PG=P.Ϊ}V\8+ӑ"T.S@bU,WoC[P B%D04 *An*ّo>=cR3 uu#-rp3NRM%۝|艛B!DWűbkB!eѲWN\f#B:4ݗY7Yg N$h<}|3wՖoH!Io}2Gn{?woMd ٞ><ƍTNh Sv\ LqcH#,2G+&;n;$71Y+ր2w JGddOJ\}sq)-; Mi\ <5FS;mG(.hd(ak앀'X5\2-iip4"^ W]SHီvwv6ofxa&"p@(@ }hDoAݒ qW,D*6J cQoHc  TuG[q !z3,>v7EHф0lhd3y2po,6`{}PH$z ejPG JػJ 40xz@ٞe_#VQwJ/+\!f'|JT`IY![7j^ cYkކ}W%Հ9W U=r ɿn)W{ξpTO,8ݺ0A>)'b$‰㙠BA44¶]yI3uRb7/1$7黭zZ3X2gފ rNו$3o+Yuio3`6~h'A\yƎhQTU8%pJ1˳ o(spH#^5ϼ/+ vR573NoA)M Z:}%&ޥ $.ݷ7s!-!,-P OXEؾ!wap]\VBJBm2 Y9t?kuEN? rH0nfŚOXD/@,Fd$pIpQ & )W\U?aUg!èJ!|c;"Vw~Թk%f1T6Qa1PK+2oT< Ch~s^96j i]I}]T0 R Ո˞Võ@x:@mmUgdww,MQ*KRɊVRYzi˥ؚǥӯлψPŔ?PYY 0 (ƥFUMc͐e3WaZ"0yu+^QnCPRq!i؝4Dف^{gDЎXB~~[n~;ű=l;=l;=lql/N >vrZ r6PAdW Qm"1 PS(ZQhc8}C]Xnc9I7K['k?}i~BUdFFI% ti;'>n2d4[. |H䴖{| .2X#H=Z8S/ $ThbihSb R SRjk#8HcY<|6.41y8Gdi)̈́U8Pebyʶ?LeI8n_bLȘ Y<<)؜kHPvKzR:,`@ %f8N"E ߬08ݱg"C)9PG!>$Ra(bbjR[YwoʵѮ%oԏhaxPZ ߴN@t-,j%/Ƶȉȼ@bg 7Ku @ LBܧTsjn O5>ܧTsD872؋XBRDOkmϛ|ۧU=s#BWmΰw&8sC(/z9%bS)[t.m]2[ק3%ѓ%eЫ5qVY Y M1n,9 jȠ[L0d'ױVb2o*4 ćQUm#N"`S\U{DI<Yu5\?ywQ.f ϧLV8l $XIW9TW^ -:5kEIן)9bWtp 3i}:;I\x$b4~U蟞r@f"a6Ͻ '7E%ְ}`+ ]%[ E}?Tͨ6лlhHW1i cŒWb]4 TUB1Z! 1X<)nJJyKXJY h,JNȒk'1e2YY^+L& kT `L 9RxyZ\09prXSn5{(\|}!ri]Mr)2!Aj5%,X}ft=d%I0dt=c聅/9^gN5 c,Qe '®Buj ',8Y( S 3BOBraX+ 唹Gt=~4ev0@Ty^ٔKn-"Enՙ~E{zUȾT1{U4pr[$՗$7 f-q rVBD- ҷ5\sVf 䬒ٯ(1Ņ"x]^VRV9kE/EeDYCd㠲K]/UY`PeNZy9G iFQ#-S/i;r^ovGarF+W-Xy,yy{y=u{ͽ᝴ UXOɅ|;w?@ZyCB"mB4/Ky%R͔\ W8Cf"6u"8ˑq"I[3xTev"C Ld@mJu"-;N:nediD G;z{VjRfddma@"muޝH1HM=59m4h'Ma)qh7#KӜ3V#vڕyuYzZ$,DTjiMW"޶E۰_F$T~$}u)}dS:wA=dVHCfzߨ]ރ(]Sda*L^p%.W29!ﴚKkM4mqÎP;YMI z`?ޚw ˹wS&9<]R_з-_u8kc)Zu] "ٹ̴1vS$#GHH+dX크=~#={b .rc$WoT]1tRыˆh+ >8J ^ q|G!Jb;]rHw *Er˃d(d*h*=*] L ED88䥳Bve80:W)~mSh۞#E֕GE)L5H0E&PS@_7jO=`I%`o̗OTq n(|wa꺗!SsVNM-hZ@~֝5msݛ;)貅wHޗ0Eyh.2ZJL$&i%F$驅nm}UKKtg8y7!ҪA2.)_M'?σ?#>l!JKߪVr _Q\R87XBQ21n]j~ӏ@#+ZS[ nzara+3 "h}(+N"v= tXv0 eh7aCf5aC"SBi\5'][Ilp+X[w;)]28RX0rG%T'&h~UOTaɾ>h6FKJ]a;I)&E \e{iWKT4v˦ڂ&yS/N YV"NYlE,$QqIӬɮ@ 싊T`g O^(To aBaE!Q&( ߖiQ6>Z=GIk):H**]KȪJ ja!v-* È­Y@| ,9 $  f°BX+5 -d B5. NZ+(|WyH~H~"1o.PNJE <$;fz,Pw7ʟD"$y0J8:XA"bQփ$ A$ X $Tuxõ^ ʢd:Hv_U= 2;=ok~#bb=]dk.@t,$;c )>' nXJ׮l/UQZB-F]E[2BԺt&W r!k[F[Z(!,D*az- 4X(͗GvpD\X!|+e"knn +fD)҈k7DQDc?Uld'eOs#GYV{[Ҁg JkZ,9Pi#GNM51a!$ Xgc@Itv"&*@#!yfpW boүNjtbbA$1o{ivIziۦŊTK5R,2h6&&Jv[+PW e`q@}TD\F'Qgy֢ͮË:3'C E9Bd{kQ-#2iح9`ג,l5F ( 7t.ddT%v!|W&F#'19P:& *f:˖#KHƥ C/ W+)6<@"5)Rj`MQذdRv& ~sn`p[|Av/+E,U!sYxU>>mJ+9!Y&rE|/ޚzE5׺".#։\j^c9O58@,aAvN7JoH*iV]qNWΠ~ עԆTJdUW̞ ١~pnXب8|?B~1zi*ḗQʠW*^]MV8iC5{ZY){u+"h _| X#8;(*JVeUnc7|e@HD-X0#+tA kؾT wG`լ.#+5To%C+[CN*/]4Cv7!M-Fo&O2PG |qߡMB)ri8[RMꐓ'CN֘Gt,7a%d*,f%2u]˓zCsH75X0,9y>Ap/1v+$+~;!RٲeyV=$s=~M+~Uj7gs_gEN6kX,\ ?L,2_˾LKDPlbV{8YV%yՠ%$ظ 7$8/`@'[k)YO6 m͞;Hj1ohdJ->HFG#Sɞ..DPI%(]1F^)+u!Ğnj3eq# #DCZ >2zfCY&RIgހF m "vG.`w!xl8/QC@N( r`D,~kIoA<"iSw=Q $aCOԻ qyBOSBG"/y?gV<|he~o՛WΔ"gRG#F=%%NA׏cp E''QN$hW%}..%`/%3@ 9pW#ϮdKly6TO+_3Q6 xAԩY= d?y)G8Z{8]#j!g`|WM7;ٓ O`aʻy ><@|kGUY(YAKQk}}WElߊpy r Ó˭m\2.dMqA VpA^NQ /̤/-f[q~S ~^oŔ*5].Td8A*<(׮wvِfJǺy6b0/jRҮv<@a.X4f=J8˥WDv?am>g<\:^*ZtQ/p OxYxm|4k {, 75i{wk6|ܿ1CN?||>?KsZ}>`si_|W᯾_͗[ ?ڍSwkxm㛱ߧ]:5]W4FHߣԮH,Gmᛗ;>~{$}H Iw5dQ2.!geU7˯H5__|bpp!Qϧ__?/+g3?|7}_3Ka 7ͯ HQw^`YmœD_g5(h19'{iGzeE iA2t(L2A&l*~ʅC2(BiEC*i5&+h&{wYt|Hb= *B*p*BquTlHpsC `e!*b@\ T϶4YM9}kfaA ba`A2u58C4¹bT0HGx` mz<CBkZIލaHAI`0U.$r[K^[&nq0AhgLAgVϳrWrgN> JȲj­GUuKdhC^zۯqO&#ATjVv-7j=؏ǩ ߭UYHB75%hk:{o(U̡3mGıbwHnYꊧƔ[輌 ɺc-rLCDo66\򎍠lŕBz|lgL+2&SR&~u5he0+"Y  <7u>z:[s {նF"= .a )KD$] Vt. 1)!VkqO7ïc_]E?k!$q iVѲjL[z3Sl^SHx\"V:P;hEXsSR<b35w4ЙцTR&be/oLtD_#tёp_z[ER'>J$}kx w*LT$]|ҎMwְ4ĽfD{jÆf{b ք-n)q)EyWh)ef?ji~ȴW6GNBd鄴NJ*H}rK;hhmnl_1IY{aB,;#u?2re1L)fv]0L\.&wQoN % _A!Z7\p1xߌW|q"83vO:3\7 c - ɤrw9ӷ<6&c%'o&.V˓D` 'aHE$H $p<.D! 0qablJgC5!Eo/ߜN%ͣ Q".Jçν DRބ2vwT:zyfmr9G,7Pk gԺM.}X!@#(10&sj<`zujUh&VDͪ($CXg+e-]KuX}#׉)~HvMXH!yKKd Fp\J*3g&8+fW_埞d|:qD΂00~Qf Ie-˫ѧԃ:C nβAtwa}^ 5X*Lݥ2!5V e65oo!&2}Zly AjVevnFf_Xql395q+|D3,@An !K`kK:p*G܁Ĺ) xQKDd]"]b(uY-2ͩ$(Yܵ<;2 P>ly&.O35LX ɀX">$^-D֕YEtj#Sy@GK+Jeځ} ﺃ$I\iW)/ZNK[H0䒦?A9]"|-՟v }ag]ڈLV%$:nUkבeLy饀Ԅf ,MQD)$CV*甹A2(vyCKeJ[ܼ2Gv߃JNKʎ 4TbߣNRikQ Zk|d1؊Hi!Y8}Y0 !O_! 6D)$3ix&:o5B>"b%x<ۘʎyC2Ï+F#%Tݤ K{Kah:Jb} QH28㹎NB#ommJ)Q!T"+)HX)I/Mn=IepzwG'oK?(ff;]4VJ4O_OC(0Ax訅ۚNȔ#۞c&&QD; ᐂ&Ĕ u ; 밆4 `G Mx|E,OWq y踊1=kKY/[_."^<:K l>HUVJ8b&=lְBޔ>?zy*HnL_\""o~*Zͫ|VDre5M @^YKY1"O\%<<{ÁٗWmɱ[0<ˎ c8aAMaY^QC= 7l>W;>Mj:؁PJ nƙ=xBAy]C~w;E ^隼Mzsq3lF\U~BC%1[ 6hΗU΁_w![ Ѳ ‚@Gk y/os(1k(qao qR\]\omwsդ7"IvAʽ["A~ Zt{$,=(= ȾcA'꩔=D\LyN,P{wKoiHlgKE]!Wp_n0󽔥Cg YNSv+}pyާ}ާ}Ohy ozq_}ҶbB g?\4oGXQx8p&! :0}Ӆ9]z B}zb20ƕ]QEpZ8ܯcVS>0֠i[_gg,Pɳѯ;"LՒK{.eǃX|Rk.|^X6mO ,@2,@1B9@P'WےXQs@~fFj'_ʇvuFff) ACnQԄi-āTwqd1xunUg :d6#|G@eduj{!O&$Kܐ栖;0x:ۨ{/[&bMʞE$ı֫@2=*Qka-nDžk]lȍ8aM1T"(Yϲ[ޢjVR"@Z-QKdG Cx9@ܨŊtm˔vRҴ--W^B(7EeSK3Ĉǂ5KArlFKWxʸx{+ɬcH, 1B\]VuE\+Ȯ羦lrCb'`J.mArETݝf)7}p~y ><Ƿ)v+|C͏ nB߻s؟}zC#6#C䇶ZqPЃ ? xaz\s!?trOC~C."ClY{ꨢ.!vSYY a]Ώ,vaɭ av#pLQXhHOJZPȎ[fĂZAX~Mh|y3XA@TEeTo9 @OJoGT‚Bt (FFeQӧqOZн:0ZRl;\zHvt556UlL7"c1!pʈuA ӂb* h268<FVA7[8U,Фfww] kwA .E%w [05Z'Dga]g PBmks)A2nZ>Z"iŶ E:2?/1 >%%t<3t q PCÀh3ahL0{ri=N0NMY#G˲Z>~~|K瀣5͑T)PvxiS=ƒ5ZpRAgK/f{ ӋāY: hQ ϥD$N H=lTQm s\UeGfQHpHJ7 Y*҅Y'@s\JW𭶠ckL/mQ$]r-JK-Ͼn2Њ" )E)jIdE&F^)T=V r-fժ" o6(}!pmHnb)"Bfp <>{Ξy;{Ξ3!Y v=ogv|;{|dRf"HBT_jKb"[/8!@R(,@1k˷V ~ Pr(KO: < @4'}9B4Fm%s1RTBD4\Z< 2'ڦK n_T|ٌSGCɲ /.IjJjXAƮ=ߝj`/5pẕ ,EZ O%G\UfjLU2 1nZst6[vkjph ^<'^}CY_ IܶO!r۠^z<@/.d` e4$.oVT)PHD>/;7 u'4j%\ H 7H =kΑﻢn([l누.zB=l[=Hӵ~_#5<&k|*]۹H p 1QFMLj5ʞDkVw8ݗ)K1OnpW\Q˚ _z ޯܫd[>.:F?wXS4{ҬInT^^L;p=DGLv=8j5}|U*IV*bZ=BXʋQWA]$]B% 8,]ZZ  %@v0OobHmhmⅷųGV"7md' J3˩ }ˮTl8LUdhFpe!Iw131Ӆo}zCe.9/)]sK \]C}q[ vT(=#r_#Иٴt1 ܄EPƏfW%/c<σ*wOW߫gWi92*gy"e"$QoQϜz:Ww[?y\% 2 .zXSօxy18T hQiSm ߩ2A0d[P&Ѝ݅x4 /  k -?gVV{V?FPJk]գ_%m Qd)ޔׅ2k%\^` vw7tqZnrY^LdD_ H|Ou^"F_և| lWb RKr2y VtMY4ޅod+c/B ǐĝ fdb?cB#u]'br63 Gm~ҷԺٜ5 DQ)4lv9)Y<%>!ƞRR,`M1ZEv̝ ]+Ee`77fKG򥹻`{ɋjC50 2/e䧈v$H f$+\EObEҾy4Lf.gVT A=5X'R̡Z tA2+(F+%!^Nˮb5Q"A 7g{ {$%]G##ՀdJf̴xCg4"6]K l:x)DX],&;zg9jfHhwuKZǺ.Sf2<Ⱁ>_EQ|(R2eOrmU,>jVPh6ל\@" "{ՙ*͞3+C=mbCT.9YCrVh:4>v @=I2 iE@V&5'vH$%γD_REnga r{wGS-f6%wb9!-y3yƄitD{L;>$"|DddOBkaGd .ٛc= 2Ӣ8y5Ƨ daRMTfIdH,5D`"ՙf>ʴ.xԾ]#].@_D -cȷ*S|fd׊W:1ܕrMmWU:d nJ%F;IH --U |cktZ!MkVQe DueƑDNq]xnոyn+Q6Wm]jJ+h1So6=P-DԶ%14H:s@Q-I6ܵ U[$Tbos=6$˽b.rdi}!Fjt h:B 9o'\<ޝwxwwxwwxwwg y?/v~nPc5MCw|ax??fB^nSh,i> Q 0F*D F ڭvs^tM? 7i|fJ/B+Ct]$,D wy?{XJw},6t +AKLUl_3L=@Yv0 urCP j^anDEPP(@ܭ8ifi&ٺ]$2▥kR`e4͗CɆ*3?6)aƬ6Ehٲ aR'MW]H2c ۹bB;  վQlfl5xCv| \zD6z3Iiʔ+u۩N'>%%ikR9^tEjdpIl~b-2UHn#RwFŁq#~7MfP.. ~pG̪vnC9Yb z X i],UZ. "a2<H<BXv aK .D$Y`]H῅/γ8Bl 5 t ^""%ux&x܆2Ibe'|ryO)_WM¥߾wxީ̴ۻ [4bEva7ڂ7ChH4yܛғU7cԓj7dÛ9k5Z-5Z-jc¢)Oj,.6MԘrdW7VgF+d=NA $S58&k.$MfI5Xa-ro KcJH3  )TV@[:6j=6{|cŏIJ`@±fRKnfDZ-/kkA=M]e2K3Z4"WlA˪;h /6*IEW#cm@pV?rY68d{ ,.E*}Q 7)0x"Dq A`{{huQH6!CsB {G R@y9R8Ā,ib& 8Zed9OF"wzrH^*2EJx05=)'foы#0$y@SipyL$KCDI9(!'X[zXa?>GT`|^W,e'VDCђ [ܞ"S!8%@!(}}rgjDUs>A>x=C)w'P? qZy97S }whxGf6jFx9juu>NQug%R! /ئ֍Svn&`/ d?hoxԾ)>nꍍ{ldqSR-YJ5̰jE"+Dٴ .z̡y56)rņR1$mMn\Rn *i@J=ew* ]H-HHET%> ݎX+5JJY;5v7 BheklُwH9[+ m qoB f V3իBDfmk| nʌ dTk1ڶ]O^[fv6ЦO#mOc(mН!;o\ў:$nMFuVT.KY2Zʾ4V x3zG{~^\َʭ|J`oлX5HŃ $yo3Գ&Bq՝=i"g GGfQ"F.j(|L69`ϐ iГZ {RdPAR]H5D%ʅ޴(DT>"hI,P'V-gkM֢I rC@xOP"Ԑwz˗F0LRB4n\L"'Lh\&"2"PF9yb\W u ${M6eK HKj)X QPjrO3+7ϝZH5JzdUIS0)hQL;#U4fYU4& 5ٛ"1aye䱊K#gStJ-eȪhC4f;]2LtR}1OG$ ejiSF߬y: ޿AD?@BZ_Yr<&/QZky5~'e|k7Rܞ=fG=*QA zTП^#ԷBV 4v>X2M_:em}xM(C5n^D't87uSerh s0ݴ97d%2vJZoQ,xvפ_ӄH4>ҍ|L>@3thO9Lwi>E& L^!_4hQ׺dd~=gu+]’~N! !qr&y!* th[ !A:8Š]:QHru 1]^?^TuW&F`z=ݐ1 NKnⶐLՌ90Y#͂/+k$̤] Dہ ݞa6(dE`C]xUmpY@F"0˳mQ|9O$XV33}]YZT껇n?K\#K:kv?-^5ZgWX+l!ŋ(oW5#tgޡ: gG:09G&^(9 ڵ8"]WݦlT0Y-Z F6zѣmhU+i3> Gޜnԥc_?c/Q`^ ḡϢV z^2%RBP^n55B5Cbj"l x5Dgt"! h5g VE [I- R I8fq[mѓuuNГUUrRۛ`:>[dYf@VneI}¢ڪX*ZڳbW jm\3rZ-]K%ۥa$ǰG {7]G NPiyN;Fg،F )C wއ%vmȴD5W[q"A}g,EJ.Ӵ.$$ӶAwp6- . eKD[% IrַҵO3ƺIWSdn將hej #au G3 ijMA3ސA5E#ѰɍEêC9o~89D!:|ܰߔ*ٮllgotqFIlc" lj j\jDGۣڎZ)-Ņd8'@wjRN+ZaTtbh_rFG5qVlB~>uY<^Dv (Ru~ %oqʮ`D5$J01fJvz!$ˈ$Be H+PFQq /zݍfT (ʛ');Q8÷+k+&I)N~pdVQHs2l@$d/Ҵ5 Ν3oll|YI"pݓB`oIhG.J:ߢC `,&C=*LoQ1aCh @L`ҦQaj>ɞa3J>Pv%9&/M{)H5{A -_Le 6 QO!6 Q2(:މ [Tnb_X9RE5, & *  g5Eb;3pDNo| ;١ӍLnis&pie>NA$^{ޙ)Oڗ -,STm?$ !ԧlCW!C0|7{ݴ{w?[yેnѿsN3C2QHdUQ*ن EXGw% #JOGmWBq J=4mۀpavڋ%PHy$A!>=}%,N8tNL3nqKc4Eļ&F_+5WR_ XHi+EneskwA&6Vi,N@j҃DH&;g!{Tvoǔ=s&̂6Ȋ66 )_!M[;0]A1+{{鴲P!i ׬޽ vLgtx>=M,X Ta3D -o?~|k})o~%3PRQ߼ݗ|{XxSޟ\u)-[wշ?8eX~2$m`ȾB~f/}|cdE%Z oW/?;,;~_5r"`ѯ:feq%/asoYw_/p !7(T ?@4ߨ*Zc$]z=Z]wFZkpC}9]-_cN#1ϗs  1v6T[(퓿~=4 졐_>H\ qqX$KRhf3a0?]T]NI//_;f7"Цckwm_GcI?K?)kjL|epߍ-7 Z >0@ˋ>'m wKya.Auj3DQ-ތjd-?yMdbW,b=ePB\" i_L_3^s<9endstream endobj 97 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 340 >> stream xcd`ab`dddw 641~H3a!O/VY~'٨nn }=U19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUTB9)槤1000103012սgf|v[?θV ؾ^3+=lY#];qqr\,y8N>|endstream endobj 98 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 206 >> stream xcd`ab`dd v 5420qH3aÏUA6*ewo\0012:)槤)& 2000v00tgtgvBWլuVкǟendstream endobj 99 0 obj << /Type /XRef /Length 122 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 100 /ID [<46a09163fff47eb3f52712da2d538697><6bf327748715ba5e3ff0480f167f3562>] >> stream xcb&F~0 $8J?@6{:(]A$5Dr)H XFDe@X3D]A$Y|D =`ւM endstream endobj startxref 151679 %%EOF phangorn/inst/doc/Ancestral.Rnw0000644000176200001440000001432413475602650016230 0ustar liggesusers%\VignetteIndexEntry{Ancestral Sequence Reconstruction} %\VignetteKeywords{Documentation} %\VignettePackage{phangorn} %\VignetteEngine{Sweave} \documentclass[12pt]{article} \usepackage{times} \usepackage{hyperref} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\R}{\textsf{R}} \newcommand{\pml}{\Robject{pml}} \newcommand{\phangorn}{\Rpackage{phangorn}} \newcommand{\ape}{\Rpackage{ape}} \newcommand{\multicore}{\Rpackage{multicore}} \newcommand{\term}[1]{\emph{#1}} \newcommand{\mref}[2]{\htmladdnormallinkfoot{#2}{#1}} \begin{document} % Ross Ihakas extenstion for nicer representation \DefineVerbatimEnvironment{Sinput}{Verbatim} {xleftmargin=2em} \DefineVerbatimEnvironment{Soutput}{Verbatim}{xleftmargin=2em} \DefineVerbatimEnvironment{Scode}{Verbatim}{xleftmargin=2em} \fvset{listparameters={\setlength{\topsep}{0pt}}} \renewenvironment{Schunk}{\vspace{\topsep}}{\vspace{\topsep}} <>= options(width=70) options("show.signif.stars" = FALSE) foo <- packageDescription("phangorn") @ \title{Ancestral sequence reconstruction with phangorn (Version \Sexpr{foo$Version})} %$ \author{\mref{mailto:klaus.schliep@gmail.com}{Klaus P. Schliep}} \maketitle \nocite{Paradis2006} \section{Introduction} These notes describe the ancestral sequence reconstruction using the \phangorn{} package \cite{Schliep2011}. \phangorn{} provides several methods to estimatea ancestral character states with either Maximum Parsimony (MP) or Maximum Likelihood (ML). %For more background on all the methods see e.g. \cite{Felsenstein2004, Yang2006}. \section{Parsimony reconstructions} To reconstruct ancestral sequences we first load some data and reconstruct a tree: <>= library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") tree <- pratchet(primates, trace=0) %>% acctran(primates) parsimony(tree, primates) @ For parsimony analysis of the edge length represent the observed number of changes. Reconstructing ancestral states therefore defines also the edge lengths of a tree. However there can exist several equally parsimonious reconstructions or states can be ambiguous and therefore edge length can differ. %\phangorn{} brakes them equally down. "MPR" reconstructs the ancestral states for each (internal) node as if the tree would be rooted in that node. However the nodes are not independent of each other. If one chooses one state for a specific node, this can restrict the choice of neighbouring nodes (figure \ref{fig:Pars}). The function acctran (accelerated transformation) assigns edge length and internal nodes to the tree \cite{Swofford1987}. <>= anc.acctran <- ancestral.pars(tree, primates, "ACCTRAN") anc.mpr <- ancestral.pars(tree, primates, "MPR") @ All the ancestral reconstructions for parsimony are based on the fitch algorithm and so far only bifurcating trees are allowed. However trees can get pruned afterwards using the function \Rfunction{multi2di} from \ape{}. The \Rfunction{seqLogo} function from the \Rpackage{seqLogo} package from Bioconductor provides a neat way to show proportions of a nucleotides of ancestral states (see figure \ref{fig:seqLogo}). <>= library(seqLogo) seqLogo( t(subset(anc.mpr, getRoot(tree), 1:20)[[1]]), ic.scale=FALSE) @ \begin{figure} \begin{center} %<>= %<> %@ \includegraphics{seqLogo.pdf} \caption{Representation for the reconstruction of the first 20 characters for the root node.} \end{center} \label{fig:seqLogo} \end{figure} You may need to install \Rpackage{seqLogo} before <>= source("https://bioconductor.org/biocLite.R") biocLite("seqLogo") @ <>= options(SweaveHooks=list(fig=function() par(mar=c(2.1, 4.1, 2.1, 2.1)))) @ <>= par(mfrow=c(2,1)) plotAnc(tree, anc.mpr, 17) title("MPR") plotAnc(tree, anc.acctran, 17) title("ACCTRAN") @ \begin{figure} \begin{center} <>= <> @ \caption{Ancestral reconstruction for one character for the "MPR" and "ACCTRAN" reconstruction. When nodes contain several colours reconstruction is not unique!}\label{fig:Pars} \end{center} \end{figure} \section{Likelihood reconstructions} \phangorn{} also offers the possibility to estimate ancestral states using a ML. The advantages of ML over parsimony is that the reconstruction accounts for different edge lengths. So far only a marginal construction is implemented (see \cite{Yang2006}). <>= fit = pml(tree, primates) fit = optim.pml(fit, model="F81", control = pml.control(trace=0)) @ We can assign the ancestral states according to the highest likelihood ("ml"): \[ P(x_r = A) = \frac{L(x_r=A)}{\sum_{k \in \{A,C,G,T\}}L(x_r=k)} \] and the highest posterior probability ("bayes") criterion: \[ P(x_r=A) = \frac{\pi_A L(x_r=A)}{\sum_{k \in \{A,C,G,T\}}\pi_k L(x_r=k)}, \] where $L(x_r)$ is the joint probability of states at the tips and the state at the root $x_r$ and $\pi_i$ are the estimated base frequencies of state $i$. Both methods agree if all states (base frequencies) have equal probabilities. <>= anc.ml = ancestral.pml(fit, "ml") anc.bayes = ancestral.pml(fit, "bayes") @ The differences of the two approaches for a specific site (17) are represented in figure\ref{fig:MLB}. <>= par(mfrow=c(2,1)) plotAnc(tree, anc.ml, 17) title("ML") plotAnc(tree, anc.bayes, 17) title("Bayes") @ \begin{figure} \begin{center} <>= <> @ \caption{Ancestral reconstruction for fig.\ref{fig:Pars} the using the maximum likelihood and (empirical) Bayesian reconstruction.}\label{fig:MLB} \end{center} \end{figure} \bibliographystyle{plain} \bibliography{phangorn} \section{Session Information} The version number of \R{} and packages loaded for generating the vignette were: <>= toLatex(sessionInfo()) @ \end{document} phangorn/inst/doc/phangorn-specials.Rnw0000644000176200001440000003620413475602650017732 0ustar liggesusers%\VignetteIndexEntry{Advanced features} %\VignetteKeywords{Documentation} %\VignettePackage{phangorn} %\VignetteEngine{Sweave} \documentclass[12pt]{article} % setwd("/home/kschliep/Desktop/phangorn/vignettes") % Sweave("phangorn-specials.Rnw") % tools::texi2dvi("phangorn-specials.tex", pdf=TRUE) \usepackage{times} \usepackage{hyperref} \usepackage{amsmath} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\R}{\textsf{R}} \newcommand{\pml}{\Robject{pml}} \newcommand{\phangorn}{\Rpackage{phangorn}} \newcommand{\ape}{\Rpackage{ape}} \newcommand{\multicore}{\Rpackage{multicore}} \newcommand{\term}[1]{\emph{#1}} \newcommand{\mref}[2]{\htmladdnormallinkfoot{#2}{#1}} \begin{document} \SweaveOpts{concordance=TRUE} % Ross Ihakas extenstion for nicer representation \DefineVerbatimEnvironment{Sinput}{Verbatim} {xleftmargin=2em} \DefineVerbatimEnvironment{Soutput}{Verbatim}{xleftmargin=2em} \DefineVerbatimEnvironment{Scode}{Verbatim}{xleftmargin=2em} \fvset{listparameters={\setlength{\topsep}{0pt}}} \renewenvironment{Schunk}{\vspace{\topsep}}{\vspace{\topsep}} <>= options(width=70) options("show.signif.stars" = FALSE) foo <- packageDescription("phangorn") @ \title{Special features of phangorn (Version \Sexpr{foo$Version})} %$ \author{\mref{mailto:klaus.schliep@gmail.com}{Klaus P. Schliep}} \maketitle \nocite{Paradis2012} \section*{Introduction} This document illustrates some of the \phangorn{} \cite{Schliep2011} specialised features which are useful but maybe not as well-known or just not (yet) described elsewhere. This is mainly interesting for someone who wants to explore different models or set up some simulation studies. We show how to construct data objects for different character states other than nucleotides or amino acids or how to set up different models to estimate transition rate. The vignette \emph{Trees} describes in detail how to estimate phylogenies from nucleotide or amino acids. \section{User defined data formats}\label{sec:USER} To better understand how to define our own data type it is useful to know a bit more about the internal representation of \Robject{phyDat} objects. The internal representation of \Robject{phyDat} object is very similar to \Robject{factor} objects. As an example we will show here several possibilities to define nucleotide data with gaps defined as a fifth state. Ignoring gaps or coding them as ambiguous sites - as it is done in most programs, also in phangorn as default - may be misleading (see Warnow(2012)\cite{Warnow2012}). When the number of gaps is low and the gaps are missing at random coding gaps as separate state may be not important. Let assume we have given a matrix where each row contains a character vector of a taxonomical unit: <>= library(phangorn) data = matrix(c("r","a","y","g","g","a","c","-","c","t","c","g", "a","a","t","g","g","a","t","-","c","t","c","a", "a","a","t","-","g","a","c","c","c","t","?","g"), dimnames = list(c("t1", "t2", "t3"),NULL), nrow=3, byrow=TRUE) data @ Normally we would transform this matrix into an phyDat object and gaps are handled as ambiguous character like "?". <<>>= gapsdata1 = phyDat(data) gapsdata1 @ Now we will define a "USER" defined object and have to supply a vector levels of the character states for the new data, in our case the for nucleotide states and the gap. Additional we can define ambiguous states which can be any of the states. <>= gapsdata2 = phyDat(data, type="USER", levels=c("a","c","g","t","-"), ambiguity = c("?", "n")) gapsdata2 @ This is not yet what we wanted as two sites of our alignment, which contain the ambiguous characters "r" and "y", got deleted. To define ambiguous characters like "r" and "y" explicitly we have to supply a contrast matrix similar to contrasts for factors. <>= contrast = matrix(data = c(1,0,0,0,0, 0,1,0,0,0, 0,0,1,0,0, 0,0,0,1,0, 1,0,1,0,0, 0,1,0,1,0, 0,0,0,0,1, 1,1,1,1,0, 1,1,1,1,1), ncol = 5, byrow = TRUE) dimnames(contrast) = list(c("a","c","g","t","r","y","-","n","?"), c("a", "c", "g", "t", "-")) contrast gapsdata3 = phyDat(data, type="USER", contrast=contrast) gapsdata3 @ Here we defined "n" as a state which can be any nucleotide but not a gap "-" and "?" can be any state including a gap. These data can be used in all functions available in \phangorn{} to compute distance matrices or perform parsimony and maximum likelihood analysis. \section{Markov models of character evolution} To model nucleotide substitutions across the edges of a tree T we can assign a transition matrix. In the case of nucleotides, with four character states, each 4 $\times$ 4 transition matrix has, at most, 12 free parameters. Time-reversible Markov models are used to describe how characters change over time, and use fewer parameters. Time-reversible means that these models need not be directed in time, and the Markov property states that these models depend only on the current state. These models are used in analysis of phylogenies using maximum likelihood and MCMC, computing pairwise distances, as well in simulating sequence evolution. We will now describe the General Time-Reversible (GTR) model \cite{Tavare1986}. The parameters of the GTR model are the equilibrium frequencies $\pi = (\pi_A ,\pi_C ,\pi_G ,\pi_T)$ and a rate matrix $Q$ which has the form \begin{equation}\label{eq:GTR} Q = \begin{pmatrix} \ast & \alpha\pi_C & \beta\pi_G & \gamma\pi_T \\ \alpha\pi_A & \ast & \delta\pi_G & \epsilon\pi_T \\ \beta\pi_A & \delta\pi_C & \ast & \eta\pi_T \\ \gamma\pi_A & \epsilon\pi_C & \eta\pi_G & \ast \\ \end{pmatrix} \end{equation} where we need to assign 6 paramters $\alpha, \dots, \eta$. The elements on the diagonal are chosen so that the rows sum to zero. The Jukes-Cantor (JC) \cite{Jukes1969} model can be derived as special case from the GTR model, for equal equilibrium frequencies $\pi_A = \pi_C = \pi_G = \pi_T = 0.25$ and equal rates set to $\alpha = \beta = \gamma = \delta = \eta$. Table \ref{models} lists all built-in nucleotide models in \phangorn. The transition probabilities which describe the probabilities of change from character $i$ to $j$ in time $t$, are given by the corresponding entries of the matrix exponential \[ P(t) = (p_{ij}(t)) = e^{Qt}, \qquad \sum_j p_{ij}=1 \] where $P(t)$ is the transition matrix spanning a period of time $t$. \section{Estimation of non-standard transition rate matrices} In the last section \ref{sec:USER} we described how to set up user defined data formats. Now we describe how to estimate transition matrices with pml. Again for nucleotide data the most common models can be called directly in the \Rfunction{optim.pml} function (e.g. "JC69", "HKY", "GTR" to name a few). Table \ref{models} lists all the available nucleotide models, which can estimated directly in \Rfunction{optim.pml}. For amino acids several transition matrices are available ("WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", "FLU", "Blossum62", "Dayhoff\_DCMut" and "JTT-DCMut") or can be estimated with \Rfunction{optim.pml}. For example Mathews et al. (2010) \cite{Mathews2010} used this function to estimate a phytochrome amino acid transition matrix. We will now show how to estimate a rate matrix with different transition ($\alpha$) and transversion ratio ($\beta$) and a fixed rate to the gap state ($\gamma$) - a kind of Kimura two-parameter model (K81) for nucleotide data with gaps as fifth state (see table \ref{gaps}). \begin{table}[htbp] \centering \begin{tabular}{l|lllll} & a & c & g & t & - \\ \hline a & & & & & \\ c & $\beta$ & & & & \\ g & $\alpha$ & $\beta$ & & & \\ t & $\beta$ & $\alpha$ & $\beta$ & & \\ - & $\gamma$ & $\gamma$ & $\gamma$ & $\gamma$ & \\ \end{tabular} \caption{Rate matrix K to optimise. }\label{gaps} \end{table} If we want to fit a non-standard transition rate matrices, we have to tell \Rfunction{optim.pml}, which transitions in Q get the same rate. The parameter vector subs accepts a vector of consecutive integers and at least one element has to be zero (these gets the reference rate of 1). Negative values indicate that there is no direct transition is possible and the rate is set to zero. <<>>= library(ape) tree = unroot(rtree(3)) fit = pml(tree, gapsdata3) fit = optim.pml(fit, optQ=TRUE, subs=c(1,0,1,2,1,0,2,1,2,2), control=pml.control(trace=0)) fit @ Here are some conventions how the models are estimated: \\ If a model is supplied the base frequencies bf and rate matrix Q are optimised according to the model (nucleotides) or the adequate rate matrix and frequencies are chosen (for amino acids). If optQ=TRUE and neither a model or subs are supplied than a symmetric (optBf=FALSE) or reversible model (optBf=TRUE, i.e. the GTR for nucleotides) is estimated. This can be slow if the there are many character states, e.g. for amino acids. \begin{table}[htbp] \centering \begin{tabular}{|llllr|} \hline model & optQ & optBf & subs & df \\ \hline JC & FALSE & FALSE & $c(0, 0, 0, 0, 0, 0)$ & 0 \\ F81 & FALSE & TRUE & $c(0, 0, 0, 0, 0, 0)$ & 3 \\ K80 & TRUE & FALSE & $c(0, 1, 0, 0, 1, 0)$ & 1 \\ HKY & TRUE & TRUE & $c(0, 1, 0, 0, 1, 0)$ & 4 \\ TrNe & TRUE & FALSE & $c(0, 1, 0, 0, 2, 0)$ & 2 \\ TrN & TRUE & TRUE & $c(0, 1, 0, 0, 2, 0)$ & 5 \\ TPM1 & TRUE & FALSE & $c(0, 1, 2, 2, 1, 0)$ & 2 \\ K81 & TRUE & FALSE & $c(0, 1, 2, 2, 1, 0)$ & 2 \\ TPM1u & TRUE & TRUE & $c(0, 1, 2, 2, 1, 0)$ & 5 \\ TPM2 & TRUE & FALSE & $c(1, 2, 1, 0, 2, 0)$ & 2 \\ TPM2u & TRUE & TRUE & $c(1, 2, 1, 0, 2, 0)$ & 5 \\ TPM3 & TRUE & FALSE & $c(1, 2, 0, 1, 2, 0)$ & 2 \\ TPM3u & TRUE & TRUE & $c(1, 2, 0, 1, 2, 0)$ & 5 \\ TIM1e & TRUE & FALSE & $c(0, 1, 2, 2, 3, 0)$ & 3 \\ TIM1 & TRUE & TRUE & $c(0, 1, 2, 2, 3, 0)$ & 6 \\ TIM2e & TRUE & FALSE & $c(1, 2, 1, 0, 3, 0)$ & 3 \\ TIM2 & TRUE & TRUE & $c(1, 2, 1, 0, 3, 0)$ & 6 \\ TIM3e & TRUE & FALSE & $c(1, 2, 0, 1, 3, 0)$ & 3 \\ TIM3 & TRUE & TRUE & $c(1, 2, 0, 1, 3, 0)$ & 6 \\ TVMe & TRUE & FALSE & $c(1, 2, 3, 4, 2, 0)$ & 4 \\ TVM & TRUE & TRUE & $c(1, 2, 3, 4, 2, 0)$ & 7 \\ SYM & TRUE & FALSE & $c(1, 2, 3, 4, 5, 0)$ & 5 \\ GTR & TRUE & TRUE & $c(1, 2, 3, 4, 5, 0)$ & 8 \\ \hline \end{tabular} \caption{DNA models available in phangorn, how they are defined and number of parameters to estimate. The elements of the vector subs correspond to $\alpha, \dots, \eta$ in equation (\ref{eq:GTR})}\label{models} \end{table} \section{Codon substitution models} A special case of the transition rates are codon models. \phangorn{} now offers the possibility to estimate the $d_N/d_S$ ratio (sometimes called ka/ks), for an overview see \cite{Yang2014}. These functions extend the option to estimates the $d_N/d_S$ ratio for pairwise sequence comparison as it is available through the function \Rfunction{kaks} in \Rpackage{seqinr}. The transition rate between between codon $i$ and $j$ is defined as follows: \begin{eqnarray} q_{ij}=\left\{ \begin{array}{l@{\quad}l} 0 & \textrm{if i and j differ in more than one position} \\ \pi_j & \textrm{for synonymous transversion} \\ \pi_j\kappa & \textrm{for synonymous transition} \\ \pi_j\omega & \textrm{for non-synonymous transversion} \\ \pi_j\omega\kappa & \textrm{for non synonymous transition} \end{array} \right. \nonumber \end{eqnarray} where $\omega$ is the $d_N/d_S$ ratio, $\kappa$ the transition transversion ratio and $\pi_j$ is the the equilibrium frequencies of codon $j$. For $\omega\sim1$ the an amino acid change is neutral, for $\omega < 1$ purifying selection and $\omega > 1$ positive selection. There are four models available: "codon0", where both parameter $\kappa$ and $\omega$ are fixed to 1, "codon1" where both parameters are estimated and "codon2" or "codon3" where $\kappa$ or $\omega$ is fixed to 1. We compute the $d_N/d_S$ for some sequences given a tree using the ML functions \Rfunction{pml} and \Rfunction{optim.pml}. First we have to transform the the nucleotide sequences into codons (so far the algorithms always takes triplets). <>= library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") tree <- NJ(dist.ml(primates)) dat <- dna2codon(primates) fit <- pml(tree, dat, bf="F3x4") fit0 <- optim.pml(fit, model="codon0", control=pml.control(trace=0)) fit1 <- optim.pml(fit, model="codon1", control=pml.control(trace=0)) fit2 <- optim.pml(fit, model="codon2", control=pml.control(trace=0)) fit3 <- optim.pml(fit, model="codon3", control=pml.control(trace=0)) anova(fit0, fit2, fit3, fit1) @ There are several ways to estimate the codon frequencies $\pi_j$. The simplest model is to assume they have equal frequencies (=1/61). A second is to use the empirical codon frequencies, either computed using \Rfunction{baseFreq} or using the argument \Rfunction{bf="empirical"} in \Rfunction{pml}. Last but not least the frequencies can be derived from the base frequencies at each codon position, the F3x4 model is set by the argument \Rfunction{bf="F3x4"}. One can estimate the codon frequencies setting the option to \Rfunction{optBf=TRUE} in \Rfunction{optim.pml}. As the convergence of the 60 parameters the convergence is likely slow set the maximal iterations to a higher value than the default (e.g. \Rfunction{control = pml.control(maxit=50)}). Similar parameters of the F3x4 can also estmated using ML \Rfunction{optF3x4=TRUE} instead. The "YN98" model \cite{Yang98} is similar to the "codon1", but addional optimises the codon frequencies. \section{Generating trees} \phangorn{} has several functions to generate tree topologies, which may are interesting for simulation studies. \Rfunction{allTrees} computes all possible bifurcating tree topologies either rooted or unrooted for up to 10 taxa. One has to keep in mind that the number of trees is growing exponentially, use \Rfunction(howmanytrees) from \ape{} as a reminder. %<>= %trees = allTrees(5) %@ <>= trees <- allTrees(5) par(mfrow=c(3,5), mar=rep(0,4)) for(i in 1:15)plot(trees[[i]], cex=1, type="u") @ \begin{figure} \begin{center} <>= <> @ \end{center} \caption{all (15) unrooted trees with 5 taxa} \label{fig:NJ} \end{figure} \Rfunction{nni} returns a list of all trees which are one nearest neighbor interchange away. <>= trees = nni(trees[[1]]) @ \Rfunction{rNNI} and \Rfunction{rSPR} generate trees which are a defined number of NNI (nearest neighbor interchange) or SPR (subtree pruning and regrafting) away. \bibliographystyle{plain} \bibliography{phangorn} \section{Session Information} The version number of \R{} and packages loaded for generating the vignette were: <>= toLatex(sessionInfo()) @ \end{document} phangorn/inst/doc/Networx.Rmd0000644000176200001440000001237213475602650015737 0ustar liggesusers--- title: "Splits and Networx" author: "Klaus Schliep" date: "`r format(Sys.time(), '%B %d, %Y')`" output: rmarkdown::html_vignette bibliography: phangorn.bib vignette: > %\VignetteIndexEntry{Splits and Networx} %\VignetteEngine{knitr::rmarkdown} %\usepackage[utf8]{inputenc} --- This tutorial gives a basic introduction for constructing phylogenetic networks and adding parameters to trees or networx objects using [phangorn](https://cran.r-project.org/package=phangorn) [@Schliep2011] in R. Splits graphs or phylogenetic networks are a useful way to display conflicting data or to summarize different trees. Here, we present two popular networks, consensus networks [@Holland2004] and Neighbor-Net [@Bryant2004]. Trees or networks are often missing either edge weights or edge support values. We show how to improve a tree/networx object by adding support values or estimating edge weights using non-negative Least-Squares (nnls). We first load the phangorn package and a few data sets we use in this vignette. ```{r, eval=TRUE} library(phangorn) data(Laurasiatherian) data(yeast) ``` ## consensusNet A consensusNet [@Holland2004] is a generalization of a consensus tree. Instead of only representing splits (taxon bipartitions) occurring in at least 50% of the trees in a bootstrap or MCMC sample one can use a lower threshold and explore competing splits. Note that, in its basic implementation used here, the consensusNet edge lengths are proportional to the frequence of the corresponding splits in the provided list of trees. The input for `consensusNet` is a list of trees i.e. an object of class `multiPhylo`. ```{r, eval=TRUE} set.seed(1) bs <- bootstrap.phyDat(yeast, FUN = function(x)nj(dist.hamming(x)), bs=100) tree <- nj(dist.hamming(yeast)) par("mar" = rep(1, 4)) tree <- plotBS(tree, bs, "phylogram") cnet <- consensusNet(bs, .3) plot(cnet, "2D", show.edge.label=TRUE) ``` In many cases, `consensusNet` will return more than two incompatible (competing) splits. This cannot be plotted as a planar (2-dimensional) graph. Such as situation requires a n-dimensional graph, where the maximum number of dimensions equals the maximum number of incompatible splits. For example, if we have three alternative incompatible splits: (A,B)|(C,D) vs. (A,C)|(B,D) vs. (A,D)|(B,C), we need a 3-dimensional graph to show all three alternatives. A nice way to get still a good impression of the network is to plot it in 3D. ```{r, eval=FALSE} plot(cnet) # rotate 3d plot play3d(spin3d(axis=c(0,1,0), rpm=6), duration=10) # create animated gif file movie3d(spin3d(axis=c(0,1,0), rpm=6), duration=10) ``` which will result in a spinning graph similar to this ![rotatingNetworx](movie.gif) ## neighborNet The function `neighborNet` implements the popular method of @Bryant2004. The Neighbor-Net algorithm is essentially a 2D-version of the Neighbor joining algorithm. The Neighbour-net is computed in two steps: the first computes a circular ordering of the taxa in the data set; the second step involves the estimation of edge weights using non-negative Least-Squares (nnls). ```{r, eval=TRUE} dm <- dist.hamming(yeast) nnet <- neighborNet(dm) par("mar" = rep(1, 4)) plot(nnet, "2D") ``` The advantage of Neighbor-Net is that it returns a circular split system which can be always displayed in a planar (2D) graph. The plots displayed in `phangorn` may (however) not be planar, but re-plotting can give you a planar graph. This unwanted behavior will be improved in future version. The rendering of the `networx` is done using the the fantastic igraph package [@Csardi2006]. ## Adding support values We can use the generic function `addConfidences` to add (branch) support values from a tree, i.e. an object of class `phylo` to a `networx`, `splits` or `phylo` object. The Neighbor-Net object we computed above provides no support values. We can add the support values from the tree we computed to the splits (edges) shared by both objects. ```{r, eval=TRUE} nnet <- addConfidences(nnet, tree) par("mar" = rep(1, 4)) plot(nnet, "2D", show.edge.label=TRUE) ``` Analogously, we can also add support values to a tree: ```{r, eval=TRUE} tree2 <- rNNI(tree, 2) tree2 <- addConfidences(tree2, tree) # several support values are missing par("mar" = rep(1, 4)) plot(tree2, show.node.label=TRUE) ``` ## Estimating edge weights (nnls) Consensus networks, on the other hand, provide primarily information about support values corresponding to a split, but no information about the actual difference between the taxon bipartitions defined by that split. For example, one may be interested how the alternative support values correspond with the actual genetic distance between the involved taxa. Given a distance matrix, we can estimate edge weights using non-negative Least-Squares, and plot them onto the consensusNet splits graph. ```{r, eval=TRUE} cnet <- nnls.networx(cnet, dm) par("mar" = rep(1, 4)) plot(cnet, "2D", show.edge.label=TRUE) ``` ### Import and export networks, advanced functions for networx objects The functions `read.nexus.networx` and `write.nexus.networx` can read and write nexus files for or from SplitsTree [@Huson2006]. Check-out the new vignette IntertwiningTreesAndNetworks for additional functions, examples, and advanced applications. ## References phangorn/inst/doc/phangorn-specials.pdf0000644000176200001440000023237513502203732017731 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3655 /Filter /FlateDecode /N 79 /First 645 >> stream x[Ys۶}omc w:4qb[t@KFr{>H63wdb9p&b1L3!ti#e1B1XI&RqD?i-i:&F%E"& f²0c\q} mQkdHQ~ZP3`aJc42-fa̴ɀaؑUb,R`4b1(W!R[laPŁŠ4}b~NFZ!fZ H ݋@a'&5 0bڴ 521 aɄ/44bZ(@;-Ċ k'" bφh9V DC4LWn6mC $V/cjޠlON>SVObx #&e&d>ӸPgq%BnJXQz Y1']RtQAIJ*~JmkJmX܅X5YP[q>Ots6fd >Lsҧ`&Z<R5mTZT*y9[BLH&d6b,+Pmaf+@)$Ha[mBmป URU7|~ ')lX 1M(PG$8dHR `f3R4h; U֍Y2tUfaDd=v_ҁtbwyԥk}6LҦlj8%5vj~rŬa/SMkiEY,J_jwTDw*>P>?w' O?:]wPb%y+~9-&iKC>%|=t}#y2&$ z<܄STlan /:{Bu}\}/sp$E:r<}@ycNk;_7NgӦJUCܮ4M ܫgo~@ W[ :Z:Ou|5 R;]mokXv:qƸc0K)+'dž]Acc'&Sv5а/+#fԬ9)Qq,0~֨NepXT$]AD%Y5 ucR|r @9;ZG &Euۃ;;q֨ QXyS05θ JÆklHrSE[[׆= zxG їkEUA awߘ&!5G4X'i@UZ|5 i]_<#)X0 ؑYle[yg3{ov*[FOnޔNUIgl..|qEn'> Sᇏ'/wNˆ"F[uMm H#\ل{X.wlքAL#)nԟU+/LB&[pٴH7\uc3&Šjrx:Ko߹BKK(Z+l]_PG]'1+ທ4N|#]F6M-߉XwPL&IhUQۏYza F&"Т[Bzю?\.|lz˒ Ȫu팎cWcNҭ7f&¶̄voYw3}qR7 F^8ו~[:bFLQۦ^4^:^wU-A|~_~4MŠ ioj-~O rOp>tU*юLSLkAz/m/y-9͜9˹mxu1б4S?qesjie_~58?E6L^/t _ TzYo nF~D*/NXVFRH!B:LMdg~34dODҎ5gSK|ܧ]Рwhv7Ħl؟ݣK*6Ht3A BO}G'?a3ZEAٍ6rz괊l-K.3b ɹƙhpw@x46n72- V>Mlv@bg)FNC ,*?EH5cZNaD|G65i+7endstream endobj 81 0 obj << /Subtype /XML /Type /Metadata /Length 1557 >> stream GPL Ghostscript 9.26 2019-06-18T11:48:42-04:00 2019-06-18T11:48:42-04:00 LaTeX with hyperref package endstream endobj 82 0 obj << /Filter /FlateDecode /Length 4214 >> stream xrGliNp*窸RvTئDM.i0n fIJJ\B@˟V+au~{"V'?cw)PbDӷ'\I%{?N/O^u_E/zQBz#zB3Bima).-$Gª n"n~!(+Mwnp] at:jnh-*z/g(kw(mwNICփ@<,;xY]>(& :E#:\`|NWJ'_J^5NF[rX# !')R()tz}uO\'{wkX#c,p>M ;jdHY>8"-,I>Y0#z( @32Q}wN)ߛL!SAEV8ոAOl L[ɡWҚ8gy|v@Ld@+@l ߝ:YPA➲TC% Gyyrɫ4TDePa]Z) tgqQx `EB`WL Vgɛ2^n/xstb{-\@<PKy\5˰)dj`UU.y#\W8/,OE#wMG~=_%/)^E6)aԝA>t'삷@!2Xa5ce q;A7/YAHUsVڬOfP"2w &]=8Ht>Ƃ'ҡG' !7DhSa\-ii݃ߓ(2Co^mM^g*_h4qٮ.Bׇ!0!2~p,dEHfަXYj4xe ~G]B=gs=*J2H7?0'9\@Ei + LwQHԑ7πpn8ْF\0(f(7f 6vn y@Cl"=Mɶs.˜cA + &sN{<  GsQNrtrt91RUޛz< dwEŤw  Ÿ3Jů|CE~_Iqa16ūh9niKIWQow6-s`MJ [IIRw}$X6ȋdc~<k[<(x=ur,GH612kϞ2 !bKX:_FAP(sA"Y90;Y+F-V!dL oJ#hG??i3MxEA4Ԁkn9?,ljA$=nwz/Ujmlv'U0VW=a(#3|vPFm"XY`ql.V^U6Vd6BH0anG.&F$kx3m`/GjPH'I*  Ck_h @`KpxL%ҪQ|z#/ Oߕ:NAQeAG]y#.f!sDu :(%۬"JD)҃\1Zi*ӫ{l8**aFA1S;bXuQKhEݪCIOvD<]fhtk!윍Jw䗳;CԔ&%/Ç\b@ 1? dlMLae>-X?Guc^RK* kvEo9r1?J-Jy#eQ챞IPo5{jCLݭdAo2mb͉C$7gG옷Khuv<1Zj)%}n/8}?Nޕ eG$YB Me[%t"|/ojal,gÞ!pO]fr֞- lFI` of2gx&S=KEyiTI2(j"-yFХ!s=UxYv'۲z7QqKkMHt%jzpk̗n[bՍJfp*'e-`4*쌌ڐ3 1AA_l} ~NǨ!Y>9+ẗ́XU+sTGu#_NW)76Ԇ4JVclO-`Jt х:6x Zޣx oޥcIqE[ ;V(4[*W]5Xa²ǧYKB1% eЊ1uv6x +,%؉D>6+3j>-_aIlg v̽"&-Ɍ+g8ͳg4;+COܦEo<0VAI-g?Z&lyN sasѺuB<栦/v$Bn2I["\T1yM٤: [^+dԌ6gP<)Y#x{Lfq{y@"B[]7Q"|aZ v}F)\Ok ULEy1&Zn$J'qԑBdF1хM@Ls>Ih:-&V,L[-N, gsƑDž2g4@dV֎H7Q?Ϝ#?O%Ry}RVo*Ti}9U?PV fq73暦Ȯ2ر~>oXB=k3)NCꄊ !鶵|7)>{|i )9ۯc`,fd֧RkBΉ 1$i#u5Lz"Mqo0{6*'KNx2Ցk2-4@7 wYiIo} @ ;$dpu͡qBM*$)J9=Ą+Cq2u_63"k̮ XƊo2ppV'H] 15{]th|*1-[7[wa>]9vbfiX(;K[:|ď/صlx\%N6 p[R!?nhk޶ku <-і2=HT w's2ȬRF]bܒDZwV?]O)p7$ޏ<{Pn5UdW'Yo"X&\C]hD PMpK)^Lm3ȲZαy\؈sZcz-k: lxɓ2&ASBSe6/xS@r.8KlM?%N d~dO v,m?-?;=G'b!Uo> stream x\Kso܉u7/nn x?1ZǮ'샵؃fIC"3*T7G ԬF|~HCOo~\Ëqxq@o7<mV>ȯJNC6JuI?3yL#tpߞ|}__Nqm:L9ז߃$ӎ5wёeⴭ=E\mg7rYg-I~k I]6/He yP'T|5-Fo}"OU{$rz?r&NlwN|Ujd"O^rv}w] |5vJL{8BlTTN^piq-;WW~mk-fR@Ʃ[]}z>/J9uJPZN}߻{IMU]ˠ;YiwsZeogBq)g} ]ѯ*ovcW wa뢞4|*uuu2x'o60gL 4=12o7ϕXVy\X$)!iy|i*ʭ^Ӈ/ )lfC"pe)FLb)_Kg6Y% dħL8o!UPF'{PI 2Vh!J%`"cUhtiWz >:4_ytJxIg,M_8 #e{9csNb_ uqD[;, ʃ7GTEOB"P| 4(Ps"5k&K\sP%c>$3X~oAlG'ca͔Z:q HRLAqA.s]dJmHqrbO,ڸpǨQ†myX`ʤ=aUl"؋ yz'EԸ'/@Չ%;i d3 6DI ֕6a&[7L(:j6,@^q2T+_ G&L%q0y7/o/^A!zaB>(/YOoQ(гPt8w ։wyœR3ũ(`U(b}W&U#,~!L 0pxpe 1|?$-y S;Gao'`xD;qh){R<&윓lЦ%@&‘1g}^^FH(f9KFG= I7T\~rqlerV!n%IpX+I8%.*ֿ`X 3܊(~і]jr`{0-KDN,S2!mn~X:?v@~s,y4,-3W!*6!-KY>Og"{>oIJ6 :{$ϯ %6yx^0ĻXKF'G%&ӛ*Hm5-}$}_Ef@n8rՈi)PA%oC(8l[T 7R>d'fR9 ʗi]tr0l{+JTQ񣍌,z@-k{2MNxJ=0z[4wL$i%!rV23KA u /3"d^6? kp}qBr4W*Jc 6yEkJ虺&?uH~ȱI5kce׳V4>`_&.QHP)ZluدC0薪71Iv9͕*3ơX= 4zNHXJ߷x_\L0 q?8gؗLa|X<A1IH>fG^&kO~<~d[p~P6+ j(B )9bn[a:HK'@=8yj!c<{5'Q0\W?d&d#Ea03ǣt`\*>wK"y2qg%}&׸e9q=۳lbl(6Ye͜*PʊfB4 sTI 0cIRj.7D)TB-{y4wMqA: ݱO(l6]5[-EY#M_H\;L:ws.*ٵ0sL ٺ (:6(jf{64'9נ@ogO6 ǐVb!$Eiޟ *9:He.[0 a%-(bK{ǒ{bdAF+:{$K.ߘHIK ! 'i+6Zmaٝ`OwMPPo84#.kl+!e]z륩}D|P 4־wq"$xR3NZw%'h"h&ϚhMx;4[BAҾ|3T ĔN#\px-KzrOmpATv_-sGºkL;[Ƽ%~G UJwb;ٿm>TC'O_&.AlR63*&~B$w6u_erRpydhE.ͨTt2"Z)PjNϒR)bаN\-xeM_h !PXܗb&a3tK7^J}gyT6untLׂb@gg [\A*U15 Z1<C]pa7)}B`Vlmm&CH rgўdm %ނ@J]ara 7b?hBeaJJf7yjJVkEAŢ_GOe 9΋2>jkmM> stream xr]tNg3KR `BŎ0IY-%a==;3;{$Bje޽q%_ɸzu'V~ܓU}XJ!ZV/h\8 ~ޟ}>lŠ*nH!fcKxx6Sؤʮo腳Sx3ڬpB>l_WX*@ϹV!?SSg.~˃V3X+LX7R^rwTfVpBYWǕe5<~7ެ5=0@72^8Dt"x Ś+FٕІ)7-S9 O?&p'0ZY; .W[eAtم2?X@M!h-!><\F6XGtq.NUDނZj=%%meVaxAKllh.{ZocS5 vMet46K^O,^ԇ:Xj7LN Q@vc5`q}I#*+'\|KrWDDE(aOs@rr=#JB)Չiί&/c_keqN!A80s9VG-Հ(*x(b6"ݿFZMLK.K2d4 j[%1zlAAA/RƘwү//cMb`eLbҙ71)IF )Z(Vjc?ZMB@PA ")BN)TPRQ b"'KLz:e_h@ dC/4GY=ٖ`D\̦U䵅{Fh aXo#5DIW~C}0k8z- <\Tm'Jzt qq Rr@(ې#vRADdb(%1dlTg||S}5z=̎8m[:#žYR:XW$sEdѭ>Œ!LӢ v%&FPn D%ގHn&cư,S`#*lYdz2Ri4<*<.ӏ_JŚS;4`5$q!$fUϢ?c1jE4:*`!F-C-&Gcem&45Z5Oq.:,ez 81&sJι?O\11@AaM Uw}M*tZPmǣ4@dA{B[\.X{ @zE`4+V=d9q)]d ^p<+ZMN[(>iM31黜{ihs68:cjΎ% bݰ=[-M {eb `vN!PpZ{>B[(4>ULh2]V9- vNcb1aꤧ(=9ʂų-Ȟj`=/mjF@ x U^飞JN/B^zlo\]6`l?GlQNRpR^MҶ0+YCZukj$d14.A nh-aT7Dڵ-LHBlD*ƀGH*,[I`J-UJё(,B;ƤӦŇn;1tgId>dYg$RNug;yŮrAH]R.L>9R+sT@Z F=鴕~/GNʛ%a:ʟ6{׊Tu1M#L,#l5Ԛu1V cR)^ =Rdlby3%u2s8 8A>{W1:<_eUN":{[u5J3 zGQj5>7}pW)Pn?&ie*h0=X4)o5(_O54P$'.MJ~ JUXR[ ʛi!qyt>2DKYd} ps!V&qpػVⴡT%}[Bp&=0IC6nk3Uq㞩y8XSڍ=L`v]mڠ{2/BT`H!%N玏jTz/; %Bj#G=n_ iiHgs1(Y{${lpp']yltY+W-R7Q+eDAx+\ Nh1ir![98,+3"WsV#ŗ~ԟ1hc#儡?#BY{`W1&l(r"CשBtOXԡ\5z9a<Ӆ| 53V;[([`[_G]c@T4~6#~c5]HjńSzG)MWv&θF{^fSy,A<f2AG_pTRԫIs ߨ4u͢?=usP[Qbo`5ex' +@ _rX[#Y_PuH ûMGfۑ:~c>Qz&F3.L %UWȾ!B19rjBq'˸.xE8?nc^Mǭh5ye:k[hb}QT#1My? 7KҐGE59rǜC26VsE'1`E2KZ tĔq-Ty'[ Si"+NK >a[+TɌH3uщ FW3U4 wGeaR[NnqFCBgM%mp-o 1a)ؗsVypJī_x=9|6?!;0c?!Js7UϻuP#S뻶F -kKC60فb0  _T`KeeSy8*/W{e(t' m4Γvq/[p`ݰ]Ž ̸ͦpeng4NM3v76;PhjZˤQlv~*<@N 1B+O6oҤ>}> stream x[͓\/9܆L< $Ta6'{`w6֓ff )8g5-Oi^ W=?yHzzDoWgW9Dk$O@'?_=?v`Uf+@/6b0RY& |It&*їe< C6^ыy=|wic\~urolԃ[_ve|1QF9-e?.ّgD x"38ۙVӏ-͊$<Ų-rQaQ,yuSe>ص@x, ާmSEͣDeZOQimE)2-iL`&5XBzhDe:@~8`&D)?؈>- ~) l9rٺ=0/ZxЛVLy^ P{eTmrf&ȼ!֝(MoÝM6mx@ic)Dnj!t$ &zh ):Bi*g'&f(Dt;iBt>]NP-GlBOs]3m@trO'dmߋJ}=;yHhBۉ%DGl  cyl2q/ʘhBDtx ў6PhC^T _ Dsl^DEl3M[ʴTHNJ;[,th;qYpBQri=#(Ipk`4*ӽ*{Q-Ÿ Fs5b&^8K nq %T1w`#{}:R곊@[ RJ.}4:ksG a}!f:ABDN.j#I9!T h/6[ylqrЫ4i)7 ɦ]>t *eQ %LpB f|ũPA ln} Y:9h˸~-c*J2e-.6S$Mgmyuˎ|7Q~Id\ѕزtE vFF~¾k^LȝqfC WuAs7^yf4UIb2ZdI ]:7K(@9YDlS(:9;}I4\)eUX*%xbfr$`l/o  JiuU >ba¾gĨי]xl>]Ϸ%㮳73 ħh'byW~_=Jrq=2`.z\t`A2ڲ]g#R<y@NhD3sEutk>>GmݳU09T>)ZNW)ԓB aŻS0 %ˌBtULo$)efSQd$0I%OɎRB)j`L(>.IgA֎ʣs{S([{r O(nGM593XHGkZ.BtSޑWf\.fk)" ̟1elqߎq6#o,RJh^ϐ HU}^̎_$n}6BfSS`fW_@P\y ˸ɣΡ˼7hJD]/N'WšeF]Uc;T0s!ǘB29 Ywa0O_oiO"@rKF1YZ$U#w"vXcߟ,͓ )KQnf@ nRT.)-yA81落,\j(b O!N%<%4;^T"2V_ * S̙p'%)z˘WI+Ӥw| ؤ`6ِhl%06a 1OWۋGP@6) ؐ+{fT?ؗfgʲ`r'k3Ň[i(rL d- &GTFc&یE#mRe-X0Ȧz͆Pd;Qr>XVok]'iXhQ}&Z?l&:osc]j(.dw@(ajZ+{|Ez f!#עttyGC‚`Yե+$%Ejae=!(F ܾ~|fa5_y1B Em *=öE')_etg'k:}Hxh,+ +(ys`5v(͊͡op+=^%:kq]M'YBU,R mWiegt=콮^h7yp669bzHC H  ̞7 Un;ȉH@U6ARJvBK_ԝo"r[p,}S\Qq2|*T8cYad-T3_\|iQLM~$16pY״fb)Y60w˜oXOBp~Ǧ>븚忔txUvVQ }+6j2yw^)X#h v3_IfI&.aYel5XK:!,k9O$ UbڧsMg˺1캻PEt͞7mU HrѺcޠpVz'B͇Q=^#y:lQ1Y7E%y{z z3, A7P3-.8x꺓F! })fM.Vvh#? f]ըؕl6ZWgau!V!;BjUgf) tEꤐujbr ] /KㄊD3w8=~_=f#jnQ`S*ZhީD/y!nC.P˪`lOT6sKa7xRH@>%j ;6_bqo#ϠpFgy;m7Z6ϱfV:  PkSzɏP/e͞/?.3/em?|h!||!nBr(bys [UAw#v7 Ein5lf[aɴ~lǗk0ʴxCM-(^3cG-8qw佡Etpt=6#(}2eO2 U/xӅwy\~IL"+ᔭ[E$]0u/1B ÜEҤYuzS:rslY.ۼf5 X_uY~wN BSkP\؇ rT/Z=Ykf*X[Ȧ{o"jrtcuE , > stream x\sqr7o5)Q)ے\咕DA*}(U3;=ۻ-|vk{Ao'xtyL]>{L]Z$UG'A ?lxOb1ot;C)<҃&tr%tTonS?! l_a g7W9ujW7JJh b6g? Kje |N0JVt4Vq.N P%,abQ 25AK7(ƌ;W1'MKCK %$+8F20}{:Y.l8 | ySV:i2m.5c9R4T!^O`J]S :-O*eUHˆ6:8ۚ5/R-X) @+<Oo,:d+=0-' <K@$"aiY0nD= h #&v}j+cޑ[-í$P!<C;c)a Gp1&"ff*RXiut5/L18  ?SӞӲTR0iK!j:'''2UXC-#8P<@C6<`60iXR.X5" 0Te1 :"LF &a1аX)U ,v0 .H'A֋Ytd]J,WYVSŃ@1nvQswɝ㕐ɻʊ<0jf˄>w(4B2:wOgk`vV-+Ѭ2 67$|?J(@1H_-0꼭qtA";8@F)@S>4 U)pIy'v:V 3GL@ރBڨ(`1g $\Oܤm$c'_%rZ{,x Y6nYF-5Y4lPL´GM2rVḐ6ܴY ; :Ae#M3@AuNalr[FvEHac5הo>Auc} Gy>`v0 Z!rż.i#Vy NRLm1ώV.W3Sj@Z|[?i}}[޵n7lජg'vxO!>msm}ǯP:Ckp`ahOEkSnp \޺hDg;ݾ\٦^NDsaSGVFLV Qް4ᶝzQ@QGhg) _#}K6r4Ȏ6XIjsvfLMS9N tr+S6 ؋Y;jk&vO 40A2H 2=u;u+: j,:Bɚ=gLJ'hݞ9cWyË;ݮ~}Gos763HY/Oj8c@ի, f!# /?BGȫ!?]?#Giy ;ny gQ@zZ7nrF) : F$oXSAMLjWd}Q|?bqF *^Fx[my:S>o__/MhR3 v+uKxXTjgW(x7<|2RKd֐7 WWz9q@D~ԓV`D~xk)ͼDn=`zhN^[O{kٯQG)!e%B6<@7[DE̵̓tL,#փY6 A.xz=.1;.@Q]jT[]jaù\@|J- 4uu ڝfֽ^גU6OzN]$%aFw}ڨQ`LaĦF7hg&GY&;:#ExZo8ԚA@ M ( Oz@p`Z$?Z!4(uOԱK\meDLYUIR m66M"&bED '5 `sV7#^Kd =2iBeDIDPR85տDGýĻ6A +, J2'u-(M9TDL]V&SڤeEط~Eu*R !=y׉-6'mQPp. $ȗ|Kb !nTv0-A9_VӲvCӾ3SZRu`d{mmw[NrޚF:uRɨdgēФX0,S/Bd46CJ[6@׳pWggwҘ P'iSÇ2Zj~RcgXOE@8jTr X7CtRUFߌL l<ƌZ<ιQپP ȚwIf Q1$ЇQg&M+,-0JΟ\c&M|pqگv_.!OPojA_Xg %/LvAesAt$ TB\hV+~*] /HfQsUaE\:_ ԽNR%hfKӁs(W گ{9W5{_fdwT Е#--[|@T0vz1-ongC+HoaC&tmG˷hqVaVTa~o#~''U=E+$J\3qNZ}Dv[FL v#lq|zr֊ '{ E12Wnhl^w+]}/m3,1ʼ>Mn:!ЀyIfPulbzV fW7eghT~Ecqtkl Qsk"IY5l2Bv|[9%#S4# Uy:=C!1t*p8 ơd==Rjgզ+Q:܏')7坚:|$^^I5Xbz)GQ=IXP{p*h_rNk=7] W&u93Y8GAzG}ĸzqS/"z9I!oY B*¦cveqzѧ&{&hOi|YgWM֎qZiz)`4Gvo6<3EvNC]y`lLd>.xEݱ}%s<>]J@32ߥ͉6>SQc(*a<_Ƶ )\=1-,T$~뺁RO&CL cXrmi 1{VP^s*N7(<F:$a1FB!h-Q2#ȳ3.|:.p DŃtO}szs6;`^!Ĝj= 9l??21ηƣ'Og5 ^W;c sPr! ]4ilIjt 4]}] (h)AEJ)Y~T. Φ% `Uq͇ $s1f~YsYj[7[7ӥ 4 F5~%XAPN%q J 2^e_-AY)B=8:]/dB_6W5  TLO*?&ԋh+"en tA0 E!Gٸ=Qgz%4E Q'<ࢤ?V8Cc)8y_Nendstream endobj 87 0 obj << /Filter /FlateDecode /Length 4305 >> stream x\Is? %z_T%^dJ9Eh)3z ۇ~Z_y{?ݯ0B]n[ڝĩ|Vg[r]fZ潷6E雳k%g5BLFoH)[i}gQ^`I QF6r?p7 !Nxy\D[ +Bip;{օ)İ$/#zrp'c]J1rF-).7c1-($,9' )-5uK-"Xd!.,»B(3LYh~.t Y~OֳS(- l ^ UEIƸ˦N]x$nc}09ڈs@in\ cƕW GN(0d#F87s}ĸ?nhf1t,,.4*:].a '9Z/pdއjVeTgnTo)q/L3#QE0Alf:E u cB8?G<殉w a=t(:+E^GG!(E"-:CvUbr =02UUTP^KagI %:βΔ١z5iT(rs.o5WDOf{^`n43*Fh]='ubr@R;Ҥ YZ9 zK!:wPwǡ JE#/볫X_T]!r.d ~j䅉4#zZb5=- UM ȃYLʡ4{->!y*)-llp3QGfqk/3v=!Am r1. ̼HyƟ=ʦ4rЇܘFN6;I©0b3Sb0y&[+`t9& 4dkPq @@uyp,d`_"Ծ4$6r&9T]L7~ 5ugR7cu^bѰ $vob;M(3FZ8M@/\i3| u?ϤN.$ǨzP(,!Ot}oYa**z+B Iɱre`GEy',8S`?pee:;b+ee$ ՂIeS lhI$DriL*< 8߲@#\Y7`vAieXκW5p<Oah.ӸvFc'<NVp]i 7Q*%GZ z`i/a+,/a xzh =!Рy=9lAT "@.2?lW`{b̦|[E^SRHtv i/g(&j^fPzop]U ZwdvE_A= gF6lP\}*li? uާR>GS/4)oLyG!JjEϬ`\kJ^&-7 ĥ4u8xqۼB?ԣEIHdr!Jּ&]z$D\V$rB72'X>Qm ocBY&GAqZqY\5*,X5,}&<0T]D9TB$7A9] DwO†.^1B'5ZxAWa`4 }<u 3 JOCҦ:񺪐x1i^v&zs(H#tr+ꔪlezuƉvzGHf,t/ 17hzx* }q8EAYv fhq#\hGY}@tЕV:ŭO⦚g,PGmVJjoy19IP7ږפ<[*qY2/{k Lދp,IkWx/Kw cv&0颊L 腓e05Z:LˬOehmC#0TXsә2E+IW\_?(>}ɀ5QPuޑ|ڂƊ{3UP?iɀ7oӧݪmP8o~if~ޒyjwh9 Y;z>H^Oɴd~ϿT?u i^1a)0F1)L!i翈Yʇf۶i3;B)UTu dltv ~UVނxEnzu&OO'*,i<2ѧVuS|۴|LZE GsLOo4ʝU?麵vU@nWUx?ղfЛG|&UUcU7}?)NkmmU*t~2{_;^+KƖ[x;{}VߟKk;R&fq^Xc? X U W)fBr!jy}HH$+*.|).k-Սͯr/E4vPRup|,2E'T-+^M 7"L^8^%GV"j=h`a%_z>;/Byendstream endobj 88 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2403 >> stream xU{Tw!U۞I"XUP(BJbH7 @!o EֵvҺn=ڭsvmO̜{fΙߝ~% O$I~HXxoI|ɂ ^Z}a壾^A-#l$zyZ U V=%|?HV&Q&Ea"T"da\(QHU+Vdddd~reB𒧄*0\*QKU­"D8o:e)i*R&(Ay2U&K^K&F${z%N "Hb'XG'6MD($ˆUlb.1"~Bx95RBztxu=wzQfS[3ԟ0f:_\n3GxgYfS&n85c j8Z;(d LФyEmі P$ՙ޿Rbsɖ<0h߷Ĥ"<Ϲ y aq eUէ<;ptu9}C$ m)}nZiwבG<XQm)#@{:Zm\.W.g }!?x1ߚC'e\'E?< 0.R:rbYXH+RV;-I c?~Cʐ<8.EXcw?g#<{5Sg0k O˦mL ۔2< p62~''VN.*;yw+N˧wazZmӋ@I+Qz#QYc|hY!o!$tW6~ML}v@tO]~Yʸ4봆B-dѹ5֚lGXkaυw%X 2)A (ݹqbCޅU4/`UKdsz+@%8W3 ׯ&22gm8 Y9   ~rb$73c iMO7F&޽h3Z8L*.Y_x7tg*œA34h|pʒ\DDWy͓OR^[eeͯcO~2ٲ[$ף8]3k՞MmtȫEo!akE?S̴1YLk,SC w:?N :S]]TNʢlwtB'K]x ?\˖ri,?w4'73u3?70)t@sui?#Tz(!SPPC:!_WGq΢7~h`]T~/gƠJ[ F>j1ꫠ &\^#ެZ3nEJ_Fendstream endobj 89 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7416 >> stream xy XSZ=Ԟ8`N8 " y CHLa hcjU[mjm޻nI_ 'kw܉Dk&:~(  ; }qƫ$ߋxJk. 5D(H$ Ir  j7n9L0nwnGNoPO_(w?>""bȸ`c"|Cwڭ[ s39)?0,;nEw(RǀMN ^8%K#w]knbƍ0a)N>cf9#o>ֱ(j0BfRC,jNFP먑 eOFQFʑCm+GmާS bj"@-&QK2j JQt*IzSP}K"w)ʖO (BQ]ٔ?ՃRs)kQWj%983%u @+>yp|+KIݏDlcu~ɺ~MVz=w|kE/}ow;0}}a7 wݙFܦ66`{k}Tx5e==y~%g":8fvZAa F(,ԉwۗi8B;mZbyB *ek!FC'gF[p 4M%(l7B0'+4ɒMK! Z\&pZh0P'BeyY,Fi,<=[2}axOO`T?ID+)}5;ŕ-7Ҵ0BۛȖ%a9?_;sBFg'M Zƺ} )5:`!H|}+7e;zBEH>|/qiKp?~Ë',{5Y8y%c1?˺+ȈV߷N;y=o-%.?aw3>$;ޅV,=xX&8_wzr;aEЖ[#1pb>ԑJ%YR )mLJ+5*!V_PL b (}~j7BsTw`q̭ں}C}QX۵aKA+KU)el3/ {xZ?FCP^{FЪC7~PS:Rfވ넱\FŷHg|8ҥ-^AgE}E,OSWh̛v=3ŝ'P˚yn-`G(~P1e 6Bc\Ty: mp푨PekW}e;J[ ̼UOugL[#xшDhZ.nadA& $$E'~D%+8sL5Ývز%|UYV^[ !74(n+|DuBb%I!M)`eIHJsDwX4x\d355n[zIr;YXkʼxmjXa3U Ȏ Pf}@ٱܲ@n@FbzJ6][5W8V ̑'4ު7 2 >ce\Ɩ:Og τׄ$yé"nqq6 ǐ ߠ!1a0-*X\8^Mm A B-9UI)Ia,>fn+R?U5rc/IInF+pmFjFFnIS! Oɮ*hz.>fdt1r1ڋYcӁ2}ˑY{Lmh^Mg%eq*BtRbj6s~Rd@-djKk->eJ} hse.LDHj[HzZBqVvnA~oMIyb*$'6Uil:gٴ4!{ !f2MQ)[ڗ-eftFvMkFVŎ{JAWlh8d<L x2>ox=d5[b vfE&M(*'EHLgh [}娺 ^nrX2'xB3iaXkŨ2"mU=s̕Xlyd>inEȂpԻqǩ3-/V[,+GƻmfvO~$lRm(+4^yLei b Ԣ99)HR)|B`gBc̯[ZNzU֯ Bgb>M)S<7ma;e6th1piKWɹ`C,afJkQwܔ 4/FI$Լyx$ TH,؆ 傭NT-t lN"'ٜ U9tD5'aIfͤv$oÓT2 C/7nw&K/uu_DA6ҎXr芸ۥ T.Z#|/kk PM=-6 L4QxD6@#6V*9Pt짥]f#/TɠIw<ɍSAk2FFS3֛Mz)lKh ːo&_ }P,[.Op,46/G90d2?|дB=^eF)A&%j+gtcq<-ǓrGDh!; |rLr\[fzD:]|D|2bu<v.s_;M~、6B?Ggx^[De,'6 uc=r9}_4zkh {ԯyxMV2HdrKq5;7x펍+v?sMbdjΖoEO֠ۏnV|X 3@T,7 PY[(c'Rh)ˌz`Q=:ƈxl*0sYU',G=y$ԙ,>EMa< -޻/3+V0!i.j䔓 9dHIQ)N!;a#6\gLvAՈA?;rѭIm{`aF@`7>mYǿ~2_@Mϥq~ =WP^z3:tЋ1csr䟀ͭ˽gWZ y}fCСmEBE}&$ U+a+Ȏ&ReTTK ^WČg.@3rԵ x-p?ұRIyfX1r:ت@Cv&{)'nyga4~^Lh9>Zv8+F^vc[+\b^n4 W"7SA| y%g: \{'}U|:0hh e_8mEAWnɴ*Ӿnfgqϋ B;y:=q-+!ECBBBԆUՖ a.VAa(W.#ڦ"4$8:*ds[]x 42I}"1q˃g$QBӀxlNNPHB=#\a 񂑆JMNqFe@S̷&}*كBLrΤPKYPd/eg_;wH7eTAδU~0Q*Ib%7S7cPVt{g%BmT<,$hUW-K= h1VjfݘcWiFNo-5!f0hsNnAJ2JDs>L-8oj|$[7'oəշ6Yb w؜ʒC_Ѭߺ=* qxeoJ&5Bٲ#7C'0B"&~[v͵{榃]ʗ^$KJ^_njVkNUIde !SP+W=sI|}PWt9_מ*<3~F%vjHˁl[.B3b4XUdpFQNB눋MPz&zLgC҈`Ȋr} g Wku6Xplwc&a dx9('\MN+H0m ׵׉Zn[ba{;>s*wհPczr rlX޵ZO6g HxnA>+ʉ:i<Z6` (;-i7#Pk6"` &F-,[.$pӎ@diULG)HI%՚gQ|~$E~I0'Dǟ]r4%m֏׸^GCsubd-ªSr8hQRFFksn$B=aAeaej\a-Q]vWLd em e\7l+,)2>1m@\?EoG8 QO|]gIUpE\Btinpp|r ElNqP1a?Ҝ yٙ7 3hd5O6<[do@+V$YAGZm|ɳA?^![pCKĂ'[\@).KMI$ Ѧjr[{׈Emla)EC,q_Q%P X p:61ٜ/֢ZB ꚛcKL\?ޕ8<pOp(N}]J8C$On1rZO(Y͋5:8ɜbj|J D}Iɕ u%'4=w> stream x]KaWKM:]ZZҡ= \,4<1hw!.w."7Q^ŵA4uw[-#Ăr<_.Ra& rp㮎5gcPh jZ5vRU[vO/3+tM _~d~i _endstream endobj 91 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3726 >> stream xW tSպ>!mΡ0yTIe \2X,-CҹvSJKiIO -) -U@N\|*VP쮷N[wWV}}ߑ1CLƺ{.:UzJ&==D(aADfpQQh#L;!:$(8V5Yŋf͝X,< :Okb0w_H@ljK_3'>>~&t]jߝ'<0E泮1KRg[XԝaY.a$O͹G\ɢX2,tE_1< 8{Uj=Un,2<+ņ[+q}m"}|5 KݽϮYHM@ϒgQȢ2I:7d&᷺Z_})%<ߗ\?sg&pMYaJ͇"T#*`vd_j^Вgr\lV|WDlbN8W\"u?{ﺨJi :1|*۟ %RֱK!}/UT'7B)TsDv(!u_oiࣦ?i-tjɲC;[VQVQZ{YwD{B}Ń>@Ƭ b0PXgU)AYe-TV\ ơ|~5R2=Wϡ8TḼn}`$4͉gn6w XI%O;k#rya#/Ҁcx.K}R"P!8!*+AoH.V6}2̟>RX֎kLN8鼑_Օ2-8X }C{\Ԋ:h E鵑V ~c{vj[wq=hLOTdҽ8 q+,DlؖLU>uBwn5. +z˃ΒzW.m(:jo8#jڽo+)d4Q4N$A^Cvrvևb.6 X ~|l|SwT0ワznz IRKɠtTYKNK,S BɎ&wf&7oaLo-9ŵ٨ Pbg?숰5LٙYi9R\aIhҨ} Z?-Gʰ1qOB0:м7&36q^s7X]$Ԭ ӨKi3wXRxaz4\Kر<x2>BKP"'IpC}ȽN}X6sgnOߑV~Aqv̛8L M)UQ ! eǢ;ei9{ 10m$+iw1I]7c\ɓhᢜ^ ȋߣ:~v1Oηv&d U^~O9Zcm]1OZOKwOϗ8C# E/n]~=ډT&-q%έG3ޏ+Wi'G6N}8'bNM { ںј_ }{ǭw(1/;DVK%V_?_ 66J;h$E5iYYzH֒wj؛QWƓliQrNKetOP5(^}9Y98b$@J9-x2(7Ui&D:0AMv}q\(L8,|mAzFHD "ʒd@4e t !3X鵁J=fC]/ytwW~d<[=>ew^:^lJCG9cz= 9$nBq r[sUDT ]"NA':l 8 dP^It7H6G?J Q:;Tר8X7U[Ru|=v@h=u ݓK^uU$R)S&$J/z}6>n}C]XifI>;059>-z_MDf-87%sꄯ޽r7/8,z{8]kޞ'}} Y;h S ,}F6C @;Hki??+Jt{l3eZÁ=$G5' "S{T̚#;A]S5U^Q8:CiOR9J }XyfPbCNر4Hn/K7eK]HNR_Y`2']Y/$2"p}[!b*kT]` |잯q$*LI U7rZeg #?#:ӦËhNn#8>^8m޺|:Xu}7U/Kh m2QkWkSE0P֤+Cv>h;5/4ϯ)UH|y';rp_gYtDB+7ab-G[|{*}f.L}%W`ߥٔp]Yv=\%]sXeJ䕏* dGksB0aQ|ggU;7:+ƞendstream endobj 92 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4072 >> stream xXyxS?!m8@) KpNA:RG@YTNN[RtM{4k{ӖREPΣu/-3_]_=*h%F.^,bNSߤLoqޘ\ "IbxtqčC QB@],̗&æLJE̛ asfϞfF,5>nW8yJbFF(z\ڬY32fJe _MNJ$&%%H >DYJiBlEQSܵH8sRY<;'7nNJ QI)SĤg|)T4,ZMMP1ZjQFj 5ZJEͦަ"weԋԻK\j%I%:RG ӃGDq#njKFmh~cNd\>xhdWԏmxoeBOEq^b@A|^iҘV4B Z5ѐ)v7:52A-T8ʝU DT(r㹼œ$)RC]N\GӶ2qkx̱d)Iu\*Fѝ|'8ׯfyc'Gb[?}6܆C 6jA 9{(Td,40̈5@j vmˏ,X9yNؗ޵[=/8 8ZS9<`c*Oמv E"g($%WM /!ABT_(ܽjZA#c&$C/:Ed4z#|_u_߆b.buc9duI(踗^E,^EĻ`V`Pt~e3sßfC}ṡPO:?.?x:.Bx4Mc0zq\jChĞln7ޞbKbe)@sY^~S/fک3Z˼ic ފS4b7o;U_ޯ`Rx5&г]@Zhw H\mXȪGP2Ud>#^Ey &]KZ<+ekn6?Nٻ %kJ'Wfw\|kZ=>\H1go6iݚTxnt4蕺?YɺόsB_o6ҥ^`ެ@cI&3mN]],o*ި+n.~64CWf"X5weG;l󹾁>kidE {QwV']*0`42+cw䄡 x]r(Z)a` [lV%/$,22 {|!"\} zNzZ2XF,"qk\/*/Q#O | "𼭒VաkTބ_R#q_B)B}Q!dtNkmtKb$F}z{e(jXsS҅c7#Bx_8eVڋ< 5-!)S'8ULVI?P1tf֋xD~%s DIubM!&dv ߿jɴ%;n|כfgB hBM!v qh?<]V@pDˢyKsؖ9Viz$=!]bE=k%!}}#q VbYgT##Gk2* J&@c( _̩LjӄGAsZ6Nݠp8 Bh6H ; #Ze-.r~aLjXv5ÒӀ8. ޜpnQ:/BT<ت$YlddvE4djf׼x !wvf;o |r8"|Xf H~kbTJbSbӶ&@&H˵݇|*xnUl΁Ff5t֒xC[% 띮n۱%f٨ck:ɤ0! p6.yH{`P5 |>8tQ0J ~4q7;[]=#ޏ^ 0~uNzvۗ|C/`-xVc~B ڈP!*aYum@B#Ku_\^cel(:NTOE/}\d^GW Q?gB=[W΃dMPeΫPU74Ih ?er xO =-Z2(,ԊH2ds2@tۭmk\ry΄ny~3å@#H(=F zMb0<2@ .³a9~3\&wvΨ|5mlRNj w}{oj@1T NOcOf]Cv;T'.| $JHztJ++HKQ\᳋7=LZ-\m(jDw$c39+ 967aTDx-cYRjkRTm ^?%J [rx ע{b/K7/P[N7d e(GKRhR2V+U'A.=~tnhr$);N㼭mv̥PvZC+O}vmP |=z<M8zL"wAn4kOcM3W Śl(5'g7d+)ml9žF/;P#ْ0k'Eu4#qTyݺm>-;+Sb~hlJ 5*7!(<02$ۼ+zK܁JϞKz~p[l &_Wr&YLFNCBT\Lߙ}i7V3'Г76TҺ<[ss|F߹yK8( Nh=IdQ_7,{$:I|w{uoehbEpZ9nY,LZfvK HqWD9ûs7I@whX4AR2='8Cp(}JD$T}yѰ`mHIft77lU1=yyvTVek'[Si}8i"|$]$^+Q:%n; U-M{_F;r!:$+I3y-{Z[W݇|0η؅u"5;ft+QgHE/ٷendstream endobj 93 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5714 >> stream xXTTWkzAͽjTbĮh HQDI2tvP(FF1g%5h1wI4뽷ނ{9|>ʨ%D6..3fj#ЌyO;!˖uq04H5N,C`PJ($J޻$=,g̟?Cӧ7_So&&!~<=%R^Ii,[w/<[e)i"_b\gM!`؟UKl 8hxEJɪP0pw{NGO]kvr^oigD͜5{yV/^hb-S>tJQ('jڲGƌŴlaףW.3h̶1%c5elDST` kv!+$&']{M}$߿?!u`d s:ld$X4㌂ΐ;Xj;J\B\8ztTAd:!Itq9 E`K?h;*qpݫhy*pW ~PCZxQlb5]`::xܬ.O=aqx.c8޺q)|H%zY9{L&W=@%n+0l >ßLyO0[kpӯ/^%6|J!s[ .K @1Tuwƃ.͢O^0ZS{)i/c]xjQ '0d㗹nO[PɟѵkسoTfLY%yW ejk?쒅k C3aLf<6:jdD"~xl.V dNcΖj_΅+w}L`1&&꡶*%t6]Wxm tC >; Nk_+=dOӟ%8<.ˁD͟+b!΢-WriN,D'jxC}/hU(U{{&(qaU]ڐV ‘!i78žvO}f=e6k i_|{`mY%q2 mWoKA=TW$I oTjPcMPg~zjiOc ׾{E " U T 1:T n܁$/m zyD .+;#1Ȋ`4*`u'oz[ j6{kj߁c&2N"㛥B䋒cV&H4z#u-OJS٧(=r^k陌z")1YE2Tr0L/P!87o1nQU-R(酊"T>"Եa"VF+B/JSSKUPXzv4ow%*)=+b+JA͇̚νy=uL1n5@Pܒ ~5mZi`em~}$(^, gx .;GsmwiT t]*Pj͗0}iz[d>ҵ2]rvXm78hT÷wE;$U%[Bi`2Q*J3CA[٨,"$'ukB7N։L,NB\6˃3צQԴ<>'U2ܛҲSUQRy"ڎ`y$[_]G;T s ƸGngd'fCIjf\u"*jCo ]2Qǡ:?(ׄ)D~q;qi,/,7<hALWȻ?z uceA!`t;БiSp<ůO*x7ٟYLuجN5I 4}a(1vG&qyA埀Ei7i=i,8kD}eAg OS '{4?cIt@Ef6 tH*Dd0ceVx]R8BQaO s371}:I#ۆ6|D`6oÅtRw4$z΢Qg3Ew-[p+ZZ>`K $g~u[H۬+KRZ]b3Aa*sVfn`a( ̕'?<;9  52ږop޶j*OX+U.P:g|uE+223s薘Շ&Dא@LamncET:d7ާ;71ӗ/w7"=aN=!//܇ x9nvܹG8u߀_ˎ-j=PWˈy,e-E?]YB32=VYY^g tdvq3RrEFbq~d奨"[/"gQ8bh) ORd$񇬳PԴ.Ŵ&@W3UUՏRJ oFb$LtCogXkNjq1βgO̽e/)z[Du6Pgwȿ»4.싕W&I NHL#g;Pv|-?"&!26L O8m޼iZ_[ hfk*02KXw`Mz';}uush-ErYkZwfne!Q\P/FNslgNs1CǷuj} f>2o+{m1HLT:B2Q ^.o\B0р&J~ӝylA' ׈i{F>]{] 1kP~NcVY+M}ޏ0ixA٘tɰ}^ځ 5B`4;rW '/ 9mC~P$Evը"ߐj@?E:7k+e^hc.-5bƖjd"-٢f|}vdRpV3Af$reDaT,">wOILIDfe%҂,}Pڮ8LɄ#ja40,/W^-d{lbuV 2[l 'ȹ>6$G &"?pz׵t\YtSy-BDEs؈b/xdKd _>D dz[)֚͞]^U\_:ڪB̃g/\~+񺸄k5WtU6kJeHh0:Cئtށr`f;lZY.NW+|fNFn7j0?;9 w`WK5 pᖥ>ZJeyH5^[KwF&Ԥ+u?fХvAHdbԖ2^E~N%$uO%1כ()-6 _E:?U33'3ߤ@?c0zf|%nx|D*Tl>~$')%II( /+>~l&E~Lp8$kc EQv2?iݛgVY϶s.JЦ97b8,Cv \K.> @v,DE6 E+Œ= z} sV ėp])ܵV =[ 7sZX$&i+CLIyPch &wjP^E}wi(ۄ yx?dKZPKk:f!l=e sr X#w41S(il@C'!>1Nf%\"W r$H{̢|=9z yq~Ik\u ,ч ?<꫎DduJ 7Џ "YzG[~f1i \V;y5 Kj JʖK^>⨄$?7 }F*.[-N4Ӟ&ny}t%"$؜Xţ6F3$<~rL, 0 յT꣜nݏ{-^To,f$aYf_-}|?Vq@+XR%|u,wzNj:1'ڰ7hpN l_戄Ԩ$ĔDֿS>  nQgszĄco٣zPyrGҺ^@ld-BKsD#iAԃSqCendstream endobj 94 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 387 >> stream xcd`ab`dd v 5070qH3aQ#UA欩8_c7s7߅ ~.((j蜟[PZZZ&X dgg&d0000j10v2012p?ÑNB'$.+D'L\4qJ}7GUmueᲶ-[+UoHHNl)h.䨜Y=g%ȭZzuu]uM]Mݍ3j͚5uNUImߚ`JԦsfΞ`B$ysf'2osNZ6{)UEU@9ee9e9_sNԚnƾƞ&)=u}uu| ~8;s1)rq1Od`Vendstream endobj 95 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2078 >> stream xTiPSi}!{ڈ 7ŒaP\ \Fv`HdrDE HFEivGv\l[zzFkVKom*LyK}s="ՅD!kf }8Nj8'D^t@^4aOWO뉏Gxa/ԌFهX$R䆨 q锘Ҁ@?3ruBL) i FIFbtO5yӧ)*u܂~Mt!1I?oEPHj=L}FQKerjNFS㩉JS5vy&^/6HϦzfS,f6>;q'M 4""^}["[Uܡ> נbن5,ok@qnRnMP[\`{isKoȏ%`)D0vZ _xLKupOCti#0Eɴĕ<T-SLBۺ:m]ܺ6Qcէ0BәTy7[0ݢ#cq=k.:B1.?LdC^:OW^j4VUq&W3X?գh9l=(;HF/2t?$8c!0SUs '-˭Ѱ)_Lՠ%5%jTqneqӗIv2 W A BFh2qNMe:Z뎥JNάu8҇>Is}t"M&>I={>|z:ׄee{A[T_)F\? _Q`[X^pW,eo,'yQF$w7MbyD4f/2^MC=ϡl (_{a4jZ'ѵ7|;ꊏq;6Zk&k {*FB VVN뫀yw-M]˷h-=.H 09ʪV4ŦFG8YX X؂(ܲޓ Ir{ꪌÄ<]8e׽Vnu 5l6-0Mȳj6uЂHp`?C?0;gJpSQ8DWt Y9D9ƩyA@Ww?Vo,`΢wF9a73l?OXR_yַ˷A0lٮ g$_dPη, ĸ)))Je]VWgㆣz|?s}qGF><҇E|.= [o8 ?&qȗmN; ?BKߓidLV#GG c .-'1)`9Ikp!q!CQ>t(bc~*0!Q.dFitSkvT|ٝD#>FV{0EQ&endstream endobj 96 0 obj << /Filter /FlateDecode /Length 2789 >> stream x[Ks#tMc<Jʺ\ Ml3&cn f=ăݍjfgw{lv~jC!awN)1;<݋K ޱ^δ5ej IŒu1ipυ?KNsAG&k\35YM.z NPUSdSɚgO{xY>quT{omΖ`k>;<+ڐ_[Dbə008Q3FZY,a]ut.')wsFZ]$t .@6c$ %As(!ѝ ܄hn+ W  ϶NNd:˔;ǩ0;O"fQ 7&3"9l9C#<)Eڇ:Ue,q7Q2ZV3ӥ4jEb;Y/=*^(5KxM/*'좇<`#|6 m+m>2 A= ~CJdd U{H!VPJWE4exj_e#y7]da~CDF!#FO]e '0 (I rn [JbxA_;ibת-DA)G`uL188mUq&Xn& M5OxFZK{CXl*u )Ɇ|^4Pi4׾\ O& 77LAw.YN* $5+5Rabia,hz4vENB Qu.طչp!ۦ HT*I/ 2lݢq]$Ò愑Ce{vùTt~^oq>̱մ BT U n <٩8p\9dG*IBu+3aN*QWcP4jӣV "Jע 5eNk})f1vaK ǫp\ܚuuhNZ[Q$wnGpxl#zWpMCK3 S.iM&=j,z6 YΌPv'H`ekd\?յAxB1HZ(Uڄ hIvafxd:__P.,~;Q&ϬRKpѹҦ(sCW~#kظO4WhaM( . aȀm3I-2^ئYf,h Rk  'Bx:[2J!\q_)*rWM!&~0Ο3N5QDH  (?bvbd5_{I"u9 Y1S_2^@+KXlt~bi3>TtcDE-o1#~9"5y_'~IjsF7ko> stream x-olu3n;5glR1]s6n.]7R=@ Y W`p3QY7ԺgјwFa~y{I>cndAY:KO>5َa_{/b_ՠ{ ~E0-o沟qX8584 yy:lXe. ^ Xv@0y>' úwퟧ3>/KiT״<3s,|Sk (=p+ W06?aZSŰIl OS4X_SJ)%gcUbnhKO/31Q4)/` ]^K'$\T{-8'!O-zóm!@(D+*r`35V|?Y߄\Mivώx$8=5C"EiZϿ\#dv.gYSb(} -3(Cqӽ䶻6v%k飖9|36:ӹVnJcJBGZ2yY"U^qy9^LhRJqCU T$(.ۅt1QcTȥ /Q4ڛ/4jBFPN(*#dH%/S }[5)2d: gDXWCy^q)XIV&tL%!d ?%淐<(Ud CXh>R0uyjז<,IYsRDg<8+X"_HgϽ:݉oBߖUfw 2bF֔C_֥K;?OSO`sje|XԵ!htDWzŰgendstream endobj 98 0 obj << /Filter /FlateDecode /Length 310 >> stream x]An0E`cynhU6C"Y\!xP]/y}[ҧ8&%)ܦu9Li5}{_W)Q c.Շd X$[?ߤ8 Guo(! 2.!d\tT 2V"ڠS@{)(%QXkq:A]cj"&*j*T$"8cZ6jф@9`bLlj:$PNԵAT%PӐ'hⵑg#&^y6x7M9,sds,ɺUendstream endobj 99 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3247 >> stream xVktSeN [(E93X. Rro4i4I';om^RR %H+W)B xT,#|~=zve9:?$?oe}yyrƏp +ssd-{bfp'y51=əbٓ5~ɀt9OE?t.W2N_0o])k%E9ffeg/hRd,3W,HJGiپR9'XnZ=_,/S8w^DYYR!QTJ 3WʔRIC.+eRJ)Qd %2qXWJJbv-Kb\,/I%EbTVp˕ %7Ҝ_Ep889[9dqqr^LD+ܡ!gf ǂ,ufPSlw8'j F/NWbԗ5XlC(wl2VҤ+wnoq@fqnH'3Ijf u>O?OcO㧞ocj$@V m:@S)_3D3F{ Ŵ~4zŝ #$Nlɜl?xbYyTvd!YF?)qp čYH~ǼeZ@k9L|*\~D ` QnIhL[t6Rn{u[~#܅F}>{# ~b8rvh [ҹk& K2 f0ͬ>(w~xł :>B/[zͮZWWG+E@]~_3DKv-؏1EPnpmXMu*j^o6WVZw鯏#_0Z߬R c5Bf0sqAy Or/xG7Fh`{k&;ADHW0N,*P `'6QU^:s@Od +rHMXH s?CN ;+eꊊ6u[gEY]Ĺx|!8Qpah1H/~Zvs Т 8>2c)K08ϼgja/2un%GSkM`avcz;!/0ҧF 88>^4:XF068Ov:ކZvVyhUxIsrr**? t'ZnZKx,qi,'}+Y6tl-; ą llmATUQ Wߦ64D6VZ+Y|in6npqN?:{:qb (堠@8tl45:3F4O?cЎ+ 0/zċkm<7P@~DOh4/ݽKqGa؃}&`=l𮪏 i}9Q)%q֢-oMhQj|0%찳hx u =qW:/[Вv -*}aU{͢uy`!jChNOojz=vXl;NAZmP-[h3>H,V7>`ISc-z4-&e3-W%o`3}8Wxw)s֙*jJ{? 22TlIW[(ckl el◤/[5%,fE9ޗoSџzu'η4EfL< wCnQ[GicӎA56`Y4X7 ӋazMgՀĆϜhLFk5kݪ;P"1w +>gmi=<5p^`];oP,Di|9_^ jsN$cMp]l,f+GzpU^vp졽>!rځxZx.4VET6[a8)꯭A秆;P :{xi> stream xmT{lScB"vr^C K) %fK:J-Nb%&8q}Q$5*AuHCvYTԭ'TAgtts8=' @ }b{Z=S-o d(Bi3>!H ݎNAjm˛߲eZ[jVլ+tmJB_wu6:|[Nyiݺ SۺM[+[vv RgóS9Sj-JmAKk_5T:A$#ʉuċDQEHdbbXJ"pfJ^tJH !湚TJ4[> RT"pƘ0)}6<zVQ3QQʊGDfi~2qw0Ā BƷz3nNbB5?I >}aDa "&0'vGzud؄-Tm@O"CCcc(UUߠ|D[=Fq@ϭ^k!CpYGu~BlXD$hQ랮C;|2op :c9CEޅ[@s݃}XI:s7GI"Rծ 3N|fKKe:ܺ*Dg Q㠮[}h8vdb|«ҷ11y';z)$O'A3nkSS35D6Mf>+`<|q-7f# Q7ռOY^3)@uP򚰰BYmnHLwN.:6;k6U+VhYF"l8m dh*GDGKuD[⺈:0\%o߿}KYh .fq_7錺c@x(B͢Z x;oK㲅Q= v;?2,gq29 c|mvBnzC6LWH&fD'`jiåKrR7Fendstream endobj 101 0 obj << /Filter /FlateDecode /Length 220 >> stream x]=n0 FwB7eKdHLQȂb}H x9?9-i1P9NtOٸΆnzӜ.@q/\Wn9гx̱m#_tb{kϭBiVJAtՉzPX{Q%PXց [m(ځUAꇾ@ŵVʋ&H)_e.2eotendstream endobj 102 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1083 >> stream xmL[Umcs/u 0 10K21a32ZZʅR^&0 ʛ|XDf3Ĩ1qw>3r B6?!mZ,V igM|jQt8x͎l\Q~cgz(XZxVtD͗:wZm.kq+PKi"nJ2ᅦ--uܾ)7q""W**8\{8(b$ 2!cL?3 ";& -&zJ5@ͫ;_%NsE. pWHtkZGcwV-6oBB]C?? ޻|t‹W i MW9jш I~&h'3+)_/C7H0n/VS"; كuj"I|ǻ.2S6hh eh}lX['KO4> stream xKs7\8S;9ABHHLؤ 9Xl*> laƋ30B9b94Ӯ{f2t5IzhZgfP7Z4?Ž5X0Y 0,2X,gˊ3*ʓj)MyPZY 瀮|S g^3͹|pA8ͥ,ʋHiCӖZ-ϢJ',/kS륔T!ϼVq?Џo4 0j$RZ( +CL-uy҆Y<=  cww@44s? Wiפcܒwe K@epŸ0ֵK/n9WJGv]^99nJĶbVvmk~e{=Q+l+70l3e㤧cG:`\45zh"hV=Bb_UZ"B8֕?u [Dkԓ 1Pm *1U*!鳘ZMOaJxHD`W!86Pe+$oPĂ#@+<Ƒ1ZXR> QF}X@J D#@#E'Lv#C/mLO6 -YTG$N#Z0@DU8)˅ o*eYL)ήOtiǨwy3S!R#x J 22Z You =8)J _Ys@]e!r `9"Qd@" "2R;T ː(IظdԦ̥B2`Y]Wss8 3_7螰C'%.-K!Fo`0kU]~d'H xSh2HvP0f v2en?`)Cg\ M'{庆)) nq 2&FƄ5z'L8ɔPkSXl+Ka=:C2Lŕ72/,.KD^]0#uRxE sE1W<.-n{R" XZ iŴVPP1Z\%LIm6)Dъ*%L5L_Uj֥{ i%VmjB3?:j;2T2,ʣ` [ T!2+9Zv6:%qAm7\/av-rPm T %,Уu>cCN0 +*EHTЮ g+[ą}qJ2W\m<>#'& c_pE邉VoW+ +pZ/q.<;f!M ;񫅭vͫlf~#4b[McEs2+I*5VoM4>. w'bDVtgL6dH5 I1'D a/E&Sl9d:= | W)ő8?F.jG#׸ޮa,4 ҋQJB y"N^7]Z3s&Xj-&$ŞO_O ;Rsj;77δC(DpKF"rփKm|]NFrXA.ۭ[.9z\i:1ߐ-cS&1-H6޷؉:Oy$q! R*~`xտw*l~l)>v|!? 5OvV0GuiEc,~ k_ &i9*d nҿcQH6'ab4~($mo?=!3I+ނ5ԫ^z[&FF뛏i X$_""Hc] )m:J!znhd/7Udzʃendstream endobj 104 0 obj << /Filter /FlateDecode /Length 3204 >> stream xZn}_#ynDy6 ő A-QE >6sY+ v.N7 F9)ϯw_?qxum'l~rҌRF1;;ܨPv÷e'U~qpQz'Hn4nuÚx҃ 2d:E i#R3݊QKv-݆R.1"W&' 8Nj7\AZeF!pqۿ_vGmcĂީ)z^I=`L~ A֌ېߘQh#Ge~c?.v VaYIף :($Ji?b;1!`B؂ENe&$e-ufΊB6b 0_QE x̪R@* 5eeBSJcPHYk(.EG3AtyHJ)$|qDk]O-"qj,4 ]xDe v- PkSC zz6ˇV8s2@;f`=/e |*Mu^Ct<r jZP!K暼QA |g;3@5eB,y'ys>q>#Оgࢄ,FηRPdCl.[R擔Lй)(:RxZBz0*8EwIʹoHs&[ԆL wp֣^X9aWT5]Vʁ4ߝ" D4ƤlHj&3Pm\yZ[cg9Z<3w, ԿKBޜ"ygż𝩈+'⥾"UX/ʰ",Tay<<+;-5׾k=ڼԈ wP ۤyu_i99PPJX/D*횪j\9/P-5i]R(+%Y%,XǮ ;'M\82Tdeӵ*ʼlBJLTiv2RՆ3>4PQcA,u5ß :- LGکxF fhvcRa#fco:8I:q<,6 ǫ#RM ~>QAVa9R OC7Iz5܃ X*z<z3`E\#kB3B͜+hm8/_WwV#j̊ns rԦN*>L)%R'$BYk+4ZvZVmHU Ow:]OG/PdhZ!2ӳ }ѸH+;'M/ ~)S}bZy_L5[þʚyзd>+=$k^+;'M^GxshK-#P~PkSkO{p%Tt.-U,,sv ;fprw_wxcL)(KBR@׻(vH9D#"w-`Ñ.OpKvBFk@_Nj~Mꕀ41ݶ:aLbآ?zf̶ሐ8 '+ݿ.Rxe4J?I㕷k#vqxet@? q9%R 0"P 歵7O f;YKasÿ%pyI<= OZD/h^ށm.6qɣ`Ƞ1tSrG/b#lOFQe/,$ㆱ; LosٮT) ׇzBbqt)*J.pBGE.ӮrHɁ`P%DyjGka<^fJWK<NLVhdœJ_U^!J}e3WSYs+)ov| ~iRu s-T!*@P8jDo׳|-NC!dCykM7;}\v՗Q=׎ aF)Dׇ, 7a&SMyұO ӫo'yb"?l:0ԛͧ6ZF?j=G>C}t3LoZ&/%i=Md]{e~ٮ]vbTAv1c*.E?ϗzN4H9rDqU"ŋfOfN|ۅ+miSi9)9H .S:jDo^z"݉/[Rh*>y~HqNT-ʒ` 6JlÉ?jBKtGl?l6m8ZO(l%4Q}&O5ExT>n*W~:x"<5?0ko<5c ؁xz6Ƥ?yJ9$\H)p-=?լ˼j ݋mxQE /F9Ld Zut@eim}\HhS8G3f3a;qD~4[GS mYR*ifNm_HQ+4uҲ8CuP,3u03\x> stream x{HQϷ;~岚4k[$Qt1(%/PE.jtt&egiAV",f"QietAPAq8Z><<0 #YWixZds^[QIX9BH,:(n*6O"IVn; 7{Eg[iKe Eş"KcҖCGF_VnMZCQI2J^ת!Ĥ+ f)a@B10pn~,b>qJDZPO,X}aC>&䐵l@VSYh;n;!!;#H/:HZTle/ nJ ! 2[ip l ᇯ䩹^~ju.EIjC>#nSToL.˥K Д dԏ*؃_KkF-{yK RӨ(foj'5Ǜw<ݮ1 T]qqow > R 9y2RlNj:yt_yq:KU&yntuw>Ǚ=43~m>v.DJY% 2dzx'_#*x‹2&vJ`;N nkw*ժ#:X84z1a r_3(vFp{a88ۮk/&Ob~a}endstream endobj 106 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 340 >> stream xcd`ab`dddw 641~H3a!O/VY~'ٚ|=<<<,k-={3#c~is~AeQfzFFcnjQfrbobIFjnb ZRaQRR`_^^[_nPYZZTWqr-(-I-ROI-c``` b`0f`bdd{=ǿ<h%qձW9+<(}}!g~Wd{7<_قG,w4\׹Xps}*/ʹ{endstream endobj 107 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 206 >> stream xcd`ab`dd v 5420qH3aÏUA欩6_c7s7B߹g``bdSu-(-I-ROI-SMCd`````(`eB ʅ|+YgحġuK;G? /x76i?f띵wh7{r\y8}hFendstream endobj 108 0 obj << /Filter /FlateDecode /Length 840 >> stream xVKoA {Hd= 8P҆P?nn(l}{(b׽:o;}.v I$#7_}:}HQ']~6I:ͤ>+r!۬Vk؁Ψr >%ʋ@˅5^կU9&uMt)*slAT?f)ݪ'OXG`j0[Y8ACH>yjB SNL `*7a[f\8ʟ'ȫ՚HwI}` C؊`깥#pBŏCp!RPYQL%j ]g%On~_ec`* 4Ib#XGkktڹ(]tD%Ο=瘠-Ex 2p%*E>g<tL#k.Y4'&42TI@ɠ6:&y.34.gHX2u$SAs/Gd`9 3FG"ܛ 0WעxvU%ee)G(>6Dd"fUPx$l2zj7|0cLvoDD uK90%MOMo7GE7;endstream endobj 109 0 obj << /Type /XRef /Length 133 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 110 /ID [<902ba2aac7b870c0a97b9d5678793fd0>] >> stream xcb&F~0 $8J+?ߞM@6{:(~H Rx.X R k/ L?@$ J'),~DrTH=,^$y9Alv_ɨ "YHs``j4@$Dx endstream endobj startxref 78694 %%EOF phangorn/inst/doc/Ancestral.R0000644000176200001440000000646213502203676015663 0ustar liggesusers### R code from vignette source 'Ancestral.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: Ancestral.Rnw:44-47 ################################################### options(width=70) options("show.signif.stars" = FALSE) foo <- packageDescription("phangorn") ################################################### ### code chunk number 2: Ancestral.Rnw:62-67 ################################################### library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") tree <- pratchet(primates, trace=0) %>% acctran(primates) parsimony(tree, primates) ################################################### ### code chunk number 3: Ancestral.Rnw:73-75 ################################################### anc.acctran <- ancestral.pars(tree, primates, "ACCTRAN") anc.mpr <- ancestral.pars(tree, primates, "MPR") ################################################### ### code chunk number 4: Ancestral.Rnw:82-84 (eval = FALSE) ################################################### ## library(seqLogo) ## seqLogo( t(subset(anc.mpr, getRoot(tree), 1:20)[[1]]), ic.scale=FALSE) ################################################### ### code chunk number 5: Ancestral.Rnw:98-100 (eval = FALSE) ################################################### ## source("https://bioconductor.org/biocLite.R") ## biocLite("seqLogo") ################################################### ### code chunk number 6: Ancestral.Rnw:103-105 ################################################### options(SweaveHooks=list(fig=function() par(mar=c(2.1, 4.1, 2.1, 2.1)))) ################################################### ### code chunk number 7: plotMPR ################################################### par(mfrow=c(2,1)) plotAnc(tree, anc.mpr, 17) title("MPR") plotAnc(tree, anc.acctran, 17) title("ACCTRAN") ################################################### ### code chunk number 8: figMPR ################################################### getOption("SweaveHooks")[["fig"]]() par(mfrow=c(2,1)) plotAnc(tree, anc.mpr, 17) title("MPR") plotAnc(tree, anc.acctran, 17) title("ACCTRAN") ################################################### ### code chunk number 9: Ancestral.Rnw:132-134 ################################################### fit = pml(tree, primates) fit = optim.pml(fit, model="F81", control = pml.control(trace=0)) ################################################### ### code chunk number 10: Ancestral.Rnw:146-148 ################################################### anc.ml = ancestral.pml(fit, "ml") anc.bayes = ancestral.pml(fit, "bayes") ################################################### ### code chunk number 11: plotMLB ################################################### par(mfrow=c(2,1)) plotAnc(tree, anc.ml, 17) title("ML") plotAnc(tree, anc.bayes, 17) title("Bayes") ################################################### ### code chunk number 12: figMLB ################################################### getOption("SweaveHooks")[["fig"]]() par(mfrow=c(2,1)) plotAnc(tree, anc.ml, 17) title("ML") plotAnc(tree, anc.bayes, 17) title("Bayes") ################################################### ### code chunk number 13: Ancestral.Rnw:172-173 ################################################### toLatex(sessionInfo()) phangorn/inst/doc/IntertwiningTreesAndNetworks.R0000644000176200001440000002117013502203725021577 0ustar liggesusers## ----setup, echo=FALSE--------------------------------------------------- # set global chunk options: images will be bigger knitr::opts_chunk$set(fig.width=6, fig.height=6) #, global.par=TRUE options(digits = 4) knitr::knit_hooks$set(small.mar=function(before, options, envir){ if (before && options$fig.show!='none') par(mar=c(.5,.5,.5,.5)) }) ## ---- eval=FALSE--------------------------------------------------------- # install.packages("phangorn", dependencies=TRUE) # # install latest development version needs devtools # install.packages("devtools", dependencies=TRUE) # library(devtools) # install_github("KlausVigo/phangorn") ## ------------------------------------------------------------------------ library(phangorn) # load the phangorn library library(magrittr) ## ------------------------------------------------------------------------ ## automatically set the correct working directory for the examples below # setwd(system.file("extdata/trees", package = "phangorn")) # for this vignette we create a path to the files we want to load fdir <- system.file("extdata/trees", package = "phangorn") ## in your case it may look something like this... # setwd("C:/TreesNetworks/Example Files") ##DNA Matrix, maybe not needed woodmouse <- read.phyDat(file.path(fdir, "woodmouse.fasta"),format="fasta") ## RAxML best-known tree with bipartition support (from previous analysis) raxml.tree <- read.tree(file.path(fdir,"RAxML_bipartitions.woodmouse")) ## RAxML bootstrap trees (from previous analysis) raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.woodmouse")) ## MrBayes consensus tree (50% majority rule) (from previous analysis) mrbayes.tree <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.con")) ## MrBayes sample runs 1 and 2 (from previous analysis) run1 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run1.t")) run2 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run2.t")) ## How many trees are in the MrBayes tree sample? run1 run2 ## Combining the two runs and removing 25% burn-in mrbayes.trees <- c(run1[251:1001],run2[251:1001]) ## NeigbourNet Nexus file generated by SplitsTree (from previous analysis) Nnet <- read.nexus.networx(file.path(fdir,"woodmouse.nxs")) ## ------------------------------------------------------------------------ par(mfrow=c(1,2), mar=c(1,1,1,1)) # Setting plot parameters ### Plotting trees with support values: ## RAxML plot(raxml.tree) nodelabels(raxml.tree$node.label, adj = c(1, 0), frame = "none") ## MrBayes plot(mrbayes.tree) nodelabels(mrbayes.tree$node.label, adj = c(1, 0), frame = "none") par(mfrow=c(1,1)) # Setting plot parameters # NeighbourNet plot(Nnet,"2D") ## alternatively, # plot(Nnet,"2D") ## ---- fig.width=7, fig.height=4, small.mar=TRUE-------------------------- # create a vector of labels for the network corresponding to edges in the tree edge.lab <- createLabel(Nnet, raxml.tree, raxml.tree$edge[,2], "edge") # could be also 1:27 instead of raxml.tree$edge[,2] # Show the correspondingly labelled tree and network in R par(mfrow=c(1,2)) plot(raxml.tree, "u", rotate.tree = 180, cex=.7) edgelabels(raxml.tree$edge[,2],col="blue", frame="none", cex=.7) # find edges that are in the network but not in the tree edge.col <- rep("black", nrow(Nnet$edge)) edge.col[ is.na(edge.lab) ] <- "red" # or a simpler alternative... edge.col <- createLabel(Nnet, raxml.tree, "black", nomatch="red") x <- plot(Nnet, edge.label = edge.lab, show.edge.label = T, "2D", edge.color = edge.col, col.edge.label = "blue", cex=.7) # the above plot function returns an invisible networx object and this object also # contains the colors for the edges. ## ---- small.mar=TRUE----------------------------------------------------- # the scaler argument multiplies the confidence values. This is useful to switch # confidences values between total, percentage or ratios. x <- addConfidences(Nnet,raxml.tree, scaler = .01) # find splits that are in the network but not in the tree split.col <- rep("black", length(x$splits)) split.col[ !matchSplits(as.splits(x), as.splits(raxml.tree)) ] <- "red" # simpler alternative... split.col2 <- createLabel(x, raxml.tree, label="black", "split", nomatch="red") # Plotting in R out.x <- plot(x,"2D",show.edge.label=TRUE, split.color=split.col, col.edge.label = "blue") ## ------------------------------------------------------------------------ # write.nexus.networx(out.x,"woodmouse.tree.support.nxs") ## or we can also export the splits alone (for usage in software other than SplitsTree) # write.nexus.splits(as.splits(out.x),"woodmouse.splits.support.nxs") ## ---- small.mar=TRUE----------------------------------------------------- y <- addConfidences(Nnet, as.splits(raxml.bootstrap)) edge.col <- createLabel(y, raxml.tree, label="black", "edge", nomatch="grey") y <- plot(y,"2D",show.edge.label=TRUE, edge.color=edge.col) ## Write to SplitsTree for viewing # write.nexus.networx(y,"NN.with.bs.support.nxs") ## ---- small.mar=TRUE----------------------------------------------------- cnet <- consensusNet(raxml.bootstrap,prob=0.10) edge.col <- createLabel(cnet, Nnet, label="black", "edge", nomatch="grey") cnet <- plot(cnet, "2D", show.edge.label = TRUE, edge.color=edge.col) edge.col <- createLabel(Nnet, cnet, label="black", "edge", nomatch="grey") z <- plot(Nnet, "2D", show.edge.label = TRUE, edge.color=edge.col) obj <- addConfidences(Nnet,cnet) plot(obj,"2D",show.edge.label=T, edge.color=edge.col, col.edge.label = "blue") ## Write to SplitsTree for viewing # write.nexus.networx(obj,"Nnet.with.ML.Cnet.Bootstrap.nxs") ## ---- fig.width=7, fig.height=6------------------------------------------ Nnet <- read.nexus.networx(file.path(fdir,"RAxML_distances.Wang.nxs")) raxml.tree <- read.tree(file.path(fdir,"RAxML_bestTree.Wang.out")) %>% unroot raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.Wang.out")) bs_splits <- as.splits(raxml.bootstrap) tree_splits <- as.splits(raxml.tree) %>% unique %>% removeTrivialSplits # we overwrite bootstrap values and set the weights # to 1e-6 (almost zero), as we plot them on a log scale later on attr(bs_splits, "weights")[] <- 1e-6 # combine the splits from the bootstrap and neighbor net # and delete duplicates and add the confidence values # we get rid of trivial splits all_splits <- c(Nnet$splits, bs_splits) %>% unique %>% removeTrivialSplits %>% addConfidences(bs_splits, scaler=100) # For easier plotting we create a matrix with the confidences and # weights as columns tab <- data.frame(SplitWeight = attr(all_splits, "weights"), Bootstrap=attr(all_splits, "confidences"), Tree=FALSE) # we add a logical variable pto indicate which splits are in the RAxML tree tab$Tree[matchSplits(tree_splits, all_splits, FALSE)] = TRUE tab[is.na(tab[,"Bootstrap"]),"Bootstrap"] <- 0 tab[,"Bootstrap"] <- round(tab[,"Bootstrap"]) rownames(tab) <- apply(as.matrix(all_splits, zero.print = ".", one.print = "|"), 1, paste0, collapse="") tab[1:10,] col <- rep("blue", nrow(tab)) col[tab[,"Bootstrap"]==0] <- "green" col[tab[,"SplitWeight"]==1e-6] <- "red" pch = rep(19, nrow(tab)) pch[tab$Tree] <- 17 par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE) plot(tab[,"SplitWeight"], tab[,"Bootstrap"], log="x", col=col, pch=pch, xlab="Split weight (log scale)", ylab="Bootstrap (%)") legend("topright", inset=c(-0.35,0), c("Pattern 1", "Pattern 2", "Pattern 3", "Pattern in the\nbest tree"), pch=c(19,19,19,17), col=c("blue", "green", "red", "black"), bty="n") ## ------------------------------------------------------------------------ YCh <- read.tree(file.path(fdir, "RAxML_bestTree.YCh")) mtG <- read.tree(file.path(fdir, "RAxML_bestTree.mtG")) ncAI <- read.tree(file.path(fdir, "RAxML_bestTree.AIs")) all_data <- read.tree(file.path(fdir, "RAxML_bestTree.3moles")) YCh_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.YCh")) mtG_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.mtG")) ncAI_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.AIs")) all_data_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.3moles")) ## ------------------------------------------------------------------------ par(mfrow=c(2,2), mar = c(2,2,4,2)) YCh <- plotBS(midpoint(YCh), YCh_boot, "phylogram", p=0, main = "YCh") mtG <- plotBS(midpoint(mtG), mtG_boot, "phylogram", p=0, main = "mtG") ncAI <- plotBS(midpoint(ncAI), ncAI_boot, "phylogram", p=0, main = "ncAI") all_data <- plotBS(midpoint(all_data), all_data_boot, "phylogram", p=0, main = "All data") ## ---- small.mar=TRUE----------------------------------------------------- par(mfrow=c(1,1)) cn <- consensusNet(c(YCh, mtG, ncAI)) cn <- addConfidences(cn, YCh_boot) %>% addConfidences(mtG_boot, add=TRUE) %>% addConfidences(ncAI_boot, add=TRUE) %>% addConfidences(all_data_boot, add=TRUE) plot(cn, "2D", show.edge.label=TRUE) phangorn/inst/doc/Trees.R0000644000176200001440000002006113502203706015012 0ustar liggesusers### R code from vignette source 'Trees.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: Trees.Rnw:49-52 ################################################### options(width=70) foo <- packageDescription("phangorn") options("show.signif.stars" = FALSE) ################################################### ### code chunk number 2: Trees.Rnw:68-72 ################################################### library(ape) library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") ################################################### ### code chunk number 3: Trees.Rnw:78-81 ################################################### dm <- dist.ml(primates) treeUPGMA <- upgma(dm) treeNJ <- NJ(dm) ################################################### ### code chunk number 4: plotNJ ################################################### layout(matrix(c(1,2), 2, 1), height=c(1,2)) par(mar = c(0,0,2,0)+ 0.1) plot(treeUPGMA, main="UPGMA") plot(treeNJ, "unrooted", main="NJ") ################################################### ### code chunk number 5: figNJ ################################################### getOption("SweaveHooks")[["fig"]]() layout(matrix(c(1,2), 2, 1), height=c(1,2)) par(mar = c(0,0,2,0)+ 0.1) plot(treeUPGMA, main="UPGMA") plot(treeNJ, "unrooted", main="NJ") ################################################### ### code chunk number 6: Trees.Rnw:103-105 ################################################### parsimony(treeUPGMA, primates) parsimony(treeNJ, primates) ################################################### ### code chunk number 7: Trees.Rnw:108-111 ################################################### treePars <- optim.parsimony(treeUPGMA, primates) treeRatchet <- pratchet(primates, trace = 0) parsimony(c(treePars, treeRatchet), primates) ################################################### ### code chunk number 8: Trees.Rnw:114-115 (eval = FALSE) ################################################### ## (trees <- bab(subset(primates,1:10))) ################################################### ### code chunk number 9: Trees.Rnw:121-123 ################################################### fit = pml(treeNJ, data=primates) fit ################################################### ### code chunk number 10: Trees.Rnw:126-127 ################################################### methods(class="pml") ################################################### ### code chunk number 11: Trees.Rnw:130-132 ################################################### fitJC <- optim.pml(fit, TRUE) logLik(fitJC) ################################################### ### code chunk number 12: Trees.Rnw:135-139 ################################################### fitGTR <- update(fit, k=4, inv=0.2) fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE, rearrangement = "NNI", control = pml.control(trace = 0)) fitGTR ################################################### ### code chunk number 13: Trees.Rnw:144-147 ################################################### fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE, rearrangement = "stochastic", control = pml.control(trace = 0)) fitGTR ################################################### ### code chunk number 14: Trees.Rnw:151-152 ################################################### anova(fitJC, fitGTR) ################################################### ### code chunk number 15: Trees.Rnw:155-156 ################################################### SH.test(fitGTR, fitJC) ################################################### ### code chunk number 16: Trees.Rnw:159-163 ################################################### AIC(fitJC) AIC(fitGTR) AICc(fitGTR) BIC(fitGTR) ################################################### ### code chunk number 17: Trees.Rnw:166-167 ################################################### load("Trees.RData") ################################################### ### code chunk number 18: Trees.Rnw:169-170 (eval = FALSE) ################################################### ## mt = modelTest(primates) ################################################### ### code chunk number 19: Trees.Rnw:174-176 ################################################### library(xtable) print(xtable(mt, caption="Summary table of modelTest", label="tab:modelTest"), include.rownames=FALSE) ################################################### ### code chunk number 20: Trees.Rnw:180-183 ################################################### env <- attr(mt, "env") ls(envir=env) (fit <- eval(get("HKY+G+I", env), env)) ################################################### ### code chunk number 21: Trees.Rnw:186-188 (eval = FALSE) ################################################### ## bs = bootstrap.pml(fitJC, bs=100, optNni=TRUE, ## control = pml.control(trace = 0)) ################################################### ### code chunk number 22: plotBS ################################################### par(mfrow=c(2,1)) par(mar=c(1,1,3,1)) plotBS(midpoint(fitJC$tree), bs, p = 50, type="p") title("a)") cnet <- consensusNet(bs, p=0.2) plot(cnet, "2D", show.edge.label=TRUE) title("b)") ################################################### ### code chunk number 23: figBS ################################################### getOption("SweaveHooks")[["fig"]]() par(mfrow=c(2,1)) par(mar=c(1,1,3,1)) plotBS(midpoint(fitJC$tree), bs, p = 50, type="p") title("a)") cnet <- consensusNet(bs, p=0.2) plot(cnet, "2D", show.edge.label=TRUE) title("b)") ################################################### ### code chunk number 24: Trees.Rnw:219-221 ################################################### options(prompt=" ") options(continue=" ") ################################################### ### code chunk number 25: Trees.Rnw:223-252 (eval = FALSE) ################################################### ## library(phangorn) ## file="myfile" ## dat = read.phyDat(file) ## dm = dist.ml(dat, "F81") ## tree = NJ(dm) ## # as alternative for a starting tree: ## tree <- pratchet(dat) # parsimony tree ## tree <- nnls.phylo(tree, dm) # need edge weights ## ## ## # 1. alternative: quick and dirty: GTR + G ## fitStart = pml(tree, dat, k=4) ## fit = optim.pml(fitStart, model="GTR", optGamma=TRUE, rearrangement="stochastic") ## ## # 2. alternative: preper with modelTest ## mt <- modelTest(dat, tree=tree, multicore=TRUE) ## mt[order(mt$AICc),] ## # choose best model from the table according to AICc ## bestmodel <- mt$Model[which.min(mt$AICc)] ## ## env = attr(mt, "env") ## fitStart = eval(get("GTR+G+I", env), env) ## ## # or let R search the table ## fitStart = eval(get(bestmodel, env), env) ## # equivalent to: fitStart = eval(get("GTR+G+I", env), env) ## fit = optim.pml(fitStart, rearrangement = "stochastic", ## optGamma=TRUE, optInv=TRUE, model="GTR") ## bs = bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE) ################################################### ### code chunk number 26: Trees.Rnw:258-279 (eval = FALSE) ################################################### ## library(phangorn) ## file="myfile" ## dat = read.phyDat(file, type = "AA") ## dm = dist.ml(dat, model="JTT") ## tree = NJ(dm) ## ## # parallel will only work safely from command line ## # and not at all windows ## (mt <- modelTest(dat, model=c("JTT", "LG", "WAG"), ## multicore=TRUE)) ## # run all available amino acid models ## (mt <- modelTest(dat, model="all", multicore=TRUE)) ## ## fitStart = eval(get(mt$Model[which.min(mt$BIC)], env), env) ## ## fitNJ = pml(tree, dat, model="JTT", k=4, inv=.2) ## fit = optim.pml(fitNJ, rearrangement = "stochastic", ## optInv=TRUE, optGamma=TRUE) ## fit ## ## bs = bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE) ################################################### ### code chunk number 27: Trees.Rnw:282-284 ################################################### options(prompt="> ") options(continue="+ ") ################################################### ### code chunk number 28: Trees.Rnw:296-297 ################################################### toLatex(sessionInfo()) phangorn/tests/0000755000176200001440000000000013475602650013240 5ustar liggesusersphangorn/tests/figs/0000755000176200001440000000000013475602650014170 5ustar liggesusersphangorn/tests/figs/lento-plot/0000755000176200001440000000000013475602650016265 5ustar liggesusersphangorn/tests/figs/lento-plot/lento-plot.svg0000644000176200001440000013447513475602650021121 0ustar liggesusers Lento plot -0.10 -0.05 0.00 Scer Spar Smik Skud Sbay Scas Sklu Calb phangorn/tests/figs/densitree/0000755000176200001440000000000013475602650016152 5ustar liggesusersphangorn/tests/figs/densitree/densitree-plot.svg0000644000176200001440000005321213475602650021634 0ustar liggesusers Wallaroo Possum Bandicoot Opposum Platypus Aardvark Armadillo Tenrec Elephant Hedghog phangorn/tests/figs/deps.txt0000644000176200001440000000012013475602650015655 0ustar liggesusersFontconfig: 2.11.94 FreeType: 2.8.0 Cairo: 1.14.10 vdiffr: 0.2.2 svglite: 1.2.1 phangorn/tests/testthat.R0000644000176200001440000000013413475602650015221 0ustar liggesuserslibrary(testthat) suppressPackageStartupMessages(library(phangorn)) test_check("phangorn") phangorn/tests/testthat/0000755000176200001440000000000013502336243015071 5ustar liggesusersphangorn/tests/testthat/test_superTree.R0000644000176200001440000000141313475602650020237 0ustar liggesuserscontext("superTree") tree <- rtree(50, rooted=FALSE) trees_simple <- nni(tree) trees <- rNNI(tree, sample(10, 100, replace = TRUE)) trees <- .uncompressTipLabel(trees) labels <- paste0("t", 1:50) trees2 <- lapply(trees, function(x)drop.tip(x, sample(labels, 10))) class(trees2) <- "multiPhylo" test_that("superTree", { ## check superTree skip_on_cran() simple_superTree <- superTree(trees_simple, rooted=FALSE) difficult_superTree <- superTree(trees2, rooted=FALSE) expect_equal(RF.dist(simple_superTree, tree) , 0) expect_equal(RF.dist(difficult_superTree, tree) , 0) rf_superTree <- superTree(trees, method="RF") spr_superTree <- superTree(trees, method="SPR") expect_gte(attr(rf_superTree, "score"), attr(spr_superTree, "score")) }) phangorn/tests/testthat/test_treeManipulation.R0000644000176200001440000000425213475602650021605 0ustar liggesuserscontext("treeManipulation") set.seed(42) tree <- rtree(100, rooted=FALSE) tree2 <- root(tree, 1, resolve.root = TRUE) trees <- lapply(sample(10:500,50), function(x)tree <- rtree(x, rooted=FALSE) ) #Ancestors(x, node, type=c("all","parent")) #Children(x, node) #Siblings(x, node, include.self=FALSE) #Descendants(x, node, type=c("tips","children","all")) #Siblings(tree, 3) #mrca.phylo(tree, 1:3) desc_108 <- Descendants(tree, 108)[[1]] node_108 <- mrca.phylo(tree, node=desc_108) test_that("ancestor, mrca, descendants", { ## ancestor, mrca, descendants expect_equal(mrca.phylo(tree, node=desc_108), 108L) expect_equal(mrca(tree), mrca.phylo(tree)) kids_108 <- Descendants(tree, 108, "children") expect_equal(length(Descendants(tree, 101L, "all")), 197L) expect_equal(lengths(Descendants(tree2, 101L:199, "all")), 2 * lengths(prop.part(tree2)) - 2L) expect_equal(Ancestors(tree, kids_108, "parent"), rep(108L, length(kids_108))) expect_equal(Siblings(tree, kids_108[1], include.self=TRUE), kids_108) }) test_that("allTrees", { ## allTrees expect_s3_class(allTrees(6), "multiPhylo") expect_true(all(RF.dist(allTrees(6))>0)) }) # TODO: check why rooted trees give error in development version test_that("midpoint", { # topology stays the same expect_equal( max( sapply(trees, function(x)RF.dist(x,midpoint(x)))), 0) # 2 * max(height) == max(cophenetic) expect_equal( max( node.depth.edgelength(midpoint(tree)) *2), max(cophenetic(tree))) }) test_that("maxCladeCred", { tree <- rcoal(100) trees <- nni(tree) expect_equal(maxCladeCred(c(tree, trees)), tree) tree <- rtree(100, rooted = FALSE) trees <- nni(tree) expect_equal(tree, allCompat(trees), use.edge.length = FALSE) }) test_that("add.tips", { tree <- rcoal(20) tree$tip.label <- paste0("t", 1:Ntip(tree)) tree$node.label <- paste0("n", 1:Nnode(tree)) tree1 <- add.tips(tree, c("A", "B", "C", "D"), c("t5", "t10", "n5", "n10")) tree2 <- add.tips(tree, c("A", "B", "C", "D"), c(5, 10, 25, 30)) expect_equal(RF.dist(tree1, tree2), 0) expect_false(is.binary(tree1)) expect_false(is.binary(tree2)) }) phangorn/tests/testthat/test_SH.R0000644000176200001440000000126513475602650016600 0ustar liggesuserscontext("SH-test") tree <- read.tree(text="(t1:0.1,t2:0.1,(t3:0.1,(t4:0.1,t5:0.1):0.1):0.1);") set.seed(42) dat <- simSeq(tree, l=500) trees <- c(tree, nni(tree)) fits <- lapply(trees, pml, data=dat) X <- sapply(fits, function(x)x$siteLik) weight <- attr(dat, "weight") test_that("SH-test works properly", { skip_on_cran() tmp <- SH.test(fits[[1]], fits[[2]]) expect_gt(tmp[1,"p-value"], 0) expect_lt(tmp[2,"p-value"], 0.05) tmp <- SH.test(X, weight=weight) expect_gt(tmp[1,"p-value"], 0) expect_lt(tmp[2,"p-value"], 0.05) tmp <- SH.test(fits) expect_gt(tmp[1,"p-value"], 0) expect_lt(tmp[2,"p-value"], 0.05) expect_lt(tmp[3,"p-value"], 0.05) }) phangorn/tests/testthat/test_pmlCluster.R0000644000176200001440000000157013475602650020417 0ustar liggesuserscontext("Stochastic partitioning") tree1 <- read.tree(text = "((t1:0.3,t2:0.3):0.1,(t3:0.3,t4:0.3):0.1,t5:0.5);") tree2 <- read.tree(text = "((t1:0.3,t3:0.3):0.1,(t2:0.3,t4:0.3):0.1,t5:0.5);") gene1 <- simSeq(tree1, l=200) gene2 <- simSeq(tree1, l=200) gene3 <- simSeq(tree1, l=200) gene4 <- simSeq(tree2, l=200) gene5 <- simSeq(tree2, l=200) X <- cbind(gene1, gene2, gene3, gene4, gene5) weight <- xtabs(~ index+genes,attr(X, "index")) fit <- pml(tree1, X) fit <- optim.pml(fit, control=pml.control(trace=0)) test_that("nni optimisation works properly", { skip_on_cran() sp <- pmlCluster( ~ edge + nni, fit, weight, p=1:3, control=pml.control(epsilon=1e-08, maxit=10, trace=0)) # expect_equal( sp$Partition, c(1,1,1,2,2)) expect_equal( all(sp$Partition == c(1,1,1,2,2)) || all(sp$Partition == c(2,2,2,1,1)) , TRUE) }) phangorn/tests/testthat/test_treedist.R0000644000176200001440000001034513475602650020110 0ustar liggesuserscontext("treedist") ## generate data library(ape) set.seed(42) tree <- rtree(10, FALSE) trees <- nni(tree) tree1 <- read.tree(text="(t5:1.0,(t4:1.0,t3:1.0):1.0,(t1:1.0,t2:1.0):1.0);") tree2 <- read.tree(text="(t4:1.0,(t5:1.0,t3:1.0):1.0,(t1:1.0,t2:1.0):1.0);") tree3 <- read.tree(text="(t5:1.0,t4:1.0,t3:1.0,(t1:1.0,t2:1.0):1.0);") test_that("Robinson-Foulds distance", { ## check RF.dist and tree dist expect_that(RF.dist(tree1, tree1), is_equivalent_to(0)) expect_that(RF.dist(tree1, tree2), is_equivalent_to(2)) expect_that(RF.dist(tree1, tree3), is_equivalent_to(1)) expect_true( all(RF.dist(tree, trees)==2) ) expect_is(RF.dist(trees),"dist") expect_that(treedist(tree1, tree1)[1], is_equivalent_to(0)) expect_that(treedist(tree1, tree2)[1], is_equivalent_to(2)) expect_that(treedist(tree1, tree3)[1], is_equivalent_to(1)) }) test_that("Kuhner-Felsenstein distance (branch score difference)", { ## check RF.dist and tree dist expect_that(KF.dist(tree1, tree1), is_equivalent_to(0)) expect_that(KF.dist(tree1, tree2), is_equivalent_to(sqrt(2))) expect_that(KF.dist(tree1, tree3), is_equivalent_to(1)) expect_is(KF.dist(trees),"dist") expect_that(treedist(tree1, tree1)[2], is_equivalent_to(0)) expect_that(treedist(tree1, tree2)[2], is_equivalent_to(sqrt(2))) expect_that(treedist(tree1, tree3)[2], is_equivalent_to(1)) expect_equal(KF.dist(tree1, c(tree1, tree2, tree3)), c(0, sqrt(2), 1)) }) test_that("path distance", { ## check path dist expect_that(path.dist(tree1, tree1), is_equivalent_to(0)) expect_equal(path.dist(trees)[1:13] , path.dist(trees[[1]], trees[2:14])) expect_is(path.dist(trees),"dist") }) ############################ # new tests from Michelle ############################ # make simple trees with one pair of unmatched edges, unit branch lengths tr1 <- read.tree(text="((A:1,B:1):1,C:1,(D:1,E:1):1);") tr2 <- read.tree(text="((A:1,C:1):1,B:1,(D:1,E:1):1);") # make a tree with same topology as tr1 but varied branch lengths tr3 <- read.tree(text="((A:2,B:1):3,C:1,(D:1,E:2):1);") test_that("Distance between known trees matches calculation by hand", { # one pair of unmatched edges, unit branch lengths expect_equal(wRF.dist(tr1,tr2),2) # one pair of unmatched edges (branch lengths irrelevant) expect_equal(RF.dist(tr1,tr2),2) # same topology, different branch lengths expect_equal(wRF.dist(tr1,tr3),4) # same topology (branch lengths irrelevant) expect_equal(RF.dist(tr1,tr3),0) # one pair of unmatched edges, varied branch lengths expect_equal(wRF.dist(tr2,tr3),6) }) ############################ # test that RF and wRF give same values for trees with every edge = 1 ############################ test_that("When each tree has unit branch lengths, RF = wRF", { skip_on_cran() expect_equal( max( # test some random numbers of tips between 10 and 500 sapply(sample(10:500,50), function(x) { # generate 20 unrooted trees with the given number of tips and unit branch # lengths trees <- rmtree(20, x, rooted=FALSE, br=1) # find maximum abs difference between RF and wRF distance (expect 0) max(abs(RF.dist(trees) - wRF.dist(trees))) })), # find max of all these 0) # expect equal to 0 # now the same for comparison of one tree with many expect_equal( max( # test some random numbers of tips between 10 and 500 sapply(sample(10:500,50), function(x) { # generate 20 unrooted trees with the given number of tips and unit branch # lengths trees <- rmtree(20, x, rooted=FALSE, br=1) # find maximum abs difference between RF and wRF distance (expect 0) max(abs(RF.dist(trees[[1]], trees) - wRF.dist(trees[[1]], trees))) })), # find max of all these 0) # expect equal to 0 }) ############################# # test sprdist from leomrtns ############################# test_that("SPR distance", { ## check spr dist skip_on_cran() set.seed(123) tree1 <- rtree(100, rooted = FALSE) tree2 <- rSPR(tree1, 1) trees <- rSPR(tree1, 1:5) expect_equal(sprdist(tree1, tree2)[[1]], 1) expect_equal(sprdist(tree1, tree2)[[3]], RF.dist(tree1, tree2)) expect_equal(SPR.dist(tree1, trees), 1:5) expect_is(SPR.dist(trees), "dist") }) phangorn/tests/testthat/test_densiTree.R0000644000176200001440000000156313475602650020211 0ustar liggesuserscontext("densiTree") test_that("minimal use", { phylogeny_1 <- ape::read.tree(text = "((A:2, B:2):1, C:3);") phylogeny_2 <- ape::read.tree(text = "((A:1, B:1):2, C:3);") trees <- c(phylogeny_1, phylogeny_2) # Fails, with error 'Error in temp[[j + 1]] : subscript out of bounds' testthat::expect_silent(densiTree(trees)) }) # Visual tests ------------------------------------------------------------ test_that("visual appearance", { skip_on_cran() data(Laurasiatherian) set.seed(1) bs_trees <- bootstrap.phyDat(subset(Laurasiatherian, 1:10), FUN = function(x) upgma(dist.hamming(x)), bs=5) densiT <- function() densiTree(bs_trees, type="phylogram", scale.bar=FALSE, width=2, jitter=list(amount=.3, random=FALSE), alpha=1) vdiffr::expect_doppelganger("densiTree plot", densiT) }) phangorn/tests/testthat/test_pmlMix.R0000644000176200001440000000105313475602650017527 0ustar liggesuserscontext("Mixture models") X <- allSitePattern(5) tree <- read.tree(text = "((t1:0.3,t2:0.3):0.1,(t3:0.3,t4:0.3):0.1,t5:0.5);") fit <- pml(tree,X, k=4) weights <- 1000*exp(fit$site) ll0 <- sum(weights*log(weights/sum(weights))) attr(X, "weight") <- weights fit1 <- update(fit, data=X, k=1) #fit2 <- update(fit, data=X) #(fit2 <- optim.pml(fit2, optGamma=TRUE)) test_that("rate optimisation works properly", { skip_on_cran() fitMixture <- pmlMix(~rate, fit1 , m=4, control=pml.control(trace=0)) expect_equal(fitMixture$logLik, ll0) }) phangorn/tests/testthat/test_codon.R0000644000176200001440000000221213475602650017361 0ustar liggesuserscontext("codon") # use lysin data & tree ? tree <- read.tree(text = "(((t1:.1,t2:.1):.1,t3:.2):.1,(t4:.1,t5:.1):.2);") set.seed(1) dat_1 <- simSeq(tree, l=1000, type = "CODON", dnds=0.5, tstv=2) dat_2 <- simSeq(tree, l=1000, type = "CODON", dnds=1, tstv=2) dat_3 <- simSeq(tree, l=500, type = "CODON", dnds=3, tstv=2) dat_4 <- c(dat_1, dat_2, dat_3) fit_F1x4 <- pml(tree, dat_1, bf="F1x4") fit_F3x4 <- pml(tree, dat_1, bf="F3x4") fit_GY <- pml(tree, dat_1, bf="empirical") test_that("edge length optimisation works properly", { skip_on_cran() fit_GY_opt <- optim.pml(fit_GY, model="codon1", control=pml.control(trace=0)) expect_lt(fit_GY_opt$dnds, 1) expect_gt(fit_GY_opt$tstv, 1) # fit_selection <- codonTest(tree, dat_4, control=pml.control(trace=0)) }) library(ape) data(woodmouse) dat_codon <- dna2codon(as.phyDat(woodmouse)) tree <- NJ(dist.ml(dat_codon)) test_that("edge length optimisation works properly", { skip_on_cran() fit_codon <- codonTest(tree, dat_codon, model = c("M0", "M1a"), control = pml.control(maxit = 20)) expect_s3_class(fit_codon, "codonTest") }) phangorn/tests/testthat/test_treeRearrangement.R0000644000176200001440000000165713475602650021745 0ustar liggesuserscontext("tree_rearrangement") set.seed(42) tree_u <- rtree(100, rooted=FALSE) tree_r <- rtree(100) test_that("nni", { nni_trees_u <- nni(tree_u) nni_trees_r <- nni(tree_r) ## nni expect_s3_class(nni(tree_u), "multiPhylo") expect_true(all(RF.dist(nni_trees_u, tree_u)>0)) expect_true(length(nni_trees_u) == 194L) expect_true(length(nni_trees_r) == 196L) expect_true(all( RF.dist(tree_u, nni_trees_u) == 2)) expect_true(median( RF.dist(tree_r, nni_trees_r) ) == 2) }) r_nni <- rNNI(tree_u, 3, 100) test_that("rNNI", { expect_true(length(r_nni) == 100L) expect_true(median( RF.dist(tree_u, r_nni) ) == 6) expect_true(median( RF.dist(r_nni[[1]], r_nni) ) == 12) }) set.seed(42) r_spr <- rSPR(tree_u, 3, 100) test_that("allTrees", { expect_true(length(r_spr) == 100L) expect_true(median( SPR.dist(tree_u, r_spr) ) == 3) expect_true(median( SPR.dist(r_spr[[1]], r_spr) ) == 6) }) phangorn/tests/testthat/test_mast.R0000644000176200001440000000111013475602650017217 0ustar liggesuserscontext("mast") ## generate data set.seed(42) tree1 <- rtree(100) tree2 <- rSPR(tree1, 5) tips <- mast(tree1, tree2, tree = FALSE) mast_tree <- mast(tree1, tree2) tip_label <- tree1$tip.label tips_to_delete <- setdiff(tip_label, tips) tree1_drop <- drop.tip(tree1, tips_to_delete) tree2_drop <- drop.tip(tree2, tips_to_delete) test_that("maximum agreement subtree (MAST)", { ## common subtrees should be identical expect_equal(RF.dist(tree1_drop, tree2_drop), 0) expect_equal(RF.dist(tree1_drop, mast_tree), 0) expect_equal(RF.dist(tree2_drop, mast_tree), 0) }) phangorn/tests/testthat/test_distances.R0000644000176200001440000000402313475602650020236 0ustar liggesuserscontext("distances") X <- allSitePattern(5) tree <- read.tree(text = "((t1:0.3,t2:0.3):0.1,(t3:0.3,t4:0.3):0.1,t5:0.5);") fit <- pml(tree,X, k=4, shape=0.5) weights <- as.vector(1000*exp(fit$site)) attr(X, "weight") <- weights dm <- cophenetic(tree) Y <- phyDat(matrix(c("A", "C", "G", "T", "A", "C", "G", "A"), 2, 4, dimnames=list(c("a", "b", NULL)), byrow=TRUE)) fun <- function(s) - 3/4 * log(1 - 4/3 * s) data(woodmouse) test_that("dist.ml works properly", { # skip_on_cran() expect_that(dist.logDet(X), is_a("dist")) expect_that(dist.hamming(X), is_a("dist")) expect_that(dist.ml(X), is_a("dist")) expect_equal(as.matrix(dist.ml(X, k=4, shape=.5)), dm) expect_equal(as.matrix(dist.ml(Y)), as.matrix(fun(dist.hamming(Y)))) expect_equivalent(dist.dna(woodmouse, "JC", pairwise.deletion = FALSE), dist.ml(woodmouse, exclude = "all")) expect_equivalent(dist.dna(woodmouse, "JC", pairwise.deletion = TRUE), dist.ml(woodmouse, exclude = "pairwise")) expect_equivalent( dist.dna(woodmouse, "raw"), dist.hamming(woodmouse, exclude="all")) expect_equivalent( dist.dna(woodmouse, "raw", pairwise.deletion = TRUE), dist.hamming(woodmouse, exclude="pairwise")) expect_equivalent( dist.dna(woodmouse, "N"), dist.hamming(woodmouse, exclude="all", ratio = FALSE)) expect_equivalent( dist.dna(woodmouse, "N", pairwise.deletion = TRUE), dist.hamming(woodmouse, exclude="pairwise", ratio = FALSE)) }) test_that("read/write of distances works", { skip_on_cran() # phylip dm <- as.dist(dm) writeDist(dm, "dm.txt") expect_equal(dm, readDist("dm.txt")) #nexus writeDist(dm, "dm.txt", format="nexus", upper=TRUE) expect_equal(dm, readDist("dm.txt", format="nexus")) writeDist(dm, "dm.txt", format="nexus", upper=FALSE) expect_equal(dm, readDist("dm.txt", format="nexus")) unlink("dm.txt") }) phangorn/tests/testthat/test_pmlPen.R0000644000176200001440000000163113475602650017516 0ustar liggesuserscontext("penalized likelihood") X <- allSitePattern(5) attr(X, "index") <- NULL tree1 <- read.tree(text = "((t1:0.1,t2:0.5):0.1,(t3:0.1,t4:0.5):0.1,t5:0.5);") tree2 <- read.tree(text = "((t1:0.5,t2:0.1):0.1,(t3:0.5,t4:0.1):0.1,t5:0.5);") fit1 <- pml(tree1,X) fit2 <- pml(tree2,X) attr(X, "weight") <- 1000*exp(fit1$site) Y <- X attr(Y, "weight") <- 1000*exp(fit2$site) fit1 <- update(fit1, data=X) fit2 <- update(fit2, data=Y) sp <- pmlPart(~ edge, list(fit1, fit2), pml.control(trace = 0)) pp0 <- pmlPen(sp, lambda = 0, pml.control(trace = 0)) ppInf <- pmlPen(sp, lambda = 1e6, pml.control(trace = 0)) Z <- cbind(X,Y) fit3 <- update(fit1, data=Z) fit3 <- optim.pml(fit3, control = pml.control(trace = 0)) test_that("penalized partition models work as expected", { expect_equal(pp0$logLik[1], fit1$logLik + fit2$logLik) #, tolerance = 0.002) expect_equal(ppInf$logLik[1], fit3$logLik, tolerance = 1e-5) }) phangorn/tests/testthat/test_modelTest.R0000644000176200001440000000151313475602650020222 0ustar liggesuserscontext("modelTest") X <- allSitePattern(4) attr(X, "type") <- "DNA" tree <- read.tree(text = "((t1:0.2,t2:0.3):0.1,t3:0.2,t4:0.3);") fit <- pml(tree, X, k=4, bf = c(1:4)/10) # F81 + Gamma weights <- 1000*exp(fit$site) attr(X, "weight") <- weights set.seed(42) # tree <- read.tree(text = "((t1:0.2,t2:0.3):0.1,t3:0.2);") Y <- simSeq(tree, l=500, type = "AA", model="WAG") test_that("modelTest works properly", { skip_on_cran() MT <- modelTest(X, tree = tree, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 0)) expect_equal(MT$Model[which.min(MT$BIC)], "F81+G") # amino acid models MT_AA <- modelTest(Y, tree = tree, model=c("JTT", "WAG"), FREQ = TRUE, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 0)) expect_equal(MT_AA$Model[which.min(MT_AA$BIC)], "WAG") }) phangorn/tests/testthat/test_pmlPart.R0000644000176200001440000001237313475602650017707 0ustar liggesuserscontext("Partitioned likelihood models") X <- allSitePattern(5) tree <- read.tree(text = "((t1:0.3,t2:0.3):0.1,(t3:0.3,t4:0.3):0.1,t5:0.5);") tree2 <- read.tree(text = "((t1:0.3,t3:0.3):0.1,(t2:0.3,t4:0.3):0.1,t5:0.5);") fit0 <- pml(tree, X, k=4) fit1 <- update(fit0, rate=.5) fit2 <- update(fit0, rate=2) weights0 <- 1000*exp(fit0$site) weights1 <- 1000*exp(fit1$site) weights2 <- 1000*exp(fit2$site) W <- cbind(weights0, weights1, weights2) colnames(W) <- c("g1", "g2", "g3") # rate test_that("rate optimisation works properly", { skip_on_cran() sp <- pmlPart(edge ~ rate, fit0, weight=W, control = pml.control(trace=0)) expect_equal( sp$fits[[1]]$rate / sp$fits[[2]]$rate , 2, tolerance = 1e-5) expect_equal( sp$fits[[1]]$rate / sp$fits[[3]]$rate , 0.5, tolerance = 1e-5) }) # nni # Q test_that("transition rate optimisation works properly", { skip_on_cran() Q <- c(6:1) fit0 <- pml(tree, X, k=4) fit1 <- pml(tree, X, k=4, Q=Q) weights1 <- 1000*exp(fit1$site) Y <- X attr(Y, "weight") <- weights1 fit1 <- pml(tree, Y, k=4, Q=Q) weights0 <- weights1 weights2 <- weights1 W <- cbind(weights0, weights1, weights2) colnames(W) <- c("g1", "g2", "g3") # linked parameter sp <- pmlPart(edge + Q ~ ., fit0, weight=W, control = pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(Q, sp$fits[[1]]$Q, tolerance=5e-4) # unlinked parameter # TODO more complicated models # weights0 <- 1000*exp(fit0$site) sp <- pmlPart( ~ Q, fit0, weight=W, control = pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(Q, sp$fits[[1]]$Q, tolerance=5e-4) }) # bf test_that("base frequency optimisation works properly", { skip_on_cran() bf <- (1:4)/10 fit0 <- pml(tree, X, k=4) fit1 <- pml(tree, X, k=4, bf=bf) weights1 <- 1000*exp(fit1$site) Y <- X attr(Y, "weight") <- weights1 fit1 <- pml(tree, Y, k=4, bf=bf) weights0 <- weights1 weights2 <- weights1 W <- cbind(weights0, weights1, weights2) colnames(W) <- c("g1", "g2", "g3") # linked parameter sp <- pmlPart(edge + bf ~ ., fit0, weight=W, control = pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(bf, sp$fits[[1]]$bf, tolerance=5e-4) # unlinked parameter # TODO more complicated models # weights0 <- 1000*exp(fit0$site) sp <- pmlPart( ~ bf, fit0, weight=W, control = pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(bf, sp$fits[[1]]$bf, tolerance=5e-4) }) # Gamma test_that("shape parameter optimisation works properly", { skip_on_cran() shape <- 2 fit0 <- pml(tree, X, k=4) fit1 <- pml(tree, X, k=4, shape=shape) weights1 <- 1000*exp(fit1$site) Y <- X attr(Y, "weight") <- weights1 fit1 <- pml(tree, Y, k=4, shape=shape) weights0 <- weights1 weights2 <- weights1 W <- cbind(weights0, weights1, weights2) colnames(W) <- c("g1", "g2", "g3") # linked parameter sp <- pmlPart(edge + shape ~ ., fit0, weight=W, control=pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(shape, sp$fits[[1]]$shape, tolerance=5e-3) # unlinked parameter # TODO more complicated models # weights0 <- 1000*exp(fit0$site) sp <- pmlPart( ~ shape, fit0, weight=W, control=pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(shape, sp$fits[[1]]$shape, tolerance=5e-4) }) # Invariant sites test_that("Invariant sites optimisation works properly", { skip_on_cran() inv <- .2 fit0 <- pml(tree, X, k=4) fit1 <- pml(tree, X, k=4, inv=inv) weights1 <- 1000*exp(fit1$site) Y <- X attr(Y, "weight") <- weights1 fit1 <- pml(tree, Y, k=4, inv=inv) weights0 <- weights1 weights2 <- weights1 W <- cbind(weights0, weights1, weights2) colnames(W) <- c("g1", "g2", "g3") # linked parameter sp <- pmlPart(edge + inv ~ ., fit0, weight=W, control=pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(inv, sp$fits[[1]]$inv, tolerance=5e-5) # unlinked parameter # TODO more complicated models # weights0 <- 1000*exp(fit0$site) sp <- pmlPart( ~ inv, fit0, weight=W, control = pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(inv, sp$fits[[1]]$inv, tolerance=5e-5) }) # linked parameters test_that("Linked parameters optimisation works properly", { skip_on_cran() Z <- X fit0 <- pml(tree, X, k=4) weights0 <- 1000*exp(fit0$site) weights1 <- 1000*exp(update(fit0, rate=.5)$site) weights2 <- 1000*exp(update(fit0, tree=tree2)$site) attr(Z, "weight") <- weights0 + weights1 + weights2 W <- cbind(weights0, weights1, weights2) fit_Z <- update(fit0, data=Z) fit_Z <- optim.pml(fit_Z, model="GTR", rearrangement="NNI", optGamma=TRUE, optInv=TRUE, control=pml.control(trace=0)) sp <- pmlPart(edge + bf + Q + shape + inv + nni ~ ., fit_Z, weight=W) expect_equal(sp$logLik[[1]], fit_Z$logLik, tolerance = 1e-5) }) phangorn/tests/testthat/test_dist_tree.R0000644000176200001440000000117013475602650020243 0ustar liggesuserscontext("dist_tree") data(Laurasiatherian) dm <- dist.ml(Laurasiatherian) test_that("check nnls functions", { tree_nj <- NJ(dm) tree_unj <- UNJ(dm) tree_nnls_unj <- nnls.phylo(tree_unj, dm) tree_nnls_nj <- nnls.phylo(tree_nj, dm) tree_upgma <- upgma(dm) tree_wpgma <- wpgma(dm) tree_nnls_upgma <- nnls.phylo(tree_upgma, dm, rooted=TRUE) tree_nnls_wpgma <- nnls.phylo(tree_wpgma, dm, rooted=TRUE) expect_equal(tree_upgma, tree_nnls_upgma) expect_false(all.equal(tree_wpgma, tree_nnls_wpgma)) expect_equal(tree_unj, tree_nnls_unj) expect_false(all.equal(tree_nj, tree_nnls_nj)) }) phangorn/tests/testthat/test_pml.R0000644000176200001440000001152113475602650017052 0ustar liggesuserscontext("likelihood") treeU1 <- read.tree(text = "((t1:.1,t2:.1):.1,t3:.2,(t4:.1,t5:.1):.3);") # edge length changed treeU2 <- read.tree(text = "((t1:.15,t2:.15):.05,t3:.2,(t4:.1,t5:.1):.3);") # 1 NNI move treeU3 <- read.tree(text = "((t1:.1,t3:.1):.1,t2:.2,(t4:.1,t5:.1):.3);") treeR1 <- read.tree(text = "(((t1:.1,t2:.1):.1,t3:.2):.1,(t4:.1,t5:.1):.2);") # edge length changed treeR2 <- read.tree(text = "(((t1:.15,t2:.15):.05,t3:.2):.1,(t4:.1,t5:.1):.2);") # 1 NNI move treeR3 <- read.tree(text = "(((t1:.1,t3:.1):.1,t2:.2):.1,(t4:.1,t5:.1):.2);") # dat <- phyDat(c(t1="a", t2="a",t3="t",t4="t"), type="USER", # levels=c("a","c","g","t")) #tree2 <- read.tree(text = "((t1,t3),t2,t4);") dat <- allSitePattern(5) weights <- as.vector(1000 * exp(pml(treeR1, dat)$siteLik)) attr(dat, "weight") <- weights dat_Mk <- subset(dat, select = -c(1,342,683, 1024)) Q <- c(6:1) pmlU1 <- pml(treeU1, dat) pmlU2 <- pml(treeU2, dat) pmlU2.fitted <- optim.pml(pmlU2, control = pml.control(trace=0)) pmlU3 <- pml(treeU3, dat) pmlU3.fitted <- optim.pml(pmlU3, TRUE, control = pml.control(trace=0)) pmlR1 <- pml(treeR1, dat) pmlR2 <- pml(treeR2, dat) pmlR2.fitted <- optim.pml(pmlR2, optRooted = TRUE, control = pml.control(epsilon=1e-10, trace=0)) pmlR3 <- pml(treeR3, dat) pmlR3.fitted <- optim.pml(pmlR3, TRUE, optRooted = TRUE, control = pml.control(epsilon=1e-10, trace=0)) test_that("edge length optimisation works properly", { # skip_on_cran() expect_equal(logLik(pmlU2.fitted), logLik(pmlU1)) expect_equal(logLik(pmlR2.fitted), logLik(pmlR1)) expect_equal(pmlU2.fitted$tree, pmlU1$tree, tolerance=1e-6) # expect_equal(pmlR2.fitted$tree, pmlR1$tree, tolerance=5e-5) }) test_that("NNI optimisation works properly", { # skip_on_cran() expect_equal(logLik(pmlU3.fitted), logLik(pmlU1)) expect_equal(logLik(pmlR3.fitted), logLik(pmlR1)) expect_equal(pmlU3.fitted$tree, pmlU1$tree, tolerance=1e-6) expect_equal(storage.mode(pmlU3.fitted$tree$edge), "integer") # expect_equal(pmlR3.fitted$tree, pmlR1$tree, tolerance=5e-6) }) test_that("bf optimisation works properly", { skip_on_cran() bf <- c(.1,.2,.3,.4) fit_T <- pml(treeU1, dat, bf=bf) weights <- as.vector(1000 * exp(fit_T$siteLik)) dat_tmp <- dat attr(dat_tmp, "weight") <- weights fit0 <- pml(treeU1, dat_tmp) fit.bf <- optim.pml(fit0, optEdge=FALSE, optBf = TRUE, control = pml.control(epsilon=1e-10, trace=0)) expect_equal(logLik(fit.bf), logLik(pml(treeU1, dat_tmp, bf=bf))) expect_equal(bf, fit.bf$bf, tolerance=5e-4) }) test_that("Q optimisation works properly", { skip_on_cran() Q <- c(6:1) fit_T <- pml(treeU1, dat, Q=Q) weights <- as.vector(1000 * exp(fit_T$siteLik)) dat_tmp <- dat attr(dat_tmp, "weight") <- weights fit0 <- pml(treeU1, dat_tmp) fit.Q <- optim.pml(fit0, optEdge=FALSE, optQ = TRUE, control = pml.control(epsilon=1e-10, trace=0)) expect_equal(logLik(fit.Q), logLik(pml(treeU1, dat_tmp, Q=Q))) expect_equal(Q, fit.Q$Q, tolerance=5e-4) }) test_that("Inv optimisation works properly", { skip_on_cran() inv <- 0.25 fit_T <- pml(treeU1, dat, inv=inv) weights <- as.vector(1000 * exp(fit_T$siteLik)) dat_tmp <- dat attr(dat_tmp, "weight") <- weights fit0 <- pml(treeU1, dat_tmp) fit.Inv <- optim.pml(fit0, optEdge=FALSE, optInv = TRUE, control = pml.control(epsilon=1e-10, trace=0)) expect_equal(logLik(fit.Inv), logLik(pml(treeU1, dat_tmp, inv=inv))) expect_equal(inv, fit.Inv$inv, tolerance=5e-4) }) test_that("Gamma optimisation works properly", { skip_on_cran() shape <- 2 fit_T <- pml(treeU1, dat, shape=shape, k=4) weights <- as.vector(1000 * exp(fit_T$siteLik)) dat_tmp <- dat attr(dat_tmp, "weight") <- weights fit0 <- pml(treeU1, dat_tmp, k=4) fit.Gamma <- optim.pml(fit0, optEdge=FALSE, optGamma = TRUE, control = pml.control(epsilon=1e-10, trace=0)) expect_equal(logLik(fit.Gamma), logLik(pml(treeU1, dat_tmp, shape=shape, k=4))) expect_equal(shape, fit.Gamma$shape, tolerance=5e-4) }) test_that("rate optimisation works properly", { skip_on_cran() rate <- 2 fit_T <- pml(treeU1, dat, rate=rate) weights <- as.vector(1000 * exp(fit_T$siteLik)) dat_tmp <- dat attr(dat_tmp, "weight") <- weights fit0 <- pml(treeU1, dat_tmp) fit.rate <- optim.pml(fit0, optEdge=FALSE, optRate = TRUE, control = pml.control(epsilon=1e-10, trace=0)) expect_equal(logLik(fit.rate), logLik(pml(treeU1, dat_tmp, rate=rate))) expect_equal(rate, fit.rate$rate, tolerance=5e-4) }) test_that("Mkv model works properly", { skip_on_cran() expect_equal(logLik(pmlU2.fitted), logLik(pmlU1)) }) phangorn/tests/testthat/test_speciesTree.R0000644000176200001440000000113613475602650020536 0ustar liggesuserscontext("speciesTree") tr1 <- read.tree(text = "(((B:0.05,C:0.05):0.01,D:0.06):0.04,A:0.1);") tr2 <- read.tree(text = "(((A:0.07,C:0.07):0.02,D:0.09):0.03,B:0.12);") TR <- c(tr1, tr2) start_tree <- read.tree(text = "(((B,C),D),A);") x <- matrix(c("A", "B", "C", "D"), 4, 1) rownames(x) <- c("A", "B", "C", "D") X <- phyDat(x, type="USER", levels = c("A", "B", "C", "D")) test_that("speciesTree", { ## check speciesTree st1 <- coalSpeciesTree(TR) st2 <- coalSpeciesTree(TR, X=X) st3 <- coalSpeciesTree(TR, sTree = start_tree) expect_equal(st1, st2) expect_equal(st1, st3) }) phangorn/tests/testthat/test_hadamard.R0000644000176200001440000000106313475602650020023 0ustar liggesuserscontext("Hadamard conjugation") v <- 1:8 data(yeast) dm <- dist.hamming(yeast) # RY-coding yeast_ry <- acgt2ry(yeast) # delete ambiguous states # dat4 <- phyDat(as.character(yeast), type="USER", levels=c("a","c", "g", "t"), ambiguity=NULL) # fit4 <- h4st(dat4) test_that("Hadamard conjugation works as expected", { # fast fft like multiplication expect_is(H <- hadamard(3), "matrix") expect_equal(as.vector(H %*% v), fhm(v)) expect_s3_class(spl_ry <- h2st(yeast_ry), "splits") expect_s3_class(spl_dm <- distanceHadamard(dm), "splits") }) phangorn/tests/testthat/test_splits.R0000644000176200001440000000461113475602650017602 0ustar liggesuserscontext("Test conversions") ## generate data set.seed(1) tree <- rtree(10, FALSE) tree2spl <- as.splits(tree) pp <- prop.part(tree) spl2tree <- as.phylo(tree2spl) dm <- cophenetic(tree2spl) mat <- as.matrix(tree2spl) Mat <- as.Matrix(tree2spl) trees <- nni(tree) test_that("splits", { ## skip on CRAN skip_on_cran() ## check classes expect_s3_class(as.splits(trees), "splits") expect_s3_class(tree2spl, "splits") expect_s3_class(spl2tree,"phylo") expect_s3_class(dm,"dist") expect_is(mat, "matrix") expect_s4_class(Mat, "Matrix") expect_equal(spl2tree , tree) # test generics c_spl <- c(tree2spl, tree2spl, tree2spl) expect_equal(length(c_spl) , 3L*length(tree2spl)) expect_equal(length(unique(c_spl)) , length(tree2spl)) expect_equal(length(distinct.splits(c_spl)) , length(tree2spl)) spl <- allCircularSplits(6) spl <- phangorn:::oneWise(spl, 6) write.nexus.splits(spl, "tmp.nex") spl2 <- read.nexus.splits("tmp.nex") attr(spl2, "splitlabels") <- NULL attr(spl2, "weights") <- NULL class(spl2) <- "splits" expect_equal(spl2 , spl) # test conversion with prop.part expect_s3_class(as.splits(pp),"splits") expect_equal(pp, as.prop.part(as.splits(pp))) expect_equivalent(as.splits(as.bitsplits(tree2spl)), tree2spl) unlink("tmp.nex") }) test_that("networx ", { ## skip on CRAN skip_on_cran() net1 <- neighborNet(dm) write.nexus.networx(net1, "tmp.nex") net2 <- read.nexus.networx("tmp.nex") net3 <- as.networx(tree) # delete some additional attributes net2$.plot <- net2$translate <- NULL attr(net1, "order") <- NULL expect_is(net1, "networx") expect_is(net2, "networx") expect_is(net3, "networx") # expect_equal(net1, net2, tolerance=1e-6) # expect_equal(net3, net2, tolerance=1e-6) expect_equal(net1, net3) unlink("tmp.nex") cnet <- consensusNet(as.splits(trees)) expect_is(cnet, "networx") net1$edge.length <- cnet$edge.length <- cnet$edge.labels <- NULL attr(cnet, "order") <- NULL expect_equal(cnet, net1) expect_equal(nrow(cnet$edge), length(as.splits(cnet))) }) test_that("consensusNet", { ## skip on CRAN skip_on_cran() set.seed(1) bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x)nj(dist.hamming(x)), bs=50) cnet <- consensusNet(bs) expect_is(cnet, "networx") }) phangorn/tests/testthat/test-simSeq.R0000644000176200001440000001200613475602650017440 0ustar liggesuserscontext("simSeq") test_that("compare to seq-gen", { skip_on_cran() # Hypothesis: # phangorn::simSeq and seq-gen generate alignments # with approximately the same number of mutations # # Method: # # - Create a phylogeny to work on # - Simulate alignments with seq-gen, count number of mutations # - Simulate alignments with phangorn::simSeq, count number of mutations # - Compare distributions of number of mutations # - Reject hypothesis if distributions are different set.seed(42) # Alignment length, in base pairs sequence_length <- 1000 # Set the rigor of the experiment n_replicates <- 100 # Create the simplest tree possible to simulate alignments on tree <- ape::read.tree(text = "(t1:1,t2:1);") ############################################################################ # seq-gen ############################################################################ # Use a simple root sequence, note the uppercase adenine root_sequence <- rep("A", sequence_length) root_sequence_str <- paste0(root_sequence, collapse = "") # seq-gen diffs_1 <- rep(NA, n_replicates) diffs_2 <- rep(NA, n_replicates) for (i in seq(1, n_replicates)) { lines <- c( paste0("1 ", sequence_length), paste0("t0 ", root_sequence_str), "1", ape::write.tree(phy = tree) ) filename <- tempfile() writeLines(text = lines, con = filename) # Put the root sequence at index 1 out <- system2(command = "seq-gen", args = c(paste0("-l", sequence_length), "-mHKY", "-k1"), stdin = filename, stdout = TRUE, stderr = FALSE ) seq1 <- strsplit(out[2], split = " ")[[1]][9] seq2 <- strsplit(out[3], split = " ")[[1]][9] diffs_1[i] <- sum(strsplit(seq1, split = "")[[1]] != root_sequence) diffs_2[i] <- sum(strsplit(seq2, split = "")[[1]] != root_sequence) } seq_gen_diffs <- c(diffs_1, diffs_2) ############################################################################ # phangorn::simSeq ############################################################################ # Use a simple root sequence, note the lower-case adenine root_sequence <- rep("a", sequence_length) # Measure with `phangorn::simSeq` diffs_1 <- rep(NA, n_replicates) diffs_2 <- rep(NA, n_replicates) for (i in seq(1, n_replicates)) { data <- simSeq( tree, l = sequence_length, rootseq = root_sequence, type = "DNA", rate = 1.0 ) diffs_1[i] <- sum(as.character(data)[1, ] != root_sequence) diffs_2[i] <- sum(as.character(data)[2, ] != root_sequence) } sim_seq_diffs <- c(diffs_1, diffs_2) ############################################################################ # Compare ############################################################################ # Use Kolmogorov-Smirnov test to determine if two distributions # are the same. Warning: p-value will be approximate in the presence of ties test <- suppressWarnings( ks.test(seq_gen_diffs, sim_seq_diffs) ) # If p-value is less than 0.05, we assume the distributions to # be different. If the distributions are different, phangorn::simSeq # and seq-gen produce a different number of mutations. p_value <- test$p.value # Expect distributions not to be similar expect_gt(p_value, 0.05) ############################################################################ # test for site pattern ############################################################################ tree <- read.tree(text="(t1:0.1,t2:0.1,t3:0.2);") dat <- allSitePattern(3) prob <- as.vector(exp(pml(tree, dat)$site)) sitePattern <- function(x){ attr(x, "index") <- NULL attr(x, "weight") <- rep(1, length(attr(x, "weight"))) x <- as.data.frame(x, stringsAsFactors = FALSE) do.call("paste", c(x, sep = "")) } ref <- sitePattern(dat) attr(dat, "weight") <- 1000 * prob fit <- pml(tree, dat) p_value1 <- numeric(100) p_value2 <- numeric(100) for(i in 1:100){ x <- simSeq(tree) y <- sitePattern(x) obs <- numeric(length(ref)) obs[match(y, ref)] <- attr(x, "weight") test <- suppressWarnings( chisq.test(obs, p=prob) ) # If p-value is less than 0.05, we assume the distributions to # be different. p_value1[i] <- test$p.value } expect_gt(mean(p_value1), 0.05) for(i in 1:100){ x <- simSeq(fit) y <- sitePattern(x) obs <- numeric(length(ref)) obs[match(y, ref)] <- attr(x, "weight") test <- suppressWarnings( chisq.test(obs, p=prob) ) # If p-value is less than 0.05, we assume the distributions to # be different. p_value2[i] <- test$p.value } expect_gt(mean(p_value2), 0.05) }) phangorn/tests/testthat/test_Clanistics.R0000644000176200001440000000062413475602650020360 0ustar liggesuserscontext("Clanistics") tree <- rtree(10) x <- simSeq(tree, l=5, type="USER", levels = c("red", "violet", "blue")) test_that("clanistics works properly", { # skip_on_cran() expect_is(getClans(tree), "matrix") expect_is(getClips(tree), "matrix") expect_is(getSlices(tree), "matrix") expect_is(getDiversity(tree, x), "clanistics") expect_is(getDiversity(tree, x), "data.frame") }) phangorn/tests/testthat/test_phyDat.R0000644000176200001440000000715613475602650017524 0ustar liggesuserscontext("conversion_and_subsetting") # to test: phyDat.codon, data(Laurasiatherian) data(chloroplast) set.seed(42) tree <- rtree(10) codon_align <- simSeq(tree, l=100, type = "CODON") phy_matrix <- as.character(Laurasiatherian) phy_df <- as.data.frame(Laurasiatherian) phy_vec_dna <- phy_matrix[,1] phy_vec_user <- sample(c("0","1"), 26, replace=TRUE) names(phy_vec_user) <- letters phy_dnabin <- as.DNAbin(Laurasiatherian) phy_aabin <- as.AAbin(chloroplast) phy_align <- phyDat2alignment(Laurasiatherian) test_that("conversion work as expected", { ## skip_on_cran() expect_is(phy_matrix, "matrix") expect_is(phy_df, "data.frame") expect_s3_class(phy_dnabin, "DNAbin") expect_s3_class(phy_aabin, "AAbin") expect_s3_class(phy_align, "alignment") expect_s3_class(as.phyDat(phy_matrix), "phyDat") expect_s3_class(as.phyDat(phy_df), "phyDat") expect_s3_class(as.phyDat(phy_dnabin), "phyDat") expect_equal(as.phyDat(phy_aabin), chloroplast) expect_s3_class(phyDat(phy_vec_dna), "phyDat") expect_s3_class(phyDat(phy_vec_user, type="USER", levels = c("0","1")), "phyDat") expect_s3_class(as.phyDat(phy_dnabin), "phyDat") expect_s3_class(as.phyDat(phy_align), "phyDat") expect_s3_class(c2d <- codon2dna(codon_align), "phyDat") expect_equal(dna2codon(c2d), codon_align) }) test_that("conversion with Biostrings work as expected", { skip_on_cran() if(requireNamespace('Biostrings')){ expect_s4_class(MA_AA <- as.MultipleAlignment(chloroplast), "AAMultipleAlignment") expect_equal(as.phyDat(MA_AA), chloroplast) expect_s4_class(MA_DNA <- as.MultipleAlignment(Laurasiatherian), "DNAMultipleAlignment") expect_equal(as.phyDat(MA_DNA), Laurasiatherian) } }) test_that("subsetting and combining work as expected", { ## skip_on_cran() expect_s3_class(subset_1 <- subset(Laurasiatherian, select = 1:1000, site.pattern = FALSE), "phyDat") expect_s3_class(subset_2 <- subset(Laurasiatherian, select = 1001:3179, site.pattern = FALSE), "phyDat") expect_s3_class(lauraCbind1 <- cbind(subset_1, subset_2), "phyDat") expect_equal(baseFreq(lauraCbind1), baseFreq(Laurasiatherian)) expect_s3_class(subset_3 <- subset(Laurasiatherian, select = 1:100), "phyDat") expect_s3_class(subset_4 <- subset(Laurasiatherian, select = 101:1605), "phyDat") expect_equal(subset_1, Laurasiatherian[, 1:1000]) expect_s3_class(lauraCbind2 <- cbind(subset_3, subset_4), "phyDat") expect_equal(baseFreq(lauraCbind2), baseFreq(Laurasiatherian)) }) test_that("read and write work as expected", { skip_on_cran() write.phyDat(Laurasiatherian, "tmp1.txt") expect_s3_class(laura <- read.phyDat("tmp1.txt"), "phyDat") expect_equal(laura, Laurasiatherian) unlink("tmp1.txt") write.phyDat(chloroplast, "tmp2.txt") expect_s3_class(chloro <- read.phyDat("tmp2.txt", type="AA"), "phyDat") expect_equal(chloro, chloroplast) unlink("tmp2.txt") write.phyDat(chloroplast, "tmp.fas", format="fasta") expect_s3_class(chloro_fas <- read.phyDat("tmp.fas", type="AA", format = "fasta"), "phyDat") expect_equal(chloro_fas, chloroplast) unlink("tmp.fas") }) test_that("removing duplicated sequences works", { skip_on_cran() tmp <- as.character(Laurasiatherian) laura <- phyDat(rbind(phy_matrix, phy_matrix)) names(laura) <- paste0(names(laura), rep(c(1,2), each=47)) map1 <- map_duplicates(laura) map2 <- map_duplicates(Laurasiatherian) expect_null(map2) expect_is(map1, "data.frame") }) phangorn/tests/testthat/test_parsimony.R0000644000176200001440000000371413475602650020310 0ustar liggesuserscontext("parsimony") data(yeast) all_trees <- allTrees(8, tip.label = names(yeast)) tree1 <- read.tree(text = "((t1,t2),t3,t4);") tree2 <- read.tree(text = "((t1,t3),t2,t4);") trees <- .compressTipLabel(c(tree1, tree2)) dat <- phyDat(c(t1="a", t2="a",t3="t",t4="t"), type="USER", levels=c("a","c","g","t")) test_that("parsimony works properly", { ## skip_on_cran() expect_that(fitch(tree1, dat), equals(1)) expect_that(fitch(tree2, dat), equals(2)) expect_that(fitch(trees, dat), equals(c(1,2))) expect_that(sankoff(tree1, dat), equals(1)) expect_that(sankoff(tree2, dat), equals(2)) expect_that(parsimony(tree1, dat), equals(1)) }) test_that("bab works properly", { skip_on_cran() # all_trees <- allTrees(8, tip.label = names(yeast)) all_pars <- fitch(all_trees, yeast) bab_tree <- bab(yeast, trace=0) expect_equal(min(all_pars), fitch(bab_tree, yeast)) }) test_that("rearrangements works properly", { skip_on_cran() tree <- all_trees[[1]] start <- fitch(tree, yeast) bab_tree <- bab(yeast, trace=0) best <- fitch(bab_tree, yeast) best_fitch <- optim.parsimony(tree, yeast, rearrangements = "NNI", trace=0) best_sankoff <- optim.parsimony(tree, yeast, method="sankoff", rearrangements = "NNI", trace=0) expect_equal(attr(best_fitch, "pscore"), attr(best_sankoff, "pscore")) }) test_that("tree length works properly", { skip_on_cran() tree <- nj(dist.hamming(yeast)) pscore <- fitch(tree, yeast) tree1 <- acctran(tree, yeast) expect_equal(sum(tree1$edge.length), pscore) tree2 <- rtree(100) dat <- simSeq(tree2) tree2 <- acctran(tree2, dat) expect_equal(sum(tree2$edge.length), fitch(tree2,dat)) }) test_that("tree length works properly", { skip_on_cran() ra_tree <- random.addition(yeast) ratchet_tree <- pratchet(yeast, start=ra_tree) expect_gte(attr(ra_tree, "pscore"), attr(ratchet_tree, "pscore")) }) phangorn/tests/testthat/test_lento.R0000644000176200001440000000051713475602650017406 0ustar liggesuserscontext("lento plot") # Visual tests ------------------------------------------------------------ test_that("visual appearance", { skip_on_cran() data(yeast) yeast.ry <- acgt2ry(yeast) splits.h <- h2st(yeast.ry) lentoPlot <- function() lento(splits.h) vdiffr::expect_doppelganger("lento plot", lentoPlot) }) phangorn/tests/testthat/test_ancestral.R0000644000176200001440000000165313475602650020243 0ustar liggesuserscontext("ancestral") # tree <- read.tree(text="((t1:1,t2:1):1,(t3:1,t4:1):1);") dat <- matrix( c("a", "a", "a", "t", "t", "a", "t", "t"), byrow = TRUE, nrow = 4L, dimnames = list(c("t1", "t2", "t3", "t4"), NULL)) dna <- phyDat(dat) fit <- pml(tree, dna) # dna tests differs from other data types as it may returns ambiguous data test_that("test ancestral dna", { test.ml1 <- ancestral.pml(fit, type = "ml") test.ml2 <- ancestral.pml(fit, type = "ml", return = "phyDat") test1 <- ancestral.pars(tree, dna, "MPR", return = "prob") test2 <- ancestral.pars(tree, dna, "MPR", return = "phyDat") test3 <- ancestral.pars(tree, dna, "ACCTRAN", return = "prob") test4 <- ancestral.pars(tree, dna, "ACCTRAN", return = "phyDat") expect_equal(as.character(test2), as.character(test4)) expect_equal(as.character(test.ml2), as.character(test2)) }) phangorn/src/0000755000176200001440000000000013502203732012652 5ustar liggesusersphangorn/src/Makevars0000644000176200001440000000010013475602650014350 0ustar liggesusersPKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) CXX_STD = CXX11 phangorn/src/fitch.c0000644000176200001440000004256313475602650014140 0ustar liggesusers#define USE_RINTERNALS #include #include #include // #include // use R_len_t stat int, e.g. nr double huge = 1.0e300; static int *data1, *data2; static double *weight; void fitch_free(){ free(data1); free(data2); free(weight); } // type of fitch depending on nc e.g. int, long generic C++ void fitch_init(int *data, int *m, int *n, double *weights, int *nr) { int i; data1 = (int *) calloc(*n, sizeof(int)); data2 = (int *) calloc(*n, sizeof(int)); weight = (double *) calloc(*nr, sizeof(double)); for(i=0; i<*m; i++) data1[i] = data[i]; for(i=0; i<*nr; i++) weight[i] = weights[i]; } int bitcount(int x){ int count; for (count=0; x != 0; x>>=1) if ( x & 01) count++; return count; } void bitCount(int *x, int *count){ count[0]=bitcount(x[0]); } void addOne(int *edge, int *tip, int *ind, int *l, int *m, int *result){ int add = 1L, j=0L, p, k, i, l2=*l+2L, ei; p = edge[*ind-1L]; k = edge[*ind-1L + *l]; for(i=0; i<*l; i++){ ei = edge[i]; if( (add==1L) && (ei==p) ){ result[j] = *m; result[j+l2] = k; j++; result[j] = *m; result[j+l2] = *tip; j++; add=0L; } if(i== (*ind-1L)) result[j+l2] = *m; else result[j+l2] = edge[i+ *l]; result[j] = edge[i]; j++; } } /* SEXP AddOne(SEXP edge, SEXP tip, SEXP ind, SEXP l, SEXP m){ SEXP result; PROTECT(result = allocMatrix(INTSXP, INTEGER(l)[0]+2L, 2L)); addOne(INTEGER(edge), INTEGER(tip), INTEGER(ind), INTEGER(l), INTEGER(m), INTEGER(result)); UNPROTECT(1); return(result); } */ SEXP AddOnes(SEXP edge, SEXP tip, SEXP ind, SEXP l, SEXP m){ R_len_t n = length(ind); SEXP result, res; PROTECT(res = allocVector(VECSXP, n)); for(int i=0; ips)break; } // if(pvtmp[i] 0L){ dat1[k] = tmp; } } } void fitchT3(int *dat1, int *dat2, int *nr, double *pars, double *weight, double *w){ int k; int tmp; for(k = 0; k < (*nr); k++){ tmp = dat1[k] & dat2[k]; if(tmp==0L) { (*w)+=weight[k]; pars[k] += 1; } if(tmp >0){ if(tmp < dat2[k]){ (*w)+= .5*weight[k]; pars[k] += .5; } } } } //void ACCTRAN2(int *dat, int *nr, double *pars, int *node, int *edge, int *nl, double *weight, double *pvec, int *nTips) void ACCTRAN2(int *dat, int *nr, int *node, int *edge, int *nl, int *nTips) { int i; for (i=0; i< *nl; i++) { // , pars, weight, &pvec[i] if(edge[i]>nTips[0]) fitchT(&dat[(edge[i]-1L) * (*nr)], &dat[(node[i]-1) * (*nr)], nr); } } // , int *nTips void ACCTRAN3(int *dat, int *nr, double *pars, int *node, int *edge, int *nl, double *weight, double *pvec) { int i; for (i=0; i< *nr; i++)pars[i]=0.0; for(i=0; i< *nl; i++)pvec[i] = 0.0; for (i=0; i< *nl; i++) { fitchT3(&dat[(edge[i]-1L) * (*nr)], &dat[(node[i]-1) * (*nr)], nr, pars, weight, &pvec[i]); } } void fitchN(int *dat1, int *dat2, int *nr){ int k; int tmp; for(k = 0; k < (*nr); k++){ tmp = dat1[k] & dat2[k]; if(tmp) dat1[k] = tmp; else dat1[k] = dat1[k] | dat2[k]; } } // MPR reconstruction nicht immer gleiches ergebnis void fitchTriplet(int *res, int *dat1, int *dat2, int *dat3, int *nr) { int k; int *v1, *v2, *v3; v1 = (int *) R_alloc(*nr, sizeof(int)); v2 = (int *) R_alloc(*nr, sizeof(int)); v3 = (int *) R_alloc(*nr, sizeof(int)); for(k = 0; k < (*nr); k++) v1[k] = dat1[k]; fitchN(v1, dat2, nr); fitchN(v1, dat3, nr); for(k = 0; k < (*nr); k++) v2[k] = dat1[k]; fitchN(v2, dat3, nr); fitchN(v2, dat2, nr); for(k = 0; k < (*nr); k++) v3[k] = dat2[k]; fitchN(v3, dat3, nr); fitchN(v3, dat1, nr); for(k = 0; k < (*nr); k++)res[k] = v1[k] & v2[k]; // &v3[k]; for(k = 0; k < (*nr); k++)res[k] = res[k] & v3[k]; } void fitchTripletACC4(int *root, int *dat1, int *dat2, int *dat3, int *nr, double *p1, double *p2, double *p3, double *weight, double *pars1, int *v1) { int k; int tmp, a, b, c, t1, t2, t3; double d, f; for(k = 0; k < (*nr); k++){ tmp = root[k]; a = dat1[k] & dat2[k]; b = dat1[k] & dat3[k]; c = dat2[k] & dat3[k]; if((a+b+c) == 0L){ d = (2.0/3.0) * weight[k]; p1[0] += d; p2[0] += d; p3[0] += d; pars1[k] += 2*weight[k]; v1[k] = 2L; } else{ f = 0.0; d = weight[k]; t1 = 0.0; t2 = 0.0; t3 = 0.0; if( (dat1[k] & tmp)0.0){ pars1[k] += weight[k]; p1[0] += t1/f; p2[0] += t2/f; p3[0] += t3/f; v1[k] += 1L; } } } } // eleganter in Rcpp SEXP FITCH345(SEXP nrx, SEXP node, SEXP edge, SEXP l, SEXP mx, SEXP ps){ int *nr=INTEGER(nrx), m=INTEGER(mx)[0], i; double *pvtmp; SEXP pars, pscore; PROTECT(pars = allocVector(INTSXP, *nr)); PROTECT(pscore = allocVector(REALSXP, 1L)); pvtmp = (double *) R_alloc(m, sizeof(double)); for(i=0; i using namespace Rcpp; #define DINDEX(i, j) n*(i - 1) - i * (i - 1)/2 + j - i - 1 //library(tools) //package_native_routine_registration_skeleton("package-root-directory") // import: edge matrix, number of tips // export: Descendants(x, 1:max(x$edge), "all") // [[Rcpp::export]] List allDescCPP(IntegerMatrix orig, int nTips) { IntegerVector parent = orig( _, 0); IntegerVector children = orig( _, 1); int m = max(parent); // create list for results std::vector< std::vector > out(m) ; for(int i = 0; i y; for(int i = 0; i nTips){ y = out[children[i] -1L]; out[parent[i]-1L].insert( out[parent[i]-1L].end(), y.begin(), y.end() ); } } // return the list return wrap(out); } // replacement for bipart maybe more error tolerant and slightly slower // import: edge matrix, number of tips // export: Descendants(x, 1:max(x$edge), "all") // [[Rcpp::export]] List bipartCPP(IntegerMatrix orig, int nTips) { IntegerVector parent = orig( _, 0); IntegerVector children = orig( _, 1); int m = max(parent), j=0; int nnode = m - nTips; // create list for results std::vector< std::vector > out(nnode) ; std::vector y; for(int i = 0; i nTips){ y = out[children[i] - nTips -1L]; out[j].insert( out[j].end(), y.begin(), y.end() ); } else out[j].push_back(children[i]); } for(int i=0; i > bipCPP(IntegerMatrix orig, int nTips) { IntegerVector parent = orig( _, 0); IntegerVector children = orig( _, 1); int m = max(parent), j=0; // create list for results std::vector< std::vector > out(m) ; std::vector y; for(int i = 0; i nTips){ y = out[children[i] - 1L]; out[j].insert( out[j].end(), y.begin(), y.end() ); } else out[j].push_back(children[i]); } for(int i=0; i > out(m) ; for(int i = 0; i (m * eps)) res(i)+=tmp[j]; } } return res; } // [[Rcpp::export]] NumericVector node_height_cpp(IntegerVector edge1, IntegerVector edge2, NumericVector edge_length) { NumericVector xx(max(edge2)); for (int i = (edge2.size() - 1); i >= 0; i--) xx[edge2[i] - 1] = xx[edge1[i] - 1] + edge_length[i]; return(max(xx) - xx); } /* Fast cophenetic distance */ int give_index3(int i, int j, int n) { if (i > j) return(DINDEX(j, i)); else return(DINDEX(i, j)); } void copheneticHelpCpp(std::vector left, std::vector right, int h, NumericVector nh, int nTips, NumericVector dm){ int ind; for(std::size_t i=0; i > bip = bipCPP(edge, nTips); NumericVector dm( nTips * (nTips-1) /2 ); int l=0, left, right; for(int h=nNode; h<(nNode + nTips); h++){ // changed from NumericVector to IntegerVector IntegerVector tmp_ch = ch[h]; l = tmp_ch.size(); for(int j=0; j<(l-1L); j++){ left = tmp_ch[j] - 1; for(int k=j+1L; kthresholds[j] && j #include #include #include #include /* standard integer types (int32_t typedef etc.) [C99]*/ #define true 1U /*!< Boolean TRUE */ #define false 0U /*!< Boolean FALSE */ typedef unsigned char bool; typedef struct splitset_struct* splitset; typedef struct hungarian_struct* hungarian; typedef struct bipartition_struct* bipartition; typedef struct bipsize_struct* bipsize; struct splitset_struct { int size, spsize, spr, spr_extra, rf, hdist; /*! \brief spr, extra prunes for spr, rf distances and hdist=assignment cost */ int n_g, n_s, n_agree, n_disagree; bipartition *g_split, *s_split, *agree, *disagree; bipartition prune; hungarian h; /* hungarian method for solving the assignment between edges */ bool match; /*! \brief do we want to calculate the minimum cost assignment */ }; struct hungarian_struct { int **cost, *col_mate; /*! \brief cost matrix, and col_mate[row] with column match for row */ int size, /*! \brief assignment size. Cost is a square matrix, so size should be an overestimate where "missing" nodes are added w/ cost zero */ initial_cost, /*! \brief sum of lowest input cost values for each column. The hungarian method rescales them so that minimum per column is zero */ final_cost; /*! \brief our final cost is on rescaled cost matrix, therefore to restore the "classical" optimal cost one should sum it with initial_cost */ int *unchosen_row, *row_dec, *slack_row, *row_mate, *parent_row, *col_inc, *slack; /* aux vectors */ }; /*! \brief Bit-string representation of splits. */ struct bipartition_struct { unsigned long long *bs; /*! \brief Representation of a bipartition by a vector of integers (bitstrings). */ int n_ones; /*! \brief Counter (number of "one"s) */ bipsize n; /*! \brief number of bits (leaves), vector size and mask */ int ref_counter; /*! \brief How many times this struct is being referenced */ }; struct bipsize_struct { unsigned long long mask;/*! \brief mask to make sure we consider only active positions (of last bitstring) */ int ints, bits, original_size; /*! \brief Vector size and total number of elements (n_ints = n_bits/(8*sizeof(long long)) +1). */ int ref_counter; /*! \brief How many times this struct is being referenced */ }; /*! \brief Allocate space for splitset structure (two vectors of bipartitions), for simple comparisons */ splitset new_splitset (int nleaves, int nsplits); /*! \brief free memory allocated for splitset structure */ void del_splitset (splitset split); /*! \brief low level function that does the actual SPR and hdist calculation based on a filled splitset struct */ int dSPR_topology_lowlevel (splitset split); /*! \brief function used by qsort for a vector of bipartitions (from smaller to larger) */ int compare_splitset_bipartition_increasing (const void *a1, const void *a2); /* BELOW: low level functions that work with bipartitions */ void split_create_agreement_list (splitset split); void split_remove_agree_edges (splitset split, bipartition *b, int *nb); void split_remove_duplicates (bipartition *b, int *nb); void split_compress_agreement (splitset split); void split_create_disagreement_list (splitset split); void split_disagreement_assign_match (splitset split); void split_find_small_disagreement (splitset split); void split_remove_small_disagreement (splitset split); void split_minimize_subtrees (splitset split); void split_remove_redundant_bit (splitset split, int id); void split_replace_bit (splitset split, int to, int from); void split_new_size (splitset split, int size, bool update_bipartitions); void split_swap_position (bipartition *b, int i1, int i2); /* BELOW: Hungarian method for bipartite matching (assignment) */ hungarian new_hungarian (int size); void hungarian_reset (hungarian p); void hungarian_update_cost (hungarian p, int row, int col, int cost); void del_hungarian (hungarian p); void hungarian_solve (hungarian p, int this_size); /* BELOW: Memory-efficient, fast bipartition comparisions based on 64bit representation of splits */ bipartition new_bipartition (int size); bipsize new_bipsize (int size); bipartition new_bipartition_copy_from (const bipartition from); bipartition new_bipartition_from_bipsize (bipsize n); void del_bipartition (bipartition bip); void del_bipsize (bipsize n); void bipsize_resize (bipsize n, int nbits); void bipartition_initialize (bipartition bip, int position); void bipartition_zero (bipartition bip); void bipartition_set (bipartition bip, int position); void bipartition_set_lowlevel (bipartition bip, int i, int j); void bipartition_unset (bipartition bip, int position); void bipartition_unset_lowlevel (bipartition bip, int i, int j); void bipartition_copy (bipartition to, const bipartition from); void bipartition_OR (bipartition result, const bipartition b1, const bipartition b2, bool update_count); void bipartition_AND (bipartition result, const bipartition b1, const bipartition b2, bool update_count); void bipartition_ANDNOT (bipartition result, const bipartition b1, const bipartition b2, bool update_count); void bipartition_XOR (bipartition result, const bipartition b1, const bipartition b2, bool update_count); void bipartition_XORNOT (bipartition result, const bipartition b1, const bipartition b2, bool update_count); void bipartition_NOT (bipartition result, const bipartition bip); void bipartition_count_n_ones (const bipartition bip); void bipartition_to_int_vector (const bipartition b, int *id, int vecsize); bool bipartition_is_equal (const bipartition b1, const bipartition b2); bool bipartition_is_equal_bothsides (const bipartition b1, const bipartition b2); bool bipartition_is_larger (const bipartition b1, const bipartition b2); void bipartition_flip_to_smaller_set (bipartition bip); bool bipartition_is_bit_set (const bipartition bip, int position); bool bipartition_contains_bits (const bipartition b1, const bipartition b2); // void bipartition_print_to_stdout (const bipartition b1); void bipartition_replace_bit_in_vector (bipartition *bvec, int n_b, int to, int from, bool reduce); void bipartition_resize_vector (bipartition *bvec, int n_b); /*! \brief Main SPR calculation function, to be used within R */ SEXP C_sprdist (SEXP bp1, SEXP bp2, SEXP lt) { int i, j, n_leaves = INTEGER(lt)[0]; SEXP result; double *res; splitset split; PROTECT(result = allocVector(REALSXP, 4)); res = REAL(result); // if (length(bp1) != length(bp2)) error ("number of bipartitions given to C_sprdist are not the same"); split = new_splitset (n_leaves, length(bp1)); for (i=0; i < split->size; i++) { // for (j=0; j < length(VECTOR_ELT (bp1, i)); j++) printf (";;%d ", INTEGER (VECTOR_ELT (bp1, i))[j]); for (j=0; j < length(VECTOR_ELT (bp1, i)); j++) bipartition_set (split->g_split[i], INTEGER (VECTOR_ELT (bp1, i))[j] - 1); for (j=0; j < length(VECTOR_ELT (bp2, i)); j++) bipartition_set (split->s_split[i], INTEGER (VECTOR_ELT (bp2, i))[j] - 1); } dSPR_topology_lowlevel (split); res[0] = split->spr; res[1] = split->spr_extra; res[2] = split->rf; res[3] = split->hdist; del_splitset (split); UNPROTECT(1); // result return(result); } /* functions below should not be called outside this scope */ splitset new_splitset (int nleaves, int nsplits) { splitset split; int i; split = (splitset) malloc (sizeof (struct splitset_struct)); split->n_g = split->n_s = split->size = nsplits; split->n_agree = split->n_disagree = 0; split->prune = NULL; split->match = true; /* do we want to calculate the assignment matching cost (using hungarian() )? */ split->spr = split->spr_extra = split->rf = split->hdist = 0; split->g_split = (bipartition*) malloc (split->size * sizeof (bipartition)); split->s_split = (bipartition*) malloc (split->size * sizeof (bipartition)); split->g_split[0] = new_bipartition (nleaves); split->s_split[0] = new_bipartition (nleaves); for (i = 1; i < split->size; i++) { split->g_split[i] = new_bipartition_from_bipsize (split->g_split[0]->n); /* use same bipsize */ split->s_split[i] = new_bipartition_from_bipsize (split->s_split[0]->n); } split->agree = (bipartition*) malloc (split->size * sizeof (bipartition)); split->disagree = (bipartition*) malloc (split->size * split->size * sizeof (bipartition)); split->agree[0] = new_bipartition (nleaves); // this bipsize will be recycled below split->disagree[0] = new_bipartition (nleaves); for (i = 1; i < split->size; i++) split->agree[i] = new_bipartition_from_bipsize (split->agree[0]->n); for (i = 1; i < split->size * split->size; i++) split->disagree[i] = new_bipartition_from_bipsize (split->disagree[0]->n); split->prune = new_bipartition_from_bipsize (split->disagree[0]->n); split->h = new_hungarian (split->size); return split; } void del_splitset (splitset split) { int i; if (!split) return; del_bipartition (split->prune); if (split->disagree) { for (i = split->size * split->size - 1; i >= 0; i--) del_bipartition (split->disagree[i]); free (split->disagree); } if (split->agree) { for (i = split->size - 1; i >= 0; i--) del_bipartition (split->agree[i]); free (split->agree); } if (split->g_split) { for (i = split->size - 1; i >= 0; i--) del_bipartition (split->g_split[i]); free (split->g_split); } del_hungarian (split->h); free (split); } int compare_splitset_bipartition_increasing (const void *a1, const void *a2) { /* similar to bipartition_is_larger() */ bipartition *b1 = (bipartition *) a1; bipartition *b2 = (bipartition *) a2; int i; if ((*b1)->n_ones > (*b2)->n_ones) return 1; if ((*b1)->n_ones < (*b2)->n_ones) return -1; for (i = (*b1)->n->ints - 1; (i >= 0) && ((*b1)->bs[i] == (*b2)->bs[i]); i--); /* find position of distinct bipartition elem*/ if (i < 0) return 0; /* identical bipartitions */ if ((*b1)->bs[i] > (*b2)->bs[i]) return 1; else return -1; } int dSPR_topology_lowlevel (splitset split) { int i = 0, mismatch = -1; for (i=0; i < split->size; i++) { bipartition_flip_to_smaller_set (split->g_split[i]); bipartition_flip_to_smaller_set (split->s_split[i]); } qsort (split->g_split, split->size, sizeof (bipartition), compare_splitset_bipartition_increasing); qsort (split->s_split, split->size, sizeof (bipartition), compare_splitset_bipartition_increasing); //for (i = 0; i < split->n_g; i++) bipartition_print_to_stdout (split->g_split[i]); printf ("G ::DEBUG 0 ::\n"); //for (i = 0; i < split->n_s; i++) bipartition_print_to_stdout (split->s_split[i]); printf ("S\n"); i++; /* to trick -Werror, since we don't use it unless for debug */ while (mismatch) { split_create_agreement_list (split); // vector of identical bipartitions split_compress_agreement (split); // iterative replacement of cherry by new leaf // for (i = 0; i < split->n_g; i++) bipartition_print_to_stdout (split->g_split[i]); printf ("G ::DEBUG::\n"); // for (i = 0; i < split->n_s; i++) bipartition_print_to_stdout (split->s_split[i]); printf ("S\n"); // for (i = 0; i < split->n_agree; i++) bipartition_print_to_stdout (split->agree[i]); printf ("A\n"); if (mismatch == -1) split->rf = split->n_g + split->n_s; mismatch = (split->n_g > 0) && (split->n_s > 0); // all edges were in agreement if (!mismatch) return split->spr; split_create_disagreement_list (split); // vector of smallest disagreements split_disagreement_assign_match (split); /* assignment matching between edges using hungarian method (split->hdist after first time) */ split_remove_duplicates (split->disagree, &(split->n_disagree)); // some elements are equal; this function also qsorts split_find_small_disagreement (split); // could also be one leaf only //for (i = 0; i < split->n_disagree; i++) { bipartition_print_to_stdout (split->disagree[i]); printf ("\n"); } //printf ("{%d} prune: ", split->n_disagree); bipartition_print_to_stdout (split->prune); printf ("\n"); split->spr++; split_remove_small_disagreement (split); split_minimize_subtrees (split); mismatch = (split->n_g > 0) && (split->n_s > 0); // all edges were in agreement } return split->spr; } void split_create_agreement_list (splitset split) { int s, g; for (g = 0; g < split->n_g; g++) for (s = 0; s < split->n_s; s++) if (bipartition_is_equal (split->g_split[g], split->s_split[s])) { bipartition_copy (split->agree[split->n_agree++], split->g_split[g]); split->n_g--; split_swap_position (split->g_split, g, split->n_g); /* if we don't swap them, we lose ref to "old" value on g_split[] */ split->n_s--; split_swap_position (split->s_split, s, split->n_s); g--; s = split->n_s; /* pretend loop finished, examine again with new values */ } split_remove_agree_edges (split, split->g_split, &(split->n_g)); split_remove_agree_edges (split, split->s_split, &(split->n_s)); } void split_remove_agree_edges (splitset split, bipartition *b, int *nb) { int i, a; for (i = 0; i < (*nb); i++) for (a = 0; a < split->n_agree; a++) if (bipartition_is_equal (b[i], split->agree[a])) { (*nb)--; split_swap_position (b, i, (*nb)); i--; a = split->n_agree; /* loop again over new value */ } } void split_remove_duplicates (bipartition *b, int *nb) { int i, j; bipartition pivot; if ((*nb) < 2) return; /* only if we have a vector with > 1 element */ qsort (b, (*nb), sizeof (bipartition), compare_splitset_bipartition_increasing); for (i = (*nb) - 1; i >= 1; i--) if (bipartition_is_equal (b[i], b[i-1])) { pivot = b[i]; /* do not lose a pointer to this element */ for (j = i; j < (*nb)-1; j++) b[j] = b[j+1]; b[j] = pivot; /* j = (*nb) - 1, which will become obsolete through next line --> (*nb)-- */ (*nb)--; } } void split_compress_agreement (splitset split) { int i, j, pair[2]; for (i = 0; i < split->n_agree; i++) if (split->agree[i]->n_ones == 2) { /* cherry in common, can be represented by just one leaf */ bipartition_to_int_vector (split->agree[i], pair, 2); split_remove_redundant_bit (split, pair[1]); split_new_size (split,split->agree[0]->n->bits - 1, false); /* false = do not recalculate every bipartition's last elem */ bipartition_resize_vector (split->agree, split->n_agree); for (j = 0; j < split->n_agree; j++) { /* minimize subtree size and remove single leaves */ bipartition_flip_to_smaller_set (split->agree[j]); /* agree only */ if (split->agree[j]->n_ones < 2) split_swap_position (split->agree, j--, --split->n_agree); } i = -1; /* redo all iterations, with new info (agree[] will be smaller) */ } bipartition_resize_vector (split->g_split, split->n_g); bipartition_resize_vector (split->s_split, split->n_s); } void split_create_disagreement_list (splitset split) { int g, s; for (g = 0; g < split->n_g; g++) for (s = 0; s < split->n_s; s++) { bipartition_XOR (split->disagree[g * split->n_s + s], split->g_split[g], split->s_split[s], true); /* true means to calculate n_ones */ bipartition_flip_to_smaller_set (split->disagree[g * split->n_s + s]); } split->n_disagree = split->n_g * split->n_s; } void split_disagreement_assign_match (splitset split) { /* also calculates split->hdist */ int g, s, max_n, sum = 0; if (split->n_g > split->n_s) max_n = split->n_g; else max_n = split->n_s; if (max_n < 2) return; hungarian_reset (split->h); for (g = 0; g < split->n_g; g++) for (s = 0; s < split->n_s; s++) hungarian_update_cost (split->h, g, s, split->disagree[g * split->n_s + s]->n_ones); hungarian_solve (split->h, max_n); /* now split->h->col_mate will have the pairs */ /* if we do the matching below it becomes much faster, but we may miss the best prune subtrees in a few cases (do not compromise the algo) */ split->n_disagree = 0; for (g = 0; g < max_n; g++) if ((g < split->n_g) && ( split->h->col_mate[g] < split->n_s)) { /* some matchings might be to dummy edges */ bipartition_XOR (split->disagree[split->n_disagree], split->g_split[g], split->s_split[split->h->col_mate[g]], true); /* true means to calculate n_ones */ bipartition_flip_to_smaller_set (split->disagree[split->n_disagree++]); sum += split->disagree[split->n_disagree-1]->n_ones; } if (split->match) { split->hdist = split->h->final_cost+split->h->initial_cost; split->match = false; } } void split_find_small_disagreement (splitset split) { bipartition dis; int a, d; bipartition_copy (split->prune, split->disagree[0]); /* smallest, in case we don't find a better one in loop below */ if (split->prune->n_ones < 2) return; dis = new_bipartition_from_bipsize (split->disagree[0]->n); for (d = 0; d < split->n_disagree; d++) for (a = 0; a < split->n_agree; a++) { if ((split->disagree[d]->n_ones == split->agree[a]->n_ones) || (split->disagree[d]->n_ones == (split->agree[a]->n->bits - split->agree[a]->n_ones))) { bipartition_XOR (dis, split->disagree[d], split->agree[a], true); if (!dis->n_ones) { bipartition_copy (split->prune, split->disagree[d]); d = split->n_disagree; a = split->n_agree; } else if (dis->n_ones == dis->n->bits) { bipartition_NOT (split->prune, split->disagree[d]); d = split->n_disagree; a = split->n_agree; } } } /* check if prune nodes are all on same side of a tree or if they are actually two SPRs (one from each tree) */ for (d = 0; d < split->n_g; d++) { if (!bipartition_contains_bits (split->g_split[d], split->prune)) { bipartition_NOT (dis, split->g_split[d]); if (!bipartition_contains_bits (dis, split->prune)) { split->spr_extra++; d = split->n_g; } } } del_bipartition (dis); } void split_remove_small_disagreement (splitset split) { int *index, i, j = split->prune->n_ones - 1, k = 0, size = split->agree[0]->n->bits; index = (int*) malloc (split->prune->n_ones * sizeof (int)); bipartition_to_int_vector (split->prune, index, split->prune->n_ones); for (i = size - 1; i >= (size - split->prune->n_ones); i--) { if (index[k] >= (size - split->prune->n_ones)) i = -1; else { if (i == index[j]) j--; else split_replace_bit (split, index[k++], i); } } split_new_size (split,size - split->prune->n_ones, true); if (index) free (index); } void split_minimize_subtrees (splitset split) { int i; for (i = 0; i < split->n_s; i++) { bipartition_flip_to_smaller_set (split->s_split[i]); if (split->s_split[i]->n_ones < 2) { split->n_s--; split_swap_position (split->s_split, i, split->n_s); i--; } } for (i = 0; i < split->n_g; i++) { bipartition_flip_to_smaller_set (split->g_split[i]); if (split->g_split[i]->n_ones < 2) { split->n_g--; split_swap_position (split->g_split, i, split->n_g); i--; } } for (i = 0; i < split->n_agree; i++) { bipartition_flip_to_smaller_set (split->agree[i]); if (split->agree[i]->n_ones < 2) { split->n_agree--; split_swap_position (split->agree, i, split->n_agree); i--; } } } void split_remove_redundant_bit (splitset split, int id) { int last = split->agree[0]->n->bits-1; if (id < last) split_replace_bit (split, id, last); } void split_replace_bit (splitset split, int to, int from) { if (from <= to) return; /*not needed for disagree[] */ bipartition_replace_bit_in_vector (split->agree, split->n_agree, to, from, true); bipartition_replace_bit_in_vector (split->g_split, split->n_g, to, from, true); bipartition_replace_bit_in_vector (split->s_split, split->n_s, to, from, true); } void split_new_size (splitset split, int size, bool update_bipartitions) { bipsize_resize (split->g_split[0]->n, size); bipsize_resize (split->s_split[0]->n, size); bipsize_resize (split->agree[0]->n, size); bipsize_resize (split->disagree[0]->n, size); if (update_bipartitions) { bipartition_resize_vector (split->g_split, split->n_g); bipartition_resize_vector (split->s_split, split->n_s); bipartition_resize_vector (split->agree, split->n_agree); } } void split_swap_position (bipartition *b, int i1, int i2) { bipartition pivot = b[i1]; b[i1] = b[i2]; b[i2] = pivot; } /* The hungarian method below is copied from http://www.informatik.uni-freiburg.de/~stachnis/misc.html * The (edited) original message follows: * ** libhungarian by Cyrill Stachniss, 2004 Solving the Minimum Assignment Problem using the ** Hungarian Method. ** This file may be freely copied and distributed! ** ** ** Parts of the used code was originally provided by the "Stanford GraphGase", but I made changes to this code. ** As asked by the copyright node of the "Stanford GraphGase", I hereby proclaim that this file are *NOT* part of the ** "Stanford GraphGase" distrubition! */ void hungarian_reset (hungarian p) { int i, j; for (i = 0; i < p->size; i++) { p->col_mate[i] = p->unchosen_row[i] = p->row_dec[i] = p->slack_row[i] = p->row_mate[i] = p->parent_row[i] = p->col_inc[i] = p->slack[i] = 0; for (j = 0; j < p->size; j++) p->cost[i][j] = 0; } p->final_cost = 0; } hungarian new_hungarian (int size) { int i; hungarian p; p = (hungarian) malloc (sizeof (struct hungarian_struct)); p->size = size; /* n_rows = n_columns; if it's not, fill with zeroes (no cost) */ p->cost = (int**) malloc (size * sizeof (int*)); for (i = 0; i < p->size; i++) p->cost[i] = (int*) malloc (size * sizeof (int)); /* edges would be assignment_matrix[ i * ncols + col_mate[i] ] = true; and other elems "false" (but we don't use the matrix notation) */ p->col_mate = (int*) malloc (size * sizeof (int)); /* for a given row node, col_mate[row] is the assigned col node */ p->unchosen_row = (int*) malloc (size * sizeof (int)); p->row_dec = (int*) malloc (size * sizeof (int)); p->slack_row = (int*) malloc (size * sizeof (int)); p->row_mate = (int*) malloc (size * sizeof (int)); p->parent_row = (int*) malloc (size * sizeof (int)); p->col_inc = (int*) malloc (size * sizeof (int)); p->slack = (int*) malloc (size * sizeof (int)); hungarian_reset (p); return p; } void hungarian_update_cost (hungarian p, int row, int col, int cost) { if (row >= p->size) return; if (col >= p->size) return; p->cost[row][col] = cost; } void del_hungarian (hungarian p) { int i; if (!p) return; if (p->cost) { for (i = p->size - 1; i >= 0; i--) if (p->cost[i]) free (p->cost[i]); free (p->cost); } free (p->col_mate); /* this is the important one, with i assigned to col_mate[i] */ free (p->slack); free (p->col_inc); free (p->parent_row); free (p->row_mate); free (p->slack_row); free (p->row_dec); free (p->unchosen_row); free (p); } void hungarian_solve (hungarian p, int this_size) { int i, j, nrows = this_size, ncols = this_size, k, l, s, t, q, unmatched; p->final_cost = p->initial_cost = 0; if (this_size > p->size) { p->final_cost = -1; return; } /* we don't call biomcmc_error(), but it *is* an error! */ for (l = 0; l < ncols; l++) { // Begin subtract column minima in order to start with lots of zeroes 12 s = p->cost[0][l]; for (k = 1; k < nrows; k++) if (p->cost[k][l] < s) s = p->cost[k][l]; p->initial_cost += s; /* this should be added to final_cost to have classical assignment cost; here we distinguish them */ if (s!=0) for (k = 0; k < nrows; k++) p->cost[k][l] -= s; } // End subtract column minima in order to start with lots of zeroes 12 // Begin initial state 16 t=0; for (l = 0; l < ncols; l++) { // n => num_cols p->row_mate[l]= -1; p->parent_row[l]= -1; p->col_inc[l]=0; p->slack[l]= 0x7FFFFFFF; } for (k = 0; k < nrows; k++) { // m => num_rows s = p->cost[k][0]; for (l = 1; l < ncols; l++) if (p->cost[k][l] < s) s = p->cost[k][l]; p->row_dec[k]=s; for (l = 0; l < ncols; l++) if ((s==p->cost[k][l]) && (p->row_mate[l] < 0)) { p->col_mate[k] = l; p->row_mate[l] = k; // fprintf(stderr, "matching col %d==row %d\n",l,k); goto row_done; } p->col_mate[k] = -1; // fprintf(stderr, "node %d: unmatched row %d\n",t,k); p->unchosen_row[t++] = k; row_done: ; } // End initial state 16 // Begin Hungarian algorithm 18 if (t==0) goto done; unmatched=t; while (1) { q=0; // fprintf(stderr, "Matched %d rows.\n",m-t); while (1) { while (qunchosen_row[q]; s=p->row_dec[k]; for (l=0;lslack[l]) { int del; del = p->cost[k][l] - s + p->col_inc[l]; if (del < p->slack[l]) { if (del==0) { if (p->row_mate[l]<0) goto breakthru; p->slack[l]=0; p->parent_row[l]=k; // fprintf(stderr, "node %d: row %d==col %d--row %d\n", t,row_mate[l],l,k); p->unchosen_row[t++]=p->row_mate[l]; } else { p->slack[l]=del; p->slack_row[l]=k; } } } } // End explore node q of the forest 19 q++; } // Begin introduce a new zero into the matrix 21 s = 0x7FFFFFFF; for (l = 0;l < ncols; l++) if (p->slack[l] && p->slack[l] < s) s = p->slack[l]; for (q = 0; q < t; q++) p->row_dec[ p->unchosen_row[q] ] += s; for (l = 0; l < ncols; l++) if (p->slack[l]) { p->slack[l]-=s; if (p->slack[l]==0) { // Begin look at a new zero 22 k = p->slack_row[l]; // fprintf(stderr, "Decreasing uncovered elements by %d produces zero at [%d,%d]\n", s,k,l); if (p->row_mate[l]<0) { for (j=l+1;jslack[j]==0) p->col_inc[j]+=s; goto breakthru; } else { p->parent_row[l]=k; // fprintf(stderr, "node %d: row %d==col %d--row %d\n",t,row_mate[l],l,k); p->unchosen_row[t++]=p->row_mate[l]; } } // End look at a new zero 22 } else p->col_inc[l]+=s; // End introduce a new zero into the matrix 21 } breakthru: // fprintf(stderr, "Breakthrough at node %d of %d!\n",q,t); while (1) { // Begin update the matching 20 j=p->col_mate[k]; p->col_mate[k]=l; p->row_mate[l]=k; // fprintf(stderr, "rematching col %d==row %d\n",l,k); if (j<0) break; k=p->parent_row[j]; l=j; } // End update the matching 20 if (--unmatched==0) goto done; // Begin get ready for another stage 17 t=0; for (l=0;lparent_row[l]= -1; p->slack[l]=0x7FFFFFFF; } for (k=0;kcol_mate[k]<0) p->unchosen_row[t++]=k; // fprintf(stderr, "node %d: unmatched row %d\n",t,k); // End get ready for another stage 17 } done: // Begin doublecheck the solution 23 for (k = 0; k < nrows; k++) for (l=0;lcost[k][l] < p->row_dec[k] - p->col_inc[l]) { p->final_cost = -1; return;} //printf ("\n**\n"); for (k = 0; k < nrows; k++) { l=p->col_mate[k]; if ((l < 0) || (p->cost[k][l] != p->row_dec[k] - p->col_inc[l])) { p->final_cost = -1; return; } } k=0; for (l=0;lcol_inc[l]) k++; if (k>nrows) { p->final_cost = -1; return; } // End doublecheck the solution 23 // End Hungarian algorithm 18 for (k = 0; k < nrows; ++k) for (l = 0; l < ncols; ++l) p->cost[k][l] = p->cost[k][l] - p->row_dec[k] + p->col_inc[l]; for (i = 0; i < nrows; i++) p->final_cost += p->row_dec[i]; for (i = 0; i < ncols; i++) p->final_cost -= p->col_inc[i]; // fprintf(stderr, "Cost is %d\n",cost); } /* BELOW are the bipartition functions (memory-efficient storage of bipartitions on 64 bits */ int BitStringSize = 8 * sizeof (unsigned long long); bipartition new_bipartition (int size) { bipartition bip; int i; bip = (bipartition) malloc (sizeof (struct bipartition_struct)); bip->n = new_bipsize (size); bip->n_ones = 0; bip->ref_counter = 1; bip->bs = (unsigned long long*) malloc (bip->n->ints * sizeof (unsigned long long)); for (i=0; i < bip->n->ints; i++) bip->bs[i] = 0ULL; return bip; } bipsize new_bipsize (int size) { bipsize n; int i; n = (bipsize) malloc (sizeof (struct bipsize_struct)); n->bits = n->original_size = size; n->ref_counter = 1; n->ints = size/BitStringSize + 1; n->mask = 0ULL; for (i=0; i < n->bits%BitStringSize; i++) n->mask |= (1ULL << i); /* disregard other bits */ return n; } bipartition new_bipartition_copy_from (const bipartition from) { bipartition bip; int i; bip = (bipartition) malloc (sizeof (struct bipartition_struct)); bip->n = new_bipsize (from->n->bits); bip->n_ones = from->n_ones; bip->ref_counter = 1; bip->bs = (unsigned long long*) malloc (bip->n->ints * sizeof (unsigned long long)); for (i=0; i < bip->n->ints; i++) bip->bs[i] = from->bs[i]; return bip; } bipartition new_bipartition_from_bipsize (bipsize n) { bipartition bip; int i; bip = (bipartition) malloc (sizeof (struct bipartition_struct)); bip->n = n; bip->n->ref_counter++; bip->n_ones = 0; bip->ref_counter = 1; bip->bs = (unsigned long long*) malloc (bip->n->ints * sizeof (unsigned long long)); for (i=0; i < bip->n->ints; i++) bip->bs[i] = 0ULL; return bip; } void del_bipartition (bipartition bip) { if (bip) { if (--bip->ref_counter) return; if (bip->bs) free (bip->bs); del_bipsize (bip->n); free (bip); } } void del_bipsize (bipsize n) { if (n) { if (--n->ref_counter) return; free (n); } } void bipsize_resize (bipsize n, int nbits) { int i; n->bits = nbits; n->ints = nbits/BitStringSize + 1; // might be smaller than original bs size n->mask = 0ULL; for (i=0; i < nbits%BitStringSize; i++) n->mask |= (1ULL << i); /* disregard other bits */ } void bipartition_initialize (bipartition bip, int position) { int i, j; for (i=0; i < bip->n->ints; i++) bip->bs[i] = 0ULL; j = position%BitStringSize; i = position/BitStringSize; bip->bs[i] = (1ULL << j); bip->n_ones = 1; } void bipartition_zero (bipartition bip) { int i; for (i=0; i < bip->n->ints; i++) bip->bs[i] = 0ULL; bip->n_ones = 0; } void bipartition_set (bipartition bip, int position) { bipartition_set_lowlevel (bip, position/BitStringSize, position%BitStringSize); } void bipartition_set_lowlevel (bipartition bip, int i, int j) { if (bip->bs[i] & (1ULL << j)) return; // bit already set bip->bs[i] |= (1ULL << j); bip->n_ones++; /* doesn't work if we reduce space later (check replace_int_in_vector() ) */ } void bipartition_unset (bipartition bip, int position) { bipartition_unset_lowlevel (bip, position/BitStringSize, position%BitStringSize); } void bipartition_unset_lowlevel (bipartition bip, int i, int j) { if (!(bip->bs[i] & (1ULL << j))) return; // bit already unset bip->bs[i] &= ~(1ULL << j); bip->n_ones--; } void bipartition_copy (bipartition to, const bipartition from) { int i; for (i=0; i < to->n->ints; i++) to->bs[i] = from->bs[i]; to->n_ones = from->n_ones; } void bipartition_OR (bipartition result, const bipartition b1, const bipartition b2, bool update_count) { int i; for (i=0; i < result->n->ints; i++) result->bs[i] = b1->bs[i] | b2->bs[i]; result->bs[i-1] &= b1->n->mask; /* do not change last bits (do not belong to bipartition) */ if (update_count) bipartition_count_n_ones (result); else result->n_ones = b1->n_ones + b2->n_ones; // works on topologies where b1 and b2 are disjoint } void bipartition_AND (bipartition result, const bipartition b1, const bipartition b2, bool update_count) { int i; for (i=0; i < result->n->ints; i++) result->bs[i] = b1->bs[i] & b2->bs[i]; result->bs[i-1] &= b1->n->mask; /* do not change last bits (do not belong to bipartition) */ if (update_count) bipartition_count_n_ones (result); else result->n_ones = 0;// update_count = false should be used only when you don't care about this value (temp var) } void bipartition_ANDNOT (bipartition result, const bipartition b1, const bipartition b2, bool update_count) { int i; for (i=0; i < result->n->ints; i++) result->bs[i] = b1->bs[i] & (~b2->bs[i]); result->bs[i-1] &= b1->n->mask; /* do not change last bits (do not belong to bipartition) */ if (update_count) bipartition_count_n_ones (result); else result->n_ones = 0;// update_count = false should be used only when you don't care about this value (temp var) } void bipartition_XOR (bipartition result, const bipartition b1, const bipartition b2, bool update_count) { int i; for (i=0; i < result->n->ints; i++) result->bs[i] = b1->bs[i] ^ b2->bs[i]; result->bs[i-1] &= b1->n->mask; /* do not change last bits (do not belong to bipartition) */ if (update_count) bipartition_count_n_ones (result); else result->n_ones = 0;// update_count = false should be used only when you don't care about this value (temp var) } void bipartition_XORNOT (bipartition result, const bipartition b1, const bipartition b2, bool update_count) { /* equivalent to XOR followed by NOT */ int i; for (i=0; i < result->n->ints; i++) result->bs[i] = b1->bs[i] ^ (~b2->bs[i]); result->bs[i-1] &= b1->n->mask; /* do not change last bits (do not belong to bipartition) */ if (update_count) bipartition_count_n_ones (result); else result->n_ones = 0;// update_count = false should be used only when you don't care about this value (temp var) } void bipartition_NOT (bipartition result, const bipartition bip) { int i; for (i=0; i < result->n->ints; i++) result->bs[i] = ~bip->bs[i]; result->bs[i-1] &= bip->n->mask; /* do not invert last bits (do not belong to bipartition) */ result->n_ones = bip->n->bits - bip->n_ones; } void bipartition_count_n_ones (const bipartition bip) { int i; unsigned long long j; bip->n_ones = 0; /* // Naive approach for (i=0; i < bip->n_ints - 1; i++) for (j=0; j < BitStringSize; j++) bip->n_ones += ((bip->bs[i] >> j) & 1ULL); for (j=0; j < bip->n_bits%BitStringSize; j++) bip->n_ones += ((bip->bs[i] >> j) & 1ULL); */ // clear the least significant bit set per iteration (Peter Wegner in CACM 3 (1960), 322, mentioned in K&R) for (i=0; i < bip->n->ints; i++) for (j = bip->bs[i]; j; bip->n_ones++) j &= j - 1ULL; } bool bipartition_is_equal (const bipartition b1, const bipartition b2) { int i; if (b1->n_ones != b2->n_ones) return false; if (b1->n->ints != b2->n->ints) return false; for (i=0; i < b1->n->ints - 1; i++) if (b1->bs[i] != b2->bs[i]) return false; b1->bs[i] &= b1->n->mask; b2->bs[i] &= b2->n->mask; /* apply mask before comparing last elems */ if (b1->bs[i] != b2->bs[i]) return false; return true; } bool bipartition_is_equal_bothsides (const bipartition b1, const bipartition b2) { int i; bool equal = true; for (i=0; (i < b1->n->ints - 1) && (equal); i++) if (b1->bs[i] != b2->bs[i]) equal = false; if ((equal) && ((b1->bs[i] & b1->n->mask) != (b2->bs[i] & b2->n->mask))) equal = false; if (equal) return true; /* the biparitions are already the same, without flipping the bits */ /* now we compare one bipartition with the complement of the other */ for (i=0; (i < b1->n->ints - 1); i++) if (b1->bs[i] != ~b2->bs[i]) return false; if ((b1->bs[i] & b1->n->mask) != ((~b2->bs[i]) & b2->n->mask)) return false; return true; /* they are the exact complement of one another */ } bool bipartition_is_larger (const bipartition b1, const bipartition b2) { int i; if (b1->n_ones > b2->n_ones) return true; if (b1->n_ones < b2->n_ones) return false; for (i = b1->n->ints - 1; (i >= 0) && (b1->bs[i] == b2->bs[i]); i--); /* find position of distinct bipartition elem*/ if (i < 0) return false; /* identical bipartitions */ if (b1->bs[i] > b2->bs[i]) return true; else return false; } void bipartition_flip_to_smaller_set (bipartition bip) { int i = bip->n->ints - 1; /* most significant position -- consistent with is_larger() above, using OLD algo below */ if ((2 * bip->n_ones) < bip->n->bits) return; /* it is already the smaller set */ /* OLD always x is different from ~x, so we just look at last element ("largest digits of number") */ // if (((2 * bip->n_ones) == bip->n->bits) && (bip->bs[i] < (bip->n->mask & ~bip->bs[i]))) return; /* NEW: resolve ties by always showing the same "side" of bipartition, that is, the one having an arbitrary leaf (first one, in our case) */ if (((2 * bip->n_ones) == bip->n->bits) && (bip->bs[0] & 1ULL)) return; for (i=0; i < bip->n->ints; i++) bip->bs[i] = ~bip->bs[i]; /* like bipartition_NOT() */ bip->bs[i-1] &= bip->n->mask; /* do not invert last bits (do not belong to bipartition) */ bip->n_ones = bip->n->bits - bip->n_ones; return; } bool bipartition_is_bit_set (const bipartition bip, int position) { if (bip->bs[(int)(position/BitStringSize)] & (1ULL << (int)(position%BitStringSize))) return true; return false; } bool bipartition_contains_bits (const bipartition b1, const bipartition b2) { /* generalization of bipartition_is_bit_set(); b1 contains or not b2 */ int i; if (b1->n_ones < b2->n_ones) return false; for (i=0; i < b1->n->ints; i++) if ((b2->bs[i]) && (b2->bs[i] != (b1->bs[i] & b2->bs[i]))) return false; return true; } void bipartition_to_int_vector (const bipartition b, int *id, int vecsize) { int i, j, k = 0; for (i=0; i < b->n->ints; i++) for (j=0; (j < BitStringSize) && (k < vecsize); j++) if ( ((b->bs[i] >> j) & 1ULL) ) id[k++] = i * BitStringSize + j; } /* void bipartition_print_to_stdout (const bipartition b1) { int i, j; for (i = 0; i < b1->n->ints - 1; i++) { for (j = 0; j < BitStringSize; j++) printf ("%d", (int)((b1->bs[i] >> j) & 1ULL)); printf ("."); } for (j = 0; j < b1->n->bits%BitStringSize; j++) printf ("%d", (int)((b1->bs[i] >> j) & 1ULL)); printf ("[%d] ", b1->n_ones); } */ void bipartition_replace_bit_in_vector (bipartition *bvec, int n_b, int to, int from, bool reduce) { /* copy info from position "from" to position "to" */ int k, j = from%BitStringSize, i = from/BitStringSize, j2 = to%BitStringSize, i2 = to/BitStringSize; /* boolean "reduce" means that bitstring space will be reduced (last bits will be removed), therefore the update of * n_ones is different from default bipartition_set() behaviour: it's not an extra "1" (that is, one that did not * contribute to n_ones), but an existing "1" that change places. Schematically: * from -> to | normal n_ones count | when bitstring is reduced afterwards * 0 -> 0 | 0 | 0 * 0 -> 1 | -1 | -1 * 1 -> 0 | +1 | 0 (since it's a leaf that belonged to position "from" and now is on position "to") * 1 -> 1 | 0 | -1 (in fact one of the two "1"s dissapeared after reducing the bitstring * (the above description is outdated since I rewrote by hand the bit functions -- observe how we must erase 1 values from "from") */ if (reduce) for (k = 0; k < n_b; k++) { // copy 0 or 1 values, erasing "from" values to avoid problems after reducing space (hanging 1s out of range) if ( ((bvec[k]->bs[i] >> j) & 1ULL) && ((bvec[k]->bs[i2] >> j2) & 1ULL) ) { bvec[k]->n_ones--; bvec[k]->bs[i] &= ~(1ULL << j); } else if ( ((bvec[k]->bs[i] >> j) & 1ULL) && !((bvec[k]->bs[i2] >> j2) & 1ULL) ) { bvec[k]->bs[i2] |= (1ULL << j2); bvec[k]->bs[i] &= ~(1ULL << j); } else if ( !((bvec[k]->bs[i] >> j) & 1ULL) && ((bvec[k]->bs[i2] >> j2) & 1ULL) ) { bvec[k]->bs[i2] &= ~(1ULL << j2); bvec[k]->n_ones--; } /* else do nothing (from zero to zero) */ } else for (k = 0; k < n_b; k++) { // copy 0 or 1 values if ( ((bvec[k]->bs[i] >> j) & 1ULL) ) bipartition_set_lowlevel (bvec[k], i2, j2); // will check if n_ones change or not else bipartition_unset_lowlevel (bvec[k], i2, j2); } } void bipartition_resize_vector (bipartition *bvec, int n_b) { int k, i = bvec[0]->n->ints - 1; for (k = 0; k < n_b; k++) { bvec[k]->bs[i] &= bvec[0]->n->mask; bipartition_count_n_ones (bvec[k]); } } phangorn/src/sankoff.c0000644000176200001440000001734213475602650014467 0ustar liggesusers/* * dist.c * * (c) 2008-2019 Klaus Schliep (klaus.schliep@gmail.com) * * * This code may be distributed under the GNU GPL * */ # define USE_RINTERNALS #include #include #include SEXP C_rowMin(SEXP sdat, SEXP sn, SEXP sk){ int i, h, n=INTEGER(sn)[0], k=INTEGER(sk)[0]; double x, *res, *dat; SEXP result; PROTECT(result = allocVector(REALSXP, n)); res = REAL(result); PROTECT(sdat = coerceVector(sdat, REALSXP)); dat = REAL(sdat); for(i = 0; i < n; i++){ x = dat[i]; for(h = 1; h< k; h++) {if(dat[i + h*n] < x) x=dat[i + h*n];} res[i] = x; } UNPROTECT(2); return(result); } void rowMin2(double *dat, int n, int k, double *res){ int i, h; double x; for(i = 0; i < n; i++){ x = dat[i]; for(h = 1; h< k; h++) {if(dat[i + h*n] < x) x=dat[i + h*n];} res[i] = x; } } void sankoff4(double *dat, int n, double *cost, int k, double *result){ int i, j, h; double x, tmp; for(i = 0; i < n; i++){ for(j = 0; j < k; j++){ x = dat[i] + cost[j*k]; for(h = 1; h< k; h++){ tmp = dat[i + h*n] + cost[h + j*k]; if(tmp=0; j--) { PROTECT(result = allocMatrix(REALSXP, nrx, ncx)); res = REAL(result); if (pj != nodes[j]) { for(i=0; i<(nrx * ncx); i++) tmp[i] = 0.0; sankoff4(REAL(VECTOR_ELT(dlist, nodes[j])), nrx, cost, ncx, tmp); for(i=0; i<(nrx * ncx); i++) res[i] = tmp[i] ; pj = nodes[j]; start = j; } else for(i=0; i<(nrx * ncx); i++) res[i] = tmp[i] ; k = start; while (k >= 0 && pj == nodes[k]) { if (k != j) sankoff4(REAL(VECTOR_ELT(data, edges[k])), nrx, cost, ncx, res); k--; } SET_VECTOR_ELT(dlist, edges[j], result); UNPROTECT(1); } UNPROTECT(1); return(dlist); } SEXP sankoffMPR(SEXP dlist, SEXP plist, SEXP scost, SEXP nr, SEXP nc, SEXP node, SEXP edge){ R_len_t i, n = length(node); int nrx=INTEGER(nr)[0], ncx=INTEGER(nc)[0], n0; int ei, j, *nodes=INTEGER(node), *edges=INTEGER(edge); SEXP result, dlist2; //tmp, double *res, *cost; // *rtmp, cost = REAL(scost); n0 = nodes[n-1L]; PROTECT(dlist2 = allocVector(VECSXP, n+1L)); PROTECT(result = allocMatrix(REALSXP, nrx, ncx)); res = REAL(result); for(j=0;j<(nrx*ncx);j++)res[j]=0.0; for(j=n-1L; j>=0; j--) { if(nodes[j]!=n0){ SET_VECTOR_ELT(dlist2, n0, result); UNPROTECT(1); n0 = nodes[j]; PROTECT(result = allocMatrix(REALSXP, nrx, ncx)); res = REAL(result); for(i=0; i<(nrx * ncx); i++) res[i] = 0.0; sankoff4(REAL(VECTOR_ELT(plist,nodes[j])), nrx, cost, ncx, res); } ei = edges[j]; sankoff4(REAL(VECTOR_ELT(dlist,ei)), nrx, cost, ncx, res); } SET_VECTOR_ELT(dlist2, n0, result); UNPROTECT(2); return(dlist2); } phangorn/src/ml.c0000644000176200001440000010655513475602650013455 0ustar liggesusers/* * ml.c * * (c) 2008-2019 Klaus Schliep (klaus.schliep@gmail.com) * * * This code may be distributed under the GNU GPL * */ # define USE_RINTERNALS #include //#include #include #include #include #define LINDEX(i, k) (i - ntips - 1L) * (nr * nc) + k * ntips * (nr * nc) // index for LL #define LINDEX2(i, k) (i - *ntips - 1L) * (*nr* *nc) + k * *ntips * (*nr * *nc) // index for scaling matrix SCM #define LINDEX3(i, j) (i - *ntips - 1L) * *nr + j * *ntips * *nr //nr statt *nr char *transa = "N", *transb = "N"; double one = 1.0, zero = 0.0; int ONE = 1L; const double ScaleEPS = 1.0/4294967296.0; const double ScaleMAX = 4294967296.0; const double LOG_SCALE_EPS = -22.18070977791824915926; // 2^64 = 18446744073709551616 static double *LL; //, *WEIGHTS; static int *SCM; //, *XXX; void ll_free(){ free(LL); free(SCM); } /* LL likelihood for internal edges SCM scaling coefficients nNodes, nTips, kmax */ void ll_init(int *nr, int *nTips, int *nc, int *k) { int i; LL = (double *) calloc(*nr * *nc * *k * *nTips, sizeof(double)); SCM = (int *) calloc(*nr * *k * *nTips, sizeof(int)); // * 2L for(i =0; i < (*nr * *k * *nTips); i++) SCM[i] = 0L; } // in C++ ?? void matm(int *x, double *contrast, int *nr, int *nc, int *nco, double *result){ int i, j; for(i = 0; i < (*nr); i++){ for(j = 0; j < (*nc); j++) result[i + j*(*nr)] *= contrast[x[i] - 1L + j*(*nco)]; } } SEXP invSites(SEXP dlist, SEXP nr, SEXP nc, SEXP contrast, SEXP nco){ R_len_t n = length(dlist); int nrx=INTEGER(nr)[0], ncx=INTEGER(nc)[0], i, j; SEXP result; PROTECT(result = allocMatrix(REALSXP, nrx, ncx)); double *res; res = REAL(result); for(j=0; j < (nrx * ncx); j++) res[j] = 1.0; for(i=0; i < n; i++) matm(INTEGER(VECTOR_ELT(dlist, i)), REAL(contrast), INTEGER(nr), INTEGER(nc), INTEGER(nco), res); UNPROTECT(1); // result return(result); } void scaleMatrix(double *X, int *nr, int *nc, int *result){ int i, j; double tmp; for(i = 0; i < *nr; i++) { tmp = 0.0; for(j = 0; j < *nc; j++) tmp += X[i + j* *nr]; while(tmp < ScaleEPS){ for(j = 0; j < *nc; j++) X[i + j* *nr] *=ScaleMAX; result[i] +=1L; tmp *= ScaleMAX; } } } // contrast to full dense matrix // zwei Versionen *= und new void matp(int *x, double *contrast, double *P, int *nr, int *nc, int *nrs, double *result){ int i, j; double *tmp; tmp = (double *) R_alloc((*nc) *(*nrs), sizeof(double)); F77_CALL(dgemm)(transa, transb, nrs, nc, nc, &one, contrast, nrs, P, nc, &zero, tmp, nrs); for(i = 0; i < (*nr); i++){ for(j = 0; j < (*nc); j++) result[i + j*(*nr)] = tmp[x[i] - 1L + j*(*nrs)]; } } void rowMinScale(int *dat, int n, int k, int *res){ int i, h; int tmp; for(i = 0; i < n; i++){ tmp = dat[i]; for(h = 1; h< k; h++) {if(dat[i + h*n] < tmp) tmp=dat[i + h*n];} if(tmp>0L){for(h = 0; h< k; h++) dat[i + h*n] -= tmp;} res[i] = tmp; } } // Ziel etwas schneller void getP(double *eva, double *ev, double *evi, int m, double el, double w, double *result){ int i, j, h; double res; //tmp[m], double *tmp; // tmp = (double *) malloc(m * sizeof(double)); tmp = (double *) R_alloc(m, sizeof(double)); // el = 0 return identity for(i = 0; i < m; i++) tmp[i] = exp(eva[i] * w * el); // eva *= tmp??? for(i = 0; i < m; i++){ for(j = 0; j < m; j++){ res = 0.0; for(h = 0; h < m; h++) res += ev[i + h*m] * tmp[h] * evi[h + j*m]; result[i+j*m] = res; } } // free(tmp); // ausserhalb } // 64 * 3 + 4 16 + 64 * 2 SEXP getPM(SEXP eig, SEXP nc, SEXP el, SEXP w){ R_len_t i, j, nel, nw, k; int m=INTEGER(nc)[0], l=0; double *ws=REAL(w); double *edgelen=REAL(el); double *eva, *eve, *evei; SEXP P, RESULT; nel = length(el); nw = length(w); if(!isNewList(eig)) error("'eig' must be a list"); eva = REAL(VECTOR_ELT(eig, 0)); eve = REAL(VECTOR_ELT(eig, 1)); evei = REAL(VECTOR_ELT(eig, 2)); PROTECT(RESULT = allocVector(VECSXP, nel*nw)); for(j=0; j0)scaleMatrix(&ans[ni * rc], nr, nc, scaleTmp); // (ni-nTips) ni = node[i]; if(ei < nTips) matp(INTEGER(VECTOR_ELT(dlist, ei)), contrast, P, nr, nc, &nco, &ans[ni * rc]); else F77_CALL(dgemm)(transa, transb, nr, nc, nc, &one, &ans[(ei-nTips) * rc], nr, P, nc, &zero, &ans[ni * rc], nr); } else { if(ei < nTips) matp(INTEGER(VECTOR_ELT(dlist, ei)), contrast, P, nr, nc, &nco, rtmp); else F77_CALL(dgemm)(transa, transb, nr, nc, nc, &one, &ans[(ei-nTips) * rc], nr, P, nc, &zero, rtmp, nr); for(j=0; j < rc; j++) ans[ni * rc + j] *= rtmp[j]; } } scaleMatrix(&ans[ni * rc], nr, nc, scaleTmp); F77_CALL(dgemv)(transa, nr, nc, &one, &ans[ni * rc], nr, bf, &ONE, &zero, TMP, &ONE); } // this seems to work perfectly void lll3(SEXP dlist, double *eva, double *eve, double *evei, double *el, double g, int *nr, int *nc, int *node, int *edge, int nTips, double *contrast, int nco, int n, int *scaleTmp, double *bf, double *TMP, double *ans, int *SC){ int ni, ei, j, i, rc; // R_len_t i, n = length(node); double *rtmp, *P; ni = -1L; rc = *nr * *nc; rtmp = (double *) R_alloc(*nr * *nc, sizeof(double)); P = (double *) R_alloc(*nc * *nc, sizeof(double)); for(j=0; j < *nr; j++) scaleTmp[j] = 0L; for(i = 0; i < n; i++) { // entweder P matrix erstellen, openMP ?? // temp Vectoren vermeiden getP(eva, eve, evei, *nc, el[i], g, P); ei = edge[i]; if(ni != node[i]){ // test for node[i+1] // temp Vectoren vermeiden if(ni>0)scaleMatrix(&ans[ni * rc], nr, nc, &SC[ni * *nr]); // (ni-nTips) ni = node[i]; for(j=0; j < *nr; j++) SC[j + ni * *nr] = 0L; if(ei < nTips) matp(INTEGER(VECTOR_ELT(dlist, ei)), contrast, P, nr, nc, &nco, &ans[ni * rc]); else{ F77_CALL(dgemm)(transa, transb, nr, nc, nc, &one, &ans[(ei-nTips) * rc], nr, P, nc, &zero, &ans[ni * rc], nr); for(j=0; j < *nr; j++) SC[ni * *nr + j] = SC[(ei-nTips) * *nr + j]; } } else { if(ei < nTips) matp(INTEGER(VECTOR_ELT(dlist, ei)), contrast, P, nr, nc, &nco, rtmp); else{ F77_CALL(dgemm)(transa, transb, nr, nc, nc, &one, &ans[(ei-nTips) * rc], nr, P, nc, &zero, rtmp, nr); for(j=0; j < *nr; j++) SC[ni * *nr + j] += SC[(ei-nTips) * *nr + j]; } for(j=0; j < rc; j++) ans[ni * rc + j] *= rtmp[j]; } } scaleMatrix(&ans[ni * rc], nr, nc, &SC[ni * *nr]); for(j=0; j < *nr; j++) scaleTmp[j] = SC[ni * *nr + j]; F77_CALL(dgemv)(transa, nr, nc, &one, &ans[ni * rc], nr, bf, &ONE, &zero, TMP, &ONE); } // in pml.move inside optimRooted mit SCM // , SEXP W SEXP PML3(SEXP dlist, SEXP EL, SEXP G, SEXP NR, SEXP NC, SEXP K, SEXP eig, SEXP bf, SEXP node, SEXP edge, SEXP NTips, SEXP nco, SEXP contrast, SEXP N){ int nr=INTEGER(NR)[0], nc=INTEGER(NC)[0], k=INTEGER(K)[0], i, indLL; int nTips = INTEGER(NTips)[0], *SC; double *g=REAL(G), *tmp, logScaleEPS; SEXP TMP; double *eva, *eve, *evei; eva = REAL(VECTOR_ELT(eig, 0)); eve = REAL(VECTOR_ELT(eig, 1)); evei = REAL(VECTOR_ELT(eig, 2)); SC = (int *) R_alloc(nr * k, sizeof(int)); PROTECT(TMP = allocMatrix(REALSXP, nr, k)); // changed tmp=REAL(TMP); for(i=0; i<(k*nr); i++)tmp[i]=0.0; indLL = nr * nc * nTips; for(i=0; intips){ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, el, g[i], P); goDown(&LL[LINDEX(ch, i)], &LL[LINDEX(pa, i)], P, nr, nc, tmp); } } else{ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, el, g[i], P); goUp(&LL[LINDEX(pa, i)], INTEGER(VECTOR_ELT(dlist, ch-1L)), contrast, P, nr, nc, nco, tmp); } } } // double *w, void updateLL2(SEXP dlist, int pa, int ch, double *eva, double *eve, double*evei, double el, double *g, int nr, int nc, int ntips, double *contrast, int nco, int k, double *tmp, double *P){ int i; if(ch>ntips){ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, el, g[i], P); goDown(&LL[LINDEX(pa, i)], &LL[LINDEX(ch, i)], P, nr, nc, tmp); } } else{ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, el, g[i], P); goUp(&LL[LINDEX(pa, i)], INTEGER(VECTOR_ELT(dlist, ch-1L)), contrast, P, nr, nc, nco, tmp); } } } void ExtractScale(int ch, int k, int *nr, int *ntips, double *res){ int i; int j, blub, tmp; for(i = 0; i < k; i++){ blub = LINDEX3(ch, i); for(j=0; j< *nr; j++) res[j +i * *nr] = SCM[blub+j]; } for(i = 0; i< *nr; i++){ tmp = res[i]; for(j = 1; j 1e-05) && (k < 5) ) { if(scalep>0.6){ NR55(eva, ncx-1L, edle, ws, gs, X, INTEGER(ld)[0], nrx, f, tmp); ll=0.0; lll=0.0; for(i=0; i 10.0) newedle = 10.0; if (newedle < 1e-8) newedle = edle/2; if (newedle < 1e-8) newedle = 1e-8; // 1e-8 phyML for(i=0; i0L)SET_VECTOR_ELT(RESULT, 1, getM3(child, dad, P, nr, nc)); if(INTEGER(retB)[0]>0L)SET_VECTOR_ELT(RESULT, 2, getM3(dad, child, P, nr, nc)); // add variance ?? SET_VECTOR_ELT(RESULT, 3, ScalarReal(l1)); UNPROTECT(3); return (RESULT); } //, SEXP basefreq SEXP FS5(SEXP eig, SEXP nc, SEXP el, SEXP w, SEXP g, SEXP X, SEXP ld, SEXP nr, SEXP weight, SEXP f0) { SEXP RESULT; // EL, P; double *tmp, *f, *wgt=REAL(weight), edle, ledle, newedle, eps=10, *eva=REAL(VECTOR_ELT(eig,0)); double ll, lll, delta=0.0, scalep = 1.0, *ws=REAL(w), *gs=REAL(g), l1=0.0, l0=0.0; double y; int i, k=0, ncx=INTEGER(nc)[0], nrx=INTEGER(nr)[0]; tmp = (double *) R_alloc(nrx, sizeof(double)); f = (double *) R_alloc(nrx, sizeof(double)); PROTECT(RESULT = allocVector(REALSXP, 3)); edle = REAL(el)[0]; for(i=0; i 1e-05) && (k < 10) ) { if(scalep>0.6){ NR55(eva, ncx-1L, edle, ws, gs, X, INTEGER(ld)[0], nrx, f, tmp); ll=0.0; lll=0.0; for(i=0; i 10.0) newedle = 10.0; // if (newedle < 1e-8) newedle = edle/2; if (newedle < 1e-8) newedle = 1e-8; // 1e-8 phyML for(i=0; i 1e-05) && (k < 10) ) { if(scalep>0.6){ NR77(eva, nc-1L, edle, w, g, X, ld, nr, f, tmp); ll=0.0; lll=0.0; for(i=0; i 10.0) newedle = 10.0; if (newedle < 1e-8) newedle = 1e-8; // 1e-8 phyML for(i=0; intips){ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, oldel, g[i], P); helpDADI(&LL[LINDEX(pa, i)], &LL[LINDEX(ch, i)], P, nr, nc, tmp); helpPrep(&LL[LINDEX(pa, i)], &LL[LINDEX(ch, i)], eve, evi, nr, nc, tmp, &X[i*nr*nc]); for(h = 0; h < nc; h++){ for(j = 0; j < nr; j++){ X[j+h*nr + i*nr*nc] *= blub[j+i*nr]; } } } } else{ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, oldel, g[i], P); helpDAD5(&LL[LINDEX(pa, i)], INTEGER(VECTOR_ELT(dlist, ch-1L)), contrast, P, nr, nc, nco, tmp); helpPrep2(&LL[LINDEX(pa, i)], INTEGER(VECTOR_ELT(dlist, ch-1L)), contrast2, evi, nr, nc, nco, &X[i*nr*nc]); //; for(h = 0; h < nc; h++){ for(j = 0; j < nr; j++){ X[j+h*nr + i*nr*nc] *= blub[j+i*nr]; } } } } fs3(eva, nc, oldel, w, g, X, k, nr, weight, f0, res); updateLL2(dlist, pa, ch, eva, eve, evei, res[0], g, nr, nc, ntips, contrast, nco, k, tmp, P); el[ch-1L] = res[0]; if (ch > ntips) loli = ch; else loli = pa; } UNPROTECT(1); //RESULT return(RESULT); } SEXP optQrtt(SEXP PARENT, SEXP CHILD, SEXP eig, SEXP EVI, SEXP EL, SEXP W, SEXP G, SEXP NR, SEXP NC, SEXP NTIPS, SEXP CONTRAST, SEXP CONTRAST2, SEXP NCO, SEXP dlist, SEXP WEIGHT, SEXP F0){ int i, k=length(W), h, j, m, lEL=length(EL); int nc=INTEGER(NC)[0], nr=INTEGER(NR)[0], ntips=INTEGER(NTIPS)[0]; int *parent=INTEGER(PARENT), *child=INTEGER(CHILD), pa, ch; int nco =INTEGER(NCO)[0]; // loli, double *weight=REAL(WEIGHT), *f0=REAL(F0), *w=REAL(W); double *g=REAL(G), *evi=REAL(EVI), *contrast=REAL(CONTRAST), *contrast2=REAL(CONTRAST2); double *el, *X; double *eva, *eve, *evei, *tmp, *P; double *blub = (double *) R_alloc(nr * k, sizeof(double)); double oldel; double *res = (double *) R_alloc(3L, sizeof(double)); tmp = (double *) R_alloc(nr * nc, sizeof(double)); P = (double *) R_alloc(nc * nc, sizeof(double)); X = (double *) R_alloc(k * nr * nc, sizeof(double)); ExtractScale(parent[0], k, &nr, &ntips, blub); SEXP RESULT; PROTECT(RESULT = allocVector(REALSXP, lEL)); el=REAL(RESULT); for(i = 0; i < lEL; i++) el[i] = REAL(EL)[i]; eva = REAL(VECTOR_ELT(eig, 0)); eve = REAL(VECTOR_ELT(eig, 1)); evei = REAL(VECTOR_ELT(eig, 2)); for(m = 4L; m > -1L; m--){ pa = parent[m]; ch = child[m]; oldel=el[m]; // moveDad if(ch>ntips){ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, oldel, g[i], P); helpDADI(&LL[LINDEX(pa, i)], &LL[LINDEX(ch, i)], P, nr, nc, tmp); helpPrep(&LL[LINDEX(pa, i)], &LL[LINDEX(ch, i)], eve, evi, nr, nc, tmp, &X[i*nr*nc]); for(h = 0; h < nc; h++){ for(j = 0; j < nr; j++){ X[j+h*nr + i*nr*nc] *= blub[j+i*nr]; } } } } else{ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, oldel, g[i], P); helpDAD5(&LL[LINDEX(pa, i)], INTEGER(VECTOR_ELT(dlist, ch-1L)), contrast, P, nr, nc, nco, tmp); helpPrep2(&LL[LINDEX(pa, i)], INTEGER(VECTOR_ELT(dlist, ch-1L)), contrast2, evi, nr, nc, nco, &X[i*nr*nc]); //; for(h = 0; h < nc; h++){ for(j = 0; j < nr; j++){ X[j+h*nr + i*nr*nc] *= blub[j+i*nr]; } } } } fs3(eva, nc, oldel, w, g, X, k, nr, weight, f0, res); // go up // if i=2 go down if(m==2)updateLLQ(dlist, ch, pa, eva, eve, evei, res[0], g, nr, nc, ntips, contrast, nco, k, tmp, P); else updateLLQ(dlist, pa, ch, eva, eve, evei, res[0], g, nr, nc, ntips, contrast, nco, k, tmp, P); el[m] = res[0]; } UNPROTECT(1); //RESULT return(RESULT); } SEXP PML4(SEXP dlist, SEXP EL, SEXP W, SEXP G, SEXP NR, SEXP NC, SEXP K, SEXP eig, SEXP bf, SEXP node, SEXP edge, SEXP NTips, SEXP nco, SEXP contrast, SEXP N){ int nr=INTEGER(NR)[0], nc=INTEGER(NC)[0], k=INTEGER(K)[0], i, j, indLL; int nTips = INTEGER(NTips)[0], *SC, *sc; double *g=REAL(G), *w=REAL(W), *tmp, *res; SEXP TMP; double *eva, *eve, *evei; eva = REAL(VECTOR_ELT(eig, 0)); eve = REAL(VECTOR_ELT(eig, 1)); evei = REAL(VECTOR_ELT(eig, 2)); SC = (int *) R_alloc(nr * k, sizeof(int)); sc = (int *) R_alloc(nr, sizeof(int)); tmp = (double *) R_alloc(nr * k, sizeof(double)); PROTECT(TMP = allocVector(REALSXP, nr)); res=REAL(TMP); for(i=0; i<(k*nr); i++)tmp[i]=0.0; indLL = nr * nc * nTips; for(i=0; i #include #include // for NULL #include /* The following symbols/expressions for .NAME have been omitted phangorn_allDescCPP phangorn_bipartCPP phangorn_bipCPP phangorn_allChildrenCPP Most likely possible values need to be added below. */ /* FIXME: Check these declarations against the C/Fortran source code. */ /* .C calls */ extern void ACCTRAN2(void *, void *, void *, void *, void *, void *); extern void ACCTRAN3(void *, void *, void *, void *, void *, void *, void *, void *); extern void C_fhm(void *, void *); //extern void C_reorder(void *, void *, void *, void *, void *, void *); extern void countCycle(void *, void *, void *, void *); extern void countCycle2(void *, void *, void *, void *); extern void distHamming(void *, void *, void *, void *, void *); extern void fitch_free(); extern void fitch_init(void *, void *, void *, void *, void *); extern void fitchQuartet(void *, void *, void *, void *, void *, void *, void *); extern void fitchTriplet(void *, void *, void *, void *, void *); extern void fitchTripletACC4(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void giveIndex(void *, void *, void *, void *, void *, void *); extern void ll_free(); extern void ll_init(void *, void *, void *, void *); extern void out(void *, void *, void *, void *, void *); /* .Call calls */ extern SEXP AddOnes(SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP C_rowMin(SEXP, SEXP, SEXP); extern SEXP C_sprdist(SEXP, SEXP, SEXP); extern SEXP dist2spectra(SEXP, SEXP, SEXP); extern SEXP FITCH(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP FITCH345(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP FITCHTRIP3(SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP FNALL_NNI(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP FNALL5(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP FNALL6(SEXP, SEXP, SEXP, SEXP); extern SEXP FS4(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP FS5(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP getd2PM(SEXP, SEXP, SEXP, SEXP); extern SEXP getd2PM2(SEXP, SEXP, SEXP, SEXP); extern SEXP getDAD(SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP getDAD2(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP getdPM(SEXP, SEXP, SEXP, SEXP); extern SEXP getdPM2(SEXP, SEXP, SEXP, SEXP); extern SEXP getPM(SEXP, SEXP, SEXP, SEXP); extern SEXP getPrep(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP getPrep2(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP invSites(SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP LogLik2(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP optE(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP optQrtt(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP _phangorn_bipartCPP(SEXP, SEXP); extern SEXP _phangorn_bipCPP(SEXP, SEXP); extern SEXP PML0(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP PML3(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP PML4(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP pNodes(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP PWI(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); // extern SEXP rawStream2phyDat(SEXP); extern SEXP rowMax(SEXP, SEXP, SEXP); extern SEXP sankoff3(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP sankoff3B(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP sankoffMPR(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP sankoffQuartet(SEXP, SEXP, SEXP, SEXP); extern SEXP _phangorn_allDescCPP(SEXP, SEXP); extern SEXP _phangorn_allChildrenCPP(SEXP); //extern SEXP _phangorn_allSiblingsCPP(SEXP); //extern SEXP _phangorn_preorder(SEXP); extern SEXP _phangorn_p2dna(SEXP, SEXP); extern SEXP _phangorn_threshStateC(SEXP, SEXP); extern SEXP _phangorn_node_height_cpp(SEXP, SEXP, SEXP); extern SEXP _phangorn_cophenetic_cpp(SEXP, SEXP, SEXP, SEXP); static const R_CMethodDef CEntries[] = { {"ACCTRAN2", (DL_FUNC) &ACCTRAN2, 6}, {"ACCTRAN3", (DL_FUNC) &ACCTRAN3, 8}, {"C_fhm", (DL_FUNC) &C_fhm, 2}, {"countCycle", (DL_FUNC) &countCycle, 4}, {"countCycle2", (DL_FUNC) &countCycle2, 4}, {"distHamming", (DL_FUNC) &distHamming, 5}, {"fitch_free", (DL_FUNC) &fitch_free, 0}, {"fitch_init", (DL_FUNC) &fitch_init, 5}, {"fitchQuartet", (DL_FUNC) &fitchQuartet, 7}, {"fitchTriplet", (DL_FUNC) &fitchTriplet, 5}, {"fitchTripletACC4", (DL_FUNC) &fitchTripletACC4, 11}, {"giveIndex", (DL_FUNC) &giveIndex, 6}, {"ll_free", (DL_FUNC) &ll_free, 0}, {"ll_init", (DL_FUNC) &ll_init, 4}, {"out", (DL_FUNC) &out, 5}, {NULL, NULL, 0} }; static const R_CallMethodDef CallEntries[] = { {"AddOnes", (DL_FUNC) &AddOnes, 5}, {"C_rowMin", (DL_FUNC) &C_rowMin, 3}, {"C_sprdist", (DL_FUNC) &C_sprdist, 3}, {"dist2spectra", (DL_FUNC) &dist2spectra, 3}, {"FITCH", (DL_FUNC) &FITCH, 8}, {"FITCH345", (DL_FUNC) &FITCH345, 6}, {"FITCHTRIP3", (DL_FUNC) &FITCHTRIP3, 5}, {"FNALL_NNI", (DL_FUNC) &FNALL_NNI, 7}, {"FNALL5", (DL_FUNC) &FNALL5, 7}, {"FNALL6", (DL_FUNC) &FNALL6, 4}, {"FS4", (DL_FUNC) &FS4, 14}, {"FS5", (DL_FUNC) &FS5, 10}, {"getd2PM", (DL_FUNC) &getd2PM, 4}, {"getd2PM2", (DL_FUNC) &getd2PM2, 4}, {"getDAD", (DL_FUNC) &getDAD, 5}, {"getDAD2", (DL_FUNC) &getDAD2, 7}, {"getdPM", (DL_FUNC) &getdPM, 4}, {"getdPM2", (DL_FUNC) &getdPM2, 4}, {"getPM", (DL_FUNC) &getPM, 4}, {"getPrep", (DL_FUNC) &getPrep, 6}, {"getPrep2", (DL_FUNC) &getPrep2, 7}, {"invSites", (DL_FUNC) &invSites, 5}, {"LogLik2", (DL_FUNC) &LogLik2, 10}, {"optE", (DL_FUNC) &optE, 17}, {"optQrtt", (DL_FUNC) &optQrtt, 16}, {"_phangorn_bipartCPP", (DL_FUNC) &_phangorn_bipartCPP, 2}, {"_phangorn_bipCPP", (DL_FUNC) &_phangorn_bipCPP, 2}, {"PML0", (DL_FUNC) &PML0, 14}, {"PML3", (DL_FUNC) &PML3, 14}, {"PML4", (DL_FUNC) &PML4, 15}, {"pNodes", (DL_FUNC) &pNodes, 6}, {"PWI", (DL_FUNC) &PWI, 6}, // {"rawStream2phyDat", (DL_FUNC) &rawStream2phyDat, 1}, {"rowMax", (DL_FUNC) &rowMax, 3}, {"sankoff3", (DL_FUNC) &sankoff3, 8}, {"sankoff3B", (DL_FUNC) &sankoff3B, 10}, {"sankoffMPR", (DL_FUNC) &sankoffMPR, 7}, {"sankoffQuartet", (DL_FUNC) &sankoffQuartet, 4}, {"_phangorn_allDescCPP", (DL_FUNC) &_phangorn_allDescCPP, 2}, {"_phangorn_allChildrenCPP", (DL_FUNC) &_phangorn_allChildrenCPP, 1}, // {"_phangorn_allSiblingsCPP", (DL_FUNC) &_phangorn_allSiblingsCPP, 1}, // {"_phangorn_preorder", (DL_FUNC) &_phangorn_preorder, 1}, {"_phangorn_p2dna", (DL_FUNC) &_phangorn_p2dna, 2}, {"_phangorn_threshStateC", (DL_FUNC) &_phangorn_threshStateC, 2}, {"_phangorn_node_height_cpp", (DL_FUNC) &_phangorn_node_height_cpp, 3}, {"_phangorn_cophenetic_cpp", (DL_FUNC) &_phangorn_cophenetic_cpp, 4}, {NULL, NULL, 0} }; void R_init_phangorn(DllInfo *dll) { R_registerRoutines(dll, CEntries, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } phangorn/src/RcppExports.cpp0000644000176200001440000001017513475602650015666 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include using namespace Rcpp; // allDescCPP List allDescCPP(IntegerMatrix orig, int nTips); RcppExport SEXP _phangorn_allDescCPP(SEXP origSEXP, SEXP nTipsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerMatrix >::type orig(origSEXP); Rcpp::traits::input_parameter< int >::type nTips(nTipsSEXP); rcpp_result_gen = Rcpp::wrap(allDescCPP(orig, nTips)); return rcpp_result_gen; END_RCPP } // bipartCPP List bipartCPP(IntegerMatrix orig, int nTips); RcppExport SEXP _phangorn_bipartCPP(SEXP origSEXP, SEXP nTipsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerMatrix >::type orig(origSEXP); Rcpp::traits::input_parameter< int >::type nTips(nTipsSEXP); rcpp_result_gen = Rcpp::wrap(bipartCPP(orig, nTips)); return rcpp_result_gen; END_RCPP } // bipCPP std::vector< std::vector > bipCPP(IntegerMatrix orig, int nTips); RcppExport SEXP _phangorn_bipCPP(SEXP origSEXP, SEXP nTipsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerMatrix >::type orig(origSEXP); Rcpp::traits::input_parameter< int >::type nTips(nTipsSEXP); rcpp_result_gen = Rcpp::wrap(bipCPP(orig, nTips)); return rcpp_result_gen; END_RCPP } // allChildrenCPP List allChildrenCPP(const IntegerMatrix orig); RcppExport SEXP _phangorn_allChildrenCPP(SEXP origSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< const IntegerMatrix >::type orig(origSEXP); rcpp_result_gen = Rcpp::wrap(allChildrenCPP(orig)); return rcpp_result_gen; END_RCPP } // p2dna IntegerVector p2dna(NumericMatrix xx, double eps); RcppExport SEXP _phangorn_p2dna(SEXP xxSEXP, SEXP epsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericMatrix >::type xx(xxSEXP); Rcpp::traits::input_parameter< double >::type eps(epsSEXP); rcpp_result_gen = Rcpp::wrap(p2dna(xx, eps)); return rcpp_result_gen; END_RCPP } // node_height_cpp NumericVector node_height_cpp(IntegerVector edge1, IntegerVector edge2, NumericVector edge_length); RcppExport SEXP _phangorn_node_height_cpp(SEXP edge1SEXP, SEXP edge2SEXP, SEXP edge_lengthSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerVector >::type edge1(edge1SEXP); Rcpp::traits::input_parameter< IntegerVector >::type edge2(edge2SEXP); Rcpp::traits::input_parameter< NumericVector >::type edge_length(edge_lengthSEXP); rcpp_result_gen = Rcpp::wrap(node_height_cpp(edge1, edge2, edge_length)); return rcpp_result_gen; END_RCPP } // cophenetic_cpp NumericVector cophenetic_cpp(IntegerMatrix edge, NumericVector edge_length, int nTips, int nNode); RcppExport SEXP _phangorn_cophenetic_cpp(SEXP edgeSEXP, SEXP edge_lengthSEXP, SEXP nTipsSEXP, SEXP nNodeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerMatrix >::type edge(edgeSEXP); Rcpp::traits::input_parameter< NumericVector >::type edge_length(edge_lengthSEXP); Rcpp::traits::input_parameter< int >::type nTips(nTipsSEXP); Rcpp::traits::input_parameter< int >::type nNode(nNodeSEXP); rcpp_result_gen = Rcpp::wrap(cophenetic_cpp(edge, edge_length, nTips, nNode)); return rcpp_result_gen; END_RCPP } // threshStateC IntegerVector threshStateC(NumericVector x, NumericVector thresholds); RcppExport SEXP _phangorn_threshStateC(SEXP xSEXP, SEXP thresholdsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector >::type x(xSEXP); Rcpp::traits::input_parameter< NumericVector >::type thresholds(thresholdsSEXP); rcpp_result_gen = Rcpp::wrap(threshStateC(x, thresholds)); return rcpp_result_gen; END_RCPP } phangorn/src/phangorn.c0000644000176200001440000002004213475602650014643 0ustar liggesusers/* * phangorn.c * * (c) 2008-2019 Klaus Schliep (klaus.schliep@gmail.com) * * * This code may be distributed under the GNU GPL * */ # define USE_RINTERNALS #include #include #include void countCycle(int *M, int *l, int *m, int *res){ int j, i, tmp; res[0]=0L; for (i=0; i<*l; i++) { tmp = 0; if(M[i] != M[i + (*m -1) * *l])tmp++; for (j=1; j<*m; j++) { if(M[i + (j-1)* *l] != M[i + j * *l])tmp++; } if(tmp>2L)res[0]+=tmp; } } void countCycle2(int *M, int *l, int *m, int *res){ int j, i, tmp; for (i=0; i<*l; i++) { tmp = 0L; if(M[i] != M[i + (*m -1) * *l])tmp=1L; for (j=1; j<*m; j++) { if(M[i + (j-1L)* *l] != M[i + j * *l])tmp++; } res[i]=tmp; } } // C++ SEXP rowMax(SEXP sdat, SEXP sn, SEXP sk){ int i, h, n=INTEGER(sn)[0], k=INTEGER(sk)[0]; double x, *res, *dat; SEXP result; PROTECT(result = allocVector(REALSXP, n)); res = REAL(result); PROTECT(sdat = coerceVector(sdat, REALSXP)); dat = REAL(sdat); for(i = 0; i < n; i++){ x = dat[i]; for(h = 1; h< k; h++) {if(dat[i + h*n] > x) x=dat[i + h*n];} res[i] = x; } UNPROTECT(2); return(result); } void getdP(double *eva, double *ev, double *evi, int m, double el, double w, double *result){ int i, j, h; double res; //tmp[m], double *tmp; tmp = (double *) malloc(m * sizeof(double)); for(i = 0; i < m; i++) tmp[i] = (eva[i] * w * el) * exp(eva[i] * w * el); for(i = 0; i < m; i++){ for(j = 0; j < m; j++){ res = 0.0; for(h = 0; h < m; h++) res += ev[i + h*m] * tmp[h] * evi[h + j*m]; result[i+j*m] = res; } } free(tmp); } void getdP2(double *eva, double *ev, double *evi, int m, double el, double w, double *result){ int i, j, h; double res; //tmp[m], double *tmp; tmp = (double *) malloc(m * sizeof(double)); for(i = 0; i < m; i++) tmp[i] = (eva[i] * w) * exp(eva[i] * w * el); for(i = 0; i < m; i++){ for(j = 0; j < m; j++){ res = 0.0; for(h = 0; h < m; h++) res += ev[i + h*m] * tmp[h] * evi[h + j*m]; result[i+j*m] = res; } } free(tmp); } void getd2P(double *eva, double *ev, double *evi, int m, double el, double w, double *result){ int i, j, h; double res; //tmp[m], double *tmp; tmp = (double *) malloc(m * sizeof(double)); for(i = 0; i < m; i++) tmp[i] = (eva[i] * w * el) * (eva[i] * w * el) * exp(eva[i] * w * el); for(i = 0; i < m; i++){ for(j = 0; j < m; j++){ res = 0.0; for(h = 0; h < m; h++) res += ev[i + h*m] * tmp[h] * evi[h + j*m]; result[i+j*m] = res; } } free(tmp); } void getd2P2(double *eva, double *ev, double *evi, int m, double el, double w, double *result){ int i, j, h; double res; //tmp[m], double *tmp; tmp = (double *) malloc(m * sizeof(double)); for(i = 0; i < m; i++) tmp[i] = (eva[i] * w) * (eva[i] * w) * exp(eva[i] * w * el); for(i = 0; i < m; i++){ for(j = 0; j < m; j++){ res = 0.0; for(h = 0; h < m; h++) res += ev[i + h*m] * tmp[h] * evi[h + j*m]; result[i+j*m] = res; } } free(tmp); } SEXP getdPM(SEXP eig, SEXP nc, SEXP el, SEXP w){ R_len_t i, j, nel, nw; int m=INTEGER(nc)[0], l=0; double *ws=REAL(w); double *edgelen=REAL(el); double *eva, *eve, *evei; SEXP P, RESULT; nel = length(el); nw = length(w); eva = REAL(VECTOR_ELT(eig, 0)); eve = REAL(VECTOR_ELT(eig, 1)); evei = REAL(VECTOR_ELT(eig, 2)); PROTECT(RESULT = allocVector(VECSXP, nel*nw)); double *p; if(!isNewList(eig)) error("'dlist' must be a list"); for(j=0; j0) & (tmp<(*nbin+1L)) ) ans[tmp-1L] ++; } } void C_reorder(int *from, int *to, int *n, int *sumNode, int *neworder, int *root){ int i, j, sum=0, k, Nnode, ind, *ord, *csum, *tips, *stack, z=0; // l, double *parent; int m=sumNode[0]; parent = (double *) R_alloc((*n), sizeof(double)); tips = (int *) R_alloc(m, sizeof(int)); ord = (int *) R_alloc((*n), sizeof(int)); csum = (int *) R_alloc( (m+1), sizeof(int)); stack = (int *) R_alloc(m, sizeof(int)); for(j=0;j<(*n);j++) parent[j] = (double)from[j]; for(j=0;j<(*n);j++) ord[j] = j; for(j=0;j -1){ j=stack[z]; if(tips[j]>0){ for(i=csum[j];i // #include #include #include //#include // off-diagonal #define DINDEX(i, j) n*(i - 1) - i * (i - 1)/2 + j - i - 1 // with diagonal (+i), R index (+1) #define DINDEX2(i, j) n*(i - 1) - i * (i - 1)/2 + j - 1 // #define threshold parameters int give_index(int i, int j, int n) { if (i > j) return(DINDEX(j, i)); else return(DINDEX(i, j)); } int give_index2(int i, int j, int n) { if (i > j) return(DINDEX2(j, i)); else return(DINDEX2(i, j)); } void giveIndex(int *left, int* right, int *ll, int *lr, int *n, int *res){ int i, j, k; k=0; for (i = 0; i < *ll; i++){ for (j = 0; j < *lr; j++){ res[k] = give_index(left[i], right[j], *n); k++; } } } void giveIndex2(int *left, int* right, int *ll, int *lr, int *n, int *res){ int i, j, k; k=0; for (i = 0; i < *ll; i++){ for (j = 0; j < *lr; j++){ res[k] = give_index2(left[i], right[j], *n); k++; } } } void PD(int *x, int *y, int *n, int *weight){ int i, k; //n =length(x) for(i=0; i< *n; i++){ k=give_index(x[i], y[i], *n); weight[k]++; } } void pwIndex(int *left, int* right, int *l, int *n, double *w, double *res){ int i, k; k=0; for (i = 0; i < *l; i++){ k = give_index2(left[i], right[i], *n); res[k] += w[i]; } } SEXP PWI(SEXP LEFT, SEXP RIGHT, SEXP L, SEXP N, SEXP W, SEXP LI){ int i, li=INTEGER(LI)[0]; SEXP res; PROTECT(res = allocVector(REALSXP, li)); for(i = 0; i < li; i++)REAL(res)[i] = 0.0; pwIndex(INTEGER(LEFT), INTEGER(RIGHT), INTEGER(L), INTEGER(N), REAL(W), REAL(res)); UNPROTECT(1); return(res); } void C_fhm(double *v, int *n){ unsigned int level, i, j; unsigned int start, step, num_splits; unsigned int max_n = (unsigned int)*n; double vi, vj; num_splits = (1 << (*n)); step = 1; for(level = 0; level < max_n; level++){ start = 0; while(start < (num_splits-1)){ for(i = start; i < (start + step); i++){ j = i + step; vi = v[i]; vj = v[j]; v[i] = vi + vj; v[j] = vi - vj; } start = start + 2*step; } step *= 2; } } void distance_hadamard(double *d, int n) { unsigned int num_splits; unsigned int x, r, nr, p, b, e; unsigned int odd = 1; // The inner while loop can only terminate with odd == 1 so we don't need to set it inside the for loop. double cost, best_cost; num_splits = (1 << (n - 1)); for (x = 1; x < num_splits; ++x) { r = (x - 1) & x; // r = x without LSB nr = (r - 1) & r; // nr = r without LSB if (nr) { // If x contains 1 or 2 bits only, then it has already been computed as a pairwise distance. b = x - r; // b = LSB of x: the "fixed" taxon in the pair. best_cost = 1e20; e = 0; // e holds bits to the right of the current p. while (1) { p = r - nr; // p = 2nd half of pair cost = d[nr + e] + d[p + b]; if (cost < best_cost) best_cost = cost; if (!nr && odd) break; // Ensure we get the (LSB with reference taxon) pair when there are an odd number of taxa r = nr; e += p; nr = (r - 1) & r; // nr = r without LSB odd ^= 1; } d[x] = best_cost; } } d[0] = 0.0; } // int num_splits raus void pairwise_distances(double *dm, int n, double *d) { int k=0; unsigned int offset; for (int i = 0; i < (n-1); ++i) { for (int j = (i+1); j < n; ++j) { // Calculate the offset within the array to put the next value offset = (1 << i); if (j < n - 1) { // If i == n - 1 then this is a distance between the reference taxon and some other taxon. offset += (1 << j); // Note that "+" is safe since (1 << i) and (1 << j) are always different bits. } d[offset]=dm[k]; k++; } } } SEXP dist2spectra(SEXP dm, SEXP nx, SEXP ns) { int n = INTEGER(nx)[0]; int nsp = INTEGER(ns)[0]; double *res; SEXP result; PROTECT(result = allocVector(REALSXP, nsp)); res = REAL(result); pairwise_distances(REAL(dm), n, res); //nsp, distance_hadamard(res, n); UNPROTECT(1); return(result); } // speed up some code for NJ void out(double *d, double *r, int *n, int *k, int *l){ int i, j; double res, tmp; k[0]=1; l[0]=2; res = d[1] - r[0] - r[1]; for(i = 0; i < (*n-1); i++){ for(j = i+1; j < (*n); j++){ tmp = d[i*(*n)+j] - r[i] - r[j]; if(tmp%") export(AICc) export(Ancestors) export(CI) export(Children) export(Descendants) export(KF.dist) export(NJ) export(RF.dist) export(RI) export(SH.test) export(SOWH.test) export(SPR.dist) export(Siblings) export(UNJ) export(acctran) export(acgt2ry) export(add.tips) export(addConfidences) export(addTrivialSplits) export(allCircularSplits) export(allCompat) export(allDescendants) export(allSitePattern) export(allSplits) export(allTrees) export(ancestral.pars) export(ancestral.pml) export(as.Matrix) export(as.MultipleAlignment) export(as.networx) export(as.phyDat) export(as.splits) export(bab) export(baseFreq) export(bootstrap.phyDat) export(bootstrap.pml) export(c.phyDat) export(cbind.phyDat) export(cladePar) export(coalSpeciesTree) export(codon2dna) export(codonTest) export(compatible) export(consensusNet) export(coords) export(createLabel) export(delta.score) export(densiTree) export(designSplits) export(designTree) export(dfactorial) export(discrete.gamma) export(dist.hamming) export(dist.logDet) export(dist.ml) export(dist.p) export(distanceHadamard) export(distinct.splits) export(diversity) export(dna2codon) export(edQt) export(fhm) export(fitch) export(genlight2phyDat) export(getClans) export(getClips) export(getDiversity) export(getRoot) export(getSlices) export(h2st) export(h4st) export(hadamard) export(ldfactorial) export(lento) export(lli) export(map_duplicates) export(mast) export(matchSplits) export(maxCladeCred) export(mcc) export(midpoint) export(modelTest) export(mrca.phylo) export(multiphyDat2pmlPart) export(neighborNet) export(nni) export(nnls.networx) export(nnls.phylo) export(nnls.splits) export(nnls.tree) export(optim.parsimony) export(optim.pml) export(pace) export(parsimony) export(path.dist) export(phyDat) export(phyDat2MultipleAlignment) export(phyDat2alignment) export(plotAnc) export(plotBS) export(plot_gamma_plus_inv) export(pml) export(pml.control) export(pml.fit) export(pml.free) export(pml.init) export(pmlCluster) export(pmlMix) export(pmlPart) export(pmlPart2multiPhylo) export(pmlPen) export(pratchet) export(presenceAbsence) export(pruneTree) export(rNNI) export(rSPR) export(random.addition) export(read.aa) export(read.nexus.dist) export(read.nexus.networx) export(read.nexus.splits) export(read.phyDat) export(readDist) export(removeTrivialSplits) export(removeUndeterminedSites) export(sankoff) export(simSeq) export(splitsNetwork) export(sprdist) export(superTree) export(threshStateC) export(treedist) export(upgma) export(wRF.dist) export(wpgma) export(write.nexus.dist) export(write.nexus.networx) export(write.nexus.splits) export(write.phyDat) export(write.splits) export(writeDist) import(Rcpp) import(ape) import(methods) import(parallel) importFrom(Matrix,Matrix) importFrom(Matrix,crossprod) importFrom(Matrix,solve) importFrom(Matrix,spMatrix) importFrom(Matrix,sparseMatrix) importFrom(fastmatch,fmatch) importFrom(grDevices,adjustcolor) importFrom(grDevices,col2rgb) importFrom(grDevices,rainbow) importFrom(grDevices,rgb) importFrom(graphics,abline) importFrom(graphics,axis) importFrom(graphics,barplot) importFrom(graphics,curve) importFrom(graphics,hist) importFrom(graphics,identify) importFrom(graphics,image) importFrom(graphics,legend) importFrom(graphics,locator) importFrom(graphics,matplot) importFrom(graphics,par) importFrom(graphics,plot) importFrom(graphics,plot.default) importFrom(graphics,plot.new) importFrom(graphics,plot.window) importFrom(graphics,points) importFrom(graphics,segments) importFrom(graphics,strwidth) importFrom(graphics,text) importFrom(graphics,title) importFrom(igraph,decompose) importFrom(igraph,graph) importFrom(igraph,graph_from_adjacency_matrix) importFrom(igraph,layout_nicely) importFrom(igraph,shortest_paths) importFrom(igraph,topo_sort) importFrom(igraph,vcount) importFrom(magrittr,"%>%") importFrom(quadprog,solve.QP) importFrom(quadprog,solve.QP.compact) importFrom(stats,AIC) importFrom(stats,BIC) importFrom(stats,aggregate) importFrom(stats,as.dist) importFrom(stats,constrOptim) importFrom(stats,cophenetic) importFrom(stats,dgamma) importFrom(stats,hclust) importFrom(stats,lm.fit) importFrom(stats,logLik) importFrom(stats,model.matrix) importFrom(stats,na.omit) importFrom(stats,optim) importFrom(stats,optimize) importFrom(stats,pchisq) importFrom(stats,pgamma) importFrom(stats,qbeta) importFrom(stats,qgamma) importFrom(stats,quantile) importFrom(stats,reorder) importFrom(stats,reshape) importFrom(stats,runif) importFrom(stats,sd) importFrom(stats,stepfun) importFrom(stats,update) importFrom(stats,xtabs) importFrom(utils,combn) importFrom(utils,download.file) importFrom(utils,installed.packages) importFrom(utils,packageDescription) importFrom(utils,read.table) importFrom(utils,stack) importFrom(utils,write.table) useDynLib(phangorn, .registration = TRUE) phangorn/NEWS0000644000176200001440000005626513500251703012577 0ustar liggesusers CHANGES in PHANGORN VERSION 2.5.4 NEW FEATURES o dist.ml, dist.hamming, dist.logDet and dist.p also take DNAbin or AAbin objects as input BUG FIXES o bootstrap.pml returned an error with argument optNni=T Best practise is to always use TRUE and not T as shortcut OTHER CHANGES o several more unit tests CHANGES in PHANGORN VERSION 2.5.2 NEW FEATURES o pratchet, optim.parsimony, optim.pml all may now return trees with multifurcations in case duplicated sequences are discovered. This may lead to speeding up computations and improved tree topology search. o function codonTest which adds codon models to detect positive selection (M1a, M2a) and several options to estimate codon frequencies (F3x4, F1x4). Can be pretty slow and still experimental. o broom type tidy function for several objects to easier compare models o new "equal_angle" layout for 2D-networks (now the default) o tiplabels, nodelabels, edgelabels from ape work for plot.networx if plotted with base R OTHER CHANGES o several small improvements to more intuitively use pml and phyDat objects, like subsetting phyDat objects with "[i, j]". o several more unit tests o two new contributors, Keren and Richel o optim.parsimony, pratchet, pmlMix and pmlPart may return the current best tree or object when interrupted. o roxygen2 is used to generate NAMESPACE file CHANGES in PHANGORN VERSION 2.4.0 NEW FEATURES o new function add.tips BUG FIXES o midpoint works now for trees with only 2 tips o densiTree, bug report by Richel Bilderbeek o tree rearrangement in optim.pml return tree with double edge matrix o phyDat should work now for named vectors OTHER CHANGES o many more unit tests o more consistent coding style o flashClust and seqLogo are not suggested packages any more CHANGES in PHANGORN VERSION 2.3.0 NEW FEATURES o new function mast to compute the maximum agreement subtree o identify.networx to identify splits in a network o densiTree got more attributes o unique.dist, to filter duplicate distances o ancestral.pml and ancestral.pars are now may return proper phyDat objects and in for DNA may return ambiguous states BUG FIXES o densiTree may if the consensus tree had different ordering of labels OTHER CHANGES o acctran allows multiPhylo objects as input o rNNI has been completely rewritten and is faster CHANGES in PHANGORN VERSION 2.2.0 NEW FEATURES o midpoint in now generic and works for multiPhylo objects o as.bitsplits.splits to better interact with ape BUG FIXES o bug fix in RI and CI for ambiguous data OTHER CHANGES o added roxygen2 documentation, so R code is now much better documented, reorganisation of some documentation o many more unit tests CHANGES in PHANGORN VERSION 2.1.0 NEW FEATURES o new functions to compute the (approximate) SPR distance (sprdist, SPR.dist) contributed by Leonardo de Oliveira Martins. o super tree methods based on NNI and SPR distances BUG FIXES o fixed bug in KF.dist OTHER CHANGES o improvements to as.networx. It often now produces networks with less edges resulting in much nicer plots o plot.networx does take a different layout algorithm o as.data.frame.phyDat and as.character.phyDat return amino acids now in upper cases o more unit tests o improved cbind.phyDat, faster and more flexible o phangorn now requires ape 4.0 o phangorn now imports Rcpp, but not nnls any more CHANGES in PHANGORN VERSION 2.0.4 NEW FEATURES o new weighted Robinson-Foulds (1979) distance wRF, suggested by Michelle Kendall and normalized Robinson-Foulds suggested by Sereina Rutschmann o codon model "YN98" can be called directly, improved documentation o bootstrap.phyDat got an new argument jumble, which randomizes input order of sequences OTHER CHANGES o more unit tests CHANGES in PHANGORN VERSION 2.0.3 NEW FEATURES o new function maxCladeCred computing the maximum clade credibility tree from a sample of trees o function read.nexus.networx and write.nexus.networx to import / export phylogenetic networx to SplitsTree o function as.AAbin.phyDat to exchange data with the new AAbin class from ape o likelihood ratchet (Vos 2003) topology optimisation in optim.pml o with KF.dist (Kuhner & Felsenstein) and path.dist can be used like RF.dist BUG FIXES o improvements to optim.pml to avoid numerical problems, can now handle much more taxa (still experimantal) OTHER CHANGES o mrca.phylo can be used like mrca from ape (faster for large trees) o individual splits can be colored in lento plots (suggested by France Thouzé) o plot.networx now (silently) returns a networx object with some of the graphics parameters, more plot options o lots of small changes to make handling and identifying splits, edges in trees and networks easier o plotBS has a new argument frame and arguments BStrees can be empty o new vignette IntertwiningTreesAndNetworks CHANGES in PHANGORN VERSION 2.0.2 OTHER CHANGES o phangorn now suggests only the Biostrings and not depends on it o some improvements to bab (branch and bound), may be faster CHANGES in PHANGORN VERSION 2.0.0 NEW FEATURES o as.phyDat.MultipleAlignment to excange data with Biostrings o dist.ml can now compute distances using a discrete gamma model and the "F81" model. o optim.pml got a new rearrangement argument and can now use a stochastic rearrangements similar to Nguyen et al. (2015) BUG FIXES o plotBS may double counted edges when rooted trees were in the sample OTHER CHANGES o optim.pml uses more C code and should be more robust o more unit tests o baseFreq got additional parameter 'all' similar to base.freq in ape o lots of little improvements in the manual and help files o modelTest now also shows AIC weights and model="all" will test all available models CHANGES in PHANGORN VERSION 1.99.14 NEW FEATURES o phyDat2alignment to exports files to seqinr o readDist, writeDist to import / export distance matrices o cophenetic distance function for splits and networx o added unit tests BUG FIXES o as.splits.networx did not work properly for 4 taxa (reported by Laurélène Faye) o RF.dist returned sometimes wrong values (reported by Andres Dajles) o plotBS did sometimes not work if the tree had no edge lengths o plotBS did not work propoerly if input trees were rooted (reported by Quynh Quach) o plot.networx ignored cex argument in "2D" plots o Siblings ignored include.self argument if node is a vector OTHER CHANGES o plotBS got an additional argument p to plot only support values greater than p o pml and optim.pml now uses more C-code (and is a bit faster) o defaults in modelTest changed o discrete.gamma is now exported in the NAMESPACE CHANGES in PHANGORN VERSION 1.99-13 OTHER CHANGES o improved importing and conversion of data o improved stability of pml and optim.pml CHANGES in PHANGORN VERSION 1.99-12 NEW FEATURES o added neighborNet algorithm (Bryant and Moulton 2004) very experimental at the moment BUG FIXES o plotBS was not working correctly if bootstraped trees are in compressed form (bug report by Tobias Müller) OTHER CHANGES o many splits and networx methods have been improved and a vignette was added o phangorn now suggests only the rgl and not depends on it to avoid problems on different platforms (suggestion by Matt Pennell) o new package dependencies knitr for html vignettes and nnls CHANGES in PHANGORN VERSION 1.99-10 BUG FIXES o reorder.networx may not work as expected o Gamma model was not working properly in simSeq.pml CHANGES in PHANGORN VERSION 1.99-9 BUG FIXES o bug fixes for clang environment o midpoint takes care of node labels CHANGES in PHANGORN VERSION 1.99-8 NEW FEATURES o pmlPart got an argument rooted to handle rooted trees o simSeq is now a generic function. This simplifies the construcion of parametric bootstrap test o SOWH.test (very experimental) o as.networx and plot.networx improved considerably (often generate networks less edges) and planar graphs are now plotted nicely BUG FIXES o fixed some bugs in ancestral.pars o amino acid model "Blosum62" was not working OTHER CHANGES o improvements to read.nexus.splits, write.nexus.splits to be more consistant with splitstree o splitsNetwork got an additional argument splits o help for consensusNet, as.splits, as.networx have been reorganised and improved o treedist is much faster for larger trees o several changes to keep R CMD check happy o a development version phangorn is now available on github https://github.com/KlausVigo/phangorn.git CHANGES in PHANGORN VERSION 1.99-6 NEW FEATURES o cladePar helps coloring trees o treedist is faster for larger trees, better documentation and examples BUG FIXES o the plot of consensusNet shows now the proper bootstrap values OTHER CHANGES o phangorn does not depend only suggest rgl (should build on OS X now) o default rearrangement for parsimony is now "SPR" CHANGES in PHANGORN VERSION 1.99-5 NEW FEATURES o RF.dist works also on "multiPhylo" objects and is quite fast o optim.pml can now handle NNI tree arrangements for rooted trees, still experimental but useful for dating etc. BUG FIXES o rNNI did return sometimes trees without tip labels o SH.test did not work for pmlCluster objects o df for rooted rooted/ultrametric trees are correctly computed OTHER CHANGES o lots of internal code C-code changed o exports of some of the internal ML function, this should speed up in future other packages e.g. the colescentMCMC package, which use them considerably (interface may changes in the future) o registered C routines CHANGES in PHANGORN VERSION 1.99-0 NEW FEATURES o new function dist.p to estimate pairwise polymorphism p-distances from DNA sequences BUG FIXES o as.data.frame.phyDat returned only site patterns and so did write.phyDat for nexus files o some of the recently introduced (1.7-4) amino acid models were not known by all functions and contained NAs OTHER CHANGES o changed package imports and depends structure to aviod error messages, thanks to Brian Ripley o a lot of the internal C-code has changed CHANGES in PHANGORN VERSION 1.7-4 NEW FEATURES o densiTree plots are available now o new species tree and super tree methods o more amino acid models BUG FIXES o phangorn now depends on rgl instead of suggests rgl, rgl wants to be loaded before igraph, otherwise a compiling error on some platforms occured! o fixed a bug that sometimes caused in pratched to crash o fixed a bug when using negative indices in subset.phyDat o the search heuristic SPR in optim.parsimony evaluates now more trees and is more likely to find better ones OTHER CHANGES o underlying C-code for several functions has changed. less memory reallocations and potentially time savings hopefully I included not too many bugs o optimising edge length changed from Jacobi to Gauss-Seidel method and will hopefully be more robust in the long term! o Descendants is much faster for option type="all" o plotAnc gives user more control and produces nicer plots CHANGES in PHANGORN VERSION 1.7-1 NEW FEATURES o pmlPart got additional argument model (request from Santiago Claramunt) BUG FIXES o pmlPart should be more robust OTHER CHANGES o started reorganising the code o underlying code of several parsimony functions has changed and these are now considerably faster o some examples are changed to allow faster checking on CRAN CHANGES in PHANGORN VERSION 1.6-5 NEW FEATURES o dist.hamming handles ambigious states now as dist.ml (request from Arne Mooers) BUG FIXES o phangorn links properly to ape CHANGES in PHANGORN VERSION 1.6-3 NEW FEATURES o optim.parsimony has a new search heuristic (SPR) BUG FIXES o changed package to work with igraph >= 0.6 OTHER CHANGES o arguments of pratchet changed CHANGES in PHANGORN VERSION 1.6-0 NEW FEATURES o dist.ml has more options and is faster (ca. 5 times for nucleotides and 20 times for amino acids) BUG FIXES o plotBS did not work properly with ape version 3.0 OTHER CHANGES o vignettes changed for a faster compilation of the package o Ancestors allows a vector of nodes as input o midpoint uses less memory and works for larger trees (10000 of tips) o ancestral.pars gives better formated output CHANGES in PHANGORN VERSION 1.5-1 OTHER CHANGES o several examples changed for a faster compilation of the package CHANGES in PHANGORN VERSION 1.5-0 NEW FEATURES o codon models can be used directly (dn/ds ratio can be computed) o modelTest works now also for amino acids BUG FIXES o the code to compute RI and CI changed and should be more robust OTHER CHANGES o package parallel is used instead of multicore o vignettes, examples, help improved o ChangeLog is called NEWS CHANGES in PHANGORN VERSION 1.4-1 NEW FEATURES o parsimony branch-and-bould algorithms bab (so far pretty slow and memory intensive) o more amino acid models o function nnls.tree to compute non-negative edge weights for a given tree and a distance matrix BUG FIXES o allTrees returns now an integer edge matrix, this could have caused some problems previously o CI and RI now take better care of ambiguous states o dist.ml has default value for amino acids o as.splits.multiPhylo produces more sensible bipartitions and so lento and consensusNet produce more useful plots (thanks to Emmanuel Paradis) OTHER CHANGES o several changes to the networx classes and methods o modelTest now also returns the function calls of the estimated models, which can be used in downstream analyses o vignette "Trees" has a few more examples o dist.ml is more general (base frequencies and rate matrix can be supplied) o pml objects are more compact, thanks to the Matrix package o xtable is now a suggested package (needed for vignettes) CHANGES in PHANGORN VERSION 1.4-0 NEW FEATURES o plot.network to plot split networks in 3D (requires rgl) and 2D (still very experimantal) o consensusNet computes consensus networks o Lento plot allows to take multiPhylo objects as input BUG FIXES o CI and RI did not work with only one site pattern present o pratchet returned only one, not all of the best trees found OTHER CHANGES o phangorn now requires the Matrix, igraph and rgl packages o designTree returns a sparse Matrix and this can save a lot of memory o internal code for computing bipartitions is much faster for large trees, and so are several functions depending on it, e.g. RF.dist, treedist, Descendants CHANGES in PHANGORN VERSION 1.3-1 BUG FIXES o the multicore package may failed, if executed in a GUI environment, more error checks included o optim.pml, in rare cases may failed to optimize edge length (should be more robust now) OTHER CHANGES o some changes to keep R CMD check happy o modelTest, pratchet, bootstrap.pml, bootstrap.phyDat got an additional argument multicore option to switch between serial and parallel execution CHANGES in PHANGORN VERSION 1.3-0 NEW FEATURES o acctran to assign edge length to parsimony trees OTHER CHANGES o phangorn can now be cited o additional and improved ancestral reconstructions methods (ACCTRAN, MPR) o new vignette describing ancestral sequence reconstruction CHANGES in PHANGORN VERSION 1.2-0 NEW FEATURES o new function pratchet (parsimony ratchet) o new function midpoint for rooting trees o new function pruneTree to build concensus trees from node labels (e.g. bootstrap values) o multicore support for modelTest BUG FIXES o ancestral.pars sometimes did not show all possible states o the call-attributes did not get proper changed in update.pml and optim.pml OTHER CHANGES o there is now a general help page displayed with '?phangorn' o dist.hamming is faster o getClans, getSlices and getDiverstity can now handle multifurcating trees CHANGES in PHANGORN VERSION 1.1-2 NEW FEATURES o more generic methods for class splits (print, as.matrix) o plotBS can plot now cladograms and phylograms BUG FIXES o read.phyDat sometimes did not work properly for amino acids CHANGES in PHANGORN VERSION 1.1-1 NEW FEATURES o optim.pml allows to optimise rooted trees OTHER CHANGES o description of getClans improved CHANGES in PHANGORN VERSION 1.1-0 NEW FEATURES o Consistency Index (CI) and and Rentention Index (RI) o clanistic tools o new generic function cbind.phyDat o optim.parsimony works now also with the fitch algorithm, faster than the sankoff version BUG FIXES o treedist and RF.dist now check whether trees are binary and try to handle multifurcations (thanks to Jeremy Beaulieu for bug fixes) OTHER CHANGES o second vignette describing some special features o allTrees is faster o trace and pml.control are now more consistent o optim.pml uses less memory and can be faster for data with lots of characters CHANGES in PHANGORN VERSION 1.0-2 BUG FIXES o pml.control did not work properly OTHER CHANGES o pmlCluster, pmlMix and pmlPart gained an attribute control, which controls the outermost loop o some more error checking for pml and parsimony classes (thanks to Emmanuel and Liat) CHANGES in PHANGORN VERSION 1.0-1 NEW FEATURES o ancestral sequence reconstruction (parsimony and likelihood based) o a small convenience function acgt2ry for ry-coding o as.phylo.splits computes a tree from compatible splits BUG FIXES o a small error in pmlCluster was fixed OTHER CHANGES o upgma changed to accommodate change in as.phylo.hclust o lento plots are looking nicer CHANGES IN PHANGORN VERSION 1.0-0 NEW FEATURES o implementation of many nucleotide substitution models (additional general transition models can be defined) o new function modelTest, comparison of different phylogenetic model with AIC or BIC o Lento plot o subset functions for phyDat objects BUG FIXES o an error in pace is fixed OTHER CHANGES o parsimony (fitch and sankoff) can now handle multiPhylo objects o splits structure (which is a list of bipartitions), used by lento and hadamard conjugation o phyDat objects can be more general generated using a contrast matrix CHANGES IN PHANGORN VERSION 0.99-6 NEW FEATURES o pace, extracts the ancestral states of the root of a tree using the sankoff algorithm BUG FIXES o fixed a bug in dist.ml (thanks to Emmanuel) o fixed a bug introduced to SH.test in 0.99-5 OTHER CHANGES o fixed several spelling mistakes in the documentation CHANGES IN PHANGORN VERSION 0.99-5 NEW FEATURES o parallel computing via multicore (so far bootstrap.pml, bootstrap.pml profit under linux) o compute edge weights for parsimony trees BUG FIXES o optim.pml had problems when o as.character converted ?,- wrongly to NA o fitch needed binary trees as input, otherwise pscore is likely to be wrong (returns now a warning) o optim.pml had a problem with identical sequences OTHER CHANGES o optim.parsimony returns now a tree with edge weights o vignette is enhanced, I fixed some spelling mistakes and added some more examples. CHANGES IN PHANGORN VERSION 0.99-4 NEW FEATURES o new generic function unique.phyDat OTHER CHANGES o internal data format phyDat changed and data are stored more memory efficient (optim.pml and friends use less memory and may be faster) CHANGES IN PHANGORN VERSION 0.99-3 BUG FIXES o RF.dist sometimes returned wrong distances o rate parameter is now properly normalized in pml.Part and pmlCluster o simSeq had problems simulating a single character NEW FEATURES o rSPR and rNNI to simulate tree rearrangements CHANGES IN PHANGORN VERSION 0.99-2 NEW FEATURES o bootstrap.pml and bootstrap.phyDat: parametric bootstrap methods o simSeq: A new function to simulate sequence data o read.phyDat: simplifies reading in alignments o SH.test: Shimodaira-Hasegawa test o RF.dist: Robinson-Foulds distance as replacement for treedist (uses less memory and is much faster) BUG FIXES o dist.ml returned wrong variances. o as.character.phyDat, as.data.frame caused an error for alignments with only one site. OTHER CHANGES o added vignette describing how to perform some standard phylogenetic analysis with phangorn. o more functions to convert between different data formats. o NNI tree search is now general possible for partition models (pmlPart, pmlCluster) CHANGES IN PHANGORN VERSION 0.0-5 BUG FIXES o Solved a namespace problem with ape (>=2.2-3). CHANGES IN PHANGORN VERSION 0.0-4 NEW FEATURES o splitsNetwork fits a phylogenetic network using a L1 penalty. (High memory consumption) o pmlPen: A new function to estimate penalized likelihood models for sets of edge weights in mixtures or partition models. BUG FIXES o dist.ml should be more forgiving for different inputs. OTHER CHANGES o a new dataset. CHANGES IN PHANGORN VERSION 0.0-3 NEW FEATURES o amino acid models o several new maximum likelihood models: mixture models (pmlMix), and some model for phylogenomic data partition models (pmlPart), and clustering of partitions / genes (pmlCluster) (still experimental, feed back wellcome) o design matrices for phylogenetic distance methods o added some functions useful for simulations (nni, allTrees) OTHER CHANGES o the data object phyDat changed slightly internally o a new dataset o read.aa to read amino acid data in phylip format based on read.dna from the ape package CHANGES IN PHANGORN VERSION 0.0-2 NEW FEATURES o more generic functions (plot.pml, update.pml) BUG FIXES o the "Fitch" algorithm in parsimony contained a bug OTHER CHANGES o pml has a cleaner interface (less parameter) o new faster parsimony analysis (more compiled C-Code) o added NAMESPACE phangorn/data/0000755000176200001440000000000013475602650013007 5ustar liggesusersphangorn/data/yeast.RData0000644000176200001440000046427413475602650015072 0ustar liggesusers7zXZi"6!X])TW"nRʟX\qjnj-&d k9oP66R Rw yXg!qP_?DSՆX]OB`_dR۹ajvRS O%TJ|qxK Ne6J*M8% Vō1}m :P?6kdFs|pKwFqY}HƧB,>ž(:kPhŖ-7\Z"Ӎ@<Y@HM; 9y"O+qt]I'/T-0U˝('2!+l)p|T凸mP'P|hW|r4n(ʡ\+15v8exgc%-=<^ϑթC_ x=9`MR9~(7b*V(t_~*pc{{?KiuLb1B%#wSzS;*QP{]zVnSs{taSְqO n=S;҉|8ZZo]\زuR6!&HKΎDͯ<(c6vg|MBقrݩvBo;*F7I*؀FP{$ަ_>1-/##(c~2w Hsvš2NI\nbyNz\!Uc!4s5\@L#mkt^\c0exO4oDzvE)< rN拑&4C<=0QeuЊN#;ܾ=ڎSҚo K&s2Sp7|bf/81r_avRRBfdhCC- 7H;1r-G( ӥ Za7mܥVFz[$'f:t-og,̂TYэЃg{ܷ'AwF:M5jk}AY $)uԌ7,-ٵ1PS#@A= p 锎`"ZY[G$}48_} Y@SBy or{?ѕv;bN{ &5汦|eKg N(R. \b2gZ}6-^5705Ҵդ~}< u3aœzbp}j8 ~ccF"#>̌w-oeŁC'OT4'EmGekfS\U_OI:inuĺŰ_uU3tbvRIp}kBQְ nJڵ]>멂2Iӑ~ƞrc a&sy]a/* P|D𙯩)AHuZ:oZa?&eszЄ;c?:*: if$EvUIoԨ;' R@G*֩BJSMӍ4q+n}0ލ:1N8-R F[lZy"hjY/;temd'~+8-DRmz^ :M|:q#1 G IErc4oɰ ϿWFM5K2]9NsC0Vw7 pVUR @"1;-CaKB@X^T|oZq=5Ny+n l2X,E>#j-ͲהpSFLKH6V1{Mek]86XN A]Vdg.*0pr#g'l scH6n%ӳ9j[5/`'Rj,2XG\7Eg&̞k?x 7~*3l~g!Ӎ <àlV(E>0wdk$D,‾G4 [ż;4.4 VYIZo#ZUsH0EǍK翃ˮf1t ߩt6&jl{.$u3r;g諠W>ĸ[4RǺ̷@lq'= 0ủ_Ew;+P,-y-jPwj|X5d\x4n9pNﹸq' Xw jLll kQnw2esEUh\z3jd8( *xjā_a^6#$݉O c;Yp>et%?H{>$|mGm*e_*mDKCq a&J%Ovnl9A,E#9Sł+*\7,X«w' ϶-o}"6.*]G"o "p|"딮jj1ybVLz;GaB,3y9 UUgX~e7l,ZCQi5V4nɛ;>{uD5Z#9-$+zmS=jSC`:Zd־^e%8#U) "EM:S v_! nu~WJz < % ^嬂fy !qvFV8-|n@VcR { /()&Q1Dye$h՞=dΕ\ $}p T{>gm;uWGDp?y" |-_o}EX,>18&&ⲁG%y0R=;7gJO.kbr=BϭSO{Yv}_͊`G>0x{/m}_q4sIW={bR8 1M-[t^ ! .3, RE 4/9kkPraA&8B3J]e"<2V[۪ (ہjZkd~[ '>L3qϏ-HAu[u-bt(TGb ƲDqiM⁴kv*D->ygl}'-H*F |"?3q] b\v(f;Ɂ\~hD?۬ї&C|Gta d.߄0@-w{l( ZY5v>GLNsMR#R)R;Xo|&.k#,%VghjDB 8D ?K nSO²uFr|+_gFۜ,T_fYi } DB2] @ 5q IcJOܿi󣡓,u$Bbtm ~zq{"  .}'SoW˘R h16}'k"k<3l6PaIpKCsmp9?C[U1(w렸~=';KF> {ziጘ[7،:v(N :WL1?d[ ( OwM3Y"K҇1꿖V5AepG(KNRv$do W/*.n5Vln4'U/ Śc <%BC M[/_0RڱUC*z2νo!*%V4ҧXӟ} #*U=DJ»v] 1_gCUT!yH%%fVW[?z.F"nh ]L8NkQz }C~oU]GW^[Ԝ#GF~76(+DٙϪGpLCrG[i}p4䂴PEKp|5!qU)`r! L`\B Bxdkn9w#ա\hͽ'bQZmg5o2+X^@JY iR#"dmY*j]$6mhhu8E&*e 6q2L*ut.nh}KlK$[p(%z58a̤" R胢.Гث7׮]&e^Pe$L=t{6WV JgL RG!se=np>QxpVدo1a/3qN 9V{0(Gw#-ݛ4c8faG[4cAN07 n6,\PM/ppJ֯8讪ɗH0J[3%1),Y c>;r 3AH=6v9#VOvqW-x֭r'k˘nna m4TDVr':S}ɿ3GP740҉FU6RmbYD Bd൉yͳmV!jNStO`5аiOg,Hg< Fǀc":U.EЛ!P)6{:q͈N9`GHJTGx؆Lb͎ĿnGl.ֿ F-ӒK.-uU!5_>:<t5r(d*-ވ] oVXf8sAŊpPPݠ+}_Q+6X_ї3})7 8z!gS*UŅ^*kRpK_{RT^j[ӑ Uf̯H]B=B!al#0Thע? 1JD2}̙ |06V%ecI>虗7 5D(V8O1 bK͜ Ȑ: +3E>FQo2152&])\~#z+JpBI'шYejtZ @1}BPo,Z4:"ЉBE;Z:}JB+ 6p}='C܌l>R#)%$ 0DyCdS[1lcwˣܾdyNDH GvVĉ'Zmb3EYL.n}h@U%4R9jj;|u7gՠI[vx pifx=|KbLZ^μ^u=4:ewfT)=cN?[L>`G<~9KV-~"RJ]yB-HLlYC.Gf/mC-xHOmցwzQDfɯz9ޓ'b 5脧.7 -/D[L4ϗ7Y- ǴTҳ"_;G|Lv]~z}Q E c**ё#I+60Z:K@guvUJΠ%]kNmWI Z\1+QAj (BxªvwȭVdd~ LXeO9 +SJ<4ԏǘUڏR;90kP^ņW4h< _F5XĿoxZݿlBQ!8KwT{='4K_FyYeۏvkRn_?\f#̹JF6`D2YR4|8M-RI<1]xT#XĔDfGUW켿yT]-Ooo0Ble\"AdgsQEr*T6sHtb&IWN߁}΍{]=-ՍT.HX9SNX0͜/tsԯl>]XQ;Ez2FM"$%N!69;ǏN"8ݸ0T3Cm4bebSPSoMࣃBEzR!^0TBSt$|j_$Z`d6.䣺T]. t eh;ew"Ur&NSh#c$j )ʆ wSBA㡜ɽzr ::Y@;OhEX{!g쬲H0j0p9ɫΦ,V&bLO!IX k;uth;L?]T RdgPFA-i{82j'aCF[Gb(7ԀsR &TmVK=鷤󿊱rd |2|Lv8NW$4}#"<cȫVئ\msDw#]b^F/~ƀk+=7P[" X1 7kٽ84ת!akrjS0̪4.I}xDqWUޮm?1oF,4EnL¶h//v5i#AFḻAch8ՠ@|А\ pbg?߽5ǎ, {.I}0ZN 3>{Q(:+ r؝GVn7SȲ3Q#ЮCP9":G,b84rc-踢.Pu1mF:t(s&I<%䫛JH<6}Fe4s*14x*DY/Bf$ڛ +Ed[e9z5CY tqtiv,°!59m p;_Ѳ ikS JD| 'R!6IB"ZoLMe-/̻8\0?}:&wg6Ef 5&(5H7V.+P }= -L -5l1rק@h[\*F\/e8$=aoocw3)ڨnú =e1Sdӹx^xC}ikxU|5C!Wpu*v.o3ԇf :i--RHh'?֌\aeG7^@ -d2$m<3d%$9,>dLS\ï.[iLHEN&fC '2[z+oq:qX^\/Ӛw11 ]绽*:-Tw } YX0Sk?Cz0Ƃ斈V&mUH/8S/-%m' SJsP>)\CZNg[vPtY,ENe []S(ag_𭵊1z씜 QDMKZu^IuM¶(?9*$nK\jQ,Z /P,<޽%{XzePɖ8?ZUX@t6\d:;+qcz%y x_ºک S=vOv@8S:`*lh\(YE#͋OYӗc_Xc h:[]2ɆpjN1R.BMKprɉ形LnFSuArN:|L;iH?P9wtxܷѯ$z eoS]6id;Yn}eԅ/y{ڬa).3jP7/Κ^c#n>𘡍־{/<7Ew>W~H=Z $Cy@春&im*(4"<8LT σ^SR8:nm{!V#?i<6D&a?4K*GʱYFWPy2[* ZMw 2v(9~h:C)huTy(I_ĺ fZhϗVw۹칏K;er%1.Ӊ< Xdy)1ZH`r ʞyŁ>Eiw SBwvX½B^&^sx#xxtg%hݔA'SLh˚Bm-KXBשaȡvAAFriRe1\A&W%Aa Wju =nB}8P c!fqaV YT 8c`4&? 4{x+(S `s;a >!&h~6Ѷg+h%gaXQgm|H rCS&؍SZ1-> L+vO.^$JlsqC7$4uؠW1R%A8 8jsA Kro]Cq#Ԣ-h3QtH\bQBì0yʘoγ>^}eQ4՞o{vAMWwKn)Jׄ2&Utu)iwUooɮ̼F nib˲2 k(6Ʒ/#9U{m<7&yb[a.Ŗۦgdk#"8M(>x樲?W8"T  }C%L&Ւi>8B :i^2}gZHr &֙ᤂEa&Ujy\ve4gWt iE hͤcA,6o%rJ )@?R2'/AiY2fEcJ̓ K2Y"zPN'K#3-=RC1X'Hv/EV`I ;?Ab ;xfP3Y JJ%?2vdS闣_>`\C&RǭzxvCZ~` (U9़T}4wf_͂R߯k Dq WY2ơȱY#ys y}[L|AP6~PuH rBtj6z69s.IJDZ JxIc0g ~M6  (줐ҢqŬiϩ|G:4 d7F|i|ڡHU )ϒFEj\2zߎ-=<bZ]ݳnbQb`!B;1bhucJL+'$P1(S!m/ci0 WÜi`4,Y4!Naf.iMG #XHPh\c [ , mI`O cު{ez:rki=̫k[ %jУd;/|_BxbQSİ [\D(nweqД'<(,[Ѽ)tz#9EtSQzh/2]f ʺPߍHo\"1`8)IToI`bTÿ. MҚ t qgUNY-įf!Cp(To斒ٵûaw*քI %7'.Mkfkys6;Cn%௯!r򽑹ۥl$f awj^|^!dc6ۣ1{V09+r eV8QV4ԼJ*pi֊ FنS%Wsȧ=xi9e;jFVa]WŴdyՇp.G(<߾tA(|4]SKyo!ln\Bd±\OBLVG2*Zk$P:/ż{CZ=&=!͇1'ۙ@7V,^Ks.p.4$5+LR Jԙ,,ʙۯ qi=_N[̰+8Qv[k>|I&*;i #\|3e Vwq}&4>8 _Aݖ_pc UAt,FD?pRiFfSObѽg&ym͵Mj=j7qT,dyfdVR4۠ +(uqVؑIA.X5Quu~bekx0{%;3\I./-53@1=)oBN*Ig`f=dHAu3Tk cMүr2kB1aIg3-Ea1Y+| 5.]&3Ua ;`5ݪzP(2‰j,*h뙳) ܌0"Q]kij`{SmH<8ABl@t8Ml'>$_EVCZj3EMm: .?.V>{\4̢2=yPdz/ 6SEU5<ݹ{q TF3#ZgpQBmQd@8J̷fS'HDt.B8 1 2YӉ2? Y'x#:,xO"= 96]1 _r"h`fX${ T<6Ǐ',߁Hd ֧%%̳ަE%39@ \ [ϞN!JFZ絢W g8A 8.}uUf\k}SNݳzLOASF|ӞW)[֟8gUy\HLOI8N@f: o;>]ޞ1ܜ)[+<ٙx .ᛂoL +7AǙb]Ph vJwV)Ĝ0ccK߶?@i#CUs-H8{<^;n[Y 27MDCMrRiga|#'0vÝW /K+ѡyov-<E"IWRߕj.F!_dH:؈ٕ.zz7a .%m2s (9x!ɔIV䈙C~ %wyAYe aKAMi6Kz|ҕ Pj %y^N JVm،ԓ_Yd?ɷv⋝ ^PA &B!odm^Bn0pIck/PL%nόqV`jBO`iM|STx jv\PE|K$&4$&;jѐ=Z x\Ad=^׍KPlyτIõBwR^R_. p2HHh.Fr2*NJc]WaX~͊*ʼn98Y  ;bJFRONFCwKzL [(Rjp ={31 Xi .eU,DHm W'hY4]kf\xQnVadƽ mʫ X DD[gHd0+$C9z㜯L,+c%U&$q /? 'kE}bȷ`%n^Za5ۧ8 m~t(%+o) &N?4!Ho<.u _WRA *1Y.`)u{O ~]GgwW3d0(--;&WAu[u.Ͳ_2o_K@[35fs?6"yD5r}AxVЅ6Ox\DU2PJU/n{6{MEAY:92~qѡD$pQzƕŋCIn$`+@FT*V_de2{vye|`*0'A۱RBHȘ\/h vw[2rSzDznok4ckl }$60JXINFXT WEQb" lU5ܯ7HSySju 88Xݦ">>ua%4T:ԲS2&S"'8 SrdSU[и q)5mtFUϡ ۠T3W{('3Ks$9F%YebNY<`}uCe îRq{wlxi/> bou|+uq5Шf5}- &TZ{LvtCB~MAJSx=`21K ljGgm;7j}Lkaf{̓]@yJbcɰK   fYv ScN?2iiDc1L݀LJ$4+ VQ [($~ Zքa/2rs2k8] f>_yC[}s̷|i>;>}jqT bNf@St#qy>X#{vL5 f4`c&~?>rtƂԘ?$(Ϥ2}f/[/ YhjA~)|r5.2p֕+͸tn*_"ۤX8}Gɯ->Gc^&A)4ϳG%,Mk"GST7 (iBUߝ˪mL+,ASGٕYGK`<5?7FB;̎Zԇ D6u +2mt Z fCh/~K2Oi@xD{ᕭڡ$}KƷ`;RY"oj--HOȾz96tS$ykwêy&Op@(]yP!K+kNs-.f#5L~# f'࣌8e7;a nd2, ׸Rk31ib)r)EUͽpygiKu JR]+* :Gn>)/狀I^鉓{~"̏}{IĐpOy%#cte=fvyN_XJQ0XAivr6R@ ހr MK,[}}w۴vHڷn}L"=A1o\)W$Lst{bq'<&ચyw^E <ߡ-UB豫P(IC۹{=ߐ'MSK9@K-<ȓpLtLZA-rKdntw(19ۅ.`|~uBqCnk<5-7h _;4}iƭq]si}d2+?= Q'v:ڟqyR.1o%B?_q;58=98%Nzz%r=lUjefupx?6 LIr+=0mH x}(nDC-gRn?6,ꃯx;QݨWn*ǧG2yʟgc^,-+<<KlI!hc%e$k~^放Vfm7V~.N\U#qc{#r!mL.|[v:wsr})a}4(i%Ȍv<8-5d[(FtB(<^(ۂ , D❏^'-܆e> wyzL*sPgaڝIG2 p~ς514a2:oH1#JPP p+gNbnY"G rÓ:]tE$mOɂLd xoQyʀ뢌Z*FT* f䒶 kygȖx%C29z=y?Lcc-+4FwF|~Y粕,nPR+iQuC9̂Q˿pbqC.!̴&ZGdUsԤ PXNomjTYs\42+":'qs}Q"hR새^*h)cO恇-qrbywLYCjE戨 8d̃xo#%=#.qRzwwiƯFX_SʖZգיCPf[-u#e MCN e@HhcحtD5T$췳 fI#9)I7_^!~,Z QDa>x eu0]t3t~@̈́+U26X"_2,!?cUQ( m[ =Y;`%zVBJ{GKNW`Wr;~x.l@`',kk%*u|Q@H!aD;F"# W cF3iK2kgQj3[l g*n^"X2ޗJc 11FEacu90F5Z[?a1/  BFw6dӝNտ93RX%`7FVcRfΏHX(^͕[g%Scכ?zT2auP[=q wzDvȄ2 [Ek+ zl=(f]-x j׻bb֐McQY(흽 sS(Q*3jk'FXĈVԥt1"ג Q)3kM½h=W->2 eƭ0ifcHC`7(X_E}E`5k02UЦѝΘIj@KA[u֗ڌt6vv=~q}R媿hN$p}r8pC; !l?%@|g'᷑[vqW5QoH{ `E$0"LͰk4;"YwD @O)>qҊuv_=V#?b9e@-tfԛhm#MgAUuh[:.z.@զ0緎Dko~[kMY *l4*JE.np 4٨@@M'hS}<|X)t2 y?TݾVwP>`Rߍ2xHf$0*02 fb!EgVϰ!H~_!g@hk';ʢadQz)f#v1H^42jBPbp_Yzt2[~g+Nye[g_' q6@Z4T(r$J-$q/&P;<^[_ y{vA$7:w\fݻ䨪ax/E?ܛUGO/,X|م~}?J.?"_i21_ lLPgF."GZ%lgLTCL%e;ߝ m'D4jN%˘XHߗ& ˓+`YAmWS6IwbԵDYyBxC O/xG6O4VD w~1K:OOO4{^楤oB҃46/h\=Q`lz/4-$6H##,G>CWd53n8NnM:Q+Uؼ:\ݹ2tOÇŚhhcheJ}3y.u?Gjy| /.r`*o^=T ޴~Xyrʸ팕#(YTp f+7N3Oͺ`F @C# Ec~ ۧS[#~a\Lzz hQ~ً-s0fZv/9.d*ȗgMMEzn$ Z*R+P9F<$x33ΰ>6oRwh9ۂ9k|,"W2 r序=PL#Mɻ|*x_U[ pA[5jH}&9>֐ ׮.BD\*ga@=R_XC`P-껋e P2Yn3)@2=st a+.*hlu/r[ y3E|U;i6G2rjǜjnqھwWJ7،BExR_HӚ;Ƀ<((abq&z]8hp4?ݓ]7 6qNPx"!Ux"k "uK.kh imF-Ԍ:|tܮ+r#[::I<ּ~DŽ*$m-+pҬ1#vS+ie@(f#' ݙՋ \ﰞ,< _#>g"?| a@qRPj^c2oxݻaC6Q# E V0,f*m06i+v1/:q2Ķ2&O13$V)6AD=/:`y>#ijoȢ2@qYPe5CʔId0  --&qS('b[mYS)JY݈e! ,S"W#0ⅪAh/?ٛj^qʞNy XvMTƜ `e똏)6j&1P"[-4uvc>;3CeѓTuYaIE 0 xЋ=_b6kI]$TC PdmjAn?434?uxQ$d*;AzC#Qu2>v'vb+`\LJ=j{%=)yj}.[2ގx$)I>zD¶EI>Sܵ2UuLpǓw${F^ 8:>8+$rcT) +c"d] 5iFK}axh^U/v:xd^hvbT GެG*4"Wm3>>n[a}h;{P.a6)AGG1rk!д,LZm~F_2°0^Afږ8ө\MzrD[۞Ҝ5RTf mrZ-1P\߈=F\wRʮf2o <+*a ҅3jd@4+dw^KZ`_$eNT2{m-xG8$r_`vnܟމD~,2b<ئ-0ſVD P*K){hPBDJ3t]4O(TŸvb ;;pdٓdv,^Qͥ 8 H)~l]  ?C8Qh mEQfx˙TbxTa qJG<ǿxhԵ<Av C ژorqIWE_^8!?ނ岝n7Lh<uhm. oaOGr#Ho(Tk9DϗOAlaHb:rN;;2a|(%9 u΋#FPܛ80s#1[! `H[VhC@pC*Q*dr![TX)Xݒ=\eYj_ꍵiY[t?FȒ,Sso0k \dKyyD4p-1Yu\:}![{.>գ&/-CAqh}ڝdL4ft8'̩@y:J8,|JTgTM ؉vtR Su{6nC+>j"p=|{=WNFWY>$~ytZȯwO| joObIst2."t27!q+3xA^a2;y61gUZr*΃`?Ѫ IK$R`Αw? Ю;̛ZZBy٥oZv$sQrė+=PMazEtFtj˝:MַJ%8 \81$ۈnjfh Kh8Ԓ62|5[yZ]p 1CѲސXhB"y\\B6̠ В~ 1\*8RݞAIt痞S_ߣ*ukK g.NRe ~A/c^g@(3.wuWg&m[1C(UgfߙZ̋EF 55sOw TS[5祍5C5L X |h B Xע."4^3k''}&6~EZ*~8 l[rl:/rHqGR4ƥWFcѷ/͞sOXmͩ@4kKMq0лk $<3e/Ux3[RJ堖mcGeħfpG#M!4ڏ1f=Rvm_H~'˖FZm>Mex)EùztQtOе 0u/cKmA+z}#;H,;ݻKQqړeXeFz-Ļ?UY~lHGWMpٽNy(VE)L`_>s;"H_!t^/v.'%A .Tޫ|kS]IM%z4@Fi)H)=XD&QONB/udS-+g>JJ/wEX2gЦVY0Wڟcz͓@p24L>g|U&J;v^!d7~ 9;'?,Ha~F Іa\ցTbከr|!',l} ĭ!~BV罈?y1Bj|akiXa0i+`4y.u_&c<-'p}L+x||( Z-L7"^=ݘsG^'{L2Iz܃d zCvykM'okUt*d.iH9s~U F.ە)M+z8PQHyIϒ"@lT}ꂙOc܄@X襤]}rJ2kdO_oY~]lEu-hw$RjNkbg z<{DL(ޜ+qN}S~[.)ߒ%*"*9ۃ` 倃 ;_oDiKI?@@n;mXkJfܛaw5g)ClP_lrhq {פ _}H!O]^ZS.-4Yl=ǂzٚx^'by2htuq c@k~_s^+A?})<*Dg%}GjSv1x2ΉFt/i6"t"0pVⰵB?@N=GmLKuY4H6iReS.] zb|ϐ+Kz-Hw?B\ CPTGxURs YS6U  aZ[To~ yrȭcFS^-MLFh$Nϧ'Gl˜sM҇w[5AKPQ({hLFgp-ޙ/Hzc۳5lkzw_AȹR}-XUs6^w <4)#Ќ'BWLmT>ZM'D֥VUz!OD U+{s\).Y 7|b@Yՙa]mXBz\# VX,ڒSR(oXFd@~0_r7k[k:3 UfaQngPB8^DRsF3[B"hӇ/V։@sCfLrQ~lpaH)Dy/mB=s&ȍ;R 8zb'^Կ0emݟeFf /u[DJkAJgKA;#HZi80,Uju26Z5ivF2tJȘ{eJ{9*̖~q8&zwu=@T5 v?٢^DuEMz/?Դ "#g)*rZGm7kJ5lL>o~Q .j4p _.Fm t @m\53 Sb/d]W[0yUnPgl"sq!8!Ň>UW92zh5s}}w Hwø5S앓ݻK]Fbs$ߡ2M0aд@ +\"+VZvUn}"ڭa-@?"xb{A<'" ,IWU6+ r 'G36o]!Q~" ",+F+ Sߖc0,3}HeB%Ih_cLH9A?A.%ܑX4CQiKVPY۞'|P5 Xia*E>**1FDT]ڊ,X8 : ~=Ȓ~a;y|a !rf֣&0EnQﲫSu΃dueDpbux4%NfDy(.ɋẃ= fʱs/% D Y!,q_LW(khQ,Qރ݃^~%`Pf ( "fꭈ1CgQ2G*x{8 '&:acD*1= h 81Y~'~ D~_3}/o?A5]뙁\XK[ 7z?lY*+BaV-ptHC^D:fv@D{av ! ٺ ͛ބ=Ys#S㟲НpJZL(oIw[(l[=An%5^QwL䨞Fs"A-v0 <\nbiA+\jgl><ө|vw9mdWZ+H;$WFyE ~Y Y2Ҽ"X݋'T<3Bkpƅ׫ޅ蚚,-AGtF=^Sc^mۻZwhإIDVlJŐ[<`u#y;"MH+)p^=^[je3+3$)~yLR6h{%bo` ZAlV'Ep ~,*Ldj>͙.-hPjeRo}O{<.kŒYF0}bO [^}#@ –3B%$h K#k0gU;|^Sܻ)#˚y[ptR8"y|9ΈA~5!oIyߗ$ߞBb)D&R.RJ.U_bLML _.`k.sƌ(G1ʹ=̩Q2]S%'Dwy %jZAbCbEu+(ɦU\G"0 s.PǸ q^EsI @ MS @䭨w3 HҪd&هkz}kp]H DQ~%|k(x52ZM50f\2;,`ztX:V]CCmQOlr1_&ٿ3jlCHCŝv1lfÀ12NwXqWz@+c x5Vi[5UX=on8 96aGߏE`O3) y,W̶)fdʦ;_s"2X# nvkD696?8sI}Tzxp (!-z*Lq/VKpxBSۤ)&wBHi-3,-9ZZ>~sO"NQVt2KrL?kU_;ߔ1JѓcT(\{ϣV[1_tw%][V" kf=(]tEyG3XY&ZfMm@i%7Iq8 Jg/T(:?@];G1Rbkka)cy =R>jB(&U&F1H\\kKD(H#Gm_@ԦT9=r! xl'M^):,x[r'C4"" rOky[Ћ(K93I޴ojԢiK"&Dg'lѫR޸F۷~yIpQ1˹['Ӈ8,~LK}a+v(EٕXiQnn<'_$zGD,|(K*P3J3 |U'ܣl(%8I[LlcoEüϋM]kDI{ł?? 2;աvqEʧPW2mrཿM ֒Z~rwuIZ}3!I=X32JԃN 9ì $5'42LJAi^ZZ VM[iv}Z> )oU^È.$(Zo:Ud26g%ΚRlƍCzRP,;(4Qdn݌N ipCY 4#|Itߐ*nSohM8Emt7@Ycie!s{O x #QF%۷sM` !7ZW,ZiuB{Yew9I<=TU5R$6hvd~7J楖Go<9̗%66w> s/%zM&;NXt(MA6"2~"9E`lڳQBqx˭{|#h@dtdD[rF>.bbM )50 pVWJ3o V`L{BzEf( >`ЀU'ژb t4 ޭ ܯ`دʗnԯs/R!H:0+j]`*W&ϧr;̱C}FifhO?|O]sf'GU7.;>;F4)=mV!z 󷫆;fpz,Y ~^ i/'֮A2!':'@'+8 aG+ċow3~[]mYtU3TzI$` w]x0|92ua,Z\169KEҌK88` TN󭊵{ p1t{ˆǤB4DDԾ!>_#He}zL%{A`qUU+8Y:KI4!O5P $*=f!t30KIɍܩAƱhC)l%+aN'cH9_4cо ' +ҔȌFyݾ86Ovw)/+) y[ALrĖeM}sDSrͻoN!yWFsJܮp J?An }A/公Z+|As[AW dKݿ6]g`hl ?]GP|NtY~HwvY(ڸpHQJ<Y!Rͷ?\Po.X au1# j#w!wydqm?Lm#4e~Y5? @ɂ]3<p3"NGXR0\duPGJktI"<.aI$:u} OfWahYӹA"ɩ()m`aUR5sL#'\gt8 %Q X^]/Sc bdHc4g$e-]"@8vWJYG|Bg#sעuyXsO;މtύE_åj- ڋ嫅.9|N/3~<#)xglQ… Ff AU=6.ʦ]*"TJ4Sg;`NS,S{&Ƞ{?u osa.c6ǘhIS[K^(ĥu5,Պ 횐=m1cŲ4RptCK<˫3t0Y9yz2:]$*b;jl+3WQTո@6OOD{[j sb!i%eBh,k[K)\|KLgLJ;+B@+R[޷W0.a:W!&*[mY3u_(V,l>3tݕB$Cv,E|SS] )!f|y;M'A'(.ub~N# S||&*$e 1b+^LBc~tc $˖'(y$VװHЏѿks"L%Ě y#6ͱEwfa&V6 ґ'sl 3l'9klH<{Ӯ\xc @sliw`GFg-&:0wV^[[' !(.:ALl y1ig3O',8}ckGRe)> >DZnG({rE"DmY="=xGLr>2icelq%P?ma&PpFua\y.2Gł+[\swKt^@4RF;\.WgvaRռ9-@ĒBD}u:SC yO;U u'޺T̺oUhzhX3Jb=mbev+<Ȉx}@:e),6fAD<--|21[(; gC6E]%?I[4TFhT3,wA#^&nVHO`@B ì=h~Ы3sTl RḲe3p>o:@]yvbRBiQ޷tDy˩s"ԗSdDO$v`56wvSNc79l^enw.ʂQ!\v "͟s[ȔI(!Xx4k/ G/-$Rԟx+eg7O[i,8-O&y׾"nY}_;R 5ô>q: ^꒞zb앻>Im]Hp5!']( j Qaؤ~N?Sn؞zP0esfJ,^O f`ސ0dw!PLJ>M6 1&Tt/h5Ke& RQl5b;D󦺳`6/cu&A6[w9Qۊ^,>fu*ur==:U+҂73C ( s*=£ E^W!moѾNimGj˜>9c0k5\-BEۑ_l<.D k,%CrQ$RuKoƂ鼰 lcy[b*A FGIbÏ 7+ŢBP|Ք =;؈kKjnј=@61훃 >(FVtp@pֽit[L%"'J5(\*iJ0eR#qκ2AO7{\ȎS|њT(sՑUw jB Z"lj{_tJL0DA?#h:UDRd1LQȳ&m Zq';•ױ"xc A{}atܞ5Lhꞇ3u<iVIFQacS' %#'3ŵE]t.R S!kI(=3Jk Wf&QlӖ;6MM/NX,5gLso'g_޾$ A}6@ۯr=FA<)EQcn u B$[D9QmkMBXq{V%C6_wͫy>`,ĩj ' SӸE>Jk&Kn /+I*:vMbWy0=&ֶI;<)7$u4xPA`v&xR4sXz${690iAIjk&5KS}ih?'ϖ5 C,{ 4+~<@}7G$ón.uA Vg=;2\?'S[hCT߼l<7!&WAwcO(fEQ<\x+ij0GYL|h.v+|r*drijEҘ#Ԏ# ŠhR@a.[jkjPt>p8"zщPΑw2m\/cWn-s xU4tzi'ʦ3Lxj+n$uϝ/z -(F#J8^Ew 1_N=U8 ؎?~LQtatKՇI'˰n 5 akJp_N,FO{‘cع I*poStM fj[q舸@y|쮃Th'~7󎥨ӈŴq3|Y݁-GR09 K95zNxyP.81р@5l)8^]RZOb3Mw@p?73wiZ#{pb DB/ Oc*is<#홓 bO a|u_'ԈT,\oحc v; 䝔H4Hy6Nq0Vטeۿ "oNfad{$Ţ!zH=79hW|F}4߃RgHU`MJuU!ϤTNVͫj`ii!o9*4݌Vj-tʷb~5@5C;dì1jk6ԚlJ͂z/vWtKuꗘmQC _ߙ vDM;YOJFٳq9 d{R gѾxq *}#ISnVtw u 8Yp9BÄ>mDD!K>VP4+@` L;CwS(W\))BZ'ӌlQ)--K΃|:cł.A˓f( 94~|yQ#1Rrp&E 6$BCj >@zd.#hSwVľ-WRIݣ6^Z;slΦ`.1W˿}yˀ5dbۘ-K˃v̜_@ɩ+8fJJ)E_rpR@|mV^s տs eĺ?[΅,Lkx,gCE^*UPg㘤¡{f\: v90NQRLLQ"8(\E>WgD9MMJaM]stPtV ]zͱ9 ]Ng܃-u>n5}oZ ,pK @*ؑJ1օKÛo9%}S*Ԡ<ڷs&6HPbV-HX$YCW7RKGDHeT3(F_.sH9v,xJ(0ˌ}~WevQ/T : QgD|s^7I+8:>TC nr:<׿j@.7{d;6: A h,\pa03.ˏī]5F \!6^ѧ[2 "Ylm W&ӧiw o]'=2P="% u3J8ڕ[hܗB'@rةM  !s)fvpW-Af߾5: */O:ăT&\(ɯ{~'F-9@8jm}P(ieYv",`q_ 'Q0IaI㥲EY(L7wʮCIfv0PH}h|c\e%HH Mq X ID9BU; ۔:2Dʡ1^C)*#h .8$sUF:LwBn2O9'7}PpKWJ{.lIY XTяm?@'.(Etqy)K]CbXf@@ީ_g܍Ӂ]{\! ~>!ѷIF _]`޼B$4.k AS!v6Ҡ]%丄!C/V=R:~vl ߼#լ[g :~ kl,F4<~DŽ/V[6)_Ī 9ܜVf'eԹYL%.ߥ.EBipт "Mx:[߀պ15r' +@2[S$W0BؙSPwOWv~ hǩKA}mU 6nyRI\f'mj: ܨVk7Z tHI2 CT|1l8oCAÙs;rqP&>jGl%wX pdl-6OfAl.[wA뫟P ҇us%S#OmeUfG%Cm86IƤSvfz~aj>1Q>)"pp@ħ'^տ;`_vtrcwηZ'zsB9;^oZ^(n $xN. >q:-xG/x >*Ā /<_-x{yhO"H11_N5Ukc# lk F,?o H#vFѠ="8}iMRѷ{X?%N ҉#=1נhR ?@;35; qLb7zE4b̜eO9&o툭@ï<PېղLW!/EE2al/"{yMYE/LH)a(#(XhYppbFvPDh 3@דᎻE~ QvS:Ή)kQ:M۠ [C6QL lT!7~LZ6A~¦"N:]=:+a ,-sW5{MX_hz-W.~nZ@3vާ#i;q˔|[*p=X!]Jj%>.eOTe5Y𡵪 Kb\{83OЎs_.Mm 1֕H|nUGE{/`mRbez"%FvlfGj`0#^F'}] /UTح/bk[2F'cU1q#b+0E6CR"ZLVrd. (Hn>Ͽ,-jtI JCDg@NWңN">c>u62?&fGtyn/Z/WB&w$D}/Ռ&.(s 8@d1g"7g8z7yדEz)TGp>@) ƄJ^ٔCD:O+t9z<籼/V{mb|"1R-q YY;F& fXPo6lW 6U)M;QaDZD~PhCfkse[ ݶ}Ycvk_#QAT|ݣL^7opڣ9ٱf!FAM>H1 T*8tcNQ!٦EMʇNg0L?֜΁  Z}Y:s#OZ@F}/?REsl) ka:?Y|!nqEaOUn_+!ѵ 9Ҽ&ۈv܋rLw5ٔ zgB,@5,xx{ U ,Rv%NMn(Law!4v3\ju/f{JijU" srLNrG ܌ӷf[ZɐoDޒAL|y3-Ӻ;U,<4s"qR̤.6h_R`)eZ,kWƯX`LXYuǂG,hT߉¤c/;mx"z<  8E<&U3MX'axcً\;럟E3]L cTo5a%7|VWuއ{GAYAbd++;T98Ey-Uޏ$4Z%<8Ik`?oHrr=y+n3hB|j^JZi:H yȮzaqנl5q^Z-0A;/*3z e)ʟOxZ@Ogh*k~0*3H?ʙ u:HH9!^hlq>̓f7Qfr{fN+@1LKԞz ٚ,{2;5yK=0aѪGfB`dm-.,W[o5t%of[hkC9p1Og×+I,HD/9@5AC"W'K_9!}?t`K :2sYiNҦ'`&4oAuSq뙊73˲՘;Y$xU(R6!_=dsN7)_8+%Ʊ[EP'#\ә.Q)$7.K>u/(Nmg@2y=t h) 7f4"T!_Ԍ+nnt Їdaa!Ni0Tj>ma+oP$ϴ{*;,[GyUSqGtnfn#vʩJuI xb=龋b#dMm1}ke>R5! (||2c ;H V Ɇez% t={ ;ZSot(4<aG-5qRy٠~_= 53^n1\o42ݡvwo%3}Io%KHnUѯ(CuaO G҆*h}s Qmf<@fފQK ?/'(h$lA̓cv jh,熇fAp3f$YDI 5A־%IČ#ː㨇z_A^M;aT0?<(| Lc+WC.9A9ș7aLH"d-c`q: !Tսx7w=;FWkiotWkZգ #"KK> 0: ٛj<6ЁiD|ȅJ7G\uuD{oVbXcq#1lJSvr4`Ĵ4V~RxZQ>/WA%u,=T"90-{ ȝ (r3rS+(Zp7 D ؼq> %E2;8VY^r/:7;u4 qK/?-Ja0OC>gК.дW!%4%U|b+\b|tx|i^a˻*4 3Ւ-5 4J^'Y"ZBȀ9DjweJ6,&i-6[@!S%i*4, i2nq$r|;e?Q\?6ױ{*m0BpgVs5ߜI`EǻN[pr!p 2\--#e&{TWj!! #1\Hւ;FEkmoBoU@qP V*΂6g; پ~؛zW`%G}& j à.@r ߹\9?iXct29Lq7RU$*EuS/j57UrrRCf4hW.FKÿ0S 7^/0q\͖Xv*Bt ) <ۇA\C;h㯐o܉'U!*ʯRo_b>-:>~dJS`03!|muD$U0;Gi}VNLOpEe]ȁ|]P'>|<&SnĔsX}xXӣHK HT-]5plEVAU(k]Ra:78yILgBKۍfq= 9B\wS!żS1C@>*y|.њﶂZ"kO381FxB+:6-#PufC9~ӡMY];R{T7zM|&˭=!NUnΙy WX baoD%fHF1QχWԦy % :YIԃd<~oy$ojqV#s'[kYwfc} _%#*2HF̝j ߈m(X$@,,$ 'wS]w>iQ!oaj=ɰ΅$[3*k* Wo1[.2(AAglzhr%/no|lat n 6oK4??I,PT>S!iOvG!@ߵeM#{e# L|E5{S$rb eYHlv¤ИY*:G ^ ]YsZS,u{4yHTUP˓n4~@t"HCg &5s:$'[ӗ^uqtyy'80W>0fg2x v` fGלsc79 ]So/7]ޝ"9tH52EOHrm9)vYO 9Rl"_9\}6l>QT2{+|& JcP?HMn;>&tI8ņ!+&s# ޲mhF;Qx6An9;LTLنSƸ'GSb.$Ÿ}],KW?9\ù]:,]Z׈d<|}%.-&kNx7akyYd85gN+)ʭP}x҅0ܕ.w|EyvsdO40gVOf;ST)}P4H ]>z,\]|D`Uٚ{7PXt(p% @z_\L E :H,`d@Ymf%leC)aiH+QVƛw3:蹩<]%t? d7=t)KH:O{NEYۊZdX7G5:`n}_RnB-p'-RkV}yDNo-eb%M: jSXr7D? 5bj %31 GMe4/m L[F/<]0sa!cs\΅:jb jvS'!^L~R*6X{NED?/!WQ8ޏ= -z>>",c݈r-/&rĉd+&$?*BJκ""{#I㿶CVK}kI1Te9(⑤LHˊ9Y\/$IdB.dh|L-cw\>7 _JF)Ǘ|[t׮DJeE"< dDV4 *YUpk9{:][gQX:0%p_+*IPuj?[P ++(ܣjD@c 4qGE YM'^~gjX'8k\IWF+ t<r~kJzrTas\9 VRyYyVDhahkɔ%q(Hvd;M(jn2EY حQ‘nT^:CY~&9Vs$ԣuo_ð~Ω.DZzJ}uw'lD]m5_h# P(s&-UM.hE[ _ /DH55 9y})9#jGh|\3c-Y_~5vU\$I붼IjDT]p ?=>6P;qhFp]th# b>""U%7/ ݉lFfclEz|С;yX D&D2A.ԠkIޢu7=eYs5o=x}tD tb|YZ:p(euzAu&ɔO>ѰpAKwBʲ/,*DoY2,ԸEfA[V%PSpzank^]xȧ e0!;3sxSVȾR5i ӶG4Q E]:ٌ_uΗK.0@Sݐ&\_Nj5t+YDŽZXD.5#^x+:XÎBrt2 B17SUn̯EyDx Sߔ_Iɛ\Oos .=;dO0QxK+Xn8CJ00 wt@["MfݺH\ʍw WR gku15A]ٺ;ɩP'*NٲLZ+lP] .IJ02ٮץځ4A$נI =QEvcw"rǑ[hdQ1m) t&UMb6אvRY=88F?5X-dlϭbDzd7.]H)TBﷂ #pk`]n Oz)vFu˃WSlԖy._FmNް9~x,]{}`&rdc"}ڛ|?ޞqd78d}#ژ"1JEШlE&<_Nv5z_5>o;i!~r"mٴ??:kvp-e(1֡Q++}en {-"qo=fC˅dDH%4Vo%鱲QTz8&q2/*jXlAu'Q[Qkm-mm4 ޜ5$=K(g4N)z ]6j`2^ bjG0-K~'z| DJ7삕b8L1)x.Qo V0,b-yhr((F;Z |kMj?Zrp $ 7$ Si%9dV7] sٸJO"`hZ  ql|jk{1RʥQq=Y'Ej ''_7{P#(6/YUĊ'\vE`ƴ Ģ|(J_dk ƀi3LTKWʾvWSOu1Q>ݶ#>$UA6;;(; w3S; Pg>-'73-y K+K_Pd#HP4PL˯v ?tHS+G x[;00~I{]f]tV͓㡘ܸg*ퟦlع: 3 )S?Y~^$+惑 .^*Zg Kf)Ԣ4f8žβ-]m-u[M^' *R#Hg{%lXԔ2Sfk3U1}sgw ҟӌS9((38%ù\jU5$zIS؈=1K~;oݷT.}xyTE)nDQU,eFNU9b Gz/r ʿԢ1Zן#߭y1: "}ŒVKWäKwh<:k?p{da!9|qOYBPvݷH4K&NMřh8C)Z5z̢Q]j/Aˣ4e,/El[^BS=6~ӂE^@.cw2zc]@uM%'<9)BEMͻ0->ѠI%oP{#b[VޠJQ?r 5i>rRJ?4mk2Fwǥ&xKz&y{Rs8G ZdBel4騱/>V-UrSjθJ&u>ElW(فjR6id4V>LM*#-LTÄZ\~Nah )[ճ?Zbwnb ,MbpgӛZfmB1:39GBp?({b<#i̎6敐 _ 1V*{ٲ;Vq@D5<3R%M#X}r@I9!]$KLڭڙw8Nϣ'LP{@M䀶60Y)/.uN8jnd,oqr]̟v(nf8 halO;JϝstXc6=¬XZ uĪ_p&^FJ>)95~f9=wJjHyKPg*WwV.<'K7`Flm[75O&p=h*0?}d$MٟVCª dD5Ie6Ojڼl0rrLICOH",vuB< Y]02;WV}$: r؞5ق וBˢfh^s t|pe-k /, %/v},y&Ʊٱ.:Rv* G(Ux'mT;Ȼ0&8lHc*/ g:j ~L !N h : ^!U˒4ZߌÓYȡ\2mIQSS5hq34cT^gPi-fo_ĜW ژ0=?W^;kygA7d/=0\@OMo1;qᾕ[UGLs7I}KpSWXmHMݢC!oՎD\P5FaUid(n>"%JV&޸n<Ƈ1 mj/gk,t;C4(;\7chaItU%ol"-x#F)c0!ZByyҞ, uȿS /*&XpQ!,p'YQ8ҿ*{WtKßztU2&4HT%;B|6/UQ'>﹋7۸hU$07}娠*3<\t1ޮ1 IW*wOnD@* 9xzA =jf J!\r+ 5zlҼGPAGV7-#bBMpTNi.ޙfp \+}s%.=-!p06h(J=I1S= ߬F E=6f78 USyliΑwNEjޓg;х)P*LBI*i(Z[,8®pbQܩ爗gZ7]Y<^)o^@0C6?dz!};>2OBMZa@L\DRL  ݂LqIF=?/-s%̥K[i{B"f&k3p)u|_Wmp#pcU<9U{h@lbaK+PEׇAKc|+Đ^¦C,9/؄ӹ- 0h*Z";cm|K5 _`f% ;W$ V YrZ;Db_RXGJYJ-JeC]n)M'9?2k'H^q_y<{bWKfW%8R~KEɅ,Nɫ&>CwHqwE0| +Et9p?7@ֻrr89K/fղgVC1@r/q:t³W'p+ mŔI-X? ǣQgh4@CTxY g&Iy Kn6/u]'&vP8u`,5q˚"ppJ?p|vfUaûf̭[֞\;.{6hzSm$:#diܬȨѬ`P;E9h#uXO˫% $7J*w@4P4qʏPNtT&;Կ2`r| LhƣDadu|ܓ<ԟ}`9zu sҶ!38@Iq@8[b(_|~uӱbVB"V(χ Y|(ZMKCZ>z>.l4r;'HOp:ĝiS@]`iҭoh7Yj1%Pø'TPM%k^jgEh>7=7?ϧ~n\;~ǶJ:ӊ=짿*.@2 R U7VƬ-x_U?Әlwfʗak-9u"OJRIx];QURe={A.Guy4Kqg:S9 7c^_<&h7Uh2^:څwpqit|A5ۃ؅HB@en\]uPowN[ߓ@Evj~o:-nr{ZY:>HӆvLeD&_Z/9 y#J{ Dg XU5IUu3Ś'XDAِX`m [[5sJ;w!K<6)=³6X>Ќs\.+}O> 1Lb]Mv}Z=5ʴufKcz;-iV=i"KB("}gqbk2[)p)?}r:jL&W私e&Cxw]@Q%BbO ÓA6;AZd0C-]MF=تRԡEb3#op!yW.b&=ccDK) WT\lw8]#JJZF }Fi/sHGֿ9}Z--x_S7|ٞtǞ}_Ċ+ Kar[ɽ6 !lrʘ97$*Eꤞpo0+hrCEy ߞi TrNt;F( T~!T&/{~ylrԙ2{' #mq˿Uړ}Zv ^f0Ǟk,@!Ԟlzǖzkl_}IBN|6gd@28"1kq_W{+/Y5]^[fFsnhcᡗ3J{C JԡE#FaT@BҸ?6/Kh7X!bk ”x3}FFH Y#+U_ԪRm9ZR&ʉ{r$:I_Lb>E>pS$Ğ;kyp(cպ ‹Iٗ6gtY^QT0=۱m֢4m;2Y-u,G~NvЗWvBN*h·[P'^ o J eFFїthB*Rƞ;0ܛ9ZiܔS3bD"/a&waʙK׌s|v%(+0N~:Vpc /0ʼKX#VLsBm"Րy&}\ahV,ݭBs *MC,;{7-LJT_bUb Rt"KW(y%!o:IIk?[vsPewb1ԑ(W>Y~ |sOʋ9u6Kh:.>R0P8AvP% i}NrXtx{8Dz951%r^'TB*8GRA(zԓ!<9)EVR ၣ1˯#QT¸o_[Z%S.,[Ia1vyz>!X:MVk/dHFZꨗgZt/#͆18P̪@Cl4N,g$h^J,\KbATlK w' >F-/d 㨚pSQ6Wnj}"7PK3Tj ꪪ{زF%.6<['&jȓ$؏V:`*Jy'XEĤ\29(lM&[8o0 -Š%tP~lSX;^H3OPYiRqٱ9mgCZ(f6DN~kj *RD匆AWF\lHlRMmM:Wm jI0oUG]{y|pnV*i^#ǧGzs(z?Z'7/A}Ĺ_>o% Ab5[XIhPJyuPIf}Hj?X2_:@Dbg N개06i C%'I]:+ϣu(>:YcR;y{H/4}JS5t1m讔R!FмVxAI pkĦ"hk(ʚ׏;sexH0Rn x۶}@VMrKU%j+1;鱐Ǝi o{6%.)~n0p u:V)6bS2lTd’s̒ dW (y (޲BGݏ; Uv޽;WH& #٧944(j}~46*X6S9 /6(;?zJp֌H𻃭'M'}Jt>G{AK-:^7s$eW ĺ^%?!,J>3=g3"4zP;յC٠58ؙ^1Ta:`5+s`$ϯwgW Q=N̪?)۶tҲh09՗ָl>8PO_4I\x`{};G-<8.K 3l*Rk.9IЃp{G_#8L5iF=8b/Tq(4oGl& #b[tb5J~8xNh\ ֍8Gx]z Is+M\VKņOe 0%l{)??k%i( ?LAaǤ;DŽsFwvJVdh]I :n͕v_ l뽺j-1hu V݅LQ1 z5!?aq5JsL*Trc}6 [[ݮT6itr9Bx*u 25yu_\D 2ZeB1#os ʻO&.[|׷ڐxmL]GR-ycEU iS0Ŗf;ٿZd)!`l>g|h5Ebz&YOx7 V(__'Q WP4{Z,q8T'7:[N><یI$F*iG5Ge12-9U39 Gxh6͑7IEdGZZ_}űJ0 mf`êLA2xM#%J4q?ȖɅ62M})! wA ;Z9֗q}xLȹSU"` G0zH)=zwHs# AB/?=T#h:˙pд}Pi?Zq7C.6"Q#sYUB."OL T] 4@%fYikX'X4;sxP0̈́gpz7C ޓF+t.MȖ7GiH[hHY3D= ׆o]gmOlQ|{sqx$fL,Qk.BWsD╋ʵc^\~KYʹJi]?}?L1H&7t)ݮk3+o17s)i24J/T-Ir `c:=hۇqe7t_ʶbxd|*/4 j."Y"Pݵ[h:#D~Uv33b 6'JbG!stzGr5S6bO" b?d%v_u Z6hrK=kIZuJ wOsY" >r)qqf̔ ,'5y.q,D xs~}. ov)@{0uAGτ ne/O`3RpL3KscX>S*xrGPa!ƹ@F^pZ)_v=y׮DWWKqIz,dm#bi7z2>IύjEV?񯽀gYPY%v, 1a; |Zf0BPXEp7c`E&KqNvgCʹn)W׹J9"ysLfHob/&jp.!]$eE"|h@%nxQC *зl3i4MZDc! d!6F98+bj@Oܤjz`վ `Ù+}]L2A>;\e\5. M.?0nRCGz񥈈عA)sA}H|Z@=Y&_uMpźie%Rv-ϒIC2,P)}W,Ii* &2+ fy%W2֛ h-- PY=@tH!BFu3 bKO2cw_mmR ¥M6#@GҞcvp3:9Yý7N3/DzlF ̼^(*pؼ>"0=ю—0)a?Ku1Uwyw&>ΣM*.O}y=i6(֓$ϵ`D hAX0AβbVKFumn%M+.:@ȂHi|2 ؙ]\u=Mu%0Efj+A ާEz?˜:j"Ig~rH K^ZԣϘѣN* xT~823UZ벺Hzb 2HF5A.wk"Ďy˸"&gַ++X"jȱX[F;x F'q2QVޱ[ǩ1 UZ7cj7&'O3 p MB0i"a c8a7GVM37c$Ԝq¥v+%]CkC<$ZXƥT:dcka:\k~rFmK &Koj +*CǽH[0"!kcW,# Oʋ0Xn8Ki.%bs7Ttc,Zӳ_jTH+6y@K TU#xbJsr_G* q-PɪV} ff_F*p[Zv^6m, ^3[,-C*r |n0]78xV+sQK}.8M|WHrHD[{#KH HH5$n*|{ C e-^ܣ50>mxu4{էB"F g2؊/aaCU 0b qЇz~v pR:;*89y'./"JRPTnCD*>dT|ѱ\N l<ȥO Q̓ ;$5瑳sS(TP&sCr|/v e`uocdOR!S0͊Sr&vpl=ӡ" Ldnq$TBA?S ֓] OzN #-h{(M,kt|f|q0O¬5T]gND.~ W*q5]Gz~{% TqA1cSn PQ 2IIBAxV%/yYoSv3xec5|0_p `zJS q0/8(Vutڑ e)4@`A 0i+69~'z5Y"\Te6ERcPAdK`.PťcH 1CP4XM &Xk $O13=?nH]ϹO-=Ԩ2DJU mwMy 7i sEon2X?_7T1&,O![+1jYnp:f(=s/tC?C#e߭}oLdևȶ 9#"0̡+Zkaz7=zP3Гae`rB4*ɢguL(x肃Vnj'o eCufM/Fտc O^B @"zd:y4;'E4&6 mW@* P@: R!=gakJ-t_w5SofC#3ʠkl*h/Gt{d i.f[)c18er7 -Q;? YgRmfLv1+]An$(AXAHcg6OrW@\/wO=I6NDڕndT96AUF),?< vm%BZUK r%; 2JX8$27=dAwvj=d N T»Gf+SzCS{>eݍ>ksmQ i()>l"h ̖-q)(,\Ӎ(^Ӽo־И'ҌUf{u]h;JCo:eφ q>uR1:+Q 1l,b0r9&|14 k2Ǒ>icHOmg2aH5$0ϜqY攅BԺO4بO*O!3Yd[9sI,mP#?YN WcZ6`DX;I]d[.C<+ώ.x/!d`%Vdw;޿2`m$MA)eGqϑ@70(|5ydƺާKEXWg Zh595#Tb}-l||cJ3W6aL8 Ofjb\ ,K{ ϓ7 >:64 &b{y J>v!>QABo@*ZNnh(W)ĉh/T[&`wV ^ֱ ,.m$DKpIE(o20HDopٖ*iF \$[gdPhhܒ: Әc1| RLxbayi'm]o}&@pΦI^I<~U jSV `$>rxJSwLKPAa2N$ewlpFI4zlh2w0tczۤ-F@X{vAr]Gu|gd "LM(s-Jq6TC+1k3e܇6J,QD. h~jUKh} (yذHlL ?z;/CސZ'HMF  SpgsErUE "X]D{zS ɯdu~vzY=L=|pH!R(c{l%K2$R$EX006`tuye%v5[W1w^c*"v5Υ3Xݡ u 8+*.rz&ef3G'O@6Rf XƓ l~V:LiK̼QTGHqաFAQZV"O"zIע;Z;kn?h@,u*'O.>򯅨^glE`6{\ȱvPb[p(g?=qCdrl/62Wk3_\g{Rs XaoI L_^זҩa|uޚ\$ܮCjCp}rbgH8>iW~npI7)3lOZ uᲦLH\~/nbAcT8ɏ~A "ALX`u4Xn%YjAgg6y>2\b<1sEMӄ>FꦆH?_Kd9o_lR5'{CL5~/OGaX ~^ɨ$U 5;g[M-.pޠ[& H(ôIyr9>#ETQD$5cX@زn϶L8? R'GG7"&\ܚJBLi `<08VhrnApc{W^mw/ 2ȝ"vzۭcI 6o";XW5$U\i6+8ֵ6o g>~tM5JqH=l4~_,Z(B&c2!L{U.V@ٺT|}D3OQwx~C`m;3P\]A8a{\~v&BcXhw>։^31D[sX2IEW,i99Ϥ#EA697ŶzM(8)ZCD' V*Zd"YQyϥ'P#ms2CT\XжVvnwwRJY]]Oرu.Pڧ ªuW5#5߸J%~!Œ(/m^Ccx&>;Fkՠak(M9FXNz*eX1hV/l9&ڃě@Ir# ir6~KCXɓ'􇏕)fLٕ!FՑ+KM$_*zՠ҉ fNYdPnvfةyK7îƒZIfː]ȫݸ۠ĕ,?:Ug3vf>A0ۜ^)P 3, د ̵1^s vAe`^|@Ri/tp㪩,oNbhyO'w#,vXTLw.HY_:?{(oqo,Kr+cƢVcFV?%liHSW&i\K 1e rxmVD;[^W$Q4 8F !o(Cₙa9OTO3mUq0m$ XEQ~;q_RIAB&%BQ%tao34Y_:͂3:`6ԣ1FG<^lį/n0$( x3 1~_꓎YR@pRDQ`G'{HL$R+*G1ʙFg1Ô!< $]l8nϲ(ô*زds">&I.8Y&1I!h.icB ޴Obz[*5o4'toO*K)At'ڜ)s@Ib$d"%.5aEe2. vMS7:D\ܨbJ,6F~|mOԙBPL2쾊5[̥lR嚛9pqS DʴWVC:r*f? ۛW"/&]1F yM<  EN K:z]ooWog3t8h{= ;[z\[Έy1\X+ϫ[qP.;8srnSanhh}SOkJ ҤR24tRG"fYvOxzxh<+pۧO;(O,G-mG<5$Y4 9e` : cSG&nK\[~27R{dvQTNogE8JU6[٬Wdkub=#O Sz(&\< }1‹ *eAY~ڡ2yg@6Mu(!h `sNV*ReTSR-:(*ͤsQ*\Њ9)C>Gm(8_|h"w/ҝVG\Jeq4ytl8|$;`XI r"[Nmo}Rs?F͊"_4`zʡ35>4~EJ$}TTDW{ۜx͊D'Zu֮(x\>z6՘bU2\!Hgxh/ Ŷsnj;0& Tw)%Bp 'NSoUvXYۘ4Ikes? &2uh(n2ZgB%btRTLK"Ei~bij>R7흠Apg?H MceLȶ6˽ML QK?iA 9 ("ZϨ#=yFݮp+joCZ9w}yAUU)p .1z8B,_ YRmokE:!}HVgJu Z ~^5PƲTO҅5PԴ>e KSlCJ)s!y:aPtx&<~iݽhw\a_Bm&\@~ޮ$djݾϲyl%\'wI4)ec†"fjL3ɠKb߃_x՞.MY6hizimfANTEh܍-coUs$Reˈ=]+/ȮY BD"x?Sq>RŷTœPl*y[Ș!OWr˝HSǥai#Ky^{-i! AOi*Y\ճ-YP -l,'ط8C78Q/*n!J?$}/n˄M<ԟ9e٣nw1DKG LxRY]8qZ(D%jA:f.=uƭ"[ #UI]|btR&TdM?;fzMgIU{"2H}]+@_)B:yOxWߣsm 튅T=C˒ RFlhDAv^j ^EF"ߛ֘l8v|*tUp̌EEbmG`ߧ xSB%,!{]&rV-.>Bd/ DX5MsZ;[) 8džzNҋ3m˲ ^U9"@.s鐟Jv) kn/a9xSfg2wIyγ|o _~| 3Siv4OKsQ nY)/ajڷV/:!"i [x$g{53r/ JK, ߶t#҇O{jru_;~9?$;)1FE*+T{C B+42LG-Wl#7Yu9\uJ{c85k?s4RUx@5Ok26rbZ8Bn+Zi4T"is" dk3݈R`YgUX=Ȱ!FK'E coI4wcJ 'U" +TH# "}w"@+Cʑޠa;\-yHҽlqj@GJ3 5Ma&SV(3hrhY<Ч;$RTSp)fQ'ht xv=+}?pCÃ@rqDQ|1 !;lS6#@$V=뭷nZ|]` ziq,- ߼! זd8~n'Hi}oWol)(~zkwr ,94`}- 9R2&]\Qo%X1_Dr1'n.(i!VjKyP v t6K-]9LB] ] dS/Oaat /yq'wf}x]JţqI{*rDk@'g?T61q ]:rqXv\ )S原1?T:* 0+023 R 0ƊN3W3o❶Nfy h[*?e>LCǝ<*]ܱBk4eӦ5,2_܈v0ƇU8c\D[%/rDW.W{H*E[k,(>R BAr=ys19l $x.Ll82xQ)y'L!?tASs4__ 20f %T1Xky;^n-k#SK>7Rg$OXg&Z. qc<('U)cb9b ?vj!rzsY(!đL #6U'@x_~WްY"?d¢gdeKQ9 Pes ԱmBV38`~)[7"C#)=kd5I(&0m'G$IH,+r1[@O b > w o>->$%4"IX'mZ YvIsD,| ӒwL8[r/p`- i <("N3?Az7?ÃxKr-W9.itl>Ob+?L3̳=A3ЄʾdC+Q$CTNʊ~>&z-q RSC94F+6~"=PO+I"[j쬀6){siRx8PZԔ/8GQv`7#1SxO=^!/fhQ'27Y~:+P5Nu/V}.4임9fR 6ߟ:AE{y_}L,滫(yzlW ÝȪ6,;g؉|?*0{ib쭆n]f%9B S6zSh6ŊKanW9,"/4N(n1(<DVTœ5(Z;%|8@Ѯ*g"Pa&K*HQS X(`,y%_$FDžD)iqMn2tIJ,QvdQc5`ߡ7y6ZIP7l^PQFSW[@,*rM1!xcWp/,}jT.2egҞD]YWځ}ɒt=/ nFk@N{'@/;-j 6r19cMcEw#vHAID`0F!X(K[ sA4v!'@3Sm̘R1CԾ`u&h6%8Y᧬jǩ`u Հ70I HNբc: JP3d˄G.p{rxiv @;D\W,^W0w)a:&Ri?)fMF448$I(}7\ 7 &O1S:NQG"]ާQY)763K:" h*z`"rK^[v敫=ٻuS TUz;" QGYDcQ։nh̡jR]KD^1i0|)t}ʍ>6K:3L e yɎxB s)VV:Xͫb˜D;,(isrRώ̄2|C,iEbM- =oKmoq`oi1݇T\"E}`kgq41m-ʖxdnSС¼=X4y-?UŮu~8x"'9 Pt(o3쭼m->Jb]~79QgɯNa(0ذ`BqAk|9%~Dܝq{-(2lZ#R)fӍq牶Bžz.'|U.or?X&:DTzZSaIoȦmOb~*Y[we71Tw&Կpz >qOM 8RǂDyX4 m1$`[G#zCw Vnwf׋tB33||D Wdxb&WVY*LLCrHfL qӸ{fXi, : )su{k곦>"l;Ry_{ޘsv/˟DӖN<)eȪ}(U,lv^\sSO >4*҉Xɔ& GE͝ 1Nȯ..3YDkmpvmڽvex : [' \͝\ERCTD{˝ d:E[륕3Q% AKɧڭb68$ùMXҗ_1r{`} ט9=r+Z{H7cl 6sJ0utI dݧ|2ʑGo̺҃Cg5ٟ" Z6<| ؁"lnB*Dd'IJ Mfh)h=dVWwKcN.֯X41?>iJ ULcAR]tyRUw=ڻrp)b-7䃅ys1N)_]Mho?\{kȬa"sÆ)[bC(vwE bS |1Y5o|wn!0]: K8qnk?yǝO!L!h Cr 0Nr*7JG@ ^a,Zvau[ N R.KZ44B0is#NMW`Pn) yΆ[)c[ W1ʞuNmWAjwN F8ɆU?၌Nf9QqڪQUc)V-aZcjI8I{Ѧ.A_Ŭ uuØL3,.r0Tx:;ډb6!̍au*աGF"J@o4~mP [GF;A[UIUJDͼ&V;)sJl & #Zj-sO&  ;hC>i1Qv@{Y%<&Q9̑ێ-ZR[5P;ǃH]Ԫ⠽,ϯl 1n`N.  =OʹuEvC{oqaC+$q#UP3A[*8ܴVm*HZ/ fLđdo Df (xaJEYvcM"E@ĽW_D-Tm2"ưSqY!r) Mj 8nR~3 |Gr Gt\ғՒ-|;aa&_֒-2 j#)7:ȩNq]F^[47Ey^cʎ@\QŭX':wkg-."~Q]R  oMٔ,2A$sp 4JFfvl?#uO@ ]j1N<ᙏ۞6qvw2Jvb#6r5HMҫg>Ux06D{~⟶eWrڦv-6ju2-apthyn4t&CRXg*?Xy.ȉ=1}̼FoE_|-Zd61k[G+rJw4א!$|/Nr`$Le5gӊcdHiRue$+ r~v\$AODDp4_y i}:ZЃsrEδ -p37~QcI7rά-^ͯi\W1N=J0ZJ/.B%c1Gf,6|>PlC7-!ê-3Kߓ\0tx|H@>t0wgE!$~|A> S[Wܭ'eSa3+hU|T#M9yY egy@:k&=YɓmާzU\Hu+:^k1ecCkKeBϚkz2ԴP v[#9~eC\dznM)6a;0 wuX4 !0h"_L&6iEn F X ] p5vǍsO -KrDvd)ܝĽOx kju jUKW%H~ en s|,BdDU0d"r.D q'O)7\[7;NvOnUnK(51fh[@zkI@#ܯ4MB^,AraU84u%sAE~7Р鵞&L1Shĭ(NT셃#Bŵ^bea֒|D2/S}ǁ4|(SBp2 A1HR`'Z4iXّa |q7ZCp.>9c-^,{'6dL@5x7@Md0(C"٤'(՟%˧;>FWaI4S۴6C1EW[s?}* ;QXfQ夼])Bl"K=m]͏'4uZvw}j)i2J|JItwԺFVOPvpm3kqzN_R$Trr1]c-3%!\{L(X7`k-"b:Ί4/Rs\[hAZnSk.eڕ X岷y!_|X(!)*ي!6Uq= ӕQОͥ5LTohYxW 9>j^wz$o`d^XXzN=:0(58).(o6_^_$ii݋}D{ 6у2rKGa4Id3Y\wj|7z3TU"=. /&pt=d?Ɉ3<ke{%VYVv+=z}X>!2/,5>g\Cn^*ugi#܃"KRx"rؔM627e請2\1wh}:@59K,Er*+@eN'[)'-"MM*ȏWFT|rlP9HfT((HY*g O21MZK ~j}_Nؚ\6rVgMUzXZ;y9v۩R?oQP30k$l$jPC+mPk0]\FFIIȶu平Qp?Qi=\!ĕoWI.c`eGbblTdO}VKO2}!` u[/ϴ7\?_uw,Db'&-Վ!.a:A-Jo =X A|YaD}1!᳑BqgB/Z|e mnI3@W45-9/ڕ U ˚0 .‘Rp`ƍpZUX:ңz x((CrmѻY̦η]Z "@0)6GPzPMykwPMN't+AT].Ϥf $uEhXR۬ K](J·"9>Us"(ɺPAY!e6f{1i`z 0pȱ >5$Y+0 A9J_DD G"ݴaw :0ĭ'z莑 ^^s@iCy@\)IЯ`aQLի=G5q|xEP`9%/ )Wt@9s^R6i*yxGb+EC-(ε{`6람YB>EH=#^!%NϕFKg N2Xq]QrJ|$->[ݵP } ![u"uȼ!BMzkrC:Oa8~EFѵ7ikHt_ک<;L@R H"S&/Hh{K4iXU<Ր Qgxk{y3&仭PmoD,٠_DuLKnCL9~V}(Ӊz >sCpD03?weuNp& bEPuD–Y ;O2J{A3͛+7irX?zڝR?Wx|ԣYUX%gxhx_kOl7^Mw:A20MXg`PZK80dpk. aE|d\r(- _h-'=ʓUjHzyq]"X --$ Q8XABjw8#y"ACYkfTvkޱ|G?1N/kг]~<$sJ޾Z:Ŗj.$Mk=q8s '3KHl,LlEw?>:o8S.B^W*{ xĻhE.06ܿ=pý )Rj̭OZd 3ѠӦ*7XSZwĤңmJY^9ʁ(lwf֛Ӛ v1;UsǍ+F 4HFx&=^=0/щ},ijU-yDwr̎FЩH\flU<!q2xA!Px4S;WL"W>Yi,B1K%t~UvP=P?f#Rc7ے|`p(W4&2{0/*vb~۵Sw|XClP^JGͧD&H~$^N ە8JbōʓtSϟ^gRWsl}[D㘘x[MS5E%9rwΊUe01 ߑe{&xB>J {W$dcW~4 X  d1ӫwFkcd"3IIiY:*m9o|VC`p5ᗫPO%ħcٚȫ]h'ʭ]cB&Z|^3BS6Tɝ,Fݠ&D+ѝ&̜K{801t=ԕD;? #H9_2΅+s9*gqQ2\k]q+hM ݏҸg&Pex.o>qx -q}S*)]{%^P5xԿ4C:= j1 %҃r?V)tq;^}jˠiqdecF"Q?6ݳ26|!]IY7$~ɴ"RXo {AE> bv'dRYDZ攛ŰM!(=X#@$ӱL, J~Auk2K#ah)Xm('(N) Qz3pfzT )P p0.ߝ燜OMѲ>h'ӢXRK  filbу1cɐmr8&~6BKU`DT'C8DLj xpXtm|~1g&\cs/JV Xs sPK"D7 ͸!Jc魁`&TWLH W Mܬ A-<5xdDoPxl['5 (o8W s(zKN[t5z`sjZ/'*NFnM7RiYI#=Z,_)tg`ZF]VED#y ʸ)w]%iͪܙ;1!-C?|dyd:YΦkOGx}S` ù Lx 6(p*N$uZčF2›٢nfy$5R7LYgke|_A;a<G?bUt@#I.X:1n##"W|̴Ví0Xi,Xr*N-%#kpz`@|@@wj^C=9f ~C5Ӷop[4F:]+N-W10忍{1 `jKE.uD\1Y1u~tPə09"Ye~E߰9!`S;B]`@hP.Vjh>e #Ro|[tM dtG ios7Aͳ!6 L᫘b; xO:sNMg+|U,K}+czbf@Nȁ JLNZo΄7cmgW@}IlL j'y<1GZKV6~ ,LvZqJ؞83(= H}.uDe2o=oT쬵$vZX:6|-H25X!}6Vu!zD7P Q/Dwy 6 npH؂sef2uzhӾY|"{%s$AǞ̇pq崷G,xFCW @7 QNvOQ]NB1`8TCpE {l!6ǐvFswOR b_0ʹݩ!9&ȁ=tFP& gC^aJ>ؼhey?LS@ ~<d> q 'Ğ/*slҧonn5-Liũd54ǬQΟ'F 2_]B\k*H*ZLjF;pN{pt8]e Y%6LYȈ\!dȯ`fېv~*Pܒ; @trCl3$LU: , N:lcf%bq3 dU=rFj֋QLwؘz>ݟwOtZM TRFa 79*A)4;+V1+&w5sTO% -㉞]- jlV{̕SJ gK6Y99;@rdV*mr &Ql/ ݌;s..Z[8x\lK֌0$ NK'!(Az#%f8]+֘&8Q_״Lcru:?ةEϏ =c@Ptǒc'd po3;PggƹS)>C05 fR=Yr'/+[o6E#kIWr ū L y hw8E㽯bOtY-O(.Z'VO$4q?}dL1-&$]գNӕ×g[4R&1 ,Vڼh=Hғw!w+8/*XեC&Mp/TGWa\<};Qe)XԖSgD3nkl=>ȠHⶊQ[lrw8MJ$8zkHM2{_] 2r5H4akB/r:.)%&] ֨_ E4p`4>Fگ% cI!Fj⺗| `OPO4ÁqrN"9sK(oh<*w[uv6;| 8ybq[ x=b֬XBÝߊMC|zˣ(]?= f\Vvo<9gx{>n̩_aA'DIWߓs9),QgK_@c3l"r 9$[2gf#ϿDrk{Bj}0Qg%s>$Zz+O!k96uPw]ʅ6Ii?>P@N}_̀L] bц/yx1|#ADjB1eN0 ƗXz/,^!z?߄7,fBGγu2-8KzQq)sumiS$o˲ΨF=Z6/ "MES%k:h 2`aKQJ~Wwu6s׉ |W#9v"m5=ZgnlViK%_z2:L5y$a,T!rV'r(+jDP@pbk!傊KT!y{%[g  iL5VySLyϊ7#ʑXdr9$+Hs}ɪU/l)lMDg'Clrbrn&-;;СC,)m1P,/"ہ5 jwSf![䱿$\"Vog}R4LaT)4xPn.XA!rl:9e2WvN A=?)!{: @ϋa[Gk#[wm3Cg9$c,c_TyCF`zTIs6LVBZhJqkJS}YWVuw^t7LuxM%^'ZE#Xvj֙ϛzpXazUZX1L{ .):HeN|xhE .Tڙ~-ַ9'B=WhBƔEGH}YS-/lЇ/ H.U%mU $}@m~Qa ``w f\u+)d kYL9'G%Ov=-bxU٨Nm N% ؗʸYoһw85MH7OOB#_c|QKp2#o9lO)Ib ɦr4NL<3` p5 1r pۥQ'-Zs>S|0oKXΌ,"F(cTRc{ dU}'oKb/b(Itf,ۉ(Zmp]tPM\4>)6t~J7nGFid@MMm0]e&00UȐfjhkX,,ojqQ4Y~*I_F+@S [;#L8&B[x :6Ȳ2'cTN7KJ>3PxS=i2>ٻj{s3̴yoͨ2K ^0qGr~sq𘩪wjx | Kdk' 73|X:n(A+Ȧc5 낋t{ODOT 8q7?#j+aՕkcJvf7 $pj-^9<@')?"H3H~h. k};!t>8dfĢq ƽwN*1 зjO,enJyr/R1!'3W$NoE$ USGa4mPYa qa=5d7g=ZAc ;*pܒ5,qۦOHibk zh!$q$PSFފf L=OJu]/=YJٲ8gi6f.bK6%s`>Z:(.mKm*` n]YD?\mrk-P',YfrV=kP+쇳ZԮ&..G?h >8z^Z,Ֆ)+]7 A}֥Lf&5F`6:4e 㶇(,!K%z< #"gkWO(#@fזuL]*'8CPdz_7 ; ]:53jdf_zE ?Xx=sx6ooq*0qG^4/ Z'zvc'E3TjʺzX{rgֈVf TT/x:W@-x#A4QXI*Q6Ėjy星 VLh)I7 ggv!җdZ 1Gt4؉2tWׅ53訜( 9K>:F=üp4nRHjL&rUPgzNV-N u$.dZMܑmݝ-g87T*$rBڑLڭ}7>b#`am4,YY+E*Sϑ()IW2@ `*I>hS_Qp%`}s xK=L.A' x|FGւ@5 -sE+ٍ̄  s af+AVCD?ж_W~Hd!.o(ڋ&CE~43ua8'ع/FeVRJ;q7t=Btmg&ʜe7JSq5!Uk j~Hu4e ݋Yo `Rۼ͹^H% nH,#`;>;nT_Cbz1i Q(P5qC:TO]|_[؁ -O>Pnw kd(ly/}HA70Z%/ݹΤ'[Ɖ:zTs^ uH\* zu2YKl(*;9 y_,E:Ԟ>^fɤ#:v?6gC>nw Q."!؎2[;ShCAC=|`Zo8c~7Gֺ;I߃K^i;kmd MB&f5qW!r5Kp[hs rCw/MY\9 -don${nAVmoJi~U@lvnq(xt-ްՁ~2ߴywuz%BFԂL$4gh'kD*s\sH8aR^ib$I*{jZ~\/NU pS\]z\9UUگWT/b6D ppk,,Z G̗l5j%b ao^)j&doe,wi -$cO[{(,DT=TFL|A"B1ol CU\zTP }&k鴤|m-G4Cp=*vxe?׆LBҤw+~rb{FclZ~IlNO"G!'d&$7T MsHQ.P$@7MWMX07&[RPy;¿6Y5a$u9کDmh_}"14Noxr BSMl<=VH;+qc;NVL_Xmއw30MRB gkHCoe 0\:~#kXZc%xL55[nxԁ^.|gOt;rPFe3 1^x{(S>qvS}NB o0@a>`dbM"=<eړn9v蛎e?S9=<[N)~mMD T7nm!Qd/#(R{~;^lc.'!ԛ=Yo߻5i8r;($RYsR[WrG;mOv8_Qaʫ!Q`~e5d?n2Gl$[Ip|+;'hleQ61]!)na\0Us"Ll3̵y'J,auqpiZE萌DGªf`-WYCxuKP{ NS+yaLp_,=4QO$qy霅vT  ['Z=[f7ǽ9O>({_Ot <9!bPu71_3⽶Y|H!nWufd"q iSե4V_Uudgi˸YwWUa 0\kFGb4cp_T27ǹܳ. Τqk !Bv/ʉf0}tv82葐9+ŕ~į ֧_nS,xSPnPhޯT(yiZ!򹜔8DB\a .};/h.{0fV4 >S9Ĕi ZUE S X~O͖~pPex稵XڥKk#=@ݟrekY2FR YZԾY/"Ċ[InPt&Hssb:l)sGWiPҴLK5s"62/H>DLΙ{n{S7N- ɀ\P68NOp쬾nFmh{LSÙļOEKdDs6/G9[_Q\ Co۽AA ΍n pijLNF]ܤw9M& 2\[.y*wXf=Rh[Č Nuv1g-~0јG_z %|OE #n71~Ζՙ]d[n&Sftd-EW]שTtNQڻQ ru(W7o$:.Z5UAY`D'8b9 /3_.fBv;4SP_ɿ|F -f U Mzj@զ~C'}Oj>m=r62jglWaNn2#o;Wg H\_3C{uq$'1`XE1;춅WA'2N]QȤvG`s]S5qQ(nqV-gft+DuhLW^E&MJ]s>uc a_uD!jog 'P\R:G?cۥcV,Ng #/ro3۞J_Y~X%d*#xd:Zbk \=:n`b#CIsLLexkWPm z>\Q]k9VԺF]=Nrg=Z fUhEcjDgbI_ :LD-щ}9掛8!2Ă/PݩRjw@`[IC_UaBe|@zU@D""6gMgV<|h&l:s|}X|fYS3wyOF3J{M8Q۞-oFGԣ.[!>4~pİu\˝R N\m";x@ -t|dh`VUvv`TIpP ?h4^VOgMŞ kXo&d9)[g~&6Te'u|7Xuuy~G^ r|+%M ?O#RJ}hΎ7OsBEG۟B7**eKXƃDLG|5}!&J)lNafxңDdr~afO~c-ץNG1Tg).;z^Л[)LSt A=OP~>X5G)P,DH5:xF_ѱwԕ zn1ؽ;9X-V *oLaxB.4^( ܀jn.ۦot"5Ռ *5..]#ML mb:d~*YQI((,A p35./_]as6J#w"Y82۶4M&jfRA"reWU].hDMoQZܫ\;AH9fyWHuvC8$C6>z<6ę\tD~ikL =HqpŌ y}/I2y-E~a!IqMUw3P#D*Ys\*)-Y,3RL4EImA}fd {KZz5ثev@Kbm0aV2[=ҧ;-Q<3tQ|"j4 Qշ lP>4=,kg CV zP!WOQ$),s[ZCe,TP*'iz'`o>}DM5-x^sQOFcI&vLKM:/8yZ<1'Flvy1Y9cYJy#qE&kǟP/E/ɪ!pjdk+p NF9\G;E.1MB)ف PCpy⮘8f?*C+(@ʬ,;PЍ]ey7)*5z1{n1}ۍݾ/3T 6kCvUiۖXhl9] rAr8|,v|љe@y?rν+q+]atMߠ<5;>F1K(QbACE ֆJFBLPE.r+ң#uL-?/Cۗ(t`_uk;B\I?ױgAU3 1͙ D,߾myR:$K,PtC4LA'WBugy[K"/1t1{Zᕫm HӱDB tMc~6z5g{) 5x`VJO0Pv6Ǔ6C`Ԧu%y5IcB%Wn7߽?l;(ͺ%.gkk:RiŴ8SS܃osmp nsrCesгR"WL#Mg197S{¢2-xGȠ_e@[q6GTPqW$I 2 VtuCMU w˔oT-/KVJn0miFO3"dq,7KR 0[߯=NLN{'!"]P$_S.TF&Ƥ ~!C`ḋfyB?ǰq&y D&~lŇ~D?YzWp nvC@&*l _"CpS{81&V(5aPƣdֳ7ae0(;5eh׫eӸm3{,.K9 hq8#3 !I-K{(֑A:rHD :ހ xm?rleJ=ZŴ̰1J._ GY"ciQ| '=U;&7|nβ!{h(7[.ʽfKPˎQ Pp+Sr%!&3k9HZae5&?B2SܸASE˿|5YO@R ]\M$`!e|JN2AX&v煯-!G[:AEG\^liqg$4XվUU_#^:Q;\/C׀,һ=~Nl1g` !h_83 >qRК/m<, EKy9|̘ m*0ڵk1G~z<ߙ0B94a)aOWHwK3o2`afKo56f6w3zxߨ,~'p/Nɰ =j0(k/ւfkg9SSy1;<. _G7{27#C|4U4,tOPJ+H.2ŇGư~nnF U95^`۰Asд@%ӷ8PZ/,Ϸ.ֆL- 9\VdmTj'^C#2R7˰(A^f7f=.ׯ愥;E>6E=\)Ko\6[|4J Жu!>.8Nh,B(6M{2rBV+/: ŭSʟbEh,j(6kjކe{[D|kF c-VԜզz9$©W;ɴl:w\p}9@ @ZTL L+GaeҞ jL(O"]gZ)DZU0Cat !5czE4aj6rڍ밭pw~lt~"u}%m]0fXrmR s# %aTy6SԷS _s\̀T>\CJݳ pka#׵нGߨa U$Se#u]45{myTXǷ%ī+6+"3DX#+K*E8Th rk""5)Me5:㠢OAx^nqP h2.j:MK`fր-Q^nrWŠK%Lɓ~ v"91EC@xlNH8Ҿw=i`|ZQ<0<U?3K"\Gcg$J~BF`SWt^7?RJ74Sd7ꆠa z'nPR5]aX̽z;ՅbT,|%d$c[FHҢb"JtΖRĠx 4UgoQGwX޶%&'Ƙ%ZtnuH)5~fv_?owWZv1$mK}{%!TUF#%YSl,_ayNHrBCYRBՅa4yi" L #yToPw-uE,8hi IP_uNe$C m^ f0,I@ap%0oE_2$6ngiܮFpp&zrf!"_y ?)FuFW؈ЅHiUa=N Ğ'>K"x@ $z~VRT9 WbHA1Fq*#hy%aDLB㦣_,H p GAu p_JYC~cO mԔrD`& M$1}]pj͖vA_:ZUNk73Q m< "LbrCp zR >pn0*nxf>Q+#t9P:"mIAnjQ>[sźFqt-!HMTam!4Nj QIEtnǭGQņ*QQ"~Vg3P|]r;#g)|sHLJ5-\q,&!6~^J<,0vC5k @0B-wYe`?㨑2Ak穟&+V4 aħfYV7/#ݮ%<͑=9WqTfȫN6"1by M_ȷl$hU? |X&g'AhkMy׽2hv",>%.Kw,BPYpl-›I7 &Me3Zǎ^[NF;L\ 2/f7Ąk,ƓމD༿ pqJis;gO-d(")L\νqRv)R0"x8njmQm㈹=X,+h1lyuQ Dק$`'L#0=uGa9,ʧw;vQqoLG'^k=+-ɸV#LÒ]{p,*9?5J)y-wru\}gkmfe+X=E cY%(b1M}u6 8k~YZKg!WZ/DRbpy.8'[Y㒝qC./ =p?ڴ " yvkSu8_t!|\agx]usͥ"OTH3N[ aߗH#)/!Ba>V(?D[A3汎n Bc R|ub 8Vk-Qz=2l+ '8 T\1]ȇ拦NtfmGvM9|+)ے&)xKK[);sh3\ff>D,}ȴh~o&{wu[Pٳt#f:5/%o3e"S9G-^u^Ů@gIQHg/ԪܩZ8LhӜ$^t(l?c9oM4=%eW*  f^YtpCWs`+d_S̛r߃` sWgF<w7s8՝:_뼐`Gve ?1 8E$C_#&OX9yd~?Xz̋ =b" ޤGz<>,Q5>BMPMyN9a2"e m`YTD}p"CFI;:ьi3PF_Qr9*ǯꗽm$?vq+#6~xGB,7mLPȃH}Af/F& 1Sօ]xrfC`6!!\t"98E0P=RH~-$+Xe-[@kO滑3ڝ 1*OdɤyGEQea5gsUe00Dw{B{nnؾ@?󋮑REO5ܥg"^w?BS}qGmdL,Gx4z ?!RŖ/\ގ|2$^j;V4j0;v+R&qߗo?d<}auhh`%U ^B&MKE 3_Xr\B-sKJ\}m*I[#ٯfܫ8AL.~5U#"@PrtN3iAr@=f:T(یҪ\ k{Ye R/c4?Xx];\I$irvAGw$ςLe 1[~T9Cg :vpr/ 'E4啽 0C1C:wy*9GeG~Q2]`ڔzJ-3GWgygDDW^/ T2eU)KTM(V{=pĭٰ YRvpkGUA0634@=Fcvm%?n5v(L,6xf0$|GbE$JChUSPt׈}i.a/( 6sX}cG)ij%*,Dݐ1Ĵĵȣa:vj(gz#ĮXZ3"258«QHShVn-l+TOP%՘8V銾rF#ᙹ+KATcmA^AGo28qӵG~`|zK sU'2%&S"'0 2R4c&b;u ߘ(z V^ʇŅZ44FS}^%"?[Z乧 Hi- r0WVv&눛Cr~OrCa&E>\xf5HΆu6rQ>hG2ѣC_}E>pa{ޗA{%+ e; Z[}rb9׋9l&Ձ@m4~eGK;?8WSk@il [|4f~a0N-B2Xriَhu)V?`;9; 5x㎾1|& o>5feTGrޤf,LJP]~> d CZ8O=y蕏 vY#&qPJAJqDGkΉ,OR@hȊPF^\DO/QhoN8jJM/Beً,퇪MxQozLvoo~I!olؤF1P, %Ss}RsZQaۍV\qcǝеP>\Ϛ?=,'+Y]h")|Ccr4b)I3)'8'C}/k98ĂUA&X_:=Üj4~Лrg*xsZ2oeèi>m #dw_})vsj `$79M }۔Vb#;W^&mpI,'Nj"${bP9ٰ)Ffq (2rTPmjpȌrX`U} -կcBj\S&F/BqdY;;/(&SQr:%a-q[x΋q$ߦmW IVkk M;P:Mˏ]ܮ߸3RM-)Օ4oҾTռuyJl'w͝v1q\-Ao(ڊ5e*tR*B;Cf{rXȄ3\t 3qNj4{U%%P\h>ޚΘ@EdX^/ 瘮Zl8}ojB| kl+?|PYsxČj@a*e}R&ܺx܆ ^g٢dY풶Qm\4 V) Al*C7δ I_w x'3l4n򊨈`a]1ghup3R]-1]7:w~le'I?Ư)mM 9 M2mxe CTpBD^¢0b:V+Jʍ".s}4poC\.i7zJH,-r F$@V =j0;F\Г͓Ku_݈}r1edsHnXPYFxCQGfhqf&8l-Xزcn)fpY*2xXER|zV?';8'p4{|tc65OUa?ZJQeUyO)*+SH;(\tx5#`|+2N3b @ϡm; ^2Æ,N'w*xii.W.Ypn7 J*)htB㝾UCV aWt;u6@Z H ͌rHAETaQ]٠P9ZQUrUTsi69|xdY5#{NƳd'8??1 ʍGadE!~v$?SQ?O7O~{$l<~IJ?GbYO7#VX5&,O 34{' IjѨb7Aj!PJGϺ8{P_ 8.KZ$* DJmY8DS.S8?AofN1Br&i(oaYQHSް4e G8.EZ.[7=hRE^RL(v´B3elyw,,>bRA**O(7&ߕVΉY'ǚ!ؘٞZF:\s,Ҕ+$o+qn,ٺ4 (6_J"Ŷתq@{(3re3JK#z[~hxmS]W:P O//R,%Df*.qZ a"! WOCH43G 7M_6u?rP"zH{T Kmta>>O%IR=H*/,1l8TUq)Z>?EI] N WD!XO%z)^VU\Zb9+No*a2~1'xKqr~H"$PrB/ c"~k"{)3ԕOte#MT,}әߕٗ0ZU/+(ts*_fu,GM`HnȨN[ÉN^ztyMҌ%{кQԷZ${ʯu}gKo;DP[2SR=vл/X'2V ?vhA7_L +fD"dx m&FWeV-m)~ePܞ [\ܜ.hΊGa&l/vTrN%T8)Ц}KЌ54l\j(bA$}x5(J+r_s; B븣RZȎ7J"PRaz~!4 ,)CPóXيd ]6"Z P%T,~N+!ed@Ḳћ"tٍ6O_dE>EzU.rn_][ՐFpG;Mr=LKO>V3Zaw~O7vNm1RZ9grVDUJY!pվEbpKSԈ-T޲9HVRMUI;ok>E1?oH5iafJ= 8vm6bڽ*L}O^I5:nؠna)Sr$^Co]`-L2^x軐e!HX+[2r\;h Pt}Op~h'rnD6zb_M2D 7u黊:tc:}V "6w?Q`!s# NIZX.%܌75 w5 tԢ-R}AKFZ K Y]q4c攗A&Clux<{%5b<-x\ |-`/ab"Ss_ng0?+^. NahCɷܣMX@2<[=S ] H|'sHvjUԠyR T RtpNŐs/\ Ow&9=f˫@IIzCC XGpd*}uVsI;Q7xbpd, ˇCH;j/]3Dq[kerGqL"\m7 ?f`Պ2?Ѷf#7 o͕~W1X*+T/ʤaDuc<`Q=@gaNtMOQ~q5]jm\ۜ,k39:(."i@ "^V҈YJ1xgaƖ5gUG CeA!vq$ĶsD |fDD@$a哢4N{>O#;?cHS-tM xHejGH<2|l"-vK*MpF 7f L3N# `2%$ \ s1I. UNSZ(Q)]Epf0rYSG~~)HpˆJlk EycDEfsQy{Ptk*(e0S5LEFQ69YUn1gSMw$= -=edGsR 1w7Ho?p_P\SzC^j/)Jz1^4yeC0 Ca&Ń|wsa#T0 |LYߓG@\IZX.,Ĩfx_nRV~l6"= w D5AIE$ͧ ^\?U{2de>1[콛)U@ݜ+~?+cPEL_N\>z?JU"'GhҒH(=,`px^筽PH- Jf Bô-zzF/-tfbېQtt畈cyږ0/П~+.WG2 eؚTCZ١r>Rr 0Hp*lPUe`]:F:`nBFzA Ua#>U-׌דz'N^cqGcy ,JpԒ BCa W3*]/_NHA6+lG@Fg?\6 ܑ!&6[ Eq-W[hoM7 X<=f3cM~XuC{ ` UYp\pj -"T$Xp:ERoȫ2T)_g7,!͹Ur_ă40L5Es$KH  $-:/f_!#. !"޳ɱ1Z'Nҥ 0;I[ꮨ'*-taW(el jԈJr.%kXIM %2눧$"xQTO6SM~Plޱ +³#V!e4wCIE*нf ]R0^/q;ד|1ݜAE4TZԚt+ׯh>_vm#Put9(JĚ|7wS"s`uFNe$mq^Q7M;}nkaaeN;ZFqsR"T}(r,ͻG jM3?|tTfI‘DaE/5t { 6SΉMJӧ`ww%&l[l4NY+JخOx|؞uwCa4=&I7B,@Z6QDZ6 ܴG_yNjZʄ>"*tnhen )E_*yQct,fP#CS"Tjl}^e?hT;&F@AE DgѪwG/lj>&@:װSOajÿD869!'n^ȑOxdho@*&^e ٌ 3|5{lo * Oeag@\-ȱ 4W\\@M{^n|]AtvzZ1W]1(둣Pk4*.n(PfWs&oT݃i4uU/;q]w C<הHYL/_{Qevr#Y>Qݦ\ɪ-V3퓲 f /x߶WYS:##|$z,y]hܖ&UKoc?vxncR7ћ( ׃aox-oRxBL 9!\#^YgIDIxpɔ1'ZJ񚇡D9`Q0Ũc{L:%f.!ԥgZN"BTTevE4r]-Ԡ`A;=$ltI(Z/^cnfw!w&$} w`g_ꚷ1ŷbdlҺ<;:޷`ˀD2T^ʨF[`[҅3qam1'WH cuĉgvV.t*p\b xb5qf;0,!|z=^Lcا1,,'n` 3r(%lFl,CQ^*'jz[Z`m&~:vǓ7-AB^zDL>(,,P"I.cށJdh /g.dѬ:~KxZ,/: cGǢb"΃ы w.PoC}]Vc譤Ji@vڵolX_tc6kIa `Oj~mpɒSNBE Y(f)tJٹ&j5B:]5nO>j;pSU 2DX, <٦<ZplK!ܘ 꿴VI\a׳ss@_-B(s!]*@~:-hqt3 [|SOGU R ,a?Z]nx8eSoLZ`oU81O0kH7)w" ,54{P? -lOJXL;T(,M116'꬘hո ] &2Aioo !8ʿlR_98S;pt'e9m{xຑs|7pc Oa9*Gr65sZ++:Ej/&YH7Ҁ`k6"𻂒tsGS sP:UeӶ" u, / >REC5שu{ԫ/k~Yp"!]ZPJO6Pk5N ! YʒH;"@yp̵͸r7νa.ݲ')^_3/l=v9^oy%`ZBef9":McN0 ր q'ԱJz\ f,7j& uRPj2gOF>bzV,@ TEuV2aSNO'f_NT]*[rH"Ij_}r* yur% dOf$nVܺz_%|.LT2$4=8F!!ijq?vDU<lObsd'I[*+3r./lƹFq3r[Ş! cIpfYd\T-[ŀ?:8 9z~bYrF(X |ك={7nh!{ekӜ5_ZALmUgE"j>Bsdy`a/dT ՝SZc# rs7ρ \+~u7p`a_Tcy:{@މl#5K}ORXv<IH~@ʅ_r,`9/: *G?O%}իVgg {}Z~h M ڞ;֖‡]Hp}3>/"7e%_gVq@}YZ_)[Uj iq~鮎@;*B$>)F(5d!>>Bꨗɽz`RZa`oJG8u|L'!se2w5uHڢP9A$h(x<3S>H ^)awY͗Dr Dt*Ik%禆D`JT2K``_Xpʰ) Z6ƧGHw2K$:bkE?>HXےC>kˎw&!ŀj-ˁE!kT Ypl\BAy^~;QsK7~2ꝨHC<|<8b[y dt[RR=jZ0QpwiCmJCyJK|Iw*“E Q脴(7O:Pƫ=[jkm?ݾH}tR6 HS dcB<{oRD# ӈ3nU t;g5Bc\&錧K@guFrRH]‡h|,P\~ok!a+뿍Oq.7!ά&*`EsKm$ 'Ba ah =\ʾR(_QXnՉggJ8 L&wGZV:eʵ':hsFS&KԛaT:5²#J%J6y8珼 m1oQX8[_-(=JHq@Ev([0<O1:(KG^\I^ۻڬL3Pɸ )Ck-4m믌!EhD#1ЫƖu.};vse֘fQܹ/UNqI7vR>8"}zdK3<=T^y7hj;Bd9ʌVPڰu꾂jp=H1,)tW{Et{c]4mB R@ `[VN͏QS+/FvO\9"?T})؁Yh&u+du;lP(4^'VZ#*1aU[7v:=f%ҨpU"&#)7P&ÛlX#U{HǷU F {z2ݳyTzG86{j;g*!)͵$@3 ڴ)JQg n_3 ?ټL}?4%&1_cwYkV'x؟ p25mr@UMkPCTf?NyL\ 6A&:yCi 6KMFC-q3N B\biI;b^[[c2`-`4g:JXZYUCX=,|,7O4JoO)[1r=܎\̺ZWj@##fSu$Fxs28k+ {"d o5]գp; QkDiڌ$ Lm,^L5+R' ȃqEwVĝ5+׭W$QfwL+8@v/#`PYd_嬱e$\Nț8M΀Mx[{tQbe7ȇk9fRzVx9X)F0EXjngROxOЯQu;PIf;&b"ClZWa Ɵd,X%5g8:{1^66CPqԚ#lP4LKͻpHNg<2%2+sFtJ`&`/9$r}1[\MDU: BmriNAR;LHذyj_wNX\~( ]9tdKj]h,uT!MjdcOSey nh߾# Ef2@͵";|ekc\6~bFʗ2 =ʒҼfZx#SU#;7 ]kI$a/@cP@Ē\)շ{3qڈIDc͎FxzF WO6"Kr8~RXD8]9X<3]eK1κ˧H6u$Ǝf'o Gџ(M)8ҠRnkA(6@`eSYdi"}"vw"Clg wm"d].ܠ-Nl2"d# kH,~qǔWw&k>T+Ϫ?iw_;qЩ-aHˎ;+FjۣxȤ;?1D#fE;Y az0{Zb:UX݋n\"feKÎeM{og[),B.@:ڝ`@F9M#H_jfSońBfeh{!aZͅS`ejMP#ǝT<7\jF({[hW)BIohU!|'Ȥ'R#Z0~4uT9 >?B~\ptyãbd Y?3c a޴8c,SBZѠ /$\0&G6l޼• ؁<*XF\7$u'zv[ x›u, 0vM?vti Q7KEUD=X.خI^O|8~<6 i(D ŠڊS0C[n>~WjC/^TOq*u"w׺Sڸ!Ą$lV7#}$|]yzZ5?"ho*;y/v =z#mʔ^h56# @$j"4L#LW4GR$.܅{eM@B`^L~n jR pPs=sP),~o w(? *9);饴S}iMHa-}!hbÞ/SsԨ \1:y~e:9I$95 Tt b[,'\ 'O-e$7ҭkvKx#_'R(po vHb_DWDnnn78OV͎cj>ET_*ǮC?TO2a`?v+BTo0fA7P`tSEhP?¤7 8pn!| BA*z  ̩2J͒PѼ02ヤgdn Mb$lҾjLj\5rA5:!ЭywBBzP: j0N=3IeD5=}"&RlEWl*ޟ ȗ?}z>d4u[ln_0sb6LV훝B1;0pq'vZi+n-!3v||Fd<HlplnT> _o 媳>$~1è0DK/TM8T.w;lմqC7Ņ䕑6?\ LUSRNp!Axqz^YS=BOsk%%6W9jݑjzsfG$P_MDT7U}9BN\ݭo%.P͎Ô~~E|wa(/CA7i< L->C.ݕ.bJE9a\'pI#Ǟ$-HL&o' fIYhÇ^@x3E-*a^Yl8M\_BdI؜'i:\ĻCNt%if}uVoP6VɪL8l1Eqǜc8B3hN)~Z/i!7)-N^NpnY7F ޮ% {_#\e|Yt[w\WzMnACd0DI/ApdHj{aL$[y;BI{Zf0&Ȧɗ&{_jo0lhrV>hDslnߧ+5k9:`ᬃtS#Eg7-SF' tB[`f%_/Ӌ}O7sݷ!?޶7`r =(hmZVY@E.R05%pPeۘ騗ӳb TwÝXVAoc(enwȬ,Il28n=4 d YJiƄfuo Y7!QP,_v鸂LO\!S5GVqȠ% 7''h,lX칋ߺMR+Ӣ/^ӃA3蘩䐉f4"<je  ΣAB)EFh8s(@ A4ܴZWdbwC X $)U=|ԱφGiv=_V1MBXW5!O+oEͿ*x!w{ u,U1yaU5 g{ჷDdw@>x'cԌ s5+.jH~8q{}|hhLTDe{D9%V(ܕDOX,Yzy aEl_U])"Q,pOz}?瞸;e4c2ƸZ{ojM&zŀv*Iu?6ih ޣh+*}y p~nq_ V%Hm r7X[x@qXw5Hha[EM!7u#z5]jO`^*t˟]h7*mke|OߏЀ&Ej֛Jgv癒ҥt'x5mg8a(q0V9졁q!^Т=OW(?YM[ >7}pkn m<5] NGQX82t_@9;?cǕ`LZ9gCeuE2b8c=T^ $ UX]@E){G)eymӀG/j{"/^xVKec1䠗Bdf[KJŌ]8+f} -B0W25: QVFQ/9Ծ|xR8%|dTW@1-E%ӿϩ[;KbMC9Àu|'彯bJF+l" ©Ј7rjf!wg! $om%[t}Q=, U(@ ~T^D{!|pGYAKw]qZ[l{gm`hIK5EuCK08Ti?p _嚶^0қd%|t^q*Bx 3Y`=/+lL֍MW6^YEhXsxTpnckXyR6uxw| 뭗ÁYD'w+.J>(jY TmF nzO9--yYih.ᮘE;Th. qn$&UZQ`7{}񋎼$r'[J :$ŊgW ]“TX DsE!ֿ wd' i-۶)xKr5 y"?svVˢܺ_#cW+9m)Q}["vV׾ `#͜mHt0|10U2d>U*$‘){PabIL=FӺj@]x;.RZȂC_x@ _&Aɻ߆163v<잆`K# 9:֍/&a p~z |o?P~ jͿHX+Bs!0t/4#q''"oֈўK<$aj UC5H,U@ԓ(T}RՙdEޢ}uC""`gt:$D/Y", mHDm|vB븕XFWڍT껃(̃?1:6˓;0̑ 1D#O׽֎ ]CKeձ? `Ā#qDvnO|eҶy=5.H g}Sa㑛f)~2B d␉ݷb_ 9ah0:&5D3RϱsSܴf 0ԃ[h227^w.sSJD9H6t\.s񵹆JɋGE>pgBN{y#Vc$p 2EE5؇hX|8Io`2#S{y*/E ,mߵmie8J;8ՇH w$FaxW_̯ XtRO}zR:`CC/:[S+䃵g} 0!ΫY@na%D3o7TXx±pjfD]X9F=AKя?H3k3^\{5{|W pV Ġy-EZ:9vlr h|#L)o/S}0՞{=dYQ>׺khcVdjS,Tȃ Ɨqʘ}?t5]e!!1i)=T$n{t8;9,0g11uu tGxO' 6>;Lɝ萪dQߩ@C}deHM=񦁆;D74AcJqt@`@?w ΂Ə(l|?\B*"] 6Bq";ujHZfPIJI?Z69+KQ({Ms 3,0ox~YrǷPh 89K{^S.6F^LQ4:W4*S,ywo\2 8>X!Ma 'cl>61#K"[\F* <$VRZd)bJzԥ[e|m3A{2]RW:ADT@6}YŻQFAI/Aۧ sERs;ieJ~䳩VԶ<*>9[,DSX랱T.za6B-69kj"#ؠHpE ^/~U Uu-, pԅ';f80i|2l-~%^?*}j3Fm~=aݫ7/~A?;->PJb+ל8Ŗ6\%q֦8Bϡsz̋A`A!8r^:čcLVqv0R8ULCv@θ7]SP35ΟI̖JIuvIPR_hE܈ypOWu]q e׎ο6РKK1T㮈uxYKK`dC Ude9/^Z0zzJp_/vfGEx1UYa[5 4@ G9aSSFM__j#V+='yqfL<`Y}^ v:r;Jh=*GJfHȴ.W֣&.o G$\kKG.$Z 9}9+f"D1HD-5 .h向!f> >ek%WIaoԋJ,̋8F'E@Ag-ɴPE~a]3Zg,ۼɫa7-N!q3hNy:ɘVX`%#&F˝ j)99ށ.o<|wtkR{4^MM[iiacIkP|qn$9yNٍլk->6A@0}lZ)Zixe7t )>vҸPˊo5pZk('d[B]T(Ƃҷ Yo [UH=vnֈP3K4!~$MK;Ch:dBk|S?{dBsfaׯhs/ 'G9W[̢%q>KCGDH _ibpp!!'gx1#!]&+[dn0f6W3sӶ .Us7*L%w`uNA,? Y1۠wh<Wz(ZYX_2$Hڠ1H|NOݑ:X[Վa5F1+)>2칦jsGQOY3!o9I%k'⌴LwL{qލvc]58*7BX׮qgfIeΨjB9.Wq@1SZN;tn59MkE?ۄ-̒ >ooN85eY*\G96b4R$LGp5b .q79vNi-1$fU)?Wt.hNGףwEC|!9*߶<A'q;  @< mdǝ-t9FM?}:ًP6 bʲJ۬R$/mA H/*iCZg^;fb‚W*kH:9W J}82m:t)B=?OGwܝ~k7mNFi`43+(KW:Au@ϛK["thwS6J*2wXH?S|(20L=Gl_;MV.:rpRFot8nxP ޕkn178b" 7_ ʂV:\9vIqA$SM0rɕY=dLQ&}d(TYavff/}t`\YA0I2-%]"cKMĀ}ZAwv8%dU~~D)f_o1}Gbg<]&0z/$פx=J]4wңOm2呀O ^ ]%x_WzrZch=#6Z>-M}xxcxIС :5IGc_IP(̠'VL{HT7"k݇#M5LZh`ܬF/Ŵ@^d<1?[ KLψfDΘ,Bl{~8µOqܳyNߍh?y zBr{gj)ܮy7+/>,wkGd+)ڡb2GaA3{b?&4j)9XM.K4,s'c$>獿ձ;;c/<`3&L`˭!P]$R$zjYą̯&<`ztpT9u!l c$AtК mT|> Yc>&G7qXNL(Z*ҙTFֈZ۳:2e9qZLD<<ՃD0 dzdH}NH&ȵg@Uϙ>$Eh![7h1= [^^gX`wߚ-Eu9GRX(*MK̻3ս$'A= tb#)OE-?:%&,'g]U-R[%/s /~Z1!+u^ j$?QsOKe0Q,\H58 M?0d9YnQ$ATȃSx0iWhCil`(u q`%;BMF^unyGniڴʻE&qdx$UlΗ3i^V 'Q&Qy-m!XEuJ^ϭޖW.oXh!)r{YI{# G/y6յftW]@O Vjжw&CDfXBX_K l;rӣ}! [)0RYr&x>A Z };.\М<uV^q~B椝Fă_bGPxE w8\AuVT>Lq%z6 ^K\}U hq#"OPG-=vJ# ±[I69 bc2/ė8MS֝"3GL{*] ~ߘ( " `y51}H#+Ybpo/8֐_ɭ#[hma$lF2mvK$I~,E)EqSR% V@+cG͟ʥws94QwCn/vb- z`WȐtF FrsU\:ZVI;.CP mЀUCUF%l*~K9GV(Bs^DAHQ?\UcxBTzsoN'K@ⳊVǰ[WUjöx>@҄U=V?Z m'X`[nx ʎgϑcRF[h` C.orfqHb78NjS6Ő"݊QvU0?p򍹔3&#L }f<\X'1v'|QOӶs L k"e݊ba6. bXʲZjvxet1񖭈OgvGa(BPwdx ؑkH%cxRڡ;k,eo@wotN3 vr)02:= Kmzsڍ=&ޅ"m2rbLîWN7V4Ԍw[,Оg.\OiONd0G2F;mOYNC<@TsT@ں;ÎA4tvFܥHK:rpR48"fB=:/A3|T#J9뱮y8V\2X4b)2wn%:?WקIjm OPh"KOɽ'-Oh;@Oܥ٢kD['ʐh>/mB~סqԓG[od:|$lBU4# }?]`KrqqJF T|xZ)Be*-)S;)G>oWuEJhYE##ʝK2ʑg@=6Ơ%[:IS_& ֡}ͱ]0#Rvxs`~,nIB?z a[tNXXda2^6cN뙬X瀐JEao%L y/|5:V ŏqBQ˧&Ց>O,1Ҩj\v?,ZLG {k]a]">6lHS۾XKc?YZ}i]awi* z<[iq˄ֲrhbիqFP 8q,ͳW`1슚S V͝EhAc u7ZAI*/^G{0^:аJbJ"^Wib 1~7?αFH6t  ۃ^ !kkLvU 2&aM|By?Z-B"08= v?ͪ%!vvCmΕWastu>eX-DЙv@?MrEdmQ*I{->.Qp\t ah&-)clnWש_yYx~V@rM "w#~1.DTyD<z|1'AP&`)jtp/ʸ pI7[]WOs'Ӈ)L5bW,QCK\k롧kuPB=ʴ+V8tfѤk,?r<50jhE6z:\ݖDyhȬ^$&BaKQR v:Byr$̨q~|oS#-et-@6aPԷ1[=Oa/ 3qm Oa@)eT-S<8.dľPc,`vP?UcWC{segӣi~k1|E ӫ2dmڱ>Ѫ8fBRjv|BA-8 M)^RnjRX'uAr^T5t ;ոe%WK)k*/=5qOM RIUge}E#X!ղsQ3 8F1]v&xhkD>Y#6aڈ=>賄0Bf}c1自hT\t|H 6;0%:'x^rZDX`n5^aj5uL{x4vkRGVVuBU;s, M|k(ɹ:T3Û}'雤ڈNN]q~ |uDVh*N+0tN`*$ L7X66%F%ڿ=+Po3-jrX(wKJZun ? ~Ή7̿W.X`;3 c0+LdV1k[63<| c}?Yi_-^Pm( Z\hLC|%$qL"[Uˮ>,G!,p$A.Cbk$Y!EW]2@>G0Wf{:_f e)α \y!qC^Sq3#f~, !.RƱOt+$&ztN /F1^NCb ښ{BnPUq| G4.L xKAz 7e ^Il}r/dcAeHiC>v:}ڔ}jmYLuNȐyʰڤJ51O+'a=EtbP͙C8rDğsГ'l)nU7o#5+Gy!shd ՘ oM x"0iɑH~ ._*F ~mMNjZwk*^KW B1,s<^47 lo ])/* !(JE4%5?iĒ+xS:1F":ff4%n:xwo#TI0-hS ~CrjE;teVӜV"o]oл %Xm~/9 a{dSt&6b,7F}տ'Q1xA JeKczYM8[S ]q<- U[PLlx$wϝ*Qr^0^tS9EzS0 榆dY;-OOU-&0\P_UA_`IrSy Tu&z:S1,tQ%Jìm\FaO rOͫ2VK@`Ul܂`gB%>q56茀3j9\X)Z ĺˆSO2!eܞki/;N IrX{hDĉhJRWؗvh@-*Xh:na!6VT.gY#OOДݢޞ~E]}e Ph~Q^.? NFU>2x[te7Ie}HZօL[ 2(! I+XW%Y/A_ir~ۖ_~04pm_ *ӕ 0766  X ;%x+O}ͼ8aܫX|m!]h5v)/rW3Bup14zDv51X4n7=_ ˸ۚRsoun!">]IGxGQl[ts#ur[C] E[f|VmUVlz'.2Ə"* +hG.1J!ؽ/od~apXTvE){jhق-UWy=֞ atF \ʬ?iͶ1@^>_:UZ{xБ( 4`/ bH0qP}h=ٽP"KG:W `1ll'Z?Ż;d񆆔&mGT_ 82O$r2TψpDrT D rX9vגPTOv`ԥM`J܎\Wڕ"r= W3YlTRgYEL_3$N>=?(bY⼼*e)W ]A!({-@ vrMUoV%x}-bش(4 Du5cxIo-Nݢ& > +Ԓ7)՟wlV߰6J:dJL:[S c8%)O v^T;>|cvIiEř\)Ŵ^;aK[KmzĻU Hqޮ-yM FRkzH[m+`Zg4.Pu1G6DgI#72Tڬ` &嫯 w5G k/%xɆHx$\JwQ%=so>w(Ϡ;᫚go~@Gpj] `Mb7RhH?9mh;|մa ʒmҔs8"~YDV=^7-Frj3FPajEѿ?^EKy]o#QJze?e3|~9 4"M -.ӷЁn?ca͂ TjWL,%?7(JgLz{\s!l:iKݸ-8^4^ş֘a|ң6 Rzl=/l*衅Y}@e!;hOG 15u$*CCe[J?O68n[ؓ(@-לj5hNU$B#AEZy ̝Mș(y\tB*dYy?:ďa&%sdV@\k]*}"5i[S\N"*}VGR/:Ϣ(a;ȔSoڨ|jk/on~[-y7Q㾿iE"#yGlL{}'Ք|;&*C;Mof٬tS,m| Vt$_L%r[ꤤ~[qB&"iS#C* IuXf0]( }g8L.FMqJآnNAXep~*-gf tә5$ vDSi.|ϱX:ߛoFx\ɹSҀ,N5E|&OH!@wɂi,=+%Z.?! ԒoK5B\h1N*_94RQ]hMN[E(EFUB`-c4HVޚ/W;^gzY6ۑ:GSө^{+W</j ;0ʹ GhW%؃ DSy 02E>GvGa]ݬ4ST7? QEtC{t($')l9 ɱ9e-О T%Jfp^AJ5'_гѡ9UKryIjmf"`2,} 0CWA,`dTUt{K:Iz-ăcgڧk'MLI,E\+u TYEXr q -\c16kkTR=MF88SRnl6m#˗/vfH͟ JO &?XYq(,]n+mR,O-Nm A ;U/v^= |1L!a3]ok'[엊` |)%";(oe%m8i8Xmq8Iq<>|X2~zܶ17ybk(2RMCg$vdcU.m99?B[b@PWL.v.*\:ƫڌ*TrX){"^CV"vo`z|EXRcD04u9C+]U/8%"QY޼ԏzA)H$++oсM"w|en锈J -ǡ NX\v=+y `1˰ؿHhU=K;,VD1ApSƚ|?J,+!"C}5ܽ7M;9<>$?.#Tݳu-2Bjg[Nы\ 491|Lz^ǟT >gK}BpG*%X6-S/EI=@'~(63i8wXl~c+- gS7!)%,('&*;hiڋMPc{6 &-*նAh^S &&|ˇ:pR 'jŪ&,7k }5. H}x+ UWs@km:yƭD-ݟ)_5 }>ep#n!VrFi5>#otXp.`I[GKڧϰ.L|olU7U rInѧ+[;YnN(ʦ C^S%ggbka2wVus%Gqa(fatИkհLQ:fe -VO(XcNL*!_ d V.lpP5k}ѵotvB4ss@3Y"kfA(&P*LnMLg7;!ȂISnIGĩ2C6WfaHTz_f^˘uАdlHX Tyb2$Y߽9͒hTH3|]W@К8J+b4_JVTBߐB \l}O\wD3 14pK9t A'zyCˈ'o8Ϙ0qX 撁ID&޸S>8Q:1V&w%8?JA#KEl"VA{F {'T`LgswP TJA jщJ%Y{[0>Po$x97>6ڎ9A-Wi,o5$ߡ=B`'qn 'KDv Mu3~#[bGf>:F>LHА @po*x lFW]YwX9W# , U 27Y!y~KܥrT@))|gN$Q;㓴!#e7lw'\N<^#+>;qKQ{繨._ *̯C Op dr`_8^`)pF:` 3aLB"G  Oz+nt|)uSqd t۽5G0;/r!8p i68%UQ-_f}ލi9> T%y6%ȖHf|%i\Pt=)5J,$R x]s$Gx \06υ}e4e~s|&ւtT"u_ng"nfʒBZiK/1;^!iH{"!VRuC/A:>p,#IZzSluQM4 tqԠRXA=2GD#5:V& Kv_$1>.q^0_;J-uhl 6dgpy"5v>7sۊ:e.Is2W*nvک!rw@rQL@筓u+4Ab.UCrIx) 3x6?}!Uz%Q } !*B>d m;Vrw5ˆу\ftJtJ6KK^LТ p8Wj'W܇T3lRH M`(Pޱ`Am]H ˾e/;sߕdC¨$-`jX*;cOZx 72zZ_ k{;543Y֩ZTrL ;[(JÉ%}mZ7Fi^yh نl}"HĈ&YP{_V׺ zW>lD׆|d4?[*d rB}jaBo D{:N(1O~{8ے*fBu^ͷY?D?^UU;lUFr"5g@-Gi>IJP)鎬8YF4TXmY*Ťo5<$+ggD6 ^߭ !Vb27ܯ +Zb$kDMA ;.1n-)ѣ]3o) &HE=ŝ#Y WwG0 K)b:jGarnO&Ծҵ ߶cv#-tWшZ*,1m4C423KrB]r:bDlIp4xfAy`ܬdwWnW"*y >H2{n`ϣ,QWpuX}M[9T\~D Q>@,L7_&2w(rȹ=6L$(m/p"7~~jKOJإK*g9Œk}5۟VzȤJ $LJړw -c[x:/Pe6Ƙ;?yH*7xQ-\`ڔ>ٵ",OWe4oTI$4R<>/,+GՃ~R6ż}bZ7#huo#nKܒ!g6d+%%TMaXdG?y JJA-sx/ĉz9Ԟ$P?݅|۶hВ]ea}3XeA heUJq4h{+J~ruъ_Rk-;'kW'lpcCS6on_C5bEոe_9xkMHl|F &0r~t{х $-?촐Xј1CY]FT!5j(a sh9x&\X?W:MĶCH!eXHTJ@a]K7v.i\'xkgqm/9^ב΂l KvKO|+0(4J᛹stj]geO#Upf@i9&аu+)8n;OSO`a8+t#8n&}&#k k!1DqhCՀDy?η\)467 }9`xūHA͹C^ MjTJ]OkyD9˄J$mޥ#h}2Ral ˠh1T!J˝fTN S!2JD,=)[Cd=D]P߰];d!$uYƫSkG`1Q(1no#ZbGLJ'j<`xk-C %7p=ОJƬ_,urVrqo( >Cv#DDdܦY50#gGOtqQv0j?&5,E8pi R TQ"p9uĴ?an'X 'q PFA=yA,G O=o,Xkk$dJL`S d,O|Nig-5L>kLӧx1`(d"5;zwz{~Lcp5ZH5h矑`E 0bEPy:fl=)xbM$Zo%?a$%6~Lp_=vi&oG*Y`)O#WP9L$k("z'ijA'D(GE/X-mȊӪ~zGOd;F:a)x /4x\j4sTx +XrƟ&9|.= nK|b>7ijnEX~{͟u:'oµ)hUFj?S%~ay/ǩtpy81xkhEj2o[whn`|xUXZ̿+$̏x-J_l. e kAXKZ+3LVV LrwjOvAMeI!2 26M"Tv.ux:8PhXbN`54Wc`o" 5/[ꓘ`.AR&8Okq=GaĚJhP'O]cMD=xm ~/Ee,I>|넼k>j%m:z9^Z T*w̯b\/urMb„fЃ ˛ɑ.ъ/mtG' k"h7rrF#|[c "l7 \SB NP +kg2gU*I>u^ؽKj[rؚTҫk\}~uO0lx,=Aڅ4:^E'oGPQ ?"4O )u;N=lL,U_r+|z%&pi2QO^dOq(L5c'lB(ޓ/by%,4.D"-h4Вc7Z2%WsJ˼&ߚ!!L)oa"U+67j&DQɠߌCLNGBAK,h?k0 0W#Dȕ>J)3ܥLҍ^ȥV=gU4z.&QK\pXqYRůb0G頾=]^g)1tA3))%uc)!0MF5^ !{8 YmǛu\oƪ SZ#E{礹6+Dg2ӞwҾ;Wn&<_D UWu]~NL 2WxY}M7Vg{F'l  0Xٚ˴UЭxMϔ(j\hIw.dw* kEZ;M"vJ`ur掗ZSޕo"w]@ (rr0H&.&uwI~ eS踫lq)F! 2M[F0$C2TKDw|}o},TLaF p0Uz%A$Ir3nhPտO.׉8l$Lb%ِV2Uv6;ѴƬoA׿3θrbEzRQq&+~ Qƺ ƈaôԋ=%0"uֺ vU/{~+nUEQ_y:erh&>&LՁCZ Oܰ'Ԁ6bWC>[_ Jz. hl%$4u;: __[0Q-nuZn@ncEhFZ/Y0ә*$UH\@?=<}9 FܸhwہY)/F =_ct5;ix_=_MEॱT/0z2cbQמ%{-! 괃<'㵯ҜPwzD;/4u4G(&U;MUZaA,nyZ!ūs'[ACG!2 1vd(oF. +C"̊-U?IA5ߏ-)FTHIp3ΌN~=mƣ4e充r/6iH.I]6P 4_*p}O=U2\޼d2?=lHU'y0_wE a|0AziN^sP9pHBa_JSc C UVsAO^@+垮I 1W\֮O:pE􏂆yOeVy)ֹRl>#I^b7} g-nyܫA|=6.UtB%a|0PV%G lȶctU1UMt {\+ԀM22Lv*r"nMHn `T-Rvg0 Cᓈ_;]R/|O__kfVz~7`О2i?/eMW%G!EL[Iw{AoLew> A0qGk˰q5$qD߄tBG/{hGޡ?iλu'DHDB{HSxr)~F 3ܲTNy8mwf&(TNW w>Iʫe?j(oIlaHA2tuY ՟@?4VT$+6%*Ъw-Oq1 ^K~[~qp^<}; +FhI#\˭HnU۔TPqUZ%=XB(R4=Ͷ2ǜ -aꠏH?Ϟ{F(p߀*-\ %8gS- .dB@ULSqlEzP7>a5Mb@3s)A̠0*P (yh?Q3$<]sž}%H&%Y:92!cάB ǹN[N-츿DSTyfvUhwℭ.CMJ(=۸-~(>ʄC,˿̗e]mN#a; u( &== *mSJ6}%IQ!7h&2!_ķ--|L-m_ b\ ǹCLp?Ti)G"nwMhm}tK"I_A?m͔-&fSOmb;Ib2M0-/ΔѶ+3aɃapD^O/8z0?mwbpm>`x1ޮcȗsEBk+XwDL5)=)8A*eggQieې28qӵ<&1{kmV\ʸ*XαVt  1Ó5h[a|V3چ>CNkΛ.D? ef`J-f`BR `6Rw]#s⎭T}eZLrNYmgkvY2Tk\dY c2ۍ>yeDV#DrG57MC"G84wTR]%cy^P=˞d硘4eҙF:y>բubzj^ДVGjv=5@)o!$2f^.Me0jw+$lBR,r/i~WT7I 1F}Ҁ83 37]N;^цSǴnfWgha>C$XLOu);&za44ÁV`kE'l)j!g09!V@$lN*|o6HgpQ ar^gVW =X.**f/Q?70IݥxnBqB7 b6=WFgބOIn.>}+Ma! FC} k[dY LHzy@pP*NK{KTew:I-(ɹΎ>0^"vģ@Ws f { Oe҇dڜ,}JR͗. Yu:*DvxO\ŝ;8}^lSs3*cC|(}'n]h"dxWXGovSTK x1,2ڣbml)!(,ľTƣ`̔$#EE(-{=~َGXz_5?Q#(`f\ɁIEh\gnj^'y1ԓ~m w3L|tym0Wjg~9RDl7Q0EՍ8b%- K/vF 7@oEgp:Aߵhq J= >Eϫ:ZDMHQh˛{]X)um%耒D"G pL>!]ptD^R<}~3\U@ĒHޯj\.A[z}xTp!69#Rd~]^A}E+H` o իtC.+ HQx&rWR%,=uX  oW?-{vN`QۯtSw/?˩Z} `e>6L pYk^he/=cac׶̇<0zN}}ܐmǞM.t2na6M+n} jUlHno@ljVE^.( 9d(uF7nn&i|t%T$=v;Inys#Rpf#R;ڪw q^ |USB O]i-yP;'.sUR#mxӧ Qb<>0 YZphangorn/data/Laurasiatherian.RData0000644000176200001440000003716413475602650017053 0ustar liggesusers7zXZi"6!X>8])TW"nRʟX\qjnj-&;"֬S[ׂnzKfeNy$_U1[|(i;ҡ 9{ʥ KR1vfv!oXڝ[^#~4D*MT}Oh۳Աnw9y-OoTRxdr{CCex{P‰W3 9N9sDN'ZHIjmܞ:pqASӥNůK:c. Q);'y x`g7tMHkrLF0QLϒBVA/߈D/z~Ad^Pq ИCOx8}B<8[s:HT%s3u:3]E͵e~&6xQ +H]Ԍt~[2П??oZhzLv7ˉ56t ѻ[]Oqd^3۟N*W0Eh&IĂcWtAeی ^ #4``G06komBa ~1^ `?#)z/cΐ?~0)XWbTt˧R3!k@i<of=aRUo?g>Θ` b+r ele=(IfWնN̈́.zDI'@C9yB? BMzA:H> d({_y<د'Hlfߔy/H Yη F%f"͏:qS(+OD@"P0R:":N.n~o09TR@eY;~K9U{Mh[=xH|^غ|9d BZ=|v 摤^"Yp G˘(66y"76k{7J:w|iXݢ7g3Tm$HG*keޗ7qкU0HC OU(k<Q\ ]&GDPNQ^xz՘ ?mǨ(8\/+vUP Pf@CSK|P=^ UM.LVW^peOՕ]v#mDCsB7nnOjc{;B(1#pigHo#xAwX ɹNLk{I/Q?}@E ýn!Kp-ܯ;eM9T"zctCD8 (V|jR,ĵl.Ly ]R~QaU 4VswcEVo+>݁Yz}L:p?l뢸uy 8 ?ѥPh JTL &DUL\_rAZU (URG\P^5m<9U!k/z+( ${_LD;D:l*Z\5֐$@eUl 6E,50UBfCaQ_`sbIRL'FLHǢ~#ϪkڜܑE\ FPx(6EhkaBK&zl|wut7vH%&^i#4msJ'myFm=$U"<ǻ-OTEg֞{EmcpOa#GW[4EF=8WvXU"C") Gq4:0Ay].RUs?~Z37ߞtyio4 q[?9k7z,6`myMa[Dш}Ii{frGA ĆLkZၸg( ]74jWX|F-YoX_t_jG"_*@t AZZI׿T+sw_I I=yKs*eݟ2OATr^{ڲW~E * @h,Vbɷ^uеYvW"}Іύw3A0V*žȯF ! .*{ID HtJKw)FPMX7_4C\bE{+p{[ChĎr "Ky 0ACA- }O fhl ̮^>Q|"rqS %yA$̸/M&As-[M2Y!-$dKb!v׼,e%.hhn~r Eh{뷵dmҾ="5SQfy2A@oWvtϠ]j~m%$p gH /$^Y^ BCE9IgL!(qa,p34ck!n44d9}F92g"6LF498"kdLSAqL,g{nVAl ^GpY@|^e32⫫V=?9Rz 7IqO) Ʈ,؄\ Bτkսp1i:ATQS wIijZ'tq)j`A`.2sFvݔJ?*Q 0"TR8}Acs #E:`שX,Eaa !݅*0LȻ1cjuYS o'vAIɾj7u*NM-%Q1%5*"2dIK~oi.afձɫKn8ƍGL=l@;:a$ؼF.3C6k˺}I@!7,$Pս"FAWbxz攒4ɐ%8;iT7;V? &7bb q4ܬfmdg^sIDCx!읹`S@YtmKg-u2mS 6Kwv;>,ZrdE2މG\.Ȇ\̇•X簔6F.zٕk`uY):O!Dҟ5\ F_J` g3xVZW󥅅>0ڢ?na2 ^|j>+ަ"o]D$Ul U^Vn?![ʚʤFˣט6,EőN?&щf?} s KZ;8VZmo1k㎋ѣ  1ֱ&)#wxnpNwi"Ɖ]>.j0I4旙O<-#om2^G-k ank4=NXȇK[7Re;,٧w.lݎ[ž.M7c]:+9e^8QN`b_0ʶ _/XU֝f .LKtC9,Wo]N[.rE/y ޮ2L;Uvrye#(ɚ MWφC{E7fZí8T/*-MT:`Y̮#CL:=J^X(J4W[9]e4ŏb3%R'g&W 'T pdY* |@USQ9_4$-*󖩤jהRyѓoyiڏG$J!wk,]IMbsj}W&[#~Q|o[K-S8:KG*"UizqAk%P {M8o*:'uNeDPLOr`4&_=AApXJLt@y.-PUUW9dTa1B!} {׭_4"1 H ڝ6uh{ m| EN ih$='lKDY:m~B/K12 ]BB?GY35eZWTU${QڄRqaoy]`hopZ.mv֌W`@;M ":mD>:)N<M1*j]l_CL%5!cI! -ɷdfvm O $ٺ"YU 'U/oHo\vXYXUS)|tU :"̪ b4g!;<+n2jBFJjC.4)K ։4xѯ &DAM<0tS;.R>z "OMGlC1@iUߊ5GrM<a< 0Ï\dn|12VyMG?'M:뒛_.\gk(!99.N>5I/nPN#%VidwRE.W?xayD;ԉvDe4~@ Gm uba6|߂m JϢ(9*ySѪ؇8+dMf(i]BQ*_0NN-59Nf7g S\GKĽÅw@m=oX'YY7-p >T5 @^Ǒo:>gzߓmZ\xTY;Q)lg #R[\}=QQɵYE_xY$n0@ΊR{tSE^1;ˮiax=Y r/cP6FF&dlr}$v.p,*kzC< f=Gub^9˱,eMI▃O>-Ѫp5:5,̹RH "-eMn>y="xTO1.aA} a &xtզO2c~ڭnpΝjzGג8œte3ѪS@7HJbL/G "X0_~G@/T'e}5 U8chŕCՇ{{4ʅum%.k"L)ذ`865:1ȊOnQ4UXj}`mR(|mX>k1Z!/o}3ys$Ѐ# O[Kbs3 k=sFE啝\;&wSwjv`C(\kknIZ Iz56e?w,,%XwǴv87W?nbgг -`hegUGC~'Q}}˪""m*hGis_̕MS"甆Ѯf ]R?^ R;rR]D2k̴}xcv6gÏ-@nOvgrck(^Ck) `S8[ _^NC MS\9WXfA3ْ ydRJ e\=fGzel cOm)0V6-v'+ԹEzF\r^F =f*=5W*UE[>יz4p16?kRҸ,!!1t[*?YwӸxE77fU2V`U ,Z,oMy'FV1̶*K䃠c[*UG 4Ny O@bP iN0@Xl> \e(Jӣٍ,plשCu5:J>ڽ&p ;BH. rI'31tiT.VnY.43uY!֯;YT#>ScC#:*%Hƴnޝud .?1 y*p ^/sD>9Q[e-w1YʤGvs!.Zh@bRCUկ- rҼ̙ ːKű}Eeh6=FhMhK(P,.t/QA7 ƊХ?˄1+*"B>tՉ `Z} 8}rrX-e[?YV︟u{_2Z[TOG&'. 9.1*jr0#tL>>R87a紶K{/ǂKJod_Fj4+iH~) u`) W{DOT%eHS{؝ `״v/JYS2Q:4نQm|m#FB\\ Z`?o񥑇"X+즎}ݱ LYԪ_>OT_@%Das JL MU92T΅8 \Wjl?~ˊHWQiGN.%ozk73ahkReK^_aK-*$Zpk+Wj! +^ZB2i`W~pTѵ~9V_ ZZ*@Ru)gTuDfqA} @*UD .d`}禰+jN v`PXOi 齌#FB! B/}.gICIeQ^^"YrYSʪe=ě 9/ j;jGNk*Bk673ݲ&kۯiqo1~o2<;{|d3φҒڮ<8V^.+mC|)~I78QofyWJ>7!6߷Q^eV툺F)2qT]{h*7T/ܸ͢YBILS;_:HS)Yruz$ @V4*J=`eWeOCƒ7 wGr|^Jtvs--C>DG 5xDDVŚ<;t3&HsÂ{:a]vӢoEqvi̙}pδl;>3aN.X8{J9NTCڔr@%fnKjcbźŕC |FC됂mwV+)OѲF]M^TD԰۪o#^XnsƢ<#4ȊbI20O.=*`xh L~eb XLW{+%n۫}z+}a J!si.UehGG@ԥeW!-;fdM6!T:MG]bQ,&%^س:\=NDž-ڔ1L>7~: _v TSE`Tk)&1D`e,r?XbF՝'.?Ȅ#.\=!$'N57-wDL-Rm,ʅGX)˄1heK8J~dd`rF xC&4po\|c!_%cVΌjJ8S֢ 0FgDɉ +\@֋ Zo>SKA^IcW`e`p'<#yx %@c&~#gDTF&#حT I vfp] N,:K <<4!s+yiٍ0-֐#!MTN4Ȧ + #YٛO?aQ| =7SRB ^?0u?ˍىhgoK&r@y\e>H \MgWz}9?,汤lPEQim @v7?(yr_)0 M0]c5W3j9;^m7t%D<+ڥQXOeFང@Kkx nJfׅYWhv&To,j*2lO9(p rxv[zlS-7!VCƜi2EVӵ`Jh`jw@pNx`d.r}Hoqg ѮE7C@.|dw9EYW}GPwr;> dC)Pj$Zngy=\84) >-AI-$U]J)]Qx.y#NJRwCiѕ6@R?+HxK &M= pF4TIefR8+Dj`c)*ړ=әk0J:A|a{gS@ 6q}R bf~1Bh!"~gh}Xܗ]6Qڜ'~pI3~{= P2ghܥum+iFILi|j _>pv;O?l #cBb t'%1e.n] GJZ݃=XQT&HGMx1{ҁ6.3 +鈔x"Wӫ4 Y(vN׻GnAWo25G&p$$:s؁ #ڕc'Ka L>i.6'+ىbE뵢vXC5ː B,67,*;20I鴬nbwp'A$bh1@oy'e!u#1{L99)@DAtc }NM-PvoY*Rs#̕"PEMi_U8@mYW[]\7y NTsef 1#-@'1;@=VF:vſ<B Ia. k!{80F). -eĻ]Ag,2W̟k ^@HF(!be !4!u ]S6tW/MMBtM-U00G j@( t;Q@ԱIi%F7C,5fȆr Wü@su[ 8d F'c\ +Ȧټ(pGuVO|UC'SNف18̅~[!tS7{qǶ|SR9l.u`SɴJ?БlQ 8ˈp͐%B-V:66s,wE<$؄zdZNh*8BqG/V_wك%R5a(fVʇ>!z}6iROO'CʃH\el185DK_xhYX\^{4!GD ]USVꍽ9%leBRbp\2oI,,-Vq i x.rm=vعb&.+a&kQ&y^儦ݟr%\U):jLm魱 *q,p:qKGNscl^*zSSNÜ;aɓ*!a(6}qn e),KxǷt0T)A\|/YUK{uY_pPaZ-tΣEV QWI6nl9cA?5,Ǝ׽I\9 4˖kkDnNx舑uE~)4lcb^:F#$6ѳA"a0Os 5aeJ2j0!ҥҜPӽQ: Z7? a Wg Sr>u\th"m5aQ7\%p39Z>R:=[4j+m"%y/PL=a[_ȉLXOt5Ҥ\xq-_TI\DZ't(IH%M O%T/Csg- e6/RŶ D]eYClWYb9YP wV%K14[ܪ6M$aד̫Z; @͋D%R2iM wM ؘ5߫o w>nY`ZdeLcaF^(/b[Cbp)׆s.PˑY;܂ax"r.qL[:]R1   1/b*β*4拺JqLdQ N*801 \ݳ  {xbLFS`Ac*mH@uۆxFh\qd~(PD1MqtQ"΀k뵃7Bh-10'tyN$:s08>&gef TQ)DHy=_Qp$%,].֓d楒ZC~9?wf[ rh8S^t{$R ƀoL{ͯAɊ*u?-bsEٸ4=Y N{ BJNվ\CMWqX_cYKsV{CFJ^wRAEÙl톯Vn%ysAw":K{mov\e;Oc1WG0!p Χ9oOSV+^ݥ0fI98q *j\OYz@2s4LP0BR(#xaOzJ8ofNϠ"OJm) cHȦbWR-%zGZԑWdJѓ__ww)EG. 1=ڧ=!D, BR )C80 YZphangorn/data/chloroplast.RData0000644000176200001440000005227413475602650016270 0ustar liggesusers7zXZi"6!XT])TW"nRʟX\qjnj-&aN ˺T֠5 _2bg Ҫp3{]²|1xǀf11w ?WԪqQlrprEdb6oÓErz #;ͥиxA{/ju,ox 금zt*ͻ #N,~<M8o1 j)d1KG(}i:hj!%s䉄ZWGF3 bD RY.x G]WoPةt_Ekv_QCRC(HC5QǸ+@ Q'ZCj<[[*ۻ+*lj8^dKW55MKI|9:Lku*+,)RK( J^p44Wܕ= \" OuY+𪅹3ɻs){v:CA&bڅhjezE\FҀ^3L5y^6}ocݾX^ZOmԜ[@[3؂d/v\.לxadch1,<)|4ܲ8<\_icW~8ӻ'ͭ4כ]Rc` X9 GN[70oCz{-zExAks(&G 1*UryXέeΑ0vHC o  rsҰa PvV,b֡DϾxjn5  @=:3-Gk^0'(C++?gOKJVZx?|Iߣ* ՁL80@vG59\&/FBB!3ٶ~d ufWkXʯ8ƘX`i3ckggõT."4Yݢf_R4˦G%+^슧T.EKK"u4s*;d>2]9(cV@]Ub-mRՖ d'ԍMt1ް8%gR}d-D<_f$j8Iͣ=.Gxaxv]{U[ Fչ7\@5+HJi #ԇb`;# 8+7D^oS*!dm@y+:Llk'^ȫːz7_t19+&+~WeQ+i@>h"<14jذe'?"·'d`r*D*d@E!Et鍡9iBӣBbQWb[@Q]Fzm N!. !̮Vky'rjS>-utq6(BA&ΉX|Ի9hFc׺{(FZa aUwAkKƍf!(2'CقZu0~KUʈZ'qG/fJίңL*iUˁsuf7rB((n;>DR!PFeoM Ir/(c9`̷Ō4w4AZmF"P-Y%Ib.ʹqU1vR׳z=Mߑ9OQt_  f a}<G:$G5شJ#x!`LPCϐ? eZBNZ*׻`')]̉I|yT#.W1Oc-P_`2胷UX$-J*9Œ辪'U T\Q+v>x [DoyB +3Nꤘ`l$S>bqt͂." eΡOT|G^Ѭ,$ά=`! 龜^q^XϺj@5SH*Mo,?(34q evY11;8QTcBme+1P^,KQVN)['[4T9;Mџ )ӣ G-IފEJZFw W$/8͟0b=rtǍOvQYTk q}ۂTFa"X(xP85JhY|Tkfi]C_ >.a.Ⱋ~j pL\=cWtdK%j!sQ|V^̸Fi\3Ȇ C6yI]76F4at1.:8կb=$+UօK sC]?bTxʭиįOuo):'oG/"qhKFqEÓC($BA6h;ԅCcPo}eKbI/gѨ? h\b-58U3i)exK qyg(!XI^XGFL抇_Ba;p*j JOLqŞ] ItzsnggꮂZCk(m8EcÏ1<{!Uz/T2^R6-[Lp؛+u:D0CCX+IiPT'A3 c7&wWM E__%Sfǂ@7!3~*̿|ff9/g8n#l?kUJԤ `-s4dhlrIyEk< tih0oc/n8?-USSktU!D/T| WGHmJ=pt^J2Ι^lrK 6R⫐1ERKkکdGyV^ HErsH ^\$) 0o$-ۿlʐd# [ai#ba*}1l6_<ʚǩ+ʑeGfP'_B_`P链"ryH]wm|yLNx`kW4vR?f^s,J%$[7J坩YjB?WkdTo'G̓V(1ԦoFZ&pT?8!Y;++0l0J=AVCDsh$m`m5r^e'%ŝ¿)b'<-jr$R9۩,b@]cta‹1^ /7/\0ۆ(ž#K!|8߬|9FkHabJXE늙. kK•`uC.)H{<;y|vԑj}y|ڭ'9쑎Ң >Dz?>|/;}G.Ouĝb%6<i Z KƍT;g p[JWz\LH X.fzyX;i#)*RXmBXkhq7!04Y L*FX69oPF>DIpm:.]~c' i#gfV բ{᪲]H3Ls@{⏮u WGA6ǻd!xl%Ml׃yXBzm nz>A4RMsd 9v}4d\$g}!TKcS''T2'^2K<0Ökn^`LcWhEo= p%TrN# Kk^.q b{",N "8VgA鏚#4 I_C%"Up-OQD-i*wQ̾`ɀXSce.7b[{{+{ι.BI  MP\1[Vv"H.3QBb[6 e! d!ܦ<:֤zɍ%W(? mh!$8;ր+=| &.|@sH*++ߺ: E;aEuMH@2Dz剓}Y'j=9Ia(pވ='6o3}8SD kx˛Ԣ\S <#H2jەJCR(G>FRkAII$r F!Iq*$\6e|ba3  4$^q%uO:q8p!WQSMu] ;P6NiP2'V1}Zl_ks qRZm$8 @F`BGxZo`-hƫ.!)W脊R+x5WY )j%*~`5c an:+>ls1s(Bh)){tEojلt{{dNmMe>^?B] ?Gd(9we4?nQ I7B^p'$?@37\/G %ؽ0Ҡd8DnzӰ|kD-qCjlW00 TSŇ/&SMZmW5n. iv"H^ŵ?{M!-j U0;؄H 48aӔ-8-^Eh[)W_۩Ji-`MIC}X}9F 7^</gyۧ!jSR0rR`Z5y=qgq:4XM[!< .ӝr"5OBldbRNVx 99LJEO>HW\Qgص!&Ȟ,chB>[.|8K\R@fZ%LpnřtR/5A3aSa 5$^.T5SλƋyqXԺ?f^̶BaM2xok;4 N7S #+9bq5ŗJšAuJ<˒*v&Հ q_nzp'=Ww2?P@xr#zk:&NF6Yf>嵝I#i8&{1h,>SW\G'H@5Fp%Ɠgl!%@I1!Ʌ%;b;zoGj怋,tV2vMHkʑ,(ebQc3;߿fʰ9 g1qP)"nn 293Y@ۑRZ*I1َZbEr(ya!8R5"V5Y]]EpCQ2+R',`:p4J۔0y!i\;Dj&VW;UW~F9׮1k7O"eաqy1,$zPLZ"Pf%aG[uUtH%kuSUB0Wi_jox<_,Ĭ7 VuCSB%]hASd#=VfE !_*W>!NaEUʰV6v I3 \dxPq-ΛRsՋ5BYJ,ь|xו`'z9X7YޣP?U|*@9|50iD ̇]y@ۨqbϬߣ72NeNA̢:ڰ|GÇ Eƨa*(J\^/Ts˰D<tN8?EBNehUՓlC0E*aWcǏ }\&f+*;ry/@{0B6%0M(9nմț'߅6mpcZZ8}(~xWdƺM)deΊpۂ)8e=gxxMO-{;`82:C1X Nk={|WNVK2 _2D">p' YҚ([m[Hi^0n)4ZBU+|9@CCo>񣴢BU1}%LQ`EǁHwQ-lӉ|ek[8C@رrݱa S=Qz$ꏓn׭hhf)(##[7[aH~6FObWXKi& =$5ar8(MUfyPTF1E=#fl{~8 s Lgá-/MNyR[J %I1ܹiF琢 G[֎1<#Y~PZ>x(}ܜ(zƚDhB^IX[:{8,2l-\H`bJ)u?=ixΩYWrCOڧMNQ:.W}4vK~Qas&wxyUKLu+GL9:Ycv/4҂IrזS7+rd\bN!QrcTM"n̼q 4y"fxѿϞw)R6@B8lߴv oG$7EC,y~u[K,+R^JVegFjڌ<6>pjɅPMٚ%QO)dZMSyPoPNϘRs!,`KGq_4vj5O8 *[mP.:B.,Tr A]-^¢?\ !.c_L:۬dh@4O-C5dVEڛ Sp[EJJDtQ$3H +͸;qSOU/W(Bgi&}P)XAL%$ l8<(4J2X61 vNX_yjy 3 nB W @m.d0 $|eHAu%D" , aS؇E 2&H+KĩXȹcӅˍ CIj-pqYsXaz%ٗ~EuBɺ߅yǥw풑N @i|u2GaiGak/Cbx;GShO\l N1a<4ԿXr:/-ShI$75dc]Z;dl/-XzT(G͓C~ӹB՘ 4BV[GXXʈ2nu9Iz51(4n%i,0ͥY?-Z`Np" mjm:Ƶ89.\^˝2c1gzL83E"y4ʊB'>u`TCHD0Ft2Jr>p&xwp'N层4@x©xC!Յjب-!C\MTFI6_Àܺoj[96JSDF{OU{?Hth֟dQ|!P~"g %68T(~@N, }(Iٍf>%AoahTكt5Jn6Ό$yāg!"uCLf["; ^36<@/HJoS@ pPXh78*7ZOUYE,Pz!CLa@_= pzNbv:ZN@f UKu-=~Q 5BtW30.VǢ4OC29,v3 dJDqH!<XyLC.jq:vp$K:/zvZvuUsE/Q5{(# twO GJgSgxFkEM?DڸHGPg.53)fU)}>[o~EuN%]Ÿ^ZtxvWK1E}eFw;BC;>exFk92LW32qW!5Ɍ‽fWo{;;u03:4 bb.ҍ&@-E˱"[xS壏i˫ ɾs(E͂uM;NmqHo"WzUKy3[o >}`5EЍLφ 0=47 %"}fv!.A-;D&8g'<0sI;یUBc8H 7O\B1}yLY]bgogMI:KF6 t}lK{k y"5 u4#)}02ۭm]qBQ ;-2]A{ ]a9U?Z[/.BPRUc|Ι$3+P9tUμ(Kg+V stw;fFl!3S8d|v,Ƈ7LpH xh~WDnss<P"ZBl3XJ˚ .Q7$csȽp״^ܿAuL`p1N;YCJ[iO-c\v|ILu-zf߳JY #47Wnw̭4AFF1:J?j/]?}hFqӟ(9VzS~EZ韬$5 x|9,F˱ްl*@T4XswWc..m~TW狭&PjgF`\X_:g ?a}ܷ ԍW\)o;%zV~Sv+'k񝘿pOEZr38I̹Dۊ$6~s+cl"ifnc>}Fr_2NU#/b{ϧ%!|V>bҩ}k(KByPaMI\dzK_B~:0 |?FsǸ(၌ ZU!zYD^0+XV桀frw!_-}6]mT7Uh6|u/+ROU>}Z9B rg?Q{ݯfkLuTzgYN@kv$O ɵ= 0#Zj܊zf@*! oڹmu#)/@$?~A_e B{y4r"feM{_F!p@Ň}iDb"0&?xo=/%D(<Ӭ+gV.^&SP L'O0jmg`r):>Y$ Wl˸h0q[ŗg4j9EC:b\:{y&{9 AlRRYQAC` Xz!41D?Q-;VI >2d/!2NF_C,4oթ%6`-ob /ռXf M\'2kZǔ e;g)iB # :d⼃Yqsau%kձ)+YNLKZS9&:xeètѩyO§q&m;B!z$VK/xK/+Awgi18(u⚂ +6[7@4|!9խg6xEfvG|M(%;I~'5tlPQ=p[Cf~ ǧt 9aʱn5prqn#gO\UwGgr ^b=qx;" Pd'Wi!Ry}vi(o7.VCԜ-eE(x@#`*EMl(LP]k ^V:W/a?g8r$A-vL&x_g!ڜɳxFlϓ dz*P#=F7 Rg< mS>rNݗQ4K0 #.|Gބ)ɪ/5  v2ɍ`4~bEWˡ[4;LF9lOɼu٘ `ƎN􎸂.g oˠcX3L"X 7Y t AUz,4QyZiT7[F,{ $˧L|M8.)W"?UI .{ο%\VB *(yeu&B9')Sf[|ڶn.wirIU]F- F i<":%4f9TFې1ñG(k|cgtܩHIgKP-&Y˒=t(;*SiC駷4{7st[8U t+[ێ;ᣟɩ=]:{_+_jK[b} q>64?D'Ɲ0k4ӥbw_c2tQ0Zf.&AntQ5<ͧ_9˱!ntOgm;y{vv$V.4vR yaiFVVA[Z!쪝K$NCA D@xp4 Z0^vP**&hG.AhThˢcѹ0? _( *`q}ݺh{2q#Rcr{Qka49} iX聽ʫlAQO6X-;W uHW A)]sfp?c _7>bh+; krMCkeՋxk'gS&hCY|')G5N #79`T/ӯHRT;: tmQS*>:'?W^~U',4moYd'ҍ6D^ސrS;iceR}&.~qr&tkj>x p ek/筠Ȣ:x0 DcR;ɾscjEHF)\j.2Il0#}2Ju*ル{)_7&؋NnkVy/I.a5o^qiBNdiXpI `v E;D$6278$bZDUyӨiTBY!IuYnt˂p=91e{d"N^HK-E8W_(ť_ @\H,-Q4/ȈͤjAt*#IhDfW"Տ*bƕ΋>\;0㖶+27K )#3@ ŽɇkLr+w}yId* S,& y264Gcaybg|uRkR2%컛[mR0K>wn]Du%Zv5u~PEY> ynz5iN.(ByRNP0w#;"gUN wvYĠ6$DPevЪ=z#ɴ |:5=\EߕW;[\6߅yMZ?^F_ˎ}/?TOmC0'9aJuuoBY.̠ph6s_x- k Z !{dQ3MkK]:I[Ĩ$7/! V/D @"IO A$b8zJÝ6ܒy%"fv9Ҿ[w_GUU F zaWM(`~l3;#yOkZ.%űp5B27-\kGlv^Ċ[ÿ,[efW_}b]BJ@v)VG,] aq$I|QT}#՝nŢԕh%mjҝFqo]<,r vR/v{mYtK|ơ/&PXS%_6cy]9m].EDPIt4\bW@ @yEAXurH`):%J`UVM%hqgQ(:hx%xRK{JM*~͜I7q >a[ZO|@̊/R=['WTLUAp^Vʆ rQ pr0\0 C3"ωTVWN;DVslI%J1rX78f ^VR|jByS2d0]4Ў\mޯiOýlЁKӓ(?&ЬR] ~/b >euh0ď=<mX6\U#TOTkl$?Yy1r,LQKթ;z$kR{5zkr…M,)Z+"}!`E)ü,Ĉ,92I19=N6Mv1; we<~5<3hI+b:.);AlM HD6P 2zYg H^8 /~D* |mWEw}͋?дR==vD_fiQ*#{9Rwߨ3\s? q.{ܯG1c>c>+.8Q짋2`Qoj]#A@2h!0oe/otû(`v 7紇W3X~r>3&Uo{HiJ@oNqfzmNL*VPTu읇 SI~rjXPI^$=gQȱ)NeL騶I"҈u|Av/Ko ڟFj8MtN)gRaL@r ufP3!E 2XnAOߨ`"1_dRuXow`ˏ-?!G 5l/"]37߬3J8nlh#<:$&QV )p,)wt>ȵ1#Uc茹 z*X1sR 2"G\;JYhHDyM D*KK5MjmH7\k@mW(,.Ϋ:?ת/T7wזp7:`Ȑ9}m0z2o `Fs Tq'\bgƩVʗ9oʀDZ. Z{g_`4UQPXS,|,=up)d+wژ6 2p9WU~%m|3x= ?8G殐կi)'mP/o]zA Z4pW߂/8O OZ8BIUR%Eޘ?YC5+ߵCR`^j{m׶3#@y7p]>N}PD#zZY[?562lby=zs"2%1%\ 3m4$B0cXEPaYq.[t\bJgjJ!l~l.0~ʅ&zTH.o4I'+ ZA%jt/&9纮R=\S\^jf}3b-"1.M, ukְ|2=Jc-<8|!Ph&;bΝB[f IZgLCU(oiʆ\CEvܰEd@Q Yg<5<Hc4 Lqռ[ݮ-jo @KNp4+H}Ga}`:81S=/ic-<0_wgyeGU* /x֜k^wR/8&pQtʆJuS+N!a݂Y癁d/kwKy$R+G n)v*gܽmorD|?|>r2$0XBtP_SA kiR4N\=Jbл5U:j[z]9L,m¯΅ [A Cwk]z@{v*w[Yε-:׶K/v>z\sqZdհN:\Y~lrjX7.y8U<]Vh[?fO b N(X;q+]uݼyS-WLWVB)kWyf7?}aжvv4'13uikz(5s'di*K29J:W"l<,axJjN?ֹ`]DTy3)FRDej5p@9M5=7O 2&X_TO69l(\Ȭ^zHRN tOXsNXn>MTƩwYb,Rۑ۱Tfw'4w+E1ZȾ $ ghדc2Q%,Z2h-ֳv* .lkR[0KUn WAot^%Sԭtq&dh#]DOC@jŽ'0is9  w}'} [RZ\.tr.3S5J8\g%۲bd(& 'd, !9h;;"Yc;V5=ϏHpЯa&_zwljrZʺ۩4DH&"mFSI7pK\_;f=!J"9AW؉X5f6G,V?0$c쩴m;#SA v>Wo q8B|ٺYQ/ˌ"11 ҧ͗oY3lƧh ]G>׿E+c刲sѨW$̞Hix|kcV^.7)OW8XxS-)pmT:b oAM>6yY\4j0Mwj2#{ˬq5 cl画='?$ KKj =ҋf^wݙKߥKa%@X2(E h8} S}&[3wM!../3;MK1~6@捫$pikW%3VԒbvG6ZRMd-s<"!ՌPr 4ys*d,K0/$YSo\V 8+:{\0e/m99K)ԉY4DFL~H-ړ pL>0 YZphangorn/R/0000755000176200001440000000000013502203644012266 5ustar liggesusersphangorn/R/distSeq.R0000644000176200001440000003366713475602650014055 0ustar liggesusers#' Pairwise Distances from Sequences #' #' \code{dist.hamming}, \code{dist.ml} and \code{dist.logDet} compute pairwise #' distances for an object of class \code{phyDat}. \code{dist.ml} uses DNA / #' AA sequences to compute distances under different substitution models. #' #' So far 17 amino acid models are supported ("WAG", "JTT", "LG", "Dayhoff", #' "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", #' "FLU", "Blossum62", "Dayhoff_DCMut" and "JTT_DCMut") and additional rate #' matrices and frequencies can be supplied. #' #' The "F81" model uses empirical base frequencies, the "JC69" equal base #' frequencies. This is even the case if the data are not nucleotides. #' #' @param x An object of class \code{phyDat} #' @param ratio Compute uncorrected ('p') distance or character difference. #' @param model One of "JC69", "F81" or one of 17 amino acid models see #' details. #' @param exclude One of "none", "all", "pairwise" indicating whether to delete #' the sites with missing data (or ambiguous states). The default is handle #' missing data as in pml. #' @param bf A vector of base frequencies. #' @param Q A vector containing the lower triangular part of the rate matrix. #' @param k Number of intervals of the discrete gamma distribution. #' @param shape Shape parameter of the gamma distribution. #' @param \dots Further arguments passed to or from other methods. #' @return an object of class \code{dist} #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso For more distance methods for nucleotide data see #' \code{\link[ape]{dist.dna}} and \code{\link{dist.p}} for pairwise #' polymorphism p-distances. \code{\link{writeDist}} for export and import #' distances. #' @references Lockhart, P. J., Steel, M. A., Hendy, M. D. and Penny, D. (1994) #' Recovering evolutionary trees under a more realistic model of sequence #' evolution. \emph{Molecular Biology and Evolution}, \bold{11}, 605--602. #' #' Jukes TH and Cantor CR (1969). \emph{Evolution of Protein Molecules}. New #' York: Academic Press. 21--132. #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' dm1 <- dist.hamming(Laurasiatherian) #' tree1 <- NJ(dm1) #' dm2 <- dist.logDet(Laurasiatherian) #' tree2 <- NJ(dm2) #' treedist(tree1,tree2) #' # JC model #' dm3 <- dist.ml(Laurasiatherian) #' tree3 <- NJ(dm3) #' treedist(tree1,tree3) #' # F81 + Gamma #' dm4 <- dist.ml(Laurasiatherian, model="F81", k=4, shape=.4) #' tree4 <- NJ(dm4) #' treedist(tree1,tree4) #' treedist(tree3,tree4) #' #' @rdname dist.hamming #' @export dist.hamming <- function(x, ratio = TRUE, exclude = "none"){ if(inherits(x, "DNAbin") | inherits(x, "AAbin")) x <- as.phyDat(x) if (!inherits(x, "phyDat")) stop("x must be of class phyDat") l <- length(x) contrast <- attr(x, "contrast") nc <- as.integer(attr(x, "nc")) con <- rowSums(contrast > 0) < 2 if (exclude == "all") { index <- con[x[[1]]] for (i in 2:l) index <- index & con[x[[i]]] index <- which(index) x <- subset(x, select = index) } weight <- attr(x, "weight") d <- numeric( (l * (l - 1)) / 2) if (exclude == "pairwise") { k <- 1 W <- numeric(l * (l - 1) / 2) for (i in 1:(l - 1)) { tmp <- con[x[[i]]] for (j in (i + 1):l) { W[k] <- sum(weight[tmp & con[ x[[j]] ] ]) k <- k + 1 } } } if (nc > 31) { k <- 1 for (i in 1:(l - 1)) { X <- contrast[x[[i]], , drop = FALSE] for (j in (i + 1):l) { d[k] <- sum(weight * (rowSums(X * contrast[x[[j]], , drop = FALSE]) == 0)) k <- k + 1 } } } # end if else { nr <- attr(x, "nr") if (exclude == "pairwise") ind <- which(con[unlist(x)] == FALSE) x <- prepareDataFitch(x) if (exclude == "pairwise") x[ind] <- as.integer(2L^nc - 1L) res <- .C("distHamming", as.integer(x), as.double(weight), as.integer(nr), as.integer(l), as.double(d), PACKAGE = "phangorn") d <- res[[5]] } if (ratio) { if (exclude == "pairwise") d <- d / W else d <- d / sum(weight) } attr(d, "Size") <- l if (is.list(x)) attr(d, "Labels") <- names(x) else attr(d, "Labels") <- colnames(x) attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "call") <- match.call() attr(d, "method") <- "hamming" class(d) <- "dist" return(d) } #' @rdname dist.hamming #' @export dist.ml <- function(x, model = "JC69", exclude = "none", bf = NULL, Q = NULL, k = 1L, shape = 1, ...){ if(inherits(x, "DNAbin") | inherits(x, "AAbin")) x <- as.phyDat(x) if (!inherits(x, "phyDat")) stop("x must be of class phyDat") l <- length(x) d <- numeric((l * (l - 1)) / 2) v <- numeric((l * (l - 1)) / 2) contrast <- attr(x, "contrast") con <- rowSums(contrast > 0) < 2 if (exclude == "all") { index <- con[x[[1]]] for (i in 2:l) index <- index & con[x[[i]]] index <- which(index) x <- subset(x, select = index) } nc <- as.integer(attr(x, "nc")) nr <- as.integer(attr(x, "nr")) model <- match.arg(model, c("JC69", "F81", .aamodels)) if (!is.na(match(model, .aamodels))) getModelAA(model, bf = is.null(bf), Q = is.null(Q)) if (is.null(bf) && model == "F81") bf <- baseFreq(x) if (is.null(bf)) bf <- rep(1 / nc, nc) if (is.null(Q)) Q <- rep(1, (nc - 1) * nc / 2L) bf <- as.double(bf) eig <- edQt(Q = Q, bf = bf) pos <- 1 k <- as.integer(k) w <- as.double(w <- rep(1 / k, k)) g <- as.double(discrete.gamma(shape, k)) fun <- function(s) -(nc - 1) / nc * log(1 - nc / (nc - 1) * s) eps <- (nc - 1) / nc n <- as.integer(dim(contrast)[1]) ind1 <- rep(1:n, n:1) ind2 <- unlist(lapply(n:1, function(x) seq_len(x) + n - x)) li <- as.integer(length(ind1)) weight <- as.double(attr(x, "weight")) ll.0 <- as.double(weight * 0) if (exclude == "pairwise") { index <- con[ind1] & con[ind2] index <- which(!index) } tmp <- (contrast %*% eig[[2]])[ind1, ] * (contrast %*% (t(eig[[3]]) * bf))[ind2, ] tmp2 <- vector("list", k) wshared <- which(rowSums(contrast[ind1, ] * contrast[ind2, ]) > 0) tmp2 <- vector("list", k) for (i in 1:(l - 1)) { for (j in (i + 1):l) { w0 <- .Call("PWI", as.integer(x[[i]]), as.integer(x[[j]]), nr, n, weight, li, PACKAGE = "phangorn") if (exclude == "pairwise") w0[index] <- 0.0 ind <- w0 > 0 old.el <- 1 - (sum(w0[wshared]) / sum(w0)) if (old.el > eps) old.el <- 10 else old.el <- fun(old.el) for (lk in 1:k) tmp2[[lk]] <- tmp[ind, , drop = FALSE] # FS0 verwenden!!! res <- .Call("FS5", eig, nc, as.double(old.el), w, g, tmp2, as.integer(k), as.integer(sum(ind)), w0[ind], ll.0, PACKAGE = "phangorn") d[pos] <- res[1] # res[[1]] v[pos] <- res[2] # res[[2]] pos <- pos + 1 } } attr(d, "Size") <- l if (is.list(x)) attr(d, "Labels") <- names(x) else attr(d, "Labels") <- colnames(x) attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "call") <- match.call() attr(d, "variance") <- v class(d) <- "dist" return(d) } #' @rdname dist.hamming #' @export dist.logDet <- function(x) { if(inherits(x, "DNAbin") | inherits(x, "AAbin")) x <- as.phyDat(x) if (!inherits(x, "phyDat")) stop("x must be of class phyDat") weight <- attr(x, "weight") contrast <- attr(x, "contrast") r <- attr(x, "nc") l <- length(x) d <- numeric( (l * (l - 1)) / 2) k <- 1 for (i in 1:(l - 1)) { Xi <- weight * contrast[x[[i]], , drop = FALSE] for (j in (i + 1):l) { tmp <- crossprod(Xi, contrast[x[[j]], , drop = FALSE]) class(tmp) <- "matrix" z <- determinant.matrix(tmp, logarithm = TRUE) res <- z$sign * z$modulus if (is.nan(res)) { d[k] <- 10 } else d[k] <- (-res + sum(log(rowSums(tmp) * colSums(tmp))) / 2) / r k <- k + 1 } } attr(d, "Size") <- l if (is.list(x)) attr(d, "Labels") <- names(x) else attr(d, "Labels") <- colnames(x) attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "call") <- match.call() attr(d, "method") <- "logDet" class(d) <- "dist" return(d) } #' Writing and reading distances in phylip and nexus format #' #' \code{readDist}, \code{writeDist} and \code{write.nexus.dist} are useful to #' exchange distance matrices with other phylogenetic programs. #' #' #' @param x A \code{dist} object. #' @param file A file name. #' @param format file format, default is "phylip", only other option so far is #' "nexus". #' @param \dots Further arguments passed to or from other methods. #' @param upper logical value indicating whether the upper triangle of the #' distance matrix should be printed. #' @param diag logical value indicating whether the diagonal of the distance #' matrix should be printed. #' @param digits passed to format inside of \code{write.nexus.dist}. #' @param taxa logical. If TRUE a taxa block is added. #' @param append logical. If TRUE the nexus blocks will be added to a file. #' @return an object of class \code{dist} #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso To compute distance matrices see \code{\link{dist.ml}} #' \code{\link[ape]{dist.dna}} and \code{\link{dist.p}} for pairwise #' polymorphism p-distances #' @references Maddison, D. R., Swofford, D. L. and Maddison, W. P. (1997) #' NEXUS: an extensible file format for systematic information. #' \emph{Systematic Biology}, \bold{46}, 590--621. #' #' @keywords cluster #' @examples #' #' data(yeast) #' dm <- dist.ml(yeast) #' writeDist(dm) #' write.nexus.dist(dm) #' #' @rdname writeDist #' @export writeDist writeDist <- function(x, file = "", format = "phylip", ...) { format <- match.arg(format, c("phylip", "nexus")) if (format == "phylip") { x <- as.matrix(x) # maybe x <- format(x, digits = digits, justify = "none") cat(ncol(x), "\n", file = file) write.table(x, file, append = TRUE, quote = FALSE, col.names = FALSE) } else write.nexus.dist(x, file = file, ...) } #' @rdname writeDist #' @export write.nexus.dist <- function(x, file = "", append = FALSE, upper = FALSE, diag = TRUE, digits = getOption("digits"), taxa = !append) { if(!inherits(x, "dist")) x <- as.dist(x) taxa.labels <- attr(x, "Labels") ntaxa <- length(taxa.labels) m <- as.matrix(x) cf <- format(m, digits = digits, justify = "none") l <- length(attr(x, "Labels")) if (upper) diag <- TRUE if (!upper) cf[row(cf) < col(cf)] <- "" if (!diag) cf[row(cf) == col(cf)] <- "" cf2 <- apply(cf, 1, "paste0", collapse = " ") cf2 <- paste(attr(x, "Labels"), cf2) cf2 <- trimws(cf2, "right") if (!append) cat("#NEXUS\n\n", file = file) if (taxa) { cat(paste("BEGIN TAXA;\n\tDIMENSIONS ntax=", ntaxa, ";\n", sep = ""), file = file, append = TRUE) cat("\tTAXLABELS", paste(taxa.labels, sep = " "), ";\nEND;\n\n", file = file, append = TRUE) } cat("BEGIN DISTANCES; \n", file = file, append = TRUE) if (upper) cat("\tFORMAT TRIANGLE = BOTH;\n", file = file, append = TRUE) else cat("\tFORMAT TRIANGLE = LOWER;\n", file = file, append = TRUE) if (!diag) cat("\tFORMAT NODIAGONAL;\n", file = file, append = TRUE) cat("\tMatrix \n", file = file, append = TRUE) for (i in 1:l) cat("\t", cf2[i], "\n", sep = "", file = file, append = TRUE) cat("\t;\nEND; \n", file = file, append = TRUE) } RSS <- function(x, dm, trace = 0) { labels <- attr(x, "labels") dm <- as.matrix(dm) dm <- dm[labels, labels] y <- dm[lower.tri(dm)] betahat <- attr(x, "weights") X <- splits2design(x) RSS <- sum((y - (X %*% betahat))^2) RSS } #' @rdname writeDist #' @export readDist <- function(file, format="phylip") { format <- match.arg(format, c("phylip", "nexus")) if(format=="phylip") return(readPhylip(file)) else return(read.nexus.dist(file)) NULL } readPhylip <- function(file, skip = 1, ...) { tmp <- read.table(file, stringsAsFactors = FALSE, skip=skip, ...) labels <- tmp[, 1] dm <- as.matrix(tmp[, -1]) dimnames(dm) <- list(labels, labels) as.dist(dm) } #' @rdname writeDist #' @export read.nexus.dist <- function(file){ X <- scan(file = file, what = "", sep = "\n", quiet = TRUE, strip.white = TRUE) semico <- grep(";", X) X <- gsub("\\[(.*?)\\]", "", X) # get rid of comments i1 <- grep("TAXLABELS", X, ignore.case = TRUE) taxlab <- ifelse(length(i1) > 0, TRUE, FALSE) if (taxlab) { end <- semico[semico >= i1][1] x <- X[(i1):end] # assumes not a 'new line' after "TRANSLATE" x <- gsub("TAXLABELS", "", x, ignore.case = TRUE) x <- unlist(strsplit(x, "[,; \t]")) x <- x[nzchar(x)] x <- gsub("['\"]", "", x) } distStart <- grep("DISTANCES;", X, ignore.case = TRUE) distEnd <- grep("END;", X, ignore.case = TRUE) distEnd <- distEnd[distEnd > distStart][1] matr <- grep("MATRIX", X, ignore.case = TRUE) format <- grep("FORMAT", X, ignore.case = TRUE) start <- matr[matr > distStart][1] + 1 end <- semico[semico > start][1] - 1 format <- format[(format > distStart) & (format < distEnd)] res <- vector("list", end - start + 1) weights <- numeric(end - start + 1) j <- 1 flab <- FALSE if (length(format) > 0) { tmp <- X[format] tmp <- gsub("\\;", "", tmp) tmp <- gsub("\\s+", "", tmp) flab <- grepl("labels=left", tmp, ignore.case = TRUE) } tmp <- tempfile() writeLines(X[start:end], tmp) nTip <- end-start+1 colnames <- c("label" , paste("V", seq_len(nTip))) dm <- readPhylip(tmp, fill=TRUE, skip=0, col.names = colnames, colClasses=c("character", rep("numeric", nTip))) unlink(tmp) dm } #' @rdname writeDist #' @param incomparables Not used so far. #' @export unique.dist <- function(x, incomparables, ...) { y <- as.matrix(x) l <- nrow(y) z <- character(l) for (i in seq_len(l)) z[i] <- paste(round(y[i, ], 8), collapse = "_") if (any(duplicated(z))) { ind <- !duplicated(z) y <- y[ind, ind] if (is.matrix(x)) return(y) if (inherits(x, "dist")) { res <- as.dist(y, diag = attr(x, "Diag"), upper = attr(x, "Upper")) return(res) } } x } phangorn/R/clanistic.R0000644000176200001440000004500613475602650014400 0ustar liggesusers#' Clans, slices and clips #' #' Functions for clanistics to compute clans, slices, clips for unrooted trees #' and functions to quantify the fragmentation of trees. #' #' Every split in an unrooted tree defines two complementary clans. Thus for an #' unrooted binary tree with \eqn{n} leaves there are \eqn{2n - 3} edges, and #' therefore \eqn{4n - 6} clans (including \eqn{n} trivial clans containing #' only one leave). #' #' Slices are defined by a pair of splits or tripartitions, which are not #' clans. The number of distinguishable slices for a binary tree with \eqn{n} #' tips is \eqn{2n^2 - 10n + 12}. #' #' %A clip is a different type of partition as it is defined by evolutionary or #' cophenetic distance and not by the topology. Namely clips are groups of #' leaves for which the maximum pairwise distance is smaller than threshold. #' %For a better separation we additionally demand that the maximum pairwise #' distance within a clip is lower than the distance between any member of the #' clip and any other tip. #' #' A clip is a different type of partition, defining groups of leaves that are #' related in terms of evolutionary distances and not only topology. Namely, #' clips are groups of leaves for which all pairwise path-length distances are #' smaller than a given threshold value (Lapointe et al. 2010). There exists #' different numbers of clips for different thresholds, the largest (and #' trivial) one being the whole tree. There is always a clip containing only #' the two leaves with the smallest pairwise distance. #' #' Clans, slices and clips can be used to characterize how well a vector of #' categorial characters (natives/intruders) fit on a tree. We will follow the #' definitions of Lapointe et al.(2010). A complete clan is a clan that #' contains all leaves of a given state/color, but can also contain leaves of #' another state/color. A clan is homogeneous if it only contains leaves of one #' state/color. #' #' \code{getDiversity} computes either the \cr Shannon Diversity: \eqn{H = #' -\sum_{i=1}^{k}(N_i/N) log(N_i/N), N=\sum_{i=1}^{k} N_i}{H = -sum(N_i/N) * #' log(N_i/N), N=sum(N_i)} \cr or the \cr Equitability Index: \eqn{E = H / #' log(N)} \cr where \eqn{N_i} are the sizes of the \eqn{k} largest homogeneous #' clans of intruders. If the categories of the data can be separated by an #' edge of the tree then the E-value will be zero, and maximum equitability #' (E=1) is reached if all intruders are in separate clans. getDiversity #' computes these Intruder indices for the whole tree, complete clans and #' complete slices. Additionally the parsimony scores (p-scores) are reported. #' The p-score indicates if the leaves contain only one color (p-score=0), if #' the the leaves can be separated by a single split (perfect clan, p-score=1) #' or by a pair of splits (perfect slice, p-score=2). #' #' So far only 2 states are supported (native, intruder), however it is also #' possible to recode several states into the native or intruder state using #' contrasts, for details see section 2 in vignette("phangorn-specials"). #' Furthermore unknown character states are coded as ambiguous character, which #' can act either as native or intruder minimizing the number of clans or #' changes (in parsimony analysis) needed to describe a tree for given data. #' #' Set attribute labels to "old" for analysis as in Schliep et al. (2010) or to #' "new" for names which are more intuitive. #' #' \code{diversity} returns a data.frame with the parsimony score for each tree #' and each levels of the variables in \code{X}. \code{X} has to be a #' \code{data.frame} where each column is a factor and the rownames of \code{X} #' correspond to the tips of the trees. #' #' %TODO See also vignette("Clanistic"). #' #' @param tree An object of class phylo or multiPhylo (getDiversity). #' @param all A logical, return all or just the largest clip. #' @param x An object of class phyDat. #' @param norm A logical, return Equitability Index (default) or Shannon #' Diversity. #' @param var.names A vector of variable names. #' @param labels see details. #' @param X a data.frame #' @param object an object for which a summary is desired. #' @param ... Further arguments passed to or from other methods. #' @return getClans, getSlices and getClips return a matrix of partitions, a #' matrix of ones and zeros where rows correspond to a clan, slice or clip and #' columns to tips. A one indicates that a tip belongs to a certain partition. #' \cr getDiversity returns a list with tree object, the first is a data.frame #' of the equitability index or Shannon divergence and parsimony scores #' (p-score) for all trees and variables. The data.frame has two attributes, #' the first is a splits object to identify the taxa of each tree and the #' second is a splits object containing all partitions that perfectly fit. #' @author Klaus Schliep \email{klaus.schliep@@snv.jussieu.fr} #' #' Francois-Joseph Lapointe \email{francois-joseph.lapointe@@umontreal.ca} #' @seealso \code{\link{parsimony}}, Consistency index \code{\link{CI}}, #' Retention index \code{\link{RI}}, \code{\link{phyDat}} #' @references Lapointe, F.-J., Lopez, P., Boucher, Y., Koenig, J., Bapteste, #' E. (2010) Clanistics: a multi-level perspective for harvesting unrooted gene #' trees. \emph{Trends in Microbiology} 18: 341-347 #' #' Wilkinson, M., McInerney, J.O., Hirt, R.P., Foster, P.G., Embley, T.M. #' (2007) Of clades and clans: terms for phylogenetic relationships in unrooted #' trees. \emph{Trends in Ecology and Evolution} 22: 114-115 #' #' Schliep, K., Lopez, P., Lapointe F.-J., Bapteste E. (2011) Harvesting #' Evolutionary Signals in a Forest of Prokaryotic Gene Trees, \emph{Molecular #' Biology and Evolution} 28(4): 1393-1405 #' @keywords cluster #' @examples #' #' set.seed(111) #' tree <- rtree(10) #' getClans(tree) #' getClips(tree, all=TRUE) #' getSlices(tree) #' #' set.seed(123) #' trees <- rmtree(10, 20) #' X <- matrix(sample(c("red", "blue", "violet"), 100, TRUE, c(.5,.4, .1)), #' ncol=5, dimnames=list(paste('t',1:20, sep=""), paste('Var',1:5, sep="_"))) #' x <- phyDat(X, type = "USER", levels = c("red", "blue"), ambiguity="violet") #' plot(trees[[1]], "u", tip.color = X[trees[[1]]$tip,1]) # intruders are blue #' #' (divTab <- getDiversity(trees, x, var.names=colnames(X))) #' summary(divTab) #' #' @rdname getClans #' @export getClans <- function (tree) { if (is.rooted(tree)) tree <- unroot(tree) bp <- bip(tree) nTips <- length(tree$tip.label) root <- nTips + 1 bp[root] <- NULL X <- matrix(0, length(bp) - nTips, nTips) k <- 1 nl <- NULL if (!is.null(tree$node.label)) { nl <- c(rep("-1", nTips), rep("-1", nTips), tree$node.label[-1], tree$node.label[-1]) } if(root<=length(bp)){ for (i in root:length(bp)) { X[k, bp[[i]]] <- 1 k <- k + 1 } } res <- rbind(diag(nTips), 1 - diag(nTips), X, 1 - X) colnames(res) <- tree$tip.label if (!is.null(nl)) rownames(res) <- nl res } #' @rdname getClans #' @export getSlices <- function(tree){ nTips <- length(tree$tip.label) clans <- getClans(tree) m <- dim(clans)[1] X <- tcrossprod(clans) z <- rowSums(clans) Z1 <- matrix(z,m,m) Z2 <- t(Z1) Z <- matrix(0,m,m) Z[Z1<=Z2] <- Z1[Z1<=Z2] Z[Z20,arr.ind=TRUE) l <- dim(index)[1] nSlices <- 2 * nTips^2 -10 * nTips + 12 result <- matrix(0, nSlices, nTips) strClan <- do.call("paste", c(as.data.frame(clans), sep = "")) k <- 1 for(i in 1:l){ tmp1 <- as.numeric((clans[index[i,1],] + clans[index[i,2],])==2) tmp <- paste(tmp1,sep="",collapse="") if(is.na(match(tmp,strClan))){ result[k,] <- tmp1 k <- k+1 } } if(kmin(ind) ) break() within <- max(dm[ind, ind]) between <- min(dm[ind, -ind]) if (within < between) { res <- numeric(nTips) res[ind] <- 1L result <- rbind(result, res) } } } dimnames(result) <- list(NULL, tips) if (all) return(result) ind <- which.max(rowSums(result)) result[ind, ] } shannon <- function (x, norm=TRUE) { p <- x/sum(x) ShD <- -sum(p * log10(p)) if(norm){ if (sum(x) == 1) return(0) ShD <- ShD/log10(sum(x)) } ShD } shannon2 <- function (x, norm=TRUE) { p <- x/sum(x) ShD <- -sum(p * log(p)) if(norm){ if (sum(x) == 1) return(0) ShD <- ShD/log(sum(x)) } ShD } getE <- function (tree, x, clans = NULL, norm = TRUE) { if (is.rooted(tree)) tree <- unroot(tree) if (is.null(clans)) clans <- getClans(tree) labels <- tree$tip.label x <- x[labels] result <- rep(NA, 12) names(result) <- c("E* tree", "# natives", "# intruder", "# unknown", "E* clan", "# intruder", "# unknown", "E* slice", "# intruder", "# unknown", "bs 1", "bs 2") result[2] <- sum(x == 1) result[3] <- sum(x == 2) result[4] <- sum(x == 3) if (result[2] == 0 || result[3] == 0) { if (result[2] > 1) return(list(result, labels)) else return(list(result, integer(0))) } LHG <- E_Intruder(clans, x) d <- dim(LHG)[1] if (d == 1) { result[1] <- 0 if (!is.null(tree$node.label)) result[11] <- as.numeric(rownames(LHG)) return(list(result, labels[LHG == 0])) } intr <- drop(LHG %*% as.numeric(x == 2)) result[1] <- shannon2(intr, norm = norm) o <- order(intr, decreasing = TRUE) if (!is.null(tree$node.label)) result[11:12] <- as.numeric(rownames(LHG)[o[c(1, 2)]]) ind <- which(LHG[o[1], ] == 1) result[6] <- sum(x[-ind] == 2) result[7] <- sum(x[-ind] == 3) if (length(x[-ind]) < 4) return(list(result, NULL)) result[5] <- shannon2(intr[-o[1]], norm = norm) ind2 <- c(which(LHG[o[1], ] == 1), which(LHG[o[2], ] == 1)) spl <- structure(list(which(colSums(LHG)==0)), labels=labels, weights=1) class(spl) <- "splits" if (d == 2) { return(list(result, spl)) } result[9] <- sum(x[-ind2] == 2) result[10] <- sum(x[-ind2] == 3) if (length(x[-ind2]) < 4){ return(list(result, spl)) } result[8] <- shannon2(intr[-c(o[1], o[2])], norm = norm) return(list(result, spl)) } E_Intruder <- function (clans, x) { cp <- drop(clans %*% as.numeric(x == 1)) ci <- drop(clans %*% as.numeric(x == 2)) homo <- which(cp == 0 & ci > 0) l <- length(homo) if (l > 0) { HG <- clans[homo, , drop = FALSE] lhg <- rep(TRUE, l) rsh <- rowSums(HG) Z <- tcrossprod(HG)>0 Z <- Z * rsh zmax <- apply(Z,2,max) lhg <- !(zmax > rsh) LHG <- HG[lhg, , drop = FALSE] return(LHG) } return(NULL) } E_Intruder_2 <- function (clans, x, native=NULL) { contr <- attr(x, "contr") d <- dim(contr) if(d[1]>d[2]) contr[(d[2]+1):d[1],] <- 0 cp <- clans %*% contr[as.numeric(x),] homo <- which(rowSums(cp > 0) == 1) l <- length(homo) if (l > 0) { HG <- clans[homo, , drop = FALSE] lhg <- rep(TRUE, l) rsh <- rowSums(HG) Z <- tcrossprod(HG)>0 Z <- Z * rsh zmax <- apply(Z,2,max) lhg <- !(zmax > rsh) LHG <- HG[lhg, , drop = FALSE] return(LHG) } return(NULL) } getDiv <- function(tree, x, native=NULL){ clans <- getClans(tree) labels <- tree$tip.label x <- subset(x, labels) LHG <- E_Intruder_2(clans, subset(x,,1)) if(!is.null(native)){ ll <- match(native, attr(x, "allLevels")) ind <- (as.numeric(x) %in% ll) } if(!is.null(native)){ rs <- rowSums(clans) intr <- clans %*% ind clans <- clans[intr==0,] d <- which.max(rs[intr==0]) tree2 <- drop.tip(tree, tip=labels[which(clans[d, ]==1)]) } else tree2 <- NULL list(c(shannon(rowSums(LHG)), summary(factor(attr(x, "allLevels"))[as.numeric(subset(x,,1))]), parsimony(tree, x)), tree2 ) } #' @rdname getClans #' @export getDiversity <- function (tree, x, norm = TRUE, var.names = NULL, labels="new") { k <- 1 if(inherits(tree,"multiPhylo")) k <- length(tree) l <- attr(x, "nr") tmp <- matrix(0, k * l, 12) tnam <- 1 if (inherits(tree,"multiPhylo")) { tnam <- names(tree) if (is.null(tnam)) tnam <- seq_along(tree) } if(is.null(var.names)) var.names <- 1:l PM <- data.frame("t1", "a", stringsAsFactors = FALSE) colnames(PM) <- c("Tree", "Var") PM <- PM[FALSE,] PM[1 :(k*l), ] <- NA # perfect <- names(x) L <- vector("list",k*l) m <- 1 # o <- 1 # ok <- 0 for (i in 1:k) { if (inherits(tree,"multiPhylo")) tmptree <- tree[[i]] else tmptree <- tree if (is.rooted(tmptree)) tmptree <- unroot(tmptree) clans <- getClans(tmptree) for (j in 1:l) { TMP <- getE(tmptree, getRows(x, j), clans, norm = norm) tmp[m, ] <- TMP[[1]] L[[m]] <- TMP[[2]] # if class =splits else NULL PM[m, 1] <- tnam[i] PM[m, 2] <- var.names[j] m <- m + 1 } } tnam <- rep(tnam, each = l) dnam <- var.names dnam <- rep(dnam, k) pscore <- as.numeric(sankoff(tree, x, site = "site")) res <- data.frame(tnam, dnam, tmp, pscore) if(labels=="old")names(res) <- c("tree", "variable", "E tree", "# natives", "# intruder", "# unknown", "E clan", "# intruder", "# unknown", "E slice", "# intruder", "# unknown", "bs 1", "bs 2", "p-score") else{ names(res) <- c("tree", "variable", "E clan", "# natives", "# intruder", "# unknown", "E slice", "# intruder", "# unknown", "E melange", "# intruder", "# unknown", "bs 1", "bs 2", "p-score") warning("The variable names have changed") } attr(res, "Perfect") <- L class(res) <- c("clanistics", "data.frame") res } #' @rdname getClans #' @export summary.clanistics <- function(object, ...){ res <- matrix(FALSE, nrow(object), 5) res[,1] <- object[,4]>0 & object[,"p-score"]==0 # "natives" res[,2] <- object[,5]>0 & object[,"p-score"]==0 # "intruder" res[,3] <- object[,"p-score"]==1 res[,4] <- ( (object[,"p-score"]==2) & (object[,7]==0) & (!is.na(object[,7])) ) | ( (object[,"p-score"]==2) & (object[,4]==2) & (is.na(object[,7])) ) res[,5] <- object[,"p-score"]>=2 & (object[,7]>0) & (!is.na(object[,7])) res[] <- as.numeric(res) tmp <- data.frame(factor(object[,"variable"]), res) colnames(tmp) <- c("Variable", "Natives_only", "Intruder_only", "Clan", "Slice", "Melange") # colnames(res) = c("Natives only", "Intruder only", "Clan", "Melange") class(tmp) <- c("summary.clanistics", "data.frame") tmp } #' @export print.summary.clanistics <- function(x, ...){ print(aggregate(x[,-1], list(Variable=x[,1]), sum), ...) } compareSplits <- function(res, nam1, nam2){ wide <- reshape(res[, c("tree", "E tree", "variable")], v.names="E tree", idvar="tree", timevar="variable", direction="wide") wideI <- reshape(res[, c("tree", "# natives", "variable")], v.names="# natives", idvar="tree", timevar="variable", direction="wide") for(i in 2:dim(wide)[2]) colnames(wide)[i] <- strsplit(colnames(wide)[i],"E tree.")[[1]][2] for(i in 2:dim(wide)[2]) colnames(wideI)[i] <- strsplit(colnames(wideI)[i],"# natives.")[[1]][2] ntrees <- wide[,1] splits <- attr(res, "Perfect") dat <- attr(attr(res, "Perfect"), "data") res <- matrix(NA, length(ntrees), length(nam1)*length(nam2)) for(m in 1:ntrees){ k <- 1 trnam <- ntrees[m] for(i in nam1){ E1 <- wide[m, i] for(j in nam2){ E2 <- wide[m, j] if(!is.na(E1) & !is.na(E2)){ if(E1 == E2){ # if(E1 == 0 & E2 == 0){ if( (wideI[m, i] >0) & (wideI[m, j]) >0){ ind1 <- which(dat[,1]==trnam & dat[,2]==i) sp1 <- splits[[ind1]] ind2 <- which(dat[,1]==trnam & dat[,2]==j) sp2 <- splits[[ind2]] if(length(ind1)>0 & length(ind2)>0 ) res[m, k] <- drop(compatible3(sp1, sp2)) } } } k <- k+1 } } } res } #' @rdname getClans #' @export diversity <- function(tree, X){ # from kknn contr.dummy <- function (n, contrasts = TRUE) { if (length(n) <= 1) { if (is.numeric(n) && length(n) == 1 && n > 1) levels <- 1:n else stop("contrasts are not defined for 0 degrees of freedom") } else levels <- n lenglev <- length(levels) cont <- array(0, c(lenglev, lenglev), list(levels, levels)) cont[col(cont) == row(cont)] <- 1 cont } l <- dim(X)[2] m <- ifelse(inherits(tree,"multiPhylo"), length(tree), 1) contr <- as.list(rep("contr.dummy", l)) names(contr) <- names(X) tmp <- model.matrix(~.-1, X, contrast=contr) tmp1 <- phyDat.default(tmp, levels=c(1,0), compress = FALSE) attr(tmp1, "varnames") <- colnames(tmp) fd <- sankoff(tree,tmp1,site = "site") fd <- matrix(fd, ncol=m) if(m>1){ if(is.null(names(tree))) tnames <- paste("tree", 1:m, sep=".") else tnames <- names(tree) } else tnames <- "tree" dimnames(fd) <- list(colnames(tmp), tnames) res <- stack(data.frame(fd)) if(m>1)nt <- rep(sapply(tree, function(x)length(x$tip.label)), each=dim(fd)[1]) else nt <- rep(length(tree$tip.label), each=dim(fd)[1]) if(m>1)res2 <- as.vector(sapply(tree, function(x,y) colSums(y[x$tip.label,,drop=FALSE]) , y=tmp)) else res2 <- colSums(tmp[tree$tip.label,,drop=FALSE]) result <- data.frame(tree = res[,2], variable=rep(colnames(tmp),m), pscore=res[,1], ntips=nt, natives=res2) result } phangorn/R/cladePar.R0000644000176200001440000000335213475602650014140 0ustar liggesusers#' Utility function to plot.phylo #' #' cladePar can help you coloring (choosing edge width/type) of clades. #' #' #' @param tree an object of class phylo. #' @param node the node which is the common ancestor of the clade. #' @param edge.color see plot.phylo. #' @param tip.color see plot.phylo. #' @param edge.width see plot.phylo. #' @param edge.lty see plot.phylo. #' @param x the result of a previous call to cladeInfo. #' @param plot logical, if TRUE the tree is plotted. #' @param \dots Further arguments passed to or from other methods. #' @return A list containing the information about the edges and tips. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{plot.phylo}} #' @keywords plot #' @examples #' #' tree <- rtree(10) #' plot(tree) #' nodelabels() #' x <- cladePar(tree, 12) #' cladePar(tree, 18, "blue", "blue", x=x, plot=TRUE) #' #' @export cladePar cladePar <- function(tree, node, edge.color = "red", tip.color = edge.color, edge.width = 1, edge.lty = 1, x = NULL, plot = FALSE, ...) { if (is.null(x)) { m <- max(tree$edge) x <- list( edge = data.frame( color = rep("black", m), width = rep(1, m), lty = rep(1, m), stringsAsFactors = FALSE ), tip = rep("black", length(tree$tip.label)) ) } ind <- Descendants(tree, node, "all") x$edge$color[ind] <- edge.color x$edge$width[ind] <- edge.width x$edge$lty[ind] <- edge.lty x[[2]][Descendants(tree, node, "tips")[[1]]] <- tip.color if (plot) { tree <- reorder(tree) plot(tree, edge.color = x$edge$color[tree$edge[, 2]], edge.width = x$edge$width[tree$edge[, 2]], edge.lty = x$edge$lty[tree$edge[, 2]], tip.color = x[[2]], ... ) } else { return(x) } } phangorn/R/hadamard.R0000644000176200001440000002047413475602650014172 0ustar liggesusersdec2Bin <- function(x) { res <- NULL i <- 1L while (x > 0) { if (x %% 2L) res <- c(res, i) x <- x %/% 2L i <- i + 1L } res } # returns binary (0, 1) vector of length k dec2bin <- function(x, k = ceiling(log2(x))) { i <- 1L res <- integer(k) while (x > 0) { if (x %% 2L) res[i] <- 1L x <- x %/% 2L i <- i + 1L } res } # double factorial: log version #' @rdname dfactorial #' @export ldfactorial <- function(x) { x <- (x + 1) / 2 res <- lgamma(2 * x) - (lgamma(x) + (x - 1) * log(2)) res } # double factorial #' Arithmetic Operators #' #' double factorial function #' #' #' @param x a numeric scalar or vector #' @return \code{dfactorial(x)} returns the double factorial, that is #' \eqn{x\!\! = 1 * 3 * 5 * \ldots * x } and \code{ldfactorial(x)} is the #' natural logarithm of it. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[base:Special]{factorial}}, #' \code{\link[ape]{howmanytrees}} #' @keywords classif #' @examples #' #' dfactorial(1:10) #' #' @rdname dfactorial #' @export dfactorial "dfactorial" <- function(x) exp(ldfactorial(x)) # # Hadamard Conjugation # ### @aliases hadamard fhm h4st h2st #' Hadamard Matrices and Fast Hadamard Multiplication #' #' A collection of functions to perform Hadamard conjugation. %Hv of a #' Hadamard matrix H with a vector v using fast Hadamard multiplication. #' #' \code{h2st} and \code{h4st} perform Hadamard conjugation for 2-state #' (binary, RY-coded) or 4-state (DNA/RNA) data. \code{write.nexus.splits} #' writes splits returned from \code{h2st} or #' \code{\link[phangorn]{distanceHadamard}} to a nexus file, which can be #' processed by Spectronet or Splitstree. #' #' @param x a vector of length \eqn{2^n}, where n is an integer. #' @param v a vector of length \eqn{2^n}, where n is an integer. #' @param obj a data.frame or character matrix, typical a sequence alignment. #' @param eps Threshold value for splits. #' @param levels levels of the sequences. #' @return \code{hadamard} returns a Hadamard matrix. \code{fhm} returns the #' fast Hadamard multiplication. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{distanceHadamard}}, \code{\link{lento}}, #' \code{\link{plot.networx}} #' @references Hendy, M.D. (1989). The relationship between simple evolutionary #' tree models and observable sequence data. \emph{Systematic Zoology}, #' \bold{38} 310--321. #' #' Hendy, M. D. and Penny, D. (1993). Spectral Analysis of Phylogenetic Data. #' \emph{Journal of Classification}, \bold{10}, 5--24. #' #' Hendy, M. D. (2005). Hadamard conjugation: an analytical tool for #' phylogenetics. In O. Gascuel, editor, \emph{Mathematics of evolution and #' phylogeny}, Oxford University Press, Oxford #' #' Waddell P. J. (1995). Statistical methods of phylogenetic analysis: #' Including hadamard conjugation, LogDet transforms, and maximum likelihood. #' \emph{PhD thesis}. #' @keywords cluster #' @examples #' #' H <- hadamard(3) #' v <- 1:8 #' H %*% v #' fhm(v) #' #' data(yeast) #' #' # RY-coding #' dat_ry <- acgt2ry(yeast) #' fit2 <- h2st(dat_ry) #' lento(fit2) #' #' # write.nexus.splits(fit2, file = "test.nxs") #' # read this file into Spectronet or Splitstree to show the network #' \dontrun{ #' dat <- as.character(yeast) #' dat4 <- phyDat(dat, type="USER", levels=c("a","c", "g", "t"), ambiguity=NULL) #' fit4 <- h4st(dat4) #' #' par(mfrow=c(3,1)) #' lento(fit4[[1]], main="Transversion") #' lento(fit4[[2]], main="Transition 1") #' lento(fit4[[3]], main="Transition 2") #' } #' #' @rdname hadamard #' @export hadamard hadamard <- function(x) { res <- 1 while (x > 0) { res <- rbind(cbind(res, res), cbind(res, -res)) x <- x - 1 } res } #' @rdname hadamard #' @export fhm <- function(v) { n <- length(v) n <- log2(n) res <- .C("C_fhm", v = as.double(v), n = as.integer(n))$v # res } seq2split <- function(s) { n <- length(s) res <- fhm(log(fhm(s))) / n res } split2seq <- function(q) { n <- length(q) res <- fhm(exp(fhm(q))) / n res } #' Distance Hadamard #' #' Distance Hadamard produces spectra of splits from a distance matrix. #' #' #' @param dm A distance matrix. #' @param eps Threshold value for splits. #' @return \code{distanceHadamard} returns a matrix. The first column contains #' the distance spectra, the second one the edge-spectra. If eps is positive an #' object of with all splits greater eps is returned. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com}, Tim White #' @seealso \code{\link{hadamard}}, \code{\link{lento}}, #' \code{\link{plot.networx}}, \code{\link{neighborNet}} #' @references Hendy, M. D. and Penny, D. (1993). Spectral Analysis of #' Phylogenetic Data. \emph{Journal of Classification}, \bold{10}, 5-24. #' @keywords cluster #' @examples #' #' data(yeast) #' dm <- dist.hamming(yeast) #' dm <- as.matrix(dm) #' fit <- distanceHadamard(dm) #' lento(fit) #' plot(as.networx(fit), "2D") #' #' @export distanceHadamard distanceHadamard <- function(dm, eps = 0.001) { if (inherits(dm, "dist")) { n <- attr(dm, "Size") Labels <- attr(dm, "Labels") } if (inherits(dm, "matrix")) { n <- dim(dm)[1] Labels <- colnames(dm) dm <- dm[lower.tri(dm)] } ns <- 2^(n - 1) if (n > 23) stop("Hadamard conjugation works only efficient for n < 24") result <- .Call("dist2spectra", dm, as.integer(n), as.integer(ns), PACKAGE = "phangorn") weights <- -fhm(result) / 2^(n - 2) if (eps > 0) { weights <- weights[-1] ind2 <- which(weights > eps) n2 <- length(ind2) splits <- vector("list", n2) for (i in 1:n2) splits[[i]] <- dec2Bin(ind2[i]) attr(splits, "weights") <- weights[ind2] attr(splits, "labels") <- Labels attr(splits, "dm") <- dm class(splits) <- "splits" return(splits) } res <- data.frame(distance = result, edges = weights, index = 0:(ns - 1)) attr(res, "Labels") <- Labels res } #' @rdname hadamard #' @export h4st <- function(obj, levels = c("a", "c", "g", "t")) { if (is.matrix(obj)) obj <- as.data.frame(t(obj)) if (inherits(obj, "phyDat")) obj <- as.data.frame(t(as.character(obj))) n <- dim(obj)[1] p <- dim(obj)[2] if (p > 11) stop("4-state Hadamard conjugation works only efficient for n < 12") DNAX <- matrix(0, n, p) DNAY <- matrix(0, n, p) DNAX[obj == levels[1]] <- 0 DNAX[obj == levels[2]] <- 1 DNAX[obj == levels[3]] <- 1 DNAX[obj == levels[4]] <- 0 DNAY[obj == levels[1]] <- 0 DNAY[obj == levels[2]] <- 1 DNAY[obj == levels[3]] <- 0 DNAY[obj == levels[4]] <- 1 DNAY <- DNAY - DNAY[, p] DNAX <- DNAX - DNAX[, p] DNAY <- abs(DNAY[, -p]) DNAX <- abs(DNAX[, -p]) dy <- DNAY %*% (2^(0:(p - 2))) dx <- DNAX %*% (2^(0:(p - 2))) INDEX <- dx + 2^(p - 1) * dy blub <- table(INDEX) index <- as.numeric(rownames(blub)) + 1 sv <- numeric(4^(p - 1)) sv[index] <- blub qv <- matrix(seq2split(sv), 2^(p - 1), 2^(p - 1)) sv <- matrix(sv, 2^(p - 1), 2^(p - 1)) transversion <- transition.1 <- transition.2 <- allSplits(p, colnames(obj)) attr(transversion, "weights") <- qv[-1, 1] attr(transition.1, "weights") <- diag(qv)[-1] attr(transition.2, "weights") <- qv[1, -1] result <- list(transversion = transversion, transition.1 = transition.1, transition.2 = transition.2, qv = qv, sv = sv, n = sum(sv), names = names(obj)) result } #' @rdname hadamard #' @export h2st <- function(obj, eps = 0.001) { if (!inherits(obj, "phyDat")) stop("Error") if (attr(obj, "nc") != 2) stop("Error") nr <- attr(obj, "nr") # n p <- length(obj) # p weight <- attr(obj, "weight") if (p > 23) stop("Hadamard conjugation works only efficient for n < 24") DNAX <- matrix(0, nr, p - 1) for (i in 1:(p - 1)) DNAX[, i] <- obj[[i]] - 1 DNAX[obj[[p]] == 2, ] <- 1 - DNAX[obj[[p]] == 2, ] index <- DNAX %*% (2^(0:(p - 2))) + 1 sv <- numeric(2^(p - 1)) for (i in 1:nr) sv[index[i]] <- sv[index[i]] + weight[i] qv <- seq2split(sv) if (eps > 0) { qv <- qv[-1] ind2 <- which(qv > eps) indT <- c(2L^(0:(p - 2)), 2L^(p - 1) - 1) ind2 <- union(ind2, indT) n2 <- length(ind2) splits <- vector("list", n2) for (i in 1:n2) splits[[i]] <- dec2Bin(ind2[i]) attr(splits, "weights") <- qv[ind2] attr(splits, "labels") <- names(obj) class(splits) <- "splits" return(splits) } result <- data.frame(edges = qv, splits = sv, index = 0:(2^(p - 1) - 1)) attr(result, "Labels") <- names(obj) result } phangorn/R/utils.R0000644000176200001440000000007313475602650013562 0ustar liggesusers#' @importFrom magrittr %>% #' @export magrittr::'%>%' phangorn/R/bootstrap.R0000644000176200001440000003414113475602650014442 0ustar liggesuserscandidate.tree <- function(x){ tree <- random.addition(x) tree <- optim.parsimony(tree, x) tree <- multi2di(tree) tree <- unroot(tree) tree <- acctran(tree, x) tree$edge.length <- tree$edge.length / sum(attr(x, "weight")) tree } #' Bootstrap #' #' \code{bootstrap.pml} performs (non-parametric) bootstrap analysis and #' \code{bootstrap.phyDat} produces a list of bootstrapped data sets. #' \code{plotBS} plots a phylogenetic tree with the with the bootstrap values #' assigned to the (internal) edges. #' #' It is possible that the bootstrap is performed in parallel, with help of the #' multicore package. Unfortunately the multicore package does not work under #' windows or with GUI interfaces ("aqua" on a mac). However it will speed up #' nicely from the command line ("X11"). #' #' @param x an object of class \code{pml} or \code{phyDat}. #' @param bs number of bootstrap samples. #' @param trees return trees only (default) or whole \code{pml} objects. #' @param multicore logical, whether models should estimated in parallel. #' @param mc.cores The number of cores to use during bootstrap. Only supported #' on UNIX-alike systems. #' @param jumble logical, jumble the order of the sequences. #' @param \dots further parameters used by \code{optim.pml} or #' \code{plot.phylo}. #' @param FUN the function to estimate the trees. #' @param tree The tree on which edges the bootstrap values are plotted. #' @param BStrees a list of trees (object of class "multiPhylo"). #' @param type the type of tree to plot, so far "cladogram", "phylogram" and #' "unrooted" are supported. #' @param bs.col color of bootstrap support labels. #' @param bs.adj one or two numeric values specifying the horizontal and #' vertical justification of the bootstrap labels. #' @param p only plot support values higher than this percentage number #' (default is 80). #' @param frame a character string specifying the kind of frame to be printed #' around the bootstrap values. This must be one of "none" (the default), #' "rect" or "circle". #' @return \code{bootstrap.pml} returns an object of class \code{multi.phylo} #' or a list where each element is an object of class \code{pml}. \code{plotBS} #' returns silently a tree, i.e. an object of class \code{phylo} with the #' bootstrap values as node labels. The argument \code{BStrees} is optional and #' if not supplied the tree with labels supplied in the \code{node.label} slot. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{optim.pml}}, \code{\link{pml}}, #' \code{\link{plot.phylo}}, #' \code{\link{nodelabels}},\code{\link{consensusNet}} and #' \code{\link{SOWH.test}} for parametric bootstrap #' @references Felsenstein J. (1985) Confidence limits on phylogenies. An #' approach using the bootstrap. \emph{Evolution} \bold{39}, 783--791 #' #' Penny D. and Hendy M.D. (1985) Testing methods evolutionary tree #' construction. \emph{Cladistics} \bold{1}, 266--278 #' #' Penny D. and Hendy M.D. (1986) Estimating the reliability of evolutionary #' trees. \emph{Molecular Biology and Evolution} \bold{3}, 403--417 #' @keywords cluster #' @examples #' #' \dontrun{ #' data(Laurasiatherian) #' dm <- dist.logDet(Laurasiatherian) #' tree <- NJ(dm) #' # NJ #' set.seed(123) #' NJtrees <- bootstrap.phyDat(Laurasiatherian, #' FUN=function(x)NJ(dist.logDet(x)), bs=100) #' treeNJ <- plotBS(tree, NJtrees, "phylogram") #' #' # Maximum likelihood #' fit <- pml(tree, Laurasiatherian) #' fit <- optim.pml(fit, rearrangement="NNI") #' set.seed(123) #' bs <- bootstrap.pml(fit, bs=100, optNni=TRUE) #' treeBS <- plotBS(fit$tree,bs) #' #' # Maximum parsimony #' treeMP <- pratchet(Laurasiatherian) #' treeMP <- acctran(treeMP, Laurasiatherian) #' set.seed(123) #' BStrees <- bootstrap.phyDat(Laurasiatherian, pratchet, bs = 100) #' treeMP <- plotBS(treeMP, BStrees, "phylogram") #' add.scale.bar() #' #' # export tree with bootstrap values as node labels #' # write.tree(treeBS) #' } #' #' @rdname bootstrap.pml #' @export bootstrap.pml <- function(x, bs = 100, trees = TRUE, multicore = FALSE, mc.cores = NULL, ...) { if (multicore && is.null(mc.cores)) { mc.cores <- detectCores() } extras <- match.call(expand.dots = FALSE)$... rearr <- c("optNni", "rearrangement") tmp <- pmatch(names(extras), rearr) do_rearr <- FALSE if(!is.na(tmp)){ if(tmp==1){ do_rearr <- extras$optNni if(is.name(do_rearr)) do_rearr <- as.logical(as.character(do_rearr)) } if(tmp==2) do_rearr <- extras$rearrangement %in% c("NNI", "stochastic", "ratchet") } is_ultrametric <- FALSE tmp <- pmatch("optRooted", names(extras)) if(!is.na(tmp)){ is_ultrametric <- extras$optRooted } data <- x$data weight <- attr(data, "weight") v <- rep(seq_along(weight), weight) ntips <- Ntip(x$tree) BS <- vector("list", bs) for (i in 1:bs) BS[[i]] <- tabulate( sample(v, replace = TRUE), length(weight) ) pmlPar <- function(weights, fit, trees = TRUE, do_rearr, ...) { data <- fit$data tree <- fit$tree ind <- which(weights > 0) data <- getRows(data, ind) attr(data, "weight") <- weights[ind] fit <- update(fit, data = data) if(do_rearr){ if(is_ultrametric){ tree <- dist.ml(data, bf=fit$bf, Q=fit$Q) %>% wpgma() } else tree <- candidate.tree(data) fit <- update(fit, tree = tree) } fit <- optim.pml(fit, ...) if (trees) { tree <- fit$tree return(tree) } attr(fit, "data") <- NULL fit } eval.success <- FALSE if (!eval.success & multicore) { res <- mclapply(BS, pmlPar, x, trees = trees, do_rearr = do_rearr, ..., mc.cores = mc.cores) eval.success <- TRUE } if (!eval.success) res <- lapply(BS, pmlPar, x, trees = trees, do_rearr = do_rearr, ...) if (trees) { class(res) <- "multiPhylo" res <- .compressTipLabel(res) # save memory } res } #' @rdname bootstrap.pml #' @export bootstrap.phyDat <- function(x, FUN, bs = 100, multicore = FALSE, mc.cores = NULL, jumble = TRUE, ...) { if (multicore && is.null(mc.cores)) { mc.cores <- detectCores() } weight <- attr(x, "weight") v <- rep(seq_along(weight), weight) BS <- vector("list", bs) for (i in 1:bs) BS[[i]] <- tabulate(sample(v, replace = TRUE), length(weight)) if (jumble) { J <- vector("list", bs) l <- length(x) for (i in 1:bs) J[[i]] <- list(BS[[i]], sample(l)) } fitPar <- function(weights, data, ...) { ind <- which(weights > 0) data <- getRows(data, ind) attr(data, "weight") <- weights[ind] FUN(data, ...) } fitParJumble <- function(J, data, ...) { ind <- which(J[[1]] > 0) data <- getRows(data, ind) attr(data, "weight") <- J[[1]][ind] data <- subset(data, J[[2]]) FUN(data, ...) } if (multicore) { if (jumble) { res <- mclapply(J, fitParJumble, x, ..., mc.cores = mc.cores) } else { res <- mclapply(BS, fitPar, x, ..., mc.cores = mc.cores) } } else { if (jumble) { res <- lapply(J, fitParJumble, x, ...) } else { res <- lapply(BS, fitPar, x, ...) } } if (class(res[[1]]) == "phylo") { class(res) <- "multiPhylo" res <- .compressTipLabel(res) # save memory } res } matchEdges <- function(tree1, tree2) { bp1 <- bip(tree1) bp2 <- bip(tree2) l <- length(tree1$tip.label) fn <- function(x, y) { if (x[1] == 1) { return(x) } else { return(y[-x]) } } bp1[] <- lapply(bp1, fn, 1:l) bp2[] <- lapply(bp2, fn, 1:l) match(bp1, bp2) } checkLabels <- function(tree, tip) { ind <- match(tip, tree$tip.label) if (any(is.na(ind)) | length(tree$tip.label) != length(tip)) { stop("tree has different labels") } tree$tip.label <- tree$tip.label[ind] ind2 <- match(seq_along(ind), tree$edge[, 2]) tree$edge[ind2, 2] <- order(ind) tree } #' @rdname bootstrap.pml #' @export plotBS <- function(tree, BStrees, type = "unrooted", bs.col = "black", bs.adj = NULL, p = 50, frame = "none", ...) { type <- match.arg(type, c("phylogram", "cladogram", "fan", "unrooted", "radial", "none")) if (hasArg(BStrees)) { BStrees <- .uncompressTipLabel(BStrees) # check if needed if (any(is.rooted(BStrees))) BStrees <- unroot(BStrees) x <- prop.clades(tree, BStrees) x <- (x / length(BStrees)) * 100 tree$node.label <- x } else { if (is.null(tree$node.label)) stop("You need to supply 'trees' or the tree needs support-values as node.label") x <- tree$node.label } if(type=="none") return( tree ) # if (type == "phylogram" | type == "cladogram") { # if (!is.rooted(tree) & !is.null(tree$edge.length)) { # tree2 <- midpoint(tree) # } else { # tree2 <- tree # } # plot(tree2, type = type, ...) # } # else { plot(tree, type = type, ...) # } label <- c(rep(0, length(tree$tip.label)), x) ind <- get("last_plot.phylo", envir = .PlotPhyloEnv)$edge[ ,2 ] if (type == "phylogram" | type == "cladogram") { root <- getRoot(tree) label <- c(rep(0, length(tree$tip.label)), x) label[root] <- 0 # ind2 <- matchEdges(tree2, tree) # label <- label[ind2] ind <- which(label > p) # browser() if (is.null(bs.adj)) { bs.adj <- c(1, 1) } if (length(ind) > 0) { if(is.numeric(label)) label <- round(label) nodelabels( text = label[ind], node = ind, frame = frame, col = bs.col, adj = bs.adj, ... ) } } else { if (is.null(bs.adj)) { bs.adj <- c(0.5, 0.5) } ind2 <- which(label[ind] > p) if (length(ind2 > 0)) { if(is.numeric(label)) label <- round(label) edgelabels(label[ind][ind2], ind2, frame = frame, col = bs.col, adj = bs.adj, ... ) } } invisible(tree) } #' Maximum clade credibility tree #' #' \code{maxCladeCred} computes the maximum clade credibility tree from a #' sample of trees. #' #' So far just the best tree is returned. No annotations or transformations of #' edge length are performed. #' #' If a list of partition is provided then the clade credibility is computed #' for the trees in x. #' #' \code{allCompat} returns a 50% majority rule consensus tree with added #' compatible splits similar to the option allcompat in MrBayes. #' #' @param x \code{x} is an object of class \code{multiPhylo} or \code{phylo} #' @param tree logical indicating whether return the tree with the clade #' credibility (default) or the clade credibility score for all trees. #' @param rooted logical, if FALSE the tree with highest maximum bipartition #' credibility is returned. #' @param part a list of partitions as returned by \code{prop.part} #' @return a tree (an object of class \code{phylo}) with the highest clade #' credibility or a numeric vector of clade credibilities for each tree. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{consensus}}, \code{\link{consensusNet}}, #' \code{\link{prop.part}} #' @keywords cluster #' @importFrom fastmatch fmatch #' @examples #' #' #' data(Laurasiatherian) #' set.seed(42) #' bs <- bootstrap.phyDat(Laurasiatherian, #' FUN = function(x)upgma(dist.hamming(x)), bs=100) #' #' strict_consensus <- consensus(bs) #' majority_consensus <- consensus(bs, p=.5) #' all_compat <- allCompat(bs) #' max_clade_cred <- maxCladeCred(bs) #' par(mfrow = c(2,2), mar = c(1,4,1,1)) #' plot(strict_consensus, main="Strict consensus tree") #' plot(majority_consensus, main="Majority consensus tree") #' plot(all_compat, main="Majority consensus tree with compatible splits") #' plot(max_clade_cred, main="Maximum clade credibility tree") #' #' # compute clade credibility for trees given a prop.part object #' pp <- prop.part(bs) #' tree <- rNNI(bs[[1]], 20) #' maxCladeCred(c(tree, bs[[1]]), tree=FALSE, part = pp) #' # first value likely be -Inf #' #' @rdname maxCladeCred #' @export maxCladeCred <- function(x, tree = TRUE, part = NULL, rooted = TRUE) { if (inherits(x, "phylo")) x <- c(x) if (is.null(part)) { if (!rooted) { pp <- unroot(x) %>% prop.part() } else { pp <- prop.part(x) } } else { pp <- part } pplabel <- attr(pp, "labels") if (!rooted) pp <- oneWise(pp) x <- .uncompressTipLabel(x) class(x) <- NULL m <- max(attr(pp, "number")) nb <- log(attr(pp, "number") / m) l <- length(x) res <- numeric(l) for (i in 1:l) { tmp <- checkLabels(x[[i]], pplabel) if (!rooted) tmp <- unroot(tmp) ppi <- prop.part(tmp) # trees[[i]] if (!rooted) ppi <- oneWise(ppi) indi <- fmatch(ppi, pp) if (any(is.na(indi))) { res[i] <- -Inf } else { res[i] <- sum(nb[indi]) } } if (tree) { k <- which.max(res) tr <- x[[k]] attr(tr, "clade.credibility") <- res[k] return(tr) } res } #' @rdname maxCladeCred #' @export mcc <- maxCladeCred #' @rdname maxCladeCred #' @export allCompat <- function(x) { x <- unroot(x) l <- length(x) spl <- prop.part(x) spl <- postprocess.prop.part(spl) spl <- as.splits(spl) w <- attr(spl, "weights") ind <- (w / l) > 0.5 res <- spl[ind] spl <- spl[!ind] w <- attr(spl, "weights") ord <- order(w, decreasing = TRUE) for(i in ord){ if(all(compatible2(res, spl[i]) == 0)) res <- c(res, spl[i]) } tree <- as.phylo(res, FALSE) # tree$edge.length <- NULL tree } cladeMatrix <- function(x, rooted = FALSE) { if (!rooted) x <- unroot(x) pp <- prop.part(x) pplabel <- attr(pp, "labels") if (!rooted) pp <- oneWise(pp) x <- .uncompressTipLabel(x) nnodes <- Nnode(x) class(x) <- NULL # nnodes <- sapply(x, Nnode) l <- length(x) from <- cumsum(c(1, nnodes[-l])) to <- cumsum(nnodes) ivec <- integer(to[l]) pvec <- c(0, to) res <- vector("list", l) k <- 1 for (i in 1:l) { ppi <- prop.part(x[[i]]) if (!rooted) ppi <- oneWise(ppi) indi <- sort(fmatch(ppi, pp)) ivec[from[i]:to[i]] <- indi } X <- sparseMatrix(i = ivec, p = pvec, dims = c(length(pp), l)) list(X = X, prop.part = pp) } moving_average <- function(obj, window = 50) { fun <- function(x) { cx <- c(0, cumsum(x)) (cx[(window + 1):length(cx)] - cx[1:(length(cx) - window)]) / (window) } res <- apply(obj$X, 1, fun) rownames(res) <- c() } phangorn/R/discrete.gamma.R0000644000176200001440000001443013501600064015272 0ustar liggesusers#' Discrete Gamma function #' #' \code{discrete.gamma} internally used for the likelihood computations in #' \code{pml} or \code{optim.pml}. It is useful to understand how it works #' for simulation studies or in cases where . #' #' These functions are exported to be used in different packages so far only in #' the package coalescentMCMC, but are not intended for end user. Most of the #' functions call C code and are far less forgiving if the import is not what #' they expect than \code{pml}. #' #' @param shape Shape parameter of the gamma distribution. #' @param alpha Shape parameter of the gamma distribution. #' @param k Number of intervals of the discrete gamma distribution. #' @param inv Proportion of invariable sites. #' @param discrete logical wether to plot discrete (default) or continous pdf or #' cdf. #' @param cdf logical wether to plot the cummulative distribution function #' or density / probability function. #' @param append logical; if TRUE only add to an existing plot. #' @param xlab a label for the x axis, defaults to a description of x. #' @param ylab a label for the y axis, defaults to a description of y. #' @param xlim the x limits of the plot. #' @param verticals ogical; if TRUE, draw vertical lines at steps. #' @param \dots Further arguments passed to or from other methods. #' @return \code{discrete.gamma} returns a matrix. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml.fit}, \link{stepfun}} #' @examples #' discrete.gamma(1, 4) #' #' par(mfrow = c(2,1)) #' #' plot_gamma_plus_inv(shape=2, discrete = FALSE, cdf=FALSE) #' plot_gamma_plus_inv(shape=2, append = TRUE, cdf=FALSE) #' #' plot_gamma_plus_inv(shape=2, discrete = FALSE) #' plot_gamma_plus_inv(shape=2, append = TRUE) #' #' par(mfrow = c(1,1)) #' #' @keywords cluster #' #' @rdname discrete.gamma #' @export discrete.gamma <- function(alpha, k) { if (k == 1) return(1) quants <- qgamma( (1:(k - 1)) / k, shape = alpha, rate = alpha) diff(c(0, pgamma(quants * alpha, alpha + 1), 1)) * k } discrete.beta <- function(shape1, shape2, k) { qbeta( ( (0:(k - 1)) + .5) / k, shape1, shape2) } #' @rdname discrete.gamma #' @importFrom stats dgamma qgamma stepfun #' @importFrom graphics curve #' @export plot_gamma_plus_inv <- function(shape=1, inv=0, k=4, discrete=TRUE, cdf=TRUE, append=FALSE, xlab = "x", ylab=ifelse(cdf, "F(x)", "f(x)"), xlim=NULL, verticals=FALSE, ...){ l <- max(lengths(list(shape, k, inv))) if(l>1){ shape <- rep_len(shape, l) k <- rep_len(k, l) inv <- rep_len(inv, l) verticals <- rep_len(verticals, l) } gw <- function(shape, k, inv){ w <- rep(1/k, k) g <- discrete.gamma(shape, k) if (inv > 0){ w <- c(inv, (1 - inv) * w) g <- c(0, g/(1 - inv)) } cbind(w=w, g=g) } g <- mapply(function(shape, k, inv) max(gw(shape, k, inv)[,"g"]), shape, k, inv) %>% max() if(is.null(xlim)) xlim <- c(-0.25, 1.25 * g) cdf_fun <- function(x, shape=1, inv=0){ if(inv > 0) x <- x * (1-inv) y <- (1-inv) * pgamma(x, shape = shape, rate = shape) + inv y[x<0] <- 0 y } density_fun <- function(x, shape, inv){ if(inv > 0) x <- x * (1-inv) (1-inv) * dgamma(x, shape = shape, rate = shape) } step_GpI <- function(alpha=1, k=4, inv=0){ w <- rep(1/k, k) if (inv > 0) w <- c(inv, (1 - inv) * w) cw <- cumsum(w) g <- discrete.gamma(alpha, k) if (inv > 0) g <- c(0, g/(1 - inv)) stepfun(g, c(0, cw)) } plot_cdf_discrete <- function(shape=1, inv=0, k=4, verticals=FALSE, append=FALSE, ylab=ylab, xlim=xlim, ...){ sf <- step_GpI(shape, inv, k=k) if(append) plot(sf, verticals=verticals, add=TRUE, xlim=xlim, ...) else plot(sf, verticals=verticals, ylab=ylab, xlim=xlim, ...) } plot_density_discrete <- function(shape=1, inv=0, k=4, append=FALSE, xlab=xlab, ylab=ylab, xlim=xlim,...){ g_w <- gw(shape, k, inv) g <- g_w[, "g"] w <- g_w[, "w"] if(!append) plot(g, w, xlim = xlim, ylim=c(0, 1), type="n", xlab=xlab, ylab=ylab, ...) segments(g, 0, g, w, ...) points(g, w, ...) } plot_cdf_continuos <- function(shape=1, inv=0, k=4, verticals=FALSE, append=FALSE, ylab=ylab, xlim=xlim, ...){ if(inv==0){ if(!append) plot(function(x)cdf_fun(x, shape, inv), xlim[1], xlim[2], ylim=c(0, 1), xlab=xlab, ylab=ylab, ...) else plot(function(x)cdf_fun(x, shape, inv), add=TRUE, ...) } else{ g_w <- gw(shape, k, inv) g <- g_w[, "g"] w <- g_w[, "w"] if(!append) plot(g, w, xlim = xlim, #c(-.5, 1.25 * max(g)), ylim=c(0, 1), type="n", xlab=xlab, ylab=ylab, ...) plot(function(x)cdf_fun(x, shape, inv), xlim[1], -.001, add=TRUE, ...) plot(function(x)cdf_fun(x, shape, inv), 0, xlim[2], add=TRUE, ...) points(0, inv, ...) if(verticals) segments(0, 0, 0, inv, ...) } } plot_density_continuous <- function(shape=1, inv=0, k=4, append=FALSE, xlab=xlab, ylab=ylab, xlim=xlim, ...){ if(!append) plot(function(x)density_fun(x, shape = shape, inv=inv), xlim[1], xlim[2], xlab=xlab, ylab=ylab, ...) else{ plot(function(x)density_fun(x, shape = shape, inv=inv), xlim[1], xlim[2], add=TRUE, ...) } if(inv>0){ segments(0, 0, 0, inv, ...) points(0, inv, ...) } } i <- 1L while(l >= i ){ if(cdf){ if(discrete){ plot_cdf_discrete(shape[i], inv[i], k[i], verticals = verticals[i], append = append, ylab = ylab, xlim=xlim, ...) } else{ plot_cdf_continuos(shape[i], inv[i], k[i], verticals = verticals[i], append = append, ylab = ylab, xlim=xlim, ...) } } else{ if(discrete){ plot_density_discrete(shape[i], inv[i], k[i], append=append, xlab=xlab, ylab=ylab, xlim=xlim, ...) } else{ plot_density_continuous(shape[i], inv[i], k[i], append=append, xlab=xlab, ylab=ylab, xlim=xlim, ...) } } append <- TRUE i <- i+1L } } phangorn/R/lento.R0000644000176200001440000000600413475602650013543 0ustar liggesusers#' Lento plot #' #' The lento plot represents support and conflict of splits/bipartitions. #' #' #' @param obj an object of class phylo, multiPhylo or splits #' @param xlim graphical parameter #' @param ylim graphical parameter #' @param main graphical parameter #' @param sub graphical parameter #' @param xlab graphical parameter #' @param ylab graphical parameter #' @param bipart plot bipartition information. #' @param trivial logical, whether to present trivial splits (default is #' FALSE). #' @param col color for the splits / bipartition. #' @param \dots Further arguments passed to or from other methods. #' @return lento returns a plot. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{as.splits}, \link{hadamard}} #' @references Lento, G.M., Hickson, R.E., Chambers G.K., and Penny, D. (1995) #' Use of spectral analysis to test hypotheses on the origin of pinninpeds. #' \emph{Molecular Biology and Evolution}, \bold{12}, 28-52. #' @keywords cluster plot #' @examples #' #' data(yeast) #' yeast.ry <- acgt2ry(yeast) #' splits.h <- h2st(yeast.ry) #' lento(splits.h, trivial=TRUE) #' #' @export lento lento <- function(obj, xlim = NULL, ylim = NULL, main = "Lento plot", sub = NULL, xlab = NULL, ylab = NULL, bipart = TRUE, trivial = FALSE, col = rgb(0, 0, 0, .5), ...) { if (inherits(obj, "phylo")) { if (inherits(obj, "phylo", TRUE) == 1) obj <- as.splits(obj)[obj$edge[, 2]] obj <- as.splits(obj) } if (inherits(obj, "multiPhylo")) obj <- as.splits(obj) labels <- attr(obj, "labels") l <- length(labels) if (!trivial) { triv <- lengths(obj) ind <- logical(length(obj)) ind[(triv > 1) & (triv < (l - 1))] <- TRUE if (length(col) == length(obj)) col <- col[ind] obj <- obj[ind] } CM <- compatible(obj) support <- attr(obj, "weights") if (is.null(support)) support <- rep(1, length(obj)) conflict <- -as.matrix(CM) %*% support n <- length(support) if (is.null(ylim)) { eps <- (max(support) - min(conflict)) * 0.05 ylim <- c(min(conflict) - eps, max(support) + eps) } if (is.null(xlim)) { xlim <- c(0, n + 1) } ord <- order(support, decreasing = TRUE) support <- support[ord] conflict <- conflict[ord] if (length(col) == length(obj)) col <- col[ord] plot.new() plot.window(xlim, ylim) title(main = main, sub = sub, xlab = xlab, ylab = ylab, ...) segments(0:(n - 1), support, y1 = conflict, ...) segments(1:n, support, y1 = conflict, ...) segments(0:(n - 1), support, x1 = 1:n, ...) segments(0:(n - 1), conflict, x1 = 1:n, ...) abline(h = 0) axis(2, ...) aty <- diff(ylim) / (l + 1) at <- min(ylim) + (1:l) * aty if (bipart) { Y <- rep(at, n) X <- rep( (1:n) - .5, each = l) Circles <- matrix(1, l, n) for (i in 1:n) Circles[obj[[ord[i]]], i] <- 19 col <- rep(col, each = l) text(x = n + .1, y = at, labels, pos = 4, ...) points(X, Y, pch = as.numeric(Circles), col = col, ...) } invisible(list(support = cbind(support, conflict), splits = obj[ord])) } phangorn/R/ancestral_pml.R0000644000176200001440000003454213475602650015256 0ustar liggesusers# # ancestral sequences ML # #' Ancestral character reconstruction. #' #' Marginal reconstruction of the ancestral character states. #' #' The argument "type" defines the criterion to assign the internal nodes. For #' \code{ancestral.pml} so far "ml" and (empirical) "bayes" and for #' \code{ancestral.pars} "MPR" and "ACCTRAN" are possible. #' #' With parsimony reconstruction one has to keep in mind that there will be #' often no unique solution. #' #' For further details see vignette("Ancestral"). #' #' @param object an object of class pml #' @param tree a tree, i.e. an object of class pml #' @param data an object of class phyDat #' @param type method used to assign characters to internal nodes, see details. #' @param i plots the i-th site pattern of the \code{data}. #' @param col a vector containing the colors for all possible states. #' @param cex.pie a numeric defining the size of the pie graphs #' @param pos a character string defining the position of the legend #' @param cost A cost matrix for the transitions between two states. #' @param return return a \code{phyDat} object or matrix of probabilities. #' @param \dots Further arguments passed to or from other methods. #' @return %A matrix containing the the estimates character states. An object #' of class "phyDat", containing the ancestral states of all nodes. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}}, \code{\link{parsimony}}, \code{\link[ape]{ace}}, #' \code{\link[ape]{root}} #' @references Felsenstein, J. (2004). \emph{Inferring Phylogenies}. Sinauer #' Associates, Sunderland. #' #' Swofford, D.L., Maddison, W.P. (1987) Reconstructing ancestral character #' states under Wagner parsimony. \emph{Math. Biosci.} \bold{87}: 199--229 #' #' Yang, Z. (2006). \emph{Computational Molecular evolution}. Oxford University #' Press, Oxford. #' @keywords cluster #' @importFrom fastmatch fmatch #' @examples #' #' example(NJ) #' fit <- pml(tree, Laurasiatherian) #' anc.ml <- ancestral.pml(fit, type = "ml") #' anc.p <- ancestral.pars(tree, Laurasiatherian) #' \dontrun{ #' require(seqLogo) #' seqLogo( t(subset(anc.ml, 48, 1:20)[[1]]), ic.scale=FALSE) #' seqLogo( t(subset(anc.p, 48, 1:20)[[1]]), ic.scale=FALSE) #' } #' # plot the first site pattern #' plotAnc(tree, anc.ml, 1) #' # plot the third character #' plotAnc(tree, anc.ml, attr(anc.ml, "index")[3]) #' #' @rdname ancestral.pml #' @export ancestral.pml <- function(object, type = "marginal", return = "prob") { call <- match.call() pt <- match.arg(type, c("marginal", "joint", "ml", "bayes")) tree <- object$tree INV <- object$INV inv <- object$inv data <- getCols(object$data, tree$tip.label) data_type <- attr(data, "type") if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") { tree <- reorder(tree, "postorder") } nTips <- length(tree$tip.label) node <- tree$edge[, 1] edge <- tree$edge[, 2] m <- length(edge) + 1 # max(edge) w <- object$w g <- object$g l <- length(w) nr <- attr(data, "nr") nc <- attr(data, "nc") dat <- vector(mode = "list", length = m * l) result <- vector(mode = "list", length = m) dim(dat) <- c(l, m) x <- attributes(data) label <- as.character(1:m) nam <- tree$tip.label label[seq_along(nam)] <- nam x[["names"]] <- label tmp <- length(data) if (return != "phyDat") { result <- new2old.phyDat(data) } else { result[1:nTips] <- data } eig <- object$eig bf <- object$bf el <- tree$edge.length P <- getP(el, eig, g) nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) node <- as.integer(node - min(node)) edge <- as.integer(edge - 1) nTips <- as.integer(length(tree$tip.label)) mNodes <- as.integer(max(node) + 1) contrast <- attr(data, "contrast") # proper format eps <- 1.0e-5 ind1 <- which(apply(contrast, 1, function(x) sum(x > eps)) == 1L) ind2 <- which(contrast[ind1, ] > eps, arr.ind = TRUE) pos <- ind2[match(seq_len(ncol(contrast)), ind2[, 2]), 1] nco <- as.integer(dim(contrast)[1]) for (i in 1:l) dat[i, (nTips + 1):m] <- .Call("LogLik2", data, P[i, ], nr, nc, node, edge, nTips, mNodes, contrast, nco, PACKAGE = "phangorn" ) parent <- tree$edge[, 1] child <- tree$edge[, 2] nTips <- min(parent) - 1 # in C with scaling for (i in 1:l) { for (j in (m - 1):1) { if (child[j] > nTips) { tmp2 <- (dat[[i, parent[j]]] / (dat[[i, child[j]]] %*% P[[i, j]])) dat[[i, child[j]]] <- (tmp2 %*% P[[i, j]]) * dat[[i, child[j]]] } } } for (j in unique(parent)) { tmp <- matrix(0, nr, nc) if (inv > 0) tmp <- as.matrix(INV) * inv for (i in 1:l) { # scaling!!! tmp <- tmp + w[i] * dat[[i, j]] } if ((pt == "bayes") || (pt == "marginal")) tmp <- tmp * rep(bf, each = nr) tmp <- tmp / rowSums(tmp) if (return == "phyDat") { if (data_type == "DNA") { tmp <- p2dna(tmp) tmp <- fitchCoding2ambiguous(tmp) } else { tmp <- pos[max.col(tmp)] } } result[[j]] <- tmp } attributes(result) <- x attr(result, "call") <- call result } # joint_reconstruction <- function(object){ # # } # in mpr ancestral2phyDat <- function(x) { eps <- 1.0e-5 contr <- attr(x, "contrast") # a bit too complicated ind1 <- which(apply(contr, 1, function(x) sum(x > eps)) == 1L) ind2 <- which(contr[ind1, ] > eps, arr.ind = TRUE) # pos <- ind2[match(as.integer(1L:ncol(contr)), ind2[,2]),1] pos <- ind2[match(seq_len(ncol(contr)), ind2[, 2]), 1] # only first hit res <- lapply(x, function(x, pos) pos[max.col(x)], pos) attributes(res) <- attributes(x) return(res) } fitchCoding2ambiguous <- function(x, type = "DNA") { y <- c( 1L, 2L, 4L, 8L, 8L, 3L, 5L, 9L, 6L, 10L, 12L, 7L, 11L, 13L, 14L, 15L, 15L, 15L ) fmatch(x, y) } fitchCoding2ambiguous2 <- function(x, type = "DNA") { y <- c(1L, 2L, 4L, 8L, 8L, 3L, 5L, 9L, 6L, 10L, 12L, 7L, 11L, 13L, 14L, 15L) dna <- c( "a", "c", "g", "t", "t", "m", "r", "w", "s", "y", "k", "v", "h", "d", "b", "n" ) rna <- c( "a", "c", "g", "u", "u", "m", "r", "w", "s", "y", "k", "v", "h", "d", "b", "n" ) res <- switch(type, "DNA" = dna[fmatch(x, y)], "RNA" = rna[fmatch(x, y)] ) res } #' @rdname ancestral.pml #' @export ancestral.pars <- function(tree, data, type = c("MPR", "ACCTRAN"), cost = NULL, return = "prob") { call <- match.call() type <- match.arg(type) if (type == "ACCTRAN") { res <- ptree(tree, data, retData = TRUE)[[2]] } # if (type == "MPR") # res = mpr(tree, data) if (type == "MPR") { res <- mpr(tree, data, cost = cost, return = return) attr(res, "call") <- call return(res) } l <- length(tree$tip.label) data_type <- attr(data, "type") x <- attributes(data) m <- dim(res)[2] label <- as.character(1:m) nam <- tree$tip.label label[seq_along(nam)] <- nam x[["names"]] <- label nc <- attr(data, "nc") result <- vector("list", m) if (data_type == "DNA") { result[1:l] <- subset(data, nam) for (i in (l + 1):m) { result[[i]] <- fitchCoding2ambiguous(res[, i]) } # phyDat needs new2old <- # if(return=="prob") tmp <- contrast[tmp, , drop=FALSE] } else { Z <- unique(as.vector(res)) tmp <- t(vapply(Z, function(x) dec2bin(x, nc), integer(nc))) tmp <- tmp / rowSums(tmp) dimnames(tmp) <- list(Z, attr(data, "levels")) for (i in seq_len(m)) { result[[i]] <- tmp[as.character(res[, i]), , drop = FALSE] rownames(result[[i]]) <- NULL } } attributes(result) <- x attr(result, "call") <- call if (data_type != "DNA" & return == "phyDat") { contrast <- attr(data, "contrast") # proper format eps <- 1.0e-5 ind1 <- which(apply(contrast, 1, function(x) sum(x > eps)) == 1L) ind2 <- which(contrast[ind1, ] > eps, arr.ind = TRUE) # pos <- ind2[match(as.integer(1L:ncol(contrast)), ind2[,2]),1] pos <- ind2[match(seq_len(ncol(contrast)), ind2[, 2]), 1] result[1:l] <- subset(data, nam) for (i in (l + 1):length(result)) { tmp <- result[[i]] result[[i]] <- pos[max.col(tmp)] } } if (data_type == "DNA" & return == "prob") { result <- new2old.phyDat(result) for (i in seq_len(length(result))) { tmp <- result[[i]] tmp <- tmp / rowSums(tmp) result[[i]] <- tmp } } result } #' @rdname ancestral.pml #' @export pace <- ancestral.pars mpr.help <- function(tree, data, cost = NULL) { tree <- reorder(tree, "postorder") if (!inherits(data, "phyDat")) { stop("data must be of class phyDat") } levels <- attr(data, "levels") l <- length(levels) if (is.null(cost)) { cost <- matrix(1, l, l) cost <- cost - diag(l) } weight <- attr(data, "weight") p <- attr(data, "nr") kl <- TRUE i <- 1 dat <- prepareDataSankoff(data) for (i in seq_along(dat)) storage.mode(dat[[i]]) <- "double" tmp <- fit.sankoff(tree, dat, cost, returnData = "data") p0 <- tmp[[1]] datf <- tmp[[2]] datp <- pnodes(tree, datf, cost) nr <- attr(data, "nr") nc <- attr(data, "nc") node <- tree$edge[, 1] edge <- tree$edge[, 2] node <- as.integer(node - 1L) edge <- as.integer(edge - 1L) res <- .Call("sankoffMPR", datf, datp, as.numeric(cost), as.integer(nr), as.integer(nc), node, edge, PACKAGE = "phangorn" ) root <- getRoot(tree) res[[root]] <- datf[[root]] res } mpr <- function(tree, data, cost = NULL, return = "prob") { data <- subset(data, tree$tip.label) att <- attributes(data) type <- att$type nr <- att$nr nc <- att$nc res <- mpr.help(tree, data, cost) l <- length(tree$tip.label) m <- length(res) label <- as.character(1:m) nam <- tree$tip.label label[seq_along(nam)] <- nam att[["names"]] <- label ntips <- length(tree$tip.label) contrast <- att$contrast eps <- 5e-6 rm <- apply(res[[ntips + 1]], 1, min) RM <- matrix(rm, nr, nc) + eps fun <- function(X) { rs <- rowSums(X) # apply(X, 1, sum) X / rs } for (i in 1:ntips) res[[i]] <- contrast[data[[i]], , drop = FALSE] for (i in (ntips + 1):m) res[[i]][] <- as.numeric(res[[i]] < RM) if (return == "prob") { # for(i in 1:ntips) res[[i]] <- contrast[data[[i]],,drop=FALSE] if (return == "prob") res <- lapply(res, fun) } # else res[1:ntips] <- data[1:ntips] attributes(res) <- att fun2 <- function(x) { x <- p2dna(x) fitchCoding2ambiguous(x) } if (return != "prob") { if (type == "DNA") { res <- lapply(res, fun2) attributes(res) <- att } else { res <- ancestral2phyDat(res) } res[1:ntips] <- data } res } #' @rdname ancestral.pml #' @param site.pattern logical, plot i-th site pattern or i-th site #' @export plotAnc <- function(tree, data, i = 1, site.pattern = TRUE, col = NULL, cex.pie = par("cex"), pos = "bottomright", ...) { y <- subset(data, select = i, site.pattern = site.pattern) CEX <- cex.pie xrad <- CEX * diff(par("usr")[1:2]) / 50 levels <- attr(data, "levels") nc <- attr(data, "nc") y <- matrix(unlist(y[]), ncol = nc, byrow = TRUE) l <- dim(y)[1] dat <- matrix(0, l, nc) for (i in 1:l) dat[i, ] <- y[[i]] plot(tree, label.offset = 1.1 * xrad, plot = FALSE, ...) lastPP <- get("last_plot.phylo", envir = .PlotPhyloEnv) XX <- lastPP$xx YY <- lastPP$yy xrad <- CEX * diff(lastPP$x.lim * 1.1) / 50 par(new = TRUE) plot(tree, label.offset = 1.1 * xrad, plot = TRUE, ...) if (is.null(col)) col <- rainbow(nc) if (length(col) != nc) { warning("Length of color vector differs from number of levels!") } BOTHlabels( pie = y, XX = XX, YY = YY, adj = c(0.5, 0.5), frame = "rect", pch = NULL, sel = seq_along(XX), thermo = NULL, piecol = col, col = "black", bg = "lightblue", horiz = FALSE, width = NULL, height = NULL, cex = cex.pie ) if (!is.null(pos)) legend(pos, levels, text.col = col) } # # ACCTRAN # ptree <- function(tree, data, type = "ACCTRAN", retData = FALSE) { if (!inherits(data, "phyDat")) stop("data must be of class phyDat") if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") if (!is.binary(tree)) stop("Tree must be binary!") tmp <- fitch(tree, data, site = "data") nr <- attr(data, "nr") node <- tree$edge[, 1] edge <- tree$edge[, 2] weight <- attr(data, "weight") l <- as.integer(length(edge)) nTips <- length(tree$tip.label) dat <- tmp[[2]] if (!is.rooted(tree)) { root <- getRoot(tree) ind <- edge[node == root] rSeq <- .C("fitchTriplet", integer(nr), dat[, ind[1]], dat[, ind[2]], dat[, ind[3]], as.integer(nr)) dat[, root] <- rSeq[[1]] } result <- .C("ACCTRAN2", dat, as.integer(nr), as.integer(node[l:1L]), as.integer(edge[l:1L]), l, as.integer(nTips)) el <- result[[5]][l:1L] if (!is.rooted(tree)) { ind2 <- which(node[] == root) dat <- matrix(result[[1]], nr, max(node)) result <- .C("ACCTRAN3", result[[1]], as.integer(nr), numeric(nr), as.integer(node[(l - 3L):1L]), as.integer(edge[(l - 3L):1L]), l - 3L, as.double(weight), numeric(l)) # , as.integer(nTips) el <- result[[8]][(l - 3L):1L] pars <- .C("fitchTripletACC4", dat[, root], dat[, ind[1]], dat[, ind[2]], dat[, ind[3]], as.integer(nr), numeric(1), numeric(1), numeric(1), as.double(weight), numeric(nr), integer(nr)) el[ind2[1]] <- pars[[6]] el[ind2[2]] <- pars[[7]] el[ind2[3]] <- pars[[8]] } else { result <- .C("ACCTRAN3", result[[1]], as.integer(nr), numeric(nr), as.integer(node[l:1L]), as.integer(edge[l:1L]), l, as.double(weight), numeric(l)) # , as.integer(nTips) el <- result[[8]][l:1L] } tree$edge.length <- el if (retData) return(list(tree, matrix(result[[1]], nr, max(node)))) tree } #' @rdname parsimony #' @export acctran <- function(tree, data) { if (inherits(tree, "multiPhylo")) { compress <- FALSE if (!is.null(attr(tree, "TipLabel"))) compress <- TRUE res <- lapply(tree, ptree, data, type = "ACCTRAN", retData = FALSE) class(res) <- "multiPhylo" if (compress) res <- .compressTipLabel(res) return(res) } ptree(tree, data, type = "ACCTRAN", retData = FALSE) } #parsimony.plot <- function(tree, ...) { # x <- numeric(max(tree$edge)) # x[tree$edge[, 2]] <- tree$edge.length # plot(tree, ...) # ind <- get("last_plot.phylo", envir = .PlotPhyloEnv)$edge[, 2] # edgelabels(prettyNum(x[ind]), frame = "none") #} phangorn/R/modelTest.R0000644000176200001440000002355113475602650014370 0ustar liggesusersaic.weights <- function(aic) { diff.aic <- aic - min(aic) exp(-0.5 * diff.aic) / sum(exp(-0.5 * diff.aic)) } #' ModelTest #' #' Comparison of different nucleotide or amino acid substitution models #' #' \code{modelTest} estimates all the specified models for a given tree and #' data. When the mclapply is available, the computations are done in #' parallel. \code{modelTest} runs each model in one thread. This is may not #' work within a GUI interface and will not work under Windows. #' #' @aliases modelTest AICc #' @param object an object of class phyDat or pml #' @param tree a phylogenetic tree. #' @param model a vector containing the substitution models to compare with #' each other or "all" to test all available models #' @param G logical, TRUE (default) if (discrete) Gamma model should be tested #' @param I logical, TRUE (default) if invariant sites should be tested #' @param FREQ logical, FALSE (default) if TRUE amino acid frequencies will be #' estimated. #' @param k number of rate classes #' @param control A list of parameters for controlling the fitting process. #' @param multicore logical, whether models should estimated in parallel. #' @param mc.cores The number of cores to use, i.e. at most how many child #' processes will be run simultaneously. Must be at least one, and #' parallelization requires at least two cores. #' @return A data.frame containing the log-likelihood, number of estimated #' parameters, AIC, AICc and BIC all tested models. The data.frame has an #' attributes "env" which is an environment which contains all the trees, the #' data and the calls to allow get the estimated models, e.g. as a starting #' point for further analysis (see example). #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}}, \code{\link{anova}}, \code{\link[stats]{AIC}} #' @references Burnham, K. P. and Anderson, D. R (2002) \emph{Model selection #' and multimodel inference: a practical information-theoretic approach}. 2nd #' ed. Springer, New York #' #' Posada, D. and Crandall, K.A. (1998) MODELTEST: testing the model of DNA #' substitution. \emph{Bioinformatics} \bold{14(9)}: 817-818 #' #' Posada, D. (2008) jModelTest: Phylogenetic Model Averaging. \emph{Molecular #' Biology and Evolution} \bold{25}: 1253-1256 #' #' Darriba D., Taboada G.L., Doallo R and Posada D. (2011) ProtTest 3: fast #' selection of best-fit models of protein evolution. . \emph{Bioinformatics} #' \bold{27}: 1164-1165 #' @keywords cluster #' @examples #' #' \dontrun{ #' example(NJ) #' (mT <- modelTest(Laurasiatherian, tree)) #' #' # some R magic #' env <- attr(mT, "env") #' ls(env=env) #' (F81 <- get("F81+G", env)) # a call #' eval(F81, env=env) #' #' data(chloroplast) #' (mTAA <- modelTest(chloroplast, model=c("JTT", "WAG", "LG"))) #' #' # test all available amino acid models #' (mTAA_all <- modelTest(chloroplast, model="all", multicore=TRUE, mc.cores=2)) #' } #' #' @export modelTest modelTest <- function(object, tree = NULL, model = c("JC", "F81", "K80", "HKY", "SYM", "GTR"), G = TRUE, I = TRUE, FREQ = FALSE, k = 4, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1), multicore = FALSE, mc.cores = NULL) { if (multicore && is.null(mc.cores)) { mc.cores <- detectCores() } if (inherits(object, "phyDat")) data <- object if (inherits(object, "pml")) { data <- object$data if (is.null(tree)) tree <- object$tree } if (attr(data, "type") == "DNA") type <- c("JC", "F81", "K80", "HKY", "TrNe", "TrN", "TPM1", "K81", "TPM1u", "TPM2", "TPM2u", "TPM3", "TPM3u", "TIM1e", "TIM1", "TIM2e", "TIM2", "TIM3e", "TIM3", "TVMe", "TVM", "SYM", "GTR") if (attr(data, "type") == "AA") type <- .aamodels if ( (length(model) == 1) && model == "all") model <- type model <- match.arg(model, type, TRUE) env <- new.env() assign("data", data, envir = env) if (is.null(tree)) tree <- NJ(dist.hamming(data)) else { if (length(tree$tip.label) > 3) tree <- nnls.phylo(tree, dist.ml(data)) # may need something faster for trees > 500 taxa } trace <- control$trace control$trace <- trace - 1 fit <- pml(tree, data) fit <- optim.pml(fit, control = control) l <- length(model) if (attr(fit$data, "type") == "DNA") FREQ <- FALSE n <- 1L + sum(I + G + (G & I) + FREQ + (FREQ & I) + (FREQ & G) + (FREQ & G & I)) nseq <- sum(attr(data, "weight")) fitPar <- function(model, fit, G, I, k, FREQ) { m <- 1 res <- matrix(NA, n, 6) res <- as.data.frame(res) colnames(res) <- c("Model", "df", "logLik", "AIC", "AICc", "BIC") data.frame(c("Model", "df", "logLik", "AIC", "AICc", "BIC")) calls <- vector("list", n) trees <- vector("list", n) fittmp <- optim.pml(fit, model = model, control = control) res[m, 1] <- model res[m, 2] <- fittmp$df res[m, 3] <- fittmp$logLik res[m, 4] <- AIC(fittmp) res[m, 5] <- AICc(fittmp) res[m, 6] <- AIC(fittmp, k = log(nseq)) calls[[m]] <- fittmp$call trees[[m]] <- fittmp$tree m <- m + 1 if (I) { if (trace > 0) print(paste0(model, "+I")) fitI <- optim.pml(fittmp, model = model, optInv = TRUE, control = control) res[m, 1] <- paste0(model, "+I") res[m, 2] <- fitI$df res[m, 3] <- fitI$logLik res[m, 4] <- AIC(fitI) res[m, 5] <- AICc(fitI) res[m, 6] <- AIC(fitI, k = log(nseq)) calls[[m]] <- fitI$call trees[[m]] <- fitI$tree m <- m + 1 } if (G) { if (trace > 0) print(paste0(model, "+G")) fitG <- update(fittmp, k = k) fitG <- optim.pml(fitG, model = model, optGamma = TRUE, control = control) res[m, 1] <- paste0(model, "+G") res[m, 2] <- fitG$df res[m, 3] <- fitG$logLik res[m, 4] <- AIC(fitG) res[m, 5] <- AICc(fitG) res[m, 6] <- AIC(fitG, k = log(nseq)) calls[[m]] <- fitG$call trees[[m]] <- fitG$tree m <- m + 1 } if (G & I) { if (trace > 0) print(paste0(model, "+G+I")) fitGI <- update(fitI, k = k) fitGI <- optim.pml(fitGI, model = model, optGamma = TRUE, optInv = TRUE, control = control) res[m, 1] <- paste0(model, "+G+I") res[m, 2] <- fitGI$df res[m, 3] <- fitGI$logLik res[m, 4] <- AIC(fitGI) res[m, 5] <- AICc(fitGI) res[m, 6] <- AIC(fitGI, k = log(nseq)) calls[[m]] <- fitGI$call trees[[m]] <- fitGI$tree m <- m + 1 } if (FREQ) { if (trace > 0) print(paste0(model, "+F")) fitF <- optim.pml(fittmp, model = model, optBf = TRUE, control = control) res[m, 1] <- paste0(model, "+F") res[m, 2] <- fitF$df res[m, 3] <- fitF$logLik res[m, 4] <- AIC(fitF) res[m, 5] <- AICc(fitF) res[m, 6] <- AIC(fitF, k = log(nseq)) calls[[m]] <- fitF$call trees[[m]] <- fitF$tree m <- m + 1 } if (FREQ & I) { if (trace > 0) print(paste0(model, "+I+F")) fitIF <- update(fitF, inv = fitI$inv) fitIF <- optim.pml(fitIF, model = model, optBf = TRUE, optInv = TRUE, control = control) res[m, 1] <- paste0(model, "+I+F") res[m, 2] <- fitIF$df res[m, 3] <- fitIF$logLik res[m, 4] <- AIC(fitIF) res[m, 5] <- AICc(fitIF) res[m, 6] <- AIC(fitIF, k = log(nseq)) calls[[m]] <- fitIF$call trees[[m]] <- fitIF$tree m <- m + 1 } if (FREQ & G) { if (trace > 0) print(paste0(model, "+G+F")) fitGF <- update(fitF, k = k, shape = fitG$shape) fitGF <- optim.pml(fitGF, model = model, optBf = TRUE, optGamma = TRUE, control = control) res[m, 1] <- paste0(model, "+G+F") res[m, 2] <- fitGF$df res[m, 3] <- fitGF$logLik res[m, 4] <- AIC(fitGF) res[m, 5] <- AICc(fitGF) res[m, 6] <- AIC(fitGF, k = log(nseq)) calls[[m]] <- fitGF$call trees[[m]] <- fitGF$tree m <- m + 1 } if (FREQ & G & I) { if (trace > 0) print(paste0(model, "+G+I+F")) fitGIF <- update(fitIF, k = k) fitGIF <- optim.pml(fitGIF, model = model, optBf = TRUE, optInv = TRUE, optGamma = TRUE, control = control) res[m, 1] <- paste0(model, "+G+I+F") res[m, 2] <- fitGIF$df res[m, 3] <- fitGIF$logLik res[m, 4] <- AIC(fitGIF) res[m, 5] <- AICc(fitGIF) res[m, 6] <- AIC(fitGIF, k = log(nseq)) calls[[m]] <- fitGIF$call trees[[m]] <- fitGIF$tree m <- m + 1 } list(res, trees, calls) } eval.success <- FALSE if (!eval.success & multicore) { RES <- mclapply(model, fitPar, fit, G, I, k, FREQ, mc.cores = mc.cores) eval.success <- TRUE } if (!eval.success) RES <- lapply(model, fitPar, fit, G, I, k, FREQ) RESULT <- matrix(NA, n * l, 8) RESULT <- as.data.frame(RESULT) colnames(RESULT) <- c("Model", "df", "logLik", "AIC", "AICw", "AICc", "AICcw", "BIC") for (i in 1:l) RESULT[( (i - 1) * n + 1):(n * i), c(1, 2, 3, 4, 6, 8)] <- RES[[i]][[1]] RESULT[, 5] <- aic.weights(RESULT[, 4]) RESULT[, 7] <- aic.weights(RESULT[, 6]) for (i in 1:l) { for (j in 1:n) { mo <- RES[[i]][[1]][j, 1] tname <- paste0("tree_", mo) tmpmod <- RES[[i]][[3]][[j]] tmpmod["tree"] <- call(tname) if (!is.null(tmpmod[["k"]])) tmpmod["k"] <- k if (attr(data, "type") == "AA") tmpmod["model"] <- RES[[i]][[1]][1, 1] assign(tname, RES[[i]][[2]][[j]], envir = env) assign(mo, tmpmod, envir = env) } } attr(RESULT, "env") <- env class(RESULT) <- c("modelTest", "data.frame") RESULT } tidy <- function(x, ...) UseMethod("tidy") tidy.modelTest <- function(x) { env <- attr(x, "env") l <- nrow(x) k <- rep(1L, l) shape <- rep(NA_real_, l) inv <- rep(0, l) for (i in seq_len(l)) { tmp <- get(x$Model[i], env) if (!is.null(tmp[["k"]])) k[i] <- tmp[["k"]] if (!is.null(tmp[["shape"]])) shape[i] <- tmp[["shape"]] if (!is.null(tmp[["inv"]])) inv[i] <- tmp[["inv"]] } data.frame(Model = x$Model, k = k, shape = shape, inv = inv) } phangorn/R/read.nexus.splits.R0000644000176200001440000004000713475602650016014 0ustar liggesusers## @aliases read.nexus.splits write.nexus.splits write.splits ## read.nexus.networx write.nexus.networx #' Function to import and export splits and networks #' #' \code{read.nexus.splits}, \code{write.nexus.splits}, \code{read.nexus.networx}, \code{write.nexus.networx} #' can be used to import and export splits and networks with nexus format #' and allow to exchange these object with other software like Splitstree. #' \code{write.splits} returns a human readable output. #' #' @param file a file name. #' @param obj An object of class splits. #' @param weights Edge weights. #' @param taxa logical. If TRUE a taxa block is added #' @param append logical. If TRUE the nexus blocks will be added to a file. #' @param splits logical. If TRUE the nexus blocks will be added to a file. #' @param x An object of class splits. #' @param zero.print character which should be printed for zeros. #' @param one.print character which should be printed for ones. #' @param print.labels logical. If TRUE labels are printed. #' @param \dots Further arguments passed to or from other methods. #' @param labels names of taxa. #' @return \code{write.nexus.splits} and \code{write.nexus.networx} write out #' the \code{splits} and \code{networx} object to read with #' other software like Splitstree. #' \code{read.nexus.splits} and \code{read.nexus.networx} return an \code{splits} #' and \code{networx} object. #' @note \code{read.nexus.splits} reads in the splits block of a nexus file. It #' assumes that different co-variables are tab delimited and the bipartition #' are separated with white-space. Comments in square brackets are ignored. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{prop.part}}, \code{\link{lento}}, #' \code{\link{as.splits}}, \code{\link{as.networx}} #' @keywords cluster #' @examples #' #' (sp <- as.splits(rtree(5))) #' write.nexus.splits(sp) #' spl <- allCircularSplits(5) #' plot(as.networx(spl), "2D") #' write.splits(spl, print.labels = FALSE) #' #' @rdname read.nexus.splits #' @export read.nexus.splits <- function(file) { X <- scan(file = file, what = "", sep = "\n", quiet = TRUE) semico <- grep(";", X) X <- gsub("\\[(.*?)\\]", "", X) # get rid of comments i1 <- grep("TAXLABELS", X, ignore.case = TRUE) taxlab <- ifelse(length(i1) > 0, TRUE, FALSE) if (taxlab) { end <- semico[semico >= i1][1] x <- X[(i1):end] # assumes not a 'new line' after "TRANSLATE" x <- gsub("TAXLABELS", "", x, ignore.case = TRUE) x <- unlist(strsplit(x, "[,; \t]")) x <- x[nzchar(x)] x <- gsub("['\"]", "", x) } sp <- grep("SPLITS;", X, ignore.case = TRUE) spEnd <- grep("END;", X, ignore.case = TRUE) spEnd <- spEnd[spEnd > sp][1] dims <- grep("DIMENSION", X, ignore.case = TRUE) cyc <- grep("CYCLE", X, ignore.case = TRUE) matr <- grep("MATRIX", X, ignore.case = TRUE) format <- grep("FORMAT", X, ignore.case = TRUE) start <- matr[matr > sp][1] + 1 end <- semico[semico > start][1] - 1 format <- format[(format > sp) & (format < spEnd)] res <- vector("list", end - start + 1) weights <- numeric(end - start + 1) j <- 1 flab <- fwei <- fcon <- fint <- FALSE if (length(format) > 0) { tmp <- X[format] tmp <- gsub("\\;", "", tmp) tmp <- gsub("\\s+", "", tmp) flab <- grepl("labels=left", tmp, ignore.case = TRUE) fwei <- grepl("weights=yes", tmp, ignore.case = TRUE) fcon <- grepl("confidences=yes", tmp, ignore.case = TRUE) fint <- grepl("intervals=yes", tmp, ignore.case = TRUE) ind <- cumsum(c(flab, fwei, fcon, fint)) mformat <- sum(c(flab, fwei, fcon, fint)) } if (fint) intervals <- numeric(end - start + 1) if (fcon) confidences <- numeric(end - start + 1) if (flab) labels <- vector("character", end - start + 1) for (i in start:end) { tmp <- X[i] tmp <- sub("\\s+", "", tmp) tmp <- strsplit(tmp, "\t")[[1]] if (flab) { labels[j] <- gsub("'", "", tmp[ind[1]]) %>% as.numeric } if (fwei) weights[j] <- as.numeric(tmp[ind[2]]) if (fcon) confidences[j] <- as.numeric(tmp[ind[3]]) if (fint) intervals[j] <- as.numeric(tmp[ind[4]]) tmp <- tmp[length(tmp)] tmp <- gsub("\\,", "", tmp) res[[j]] <- as.integer(na.omit(as.numeric(strsplit(tmp, " ")[[1]]))) j <- j + 1 } if (length(cyc) > 0) { tmp <- X[cyc] tmp <- gsub("\\;", "", tmp) tmp <- gsub("CYCLE", "", tmp, ignore.case = TRUE) tmp <- sub("\\s+", "", tmp) cyc <- as.integer(na.omit(as.numeric(strsplit(tmp, " ")[[1]]))) } attr(res, "labels") <- x if (fwei) attr(res, "weights") <- weights if (fint) attr(res, "intervals") <- intervals if (fcon) attr(res, "confidences") <- confidences if (flab) attr(res, "splitlabels") <- labels attr(res, "cycle") <- cyc class(res) <- "splits" res } #' @rdname read.nexus.splits #' @export write.nexus.splits <- function(obj, file = "", weights = NULL, taxa = TRUE, append = FALSE) { taxa.labels <- attr(obj, "labels") ntaxa <- length(taxa.labels) obj <- oneWise(obj, ntaxa) ind <- which(lengths(obj) == ntaxa) if (length(ind)) obj <- obj[-ind] nsplits <- length(obj) if (is.null(weights)) weight <- attr(obj, "weights") if (is.null(weight)) fwei <- FALSE else fwei <- TRUE if (!append) { cat("#NEXUS\n\n", file = file) cat("[Splits block for Spectronet or Splitstree]\n", file = file, append = TRUE) cat("[generated by phangorn", packageDescription("phangorn", fields = "Version"), "]\n\n", file = file, append = TRUE) } # TAXON BLOCK if (taxa) { cat(paste("BEGIN TAXA;\n\tDIMENSIONS ntax=", ntaxa, ";\n", sep = ""), file = file, append = TRUE) cat("\tTAXLABELS", paste(taxa.labels, sep = " "), ";\nEND;\n\n", file = file, append = TRUE) } # SPLITS BLOCK cat(paste("BEGIN SPLITS;\n\tDIMENSIONS ntax=", ntaxa, " nsplits=", nsplits, ";\n", sep = ""), file = file, append = TRUE) format <- "\tFORMAT labels=left" if (fwei) format <- paste(format, "weights=yes") else format <- paste(format, "weights=no") fcon <- fint <- flab <- FALSE if (!is.null(attr(obj, "confidences"))) { format <- paste(format, "confidences=yes") fcon <- TRUE conf <- attr(obj, "confidences") if (any(is.na(conf))) { conf[is.na(conf)] <- 0 attr(obj, "confidences") <- conf } if (storage.mode(conf) == "character") { conf[conf == ""] <- "0" attr(obj, "confidences") <- conf } } else format <- paste(format, "confidences=no") if (!is.null(attr(obj, "intervals"))) { format <- paste(format, "intervals=yes") fint <- TRUE } else format <- paste(format, "intervals=no") if (!is.null(attr(obj, "splitlabels"))) flab <- TRUE format <- paste(format, ";\n", sep = "") cat(format, file = file, append = TRUE) if (!is.null(attr(obj, "cycle"))) { cycle <- paste(attr(obj, "cycle"), collapse = " ") cat("\tCYCLE\t", cycle, ";\n", sep = "", file = file, append = TRUE) } cat("\tMATRIX\n", file = file, append = TRUE) for (i in 1:nsplits) { slab <- ifelse(flab, attr(obj, "splitlabels")[i], i) swei <- ifelse(fwei, paste(weight[i], "\t"), "") scon <- ifelse(fcon, paste(attr(obj, "confidences")[i], "\t"), "") sint <- ifelse(fint, paste(attr(obj, "intervals")[i], "\t"), "") cat("\t\t", slab, "\t", swei, scon, sint, paste(obj[[i]], collapse = " "), ",\n", file = file, append = TRUE, sep = "") } cat("\t;\nEND;\n", file = file, append = TRUE) } #' @rdname read.nexus.splits #' @export write.nexus.networx <- function(obj, file = "", taxa = TRUE, splits = TRUE, append = FALSE) { if (!append) { cat("#NEXUS\n\n", file = file) cat("[Network block for Spectronet or Splitstree]\n", file = file, append = TRUE) cat("[generated by phangorn", packageDescription("phangorn", fields = "Version"), "]\n\n", file = file, append = TRUE) } ntaxa <- length(obj$tip.label) # TAXON BLOCK if (taxa) { cat(paste("BEGIN TAXA;\n\tDIMENSIONS NTAX=", ntaxa, ";\n", sep = ""), file = file, append = TRUE) if (splits) taxalabel <- attr(obj$splits, "labels") else taxalabel <- obj$tip.label cat("\tTAXLABELS", paste(taxalabel, sep = " "), ";\nEND;\n\n", file = file, append = TRUE) } # SPLITS BLOCK spl <- obj$splits if (splits) { write.nexus.splits(spl, file = file, weights = NULL, append = TRUE, taxa = FALSE) } nvertices <- max(obj$edge) # if(is.null(attr(obj, "coords"))) if (is.null(obj$.plot$vertices)) vertices <- coords(obj, "2D") else vertices <- obj$.plot$vertices # y-axis differs between R and SplitsTree vertices[, 2] <- -vertices[, 2] if (is.null(obj$.plot)) edge.col <- obj$.plot$edge.color else edge.col <- NULL nedges <- nrow(obj$edge) # NETWORK BLOCK cat(paste("BEGIN NETWORK;\nDIMENSIONS ntax=", ntaxa, "\tnvertices=", nvertices, "\tnedges=", nedges, ";\n", sep = ""), file = file, append = TRUE) cat("DRAW to_scale;\n", file = file, append = TRUE) cat("TRANSLATE\n", file = file, append = TRUE) if (is.null(obj$translate)) { for (i in 1:ntaxa) { cat(i, " ", obj$tip.label[i], ",\n", sep = "", file = file, append = TRUE) } } else { translate <- obj$translate for (i in seq_along(translate$label)) { cat(translate$node[i], " ", translate$label[i], ",\n", sep = "", file = file, append = TRUE) } } cat(";\nVERTICES\n", file = file, append = TRUE) for (i in 1:nvertices) { cat(i, "\t", vertices[i, 1], "\t", vertices[i, 2], ",\n", sep = "", file = file, append = TRUE) } if (!is.null(obj$tip.label)) { cat(";\nVLABELS\n", file = file, append = TRUE) if (is.null(obj$translate)) { for (i in 1:ntaxa) { cat(i, "\t", obj$tip.label[i], ",\n", sep = "", file = file, append = TRUE) } } else { for (i in seq_along(translate$node)) { cat(translate$node[i], " ", translate$label[i], ",\n", sep = "", file = file, append = TRUE) } } } # cnet$splitIndex if splits = TRUE cat(";\nEDGES\n", file = file, append = TRUE) if (is.null(obj$.plot$edge.color)) edge.col <- "black" else edge.col <- obj$.plot$edge.color if (length(edge.col) < nedges) edge.col <- rep(edge.col, length = nedges) splI <- TRUE if (is.null(obj$splitIndex)) splI <- FALSE for (i in 1:nedges) { ecoli <- edge.col[i] spInd <- ifelse(splI, paste("\ts=", obj$splitIndex[i], sep = ""), "") edgeCol <- ifelse(ecoli == "black", "", paste("\tfg=", paste(col2rgb(ecoli), collapse = " "), sep = "")) cat(i, "\t", obj$edge[i, 1], "\t", obj$edge[i, 2], spInd, edgeCol, ",\n", sep = "", file = file, append = TRUE) } cat(";\n", file = file, append = TRUE) cat("END;\n", file = file, append = TRUE) # force SplitsTree to accept the file cat("\nBEGIN st_Assumptions;\n uptodate;\nEND; [st_Assumptions]\n", file = file, append = TRUE) } #' @rdname read.nexus.splits #' @export read.nexus.networx <- function(file, splits = TRUE) { spl <- NULL if (splits) spl <- read.nexus.splits(file) X <- scan(file = file, what = "", sep = "\n", quiet = TRUE) semico <- grep(";", X) X <- gsub("\\[(.*?)\\]", "", X) # get rid of comments netStart <- grep("BEGIN NETWORK;", X, ignore.case = TRUE) netEnd <- grep("END;", X, ignore.case = TRUE) netEnd <- netEnd[netEnd > netStart][1] dims <- grep("DIMENSION", X, ignore.case = TRUE) dims <- dims[(dims > netStart) & (dims < netEnd)] ntaxa <- 0 nvertices <- 0 nedges <- 0 if (length(dims) > 0) { tmp <- X[dims] tmp <- gsub("\\s+", "", tmp) ntaxa <- as.numeric(sub("(.+?)(ntax\\s*\\=\\s*)(\\d+)(.+)", "\\3", tmp, perl = TRUE, ignore.case = TRUE)) nvertices <- as.numeric(sub("(.+?)(nvertices\\s*\\=\\s*)(\\d+)(.+)", "\\3", tmp, perl = TRUE, ignore.case = TRUE)) nedges <- as.numeric(sub("(.+?)(nedges\\s*\\=\\s*)(\\d+)(.+)", "\\3", tmp, perl = TRUE, ignore.case = TRUE)) } transl <- grep("TRANSLATE", X, ignore.case = TRUE) translation <- if (length(transl) == 1 && transl > netStart) TRUE else FALSE translate.nodes <- FALSE if (translation) { end <- semico[semico > transl][1] x <- X[(transl + 1):end] x <- unlist(strsplit(x, "[,; \t]")) x <- x[nzchar(x)] x <- gsub("['\']", "", x) if (length(x) == 2 * ntaxa) { TRANS <- matrix(x, ncol = 2, byrow = TRUE) TRANS[, 2] <- gsub("['\"]", "", TRANS[, 2]) TRANS <- list(node = as.numeric(TRANS[, 1]), label = TRANS[, 2]) } else { y <- as.numeric(x) node <- numeric(ntaxa) label <- character(ntaxa) k <- 1 for (i in seq_along(x)) { if (!is.na(y[i])) tmp <- y[i] else { node[k] <- tmp label[k] <- x[i] k <- k + 1 } } TRANS <- list(node = node, label = label) } } vert <- grep("VERTICES", X, ignore.case = TRUE) start <- vert[vert > max(dims, netStart)][1] + 1 end <- semico[semico > start][1] - 1 VERT <- matrix(0, nvertices, 3, dimnames = list(NULL, c("id", "x", "y"))) j <- 1 for (i in start:end) { tmp <- X[i] tmp <- gsub("\\,", "", tmp) tmp <- strsplit(tmp, "[[:space:]]")[[1]] VERT[j, 1] <- as.numeric(tmp[1]) VERT[j, 2] <- as.numeric(tmp[2]) VERT[j, 3] <- as.numeric(tmp[3]) j <- j + 1 } edges <- grep("EDGES", X, ignore.case = TRUE) start <- edges[edges > max(dims, netStart)][1] + 1 end <- semico[semico > start][1] - 1 EDGE <- NULL if (splits) EDGE <- matrix(0, nedges, 4, dimnames = list(NULL, c("id", "vert_id_2", "vert_id_2", "splits_id"))) else EDGE <- matrix(0, nedges, 3, dimnames = list(NULL, c("id", "vert_id_2", "vert_id_2"))) j <- 1 for (i in start:end) { tmp <- X[i] tmp <- gsub("\\,", "", tmp) tmp <- strsplit(tmp, "[[:space:]]")[[1]] EDGE[j, 1] <- as.numeric(tmp[1]) EDGE[j, 2] <- as.numeric(tmp[2]) EDGE[j, 3] <- as.numeric(tmp[3]) if (splits) { EDGE[j, 4] <- as.numeric(sub("s=", "", tmp[4], ignore.case = TRUE)) } j <- j + 1 } swapEdge <- function(x, old, new) { x[x == new] <- -1L x[x == old] <- new x[x == -1L] <- old x } swapRow <- function(x, old, new) { tmp <- x[old, ] x[old, ] <- x[new, ] x[new, ] <- tmp x } splitIndex <- if (ncol(EDGE) == 4) EDGE[, 4] else NULL # quick and dirty el <- sqrt(rowSums( (VERT[EDGE[, 2], c(2:3)] - VERT[EDGE[, 3], c(2:3)])^2)) edge <- EDGE[, c(2:3)] vert <- VERT[, c(2:3)] if (translate.nodes) { oldLabel <- as.integer(TRANS$node) for (i in 1:ntaxa) { edge <- swapEdge(edge, oldLabel[i], i) vert <- swapRow(vert, oldLabel[i], i) } } dimnames(edge) <- NULL # y-axis differs between in R and SplitsTree vert[, 2] <- -vert[, 2] obj <- list(edge = edge, tip.label = TRANS$label, edge.length = el, Nnode = max(edge) - ntaxa, splitIndex = splitIndex, splits = spl, translate = TRANS) obj$.plot <- list(vertices = vert, edge.color = "black", edge.width = 3, edge.lty = 1) class(obj) <- c("networx", "phylo") reorder(obj) obj } #' @rdname read.nexus.splits #' @export write.splits <- function(x, file = "", zero.print = ".", one.print = "|", print.labels = TRUE, ...) { labels <- attr(x, "labels") cx <- as.matrix(x, zero.print = zero.print, one.print = one.print) w <- FALSE if (!is.null(attr(x, "names"))) { nam <- TRUE vnames <- format(attr(x, "names")) } nam <- FALSE if (!is.null(attr(x, "weights"))) { w <- TRUE weight <- format(attr(x, "weights")) } d <- FALSE if (!is.null(attr(x, "data"))) { d <- TRUE data <- attr(x, "data") } if (print.labels) { for (i in seq_along(labels)) cat(labels[i], "\n", file = file, append = TRUE) } if (w) cat("weight", "\t", file = file, append = TRUE) if (d) cat(paste(colnames(data), "\t"), file = file, append = TRUE) cat("\n", file = file, append = TRUE) # "Matrix", for (i in seq_along(x)) { if (nam) cat(vnames[i], "\t", file = file, append = TRUE) if (d) cat(paste(data[i, ], "\t"), file = file, append = TRUE) if (w) cat(weight[i], "\t", file = file) cat("\n", paste(cx[i, ], collapse = ""), "\n", file = file, append = TRUE) } } phangorn/R/SH.R0000644000176200001440000000766113475602650012746 0ustar liggesusers#' Shimodaira-Hasegawa Test #' #' This function computes the Shimodaira--Hasegawa test for a set of trees. #' #' #' @param ... either a series of objects of class \code{"pml"} separated by #' commas, a list containing such objects or an object of class \code{"pmlPart"} #' or a matrix containing the site-wise likelihoods in columns. #' @param B the number of bootstrap replicates. #' @param data an object of class \code{"phyDat"}. #' @param weight if a matrix with site (log-)likelihoods is is supplied an #' optional vector containing the number of occurances of each site pattern. #' @return a numeric vector with the P-value associated with each tree given in #' \code{...}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}}, \code{\link{pmlPart}}, \code{\link{pmlCluster}}, #' \code{\link{SOWH.test}} #' @references Shimodaira, H. and Hasegawa, M. (1999) Multiple comparisons of #' log-likelihoods with applications to phylogenetic inference. \emph{Molecular #' Biology and Evolution}, \bold{16}, 1114--1116. #' @keywords models #' @examples #' #' data(Laurasiatherian) #' dm <- dist.logDet(Laurasiatherian) #' tree1 <- NJ(dm) #' tree2 <- unroot(upgma(dm)) #' fit1 <- pml(tree1, Laurasiatherian) #' fit2 <- pml(tree2, Laurasiatherian) #' fit1 <- optim.pml(fit1) # optimize edge weights #' fit2 <- optim.pml(fit2) #' # with pml objects as input #' SH.test(fit1, fit2, B=1000) #' # in real analysis use larger B, e.g. 10000 #' #' # with matrix as input #' X <- matrix(c(fit1$siteLik, fit2$siteLik), ncol=2) #' SH.test(X, weight=attr(Laurasiatherian, "weight"), B=1000) #' \dontrun{ #' example(pmlPart) #' SH.test(sp, B=1000) #' } #' @export SH.test <- function(..., B = 10000, data = NULL, weight = NULL) { fits <- list(...) if (inherits(fits[[1]], "matrix") || inherits(fits[[1]], "data.frame")) return(SH.tmp(fits[[1]], weight = weight, B = B)) p <- 1 if (inherits(fits[[1]], "pmlPart")) { fits <- fits[[1]]$fits p <- length(fits) } if (inherits(fits[[1]], "list")) { fits <- fits[[1]] } k <- length(fits) if (is.null(data)) data <- fits[[1]]$data res <- NULL for (h in 1:p) { if (p > 1) data <- fits[[h]]$data weight <- attr(data, "weight") lw <- length(weight) siteLik <- matrix(0, lw, k) for (i in 1:k) siteLik[, i] <- update(fits[[i]], data = data)$site ntree <- k Lalpha <- drop(crossprod(siteLik, weight)) Talpha <- max(Lalpha) - Lalpha M <- matrix(NA, k, B) wvec <- rep(1L:lw, weight) for (i in 1:B) { boot <- tabulate(sample(wvec, replace = TRUE), nbins = lw) M[, i] <- crossprod(siteLik, boot) } M <- M - rowMeans(M) # for (i in 1:B) for (j in 1:ntree) S[j, i] <- max(M[j, i] - M[, i]) S <- matrix(apply(M, 2, min), k, B, byrow = TRUE) S <- M - S count <- numeric(ntree) for (j in 1:ntree) count[j] <- sum(S[j, ] > Talpha[j]) count <- count / B trees <- 1:k if (p == 1) res <- cbind(trees, Lalpha, Talpha, count) else res <- rbind(res, cbind(h, trees[-h], Lalpha[-h], Talpha[-h], count[-h])) } if (p == 1) colnames(res) <- c("Trees", "ln L", "Diff ln L", "p-value") else colnames(res) <- c("Partition", "Trees", "ln L", "Diff ln L", "p-value") res } SH.tmp <- function(siteLik, weight = NULL, B = 10000) { lw <- nrow(siteLik) if (is.null(weight)) weight <- rep(1, lw) ntree <- k <- ncol(siteLik) Lalpha <- drop(crossprod(siteLik, weight)) Talpha <- max(Lalpha) - Lalpha M <- matrix(NA, k, B) wvec <- rep(1L:lw, weight) for (i in 1:B) { boot <- tabulate(sample(wvec, replace = TRUE), nbins = lw) M[, i] <- crossprod(siteLik, boot) } M <- M - rowMeans(M) S <- matrix(apply(M, 2, min), k, B, byrow = TRUE) S <- M - S count <- numeric(ntree) for (j in 1:ntree) count[j] <- sum(S[j, ] > Talpha[j]) count <- count / B trees <- 1:k res <- cbind(trees, Lalpha, Talpha, count) colnames(res) <- c("Trees", "ln L", "Diff ln L", "p-value") res } phangorn/R/superTree.R0000644000176200001440000001731713475602650014411 0ustar liggesuserstree2phyDat <- function(trees) { # some minor error checking if (!inherits(trees, "multiPhylo")) stop("trees must be object of class 'multiPhylo.'") labels <- lapply(trees, function(x) sort(x$tip.label)) ulabels <- unique(labels) lul <- length(ulabels) # compute matrix representation phylogenies X <- vector("list", lul) # list of bipartitions characters <- 0 # number of characters weights <- NULL species <- trees[[1]]$tip.label characters <- 0 # number of characters weights <- NULL for (i in 1:lul) { pos <- match(labels, ulabels[i]) ind <- which(!is.na(pos)) temp <- prop.part(trees[ind]) # find all bipartitions # create matrix representation of trees[[i]] in X[[i]] TMP <- matrix(1L, nrow = length(temp) - 1, ncol = length(trees[[ind[1]]]$tip.label)) for (j in seq_len(nrow(TMP))) TMP[j, c(temp[[j + 1]])] <- 2L colnames(TMP) <- attr(temp, "labels") # label rows X[[i]] <- TMP species <- union(species, trees[[ind[1]]]$tip.label) # accumulate labels characters <- characters + nrow(TMP) # count characters weights <- c(weights, attr(temp, "number")[-1]) } data <- matrix(data = 3L, nrow = characters, ncol = length(species), dimnames = list(NULL, species)) j <- 1 for (i in seq_along(X)) { # copy each of X into supermatrix data data[c(j:((j - 1) + nrow(X[[i]]))), colnames(X[[i]])] <- X[[i]] # [1:nrow(X[[i]]),1:ncol(X[[i]])] j <- j + nrow(X[[i]]) } data <- as.data.frame(data) # compute contrast matrix contrast <- matrix(data = c(1, 0, 0, 1, 1, 1), 3, 2, dimnames = list(NULL, c("0", "1")), byrow = TRUE) attr(data, "row.names") <- NULL class(data) <- "phyDat" attr(data, "weight") <- weights attr(data, "nr") <- length(weights) attr(data, "nc") <- 2L attr(data, "levels") <- c("0", "1") attr(data, "allLevels") <- c("0", "1", "?") attr(data, "type") <- "USER" attr(data, "contrast") <- contrast class(data) <- "phyDat" data } my.supertree <- function(trees, trace = 0, ...) { has_edge_length <- vapply(trees, function(x) !is.null(x$edge.length), FALSE) if (all(has_edge_length)){ trees <- .uncompressTipLabel(trees) trees <- di2multi(trees) } XX <- tree2phyDat(trees) supertree <- pratchet(XX, trace = trace, ...) # maybe add edge length supertree <- acctran(supertree, XX) return(supertree) } # Robinson-Foulds supertree fun.rf <- function(x, tree) sum(RF.dist(x, tree)) fun.spr <- function(x, tree) sum(SPR.dist(x, tree)) dist.superTree <- function(tree, trace = 0, fun, start = NULL, multicore = FALSE, mc.cores = NULL) { if (multicore && is.null(mc.cores)) { mc.cores <- detectCores() } if (is.null(start)) start <- superTree(tree, rooted = FALSE) if (inherits(start, "multiPhylo")) start <- start[[1]] best_tree <- unroot(start) best <- fun(best_tree, tree) if (trace > 0) cat("best score so far:", best, "\n") eps <- TRUE while (eps) { nni_trees <- nni(best_tree) if (multicore) { tmp <- mclapply(nni_trees, fun, tree, mc.cores = mc.cores) tmp <- unlist(tmp) } else tmp <- sapply(nni_trees, fun, tree) if (min(tmp) < best) { ind <- which.min(tmp) best_tree <- nni_trees[[ind]] best <- tmp[ind] if (trace > 0) cat("best score so far:", best, "\n") } else eps <- FALSE } attr(best_tree, "score") <- best best_tree } #' Super Tree methods #' #' These function \code{superTree} allows the estimation of a supertree from a #' set of trees using either Matrix representation parsimony, Robinson-Foulds #' or SPR as criterion. #' #' The function \code{superTree} extends the function mrp.supertree from Liam #' Revells, with artificial adding an outgroup on the root of the trees. This #' allows to root the supertree afterwards. The functions is internally used in #' DensiTree. The implementation for the RF- and SPR-supertree are very basic #' so far and assume that all trees share the same set of taxa. #' #' @param tree an object of class \code{multiPhylo} #' @param method An argument defining which algorithm is used to optimize the #' tree. Possible are "MRP", "NNI", and "SPR". #' @param rooted should the resulting supertrees be rooted. #' @param trace defines how much information is printed during optimization. #' @param start a starting tree can be supplied. #' @param multicore logical, whether models should estimated in parallel. #' @param mc.cores The number of cores to use, i.e. at most how many child #' processes will be run simultaneously. #' @param \dots further arguments passed to or from other methods. #' @return The function returns an object of class \code{phylo}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} Liam Revell #' @seealso \code{mrp.supertree}, \code{\link{densiTree}}, #' \code{\link{RF.dist}}, \code{\link{SPR.dist}} #' @references Baum, B. R., (1992) Combining trees as a way of combining data #' sets for phylogenetic inference, and the desirability of combining gene #' trees. \emph{Taxon}, \bold{41}, 3-10. #' #' Ragan, M. A. (1992) Phylogenetic inference based on matrix representation of #' trees. \emph{Molecular Phylogenetics and Evolution}, \bold{1}, 53-58. #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' set.seed(1) #' bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x)upgma(dist.hamming(x)), bs=50) #' #' mrp_st <- superTree(bs) #' plot(mrp_st) #' \dontrun{ #' rf_st <- superTree(bs, method = "RF") #' spr_st <- superTree(bs, method = "SPR") #' } #' #' @export superTree superTree <- function(tree, method = "MRP", rooted = FALSE, trace = 0, start = NULL, multicore = FALSE, mc.cores = NULL, ...) { fun <- function(x) { x <- reorder(x, "postorder") nTips <- length(x$tip.label) x$edge[x$edge > nTips] <- x$edge[x$edge > nTips] + 2L l <- nrow(x$edge) oldroot <- x$edge[l, 1L] x$edge <- rbind(x$edge, matrix(c(rep(nTips + 2, 2), oldroot, nTips + 1), 2L, 2L)) x$edge.length <- c(x$edge.length, 100, 100) x$tip.label <- c(x$tip.label, "ZZZ") x$Nnode <- x$Nnode + 1L x } # labels_start <- unique(unlist(lapply(tree, function(x)x$tip.label))) # TODO check for missing labels tmp <- Nnode(tree) if(any(tmp < (3 + !rooted))){ tree_tmp <- tree[ tmp > (2 + !rooted) ] if (length(tree_tmp) == 0) return(consensus(tree)) tree <- tree_tmp } if (method != "MRP") rooted <- FALSE if (!rooted) tree <- unroot(tree) if (method == "MRP" | is.null(start)) { if (rooted) { if (!is.null(attr(tree, "TipLabel"))) tree <- .uncompressTipLabel(tree) tree <- unclass(tree) if (rooted) tree <- lapply(tree, fun) class(tree) <- "multiPhylo" } res <- my.supertree(tree, trace = trace, ...) if (rooted) { if (inherits(res, "multiPhylo")) { res <- lapply(res, root, "ZZZ") res <- lapply(res, drop.tip, "ZZZ") class(res) <- "multiPhylo" } else { res <- root(res, "ZZZ") res <- drop.tip(res, "ZZZ") } } if (inherits(res, "multiPhylo")) { fun <- function(x) { x$edge.length <- rep(.1, nrow(x$edge)) x } res <- lapply(res, fun) res <- lapply(res, reorder, "postorder") class(res) <- "multiPhylo" } else { res$edge.length <- rep(.1, nrow(res$edge)) res <- reorder(res, "postorder") } } if (method == "MRP") return(res) if (is.null(start)) start <- res tree <- unroot(tree) tree <- reorder(tree, "postorder") if (method == "RF") res <- dist.superTree(tree, trace = trace, fun.rf, start = start, multicore = multicore, mc.cores = mc.cores) if (method == "SPR") res <- dist.superTree(tree, trace = trace, fun.spr, start = start, multicore = multicore, mc.cores = mc.cores) res } phangorn/R/sysdata.rda0000644000176200001440000004601513475602650014445 0ustar liggesusers}w@U0M,T;*R *̱R,PDDi .H RWMz^>޾U?$dI9G~2fEf:ߑZa8f<Ҍ48gnށXn_ojo;?ӮO{{{ g[w ~0ԟWk?@ >v9t~ [{al>ߟg tr?so˯[?ϯMw߉~O~s;G_cï~-O?ί!;;'Y|wÏZ?QGn8?_?zg?޿[UƉW=J{??s35?ߔ[Sj.:_ڞ_ߥMCu[<~~ 6]O~Tl,?Ӯ/O{oVO;9:~Ow?O{8U_ӿKQ>*OkX>8U":, ߿ @Go.Z?J?K?~~{Vz:(;_?}[g_Rl>8_ϯo|x?v TU8Y+gӿK}|}+z^nl_._ev;Q:Ut~T^|gߓOo|+YvGK-7jҩR JCCF3+4P,Y:B_wngf1,%\ʷ݅OLGxi! Gg?+ֆ vP(?T v腶Is:@:9&A{ ;QGbZZksv6fH>MS-1昱`8=Yy o&Ptʙs΋jiWJ𾷮4EzAr'DiӇ9-\k/eͻVA~C+ZR]yRM2B~'MfZmUC3w@ q E+.OSeMejFVy޻£VP'!y0GƤcu. >dR?KmŹ,9; Wnq!~uQ`pKsAC{l0;r> k PSvST ;xkea:ţ419R$ VΗO 4ȞEÚ-^λt %[̞C{"SxvA!xبvDK {g tBPP|-Y8I~YvT:{½ȵ⟙Vf0炵3h~Ω(|5v{I0nyr}~=a(qKTmOޒW2RպBӫ_*-Ç5qB53!XiTCGO"r/q79n U,.Y|5->un@ !-Vv'b}Q~+@ÑE N y2.Q,Hm G.c2ޢ!Ѹ-rjuzgI B ]̕3`wޫx,Aqcp s]Cb> $B-}; 7xj.Vzei!G Bq}x-m,bdDcHпlI]c Tw,Z]_m{4!t5dルvLQ8 l T( bo~82 B-E Zs?%V6&)﵀35ưdg@ e##Xp5;od? MӀKb9p xd-${o\| >9"-R@3kSK;}3/U ţGր͉yZGJi)? O6ύc f_罟\8m-5?#£DZ ?]G 9?)$t=,c\ bA3C^o~x"}uF,^ZG:ha[76.)bWݞUŵ WO$]~i\qX-4sYe@}c' 0ЮL0(=|ޜ` wK%Nr64 I;{:LKR]렢5rFbT"Q({y*T &h Bǖk P^X`jDˀ Ԕ9 Hozj&5GB+AQQ?m~v^L9 !)ٴWz͈7v:EёCe$jʫ[rkH>sx]HKt-}v1uЦ*DHc;19ʷI>#ng*wd&U3m%i po.&5gc'M']aS2i>l7#maK4 uό ꉘMZ!?1<؋-!t<"'W\W8Ze9[// ?Xd&UaҏM;U$@8mbO*dh#Th>Tb9k :!bd"i )RJ fTIN}RqvHz N  W`:[Ez3&nY6!/4pFÜs{'TWV_懌f׮Ah38{9,rBA U>1xܺ8*d,!x$<7ܮ -R lAoUOtH z9}WD %ByZ֓lzJ;&B8(^5֏u>h~PCפ)d}Pa! R\x"wޕC0)-LP&ۉʇ&'% ruow;A2CQ5k1w]MVd%v VMSCS~*& uGJf Тkq0.*[Zj쓄hCpDgL|UoUnѩ;fb!zJ^mȱY;iUG蘔/hUdAȽ w6̣z2(>yi\< i$q7m+n^ 4ד;‰Ƴ,zNm2|Ϻ܀j:A*/1˸Oנ" <5ERTE@NWh+ʑbҵb/LW7A.E)~;x)wtKy ȬSགaN$?~S}Lƹ~)G l\L~1W=AhǏSkb-foٿL!\UP*_A)RX>c" CwnDo3Dww %oCx (=UJ7 <^Y~) glOZĿO#ME s 2kbˉ85+ >"GgDB܎fIx̑Jz VABm|0>'*9v Qۅbra ZeEk]EH(EBvcb=e:ToK"%azx!liCqp@eټ̋.xH^}Vp ~i vVCs6Pn\ \ ^ܿ <_7$ _FH([Z2)*iSgNnͤ~mw }\ jJܵdPqe.]:2JW S2%!vϠ-J?!(]g>b6"h)8;?+ҏt1] 㮂]"ynEkt'<4`\DZ(΃#BU+$TF|O [ܾc(<F aCB$t<{5BxyU2VN+g$BB{d U*#rIG"1VNܞX.mb{,<4@r":Gn]/VAVk >x}7,񠋟#? w/⃝ zc2O= C{nBq_+0*wBq<)N?=r6CetDόɉ# WGx³F6c믍O:$܏!,IHkrSQ7A,Iu:(O񸠄>(L?n_윯 8hVI/>w,N4Si(^P7X8S2sCLv;9E"',#S"+ #|| Ǩ+yp6G^!~I E~w!k7*KBhMy225Ogl-Ri+'[4'3+oJ;~#_,?AQ& uZ|?ҡ+@N^ll\h͊◐E+[OslWT!56N(O#f, dxŅ%:Z$\- B=Y)p1&Ve_MCsIc-g{A% OvBF}80Ks!x#8</]Т[D]hF$g|y➀kèY?sfL lE~4 |D@eBVt%L;7عXh6>ORۏͧa'Lr*vNTrNs(x q}rqMDHEBev ?}yE\. jz)Bd"z;C##<3[p)8׋BZ*_=Y3 yh Dl.ϰiY 1xPa%˯1CUK[ AIs]gBvڐS$x0@x; BH3)82j~|D(Ύ\B+d2_ u:^V \DB>YNɽn$˟`#!JX^[#~x&B/c;-uķ!>tTzDrNFq)]F2TʩqT҂WGaH|}yHCd=1}<9F|#UDp#/7w; ی]~@qjcDC ~IMP9,)o68 DLE*~ЇgzBI rr? ɣC:QAxv$Ag(yT|!3ޥ*2|(]COZTL"_"<χivmzHRI ُ.υH.Aqd W;ƶ++x&!/GBr_CoON,'FajpOT%,5&]_h -! BdɅ +c[]VBPS_@9 `!V2x||D6M3pV`hs|)b[ xYl׍ˌ[58=y-d _5ޯNAZӪϘΧEdk pa״ʎ%ns@3ӧh\6xw]1{2(^`gs(ha+jƅ:CDɥ+lږx" IfO&y铹 x駠BZ6|V;noZ}K]a&CޏL R]9,@QsQr0`/*,w\S=uQg&m A;W @ Wp \Gn@xʗylޅmʴvΣY;/fSAmw+{fyP1}ԠCx7ޜ.LZA eli&s(CN^Yu Thjqjgݐ|=Zw_UtL ‚ǃ.U[gj{$`'19+2 *.Vdx@目&Lz 6|l_"?2S0xv(N~ )}]_>] Qt 3F`b&7\ڱ<nR%nFEwۀ%O+hZh_IDɼ7o޻LUB#4Zaq.!@w}$L(-ݛRt^ơZ#}d;Q$HX06 =~_#o$dB`@|YH# [GKH;IPm9F,dmt(&&̈́I=$}P0՟83,ENҒt7dLb5iO[=Rm3d\P{cqo eHSHyI;X}#դEwHzptGm<Ê@(O-e 2*>K]O[Xee!z$%'E/%!QD_刷6Q[*c)xK_ZLJE}Q-`l[ot t7{xl=([Oܾz"cė(0}ʢ8++>:wmn)7D_y2?1?_>@} %4t8vxїGt8wۢsxr\xˍi;6@z͞ė܏83r֣Gwm#, w^] ~# -I ҿ nsx:z mQ/~ /d8[S? 4 *Twp_YڶuK 1Nk\~ p }w0ŦY`I=vS`EuF TrP?֔EBWCy"k>{'V6yKMX!\Bo 7&>ɂj9*0N%X)GTi3I[38h. U OFSh-g+XϨ1rӘ;/_@ubzkc`NC{h4 P/25JzI69b5g3'<9bț:qmu=b.N]5vVCKɎ'ʡFx ~ɟUi]/P|NU޿Ņ&Μ"a.<4ZYx`bUʧr)u ixs ?pW-u_-*N'8]\]:6;,w>eERl '9N]%l=c˩?ࣾW:h4fJl}}\ d =OD{5s[ (!N̲)Kyd"bb2Ecǔ]\S(ŌRQS]tM!x˃Pc/6?4\f:<!?H~ZHSL "n K,5Swf6k)r/}Cv }-$r3"USmij_uJK']//]*}Κ /V:A)0;Jh&927jFOsĝSܕ&>wDޛln> ʉQr#L,9Aϕ61:J|oV 1Q@gK" 5QɌĵ7ƷGpEh":z_, YquTļI!\gyCAqMݳzPm@8{deF{ vZ4TV !\ 5JY0HB Lml19Ó7N|:>>S{Cl@fyޚ3SKaĜ%cu<*0EwvCj^Q>ѧ'C[Q"[e_ Op]\VˤkA;FX[ *jf5}+Mf|y؆0:V'ǛA'ȁM![AG\ABdbվ\U:/g.K r| wO<iG>B3^nJ~ZǩY_@yZr"x}] SG`tZc%_y/S87${{dJz:j8oȳPr2nȳ[~h\lܳd+R~` |Xj r>1tA"aokFC^»g 4_Lmhtiaa K]7; @U/Aé@!G^fJd+QyknBm!f@|;m6 ./\cixcݟX kOu[A50BfT['=x/BJ;u}i"N!9j&]{o:󲠓E5S( {s\ ; ϦSwp7g;4sW-PIx+Akfz#t^k-j- ml{ό נFPQfAZR⫐e=K Js'C|(Hf̎o %Vg&{$eS۵w@RP7~*(rs/^Z* wu_ZZ BG!a,#t/@D,Y“ u._PdS،P5"Eq_ 87<=t[Q'CJMrK (gunrUk쮀Ns.2.b Wz/Fp+^&ku3AQnԦp顒:h},ޙ+^0 u*;>nKR]*&a 1<-8a!J$xӐ7 ~7/0lue^E ~E:OhR74>;{b/{- R%DjWbO*(˩~K1w${r4IY eʴg䠭䮦[9uRqGmyAxa?Y(HKضD9Nwٰv$@k1BtAKqfʶV&Ա]!" [,y}'/y ˌVAOJ|dcVHltwxrmy`<"<*-/@ۙm⦡f^'  m V$@g@ު%[aPK Tn; IkJTBj6}a^3938y|1bfc~D4\IC/mLmP}%S;:*6]dV 9! sevC ߒ}d٫+ .V+RdRIwV~a|S sw;rXɾj2Z=>ΆV{MzZ?Ev KUM+!hrۛ,GwYB{`*9cʹ|nM4 \8. ?IL"y#ω `:8i"T~Μ'϶+BuUӠE5YջWemNY'z6f90| r> {P~3ot^ 1I9-%?-R[m Ao9TIy_8c9AS;iuTK^\"6i:q!8YkЪ׻5ZNY=r y ]<>X食Y4Fz6HszYN\Nj S EւO\΂g&V)o 6ko % '*»ԨQfϰ nyN]v#WN$ ]xJ4%=ond>Yl(WϢ Ο >>P jzAWx 9,K YzF4dsU^%L'LU$Zgm!8S%FP?|KY䙈qdeӃD9}Q V\P ڙשB{rױPovNȞ?1Wr ϼl+@ φ{n|y&9P_«@!J q_A]L+ȋUkHO5zyƾ yKgB>eaF|9bE5/⥉ħmf mXWDa'*z]#}w_գrk [ T#J*=lYyWoo5m7T9&NPfej #ճ~*%Β+5}u0$` ~Y+қ"" InFtÃ01rUI·`pkd b޳ qNayQ5Ib?1׬wD= mDq!O, (loQ~&uJKKdͬ30'J >Z]xdt=#@y"D5Y o@ Z.V\[w?ΆM&j8K) +lKo;> JO32|9`i{cbn릃K~dD-xWVY-:Ey3xt'm*OLX:ofGH@75wL>gރ3< gno 1cv׸Pl/w[|_Mp-5x`f5TgZ]<=B" <]e!C^}> DBŦ fC}dݝm 5 (?u}-DydSH0SVy C୐ c$@Aa+bS57ij 704)*!v|:~ǭ=4}aseVi9>F\e)ּe{fHtBץ4@ԖG*uZ1H;ާ7ޘm|M?BuN !# pz7*Ÿ (˅i!vW!~El+hP$r^ lzĥU oC&}KJYZsʦ5s6PMӪCeE }$GjBcc#GgT!IPx9Ib|XC0J<+c{TAߛݳo^JG3"9SDXJ ?Sm#3TX"ZWŸکQ/%24'2D/_kIvN\zr@d+^%s"EJZ/zy@i" hD=$g-.\^WgK ~)kC)qAz.: , RFO t w|^h^R<+Go@zAȧQ)A厃7ei"͞G}n9(J o>_״RԵM@*D;lEp twW6Arˍ#a M7!tݵNE硰`%Ƀ2ѣ_!礋]zbT~b1yW'RvUW`yK~ZG>~ZFtlO}j t?DpKz0 T!t > ܖ4M&ݐ8~j9u>>X{s{6g+u ?` 5q6&@q/? nyfM]EJHIVxI24 ;G DB,+qWcD'>sa+_, Kp|*-ꂪxYNtfh͛ƻF$XmkeCerj| 1ǎjC,ǐq&uVf6d>phangorn/R/treedist.R0000644000176200001440000007542513475602650014262 0ustar liggesusers# # tree distance functions # coph <- function(x, path = FALSE) { if (is.null(attr(x, "order")) || attr(x, "order") == "cladewise") x <- reorder(x, "postorder") el <- x$edge.length if (path) el <- rep(1.0, nrow(x$edge)) nTips <- as.integer(length(x$tip.label)) nNode <- as.integer(x$Nnode) dm <- cophenetic_cpp(x$edge, as.double(el), nTips, nNode) attr(dm, "Size") <- nTips attr(dm, "Labels") <- x$tip.label attr(dm, "Diag") <- FALSE attr(dm, "Upper") <- FALSE class(dm) <- "dist" dm } #' @export cophenetic.splits <- function(x) { labels <- attr(x, "labels") X <- splits2design(x) dm <- as.vector(X %*% attr(x, "weight")) attr(dm, "Size") <- length(labels) attr(dm, "Labels") <- labels attr(dm, "Diag") <- FALSE attr(dm, "Upper") <- FALSE class(dm) <- "dist" dm } #' Pairwise Distances from a Phylogenetic Network #' #' \code{cophenetic.networx} computes the pairwise distances between the pairs #' of tips from a phylogenetic network using its branch lengths. #' #' #' @aliases cophenetic.networx cophenetic.splits #' @param x an object of class \code{networx}. #' @return an object of class \code{dist}, names are set according to the tip #' labels (as given by the element \code{tip.label} of the argument \code{x}). #' @author Klaus Schliep #' @seealso \code{\link[stats]{cophenetic}} for the generic function, #' \code{neighborNet} to construct a network from a distance matrix #' @keywords manip #' @export cophenetic.networx <- function(x) { spl <- x$splits cophenetic.splits(spl) } SHORTwise <- function(x, nTips, delete = FALSE) { v <- 1:nTips l <- lengths(x) lv <- floor(nTips / 2) for (i in seq_along(x)) { if (l[i] > lv) { y <- x[[i]] x[[i]] <- v[-y] } if (l[i] == nTips / 2) { y <- x[[i]] if (y[1] != 1) x[[i]] <- v[-y] } } if (any(l == nTips) && delete) { x <- x[l != nTips] } x } oneWise <- function(x, nTips = NULL) { if (is.null(nTips)) nTips <- length(x[[1L]]) v <- 1:nTips for (i in seq_along(x)) { y <- x[[i]] if (y[1] != 1) y <- v[-y] if (y[1] != 1) y <- v[-y] x[[i]] <- y } x } zeroWise <- function(x, nTips = NULL) { if (is.null(nTips)) nTips <- length(x[[1L]]) v <- 1:nTips for (i in seq_along(x)) { y <- x[[i]] if (y[1] == 1) y <- v[-y] x[[i]] <- y } x } ## @aliases treedist RF.dist wRF.dist KF.dist path.dist sprdist SPR.dist #' Distances between trees #' #' \code{treedist} computes different tree distance methods and \code{RF.dist} #' the Robinson-Foulds or symmetric distance. The Robinson-Foulds distance only #' depends on the toplogy of the trees. If edge weights should be considered #' \code{wRF.dist} calculates the weighted RF distance (Robinson & Foulds #' 1981). and \code{KF.dist} calculates the branch score distance (Kuhner & #' Felsenstein 1994). \code{path.dist} computes the path difference metric as #' described in Steel and Penny 1993). #' \code{sprdist} computes the approximate SPR distance (Oliveira Martins et #' al. 2008, de Oliveira Martins 2016). #' #' @details The Robinson-Foulds distance between two trees \eqn{T_1} and \eqn{T_2} with #' \eqn{n} tips is defined as (following the notation Steel and Penny 1993): #' \deqn{d(T_1, T_2) = i(T_1) + i(T_2) - 2v_s(T_1, T_2)} where \eqn{i(T_1)} #' denotes the number of internal edges and \eqn{v_s(T_1, T_2)} denotes the #' number of internal splits shared by the two trees. The normalized #' Robinson-Foulds distance is derived by dividing \eqn{d(T_1, T_2)} by the #' maximal possible distance \eqn{i(T_1) + i(T_2)}. If both trees are unrooted #' and binary this value is \eqn{2n-6}. #' #' Functions like \code{RF.dist} returns the Robinson-Foulds distance (Robinson #' and Foulds 1981) between either 2 trees or computes a matrix of all pairwise #' distances if a \code{multiPhylo} object is given. #' #' For large number of trees the distance functions can use a lot of memory! #' #' @param tree1 A phylogenetic tree (class \code{phylo}) or vector of trees (an #' object of class \code{multiPhylo}). See details #' @param tree2 A phylogenetic tree. #' @param normalize compute normalized RF-distance, see details. #' @param check.labels compares labels of the trees. #' @param rooted take bipartitions for rooted trees into account, default is #' unrooting the trees. #' @param use.weight use edge.length argument or just count number of edges on #' the path (default) #' @return \code{treedist} returns a vector containing the following tree #' distance methods \item{symmetric.difference}{symmetric.difference or #' Robinson-Foulds distance} #' \item{branch.score.difference}{branch.score.difference} #' \item{path.difference}{path.difference} #' \item{weighted.path.difference}{weighted.path.difference} #' @author Klaus P. Schliep \email{klaus.schliep@@gmail.com}, #' Leonardo de Oliveira Martins #' @seealso \code{\link[ape]{dist.topo}}, \code{\link{nni}}, #' \code{\link{superTree}}, \code{\link{mast}} #' @references de Oliveira Martins L., Leal E., Kishino H. (2008) #' \emph{Phylogenetic Detection of Recombination with a Bayesian Prior on the #' Distance between Trees}. PLoS ONE \bold{3(7)}. e2651. doi: #' 10.1371/journal.pone.0002651 #' #' de Oliveira Martins L., Mallo D., Posada D. (2016) \emph{A Bayesian #' Supertree Model for Genome-Wide Species Tree Reconstruction}. Syst. Biol. #' \bold{65(3)}: 397-416, doi:10.1093/sysbio/syu082 #' #' Steel M. A. and Penny P. (1993) \emph{Distributions of tree comparison #' metrics - some new results}, Syst. Biol., \bold{42(2)}, 126--141 #' #' Kuhner, M. K. and Felsenstein, J. (1994) \emph{A simulation comparison of #' phylogeny algorithms under equal and unequal evolutionary rates}, Molecular #' Biology and Evolution, \bold{11(3)}, 459--468 #' #' D.F. Robinson and L.R. Foulds (1981) \emph{Comparison of phylogenetic #' trees}, Mathematical Biosciences, \bold{53(1)}, 131--147 #' #' D.F. Robinson and L.R. Foulds (1979) Comparison of weighted labelled trees. #' In Horadam, A. F. and Wallis, W. D. (Eds.), \emph{Combinatorial Mathematics #' VI: Proceedings of the Sixth Australian Conference on Combinatorial #' Mathematics, Armidale, Australia}, 119--126 #' @keywords classif #' @importFrom fastmatch fmatch #' @examples #' #' tree1 <- rtree(100, rooted=FALSE) #' tree2 <- rSPR(tree1, 3) #' RF.dist(tree1, tree2) #' treedist(tree1, tree2) #' sprdist(tree1, tree2) #' trees <- rSPR(tree1, 1:5) #' SPR.dist(tree1, trees) #' #' @rdname treedist #' @export treedist treedist <- function(tree1, tree2, check.labels = TRUE) { if (has.singles(tree1)) tree1 <- collapse.singles(tree1) if (has.singles(tree2)) tree2 <- collapse.singles(tree2) tree1 <- unroot(tree1) tree2 <- unroot(tree2) if (check.labels) tree2 <- checkLabels(tree2, tree1$tip.label) # if (check.labels) { # ind <- match(tree1$tip.label, tree2$tip.label) # if (any(is.na(ind)) | length(tree1$tip.label) != # length(tree2$tip.label)) # stop("trees have different labels") # tree2$tip.label <- tree2$tip.label[ind] # ind2 <- match(seq_along(ind), tree2$edge[, 2]) # tree2$edge[ind2, 2] <- order(ind) # } tree1 <- reorder(tree1, "postorder") tree2 <- reorder(tree2, "postorder") symmetric.difference <- NULL branch.score.difference <- NULL path.difference <- NULL quadratic.path.difference <- NULL if (!is.binary(tree1) | !is.binary(tree2)) message("Trees are not binary!") bp1 <- bip(tree1) bp2 <- bip(tree2) bp1 <- SHORTwise(bp1, length(tree1$tip.label)) bp2 <- SHORTwise(bp2, length(tree2$tip.label)) bp1 <- sapply(bp1, paste, collapse = "_") bp2 <- sapply(bp2, paste, collapse = "_") l <- length(tree1$tip.label) if (!is.null(tree1$edge.length) & !is.null(tree2$edge.length)) { dv1 <- coph(tree1) dv2 <- coph(tree2) quadratic.path.difference <- sqrt(sum( (dv1 - dv2)^2)) } RF <- sum(match(bp1, bp2, nomatch = 0L) == 0L) + sum(match(bp2, bp1, nomatch = 0L) == 0L) symmetric.difference <- RF # 2 * (p - sum(r1)) if (!is.null(tree1$edge.length) & !is.null(tree2$edge.length)) { w1 <- numeric(max(tree1$edge)) w2 <- numeric(max(tree2$edge)) w1[tree1$edge[, 2]] <- tree1$edge.length w2[tree2$edge[, 2]] <- tree2$edge.length # v1 <- tree1$edge.length # v2 <- tree2$edge.length ind3 <- match(bp1, bp2, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum( (w1[ind3] - w2[ind4])^2) s2 <- sum(w1[-ind3]^2) s3 <- sum(w2[-ind4]^2) branch.score.difference <- sqrt(s1 + s2 + s3) } tree1$edge.length <- rep(1, nrow(tree1$edge)) tree2$edge.length <- rep(1, nrow(tree2$edge)) dt1 <- coph(tree1) dt2 <- coph(tree2) path.difference <- sqrt(sum( (dt1 - dt2)^2)) result <- c(symmetric.difference = symmetric.difference, branch.score.difference = branch.score.difference, path.difference = path.difference, quadratic.path.difference = quadratic.path.difference) result } # leomrtns addition #' @rdname treedist #' @export sprdist <- function(tree1, tree2) { if (has.singles(tree1)) tree1 <- collapse.singles(tree1) if (has.singles(tree2)) tree2 <- collapse.singles(tree2) tree1 <- unroot(tree1) tree2 <- unroot(tree2) lt1 <- length(tree1$tip.label) lt2 <- length(tree2$tip.label) # checking labels is obligatory for spr (user should prune one of them # beforehand?) ind <- match(tree1$tip.label, tree2$tip.label) if (any(is.na(ind)) | lt1 != lt2) stop("trees have different labels") tree2$tip.label <- tree2$tip.label[ind] ind2 <- match(seq_along(ind), tree2$edge[, 2]) tree2$edge[ind2, 2] <- order(ind) # same as in original treedist (will create list of strings with shorter # side of splits) tree1 <- reorder(tree1, "postorder") tree2 <- reorder(tree2, "postorder") if (!is.binary(tree1) | !is.binary(tree2)) message("Trees are not binary!") # possibly replace bip with bipart bp1 <- bip(tree1) bp1 <- SHORTwise(bp1, lt1) bp2 <- bip(tree2) bp2 <- SHORTwise(bp2, lt2) bp1 <- bp1[ lengths(bp1) > 1 ] # only internal nodes bp2 <- bp2[ lengths(bp2) > 1 ] if (length(bp1) != length(bp2)) stop ("number of bipartitions given to C_sprdist are not the same") # OBS: SPR distance works w/ incompatible splits only, but it needs common # cherries (to replace by single leaf) spr <- .Call("C_sprdist", bp1, bp2, lt1) names(spr) <- c("spr", "spr_extra", "rf", "hdist") spr } SPR1 <- function(trees) { trees <- .compressTipLabel(trees) trees <- .uncompressTipLabel(trees) trees <- lapply(trees, unroot) if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) trees <- lapply(trees, reorder, "postorder") nTips <- length(trees[[1]]$tip.label) fun <- function(x, nTips) { bp <- bipart(x) bp <- SHORTwise(bp, nTips) bp <- bp[ lengths(bp) > 1 ] bp } BP <- lapply(trees, fun, nTips) k <- 1 l <- length(trees) SPR <- numeric( (l * (l - 1)) / 2) for (i in 1:(l - 1)) { bp <- BP[[i]] for (j in (i + 1):l) { SPR[k] <- .Call("C_sprdist", bp, BP[[j]], nTips)[1] k <- k + 1 } } attr(SPR, "Size") <- l if (!is.null(names(trees))) attr(SPR, "Labels") <- names(trees) attr(SPR, "Diag") <- FALSE attr(SPR, "Upper") <- FALSE class(SPR) <- "dist" return(SPR) } SPR2 <- function(tree, trees) { trees <- .compressTipLabel(trees) tree <- checkLabels(tree, attr(trees, "TipLabel")) trees <- .uncompressTipLabel(trees) if (any(is.rooted(trees))) { trees <- unroot(trees) } if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) trees <- lapply(trees, reorder, "postorder") tree <- unroot(tree) if (has.singles(tree)) tree <- collapse.singles(tree) nTips <- length(tree$tip.label) fun <- function(x, nTips) { bp <- bipart(x) bp <- SHORTwise(bp, nTips) bp <- bp[ lengths(bp) > 1 ] bp } bp <- fun(tree, nTips) l <- length(trees) SPR <- numeric(l) for (i in 1:l) { SPR[i] <- .Call("C_sprdist", bp, fun(trees[[i]], nTips), nTips)[1] } if (!is.null(names(trees))) names(SPR) <- names(trees) return(SPR) } #' @rdname treedist #' @export SPR.dist <- function(tree1, tree2 = NULL) { if (inherits(tree1, "multiPhylo") && is.null(tree2)) return(SPR1(tree1)) if (inherits(tree1, "phylo") && inherits(tree2, "phylo")) return(sprdist(tree1, tree2)[1]) if (inherits(tree1, "phylo") && inherits(tree2, "multiPhylo")) return(SPR2(tree1, tree2)) if (inherits(tree2, "phylo") && inherits(tree1, "multiPhylo")) return(SPR2(tree2, tree1)) return(NULL) } wRF0 <- function(tree1, tree2, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { r1 <- is.rooted(tree1) r2 <- is.rooted(tree2) if (r1 != r2) { message("one tree is unrooted, unrooted both") } if (!rooted) { if (r1) tree1 <- unroot(tree1) if (r2) tree2 <- unroot(tree2) } if (!r1 | !r2) { if (r1) tree1 <- unroot(tree1) if (r2) tree2 <- unroot(tree2) } if (!is.binary(tree1) | !is.binary(tree2)) message("Trees are not binary!") if (check.labels) tree2 <- checkLabels(tree2, tree1$tip.label) # if (check.labels) { # ind <- match(tree1$tip.label, tree2$tip.label) # if (any(is.na(ind)) | length(tree1$tip.label) != length(tree2$tip.label)) # stop("trees have different labels") # tree2$tip.label <- tree2$tip.label[ind] # ind2 <- match(seq_along(ind), tree2$edge[, 2]) # tree2$edge[ind2, 2] <- order(ind) # } if (has.singles(tree1)) tree1 <- collapse.singles(tree1) if (has.singles(tree2)) tree2 <- collapse.singles(tree2) bp1 <- bip(tree1) bp2 <- bip(tree2) if (!rooted) { bp1 <- SHORTwise(bp1, length(tree1$tip.label)) bp2 <- SHORTwise(bp2, length(tree2$tip.label)) } bp1 <- sapply(bp1, paste, collapse = "_") bp2 <- sapply(bp2, paste, collapse = "_") w1 <- numeric(max(tree1$edge)) w2 <- numeric(max(tree2$edge)) w1[tree1$edge[, 2]] <- tree1$edge.length w2[tree2$edge[, 2]] <- tree2$edge.length ind3 <- match(bp1, bp2, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum(abs(w1[ind3] - w2[ind4])) s2 <- sum(w1[-ind3]) s3 <- sum(w2[-ind4]) wRF <- s1 + s2 + s3 if (normalize) wRF <- wRF / (sum(tree1$edge.length) + sum(tree2$edge.length)) return(wRF) } wRF2 <- function(tree, trees, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { if (check.labels) { trees <- .compressTipLabel(trees) tree <- checkLabels(tree, attr(trees, "TipLabel")) } trees <- .uncompressTipLabel(trees) if (rooted & any(!is.rooted(trees))) { warning("some trees were rooted, unrooted all") rooted <- FALSE } if (!rooted) { if (any(is.rooted(trees))) { trees <- unroot(trees) } } if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) if (has.singles(tree)) tree <- collapse.singles(tree) unclass(trees) nTips <- length(tree$tip.label) fun1 <- function(x) { w <- numeric(max(x$edge)) w[x$edge[, 2]] <- x$edge.length w } W <- lapply(trees, fun1) fun2 <- function(x, nTips) { bp <- bip(x) bp <- SHORTwise(bp, nTips) bp <- sapply(bp, paste, collapse = "_") bp } fun3 <- function(x, nTips) { bp <- bip(x) bp <- sapply(bp, paste, collapse = "_") bp } if (rooted) BP <- lapply(trees, fun3, nTips) else BP <- lapply(trees, fun2, nTips) if (!rooted & is.rooted(tree)) tree <- unroot(tree) bp <- bip(tree) if (!rooted) bp <- SHORTwise(bp, nTips) bp <- sapply(bp, paste, collapse = "_") w <- numeric(max(tree$edge)) w[tree$edge[, 2]] <- tree$edge.length l <- length(trees) wRF <- numeric(l) for (i in 1:l) { ind3 <- fmatch(BP[[i]], bp, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum(abs(W[[i]][ind3] - w[ind4])) s2 <- sum(W[[i]][-ind3]) s3 <- sum(w[-ind4]) wRF[i] <- (s1 + s2 + s3) } if (normalize) { sc <- sapply(trees, function(x) sum(x$edge.length)) + sum(tree$edge.length) wRF <- wRF / sc } wRF } wRF1 <- function(trees, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { if (check.labels) trees <- .compressTipLabel(trees) trees <- .uncompressTipLabel(trees) if (rooted & any(!is.rooted(trees))) { warning("some trees were rooted, unrooted all") rooted <- FALSE } if (!rooted) { if (any(is.rooted(trees))) { trees <- unroot(trees) } } if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) unclass(trees) nTips <- length(trees[[1]]$tip.label) fun1 <- function(x) { w <- numeric(max(x$edge)) w[x$edge[, 2]] <- x$edge.length w } W <- lapply(trees, fun1) fun2 <- function(x, nTips) { bp <- bip(x) bp <- SHORTwise(bp, nTips) bp <- sapply(bp, paste, collapse = "_") bp } fun3 <- function(x, nTips) { bp <- bip(x) bp <- sapply(bp, paste, collapse = "_") bp } if (normalize) sc <- sapply(trees, function(x) sum(x$edge.length)) if (rooted) BP <- lapply(trees, fun3, nTips) else BP <- lapply(trees, fun2, nTips) k <- 1 l <- length(trees) wRF <- numeric( (l * (l - 1)) / 2) for (i in 1:(l - 1)) { bp <- BP[[i]] w <- W[[i]] for (j in (i + 1):l) { ind3 <- fmatch(BP[[j]], bp, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum(abs(W[[j]][ind3] - w[ind4])) s2 <- sum(W[[j]][-ind3]) s3 <- sum(w[-ind4]) wRF[k] <- (s1 + s2 + s3) if (normalize) wRF[k] <- wRF[k] / (sc[i] + sc[j]) k <- k + 1 } } attr(wRF, "Size") <- l if (!is.null(names(trees))) attr(wRF, "Labels") <- names(trees) attr(wRF, "Diag") <- FALSE attr(wRF, "Upper") <- FALSE class(wRF) <- "dist" return(wRF) } mRF2 <- function(tree, trees, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { if (!inherits(trees, "multiPhylo")) stop("trees should be an object of class \"multiPhylo\"") if (!inherits(tree, "phylo")) stop("trees should be an object of class \"phylo\"") trees <- .compressTipLabel(trees) tipLabel <- attr(trees, "TipLabel") if (check.labels) tree <- checkLabels(tree, tipLabel) # if (check.labels) { # ind <- match(tipLabel, tree$tip.label) # if (any(is.na(ind)) | length(tipLabel) != length(tree$tip.label)) # stop("trees have different labels") # tree$tip.label <- tree$tip.label[ind] # ind2 <- match(seq_along(ind), tree$edge[, 2]) # tree$edge[ind2, 2] <- order(ind) # } nTips <- length(tipLabel) l <- length(trees) RF <- numeric(l) trees <- .uncompressTipLabel(trees) if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) if (has.singles(tree)) tree <- collapse.singles(tree) if (!rooted & any(is.rooted(trees))) { warning("some trees were rooted, unrooted all") trees <- unroot(trees) } if (!rooted & is.rooted(tree)) tree <- unroot(tree) if (any(!is.binary(trees))) { message("Some trees are not binary. Result may not what you expect!") } tree <- reorder(tree, "postorder") trees <- reorder(trees, "postorder") xx <- lapply(trees, bipart) if (!rooted) xx <- lapply(xx, SHORTwise, nTips) xx <- lapply(xx, function(x) sapply(x, paste, collapse = "_")) yy <- bipart(tree) if (!rooted) yy <- SHORTwise(yy, nTips) yy <- sapply(yy, paste, collapse = "_") NnodeT <- Nnode(tree) Nnodes <- Nnode(trees) for (i in 1:l) { RF[i] <- Nnodes[i] + NnodeT - 2 * sum(fmatch(xx[[i]], yy, nomatch = 0L) > 0L) # RF[i] <- sum(match(xx[[i]], yy, nomatch=0L)==0L) + # sum(match(yy, xx[[i]], nomatch=0L)==0L) } if (!is.null(names(trees))) names(RF) <- names(trees) if (!normalize) return(RF) else { sc <- Nnode(trees) + Nnode(tree) - 2 return(RF / sc) } } mRF <- function(trees, normalize = FALSE, rooted = FALSE) { if (!inherits(trees, "multiPhylo")) stop("trees should be an object of class \"multiPhylo\"") trees <- .compressTipLabel(trees) tipLabel <- attr(trees, "TipLabel") nTips <- length(tipLabel) l <- length(trees) RF <- numeric( (l * (l - 1)) / 2) if (rooted & any(!is.rooted(trees))) { warning("some trees were rooted, unrooted all") rooted <- FALSE } if (!rooted) { if (any(is.rooted(trees))) { trees <- unroot(trees) } } if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) # n <- length(attr(trees, "TipLabel")) # if (any(sapply(trees, is.rooted))) { # warning("some trees were rooted, unrooted all") # trees <- lapply(trees, unroot) # } if (any(!is.binary(trees))) { message("Some trees are not binary. Result may not what you expect!") } # trees <- reorder(trees, "postorder") # trees <- lapply(trees, reorder, "postorder") Nnodes <- Nnode(trees) trees <- .uncompressTipLabel(trees) trees <- unclass(trees) xx <- lapply(trees, bipart) if (!rooted) xx <- lapply(xx, SHORTwise, nTips) xx <- lapply(xx, function(x) sapply(x, paste, collapse = "_")) # returns list of character vectors k <- 1 for (i in 1:(l - 1)) { tmp <- xx[[i]] for (j in (i + 1):l) { RF[k] <- Nnodes[i] + Nnodes[j] - 2 * sum(fmatch(xx[[j]], tmp, nomatch = 0L) > 0L) # RF[k] <- sum(match(xx[[j]], tmp, nomatch=0L)==0L) + # sum(match(tmp, xx[[j]], nomatch=0L)==0L) if (normalize) RF[k] <- RF[k] / (Nnodes[i] + Nnodes[j] - 2) k <- k + 1 } } attr(RF, "Size") <- l if (!is.null(names(trees))) attr(RF, "Labels") <- names(trees) attr(RF, "Diag") <- FALSE attr(RF, "Upper") <- FALSE class(RF) <- "dist" return(RF) } RF0 <- function(tree1, tree2 = NULL, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { if (has.singles(tree1)) tree1 <- collapse.singles(tree1) if (has.singles(tree2)) tree2 <- collapse.singles(tree2) r1 <- is.rooted(tree1) r2 <- is.rooted(tree2) if (!rooted) { if (r1) { tree1 <- unroot(tree1) r1 <- FALSE } if (r2) { tree2 <- unroot(tree2) r2 <- FALSE } } else { if (r1 != r2) { message("one tree is unrooted, unrooted both") tree1 <- unroot(tree1) tree2 <- unroot(tree2) r1 <- r2 <- FALSE } } if (check.labels) tree2 <- checkLabels(tree2, tree1$tip.label) # if (check.labels) { # ind <- match(tree1$tip.label, tree2$tip.label) # if (any(is.na(ind)) | length(tree1$tip.label) != # length(tree2$tip.label)) # stop("trees have different labels") # tree2$tip.label <- tree2$tip.label[ind] # ind2 <- match(seq_along(ind), tree2$edge[, 2]) # tree2$edge[ind2, 2] <- order(ind) # } if (!is.binary(tree1) | !is.binary(tree2)) message("Trees are not binary!") bp1 <- bipart(tree1) bp2 <- bipart(tree2) nTips <- length(tree1$tip.label) if (!rooted) { bp1 <- SHORTwise(bp1, nTips) bp2 <- SHORTwise(bp2, nTips) } RF <- sum(match(bp1, bp2, nomatch = 0L) == 0L) + sum(match(bp2, bp1, nomatch = 0L) == 0L) if (normalize) RF <- RF / (Nnode(tree1) + Nnode(tree2) - 2) RF } #' @rdname treedist #' @export RF.dist <- function(tree1, tree2 = NULL, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { if (class(tree1) == "phylo" && class(tree2) == "phylo") return(RF0(tree1, tree2, normalize, check.labels, rooted)) if (class(tree1) == "multiPhylo" && is.null(tree2)) return(mRF(tree1, normalize, rooted)) if (class(tree1) == "phylo" && class(tree2) == "multiPhylo") return(mRF2(tree1, tree2, normalize, check.labels, rooted)) if (class(tree2) == "phylo" && class(tree1) == "multiPhylo") return(mRF2(tree2, tree1, normalize, check.labels, rooted)) else return(NULL) } #' @rdname treedist #' @export wRF.dist <- function(tree1, tree2 = NULL, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { if (class(tree1) == "phylo" && class(tree2) == "phylo") return(wRF0(tree1, tree2, normalize, check.labels, rooted)) if (class(tree1) == "multiPhylo" && is.null(tree2)) return(wRF1(tree1, normalize, check.labels, rooted)) if (class(tree1) == "phylo" && class(tree2) == "multiPhylo") return(wRF2(tree1, tree2, normalize, check.labels, rooted)) if (class(tree2) == "phylo" && class(tree1) == "multiPhylo") return(wRF2(tree2, tree1, normalize, check.labels, rooted)) else return(NULL) } kf0 <- function(tree1, tree2, check.labels = TRUE, rooted = FALSE) { if (check.labels) tree2 <- checkLabels(tree2, tree1$tip.label) if (has.singles(tree1)) tree1 <- collapse.singles(tree1) if (has.singles(tree2)) tree2 <- collapse.singles(tree2) r1 <- is.rooted(tree1) r2 <- is.rooted(tree2) if (!rooted) { if (r1) tree1 <- unroot(tree1) if (r2) tree2 <- unroot(tree2) } else { if (r1 != r2) { message("one tree is unrooted, unrooted both") tree1 <- unroot(tree1) tree2 <- unroot(tree2) r1 <- r2 <- FALSE } } bp1 <- bip(tree1) bp2 <- bip(tree2) if (!rooted) { bp1 <- SHORTwise(bp1, length(tree1$tip.label)) bp2 <- SHORTwise(bp2, length(tree2$tip.label)) } bp1 <- sapply(bp1, paste, collapse = "_") bp2 <- sapply(bp2, paste, collapse = "_") w1 <- numeric(max(tree1$edge)) w2 <- numeric(max(tree2$edge)) w1[tree1$edge[, 2]] <- tree1$edge.length w2[tree2$edge[, 2]] <- tree2$edge.length ind3 <- match(bp1, bp2, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum( (w1[ind3] - w2[ind4])^2) s2 <- sum(w1[-ind3]^2) s3 <- sum(w2[-ind4]^2) branch.score.difference <- sqrt(s1 + s2 + s3) branch.score.difference } kf1 <- function(tree, trees, check.labels = TRUE, rooted = FALSE) { if (check.labels) { trees <- .compressTipLabel(trees) tree <- checkLabels(tree, attr(trees, "TipLabel")) } trees <- .uncompressTipLabel(trees) if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) if (has.singles(tree)) tree <- collapse.singles(tree) if (rooted & any(!is.rooted(trees))) { warning("some trees were rooted, unrooted all") rooted <- FALSE } if (!rooted) { if (any(is.rooted(trees))) { trees <- unroot(trees) } } unclass(trees) nTips <- length(tree$tip.label) fun1 <- function(x) { w <- numeric(max(x$edge)) w[x$edge[, 2]] <- x$edge.length w } W <- lapply(trees, fun1) fun2 <- function(x, nTips) { bp <- bip(x) bp <- SHORTwise(bp, nTips) bp <- sapply(bp, paste, collapse = "_") bp } fun3 <- function(x, nTips) { bp <- bip(x) bp <- sapply(bp, paste, collapse = "_") bp } if (rooted) BP <- lapply(trees, fun3, nTips) else BP <- lapply(trees, fun2, nTips) if (!rooted & is.rooted(tree)) tree <- unroot(tree) bp <- bip(tree) if (!rooted) bp <- SHORTwise(bp, nTips) bp <- sapply(bp, paste, collapse = "_") w <- numeric(max(tree$edge)) w[tree$edge[, 2]] <- tree$edge.length l <- length(trees) branch.score.difference <- numeric(l) for (i in 1:l) { ind3 <- fmatch(BP[[i]], bp, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum( (W[[i]][ind3] - w[ind4])^2) s2 <- sum(W[[i]][-ind3]^2) s3 <- sum(w[-ind4]^2) branch.score.difference[i] <- sqrt(s1 + s2 + s3) } branch.score.difference } kf2 <- function(trees, check.labels = TRUE, rooted = FALSE) { if (check.labels) trees <- .compressTipLabel(trees) trees <- .uncompressTipLabel(trees) if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) nTips <- length(trees[[1]]$tip.label) if (rooted & any(!is.rooted(trees))) { warning("some trees were rooted, unrooted all") rooted <- FALSE } if (!rooted & any(is.rooted(trees))) { trees <- unroot(trees) } unclass(trees) fun1 <- function(x) { w <- numeric(max(x$edge)) w[x$edge[, 2]] <- x$edge.length w } W <- lapply(trees, fun1) fun2 <- function(x, nTips) { bp <- bip(x) bp <- SHORTwise(bp, nTips) bp <- sapply(bp, paste, collapse = "_") bp } fun3 <- function(x, nTips) { bp <- bip(x) bp <- sapply(bp, paste, collapse = "_") bp } if (rooted) BP <- lapply(trees, fun3, nTips) else BP <- lapply(trees, fun2, nTips) k <- 1 l <- length(trees) KF <- numeric( (l * (l - 1)) / 2) for (i in 1:(l - 1)) { bp <- BP[[i]] w <- W[[i]] for (j in (i + 1):l) { ind3 <- fmatch(BP[[j]], bp, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum( (W[[j]][ind3] - w[ind4])^2) s2 <- sum(W[[j]][-ind3]^2) s3 <- sum(w[-ind4]^2) KF[k] <- sqrt(s1 + s2 + s3) k <- k + 1 } } attr(KF, "Size") <- l if (!is.null(names(trees))) attr(KF, "Labels") <- names(trees) attr(KF, "Diag") <- FALSE attr(KF, "Upper") <- FALSE class(KF) <- "dist" return(KF) } #' @rdname treedist #' @export KF.dist <- function(tree1, tree2 = NULL, check.labels = TRUE, rooted = FALSE) { if (inherits(tree1, "multiPhylo") && is.null(tree2)) return(kf2(tree1, rooted = rooted)) if (inherits(tree1, "phylo") && inherits(tree2, "phylo")) return(kf0(tree1, tree2, check.labels, rooted)) if (inherits(tree1, "phylo") && inherits(tree2, "multiPhylo")) return(kf1(tree1, tree2, check.labels, rooted)) if (inherits(tree2, "phylo") && inherits(tree1, "multiPhylo")) return(kf1(tree2, tree1, check.labels, rooted)) return(NULL) } #' @rdname treedist #' @export path.dist <- function(tree1, tree2 = NULL, check.labels = TRUE, use.weight = FALSE) { if (inherits(tree1, "phylo") && inherits(tree2, "phylo")) return(pd0(tree1, tree2, check.labels, !use.weight)) if (inherits(tree1, "phylo") && inherits(tree2, "multiPhylo")) return(pd1(tree1, tree2, check.labels, !use.weight)) if (inherits(tree2, "phylo") && inherits(tree1, "multiPhylo")) return(pd1(tree2, tree1, check.labels, !use.weight)) if (inherits(tree1, "multiPhylo") && is.null(tree2)) return(pd2(tree1, check.labels, !use.weight)) else return(NULL) } pd0 <- function(tree1, tree2, check.labels = TRUE, path = TRUE) { if (check.labels) tree2 <- checkLabels(tree2, tree1$tip.label) if (path) { tree1 <- unroot(tree1) tree2 <- unroot(tree2) } dt1 <- coph(tree1, path) dt2 <- coph(tree2, path) sqrt(sum( (dt1 - dt2)^2)) } pd1 <- function(tree, trees, check.labels = TRUE, path = TRUE) { if (check.labels) { trees <- .compressTipLabel(trees) tree <- checkLabels(tree, attr(trees, "TipLabel")) } trees <- .uncompressTipLabel(trees) if (path) { trees <- unroot(trees) tree <- unroot(tree) } trees <- reorder(trees, "postorder") unclass(trees) l <- length(trees) dt <- coph(tree, path) res <- numeric(l) for (i in 1:l) { dt2 <- coph(trees[[i]], path) res[i] <- sqrt(sum( (dt - dt2)^2)) } res } pd2 <- function(trees, check.labels = TRUE, path = TRUE) { if (check.labels) trees <- .compressTipLabel(trees) trees <- .uncompressTipLabel(trees) if (path) trees <- unroot(trees) trees <- reorder(trees, "postorder") l <- length(trees) unclass(trees) CM <- lapply(trees, coph, path) k <- 1 PD <- numeric( (l * (l - 1)) / 2) for (i in 1:(l - 1)) { for (j in (i + 1):l) { PD[k] <- sqrt(sum( (CM[[i]] - CM[[j]])^2)) k <- k + 1 } } attr(PD, "Size") <- l if (!is.null(names(trees))) attr(PD, "Labels") <- names(trees) attr(PD, "Diag") <- FALSE attr(PD, "Upper") <- FALSE class(PD) <- "dist" return(PD) } phangorn/R/phangorn-package.R0000644000176200001440000000514013475602650015627 0ustar liggesusers #' Chloroplast alignment #' #' Amino acid alignment of 15 genes of 19 different chloroplast. #' #' #' @name chloroplast #' @docType data #' @keywords datasets #' @examples #' #' data(chloroplast) #' chloroplast #' NULL #' Laurasiatherian data (AWCMEE) #' #' Laurasiatherian RNA sequence data #' #' #' @name Laurasiatherian #' @docType data #' @source Data have been taken from \url{http://www.allanwilsoncentre.ac.nz/} #' and were converted to R format by \email{klaus.schliep@gmail.com}. #' @keywords datasets #' @examples #' #' data(Laurasiatherian) #' str(Laurasiatherian) #' NULL #' Phylogenetic analysis in R #' #' Phylogenetic analysis in R (Estimation of phylogenetic trees and networks #' using Maximum Likelihood, Maximum Parsimony, Distance methods & Hadamard #' conjugation) #' #' The complete list of functions can be displayed with \code{library(help = #' phangorn)}. #' #' Further information is available in several vignettes. To show the available #' vignettes in an HTML browser type \code{browseVignettes("phangorn")}. #' \tabular{ll}{ \code{Trees} \tab Constructing phylogenetic trees (source, #' pdf) \cr \code{phangorn-specials} \tab Advanced features (source, pdf) \cr #' \code{Ancestral} \tab Ancestral sequence reconstruction (source, pdf) \cr #' \code{Networx} \tab Splits and Networx (source, html) \cr } The first #' vignette (to display type \code{vignette('Trees')}) gives an introduction in #' phylogenetic analysis with phangorn. The second vignette (phangorn-special) #' covers more advanced feature like defining special character spaces and #' things which fit nowhere else. More information on \bold{phangorn} can be #' found on \url{http://www.phangorn.org}. #' #' #' @name phangorn-package #' @aliases phangorn-package phangorn #' @docType package #' @author Klaus Schliep #' #' Maintainer: Klaus Schliep #' @references Schliep K.P. (2011) phangorn: Phylogenetic analysis in R. #' \emph{Bioinformatics}, 27(4) 592-593 #' @keywords package NULL #' Internal phangorn Functions #' #' Internal \pkg{phangorn} functions. #' #' @name phangorn-internal #' @aliases phangorn-internal threshStateC coords map_duplicates #' @keywords internal NULL #' Yeast alignment (Rokas et al.) #' #' Alignment of 106 genes of 8 different species of yeast. #' #' #' @name yeast #' @docType data #' @references Rokas, A., Williams, B. L., King, N., and Carroll, S. B. (2003) #' Genome-scale approaches to resolving incongruence in molecular phylogenies. #' \emph{Nature}, \bold{425}(6960): 798--804 #' @keywords datasets #' @examples #' #' data(yeast) #' str(yeast) #' NULL phangorn/R/pmlPart.R0000644000176200001440000006761713475602650014062 0ustar liggesusers# # pmlPart + pmlCluster # optimPartQGeneral <- function(object, Q = c(1, 1, 1, 1, 1, 1), subs = rep(1, length(Q)), ...) { m <- length(Q) n <- max(subs) ab <- numeric(n) for (i in 1:n) ab[i] <- log(Q[which(subs == i)[1]]) fn <- function(ab, object, m, n, subs, ...) { Q <- numeric(m) for (i in 1:n) Q[subs == i] <- ab[i] Q <- exp(Q) result <- 0 for (i in seq_along(object)) result <- result + update(object[[i]], Q = Q, ...)$logLik result } res <- optim(par = ab, fn = fn, gr = NULL, method = "L-BFGS-B", lower = -Inf, upper = Inf, control = list(fnscale = -1, maxit = 25), object = object, m = m, n = n, subs = subs, ...) Q <- rep(1, m) for (i in 1:n) Q[subs == i] <- exp(res[[1]][i]) res[[1]] <- Q res } optimPartBf <- function(object, bf = c(0.25, 0.25, 0.25, 0.25), ...) { l <- length(bf) nenner <- 1 / bf[l] lbf <- log(bf * nenner) lbf <- lbf[-l] fn <- function(lbf, object, ...) { result <- 0 bf <- exp(c(lbf, 0)) bf <- bf / sum(bf) n <- length(object) for (i in 1:n) result <- result + update(object[[i]], bf = bf, ...)$logLik result } res <- optim(par = lbf, fn = fn, gr = NULL, method = "Nelder-Mead", control = list(fnscale = -1, maxit = 500), object, ...) bf <- exp(c(res[[1]], 0)) bf <- bf / sum(bf) } optimPartInv <- function(object, inv = 0.01, ...) { fn <- function(inv, object, ...) { result <- 0 n <- length(object) for (i in 1:n) result <- result + update(object[[i]], inv = inv, ...)$logLik result } res <- optimize(f = fn, interval = c(0, 1), lower = 0, upper = 1, maximum = TRUE, tol = 1e-04, object, ...) res[[1]] } optimPartGamma <- function(object, shape = 1, ...) { fn <- function(shape, object, ...) { result <- 0 n <- length(object) for (i in 1:n) result <- result + update(object[[i]], shape = shape, ...)$logLik result } res <- optimize(f = fn, interval = c(0, 100), lower = 0, upper = 100, maximum = TRUE, tol = 0.01, object, ...) res } dltmp <- function(fit, i = 1, transform = transform) { tree <- fit$tree data <- getCols(fit$data, tree$tip.label) if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") q <- length(tree$tip.label) node <- tree$edge[, 1] edge <- tree$edge[, 2] m <- length(edge) + 1 # max(edge) dat <- vector(mode = "list", length = m) eig <- fit$eig w <- fit$w[i] g <- fit$g[i] bf <- fit$bf el <- tree$edge.length P <- getP(el, eig, g) nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) node <- as.integer(node - min(node)) edge <- as.integer(edge - 1) nTips <- as.integer(length(tree$tip.label)) mNodes <- as.integer(max(node) + 1) contrast <- attr(data, "contrast") nco <- as.integer(dim(contrast)[1]) dat[(q + 1):m] <- .Call("LogLik2", data, P, nr, nc, node, edge, nTips, mNodes, contrast, nco) # result <- dat[[q + 1]] %*% (bf * w) parent <- tree$edge[, 1] child <- tree$edge[, 2] nTips <- min(parent) - 1 datp <- vector("list", m) el <- tree$edge.length if (transform) dP <- getdP(tree$edge.length, eig, g) else dP <- getdP2(tree$edge.length, eig, g) datp[(nTips + 1)] <- dat[(nTips + 1)] l <- length(child) dl <- matrix(0, nr, l) for (j in (m - 1):1) { # tips have factor format, internal edges are matrices if (child[j] > nTips) { tmp2 <- (datp[[parent[j]]] / (dat[[child[j]]] %*% P[[j]])) dl[, j] <- (tmp2 * (dat[[child[j]]] %*% dP[[j]])) %*% (w * bf) datp[[child[j]]] <- (tmp2 %*% P[[j]]) * dat[[child[j]]] } else { tmp2 <- (datp[[parent[j]]] / ( (contrast %*% P[[j]])[data[[child[j]]], ])) dl[, j] <- (tmp2 * ( (contrast %*% dP[[j]])[data[[child[j]]], ])) %*% (w * bf) } } dl } dl <- function(x, transform = TRUE) { l <- length(x$w) dl <- dltmp(x, 1, transform) i <- 2 while (i < (l + 1)) { dl <- dl + dltmp(x, i, transform) i <- i + 1 } dl } # add control and change edge optimPartEdge <- function(object, ...) { tree <- object[[1]]$tree theta <- object[[1]]$tree$edge.length n <- length(object) l <- length(theta) nrv <- numeric(n) for (i in 1:n) nrv[i] <- attr(object[[i]]$data, "nr") cnr <- cumsum(c(0, nrv)) weight <- numeric(sum(nrv)) dl <- matrix(NA, sum(nrv), l) for (i in 1:n) weight[(cnr[i] + 1):cnr[i + 1]] <- attr(object[[i]]$data, "weight") ll0 <- 0 for (i in 1:n) ll0 <- ll0 + object[[i]]$logLik eps <- 1 scalep <- 1 k <- 1 while (eps > 0.001 & k < 50) { if (scalep == 1) { for (i in 1:n) { lv <- drop(exp(object[[i]]$site)) dl[(cnr[i] + 1):cnr[i + 1], ] <- dl(object[[i]], TRUE) / lv } sc <- colSums(weight * dl) F <- crossprod(dl * weight, dl) + diag(l) * 1e-10 # add small ridge penalty for numerical stability } thetaNew <- log(theta) + scalep * solve(F, sc) tree$edge.length <- as.numeric(exp(thetaNew)) for (i in 1:n) object[[i]] <- update(object[[i]], tree = tree) ll1 <- 0 for (i in 1:n) ll1 <- ll1 + object[[i]]$logLik eps <- ll1 - ll0 if (eps < 0 || is.nan(eps)) { scalep <- scalep / 2 eps <- 1 thetaNew <- log(theta) ll1 <- ll0 } else scalep <- 1 theta <- exp(thetaNew) ll0 <- ll1 k <- k + 1 } object } makePart <- function(fit, rooted, weight = ~index + genes) { if (inherits(fit, "phyDat")) { x <- fit dm <- dist.ml(x) if (!rooted) tree <- NJ(dm) else tree <- upgma(dm) fit <- pml(tree, x, k = 4) } dat <- fit$data if (class(weight)[1] == "formula") weight <- xtabs(weight, data = attr(dat, "index")) fits <- NULL for (i in 1:dim(weight)[2]) { ind <- which(weight[, i] > 0) dat2 <- getRows(dat, ind) attr(dat2, "weight") <- weight[ind, i] fits[[i]] <- update(fit, data = dat2) } names(fits) <- colnames(fits) fits } #' @rdname pmlPart #' @export multiphyDat2pmlPart <- function(x, rooted = FALSE, ...) { shared_tree <- TRUE if (shared_tree) { concatenate_x <- do.call(cbind.phyDat, x@seq) dm <- dist.ml(concatenate_x) if (!rooted) tree <- NJ(dm) else tree <- upgma(dm) } else tree <- NULL fun <- function(x, rooted = FALSE, tree, ...) { if (is.null(tree)) { dm <- dist.ml(x) if (!rooted) tree <- NJ(dm) else tree <- upgma(dm) } pml(tree, x, ...) } fits <- lapply(x@seq, fun, tree = tree, rooted = rooted, ...) fits } #' @rdname pmlPart #' @export pmlPart2multiPhylo <- function(x) { res <- lapply(x$fits, FUN = function(x) x$tree) class(res) <- "multiPhylo" res } #' @export plot.pmlPart <- function(x, ...) { plot(pmlPart2multiPhylo(x), ...) } #' Partition model. #' #' Model to estimate phylogenies for partitioned data. #' #' The \code{formula} object allows to specify which parameter get optimized. #' The formula is generally of the form \code{edge + bf + Q ~ rate + shape + #' \dots{}}, on the left side are the parameters which get optimized over all #' partitions, on the right the parameter which are optimized specific to each #' partition. The parameters available are \code{"nni", "bf", "Q", "inv", #' "shape", "edge", "rate"}. Each parameters can be used only once in the #' formula. \code{"rate"} and \code{"nni"} are only available for the right #' side of the formula. #' #' For partitions with different edge weights, but same topology, \code{pmlPen} #' can try to find more parsimonious models (see example). #' #' \code{pmlPart2multiPhylo} is a convenience function to extract the trees out #' of a \code{pmlPart} object. #' #' @aliases pmlPart #' @param formula a formula object (see details). #' @param object an object of class \code{pml} or a list of objects of class #' \code{pml} . #' @param control A list of parameters for controlling the fitting process. #' @param model A vector containing the models containing a model for each #' partition. #' @param rooted Are the gene trees rooted (ultrametric) or unrooted. #' @param \dots Further arguments passed to or from other methods. #' @param x an object of class \code{pmlPart} #' @return \code{kcluster} returns a list with elements #' \item{logLik}{log-likelihood of the fit} \item{trees}{a list of all trees #' during the optimization.} \item{object}{an object of class \code{"pml"} or #' \code{"pmlPart"}} #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso #' \code{\link{pml}},\code{\link{pmlCluster}},\code{\link{pmlMix}},\code{\link{SH.test}} #' @keywords cluster #' @examples #' #' data(yeast) #' dm <- dist.logDet(yeast) #' tree <- NJ(dm) #' fit <- pml(tree,yeast) #' fits <- optim.pml(fit) #' #' weight=xtabs(~ index+genes,attr(yeast, "index"))[,1:10] #' #' sp <- pmlPart(edge ~ rate + inv, fits, weight=weight) #' sp #' #' \dontrun{ #' sp2 <- pmlPart(~ edge + inv, fits, weight=weight) #' sp2 #' AIC(sp2) #' #' sp3 <- pmlPen(sp2, lambda = 2) #' AIC(sp3) #' } #' #' @rdname pmlPart #' @export pmlPart pmlPart <- function(formula, object, control = pml.control(epsilon = 1e-8, maxit = 10, trace = 1), model = NULL, rooted = FALSE, ...) { call <- match.call() form <- phangornParseFormula(formula) opt <- c("nni", "bf", "Q", "inv", "shape", "edge", "rate") optAll <- match(opt, form$left) optPart <- match(opt, form$right) AllNNI <- !is.na(optAll[1]) AllBf <- !is.na(optAll[2]) AllQ <- !is.na(optAll[3]) AllInv <- !is.na(optAll[4]) AllGamma <- !is.na(optAll[5]) AllEdge <- !is.na(optAll[6]) PartNni <- !is.na(optPart[1]) PartBf <- !is.na(optPart[2]) PartQ <- !is.na(optPart[3]) PartInv <- !is.na(optPart[4]) PartGamma <- !is.na(optPart[5]) PartEdge <- !is.na(optPart[6]) PartRate <- !is.na(optPart[7]) if (PartNni) PartEdge <- TRUE if (inherits(object, "multiphyDat")) { if (AllNNI || AllEdge) object <- do.call(cbind.phyDat, object@seq) else fits <- multiphyDat2pmlPart(object, rooted = rooted, ...) } if (inherits(object, "pml")) fits <- makePart(object, rooted = rooted, ...) if (inherits(object, "phyDat")) fits <- makePart(object, rooted = rooted, ...) if (inherits(object, "pmlPart")) fits <- object$fits if (inherits(object, "list")) fits <- object trace <- control$trace epsilon <- control$epsilon maxit <- control$maxit p <- length(fits) # if(length(model) 1 df[3, 1] <- fits[[1]]$inv > 0 df[4, 1] <- length(unique(fits[[1]]$bf)) - 1 df[5, 1] <- length(unique(fits[[1]]$Q)) - 1 df[6, 1] <- 0 # rates if (PartEdge) df[1, 2] <- p if (PartGamma) df[2, 2] <- p if (PartInv) df[3, 2] <- p if (PartBf) df[4, 2] <- p if (PartQ) df[5, 2] <- p if (PartRate) df[6, 1] <- p - 1 attr(logLik, "df") <- sum(df[, 1] * df[, 2]) object <- list(logLik = logLik, fits = fits, call = call, df = df) class(object) <- "pmlPart" return(object) }) while (eps > epsilon & m < maxit) { loli <- 0 if (any(c(PartNni, PartBf, PartInv, PartQ, PartGamma, PartEdge, PartRate))) { for (i in 1:p) { fits[[i]] <- optim.pml(fits[[i]], optNni = PartNni, optBf = PartBf, optQ = PartQ, optInv = PartInv, optGamma = PartGamma, optEdge = PartEdge, optRate = PartRate, optRooted = rooted, control = pml.control(maxit = 3, epsilon = 1e-8, trace - 1), model = model[i]) } } if (AllQ) { Q <- fits[[1]]$Q subs <- c(1:(length(Q) - 1), 0) newQ <- optimPartQGeneral(fits, Q = Q, subs = subs) for (i in 1:p) fits[[i]] <- update(fits[[i]], Q = newQ[[1]]) } if (AllBf) { bf <- fits[[1]]$bf newBf <- optimPartBf(fits, bf = bf) for (i in 1:p) fits[[i]] <- update(fits[[i]], bf = newBf) } if (AllInv) { inv <- fits[[1]]$inv newInv <- optimPartInv(fits, inv = inv) for (i in 1:p) fits[[i]] <- update(fits[[i]], inv = newInv) } if (AllGamma) { shape <- fits[[1]]$shape newGamma <- optimPartGamma(fits, shape = shape)[[1]] for (i in 1:p) fits[[i]] <- update(fits[[i]], shape = newGamma) } if (AllNNI) { fits <- optimPartNNI(fits, AllEdge) if (trace > 0) cat(attr(fits, "swap"), " NNI operations performed") } if (AllEdge) fits <- optimPartEdge(fits) if (PartRate) { tree <- fits[[1]]$tree rate <- numeric(p) wp <- numeric(p) for (i in 1:p) { wp[i] <- sum(fits[[i]]$weight) rate[i] <- fits[[i]]$rate } ratemult <- sum(wp) / sum(wp * rate) tree$edge.length <- tree$edge.length / ratemult for (i in 1:p) fits[[i]] <- update(fits[[i]], tree = tree, rate = rate[i] * ratemult) } loli <- 0 for (i in 1:p) loli <- loli + fits[[i]]$log eps <- (logLik - loli) / loli if (trace > 0) cat("loglik:", logLik, "-->", loli, "\n") logLik <- loli m <- m + 1 } } # # pmlCluster # pmlCluster.fit <- function(formula, fit, weight, p = 4, part = NULL, control = pml.control(epsilon = 1e-8, maxit = 10, trace = 1), ...) { call <- match.call() form <- phangornParseFormula(formula) opt <- c("nni", "bf", "Q", "inv", "shape", "edge", "rate") optAll <- match(opt, form$left) optPart <- match(opt, form$right) AllNNI <- !is.na(optAll[1]) AllBf <- !is.na(optAll[2]) AllQ <- !is.na(optAll[3]) AllInv <- !is.na(optAll[4]) AllGamma <- !is.na(optAll[5]) AllEdge <- !is.na(optAll[6]) PartNni <- !is.na(optPart[1]) PartBf <- !is.na(optPart[2]) PartQ <- !is.na(optPart[3]) PartInv <- !is.na(optPart[4]) PartGamma <- !is.na(optPart[5]) PartEdge <- !is.na(optPart[6]) PartRate <- !is.na(optPart[7]) if (PartNni) PartEdge <- TRUE nrw <- dim(weight)[1] ncw <- dim(weight)[2] if (is.null(part)) { part <- rep(1:p, length = ncw) part <- sample(part) } Part <- part Gtrees <- vector("list", p) dat <- fit$data attr(fit$orig.data, "index") <- attr(dat, "index") <- NULL for (i in 1:p) Gtrees[[i]] <- fit$tree fits <- vector("list", p) for (i in 1:p) fits[[i]] <- fit trace <- control$trace eps <- 0 m <- 1 logLik <- fit$log trees <- list() weights <- matrix(0, nrw, p) lls <- matrix(0, nrw, p) loli <- fit$log oldpart <- part eps2 <- 1 iter <- 0 swap <- 1 on.exit({ df <- matrix(1, 6, 2) colnames(df) <- c("#df", "group") rownames(df) <- c("Edge", "Shape", "Inv", "Bf", "Q", "Rate") df[1, 1] <- length(fits[[1]]$tree$edge.length) df[2, 1] <- fits[[1]]$k - 1 df[3, 1] <- fits[[1]]$inv > 0 df[4, 1] <- length(unique(fits[[1]]$bf)) - 1 df[5, 1] <- length(unique(fits[[1]]$Q)) - 1 df[6, 1] <- 0 if (PartEdge) df[1, 2] <- p if (PartGamma) df[2, 2] <- p if (PartInv) df[3, 2] <- p if (PartBf) df[4, 2] <- p if (PartQ) df[5, 2] <- p if (PartRate) df[6, 1] <- p - 1 attr(logLik, "df") <- sum(df[, 1] * df[, 2]) res <- list(logLik = logLik, Partition = Part, trees = trees) result <- list(logLik = loli, fits = fits, Partition = part, df = df, res = res, call = call) class(result) <- c("pmlPart") return(result) }) while (eps < ncw || abs(eps2) > control$eps) { df2 <- 0 if (any(c(PartNni, PartBf, PartInv, PartQ, PartGamma, PartEdge, PartRate))) { for (i in 1:p) { weights[, i] <- rowSums(weight[, which(part == i), drop = FALSE]) ind <- which(weights[, i] > 0) dat2 <- getRows(dat, ind) attr(dat2, "weight") <- weights[ind, i] fits[[i]] <- update(fits[[i]], data = dat2) fits[[i]] <- optim.pml(fits[[i]], PartNni, PartBf, PartQ, PartInv, PartGamma, PartEdge, PartRate, control = pml.control(epsilon = 1e-8, maxit = 3, trace - 1)) lls[, i] <- update(fits[[i]], data = dat)$site Gtrees[[i]] <- fits[[i]]$tree } } if (AllQ) { Q <- fits[[1]]$Q subs <- c(1:(length(Q) - 1), 0) newQ <- optimPartQGeneral(fits, Q = Q, subs = subs)[[1]] for (i in 1:p) fits[[i]] <- update(fits[[i]], Q = newQ) df2 <- df2 + length(unique(newQ)) - 1 } if (AllBf) { bf <- fits[[1]]$bf newBf <- optimPartBf(fits, bf = bf) for (i in 1:p) fits[[i]] <- update(fits[[i]], bf = newBf) df2 <- df2 + length(unique(newBf)) - 1 } if (AllInv) { inv <- fits[[1]]$inv newInv <- optimPartInv(fits, inv = inv) for (i in 1:p) fits[[i]] <- update(fits[[i]], inv = newInv) # there was an Error df2 <- df2 + 1 } if (AllGamma) { shape <- fits[[1]]$shape newGamma <- optimPartGamma(fits, shape = shape)[[1]] for (i in 1:p) fits[[i]] <- update(fits[[i]], shape = newGamma) df2 <- df2 + 1 } if (AllNNI) { fits <- optimPartNNI(fits, AllEdge) if (trace > 0) cat(attr(fits, "swap"), " NNI operations performed") swap <- attr(fits, "swap") } if (AllEdge) { fits <- optimPartEdge(fits) df2 <- df2 + length(fits[[1]]$tree$edge.length) } if (PartRate) { tree <- fits[[1]]$tree rate <- numeric(p) wp <- numeric(p) for (i in 1:p) { wp[i] <- sum(fits[[i]]$weight) rate[i] <- fits[[i]]$rate } ratemult <- sum(wp) / sum(wp * rate) tree$edge.length <- tree$edge.length / ratemult for (i in 1:p) fits[[i]] <- update(fits[[i]], tree = tree, rate = rate[i] * ratemult) } for (i in 1:p) lls[, i] <- update(fits[[i]], data = dat)$site trees[[m]] <- Gtrees LL <- t(weight) %*% lls # choose partitions which change tmp <- (LL[cbind(1:ncw, part)] - apply(LL, 1, max)) / colSums(weight) fixi <- numeric(p) for (i in 1:p) { tmpi <- which(part == i) fixi[i] <- tmpi[which.max(tmp[tmpi])] } oldpart <- part # restrict the number of elements changing groups # If more than 25% would change, only the 25% with the highest increase per # site change if (sum(tmp == 0) / length(tmp) < .75) { medtmp <- quantile(tmp, .25) medind <- which(tmp <= medtmp) part[medind] <- max.col(LL[medind, ]) } else part <- max.col(LL) # else part <- apply(LL, 1, which.max) # force groups to have at least one member part[fixi] <- 1:p Part <- cbind(Part, part) eps <- sum(diag(table(part, oldpart))) eps2 <- loli loli <- sum(apply(LL, 1, max)) eps2 <- (eps2 - loli) / loli logLik <- c(logLik, loli) if (trace > 0) print(loli) Part <- cbind(Part, part) df2 <- df2 + df2 if (eps == ncw & swap == 0) AllNNI <- FALSE m <- m + 1 if (eps == ncw) iter <- iter + 1 if (iter == 3) break } } #' Stochastic Partitioning #' #' Stochastic Partitioning of genes into p cluster. #' #' The \code{formula} object allows to specify which parameter get optimized. #' The formula is generally of the form \code{edge + bf + Q ~ rate + shape + #' \dots{}}, on the left side are the parameters which get optimized over all #' cluster, on the right the parameter which are optimized specific to each #' cluster. The parameters available are \code{"nni", "bf", "Q", "inv", #' "shape", "edge", "rate"}. Each parameter can be used only once in the #' formula. There are also some restriction on the combinations how parameters #' can get used. \code{"rate"} is only available for the right side. When #' \code{"rate"} is specified on the left hand side \code{"edge"} has to be #' specified (on either side), if \code{"rate"} is specified on the right hand #' side it follows directly that \code{edge} is too. #' #' @param formula a formula object (see details). #' @param fit an object of class \code{pml}. #' @param weight \code{weight} is matrix of frequency of site patterns for all #' genes. #' @param p number of clusters. #' @param part starting partition, otherwise a random partition is generated. #' @param nrep number of replicates for each p. #' @param control A list of parameters for controlling the fitting process. #' @param \dots Further arguments passed to or from other methods. #' @return \code{pmlCluster} returns a list with elements #' \item{logLik}{log-likelihood of the fit} \item{trees}{a list of all trees #' during the optimization.} \item{fits}{fits for the final partitions} #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso #' \code{\link{pml}},\code{\link{pmlPart}},\code{\link{pmlMix}},\code{\link{SH.test}} #' @references K. P. Schliep (2009). Some Applications of statistical #' phylogenetics (PhD Thesis) #' #' Lanfear, R., Calcott, B., Ho, S.Y.W. and Guindon, S. (2012) PartitionFinder: #' Combined Selection of Partitioning Schemes and Substitution Models for #' Phylogenetic Analyses. \emph{Molecular Biology and Evolution}, \bold{29(6)}, #' 1695-1701 #' @keywords cluster #' @examples #' #' \dontrun{ #' data(yeast) #' dm <- dist.logDet(yeast) #' tree <- NJ(dm) #' fit <- pml(tree,yeast) #' fit <- optim.pml(fit) #' #' weight <- xtabs(~ index+genes,attr(yeast, "index")) #' set.seed(1) #' #' sp <- pmlCluster(edge~rate, fit, weight, p=1:4) #' sp #' SH.test(sp) #' } #' #' @export pmlCluster pmlCluster <- function(formula, fit, weight, p = 1:5, part = NULL, nrep = 10, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1), ...) { call <- match.call() form <- phangornParseFormula(formula) if (any(p == 1)) { opt2 <- c("nni", "bf", "Q", "inv", "shape", "edge") tmp1 <- opt2 %in% form$left tmp1 <- tmp1 | (opt2 %in% form$right) fit <- optim.pml(fit, tmp1[1], tmp1[2], tmp1[3], tmp1[4], tmp1[5], tmp1[6], control = control) } p <- p[p != 1] if (length(p) == 0) return(fit) n <- sum(weight) k <- 2 BIC <- matrix(0, length(p) + 1, nrep) BIC[1, ] <- AIC(fit, k = log(n)) LL <- matrix(NA, length(p) + 1, nrep) LL[1, ] <- logLik(fit) P <- array(dim = c(length(p) + 1, nrep, dim(weight)[2])) tmpBIC <- Inf choice <- c(1, 1) for (j in p) { tmp <- NULL for (i in 1:nrep) { tmp <- pmlCluster.fit(formula, fit, weight, p = j, part = part, control = control, ...) P[k, i, ] <- tmp$Partition BIC[k, i] <- AIC(tmp, k = log(n)) LL[k, i] <- logLik(tmp) if (BIC[k, i] < tmpBIC) { tmpBIC <- BIC[k, i] result <- tmp choice <- c(k, i) } } k <- k + 1 } p <- c(1, p) result$choice <- choice result$BIC <- BIC result$AllPartitions <- P result$AllLL <- LL result$p <- p class(result) <- c("pmlCluster", "pmlPart") result } #' @export plot.pmlCluster <- function(x, which = c(1L:3L), caption = list("BIC", "log-likelihood", "Partitions"), ...) { show <- rep(FALSE, 3) show[which] <- TRUE choice <- x$choice if (show[1]) { X <- x$AllPartitions[choice[1], , ] d <- dim(X) ind <- order(X[choice[2], ]) im <- matrix(0, d[2], d[2]) for (j in 1:d[1]) { for (i in 1:d[2]) im[i, ] <- im[i, ] + (X[j, ] == X[j, i]) } image(im[ind, ind], ...) } if (show[1]) matplot(x$p, x$BIC, ylab = "BIC", xlab = "number of clusters") if (show[1]) matplot(x$p, x$AllLL, ylab = "log-likelihood", xlab = "number of clusters") } #' @export print.pmlPart <- function(x, ...) { df <- x$df nc <- attr(x$fits[[1]]$data, "nc") levels <- attr(x$fits[[1]]$data, "levels") r <- length(x$fits) nc <- attr(x$fits[[1]]$data, "nc") nr <- attr(x$fits[[1]]$data, "nr") k <- x$fits[[1]]$k lbf <- x$df["Bf", 2] bf <- matrix(0, lbf, nc) if (lbf > 1) dimnames(bf) <- list(1:r, levels) lQ <- x$df["Q", 2] Q <- matrix(0, lQ, nc * (nc - 1) / 2) if (lQ > 1) dimnames(Q) <- list(1:r, NULL) type <- attr(x$fits[[1]]$data, "type") loli <- numeric(r) rate <- numeric(r) shape <- numeric(r) sizes <- numeric(r) inv <- numeric(r) for (i in 1:r) { loli[i] <- x$fits[[i]]$logLik if (i <= lbf) bf[i, ] <- x$fits[[i]]$bf if (i <= lQ) Q[i, ] <- x$fits[[i]]$Q rate[i] <- x$fits[[i]]$rate shape[i] <- x$fits[[i]]$shape inv[i] <- x$fits[[i]]$inv sizes[i] <- sum(attr(x$fits[[i]]$data, "weight")) } cat("\nloglikelihood:", x$logLik, "\n") cat("\nloglikelihood of partitions:\n ", loli, "\n") cat("AIC: ", AIC(x), " BIC: ", AIC(x, k = log(sum(sizes))), "\n\n") cat("Proportion of invariant sites:", inv, "\n") cat("\nRates:\n") cat(rate, "\n") if (k > 1) { cat("\nShape parameter:\n") cat(shape, "\n") } if (type == "AA") cat("Rate matrix:", x$fits[[1]]$model, "\n") else { cat("\nBase frequencies: \n") print(bf) cat("\nRate matrix:\n") print(Q) } } #' @export logLik.pmlPart <- function(object, ...) { res <- object$logLik attr(res, "df") <- sum(object$df[, 1] * object$df[, 2]) class(res) <- "logLik" res } optNNI <- function(fit, INDEX) { tree <- fit$tree ll.0 <- fit$ll.0 loli <- fit$logLik bf <- fit$bf eig <- fit$eig k <- fit$k w <- fit$w g <- fit$g rootEdges <- attr(INDEX, "root") .dat <- NULL parent <- tree$edge[, 1] child <- tree$edge[, 2] data <- getCols(fit$data, tree$tip.label) datp <- rnodes(tree, data, w, g, eig, bf) # nicht elegant, spaeter auch raus tmp <- length(tree$tip.label) for (i in seq_along(w)) .dat[i, 1:tmp] <- new2old.phyDat(data) evector <- numeric(max(parent)) evector[child] <- tree$edge.length m <- dim(INDEX)[1] k <- min(parent) loglik <- numeric(2 * m) edgeMatrix <- matrix(0, 2 * m, 5) for (i in 1:m) { ei <- INDEX[i, ] el0 <- evector[INDEX[i, ]] l <- length(datp[, 1]) weight <- fit$weight datn <- vector("list", 4 * l) attr(datn, "dim") <- c(l, 4) datn <- .dat[, ei[1:4], drop = FALSE] if (!(ei[5] %in% rootEdges)) datn[, 1] <- datp[, ei[1], drop = FALSE] new1 <- optim.quartet(el0[c(1, 3, 2, 4, 5)], eig, bf, datn[, c(1, 3, 2, 4), drop = FALSE], g, w, weight, ll.0, llcomp = fit$log) new2 <- optim.quartet(el0[c(1, 4, 3, 2, 5)], eig, bf, datn[, c(1, 4, 3, 2), drop = FALSE], g, w, weight, ll.0, llcomp = fit$log) loglik[(2 * i) - 1] <- new1[[2]] loglik[(2 * i)] <- new2[[2]] edgeMatrix[(2 * i) - 1, ] <- new1[[1]] edgeMatrix[(2 * i), ] <- new2[[1]] } list(loglik = loglik, edges = edgeMatrix) } optimPartNNI <- function(object, AllEdge = TRUE, ...) { tree <- object[[1]]$tree INDEX <- indexNNI(tree) l <- length(object) loglik0 <- 0 for (i in 1:l) loglik0 <- loglik0 + logLik(object[[i]]) l <- length(object) TMP <- vector("list", l) for (i in 1:l) { TMP[[i]] <- optNNI(object[[i]], INDEX) } loglik <- TMP[[1]][[1]] for (i in 2:l) loglik <- loglik + TMP[[i]][[1]] swap <- 0 candidates <- loglik > loglik0 while (any(candidates)) { ind <- which.max(loglik) loglik[ind] <- -Inf if (ind %% 2) swap.edge <- c(2, 3) else swap.edge <- c(2, 4) tree2 <- changeEdge(tree, INDEX[(ind + 1) %/% 2, swap.edge], INDEX[(ind + 1) %/% 2, ], TMP[[1]][[2]][ind, ]) tmpll <- 0 for (i in 1:l) { if (!AllEdge) tree2 <- changeEdge(object[[i]]$tree, INDEX[(ind + 1) %/% 2, swap.edge], INDEX[(ind + 1) %/% 2, ], TMP[[i]][[2]][ind, ]) tmpll <- tmpll + update(object[[i]], tree = tree2)$logLik } if (tmpll < loglik0) candidates[ind] <- FALSE if (tmpll > loglik0) { swap <- swap + 1 tree <- tree2 indi <- which(rep(colSums(apply(INDEX, 1, match, INDEX[(ind + 1) %/% 2, ], nomatch = 0)) > 0, each = 2)) candidates[indi] <- FALSE loglik[indi] <- -Inf for (i in 1:l) { if (!AllEdge) tree2 <- changeEdge(object[[i]]$tree, INDEX[(ind + 1) %/% 2, swap.edge], INDEX[(ind + 1) %/% 2, ], TMP[[i]][[2]][ind, ]) object[[i]] <- update(object[[i]], tree = tree2) } loglik0 <- 0 for (i in 1:l) loglik0 <- loglik0 + logLik(object[[i]]) cat(loglik0, "\n") } } if (AllEdge) object <- optimPartEdge(object) attr(object, "swap") <- swap object } phangorn/R/codonTest.R0000644000176200001440000001436213475602650014372 0ustar liggesusers#' codonTest #' #' Models for detecting positive selection #' #' \code{codonTest} allows to test for positive selection similar to programs #' like PAML (Yang ) or HyPhy (Kosakovsky Pond et al. 2005). #' #' There are several options for deriving the codon frequencies. #' Frequencies can be "equal" (1/61), derived from nucleotide frequencies "F1x4" #' and "F3x4" or "empirical" codon frequencies. The frequencies taken using #' the empirical frequencies or estimated via maximum likelihood. #' #' So far the M0 model (Goldman and Yang 2002), M1a and M2a are #' implemented. The M0 model is always computed the other are optional. #' The convergence may be very slow and sometimes fails. #' #' @aliases codonTest #' @param object an object of class phyDat. #' @param tree a phylogenetic tree. #' @param model a vector containing the substitution models to compare with #' each other or "all" to test all available models. #' @param frequencies a character string or vector defining how to compute #' the codon frequencies #' @param opt_freq optimize frequencies (so far ignored) #' @param codonstart an integer giving where to start the translation. This #' should be 1, 2, or 3, but larger values are accepted and have for effect to #' start the translation further within the sequence. #' @param control a list of parameters for controlling the fitting process. #' @param ... further arguments passed to or from other methods. #' @return A list whith an element called summary containing a data.frame with #' the log-likelihood, number of estimated parameters, etc. of all tested #' models. An object called posterior which contains the posterior probability #' for the rate class for each sites and the estimates of the defined models. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}}, \code{\link{pmlMix}}, \code{\link{modelTest}}, #' \code{\link[stats]{AIC}} #' @references Ziheng Yang (2014). \emph{Molecular Evolution: A Statistical #' Approach}. Oxford University Press, Oxford #' #' Sergei L. Kosakovsky Pond, Simon D. W. Frost, Spencer V. Muse (2005) HyPhy: #' hypothesis testing using phylogenies, \emph{Bioinformatics}, \bold{21(5)}: #' 676--679, https://doi.org/10.1093/bioinformatics/bti079 #' #' Nielsen, R., and Z. Yang. (1998) Likelihood models for detecting positively #' selected amino acid sites and applications to the HIV-1 envelope gene. #' \emph{Genetics}, \bold{148}: 929--936 #' #' @examples #' #' \dontrun{ #' # load woodmouse data from ape #' data(woodmouse) #' dat_codon <- dna2codon(as.phyDat(woodmouse)) #' tree <- NJ(dist.ml(dat_codon)) #' # optimise the model the old way #' fit <- pml(tree, dat_codon, bf="F3x4") #' M0 <- optim.pml(fit, model="codon1") #' # Now using the codonTest function #' fit_codon <- codonTest(tree, dat_codon) #' fit_codon #' plot(fit_codon, "M1a") #' } #' #' @keywords cluster # @param control A list of parameters for controlling the fitting process. #' @export codonTest <- function(tree, object, model = c("M0", "M1a", "M2a"), frequencies = "F3x4", opt_freq=FALSE, codonstart = 1, control=pml.control(maxit = 20), ...){ if (attr(object, "type") == "DNA") object <- dna2codon(object, codonstart = codonstart) if (is.null(tree$edge.length)) tree <- nnls.phylo(tree, dist.ml(object)) if (!("M0" %in% model)) model <- c("M0", model) trace <- control$trace control$trace <- trace - 1 if (trace > 2) print("optimize model M0") fit <- pml(tree, object, bf = frequencies) M0 <- optim.pml(fit, model="codon1", control = control) result <- cbind(model = "M0", Frequencies = frequencies, estimate = "empirical", glance.pml(M0), dnds_0 = M0$dnds, dnds_1 = NA, dnds_2 = NA, p_0 = 1, p_1 = NA, p_2 = NA, tstv = M0$tstv) choices <- c("M0", "M1a", "M2a") model <- match.arg(choices, model, TRUE) M1a <- NULL M2a <- NULL estimates <- vector("list", length(model)) names(estimates) <- model estimates[["M0"]] <- M0 prob <- list() if ("M1a" %in% model) { if (trace > 2) print("optimize model M1a") M1a_start <- list(update(M0, dnds = 0.1, scaleQ = 1), update(M0, dnds = 1, scaleQ = 1)) M1a <- pmlMix(rate ~ M1a, M1a_start, m = 2, control = control) result <- rbind(result, cbind(model = "M1a", Frequencies = frequencies, estimate = "empirical", glance.pmlMix(M1a), dnds_0 = M1a$dnds[1], dnds_1 = 1, dnds_2 = NA, p_0 = M1a$omega[1], p_1 = M1a$omega[2], p_2 = NA, tstv = M1a$fits[[1]]$tstv)) prob[["M1a"]] <- neb(M1a) estimates[["M1a"]] <- M1a } if ("M2a" %in% model) { if (trace > 2) print("optimize model M2a") M2a_start <- list(update(M0, dnds = 0.1, scaleQ = 1), update(M0, dnds = 1, scaleQ = 1), update(M0, dnds = 3, scaleQ = 1)) M2a <- pmlMix(rate ~ M2a, M2a_start, m = 3, control = control) result <- rbind(result, cbind(model = "M2a", Frequencies = frequencies, estimate = "empirical", glance.pmlMix(M2a), dnds_0 = M2a$dnds[1], dnds_1 = 1, dnds_2 = M2a$dnds[3], p_0 = M2a$omega[1], p_1 = M2a$omega[2], p_2 = M2a$omega[3], tstv = M2a$fits[[1]]$tstv)) prob[["M2a"]] <- neb(M2a) estimates[["M2a"]] <- M2a } # attr(result, "estimates") <- estimates # attr(result, "prob") <- prob res <- list(summary = result, posterior = prob, estimates = estimates) class(res) <- "codonTest" res } # tidy codon glance.pml <- function(x, ...) { res <- data.frame(logLik = x$logLik, df = x$df, AIC = AIC(x), BIC = BIC(x)) res } glance.pmlMix <- function(x, ...) { nr <- attr(x$fits[[1]]$data, "nr") res <- data.frame(logLik = x$logLik, df = attr(logLik(x), "df"), AIC = AIC(x), BIC = AIC(x, k = log(nr))) res } #' @export print.codonTest <- function(x, ...) print(x$summary) #' @export plot.codonTest <- function(x, model = "M1a", col = c(2, 5, 6), ...) { dat <- t(x$posterior[[model]]) colnames(dat) <- seq_len(ncol(dat)) barplot(dat, col = col, space = 0, border = NA, legend.text = prettyNum(x$estimates[[model]]$dnds), ...) } # compute Naive Empirical Bayes (NEB) probabilities neb <- function(x) { p <- x$omega l <- length(p) index <- attr(x$fits[[1]]$data, "index") res <- matrix(0, max(index), l) for (i in seq_len(l)) res[, i] <- p[i] * x$fits[[i]]$lv res <- res / rowSums(res) res[index, ] } phangorn/R/distTree.R0000644000176200001440000004662713475602650014224 0ustar liggesusers# # UPGMA, NJ, UNJ, nnls # #' UPGMA and WPGMA #' #' UPGMA and WPGMA clustering. Just a wrapper function around #' \code{\link[stats]{hclust}}. #' #' #' @param D A distance matrix. #' @param method The agglomeration method to be used. This should be (an #' unambiguous abbreviation of) one of "ward", "single", "complete", "average", #' "mcquitty", "median" or "centroid". The default is "average". #' @param \dots Further arguments passed to or from other methods. #' @return A phylogenetic tree of class \code{phylo}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{hclust}}, \code{\link{dist.hamming}}, \code{\link{NJ}}, #' \code{\link{as.phylo}}, \code{\link{fastme}}, \code{\link{nnls.tree}} #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' dm <- dist.ml(Laurasiatherian) #' tree <- upgma(dm) #' plot(tree) #' #' @rdname upgma #' @export "upgma" <- function(D, method = "average", ...) { DD <- as.dist(D) hc <- hclust(DD, method = method, ...) result <- as.phylo(hc) result <- reorder(result, "postorder") result } #' @rdname upgma #' @export "wpgma" <- function(D, method = "mcquitty", ...) { DD <- as.dist(D) hc <- hclust(DD, method = method, ...) result <- as.phylo(hc) result <- reorder(result, "postorder") result } wpgma_weights <- function(tree){ ntips <- Ntip(tree) tree_u <- unroot(tree) ind <- sort(unique( tree_u$edge[,1]) )[-1] desc <- Descendants(tree_u, ind) x <- seq_len(ntips) w <- integer( ntips * (ntips-1L) / 2 ) for(i in seq_along(ind)){ ind <- getIndex(desc[[i]], x[-desc[[i]]], ntips) w[ind] <- w[ind] + 1L } w } upgma.edge.length <- function(x, dm, method = "average") { METHODS <- c("average", "single", "complete", "mcquitty") i.meth <- match.arg(method, METHODS) X <- designTree(x, "rooted", TRUE) labels <- x$tip if (is.matrix(dm) || inherits(dm, "dist")) { dm <- as.matrix(dm)[labels, labels] dm <- dm[lower.tri(dm)] } ind <- X@i + 1 node <- X@p X@x[] <- 1 nh <- numeric(max(x$edge)) Y <- X * dm if(i.meth=="mcquitty"){ w <- .5 ^ wpgma_weights(x) Y <- X * (dm * w) Y[,1] <- Y[,1]/2 # Y = as.matrix(X) # beta = solve( t(Y) %*% diag(w) %*% Y ) %*% (t(Y) %*% diag(w) %*% y) # nh[X@nodes] <- beta # x$edge.length <- (nh[x$edge[, 1]] - nh[x$edge[, 2]]) / 2 # return( x ) } for (i in 1:(length(node) - 1)) { pos <- ind[(node[i] + 1):node[i + 1]] tmp <- switch(i.meth, average = mean(Y[pos, i]), mcquitty = sum(Y[pos, i]), single = min(Y[pos, i]), complete = max(Y[pos, i])) nh[X@nodes[i]] <- tmp } x$edge.length <- (nh[x$edge[, 1]] - nh[x$edge[, 2]]) / 2 x } upgma_nni <- function(d, method = "average", opt = "min", trace = 0, mc.cores = 2L){ METHODS <- c("average", "single", "complete", "mcquitty") method <- match.arg(method, METHODS) OPT <- c("min", "ls") opt <- match.arg(opt, OPT) tree <- upgma(d, method = method) labels <- tree$tip.label nTips <- length(labels) y <- as.matrix(d)[labels, labels] y <- y[lower.tri(y)] best.tree <- tree bestLS <- sum( (coph(best.tree) - y)^2) bestME <- sum(best.tree$edge.length) run.nni <- TRUE count_nni <- 0 if (trace > 0) print(count_nni) while (run.nni) { trees <- nni(best.tree) trees <- .uncompressTipLabel(trees) trees <- unclass(trees) nni.trees <- lapply(trees, upgma.edge.length, y, method = method) ind <- which(vapply(nni.trees, function(x) !any(x$edge.length < 0), FALSE)) if (length(ind) == 0) return(best.tree) nni.trees <- nni.trees[ind] if (opt == "min") { ME <- vapply(nni.trees, function(x) sum(x$edge.length), 0) if (any(ME < bestME)) { bestME <- min(ME) count_nni <- count_nni + 1 best.tree <- nni.trees[[which.min(ME)]] if (trace > 0) print(bestME) } else run.nni <- FALSE } else { LS <- vapply(nni.trees, function(x) sum( (coph(x) - y)^2), 0) if (any(LS < bestLS)) { bestLS <- min(LS) count_nni <- count_nni + 1 best.tree <- nni.trees[[which.min(LS)]] if (trace > 0) print(bestLS) } else run.nni <- FALSE } } best.tree } #' Neighbor-Joining #' #' This function performs the neighbor-joining tree estimation of Saitou and #' Nei (1987). UNJ is the unweighted version from Gascuel (1997). #' #' #' @param x A distance matrix. #' @return an object of class \code{"phylo"}. #' @author Klaus P. Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[ape]{nj}}, \code{\link[ape]{dist.dna}}, #' \code{\link[phangorn]{dist.hamming}}, \code{\link[phangorn]{upgma}}, #' \code{\link[ape]{fastme}} #' @references Saitou, N. and Nei, M. (1987) The neighbor-joining method: a new #' method for reconstructing phylogenetic trees. \emph{Molecular Biology and #' Evolution}, \bold{4}, 406--425. #' #' Studier, J. A and Keppler, K. J. (1988) A Note on the Neighbor-Joining #' Algorithm of Saitou and Nei. \emph{Molecular Biology and Evolution}, #' \bold{6}, 729--731. #' #' Gascuel, O. (1997) Concerning the NJ algorithm and its unweighted version, #' UNJ. in Birkin et. al. \emph{Mathematical Hierarchies and Biology}, #' 149--170. #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' dm <- dist.ml(Laurasiatherian) #' tree <- NJ(dm) #' plot(tree) #' #' @rdname NJ #' @export NJ <- function(x) reorder(nj(x), "postorder") #' @rdname NJ #' @export UNJ <- function(x){ x <- as.matrix(x) labels <- attr(x, "Labels")[[1]] edge.length <- NULL edge <- NULL d <- as.matrix(x) if (is.null(labels)) labels <- colnames(d) l <- dim(d)[1] n <- l nam <- as.character(1:l) m <- l - 2 nam <- 1:l k <- 2 * l - 2 w <- rep(1, l) while (l > 2) { r <- rowSums(d) / (l - 2) i <- 0 j <- 0 tmp <- .C("out", as.double(d), as.double(r), as.integer(l), as.integer(i), as.integer(j)) e2 <- tmp[[5]] e1 <- tmp[[4]] l1 <- d[e1, e2] / 2 + sum( (d[e1, -c(e1, e2)] - d[e2, -c(e1, e2)]) * w[-c(e1, e2)]) / (2 * (n - w[e1] - w[e2])) l2 <- d[e1, e2] / 2 + sum( (d[e2, -c(e1, e2)] - d[e1, -c(e1, e2)]) * w[-c(e1, e2)]) / (2 * (n - w[e1] - w[e2])) edge.length <- c(l1, l2, edge.length) edge <- rbind(c(k, nam[e2]), edge) edge <- rbind(c(k, nam[e1]), edge) nam <- c(nam[c(-e1, -e2)], k) dnew <- (w[e1] * d[e1, ] + w[e2] * d[e2, ] - w[e1] * l1 - w[e2] * l2) / (w[e1] + w[e2]) d <- cbind(d, dnew) d <- rbind(d, c(dnew, 0)) d <- d[-c(e1, e2), -c(e1, e2)] w <- c(w, w[e1] + w[e2]) w <- w[-c(e1, e2)] k <- k - 1 l <- l - 1 } edge.length <- c(d[2, 1], edge.length) result <- list(edge = rbind(c(nam[2], nam[1]), edge), edge.length = edge.length, tip.label = labels, Nnode = m) class(result) <- "phylo" reorder(result, "postorder") } PNJ <- function(data) { q <- l <- r <- length(data) weight <- attr(data, "weight") height <- NULL parentNodes <- NULL childNodes <- NULL nam <- names(data) tip.label <- nam edge <- 1:q z <- 0 D <- matrix(0, q, q) for (i in 1:(l - 1)) { for (j in (i + 1):l) { w <- (data[[i]] * data[[j]]) %*% c(1, 1, 1, 1) D[i, j] <- sum(weight[w == 0]) } } while (l > 1) { l <- l - 1 z <- z + 1 d <- D + t(D) if (l > 1) r <- rowSums(d) / (l - 1) if (l == 1) r <- rowSums(d) M <- d - outer(r, r, "+") diag(M) <- Inf e <- which.min(M) e0 <- e %% length(r) e1 <- ifelse(e0 == 0, length(r), e0) e2 <- ifelse(e0 == 0, e %/% length(r), e %/% length(r) + 1) ind <- c(e1, e2) len <- d[e] / 2 nam <- c(nam[-ind], as.character(-l)) parentNodes <- c(parentNodes, -l, -l) childNodes <- c(childNodes, edge[e1], edge[e2]) height <- c(height, len, len) edge <- c(edge[-ind], -l) w <- (data[[e1]] * data[[e2]]) %*% c(1, 1, 1, 1) w <- which(w == 0) newDat <- data[[e1]] * data[[e2]] newDat[w, ] <- data[[e1]][w, ] + data[[e2]][w, ] data <- data[-c(e1, e2)] data[[l]] <- newDat if (l > 1) { D <- as.matrix(D[, -ind]) D <- D[-ind, ] dv <- numeric(l - 1) for (i in 1:(l - 1)) { w <- (data[[i]] * data[[l]]) %*% c(1, 1, 1, 1) dv[i] <- sum(weight[w == 0]) } D <- cbind(D, dv) D <- rbind(D, 0) } } tree <- list(edge = cbind(as.character(parentNodes), as.character(childNodes)), tip.label = tip.label) class(tree) <- "phylo" tree <- old2new.phylo(tree) reorder(tree) } # # Distance Matrix methods # #' Compute a design matrix or non-negative LS #' #' \code{nnls.tree} estimates the branch length using non-negative least #' squares given a tree and a distance matrix. \code{designTree} and #' \code{designSplits} compute design matrices for the estimation of edge #' length of (phylogenetic) trees using linear models. For larger trees a #' sparse design matrix can save a lot of memory. %\code{designTree} also #' computes a contrast matrix if the method is "rooted". #' #' @param tree an object of class \code{phylo} #' @param method design matrix for an "unrooted" or "rooted" ultrametric tree. #' @param sparse return a sparse design matrix. #' @param x number of taxa. #' @param splits one of "all", "star". #' @param dm a distance matrix. #' @param rooted compute a "rooted" or "unrooted" tree. #' @param trace defines how much information is printed during optimisation. #' @param \dots further arguments, passed to other methods. #' @param weight vector of weights to be used in the fitting process. #' Weighted least squares is used with weights w, i.e., sum(w * e^2) is #' minimized. #' @param balanced use weights as in balanced fastME #' @return \code{nnls.tree} return a tree, i.e. an object of class #' \code{phylo}. \code{designTree} and \code{designSplits} a matrix, possibly #' sparse. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[ape]{fastme}}, #' \code{\link[phangorn]{distanceHadamard}}, #' \code{\link[phangorn]{splitsNetwork}}, \code{\link[phangorn]{upgma}} #' @keywords cluster #' @importFrom Matrix Matrix sparseMatrix crossprod solve #' @importFrom quadprog solve.QP.compact #' @examples #' #' example(NJ) #' dm <- as.matrix(dm) #' y <- dm[lower.tri(dm)] #' X <- designTree(tree) #' lm(y~X-1) #' # avoids negative edge weights #' tree2 <- nnls.tree(dm, tree) #' #' @rdname designTree #' @export designTree <- function(tree, method = "unrooted", sparse = FALSE, ...) { if (!is.na(pmatch(method, "all"))) method <- "unrooted" METHOD <- c("unrooted", "rooted") method <- pmatch(method, METHOD) if (is.na(method)) stop("invalid method") if (method == -1) stop("ambiguous method") if (!is.rooted(tree) & method == 2) stop("tree has to be rooted") if (method == 1) { X <- designUnrooted(tree, ...) if (sparse) X <- Matrix(X) } if (method == 2) X <- designUltra(tree, sparse = sparse, ...) X } # splits now work designUnrooted <- function(tree, order = NULL) { if (inherits(tree, "phylo")) { if (is.rooted(tree)) tree <- unroot(tree) p <- bipartition(tree) } if (inherits(tree, "splits")) p <- as.matrix(tree) if (!is.null(order)) p <- p[, order] m <- dim(p)[2] ind <- rowSums(p) p <- p[ind != m, ] n <- dim(p)[1] res <- matrix(0, (m - 1) * m / 2, n) k <- 1 for (i in 1:(m - 1)) { for (j in (i + 1):m) { res[k, ] <- p[, i] != p[, j] k <- k + 1 } } if (inherits(tree, "phylo")) colnames(res) <- paste(tree$edge[, 1], tree$edge[, 2], sep = "<->") res } designUltra <- function(tree, sparse = TRUE) { if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") leri <- allChildren(tree) bp <- bip(tree) n <- length(tree$tip.label) l <- tree$Nnode nodes <- integer(l) k <- 1L u <- numeric(n * (n - 1) / 2) v <- numeric(n * (n - 1) / 2) m <- 1L for (i in seq_along(leri)) { if (length(leri[[i]]) > 1) { if (length(leri[[i]]) == 2) ind <- getIndex(bp[[leri[[i]][1] ]], bp[[leri[[i]][2] ]], n) else { ind <- NULL le <- leri[[i]] nl <- length(le) for (j in 1:(nl - 1)) ind <- c(ind, getIndex(bp[[le[j] ]], unlist(bp[ le[(j + 1):nl] ]), n)) } li <- length(ind) v[m:(m + li - 1)] <- k u[m:(m + li - 1)] <- ind nodes[k] <- i m <- m + li k <- k + 1L } } if (sparse) X <- sparseMatrix(i = u, j = v, x = 2L) else { X <- matrix(0L, n * (n - 1) / 2, l) X[cbind(u, v)] <- 2L } colnames(X) <- nodes attr(X, "nodes") <- nodes X } designUnrooted2 <- function(tree, sparse = TRUE) { if (is.null(attr(tree, "order")) || attr(tree, "order") != "postorder") tree <- reorder(tree, "postorder") leri <- allChildren(tree) bp <- bip(tree) n <- length(tree$tip.label) l <- tree$Nnode nodes <- integer(l) nTips <- as.integer(length(tree$tip.label)) k <- nTips u <- numeric(n * (n - 1) / 2) v <- numeric(n * (n - 1) / 2) z <- numeric(n * (n - 1) / 2) y <- numeric(n * (n - 1) / 2) p <- 1L m <- 1L for (i in seq_along(leri)) { if (length(leri[[i]]) > 1) { if (length(leri[[i]]) == 2) { ind <- getIndex(bp[[leri[[i]][1] ]], bp[[leri[[i]][2] ]], n) ytmp <- rep(bp[[leri[[i]][1] ]], each = length(bp[[leri[[i]][2] ]])) ztmp <- rep(bp[[leri[[i]][2] ]], length(bp[[leri[[i]][1] ]])) } else { ind <- NULL le <- leri[[i]] nl <- length(le) ytmp <- NULL ztmp <- NULL for (j in 1:(nl - 1)) { bp1 <- bp[[le[j] ]] bp2 <- unlist(bp[le[(j + 1):nl] ]) ind <- c(ind, getIndex(bp1, unlist(bp2), n)) ytmp <- c(ytmp, rep(bp1, each = length(bp2))) ztmp <- c(ztmp, rep(bp2, length(bp1))) } } li <- length(ind) v[m:(m + li - 1)] <- k u[m:(m + li - 1)] <- ind y[m:(m + li - 1)] <- ytmp z[m:(m + li - 1)] <- ztmp nodes[p] <- i m <- m + li k <- k + 1L p <- p + 1L } } jj <- c(y, z) # [ind],v) ii <- c(u, u) # [ind],u) ind <- (jj < nTips) jj <- c(jj[ind], v) ii <- c(ii[ind], u) l1 <- length(u) l2 <- sum(ind) x <- rep(c(-1L, 2L), c(l2, l1)) X <- sparseMatrix(i = ii, j = jj, x = x) if (!sparse) { X <- as.matrix(X) } nodes <- c(1:(nTips - 1L), nodes) colnames(X) <- nodes attr(X, "nodes") <- nodes X } #' @rdname designTree #' @export nnls.tree <- function(dm, tree, rooted = FALSE, trace = 1, weight = NULL, balanced = FALSE) { if (is.rooted(tree) & rooted == FALSE) { tree <- unroot(tree) warning("tree was rooted, I unrooted the tree!") } tree <- reorder(tree, "postorder") if (balanced) { if (!is.binary(tree)) stop("tree must be binary") weight <- rowSums(designTree(unroot(tree))) } dm <- as.matrix(dm) k <- dim(dm)[1] labels <- tree$tip.label dm <- dm[labels, labels] y <- dm[lower.tri(dm)] # computing the design matrix from the tree if (rooted) X <- designUltra(tree) else X <- designUnrooted2(tree) if (!is.null(weight)) { y <- y * sqrt(weight) X <- X * sqrt(weight) } lab <- attr(X, "nodes") # na.action if (any(is.na(y))) { ind <- which(is.na(y)) X <- X[-ind, , drop = FALSE] y <- y[-ind] } # LS solution Dmat <- crossprod(X) # cross-product computations dvec <- crossprod(X, y) betahat <- as.vector(solve(Dmat, dvec)) betahattmp <- betahat bhat <- numeric(max(tree$edge)) bhat[as.integer(lab)] <- betahat betahat <- bhat[tree$edge[, 1]] - bhat[tree$edge[, 2]] if (!any(betahat < 0)) { # if(!rooted){ RSS <- sum((y - (X %*% betahattmp))^2) if (trace) print(paste("RSS:", RSS)) attr(tree, "RSS") <- RSS # } tree$edge.length <- betahat return(tree) } # non-negative LS n <- dim(X)[2] l <- nrow(tree$edge) lab <- attr(X, "nodes") # vielleicht solve.QP.compact ind1 <- match(tree$edge[, 1], lab) ind2 <- match(tree$edge[, 2], lab) Amat <- matrix(0, 2, l) Amat[1, ] <- 1 Amat[2, ] <- -1 Aind <- matrix(0L, 3, l) Aind[1, ] <- 2L Aind[2, ] <- as.integer(ind1) Aind[3, ] <- as.integer(ind2) if (any(is.na(Aind))) { na_ind <- which(is.na(Aind), arr.ind = TRUE) Aind[is.na(Aind)] <- 0L for (i in seq_len(nrow(na_ind)) ){ Aind[1, na_ind[i, 2]] <- Aind[1, na_ind[i, 2]] - 1L } } betahat <- quadprog::solve.QP.compact(as.matrix(Dmat), as.vector(dvec), Amat, Aind)$sol # quadratic programing solving RSS <- sum((y - (X %*% betahat))^2) if (trace) print(paste("RSS:", RSS)) attr(tree, "RSS") <- RSS bhat <- numeric(max(tree$edge)) bhat[as.integer(lab)] <- betahat betahat <- bhat[tree$edge[, 1]] - bhat[tree$edge[, 2]] tree$edge.length <- betahat tree } #' @rdname designTree #' @export nnls.phylo <- function(x, dm, rooted = FALSE, trace = 0, ...) { nnls.tree(dm, x, rooted, trace = trace, ...) } #' @rdname designTree #' @export nnls.splits <- function(x, dm, trace = 0) { labels <- attr(x, "labels") dm <- as.matrix(dm) k <- dim(dm)[1] dm <- dm[labels, labels] y <- dm[lower.tri(dm)] x <- SHORTwise(x, k) l <- lengths(x) if (any(l == 0)) x <- x[-which(l == 0)] X <- splits2design(x) if (any(is.na(y))) { ind <- which(is.na(y)) X <- X[-ind, , drop = FALSE] y <- y[-ind] } Dmat <- crossprod(X) # cross-product computations dvec <- crossprod(X, y) betahat <- as.vector(solve(Dmat, dvec)) if (!any(betahat < 0)) { RSS <- sum((y - (X %*% betahat))^2) if (trace) print(paste("RSS:", RSS)) attr(x, "RSS") <- RSS attr(x, "weights") <- betahat return(x) } n <- dim(X)[2] int <- lengths(x) # quadratic programing Amat <- matrix(1, 1, n) Aind <- matrix(0L, 2L, n) Aind[1, ] <- 1L Aind[2, ] <- as.integer(1L:n) betahat <- quadprog::solve.QP.compact(as.matrix(Dmat), as.vector(dvec), Amat, Aind)$sol RSS <- sum((y - (X %*% betahat))^2) ind <- (betahat > 1e-8) | int == 1 x <- x[ind] attr(x, "weights") <- betahat[ind] if (trace) print(paste("RSS:", RSS)) attr(x, "RSS") <- RSS x } #' @rdname designTree #' @export nnls.networx <- function(x, dm) { # spl <- attr(x, "splits") spl <- x$splits spl2 <- nnls.splits(spl, dm) weight <- attr(spl, "weight") weight[] <- 0 weight[match(spl2, spl)] <- attr(spl2, "weight") # attr(attr(x, "splits"), "weight") <- weight attr(x$splits, "weight") <- weight x$edge.length <- weight[x$splitIndex] x } #' @rdname designTree #' @export designSplits <- function(x, splits = "all", ...) { if (!is.na(pmatch(splits, "all"))) splits <- "all" if (inherits(x, "splits")) return(designUnrooted(x)) SPLITS <- c("all", "star") # ,"caterpillar") splits <- pmatch(splits, SPLITS) if (is.na(splits)) stop("invalid splits method") if (splits == -1) stop("ambiguous splits method") if (splits == 1) X <- designAll(x) if (splits == 2) X <- designStar(x, ...) return(X) } # add return splits=FALSE designAll <- function(n, add.split = FALSE) { Y <- matrix(0L, n * (n - 1) / 2, n) k <- 1 for (i in 1:(n - 1)) { for (j in (i + 1):n) { Y[k, c(i, j)] <- 1L k <- k + 1L } } m <- n - 1L X <- matrix(0L, m + 1, 2^m) for (i in 1:m) X[i, ] <- rep(rep(c(0L, 1L), each = 2^(i - 1)), 2^(m - i)) X <- X[, -1] if (!add.split) return((Y %*% X) %% 2) list(X = (Y %*% X) %% 2, Splits = t(X)) } # faster sparse version designStar <- function(n, sparse = TRUE) { # res=NULL # for(i in 1:(n-1)) res = rbind(res,cbind(matrix(0,(n-i),i-1),1,diag(n-i))) res <- stree(n) %>% as.splits %>% splits2design if (!sparse) return(as.matrix(res)) res } phangorn/R/SOWH.R0000644000176200001440000001243513475602650013207 0ustar liggesusers#' Swofford-Olsen-Waddell-Hillis Test #' #' This function computes the Swofford--Olsen--Waddell--Hillis (SOWH) test, a #' parametric bootstrap test. The function is computational very demanding and #' likely to be very slow. #' #' \code{SOWH.test} performs a parametric bootstrap test to compare two trees. #' It makes extensive use \code{simSeq} and \code{optim.pml} and can take quite #' long. #' #' @param x an object of class \code{"pml"}. #' @param n the number of bootstrap replicates. #' @param restricted list of restricted parameter settings. #' @param optNni Logical value indicating whether topology gets optimized #' (NNI). #' @param trace Show output during computations. #' @param \dots Further arguments passed to \code{"optim.pml"}. #' @return an object of class SOWH. That is a list with three elements, one is #' a matrix containing for each bootstrap replicate the (log-) likelihood of #' the restricted and unrestricted estimate and two pml objects of the #' restricted and unrestricted model. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}}, \code{\link{pmlPart}}, \code{\link{pmlCluster}}, #' \code{\link{simSeq}}, \code{\link{SH.test}} #' @references Goldman, N., Anderson, J. P., and Rodrigo, A. G. (2000) #' Likelihood -based tests of topologies in phylogenetics. \emph{Systematic #' Biology} \bold{49} 652-670. #' #' Swofford, D.L., Olsen, G.J., Waddell, P.J. and Hillis, D.M. (1996) #' Phylogenetic Inference in Hillis, D.M., Moritz, C. and Mable, B.K. (Eds.) #' \emph{Molecular Systematics} (2nd ed.) 407-514, Sunderland, MA: Sinauer #' @keywords models #' @examples #' #' # in real analysis use larger n, e.g. 500 preferably more #' \dontrun{ #' data(Laurasiatherian) #' dm <- dist.logDet(Laurasiatherian) #' tree <- NJ(dm) #' fit <- pml(tree, Laurasiatherian) #' fit <- optim.pml(fit, TRUE) #' set.seed(6) #' tree <- rNNI(fit$tree, 1) #' fit <- update(fit, tree = tree) #' (res <- SOWH.test(fit, n=100)) #' summary(res) #' } #' #' @export SOWH.test SOWH.test <- function(x, n = 100, restricted = list(optNni = FALSE), optNni = TRUE, trace = 1, ...) { res <- matrix(NA, n, 2) extras <- match.call(expand.dots = FALSE)$... optU <- list (optNni = optNni, optBf = FALSE, optQ = FALSE, optInv = FALSE, optGamma = FALSE, optEdge = TRUE, optRate = FALSE, optRooted = FALSE, model = NULL) if (!is.null(extras)) { namAll <- names(extras) for (i in seq_along(extras)) optU[[namAll[i]]] <- extras[[i]] } optR <- optU namR <- names(restricted) for (i in seq_along(namR)) optR[[namR[i]]] <- restricted[[i]] restr <- optim.pml(x, optNni = optR$optNni, optBf = optR$optBf, optQ = optR$optQ, optInv = optR$optInv, optGamma = optR$optGamma, optEdge = optR$optEdge, optRate = optR$optRate, optRooted = optR$optRooted, model = optR$model, pml.control(trace = trace - 1L)) unrestr <- optim.pml(restr, optNni = optU$optNni, optBf = optU$optBf, optQ = optU$optQ, optInv = optU$optInv, optGamma = optU$optGamma, optEdge = optU$optEdge, optRate = optU$optRate, optRooted = optU$optRooted, model = optU$model, pml.control(trace = trace - 1L)) for (i in 1:n) { if (trace > 0) cat("iteration: ", i, "\n") newData <- simSeq(restr) restrTmp <- update(restr, data = newData) unrestrTmp <- restrTmp restrTmp <- optim.pml(restrTmp, optNni = optR$optNni, optBf = optR$optBf, optQ = optR$optQ, optInv = optR$optInv, optGamma = optR$optGamma, optEdge = optR$optEdge, optRate = optR$optRate, optRooted = optR$optRooted, model = optR$model, pml.control(trace = trace - 1L)) unrestrTmp <- optim.pml(unrestrTmp, optNni = optU$optNni, optBf = optU$optBf, optQ = optU$optQ, optInv = optU$optInv, optGamma = optU$optGamma, optEdge = optU$optEdge, optRate = optU$optRate, optRooted = optU$optRooted, model = optU$model, pml.control(trace = trace - 1L)) res[i, 1] <- logLik(restrTmp) res[i, 2] <- logLik(unrestrTmp) } result <- list("LL" = res, "restr" = restr, "unrestr" = unrestr) class(result) <- "SOWH" result } #' @export print.SOWH <- function(x, digits = 4L, ...) { resLL <- logLik(x$restr) unresLL <- logLik(x$unrestr) diffLL <- unresLL - resLL pval <- sum( (x$LL[, 2] - x$LL[, 1]) > diffLL) / nrow(x$LL) res <- c(resLL, unresLL, diffLL, pval) names(res) <- c("ln L restr", "ln L unrestr", "Diff ln L", "p-value") print(res, digits = digits) invisible(x) } #' @export summary.SOWH <- function(object, digits = 4L, plot = TRUE, ...) { resLL <- logLik(object$restr) unresLL <- logLik(object$unrestr) diffLL <- unresLL - resLL pval <- sum( (object$LL[, 2] - object$LL[, 1]) > diffLL) / nrow(object$LL) res <- c(resLL, unresLL, diffLL, pval) names(res) <- c("ln L restr", "ln L unrestr", "Diff ln L", "p-value") print(res, digits = digits) if (plot) { d <- object$LL[, 2] - object$LL[, 1] hist(d, freq = FALSE, xlim = c(0, 1.2 * max(d, diffLL))) abline(v = diffLL, col = "red") } invisible(object) } phangorn/R/splits.R0000644000176200001440000003605413501227242013736 0ustar liggesusers#' Splits representation of graphs and trees. #' #' \code{as.splits} produces a list of splits or bipartitions. #' #' @aliases splits as.Matrix distinct.splits as.phylo.splits #' addTrivialSplits removeTrivialSplits matchSplits #' @param x An object of class phylo or multiPhylo. #' @param maxp integer, default from \code{options(max.print)}, influences how #' many entries of large matrices are printed at all. #' @param zero.print character which should be printed for zeros. #' @param one.print character which should be printed for ones. #' @param incomparables only for compatibility so far. #' @param unrooted todo. #' @param \dots Further arguments passed to or from other methods. #' @param recursive logical. If recursive = TRUE, the function recursively #' descends through lists (and pairlists) combining all their elements into a #' vector. #' @param obj an object of class splits. #' @param k number of taxa. #' @param labels names of taxa. #' @return \code{as.splits} returns an object of class splits, which is mainly #' a list of splits and some attributes. Often a \code{splits} object will #' contain attributes \code{confidences} for bootstrap or Bayesian support #' values and \code{weight} storing edge weights. #' \code{compatible} return a lower triangular matrix where an 1 indicates that #' two splits are incompatible. #' @note The internal representation is likely to change. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{prop.part}}, \code{\link{lento}}, #' \code{\link{as.networx}}, \code{\link{distanceHadamard}}, #' \code{\link{read.nexus.splits}} #' @keywords cluster #' @examples #' #' (sp <- as.splits(rtree(5))) #' write.nexus.splits(sp) #' spl <- allCircularSplits(5) #' plot(as.networx(spl), "2D") #' #' @rdname as.splits #' @export as.splits <- function(x, ...) { if (inherits(x, "splits")) return(x) UseMethod("as.splits") } #' @export as.Matrix <- function(x, ...) { if (inherits(x, "Matrix")) return(x) UseMethod("as.Matrix") } #' @rdname as.splits #' @method as.matrix splits #' @export as.matrix.splits <- function(x, zero.print = 0L, one.print = 1L, ...) { m <- length(x) labels <- attr(x, "labels") n <- length(labels) res <- matrix(zero.print, m, n) for (i in 1:m) res[i, x[[i]]] <- one.print dimnames(res) <- list(names(x), labels) res } #' @rdname as.splits #' @importFrom Matrix sparseMatrix #' @method as.Matrix splits #' @export as.Matrix.splits <- function(x, ...) { labels <- attr(x, "labels") l <- length(x) j <- unlist(x) i <- rep(1:l, lengths(x)) sparseMatrix(i, j, x = rep(1L, length(i)), dimnames = list(NULL, labels)) # included x und labels } #' @rdname as.splits #' @export print.splits <- function(x, maxp = getOption("max.print"), zero.print = ".", one.print = "|", ...) { x.orig <- x cx <- as.matrix(x, zero.print = zero.print, one.print = one.print) print(cx, quote = FALSE, right = TRUE, max = maxp) invisible(x.orig) } #' @export "[.splits" <- function(x, i) { tmp <- attributes(x) result <- unclass(x)[i] if (!is.null(tmp$weights)) tmp$weights <- tmp$weights[i] if (!is.null(tmp$confidences)) tmp$confidences <- tmp$confidences[i] if (!is.null(tmp$intervals)) tmp$intervals <- tmp$intervals[i] if (!is.null(tmp$data)) tmp$data <- tmp$data[i, , drop = FALSE] attributes(result) <- tmp result } changeOrder <- function(x, labels) { oldL <- attr(x, "labels") ind <- match(oldL, labels) for (i in seq_along(x)) x[[i]] <- sort(ind[x[[i]]]) if (!is.null(attr(x, "cycle"))) attr(x, "cycle") <- ind[attr(x, "cycle")] attr(x, "labels") <- labels x } ## @rdname as.splits #' @export matchSplits <- function(x, y, as.in = TRUE) { tiplabel <- attr(x, "label") if (any(is.na(match(tiplabel, attr(y, "label"))))) stop("x and y have different labels!") nTips <- length(tiplabel) y <- changeOrder(y, tiplabel) y <- SHORTwise(y, nTips) if (as.in) return(match(SHORTwise(x, nTips), y, nomatch = 0L) > 0L) match(SHORTwise(x, nTips), y) } optCycle <- function(splits, tree) { tips <- tree$tip.label tree <- reorder(tree) nodes <- sort(unique(tree$edge[, 1])) M <- as.matrix(splits) l <- as.integer(nrow(M)) m <- as.integer(ncol(M)) tmp <- tree$edge[, 2] tmp <- tmp[tmp <= m] start <- .C("countCycle", M[, tmp], l, m, integer(1))[[4]] best <- start eps <- 1 if (eps > 0) { for (i in seq_along(nodes)) { tmptree <- rotate(tree, nodes[i]) tmp <- tmptree$edge[, 2] tmp <- tmp[tmp <= m] tmpC <- .C("countCycle", M[, tmp], l, m, integer(1))[[4]] if (tmpC < best) { best <- tmpC tree <- tmptree } } eps <- start - best } tree } countCycles <- function(splits, tree = NULL, ord = NULL) { M <- as.matrix(splits) l <- as.integer(nrow(M)) m <- as.integer(ncol(M)) if (!is.null(tree)) ord <- getOrdering(tree) res <- .C("countCycle2", M[, ord], l, m, integer(l))[[4]] res } #' @rdname as.splits #' @method c splits #' @export c.splits <- function(..., recursive = FALSE) { x <- list(...) if (length(x) == 1 && !inherits(x[[1]], "splits")) x <- x[[1]] n <- length(x) match.names <- function(a, b) { if (any(!(a %in% b))) stop("names do not match previous names") } if (n == 1) return(x[[1]]) labels <- attr(x[[1]], "labels") cycle <- attr(x[[1]], "cycle") for (i in 2:n) { match.names(labels, attr(x[[i]], "labels")) x[[i]] <- changeOrder(x[[i]], labels) } w <- as.vector(unlist(lapply(x, attr, "weights"))) x <- lapply(x, unclass) res <- structure(do.call("c", x), class = c("splits", "prop.part")) names(res) <- NULL attr(res, "labels") <- labels attr(res, "weights") <- w attr(res, "cycle") <- cycle res } #' @rdname as.splits #' @method unique splits #' @export unique.splits <- function(x, incomparables = FALSE, unrooted = TRUE, ...) { nTips <- length(attr(x, "labels")) x <- SHORTwise(x, nTips) x[!duplicated(x)] } #' @export distinct.splits <- function(...) { tmp <- c(...) res <- unique(tmp) attributes(res) <- attributes(tmp) attr(res, "weights") <- tabulate(match(tmp, res)) res } # computes splits from phylo #' @rdname as.splits #' @method as.splits phylo #' @export as.splits.phylo <- function(x, ...) { if (hasArg(as.is)) as.is <- list(...)$as.is else as.is <- TRUE result <- bip(x) if (!is.null(x$edge.length)) { edge.weights <- numeric(max(x$edge)) edge.weights[x$edge[, 2]] <- x$edge.length attr(result, "weights") <- edge.weights } if (!is.null(x$node.label)) { conf <- x$node.label if (is.character(conf)) as.is <- TRUE #conf <- as.numeric(conf) if (!as.is) if (max(na.omit(conf)) > (1 + 1e-8)) conf <- conf / 100 attr(result, "confidences") <- c(rep(NA_real_, length(x$tip.label)), conf) } attr(result, "labels") <- x$tip.label class(result) <- c("splits", "prop.part") result } # computes splits from multiPhylo object (e.g. bootstrap, MCMC etc.) #' @rdname as.splits #' @method as.splits multiPhylo #' @export as.splits.multiPhylo <- function(x, ...) { lx <- length(x) x <- unroot(x) splits <- prop.part(x) splits <- postprocess.prop.part(splits) class(splits) <- "list" weights <- attr(splits, "number") lab <- attr(splits, "labels") attr(splits, "labels") <- attr(splits, "number") <- NULL l <- length(lab) splitTips <- vector("list", l) for (i in 1:l) splitTips[[i]] <- i result <- c(splitTips, splits) attr(result, "weights") <- c(rep(lx, l), weights) attr(result, "confidences") <- attr(result, "weights") / lx attr(result, "summary") <- list(confidences = "ratio", ntrees = lx, clades = FALSE) attr(result, "labels") <- lab class(result) <- c("splits", "prop.part") result } #' @export as.splits.prop.part <- function(x, ...) { if (is.null(attr(x, "number"))) attr(x, "weights") <- rep(1, length(x)) else { attr(x, "weights") <- attr(x, "number") if( is.integer(attr(x, "number")) )attr(x, "confidences") <- attr(x, "number") / attr(x, "number")[1] } class(x) <- c("splits", "prop.part") x } #' @rdname as.splits #' @method as.splits networx #' @export as.splits.networx <- function(x, ...) { if (!is.null(x$splits)) x$splits else warning("No split object included!") } #' @rdname as.splits #' @method as.prop.part splits #' @export as.prop.part.splits <- function(x, ...) { attr(x, "number") <- attr(x, "weights") attr(x, "weights") <- NULL attr(x, "confidences") <- NULL class(x) <- c("prop.part") x } ## as.splits.phylo ## @rdname as.splits ## @method as.phylo splits #' @export as.phylo.splits <- function(x, check=TRUE,...){ if(check) x <- compatibleSplits(x) phy <- splits2phylo(x) spl <- as.splits(phy)[phy$edge[,2]] ind <- matchSplits(spl, x, FALSE) phy$edge.length <- attr(x, "weights")[ind] phy } splits2phylo <- function(x){ labels <- attr(x, "labels") nTips <- length(labels) x <- SHORTwise(x, nTips, TRUE) l <- lengths(x) x <- x[order(l)] x <- x[lengths(x) > 1] nNodes <- length(x) + 1L node_i <- as.integer( nNodes + nTips ) edge <- matrix(0L, node_i - 1L, 2L) y <- seq_len(nTips) x <- unclass(x) m <- 0 for(i in seq_along(x)){ tmp <- x[[i]] kids <- unique( y[ tmp ] ) k <- length(kids) y[ tmp ] <- node_i edge[m + 1:k ,1] <- node_i edge[m + 1:k ,2] <- kids m <- m + k node_i <- node_i - 1L } kids <- unique( y ) k <- length(kids) edge[m + 1:k ,1] <- node_i edge[m + 1:k ,2] <- kids phy <- structure(list(edge, labels, nNodes), .Names = c("edge", "tip.label", "Nnode"), class = "phylo", order = "postorder") phy } compatibleSplits <- function(x) { x <- postprocess.splits(x) labels <- attr(x, "labels") nTips <- length(labels) x <- SHORTwise(x, nTips) # x <- x[lengths(x)>1] dm <- as.matrix(compatible(x)) rs <- rowSums(dm) ind <- which(rs == 0) if (any(rs > 0)) { tmp <- which(rs > 0) candidates <- tmp[order(rs[tmp])] for (i in candidates) { if (sum(dm[ind, i]) == 0) ind <- c(ind, i) } } x[ind] } postprocess.splits <- function (x) { # w <- attr(x, "number") tmp <- attributes(x) labels <- attr(x, "labels") x <- SHORTwise(x, length(labels)) drop <- duplicated(x) if (any(drop)) { W <- ifelse (is.null(tmp$weights), FALSE, TRUE) CONF <- ifelse (is.null(tmp$confidences), FALSE, TRUE) if(W) w <- tmp$weights if (CONF) conf <- tmp$confidences class(x) <- NULL attributes(x) <- NULL y <- x[drop] ind1 <- match(y, x) ind2 <- which(drop) for (i in seq_along(ind2)) { if(W) w[ind1[i]] <- w[ind1[i]] + w[ind2[i]] if(CONF) conf[ind1[i]] <- conf[ind1[i]] + conf[ind2[i]] } x <- x[!drop] w <- w[!drop] if(CONF) conf <- conf[!drop] attr(x, "weights") <- w if(CONF) attr(x, "confidences") <- conf attr(x, "labels") <- labels class(x) <- c("splits", "prop.part") } x } #' @rdname as.splits #' @method as.bitsplits splits #' @export as.bitsplits.splits <- function(x) { foo <- function(vect, RAWVECT) { res <- RAWVECT for (y in vect) { i <- ceiling(y / 8) res[i] <- res[i] | as.raw(2^(8 - ((y - 1) %% 8) - 1)) } res } N <- length(x) n <- length(attr(x, "labels")) nr <- ceiling(n / 8) mat <- raw(N * nr) dim(mat) <- c(nr, N) RAWVECT <- raw(nr) for (i in 1:N) mat[, i] <- foo(x[[i]], RAWVECT) freq <- attr(x, "weights") if (is.null(freq)) freq <- rep(1, N) structure(list(matsplit = mat, labels = attr(x, "labels"), freq = freq), class = "bitsplits") } #' @rdname as.splits #' @method as.splits bitsplits #' @export as.splits.bitsplits <- function(x, ...){ as.splits(as.prop.part(x)) } # computes compatible splits #' @rdname as.splits #' @export compatible <- function(obj) { labels <- attr(obj, "labels") if (!inherits(obj, "splits")) stop("obj needs to be of class splits") l <- length(labels) n <- length(obj) bp <- matrix(0L, n, l) for (i in 1:n) bp[i, obj[[i]]] <- 1L bp[bp[, 1] == 0L, ] <- 1L - bp[bp[, 1] == 0L, ] k <- 1 res <- matrix(0L, n, n) tmp1 <- tcrossprod(bp) # sum(bp[i,]* bp[j,]) tmp2 <- tcrossprod(1L - bp) # sum((1L - bp[i,])*(1L - bp[j,])) tmp3 <- tcrossprod(bp, 1L - bp) # sum(bp[i,]*(1L - bp[j,])) tmp4 <- tcrossprod(1L - bp, bp) # sum((1L - bp[i,])*bp[j,]) res[(tmp1 * tmp2 * tmp3 * tmp4) > 0] <- 1L k <- k + 1 res <- res[lower.tri(res)] attr(res, "Size") <- n attr(res, "Diag") <- FALSE attr(res, "Upper") <- FALSE class(res) <- "dist" return(res) } # replace compatible ?? compatible2 <- function(obj1, obj2 = NULL) { if (!inherits(obj1, "splits")) stop("obj needs to be of class splits") labels <- attr(obj1, "labels") l <- length(labels) n <- length(obj1) bp1 <- as.matrix(obj1) bp1[bp1[, 1] == 0L, ] <- 1L - bp1[bp1[, 1] == 0L, ] if (!is.null(obj2)) { m <- length(obj2) bp2 <- as.matrix(obj2) labels2 <- attr(obj2, "labels") bp2 <- bp2[, match(labels2, labels), drop = FALSE] bp2[bp2[, 1] == 0L, ] <- 1L - bp2[bp2[, 1] == 0L, ] } else bp2 <- bp1 if (is.null(obj2)) res <- matrix(0L, n, n) else res <- matrix(0L, n, m) tmp1 <- tcrossprod(bp1, bp2) tmp2 <- tcrossprod(1L - bp1, 1L - bp2) tmp3 <- tcrossprod(bp1, 1L - bp2) tmp4 <- tcrossprod(1L - bp1, bp2) res[(tmp1 * tmp2 * tmp3 * tmp4) > 0] <- 1L if (is.null(obj2)) { res <- res[lower.tri(res)] attr(res, "Size") <- n attr(res, "Diag") <- FALSE attr(res, "Upper") <- FALSE class(res) <- "dist" } return(res) } compatible3 <- function(x, y = NULL) { if (!inherits(x, "splits")) stop("x needs to be of class splits") if (is.null(y)) y <- x if (!inherits(y, "splits")) stop("y needs to be of class splits") xlabels <- attr(x, "labels") ylabels <- attr(y, "labels") if (identical(xlabels, ylabels)) labels <- xlabels else labels <- intersect(xlabels, ylabels) nx <- length(x) ny <- length(y) bp1 <- as.matrix(x)[, labels, drop = FALSE] bp2 <- as.matrix(y)[, labels, drop = FALSE] rs1 <- rowSums(bp1) rs2 <- rowSums(bp2) res <- matrix(0L, nx, ny) tmp1 <- tcrossprod(bp1, bp2) res <- matrix(0L, nx, ny) for (i in 1:nx) { for (j in 1:ny) { if (tmp1[i, j] == rs1[i]) res[i, j] <- 1 if (tmp1[i, j] == rs2[j]) res[i, j] <- 2 if (tmp1[i, j] == rs1[i] & tmp1[i, j] == rs2[j]) res[i, j] <- 3 } } if (is.null(y)) { res <- res[lower.tri(res)] attr(res, "Size") <- length(x) attr(res, "Diag") <- FALSE attr(res, "Upper") <- FALSE class(res) <- "dist" } return(res) } compatible_2 <- function(obj1, obj2) { ntaxa <- length(obj1$labels) msk <- !as.raw(2^(8 - (ntaxa %% 8)) - 1) r0 <- as.raw(0) arecompatible2 <- function(x, y, msk, r0) { foo <- function(v) { lv <- length(v) v[lv] <- v[lv] & msk as.integer(all(v == r0)) } nE <- foo(x & y) + foo(x & !y) + foo(!x & y) + foo(!x & !y) if (nE > 0) TRUE else FALSE } m1 <- obj1$matsplit m2 <- obj2$matsplit n1 <- ncol(m1) n2 <- ncol(m2) res <- rep(TRUE, n1) for (i in 1:n1) { j <- 1 while (j <= n2) { if (!arecompatible2(m1[, i], m2[, j], msk, r0)) { res[i] <- FALSE break() } j <- j + 1L } } res } phangorn/R/phylo.R0000644000176200001440000032544713501031557013564 0ustar liggesusers# allow transition probs of zero (added o) optimQ <- function(tree, data, Q = rep(1, 6), subs = rep(1, length(Q)), trace = 0, ...) { m <- length(Q) n <- max(subs) o <- min(subs) ab <- numeric(n) # ab = log(Q[match(1:n, subs)]) for (i in 1:n) ab[i] <- log(Q[which(subs == i)[1]]) fn <- function(ab, tree, data, m, n, o, subs, ...) { Q <- numeric(m) for (i in 1:n) Q[subs == i] <- ab[i] if (o < 0) Q[subs < 0] <- -Inf pml.fit(tree, data, Q = exp(Q), ...) # Q^2, ...) } res <- optim(par = ab, fn = fn, gr = NULL, method = "L-BFGS-B", lower = -Inf, upper = 10, control = list(fnscale = -1, maxit = 25, trace = trace), tree = tree, data = data, m = m, n = n, o = o, subs = subs, ...) Q <- rep(1, m) for (i in 1:n) Q[subs == i] <- exp(res[[1]][i]) if (o < 0) Q[subs < 0] <- 0 res[[1]] <- Q res } CodonQ <- function(subs = .sub, syn = .syn, tstv = 1, dnds = 1) { Q <- numeric(1830) Q[subs == 1] <- 1 # transversion Q[subs == 2] <- tstv # transition Q[syn == 1] <- Q[syn == 1] * dnds Q[syn < 0] <- 0 Q } # needs no Q optimCodon <- function(tree, data, Q = rep(1, 1830), subs = rep(1, length(Q)), syn = rep(0, length(Q)), trace = 0L, ab = c(0, 0), optK = TRUE, optW = TRUE, ...) { m <- length(Q) n <- 1L fn <- function(ab, tree, data, m, n, subs, syn, optK, optW, ...) { Q <- numeric(m) Q[subs == 1] <- 0 # transversion if (optK) Q[subs == 2] <- ab[1] # transition else Q[subs == 2] <- 0 if (optW) Q[syn == 1] <- Q[syn == 1] + ab[2] # ab[n+1] dnds Q[syn < 0] <- -Inf pml.fit(tree, data, Q = exp(Q), ...) # Q^2, ...) } res <- optim(par = ab, fn = fn, gr = NULL, method = "L-BFGS-B", lower = -Inf, upper = Inf, control = list(fnscale = -1, maxit = 25, trace = trace), tree = tree, data = data, m = m, n = n, subs = subs, syn = syn, optK = optK, optW = optW, ...) ab <- exp(res[[1]]) Q[subs == 1] <- 1 # transversion if (optK) Q[subs == 2] <- ab[1] # transition else { Q[subs == 2] <- 1 ab[1] <- 1 } if (optW) Q[syn == 1] <- Q[syn == 1] * ab[2] # dnds else ab[2] <- 1 Q[syn < 0] <- 0 res[[5]] <- ab res[[1]] <- Q res } subsChoice <- function(type = c("JC", "F81", "K80", "HKY", "TrNe", "TrN", "TPM1", "K81", "TPM1u", "TPM2", "TPM2u", "TPM3", "TPM3u", "TIM1e", "TIM1", "TIM2e", "TIM2", "TIM3e", "TIM3", "TVMe", "TVM", "SYM", "GTR")) { type <- match.arg(type) switch(type, JC = list(optQ = FALSE, optBf = FALSE, subs = c(0, 0, 0, 0, 0, 0)), F81 = list(optQ = FALSE, optBf = TRUE, subs = c(0, 0, 0, 0, 0, 0)), K80 = list(optQ = TRUE, optBf = FALSE, subs = c(0, 1, 0, 0, 1, 0)), HKY = list(optQ = TRUE, optBf = TRUE, subs = c(0, 1, 0, 0, 1, 0)), TrNe = list(optQ = TRUE, optBf = FALSE, subs = c(0, 1, 0, 0, 2, 0)), TrN = list(optQ = TRUE, optBf = TRUE, subs = c(0, 1, 0, 0, 2, 0)), TPM1 = list(optQ = TRUE, optBf = FALSE, subs = c(0, 1, 2, 2, 1, 0)), K81 = list(optQ = TRUE, optBf = FALSE, subs = c(0, 1, 2, 2, 1, 0)), TPM1u = list(optQ = TRUE, optBf = TRUE, subs = c(0, 1, 2, 2, 1, 0)), TPM2 = list(optQ = TRUE, optBf = FALSE, subs = c(1, 2, 1, 0, 2, 0)), TPM2u = list(optQ = TRUE, optBf = TRUE, subs = c(1, 2, 1, 0, 2, 0)), TPM3 = list(optQ = TRUE, optBf = FALSE, subs = c(1, 2, 0, 1, 2, 0)), TPM3u = list(optQ = TRUE, optBf = TRUE, subs = c(1, 2, 0, 1, 2, 0)), TIM1e = list(optQ = TRUE, optBf = FALSE, subs = c(0, 1, 2, 2, 3, 0)), TIM1 = list(optQ = TRUE, optBf = TRUE, subs = c(0, 1, 2, 2, 3, 0)), TIM2e = list(optQ = TRUE, optBf = FALSE, subs = c(1, 2, 1, 0, 3, 0)), TIM2 = list(optQ = TRUE, optBf = TRUE, subs = c(1, 2, 1, 0, 3, 0)), TIM3e = list(optQ = TRUE, optBf = FALSE, subs = c(1, 2, 0, 1, 3, 0)), TIM3 = list(optQ = TRUE, optBf = TRUE, subs = c(1, 2, 0, 1, 3, 0)), TVMe = list(optQ = TRUE, optBf = FALSE, subs = c(1, 2, 3, 4, 2, 0)), TVM = list(optQ = TRUE, optBf = TRUE, subs = c(1, 2, 3, 4, 2, 0)), SYM = list(optQ = TRUE, optBf = FALSE, subs = c(1, 2, 3, 4, 5, 0)), GTR = list(optQ = TRUE, optBf = TRUE, subs = c(1, 2, 3, 4, 5, 0)) ) } optimGamma <- function(tree, data, shape = 1, k = 4, ...) { fn <- function(shape, tree, data, k, ...) pml.fit(tree, data, shape = shape, k = k, ...) res <- optimize(f = fn, interval = c(0.1, 500), lower = 0.1, upper = 500, maximum = TRUE, tol = .01, tree = tree, data = data, k = k, ...) res } optimInv <- function(tree, data, inv = 0.01, INV = NULL, ll.0 = NULL, ...) { fn <- function(inv, tree, data, ...) pml.fit(tree, data, inv = inv, INV = INV, ll.0 = NULL, ...) res <- optimize(f = fn, interval = c(0, 1), lower = 0, upper = 1, maximum = TRUE, tol = .0001, tree = tree, data = data, ...) res } # changed to c(-10,10) from c(-5,5) optimRate <- function(tree, data, rate = 1, ...) { fn <- function(rate, tree, data, ...) pml.fit(tree, data, rate = exp(rate), ...) res <- optimize(f = fn, interval = c(-10, 10), tree = tree, data = data, ..., maximum = TRUE) res[[1]] <- exp(res[[1]]) res } optimBf <- function(tree, data, bf = c(.25, .25, .25, .25), trace = 0, ...) { l <- length(bf) nenner <- 1 / bf[l] lbf <- log(bf * nenner) lbf <- lbf[-l] fn <- function(lbf, tree, data, ...) { bf <- exp(c(lbf, 0)) bf <- bf / sum(bf) pml.fit(tree, data, bf = bf, ...) } res <- optim(par = lbf, fn = fn, gr = NULL, method = "Nelder-Mead", control = list(fnscale = -1, maxit = 500, trace = trace), tree = tree, data = data, ...) bf <- exp(c(res[[1]], 0)) bf <- bf / sum(bf) result <- list(bf = bf, loglik = res[[2]]) result } # MLF3x4 model optimF3x4 <- function(tree, data, bf_codon = matrix(.25, 4, 3), trace = 0, ...) { l <- nrow(bf_codon) nenner <- 1 / bf_codon[l, ] lbf <- log(bf_codon * rep(nenner, each = 4)) lbf <- lbf[-l, ] fn <- function(lbf, tree, data, ...) { dim(lbf) <- c(3, 3) bf_codon <- rbind(exp(lbf), c(1, 1, 1)) bf_codon <- bf_codon / rep(colSums(bf_codon), each = 4) bf <- F3x4_freq(bf_codon) pml.fit(tree, data, bf = bf, ...) } res <- optim(par = lbf, fn = fn, gr = NULL, method = "Nelder-Mead", control = list(fnscale = -1, maxit = 500, trace = trace), tree = tree, data = data, ...) bf_codon <- rbind(exp(res[[1]]), c(1, 1, 1)) bf_codon <- bf_codon / rep(colSums(bf_codon), each = 4) bf <- F3x4_freq(bf_codon) result <- list(bf = bf, loglik = res[[2]], bf_codon = bf_codon) result } optimW <- function(fit, ...) { w <- fit$w g <- fit$g siteLik <- fit$siteLik k <- length(w) l <- dim(siteLik[[1]])[1] x <- matrix(0, l, k) for (i in 1:k) x[, i] <- rowSums(siteLik[[i]]) weight <- fit$weight nenner <- 1 / w[k] eta <- log(w * nenner) eta <- eta[-k] fn <- function(eta, x, g, weight) { eta <- c(eta, 0) p <- exp(eta) / sum(exp(eta)) res <- x %*% p res <- sum(weight * log(res)) * (1 + abs(sum(p * g) - 1)) res } res <- optim(eta, fn = fn, method = "Nelder-Mead", control = list(fnscale = -1, reltol = 1e-12), gr = NULL, x = x, g = g, weight = weight) p <- exp(c(res$par, 0)) p <- p / sum(p) result <- list(par = p, value = res$value) result } # predict.pml <- function(object, newdata,...) sum(object$site * newdata) #' @export logLik.pml <- function(object, ...) { res <- object$logLik attr(res, "df") <- object$df class(res) <- "logLik" res } #' @export AICc <- function(object, ...) UseMethod("AICc") #' @export AICc.pml <- function(object, ...) { n <- sum(object$weight) k <- object$df if (k >= (n - 1)) return(NaN) res <- AIC(object) res + (2 * k * (k + 1)) / (n - k - 1) } #' @export BIC.pml <- function(object, ...) { res <- AIC(object, k = log(sum(object$weight))) res } #' @export anova.pml <- function(object, ...) { X <- c(list(object), list(...)) fun <- function(x) { tmp <- logLik(x) c(tmp[1], attr(tmp, "df")) } DF <- t(sapply(X, fun)) dev <- c(NA, 2 * diff(DF[, 1])) ddf <- c(NA, diff(DF[, 2])) table <- data.frame(DF, ddf, dev, pchisq(dev, ddf, lower.tail = FALSE)) dimnames(table) <- list(seq_along(X), c("Log lik.", "Df", "Df change", "Diff log lik.", "Pr(>|Chi|)")) structure(table, heading = "Likelihood Ratio Test Table", class = c("anova", "data.frame")) } # vcov.pml <- function(object, obs=FALSE,...){ # if(obs) FI = score4(object)[[2]] # else FI = score(object,FALSE)[[2]] # l = dim(FI)[1] # res = try(solve(FI)) # if(class(res) == "try-error"){ # cat("Covariance is ill-conditioned !! \n") # res = solve(FI + diag(l)* 1e-8) # } # res # } #' @export vcov.pml <- function(object, ...) { FI <- score(object, FALSE)[[2]] l <- dim(FI)[1] res <- try(solve(FI)) if (class(res) == "try-error") { cat("Covariance is ill-conditioned !! \n") res <- solve(FI + diag(l) * 1e-8) } res } getd2P <- function(el, eig = edQt(), g = 1.0) { n <- length(eig$values) res <- .Call("getd2PM", eig, as.integer(n), as.double(el), as.double(g)) attr(res, "dim") <- c(length(g), length(el)) res } getdP <- function(el, eig = edQt(), g = 1.0) { n <- length(eig$values) res <- .Call("getdPM", eig, as.integer(n), as.double(el), as.double(g)) attr(res, "dim") <- c(length(g), length(el)) res } # version without transformation (used for vcov) getdP2 <- function(el, eig = edQt(), g = 1.0) { n <- length(eig$values) res <- .Call("getdPM2", eig, as.integer(n), as.double(el), as.double(g)) attr(res, "dim") <- c(length(g), length(el)) res } # version without transformation getd2P2 <- function(el, eig = edQt(), g = 1.0) { n <- length(eig$values) res <- .Call("getd2PM2", eig, as.integer(n), as.double(el), as.double(g)) attr(res, "dim") <- c(length(g), length(el)) res } getP <- function(el, eig = edQt(), g = 1.0) { n <- length(eig$values) res <- .Call("getPM", eig, as.integer(n), as.double(el), as.double(g)) attr(res, "dim") <- c(length(g), length(el)) res } #' @rdname pml.fit #' @export lli <- function(data, tree = NULL, ...) { contrast <- attr(data, "contrast") nr <- attr(data, "nr") nc <- attr(data, "nc") nco <- as.integer(dim(contrast)[1]) if (!is.null(tree)) data <- subset(data, tree$tip.label) .Call("invSites", data, as.integer(nr), as.integer(nc), contrast, as.integer(nco)) } #' @rdname pml.fit #' @export edQt <- function(Q = c(1, 1, 1, 1, 1, 1), bf = c(0.25, 0.25, 0.25, 0.25)) { l <- length(bf) res <- matrix(0, l, l) res[lower.tri(res)] <- Q res <- res + t(res) res <- res * bf res2 <- res * rep(bf, each = l) diag(res) <- -colSums(res) res <- res / sum(res2) e <- eigen(res, FALSE) e$inv <- solve.default(e$vec) e } # some functions to get codon models to work getScaler <- function(Q = c(1, 1, 1, 1, 1, 1), bf = c(0.25, 0.25, 0.25, 0.25)) { l <- length(bf) res <- matrix(0, l, l) res[lower.tri(res)] <- Q res <- res + t(res) res <- res * bf res2 <- res * rep(bf, each = l) diag(res) <- -colSums(res) sum(res2) } # eigen value decomposition without scaling edQt2 <- function(Q = c(1, 1, 1, 1, 1, 1), bf = c(0.25, 0.25, 0.25, 0.25), scale = 1) { l <- length(bf) res <- matrix(0, l, l) res[lower.tri(res)] <- Q res <- res + t(res) res <- res * bf res2 <- res * rep(bf, each = l) diag(res) <- -colSums(res) res <- res / scale e <- eigen(res, FALSE) e$inv <- solve.default(e$vec) e } df_freq_codon <- function(bf) { switch(bf, equal = 0, empirical = 60, F61 = 60, F3x4 = 9, F1x4 = 3) } #' @rdname pml.fit #' @export pml.free <- function() { .C("ll_free") # rm(.INV, .iind, envir = parent.frame()) } #' @rdname pml.fit #' @export pml.init <- function(data, k = 1L) { nTips <- length(data) nr <- attr(data, "nr") nc <- attr(data, "nc") .C("ll_init", as.integer(nr), as.integer(nTips), as.integer(nc), as.integer(k)) } fn.quartet <- function(old.el, eig, bf, dat, g = 1, w = 1, weight, ll.0) { l <- length(dat[, 1]) ll <- ll.0 res <- vector("list", 2 * l) tmp1 <- NULL tmp2 <- NULL attr(res, "dim") <- c(l, 2) for (j in 1:l) { P <- getP(old.el, eig, g[j]) tmp1 <- (dat[[j, 1]] %*% P[[1]]) * (dat[[j, 2]] %*% P[[2]]) tmp2 <- (dat[[j, 3]] %*% P[[3]]) * (dat[[j, 4]] %*% P[[4]]) res[[j, 1]] <- tmp1 * (tmp2 %*% P[[5]]) res[[j, 2]] <- tmp2 ll <- ll + res[[j, 1]] %*% (w[j] * bf) } l0 <- sum(weight * log(ll)) list(ll = l0, res = res) } fn.quartet2 <- function(old.el, eig, bf, dat1, dat2, dat3, dat4, g = 1, w = 1, weight, ll.0, contrast, ext) { l <- length(w) ll <- ll.0 res <- vector("list", 2 * l) tmp1 <- NULL tmp2 <- NULL attr(res, "dim") <- c(l, 2) for (j in 1:l) { P <- getP(old.el, eig, g[j]) if (ext[1] == FALSE && ext[2] == FALSE) tmp1 <- (dat1[[j]] %*% P[[1]]) * (dat2[[j]] %*% P[[2]]) if (ext[1] == FALSE && ext[2] == TRUE) tmp1 <- (dat1[[j]] %*% P[[1]]) * (contrast %*% P[[2]])[dat2, ] if (ext[1] == TRUE && ext[2] == FALSE) tmp1 <- (contrast %*% P[[1]])[dat1, ] * (dat2[[j]] %*% P[[2]]) if (ext[1] == TRUE && ext[2] == TRUE) tmp1 <- (contrast %*% P[[1]])[dat1, ] * (contrast %*% P[[2]])[dat2, ] if (ext[3] == FALSE && ext[4] == FALSE) tmp2 <- (dat3[[j]] %*% P[[3]]) * (dat4[[j]] %*% P[[4]]) if (ext[3] == FALSE && ext[4] == TRUE) tmp2 <- (dat3[[j]] %*% P[[3]]) * (contrast %*% P[[4]])[dat4, ] if (ext[3] == TRUE && ext[4] == FALSE) tmp2 <- (contrast %*% P[[3]])[dat3, ] * (dat4[[j]] %*% P[[4]]) if (ext[3] == TRUE && ext[4] == TRUE) tmp2 <- (contrast %*% P[[3]])[dat3, ] * (contrast %*% P[[4]])[dat4, ] res[[j, 1]] <- tmp1 * (tmp2 %*% P[[5]]) res[[j, 2]] <- tmp2 ll <- ll + res[[j, 1]] %*% (w[j] * bf) } l0 <- sum(weight * log(ll)) list(ll = l0, res = res) } optim.quartet2 <- function(old.el, eig, bf, dat1, dat2, dat3, dat4, g = 1, w = 1, weight, ll.0 = weight * 0, control = list(eps = 1e-08, maxit = 5, trace = 0), llcomp = -Inf, evi, contrast, contrast2, ext = c(FALSE, FALSE, FALSE, FALSE)) { eps <- 1 iter <- 0 while (eps > control$eps && iter < control$maxit) { tmp <- fn.quartet2(old.el = old.el, eig = eig, bf = bf, dat1 = dat1, dat2 = dat2, dat3 = dat3, dat4 = dat4, g = g, w = w, weight = weight, ll.0 = ll.0, contrast = contrast, ext = ext) old.ll <- tmp$ll el1 <- fs3(old.el[1], eig, tmp$res[, 1], dat1, weight, g = g, w = w, bf = bf, ll.0 = ll.0, contrast = contrast, contrast2 = contrast2, evi = evi, ext = ext[1], getA = TRUE, getB = FALSE) el2 <- fs3(old.el[2], eig, el1[[2]], dat2, weight, g = g, w = w, bf = bf, ll.0 = ll.0, contrast = contrast, contrast2 = contrast2, evi = evi, ext = ext[2], getA = TRUE, getB = FALSE) el5 <- fs3(old.el[5], eig, el2[[2]], tmp$res[, 2], weight, g = g, w = w, bf = bf, ll.0 = ll.0, contrast = contrast, contrast2 = contrast2, evi = evi, ext = 0L, getA = FALSE, getB = TRUE) el3 <- fs3(old.el[3], eig, el5[[3]], dat3, weight, g = g, w = w, bf = bf, ll.0 = ll.0, contrast = contrast, contrast2 = contrast2, evi = evi, ext = ext[3], getA = TRUE, getB = FALSE) el4 <- fs3(old.el[4], eig, el3[[2]], dat4, weight, g = g, w = w, bf = bf, ll.0 = ll.0, contrast = contrast, contrast2 = contrast2, evi = evi, ext = ext[4], getA = FALSE, getB = FALSE) old.el[1] <- el1[[1]] old.el[2] <- el2[[1]] old.el[3] <- el3[[1]] old.el[4] <- el4[[1]] old.el[5] <- el5[[1]] iter <- iter + 1 ll <- el4[[4]] eps <- (old.ll - ll) / ll if (ll < llcomp) return(list(old.el, ll)) old.ll <- ll } list(old.el, ll) } pml.nni.old <- function(tree, data, w, g, eig, bf, ll.0, ll, ...) { k <- length(w) INDEX <- indexNNI(tree) rootEdges <- attr(INDEX, "root") .dat <- NULL data <- getCols(data, tree$tip.label) parent <- tree$edge[, 1] child <- tree$edge[, 2] weight <- attr(data, "weight") datp <- rnodes(tree, data, w, g, eig, bf) contrast <- attr(data, "contrast") contrast2 <- contrast %*% eig[[2]] evi <- (t(eig[[3]]) * bf) nTips <- length(tree$tip.label) evector <- numeric(max(parent)) evector[child] <- tree$edge.length m <- dim(INDEX)[1] loglik <- numeric(2 * m) edgeMatrix <- matrix(0, 2 * m, 5) l <- length(datp[, 1]) for (i in 1:m) { ei <- INDEX[i, ] el0 <- evector[INDEX[i, ]] ext <- ei[1:4] < nTips + 1L if (!(ei[5] %in% rootEdges)) dat1 <- datp[, ei[1], drop = FALSE] else { if (ext[1]) dat1 <- data[[ ei[1] ]] else dat1 <- .dat[, ei[1], drop = FALSE] } if (ext[2]) dat2 <- data[[ ei[2] ]] else dat2 <- .dat[, ei[2], drop = FALSE] if (ext[3]) dat3 <- data[[ ei[3] ]] else dat3 <- .dat[, ei[3], drop = FALSE] if (ext[4]) dat4 <- data[[ ei[4] ]] else dat4 <- .dat[, ei[4], drop = FALSE] new1 <- optim.quartet2(el0[c(1, 3, 2, 4, 5)], eig, bf, dat1, dat3, dat2, dat4, g, w, weight, ll.0, llcomp = ll, evi = evi, contrast = contrast, contrast2 = contrast2, ext = ext[c(1, 3, 2, 4)]) new2 <- optim.quartet2(el0[c(1, 4, 3, 2, 5)], eig, bf, dat1, dat4, dat3, dat2, g, w, weight, ll.0, llcomp = ll, evi = evi, contrast = contrast, contrast2 = contrast2, ext = ext[c(1, 4, 3, 2)]) loglik[(2 * i) - 1] <- new1[[2]] loglik[(2 * i)] <- new2[[2]] edgeMatrix[(2 * i) - 1, ] <- new1[[1]] edgeMatrix[(2 * i), ] <- new2[[1]] } swap <- 0 eps0 <- 1e-6 candidates <- loglik > ll + eps0 nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) nTips <- as.integer(length(tree$tip.label)) # on.exit(.C("ll_free")) # .C("ll_init", nr, nTips, nc, as.integer(k)) # cat("candidates", sum(candidates), "\n") while (any(candidates)) { ind <- which.max(loglik) loglik[ind] <- -Inf if (ind %% 2) swap.edge <- c(2, 3) else swap.edge <- c(2, 4) tree2 <- changeEdge(tree, INDEX[(ind + 1) %/% 2, swap.edge], INDEX[(ind + 1) %/% 2, ], edgeMatrix[ind, ]) test <- pml.fit(tree2, data, bf = bf, k = k, g = g, w = w, eig = eig, ll.0 = ll.0, ...) if (test <= ll + eps0) candidates[ind] <- FALSE if (test > ll + eps0) { ll <- test swap <- swap + 1 tree <- tree2 indi <- which(rep(colSums(apply(INDEX, 1, match, INDEX[(ind + 1) %/% 2, ], nomatch = 0)) > 0, each = 2)) candidates[indi] <- FALSE loglik[indi] <- -Inf } } list(tree = tree, ll = ll, swap = swap) } rnodes <- function(tree, data, w, g, eig, bf) { if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") data <- getCols(data, tree$tip.label) q <- length(tree$tip.label) node <- tree$edge[, 1] edge <- tree$edge[, 2] m <- length(edge) + 1 # max(edge) l <- length(w) dat <- vector(mode = "list", length = m * l) dim(dat) <- c(l, m) tmp <- length(data) # for(i in seq_along(w))dat[i,1:tmp]=new2old.phyDat(data) # # dat[1,1:tmp] <- data vielleicht gebraucht el <- tree$edge.length P <- getP(el, eig, g) nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) node <- as.integer(node - min(node)) edge <- as.integer(edge - 1) nTips <- as.integer(length(tree$tip.label)) mNodes <- as.integer(max(node) + 1) contrast <- attr(data, "contrast") nco <- as.integer(dim(contrast)[1]) for (i in 1:l) dat[i, (q + 1):m] <- .Call("LogLik2", data, P[i, ], nr, nc, node, edge, nTips, mNodes, contrast, nco) parent <- tree$edge[, 1] child <- tree$edge[, 2] nTips <- min(parent) - 1 datp <- vector("list", m) dat2 <- vector("list", m * l) dim(dat2) <- c(l, m) for (i in 1:l) { datp[(nTips + 1)] <- dat[i, (nTips + 1)] for (j in (m - 1):1) { if (child[j] > nTips) { tmp2 <- (datp[[parent[j]]] / (dat[[i, child[j]]] %*% P[[i, j]])) datp[[child[j]]] <- (tmp2 %*% P[[i, j]]) * dat[[i, child[j]]] dat2[[i, child[j]]] <- tmp2 } } } assign(".dat", dat, envir = parent.frame(n = 1)) dat2 } score <- function(fit, transform = TRUE) { tree <- fit$tree child <- tree$edge[, 2] l <- length(child) sc <- numeric(l) weight <- as.numeric(fit$weight) f <- drop(exp(fit$site)) dl <- dl(fit, transform) dl <- dl / f sc <- colSums(weight * dl) F <- crossprod(dl * weight, dl) names(sc) <- child dimnames(F) <- list(child, child) result <- list(sc = sc, F = F) result } # wird noch in partition models verwendet optim.quartet <- function(old.el, eig, bf, dat, g = 1, w = 1, weight, ll.0 = weight * 0, control = list(eps = 1e-08, maxit = 5, trace = 0), llcomp = -Inf) { eps <- 1 iter <- 0 evi <- (t(eig[[3]]) * bf) while (eps > control$eps && iter < control$maxit) { tmp <- fn.quartet(old.el = old.el, eig = eig, bf = bf, dat = dat, g = g, w = w, weight = weight, ll.0 = ll.0) old.ll <- tmp$ll el1 <- fs(old.el[1], eig, tmp$res[, 1], dat[, 1], weight, g = g, w = w, bf = bf, ll.0 = ll.0, evi, getA = TRUE, getB = FALSE) el2 <- fs(old.el[2], eig, el1[[2]], dat[, 2], weight, g = g, w = w, bf = bf, ll.0 = ll.0, evi, getA = TRUE, getB = FALSE) el5 <- fs(old.el[5], eig, el2[[2]], tmp$res[, 2], weight, g = g, w = w, bf = bf, ll.0 = ll.0, evi, getA = FALSE, getB = TRUE) el3 <- fs(old.el[3], eig, el5[[3]], dat[, 3], weight, g = g, w = w, bf = bf, ll.0 = ll.0, evi, getA = TRUE, getB = FALSE) el4 <- fs(old.el[4], eig, el3[[2]], dat[, 4], weight, g = g, w = w, bf = bf, ll.0 = ll.0, evi, getA = FALSE, getB = FALSE) old.el[1] <- el1[[1]] old.el[2] <- el2[[1]] old.el[3] <- el3[[1]] old.el[4] <- el4[[1]] old.el[5] <- el5[[1]] iter <- iter + 1 ll <- el4[[4]] eps <- (old.ll - ll) / ll if (ll < llcomp) return(list(old.el, ll)) old.ll <- ll } list(old.el, ll) } #' @export plot.pml <- function(x, ...) plot.phylo(x$tree, ...) phangornParseFormula <- function(model) { parseSide <- function(model) { model.vars <- list() while (length(model) == 3 && model[[1]] == as.name("+")) { model.vars <- c(model.vars, model[[3]]) model <- model[[2]] } unlist(rev(c(model.vars, model))) } if (!inherits(model, "formula")) stop("model must be a formula object") l <- length(model) varsLHS <- NULL if (l == 3) { modelLHS <- model[[2]] modelRHS <- model[[3]] varsRHS <- parseSide(modelRHS) varsRHS <- unlist(lapply(varsRHS, as.character)) varsLHS <- parseSide(modelLHS) varsLHS <- unlist(lapply(varsLHS, as.character)) } if (l == 2) { modelRHS <- model[[2]] varsRHS <- parseSide(modelRHS) varsRHS <- unlist(lapply(varsRHS, as.character)) } list(left = varsLHS, right = varsRHS) } #' @rdname pml #' @export pml.control <- function(epsilon = 1e-08, maxit = 10, trace = 1) { if (!is.numeric(epsilon) || epsilon <= 0) stop("value of 'epsilon' must be > 0") if (!is.numeric(maxit) || maxit <= 0) stop("maximum number of iterations must be > 0") list(epsilon = epsilon, maxit = maxit, trace = trace) } # improves trees similar to likelihoodRatchet <- function(obj, maxit = 100, k = 10, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1L)) { tree <- obj$tree nTips <- length(tree$tip.label) trace <- control$trace control$trace <- trace - 1L kmax <- 1 for (i in 1:maxit) { tree <- rNNI(obj$tree, moves = nTips / 3, n = 1) # tree <- rSPR(tree, moves=10, k=3, n=1) obj2 <- update(obj, tree = tree) obj2 <- optim.pml(obj2, TRUE, control = control) if (logLik(obj2) > logLik(obj)) { obj <- obj2 kmax <- 1 } else kmax <- kmax + 1 if (trace > 0) print(paste("Iteration ", i, ", best pscore so far:", logLik(obj))) if (kmax == k) break() } obj } fs <- function(old.el, eig, parent.dat, child.dat, weight, g = g, w = w, bf = bf, ll.0 = ll.0, evi, getA = TRUE, getB = TRUE) { if (old.el < 1e-8) old.el <- 1e-8 lg <- length(parent.dat) P <- getP(old.el, eig, g) nr <- as.integer(length(weight)) nc <- as.integer(length(bf)) eve <- eig[[2]] dad <- .Call("getDAD", parent.dat, child.dat, P, nr, nc) X <- .Call("getPrep", dad, child.dat, eig[[2]], evi, nr, nc) .Call("FS4", eig, as.integer(length(bf)), as.double(old.el), as.double(w), as.double(g), X, child.dat, dad, as.integer(length(w)), as.integer(length(weight)), as.double(weight), as.double(ll.0), as.integer(getA), as.integer(getB)) } fs3 <- function(old.el, eig, parent.dat, child, weight, g = g, w = w, bf = bf, ll.0 = ll.0, contrast, contrast2, evi, ext = TRUE, getA = TRUE, getB = TRUE) { if (old.el < 1e-8) old.el <- 1e-8 lg <- length(parent.dat) P <- getP(old.el, eig, g) nr <- as.integer(length(weight)) nc <- as.integer(length(bf)) if (ext == FALSE) { child.dat <- child eve <- eig[[2]] dad <- .Call("getDAD", parent.dat, child.dat, P, nr, nc) X <- .Call("getPrep", dad, child.dat, eig[[2]], evi, nr, nc) } else { nco <- as.integer(nrow(contrast)) dad <- .Call("getDAD2", parent.dat, child, contrast, P, nr, nc, nco) child.dat <- vector("list", lg) for (i in 1:lg) child.dat[[i]] <- contrast[child, , drop = FALSE] X <- .Call("getPrep2", dad, child, contrast2, evi, nr, nc, nco) } .Call("FS4", eig, as.integer(length(bf)), as.double(old.el), as.double(w), as.double(g), X, child.dat, dad, as.integer(length(w)), as.integer(length(weight)), as.double(weight), as.double(ll.0), as.integer(getA), as.integer(getB)) # as.double(bf), } # rate not used internally optimEdge <- function(tree, data, eig = eig, w = w, g = g, bf = bf, rate = rate, ll.0 = ll.0, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 0), ...) { if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") nTips <- length(tree$tip.label) el <- tree$edge.length tree$edge.length[el < 1e-08] <- 1e-08 oldtree <- tree k <- length(w) data <- subset(data, tree$tip.label) loglik <- pml.fit4(tree, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k) start.ll <- old.ll <- loglik contrast <- attr(data, "contrast") contrast2 <- contrast %*% eig[[2]] evi <- (t(eig[[3]]) * bf) weight <- attr(data, "weight") eps <- 1 iter <- 0 treeP <- tree tree <- reorder(tree) child <- tree$edge[, 2] parent <- tree$edge[, 1] m <- max(tree$edge) pvec <- integer(m) pvec[child] <- parent EL <- numeric(m) EL[child] <- tree$edge.length n <- length(tree$edge.length) nr <- as.integer(length(weight)) nc <- as.integer(length(bf)) nco <- as.integer(nrow(contrast)) eve <- eig[[2]] lg <- k ScaleEPS <- 1.0 / 4294967296.0 anc <- Ancestors(tree, 1:m, "parent") anc0 <- as.integer(c(0L, anc)) while (eps > control$eps && iter < control$maxit) { EL <- .Call("optE", as.integer(parent), as.integer(child), as.integer(anc0), eig, evi, EL, w, g, as.integer(nr), as.integer(nc), as.integer(nTips), as.double(contrast), as.double(contrast2), nco, data, as.double(weight), as.double(ll.0)) iter <- iter + 1 treeP$edge.length <- EL[treeP$edge[, 2]] newll <- pml.fit4(treeP, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k) eps <- (old.ll - newll) / newll if (eps < 0) return(list(oldtree, old.ll)) oldtree <- treeP if (control$trace > 1) cat(old.ll, " -> ", newll, "\n") old.ll <- newll } if (control$trace > 0) cat(start.ll, " -> ", newll, "\n") list(tree = treeP, logLik = newll, c(eps, iter)) } pml.move <- function(EDGE, el, data, g, w, eig, k, nTips, bf) { node <- EDGE[, 1] edge <- EDGE[, 2] nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) node <- as.integer(node - nTips - 1L) edge <- as.integer(edge - 1L) contrast <- attr(data, "contrast") nco <- as.integer(dim(contrast)[1]) tmp <- .Call("PML3", dlist = data, as.double(el), as.double(g), nr, nc, k, eig, as.double(bf), node, edge, nTips, nco, contrast, N = as.integer(length(edge))) # as.double(w), return(NULL) } bip <- function(x) { x <- reorder(x, "postorder") nTips <- as.integer(length(x$tip.label)) .Call("_phangorn_bipCPP", PACKAGE = "phangorn", x$edge, nTips) } bipart <- function(x) { x <- reorder(x, "postorder") nTips <- as.integer(length(x$tip.label)) .Call("_phangorn_bipartCPP", PACKAGE = "phangorn", x$edge, nTips) } bipartition <- function(tree) { if (is.rooted(tree)) tree <- unroot(tree) if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") bp <- bip(tree) nTips <- length(tree$tip.label) l <- length(bp) res <- matrix(0L, l, nTips) for (i in 1:l) res[i, bp[[i]]] <- 1L res <- res[tree$edge[, 2], , drop = FALSE] colnames(res) <- tree$tip.label rownames(res) <- tree$edge[, 2] res[res[, 1] == 1, ] <- 1L - res[res[, 1] == 1, ] res } readAArate <- function(file) { tmp <- read.table(system.file(file.path("extdata", file)), col.names = 1:20, fill = TRUE) Q <- tmp[1:19, 1:19] names <- c("a", "r", "n", "d", "c", "q", "e", "g", "h", "i", "l", "k", "m", "f", "p", "s", "t", "w", "y", "v") Q <- as.numeric(Q[lower.tri(Q, TRUE)]) bf <- as.numeric(as.character(unlist(tmp[20, ]))) names(bf) <- names list(Q = Q, bf = bf) } # .LG <- readAArate("lg.dat") # .WAG <- readAArate("wag.dat") # .Dayhoff <- readAArate("dayhoff-dcmut.dat") # .JTT <- readAArate("jtt-dcmut.dat") # .cpREV <- readAArate("cpREV.dat") # .mtmam <- readAArate("mtmam.dat") # .mtArt <- readAArate("mtArt.dat") # save(.LG,.WAG,.Dayhoff,.JTT,.cpREV,.mtmam,.mtArt, file = "sysdata2.rda") getModelAA <- function(model, bf = TRUE, Q = TRUE) { model <- match.arg(eval(model), .aamodels) tmp <- get(paste(".", model, sep = ""), environment(pml)) if (Q) assign("Q", tmp$Q, envir = parent.frame()) if (bf) assign("bf", tmp$bf, envir = parent.frame()) } #' @export print.pml <- function(x, ...) { cat("\n loglikelihood:", x$logLik, "\n") w <- x$weight w <- w[w > 0] type <- attr(x$data, "type") levels <- attr(x$data, "levels") nc <- attr(x$data, "nc") ll0 <- sum(w * log(w / sum(w))) cat("\nunconstrained loglikelihood:", ll0, "\n") if (x$inv > 0) cat("Proportion of invariant sites:", x$inv, "\n") if (x$k > 1) { cat("Discrete gamma model\n") cat("Number of rate categories:", x$k, "\n") cat("Shape parameter:", x$shape, "\n") } if (type == "AA") cat("Rate matrix:", x$model, "\n") if (type == "DNA") { cat("\nRate matrix:\n") QM <- matrix(0, nc, nc, dimnames = list(levels, levels)) QM[lower.tri(QM)] <- x$Q QM <- QM + t(QM) print(QM) cat("\nBase frequencies: \n") bf <- x$bf names(bf) <- levels cat(bf, "\n") } if (type == "CODON") { cat("dn/ds:", x$dnds, "\n") cat("ts/tv:", x$tstv, "\n") cat("Freq:", x$frequencies, "\n") } if (type == "USER" & length(x$bf) < 11) { cat("\nRate matrix:\n") QM <- matrix(0, nc, nc, dimnames = list(levels, levels)) QM[lower.tri(QM)] <- x$Q QM <- QM + t(QM) print(QM) cat("\nBase frequencies: \n") bf <- x$bf names(bf) <- levels cat(bf, "\n") } } optEdgeMulti <- function(object, control = pml.control(epsilon = 1e-8, maxit = 10, trace = 1), ...) { tree <- object$tree theta <- object$tree$edge.length weight <- attr(object$data, "weight") ll0 <- object$logLik eps <- 1 iter <- 0 iter2 <- 0 scale <- 1 # l <- length(theta) while (abs(eps) > control$eps && iter < control$maxit) { dl <- score(object) thetaNew <- log(theta) + scale * solve(dl[[2]], dl[[1]]) # + diag(l) * 1e-10 newtheta <- exp(thetaNew) tree$edge.length <- as.numeric(newtheta) object <- update(object, tree = tree) ll1 <- object$logLik eps <- (ll0 - ll1) / ll1 if (eps < 0) { newtheta <- theta scale <- scale / 2 tree$edge.length <- as.numeric(theta) ll1 <- ll0 iter2 <- iter2 + 1 } else { scale <- 1 iter2 <- 0 } theta <- newtheta if (iter2 == 0 && control$trace > 0) cat("loglik: ", ll1, "\n") ll0 <- ll1 if (iter2 == 10) iter2 <- 0 if (iter2 == 0) iter <- iter + 1 } object <- update(object, tree = tree) object } # add data for internal use parent.frame(n) for higher nestings update.pmlNew <- function(object, ..., evaluate = TRUE) { call <- object$call if (is.null(call)) stop("need an object with call component") extras <- match.call(expand.dots = FALSE)$... if (length(extras)) { existing <- !is.na(match(names(extras), names(call))) for (a in names(extras)[existing]) call[[a]] <- extras[[a]] if (any(!existing)) { call <- c(as.list(call), extras[!existing]) call <- as.call(call) } } if (evaluate) eval(call, object, parent.frame()) else call } #' @export update.pml <- function(object, ...) { extras <- match.call(expand.dots = FALSE)$... pmla <- c("tree", "data", "bf", "Q", "inv", "k", "shape", "rate", "model", "wMix", "llMix", "dnds", "tstv", "scaleQ","...") names(extras) <- pmla[pmatch(names(extras), pmla[-length(pmla)])] call <- object$call if (length(extras)) { existing <- !is.na(match(names(extras), names(call))) for (a in names(extras)[existing]) call[[a]] <- extras[[a]] if (any(!existing)) { call <- c(as.list(call), extras[!existing]) call <- as.call(call) } } existing <- match(pmla, names(extras)) updateEig <- FALSE updateRates <- FALSE type <- attr(object$data, "type") if(type=="CODON"){ bf_choice <- object$frequencies } if (is.na(existing[1])) tree <- object$tree else tree <- eval(extras[[existing[1]]], parent.frame()) if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") if (is.na(existing[2])) { data <- object$data INV <- object$INV } else { data <- eval(extras[[existing[2]]], parent.frame()) ll.0 <- numeric(attr(data, "nr")) INV <- Matrix(lli(data, tree), sparse = TRUE) } nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) if (is.na(existing[3])) bf <- object$bf else { bf <- eval(extras[[existing[3]]], parent.frame()) # check for "character" if (is.character(bf)) { bf_choice <- match.arg(bf, c("equal", "empirical", "F1x4", "F3x4", "F61")) # if(bf_choice %in% c("F1x4", "F3x4", "F61") & type != "CODON") if (bf_choice == "F3x4" & type != "CODON") stop("F3x4 not available for this data type") if (bf_choice == "F1x4" & type != "CODON") stop("F1x4 not available for this data type") if (bf_choice == "F61" & type != "CODON") stop("F61 not available for this data type") bf <- switch(bf_choice, equal = rep(1 / nc, nc), empirical = baseFreq(data), F61 = baseFreq(data), F3x4 = F3x4(data), F1x4 = F1x4(data)) freq_df <- df_freq_codon(bf_choice) names(bf) <- NULL } updateEig <- TRUE } if (is.na(existing[4])) Q <- object$Q else { Q <- eval(extras[[existing[4]]], parent.frame()) updateEig <- TRUE } type <- attr(object$data, "type") model <- NULL if (type == "AA") { if (!is.na(existing[9])) { model <- match.arg(eval(extras[[existing[9]]], parent.frame()), .aamodels) getModelAA(model, bf = is.na(existing[3]), Q = is.na(existing[4])) updateEig <- TRUE } # else model <- object$model } scaleQ <- FALSE if (type == "CODON") { if (is.na(existing[12])) dnds <- object$dnds else { dnds <- eval(extras[[existing[12]]], parent.frame()) updateEig <- TRUE } if (is.na(existing[13])) tstv <- object$tstv else { tstv <- eval(extras[[existing[13]]], parent.frame()) updateEig <- TRUE } if (!is.na(existing[14])) { scaleQ <- eval(extras[[existing[14]]], parent.frame()) updateEig <- TRUE } if (updateEig) Q <- CodonQ(subs = .sub, syn = .syn, tstv = tstv, dnds = dnds) } if (is.na(existing[5])) inv <- object$inv else { inv <- eval(extras[[existing[5]]], parent.frame()) updateRates <- TRUE } if (is.na(existing[6])) k <- object$k else { k <- eval(extras[[existing[6]]], parent.frame()) updateRates <- TRUE } if (is.na(existing[7])) shape <- object$shape else { shape <- eval(extras[[existing[7]]], parent.frame()) updateRates <- TRUE } rate <- ifelse(is.na(existing[8]), object$rate, eval(extras[[existing[8]]], parent.frame())) wMix <- ifelse(is.na(existing[10]), object$wMix, eval(extras[[existing[10]]], parent.frame())) if (is.na(existing[11])) llMix <- object$llMix else llMix <- eval(extras[[existing[11]]], parent.frame()) levels <- attr(data, "levels") weight <- attr(data, "weight") if (updateEig){ if(scaleQ) eig <- edQt2(Q = Q, bf = bf, scale = scaleQ) else eig <- edQt(Q = Q, bf = bf) } else { eig <- object$eig model <- object$model } g <- discrete.gamma(shape, k) g <- rate * g if (inv > 0) g <- g / (1 - inv) ll.0 <- as.matrix(INV %*% (bf * inv)) if (wMix > 0) ll.0 <- ll.0 + llMix w <- rep(1 / k, k) if (inv > 0) w <- (1 - inv) * w if (wMix > 0) w <- wMix * w m <- 1 ### play save kmax <- k if (any(g < .gEps)) { for (i in seq_along(g)) { if (g[i] < .gEps) { inv <- inv + w[i] } } w <- w[g > .gEps] g <- g[g > .gEps] k <- length(w) } #### resll <- matrix(0, nr, k) nTips <- as.integer(length(tree$tip.label)) data <- subset(data, tree$tip.label) on.exit(.C("ll_free")) .C("ll_init", nr, nTips, nc, as.integer(k)) tmp <- pml.fit(tree, data, bf, shape = shape, k = k, Q = Q, levels = attr(data, "levels"), inv = inv, rate = rate, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, llMix = llMix, wMix = wMix, site = TRUE) df <- ifelse(is.ultrametric(tree), tree$Nnode, length(tree$edge.length)) df <- switch(type, DNA = df + (k > 1) + (inv > 0) + length(unique(bf)) - 1 + length(unique(Q)) - 1, AA = df + (k > 1) + (inv > 0), CODON = df + (k > 1) + (inv > 0) + length(unique(bf)) - 1 + (dnds != 1) + (tstv != 1), USER = df + (k > 1) + (inv > 0) + length(unique(bf)) - 1 + length(unique(Q)) - 1) result <- list(logLik = tmp$loglik, inv = inv, k = kmax, shape = shape, Q = Q, bf = bf, rate = rate, siteLik = tmp$siteLik, weight = weight, g = g, w = w, eig = eig, data = data, model = model, INV = INV, ll.0 = ll.0, tree = tree, lv = tmp$resll, call = call, df = df, wMix = wMix, llMix = llMix) if (type == "CODON") { result$dnds <- dnds result$tstv <- tstv result$frequencies <- bf_choice } class(result) <- "pml" result } ### this is the version we want to optimise pml.fit4 <- function(tree, data, bf = rep(1 / length(levels), length(levels)), shape = 1, k = 1, Q = rep(1, length(levels) * (length(levels) - 1) / 2), levels = attr(data, "levels"), inv = 0, rate = 1, g = NULL, w = NULL, eig = NULL, INV = NULL, ll.0 = NULL, llMix = NULL, wMix = 0, ..., site = FALSE) { weight <- as.double(attr(data, "weight")) nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) nTips <- as.integer(length(tree$tip.label)) k <- as.integer(k) m <- 1 if (is.null(eig)) eig <- edQt(bf = bf, Q = Q) if (is.null(w)) { w <- rep(1 / k, k) if (inv > 0) w <- (1 - inv) * w if (wMix > 0) w <- (1 - wMix) * w } if (is.null(g)) { g <- discrete.gamma(shape, k) if (inv > 0) g <- g / (1 - inv) g <- g * rate } # inv0 <- inv if (any(g < .gEps)) { for (i in seq_along(g)) { if (g[i] < .gEps) { inv <- inv + w[i] } } w <- w[g > .gEps] g <- g[g > .gEps] # kmax <- k k <- length(w) } # .iind <- get(".iind", parent.frame()) # .INV <- get(".INV", parent.frame()) # if(is.null(ll.0)) if (is.null(ll.0)) { ll.0 <- numeric(attr(data, "nr")) } if (inv > 0) ll.0 <- as.matrix(INV %*% (bf * inv)) # if(inv>0) # ll.0 <- as.matrix(.INV %*% (bf * inv)) node <- tree$edge[, 1] edge <- tree$edge[, 2] # root <- as.integer(node[length(node)]) el <- as.double(tree$edge.length) node <- as.integer(node - nTips - 1L) # min(node)) edge <- as.integer(edge - 1L) contrast <- attr(data, "contrast") nco <- as.integer(dim(contrast)[1]) siteLik <- .Call("PML4", dlist = data, el, as.double(w), as.double(g), nr, nc, k, eig, as.double(bf), node, edge, nTips, nco, contrast, N = as.integer(length(edge))) ind <- which(ll.0 > 0) if (!is.null(ll.0)) siteLik[ind] <- log(exp(siteLik[ind]) + ll.0[ind]) if (wMix > 0) siteLik <- log(exp(siteLik) * (1 - wMix) + llMix) loglik <- sum(weight * siteLik) if (!site) return(loglik) return(list(loglik = loglik, siteLik = siteLik)) # , resll=resll } #' Internal maximum likelihood functions. #' #' These functions are internally used for the likelihood computations in #' \code{pml} or \code{optim.pml}. #' #' These functions are exported to be used in different packages so far only in #' the package coalescentMCMC, but are not intended for end user. Most of the #' functions call C code and are far less forgiving if the import is not what #' they expect than \code{pml}. #' #' @param tree A phylogenetic \code{tree}, object of class \code{phylo}. #' @param data An alignment, object of class \code{phyDat}. #' @param bf Base frequencies. #' @param shape Shape parameter of the gamma distribution. #' @param k Number of intervals of the discrete gamma distribution. #' @param Q A vector containing the lower triangular part of the rate matrix. #' @param levels The alphabet used e.g. c("a", "c", "g", "t") for DNA #' @param inv Proportion of invariable sites. #' @param rate Rate. #' @param g vector of quantiles (default is NULL) #' @param w vector of probabilities (default is NULL) #' @param eig Eigenvalue decomposition of Q #' @param INV Sparse representation of invariant sites #' @param ll.0 default is NULL #' @param llMix default is NULL #' @param wMix default is NULL #' @param \dots Further arguments passed to or from other methods. #' @param site return the log-likelihood or vector of sitewise likelihood #' values #' @return \code{pml.fit} returns the log-likelihood. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}, \link{pmlPart}, \link{pmlMix}} #' @references Felsenstein, J. (1981) Evolutionary trees from DNA sequences: a #' maximum likelihood approach. \emph{Journal of Molecular Evolution}, #' \bold{17}, 368--376. #' @keywords cluster #' #' @rdname pml.fit #' @export pml.fit pml.fit <- function(tree, data, bf = rep(1 / length(levels), length(levels)), shape = 1, k = 1, Q = rep(1, length(levels) * (length(levels) - 1) / 2), levels = attr(data, "levels"), inv = 0, rate = 1, g = NULL, w = NULL, eig = NULL, INV = NULL, ll.0 = NULL, llMix = NULL, wMix = 0, ..., site = FALSE) { Mkv <- FALSE weight <- as.double(attr(data, "weight")) nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) nTips <- as.integer(length(tree$tip.label)) k <- as.integer(k) m <- 1 if (is.null(eig)) eig <- edQt(bf = bf, Q = Q) if (is.null(w)) { w <- rep(1 / k, k) if (inv > 0) w <- (1 - inv) * w if (wMix > 0) w <- (1 - wMix) * w } if (is.null(g)) { g <- discrete.gamma(shape, k) if (inv > 0) g <- g / (1 - inv) g <- g * rate } # inv0 <- inv if (any(g < .gEps)) { for (i in seq_along(g)) { if (g[i] < .gEps) { inv <- inv + w[i] } } w <- w[g > .gEps] g <- g[g > .gEps] # kmax <- k k <- length(w) } if (is.null(INV)) INV <- Matrix(lli(data, tree), sparse = TRUE) if (is.null(ll.0)) { ll.0 <- numeric(attr(data, "nr")) } if (inv > 0) ll.0 <- as.matrix(INV %*% (bf * inv)) if (Mkv) ll.0 <- as.matrix(INV %*% bf) if (wMix > 0) ll.0 <- ll.0 + llMix node <- tree$edge[, 1] edge <- tree$edge[, 2] # root <- as.integer(node[length(node)]) el <- as.double(tree$edge.length) node <- as.integer(node - nTips - 1L) # min(node)) edge <- as.integer(edge - 1L) contrast <- attr(data, "contrast") nco <- as.integer(dim(contrast)[1]) # dlist=data, nr, nc, weight, k ausserhalb definieren # pmlPart einbeziehen # as.double(w), resll <- .Call("PML0", dlist = data, el, as.double(g), nr, nc, k, eig, as.double(bf), node, edge, nTips, nco, contrast, N = as.integer(length(edge))) # sort(INV@i)+1L ind <- which(ll.0 > 0) # automatic in INV gespeichert sca <- .Call("rowMax", resll, length(weight), as.integer(k)) + 1 # nr statt length(weight) lll <- resll - sca lll <- exp(lll) lll <- (lll %*% w) if (Mkv) p0 <- sum(exp(log(lll[ind]) + sca[ind])) lll[ind] <- lll[ind] + exp(log(ll.0[ind]) - sca[ind]) siteLik <- lll siteLik <- log(siteLik) + sca # needs to change if (wMix > 0) siteLik <- log(exp(siteLik) * (1 - wMix) + llMix) if (Mkv) siteLik <- siteLik + log(1 - p0) loglik <- sum(weight * siteLik) if (!site) return(loglik) resll <- exp(resll) return(list(loglik = loglik, siteLik = siteLik, resll = resll)) } ### @param optF3x4 Logical value indicating if codon frequencies are estimated ### for the F3x4 model #' Likelihood of a tree. #' #' \code{pml} computes the likelihood of a phylogenetic tree given a sequence #' alignment and a model. \code{optim.pml} optimizes the different model #' parameters. #' #' Base frequencies in \code{pml} can be supplied in different ways. #' For amino acid they are usually defined through specifying a model, so the #' argument bf does not need to be specified. Otherwise if \code{bf=NULL}, #' each state is given equal probabilty. It can be a numeric vector given the #' frequencies. Last but not least \code{bf} can be string "equal", "empirical" #' and for codon models additionally "F3x4". #' #' The topology search uses a nearest neighbor interchange (NNI) and the #' implementation is similar to phyML. The option model in pml is only used #' for amino acid models. The option model defines the nucleotide model which #' is getting optimised, all models which are included in modeltest can be #' chosen. Setting this option (e.g. "K81" or "GTR") overrules options optBf #' and optQ. Here is a overview how to estimate different phylogenetic models #' with \code{pml}: \tabular{lll}{ model \tab optBf \tab optQ \cr Jukes-Cantor #' \tab FALSE \tab FALSE \cr F81 \tab TRUE \tab FALSE \cr symmetric \tab FALSE #' \tab TRUE \cr GTR \tab TRUE \tab TRUE } Via model in optim.pml the following #' nucleotide models can be specified: JC, F81, K80, HKY, TrNe, TrN, TPM1, K81, #' TPM1u, TPM2, TPM2u, TPM3, TPM3u, TIM1e, TIM1, TIM2e, TIM2, TIM3e, TIM3, #' TVMe, TVM, SYM and GTR. These models are specified as in Posada (2008). #' #' So far 17 amino acid models are supported ("WAG", "JTT", "LG", "Dayhoff", #' "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", #' "FLU", "Blossum62", "Dayhoff_DCMut" and "JTT_DCMut") and additionally rate #' matrices and amino acid frequencies can be supplied. #' #' It is also possible to estimate codon models (e.g. YN98), for details see #' also the chapter in vignette("phangorn-specials"). #' #' If the option 'optRooted' is set to TRUE than the edge lengths of rooted #' tree are optimized. The tree has to be rooted and by now ultrametric! #' Optimising rooted trees is generally much slower. #' #' \code{pml.control} controls the fitting process. \code{epsilon} and #' \code{maxit} are only defined for the most outer loop, this affects #' \code{pmlCluster}, \code{pmlPart} and \code{pmlMix}. \code{epsilon} is #' defined as (logLik(k)-logLik(k+1))/logLik(k+1), this seems to be a good #' heuristics which works reasonably for small and large trees or alignments. #' If \code{trace} is set to zero than no out put is shown, if functions are #' called internally than the trace is decreased by one, so a higher of trace #' produces more feedback. #' #' If \code{rearrangement} is set to \code{stochastic} a stochastic search #' algorithm similar to Nguyen et al. (2015). and for \code{ratchet} the #' likelihood ratchet as in Vos (2003). This should helps often to find better #' tree topologies, especially for larger trees. #' #' @aliases pml #' @param tree A phylogenetic \code{tree}, object of class \code{phylo}. #' @param data An alignment, object of class \code{phyDat}. #' @param bf Base frequencies (see details). #' @param Q A vector containing the lower triangular part of the rate matrix. #' @param inv Proportion of invariable sites. #' @param k Number of intervals of the discrete gamma distribution. #' @param shape Shape parameter of the gamma distribution. #' @param rate Rate. #' @param model allows to choose an amino acid models or nucleotide model, see #' details. #' @param object An object of class \code{pml}. #' @param optNni Logical value indicating whether toplogy gets optimized (NNI). #' @param optBf Logical value indicating whether base frequencies gets #' optimized. #' @param optQ Logical value indicating whether rate matrix gets optimized. #' @param optInv Logical value indicating whether proportion of variable size #' gets optimized. #' @param optGamma Logical value indicating whether gamma rate parameter gets #' optimized. #' @param optEdge Logical value indicating the edge lengths gets optimized. #' @param optRate Logical value indicating the overall rate gets optimized. #' @param optRooted Logical value indicating if the edge lengths of a rooted #' tree get optimized. #' @param ratchet.par search parameter for stochastic search #' @param rearrangement type of tree tree rearrangements to perform, one of #' "none", "NNI", "stochastic" or "ratchet" #' @param control A list of parameters for controlling the fitting process. #' @param subs A (integer) vector same length as Q to specify the optimization #' of Q #' @param \dots Further arguments passed to or from other methods. #' @param epsilon Stop criterion for optimisation (see details). #' @param maxit Maximum number of iterations (see details). #' @param trace Show output during optimization (see details). #' @return \code{pml} or \code{optim.pml} return a list of class \code{pml}, #' some are useful for further computations like \item{tree}{the phylogenetic #' tree.} \item{data}{the alignment.} \item{logLik}{Log-likelihood of the #' tree.} \item{siteLik}{Site log-likelihoods.} \item{weight}{Weight of the #' site patterns.} #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{bootstrap.pml}}, \code{\link{modelTest}}, #' \code{\link{pmlPart}}, \code{\link{pmlMix}}, \code{\link{plot.phylo}}, #' \code{\link{SH.test}}, \code{\link{ancestral.pml}} #' @references Felsenstein, J. (1981) Evolutionary trees from DNA sequences: a #' maximum likelihood approach. \emph{Journal of Molecular Evolution}, #' \bold{17}, 368--376. #' #' Felsenstein, J. (2004). \emph{Inferring Phylogenies}. Sinauer Associates, #' Sunderland. #' #' Yang, Z. (2006). \emph{Computational Molecular evolution}. Oxford University #' Press, Oxford. #' #' Adachi, J., P. J. Waddell, W. Martin, and M. Hasegawa (2000) Plastid genome #' phylogeny and a model of amino acid substitution for proteins encoded by #' chloroplast DNA. \emph{Journal of Molecular Evolution}, \bold{50}, 348--358 #' #' Rota-Stabelli, O., Z. Yang, and M. Telford. (2009) MtZoa: a general #' mitochondrial amino acid substitutions model for animal evolutionary #' studies. \emph{Mol. Phyl. Evol}, \bold{52(1)}, 268--72 #' #' Whelan, S. and Goldman, N. (2001) A general empirical model of protein #' evolution derived from multiple protein families using a maximum-likelihood #' approach. \emph{Molecular Biology and Evolution}, \bold{18}, 691--699 #' #' Le, S.Q. and Gascuel, O. (2008) LG: An Improved, General Amino-Acid #' Replacement Matrix \emph{Molecular Biology and Evolution}, \bold{25(7)}, #' 1307--1320 #' #' Yang, Z., R. Nielsen, and M. Hasegawa (1998) Models of amino acid #' substitution and applications to Mitochondrial protein evolution. #' \emph{Molecular Biology and Evolution}, \bold{15}, 1600--1611 #' #' Abascal, F., D. Posada, and R. Zardoya (2007) MtArt: A new Model of amino #' acid replacement for Arthropoda. \emph{Molecular Biology and Evolution}, #' \bold{24}, 1--5 #' #' Kosiol, C, and Goldman, N (2005) Different versions of the Dayhoff rate #' matrix - \emph{Molecular Biology and Evolution}, \bold{22}, 193--199 #' #' L.-T. Nguyen, H.A. Schmidt, A. von Haeseler, and B.Q. Minh (2015) IQ-TREE: A #' fast and effective stochastic algorithm for estimating maximum likelihood #' phylogenies. \emph{Molecular Biology and Evolution}, \bold{32}, 268--274. #' #' Vos, R. A. (2003) Accelerated Likelihood Surface Exploration: The Likelihood #' Ratchet. \emph{Systematic Biology}, \bold{52(3)}, 368--373 #' #' Yang, Z., and R. Nielsen (1998) Synonymous and nonsynonymous rate variation #' in nuclear genes of mammals. \emph{Journal of Molecular Evolution}, #' \bold{46}, 409-418. #' #' Lewis, P.O. (2001) A likelihood approach to estimating phylogeny from #' discrete morphological character data. \emph{Systematic Biology} \bold{50}, #' 913--925. #' @keywords cluster #' @importFrom Matrix Matrix #' @examples #' #' example(NJ) #' # Jukes-Cantor (starting tree from NJ) #' fitJC <- pml(tree, Laurasiatherian) #' # optimize edge length parameter #' fitJC <- optim.pml(fitJC) #' fitJC #' #' \dontrun{ #' # search for a better tree using NNI rearrangements #' fitJC <- optim.pml(fitJC, optNni=TRUE) #' fitJC #' plot(fitJC$tree) #' #' # JC + Gamma + I - model #' fitJC_GI <- update(fitJC, k=4, inv=.2) #' # optimize shape parameter + proportion of invariant sites #' fitJC_GI <- optim.pml(fitJC_GI, optGamma=TRUE, optInv=TRUE) #' # GTR + Gamma + I - model #' fitGTR <- optim.pml(fitJC_GI, rearrangement = "stochastic", #' optGamma=TRUE, optInv=TRUE, model="GTR") #' } #' #' #' # 2-state data (RY-coded) #' dat <- acgt2ry(Laurasiatherian) #' fit2ST <- pml(tree, dat) #' fit2ST <- optim.pml(fit2ST,optNni=TRUE) #' fit2ST #' # show some of the methods available for class pml #' methods(class="pml") #' #' @rdname pml #' @export pml pml <- function(tree, data, bf = NULL, Q = NULL, inv = 0, k = 1, shape = 1, rate = 1, model = NULL, ...) { Mkv <- FALSE if (!is.null(model) && model == "Mkv") Mkv <- TRUE call <- match.call() extras <- match.call(expand.dots = FALSE)$... pmla <- c("wMix", "llMix", "dnds", "tstv") existing <- match(pmla, names(extras)) wMix <- ifelse(is.na(existing[1]), 0, eval(extras[[existing[1]]], parent.frame())) llMix <- ifelse(is.na(existing[2]), 0, eval(extras[[existing[2]]], parent.frame())) # allow dnds <- tstv <- 1 dnds <- ifelse(is.na(existing[3]), 1, eval(extras[[existing[3]]], parent.frame())) tstv <- ifelse(is.na(existing[4]), 1, eval(extras[[existing[4]]], parent.frame())) if (!inherits(tree, "phylo")) stop("tree must be of class phylo") # if(is.null(tree$edge.length)){ # warning("tree has no edge length, used nnls.phylo to assign them") # tree <- nnls.phylo(tree, dist.ml(data)) # } if (any(duplicated(tree$tip.label))) stop("tree must have unique labels!") nTips <- as.integer(length(tree$tip.label)) if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") if (any(tree$edge.length < 0)) { if(is.rooted(tree)) nh <- nodeHeight(tree)[1:nTips] tree$edge.length[tree$edge.length < 0] <- 1e-08 message("negative edges length changed to 0!") if(is.rooted(tree)){ ind <- match(as.integer(1:nTips), tree$edge[, 2]) tree$edge.length[ind] <- tree$edge.length[ind] + (nodeHeight(tree)[1:nTips] - nh) } } if (class(data)[1] != "phyDat") stop("data must be of class phyDat") if (is.null(tree$edge.length)) stop("tree must have edge weights") if (any(is.na(match(tree$tip.label, attr(data, "names"))))) stop("tip labels are not in data") data <- subset(data, tree$tip.label) # needed levels <- attr(data, "levels") if (Mkv) { data <- cbind(constSitePattern(length(tree$tip.label), levels, tree$tip.label), data) attr(data, "weight")[1:attr(data, "nc")] <- 0.0 } weight <- attr(data, "weight") nr <- attr(data, "nr") type <- attr(data, "type") if (type == "AA" & !is.null(model)) { model <- match.arg(model, .aamodels) getModelAA(model, bf = is.null(bf), Q = is.null(Q)) } if (type == "CODON") { Q <- CodonQ(subs = .sub, syn = .syn, tstv = tstv, dnds = dnds) if(is.null(bf)) bf_choice <- "equal" } if (is.null(bf)) bf <- rep(1 / length(levels), length(levels)) if (is.character(bf)) { bf_choice <- match.arg(bf, c("equal", "empirical", "F1x4", "F3x4", "F61")) if (bf_choice == "F3x4" & type != "CODON") stop("F3x4 not available for this data type") if (bf_choice == "F1x4" & type != "CODON") stop("F1x4 not available for this data type") if (bf_choice == "F61" & type != "CODON") stop("F61 not available for this data type") bf <- switch(bf_choice, equal = rep(1 / length(levels), length(levels)), empirical = baseFreq(data), F61 = baseFreq(data), F3x4 = F3x4(data), F1x4 = F1x4(data)) names(bf) <- NULL } if (type == "CODON") freq_df <- df_freq_codon(bf_choice) if (is.null(Q)) Q <- rep(1, length(levels) * (length(levels) - 1) / 2) m <- 1 eig <- edQt(bf = bf, Q = Q) w <- rep(1 / k, k) if (inv > 0) w <- (1 - inv) * w if (wMix > 0) w <- wMix * w g <- discrete.gamma(shape, k) if (inv > 0) g <- g / (1 - inv) g <- rate * g inv0 <- inv kmax <- k if (any(g < .gEps)) { for (i in seq_along(g)) { if (g[i] < .gEps) { inv <- inv + w[i] } } w <- w[g > .gEps] g <- g[g > .gEps] k <- length(w) } INV <- Matrix(lli(data, tree), sparse = TRUE) ll.0 <- as.matrix(INV %*% (bf * inv)) # if(Mkv) ll.0 <- as.matrix(INV %*% rep(1, length(bf))) if (wMix > 0) ll.0 <- ll.0 + llMix nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) on.exit(.C("ll_free")) .C("ll_init", nr, nTips, nc, as.integer(k)) tmp <- pml.fit(tree, data, bf, shape = shape, k = k, Q = Q, levels = attr(data, "levels"), inv = inv, rate = rate, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, llMix = llMix, wMix = wMix, site = TRUE) # , Mkv=Mkv df <- ifelse(is.ultrametric(tree), tree$Nnode, length(tree$edge.length)) df <- switch(type, DNA = df + (kmax > 1) + (inv0 > 0) + length(unique(bf)) - 1 + length(unique(Q)) - 1, AA = df + (kmax > 1) + (inv0 > 0), CODON = df + (kmax > 1) + (inv0 > 0) + freq_df + (dnds!=1) + (tstv!=1), USER = df + (kmax > 1) + (inv0 > 0) + length(unique(bf)) - 1 + length(unique(Q)) - 1) result <- list(logLik = tmp$loglik, inv = inv, k = kmax, shape = shape, Q = Q, bf = bf, rate = rate, siteLik = tmp$siteLik, weight = weight, g = g, w = w, eig = eig, data = data, model = model, INV = INV, ll.0 = ll.0, tree = tree, lv = tmp$resll, call = call, df = df, wMix = wMix, llMix = llMix) # , Mkv=Mkv if (type == "CODON") { result$dnds <- dnds result$tstv <- tstv result$frequencies <- bf_choice } class(result) <- "pml" result } optimRooted <- function(tree, data, eig = eig, w = w, g = g, bf = bf, rate = rate, ll.0 = ll.0, INV = INV, control = pml.control(epsilon = 1e-08, maxit = 25, trace = 0), ...) { tree$edge.length[tree$edge.length < 1e-08] <- 1e-08 # nicht richtig nTips <- as.integer(length(tree$tip.label)) k <- length(w) # optimising rooted triplets optRoot0 <- function(t, tree, data, g, w, eig, bf, ll.0, k) { l <- length(tree$edge.length) tree$edge.length[1:(l - 1)] <- tree$edge.length[1:(l - 1)] + t tree$edge.length[l] <- tree$edge.length[l] - t loglik <- pml.fit4(tree, data, bf = bf, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, k = k) # loglik } # optim edges leading to the root optRoot2 <- function(t, tree, data, g, w, eig, bf, ll.0, k) { tree$edge.length <- tree$edge.length + t # c(el1+t, el2-t) loglik <- pml.fit4(tree, data, bf = bf, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, k = k) # , INV=INV loglik } # scale whole tree scaleEdges <- function(t = 1, trace = 0, tree, data, ...) { fn <- function(t, tree, data, ...) { tree$edge.length <- tree$edge.length * t pml.fit4(tree, data, ...) } optimize(f = fn, interval = c(0.25, 4), tree = tree, data = data, ..., maximum = TRUE, tol = .00001) } parent <- tree$edge[, 1] child <- tree$edge[, 2] anc <- Ancestors(tree, 1:max(tree$edge), "parent") sibs <- Siblings(tree, 1:max(tree$edge)) allKids <- cvector <- allChildren(tree) rootNode <- getRoot(tree) child2 <- orderNNI(tree, nTips) # (cvector, rootNode, nTips, TRUE) lengthList <- edgeList <- vector("list", max(tree$edge)) for (i in tree$edge[, 2]) { pa <- anc[i] kids <- sibs[[i]] if (pa != rootNode) { edgeList[[i]] <- cbind(pa, c(anc[pa], kids)) lengthList[[i]] <- c(pa, kids) } else { edgeList[[i]] <- cbind(pa, kids) lengthList[[i]] <- kids } } treeList <- vector("list", max(child2)) for (i in child2) { pa <- anc[i] kids <- allKids[[i]] treeList[[i]] <- cbind(i, c(kids, pa)) } ll <- pml.fit4(tree, data, bf = bf, k = k, eig = eig, ll.0 = ll.0, INV = INV, w = w, g = g) # if(control$trace>2)cat("ll", ll, "\n") eps <- 10 iter <- 1 EL <- numeric(max(tree$edge)) EL[tree$edge[, 2]] <- tree$edge.length eps0 <- 1e-8 tmp <- scaleEdges(t, trace = 0, tree, data, bf = bf, k = k, ll.0 = ll.0, eig = eig, w = w, g = g) # if(control$trace>2)cat("scale", tmp[[2]], "\n") t <- tmp[[1]] tree$edge.length <- tree$edge.length * t el <- tree$edge.length EL[tree$edge[, 2]] <- tree$edge.length ll2 <- pml.fit4(tree, data, bf = bf, k = k, eig = eig, INV = INV, ll.0 = ll.0, w = w, g = g) tmptree <- tree while (eps > control$eps && iter < control$maxit) { ll2 <- pml.fit4(tree, data, bf = bf, k = k, eig = eig, INV = INV, ll.0 = ll.0, w = w, g = g) loli <- rootNode children <- allKids[[rootNode]] kidsEl <- EL[children] minEl <- min(kidsEl) kidsEl <- kidsEl - minEl tmptree$edge <- cbind(rootNode, children) tmptree$edge.length <- kidsEl t <- optimize(f = optRoot2, interval = c(1e-8, 3), tmptree, data = data, k = k, g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, maximum = TRUE) optRoot2(t[[1]], tmptree, data = data, k = k, g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0) # if(control$trace>2)cat("optRoot", t[[2]], "\n") ll3 <- t[[2]] EL[children] <- kidsEl + t[[1]] tree$edge.length <- EL[tree$edge[, 2]] ll2 <- pml.fit4(tree, data, bf = bf, k = k, eig = eig, INV = INV, ll.0 = ll.0, w = w, g = g) for (i in seq_along(child2)) { dad <- child2[i] # if(dad>nTips ){ # kann raus pa <- anc[dad] while (loli != pa) { tmpKids <- cvector[[loli]] tmpEdge <- cbind(loli, tmpKids) pml.move(tmpEdge, EL[tmpKids], data, g, w, eig, k, nTips, bf) loli <- anc[loli] } pml.move(edgeList[[dad]], EL[lengthList[[dad]]], data, g, w, eig, k, nTips, bf) children <- allKids[[dad]] kidsEl <- EL[children] minEl <- min(kidsEl) maxEl <- EL[dad] EDGE <- treeList[[dad]] tmptree$edge <- EDGE tmptree$edge.length <- c(kidsEl, maxEl) t0 <- optRoot0(0, tmptree, data, g, w, eig, bf, ll.0, k) t <- optimize(f = optRoot0, interval = c(-minEl + eps0, maxEl - eps0), tmptree, data = data, g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, k = k, maximum = TRUE) # if(control$trace>2) cat("edge", t[[2]], "\n") if (!is.nan(t[[2]]) & t[[2]] > ll3) { optRoot0(t[[1]], tmptree, data = data, g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, k = k) EL[children] <- kidsEl + t[[1]] EL[dad] <- maxEl - t[[1]] ll3 <- t[[2]] } else optRoot0(0, tmptree, data, g, w, eig, bf, ll.0, k) loli <- dad # } } tree$edge.length <- EL[tree$edge[, 2]] ll2 <- pml.fit(tree, data, bf = bf, k = k, eig = eig, ll.0 = ll.0, INV = INV, w = w, g = g) eps <- (ll - ll2) / ll2 if (control$trace > 1) cat("optimRooted: ", ll, " -> ", ll2, "\n") ll <- ll2 iter <- iter + 1 } list(tree = tree, logLik = ll, c(eps = eps, iter = iter)) } index.nni <- function(ch, cvector, pvector, root) { p1 <- pvector[ch] k12 <- cvector[[ch]] k3 <- cvector[[p1]] k3 <- k3[k3 != ch] kids <- c(k12, k3, ch) parents <- c(ch, ch, p1, p1) if (p1 != root) { k4 <- pvector[p1] kids <- c(kids, k4) parents <- c(parents, p1) } cbind(parents, kids) } orderNNI <- function(tree, nTips) { res <- reorder(tree)$edge[, 2] res <- res[res > nTips] res } rooted.nni <- function(tree, data, eig, w, g, bf, rate, ll.0, INV, control = pml.control(epsilon = 1e-08, maxit = 25, trace = 0), ...) { ind0 <- which(ll.0 > 0) contrast <- attr(data, "contrast") tree$edge.length[tree$edge.length < 1e-08] <- 1e-08 nTips <- as.integer(length(tree$tip.label)) k <- length(w) if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder.phylo(tree, "postorder") if (!is.rooted(tree)) stop("tree must be rooted") attr(tree, "order") <- NULL weight <- attr(data, "weight") nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) getEL1 <- function(t, nh) { el <- numeric(4) if (nh[1] > nh[2]) { el[2] <- nh[1] - nh[2] tnh <- nh[1] + t[1] } else { el[1] <- nh[2] - nh[1] tnh <- nh[2] + t[1] } el[1:2] <- el[1:2] + t[1] if (tnh > nh[3]) el[3] <- el[3] + tnh - nh[3] else el[4] <- el[4] - tnh + nh[3] el[3:4] <- el[3:4] + t[2] el } optRootU <- function(t, tree, data, bf, g, w, eig, ll.0, k, INV, nh) { tree$edge.length <- getEL1(t, nh) pml.fit4(tree, data, bf = bf, k = k, eig = eig, ll.0 = ll.0, INV = INV, w = w, g = g) } getEL2 <- function(t, nh) { el <- numeric(5) eps <- 1e-6 nh12.min <- max(nh[1:2]) + eps nh123.min <- max(nh12.min, nh[3]) + eps l1 <- nh[5] - nh123.min - eps el[5] <- l1 * t[1] + eps nh123 <- nh[5] - el[5] l2 <- nh123 - nh12.min - eps nh12 <- nh12.min + l2 * t[2] el[1] <- nh12 - nh[1] el[2] <- nh12 - nh[2] el[3] <- nh123 - nh[3] el[4] <- nh123 - nh12 el } optEdgeU <- function(t, tree, data, bf, g, w, eig, ll.0, k, INV, nh) { tree$edge.length <- getEL2(t, nh) pml.fit4(tree, data, bf = bf, k = k, eig = eig, ll.0 = ll.0, INV = INV, w = w, g = g) } child <- tree$edge[, 2] parent <- tree$edge[, 1] ll <- pml.fit4(tree, data, bf = bf, k = k, eig = eig, ll.0 = ll.0, INV = INV, w = w, g = g) llstart <- ll eps <- .00001 iter <- 1 EL <- numeric(max(tree$edge)) EL[tree$edge[, 2]] <- tree$edge.length change <- numeric(length(parent)) + 1 rootNode <- getRoot(tree) anc <- Ancestors(tree, 1:max(tree$edge), "parent") cvector <- allChildren(tree) sibs <- Siblings(tree, 1:max(tree$edge)) child2 <- orderNNI(tree, nTips) while (iter < 2) { ll2 <- pml.fit(tree, data, bf = bf, k = k, eig = eig, ll.0 = ll.0, INV = INV, w = w, g = g) nh <- nodeHeight(tree) loli <- rootNode pa <- rootNode nchanges <- 0 ind <- 1 i <- 1 tree1 <- tree2 <- tree3 <- tree for (i in seq_along(child2)) { ch <- child2[i] dad <- anc[ch] if (ch > nTips) { EL[tree$edge[, 2]] <- tree$edge.length pa <- ifelse(dad == rootNode, rootNode, anc[dad]) # should avoid unnecessary movements while (loli != dad && loli != rootNode) { if (loli == pa) { tmpKids <- sibs[[dad]] tmpEdge <- cbind(pa, c(anc[pa], tmpKids)) pml.move(tmpEdge, EL[c(pa, tmpKids)], data, g, w, eig, k, nTips, bf) # cat("move from pa to dad \n") loli <- dad } else { # cat("move loli up", loli, "dad", dad, "pa", pa, "ch", ch, "\n") tmpKids <- cvector[[loli]] tmpEdge <- cbind(loli, tmpKids) pml.move(tmpEdge, EL[tmpKids], data, g, w, eig, k, nTips, bf) loli <- anc[loli] } } if (loli == rootNode && dad != loli) { # update all nodes pml.fit(tree, data, bf = bf, k = k, eig = eig, ll.0 = ll.0, INV = INV, w = w, g = g) # cat("move down loli", loli, "dad", dad, "pa", pa, "ch", ch, "\n") gd <- rev(Ancestors(tree, ch, "all")) tmpKids <- sibs[[gd[2]]] tmpEdge <- cbind(rootNode, tmpKids) pml.move(tmpEdge, EL[tmpKids], data, g, w, eig, k, nTips, bf) gd <- gd[-1] while (length(gd) > 1) { tmpKids <- sibs[[gd[2]]] tmpEdge <- cbind(gd[1], c(anc[gd[1]], tmpKids)) pml.move(tmpEdge, EL[c(gd[1], tmpKids)], data, g, w, eig, k, nTips, bf) gd <- gd[-1] } loli <- dad } X1 <- index.nni(ch, cvector, anc, rootNode) if (loli != rootNode) { tree1$edge <- X1 tree1$edge.length <- abs(nh[X1[, 1]] - nh[X1[, 2]]) ll0 <- pml.fit4(tree1, data, bf = bf, k = k, eig = eig, ll.0 = ll.0, INV = INV, w = w, g = g) # cat("quartet", ll0, ch, dad, "\n") } if (dad == rootNode) { ll0 <- pml.fit(tree, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, INV = INV) # cat("at root", ll0, ch, dad, "\n") ind2 <- c(1, 3, 2, 4) ind3 <- c(3, 2, 1, 4) X2 <- X3 <- X1 X2[, 2] <- X1[ind2, 2] X3[, 2] <- X1[ind3, 2] tree1$edge <- X1 tree2$edge <- X2 tree3$edge <- X3 edge1 <- X1[, 2] edge1[4] <- dad res1 <- optim(par = c(.1, .1), optRootU, gr = NULL, tree = tree1, data = data, nh = nh[X1[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, INV = INV, k = k, method = "L-BFGS-B", lower = 1e-8, upper = 5, control = list(fnscale = -1)) res2 <- optim(par = c(.1, .1), optRootU, gr = NULL, tree = tree2, data = data, nh = nh[X2[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, INV = INV, k = k, method = "L-BFGS-B", lower = 1e-8, upper = 5, control = list(fnscale = -1)) res3 <- optim(par = c(.1, .1), optRootU, gr = NULL, tree = tree3, data = data, nh = nh[X3[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, INV = INV, k = k, method = "L-BFGS-B", lower = 1e-8, upper = 5, control = list(fnscale = -1)) ind <- which.max(c(res1[[2]], res2[[2]], res3[[2]])) if (control$trace > 2) cat("root", c(res1[[2]], res2[[2]], res3[[2]]), "\n") if (ind == 1) { ll2 <- res1[[2]] optRootU(t = res1[[1]], tree = tree1, data = data, nh = nh[X1[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, INV = INV, k = k) tmpEL <- getEL1(res1[[1]], nh[X1[, 2]]) tree <- changeEdgeLength(tree, X1[, 2], tmpEL) } if (ind == 2) { ll2 <- res2[[2]] optRootU(t = res2[[1]], tree = tree2, data = data, nh = nh[X2[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, INV = INV, k = k) tmpEL <- getEL1(res2[[1]], nh[X2[, 2]]) tree <- changeEdge(tree, X1[c(2, 3), 2]) tree <- changeEdgeLength(tree, X2[, 2], tmpEL) } if (ind == 2) { ll2 <- res3[[2]] optRootU(t = res3[[1]], tree = tree3, data = data, nh = nh[X3[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, INV = INV, k = k) tmpEL <- getEL1(res3[[1]], nh[X3[, 2]]) tree <- changeEdge(tree, X1[c(1, 3), 2]) tree <- changeEdgeLength(tree, X3[, 2], tmpEL) } } else { loli <- dad ind2 <- c(1, 3, 2, 4, 5) ind3 <- c(3, 2, 1, 4, 5) X2 <- X3 <- X1 X2[, 2] <- X1[ind2, 2] X3[, 2] <- X1[ind3, 2] tree1$edge <- X1 tree2$edge <- X2 tree3$edge <- X3 tt <- c(.3, .5) res1 <- optim(par = tt, optEdgeU, gr = NULL, tree = tree1, data, nh = nh[X1[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, INV = INV, k = k, method = "L-BFGS-B", lower = 1e-4, upper = 1 - 1e-4, control = list(fnscale = -1)) res2 <- optim(par = tt, optEdgeU, gr = NULL, tree = tree2, data, nh = nh[X2[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, INV = INV, k = k, method = "L-BFGS-B", lower = 1e-4, upper = 1 - 1e-4, control = list(fnscale = -1)) res3 <- optim(par = tt, optEdgeU, gr = NULL, tree = tree3, data, nh = nh[X3[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, INV = INV, k = k, method = "L-BFGS-B", lower = 1e-4, upper = 1 - 1e-4, control = list(fnscale = -1)) ind <- which.max(c(res1[[2]], res2[[2]], res3[[2]])) if (control$trace > 2) cat("edge", ch, ":", c(res1[[2]], res2[[2]], res3[[2]]), "\n") ll3 <- max(c(res1[[2]], res2[[2]], res3[[2]])) if ( (ll3 - 1e-5 * ll3) < ll2) { loli <- rootNode ll2 <- pml.fit4(tree, data, bf = bf, k = k, eig = eig, ll.0 = ll.0, INV = INV, w = w, g = g) nh <- nodeHeight(tree) EL[tree$edge[, 2]] <- tree$edge.length ind <- 0 } else { if (ind == 1) { ll2 <- res1[[2]] optEdgeU(res1[[1]], tree = tree1, data, nh = nh[X1[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, INV = INV, k = k) tmpEL <- getEL2(res1[[1]], nh[X1[, 2]]) tmpE <- X1[, 2] tmpE[5] <- X1[5, 1] tree <- changeEdgeLength(tree, tmpE, tmpEL) } if (ind == 2) { ll2 <- res2[[2]] optEdgeU(res2[[1]], tree = tree2, data, nh = nh[X2[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, INV = INV, k = k) tmpEL <- getEL2(res2[[1]], nh[X2[, 2]]) tmpE <- X2[, 2] tmpE[5] <- X1[5, 1] tree <- changeEdge(tree, X1[c(2, 3), 2]) tree <- changeEdgeLength(tree, tmpE, tmpEL) } if (ind == 3) { ll2 <- res3[[2]] optEdgeU(res3[[1]], tree = tree3, data, nh = nh[X3[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, INV = INV, k = k) tmpEL <- getEL2(res3[[1]], nh[X3[, 2]]) tmpE <- X3[, 2] tmpE[5] <- X1[5, 1] tree <- changeEdge(tree, X1[c(1, 3), 2]) tree <- changeEdgeLength(tree, tmpE, tmpEL) } } } nh <- nodeHeight(tree) EL[tree$edge[, 2]] <- tree$edge.length loli <- dad if (ind > 1) { # print("NNI swap") nchanges <- nchanges + 1 anc <- Ancestors(tree, 1:max(tree$edge), "parent") cvector <- allChildren(tree) sibs <- Siblings(tree, 1:max(tree$edge)) } } } ll2 <- pml.fit4(tree, data, bf = bf, k = k, eig = eig, ll.0 = ll.0, INV = INV, w = w, g = g) eps <- (ll - ll2) / ll2 if (control$trace > 1) cat(ll, " -> ", ll2, "\n") if (control$trace > 1) cat("swap:", nchanges) ll <- ll2 iter <- iter + 1 } list(tree = tree, logLik = ll, iter = iter, swap = nchanges) } #' @rdname pml #' @aliases optim.pml #' @export optim.pml <- function(object, optNni = FALSE, optBf = FALSE, optQ = FALSE, optInv = FALSE, optGamma = FALSE, optEdge = TRUE, optRate = FALSE, optRooted = FALSE, #optF3x4 = FALSE, control = pml.control(epsilon = 1e-8, maxit = 10, trace = 1L), model = NULL, rearrangement = ifelse(optNni, "NNI", "none"), subs = NULL, ratchet.par = list(iter = 20L, maxit = 100L, prop = 1 / 2), ...) { optRatchet <- FALSE optRatchet2 <- FALSE optF3x4 <- FALSE if (rearrangement == "none") { optNni <- FALSE optRatchet <- FALSE optRatchet2 <- FALSE } if (rearrangement == "NNI") optNni <- TRUE if (rearrangement == "stochastic") optRatchet <- TRUE if (rearrangement == "ratchet") optRatchet2 <- TRUE extras <- match.call(expand.dots = FALSE)$... pmla <- c("wMix", "llMix") wMix <- object$wMix llMix <- object$llMix # Mkv <- object$Mkv Mkv <- FALSE if (is.null(llMix)) llMix <- 0 if (!is.null(extras)) { names(extras) <- pmla[pmatch(names(extras), pmla)] existing <- match(pmla, names(extras)) if (!is.na(existing[1])) wMix <- eval(extras[[existing[1]]], parent.frame()) if (!is.na(existing[2])) llMix <- eval(extras[[existing[2]]], parent.frame()) } tree <- object$tree call <- object$call ratchet <- FALSE ratchet2 <- FALSE if (optRatchet == TRUE) { if (optRooted == FALSE) { optNni <- TRUE optEdge <- TRUE ratchet <- TRUE } } if (optRatchet2 == TRUE) { optNni <- TRUE optEdge <- TRUE ratchet2 <- TRUE } data <- object$data addTaxa <- FALSE if (optNni) { # test this more # dup <- duplicated(data) # if(any(dup)){ # && optNNI # orig.data <- data # addTaxa <- TRUE # labels <- names(data) # ldup <- labels[dup] # ind2 <- match(subset(data, dup), data) # tree2 <- drop.tip(tree, ldup) # tree <- reorder(tree2, "postorder") # mapping <- cbind(labels[dup], labels[ind2]) # } mapping <- map_duplicates(data) if (!is.null(mapping)) { orig.data <- data addTaxa <- TRUE tree2 <- drop.tip(tree, mapping[, 1]) tree <- reorder(tree2, "postorder") } if (!is.binary(tree)) tree <- multi2di(tree) optEdge <- TRUE } if (length(tree$tip.label) < (3 + !optRooted)) { optNni <- FALSE ratchet <- FALSE ratchet2 <- FALSE } if (length(tree$tip.label) < (2 + !optRooted)) { stop("rooted / unrooted tree needs at least 2 / 3 tips") } if (is.rooted(tree)) { if (optRooted == FALSE && optEdge == TRUE) { tree <- unroot(tree) attr(tree, "order") <- NULL tree <- reorder(tree, "postorder") warning("I unrooted the tree", call. = FALSE) } } if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") if (any(tree$edge.length < 1e-08)) { tree$edge.length[tree$edge.length < 1e-08] <- 1e-08 if (optRooted) { nTips <- as.integer(length(tree$tip.label)) ind <- match(as.integer(1:nTips), tree$edge[, 2]) tree$edge.length[ind] <- tree$edge.length[ind] + nodeHeight(tree)[1:nTips] } # save to change to new update.pml object <- update.pml(object, tree = tree) } if (optEdge & optRate) { warning("You can't optimise edges and rates at the same time, only edges are optimised!", call. = FALSE) optRate <- FALSE } if (optRooted) { optEdge <- FALSE if (!is.rooted(tree)) stop("tree must be rooted") if (!is.ultrametric(tree)) stop("Tree must be ultrametric!") } trace <- control$trace data <- subset(data, tree$tip.label) type <- attr(data, "type") if (type == "AA") { if(!is.null(model)) object <- update(object, model = model) model <- object$model } if (type == "CODON") { if (is.null(model)) model <- "codon1" model <- match.arg(model, c("codon0", "codon1", "codon2", "codon3", "YN98")) dnds <- object$dnds tstv <- object$tstv if (!is.null(model)) { if (model == "codon0") optQ <- FALSE else optQ <- TRUE if (model == "YN98") optBf <- TRUE } bf_choice <- object$frequencies freq_df <- df_freq_codon(bf_choice) if(bf_choice=="F3x4" & optBf) optF3x4 <- TRUE } if (optF3x4) { if (type != "CODON") stop("optF3x4 needs codon data") optBf <- FALSE bf <- F3x4(data) bf_codon <- bf_by_codon(data) object <- update.pml(object, bf = bf) } Q <- object$Q if (is.null(subs)) subs <- c(1:(length(Q) - 1), 0) bf <- object$bf eig <- object$eig inv <- object$inv k <- object$k if (k == 1 & optGamma) { optGamma <- FALSE message("only one rate class, ignored optGamma") } # if(Mkv==TRUE & optInv==TRUE){ # optInv = FALSE # message('cannot estimate invariant sites and Mkv model, ignored optInv') # } shape <- object$shape w <- object$w g <- object$g if (type == "DNA" & !is.null(model)) { tmp <- subsChoice(model) optQ <- tmp$optQ if (!optQ) Q <- rep(1, 6) optBf <- tmp$optBf if (!optBf) bf <- c(0.25, 0.25, 0.25, 0.25) subs <- tmp$subs } ll0 <- object$logLik INV <- object$INV ll.0 <- object$ll.0 rate <- object$rate ll <- ll0 ll1 <- ll0 opti <- TRUE nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) nTips <- as.integer(length(tree$tip.label)) # on.exit(.C("ll_free")) # .C("ll_init", nr, nTips, nc, as.integer(k)) # .INV <- .iind <- NULL on.exit({ tmp <- pml.fit(tree, data, bf, shape = shape, k = k, Q = Q, levels = attr(data, "levels"), inv = inv, rate = rate, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, llMix = llMix, wMix = wMix, site = TRUE) # df <- ifelse(optRooted, tree$Nnode, length(tree$edge.length)) # length(tree$edge.length) # nTips # nNodes # uniqueTips # uniqueNodes # kmax>1 # bf # Q if (addTaxa) { tree <- add.tips(tree, tips = mapping[, 1], where = mapping[, 2], edge.length = rep(0, nrow(mapping))) # addAllTips(tree, mapping) data <- orig.data } df <- ifelse(optRooted, tree$Nnode, length(tree$edge.length)) df <- switch(type, DNA = df + (k > 1) + (inv > 0) + length(unique(bf)) - 1 + length(unique(Q)) - 1, AA = df + (k > 1) + (inv > 0) + optBf * (length(unique(bf)) - 1), # CODON = df + (k > 1) + (inv > 0) + length(unique(bf)) - 1 + # (dnds != 1) + (tstv != 1), CODON = df + (k > 1) + (inv > 0) + freq_df + (dnds != 1) + (tstv != 1), USER = df + (k > 1) + (inv > 0) + length(unique(bf)) - 1 + length(unique(Q)) - 1) object <- list(logLik = tmp$loglik, inv = inv, k = k, shape = shape, Q = Q, bf = bf, rate = rate, siteLik = tmp$siteLik, weight = attr(data, "weight"), g = g, w = w, eig = eig, data = data, model = model, INV = INV, ll.0 = ll.0, tree = tree, lv = tmp$resll, call = call, df = df, wMix = wMix, llMix = llMix) if (type == "CODON") { object$dnds <- dnds object$tstv <- tstv object$frequencies <- bf_choice } class(object) <- "pml" extras <- pairlist(bf = bf, Q = Q, inv = inv, shape = shape, rate = rate)[c(optBf, optQ, optInv, optGamma, optRate)] if (length(extras)) { existing <- !is.na(match(names(extras), names(call))) for (a in names(extras)[existing]) call[[a]] <- extras[[a]] if (any(!existing)) { call <- c(as.list(call), extras[!existing]) call <- as.call(call) } } object$call <- call pml.free() return(object) }) pml.init(data, k) if (optEdge) { # check if non-negative least-squares is better for start of # optimisation treetmp <- nnls.phylo(tree, dist.ml(data)) treetmp$edge.length[treetmp$edge.length < 1e-8] <- 1e-8 tmplogLik <- pml.fit(treetmp, data, bf, k = k, inv = inv, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, llMix = llMix, wMix = wMix) if (tmplogLik > ll) tree <- treetmp res <- optimEdge(tree, data, eig = eig, w = w, g = g, bf = bf, rate = rate, ll.0 = ll.0, INV = INV, control <- pml.control(epsilon = 1e-07, maxit = 5, trace = trace - 1)) if (trace > 0) cat("optimize edge weights: ", ll, "-->", max(res[[2]], ll), "\n") if (res[[2]] > ll) { ll <- res[[2]] tree <- res[[1]] } } if (optRooted) { res <- optimRooted(tree, data, eig = eig, w = w, g = g, bf = bf, rate = rate, ll.0 = ll.0, INV = INV, control = pml.control(epsilon = 1e-07, maxit = 10, trace = trace - 1)) if (trace > 0) cat("optimize edge weights: ", ll, "-->", max(res[[2]], ll), "\n") if (res[[2]] > ll) { ll <- res[[2]] tree <- res[[1]] } } rounds <- 1 while (opti) { if (optBf) { res <- optimBf(tree, data, bf = bf, inv = inv, Q = Q, w = w, g = g, INV = INV, rate = rate, k = k, llMix = llMix) if (trace > 0) cat("optimize base frequencies: ", ll, "-->", max(res[[2]], ll), "\n") if (res[[2]] > ll) { bf <- res[[1]] eig <- edQt(Q = Q, bf = bf) if (inv > 0) ll.0 <- as.matrix(INV %*% (bf * inv)) if (wMix > 0) ll.0 <- ll.0 + llMix ll <- res[[2]] } } if (optF3x4) { # <- function(tree, data, bf_codon=matrix(.25,4,3), trace=0,.n..) res <- optimF3x4(tree, data, bf_codon = bf_codon, inv = inv, Q = Q, w = w, g = g, INV = INV, rate = rate, k = k, llMix = llMix) if (trace > 0) cat("optimize base frequencies: ", ll, "-->", max(res[[2]], ll), "\n") if (res[[2]] > ll) { bf <- res[[1]] eig <- edQt(Q = Q, bf = bf) if (inv > 0) ll.0 <- as.matrix(INV %*% (bf * inv)) if (wMix > 0) ll.0 <- ll.0 + llMix ll <- res[[2]] } } if (optQ) { if (type == "CODON") { # if(is.null(model)) model <- "codon1" # model <- match.arg(model, c("codon0", "codon1", "codon2", "codon3", # "YN98")) ab <- c(tstv, dnds) res <- switch(model, YN98 = optimCodon(tree, data, Q = rep(1, 1830), subs = .sub, syn = .syn, bf = bf, w = w, g = g, inv = inv, INV = INV, ll.0 = ll.0, rate = rate, k = k, ab = log(ab), optK = TRUE, optW = TRUE), codon1 = optimCodon(tree, data, Q = rep(1, 1830), subs = .sub, syn = .syn, bf = bf, w = w, g = g, inv = inv, INV = INV, ll.0 = ll.0, rate = rate, k = k, ab = log(ab), optK = TRUE, optW = TRUE), codon2 = optimCodon(tree, data, Q = rep(1, 1830), subs = .sub, syn = .syn, bf = bf, w = w, g = g, inv = inv, INV = INV, ll.0 = ll.0, rate = rate, k = k, ab = log(ab), optK = FALSE, optW = TRUE), codon3 = optimCodon(tree, data, Q = rep(1, 1830), subs = .sub, syn = .syn, bf = bf, w = w, g = g, inv = inv, INV = INV, ll.0 = ll.0, rate = rate, k = k, ab = log(ab), optK = TRUE, optW = FALSE)) tmp <- res[[5]] m <- length(tmp) dnds <- tmp[m] if (m > 1) tstv <- tmp[1] } else res <- optimQ(tree, data, Q = Q, subs = subs, bf = bf, w = w, g = g, inv = inv, INV = INV, ll.0 = ll.0, rate = rate, k = k) Q <- res[[1]] eig <- edQt(Q = Q, bf = bf) if (trace > 0) cat("optimize rate matrix: ", ll, "-->", res[[2]], "\n") ll <- res[[2]] } if (optInv) { res <- optimInv(tree, data, inv = inv, INV = INV, Q = Q, bf = bf, eig = eig, k = k, shape = shape, rate = rate) if (trace > 0) cat("optimize invariant sites: ", ll, "-->", max(res[[2]], ll), "\n") if (res[[2]] > ll) { inv <- res[[1]] w <- rep(1 / k, k) g <- discrete.gamma(shape, k) w <- (1 - inv) * w if (wMix > 0) w <- (1 - wMix) * w g <- g / (1 - inv) g <- g * rate ll.0 <- as.matrix(INV %*% (bf * inv)) if (wMix > 0) ll.0 <- ll.0 + llMix ll <- res[[2]] } } if (optGamma) { res <- optimGamma(tree, data, shape = shape, k = k, inv = inv, INV = INV, Q = Q, bf = bf, eig = eig, ll.0 = ll.0, rate = rate) if (trace > 0) cat("optimize shape parameter: ", ll, "-->", max(res[[2]], ll), "\n") if (res[[2]] > ll) { shape <- res[[1]] w <- rep(1 / k, k) g <- discrete.gamma(shape, k) if (inv > 0) { w <- (1 - inv) * w g <- g / (1 - inv) } if (wMix > 0) w <- (1 - wMix) * w g <- g * rate ll <- res[[2]] } } if (optRate) { res <- optimRate(tree, data, rate = rate, inv = inv, INV = INV, Q = Q, bf = bf, eig = eig, k = k, shape = shape, w = w, ll.0 = ll.0) if (trace > 0) cat("optimize rate: ", ll, "-->", max(res[[2]], ll), "\n") if (res[[2]] > ll) { rate <- res[[1]] g <- discrete.gamma(shape, k) w <- rep(1 / k, k) if (inv > 0) { w <- (1 - inv) * w g <- g / (1 - inv) } if (wMix > 0) w <- (1 - wMix) * w g <- g * rate ll <- res[[2]] } } if (optEdge) { res <- optimEdge(tree, data, eig = eig, w = w, g = g, bf = bf, rate = rate, ll.0 = ll.0, control = pml.control(epsilon = 1e-08, maxit = 5, trace = trace - 1)) if (trace > 0) cat("optimize edge weights: ", ll, "-->", max(res[[2]], ll), "\n") if (res[[2]] > ll) { ll <- res[[2]] tree <- res[[1]] } } if (optRooted) { res <- optimRooted(tree, data, eig = eig, w = w, g = g, bf = bf, rate = rate, ll.0 = ll.0, INV = INV, control = pml.control(epsilon = 1e-07, maxit = 10, trace = trace - 1)) if (trace > 0) cat("optimize edge weights: ", ll, "-->", max(res[[2]], ll), "\n") if (res[[2]] > ll) { ll <- res[[2]] tree <- res[[1]] } } if (optNni) { swap <- 0 iter <- 1 while (iter < 4) { if (optEdge) { # tmp <- pml.nni.old(tree, data, w, g, eig, bf, ll.0, ll, ...) tmp <- pml.nni(tree, data, w = w, g = g, eig = eig, bf = bf, ll.0 = ll.0, ll = ll, INV = INV, ...) swap <- swap + tmp$swap res <- optimEdge(tmp$tree, data, eig = eig, w = w, g = g, bf = bf, rate = rate, ll.0 = ll.0, control = pml.control( epsilon = 1e-08, maxit = 3, trace = 0)) ll2 <- res[[2]] tree <- res[[1]] } else { tmp <- rooted.nni(tree, data, eig = eig, w = w, g = g, bf = bf, rate = rate, ll.0 = ll.0, INV = INV, ...) swap <- swap + tmp$swap res <- optimRooted(tmp$tree, data, eig = eig, w = w, g = g, bf = bf, rate = rate, ll.0 = ll.0, INV = INV, control = pml.control( epsilon = 1e-08, maxit = 5, trace = trace - 1)) tree <- tmp$tree ll2 <- tmp$logLik } if (trace > 0) cat("optimize topology: ", ll, "-->", ll2, "\n") ll <- ll2 iter <- iter + 1 if (tmp$swap == 0) { iter <- 4 } } if (trace > 0) cat(swap, "\n") if (swap > 0) rounds <- 1 if (swap == 0) optNni <- FALSE } epsR <- 1e-8 if ( (ratchet == TRUE) && (optNni == FALSE)) { maxR <- ratchet.par$iter maxit <- ratchet.par$maxit kmax <- 1 i <- 1 while (i < maxit) { tree2 <- rNNI(tree, moves = round(nTips * ratchet.par$prop), n = 1) # tree <- rSPR(tree, moves=10, k=3, n=1) swap <- 1 ll2 <- pml.fit(tree2, data, bf, shape = shape, k = k, Q = Q, levels = attr(data, "levels"), inv = inv, rate = rate, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, llMix = llMix, wMix = wMix, site = FALSE) while (swap > 0) { tmp <- pml.nni(tree2, data, w = w, g = g, eig = eig, bf = bf, ll.0 = ll.0, ll = ll2, INV = INV, ...) swap <- tmp$swap res <- optimEdge(tmp$tree, data, eig = eig, w = w, g = g, bf = bf, rate = rate, ll.0 = ll.0, control = pml.control( epsilon = 1e-08, maxit = 3, trace = 0)) if (trace > 1) cat("optimize topology: ", ll2, "-->", res[[2]], "\n", "swaps:", tmp$swap, "\n") ll2 <- res[[2]] tree2 <- res[[1]] } if (ll2 > (ll + epsR)) { tree <- tree2 ll <- ll2 kmax <- 1 } else kmax <- kmax + 1 if (trace > 0) print(paste("Ratchet iteration ", i, ", best pscore so far:", ll)) i <- i + 1 if (kmax > maxR) i <- maxit } optNni <- TRUE ratchet <- FALSE rounds <- 1 } if ((ratchet2 == TRUE) && (optNni == FALSE)) { if (optRooted) { FUN <- function(x, bf, Q, k, shape) { dm <- dist.ml(x, bf = bf, Q = Q, k = k, shape = shape) tr <- wpgma(dm) # nnls.phylo(tr, dm, TRUE) tr } } else { FUN <- function(x, bf, Q, k, shape) { dm <- dist.ml(x, bf = bf, Q = Q) tr <- fastme.bal(dm, TRUE, FALSE, FALSE) tr$edge.length[tr$edge.length < 1e-8] <- 1e-8 tr # nnls.phylo(tr, dm) } } maxR <- ratchet.par$iter maxit <- ratchet.par$maxit kmax <- 1 i <- 1 while (i < maxit) { tree2 <- bootstrap.phyDat(data, FUN, bs = 1, bf = bf, Q = Q, k = k, shape = shape)[[1]] tree2 <- checkLabels(tree2, tree$tip.label) tree2 <- reorder(tree2, "postorder") swap <- 1 ll2 <- pml.fit(tree2, data, bf, shape = shape, k = k, Q = Q, levels = attr(data, "levels"), inv = inv, rate = rate, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, llMix = llMix, wMix = wMix, site = FALSE) while (swap > 0) { tmp <- pml.nni(tree2, data, w = w, g = g, eig = eig, bf = bf, ll.0 = ll.0, ll = ll2, INV = INV, ...) swap <- tmp$swap res <- optimEdge(tmp$tree, data, eig = eig, w = w, g = g, bf = bf, rate = rate, ll.0 = ll.0, control = pml.control( epsilon = 1e-08, maxit = 3, trace = 0)) if (trace > 1) cat("optimize topology: ", ll2, "-->", res[[2]], "\n", "swaps:", tmp$swap, "\n") ll2 <- res[[2]] tree2 <- res[[1]] } if (ll2 > (ll + epsR)) { tree <- tree2 ll <- ll2 kmax <- 1 } else kmax <- kmax + 1 if (trace > 0) print(paste("Ratchet iteration ", i, ", best pscore so far:", ll)) i <- i + 1 if (kmax > maxR) i <- maxit } optNni <- TRUE ratchet2 <- FALSE rounds <- 1 } if (rounds > control$maxit) opti <- FALSE if ( ( (ll1 - ll) / ll < control$eps) && rounds > 2) # abs(ll1 - ll) opti <- FALSE rounds <- rounds + 1 ll1 <- ll } } ################################################################################ # # experimental pml.nni # ################################################################################ indexNNI3 <- function(tree) { parent <- tree$edge[, 1] child <- tree$edge[, 2] ind <- reorder(tree)$edge[, 2] nTips <- length(tree$tip.label) ind <- ind[ind > nTips] # ind <- which(child %in% parent) Nnode <- tree$Nnode # a d # \ / # e-----f c is closest to root, f is root from subtree # / \ # b c c(a,b,c,d,e,f) edgeMatrix <- matrix(0L, (Nnode - 1), 6) pvector <- integer(max(parent)) pvector[child] <- parent tips <- !logical(max(parent)) tips[parent] <- FALSE # cvector <- allCildren(tree) cvector <- vector("list", max(parent)) for (i in seq_along(parent)) cvector[[parent[i]]] <- c(cvector[[parent[i]]], child[i]) k <- 1L for (i in ind) { f <- pvector[i] # f ab <- cvector[[i]] # a,b ind1 <- cvector[[f]] # c,d cd <- ind1[ind1 != i] if (pvector[f]) cd <- c(pvector[f], cd) # cd edgeMatrix[k, 1:6] <- c(ab, cd, i, f) k <- k + 1L } edgeMatrix } # EL ausserhalb index2tree <- function(x, tree, root = length(tree$tip.label) + 1L) { EL <- numeric(max(tree$edge)) EL[tree$edge[, 2]] <- tree$edge.length pa <- c(5L, 5L, 6L, 6L, 6L) ch <- c(1L, 2L, 5L, 4L, 3L) elind <- c(1L, 2L, 5L, 4L, 6L) # raus if (x[6L] == root) el <- EL[x[ch]] else el <- EL[x[elind]] structure(list(edge = structure(c(x[pa], x[ch]), .Dim = c(5L, 2L)), edge.length = el, Nnode = 2L), .Names = c("edge", "edge.length", "Nnode"), class = "phylo", order = "postorder") } index2tree2 <- function(x, tree, root = length(tree$tip.label) + 1L) { EL <- numeric(max(tree$edge)) EL[tree$edge[, 2]] <- tree$edge.length pa <- c(6L, 6L, 5L, 5L, 5L) ch <- c(3L, 4L, 6L, 1L, 2L) elr <- c(3L, 4L, 5L, 1L, 2L) eln <- c(6L, 4L, 5L, 1L, 2L) if (x[6L] == root) el <- EL[x[elr]] else el <- EL[x[eln]] structure(list(edge = structure(c(x[pa], x[ch]), .Dim = c(5L, 2L)), edge.length = el, Nnode = 2L), .Names = c("edge", "edge.length", "Nnode"), class = "phylo", order = "postorder") } # weight, nr, nc, contrast, nco (Reihenfolge beibehalten) # INV raus # evi, eve, contrast2 ausserhalb definieren optimQuartet <- function(tree, data, eig, w, g, bf, rate, ll.0, nTips, weight, nr, nc, contrast, nco, llcomp = -Inf, control = pml.control(epsilon = 1e-08, maxit = 5, trace = 0), ...) { # if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") { # tree <- reorder(tree, "postorder") # print("reorder") # } el <- tree$edge.length tree$edge.length[el < 1e-08] <- 1e-08 oldtree <- tree k <- length(w) loglik <- pml.quartet(tree, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, nTips = nTips, weight = weight, nr = nr, nc = nc, contrast = contrast, nco = nco) start.ll <- old.ll <- new.ll <- loglik # contrast <- attr(data, "contrast") contrast2 <- contrast %*% eig[[2]] evi <- (t(eig[[3]]) * bf) # weight <- attr(data, "weight") eps <- 1 iter <- 0 child <- tree$edge[, 2] parent <- tree$edge[, 1] m <- max(tree$edge) EL <- tree$edge.length n <- length(tree$edge.length) ind.inv <- which(ll.0 > 0) # nr <- as.integer(length(weight)) # nc <- as.integer(length(bf)) # nco <- as.integer(nrow(contrast)) eve <- eig[[2]] lg <- k ScaleEPS <- 1.0 / 4294967296.0 # anc <- Ancestors(tree, 1:m, "parent") # anc0 <- as.integer(c(0L, anc)) while (eps > control$eps && iter < control$maxit) { EL <- .Call("optQrtt", as.integer(parent), as.integer(child), eig, evi, EL, w, g, as.integer(nr), as.integer(nc), as.integer(nTips), as.double(contrast), as.double(contrast2), nco, data, as.double(weight), as.double(ll.0)) iter <- iter + 1 # tree$edge.length <- EL[tree$edge[,2]] tree$edge.length <- EL # [treeP$edge[,2]] # vormals treeP newll <- pml.quartet(tree, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, nTips = nTips, weight = weight, nr = nr, nc = nc, contrast = contrast, nco = nco) eps <- (old.ll - newll) / newll if ( (eps < 0) || (newll < llcomp)) return(list(tree = oldtree, logLik = old.ll, c(eps, iter))) oldtree <- tree # vormals treeP if (control$trace > 1) cat(old.ll, " -> ", newll, "\n") old.ll <- newll # loli <- parent[1] } if (control$trace > 0) cat(start.ll, " -> ", newll, "\n") list(tree = tree, logLik = newll, c(eps, iter)) # vormals treeP } # weight, nr, nc, contrast, nco rein # inv, INV, site, ... raus # wMix, rate last pml.quartet <- function(tree, data, bf = rep(.25, 4), k = 1, rate = 1, g, w, eig, ll.0 = NULL, ind.ll0 = NULL, llMix = NULL, wMix = 0, nTips, weight, nr, nc, contrast, nco, ..., site = FALSE) { # k <- as.integer(k) # m = 1 # if(any(g<.gEps)){ # for(i in seq_along(g)){ # if(g[i]<.gEps){ # inv <- inv+w[i] # } # } # w <- w[g>.gEps] # g <- g[g>.gEps] # k <- length(w) # } # if (is.null(INV)) # INV <- Matrix(lli(data, tree), sparse=TRUE) # in C if (is.null(ll.0)) { ll.0 <- numeric(nr) } if (is.null(ind.ll0)) { ind <- which(ll.0 > 0) } else ind <- ind.ll0 # if(inv>0) # ll.0 <- as.matrix(INV %*% (bf * inv)) # if (wMix > 0) # ll.0 <- ll.0 + llMix # node <- tree$edge[, 1] # edge <- tree$edge[, 2] # root <- as.integer(node[length(node)]) # el <- as.double(tree$edge.length) node <- as.integer(tree$edge[, 1] - nTips - 1L) # min(node)) edge <- as.integer(tree$edge[, 2] - 1L) # contrast = attr(data, "contrast") # nco = as.integer(dim(contrast)[1]) # dlist=data, nr, nc, weight, k ausserhalb definieren # pmlPart einbeziehen siteLik <- .Call("PML4", dlist = data, as.double(tree$edge.length), as.double(w), as.double(g), nr, nc, as.integer(k), eig, as.double(bf), node, edge, nTips, nco, contrast, N = as.integer(length(edge))) # in C if (!is.null(ll.0)) siteLik[ind] <- log(exp(siteLik[ind]) + ll.0[ind]) if (wMix > 0) siteLik <- log(exp(siteLik) * (1 - wMix) + llMix) loglik <- sum(weight * siteLik) return(loglik) } index2edge <- function(x, root) { ch <- c(1L, 2L, 5L, 4L, 3L) elind <- c(1L, 2L, 5L, 4L, 6L) if (x[6L] == root) el <- x[ch] else el <- x[elind] el } pml.nni <- function(tree, data, w, g, eig, bf, ll.0, ll, INV = INV, ...) { k <- length(w) INDEX <- indexNNI3(tree) tmpl <- pml.fit4(tree, data, bf = bf, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, k = k, ...) nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) weight <- as.numeric(attr(data, "weight")) contrast <- attr(data, "contrast") nco <- as.integer(dim(contrast)[1]) contrast2 <- contrast %*% eig[[2]] evi <- (t(eig[[3]]) * bf) nTips <- as.integer(length(tree$tip.label)) m <- dim(INDEX)[1] loglik <- numeric(2 * m) edgeMatrix <- matrix(0L, 2 * m, 5) anc <- Ancestors(tree, 1:max(tree$edge), "parent") loli <- getRoot(tree) ind1 <- c(1L, 4L, 3L, 2L, 5L) # ind2 <- c(4L, 2L, 3L, 1L, 5L) # for (i in 1:m) { ei <- INDEX[i, ] tree0 <- index2tree(INDEX[i, ], tree, nTips + 1L) ch <- ei[5] pa <- ei[6] # move up while (pa != loli) { tmpr <- match(loli, INDEX[, 5]) treetmp <- index2tree(INDEX[tmpr, ], tree, nTips + 1L) tmpl <- pml.quartet(treetmp, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, nTips = nTips, weight = weight, nr = nr, nc = nc, contrast = contrast, nco = nco) loli <- anc[loli] } llt0 <- pml.quartet(tree0, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, nTips = nTips, weight = weight, nr = nr, nc = nc, contrast = contrast, nco = nco) # new0 <- optimQuartet(tree0, data, eig=eig, w=w, g=g, bf=bf, # rate=rate, ll.0=ll.0, nTips=nTips, # weight=weight, nr=nr, nc=nc, contrast=contrast, nco=nco, # control = list(epsilon = 1e-08, maxit = 3, trace=0)) tree2 <- tree1 <- tree0 tree1$edge[, 2] <- tree1$edge[ind1, 2] tree1$edge.length <- tree1$edge.length[ind1] tree2$edge[, 2] <- tree2$edge[ind2, 2] tree2$edge.length <- tree2$edge.length[ind2] new1 <- optimQuartet(tree1, data, eig = eig, w = w, g = g, bf = bf, ll.0 = ll.0, nTips = nTips, weight = weight, nr = nr, nc = nc, contrast = contrast, nco = nco, llcomp = ll + 1e-8, ...) # new0$logLik+1e-8) new2 <- optimQuartet(tree2, data, eig = eig, w = w, g = g, bf = bf, ll.0 = ll.0, nTips = nTips, weight = weight, nr = nr, nc = nc, contrast = contrast, nco = nco, llcomp = ll + 1e-8, ...) # new0$logLik+1e-8) loglik[(2 * i) - 1] <- new1$logLik loglik[(2 * i)] <- new2$logLik edgeMatrix[(2 * i) - 1, ] <- new1$tree$edge.length edgeMatrix[(2 * i), ] <- new2$tree$edge.length # godown or recompute if (any (INDEX[i, c(1, 2)] > nTips)) { tree00 <- index2tree2(INDEX[i, ], tree, nTips + 1L) tmp3 <- pml.quartet(tree00, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, nTips = nTips, weight = weight, nr = nr, nc = nc, contrast = contrast, nco = nco) loli <- getRoot(tree00) } else tmp3 <- pml.quartet(tree0, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, nTips = nTips, weight = weight, nr = nr, nc = nc, contrast = contrast, nco = nco) } swap <- 0 eps0 <- 1e-6 candidates <- loglik > ll + eps0 # cat("candidates", sum(candidates), "\n") INDEX2 <- t(apply(INDEX, 1, index2edge, root = getRoot(tree))) while (any(candidates)) { ind <- which.max(loglik) loglik[ind] <- -Inf if (ind %% 2) swap.edge <- c(2, 4) else swap.edge <- c(1, 4) IND <- index2edge(INDEX[(ind + 1) %/% 2, ], nTips + 1L) treeT <- changeEdge(tree, IND[swap.edge], IND, edgeMatrix[ind, ]) test <- pml.fit4(treeT, data, bf = bf, k = k, g = g, w = w, eig = eig, ll.0 = ll.0, INV = INV, ...) if (test <= ll + eps0) candidates[ind] <- FALSE if (test > ll + eps0) { ll <- test swap <- swap + 1 tree <- treeT indi <- which(rep(colSums(apply(INDEX, 1, match, INDEX[(ind + 1) %/% 2, ], nomatch = 0)) > 0, each = 2)) candidates[indi] <- FALSE loglik[indi] <- -Inf } } # trees <- vector("list", 2*m) # for(i in seq_along(loglik)){ # ind = i # if( ind %% 2 ) swap.edge = c(2,4) # else swap.edge = c(1,4) # IND = index2edge(INDEX[(ind+1)%/%2,]) # tree2 <- try(changeEdge(tree, IND[swap.edge], IND, # edgeMatrix[ind,]) ) # trees[[i]] <- tree2 # } # class(trees) <- "multiPhylo" # trees <- .compressTipLabel(trees) # , all=loglik list(tree = tree, loglik = ll, swap = swap, candidates = candidates) } phangorn/R/RcppExports.R0000644000176200001440000000165313502203644014707 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 allDescCPP <- function(orig, nTips) { .Call(`_phangorn_allDescCPP`, orig, nTips) } bipartCPP <- function(orig, nTips) { .Call(`_phangorn_bipartCPP`, orig, nTips) } bipCPP <- function(orig, nTips) { .Call(`_phangorn_bipCPP`, orig, nTips) } allChildrenCPP <- function(orig) { .Call(`_phangorn_allChildrenCPP`, orig) } p2dna <- function(xx, eps = 0.999) { .Call(`_phangorn_p2dna`, xx, eps) } node_height_cpp <- function(edge1, edge2, edge_length) { .Call(`_phangorn_node_height_cpp`, edge1, edge2, edge_length) } cophenetic_cpp <- function(edge, edge_length, nTips, nNode) { .Call(`_phangorn_cophenetic_cpp`, edge, edge_length, nTips, nNode) } #' @rdname phangorn-internal #' @export threshStateC <- function(x, thresholds) { .Call(`_phangorn_threshStateC`, x, thresholds) } phangorn/R/neighborNet.R0000644000176200001440000002241413501231606014656 0ustar liggesusersdistC <- function(d, CL) { l <- length(CL) res <- matrix(0, l, l) for (i in 1:(l - 1)) { for (j in (i + 1):l) res[i, j] <- mean.default(d[CL[[i]], CL[[j]]]) } res + t(res) } updateDM <- function(DM, d, CL, j) { l <- length(CL) for (i in 1:l) { DM[i, j] <- DM[j, i] <- mean.default(d[CL[[i]], CL[[j]]]) } DM[j, j] <- 0 DM } Rx <- function(d, x, CL) { lx <- length(x) res <- numeric(lx) lC <- length(CL) for (i in 1:lx) { xi <- x[i] tmp <- 0 for (j in 1:lx) { if (j != i) tmp <- tmp + d[xi, x[j]] } if (lC > 0) { for (j in 1:lC) { tmp <- tmp + mean.default(d[xi, CL[[j]]]) } } res[i] <- tmp } res } reduc <- function(d, x, y, z) { u <- 2 / 3 * d[x, ] + d[y, ] / 3 v <- 2 / 3 * d[z, ] + d[y, ] / 3 uv <- (d[x, y] + d[x, z] + d[y, z]) / 3 d[x, ] <- u d[, x] <- u d[z, ] <- v d[, z] <- v d[y, ] <- 0 d[, y] <- 0 d[x, z] <- d[z, x] <- uv d[x, x] <- d[z, z] <- 0 # diag(d) <- 0 d } # computes ordering getOrderingNN <- function(x) { x <- as.matrix(x) labels <- attr(x, "Labels") if (is.null(labels)) labels <- colnames(x) d <- x # as.matrix(x) l <- dim(d)[1] CL <- vector("list", l) CL[1:l] <- ORD <- 1:l lCL <- length(CL) ord <- CL DM <- DM_C <- DM_V <- d while (lCL > 1) { i <- 0 j <- 0 DM <- distC(d, CL) l <- nrow(DM) if (l > 2) { r <- rowSums(DM) / (l - 2) tmp <- .C("out", as.double(DM), as.double(r), as.integer(l), as.integer(i), as.integer(j), PACKAGE = "phangorn") e1 <- tmp[[4]] e2 <- tmp[[5]] } else { e1 <- 1 e2 <- 2 } n1 <- length(CL[[e1]]) n2 <- length(CL[[e2]]) if (n1 == 1 & n2 == 1) { newCL <- c(CL[[e1]], CL[[e2]]) newOrd <- newCL CL <- c(CL[-c(e1, e2)], list(newCL)) ord <- c(ord[-c(e1, e2)], list(newCL)) lCL <- lCL - 1L } else { CLtmp <- c(as.list(CL[[e1]]), as.list(CL[[e2]]), CL[-c(e1, e2)]) ltmp <- length(CLtmp) DM2 <- distC(d, CLtmp) if (ltmp > 2) rtmp <- rowSums(DM2) / (ltmp - 2) DM2 <- DM2 - outer(rtmp, rtmp, "+") # compute only this TMP <- DM2[1:n1, (n1 + 1):(n1 + n2)] blub <- which.min(TMP) # print("blub") if (n1 == 2 & n2 == 1) { if (blub == 2) { newCL <- c(CL[[e1]][1], CL[[e2]]) newOrd <- c(ord[[e1]], ord[[e2]]) d <- reduc(d, CL[[e1]][1], CL[[e1]][2], CL[[e2]]) } else { newCL <- c(CL[[e2]], CL[[e1]][2]) newOrd <- c(ord[[e2]], ord[[e1]]) d <- reduc(d, CL[[e2]], CL[[e1]][1], CL[[e1]][2]) } } if (n1 == 1 & n2 == 2) { if (blub == 1) { newCL <- c(CL[[e1]], CL[[e2]][2]) newOrd <- c(ord[[e1]], ord[[e2]]) d <- reduc(d, CL[[e1]], CL[[e2]][1], CL[[e2]][2]) } else { newCL <- c(CL[[e2]][1], CL[[e1]]) newOrd <- c(ord[[e2]], ord[[e1]]) d <- reduc(d, CL[[e2]][1], CL[[e2]][2], CL[[e1]]) } } if (n1 == 2 & n2 == 2) { if (blub == 1) { newCL <- c(CL[[e1]][2], CL[[e2]][2]) newOrd <- c(rev(ord[[e1]]), ord[[e2]]) d <- reduc(d, CL[[e1]][2], CL[[e1]][1], CL[[e2]][1]) d <- reduc(d, CL[[e1]][2], CL[[e2]][1], CL[[e2]][2]) } if (blub == 2) { newCL <- c(CL[[e1]][1], CL[[e2]][2]) newOrd <- c(ord[[e1]], ord[[e2]]) d <- reduc(d, CL[[e1]][1], CL[[e1]][2], CL[[e2]][1]) d <- reduc(d, CL[[e1]][1], CL[[e2]][1], CL[[e2]][2]) } if (blub == 3) { newCL <- c(CL[[e1]][2], CL[[e2]][1]) newOrd <- c(rev(ord[[e1]]), rev(ord[[e2]])) d <- reduc(d, CL[[e1]][2], CL[[e1]][1], CL[[e2]][2]) d <- reduc(d, CL[[e1]][2], CL[[e2]][2], CL[[e2]][1]) } if (blub == 4) { newCL <- c(CL[[e1]][1], CL[[e2]][1]) newOrd <- c(ord[[e1]], rev(ord[[e2]])) d <- reduc(d, CL[[e1]][1], CL[[e1]][2], CL[[e2]][2]) d <- reduc(d, CL[[e1]][1], CL[[e2]][2], CL[[e2]][1]) } } CL <- c(CL[-c(e1, e2)], list(newCL)) ord <- c(ord[-c(e1, e2)], list(newOrd)) lCL <- lCL - 1L } } newOrd } # computes ordering O(n^2) statt O(n^3) !!! # needs debugging getOrderingNN2 <- function(x) { x <- as.matrix(x) labels <- attr(x, "Labels") if (is.null(labels)) labels <- colnames(x) d <- x # as.matrix(x) l <- dim(d)[1] CL <- vector("list", l) CL[] <- seq_len(l) lCL <- length(CL) ord <- CL # DM_C connected components, DM_V vertices DM_C <- DM_V <- DM <- d z <- 0 while (lCL > 1) { i <- 0 j <- 0 z <- z + 1 l <- nrow(DM) # compute Q_D from D_C if (l > 2) { r <- rowSums(DM) / (l - 2) tmp <- .C("out", as.double(DM), as.double(r), as.integer(l), as.integer(i), as.integer(j), PACKAGE = "phangorn") e1 <- tmp[[4]] e2 <- tmp[[5]] } else { e1 <- 1 e2 <- 2 } n1 <- length(CL[[e1]]) n2 <- length(CL[[e2]]) if (n1 == 1 & n2 == 1) { # add edge newCL <- c(CL[[e1]], CL[[e2]]) newOrd <- newCL CL[[e1]] <- newCL # update DM_C DM <- updateDM(DM, d, CL, e1) DM <- DM[-e2, -e2, drop = FALSE] CL <- CL[-e2] ord[[e1]] <- newCL ord <- ord[-e2] lCL <- lCL - 1L } else { CLtmp <- c(as.list(CL[[e1]]), as.list(CL[[e2]]), CL[-c(e1, e2)]) ltmp <- length(CLtmp) CLtmp2 <- c(CL[[e1]], CL[[e2]]) rtmp2 <- Rx(d, CLtmp2, CL[-c(e1, e2)]) if (ltmp > 2) rtmp2 <- rtmp2 / (ltmp - 2) DM3 <- d[CLtmp2, CLtmp2] - outer(rtmp2, rtmp2, "+") TMP2 <- DM3[1:n1, (n1 + 1):(n1 + n2)] blub <- which.min(TMP2) if (n1 == 2 & n2 == 1) { if (blub == 2) { newCL <- c(CL[[e1]][1], CL[[e2]]) newOrd <- c(ord[[e1]], ord[[e2]]) d <- reduc(d, CL[[e1]][1], CL[[e1]][2], CL[[e2]]) } else { newCL <- c(CL[[e2]], CL[[e1]][2]) newOrd <- c(ord[[e2]], ord[[e1]]) d <- reduc(d, CL[[e2]], CL[[e1]][1], CL[[e1]][2]) } } if (n1 == 1 & n2 == 2) { if (blub == 1) { newCL <- c(CL[[e1]], CL[[e2]][2]) newOrd <- c(ord[[e1]], ord[[e2]]) d <- reduc(d, CL[[e1]], CL[[e2]][1], CL[[e2]][2]) } else { newCL <- c(CL[[e2]][1], CL[[e1]]) newOrd <- c(ord[[e2]], ord[[e1]]) d <- reduc(d, CL[[e2]][1], CL[[e2]][2], CL[[e1]]) } } if (n1 == 2 & n2 == 2) { if (blub == 1) { newCL <- c(CL[[e1]][2], CL[[e2]][2]) newOrd <- c(rev(ord[[e1]]), ord[[e2]]) d <- reduc(d, CL[[e1]][2], CL[[e1]][1], CL[[e2]][1]) d <- reduc(d, CL[[e1]][2], CL[[e2]][1], CL[[e2]][2]) } if (blub == 2) { newCL <- c(CL[[e1]][1], CL[[e2]][2]) newOrd <- c(ord[[e1]], ord[[e2]]) d <- reduc(d, CL[[e1]][1], CL[[e1]][2], CL[[e2]][1]) d <- reduc(d, CL[[e1]][1], CL[[e2]][1], CL[[e2]][2]) } if (blub == 3) { newCL <- c(CL[[e1]][2], CL[[e2]][1]) newOrd <- c(rev(ord[[e1]]), rev(ord[[e2]])) d <- reduc(d, CL[[e1]][2], CL[[e1]][1], CL[[e2]][2]) d <- reduc(d, CL[[e1]][2], CL[[e2]][2], CL[[e2]][1]) } if (blub == 4) { newCL <- c(CL[[e1]][1], CL[[e2]][1]) newOrd <- c(ord[[e1]], rev(ord[[e2]])) d <- reduc(d, CL[[e1]][1], CL[[e1]][2], CL[[e2]][2]) d <- reduc(d, CL[[e1]][1], CL[[e2]][2], CL[[e2]][1]) } } ord[[e1]] <- newOrd ord <- ord[-e2] CL[[e1]] <- newCL DM <- updateDM(DM, d, CL, e1) DM <- DM[-e2, -e2, drop = FALSE] CL <- CL[-e2] lCL <- lCL - 1L } } newOrd } #' Computes a neighborNet from a distance matrix #' #' Computes a neighborNet, i.e. an object of class \code{networx} from a #' distance matrix. #' #' \code{neighborNet} is still experimental. The cyclic ordering sometimes #' differ from the SplitsTree implementation, the \emph{ord} argument can be #' used to enforce a certain circular ordering. #' #' @param x a distance matrix. #' @param ord a circular ordering. #' @return \code{neighborNet} returns an object of class networx. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{splitsNetwork}}, \code{\link{consensusNet}}, #' \code{\link{plot.networx}}, \code{\link{lento}}, #' \code{\link{cophenetic.networx}}, \code{\link{distanceHadamard}} #' @references Bryant, D. & Moulton, V. (2004) Neighbor-Net: An Agglomerative #' Method for the Construction of Phylogenetic Networks. \emph{Molecular #' Biology and Evolution}, 2004, \bold{21}, 255-265 #' @keywords hplot #' @examples #' #' data(yeast) #' dm <- dist.ml(yeast) #' nnet <- neighborNet(dm) #' plot(nnet, "2D") #' #' @export neighborNet neighborNet <- function(x, ord = NULL) { x <- as.matrix(x) labels <- attr(x, "Labels")[[1]] if (is.null(labels)) labels <- colnames(x) l <- length(labels) if (is.null(ord)) ord <- getOrderingNN(x) spl <- allCircularSplits(l, labels[ord]) spl <- nnls.splits(spl, x) # nnls.split mit nnls statt quadprog attr(spl, "cycle") <- 1:l as.networx(spl) } removeNonsense <- function(obj) { nTips <- length(attr(obj, "label")) l <- lengths(obj) ind <- which( (l == 0L) | (l == nTips)) obj <- obj[-ind] } phangorn/R/Densi.R0000644000176200001440000002326513475602650013474 0ustar liggesusersgetAges <- function(x) { fun <- function(x) max(node.depth.edgelength(x)) height <- NULL if (inherits(x, "phylo")) height <- fun(x) if (inherits(x, "multiPhylo")) { if (!is.null(attr(x, "TipLabel"))) { x <- .uncompressTipLabel(x) x <- unclass(x) height <- vapply(x, fun, 0) } else { x <- unclass(x) height <- vapply(x, fun, 0) } } height } add_tiplabels <- function(xy, tip.label, direction, adj, font, srt = 0, cex = 1, col = 1, label.offset = 0) { direction <- match.arg(direction, c("rightwards", "leftwards", "upwards", "downwards")) horizontal <- direction %in% c("rightwards", "leftwards") nTips <- length(tip.label) xx <- rep(1, nrow(xy)) yy <- xy[, 2 ] if (direction == "leftwards" | direction == "downwards") xx <- xx * 0 if (!horizontal) { # tmp <- yy yy <- xx xx <- xy[, 1] } MAXSTRING <- max(strwidth(tip.label, cex = cex)) loy <- 0 if (direction == "rightwards") lox <- label.offset + MAXSTRING * 1.05 * adj if (direction == "leftwards") lox <- -label.offset - MAXSTRING * 1.05 * (1 - adj) if (!horizontal) { psr <- par("usr") MAXSTRING <- MAXSTRING * 1.09 * (psr[4] - psr[3]) / (psr[2] - psr[1]) loy <- label.offset + MAXSTRING * 1.05 * adj lox <- 0 srt <- 90 + srt if (direction == "downwards") { loy <- -loy srt <- 180 + srt } } text(xx[1:nTips] + lox, yy[1:nTips] + loy, tip.label, adj = adj, font = font, srt = srt, cex = cex, col = col) } #' Plots a densiTree. #' #' An R function to plot trees similar to those produced by DensiTree. #' #' If no consensus tree is provided \code{densiTree} computes a consensus tree, #' and if the input trees have different labels a mrp.supertree as a backbone. #' This should avoid too many unnecessary crossings of edges. #' Trees should be rooted, other wise the output may not be visually pleasing. #' \code{jitter} shifts trees a bit so that they are not exactly on top of each other. #' If \code{amount == 0}, it is ignored. If \code{random=TRUE} the result of the perputation is #' \code{runif(n, -amount, amount)}, otherwise \code{seq(-amount, amount, length=n)}, where \code{n <- length(x)}. #' @param x an object of class \code{multiPhylo}. #' @param type a character string specifying the type of phylogeny, so far #' "cladogram" (default) or "phylogram" are supported. #' @param alpha parameter for semi-transparent colors. #' @param consensus A tree or character vector which is used to define the order #' of the tip labels. #' @param direction a character string specifying the direction of the tree. #' Four values are possible: "rightwards" (the default), "leftwards", "upwards", #' and "downwards". #' @param optim not yet used. #' @param scaleX scale trees to have identical heights. #' @param col a skalar or vector giving the colours used to draw the edges for #' each plotted phylogeny. These are taken to be in the same order than input #' trees x. If fewer colours are given than the number of trees, then the #' colours are recycled. #' @param width edge width. #' @param lty line type. #' @param cex a numeric value giving the factor scaling of the tip labels. #' @param font an integer specifying the type of font for the labels: 1 (plain text), #' 2 (bold), 3 (italic, the default), or 4 (bold italic). #' @param tip.color color of the tip labels. #' @param adj a numeric specifying the justification of the text strings of the #' labels: 0 (left-justification), 0.5 (centering), or 1 (right-justification). #' @param srt a numeric giving how much the labels are rotated in degrees. #' @param underscore a logical specifying whether the underscores in tip labels #' should be written as spaces (the default) or left as are (if TRUE). #' @param label.offset a numeric giving the space between the nodes and the tips of the #' phylogeny and their corresponding labels. #' @param scale.bar a logical specifying whether add scale.bar to the plot. #' @param jitter allows to shift treees. a list with two arguments: the amount of #' jitter and random or equally spaced (see details below) #' @param \dots further arguments to be passed to plot. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{plot.phylo}}, \code{\link{plot.networx}}, \code{\link{jitter}} #' @references densiTree is inspired from the great #' \href{https://www.cs.auckland.ac.nz/~remco/DensiTree}{DensiTree} program of Remco #' Bouckaert. #' #' Remco R. Bouckaert (2010) DensiTree: making sense of sets of phylogenetic #' trees \emph{Bioinformatics}, \bold{26 (10)}, 1372-1373. #' @keywords plot #' @examples #' #' data(Laurasiatherian) #' set.seed(1) #' bs <- bootstrap.phyDat(Laurasiatherian, FUN = #' function(x) upgma(dist.hamming(x)), bs=25) #' # cladogram nice to show topological differences #' densiTree(bs, type="cladogram", col="blue") #' densiTree(bs, type="phylogram", col="green", direction="downwards", width=2) #' # plot five trees slightly shifted, no transparent color #' densiTree(bs[1:5], type="phylogram", col=1:5, width=2, jitter= #' list(amount=.3, random=FALSE), alpha=1) #' \dontrun{ #' # phylograms are nice to show different age estimates #' require(PhyloOrchard) #' data(BinindaEmondsEtAl2007) #' BinindaEmondsEtAl2007 <- .compressTipLabel(BinindaEmondsEtAl2007) #' densiTree(BinindaEmondsEtAl2007, type="phylogram", col="red") #' } #' #' @export densiTree <- function(x, type = "cladogram", alpha = 1 / length(x), consensus = NULL, direction = "rightwards", optim = FALSE, scaleX = FALSE, col = 1, width = 1, lty = 1, cex = .8, font = 3, tip.color = 1, adj = 0, srt = 0, underscore = FALSE, label.offset = 0, scale.bar = TRUE, jitter = list(amount = 0, random = TRUE), ...) { if (!inherits(x, "multiPhylo")) stop("x must be of class multiPhylo") if (is.character(consensus)) { consensus <- stree(length(consensus), tip.label = consensus) consensus$edge.length <- rep(1.0, nrow(consensus$edge)) } if (is.null(consensus)) { consensus <- tryCatch(consensus(x, p = .5), error = function(e) unroot(midpoint(superTree(x)))) } if (inherits(consensus, "multiPhylo")) consensus <- consensus[[1]] sort_tips <- function(x) { x <- reorder(x) nTip <- as.integer(length(x$tip.label)) e2 <- x$edge[, 2] x$tip.label <- x$tip.label[e2[e2 <= nTip]] x$edge[e2 <= nTip, 2] <- as.integer(1L:nTip) x } type <- match.arg(type, c("phylogram", "cladogram")) direction <- match.arg(direction, c("rightwards", "leftwards", "upwards", "downwards")) horizontal <- direction %in% c("rightwards", "leftwards") consensus <- reorder(consensus) nTip <- as.integer(length(consensus$tip.label)) consensus <- sort_tips(consensus) consensus <- reorder(consensus, "postorder") maxBT <- max(getAges(x)) if (scaleX) maxBT <- 1.0 label <- rev(pretty(c(maxBT, 0))) maxBT <- max(label) xy <- plotPhyloCoor(consensus, direction = direction, ...) yy <- xy[, 2] plot.new() tl <- which.max(nchar(consensus$tip.label)) sw <- strwidth(consensus$tip.label[tl], cex = cex) * 1.1 if (direction == "rightwards") { plot.window(xlim = c(0, 1.0 + sw), ylim = c(0, nTip + 1)) if (scale.bar) axis(side = 1, at = seq(0, 1.0, length.out = length(label)), labels = label) } if (direction == "leftwards") { plot.window(xlim = c(0 - sw, 1.0), ylim = c(0, nTip + 1)) if (scale.bar) axis(side = 1, at = seq(0, 1.0, length.out = length(label)), labels = rev(label)) } if (direction == "downwards") { plot.window(xlim = c(0, nTip + 1), ylim = c(0 - sw, 1.0)) if (scale.bar) axis(side = 2, at = seq(0, 1.0, length.out = length(label)), labels = rev(label)) } if (direction == "upwards") { plot.window(xlim = c(0, nTip + 1), ylim = c(0, 1.0 + sw)) if (scale.bar) axis(side = 2, at = seq(0, 1.0, length.out = length(label)), labels = label) } tip_labels <- consensus$tip.label if (is.expression(consensus$tip.label)) underscore <- TRUE if (!underscore) tip_labels <- gsub("_", " ", tip_labels) add_tiplabels(xy, tip_labels, direction, adj = adj, font = font, srt = srt, cex = cex, col = tip.color, label.offset = label.offset) col <- rep(col, length.out = length(x)) tiporder <- 1:nTip names(tiporder) <- consensus$tip.label if (jitter$amount > 0) { if (jitter$random) jit <- runif(length(x), -jitter$amount, jitter$amount) else jit <- seq(-jitter$amount, jitter$amount, length = length(x)) } for (treeindex in seq_along(x)) { tmp <- reorder(x[[treeindex]]) tmp <- sort_tips(tmp) # if(!compressed) tiporder <- match(tmp$tip.label, consensus$tip.label) xy <- plotPhyloCoor(tmp, tip.height = tiporder, direction = direction, ...) xx <- xy[, 1] yy <- xy[, 2] if (horizontal) { if (scaleX) xx <- xx / max(xx) else xx <- xx / maxBT if (direction == "rightwards") xx <- xx + (1.0 - max(xx)) if (jitter$amount > 0) yy <- yy + jit[treeindex] } else { if (scaleX) yy <- yy / max(yy) else yy <- yy / maxBT if (direction == "upwards") yy <- yy + (1.0 - max(yy)) if (jitter$amount > 0) xx <- xx + jit[treeindex] } e1 <- tmp$edge[, 1] if (type == "cladogram") cladogram.plot(tmp$edge, xx, yy, edge.color = adjustcolor(col[treeindex], alpha.f = alpha), edge.width = width, edge.lty = lty) if (type == "phylogram") { Ntip <- min(e1) - 1L Nnode <- tmp$Nnode phylogram.plot(tmp$edge, Ntip, Nnode, xx, yy, horizontal, edge.color = adjustcolor(col[treeindex], alpha.f = alpha), edge.width = width, edge.lty = lty) } } } phangorn/R/networx.R0000644000176200001440000011670213501230754014127 0ustar liggesusers#' @rdname as.splits #' @export allSplits <- function(k, labels = NULL) { result <- lapply(1:(2^(k - 1) - 1), dec2Bin) if (is.null(labels)) labels <- (as.character(1:k)) attr(result, "labels") <- labels class(result) <- "splits" result } #' @rdname as.splits #' @export allCircularSplits <- function(k, labels = NULL) { fun <- function(x, y) { tmp <- (1L:y) + x tmp %% (k + 1L) + tmp %/% (k + 1L) } k <- as.integer(k) l <- (k - 1L) %/% 2L res <- vector("list", k * (k - 1L) / 2) res[1:k] <- 1L:k ind <- k if (k > 3) { if (k > 4L) { for (i in 2:l) { res[(ind + 1):(ind + k)] <- lapply(0L:(k - 1L), fun, i) ind <- ind + k } } if ( (k %% 2L) == 0) { m <- k %/% 2 res[(ind + 1):(ind + m)] <- lapply(0L:(m - 1L), fun, m) } } if (is.null(labels)) labels <- as.character(1:k) attr(res, "labels") <- labels attr(res, "cycle") <- 1:k class(res) <- "splits" res } getIndex <- function(left, right, n) { if (n < max(left) | n < max(right)) stop("Error") left <- as.integer(left) right <- as.integer(right) ll <- length(left) lr <- length(right) .C("giveIndex", left, right, ll, lr, as.integer(n), integer(ll * lr))[[6]] + 1 } splits2design <- function(obj, weight = NULL) { labels <- attr(obj, "labels") m <- length(labels) n <- length(obj) l <- 1:m sl <- lengths(obj) p0 <- sl * (m - sl) p <- c(0, cumsum(p0)) i <- numeric(max(p)) for (k in 1:n) { sp <- obj[[k]] if (p0[k] != 0) i[(p[k] + 1):p[k + 1]] <- getIndex(sp, l[-sp], m) } dims <- c(m * (m - 1) / 2, n) sparseMatrix(i = i, p = p, x = 1.0, dims = dims) } hC <- function(g, set) { intersec <- NULL allEdges <- NULL fromTo <- set l <- length(set) sptmp <- shortest_paths(g, fromTo[l], fromTo[1], output = c("epath"))$epath[[1]] sptmp <- as.vector(sptmp) allEdges <- sptmp for (i in 2:length(set)) { sptmp <- shortest_paths(g, fromTo[i - 1], fromTo[i], output = c("epath"))$epath[[1]] sptmp <- as.vector(sptmp) intersec <- c(intersec, intersect(allEdges, sptmp)) allEdges <- c(allEdges, sptmp) } # allEdges = unique(allEdges) list(allEdges, unique(allEdges), intersec) } addEdge <- function(network, desc, spl) { edge <- network$edge parent <- edge[, 1] child <- edge[, 2] nTips <- length(network$tip.label) desc2 <- SHORTwise(desc, nTips) split <- desc2[spl] index <- network$splitIndex ind <- which(compatible2(split, desc2[index]) == 1) if (is.null(ind) | (length(ind) == 0)) return(network) add <- TRUE X <- as.matrix(desc2) rsX <- rowSums(X) z <- X %*% X[spl, ] v <- which((rsX == z)[index] == TRUE) # intersection of shortest pathes of both partitions # best with similar to circNetwork with shortest_paths while (add) { tmp <- ind for (i in ind) { tmp2 <- which(compatible2(desc2[index][i], desc2[index]) == 1) tmp <- union(tmp, tmp2) } if (identical(ind, tmp)) { ind <- tmp add <- FALSE } ind <- tmp } g <- graph(t(network$edge[ind, ]), directed = FALSE) dec <- decompose(g, min.vertices = 2) # fromTo <- sort(match(split[[1]], attr(desc, "cycle"))) # sptmp = shortest_paths(g, fromTo[i-1], fromTo[i], # output=c("epath"))$epath[[1]] # sp2 = c(sp2, sptmp[-c(1, length(sptmp))]) # sp0 = c(sp0, sptmp) oldNodes <- unique(as.vector(edge[ind, ])) mNodes <- max(network$edge) newNodes <- (mNodes + 1L):(mNodes + length(oldNodes)) # duplicated splits dSpl <- edge[ind, ] edge2 <- edge[v, ] for (i in seq_along(oldNodes)) { edge2[edge2 == oldNodes[i]] <- newNodes[i] } edge[v, ] <- edge2 # alle Splits verdoppeln for (i in seq_along(oldNodes)) dSpl[dSpl == oldNodes[i]] <- newNodes[i] edge <- rbind(edge, dSpl, deparse.level = 0) # experimental: no labels index <- c(index, index[ind]) # neu zu alt verbinden edge <- rbind(edge, cbind(oldNodes, newNodes), deparse.level = 0) index <- c(index, rep(spl, length(oldNodes))) network$edge <- edge network$Nnode <- max(edge) - nTips network$splitIndex <- index network } ## as.splits.phylo circNetwork <- function(x, ord = NULL) { if (is.null(ord)) ord <- attr(x, "cycle") weight <- attr(x, "weights") if (is.null(weight)) weight <- rep(1, length(x)) nTips <- length(ord) tmp <- which(ord == 1) if (tmp != 1) ord <- c(ord[tmp:nTips], ord[1:(tmp - 1)]) res <- stree(nTips, tip.label = attr(x, "labels")) res$edge[, 2] <- ord res$edge.length <- NULL x <- SHORTwise(x, nTips) spRes <- as.splits(res)[res$edge[, 2]] index <- match(spRes, x) if (any(is.na(index))) { l.na <- sum(is.na(index)) x <- c(x, spRes[is.na(index)]) weight <- c(weight, rep(0, l.na)) index <- match(spRes, x) } l <- lengths(oneWise(x, nTips)) l2 <- lengths(x) # dm <- as.matrix(compatible2(x)) tmp <- countCycles(x, ord = ord) ind <- which(tmp == 2 & l2 > 1) # & l X[k, j]) { Vstop <- ord[j - 1] ordStop <- j - 1 } } fromTo <- ordStart:ordStop if (ordStart > ordStop) fromTo <- c(ordStart:nTips, 1:ordStop) fromTo <- ord[fromTo] g <- graph(t(res$edge), directed = FALSE) isChild <- (rsY == (Y %*% X[k, ]))[index] sp2 <- NULL sp0 <- NULL for (i in 2:length(fromTo)) { sptmp <- shortest_paths(g, fromTo[i - 1], fromTo[i], output = c("epath"))$epath[[1]] sp2 <- c(sp2, sptmp[-c(1, length(sptmp))]) sp0 <- c(sp0, sptmp) } sp0 <- unique(sp0) if (length(sp2) > 0) { # blub = which(dm[index[sp2], ind[k]]>0) TMP <- rowSums(dm2[index[sp2], 1:k, drop = FALSE]) blub <- which(TMP > 0) sp2 <- sp2[blub] } if (length(sp2) == 0) { isChild <- (rsY == (Y %*% X[k, ]))[index] sp0 <- which(isChild == TRUE) edge1 <- unique(as.vector(res$edge[sp0, ])) edge2 <- as.vector(res$edge[-sp0, ]) asdf <- edge1 %in% edge2 sp <- edge1[asdf] } if (length(sp2) > 0) sp <- unique(as.vector(t(res$edge[sp2, ]))) parent <- res$edge[, 1] child <- res$edge[, 2] j <- ord[which(X[k, ] == 1)] anc <- unique(parent[match(j, child)]) maxVert <- max(parent) l <- length(sp) newVert <- (maxVert + 1):(maxVert + l) sp01 <- setdiff(sp0, sp2) for (i in 1:l) res$edge[sp01, ][res$edge[sp01, ] == sp[i]] <- newVert[i] newindex <- rep(ind[k], l) if (length(sp) > 1) newindex <- c(index[sp2], newindex) index <- c(index, newindex) # connect new and old vertices newEdge <- matrix(cbind(sp, newVert), ncol = 2) if (length(sp) > 1) { # copy edges qwer <- match(as.vector(res$edge[sp2, ]), sp) newEdge <- rbind(matrix(newVert[qwer], ncol = 2), newEdge) } res$edge <- rbind(res$edge, newEdge) res$Nnode <- max(res$edge) - nTips res$splitIndex <- index res$edge.length <- rep(1, nrow(res$edge)) class(res) <- c("networx", "phylo") attr(res, "order") <- NULL } res$edge.length <- weight[index] # ausserhalb res$Nnode <- max(res$edge) - nTips res$splitIndex <- index res$splits <- x class(res) <- c("networx", "phylo") attr(res, "order") <- NULL res } #' Conversion among phylogenetic network 0bjects #' #' \code{as.networx} convert \code{splits} objects into a \code{networx} #' object. And most important there exists a generic \code{plot} function to #' plot phylogenetic network or split graphs. #' #' @details A \code{networx} object hold the information for a phylogenetic #' network and extends the \code{phylo} object. Therefore some generic function #' for \code{phylo} objects will also work for \code{networx} objects. The #' argument \code{planar = TRUE} will create a planar split graph based on a #' cyclic ordering. These objects can be nicely plotted in \code{"2D"}. #' #' @aliases networx #' @param x an object of class \code{"splits"} or \code{"phylo"} #' @param planar logical whether to produce a planar graph from only cyclic #' splits (may excludes splits). #' @param coord add coordinates of the nodes, allows to reproduce the plot. #' @param \dots Further arguments passed to or from other methods. #' @note The internal representation is likely to change. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{consensusNet}}, \code{\link{neighborNet}}, #' \code{\link{splitsNetwork}}, \code{\link{hadamard}}, #' \code{\link{distanceHadamard}}, \code{\link{plot.networx}}, #' \code{\link[ape]{evonet}}, \code{\link[ape]{as.phylo}} #' @references #' Schliep, K., Potts, A. J., Morrison, D. A. and Grimm, G. W. (2017), #' Intertwining phylogenetic trees and networks. \emph{Methods Ecol Evol}. #' \bold{8}, 1212--1220. doi:10.1111/2041-210X.12760 #' @keywords plot #' @importFrom igraph graph #' @examples #' #' set.seed(1) #' tree1 <- rtree(20, rooted=FALSE) #' sp <- as.splits(rNNI(tree1, n=10)) #' net <- as.networx(sp) #' plot(net, "2D") #' \dontrun{ #' # also see example in consensusNet #' example(consensusNet) #' } #' #' @rdname as.networx #' @export as.networx as.networx <- function(x, ...) { if (inherits(x, "networx")) return(x) UseMethod("as.networx") } getOrdering <- function(x, opt=TRUE) { tree <- as.phylo(x, TRUE) tree <- reorder(tree) if(opt) tree <- optCycle(x, tree) # tree <- as.phylo(x) nTips <- length(tree$tip.label) ord <- reorder(tree)$edge[, 2] ord <- ord[ord <= nTips] ind <- which(ord == 1L) if (ind > 1) ord <- c(ord[ind:nTips], ord[c(1:(ind - 1L))]) ord } #' @export addTrivialSplits <- function(obj) { label <- attr(obj, "label") nTips <- length(label) weight <- attr(obj, "weights") if (is.null(weight)) weight <- rep(1, length(obj)) STree <- stree(nTips, tip.label = attr(obj, "labels")) STree$edge.length <- NULL spRes <- as.splits(STree)[STree$edge[, 2]] tmpIndex <- match(spRes, SHORTwise(obj, nTips)) if (any(is.na(tmpIndex))) { l.na <- sum(is.na(tmpIndex)) obj <- c(obj, spRes[is.na(tmpIndex)]) weight <- c(weight, rep(0, l.na)) attr(obj, "weights") <- weight } obj } #' @export removeTrivialSplits <- function(obj) { nTips <- length(attr(obj, "label")) l <- lengths(obj) ind <- which( (l == 0L) | (l == 1L) | (l == nTips) | (l == (nTips - 1L))) obj[-ind] } #' @rdname as.networx #' @importFrom igraph shortest_paths decompose #' @importFrom Matrix spMatrix #' @method as.networx splits #' @export as.networx.splits <- function(x, planar = FALSE, coord = c("none", "2D", "3D"), ...) { label <- attr(x, "label") x <- addTrivialSplits(x) nTips <- length(label) x <- oneWise(x, nTips) l <- lengths(x) if (any(l == nTips)) x <- x[l != nTips] # get rid of trivial splits l <- lengths(x) weight <- attr(x, "weights") if (is.null(weight)) weight <- rep(1, length(x)) attr(x, "weights") <- weight ext <- sum(l == 1 | l == (nTips - 1)) if (!is.null(attr(x, "cycle"))) { c.ord <- attr(x, "cycle") } else c.ord <- getOrdering(x) attr(x, "cycle") <- c.ord # which splits are in circular ordering circSplits <- which(countCycles(x, ord = c.ord) == 2) if (length(circSplits) == length(x)) planar <- TRUE tmp <- circNetwork(x, c.ord) attr(tmp, "order") <- NULL if (planar) { return(reorder(tmp)) } dm <- as.matrix(compatible2(x)) ll <- lengths(x) ind <- tmp$splitIndex # match(sp, x) ind2 <- union(ind, which(ll == 0)) # which(duplicated(x)) ind2 <- union(ind2, which(ll == nTips)) ord <- order(colSums(dm)) ord <- setdiff(ord, ind2) if (length(ord) > 0) { for (i in seq_along(ord)) { tmp <- addEdge(tmp, x, ord[i]) tmp$edge.length <- weight[tmp$splitIndex] tmp$Nnode <- max(tmp$edge) - nTips class(tmp) <- c("networx", "phylo") } } tmp$edge.length <- weight[tmp$splitIndex] tmp$Nnode <- max(tmp$edge) - nTips attr(x, "cycle") <- c.ord tmp$splits <- x class(tmp) <- c("networx", "phylo") tmp <- reorder(tmp) coord <- match.arg(coord) vert <- switch(coord, "none" = NULL, "2D" = coords(tmp, dim = "2D"), "3D" = coords(tmp, dim = "3D")) # attr(tmp, "coords") <- coordinates tmp$plot <- list(vertices = vert) tmp } #' @rdname as.networx #' @method as.networx phylo #' @export as.networx.phylo <- function(x, ...) { spl <- as.splits(x) spl <- spl[x$tree[, 2]] x$splitIndex <- seq_len( nrow(x$edge) ) x$splits <- spl class(x) <- c("networx", "phylo") x } # as.igraph.networx <- function(x, directed=FALSE){ # graph(t(x$edge), directed=directed) # } #' Computes a consensusNetwork from a list of trees Computes a \code{networx} #' object from a collection of splits. #' #' Computes a consensusNetwork, i.e. an object of class \code{networx} from a #' list of trees, i.e. an class of class \code{multiPhylo}. Computes a #' \code{networx} object from a collection of splits. #' #' #' @param obj An object of class multiPhylo. #' @param prob the proportion a split has to be present in all trees to be #' represented in the network. #' @param \dots Further arguments passed to or from other methods. #' @return \code{consensusNet} returns an object of class networx. This is #' just an intermediate to plot phylogenetic networks with igraph. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{splitsNetwork}}, \code{\link{neighborNet}}, #' \code{\link{lento}}, \code{\link{distanceHadamard}}, #' \code{\link{plot.networx}}, \code{\link{maxCladeCred}} #' @references Holland B.R., Huber K.T., Moulton V., Lockhart P.J. (2004) Using #' consensus networks to visualize contradictory evidence for species #' phylogeny. \emph{Molecular Biology and Evolution}, \bold{21}, 1459--61 #' @keywords hplot #' @examples #' #' data(Laurasiatherian) #' set.seed(1) #' bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x)nj(dist.hamming(x)), #' bs=50) #' cnet <- consensusNet(bs, .3) #' plot(cnet, "2D") #' \dontrun{ #' library(rgl) #' open3d() #' plot(cnet, show.tip.label=FALSE, show.nodes=TRUE) #' plot(cnet, type = "2D", show.edge.label=TRUE) #' #' tmpfile <- normalizePath(system.file("extdata/trees/RAxML_bootstrap.woodmouse", package="phangorn")) #' trees <- read.tree(tmpfile) #' cnet_woodmouse <- consensusNet(trees, .3) #' plot(cnet_woodmouse, type = "2D", show.edge.label=TRUE) #' } #' #' @export consensusNet consensusNet <- function(obj, prob = 0.3, ...) { l <- length(obj) spl <- as.splits(obj) w <- attr(spl, "weights") ind <- (w / l) > prob spl <- spl[ind] attr(spl, "confidences") <- (w / l)[ind] # attr(spl, "weights") = w[ind] res <- as.networx(spl) res$edge.labels <- as.character(res$edge.length / l * 100) res$edge.labels[res$edge[, 2] <= length(res$tip.label)] <- "" reorder(res) } #' @rdname addConfidences #' @export createLabel <- function(x, y, label_y, type = "edge", nomatch = NA) { spl_x <- as.splits(x) if (inherits(x, "phylo", TRUE) == 1) spl_x <- spl_x[x$edge[, 2]] spl_y <- as.splits(y) if (inherits(y, "phylo", TRUE) == 1) spl_y <- spl_y[y$edge[, 2]] tiplabel <- attr(spl_x, "label") nTips <- length(tiplabel) spl_y <- changeOrder(spl_y, tiplabel) spl_y <- SHORTwise(spl_y, nTips) ind <- match(SHORTwise(spl_x, nTips), spl_y) pos <- which(!is.na(ind)) res <- rep(nomatch, length(spl_x)) if (length(label_y) == 1L) label_y <- rep(label_y, length(spl_y)) res[pos] <- label_y[ind[pos]] if (type == "edge" && inherits(x, "networx")) { return(res[x$splitIndex]) } res } #' Compare splits and add support values to an object #' #' Add support values to a \code{splits}, \code{phylo} or \code{networx} #' object. #' #' @param x an object of class \code{splits}, \code{phylo} or \code{networx} #' @param y an object of class \code{splits}, \code{phylo}, \code{multiPhylo} #' or \code{networx} #' @param ... Further arguments passed to or from other methods. #' @param label_y label of y matched on x. Will be usually of #' length(as.splits(x)). #' @param type should labels returned for edges (in \code{networx}) or splits. #' @param nomatch default value if no match between x and y is found. #' @return The object \code{x} with added bootstrap / MCMC support values. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{as.splits}}, \code{\link{as.networx}}, #' \code{\link{RF.dist}}, \code{\link{plot.phylo}} #' @references Schliep, K., Potts, A. J., Morrison, D. A. and Grimm, G. W. (2017), #' Intertwining phylogenetic trees and networks. \emph{Methods Ecol Evol}. #' \bold{8}, 1212--1220. doi:10.1111/2041-210X.12760 #' @keywords cluster #' @examples #' #' data(woodmouse) #' woodmouse <- phyDat(woodmouse) #' tmpfile <- normalizePath(system.file("extdata/trees/RAxML_bootstrap.woodmouse", package="phangorn")) #' boot_trees <- read.tree(tmpfile) #' #' dm <- dist.ml(woodmouse) #' tree <- upgma(dm) #' nnet <- neighborNet(dm) #' #' tree <- addConfidences(tree, boot_trees) #' nnet <- addConfidences(nnet, boot_trees) #' #' plot(tree, show.node.label=TRUE) #' plot(nnet, "2D", show.edge.label=TRUE) #' #' @rdname addConfidences #' @export addConfidences <- function(x, y, ...) UseMethod("addConfidences") # some function to add confidences on splits if trees have different taxa # used in addConfidences.splits addConfidencesMultiPhylo <- function(spl, trees) { fun <- function(spl, intersect_labels) { spl2 <- spl index <- match(attr(spl, "labels"), intersect_labels) attr(spl2, "labels") <- intersect_labels for (i in seq_along(spl2)) { spl2[[i]] <- sort(na.omit(index[spl[[i]]])) } l_spl <- lengths(spl2) l <- length(intersect_labels) ind <- which((l_spl > 1) & (l_spl < (l - 1L))) if (length(ind) == 0) return(NULL) list(spl = spl2[ind], index = ind) } spl_labels <- attr(spl, "labels") zaehler <- numeric(length(spl)) nenner <- numeric(length(spl)) for (i in seq_along(trees)) { intersect_labels <- intersect(trees[[i]]$tip.label, spl_labels) if (length(intersect_labels) > 3) { tmp <- fun(spl, intersect_labels) if (!is.null(tmp)) { tree_spl <- as.splits(trees[[i]]) if (!identical(intersect_labels, trees[[i]]$tip.label)) tree_spl <- fun(tree_spl, intersect_labels)[[1]] comp <- compatible_2(as.bitsplits(tmp[[1]]), as.bitsplits(tree_spl)) ind <- tmp$index zaehler[ind] <- zaehler[ind] + comp nenner[ind] <- nenner[ind] + 1L } } } confidences <- zaehler / nenner attr(spl, "confidences") <- confidences spl } #' @export addConfidences.splits <- function(x, y, scaler = 1, ...) { if (hasArg(add)) add <- list(...)$add else add <- FALSE tiplabel <- attr(x, "label") nTips <- length(tiplabel) # x = addTrivialSplits(x) if (inherits(y, "phylo")) { ind <- match(tiplabel, y$tip.label) if (any(is.na(ind)) | length(tiplabel) != length(y$tip.label)) stop("trees have different labels") y$tip.label <- y$tip.label[ind] ind2 <- match(seq_along(ind), y$edge[, 2]) y$edge[ind2, 2] <- order(ind) } if (inherits(y, "multiPhylo")) { if (inherits(try(.compressTipLabel(y), TRUE), "try-error")) { res <- addConfidencesMultiPhylo(x, y) return(res) } } spl <- as.splits(y) spl <- changeOrder(spl, tiplabel) spl <- oneWise(spl, nTips) ind <- match(oneWise(x, nTips), spl) # pos <- which(ind > nTips) pos <- which(!is.na(ind)) confidences <- rep(NA_real_, length(x)) # numeric(length(x)) #character if(is.numeric(attr(spl, "confidences"))) confidences[pos] <- attr(spl, "confidences")[ind[pos]] * scaler else confidences[pos] <- attr(spl, "confidences")[ind[pos]] if (add == TRUE) confidences <- paste(prettyNum(attr(x, "confidences")), prettyNum(confidences * scaler), sep = "/") # y$node.label[ind[pos] - nTips] attr(x, "confidences") <- confidences x } #' @export addConfidences.networx <- function(x, y, scaler = 1, ...) { spl <- x$splits spl <- addConfidences(spl, y, scaler = scaler, ...) x$splits <- spl x } #' @rdname addConfidences #' @export addConfidences.phylo <- function(x, y, ...) { # call <- x$call if (hasArg(as.is)) as.is <- list(...)$as.is else as.is <- TRUE nTips <- length(x$tip.label) spl <- as.splits(x) %>% oneWise(nTips = nTips) conf <- attr(addConfidences(spl, y), "confidences") l <- lengths(spl) if (is.character(conf)) as.is <- TRUE # conf <- as.numeric(conf) ind <- (l == 1L) | (l == (nTips - 1L)) | (l == nTips) conf[ind == TRUE] <- NA_real_ nTips <- length(x$tip.label) if (!as.is) conf <- conf * 100 x$node.label <- conf[-c(1:nTips)] x } #' @rdname addConfidences #' @export presenceAbsence <- function(x, y) { spl <- as.splits(y) l <- length(spl) attr(spl, "confidences") <- rep(1, l) addConfidences(x, y) } #' @export reorder.networx <- function(x, order = "cladewise", index.only = FALSE, ...) { order <- match.arg(order, c("cladewise", "postorder")) if (!is.null(attr(x, "order"))) if (attr(x, "order") == order) return(x) g <- graph(t(x$edge)) if (order == "cladewise") neword <- topo_sort(g, "out") else neword <- topo_sort(g, "in") neworder <- order(match(x$edge[, 1], neword)) if (index.only) return(neworder) x$edge <- x$edge[neworder, ] if (!is.null(x$edge.length)) x$edge.length <- x$edge.length[neworder] if (!is.null(x$edge.labels)) x$edge.labels <- x$edge.labels[neworder] if (!is.null(x$splitIndex)) x$splitIndex <- x$splitIndex[neworder] attr(x, "order") <- order x } # some trigonemetric functions rad2deg <- function(rad) (rad * 180) / (pi) deg2rad <- function(deg) (deg * pi) / (180) # circular mean # https://en.wikipedia.org/wiki/Mean_of_circular_quantities circ.mean <- function(deg) { rad.m <- (deg * pi) / (180) mean.cos <- mean(cos(rad.m)) mean.sin <- mean(sin(rad.m)) theta <- rad2deg(atan(mean.sin / mean.cos)) if (mean.cos < 0) theta <- theta + 180 if ((mean.sin < 0) & (mean.cos > 0)) theta <- theta + 360 theta } spl2angle <- function(x) { l <- length(attr(x, "labels")) ord <- 1:l if (!is.null(attr(x, "cycle"))) ord <- attr(x, "cycle") x <- changeOrder(x, attr(x, "labels")[ord]) y <- lapply(x, function(x, l) (x - 1) / l * 360, l = l) angle <- vapply(y, circ.mean, 0) %>% deg2rad() # angle <- ((vapply(x, sum, 0) / lengths(x) - 1) / l ) * 2*pi # kreis2kart(attr(x, "weight"), angle) angle } coords.equal.angle <- function(obj) { if (is.null(attr(obj, "order")) || (attr(obj, "order") == "postorder")) obj <- reorder.networx(obj) spl <- obj$splits l <- length(obj$edge.length) # ind1 <- which(!duplicated(obj$splitIndex)) n <- max(obj$edge) angle <- spl2angle(spl) weight <- attr(spl, "weight") k <- matrix(0, max(obj$splitIndex), 2) res <- matrix(0, max(obj$edge), 2) for (i in 1:l) { # unique(obj$splitIndex) j <- obj$edge[i, 1] m <- obj$edge[i, 2] p <- obj$splitIndex[i] res[m, ] <- res[j, ] + kreis2kart(weight[p], angle[p]) } res } #' @rdname phangorn-internal #' @export coords <- function(obj, dim = "3D") { # if(is.null(attr(obj,"order")) || (attr(obj, "order")=="postorder") ) # obj = reorder.networx(obj) if (dim == "equal_angle") return(coords.equal.angle(obj)) l <- length(obj$edge.length) ind1 <- which(!duplicated(obj$splitIndex)) n <- max(obj$edge) adj <- spMatrix(n, n, i = obj$edge[, 2], j = obj$edge[, 1], x = rep(1, length(obj$edge.length))) g <- graph_from_adjacency_matrix(adj, "undirected") ########## # add this # g2 <- graph(t(obj$edge), directed=FALSE) # g2 <- set.edge.attribute(g, "weight", value=rep(1, nrow(obj$edge)) if (dim == "3D") { coord <- layout_nicely(g, dim = 3) k <- matrix(0, max(obj$splitIndex), 3) for (i in ind1) { tmp <- coord[obj$edge[i, 2], ] - coord[obj$edge[i, 1], ] k[obj$splitIndex[i], ] <- kart2kugel(tmp[1], tmp[2], tmp[3]) } k[obj$splitIndex[ind1], 1] <- obj$edge.length[ind1] res <- matrix(0, vcount(g), 3) for (i in 1:l) { j <- obj$edge[i, 1] m <- obj$edge[i, 2] p <- obj$splitIndex[i] res[m, ] <- res[j, ] + kugel2kart(k[p, 1], k[p, 2], k[p, 3]) } } else { coord <- layout_nicely(g, dim = 2) k <- matrix(0, max(obj$splitIndex), 2) for (i in ind1) { tmp <- coord[obj$edge[i, 2], ] - coord[obj$edge[i, 1], ] k[obj$splitIndex[i], ] <- kart2kreis(tmp[1], tmp[2]) } k[obj$splitIndex[ind1], 1] <- obj$edge.length[ind1] res <- matrix(0, vcount(g), 2) for (i in 1:l) { j <- obj$edge[i, 1] m <- obj$edge[i, 2] p <- obj$splitIndex[i] res[m, ] <- res[j, ] + kreis2kart(k[p, 1], k[p, 2]) } } res } kart2kugel <- function(x, y, z) { r <- sqrt(x * x + y * y + z * z) alpha <- atan(sqrt(x * x + y * y) / z) if (z < 0) alpha <- alpha + pi beta <- atan(y / x) if (x < 0) beta <- beta + pi c(r, alpha, beta) } kart2kreis <- function(x, y) { r <- sqrt(x * x + y * y) alpha <- atan(y / x) if (x < 0) alpha <- alpha + pi c(r, alpha) } kreis2kart <- function(r, alpha) { c(r * cos(alpha), r * sin(alpha)) # if(length(r)>1) return(matrix(c(r*cos(alpha), r*sin(alpha)), ncol=2)) # else return(c(r*cos(alpha), r*sin(alpha))) } kugel2kart <- function(r, alpha, beta) { x <- r * sin(alpha) * cos(beta) y <- r * sin(alpha) * sin(beta) z <- r * cos(alpha) c(x, y, z) } edgeLabels <- function(xx, yy, zz = NULL, edge) { XX <- (xx[edge[, 1]] + xx[edge[, 2]]) / 2 YY <- (yy[edge[, 1]] + yy[edge[, 2]]) / 2 if (!is.null(zz)) { ZZ <- (zz[edge[, 1]] + zz[edge[, 2]]) / 2 return(cbind(XX, YY, ZZ)) } cbind(XX, YY) } #' plot phylogenetic networks #' #' So far not all parameters behave the same on the the \code{rgl} \code{"3D"} and #' basic graphic \code{"2D"} device. #' #' Often it is easier and safer to supply vectors of graphical parameters for #' splits (e.g. splits.color) than for edges. These overwrite values edge.color. #' #' @param x an object of class \code{"networx"} #' @param type "3D" to plot using rgl or "2D" in the normal device. #' @param use.edge.length a logical indicating whether to use the edge weights #' of the network to draw the branches (the default) or not. #' @param show.tip.label a logical indicating whether to show the tip labels on #' the graph (defaults to \code{TRUE}, i.e. the labels are shown). #' @param show.edge.label a logical indicating whether to show the tip labels #' on the graph. #' @param edge.label an additional vector of edge labels (normally not needed). #' @param show.node.label a logical indicating whether to show the node labels #' (see example). #' @param node.label an additional vector of node labels (normally not needed). #' @param show.nodes a logical indicating whether to show the nodes (see #' example). #' @param tip.color the colors used for the tip labels. #' @param edge.color the colors used to draw edges. #' @param edge.width the width used to draw edges. #' @param edge.lty a vector of line types. #' @param split.color the colors used to draw edges. #' @param split.width the width used to draw edges. #' @param split.lty a vector of line types. #' @param font an integer specifying the type of font for the labels: 1 (plain #' text), 2 (bold), 3 (italic, the default), or 4 (bold italic). #' @param cex a numeric value giving the factor scaling of the labels. #' @param cex.node.label a numeric value giving the factor scaling of the node #' labels. #' @param cex.edge.label a numeric value giving the factor scaling of the edge #' labels. #' @param col.node.label the colors used for the node labels. #' @param col.edge.label the colors used for the edge labels. #' @param font.node.label the font used for the node labels. #' @param font.edge.label the font used for the edge labels. #' @param \dots Further arguments passed to or from other methods. #' @rdname plot.networx #' @note The internal representation is likely to change. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{consensusNet}}, \code{\link{neighborNet}}, #' \code{\link{splitsNetwork}}, \code{\link{hadamard}}, #' \code{\link{distanceHadamard}}, \code{\link{as.networx}}, #' \code{\link[ape]{evonet}}, \code{\link[ape]{as.phylo}}, #' \code{\link{densiTree}}, \code{\link[ape]{nodelabels}} #' @references Dress, A.W.M. and Huson, D.H. (2004) Constructing Splits Graphs #' \emph{IEEE/ACM Transactions on Computational Biology and Bioinformatics #' (TCBB)}, \bold{1(3)}, 109--115 #' #' Schliep, K., Potts, A. J., Morrison, D. A. and Grimm, G. W. (2017), #' Intertwining phylogenetic trees and networks. \emph{Methods Ecol Evol}. #' \bold{8}, 1212--1220. doi:10.1111/2041-210X.12760 #' @keywords plot #' @importFrom igraph graph #' @examples #' #' set.seed(1) #' tree1 <- rtree(20, rooted=FALSE) #' sp <- as.splits(rNNI(tree1, n=10)) #' net <- as.networx(sp) #' plot(net, "2D") #' \dontrun{ #' # also see example in consensusNet #' example(consensusNet) #' } #' @importFrom igraph graph_from_adjacency_matrix vcount topo_sort layout_nicely #' @method plot networx #' @export plot.networx <- function(x, type = "3D", use.edge.length = TRUE, show.tip.label = TRUE, show.edge.label = FALSE, edge.label = NULL, show.node.label = FALSE, node.label = NULL, show.nodes = FALSE, tip.color = "black", edge.color = "black", edge.width = 3, edge.lty = 1, split.color = NULL, split.width = NULL, split.lty = NULL, font = 3, cex = par("cex"), cex.node.label = cex, cex.edge.label = cex, col.node.label = tip.color, col.edge.label = tip.color, font.node.label = font, font.edge.label = font, ...) { type <- match.arg(type, c("3D", "2D", "equal angle")) if (use.edge.length == FALSE) x$edge.length[] <- 1 nTips <- length(x$tip.label) conf <- attr(x$splits, "confidences") index <- x$splitIndex if (is.null(edge.label) & !is.null(conf)) { conf <- conf[index] if (!is.null(x$translate)) conf[match(x$translate$node, x$edge[, 2])] <- "" else conf[x$edge[, 2] <= nTips] <- "" edge.label <- conf } if (is.null(node.label)) node.label <- as.character(1:max(x$edge)) if (show.tip.label) node.label[1:nTips] <- "" lspl <- max(x$splitIndex) if (!is.null(split.color)) { if (length(split.color) != lspl) stop("split.color must be same length as splits") else edge.color <- split.color[x$splitIndex] } if (!is.null(split.width)) { if (length(split.width) != lspl) stop("split.color must be same length as splits") else edge.width <- split.width[x$splitIndex] } if (!is.null(split.lty)) { if (length(split.lty) != lspl) stop("split.color must be same length as splits") else edge.lty <- split.lty[x$splitIndex] } chk <- FALSE if (type == "3D") chk <- requireNamespace("rgl", quietly = TRUE) if (!chk && type == "3D") { warning("type='3D' requires the package 'rgl', plotting in '2D' instead!\n") type <- "2D" } # use precomputed vertices when available coord <- NULL if (!is.null(x$.plot)) coord <- x$.plot$vertices if (type == "3D") { if (is.null(coord) || ncol(coord) != 3) coord <- coords(x, dim = "3D") plotRGL(coord, x, show.tip.label = show.tip.label, show.edge.label = show.edge.label, edge.label = edge.label, show.node.label = show.node.label, node.label = node.label, show.nodes = show.nodes, tip.color = tip.color, edge.color = edge.color, edge.width = edge.width, font = font, cex = cex, cex.node.label = cex.node.label, cex.edge.label = cex.edge.label, col.node.label = col.node.label, col.edge.label = col.edge.label, font.node.label = font.node.label, font.edge.label = font.edge.label) } else { if (is.null(coord) || ncol(coord) != 2) { if (type == "equal angle") coord <- coords.equal.angle(x) else coord <- coords(x, dim = "2D") } plot2D(coord, x, show.tip.label = show.tip.label, show.edge.label = show.edge.label, edge.label = edge.label, show.node.label = show.node.label, node.label = node.label, show.nodes = show.nodes, tip.color = tip.color, edge.color = edge.color, edge.width = edge.width, edge.lty = edge.lty, font = font, cex = cex, cex.node.label = cex.node.label, cex.edge.label = cex.edge.label, col.node.label = col.node.label, col.edge.label = col.edge.label, font.node.label = font.node.label, font.edge.label = font.edge.label, add = FALSE) } x$.plot <- list(vertices = coord, edge.color = edge.color, edge.width = edge.width, edge.lty = edge.lty) L <- list(Ntip = nTips, type = "networx") assign("last_plot.phylo", c(L, list(edge = x$edge, xx = coord[, 1], yy = coord[, 2])), envir = .PlotPhyloEnv) invisible(x) } plotRGL <- function(coords, net, show.tip.label = TRUE, show.edge.label = FALSE, edge.label = NULL, show.node.label = FALSE, node.label = NULL, show.nodes = FALSE, tip.color = "blue", edge.color = "grey", edge.width = 3, font = 3, cex = par("cex"), cex.node.label = cex, cex.edge.label = cex, col.node.label = tip.color, col.edge.label = tip.color, font.node.label = font, font.edge.label = font, ...) { open3d <- rgl::open3d segments3d <- rgl::segments3d spheres3d <- rgl::spheres3d rgl.texts <- rgl::rgl.texts edge <- net$edge x <- coords[, 1] y <- coords[, 2] z <- coords[, 3] nTips <- length(net$tip.label) segments3d(x[t(edge)], y[t(edge)], z[t(edge)], col = rep(edge.color, each = 2), lwd = edge.width) radius <- 0 if (show.nodes) { radius <- sqrt( (max(x) - min(x))^2 + (max(y) - min(y))^2 + (max(z) - min(z))^2) / 200 spheres3d(x[1:nTips], y[1:nTips], z[1:nTips], radius = 2 * radius, color = "cyan") spheres3d(x[-c(1:nTips)], y[-c(1:nTips)], z[-c(1:nTips)], radius = radius, color = "magenta") } if (show.tip.label) { if (is.null(net$translate)) rgl.texts(x[1:nTips] + 2.05 * radius, y[1:nTips], z[1:nTips], net$tip.label, color = tip.color, cex = cex, font = font) else rgl.texts(x[net$translate$node] + 2.05 * radius, y[net$translate$node], z[net$translate$node], net$tip.label, color = tip.color, cex = cex, font = font) } if (show.edge.label) { ec <- edgeLabels(x, y, z, edge) if (is.null(edge.label)) edge.label <- net$splitIndex # else edge.label = net$splitIndex rgl.texts(ec[, 1], ec[, 2], ec[, 3], edge.label, color = col.edge.label, cex = cex.edge.label, font = font.edge.label) } if (show.node.label) { rgl.texts(x, y, z, node.label, color = col.node.label, cex = cex.node.label, font = font.node.label) } } plot2D <- function(coords, net, show.tip.label = TRUE, show.edge.label = FALSE, edge.label = NULL, show.node.label = FALSE, node.label = NULL, tip.color = "blue", edge.color = "grey", edge.width = 3, edge.lty = 1, font = 3, cex = par("cex"), cex.node.label = cex, cex.edge.label = cex, col.node.label = tip.color, col.edge.label = tip.color, font.node.label = font, font.edge.label = font, add = FALSE, ...) { edge <- net$edge label <- net$tip.label xx <- coords[, 1] yy <- coords[, 2] nTips <- length(label) xlim <- range(xx) ylim <- range(yy) if (show.tip.label) { offset <- max(nchar(label)) * 0.018 * cex * diff(xlim) xlim <- c(xlim[1] - offset, xlim[2] + offset) ylim <- c(ylim[1] - 0.03 * cex * diff(ylim), ylim[2] + 0.03 * cex * diff(ylim)) } if (!add) { plot.new() plot.window(xlim, ylim, asp = 1) } cladogram.plot(edge, xx, yy, edge.color, edge.width, edge.lty) if (show.tip.label) { if (is.null(net$translate)) ind <- match(1:nTips, edge[, 2]) else ind <- match(net$translate$node, edge[, 2]) pos <- rep(4, nTips) XX <- xx[edge[ind, 1]] - xx[edge[ind, 2]] pos[XX > 0] <- 2 YY <- yy[edge[ind, 1]] - yy[edge[ind, 2]] pos2 <- rep(3, nTips) pos2[YY > 0] <- 1 # needed if tiplabels are not at internal nodes XX[is.na(XX)] <- 0 YY[is.na(YY)] <- 0 pos[abs(YY) > abs(XX)] <- pos2[abs(YY) > abs(XX)] if (is.null(net$translate)) text(xx[1:nTips], yy[1:nTips], labels = label, pos = pos, col = tip.color, cex = cex, font = font) else text(xx[net$translate$node], yy[net$translate$node], labels = label, pos = pos, col = tip.color, cex = cex, font = font) } if (show.edge.label) { ec <- edgeLabels(xx, yy, edge = edge) if (is.null(edge.label)) edge.label <- net$splitIndex # show only one edge label em <- apply(ec, 1, function(x) max(abs(x))) si <- net$splitIndex for (i in unique(si)) { tmp <- si == i if (sum(tmp) > 1) { w <- which(tmp) wm <- which.max(em[w]) edge.label[w[-wm]] <- "" } } text(ec[, 1], ec[, 2], labels = edge.label, col = col.edge.label, cex = cex.edge.label, font = font.edge.label) } if (show.node.label) { text(xx, yy, labels = node.label, col = col.node.label, cex = cex.node.label, font = font.node.label) } } closest.edge <- function(x, y, P1, P2) { x1 <- P1[, 1] x2 <- P2[, 1] y1 <- P1[, 2] y2 <- P2[, 2] A <- sqrt( (x2 - x)^2 + (y2 - y)^2) # d_BC B <- sqrt( (x1 - x)^2 + (y1 - y)^2) # d_AC C <- sqrt( (x1 - x2)^2 + (y1 - y2)^2) # d_AB # Kosinussatz alpha <- acos( (B^2 + C^2 - A^2) / (2 * B * C)) beta <- acos( (A^2 + C^2 - B^2) / (2 * A * C)) d <- abs( (y2 - y1) * x - (x2 - x1) * y + x2 * y1 - y2 * x1) / sqrt( (y2 - y1)^2 + (x2 - x1)^2) d[alpha > (pi / 2)] <- B[alpha > (pi / 2)] d[beta > (pi / 2)] <- A[beta > (pi / 2)] d } closest.node <- function(x, y, P) { x1 <- P[, 1] y1 <- P[, 2] d <- sqrt((x1 - x)^2 + (y1 - y)^2) d } #' Identify splits in a network #' #' \code{identify.networx} reads the position of the graphics pointer when the #' mouse button is pressed. It then returns the split belonging to the edge #' closest to the pointer. The network must be plotted beforehand. #' #' @param x an object of class \code{networx} #' @param quiet a logical controlling whether to print a message inviting the #' user to click on the tree. #' @param \dots further arguments to be passed to or from other methods. #' @return \code{identify.networx} returns a splits object. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[phangorn]{plot.networx}}, \code{\link[graphics]{identify}} #' @examples #' \dontrun{ #' data(yeast) #' dm <- dist.ml(yeast) #' nnet <- neighborNet(dm) #' plot(nnet, "2D") #' identify(nnet) # click close to an edge #' } #' @importFrom graphics identify #' @method identify networx #' @export identify.networx <- function(x, quiet = FALSE, ...) { if (!quiet) cat("Click close to a node or edge of the tree...\n") xy <- locator(1) if (is.null(xy)) return(NULL) if (is.null(x$.plot)) { lastPP <- get("last_plot.phylo", envir = .PlotPhyloEnv) edge <- lastPP$edge xx <- lastPP$xx yy <- lastPP$yy vertices <- cbind(xx, yy) } else { lastPP <- x$.plot edge <- x$edge vertices <- lastPP$vertices } P1 <- vertices[edge[, 1], , drop = FALSE] P2 <- vertices[edge[, 2], , drop = FALSE] d <- closest.edge(xy$x, xy$y, P1, P2) split <- x$splitIndex[which.min(d)] x$splits[split] } phangorn/R/delta.score.R0000644000176200001440000000453113475602650014630 0ustar liggesusers################################################################################ # delta.score ################################################################################ # Calculated from mathematical description given in Gray et al. (2010) Phil. # Trans. Roy. Soc. B. # delta.score reference: Holland et al. (2002) Mol. Biol. Evol. ################################################################################ # Calculating Delta and Q-residual scores # internal delta.quartet <- function(quartet, dist.dna) { m1 <- dist.dna[quartet[1], quartet[2]] + dist.dna[quartet[3], quartet[4]] m2 <- dist.dna[quartet[1], quartet[3]] + dist.dna[quartet[2], quartet[4]] m3 <- dist.dna[quartet[1], quartet[4]] + dist.dna[quartet[2], quartet[3]] m <- sort(c(m1, m2, m3), decreasing = TRUE) if ((m[1] - m[3]) != 0) { ret <- (m[1] - m[2]) / (m[1] - m[3]) } else { ret <- 0 } return(ret) } #' Computes the \eqn{\delta} score #' #' Computes the treelikeness #' #' #' @param x an object of class \code{phyDat} #' @param arg Specifies the return value, one of "all", "mean" or "sd" #' @param ... further arguments passed through \code{dist.hamming} #' @return A vector containing the \eqn{\delta} scores. #' @author Alastair Potts and Klaus Schliep #' @seealso \code{\link{dist.hamming}} #' @references BR Holland, KT Huber, A Dress, V Moulton (2002) \eqn{\delta} #' Plots: a tool for analyzing phylogenetic distance data Russell D. Gray, #' David Bryant, Simon J. Greenhill (2010) On the shape and fabric of human #' history \emph{Molecular Biology and Evolution}, \bold{19(12)} 2051--2059 #' #' Russell D. Gray, David Bryant, Simon J. Greenhill (2010) On the shape and #' fabric of human history \emph{Phil. Trans. R. Soc. B}, \bold{365} #' 3923--3933; DOI: 10.1098/rstb.2010.0162 #' @keywords cluster #' @examples #' #' data(yeast) #' hist(delta.score(yeast, "all")) #' #' @export delta.score delta.score <- function(x, arg = "mean", ...) { dist.dna <- as.matrix(dist.hamming(x, ...)) # Create all quartets all.quartets <- t(combn(names(x), 4)) delta.values <- apply(all.quartets[, ], 1, delta.quartet, dist.dna) if (!arg %in% c("all", "mean", "sd")) stop("return options are: all, mean, or sd") if (arg == "all") return(delta.values) if (arg == "mean") return(mean(delta.values)) if (arg == "sd") return(sd(delta.values)) } phangorn/R/phyDat.R0000644000176200001440000011265713476524545013676 0ustar liggesusers# # Data structures for ML and MP # fast.table <- function (data) { if(!is.data.frame(data)) data <- as.data.frame(data, stringsAsFactors = FALSE) da <- do.call("paste", c(data, sep = "\r")) ind <- !duplicated(da) levels <- da[ind] cat <- factor(da, levels = levels) nl <- length(levels(cat)) bin <- (as.integer(cat) - 1) pd <- nl bin <- bin[!is.na(bin)] if (length(bin)) bin <- bin + 1 y <- tabulate(bin, pd) result <- list(index = bin, weights = y, data = data[ind, ]) result } phyDat.default <- function (data, levels = NULL, return.index = TRUE, contrast = NULL, ambiguity = "?", compress=TRUE, ...){ if (is.matrix(data)) nam <- row.names(data) else nam <- names(data) if(is.null(nam))stop("data object must contain taxa names") if(inherits(data, "character") | inherits(data, "numeric")) data <- as.matrix(data) if (inherits(data, "DNAbin")) data <- as.character(data) if (is.matrix(data)) data <- as.data.frame(t(data), stringsAsFactors = FALSE) # new 4.4.2016 bug fix (reported by Eli Levy Karin) # if (is.vector(data) && !is.list(data))data = as.data.frame(data, # stringsAsFactors = FALSE) else data <- as.data.frame(data, stringsAsFactors = FALSE) if(length(data[[1]])==1) compress <- FALSE if(compress){ ddd <- fast.table(data) data <- ddd$data weight <- ddd$weight index <- ddd$index } else{ p <- length(data[[1]]) weight <- rep(1, p) index <- 1:p } q <- length(data) p <- length(data[[1]]) # tmp <- vector("list", q) if (!is.null(contrast)) { levels <- colnames(contrast) all.levels <- rownames(contrast) rownames(contrast) <- NULL } else { if (is.null(levels)) stop("Either argument levels or contrast has to be supplied") l <- length(levels) contrast <- diag(l) all.levels <- levels if (!is.null(ambiguity)) { all.levels <- c(all.levels, ambiguity) k <- length(ambiguity) if (k > 0) contrast <- rbind(contrast, matrix(1, k, l)) } } # d <- dim(data) att <- attributes(data) data <- lapply(data, match, all.levels) attributes(data) <- att row.names(data) <- as.character(1:p) data <- na.omit(data) aaa <- match(index, attr(data, "na.action")) if(!is.null(attr(data, "na.action"))) warning("Found unknown characters (not supplied in levels). Deleted sites with with unknown states.") index <- index[is.na(aaa)] index <- match(index, unique(index)) rn <- as.numeric(rownames(data)) attr(data, "na.action") <- NULL weight <- weight[rn] p <- dim(data)[1] names(data) <- nam attr(data, "row.names") <- NULL attr(data, "weight") <- weight attr(data, "nr") <- p attr(data, "nc") <- length(levels) if (return.index) attr(data, "index") <- index attr(data, "levels") <- levels attr(data, "allLevels") <- all.levels attr(data, "type") <- "USER" attr(data, "contrast") <- contrast class(data) <- "phyDat" data } phyDat.DNA <- function (data, return.index = TRUE){ if (is.matrix(data)) nam <- row.names(data) else nam <- names(data) if (inherits(data,"DNAbin")) data <- as.character(data) if(inherits(data, "character")) data <- as.matrix(data) if (is.matrix(data)) data <- as.data.frame(t(data), stringsAsFactors = FALSE) else data <- as.data.frame(data, stringsAsFactors = FALSE) data <- data.frame(tolower(as.matrix(data)), stringsAsFactors = FALSE) ac <- c("a", "c", "g", "t", "u", "m", "r", "w", "s", "y", "k", "v", "h", "d", "b", "n", "?", "-") AC <- matrix(c(c(1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1), c(0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1), c(0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1), c(0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1)), 18, 4, dimnames = list(NULL, c("a", "c", "g", "t"))) compress <- TRUE if(length(data[[1]])==1) compress <- FALSE if(compress){ ddd <- fast.table(data) data <- ddd$data weight <- ddd$weight index <- ddd$index } else{ p <- length(data[[1]]) weight <- rep(1, p) index <- 1:p } # q <- length(data) p <- length(data[[1]]) # d <- dim(data) att <- attributes(data) data <- lapply(data, match, ac) # data <- match(unlist(data), ac) # attr(data, "dim") <- d # data <- as.data.frame(data, stringsAsFactors=FALSE) attributes(data) <- att row.names(data) <- as.character(1:p) data <- na.omit(data) rn <- as.numeric(rownames(data)) if(!is.null(attr(data, "na.action"))) warning("Found unknown characters. Deleted sites with with unknown states.") aaa <- match(index, attr(data, "na.action")) index <- index[is.na(aaa)] index <- match(index, unique(index)) rn <- as.numeric(rownames(data)) attr(data, "na.action") <- NULL weight <- weight[rn] p <- dim(data)[1] names(data) <- nam attr(data, "row.names") <- NULL attr(data, "weight") <- weight attr(data, "nr") <- p attr(data, "nc") <- 4 if (return.index) attr(data, "index") <- index attr(data, "levels") <- c("a", "c", "g", "t") attr(data, "allLevels") <- ac attr(data, "type") <- "DNA" attr(data, "contrast") <- AC class(data) <- "phyDat" data } phyDat.AA <- function (data, return.index = TRUE){ if(is.matrix(data)) nam <- row.names(data) else nam <- names(data) # AAbin if (inherits(data,"AAbin")) data <- as.character(data) if(inherits(data, "character")) data <- as.matrix(data) if (is.matrix(data)) data <- as.data.frame(t(data), stringsAsFactors = FALSE) else data <- as.data.frame(data, stringsAsFactors = FALSE) data <- data.frame(tolower(as.matrix(data)), stringsAsFactors = FALSE) aa <- c("a", "r", "n", "d", "c", "q", "e", "g", "h", "i", "l", "k", "m", "f", "p", "s", "t", "w", "y", "v") aa2 <- c("a", "r", "n", "d", "c", "q", "e", "g", "h", "i", "l", "k", "m", "f", "p", "s", "t", "w", "y", "v", "b", "z", "x", "-", "?") AA <- diag(20) AA <- rbind(AA, matrix(0, 5, 20)) AA[21, 3] <- AA[21, 4] <- 1 # Aspartate or Asparagine AA[22, 6] <- AA[22, 7] <- 1 # AA[23:25, ] <- 1 dimnames(AA) <- list(aa2, aa) compress <- TRUE if(length(data[[1]])==1) compress <- FALSE if(compress){ ddd <- fast.table(data) data <- ddd$data weight <- ddd$weight index <- ddd$index } else{ p <- length(data[[1]]) weight <- rep(1, p) index <- 1:p } q <- length(data) p <- length(data[[1]]) # tmp <- vector("list", q) # d <- dim(data) att <- attributes(data) data <- lapply(data, match, aa2) # data <- match(unlist(data), aa2) # attr(data, "dim") <- d # data <- as.data.frame(data, stringsAsFactors=FALSE) attributes(data) <- att row.names(data) <- as.character(1:p) data <- na.omit(data) rn <- as.numeric(rownames(data)) if(!is.null(attr(data, "na.action"))) warning("Found unknown characters. Deleted sites with with unknown states.") aaa <- match(index, attr(data, "na.action")) index <- index[is.na(aaa)] index <- match(index, unique(index)) rn <- as.numeric(rownames(data)) attr(data, "na.action") <- NULL weight <- weight[rn] p <- dim(data)[1] names(data) <- nam attr(data, "row.names") <- NULL attr(data, "weight") <- weight attr(data, "nr") <- p attr(data, "nc") <- 20 if (return.index) attr(data, "index") <- index attr(data, "levels") <- aa attr(data, "allLevels") <- aa2 attr(data, "type") <- "AA" attr(data, "contrast") <- AA class(data) <- "phyDat" data } phyDat.codon <- function (data, return.index = TRUE, ambiguity = "---", NA_as_ambiguous=TRUE){ if(is.matrix(data)) nam <- row.names(data) else nam <- names(data) if (inherits(data,"DNAbin")) data <- as.character(data) if(inherits(data, "character")) data <- as.matrix(data) if (is.matrix(data)) data <- as.data.frame(t(data), stringsAsFactors = FALSE) else data <- as.data.frame(data, stringsAsFactors = FALSE) data <- data.frame(tolower(as.matrix(data)), stringsAsFactors = FALSE) data[data=="u"] <- "t" splseq <- function (seq, frame = 0){ starts <- seq(from = frame + 1, to = length(seq), by = 3L) sapply(starts, function(x) paste(seq[x:(x + 2L)], collapse="")) } data <- data.frame(lapply(data, splseq)) compress <- TRUE if(nrow(data)==1) compress <- FALSE if(compress){ ddd <- fast.table(data) data <- ddd$data weight <- ddd$weight index <- ddd$index } else{ p <- length(data[[1]]) weight <- rep(1, p) index <- 1:p } codon <- c("aaa", "aac", "aag", "aat", "aca", "acc", "acg", "act", "aga", "agc", "agg", "agt", "ata", "atc", "atg", "att", "caa", "cac", "cag", "cat", "cca", "ccc", "ccg", "cct", "cga", "cgc", "cgg", "cgt", "cta", "ctc", "ctg", "ctt", "gaa", "gac", "gag", "gat", "gca", "gcc", "gcg", "gct", "gga", "ggc", "ggg", "ggt", "gta", "gtc", "gtg", "gtt", "tac", "tat", "tca", "tcc", "tcg", "tct", "tgc", "tgg", "tgt", "tta", "ttc", "ttg", "ttt") # ohne Stopcodons "taa", "tag", "tga", CODON <- diag(61) if(NA_as_ambiguous){ ambiguity <- unique(c("---", ambiguity)) } if(ambiguity!=""){ codon_amb <- c(codon, ambiguity) CODON <- rbind(CODON, matrix(1, length(ambiguity), 61)) } else codon_amb <- codon dimnames(CODON) <- list(codon_amb, codon) q <- length(data) p <- length(data[[1]]) tmp <- vector("list", q) d <- dim(data) att <- attributes(data) data <- match(unlist(data), codon_amb) if(NA_as_ambiguous){ ind <- match("---", codon_amb) data[is.na(data)] <- ind } attr(data, "dim") <- d data <- as.data.frame(data, stringsAsFactors=FALSE) attributes(data) <- att row.names(data) <- as.character(1:p) data <- na.omit(data) rn <- as.numeric(rownames(data)) if(!is.null(attr(data, "na.action"))) warning("Found unknown characters. Deleted sites with with unknown states.") aaa <- match(index, attr(data, "na.action")) index <- index[is.na(aaa)] index <- match(index, unique(index)) rn <- as.numeric(rownames(data)) attr(data, "na.action") <- NULL weight <- weight[rn] p <- dim(data)[1] names(data) <- nam attr(data, "row.names") <- NULL attr(data, "weight") <- weight attr(data, "nr") <- p attr(data, "nc") <- 61 if (return.index) attr(data, "index") <- index attr(data, "levels") <- codon attr(data, "allLevels") <- codon_amb attr(data, "type") <- "CODON" attr(data, "contrast") <- CODON class(data) <- "phyDat" data } #' Conversion among Sequence Formats #' #' These functions transform several DNA formats into the \code{phyDat} format. #' \code{allSitePattern} generates an alignment of all possible site patterns. #' #' If \code{type} "USER" a vector has to be give to \code{levels}. For example #' c("a", "c", "g", "t", "-") would create a data object that can be used in #' phylogenetic analysis with gaps as fifth state. There is a more detailed #' example for specifying "USER" defined data formats in the vignette #' "phangorn-specials". #' #' \code{allSitePattern} returns all possible site patterns and can be useful #' in simulation studies. For further details see the vignette #' phangorn-specials. #' #' \code{write.phyDat} calls the function write.dna or write.nexus.data and #' \code{read.phyDat} calls the function \code{read.dna}, \code{read.aa} or #' \code{read.nexus.data} see for more details over there. #' #' You may import data directly with \code{\link[ape]{read.dna}} or #' \code{\link[ape]{read.nexus.data}} and convert the data to class phyDat. #' #' The generic function \code{c} can be used to to combine sequences and #' \code{unique} to get all unique sequences or unique haplotypes. #' #' \code{acgt2ry} converts a \code{phyDat} object of nucleotides into an binary #' ry-coded dataset. #' #' @aliases #' as.phyDat.character as.phyDat.data.frame as.phyDat.matrix #' as.MultipleAlignment as.MultipleAlignment.phyDat cbind.phyDat c.phyDat #' acgt2ry removeUndeterminedSites phyDat2MultipleAlignment #' @param data An object containing sequences. #' @param x An object containing sequences. #' @param type Type of sequences ("DNA", "AA", "CODON" or "USER"). #' @param levels Level attributes. #' @param return.index If TRUE returns a index of the site patterns. #' @param file A file name. #' @param format File format of the sequence alignment (see details). Several #' popular formats are supported: "phylip", "interleaved", "sequential", #' "clustal", "fasta" or "nexus", or any unambiguous abbreviation of these. #' @param colsep a character used to separate the columns (a single space by #' default). #' @param nbcol a numeric specifying the number of columns per row (-1 by #' default); may be negative implying that the nucleotides are printed on a #' single line. #' @param n Number of sequences. #' @param names Names of sequences. #' @param subset a subset of taxa. #' @param select a subset of characters. #' @param site.pattern select site pattern or sites. #' @param allLevels return original data. #' @param obj as object of class phyDat #' @param freq logical, if 'TRUE', frequencies or counts are returned otherwise #' proportions #' @param all all a logical; if all = TRUE, all counts of bases, ambiguous #' codes, missing data, and alignment gaps are returned as defined in the #' contrast. #' @param drop.unused.levels logical, drop unused levels #' @param incomparables for compatibility with unique. #' @param identical if TRUE (default) sequences have to be identical, if FALSE #' sequences are considered duplicates if distance between sequences is zero #' (happens frequently with ambiguous sites). #' @param ambiguity character for ambiguous character and no contrast is #' provided. #' @param codonstart an integer giving where to start the translation. This #' should be 1, 2, or 3, but larger values are accepted and have for effect to #' start the translation further within the sequence. #' @param ... further arguments passed to or from other methods. #' @return The functions return an object of class \code{phyDat}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{DNAbin}}, \code{\link{as.DNAbin}}, #' \code{\link{read.dna}}, \code{\link{read.aa}}, \code{\link{read.nexus.data}} #' and the chapter 1 in the \code{vignette("phangorn-specials", #' package="phangorn")} and the example of \code{\link{pmlMix}} for the use of #' \code{allSitePattern} #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' class(Laurasiatherian) #' Laurasiatherian #' # base frequencies #' baseFreq(Laurasiatherian) #' baseFreq(Laurasiatherian, all=TRUE) #' baseFreq(Laurasiatherian, freq=TRUE) #' # subsetting phyDat objects #' # the first 5 sequences #' subset(Laurasiatherian, subset=1:5) #' # the first 5 characters #' subset(Laurasiatherian, select=1:5, site.pattern = FALSE) #' # the first 5 site patterns (often more than 5 characters) #' subset(Laurasiatherian, select=1:5, site.pattern = TRUE) #' # transform into old ape format #' LauraChar <- as.character(Laurasiatherian) #' # and back #' Laura <- phyDat(LauraChar) #' all.equal(Laurasiatherian, Laura) #' # Compute all possible site patterns #' # for nucleotides there $4 ^ (number of tips)$ patterns #' allSitePattern(5) #' #' @rdname phyDat #' @export phyDat <- function (data, type="DNA", levels=NULL, return.index = TRUE, ...){ if (inherits(data, "DNAbin")) type <- "DNA" pt <- match.arg(type, c("DNA", "AA", "CODON", "USER")) if(pt=="DNA") dat <- phyDat.DNA(data, return.index=return.index, ...) if(pt=="AA") dat <- phyDat.AA(data, return.index=return.index, ...) if(pt=="CODON") dat <- phyDat.codon(data, return.index=return.index, ...) if(pt=="USER") dat <- phyDat.default(data, levels = levels, return.index=return.index, ...) dat } #' @rdname phyDat #' @export dna2codon <- function(x, codonstart=1, ambiguity="---", ...){ if(!inherits(x, "phyDat"))stop("x needs to be of class phyDat!") if(attr(x, "type")=="AA")stop("x needs to be a nucleotide sequence!") if(codonstart>1){ del <- -seq_len(codonstart) x <- subset(x, select=del, site.pattern=FALSE) } n_sites <- sum(attr(x, "weight")) if( (n_sites %% 3) ){ keep <- seq_len( (n_sites %/% 3) * 3 ) x <- subset(x, select=keep, site.pattern=FALSE) } phyDat.codon(as.character(x), ambiguity=ambiguity, ...) } #' @rdname phyDat #' @export codon2dna <- function(x){ if(!inherits(x, "phyDat"))stop("x needs to be of class phyDat!") phyDat.DNA(as.character(x)) } #' @rdname phyDat #' @export as.phyDat <- function (x, ...){ if (inherits(x, "phyDat")) return(x) UseMethod("as.phyDat") } #' @rdname phyDat #' @method as.phyDat factor #' @export as.phyDat.factor <- function(x, ...){ nam <- names(x) lev <- levels(x) x <- as.character(x) names(x) <- nam phyDat(x, type="USER", levels = lev, ...) } #' @rdname phyDat #' @method as.phyDat DNAbin #' @export as.phyDat.DNAbin <- function(x, ...) phyDat.DNA(x, ...) #' @rdname phyDat #' @method as.phyDat alignment #' @export as.phyDat.alignment <- function (x, type="DNA", ...){ x$seq <- tolower(x$seq) data <- sapply(x$seq, strsplit, "") names(data) <- x$nam if(type=="DNA") dat <- phyDat.DNA(data, ...) if(type=="AA") dat <- phyDat.AA(data, ...) if(type=="CODON") dat <- phyDat.codon(data, ...) if(type=="USER") dat <- phyDat.default(data, ...) dat } #as.alignment.phyDat <- function(x, ...) as.alignment(as.character(x)) #' @rdname phyDat #' @export phyDat2alignment <- function(x){ z <- as.character(x) nam <- rownames(z) type <- attr(x, "type") seq <- switch(type, DNA = tolower(apply(z, 1, paste, collapse="")), AA = toupper(apply(z, 1, paste, collapse=""))) names(seq) <- NULL res <- list(nb=length(seq), nam=nam, seq=seq, com=NA) class(res) <- "alignment" res } #' @rdname phyDat #' @method as.phyDat MultipleAlignment #' @export as.phyDat.MultipleAlignment <- function(x, ...){ if (requireNamespace("Biostrings")){ if(inherits(x, "DNAMultipleAlignment")) res <- phyDat.DNA(Biostrings::as.matrix(x)) if(inherits(x, "RNAMultipleAlignment")) res <- phyDat.DNA(Biostrings::as.matrix(x)) if(inherits(x, "AAMultipleAlignment")) res <- phyDat.AA(Biostrings::as.matrix(x)) return(res) } return(NULL) } # @rdname phyDat #' @export as.MultipleAlignment <- function (x, ...){ if (inherits(x, "MultipleAlignment")) return(x) UseMethod("as.MultipleAlignment") } #' @rdname phyDat #' @export as.MultipleAlignment.phyDat <- function(x, ...){ if (requireNamespace("Biostrings")){ z <- as.character(x) # nam <- rownames(z) type <- attr(x, "type") seq <- switch(type, DNA = tolower(apply(z, 1, paste, collapse="")), AA = toupper(apply(z, 1, paste, collapse=""))) if(type=="DNA") return(Biostrings::DNAMultipleAlignment(seq)) if(type=="AA") return(Biostrings::AAMultipleAlignment(seq)) } return(NULL) } #' @export phyDat2MultipleAlignment <- as.MultipleAlignment.phyDat #' @export as.phyDat.matrix <- function (x, ...) phyDat(data=x, ...) #' @export as.phyDat.character <- function (x, ...) phyDat(data=x, ...) # @rdname phyDat #' @export as.phyDat.data.frame <- function (x, ...) phyDat(data=x, ...) #' @rdname phyDat #' @export acgt2ry <- function(obj){ ac <- c("a", "c", "g", "t", "u", "m", "r", "w", "s", "y", "k", "v", "h", "d", "b", "n", "?", "-") AC <- matrix(c(c(1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1), c(0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1), c(0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1), c(0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1)), 18, 4, dimnames = list(NULL, c("a", "c", "g", "t"))) ry <- AC[c(7, 10), ] RY <- AC %*% t(ry) RY[RY==2] <- 1 dimnames(RY) <- list(NULL, c("r", "y")) attr(obj, "levels") <- c("r", "y") attr(obj, "nc") <- 2 attr(obj, "type") <- "USER" attr(obj, "contrast") <- RY obj <- phyDat.default(as.character(obj, allLevels=FALSE), levels = c("r", "y"), ambiguity = NULL) obj } #' @rdname phyDat #' @export # replace as.character.phyDat weniger Zeilen, works also for codons as.character.phyDat <- function (x, allLevels=TRUE, ...){ nr <- attr(x, "nr") # nc <- attr(x, "nc") type <- attr(x, "type") labels <- attr(x, "allLevels") if (!is.null(attr(x, "index"))) { index <- attr(x, "index") if (is.data.frame(index)) index <- index[, 1] } else index <- rep(1:nr, attr(x, "weight")) if (type == "USER") { #levels in acgt2ry if(!allLevels){ tmp <- attr(x, "levels") contrast <- attr(x, "contrast") contrast[contrast>0] <- 1 ind <- which(rowSums(contrast)==1) contrast[rowSums(contrast)>1, ] <- 0 labels <- rep(NA, length(attr(x, "allLevels"))) labels[ind] <- tmp[contrast%*%c(seq_along(tmp))] } } if(type == "AA") labels <- toupper(labels) if(type == "CODON"){ nr <- length(index) result <- matrix(NA, nrow = length(x), ncol = 3L*nr) labels <- strsplit(labels, "") for (i in seq_along(x)) result[i, ] <- unlist(labels[ x[[i]][index] ]) } else { result <- matrix(NA, nrow = length(x), ncol = nr) for (i in seq_along(x)) result[i, ] <- labels[x[[i]]] result <- result[, index, drop = FALSE] } rownames(result) <- names(x) result } #' @rdname phyDat #' @export as.data.frame.phyDat <- function(x, ...){ nr <- attr(x, "nr") # nc <- attr(x, "nc") labels <- attr(x, "allLevels") if(attr(x, "type") == "AA") labels <- toupper(labels) result <- vector("list", length(x)) if (is.null(attr(x, "index"))) index <- rep(1:nr, attr(x, "weight")) else { index <- attr(x, "index") if (is.data.frame(index)) index <- index[, 1] } for (i in seq_along(x)) result[[i]] <- labels[x[[i]][index]] attr(result, "names") <- names(x) attr(result, "row.names") <- seq_along(index) attr(result, "class") <- "data.frame" result } #' @rdname phyDat #' @export as.DNAbin.phyDat <- function (x, ...){ if(attr(x, "type")=="DNA"){ nr <- attr(x, "nr") ac <- attr(x, "allLevels") result <- matrix(as.raw(0), nrow = length(x), ncol = nr) # from ape ._cs_ cs <- c("a", "g", "c", "t", "r", "m", "w", "s", "k", "y", "v", "h", "d", "b", "n", "-", "?") # from ape ._bs_ bs <- as.raw(c(136, 72, 40, 24, 192, 160, 144, 96, 80, 48, 224, 176, 208, 112, 240, 4, 2)) ord <- match(ac, cs) ord[5] <- 4 for (i in seq_along(x)){ ind <- ord[x[[i]]] result[i,] <- bs[ind] } if (is.null(attr(x, "index"))) index <- rep(1:nr, attr(x, "weight")) else { index <- attr(x, "index") if (is.data.frame(index)) index <- index[, 1] } result <- result[, index, drop = FALSE] rownames(result) <- names(x) class(result) <- "DNAbin" return(result) } else stop("x must be a nucleotide sequence") } #' @rdname phyDat #' @export as.AAbin.phyDat <- function(x,...) { if(attr(x, "type")=="AA") return(as.AAbin(as.character(x, ...))) else stop("x must be a amino acid sequence") } #' @export print.phyDat <- function (x, ...){ cat(length(x), "sequences with",sum(attr(x,"weight")), "character and", attr(x,"nr"),"different site patterns.\n") cat("The states are",attr(x,"levels"), "\n") } # in C++ to replace aggregate or use of distinct from dplyr / data.table aggr <- function(weight, ind){ res <- numeric(max(ind)) for(i in seq_along(weight)) res[ind[i]] <- res[ind[i]] + weight[i] res } # data has to be a data.frame in cbind.phyDat fast.table2 <- function (data){ if(!is.data.frame(data)) data <- as.data.frame(data, stringsAsFactors = FALSE) da <- do.call("paste", data) ind <- !duplicated(da) levels <- da[ind] cat <- factor(da, levels = levels) # nl <- length(levels) bin <- (as.integer(cat) - 1L) bin <- bin[!is.na(bin)] if (length(bin)) bin <- bin + 1L result <- list(index = bin, pos = ind) result } # @rdname phyDat #' @export cbind.phyDat #' @export cbind.phyDat <- function(..., gaps="-", compress=TRUE){ object <- as.list(substitute(list(...)))[-1] x <- list(...) n <- length(x) if (n == 1) return(x[[1]]) # type <- attr(x[[1]], "type") nr <- numeric(n) ATTR <- attributes(x[[1]]) nr[1] <- sum(attr(x[[1]], "weight")) # levels <- attr(x[[1]], "levels") allLevels <- attr(x[[1]], "allLevels") gapsInd <- match(gaps, allLevels) snames <- vector("list", n) vec <- numeric(n+1) wvec <- numeric(n+1) objNames <- as.character(object) if(any(duplicated(objNames))) objNames <- paste0(objNames, 1:n) # tmp <- as.character(x[[1]]) for(i in 1:n){ snames[[i]] <- names(x[[i]]) nr[i] <- sum(attr(x[[i]], "weight")) vec[i+1] <- attr(x[[i]], "nr") wvec[i+1] <- sum(attr(x[[i]], "weight")) } vec <- cumsum(vec) wvec <- cumsum(wvec) snames <- unique(unlist(snames)) weight <- numeric(vec[n+1]) index <- numeric(wvec[n+1]) ATTR$names <- snames ATTR$nr <- vec[n+1] tmp <- matrix(gapsInd, vec[n+1], length(snames), dimnames = list(NULL, snames)) tmp <- as.data.frame(tmp) add.index <- TRUE for(i in 1:n){ nam <- names(x[[i]]) tmp[(vec[i]+1):vec[i+1], nam] <- x[[i]][nam] weight[(vec[i]+1):vec[i+1]] <- attr(x[[i]], "weight") } if(compress){ ddd <- fast.table2(tmp) tmp <- tmp[ddd$pos, ] weight <- aggregate(weight, by=list(ddd$index), FUN=sum)$x } if(any(sapply(x, function(x)is.null(attr(x, "index"))))) add.index <- FALSE if(add.index & compress){ for(i in 1:n){ tmp2 <- attr(x[[i]], "index") if(!is.null(tmp2)){ if(is.data.frame(tmp2))index[(wvec[i]+1):wvec[i+1]] <- ddd$index[(vec[i]+1):vec[i+1]][tmp2[,1]] else index[(wvec[i]+1):wvec[i+1]] <- ddd$index[(vec[i]+1):vec[i+1]][tmp2] } else add.index <- FALSE } } if(add.index) ATTR$index <- data.frame(index = index, genes=rep(objNames, nr)) ATTR$weight <- weight ATTR$nr <- length(weight) attributes(tmp) <- ATTR tmp } # @rdname phyDat #' @export c.phyDat #' @export c.phyDat <- cbind.phyDat #' @rdname phyDat #' @export write.phyDat <- function(x, file, format="phylip", colsep = "", nbcol=-1, ...){ formats <- c("phylip", "nexus", "interleaved", "sequential", "fasta") format <- match.arg(tolower(format), formats) if(format=="nexus"){ type <- attr(x, "type") if(type=="DNA") write.nexus.data(as.list(as.data.frame(x)), file, format = "dna",...) else write.nexus.data(as.list(as.data.frame(x)), file, format = "protein", ...) } else{ if(format=="phylip") format <- "interleaved" write.dna(as.character(x), file, format=format, colsep = colsep, nbcol=nbcol, ...) } } read.fasta.user <- function (file, skip = 0, nlines = 0, comment.char = "#", seq.names = NULL){ getTaxaNames <- function(x) { x <- sub("^ +", "", x) x <- sub(" +$", "", x) x <- sub("^['\"]", "", x) x <- sub("['\"]$", "", x) x } X <- scan(file = file, what = character(), sep = "\n", quiet = TRUE, skip = skip, nlines = nlines, comment.char = comment.char) start <- grep("^ {0,}>", X) taxa <- X[start] n <- length(taxa) obj <- vector("list", n) if (is.null(seq.names)) { taxa <- sub("^ {0,}>", "", taxa) seq.names <- getTaxaNames(taxa) } start <- c(start, length(X) + 1) for (i in 1:n) obj[[i]] <- unlist(strsplit(gsub(" ", "", X[(start[i] + 1):(start[i + 1] - 1)]), NULL)) names(obj) <- seq.names obj <- lapply(obj, tolower) obj } #' @rdname phyDat #' @export read.phyDat <- function(file, format="phylip", type="DNA", ...){ formats <- c("phylip", "nexus", "interleaved", "sequential", "fasta", "clustal") format <- match.arg(tolower(format), formats) if(format=="nexus") data <- read.nexus.data(file, ...) else { if(format=="phylip") format <- "sequential" #"interleaved" if (type == "DNA" || type == "CODON"){ data <- read.dna(file, format, as.character = TRUE, ...) } if (type == "AA") data <- read.aa(file, format=format, ...) if (type == "USER"){ if(format=="fasta") data <- read.fasta.user(file) else data <- read.dna(file, format, as.character = TRUE) extras <- match.call(expand.dots = FALSE)$... extras <- lapply(extras, eval) return(phyDat(data, type, levels=extras$levels, ambiguity = extras$ambiguity, contrast = extras$contrast)) } # raus } if(is.list(data)){ ll <- lengths(data) if(!all(ll == ll[[1]])) stop("sequences have different length") } phyDat(data, type, return.index = TRUE) } #' @rdname phyDat #' @export baseFreq <- function(obj, freq=FALSE, all=FALSE, drop.unused.levels = FALSE){ if (!inherits(obj,"phyDat")) stop("data must be of class phyDat") labels <- attr(obj, "allLevels") weight <- attr(obj,"weight") n <- length(obj) res <- numeric(length(labels)) D <- diag(length(labels)) for(i in 1:n)res <- res + colSums(D[obj[[i]],, drop=FALSE]*weight) names(res) <- labels if(!all) res <- res[attr(obj, "levels")] if(!freq)res <- res/sum(res) if(drop.unused.levels) return(res[res>0]) res } phylo <- function(edge, tip, edge.length=NULL){ res <- list(edge=edge, tip.label=tip, edge.length=edge.length) class(res) <- "phylo" res } getCols <- function (data, cols){ attrib <- attributes(data) attr(data, "class") <- "list" data <- data[cols] if (is.character(cols)) attrib$names <- cols else attrib$names <- attrib$names[cols] attributes(data) <- attrib attr(data, "class") <- "phyDat" data } getRows <- function (data, rows, site.pattern = TRUE){ index <- attr(data, "index") if(is.data.frame(index))index <- index[,1] if(!site.pattern){ weight <- tabulate(index[rows]) ind <- which(weight>0) # update index new_index <- integer(length(weight)) new_index[ind] <- seq_along(ind) attr(data, "index") <- new_index[index[rows]] rows <- ind # rows[ind] weight <- weight[ind] } for (i in seq_along(data)){ if(is.matrix(data[[i]]))data[[i]] <- data[[i]][rows, ] else data[[i]] <- data[[i]][rows] } attr(data, "weight") <- attr(data, "weight")[rows] if(!site.pattern) attr(data, "weight") <- weight attr(data, "nr") <- length(attr(data, "weight")) if(site.pattern)attr(data, "index") <- NULL data } #' @rdname phyDat #' @method subset phyDat #' @export subset.phyDat <- function (x, subset, select, site.pattern = TRUE,...){ if (!missing(subset)) x <- getCols(x, subset) if (!missing(select)){ if(any(is.na(select))) return(NULL) x <- getRows(x, select, site.pattern=site.pattern) } x } ## Needs testing that it is not used e.g. prepareDataFitch returns no class #' @param i,j indices of the rows and/or columns to select or to drop. They #' may be numeric, logical, or character (in the same way than for standard R #' objects). #' @param drop for compatibility with the generic (unused). #' @rdname phyDat #' @export "[.phyDat" <- function(x, i, j, ..., drop=FALSE){ subset(x, subset = i, select = j, site.pattern=FALSE) } #' @rdname phangorn-internal #' @export map_duplicates <- function(x, dist=TRUE, ...){ labels <- names(x) if(dist){ y <- as.matrix(dist.hamming(x, FALSE)) l <- nrow(y) z <- character(l) for(i in seq_len(l)) z[i] <- paste( round(y[i, ], 8), collapse="_") ind <- duplicated(z) } else ind <- duplicated(x) res <- NULL if(any(ind)){ if(dist) ind2 <- match(z[ind], z) else ind2 <- match(x[ind], x) res <- data.frame(duplicates=labels[ind], where=labels[ind2], stringsAsFactors = FALSE) } res } #duplicated_phyDat <- function(x, ...){ # tmp <- map_duplicates(x)[,1] # getCols(x, setdiff(names(x), tmp)) #} #' @rdname phyDat #' @method unique phyDat #' @export unique.phyDat <- function(x, incomparables=FALSE, identical=TRUE, ...){ if(identical) return(getCols(x, !duplicated(x))) tmp <- map_duplicates(x)[,1] getCols(x, setdiff(names(x), tmp)) } #' @rdname phyDat #' @export removeUndeterminedSites <- function(x, ...){ # , use.contrast=TRUE, undetermined=c("?", "n", "-") nc <- attr(x, "nc") nr <- attr(x, "nr") contrast <- attr(x, "contrast") # if(use.contrast) ind <- which( (contrast %*% rep(1, nc)) == nc ) # else ind <- sort(match(undetermined, attr(x, "allLevels"))) tmp <- x[[1]] %in% ind for(i in 2:length(x)) tmp <- tmp & (x[[i]] %in% ind) if(any(tmp)) x <- getRows(x, (1:nr)[!tmp]) x } removeParsUninfoSites <- function(data){ nr <- attr(data, "nr") pis <- parsinfo(data) if (length(pis) > 0){ p0 <- sum(attr(data, "weight")[pis[, 1]] * pis[, 2]) data <- getRows(data, c(1:nr)[-pis[, 1]], TRUE) } else p0 <- 0 if(length(attr(data, "p0"))) p0 <- p0 + attr(data, "p0") attr(data, "p0") <- p0 data } #' @rdname phyDat #' @export allSitePattern <- function(n, levels=c("a", "c", "g", "t"), names=NULL){ l <- length(levels) X <- vector("list", n) if(is.null(names))names(X) <- paste0("t", 1:n) else names(X) <- names for(i in 1:n) X[[i]] <- rep(rep(levels, each=l^(i-1)), l^(n-i)) X <- as.data.frame(X) phyDat.default(X, levels, compress=FALSE, return.index=FALSE) } constSitePattern <- function(n, levels=c("a", "c", "g", "t"), names=NULL){ l <- length(levels) X <- matrix(0, l, n) X <- matrix(rep(levels, each=n), n, l) if(is.null(names))rownames(X) <- paste0("t", 1:n) else rownames(X) <- names phyDat.default(X, levels) } #' Read Amino Acid Sequences in a File #' #' This function reads amino acid sequences in a file, and returns a matrix #' list of DNA sequences with the names of the taxa read in the file as row #' names. #' #' #' @param file a file name specified by either a variable of mode character, or #' a double-quoted string. #' @param format a character string specifying the format of the DNA sequences. #' Three choices are possible: \code{"interleaved"}, \code{"sequential"}, or #' \code{"fasta"}, or any unambiguous abbreviation of these. #' @param skip the number of lines of the input file to skip before beginning #' to read data. #' @param nlines the number of lines to be read (by default the file is read #' until its end). #' @param comment.char a single character, the remaining of the line after this #' character is ignored. #' @param seq.names the names to give to each sequence; by default the names #' read in the file are used. #' @return a matrix of amino acid sequences. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[ape]{read.dna}}, \code{\link[ape]{read.GenBank}}, #' \code{\link[phangorn]{phyDat}}, \code{\link[seqinr]{read.alignment}} #' @references % Anonymous. FASTA format description. % #' \url{https://www.ncbi.nlm.nih.gov/blast/fasta.shtml} Felsenstein, J. (1993) #' Phylip (Phylogeny Inference Package) version 3.5c. Department of Genetics, #' University of Washington. #' \url{http://evolution.genetics.washington.edu/phylip/phylip.html} #' @keywords IO #' @export read.aa read.aa <- function (file, format = "interleaved", skip = 0, nlines = 0, comment.char = "#", seq.names = NULL){ getTaxaNames <- function(x) { x <- sub("^ +", "", x) x <- sub(" +$", "", x) x <- sub("^['\"]", "", x) x <- sub("['\"]$", "", x) x } format <- match.arg(format, c("interleaved", "sequential", "fasta")) phylip <- if (format %in% c("interleaved", "sequential")) TRUE else FALSE if (format == "fasta") { obj <- read.FASTA(file, type = "AA") return(obj) } X <- scan(file = file, what = character(), sep = "\n", quiet = TRUE, skip = skip, nlines = nlines, comment.char = comment.char) if (phylip) { fl <- X[1] oop <- options(warn = -1) fl.num <- as.numeric(unlist(strsplit(gsub("^ +", "", fl), " +"))) options(oop) if (all(is.na(fl.num))) stop("the first line of the file must contain the dimensions of the data") if (length(fl.num) != 2) stop("the first line of the file must contain TWO numbers") else { n <- fl.num[1] s <- fl.num[2] } X <- X[-1] obj <- vector("character", n * s) dim(obj) <- c(n, s) } if (format == "interleaved") { fl <- X[1] fl <- unlist(strsplit(fl, NULL)) bases <- grep("[-AaRrNnDdCcQqEeGgHhIiLlKkMmFfPpSsTtWwYyVvBbZzXx?]", fl) z <- diff(bases) for (i in seq_along(z)) if (all(z[i:(i + 8)] == 1)) break start.seq <- bases[i] if (is.null(seq.names)) seq.names <- getTaxaNames(substr(X[1:n], 1, start.seq - 1)) X[1:n] <- substr(X[1:n], start.seq, nchar(X[1:n])) X <- gsub(" ", "", X) nl <- length(X) for (i in 1:n) obj[i, ] <- unlist(strsplit(X[seq(i, nl, n)], NULL)) } if (format == "sequential") { fl <- X[1] taxa <- character(n) j <- 1 for (i in 1:n) { bases <- grep("[-AaRrNnDdCcQqEeGgHhIiLlKkMmFfPpSsTtWwYyVvBbZzXx?]", unlist(strsplit(X[j], NULL))) z <- diff(bases) for (k in seq_along(z)) if (all(z[k:(k + 8)] == 1)) break start.seq <- bases[k] taxa[i] <- substr(X[j], 1, start.seq - 1) sequ <- substr(X[j], start.seq, nchar(X[j])) sequ <- gsub(" ", "", sequ) j <- j + 1 while (nchar(sequ) < s) { sequ <- paste0(sequ, gsub(" ", "", X[j])) j <- j + 1 } obj[i, ] <- unlist(strsplit(sequ, NULL)) } if (is.null(seq.names)) seq.names <- getTaxaNames(taxa) } if (phylip) { rownames(obj) <- seq.names obj <- tolower(obj) } else { names(obj) <- seq.names obj <- lapply(obj, tolower) } obj } #' @rdname phyDat #' @export genlight2phyDat <- function(x, ambiguity=NA){ tmp <- as.matrix(x) lev <- na.omit(unique(as.vector(tmp))) phyDat(tmp, "USER", levels=lev, ambiguity=ambiguity) } #' @rdname phyDat #' @method image phyDat #' @export image.phyDat <- function(x, ...){ if(attr(x, "type") == "AA") image(as.AAbin(x), ...) if(attr(x, "type") == "DNA") image(as.DNAbin(x), ...) else return(NULL) } phangorn/R/splitsNetwork.R0000644000176200001440000001021513475602650015311 0ustar liggesusers#' Phylogenetic Network #' #' \code{splitsNetwork} estimates weights for a splits graph from a distance #' matrix. #' #' \code{splitsNetwork} fits non-negative least-squares phylogenetic networks #' using L1 (LASSO), L2(ridge regression) constraints. The function minimizes #' the penalized least squares #' \deqn{\beta = min \sum(dm - X\beta)^2 + \lambda \|\beta \|^2_2 }{ beta = sum(dm - X*beta)^2 + lambda |beta|^2_2 } #' with respect to \deqn{\|\beta \|_1 <= \gamma, \beta >= 0}{ |beta|_1 = gamma, beta >= 0} #' where \eqn{X} is a design matrix constructed with \code{designSplits}. #' External edges are fitted without L1 or L2 constraints. #' #' @param dm A distance matrix. #' @param splits a splits object, containing all splits to consider, otherwise #' all possible splits are used #' @param gamma penalty value for the L1 constraint. #' @param lambda penalty value for the L2 constraint. #' @param weight a vector of weights. #' @return \code{splitsNetwork} returns a splits object with a matrix added. #' The first column contains the indices of the splits, the second column an #' unconstrained fit without penalty terms and the third column the constrained #' fit. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[phangorn]{distanceHadamard}}, #' \code{\link[phangorn]{designTree}} \code{\link[phangorn]{consensusNet}}, #' \code{\link[phangorn]{plot.networx}} #' @references Efron, Hastie, Johnstone and Tibshirani (2004) Least Angle #' Regression (with discussion) \emph{Annals of Statistics} \bold{32(2)}, 407--499 #' #' K. P. Schliep (2009). Some Applications of statistical phylogenetics (PhD #' Thesis) #' @keywords cluster #' @importFrom Matrix sparseMatrix #' @importFrom quadprog solve.QP #' @examples #' #' data(yeast) #' dm <- dist.ml(yeast) #' fit <- splitsNetwork(dm) #' net <- as.networx(fit) #' plot(net, "2D") #' write.nexus.splits(fit) #' #' @export splitsNetwork splitsNetwork <- function(dm, splits = NULL, gamma = .1, lambda = 1e-6, weight = NULL) { dm <- as.matrix(dm) k <- dim(dm)[1] if (!is.null(splits)) { tmp <- which(lengths(splits) == k) splits <- splits[-tmp] lab <- attr(splits, "labels") dm <- dm[lab, lab] } if (is.null(splits)) { X2 <- designAll(k, TRUE) X <- X2[[1]] } else X <- as.matrix(splits2design(splits)) y <- dm[lower.tri(dm)] if (is.null(splits)) ind <- c(2^(0:(k - 2)), 2^(k - 1) - 1) else ind <- which(lengths(splits) == 1) # else ind = which(sapply(splits, length)==1) # y2 = lm(y~X[,ind]-1)$res n <- dim(X)[2] ridge <- lambda * diag(n) ridge[ind, ind] <- 0 if (!is.null(weight)) Dmat <- crossprod(X * sqrt(weight)) + ridge else Dmat <- crossprod(X) + ridge if (!is.null(weight)) dvec <- crossprod(X * sqrt(weight), y * sqrt(weight)) else dvec <- crossprod(X, y) ind1 <- rep(1, n) ind1[ind] <- 0 Amat <- cbind(ind1, diag(n)) bvec <- c(gamma, rep(0, n)) # needs quadprog::solve.QP.compact solution <- quadprog::solve.QP(Dmat, dvec, Amat, bvec = bvec, meq = 1)$sol ind2 <- which(solution > 1e-8) n2 <- length(ind2) ind3 <- which(duplicated(c(ind2, ind), fromLast = TRUE)[1:n2]) ridge2 <- lambda * diag(n2) ridge2[ind3, ind3] <- 0 if (!is.null(weight)) Dmat <- crossprod(X[, ind2] * sqrt(weight)) + ridge2 else Dmat <- crossprod(X[, ind2]) + ridge2 if (!is.null(weight)) dvec <- crossprod(X[, ind2] * sqrt(weight), y * sqrt(weight)) else dvec <- crossprod(X[, ind2], y) Amat2 <- diag(n2) bvec2 <- rep(0, n2) # needs quadprog::solve.QP.compact # bvec2 not used solution2 <- quadprog::solve.QP(Dmat, dvec, Amat2)$sol RSS1 <- sum( (y - X[, ind2] %*% solution[ind2])^2) RSS2 <- sum( (y - X[, ind2] %*% solution2)^2) if (is.null(splits)) { splits <- vector("list", length(ind2)) for (i in seq_along(ind2)) splits[[i]] <- which(X2[[2]][ind2[i], ] == 1) } else splits <- splits[ind2] attr(splits, "weights") <- solution[ind2] attr(splits, "unrestricted") <- solution2 attr(splits, "stats") <- c(df = n2, RSS_p = RSS1, RSS_u = RSS2) attr(splits, "labels") <- dimnames(dm)[[1]] class(splits) <- "splits" return(splits) } phangorn/R/fitch.R0000644000176200001440000005140413475602650013523 0ustar liggesusers#' @rdname parsimony #' @export fitch <- function(tree, data, site = "pscore") { if (!inherits(data, "phyDat")) stop("data must be of class phyDat") if (any(!is.binary(tree))) stop("Tree must be binary!") if (inherits(tree, "multiPhylo")) { TL <- attr(tree, "TipLabel") if (!is.null(TL)) { data <- subset(data, TL) nTips <- length(TL) weight <- attr(data, "weight") nr <- attr(data, "nr") m <- nr * (2L * nTips - 1L) } } data <- prepareDataFitch(data) d <- attributes(data) data <- as.integer(data) attributes(data) <- d if (inherits(tree, "phylo")) return(fit.fitch(tree, data, site)) else { if (is.null(attr(tree, "TipLabel"))) { tree <- unclass(tree) return(sapply(tree, fit.fitch, data, site)) } else { tree <- .uncompressTipLabel(tree) tree <- unclass(tree) tree <- lapply(tree, reorder, "postorder") site <- ifelse(site == "pscore", 1L, 0L) on.exit(.C("fitch_free")) .C("fitch_init", as.integer(data), as.integer(nTips * nr), as.integer(m), as.double(weight), as.integer(nr)) return(sapply(tree, fast.fitch, nr, site)) } } } fit.fitch <- function(tree, data, returnData = c("pscore", "site", "data")) { if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") returnData <- match.arg(returnData) nr <- attr(data, "nr") node <- tree$edge[, 1] edge <- tree$edge[, 2] weight <- attr(data, "weight") m <- max(tree$edge) q <- length(tree$tip.label) result <- .Call("FITCH", data[, tree$tip.label], as.integer(nr), as.integer(node), as.integer(edge), as.integer(length(edge)), as.double(weight), as.integer(m), as.integer(q)) if (returnData == "site") return(result[[2]]) pscore <- result[[1]] res <- pscore if (returnData == "data") res <- list(pscore = pscore, dat = result[[3]], site = result[[2]]) res } # NNI fnodesNew2 <- function(EDGE, nTips, nr) { node <- EDGE[, 1] edge <- EDGE[, 2] n <- length(node) m <- as.integer(max(EDGE) + 1L) m2 <- 2L * n root0 <- as.integer(node[n]) .Call("FNALL_NNI", as.integer(nr), node, edge, as.integer(n), as.integer(m), as.integer(m2), as.integer(root0)) } # SPR und bab kompakter fnodesNew5 <- function(EDGE, nTips, nr, m = as.integer(max(EDGE) + 1L)) { node <- EDGE[, 1] # in C edge <- EDGE[, 2] # in C n <- length(node) # in C m2 <- 2L * n # in C root0 <- as.integer(node[n]) # in C .Call("FNALL5", as.integer(nr), node, edge, as.integer(n), as.integer(m), as.integer(m2), as.integer(root0), PACKAGE = "phangorn") } #' @rdname parsimony #' @export random.addition <- function(data, method = "fitch") { label <- names(data) nTips <- as.integer(length(label)) remaining <- as.integer(sample(nTips)) tree <- structure(list(edge = structure(c(rep(nTips + 1L, 3), remaining[1:3]), .Dim = c(3L, 2L)), tip.label = label, Nnode = 1L), .Names = c("edge", "tip.label", "Nnode"), class = "phylo", order = "postorder") remaining <- remaining[-c(1:3)] if (nTips == 3L) return(tree) nr <- attr(data, "nr") storage.mode(nr) <- "integer" # n <- length(data) #- 1L data <- subset(data, select = order(attr(data, "weight"), decreasing = TRUE)) data <- prepareDataFitch(data) weight <- attr(data, "weight") m <- nr * (2L * nTips - 2L) on.exit(.C("fitch_free")) .C("fitch_init", as.integer(data), as.integer(nTips * nr), as.integer(m), as.double(weight), as.integer(nr)) storage.mode(weight) <- "double" for (i in remaining) { edge <- tree$edge[, 2] score <- fnodesNew5(tree$edge, nTips, nr)[edge] score <- .Call("FITCHTRIP3", as.integer(i), as.integer(nr), as.integer(edge), as.double(score), as.double(Inf)) res <- min(score) nt <- which.min(score) tree <- addOne(tree, i, nt) } attr(tree, "pscore") <- res tree } fast.fitch <- function(tree, nr, ps = TRUE) { node <- tree$edge[, 1] edge <- tree$edge[, 2] m <- max(tree$edge) .Call("FITCH345", as.integer(nr), as.integer(node), as.integer(edge), as.integer(length(edge)), as.integer(m), as.integer(ps)) } fitch.spr <- function(tree, data) { nTips <- as.integer(length(tree$tip.label)) nr <- attr(data, "nr") minp <- fast.fitch(tree, nr, TRUE) m <- max(tree$edge) for (i in 1:nTips) { treetmp <- dropTip(tree, i) edge <- treetmp$edge[, 2] # score = fnodesNew5(treetmp$edge, nTips, nr)[edge] score <- .Call("FNALL6", as.integer(nr), treetmp$edge[, 1], edge, as.integer(m + 1L), PACKAGE = "phangorn")[edge] score <- .Call("FITCHTRIP3", as.integer(i), as.integer(nr), as.integer(edge), as.double(score), as.double(minp)) if (min(score) < minp) { nt <- which.min(score) tree <- addOne(treetmp, i, nt) minp <- min(score) } } root <- getRoot(tree) ch <- allChildren(tree) for (i in (nTips + 1L):m) { if (i != root) { tmp <- dropNode(tree, i, all.ch = ch) if (!is.null(tmp)) { edge <- tmp[[1]]$edge[, 2] blub <- fast.fitch(tmp[[2]], nr, TRUE) score <- .Call("FNALL6", as.integer(nr), tmp[[1]]$edge[, 1], edge, as.integer(m + 1L), PACKAGE = "phangorn")[edge] + blub # score = fnodesNew5(tmp[[1]]$edge, nTips, nr)[edge] + blub score <- .Call("FITCHTRIP3", as.integer(i), as.integer(nr), as.integer(edge), as.double(score), as.double(minp)) if (min(score) < minp) { nt <- which.min(score) tree <- addOneTree(tmp[[1]], tmp[[2]], nt, tmp[[3]]) minp <- min(score) ch <- allChildren(tree) } } } } tree } indexNNI2 <- function(tree) { parent <- tree$edge[, 1] child <- tree$edge[, 2] ind <- which(child %in% parent) edgeMatrix <- matrix(0L, 6, length(ind)) pvector <- integer(max(parent)) pvector[child] <- parent cvector <- allChildren(tree) k <- 0 for (i in ind) { p1 <- parent[i] p2 <- child[i] e34 <- cvector[[p2]] ind1 <- cvector[[p1]] e12 <- ind1[ind1 != p2] if (pvector[p1]) edgeMatrix[, k + 1] <- c(p1, e12, e34, p2, 1L) else edgeMatrix[, k + 1] <- c(e12, e34, p2, 0L) k <- k + 1 } cbind(edgeMatrix[c(1, 3, 2, 4, 5, 6), ], edgeMatrix[c(1, 4, 2, 3, 5, 6), ]) } # nr statt data uebergeben, fitchQuartet ohne weight # weniger Speicher 2 Zeilen weinger fitch.nni <- function(tree, data, ...) { nTips <- as.integer(length(tree$tip.label)) # auskommentieren? INDEX <- indexNNI2(tree) nr <- attr(data, "nr") weight <- attr(data, "weight") p0 <- fast.fitch(tree, nr) m <- dim(INDEX)[2] tmp <- fnodesNew2(tree$edge, nTips, nr) pscore <- .C("fitchQuartet", as.integer(INDEX), as.integer(m), as.integer(nr), as.double(tmp[[1]]), as.double(tmp[[2]]), as.double(weight), double(m))[[7]] swap <- 0 candidates <- pscore < p0 while (any(candidates)) { ind <- which.min(pscore) pscore[ind] <- Inf tree2 <- changeEdge(tree, INDEX[c(2, 3), ind]) test <- fast.fitch(tree2, nr) if (test >= p0) candidates[ind] <- FALSE if (test < p0) { p0 <- test swap <- swap + 1 tree <- tree2 indi <- which(INDEX[5, ] %in% INDEX[1:5, ind]) candidates[indi] <- FALSE pscore[indi] <- Inf } } list(tree = tree, pscore = p0, swap = swap) } optim.fitch <- function(tree, data, trace = 1, rearrangements = "SPR", ...) { if (!inherits(tree, "phylo")) stop("tree must be of class phylo") if (!is.binary(tree)) { tree <- multi2di(tree) attr(tree, "order") <- NULL } if (is.rooted(tree)) { tree <- unroot(tree) attr(tree, "order") <- NULL } if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") if (class(data)[1] != "phyDat") stop("data must be of class phyDat") # stop early for n=3 or 4 # if(rt)tree <- ptree(tree, data) # attr(tree, "pscore") <- pscore + p0 # tree rt <- FALSE dup_list <- NULL addTaxa <- FALSE tmp <- TRUE star_tree <- FALSE # recursive remove parsimonious uniformative sites and # identical sequences while (tmp) { nam <- names(data) data <- removeParsUninfoSites(data) p0 <- attr(data, "p0") if (attr(data, "nr") == 0) { star_tree <- TRUE break() tmp <- FALSE } # unique sequences dup <- map_duplicates(data) if (!is.null(dup)) { tree <- drop.tip(tree, dup[, 1]) if(length(tree$tip.label) > 2) tree <- unroot(tree) tree <- reorder(tree, "postorder") dup_list <- c(list(dup), dup_list) addTaxa <- TRUE data <- subset(data, setdiff(names(data), dup[, 1])) } else break() # tmp <- FALSE } nr <- attr(data, "nr") nTips <- as.integer(length(tree$tip.label)) if(nTips < 5) rearrangements <- "NNI" data <- subset(data, tree$tip.label, order(attr(data, "weight"), decreasing = TRUE)) dat <- prepareDataFitch(data) weight <- attr(data, "weight") m <- nr * (2L * nTips - 2L) on.exit({ .C("fitch_free") if (addTaxa) { if (rt) tree <- ptree(tree, data) for (i in seq_along(dup_list)) { dup <- dup_list[[i]] tree <- add.tips(tree, dup[, 1], dup[, 2]) } tree } if(length(tree$tip.label) > 2) tree <- unroot(tree) attr(tree, "pscore") <- pscore + p0 return(tree) }) .C("fitch_init", as.integer(dat), as.integer(nTips * nr), as.integer(m), as.double(weight), as.integer(nr)) tree$edge.length <- NULL swap <- 0 iter <- TRUE if(nTips < 4) iter <- FALSE pscore <- fast.fitch(tree, nr) while (iter) { res <- fitch.nni(tree, dat, ...) tree <- res$tree if (trace > 1) cat("optimize topology: ", pscore + p0, "-->", res$pscore + p0, "\n") pscore <- res$pscore swap <- swap + res$swap if (res$swap == 0) { if (rearrangements == "SPR") { tree <- fitch.spr(tree, dat) psc <- fast.fitch(tree, nr) if (trace > 1) cat("optimize topology (SPR): ", pscore + p0, "-->", psc + p0, "\n") if (pscore < psc + 1e-6) iter <- FALSE pscore <- psc } else iter <- FALSE } } if (trace > 0) cat("Final p-score", pscore + p0, "after ", swap, "nni operations \n") } # branch and bound getOrder <- function(x) { label <- names(x) dm <- as.matrix(dist.hamming(x, FALSE)) ind <- as.vector(which(dm == max(dm), arr.ind = TRUE)[1, ]) nTips <- as.integer(length(label)) added <- ind remaining <- c(1:nTips)[-ind] tree <- structure(list(edge = structure(c(rep(nTips + 1L, 3), c(ind, 0L)), .Dim = c(3L, 2L)), tip.label = label, Nnode = 1L), .Names = c("edge", "tip.label", "Nnode"), class = "phylo", order = "postorder") l <- length(remaining) res <- numeric(l) nr <- attr(x, "nr") storage.mode(nr) <- "integer" n <- length(x) #- 1L data <- prepareDataFitch(x) weight <- attr(data, "weight") storage.mode(weight) <- "double" m <- nr * (2L * nTips - 2L) on.exit(.C("fitch_free")) .C("fitch_init", as.integer(data), as.integer(nTips * nr), as.integer(m), as.double(weight), as.integer(nr)) for (i in seq_along(remaining)) { tree$edge[3, 2] <- remaining[i] res[i] <- fast.fitch(tree, nr) } tmp <- which.max(res) added <- c(added, remaining[tmp]) remaining <- remaining[-tmp] tree$edge[, 2] <- added # for (i in 4:(nTips - 1L)) { while (length(remaining) > 0) { edge <- tree$edge[, 2] score0 <- fnodesNew5(tree$edge, nTips, nr)[edge] l <- length(remaining) res <- numeric(l) nt <- numeric(l) # k <- length(added) + 1L for (j in 1:l) { score <- .Call("FITCHTRIP3", as.integer(remaining[j]), as.integer(nr), as.integer(edge), as.double(score0), as.double(Inf)) # score = score0[edge] + psc res[j] <- min(score) nt[j] <- which.min(score) } tmp <- which.max(res) added <- c(added, remaining[tmp]) tree <- addOne(tree, remaining[tmp], nt[tmp]) remaining <- remaining[-tmp] } added <- c(added, remaining) added } #' Branch and bound for finding all most parsimonious trees #' #' \code{bab} finds all most parsimonious trees. #' #' This implementation is very slow and depending on the data may take very #' long time. In the worst case all (2n-5)!! possible trees have to be #' examined. For 10 species there are already 2027025 tip-labelled unrooted #' trees. It only uses some basic strategies to find a lower and upper bounds #' similar to penny from phylip. It uses a very basic heuristic approach of #' MinMax Squeeze (Holland et al. 2005) to improve the lower bound. On the #' positive side \code{bab} is not like many other implementations restricted #' to binary or nucleotide data. #' #' @aliases bab BranchAndBound #' @param data an object of class phyDat. #' @param tree a phylogenetic tree an object of class phylo, otherwise a #' pratchet search is performed. #' @param trace defines how much information is printed during optimisation. #' @param \dots Further arguments passed to or from other methods #' @return \code{bab} returns all most parsimonious trees in an object of class #' \code{multiPhylo}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} based on work on Liam #' Revell #' @seealso \code{\link{pratchet}}, \code{\link{dfactorial}} #' @references Hendy, M.D. and Penny D. (1982) Branch and bound algorithms to #' determine minimal evolutionary trees. \emph{Math. Biosc.} \bold{59}, #' 277-290 #' #' Holland, B.R., Huber, K.T. Penny, D. and Moulton, V. (2005) The MinMax #' Squeeze: Guaranteeing a Minimal Tree for Population Data, \emph{Molecular #' Biology and Evolution}, \bold{22}, 235--242 #' #' White, W.T. and Holland, B.R. (2011) Faster exact maximum parsimony search #' with XMP. \emph{Bioinformatics}, \bold{27(10)},1359--1367 #' @keywords cluster #' @examples #' #' data(yeast) #' dfactorial(11) #' # choose only the first two genes #' gene12 <- subset(yeast, , 1:3158, site.pattern=FALSE) #' trees <- bab(gene12) #' #' @export bab bab <- function(data, tree = NULL, trace = 1, ...) { if (!is.null(tree)) data <- subset(data, tree$tip.label) pBound <- TRUE nTips <- length(data) if (nTips < 4) return(stree(nTips, tip.label = names(data))) dup_list <- NULL addTaxa <- FALSE tmp <- TRUE star_tree <- FALSE while (tmp) { nam <- names(data) data <- removeParsUninfoSites(data) p0 <- attr(data, "p0") if (attr(data, "nr") == 0) { star_tree <- FALSE break() tmp <- FALSE } # unique sequences dup <- map_duplicates(data) if (!is.null(dup)) { dup_list <- c(list(dup), dup_list) addTaxa <- TRUE data <- subset(data, setdiff(names(data), dup[, 1])) } else tmp <- FALSE } # star tree # if(attr(data, "nr") == 0) return(stree(nTips, tip.label = names(data))) nTips <- length(data) if (nTips < 4L || star_tree) { if (star_tree) tree <- stree(length(nam), tip.label = nam) else tree <- stree(nTips, tip.label = names(data)) for (i in seq_along(dup_list)) { dup <- dup_list[[i]] tree <- add.tips(tree, dup[, 1], dup[, 2]) } return(tree) } # compress sequences (all transitions count equal) data <- compressSites(data) o <- order(attr(data, "weight"), decreasing = TRUE) data <- subset(data, select = o) tree <- pratchet(data, start = tree, trace = trace - 1, ...) data <- subset(data, tree$tip.label) nr <- as.integer(attr(data, "nr")) inord <- getOrder(data) # lb <- lowerBound(data) nTips <- m <- length(data) nr <- as.integer(attr(data, "nr")) TMP <- UB <- matrix(0, m, nr) for (i in 4:m) { TMP[i, ] <- lowerBound(subset(data, inord[1:i])) UB[i, ] <- upperBound(subset(data, inord[1:i])) } dat_used <- subset(data, inord) weight <- as.double(attr(data, "weight")) data <- prepareDataFitch(data) m <- nr * (2L * nTips - 2L) # spaeter on.exit(.C("fitch_free")) .C("fitch_init", as.integer(data), as.integer(nTips * nr), as.integer(m), as.double(weight), as.integer(nr)) mmsAmb <- 0 mmsAmb <- TMP %*% weight mmsAmb <- mmsAmb[nTips] - mmsAmb mms0 <- 0 if (pBound) mms0 <- pBound(dat_used, UB) mms0 <- mms0 + mmsAmb minPars <- mms0[1] kPars <- 0 if (trace) print(paste("lower bound:", p0 + mms0[1])) bound <- fast.fitch(tree, nr) if (trace) print(paste("upper bound:", bound + p0)) startTree <- structure(list(edge = structure(c(rep(nTips + 1L, 3), as.integer(inord)[1:3]), .Dim = c(3L, 2L)), tip.label = tree$tip.label, Nnode = 1L), .Names = c("edge", "tip.label", "Nnode"), class = "phylo", order = "postorder") trees <- vector("list", nTips) trees[[3]] <- list(startTree$edge) for (i in 4:nTips) trees[[i]] <- vector("list", (2L * i) - 5L) # new # index M[i] is neues node fuer edge i+1 # index L[i] is length(node) tree mit i+1 L <- as.integer(2L * (1L:nTips) - 3L) M <- as.integer(1L:nTips + nTips - 1L) PSC <- matrix(c(3, 1, 0), 1, 3) PSC[1, 3] <- fast.fitch(startTree, nr) k <- 4L Nnode <- 1L npsc <- 1 blub <- numeric(nTips) result <- list() while (npsc > 0) { a <- PSC[npsc, 1] b <- PSC[npsc, 2] PSC <- PSC[-npsc, , drop = FALSE] npsc <- npsc - 1L tmpTree <- trees[[a]][[b]] edge <- tmpTree[, 2] score <- fnodesNew5(tmpTree, nTips, nr, M[a])[edge] + mms0[a + 1L] score <- .Call("FITCHTRIP3", as.integer(inord[a + 1L]), as.integer(nr), as.integer(edge), as.double(score), as.double(bound), PACKAGE = "phangorn") ms <- min(score) if (ms <= bound) { if ((a + 1L) < nTips) { ind <- (1:L[a])[score <= bound] trees[[a + 1]][seq_along(ind)] <- .Call("AddOnes", tmpTree, as.integer(inord[a + 1L]), as.integer(ind), as.integer(L[a]), as.integer(M[a]), PACKAGE = "phangorn") l <- length(ind) # os <- order(score[ind], decreasing=TRUE) os <- seq_len(l) # in C pushback PSC <- rbind(PSC, cbind(rep(a + 1, l), os, score[ind])) npsc <- npsc + l blub[a] <- blub[a] + l # PSC = rbind(PSC, cbind(rep(a+1, l), os, score[ind][os] )) } else { ind <- which(score == ms) tmp <- vector("list", length(ind)) tmp[seq_along(ind)] <- .Call("AddOnes", tmpTree, as.integer(inord[a + 1L]), as.integer(ind), as.integer(L[a]), as.integer(M[a]), PACKAGE = "phangorn") if (ms < bound) { bound <- ms if (trace) cat("upper bound:", bound + p0, "\n") result <- tmp PSC <- PSC[PSC[, 3] < (bound + 1e-8), ] npsc <- nrow(PSC) } else result <- c(result, tmp) } } } for (i in seq_along(result)) { result[[i]] <- structure(list(edge = result[[i]], Nnode = nTips - 2L), .Names = c("edge", "Nnode"), class = "phylo", order = "postorder") } attr(result, "TipLabel") <- tree$tip.label # attr(result, "visited") = blub class(result) <- "multiPhylo" if (addTaxa) { result <- .uncompressTipLabel(result) class(result) <- NULL for (i in seq_along(dup_list)) { dup <- dup_list[[i]] result <- lapply(result, add.tips, dup[, 1], dup[, 2]) } class(result) <- "multiPhylo" result <- .compressTipLabel(result) } return(result) } pBound <- function(x, UB) { tip <- names(x) att <- attributes(x) nc <- attr(x, "nc") nr <- attr(x, "nr") contrast <- attr(x, "contrast") rownames(contrast) <- attr(x, "allLevels") colnames(contrast) <- attr(x, "levels") weight0 <- attr(x, "weight") attr(x, "weight") <- rep(1, nr) attr(x, "index") <- NULL y <- as.character(x) # states <- apply(y, 2, unique.default) # singles <- match(attr(x, "levels"), attr(x, "allLevels")) singles <- attr(x, "levels") fun2 <- function(x, singles) all(x %in% singles) fun1 <- function(x) {cumsum(!duplicated(x)) - 1L} tmp <- apply(y, 2, fun2, singles) ind <- which(tmp) if (length(ind) < 2) return(numeric(nTips)) y <- y[, ind, drop = FALSE] weight0 <- weight0[ind] UB <- UB[, ind, drop = FALSE] single_dis <- apply(y, 2, fun1) # single_dis <- lowerBound nTips <- nrow(y) l <- length(weight0) res <- numeric(nTips) for (i in 1:(l - 1)) { for (j in (i + 1):l) { # cat(i, j, "\n") if ((weight0[i] > 0) & (weight0[j] > 0)) { z <- paste(y[, i], y[, j], sep = "_") dis2 <- single_dis[, i] + single_dis[, j] # D1 <- (dis2[nTips] - dis2) dis <- fun1(z) # dis <- pmax(dis, dis2) # D2 <- dis[nTips] - (UB[, i] + UB[, j]) if (dis[nTips] > dis2[nTips]) { ub <- UB[, i] + UB[, j] dis <- dis[nTips] - ub d2 <- dis2[nTips] - dis2 dis <- pmax(dis, d2) - d2 if (sum(dis[4:nTips]) > 0) { wmin <- min(weight0[i], weight0[j]) weight0[i] <- weight0[i] - wmin weight0[j] <- weight0[j] - wmin res <- res + dis * wmin } } } if(weight0[i] < 1e-6) break() } } res } phangorn/R/treeRearrangement.R0000644000176200001440000002723513475602650016105 0ustar liggesusersnnin <- function(tree, n) { attr(tree, "order") <- NULL tree1 <- tree tree2 <- tree edge <- matrix(tree$edge, ncol = 2) parent <- edge[, 1] child <- tree$edge[, 2] k <- min(parent) - 1 ind <- which(child > k)[n] if (is.na(ind)) return(NULL) p1 <- parent[ind] p2 <- child[ind] ind1 <- which(parent == p1) ind1 <- ind1[ind1 != ind][1] ind2 <- which(parent == p2) e1 <- child[ind1] e2 <- child[ind2[1]] e3 <- child[ind2[2]] tree1$edge[ind1, 2] <- e2 tree1$edge[ind2[1], 2] <- e1 tree2$edge[ind1, 2] <- e3 tree2$edge[ind2[2], 2] <- e1 if (!is.null(tree$edge.length)) { tree1$edge.length[c(ind1, ind2[1])] <- tree$edge.length[c(ind2[1], ind1)] tree2$edge.length[c(ind1, ind2[2])] <- tree$edge.length[c(ind2[2], ind1)] } tree1 <- reorder(tree1, "postorder") tree2 <- reorder(tree2, "postorder") result <- list(tree1, tree2) result } # faster for moves >> 1 n_nni <- function(tree, moves = 1L) { edge <- tree$edge parent <- edge[, 1] child <- edge[, 2] nb.tip <- length(tree$tip.label) if (nb.tip == 1) return(tree) pvector <- integer(max(edge)) # parents pvector[child] <- parent ch <- Children(tree) edges <- child[child %in% parent] # these are the edges we sample from for (i in 1:moves) { p2 <- sample(edges, 1) p1 <- pvector[p2] ind1 <- ch[[p1]] v1 <- ind1[ind1 != p2][1] ind2 <- ch[[p2]] r2 <- sample(2, 1) v2 <- ind2[r2] ind1[ind1 == v1] <- v2 ind2[r2] <- v1 pvector[v1] <- p2 pvector[v2] <- p1 ch[[p1]] <- ind1 ch[[p2]] <- ind2 } tree$edge[, 1] <- pvector[child] attr(tree, "order") <- NULL reorder(tree, "postorder") } # roughly 2* fast from Martin Smith one_nnin <- function(tree, n) { edge <- tree$edge parent <- edge[, 1] child <- edge[, 2] lengths <- tree$edge.length nb.tip <- length(tree$tip.label) ind <- which(child > nb.tip)[n] if (is.na(ind)) return(NULL) nb.node <- tree$Nnode if (nb.node == 1) return(tree) p1 <- parent[ind] p2 <- child[ind] ind1 <- which(parent == p1) ind1 <- ind1[ind1 != ind][1] ind2 <- which(parent == p2)[sample(2, 1)] new_ind <- c(ind2, ind1) old_ind <- c(ind1, ind2) child_swap <- child[new_ind] edge [old_ind, 2L] <- child_swap child[old_ind] <- child_swap neworder <- reorderRcpp(edge, as.integer(nb.tip), as.integer(nb.tip + 1L), 2L) tree$edge <- edge[neworder, ] if (!is.null(tree$edge.length)) { lengths[old_ind] <- lengths[new_ind] tree$edge.length <- lengths[neworder] } attr(tree, "order") <- "postorder" tree } ## @aliases nni rNNI rSPR #' Tree rearrangements. #' #' \code{nni} returns a list of all trees which are one nearest neighbor #' interchange away. \code{rNNI} and \code{rSPR} are two methods which simulate #' random trees which are a specified number of rearrangement apart from the #' input tree. Both methods assume that the input tree is bifurcating. These #' methods may be useful in simulation studies. #' #' #' @param tree A phylogenetic \code{tree}, object of class \code{phylo}. #' @param moves Number of tree rearrangements to be transformed on a tree. Can #' be a vector #' @param n Number of trees to be simulated. #' @param k If defined just SPR of distance k are performed. #' @return an object of class multiPhylo. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{allTrees}}, \code{\link{SPR.dist}} #' @keywords cluster #' @examples #' #' tree <- rtree(20, rooted = FALSE) #' trees1 <- nni(tree) #' trees2 <- rSPR(tree, 2, 10) #' #' @rdname nni #' @export nni nni <- function(tree) { tip.label <- tree$tip.label attr(tree, "order") <- NULL k <- min(tree$edge[, 1]) - 1 n <- sum(tree$edge[, 2] > k) result <- vector("list", 2 * n) l <- 1 for (i in 1:n) { tmp <- nnin(tree, i) tmp[[1]]$tip.label <- tmp[[2]]$tip.label <- NULL result[c(l, l + 1)] <- tmp l <- l + 2 } attr(result, "TipLabel") <- tip.label class(result) <- "multiPhylo" result } #' @rdname nni #' @export rNNI <- function(tree, moves = 1, n = length(moves)) { k <- length(na.omit(match(tree$edge[, 2], tree$edge[, 1]))) k_nni <- function(tree, ch, pvector, moves = 1L) { if (nb.tip == 1) return(tree) for (i in seq_len(moves)) { p2 <- sample(edges, 1) p1 <- pvector[p2] ind1 <- ch[[p1]] v1 <- ind1[ind1 != p2][1] ind2 <- ch[[p2]] r2 <- sample(2, 1) v2 <- ind2[r2] ind1[ind1 == v1] <- v2 ind2[r2] <- v1 pvector[v1] <- p2 pvector[v2] <- p1 ch[[p1]] <- ind1 ch[[p2]] <- ind2 } edge[, 1] <- pvector[child] neworder <- reorderRcpp(edge, nb.tip, nb.tip + 1L, 2L) tree$edge <- edge[neworder, ] if (!is.null(tree$edge.length)) { tree$edge.length <- tree$edge.length[neworder] } attr(tree, "order") <- "postorder" tree } edge <- tree$edge parent <- edge[, 1] child <- edge[, 2] nb.tip <- as.integer(length(tree$tip.label)) pvector <- integer(max(edge)) # parents pvector[child] <- parent ch <- Children(tree) edges <- child[child %in% parent] if (n == 1) { trees <- tree if (moves > 0) { trees <- k_nni(tree, ch, pvector, moves = moves) } trees$tip.label <- tree$tip.label } else { trees <- vector("list", n) if (length(moves) == 1) moves <- rep(moves, n) for (j in seq_len(n)) { tmp <- tree if (moves[j] > 0) { tmp <- k_nni(tree, ch, pvector, moves = moves[j]) } tmp$tip.label <- NULL trees[[j]] <- tmp } attr(trees, "TipLabel") <- tree$tip.label class(trees) <- "multiPhylo" } trees } rNNI_old <- function(tree, moves = 1, n = length(moves)) { k <- length(na.omit(match(tree$edge[, 2], tree$edge[, 1]))) if (n == 1) { trees <- tree if (moves > 0) { if (moves > 1) trees <- n_nni(trees, moves) else { trees <- one_nnin(trees, sample(k, 1)) } } trees$tip.label <- tree$tip.label } else { trees <- vector("list", n) if (length(moves) == 1) moves <- rep(moves, n) for (j in 1:n) { tmp <- tree if (moves[j] > 0) { if (moves[j] > 1) tmp <- n_nni(tmp, moves[j]) else { tmp <- one_nnin(tmp, sample(k, 1)) } } tmp$tip.label <- NULL trees[[j]] <- tmp } attr(trees, "TipLabel") <- tree$tip.label class(trees) <- "multiPhylo" } trees } ################################################################################ # SPR ################################################################################ dn <- function(x) { # if (!is.binary(x) ) x <- multi2di(x, random = FALSE) if (is.null(x$edge.length)) x$edge.length <- rep(1, nrow(x$edge)) else x$edge.length[] <- 1 dist.nodes(x) } #' @rdname nni #' @export rSPR <- function(tree, moves = 1, n = length(moves), k = NULL) { if (n == 1) { trees <- tree for (i in 1:moves) trees <- kSPR(trees, k = k) } else { trees <- vector("list", n) if (length(moves) == 1) moves <- rep(moves, n) for (j in 1:n) { tmp <- tree if (moves[j] > 0) { for (i in 1:moves[j]) tmp <- kSPR(tmp, k = k) } tmp$tip.label <- NULL trees[[j]] <- tmp } attr(trees, "TipLabel") <- tree$tip.label class(trees) <- "multiPhylo" } trees } kSPR <- function(tree, k = NULL) { l <- length(tree$tip.label) root <- getRoot(tree) distN <- dn(tree)[-c(1:l), -c(1:l)] distN[upper.tri(distN)] <- Inf dN <- distN[lower.tri(distN)] tab <- tabulate(dN) tab[1] <- tab[1] * 2 tab[-1] <- tab[-1] * 8 if (is.null(k)) k <- seq_along(tab) k <- na.omit( (seq_along(tab))[k]) if (length(k) > 1) k <- sample(seq_along(tab)[k], 1, prob = tab[k] / sum(tab[k])) if (k == 1) return(rNNI(tree, 1, 1)) index <- which(distN == k, arr.ind = TRUE) + l m <- dim(index)[1] if (m == 0) stop("k is chosen too big") ind <- index[sample(m, 1), ] s1 <- sample(c(1, 2), 1) if (s1 == 1) res <- oneOf4(tree, ind[1], ind[2], sample(c(1, 2), 1), sample(c(1, 2), 1), root) if (s1 == 2) res <- oneOf4(tree, ind[2], ind[1], sample(c(1, 2), 1), sample(c(1, 2), 1), root) # res <- reroot2(res, root) # reorderPruning(res) # reroot(res, root, FALSE) res } oneOf4 <- function(tree, ind1, ind2, from = 1, to = 1, root) { if (!is.binary(tree)) stop("Sorry, trees must be binary!") # tree <- reroot2(tree, ind2) # browser()# tree <- reroot(tree, ind2, FALSE) kids1 <- Children(tree, ind1) anc <- Ancestors(tree, ind1, "all") l <- length(anc) kids2 <- Children(tree, ind2) kids2 <- kids2[kids2 != anc[l - 1]] child <- tree$edge[, 2] tmp <- numeric(max(tree$edge)) tmp[child] <- seq_along(child) edge <- tree$edge edge[tmp[kids1[-from]], 1] <- Ancestors(tree, ind1, "parent") edge[tmp[kids2[to]], 1] <- ind1 edge[tmp[ind1]] <- ind2 tree$edge <- edge attr(tree, "order") <- NULL tree <- reroot(tree, root, FALSE) # reorderPruning(tree) # reorder(tree) # reorder(tree, "postorder") tree } # faster than kSPR rSPR_Old <- function(tree, moves = 1, n = 1) { k <- length(tree$edge[, 1]) if (n == 1) { trees <- tree for (i in 1:moves) trees <- sprMove(trees, sample(k, 1)) } else { trees <- vector("list", n) for (j in 1:n) { tmp <- tree for (i in 1:moves) tmp <- sprMove(tmp, sample(k, 1)) tmp$tip.label <- NULL trees[[j]] <- tmp } attr(trees, "TipLabel") <- tree$tip.label class(trees) <- "multiPhylo" } trees } sprMove <- function(tree, m) { if (is.rooted(tree)) tree <- unroot(tree) if (!is.binary(tree)) stop("Sorry, trees must be binary!") changeEdge <- function(tree, new, old) { tree$edge[tree$edge == old] <- 0L tree$edge[tree$edge == new] <- old tree$edge[tree$edge == 0L] <- new # needed for unrooted trees tree <- collapse.singles(tree) tree } edge <- tree$edge k <- max(edge) nTips <- length(tree$tip.label) nEdges <- 2 * nTips - 3 if (m > nEdges) stop("m is chosen too big") parent <- edge[, 1] child <- edge[, 2] pv <- integer(k) pv[child] <- parent cv <- list() for (i in unique(parent)) cv[[i]] <- child[parent == i] bp <- bip(tree) root <- parent[!match(parent, child, 0)][1] ch <- child[m] pa <- parent[m] candidates <- !logical(k) candidates[root] <- FALSE candidates[cv[[ch]]] <- FALSE candidates[cv[[pa]]] <- FALSE candidates[pv[pa]] <- FALSE candidates[pa] <- FALSE ind <- which(candidates) l <- sample(ind, 1) cr <- FALSE if (!any(is.na(match(bp[[l]], bp[[ch]])))) { newroot <- cv[[ch]] # [ 1] newroot <- newroot[newroot > nTips][1] # tree <- reroot2(tree, newroot) tree <- reroot(tree, newroot, FALSE) edge <- tree$edge parent <- tree$edge[, 1] child <- tree$edge[, 2] pv <- integer(k) pv[child] <- parent cv <- list() for (i in unique(parent)) cv[[i]] <- child[parent == i] tmp <- pa pa <- ch ch <- tmp cr <- TRUE } if (pa == root) { cp <- cv[[pa]] newroot <- cp[cp != ch] newroot <- newroot[newroot > nTips][1] # tree <- reroot2(tree, newroot) tree <- reroot(tree, newroot, FALSE) edge <- tree$edge parent <- tree$edge[, 1] child <- tree$edge[, 2] pv <- integer(k) pv[child] <- parent cv <- list() for (i in unique(parent)) cv[[i]] <- child[parent == i] cr <- TRUE } el <- tree$edge.length cp <- cv[[pa]] sib <- cp[cp != ch] edge[child == l, 1] <- pa edge[child == pa, 1] <- pv[l] edge[child == sib, 1] <- pv[pa] el[child == sib] <- el[child == sib] + el[child == pa] el[child == l] <- el[child == l] / 2 el[child == pa] <- el[child == l] tree$edge <- edge tree$edge.length <- el if (cr) tree <- changeEdge(tree, root, newroot) tree <- reorder(tree, "postorder") tree } phangorn/R/pmlMix.R0000644000176200001440000004651413475602650013702 0ustar liggesusersoptimMixQ <- function(object, Q = c(1, 1, 1, 1, 1, 1), omega, ...) { l <- length(Q) Q <- Q[-l] Q <- sqrt(Q) fn <- function(Q, object, omega, ...) { Q <- c(Q^2, 1) weight <- object[[1]]$weight n <- length(omega) p <- length(weight) result <- numeric(p) for (i in 1:n) result <- result + as.numeric(update(object[[i]], Q = Q, ...)$lv) * omega[i] result <- sum(weight %*% log(result)) result } res <- optim(par = Q, fn = fn, gr = NULL, method = "L-BFGS-B", lower = 0, upper = Inf, control = list(fnscale = -1, maxit = 25), object = object, omega = omega, ...) res[[1]] <- c(res[[1]]^2, 1) res } optimMixM1a <- function(object, dnds = 0.1, omega, scaleQ = 1, ...) { weight <- object[[1]]$weight l0 <- object[[2]]$lv * omega[2] fn <- function(dnds, object, omega, weight, l0, scaleQ, ...) { result <- l0 + as.numeric(update(object, dnds = dnds, scaleQ = scaleQ, ...)$lv) * omega[1] sum(weight %*% log(result)) } res <- optimize(f = fn, c(0, 1), object = object[[1]], omega = omega, weight = weight, l0 = l0, scaleQ = scaleQ, lower = 0, upper = 1, maximum = TRUE) res } optimMixM2a <- function(object, dnds_old = c(0.1, 2), omega, scaleQ = 1, ...) { weight <- object[[1]]$weight l2 <- object[[2]]$lv * omega[2] fn <- function(dnds, object, omega, weight, l0, scaleQ, ...) { result <- l0 + as.numeric(update(object, dnds = dnds, scaleQ = scaleQ, ...)$lv) * omega[1] sum(weight %*% log(result)) } l3 <- object[[3]]$lv * omega[3] dnds <- dnds_old for (i in 1:3) { res <- optimize(f = fn, c(0, 1), object = object[[1]], omega = omega, weight = weight, l0 = l2 + l3, scaleQ = scaleQ, lower = 0, upper = 1, maximum = TRUE) dnds[1] <- res[[1]] l1 <- update(object[[1]], dnds = res[[1]], scaleQ = scaleQ)$lv * omega[1] res <- optimize(f = fn, c(1, 10), object = object[[3]], omega = omega, weight = weight, l0 = l2 + l1, scaleQ = scaleQ, lower = 1, upper = 10, maximum = TRUE) dnds[2] <- res[[1]] l3 <- update(object[[3]], dnds = res[[1]], scaleQ = scaleQ)$lv * omega[3] } dnds } optimMixM7 <- function(object, pq = c(1, 1), omega, scaleQ = 1, ...) { weight <- object[[1]]$weight fn <- function(pq, object, omega, weight, scaleQ, ...) { dnds <- discrete.beta(pq[1], pq[2], length(omega)) result <- numeric(length(weight)) for (i in seq_along(omega)) result <- result + as.numeric(update(object[[i]], dnds = dnds[i], scaleQ = scaleQ, ...)$lv) * omega[i] sum(weight %*% log(result)) } res <- optimize(f = fn, c(1, 1), object = object[[1]], omega = omega, weight = weight, scaleQ = scaleQ, lower = c(0, 0), upper = c(10, 10), maximum = TRUE) res } # needs to be included optimMixTSTV <- function(object, tstv = 1, omega, scaleQ = 1, ...) { weight <- object[[1]]$weight fn <- function(tstv, object, omega, weight, scaleQ, ...) { result <- numeric(length(weight)) for (i in seq_along(omega)) result <- result + as.numeric(update(object[[i]], tstv = tstv, scaleQ = scaleQ, ...)$lv) * omega[i] sum(weight %*% log(result)) } res <- optimize(f = fn, c(0, 100), object = object, omega = omega, weight = weight, scaleQ=scaleQ, lower = 0, upper = 100, maximum = TRUE) res } optimAllRate <- function(object, rate = 1, omega, ...) { weight <- object[[1]]$weight fn <- function(rate, object, omega, weight, ...) { result <- numeric(length(weight)) for (i in seq_along(object)) result <- result + as.numeric(update(object[[i]], rate = rate, ...)$lv) * omega[i] sum(weight %*% log(result)) } res <- optimize(f = fn, c(0.01, 10), object = object, omega = omega, weight = weight, lower = 0, upper = 100, maximum = TRUE) res } optimMixBf <- function(object, bf = c(.25, .25, .25, .25), omega, ...) { l <- length(bf) nenner <- 1 / bf[l] lbf <- log(bf * nenner) lbf <- lbf[-l] fn <- function(lbf, object, omega, ...) { bf <- exp(c(lbf, 0)) bf <- bf / sum(bf) weight <- object[[1]]$weight p <- length(weight) result <- numeric(p) for (i in seq_along(omega)) result <- result + as.numeric(update(object[[i]], bf = bf, ...)$lv) * omega[i] result <- sum(weight %*% log(result)) result } res <- optim(par = lbf, fn = fn, gr = NULL, method = "Nelder-Mead", control = list(fnscale = -1, maxit = 500), object, omega = omega, ...) bf <- exp(c(res[[1]], 0)) bf <- bf / sum(bf) } optimMixInv <- function(object, inv = 0.01, omega, ...) { fn <- function(inv, object, omega, ...) { weight <- object[[1]]$weight p <- length(weight) result <- numeric(p) for (i in seq_along(omega)) result <- result + as.numeric(update(object, inv = inv, ...)$lv) * omega[i] result <- sum(weight %*% log(result)) result } res <- optimize(f = fn, interval = c(0, 1), lower = 0, upper = 1, maximum = TRUE, tol = .0001, object, omega = omega, ...) res[[1]] } optimMixRate <- function(fits, ll, weight, omega, rate = rep(1, length(fits))) { r <- length(fits) rate0 <- rate[-r] fn <- function(rate, fits, ll, weight, omega) { r <- length(fits) rate <- c(rate, (1 - sum(rate * omega[-r])) / omega[r]) for (i in 1:r) fits[[i]] <- update(fits[[i]], rate = rate[i]) for (i in 1:r) ll[, i] <- fits[[i]]$lv sum(weight * log(ll %*% omega)) } ui <- diag(r - 1) ui <- rbind(-omega[-r], ui) ci <- c(-1, rep(0, r - 1)) res <- constrOptim(rate0, fn, grad = NULL, ui = ui, ci = ci, mu = 1e-04, control = list(fnscale = -1), method = "Nelder-Mead", outer.iterations = 50, outer.eps = 1e-05, fits = fits, ll = ll, weight = weight, omega = omega) rate <- res[[1]] res[[1]] <- c(rate, (1 - sum(rate * omega[-r])) / omega[r]) res } optW <- function(ll, weight, omega, ...) { k <- length(omega) nenner <- 1 / omega[1] eta <- log(omega * nenner) eta <- eta[-1] fn <- function(eta, ll, weight) { eta <- c(0, eta) p <- exp(eta) / sum(exp(eta)) res <- sum(weight * log(ll %*% p)) res } if (k == 2) res <- optimize(f = fn, interval = c(-3, 3), lower = -3, upper = 3, maximum = TRUE, tol = .Machine$double.eps^0.25, ll = ll, weight = weight) else res <- optim(eta, fn = fn, method = "L-BFGS-B", lower = -5, upper = 5, control = list(fnscale = -1, maxit = 25), gr = NULL, ll = ll, weight = weight) p <- exp(c(0, res[[1]])) p <- p / sum(p) result <- list(par = p, value = res[[2]]) result } optimMixEdge <- function(object, omega, trace = 1, ...) { tree <- object[[1]]$tree theta <- object[[1]]$tree$edge.length weight <- as.numeric(attr(object[[1]]$data, "weight")) n <- length(omega) p <- length(weight) q <- length(theta) lv1 <- numeric(p) for (i in 1:n) lv1 <- lv1 + as.numeric(object[[i]]$lv) * omega[i] ll0 <- sum(weight * log(lv1)) eps <- 1 iter <- 0 scalep <- 1 if (trace > 0) cat(ll0) while (abs(eps) > .001 & iter < 10) { dl <- matrix(0, p, q) for (i in 1:n) dl <- dl + dl(object[[i]], TRUE) * omega[i] dl <- dl / lv1 sc <- colSums(weight * dl) F <- crossprod(dl * weight, dl) + diag(q) * 1e-6 blub <- TRUE iter2 <- 0 while (blub & iter2 < 10) { thetaNew <- log(theta) + scalep * solve(F, sc) tree$edge.length <- as.numeric(exp(thetaNew)) for (i in 1:n) object[[i]] <- update(object[[i]], tree = tree) lv1 <- numeric(p) for (i in 1:n) lv1 <- lv1 + as.numeric(object[[i]]$lv) * omega[i] ll1 <- sum(weight * log(lv1)) eps <- ll1 - ll0 if (eps < 0 || is.nan(eps)) { scalep <- scalep / 2 eps <- 1 thetaNew <- log(theta) ll1 <- ll0 iter2 <- iter2 + 1 } else { scalep <- 1 theta <- exp(thetaNew) blub <- FALSE } } iter <- iter + 1 ll0 <- ll1 } tree$edge.length <- theta for (i in 1:n) object[[i]] <- update(object[[i]], tree = tree) if (trace > 0) cat("->", ll1, "\n") object } #' Phylogenetic mixture model #' #' Phylogenetic mixture model. #' #' The \code{formula} object allows to specify which parameter get optimized. #' The formula is generally of the form \code{edge + bf + Q ~ rate + shape + #' \dots{}}, on the left side are the parameters which get optimized over all #' mixtures, on the right the parameter which are optimized specific to each #' mixture. The parameters available are \code{"nni", "bf", "Q", "inv", #' "shape", "edge", "rate"}. Each parameters can be used only once in the #' formula. \code{"rate"} and \code{"nni"} are only available for the right #' side of the formula. On the other hand parameters for invariable sites are #' only allowed on the left-hand side. The convergence of the algorithm is #' very slow and is likely that the algorithm can get stuck in local optima. #' #' @aliases pmlMix #' @param formula a formula object (see details). #' @param fit an object of class \code{pml}. #' @param m number of mixtures. #' @param omega mixing weights. #' @param control A list of parameters for controlling the fitting process. #' @param \dots Further arguments passed to or from other methods. #' @return \code{pmlMix} returns a list with elements #' \item{logLik}{log-likelihood of the fit} \item{omega}{mixing weights.} #' \item{fits}{fits for the final mixtures.} #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}},\code{\link{pmlPart}},\code{\link{pmlCluster}} #' @keywords cluster #' @examples #' #' \dontrun{ #' X <- allSitePattern(5) #' tree <- read.tree(text = "((t1:0.3,t2:0.3):0.1,(t3:0.3,t4:0.3):0.1,t5:0.5);") #' fit <- pml(tree,X, k=4) #' weights <- 1000*exp(fit$site) #' attr(X, "weight") <- weights #' fit1 <- update(fit, data=X, k=1) #' fit2 <- update(fit, data=X) #' #' (fitMixture <- pmlMix(edge~rate, fit1 , m=4)) #' (fit2 <- optim.pml(fit2, optGamma=TRUE)) #' #' #' data(Laurasiatherian) #' dm <- dist.logDet(Laurasiatherian) #' tree <- NJ(dm) #' fit <- pml(tree, Laurasiatherian) #' fit <- optim.pml(fit) #' #' fit2 <- update(fit, k=4) #' fit2 <- optim.pml(fit2, optGamma=TRUE) #' #' fitMix <- pmlMix(edge ~ rate, fit, m=4) #' fitMix #' #' #' # #' # simulation of mixture models #' # #' \dontrun{ #' X <- allSitePattern(5) #' tree1 <- read.tree(text = "((t1:0.1,t2:0.5):0.1,(t3:0.1,t4:0.5):0.1,t5:0.5);") #' tree2 <- read.tree(text = "((t1:0.5,t2:0.1):0.1,(t3:0.5,t4:0.1):0.1,t5:0.5);") #' tree1 <- unroot(tree1) #' tree2 <- unroot(tree2) #' fit1 <- pml(tree1,X) #' fit2 <- pml(tree2,X) #' #' weights <- 2000*exp(fit1$site) + 1000*exp(fit2$site) #' attr(X, "weight") <- weights #' #' fit1 <- pml(tree1, X) #' fit2 <- optim.pml(fit1) #' logLik(fit2) #' AIC(fit2, k=log(3000)) #' #' fitMixEdge <- pmlMix( ~ edge, fit1, m=2) #' logLik(fitMixEdge) #' AIC(fitMixEdge, k=log(3000)) #' #' fit.p <- pmlPen(fitMixEdge, .25) #' logLik(fit.p) #' AIC(fit.p, k=log(3000)) #' } #' } #' #' @export pmlMix pmlMix <- function(formula, fit, m = 2, omega = rep(1 / m, m), control = pml.control(epsilon = 1e-8, maxit = 20, trace = 1), ...) { call <- match.call() form <- phangornParseFormula(formula) opt <- c("nni", "bf", "Q", "inv", "shape", "edge", "rate", "M1a", "M2a") optAll <- match(opt, form$left) optPart <- match(opt, form$right) AllBf <- !is.na(optAll[2]) AllQ <- !is.na(optAll[3]) AllInv <- !is.na(optAll[4]) AllGamma <- !is.na(optAll[5]) AllEdge <- !is.na(optAll[6]) AllRate <- !is.na(optAll[7]) MixNni <- !is.na(optPart[1]) MixBf <- !is.na(optPart[2]) MixQ <- !is.na(optPart[3]) MixInv <- !is.na(optPart[4]) MixGamma <- !is.na(optPart[5]) MixEdge <- !is.na(optPart[6]) MixRate <- !is.na(optPart[7]) M1a <- !is.na(optPart[8]) M2a <- !is.na(optPart[9]) if (inherits(fit, "pmlMix")){ fits <- fit$fits omega <- fit$omega } if (inherits(fit, "list")) fits <- fit if (inherits(fit, "pml")) { fits <- vector("list", m) for (i in 1:m) fits[[i]] <- fit } dat <- fits[[1]]$data p <- attr(dat, "nr") weight <- attr(dat, "weight") r <- m ll <- matrix(0, p, r) for (i in 1:r) ll[, i] <- fits[[i]]$lv for (i in 1:r) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- update(fits[[i]], llMix = pl0, wMix = omega[i]) } if (MixRate) rate <- rep(1, r) dnds <- NULL CODON <- FALSE if (M1a) { dnds <- c(fits[[1]]$dnds, fits[[2]]$dnds) CODON <- TRUE codon <- "M1a" } if (M2a) { dnds <- c(fits[[1]]$dnds, 1, fits[[3]]$dnds) CODON <- TRUE codon <- "M2a" } llstart <- sum(weight * log(ll %*% omega)) llold <- llstart ll_tmp <- llstart ll3 <- ll1 <- llstart eps0 <- 1 iter0 <- 0 trace <- control$trace on.exit({ parameter <- c(AllBf = AllBf, AllQ = AllQ, AllInv = AllInv, AllGamma = AllGamma, AllEdge = AllEdge, MixNni = MixNni, MixBf = MixBf, MixQ = MixQ, MixInv = MixInv, MixGamma = MixGamma, MixEdge = MixEdge, MixRate = MixRate) df <- matrix(1, 6, 2) colnames(df) <- c("#df", "group") rownames(df) <- c("Edge", "Shape", "Inv", "Bf", "Q", "Rate") df[1, 1] <- length(fits[[1]]$tree$edge.length) df[2, 1] <- fits[[1]]$k > 1 df[3, 1] <- fits[[1]]$inv > 0 df[4, 1] <- length(unique(fits[[1]]$bf)) - 1 df[5, 1] <- length(unique(fits[[1]]$Q)) - 1 df[6, 1] <- 0 if (MixEdge) df[1, 2] <- r if (MixGamma) df[2, 2] <- r if (MixInv) df[3, 2] <- r if (MixBf) df[4, 2] <- r if (MixQ) df[5, 2] <- r if (MixRate) df[6, 1] <- r - 1 attr(logLik, "df") <- sum(df[, 1] * df[, 2]) converge <- c(iter = iter0, eps = eps0) if (CODON){ if(M1a) df[5,1] <- 3 if(M2a) df[5,1] <- 5 df[4, 1] <- df_freq_codon(fits[[1]]$frequencies) result <- list(logLik = ll1, omega = omega, fits = fits, call = call, converge = converge, parameter = parameter, df = df, dnds = dnds, codon = codon) } else result <- list(logLik = ll1, omega = omega, fits = fits, call = call, converge = converge, parameter = parameter, df = df) class(result) <- "pmlMix" return(result) }) while (eps0 > control$eps & iter0 < control$maxit) { # while (eps0 > 1e-6 & iter0 < 20) { eps1 <- 100 iter1 <- 0 if (AllQ) { newQ <- optimMixQ(fits, Q = fits[[1]]$Q, omega = omega)[[1]] for (i in seq_len(m)) fits[[i]] <- update(fits[[i]], Q = newQ) } if (AllBf) { newBf <- optimMixBf(fits, bf = fits[[1]]$bf, omega = omega) for (i in seq_len(m)) fits[[i]] <- update(fits[[i]], bf = newBf) } if (AllInv) { newInv <- optimMixInv(fits, inv = fits[[1]]$inv, omega = omega) for (i in seq_len(m)) fits[[i]] <- update(fits[[i]], Inv = newInv) } if (AllRate) { newrate <- optimAllRate(fits, rate=1, omega) for (i in seq_len(m)) fits[[i]] <- update(fits[[i]], rate = newrate[[1]]) } if (M1a) { tmp <- optimMixM1a(fits, dnds[1], omega, scaleQ = 1) fits[[1]] <- update(fits[[1]], dnds = tmp[[1]], scaleQ = 1) dnds[1] <- tmp[[1]] ll[, 1] <- fits[[1]]$lv } if (M2a) { tmp <- optimMixM2a(fits, dnds[c(1, 3)], omega, scaleQ = 1) # [[1]] fits[[1]] <- update(fits[[1]], dnds = tmp[1], scaleQ = 1) fits[[3]] <- update(fits[[3]], dnds = tmp[2], scaleQ = 1) dnds[c(1, 3)] <- tmp } if (CODON) { tstv <- fits[[2]]$tstv tmp <- optimMixTSTV(fits, tstv, omega, scaleQ = 1) for (i in seq_len(m)) { fits[[i]] <- update(fits[[i]], tstv = tmp[[1]], scaleQ = 1) } tstv <- tmp[[1]] } if (AllEdge) fits <- optimMixEdge(fits, omega, trace = trace - 1) for (i in 1:r) ll[, i] <- fits[[i]]$lv while (abs(eps1) > 0.001 & iter1 < 3) { if (MixRate) { rate <- optimMixRate(fits, ll, weight, omega, rate)[[1]] for (i in 1:r) fits[[i]] <- update(fits[[i]], rate = rate[i]) for (i in 1:r) ll[, i] <- fits[[i]]$lv } for (i in 1:r) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- update(fits[[i]], llMix = pl0, wMix = omega[i]) } for (i in 1:r) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] if (any(c(MixNni, MixBf, MixQ, MixInv, MixGamma, MixEdge))) { fits[[i]] <- optim.pml(fits[[i]], optNni = MixNni, optBf = MixBf, optQ = MixQ, optInv = MixInv, optGamma = MixGamma, optEdge = MixEdge, optRate = FALSE, control = pml.control(epsilon = 1e-8, maxit = 3, trace - 1), llMix = pl0, wMix = omega[i]) } ll[, i] <- fits[[i]]$lv res <- optW(ll, weight, omega) omega <- res$p if (MixRate) { blub <- sum(rate * omega) rate <- rate / blub tree <- fits[[1]]$tree tree$edge.length <- tree$edge.length * blub for (i in 1:r) fits[[i]] <- update(fits[[i]], tree = tree, rate = rate[i]) for (i in 1:r) ll[, i] <- fits[[i]]$lv } for (i in 1:r) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- update(fits[[i]], llMix = pl0, wMix = omega[i]) } } ll1 <- sum(weight * log(ll %*% omega)) res <- optW(ll, weight, omega) omega <- res$p if (MixRate) { blub <- sum(rate * omega) rate <- rate / blub tree <- fits[[1]]$tree tree$edge.length <- tree$edge.length * blub for (i in 1:r) fits[[i]] <- update(fits[[i]], tree = tree, rate = rate[i]) if (trace > 0) print(rate) for (i in 1:r) ll[, i] <- fits[[i]]$lv } for (i in 1:r) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- update(fits[[i]], llMix = pl0, wMix = omega[i]) } ll2 <- sum(weight * log(ll %*% omega)) eps1 <- llold - ll2 iter1 <- iter1 + 1 llold <- ll2 } ll1 <- sum(weight * log(ll %*% omega)) eps0 <- (ll3 - ll1) / ll1 iter0 <- iter0 + 1 if (trace > 0) { cat("iteration:", iter0, "\n") cat("omega:", omega, "\n") cat("log-likelihood:", ll3, "==>", ll1, "\n") } ll3 <- ll1 } } #' @export print.pmlMix <- function(x, ...) { nc <- attr(x$fits[[1]]$data, "nc") nr <- attr(x$fits[[1]]$data, "nr") levels <- attr(x$fits[[1]]$data, "levels") r <- length(x$fits) w <- x$fits[[1]]$weight w <- w[w > 0] type <- attr(x$fits[[1]]$data, "type") nc <- attr(x$fits[[1]]$data, "nc") ll0 <- sum(w * log(w / sum(w))) bf <- matrix(0, r, nc) dimnames(bf) <- list(1:r, levels) Q <- matrix(0, r, nc * (nc - 1) / 2) dimnames(Q) <- list(1:r, NULL) rate <- numeric(r) inv <- x$fits[[1]]$inv shape <- numeric(r) for (i in 1:r) { bf[i, ] <- x$fits[[i]]$bf Q[i, ] <- x$fits[[i]]$Q rate[i] <- x$fits[[i]]$rate shape[i] <- x$fits[[i]]$shape } cat("\nloglikelihood:", x$logLik, "\n") cat("\nunconstrained loglikelihood:", ll0, "\n") cat("AIC: ", AIC(x), " BIC: ", AIC(x, k = log(nr)), "\n\n") cat("\nposterior:", x$omega, "\n") if (inv > 0) cat("Proportion of invariant sites:", inv, "\n") cat("\nRates:\n") cat(rate, "\n") if (length(bf) < 21) { cat("\nBase frequencies: \n") print(bf) cat("\nRate matrix:\n") print(Q) } } #' @export logLik.pmlMix <- function(object, ...) { res <- object$logLik attr(res, "df") <- sum(object$df[, 1] * object$df[, 2]) class(res) <- "logLik" res } phangorn/R/sankoff.R0000644000176200001440000000404213475602650014051 0ustar liggesusersprepareDataSankoffNew <- function(data) { contrast <- attr(data, "contrast") contrast[contrast == 0] <- 1.0e+06 contrast[contrast == 1] <- 0.0 attr(data, "contrast") <- contrast data } sankoffNew <- function(tree, data, cost = NULL, site = "pscore") { if (!inherits(data, "phyDat")) stop("data must be of class phyDat") data <- prepareDataSankoffNew(data) levels <- attr(data, "levels") l <- length(levels) if (is.null(cost)) { cost <- matrix(1, l, l) cost <- cost - diag(l) } l <- length(data) if (inherits(tree, "phylo")) return(fit.sankoffNew(tree, data, cost, returnData = site)) if (inherits(tree, "multiPhylo")) { if (is.null(tree$TipLabel)) tree <- unclass(tree) return(sapply(tree, fit.sankoffNew, data, cost, site)) } } fit.sankoffNew <- function(tree, data, cost, returnData = c("pscore", "site", "data")) { if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") returnData <- match.arg(returnData) node <- tree$edge[, 1] edge <- tree$edge[, 2] weight <- attr(data, "weight") nr <- attr(data, "nr") contr <- attr(data, "contrast") q <- length(tree$tip.label) nc <- attr(data, "nc") m <- length(edge) + 1 dat <- vector(mode = "list", length = m) dat[1:q] <- data[tree$tip.label] node <- as.integer(node - 1) edge <- as.integer(edge - 1) nTips <- as.integer(length(tree$tip.label)) mNodes <- as.integer(max(node) + 1) res <- .Call("sankoff3B", dat, as.numeric(cost), as.integer(nr), as.integer(nc), node, edge, mNodes, nTips, as.double(contr), as.integer(nrow(contr)), PACKAGE = "phangorn") root <- getRoot(tree) erg <- .Call("C_rowMin", res[[root]], as.integer(nr), as.integer(nc), PACKAGE = "phangorn") if (returnData == "site") return(erg) pscore <- sum(weight * erg) result <- pscore if (returnData == "data") { res[1:nTips] <- new2old.phyDat(data)[tree$tip.label] result <- list(pscore = pscore, dat = res) } result } phangorn/R/mast.R0000644000176200001440000000661613501072766013376 0ustar liggesusers#' Maximum agreement subtree #' #' \code{mast} computes the maximum agreement subtree (MAST). #' #' The code is derived from the code example in Valiente (2009). ## for the original code see \url{http://www.cs.upc.edu/~valiente/comput-biol/}. #' The version for the unrooted trees is much slower. #' #' @param x a tree, i.e. an object of class \code{phylo}. #' @param y a tree, i.e. an object of class \code{phylo}. #' @param tree a logicical, if TRUE returns a tree other wise the tip labels #' of the the maximum agreement subtree. #' @param rooted logical if TRUE treats trees as rooted otherwise unrooted. #' @return \code{mast} returns a vector of the tip labels in the MAST. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} based on code of Gabriel Valiente #' @seealso \code{\link{SPR.dist}} #' @references #' G. Valiente (2009). \emph{Combinatorial Pattern Matching Algorithms in Computational Biology using Perl and R}. Taylor & Francis/CRC Press #' #' #' @keywords cluster #' @examples #' tree1 <- rtree(100) #' tree2 <- rSPR(tree1, 5) #' tips <- mast(tree1, tree2) #' #' @rdname mast #' @export mast <- function(x, y, tree = TRUE, rooted = TRUE) { if (!is.rooted(x) | !is.rooted(y)) { rooted <- FALSE } shared_tips <- intersect(x$tip.label, y$tip.label) if (length(shared_tips) < length(x$tip.label)) x <- drop.tip(x, setdiff(x$tip.label, shared_tips)) if (length(shared_tips) < length(y$tip.label)) y <- drop.tip(y, setdiff(y$tip.label, shared_tips)) # make order of labels the same y <- .compressTipLabel(c(y), x$tip.label)[[1]] x <- reorder(x, "postorder") if (rooted) res <- mast.fit(x, y) else { x <- reorder(x, "postorder") bipart_x <- bipartCPP(x$edge, Ntip(x))[[2]] x <- root(x, bipart_x, resolve.root = TRUE) x <- reorder(x, "postorder") y <- unroot(y) y <- reorder(y, "postorder") res <- NULL bipart_y <- bipartCPP(y$edge, Ntip(y)) for (i in 2:length(bipart_y)) { y <- root(y, bipart_y[[i]], resolve = TRUE) tmp <- mast.fit(x, y) if (length(tmp) > length(res)) res <- tmp } } if (tree) res <- drop.tip(x, setdiff(x$tip.label, res)) res } mast.fit <- function(x, y) { y <- reorder(y, "postorder") po1 <- c(x$edge[, 2], x$edge[nrow(x$edge), 1]) po2 <- c(y$edge[, 2], y$edge[nrow(y$edge), 1]) nTips <- length(x$tip.label) # vielleicht ausserhalb p_vec_1 <- Ancestors(x, 1L:max(x$edge)) # nTips p_vec_2 <- Ancestors(y, 1L:max(y$edge)) # nTips # vielleicht ausserhalb CH1 <- allChildren(x) CH2 <- allChildren(y) m <- matrix(list(), nrow = length(po1), ncol = length(po2)) for (i in seq_len(nTips)) { m[i, i] <- c(i) m[cbind(i, p_vec_2[[i]])] <- c(i) m[cbind(p_vec_1[[i]], i)] <- c(i) } for (i in po1) { for (j in po2) { if (i > nTips & j > nTips) { l1 <- CH1[[i]][1] r1 <- CH1[[i]][2] l2 <- CH2[[j]][1] r2 <- CH2[[j]][2] mm <- c(m[[l1, l2]], m[[r1, r2]]) if (length(m[[l1, r2]]) + length(m[[r1, l2]]) > length(mm)) mm <- c(m[[l1, r2]], m[[r1, l2]]) if (length(m[[i, l2]]) > length(mm)) mm <- m[[i, l2]] if (length(m[[i, r2]]) > length(mm)) mm <- m[[i, r2]] if (length(m[[l1, j]]) > length(mm)) mm <- m[[l1, j]] if (length(m[[r1, j]]) > length(mm)) mm <- m[[r1, j]] if (!is.null(mm)) m[[i, j]] <- mm } } } x$tip.label[m[[i, j]]] } phangorn/R/Coalescent.R0000644000176200001440000000670413475602650014511 0ustar liggesusersnodeHeight <- function(tree) { if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") { tree <- reorder(tree, "postorder") } node_height_cpp(as.integer(tree$edge[, 1]), as.integer(tree$edge[, 2]), as.double(tree$edge.length)) } ancstat <- function(phy, x) { contrast <- attr(x, "contrast") storage.mode(contrast) <- "integer" phy <- reorder(phy, "postorder") res <- matrix(0L, max(phy$edge), ncol(contrast)) colnames(res) <- attr(x, "levels") nTips <- length(phy$tip.label) pa <- phy$edge[, 1] ch <- phy$edge[, 2] res[1:nTips, ] <- contrast[as.numeric(x)[match(phy$tip.label, names(x))], , drop = FALSE ] for (i in seq_along(pa)) { res[pa[i], ] <- res[pa[i], ] | res[ch[i], ] } res } comp <- function(x, y) { tmp1 <- matrix(rowSums(x), nrow(x), nrow(y)) res <- matrix(rowSums(y), nrow(x), nrow(y), byrow = TRUE) tmp3 <- tcrossprod(x, 1 - y) tmp0 <- tcrossprod(x, y) tmp0[tmp3 > 0] <- 0L res[!(tmp0 > (tmp1 - 1e-8))] <- 10000000L apply(res, 1, which.min) } comp2 <- function(x, y) { res <- matrix(rowSums(x), nrow(x), nrow(y)) tmp1 <- matrix(rowSums(y), nrow(x), nrow(y), byrow = TRUE) tmp3 <- tcrossprod(1 - x, y) tmp0 <- tcrossprod(x, y) tmp0[tmp3 > 0] <- 0L res[tmp0 < 2] <- Inf apply(res, 2, which.min) } #' Species Tree #' #' \code{coalSpeciesTree} estimates species trees and can handle multiple #' individuals per species. #' #' \code{coalSpeciesTree} estimates a single linkage tree as suggested by Liu #' et al. (2010) from the element wise minima of the cophenetic matrices of the #' gene trees. It extends \code{speciesTree} in ape as it allows that have #' several individuals per gene tree. #' #' @param tree an object of class \code{multiPhylo} #' @param X A \code{phyDat} object to define which individual belongs to which #' species. #' @param sTree A species tree which fixes the topology. #' @return The function returns an object of class \code{phylo}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} Emmanuel Paradies #' @seealso \code{\link{speciesTree}} #' @references Liu, L., Yu, L. and Pearl, D. K. (2010) Maximum tree: a #' consistent estimator of the species tree. \emph{Journal of Mathematical #' Biology}, \bold{60}, 95--106. #' @keywords cluster #' #' @export coalSpeciesTree <- function(tree, X = NULL, sTree = NULL) { if (is.null(X)) return(speciesTree(tree)) trees <- unclass(tree) States <- lapply(tree, ancstat, X) NH <- lapply(tree, nodeHeight) if (is.null(sTree)) { l <- attr(X, "nc") m <- choose(l, 2) SST <- matrix(0L, m, l) k <- 1 for (i in 1:(l - 1)) { for (j in (i + 1):l) { SST[k, i] <- SST[k, j] <- 1L k <- k + 1 } } Y <- matrix(Inf, length(NH), nrow(SST)) dm <- rep(Inf, m) for (i in seq_along(NH)) { ind <- comp2(States[[i]], SST) dm <- pmin(dm, NH[[i]][ind]) # for(j in 1:length(ind))Y[i, ind[j]] = min(Y[i, ind[j]], NH[[i]][j]) } dm <- structure(2 * dm, Labels = attr(X, "levels"), Size = l, class = "dist", Diag = FALSE, Upper = FALSE ) sTree <- upgma(dm, "single") # dm of pairwise states } else { SST <- ancstat(sTree, X) Y <- matrix(Inf, length(NH), nrow(SST)) for (i in seq_along(NH)) { ind <- comp(States[[i]], SST) for (j in seq_along(ind)) Y[i, ind[j]] <- min(Y[i, ind[j]], NH[[i]][j]) } STH <- apply(Y, 2, min) sTree$edge.length <- STH[sTree$edge[, 1]] - STH[sTree$edge[, 2]] } sTree } phangorn/R/simSeq.R0000644000176200001440000001600313475602650013663 0ustar liggesusers#' Simulate sequences. #' #' Simulate sequences for a given evolutionary tree. #' #' \code{simSeq} is now a generic function to simulate sequence alignments to #' along a phylogeny. It #' is quite flexible and allows to generate DNA, RNA, amino acids, codon or #' binary sequences. It is possible to give a \code{pml} object as input simSeq #' return a \code{phyDat} from these model. There is also a more low level #' version, which lacks rate variation, but one can combine different #' alignments having their own rate (see example). The rate parameter acts like #' a scaler for the edge lengths. #' #' For codon models \code{type="CODON"} two additional arguments \code{dnds} #' for the dN/dS ratio and \code{tstv} for the transition transversion ratio #' can be supplied. #' #' @param x a phylogenetic tree \code{tree}, i.e. an object of class #' \code{phylo} or and object of class \code{pml}. #' @param l length of the sequence to simulate. #' @param Q the rate matrix. #' @param bf base frequencies. #' @param rootseq a vector of length l containing the root sequence, other root #' sequence is randomly generated. #' @param type Type of sequences ("DNA", "AA", "CODON" or "USER"). #' @param model Amino acid models: e.g. "WAG", "JTT", "Dayhoff" or "LG" #' @param levels \code{levels} takes a character vector of the different bases, #' default is for nucleotide sequences, only used when type = "USER". #' @param rate mutation rate or scaler for the edge length, a numerical value #' greater than zero. #' @param ancestral Return ancestral sequences? #' @param \dots Further arguments passed to or from other methods. #' @return \code{simSeq} returns an object of class phyDat. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{phyDat}}, \code{\link{pml}}, \code{\link{SOWH.test}} #' @keywords cluster #' @examples #' #' \dontrun{ #' data(Laurasiatherian) #' tree <- nj(dist.ml(Laurasiatherian)) #' fit <- pml(tree, Laurasiatherian, k=4) #' fit <- optim.pml(fit, optNni=TRUE, model="GTR", optGamma=TRUE) #' data <- simSeq(fit) #' } #' #' tree <- rtree(5) #' plot(tree) #' nodelabels() #' #' # Example for simple DNA alignment #' data <- simSeq(tree, l = 10, type="DNA", bf=c(.1,.2,.3,.4), Q=1:6) #' as.character(data) #' #' # Example to simulate discrete Gamma rate variation #' rates <- discrete.gamma(1,4) #' data1 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[1]) #' data2 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[2]) #' data3 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[3]) #' data4 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[4]) #' data <- c(data1,data2, data3, data4) #' #' write.phyDat(data, file="temp.dat", format="sequential", nbcol = -1, #' colsep = "") #' unlink("temp.dat") #' #' @rdname simSeq #' @export simSeq simSeq <- function(x, ...) UseMethod("simSeq") #' @rdname simSeq #' @method simSeq phylo #' @export simSeq.phylo <- function(x, l = 1000, Q = NULL, bf = NULL, rootseq = NULL, type = "DNA", model = NULL, levels = NULL, rate = 1, ancestral = FALSE, ...) { if (!is.null(model)) { # model <- match.arg(model, c("USER", "WAG", "JTT", "LG", "Dayhoff", # "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24")) model <- match.arg(model, .aamodels) getModelAA(model, bf = is.null(bf), Q = is.null(Q)) type <- "AA" } extras <- match.call(expand.dots = FALSE)$... if (!is.null(extras)) { tmp <- c("dnds", "tstv") names(extras) <- tmp[pmatch(names(extras), tmp)] existing <- match(tmp, names(extras)) } pt <- match.arg(type, c("DNA", "AA", "USER", "CODON")) if (pt == "DNA") levels <- c("a", "c", "g", "t") if (pt == "AA") levels <- c("a", "r", "n", "d", "c", "q", "e", "g", "h", "i", "l", "k", "m", "f", "p", "s", "t", "w", "y", "v") if (pt == "CODON") { levels <- c("aaa", "aac", "aag", "aat", "aca", "acc", "acg", "act", "aga", "agc", "agg", "agt", "ata", "atc", "atg", "att", "caa", "cac", "cag", "cat", "cca", "ccc", "ccg", "cct", "cga", "cgc", "cgg", "cgt", "cta", "ctc", "ctg", "ctt", "gaa", "gac", "gag", "gat", "gca", "gcc", "gcg", "gct", "gga", "ggc", "ggg", "ggt", "gta", "gtc", "gtg", "gtt", "tac", "tat", "tca", "tcc", "tcg", "tct", "tgc", "tgg", "tgt", "tta", "ttc", "ttg", "ttt") dnds <- tstv <- 1 if (!is.null(extras)) { if (!is.na(existing[1])) dnds <- eval(extras[[existing[1]]], parent.frame()) if (!is.na(existing[2])) tstv <- eval(extras[[existing[2]]], parent.frame()) } } if (pt == "USER") if (is.null(levels)) stop("levels have to be supplied if type is USER") lbf <- length(levels) if (is.null(bf)) bf <- rep(1 / lbf, lbf) if (is.null(Q)) { if (type == "CODON") Q <- CodonQ(subs = .sub, syn = .syn, tstv = tstv, dnds = dnds) else Q <- rep(1, lbf * (lbf - 1) / 2) } if (is.matrix(Q)) Q <- Q[lower.tri(Q)] eig <- edQt(Q, bf) m <- length(levels) if (is.null(rootseq)) rootseq <- sample(levels, l, replace = TRUE, prob = bf) x <- reorder(x) edge <- x$edge nNodes <- max(edge) res <- matrix(NA, l, nNodes) parent <- as.integer(edge[, 1]) child <- as.integer(edge[, 2]) root <- as.integer(parent[!match(parent, child, 0)][1]) res[, root] <- rootseq tl <- x$edge.length for (i in seq_along(tl)) { from <- parent[i] to <- child[i] P <- getP(tl[i], eig, rate)[[1]] # avoid numerical problems for larger P and small t if (any(P < 0)) P[P < 0] <- 0 for (j in 1:m) { ind <- res[, from] == levels[j] res[ind, to] <- sample(levels, sum(ind), replace = TRUE, prob = P[, j]) } } k <- length(x$tip.label) label <- c(x$tip.label, as.character( (k + 1):nNodes)) colnames(res) <- label if (!ancestral) res <- res[, x$tip.label, drop = FALSE] if (pt == "DNA") return(phyDat.DNA(as.data.frame(res, stringsAsFactors = FALSE), return.index = TRUE)) if (pt == "AA") return(phyDat.AA(as.data.frame(res, stringsAsFactors = FALSE), return.index = TRUE)) if (pt == "USER") return(phyDat.default(as.data.frame(res, stringsAsFactors = FALSE), levels = levels, return.index = TRUE)) if (pt == "CODON") { res <- apply(res, 2, function(x) unlist(strsplit(x, ""))) return(phyDat.codon(as.data.frame(res, stringsAsFactors = FALSE))) } } #' @rdname simSeq #' @method simSeq pml #' @export simSeq.pml <- function(x, ancestral = FALSE, ...) { g <- x$g w <- x$w if (x$inv > 0) { w <- c(x$inv, w) g <- c(0.0, g) } n <- length(w) res <- vector("list", n) y <- sample(n, sum(x$weight), replace = TRUE, prob = w) levels <- attr(x$data, "levels") type <- attr(x$data, "type") for (i in 1:n) { l <- sum(y == i) res[[i]] <- simSeq(x$tree, l, Q = x$Q, bf = x$bf, type = type, levels = levels, rate = g[i], ancestral = ancestral) } x <- call("c.phyDat", quote(res[[1]])) if (n > 1) x <- parse(text = paste("c(", "res[[1]]", paste0(",res[[", 2:n, "]]", collapse = ""), ")")) eval(x) } phangorn/R/treeManipulation.R0000644000176200001440000005546213475602650015756 0ustar liggesusers# # tree manipulation # # no checks for postorder #' @rdname midpoint #' @export getRoot <- function(tree) { if (!is.null(attr(tree, "order")) && attr(tree, "order") == "postorder") { return(tree$edge[nrow(tree$edge), 1]) } z <- logical(max(tree$edge)) z[tree$edge[, 1]] <- TRUE z[tree$edge[, 2]] <- FALSE z <- which(z) if (length(z) == 1) return(z) else stop("There are apparently two root edges in your tree") } #reroot2 <- function(tree, node) { # if (node == getRoot(tree)) return(tree) # anc <- Ancestors(tree, node, "all") # l <- length(anc) # ind <- match(c(node, anc[-l]), tree$edge[, 2]) # tree$edge[ind, c(1, 2)] <- tree$edge[ind, c(2, 1)] # reorderPruning(tree) #} # seems to work now reroot <- function (tree, node, switch_root=TRUE) { root <- getRoot(tree) if (node == root) return(reorder(tree, "postorder")) anc <- Ancestors(tree, node, "all") l <- length(anc) ind <- match(c(node, anc[-l]), tree$edge[, 2]) tree$edge[ind, c(1, 2)] <- tree$edge[ind, c(2, 1)] nb.tip <- Ntip(tree) neworder <- reorderRcpp(tree$edge, as.integer(nb.tip), as.integer(node), 2L) tree$edge <- tree$edge[neworder, ] if(!is.null(tree$edge.length)) tree$edge.length <- tree$edge.length[neworder] if(switch_root){ tree$edge[tree$edge == root] <- 0L tree$edge[tree$edge == node] <- root tree$edge[tree$edge == 0L] <- node } attr(tree, "order") <- "postorder" if(switch_root) tree <- collapse.singles(tree) tree } changeEdge <- function(tree, swap, edge = NULL, edge.length = NULL) { attr(tree, "order") <- NULL child <- tree$edge[, 2] tmp <- numeric(max(child)) tmp[child] <- seq_along(child) tree$edge[tmp[swap[1]], 2] <- swap[2] tree$edge[tmp[swap[2]], 2] <- swap[1] if (!is.null(edge)) { tree$edge.length[tmp[edge]] <- edge.length } reorder(tree, "postorder") } changeEdgeLength <- function(tree, edge, edge.length) { tree$edge.length[match(edge, tree$edge[, 2])] <- edge.length tree } ## @aliases midpoint pruneTree getRoot #' Tree manipulation #' #' \code{midpoint} performs midpoint rooting of a tree. \code{pruneTree} #' produces a consensus tree. #' #' \code{pruneTree} prunes back a tree and produces a consensus tree, for trees #' already containing nodelabels. It assumes that nodelabels are numerical or #' character that allows conversion to numerical, it uses #' as.numeric(as.character(tree$node.labels)) to convert them. \code{midpoint} #' so far does not transform node.labels properly. #' #' @param tree an object of class \code{phylo} #' @param FUN a function evaluated on the nodelabels, result must be logical. #' @param node.labels are nodel labels 'support' values, 'label' or should be #' 'deleted' #' @param \dots further arguments, passed to other methods. #' @return \code{pruneTree} and \code{midpoint} a tree. \code{getRoot} returns #' the root node. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[ape]{consensus}}, \code{\link[ape]{root}}, #' \code{\link[ape]{multi2di}} #' @keywords cluster #' @examples #' #' tree <- rtree(10, rooted = FALSE) #' tree$node.label <- c("", round(runif(tree$Nnode-1), 3)) #' #' tree2 <- midpoint(tree) #' tree3 <- pruneTree(tree, .5) #' #' par(mfrow = c(3,1)) #' plot(tree, show.node.label=TRUE) #' plot(tree2, show.node.label=TRUE) #' plot(tree3, show.node.label=TRUE) #' #' @rdname midpoint #' @export midpoint midpoint <- function(tree, node.labels = "support", ...) UseMethod("midpoint") #' @rdname midpoint #' @method midpoint phylo #' @export midpoint.phylo <- function(tree, node.labels = "support", ...) { # distance from node to root node2root <- function(x) { x <- reorder(x, "postorder") el <- numeric(max(x$edge)) parents <- x$edge[, 1] child <- x$edge[, 2] el[child] <- x$edge.length l <- length(parents) res <- numeric(max(x$edge)) for (i in l:1) { res[child[i]] <- el[child[i]] + res[parents[i]] } res } if (is.null(tree$edge.length)) { warning("tree needs edge length") return(tree) } oldtree <- tree if(Ntip(tree)==1) return(tree) if(Ntip(tree)==2){ tree <- collapse.singles(tree) el <- sum(tree$edge.length) tree$edge.length[] <- el / 2 return(tree) } tree <- unroot(tree) nTips <- length(tree$tip.label) maxD1 <- node2root(tree)[1:nTips] ind <- which.max(maxD1) tmproot <- Ancestors(tree, ind, "parent") nTips <- length(tree$tip.label) if (tmproot > nTips) tree <- root(tree, node = tmproot) else tree <- root(tree, tmproot) el <- numeric(max(tree$edge)) el[tree$edge[, 2]] <- tree$edge.length maxdm <- el[ind] tree$edge.length[tree$edge[, 2] == ind] <- 0 maxD1 <- node2root(tree)[1:nTips] tree$edge.length[tree$edge[, 2] == ind] <- maxdm ind <- c(ind, which.max(maxD1)) maxdm <- maxdm + maxD1[ind[2]] rn <- max(tree$edge) + 1 edge <- tree$edge el <- tree$edge.length children <- tree$edge[, 2] left <- match(ind[1], children) tmp <- Ancestors(tree, ind[2], "all") tmp <- c(ind[2], tmp[-length(tmp)]) right <- match(tmp, children) if (el[left] >= (maxdm / 2)) { edge <- rbind(edge, c(rn, ind[1])) edge[left, 2] <- rn el[left] <- el[left] - (maxdm / 2) el <- c(el, maxdm / 2) } else { sel <- cumsum(el[right]) i <- which(sel > (maxdm / 2))[1] edge <- rbind(edge, c(rn, tmp[i])) edge[right[i], 2] <- rn eltmp <- sel[i] - (maxdm / 2) el <- c(el, el[right[i]] - eltmp) el[right[i]] <- eltmp } tree$edge.length <- el tree$edge <- edge tree$Nnode <- tree$Nnode + 1 attr(tree, "order") <- NULL tree <- reroot(tree, rn) if (!is.null(tree$node.label)) { node.label <- tree$node.label tmp <- node.label[1] node.label[1] <- node.label[rn - nTips] node.label[rn - nTips] <- tmp node.label[is.na(node.label)] <- "" tree$node.label <- node.label } attr(tree, "order") <- NULL tree <- reorder(tree, "postorder") if (!is.null(oldtree$node.label)) { type <- match.arg(node.labels, c("support", "label", "delete")) if (type == "support") tree <- addConfidences.phylo(tree, oldtree) if (type == "delete") tree$node.label <- NULL } tree } #' @rdname midpoint #' @method midpoint multiPhylo #' @export midpoint.multiPhylo <- function(tree, node.labels = "support", ...) { if (!is.null(attr(tree, "TipLabel"))) compress <- TRUE else compress <- FALSE tree <- lapply(tree, midpoint.phylo, node.labels = node.labels) class(tree) <- "multiPhylo" if (compress) tree <- .compressTipLabel(tree) tree } #' @rdname midpoint #' @export pruneTree <- function(tree, ..., FUN = ">=") { if (is.null(tree$node)) stop("no node labels") if (is.rooted(tree)) tree <- unroot(tree) m <- max(tree$edge) nTips <- length(tree$tip.label) bs <- rep(TRUE, m) bs[ (nTips + 1):m] <- sapply(as.numeric(as.character(tree$node)), FUN, ...) tree$edge.length[!bs[tree$edge[, 2]]] <- 0 reorder(di2multi(tree), "postorder") } # requires postorder # for internal use in fitch.spr # pos statt i dropTip <- function(x, i, check.binary = FALSE, check.root = TRUE) { edge <- x$edge root <- edge[nrow(edge), 1] #getRoot(x) ch <- match(i, edge[,2]) #which(edge[, 2] == i) pa <- edge[ch, 1] edge <- edge[-ch, ] ind <- which(edge[, 1] == pa) if (root == pa) { if (length(ind) == 1) { edge <- edge[-ind, ] x$Nnode <- x$Nnode - 1L } if (length(ind) == 2) { n <- dim(edge)[1] newroot <- edge[n - 2L, 1] newedge <- edge[ind, 2] if (newedge[1] == newroot) edge[n - 1, ] <- newedge else edge[n - 1, ] <- newedge[2:1] edge <- edge[-n, ] x$Nnode <- x$Nnode - 1L edge[edge == newroot] <- root pa <- newroot } # todo handle unrooted trees } else { nind <- match(pa, edge[,2]) #which(edge[, 2] == pa) # normal binary case if (length(ind) == 1) { edge[nind, 2] <- edge[ind, 2] edge <- edge[-ind, ] x$Nnode <- x$Nnode - 1L } } # edge[edge > pa] <- edge[edge > pa] - 1L x$edge <- edge x } # like drop tip and returns two trees, # to be used in fitch.spr descAll <- function(x, node, nTips, ch) { m <- max(x) isInternal <- logical(m) isInternal[(nTips + 1):m] <- TRUE desc <- function(node, isInternal) { if (!isInternal[node]) return(node) res <- NULL while (length(node) > 0) { tmp <- unlist(ch[node]) res <- c(res, tmp) node <- tmp[isInternal[tmp]] } res } desc(node, isInternal) } dropNode <- function(x, i, check.binary = FALSE, check.root = TRUE, all.ch = NULL) { edge <- x$edge root <- getRoot(x) ch <- match(i, edge[, 2]) # which(edge[, 2] == i) nTips <- length(x$tip.label) pa <- edge[ch, 1] if (i > nTips) { if (is.null(all.ch)) all.ch <- allChildren(x) kids <- descAll(edge, i, nTips, all.ch) ind <- match(kids, edge[, 2]) edge2 <- edge[sort(ind), ] edge <- edge[-c(ch, ind), ] } else edge <- edge[-ch, ] if (nrow(edge) < 3) return(NULL) ind <- which(edge[, 1] == pa) if (root == pa) { if (length(ind) == 1) { edge <- edge[-ind, ] x$Nnode <- x$Nnode - 1L } if (length(ind) == 2) { n <- dim(edge)[1] newroot <- edge[n - 2L, 1] newedge <- edge[ind, 2] if (newedge[1] == newroot) edge[n - 1, ] <- newedge else edge[n - 1, ] <- newedge[2:1] edge <- edge[-n, ] x$Nnode <- length(unique(edge[, 1])) edge[edge == newroot] <- root pa <- newroot } # todo handle unrooted trees } else { nind <- match(pa, edge[,2]) # which(edge[, 2] == pa) # normal binary case if (length(ind) == 1) { edge[nind, 2] <- edge[ind, 2] edge <- edge[-ind, ] x$Nnode <- length(unique(edge[, 1])) } } x$edge <- edge y <- x y$edge <- edge2 y$Nnode <- length(unique(edge2[, 1])) list(x, y, pa) } # postorder remained tip in 1:nTips addOne <- function(tree, tip, i) { edge <- tree$edge parent <- edge[, 1] l <- dim(edge)[1] m <- max(edge) + 1L p <- edge[i, 1] k <- edge[i, 2] edge[i, 2] <- m ind <- match(p, parent) if (ind == 1) edge <- rbind(matrix(c(m, m, k, tip), 2, 2), edge) else edge <- rbind(edge[1:(ind - 1), ], matrix(c(m, m, k, tip), 2, 2), edge[ind:l, ]) tree$edge <- edge tree$Nnode <- tree$Nnode + 1 tree } addOneTree <- function(tree, subtree, i, node) { edge <- tree$edge parent <- edge[, 1] l <- dim(edge)[1] m <- node # max(edge)+1L p <- edge[i, 1] k <- edge[i, 2] edge[i, 2] <- m edge2 <- subtree$edge ind <- match(p, parent) r2 <- edge2[nrow(edge2), 1] if (ind == 1) edge <- rbind(edge2, matrix(c(m, m, r2, k), 2, 2), edge) else edge <- rbind(edge[1:(ind - 1), ], edge2, matrix(c(m, m, r2, k), 2, 2), edge[ind:l, ]) tree$edge <- edge tree$Nnode <- tree$Nnode + subtree$Nnode + 1L attr(tree, "order") <- NULL tips1 <- as.integer(length(tree$tip.label) + 1L) tmproot <- getRoot(tree) if (tmproot != tips1) { tree$edge[tree$edge == tmproot] <- 0L tree$edge[tree$edge == tips1] <- tmproot tree$edge[tree$edge == 0L] <- tips1 } tree <- reorder(tree, "postorder") if (tmproot != tips1) tree <- unroot(tree) tree } #reorderPruning <- function(x, ...) { # edge <- x$edge # parents <- as.integer(edge[, 1]) # child <- as.integer(edge[, 2]) # root <- as.integer(parents[!match(parents, child, 0)][1]) # unique out # if (length(root) > 2) # stop("more than 1 root found") # n <- length(parents) # m <- max(edge) # edge parents # neworder <- .C("C_reorder", parents, child, as.integer(n), as.integer(m), # integer(n), as.integer(root - 1L), PACKAGE = "phangorn")[[5]] # x$edge <- edge[neworder, ] # x$edge.length <- x$edge.length[neworder] # attr(x, "order") <- "pruningwise" # x #} #' Add tips to a tree #' #' This function binds tips to nodes of a phylogenetic trees. #' #' #' @param tree an object of class "phylo". #' @param tips a character vector containing the names of the tips. #' @param where an integer or character vector of the same length as tips giving #' the number of the node or tip of the tree x where the tree y is binded. #' @param edge.length optional numeric vector with edge length #' @return an object of class phylo #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{bind.tree}} #' @keywords cluster #' @examples #' tree <- rcoal(10) #' plot(tree) #' nodelabels() #' tiplabels() #' tree1 <- add.tips(tree, c("A", "B", "C"), c(1,2,15)) #' plot(tree1) #' @export add.tips <- function(tree, tips, where, edge.length = NULL) { nTips <- length(tree$tip.label) nTips_new <- length(tips) if (nTips_new < 1) return(tree) edge <- tree$edge if (is.character(where)) { where <- match(where, c(tree$tip.label, tree$node.label)) } ind <- match(where, edge[, 2]) n_internal <- sum(unique(where) <= nTips) edge[edge > nTips] <- edge[edge > nTips] + nTips_new p_vec <- integer(max(edge) + n_internal) p_vec[edge[, 2]] <- edge[, 1] tip_index <- (nTips + 1):(nTips + nTips_new) c_vec <- c(edge[, 2], tip_index) # first handle internal nodes (easy) if (any(where > nTips)) { ind1 <- where > nTips p_vec[tip_index[ind1]] <- where[ind1] + nTips_new } # handle tips if (any(where <= nTips)) { m <- max(edge) tmp <- unique(where) tmp <- tmp[tmp <= nTips] new_internal <- as.integer( (m + 1L):(m + n_internal)) # add new internal node p_vec[new_internal] <- edge[match(tmp, edge[, 2]), 1] p_vec[tmp] <- new_internal # add tip ind2 <- (where <= nTips) p_vec[tip_index[ind2]] <- p_vec[where[ind2]] ind <- match(tmp, edge[, 2]) c_vec[ind] <- new_internal c_vec <- c(c_vec, tmp) if (!is.null(tree$node.label)) { tree$node.label <- c(tree$node.label, rep("", n_internal)) } } tree$edge <- matrix(c(p_vec[c_vec], c_vec), ncol = 2) if (!is.null(tree$edge.length)) { if (is.null(edge.length)) { tree$edge.length <- c(tree$edge.length, rep(0, nTips_new + n_internal)) } else { if (length(edge.length) < nTips_new) edge.length <- rep(edge.length, length.out = nTips_new) tree$edge.length <- c(tree$edge.length, edge.length, rep(0, n_internal)) } } tree$Nnode <- tree$Nnode + n_internal tree$tip.label <- c(tree$tip.label, tips) attr(tree, "order") <- NULL tree <- reorder(tree) if (!is.null(tree$edge.length)) { if (is.null(edge.length)) { nh <- nodeHeight(tree) nh[tip_index] <- 0 tree$edge.length <- nh[tree$edge[, 1]] - nh[tree$edge[, 2]] } } tree } #' Compute all trees topologies. #' #' \code{allTrees} computes all tree topologies for rooted or unrooted trees #' with up to 10 tips. \code{allTrees} returns bifurcating trees. #' #' #' @param n Number of tips (<=10). #' @param rooted Rooted or unrooted trees (default: rooted). #' @param tip.label Tip labels. #' @return an object of class \code{multiPhylo}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[ape]{rtree}}, \code{\link{nni}} #' @keywords cluster #' @examples #' #' trees <- allTrees(5) #' par(mfrow = c(3,5)) #' for(i in 1:15)plot(trees[[i]]) #' #' @export allTrees allTrees <- function(n, rooted = FALSE, tip.label = NULL) { n <- as.integer(n) nt <- as.integer(round(dfactorial(2 * (n + rooted) - 5))) if ( (n + rooted) > 10) { stop(gettextf("That would generate %d trees, and take up more than %d MB of memory!", nt, as.integer(round(nt / 1000)), domain = "R-phangorn")) } if (n < 2) { stop("A tree must have at least two taxa.") } if (!rooted && n == 2) { stop("An unrooted tree must have at least three taxa.") } if (rooted) { edge <- matrix(NA, 2 * n - 2, 2) edge[1:2, ] <- c(n + 1L, n + 1L, 1L, 2L) } else { edge <- matrix(NA, 2 * n - 3, 2) edge[1:3, ] <- c(n + 1L, n + 1L, n + 1L, 1L, 2L, 3L) } edges <- list() edges[[1]] <- edge m <- 1 nedge <- 1 trees <- vector("list", nt) if ( (n + rooted) > 3) { i <- 3L + (!rooted) pa <- n + 2L nr <- 2L + (!rooted) while (i < (n + 1L)) { nedge <- nedge + 2 m2 <- m * nedge newedges <- vector("list", m2) for (j in 1:m) { edge <- edges[[j]] l <- nr edgeA <- edge edgeB <- edge for (k in 1L:l) { edge <- edgeA node <- edge[k, 1] edge[k, 1] <- pa edge[l + 1, ] <- c(pa, i) edge[l + 2, ] <- c(node, pa) newedges[[(j - 1) * (l + rooted) + k]] <- edge } if (rooted) { edgeB[] <- as.integer(sub(n + 1L, pa, edgeB)) edge <- edgeB edge[l + 1, ] <- c(n + 1L, i) edge[l + 2, ] <- c(n + 1L, pa) newedges[[j * (l + 1)]] <- edge } } # end for edges <- newedges m <- m2 i <- i + 1L pa <- pa + 1L nr <- nr + 2L } # end for m } # end if for (x in 1:m) { edge <- edges[[x]] edge <- edge[reorderRcpp(edge, n, n + 1L, 2L), ] tree <- list(edge = edge) tree$Nnode <- n - 2L + rooted attr(tree, "order") <- "postorder" class(tree) <- "phylo" trees[[x]] <- tree } attr(trees, "TipLabel") <- if (is.null(tip.label)) paste("t", 1:n, sep = "") else tip.label class(trees) <- "multiPhylo" trees } # # some generic tree functions # allAncestors <- function(x) { x <- reorder(x, "postorder") parents <- x$edge[, 1] child <- x$edge[, 2] l <- length(parents) res <- vector("list", max(x$edge)) for (i in l:1) { pa <- parents[i] res[[child[i]]] <- c(pa, res[[pa]]) } res } ## @aliases Ancestors Children Descendants Siblings mrca.phylo #' tree utility function #' #' Functions for describing relationships among phylogenetic nodes. #' #' These functions are inspired by \code{treewalk} in phylobase package, but #' work on the S3 \code{phylo} objects. The nodes are the indices as given in #' edge matrix of an phylo object. From taxon labels these indices can be #' easily derived matching against the \code{tip.label} argument of an phylo #' object, see example below. All the functions allow \code{node} to be either #' a scalar or vector. \code{mrca} is a faster version of the mrca in ape, in #' phangorn only because of dependencies. #' If the argument node is missing the function is evaluated for all nodes. #' #' @param x a tree (a phylo object). #' @param node an integer or a vector of integers corresponding to a node ID #' @param type specify whether to return just direct children / parents or all #' @param include.self whether to include self in list of siblings #' @param full a logical indicating whether to return the MRCAs among all tips #' and nodes (if TRUE); the default is to return only the MRCAs among tips. #' @return a vector or a list containing the indices of the nodes. #' @seealso \code{treewalk}, \code{\link[ape]{as.phylo}}, #' \code{\link[ape]{nodelabels}} #' @keywords misc #' @examples #' #' tree <- rtree(10) #' plot(tree, show.tip.label = FALSE) #' nodelabels() #' tiplabels() #' Ancestors(tree, 1:3, "all") #' Children(tree, 11) #' Descendants(tree, 11, "tips") #' Siblings(tree, 3) #' # Siblings of all nodes #' Siblings(tree) #' mrca.phylo(tree, 1:3) #' mrca.phylo(tree, match(c("t1", "t2", "t3"), tree$tip)) #' mrca.phylo(tree) #' # same as mrca(tree), but faster for large trees #' #' @export #' @rdname Ancestors Ancestors <- function(x, node, type = c("all", "parent")) { parents <- x$edge[, 1] child <- x$edge[, 2] pvector <- integer(max(x$edge)) # parents pvector[child] <- parents type <- match.arg(type) if (type == "parent") return(pvector[node]) anc <- function(pvector, node) { res <- numeric(0) repeat { anc <- pvector[node] if (anc == 0) break res <- c(res, anc) node <- anc } res } if (!missing(node) && length(node) == 1) return(anc(pvector, node)) else allAncestors(x)[node] } allChildren <- function(x) { l <- length(x$tip.label) if (l < 20) { parent <- x$edge[, 1] children <- x$edge[, 2] res <- vector("list", max(x$edge)) for (i in seq_along(parent)) res[[parent[i]]] <- c(res[[parent[i]]], children[i]) return(res) } else { allChildrenCPP(x$edge) } } #' @describeIn Ancestors list all the descendant nodes of each node #' @keywords internal #' @export allDescendants <- function(x) { if (is.null(attr(x, "order")) || attr(x, "order") != "postorder") x <- reorder(x, "postorder") nTips <- as.integer(length(x$tip.label)) allDescCPP(x$edge, nTips) } #' @rdname Ancestors #' @export Children <- function(x, node) { # return allChildren if node is missing if (!missing(node) && length(node) == 1) return(x$edge[x$edge[, 1] == node, 2]) allChildren(x)[node] } #' @rdname Ancestors #' @export Descendants <- function(x, node, type = c("tips", "children", "all")) { type <- match.arg(type) if (type == "children") return(Children(x, node)) if (type == "tips") return(bip(x)[node]) # new version using Rcpp if (missing(node) || length(node) > 10) return(allDescendants(x)[node]) ch <- allChildren(x) # out of the loop isInternal <- logical(max(x$edge)) isInternal[ unique(x$edge[, 1]) ] <- TRUE desc <- function(node, isInternal) { if (!isInternal[node]) return(node) res <- NULL while (length(node) > 0) { tmp <- unlist(ch[node]) res <- c(res, tmp) node <- tmp[isInternal[tmp]] } res } if (length(node) > 1) return(lapply(node, desc, isInternal)) desc(node, isInternal) } #' @rdname Ancestors #' @export Siblings <- function(x, node, include.self = FALSE) { if (missing(node)) node <- as.integer(1:max(x$edge)) l <- length(node) if (l == 1) { v <- Children(x, Ancestors(x, node, "parent")) if (!include.self) v <- v[v != node] return(v) } else { parents <- x$edge[, 1] child <- x$edge[, 2] pvector <- integer(max(x$edge)) # parents pvector[child] <- parents root <- as.integer(parents[!match(parents, child, 0)][1]) res <- vector("list", l) ch <- allChildren(x) if (include.self) return(ch[ pvector[node] ]) k <- 1 for (i in node) { if (i != root) { tmp <- ch[[ pvector[i] ]] res[[k]] <- tmp[tmp != i] } k <- k + 1 } } res } #' @rdname Ancestors #' @export mrca.phylo <- function(x, node = NULL, full = FALSE) { if (is.null(node)) return(mrca2(x, full = full)) return(getMRCA(x, node)) } # should be in ape mrca2 <- function(phy, full = FALSE) { Nnode <- phy$Nnode Ntips <- length(phy$tip.label) phy <- reorder(phy) nodes <- unique(phy$edge[, 1]) if (!full) { res <- Descendants(phy, nodes, "tips") M <- matrix(nodes[1], Ntips, Ntips) for (i in 2:Nnode) M[res[[i]], res[[i]]] <- nodes[i] diag(M) <- 1:Ntips dimnames(M) <- list(phy$tip.label, phy$tip.label) } else { res <- Descendants(phy, nodes, "all") M <- matrix(nodes[1], Ntips + Nnode, Ntips + Nnode) for (i in 2:Nnode) { tmp <- c(res[[i]], nodes[i]) M[tmp, tmp] <- nodes[i] } diag(M) <- 1:(Ntips + Nnode) dimnames(M) <- list(1:(Ntips + Nnode), 1:(Ntips + Nnode)) } M } phangorn/R/dist.p.R0000644000176200001440000001341113502010552013604 0ustar liggesusers#' Pairwise Polymorphism P-Distances from DNA Sequences #' #' This function computes a matrix of pairwise uncorrected polymorphism #' p-distances. Polymorphism p-distances include intra-individual site #' polymorphisms (2ISPs; e.g. "R") when calculating genetic distances. #' #' The polymorphism p-distances (Potts et al. 2014) have been developed to #' analyse intra-individual variant polymorphism. For example, the widely used #' ribosomal internal transcribed spacer (ITS) region (e.g. Alvarez and Wendel, #' 2003) consists of 100's to 1000's of units within array across potentially #' multiple nucleolus organising regions (Bailey et al., 2003; Goeker and #' Grimm, 2008). This can give rise to intra-individual site polymorphisms #' (2ISPs) that can be detected from direct-PCR sequencing or cloning . Clone #' consensus sequences (see Goeker and Grimm, 2008) can be analysed with this #' function. #' #' @param x a matrix containing DNA sequences; this must be of class "phyDat" #' (use as.phyDat to convert from DNAbin objects). #' @param cost A cost matrix or "polymorphism" for a predefined one. #' @param ignore.indels a logical indicating whether gaps are treated as fifth #' state or not. Warning, each gap site is treated as a characters, so an an #' indel that spans a number of base positions would be treated as multiple #' character states. #' @return an object of class \code{dist}. #' @author Klaus Schliep and Alastair Potts #' @seealso \code{\link[ape]{dist.dna}}, \code{\link[phangorn]{dist.hamming}} #' @references Alvarez, I., and J. F. Wendel. (2003) Ribosomal ITS sequences #' and plant phylogenetic inference. \emph{ Molecular Phylogenetics and #' Evolution}, \bold{29}, 417--434. #' #' Bailey, C. D., T. G. Carr, S. A. Harris, and C. E. Hughes. (2003) #' Characterization of angiosperm nrDNA polymorphism, paralogy, and #' pseudogenes. \emph{Molecular Phylogenetics and Evolution} \bold{29}, #' 435--455. #' #' Goeker, M., and G. Grimm. (2008) General functions to transform associate #' data to host data, and their use in phylogenetic inference from sequences #' with intra-individual variability. \emph{BMC Evolutionary Biology}, #' \bold{8}:86. #' #' Potts, A.J., T.A. Hedderson, and G.W. Grimm. (2014) Constructing phylogenies #' in the presence of intra-individual site polymorphisms (2ISPs) with a focus #' on the nuclear ribosomal cistron. \emph{Systematic Biology}, \bold{63}, #' 1--16 #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' laura <- as.DNAbin(Laurasiatherian) #' #' dm <- dist.p(Laurasiatherian, "polymorphism") #' #' ######################################################## #' # Dealing with indel 2ISPs #' # These can be coded using an "x" in the alignment. Note #' # that as.character usage in the read.dna() function. #' ######################################################### #' cat("3 5", #' "No305 ATRA-", #' "No304 ATAYX", #' "No306 ATAGA", #' file = "exdna.txt", sep = "\n") #' (ex.dna <- read.dna("exdna.txt", format = "sequential", as.character=TRUE)) #' dat <- phyDat(ex.dna, "USER", levels=unique(as.vector(ex.dna))) #' dist.p(dat) #' #' unlink("exdna.txt") #' #' @export dist.p dist.p <- function(x, cost = "polymorphism", ignore.indels = TRUE) { if(inherits(x, "DNAbin")) x <- as.phyDat(x) if (!inherits(x, "phyDat")) { stop("x must be of class phyDat") } l <- length(x) weight <- attr(x, "weight") n <- length(attr(x, "allLevels")) d <- numeric((l * (l - 1)) / 2) lev <- attr(x, "allLevels") if (is.null(cost)) { cost <- 1 - diag(n) dimnames(cost) <- list(lev, lev) } # if(cost=="polymorphism" && attr(x, "type")=="DNA"){ if (cost == "polymorphism") { costLev <- c("a", "c", "t", "u", "g", "x", "m", "r", "w", "s", "y", "k", "v", "h", "d", "b", "-", "?", "n") cost <- matrix(c( # a,c,t,u,g,X,m,r,w,s,y,k,v,h,d,b,-,?,n, 0, 2, 2, 2, 2, 1, 1, 1, 1, 3, 3, 3, 2, 2, 2, 4, 2, 0, 0, # a 2, 0, 2, 2, 2, 1, 1, 3, 3, 1, 1, 3, 2, 2, 4, 2, 2, 0, 0, # c 2, 2, 0, 0, 2, 1, 3, 3, 1, 3, 1, 1, 4, 2, 2, 2, 2, 0, 0, # t 2, 2, 0, 0, 2, 1, 3, 3, 1, 3, 1, 1, 4, 2, 2, 2, 2, 0, 0, # u 2, 2, 2, 2, 0, 1, 3, 1, 3, 1, 3, 1, 2, 4, 2, 2, 2, 0, 0, # g 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, # X 1, 1, 3, 3, 3, 1, 0, 2, 2, 2, 2, 4, 1, 1, 3, 3, 3, 0, 0, # m 1, 3, 3, 3, 1, 1, 2, 0, 2, 2, 4, 2, 1, 3, 1, 3, 3, 0, 0, # r 1, 3, 1, 1, 3, 1, 2, 2, 0, 4, 2, 2, 3, 1, 1, 3, 3, 0, 0, # w 3, 1, 3, 3, 1, 1, 2, 2, 4, 0, 2, 2, 1, 3, 3, 1, 3, 0, 0, # s 3, 1, 1, 1, 3, 1, 2, 4, 2, 2, 0, 2, 3, 1, 3, 1, 3, 0, 0, # y 3, 3, 1, 1, 1, 1, 4, 2, 2, 2, 2, 0, 3, 3, 1, 1, 3, 0, 0, # k 2, 2, 4, 4, 2, 1, 1, 1, 3, 1, 3, 3, 0, 2, 2, 2, 4, 0, 0, # v 2, 2, 2, 2, 4, 1, 1, 3, 1, 3, 1, 3, 2, 0, 2, 2, 4, 0, 0, # h 2, 4, 2, 2, 2, 1, 3, 1, 1, 3, 3, 1, 2, 2, 0, 2, 4, 0, 0, # d 4, 2, 2, 2, 2, 1, 3, 3, 3, 1, 1, 1, 2, 2, 2, 0, 4, 0, 0, # b 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, #- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, # ? 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), # n ncol = 19, nrow = 19, dimnames = list(costLev, costLev) ) } lev1 <- dimnames(cost)[[1]] if (any(is.na(match(lev, lev1)))) stop("Levels of x are not in levels of cost matrix!") if (ignore.indels) { cost["-", ] <- 0 cost[, "-"] <- 0 } cost <- cost[lev, lev] k <- 1 for (i in 1:(l - 1)) { for (j in (i + 1):l) { d[k] <- sum(weight * cost[cbind(x[[i]], x[[j]])]) k <- k + 1 } } attr(d, "Size") <- l if (is.list(x)) { attr(d, "Labels") <- names(x) } else { attr(d, "Labels") <- colnames(x) } attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "call") <- match.call() attr(d, "method") <- "p" class(d) <- "dist" return(d) } phangorn/R/zzz.R0000644000176200001440000000412213475602650013256 0ustar liggesusers## zzz.R #' @import methods #' @import Rcpp #' @import parallel #' @import ape #' @importFrom stats AIC BIC logLik reorder update optim optimize constrOptim #' @importFrom stats cophenetic hclust as.dist pchisq reshape qgamma pgamma #' @importFrom stats na.omit model.matrix aggregate lm.fit xtabs quantile sd #' @importFrom stats runif qbeta #' @importFrom graphics plot plot.default plot.new plot.window text par abline #' @importFrom graphics strwidth axis title segments points image matplot legend #' @importFrom graphics hist identify locator barplot #' @importFrom utils read.table download.file stack #' @importFrom utils installed.packages write.table combn packageDescription #' @importFrom grDevices rgb rainbow adjustcolor col2rgb #' @useDynLib phangorn, .registration = TRUE .packageName <- "phangorn" .aamodels <- c("WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", "FLU", "Blosum62","Dayhoff_DCMut","JTT_DCMut") .dnamodels <- c("JC", "F81", "K80", "HKY", "TrNe", "TrN", "TPM1", "K81", "TPM1u", "TPM2", "TPM2u", "TPM3", "TPM3u", "TIM1e", "TIM1", "TIM2e", "TIM2", "TIM3e", "TIM3", "TVMe", "TVM", "SYM", "GTR") # environment variables .CodonAlphabet <- c("aaa", "aac", "aag", "aat", "aca", "acc", "acg", "act", "aga", "agc", "agg", "agt", "ata", "atc", "atg", "att", "caa", "cac", "cag", "cat", "cca", "ccc", "ccg", "cct", "cga", "cgc", "cgg", "cgt", "cta", "ctc", "ctg", "ctt", "gaa", "gac", "gag", "gat", "gca", "gcc", "gcg", "gct", "gga", "ggc", "ggg", "ggt", "gta", "gtc", "gtg", "gtt", "tac", "tat", "tca", "tcc", "tcg", "tct", "tgc", "tgg", "tgt", "tta", "ttc", "ttg", "ttt") .nucleotideAlphabet <- c("a", "c", "g", "t") # if rate g[i] is smaller than .gEps invariant site is increased by w[i] .gEps <- 1e-12 .PlotNetworxEnv <- new.env() # loadModule("Fitch_mod", TRUE) # .onLoad <- function(libname, pkgname) { # library.dynam("phangorn", pkgname, libname) #} phangorn/R/parsimony.R0000644000176200001440000005237113475602650014453 0ustar liggesusers# # Maximum Parsimony # rowMin <- function(X) { d <- dim(X) .Call("C_rowMin", X, as.integer(d[1]), as.integer(d[2]), PACKAGE = "phangorn") } sankoff.quartet <- function(dat, cost, p, l, weight) { erg <- .Call("sankoffQuartet", sdat = dat, sn = p, scost = cost, sk = l, PACKAGE = "phangorn") sum(weight * erg) } #' Parsimony tree. #' #' #' \code{parsimony} returns the parsimony score of a tree using either the #' sankoff or the fitch algorithm. \code{optim.parsimony} tries to find the #' maximum parsimony tree using either Nearest Neighbor Interchange (NNI) #' rearrangements or sub tree pruning and regrafting (SPR). \code{pratchet} #' implements the parsimony ratchet (Nixon, 1999) and is the preferred way to #' search for the best tree. \code{random.addition} can be used to produce #' starting trees. #' #' The "SPR" rearrangements are so far only available for the "fitch" method, #' "sankoff" only uses "NNI". The "fitch" algorithm only works correct for #' binary trees. #' #' @aliases parsimony #' @aliases optim.parsimony sankoff fitch pratchet #' random.addition acctran #' @param data A object of class phyDat containing sequences. #' @param tree tree to start the nni search from. #' @param method one of 'fitch' or 'sankoff'. #' @param cost A cost matrix for the transitions between two states. #' @param site return either 'pscore' or 'site' wise parsimony scores. #' @param trace defines how much information is printed during optimisation. #' @param rearrangements SPR or NNI rearrangements. #' @param start a starting tree can be supplied. #' @param maxit maximum number of iterations in the ratchet. #' @param minit minimum number of iterations in the ratchet. #' @param k number of rounds ratchet is stopped, when there is no improvement. #' @param all return all equally good trees or just one of them. #' @param perturbation whether to use "ratchet", "random_addition" or #' "stochastic" (nni) for shuffling the tree. #' @param ... Further arguments passed to or from other methods (e.g. #' model="sankoff" and cost matrix). #' @return \code{parsimony} returns the maximum parsimony score (pscore). #' \code{optim.parsimony} returns a tree after NNI rearrangements. #' \code{pratchet} returns a tree or list of trees containing the best tree(s) #' found during the search. \code{acctran} returns a tree with edge length #' according to the ACCTRAN criterion. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{bab}}, \code{\link{CI}}, \code{\link{RI}}, \code{\link{ancestral.pml}}, #' \code{\link{nni}}, \code{\link{NJ}}, \code{\link{pml}}, \code{\link{getClans}} #' ,\code{\link{ancestral.pars}}, \code{\link{bootstrap.pml}} #' @references Felsenstein, J. (2004). \emph{Inferring Phylogenies}. Sinauer #' Associates, Sunderland. #' #' Nixon, K. (1999) The Parsimony Ratchet, a New Method for Rapid Parsimony #' Analysis. \emph{Cladistics} \bold{15}, 407-414 #' @keywords cluster #' @examples #' #' set.seed(3) #' data(Laurasiatherian) #' dm <- dist.hamming(Laurasiatherian) #' tree <- NJ(dm) #' parsimony(tree, Laurasiatherian) #' treeRA <- random.addition(Laurasiatherian) #' treeNNI <- optim.parsimony(tree, Laurasiatherian) #' treeRatchet <- pratchet(Laurasiatherian, start=tree, maxit=100, #' minit=5, k=5, trace=0) #' # assign edge length #' treeRatchet <- acctran(treeRatchet, Laurasiatherian) #' #' plot(midpoint(treeRatchet)) #' add.scale.bar(0,0, length=100) #' #' parsimony(c(tree,treeNNI, treeRatchet), Laurasiatherian) #' #' @rdname parsimony #' @export parsimony <- function(tree, data, method = "fitch", ...) { if (class(data)[1] != "phyDat") stop("data must be of class phyDat") if (method == "sankoff") result <- sankoff(tree, data, ...) if (method == "fitch") result <- fitch(tree, data, ...) result } prepareDataFitch <- function(data) { lev <- attr(data, "levels") l <- length(lev) nr <- attr(data, "nr") nc <- length(data) contrast <- attr(data, "contrast") tmp <- contrast %*% 2L^c(0L:(l - 1L)) tmp <- as.integer(tmp) attrData <- attributes(data) nam <- attrData$names attrData$names <- NULL data <- unlist(data, FALSE, FALSE) X <- tmp[data] attributes(X) <- attrData attr(X, "dim") <- c(nr, nc) dimnames(X) <- list(NULL, nam) class(X) <- NULL X } compressSites <- function(data) { attrData <- attributes(data) lev <- attr(data, "levels") LEV <- attr(data, "allLevels") l <- length(lev) nr <- attr(data, "nr") nc <- length(data) data <- unlist(data, FALSE, FALSE) attr(data, "dim") <- c(nr, nc) uni <- match(lev, LEV) fun <- function(x, uni) { u <- unique.default(x) res <- if (any(is.na(match(u, uni)))) return(x) match(x, u) } data <- t(apply(data, 1, fun, uni)) ddd <- fast.table(data) data <- ddd$data class(data) <- "list" attrData$weight <- tapply(attrData$weight, ddd$index, sum) attrData$index <- NULL attrData$nr <- length(attrData$weight) attrData$compressed <- TRUE attributes(data) <- attrData data } # # Branch and bound # parsinfo <- function(x) { low <- lowerBound(x) up <- upperBound(x) ind <- which(low == up) cbind(ind, low[ind]) } # greedy algorithm of Maximum Set Packing (MSP) problem # (should work in most instances) lowerBound <- function(x, cost = NULL) { nc <- attr(x, "nc") nr <- attr(x, "nr") contrast <- attr(x, "contrast") rownames(contrast) <- attr(x, "allLevels") colnames(contrast) <- attr(x, "levels") attr(x, "weight") <- rep(1, nr) attr(x, "index") <- NULL y <- as.character(x) # states <- apply(y, 2, unique.default) return type not known states <- vector("list", ncol(y)) for (i in seq_len(ncol(y))) states[[i]] <- unique.default(y[, i]) singles <- which(rowSums(contrast) == 1) # noinfo <- which(rowSums(contrast) == nc) # ambiguous <- which( (rowSums(contrast) > 1) & (rowSums(contrast) < nc)) singles <- names(singles) noinfo <- names(noinfo) ambiguous <- names(ambiguous) fun <- function(states, contrast, singles, noinfo, ambiguous) { if (length(states) == 1) return(0) states <- setdiff(states, noinfo) # get rid of "-", "?" in DNA if ( (length(states) == 0) | (length(states) == 1)) return(0) if (any(states %in% ambiguous)) { n <- 0 contrast <- contrast[states, , drop = FALSE] while (nrow(contrast) > 0) { m <- which.max(colSums(contrast)) contrast <- contrast[contrast[, m] == 0, , drop = FALSE] n <- n + 1 } return(n - 1) } else return(length(states) - 1) } res <- sapply(states, fun, contrast, singles, noinfo, ambiguous) res } upperBound <- function(x, cost = NULL) { tree <- stree(length(x), tip.label = names(x)) if (is.null(cost)) cost <- 1 - diag(attr(x, "nc")) sankoffNew(tree, x, cost = cost, site = "site") } #' Consistency Index and Retention Index #' #' \code{CI} and \code{RI} compute the Consistency Index (CI) and Retention #' Index (RI). #' #' @details The Consistency Index is defined as minimum number of changes #' divided by the number of changes required on the tree (parsimony score). The #' Consistency Index is equal to one if there is no homoplasy. #' And the Retention Index is defined as #' \deqn{RI = \frac{MaxChanges - ObsChanges}{MaxChanges - MinChanges}}{RI = (MaxChanges - ObsChanges) / (MaxChanges - MinChanges)} #' #' @param data A object of class phyDat containing sequences. #' @param tree tree to start the nni search from. #' @param cost A cost matrix for the transitions between two states. #' @param sitewise return CI/RI for alignment or sitewise #' #' @seealso \code{\link{parsimony}}, \code{\link{pratchet}}, \code{\link{fitch}}, #' \code{\link{sankoff}}, \code{\link{bab}}, \code{\link{ancestral.pars}} #' #' @rdname CI #' @export CI <- function(tree, data, cost = NULL, sitewise = FALSE) { if (sitewise) pscore <- sankoffNew(tree, data, cost = cost, site = "site") else pscore <- sankoffNew(tree, data, cost = cost) weight <- attr(data, "weight") data <- subset(data, tree$tip.label) m <- lowerBound(data, cost = cost) if (sitewise) { return( (m / pscore)[attr(data, "index")]) } sum(m * weight) / pscore } #' @rdname CI #' @export RI <- function(tree, data, cost = NULL, sitewise = FALSE) { if (sitewise) pscore <- sankoffNew(tree, data, cost = cost, site = "site") else pscore <- sankoffNew(tree, data, cost = cost) data <- subset(data, tree$tip.label) weight <- attr(data, "weight") m <- lowerBound(data, cost = cost) g <- upperBound(data, cost = cost) if (sitewise) { res <- (g - pscore) / (g - m) return(res[attr(data, "index")]) } m <- sum(m * weight) g <- sum(g * weight) (g - pscore) / (g - m) } # # Sankoff # # works only for nucleotides old2new.phyDat <- function(obj) { att <- attributes(obj) l <- length(obj) contrast <- attr(obj, "contrast") nr <- attr(obj, "nr") X <- matrix(rep(rowSums(contrast), each = nr), nrow = nr) res <- vector("list", l) for (i in 1:l) { tmp <- X - tcrossprod(obj[[i]], contrast) res[[i]] <- unlist(apply(tmp, 1, function(x) which(x < 1e-6)[1])) } attributes(res) <- att res } old2new.phyDat <- function(obj) { att <- attributes(obj) l <- length(obj) contrast <- attr(obj, "contrast") nr <- attr(obj, "nr") X <- matrix(rep(rowSums(contrast), each = nr), nrow = nr) for (i in 1:l) obj[[i]][obj[[i]] > 0] <- 1 res <- vector("list", l) contrast[contrast == 0] <- 1e6 for (i in 1:l) { tmp <- tcrossprod(obj[[i]], contrast) - X res[[i]] <- unlist(apply(tmp, 1, function(x) which(x < 1e-6)[1])) } attributes(res) <- att res } new2old.phyDat <- function(data) { contrast <- attr(data, "contrast") for (i in seq_along(data)) data[[i]] <- contrast[data[[i]], , drop = FALSE] data } prepareDataSankoff <- function(data) { contrast <- attr(data, "contrast") contrast[contrast == 0] <- 1e+06 contrast[contrast == 1] <- 0 for (i in seq_along(data)) data[[i]] <- contrast[data[[i]], , drop = FALSE] data } #' @rdname parsimony #' @export sankoff <- function(tree, data, cost = NULL, site = "pscore") { if (!inherits(data, "phyDat")) stop("data must be of class phyDat") data <- prepareDataSankoff(data) levels <- attr(data, "levels") l <- length(levels) if (is.null(cost)) { cost <- matrix(1, l, l) cost <- cost - diag(l) } for (i in seq_along(data)) storage.mode(data[[i]]) <- "double" if (inherits(tree, "phylo")) return(fit.sankoff(tree, data, cost, returnData = site)) if (inherits(tree, "multiPhylo")) { if (is.null(tree$TipLabel)) tree <- unclass(tree) return(sapply(tree, fit.sankoff, data, cost, site)) } } fit.sankoff <- function(tree, data, cost, returnData = c("pscore", "site", "data")) { if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") returnData <- match.arg(returnData) node <- tree$edge[, 1] edge <- tree$edge[, 2] weight <- attr(data, "weight") nr <- attr(data, "nr") q <- length(tree$tip.label) nc <- attr(data, "nc") m <- length(edge) + 1 dat <- vector(mode = "list", length = m) dat[1:q] <- data[tree$tip.label] node <- as.integer(node - 1) edge <- as.integer(edge - 1) mNodes <- as.integer(max(node) + 1) tips <- as.integer( (seq_along(tree$tip.label)) - 1) res <- .Call("sankoff3", dat, as.numeric(cost), as.integer(nr), as.integer(nc), node, edge, mNodes, tips, PACKAGE = "phangorn") root <- getRoot(tree) erg <- .Call("C_rowMin", res[[root]], as.integer(nr), as.integer(nc), PACKAGE = "phangorn") if (returnData == "site") return(erg) pscore <- sum(weight * erg) result <- pscore if (returnData == "data") { result <- list(pscore = pscore, dat = res) } result } pnodes <- function(tree, data, cost) { if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") node <- tree$edge[, 1] edge <- tree$edge[, 2] nr <- nrow(data[[1]]) nc <- ncol(data[[1]]) node <- as.integer(node - 1) edge <- as.integer(edge - 1) .Call("pNodes", data, as.numeric(cost), as.integer(nr), as.integer(nc), node, edge, PACKAGE = "phangorn") } indexNNI <- function(tree) { parent <- tree$edge[, 1] child <- tree$edge[, 2] ind <- which(child %in% parent) Nnode <- tree$Nnode edgeMatrix <- matrix(0, (Nnode - 1), 5) pvector <- integer(max(parent)) pvector[child] <- parent tips <- !logical(max(parent)) tips[parent] <- FALSE # wahrscheinlich schneller: cvector <- allCildren(tree) cvector <- vector("list", max(parent)) for (i in seq_along(parent)) cvector[[parent[i]]] <- c(cvector[[parent[i]]], child[i]) k <- 0 for (i in ind) { p1 <- parent[i] p2 <- child[i] e34 <- cvector[[p2]] ind1 <- cvector[[p1]] e12 <- ind1[ind1 != p2] if (pvector[p1]) e12 <- c(p1, e12) edgeMatrix[k + 1, ] <- c(e12, e34, p2) k <- k + 1 } # vielleicht raus attr(edgeMatrix, "root") <- cvector[[min(parent)]] edgeMatrix } sankoff.nni <- function(tree, data, cost, ...) { if (is.rooted(tree)) tree <- reorder(unroot(tree), "postorder") INDEX <- indexNNI(tree) rootEdges <- attr(INDEX, "root") if (!inherits(data, "phyDat")) stop("data must be of class phyDat") levels <- attr(data, "levels") l <- length(levels) weight <- attr(data, "weight") p <- attr(data, "nr") i <- 1 tmp <- fit.sankoff(tree, data, cost, returnData = "data") p0 <- tmp[[1]] datf <- tmp[[2]] datp <- pnodes(tree, datf, cost) parent <- tree$edge[, 1] m <- dim(INDEX)[1] k <- min(parent) pscore <- numeric(2 * m) for (i in 1:m) { ei <- INDEX[i, ] datn <- datf[ei[1:4]] if (!(ei[5] %in% rootEdges)) datn[1] <- datp[ei[1]] pscore[(2 * i) - 1] <- sankoff.quartet(datn[ c(1, 3, 2, 4)], cost, p, l, weight) pscore[(2 * i)] <- sankoff.quartet(datn[ c(1, 4, 3, 2)], cost, p, l, weight) } swap <- 0 candidates <- pscore < p0 while (any(candidates)) { ind <- which.min(pscore) pscore[ind] <- Inf if (ind %% 2) swap.edge <- c(2, 3) else swap.edge <- c(2, 4) tree2 <- changeEdge(tree, INDEX[(ind + 1) %/% 2, swap.edge]) test <- fit.sankoff(tree2, data, cost, "pscore") if (test >= p0) candidates[ind] <- FALSE if (test < p0) { p0 <- test swap <- swap + 1 tree <- tree2 candidates[ind] <- FALSE indi <- which(rep(colSums(apply(INDEX, 1, match, INDEX[(ind + 1) %/% 2, ], nomatch = 0)) > 0, each = 2)) candidates[indi] <- FALSE pscore[indi] <- Inf } } list(tree = tree, pscore = p0, swap = swap) } #' @rdname parsimony #' @export optim.parsimony <- function(tree, data, method = "fitch", cost = NULL, trace = 1, rearrangements = "SPR", ...) { if (method == "fitch") result <- optim.fitch(tree = tree, data = data, trace = trace, rearrangements = rearrangements, ...) if (method == "sankoff") result <- optim.sankoff(tree = tree, data = data, cost = cost, trace = trace, ...) result } ## @param return return only best tree(s) or trees from each run. #' @rdname parsimony #' @export # perturbation="ratchet", "stochastic" pratchet <- function(data, start = NULL, method = "fitch", maxit = 1000, minit = 10, k = 10, trace = 1, all = FALSE, rearrangements = "SPR", perturbation = "ratchet", ...) { search_history <- c(FALSE, FALSE) # search_history <- c(FALSE, FALSE) # return="single", # if (return=="single") all <- FALSE # if(return=="best") all <- TRUE # if(return=="all" | return=="history"){ # all <- TRUE # search_history <- c(TRUE, TRUE) #} # c("single", "best", "all", "history") needs better names eps <- 1e-08 # if(method=="fitch" && (is.null(attr(data, "compressed")) || # attr(data, "compressed") == FALSE)) # data <- compressSites(data) trace <- trace - 1 uniquetree <- function(trees) { k <- 1 res <- trees[[1]] result <- list() result[[1]] <- res k <- 2 trees <- trees[-1] while (length(trees) > 0) { class(trees) <- "multiPhylo" rf <- suppressMessages( RF.dist(res, trees, FALSE) ) if (any(rf == 0)) trees <- trees[-which(rf == 0)] if (length(trees) > 0) { res <- trees[[1]] result[[k]] <- res k <- k + 1 trees <- trees[-1] } } result } if (search_history[1]) start_trees <- list() if (search_history[2]) search_trees <- list() tree <- NULL mp <- Inf if (perturbation != "random_addition"){ if(is.null(start)) start <- optim.parsimony(nj(dist.hamming(data)), data, trace = trace, method = method, rearrangements = rearrangements, ...) tree <- start if(!is.binary(tree)) tree <- multi2di(tree) data <- subset(data, tree$tip.label) attr(tree, "pscore") <- parsimony(tree, data, method = method, ...) mp <- attr(tree, "pscore") if (trace >= 0) print(paste("Best pscore so far:", attr(tree, "pscore"))) } FUN <- function(data, tree, method, rearrangements, ...) optim.parsimony(tree, data = data, method = method, rearrangements = rearrangements, ...) result <- list() result[[1]] <- tree on.exit({ if (!all) result <- tree else class(result) <- "multiPhylo" if (length(result) == 1) result <- result[[1]] # if(return=="all"){ # all <- FALSE # class(search_trees) <- "multiPhylo" # search_trees <- .compressTipLabel(search_trees) # result <- search_trees # } # if (return=="history"){ # class(start_trees) <- "multiPhylo" # class(search_trees) <- "multiPhylo" # start_trees <- .compressTipLabel(start_trees) # search_trees <- .compressTipLabel(search_trees) # result <- list(best = result, # start_trees = start_trees, search_trees = search_trees) # } return(result) }) kmax <- 1 nTips <- length(tree$tip.label) for (i in seq_len(maxit)) { if (perturbation == "ratchet") { bstrees <- bootstrap.phyDat(data, FUN, tree = tree, bs = 1, trace = trace, method = method, rearrangements = rearrangements, ...) trees <- lapply(bstrees, optim.parsimony, data, trace = trace, method = method, rearrangements = rearrangements, ...) if (search_history[1]) start_trees[[i]] <- bstrees[[1]] if (search_history[2]) search_trees[[i]] <- trees[[1]] } if (perturbation == "stochastic") { treeNNI <- rNNI(tree, floor(nTips / 2)) trees <- optim.parsimony(treeNNI, data, trace = trace, method = method, rearrangements = rearrangements, ...) trees <- list(trees) if (search_history[1]) start_trees[[i]] <- treeNNI if (search_history[2]) search_trees[[i]] <- trees[[1]] } if (perturbation == "random_addition") { treeRA <- random.addition(data) trees <- optim.parsimony(treeRA, data, trace = trace, method = method, rearrangements = rearrangements, ...) trees <- list(trees) if (search_history[1]) start_trees[[i]] <- treeRA if (search_history[2]) search_trees[[i]] <- trees[[1]] } if (inherits(result, "phylo")) m <- 1 else m <- length(result) if (m > 0) trees[2:(1 + m)] <- result[1:m] pscores <- sapply(trees, function(data) attr(data, "pscore")) mp1 <- min(pscores) if ( (mp1 + eps) < mp) kmax <- 1 else kmax <- kmax + 1 mp <- mp1 if (trace >= 0) print(paste("Best pscore so far:", mp)) ind <- which(pscores < mp + eps) if (length(ind) == 1) { result <- trees[ind] tree <- result[[1]] } else { result <- uniquetree(trees[ind]) l <- length(result) tree <- result[[sample(l, 1)]] } if ( (kmax >= k) && (i >= minit)) break() } # for } # pratchet start_tree <- function(x, maxit = 1, trace = 0, ...) { tree <- pratchet(x, maxit = maxit, trace = trace, ...) ps <- attr(tree, "pscore") tl <- ps / (sum(attr(x, "weight")) * Ntip(tree)) tree$edge.length <- rep(tl, nrow(tree$edge)) tree } optim.sankoff <- function(tree, data, cost = NULL, trace = 1, ...) { if (!inherits(tree, "phylo")) stop("tree must be of class phylo") if (is.rooted(tree)) tree <- unroot(tree) if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") if (class(data)[1] != "phyDat") stop("data must be of class phyDat") addTaxa <- FALSE mapping <- map_duplicates(data) if (!is.null(mapping)) { addTaxa <- TRUE tree2 <- drop.tip(tree, mapping[, 1]) tree2 <- unroot(tree2) tree <- reorder(tree2, "postorder") } rt <- FALSE dat <- prepareDataSankoff(data) l <- attr(dat, "nc") if (is.null(cost)) { cost <- matrix(1, l, l) cost <- cost - diag(l) } tree$edge.length <- NULL swap <- 0 iter <- TRUE pscore <- fit.sankoff(tree, dat, cost, "pscore") on.exit({ if (rt) tree <- ptree(tree, data) if (addTaxa) { if (rt) tree <- add.tips(tree, tips = mapping[, 1], where = mapping[, 2], edge.length = rep(0, nrow(mapping))) else tree <- add.tips(tree, tips = mapping[, 1], where = mapping[, 2]) } attr(tree, "pscore") <- pscore return(tree) }) while (iter) { res <- sankoff.nni(tree, dat, cost, ...) tree <- res$tree if (trace > 1) cat("optimize topology: ", pscore, "-->", res$pscore, "\n") pscore <- res$pscore swap <- swap + res$swap if (res$swap == 0) iter <- FALSE } if (trace > 0) cat("Final p-score", pscore, "after ", swap, "nni operations \n") } phangorn/R/pmlPen.R0000644000176200001440000001365013475602650013662 0ustar liggesusers#' @rdname phangorn-internal #' @export pmlPen <- function(object, lambda, ...) { if (inherits(object, "pmlPart")) return(pmlPartPen(object, lambda, ...)) if (inherits(object, "pmlMix")) return(pmlMixPen(object, lambda, ...)) else stop("object has to be of class pmlPart or pmlMix") } pmlPartPen <- function(object, lambda, control = pml.control(epsilon = 1e-8, maxit = 20, trace = 1), ...) { fits <- object$fits m <- length(fits) K <- -diag(length(fits[[1]]$tree$edge.length)) Ktmp <- K for (i in 1:(m - 1)) Ktmp <- cbind(Ktmp, K) KM <- Ktmp for (i in 1:(m - 1)) KM <- rbind(KM, Ktmp) diag(KM) <- m - 1 theta <- NULL l <- length(fits[[1]]$tree$edge.length) loglik <- 0 for (i in 1:m) { theta <- c(theta, fits[[i]]$tree$edge.length) loglik <- loglik + fits[[i]]$logLik } # print(loglik) pen <- -0.5 * lambda * t(theta) %*% KM %*% theta loglik <- loglik - 0.5 * lambda * t(theta) %*% KM %*% theta eps <- 1 H <- matrix(0, m * l, m * l) iter <- 0 trace <- control$trace while (abs(eps) > control$eps & iter < control$maxit) { theta <- NULL sc <- NULL for (i in 1:m) { theta <- c(theta, fits[[i]]$tree$edge.length) scoretmp <- score(fits[[i]], TRUE) sc <- c(sc, scoretmp$sc) H[(1:l) + l * (i - 1), (1:l) + l * (i - 1)] <- scoretmp$F } sc <- sc - lambda * KM %*% log(theta) thetanew <- log(theta) + solve(H + lambda * KM, sc) for (i in 1:m) fits[[i]]$tree$edge.length <- exp(thetanew[(1:l) + (i - 1) * l]) for (i in 1:m) fits[[i]] <- update.pml(fits[[i]], tree = fits[[i]]$tree) loglik1 <- 0 for (i in 1:m) loglik1 <- loglik1 + fits[[i]]$logLik logLik <- loglik1 if (trace > 0) print(loglik1) loglik0 <- loglik1 pen <- -0.5 * lambda * t(theta) %*% KM %*% theta loglik1 <- loglik1 - 0.5 * lambda * t(thetanew) %*% KM %*% thetanew eps <- (loglik - loglik1) / loglik1 loglik <- loglik1 theta <- exp(thetanew) iter <- iter + 1 if (trace > 0) print(iter) } df <- sum(diag(solve(H + lambda * KM, H))) object$df[1, 1] <- df object$df[1, 2] <- 1 object$fits <- fits object$logLik <- loglik0 attr(object$logLik, "df") <- sum(object$df[, 1] * object$df[, 2]) object$logLik.pen <- loglik attr(object$logLik.pen, "df") <- sum(object$df[, 1] * object$df[, 2]) object } pmlMixPen <- function(object, lambda, optOmega = TRUE, control = pml.control(epsilon = 1e-8, maxit = 20, trace = 1), ...){ fits <- object$fits m <- length(fits) K <- -diag(length(fits[[1]]$tree$edge.length)) tree <- fits[[1]]$tree Ktmp <- K for (i in 1:(m - 1)) Ktmp <- cbind(Ktmp, K) KM <- Ktmp for (i in 1:(m - 1)) KM <- rbind(KM, Ktmp) diag(KM) <- m - 1 theta <- NULL l <- length(fits[[1]]$tree$edge.length) omega <- object$omega dat <- fits[[1]]$data nr <- attr(dat, "nr") weight <- drop(attr(dat, "weight")) ll <- matrix(0, nr, m) for (i in 1:m) ll[, i] <- fits[[i]]$lv lv <- drop(ll %*% omega) loglik <- sum(weight * log(lv)) for (i in 1:m) theta <- c(theta, fits[[i]]$tree$edge.length) pen <- -0.5 * lambda * t(theta) %*% KM %*% theta loglik <- loglik + pen print(loglik) eps0 <- 1 dl <- matrix(0, nr, m * l) iter0 <- 0 trace <- control$trace while (abs(eps0) > control$eps & iter0 < control$maxit) { eps <- 1 iter <- 0 while (abs(eps) > 0.01 & iter < 5) { for (i in 1:m) { dl[, (1:l) + l * (i - 1)] <- dl(fits[[i]], TRUE) * omega[i] } dl <- dl / lv sc <- colSums(weight * dl) - lambda * KM %*% log(theta) H <- crossprod(dl * weight, dl) thetanew <- log(theta) + solve(H + lambda * KM, sc) for (i in 1:m) fits[[i]]$tree$edge.length <- exp(thetanew[(1:l) + (i - 1) * l]) for (i in 1:m) { tree$edge.length <- exp(thetanew[(1:l) + (i - 1) * l]) fits[[i]] <- update.pml(fits[[i]], tree = tree) ll[, i] <- fits[[i]]$lv } lv <- drop(ll %*% omega) loglik1 <- sum(weight * log(lv)) pen <- -0.5 * lambda * t(thetanew) %*% KM %*% thetanew loglik1 <- loglik1 + pen eps <- abs(loglik1 - loglik) theta <- exp(thetanew) loglik <- loglik1 iter <- iter + 1 } if (optOmega) { res <- optWPen(ll, weight, omega, pen) omega <- res$p for (i in 1:m) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- update(fits[[i]], llMix = pl0, wMix = omega[i]) } } lv <- drop(ll %*% omega) loglik1 <- sum(weight * log(lv)) loglik0 <- loglik1 loglik1 <- loglik1 - 0.5 * lambda * t(thetanew) %*% KM %*% thetanew eps0 <- (loglik - loglik1) / loglik1 theta <- exp(thetanew) loglik <- loglik1 iter0 <- iter0 + 1 if (trace > 0) print(loglik) } for (i in 1:m) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- update(fits[[i]], llMix = pl0, wMix = omega[i]) } df <- sum(diag(solve(H + lambda * KM, H))) penalty <- list(lambda = lambda, K = KM, thetanew = thetanew, ploglik = loglik) object$omega <- omega object$df[1, 1] <- df object$df[1, 2] <- 1 object$fits <- fits object$logLik <- loglik0 object$penalty <- penalty object } optWPen <- function(ll, weight, omega, pen, ...) { k <- length(omega) nenner <- 1 / omega[1] eta <- log(omega * nenner) eta <- eta[-1] fn <- function(eta, ll, weight, pen) { eta <- c(0, eta) p <- exp(eta) / sum(exp(eta)) res <- sum(weight * log(ll %*% p)) + pen res } if (k == 2) res <- optimize(f = fn, interval = c(-3, 3), lower = -3, upper = 3, maximum = TRUE, tol = .Machine$double.eps^0.25, ll = ll, weight = weight, pen = pen) else res <- optim(eta, fn = fn, method = "L-BFGS-B", lower = -5, upper = 5, control = list(fnscale = -1, maxit = 25), gr = NULL, ll = ll, weight = weight, pen = pen) p <- exp(c(0, res[[1]])) p <- p / sum(p) result <- list(par = p, value = res[[2]]) result } phangorn/R/F3X4.R0000644000176200001440000000602713475602650013113 0ustar liggesusers # estimate codon frequencies based on the F3X4 method getF3X4codon_frequencies <- function(codon_data, codon_alphabet = .CodonAlphabet, nucleotide_alphabet = .nucleotideAlphabet){ epirical_codon_frequenices <- baseFreq(codon_data) # get the position-wise nucleotide frequencies nuc_freq_by_pos <- matrix(0, nrow = length(nucleotide_alphabet), ncol = 3) for (i in seq_along(codon_alphabet)) { codon <- codon_alphabet[i] codon_freq <- epirical_codon_frequenices[i] for (j in 1:3) { nuc <- substr(codon, j, j) nuc_index <- which(nucleotide_alphabet == nuc) nuc_freq_by_pos[nuc_index, j] <- nuc_freq_by_pos[nuc_index, j] + codon_freq } } # construct the codon frequencies according to the F3X4 method codon_frequencies <- rep(0, length(codon_alphabet)) for (i in seq_along(codon_alphabet)) { codon <- codon_alphabet[i] codon_components <- unlist(strsplit(codon, "")) nuc1_freq <- nuc_freq_by_pos[which(nucleotide_alphabet == codon_components[1]), 1] nuc2_freq <- nuc_freq_by_pos[which(nucleotide_alphabet == codon_components[2]), 2] nuc3_freq <- nuc_freq_by_pos[which(nucleotide_alphabet == codon_components[3]), 3] codon_frequencies[i] <- nuc1_freq * nuc2_freq * nuc3_freq } codon_frequencies <- codon_frequencies / sum(codon_frequencies) return(codon_frequencies) } # compute frequencies for codon positions # TODO: using baseFreq codon should save memory instead of codon2dna bf_by_codon <- function(x) { y <- codon2dna(x) ny <- sum(attr(y, "weight")) M <- matrix(0, nrow = 4, ncol = 3) M[, 1] <- subset(y, select = seq(1, ny, by = 3), site.patter = FALSE) %>% baseFreq M[, 2] <- subset(y, select = seq(2, ny, by = 3), site.patter = FALSE) %>% baseFreq M[, 3] <- subset(y, select = seq(3, ny, by = 3), site.patter = FALSE) %>% baseFreq M } # return frequencies for all 61 states F3x4_freq <- function(M, CodonAlphabet = .CodonAlphabet, nucleotideAlphabet = .nucleotideAlphabet) { pos <- CodonAlphabet %>% strsplit("") %>% unlist %>% match(nucleotideAlphabet) %>% matrix(ncol = 3, byrow = TRUE) codon_frequencies <- M[pos[, 1], 1] * M[pos[, 2], 2] * M[pos[, 3], 3] codon_frequencies / sum(codon_frequencies) } F3x4 <- function(x) { BF <- bf_by_codon(x) F3x4_freq(BF) } F1x4_freq <- function(M, CodonAlphabet = .CodonAlphabet, nucleotideAlphabet = .nucleotideAlphabet) { pos <- CodonAlphabet %>% strsplit("") %>% unlist %>% match(nucleotideAlphabet) %>% matrix(ncol = 3, byrow = TRUE) codon_frequencies <- M[pos[, 1]] * M[pos[, 2]] * M[pos[, 3]] codon_frequencies / sum(codon_frequencies) } F1x4 <- function(x) { bf <- codon2dna(x) %>% baseFreq BF <- matrix(bf, 4, 3) F3x4_freq(BF) } # test # SCRIPT_DIR = # please fill in the script dir # codon_data_path = SCRIPT_DIR + "/codon_aln.fas" # codon_data = read.phyDat(codon_data_path, format = "fasta", type="CODON") # codon_frequencies = getF3X4codon_frequencies(codon_data) phangorn/vignettes/0000755000176200001440000000000013502203731014072 5ustar liggesusersphangorn/vignettes/seqLogo.pdf0000644000176200001440000013626113475602650016223 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20180116144537) /ModDate (D:20180116144537) /Title (R Graphics Output) /Producer (R 3.4.3) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 44364 /Filter /FlateDecode >> stream x$;8O\v6 n 6иF3SfEU%+p('k__O_?u믖jƏ~>~qأsxj珻v|v|Ǟ}k5 7?1_+cO\qϞ?}ݾOڏn}hocn׏7l~Nv]3?zz=o| =gwϟT{(cU~w^}wqmWaߟe]o =ߍh{>}}w֌{~[7g5ޟGߺm>1'_7׏97>fsxcO{^gW #jG׏x}φ}} =}7Gcgo߅xj>|~=Xxc}>{a;;jn}Fˁwswy)}]evܟuxW81>W7I}?sӎ*!ac<v܏=L_߃ Vv~ vU/*;nok^;gYR[[5_>{Uv̯Ϯ}׾gn#F;㱇ݸv}ߑ.;gXbxz̏-&-_Xjߟ}~=wr; {p|qkh?eךQsqYv*;aMG6b ֛ώo-]v/ 1>U5MOs4 ֣-g||vǞv|^x;s97c!_ٱ|ew}xcYv|[v̷_>+],?wt>򦿯1s4zX/sS?{s=츿쮲ֻr;X/z7賿qǃG\^~v#_0i ?߃ފ>; _ǃx_-㣗׏\ /8"*wguzþ2Oě}x{ЈW/x]೿q+g}Oz"l.~!`G Ñwƻao~?#iVw7?}==>r`omj==b͜Gp{;~\/uw>u}~7_~E'ǚ~qx\7~s>o~x|9oo>tO|7z~1ߛ7zo>|oq1||y4o??|ޙ-Ɉxϛj|?6{.EƷa9a7o7Ƿ m^?߷^ F[/Fi\_dތ/G[~z5";"^ƔpQ 1?a=zUK/>O{X|9ra㛏9Ǻ^ c/#|}?/㑱~Wz|؍>ް_#_ bȱu2^⹰Ƈ_7?xp|gqa?xrDcX_xtUƫaWx8xx\^ߑ<әf<QA;򽼟'+?rcg>e}ce>o^?w}1^gno|Y̷c/zEA;Fz!aW"%?5q??DŽ?G&싯_7w{uڱ^Ekd`o֛ҿ^d=kX?X<1?z[G\Pg1?1^eE/GnG2KۨWzoރzgσZg7B7`E=v|b}6㏧o<ßYW^ַ^ o.aԿXo=5PX$O5o[&?/d 4] 5QG]x!~7W b<~K]o3_Xߜ/뿜OxxiSc>>{< 6dzx#zq)a?gp'x|v7?1cr} WPZ|dhWYx{G7z? }XUO|o?]. ?d('m|"m{A^?G|8ʷˮ7ַSzDSt~_K[tM9;_i/#K^'WƯf" Yl/Lփ"~?|v̟/h|'W7h"/=|C<`,ċ7k zZs3e=sc7ꯍ>a^#_c_>Uσo>0ߍ=?QQo^G}{=Q~S(F=}s,l77oY_QOE3xcQ=:6C1_~|ns߬\(._e~7$1Wm?Oy;CO_c?y|د ϋ~g~?~6ճus=hQIǾZo{O>z4ן^=o_?f=iױF?\|췻?yW}g#hk{_??~=ke<窯_;?kD~{0د_|zs~G?KXߤoa>pa~?! Oc|^j؊'o3~9]7UCTMaowwaW>z؍}޵x?+#C#܏&}3~Ů׋~e;|Gkҿ#kG>|pU&os:}Џ2xc>S>vgߗYȇ~hGۍ\a?̯?nG՟}1?/E0>A=!zE_q_P܎zFz=oP [|?)/QX/Xod'l_^o_|SzRc/ԣ܏\[,׏sEsb5O_OYϋiKo@>ֿ+t^~복?9G=\oXߵ?ӰG5-og=zqEzm'y׋}y>Q.SoS_zoMM~~˯_CQPL=Y3 ;{N(}bfb36(c yg1ˌΞ3 am5D3 sT(lԊQAfvcdv$3XQ}n?}-Fa70{6c( 3v;~0 ;7(|ss1Fϯ}{|1A8`¾F3f ss#!Fag׌6(, QXY<6֌BhnyFaX5όQX`"(f>;z?;Ƴӌ‚(l3C(, G BlƯQf`r1 kIBOȌgWbH&QX9aFakjMQX=!1 1((D{0 +kf9B4 :f>{^fV(DFa fVf>{_>݌`>ξ~z?z(0r~=cZ1 9q(,0lb QXbqfr.y~yFw?u؂،fh3 9fQ/#N&Yf1d"X0dQ@3f&b41 sQb&ɌB7QQ@HQ{B`"Fa.0d"0ssÌ\`X9{p̛Qo( FO=%`(̬IQ9 P;r &B/Q7j$d>; &Ke3 9$f"~Fa_Qdl3 (6Qjݟu ~du0 9=ffnQ(\(t|ff(̬9QLcFf&o1 3w(|+bx1 aσQ9cFafs|=BQV1_QQiF!`fn.QMF6@B}j2}(U ~b~Q%FbyQ%Fzbj<<"FƓobjnFfQ@=fPO0z#(^aF 3 wQXb*_CS(bFa!zs(cF 3 Q@=ɌMfP2zԳ(eF03 Q@=͌n(^gF<3 Q@=ЌfPOtO"fP4z{P4zC(^jFT3 XfP5zs(kF`0^lFd3 7Q@=ڌfP6z(^nFt3 Q@=ތfP7z]ϋ]B'Q1 !F+(~žF!u0 H(8o(=FaeO!3 +{ (}B(,QX`&(t=:2 sBFaeY!2-/A㩞L}Fa=`(Q@`gFa==( @= cfV1d¾F[1 Q[B 3:/(b&t?`(FaebbFae3TXL9{QX x&8D_oՓ~)}0 ΃QXyڜώu1 _>rsڌ6(T*FadBĿ`}1 +3k9$Yόz3 T'f0*~Q9:#P~(TsF!w߃QX`>s3 sUa^u0 "`qo`Λj_.CDFaB`F! (=̪ U*Fa0>Q`j(ZB(̇g^ܴs0 h20{1 ̠f(L_d( (Fay0  PBg( 00hQ̍T3 hN30Q܈((eFa.ċk:(`Ō"3 h30sČ©ͮffQ Q`2(ό̍'3 a_0QYX703p0R3 =bgQ>QXcFa\ff6Q.z(~~yW{|=1 z?{(PCB/1 u?(PCB=/1 <g=>/bjQ&F_|P]B1 /(Q1dFʌ;3 f/(Q50rۿ`(ߛQz`F'fޘQzdFΌC3 X/(`=5PbQzmFfQ@`FfQ@bF;fQ@dFaףVª92 ^_Ѧ^xЌE!t8M3 G( ^5x֌]3 (TfoQ@`F'T}FCf/Q@>eFcfQ~/1 ( 4|ьI3 7( 5|ՌY3 w(3uucߗȷ( 7|݌Bi(^`Fap/bP0zG\GF3 (F3 ǘQ~I1 Q@njAfP/2zԛ(~zQ2zX;o}0 Q@͌qfP3zkq$<헀qz(iFJ3 կ+FN3 Q@ԌfPo5zk(kF^3 Q@،fPo6zWQzwQzQzQz(ԥS;14+gs if,Qa O6 ?ǰX}dvGw0=IPՈQmB==߃Ao?_3Hf?JLKrl=FOvxŽU(7egyFO{ {J#ax&}(&E>Oס44vRFžO2 H'PvCi$˽HP >FNڵ uS$%Q(EQ,eQx2^|M} {tS<J#WIRV#n)s(~~)^J9x2~ަdžHۏ)_S$u4if )jKyȏOGOOO2œk'4%77RIdw(J#/vS<DZJ"e@HT%YR<Id{(d>M񄽷)$'m'|~O/eR<,IDxX œe'OyJLQFMDM~4/*{ )ס4e'7))LS~փ)R<Ox8Hp%-Q<|MHT'AQbDFau0IdVkګ9b(ҋ7f:YBB&F!q0 h7o(,(cQ3()FNSQXQX( 8I>Y 5([QKQM(DaB"Fa('Q(1 rXQbu0 z bx {Xyq0 9 FKb %Fa1 'Q`( 10q֝WOў?(140YԌN7u0 3{(IibfG3 3"(4f{3 3ffXQ(170fbFaoFa6P'?if(N@[=Y1@{`QQ͚L}1 }Uè#F~b~Q)FzbyQ)Fa"FƓobjQ|5lF݌ 3 'fo(Q(Ib(Q4jF=8L!Fڌ:S3 X/(`=1ƌ#3 X(`=3ΌC3 X/(ɤbޚQzlFfޛQBfFfdW1 G( ^1PJbV1wW13@dF[f\1 ({fQ@hFěfQ@jFĻfQ@lFfg1 ( 7xߌCP,)1 '( 0ov"fϘQ@cFތ%3 ȧ( 2PJbs1 u2{.FN^|ьI3 %J1 kK9l?HGx`-27u~?1vP7b"q1y;`c{Q(,b";Fz) zUru0 h.6n2:}(RFF_p(b"D>{B)ՈQ(1 k|YQXP\/(,bJFB)YQXgVLL}QXPf{ UJpʁfFaio(<ӌь(F4}0 H4(D}jPa=kªR6.'SdFFa]` 4/odVaaFaƷu!^_3QX:=f>F:N7gٌkFa5217u0 aQ@5f\kFafbkFa8~S*m4ҡkF!y0 8ߌ@ڌB`fN 3 'Q.l1 _^^8^oPW~b~Q%FbyQ%FU<~փ(xPIB71 5(xPYBw1 5(|Q_IB71 5(|Bg1 5(?PBRndFʌ;3 f/(Q5lFڌ{3 X(`0Č3 X(`2̌;3 X(`4ԌB#QzlFRތ3 ( 0xÌ3 !F"( 1xȌ%3 Kg7J$㷱Fsf( 4x{'3xӌQ3 W( 5x׌a3 կ3PxیB);Q@nFa#@Ff/q_oI3 w( 2|ɌB)5Q@eFkfK=3 ( _4|ҌM3 G( _5|֌]3 $|oOQ~:1 ( _7PyGoF3 dpoJ#U0z3(C(^bF3 Q@=ƌBKQ@=nj=fP2zԓ(dFAyԳ7(bz(gF:3 QZK;KCifPo4z+(iFN3 Q@ԌfPo5zk(kF^3 Q@،fPo6zWQzwQzQzQz^i$RoO ЫU{sWvil12z~\?*L<7ԎxMw5b1+_ /{j;[=hnG1 QIdo^:y~{DEo|ʎ7rԀ]AxK5{N;7Mwaw]/z{ l[}eGnv=a] N֣#뱶; AUg^C3vo/ }k} m>VD=^;w1ZabKFjJbM%\AE-g`!hְw7{r-W#?"mڽQv/XZT5$twՋo#OV]J\>{@o+jdW''+1eC_j+h}w<ϻAer>7Z&JuvFRt,jm~^^^>_= T&&+]PymzEr,ŠNi z5GC-lWbSd=Oj{x5zvOxtyW_|;Q>wx$No7aWQIj7f׻qǸs iJN1uc=e﫧}dt+Ӎ*HY#I#^I >O3I#cosSy [vTZ1 Ko^7q}#Oc?|?-GOr}:}~xc}s}bzbغ^\/GKWY_-zlY^>zxc}K鬯&O̯kzCnކ/dqj?!W]E<[~.گx_U[P~yhK5֓ެqg{U6U=,3ǁx=ݰ/zR^@|=A?wGg:e=yc߁lkUY[^#_8bw}8ΰ_~1ן{q= Ϳ-ַwƿ/]:n?oB_azɴ[3sߗZroEl {~v棣pwZgGdrU/.Lw5/|_zS dz]lDƻЏ}/_;ыg"_M]6?/?٭l_:֋~=9{Ι~U;!|x71;ȏ^ϛ ~5c b=?7M^0sOQv||O,ܟ|na>_W'Sz\qh_&7b|ןHGſQn|g޲w2 o>gi /sR{ NnXhwsֿ|+x'c`aY8 ߯:o3 du獊'dOtVzxwue"sظ_캼_ Tk#^mY U'M_~/xswyז@og=sgSvԏ_~~:U^~r|T/^gsx ?yW9p{˾Xk8zO~z}{zOW>[l= 8~.c?nyqѿϋ^o?iֻEU@ZM֣̄ܿYěO쏒Eaغ~~go_jh b=oQzv;V~nOE daYx%_a+j;㯎_ ؋V'G" [[ 3^k!~G߀_g&}!.x~‡[' _~D:KپL[T|*Ǘ_~߇=/YGW*s&~XͿ~y~"ٵXFoă~n 'o~{q=v=X/+lYoK^_&"^Oדzvilzsxox4J3H\ITT ehQG+7wߘYsW2^(~z%x{ꕌWzW^IڗJ> J$QY=D [$쾬Wemz%^I19J|!3Wv1ꕄJKyz%a'n>J5Ě07K&b1s27sk/A|pأ[$XWv+ɃpJňWv2)u_Y+ {vz%?Dz%aGN9Ü!XÛ=z=_{0+ {b |F ] + #o'S$gY$ )W^IإW77CpZz%`JN2@m +HfW+ {+Ƀ3JNf 2V qb6Ξq z +1= ^(M+/zڑsLPSdFJFiz&;53fJFiQd`1^I"5? {7 W b;c?Ao.f{w/þ27;ꕄ=Ke=g#G/0ȉJ3,I$u(CꕄIO};R^Iz[$詧^ɀ{R?1a[J^JJͤW2L&P$R"&o`Pc^I1gizR$ Ճc)5P$ݬW2lK$q1 em+W2М& WRJ*pWJ*^I;+|Hz%/I)T%ǤWRJ*^I{+|Pz%/JIT)GWRJ*^I+|Xz%/KiT-ǥWRJ*^I+zJ^ 'H +zJ^!gH+zJ^"H-+zJ^#H=+zJ^$'IM+zJ^%gI]+zJ^&Im+zJ^'I}+zJ^('|7J+zzJ)J+zJ*J+zJz ^,'K+zJ^-gK+zJ^.K+zJ^/ WR~~Jj@z%Ox@Gد^ 3W ݭW^IڷJҾWkZJr>.^Ie(镄=+IWez%_^땤}[$cJ- %; 3I^Iz%?JŽݮyӿ+IZ$nz%땤ݬWm\?J2P~Wv^֤W2pJ+8Tz%Jd2镤}Y$n\oo Wv0z%wB1W<#&XHb^IڗJ2h+x[$z%L땄J~1'@/0^Iإq^#Ƭ=iײ^I{z%>+x^I^IڗJ2l+Ʌ[dE镄 d|{[$iJ¾@2+x{[$z%a_H~땄/y詄}w 47J$z%<+DzY$i tJ2?+Y$z%/d>W:]ʑc0aP$f,\+|^I^I槏J=WW2pJ2+ {.d`WX+|{Y$e,ldW^I^I^d^IڗJ`}d[ꕄݦJ~Wz%i_+zH^I^ ':#^ J`} 4I$3z%YyWv^I{n땄z%i7d`?Wz%iwdiY$z%ai_+I^Iֻ^땤=Wz%i+zkJW2%J^Z$eJ0(J+IY$뇏J^+I^Iz%i_+)G-JKJҾW"[CD]+x> ݏקJ{WKޏ\}.~R{h~yPϫk? S_=~փq@pSz%+^I37+)$W+)&w+)(+)*+),+).Sz!ZO0a^IG+Jz%iXWRJj^I+Vz%Kkz.ZWRJ*^^I+xCz%HT<#wWRJ*^^IS+xKz%I5T<'WRJ*^tIGT)GWRJ*mߥ_1a8!^IE<.ץWRJ*ޗ^I+|'?%|G>#w|&#!T$ʧWRJ*^Ik+|Nz%IAT('WRJ*^I+|L]T>3'/{!^ WRJ*_^ 󴿏|_z%U^I WRTAz%U^I+WR T7ؿzJ"H1+zJ#HA+zJ$7IQG?r:>T=_zJּz%UO^IۤWR8Ty LJ'J+zJؼFz%U^ uWRNT=Tz%U/^ISWRVT=Vz%U^IsWR^T=Xz%U/^IՓWRf镰z%WSlꕰMuFR˩Wz:JXo^ ^Ilf}><\IC9}x.r#υ51s;鲯C9}x..^݇'{v\8Fv6Yu6zjuƹ}_$XHubsxg.9Z^K;|t6|>l+݇ ] >,Za?YFs=7}ytSa8'>|gX;K>lKa9,t68\>lp:G%OơDHa} 3F݈ɥ~>}}ؓ=|x퉞t>lhIaÖF#݇]3y uxras9t648t68w>l0}` ts7>ҭ`M4u#Ctv98=}y>lhIa>fJcLG1׆y@uYa7olļ}qyu~c__hsE|`ONŦCaa9}X/u Q8݇Pk=q` d=kx[F]7Ân Z DZ4XC,}X!Y` ӊbu\U\5um4`ν 3:Ν`87-hIaAO HaeuPLCiJa!Bs{rP>,0Z}1}XW}XX/݇fB ]xT|)݇4jFttVw}uVƸO i>4m.L7>,k> 5G Lthb]9Y\\ϡPt@u}_>C^>C/>Co>C=/>C=o>xC>P=5ޤPQ}xƻu0b'>`\_G>`Zٺ}?uOc#>_Y̺w}?uOsMᏭj=XÆ>`>`#>`3>`C>`S>`c>`s>`> ^êsʩxúGxźgxǺxɺx˺ǬxͺxϺxѺ'xӺGx{gx׺xٺxۺǭ}@o]}@`q@aO|ƺw|ȺȗuoYuYuYu/ZuvsuZuv&}@l}@m}@n}@ozuPO }إ3v$Tu}C>^bSzuv2 X>cԃzuPOM}@=ʺWY,>eìzuPOm}@=κY<>gzuPO9Ϩ7H>^sQϴ}@=ԺZT>jczuPϵ>` zuPO}@=ںW[l>mízuPOSL6c|><ńS~u`7X} >~tjC:gv݇CaӢ l,Iao}5?tyf԰xscú;^q~}Ca/R :tv1Qa/݇]{Z'F<&݇ >lze/}i݇]suupuvk͎݇}R}ÞMۆ9Эq׬oY#s]> ].~݇ZoՃo@X>󺩃^TK}BCaJ0~޹o݇=+ :>T∏CaWO{+KCGg8g>LL{%݇ݡ{@wfaY}إqy>DƷ>t}xUaf.]B2"Ca#ߗÆtvNxѺ><:^6u%/Ca_aHf4u>,я|z˱iv>,}@aͺ tVYa!~~z[=}X_Âtփzm: >+y>3S>t"ڈ>FM݇O=O^Ja-7dR[aA7Q :}XyXub|6Y}@su}ߠ!݇U/QzZ5tw?tt&un*](2h޴B%FuúҽsCaa=úO'mX>Г%݇U=I:ttͥnU=ghIaطAZʞiat+yY\}XyuΑBϛttץpt`O:tV6f݇s.݇s왶}[\J~tJt~It~KtyIty݇/}$݇o}(݇},݇} ݇/}Ӛo}(݇}Yw>'º'}u௬f;>ZҺu& kc ms>tXuXuYu@L';>`=K>`=[>Ax]_Ѕc> ^ > ް> ^> ޱ!> ^)> ޲1> ^9{xϺ~ÏxӺ Y/Dj݇U83ZJA7/uq u> n}* ¹/?/[z]~O~~?+7~_wMB|} uZuv ]:}@>j}@>k}@>l,oȧPt}@>n}<}@=X>`݇}@=úwX>^bSzuPCKVszuPE}@=ɺ7YaיGdQ:31a}@̺Y6>g@ͺ[d}-u&_3ĥzuPo}@Һկ+݇]C~^jSzuP}@=׺Z`>^lԓzuYW[l3ew[p>T\UOCۥPtYǸ۰q/i_l>p_ m>=^>=e݇Cͺ76?vCɥO#݇v^Z>};b>>ݭvq9žu};br>=^>ݭv>"WRGZإ5EL!݇%Dž5t=z}x|Hf|>/zX#Á }x_rva^0F_(K}1xnڋMgg.tb>tb܇l>`:>yn݇wçREϳtM-r{˞nny|WO+aMC1Vs!g[9uE.Sž>\/|t:'n} L/8l>ɤֹx}kO<~}xc7S}xK-f[b6l0y[!݇5i8'@@=u^`Ų}>衖ÛXY5@y>ТxA>ڔ‹sŻv>ѥx8 @_`k=9_&?}xS G}O``Xcy/?Jyp~v>><>׺<5|}ۣs#óBt ÃG ><`4.uZ}x-?><9bFB'1ggB5#><7ِS5=2"ݤ@Bύ}d`>냚tP=g`=r_s%hJAN+݇s$IE-g@>! 4h )ws3[n.4>ysdF[ŷPP }Xh-W>x/}Xo@sX>,p1}X`+)BOؐ܇uc_۹G܇LqV>=߱  ˞}X}X艗gaM\܇uǏBO+#szRUc`c`l}`gbq}`5<>f_G܇>u=}-C>%C>-Cq~7q~Wq~wq<y3ϣx^}lws0'>`1㑹}xf;s0>`M;ks0>`0o}|d+s0̇>`4o}|lks0> _077}@>bsϘ|C> _2ȷ}@>f5sϙ|> _47}@>jUsϚ|> _6ȷ}@>n.טϛ|>^07}'>1}@d)s0zk>3}@hIsPozԫ>&lM }@=mmsPz>7z }`.n a sg!>@/1z[}59>@1zЋ}d&sGY>@2z}f6sǙy>@3z }}7=z;}jRs>@5zPz/X܇ғ}(Y܇ң}(Z܇ҳ}([܇}(\܇}(]܇}(^܇}(_܇Z }z\o >pgq"Gq;_anC}Y2!>Osvި>lA2ag;Asu΃ })rO}s ,>܇}}ؙHs1܇œ{`_krv|>F2a܇}CdwC܇;,s68y-q6>|5jsv;NOƾ>|+ǝhs6>}hnXm;.ƾ>a}ٌnΞs*_!yp}CY .\;q*ah6>ž}/>\z΁9p0}`a%C}|U܇`~<1qM.à?}ؙؚor '~rܮopc w|2W=@"q1~}iNB=Vr}X}X92am%L>܇fGsք})8_>,̏> .p=R80qd~)L܇|7i65a{.t~{C!}D#aauk>,p1}:+=>,_>,p2}Xk>,x}X熸+sVGHÂ'D܇3{>]Ѿ+}XbÂgD܇ϣ+77fsV6r\sV}B Iq"a܇+>L}fD>,x0}X٬nC>, }}mʁwx}sx|8>C}^>>u})C]oq~/qTWssq~7q~Wq~wqy(߯I܇z}Q܇z^Y܇z}@܇/}xbO<s0g>`3㡹/}xj[s0>``2/}|bs0g# }|iSsA>`6}@>`sO|#> _1w}@>d%sO|c> _3}@>hE!>7}@>jUsϚ|܇]{bKC^8o=~&qo^?z{22}@e1sPP^>3}@=iMsPzԳ5 O'qsPPyZGosO s7=>@0zo)>@o1z/)s=E>@O2zУ~dp}=6w=e>@O3z}^g@4z;}jRs>@5z{}lbs'܇jqJnqJIPzPz}h#zh“Z(<1GyQcC-{4٣&ƒ}QxR Gṱ/(,MQ8}pbz"CIBĭۣqԨ(D,{2Q~Q8<,( .z6ĔG!.= >u3G!ٖG!6Qhh֖G!wأmBC< ?(D|/{2(d|ۣQȸۣа< _(4l*B= ?(d|ۣe=FQ= KG= (zУE'= (G= =QMuܿqУo(~G+= QNB=("B=O(&B=(*B=(.B(x!B'(x#BG(x%Bg(x'B(x)B(xQZQ^QBOQFQJQNQROQVQZQ^Q|A'Q|CGQ|EgQ|GʇQ|IʧQ|KQ|MQ|OQ|Q'Q|SGQ|UgQ|WʇQ|YʧQ|[Q|]Q|_QzA'QzCDB3(T#BC(T$BS(T%Bc(T&Bs(T'BՃ(T(BՓ(T)Bգ(T*Bճ(T+B(T,B(T-B(T.B(T/B(^ B ( B(^!B(!B!(^"B)("B1(^#B9(#BA(^$BI($BQ(^%BY(%Ba(^&Bi(&Bq(^'By('B(^(BI,Q#Q(R=|gʣPz< ʣPz< ʣPz< ʣPz< ڣ(@/Gz= ЛQmj{gۣ(@/Gz= Qoz{ۣأ{j=AZoG#Q yj=CZ'!M|٣ǰGAȑG!6ѣkB>oN|>= 7{y(dQhʣkB{r|(d|ۣDGh"Bp@ߖ= ?(xQ8=3gx.QtأeB= 9>{r(dأ}G!eBƷ= O(|Q9Qkڣ1{h?(QqأP,^,Q|KBG!eBo{oGwɣðG!iB/{УzQ٣G)|^G!eB[/g~vۣq_^{2k(d>QhQ8ꋦe|O= WQ?3O= nyi(i0?7g^p}b.{(D#= ly^{7ȣu٣G!Qzr٣G!p6֫G!Ӂɵ!zW>(D== Y7{~n(D<= Yo7{o(D6{~(d}Q8jO@yeB /{GK'QG!nBC{RO(d|٣qQG!iBƷ= w {2QH}lأmB}ڣkBm= _(^7QG!= 7{2QhɣG!fBƏ= _(44ɣG!nB_{2~QGA](d|߉o{o~^}QG6߿e8^y= QB'zxѣޯ(~G;= |Q|'zѣ>q=yG;= QxAB'(x#BG(x%Bg(x'B(x)B(x+B(x-B(x/B(|!B'(|#BG(|%QNQROQ`?= 5ˣP< 5ˣP< ȣP< OȣP< ȣP< ȣP< ɣP< OɣP< ɣP< ɣP< ʣPѿz+ߔGz!8(T>+B(T>,uonx*냛=19-Q|^Qz@~Ĭ'9`= ߋx}(T#BC(T$BS(T%Bc(T&QzOQzQ'QzSGQzUgQzWQz>/sQoˣP< Uˣ<ޗGy.Os (!B(!B"B%("B-(#%Q(=G{Q(=HҋQ(=IқQ(=9'e](v7٣Pz< ɣPz< ^J=OQ(=z'GDyJo7gK}{/}=eB(^*B(*B(^+B(+B(^,B(,B(PGz6= ԻQNrzӣ@G*J<tWfqܲDsѹwLlfzvI8Of3y2g~\vx hw6JDZ 9 *^n-q~נ_:>iNɳcŷ_lJESQQ^Hz y`0ܡŊU8WdH,be`׫7̲Ewqb ,EY:l VP `ud"FOjD /:FC:QQq@ڜ5 ';NGuF.G\7/vU0 ţa;{ 츱g]˂s_q:_·QGȥTTZ  vx+v`REFe#;zV NϊQGVϊ#׷Ϗ].gz*<{c#K]ώkY,aı2ȯӘ;f e=;"~r"[F@ 1Cq {c^(RԮgHK8E3Xыه#i(F\"\B)1*ОRsQD\ף|>/"dxusQvV1~|"X3/ţ^+񯱃gqvY$y"^P$wֹ^Oq?]Y0sa|lّ]qx~:vq̘ EV[.gGK/w"Et1W</"ڹB6G(vyD[2zZFx6+c[{t5n{#gf[LW֚g=?5@T#Q׈:<M(m9q -/\̗:.aqg0grm随| rU^Oӊ ƓV+"TՁ@2_ZJ'/ؘOai*< r#b*R~8Ro䟓|U1ɺg#ߝ7:_P XbWU* -e*pf@GŎ׆؋ _t_[ݑ^@w:n/ W{AA^zc|\Y\LUO>s7t>;>P1~Zy^h*A<bEzMJ:y=C4oϻU.>_p]4tdղ޿(/~>#Ugvh0sU&Ƌ|vv|Bܜr̎X1zL8|la8:*ƋxH<*zN*7Ȼ+N|%;SN^{6'/>|*:k>|+;_f>Qq\ϩzГ+na/80PW;n _M 8$oqr1p<̯o8NPwQ&rhT#7PnWБcdV.r^Șs8RPoXN3z;롌^+}8빎z.ߢtUw^|9עL7~zU= Y;ZP|8>&%d@_f>_xt  H%|dP0^AyYGcAvA/J`6/cvx=m_r*߅^6CϏ1nZ?|qGG8_Wdrĵ8GG0~/.C:euVtQ.|cWC?7v?ƛّ̿1oz*3O햞g尾oP:ü><[\_p=׭:ח"eIև@֎Z[z{8Gqw֋tJOo1ݛO緍arMHXs>LJ1o;wxd#rZ1î}rob&蠎N}qibPt~~~Ϡt?lzɃz'8`E+V:ƻAZx1|c{;7vtԇ>78PAGxӘ.{7Aׇoh0P/o*_i@b~`Q w (#Aϭ<wA߉;NϻY^7Zn<_Q,߷3{@W.Fz)ַR7Q߽ynaLjHnѭ﹃CC#R8x-'q=;XqIAޒI&"~y|p4:>x@AiX3?hԃ6 K_r6tK^ߏ; GӐoM y| W]plIz7U u]\| Wzn齠7Ajø(2_[ڑ 츳M8TL J֣"{}SQOY<|Իٱ@yn> ب1u3|>q׎;bGX}ߛԺ^wyqG&X_q!PEGsסN(e=`gvaRun8^Z/,]q8;c]A:Ai^}vsMC;Gُ{QwgcuGpO oog?1\xNkz|M;,t0?y=;%{g|;MjOvP~Jҷ1C[Ӌ:So臛?pi>-;9; vۑD|+O'f~s*+x+y;K'/󹈕E\ow ?4 [1m߯n/7F d>k#^o#x(ƃ~(:P/d<*{?2~&^<Qd~q}PѯV>[QV^-꽼6~?ڸnlĪg;~_ճu]G|op z9>o8n_B>G |0~_zB>o_irG6˿_ސ ;=юKr8C?zJ:g0nEY;c<\6AOb_!zweSbwqn'?xDQXb^0'/I~97ۋ1ُ8/vٿD=g1~C@齵U;8M, O; <^_om_d>_Z jwЏPհ0)EetlN"ቲcƂN ؁MX3cjpASC_إ^(/DـŲ) AQ6ecaiQ6 4Kf\$Ҭ nMXidzKmtc] 1fƂKS=X6eca|Q6Crl˯(+.E;Mvb0ec5uU̞W( Q6V&kl,/J1ٔ $ۦl|9)+'GS6VnhJ1oS6V>sl\6e_1S2evwS6flL٘9ƙ17vg΂fS6 LlD{P6&Hul̬qL٘?)=Q6f޸l lL K2씦l\ 1el99ݔ (3kbS6&\l̬M٘AOPDdoRaP(H٘OD@raSS6f'bx[ec,]8L 1Yϔ9)305cv~'~y}Eـ֔ ?vecb<ecl\7ece9)Ƅ] 4˙sP6&|lєYp("\i6ecbQ6"I4\,3e#vP6瑔I 413g0eń)#+L@1b#UD]%D)Q<̓10ވ1@Eec,P8#@f5,eD)cDlMsP6Fl1&v FoQ6:dO90ވfRS6v]e#l "lUve#WA 1ecd iӔj(#{L@bbl E 1:ȶvA.Yc懣#RLuA 4KL8a Y2gGL(#S6oQ6`4ecl hl xD QaL@3)#'3ecjJ$lD|ܦl0=yx~&e<{U>(y G}Q6QC^le({Q({~oQ6~.uQ(uQ(uQ(u bS6Ϙ1Sz)ȗL@>b[l 3e)L@gAS6/|Ҕ 䛦l 5e)gM@tæl _6ece=UȷM@>nuS6ϛ|=Sg^g=7AN(гMـm1pS6=ݔ l@7ez)Mـo*8{^`F'Q lz(^!FgQjCk΢lufwS6V:i&ZS60pӔ=,DXec]q"ecTu8nl\6e#ƗvP6օ]IYȏDXCC*FwliFlLx.3i;(=l`{=S6FOח&<lLP~ó*Dє lmD( Q61a=zA܊]S6&Hl_x(Dـϔ (5ߊ1Ae)51Q?1(_G}4Q1AQecNP?'=C#5 τ(_ecbyQ60g%E M٨|JDQ6"Y`V}Aو|>(BQ6\eƄ] y_#!|i"ec4e)OM|kcS60_ܔ l 0e)'L@aS6|Ɣ ;l 2e)ȧL@e1S6 e=S6|{'M=@i, B䫦l 5e)ȇM٨~ |ڔ ۦl 7e)M@o,^p?" S3ITE{P6fQߔ Kl2e)L@fF{zϔ ԃl^4e)7M@=jUS6PϚzה æl^>;N~P6Pzޔ l@0ez)Lـ`S6W=Ô bS6Q -l@1e%EـcS6Ȕ Il@o2ezW=лLـf2S6͔ ql@3ez)L0ez)MـhFߊҔez)CMـ^jTS6=֔ 赦l@5ez)ЃMـ^ldS67QϢl^-F٢l-Fl^.Fl.Fecaec4=rq:YGƘչ7;0}lP=.>Q6>ꋾ3P?ѼO0o< N(5xM'KZ`] GO|=?'_7p77_߯/?_(dÍg㢿kk|sKߗǡ886qq,8B'dx';tq MG8Nx|yxtUxǮ:8>qqu+<mtq#K>?~綎'O >إv=`~˯_~s'f>Ĺh?7f388+>w~ܑ>w}ܕ>wz}}'gOY>r~Vnu'ުo?qs+GO]!8W}ʦ7X8wXr8FOa :~_~_[aм,6!x ZG"8Bͳ m<^qXc.w2*c(ȿ]yY,d˝r"Tgg♨Tp'k\fx=Z/?o_}$oendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 576 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj xref 0 11 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000044729 00000 n 0000044812 00000 n 0000044924 00000 n 0000044957 00000 n 0000000212 00000 n 0000000292 00000 n 0000047652 00000 n 0000047909 00000 n trailer << /Size 11 /Info 1 0 R /Root 2 0 R >> startxref 48006 %%EOF phangorn/vignettes/phangorn.bib0000644000176200001440000010166413475602650016410 0ustar liggesusers@article{Abascal2005, author = {Abascal, Federico and Zardoya, Rafael and Posada, David}, title = {ProtTest: selection of best-fit models of protein evolution}, volume = {21}, number = {9}, pages = {2104-2105}, year = {2005}, doi = {10.1093/bioinformatics/bti263}, URL = {http://bioinformatics.oxfordjournals.org/content/21/9/2104.abstract}, eprint = {http://bioinformatics.oxfordjournals.org/content/21/9/2104.full.pdf+html}, journal = {Bioinformatics} } @article{Leo2008, author = {de Oliveira Martins, Leonardo AND Leal, Élcio AND Kishino, Hirohisa}, journal = {PLoS ONE}, publisher = {Public Library of Science}, title = {Phylogenetic Detection of Recombination with a Bayesian Prior on the Distance between Trees}, year = {2008}, month = {07}, volume = {3}, url = {http://dx.plos.org/10.1371%2Fjournal.pone.0002651}, pages = {1-13}, number = {7}, doi = {10.1371/journal.pone.0002651} } @article{Leo2016, author = {De Oliveira Martins, Leonardo and Mallo, Diego and Posada, David}, title = {A Bayesian Supertree Model for Genome-Wide Species Tree Reconstruction}, volume = {65}, number = {3}, pages = {397-416}, year = {2016}, oi = {10.1093/sysbio/syu082}, URL = {http://sysbio.oxfordjournals.org/content/65/3/397.abstract}, eprint = {http://sysbio.oxfordjournals.org/content/65/3/397.full.pdf+html}, journal = {Systematic Biology} } @article{Schwarz1978, author = "Schwarz, Gideon", doi = "10.1214/aos/1176344136", fjournal = "The Annals of Statistics", journal = "Ann. Statist.", month = "03", number = "2", pages = "461--464", publisher = "The Institute of Mathematical Statistics", title = "Estimating the Dimension of a Model", url = "http://dx.doi.org/10.1214/aos/1176344136", volume = "6", year = "1978" } @incollection{Jukes1969, title = "\{CHAPTER\} 24 - Evolution of Protein Molecules ", editor = "Munro, H.N. ", booktitle = "Mammalian Protein Metabolism", publisher = "Academic Press", year = "1969", pages = "21--132", author = "Thomas H. Jukes and Charles R. Cantor" } @Article{Tavare1986, author = {Tavar\'{e}, Simon}, title = {Some probabilistic and statistical problems in the analysis of DNA sequences}, journal= {Lectures on Mathematics in the Life Sciences}, number = {17}, pages = {57--86}, year = {1986}, publisher = {American Mathematical Society} } @Article{Sugiura1978, Title = {{Further analysts of the data by akaike' s information criterion and the finite corrections}}, Author = {Sugiura, Nariaki}, Journal = {Communications in Statistics - Theory and Methods}, Year = {1978}, Month = jan, Number = {1}, Pages = {13--26}, Volume = {7}, Keywords = {aic, criteria, model, selection}, Url = {http://dx.doi.org/10.1080/03610927808827599} } @article{Knuth1984, title={Literate programming}, author={Knuth, Donald E.}, journal={The Computer Journal}, volume={27}, number={2}, pages={97--111}, year={1984}, publisher={British Computer Society} } @article{Buckheit1995, title={WaveLab and Reproducible Research}, author={Buckheit, J.B. and Donoho, D.L.}, journal={Wavelets and statistics}, volume={103}, pages={55}, year={1995}, publisher={Springer Verlag} } @Manual{rmarkdown, title = {rmarkdown: Dynamic Documents for R}, author = {JJ Allaire and Joe Cheng and Yihui Xie and Jonathan McPherson and Winston Chang and Jeff Allen and Hadley Wickham and Aron Atkins and Rob Hyndman}, year = {2015}, note = {R package version 0.8}, url = {http://CRAN.R-project.org/package=rmarkdown}, } @Manual{phyloch, title = {PHYLOCH: R language tree plotting tools and interfaces to diverse phylogenetic software packages.}, author = {C. Heibl}, year = {2008 onwards}, url = {http://www.christophheibl.de/Rpackages.html}, } @Manual{ips, title = {Interfaces to Phylogenetic Software in R}, author = {C. Heibl}, year = {2015}, url = {http://www.christophheibl.de/Rpackages.html}, note = {R package version 0.0-7}, } @Manual{CRAN, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2015}, url = {http://www.R-project.org/}, } @Manual{Biostrings, title = {Biostrings: String objects representing biological sequences, and matching algorithms}, author = {H. Pages and P. Aboyoun and R. Gentleman and S. DebRoy}, year = {2015}, note = {R package version 2.36.4}, } @Manual{Matrix, title = {Matrix: Sparse and Dense Matrix Classes and Methods}, author = {Douglas Bates and Martin Maechler}, year = {2015}, note = {R package version 1.2-0}, url = {http://CRAN.R-project.org/package=Matrix}, } @Manual{seqLogo, title = {seqLogo: Sequence logos for DNA sequence alignments}, author = {Oliver Bembom}, note = {R package version 1.34.0}, year = {2015} } @Manual{apex, title = {apex: Phylogenetic Methods for Multiple Gene Data}, author = {Thibaut Jombart and Zhian Namir Kamvar and Klaus Schliep and Rebecca Harris}, note = {R package version 1.0.1}, year = {2015} } @Manual{Turlach2013, title = {quadprog: Functions to solve Quadratic Programming Problems.}, author = {Berwin A. Turlach and Andreas Weingessel}, year = {2013}, note = {R package version 1.5-5}, url = {http://CRAN.R-project.org/package=quadprog}, } @Manual{rgl, title = {rgl: 3D Visualization Using OpenGL}, author = {Daniel Adler and Duncan Murdoch and {others}}, year = {2015}, note = {R package version 0.95.1247}, url = {http://CRAN.R-project.org/package=rgl}, } @article{Bouckaert2010, author = {Bouckaert, Remco R.}, title = {{DensiTree}: making sense of sets of phylogenetic trees}, volume = {26}, number = {10}, pages = {1372-1373}, year = {2010}, doi = {10.1093/bioinformatics/btq110}, URL = {http://bioinformatics.oxfordjournals.org/content/26/10/1372.abstract}, eprint = {http://bioinformatics.oxfordjournals.org/content/26/10/1372.full.pdf+html}, journal = {Bioinformatics} } @article{Cavalli1967, author = {Cavalli-Sforza, L.L. and Edwards, A.W.F.}, year = {1967}, title = {Phylogenetic analysis: models and estimation procedures}, journal = {American Journal of Human Genetics}, volume = {19}, pages = {233--257} } @Article{Huson2006, Author = "D.H. Huson and D. Bryant", Title = "Application of Phylogenetic Networks in Evolutionary Studies", Journal = "Molecular Biology and Evolution", Volume = "23", Number = "2", Pages = "254--267", Year = "2006" } @InCollection{Buneman1971, author = "Peter Buneman", title = "The recovery of trees from measures of dissimilarity", booktitle = "Mathematics in the Archaeological and Historical Sciences", editor = "Hodson, F. R. and Kendall, D. G. and Tautu, P. T.", publisher = "Edinburgh University Press", pages = "387--395", year = "1971" } @Article{Buneman1974, title = {A Note on the Metric Properties of Trees}, author = {Peter Buneman}, journal = {Journal of combinatorial theory (B)}, year = {1974}, volume = {17}, pages = {48--50} } @article{Fitch1971, author = {Fitch, Walter M.}, title = {Toward Defining the Course of Evolution: Minimum Change for a Specific Tree Topology}, volume = {20}, number = {4}, pages = {406-416}, year = {1971}, doi = {10.1093/sysbio/20.4.406}, URL = {http://sysbio.oxfordjournals.org/content/20/4/406.abstract}, eprint = {http://sysbio.oxfordjournals.org/content/20/4/406.full.pdf+html}, journal = {Systematic Biology} } @article {Paradis2017, author = {Paradis, Emmanuel and Gosselin, Thierry and Goudet, Jérôme and Jombart, Thibaut and Schliep, Klaus}, title = {Linking genomics and population genetics with R}, journal = {Molecular Ecology Resources}, issn = {1755-0998}, url = {http://dx.doi.org/10.1111/1755-0998.12577}, doi = {10.1111/1755-0998.12577}, pages = {n/a--n/a}, keywords = {multivariate analysis, NGS, R, SNP, VCF}, year = {2017}, } @article {Jombart2017, author = {Jombart, Thibaut and Archer, Frederick and Schliep, Klaus and Kamvar, Zhian and Harris, Rebecca and Paradis, Emmanuel and Goudet, Jérome and Lapp, Hilmar}, title = {apex: phylogenetics with multiple genes}, journal = {Molecular Ecology Resources}, issn = {1755-0998}, url = {http://dx.doi.org/10.1111/1755-0998.12567}, doi = {10.1111/1755-0998.12567}, pages = {n/a--n/a}, keywords = {R, package, Software, Genetics, Phylogenies}, year = {2017}, } @article{Kuhner1994, author = {Kuhner, M K and Felsenstein, J}, title = {A simulation comparison of phylogeny algorithms under equal and unequal evolutionary rates.}, volume = {11}, number = {3}, pages = {459-468}, year = {1994}, URL = {http://mbe.oxfordjournals.org/content/11/3/459.abstract}, eprint = {http://mbe.oxfordjournals.org/content/11/3/459.full.pdf+html}, journal = {Molecular Biology and Evolution} } @article{Lento1995, author = {Lento, G M and Hickson, R E and Chambers, G K and Penny, D}, title = {Use of spectral analysis to test hypotheses on the origin of pinnipeds.}, volume = {12}, number = {1}, pages = {28-52}, year = {1995}, doi = {10.1093/oxfordjournals.molbev.a040189}, URL = {http://mbe.oxfordjournals.org/content/12/1/28.abstract}, eprint = {http://mbe.oxfordjournals.org/content/12/1/28.full.pdf+html}, journal = {Molecular Biology and Evolution} } @article{Leaché2015, author = {Leaché, Adam D. and Banbury, Barbara L. and Felsenstein, Joseph and Nieto-Montes de Oca, Adrián and Stamatakis, Alexandros}, title = {Short Tree, Long Tree, Right Tree, Wrong Tree: New Acquisition Bias Corrections for Inferring SNP Phylogenies}, year = {2015}, doi = {10.1093/sysbio/syv053}, URL = {http://sysbio.oxfordjournals.org/content/64/6/1032.abstract}, eprint = {http://sysbio.oxfordjournals.org/content/64/6/1032.full.pdf+html}, journal = {Systematic Biology} } @article{Lewis2001, author = {Lewis, Paul O.}, title = {A Likelihood Approach to Estimating Phylogeny from Discrete Morphological Character Data}, volume = {50}, number = {6}, pages = {913-925}, year = {2001}, doi = {10.1080/106351501753462876}, URL = {http://sysbio.oxfordjournals.org/content/50/6/913.abstract}, eprint = {http://sysbio.oxfordjournals.org/content/50/6/913.full.pdf+html}, journal = {Systematic Biology} } @article{Potts2014, author = {Potts, Alastair J. and Hedderson, Terry A. and Grimm, Guido W.}, title = {Constructing Phylogenies in the Presence Of Intra-Individual Site Polymorphisms (2ISPs) with a Focus on the Nuclear Ribosomal Cistron}, volume = {63}, number = {1}, pages = {1-16}, year = {2014}, doi = {10.1093/sysbio/syt052}, URL = {http://sysbio.oxfordjournals.org/content/63/1/1.abstract}, eprint = {http://sysbio.oxfordjournals.org/content/63/1/1.full.pdf+html}, journal = {Systematic Biology} } @Article{ Rambaut1997, Author = "A. Rambaut and N.C. Grassly", Title = "Seq-Gen: an application for the Monte Carlo simulation of DNA sequence evolution along phylogenetic trees", Journal = "Comput Appl Biosci", Volume = "13", Pages = "235--238", Year = "1997" } @Article{Revell2012, title = {phytools: An R package for phylogenetic comparative biology (and other things).}, author = {Liam J. Revell}, journal = {Methods in Ecology and Evolution}, year = {2012}, volume = {3}, pages = {217-223}, } @Article{Revell2014, Title = {Rphylip: an {R} interface for {PHYLIP}}, Author = {Revell, Liam J. and Chamberlain, Scott A.}, Journal = {Methods in Ecology and Evolution}, Year = {2014}, Number = {9}, Pages = {976--981}, Volume = {5}, Doi = {10.1111/2041-210X.12233}, ISSN = {2041-210X}, Keywords = {phylogeny, statistics, computational biology, evolution}, Url = {http://dx.doi.org/10.1111/2041-210X.12233} } @InBook{Robinson1979, Title = {Combinatorial Mathematics VI: Proceedings of the Sixth Australian Conference on Combinatorial Mathematics, Armidale, Australia, August 1978}, Author = {Robinson, D. F. and Foulds, L. R.}, Chapter = {Comparison of weighted labelled trees}, Editor = {Horadam, A. F. and Wallis, W. D.}, Pages = {119--126}, Publisher = {Springer Berlin Heidelberg}, Year = {1979}, Address = {Berlin, Heidelberg}, Doi = {10.1007/BFb0102690}, ISBN = {978-3-540-34857-3}, Url = {http://dx.doi.org/10.1007/BFb0102690} } @article{Robinson1981, author = "D.F. Robinson and L.R. Foulds", title = "Comparison of phylogenetic trees", journal = "Mathematical Biosciences", volume = "53", number = "1", pages = "131 - 147", year = "1981", note = "", issn = "0025-5564", doi = "http://dx.doi.org/10.1016/0025-5564(81)90043-2", url = "http://www.sciencedirect.com/science/article/pii/0025556481900432", } @article{Holland2004, author = {Holland, Barbara R. and Huber, Katharina T. and Moulton, Vincent and Lockhart, Peter J.}, title = {Using Consensus Networks to Visualize Contradictory Evidence for Species Phylogeny}, volume = {21}, number = {7}, pages = {1459-1461}, year = {2004}, doi = {10.1093/molbev/msh145}, URL = {http://mbe.oxfordjournals.org/content/21/7/1459.abstract}, eprint = {http://mbe.oxfordjournals.org/content/21/7/1459.full.pdf+html}, journal = {Molecular Biology and Evolution} } @article{Bryant2004, author = {Bryant, David and Moulton, Vincent}, title = {{Neighbor-Net}: An Agglomerative Method for the Construction of Phylogenetic Networks}, volume = {21}, number = {2}, pages = {255-265}, year = {2004}, doi = {10.1093/molbev/msh018}, URL = {http://mbe.oxfordjournals.org/content/21/2/255.abstract}, eprint = {http://mbe.oxfordjournals.org/content/21/2/255.full.pdf+html}, journal = {Molecular Biology and Evolution} } @Article{Csardi2006, title = {The igraph software package for complex network research}, author = {Gabor Csardi and Tamas Nepusz}, journal = {InterJournal}, volume = {Complex Systems}, pages = {1695}, year = {2006}, url = {http://igraph.org}, } @Article{ Stefankovic2007a, Author = "D. Stefankovic and E. Vigoda", Title = "Pitfalls of heterogeneous processes for phylogenetic reconstruction", Journal = "Systematic Biology", Volume = "56", Number = "1", Pages = "113--124", Year = "2007" } @article{Nguyen2015, author = {Nguyen, Lam-Tung and Schmidt, Heiko A. and von Haeseler, Arndt and Minh, Bui Quang}, title = {IQ-TREE: A Fast and Effective Stochastic Algorithm for Estimating Maximum-Likelihood Phylogenies}, volume = {32}, number = {1}, pages = {268-274}, year = {2015}, doi = {10.1093/molbev/msu300}, URL = {http://mbe.oxfordjournals.org/content/32/1/268.abstract}, eprint = {http://mbe.oxfordjournals.org/content/32/1/268.full.pdf+html}, journal = {Molecular Biology and Evolution} } @Article{ Nixon1999, Author = "K. Nixon", Title = "The Parsimony Ratchet, a New Method for Rapid Rarsimony Analysis", Journal = "Cladistics", Volume = "15", Pages = "407--414", Year = "1999" } @Article{ Matsen2007, Author = "F. A. Matsen and M. Steel", Title = "Phylogenetic mixtures on a single tree can mimic a tree of another topology", Journal = "Systematic Biology", Volume = "56", Number = "5", Pages = "767--775", Year = "2007" } @Article{ Pagel2004, Author = "Mark Pagel and Andrew Meade", Title = "A Phylogenetic Mixture Model for Detecting Pattern-Heterogeneity in Gene Sequence or Character-State Data", Journal = "Systematic Biology", Volume = "53", Number = "4", Pages = "571--581", Year = "2004" } @Article{ Thornton2004, Author = "B. Kolaczkowski and J. W. Thornton", Title = "Performance of maximum parsimony and likelihood phylogenetics when evolution is heterogeneous", Journal = "Nature", Volume = "431", Number = "7011", Pages = "980--984", Year = "2004" } @Article{ Studier1988, Author = "J. A. Studier and K. J. Keppler", Title = "A Note on the Neighbor-Joining Algorithm of Saitou and Nei", Journal = "Molecular Biology and Evolution", Volume = "5", Number = "6", Pages = "729--731", Year = "1988" } @Article{ Saitou1987, Author = "N. Saitou and M. Nei", Title = "The Neighbor-Joining Method - a New Method for Reconstructing Phylogenetic Trees", Journal = "Molecular Biology and Evolution", Volume = "4", Number = "4", Pages = "406--425", Year = "1987" } @Article{ Pagel2008, Author = "Mark Pagel and Andrew Meade", Title = "Modelling heterotachy in phylogenetic inference by reversible-jump Markov chain Monte Carlo", Journal = "Philosophical Transactions of the Royal Society B", Volume = "363", Pages = "3955--3964", Year = "2008" } @Article{ Shimodaira1999, Author = "Shimodaira, H. and Hasegawa, M.", Title = "Multiple comparisons of log-likelihoods with applications to phylogenetic inference.", Journal = "Molecular Biology and Evolution", Volume = "16", Pages = "1114--1116", Year = "1999" } @InCollection{ Pagel2005, Author = "Mark Pagel and Andrew Meade", Title = "Mixture models in phylogenetic inference", BookTitle = "Mathematics of evolution and phylogeny", Editor = "Olivier Gascuel", Publisher = "Oxford", Address = "New York", Year = "2005" } @article{Pupko2000, author = {Pupko, Tal and Pe, Itsik and Shamir, Ron and Graur, Dan}, title = {A Fast Algorithm for Joint Reconstruction of Ancestral Amino Acid Sequences}, volume = {17}, number = {6}, pages = {890-896}, year = {2000}, eprint = {http://mbe.oxfordjournals.org/content/17/6/890.full.pdf+html}, journal = {Molecular Biology and Evolution} } @article{Pupko2002, author = {Pupko, Tal and Pe'er, Itsik and Hasegawa, Masami and Graur, Dan and Friedman, Nir}, title = {A branch-and-bound algorithm for the inference of ancestral amino-acid sequences when the replacement rate varies among sites: Application to the evolution of five gene families}, volume = {18}, number = {8}, pages = {1116-1123}, year = {2002}, doi = {10.1093/bioinformatics/18.8.1116}, URL = {http://bioinformatics.oxfordjournals.org/content/18/8/1116.abstract}, eprint = {http://bioinformatics.oxfordjournals.org/content/18/8/1116.full.pdf+html}, journal = {Bioinformatics} } @InCollection{ Swofford1996, Author = "Swofford, D.L. and Olsen, G.J. and Waddell, P.J. and Hillis, D.M.", Title = "Phylogenetic Inference", BookTitle = "Molecular Systematics", Editor = "Hillis, D.M. and Moritz, C. and Mable, B.K", Edition = "Second", Publisher = "Sinauer", Address = "Sunderland, MA", Year = "1996" } @Article{ Kolaczkowski2008, Author = "Bryan Kolaczkowski and Joseph W. Thornton", Title = "A Mixed Branch Length Model of Heterotachy Improves Phylogenetic Accuracy", Journal = "Molecular Biology and Evolution", Volume = "25", Number = "6", Pages = "1054--1066", Year = "2008" } @Article{ Dempster1977, Author = "A. P. Dempster and N. M. Laird and D. B. Rubin", Title = "Maximum likelihood from incomplete data via the EM algorithm", Journal = "Journal of the Royal Statistical Society B", Volume = "39", Number = "1", Pages = "1--38", Year = "1977" } @Book{ Felsenstein2004, Author = "Joseph Felsenstein", Title = "Inferring Phylogenies", Publisher = "Sinauer Associates", Address = "Sunderland", Year = "2004" } @Article{ Felsenstein1981, Author = "Joseph Felsenstein", Title = "Evolutionary trees from DNA sequences: a maxumum likelihood approach", Journal = "Journal of Molecular Evolution", Volume = "17", Pages = "368--376", Year = "1981" } @Article{ Felsenstein1985, Author = "Joseph Felsenstein", Title = "Confidence limits on phylogenies. An approach using the bootstrap", Journal = "Evolution", Volume = "39", Pages = "783--791", Year = "1985" } @inproceedings{Leisch2002, author = {Friedrich Leisch}, title = {Sweave: Dynamic Generation of Statistical Reports Using Literate Data Analysis}, booktitle = {Compstat 2002 --- Proceedings in Computational Statistics}, pages = {575--580}, year = 2002, editor = {Wolfgang H{\"a}rdle and Bernd R{\"o}nz}, publisher = {Physica Verlag, Heidelberg}, note = {ISBN 3-7908-1517-9}, url = {http://www.stat.uni-muenchen.de/~leisch/Sweave} } @Article{Penny1985, Author = "D. Penny and M.D. Hendy", Title = "Testing methods evolutionary tree construction", Journal = "Cladistics", Volume = "1", Pages = "266--278", Year = "1985" } @Article{Penny1986, Author = "D. Penny and M.D. Hendy", Title = "Estimating the reliability of evolutionary trees", Journal = "Molecular Biology and Evolution", Volume = "3", Pages = "403--417", Year = "1986" } @Article{Yang1998, author="Yang, Ziheng and Nielsen, Rasmus", title="Synonymous and nonsynonymous rate variation in nuclear genes of mammals", journal="Journal of Molecular Evolution", year="1998", volume="46", number="4", pages="409--418", doi="10.1007/PL00006320", url="http://dx.doi.org/10.1007/PL00006320" } @Book{ Yang2006, Author = "Ziheng Yang", Title = "Computational Molecular evolution", Publisher = "Oxford University Press", Address = "Oxford", Year = "2006" } @Book{ Yang2014, Author = "Ziheng Yang", Title = "Molecular Evolution: A Statistical Approach", Publisher = "Oxford University Press", Address = "Oxford", Year = "2014" } @article {Michaux2003, author = {Michaux, J. R. and Magnanou, E. and Paradis, E. and Nieberding, C. and Libois, R.}, title = {Mitochondrial phylogeography of the Woodmouse (Apodemus sylvaticus) in the Western Palearctic region}, journal = {Molecular Ecology}, volume = {12}, number = {3}, publisher = {Blackwell Science Ltd}, issn = {1365-294X}, url = {http://dx.doi.org/10.1046/j.1365-294X.2003.01752.x}, doi = {10.1046/j.1365-294X.2003.01752.x}, pages = {685--697}, keywords = {Apodemus sylvaticus, glacial refuge, mtDNA, North Africa, phylogeography, postglacial colonization, Western Palearctic region }, year = {2003}, } @Article{ Paradis2004, Author = "E. Paradis and J. Claude and K. Strimmer", Title = "{APE}: Analyses of Phylogenetics and Evolution in {R} language", Journal = "Bioinformatics", Volume = "20", Number = "2", Pages = "289--290", Year = "2004" } @Book{ Paradis2006, Author = "Emmanuel Paradis", Title = "Analysis of Phylogenetics and Evolution with R", Publisher = "Springer", Address = "New York", Year = "2006" } @Book{ Paradis2012, Author = "Emmanuel Paradis", Title = "Analysis of Phylogenetics and Evolution with R", Edition = "Second", Publisher = "Springer", Address = "New York", Year = "2012" } @article{Paradis2018, author = {Paradis, Emmanuel and Schliep, Klaus}, title = {ape 5.0: an environment for modern phylogenetics and evolutionary analyses in R}, journal = {Bioinformatics}, volume = {35}, number = {3}, pages = {526-528}, year = {2019}, doi = {10.1093/bioinformatics/bty633}, URL = {http://dx.doi.org/10.1093/bioinformatics/bty633}, eprint = {/oup/backfile/content_public/journal/bioinformatics/pap/10.1093_bioinformatics_bty633/2/bty633.pdf} } @InCollection{ seqinr, author = "D. Charif and J.R. Lobry", title = "Seqin{R} 1.0-2: a contributed package to the {R} project for statistical computing devoted to biological sequences retrieval and analysis.", booktitle = "Structural approaches to sequence evolution: Molecules, networks, populations", year = "2007", editor = "M. Porto H.E. Roman {U. Bastolla} and M. Vendruscolo", series = "Biological and Medical Physics, Biomedical Engineering", pages = "207--232", address = "New York", publisher = "Springer", note = "{ISBN :} 978-3-540-35305-8" } @Article{ Mathews2010, Author = "S. Mathews and M.D. Clements and M.A. Beilstein", Title = "A duplicate gene rooting of seed plants and the phylogenetic position of flowering plants.", Journal = "Phil. Trans. R. Soc. B", Volume = "365", Pages = "383--395", Year = "2010" } @article {Schliep2017, author = "Schliep, Klaus and Potts, Alastair J. and Morrison, David A. and Grimm, Guido W.", title = "Intertwining phylogenetic trees and networks", journal = "Methods in Ecology and Evolution", url = "http://dx.doi.org/10.1111/2041-210X.12760", doi = "10.1111/2041-210X.12760", volume = {8}, number = {10}, pages = {1212-1220}, keywords = "Exploratory Data Analysis, Networks, PHANGORN, R, Trees", year = "2017" } @Article{ Schliep2011, title = "phangorn: Phylogenetic analysis in {R}", author = "Klaus Peter Schliep", journal = "Bioinformatics", year = "2011", volume = "27", number = "4", pages = "592--593", doi = {10.1093/bioinformatics/btq706}, URL = {http://bioinformatics.oxfordjournals.org/content/27/4/592.abstract}, eprint = {http://bioinformatics.oxfordjournals.org/content/27/4/592.full.pdf+html}, } @Thesis{Schliep2009, author = "Klaus Schliep", title = "Some Applications of statistical phylogenetics", school = "Massey University", year = 2009 } @article{Lanfear2012, author = {Lanfear, Robert and Calcott, Brett and Ho, Simon Y. W. and Guindon, Stephane}, title = {Partition{F}inder: Combined Selection of Partitioning Schemes and Substitution Models for Phylogenetic Analyses}, volume = {29}, number = {6}, pages = {1695-1701}, year = {2012}, doi = {10.1093/molbev/mss020}, URL = {http://mbe.oxfordjournals.org/content/29/6/1695.abstract}, eprint = {http://mbe.oxfordjournals.org/content/29/6/1695.full.pdf+html}, journal = {Molecular Biology and Evolution} } @Article{ Rokas2003, title = "Genome-scale approaches to resolving incongruence in molecular phylogenies", author = "A. Rokas and B.L. Williams and N. King and S.B. Carroll", journal = "Nature", year = "2011", volume = "425", number = "6960", pages = "798--804" } @Article{ Schliep2011b, title = "Harvesting Evolutionary Signals in a Forest of Prokaryotic Gene Trees", author = "Klaus Schliep and Philippe Lopez and Fran\c{c}ois-Joseph Lapointe and Eric Bapteste", journal = "Molecular Biology and Evolution", year = "2011", volume = "28", number = "4", pages = "1393--1405" } @Article{ Swofford1987, title = "Reconstructing ancestral character states under Wagner parsimony", author = "D.L. Swofford and W.P. Maddison", journal = "Math. Biosci.", year = "1987", Volume = "87", pages = "199--229" } @article{Posada1998, author = {Posada, D. and Crandall, K.A.}, title = {{MODELTEST}: testing the model of {DNA} substitution.}, volume = {14}, number = {9}, pages = {817--818}, year = {1998}, journal = {Bioinformatics} } @article{Posada2008, author = {Posada, David}, title = {{jModelTest}: Phylogenetic Model Averaging}, volume = {25}, number = {7}, pages = {1253--1256}, year = {2008}, URL = {http://mbe.oxfordjournals.org/content/25/7/1253.abstract}, journal = {Molecular Biology and Evolution} } @article{Hendy1982, author = {M.D. Hendy and D. Penny}, title = {Branch and bound algorithms to determine minimal evolutionary trees}, volume = {59}, pages = {277--290}, year = {1982}, journal = {Math. Biosc.} } @Book{ Rao1973, Author = "C.R. Rao", Title = "Linear statistical inference and its applications", Publisher = "John Wiley", Address = "New York", Year = "1973" } @Book{ Burnham2002, Author = "K. P. Burnham and D. R. Anderson", Title = "Model selection and multimodel inference: a practical information-theoretic approach", Edition = "Second", Publisher = "Springer", Address = "New York", Year = "2002" } @Article{ Lapointe2010, title = "Clanistics: a multi-level perspective for harvesting unrooted gene trees", journal = "Trends in Microbiology", volume = "18", number = "8", pages = "341--347", year = "2010", url = "http://www.sciencedirect.com/science/article/pii/S0966842X10000570", author = "Fran\c{c}ois-Joseph Lapointe and Philippe Lopez and Yan Boucher and Jeremy Koenig and Eric Bapteste" } @article{Vos2003, author = {Vos, R. A.}, title = {Accelerated Likelihood Surface Exploration: The Likelihood Ratchet}, volume = {52}, number = {3}, pages = {368-373}, year = {2003}, doi = {10.1080/10635150390196993}, URL = {http://sysbio.oxfordjournals.org/content/52/3/368.abstract}, journal = {Systematic Biology} } @article{Wilkinson2007, title = "Of clades and clans: terms for phylogenetic relationships in unrooted trees", journal = "Trends in Ecology and Evolution", volume = "22", number = "3", pages = "114--115", year = "2007", url = "http://www.sciencedirect.com/science/article/pii/S016953470700019", author = "Mark Wilkinson and James O. McInerney and Robert P. Hirt and Peter G. Foster and T. Martin Embley" } @article{Warnow2012, title = "Standard maximum likelihood analyses of alignments with gaps can be statistically inconsistent", journal = "PLOS Currents Tree of Life", year = "2012", doi = "10.1371/currents.RRN1308", author = "Tandy Warnow" } @Manual{knitr, title = {knitr: A General-Purpose Package for Dynamic Report Generation in R}, author = {Yihui Xie}, year = {2015}, note = {R package version 1.11}, url = {http://yihui.name/knitr/}, } @Book{Xie2015, title = {Dynamic Documents with {R} and knitr}, author = {Yihui Xie}, publisher = {Chapman and Hall/CRC}, address = {Boca Raton, Florida}, year = {2015}, edition = {2nd}, note = {ISBN 978-1498716963}, url = {http://yihui.name/knitr/}, } @InCollection{Xie2014, booktitle = {Implementing Reproducible Computational Research}, editor = {Victoria Stodden and Friedrich Leisch and Roger D. Peng}, title = {knitr: A Comprehensive Tool for Reproducible Research in {R}}, author = {Yihui Xie}, publisher = {Chapman and Hall/CRC}, year = {2014}, note = {ISBN 978-1466561595}, url = {http://www.crcpress.com/product/isbn/9781466561595}, } @article{Wang2012, author = {Wang, Ning and Braun, Edward L. and Kimball, Rebecca T.}, title = {Testing Hypotheses about the Sister Group of the Passeriformes Using an Independent 30-Locus Data Set}, volume = {29}, number = {2}, pages = {737-750}, year = {2012}, doi = {10.1093/molbev/msr230}, URL = {http://mbe.oxfordjournals.org/content/29/2/737.abstract}, eprint = {http://mbe.oxfordjournals.org/content/29/2/737.full.pdf+html}, journal = {Molecular Biology and Evolution} } @article{Muse1994, author = {Muse, S V and Gaut, B S}, title = {A likelihood approach for comparing synonymous and nonsynonymous nucleotide substitution rates, with application to the chloroplast genome.}, journal = {Molecular Biology and Evolution}, volume = {11}, number = {5}, pages = {715-724}, year = {1994}, doi = {10.1093/oxfordjournals.molbev.a040152}, URL = {http://dx.doi.org/10.1093/oxfordjournals.molbev.a040152}, eprint = {/oup/backfile/content_public/journal/mbe/11/5/10.1093_oxfordjournals.molbev.a040152/1/715.pdf} } @article{Kosiol2007, author = {Kosiol, Carolin and Holmes, Ian and Goldman, Nick}, title = {An Empirical Codon Model for Protein Sequence Evolution}, journal = {Molecular Biology and Evolution}, volume = {24}, number = {7}, pages = {1464-1479}, year = {2007}, doi = {10.1093/molbev/msm064}, URL = {http://dx.doi.org/10.1093/molbev/msm064}, eprint = {/oup/backfile/content_public/journal/mbe/24/7/10.1093_molbev_msm064/2/msm064.pdf} } @article{Goldman1994, author = {Goldman, N and Yang, Z}, title = {A codon-based model of nucleotide substitution for protein-coding DNA sequences.}, journal = {Molecular Biology and Evolution}, volume = {11}, number = {5}, pages = {725-736}, year = {1994}, doi = {10.1093/oxfordjournals.molbev.a040153}, URL = {http://dx.doi.org/10.1093/oxfordjournals.molbev.a040153}, eprint = {/oup/backfile/content_public/journal/mbe/11/5/10.1093_oxfordjournals.molbev.a040153/1/mbe725.pdf} } @article{Pond2005, author = {Pond, Sergei Kosakovsky and Muse, Spencer V.}, title = {Site-to-Site Variation of Synonymous Substitution Rates}, journal = {Molecular Biology and Evolution}, volume = {22}, number = {12}, pages = {2375-2385}, year = {2005}, doi = {10.1093/molbev/msi232}, URL = {http://dx.doi.org/10.1093/molbev/msi232}, eprint = {/oup/backfile/content_public/journal/mbe/22/12/10.1093_molbev_msi232/1/msi232.pdf} } phangorn/vignettes/Trees.Rnw0000644000176200001440000003265713475602650015675 0ustar liggesusers%\VignetteIndexEntry{Constructing phylogenetic trees} %\VignetteKeywords{Documentation} %\VignettePackage{phangorn} %\VignetteEngine{Sweave} \documentclass[12pt]{article} \usepackage{times} \usepackage{hyperref} \begin{document} \SweaveOpts{concordance=TRUE} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\R}{\textsf{R}} \newcommand{\pml}{\Robject{pml}} \newcommand{\phangorn}{\Rpackage{phangorn}} \newcommand{\ape}{\Rpackage{ape}} \newcommand{\multicore}{\Rpackage{multicore}} \newcommand{\term}[1]{\emph{#1}} \newcommand{\mref}[2]{\htmladdnormallinkfoot{#2}{#1}} % leave comments in the text \SweaveOpts{keep.source=TRUE} % Ross Ihakas extenstion for nicer representation \DefineVerbatimEnvironment{Sinput}{Verbatim} {xleftmargin=2em} \DefineVerbatimEnvironment{Soutput}{Verbatim}{xleftmargin=2em} \DefineVerbatimEnvironment{Scode}{Verbatim}{xleftmargin=2em} \fvset{listparameters={\setlength{\topsep}{0pt}}} \renewenvironment{Schunk}{\vspace{\topsep}}{\vspace{\topsep}} <>= options(width=70) foo <- packageDescription("phangorn") options("show.signif.stars" = FALSE) @ \title{Estimating phylogenetic trees with phangorn} %$ (Version \Sexpr{foo$Version})} \author{\mref{mailto:klaus.schliep@gmail.com}{Klaus P. Schliep}} \maketitle \nocite{Paradis2012} \section{Introduction} These notes should enable the user to estimate phylogenetic trees from alignment data with different methods using the \phangorn{} package \cite{Schliep2011}. Several functions of \phangorn{} are also described in more detail in \cite{Paradis2012}. For more theoretical background on all the methods see e.g. \cite{Felsenstein2004, Yang2006}. This document illustrates some of the \phangorn{} features to estimate phylogenetic trees using different reconstruction methods. Small adaptations to the scripts in section \ref{sec:Appendix1} should enable the user to perform phylogenetic analyses. \section{Getting started} The first thing we have to do is to read in an alignment. Unfortunately there exists many different file formats that alignments can be stored in. The function \Rfunction{read.phyDat} is used to read in an alignment. There are several functions to read in alignments depending on the format of the data set (nexus, phylip, fasta) and the kind of data (amino acid or nucleotides) in the \ape{} package \cite{Paradis2004} and \phangorn{}. The function \Rfunction{read.phyDat} calls these other functions. For the specific parameter settings available look in the help files of the function \Rfunction{read.dna} (for phylip, fasta, clustal format), \Rfunction{read.nexus.data} for nexus files. For amino acid data additional \Rfunction{read.aa} is called. %When using the \Rfunction{read.dna} from \ape{} the parameter the we have to use as.character=TRUE. We start our analysis loading the \phangorn{} package and then reading in an alignment. <>= library(ape) library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") @ \section{Distance based methods} After reading in the alignment we can build a first tree with distance based methods. The function dist.dna from the ape package computes distances for many DNA substitution models. To use the function dist.dna we have to transform the data to class DNAbin. For amino acids the function \Rfunction{dist.ml} offers common substitution models (for example "WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa" or "mtREV24"). After constructing a distance matrix we reconstruct a rooted tree with UPGMA and alternatively an unrooted tree using Neighbor Joining \cite{Saitou1987,Studier1988}. More distance methods like fastme are available in the \Rpackage{ape} package. <>= dm <- dist.ml(primates) treeUPGMA <- upgma(dm) treeNJ <- NJ(dm) @ We can plot the trees treeUPGMA and treeNJ (figure \ref{fig:NJ}) with the commands: <>= layout(matrix(c(1,2), 2, 1), height=c(1,2)) par(mar = c(0,0,2,0)+ 0.1) plot(treeUPGMA, main="UPGMA") plot(treeNJ, "unrooted", main="NJ") @ \begin{figure} \begin{center} <>= <> @ \end{center} \caption{Rooted UPGMA tree and unrooted NJ tree} \label{fig:NJ} \end{figure} Distance based methods are very fast and we will use the UPGMA and NJ tree as starting trees for the maximum parsimony and maximum likelihood analyses. \section{Parsimony} The function parsimony returns the parsimony score, that is the number of changes which are at least necessary to describe the data for a given tree. We can compare the parsimony score or the two trees we computed so far: <>= parsimony(treeUPGMA, primates) parsimony(treeNJ, primates) @ The function optim.parsimony performs tree rearrangements to find trees with a lower parsimony score. The tree rearrangement implemented are nearest-neighbor interchanges (NNI) and subtree pruning and regrafting (SPR). The later one only works so far with the fitch algorithm. However is also a version of the parsimony ratchet \cite{Nixon1999} implemented, which is likely to find better trees than just doing NNI / SPR rearrangements. <>= treePars <- optim.parsimony(treeUPGMA, primates) treeRatchet <- pratchet(primates, trace = 0) parsimony(c(treePars, treeRatchet), primates) @ For small data sets it is also possible to find all most parsimonious trees using a branch and bound algorithm \cite{Hendy1982}. For data sets with more than 10 taxa this can take a long time and depends strongly on how tree like the data are. <>= (trees <- bab(subset(primates,1:10))) @ \section{Maximum likelihood} The last method we will describe in this vignette is Maximum Likelihood (ML) as introduced by Felsenstein \cite{Felsenstein1981}. We can easily compute the likelihood for a tree given the data <>= fit = pml(treeNJ, data=primates) fit @ The function \Rfunction{pml} returns an object of class \Robject{pml}. This object contains the data, the tree and many different parameters of the model like the likelihood. There are many generic functions for the class Robject{pml} available, which allow the handling of these objects. <>= methods(class="pml") @ The object fit just estimated the likelihood for the tree it got supplied, but the branch length are not optimized for the Jukes-Cantor model yet, which can be done with the function \Rfunction{optim.pml}. <>= fitJC <- optim.pml(fit, TRUE) logLik(fitJC) @ With the default values \Rfunction{pml} will estimate a Jukes-Cantor model. The function \Rfunction{update.pml} allows to change parameters. We will change the model to the GTR + $\Gamma(4)$ + I model and then optimize all the parameters. <>= fitGTR <- update(fit, k=4, inv=0.2) fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE, rearrangement = "NNI", control = pml.control(trace = 0)) fitGTR @ With the control parameters the threshols for the fitting process can be changed. Here we want just to supress output during the fitting process. For larger trees the NNI rearrangements often get stuck in local maxima. We added two stochatic algorithm to improve topology search. The first (set rearrangement="stochastic") performs stochastic rearrangements similar as in \cite{Nguyen2015}, which makes random NNI permuation to the tree, which than gets optimised to escape local optima. The second option (rearrangement="ratchet") perform the likelihood ratchet \cite{Vos2003}. While these algorithms may find better trees they will also take more time. <>= fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE, rearrangement = "stochastic", control = pml.control(trace = 0)) fitGTR @ \subsection{Model selection} We can compare nested models for the JC and GTR + $\Gamma(4)$ + I model using likelihood ratio statistic <>= anova(fitJC, fitGTR) @ with the Shimodaira-Hasegawa \cite{Shimodaira1999} test <>= SH.test(fitGTR, fitJC) @ or with the AIC <>= AIC(fitJC) AIC(fitGTR) AICc(fitGTR) BIC(fitGTR) @ An alternative is to use the function \Rfunction{modelTest} to compare different nucleotide or protein models the AIC, AICc or BIC, similar to popular programs ModelTest and ProtTest \cite{Posada1998, Posada2008, Abascal2005}. <>= load("Trees.RData") @ <>= mt = modelTest(primates) @ The results of \Rfunction{modelTest} is illustrated in table \ref{tab:modelTest} \begin{center} <>= library(xtable) print(xtable(mt, caption="Summary table of modelTest", label="tab:modelTest"), include.rownames=FALSE) @ \end{center} The thresholds for the optimization in \Rfunction{modelTest} are not as strict as for \Rfunction{optim.pml} and no tree rearrangements are performed. As \Rfunction{modelTest} computes and optimizes a lot of models it would be a waste of computer time not to save these results. The results are saved as call together with the optimized trees in an environment and this call can be evaluated to get a "pml" object back to use for further optimization or analysis. <>= env <- attr(mt, "env") ls(envir=env) (fit <- eval(get("HKY+G+I", env), env)) @ At last we may want to apply bootstrap to test how well the edges of the tree are supported: %, results=hide <>= bs = bootstrap.pml(fitJC, bs=100, optNni=TRUE, control = pml.control(trace = 0)) @ %$ Now we can plot the tree with the bootstrap support values on the edges and also look at consensusNet to identify potential conflict. <>= par(mfrow=c(2,1)) par(mar=c(1,1,3,1)) plotBS(midpoint(fitJC$tree), bs, p = 50, type="p") title("a)") cnet <- consensusNet(bs, p=0.2) plot(cnet, "2D", show.edge.label=TRUE) title("b)") @ %$ \begin{figure} \begin{center} <>= <> @ \end{center} \caption{a) Unrooted tree (midpoint rooted) with bootstrap support values. b) ConsensusNet from the bootstrap sample} \label{fig:BS} \end{figure} Several analyses, e.g. \Rfunction{bootstrap} and \Rfunction{modelTest}, can be computationally demanding, but as nowadays most computers have several cores one can distribute the computations using the \multicore{} package. However it is only possible to use this approach if R is running from command line ("X11"), but not using a GUI (for example "Aqua" on Macs) and unfortunately the \multicore{} package does not work at all under Windows. \newpage \section{Appendix: Standard scripts for nucleotide analysis}\label{sec:Appendix1} Here we provide two standard scripts which can be adapted for the most common tasks. Most likely the arguments for \Rfunction{read.phyDat} have to be adapted to accommodate your file format. Both scripts assume that the \multicore{} package works on your platform, see comments above. <>= options(prompt=" ") options(continue=" ") @ <>= library(phangorn) file="myfile" dat = read.phyDat(file) dm = dist.ml(dat, "F81") tree = NJ(dm) # as alternative for a starting tree: tree <- pratchet(dat) # parsimony tree tree <- nnls.phylo(tree, dm) # need edge weights # 1. alternative: quick and dirty: GTR + G fitStart = pml(tree, dat, k=4) fit = optim.pml(fitStart, model="GTR", optGamma=TRUE, rearrangement="stochastic") # 2. alternative: preper with modelTest mt <- modelTest(dat, tree=tree, multicore=TRUE) mt[order(mt$AICc),] # choose best model from the table according to AICc bestmodel <- mt$Model[which.min(mt$AICc)] env = attr(mt, "env") fitStart = eval(get("GTR+G+I", env), env) # or let R search the table fitStart = eval(get(bestmodel, env), env) # equivalent to: fitStart = eval(get("GTR+G+I", env), env) fit = optim.pml(fitStart, rearrangement = "stochastic", optGamma=TRUE, optInv=TRUE, model="GTR") bs = bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE) @ \newpage \section{Appendix 2: Standard scripts for amino acid analysis}%\label{sec:Appendix2} You can specify different several models build in which you can specify, e.g. "WAG", "JTT", "Dayhoff", "LG". Optimizing the rate matrix for amino acids is possible, but would take a long, a very long time and you will need to have a large alignement to estimate all the parameters. So make sure to set optBf=FALSE and optQ=FALSE in the function \Rfunction{optim.pml}, which is also the default. <>= library(phangorn) file="myfile" dat = read.phyDat(file, type = "AA") dm = dist.ml(dat, model="JTT") tree = NJ(dm) # parallel will only work safely from command line # and not at all windows (mt <- modelTest(dat, model=c("JTT", "LG", "WAG"), multicore=TRUE)) # run all available amino acid models (mt <- modelTest(dat, model="all", multicore=TRUE)) fitStart = eval(get(mt$Model[which.min(mt$BIC)], env), env) fitNJ = pml(tree, dat, model="JTT", k=4, inv=.2) fit = optim.pml(fitNJ, rearrangement = "stochastic", optInv=TRUE, optGamma=TRUE) fit bs = bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE) @ <>= options(prompt="> ") options(continue="+ ") @ \newpage % \cite{Sugiura1978} \bibliographystyle{plain} \bibliography{phangorn} \section{Session Information} The version number of \R{} and packages loaded for generating the vignette were: <>= toLatex(sessionInfo()) @ \end{document} phangorn/vignettes/Trees.RData0000644000176200001440000050112613475602650016112 0ustar liggesusers}@TK!-T0P.x1PADQ,$%nP,ACY%V0|]{杙wޙ3g|ɽ{Np!';I_ײ$#$/#ɔD_K8%f gY),dP%b PE}3‘E}YfчY.= Fx8D/ތ`9C2K+ 1¯^}ٺǧHfY܎"bą1A=Gzv$oUW -U6Nkwcr%wGPPw_rT! }.=Lo]Wrٗ{7Z/yӐ[>T4uwIE^-{nCl|n P^;>u]x"UΓ6Ԭ623kK] <3.E]k Iު[ -1Zbn*LS[s 3 ]KkK5y M-WzӴj{)3-4M9Xdfahlɼ'o`hb =]y#{=:*(h,? 6^"[_["wƲeaMZd}o\i-YahY|lSLP!'؉@ĝ䅫5K_ o?La͟@WùKL}X&x`ыoV7C!!o'z1f/@YmTfe8.ON#α.ZIrOx  O1[^<&|z iNto)3viBRߍc\;{&D3Cb;b:pz=ňᇔd f: ҟWrG#W!ݽ d}̙2ao-^p$脠 ʸc ;y=xv{|U$I~D9֝ƒ "ץOn:p!.}9ړ:,rHPQO$m&qH:+T|^rrжu5 *kbn:u5Hew='{Wj, i-<߫'n]Q$QNÆӟKΣaUn:A;3S6FԗT"YqKh^,ٍaVw7 4nPsH= B[d?Ey؆|ASޑ(屈{q*}?^DHdzrvGzI<5yw]m^Wy2~/]+`{_(N, w]R]j濮!oRuʣ$^:,BtG"X~IJώnלZ8>)\Wd <6]G*Cqsse}x闅2P*S{RvuR'g#>#u88ޮ1]ԸwL<2b'dW;:l^/Qϗ/!|o] ~Oc 4MgƊ˔:lIP5.Z3>5ő%^V̈́čL3Mt ]R  f#!vA;png)/6B٥"&盦b^Eٳ!$b}6$| ;)+ȏ{o@jYn:b>qO3@]p^:W!ey TUggCAkJ H#iz4ӧ +'.H_HR`č7Dһ mv^V9=]?~sWy/#]OzBf9κyL}OKWDib|-jB^&9  ,x( Dd׎vGm[48kk8)%o TC#/șZ[:5s (Af^ *6cmp5r%E<)Չ(9b:0s*4wč;EvK[ AR%Qp7Q_5I}{+DTMv8)lTow3:z_agZ?kgrtBzWV=ϝh/BvFC$[R"Q> Frtɨx*W==4 $nP `w:.E/)ƅ_:kGPlN={ʳ6EP#쮸f+))G@0O."c guqܺz܏By o4Qwi1= 12 )OW`juvî8.eHxOޯ.n0G T\(|F`7n6,Dȉc<㯾g놙<º'/#l'կq^U"r:~sXR:jmu;VBHOB^٣Eќ)FAOOgqrT.z Pq1QL6z䲁pUq7:.3O4&+?SanriK"&v1wYqLb(#"i>CSgTt\B^cD7t [\JuǿhS;?/Ig~gO{؀Jy^=.1o Dtj\F,/ ߚW3ʅbtUPQDUZ> q<2z-[4.­wk}De8Wo{U1IcJx_lCXyS2o`zHQ|1[-Fؠ>H>p} VSN͜=Qs/̽8|**!OXJ.H8G:"^}ԧ3?XaS^`]gH0B_'5㨨-{v x~1Ď';UGX nk蹰!dW C}Hܬzn<{_=\\"#җh「7Z4?, QgZ g [()~Ѡ:t7l;ȉh>G> xKHv^JbQRΉ 猬İ}:/|pM.Jm}|Ķ;hWq[n:1}D/Mc}Q6pkiyJDo5>ӭ( l#ȾSHi(y3"W;%^DǬ)[P)9)kClilaB|.j|:fQr@xa(8 )p7,^Wއy^RҾd^|3cpSb|.,0% F-o|t]mY_',(AF<9|)CO;xh]ö̜ĵϏqɬ#ψ8a$#68ÁQ1V, Ok.;Y`߈{V]rz_n+Fr3s"dn|~oi~$jbjQ?U!c\>!S9p3ϓ>}Ͳ~; ŷ~sQ^F7ӧV#@kWEȢƿ=y%x!dV3dvɗw=r+n zGAt@7t@s']oǥgN0אʎ7F Yfv^P9O|H %A "BYH[Q~%Kt@䁮6w_Tl^g^}h‘Ct?᭣tq$`~>N:|UG>=n<Ye3fϒ!S)LjzgOx /6>Nmz&O6 G5qwRrphO߾_I;Uu+%Q7r5;P趬,S+b{5?gb\~[KeV<40tOx wٜS3 TƂ3f驥[, oqK!uBxm ڑ_6Ft+ҷ؏/ k_E]ڑchu7Ed,(V ɻ3hHbPO=2 I6Mh=ƣl\PKb]v?B*9AҾ7/Agk6nt%'dV[?!/#L3qԧ3`?z|(i{,M̏ ^^Cs T9+w¡!3!.e`ܒY9:8Hy?pHnm {Jg$+-5u|RR]WzAv?taitE]>.#>x-l_2^FȺ?Ÿ@'"PpeS7H;z?A q .#%!oY*%@^1sr";29,є Ĕ 1as~Ar1g4DH\Vy,h}|=C:9_dPyß+|2Dk(1q;^Ӈ4kd|S<#~TXB D7t]ק+ ޹;dd4h (뷥|1>v޷H{#0_]u6AGB|!j%$sy4|B6wy"|=իs\sy*v&h <ɫ ɽstSr6|Оx/ؒe owEpj +yI-*"gɜ׫k.[zX+G%MOAazJ9nH EE 7w~kkoʒaR:eٻ2$y-UOw":}ofE>G:p]Ev9CjCRho_Wd0v;JGj5UDH.OBRD7t|p]q Olxag~t]Oxs-"5"z oWWsqk#(͸~s׫S,췳)>{nf>BqQ9C9W(]qB]jIЪ^[nAF9/ڎȷ_y!j}Ar=9C_[1#7_9p5D7t`cf=.hOWTI͛%JVEԳ7瘠dkC5kPbiz{nB~yClrVed|1}x-{#ve=.??܄qUIҖpعvVg eOXeI 8lgC|!WeMO e"q[Kxn(;+&XeoJرeogH6b$25jW /<@ta!tRw<; j胇$im-B#nFgRGQB.y@&/1ږi,(GҔ!}Q:ʇ#h#'S3޷\ an3HٌOvgnzӝHqOY!wL)6t䭞`6Y8HP7Hq8%JёۻlJ|Ft@fdO+7Oj{ȝ</#w.-Ҹ=%tT.$E}oEp Q\wWQ煮^\1[|\8(7=/B\ӐzH*h~avgDq}c4W)AfvW6b؞5V;KNW+,EݔOE. c.s/m rڞ؀&}-W^BD7t OYvfc+}L}X#%696d?綡.݉}AQ}BWDu{GRټp0Ud'j͒El OHU=2N8ldg<E7Q/ՠ̲4$gY/?n`YB,CQRY"I^ʰ_{D{ΈPY| i_?v#0/3^G^}:ʷk-gxԶ)!egfBǫ q~i_7<:1<#bp;Fp1gkZI><܏e8e7/#XH[[4$f7>~ ڸ% -haxRx-_^dH[עto`[3T=O:]; vgK恮?K~ tgڭјyD`$O̾2Uq@K΋80`wL=<]u\j&so7lZCt@_S5O?S??bT"=B ج^g"ē7wnچq(.==4,HglR8om|͗BA2gM>/"uDa}r,ej olj28Dˬ[$w2RggcųV\m6A&P(߾l"`Iq۝恮zBVoS?2qͪ< w'hW_Tۦ%_@ݩ[U\ͣwW[,uZ8%b8~&nE(R|]\$Ey͆F\bisyKcw#dO]ai0_~X{L9m2}<F0I^f_JxО;hF@tO"H 9hI&Ʀg4?jO͍[QU]:1{p8BƲ|b6[7 =Plj|OJܗzՑW7"T[j- PY?hL]ڷ XUo9A9.61wcy򁡵(he/{!yekm:ҽ$}4azOۉlﶽ*{qE3 Jc4@ V sᇼ2m;q^Xes+i ik>eK. w@ě#@7Jo _x]WtߝWپ$"b{vj|]OVE+Eޞ=QqG1,8UoHW~&d3.8<]Eٓ4~)Q٨nfpD}x Drͼ} I."y@>]q\PzJ'q;/;W DYN)k]-DPU29' R?{:k"E(IOB9Uz>FN޹~.zr;v8;7w/–%z |ЄYCb &4z!$A}5eHkA$F|ۋ@)^zUH}ee_1߼^恮+ゟE/)ƅ_Vh>!ѻ?=3!:9Au>)zx5n>4X8P҆i!:hڽUNfW ^O ɯTetp%_9N$ݚ &ځ`'{f،S#%e Pn{\Of,W!>"fHҜw@~ڡD7teчL~O#:O Xb\y~'J=C#7oŠ7>zҊ,X ĔǪ &`(g*K |y|i]qpX:.]1>M!r 䞁1>:|fS'f T1enH1ôE+E9BO"YgiV#F^Μ Hڞ T'yb t{E/}I_˾ʷqUekjÆX57>@PdݛX$Gd ڤK!T|ACH^qB$$H>[wJ"4`^W~&8AKUN!~8Wf #| jQ=1,?aBфckL$Y׏TKU؇ D 5!|x{4d8>;Gknh]?>`ouE,W0eч7'~m;*gƶJp=X1s> "3vD ^x(L7sw23FKՁi ap]Ύ;wDNЂ~P1Q"+;v:eBK𶤌 5zM:n t[Dd>o8ʎҙ 랯|p)kAq]٫Kr<6_D|Ag+auA3xK3nP 1r߬HuAK6yA]eF]:|SieO!Z ɉVIJ]T6#Y&q{ѴK!t RmNP OB[qOk JWM%dPq#e}u4(;?qe- n:cPbÌƩ"?mh̡ PkUEFf/MQqly9QGObR7>Lxi#!启8W#TODK|w<QÕؼ7 f78Ԉɻ2*z;~Bf^3^p9^śhޅGx ZrBW^ˏDY{0e֭ ɔ-٠q{,}د.Mt@偿ݗ_t!S}?ڇ_Xb'xD2uV) (_'zҽq*::sNCxˣyk}eP'$sl]CC@Q5"xwYǑnڂTw[þ IG2x̌TF+ْF=_԰3{&Y"rr{GNB:ROYGl:qAxCFeqmr=<߶~`q=eBV"gpKzPf2@j 2F[q]Z Y ;onz}+67,ѥ' @PZ%kI^ X!=>)u7Um%xFL}5Q<~x vd(Zxl-;)<<>*JʢTr$z#6M"ys)Of?}?Z'D' |ҘAD7t=щ^ ;&W)G#ωz)ux;˵F0A;B, ɹ*O(?S`}WSPy|?p2_@5/m9: '>YrCBϘS%{(%{q"#f{<#DEO ׃~.={mx׾[$OT#ykFt$\z^b%-ֈ6\#Z ]-*o'}!7}@M2OQ1H|SY_IeaYՐwF{Jx(;)~Y&m~r!O?ܷS˷ڢjɰ{v" v#xL,jjEky6Z.yie%y࿃Xq ](#d[E ;y񴀵n.Y$w{x+@}oa3=R? kp %Jq)Re'Rn\<䂄z'!g{r%{Ep].<{ލ{2/ط/&T7[w Q~Z̎2yFwY"1晗w};M98Rax{F;Y|Iޣh:Wsz ydz_7MDsGupyOp<cRϝm[>Yrh{xv+j\'P.6 _%*4O^U4Uv#!{᧹#Rqhc "[?])MRELpi܋':]>vT4la+xR C^{G 󭃝9RSO #IL\QxΆ!䨻o=,K9]Z߽oy~:~ (OW^ı:F`q O^\|BO+W"CTDRd  Z\߷ ti_ap7~,bc"f US|xҥ͙hz*_TΰҹQda!ȉR;Bq %y"J99#, ^2ǩ[9g<Z++kNI"R6zHXU|B_q!.6EB!4j2?4n9|uF }}oGҭ߆󚻇M{i32mom{Q+P.j?f֬mp7=Azrt3] SuN3@9uR7B |=12[g}FF2;A yTenOn\8{{OQw#_(tq'D so_c#(AkQ PqUN@')WےoR^ .l}!&F#=a'~+<7UBཁD7wͤ'\|%è7Gy#]0>M{ ͤ) Qa2h*َZR?vJ lq1ӵH>{َqįoT^o$=P":`Hxm|29 ~5؋3aBvٶ +.8 { w [*b@͕?=z)dD'j|>^q\c^/] %YĪ\UKk5_֝mfH~oY3{Iv5>!|֮/sƦr"lzQR_y6>ga냬gtݑ~^Vh a8e2Q(/Zr3I|{,+9t"rNk5Kt@KO.);uDRF|sy*ql+Q(Bg="Kl et}5lvג?UH "|!eCp@6kǗfn~=-VMA.a'G8by<|[];UnGwKp(LEn\N~8փѫ HP1n&hg&^,GH5\ zRO{} znx'] .E< %C>ﬢY9i@%S,Ko~tXUX5G"Xe+k?nC\Sd!y?4.}_g僮4.([+%&!li7TxFĩ^ ԋzJ>EJ"[.!@`*sM~4O=F Pr\17MJGLz3ݴ9"Mq3:>T$?߷N.м{DLŝ},ADW쑹rȷ,ĦMrpo,]ڷ+λ ~^`L}:[_Y?YRs}U/MΗtP2i4\ܞ[cُݽI f/AfeEWVO".Ѓτ=v!eي(nJ@jUWwtjH~}=}Mg>fo"")38kH\/tͱ(y1jDI6-f7=[Zm pVU.t_^~ABg |([]3/{嗄fὠ>WXU ȯBb 鏔y>9D|;AS7{ө ơ`PaF?ͱH`q> ǹy^]H>zMWIN`Ҝ(R,^S=!s*=&/]^gFn26dj ~qe*SE*;&xSO!e&Rtb!̺QօTGR 2¼%Ҽn÷ˆzHʴ8's)Nȗ׳_ |7+ԋ,CBAH"N7.?**9niɣ”Ñ$7c`ut?TsEZf\p쟎h%Ynn6(z 8u'"L.^{d1F̔ @LٳQy+}UTNj٪UWq7@15W33ϠIx/MƋ^[o'y?=.` gX]G44}/DiCw\p; I\KYi!)x4"؞]v+o">\t5$/WpABL&{Z ux+3#c$z !K&>T*eyHK%fRl^`1_+q'/~=#^z?ڗdF1(?`Vb,ۗ#Tq;U=!y۠\QDF~^ Ѽu Z倦}2"qv˃^"TFt9&"zPŊɈؙuc=IJ ݵQv)o2 ! ; q꣄E(ۿwfc IX{5T1rܜ[Z wS!u?qsMރ"^6+E0>>DA>]q@s.焀Ǹ]0'i"J]:5y}5 m)qU]n\'?;z[5Ӵf9#EQͥ"u+sznCT`V r/rӳor7Nm 3@Lc_?:?*IS!sej!qP.$ù"'<5b$o;6R7E=̆}wTƚk恮S #Xa7|Zݬ9޸6t9hB-@s?34? #yڸ`,zuq?'6O\j0&чn$e:I@/r vm 06$Ŋ"hѫCp^"3lՉ}͌{.&<@>KUb &U!}Ѿ=?]= tE`,z?/Fq'|A\daN`g'P)eD/K61cpM5“D7tjt߮/'պO=AUҸIՠ)+DGBDo04R< P0hWfZe#:-iҎ,,{b/\ 2XoX=ra;jhѯ+nN NͺSy0 5gP^ech}yxǑzEď=5恮,z3\jvBʑ&RĶYk ?j2 W2}A qcN n.><^x5phvEI5 Be%rTI9#nV+o@~}|\%u~)V=gR (/{zb ~;٩>ெ6@t@OȢOW]ۺ-y)I.Nڂ{飮PzH s6f's xQmQH&Rs\f?Zs#8v%٣r!a;.-00Eb6ȳ, Zԉbmt}rW e}ǣY~{}k~$I?z Fn:Fט٢h1$+7X͢nA8;EfL'c\|W^|KMs7/?VE-H&ym.u|L}:ІR' }ݭx7 Dya.$FR.IĿ.SOet\sUE} H_zo0QV@㷢HK唺viOOkZ74Px:Y/DNwyAU3o{rڐc;TH:!%y_e662TnČrĊ=w3UZ"?qqEX8Smz 3I4KgJ1i'-iNZ(,]R1K״i:iMf3yؚ~Ғ5͢+44M'):e2,l';K'sfHa{C9%lԃY4rk<gyPp]##KMc].#Z&}Ghze_yyz>WKhqcD AXD IrNS4=J>W|~>phKuɀŘ'o (&JeY(%b.>RB.%5!kTzJX1 .Pr}\Pi3*I?:Ͱ┰swJXRbdCTob9x[xiK}? 86Dxh⽩=wLqKbaC]_R@R(fO/*NwMJZ$~ɩlH9Y5qi|e7[=N?#[5l# 1xQy9}EHPEhKd>x~H*e{LvL}/ WXe-AER¤GD |D^]c %ڏOP"SO8^D蔜0NPچqvJ:^'(N{GND:7^\lqAzOwf& KJ6FBnUJoA)skV9btVQoKc4Yΰ3l;^Y>볌NԲ44mĵm{ʴ Č%v#mf"aܬbnKے-nKے~Œ╣n=X/&zG937W3YČ3oRmcq#ddd_&,GK{o0~po7g0~A@Ə̦3Isz2ӋY?sxxNos2E4ۉ|sZ(mؼ0$ͥzmʫs<l7>Z$}F>V\K;iAGMC #X(d,ڮ^`SM-+n`4m[L񞍼XT1LXʾH{?Az\P/rBJwC V]x^"Tg{YZYE~s(V8gݡןTU=Pb~;Xy3h}vDɥ~`/#v#ڔ ;'bZDCX^1W#eȶwr[㙫0 AJô{܅&ˍgٰNȘ(mvw|Y(G juހzrsJZ IꝬ ÁTSC#{1]\#u#QoL~kyM^n=9Qpj ?b{,{B"YoHKޘˉŕ+$HDyC#lzxo[ -> )@ՄC7"ūsqj uHWڡb[k:2#sn]Gaֈ>ɑl FT7 V<$[lXR$^1ifJ &aܷ6uSXIQ3jRN v|l^+n1ERw5R.:M_ML#hSK&"!_֋>J׳G ̹3|mwT7"[Y17&+L~ Pq{Sl: A7C+z˘:G?O'2?C?Wj =o?9aeYi4=xzB6љ?1Ox?s#5ޏ|~x t.b#M42N.|~`>J5eo,BOor-@:GUo͔}rRFR]'*G~l9hy;"쐀b'd N;BS@؀Q ȿsSc>D?[+S6@\`CG'lG/p̵\kĘV oܮDwХÈxR,rg?*i1FRTKQz兖mp OV5Qz-FxO"k6aZ i ^:;@* ]L7Uĩw θi4_YZ blnwVD(gJFd/3U-|ѓ+DgڿFzB16\y}6#t#O@mf#,6nNI̠P8$]u5NW՞KC&ق<ʟN8l&\;u>;?EIWՍ]Gu>J> YHP(}% z.Ko_A,GL'cRT>[^ԩo޾r]E#fUUpo![2#3s"|hљ ˫o"khϞJˑMGO +5&I ;3p?֒+˼^sjm'p|7~@?cD~i,Jb  {y}B.{A{[ҋ_TɡTw[`0G{P7YϞ.k JGHJFLb7N:]-$Gsw!#^ u]`)|"o5I=ݡO4!~[cيy?Y+ZxL#viW܋Jj;i'-R cd"aᴆGRQĮS(CT#A=N*ʈR)X KKk."aQjOIԻQ7( AT6;h|xD㩒\[K{r0S7Y*-Պϟc<.'WҺTQU=DÝ#{& GXȦ7(]#k8e ϵx|0bˍAȞ퓶!Um3itt@3'UF5e!H8hZw)pJt>yZ˫U34ɫ%d*.IwFGQa{Cd<<1SC>!bb_Ս.刞]ppm3"J<*o9\;|]8?5Gz7BXcj}/8B~G'2ջy?y5ޏ_jW!]K/l3{ར [.}¥ҧ86ƅuRr Kg!NH|FsVֲ lNFٳ̑M͚~HP?IZb&-6Qt#Q:0x\=rPo4{eQAW OZ;O/؂rc+f[t@۠/Pz4 V}܈U3MއWY;gF9(=SQ͜)뤀j,9OjΤ1x>i\ jB(3|WD6XXʆqWtt# j@rA(CR>%vx9^qy0"uD\صfV#~'L+kAT]ʩ3^#WPm4DevxO-^htJ?O]sT(Q<=޻]e^ MRGgXN(nxy(EPݫSؖ4^ .݈FTA > n.}BQ~判^n8f˧~} V>E'u "xF|ı=Go-k4`?z1aBiGC[Uo'X_%dz{+C١wOc1s9^-Ե9xm7GJjS66eOv㳰qw#k!Wtݫۇla<\k~ݩLfյ YZ%1}M%Qi Dn)4OGTz]Xd89~̥( GɬO8ab|(tOVOW?t|M_D ֗P"#8&yOv(E&S*qp"G[;@Ag^$5:4?!Uwm}#M.Dև{N17dxxWB>wNU^=2"&'#(uޖuY܀;t!.m5YL7͙lY!j><.Kuel548~Q*!+ ̥BtevW>sA_sW2gϪESs$ Mа}ގ<9 > v2CcYx&~ivOyOoJS؏h`?ۅɩt_W&kfMTAeƞ#+E U s~ CȀ~>w#Q]Qi fǜpdOɁ:}rTN6g\^cr#3k]F!bňSѻέPF'hS9xDI.Sܓ% ~3ڏ7B "}ވ{(2j@8wd P7BduokzuqklQXߛ%3<சTսgu#Q]Q)Slp?!sWMQ' V wUV = Eۥ,yDLjko{4,v9$z\Uȕ|"Ou~ѻU(S2$&CQ/AXcOz?Df[{F/|I y-#,aC݈Z-jB_(\Q5MkBimO܏l7͊@E:o=ʨ#z@iZ"_:u\yv"={nIDS\~is_y| +vS4}ҟuZC>yL1~K?!6/nVAsf˜ 0onN!HHae": ^ _n68]砾\5`6Tď歿5"O.+Ieo(XimnUWD8wɽX4>wPdZ}/;NԽn8~^nZ*5:ڞW?gTpxbn\!1b'n+ YY.<6п3Ix':WhV\|<.pH<{'16=jv*|$@DFT7=}Xe@6e2#?P)&#a?ӡ]YnXKkKEѷlo/ha\w䉸O:,˘[2*=bo7{7|óm܏@E4 ~^jxm'yҎI:='⍛q'YJ Vㅇ|}]Iq |9>Ō3؍nDuD Vywe~{w-\}-Bs\-ǧWy3բzíjpQ=^T|W;u~6o<-2!G^=mTiN9K(e6BsmXA%o.rDJ:Ŀ7Z_k?Ču\UN3{n|8r#wmʸݗ:ѧn4ֵd0[sZqZ)kґBr}o,wL\rLeE]\zw8X|^ƞfJG~᎞z-GPQDs"\xLӋ7#N8gTqmhs^!({z("!!wkbtǒ Dk<7y0Ƴ3B1o$||4#oc2212u6d<^eάՌ{mĐo!Y>іE8,й,'Oe^Odg'AYI2It oCC4E4Ў <c4)h3.0:=nHY㈎qYu!e$:ƭ 9.n0teG 9qց<&n,}I6DǸAYұŊ[R1=q˔@|@Ro㖃[ &/#~2H 4Q~a 4c5R1IY#8!Kt8'gg4.pv3d߸eYL%d),~D8K@gi y,2ȨqdD{bO 9W,eM|dk)#gd4+o㌓nomG4c/r?is:qW("ŌQtecVc"㶺L!ZCtZ}#E㶎}3.=nўd'f]}@t ={LDtc CSy$q %W| 1n_,_ )Kh7exK|w --91n-fL~ $~zR =n?2y'q6y#CWFuNو1>ec'ᘍ I1},8f&ڵ?k/ߚ뚍~lHYwqLש,l}HYoqLNxze׏lD8 lxYm{8!o#H1 IqLiY Ȑ[hAp̔O|c6rd1msӹg8n˘ll#*⇸f#qĽhkQx~ 0Bzۜ6A{ 1B&^bz;xtl1-BtiQC5DcL}vIw+:.$:ƴdIcCcLKcfCO)yҤcLKw ySXM%XcLOA1,mg|@t?(ZmX1"c=2ȘK6{m &3"1t8osBB,/C*6& o 22Hw,_bG1=M>s$#cMkIʹMtM,'خ06׵dniofa:iŤ񕺖V+,OPTto}6bM'2 Mu-N8\\,@L)BtUfƺdLQ t ҳ6ն243`.28X"@ZJZhZYY4ElZ$(**s@dd5utZ 2PGMρnSfF-)c8 4%k L^6]-CL3Ѵi|u̬uELw4Ѡ^VzVhd Iyд44'kz\+H]vW6G'GTCcm3LW|-q@t4նҴ"R6;Z63дiX^ZEX@^SdVxA>"ɇ0R1Ѵ0RoR-(?Sm31 3lLgiɶV]c˖"JCsKF9E,cF#3)|xK3"ohU!=I0sIvsI2m#*^m 3sr ڴl=3 CCSLk$F00\/Np۳Mgg#p Jmfbގ/6aے &ugaMڄ#yz`Rm3aIcAq-[Hf m*|:,-,--tْmtXS$"ٶmz (Y2R;V~[VI? i]dm򤥚. innlKod.jHx;廊~T:*_i;|7NbSKr򯔤S;B3=21Ef?(`ehG XX XjZIzf&uY M&k)...tKFIMQ[jbT]TBTÛOҫ|es m!Ư7YsV,OMW`F.Myje!t 1kįڂm2zYm33K]k̼9~SUues'-ۛňAtkn"EgbZc5 e7ln:fE^fԦMdfG6\z"J?YKLJ L`m14Qysv=ՓZn΋NSBHsk^f39nIS\̢j)˖EEhy=tm/"]QdZl"yRwޠ=vEGO7+t ID\`>yU Z0Ol5iZks}ͦlf A֨#K+I暆tUc2R=v.`3 /4A}`\MꯤM3Ϭi6-Rm i2>J:ZOW'gFml u6|kji:rk%GFiMhi 2m5ٯt52(n6,W@zցM Hʒn6ApZ)%2#gƶm|zm$%bӦm$ɛd#;lKL t$ Hhn;dH:lgf$~!(^#mWOfʟqӅ,Hہ&+33մCR-[ECMt^3fH6vM=md/IZQ5&3ϕhgZXZh[G$ ֌9&3S[:gCm])qIIɖ*G4K]+f)W\Pe3):p,t-,ɧjǴшͭ9}h."l˜X[Z hf]m+:6$Z zMJa1Mդ@uM [ ls%^BDLN??Gː,$+Cz"VO\ )269J";zZ0bj z51+AzjĘYldhvsϣm٩dZtĐ. Y KޝȴqSST>nG\4Zg:wpZ4RihlH(iT͕`ZNG7p J4Dмl'!=e+5s(8+>^p[$֦t0N;JK6 X 9Gmmi=ض0Z59ѴdŨT }+AF>*L\Фe53HkdskwN[ۨ jj[:L{N]MSR`HqmͳED6]a#A%LѾ 1lӘT`s;1H[6`V(!Uh6j_"RDŧOf)`bHn&+8~<9[[I&I,GkZ1HKC["V2j VZh&9B$I:[:֑7F /Q 4-,EH[ª)l2(g7]`*M[Mm$ c戮0IzMCvPMo320eoz,AQf&d7O>˙IIoicf*)"L"[A[k'-4-LY1#V$k1VFaD9!@sjgo.s/fb&2/hZ[fz[QLmv"!޶͵$k}ێ|XZ6OZ)ajJ }לRZ4#aKk$+%J%9D1'1+"@W` ֌7կ Y:[ 5Z%*Δ!ijfM>*ACMeL6#yIP@ɻemBJh[ [j"idc$2ڑٚkř=S2=-'L a ASYILhi=m;3 @%cMLsltڦ :ҟKl:U;:gצz3Ջq3f GZFU M 䉥4utF# kIj*ɌJ/>5vuOy5g=,f4<ҒݟqF l%icR3+YmoJӅ& ,_iaHa%m=3nU VC%!}eACSo5(ּ06Կ) m6]qa/L ɧL7)ol@6xь6"miz4/;iE&)2kLoMns%#6z_Ҷ3h938 5ڊ7-$; 3 M$7ŘI4=Kӿ+V2yi%G&54ѕV`дpAt #Ž-YuSj*<;u;^d-Y8֢*.D&Ot-ۭ;1&yִif4n|ch2= FZ;_zRXYª35[|-I_ hI֮ۍ}[(#ВX~̼2H~CQ#iяaЋNT5/m c_:DQm٧mY^(>rW"%L%E")TV]E"BQ9Zwp͚/a֚O5g2"2##rP-݂-wfdfddddd&8,%W^['Q>֍re JaP°Szȼ-Wwpl?+Ȥ;7{tv4s%ou^Ul9ŎL_r;`憃> -;{ux&WW8jUm3Xy;j> xMзp ջW͘͢*sJ3:;7/&5yn&ΎW ]bcONW%lZfFÆr'Qԩ( e;0škhMtf|C+j>NLw\tß4.lޱ?WmWڋ&NwF 4W1˺ZX1z+j4XIǓ~eV?0|~9-!*fͫoJrbXmTϑ]OJʙU`mEjiЀ!OӣρI_xq3'ü=8Pozr } U@ӥB@Tc+`&jdj@X2[̟:#,ښM5lL Ʊ~ws' ZD$ /G77]_<i0@/d8;Lg R]ۂ YkVV67+]aŊ۝ j) 0٫""R:w5l.iK.lj;M{v:ȃN*u17Ş:Fb*焑d1'167AiJV{P-9.)TJKW+ (F:ћ&Inn6DqFfY?t'] boSH&<3b8RL)Tt^mZh+BZ`Z+^PF+{bՕd:ȓ~b*.J~J،wvwfPDhoe囘< $u{|z;k*UAмACE`)PLfKY }xJk2FP!X~/hIȁXOh[&I\P'91vwDej]C?{+Jw H׻3gӷ5Wg[IbNi{YYMkrB9x{ƔYxY 6*Q1`H] #aBLA\><'r[ ^EIPٿNEfw9ȕ]OF>~`wQ4P j>d` ܫ0l ǔnu>4>\/ٍ>~ۄi |/.z?r$q/@AX 9Hu/Qn1(5c#N/6w(lh )!Ĕ3'$:xSI,s;@jyMskjT[uXcDU7"\XfVF!rnø`ۉvǪ+9ѽZ9k~W C81&v>繇 fU*Yo22oZhL[^䃃.X18pf牄6Q6˂T2PS33cauU ap|Cv%~!Vf݌wĚ-F푏8ǰ塴M$6Y*[x(90 v&Cj9Ah:TkSI_y2A^ ù|M"vke>ˡU.Iڧ eX~GtErdڟ|$=VkbOi+ӛ5x2n?NVXbLq0'VGvt:.EEc|X-#ya~N)؎t{!v69Ⱥi; 'S TEk6⼬ƒVB)<(`  'ӯ[`zR楾t@ɛa{dͲZ|a]HloQ 0ͫLvခvXqr?_:{aSccq? > W3@Nx5= D:ʩ Lwҡ2Ao=Jf66K(iG3EOx&+1# ?Wk8wU,pw^lwA '`>؝\lMwEpW d}ITtRxTtZO9EWZ:B᱊O~)T=K)gA/AV|)er%f~H)Ѹe 4<2wx(sRά;y~eue~%>v@& 9 xȍnSb07bPnȼg\?WFoXBfkhV׌hkj7VK>$o"}DCﲄd6@LP$5RBC<Ϡ@9ĔRz;9ǴcT|U:Tm ]e?ғI39Dʺ [10?]y}OΥ>_x&/ˣד\qX8JP:)}X[4B4[*At0Z:;nA3%?x|ݼY#!b΅>LjF!au|B͘S T+*-'-*/a(&^.#g)DҍM7oq{C((o0Vk!Ԗxr`&T2؂G̢G WZqIeżv(Z C;?Q@ׂR BƪmOБ,@I[E6TFUdC]@Z%l$⤢]1d 2biju,v@JL0GY[8}Z&\*tR Pq/b#WR'`ERz膒 ߰3Ma߈|!v&fwiTjx7fM{8 1T׼]\ų3aȫ=4@>xPɽ{k p"Kn܎G]+ѐ,{0xXh̲ ϸ_jm)qmQ2_ g _B֬nb+&xڂ 0=6ERnI/" wWX@(,IJar^*|l"bfIߓ0Ր\KT5wD)rik@u{q hZii gi$B¡uí7zne ^5_^ogގHNpϰ$&xI_(KDe+. $Kr^ }:6/^rE˲s6 8մ[6(p,PPޒdsZq Sߖ݁6Nu7ɓ2euD`onTonRSZp>%"m# {J- fDv߈j-X^BI]wDg=GGlH92;^ hKHscA0vCԍБ<m0!qD_<@!0цGcP͆xixaPJ]D1DQstAhA=[%._3u3'UX(1rqr ̆#-s.7,Qnw''.ÿeܫhPr/(l~_J}ReP)/RVT aFfNu's'M!,7Kp;|(uYf;vNPbS|OB!ŎS&ҚXM؞O/+v".X3d֜qvw.a5S4WųCs6 p3}a]C΁Xk? !EvٚAsvWd]Te =n0v37j@}@Bw;@Mإ2/#D.;#<075.  HhI`N sAZxZY&ln/ܦfxŖ^yi@ޅ"Ym}%+f m5/q`HTZ S^;ۄ"̄ɗ)zK *>|hƣ!o'V=k,ѳ':]yk >PЫPh.{|Y[|} r 2keo6_{Y|Fʬ/,RRNLhϒ@]J3zY똝9HRzךL9B]q:d e"k g "b.F@l;{WnHP@ H̞V;NwwPŲn~"@$3볤7| ׇ]cdXAvRT[G7mWmYUꪀ4""p?0dc?)Eeb'w}NZ,p y啢'_ +>fs؍S*΁0{<- 6+<R"^}`J 09MMzu&=6M]7濉g;0=6uUG7vgwvU\Yit飴t{A8jQ:pI5ꮉaWѳ u?=/|EB]5W]H\^PV܏Uu5*U +)i=?(Vqvc/U+n0./EqbUil&U< +:u[m*Nb}nTXq'U܋BIF*>.Vt Lyb'%gcu˺+.ۊŅb-]qGˉ (N)dcQo@1:gn /e b XݣA.Ml3>sv50[' E)E VYYC"ȱզm SFH|/ =81O)ΔCy.Ns[Q,uQl7*$ )tVYggO5 B`,HkK.{DTRfyG BmEdhϧ*\9 C@H[STS0-Y/?ȟz\]Ie8CVD9_>k;>|DPzkQgaaA M֜K7l3*mU]h}9qq)r8`te VsF9V30Wv5!pRSi[4Q$ӴNZ: 'edv%Q;>Nʼ6 M;[E;˱oeE6ڢQ?L Z֞l%ߒ3R fe;fI\I6n*.YWb]}Dn ,?1_lb߅'.o/$D4I0f&aWeLkQg, f3 g!dپiһ]]쌢[h@HoZV-ڶ*>pNrV-Qb0ֿ{$wނP22c͋|L`qaH bR[?%)zi7ʺWQEgŠFy+Z.xwu(lQ|vhE^o(مPrW/-WHE+~J8$"#4d\[wŸMquxAGo}Lߟ^OoEOL߅KK~C01^kq 8Xӆx /~5+8Ln>/^uő'p3EňG(Yh0$9ΟEK?`7T VyEϸv 7؛Sj^mfb6,4|6Z>P^ 'BNX29TmQUE o #_5LL;5d fRKV: Zm% 2x(I}u=:vnH}rz2̬^ZC+R7̘l i~5 nyٔ.|rUFk(6^om]OU sShf NXxrvt;x{R A괊6 Y ͛Q.>Cţ)v cm-^*0?K ]^wM2D ->S=a*9$)>{,(.`^5agd9V8(2)FkZmu>Qm:kKo%ʭkZh` wA_*:$X|!÷,dú (M4b*qoJx !j|+LJ'f4do>g.l1d0Mvw-StXt]nZrG þץɻ4[;R?P\* A?߰-ՠm1⮥_]H O}lţбd8u5Oߟhh;}K H)B\p=,X'u<4K4ߥV0%osUREDBˀ9HU@!c>}~Ώńv -;#6J?y=g|A*,[u5 [ysKOH;^)RX& u*ZL#0fYW"/s]#X'H}{ h;Qt(n l!u;'C:} 3fn+"RP#2dr,$3")=V)9!^t[|V~z3Lj8IXy4T?u#"y @w /-Zy2 Irg\{W%#ؗa'w%OXw3guG vت011 kW; |vXVڸ8+'t^+:o[z3%@8ٯc(6lK|2J䜨IOtH"@ WՋyB0cH`.g`+ :]obGuo <Ǩae\YV/6NPn5*0{0i%It:avd]XM)`\. HdFMXH:V)7ɶ5'rt{'~5|'F-v|l[0ߜqK (2 sYpLE1GPGzry񓂉j51oJ. FiHV]K$mɵ-"oQ}:#=Mzk}_ %ٶkPyQfO\5(3j+{ի}c&WX@n9ϴ{6ȱXB?vaΝ0E*.ڗI>/ |zl##i` kaxU4uF\G2.8i.aPSg1LeGv`'4*a&''~Ѓj0^wRV2%*w[&].C)íD3E|0;|he(%zw+tIv&̻96SX ݅ՐPAO#zuJˏ0O`K G` o*a$u-4g/zb;$i+lIRn98z.棲BQ4x~C̥Ey&J p3vɃX]nKUL=@g~V* N0>Ҳ|_T!M;A V݀xVɰ@q3,3ٖވRa۪0(RZ@Cmٮ=QHZ9 :D"gNCXUT)tVbEI0ʋ(H: V5t1ۜE$ы[>SH0 TlJr a5_szgeO NOkN<-Z:I[ϚBYScLۉS&99ˊHvH[h]'&ُ hߴ&GE9LGZpлuO!=d|{dԒ*ZYAD@sg5CK3$+c4ZBߵҙ2Qͧ vm|W,dGt[]X: ;ټB|L}<87VnЎG ӄ %&;y;&Gnp;S"ܰwWaԔpfnȉ~7oͼ6PMyim׶ @?̨P'Uji# Za-~ťj%opMzZ}t)ZO꠳&+v!al5Jwn+p*)@ry5eۯewVር[`dp:d݃3\fōq#HB.}cXc'ݼ:&Hk[ümG_'킯SUE]ۦaV C19wK(F bCCou޽tɍ*_LWt MN1[Z0Ca%X-|?QRhg> _E=;Je Z$d]D! f#쳔,eQJ,F[H?–߶2h;@Ϻ|KErm dž|z!:4*ZP<3wUfVe 57kJw/:D^$8yφB'9RReP:L[MmDs6  %& B3N,89|ZgByVSGC"[ cnv tV%o(%p~H}Izωie&YX xǗOXm8gE*J8rTg ^ZpB11+`VԺtZYykJ=L-_I+4^k]}!meXtwn;%8ЪU{d#>Ӥ6bL};ז$L7<ޜ=gSnj_c'Dr燗X =:;VemJ#3Ok/Ԕ8ț;ѩv`b)խҦ8EtI}53ABdҝYe4iZ|A_Ty,ԾwW噣8قvJ6݂+--EMVz۬Ɗn= RWd}Քg!+~) Cs6ϼt-,;q!:C^__STFyXUouꠝce EmVm zIy1W#0ݬWy]ޖg ^~ybPty{_MW.]bϽzov"/'/fsLdH:NI?B+X,৪_>:Hhocwok}'b C%XJ62TTwp6Zdߢ b#*3Sq$T[#NGdW;gvAm&-Qۃ+ TxP%XL:alfTE41EÃbp#l"[kvuhJ7 dPi+zuxA>L?lշiTO &?iah|-? s6@Si#^L߯6uxyܰ/ JSvaΡ9ҭ~w?4j?l5dxk+kk`K#2B|Sro ӃA,(j'19Zs9 `a ~$7ВN!SZ(:r|Wv>h=C]#~[cke_/;z&jwG6|IZ`Kak$]D(iZk̒A,dpG//b;R3-z.=LwIn Sx4kϬ;3b *Mɢ!Vb:/3K߂"!IBR:TF|aPi\LKhnL?.ZPz]xg 9/ƠMEMSS~zOq? ,'Z1ʃƒ{7нĚXrCКfi(ZGX&RjsŐnw`ʓM D뱶ot(0m:rP)CldHpތi Vm^H60N:vdC`q3w6M}!c}Ҩafy_K$)r^ gCਹʍӫĿ' /lV8>M,ecӇB ll^$V:FYVtN$ .:^pm:,?˜y=qplcrR9,RA n)gybð7=Tx:[TeuJ%EyRj»>oxDh<;J$,1ͩ/pJX:flTnjja3TMk|$ER]/ٙ /{. bεǭ>D=Zru5N2>̶:E5*I*\v([Ao8[ފױ*؈CO%Qh8bG+"ڛmJr ENgh' gi%l#{+6W5^j;{y^S@J+BGhs tic+V#4JIVbx>)|ߤ%m},硠jSZ$gD 5ޘ~|%c+qt֏i\jGe^i5z|ڹb(oK,{\GMPL`g,B@C-LX[A%,Z6x9f}Zz/eAWo?).3> 1܂Dˏtre'ȉWUtky>8{;nSa q@fL@ w꧃i[R4Z㭩-sxCDqZa"!YaAW%p!*yN>sOƞI<@'w,̏gҀ3B*Y݊ی[Q]Ywz܅~r-4=﨧0|آP]p!.A_m- ĺJ9]MMa-IyߠrlhLD"щb΍l:G`ף-Fet"Gz-NҲ Pm»81jc\+J3haʘeM3(WK`wk/n] ? :[];>9 웡uٖ+iK'qڧ)T`#L[x醰0=ݝ+kHϟ \\nF(25pw@Xi"BF9F u^kkf"T-+'/Z"k^g i aܗƷ*Df,_Mp^5Mv~TtXCha!{O=rO|!Th^/?#: [B> @<>ˋ7]M_pS)ޡ@ ىU' 9p ; \`C~%pTbO6S} u Y=kII2|gWF-K :"(L!~)[8To0:hhGBsгPdu@V>:o()jhPp=&'~k1oҡ˖{U[L(&'5\e`F*:lRtu] J FOgl+1+gFK ,JVGZ;G?pY5VՆ8;RUiBSr̰9%FuiSJ86D>Ph_c-nl<<$1gɁ0@;AbV1tO<ͳ]`j*N1ʊL# &\j>=0wiOj 0 U2{Іw(ݰߔS:J$vsmIu9xK"wD iJ 5s)2 FZE`t)4( gjᄩA98;yNwzPyܰ|~BȚYQZՐ'F="wb|mV$$+#ɴtXz6hމmuOVH2r%rVb92;OHQ"§;t}`)` q1\b?Ϲdz5&|>lb.U|2yzz OWgEnlA(@#,?==PGsбcx)&y;z!t)`P-(Α->"|ʙok6`h[Q0L};n{i<מѝΚy@ fPHhV. gגh{Яw.d?0Ʋtkpv:C1io|qzxnn%d&7>#;lN!4:/`7n|u5H?9([1Zxy*9?58~O*@r~f>, WAtbVNFyeaþYJ/wvL;Ku6_zpN=uԵ0bnoMzl WZ-d$d<a.ӎ؄5HZŖ\$łAuQ$(6k[Uf0:U4[/ޡhCVк}tF; = G!>+AGfy' !W \c>F,V$͹֊.?Ż 'ՋD$Hk/WIX@1;~I&,ˆ I([VƝeݰ6o Q*k||tsW}4a1uO瑵kQvlf/ճrj73̚m&:ݽj4y_|)TlǺ xIfw]}iߏOORzga01PHyAnNe2)%e WI.2Q.No[hC"ق/@A*M:hrkA58(VlDw-:lr=k i08>^sNz9H%7a+T_ӣ!E 60nDҰT+~J IeG4!UD춧H .D)(KGJJz]BmnKzS%C-)엲dHeGԗ [IvbdWL'ᐵ?jj魐LoňU}dzdzk92u<24ZLo=ZLo=?,D,AqۡhF&KSk?'.#(M"~=)) `柱eI#E e@ĊEepohc t;1yLys9yxϛKϛOxl0[qS xM<&ʋ{Ŋ޾n5V(!',\޾y|!8J1OE nca $a.ۈբpVtU(  RgԥM#$VomnIfHiQOR!џC U<ڽ^k3O6~TW|+B-Zd0c!pڝ$Հj<6ch=$G?0m6P>qOx1,ڽh; {qL/3]@}P`DW ƆK.5$*v^颠`v !I+J+f|07٤'n3VtI}ABm}<Ɖ}PdoCS{vY^>=>\(lV#1/]˜l.ր:h yH,q3em`Lս6T 2h苃x07]E0%%b+oCGU3UX+<d^ek #= =v?p+nQ%5<>;cꌬZDqDBf2-cO}IU 㻹0.tayv̼'`Qm[S:G!PܣnpF1QtG-]5sQ,FJP)38cX>b]oPC0 7! G3{-;o^"<0\7P![f_a,[/Moo30~a,}1~Ab_=2HB\9cXFG; ؓnobXJĊB-Vgn{]3kjVv̟ͯ眼19r UڼjWLH)Nou򝖑M>͛HSYIf~;D,M\%}~li N9(:2be BUrDf3WVc|h:X|̖<%?L#[g]9R(]۰G9G'NMB0=C$<{wa>W(Oޱy&*p~65n_dE`x&6,GfJ? }ϨA5gӪI;@CFD|z:1?3|p[Z͔{ýzW:DeY?ţT;86S,&pNn]iL`uf>Oj=Tf#A8ᾍkqgWFS O" 124h?tbG NǂTTrPWlu D#,%^XԳ6:*!S[ +!˚ՙdTI*d9MFB ҺXRmW!ۂ*V?Y- $T|zGZ6nlщQJ5v*i!;ZX YɘzWA<+*!ÿY o9Sj=!16ePOC(@?J]MK, c٢vPΥZʠ*ęS2J.̺''O{nw+s_ g(LPA+P'RqAieطp* #߈=!bpp*R3v0slgE~v. ڭzVAz74 |E#%K8Oa>) ŮPIqءTF?s=r$3Ɩnd}~xtCH%Hoo6^8ߒ϶"̶_%>٢z1 b'2bWr*bp#⺪'vT="+ Jr#J)&cJ**b,JjyL1c,e{CU}T؃YyEf>RV9߀Ak禵yX]^%Bjԋ['v,@P&@҂3SƒA bg2~F/q=O >ΟPZC& Dw9y ʔ(=HAQ'Ce:Up<%: /u^DA@5i ~9!)ȭ"DEcu{Figʸ8'R%”%(Y(Dݻ2891"Nu~A@5`fmɄf.ob5#Bp7}"ʛ>q(sآ~!Nf $ۧR]ƙ)[ ZGŊyBY ³*U$V\QXO׆./tkl3]KCRo)mp*xmt)j4CjAw3uut J_&']&@H݆둀pog5d7Jcz'}Z B[7c Nڹ#XP4гZ=[H[t }a5:Dn]*)%B«+6mڰ@:\.6s&n~[BUTmz2jKB)ʘZf c84kYjfÑl9(Up'a2ΑA;Pmi#}+BR3:Jpia8UOT[ɩ)I K;Ct Aw?*/p}rm YhT%R7ۑtQwWh\xpDN+# ڏ:VK[w7Mjv ԑ9?TJp%(bjj^m%# xVfK-ma#a?A2 9n~ǥDh# f@RR[Y[3[]/H=[Qb>'aƈL0TAs%2H)eJ!KDibBvEN3Lg\?ȮOh&|mw-fUF_s-ɧm5Ot+Rdt@f*L\HO{:`Rvv3p*bTp ( lHd;LM%L\S' 1\4Cs7[}{O  O`t!Py|}nAY6b@/FFijPJVc.LN-H8q5J6 [`% LfW}oFBQQZjn-b]`!7œ|-2\YQF_4GQn> P׬cUKSA(p=IRU? y3ܐO{[<̻' ;Zܐ=i9f.NNT$K7<%Ϊ`g95)q^-NsO-+R]1[0¡.c٭u#:YI >1(.b(^ -=AY: :}u5"h<V>#oIڡ\Ft O0? ޾֠Ӆ!It#[pkO'ĝ>d0' " r qJKTN1TbnFQ"܎!7$>g|5.^D$PyW@'B13nrL/c'5_ 7W&_ w!N(n*D7UdY0 B`GzMo;R  9E0,#q9])eWˑcI̓JuW׭p{j[ ۣinbסq>y޴4Hp<@-w\13h*!ZE@K"$` ckcΚYamBnxEݻhFNYV~1B%vtR'ABHB?1lp{^lR=Z"TH|P^R<)> `MsD=TWRMN5cq$Vba6ʀmcϷB?L+~Y`[O v# r!ڙC2UAgrYYP̡zcʞ|@Ih(5* ,J\v xW>/ĉkʎmLyrgohлFR7RՕ_xp:?:uy\?8Ûe u%Md^3St5}A ^ȑPWC Qhf*Q& 8TMEJeLD\wզ%7sx"e#6xQ]xY,W5- ;l7GKh2-[&uR0mۆz•GjVe@-Y14 vT&P0t},3x;_TF][Zr:\dJEʿZ\洼G9mHW)E̝SX]kA~^ie|}wQp t}^20K_k^h%wwd3)"lT@&/8b!gEn#sC)@ b gG!USfOgCG٣t-g宇Q@AP`xI溑;u$ML vKjk+KG1_= z2`OzÈљQ(ҏY[ng7K2 Uڭ/mBPxݾX Q86{vf ԗ9Gp=G@4DjE_h oo4= {G@{T8'x";,zCx`@3`ف=jzBF{t=S- }eȻRlx4\'A {xP75SKA=DA #L#)?ԓ?54|Ҕ,X!Sevvɚ_dl#+oR5;ն fkujJ!=7OoR01H6JBnVٺqREZpB˯n+ɁWlt@ȧĺxkOdAbRjIÉ?x)V6N=ڠ?ɫS1RC_vë8&HƴTEi*ӒmtK/¤$pFC@f?;/k]Y\.mFU5GK:;i3_H3ZUa(no RտKR(A|siauQۚQuL_o剴c],֟3hҔ}# 1 _Ddk׺~5\H#* 0^;?RQߐ@" /.ݜ<$Ya.92%N 1.8^@0L -JPz*E6_o_j Wvr%nbp=1V:5p;[[|/WTÛamw="C_<\Va1#{C?I֡Dqf%Ldsq Ԍe MC mGeb%{aj`.j]:uYIYhsuW՚ :>KKbYXކӹ00BMQf`βzJU•c{'x,RYe6q, #O+Gͷ(MWni<FzԚ>@Z_!p:ڟG%+I"垷%`1aH_rg]g4qK! CC"HVߍ5%D]hJ[wn+AUaꞸhq;rXwŗ9r׹Vs*x\QY綎-*}q& '^HP*k?c~c5D1.tfgyc'f #Si 2yyShg яFB< ;a`ԇu@R`Eۢ溭kr̰׹k'mw`1iFjl)gؕKЕR <^_NJ=(Gxu%*a}GWWRQ#lliתE[YʡѴ2FӹQpHJ$܊WqZ1Fyϙ\qGɲWx?R, ^~1Q/́ zP;WT3kܔvس2gF0|1rktGFjY,t 4h+]D"(A R2֑|}fŒc TNPLʝ30B*\??Shx(pn]#5,l݈£ʁ>JH^cNmٔ9k6vEn5.!hM~ '$/~Wx8bR]7=~qww&ۙg5'}@uS7I廭>,Yle1F j>=ޥxTm 6ܔQmi]rbZ)xx 'NJmK݋x51^ט%vZGNQ7Vq Yy02QrtJشvVR¾ lmkzĵ"Sfc8S WA[D0%j֗ aPkG;n/Ck?'#QjhV[b.aOc>`aaMo0A̋{sP2Yď{#&Uc?/?b(Ow#*_"B $NY9dS7sYFi~|+>l8\ْlJh\Ejz^NAR>cQ8>PzJYbryEwr 5DF5i~a{p^b[FәFͺ~6lF5E[O`M`~lg֠@=j$$㑘r (4|ب $+\ނZ7z:u ˧Ύ>0+H[wMF^틈jb p'b.SU`79Ic5# Vmay{Q8n\2h{0H(!jrpa27H$~TE" cN9O?#\|m ?=|ڋ2=)w?R+aY[<_rQP0<N~f;Bn}oxF942Fӗ̚Ņ%[8xY@zkf5!AD%C9]8Bj~'ښ\Kȃ,sGທe"Cc7BP!.3Y(h\]y ` ^ש }"գ*ʮ'y|PiDd=q7z>X{( \e^E])  +e}Xo|0ٟܦ*T aAQr >j}=Na}#;kdI|@W| OcYw@?T$V;[_gpe%,e+"F\MyDfX+%<O@(D \v \b^& 6Aw2p=*];rBj~*۰, A_+5R"0ql6gZ s[n s)[?1*,l19`xlt&%ah7c#J:fgHpR -:D*SrF|oG\kEC[\ecNND27CY:)z8:+0B?G [˳3X)qm8`Ή6AWebM"^T$u4R7VV(lSQ#TaiEG=G^0)~^ﺒ,3UdA1(Ǭ+3] <J$($Jjpef_Z.tlʓPVwu1vO4uu$M,H3J[_L&1!u>s O&>!:偊6X܀Yw絰΂}Є?j Շ^Gn0;R~uwuW>(/󟓪Z//焱OQKw*ꬩHA*@1NTEe$mp B=D} 7#ׂ+ lB ,N7 a%|`Bmvr<`1_ђW_U~t t㮏I/2ʬoJ|hl49hLޓ3xK@`Y$Ng#)@_):--T=o2 lpyF:܋x CeK|,5/hzx1;z߆oG(X3%1\|J| !Mͬ"+Ɠ숾YqTӒGZ]o uhFk`LGI;f\hnƫ{2۰7*s XGcR}㻦KP9Տ$/C*WFQ*ƨ\Qwx~v7w= cG3)ovvvѹggs7zZkP%k:Vύ lSvt^[3oSۍ8E)-UK_CL`!]zjfsSoxKa_fʓ곃/gCsni2>;쯅JSƚ!+k #7b~@XTFŊU~ '.M w~MuS 2k&a SiՃ&q.[[_`#]Vդ)v=uf_~=Ӏoa=JMSi'atxDT[bz)+@T\dz4QLI-?5ؠ5@j! nO,4<F%-  L\I{l^-x_b;Ώ*+jum _w٠Fh]oNs&\A,V+iQeiׇz^*5Բ+^ILU "fx8ܺ]KN'\v_:r",(MJ*}T漌{n2҉,жk8ow!ȜOnPyO{GbFF{T$XOӧц/ X+S諊Ĝpta'_A_UEp:3"S4ouN|5Np8 5d_DРYa4d `U2xkomV(ڒlGL \'W/̟91Z2 kw m&qn/0צ,0Bn H7h.ٟNrD渘$X2)Oz-: 0gT, 7E|s$4ԛg͆JQ|oqW5Jg+=_ 8sV~^NIO':I.$VNUܙj. }=;Ϟѳg uԛٕ&4QK -j,xm e0mU~BG~`5/ǭHGldȟdOo> ɘ@`yOg̫\\Ү-z_نvDTDKy}oJզ :k$@&/?_r_9+=8O1wSo-%,;#g*+z}tT5g[Qtx%Dɾ8;eXp1ꌥgxw/dIÝ *c$D8Vݲ>?%Y4B7|iַV j/sE[U;Ls5x6=NIiпO`|U% $tjXU|NC G*o $ wǭTf Hbxm,D4uF֣ݑ;f8W@{$SY3 h G}vѣ+2 C%h ꑇ x6>& 5vٱ+#Jɀ /?\u‰إ]d} GBڋߡOwhMLnd[×xFkeF]ru$ۍ`] ”ː#-§4qXGouܥ5!"`* \c >nV0 e{BΏVBQGqP޴{/̃'0g%Qt|V;)nIE G5ɼ|COn0*mܷ#tB/'8nYjȨ%Bkq5\„sɔAhe8ͥZ6'􁢼mCU,G994SW o{&W1~~k@o2xe)&W䷸SCԲ0/s0p6i= KHkvj_ "8Qmo$ZRkU8b֝TNl {;$P 9Z=Z0Yj9e0Ik$7#[[]huKBAț֓F73]A.51'nm]`:x ļ|Sf$dsk(ѹ ]л$[]G6,gg6Y𿵋55{Awƕr< Ρvs:i?n/Nj4yk,'AR(M(IET@/EGfkq-3c` {wY O1faX />ƦEh)voK޽p~wb#웇mGX:c jH ,cX5nm3Nk慕&vc8h\j2Mi`z W Cx]B&!d5^[E٢!&+2_g*):,9Gq93 #ZҭcG'u5l:u/+l4Z ZJee\qOab|I &D,tXo˝" O]{TЂnL_#NN{L*%AѢɲJ re]'IyD,m hr v0J0&6s(,k̠y/gP d}@'Sۣ>t&!຺j299a~:ZF,@e\~cA[8xQ`Ix+HsDZ2B J`&~mwyYj/_N0X |Y=ݤݢ2cDF=DCߨ.1wCr1GoLGJxN͐jV~T-89a9B=죞LIu[ |BQ;\Jb̲Ka׮vҬd` OR]bUw>q0E-+ GM"s/85ɚy$ }ߙcH?<ͫoTuBp uEM(a!5)o[/Yך5bƁ+Nԯ景*ns'i<Xt4WTۢzz^FI=t5;k^EP=Gˢb$".J\7 tc h8b ҫu}[6^ѯˈh-idž5ȪDê14=>as4; Qrt=:6DcZxy&I.*c+M9\+eC|;* ^"NT>u @'P 榴h_u*(|[WZdJ\MlOx+ЂwIcJxE>jKy|XI'T0xKsxMWdoA0JߥhO'R_1V$jt1:Rު\a1& vm!2t XT6rd1O.+*7!~l/qQW(=MYn>xSnQr_]U9xNi:kp|E644'}n_ewp ^_e4k"$*>B&p"dOBLD)N 8Ĕ9>>` N`+u% nm;o{/CC?+",9z?'`B6X%>Cw ?Sl~ozK$B\n3[bXr2re"Gz%8rqlZC܈%Fm]_󻓅,_Q䇍a;TPz/$fa~E_d{GnOQ J ehOU 4&hIo!yFߗ;3%YM׮SnvfQLAi9u]Df?CLTzWo݀E C3 OH9*[rf`zm~H :0E"W-PnjR+.YRt{z5ٕz!LnlJL#ow4<{3~uDE6KNK_>P{U*ͧ0vwj/ Fƞg!lfd2Njxq1!y(G?e8a[&#mDgьs{pƵzyN,3&&p>vQ-yH\ 6f72liPJD 9]%rx"kH+d\'|i(&pirƕ:#< >< 6j5WO׌]3d.)0:9.j.d5D~YrIZg+ɤxz8裏gɥIXf1}ʁG f˼ﭼc+I'M[kp\I| ,??cz2i#p=c)hq} Ӫ/[J',V$e-LC*Cd3؋zvo0 3B~Ϝ96qaWmiwK>Nxҗi?q٠>qA5CQ<5`aέkBn6p`)ĈdD4gzg yB3S*ՈDIr%Cd瘝MYHL|TΘgj` j,:W_fĊUt|I'^-V~%I=ܜݷQ&^Gw6(MM':ex\[HQ˿㷮a *Xl9T $2-X4(n1K)pTqIbv|I*k T`P)3)!LxpTŁ9ɝ24,9FP\L6'@H=׆4-*uvAM1 XiG5/ Ǭ'\$,K;̜4 =U(eVYykM&WR ID 5OZΎQtZ> Zo {ǻBjFp@L2B Czx s]й}LrFtĭ : جVq (sZ+d]&xUۦٸ y{f uz:)? aP%|RV8zO5A& ߆62՝{AzVjDW%^f/-7EԅL4]0l#a/ZyQCR#dhXVmE DpQC( Vis@DŽL*=g9(]*_E6E7&\-Ӄ|wt9H }~O,4).ث/ٲc!ՐWTMkp!uЮkHsی_ʦ͔U2Uc,#S\L=^ ,xL`\%L8  6\'̾@ڄ!R: _xO 0H/)Љ>btݪO,`^Bcu -pu^46Vǖe(I`*v/7f%'Җ@O(QrnW71 !^8i_A# mݡV 2.GEaޜbX1C$cTiMl@2!a JaD: ƵTlלS4KrsQŖp8%N_7PCo[lY3E93 5Z` Fɉ &&r3?kHV }yRo 0|l&Pd u YS3^՗1N+"YE!Z'菉r1eOd@9k&\?9Ďù=ǀ/E$O0~O趦jVL{ 8JKg@B;J3ݮCugAܰKogl%Hg`|@wF=s] ̅ 3!]k\:Nk7#8 OXд cPI@Ts~^lZ%PG!ն)NlEZ] jt D3yDWRs-/%꠩/R)*h3j1 ߹喣!tL䢊9,+Կm&NyM֟YYQ(S;$YߛS)ak!2PVpds)P&=gY Hr1/K7OT0tpK$"ܧF>N;ڛď:@!;=\EFv"ԕ^@oS*mI99jpʨ_c讬/ש"%⣎0 p4˲.Ⱥ) j5jWѵ"|w(yK>ij,2݆ ]-LUJDJsp(aY)ϣss-ƼRTZLϊ2QgR-k5o!S2]̂b雲Eyz (զWAb%#RS(<yA4zW@IKB2H`0I'lmU(Z[9YV!d q;jjĖ*ıSi*jd֔ 9[ SDAJKrLhzW|>b!t$u&iGMݔ 5> _h8%%Q?Ki9"ƠTpNW2ܥEFk \[MIn yly$x.$ nVͩ^c֣oJtB9͌cN$K!Ĥ-7q0rKlF巚H>Con B*u٪]A'q vKqu/4{=-j^EG(ˆ`*ܕȞ!18ieJHNIA+xuSF!T`DMJ 4*5m;)e{u.cFYofzs \hղ;kuj H&oľ=ۄCKE'^+<6)R5DfWq×QZߺ˪/9.t\F4V/ %O\X5A˫kJ-斾|J'<®(PBPm$bqs5%G wGf-w|]ܒe,JVZp%_JRdܨXct`qşb4Ytb$J|XWZDXqtyn8ND/l3Z|$2iaġ⸼jO5eNA؂c%kC&~?M9? }| f|Hb{qp#Y|$ë0µse죷Pv2ɨxC(BIyP,F'>P!92rEL֬b9YӋ%$ŠnX`kظ .ڶh;Iװ 2zxu7܅1hr%a|{lʹF-UQPd~:S/h5m@v"wūO{ٺ07nXFu`u $ P{c(RЕ*3NUN19[;#;:1jb֮$T;Ww7ktj=8IV jbD>}irv3:a"Ou_˘ʏi= rqj2RYe Z x`̒Hy\Ƿ^'w;u1f ЦdA=(bi]GY[FĐ64mx#"Ng7y/QIU$d 8wP7 0) fj3p"y|p}EB\NH7x.! Qi,M39lX.cgX\ys#  ԠhmeAkJ5KDu5t;gŝ6 )K M\j I!"!Q-5pDSlLe(B:u*i$5Qm M ]g]\赃(ǮAK0:W:2bP vy<{5Κ.bzM YXdȯ.c2C4% +;ޡA8(!gG(tdgo2o" mYTiqe5;WSިTydH=17kAk!mGÇ^q@ڜDQaVv]V;[ckU`H)uϜ5b=ЦENx,+5/UeF9@ax-Llm;^A@`֬;.2kS>+mQWW?s`x#|v$T$\ɭtݭrW6$nA3wU#&P]ObE6Qb/5Yw[ +r@SYAA+O/?MeN D=߇-ϝ`%|4YTޓ=hi1JQ&PdQ~ vupR^mzꛏQI^^ff4YWK͚c.Y#9S儑UPWmm8ljKE|V@0w(9U0t_CBzr -QrCvV*swj}H ϘQsAgpM#6+ߕxܑaBLD7 2VᴉxNZFs]oP^|jPl_cox[|yk59)ě ރ+J6IgYnNmao{t)L2$9),DuGV_~wk|pV~0P w;΄$ƻNzhAUZ;R A׈Kq+s锅j3a _ٱ@bGnx[䥕Ħ |< =9Gf'ȴ0a9!r'kۆvGk<5A+j>D|tY@EwvA&klM$ǚV;5\d#JEY(wwo'bl$@7k2j0#ј"GiL\{Wփ!3pzF83Le~Ɨl rEP(Ds*=l:%i!k az/©qﺦ#fR}3nGAJ"[qk(衞vP}bt}VP1Npk:]&sme{!#C ⢡2{z!~6]# 厤5)$`ЇZ\k j||5/9?UWad c23PI%-5 8Kz]B9X5oSцfFy5Dʋmb9Ə8wr49/)&>q>_aJ[3`q)IP6ʙA|I.^KZ%Z$"9,1NsULPlN^gR6jTBN.@&qX bzBr`P3=߯H`N|ď3-֑$(O+sMۻsC>Tu>YÎ fqlpޮ!ΝÚ{W^= e|lN-؜#RyM CJpZA5,1u`s+_9ƇM@zB|i)6 \:-2y1D"~Rn}!EAGe5=&K :H![2x( o־|+rw&ڄhm w~I&N;/E6F#"9;F#uqI^,B_/!BIvbL%ր$57#]HxS) 'w[Ƙ&̧&*] j(㡔vE#s{H`XXjX! NjBf F2khښf6]{Ь }$ٱIlt^Z0v f߷y6rc2:J[n긷J%|z CY}T#"qK./9<2.B7l-R~ik[ꦴ!npbi@l̦ACcĽ5.^hF q-M$աȍ.xp4晏[ΓH`ds ,X_1*[<1]?S PPYCȞϾM|ĸ)J{=,uI.Ōgu}@#-z23Y Ԓa%AЀL)/X [\y l]C%h4NoZiSZ eV8ނ$P-oWJ %5sKے-y"} MD K G %t&^xi<]~\`A./{*vbo/U5l$+o'ʡ/D`t3v[GvfGA0c7[m*-ӆv{*OC URsSt1**Kz}._w/>P@_^&/"Ea- EZ#@VHO%KJ2Nd83rZc)wr<u>dS}JinSVmKYB|)[/X4:$R"DO/HRVZ {T^R*'I‹bBxm%*f,ՖdDzի1R“3.H dY(Jh𿮴CF _!HQv,t?9S?BJV҃7{,b?#,q\V[퇕BL򞲶%ڜ CoHqj*_LS&wjq)gEWQk%F 3  ŤVW4ekYKלL|:,lb_C~b1~ڟeܙt.(3>w0>\# ,s5 _>Ypp/x^wwfMmiԼ$`HleZ| 2XʺA%gjNUw_ŞQjIG`cMWZuV>.t-"Ӱ"xE] ª.hY-+fyb,&\Um96q4]H9]e~aL}&°ZֳK`IkrH=Ke|423AƓEp`H!]%@$t!4xX07j@fSi˦=gw* yHrZ"ܺ w ͨ_%rR d.֮?{Ҍpox W ,; LBѥnۮ8Mn1ĥ*oWEݫ FW՜.kN̢Kꡙ_B?:ٵڻX6Qodzm6XpB] Ry(-_w_dYCO&̚_ }"Y6p&. 6nR_B-SȼQu,^LZTײ_0ܥDYB~Qpz̚xAҊ`Icdp,<^/꒝^!di08Xe D@C#\N,Z6-IB չڭ:"z$# ~nf.wVsI]pU1 Af^eԟw p%s+%!A[Nyx VŪ.4T3ZPg g-Īrcy>X{\+:?4֓/0twslp#.~{ 0I$ɟ]QWOsTyfK8?]~lsQZI~zSKrk+KiĒs6bS'Y>N0]i3nVʔEK󌠓 _k˯Fj~r6(<\|D7Ѥ),,N)¨A֥\;.rr-;o3k'cr%޻K7q.{.l"HO,Kk ҇gb<t*jtLC&Ų;zQdqƴv? )0xdiu?PdЯ$O!mk;l?%sGMЁ (q밺^[JmZFZ=ھXmu\CO}Ws]+1)nG#ޞX/ Ӝ6Oira=M̒Qo_>4g4S7:|UmC5rHMO<ڰJTەgLO0=jގGZڂ!. Dqvb@Nm#b[8%!;_%ݖ%wbֱ0wVWP RCZr"sL_v2gA~H!C7ͷF foR>|x߁&QYɐ);GX 8qנ&3bJKdFdGv;b~emDΰRbK[B"mYv$,˻Ў_΢Er{GKY:BE;B~g߇GlBCzEP mpk跡(sqU),ܓLԸ[bG&;a]P)b`S0w4ɛxǑ%%9mMDrwˬKLpXܿ4᧭1Q3LzV 4kp;):8Z7b_ɯ=)8: A˚vY樲.΋ۺN7ywVч͌98t}Yy{{q%2 +3oDx,bN5%<.ڇap6rgC?8we;^Qa.\m;կ-UzeB`;LBTAd-*YVς+?gf;W/s]]B(FѮv-jA "36G44F!v2NZŋ$)>tw\N f{y kU5LGvo|$=ѻ$&|PB3Z3ĈDbu]gbtp(l9W`7b6,he,-9Z ]rLRK7:H+ɸ?' #"L)+ݚ7& MPu}`w|J2s!|fgb;m] B(eه&>N(-eitA(GT dbe 4SҮIu+bW98Tl?h*XQ3ӾlZd"آ˾_$VeoAGGycU V!V#)\IX$+[DH6H@;mCp˜x-yxni΃4x\|=Iu2sXHXbF lqNُR򎔶u;Ų5gZJ9aGtmCb:`}gOiŎc1G A\Rޒݑ*ϕDEؓ=XM W@hZk0oA+ެN4EZ%O>t;"| .-QתocTrQnVhX5vv+]L^7 üg9Trlxtт8Z}\ ãpQ]Rti~0Y,$ ʋU2y1sEpbל4ksּ~TBeڭGI0pHB:'C!Et4|2.&4a>/eܨ$).ŧ̰\k8w桺/uG54d&(rhO?GiVShlq藮 {+pQj_I] -ySFZQe* :R\jn^}j!C p=0]]O?ԦK/5s1?;THwӼ?U-B~jȨ74TЭNh05y[C6ONTr)PZNq\f¡Hu{۴oԜ :dFyyh›kpNIYl ąFQ7 9WRV%I`[H)ٵ>J|\o\BZYdO'+1K$ܶw2ŽH^ ^N(f5zf)MZO#at:ОB:9 :r21֬V32!,BN+jm: F\ |}FD^exX|TW韒oӿ\ M.WP%. ͯdOp` *\ }O7=ЊG*-sZymJ8\!)8px&xEu5 |~¯-LJ,GV;aJdvjujّhRF iGa6Z ƀ^xY}9?zǃLoz!iͺ}s.u^pIɴkH\t;i^@EdF;=e/B\?Ejvgq ੝1hP/g (rYg]U+-lZkd:nx4nY>w:y'yX;']V4 WP~V/x7Ci[|@@Fk;0wzϚd|@W~B:w[ۆeTnOpY&p66wCjVGc31~ARi#աmmz`Gvc؀`S6̬`WWPF劧U:H9q3ݱTT`R.6W?yǕbx䠶iwpK -jg0iPQ3*4CD]PK5#I[n<0`2;eϛ$i'|l^|[`Y4٢L`3<4R qSxÍ5>9It o?K\P ^s e$+ zG}ZnMs=iѰK^:lPXQu}d?4|4Π` \Xm۲[eLm'ӝ:\>e(Mz✧qbK@p'YVD}*Ʒsi,ӨWob%A]ܢ[ mu'<_s-Tw?헆lzؿ anTwr<zzl`5=,\?﮹ff3gak~U!$  "ǂgfD=)?)Lm)<׽YF9_)Ʋ1޲[Gx[+ǣ ]oi~ <-_$ #4;sI) ?K[_@QjFJkL{e#է= [gyu'Z=:~]\ͫoPYc)5gBz.fvkhN-PjU |9 :PN=%YRSdzü5!"ۃB>*LsΎLτ2ೊi-v,Kt,)?)õW:ٺ"<;ul(KA>iNo{*e͗ҭ*W=S\O@a== ~]P~|цA=/5XȰ;TodyW-/JL,UfKX< Hrtá)3j b B4QNAT5,%Cp>ܵJ7ktuZ/v:ܼ i}zr* _LQ8=T \aH4bftߐ,A{wJgwآ.M\){Wo_kyfXO;HO Ԫߖ⺰9?;HMXB|{W\LӾ'_b\q/a76{nr]NÃV88F~D.t~>vkMDg 70QTMt~^ 'ژa{=oHӡp(&8(wLavw'O6muېwb G95¶g̱l,\޸zw\ \'&~ېTN=HdžwBVB#yOC(W)fH]Wigfr.ᶋ )RZr6,p_p420vpI͒,.n"śpT {9au lL|<[(aknkΓ$zf?9|85Uj7b )Y,u ĝ8[5G?Ν29Qx _)E:/%8,rzl9c9n]gwiqO57|Yl ^=Y}m%)JDrO\05u0p|4[SԻup5g`@,:hA X'W{QYS&^܎!ZzIhAwb!ܡ_aK%ƪsYto-(`4H4 I@BrL,ZWAsCƨ{70SYE Bޔ5%ford1Op0Zc ȇv'9^E`DSɹv-eoN$u 0 eM7>[@ӊ.J d5NeS$(yUz+r #$%.hu՘ PYIj4.^u"oESzLb7ef5롪{vEL/ΩI{74;3V:%N(@l%F-[OffO|ZFSL3!nXW5r,y:uA:%#]TozL) l7SO.<f]^Zpv 3ShoV{7 0ᐂ!o#7ia.dWF.jcרb+V&Mx^p= Aw:x,5s.}'9l9CB'ҁ)6?\22ZA7W@etnerZ׋0"'-V' vv #{X>$"AT[>z JD÷ 5ER [[,PIjPDP͐~3a%(,܋I:XȸVgđ1)3JoL4Q 5]RvN !qM>V9+y>Ƅ ītڣ;i.O$CqJ|7$j:rX6s9٬Ԙ1-<5/3]Z2)d=Vjt aƩ{2 Ʉ/ 2[=G[0G9 g=xh}=T^ǠtZI"f 9d Gx=1qquvqAÏzGKhWTmĊ⵴v]h-\e^h jBZk++4te>*++?gjs7g2­[U /L/\QeFu`V(JbxBSmz1e0g_7 պMIMI&\\{ ۓl֞ͺ=kIV( NcFQAMMkqՑ16pnjϐnϠƹ!_{(gh1>F3E +̚2°$ydXAf0,O3f-OQdO,x#5HUqJ~E9f-7|T :ptVQiUH f0(J%koڻ3" )Z#+IE@lE>jl|ېr5;1W ^(=RH a1 Q'Z>m$Wz G N0"k&0-e9D{8 jST΂^PSd{ij > #(f#{FV {sC t?%hdEyok^oI;_TWP"5O"GjTAO& $\-pK!$ˣ 9> ᷟ~JU8Er(cȦdcVDGM?~ubc:լ[-1Oj!B@AdFG9OZƩ2}*i)@0[PpҢ$)|Yx(`. d2Y]0# c'[ٿ2W\oq\b7@~=Y-z4 N{WjN7]ۜ:P~y-,^@Jq`:v\mDfNӼ> ;֖,L)-&[.diVG *H+1~38ƣTwX,= OfpԴshZFYF7'aNClL_؃B  йphoSe_{:poEm|gnʷ'y8YZ!i}[' [>%]|\|v {N{i]Y9{(TZb_AvI soDB4Gy8̊wG!b;O s {zזF bk8h،`,?B%fK!p,CPb>IpK1a`]AZx$e_>sdPkD|wQO|D,9R)o)=B3$Ok*ӕѼ|i1Qp2=y1xx"0DWTj@T߹}ܤIs!نJى@ _/U*EeViR1a 8TVa; TΠ;+?jɓݸǨ1˳&)T4l#%lpٌ 咟N h8gт*W x=;g+OzEjJ5ָ0+(JFمaB5gW^#»H\L;[jbW)]{AoJje]Τa3|w>2-N}ޛ X*tmN=!n&nkeZt GytS@ h="5 pٶSu\9*R{s P΄Z}dݨ\*Ā\%bN^PBk T(쉜>TP,Y^!o&lqqBŪLR<Ѻrw¼x1 R!6|E"?q( [M 21qxKEN$T ԍd9U?C'ki\@OzG~ΐXe86(J&lݳаo(yU_r_lD<XWↃץn1`6o"CpzV6n0;>H sji:&|Y\>AsьW&螲/̾Ĭ.(xG]WIb6Wtrl02q M8bj6&w.'ۺ%oR%X5)Vd yŸ'#+:{Q&ێjl2eFy@δǗkUXatJ.b%ROa/<XkӔS dJPlhgӉtzӠZ]GѵU@Žm8|:Уq8[cyq^:وu:УHb4`ǦCc[!~`7q* ~2.Cb܈I|Q@w~~L]=O5rʋ2Ƶ8Y| [&.B6"@vOaj}/LɦllxZ;7]%t{u({:s0MfY"))[s /oB-b!P#HS~yac!3@+`d%y0ljBl⎀:#p"px|n }ϑ>CT'dÌyfy^|fϊxaswpTZ1'q P*5@&Xm)itZ{ĘP. |du1_J\eY%fJY} '$*JP[G*,Ɋ3OOpi'rȯz[gU}+9ӢK;uqbChs'821[|̃1TGe )M\ zuƸ'S Qe}4jU5ױP>NzrB[Q>O{DAkšf.LHxk]Q4J ̔2̀g} RPEh #|2 AO$p&>%YGIDfOzr"cjHB%aIl=3B=I[$ݝQ>gY]:$PQ'Tfc%1rd'=Zbb!0 cm@!< GNFpiAfΔ 9mASL|' Ss9}+[ֽ~z2evj(Etiy3Qg 4[((ffr{MYTzNxI=]LJQ"uFrvqv]Vd^nF^ Cլ(b9OL-f\&L3$ɼ *#E.D5!NާI:h*SX|>HEҔZ=3E jX>mِXV'9֨(UkmU c'B^Co.\ܧ<NS5wy94&!'ycst^TO4K 9,41Djtn74Іl1U]Fef}%3}]3j(|ݰ;Erp'FɈQY.]XHժBٓVIi*X=d󢂊hx'طAG)^:)Hv}b~c1Am]cd=T&sq/,]RI?҅t pw8d:eP6$ǺGv=jR/{1w!"{7S%ш?]ط4 =RYfµcg4k}Ǐ!i'ڍtI!ʶJ6/`L[-:IudR1{69R^%Z_݈E娭]E c\ŀH}Ϥq orruQ?;&Zn^vM(U 0w”X@P F/kUn">{H EZPUPبUc@ctA}6Ą*n$\E)5 e"JP%5"%Wb+G%_z4巄5@瓡} NyѝսT0BBT VqIe&&qE,b']=yq!]JՒ4u`ok$%&TolR4BRUR'^s.JOJ${Ɓ+oF++mT (ṈB{pd$` uQe5T24})7˜N6Yӑ$t*, }j2 6>9Vl]r)-\mlNQ۽4+/P4ς8k lRF1׭2q(*[$Kd8|P10'.Ykhk l>;STX&*ɴĜ)U+'nKhaepҩFDMH^.r 0i(pGҾ!t]ҒH#= #E$.F I`wHo$@B&( BJ ]1AX6k ܴ^w-sGKqnK-Ϊ*הRe[?~x޲>u`we$ƫcbj'sٯ*\8zLbCrڰZV iV ͵P2v0Q%x`!x&+gRP0Lpf7q5IZ&p_DΤI ozChmKfZ CVMHb"2Yrэ-2L_ΦȖIt4heZJ343d9qfYke1:3RrCjyxMﭠ~U}={Ԟ~FM,:MSdex. !ZI$cqQI4^ 6F]V'&@ONuF$^+dU%U,OͼK=z֩Qg5.%)?zQ.dInmڱQE$8ѹ3 Dcͼ/,bt5Di z>&@E$a"uV3]j"9U#$@.ĭ:DlΙx^'$`D1VDjTzn~Rhz~x2Pj<]o:/-!"GkBW!8'RFvVb|!`K&Yud waȀĊ&0H⵺[zi1Xw+bmƅT!To!?+eݥ+wQ.qJTz xu $%ҋjx"3YeXU9׊2+<bVeFdT*KLm%XPI8vh6Tr5sTi/# .Õڌ<$}iS8csSMH~$|S9륩Olf"q2{cCR{]{J, [_ثL5)q3a8t4㥵JBF[ &)OG$0w +,d(.sXr1jG61:x Zsvە)0Tƍ]$ra*Bοe7oEAZ`. q_,!~͈>ح!хlz>b$=(tdWOѩ/Nh&<͕&`<ϞbՄuĔNv$-t$ (l~\ Xl?+[L+̤Z &F*ܰo.oT@cl(Ǒ# ĪSV te8f򝤤Z]lb邚~ :ZާO[Ewz,8"]3.KgI8elfuc`oV-̟s(j&UWGu0ݷ1 5ٺ@݋^okɒAy ׫)༖OGӼֽ;;….Ԫb[v쾑`TYv1K:=U(!Wt* oЪ..T +`%blk$h

p莭$+%P nE`nFߌfOp 9v37cn%|4#"EeH= 7Gy_%Y,\ $\&1)cҒTOjt&3^xzKE]{10h;<6 -U""d Y+Msxl/m-Y.L`4| )O5*>y}4>*~f< P$H(DGЉE+jQ`t(G;:BEKjΙ*rئPdl2Bq2CI 4Ee JߙJJHա~rf7FR93dȑ`}A )/m \S55vY]e q2X6鴝" j<XuxԮ0iX-ô:s)۟xV@B&A|4impSZAdw64 Y'k1¾6(lWE"ӗ_?M@ڢetKw5W]"C )e.CZ6záQT/|󌻥eN;'L '!! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~}%yx$ #_(""e" `Xz RG`YN_/E/~gr6>Po 9VOI&Crƒ`fyxP @WMyQ0l@Lb. ~AU"*4~?(fեկR0R @҉6WqA9D AH,eX:0zA5n (4Б]NG7! sA\hJ$ 5(WaR&4"#z|Rм@(H!ΑB mIO ƕt%Vy{Ƌfsѡ=X&P)iϊϟN$*֠Ϥ,tj J G_jFn4k Ght+b%%G+be nLcYKHX! 2Y:Wլ8cDכsAe= R1qXE[ugYβR^κޱnɍXS1ɅnජaZaAl i5ŜXZxyH\:w&t򢑱*W wgj+ LN;B! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%~}$ #ȿd( "i лa h?.A03/YP _7~1(ɒux2DST`0/KRdҴIPAItZ,NW- 6D>!S$N%Ru?ɺ_Ʌ+lݴ9H.*۠vM3 b3p~\lċT̓G٪e n_S9'. %G0`` @ϏW}twKN]\ƽ2NhË@r ~^ |W~낵S|@܆qI@((Wi@-kCa 93RQJ"H׉VID^88݋'O'Vb~HIl!B4&.eS) %yv% ?p5}ƚYWDh\]qc-9N< t0>%/N86^@䏎m6V"htdTdLG(}Jq&>YY=*8`CT){!˯N$@ 8fb,uB>+ִCȗHj0D]:l &:3仄9KH81\U"/ A'P3,&kr"Cqm@.s36#pT? * ur# x4;!91[%y5ԉ]_}v21]B1gm'<:hWzy#m8-BM/NLU@8C.֍y xn2{H&p:.E ('îz [{ Ӎ#? '>OLQE` 24iaw"n:}L6قѠvldU0Y\'a+B`m.UKTô ٝxiP$IB0P%TH|?$+ۺQY{j~޽-_+KҊ\RvxE-~LN! ,//__GG羾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~mwsrY Ϻ^ ٰ׬ٻR QU˯X!'=PέpX.s"RÉk*blqxRخGY@&$ѠXJȜyf߾ )Z{A+`ҝKc4-t;V Z0e:54Xϰ nɚ5wvHq W\, ,V{![MA=YȌ'ɝ;7@@۸ͻ'VJ@ȓ+_<c[('ؗ'!8/~͛o  Ȁ;#^f|8?=~W@&Bd.5jǁ|7ft^_EiAe+0xvrX`Ct ,`X8#$")\:>&dK @%G$T4%TLVdUDSeC$=q: يbÄ8d%h,tHͦQ5cRw @biJ=K_Jd.;"2|ڐqM)ggso Y8)X፴{e4khO=(`"lj o5 ju B 1( . 0 jVTN܂) @*q0D2,8 (?,Ȧ dzv?ӐovY4G+@ ,0tt T U[l\օ0k0(Fr) x5w|-n9Gݸ v__;+DtL7琇~:Op_3v^:z>Srz}%o0  Y|؎o=/_K0?K{H/oM"& Sg׳Oܫ` >y4ZCxР-w#@4JڧW7?HYb0ɤY:J~PcdcjM)@TY%pP)BClŀ qJ(.K;(Jb)N H4"Cм1&#f|h6*ُ8sG D9ثc2QkvPƐtUGP䨐L"& Ñ;Pg/-6G( .NlP zl\>$wiLc;!aJX:5҅-\TZhtA& %8Iq&x֗N `%%bĬeXiuNب}E%2LZՂe~+wc]#O޺FP~{ jkcX {Tuξ6xѶ&7fF@3aNovfU`Rhyw%UxXRVǁz89rT :XREʌ(hBXSH&)9WPC0N:[[:AeD]OxY؇ęmf3!5gL)L6Q(YNAFDhn*qzF z7aWV (I JM'^**"=&DgN`"TycRX*m}r[q J Yي7\ۚF3)/B&-[2Vnp"Y >F䭦2З9ݏ~kC隊hW"0KqL,0 X\3 ' A%<;),pp'4\d V\@~_eiٶp?t&97 _ڦYXʽw ]L'BHkv0* cg}"&,zE]l_ݭ~F^wsI7e\<*2g"ԥE6t™ē_&k{5.<; f#M~0p(g$~4U\ВES\ ^?!P!w@X0ZPY5j'J*~Y*/h.d.D}6Gi"#Ѡ=a*K8DdA=YĉsD0YRDTFPmՌЬHQ}i1_= i~lH" ` vHd!0G$WdDb29s9HE2c., )IGRf h$"G4 ?}'4$Jdܡ$arISVK&١J)bOs!5EŒQN)(/Ok3 sS)PD%B%˅rq>#ځRxLAnȟDCtX1%$vNQ=)8Ok|UH6 ȣ"(zSYs[;#c|@JթUfϧ2T*m\!RnU8N_ ʆ-PTD])ՑD޸9D`"x>i_I0hboɋhzc3c!@ji_)ubT, !.֚TXR@B W&n`g@4̋RD;4&;,] Bvd,Emtg%#uBhLN;! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%$#r(" w ߳ ­o &jD03n_?iي``%YhF3NFC}$ԎHNL%\Zf?WL񦕐*II' q璒%Ɗxe p4DM%XuвL:j`MT}%jVؚۂݸXS`oef.^ۖEdEǐB Au@'J y>* 췹ڷ3ܬp^p;@ΣVGw]ӻNx jOGo@Ag~]xĞ<55q `r0& ߅^Y44R1u NV<~0z#M[1.儇a9ҀZ+Fan4Ztd .) dMt$_A%u$YZ8yF6NVg)RI Fy't:4hgtmƹharhM9)x ]c)cdJjL穜:jw ʺE TA1 YTI-*>#'g:(IuWG̢Cd"PRJ Vө!4ŤZ K@_lƪk Z$:(C ‡BSd:DWii2 ]k p/PҨ95Ϡ2;CACl%~ luخ?6]-k;w?|vZ7]w0wj0փ y Џи]9|`1+7 wӁS }o[zg:JPY梄i`U;Y*I h@2 2 A `Z m(@sbO"QKjnWPde"fT 9}$;!9IuaL;ap9p2bAQ0]uAp 1s#YEdrM,41ˌI H8v3+bmkDP> r1%p-)\pGpuh9WbchF2eb%ߺx[}DV$t#*/=veQ&|;LN; ! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%$v("w#|̭ ɳ ɩs׿ 'J&?Q.@7^1g@DE]DX9i7 (=kųWm}Zz9`r>j1-R6kh4;  :7w~w̬a,vL<A۩O_dWT yA\8?$~ET5P7kDAQE6P'c(@%PZd<0G&#2P 1#*0$ 0$6$3v$EMYH$=Z$=-v~NAu,'yFOUipэ|aa&炉1ќX᧗A1ieDjqRJj+ve+~+*ԁ5Z+R}TN#d *8pA`2d{dF&wdzj0]ݕ ȕP|4DZs,`C@2 .Of;\ZCΡ 5~ffQ 4B_݃ŵn l}@6hOӅ1VCs%ζYxY|0A4w  1-B*(^yvaB9䌆C,n缠7fK3vH]X}7y?sq>HBo  gãׯɽ v5`Wޓ/i%|3V/B;g|\}I+ #% N>]0E; Mng0 x- |B@]:>} z=8 WeMƤة. a~9VW5>e1bҗD|D,.! E,cJhhU~QzR5+Si M ?\`g\&Ds$8I$%EIةj-XeJYGMsZ+gI%'o!HR9&NCnW^jBT-/®3FUB.A'%B14fdu -"39zsH!B洅Ձ?#:R輨 Q@=He-@; =|,+t) `ME5!q=NU:h %~ Cy]l*hA!ʩjUG" Q{WݱaVUSN.,/^KÜ#*-ƮCdg : gGkegnf6@/K'ꍯLX8^S`/0i#,@(J02-*%.r\(m"'s/O@n&e2RE "fG!y&`[[M:JvڅeCπz55x8d`9?Ep` Nri*UfI^ ? (gI}|D7IӶ}4`ٵ 740C/NԔS]/aW͒5=ϾhgtO~bLG>֍;sIg ,@bnQsZP`=#4L5` R TȁFRg"j[S8)^`Q,*b84R@bTXPȣאU0HdȇA~O^Lo2VS%WU[ZIeQɥ2-VLIJzɦ'ELYE (V8&Xj6!(6cYI0^zRq%iQ|JPjbRʃ ;7\g\U&dp9Gdy6vFł Ofל)2uKՌyKP `= h- xC*MhK;pUۨ./E,qP̡j (q5slaڽ7]B-MtK@k]O1pO+5J~Gcɔ+\gdFW ЖP]vl@$Wwc `r@ᇣZ6D.9xs`g^9-c.标_d =lfV) Xt3/ۜUi~"h#h}eo>?~ғP_Br=. Wz{!'o{(tdft|A-Y@P \G-M0@uaTbڙ;d 48x=z~HU<B"h퐢fH-QՌX0$rEsIV 猲bYAX $=t(Rs^x?aYhR2$a^m? X$X:j0ؘaHʼ5HXJ=uZF+%`[Bk*?2σqf[J4|ы=TS/˵|Z{(M"Vb9$0U a*d@c4p9 P\DݗΉu_Q q! #ΐ"EI/&ǂ5!e'АcNt0Q@bS"-ikI'y?)3ё|PSCg^U>'1(5 U*5s.Hv fŲr\:PS醙V6^+8L&m-,ƕ1{je-,X+Ouu{++Rˁ8/}$[ -e[.}bl>܆aqZ385$F mN]:u.s'ހFV5囎wOͯ~LN3! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~>%$#{("Ɂ Ҳӂ Źt&swȭ F?=J '(6Y:g+8{J= n iw$F SݪIyT1 H`3kHtZH #fѪ RQ[L.Fڅ`4b<(!>E]!X9Z5@ӦD)Nxm=r6@%xd]5ݔNnf#`3(|ݵg-g~^Hqۻjdi7T9^(`vՄViB@Q3`?l(a^Q|zȄg5 b#.u]4 [)e?@Frd,OhBZSR9dc%]` XIpcY%l)$͝g|I3EF8h44znFzJFfA՛[aDhVEZ+BlSXD,Ml=^qkgV1l2틄~;ű<|fgګ *ک p˂A&@|ZΊ-h*1ڥ.kFC魹pfL9Nm8p0G,"˭+Cp@7Xj“"[ATet 2sG3`C*(o ԴĻQ, qǛg r̸ jrj{)$vj'w38 sސj*<8䤗m ~-z >~P n`s)x'1n{'HDNt[5=%ę8f/$|0P?>-\a׷/[ɧ\W>R9 ,X,j9Ab-FRMX`v'nWA!INu..F :ve k )"bJ-+pॿu Ȥ.-HpeKpԋ{ML 0j"VSs rFQe;l7W>1b*ܸ { YS` B;osGt{UuFM%3-X>`4ƦOh0Z_@14vՠa.FU6} iqQDW$mpU@hRu+6Avr noK0>ޝܷ?|=Ԁ?_%`LȄZJ'W5SsOT.v)U1!9'0奕婈Bm8FXPBb`cU$Kd|$ 6Q)ƇPPc|H_QL%q}i@W5]IFXݑ$JrEQ6f8ahqaV6JXgɩ}Z% L1 *F  I~i]#P*W*Y "X NkZJ,JalS(K؞:QmEț}-rrg/ pT$ڻJF1fZ/pcTknVV@+ohPG{-Sh7p^%\ ZhA_1%϶=5 -&ZdZSIt5Ѷ-pl.5Sä206BZwTՀE _'w7 ,˂:^>.ڹ1sа3ݰ@(^]C}^F.z}-S^  ׳ gBuo~&>fC V)Ci z $h>ֳ`G̨vA8+ut a>x`Rrd.H2`!`脇rՒW@t<X 4غ< ?>1q9@%*V$;*AB^Wo&gn\p2%*D>5078!9+x#cS0ʰBX`0Dd#IIBJ}艔kJ (0qI('Iꆣ57|B0.acqd6~Aq!N9^F$:nZSV×xjBU4NunEa̚ ̐Tͼ?!F̊8%4[i d m+3Q8q3SGOr0mډRplJ79O4=ZdR#hOJ@wW26VTRG@ӼDPҹi*9 ,FwEr8u.¨ ux(Wt[{Rԭ^uZ1usZq445YE϶T1,d$ZE%jyƏickҖ[m;F2ʔ|˵^P >/9 "tYPP]F gPsEv]> ={΄noLN;'LF;phangorn/vignettes/primates.dna0000644000176200001440000001010013475602650016406 0ustar liggesusers 14 232 Mouse ACCAAAAAAA CATCCAAACA CCAACCCCAG CCCTTACGCA ATAGCCATAC AAAGAATATT Bovine ACCAAACCTG TCCCCACCAT CTAACACCAA CCCACATATA CAAGCTAAAC CAAAAATACC Lemur ACCAAACTAA CATCTAACAA CTACCTCCAA CTCTAAAAAA GCACTCTTAC CAAACCCATC Tarsier ATCTACCTTA TCTCCCCCAA TCAATACCAA CCTAAAAACT CTACAATTAA AAACCCCACC Squir MonkACCCCAGCAA CTCGTTGTGA CCAACATCAA TCCAAAATTA GCAAACGTAC CAACAATCTC Jpn Macaq ACTCCACCTG CTCACCTCAT CCACTACTAC TCCTCAAGCA ATACATAAAC TAAAAACTTC Rhesus MacACTTCACCCG TTCACCTCAT CCACTACTAC TCCTCAAGCG ATACATAAAT CAAAAACTTC Crab-E.MacACCCCACCTA CCCGCCTCGT CCGCTACTGC TTCTCAAACA ATATATAGAC CAACAACTTC BarbMacaq ACCCTATCTA TCTACCTCAC CCGCCACCAC CCCCCAAACA ACACACAAAC CAACAACTTT Gibbon ACTATACCCA CCCAACTCGA CCTACACCAA TCCCCACATA GCACACAGAC CAACAACCTC Orang ACCCCACCCG TCTACACCAG CCAACACCAA CCCCCACCTA CTATACCAAC CAATAACCTC Gorilla ACCCCATTTA TCCATAAAAA CCAACACCAA CCCCCATCTA ACACACAAAC TAATGACCCC Chimp ACCCCATCCA CCCATACAAA CCAACATTAC CCTCCATCCA ATATACAAAC TAACAACCTC Human ACCCCACTCA CCCATACAAA CCAACACCAC TCTCCACCTA ATATACAAAT TAATAACCTC ATACTACTAA AAACTCAAAT TAACTCTTTA ATCTTTATAC AACATTCCAC CAACCTATCC ATACAACCAT AAATAAGACT AATCTATTAA AATAACCCAT TACGATACAA AATCCCTTTC ACAACTCTAT CAACCTAACC AAACTATCAA CATGCCCTCT CCTAATTAAA AACATTGCCA GCTCAATTAC TAGCAAAAAT AGACATTCAA CTCCTCCCAT CATAACATAA AACATTCCTC CCAAATTTAA AAACACATCC TACCTTTACA ATTAATAACC ATTGTCTAGA TATACCCCTA TCACCTCTAA TACTACACAC CACTCCTGAA ATCAATGCCC TCCACTAAAA AACATCACCA TCACCTCCAA TACTACGCAC CGCTCCTAAA ATCAATGCCC CCCACCAAAA AACATCACCA TCACCTTTAA CACTACATAT CACTCCTGAG CTTAACACCC TCCGCTAAAA AACACCACTA TTATCTTTAG CACCACACAT CACCCCCAAA AGCAATACCC TTCACCAAAA AGCACCATCA CCACCTTCCA TACCAAGCCC CGACTTTACC GCCAACGCAC CTCATCAAAA CATACCTACA TCAACCCCTA AACCAAACAC TATCCCCAAA ACCAACACAC TCTACCAAAA TACACCCCCA CCACCCTCAA AGCCAAACAC CAACCCTATA ATCAATACGC CTTATCAAAA CACACCCCCA CCACTCTTCA GACCGAACAC CAATCTCACA ACCAACACGC CCCGTCAAAA CACCCCTTCA CCACCTTCAG AACTGAACGC CAATCTCATA ACCAACACAC CCCATCAAAG CACCCCTCCA ACACAAAAAA ACTCATATTT ATCTAAATAC GAACTTCACA CAACCTTAAC ACATAAACAT GTCTAGATAC AAACCACAAC ACACAATTAA TACACACCAC AATTACAATA CTAAACTCCC CACTAAACCT ACACACCTCA TCACCATTAA CGCATAACTC CTCAGTCATA TCTACTACAC GCTCCAATAA ACACATCACA ATCCCAATAA CGCATATACC TAAATACATC ATTTAATAAT AAATAAATGA ATATAAACCC TCGCCGATAA CATA-ACCCC TAAAATCAAG ACATCCTCTC GCCCAAACAA ACACCTATCT ACCCCCCCGG TCCACGCCCC TAACTCCATC ATTCCCCCTC ACCCAAACAA ACACCTACCC ATCCCCCCGG TTCACGCCTC AAACTCCATC ATTCCCCCTC ACCCAAACAA ACACCTATCT ATCCCCCCGG TCCACGCCCC AAACCCCGCT ATTCCCCCCT AATCAAACAA ACACCTATTT ATTCCCCTAA TTCACGTCCC AAATCCCATT ATCTCTCCCC ACACAAACAA ATGCCCCCCC ACCCTCCTTC TTCAAGCCCA CTAGACCATC CTACCTTCCT ATTCACATCC GCACACCCCC ACCCCCCCTG CCCACGTCCA TCCCATCACC CTCTCCTCCC ACATAAACCC ACGCACCCCC ACCCCTTCCG CCCATGCTCA CCACATCATC TCTCCCCTTC GCACAAATTC ATACACCCCT ACCTTTCCTA CCCACGTTCA CCACATCATC CCCCCCTCTC ACACAAACCC GCACACCTCC ACCCCCCTCG TCTACGCTTA CCACGTCATC CCTCCCTCTC ACCCCAGCCC AACACCCTTC CACAAATCCT TAATATACGC ACCATAAATA AC ATCCCACCAA ATCACCCTCC ATCAAATCCA CAAATTACAC AACCATTAAC CC ACCCTAACAA TTTATCCCTC CCATAATCCA AAAACTCCAT AAACACAAAT TC AATACTCCAA CTCCCATAAC ACAGCATACA TAAACTCCAT AAGTTTGAAC AC ACAACGCCAA ACCCCCCTCT CATAACTCTA CAAAATACAC AATCACCAAC AC AATACATCAA ACAATTCCCC CCAATACCCA CAAACTGCAT AAGCAAACAG AC AATACATCAA ACAATTCCCC CCAATACCCA CAAACTACAT AAACAAACAA AC AATACACCAA ACAATTTTCT CCAACACCCA CAAACTGTAT AAACAAACAA AC AACATACCAA ACAATTCTCC CTAATATACA CAAACCACGC AAACAAACAA AC AGCACGCCAA GCTCTCTACC ATCAAACGCA CAACTTACAC ATACAGAACC AC AACACCCTAA GCCACCTTCC TCAAAATCCA AAACCCACAC AACCGAAACA AC AACACCTCAA TCCACCTCCC CCCAAATACA CAATTCACAC AAACAATACC AC AACATCTTGA CTCGCCTCTC TCCAAACACA CAATTCACGC AAACAACGCC AC AACACCTTAA CTCACCTTCT CCCAAACGCA CAATTCGCAC ACACAACGCC AC phangorn/README.md0000644000176200001440000000454013475611771013364 0ustar liggesusers[![Build Status](https://travis-ci.org/KlausVigo/phangorn.svg?branch=master)](https://travis-ci.org/KlausVigo/phangorn) [![CRAN Status Badge](http://www.r-pkg.org/badges/version/phangorn)](https://cran.r-project.org/package=phangorn) [![CRAN Downloads](http://cranlogs.r-pkg.org/badges/phangorn)](https://cran.r-project.org/package=phangorn) [![Research software impact](http://depsy.org/api/package/cran/phangorn/badge.svg)](http://depsy.org/package/r/phangorn) [![codecov.io](https://codecov.io/github/KlausVigo/phangorn/coverage.svg?branch=master)](https://codecov.io/github/KlausVigo/phangorn?branch=master) [![Coverage Status](https://coveralls.io/repos/github/KlausVigo/phangorn/badge.svg?branch=master)](https://coveralls.io/github/KlausVigo/phangorn?branch=master) # phangorn phangorn is a package for phylogenetic reconstruction and analysis in the R language. phangorn offers the possibility of reconstructing phylogenies with distance based methods, maximum parsimony or maximum likelihood (ML) and performing Hadamard conjugation. Extending the general ML framework, this package provides the possibility of estimating mixture and partition models. Furthermore, phangorn offers several functions for comparing trees, phylogenetic models or splits, simulating character data and performing congruence analyses. You can install - the latest released version `install.packages("phangorn")` - the latest development version `remotes::install_github("KlausVigo/phangorn")` To install the development version you may need to install the Biostrings and seqLogo package from bioconductor first: ``` if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager::install(c("Biostrings", "seqLogo")) ``` Also the development version usually depends on tha latest ape development version and information to download can be found [here](http://ape-package.ird.fr/ape_installation.html). Additionally you may need to install on windows [Rtools](https://cran.r-project.org/bin/windows/Rtools/) and on mac [XCode](https://developer.apple.com/xcode/) and [GFortran](https://gcc.gnu.org/wiki/GFortranBinaries). If you use phangorn please cite: Schliep K.P. 2011. phangorn: phylogenetic analysis in R. Bioinformatics, 27(4) 592-593 License ------- phangorn is licensed under the GPLv2. phangorn/MD50000644000176200001440000003050413502336243012401 0ustar liggesusers0b3c033721da054576533f1ed4ceaef3 *DESCRIPTION e4cb286961c23c16719db099d464f713 *NAMESPACE 978cccef6ece31ca36dc581864c42864 *NEWS d7288c3406b83d0c79f4e8e2d60fc185 *R/Coalescent.R 6d58a2e5e2941218589f7d3ab8204684 *R/Densi.R 06535d25890633c4c2bbd6815c693c48 *R/F3X4.R 711891f7f5be42f22e90457c795e1210 *R/RcppExports.R 6ba080a88b3312de5a48a5bfaefb5c01 *R/SH.R c03b06289fa093d49bb4b4d871e534e7 *R/SOWH.R a27248b0e800ddc9b52139ac8c361f4d *R/ancestral_pml.R 5e4912b3d028ff3496d80e1850fbf678 *R/bootstrap.R 1fd6372119ccbd9c843422ee8d09a65a *R/cladePar.R aa093860dd55cf8464453e408452d0a8 *R/clanistic.R f2bad0514bbe4a4c25c52878e4ae7335 *R/codonTest.R 8d35028ef5cc61b0a73b24cb1a78ea09 *R/delta.score.R 08dede1f02c4453f625be2338b526432 *R/discrete.gamma.R 61a7a7f8eb2a6ee0015ab4ca51af3203 *R/dist.p.R 2af56f7a275c427c9e7a2eedbc71f0cd *R/distSeq.R a188c3928c43698a6e5659af8d8d1285 *R/distTree.R 6982ae856359fd2ae7f5a417b5c92825 *R/fitch.R c589e33b0cb18f00c67a6918c7f8a70e *R/hadamard.R 7d5eee6139bb3b1463f024749e01a96a *R/lento.R cb753a89f68f765b66820c52a0b47503 *R/mast.R 488f7ad8ed15283f2322af6a8b351eb9 *R/modelTest.R a2458d0d2dd621406e44e92643ad381e *R/neighborNet.R 8a3b75ccf5951d1b4b81fb1ab8a96225 *R/networx.R 2c54a991b44de58ade583ca501e5694c *R/parsimony.R 88ba447ccac28112890bf14e9b765192 *R/phangorn-package.R 468204866217ac5a5e9c609186fa0871 *R/phyDat.R 642618af182a0432a09051a97488af08 *R/phylo.R 3489a5d70886219ecb34a8c80e3e1b25 *R/pmlMix.R fdb961e7a3bc4d6bfddb9fc3989614a5 *R/pmlPart.R 08eefc8b3f70e1c127afa95d5e0be591 *R/pmlPen.R fae7b1eacf4ede471e8574ea6de8e533 *R/read.nexus.splits.R ce0260294a971a95b34dfd4b6af2a8b0 *R/sankoff.R 496fbf2df131ae4640d68effc24ba124 *R/simSeq.R 2574991b0eab1534ccdb5a39d2aeb671 *R/splits.R 70d76b235e08eea12df1058aff3e45a8 *R/splitsNetwork.R 4860ccf1969d0c2b59ba109f418da250 *R/superTree.R 2b4d6884b4ee2b92e617cea76f79d3da *R/sysdata.rda 502906de444f64fa49c83310e12ec199 *R/treeManipulation.R 6fc32685b0335bcb3549112cc5cfc26b *R/treeRearrangement.R d3b90d224b7bae2344ff487412338a32 *R/treedist.R ce5494d235612451a31e5d8cfc108391 *R/utils.R 35bc7f55e7ea2657130f3d12078798a9 *R/zzz.R fd2336b55b5d508ecd0124169dafe60f *README.md 503bc01d75f0bcef25f3a145e6b73eaf *build/vignette.rds 4a92b07bcd170e85bd237e460acafa93 *data/Laurasiatherian.RData 4b269c2e640293341b9b1c04d4dd7f4e *data/chloroplast.RData 19f84425e8caaf9f605490cdff17dd81 *data/yeast.RData 82c44d6919bfb89935a2aaf44893f750 *inst/CITATION 61b3722df2ead748e0db8595428412a1 *inst/README 0bb98666442df10c578c5e44ef55a594 *inst/doc/Ancestral.R c9f68393038b1593f83d26226c24a166 *inst/doc/Ancestral.Rnw 513e52ec4371ddf4fbda1b799d86e338 *inst/doc/Ancestral.pdf ded9d871b4e54387c14340167f196a93 *inst/doc/IntertwiningTreesAndNetworks.R 9364f4bdf1689f43b2c202c9511515f9 *inst/doc/IntertwiningTreesAndNetworks.Rmd 7b63659e612e65db4213d5a17dba897a *inst/doc/IntertwiningTreesAndNetworks.html d24a83a2803108ede87eff4de3c13ae8 *inst/doc/Networx.R fe641c0b4c7aac7aabf24c47ed6cde40 *inst/doc/Networx.Rmd bf3ceddfab47bf675ed7babcf5a76f78 *inst/doc/Networx.html 7ad7cef59361223e74d8e163035f9085 *inst/doc/Trees.R 38b0e3b2f528a536cdedde4af745739f *inst/doc/Trees.Rnw 89d9220d2157a23341a4def6797749a4 *inst/doc/Trees.pdf 619064ee07b658cfa503a016d7b0aa99 *inst/doc/phangorn-specials.R 6b1a8f46dcada22e6a3f118fd5b8ca4e *inst/doc/phangorn-specials.Rnw 30c4ee5b7b3339df44ad0f7ee3e4300b *inst/doc/phangorn-specials.pdf 3009f9da02a198cb557d435cc5ad8c7f *inst/extdata/Blosum62.dat 72f496d4c6e937ffe744d25bd8891313 *inst/extdata/Dayhoff.dat 5aa357dab0e72b27023e4302bc37dbad *inst/extdata/FLU.dat 7f63f617d5d29421b0bd90ab8511feb7 *inst/extdata/HIVb.dat 29e1aa10906a86bb9bca6d9c7f98a6cb *inst/extdata/HIVw.dat ca86e539345fa57de5c77a60308bed09 *inst/extdata/JTT.dat fdc1176d0c0f2db3de1c9dfd83d3c070 *inst/extdata/MtZoa.dat 106715eba35efc2743ccad7923ac13ce *inst/extdata/RtREV.dat e05f5a0ca507e4e15e7b95d1ce93b9fa *inst/extdata/VT.dat fc090d051ce4f18b937448a254e2764e *inst/extdata/cpREV.dat 50c707c26bf9015b37670f15d5e1c14b *inst/extdata/dayhoff-dcmut.dat 6da24109959f0c7a7db50c8db78d5d42 *inst/extdata/jtt-dcmut.dat ddc4bd45521cd72848aaf2f79b90ac6e *inst/extdata/lg.dat 917303a3df098f9137c651de0afa78fa *inst/extdata/mtArt.dat 1cd5e39670b86d32b5fe5c27dcc79648 *inst/extdata/mtREV24.dat 0ca0d0e987fcebf847a876779eddd934 *inst/extdata/mtmam.dat 20be734137b889e34006f8b8bd969054 *inst/extdata/trees/RAxML_bestTree.3moles 384aa1b8d633aa8c9f533396bd6798cb *inst/extdata/trees/RAxML_bestTree.AIs 757e4718b72d7829b5ceb34f765dc626 *inst/extdata/trees/RAxML_bestTree.Wang.out 5c7b80221c2dc93d4e6a6b857ccb62e8 *inst/extdata/trees/RAxML_bestTree.YCh 0e77d8f9386ddaee1de2f6678530c823 *inst/extdata/trees/RAxML_bestTree.mtG 2f7670326d5ff9235ecd0943944b6d59 *inst/extdata/trees/RAxML_bipartitions.3moles 959bc9ea585c21ab89b3f32a5bb49d25 *inst/extdata/trees/RAxML_bipartitions.AIs 46c172becde7e1d90ab68820b0c48822 *inst/extdata/trees/RAxML_bipartitions.YCh 75061d3e313e19632dcbce0ef48e9cdc *inst/extdata/trees/RAxML_bipartitions.mtG 2212d49c7269978890887be3686c12f9 *inst/extdata/trees/RAxML_bipartitions.woodmouse b1b3ceb83427c63fed23790fd563ef6e *inst/extdata/trees/RAxML_bipartitionsBranchLabels.3moles 41fd855853c4ceb7e28d5212b1c72d9b *inst/extdata/trees/RAxML_bipartitionsBranchLabels.AIs 0d8694f8ea078f981819be215fb724ba *inst/extdata/trees/RAxML_bipartitionsBranchLabels.YCh abcfbaf31212288e26a67c5b6c30ae70 *inst/extdata/trees/RAxML_bipartitionsBranchLabels.mtG 25077ff0b9f822583f5ae13d8bbc181a *inst/extdata/trees/RAxML_bootstrap.3moles bd830645e73afa0ee2cb121c22c4d2f2 *inst/extdata/trees/RAxML_bootstrap.AIs 086fb65b6bd2d40f09fff513b86d55cc *inst/extdata/trees/RAxML_bootstrap.Wang.out 49ade6ade3f8f08033b887a001243c86 *inst/extdata/trees/RAxML_bootstrap.YCh d2016de5a6926dd0b62c49502ec2d6b9 *inst/extdata/trees/RAxML_bootstrap.mtG 000df141b844795d38e5a755aa360f97 *inst/extdata/trees/RAxML_bootstrap.woodmouse 6cd945acf5464dce8e10c350097e2c20 *inst/extdata/trees/RAxML_distances.Wang.nxs 02888c45178001387b7a5397a3a17d3c *inst/extdata/trees/Splits.txt d3069d1eff9e70bed655b8962bf4ee2b *inst/extdata/trees/primates.dna 129e8c41182f3557b1b9911625e100b9 *inst/extdata/trees/woodmouse.fasta 421488c1ce8687879f64a350fca6d055 *inst/extdata/trees/woodmouse.mrbayes.nex.con d83fc4958acba1f1d0ca4092393c5b3d *inst/extdata/trees/woodmouse.mrbayes.nex.run1.t e185a8c9c7aed17a3e216cb78d517fd4 *inst/extdata/trees/woodmouse.mrbayes.nex.run2.t 01399608c5cc2927ebed0659ac78863d *inst/extdata/trees/woodmouse.nxs 87fa1533c4dfe7074237cfa2196bcbeb *inst/extdata/wag.dat 5e5c9da6e7ba15b472b9ea3958876662 *inst/phangorn_sticker.png 308cc143865b25766c9577650b87f5c0 *man/Ancestors.Rd 884ef49b5b15c34a389046336d547b94 *man/CI.Rd e72793e4e3e08c49156b1357a9291a01 *man/Laurasiatherian.Rd f0c375eb726b230fdd114f0b3bb1b96b *man/NJ.Rd ebaa7cd9dab35f7e83ca9edb2294a1f4 *man/SH.test.Rd 3e3918b52c25ea2f1764ab6a3a55349b *man/SOWH.test.Rd 99d52e574dc6a5b0520aeaa49944bd04 *man/add.tips.Rd 6cef4523dc9eea44b06bc15e173111b7 *man/addConfidences.Rd c04c9432a573eb46abf88a4168eaa19e *man/allTrees.Rd ef41c0200fa24d56c318f79d931e3e98 *man/ancestral.pml.Rd 5cc9ca1ee5b6b029581149a2a70612c9 *man/as.networx.Rd 4de98194f5b83d4ee658ece09cec905b *man/as.splits.Rd 085934af2215731061cbe4f246c812cb *man/bab.Rd b8a8f6b11e1e2642bbc192a45dfb3786 *man/bootstrap.pml.Rd 84449bdbd0b2adefb75bd71de6be5d8d *man/chloroplast.Rd 3cd568b4891d8b8668e6c32baa89ddb8 *man/cladePar.Rd 7f22c4b1e1385b67ce4f53b86461bd5e *man/coalSpeciesTree.Rd d346d6fb6d2e0936ee778d7841aa7ce8 *man/codonTest.Rd 3857b55e9f2676785716c811811b89ac *man/consensusNet.Rd 9a6059134efdbcae3f438ef949806bfd *man/cophenetic.networx.Rd 5173eb8e2f87b21391e5c49c0927e905 *man/delta.score.Rd bc5176475146d24e35d3149f14add4ee *man/densiTree.Rd 10e2f903c59378d66b0b364413db9a52 *man/designTree.Rd dfbc54435ddc425192da2b8de37a90fe *man/dfactorial.Rd 30388d37deba2942db54bec505357f9a *man/discrete.gamma.Rd 822a653d8577af85801dbfc6d7c7d39d *man/dist.hamming.Rd dfde0d7dfca8bd88d8fb9075d4c1c66f *man/dist.p.Rd 13e311418f4e1eaf9c0f23f83a708324 *man/distanceHadamard.Rd d092f8360372abe2b4fcde6d1b9e3605 *man/getClans.Rd f87e9235742f659511655e25a9911b3e *man/hadamard.Rd 88d5f40a3251082914b398fe2c0706cd *man/identify.networx.Rd fc3e5a6fd08cb98b6300c04cd81c771d *man/lento.Rd 828f11eb12db139a86bd3d65bd316baa *man/mast.Rd 766fdd9eb0cf1adf18d7f2c695c161e7 *man/maxCladeCred.Rd feb54260f92f9e1d27248eb2d91b1a8f *man/midpoint.Rd 47a039b94655fe0f0985630f64035a5f *man/modelTest.Rd cc7c4671f631780dfdf621343998d6d0 *man/neighborNet.Rd 214b9849369866569e980e7be0bb387a *man/nni.Rd df634b3d70c4a882f249359879fae853 *man/parsimony.Rd 653842f0e6847be2675a74ca27f7ca90 *man/phangorn-internal.Rd 868acc3c4940b61304ddc3907a9e6448 *man/phangorn-package.Rd cfee40b1573ed873dd2d09d0f24a7f39 *man/phyDat.Rd 5abb2e5f0ef8fc4165353c7827150359 *man/plot.networx.Rd 194aed8c3145206e91b8585b1e4a5c7f *man/pml.Rd e5d391d06fd29761adbae6f342ca7535 *man/pml.fit.Rd d0db98616ba12dfe7b0dda1a6d741241 *man/pmlCluster.Rd 5af01d5bfcd32d28844254b1a1e30df4 *man/pmlMix.Rd 8094fb42c593515dbfe46a4ac515f13d *man/pmlPart.Rd 331cc7b9328ef3de64da631bacb4dcf7 *man/read.aa.Rd ec69858f15ab64abd2995d57aa959e59 *man/read.nexus.splits.Rd 02bf46e94e692fccaaba2db6d66a7e06 *man/reexports.Rd e2f18b4e16f29f77cda6b6fa00e86caf *man/simSeq.Rd b4d04e2166b7169e9756f6b79c054bec *man/splitsNetwork.Rd fbaee3a67e1cf235a3916889c5638abe *man/superTree.Rd fa767d27a6444f7fa246620d3b4e67e0 *man/treedist.Rd 73308bbdef266b537f9a6aa413f539b7 *man/upgma.Rd 8d1ad5757e44f5318adabe5b0d94a2e1 *man/writeDist.Rd 7b4fdcfc85bc945a86723f094057dbcb *man/yeast.Rd a1e86627020c43852446a8e2c2141b3f *src/Makevars a745fb77d5e9d2039ca304e8fe934603 *src/RcppExports.cpp 1e590763e414b57667f2eff67e4499ed *src/dist.c 45db6d1427387ba1ce497ee11818e1a6 *src/fitch.c da6ac928ad23fb7c53dfe537fc491a52 *src/init.c 924b123a88291cf9c3148c47abb9d6b2 *src/ml.c 0266fb499e415e17da7cc31b8ea0650f *src/phangorn.c 13542b1e1396af8f7b9cc5021a6288d4 *src/phangorn_help.cpp 65522949b14d564f53a90ac438de6afc *src/sankoff.c 918df7ea8eb9b43ba5b24fafa1f6953c *src/sprdist.c c52c864af2efbc706fbd5aa38d1cd394 *tests/figs/densitree/densitree-plot.svg 0f6c7fb7a936f6a1362540ab4635f5fb *tests/figs/deps.txt 00c7ec639c948ec07fe48a27d4404a8e *tests/figs/lento-plot/lento-plot.svg 7d1eaef831fb2372b367f5be1b0a5790 *tests/testthat.R fe1ae4880f6635b5f750ed9381121ae9 *tests/testthat/test-simSeq.R 434965cace2a3bbd36811d3d6e75cba0 *tests/testthat/test_Clanistics.R 1c58551e18ec17091d9e4eb07dc866ea *tests/testthat/test_SH.R cb58c4c67f246b5ac1a70426fc311550 *tests/testthat/test_ancestral.R 055161560a7a758f86e2ab44b5d99d57 *tests/testthat/test_codon.R 6a9f749eee99ea6e58ebc49763df0fa7 *tests/testthat/test_densiTree.R 97d94788752f552d019cdaafcf7a66bc *tests/testthat/test_dist_tree.R 1c0d94b362c0c971a061db6008e1e20b *tests/testthat/test_distances.R 276d5ea8b5e180f111b90ab803f4cb3e *tests/testthat/test_hadamard.R 525cf934d948281d5f2b9df2fd9e25b5 *tests/testthat/test_lento.R d0e85a4256891fa63558b5708e83c69b *tests/testthat/test_mast.R 0de6763f787e9f1a5e9111dece7c098e *tests/testthat/test_modelTest.R a362d2410e514392501dbf666cef9ee5 *tests/testthat/test_parsimony.R 756ab51f5ad754a45d42131edc025115 *tests/testthat/test_phyDat.R 8b04dafe1258fddd16c7956ae6aa14fc *tests/testthat/test_pml.R 2a071f76d4c2ba4b9c79a7b7e8789883 *tests/testthat/test_pmlCluster.R 05ceb5befd7acf2b32441d1c13a2630d *tests/testthat/test_pmlMix.R 7783367db4fa5fd4933b70cb78844527 *tests/testthat/test_pmlPart.R dce752eac431d3b11cdb6fb1a9706e35 *tests/testthat/test_pmlPen.R 26bd54252efbc97a9a252ee11469eff7 *tests/testthat/test_speciesTree.R 2a36c9af728102816d8885ca5f9a9a99 *tests/testthat/test_splits.R 20ec41bfea311dd762e984f834a26948 *tests/testthat/test_superTree.R 7a55f09707b95c663e8d03e2a4d59318 *tests/testthat/test_treeManipulation.R 5be434930bfc189bec3ba745b2738d5f *tests/testthat/test_treeRearrangement.R 46c174995f382ef7dd6cec5ef5ac8b90 *tests/testthat/test_treedist.R c9f68393038b1593f83d26226c24a166 *vignettes/Ancestral.Rnw 9364f4bdf1689f43b2c202c9511515f9 *vignettes/IntertwiningTreesAndNetworks.Rmd fe641c0b4c7aac7aabf24c47ed6cde40 *vignettes/Networx.Rmd a8250afd3b341e6c3f889e9454d5bc5f *vignettes/Trees.RData 38b0e3b2f528a536cdedde4af745739f *vignettes/Trees.Rnw 3b1285249eed24e70427c0b56450533a *vignettes/cophylo.png 6af5f4d4c2e93469cc19d46a97ab5d0f *vignettes/exdna.txt 1ca8b1d97a011a9d0ecd9630d548dfb3 *vignettes/movie.gif 6b1a8f46dcada22e6a3f118fd5b8ca4e *vignettes/phangorn-specials.Rnw 927c5b5d25e0aaa54b0b42c0f6919d94 *vignettes/phangorn.bib d3069d1eff9e70bed655b8962bf4ee2b *vignettes/primates.dna 8f16a94fb418c2e580b92d2d63a05a44 *vignettes/seqLogo.pdf phangorn/build/0000755000176200001440000000000013502203731013161 5ustar liggesusersphangorn/build/vignette.rds0000644000176200001440000000056713502203731015530 0ustar liggesusersSMO@]T@x3DBbL^7ݡllurC-Ab⡳;oi;:kQlжѧ@ ;ŚMko$F`8̂HJeGo<%rߣm2 #,/ u{UU |)PƧEHX%<^ Description: Package contains methods for estimation of phylogenetic trees and networks using Maximum Likelihood, Maximum Parsimony, distance methods and Hadamard conjugation. Allows to compare trees, models selection and offers visualizations for trees and split networks. Depends: R (>= 3.2.0), ape (>= 5.0) Imports: quadprog, igraph (>= 1.0), Matrix, parallel, methods, utils, stats, graphics, grDevices, fastmatch, magrittr, Rcpp (>= 0.12.0) LinkingTo: Rcpp Suggests: testthat, vdiffr, seqinr, xtable, rgl, knitr, rmarkdown, Biostrings License: GPL (>= 2) VignetteBuilder: utils, knitr URL: https://github.com/KlausVigo/phangorn BugReports: https://github.com/KlausVigo/phangorn/issues Repository: CRAN Encoding: UTF-8 RoxygenNote: 6.1.1 NeedsCompilation: yes Packaged: 2019-06-18 15:48:42 UTC; klaus Author: Klaus Schliep [aut, cre] (), Emmanuel Paradis [aut] (), Leonardo de Oliveira Martins [aut] (), Alastair Potts [aut], Tim W. White [aut], Cyrill Stachniss [ctb], Michelle Kendall [ctb], Keren Halabi [ctb], Richel Bilderbeek [ctb], Kristin Winchell [ctb] Date/Publication: 2019-06-19 04:40:03 UTC phangorn/man/0000755000176200001440000000000013501247113012636 5ustar liggesusersphangorn/man/Laurasiatherian.Rd0000644000176200001440000000072613475602650016261 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phangorn-package.R \docType{data} \name{Laurasiatherian} \alias{Laurasiatherian} \title{Laurasiatherian data (AWCMEE)} \source{ Data have been taken from \url{http://www.allanwilsoncentre.ac.nz/} and were converted to R format by \email{klaus.schliep@gmail.com}. } \description{ Laurasiatherian RNA sequence data } \examples{ data(Laurasiatherian) str(Laurasiatherian) } \keyword{datasets} phangorn/man/cophenetic.networx.Rd0000644000176200001440000000144713475602650016774 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treedist.R \name{cophenetic.networx} \alias{cophenetic.networx} \alias{cophenetic.splits} \title{Pairwise Distances from a Phylogenetic Network} \usage{ \method{cophenetic}{networx}(x) } \arguments{ \item{x}{an object of class \code{networx}.} } \value{ an object of class \code{dist}, names are set according to the tip labels (as given by the element \code{tip.label} of the argument \code{x}). } \description{ \code{cophenetic.networx} computes the pairwise distances between the pairs of tips from a phylogenetic network using its branch lengths. } \seealso{ \code{\link[stats]{cophenetic}} for the generic function, \code{neighborNet} to construct a network from a distance matrix } \author{ Klaus Schliep } \keyword{manip} phangorn/man/addConfidences.Rd0000644000176200001440000000352613475602650016037 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/networx.R \name{createLabel} \alias{createLabel} \alias{addConfidences} \alias{addConfidences.phylo} \alias{presenceAbsence} \title{Compare splits and add support values to an object} \usage{ createLabel(x, y, label_y, type = "edge", nomatch = NA) addConfidences(x, y, ...) \method{addConfidences}{phylo}(x, y, ...) presenceAbsence(x, y) } \arguments{ \item{x}{an object of class \code{splits}, \code{phylo} or \code{networx}} \item{y}{an object of class \code{splits}, \code{phylo}, \code{multiPhylo} or \code{networx}} \item{label_y}{label of y matched on x. Will be usually of length(as.splits(x)).} \item{type}{should labels returned for edges (in \code{networx}) or splits.} \item{nomatch}{default value if no match between x and y is found.} \item{...}{Further arguments passed to or from other methods.} } \value{ The object \code{x} with added bootstrap / MCMC support values. } \description{ Add support values to a \code{splits}, \code{phylo} or \code{networx} object. } \examples{ data(woodmouse) woodmouse <- phyDat(woodmouse) tmpfile <- normalizePath(system.file("extdata/trees/RAxML_bootstrap.woodmouse", package="phangorn")) boot_trees <- read.tree(tmpfile) dm <- dist.ml(woodmouse) tree <- upgma(dm) nnet <- neighborNet(dm) tree <- addConfidences(tree, boot_trees) nnet <- addConfidences(nnet, boot_trees) plot(tree, show.node.label=TRUE) plot(nnet, "2D", show.edge.label=TRUE) } \references{ Schliep, K., Potts, A. J., Morrison, D. A. and Grimm, G. W. (2017), Intertwining phylogenetic trees and networks. \emph{Methods Ecol Evol}. \bold{8}, 1212--1220. doi:10.1111/2041-210X.12760 } \seealso{ \code{\link{as.splits}}, \code{\link{as.networx}}, \code{\link{RF.dist}}, \code{\link{plot.phylo}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/writeDist.Rd0000644000176200001440000000361013475602650015116 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distSeq.R \name{writeDist} \alias{writeDist} \alias{write.nexus.dist} \alias{readDist} \alias{read.nexus.dist} \alias{unique.dist} \title{Writing and reading distances in phylip and nexus format} \usage{ writeDist(x, file = "", format = "phylip", ...) write.nexus.dist(x, file = "", append = FALSE, upper = FALSE, diag = TRUE, digits = getOption("digits"), taxa = !append) readDist(file, format = "phylip") read.nexus.dist(file) \method{unique}{dist}(x, incomparables, ...) } \arguments{ \item{x}{A \code{dist} object.} \item{file}{A file name.} \item{format}{file format, default is "phylip", only other option so far is "nexus".} \item{\dots}{Further arguments passed to or from other methods.} \item{append}{logical. If TRUE the nexus blocks will be added to a file.} \item{upper}{logical value indicating whether the upper triangle of the distance matrix should be printed.} \item{diag}{logical value indicating whether the diagonal of the distance matrix should be printed.} \item{digits}{passed to format inside of \code{write.nexus.dist}.} \item{taxa}{logical. If TRUE a taxa block is added.} \item{incomparables}{Not used so far.} } \value{ an object of class \code{dist} } \description{ \code{readDist}, \code{writeDist} and \code{write.nexus.dist} are useful to exchange distance matrices with other phylogenetic programs. } \examples{ data(yeast) dm <- dist.ml(yeast) writeDist(dm) write.nexus.dist(dm) } \references{ Maddison, D. R., Swofford, D. L. and Maddison, W. P. (1997) NEXUS: an extensible file format for systematic information. \emph{Systematic Biology}, \bold{46}, 590--621. } \seealso{ To compute distance matrices see \code{\link{dist.ml}} \code{\link[ape]{dist.dna}} and \code{\link{dist.p}} for pairwise polymorphism p-distances } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/dist.p.Rd0000644000176200001440000000623113502010602014320 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dist.p.R \name{dist.p} \alias{dist.p} \title{Pairwise Polymorphism P-Distances from DNA Sequences} \usage{ dist.p(x, cost = "polymorphism", ignore.indels = TRUE) } \arguments{ \item{x}{a matrix containing DNA sequences; this must be of class "phyDat" (use as.phyDat to convert from DNAbin objects).} \item{cost}{A cost matrix or "polymorphism" for a predefined one.} \item{ignore.indels}{a logical indicating whether gaps are treated as fifth state or not. Warning, each gap site is treated as a characters, so an an indel that spans a number of base positions would be treated as multiple character states.} } \value{ an object of class \code{dist}. } \description{ This function computes a matrix of pairwise uncorrected polymorphism p-distances. Polymorphism p-distances include intra-individual site polymorphisms (2ISPs; e.g. "R") when calculating genetic distances. } \details{ The polymorphism p-distances (Potts et al. 2014) have been developed to analyse intra-individual variant polymorphism. For example, the widely used ribosomal internal transcribed spacer (ITS) region (e.g. Alvarez and Wendel, 2003) consists of 100's to 1000's of units within array across potentially multiple nucleolus organising regions (Bailey et al., 2003; Goeker and Grimm, 2008). This can give rise to intra-individual site polymorphisms (2ISPs) that can be detected from direct-PCR sequencing or cloning . Clone consensus sequences (see Goeker and Grimm, 2008) can be analysed with this function. } \examples{ data(Laurasiatherian) laura <- as.DNAbin(Laurasiatherian) dm <- dist.p(Laurasiatherian, "polymorphism") ######################################################## # Dealing with indel 2ISPs # These can be coded using an "x" in the alignment. Note # that as.character usage in the read.dna() function. ######################################################### cat("3 5", "No305 ATRA-", "No304 ATAYX", "No306 ATAGA", file = "exdna.txt", sep = "\\n") (ex.dna <- read.dna("exdna.txt", format = "sequential", as.character=TRUE)) dat <- phyDat(ex.dna, "USER", levels=unique(as.vector(ex.dna))) dist.p(dat) unlink("exdna.txt") } \references{ Alvarez, I., and J. F. Wendel. (2003) Ribosomal ITS sequences and plant phylogenetic inference. \emph{ Molecular Phylogenetics and Evolution}, \bold{29}, 417--434. Bailey, C. D., T. G. Carr, S. A. Harris, and C. E. Hughes. (2003) Characterization of angiosperm nrDNA polymorphism, paralogy, and pseudogenes. \emph{Molecular Phylogenetics and Evolution} \bold{29}, 435--455. Goeker, M., and G. Grimm. (2008) General functions to transform associate data to host data, and their use in phylogenetic inference from sequences with intra-individual variability. \emph{BMC Evolutionary Biology}, \bold{8}:86. Potts, A.J., T.A. Hedderson, and G.W. Grimm. (2014) Constructing phylogenies in the presence of intra-individual site polymorphisms (2ISPs) with a focus on the nuclear ribosomal cistron. \emph{Systematic Biology}, \bold{63}, 1--16 } \seealso{ \code{\link[ape]{dist.dna}}, \code{\link[phangorn]{dist.hamming}} } \author{ Klaus Schliep and Alastair Potts } \keyword{cluster} phangorn/man/mast.Rd0000644000176200001440000000221213501073033014064 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mast.R \name{mast} \alias{mast} \title{Maximum agreement subtree} \usage{ mast(x, y, tree = TRUE, rooted = TRUE) } \arguments{ \item{x}{a tree, i.e. an object of class \code{phylo}.} \item{y}{a tree, i.e. an object of class \code{phylo}.} \item{tree}{a logicical, if TRUE returns a tree other wise the tip labels of the the maximum agreement subtree.} \item{rooted}{logical if TRUE treats trees as rooted otherwise unrooted.} } \value{ \code{mast} returns a vector of the tip labels in the MAST. } \description{ \code{mast} computes the maximum agreement subtree (MAST). } \details{ The code is derived from the code example in Valiente (2009). The version for the unrooted trees is much slower. } \examples{ tree1 <- rtree(100) tree2 <- rSPR(tree1, 5) tips <- mast(tree1, tree2) } \references{ G. Valiente (2009). \emph{Combinatorial Pattern Matching Algorithms in Computational Biology using Perl and R}. Taylor & Francis/CRC Press } \seealso{ \code{\link{SPR.dist}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} based on code of Gabriel Valiente } \keyword{cluster} phangorn/man/phangorn-package.Rd0000644000176200001440000000270413475602650016350 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phangorn-package.R \docType{package} \name{phangorn-package} \alias{phangorn-package} \alias{phangorn} \title{Phylogenetic analysis in R} \description{ Phylogenetic analysis in R (Estimation of phylogenetic trees and networks using Maximum Likelihood, Maximum Parsimony, Distance methods & Hadamard conjugation) } \details{ The complete list of functions can be displayed with \code{library(help = phangorn)}. Further information is available in several vignettes. To show the available vignettes in an HTML browser type \code{browseVignettes("phangorn")}. \tabular{ll}{ \code{Trees} \tab Constructing phylogenetic trees (source, pdf) \cr \code{phangorn-specials} \tab Advanced features (source, pdf) \cr \code{Ancestral} \tab Ancestral sequence reconstruction (source, pdf) \cr \code{Networx} \tab Splits and Networx (source, html) \cr } The first vignette (to display type \code{vignette('Trees')}) gives an introduction in phylogenetic analysis with phangorn. The second vignette (phangorn-special) covers more advanced feature like defining special character spaces and things which fit nowhere else. More information on \bold{phangorn} can be found on \url{http://www.phangorn.org}. } \references{ Schliep K.P. (2011) phangorn: Phylogenetic analysis in R. \emph{Bioinformatics}, 27(4) 592-593 } \author{ Klaus Schliep Maintainer: Klaus Schliep } \keyword{package} phangorn/man/SOWH.test.Rd0000644000176200001440000000414713475602650014704 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/SOWH.R \name{SOWH.test} \alias{SOWH.test} \title{Swofford-Olsen-Waddell-Hillis Test} \usage{ SOWH.test(x, n = 100, restricted = list(optNni = FALSE), optNni = TRUE, trace = 1, ...) } \arguments{ \item{x}{an object of class \code{"pml"}.} \item{n}{the number of bootstrap replicates.} \item{restricted}{list of restricted parameter settings.} \item{optNni}{Logical value indicating whether topology gets optimized (NNI).} \item{trace}{Show output during computations.} \item{\dots}{Further arguments passed to \code{"optim.pml"}.} } \value{ an object of class SOWH. That is a list with three elements, one is a matrix containing for each bootstrap replicate the (log-) likelihood of the restricted and unrestricted estimate and two pml objects of the restricted and unrestricted model. } \description{ This function computes the Swofford--Olsen--Waddell--Hillis (SOWH) test, a parametric bootstrap test. The function is computational very demanding and likely to be very slow. } \details{ \code{SOWH.test} performs a parametric bootstrap test to compare two trees. It makes extensive use \code{simSeq} and \code{optim.pml} and can take quite long. } \examples{ # in real analysis use larger n, e.g. 500 preferably more \dontrun{ data(Laurasiatherian) dm <- dist.logDet(Laurasiatherian) tree <- NJ(dm) fit <- pml(tree, Laurasiatherian) fit <- optim.pml(fit, TRUE) set.seed(6) tree <- rNNI(fit$tree, 1) fit <- update(fit, tree = tree) (res <- SOWH.test(fit, n=100)) summary(res) } } \references{ Goldman, N., Anderson, J. P., and Rodrigo, A. G. (2000) Likelihood -based tests of topologies in phylogenetics. \emph{Systematic Biology} \bold{49} 652-670. Swofford, D.L., Olsen, G.J., Waddell, P.J. and Hillis, D.M. (1996) Phylogenetic Inference in Hillis, D.M., Moritz, C. and Mable, B.K. (Eds.) \emph{Molecular Systematics} (2nd ed.) 407-514, Sunderland, MA: Sinauer } \seealso{ \code{\link{pml}}, \code{\link{pmlPart}}, \code{\link{pmlCluster}}, \code{\link{simSeq}}, \code{\link{SH.test}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{models} phangorn/man/pml.Rd0000644000176200001440000002171513475602650013736 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phylo.R \name{pml.control} \alias{pml.control} \alias{pml} \alias{optim.pml} \title{Likelihood of a tree.} \usage{ pml.control(epsilon = 1e-08, maxit = 10, trace = 1) pml(tree, data, bf = NULL, Q = NULL, inv = 0, k = 1, shape = 1, rate = 1, model = NULL, ...) optim.pml(object, optNni = FALSE, optBf = FALSE, optQ = FALSE, optInv = FALSE, optGamma = FALSE, optEdge = TRUE, optRate = FALSE, optRooted = FALSE, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1L), model = NULL, rearrangement = ifelse(optNni, "NNI", "none"), subs = NULL, ratchet.par = list(iter = 20L, maxit = 100L, prop = 1/2), ...) } \arguments{ \item{epsilon}{Stop criterion for optimisation (see details).} \item{maxit}{Maximum number of iterations (see details).} \item{trace}{Show output during optimization (see details).} \item{tree}{A phylogenetic \code{tree}, object of class \code{phylo}.} \item{data}{An alignment, object of class \code{phyDat}.} \item{bf}{Base frequencies (see details).} \item{Q}{A vector containing the lower triangular part of the rate matrix.} \item{inv}{Proportion of invariable sites.} \item{k}{Number of intervals of the discrete gamma distribution.} \item{shape}{Shape parameter of the gamma distribution.} \item{rate}{Rate.} \item{model}{allows to choose an amino acid models or nucleotide model, see details.} \item{\dots}{Further arguments passed to or from other methods.} \item{object}{An object of class \code{pml}.} \item{optNni}{Logical value indicating whether toplogy gets optimized (NNI).} \item{optBf}{Logical value indicating whether base frequencies gets optimized.} \item{optQ}{Logical value indicating whether rate matrix gets optimized.} \item{optInv}{Logical value indicating whether proportion of variable size gets optimized.} \item{optGamma}{Logical value indicating whether gamma rate parameter gets optimized.} \item{optEdge}{Logical value indicating the edge lengths gets optimized.} \item{optRate}{Logical value indicating the overall rate gets optimized.} \item{optRooted}{Logical value indicating if the edge lengths of a rooted tree get optimized.} \item{control}{A list of parameters for controlling the fitting process.} \item{rearrangement}{type of tree tree rearrangements to perform, one of "none", "NNI", "stochastic" or "ratchet"} \item{subs}{A (integer) vector same length as Q to specify the optimization of Q} \item{ratchet.par}{search parameter for stochastic search} } \value{ \code{pml} or \code{optim.pml} return a list of class \code{pml}, some are useful for further computations like \item{tree}{the phylogenetic tree.} \item{data}{the alignment.} \item{logLik}{Log-likelihood of the tree.} \item{siteLik}{Site log-likelihoods.} \item{weight}{Weight of the site patterns.} } \description{ \code{pml} computes the likelihood of a phylogenetic tree given a sequence alignment and a model. \code{optim.pml} optimizes the different model parameters. } \details{ Base frequencies in \code{pml} can be supplied in different ways. For amino acid they are usually defined through specifying a model, so the argument bf does not need to be specified. Otherwise if \code{bf=NULL}, each state is given equal probabilty. It can be a numeric vector given the frequencies. Last but not least \code{bf} can be string "equal", "empirical" and for codon models additionally "F3x4". The topology search uses a nearest neighbor interchange (NNI) and the implementation is similar to phyML. The option model in pml is only used for amino acid models. The option model defines the nucleotide model which is getting optimised, all models which are included in modeltest can be chosen. Setting this option (e.g. "K81" or "GTR") overrules options optBf and optQ. Here is a overview how to estimate different phylogenetic models with \code{pml}: \tabular{lll}{ model \tab optBf \tab optQ \cr Jukes-Cantor \tab FALSE \tab FALSE \cr F81 \tab TRUE \tab FALSE \cr symmetric \tab FALSE \tab TRUE \cr GTR \tab TRUE \tab TRUE } Via model in optim.pml the following nucleotide models can be specified: JC, F81, K80, HKY, TrNe, TrN, TPM1, K81, TPM1u, TPM2, TPM2u, TPM3, TPM3u, TIM1e, TIM1, TIM2e, TIM2, TIM3e, TIM3, TVMe, TVM, SYM and GTR. These models are specified as in Posada (2008). So far 17 amino acid models are supported ("WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", "FLU", "Blossum62", "Dayhoff_DCMut" and "JTT_DCMut") and additionally rate matrices and amino acid frequencies can be supplied. It is also possible to estimate codon models (e.g. YN98), for details see also the chapter in vignette("phangorn-specials"). If the option 'optRooted' is set to TRUE than the edge lengths of rooted tree are optimized. The tree has to be rooted and by now ultrametric! Optimising rooted trees is generally much slower. \code{pml.control} controls the fitting process. \code{epsilon} and \code{maxit} are only defined for the most outer loop, this affects \code{pmlCluster}, \code{pmlPart} and \code{pmlMix}. \code{epsilon} is defined as (logLik(k)-logLik(k+1))/logLik(k+1), this seems to be a good heuristics which works reasonably for small and large trees or alignments. If \code{trace} is set to zero than no out put is shown, if functions are called internally than the trace is decreased by one, so a higher of trace produces more feedback. If \code{rearrangement} is set to \code{stochastic} a stochastic search algorithm similar to Nguyen et al. (2015). and for \code{ratchet} the likelihood ratchet as in Vos (2003). This should helps often to find better tree topologies, especially for larger trees. } \examples{ example(NJ) # Jukes-Cantor (starting tree from NJ) fitJC <- pml(tree, Laurasiatherian) # optimize edge length parameter fitJC <- optim.pml(fitJC) fitJC \dontrun{ # search for a better tree using NNI rearrangements fitJC <- optim.pml(fitJC, optNni=TRUE) fitJC plot(fitJC$tree) # JC + Gamma + I - model fitJC_GI <- update(fitJC, k=4, inv=.2) # optimize shape parameter + proportion of invariant sites fitJC_GI <- optim.pml(fitJC_GI, optGamma=TRUE, optInv=TRUE) # GTR + Gamma + I - model fitGTR <- optim.pml(fitJC_GI, rearrangement = "stochastic", optGamma=TRUE, optInv=TRUE, model="GTR") } # 2-state data (RY-coded) dat <- acgt2ry(Laurasiatherian) fit2ST <- pml(tree, dat) fit2ST <- optim.pml(fit2ST,optNni=TRUE) fit2ST # show some of the methods available for class pml methods(class="pml") } \references{ Felsenstein, J. (1981) Evolutionary trees from DNA sequences: a maximum likelihood approach. \emph{Journal of Molecular Evolution}, \bold{17}, 368--376. Felsenstein, J. (2004). \emph{Inferring Phylogenies}. Sinauer Associates, Sunderland. Yang, Z. (2006). \emph{Computational Molecular evolution}. Oxford University Press, Oxford. Adachi, J., P. J. Waddell, W. Martin, and M. Hasegawa (2000) Plastid genome phylogeny and a model of amino acid substitution for proteins encoded by chloroplast DNA. \emph{Journal of Molecular Evolution}, \bold{50}, 348--358 Rota-Stabelli, O., Z. Yang, and M. Telford. (2009) MtZoa: a general mitochondrial amino acid substitutions model for animal evolutionary studies. \emph{Mol. Phyl. Evol}, \bold{52(1)}, 268--72 Whelan, S. and Goldman, N. (2001) A general empirical model of protein evolution derived from multiple protein families using a maximum-likelihood approach. \emph{Molecular Biology and Evolution}, \bold{18}, 691--699 Le, S.Q. and Gascuel, O. (2008) LG: An Improved, General Amino-Acid Replacement Matrix \emph{Molecular Biology and Evolution}, \bold{25(7)}, 1307--1320 Yang, Z., R. Nielsen, and M. Hasegawa (1998) Models of amino acid substitution and applications to Mitochondrial protein evolution. \emph{Molecular Biology and Evolution}, \bold{15}, 1600--1611 Abascal, F., D. Posada, and R. Zardoya (2007) MtArt: A new Model of amino acid replacement for Arthropoda. \emph{Molecular Biology and Evolution}, \bold{24}, 1--5 Kosiol, C, and Goldman, N (2005) Different versions of the Dayhoff rate matrix - \emph{Molecular Biology and Evolution}, \bold{22}, 193--199 L.-T. Nguyen, H.A. Schmidt, A. von Haeseler, and B.Q. Minh (2015) IQ-TREE: A fast and effective stochastic algorithm for estimating maximum likelihood phylogenies. \emph{Molecular Biology and Evolution}, \bold{32}, 268--274. Vos, R. A. (2003) Accelerated Likelihood Surface Exploration: The Likelihood Ratchet. \emph{Systematic Biology}, \bold{52(3)}, 368--373 Yang, Z., and R. Nielsen (1998) Synonymous and nonsynonymous rate variation in nuclear genes of mammals. \emph{Journal of Molecular Evolution}, \bold{46}, 409-418. Lewis, P.O. (2001) A likelihood approach to estimating phylogeny from discrete morphological character data. \emph{Systematic Biology} \bold{50}, 913--925. } \seealso{ \code{\link{bootstrap.pml}}, \code{\link{modelTest}}, \code{\link{pmlPart}}, \code{\link{pmlMix}}, \code{\link{plot.phylo}}, \code{\link{SH.test}}, \code{\link{ancestral.pml}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/neighborNet.Rd0000644000176200001440000000227413475602650015411 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/neighborNet.R \name{neighborNet} \alias{neighborNet} \title{Computes a neighborNet from a distance matrix} \usage{ neighborNet(x, ord = NULL) } \arguments{ \item{x}{a distance matrix.} \item{ord}{a circular ordering.} } \value{ \code{neighborNet} returns an object of class networx. } \description{ Computes a neighborNet, i.e. an object of class \code{networx} from a distance matrix. } \details{ \code{neighborNet} is still experimental. The cyclic ordering sometimes differ from the SplitsTree implementation, the \emph{ord} argument can be used to enforce a certain circular ordering. } \examples{ data(yeast) dm <- dist.ml(yeast) nnet <- neighborNet(dm) plot(nnet, "2D") } \references{ Bryant, D. & Moulton, V. (2004) Neighbor-Net: An Agglomerative Method for the Construction of Phylogenetic Networks. \emph{Molecular Biology and Evolution}, 2004, \bold{21}, 255-265 } \seealso{ \code{\link{splitsNetwork}}, \code{\link{consensusNet}}, \code{\link{plot.networx}}, \code{\link{lento}}, \code{\link{cophenetic.networx}}, \code{\link{distanceHadamard}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{hplot} phangorn/man/midpoint.Rd0000644000176200001440000000333613475602650014770 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treeManipulation.R \name{getRoot} \alias{getRoot} \alias{midpoint} \alias{midpoint.phylo} \alias{midpoint.multiPhylo} \alias{pruneTree} \title{Tree manipulation} \usage{ getRoot(tree) midpoint(tree, node.labels = "support", ...) \method{midpoint}{phylo}(tree, node.labels = "support", ...) \method{midpoint}{multiPhylo}(tree, node.labels = "support", ...) pruneTree(tree, ..., FUN = ">=") } \arguments{ \item{tree}{an object of class \code{phylo}} \item{node.labels}{are nodel labels 'support' values, 'label' or should be 'deleted'} \item{\dots}{further arguments, passed to other methods.} \item{FUN}{a function evaluated on the nodelabels, result must be logical.} } \value{ \code{pruneTree} and \code{midpoint} a tree. \code{getRoot} returns the root node. } \description{ \code{midpoint} performs midpoint rooting of a tree. \code{pruneTree} produces a consensus tree. } \details{ \code{pruneTree} prunes back a tree and produces a consensus tree, for trees already containing nodelabels. It assumes that nodelabels are numerical or character that allows conversion to numerical, it uses as.numeric(as.character(tree$node.labels)) to convert them. \code{midpoint} so far does not transform node.labels properly. } \examples{ tree <- rtree(10, rooted = FALSE) tree$node.label <- c("", round(runif(tree$Nnode-1), 3)) tree2 <- midpoint(tree) tree3 <- pruneTree(tree, .5) par(mfrow = c(3,1)) plot(tree, show.node.label=TRUE) plot(tree2, show.node.label=TRUE) plot(tree3, show.node.label=TRUE) } \seealso{ \code{\link[ape]{consensus}}, \code{\link[ape]{root}}, \code{\link[ape]{multi2di}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/coalSpeciesTree.Rd0000644000176200001440000000222513475602650016213 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Coalescent.R \name{coalSpeciesTree} \alias{coalSpeciesTree} \title{Species Tree} \usage{ coalSpeciesTree(tree, X = NULL, sTree = NULL) } \arguments{ \item{tree}{an object of class \code{multiPhylo}} \item{X}{A \code{phyDat} object to define which individual belongs to which species.} \item{sTree}{A species tree which fixes the topology.} } \value{ The function returns an object of class \code{phylo}. } \description{ \code{coalSpeciesTree} estimates species trees and can handle multiple individuals per species. } \details{ \code{coalSpeciesTree} estimates a single linkage tree as suggested by Liu et al. (2010) from the element wise minima of the cophenetic matrices of the gene trees. It extends \code{speciesTree} in ape as it allows that have several individuals per gene tree. } \references{ Liu, L., Yu, L. and Pearl, D. K. (2010) Maximum tree: a consistent estimator of the species tree. \emph{Journal of Mathematical Biology}, \bold{60}, 95--106. } \seealso{ \code{\link{speciesTree}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} Emmanuel Paradies } \keyword{cluster} phangorn/man/splitsNetwork.Rd0000644000176200001440000000373213475602650016035 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/splitsNetwork.R \name{splitsNetwork} \alias{splitsNetwork} \title{Phylogenetic Network} \usage{ splitsNetwork(dm, splits = NULL, gamma = 0.1, lambda = 1e-06, weight = NULL) } \arguments{ \item{dm}{A distance matrix.} \item{splits}{a splits object, containing all splits to consider, otherwise all possible splits are used} \item{gamma}{penalty value for the L1 constraint.} \item{lambda}{penalty value for the L2 constraint.} \item{weight}{a vector of weights.} } \value{ \code{splitsNetwork} returns a splits object with a matrix added. The first column contains the indices of the splits, the second column an unconstrained fit without penalty terms and the third column the constrained fit. } \description{ \code{splitsNetwork} estimates weights for a splits graph from a distance matrix. } \details{ \code{splitsNetwork} fits non-negative least-squares phylogenetic networks using L1 (LASSO), L2(ridge regression) constraints. The function minimizes the penalized least squares \deqn{\beta = min \sum(dm - X\beta)^2 + \lambda \|\beta \|^2_2 }{ beta = sum(dm - X*beta)^2 + lambda |beta|^2_2 } with respect to \deqn{\|\beta \|_1 <= \gamma, \beta >= 0}{ |beta|_1 = gamma, beta >= 0} where \eqn{X} is a design matrix constructed with \code{designSplits}. External edges are fitted without L1 or L2 constraints. } \examples{ data(yeast) dm <- dist.ml(yeast) fit <- splitsNetwork(dm) net <- as.networx(fit) plot(net, "2D") write.nexus.splits(fit) } \references{ Efron, Hastie, Johnstone and Tibshirani (2004) Least Angle Regression (with discussion) \emph{Annals of Statistics} \bold{32(2)}, 407--499 K. P. Schliep (2009). Some Applications of statistical phylogenetics (PhD Thesis) } \seealso{ \code{\link[phangorn]{distanceHadamard}}, \code{\link[phangorn]{designTree}} \code{\link[phangorn]{consensusNet}}, \code{\link[phangorn]{plot.networx}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/discrete.gamma.Rd0000644000176200001440000000415513501247104016015 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/discrete.gamma.R \name{discrete.gamma} \alias{discrete.gamma} \alias{plot_gamma_plus_inv} \title{Discrete Gamma function} \usage{ discrete.gamma(alpha, k) plot_gamma_plus_inv(shape = 1, inv = 0, k = 4, discrete = TRUE, cdf = TRUE, append = FALSE, xlab = "x", ylab = ifelse(cdf, "F(x)", "f(x)"), xlim = NULL, verticals = FALSE, ...) } \arguments{ \item{alpha}{Shape parameter of the gamma distribution.} \item{k}{Number of intervals of the discrete gamma distribution.} \item{shape}{Shape parameter of the gamma distribution.} \item{inv}{Proportion of invariable sites.} \item{discrete}{logical wether to plot discrete (default) or continous pdf or cdf.} \item{cdf}{logical wether to plot the cummulative distribution function or density / probability function.} \item{append}{logical; if TRUE only add to an existing plot.} \item{xlab}{a label for the x axis, defaults to a description of x.} \item{ylab}{a label for the y axis, defaults to a description of y.} \item{xlim}{the x limits of the plot.} \item{verticals}{ogical; if TRUE, draw vertical lines at steps.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ \code{discrete.gamma} returns a matrix. } \description{ \code{discrete.gamma} internally used for the likelihood computations in \code{pml} or \code{optim.pml}. It is useful to understand how it works for simulation studies or in cases where . } \details{ These functions are exported to be used in different packages so far only in the package coalescentMCMC, but are not intended for end user. Most of the functions call C code and are far less forgiving if the import is not what they expect than \code{pml}. } \examples{ discrete.gamma(1, 4) par(mfrow = c(2,1)) plot_gamma_plus_inv(shape=2, discrete = FALSE, cdf=FALSE) plot_gamma_plus_inv(shape=2, append = TRUE, cdf=FALSE) plot_gamma_plus_inv(shape=2, discrete = FALSE) plot_gamma_plus_inv(shape=2, append = TRUE) par(mfrow = c(1,1)) } \seealso{ \code{\link{pml.fit}, \link{stepfun}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/phyDat.Rd0000644000176200001440000001472013475602650014375 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phyDat.R \name{phyDat} \alias{phyDat} \alias{as.phyDat.character} \alias{as.phyDat.data.frame} \alias{as.phyDat.matrix} \alias{as.MultipleAlignment} \alias{as.MultipleAlignment.phyDat} \alias{cbind.phyDat} \alias{c.phyDat} \alias{acgt2ry} \alias{removeUndeterminedSites} \alias{phyDat2MultipleAlignment} \alias{dna2codon} \alias{codon2dna} \alias{as.phyDat} \alias{as.phyDat.factor} \alias{as.phyDat.DNAbin} \alias{as.phyDat.alignment} \alias{phyDat2alignment} \alias{as.phyDat.MultipleAlignment} \alias{as.character.phyDat} \alias{as.data.frame.phyDat} \alias{as.DNAbin.phyDat} \alias{as.AAbin.phyDat} \alias{write.phyDat} \alias{read.phyDat} \alias{baseFreq} \alias{subset.phyDat} \alias{[.phyDat} \alias{unique.phyDat} \alias{allSitePattern} \alias{genlight2phyDat} \alias{image.phyDat} \title{Conversion among Sequence Formats} \usage{ phyDat(data, type = "DNA", levels = NULL, return.index = TRUE, ...) dna2codon(x, codonstart = 1, ambiguity = "---", ...) codon2dna(x) as.phyDat(x, ...) \method{as.phyDat}{factor}(x, ...) \method{as.phyDat}{DNAbin}(x, ...) \method{as.phyDat}{alignment}(x, type = "DNA", ...) phyDat2alignment(x) \method{as.phyDat}{MultipleAlignment}(x, ...) \method{as.MultipleAlignment}{phyDat}(x, ...) acgt2ry(obj) \method{as.character}{phyDat}(x, allLevels = TRUE, ...) \method{as.data.frame}{phyDat}(x, ...) \method{as.DNAbin}{phyDat}(x, ...) \method{as.AAbin}{phyDat}(x, ...) write.phyDat(x, file, format = "phylip", colsep = "", nbcol = -1, ...) read.phyDat(file, format = "phylip", type = "DNA", ...) baseFreq(obj, freq = FALSE, all = FALSE, drop.unused.levels = FALSE) \method{subset}{phyDat}(x, subset, select, site.pattern = TRUE, ...) \method{[}{phyDat}(x, i, j, ..., drop = FALSE) \method{unique}{phyDat}(x, incomparables = FALSE, identical = TRUE, ...) removeUndeterminedSites(x, ...) allSitePattern(n, levels = c("a", "c", "g", "t"), names = NULL) genlight2phyDat(x, ambiguity = NA) \method{image}{phyDat}(x, ...) } \arguments{ \item{data}{An object containing sequences.} \item{type}{Type of sequences ("DNA", "AA", "CODON" or "USER").} \item{levels}{Level attributes.} \item{return.index}{If TRUE returns a index of the site patterns.} \item{...}{further arguments passed to or from other methods.} \item{x}{An object containing sequences.} \item{codonstart}{an integer giving where to start the translation. This should be 1, 2, or 3, but larger values are accepted and have for effect to start the translation further within the sequence.} \item{ambiguity}{character for ambiguous character and no contrast is provided.} \item{obj}{as object of class phyDat} \item{allLevels}{return original data.} \item{file}{A file name.} \item{format}{File format of the sequence alignment (see details). Several popular formats are supported: "phylip", "interleaved", "sequential", "clustal", "fasta" or "nexus", or any unambiguous abbreviation of these.} \item{colsep}{a character used to separate the columns (a single space by default).} \item{nbcol}{a numeric specifying the number of columns per row (-1 by default); may be negative implying that the nucleotides are printed on a single line.} \item{freq}{logical, if 'TRUE', frequencies or counts are returned otherwise proportions} \item{all}{all a logical; if all = TRUE, all counts of bases, ambiguous codes, missing data, and alignment gaps are returned as defined in the contrast.} \item{drop.unused.levels}{logical, drop unused levels} \item{subset}{a subset of taxa.} \item{select}{a subset of characters.} \item{site.pattern}{select site pattern or sites.} \item{i, j}{indices of the rows and/or columns to select or to drop. They may be numeric, logical, or character (in the same way than for standard R objects).} \item{drop}{for compatibility with the generic (unused).} \item{incomparables}{for compatibility with unique.} \item{identical}{if TRUE (default) sequences have to be identical, if FALSE sequences are considered duplicates if distance between sequences is zero (happens frequently with ambiguous sites).} \item{n}{Number of sequences.} \item{names}{Names of sequences.} } \value{ The functions return an object of class \code{phyDat}. } \description{ These functions transform several DNA formats into the \code{phyDat} format. \code{allSitePattern} generates an alignment of all possible site patterns. } \details{ If \code{type} "USER" a vector has to be give to \code{levels}. For example c("a", "c", "g", "t", "-") would create a data object that can be used in phylogenetic analysis with gaps as fifth state. There is a more detailed example for specifying "USER" defined data formats in the vignette "phangorn-specials". \code{allSitePattern} returns all possible site patterns and can be useful in simulation studies. For further details see the vignette phangorn-specials. \code{write.phyDat} calls the function write.dna or write.nexus.data and \code{read.phyDat} calls the function \code{read.dna}, \code{read.aa} or \code{read.nexus.data} see for more details over there. You may import data directly with \code{\link[ape]{read.dna}} or \code{\link[ape]{read.nexus.data}} and convert the data to class phyDat. The generic function \code{c} can be used to to combine sequences and \code{unique} to get all unique sequences or unique haplotypes. \code{acgt2ry} converts a \code{phyDat} object of nucleotides into an binary ry-coded dataset. } \examples{ data(Laurasiatherian) class(Laurasiatherian) Laurasiatherian # base frequencies baseFreq(Laurasiatherian) baseFreq(Laurasiatherian, all=TRUE) baseFreq(Laurasiatherian, freq=TRUE) # subsetting phyDat objects # the first 5 sequences subset(Laurasiatherian, subset=1:5) # the first 5 characters subset(Laurasiatherian, select=1:5, site.pattern = FALSE) # the first 5 site patterns (often more than 5 characters) subset(Laurasiatherian, select=1:5, site.pattern = TRUE) # transform into old ape format LauraChar <- as.character(Laurasiatherian) # and back Laura <- phyDat(LauraChar) all.equal(Laurasiatherian, Laura) # Compute all possible site patterns # for nucleotides there $4 ^ (number of tips)$ patterns allSitePattern(5) } \seealso{ \code{\link{DNAbin}}, \code{\link{as.DNAbin}}, \code{\link{read.dna}}, \code{\link{read.aa}}, \code{\link{read.nexus.data}} and the chapter 1 in the \code{vignette("phangorn-specials", package="phangorn")} and the example of \code{\link{pmlMix}} for the use of \code{allSitePattern} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/bab.Rd0000644000176200001440000000400313475602650013661 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fitch.R \name{bab} \alias{bab} \alias{BranchAndBound} \title{Branch and bound for finding all most parsimonious trees} \usage{ bab(data, tree = NULL, trace = 1, ...) } \arguments{ \item{data}{an object of class phyDat.} \item{tree}{a phylogenetic tree an object of class phylo, otherwise a pratchet search is performed.} \item{trace}{defines how much information is printed during optimisation.} \item{\dots}{Further arguments passed to or from other methods} } \value{ \code{bab} returns all most parsimonious trees in an object of class \code{multiPhylo}. } \description{ \code{bab} finds all most parsimonious trees. } \details{ This implementation is very slow and depending on the data may take very long time. In the worst case all (2n-5)!! possible trees have to be examined. For 10 species there are already 2027025 tip-labelled unrooted trees. It only uses some basic strategies to find a lower and upper bounds similar to penny from phylip. It uses a very basic heuristic approach of MinMax Squeeze (Holland et al. 2005) to improve the lower bound. On the positive side \code{bab} is not like many other implementations restricted to binary or nucleotide data. } \examples{ data(yeast) dfactorial(11) # choose only the first two genes gene12 <- subset(yeast, , 1:3158, site.pattern=FALSE) trees <- bab(gene12) } \references{ Hendy, M.D. and Penny D. (1982) Branch and bound algorithms to determine minimal evolutionary trees. \emph{Math. Biosc.} \bold{59}, 277-290 Holland, B.R., Huber, K.T. Penny, D. and Moulton, V. (2005) The MinMax Squeeze: Guaranteeing a Minimal Tree for Population Data, \emph{Molecular Biology and Evolution}, \bold{22}, 235--242 White, W.T. and Holland, B.R. (2011) Faster exact maximum parsimony search with XMP. \emph{Bioinformatics}, \bold{27(10)},1359--1367 } \seealso{ \code{\link{pratchet}}, \code{\link{dfactorial}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} based on work on Liam Revell } \keyword{cluster} phangorn/man/phangorn-internal.Rd0000644000176200001440000000077613475602650016600 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/RcppExports.R, R/networx.R, % R/phangorn-package.R, R/phyDat.R, R/pmlPen.R \name{threshStateC} \alias{threshStateC} \alias{coords} \alias{phangorn-internal} \alias{map_duplicates} \alias{pmlPen} \title{Internal phangorn Functions} \usage{ threshStateC(x, thresholds) coords(obj, dim = "3D") map_duplicates(x, dist = TRUE, ...) pmlPen(object, lambda, ...) } \description{ Internal \pkg{phangorn} functions. } \keyword{internal} phangorn/man/designTree.Rd0000644000176200001440000000422713475602650015236 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distTree.R \name{designTree} \alias{designTree} \alias{nnls.tree} \alias{nnls.phylo} \alias{nnls.splits} \alias{nnls.networx} \alias{designSplits} \title{Compute a design matrix or non-negative LS} \usage{ designTree(tree, method = "unrooted", sparse = FALSE, ...) nnls.tree(dm, tree, rooted = FALSE, trace = 1, weight = NULL, balanced = FALSE) nnls.phylo(x, dm, rooted = FALSE, trace = 0, ...) nnls.splits(x, dm, trace = 0) nnls.networx(x, dm) designSplits(x, splits = "all", ...) } \arguments{ \item{tree}{an object of class \code{phylo}} \item{method}{design matrix for an "unrooted" or "rooted" ultrametric tree.} \item{sparse}{return a sparse design matrix.} \item{\dots}{further arguments, passed to other methods.} \item{dm}{a distance matrix.} \item{rooted}{compute a "rooted" or "unrooted" tree.} \item{trace}{defines how much information is printed during optimisation.} \item{weight}{vector of weights to be used in the fitting process. Weighted least squares is used with weights w, i.e., sum(w * e^2) is minimized.} \item{balanced}{use weights as in balanced fastME} \item{x}{number of taxa.} \item{splits}{one of "all", "star".} } \value{ \code{nnls.tree} return a tree, i.e. an object of class \code{phylo}. \code{designTree} and \code{designSplits} a matrix, possibly sparse. } \description{ \code{nnls.tree} estimates the branch length using non-negative least squares given a tree and a distance matrix. \code{designTree} and \code{designSplits} compute design matrices for the estimation of edge length of (phylogenetic) trees using linear models. For larger trees a sparse design matrix can save a lot of memory. %\code{designTree} also computes a contrast matrix if the method is "rooted". } \examples{ example(NJ) dm <- as.matrix(dm) y <- dm[lower.tri(dm)] X <- designTree(tree) lm(y~X-1) # avoids negative edge weights tree2 <- nnls.tree(dm, tree) } \seealso{ \code{\link[ape]{fastme}}, \code{\link[phangorn]{distanceHadamard}}, \code{\link[phangorn]{splitsNetwork}}, \code{\link[phangorn]{upgma}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/densiTree.Rd0000644000176200001440000001021213475602650015056 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Densi.R \name{densiTree} \alias{densiTree} \title{Plots a densiTree.} \usage{ densiTree(x, type = "cladogram", alpha = 1/length(x), consensus = NULL, direction = "rightwards", optim = FALSE, scaleX = FALSE, col = 1, width = 1, lty = 1, cex = 0.8, font = 3, tip.color = 1, adj = 0, srt = 0, underscore = FALSE, label.offset = 0, scale.bar = TRUE, jitter = list(amount = 0, random = TRUE), ...) } \arguments{ \item{x}{an object of class \code{multiPhylo}.} \item{type}{a character string specifying the type of phylogeny, so far "cladogram" (default) or "phylogram" are supported.} \item{alpha}{parameter for semi-transparent colors.} \item{consensus}{A tree or character vector which is used to define the order of the tip labels.} \item{direction}{a character string specifying the direction of the tree. Four values are possible: "rightwards" (the default), "leftwards", "upwards", and "downwards".} \item{optim}{not yet used.} \item{scaleX}{scale trees to have identical heights.} \item{col}{a skalar or vector giving the colours used to draw the edges for each plotted phylogeny. These are taken to be in the same order than input trees x. If fewer colours are given than the number of trees, then the colours are recycled.} \item{width}{edge width.} \item{lty}{line type.} \item{cex}{a numeric value giving the factor scaling of the tip labels.} \item{font}{an integer specifying the type of font for the labels: 1 (plain text), 2 (bold), 3 (italic, the default), or 4 (bold italic).} \item{tip.color}{color of the tip labels.} \item{adj}{a numeric specifying the justification of the text strings of the labels: 0 (left-justification), 0.5 (centering), or 1 (right-justification).} \item{srt}{a numeric giving how much the labels are rotated in degrees.} \item{underscore}{a logical specifying whether the underscores in tip labels should be written as spaces (the default) or left as are (if TRUE).} \item{label.offset}{a numeric giving the space between the nodes and the tips of the phylogeny and their corresponding labels.} \item{scale.bar}{a logical specifying whether add scale.bar to the plot.} \item{jitter}{allows to shift treees. a list with two arguments: the amount of jitter and random or equally spaced (see details below)} \item{\dots}{further arguments to be passed to plot.} } \description{ An R function to plot trees similar to those produced by DensiTree. } \details{ If no consensus tree is provided \code{densiTree} computes a consensus tree, and if the input trees have different labels a mrp.supertree as a backbone. This should avoid too many unnecessary crossings of edges. Trees should be rooted, other wise the output may not be visually pleasing. \code{jitter} shifts trees a bit so that they are not exactly on top of each other. If \code{amount == 0}, it is ignored. If \code{random=TRUE} the result of the perputation is \code{runif(n, -amount, amount)}, otherwise \code{seq(-amount, amount, length=n)}, where \code{n <- length(x)}. } \examples{ data(Laurasiatherian) set.seed(1) bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x) upgma(dist.hamming(x)), bs=25) # cladogram nice to show topological differences densiTree(bs, type="cladogram", col="blue") densiTree(bs, type="phylogram", col="green", direction="downwards", width=2) # plot five trees slightly shifted, no transparent color densiTree(bs[1:5], type="phylogram", col=1:5, width=2, jitter= list(amount=.3, random=FALSE), alpha=1) \dontrun{ # phylograms are nice to show different age estimates require(PhyloOrchard) data(BinindaEmondsEtAl2007) BinindaEmondsEtAl2007 <- .compressTipLabel(BinindaEmondsEtAl2007) densiTree(BinindaEmondsEtAl2007, type="phylogram", col="red") } } \references{ densiTree is inspired from the great \href{https://www.cs.auckland.ac.nz/~remco/DensiTree}{DensiTree} program of Remco Bouckaert. Remco R. Bouckaert (2010) DensiTree: making sense of sets of phylogenetic trees \emph{Bioinformatics}, \bold{26 (10)}, 1372-1373. } \seealso{ \code{\link{plot.phylo}}, \code{\link{plot.networx}}, \code{\link{jitter}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{plot} phangorn/man/plot.networx.Rd0000644000176200001440000000741013475602650015625 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/networx.R \name{plot.networx} \alias{plot.networx} \title{plot phylogenetic networks} \usage{ \method{plot}{networx}(x, type = "3D", use.edge.length = TRUE, show.tip.label = TRUE, show.edge.label = FALSE, edge.label = NULL, show.node.label = FALSE, node.label = NULL, show.nodes = FALSE, tip.color = "black", edge.color = "black", edge.width = 3, edge.lty = 1, split.color = NULL, split.width = NULL, split.lty = NULL, font = 3, cex = par("cex"), cex.node.label = cex, cex.edge.label = cex, col.node.label = tip.color, col.edge.label = tip.color, font.node.label = font, font.edge.label = font, ...) } \arguments{ \item{x}{an object of class \code{"networx"}} \item{type}{"3D" to plot using rgl or "2D" in the normal device.} \item{use.edge.length}{a logical indicating whether to use the edge weights of the network to draw the branches (the default) or not.} \item{show.tip.label}{a logical indicating whether to show the tip labels on the graph (defaults to \code{TRUE}, i.e. the labels are shown).} \item{show.edge.label}{a logical indicating whether to show the tip labels on the graph.} \item{edge.label}{an additional vector of edge labels (normally not needed).} \item{show.node.label}{a logical indicating whether to show the node labels (see example).} \item{node.label}{an additional vector of node labels (normally not needed).} \item{show.nodes}{a logical indicating whether to show the nodes (see example).} \item{tip.color}{the colors used for the tip labels.} \item{edge.color}{the colors used to draw edges.} \item{edge.width}{the width used to draw edges.} \item{edge.lty}{a vector of line types.} \item{split.color}{the colors used to draw edges.} \item{split.width}{the width used to draw edges.} \item{split.lty}{a vector of line types.} \item{font}{an integer specifying the type of font for the labels: 1 (plain text), 2 (bold), 3 (italic, the default), or 4 (bold italic).} \item{cex}{a numeric value giving the factor scaling of the labels.} \item{cex.node.label}{a numeric value giving the factor scaling of the node labels.} \item{cex.edge.label}{a numeric value giving the factor scaling of the edge labels.} \item{col.node.label}{the colors used for the node labels.} \item{col.edge.label}{the colors used for the edge labels.} \item{font.node.label}{the font used for the node labels.} \item{font.edge.label}{the font used for the edge labels.} \item{\dots}{Further arguments passed to or from other methods.} } \description{ So far not all parameters behave the same on the the \code{rgl} \code{"3D"} and basic graphic \code{"2D"} device. } \details{ Often it is easier and safer to supply vectors of graphical parameters for splits (e.g. splits.color) than for edges. These overwrite values edge.color. } \note{ The internal representation is likely to change. } \examples{ set.seed(1) tree1 <- rtree(20, rooted=FALSE) sp <- as.splits(rNNI(tree1, n=10)) net <- as.networx(sp) plot(net, "2D") \dontrun{ # also see example in consensusNet example(consensusNet) } } \references{ Dress, A.W.M. and Huson, D.H. (2004) Constructing Splits Graphs \emph{IEEE/ACM Transactions on Computational Biology and Bioinformatics (TCBB)}, \bold{1(3)}, 109--115 Schliep, K., Potts, A. J., Morrison, D. A. and Grimm, G. W. (2017), Intertwining phylogenetic trees and networks. \emph{Methods Ecol Evol}. \bold{8}, 1212--1220. doi:10.1111/2041-210X.12760 } \seealso{ \code{\link{consensusNet}}, \code{\link{neighborNet}}, \code{\link{splitsNetwork}}, \code{\link{hadamard}}, \code{\link{distanceHadamard}}, \code{\link{as.networx}}, \code{\link[ape]{evonet}}, \code{\link[ape]{as.phylo}}, \code{\link{densiTree}}, \code{\link[ape]{nodelabels}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{plot} phangorn/man/nni.Rd0000644000176200001440000000225613475602650013731 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treeRearrangement.R \name{nni} \alias{nni} \alias{rNNI} \alias{rSPR} \title{Tree rearrangements.} \usage{ nni(tree) rNNI(tree, moves = 1, n = length(moves)) rSPR(tree, moves = 1, n = length(moves), k = NULL) } \arguments{ \item{tree}{A phylogenetic \code{tree}, object of class \code{phylo}.} \item{moves}{Number of tree rearrangements to be transformed on a tree. Can be a vector} \item{n}{Number of trees to be simulated.} \item{k}{If defined just SPR of distance k are performed.} } \value{ an object of class multiPhylo. } \description{ \code{nni} returns a list of all trees which are one nearest neighbor interchange away. \code{rNNI} and \code{rSPR} are two methods which simulate random trees which are a specified number of rearrangement apart from the input tree. Both methods assume that the input tree is bifurcating. These methods may be useful in simulation studies. } \examples{ tree <- rtree(20, rooted = FALSE) trees1 <- nni(tree) trees2 <- rSPR(tree, 2, 10) } \seealso{ \code{\link{allTrees}}, \code{\link{SPR.dist}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/hadamard.Rd0000644000176200001440000000472713475602650014713 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hadamard.R \name{hadamard} \alias{hadamard} \alias{fhm} \alias{h4st} \alias{h2st} \title{Hadamard Matrices and Fast Hadamard Multiplication} \usage{ hadamard(x) fhm(v) h4st(obj, levels = c("a", "c", "g", "t")) h2st(obj, eps = 0.001) } \arguments{ \item{x}{a vector of length \eqn{2^n}, where n is an integer.} \item{v}{a vector of length \eqn{2^n}, where n is an integer.} \item{obj}{a data.frame or character matrix, typical a sequence alignment.} \item{levels}{levels of the sequences.} \item{eps}{Threshold value for splits.} } \value{ \code{hadamard} returns a Hadamard matrix. \code{fhm} returns the fast Hadamard multiplication. } \description{ A collection of functions to perform Hadamard conjugation. %Hv of a Hadamard matrix H with a vector v using fast Hadamard multiplication. } \details{ \code{h2st} and \code{h4st} perform Hadamard conjugation for 2-state (binary, RY-coded) or 4-state (DNA/RNA) data. \code{write.nexus.splits} writes splits returned from \code{h2st} or \code{\link[phangorn]{distanceHadamard}} to a nexus file, which can be processed by Spectronet or Splitstree. } \examples{ H <- hadamard(3) v <- 1:8 H \%*\% v fhm(v) data(yeast) # RY-coding dat_ry <- acgt2ry(yeast) fit2 <- h2st(dat_ry) lento(fit2) # write.nexus.splits(fit2, file = "test.nxs") # read this file into Spectronet or Splitstree to show the network \dontrun{ dat <- as.character(yeast) dat4 <- phyDat(dat, type="USER", levels=c("a","c", "g", "t"), ambiguity=NULL) fit4 <- h4st(dat4) par(mfrow=c(3,1)) lento(fit4[[1]], main="Transversion") lento(fit4[[2]], main="Transition 1") lento(fit4[[3]], main="Transition 2") } } \references{ Hendy, M.D. (1989). The relationship between simple evolutionary tree models and observable sequence data. \emph{Systematic Zoology}, \bold{38} 310--321. Hendy, M. D. and Penny, D. (1993). Spectral Analysis of Phylogenetic Data. \emph{Journal of Classification}, \bold{10}, 5--24. Hendy, M. D. (2005). Hadamard conjugation: an analytical tool for phylogenetics. In O. Gascuel, editor, \emph{Mathematics of evolution and phylogeny}, Oxford University Press, Oxford Waddell P. J. (1995). Statistical methods of phylogenetic analysis: Including hadamard conjugation, LogDet transforms, and maximum likelihood. \emph{PhD thesis}. } \seealso{ \code{\link{distanceHadamard}}, \code{\link{lento}}, \code{\link{plot.networx}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/dist.hamming.Rd0000644000176200001440000000531713475602650015530 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distSeq.R \name{dist.hamming} \alias{dist.hamming} \alias{dist.ml} \alias{dist.logDet} \title{Pairwise Distances from Sequences} \usage{ dist.hamming(x, ratio = TRUE, exclude = "none") dist.ml(x, model = "JC69", exclude = "none", bf = NULL, Q = NULL, k = 1L, shape = 1, ...) dist.logDet(x) } \arguments{ \item{x}{An object of class \code{phyDat}} \item{ratio}{Compute uncorrected ('p') distance or character difference.} \item{exclude}{One of "none", "all", "pairwise" indicating whether to delete the sites with missing data (or ambiguous states). The default is handle missing data as in pml.} \item{model}{One of "JC69", "F81" or one of 17 amino acid models see details.} \item{bf}{A vector of base frequencies.} \item{Q}{A vector containing the lower triangular part of the rate matrix.} \item{k}{Number of intervals of the discrete gamma distribution.} \item{shape}{Shape parameter of the gamma distribution.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ an object of class \code{dist} } \description{ \code{dist.hamming}, \code{dist.ml} and \code{dist.logDet} compute pairwise distances for an object of class \code{phyDat}. \code{dist.ml} uses DNA / AA sequences to compute distances under different substitution models. } \details{ So far 17 amino acid models are supported ("WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", "FLU", "Blossum62", "Dayhoff_DCMut" and "JTT_DCMut") and additional rate matrices and frequencies can be supplied. The "F81" model uses empirical base frequencies, the "JC69" equal base frequencies. This is even the case if the data are not nucleotides. } \examples{ data(Laurasiatherian) dm1 <- dist.hamming(Laurasiatherian) tree1 <- NJ(dm1) dm2 <- dist.logDet(Laurasiatherian) tree2 <- NJ(dm2) treedist(tree1,tree2) # JC model dm3 <- dist.ml(Laurasiatherian) tree3 <- NJ(dm3) treedist(tree1,tree3) # F81 + Gamma dm4 <- dist.ml(Laurasiatherian, model="F81", k=4, shape=.4) tree4 <- NJ(dm4) treedist(tree1,tree4) treedist(tree3,tree4) } \references{ Lockhart, P. J., Steel, M. A., Hendy, M. D. and Penny, D. (1994) Recovering evolutionary trees under a more realistic model of sequence evolution. \emph{Molecular Biology and Evolution}, \bold{11}, 605--602. Jukes TH and Cantor CR (1969). \emph{Evolution of Protein Molecules}. New York: Academic Press. 21--132. } \seealso{ For more distance methods for nucleotide data see \code{\link[ape]{dist.dna}} and \code{\link{dist.p}} for pairwise polymorphism p-distances. \code{\link{writeDist}} for export and import distances. } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/allTrees.Rd0000644000176200001440000000141513475602650014714 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treeManipulation.R \name{allTrees} \alias{allTrees} \title{Compute all trees topologies.} \usage{ allTrees(n, rooted = FALSE, tip.label = NULL) } \arguments{ \item{n}{Number of tips (<=10).} \item{rooted}{Rooted or unrooted trees (default: rooted).} \item{tip.label}{Tip labels.} } \value{ an object of class \code{multiPhylo}. } \description{ \code{allTrees} computes all tree topologies for rooted or unrooted trees with up to 10 tips. \code{allTrees} returns bifurcating trees. } \examples{ trees <- allTrees(5) par(mfrow = c(3,5)) for(i in 1:15)plot(trees[[i]]) } \seealso{ \code{\link[ape]{rtree}}, \code{\link{nni}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/parsimony.Rd0000644000176200001440000000723513475602650015170 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ancestral_pml.R, R/fitch.R, R/parsimony.R \name{acctran} \alias{acctran} \alias{fitch} \alias{random.addition} \alias{parsimony} \alias{sankoff} \alias{optim.parsimony} \alias{pratchet} \title{Parsimony tree.} \usage{ acctran(tree, data) fitch(tree, data, site = "pscore") random.addition(data, method = "fitch") parsimony(tree, data, method = "fitch", ...) sankoff(tree, data, cost = NULL, site = "pscore") optim.parsimony(tree, data, method = "fitch", cost = NULL, trace = 1, rearrangements = "SPR", ...) pratchet(data, start = NULL, method = "fitch", maxit = 1000, minit = 10, k = 10, trace = 1, all = FALSE, rearrangements = "SPR", perturbation = "ratchet", ...) } \arguments{ \item{tree}{tree to start the nni search from.} \item{data}{A object of class phyDat containing sequences.} \item{site}{return either 'pscore' or 'site' wise parsimony scores.} \item{method}{one of 'fitch' or 'sankoff'.} \item{...}{Further arguments passed to or from other methods (e.g. model="sankoff" and cost matrix).} \item{cost}{A cost matrix for the transitions between two states.} \item{trace}{defines how much information is printed during optimisation.} \item{rearrangements}{SPR or NNI rearrangements.} \item{start}{a starting tree can be supplied.} \item{maxit}{maximum number of iterations in the ratchet.} \item{minit}{minimum number of iterations in the ratchet.} \item{k}{number of rounds ratchet is stopped, when there is no improvement.} \item{all}{return all equally good trees or just one of them.} \item{perturbation}{whether to use "ratchet", "random_addition" or "stochastic" (nni) for shuffling the tree.} } \value{ \code{parsimony} returns the maximum parsimony score (pscore). \code{optim.parsimony} returns a tree after NNI rearrangements. \code{pratchet} returns a tree or list of trees containing the best tree(s) found during the search. \code{acctran} returns a tree with edge length according to the ACCTRAN criterion. } \description{ \code{parsimony} returns the parsimony score of a tree using either the sankoff or the fitch algorithm. \code{optim.parsimony} tries to find the maximum parsimony tree using either Nearest Neighbor Interchange (NNI) rearrangements or sub tree pruning and regrafting (SPR). \code{pratchet} implements the parsimony ratchet (Nixon, 1999) and is the preferred way to search for the best tree. \code{random.addition} can be used to produce starting trees. } \details{ The "SPR" rearrangements are so far only available for the "fitch" method, "sankoff" only uses "NNI". The "fitch" algorithm only works correct for binary trees. } \examples{ set.seed(3) data(Laurasiatherian) dm <- dist.hamming(Laurasiatherian) tree <- NJ(dm) parsimony(tree, Laurasiatherian) treeRA <- random.addition(Laurasiatherian) treeNNI <- optim.parsimony(tree, Laurasiatherian) treeRatchet <- pratchet(Laurasiatherian, start=tree, maxit=100, minit=5, k=5, trace=0) # assign edge length treeRatchet <- acctran(treeRatchet, Laurasiatherian) plot(midpoint(treeRatchet)) add.scale.bar(0,0, length=100) parsimony(c(tree,treeNNI, treeRatchet), Laurasiatherian) } \references{ Felsenstein, J. (2004). \emph{Inferring Phylogenies}. Sinauer Associates, Sunderland. Nixon, K. (1999) The Parsimony Ratchet, a New Method for Rapid Parsimony Analysis. \emph{Cladistics} \bold{15}, 407-414 } \seealso{ \code{\link{bab}}, \code{\link{CI}}, \code{\link{RI}}, \code{\link{ancestral.pml}}, \code{\link{nni}}, \code{\link{NJ}}, \code{\link{pml}}, \code{\link{getClans}} ,\code{\link{ancestral.pars}}, \code{\link{bootstrap.pml}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/delta.score.Rd0000644000176200001440000000216413475602650015346 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/delta.score.R \name{delta.score} \alias{delta.score} \title{Computes the \eqn{\delta} score} \usage{ delta.score(x, arg = "mean", ...) } \arguments{ \item{x}{an object of class \code{phyDat}} \item{arg}{Specifies the return value, one of "all", "mean" or "sd"} \item{...}{further arguments passed through \code{dist.hamming}} } \value{ A vector containing the \eqn{\delta} scores. } \description{ Computes the treelikeness } \examples{ data(yeast) hist(delta.score(yeast, "all")) } \references{ BR Holland, KT Huber, A Dress, V Moulton (2002) \eqn{\delta} Plots: a tool for analyzing phylogenetic distance data Russell D. Gray, David Bryant, Simon J. Greenhill (2010) On the shape and fabric of human history \emph{Molecular Biology and Evolution}, \bold{19(12)} 2051--2059 Russell D. Gray, David Bryant, Simon J. Greenhill (2010) On the shape and fabric of human history \emph{Phil. Trans. R. Soc. B}, \bold{365} 3923--3933; DOI: 10.1098/rstb.2010.0162 } \seealso{ \code{\link{dist.hamming}} } \author{ Alastair Potts and Klaus Schliep } \keyword{cluster} phangorn/man/codonTest.Rd0000644000176200001440000000573613475602650015115 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/codonTest.R \name{codonTest} \alias{codonTest} \title{codonTest} \usage{ codonTest(tree, object, model = c("M0", "M1a", "M2a"), frequencies = "F3x4", opt_freq = FALSE, codonstart = 1, control = pml.control(maxit = 20), ...) } \arguments{ \item{tree}{a phylogenetic tree.} \item{object}{an object of class phyDat.} \item{model}{a vector containing the substitution models to compare with each other or "all" to test all available models.} \item{frequencies}{a character string or vector defining how to compute the codon frequencies} \item{opt_freq}{optimize frequencies (so far ignored)} \item{codonstart}{an integer giving where to start the translation. This should be 1, 2, or 3, but larger values are accepted and have for effect to start the translation further within the sequence.} \item{control}{a list of parameters for controlling the fitting process.} \item{...}{further arguments passed to or from other methods.} } \value{ A list whith an element called summary containing a data.frame with the log-likelihood, number of estimated parameters, etc. of all tested models. An object called posterior which contains the posterior probability for the rate class for each sites and the estimates of the defined models. } \description{ Models for detecting positive selection } \details{ \code{codonTest} allows to test for positive selection similar to programs like PAML (Yang ) or HyPhy (Kosakovsky Pond et al. 2005). There are several options for deriving the codon frequencies. Frequencies can be "equal" (1/61), derived from nucleotide frequencies "F1x4" and "F3x4" or "empirical" codon frequencies. The frequencies taken using the empirical frequencies or estimated via maximum likelihood. So far the M0 model (Goldman and Yang 2002), M1a and M2a are implemented. The M0 model is always computed the other are optional. The convergence may be very slow and sometimes fails. } \examples{ \dontrun{ # load woodmouse data from ape data(woodmouse) dat_codon <- dna2codon(as.phyDat(woodmouse)) tree <- NJ(dist.ml(dat_codon)) # optimise the model the old way fit <- pml(tree, dat_codon, bf="F3x4") M0 <- optim.pml(fit, model="codon1") # Now using the codonTest function fit_codon <- codonTest(tree, dat_codon) fit_codon plot(fit_codon, "M1a") } } \references{ Ziheng Yang (2014). \emph{Molecular Evolution: A Statistical Approach}. Oxford University Press, Oxford Sergei L. Kosakovsky Pond, Simon D. W. Frost, Spencer V. Muse (2005) HyPhy: hypothesis testing using phylogenies, \emph{Bioinformatics}, \bold{21(5)}: 676--679, https://doi.org/10.1093/bioinformatics/bti079 Nielsen, R., and Z. Yang. (1998) Likelihood models for detecting positively selected amino acid sites and applications to the HIV-1 envelope gene. \emph{Genetics}, \bold{148}: 929--936 } \seealso{ \code{\link{pml}}, \code{\link{pmlMix}}, \code{\link{modelTest}}, \code{\link[stats]{AIC}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/distanceHadamard.Rd0000644000176200001440000000204613475602650016356 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hadamard.R \name{distanceHadamard} \alias{distanceHadamard} \title{Distance Hadamard} \usage{ distanceHadamard(dm, eps = 0.001) } \arguments{ \item{dm}{A distance matrix.} \item{eps}{Threshold value for splits.} } \value{ \code{distanceHadamard} returns a matrix. The first column contains the distance spectra, the second one the edge-spectra. If eps is positive an object of with all splits greater eps is returned. } \description{ Distance Hadamard produces spectra of splits from a distance matrix. } \examples{ data(yeast) dm <- dist.hamming(yeast) dm <- as.matrix(dm) fit <- distanceHadamard(dm) lento(fit) plot(as.networx(fit), "2D") } \references{ Hendy, M. D. and Penny, D. (1993). Spectral Analysis of Phylogenetic Data. \emph{Journal of Classification}, \bold{10}, 5-24. } \seealso{ \code{\link{hadamard}}, \code{\link{lento}}, \code{\link{plot.networx}}, \code{\link{neighborNet}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com}, Tim White } \keyword{cluster} phangorn/man/consensusNet.Rd0000644000176200001440000000352413475602650015633 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/networx.R \name{consensusNet} \alias{consensusNet} \title{Computes a consensusNetwork from a list of trees Computes a \code{networx} object from a collection of splits.} \usage{ consensusNet(obj, prob = 0.3, ...) } \arguments{ \item{obj}{An object of class multiPhylo.} \item{prob}{the proportion a split has to be present in all trees to be represented in the network.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ \code{consensusNet} returns an object of class networx. This is just an intermediate to plot phylogenetic networks with igraph. } \description{ Computes a consensusNetwork, i.e. an object of class \code{networx} from a list of trees, i.e. an class of class \code{multiPhylo}. Computes a \code{networx} object from a collection of splits. } \examples{ data(Laurasiatherian) set.seed(1) bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x)nj(dist.hamming(x)), bs=50) cnet <- consensusNet(bs, .3) plot(cnet, "2D") \dontrun{ library(rgl) open3d() plot(cnet, show.tip.label=FALSE, show.nodes=TRUE) plot(cnet, type = "2D", show.edge.label=TRUE) tmpfile <- normalizePath(system.file("extdata/trees/RAxML_bootstrap.woodmouse", package="phangorn")) trees <- read.tree(tmpfile) cnet_woodmouse <- consensusNet(trees, .3) plot(cnet_woodmouse, type = "2D", show.edge.label=TRUE) } } \references{ Holland B.R., Huber K.T., Moulton V., Lockhart P.J. (2004) Using consensus networks to visualize contradictory evidence for species phylogeny. \emph{Molecular Biology and Evolution}, \bold{21}, 1459--61 } \seealso{ \code{\link{splitsNetwork}}, \code{\link{neighborNet}}, \code{\link{lento}}, \code{\link{distanceHadamard}}, \code{\link{plot.networx}}, \code{\link{maxCladeCred}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{hplot} phangorn/man/superTree.Rd0000644000176200001440000000441713475602650015124 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/superTree.R \name{superTree} \alias{superTree} \title{Super Tree methods} \usage{ superTree(tree, method = "MRP", rooted = FALSE, trace = 0, start = NULL, multicore = FALSE, mc.cores = NULL, ...) } \arguments{ \item{tree}{an object of class \code{multiPhylo}} \item{method}{An argument defining which algorithm is used to optimize the tree. Possible are "MRP", "NNI", and "SPR".} \item{rooted}{should the resulting supertrees be rooted.} \item{trace}{defines how much information is printed during optimization.} \item{start}{a starting tree can be supplied.} \item{multicore}{logical, whether models should estimated in parallel.} \item{mc.cores}{The number of cores to use, i.e. at most how many child processes will be run simultaneously.} \item{\dots}{further arguments passed to or from other methods.} } \value{ The function returns an object of class \code{phylo}. } \description{ These function \code{superTree} allows the estimation of a supertree from a set of trees using either Matrix representation parsimony, Robinson-Foulds or SPR as criterion. } \details{ The function \code{superTree} extends the function mrp.supertree from Liam Revells, with artificial adding an outgroup on the root of the trees. This allows to root the supertree afterwards. The functions is internally used in DensiTree. The implementation for the RF- and SPR-supertree are very basic so far and assume that all trees share the same set of taxa. } \examples{ data(Laurasiatherian) set.seed(1) bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x)upgma(dist.hamming(x)), bs=50) mrp_st <- superTree(bs) plot(mrp_st) \dontrun{ rf_st <- superTree(bs, method = "RF") spr_st <- superTree(bs, method = "SPR") } } \references{ Baum, B. R., (1992) Combining trees as a way of combining data sets for phylogenetic inference, and the desirability of combining gene trees. \emph{Taxon}, \bold{41}, 3-10. Ragan, M. A. (1992) Phylogenetic inference based on matrix representation of trees. \emph{Molecular Phylogenetics and Evolution}, \bold{1}, 53-58. } \seealso{ \code{mrp.supertree}, \code{\link{densiTree}}, \code{\link{RF.dist}}, \code{\link{SPR.dist}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} Liam Revell } \keyword{cluster} phangorn/man/upgma.Rd0000644000176200001440000000201113475602650014243 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distTree.R \name{upgma} \alias{upgma} \alias{wpgma} \title{UPGMA and WPGMA} \usage{ upgma(D, method = "average", ...) wpgma(D, method = "mcquitty", ...) } \arguments{ \item{D}{A distance matrix.} \item{method}{The agglomeration method to be used. This should be (an unambiguous abbreviation of) one of "ward", "single", "complete", "average", "mcquitty", "median" or "centroid". The default is "average".} \item{\dots}{Further arguments passed to or from other methods.} } \value{ A phylogenetic tree of class \code{phylo}. } \description{ UPGMA and WPGMA clustering. Just a wrapper function around \code{\link[stats]{hclust}}. } \examples{ data(Laurasiatherian) dm <- dist.ml(Laurasiatherian) tree <- upgma(dm) plot(tree) } \seealso{ \code{\link{hclust}}, \code{\link{dist.hamming}}, \code{\link{NJ}}, \code{\link{as.phylo}}, \code{\link{fastme}}, \code{\link{nnls.tree}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/SH.test.Rd0000644000176200001440000000336613475602650014440 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/SH.R \name{SH.test} \alias{SH.test} \title{Shimodaira-Hasegawa Test} \usage{ SH.test(..., B = 10000, data = NULL, weight = NULL) } \arguments{ \item{...}{either a series of objects of class \code{"pml"} separated by commas, a list containing such objects or an object of class \code{"pmlPart"} or a matrix containing the site-wise likelihoods in columns.} \item{B}{the number of bootstrap replicates.} \item{data}{an object of class \code{"phyDat"}.} \item{weight}{if a matrix with site (log-)likelihoods is is supplied an optional vector containing the number of occurances of each site pattern.} } \value{ a numeric vector with the P-value associated with each tree given in \code{...}. } \description{ This function computes the Shimodaira--Hasegawa test for a set of trees. } \examples{ data(Laurasiatherian) dm <- dist.logDet(Laurasiatherian) tree1 <- NJ(dm) tree2 <- unroot(upgma(dm)) fit1 <- pml(tree1, Laurasiatherian) fit2 <- pml(tree2, Laurasiatherian) fit1 <- optim.pml(fit1) # optimize edge weights fit2 <- optim.pml(fit2) # with pml objects as input SH.test(fit1, fit2, B=1000) # in real analysis use larger B, e.g. 10000 # with matrix as input X <- matrix(c(fit1$siteLik, fit2$siteLik), ncol=2) SH.test(X, weight=attr(Laurasiatherian, "weight"), B=1000) \dontrun{ example(pmlPart) SH.test(sp, B=1000) } } \references{ Shimodaira, H. and Hasegawa, M. (1999) Multiple comparisons of log-likelihoods with applications to phylogenetic inference. \emph{Molecular Biology and Evolution}, \bold{16}, 1114--1116. } \seealso{ \code{\link{pml}}, \code{\link{pmlPart}}, \code{\link{pmlCluster}}, \code{\link{SOWH.test}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{models} phangorn/man/lento.Rd0000644000176200001440000000257413475602650014271 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/lento.R \name{lento} \alias{lento} \title{Lento plot} \usage{ lento(obj, xlim = NULL, ylim = NULL, main = "Lento plot", sub = NULL, xlab = NULL, ylab = NULL, bipart = TRUE, trivial = FALSE, col = rgb(0, 0, 0, 0.5), ...) } \arguments{ \item{obj}{an object of class phylo, multiPhylo or splits} \item{xlim}{graphical parameter} \item{ylim}{graphical parameter} \item{main}{graphical parameter} \item{sub}{graphical parameter} \item{xlab}{graphical parameter} \item{ylab}{graphical parameter} \item{bipart}{plot bipartition information.} \item{trivial}{logical, whether to present trivial splits (default is FALSE).} \item{col}{color for the splits / bipartition.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ lento returns a plot. } \description{ The lento plot represents support and conflict of splits/bipartitions. } \examples{ data(yeast) yeast.ry <- acgt2ry(yeast) splits.h <- h2st(yeast.ry) lento(splits.h, trivial=TRUE) } \references{ Lento, G.M., Hickson, R.E., Chambers G.K., and Penny, D. (1995) Use of spectral analysis to test hypotheses on the origin of pinninpeds. \emph{Molecular Biology and Evolution}, \bold{12}, 28-52. } \seealso{ \code{\link{as.splits}, \link{hadamard}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} \keyword{plot} phangorn/man/pmlMix.Rd0000644000176200001440000000560313475602650014412 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pmlMix.R \name{pmlMix} \alias{pmlMix} \title{Phylogenetic mixture model} \usage{ pmlMix(formula, fit, m = 2, omega = rep(1/m, m), control = pml.control(epsilon = 1e-08, maxit = 20, trace = 1), ...) } \arguments{ \item{formula}{a formula object (see details).} \item{fit}{an object of class \code{pml}.} \item{m}{number of mixtures.} \item{omega}{mixing weights.} \item{control}{A list of parameters for controlling the fitting process.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ \code{pmlMix} returns a list with elements \item{logLik}{log-likelihood of the fit} \item{omega}{mixing weights.} \item{fits}{fits for the final mixtures.} } \description{ Phylogenetic mixture model. } \details{ The \code{formula} object allows to specify which parameter get optimized. The formula is generally of the form \code{edge + bf + Q ~ rate + shape + \dots{}}, on the left side are the parameters which get optimized over all mixtures, on the right the parameter which are optimized specific to each mixture. The parameters available are \code{"nni", "bf", "Q", "inv", "shape", "edge", "rate"}. Each parameters can be used only once in the formula. \code{"rate"} and \code{"nni"} are only available for the right side of the formula. On the other hand parameters for invariable sites are only allowed on the left-hand side. The convergence of the algorithm is very slow and is likely that the algorithm can get stuck in local optima. } \examples{ \dontrun{ X <- allSitePattern(5) tree <- read.tree(text = "((t1:0.3,t2:0.3):0.1,(t3:0.3,t4:0.3):0.1,t5:0.5);") fit <- pml(tree,X, k=4) weights <- 1000*exp(fit$site) attr(X, "weight") <- weights fit1 <- update(fit, data=X, k=1) fit2 <- update(fit, data=X) (fitMixture <- pmlMix(edge~rate, fit1 , m=4)) (fit2 <- optim.pml(fit2, optGamma=TRUE)) data(Laurasiatherian) dm <- dist.logDet(Laurasiatherian) tree <- NJ(dm) fit <- pml(tree, Laurasiatherian) fit <- optim.pml(fit) fit2 <- update(fit, k=4) fit2 <- optim.pml(fit2, optGamma=TRUE) fitMix <- pmlMix(edge ~ rate, fit, m=4) fitMix # # simulation of mixture models # \dontrun{ X <- allSitePattern(5) tree1 <- read.tree(text = "((t1:0.1,t2:0.5):0.1,(t3:0.1,t4:0.5):0.1,t5:0.5);") tree2 <- read.tree(text = "((t1:0.5,t2:0.1):0.1,(t3:0.5,t4:0.1):0.1,t5:0.5);") tree1 <- unroot(tree1) tree2 <- unroot(tree2) fit1 <- pml(tree1,X) fit2 <- pml(tree2,X) weights <- 2000*exp(fit1$site) + 1000*exp(fit2$site) attr(X, "weight") <- weights fit1 <- pml(tree1, X) fit2 <- optim.pml(fit1) logLik(fit2) AIC(fit2, k=log(3000)) fitMixEdge <- pmlMix( ~ edge, fit1, m=2) logLik(fitMixEdge) AIC(fitMixEdge, k=log(3000)) fit.p <- pmlPen(fitMixEdge, .25) logLik(fit.p) AIC(fit.p, k=log(3000)) } } } \seealso{ \code{\link{pml}},\code{\link{pmlPart}},\code{\link{pmlCluster}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/ancestral.pml.Rd0000644000176200001440000000544413475602650015712 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ancestral_pml.R \name{ancestral.pml} \alias{ancestral.pml} \alias{ancestral.pars} \alias{pace} \alias{plotAnc} \title{Ancestral character reconstruction.} \usage{ ancestral.pml(object, type = "marginal", return = "prob") ancestral.pars(tree, data, type = c("MPR", "ACCTRAN"), cost = NULL, return = "prob") pace(tree, data, type = c("MPR", "ACCTRAN"), cost = NULL, return = "prob") plotAnc(tree, data, i = 1, site.pattern = TRUE, col = NULL, cex.pie = par("cex"), pos = "bottomright", ...) } \arguments{ \item{object}{an object of class pml} \item{type}{method used to assign characters to internal nodes, see details.} \item{return}{return a \code{phyDat} object or matrix of probabilities.} \item{tree}{a tree, i.e. an object of class pml} \item{data}{an object of class phyDat} \item{cost}{A cost matrix for the transitions between two states.} \item{i}{plots the i-th site pattern of the \code{data}.} \item{site.pattern}{logical, plot i-th site pattern or i-th site} \item{col}{a vector containing the colors for all possible states.} \item{cex.pie}{a numeric defining the size of the pie graphs} \item{pos}{a character string defining the position of the legend} \item{\dots}{Further arguments passed to or from other methods.} } \value{ %A matrix containing the the estimates character states. An object of class "phyDat", containing the ancestral states of all nodes. } \description{ Marginal reconstruction of the ancestral character states. } \details{ The argument "type" defines the criterion to assign the internal nodes. For \code{ancestral.pml} so far "ml" and (empirical) "bayes" and for \code{ancestral.pars} "MPR" and "ACCTRAN" are possible. With parsimony reconstruction one has to keep in mind that there will be often no unique solution. For further details see vignette("Ancestral"). } \examples{ example(NJ) fit <- pml(tree, Laurasiatherian) anc.ml <- ancestral.pml(fit, type = "ml") anc.p <- ancestral.pars(tree, Laurasiatherian) \dontrun{ require(seqLogo) seqLogo( t(subset(anc.ml, 48, 1:20)[[1]]), ic.scale=FALSE) seqLogo( t(subset(anc.p, 48, 1:20)[[1]]), ic.scale=FALSE) } # plot the first site pattern plotAnc(tree, anc.ml, 1) # plot the third character plotAnc(tree, anc.ml, attr(anc.ml, "index")[3]) } \references{ Felsenstein, J. (2004). \emph{Inferring Phylogenies}. Sinauer Associates, Sunderland. Swofford, D.L., Maddison, W.P. (1987) Reconstructing ancestral character states under Wagner parsimony. \emph{Math. Biosci.} \bold{87}: 199--229 Yang, Z. (2006). \emph{Computational Molecular evolution}. Oxford University Press, Oxford. } \seealso{ \code{\link{pml}}, \code{\link{parsimony}}, \code{\link[ape]{ace}}, \code{\link[ape]{root}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/as.networx.Rd0000644000176200001440000000402013475602650015244 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/networx.R \name{as.networx} \alias{as.networx} \alias{networx} \alias{as.networx.splits} \alias{as.networx.phylo} \title{Conversion among phylogenetic network 0bjects} \usage{ as.networx(x, ...) \method{as.networx}{splits}(x, planar = FALSE, coord = c("none", "2D", "3D"), ...) \method{as.networx}{phylo}(x, ...) } \arguments{ \item{x}{an object of class \code{"splits"} or \code{"phylo"}} \item{\dots}{Further arguments passed to or from other methods.} \item{planar}{logical whether to produce a planar graph from only cyclic splits (may excludes splits).} \item{coord}{add coordinates of the nodes, allows to reproduce the plot.} } \description{ \code{as.networx} convert \code{splits} objects into a \code{networx} object. And most important there exists a generic \code{plot} function to plot phylogenetic network or split graphs. } \details{ A \code{networx} object hold the information for a phylogenetic network and extends the \code{phylo} object. Therefore some generic function for \code{phylo} objects will also work for \code{networx} objects. The argument \code{planar = TRUE} will create a planar split graph based on a cyclic ordering. These objects can be nicely plotted in \code{"2D"}. } \note{ The internal representation is likely to change. } \examples{ set.seed(1) tree1 <- rtree(20, rooted=FALSE) sp <- as.splits(rNNI(tree1, n=10)) net <- as.networx(sp) plot(net, "2D") \dontrun{ # also see example in consensusNet example(consensusNet) } } \references{ Schliep, K., Potts, A. J., Morrison, D. A. and Grimm, G. W. (2017), Intertwining phylogenetic trees and networks. \emph{Methods Ecol Evol}. \bold{8}, 1212--1220. doi:10.1111/2041-210X.12760 } \seealso{ \code{\link{consensusNet}}, \code{\link{neighborNet}}, \code{\link{splitsNetwork}}, \code{\link{hadamard}}, \code{\link{distanceHadamard}}, \code{\link{plot.networx}}, \code{\link[ape]{evonet}}, \code{\link[ape]{as.phylo}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{plot} phangorn/man/reexports.Rd0000644000176200001440000000061213475602650015172 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utils.R \docType{import} \name{reexports} \alias{reexports} \alias{\%>\%} \title{Objects exported from other packages} \keyword{internal} \description{ These objects are imported from other packages. Follow the links below to see their documentation. \describe{ \item{magrittr}{\code{\link[magrittr]{\%>\%}}} }} phangorn/man/dfactorial.Rd0000644000176200001440000000123013475602650015244 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hadamard.R \name{ldfactorial} \alias{ldfactorial} \alias{dfactorial} \title{Arithmetic Operators} \usage{ ldfactorial(x) dfactorial(x) } \arguments{ \item{x}{a numeric scalar or vector} } \value{ \code{dfactorial(x)} returns the double factorial, that is \eqn{x\!\! = 1 * 3 * 5 * \ldots * x } and \code{ldfactorial(x)} is the natural logarithm of it. } \description{ double factorial function } \examples{ dfactorial(1:10) } \seealso{ \code{\link[base:Special]{factorial}}, \code{\link[ape]{howmanytrees}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{classif} phangorn/man/CI.Rd0000644000176200001440000000217613475602650013441 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/parsimony.R \name{CI} \alias{CI} \alias{RI} \title{Consistency Index and Retention Index} \usage{ CI(tree, data, cost = NULL, sitewise = FALSE) RI(tree, data, cost = NULL, sitewise = FALSE) } \arguments{ \item{tree}{tree to start the nni search from.} \item{data}{A object of class phyDat containing sequences.} \item{cost}{A cost matrix for the transitions between two states.} \item{sitewise}{return CI/RI for alignment or sitewise} } \description{ \code{CI} and \code{RI} compute the Consistency Index (CI) and Retention Index (RI). } \details{ The Consistency Index is defined as minimum number of changes divided by the number of changes required on the tree (parsimony score). The Consistency Index is equal to one if there is no homoplasy. And the Retention Index is defined as \deqn{RI = \frac{MaxChanges - ObsChanges}{MaxChanges - MinChanges}}{RI = (MaxChanges - ObsChanges) / (MaxChanges - MinChanges)} } \seealso{ \code{\link{parsimony}}, \code{\link{pratchet}}, \code{\link{fitch}}, \code{\link{sankoff}}, \code{\link{bab}}, \code{\link{ancestral.pars}} } phangorn/man/treedist.Rd0000644000176200001440000001061113475602650014762 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treedist.R \name{treedist} \alias{treedist} \alias{sprdist} \alias{SPR.dist} \alias{RF.dist} \alias{wRF.dist} \alias{KF.dist} \alias{path.dist} \title{Distances between trees} \usage{ treedist(tree1, tree2, check.labels = TRUE) sprdist(tree1, tree2) SPR.dist(tree1, tree2 = NULL) RF.dist(tree1, tree2 = NULL, normalize = FALSE, check.labels = TRUE, rooted = FALSE) wRF.dist(tree1, tree2 = NULL, normalize = FALSE, check.labels = TRUE, rooted = FALSE) KF.dist(tree1, tree2 = NULL, check.labels = TRUE, rooted = FALSE) path.dist(tree1, tree2 = NULL, check.labels = TRUE, use.weight = FALSE) } \arguments{ \item{tree1}{A phylogenetic tree (class \code{phylo}) or vector of trees (an object of class \code{multiPhylo}). See details} \item{tree2}{A phylogenetic tree.} \item{check.labels}{compares labels of the trees.} \item{normalize}{compute normalized RF-distance, see details.} \item{rooted}{take bipartitions for rooted trees into account, default is unrooting the trees.} \item{use.weight}{use edge.length argument or just count number of edges on the path (default)} } \value{ \code{treedist} returns a vector containing the following tree distance methods \item{symmetric.difference}{symmetric.difference or Robinson-Foulds distance} \item{branch.score.difference}{branch.score.difference} \item{path.difference}{path.difference} \item{weighted.path.difference}{weighted.path.difference} } \description{ \code{treedist} computes different tree distance methods and \code{RF.dist} the Robinson-Foulds or symmetric distance. The Robinson-Foulds distance only depends on the toplogy of the trees. If edge weights should be considered \code{wRF.dist} calculates the weighted RF distance (Robinson & Foulds 1981). and \code{KF.dist} calculates the branch score distance (Kuhner & Felsenstein 1994). \code{path.dist} computes the path difference metric as described in Steel and Penny 1993). \code{sprdist} computes the approximate SPR distance (Oliveira Martins et al. 2008, de Oliveira Martins 2016). } \details{ The Robinson-Foulds distance between two trees \eqn{T_1} and \eqn{T_2} with \eqn{n} tips is defined as (following the notation Steel and Penny 1993): \deqn{d(T_1, T_2) = i(T_1) + i(T_2) - 2v_s(T_1, T_2)} where \eqn{i(T_1)} denotes the number of internal edges and \eqn{v_s(T_1, T_2)} denotes the number of internal splits shared by the two trees. The normalized Robinson-Foulds distance is derived by dividing \eqn{d(T_1, T_2)} by the maximal possible distance \eqn{i(T_1) + i(T_2)}. If both trees are unrooted and binary this value is \eqn{2n-6}. Functions like \code{RF.dist} returns the Robinson-Foulds distance (Robinson and Foulds 1981) between either 2 trees or computes a matrix of all pairwise distances if a \code{multiPhylo} object is given. For large number of trees the distance functions can use a lot of memory! } \examples{ tree1 <- rtree(100, rooted=FALSE) tree2 <- rSPR(tree1, 3) RF.dist(tree1, tree2) treedist(tree1, tree2) sprdist(tree1, tree2) trees <- rSPR(tree1, 1:5) SPR.dist(tree1, trees) } \references{ de Oliveira Martins L., Leal E., Kishino H. (2008) \emph{Phylogenetic Detection of Recombination with a Bayesian Prior on the Distance between Trees}. PLoS ONE \bold{3(7)}. e2651. doi: 10.1371/journal.pone.0002651 de Oliveira Martins L., Mallo D., Posada D. (2016) \emph{A Bayesian Supertree Model for Genome-Wide Species Tree Reconstruction}. Syst. Biol. \bold{65(3)}: 397-416, doi:10.1093/sysbio/syu082 Steel M. A. and Penny P. (1993) \emph{Distributions of tree comparison metrics - some new results}, Syst. Biol., \bold{42(2)}, 126--141 Kuhner, M. K. and Felsenstein, J. (1994) \emph{A simulation comparison of phylogeny algorithms under equal and unequal evolutionary rates}, Molecular Biology and Evolution, \bold{11(3)}, 459--468 D.F. Robinson and L.R. Foulds (1981) \emph{Comparison of phylogenetic trees}, Mathematical Biosciences, \bold{53(1)}, 131--147 D.F. Robinson and L.R. Foulds (1979) Comparison of weighted labelled trees. In Horadam, A. F. and Wallis, W. D. (Eds.), \emph{Combinatorial Mathematics VI: Proceedings of the Sixth Australian Conference on Combinatorial Mathematics, Armidale, Australia}, 119--126 } \seealso{ \code{\link[ape]{dist.topo}}, \code{\link{nni}}, \code{\link{superTree}}, \code{\link{mast}} } \author{ Klaus P. Schliep \email{klaus.schliep@gmail.com}, Leonardo de Oliveira Martins } \keyword{classif} phangorn/man/modelTest.Rd0000644000176200001440000000577113475602650015112 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/modelTest.R \name{modelTest} \alias{modelTest} \alias{AICc} \title{ModelTest} \usage{ modelTest(object, tree = NULL, model = c("JC", "F81", "K80", "HKY", "SYM", "GTR"), G = TRUE, I = TRUE, FREQ = FALSE, k = 4, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1), multicore = FALSE, mc.cores = NULL) } \arguments{ \item{object}{an object of class phyDat or pml} \item{tree}{a phylogenetic tree.} \item{model}{a vector containing the substitution models to compare with each other or "all" to test all available models} \item{G}{logical, TRUE (default) if (discrete) Gamma model should be tested} \item{I}{logical, TRUE (default) if invariant sites should be tested} \item{FREQ}{logical, FALSE (default) if TRUE amino acid frequencies will be estimated.} \item{k}{number of rate classes} \item{control}{A list of parameters for controlling the fitting process.} \item{multicore}{logical, whether models should estimated in parallel.} \item{mc.cores}{The number of cores to use, i.e. at most how many child processes will be run simultaneously. Must be at least one, and parallelization requires at least two cores.} } \value{ A data.frame containing the log-likelihood, number of estimated parameters, AIC, AICc and BIC all tested models. The data.frame has an attributes "env" which is an environment which contains all the trees, the data and the calls to allow get the estimated models, e.g. as a starting point for further analysis (see example). } \description{ Comparison of different nucleotide or amino acid substitution models } \details{ \code{modelTest} estimates all the specified models for a given tree and data. When the mclapply is available, the computations are done in parallel. \code{modelTest} runs each model in one thread. This is may not work within a GUI interface and will not work under Windows. } \examples{ \dontrun{ example(NJ) (mT <- modelTest(Laurasiatherian, tree)) # some R magic env <- attr(mT, "env") ls(env=env) (F81 <- get("F81+G", env)) # a call eval(F81, env=env) data(chloroplast) (mTAA <- modelTest(chloroplast, model=c("JTT", "WAG", "LG"))) # test all available amino acid models (mTAA_all <- modelTest(chloroplast, model="all", multicore=TRUE, mc.cores=2)) } } \references{ Burnham, K. P. and Anderson, D. R (2002) \emph{Model selection and multimodel inference: a practical information-theoretic approach}. 2nd ed. Springer, New York Posada, D. and Crandall, K.A. (1998) MODELTEST: testing the model of DNA substitution. \emph{Bioinformatics} \bold{14(9)}: 817-818 Posada, D. (2008) jModelTest: Phylogenetic Model Averaging. \emph{Molecular Biology and Evolution} \bold{25}: 1253-1256 Darriba D., Taboada G.L., Doallo R and Posada D. (2011) ProtTest 3: fast selection of best-fit models of protein evolution. . \emph{Bioinformatics} \bold{27}: 1164-1165 } \seealso{ \code{\link{pml}}, \code{\link{anova}}, \code{\link[stats]{AIC}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/simSeq.Rd0000644000176200001440000000600513475602650014402 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/simSeq.R \name{simSeq} \alias{simSeq} \alias{simSeq.phylo} \alias{simSeq.pml} \title{Simulate sequences.} \usage{ simSeq(x, ...) \method{simSeq}{phylo}(x, l = 1000, Q = NULL, bf = NULL, rootseq = NULL, type = "DNA", model = NULL, levels = NULL, rate = 1, ancestral = FALSE, ...) \method{simSeq}{pml}(x, ancestral = FALSE, ...) } \arguments{ \item{x}{a phylogenetic tree \code{tree}, i.e. an object of class \code{phylo} or and object of class \code{pml}.} \item{\dots}{Further arguments passed to or from other methods.} \item{l}{length of the sequence to simulate.} \item{Q}{the rate matrix.} \item{bf}{base frequencies.} \item{rootseq}{a vector of length l containing the root sequence, other root sequence is randomly generated.} \item{type}{Type of sequences ("DNA", "AA", "CODON" or "USER").} \item{model}{Amino acid models: e.g. "WAG", "JTT", "Dayhoff" or "LG"} \item{levels}{\code{levels} takes a character vector of the different bases, default is for nucleotide sequences, only used when type = "USER".} \item{rate}{mutation rate or scaler for the edge length, a numerical value greater than zero.} \item{ancestral}{Return ancestral sequences?} } \value{ \code{simSeq} returns an object of class phyDat. } \description{ Simulate sequences for a given evolutionary tree. } \details{ \code{simSeq} is now a generic function to simulate sequence alignments to along a phylogeny. It is quite flexible and allows to generate DNA, RNA, amino acids, codon or binary sequences. It is possible to give a \code{pml} object as input simSeq return a \code{phyDat} from these model. There is also a more low level version, which lacks rate variation, but one can combine different alignments having their own rate (see example). The rate parameter acts like a scaler for the edge lengths. For codon models \code{type="CODON"} two additional arguments \code{dnds} for the dN/dS ratio and \code{tstv} for the transition transversion ratio can be supplied. } \examples{ \dontrun{ data(Laurasiatherian) tree <- nj(dist.ml(Laurasiatherian)) fit <- pml(tree, Laurasiatherian, k=4) fit <- optim.pml(fit, optNni=TRUE, model="GTR", optGamma=TRUE) data <- simSeq(fit) } tree <- rtree(5) plot(tree) nodelabels() # Example for simple DNA alignment data <- simSeq(tree, l = 10, type="DNA", bf=c(.1,.2,.3,.4), Q=1:6) as.character(data) # Example to simulate discrete Gamma rate variation rates <- discrete.gamma(1,4) data1 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[1]) data2 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[2]) data3 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[3]) data4 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[4]) data <- c(data1,data2, data3, data4) write.phyDat(data, file="temp.dat", format="sequential", nbcol = -1, colsep = "") unlink("temp.dat") } \seealso{ \code{\link{phyDat}}, \code{\link{pml}}, \code{\link{SOWH.test}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/bootstrap.pml.Rd0000644000176200001440000000770613475602650015756 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bootstrap.R \name{bootstrap.pml} \alias{bootstrap.pml} \alias{bootstrap.phyDat} \alias{plotBS} \title{Bootstrap} \usage{ bootstrap.pml(x, bs = 100, trees = TRUE, multicore = FALSE, mc.cores = NULL, ...) bootstrap.phyDat(x, FUN, bs = 100, multicore = FALSE, mc.cores = NULL, jumble = TRUE, ...) plotBS(tree, BStrees, type = "unrooted", bs.col = "black", bs.adj = NULL, p = 50, frame = "none", ...) } \arguments{ \item{x}{an object of class \code{pml} or \code{phyDat}.} \item{bs}{number of bootstrap samples.} \item{trees}{return trees only (default) or whole \code{pml} objects.} \item{multicore}{logical, whether models should estimated in parallel.} \item{mc.cores}{The number of cores to use during bootstrap. Only supported on UNIX-alike systems.} \item{\dots}{further parameters used by \code{optim.pml} or \code{plot.phylo}.} \item{FUN}{the function to estimate the trees.} \item{jumble}{logical, jumble the order of the sequences.} \item{tree}{The tree on which edges the bootstrap values are plotted.} \item{BStrees}{a list of trees (object of class "multiPhylo").} \item{type}{the type of tree to plot, so far "cladogram", "phylogram" and "unrooted" are supported.} \item{bs.col}{color of bootstrap support labels.} \item{bs.adj}{one or two numeric values specifying the horizontal and vertical justification of the bootstrap labels.} \item{p}{only plot support values higher than this percentage number (default is 80).} \item{frame}{a character string specifying the kind of frame to be printed around the bootstrap values. This must be one of "none" (the default), "rect" or "circle".} } \value{ \code{bootstrap.pml} returns an object of class \code{multi.phylo} or a list where each element is an object of class \code{pml}. \code{plotBS} returns silently a tree, i.e. an object of class \code{phylo} with the bootstrap values as node labels. The argument \code{BStrees} is optional and if not supplied the tree with labels supplied in the \code{node.label} slot. } \description{ \code{bootstrap.pml} performs (non-parametric) bootstrap analysis and \code{bootstrap.phyDat} produces a list of bootstrapped data sets. \code{plotBS} plots a phylogenetic tree with the with the bootstrap values assigned to the (internal) edges. } \details{ It is possible that the bootstrap is performed in parallel, with help of the multicore package. Unfortunately the multicore package does not work under windows or with GUI interfaces ("aqua" on a mac). However it will speed up nicely from the command line ("X11"). } \examples{ \dontrun{ data(Laurasiatherian) dm <- dist.logDet(Laurasiatherian) tree <- NJ(dm) # NJ set.seed(123) NJtrees <- bootstrap.phyDat(Laurasiatherian, FUN=function(x)NJ(dist.logDet(x)), bs=100) treeNJ <- plotBS(tree, NJtrees, "phylogram") # Maximum likelihood fit <- pml(tree, Laurasiatherian) fit <- optim.pml(fit, rearrangement="NNI") set.seed(123) bs <- bootstrap.pml(fit, bs=100, optNni=TRUE) treeBS <- plotBS(fit$tree,bs) # Maximum parsimony treeMP <- pratchet(Laurasiatherian) treeMP <- acctran(treeMP, Laurasiatherian) set.seed(123) BStrees <- bootstrap.phyDat(Laurasiatherian, pratchet, bs = 100) treeMP <- plotBS(treeMP, BStrees, "phylogram") add.scale.bar() # export tree with bootstrap values as node labels # write.tree(treeBS) } } \references{ Felsenstein J. (1985) Confidence limits on phylogenies. An approach using the bootstrap. \emph{Evolution} \bold{39}, 783--791 Penny D. and Hendy M.D. (1985) Testing methods evolutionary tree construction. \emph{Cladistics} \bold{1}, 266--278 Penny D. and Hendy M.D. (1986) Estimating the reliability of evolutionary trees. \emph{Molecular Biology and Evolution} \bold{3}, 403--417 } \seealso{ \code{\link{optim.pml}}, \code{\link{pml}}, \code{\link{plot.phylo}}, \code{\link{nodelabels}},\code{\link{consensusNet}} and \code{\link{SOWH.test}} for parametric bootstrap } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/yeast.Rd0000644000176200001440000000077013475602650014271 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phangorn-package.R \docType{data} \name{yeast} \alias{yeast} \title{Yeast alignment (Rokas et al.)} \description{ Alignment of 106 genes of 8 different species of yeast. } \examples{ data(yeast) str(yeast) } \references{ Rokas, A., Williams, B. L., King, N., and Carroll, S. B. (2003) Genome-scale approaches to resolving incongruence in molecular phylogenies. \emph{Nature}, \bold{425}(6960): 798--804 } \keyword{datasets} phangorn/man/NJ.Rd0000644000176200001440000000233413475602650013451 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distTree.R \name{NJ} \alias{NJ} \alias{UNJ} \title{Neighbor-Joining} \usage{ NJ(x) UNJ(x) } \arguments{ \item{x}{A distance matrix.} } \value{ an object of class \code{"phylo"}. } \description{ This function performs the neighbor-joining tree estimation of Saitou and Nei (1987). UNJ is the unweighted version from Gascuel (1997). } \examples{ data(Laurasiatherian) dm <- dist.ml(Laurasiatherian) tree <- NJ(dm) plot(tree) } \references{ Saitou, N. and Nei, M. (1987) The neighbor-joining method: a new method for reconstructing phylogenetic trees. \emph{Molecular Biology and Evolution}, \bold{4}, 406--425. Studier, J. A and Keppler, K. J. (1988) A Note on the Neighbor-Joining Algorithm of Saitou and Nei. \emph{Molecular Biology and Evolution}, \bold{6}, 729--731. Gascuel, O. (1997) Concerning the NJ algorithm and its unweighted version, UNJ. in Birkin et. al. \emph{Mathematical Hierarchies and Biology}, 149--170. } \seealso{ \code{\link[ape]{nj}}, \code{\link[ape]{dist.dna}}, \code{\link[phangorn]{dist.hamming}}, \code{\link[phangorn]{upgma}}, \code{\link[ape]{fastme}} } \author{ Klaus P. Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/as.splits.Rd0000644000176200001440000000553313475602650015066 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/networx.R, R/splits.R \name{allSplits} \alias{allSplits} \alias{allCircularSplits} \alias{as.splits} \alias{splits} \alias{as.Matrix} \alias{distinct.splits} \alias{as.phylo.splits} \alias{addTrivialSplits} \alias{removeTrivialSplits} \alias{matchSplits} \alias{as.matrix.splits} \alias{as.Matrix.splits} \alias{print.splits} \alias{c.splits} \alias{unique.splits} \alias{as.splits.phylo} \alias{as.splits.multiPhylo} \alias{as.splits.networx} \alias{as.prop.part.splits} \alias{as.bitsplits.splits} \alias{as.splits.bitsplits} \alias{compatible} \title{Splits representation of graphs and trees.} \usage{ allSplits(k, labels = NULL) allCircularSplits(k, labels = NULL) as.splits(x, ...) \method{as.matrix}{splits}(x, zero.print = 0L, one.print = 1L, ...) \method{as.Matrix}{splits}(x, ...) \method{print}{splits}(x, maxp = getOption("max.print"), zero.print = ".", one.print = "|", ...) \method{c}{splits}(..., recursive = FALSE) \method{unique}{splits}(x, incomparables = FALSE, unrooted = TRUE, ...) \method{as.splits}{phylo}(x, ...) \method{as.splits}{multiPhylo}(x, ...) \method{as.splits}{networx}(x, ...) \method{as.prop.part}{splits}(x, ...) \method{as.bitsplits}{splits}(x) \method{as.splits}{bitsplits}(x, ...) compatible(obj) } \arguments{ \item{k}{number of taxa.} \item{labels}{names of taxa.} \item{x}{An object of class phylo or multiPhylo.} \item{\dots}{Further arguments passed to or from other methods.} \item{zero.print}{character which should be printed for zeros.} \item{one.print}{character which should be printed for ones.} \item{maxp}{integer, default from \code{options(max.print)}, influences how many entries of large matrices are printed at all.} \item{recursive}{logical. If recursive = TRUE, the function recursively descends through lists (and pairlists) combining all their elements into a vector.} \item{incomparables}{only for compatibility so far.} \item{unrooted}{todo.} \item{obj}{an object of class splits.} } \value{ \code{as.splits} returns an object of class splits, which is mainly a list of splits and some attributes. Often a \code{splits} object will contain attributes \code{confidences} for bootstrap or Bayesian support values and \code{weight} storing edge weights. \code{compatible} return a lower triangular matrix where an 1 indicates that two splits are incompatible. } \description{ \code{as.splits} produces a list of splits or bipartitions. } \note{ The internal representation is likely to change. } \examples{ (sp <- as.splits(rtree(5))) write.nexus.splits(sp) spl <- allCircularSplits(5) plot(as.networx(spl), "2D") } \seealso{ \code{\link{prop.part}}, \code{\link{lento}}, \code{\link{as.networx}}, \code{\link{distanceHadamard}}, \code{\link{read.nexus.splits}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/pml.fit.Rd0000644000176200001440000000444413501031714014502 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phylo.R \name{lli} \alias{lli} \alias{edQt} \alias{pml.free} \alias{pml.init} \alias{pml.fit} \title{Internal maximum likelihood functions.} \usage{ lli(data, tree = NULL, ...) edQt(Q = c(1, 1, 1, 1, 1, 1), bf = c(0.25, 0.25, 0.25, 0.25)) pml.free() pml.init(data, k = 1L) pml.fit(tree, data, bf = rep(1/length(levels), length(levels)), shape = 1, k = 1, Q = rep(1, length(levels) * (length(levels) - 1)/2), levels = attr(data, "levels"), inv = 0, rate = 1, g = NULL, w = NULL, eig = NULL, INV = NULL, ll.0 = NULL, llMix = NULL, wMix = 0, ..., site = FALSE) } \arguments{ \item{data}{An alignment, object of class \code{phyDat}.} \item{tree}{A phylogenetic \code{tree}, object of class \code{phylo}.} \item{\dots}{Further arguments passed to or from other methods.} \item{Q}{A vector containing the lower triangular part of the rate matrix.} \item{bf}{Base frequencies.} \item{k}{Number of intervals of the discrete gamma distribution.} \item{shape}{Shape parameter of the gamma distribution.} \item{levels}{The alphabet used e.g. c("a", "c", "g", "t") for DNA} \item{inv}{Proportion of invariable sites.} \item{rate}{Rate.} \item{g}{vector of quantiles (default is NULL)} \item{w}{vector of probabilities (default is NULL)} \item{eig}{Eigenvalue decomposition of Q} \item{INV}{Sparse representation of invariant sites} \item{ll.0}{default is NULL} \item{llMix}{default is NULL} \item{wMix}{default is NULL} \item{site}{return the log-likelihood or vector of sitewise likelihood values} } \value{ \code{pml.fit} returns the log-likelihood. } \description{ These functions are internally used for the likelihood computations in \code{pml} or \code{optim.pml}. } \details{ These functions are exported to be used in different packages so far only in the package coalescentMCMC, but are not intended for end user. Most of the functions call C code and are far less forgiving if the import is not what they expect than \code{pml}. } \references{ Felsenstein, J. (1981) Evolutionary trees from DNA sequences: a maximum likelihood approach. \emph{Journal of Molecular Evolution}, \bold{17}, 368--376. } \seealso{ \code{\link{pml}, \link{pmlPart}, \link{pmlMix}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/chloroplast.Rd0000644000176200001440000000050313475602650015470 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phangorn-package.R \docType{data} \name{chloroplast} \alias{chloroplast} \title{Chloroplast alignment} \description{ Amino acid alignment of 15 genes of 19 different chloroplast. } \examples{ data(chloroplast) chloroplast } \keyword{datasets} phangorn/man/maxCladeCred.Rd0000644000176200001440000000427613475602650015465 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bootstrap.R \name{maxCladeCred} \alias{maxCladeCred} \alias{mcc} \alias{allCompat} \title{Maximum clade credibility tree} \usage{ maxCladeCred(x, tree = TRUE, part = NULL, rooted = TRUE) mcc(x, tree = TRUE, part = NULL, rooted = TRUE) allCompat(x) } \arguments{ \item{x}{\code{x} is an object of class \code{multiPhylo} or \code{phylo}} \item{tree}{logical indicating whether return the tree with the clade credibility (default) or the clade credibility score for all trees.} \item{part}{a list of partitions as returned by \code{prop.part}} \item{rooted}{logical, if FALSE the tree with highest maximum bipartition credibility is returned.} } \value{ a tree (an object of class \code{phylo}) with the highest clade credibility or a numeric vector of clade credibilities for each tree. } \description{ \code{maxCladeCred} computes the maximum clade credibility tree from a sample of trees. } \details{ So far just the best tree is returned. No annotations or transformations of edge length are performed. If a list of partition is provided then the clade credibility is computed for the trees in x. \code{allCompat} returns a 50% majority rule consensus tree with added compatible splits similar to the option allcompat in MrBayes. } \examples{ data(Laurasiatherian) set.seed(42) bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x)upgma(dist.hamming(x)), bs=100) strict_consensus <- consensus(bs) majority_consensus <- consensus(bs, p=.5) all_compat <- allCompat(bs) max_clade_cred <- maxCladeCred(bs) par(mfrow = c(2,2), mar = c(1,4,1,1)) plot(strict_consensus, main="Strict consensus tree") plot(majority_consensus, main="Majority consensus tree") plot(all_compat, main="Majority consensus tree with compatible splits") plot(max_clade_cred, main="Maximum clade credibility tree") # compute clade credibility for trees given a prop.part object pp <- prop.part(bs) tree <- rNNI(bs[[1]], 20) maxCladeCred(c(tree, bs[[1]]), tree=FALSE, part = pp) # first value likely be -Inf } \seealso{ \code{\link{consensus}}, \code{\link{consensusNet}}, \code{\link{prop.part}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/Ancestors.Rd0000644000176200001440000000427013475602650015104 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treeManipulation.R \name{Ancestors} \alias{Ancestors} \alias{allDescendants} \alias{Children} \alias{Descendants} \alias{Siblings} \alias{mrca.phylo} \title{tree utility function} \usage{ Ancestors(x, node, type = c("all", "parent")) allDescendants(x) Children(x, node) Descendants(x, node, type = c("tips", "children", "all")) Siblings(x, node, include.self = FALSE) mrca.phylo(x, node = NULL, full = FALSE) } \arguments{ \item{x}{a tree (a phylo object).} \item{node}{an integer or a vector of integers corresponding to a node ID} \item{type}{specify whether to return just direct children / parents or all} \item{include.self}{whether to include self in list of siblings} \item{full}{a logical indicating whether to return the MRCAs among all tips and nodes (if TRUE); the default is to return only the MRCAs among tips.} } \value{ a vector or a list containing the indices of the nodes. } \description{ Functions for describing relationships among phylogenetic nodes. } \details{ These functions are inspired by \code{treewalk} in phylobase package, but work on the S3 \code{phylo} objects. The nodes are the indices as given in edge matrix of an phylo object. From taxon labels these indices can be easily derived matching against the \code{tip.label} argument of an phylo object, see example below. All the functions allow \code{node} to be either a scalar or vector. \code{mrca} is a faster version of the mrca in ape, in phangorn only because of dependencies. If the argument node is missing the function is evaluated for all nodes. } \section{Functions}{ \itemize{ \item \code{allDescendants}: list all the descendant nodes of each node }} \examples{ tree <- rtree(10) plot(tree, show.tip.label = FALSE) nodelabels() tiplabels() Ancestors(tree, 1:3, "all") Children(tree, 11) Descendants(tree, 11, "tips") Siblings(tree, 3) # Siblings of all nodes Siblings(tree) mrca.phylo(tree, 1:3) mrca.phylo(tree, match(c("t1", "t2", "t3"), tree$tip)) mrca.phylo(tree) # same as mrca(tree), but faster for large trees } \seealso{ \code{treewalk}, \code{\link[ape]{as.phylo}}, \code{\link[ape]{nodelabels}} } \keyword{internal} \keyword{misc} phangorn/man/read.nexus.splits.Rd0000644000176200001440000000461113475602650016533 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/read.nexus.splits.R \name{read.nexus.splits} \alias{read.nexus.splits} \alias{write.nexus.splits} \alias{write.nexus.networx} \alias{read.nexus.networx} \alias{write.splits} \title{Function to import and export splits and networks} \usage{ read.nexus.splits(file) write.nexus.splits(obj, file = "", weights = NULL, taxa = TRUE, append = FALSE) write.nexus.networx(obj, file = "", taxa = TRUE, splits = TRUE, append = FALSE) read.nexus.networx(file, splits = TRUE) write.splits(x, file = "", zero.print = ".", one.print = "|", print.labels = TRUE, ...) } \arguments{ \item{file}{a file name.} \item{obj}{An object of class splits.} \item{weights}{Edge weights.} \item{taxa}{logical. If TRUE a taxa block is added} \item{append}{logical. If TRUE the nexus blocks will be added to a file.} \item{splits}{logical. If TRUE the nexus blocks will be added to a file.} \item{x}{An object of class splits.} \item{zero.print}{character which should be printed for zeros.} \item{one.print}{character which should be printed for ones.} \item{print.labels}{logical. If TRUE labels are printed.} \item{\dots}{Further arguments passed to or from other methods.} \item{labels}{names of taxa.} } \value{ \code{write.nexus.splits} and \code{write.nexus.networx} write out the \code{splits} and \code{networx} object to read with other software like Splitstree. \code{read.nexus.splits} and \code{read.nexus.networx} return an \code{splits} and \code{networx} object. } \description{ \code{read.nexus.splits}, \code{write.nexus.splits}, \code{read.nexus.networx}, \code{write.nexus.networx} can be used to import and export splits and networks with nexus format and allow to exchange these object with other software like Splitstree. \code{write.splits} returns a human readable output. } \note{ \code{read.nexus.splits} reads in the splits block of a nexus file. It assumes that different co-variables are tab delimited and the bipartition are separated with white-space. Comments in square brackets are ignored. } \examples{ (sp <- as.splits(rtree(5))) write.nexus.splits(sp) spl <- allCircularSplits(5) plot(as.networx(spl), "2D") write.splits(spl, print.labels = FALSE) } \seealso{ \code{\link{prop.part}}, \code{\link{lento}}, \code{\link{as.splits}}, \code{\link{as.networx}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/cladePar.Rd0000644000176200001440000000214613475602650014656 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cladePar.R \name{cladePar} \alias{cladePar} \title{Utility function to plot.phylo} \usage{ cladePar(tree, node, edge.color = "red", tip.color = edge.color, edge.width = 1, edge.lty = 1, x = NULL, plot = FALSE, ...) } \arguments{ \item{tree}{an object of class phylo.} \item{node}{the node which is the common ancestor of the clade.} \item{edge.color}{see plot.phylo.} \item{tip.color}{see plot.phylo.} \item{edge.width}{see plot.phylo.} \item{edge.lty}{see plot.phylo.} \item{x}{the result of a previous call to cladeInfo.} \item{plot}{logical, if TRUE the tree is plotted.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ A list containing the information about the edges and tips. } \description{ cladePar can help you coloring (choosing edge width/type) of clades. } \examples{ tree <- rtree(10) plot(tree) nodelabels() x <- cladePar(tree, 12) cladePar(tree, 18, "blue", "blue", x=x, plot=TRUE) } \seealso{ \code{\link{plot.phylo}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{plot} phangorn/man/add.tips.Rd0000644000176200001440000000161013475602650014644 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treeManipulation.R \name{add.tips} \alias{add.tips} \title{Add tips to a tree} \usage{ add.tips(tree, tips, where, edge.length = NULL) } \arguments{ \item{tree}{an object of class "phylo".} \item{tips}{a character vector containing the names of the tips.} \item{where}{an integer or character vector of the same length as tips giving the number of the node or tip of the tree x where the tree y is binded.} \item{edge.length}{optional numeric vector with edge length} } \value{ an object of class phylo } \description{ This function binds tips to nodes of a phylogenetic trees. } \examples{ tree <- rcoal(10) plot(tree) nodelabels() tiplabels() tree1 <- add.tips(tree, c("A", "B", "C"), c(1,2,15)) plot(tree1) } \seealso{ \code{\link{bind.tree}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/getClans.Rd0000644000176200001440000001456613475602650014714 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clanistic.R \name{getClans} \alias{getClans} \alias{getSlices} \alias{getClips} \alias{getDiversity} \alias{summary.clanistics} \alias{diversity} \title{Clans, slices and clips} \usage{ getClans(tree) getSlices(tree) getClips(tree, all = TRUE) getDiversity(tree, x, norm = TRUE, var.names = NULL, labels = "new") \method{summary}{clanistics}(object, ...) diversity(tree, X) } \arguments{ \item{tree}{An object of class phylo or multiPhylo (getDiversity).} \item{all}{A logical, return all or just the largest clip.} \item{x}{An object of class phyDat.} \item{norm}{A logical, return Equitability Index (default) or Shannon Diversity.} \item{var.names}{A vector of variable names.} \item{labels}{see details.} \item{object}{an object for which a summary is desired.} \item{...}{Further arguments passed to or from other methods.} \item{X}{a data.frame} } \value{ getClans, getSlices and getClips return a matrix of partitions, a matrix of ones and zeros where rows correspond to a clan, slice or clip and columns to tips. A one indicates that a tip belongs to a certain partition. \cr getDiversity returns a list with tree object, the first is a data.frame of the equitability index or Shannon divergence and parsimony scores (p-score) for all trees and variables. The data.frame has two attributes, the first is a splits object to identify the taxa of each tree and the second is a splits object containing all partitions that perfectly fit. } \description{ Functions for clanistics to compute clans, slices, clips for unrooted trees and functions to quantify the fragmentation of trees. } \details{ Every split in an unrooted tree defines two complementary clans. Thus for an unrooted binary tree with \eqn{n} leaves there are \eqn{2n - 3} edges, and therefore \eqn{4n - 6} clans (including \eqn{n} trivial clans containing only one leave). Slices are defined by a pair of splits or tripartitions, which are not clans. The number of distinguishable slices for a binary tree with \eqn{n} tips is \eqn{2n^2 - 10n + 12}. %A clip is a different type of partition as it is defined by evolutionary or cophenetic distance and not by the topology. Namely clips are groups of leaves for which the maximum pairwise distance is smaller than threshold. %For a better separation we additionally demand that the maximum pairwise distance within a clip is lower than the distance between any member of the clip and any other tip. A clip is a different type of partition, defining groups of leaves that are related in terms of evolutionary distances and not only topology. Namely, clips are groups of leaves for which all pairwise path-length distances are smaller than a given threshold value (Lapointe et al. 2010). There exists different numbers of clips for different thresholds, the largest (and trivial) one being the whole tree. There is always a clip containing only the two leaves with the smallest pairwise distance. Clans, slices and clips can be used to characterize how well a vector of categorial characters (natives/intruders) fit on a tree. We will follow the definitions of Lapointe et al.(2010). A complete clan is a clan that contains all leaves of a given state/color, but can also contain leaves of another state/color. A clan is homogeneous if it only contains leaves of one state/color. \code{getDiversity} computes either the \cr Shannon Diversity: \eqn{H = -\sum_{i=1}^{k}(N_i/N) log(N_i/N), N=\sum_{i=1}^{k} N_i}{H = -sum(N_i/N) * log(N_i/N), N=sum(N_i)} \cr or the \cr Equitability Index: \eqn{E = H / log(N)} \cr where \eqn{N_i} are the sizes of the \eqn{k} largest homogeneous clans of intruders. If the categories of the data can be separated by an edge of the tree then the E-value will be zero, and maximum equitability (E=1) is reached if all intruders are in separate clans. getDiversity computes these Intruder indices for the whole tree, complete clans and complete slices. Additionally the parsimony scores (p-scores) are reported. The p-score indicates if the leaves contain only one color (p-score=0), if the the leaves can be separated by a single split (perfect clan, p-score=1) or by a pair of splits (perfect slice, p-score=2). So far only 2 states are supported (native, intruder), however it is also possible to recode several states into the native or intruder state using contrasts, for details see section 2 in vignette("phangorn-specials"). Furthermore unknown character states are coded as ambiguous character, which can act either as native or intruder minimizing the number of clans or changes (in parsimony analysis) needed to describe a tree for given data. Set attribute labels to "old" for analysis as in Schliep et al. (2010) or to "new" for names which are more intuitive. \code{diversity} returns a data.frame with the parsimony score for each tree and each levels of the variables in \code{X}. \code{X} has to be a \code{data.frame} where each column is a factor and the rownames of \code{X} correspond to the tips of the trees. %TODO See also vignette("Clanistic"). } \examples{ set.seed(111) tree <- rtree(10) getClans(tree) getClips(tree, all=TRUE) getSlices(tree) set.seed(123) trees <- rmtree(10, 20) X <- matrix(sample(c("red", "blue", "violet"), 100, TRUE, c(.5,.4, .1)), ncol=5, dimnames=list(paste('t',1:20, sep=""), paste('Var',1:5, sep="_"))) x <- phyDat(X, type = "USER", levels = c("red", "blue"), ambiguity="violet") plot(trees[[1]], "u", tip.color = X[trees[[1]]$tip,1]) # intruders are blue (divTab <- getDiversity(trees, x, var.names=colnames(X))) summary(divTab) } \references{ Lapointe, F.-J., Lopez, P., Boucher, Y., Koenig, J., Bapteste, E. (2010) Clanistics: a multi-level perspective for harvesting unrooted gene trees. \emph{Trends in Microbiology} 18: 341-347 Wilkinson, M., McInerney, J.O., Hirt, R.P., Foster, P.G., Embley, T.M. (2007) Of clades and clans: terms for phylogenetic relationships in unrooted trees. \emph{Trends in Ecology and Evolution} 22: 114-115 Schliep, K., Lopez, P., Lapointe F.-J., Bapteste E. (2011) Harvesting Evolutionary Signals in a Forest of Prokaryotic Gene Trees, \emph{Molecular Biology and Evolution} 28(4): 1393-1405 } \seealso{ \code{\link{parsimony}}, Consistency index \code{\link{CI}}, Retention index \code{\link{RI}}, \code{\link{phyDat}} } \author{ Klaus Schliep \email{klaus.schliep@snv.jussieu.fr} Francois-Joseph Lapointe \email{francois-joseph.lapointe@umontreal.ca} } \keyword{cluster} phangorn/man/pmlCluster.Rd0000644000176200001440000000506013475602650015273 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pmlPart.R \name{pmlCluster} \alias{pmlCluster} \title{Stochastic Partitioning} \usage{ pmlCluster(formula, fit, weight, p = 1:5, part = NULL, nrep = 10, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1), ...) } \arguments{ \item{formula}{a formula object (see details).} \item{fit}{an object of class \code{pml}.} \item{weight}{\code{weight} is matrix of frequency of site patterns for all genes.} \item{p}{number of clusters.} \item{part}{starting partition, otherwise a random partition is generated.} \item{nrep}{number of replicates for each p.} \item{control}{A list of parameters for controlling the fitting process.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ \code{pmlCluster} returns a list with elements \item{logLik}{log-likelihood of the fit} \item{trees}{a list of all trees during the optimization.} \item{fits}{fits for the final partitions} } \description{ Stochastic Partitioning of genes into p cluster. } \details{ The \code{formula} object allows to specify which parameter get optimized. The formula is generally of the form \code{edge + bf + Q ~ rate + shape + \dots{}}, on the left side are the parameters which get optimized over all cluster, on the right the parameter which are optimized specific to each cluster. The parameters available are \code{"nni", "bf", "Q", "inv", "shape", "edge", "rate"}. Each parameter can be used only once in the formula. There are also some restriction on the combinations how parameters can get used. \code{"rate"} is only available for the right side. When \code{"rate"} is specified on the left hand side \code{"edge"} has to be specified (on either side), if \code{"rate"} is specified on the right hand side it follows directly that \code{edge} is too. } \examples{ \dontrun{ data(yeast) dm <- dist.logDet(yeast) tree <- NJ(dm) fit <- pml(tree,yeast) fit <- optim.pml(fit) weight <- xtabs(~ index+genes,attr(yeast, "index")) set.seed(1) sp <- pmlCluster(edge~rate, fit, weight, p=1:4) sp SH.test(sp) } } \references{ K. P. Schliep (2009). Some Applications of statistical phylogenetics (PhD Thesis) Lanfear, R., Calcott, B., Ho, S.Y.W. and Guindon, S. (2012) PartitionFinder: Combined Selection of Partitioning Schemes and Substitution Models for Phylogenetic Analyses. \emph{Molecular Biology and Evolution}, \bold{29(6)}, 1695-1701 } \seealso{ \code{\link{pml}},\code{\link{pmlPart}},\code{\link{pmlMix}},\code{\link{SH.test}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/read.aa.Rd0000644000176200001440000000325713475602650014442 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phyDat.R \name{read.aa} \alias{read.aa} \title{Read Amino Acid Sequences in a File} \usage{ read.aa(file, format = "interleaved", skip = 0, nlines = 0, comment.char = "#", seq.names = NULL) } \arguments{ \item{file}{a file name specified by either a variable of mode character, or a double-quoted string.} \item{format}{a character string specifying the format of the DNA sequences. Three choices are possible: \code{"interleaved"}, \code{"sequential"}, or \code{"fasta"}, or any unambiguous abbreviation of these.} \item{skip}{the number of lines of the input file to skip before beginning to read data.} \item{nlines}{the number of lines to be read (by default the file is read until its end).} \item{comment.char}{a single character, the remaining of the line after this character is ignored.} \item{seq.names}{the names to give to each sequence; by default the names read in the file are used.} } \value{ a matrix of amino acid sequences. } \description{ This function reads amino acid sequences in a file, and returns a matrix list of DNA sequences with the names of the taxa read in the file as row names. } \references{ % Anonymous. FASTA format description. % \url{https://www.ncbi.nlm.nih.gov/blast/fasta.shtml} Felsenstein, J. (1993) Phylip (Phylogeny Inference Package) version 3.5c. Department of Genetics, University of Washington. \url{http://evolution.genetics.washington.edu/phylip/phylip.html} } \seealso{ \code{\link[ape]{read.dna}}, \code{\link[ape]{read.GenBank}}, \code{\link[phangorn]{phyDat}}, \code{\link[seqinr]{read.alignment}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{IO} phangorn/man/identify.networx.Rd0000644000176200001440000000201313475602650016454 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/networx.R \name{identify.networx} \alias{identify.networx} \title{Identify splits in a network} \usage{ \method{identify}{networx}(x, quiet = FALSE, ...) } \arguments{ \item{x}{an object of class \code{networx}} \item{quiet}{a logical controlling whether to print a message inviting the user to click on the tree.} \item{\dots}{further arguments to be passed to or from other methods.} } \value{ \code{identify.networx} returns a splits object. } \description{ \code{identify.networx} reads the position of the graphics pointer when the mouse button is pressed. It then returns the split belonging to the edge closest to the pointer. The network must be plotted beforehand. } \examples{ \dontrun{ data(yeast) dm <- dist.ml(yeast) nnet <- neighborNet(dm) plot(nnet, "2D") identify(nnet) # click close to an edge } } \seealso{ \code{\link[phangorn]{plot.networx}}, \code{\link[graphics]{identify}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } phangorn/man/pmlPart.Rd0000644000176200001440000000470713475602650014567 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pmlPart.R \name{multiphyDat2pmlPart} \alias{multiphyDat2pmlPart} \alias{pmlPart2multiPhylo} \alias{pmlPart} \title{Partition model.} \usage{ multiphyDat2pmlPart(x, rooted = FALSE, ...) pmlPart2multiPhylo(x) pmlPart(formula, object, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1), model = NULL, rooted = FALSE, ...) } \arguments{ \item{x}{an object of class \code{pmlPart}} \item{rooted}{Are the gene trees rooted (ultrametric) or unrooted.} \item{\dots}{Further arguments passed to or from other methods.} \item{formula}{a formula object (see details).} \item{object}{an object of class \code{pml} or a list of objects of class \code{pml} .} \item{control}{A list of parameters for controlling the fitting process.} \item{model}{A vector containing the models containing a model for each partition.} } \value{ \code{kcluster} returns a list with elements \item{logLik}{log-likelihood of the fit} \item{trees}{a list of all trees during the optimization.} \item{object}{an object of class \code{"pml"} or \code{"pmlPart"}} } \description{ Model to estimate phylogenies for partitioned data. } \details{ The \code{formula} object allows to specify which parameter get optimized. The formula is generally of the form \code{edge + bf + Q ~ rate + shape + \dots{}}, on the left side are the parameters which get optimized over all partitions, on the right the parameter which are optimized specific to each partition. The parameters available are \code{"nni", "bf", "Q", "inv", "shape", "edge", "rate"}. Each parameters can be used only once in the formula. \code{"rate"} and \code{"nni"} are only available for the right side of the formula. For partitions with different edge weights, but same topology, \code{pmlPen} can try to find more parsimonious models (see example). \code{pmlPart2multiPhylo} is a convenience function to extract the trees out of a \code{pmlPart} object. } \examples{ data(yeast) dm <- dist.logDet(yeast) tree <- NJ(dm) fit <- pml(tree,yeast) fits <- optim.pml(fit) weight=xtabs(~ index+genes,attr(yeast, "index"))[,1:10] sp <- pmlPart(edge ~ rate + inv, fits, weight=weight) sp \dontrun{ sp2 <- pmlPart(~ edge + inv, fits, weight=weight) sp2 AIC(sp2) sp3 <- pmlPen(sp2, lambda = 2) AIC(sp3) } } \seealso{ \code{\link{pml}},\code{\link{pmlCluster}},\code{\link{pmlMix}},\code{\link{SH.test}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster}

ty@;R. 4`Dyf;3CNZ;B\c3eb «B1Iɗce HgT6@/l`,H|B(ɾΈ5圧t9 :aq >Gx3Rx 8 L|X:Hҏp$p3'uZ2,(y6ߚ)5ŬW+ cVe_qV~Z{E>S4,Bp Aj/[ `1Axv8 0aVO#=ж0C" N<3bXI5H =bn*c؄2OjrpdIoxXZi<jx]Wmv#ADih M1#Fh('0B|ZHOxtnbˢm*ŊLXQH Y.S} w L= 7CU&KU lkgm݄^rԀ׆JQԇSNMtoB:Lnjh R¤4ڈ,&p17>z4(gjBl%B>ϼKR =㓣j*!"Ð"ϓHrYn!~<.4M8&bf&"ڇ?&Sq5q&\!ezWOrͻukbn9p4UI@" wk Z9-Z} לsLdB@s mgectV\p9w.:H#3Ș1\Hv'Η /%b䋳E!Vo`!uaqPn3%Sz%9m@ c~{dq-)րTVު{ {@byp@"JMp,cnX?^U4hx]%}0$P洞z*s<P(0lB^ ?f)P& cZ3Wsޘyk@!Wq9i ?tX` d"2gU>5nYn#;0DMi-ү48JW7̵< ,#O*+l-GĭFe)CȚzWdɜ4Jb'Cx7@÷nOY;U.ⳮi@@nݫ2"-ȔʖtBg5^?љT* ](؄BRj-rmؕΗr+B`=T S U)5P~ ;})NO&]+ZwOF!9m|V hhiFrLQVF,碢tq,Z_NK'x:T ~CiZ82w{:pOTu'=q 8n"7#A @|ymأnEJoDq~]}PJ|RSvXd"jW|0;P+ؓ“ `Bt GXpJ:]0a tg{s̒~x[2SO ]\Ul\VvqkZٖ+{9N{1IQ_ =QQ4㌤gIAR" F8dlwDWH4-jXړߥ JtAfF٥*3_P|x$:܄[ =-yM|v%bDF3RPX\PH\cnEfp:m Nf wl~̀Q&h+ev5Gt# :_ƣ! FAl)=ǡi+U\3Z |,h"1G17nm7_01η/C:Hܞit4bL4%7 ?(ihsd)31{e3 6WML`Mc p5[>Ea^tO(_Ýlr|Kخ[Bǹ8v6j\q,rOqq(2%\.#mkc TvQio9k+*T AV{GjQsR J t (@hhgUv^/o=nd9n2d,?i:"w d]0i nsk+(ʜQ,lъ/R+ 夼ͧ3{::J&4njF)R($߁$RB&&J|_tuɐ9E25Խ2pi# 4([Tvբ٢"5`~ĤNC1DzRR#P2-)E?LR1""RL)sJiJI). ▒DNDVCx6Oj4o3ϊn3wFH/ I6#؄1|m6f9K\PHE #](? F ut ~`ˍ#1D}~ϵy=)Vxck9֖Sv{ |oqS;aE1BSK\StRY= _.%Ŵa)7F MX& J߈>ƾ֩hD1t"BK.^)۱XEGhaI 1],q 貮%$|jo%_\F`\asu詷>ƚ-yk|FbViYPZtCSZ&2{ePXtprx]qbJ möȊK'>J+iafH80(-j$C.C@60H\f `G- >9{e |.W2XٶB8͘avH%Db/( nC@@ xAp+w-hOg0PxSca-W=Y =NEv_Gfq*ӱ"e)Z8CWw uT kgxv寃x"PQ7Hŏ,^+~ ɕiPvR%|+- G͵.^ʌMYTCSHsp Wà _zN35]$|]^oo-(ٗ0_fu?j}.A;n,8q3 ~-[^/?Q:~É3js4ڪt"a>2ÄO%΄lWQb]f&,6W1ƎQb=5Z <{Rlr)/IJ {w(8u7(fBp f%ntZ 2ht4!L9ÉӪds[3fH_L#l9*6`E!C?+O[4i =t' pXѨC| .Ka#?hgz.Wțlc kv~f^{ү^et5`s}VfChpWA(n wh@t͇(JN씙fcREH2c%df# kq(qv$jְV[r[L4.BA,a.R Tqo<\xN=xz6"Wꇵ]&NI1d_2  eQL1'%{+_LȖd/k&3$M7 ;owږ7N=C%ב8Z8n6swpJyIk8C| LpqX p\S`I:4corФ~'۲9k=z6Nl-8Hk.(([Ve{rwݽ{Miv޲fs#]j^đ!r5|3irX{3"E2j<,w3͌|N%Yå0]Q>.kכ/Ԥ"k (08=5s(QFV$k X1D5hΘU.FMJ2{Pص 6C&m7@<* XC2932`a\pu CNe,E{ƈSy4=olGjiWl͉C I )y~GЊZ$%Hf);J<˴HL6 =RTYt;9QAc=))fjJcR)y83(_D&=i>b@R@Y:8ȷ2n+J|V__%䑤޿t83WJİiƫojsQL`.rT!a}0IpI$eN#U ]̡; Η )(ʙ 6.3JMgO}-PиbCKGH6R7mW.y78=rJɘ)Q@K9fh,HLixi tONiiKX*iyr*SKa eĴ?Na+1#a 7غIūÌR ؄>NLr}]TXׅbJsW&SEH?>/[#\f ogtj4yI0Ɩ*2d QĻ`иB/VwIk2z9`%+URq,\mCeC KcjZN )[`L9['aGh*A#R%: N :n΢vT1|A JUϔ]rsgC]0iHBN$ spTW3]R4Q6Z&5ř+,h$Rd hڌrLa&|+iI[aK㹻iZ}; DF5fFеgQ*Խ?bV3bB>>pW}vk*"#tw{r3cC>֓ةZ~'/Xdt\" sj*WXr-@96[;k]C]qgq+>R\c䉕ZEH< |(zP )-K5z/yPTrx'%Wm|eopcMFMGrQۯ 4)bEu@.ţ\Pѱ B=5Asdɦ\֖;Ot:3jדwkѡ%Ty̞@4nUWqDW&3yL9.NK' .)%CRY@@az uŅJ$㈪ 93FyW@=M 5\1f K7 /ql$+824R(};O"ʖna8Ǹf2gj;.Rd=rj,f Hc1fSdB}cvgOzh9? 2wr4J@-6/]Qt. I> 8SDQ,^7yZB2*iUt12}PFNE,[ <խtxc~b2(|yl-JB˃ OyQZS(ju֬s~M|2̛4\}9r5C{=s8$l ]|-Zde9 A ʡnԕQށ+↬LVL][ę, r+bxOvI.D.ba3ނA#]gR|61]H⡄^Dc[5wbApDN RXrY*[0%Qp8]Sch@oxb8[)="R|=וP5 TQx_&j \}ٸQLɂQ?G4'wTL|w!jKT0-(-i(KEᒚ# jգ}cJoQ1HҦI%!%60,i@3rڱ3(_E/niaX|`){%P=(`>)CU^`q?d,YqI TSU jP]Zp~ːuVO: FE|% QZ5.J@_qoQ |K! HbXlcA[c(ϋ2c"Bz/NӸCp(Q!!%R_;샪 cr2D [ =?RFC}V?H8`5Þ0i!Oo{z.KPz<>9)tQC ]:? OUGr9=3PRZ= %9jeܰ!\tnỬگ* U zͰ``́{tbp~Ȍ?DqNz3.Z)xuе N(iWHV8V"$Eҙ [D %>b.&A ڦshNWmBLTBԿqGtse>AGnӢ/PIJh=`8i)VȏG @0LQ(zoJN)>O)$r}x̳0Onʡ 6&rXux]jt<_ˏ¹/?^`.B/uwBHcO7CCXQ͚ooJ-taGy:^XyȗMǰU9Lŗ:)IfPq d1rڀxƒ}r/ GKۺK)9K֝&tq@RNb2 q@QA+'_հIAKu¡.eu@,f.qIzJHjZiv8l)]lFJH'FH-MZ"[UOqֻIѧm-J҉Rb5Ȍ e+ 62(W1_ڊw(wg&`^+Z!!ӫ_ͧZPUfh2 $'!ư֢$-!u0b P,!ˍrGVޖ]O;( &ԊV( 4'UkTx9P*s-̻v舄x&df_iOf̶`10iat{3R "A()4X1BGq:dy {<#rE '$k?: P INf\@S` FX>qDi!(/[~tX>Gf_ǰ=ŧMKq!1Nb &zn`5#^ArE#-l,醐&dQFgW2M'&D㼞54ZAvF#b/X^ C/Bpq/@s--5H\덫lc<GE~"L?oN*lX C8`{Cәi)e:@Q$]nɾbN U8oxH3%\BϝcDGs-M@[>uKWpS@^^|;1Yd_Ie`y{=J>hFͷKH1zR@CcV'bkљIsvԈC =<۲F'jBg/?.Ua>:î In>GyB 3FexEhtTgjD Ҫ)7j"%a+Zrk@+'G.سNr lNS\ڎLaeYw=Ce->?Yj@ &dZJb!RAj{Z[ˠB1>!vGk5/&*fM)/ !ys7/XKR)ϯF3.w4xzSW.29XgR)7緫=ؚ+~~nBZH갼rf][)g5#v9Bkpr=#sIjסh7eQ/cwK[ :>zDʕ>À젠AyIƛV09lw_L't ڣ.rΊG"Y6!ocRg/#ޝ$ߜK{VLyPz)Zƨ)s[DR7ldWY]CFg\ [2]j,`EN0 o>>j2 ȡaJ8I6CCb/ꔃ0++FOX$a0V%`;a +X86 Vp˳|k2NܵҴ+]`aYl[Ɍ@ozsb4IQ8lVNT=W]j]L4|Xn1M# 97x,‰3 *ø7Ա%h=Dx2v8K&QH`i]͐IM%rs&IrJgA#P:.S}B~ ii*mYAt0,)$JpC&&{z+e5WKx)+&c_"ޗCڪp,E$Ek@R n*Oqٻi5z7!>Ǖp 6NL&8m'R 6Nt56y 4H z:`4:@1#4p al r☯mA 20Ms*rH?UUɟ\My2Q  RAy6 5\N z:Nm7΋E%Zd{%i41*I2*IcTwDKh% y&=惮1w0ɐC!O!?¡lwh zEʶ/|""46W?A ]'w<\;k?sĝ] rRzS񾵶gx+&~4!͉%z75 jr&'&E&1e`ꂣw=}]~)-|z6;E3IiUkMTS 8B}l(֮zߵCsG/9 4'"͟^|) |:a Z5TmBBn?Ү+KJ'9(o d QL5AR<| e:NҹQߚ o0 3Z‡!H"?aE|CaQćģK'ߡ% 0kMgr$ZywbUcgm.S:V~QRf;u=6C M`+3ͧ{\5|'n$ޛ1}oX6nۂ2 LAdl  *za@,  \/qTD̗t3x\qʔBNf7 2uڹT"xiXA'zwZ̮LY:#jͦ\6 UJg T*sѬs佗:^G\U RGg N8(H;\92sDCȩ\RΤdGy~j?qKtlBLF2'^\@*ڇQ@GҐ(LS+bIl gv 4bnwV [ !5]#})(io,OR<'+Oϑ+Y!S$:=^B&t e*#׆739u* H{'Ԓu̞;QS Y?VaT.W)I%`xzй8Xanq  )@'guAyL8\TFBq!+ƄuŻJR"A0=GU*ɣy;iWZX@PDw`eQyM+)3P [wAz.:&ʀk;C{ 6_u@" QUY1sKDiKESuluR."$QwU3\fcfW*e_)sVuJT3*,3HXf[)/I@SCFY6s\VIh.qp[El1StэRt%QM 9=wSdV\`^֓ >y0=Tt.0CT75EdvvýgbC.k" Yz_] gwg>YyRkD'=!C"b|Кh0~p?ZH#&+4CWD }\b:N84#$Fec R<10ᾺK^0g |27jL.#)H_=jJ32G}gKUu]$3vaMYECBYՁHJ4<.#lٌWBk[1k˥aS9˃0H-UjY\/xzjS( ]D4lCtT_TM'* @ZI`e|DP܎^c{fd(oл[xplEzv*$B_2ȵ,IH$7?m/#JƌPBPD:!䁫r\ƈcd04&39|HGVPˑQUJ#gf?kD~ҹ"+24t!zRN1x1t5T#p#˃ZdQGzt5u(OZ GȿJ=y!w{O g` }^q9:AIA:>QGv7q:v8V4. Y+!@,F%Vl q&&gI=j>[-I(zZ-Fp#qΆBQ*z%A&uۍѕM@R[Meyp5p|Jp-OJ+56SG@S*jF<,ھboOɖ[9}o׀+Q`vXB{A,mRkWvOXTU6pXߢc\Z1I&kbYmڅ>D=Bۓ'\ LābhiEpe" +>Ȥ"JhH=7FvI8ұmw쨱ɱ3uQ@f–*ќ Qcb_0@rL>2nj>SEAeVe5&qhLLfL7/JYi#FЃ㠔> >GRL r}~oiuz7Ӷla6=s6R PqGERyU(ʘ'ƚM0_j6;̩>֤\ 9-UP6ʜ=Nf=`V~h- 47[t$ q>-um#̷0 {j^ߦb\˩uOη-Cuo cTyoţk8b1' |ux:(Nv5FCf 4|- SRCl P2/= !n þwS:HpMJ6()@,xQr1/HuS+Mx[ =~7Ӊ#4`IҎp"kUABQ7,-GapеR:[^YmZ]Ⱦ&/c&@u"`usum *gv9S@ڀ|{ڐ>Z*W{-{ꖊ-s16pV>ypHߌ AMC;_u_,W$~#m% ,o׍`}&`V ܰ`X`BLqSu18ʔW\'"v+FdߞNA#O6`Ӈh_Q ŧwC<(κ%]| \+pQ68&=,DqDh}O9=q ~#hi&=^W#DH!CC9TR#+ikRx,zf%z%v;%6IRǷd"c vs 3LpvS6owp7m%ScKD2087սJm\y79W_||*h:T5}s[&v+}j }WB}?-H Do8)[v|^4̀ w[BO*I\NXŸ/ZY*If7%j7t򥜗\L!3[RqὕLf*W므rԿ)͔''J۷hW`[_\;Qn/J[K|##Ř1p \N3q9u`b8Fv(cGC̭wGatsXa䴼 },c<y2ȳZ A8~24 E'zs!W"K>}t$l3?]$&X$ |d2z|f*R~d%r%\5˵] l@`q`6 ǀ=!|s .ms0L-Rx"SLP<(apƬLR8,jiVݬQS$4%707`3 Cpd/0l@̙ǛXTwAoi~n{`DOb Pr>J(+VB2ii54[|ޥ$έᕁ@2&$9fzag)x4) S hؙ,uw͌U4DgB 9!#>!5j!E9\鄑|{C# UA*2 UstEo3єwA[bx75Ƞƥj,NNh[iȡo @ė;sbmfkKriNPnB7}9 4\ut |InB~ ,U3s=Z lZ0X-  `-FD^dgab L^LO] jOK0`Ad 2.RU5 "j0͖XtSA/P$! EK}$iy&εP%yOɜo;&o39UPҒ,`AlGjq⒓ p^xvy&2ug}ZndTyuF^1l .[O/@jdHK}I׋]+NgQ V>bECT3y&'ϭzn=ܧcxU U160+uIPKX ZO)ys,X m,|˩2_^vnE7 *zcÿY$Rvˎ1. M L2^?TD|PCS4ESGژjϠJZ_^[COr4nx ܮݿn;ǖiƟUn^U][IiLe28bV۱ l(ᰙ);d|23Vq9$ĉ]?eC/0=Vrp_@kɳfJb>=3ɉ8}hDRZD,_`(S0AkT|R-t]Y:iׇ$BX @8J׶[vozdX`h& ;蒳% y9E$ YP|h(_$Ƽ\,@3fl:TઠQZ rxZ5̏ر:,iXU֦{ma2pa(2;(ȍ~i&3LhqUlNm]},M 8Pvj i8E#'1k!pLv9;>^GN9"$% E Եd<uXϞ8(ۺgϜAF͝C+t$̂5ϲWIujPécW$tŐ$;lUڦR7=DMcn'&nj&Fܻk\E徳BЬ46rzP228^+Ο=HcօI)d*\ ,bQsJљ}K$jM\gws۞t5i)jҮͻ6Klck2ԝԐȪtw{ƭ'xBꁝܡz {u"FgV;jT!wҜ;d컸99m߉laDwh$lxu~lܩZً+iO%Ғe˖-4+AuYJ[u{2V#O(Z@͕'\ZDsE&J5NP~(ĹNrjI|4[n:2'WܙV]uUulbh?"g`$NpnpcaX*LT(z33$SVru=|{ψ.F 5H@z Ik]bUe7--RA 34D鄘.=2#qү?,Ih-$ [(WVP7@) H!RiNH $H@.etx2|0F:_86\[y)M΁,0֤a m Ty<7~l"ҭ{kcAݢݫh"p=qťA(UW"R? d2mR ӄWEzѨ*<(}LvD@ 5l=&C K>‰traϩ*ր=ig;8d@f @w}ɘ3^XֻqslfrʦqVR=n rZ׌SZT/Sһ %Dv9쀅\;#syBo_cVM)_ГP, eԄPQcJ-KĔkB9dR[(S ?|/v'KP6V!.zv2,A =S(ml;~ؒnRCe8jn`M3D\\P6P];nh{1CدkCT!\trVs` 2fL\Azdf,e$l<>nLRx4ÈP-+)2H2qSy%m"*BkѾ_3VՒ y|443&:Yp24Dt8&%]2r# \*^&%xW&eB v-I!z,I3O䉮bX$ND%^e mXB 6FU̿ 4:Ʃ;EU_1[!+k$/YHl@:2EG c3NG6 ^$FZtN\ݹ51Hp Efإ _j({]"qB%5,]sXf4c~b{q?8L\-rJ+kQi<<%Rq4e7jQ#p8hvۃϞ!1t&\.M9 FrȢ0h 9ph+l^Nߔ,7(&LW!K {n a]D\:e0PVr^J>oYׄQRf{Q?aL:d{Sq;kDZ2DdDEi&qf=µwAFt{s*hah.8I0 UU :2o)=LWT5c Xa)=\^ngfv\iK-_%0$&[!vf'g'dnPjmKӬdiVa! |^ DNZ@ dL><,+/jm54`0J%1</?Ju)q>|f'BFkʧ&>Az9tm8ԼWPgOqq)P'4lTSR?h좙BYI_k_0vRn7g(M}q7&lsb]Go"fMU7 >;'`H|Zvc_e{f,5vSNHY;'Vw6aƴ[Zij֠:`\ 4Gtp"s !NjL>cQFYBvl"ljߔ<|c' K4YIׄdGy=tE1WCUvymPυiwr̎+9qu{"dZ UtrU{ +aVys?y=RΪl9[Vlℐ㕾0p^ *Kht)`N Ya=+t0JAɶcה:o7f0Sd㯄B#ݕRj ajg-5q"#ϨbY:T\& Q:WzHGuWGV@1l8lXɐB4Ql0x V3|5"!py|Jrh8:f/>pBMz|)ogb|hP() ]*TA}'S:B֯.5H*2@w n}9-%]FMqTmF匚&Cz|-_pAMӄsFQ3MϘd Tj$>PCWq}6j\u%! ,@DڋCjĀ +klE:<;GΑ ȡ%LgN)C8BWF$bY/1VP)?J;1U6e %ҵSe%|,9Ϻ(,StT8!nk9OLlLZ|_b] qn)?<%yP8W )xu {!D/6aWQd-Y)OOHE!CAf4tĺ0c<0HO ~M^Wلrm-wWTD`o\'elž,̼iı:wQmTLxU` of+M9@(J胰DϪd1ZW-F%x>#f3 33Ian9CC1qg>~nTacĒCjlh`n9vcށF\\:j?Ak\fV}E5;h,ph0< iT8V'"IHnWG8+eγLKH یjތt0zY€& %{#Pa[ ~8Vڊ,)ؖ佃+SIEtGcYg$`q NT7fbFpCσIै`⠴= E aceTn_R*3@c$Qi"4$s䝢*Q4mB3^EOdJ|6S1\.}oN3*ϚvVijBLLsۘ8$]%Ow$R]h)ivW26; ZꕰQ*?Am,:mTܹ b8H"OS"!6cRنN^bs'h&+;lqW`FT&q E/ "t )͑)5aZʩ/DE` 3$rVu[QeE)|$BdZA9e^nUض&ۚDZU By ;\kqг>*p)YͥHqTSKrU:V'A(Fz Z03@ct'嫓w1Xo\hHL|4 ̓/'TC+!nݦA1:OrFg  $].Nn== S&5'A-Tx"f4'?kG}?mg}6Z |Hw t{r1Mi]S_)"`{ŀGISd1.bGӳ8~%/UXxk8ZsXI ;"N8S(]P,.O|PSWὋvcطݲ JD&?)0ǮG'NGŞ,뺰'yJKuL32A%+hQQ:GqzdʪkuDzo`XLR ~$Xm q6-1@nkEb2'{i {'6Bes!fpC-Fց#{͉0w )S)R9E[嗺Q"?W(ST W`omn$讼ت`]6$}rT`5jkV6$iPn9P.K;ĩ5x$IR2+˓1udӟjq`;.^) (^N֞PZcC7>O%O΃.5H1'оx!_2=)/MfZ0)~Rhͣ;Kjz& MC+!UHʚR]}i ` 5Mn~STtQj7I2NIT3;udqNޠ1XG0j 6#MN3M56Sc1DA rw*FuM4fI ͌wtV Iҧ3t< #*MxD ]Q.8zǔBb˲7)Fj8uͪ}~Uѩ\}ZubJ*% ݩ,j4͈$bFDtrR y6;6LvA&HXn=pNx]bo)O0ὕLf*W~~;J_ bf8DvLd{836{ԊϷ+)<\їݜ-m52&u.&aAԉ%2P3SB?01)e;QLxD$+m o_rjS2S)J2(Mp) ńj`n$@wSv$AWTg˳pBkA1r(iE.cJ\)WO0Ő C%(#G< <G}lP\V7pLٟ JE5/Qd-`tߝ^i&BWhqK>3œ it,?tfnEDiMrݙ}J!_c[U9W Z!dX~0=z4XkV*s4g  y{@xx,.2\z(`,pְ5v nݚJ_w?<H\!WϥP4[xVCض=0,buOjKGYC1◃.ts^<cwnraq,6W5ktX)!? mK ?+k FoQxQ::4ZX:9]Q.n DC}r浍&v D@"2qT?:-OvFQ )8gGIOY'bv@Η@K֝ZF/,[5\DʂT@?vZ HwyJ#HZUyi''s{av*W = 5E0udJ2~ 0X% *X`eU *s{b[ZI {^y[.r D?ȌorF IRpvWQ(nOη>H?nYip*vFɒ,Of@ȔeEw ko[cll9Ti2u#qLܧ!jX ,P $s%G)uֹ\*eDHY:U2 :tƈ?A Z=tvoFg1xgϡk1(Ӡ1x+ڠ%EF3nD2Q Dj/%x0" .8|%L(a*"΁*_I> ;N NM/-jꌸJHFPODnOQ$Ӭ'*@2@3 dEfL`q6ױQ1L7bwwQЖǩ\K'cky!JVPn¹LTp' vj-y{9-f9p#<UJ.؋;BdvCw?2պ^eW:–Qr/m60:=DE2'4^O+jM.A,q&XnҙXڈ4&yҤ4\Ou2[E}ODޠC @#[g)Lʨbg>VgQш(6d^'תAv@Goq kGsD;h[ߙw߭-OmwaȻq:'eʷe2rVMDnx v~[2˓uwX/f*wZ',MrȠt- Z ~;j^Opm3==@D{B2F"qg0oR]shP.<ɅdŌǟd"h甍Z2ʱ~pLJ2lecSp0jaKQ%Xy?/$31'DL2W?)ɰ,˧J,*̟`d{ l:fTs}I7::) }KVCSt?ߗenɪ$_. Kꌀ;i_B-Hp"~u( =jI@{B|8:ZV]{!ԊTCw Hpe?hYEˁy-#h9` }["k>؊py~_|ЋG:'o;lLo˓2-O(˷}Ϗir("納ڻ6l>&%k1)Y^aaK<7?6u,4˰%ǨUHǜdyu-$OJLe{-|3yLtfmĝ9&!Y`d<Ē Hpk!C/!ܩPp:zw;x%:z WP>ѻ!^ͯ>^@zu=: TK(pOEpȣ' 0}"}<"G_mV7y۶<\o) O"p=֢H(Ks˟败6V XeآcTpH~v31':툴tm{3m4&ZE:؋'2瓻Љply)x{q!$SFL&K6w i^~uܽދʯ>C@;݋Ư>S@;8WP% !g H϶0k:9V]WPL@3 us$SAn' _5ܮȣ'6amnOQNK{R[cw2|dF"˶}#a6m)T[e=7~u${-WP_* 7C/"$S&~uܩHz3:JV]oWP_% ʂz+:j T$QI_mN}ۖ~(e桶 13 y(}d#}#ag 3- AǴ`&pL Sf49\06˰Ǩi>ҼLg"mc&ګ矔`Z4 %MuH`tw$ ců=-! Hp.tWP 1b 1w+17 HpB8:wjx:Y@JNyf!ԷHpW_B}w*tOCo}:vV]!wHﰠ!w Hp~A] vuEl9 O|ߖ,q"Y{TD-Vܶ,k(#uޖAe#MG>n4Y k}LJk1)ΙeRMåCft9\:=i tzNtzo{N3J*[ k~jČ' Ch)dRe\Hk01/E_y5a m$C G<=UCc62w1b'+kK`0^H*adK#cfE"lLJ:-@`/ ^.{[Hr~7VUƎv{7Na=E.)~‚ZTLY,tGZHsǖfh=NrC] 1-a]'}T_vܳ=si1D"lYn& R{yZngl~8 ;8v|AeuUd^׏IY-^yRg$jNNu`Yuj_4~[H_HH!mߋ-x!Kb _*E6/TTohi!-k5\nlw >(+"G$Z畮Z5/e~)>t}uuKt=Aڡk"&]K[t=F-?m ^-x}+ȑuE~.*>Z{[I󵚮-cp E-$~YD畖ʺ|^rIY䳼x+-:]9/ur+;S;|]ĤWK[ܴ*myl^m[x xm"íЮv)F#o1@9ztwx&qk|Ae*k˼妻[HY--2l^m^䦻:S;tw{Ĥyאo-Wtr#wo_'"Kw%ʻ2 9)b"{$¿=m-tm{硟ξѣ3磬 (VY?y7ZwiN7vX'Ƽ:S;Ioͤ-y6}Ղ7zF-xc~_zgd>5-;Z+UNօq{XΥwxZC^&a<N6rօx&q:f;B*kr^r VqY[u]NR'0AYDu::B~[GNۦ3+XJ^rd~ׅ"G.[ Ji W*}{ZM65K/zs9%YS敞ZeYH敞$e:2|:Y>敞N#&=+=?LCm{,x!{ <'wáG^2rl1Ăyy" ߋΎp3[k/{ewDl}][ujck'7g~c~~bc;Wc/׳毺Ny|#m3_Fk>6.`OltmzɅ:Y[^k_/h6?p=oxzͽ_mx{ӛJOiг§6o~Ih ?}3ڈM~hv'~f8gm _XU:_ު?ec+oZ_v%So}[7K{K#}o^^_5z_x;^|w?|?=?~;Fb_} X3'?Z|u˞{Վ/7{[cL=F=iwK?W/>|Ŧw6nŇ64ȟ^پMnc+wnk^ރ4bg|ӈ-칽h$Kݯh嗝sÍS\F"u߽l/O= '>x7^XxG޻K?i n_շ75Ny;[;}₭K>Xy7%wE3>?}~vyݪ6^sN'~q>w4Yo~ӟه⊅Ͻ-FoCzNo]kw ?FcXU_ok|Oڹ7V͇K/zh_yw=gv_|F?|]7˧~kw5g<yu JoMFFE~`+ghYW5~߰1uO7^|瞳]5\<.jdKc]]gmie^tgM7zkFW8aviBOo-ls_ՍMm7V>d{_zѯg:r{?7b?s?1x஗}h,郟ev}pߗwHoؙV5V<᧼o{,:"kXk}7/8??c g>[o=_Z:~_={^q~v|^GxH?I _'MUsQtE􈦣r4 ;K/-&0Y[iM|w_i[xկvL51kg6\h9Ra8 NaxO.\tYP?2n6lJF(vv9a8C"}P};v+}(⯛ 6wP?Qu.Jh ·y'Aywk\s-f w/Vk޸hV{Zn>lV # |Z>7lͥilz[vAbu"}-5\n=\xYflM]4!hОa8Fh nw]Ej~܅\wqW=hEc*暋F.iUvO_OPBi~X]藫OhA%tW_nWt* _%~4υ6z+޻ ŅGӻx! q58> z4"<{~\ g}#MsG+s5/631kg5..5Fs.U^f.׳fs- g{!s8+pzDď7K ;s٪qLɟk6_vK2 )VJޮD.dt6[gjfwk~rʦLuf:x$kp}5S5\ ntX?3H@-z<}\.?5͞?Fq8>1|[/# R6wH II8NΐED?-:;r,p~ )@@pti;"®c8]`_z] v}]fgYv}N_#]ˮc߳yv=$]_dחev}]_euv}]ߌ\Ftifp"WCX ~JPIeV~)/Y0'# /YpP~_˸"KՄÕ\VmٽJvDTf )InE (}oVnϛzW=Vi=t>ߙbXx1Lq.,s?U}~E9>݃vJ}]~w|'/{G.z~_ՏV'Y\3WӾiO>ggsCo}ۆ^zdYNA^N-}\i.SJ_!3+HKl.@}Bep_`wGË˯_^GOy[^/8}~Mӿko=kug6[HO`y oʷ#oJ?^v_6?.?򍷽#髮~sO]^7r+7bVnI _W~Ozސ~9OLOS }5P?6w%CwL|W^~䖉߲^zٞ,z'2{ˍߊqKw_~mLOߕxz6?;|]?o=g|KޘlI3_go}.;[o{.yQ'o_s>g{'x^_'OL ~w_?ץ_wo /,?KW=/ҷE O~M;ә⯪[!=WKIJ0;qqƋn'=w>~{5_֋^Y_>ݿ9//<3w c.>X(>+oN_tB/<|z;~~ҷS.O7NxLf}.H-{ W?}~կxۆrϜm)7ߓޙ7zhyW_0}ޞ/~nOY?{?|G-}뷊7._θ(y]_Ii_p^ڮo}_~uoǞ>|8'~Vxއ>,YW<5{6x#{L3;?N?r?sCwdv}WoJs\MçU[}8/=/~Vi}ߟ~=O{sO/L߲8w7}˧;}wlꅻz۷vO~ ߼#7˯p7S{ym/N]?qzӷ2y7">3ʝ|͹_K'q<g}?H '好v߫/~PX~eoL?Cw>[~g$}g]M>kkү>O{C\r/ڐޞןu7~}Ko]}o{xY oG7x(}w_ꁧuK_OMOYxc/ݜ| <='Rk_~co? |~P%c_Jgkmӟ_\7}2+o==oů'z-OSx滇W|GoX7|˟vP.|)+9&^N5O7/zkM \{;_glH'w?N~w^YPGk?k鷾t%Ó~E^73u) ,]aeOЁV+DNqn{9~Kq[ 6\ToXSμdMɞ3>6HN`B5SO9 NU 6^^K(L]1,EIHbю74B߀RAWsԅY̸0j8+H.vIMYT)"J[!?}x2{~q,ض+uWz/~-Ze]$z<%iE$/gՏ9jǮy/ }1߸K][kz_#jveeٶ^wA ՟rK}vp~lAMl%8t]>pхgAʸAI91\\xh9⭫v6 . oaEO4kf}N7ޭ⾼kˆma}!pOl [si]Fk]?'6/4A|=aZ檋yW[]qf\>vеfxDp\Z+\t5nmesNu Z;nd7^C;|ql;EIa iv݅]\t6G,]nuw#\4rkh|v5 _(kri9 A' ׵(Ҟ_ |vM'҅q j \cOǏwB.r_c\sճiNheݦv=f5;_~ҹf%cOqe }_c}! s.atAs#N暽:\.5Z6#\x6ר^wZ ]:2{l5{N-vs#֒ |M\8s6V_.y ׺fs{9Z4\͡ zr$sE7戍߲6 < _ vغSMׂE]!Akؼkcpz/k{ VX(.׳fs- g{r^nsP } (>HnB[C6uфuC{pydZAswa_]8Q< ssE]E;iF\k.!VA 6>і ~_at h|lPh -/q]힙 gt2(]wѼp5thz/!5oKܾ1 QI3My9*EE)S.E -ItK1!Sc"e MJ4zit~g{ws H+\m+\ßONᲐ$'r ]k))pɎ ߠ|ok~ -H#nxITC 3t\|oq##4*}So:)~uNn*P.)nq3TqGxr ڂH:msdR.=|,T'GpfˀEGTwtySרlFނk8C.+o| 1)F|%xܢm:[qʎ oSx@g߸/RqNTۥ</HN{I#զ~H!OW_IIn>T"ՖG3I#CT񙊷T*;r7\8َ_ٲq#!陔T}p'7\mCŇ_TS{_GIu1ɞRq;܆MwеgT1kIUm |{:ʑTu]q tzwGTFIz[?#<Pcnrt9/tՐtq'՜$[QQ^4}KCõ]k;=m;tٕ]k]kwfவw-p [l4UQ_'- Z ӂ>$BH@Z 1d˸ɝՏPK?mՏhK?"-ӧFs hNe8tjSr wN4FN.*!wnݲ`a-$j2{IF6o=?HBWUMWLv,n.iX$O .=9dqV#kx(xvԄ*K¥CsQxo m22 )YEbws?-,6X0ZWb$r/|{ǺQC0-ws=,sc4?'~I8zPu6Ng/l'> 42ns F/`iAߠY*72470Fh? g?+ȡgY|eCNF8~Q֧!?zaw|Z jƁ% ڷRŏc7' 䭢W 7acx6@Zl)>ʐY:Rbd_yzB*oFHP{/"D2*7ApwCsAr_ፐ.W&D =rW>j+ՔoTFQ/aֲ9 [ ^7}p Br9g7ChĊ5@a~2F#pn] 4=&H2?YKnX,Yh|= cXm2;9ܖUO.hj'ݠU!wpo>>@_SzA [TfBD+O -6ͩ_;D쇈( [sDim sxۧR ҝj?m㷬03]6C6+4> YO߂]<,e1sp:͜,@9=4tq7ڏyuAe#%CQyt1QH(de36aU; o<@Ј^Eh"2S/4/S .Oډ^"CHsޱL9P'T|dŧ7m/:ҽdcPSw:>C(r5v#r})Qozٻ{fPZve~H]XX/H=,p8DX|ZxHxtU1F22H׃  { |[x0"{{J4j WWԄ[A$Sؑ/O6aFWrPd O3s7`gC#X}hAdW[R~~1'La 4U!M JRB4BBʚA$&6`.xUv5ROCMgf'ͲT" :BRl/@l;OVї^"30%2} sVM̅4M&o.p "|2~[D4I\bVzj&Dh>! mEߘjZsˏоel|KN1'YhdgVpm}L=+ByehW\A÷dP%tk)?ȱ::t ō[ @,fv1o\e/x> !c:B5U@lS9VVwTG&CbmxXb$ߥS!6 2y&zMb΀8Z)?oa\m:dKX ꙑ7@AӅDMi a}]R; xt~/uY4G-wѼ++PpjM./|5vC:Ӧcٔ00eʫa;u3zұ(P_#'g6?KiE_P̯%iIgVCkCD&|rkR k3i*|!d1/4ٗٳ\ ]b CaZ a3V<8$nўv~ [ˏí'K[1#wP#ﲕc7E=;| $j䗟r5-੉(wxs= j!n(] _%X3e*V;oԋܶ+)"zKt"x蛳4<8%h>|9[2 MwX l(39Su_Nn;SvHxfAV֦S|}޲]J娈,Wdvq7ڏb|!b|!m1^1ewEq;>EeBzh:(9neRCv//n?`A +U۠Slrњ(ȗxYXQ!>S| {7Q0 @;p>O;D[{{:u^Y1?5{ϝv_o SaZT!+!Xqb/; QK=F* _VJNPNzfK!TIj&HzS϶]p n] nY G΁4ew@O͓ ';Bwy䡤Dž{{qabX&ʹZ Nt"`;V_W q|ܵh5u6zI.|MeHU,X 7T!.@Գq`dYzgsV k@';oa PGP <%~[y|`&r͏_f +>MaN<*Sw\o;AQGSaco_!cdE-z: \$گ<עҙ{?,h{7n;OaarE3G=?1s* @}rojpRNJs5xtÎ N76I9 t9di\A$l רxN \VI>)v'|TNvlHR-Iuʞ"]/)&PI\8|.^q>C5M]^F{YHqA3:|:)䠋E5R(V|5R`'L| j*d_$Nܟb U=I]/iΎ>8ElcI\=I"=cXH>@=8'BBɎlR]=1r5*=sc?~k~kst5\dD}o˒A)vLy'tE%$?kx}ǍNI1MvlGxwT\mO5nE'x$q H_{kɧIHF6T穸sptz%TKx\ U{r&\E{ 59lp نFj kAܿ2mQU6]^#5*b4>F~Tu_ڈ5*9qbjY-:Ǡi|oxMmҘ8}kt&'#T ;Iz%ُT!$?]}EGG$]''i#PqT[bU$)Pg*RgOr㼎Jg;{$~qgˆǡ|gR.V~R|Jp ~kRN}5._T$${>JYpv7ߩ7\?)qp@XHU\H\.ObUm |{:ʑTu]q tzwGTFIz[!I:'\{*{q ϹpgrH9Tă]" ]?t5$]\%I5 #VTw8",?M$pE마˜ͷ`|ՐHtD('WvJ 69:W|n 6#5ek֢WYAcQFZ֢[V7:IZLZX^Z(Z+h# A"<0#_5e])r ؖ9t2AѼx"$S"LCLY*XK ֵ-BXAAAA a)2+V" "BCXa-:6"#lB`}5a3#LX[#X 2Ŏlѓ5 .{"CEC؏p !{l 8 E8p 3IS)A`mu<k .!3}2O/G.|X!\EG2@ !a-#@@D`mp!!!! !!!!EW6DB1!m;w !G(B(fx+BO~FgZ&v1³}'}.Oxvky66u6Kl|sU/K޳>?Qz\onrX]Xɋ)|% Iǹ$@'c%[ߓoGJРtO*N~n۴+=g\ΰjxg@H AMo_ y#E0Z 3) *z k5繃*<̡KpJwQP; z7պ)~n*>HeZ^$-d7 vyi.K>G[.!sC7n2nP3y3rPf}Í?ouв =.qoV$Β ^vCL@,dZT?E.0|=1uo ۾ZИbհA{15K~[{\M\6;I-ӓ'I]=O)5\M#\sI?D KX7/>3Y ɮs䒶 S;[=]ugj9yA5jFO!{Sq$]{x5i`!}%]W enrctNq {BhX!H[`H]zx&D/gT{ -P !>_Jk,+=!8G˵?gt}@ba]7p#%vPuPn x3|گR]'~N 풲 }R.>:L(~8c *5d|ȡ矫^e:cu[m͛ 9b|2OPL_ѩj} mF'T[JKdnLҿӃ7;{ Ŏ)p?JpMU=럶"?Uԇx!kɟSbNm`o,z|_&2uļyhy&/;|vr]-^-jeV >9 wu ۣ5$,Cb}Ȁ1߇Ķm`d>: ?bs鮐{wn%0Fck@ѸXAYcclBHW>$.`ss68η 5MC y_?J*~vJn5m(sҡqѣ0/W!BnNN=q{yvFM!U=g CθLLLj]!Xѐ3ubk[(p.2MfaO6DJu?n2L"5p&cCp!%Z]t(2oL\;5f1a V˅Bc?e>1K/p U"="}(09MjMӥړa Y?nk7.vȁ OgZ1%+Los5m })q_WZ/ug*W.x^{\ g^@пGZkI'u2rf~X88Q'^Ά1SB|?Lw\cWʍ5hBByM\vS -q=AuSQ*!kBg5J?g;ܼOCXlִi~kCjh=-{jZ-e} jK_K݁ AcIzȼbr/~>;w9ܖv=6"30 *?/|=s'kּWj u+^u|fVUzIюӾzAAP6zҾz 0ӻU2[a}} ,gDN=[Ii]$_W:CԊ5/B`5f?݂Y w '!_J{O5} 25 ~!GR34*~D^2S}S^U4 R劕|z.f^/n phangorn/vignettes/exdna.txt0000644000176200001440000000024213475602650015744 0ustar liggesusers3 40 No305 NTTCGAAAAACACACCCACTACTAAAANTTATCAGTCACT No304 ATTCGAAAAACACACCCACTACTAAAAATTATCAACCACT No306 ATTCGAAAAACACACCCACTACTAAAAATTATCAATCACT phangorn/vignettes/IntertwiningTreesAndNetworks.Rmd0000644000176200001440000003345313475602650022426 0ustar liggesusers--- title: 'Intertwining phylogenetic trees and networks: R Example Script' author: "Klaus Schliep, Alastair Potts, David Morrison and Guido Grimm" date: "`r format(Sys.time(), '%B %d, %Y')`" bibliography: phangorn.bib output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{IntertwiningTreesAndNetworks} %\VignetteEngine{knitr::rmarkdown} %\usepackage[utf8]{inputenc} --- [comment]: # (output: html_document) --- nocite: | @Schliep2017 ... ```{r setup, echo=FALSE} # set global chunk options: images will be bigger knitr::opts_chunk$set(fig.width=6, fig.height=6) #, global.par=TRUE options(digits = 4) knitr::knit_hooks$set(small.mar=function(before, options, envir){ if (before && options$fig.show!='none') par(mar=c(.5,.5,.5,.5)) }) ``` *Description:* This script provides examples of the new functions available in the phangorn library to 'intertwine' trees and networks, i.e. compare trees and networks and data transferrance. It also provides a step-by-step guide for users new to R. *Methodological advancement:* The major advancement in this phangorn update is the introduction of a generic network object with a wide range of related transfer and analysis functions. These new functions provide the first means to directly transfer information amongst a wide range of phylogenetic trees and networks, as well as means to visualise and further analyse this information. This should provide a platform for individuals to easily conduct tree-network comparisons and stimulate further function development by the community. *What next?:* By implementing full network handling compatibility in R, and providing exemplar scripts (such as this) and [support](https://github.com/KlausVigo/phangorn), the scientific community now has an easy means to analyse and compare the results of phylogenetic trees vs. network approaches. We hope this will open a largely unexplored world to the general phylogenetic audience. ### Installing R 1. Download R Select the nearest mirror to your location at https://cran.r-project.org/mirrors.html 2. Select your operating system and download the relevant installation file. 3. Install R following the instructions. ### Installing the phangorn library Open R and run the two lines of code below in the command line. (You will need to select a region from which to download the library) ```{r, eval=FALSE} install.packages("phangorn", dependencies=TRUE) # install latest development version needs devtools install.packages("devtools", dependencies=TRUE) library(devtools) install_github("KlausVigo/phangorn") ``` ### Getting started ```{r} library(phangorn) # load the phangorn library library(magrittr) ``` ### Set the working directory This is often a major stumbling block for new R users. You need to specify where in your folder structure you wish to work. i.e, where are the files stored that you wish to input? This is done using the `setwd()` function, e.g. `setwd("C:/TreesNetworks/Example Files")`. We now set it to the folder of the phangorn package, which contains the files we want to load for this example. ### Read in the example file datasets: This example files are based on the woodmouse dataset available in the ape library. Ultimately, this dataset is from this study: Michaux, J. R., Magnanou, E., Paradis, E., Nieberding, C. and Libois, R. (2003) Mitochondrial phylogeography of the Woodmouse (*Apodemus sylvaticus*) in the Western Palearctic region. Molecular Ecology, 12, 685-697.) ```{r} ## automatically set the correct working directory for the examples below # setwd(system.file("extdata/trees", package = "phangorn")) # for this vignette we create a path to the files we want to load fdir <- system.file("extdata/trees", package = "phangorn") ## in your case it may look something like this... # setwd("C:/TreesNetworks/Example Files") ##DNA Matrix, maybe not needed woodmouse <- read.phyDat(file.path(fdir, "woodmouse.fasta"),format="fasta") ## RAxML best-known tree with bipartition support (from previous analysis) raxml.tree <- read.tree(file.path(fdir,"RAxML_bipartitions.woodmouse")) ## RAxML bootstrap trees (from previous analysis) raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.woodmouse")) ## MrBayes consensus tree (50% majority rule) (from previous analysis) mrbayes.tree <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.con")) ## MrBayes sample runs 1 and 2 (from previous analysis) run1 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run1.t")) run2 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run2.t")) ## How many trees are in the MrBayes tree sample? run1 run2 ## Combining the two runs and removing 25% burn-in mrbayes.trees <- c(run1[251:1001],run2[251:1001]) ## NeigbourNet Nexus file generated by SplitsTree (from previous analysis) Nnet <- read.nexus.networx(file.path(fdir,"woodmouse.nxs")) ``` All example files read into R. ### Viewing the data ```{r} par(mfrow=c(1,2), mar=c(1,1,1,1)) # Setting plot parameters ### Plotting trees with support values: ## RAxML plot(raxml.tree) nodelabels(raxml.tree$node.label, adj = c(1, 0), frame = "none") ## MrBayes plot(mrbayes.tree) nodelabels(mrbayes.tree$node.label, adj = c(1, 0), frame = "none") par(mfrow=c(1,1)) # Setting plot parameters # NeighbourNet plot(Nnet,"2D") ## alternatively, # plot(Nnet,"2D") ``` ### Interwining trees and network functions ### 1A: Identification of edge bundles (in black) in a neighbour-net (NN) network that correspond to branches (labelled 1-12) in a tree (a maximum likelihood tree, in this case). ```{r, fig.width=7, fig.height=4, small.mar=TRUE} # create a vector of labels for the network corresponding to edges in the tree edge.lab <- createLabel(Nnet, raxml.tree, raxml.tree$edge[,2], "edge") # could be also 1:27 instead of raxml.tree$edge[,2] # Show the correspondingly labelled tree and network in R par(mfrow=c(1,2)) plot(raxml.tree, "u", rotate.tree = 180, cex=.7) edgelabels(raxml.tree$edge[,2],col="blue", frame="none", cex=.7) # find edges that are in the network but not in the tree edge.col <- rep("black", nrow(Nnet$edge)) edge.col[ is.na(edge.lab) ] <- "red" # or a simpler alternative... edge.col <- createLabel(Nnet, raxml.tree, "black", nomatch="red") x <- plot(Nnet, edge.label = edge.lab, show.edge.label = T, "2D", edge.color = edge.col, col.edge.label = "blue", cex=.7) # the above plot function returns an invisible networx object and this object also # contains the colors for the edges. ``` ### 1B: Bootstrap support for all branches (branch labels) in the ML tree mapped on the corresponding edge bundles of the NN network. The edges in the network which are not found as ML tree branches are highlighted in red. ```{r, small.mar=TRUE} # the scaler argument multiplies the confidence values. This is useful to switch # confidences values between total, percentage or ratios. x <- addConfidences(Nnet,raxml.tree, scaler = .01) # find splits that are in the network but not in the tree split.col <- rep("black", length(x$splits)) split.col[ !matchSplits(as.splits(x), as.splits(raxml.tree)) ] <- "red" # simpler alternative... split.col2 <- createLabel(x, raxml.tree, label="black", "split", nomatch="red") # Plotting in R out.x <- plot(x,"2D",show.edge.label=TRUE, split.color=split.col, col.edge.label = "blue") ``` Again we can write to SplitsTree for viewing... ```{r} # write.nexus.networx(out.x,"woodmouse.tree.support.nxs") ## or we can also export the splits alone (for usage in software other than SplitsTree) # write.nexus.splits(as.splits(out.x),"woodmouse.splits.support.nxs") ``` ### 1C: Frequencies of bipartitions found in the bootstrap pseudoreplicates mapped on the corresponding edge bundles of the NN network using a threshold of 10% (i.e. any edge is labelled that occurs in at least 100 of the 1000 ML-BS pseudoreplicates). Edge bundles not found in the ML tree are labelled using grey edges. ```{r, small.mar=TRUE} y <- addConfidences(Nnet, as.splits(raxml.bootstrap)) edge.col <- createLabel(y, raxml.tree, label="black", "edge", nomatch="grey") y <- plot(y,"2D",show.edge.label=TRUE, edge.color=edge.col) ## Write to SplitsTree for viewing # write.nexus.networx(y,"NN.with.bs.support.nxs") ``` ### Extras... We can also compare the neighborNet with a consensusNet (Holland BR, Huber KT, Moulton V, Lockhart PJ,2004, Using consensus networks to visualize contradictory evidence for species phylogeny. Molecular Biology and Evolution, 21, 1459-1461). Furthermore, we can extract the support values from the consensus network, and place these on to the NeighbourNet (this is similar to the process explained in 1C above). ```{r, small.mar=TRUE} cnet <- consensusNet(raxml.bootstrap,prob=0.10) edge.col <- createLabel(cnet, Nnet, label="black", "edge", nomatch="grey") cnet <- plot(cnet, "2D", show.edge.label = TRUE, edge.color=edge.col) edge.col <- createLabel(Nnet, cnet, label="black", "edge", nomatch="grey") z <- plot(Nnet, "2D", show.edge.label = TRUE, edge.color=edge.col) obj <- addConfidences(Nnet,cnet) plot(obj,"2D",show.edge.label=T, edge.color=edge.col, col.edge.label = "blue") ## Write to SplitsTree for viewing # write.nexus.networx(obj,"Nnet.with.ML.Cnet.Bootstrap.nxs") ``` ### There are four possible data patterns in phylogenetic reconstruction: (1) patterns that are well supported in the network and appear in the bootstapped trees; (2) patterns that are well supported by (part of) the data/network but do not appear in the optimised trees, i.e. they are incompatible with the tree; (3) patterns that are weakly supported by the network but appear in the optimised trees anyway, i.e. they are compatible with the tree. Here we demonstrate these patterns by showing the relationships between splits weights, from a NeighborNet splits graph, bootstrap bipartitions support and bootstrap percentages plotted on the optimised tree for a dataset of @Wang2012. (An advanced user figure...) ```{r, fig.width=7, fig.height=6} Nnet <- read.nexus.networx(file.path(fdir,"RAxML_distances.Wang.nxs")) raxml.tree <- read.tree(file.path(fdir,"RAxML_bestTree.Wang.out")) %>% unroot raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.Wang.out")) bs_splits <- as.splits(raxml.bootstrap) tree_splits <- as.splits(raxml.tree) %>% unique %>% removeTrivialSplits # we overwrite bootstrap values and set the weights # to 1e-6 (almost zero), as we plot them on a log scale later on attr(bs_splits, "weights")[] <- 1e-6 # combine the splits from the bootstrap and neighbor net # and delete duplicates and add the confidence values # we get rid of trivial splits all_splits <- c(Nnet$splits, bs_splits) %>% unique %>% removeTrivialSplits %>% addConfidences(bs_splits, scaler=100) # For easier plotting we create a matrix with the confidences and # weights as columns tab <- data.frame(SplitWeight = attr(all_splits, "weights"), Bootstrap=attr(all_splits, "confidences"), Tree=FALSE) # we add a logical variable pto indicate which splits are in the RAxML tree tab$Tree[matchSplits(tree_splits, all_splits, FALSE)] = TRUE tab[is.na(tab[,"Bootstrap"]),"Bootstrap"] <- 0 tab[,"Bootstrap"] <- round(tab[,"Bootstrap"]) rownames(tab) <- apply(as.matrix(all_splits, zero.print = ".", one.print = "|"), 1, paste0, collapse="") tab[1:10,] col <- rep("blue", nrow(tab)) col[tab[,"Bootstrap"]==0] <- "green" col[tab[,"SplitWeight"]==1e-6] <- "red" pch = rep(19, nrow(tab)) pch[tab$Tree] <- 17 par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE) plot(tab[,"SplitWeight"], tab[,"Bootstrap"], log="x", col=col, pch=pch, xlab="Split weight (log scale)", ylab="Bootstrap (%)") legend("topright", inset=c(-0.35,0), c("Pattern 1", "Pattern 2", "Pattern 3", "Pattern in the\nbest tree"), pch=c(19,19,19,17), col=c("blue", "green", "red", "black"), bty="n") ``` ### Figure 4 ```{r} YCh <- read.tree(file.path(fdir, "RAxML_bestTree.YCh")) mtG <- read.tree(file.path(fdir, "RAxML_bestTree.mtG")) ncAI <- read.tree(file.path(fdir, "RAxML_bestTree.AIs")) all_data <- read.tree(file.path(fdir, "RAxML_bestTree.3moles")) YCh_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.YCh")) mtG_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.mtG")) ncAI_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.AIs")) all_data_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.3moles")) ``` There are several option plotting a co-phylogeny. In the following we use the `cophylo` function of the `phytools` package. [comment]: # ({r cophylo, fig.width=7, fig.height=7}) ``` library(phytools) par(mfrow=c(2,1)) obj <- cophylo(YCh, mtG) plot(obj, mar=c(.1,.1,2,.1),scale.bar=c(.005,.05), ylim=c(-.2,1)) title("A. YCh B. mtG") obj <- cophylo(ncAI, all_data) plot(obj, mar=c(.1,.1,2,.1),scale.bar=c(.005,.05), ylim=c(-.2,1)) title("C. ncAI D. All data") ``` ![](cophylo.png) Unfortunately this function does not (yet) offer to add confidences to some splits, but we can do this easily with more basic plot functions. ```{r} par(mfrow=c(2,2), mar = c(2,2,4,2)) YCh <- plotBS(midpoint(YCh), YCh_boot, "phylogram", p=0, main = "YCh") mtG <- plotBS(midpoint(mtG), mtG_boot, "phylogram", p=0, main = "mtG") ncAI <- plotBS(midpoint(ncAI), ncAI_boot, "phylogram", p=0, main = "ncAI") all_data <- plotBS(midpoint(all_data), all_data_boot, "phylogram", p=0, main = "All data") ``` We can compare this with consensus network with the different bootstrap values for the different genes. ```{r, small.mar=TRUE} par(mfrow=c(1,1)) cn <- consensusNet(c(YCh, mtG, ncAI)) cn <- addConfidences(cn, YCh_boot) %>% addConfidences(mtG_boot, add=TRUE) %>% addConfidences(ncAI_boot, add=TRUE) %>% addConfidences(all_data_boot, add=TRUE) plot(cn, "2D", show.edge.label=TRUE) ``` phangorn/vignettes/Ancestral.Rnw0000644000176200001440000001432413475602650016516 0ustar liggesusers%\VignetteIndexEntry{Ancestral Sequence Reconstruction} %\VignetteKeywords{Documentation} %\VignettePackage{phangorn} %\VignetteEngine{Sweave} \documentclass[12pt]{article} \usepackage{times} \usepackage{hyperref} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\R}{\textsf{R}} \newcommand{\pml}{\Robject{pml}} \newcommand{\phangorn}{\Rpackage{phangorn}} \newcommand{\ape}{\Rpackage{ape}} \newcommand{\multicore}{\Rpackage{multicore}} \newcommand{\term}[1]{\emph{#1}} \newcommand{\mref}[2]{\htmladdnormallinkfoot{#2}{#1}} \begin{document} % Ross Ihakas extenstion for nicer representation \DefineVerbatimEnvironment{Sinput}{Verbatim} {xleftmargin=2em} \DefineVerbatimEnvironment{Soutput}{Verbatim}{xleftmargin=2em} \DefineVerbatimEnvironment{Scode}{Verbatim}{xleftmargin=2em} \fvset{listparameters={\setlength{\topsep}{0pt}}} \renewenvironment{Schunk}{\vspace{\topsep}}{\vspace{\topsep}} <>= options(width=70) options("show.signif.stars" = FALSE) foo <- packageDescription("phangorn") @ \title{Ancestral sequence reconstruction with phangorn (Version \Sexpr{foo$Version})} %$ \author{\mref{mailto:klaus.schliep@gmail.com}{Klaus P. Schliep}} \maketitle \nocite{Paradis2006} \section{Introduction} These notes describe the ancestral sequence reconstruction using the \phangorn{} package \cite{Schliep2011}. \phangorn{} provides several methods to estimatea ancestral character states with either Maximum Parsimony (MP) or Maximum Likelihood (ML). %For more background on all the methods see e.g. \cite{Felsenstein2004, Yang2006}. \section{Parsimony reconstructions} To reconstruct ancestral sequences we first load some data and reconstruct a tree: <>= library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") tree <- pratchet(primates, trace=0) %>% acctran(primates) parsimony(tree, primates) @ For parsimony analysis of the edge length represent the observed number of changes. Reconstructing ancestral states therefore defines also the edge lengths of a tree. However there can exist several equally parsimonious reconstructions or states can be ambiguous and therefore edge length can differ. %\phangorn{} brakes them equally down. "MPR" reconstructs the ancestral states for each (internal) node as if the tree would be rooted in that node. However the nodes are not independent of each other. If one chooses one state for a specific node, this can restrict the choice of neighbouring nodes (figure \ref{fig:Pars}). The function acctran (accelerated transformation) assigns edge length and internal nodes to the tree \cite{Swofford1987}. <>= anc.acctran <- ancestral.pars(tree, primates, "ACCTRAN") anc.mpr <- ancestral.pars(tree, primates, "MPR") @ All the ancestral reconstructions for parsimony are based on the fitch algorithm and so far only bifurcating trees are allowed. However trees can get pruned afterwards using the function \Rfunction{multi2di} from \ape{}. The \Rfunction{seqLogo} function from the \Rpackage{seqLogo} package from Bioconductor provides a neat way to show proportions of a nucleotides of ancestral states (see figure \ref{fig:seqLogo}). <>= library(seqLogo) seqLogo( t(subset(anc.mpr, getRoot(tree), 1:20)[[1]]), ic.scale=FALSE) @ \begin{figure} \begin{center} %<>= %<> %@ \includegraphics{seqLogo.pdf} \caption{Representation for the reconstruction of the first 20 characters for the root node.} \end{center} \label{fig:seqLogo} \end{figure} You may need to install \Rpackage{seqLogo} before <>= source("https://bioconductor.org/biocLite.R") biocLite("seqLogo") @ <>= options(SweaveHooks=list(fig=function() par(mar=c(2.1, 4.1, 2.1, 2.1)))) @ <>= par(mfrow=c(2,1)) plotAnc(tree, anc.mpr, 17) title("MPR") plotAnc(tree, anc.acctran, 17) title("ACCTRAN") @ \begin{figure} \begin{center} <>= <> @ \caption{Ancestral reconstruction for one character for the "MPR" and "ACCTRAN" reconstruction. When nodes contain several colours reconstruction is not unique!}\label{fig:Pars} \end{center} \end{figure} \section{Likelihood reconstructions} \phangorn{} also offers the possibility to estimate ancestral states using a ML. The advantages of ML over parsimony is that the reconstruction accounts for different edge lengths. So far only a marginal construction is implemented (see \cite{Yang2006}). <>= fit = pml(tree, primates) fit = optim.pml(fit, model="F81", control = pml.control(trace=0)) @ We can assign the ancestral states according to the highest likelihood ("ml"): \[ P(x_r = A) = \frac{L(x_r=A)}{\sum_{k \in \{A,C,G,T\}}L(x_r=k)} \] and the highest posterior probability ("bayes") criterion: \[ P(x_r=A) = \frac{\pi_A L(x_r=A)}{\sum_{k \in \{A,C,G,T\}}\pi_k L(x_r=k)}, \] where $L(x_r)$ is the joint probability of states at the tips and the state at the root $x_r$ and $\pi_i$ are the estimated base frequencies of state $i$. Both methods agree if all states (base frequencies) have equal probabilities. <>= anc.ml = ancestral.pml(fit, "ml") anc.bayes = ancestral.pml(fit, "bayes") @ The differences of the two approaches for a specific site (17) are represented in figure\ref{fig:MLB}. <>= par(mfrow=c(2,1)) plotAnc(tree, anc.ml, 17) title("ML") plotAnc(tree, anc.bayes, 17) title("Bayes") @ \begin{figure} \begin{center} <>= <> @ \caption{Ancestral reconstruction for fig.\ref{fig:Pars} the using the maximum likelihood and (empirical) Bayesian reconstruction.}\label{fig:MLB} \end{center} \end{figure} \bibliographystyle{plain} \bibliography{phangorn} \section{Session Information} The version number of \R{} and packages loaded for generating the vignette were: <>= toLatex(sessionInfo()) @ \end{document} phangorn/vignettes/phangorn-specials.Rnw0000644000176200001440000003620413475602650020220 0ustar liggesusers%\VignetteIndexEntry{Advanced features} %\VignetteKeywords{Documentation} %\VignettePackage{phangorn} %\VignetteEngine{Sweave} \documentclass[12pt]{article} % setwd("/home/kschliep/Desktop/phangorn/vignettes") % Sweave("phangorn-specials.Rnw") % tools::texi2dvi("phangorn-specials.tex", pdf=TRUE) \usepackage{times} \usepackage{hyperref} \usepackage{amsmath} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\R}{\textsf{R}} \newcommand{\pml}{\Robject{pml}} \newcommand{\phangorn}{\Rpackage{phangorn}} \newcommand{\ape}{\Rpackage{ape}} \newcommand{\multicore}{\Rpackage{multicore}} \newcommand{\term}[1]{\emph{#1}} \newcommand{\mref}[2]{\htmladdnormallinkfoot{#2}{#1}} \begin{document} \SweaveOpts{concordance=TRUE} % Ross Ihakas extenstion for nicer representation \DefineVerbatimEnvironment{Sinput}{Verbatim} {xleftmargin=2em} \DefineVerbatimEnvironment{Soutput}{Verbatim}{xleftmargin=2em} \DefineVerbatimEnvironment{Scode}{Verbatim}{xleftmargin=2em} \fvset{listparameters={\setlength{\topsep}{0pt}}} \renewenvironment{Schunk}{\vspace{\topsep}}{\vspace{\topsep}} <>= options(width=70) options("show.signif.stars" = FALSE) foo <- packageDescription("phangorn") @ \title{Special features of phangorn (Version \Sexpr{foo$Version})} %$ \author{\mref{mailto:klaus.schliep@gmail.com}{Klaus P. Schliep}} \maketitle \nocite{Paradis2012} \section*{Introduction} This document illustrates some of the \phangorn{} \cite{Schliep2011} specialised features which are useful but maybe not as well-known or just not (yet) described elsewhere. This is mainly interesting for someone who wants to explore different models or set up some simulation studies. We show how to construct data objects for different character states other than nucleotides or amino acids or how to set up different models to estimate transition rate. The vignette \emph{Trees} describes in detail how to estimate phylogenies from nucleotide or amino acids. \section{User defined data formats}\label{sec:USER} To better understand how to define our own data type it is useful to know a bit more about the internal representation of \Robject{phyDat} objects. The internal representation of \Robject{phyDat} object is very similar to \Robject{factor} objects. As an example we will show here several possibilities to define nucleotide data with gaps defined as a fifth state. Ignoring gaps or coding them as ambiguous sites - as it is done in most programs, also in phangorn as default - may be misleading (see Warnow(2012)\cite{Warnow2012}). When the number of gaps is low and the gaps are missing at random coding gaps as separate state may be not important. Let assume we have given a matrix where each row contains a character vector of a taxonomical unit: <>= library(phangorn) data = matrix(c("r","a","y","g","g","a","c","-","c","t","c","g", "a","a","t","g","g","a","t","-","c","t","c","a", "a","a","t","-","g","a","c","c","c","t","?","g"), dimnames = list(c("t1", "t2", "t3"),NULL), nrow=3, byrow=TRUE) data @ Normally we would transform this matrix into an phyDat object and gaps are handled as ambiguous character like "?". <<>>= gapsdata1 = phyDat(data) gapsdata1 @ Now we will define a "USER" defined object and have to supply a vector levels of the character states for the new data, in our case the for nucleotide states and the gap. Additional we can define ambiguous states which can be any of the states. <>= gapsdata2 = phyDat(data, type="USER", levels=c("a","c","g","t","-"), ambiguity = c("?", "n")) gapsdata2 @ This is not yet what we wanted as two sites of our alignment, which contain the ambiguous characters "r" and "y", got deleted. To define ambiguous characters like "r" and "y" explicitly we have to supply a contrast matrix similar to contrasts for factors. <>= contrast = matrix(data = c(1,0,0,0,0, 0,1,0,0,0, 0,0,1,0,0, 0,0,0,1,0, 1,0,1,0,0, 0,1,0,1,0, 0,0,0,0,1, 1,1,1,1,0, 1,1,1,1,1), ncol = 5, byrow = TRUE) dimnames(contrast) = list(c("a","c","g","t","r","y","-","n","?"), c("a", "c", "g", "t", "-")) contrast gapsdata3 = phyDat(data, type="USER", contrast=contrast) gapsdata3 @ Here we defined "n" as a state which can be any nucleotide but not a gap "-" and "?" can be any state including a gap. These data can be used in all functions available in \phangorn{} to compute distance matrices or perform parsimony and maximum likelihood analysis. \section{Markov models of character evolution} To model nucleotide substitutions across the edges of a tree T we can assign a transition matrix. In the case of nucleotides, with four character states, each 4 $\times$ 4 transition matrix has, at most, 12 free parameters. Time-reversible Markov models are used to describe how characters change over time, and use fewer parameters. Time-reversible means that these models need not be directed in time, and the Markov property states that these models depend only on the current state. These models are used in analysis of phylogenies using maximum likelihood and MCMC, computing pairwise distances, as well in simulating sequence evolution. We will now describe the General Time-Reversible (GTR) model \cite{Tavare1986}. The parameters of the GTR model are the equilibrium frequencies $\pi = (\pi_A ,\pi_C ,\pi_G ,\pi_T)$ and a rate matrix $Q$ which has the form \begin{equation}\label{eq:GTR} Q = \begin{pmatrix} \ast & \alpha\pi_C & \beta\pi_G & \gamma\pi_T \\ \alpha\pi_A & \ast & \delta\pi_G & \epsilon\pi_T \\ \beta\pi_A & \delta\pi_C & \ast & \eta\pi_T \\ \gamma\pi_A & \epsilon\pi_C & \eta\pi_G & \ast \\ \end{pmatrix} \end{equation} where we need to assign 6 paramters $\alpha, \dots, \eta$. The elements on the diagonal are chosen so that the rows sum to zero. The Jukes-Cantor (JC) \cite{Jukes1969} model can be derived as special case from the GTR model, for equal equilibrium frequencies $\pi_A = \pi_C = \pi_G = \pi_T = 0.25$ and equal rates set to $\alpha = \beta = \gamma = \delta = \eta$. Table \ref{models} lists all built-in nucleotide models in \phangorn. The transition probabilities which describe the probabilities of change from character $i$ to $j$ in time $t$, are given by the corresponding entries of the matrix exponential \[ P(t) = (p_{ij}(t)) = e^{Qt}, \qquad \sum_j p_{ij}=1 \] where $P(t)$ is the transition matrix spanning a period of time $t$. \section{Estimation of non-standard transition rate matrices} In the last section \ref{sec:USER} we described how to set up user defined data formats. Now we describe how to estimate transition matrices with pml. Again for nucleotide data the most common models can be called directly in the \Rfunction{optim.pml} function (e.g. "JC69", "HKY", "GTR" to name a few). Table \ref{models} lists all the available nucleotide models, which can estimated directly in \Rfunction{optim.pml}. For amino acids several transition matrices are available ("WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", "FLU", "Blossum62", "Dayhoff\_DCMut" and "JTT-DCMut") or can be estimated with \Rfunction{optim.pml}. For example Mathews et al. (2010) \cite{Mathews2010} used this function to estimate a phytochrome amino acid transition matrix. We will now show how to estimate a rate matrix with different transition ($\alpha$) and transversion ratio ($\beta$) and a fixed rate to the gap state ($\gamma$) - a kind of Kimura two-parameter model (K81) for nucleotide data with gaps as fifth state (see table \ref{gaps}). \begin{table}[htbp] \centering \begin{tabular}{l|lllll} & a & c & g & t & - \\ \hline a & & & & & \\ c & $\beta$ & & & & \\ g & $\alpha$ & $\beta$ & & & \\ t & $\beta$ & $\alpha$ & $\beta$ & & \\ - & $\gamma$ & $\gamma$ & $\gamma$ & $\gamma$ & \\ \end{tabular} \caption{Rate matrix K to optimise. }\label{gaps} \end{table} If we want to fit a non-standard transition rate matrices, we have to tell \Rfunction{optim.pml}, which transitions in Q get the same rate. The parameter vector subs accepts a vector of consecutive integers and at least one element has to be zero (these gets the reference rate of 1). Negative values indicate that there is no direct transition is possible and the rate is set to zero. <<>>= library(ape) tree = unroot(rtree(3)) fit = pml(tree, gapsdata3) fit = optim.pml(fit, optQ=TRUE, subs=c(1,0,1,2,1,0,2,1,2,2), control=pml.control(trace=0)) fit @ Here are some conventions how the models are estimated: \\ If a model is supplied the base frequencies bf and rate matrix Q are optimised according to the model (nucleotides) or the adequate rate matrix and frequencies are chosen (for amino acids). If optQ=TRUE and neither a model or subs are supplied than a symmetric (optBf=FALSE) or reversible model (optBf=TRUE, i.e. the GTR for nucleotides) is estimated. This can be slow if the there are many character states, e.g. for amino acids. \begin{table}[htbp] \centering \begin{tabular}{|llllr|} \hline model & optQ & optBf & subs & df \\ \hline JC & FALSE & FALSE & $c(0, 0, 0, 0, 0, 0)$ & 0 \\ F81 & FALSE & TRUE & $c(0, 0, 0, 0, 0, 0)$ & 3 \\ K80 & TRUE & FALSE & $c(0, 1, 0, 0, 1, 0)$ & 1 \\ HKY & TRUE & TRUE & $c(0, 1, 0, 0, 1, 0)$ & 4 \\ TrNe & TRUE & FALSE & $c(0, 1, 0, 0, 2, 0)$ & 2 \\ TrN & TRUE & TRUE & $c(0, 1, 0, 0, 2, 0)$ & 5 \\ TPM1 & TRUE & FALSE & $c(0, 1, 2, 2, 1, 0)$ & 2 \\ K81 & TRUE & FALSE & $c(0, 1, 2, 2, 1, 0)$ & 2 \\ TPM1u & TRUE & TRUE & $c(0, 1, 2, 2, 1, 0)$ & 5 \\ TPM2 & TRUE & FALSE & $c(1, 2, 1, 0, 2, 0)$ & 2 \\ TPM2u & TRUE & TRUE & $c(1, 2, 1, 0, 2, 0)$ & 5 \\ TPM3 & TRUE & FALSE & $c(1, 2, 0, 1, 2, 0)$ & 2 \\ TPM3u & TRUE & TRUE & $c(1, 2, 0, 1, 2, 0)$ & 5 \\ TIM1e & TRUE & FALSE & $c(0, 1, 2, 2, 3, 0)$ & 3 \\ TIM1 & TRUE & TRUE & $c(0, 1, 2, 2, 3, 0)$ & 6 \\ TIM2e & TRUE & FALSE & $c(1, 2, 1, 0, 3, 0)$ & 3 \\ TIM2 & TRUE & TRUE & $c(1, 2, 1, 0, 3, 0)$ & 6 \\ TIM3e & TRUE & FALSE & $c(1, 2, 0, 1, 3, 0)$ & 3 \\ TIM3 & TRUE & TRUE & $c(1, 2, 0, 1, 3, 0)$ & 6 \\ TVMe & TRUE & FALSE & $c(1, 2, 3, 4, 2, 0)$ & 4 \\ TVM & TRUE & TRUE & $c(1, 2, 3, 4, 2, 0)$ & 7 \\ SYM & TRUE & FALSE & $c(1, 2, 3, 4, 5, 0)$ & 5 \\ GTR & TRUE & TRUE & $c(1, 2, 3, 4, 5, 0)$ & 8 \\ \hline \end{tabular} \caption{DNA models available in phangorn, how they are defined and number of parameters to estimate. The elements of the vector subs correspond to $\alpha, \dots, \eta$ in equation (\ref{eq:GTR})}\label{models} \end{table} \section{Codon substitution models} A special case of the transition rates are codon models. \phangorn{} now offers the possibility to estimate the $d_N/d_S$ ratio (sometimes called ka/ks), for an overview see \cite{Yang2014}. These functions extend the option to estimates the $d_N/d_S$ ratio for pairwise sequence comparison as it is available through the function \Rfunction{kaks} in \Rpackage{seqinr}. The transition rate between between codon $i$ and $j$ is defined as follows: \begin{eqnarray} q_{ij}=\left\{ \begin{array}{l@{\quad}l} 0 & \textrm{if i and j differ in more than one position} \\ \pi_j & \textrm{for synonymous transversion} \\ \pi_j\kappa & \textrm{for synonymous transition} \\ \pi_j\omega & \textrm{for non-synonymous transversion} \\ \pi_j\omega\kappa & \textrm{for non synonymous transition} \end{array} \right. \nonumber \end{eqnarray} where $\omega$ is the $d_N/d_S$ ratio, $\kappa$ the transition transversion ratio and $\pi_j$ is the the equilibrium frequencies of codon $j$. For $\omega\sim1$ the an amino acid change is neutral, for $\omega < 1$ purifying selection and $\omega > 1$ positive selection. There are four models available: "codon0", where both parameter $\kappa$ and $\omega$ are fixed to 1, "codon1" where both parameters are estimated and "codon2" or "codon3" where $\kappa$ or $\omega$ is fixed to 1. We compute the $d_N/d_S$ for some sequences given a tree using the ML functions \Rfunction{pml} and \Rfunction{optim.pml}. First we have to transform the the nucleotide sequences into codons (so far the algorithms always takes triplets). <>= library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") tree <- NJ(dist.ml(primates)) dat <- dna2codon(primates) fit <- pml(tree, dat, bf="F3x4") fit0 <- optim.pml(fit, model="codon0", control=pml.control(trace=0)) fit1 <- optim.pml(fit, model="codon1", control=pml.control(trace=0)) fit2 <- optim.pml(fit, model="codon2", control=pml.control(trace=0)) fit3 <- optim.pml(fit, model="codon3", control=pml.control(trace=0)) anova(fit0, fit2, fit3, fit1) @ There are several ways to estimate the codon frequencies $\pi_j$. The simplest model is to assume they have equal frequencies (=1/61). A second is to use the empirical codon frequencies, either computed using \Rfunction{baseFreq} or using the argument \Rfunction{bf="empirical"} in \Rfunction{pml}. Last but not least the frequencies can be derived from the base frequencies at each codon position, the F3x4 model is set by the argument \Rfunction{bf="F3x4"}. One can estimate the codon frequencies setting the option to \Rfunction{optBf=TRUE} in \Rfunction{optim.pml}. As the convergence of the 60 parameters the convergence is likely slow set the maximal iterations to a higher value than the default (e.g. \Rfunction{control = pml.control(maxit=50)}). Similar parameters of the F3x4 can also estmated using ML \Rfunction{optF3x4=TRUE} instead. The "YN98" model \cite{Yang98} is similar to the "codon1", but addional optimises the codon frequencies. \section{Generating trees} \phangorn{} has several functions to generate tree topologies, which may are interesting for simulation studies. \Rfunction{allTrees} computes all possible bifurcating tree topologies either rooted or unrooted for up to 10 taxa. One has to keep in mind that the number of trees is growing exponentially, use \Rfunction(howmanytrees) from \ape{} as a reminder. %<>= %trees = allTrees(5) %@ <>= trees <- allTrees(5) par(mfrow=c(3,5), mar=rep(0,4)) for(i in 1:15)plot(trees[[i]], cex=1, type="u") @ \begin{figure} \begin{center} <>= <> @ \end{center} \caption{all (15) unrooted trees with 5 taxa} \label{fig:NJ} \end{figure} \Rfunction{nni} returns a list of all trees which are one nearest neighbor interchange away. <>= trees = nni(trees[[1]]) @ \Rfunction{rNNI} and \Rfunction{rSPR} generate trees which are a defined number of NNI (nearest neighbor interchange) or SPR (subtree pruning and regrafting) away. \bibliographystyle{plain} \bibliography{phangorn} \section{Session Information} The version number of \R{} and packages loaded for generating the vignette were: <>= toLatex(sessionInfo()) @ \end{document} phangorn/vignettes/Networx.Rmd0000644000176200001440000001237213475602650016225 0ustar liggesusers--- title: "Splits and Networx" author: "Klaus Schliep" date: "`r format(Sys.time(), '%B %d, %Y')`" output: rmarkdown::html_vignette bibliography: phangorn.bib vignette: > %\VignetteIndexEntry{Splits and Networx} %\VignetteEngine{knitr::rmarkdown} %\usepackage[utf8]{inputenc} --- This tutorial gives a basic introduction for constructing phylogenetic networks and adding parameters to trees or networx objects using [phangorn](https://cran.r-project.org/package=phangorn) [@Schliep2011] in R. Splits graphs or phylogenetic networks are a useful way to display conflicting data or to summarize different trees. Here, we present two popular networks, consensus networks [@Holland2004] and Neighbor-Net [@Bryant2004]. Trees or networks are often missing either edge weights or edge support values. We show how to improve a tree/networx object by adding support values or estimating edge weights using non-negative Least-Squares (nnls). We first load the phangorn package and a few data sets we use in this vignette. ```{r, eval=TRUE} library(phangorn) data(Laurasiatherian) data(yeast) ``` ## consensusNet A consensusNet [@Holland2004] is a generalization of a consensus tree. Instead of only representing splits (taxon bipartitions) occurring in at least 50% of the trees in a bootstrap or MCMC sample one can use a lower threshold and explore competing splits. Note that, in its basic implementation used here, the consensusNet edge lengths are proportional to the frequence of the corresponding splits in the provided list of trees. The input for `consensusNet` is a list of trees i.e. an object of class `multiPhylo`. ```{r, eval=TRUE} set.seed(1) bs <- bootstrap.phyDat(yeast, FUN = function(x)nj(dist.hamming(x)), bs=100) tree <- nj(dist.hamming(yeast)) par("mar" = rep(1, 4)) tree <- plotBS(tree, bs, "phylogram") cnet <- consensusNet(bs, .3) plot(cnet, "2D", show.edge.label=TRUE) ``` In many cases, `consensusNet` will return more than two incompatible (competing) splits. This cannot be plotted as a planar (2-dimensional) graph. Such as situation requires a n-dimensional graph, where the maximum number of dimensions equals the maximum number of incompatible splits. For example, if we have three alternative incompatible splits: (A,B)|(C,D) vs. (A,C)|(B,D) vs. (A,D)|(B,C), we need a 3-dimensional graph to show all three alternatives. A nice way to get still a good impression of the network is to plot it in 3D. ```{r, eval=FALSE} plot(cnet) # rotate 3d plot play3d(spin3d(axis=c(0,1,0), rpm=6), duration=10) # create animated gif file movie3d(spin3d(axis=c(0,1,0), rpm=6), duration=10) ``` which will result in a spinning graph similar to this ![rotatingNetworx](movie.gif) ## neighborNet The function `neighborNet` implements the popular method of @Bryant2004. The Neighbor-Net algorithm is essentially a 2D-version of the Neighbor joining algorithm. The Neighbour-net is computed in two steps: the first computes a circular ordering of the taxa in the data set; the second step involves the estimation of edge weights using non-negative Least-Squares (nnls). ```{r, eval=TRUE} dm <- dist.hamming(yeast) nnet <- neighborNet(dm) par("mar" = rep(1, 4)) plot(nnet, "2D") ``` The advantage of Neighbor-Net is that it returns a circular split system which can be always displayed in a planar (2D) graph. The plots displayed in `phangorn` may (however) not be planar, but re-plotting can give you a planar graph. This unwanted behavior will be improved in future version. The rendering of the `networx` is done using the the fantastic igraph package [@Csardi2006]. ## Adding support values We can use the generic function `addConfidences` to add (branch) support values from a tree, i.e. an object of class `phylo` to a `networx`, `splits` or `phylo` object. The Neighbor-Net object we computed above provides no support values. We can add the support values from the tree we computed to the splits (edges) shared by both objects. ```{r, eval=TRUE} nnet <- addConfidences(nnet, tree) par("mar" = rep(1, 4)) plot(nnet, "2D", show.edge.label=TRUE) ``` Analogously, we can also add support values to a tree: ```{r, eval=TRUE} tree2 <- rNNI(tree, 2) tree2 <- addConfidences(tree2, tree) # several support values are missing par("mar" = rep(1, 4)) plot(tree2, show.node.label=TRUE) ``` ## Estimating edge weights (nnls) Consensus networks, on the other hand, provide primarily information about support values corresponding to a split, but no information about the actual difference between the taxon bipartitions defined by that split. For example, one may be interested how the alternative support values correspond with the actual genetic distance between the involved taxa. Given a distance matrix, we can estimate edge weights using non-negative Least-Squares, and plot them onto the consensusNet splits graph. ```{r, eval=TRUE} cnet <- nnls.networx(cnet, dm) par("mar" = rep(1, 4)) plot(cnet, "2D", show.edge.label=TRUE) ``` ### Import and export networks, advanced functions for networx objects The functions `read.nexus.networx` and `write.nexus.networx` can read and write nexus files for or from SplitsTree [@Huson2006]. Check-out the new vignette IntertwiningTreesAndNetworks for additional functions, examples, and advanced applications. ## References phangorn/vignettes/cophylo.png0000644000176200001440000003157013475602650016277 0ustar liggesusersPNG  IHDRs?PLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{}}}~~~^ pHYsod IDATx xE 0!rɍ5uUT5",,(@ݕA(\cEA}՝g3T7TuLU=f&;H z@j ( @j ( @j<-hvAM;%ʓuf.GVٗ ۫hRE4ӤҸ{P͍Z]a9= $zVu*თ>5Orsrֲw<˂.QƍD0g梮D ݆^& '^;8J_;!z]\?o'7$ֳP/ ڗ'RǠƒ,xEe͢i*ѭ>qA&K]G^pчn <,/ tx]P&5D󔦢Ftn}]m{uUfttDsoׯh k T\g#z*3UOQ͓j }#hѶA *N)+x`Q~ϦP]y *n?QvpDbM;8 xWR" 3It}-%1xWc5w̝(`Ё⩪+nv 6T V~mۉz*GGۀw}!G >V A]xbzWH J)^-S.D? z mʄP+Xc.&j%gsn׶ K DI)ԷWy\Bv)9gUT~AW>8B휫:.1;Ԡm @]Q=q/'`?[1e\'^9*~Pϧ|6ueDKkC^ %(zSR8%Aig5!(A@P 5H RA@P 5H RA@P 5H RA@JGc@Jz&1 hh/!-mߢ\Q)HX9k椦1ҩ&瀠,Vj5{Uvc=RpI}k]EmybNYhϙ.M烐 TΙ);~6+q*>`YN D+aqnߡ>U$~csgKĤ}}J:}C]r V9?6%h-}roÚO\Xs>QZ˼--[w'ŶCĐ3Z~A:X;h\˔;B*ȝO{+>Sd^\p* wb7ҟK0A9B%'yIMި|QӁ G?!hD6п8ˣ;Jqew| )-H RA@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5H TO#?4*.ZFh #?4jni8rAI[OT[?!OǑ-h&ͧ?.0QFTOǑZF+?m0>qh%Ϣgd9?25AP2nJ 1qyp"d5OI*芾]TGᰛJߋ_#`>}F0OLc˩qM'*]NZ6ARAg*׫pBIO>~2~ \=atSgIJMTЗnu*^W~qʶL;4 qdX}{u]PüL[NG8γk{<@P?}NSDehwq @j ( @j ( @j ( @j ( @j ( A/T+E eM|hRLE &1bњQʑE uTh=$X5{sR4LG/ߝ(~?}}CAIڽ~ji Ƨ3[?v~Lm}&ŵx/-ٶF:zybNY68q*6ж3wO~h>Vta@P; n9ͤ;K¶a@Oq&<$'2N;ptw,7oE,~2R(5@S>Lm\zb<\[7k}\lm-_?ՂJ-3D_.f5mv!7u'[Y=J vןەW|BkwҶsg>7YmR4ë}hx!揬fdMd+ѦA 0F奔@'OPOLy}xyq»q_e}^}ՖzQHKkkJiV,VwM gP^b]RyQ]ę NIewe k?x#sx-p]P[j]Lߨ3~tQ#n5Ӵe5}0?":W.0#]CYl!$4eNТ%6  TF1*|/gf𰠼gR͆}[b 5e>r{{nՎ%" T/D3v08)hK[ڡV(X9ոٮ%N * =ȗφX͉ jڏ(yj/{9?@P3&襃+);K6N?2@/]{9I!ll[ ,kzYǍw{tX<$fQP);a]ʀw[I A Sv~ GvkI A Svx>0nw\I A Sv2Zq1')5+Fk+\μrTQ?3\zPj[SKZΆ0);kg9Vn#$:H_]VA/J? :at-Ll{PĜ/ "xScR45޲LPtM4UnoSZBP3!htt3e񜤁DZA͔sZZA>A}uj8 q  @P+@PǁVAAZ:uj8 6 zϴ_3_A`NϦ|2cף\qE )4591cgXj8 q  @P+@Py3^}@NAL҈:M= Տ* AM 4gfө%<)æclANAeXcJm8 W{Hj*y#EA %ijCKѮ9?|MX׏ӻۡ \4\Y77"-a&D&/kXet^ j"ҲTvSJx"3ʷa:k;b^7?误VoĪ7@Pk*;TT[ o:]Σ̙(iލwkm.*l :@ AaX⯫{3Zmob}2P5 jtR/:dǞOJXj_BAPH)(JsL巺I=/vn/l V(j9 *Q U @P<ɜMB^ U61ia\I ,z@Piz@Piz@Piz@Piz@Piz@Piz{ڴ4P4@P=n1~jėAc JJJJJJjsu1!4!6W[8Jjsu1!4!heNw7Mh1 V9y#J jru֏/L[y+EZuYzL* 6չ6< m;dYzL* kKSplMIE<)nFXM1HA߮q۷r۫չ_:d3w.'3%-|)vm+9R̿o9?mF.j/AcKUA[h!r^3G3šZ杴觗mes|MTf(s&m4T4eE^5:WhϘ7A5 &2255Tę NIKj0Oo"jh4'15@e5ӴebW.le cvo} =8X4 c=@3[ h hlF[ h hlF[ h hlF[ h hlF[ h hliuUA{4c [|+Eۇj lD/jd9d3:k1!lD-6l@ي̲^L*U0Om2ـeB(34AP4bR8m2e|hsAPPqǰ ?=CmdڼeLE ۤ)QAeCs+P=1i䭭,T\öri䘜?wFW!Cʆ"܏&j䐭,cVL/"AP4"d9d+2:0HbBPd9d+2:1J1!G^PoA=           Fo2/֣p_ µ.XOA]vUkc= ~ep ]?끚ǟ*`@PA}2@P_A 0@P/A=9ALdk=0u3XØDcAPcNPMRي<'TX$cAPcJPmRيT Jjry_k>AP?P)GjVm'D<k=vϫWJjV=đampOsFI*[GvsRl7cA3MRيwT&#;by @j (  #w 3ǵ+?#hܹe[6 0f{f| %.ptaSa^/9P;$@j ( A~_ zgF1&_jť,S^~"H5Ȉ8ͥĭک Xj~dDCjv**AF1"4P^xVNek|A1" ۜC;g@>;LjHMY*v**?7zX3ǘaeNEQE%p !7Ȑ8F]NM芝VoP{4Dܶ=+pBQ>;LgzǠrzP4WGN  ] c +w+iq}mMY-؟:G'ť< ڽ;kq𿙀@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5Hw-GVٗ k}ڕphTVD f \C5n4l"z̅g=xTRp4A+*:[i&`LOrsrpUA%tz0ScX<Ԫ܂>xWC Z3c!zɱW}^Kj}z"܂*?c[i&ARuѹ_mOiZen3'/ tx]dW<@ڰ{OdEVG~{II*h3yRݾPޞR+OLX 4R_5>Y*%Gz_f*j m;d>g4Bz3LPiG[ȶf#kĩf91!C߯}>Ve;Tm̝OO/~Z%W+1݅)bu#cSjwO-gp6{΅53;ibڲUxlqRl+;D 9ÏչsƵL #1jYMg;3 tyq$ޫ6܉TH.;2B;o b=Kj0Oo"Fu壍:tǔ\H? A#^AT爛.?W'7  @j ( @j ( @j ( @j ( @j ( F~*'_đ-Zt#]đ5WQvqsrl-'T琧 C4Hӟov(#{HU&OiO;Zɳ(ę1Y$M4-tJ 1qyp"Fe!.衬 Z2e:GT^)/n7ycXNՏM8ldSiʨ@vA=qJ,䈛PR'j?ycXՏï>qܤ5IDATȦV@vA:#{ 'l{MC'VK΋F˴+^zaM+sbX +hVЅ3KӛQ]ę NIЦ"&+e3O⦿ǝ.8cfc4mgVcBP zjPt怠EjjPt怠EjjPt怠EjjPt怠EjjPt怠EjjPt h5P%&3MW|09(v-B6MfL>VFEU۰kA!hT@@P怠EjjPt怠EjjPt戉留! BǃjAiA@i5op@@i5֙.h1_uyl÷]PMΊ4'T琅Nu zý5MnA9;+tQFT}:L5$Z9;+t΢\'2XA] AM4;t,&ym3~ܹVisvvb)^!\6+8TnjE+aÆ9lStxMΊ4'0}g1*ֱ{nuZAPYPK&ggEeKݘ 8!(KYsvbs$V4S6&Yshwc ڀL j9 @P瀠6[R95(qޖ7?C絯?Oh޾q7;;Q%cFF s@PAm: s@PAm: s@PAm: s@PAP7׺ڀ ͘dĵnƄ6 zd V9.1! H n2٭ji ׵{gnƄ6`&&]@o3O< +݈idlLdM&;)nFDٟ1 MڀAi_RAn2ESd梤=E}ŮmeO7t'iV} e,{[P*螭%Ʒ|d53ImDtjcӬ: ^A-cAP]LK&>c@,Cb}%Ab&K&F&訮t-&%AWe!݊ A">Z:  uj(*Q U @P@PGVAAZ:  uj(f#c]^=#;Q׻;z{]j(*Q U @P@PGV9Pky䌉x=?8:mίsOcA%^P]TSɧsCAPwqXʤD Sgm<á 8+&igѮ9?|MX׏y8ug&DZP] j"6i)%{meOp[<%BPW )OkvW$ N;n{Gb{BE趆U j5&i.ǞIȨʥP& A]ƠfLY|MBTvPew@PA]Fue ht@PA]Fue ht@PA]FueټehDrA]&H.c1@P x] @耠.A 24: @耠.AWzV|@jAzoRu<4'*$r~at'ض4;Z;J95h7)APqTS_U>D}(~PC;M02N 3-d(o39df.=(#{c 5A'2@ni=ᖢKgQnT3NAP$hTp.ݝ;KMo-KL5,fA]&\>,"j­^gmb,~[Z͍gNr1sOd8dj?,5d.R9s#^][l ^~,%m'㗈xr\!-?ȟTA#RC!˄i)okkJ io.%o3E9 A]ƒyaq7KxvmG~%ɝ`uN_|&w<}\A]AA}u u h4@P׹iZI uR`$54` 54,4@а@XAAc  54,4@а$*c7g]y% 遠ϟo<z 遠ϟo<z h)iZjbKwĄƦgLɖ AcMIj61[&&56=]z.HX9k椦1iBN_t%&5<%iR?R٫Ze.X^lδՎ Acg rƭ=TF:zybNY6OtZV1f%b38gJlʫb5}ȅ53;i[9%(>'e!+9#,Nğ,KZ,h'~`iaW&zS RuکdF7xC~IgT]' |2&L1$ zFPqNeY$P>E~F_tmN?TT (nn +c*nї;_Fmt% S ۛJ;MaWXT|4Dܶ=+pT%xXs1aΩKA;hN^ UƄ)F?o0N~zrRH-Qt1a?uNKy׷{+w**{3)9:g Do 7 @j ( @j ( @j ( @j ( @j ( @j ( {6JIENDB`phangorn/vignettes/movie.gif0000644000176200001440000055210413475602650015723 0ustar liggesusersGIF89a//__wwGG羾Φ! ! NETSCAPE2.0, $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~B%$#}( " ðǃ ʬŷv 'utƫ9guN(>'nWA!INu..F :ve k )"bJ-+pॿu Ȥ.-HpeKpԋ{ML 0j"VSs rFQe;l7W>1b*ܸ { YS` B;osGt{UuFM%3-X>`4ƦOh0Z_@14vՠa.FU6} iqQDW$mpU@hRu+6Avr noK0>ޝܷ?|=Ԁ?_%`LȄZJ'W5SsOT.v)U1!9'0奕婈Bm8FXPBb`cU$Kd|$ 6Q)ƇPPc|H_QL%q}i@W5]IFXݑ$JrEQ6f8ahqaV6JXgɩ}Z% L1 *F  I~i]#P*W*Y "X NkZJ,JalS(K؞:QmEț}-rrg/ pT$ڻJF1fZ/pcTknVV@+ohPG{-Sh7p^%\ ZhA_1%϶=5 -&ZdZSIt5Ѷ-pl.5Sä206BZwTՀE _'w7 ,˂:^>.ڹ1sа3ݰ@(^]C}^F.z}-S^  ׳ gBuo~&>fC V)Ci z $h>ֳ`G̨vA8+ut a>x`Rrd.H2`!`脇rՒW@t<X 4غ< ?>1q9@%*V$;*AB^Wo&gn\p2%*D>5078!9+x#cS0ʰBX`0Dd#IIBJ}艔kJ (0qI('Iꆣ57|B0.acqd6~Aq!N9^F$:nZSV×xjBU4NunEa̚ ̐Tͼ?!F̊8%4[i d m+3Q8q3SGOr0mډRplJ79O4=ZdR#hOJ@wW26VTRG@ӼDPҹi*9 ,FwEr8u.¨ ux(Wt[{Rԭ^uZ1usZq445YE϶T1,d$ZE%jyƏickҖ[m;F2ʔ|˵^P >/9 "tYPP]F gPsEv]> ={΄noLN;'LF! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~2op qv m >.ߖ:,? +&34uxKI ]B&HIPMu92࢓~옠=MBAm4@8bI3{-rd<| 8z3I@WGUA$5+S/Sᇁa VY FjK7CEhrgȋ@ ~>yf}%1 8YyMTIֶ] ?k8nC!t OI mRp,q F.߈?}\Vv 4Qŏi?/zƐ.c%H)CwdeWO t/[!4_/\p,%X^ `L+uhb?aHc~PTԦ"IEI%fd+fUHkPVѣ9Vik,EZ2M\TiX杙WH'lZ)]qnYXu^ayjfZ40&Y%U(^!(Z1RiNV:Wi:HzjXC|ģ:QQ6jeK\)H*HJ,zҺ>K1kC܊n m>LJ" |X8'/Z/{0Еܻdj=8ň] 0 uN"0Զ@h3zjz/l<]<%CDI&鞏A4+K첑r sBa#ΚUZJ?N{SGM^4F;(ӌha7T$jL|иkzPѯBi%$݈`6^,9 S"˹;:zhza]zfLO6t:qؔ6c@ߠ>o{ФQOHr [d '[ :$lz+?:((ڗI΀YYs@O]uHނK l8ѥ7`k%,JO?NXdL[ V@mli$4KUEnLO/\N C&!|MA2Jg?gJ$dFy,f Ang^G-"mә#@q;$TGP Pͻ`m2`̲J/!!LVLpa-Rj]U9G;R1V|%H 1d*b(]0dMʨR 7 JV :ӗp T+@ݼM< cwpHͪ` zyL0ĵ -d:рN2 6@@uR  i]}STh&P gSK:Q7urc1h֭Ig+*.5.U;橊8pq B6h64E|~LKB/>T ߂~ĄGS^ڸ@sp@?V>(9od'σ2͈[=p1p=ɿx/vA<fOl n@ UADQL=EO\8bԩ` e`F PcӃpY!gBU%h"wy^ԎMiX`2_&ZiHOJh_15XG"i<@pRAa Ӹ_~ U&4ߚfx•pq& ]ec9^iƖm&(؁Сhq<|Enj-)jyPUPJFAe`ޅ ƬgRԞj(^l[ NnZkmbQjWT n[EJlRʮ 6nLHoIJhhJK0Ph:g||4,(9,Ķ0ƣ}T\ q-P)'gϜ%[Ͻ@,GȰHrN,K5TέGSW= ^ huJ8Qꕧ%< ݫ1ЪdD`ug5#+}4{Pì v H>Z c^C4F0Z(t^ @^ L$. i0wϿ, AپE c 5ҭooAn>}sB8 A3Я#]/Lj g: O/h?yx0O‡z.O ` A!p_ <\z/ql; c5DocIQ8-\ՄXBBc$\ W!kax`<*@"j1 !O" S$>ݢwt%.Gv+C6 Oj.r?N.ȩ'cg٣D kXnBb $?b<)C/x44`.*hJ:8PWa߂DЧQVDCb8DŀiŀO4D)L "cܥXN|7"ދ6PC>V^Jl I">7 ۥeCrۗbB)kj ֥f``0v)اr67m'ycӌ&4Vj iuOzzIJv:F8Jƞ'4fAjƫ‚Ab`+R,Nfql-'I-юkŞEDO˺k6kʈ/:oMKD #mGt%FJ^Lvݒ&""R6Yp$ې  \2S_-J ,|::5r  ЇX%Xn7Ps HLfu 0$r8C`$?)S4 ՐϕB8'vfsړ `-o*31=l= Ϋ- =)P u .پ@p `~ųxC|]7By֟'ﭽky3_>?\& П?On#89C_\vuo34W5u3`z"<dz'I @H1vœ  1C@H1sP0G xێл}3BҊU?L 57WF&4 ?44x.Äy3 ~6qo&ƅĄE N)Aq@A.Hȱ FEA#c*^\N)^L@Ɏ)OMW Xǹ%(#u::=>d*tD1W })I4FczVYR7b";_bɋȉ81%s#x,ɒN1cJQ }ϐ4S7HRCچNuRe>QPf=3,ce7鞀*s(*b?Gg#k()R AN */ά'߾v9Ճ"c,Uu#z@ f dm:FA3  rlbP*Z0H jբ@1Uic+Cj6YURcZ}r}`~[ජAٽ /Z?3>ѽl]+潴tmݢi|Kͯ~LN;0&B! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~GuD%q#@o" :$P *' ί۟  ˪ۦX Ҭ 郷%i (gn(0Ր`v8/E1┏La I8Ii=Pp\ʗ*!ǘ脇8Oh4ɨty$ aG>"И^I`#QY.ڗc(H EafvkA# @&guwjէ J:eR(h(ӣRV[i'iGTxj`*ou*k:kzk@@k F^Ƃaj\lolNZ|Z;EflX',R K˞+NjS  ::!n~ 0 'nI0>lDoD`ijm2X #7PXyխ񆚴+@-1zz\5s , `Dj. U2 8L/5O(󝌞k 8uK @<ґ(*]u P.)R]~ n6QG8em\uka,莔JO+2/d#fA#~ҏZjΨBU+ʻ0,/W4nD[V=Q$ mw8 i<8o)0\ U<~-P>d.# ԇpi =S!5`h8X9@X8u ;VHa  ]8`al/ݲ}d)a])ȍ9OT,:^ 2b@"&Zxifg*,p'(*,Laqwm',Kl]ĸFƀ8f(a5r:(cɚ!Jj[.fy86Eux\#ed`2>MbFd"EN (5q^D)L$h'ؖo@8KRL8W怓#ۖPQI G6 nj&=MC 8Zn!ZRT',BiXR|lINxECPt.}Z&$@StL:T 5 FZ ^H-'SK^rZUC#s_Mњy| aD\@H0W<, W浱1%d_   c3ײp6ogUѪ=AeS5ɲV5}m%ţgl~5 8p1|' 5d}A?LT!Ce^R9׈#2Ur!꤉fGЁhGh4Ӆ c<@#(DXzefOF|80%U:WZ׈cNA.IElЅ֜V,4%xV]}bNqJqhX (O U0ΤNaifŦzĦmDBo2*1XNk@:B "lFh6C8 m57-gY{n+DhFn; ΛCj8 kC0XkC  V SE¢f,OEd1I|cF|lA 0 (y g#G@13(/"I$bF#XgVrgdtE+ yuݵ!s`$` vp.@dvJ_?',}ȸS^-QopP{zF5.@?`ۊ;QM`3\ nԹG;a;4/ffO;/c+]{0[ZWZ²SOBeg:|8/%Hk.<@^KH`'ȵ+|+/JAv`_Ґ«[Ei1 `ەfXKdE2 Xֺ-Ea~kERAn^l޺ld\ l\|pa p kO\DfYDipS |69@"nr yF0P-O1xI(\g$L7- D@RO]ub 1`WBa6U[$am $x}w/ 8uӶ9"d6vHD~•@7x;Ry@).TUQՠnjEh:u煲>H)E[|BfΪ@<⏯*؜ @$xN{ :,ngOx7H <of\F>Pkda_ @;_z`@5@rv4eL n.,`3! .'{-z*P"@-#Jr&@SPg= 2$>XV\pWphτNfU1<HraϖDi!w=7#6*E@޴7ҔWkZV98~C4@0%@Kb"-F`dhEbIMbr9H29ɥf陎kSoyS@Fhޚ7KYHD[ PHx,>!=x۟$I k0Jfsq,#"v3&D/ :Jܬೀjhy֨' <=5K&@ 9ħ?LQȈ!̩@:b祡BG)ɪ])F*Q+)R]PMτE 4eC '%FA^2#h *ص3+bžL5I#R, X <ϏOZX-_Q6N ymMzёUn PњqYE[rp0 -mH׃Vͮvz xKMz|Kͯ~L! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~#)" vx~ z^ϗ ͱ_ڝ׶`ϖ̹F[nþ f*, )(4Gf`0-\ÇQ"RX@Qq <  $gU AB|@#0SbzԒ;DT#SyF%U+J \MSʪX @ OeΥ5Ն )Yv;(b: E`NdlH<.j<5jziq[ϸܽ-2bSyω})DgOPlYviVp蜈bqf1qj]Z5%V'RVjFVgNjS0FNp7+L(&ūڄXL.j>{SG0*EȊ-~KRىCAlʾCmNm J | ˀn ڤVxfU -i&fLL0Q 0VNVs2Z ( 0$~z*5  DGbd]|>,Yug5P (uU`Ԫl !eve$} p7NV;`SYO5{QCWpۦO:ma[]0iETCd%KAXش>`%@δjyfLx,?5]یZbc 6B瀉?oV;_~[>5_ܥ20L_ # d5{ i` F0 Jt& D<̅ A0 EP aaxc  j@J"e,-lm$M:Rň R 31s) Z 1V4/}ҫؕT9Hـ+lۚ)tE`G6 jm0\b.̈ޒk 0CB@t"{ >!NZQ͵mK[ج ȳJE:Xk懌>H9uί}l>;@lZ}χ=Nk3o_A1ScZ},!kOGoD{YLT(AK| / XF\+; FA%=0F  Ʃ' A2 #3F X г|r~ 0&p @fPcq $p5l' 0Ѐ Y} 64Ŝ/ 5?7i#\"e*.B;e=9Oj]HUki= a'8c;/><5v|XF`^9 /i~h{#-^wNB2??`0@rrƣ ]gmx1h`R bW ,,@i/t,Mj*HaJH8,`9|! d]D!n&< ~񀹅BdJ2Io8+BhؠMq:$T`A[؀#BdV G5$)%)j|0ScӐ$JHi 7;ưdlcm,mi *@0䈍 >JQdL3!`1 bL)LZ,IHm֣ŨSHELXʍ>iF!%LX~ TH`#L PV(>S`NX |Va,(); - cɆR8d!2RZXh5>%Ia(x0*abtRLҖNT.2>Դ !J)?)9TsũOuJE (Uw4JiJ,H-ZnYkȢO=r*T*P'{^og4v$_a X iYHəviYU*aI١-3ǎiV=O{t2mke pKMr:Ѝt6KZͮvz xKMz|KO! ,//__GG羾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N 3, ~~  ~yvӓ Ԁèܙzٮϻq 䣐`? * F^( ( @_zaPLֿH[YZh!LG,[F /Z?kqXDWR"tP@ERQyeE*uLǢM9U=Prlڲ`:`V56gȵpx^bG5qo2ϻnvgSxο:D# u (]V개R@}sY6s)RY LhL,N8XlSPAq!,Uh[m#34֨`D 6V@ O2%%T _*SM}f4M֘.ɦ =PkOIqqg7UUfޡMĨ]h5)*-xiUi}Je:EXRTMD k:kD:jJ D*kH,>{WlDԇnDk>pHΞCPk= /ΛCn5P -/ P=4p tp  )4>uLqJ"kƱue@'*( ̖@ 0BjmWӻ$p4ǙDs $@O#3 PŽaBE| ^C6%iI -57 T)|Yh=8t}kl8hm,Qاf&khp4 4v>j,t4%M ԙ̑w-B3Xdcᯍp"2a:9Xz{|;soR ϣ'+(h1];a )N: M~:B~0+< N2q 50!;|vN, \qI-`-iB= *@4bJӸnk~D4Z;5\ω ,V#m!(De Wr,`'HQ[(#bbBŮi4#iEP"" =l x!K$MAQsEcһ+Cu4&EIdS`Vkj4eyuY%JX Fﰐ=h*Ua}gթ_FҚMjWֺlgKͭnw pKMr:ЍtKZͮvz:! ,//__޾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N`o0 #| }}   ||~ʲ   }辳 â \A P,A9$i6Bp𗁣OTE!+ ZPUqܠ|ӰNj7<$PIE&A{F^0"!VcA@tȫZ0eFKk]w@P}c3&v\AD$|g)P͜@:tgJj͘W@l٧mwM)as.#Z:>t;_ov8'~}|ͣɮdՄߦ<}6Q?Mka_fTBCF QV НnU) 1ԉ,c:a 6uAT'ҀV\h,b41_ xDu=6ޘK+&I3$ފbO9Y"TfJ֢= %/vQ5%(iˆ֎BD 6'tyꙂimSoNaJTW,ũiƍ:ŘFzUQ*:jN\+CVhkGЊ">KD!tpkA-͎ Dpl;(ˮ۾S+c?Pn8/ [%[`. V~ yg.Vld[ +N?Aflr_`üAuba"$<&jmpZTtL%IF};귫\{`FĀ< BKz_Zȕ ; GDII X9g`IS  c\  㴤%P >9eq^Bh>\QI?OIbMNMqYM?63kaF$>ؾ Dm MA.prtoqUz ],(55qc"E vu"I? =3`g7#,ǿøR;o=*+qTG-90ђYy* TJ!8Z9,`M"1zX-P:р[P0y).xI`HS -L(!jVdSc^*{-)1 nA0`U)P `nJ(BN$]q^5][rsn㊐jivdK)ϖ E i &Š>hVAEeW II{> W|D\mut{Q +@vmPOa&~hADhU>m!M(` [J(PпY[%I6-4ICs⡡P*MJu}5iMSvi*Ba,'$Q$P@#xm&an1w2(h3d`/Z@D[ٲ\3X532D:`ۖVn;;cPhΪ\t"&8u9_w3w{@[DLkWw~Ѡof=3G|Q`W2c&Š ]MH,Pޅ_8".VV` <-0b(0ό)@ (@0{0"UH,"%ȍB.䒹86c$QPa/* 0@%U9Xڥ%`yho@Aک\yiXcZnL6*zIDYJIRUM^JdNpJ*ڄ2WIJL+Z&v` lf~CdЊ{kCj: KCl7/ ¾o+%..J[`ZFW]Fox RYM1|H&BBѣ݀ 0G u"ǎv%T` .I;dFPFZ"Zca^cluJѳIt 2ꇡ:Mi``HV']*zխHIFMDN, /!fKͭnw pKMr=:ЍtKZͮvz xKMz|K ! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~EG%@<$ #'"# $  ̩ʝ& ߎ 䮍"X@!+ rD1("!,!JX j Yc*| v+4[EiF2B(MAPo)-zF¤'|T .TgLǍ0}c*|t tZԵnFzeqa-CnpmBشcɎP)֦ G/ IRDܹ tWq@3YL`6 i6B:#?:A?ǽmA^P?>~Tx| n[..LdϿ;=m xzM{ M| A_sPoamGxG.$C?"`O)7!\R@aJ%8 M9,>\#ȍ~}Jy,ї,s%ƍ8~馗 If`U~u ݭ٦|.(i'w"n Wph[fVi 3c%Ii g`bcz %M/ښk~⏽zR^Fl EZkz mNkZalQ<~GD>mK$̾.nITokĺnGG 8BT||1,i|*@&} wyVE8} / z;36OʉAr@y `ގyx@ѠS lQ)Ts0pW>7a{VMqZfF jz"= U# =&P4!DDQC& UR.zQӰN?:~p?b1/S Wdn3a nZm֓ h-b RU ( F*[IGQCXGL^j|ݘ5*: LO-;&C ~У}aT"OPJ 2kUE]r $A< df!xISA3 p5cO J2S)!>LjPHY8J Ʃ@a|3AP$t -LC~D@ #P-83- ŚfFQ8*BSMmxSBU5FPX* (kRןn13,cĦjU݌^Ez5ef7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz !! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~~-&" w {  s˓vΩѺx ۜɨ ѥ~ љw=臐) kB_q=<W%1q8JgN@YcPdRe7hRi' e OZzySz),_ɯJ@u[ŀ TZ0!~LeL6 v"4 ,e" #N' $R6Y/0B cl¤;̐yOf dl$ŜeVbZ]&(@RQv eZpd LIM< B S)5%‡9)5…DJ)"FT(EF +G5z+ڪkB(<0< ,>ðp@m9~m7l ׮m3K *Ԉٱ-aZbaUWB\,[𡈌sIfQԊY@1T8P\x )WmÚV(KR\\X+L,M9^8Oh,VP&0H0ղ!V\=P@aYL/e V0GA?Q#NBڛe^3LWt4 -MUUcԆ8? vŜx*9kىI ׫;89?cΓfxi"5-`\p騦sqpXp4=5s#wP1n?w}l).O*;}ϱI*@(G;v 4]hb̐$D٧p3:ANwx&brpJ* 1Exod=kS]>S @g.5=o x ģ ajrp\bcWW[v( yt8C @b֮ɴep:f>%{IvW9 {=t [ݍsGbMx̣ϓv@Ӂ/Og?'L- V q `mLH]FTbԍXu%xx*]db0 'Q4\v 92 ,`Fڂd ( ԏ1wؕWZ\Z@VdF ai&;LŬ6f %@$ i睒i$Z?o"/>*Eˡmh qƐ6蘃ZZYkƵm7#Ԥ#TڣPר-v*ފV"~JkTJl;ŰB&lO0K-^Ĵ.amH-BpKmxBE#caNj/)\E/$*ӥp]61/U r/][@gvl#0R5 Yו=*ilac}f^RihkֿX\+*US1QC iiQО| tW8S$uͅ]s‡1V4D'fl,@6a_qdg7v̂'x`N2<0#X^5p{)S?%.Binf:)}N%vNQB*g,~Xsdnk@~d= O"H>b#eǻop{ ,5}H1Ѐ` 4dgI[oHŁ9X3'_T=! 49 B'|T1hTA(K! 9@ yy!:`ջ rp A[!3A ڀv/0 %,ZB(\*X htý䰎f#)Pf`B\F( ndt 0*L(9+pGyTS*@YMj^:Iʥ`sX>VfiT Ȇ@ =`wE ?\[P򙥴,UK+M{(4(4U*{&Yn s5/KJOSZ#`' ȟ2"GLfx QTT'%BK)\zFQ  IqpMf4t7~bQÒm:%q2( ` $F VJ6EY*o$[SªTFUmXX#ͤkk+𡕄+t&Y̕h_P19Քnzu&L*U7{ggG0*'VR ʙ@dU %tNd7aVu,AGx <#/a*x V]$A^Fa&U޽ "w 6@b֪]{ii[@kVw{M3r=o?s Ύ'#w<2~sw|DI式ߵ:7V)o}]lG z ^hNXFI_eǡ~ƀ"a`vyb.b.zQaZ@*X&b4r{%H. 0츕 9oDfYrHN))䒒H^^"\ nd`Uz%옣 H*9pRs[$&ޏD㜾T"o1ډT"fw-t޶ vN48@̦"*JkpORɪ~ 㝤VjSԊl.BqlN(K-^'ӎtzX5Ӯf䩸Rv ( xٗqhMtv.aFC%Ԩ0 ":̏ pX+^D"i r@-#R> aD. A@pv#&<g׀9ʝM R\*ot6$ԏ|R7}q ^q,&8-P |_c,plM[fa;ё ႁUf!"(HGBhM &7L-#ҙ(P0U@@IP<  Т{?D~*4ZUN,%X{⊫I+ĨZT+Y-ՏYW)rnt`ԽL?-a5tTd'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:Ѝt KZ ! ,//wwGG羾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~K n pqxhʭoѺ ڗ ، ˝u ɖ*Be !+1⟉ ,JF? :~od}܃<ԣpL=oXQ'dܽqCӄ4* YPI K3HP5!ސZ Ve.T@ڽmļ*@.}R!g't`'<#9𛲮ˏ tv\(e  ^;  TWM`'ȈݽBNnLdZB'C51K^3|{޿,9y/(R]z-յ}~o<+gE{V_Tԇ`-HBF_NE^ā2`I4"-6-@ ,@ x"ec+*5j3R WLt߬";(]9,P6rPD!J ]̚^㘘R7yן3&d-c%rC'dmˢB3Ǝcɩ8Wݝ%l3gJfQڡĝŮFa3QȦ1Y@j:BՌVS6T(6|CeԉجkvLa9F5 X,Z]^X*e oaPѱVï5.1ֶd4qWp@[.s'Nr[4/? Lb"sE,k<#6t^ (%Z/"CZ#uPY}-j]NKuqU_5G4 Pڤ=6? 0PQp uXګ=zw΀.~&VMBOxU<G* V ޺2bn3κ<-Ҏ=UUiw> ÛN m8ӹ[|)B ݢ6A>0Lm~[:3=>f 8k$ꝥo @DWJBՁ - Y@d*  rd3> ve:@z$k-$ftv$ a`ZW&9 $хhS AޅIaR щQ=5oN uA&qJDU0ʙBX-K9\vΈ vv:@)@?P$3 KFRa;-f(ZH]F(6@ q,,<9:l)Z"ׅBO] MC\ _R2D<*Tь85]3Q!9w`5lSYPzwW8pNT%&OtSUQM$VFīvdT" qh*]T y%NL?VLb6vzBiSB-*Q9|J_K<tQe5|DP3LV3V!:H-TըSrEj\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKm! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~ki r sȾdDZ j ݟ޻ߒp>)ط O ܃PB? (xXQŎ{KRH$K9R\q/:4 ؼ9'u:G(Ѣf}ˀRj֖i:KUT] &AX45Ϋ 4@ۿblUFP J%w5&4 Rr 3_ A' eI(HyQ7p۸eH0$qm-Fb>F%N_">%bA_^E(_Z|q+oѮ^Xÿs>O=)E}Fq:Av 6_LMDD`YDz*WJ"x&PDR 4:lԘP (4`j7=`/4@y#06 c'R.$T/i5heb4__-p_@uoI%fjKWn&VYZV2-9pp1Π[ xK]tŤ4`a%%dڗkwQz) OW$gƇ ٩*KSuV>ex+B6›dTʶjzcIDl5-e-`ۻK+L]:%j+䂜ٚSSbpByG9mK@SdqgȨIg~5}YSrq˝ibьZE}|3@sWGrgs%0%LK֧ayVm 0rZgzE l=olN@X[8/0yߘc- pȮ ՏWN 6*p@zS毃re, v*p;c?HY@Upfy("}o>gۥldjpO޽go[M(/y/XW hn#`v@#(F Y(oչ>}`A@*hoCb(p4O!&X] /",ciQØQs9!3EGO.%/bqU\5SNf|qDc(G8pXi2?> nԉ9BQ+iHYxs'IK'+EJ XI1 9ҥZz.w-o5Қ0ڨQل+Mlϴ+Y %+,1N`+L ,BXNp@Hj 9FM 3{wiMx)d? 7 ʄ\WqZTC&~UF-@VҏiHuRT.+{M(` H3c?O,C-xJCXqp kS>U0 NmpN\kHEN`GY3ikL[ ɪ[@Q!kv7ʰ gըQu6X|[y߹P[^YA`䂞rxa;Hpg6m)/Ȼ8Pf[qMXnL,l/ϡ/Sh>{O~Ϝ%v_aD^G}w-ȅW] V4@ a~X"^aRt!.J![1:b( 1\ێ~U@=CTn)c%<@6 yR2@_P$$ICQIUW c6"*MXjv 8ड़GNH3О' ~A8i {a-Y'hyOIFkҗqwj+2`O(UT@%  Pǜ$XYuӱ6|9Yk^_p'k}I? [s|hnD5g ! !%=Ar,Y0!V<i#R,f< D,M d!mܡ ͠\hC̀k ʘ@X, =@Gt5宠, )hf}iko S}va&v?&@fK3qk WoЀLSAZP|P& P7ZCҕL`A=kN% ;5z c J.g<K~'rޘ;4"T'F0ߘ)x(/=/=  (!2HIP_Q5f26r,KI <gN ߍ2@hs ! )&lABH~1LAۂ?! s)b 2>hvR 5P#E Aw8UК.Q3a(&8VFPY jVGUƉ±(2KM!G`C6'[d=*±]CQM`I'e8"4BtmB4[fFS./ :Q\@QDU`w#'c7P xHS-!#]G`>gQ3Ş;s^kV{<6R hD'e]=Qo.42brqI&Z<< Dm+Ȋp{<7 u (43hs*E\{]'W 4r,B3 Bf$n#Jk7 >c KE`-b_޹t:25Z՘x3vÇcc¾9P{ ¥ex-M&"~! dJ)PBX@ 1MqN` EQ K$tI#v բ)j8$x%s@x @ӽgŰ#n;bh'pڔ@+nP!D (D3f@p/BQZ=qaANͱUc\TtQi\I#jq5kG8ys$Q# j>6ʩm@4 ArAv$<[šXT p,Z 88-Z % r&L7ߙA-8qvfK;M- 0Xg.aF# Pvf)7OAWRJ) ,`&k(XTg)\tŒAw!]gP'+d @Z~%8Yv@H( {pӽȮ QhM^VޒU9 Fi.0D/gJF@ G  ѽ9XA`Mձ~)P\紊>ެgz6pp^wls0~ѹ`gA|CO#=D9/\ X[~['Ouo},2sf$IE}|A;:? SKD!Lx-  L dCw<ɮ!;Z$%tBYb(Êiи҉Qa # NV}?)2ab&\U2GlU "1~J/(bxxQO8*ycS*Ձ=ޑdtP riTQ#]GPQ2F5A`.lʡoP|ԋҏ4)~m?Ȯ0ЁFCHG4JK iKi5#ƕl2"JLfHɨH1)PZ%Y  2R:H%X%LZzXkS I[.qMNw9@:%;9EEzq(LuIْ3 hH<@GKfКFgy4^v0 G'T:TL(\TJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGk! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~FXTM68 ? +AbOETx5x'jG1Ʒe1HRǎ03Π(w, fd/g͝JKTIrڊIPa#,@_RE%FŃSکZΑň (M}fO&c `dɶk2bly4RkH͋ɜ9}Y= >F/`r5$[phԯ&#{zT2[cPARѡc`.liV ;b<܎.MVzg]%4{ڶwNv 4PPqTѱԉJ>%U" Sl!'to=8To#Xej!`2 b DG17:wKLd%xSc%BގX@tVfYO5GzM$G5j5%A 0@!Yj1 QlbtW#-:G}&i1@ǞM>T GvFN|8_됇 Th)!PjC-ű8@[4늶!,z 0@\(r1-~n,r-zq ż mKK 6;b4.v ~|Ĭ7*` EW-P-Ҍf K=0v!ǹ$+4 Fp@3/`tW.򖄾ua`CORj]B3}B8 Y"@=3+M,|G 4@# 9ׇwgi*VWR(s`( ?ڽ J`x-\#q4oF$WVCx;λ։u|{Cs[$Mj|_9Pkz'85.r{0(L8`@# IMI$Oq%w ؝o(J0Ѷ͙0F~r )aN|;TB43 %d+I%X n޲6J"Z,uO?oc#Si%! 0 $?"񑈑66*EQb b>r9Hh&e*RK (Kt`#dXb~-GG)_jZ 7 fDg7a)$ǚ 1ɩ(s:Y49OnZ2MX3 0DXb e*q& L *ȜHO:J0ЇTSLP)F0r(=S@TMgS2*}SRAjԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7Ξ ! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~VQM F/1 8 <'!~X0t Ѐ e3䞇#(xف A#AkSf#M y2KĔt-KˆeY枸V+U I5w)%.Cf-TKSI,i-F|Ec'4#^dDԜĺHYJIkRW?PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'+! ,//__ww־I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~4JF o w hҽs[8%PC|~Kp@u! F_ 1q8ɓu`Y"%[#?BdhLKr9x߂Ji(NCOZCCl`@`y.)RۤXl@ݪZMٿ(I8QzY RX&-gK2敎-ڎ'nap˾N#s8,@P!@w':检!ӝMGG ;nvM_AuK04G&M2\ӨfL}@vzh ZUzhay֡C a?w!QH{ ~ƈ}wvݱ .!~ J0"|xwa#;x$ZѝWC!&0"yRn8H% hjl_@(S'9v'7:v , (?f{(&uL5zrdS#f!S0pfQf:[rxǍnq#$ᦀU\ZI%J.GCaUl}.9xƕ,{bLcճ7[˶[ k\̉ RQ.j`kŮ{L{%cR 8Oj13qcpl(R|L!0*XƜ 3PjiٌK,<_i)Q%0жhEPgO2M~"C#-2Nˢ3C\N)c?Q#Tѿg\y(We@TSb LТCtXD2ބ lĘ6DȳӖMwg#.1:`RT&uてM[CH|bTƭD*SrկD6q)6^RNNGVk/]|TnPdĉ *!U?&cֲkM7 hur](N;Ik[ǝNzBKTM˥d;ӕ(׷aP4{]UdyWxA[X'" xw0`!@'(W0Am<ɗǃtkyd(%E6% H:yߒoJv(JXWGrZq4)'ITr%Z¥-fcʝjJo~ѦW nh8$H2*ʡk  Y's (P@(Wf*FA m!{aoQF&zѧ%~ FFe2B^[`ɡ5b綹.&f [[E= M5WX&6D\Ũ`jE"o6I@{Mḥ0.22ӟW*< ( dBH7,@3#24r=.t:g0(C2+tB 0 -j)0l.1 f#F1LDf&[q ?fOU%-60?EaA DHDfBaM| P<JK9}$ (/bO g4ӛSv5@V'B]̢O_ &d_N#F ÷p3鈒5) yGBh,ҔGYOPyIzd#㹪]oDUs, .s)K*( CIK:$XFI]rk!)=AS^4aӢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZL! ,//__wwGG羾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~J:6 $ "  $p=}A n\uӢ!a_ !AE c>5s/G$GrKu "CŜAQFЦ 8/|O n8i B乳 +L"ҔJ49Gn︴ A6 /B%#Y  f`d jo(skx/4 [x=]aE@{7H(JtB͝b<ꕎq1՞YѽeCSu riח_ӽ!]V}rp?U؇`LĘ4џuwNi\|,he _5%^&KIvy0Pb'J iGdPI$׆2e&@ ZQ|ƍYl="`d)nA䝦i|i՛_@iR+~Q+EZ7+Qd7-* F[*~& PYp^=G؅dЀ#ycAu%I\ "P^x Khfl?8,P .~Rtxkr_b.J QJ/=VS@4 -!q0V|gإ L3p K!,8X ol-L fM- x >3Gm7fc$e3;4CKq LJkUp؉ͶdYĶ2ȩ vq+0w ˬG^Dr,YP䵔v`.:e/~M-"D@NM|f]7|%O+@` OX#/K%@vA N -D_s|4 E*~ћLvqի!܋0#+Տ, e!,!A oQ'ĸlYrPWB!]Rh3A' ?H:3 T AJC0!Җ8H~M*7  KVxéI~pNp"Qb0XÕvxɌ+JrP  "PGb ){_@lf>`0`$茲&H *;C '%C慠%F4AE&~n,)Ą*;:a 1a #yphG(߯Ŵae)a +N@o(,VDrbқĝ#tR_7En02Y"ik!B˂f˜DBND0[hJ.I̧J-zR0biK]<3e-4@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~Ĝ@< 9  6 u# @ ~%^mVM^ AT$xZ5)axƍmAm+XRgDo ɣsf—*Eqf :L(fd y =&Ho7Q @&!L= 8tu4cuқ!:aՙE}ŌgFlt:<6#""VK6Ic&5Qe(ǖ g#qICQ)S$*YY*^i眬ƝiI)蹨oՍh`\ X\@\w%Zy yJE5@^")p2 $է'i Pc:n1vyjk҇֕En+.nI! xZW~lG@(\?b(eDۭ`>R%@%A+C.VhoGp8.ߓwuR->UR*b.Ϲ0d=l~<-۠lΣ֦8 u 0`5 d tM4>*&*HC?ɵ_pכV2]f | PVarzu~wu[oWSݩ8jL xwMON EIS:9p5R.o?}ж췙WÉ\ ^iz'h 1/h" L u]?>|'p?X~I2vnC=#Cʜ8P8 X75hG XbfuLQ|r IfK(d0@D؝~OV6II #(!&sKc(b0,#3@ ){XaȄ` 10h &JQp*>޽T)G.N@Oƿ V(#*|kIcj` Ɯ GS~&@K<F&zb'{DBȖH( 7.d(1Nˢ41-3y X70Y.h2j^7/NhFD}dr[0O!ʧ> :m >LkN"]XD%Jfԣ!Nlc,$`JzH:+~y8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb[! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~ED  B > 5 9ap;l!0a 'BU`m&RCgQIo %0’F*DM7yvAJ'!Yr0hW.do)J"u !~7Zՠ \+ȱtv즡 WBD P@dimҾ uY"PbXF;YĂQ13 pC;٥㋚ʯ30x]ۆ\-4"(C 2q}]>8nnu8o0SWҦ+H=03;6Y?Xج+ /nB ˙Xs{gjn.zqN?TrQm_== NÂqDdX( HS0@ %@[1!ƌIp!5 i-A'ΐ@PH/H|&"!h!WsE֘k4b; ɑ8A@[F䈷uY1qHnf%paكQ^lw*q\*aZ׊d(vТ)G˨]J)-vaE̊h₫KV| E @{`ʧ>Lp\͂AQH@\⣒v&A@lX&d.&):AxGh,ƙ)(1 Ñ}D|+;%!+~X `{0^ql $& [=|hmߔs @QU=6P^VmLi?o](vy $ޖ6*Sx ~wW33`L @@ N _}xUة7-x&E'{x3D ^C}OO}P%+iH e5 bي9j){If5Iɺ/0ʬdеK# 3)0I{kݶt:us`>V@!2>b>.;6(BJhB ͱ~1yjٜ::Mh3j^6g!{gD˃Zt0Q (iLiRSH ԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:l! ,//__ww־I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~QMOǻ J ӻGF =ӷ Nj.ܼC&p6c`ackE"UŎLh-)L!e䁛#02ɓ@A<܅ i!rt@I"n\3z4UVX"~)Hx@hWuNMT^BjC6lFw1cnMO`Uނ-^.qYQKNj֓!=Zi pAwg Q}4𜀂?vtusrC G?dAI<ȹş?Hp 7xCIXCI)} :~I0 `90"xot~W)ᵱ)1#5Uk4<\DRsd\T!U/fkI¢%0*bHjY7$%g%1yIdZhc <#GO5RDv!*ʖhĹY((mߤ)2)~i@Ex^Tg5&Exa*ʄSRU{lxKS+>q*7*!auÒafl 蕁 K†1#kp@g/Ykxk0ԓ/Q@Ϡcy{+pp { &s$r10pd3+ / #okYaP&S* Vi'i. S 3n @mC٨ N/h`綀nq57K靧BUo3;@WW\Su/VEO2pyĭT#< 絛Bk.Z\fn̉'Ek]+yYyƏ-T`%Q NxӢ<\ h@@+ 2I2ͲM6,{^rzaDpa`RB1.z B^=<XhXgD@ M? ,)HP54>-J5 d J!-v} >5PqM̚N5ǑGVq*s!hrBb;2GDԍvӀ<^ cIvQBA 5J.+(i_ WB,كF%0kr\+k¢O،0cZwA6m`S܈!s_uH]afIS~,eiTњ֓gAVnjf QSkJ?+ֈs$uk$I$S\妹Rӥ )ySBrԟfPCJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~CVR T¶DzO ξL   K̲A෿(m~Gs s&-'q"> |akoc-8;6+YrqNۂ<=ʥ(V#Ș!APi-}V.\4uFݚz+DG r0ۡ'$f@*GIκ6?y֠&RR_āFAk/Bes;{ ?#YrJye#G]ZY]&&8v#i(GBEze@+& aGn+|+WJGr* UluʑefJ@ H%kGQ!oY-u ĥ}Sk_.# {<[鍊ŋJ l=ۇP4ozO (@8\@fEF= h< X8jqnfg6`'S-"ߜD:9y]h)˞? ̑t!ʄY0Z'-n+g:2ZD@IE΅m@\ѩm8!HkptfQgP ֠!;X>X !˫GX~T0hE 8c3"T݌o8T9ű\HqjA'yfous "^WxdqK,5i6;gA4nn[b3a*ΩO^ST`f g Vx` b@ :`U<VXamXENbQH&D*.bI2XD6Pz9 cIBYDF]G.ɤ= R@e<%XGutGfÈi]G_zOr͕QI"ٞcbl-GʟgV&YHv ZG8]fI$1PWOu fI 9#ug%@ۣF*w"BR`"U`Y"i.9ft3ȘY1ViF_bf2$Y 89p!/@\ ٟ$\l:& qm (0K 8 a(CVqh` $)0P i0IbXE"@,JHJm$ \@ mz, ebjFh&>fm10o);ze!5i>jC @!k)e2)EhzpŴy-,lgһ@%u?\c~QN 7 , l4Bu ϫеkn:?!SQ.ei"14MvFLknB4mmߤrFr&zM%EԔ]75kbGJ11iL'6 j/9Izal?ua>Nm't gK7 *N~t%!4/ 0 -d } ܛގԯKPdђoL7܂O FpU1DRLnR3G9FV I\%м$U&0Vow֧0gd+h| V4CHY/y&;mPTh +0i "cXY p e6 , .Q]ꀩl 'EL4 2rW"C 0IGXl&_h"Č5*Q!`'g,Ua5E' c*ۈ"1]lJLzEdb qTs# `э(F/BhH`$09mL-fX0y%TAI 줚P ,&P'BK˅A1# Rh=6'th?9Ş|wa0U4%{cЬ p2UJLa3a2K */ o~qBkp*RqiGծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZ! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~.#r$+nÿ&%pƺ"˶k' g `& e߶5% HۿmdXA]ΥSGQ>grśZG;I;"Izpsn jy<)Y%;)i-R9tT7Q 8&Ul}#SX77 񑜉gsd)ⱷqTPpJ+ _#(8-y.Dʇ.yGY/63]ҰKHׅ,pεhodz a\ ҲMz;6ۂ` Eŭgo/bݩӿ_GER,@Z] 6a7v3mzEY EJkXEJD.Va1J^R Rc#,DZ-iČJ61M"Q.cU&dYU`H 8OYDj q%)_Wl@-IɉzY1ϝ!{$>[<@jSns@w 0 |#8p Ô) 8 W'Y gI(؇ۂ5J.v Mvpo#pHSBK$i Iփo\n ;#gl bmIpұ+F*,r #)?w$ !Y- @0uWnv~4%5Aj`4bwz$V~̄.%IR pQYΚlg D. ^8>f|nxӤ'0t;x0M~D, Sw^]㖤 9TTбDTZ8mCU&{@>v߂v]M]Cz?P tBp@ d;y1ua̲?^xi#i2 z (R *@ǭ`:L8n F> qя2 ЇƘ.`a#YbƸX/hUFT>bdՄ0 /{4Ed BTY0ˊ?H'+eb6p uťB.rYaXε;Ja5:tkL$2&KRI^u1 HʫiIPQAd:~ `&wtd%(Fդjcġxr 顯#hJ0i8l m*ylp6 lhִVf6b^ 7v`v!Pf cKg+(c?ivU P0B`Uœ<<{N\g #+5KV^z69lޞ . 46(;ۙn&H {N8 \d4tOO13tdB)]~ ,ol#/M|]y]Ci9 XgpᎴʫЎ1i|!;7P% Q r4Ã')eˆa}BNrd})+&|=vU2! -T4 .ٔ$^HVȓW $p KnQ.1k zNT3H#SѬ4 @j'""T< R6=O-UʠQ>POtZ 2bebH)Nn.)} Ӿ4GIUU^6iJ(@< ∣QXfZp6ãTmX rW!pt ux ԗ6itm\LJbldR [X Z:*&S0OSG%.Vc86L% yG fcKQ,!I:E╴ͨHiCclyf p)M&p&6[*nm/{& )h(&:gu99uҳ{On Ä=|{;hP 4(D3P U%6w8flDmRG5L 戜&'zo^NI&̬&3v7Ng >ENwGtPTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `Kk! ,//wwGG羾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~Ygce`\ ʮU ѻ̳ Zͦ ƻPβ ZuwEܭ_ĢEPc NbbY|Xm`d  Jq4 D|Gj0jy$<Ɍ z&fJelE F'S2+>3tjG~a)U3vQ*֋YWvϥԞvFJ)ʶn !)@u#  x 4U$0dP=P`Z+`fʠQ*+gIZA*n0mC i}s97D|k#.]EL2})lzTdqM7%MPNHxDJXKD]i胅ӂ!р% )qRX-[>HHc C: !=``=((]Z qCxB䘙<*x4݉Otй`jz@r2`N}#_ peTnÉLS)|W*ŠG:Z2 X*q wY2{R6@q0T }Tw$@I$ ĉ*ܹ+7 yDbĹ찵Ie eDR"z -86a.DJ@Kvmh$@ 46:֯GYٴ0:l1S (|ZwnoիkSe%F/F{I ,Wy<8u'q#/k5 _0UK 1VkH&!=E=Έe"J -Y*SArvp*R`/e (LFg!\O ,^ڽ@$!idӼ {[웢s4M%T-LsubJk 9f" ,C3y7y>ZLIȮXMy'9pS"xt"=z"+`7;^'WpMoI '6XLK 4#rw]( 㾿yXREi gYMQ0pDX"l椻19 H홟+tx Fw("7ſ1?ZN@5挌' t BY><!ߣDxt4{/E(x?Ep%x1Ĝ-eG$*v*lNsW|O#Ǚ~ i,x&:SPu`D<"@♞' Χ@T`P #'BAυ~՘L" yR  6C.l:ԩRCD@ˉu&:ĮxxDž$P1BӐmE3T,g%2eTgXzse|MzM-djKֶp\J׺xͫ^׾ `KMb:d'KZͬf7z! ,__GG羾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~yiegbļ^ƬW Ͷ]ş Zɤ \  eVkWp LSsq3u4D1`:N8lJ6$_AI@4-CDsQ44m,`Ρdz"5 R3> ϩb :&*0 ~.-e+bx.m@ ;w ʼn Krt D6}1 p8.P/ASk];{z>]e{wsp)K^f~MDb*DX. jE*q_FL!~h"`E@V"!Ć2eb0 _e>6hĉ''&s~͠g80HB9\MG 1c8 |F@cqT&!Η1ؤ'h & mlYi@$uS'? T5BQ.<)}•5R)h z„)JBjdCVZ0.PVK@(LH*c#xH+寴끶(pkg 5) (@o;AK&pZW $ pP8 0I5W:I-Z?AZ wsbpJ¡ׁ9vΕ0+ uo5.| L#Bn@=4Хޔ~Ib8t|T4SRH UK0QJk]Mv}tRɘo6HEhXmjCD$7u8NjdeZֶp\J׺xͫ^׾ `KMb:d'KZͬf7ىF! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~ieg b ƾ^  Vޣ ]ˤ  [_qzS 5Έ=-9 g;q"Z6nS bZ!6RmQi4"$M虌51R2">s*>yQRz* ֲ_KtmJjT.v pySwWKxB (.?1vx9AE!2{%pV3|A@ٹ'w1w,``۸KUy; Uԧ.gUu:yۆZo>14m,^mU_Mu6  NMqYhD"QQaE|HbX\rXzt1Z〄DV8T3)RM ^a4D5 F՘$1e}|>܀!nL"GMHI +($}dJgJui-҇) |>t`'6ʛ` p ^9,F  c )h~^l'2o p)B3#VҶp\J׺xͫ^׾ `KMb:d'KZͬf7z@! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~iegb ƾ^ ȬW Ϻʱ]ˤ Y S !ӧ[O %A5 z81v8+`/ckf8 {f0tGBW9̀WiE틠ik2ZO+2a_;)(tZ2If;#(h )쓟 '@U Ё`=FP,&x(DIljbkD{ l!I@*.b3)J= ҕv@/.HA͔ M3 ~2sf68#%N2gڅ=_rlfLM%',Zf* cIN) ӾTVĸ~krQxM@˕`Nf#P+LM@װcPҠnV@.l /.Nq㠎/0_p%vm"UCϣsuQj@4y9?+%{ aT>|>Rw}!'T8$ۆ8GV a2@yJY|QO\!;!9DJwbU f@7APV-&&;Hc0$X2O?ftc!؍c[MJق I*!!z:(0J <# A }^懮pfz@$k*Bv& XĢXd -REB~( _[iLzj6ю A Ca0Dhr]" fTZ, rL~7|,Hv4?[ 0|a^5`tBⰐ2CHD" .L2":Pdǖ&:uLSz h~ӓKj&25,EITINKIǩ|-9@"XA%^WM2 ZUKT7@߈]")Q$cOk[z_2H2 0uL1+l>9ő%fv $8)8 R#x''@; ЁnP2tU {(y"* 8T<Ew@jd逫2c.ۧT2z|?SY 9nzAs~Aiqˑm'N@LZ3O劰MXz kofmJuX( 01ax ؄ kgmFr(Y,cp[9F5g4k 1p.gM( Ux6!@JûoOcokbkCtkYh@k׉!. ۾yw<U/o*FC(O  7Z &4~^b5:3fWwhn1n16׮e~b^<`߼/bࡩH\*̍|$7CD! yw,篐bG1~ɨ2p3z &$A$3 mPz` A2y&4RX120 gr2v7 i#\N!7%d |C*Z18ibu@v.*(P:(@~0u胋[6ց6,*#%&],]p"t,g!-hߥ{bc{]XG\`>OܡIE+F>VGvو@=ӗ8l!,(~ n/Hry2={ ݄Wʚ~ $sX6G$A")S|(Ȳ ( >9P}!mTW=Ԣ d{D/N|PGi&z=؁8A*4eE,2y egҫ`ɾ9f6uJ*kԔcYjK5IS'JժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `+! ,__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~Cc_a \ XQзVѪLU |kvrJ-k1=dqb`̘f#3? )2%ɐL f%K/._r)S 55(P3'zTP.E婴KҦ[B"uꕪV`:e+(^> + ٲK΢Mv푶n;d*~2֗=Vp `e$PAm C C(Y 8~쩜V ./͝c.~]2}N~v1  8p`vgPAdE=@5 0Рq7C~Y@˭0<>Dy Xzʬx]6)(5ς;W 4\by7Ї{\-f[<6"]M  @ ŧOr&Yv@^nDv #wU@wD &ΌlX6X "'&WDxgۄּ8Iz tKI^C&"8^Ċ5AAh?*zf`:lqzq~J`* |5jA5<ڢP F ,ʀ z m0 rߚv`%bz`ѵAz"Ҟ@"VKIppJM' Yq!'+$k L1,l˳!P*"g/Sss i2,Z5IPܮ{奐ڠvj MCrL?e瀢3W81a V2rP \%B`&8! I0T.<cX<58!%$F1 hF3kqH hSD}Y =IPm s$G9J@#^ 6R@C Mqc # 0mg!Ma,⮸4he&~kZ r6yt `[<+0oDy*=hgt wP)8zixqf` mc Cbe0$xVHz48cL۬Ub*">ˋ(tG.YI\ H8ENf~9W a%QY{h1㉙c]UHwQ)qKݥ6'5M}4p{oʳ`&ʠ6Mlb#mplj,2ڂrh **R/(JOѕ 0.UDc|k#>[(e9 `*Q&FٳdBN#UGUb:PeUa?yV*TA\J׺xͫ^׾ `KMb:d'KZͬf7z -&B! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~M.#l$+h,jŻ"e'a%Z$ `^ >~lAl*ԇvMO/vۨf;C@uSNA jqSpL"uR7-_>e#ͩknĪVh d(M[)[3QߖzUvxֱ"ʘ%-.= 6 !KJFy\NqxĀuBfnFX |ھ*{378kS,|3]>HJ~'M=̽i#!`^.K^*{=/7)`ྦٯէ_9`q $` r9&X\B2퍃٪A ƂQq0%AېoD:tbF#)MqԬ2,p`dT3}`*Xæ)&;\47(D"6zY Bȏ;Do9}Lݙ՘jT[ժZ5xͫ^׾ `KMb:d'KZͬf7z hGKҚk! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~.#¼i$+e,g"ҿb' ^%- Vÿ雒0{7p7i1 Cuh1j$R|LAh9]L8݄ N7,tshF4tMO a@jdZ52KU,>bRg DlB:Fҗzqمl.l&QK.eAָ-0y+R?d PP&{@`aM#_H(0&x!7u1^.@qa-"Zx'FR4Y9b,7FIÎT!c|C"H}JQǟLfBZ" P#հڞd)}D l*P=HYĤ)g"!:ݢi]?,:Z)!;wZHݕB++Y&*<akzkON+j I5ty݁)ѪН^c. o6;. 8  8@ ,@ATܖwBw1TNl`MeG{1+؊jkB 343Hs0SR$ 0@ Po Pt [5D, b'TmT:*݊*,wnglӺ~뺔ثK-. ̎ܞ'^7rʞVN )l+0%\{ 1K!yۀ2 D w;?8~QzԽrRmÿ:X?ZW@eHp^u@!ŧS(@ 6AdBC\P';!L$EP`؃P!"7!>,HCĩh8{> EٰJ_ ;/U+NTժ}ոUxͫ^׾ `KMb:d'KZͬf7z hGKҚMB! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~u.#d$+`,b"]'Y%R$ XߕvɎţWЛ3!Çy'o:Uj#Ơ8b9@fbn8*F94L4 |S(-sA!jK= n֢vOSZ>lD9PzX׍踒QyFv (WW\~ݎ@bՍV*T >hxbY}Y3YPc9ڢ:M;5jՁrD0{n=F ~<(A:= o(Ep\@#3aC%Իe̗9?  ǒyA`<(V` 8 ?NŁ؃ DžIƣ*Sa '((l$.G6 &4WEB,!0:4=ڠჂK<3P# vOPb)R 1>B*#+%f7geo bRz\)m%0 >v L\YfrymK|P43xs x_q 3+ӑ55.>۵˻YʅģWQ]rT͋]Z=@d'2` ڣٓ@3DS9(ʂ~!\0  `hb5Q  (^ :82X+XCx (bhա_}8(#(tҟOy&4#)b&pi6t R4`(3#8^@Vmހf=BV5;Wi9UPEr1WE8,bJZC[_c&v * 0nM &\ #Jpk2b l=Xj9zUK ..ڃ)n@X÷ [n̻֭S@K/6 evh 7PKpYm2h[pn]|?-RȰB߀8lmv9gp{h%I u <-M"~!7Mo;5_S%v t9wlcȧ sUGCT땽Mn#/0tk0uC@OW_!!X.? V{SG.៽π+0 JMsp !K ŠB yxS(`H2E !q>{t"%UX2ҍ,,]2h| &Fr[,_8 "+͚>'w?wɜ^C}p뺗!_^ك,\5-zf{g\7NyhȌzaJ7GGm1(F8΀jAbQE-{Pbi,;fX :)?֨Y8Ŏ52%Ť0],VJjmKFx.ɢN00YT XU?_T$uV؃ # 879}MC\E%@Zj* Tc (hy"8 6|*- ʩZ̺PK@vQԚˢ ¸JKĸ.HZ .P+!>4VU'5xZ<>Z› ?ɨnLX $@IPSjĪN[ ,h~3>C+dbi]EP/N0շ{Tt5֮\U>m|#FmeHcu7%o)cpH(}I΁.)m5+P<1'74m8Z'ʛsfgsN) "xzJ4G;KJG|i~| ?DXY?D{dn@_y=r>2[M? F6OxٟP~$}AWѐ/9^$ $|L2q D<$B+VfP8P |!<('N !p:A>t 1 4<"谉F!)VB ^\tADF`,#Te41"#]FvoNpG6Q"AʕG5 92x"#E7`pE$#9H䢃29mhZr! (@ո& 9:M9_&6B@?ILZ"o$1*e,kșpxg=ge/4Ne݋4AsM=OqY!AYwC3fvJ h@`$8U\}Ө$A =r]X4]Lmu,ܚ4ְ<ݨ[39Ym궪v}eHMb:d'KZͬf7z hGKҚMjWֺlgKͭn! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~M.#S$+O,Q#"K' W_>TNa#cP`E7v|1Bk (h2 Am):lI3nxpb1%=ަF! ȷOG,Ő0 _U,]@a!@gGa/[$`ܽW]_n]s.VM:Iԡ0.^Eu؂| P\|% (^fluZW<,i4੓.hI+8gPf*4m@&p-&p[ ʚ9 |,#xU<- |l>T#S"y´.ggP/G:d@6S8 D\$4L챹c'͂Q@4߆2F3*D)iRӦ] ^@1 )^mB |YWҚ(4WggTa sysZ@L %pIIۓHp\C|qM.Bi O*'5"fhXyj]ʵJ>) kP魼̧mЗQ{\WM ՐJO?'j$D3]QC#T9^:7 b$ /M >?`{1 : @xAYQ@>C&R 'za$C,WX!PV!>wD'ܰQ!Х%BN/=K |"O >4;撲A4GR+Xʰ+R#4!``TciW,Db%o 4.T2ՒCՁFg4B|rYdA|@7yJ:Gh֘2bH4%#xRXBK޸ɹd|7fiS 5pg>a T^4f]4#CA@ 54;&Oo⓼;P"]Ϋx9ιXYmMM"W6t$zbk kUzuc!P̬f7z hGKҚMjWֺlgKͭnw pKMr:>! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%_$"{-#v ]D 4X]@.G8PlXpEAy.Pt(1Ij a8ɜď9 r$JI#C? rg ԉɩNPw&bPDU2mm;.³z5o*}P! 4@,2,!oE/DAw_ b2'i܄=`}x%ф{=vnp쵝C>yod=tf\bh7&ṯ~3X6‰ rd~ )+$[#:>J+m% NR5NA*30@hhd IʃkR />.//`i 08% k h n- k:1."47*Nw(k0//'B h9lћRӴEwܸVt,3,9\pwF})K . ]-;:+-C(0P(K F#is%Q`cZ]`$c:h'E*8uW7e>&Y9IW%ү>@ ,Y$MWC%;MZ=iie$IPp?i U?L8%#BZ09>nР\ f@a7CB (M%R4r"z((JH!`->^dBbF%-9&,# &59mÑ ݈[dcxGQ1Ȑ F@C)chHld E2R8@BЂdisIAe-0a:t t(`KrpƼMRQ/szR&S)jeCc#DH BXp2xsox( X81Q4Ejڠ* i ÄW3D"8Bn/&{[ї4l'͇!>}^JNj?Dy9i7ϔb *t5&PD/tj,/{8!=ⓨQ]Uieo.,YG ǜէ`=SoB|K\)p['c]jrAaIZͬf7z hGKҚMjWֺlgKͭnw pKMrۂ! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~:%a$"\#Y &?'   3#@6r*H$]9 pP.Ƅd߷}d&L?GD1RmjiPd׆i:H"JAZ~7'C] !2ONL0,Uc57Sd SB[KI9ZH61Ur RDe$Mqлw5_}n^^?nWtGUԿ>l:ۿsXnpV>_ulLh2Fhxj( c&`%TMZ^&Z)6" !&}ƀ 8`]/d'ˆ^@tU ߩq"[BB*@b<'b$ B Aw#=vg Gdpk0&[yv(d,@gR)\ĸg8Ѐ{BI$@a u&3fЦ%W6TQ}6i@yuQ4;r]9i(?NNuKc&നQ!,J«O _ X@ `I .ؒ@'00&ʰ[D m ۋ"+͵.C`0¾5<Ǹk7`\g;t1#@!#/s-0S8; 0P 1oB&w=Elв\^* Iv,9?u ( -`o6 EP2Cfv?ou%|:S<0.g%n UZ*z.t2׺ᝀ`MԭiSRӴW> TH6ǨJ"fI:ش @"f^:&ItRe=S?ح"y^0μ[ f=P?8c()2dŁ]- <k6d}X*dCn` 2N04^̊$[ Ð!=F1q )bV} q 8%1VfQ B|c(G(,L# rC #t {|,";$2=:\%&H$^T-yK8` 8GP9 Irr<Ă v$ya=dUe]' b"nL @ a,KS0 &FNE[:*g$rs3,:IJ2 V xLmga85)NF 8$._QXR ".0w'-R$-Z Z=7yp1ӿZp ?mpGzT@ 0 H0 c~T@m5S̀dE|iHRkb_w17*cdq@^)h4K*rtvA\# isHjb L>X5.ƌG!Ep bҪD (PeZ kfCk5; (lF{<Vi -Ib,X&P~B'{ZZn ^KҼὮ\@-*K"-Jh .m@,"OgϥlsF-$$ 4DMBĺxs .0)3Hқ!<4ؠb[6Q\Qf <.Y7+ĢR)am"ٙT$1Y)<%4Rdp퍤՞ř?!!Aͳ) .e=AğzDM&<6RQ<8<.5 !Oš|\ٍCts AwhybUVqBfkU}B{@/ I"@ɉ6G:}"TJR#Ex! 6s؃p>a(58"g%NAŢ8Dɍ2PSx o\lvP0@W_ ukTs&D,(x =<`H lT,vȀZ )Pcm9"%$_H 8 &I0; `E䡌TӀV.Pws 'G1_e3@fuX1^F`KMydX!>u$|H3f9P%qe7 W`fD- Y$`l d8/(ƚ g1byi"+ NJi2Ò(]jT&ƫ -L` d@ (1$1'Qr\Hdz$v#m@mk!>wj2.p:*\Dr3A %~W1HICE'iES 3p+kG(hU@(a/K W(!:(DD5.iv`Nk&$~hQ[C;IC,rQgIePB -)/$=MuLjwʐt UsӼ|k:Ua!Îst 禱TҲafoz hGKҚMjWֺlgKͭnw pKMr:! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~b%g$"'` #&F(  G#AfM'Ax}p #NC2j, dqdٰ4Ȗ.\A=i'821 4ERK{ UԪ_bu떮^ {e,*%8%lܺWEv/߷zvJ[Ne>m 8,#j&$4g3 ,Qġc>tW)teף"퇽E [Āz<ȸN٦Qܙn~+=u˫x]3`AL>{ @ҐրMaDB@֛ wi Ĕ!r&l ObF t|xE hGe !2J /& IGeM)uDCǀ&Tfc$X%*؇`ƛ?!~ ɣ IǞ9"VD&gǀZr-;{$XRߋ0[a(`#xFo˩ HyAqZhjk/Ji\]w/Zϧe8k̮RȬX"m)Q#,[bHӚ@\Vd2蒀%/5Bpj]PM#ܛo8p + - i'?J)&~oQ۫ ,$'?+?)P+s2@ 0<38١0AG-Wl,̿|BO)xT}5zp2Nj\'k! pÜ2Qsс'182̌_D5bIq97× i!]|O0к뇗ԀU.2>ؕAY~.mN +Rဧvâͩ&u$wU653~rL* 6 6R;D^7U-3T~#\'H;Z_!=!`*r\+hr\Bx\Xj k-vBJaEYQ0I8_ Y|R!T.(93#:]hIg.h|ć˛#Ms& wNo4jhB&GCYoQ9lh   UWihT_I 6GRS"|+!`y'ĺ%+w"BbCMҚMjWֺlgKͭnw pKMr:Ѝt KZ7!! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~ʽ%i$"d#a &G'  H# 4`A~O@h""ZC9opF\tdGDPAPѧnK)SƝHb,BY<$LDLb?ΰJb$')aʓ kYDA tJ7ƒnSBk߉L79(/Q5$!`A0GzE#:]@ڲN~I!Qxke] bMIY4 3XO бASfCŠWV=qhāxMl$@Ms Zl^?x",k-x'I(%DB_FRP ww%7B4o Re ^CMQ3&QD(2az\jg@*V.JnQi=(R${Aqȷ$-pjrHj-{%#X!+/ n^֚ҪC2ƩjB qj,lӢ%H~a1Wn E+]Y̩:ŧZ/͂hpTkV> IOc,+ɧκL"ɖ) <8 3@3C+` $ȃzԫ*Csh33mX12x m hdkY[F*<W+]D4>8mDPጊ 1iCESY7._#C U:Vjp)GW6Aa*!h܅_qC>@ƴ;A>x8ً3˟F/}p]B$%v4Ѩrj-|1Jn 3X/vC7h Ih0GVX^A^@n-⧇1, _w!yp axpmP! 5fuL2 qqS 98u(2NpDPp<4PJ=g+ uH-.]k`(bӊ!ɇ0BuxW.~)iUDa#/pAX D&Y)d''S4{ mhA۩ %Z8Z`x:ȦA_ʃBY5 4`@TPxMjxU%MhˈKI2am,6#v2O`at9iL}BiMtc DY-ుMz);P"fjta G}'N?ǂ8w5]_s? -iM'L4* nZmlQH:DBulT4! gO"䴫:jd6U~&` @J}yڽ`(2pi>(E#:I&\o~e“رJڍC6)[%=t^H݃qկ݊$SDH!;& } s̸Mg#i>Plj{1' pM1bv"cZ[J;`` Y'ԝXep;Ic@!O) [լé^>8Aguyu ] &N|fI( d 64AQb> VpuwUH7hb9dTHer#=dVM.7ȋ6kqbaw(`;pR~4Z^4#fiAme($LȦV7#]%dd#dZjE}j舜Zƌpri1xhKcJ2J^+)ʬԺŭҦ,eyKX;c.[5BP-.NgXN&"h u\rN얙 W1q:+ʸ`sE"b @3 4/:r PG}s(st;/Qwצ@ ?U L6mr./6iPtlGy0-i 0l5|,2"kLK_%yzʃנt4ED-߲dTœ9s, ,i heA֘*LPV!=)laSn^< d0/˻fp='QT9V FHSE>B>lp *ĆKC.(a@X A4"!v $ʪjW(B1z ܄vy!${$HDꆇ2D~x$0A,$7P!Z.&\U@\d5wp]_bz9h1#>b eTf !ZE(hSc3~azqֳ!pm`sP>h[ P5RlA@c"C⩒ 9S-YetMLܦeuIr#5-@"$ N< )/;'7{F4KzD |ByBzӘ_Abr~S*Jb:N@Gsxh(}=G'"Hz iNFRrx%3()R_ѥ`NUOJ變.@6BХ57IјU5ʺEU*=@;Nmkdj 0L:ƶ@c'KZͬf7z hGKҚMjWֺlgKͭnw p3! ,//__GG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~_ZUR ˾8 9 BC-XLq pCy JL8bt$+XG<^QyW`t2 ,PpΜ>!2riBiS=6JT+]*9@N,fG'it[tΪq/&T[ƍqn  5^J [\d-̳AC~X $\_M* \w?x~Yxu\pK28ΞRnx P}vxמEe9=-7f)W,4ԁ!-7No^H.X:eAH Лpf ,Ĩ+*ypZ#-耍hCג7`>M1+H%#E_Gvsp.0&Oi6"Yb9"KS0\x@x R'}"gv'if.hFQ>{*B։&WY藋:VeA05&$Vjʭ(FC"yA#+N٢RD*:p^eٜ~ꎈ<]cǶҬPWvYvVJ+ 3k TK&p j&yp)TǺ9  5#`nϪ3b0 TlL:|Ңx-\wP[#"s ċR  ,u`,v"4N$}5TDHU"wٝj(smz. Δ9w筑7Be͖I@RNJOԩzAo|:Hff^@{.P};.nY|FҭMbQpv^$OcEV I+У&k*ާ*3Pq68TK1?8XP|Eq!0N`k\s8a&E8暘P=*?’b8hSN#4914j0B8p'lˠ>#"GE ; / 0,H7+>4#hI06E)7+]1PL詑)`)RS0ԥe6u_~.[jR9ptM݈IME=|Ԭh@2-θ"]ٜWDj]ʱEتX,6d'KZͬf7z hGKҚMjWֺlgKͭnw! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~s%j$"e#b &H'Q" N~ 0 ޽k& 7 8HRG&3$ɓISH/ D~`6xmrӉ%- u2+j@TB h0!G~X/W͞rZvP"[vr[Ơݡy9@/R>z-Z6{ (!f#\^2!Go2h# ^'ʾM\ (@'sՆK'|2B.sُWǰ;=0mPc%ۄȤ$"< afj ^Zfc7pu&]p=Yw^i}BgiBt#Cnrg c(0CP #  s" %(:* 3`ꐪI &L*G;+huTjkH<&j h-#& -n@?b'= XF<8,RJ3cCkR逴57E@1=@kĸ\$&/Sق |lNʳ-+ 8'c02ڀc Ƙ-Cp(07BKuQAA:|( P\\.DXxrB;pă qa= ( ,űTbE3c&B!T,\CUQIATQ]<@S1헸z !W T|s:t BYRT+묖F邇m3"uR_ӎ)jhP]pUE54=+VmUz5lk"T_+/#O4 TGplM ٫vs+NQӟs遆*ŕEͩVיɶ5_f+Z"nw pKMr:Ѝt"KZͮvz xKC! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~w%j$"e#b &H'Q" N~ ( ޽Fπk& 7!1aAC< gakP6!BŔ$#L*RsF[4daKḶwQ¨QBH5 K]T]|4j,$cU-;qBᔬݒ500_4آ[6 hC+WƍNcpӀt9k| -zK?$V6t6\ue|i˟|q $?7fsei@ڣzp9T;P W ,)  %C_@^d/֠Br@jJݗB=ЀSCbE--s4h#{ã t;G#= HaEM^RVcwX %F_c ymXV tٙw N 6!J'| P~h(ʰf q }*BsI`7G;לshYA;8WiR(WʱTF(jyQKrlx@*pA)V QEKY$H>mPd27#<\ @ܽH;kο^lF#.n(mk1 } *'K*V;l}$'μrK&!Әʲ@Z,K ?KrS/S&0bo/1#23KfXw DҞ-MK'qSQMw-}C–8 (5Mo -f%=@V -,d)0\՚igf࠷;N.Srnϫ7 l<  T]x#{[n Y/N`I! q-+wT:Ut5)/{!+ַ /<qx,?m">'jBg"Ҥ0Z([c-^d|1D7xK:@Kb &yk;FMTS Ž0{.QX@SE pU+K=s$)m B(AQְf>N'&#Ihδ9ɥ/o|DFڧs/9xx?k^s@ yFo|[_yր-_!zm@-@nD  _mBi1`F& y_(2"1fM|]8# -@}|ѴcUC d@,d9 HWPTe (URy™8 mRߜ"dyAxb))(jZPduFꁞj9ΚfA: h5c UHj("@d5$:\0cER% @ Jbq~EW"-z wMvȴfnurA@-2! j1ҠfPp7n;1 :!B_8@"cb^cX`!ji4H:> +r\~FLrnq4L9 V7Y:ٓ PTPIZD1Rh , 0~1)cZ]I uYO4S45D6e(>T 9K-AZ)/DOETбQ@f@"lSFL ˲ʖeTNYBP]3kI&0XxՖ .61%XUFOYaTP4KW`5jWֺlgKͭnw pKMr:ЍtKZ"! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~*%h$"c#b M'  ID$;~=(KP{=WE"=g A<~\=Ofr%w+0 MK6|SπQ@]45p,F{X˓ֵ"Աd}&LkҢj@,y*=S#XxӨ(+Af18\i z; ᥁-ӠW<+]V.y[/Ğv56۠`7g70 x\9u{TM=h }=Lv gŹG@y 6HR{MP84aۡ_t# 1] (@= z,@/@И#fcO8I7H]Kр=BQΐ O9ex g_`a f%XWҎk0%LN:iwUiYp7gJ}ЦݡhB0(Yi 29Fɘv>0@C = jڴpӳ:cTHS^ 5ʏlً3.uW@GYu <77lJ0U|wߐ@=HƲ^.L>'3%P=i*֓‰9Z-s4Dӿ-F>&{ ]ܘBWT8:ҳrq3N2{-(EoܺJd ù,ӅL{CǞ^Ov!:HwXՋ a)x7 <|QBZρgCZ?gux+z5dv)X(S!"c}P%fwC`|&BBD{P`'ȍ/"|Q„*X1 B)X/E1RXlT!EJIQWey J偋n4R:mi&.>nJ6dBKQQ%,=(ܩ)EޠM-G9s?ŦTI1Q.%DK`N'uC<*"?S"ɹfkjyH?*~51^ȪeG4NVV0(7 ~՟2-V?[)ѢE^8dms pKMr:Ѝt'KZͮvz xKMz^! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~rWR P < 8 ? c8fw3y1G]D jS[38 \&3IL y` ! KIb"ܾ cmYuu7'6}BboC%K8㮇0uˡkQGM"Ƕx;tMz5]_g ⬟wRyM{ zoJnDPF ",p UߑhKd0w HiPBA?E#Rk(@I 1*UwaHtX֐Fe@؀1% %)5G`$8@цfD4ذ'8Z[b0DQn!(SLEX:Ehl`Em)GXa "2c (BqlDEԐ١b^ JJ'-dxPґM^4g `gxfW֦vvhk@|+FГmP'v:qpc+LmZdC"9 ҄C'1X lAgTX!!z8 {A@=U Ɓ m g9RR @ OQxtHŊprX'Mr+MX9Ot =7 .$;$t*TFx^D`F`P-aY GxţbOjiP351SW2=FKSIVB)L)7vGzkjPn*e_bγǒljAZ\lgKͭnw pKMr#:ЍtKZͮvz x9! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~*%e$"`# ] J'Le _&d&MZ8/{"- )G]Ì E70Mk*[rnRLt5dDX0B$ȧti8BXǎ%?XLȠˇ8a4 )5FM|X˛qo="zpEL5m \lBmR1qȟ@]Ap`ĸ!Ep]M*&u+[> Y ċC wt>}A= Hnwy={B_ P;n/$_={ gЂ$Ppq a+Xءߥ@>#Y 4`/d#2ݍq2 ,q X@ALmMmԀ60PHI+N4`HpAgJv`x'%ZDmX9@ @[qυyǺ)kJ5ꢪ< I(qd2G`R< ud "!$&nicMK,%3؆ϙ\ sX-3xq}/&D0V6Rx ? .6',jΪ5lᮐJ_qW S*´jjkպlgKͭnw pKMr:ЍtKZͮvz x! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%d$"_#,5+ &-Nǵq̝BƒV̧.C" HxA`p=gp1Kc*='0\MzLrJ"J &H+S}܎&5|=eS% `tsYM5n٥;g@ MA%Ru!6d`p{&H5.drREz0 6mNS@=3; YۣA_彟64tZ:z8zpmT/_DMC|zCĿw?2|½}Q `mEV[*W Hp~#tbZWw"} iBOكm>ft{Ч ApTP.6â'6XZi֠ M ]AZC'3A? gk`߮3H; , C&;ǂ,F5Bl"  4Ѐq*( Y6.0-B7)#6lpopW j@~Y[謈h.U魩E¾%|"I ;Q@P%~.ZL~DApe& e2CpE=C:s,(^U7;*0,lb1v ݌7dTNN<|pʇ݅FzV<mV8"R76XbXCmmhaIXǤW! +1U_؜״C+LC(XZP㑶Bu1'Fe#MH *~9ȷT$kXp]>vD=b(E&"GLN7kz 9R/(aWF`EB:[_K GA+)D]Y ~l(@-RCXIiYܴŕ"TBJX'-d%C☁f-(%ZҢ,%d⛂9DkBH,s(,QDBh,"B',R=bg,,bv# J ʯ5'`ц~KhF>҅`)(W\~aP(RbA[%bLEXȴZb4[KX \!޵ h]>CDHd. jXRi$װfث\'LVBȊ ЎV}VծdANbIvͭnw pKMr:Ѝt&KZͮvz xKMz[! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~П%52$-"1&/*, #Nd6@kCp8 P B`QAA&xOaG(HⰌG@4dM8!$xżV`!P bvێeV+( HSYW2;@P%r+03rzD_fYٶCq3"VRB1̈ Rf4ambp=|C18%<1cgA;\9U =w ܮtyam^ڽׇOzFCCnp-V B~ z*­fՅEBsrv(@VbN"1 $J"8;=Yr 0@ڬU (Pc|R 8 7~:,Uz#в^0'^i X5ޫJ.y.*)JF*/,dh-mSoK鄒dleٶG06w]tr}uQ;(X|wq.W43\ @iCs,]cDa6MZ? ཈irXfw"1HBϴ<F @<e)BD-<+T88{8s," Vc @HE `,t ST7#٦1B`̲B$-c*&-+e@%nl$GK%+yy3zrV 1Ae&^yE-MH`'n ;.Z?LjItZ74fOrJ*򁖀``pGH,pa ^™NKr)[E5Mbf,pbV9I'nPˬ,ZɂP,29s8_B{">c*nji G{)4fA` a݄~ (Hv!(hC"ޱHD\ 7gBXxH(>c "=( DB '(i%8)KnC\O0bPey 9KoT#X gf|a?W(z5yp' MY :R9Ц4< !' CTc/覬'Tkj\([l.ẕ뭥>l.UҺc 4 x . MX)L[ "&><#Q{[j>$t[߹{/JMKJpf2.UI3gv\?V?0Hm5hVZR)0a*P8厴a<5@R*:Nb$FZ2 ,* qQ @Ur 4\)MfQ/+ Gt Z+@E"hٕL}U@@^L3T=EGn)g?u~K.,_i6n5|cvЎTp 1A)k\킇wTu#`2("51i~dh3 mYVƖ-HEzxRkx,AJ5˃`W<m{$Q@0-r 퐉v#ЏqERnl#z> (%mPU UQ2,$ct X@p]0@?W$߈643E $_'>C p˜0'!)C1 !NpsN9E yȔ! zs A"4QDSA~  5[CcLF>6|c0hc^n(VLa%֓6CdǑ&J`ǙN@"̃ gbp,dn `@~FY" cM alt} ~s@I5+!=B;҅ Iu((Y8It{G6|lQ6(D }ͺm1A޹ۊMDҷ { o-#`u%8mLmgwTy\ rFf:yBai%'Yw`'!$) X5:Ÿΰ v) h0kvB'L* H* Yj*W 0@ }D"LXY@a,Ф 5x6ul ;pBA(=rڂ+mo6#V7۔G.ԝ^x[:hEnMd.|ڋ솧VH$d|oK!ԭ S QT$QzXV{m t9sx+ij_K=u iM@T%E.E-BVO˵C^@'<[x$ mA 3N_@͗Pc\eL03Wgzc@Ѽ1D6yaDD3lЋ6:We #!-R5(  Nr!13p[ [؋Wt؋JᇼL~0bS{@b.H&:~b^u\"%enjz&5p1ATjim~ېcIIJ*,jӘJΨFV+7x 1OHUO67,wpb!2Ŝjf[hM0kECEtMO.e=0;H~f:30<`MC$.]a@stfX1OCy<^ԉƩ2Y9CDdǸي 'Ii#0ۑ$Axh(̛៥^#ujpt"HPT/8mD6lzx&*v:t*V,3'X1Eұ@fZ6}+ *tWO ( 8@'j娣6H:bTWC 0(@$ِS%]=x` e Uy(f`$g f}iYҪKd(ɶT- ` ,CwM+? ) ǯ$D(頓 @L&೯ <q.*/P~t5FV(VEؗ75G3ݫQOȓԌ9PYSG>:4aLI{ςHT:PDm+ 0Jf  /1P ]APBCx K B[1 P .:Ȇ#o`0\xC o؊a*bErb.XzoLCq=Vk=8Qcv{ #h0E E,$')PEUb (Q($xs f3V>M0$3˥.u)]_G?J] H@XGK E"b$g@a.,I4S.s #* !.hs,pH24M㡒 Iæ"/=x@y=]?94Blˤ& 8&rg=j dAgb?T)0NOOn\yQ?Nmc= *HCOaT?X4XXTs ҩ VK:r@j # 0X*Z]puVR} *`)*^TxMg6Mk_j*Iž+V0;QqSVm49l9j&Gك WP{NV!j:<ͭnw pKMr:ЍtKZͮv9! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~ʿ%5R#1L$ /I  H( "$΁>h+\ņQʃ@1.I/A},d( u %pr弖BBlւ~ Hp#Q-2S0?Bh} UIRql@*Т)ЗU%Le{.߃hܹٴ:i@=eMblBlBpI78} N칯&kCFMqF)SEe2?}p طEG9G3  x|q;8|0<pL@_ Lp^| }+aӽ`߅Bq!_ޑ0`"l ,R%b+d>A8{;J8 $@I#l(ơ^lS y|eÕ( i ?PX!u ,F{tĆÄn/bb7 !}C!PAu*Hx ⁋b( [?LE{4‹|p#-F…#,fh=bU#+8ABZ[ɭc8f}Mf-rNΎ!K8G6EkI.gX1Ig `%RWj ڑ aAf-fI`v3 e?$X|hPe\LA)~l> OB0I< p^FNt1 _yPQl38L( i mŲ$[R|r L:=e5aQgԥFL5NTRf* L}.*XYű`f=+:5}+\*W)^U׽x_idӔT:ԪM,ȒI'lrR:Z-=YH3~]]Ş\FjDZFAKelXPU(dVN 5R4=Q{KQ4@;`]gG]MHhnU`abtS'CqpF8Ay]1o8vR5qlJ0ⅷKXV{Zi9|86Z﷯ȍC6V~>]3̣< {0'`^opk*aNG@xmRYtmzO"z?] =2qR JKc/<]#͌SjNƱG ʭ*'/4}}q\c,2uG06Z=%Ϲ & ^߆"-\(H05f<,`bMo ^1Sr߈8Dͳ :t(b05Έ_2Fl'za[!c\D\m[ UE*X ^|!FY0h$I`Cځ NE+DK zf!EE0y3UI?kk5I#fK`d4 8-Ӓ2.s^sS0~ T/PM썪/wEmuo@2n6ͱ€,%piPt4Ϧ]v11O[5zGngMOЃ}vő-5e,b`נ>eSů"%as.hpΨx4#PN Nú_9%] pc|dvSP$dY 9}c'\Q⎓B1R3'V S.UVx2L>Ok-4i /7QmZ848`X$cDqD$p/Kkmh +h$yV`P 0 'dtli՜ItCMAkDZ˘* )Ȣe8 f-]C'vK Aŀ/.H5أ8s%e*,Wb:60 (~=@fHjƤGcL*\4 lE~ATOwdֆTyr[;jq0pu&MnτISlvlYG0)Bn4eD(ͭ-,\ِJ.'gw '6ƏA$g2*`!ZhdMk(|Q ó k H,Bl-*l/4U M@k/%keq O& @jp> [ < Pa,P? @0g]^ƀO]-xI & f3+u7{HbJuIC Q0B^ 6nHR囁\RV9~]]8K%0:_^ToN%tVp|:ThFUʨkF )/a U2A= R#_,Aw>`k_bXhOh_څaS2 qWoWQTA5F)[{j fU^P 8O/EBXPлa{](&&!>"jBS] 81 SSYﳆX1$i_E479<0t'B9y dL䨇mI'ڈ:! CDF$%+F‘,J!6%,Y$+s'Oej)̲uې)e̤xhf:Z5sį]Jp5Qs%4h"@ y:hs8$.vNdmbCÈR`?o|RqQP/1L 8}&T_bt+^ e,Y-fb@ں׀ܹW[E0#0O,0y+0 M &ԥh 'Ξր!>1;pW׺ z8M:F5QdP/b nвC.p>unZ {7[ `i͓=p_gxi@l/D^ \w)`si])0n=줖EqsÍ؀1@`:XB&!>ؕ ,Ê*ٌF` H6#iE$-% PYB:[W, JV9Bhr5~yř@z%e( 4=`&0-iM=̐xԕ7m@ Х* @ g ]KiB@ jnS|JBT BNhkBi$ժPC@@^G<" HW_] = I nB@,/YS @{J〠 ڙ9fa ڒH0w ?/$PQ`zLB)STu+Y!z4s %N(!?#2UTe@*hRA5q%:@<ˈNCW9W#^2:QYdQNJT4TV0u/*\eչvYh+ *jz)+bSŎ@=a#KRvG(3z#\r|tbq2XGؖUZ4:[хqɚGt KZͮvz xK! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~*%5Q#1KO H( "N$P߾~ֶI@݂| "LmaC *Ĝ>  G#KBnI'E3Ҁ}r‹)ٿl5@-ؓ!`$8yn e1Aֈ$ DO, XqX妃N!T =d#C S]Tˠ>21|$ EAiyd@I$L#&`M$B!C>J[Y9g3I*!- Ac?iPC'SP&@H &/OCۓX@=1J$ԥ+v VTTjRS6(lJё8UTc%!xBnU7]TgcxLҞ2+^]ֽ6~e]6}= X9 )dGɂ/6TjGQ}'IS.U Z(LD u*JkYW'mf5WgS?h9zl\YYЍtKZͮvz x! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%¼A!;?8 >  ۹:EP܅kD8^=>XAB} ޱ(" )I%':S[T?EkAM$M`ʄALK|'QHD{(#1}[)ݺw֫}x- 30]2d jϢpq/"cTKk8m#FII`K Xk~F\(ueԖ;Կ0u2Z@8-DkrҌs^Z] st3^@\@% pnHvVguv GLĝτ&L|q{Sζg1 JbD8/uceDX|IV`9Ag^Zli( 0aȈV {`iSLC cȎO&O DDw^"a$F4 W89A?)50AWhcdJXu@ :h 0F:֬8G3` -4b^gCa)I>) 4i -!12.T|hrp1ufԁ?ė fmhGL5"g = ~o!90Ed#>R$ &I$x#(SQkR9K|8)|%.AP]v*ёpaK&̔%LdN@vt4ɷPs MJ "( S4n:ߘh2[3<<ϖR&8[ʖ5 Mk:WxA Xcķ t=@o6»1EtE/( qH)WɁ'>@JУ#v@8tVbQbOjM Ȯx)Z+ εZn@;*t+Qi]>OM*() VS̓dYxU],ؑ:Rb*nETT3K6EQ>o?]gKͭnw pK ! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~̆%5P#1JNG(""K/~I``At ^aih>18 G")ǒ'QFw/!jGIO8D*EMEB @`j:%(>] S ʚVKUmhūu^+gv0aM+YIBnrd' sNիgꙛhG|Ůn.!yMtҞ6 fX*`Asg4ٙ @0U!= \u`sA\ 3@#u|y/Ā5%P %`M 4N<eGJ$`0 cM}a.`cM B'—"EΎn6-ݳb57VD Dy-.`~]w>]vE"G>zPt N$.>@UvgM YdN:Gg{]dBfbȨ4Qzk; 6_8 DUЗ}v4Y6 iAFl UP,*VN<˂TKȀ@h[ p@ j,4lHj@( o0Z8fY_p.| $ q80 ~<̵-43pq2 pMr<|,d3@6C2XZdG>'/0q,&(e3V})qqĹ\^+8u6IKiJgM(Ni9yW*x2+ EBx3s/ZSyXU ڟgn}5j$H0ԾY#< ˀXq;1Z1DOSj\Rx8Sɠ%l^GR+ *‰`hyRQz5`OT6%/p әؚ8X<)I`8S8O63;O@6BUGIt(CETqQE(?R@5?τCgh bKPPNP&M|q`u!^C7qtƿd*37G?ާ/n$CiXJ($I,3-qd6) ܯA*UB_Kଖ> %.sP] .YS< $ 4)iҠ0֌޲&8Uq <8ig\| T yfX߄&*{"=e #݀ZJe"2k̅f%XEI`g!VH@EALt5)b"$H+ \,`jUG#r/ N=ǽ&(, ۪`~lW[)reU OIrNSφ5<9M)c)Dݣ8 0.EԠb.1_@p-/i! D6n xKMz|! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~o%=!7;  4 : όpZ|#V&-ހv8qFE 0H c9.CFCg 8P|.D%&5 mR&><]T%FIϛ] k*D!>Ru)/d%rZcCK( (AWr}"xY7ja<3v@f&c01H,;8Cr/&#V}jЀ::Dd X袒$a=_mY<q.bgG" f> LOA(՜.vَ gDm#iz=_920@5hY)&a|Z登 Te7$%>dA(.$*jXHc_jhl^A?\rN:亐2. >-| h o Bxp;@Y.8@ ,Î[?qv| n&r!C:pr+,lKREf'Ǚ̹|ٵ,f7!RLܷt[ZmOC!R7G[Qա0E;"Β8glykO_dJ`| `h gIh oBN했&fGw><&G|%㸫s2|v[M~lI$>_>%bRdfEwݠd&EGB} ( XdPt :&eCK' Cw PMo@Πw*@&Z2@5,?hJDc %ٓG'NHqFdŵu*t"9XEd9 k`9 vGȱ0# OA`匎%O DRr$ IH|#(OQ~@93e̢D$(,7َTΒڪKu\Ĵ%a2 &2)=R@, v"jLIfg⫚z_MiNC&qN= sH<-U U4'%j2)ڤV8)Ox}$A }Υ%(#zr?F"%:$PI礮$R.v7Tr3+$MGgt)(wWð,JMi4QZjP=2E&` UGrbWcOck QoBM1~҂hۘ,jc=YK$hVPUKVS.Wy YB[tkiaw pKMr\;D! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~"%5K#1EI B(ٻm )`auƯ_fb~ ,\8GIm (Iep !3PqcN6Tz $LLNUt5]$ѲXrEKiEUY89U(ocx(?V1 x^ TN>EVv!)nq%t@~*yjA"e+8ɓCH' NsMmH1H^G2 v*k ,0i /<G&i`$}(< p:+ ,f% $y$m2>[* >[h.G?g}&;٪ F:n]`!o x);^`Ѷ)Kjxƒ.,ߋ, c6Hr R<%B3g $kį07L , )idO PD͈mw( Pi0x=@&1G 2, Qf'~cnm&!&`M C):*UKEhK찖70%.u-Q/aa`ƴTNL3h%4/iִ%p ]rә"t4:Upuw"KNz@? jQ>q80[G!52XɓNaFs1QHH|Xpgkӭ4=O.QAfYPkc!-ؗJY6ʄzhR=uv16:]A֊ZYI.P:.7 yskkhƾePJziS27x<&z$x2ڒ 562yU˱e7\CO~*<·gBz}1 `h-ۭ\i_yEf t*8Y՜1PR LX "B'P"[g \  X  p嘅ndWJ3 PtQ¬#(D9%Fx24ʰef7 W 0tΩx& 0TyA\Gh梌6hQe$((9hʙv颐ZCŕ`/= 40 gWLPqkp5Q&P j.@,.GG?0l* Э nhCy-bA|a6O2s2@ "―a/ @g*k㼋L +ۻ*"~Z#/03`j)RQ}Zl)d, lT^pV{ 0cNAmN}BDͯi}ÁKI@ cqSe:hq^75;.)T=s8ZY6L0w.lw Ѻ=G型J(nG0|ᣰ%os@^zoT>Z.Y+؆"W뚪Q{q&Sߡer!Dɡz DDܼR  ALS N&S %|P(%p ۱b .C B@ i@tyED'4ًŚ 5L &̉ОW%k 8( ) &|y#!maXk oaMp'H }A3-я;!(ŒQ@FAS2=|%}'Y'si;rT .$L0p%2_eBt]R憈&8&8Iq$A Iidg6Gn9}H¤6#9s&JnhXFpoqhKьnHaV_EF\D'8SBe9R\O(iF̔>E JЀ4"UlQ7@((dƴ-MzAʠn `֬';W/Q董$54:B"R֚8QJb1<)ݬFF}5H2t\($ Oq0M@FjX.`ċZ) u?Lڈ`Ce=(Zyl. ;Kd%/0r}9.+'φRJKiz xKMz^4! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~֤%5F#1@"D  =P|{``}D7d!o &`Bu 5b<0S\9Rv LDf&mdw@hn(T<8v40Ƈ8=-<ruUNn1e 'Xg*f]\z}+h%DZ.b~lj@؊B5{X AA{9ݠ  Vr씄t'mr5gq)̂{E2/rv/7ѣEwIm m_@mcTkS] vtøg)L\xG+< Y7LLG_W0'NB+( pXD\& xf1nX(8'Lxo9#**㣋RiŀLIJ*f%l.&p6 T N!a؈|_>="c# 4< 'n.P)B>@~擪 +zc'jKူ2z%k ˕2]k L''8 tŇɳhĬ@,PٺΘp*Y#֋)p[fJ|`$Tp n2+2Nzt0[,siϣyA&JqֆAoʢ-%MF/fX'`7]CmpB[g ^luJ/ Oqilm:k _JCe]]uk$&7vVp[s8(QNae٠6WEsl7T@P9XOyJޚϜ+nJbNe\}j;*׵P~𧈾6[we ҿ51 YDkI$$.LZP m > ' M0}$A3*4 Ai){2{".s:pOsn}(RsO%gLkne]GY.mcI_hCK`t=,T\M}OiUNUQuU+.n*}j*9E J8pc̡^ַ:lVe+<:9/@#,k[aI5*JgnuO(Aʆbr-fZgL4ViC)J׊V.j&eȁ4^Lڭ,UX!v_$*]I `\z xKMz !! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%5C#1="|  n {'=0@x"^G" 1&  pXD ~4N94?;Y9]0~$Q&Mȑ Hp?lڵӽ dbiNPJ[G_#.`@TH$Ʌ <8S^t Zx?:O~\}l~2o݂؀Uvhrqu~ۙW' K׺}Iŵ h] =,a(Pwj WϺe_Y ܏zx[ o 0r]R0W1 %ts -m8 _/dC0#ڄ(Ea EƜ@ "Ekp#^ٍ *NلǨҖ@)Q3oZa1'r-%eV&@ 0el@FLe 8 gK 4h @iՐ 4gy)qi<<\K[F*B8*\2yʃ[. *r:h*J >a+ְ7V-V1l" d ʨ[[N hkrn^|f( Ajʬ Ɗ0pkCQ**ϔG' '  exiUBf\}ˏ& sx4EepL**Jl"wE^Q&"L 0@X3["\dT':肳ΰB;xUtgX5JN嫩F0jlylZ VgWcV$.{]0yaS<&2$2x&4a id6mrB )#8':!u%l<㹂y3 #'@YƁ@Eh?O޳$ 2=C{VJgH9w hK&1A` R-GS`52-y; Q 4Ef1l* h˨Hi* zJ@-WgQ-KuYF<5t4\+ >ҩ2҄o}( Hrs y4^Wp@ [ jl#@Hg,^Yi49f$~x-_;Nz.Y[(#|Kͯ~_2! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~׎b%^]$#f5( D[w4KFz$Nc ƟMgVJ%pf[d*wof:r!Uc@خK',W 'd(l3y wѕ!9G垝:G^/l^uW/չze xHch/`vb8laN0](!p`l8 xiUZH/ݨˆraZ€Ä:Va1~ÆEN\1& 0@"𨅇4 G`~V>@#YץlbcZy%Wp n"u"8 TjVQ X瘂¹wR•FWa.^:8ꄝ pi.1- Z,'Ih˄Da**Jo*DJK hKʥoŭaZa"r**T;3^V{z[`^L6—zAG È>.Vi?*q{I"u J^G6I6 7o9R!Uҹ0Ll (wm&ȃ&0 )vfh&-u_mشxKu P_l*p.yOy@ lFՌčiDBgG~)Ѹʀ 0hqqaZ(8m9?9 @+Pzlx.Z-}/O|6eu`L3@xᅝ 50@V͈B1fl΄BlOA۷l.3(8 q08 T @$ :Z;j!7-t!(C.|[  P )D(D+ThM2q 0|$((XN!-:!^døqY;R55G݈09[ǴD:ڠ1ak:d2FIѣ@I0r  d *#a@h8Rb+"71j$o8stH'}ك12|f)h7"6m怊޴)yVYkZMۅcdGV/t)]qdY/a/Űa/o}!(r Ȁ1!K Ӝ7XB|FV! 4P 8c" 4 lDV)BZdB6 eΦł&r@e IB-@ ٜJ9c.P( ĩI,8",TE8):!!lƩK\|Jkʺn BF үB)_%Y)Nz*: q#WQWX+%6 ?Qb5cM)f@ 0]@P,;Z e   I ŒHEeလmEjZE! B&P OJh]ad| 0jRTfn9>KBŲ>Lʕ(bIA , H1/L چrT HED*: yC.S.x q`8 :(0@f.|(8C2 nB 0ynxO: ۔Lb'(N٦yKjSwoafQk o^jVa @=U?@\~w+9G[}ޥ OZgfvXb8 n_XlW rp $R.3 wB+UX `(Ґ N>X+z=p p%6N\‚6!xJ@-"8)P(F#eXe<1: cE'4;RfqL{W|QaF6}@\:l4<($(B{Q٧$p'F#M%<O m");'3iDӹkB@13'~Ґ0TJë@)nMZ+mVԬȰ-VR.'q4ղ0 Y)[ :z,bki2ϰxڶ/L֏MOP,`in45ΖZ{`i09~Wm͛۽@<{[UsBQWˤcv@3"nU8ܫpieD|imuo& `Kg (ੴ'Q ؀iɓZ|ymyJ7p[?n)lJ75MOUBK!QuxRmأ[iIw"ՙ€O@uoN UX"@4&@Sۑ2"4X8V!V@*XK P'Z\I#(K6)4@Rڃ1Ąy^*%oib[yD|E &qڗ%u٤7 "!rq𣗌(R6Zxzà5C_ ɕD3F ĤJҨ>Y h*[ajQ[òS=$Hp`=ꫦ3*qx, O5^sB Ph0X g6s0> $D$'uE%2N|b (Pz ip-^dA_rQceDA_:,- @x0A?@<ɏD/!~|u"aIy$Xr^cK*\[ɘ]~Qf/(^k&Iaڳ/8FQ`+4f LT(H4Ոi43)grsd&ߪ)N$'6Ӊ6v|gt$O">)}^`(g&ЁgAYP UVA Q D 4iz]eO & E!> n-J߉ ^$OV+r$PLMm`M_4L~]tD1Ԧ4s k X=!#5xSyV\Iycw$D \ԕR}GQF|$+%D5>)PcUePPL~ jbQ&<t`fZ}#L2n@[Cַf.-OP"?\TmV!I$El*(SrݖrQY}wuMIlsMkA$=nW0֗/FKͯ~L ! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~ǎr%nm$ #T( " Y (W-~Ѣ9P8s6p:"(2f1 DZAìdRTFQE:qg%j&ok@IUfKR4`-=PInN&R<`NHJ'bEJX8 >+ Y\%3* 24ڮiB/LCd zCpfs7(8@@ Ep@Ѡ\ =w\3ۨ4qT < =jcR`q !d?MRNTa'ŨhGAp/^F4Z0cW`,A1h$,FTp%a9r>)V$(-rAw1q:ʨF'}mȃ9Qv#<=A CdǫrJ$yDh ye ?0`R ) 0\ٿ2(6z\DNX/MJApV*gyL$nQOb@iEQ d3&8aq€P,qs| )|)8!)C|,=Zlu<Ԡ 7#Ѓ3UD5ΈBmёB젶Y=R.B{XfԦMMt8eO+ISpA5*XSJ5urR];>sQTY8z1HWUͮ: kV֙ՊmŁXTuu\JVuk|F[yҵ8Qa%W91d 4\*"--\`_bXƼ!1)0\;  59 )`o_+]2=>MAhI ecJG gkl1^)wb̄,r4! CJͯ~L3!! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~lx%ts$#Z( "_" -[@n 8e@gb!C)AHŋQ9stAVIX}TlIӉr 4 1@S%3EQA`@ * tj<5>t'*#M9cdk(%@n6Or,Hy>" ØHTO2-H2Kn:l6}!*%w{Ԡ1 P]677{ԷӇ4`@YsķdM ؔ(Q-F{FF Яgϟ}]s^ v_ 0e <]Gx+0_aI P{'F`Fa: ,5T% (HMB9Te8BEg`a7HgB@9xɟ Dd1 `|oz /i|+m6qE>ie?(ڟoohvH8`A> c"G7S¦#6ȟkEnP-?2#>{kKlNWdmO4tPh/%>@ TxDj0 Dvfw'qna@G[ @9 KT1- /*BrR

This tutorial gives a basic introduction for constructing phylogenetic networks and adding parameters to trees or networx objects using phangorn (Schliep 2011) in R. Splits graphs or phylogenetic networks are a useful way to display conflicting data or to summarize different trees. Here, we present two popular networks, consensus networks (Holland et al. 2004) and Neighbor-Net (Bryant and Moulton 2004).
Trees or networks are often missing either edge weights or edge support values. We show how to improve a tree/networx object by adding support values or estimating edge weights using non-negative Least-Squares (nnls).