From 2b8775bc56a1016198010e50a0329db82144c1cc Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 25 Jul 2010 15:03:39 +0100 Subject: [PATCH] Current source - 38.0 --- LICENSE | 340 ++ Makefile | 88 + Resources/Font-Data | Bin 0 -> 4422 bytes Resources/Font-Pointers | Bin 0 -> 512 bytes Resources/Icon-16.png | Bin 0 -> 3161 bytes Resources/Icon-32.png | Bin 0 -> 3896 bytes Resources/powder.icns | Bin 0 -> 98761 bytes Resources/powder.ico | Bin 0 -> 90174 bytes font.h | 27 + hmap.h | 21 + http.c | 913 +++++ http.h | 43 + icon.h | 22 + md5.c | 224 ++ md5.h | 17 + powder.c | 8429 +++++++++++++++++++++++++++++++++++++++ update.c | 188 + update.h | 27 + version.h | 31 + 19 files changed, 10370 insertions(+) create mode 100644 LICENSE create mode 100755 Makefile create mode 100644 Resources/Font-Data create mode 100644 Resources/Font-Pointers create mode 100755 Resources/Icon-16.png create mode 100755 Resources/Icon-32.png create mode 100755 Resources/powder.icns create mode 100755 Resources/powder.ico create mode 100755 font.h create mode 100755 hmap.h create mode 100755 http.c create mode 100755 http.h create mode 100755 icon.h create mode 100755 md5.c create mode 100755 md5.h create mode 100755 powder.c create mode 100755 update.c create mode 100755 update.h create mode 100755 version.h diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..983f982a1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Makefile b/Makefile new file mode 100755 index 000000000..90fed1c77 --- /dev/null +++ b/Makefile @@ -0,0 +1,88 @@ +SOURCES := powder.c http.c md5.c update.c +HEADERS := font.h hmap.h http.h md5.h icon.h update.h version.h + +CFLAGS := -Wall -std=c99 -D_POSIX_C_SOURCE=200112L -fgnu89-inline +OFLAGS := -O3 -ffast-math -ftree-vectorize -funsafe-math-optimizations +LFLAGS := -lSDL -lm -lbz2 +LFLAGS_MTW32 := -lpthreadGC2 +LFLAGS_MT := $(LFLAGS) -lpthread +MFLAGS_MT := -march=k8 -DX86 -DX86_SSE3 -DMT -msse3 +MFLAGS_SSE3 := -march=k8 -DX86 -DX86_SSE3 -msse3 +MFLAGS_SSE2 := -march=k8 -DX86 -DX86_SSE2 +MFLAGS_SSE := -march=pentium3 -DX86 -DX86_SSE + +LINUX_TARG := powder-64-sse2 powder-sse powder-sse2 +WIN32_TARG := powder-sse.exe powder-sse2.exe + +powder: $(SOURCES) $(HEADERS) + gcc -DINTERNAL -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 + +powder-sse3: $(SOURCES) $(HEADERS) + gcc -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN32 + strip $@ +powder-mt: $(SOURCES) $(HEADERS) + gcc -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -DLIN32 + strip $@ +powder-sse2: $(SOURCES) $(HEADERS) + gcc -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN32 + strip $@ +powder-sse: $(SOURCES) $(HEADERS) + gcc -m32 -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE) $(SOURCES) -DLIN32 + strip $@ + +powder-64-sse3: $(SOURCES) $(HEADERS) + gcc -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE3) $(SOURCES) -DLIN64 + strip $@ +powder-64-sse2: $(SOURCES) $(HEADERS) + gcc -o$@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS_SSE2) $(SOURCES) -DLIN64 + strip $@ + +powder-res.o: powder-res.rc powder.ico + i586-mingw32msvc-windres powder-res.rc powder-res.o + +powder-sse3.exe: $(SOURCES) $(HEADERS) powder-res.o + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE3) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ +powder-mt.exe: $(SOURCES) $(HEADERS) powder-res.o + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_MT) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS_MTW32) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ +powder-sse2.exe: $(SOURCES) $(HEADERS) powder-res.o + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE2) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ +powder-sse.exe: $(SOURCES) $(HEADERS) powder-res.o + i586-mingw32msvc-gcc -o$@ $(CFLAGS) $(OFLAGS) $(MFLAGS_SSE) $(SOURCES) powder-res.o -lmingw32 -lws2_32 -lSDLmain $(LFLAGS) -mwindows -DWIN32 + strip $@ + chmod 0644 $@ +powder-x: $(SOURCES) $(HEADERS) + gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS) $(MFLAGS) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa + strip $@ +powder-x-mt: $(SOURCES) $(HEADERS) + gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS_MT) $(MFLAGS_MT) $(SOURCES) -lSDLmain -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa +powder-src.tar.bz2: *.c *.h *.rc *.ico Makefile + mkdir powder-src + cp *.c *.h *.rc *.ico Makefile powder-src/ + tar cfj powder-src.tar.bz2 powder-src + rm -rf powder-src + +release: $(LINUX_TARG) $(WIN32_TARG) powder-src.tar.bz2 + tar cfz powder-linux.tar.gz $(LINUX_TARG) + cp /usr/i586-mingw32msvc/bin/SDL.dll . + zip powder-win32.zip $(WIN32_TARG) SDL.dll + mkdir -p release + mv powder-linux.tar.gz release/ + mv powder-win32.zip release/ + mv powder-src.tar.bz2 release/ + cp powder-sse.exe powder.exe + rm -f release/powder.zip + zip release/powder.zip powder.exe SDL.dll + cp powder-64-sse2 release/powder64 + rm -f release/powder64.gz + gzip release/powder64 + rm -f release/powder.gz + cp powder-sse release/powder + gzip release/powder + cd release; tar czf powder-bin.tar.gz powder.gz powder64.gz powder-linux.tar.gz powder-win32.zip powder.zip; cd .. + rm -f $(LINUX_TARG) $(WIN32_TARG) SDL.dll powder.exe diff --git a/Resources/Font-Data b/Resources/Font-Data new file mode 100644 index 0000000000000000000000000000000000000000..1abf887519ef352056ae302bfdea96ec8327b40a GIT binary patch literal 4422 zcmeHJ;cr`46+eF0elM|a`oh8lC3c*VA`rOqwcn#jshjt*lw}e@i}r;Nd?12~PY7Hb zq)O1*RY4tUCDJcQRX@-Vlc+ML7G=_cHk#KwZLWyZzBZHiKt!D-q6o3&P4+Yo>|D;h z@3~pWUjXWfbA8V}=brOB=bn46WAJf`eVl>ETsIy6E14kG994=@fLLvAMCqaj6)O8{ zb*tuQYxBLhsxr?qHnrvx1_y$?cJOv>Gv$!EZy1XwgI($=MhCq7qLDnMi4`(k3ItIz zr4cP-lJ7iJm2aT9}1!U=o|OTHyOl7w8Z=<{cFJ>WYh*cq}9Gbxe@(9_aW?7?U$xs}zR zGbqLSn+~}9Q z%seJe>}TV9fub|gu!zB?q`zp23Q8dw)r(LEsMFt9me{l@*DR7ZV9~i=d^JR?F(Bg8 z&*j1Q5SBjr(<58?vy9+hprmPQq~u=6yK9c&g-gwe>IsiBvUc}wIy5B$DVaP6^1wlB zPOJ+R7gg@d&_U%nlQi@{GgIppMNaed`H^lB@PUB<&z!WWks26|@N(~=7Yr0jZ0%-W z01g39vZ}e3e0M0bkJ1nwnRd?{@yNzAZq5l^8;9-}Rl2R?2gudXo zqrkuvK!=1*?)JWPEf?s>xTcPxz5sps#HeB9Cj$gn@YS444S9P`T zc{-@e*7Bz=lw`UES7X(=NsZ!OL;Rsr5~ zcG78QJ=jVx7 z2`KKBD!gbks;~W8DlPdU*`?W&i_E##W z!9$x|z}QoldxDJsp&xzJ5B=yHe(1+e!z@0q&uEh#3+!6?UK$mTT z1I}32czClgiZ<8Vh)u>Ah7{y}sh;Iq*(JFqobzmlf5^LZpO;%)1ZhX`jk%@uyO8Sx zY|dCLqFEte{MU8g|KxxYJ67T6hrFi|Qk^G2hb40T9j?qodbmc0NQvwar~AiI0bn~@ zAH*ie$qoNz-ZYlM5Mj>@U;5t(8F5lw%!g##(bbYzP7j`*f#DedIO4P$C0RIu# zf4eq=E5mRcdh1qk_Iu8DWrb+^&=2?*xrHwt>K{7>PfWZRed?*7KQ}zGQtM$suj|D` zrQjsIs`**x-*7`|Y8~;Yh+hbTY{1;^hpSML?89}e9qDS@9sMNq?Fb37C!5@{sFV+jcbBSIM#f#ONaBevl2iFcg zfGP6Z%ApRwdHJKIrKQ&{VV&smWQai8#+nw+x#bJncTm_PO#dvs%3P}or$v^K;_{kM zaN7nw;5s>~x{M*qtvI*vAwkZ>7KH#q?q_d0c1=3rke%(k%F*0GIwRTI1RbQ*c& zfar%Em=uu+**P{lJ1g&cz%9YZL(P4M-fH77sX)_Tg|a2J{`wCWw^jPtdHY#)elXaB=c25< zyf8jo$3a=aBMz+fC=SD(gpcxW!Yji|5%h5d|0{6jK>sgb`1|&gU;pm>H@){qBAtl| z4J9#@V@GQ#sJ@%Pjrg>ep&5~WOn5uusdgDVO;hv4BjBM$M7W!HG5dl)6N$flt=##b zni$7c_);WZ$yUCT#S#KhM-kI>B3hsKldd(9*JebvMx2Et{9s?&f!7n*Qx@Wt{cv27 z;%;_q=s#F_khszMm$I9vWMM|4ZYkI$u4Ql3|Dv3Xf_w-?-okihcE8=>Q#@T?7D0Vr zM?M|5KL@?)a0Qeeta}Mi4p{A7DDrzDjyaG+w{rQreDnThc5~;Q>`u^P{_9*ndCrgd NN9+D^KK`%r@gG!MsmA~S literal 0 HcmV?d00001 diff --git a/Resources/Font-Pointers b/Resources/Font-Pointers new file mode 100644 index 0000000000000000000000000000000000000000..4826cc60b212f4c0657174631b4a52b3d7b7df7d GIT binary patch literal 512 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 literal 0 HcmV?d00001 diff --git a/Resources/Icon-32.png b/Resources/Icon-32.png new file mode 100755 index 0000000000000000000000000000000000000000..1f056bd778a1a0f9f6dc4c94ad864e7dcaf1db4c GIT binary patch literal 3896 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]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 S;?fN;ne)(?8bTL3 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≀0iwiUE9s3m_S| z@BlxlPayQKUOQV`bv@MzF=FPFUYR0ruUANcz{%|4p>YSL9Wcvktp@Y1KYoVa)Z}_Wp{PB)l`Icq!m!5#+pM>|d zXnvTl+byjNdB4J8pKS?V5%?B&pJ%7RifMV#T51U~b8_sdp=teaBCoL!Kl{=D4{sNL z(^;KtAt$(VujD!URhNDgfoR;>J-TDL*=3nM_kmr*&Fe5jDc|!tL$g=}$%7d5$?6 z2RKkw%SbuR74OaNr}S&u))ugM3gZ$@o733QvDt9SLK#?f?TS+KGL^P=D_SNfjaSF3 z_IPt0OkR0dXk6f9D<9RDy_ABo`*zr>gNL5dwe#1FUYw_wUGdd3=tSIO0hNvd{xUNPf~>dNk4-a7E-98-N(39GqG^9GPdSqD+Q}9If-?f1o&-Ma9DaQyHI# zal=`aD+EXszhp+OQIW(|!ZhneHjLbfZ+@Q{m$Guw%&YzFSM5$>I7zhQ12zj^z!6~;3I`G1Zq4G-QcL$L$3)`5_HyDvQr(_y|DqWL4yxHOY37&TOV%V1rT21ryEF=^}C#MGW>5m7p=XB{~< zwbYr|cO=df5$Njn;A=}Oc|KMX5q}GhL%_Voi})s)<1Jyqw?rQSVkjY7K6Z{cE(hXm z^6LL#xt>48A$@-R)nS`a%382Gfj(H>qK6iCk}6PL|0qK-AJD2-;R9$erbJioev9N$ zKv;B>Oo-L*hQ##s`sZ>j#9XcFN%A-wcuq3$j>`T{smSZ|&X})(|hj`55<5t<$oNsLi_R(m1jKqwYXtcy zcENn)zfg_yp1yKGuK5)&;Fb+}4deHw1h>gKkWat>000B85ds6vlO-*lpu4k3dE+N1yvjD~qv$yvMohoW6o(4dSaI5n5SO0E8$ACfIOyRQaN|OwFUTO| z3&JFy6cRf=*aDth2+fMT7uGI{c5ub5*Uj^Q3P=O4{=uYCCrMIO%dbGL%-ujDtg3c{ zzrn<7TFyA8-r&y3D9?WoNz%4o@Ei;QKHBEAxDo+5et^+`rM}m~x8$k-fhCeyp5uSn z;wf-c>{i~%tIJ756~0XWDZgj{00D%ANjnc%KvCp@A$Z`Ft_Or~J|PcDavGn>KmZIRB{B#-EA65n z00t5f=87x;3?vrQi}z{rDL{ksfTbA+{dGuPpcZUoabN=p2@2A_RFp!ifARaqGEXS!GTape<3X6O! zHy+a<000F$6_k=pzyDc)>0fvfb85U|vYm{iXg1`MNhFdG#zx$Z`vJ>? zc6;6J$EtVo1J38{_c6fpgCFc`cFT>eUMYJySw9GjAebgi$gp(3s@VGJMc-h<1okl*HloqA!D)!0WxC`q?@bE@h8}!YeguVq=TH4lcZ-I<%g+_}WPTO%c@CHVD zt*R=Fx^;$~OXC@xPpj5>6}Eh+BgA}10|seO)$KM3eyo@7tuP!2js~QK9~SsiyYkUk3)+a3hkUM+4g) zsQzcZP#eX2Y4tsxFD6KAH^*Nt|IO-ahIqxEhx4Tsm;hSI>f&b)d+*QU+k4}$ZiU)O z4LpMit#jmg%S82y_tEmvtv2h`hqAJbKsuhue&JqcG+QblUD$FPqZhrfwO9EFWXoGB03plof? z#OCr>%H4Y&SEzgVEm1R@zyWQ{D#E|vvU|~>G4ZPh{^8O|lw0Wa1Vmxz9|by8)Qzn7 zKRgG;VC{pqp87aD3jA+Zcc%qs&_tiZlBRbQG=>?1c&m5OKEXG;)`4duk&L?az_gO1 zja5xxeWwIWqy8xXB`pGuKDy}XCxzAb-LV;ujFlt222Q2c)e;+r(BFfaE%cWJKYXv! zbBx<;PY3Q<2q|!;Kr!30=uP^Z}z9WHJpN|hM|IXi|05I%bJG}B^sf~H1!DK~!j>d>0GO8|}&-lpmzy!Y}_g zK@+UKT>dALqFnF0$NfTiqF$cf2gPquCSM6Ns7b<)&hbgip0?eqX^wHfbO%gD0Ab3PUOH)v<*F}VEtC$M@m-o2tYW5!*(@Aug= zQ`+%*S7-mdvd`i)n=gWP+dzs))}gJT^CQ_BUI15~Z3?P^(M~v;G^ft)E${v+@n8Nd z)|+e*Xu3>L2cAPUhj1%t`F_GZ5}pw6K&t~>sHyn4Uc}9D>Vk4zQPlDq`g|r%-`j>A z=&2xxnWpgTT{p5is}9v`+rzA5zl{@Q-o3}~(-bMRUQ0G}!p5*fcJOsu~-iz0u#Z$5>Mz(Hd zowviDP+5OKe-5gCo`C0)0!^RO>OWV(asBs5#ZHb{GHt+>(^RIgduV}(uBXaQcR0g) zn8e8Pj9{acDmhSRV+)DY(rGOs5tGCK)HWg~pCV&fA^C-+?VPiY{^_Ne;pKfujFMeJvHdnnRflQ=dBmf&$Pxd3iO@|g z3Ewt3eakS14hbUZ%ty6*N0iE}3;J!Zk0=*(<^4d&rJn|qJHY8KTeMA z23-5udp{TZMQ*=e&L9^)(}}`OUrnKa#<1w3CUomjbnA^kVJk$&z7MUtq8}q)0`K># zy+JGM|EoM1OZXTw;tj8Cn0G=~z+@4a27% zOG0o#ut6w3M6LJ@4?>!2ucb!oXtrp!gN_|i5IGE(0{o}KS&wQuyEO7kET0)Vd-ESK zd&Uw3+&IA!`FfzZ{V8L(;_y>Ws4`1fHvqz60d9@E%x#q@81GWfu^ldRLHD(GS}<{| z1j)L()g#P_%WFVIa)OL>uqmli9@AmAcXQBQ;Vmy4!-;=CYGJ+8?l++{Gu&3K;Onpo zY7!Bx2iJObiBeGYxO*xKO}pCG@B5)r@PKc%&cWk1x-AgAg`${G+4k#sc+%IwNL0|< z^(P2?C;Da%suaD8*rg(SqpyDY`F!P8Kh4Zy(kamMKAyqilBw`T9sg=|@8OPY^9T zu0K7GoV7}Ijv6>jnx~OBq0oQS8@a@d1HLO&PxCcL9x&>?p1eeNc)T5I!ku7V(+%i!T18(g72yHe>Cm&Y~_Cuf1W6#&9h~ZGNDde zZgK?RH@~Qul8rQ3AZ&x(85^Z@KmAD<6Qhf$op7N7KvuQ%=y#$NLP5iT}H5B-vXG85xUl4LzT5VOkd# z>UH4EdQ^M={-^u?@BofqS-)5BH57kVQM8CIXmMg0Kha|ri;UPJ=4Q@o3H0^4#=Gj8 zhu`xHx-b5|3YNSMbbsEk?&o@+?|-k{akWT*+H=qDR1^ayhv+s1{5k$WHZ}gJ z%|#hV&7W|WbQT-X)Zw~6J4m#&F!oXLl`J;_t5jGot#uR zKZS4Wou0B0tHQ!-L!|ISYQpx*ExaL?`NxRsAegA-fgKft`tD&P@+WEfSkhz6b3?em zwo82vy@V*F&o;k<*apcWD{iQyLXukK-UK zIkLOaO{)Bv-)fX)!O{{e`hI01;0n90ls@Q6j#bnfz{dNW11zW2z$<*`QF1i;a8*+wvYg7{(IP|Y+1j9lHf6A`dvHK4r7%Ir$!5nOX-j@zF~EaZ^R%)(X9O(2 zBJ(Wd$1MFSiChWs_f;3O9O`|$#8i7)12(KDs_2sD& zd*o5v5lO^wWv<*0TjVTooRu;36Bd)qI^Fu)YmeIW$2T$u2YrCjNl*u;{*Lw8@WF~w z!0%Kf zAuwIAB8f6b?UCl6eYmxX3c8xC+C5xmf#}mJId3mO2|jA_dgS~%DGa(iyYe2{sL`v% z)!Rsuy-)pPELv(4L$!kz*2BJi>T5o=tunU6_Av$i+Ae+by?D=^^V)cQ+Z~vr^oPpf z=kk$lN26id_(uxKmn}S-l#K^dsfx-P__^@)`7xN$#Y?sg1lWgYe+GHDJV7`S9t~5Z z`XhF!5HEG6)6!tcj`uo_7Zq!Wxz(Os(_KRn~rDTW;-M@QodzTHgh{>QMMem{xF) zo;ro=tO^|_{`TR!Ze-cVSGf?w@)$UuMH>)crt}*2z+3j>P(SjPcLU3;n5&lqhAb| z!at}|xQl+RdNsvT0-<87tv!4=P-rfCN8VTeRWz= zc%lZ*de~mSfZ#;bEe)CMc9~qc?MW)XJ90aHgf)|j%)GOM)_m+G#nzp`>&y$=l8305KWX~G9 zBAd;EQH=-f@f5!@b^BYNi`2?LkoNiG3Ad_SgIZ&%3*xy8@k*d%*RwqAwK9>9R8L3? zkwqVDEg=1LfEfxvL9{@6KsEFpISb1>bxg=??eV@AdnM_EAv(U-CXx|9>6@yFI_q6_ zCJX7BnNe#ed0a56K0x?I4^dGk{m5Z6FOBw<=e5z{#oE; z;SEW=D}W;X=t6`;|K*;!B0d{bTQ)$aX4Q~b$H?~EJ-E^o;*cAbCRKM5WI0{)I+rVkAr;*^P=4Tnb0hm{$?z>Qvj&2PMDqWcaSWiw-m|l?&c2DxEXE*p~mr*p0q_XmOpGhjM_ygw|`PJ{Z}C$Q8uaSD6%}OCeR-do`F@ zgR)tCC9>G6q8MnziwqMDkd1}2w@NKo(Sep*3sIIk4g6#=@~>?2 z{!FKMx}VCqD0Ffwqn{o2*}{sv-{*($!*4-))To8%ecrhE!8IM@U2MKoj(7K{TJ9MH z$+HssHGdg;?@r5kgI&w<(jCrVLvVU@tbb%Qq-67vXzL-Xdy5&rqe|+Z@JhPQ&ZfUC zey`S=mv&(>bx7m#mWVQ6QfxBZ7^KU4I54u%+JbL!hopl zi{OV(CGX`Bl;iy4E_$=FR+J&~X?ThFkgkq@hjnQb4T}VBW#*Mk(Fg?JJ4F*Og3)1Y z5sdTW=K)Fe>+K?1FDL9BQ*4{eXX!f!D&?IN78}v0j?&qhc$}hDshUd^Q}8;6FqCfe zKdO?~R3*jSsLn62pb0Bgv0q>!kC(F%d4M3G zTY`~%qf!z(9-pBn2!V1SzMEzM30Mr}9KrX+-J?x6>Hlp?Lgg)qWSe5W{Uh!t4U3mY zL>h-rC^QlZxOn0-U1lN#D?(#DbzF0M@V9HlF98?63L2KqnPnB54&=Qs)`;X5eT;*$ zDs$vWZ)HU1h3pkcD-jxl?5G%c6B*WfHSgovCs{H(zbN6XtDE6+ZFPUaN&o( zG=2k5+Y|mvO~4|93`b5llI<6oi+p1~?ctvb{10d9^e8#mV|h46-^oVwMV*tbzvzE$ zLG)0$H_*C+{B0bF_}I=PzoFZ0iqdjWxQn4KZ*tB2`KO z-oI)Zg3G2K6*sg+hI!!zzVKN_s=2yuqq=s`OwqONef(tCgj#8S`Nl-;q^bHEQi z?ab4&+<409+)v<-ZiG9g5+;xI&R7Aq45jaElUr$)lT`<@{3O4sTS$HjO?&;goyV1t z%a%V&=O6zOZ*PHLW(`Knvj8P)lHiZRu2jZW|)G(#k_hemz>F#}Km zat~>l@4Q=+gqH-Mn)xpQ2aiK=vYWz?+7Z*}C#5RH=jS-bflMMYG7QZgeil~QW+Nv* zRF+P;Bq$0N&^;5o1kHBVZT#qLnF1cc-&bCI9O+=4P2Q7}2h%a<|EN1%{OgECx>isT zC{4$yKnZMHl`~j>n25ReJ8Y{T%hPL{(~zA~CDXA}M*grpR$wmW!W(nK zU7MoIv>QCOc4{if9wVS03pFSr8r z_xH3Cl=Ye|<|Is_HwUZq08Py?b^4vD_ZQs#Uy#BZ30P|0GV@GF9iS#si^ z-IL=LRFLg=tpPds&OSd1i`e!lsR)W8$214s zR;aV~8OI%7E-chpLHnULA=FEX`0O1uorByfvi&u21k|_?g%}JG$k}quOfWKpM}0U( zevTh&Z1D}EH_j2Hwryx8mg*WM6!b9^u`X^kks22z%R-l2H53zVLs%n}GJ?(q$(Q=b zacoQ6W?sZF+3XRjw$i&j0&3(+$Otayl)?s4qK{4fL6+drEYu2Fv{RG`N+v zV40nWsqZ979}^k31)-o9CyI7-(33>%97bU~5$D%~{S(2y70WQ1D z-<#h(TYK1*AAI>!e3s`BmyV2@$2$iG8;GwMg$)>FU_Y4HCRdq!GGf$htR9GV3*9N#g7)saPNiXP#%!__IF)HTV|OI!SXuab z;=bmx1I0G_rfg}jDnn__49_+18Z6Kc=mg(sJFh%!syHNm+{8#4P9H$hb^fu7FL7dr z*A!6igtx`cWAI*fk@G7bTvfB-n;&?;ber`6CMAn+#a@djUJEHUqf3NwbVgt>^aSpJ`wB|J?5c;E>v|D5AOhEPtGWw^n)1*1sjV7JA6;b;lrIIedz^} ze}01K(;$Mcu9E89MslTOTxU1L;st!?@4PM@=vgq!6gtTtAEV5jC@g{L`8eDCY~$L- zNn#48ROVqRwuQ)t;mEu`*d&w^0fO<(iSdecy%{W9Cjf zY>1?jbsBLj4Tf}Ai%kX9T(^)!gz3Ts;G;45qwnc4igksGc2r-5WXBL?NIBRo4S5j8ETD( zfgy+?s$gCBZ6wULlSGEk%gb>`w0b&>FsD}@QbAhmxTR)nJ-++lTc@`oRe|YH+CS4wmclT2qLVOKWp zi~&hVA$*5Z;-#|1*uJSCOq!y!?aX&IagqGRVCAIAp7Wd` zQycLxX+IoJZi(Qu$D9*?zS33>#cBz4h+58`z~sD2owEvq^XjV21^A!lW^yeV@&{ZmLoQITVZ+{UuI(FRQP#lv=zr+86Y z^5tRtqo>P(lziNt@Qvh%4&diog>CM8N7-mWYsxfJ-CGA6@ogxDJfwu5vibtm1E ziEo!e81SSS3N*9LZhI0XEr4}eDm0;QidR*|bfNV?pEjul{NNvC0bydx#!@o(PU#}t z$Yv}lh$Gt_q24Zb?|O%&E$$14G|%N#s)aD`%XbVdn&xHFVWB0%D@7}@nXe@KOo5W; zg0?PgH9ON*9o5Xc)hWkU<`@qAqn-|OCcnF5$ZEHuYHOTf_w_5h2- zFCNYfSd7MSeeO`GDd}Ewb_>)z!(a9-u`Uy%;CfPvqIfdeHE(?39RT1nAoTmP-vtJrixVu_L6+>v2kpV=tzVLleXR zaf8z#@>eYD(_6b2+8P5~#5>@V-08L0VU2tT5XNguVuRL2SZr=@Ea&~Y5=3i(esp3E zj6gynIwgo%k(1OjKg(kyb|g`D5sG!iw4#p3*<^Rgm8@Ve1qn>qbj*zjhysBj+Ko}3 zp$1r3tgfm@I_1$vkGdW$1`K-0ZFw#Nt)~!%biAvO7>Cv56-i2B@oSPxSp}g>)H%mN zt<0L4d}DpVT%x7etcsak1?2rZeURdUh6lE=Y-OwFG->3l-f`5kQ!$uFF!2XIjH2Qd zA9qt^-=Pfq*BfvNa_|!cD@iFE0h-rX1v10I2-zx$Bpy^d)k*nGbOx~SX{_5e--NYp z?mu~0(oG`B0y>U)0JT{u;Tp7>4A9Pxs;zygI;puyY!Rxl&3tMZ>nWiS$7iaTBwi6i zFeB*S&GaO)QBn8uIL^bQfm$o1p&{{&R60M?BadKK;L?axLA1p)XeZoZ7%N?$98%#mtZTPx>9gJ;Kh&tg_14OZ&W+DMFQC}JDa6wWDRs1XKCRDD3@I+({nrXX5o*=a z=Q-sR;etk0^|Y_WQvJ>T+Bo}PD%K8;&msH|GMOO74Xbq<*ols zp0YUjMhkZ#PM&o$9wv$sybk!hb-jZxSqWR3VdD&2{uL%U!SKfeo5%}+aOuA@O(55H zE6b%w44-T055Z1S#%!~ktei;TrWL~rcBPPJwtcS3yaH5K>C`w=d}$^eCF{OfAw%o) zguQ{WaO!vHb)s+_V1bfm0i|oopJ}7J3Ohl~G*<6c2BC;J4T%JiHWv4_+>RJ!nenp4 z8VOpHODa=>Bj=nR#GNxT>B`=uPmMZ=Q7^zRT{h#0`hjpMXdMGv{Q4A`jtR#Y!vcbV z!_Pwd;UD&Tf8^LJT}q(a)p)mFJj~PqTHj$GD5wugZq1^IHfS7bDMP_32Z181q~+MEU;or2id07%H`vB+fx4_F#ux za*siskHIXvPC*%PM$TkR&=x9Cc;&F=I;U)0+E91`X6I zijKz0n%vkyRZ*trA+;3~jCUq%>Q~d8 z_nn_M7r>A0pwrgomc6AixKKZEMyu>_q(nF?rfuJ+5Yt4UaPvPu0de=X^QHQ%j`)&4!v<%{iS*MqEIf&$dZJSFQFyR6!{} zcKfseu5vW6Swc2m%*G)1&->nO>NGg!cSSz*;Exe2GHQp~_=D-FO9EK}^w-w@BDncJ zu3*f{K@B+g2Q~CVLP$JbA1WqY5_gT`U78NXUFr&n!hTZLiRP6D$R7-~-GKY1%GJ36HmmnEE$d&BLEi z$w3OaW^xb@6Q;Qu;;n?ePj2~0yyDm!#ZbaIVATotn>7HMFoT?A%G-9KhzkwWOQ`BHB75iRtm3Wiej@`$u zd(Qu0Q_gwWxNHajhbq1v#E_Rn#sSChn9P{f1^4xYgG9wTnKI5c*2rK@sqv zgk$vN#sdiX-eTC6MSIsMq(XY?#4&0e(VoYMtAnQmd?4lHPh8aDJrK{9*gPj`c0u`N zOXaWv7C6EYjcnk|6C81a*v+SA;J2FB6iQI4x$HF9RTcLU>j+5;^@&cch?sYrZyVKS zAp8@l+CxOgv!C^=gfS00-I4jG*#aKEiL_xX4L@I^Z(vjK)ZFex0+vOxp7Wc8xnLTk zodMB2375Otb~jd-8jk&(Ga_eurS>gJUGe#cSzhVA(M@;tOo1q)P^8&EzUM__Ga)=R z1a>e#_CeIQRJ?$Ss%5NdQwn)PXmS;ZyI`GmBb=dh#7atfM&GoM>X{wwOyV?|!R;ZA zdRfz)4-Ks!5=1wq4nHA&3z$`S+R1lZo^6Bg`A2cXIC`;Wt!Y}xGSsQe&7s9Vmq}wC3sYLnvJj-m;>Y3 z#;|iddF+pu66}B(xEDKSU;$5;SVtj?#C1q=n$I6{SSwGM(Gl z*@H{=;rQ=Ej9D94(E672@_IR6u&~CrFlrvBbgh9F)I3$D5?zWYILG8}2uf=+(UK{! z>Ok*u=~vs9s2w2Ly&GBEbq?%5UmOAYlJ78B6iP_gs(d-ecGmtNRb6}CkFpq}U3LG2 zu=e-YVpE-fn1(pmIL658rQqpggeZWYS1whK2!%g62x8 zlJ9`xP(B0QUF!}_i0C4vJ|u6#kS~N`TzVB+7UIf{+T%dKFx7^3dgBe%$4YZ9KKC@S>6F&Sl#YinbRVqbBb!Ya>y_pFG!_ zlJbw>SY3|n;lWW1@y9KI?P?JA4_8Q_|KxISfT;$(=J<}Gx$ASEk+Q2*3@!RmTS@^{ z6k)^G}gW)c;y6e0d}(FJYj@Ku z*#UZ5t#c~hhehCu;F8xvE53QH>|CI9!p?;l+a?R4h zrK7mx##BIWq0P7-Oo##y=mI~jvvS3kW`CJ!YF&`&yS}l?z)Ezt17iBLza0}NvL62R z#jVixHj|4i$Bru8!}fwrU^>EatIdBeQ%>LJVk-`@xFVbk08zPM%OzCe{9WPivkJbb z@K*YPk*M(sWeo^rOln4FA|z9ohArx9h$)+MiPJ?t_U5qZ$kS$f@SH6w<3dz(a3HjF zW^+{^mU*cyViNxjfn322d+A~*bBV@xP#|Y2H2CzG#R(`3cq*tPcAh5>K-gK5Z0ts1 zjFK5Ba`q;{0a^@yXJ5g_eN`$jw%cfd&T!O&apa&Rc)Z-7TjHNyGFsEmH7gf)omJaF zS(Z>8#I69Eao*^d???6x4HDo}9HrXy;btn- z6F>Otz874Bd5LCVi&ET+^6gQIYqczs$s+ymhsoO4#1K|!X(b*6!pws{i)9D)+CRNf zceJ-?p0a|zwZrJRDS5?9kF&HVP2Ws6!iP9-;MY1uR+;WzHH<*pX504%u(t#Wy6jFtwh1t% zp+-KzbyaOSmVXiE5lP9%OW9anHF5Dn{GixZ-QJXdkIdP03terDO`rUXz?aI9QXm9l zymI3kgJ}1A&4s$V%8M{Ia-Q)Z&G6`%sF8VJ$@732vg>Po^##}Ciij3$#*mLGnSq4E zR}028br5F0t~Z30P6dN`>qDuWp@Xz%4O2d~OGi6T{-?bYp}>^vqyV|kr-LRN zP@SB$Op^`jBg0j@3p@SCAtCf?eOy><&tIOjHS{=EQi($v;e~N;PTm%Uz7T6-eDUU6 z7HiD5VrsWTyy&u8@^Ar;(Nag~L}>3c;3^;-9bps@hrV8sx3U+g_X&@~s(zl``>03q zfc~VOXe9H8^HBhKdLj7gji0FFas01Sy&LiX)u0_TD9T%lwy@wXg4og9bNUKgFi4WV zks)Tg&cPNdVY18zxFrDiRcQtYWU86=!d*~}b>#?>u9d|{mqiYUgH_RSNkJCotcBmA zG0>wB$lZ{}vG=iPlS&n_I=IZ-VT{oz$2iFgHzu&`{w*J%^NKf`xMb6C=(-?F`A|F( zP$;!N*y61Gq=06$s+RYt#=)FFQ7u?ie@MQf0t390kN+fvOydq1_#Sn`&EC1Z*=`Gk zr!3OXKz3whax3rd!?;7CQ%UAOWPV#@`<67-MMo#-^UGL=S13MJkhLn^v@Vl7!kMM_2OwO)=P$8q-hdkDFcVqA6Hkh zU+ZO>RO9HCE~yRlA@|7{UkvqPM+-|V^v&7+1-G2_x~JL1aTdQ>dwyNTH4xZU6vJ?!MSoaSA)c{wM9urSvq{@a!w1u?shFD%R z<=W4G#J1^$TIuZWco6)I=oAT1aH0%!MgzIZ7_AZX54FjZNO)=Mr*_`@r39)%c&4ss zCgqDmg_|a?3;A9d$71%tMOFPnuc2jnwSq+x$=Nj-3iOK;dFa9}c%e&dZy19}ndnWG zxggr8KH?(JO#vwTF|0iBqPp}>cgZMxLPypG)>1Zqq9O~+%|Rc3qXKi{{c&4p&p2*l z@y1P*@x-8Q0Gdj-&!;5OVrQ$($RHFs6zRvW>ZfLkqhLybEBF*|`2|{48d%FIJnV4p z*8F4*iIeuoBA!ScSBFX5ZH;6)ai(Ev#}$7&K(Gla{gV3}HcvQ@`cV{)dZ4Wbv#a*T z?rs7~-E%C~T82V43`v>Ky)F%A7rcHk^WOIb=fk1x69d0qG9bV(qdQgRlq5ZM5qXgG zjfc*zwG?lFEYt@xOP*f*0iY$viZh?ZAZ07B7}C)?46MF?JVq>NaZ}U_6xPuPATDwQ zyJHhuaz64XKWO?)>>&(<)u`~aU{Tr3?Bbp7l$L~Vu0dkE=Y~edcP|q?ky}tWcBRHL z6qAj}7_8#xZuX#o$=_Q`psMD*4!y3gGp9y;d+7?+19!wvH!<(mEmv`8X``%nrqlnZ z2{S`fu!qx9J&sBZSG)3&dSf5Pg%qLc&1HCL*kfglhi74xJD*zdd(~x5y6LFu`Ul@? zpuLS|+m@yZI->9glnHUE*TtRfi5r|#!Fe*1S|&2iaE$&diB#oYHx1G@xizP&btt4; zlf4;Q6e?o^@a)8*LRYZO6B9o&{wWbOU;M~oMW%M8#t(QOuYXtIHuTs3tnPoU23=iU zIgjLPW0bPa6g^D=?Ew-4W+x?TL>;D*7^NZ3TmSTMomp@&yYx1VGIRrM#lzSVgp>_6PJT6>3!{o7>Fh)2}+dEZ*O-{P6c~%b?uD zq#wof^RiLT;0ZEGDc_8!DDw8(6_@`$5!M4#5~?KH$M5ed(TMuQo&^@< zPk892Ca$j+%?sc?#Rcc>-hJ@&$P(zXC+0bxm92P)@tu5lf;9m@Y6|?9*Yt6n_SG_a zx;1j9QD)WK2hm)Yb*Z@X@$nu&DkG^EiJ_8xy-*W8tIG_BNf6y4PxyV9JXWRu+XN72 z7$ZVkyd1$&MVd4I&hOm~0FO!bcrzhffN%go2JX1+-WyqjOJXcn7{>838S;wX!>*tf z{I4~hqH_NDq0N6XDbq*dhMaHFiHOMsiAvuvKUv6kCudK+(1T~131wWryjKGgcKHNr z;VuNZmX)RU+)_+fJxd5hgNlJJtL`8x(3^QQ407HJ=e1#*=e1?_Z9iLDHLfyqb@ZRf>GiWQMi{9Zif$WaumU$`kKE*Ur{x8PnFD1Fru=K0I zqiG$Q`rGnI_iuqb@C|0pPInT^7Rv*SX(FA?Lf4 z!(v1J_aq?jNKg+!-(7ypF<}wPKXx@G$LuIEhZVuhH&K)sAeitJGkaRIzof7^w6bo}`i@=eFmp1X30>d&GJ&!3vvd; zN!M;~@$5+4!1GNBbIlYp3P8-82(e#&Z)+JF0ZijlF`nfy%|Yqk=4C*$5T9FKL-%;0 zWfADKI!!?mJ~W!k^S!rf#87HlZHXK%Ff=4Na5-?|?7>}Pjl*>-Fh$2rl%)_WJFnNy z;P#vDFUkRjx=2VoO=0F4ilVn5u#e!>2+yYI!~}O*uVbZDCykU|ReDs^0{BT}^6bCI zwzS4e&T8v`CU)Rr`d(i>pk}GUt3S1%wIGC zS^UU;`Mr$_UN{-U+7vULige~K{;+x&tSt7>^+1SA zc9ukg21uN)`B5!w`5dXXrdqYRrX+HW)v@8b6o@K2xp?gFr_R$9MbC;pXD8c_Wf_+} zyu~DxS@({ie0$hF% z<;i6E=%ALDr-{kKywR13&gbVbYzFGHIKVVAi!x}#7A=-dQ8F_}Fdc}|$E&Xp`qjAg zAoieb);w2anLHVp0hR*4wjq2`0i||jTeMil%Z1sl3wk>t&UWZXS7(&2p*6qTu3~sV zN$;bm<0en5g}y&yC;CUiPeZpomidJ4XER+y$iRJ133|1{L~1XkVmmGw?*22P{o?<{ zdijOKVHATiba_C9Uqe>jH`1@+v{eJT_@n{$#H4;vwc}GkqWz%P=lum|qJI7KZH;&r z7bQXnG~Aft>MLlzM8bbea%#yq`M+44e~6;zIegKCA7T7}(S|vSbslz>=x3=vWC-=R zozq@N?Vk6`O?vbJOW}`m1Nc{Ui@D*uSh`*av8KPD5dhwr^Hu~hjC%su+ETJBv{E#D zvf>0H#9zk76)>R*G&QF+G=jB>Sx440Nb^ipe8Nq9VpG|pQttmnwh{Ls*!6p!uLj@0 zqDZ2|+$&bzQPyHdIpsiDiEH)wjPmS}W72}keA--rv;A(keN{WUrhAsgJ0+oMWOaNP zfO%bH=fh{}$vAuTNb6$x9$1T!3fnr=Rxzhw#= zVVbdvXzo{ulVl$Sqd0#3?0_!)dS>(k;XF2WJt*^jKjnQvbkT8zLH#LA25#G@(Ye!{ zr=Pkn_4CHr?TZY3ALw2XKUwJgqSARx>&QCx7j&`O;vsEw-WlEKI~E>_K(a?7^$tF! zFfL2-+l2r!3p+9rSHguScD6wTbQLM)eTFUgQinIa<55J3AQ>iwY8kJJ)n}wZW^$7$Bt7JnR7yYA|`^PNP`4-Eo-+a9rh(%EuZpQ z`y|tUT>@|9+Xq)w_3+g!L(bTA6oSE?mPodG;U=GlCdLPKh4EWqRHVxfgBn;+$*{fG zG7U!6@d00Rry^phnfOOb6C%HF3i|0jyS~a6+H&y`LaDZBxfa7{X|ADzLwZH85#aaQ z$cyI9piH?MOw63>Q#|TP+ljv8th)%kU9btgSX?ezmhP&=54g?vCK;E8?WkSw3_qdt z?327d%XcTVOdvj$v)))xq+RBS3nLYw%dx_SH;TNJStAE1vZ11ha-kM}0Y9B@t~7kx zy$g^Tq7T()mpI6lvpCV{jd*SmUDU6|G)7nou9Bd+K;Ivau@Q13R=E8;(Z!E7>Gboym z{%q5Z_y?pVD!>$Gh~U2$^-4~6gZ-_={JfEW-r}uB3-R%d7x4~9();c^3B@YsV5e|d z*SH@*5V;?a_6-nHm6V|Ux{8VY=O*eouD}H5a$C z|3$uCEZt3~y!5PxC4stDO4OEyODSE7Indg9(j_~^95Kphb1`==Q(SGWK0BNS%hB1o zQKyA{FHvK+^*(VX@Omy>_ukjP?F3l>Cx=FkbxltL%3()sC#LF9llx$s@KKIOj*GJ- znLnp)PK2bBHImf@VQsq}J`N-Xg1Ea==#>zDGY6ejDWjePeTR3=b{AA#)~@5^4Ztw8 zB5L=eAWs=lDOG>PF<3P7W)XK7Ql(;qYxLdw$(_BSl2fLA;R#P!w0+NM*n?j{%WZbZ zVH8ble*P4F1vE&kGtRN`v7k3<$H&Uxa3@f--D)}~5SQ9Ndz1~D8#ia`woA^&;5vpy)FdK~W)3iW(3<^q)3U=5iU8S0r*V?U~$GE^G(NZ{vk zMb{r@F>87?lW{4nv$XKq=#q+2HKl0o@Hob{dxX@uT8N$Lyo48y&kUOA_@lk+3-li! zpUvTrN@tR^?5PfU4b$&8B>6!Wl_j=p)27)H`rYYISddFN?RL*xxY;EdL>CiRJ90}< zaQ+_vVnCh0wS3-!^H!jqf@z!I&Wl(4B$@yKAOJ~3K~zU~QTG0v8m_ZZN{tICcKU318kD95a(G1=oWW$MPLQk zsP#*-r3#M7VG++6(bWjT@V#Tr6G!;$^gtbrz#zDCl*mBhzE^A zxpE#bTe*fGBOiF?-EBoZJVYACMm`;k{mLWx5j>{pi!tSUB-Z=RI$mHoDF7bOu~#22 zljioQ4?WpF{p9S51}-idJPRFbctMOYh)h`LAaW4_7H>tvmO5fW7B(vbKqNjdLo!xa z?Yvl#RLXAk!~P3BpS_RkASn-^0VV2b1`t8Ep%aWUF?Z0)hf<=VtMKgc^K)J9^-Xh{ z9uMF=%;R-lH7iVdW=BP5zXURW#w)iK+2n0_XdrHj$|A)vtKiN*c)}Y=-5W0RxT-G; zse?9*LL|2lZFdNcd+(Py$n#LpzY`d%%w4lxj_Vq$;9dOAU`~L+aR~tsx9=1zZIBMo zH3@aHyT_q%sla3*c;0b%;e|GFo#qg&;yaO|5_U#M&e9C5;i~Q|s(rAOlaU5P2WKFi zJt?+cyehpg+9nfSFs&5EIzx+f)k_G41q4N@0>N7wtgy-z1119_@x+lDVhxO|yz)VP zt!RL${Fye}*o@eYiL&%&T| zT{hXa4J~IursXMhIZSl#EgVG>mDO4|+`Ka7rI(<=FrA=hQ22cVbQIo`d>0%Q6}bE| zG)>A2pbjIHd3IIb=eoisJu5tNP(C~vm6{b^ zW%o!oCrnxrud4Gmh%<1YI|WXOjLCL^PiC9XG61gr9_V?XSnVVhm|V;c%1CXU{vrDiYm`aZFPh7FmuF>70hoqN=IsGn^i1J zo-->URkuyd1!XG);fiRgm{zx@R+tSrCdkL0m|ljoqc8&xQNdTz6)8+zhSu7d7O`U! zsr)S^Hcwp<73l1NMcWkqHkCS`e z!~EnIr&M6eWBpKce&}O7flKd$G}m11VUmVJ7hc@NdBDjvg+sv@Gha2%TdA`pa=>^? z`Pn)RQ5R8_TKZ_`ZPF+?S%;uZXGbywat?2K0#3l8V7vA%m8S+K%* zal@tAdu!cUdp^K6#1D>$g4!bSMav6s*or_6)dW@t$<8cWLBxzOoz{^l(we16y}r>ryL~d zstb_r5O3wl?KiMjzW@anJaPrJO_Y;4`@~{rmnOkSJ zbs(0THbckZL#C4o<%r0YF}M5D1~^w{w-o80-dld;P;felcCAo&lzliwdV{jBh)=OF zc*lTjaN0ND5y>Km$}WO41OcTTP63DwaBjsxA)yCr~E`Kq*s zrNH$&8hPej#n(`{jR0r7Gmn0!?HAI(NA8&@o zsfYkn&k~cCInmFcWWLtYTYTLOq-JR1$*p5yl65&$OjZSdiqdwhD)?Fk2klxsXS zW}=dIF$OwXxWE&9!U$1)MIh`K`K~=C^<+zt=}}n>U5r}!@@fK>>CKWW^!G`%-zOOL&Wo zE$e%E-6N$>K1m35!KGt}!cHgHt8>3?+IX)Wr9a8#?N!f~yzEG^(KApkU8QsT8C<4S zO!ya>)iKaOsIb;~$v>5qf0>xupZ44CXr*oV0SF7+#7~@g7E-G7pRY!_MCK2cZ0(1<2(XkiP17qo8n#1rVV^S!q_%ZX;fKb;I-h z_V2AcpfNl?G!%JMQE0BW;Zug?b(E*%A*0^M8ZT)Fp*(?dc+lume;O|ZIf9}jNV8;c z@lPn4D_4~D&yXh&ZSwF<1eLriwZVyXRbs5!Pm9|s+oWBKDU6bn)g8{mFEK*kb&jP^ zWhBlNB}UrW?!{4phcPUct0*eAf}21()~H3WFDt*2Bwnhsa!Z(S(q-&CJ6{?LVP(5* zttXyP_K|}+pN&^bN8THs=l#Xw8lv2t$J@ID`gzbSw+P)1h)bj59vm6;Hz)HbGbj4- zoL;96FCcFU5U4$ydeVF7r4F!a9#`(tD4p| z`zYO8m@_#EDE{aZa<2Ry_7UfBMMaWYEMgApGBaY+^+(}d@#F9Cz5o4 zS^J|U*1NjXhlV329GF-DvgGRaTw0(PsNX=yRt+;iqNwLNZvy zB>gqP=H`HKMfnks#I)B{4?A742!57(oop5KiPL@>0E#jztTylxCSxL&?UpG4Dz~nx zG4)YkSM)}^eYm1F^XZo;K4FE0KF5s!B_NarFW`yi#?W)d%^`C3*eTz?pU-SKRSAr;i;G{%DX1_ky zXded4B^n{&qMA^XJ*Qn2R5k=s!82rArV&8M<8~{QDs~3kaEB<;W)&!4EQ*2(M><}K z3hRC~1EX9I!9z7+T*-847e++Z=UD^lLWhD2tRt{aT=R+!E;~)XLg-~kgF^1I><>tK zLhngEN}u=MOAC0S{7yGYRErIAdX$4qO{VP0E-%a=~6z! zBk(|m+o>p;Td*A3Q3qTNRLiZp)Ulz)%Ob z$_zW(0g{rE^CyR{;;V7Ok&l5vmYj>6?{trYsv4U>w;oCl=_`D>ar@Z-sBQ*^Q;CaA ziVCm0?@Hev^VJLRp1)fJTl=C#2T9V^E{csWwc;y*dD?5#mlN2A_QHYPc%EKPpu`>u zf}gaji=Knh<)PV%4fPnq0TH=d;Oy9;+Xp;~D5QNuFM^l8F{Qp?NI8Uha7tCxt5M|v zP(<+j-~{Nt@x;WJd&J9L9-;WiM+Uy;%Y3scxUWCugo;CqAofc>zJ=&A!tg3z9J+YV z&hX#^K)8Rlt4L14n%f#FaTpptJrRvaw5gRNAlYlGpsoE(D2dFX$0hn zm0^jj0WPg9R+xqLgK@>cn9r#-30F@&J{xFVUDYxm($JaT3{=^{qw)tgY^#%cVd+Erp7&;*s}uVZV!zm5{|GTT5lly}06Xo&nsB*XYXc?Pk}2Af!H_ z69OHS`)A6(7$~zTBhrwvRVgpia)R&2+|-09nokDB~`} z$l1c=tJRT%ygSifywZCh9|IuR4u^=(UFF(%O)_^u&|QOLwl=lCr1)}nV3zMnvM z%Bi8pH$vmoWS+I!J)PJU-pTM%huc$sQGQ)D!Fy+eiuVNK!2mKL!S7Wx}H&O1K5rm@_%wJcvlS zj3m#prw3rrOOWTcb0_2Jr+s43X8`2B2YSQsv5yVIUwwNRUVNeM4*1G3{|p+9JJ^r< zet`G?@Ot>d=QqPc50>ajvO1_YP_u8F!xJeDg)1pOpeCzA-nr+hqU)(*MlggT>HJV7 zY>GvT5lL`k>xxC3)z_gYycPjc%0PRS+`On<9c2^a&55?Cyl9(q5Cu0Zr#~7*St-gl z)Tqlzvkmt+yyHzZ#*>Qg9ErmfUVLPuxII?!t&2gh4*WjZ7crq9S8S%-$IP=8@KoN# z$1xdVeSqmfyo8zoGO5?NnzT|Pz{Nb+s`%(YxMZXtIa2_G2Ej6iAwP*DLMm`BXm#aB zi4%Lk_$qm~5T1i*Ks2IyQE~H$^`bmb6sHCrwTR)!d{uXu6L|(ZB}n61f%e}=C=cM~ z8pZ%95&aM_(m~t&q?afBGDVB5Tjres`5CSmm&8zd|R-RFvWN@T#-odug}q!hl{kM%>6$v3ZpNC zko~2v<_;sB^30&z=I6$|mBm<m!4`*? zK(!y%B6_9P-+B#jVIx}L@a^xc?8>eh$vs6C)g>@T-rv1BR}x~BDNW;^xay> z_-hnz+As#dE=oupehYUK`=C!dn8~YIAE18{*hx|j&F zeIucD=Rus(g>d3$#_DI*r1u&IAd*a4MdpuUje^^OuYPrx*L#h_V~>I9gxd%zGXWAt z(htU43flyON%VUFzN65UKl((wngH5|nevFHHcX;L)YYm)xm~!=bieH|Ws_iJLxU{0 zJl{1o=Aw~*#_7h7G$OKL3aurnGMi_tDagFplv)K(XH7s6cRaGne%Zf|ysK`yf?<6f z|JHBK0h8NbdQ`6HA_rIQ|3@s$iw`(s%3@3~N>O%C_f;6Z0O3`9Jxo^m92qHd*0bRF z5L&)M+y_Llp=Lnj;0O{G$~1xEaK&oNoRBcUymh@@gKwq6MghsYE>%+v2yo#M?Tj^& z9yam?uy|6g`j$(xXJ#mUpU2opjRL&NE7uiU3`@Kly*ydo=Z9?O9HX0a3JplcKzx&- zMg}7O6G|Ab+d2jy11;!n!w107T;`%eju@mevrHN#WA(24fS#Ihy1zb;Awc=pnsf#4 z4qDt!>^Zx{R`C_9&CHxXTEwI^gPk;ld8D_u3zR|M&M}2=3&? zBWKQThCBEsVa)+=XGKY0;)hM#|G)h5eqIOW8;Bo%*uy}LfSwfN$U$H@ML&d00)1*! zp&x!xS=^3o2YS4e%<84$3H(Xm#;@PJqzcNA|(p9|{Ug&3c2Q zjfa3f^6l+A-PKLG^gdcUUAu%ALHo8^*XzE(FAfFY=@&mqV^W1rVuQ~ENZ8` z`d3$+lX>3*h6x;V+JBz2!E@PHfBJX6PPuibd8PK-hI{UP0Oe;3kWIYpz@0MyNYB7E z3{J=%PuD#-{P~|hGracN%UDE~DqQ=!dCl*7hb;hf_&fl=N5mw1JCSdEc|HJ5_uS(v zy&zUlsOD7uKHk-F9+S{(B=O7eS^>nm)^Gu@8^}^m;IGn6wrzB zZh`L`IKz{WXITM$;9V?I#CdWN+G|CJQ<;IKz-e$AU%^y{fFhDnc$L=up*mw4aH&(l zvm)qTG#O2Wg`yPBHY6kI@{$lX(!^=1g%A1}L)8|%BT7LO4BqZ)MB&#J;>&nou5wBy z%IHB~JxoNbTkQ0EAw9VlZa>IJRx$~&BPB~h`W*(#boVtHDv*Xlm}W$}3q85&>j`-1 z7uw{6ycB`y3gzA_j|3H#kd-=v1V_%3YypE{f`7$A}B87qD`k}j&8SxpP;Yiv|f zRR%|JF!GrE#6pqtF^w8OeHT%$-Dn*Sx^>p`@}WA%qmhn$SGSo5Ng(7<*jO0=EWxp9 z2yP{m1-PjePC@aZHw8&AY>%D=fVyz8Ck zhj%=BhL-2J&Y~FZ-B0t(iK{obyzIliRiGrjdth2+KZim-KwdvpuIfSTVl)uc_>j1! z7>ZHl&sKx-^`+q++FiVO2YQPz`@jhYkGA*evi!(s@L@c1>f)P$F>5M0#=tuT{&bnI z9@}L50ENv`JL&ybhWaxAK0TNReq13#zkD*3P*vKp+ICc4;W9K>n_8d(t4xlcvLX-Z z=rU>((Waw2^b`@72OEHO8`l;~6d-8k4^2GkN)dp7{jf}MP zwiv%00ty%WR6A~O=TVgJfat!`Vc_CfAowVGTo8WHTqx@Ur~<{a9*4*9bel^s{F8wY&<>*Q9HfM zrXzd{p>gA;TG&N~6aj4MYAIzk*f|bEF=LKG1&s2WN1-v{EB5~51|`Sc*X5ts`;Xl7 z-{d^t9E!r_h#6_!S9jGQ+d40o9EL?w?b|Q@_`U!QfQE(>XD)9Ms`x8tFxK<%P-@Ek z7|#_hLkHdkbZ%&$13Q+SF*kxWr(WW88-NEue-kf?CEXFZt+fgNXWbj6y*amP>M)CO?&z03}=$tn8lqZ@KiX5f+3Q$+y+#05$3>X1Z?PK z+x+uU*oZA=9F9ep7NjEGy7H*#8blBAHYz_zJ6@F=n>3nN~)FrJjVN0zto3{WuhuKN6tOHTV;Nv#iI5@!H;tXLu}h z3N&txACa8+sXXN+TPZrI@l!{AwnmOQ{n{ruGGC^-ZqWd22NR-i_#t@-5zYgnb=C|r z)fEf(S%yOKnAKO4r!R-{xgU3RH;o6dW<$5nGr}VZKknlZtmTA;0X(|?46qDnqTr9auIYQ!7d$rdWQZK{j2wc^1{kc@ydghaSwgD>t>j)&q0@KTz{DAX^6%crz zH;)m}M7Orh5UBJTn%c{2OhRU22nann*(aIpvb6ezq<8?JQz#HBg;D|X;xl;OK6^0533a~ElCuPGe;G7o8Zr9-t*dz4 zcog4TeN9wCYY;(i{|?Ed0T5nXnSAoGDk2lVfjFGvcVCuLMbrG1fGat#Y@ z7(Jh1K@beb7)lztt@INBQ0}1aAUP+ zboHd4u0K~s>Fqvm1$tw*ZUJsw3cS_lA6?V~E5u|p3bNQbLsozI=i{}tn!!9*McdJL z-Tw3TAR6O=p-&Cw+aIp#<%#U@!vq^wI6RXW0BN@W+#7RN90NumkKV0WbQOwS4rl93 z!Go?C0AH7-fHa{Al_e95PYFkKV%0$poW@}50YEch{&WZm2;)%HB4TtBHy={!clXHq zbQ*g=xe;C{6o#;eI(ZQ!jvHcBddn1A6gfXlzC!6$_8oD2b}K`=rY17wuNsE|6xdWwc{yHYWz4%QkJUM#wM^j)Z& z9kPzQ8mC>9U-~*--57M`7pk{uWabO63_Z8dB}*me4oD1yd_i{N3D|Ku2S235i1^(E zpFVW0`dbWL%NJb~8*0Xs2&<$@>Rs_+EF*KjKg9*FQ+n_Bubko4d6W+`x8meq*B?XR zPQMrqvk|^boUB(+5_&8T6*#T369WUhB%|@(wtgEh_&7F>Oz8e=GV`#ut~_@dPy){< zcwsjZkYf8AOJ~3K~(S8kiB^3faQ0>n^>(e0&*OrdYqel<(U3mDfpCz zxNuBGp;J9_cSRg2N@5EVe=qrE7iX^}eU{cFR@En4RXQPE@#U1TKU}X^3 zJF?YQXBv}7Fs;`;ghpOzOorQZ`B`7Qnl&pu^rTZCcmkQ;Kp6<&U45;Wo$meZM+L-q z)Zr6paXZz*(P>WnN!J`ur1v2EQXh~iYlcQ1MVBBniiQ4Vm2+S3$_EYkcA$GGIitsf zyR4B=A!S>A5Eti&yOLQY0I)PIZz0)Ar!gK}teu1Cmjs)x5amwZau)#RUCRdHW$2w- znByEHdztriD8mSuq!4OmdqG=K7ogA>A#q&R*qz_6(d!ER!c~YIm=r;57XYYQSGR&1 zhEIL!Q$2Yg{^Tb=+49nJYeBLSwu;$HRCcSmVhE(n6;+e1`(H6nL@-z${^7n&&H?ZQ z>Wl!UJ1GiTW7-@00M((8EkWlbO+7QHHwD!JT!DAB698Z$Z@pzN7HRg&Ms81}Ut{7* z;CLKEt^9e4&B^ZL?#CW%psHE)4I5VLpWv!uKUgfP)eP$d8t1)-(JOZupf zAkD0xjS8xqQKrkEtpNAV(}ZTp+l8_#KO{_df&ILG;k0s@zVxh1Pl0qaoej>6kFvA}2)5SOfN8Ds;UFBJ<>2@Je%yZ? z!*~m!2aYuI8YX}&m~$jl9mYe-IA;;zr&Yj)?;1N5-xVChrZXrzalXAwi-k+N(5yOS zEM<4z-2&!`#>Ad8;Yng8;}z&30%0fvQWTl1Pz!{VS|e?lk5s0lNW}xo z5Aq_rBvEmdM~bS`YwVWrZ!y^AkwHbz+k2rZPuamp_x7U?`B3Mry&U@GTN=lE$Jp_aceS^F>i#qP}o;6h1qWV zuv{uVag0IsI~oBO39Xv3E!rfN3q@XJxsr`#kF(mzxRdiYp6h zl*R@aABhVes;GU+qJ&7G_2MapS{`Kwjm-;|$tRPQzco!S^M{3UQ~IS-j>F}QM{av* z`FV5;Dcv^H?Q;bvq0Dmw%8TQ2G6N`XwbZx^Z-B@XEVg}MdmgGSx03R>eae*09dkDT z=3NW^|1JVNX_LPzTmO@lXXeEM|&1}e08m;iakY4OGieJJ=hAxYu0_n=#8E(3^QRLb_PRD4KG+;mshR1kA+F7e zS)gXcZ}J(V?*i7X6#aymKE!4(%pKm_$ezo&&O>M3D%K;2AMQM81oX)*E5k6wXYbyE z4AobN?rTMG7j^Wg>t zz{5Q~fHDHHq&ZdhUOXlWcRv<3tG_UgIvhx{2J1u`wspzQAD!56ETyjWa}bHy6!Ae` zQA1F^^ z>07c2_|zyU7*y+e8cZ9T?ld@y zR~z#V}6dFMdx7F46nc_{AZ7=V*B&AA8^=C&V9 zB%B9#m|FRWuT%cOKw3IU-*#}31!?pyvUjG9Mhjy{6RmZ(_y|WT4I8VH#Zd4Q6<+=n z7Ow?EVBv<*2y&&FP0CCY#lgCfovJ)!#5L1NIw@;O=f1*ujx*XOs}vIJv7;Szx;|Um zoiB*#@<5Q=S!Kb;8jv)n*SO&NS#cMGEqxO*?T&JI*M z&z}>I019JaWTOVa!$^3cgp+Qv zLzz~X^~kC`tH(&-1!hoUY^Muv02%$BwSO2Vn9DRPrq1*YqdEhUv(oMCFsk?}yaN-m znKb6uc@ovz)|AaG)+K=h7JVPXY+tBx8h)oi#Ix{56IpuIfqrEG-k8Tw6rLVCYw#Hu4=F42Zt?e=%dukJt40Pv(d z41uD|5w(Q9mhx6x%>q=EQgo$2fgg>X8@(d1gkcq5hQbCq-SXuWDRIJ(Q7}T*;YK#V z%j>dB%!Uh(9bvep@Y0V|r%tOOFB?FlEk`1Fq71|{HQG$Twz$rg8C|2zGeZ1(JO*N*^CSdN0h$nTHCl51aj{#L#OBQTJ z&UJv^`oxnyUDckn$^~h7S!H8QBp?>6l)pw_m0!c{l)na{Y(8gJx|*4~<-Sc?-LX>X z%V_jK=KhY2$}*2|8F4#BgMgpC06WA-{2UC`gT|vi$OL~=64;CiT zl=@k+!uCfdFKKRZDlbLxk^Eo6RmoqxKn%b~*Kbb$@WwkS^_dsW#^?1I_?jfAPg+{1 zOf*_QL(r-t?QDCsPGb=+6S$yabm$_bf|3iKcojBMtTc`rUPUTl$lWSy!J`^sSI`}* z(}a!80-jx>4QR{ZQOsGSN@8G&Ro z(ywiQ1Q??R2b7|eYJezIC>29F6t$ap>00V?k>0O=Gv#^-%`4m>~4x?F=lra2pd9{WCngtGwPb0@*& zg|m+Q1GA8saD|L^@Gm@*0oa&K{T1@`cLV)m{#|6~zklb)Gw|>J)-!W>uRsjI?u_@} zzxp;?l+VWHO!^DM6p)D>@nx@WK|v2%ATm8*T!F!|urAu47clIx=~J@`mAD352 zg9wwL7wq!ZI%a2mwztx3dmDi@-iTGlhskfdF_-)G2KF=nRfRJE*H_RuIwhk*I-CY2 zt&|T4U~P~kZHR%2?{2mb0pnWMUR;*q65OINOunAcDliAaSJG8}o!1iPo&J`ef(~9` zYC0xd3!Yio->@P^?x=`@$gIcr6lTcF)g-2LL;;jp!CiD# zB_tSamweMmG^}U4%_l9i<+3c)Va84Qj$&#HH7p*~(g0W_{1uM|i`=}tHBiP#cD6Bh zsDQXeO|YmSLHud3BI<~*qT5&vfxgpm&YeX0>rRyWJ9SER+?m?uO)q(surmSAg*aQV ztTwdx8635Q@Q{?aRF*ZXTp0+N`7dbWxJs(< ze6_I+MZuKKMexXDK#4S35vBGBwq>e|ik(79kEI=02_uQd`==2Yb|QHyuyCd9RgcDO zoteOvitPRdw}G~($20zJ6xHcO_dBQ!L9d6I9M!9S1xBUMw6K*vf+FoU2AZWQf6V)x z`go52 z+&>LK_$WG3Em=;#l-+i0+2NoOQ^I6#x@>{TnT>Tx0DMub`x8D&t<0$WTfmkPD1%^K zO+(de1MMAVoVi`IV3Z!HhzqGRWhDR& z88|C0Aov37=FAajWCaYWA-G`N;*nn67N_SnIaceRf?4Z-*zXy5;eipa81qUd{B^8+ zeE@_G_C+O866i&Ueg8m>8Yuw|1=P;8Qyndw{tKf(I%Q;b5Fu`wp(C|gGr#3}P=Rn{ z?;k<6D`)7H4dsmAkhdD?$FkG4qD#4a z=jiKi-0q9AYY^nOzcv5`Q*n)f(|=zM}UF6Obhw z8@Sf%enj@eYB{2T=<_mVERctJN7q@P9ot5LpspA$DY)u@$fF6N30~?$t}E1s=^kVN zFp7gap=1yg6J@92Al6U>se63~rPVx>0>2}#Qg)_`kQ5L`C_0+b)PElqOPgLUFY$nm zEoK1z?)iMbYdVF~7kmg!{w$=U@{Cf{=_kH6H|cm3(ocTnwiWO-3o!1KloNtEgYSJ~ zo*PKj3V?0Y_XMFmh5@mzsK8hQ2iA)X;|E=}=~qd{#bYx=niqb(_D^>RnoMB_o)j3s zDI%7kSOYeogp0G}g*M}08Hg=a%1B^#p@>-dMYj9|5_+|_nC{0+UJ8>XLgf|-!YYnhHR$W95E8?Tyu3T^N=OnT2Q|EUN*~9}J+R zGmV-E45=O@R3B7Co)cSYPEa2DW6GU-+e{K+5x6&hRPodgre zQ+u315EOgbFG&Wx)fQR9_rAVUXnQJ$Z-^^fhMny$1!RecERn;ZLYj^&Dw>~yR|kWO zNaEI?Kr+4HO!O*{t*d8At;w{e}FdFr1 zNVNuT7TQ*th9k`>PK@Umd6}|rM|n~FK6K^`AjSQwRCryz(MRRKH{H8;Z@PQeS9`JkNAbNIT=(%=1m0zW9a^^#6$IZvB<5i#bI8wUv+%2-Loh?44bMz;txwoFih7$*Im;m*@^f?)_(kufRfB(eA!hdEWmT7~ zaMzFy=yY7gie?&|66M)fc9_kH0x;6&iDG%|k7(Tmpaeeysx3{M! zo>Xc47Nfl07lV^sw3s>CvrZacKh#`Wc)g>;2o zy)h{Rf`dgi36)>dl_fJ%5o!3+Et-eu79zB)MIu5%lfL31Sw&+B)v{DIbD6R;Tv$n~ z_7Whaw1y-Ro0JP-Q>a6bDiRv1?}QyQ0AO76*9<`AXVkxYZ+iFLcX^xebzW=lsJuPh z;OjNP$5ns)^Irc)Q1XrV$BrH2Q(y-%9@I${3azga_Y>e%c9X%Gu$x(+sE>ajv_?X= zc*zU$(XoUbGb4x?hIBeYpQi`i3-C0ZGYs$f6Lt1c?Uldcl~jEK8X`voPw6=WNG5sa zFP!y~z9uhQDnIWn*u1ws!EQ)V0T3r( zGgAUKOR>AA*Xp17d`KKZ9#V;B8H3-Y8 zzed0`r~W7>yZ-LT*JzAKs+2qP(}hd+RXZ}3hTU#e&bEwlDJHCjNqqEWgi`=VfAdr) zfAYct{R7_4o#XbXaet(y&#S+4r!9$Q6jq}T%Sr7690bjR0wo=`gQ3i(6?YOcVoM%? zYmelCvO0jstoQ?M7ZEPZm7Z0iK^f=I4Jb!>mH#fI|K&@U8OfP`KK=A`_)&$3Pk)_y zJmeZFGI#gC45l+XY z*(!_~@`X-SKxj`*mfec=K{Ur#KOwWe_cZMb8q&1<^iF0U_EO;S z^Lj05uMsA~Z5fiHu8~+mZ2`!#;g(3RIn|bS)5kTpud_Ve941gXNzO%xl;ENv ztG+LpFKA~g&OGc-6g``Ky;G;+`?GJzm!IIV4rL)O#)CNh)AFMsfUCetkg%iwB=jM> z2O5A{=RnLLB8-wVHm3<2ei%mj{mwLntr}JNq%~tJJ4_0WA%InvoNJr~SeRC|$UuKR z&EFiO|J4sam_GgTXQn6k=%4)`@fTMFU*>nm`b|L3J4~!qpPF9&^vlzQ3m2wue)F5t z#~*(@ojZ39%I!?p2>hWTf zA&TavqzVTd=L5FYD9Dosy0lulnf`C}y5HMDE(h!}>9?vl>8tW-A06h*M1_q!0XsX} zALLfXFX7G=u71^91sfid6<$k z3O^Tj5X0(w7%&37t=YYk%`Fe&XdHZhqlN&*COz+%%&6|@u3~xrUd11Wd9uDXO{0L3 z$cWEt=oiK4sEy2 zn!7{9;FQQ&jA_mu`(-2MQL}X!v{;6KrM7bf=#*O$ zPQ6tpFo5vC!<{{QcKVY)`4heu`0eST!Hc=?j-0Amz z|6RV0-{S^kDS!LngiOQ9 zr-b@4r-RXINUs;-_SE0KkK&m|y^H~U9HUV2T80%x>cM;`K)M|u9AFY&)ejlK6;0Ch zFx=h-z?vcmkYxRG$KNmLif>K01qlZc!QdHb3y=sY$u>Ih048V@S78fOC~M^b5J8Pn zlrdPX`9?=l>Kotq+v&ac-(%#ui}1QHfL<}8pJJBaNbm2!ftt$cf9|utH+}VMUuB8# z9?OBpsnw+blU&N>y@A{|Tt^{_9zQOkf;l}jjUNit>)tv`;5ryVVKngV!#O_eC(wL9 zo=ANI48fe&2TQ#)6IAw)WV!BlZwW;##kW4nfGK+rl+8@XYlKFhY@IYKxdub0LfNi? zh`Zd;!*>~ApOtdizMA&mQTdqx+~Jw^yZD>DSHM|73A@&cutoqvrLzpcVU`Oh@Ft3! zkGiV(2Qg620x%k+Z=v{kiEGySmUonQ2>{M0J=1RDp4X5OYo5(;`c1p?O$So9-3!u( zFKMkl0a^iX=@0UJ&*2t^JR6Z1V40M!Q)vL%izyyj$WoRFrn(M>niJN?@Y)vR-U&)a z;Y*{usEt1RJf}sS8Dw)9g-@C@Kn(>(%#KYS9w}8Tp$d@laGadJ&q+WSD?6H*hDjc* zO&R%7j7W6HrRla*!lNyb!!UP%gCO-0)keg^rbLxAZN&sI4a6y9=Sv?}x9&sxZhyn3 z4TKaB_MLZrHa(6aS1U-s3F{q$fB1)gn7;SD?@eF&(wC-_Cr>8tz(I|`XQ%&{<-mjd zwb1|oAOJ~3K~%BheB&UusMNr_2(_~SM{kADeFCS1jzmK!H5Mp>n_g`MJQ(B1xM3P$ z^Vbgm???c3K#ITbC!`M|yctlu%Z&Q)qRqS@f=`dF9R^=+2LXo+rERptPnx-*S1iIr z!B+=gQ;I(oPG5!}&YEnV({vToh>-PL85a6%XaYVxas{> zgu8zTJ|t&v?d76()*lj7*y04l(P$GpbFb2*t(Y`m=QPV#r@+pXu3KaUS1FdRPym*f zWRVv%b_ljp#%2akaXZpBt5mZsj`rh*15g^;Q<*py1j4%IiR7C-G;#NWG7glnyBHF9hKkx@v@+_F*qr4G~ zK&92SaC(2fW(lNH)`xwZ1#Gh6=iN*1kht*|BYw7kpvg1;Qpcu;)w_u$8ArakfmM@+< zEF;KFC9@%yg3c5?KJI=8b!YRi`Zl*eWAun;P?MMc|2QRaZznTG)AZwP=R#^0Yugm~0t^G7&V2)0uY~>5DqTl2Lmmd2qx>FgIQVl;@Uaspa z|ItSeQ}*8Uo!7oSz4FQzLX+g3#Ry!!bZL6@5k@F$1xY>z!qmN{j^bq`_H-Pb>Zn|! zplkn{1?Xo601+_;PWypPn(y@Yqovffh5+XUo!s|dKSJ5OZkr5u*&}3x@nxAy4()~Y zhM%PCYiIK91wqYAdY6MEDy6!q;Ld%Cfr&u?H+i-}u82R&8fE|<_PNXG@3cP~fB4@2 zuVsMc6w;<&ajoZ+W!n+!sX%qj|1h!<^0M-ECV>32NOolT-T}FP&>+j=JaUP+Txb*|f z+JuAeH8=pQyv|Z0-{6x~nGCF6TxAh7VEf&dAQyU_`seuteFq5!2rbQaUNy$R!BJs1 zK;>2Tm&P)H1j>m|_*6K2yocl-XaHi>v_|2wwL{R{`Ug=XKywCRGDd^M(naS@zJS%J z6~=b49jNzA6lw5Eka+DxPygLze(D*3+qXQAuh94pM3@So5^Y~CoaL=W_sAoMxC?MG z;Zmw;I?1=g-~8!MbE|NRj@o2HPl0swcQeq!SKj|{`skx;oHe+{>-;=3?t1VJ__&Mx z=si9?evhR^DW|kMin#`L%`JZ}UFP@B_H>PpN2*AEMC0tawdti#A+*x#h~_j?Uh-4< z71B4}xW|DTg+&7~O{Y(9OfSCZh7`?YICExI%2EbIKKynC^3EaN5K3(~MC*t{H^7U)dSIU0y;67$g^(%uXC%GS=TXEhdn)8WI1;ooEM z?*#m2ryrx^QYUSzCV*#aI{)T*a9pGw`N20v+1q*MnP(Edg*;q&|NZI1k3M4W;?8vZ z#Bo09{_OPh(@#+g27wuXjgBElUN#J;WXXp7Sfz}N1{l%m1DAsKDShR+2iA18DXN-z zmjWLn79+_FNFMdeNMbKR-7nY)vV~<*LE31M(u9O zv?5*M3oMx_CnrZGPm;Z7DC1a;v18FNANx9v33FC5`TYTrvJu-djQ%9!LXRHe$N5C&$ z+9dz(bpHHpjH7j^L~NF_Q}5B-HiBDQr%-a%{uqFq-FJj{2_PH_^0Rl|pWc7(>huf> z`SQyzMbVEO@r?gAhUbGQ?nP!`-}~P8qtxEE4d0v%U_>4D?K_qKEB^<}Hx@SM$z}k`>oN@r_Hw4%6_7VO zgH?iAn@a(2Z)QWMM)*4As4-v}kfne#10N6~K3*Oo!rJ?&{uU#>FxT<00zcmXbSr7G z!XK_I8a@*RL&C83XNFWWWLPsvJn}k9T-v!r6S%$Wv4#~E`wEUBw5~I?l0{gibiq3+ z9oVJ8DdGB}&e;%Hw22g6`eO7bgfNNI*~J#S_Ky4t_Xi)mhjOk@|J$GZ!F1%X2pqM1 zGSG)Xikg!r4^1adoMcqqH(k4SX!_Q--kRP#e|I`_8a=0<>ukUlBi-6`@!c(ipMu#R zVE^GPABBB?jgeX9Rl!R>YX-nes(4G)Q%}`e)7n+Q)2G*%72KWczhwwKKF=Wk9&j~?Qkq$;*`FcV>$(Vd29O2XB0*S$)$(NygeN|CQe(znwvGf zdk0%=9A3S;HT~;Omp0Du%&R?OSE8j;VTHPl&yaYSLq=X z!6v#D$`u7v+{qzLFsyz}vqWo0+Zq15u4K}FU^7GixaGy_#M_n~iZN-gESBaU4CepHa?p^9onZ5RR~( zf9$cl)Af(I(Z=k=yA{%&{RW^M+0UFoIkQp6n*O>*VLdZ|J9iLJ49o`~+-1Z(0h|xk zfH%hC;Pm6yZ%(hj;gUy#w@%%U0CQ^k?7#TLbl~7I$~;F6JdNib0FUKv`~Ex(fjj;x zzlVFaSXNBzp?q-V-Q1G>{O_y$y6x#I)BSIM=R29UyHToh2J`8cU*?3SymrZR0RDYp z`r6mNHXS^`OoAm_`jk9h1QR#p*6=H@yfW}tmis%(qjkB=u$mr3xUI`{n3}o3}sC!$PmT@-Hdk z8m>C{o8SB)3Vi{g+CM$_+>@mH#i5(rTD&&>xBvG3^r_!IG`;*8Mpz_H>VEHY$EN@I zA8)c@xQS4cM!IYL^XJzv7>=$^Vb`f^3!~&nrh;pPI7`o2gKHmc$GA8ud)DCnE1T1) z6W(50W1W6@dW&U-yXEd_*gSvUzVpu4$&;?drQ7NMjp>m?kFasd`k$Tn>({~a_~GfL z7dalSrZ8&VxwC)zyKlTZUE>?~hYvr>4B{Aca2t@lfp^~71jn1xAAb4wrxPbn0nc*5 zoo%1PcP-3EW4!(6RM(A5XCrs-++;HlBl9ml2Ml%4rysD(_&0y^H@O|_hM%LlPG0@+ zhd-pQJ2{hKkDg#N@THetq>bmNBlL^TKJ6X>gtU*6nLUgwam>s~TEzLHIYao;mwq2yV*`>(zVjWG|2?L&9u{&&KxK5Yx3Z2LJ%~_0GQIKR4;Up6VO$(h zH<&K3V-OylzWd#~d>lqWDMe+^Fk!Dccjw<{lg^Rd_4gLH%wCt1oK( z!S}CDfAB@8l55ksXZKI9|LDEx&ZFM%rZyI}(trK>JvJ*H{oQ!d$Z+T3;tksO2!>8E z*f-t0u|0k6%g?|+M<+Oe|E+JnH+_6_oej7#<@T@>^wwQ~gBZE(>1$vAr|IAS`x}4*?(({K@uQHC;GLP* zUw=LQbDAZA{qxBeUcfN?h*^#Ygq+EjVYfz|FmCu6b+hk0#-cX>HS+e!A^M|k%>r+M zTrlZTT%-2Okm(^mB&?ieaAqYazjVrD20j{#A8DUQJ@}eE9*v_$ZZ~4nlr73Bv;(DR zb$`)c2Oe3e8<=0^djYm`PgkVXbx!~icjVG=n>#NZXms-1K!}8dN^6XT!3OWb)&Sa- z*_E;j$={rj*c?y#oHrL`L_Nav^#eB6-k;v(3Bb#jFO#{&uKW|McfUA&@elqW(@Hzg z;#aP`&n>fm%%~?8-z_MPGiTgEm#8hK?U$#2`ls`Zs>gFzz!6s=-nSnm=P}=XjKcd5 zY%s+>IDO~aS8{x|j>+zuUVMR(X*BhHC2BkBmBWb!tsA63*JHIr@e&Qp77tW{5CD06_Aqe7kU74kUMR>B5Vou18*`KI;uC zV(FcZk3yu)#-T|i>nmUR%8a!rX?#_wofty7T)1$7TWWusd(hr{*4<&2aPHibgoLj$ zZ@qOf_p0}0s!iwPdwb9ka?9OiXBr6HL5>wGfN!0@HNEgs3xIb64ovS|xy7w3c7xem zbQyc)$_5HoBlNjvAK}iy4d|$+=~UEPH`f>e>rFTc(gpSs?y)pTxl=U@ID7UuJK%he zfSr2}^+=M-jdSOmrW0Xy^443|LzgoMZ|mKd%#aJ#+fZ^pl_bghwP?9*xQdhW0crhcVjXcb`RrtgoT=B;Yzf zMI>u~ls&T!*M(_;{kX(iVXs1ztF)mB1@2uUPlnQ;!4zO;RL=gyN&kCNFf=zd+pZC4 zr!?A6#K(-Ja!8lX9qla|y5ukG|B?oP)}-<@4dU?aX?uj9(HPK%F-wX9Be(#j@FO@f zJ5XuF$_XcHgJGmqp(txh7&)m^AKV>Ifo0J}g8K(e(~_arShKrU{Mp+-WB2`7rkM3U zLDsH(srU40*2Y@;@q6QqpR(pZLmzQ$#t}dF_UJe|ZG$QMJ%y8w)F?c9*iq~z27swF z2Eq~HFdJ!?-(}SENkCFu>z_Zr&PeSjuz}z+YBQ_8bsJ&j-ts0&cb7+SPo8k?>p_wY zW&loG_cL0vzCTq{;?t*(Gc&mjzS`M$v-|joBg{rz0^sO}OP4-GF?=9LrFQDQ#W@8> ze@7ez)fveR+IN~!(if)kAPx`mD5x5@iKDysFi0_W7`V&tx_&XH_DTA@?y{VI z@^k~REV-V?t{ste=~wzDVnRI6Hqc7@%5xq71V%YJe8gLd_C?8rqnS=$>~gB^p!H}h#?rXwtR?g=~5f`^(8c-orsl=Q-9)$5%AQXt#VeNE56n& z&@>IbDyTt_hQceRa-$&~3va9(K=JCQu>;_L!uzERK#?=3oGUAfEGb3HfQlz06apJo zem8OEGlc|QxhikG(t|k+4`do&_<{>W=|JGizzlzdFd;|vv))_>UDdEQz5fBz@>{o= z3SVT@znJF%RQzY3J;&(HxpHuCA)KyDJ%|3-QK!(l4MyB6C}@p}S!+9u%&xmrO`iBe zS@$s-GRX(mU10Y!o#u=H%2pq>bVvRu%Z%Gh>7_{n;DMI4>2r?4j2H^WnKS#@L$Lgz zX_Mo(`&iRI_Z%-Pk+0Nn@dA$~uO9;U76)l+Q|#Qiqs(AFgk}W`#lvWP@)>R!dR9M; zU*kN&+tbP8wL#|&xNUTUtzOW9Vc~AT0Srb)f2N}@0X)y1+j!i<+QJy@^ZkglXXBnq z6!7X;TJ}0HDy^C8{=z zbPZ*2S;J6%>Zv7w#!DkGYR%q&VP=i|BGr!m8iwI=dy?E3)Gihy&=Adlj{o!igABl) zn3@zbOX&(M$}PzPD40!LV<8T&hMNP4?}!-zNjw=tp>AI>x*9*w4}8L}u+&;^WGy^z z9qo3${!5{F?C4|DlTSXu+k>7%s2JRM>ctV!bLE>5APufv9d*3Dr@MXILqT0PbkbLj zWC~OX69PqNZ}F(Cr^9?Bj_dL|P-DkSvkK+Tw1VR4LUzPIxW|#(gVg0FnX>_=@&9-o zBf?sqLGbzKebseM^)Fq#MVfaI4q(9UWXHY~jLpDvPmp$<*{0|9?_o$hWyHD?n%{c! z8p{rFpv25unC-jCcsm=F^}*B)XqETQ2BdNMvu?{_ToBr{)u$p!X<^RDWGB(Y9{u$- zGTEFXODC;oG|IAK(Wyo&k>m(dDOCD7L$2A-2cVmE8+K5Tbh$=WdkeKM!z_w+x?D5f z`v7@1gYu%Ndg1yU7T<79<3JrR^;*s~zcUn{1Hj-bBhCO!6RW^6=qj{)(&@K>aOPBq zoiWDvl?9}>5m)h6 zl>nvzRi@&jNZQruM8r|GiM@~-GF@&2zOq!t%m7BGkQ%otM{w3`|z$=%p`Krs*E}G>sQg)FzPAX%&Z!uYhT=#;z`- zgGWU3<{LXX7T?ZwH(HA?T4n*fDCFYB4VDUSrg=`^qsYG8)U)$W|5?ZTFby~^U;x~d zbEe>%i(LkIcfe`o>C<;PY4;}im=^W{PP1k%q4Utuhs-wE&|~J{0ToOSc@WH3c6_XP zbmnqrvL5(xSX=DP1i`Hh{AfY%7hc#agmNdG#zO%G8g(SFAel@ z9{d?fo6#Pgx$&3LUjAwP2jA#Jq@g~(~@x{tmxTKTYs6Ebfzsif{YyJ06E+}P7tgeSyZBIq2< zw=o<}&$l*x*aLW{%sd!lefT^{ zZo?)`&$1?0kzN0L4*%c*3=xXx3rsIv^7f#Lx`yF+k~%Lym$$@DkV3jsQrh_Do445G zIEn$Ny$ELkDz2~Hk}mPvzMNf0(d$h;8b9;gG_*a;Zj^UNH07NpLmFG>2%$xGC0o+~AQtUsJ?87=UZg@d!e! zB2pU$#r=Sb7ZqqX2BadTg8-MN#0koN|>`Q~j- z$~j`YMn25lgA<$@yvar)yZdXb@44CWgf-g z{fIms-eJRUlehM$L@ozhj#$R~`o4zUW4J1fywA+c#@Hg}(w0e#d`Dw%#r6RmmsFPV zUVlzRW>j{qj!7CbHT%WQRqwD^hjm$pO0Vy)=qib+%2Fe3h9+om6V{R59?e}E0@+}c zKKo4h0Z)}JS*wU8aAubW7_v!RS_~vTBR|Yg*-gL|PRm=^`dwx%)lGP3m-e+hQqlGO zDgTxgPrQeAsor@2`q7rOVWuN(lnH}Tw$JkTfiXRS$~Uj@n7EUN zhA3b&2mw+Ru+)b~hs*+3V5zZ1V}sG#d&({YO7ZI~yBl-|F#`KB4u;)5_vac_-%-Zb zhkwAPVG-*3eE;<9xo4*vAM?m7n{4-(0dUR;p93$v;m3_PKQ`j6z~5(cO&=W&j)9%g5hGof@Kg5Yichu#Zsw zIW|W9%94hWyBcgN-sL5q*fjP>dKx2w@k&?IgZRz zOv4>zQ`N_PbxzCcK7Ex*Uy|lDT_fOZWnE)HABxXD>0kG`cp^8cTtZNO;3TS^j8xo1 zSl~(`xel4Kyk&GPXUPoGk(KN!5F3znzxzV2`}u|hQ+k(!C3COzhNYpg=OaGOd!h#vLBM$(*TsR$%X(p-8eKI{E;UuhP#7%G)S@JP##~me+bQigO2)RH5m^803ZNK zL_t(4`7j6=1xFl@ibnAhUkR9k<`LD47cYTImN`X3!Jd7Qk=+eLMo|vjY_c2fTXTJA z$G73$^W+|RykHo2fNA}+_@!WX?i`#h^SJGiBPXeIb+BgNz9Y;6P}B>yk68c*YfhYe zoRRM!hkQ7M#PQng?PKiX-{KhWNer1~4@3VW7_7t4c$3zuz(+6~8h}R`)n9~ej_2}o z*>L31Cs3plwD)BB`~4om2@IU0kjG~|%Ih=ppQ3#TY#!(3%{}*gYmcu2CkZRyY{{3f z-n_-k$jv-zZaL|mQd!#wxaoR{M|l^!GD8om`@ zzm1CqBfTtMenHPAvJo8Q1|S!3>iZkAM5tU!Mz)Nbn`;#-6g9$;jwNKjr-$im@PgM9 zkj~0f?mQmM3{seh0d_FZNI8R<))jQ42oh|}TrJx%80rq?*isuS~>vrkW-_{1lt53YWUBCvsoJovh- zjFP-7Ps8A|^4G52qfNq6rXJJ#I{Da+@!5p)nD^O98|_;8n)HY@n`>WLX;t#%4L`VNjGo50NQN`IpgbaZ(%`&GRKgF}}-zmaF+rH`de(#m( z$oJW z{q`M0K~M1D(E(--3JuQ~@RVH?EKl2M9Bwjoew?!0)!_WSqxnHc@k1w=j(bMI)`It- zkMurAm~}m0&9U5(BToYF%t0f-J#uCN`-vMqe*Ed_`#*RGcxN7-8#pxmn=gKe(~gI8 zgxaIEj`$wEy>asf2IXpaV`aI*WVp^@Gx00_$lQDA;DRr4H4J~Ab z{n+SJPn~6y{0YkYdObB5@b&2nulyU1!k%GT{^N{rEc_8{?!|LT(1(Y7vd=dJ`RQ_Q65@lfhopS?rIHQx#26(EFJ%q=OdRXUU9)*3Hw(sMR57U1R8+&*?z!2W^dot-4T6`%@O=%Khh4S-74bgGGA!lHWg zAucd&7CV0io&%%2@kX4Iqr@`3k;u$)RR`gbVBK2anFfgMHD)VrW&jik76oGfyW8$M zzt4p`I@GSP#;9o0Z-XM7x5eCXcE3OYe)9B_JQx2)u)p}?i=jhneeSuJ*fcu_nQjOv zmbJs1@5|G<3W1N%e(h_op?F6SX3p62w4MgQJg0xi1a)I<;OXJR`!i*q*avVO==$EN zp}YUiE)E|)8zs*9d}>{zuv7ELj=6#OF^|u39)Qus$iEy>2sv9=Yb(~ zy4~$w$G~|v;}oyl`YMN}{_P+BAx40`fYCj+)gOa>T=QS~@I8BecOi#*DmzzkYXIb@ zVb3ufU~TJ5SHAJLf0u`_eCbDo4K}>=!b^EjNREtZ<1bJq=)*~VxygMQ`Q?nnI&?~_ z>X{`eN~z+fKOLb*-|81!imWbFtT^jZ|A<80$!pvJX@z%Y5oV~o!n8qF2HF7VYXtmB zCvkxd=gt62i7XA0NIGS63sLo~b_xA3+@1ztw4}IEoS<$3F?9rCjJ%Q6X*>+AIEmc` z%k6NTu}UnED!Zc~_)=eA1x)ekSlMYOu70qI4qh4nNlm{ejjV z!VbI&jS3--eVo;g5g~H?F%@#c2)vFmUg6pP&ql~=m)A`kb6FGiEuXCW?gIZdkL~`D zX9AA0dC2D5K0Y)G_w$BfgvfXPS;x9By`;~dc>Lt_+W+_o%5?<%yu5;2ca9L}-}(WH zd6tdB;}PtpH^**K1b6i>yz?VQWG3-PJi!+;$mskI=LuLUum|D{$XlV=I2}_=H}w3S zMIjaCuYL7vJRbe~xf5X5$JxoYK3>Vdg$tLmEYe7JpA|5DLPM;tX*At7y7aLh{{HX3 zl{+aff6B*$oe~H8EM`gQx)Z6(;UkZ-ap+4~Yo=yBNQ1~jf{JR?{@ib$Yv}zk0PLUz z7{PY9kx(92ae_~Inr8vwgUQsJezryptyDl$jDY(BnV;aR=+dORnT9Xg;oK*%KCuLc zO9|yDFuw@{AYr5JEkHItOpr(jEBd(><>ZaT${0<1fEUnGw#GHkq~RIiO_+%w7`!s5 z(z_$|TTxYlyWfX+zX3AQ}`6c24qTO=q~;e*D;R6#4M< z_FHdH|My@0Rg}b$%#rOV!l?kay>1UpwjvaM9j0o)Kb=Mr; z@v&5e$Kjs|MrH*Y+(O)7z4+K;Pf-3g_@9Em-acGosqxPAiBEhY`x(w)=Ki6nzT3bz z<9J%|{F`qx{eOA%*_2zDM>+iCn%e_WuAO5Dt)F%|8`$LhgSx^j4$Q*=-Nlnc`OQkGzc@a!|sPXGPe-uz`7iWU`h!}pi?jus8Ba(Tz3S~uH@T&Y|N0J^&~IRc>eiMWMAMt-Z9|U zg>JGjcKbF{f7+u$x$AxO=;7)4=RQT)dfABFe-GtX@$W!;ZE`si@rg0*m!v41>wI_c z>8B2}VfGde_Pi!_l9;mqKCo1`J<9+j1G;^yuLkRB-gfi$TW?L@`R;dRXXx=L@Jr8} zLm_B;Mn&s}phC-ph4Nz-U>i@N@W+oIW7+UAZ~l2_`tgr{oO}54+p`Of*wXPhqq*?* z!G#MKroa5lzYIAVThIL;WaBUQ_ft{!$)U-!1XWU45>>LoVh!0+#LaK+hxl%nT#| z5GA1$o=S#6kYO31Qj2(;@~hY$3wIq)ng%^ndO8$33Yn(`6{Ld5a}?uQf!h7|u7TOY z>*@1TC?2AFfB_gZ7fET-pev+Q6THHpR^E}bqBYG)*`%d0!ml6 ztvqz&&wZ{_r=A)4MQd=n+;IcXS&Ag;s6Hl;`aLZ3so(zX>9>CCw<)9I{^KKEHV?p3fji&oM^$E!U(p%o#>a_u-6u3{Q$S_Xu8k>7}{6IOKQnOg2NT zx3vXTj3*p{R^d$#pr!bkX4^Fmb=of)L;Fexgw=(E zloZDH(~&mlp?AScbrgc?e-Bq`<5gL_tRELn2!esPDIBM$O0=2B0FhU7H==CEWJ}BgY zj!iq0Iya5ui&JIr=&++uUQDTP6Vh17QFz4_t%A{f!zgn^My9-p*{-%QU%O4-}^&=?t z=`)Z1BBbEVw3~`GlHJzeG7X&lv+cQ+2d?4=)JPLT?$egS#Q=D$m>IzaMp532Qx`tK zyBMb61rLg4T%ek{70$_TC(0|kl1m$2{o<#*uJ((i=t(u9$?i(gGze7<5hfNj(!KKy zJTYgGA>%FCW2x{ee>>v!PkCU#=Z0;`Wx*8=(t;<{Reoei+`p)^?qAL|)w@c;)U=%r z?)vp@h(14sas*A@XacPu_v2>I|0h)eu;DHFF86*^i4H^y; zce++g6(@TfwqK9|YP#+4j)01@zmy$qPTJ5< zA*HK$KrHZ7`4jGcHI->=hufB}#tQLPYdOs0f>F8aFi3${}FS|t)ou;NSjFjN4UFawSdUQ#QX z+!degW--b%kc3P3(6 z0*G`wl5BwA5i`mf1*wj+^V*5C3;=ZwBcNibBuZ{ZCx9)n#t2rk30m&bfZ2?nv33+~ zobn|2ga?ljXdPut@u|C%9|falYdKQbJ|Mvj_dwv&AfB3x#vKo*9np zgoc=`(M-#$U^=jQ2~K%ro4eisq>Oae%*MRj{-n-zPEtz$mX=}RQeIr6o={7eg!F@; zma8Q9Qm7<+0R$fT7g~m;D11e)>5|kqgNIo7DUM((d?4jd$TY%ghZC1+s*?FCvUdRF zk|i|Y<~NK%V3qqpcYPT+Q~)JD+hM%uB=FGOo(90GR~sV`?!WZo%Ht}>lQ=ReyRMxS zkZOv|nTrIEIIJfgcn5n2TD(!0C`IVcRDZgPM=+u!C<_8-s#8Jf=O1YBmUNU)b_s#> z3|x&`tb{Ayuo1chM7|kFBe0D^WYY!%;3uUr>Vw96(H2hq(tzuF6*M9>eJAL2yvQ$} zC~B$4ReYubWLvN8k%l;Z;3P?K@;W_2lWcjY;z|niXe1UCE!!=4DMsOx@-kLptI>ZQ z!(q?cgWM!!-Z=I1+>Osq5aENDg%o?Pz6rIMJR?FtEg;?LpA{fF`lQ@{sNT$_9 ziB~8`NWm)QFS;}mqLO1pV==~&)Y^qFeBEZ_y2evs5~<%wlhac9=j6&dO7W#?=jd#? zcD7BKQ7xU>2pxWh@5JbnBzobN7p5+MmakbL2;@KbE4WM5tS7bf%4FT^IK>0U!- zUMM zY|>-Y%%`OFnQxl)VsX3$-pdGSs@B$Zt_$3j(**-%Gm{WU=u7L#MTuNORV~EDv(q&X zO`Z8C{NO{NDON_c%Es6bD4If>-1)bewb)LM`OYiJIlCTSK)#%W~z1|6CD4K;65QtMtimz_ok$WU(SITlu@p^Z128ie^Y?Nfwe08(>VT#q z6xl7Fx`Hj58PVnK0#B7QVN^Ce<7uI|s3XavO)dwLYsCY;`!2K$UM{K`fSr=oCQ^or z7A|mAYec<*tBOW>lB?B?ugRdqP*9784e|#XWB3e^kvh9*^UC;Wi=)4AWj3XPla0wU zOdz;bYK?dl~?$2`RaZI;C}vr*r36GSbf`*(>oaK)8Cj zl1Wdgz#tCfC41DNm;6QC1i|A5ya}CTdfg!)EmfO03XOUS#?qHK3Bz(T%&3MoR15!qy>MMp6RN=00YDz~ArJVUb$^q8RTQQZ&!q;77b<}2ddx1;& z)B#TQ$2=09^_jPzBzSk!BREc!_G-->I>C}F*Q0*q!Q{}9%c_zUc%?1kH85BVyhSLY zR3m%UP5mQYjS@HcJXV}pLGn88GQ!_4=w_mSL3qHz%00ouEgMm}g9Rf(Y?%-+5&~-j z0W&{wnvFk4O{T{}D~Us&f>)UPTyU6LWvY!U$l&&Za1^eQr?4z)we-?;ym_X~+Cc@D z$N)#+OkNZZ+)US~Mz6>Sd^H;E(k13mzJwK=VGae7ut09Db2KFb({#ql0ni|hUXoJz z6&A&kJmWi@b&6mh=?zn(2@4zqX{oUpb`hv_0r@X<1ED!4r%#}j`WjQvj*{h7N=g=z zLYA_Hr|2Y;e{sgQ4XJo%n}f})*{vcLwO_hMX-ckjRcP)G^Xey}LG=pNjJ*P6MEEp- zZt!yc!C%a%@vd_e3+;tAmV(8M+q_MoNsGPj~2 zWhxmn6NzNR7py_W6~^s>G}^`P4(qjx$tH{rMz_QaywI?r%7_(CZmb? zdf5ZCJN=CAsU@%~x~EJ~@R?!G6vj*-z6QYG!*hEY02&=RkRxg6Xq@fZ%Y{D+ju@Py zBVy5XAssu*Ymm*5GwS6w=G8 zY$bH-cXf-Ivm2<3F`+|5W~)#ImUbFW-2@g07s2p0My^5dRgx49#>Q8;<_x34CRvL1 zcGZ4KE#S1TX`Xw7vLfOVOiKcHp>2Gtc2X)t=no?>WVdjwWLH!r^9dOnzgBkR!ywGF z0b%(%@L&8z1$JG3mG1>SzyQ!17!dijvNSHuCW0SEH5JCI^=T$S{fw?4NCyQM89`X( zXQ2zDt9)bBx3f&u6&)j`JBCEN%4mgF^)^VAt}9@(V20;irDR!KRZ>|auZ@#sce~)5 z6N}OoFp~?PJcK$3>iQd3RWT}>@pNF|vyBy$$brK)lh_OtK>Wf5dDkEjqYN2EhjH@f zbju8ZPx%>1!8JL%{5DESwtayv0&4>^wWOYOkbu&-SH}$8-gRi6g(lE>2uX^zY@-Jh zhO67Fq`?E1%d4D*7(N+&AV}C%A6GkTBp$GXpS{OWeQBBd@mo5CrRKy|71|DdbEk2_Bw%fB}G_-R%kuO>h%rd;ls)1cx}KO^H_` z@fFHuQDX`4Dw0s)nX#poS$-5cBQ5-c3agrVy1+M6*?|?w13rY$byR189{8f#f;(N) zx2kX`0-%y5vXo7oM!nvoEgo%pMml!%w&Ui9ZcQi)gL7@0~MfL*3>;FDiyD$T1d zl#`h}F89+}C|B2kh2j+&Gy>4ZVWvj_@Aa<=51I?Mje_}}U07k_{G9O+P5DumaI3o{ zKos6}Aui z)U7}E1R8i*XZGSd!SX77?GJcp=wZ6O4S;4aEo!13K!PxW#8sq(zL*|C64ijKJc`KV zQEF!m3xw%~fqvAX(wSWN>`LH?m!g8Oi#PH`9p-iNs?JVnp8|AHj7!ih(g&{gN|cNh zaS?oD6{WJG&kk>;NUKY_hL8yo3^7C8TJPQaDqg2@Nxt zR?1>xAr5cTrUoQyb_F*uj?@LxMR0T<`aqeHE+6`rCkl!8QDgNcqbA@{5|0L3gJpH1 z2`?++$lh)79D{r}fB6&AW88VWF75SM2cNSL=^#lE+>qCV`eOQnU9beVr3mLj7EOkJgSw*YTY2f&QiUM>k8S;qYr%P3n2lRtneEBFE&+>R{i_GnYO zi+UD<5j+Fu3LBxSYZMDTg=gRpB4u+a@HtIHtMtNTnvU`$WD06qh{)ffz#7Dl3-YSV zsBSMRD~GE%a{)tFsGszzvoRFi1uw{hT-r-!(+1H4Upy{Akk(Up@%CfQ%0Y+YXLev( z5tU=rBOH1pI>ZzQnkVAdxg6-{B24o{p}!7GLms+`L7~_H03ZNKL_t&{PdU*DY0?OCd!P#7~raN3d7uqLtJX~FXjh9@XELn z8X4RQ9gNLk@$ws3I{=DN@5os;q)_K-Ul(X00Cqr$zb#|}C!M-u5SFDob9b7wlh)PJ zZiAuUP}3_=Wdy-IsWN7HT%)KM@gx*4=FB7xToz1OFo6YvYdbMxT;Ts43?N# zg>{%Lo-QhO5$3uRoyh|(f|J4`G$V*Bf6!3I*!pzVI&daFiX_v*IwJf>=o24E30J+u z!(S5uP*5@j*G6D7^L#ZqC7ry6~GaE>{L4leD|9wWfPr%;+p11$XT!g$e?9C<6T6|s?oz|%>M z3%{^y{Az|!@s-lgX8`0+mJGum*ngGX{(<5?Z*K!I_|VYZhP26s5a@Q-?KnD!bn|=n z-{$&D+Ca3#)8Vc|e{?gUk&9P#u5yN?t?=%JXdty2txTdU5yv0&&&?!n6;6#M3?taYdUTVY~oF?suUnl`r#1 z@L$>n&Lv3tFnP-|qrFL@J>~~Zm8?4vW)4E|qWc3+<8P&p&&cj5k9MNy_wtpYyMFro z9`6X`^L#K?$F=o;(0fZKfgAtQZW1>XFO$PrG)H_`c*+nAA+ZQ)fqhjYO68O8Q`Q(H-JPYb;qUF{BHw3Ral1 z)i(TMK%flz%CwXavCa`ZrSwO5jOZG)n&!I<&_L7-!0ErA8H@2?*^s!)gvAF^0RFYR zy$!%h@~XmcqgWC~5>$u6hX_>IkS1Fod?2aVA+V_xGo&-taKV#{83abg=(d6#S#XJv z&H{!zZd$0Tq=C=Q>be%FgQn|G*AK-Ic!^Q0?FwZJIdCKx)5UNkTtXKdm31G&H*ckvECUdFw zN;e5J*s6>n=`Y{Gp74k`3+UYMeeZkI&wlnca3aAa%S+WD21A8ut|*`>GH@m##j3_o#2&AG3no_S5hEgJB$;McmauJUq9z0oYw%`lvdgIz{&3 z!nBdD5W$e@KAC5DFmVp75Sz48^bW%EA;@;msG#sHaU{I#o)zAN$Pa!aK?yZlf_A1Q zOfBj4UAW9tY8FMrGq;cQjCQowk~M8FimO7?$gm9FPPgKb_><2i3J>54i-{!6N;9xT z09P0--(*@=>}gXHD=aOkb>NF9iV>(*m>{;QGBdl10R~`@=nGYF$?o)J+6*6v!Xn-L zdgD*!|I+3E9gk$vI#9**AdYJC#8h~oLO(+h}LfZVJ^E)ja)g33rw!0~x1D#+# ziG$(F&@5nYBqTJrESCky12u-7P3t z2R9CVk<%udHpHYcu6%i9{lW>JtMFA}wKp|&Ly9#k3_C&ta+I!E=#z+cLA{HjMRtQp zjjp<-sO!9*-d8c;z+bf$MAGL3Vg(2oiopn}Uq3`1g$xsfnada`ew3jV#Xtf( zPsPn{K0f;!?)GnIJF2d>Uk%s*RmK+P^Flm_H_VbIv9^p4#6DE2nfe#2WBpKXjlP5DWS(xc!W62eIE zLHSC{=no!8ehmSiV*e$V0HYDo`ir@}X8^X7@{KKGI25G1Y#;!PlOR^$m)^_$aWq(uzDCqxJvWeF#0 zIl}^vOY>xft1}C8pb5qYsBe3AUBP3z#UA8Fre(4z=erbk-i9nG5Lvpi5*WB^jagN7 zIrE)PS21dt!!zoju$rb(3U&6iP}W`akuV4e7aDEDF5;GqBTaNFjpJjYAa)o3GkoIf z^5u6KJ-zqdd->#=xBd3YH}(^dY{#_!!gwy49EmiHeMfUN8;1B&d}>K6I`=I?{Pg85%*|!FPjb&9_3! z5~u4q?%N~0zOB{2jq$k&+feY#0B!;+{7`uFV-zq18z{S@zMF;cz!}B1vlwoXK1}yO z0}x@MW@RRB2!z}yYc2Oy`70sa(PyJ@^AOdMX<@t!F3tuuiBYTwse+f(q?Ovus8$t> z@4I$JOULXe8(O%8k9y)2)}OHW0JXuGi&~C|trafe=5OjSB>;tj z;7Cbe4hLv;DS9vhuD98W=O*CrxA_$LseB7i#rEgNMDOg^Ak=T-gP^;e{cz~eAwJ2r zKi?vI1hY>?=of(N)dTcB)W0Q{g#9ASy~7gy!I#R!uy z6eunH*<#wR0Z^%P-(E!@yZVm)Tlw99jxq?st*@_sj{fT#%m%hF3Y)k14ka@JKDX}D zAh!U2qjv!mm5~?Z`jVY)DWo%ODldE0z0XcwdK<~twNTM8XNI0 zpIWe|=`T*L6t)tQ^+Ew3^G6X4@30Hd>braEkk=3+_cePhSTZ258 z6&_(my|Y0G6_#G$Gm^#y`wSue7|lW})Nm`BR!m)_2}OHWQ)%!P>QO1M;U93Rca=RV zm}%&^zI+cCDQ@r9w*h)8&cPkd%=`JWO-}E5AO9X-SMr;No(ITjK1TB;;w8l@tVey@ z&qr3lGsvSHyZsc%p(AL~mlpGDSrE!3GdSYAPl1t=?#K*@@r?_h;@j_hEXDcE8Y4fG z4q!9@&IVL!mjEa)Q+t;J{+t151h%(tk}eEuey0B$8z?*@e*2q#ES8afo0-r$Yk%(m zY~N-k!R+W^x(ChxVu99tvnkDAC}fmk(Hk9X9joqMF<9c$F#v>-T)Ir+!5`iZ`4nJT zzM&h@E_MV-;WU_%5(y4^1#gtEXw{vhg5HU(>Xp(`@G9TRl@cp-!EZf#VKPlOnn!4) z*tXDT5@p3FZAE#3QE15lAi8wu52k@`1z9v(U%^+-Ah*(pEaOQu%`#?4kCe=9A|qu; zU+^+Gx=fHPFH$ZRi&~Bm)kdO}`O1Bf!g6k~dh0XTj71Rp|uE>rh)mjJHaGZRqRH2_ZkZ}7V{ zz5e>!)5QyyfpPY8m#-XePtQDaa60!a`sK_4L$RTezySCJ;PxiCSPrdW47Yz%w*lAI zY^>k9-v?3J2|7_BAe5^dhuK7`f6dU**(R@C^-OnAAt(VUm=+h|7Wh^OR-q+c!_l5W z6Y(TT5TSXEJ>nus@m%JZfrT41q+JU|KttLH3@mB44Q)0okPJd3$ab!1DFR8G8ANW_ zQ?SL)qG3=n&`NXwt2IPJk1@mKE|+XGPD?KkiRC^=es924PXsv#3%ZJP?YKda?1`+f zTPElgrL1DnhSoCWOVG(>(@T;-3FX5_C* zG&tB9l+N!NVgOK{i`BTp8WX9 z6Vnr?9VqWe;RMGlW|IZyWb6z#WXFdjYpJ z8V}Dsa0cMcWj$x@EP&1!%BH8Fc#TVZLEuPUqy$u$MVM#2)Lo_2@z>A91R*jzPtx|=f^kRvp2_&C#=A_*aQ)t0U zqibeDH~@ht;)bH_#7IdJO39mNg)a=W4F9t+S{4oymI=)R)2a>Kx8`IyW^xg0Qe4ei zDKX8IzrUxzZ+kab@b0(nD`fPq?`F?(kFE9I05K3F0Mz15mOT1DWikVUL zLqBB*s84=cAABerTiH{1=bfMN>Gp%uAOF!GPlpd59&IYD-Fl6|aegm+@`dT+8#ktJ zee;{sTW`NTJ^2JiAhUt3>9M1Sr+@nK8`Hn~SHA-eX8?DAe`@-#|Mi=EzI`8HZVF-m zvcI7La4Aru|5cRz`R9+2HVgx0-}v$6>GT=fjIv`e*6-ZLpfU1i6A+)#Keqxo8olO5 z;6rr1<8faVYin-6d_+U|P433pKsP`}S40p-XLp~^ScF-)W&X&DT#AcME14%O+(KY? zVF|(+RRSZHG89+hN=$;vV3Hyp3wi>x8@mFlATfGCXZx3dm zX_8={nmM<&tgNi8%&e?BOVbmXC`8f))Rk{UYH<$-`=va%6NhqA)noA34cAh$jwx{< zGXN1ZDDov}mQ~xXyoCrjJ6%Cqlw>@uy6`won^gUXD>$ljEIWwSKB^i06_hQC)TskN z<vwc;NIUm z0Cyqi2t()K{x013%&=DTZTP`iz)UZ|^fll(sKCm`9Tm)$>u6MRtZa29Ky6(~BkL3_ zCl65IB5X}zy1-FYee^^CEwh1b3TH$hcqt@q;!7*?2BQdJaw%vv)p?^SAmFU_GztEy z?0t%1Y}?T-#o6Nn;A&d^N{|@Ez-8lHP@O?nW5HKL2c{-un0K_qq9qqvt>Y?uoqh|2 zSPFKM;$99e^9hvszgM*m>}_or0joict8nywYrA8Y_EWdkjQy9@+qC6v{PlnT>*4j+|1S7FsGH&K{_|JAK>Itx?VDG*GqE$AJhg`b`2nP`Qd4jI z^2<+QOs??U!Zw#H{tof=P;k|dR43BNGzrRlY2HwOi zE?0kV{oTaN=0T?6Cdz*sI&Pw8-aI(Mu-*XB;oLn-PBw}2{4zw&IM^7xDD#B{CuJRR z&KH7~+Ah^htddspPK{aH3QH6``B5|$q43wQrBV0bu0C>rWl#14(zNa1Jzk(|9a$ix z0HLyCiX^iKYlAj$OBEfU$E}}WOCu2_A%+e`Tqa;FqN?{UP(#z;E7y%i>M4psndx05 z+4@*ACW7q8*s;fS>?5o9l-r233J*qHP#DeLKQBSwnFVad;k-D<_RLSph@~!dnQK`d-i*h=-csDu9$EudClKKPHlkTWJ5lq1&skeo2&L@aaKM@jvm2Pvq2JPs1&T z5B*%YaDMm%hkkFq`NMb!Qlc!KI=L~t^2L|Y(d!rhWS{;0^=ns$4>(YCkMCWw^XIl` ze{$H_QTcDSi)R^b-ynU9#~8Np5;#Lsf7mwcT)8&9`_9$jv9sReN3+4}sz2N1vJcJ# z^5maq0qp;?`s+|UaFFv47Y;Q5v-x$H@2c;ynxy4Dtt1H6?1D~SnAuP z;3F>}sign)Ep!P#66WS2{XFYz!gbtwFl29~lQwU&P(twuev;l8waVWm;{YR+%N zXKY!asrt020-N{Bed)A`;tSn?i84-zY*pze4I4iS$>P`XRRBI*to$3?mK<(^ixKpzqsTdMeDnawF7mA6C3Kb%-oxn9T^;U(i z0HiDPVIf7u9m^^&RPc7>hvK!OD*N~(q5<{>xy!F;)T6^;D z>$$tQ@K191cN=fRhjxbHCvUxzmA*7{mlgheo?yJYdn*QDmspR%t;I8+M7_`xpYU_F zzx>wq;qi00_8#_OP&Ry7C=dQ{7l5Z9K@j6cXGKEegX1}>aJT`;3Xcastfk9p@2$ap zE}%yc4}d!adIUKu@RU==`NY>E)C7`uK+b5A!~m6DC=u*+0q`eU>E!!g7_r)@@&U0( zMM+fCZnNrzHdeG;rBcv}8dOt8`|EAHt7;oVU)?IV`Wrz7T}XzS8j*c*@jpG4>uo2}j%O)OS>Y|1 zYGXPpbZDU7zN#vXN9ss)vX`*#Pcp`_YjF@dIvMP~--mpBkDgRkfA9O>*xupx+OyT5 z{d(y4IHzvTNV)#rLGUR;4jnNBZUapFM?KG-JMt?3 z0WZI;k*LMb1HR9H{@k#Q_p!UH7r@;B&I4|<4Y+s_a2^I4I1hODZO+k9@>3lC=>cqF zR5rNhpDln-{kih{`P~Be(Gboc^FDzO4dq_HpXWl^pLzBP-pfHzeFT^Xeomg4bCUlyU8tpXJ^Sp5 zcm=-Lw9D##3%CCH=e?DQ!9dwn__r@_4;Rkd%R@ds=(FL|eqMY#V8(ublXHxjC;l{v zQtE`@;mjE0QHHg*0jt9u7%l}^!+fDciZn;u(;Ph5fKr|ijA4MmGs}FkgYtT5@)Q%p zZN%AW;uDFfAn*fx37q-+hZ0npWZn^hv{kSah{9D0K)U`Pj*$B5J5k_L)H|_KBn@|y z!Cq8xS_P!1S{wq4P*I3W1pHSSN~w%fd7y2etIX;eWFQ@KrzVA#w}OM^y}rkVrE(dc4brHo ze)!m-i5ra>6L7oSL(c<04df0l81*|17I|l(ze8YS7o~hJG#?4^i9~Ve?bh<^H~RDj zeBOW4J7ahRColllu3gKm#3!G$>{br?zW2S|eB{&@eRf&hpLymCJnN001BWNkl)wY%sj8)K5(gsRjy*@xobS2*qcBQkd#v#9oXChd}8&gVIZF3qy z8!EXY3x|6EST8Av z7oaDQ!MgH$+02K6d;`loZ+6X3F&I4n2Bi~|!$bc*I`w>`Ie+G8eg?Rcq)!7Uj{TG7 zcx78JA7zlDUY^yoNq0q^O99%?w1%oCeZS&FZ|FX{NJmjJ$7`DrWyFKBUO*k8%c1lg z96@f=315h-L7H1e*7P#Ijvz2L8xsLmDW$*0Z}S?Bh=YzFn+Or)HaFR_q)1ZO6sGVL zPzMSA;IO>Ejw{Pd%e)q!gCwB4Y$s z{y{@P>^{7%X9;|jIBq|9PMW7I z%Z0Ai)sIv(Y$g)|8{A}rqi_XbpedwLfrPTqSe;XG5TRH*KGPWoMe-p;S_z&JCv|38 zCmGFhdusen!27>=e|Yv&-Ub|oC!cuIMx4rXg3p_W-ZmU?_w!eGWCDhuK0)qt`*(Ru zkOz03qmA;87of~;Z(obszs18l`sIH6Pov=nJT71UIqw9xCB8L0^~BxbEPMQ&n|HW# zfQ);F##UhG>doQ$RqiG{kNZy_uKJs<{GLTHR?i;X`!^?KvGU7<+znU^Qm#6Ok20uz z>qA`se%RMzPyTiHiD#Y>m^b!tu+p=XvjxaA18u92I|^qlJ6|+1e#? zGVOVRJYjo>s)d8dF(!BiW64Z_q_{Ur^a@=BHzHe*c_eu~igwZ&?X z9648^;&EF-!#dElyyy%>vIRRfJ%}1Q;w@6{gMTAg;_Qt`2a7S6A@3CAB)=XB?oSbF z0DKa#fk_xA@fY)wkE^?P3hrSHRN%Y*F%sfE9=h=*oO|4syLpSd2+ux6KPtbj|8DmB zpv4I6<=W!S#jUMf?ihF&_;dO|Zhgv+i>Hdgb(;e~7fj0T-Q>le8^Z-2{Mo>p*m4`e zw!)Qvlf%7Q^_2ofsGK);fvna=j6~MmjM`H2foZa_EF%r(VWY#h0C`W@-c(AhpR0MT z=;gla%Dd7Nv(oF@=hfjnC+!rtqWkyRPEh9x@1@tkH9y;MX+4G2z(`7Y1ld*~5!o)V zt&l~A&LD?xy2?$2D}h=2Q_X|Lwz{bP)3uLsq^xi_8I@}B0o0iUI;kx~Q6IYOLs;Up zOdqXa#8}kz(jtpoU~OAST;1dCm=`z=qK|W2`O~di%5FC{nhAtTwT;? zY+D$5YM-}6)rdEfAdV{QXCAg2`Lu+~@`Q#yy+dA%Z!ADnds|MWmd-x6PO;qyTQ31Q zzWwXhg$oz*#NR)AC&y?`6qGpIqdTbLY^gV@g`(;6pRNu2D;*wC;oFkSuW{bGCGr1e35P8eX=s6 z%KtIHhZ}&n@}ia!EtpTY%c?)b8VBA!ety*O10|P zo7X(mj6`|ULqQd?MY^D>H0@heH%L{J4q8&>Eue)77@;Z=4Jpj=4wCHj(MweYw#H6! zc~BuFKMh~2c3}3+{|?@v!h7-3cXeNJF(&-Z&}IS{6?2g#1LeP$`|b9* zJX*%mq`&Ut1Ksi+y$0ZCKl>>w{x)|5Tx2$I=|6=6zsPO4w}z+q1euT622c7`uJ3XS z?-tMPUmJe+cVB^Yz3Ut6-Zsv1b97-h6*}?KNeaHw2%! zjRBEgdIfF~SoPWSZ*8&SGg!4l>GjToYzrF{bLCKGu;N>msTNq?t9~t%jFADp&vBn& zL4bbfpk}TQ*#h*Hp8-bsrK%LtLz0xWGl03uonfiuPNgfj!*qli4B{xi%C4ddZ(5k< z32=~Du%{Vg^BkPy+)gwvxwa9%=L-JoLy$IuEVd0-6OhPo>J+HPvM>=a%LOG;Ce|{M z!qih6a>$vtLF$`l1tZ=ZM5gmY@DyRyaiO7uMz2j8 ze#dCC$98rI#&K*JOheI?ut*UZ*t}c-GKh*@7z(j6Waz!HaClppCO&Xm!Nml5isG}N z@X4&LEj7Vyp{ud7gxuxSoaKOJ(`Wf@z3@&vQJ)V_K6QaF2mg=Z_kZtSQmM?%hcCVQ z3UAq7=M~|1hO_5Ru~+v)H~eD}+upf0Y+t)FeEGLu##o$V2y90=0N>g9fYtkL6#5(n zKw0;&kS7BDSO-SJ!@RR+?+tHV-Wgu|oinuI>dKx8vYe}zkxWpqWL{-5zLxn&QP-Y>jp2^_8mqZf^0-?n zEsRH*RnRDP6xF){1)F=PeD|2 zWkp1&B_m&|jll$O=Ftac7=P4G1FHJjvBB6nF^OOIxZ;BG7Mb-Znd2RoDKpj?^bDm| z+Mr2=NU+@g9E0`JXB#hRlUNOa_u9E{k8kWFvMP;R!#QuFmiNQlv&wqdyy;hjgyY72 z@v_F{*}$hi_4M%LA736W{qP4I(7jZBFz(lW=T%PbpU$hoZ(aUzDD%Ys;>Bl&uYUEF z;rv-;)F)kcc})N2@K=BJx5HCU^RZFh0`&AgM_k725!2kKszK&lSkVsFg#NiP|gK-h;|7a0`F@Z~wR_ z4~uIm4y#>L-lgbZ74yO29#2VmfSAP3t}5Zsx9p0f%1 zgXS_=)a!wG(O(4FX6Yaaa1knLs=D@o|MaB)b~_0yyQz`MV12HY@TraLS>VbX#v*=;dLcXP!C7+kJ09CVTpqFH%<&T)g-R z4(fOrf6f^}f?fwa#aPwK&%Xc8_VAZ~`8RkVclbuYDLf6Hh4I_{9PaJm6>o0vkxw7z zj|QXdJ<6O6!V^utXtIz<2-|m5lMSD_3vhc8(B5 z*MM+n5?I>VU*LrGfKh>T0{v&&av5aWAZ@0k$NvaJ3=p0HH0qgTHAC^su-Je9)*;U& zh!-J>{8F@G3Cv^QsHN>CZA3NX;ZD{!tTjv2x7u+<*42;~uYNXGppSEu+YkM%uv4Dw(4R4Q?3K#LBA zyT++EVc&qn190~2I|Y>4wi^I(8Kk{d{@_iS{mFmY(sYC6agzfv-i&Dv@3`W7I46CM zK?87umDh`T#K`+(9{^mQ=-b!5;qk|nk;ic1f54&Kd)%-8E#Bu>KBZ9@X)%Vz7**y1 zWAWytAF=QMG3N(+!)HEo0V7~Pjvacur_WP;8z{ZX@8wz6sZ)G+@IB{Gxzg~0oAF%w z$=>k%6Zof)CWVebY1A8V-fBrRsazijx(V`^A@?oU0fw0m`{c}rBjw?44qFm2-#yW2JmcyzE&hRxDQGO@VI|#;}{wr|Sp*V3n$Ca0u2uq03&;RiEvS`{WpcdZs*v(TR_67AE_PQU{+x z+k4Oec1onH^@mWqqQ(Pg#Co5t20ydFUlhc?*CmY7CS>{&!0yZei>nB}Ty0 zU6fv&)^!+?4K^kHM?L_iq0q=x|FmSu-{AB+U-_ZJ=kql*OH@BYW{^5viBxW)H0Zv8pjeHQ}`|9E-F zXaC=O_vdU4-bI=3v4=m&3qbU?RiEz8wv@Ao8J>Wj`1bvn{TM5 zOF!5fP9xsDTsUyYkW>HSGM^4CZp#zk{GW?f5MNhkWk58J0XBCeVIk=U(fdraZodlR zy$h8~PXL3EeYckP4)v}O8VSCcl*Ns&yJiJ&)8pv0W(t+}JM`~d!Cj5BI)hKIA+DSR zh}+3@Qmq4bl$y3-oiGNOA}%k6Ak)&8NF$P^PJ3&6WBSXg)VCJwEiGd*Z6{4)bQ=@H z6r&+)phwyxdt+cMpdSfx3S)DqKu6okm`Dah0!!z-k zv{%YSo$*o_g318&w>_hy&{#%Sb0kiKaVbMKy1`=}G&IVXv;wkI{@Wk( zKxmt<{`zU}n|Wl{!MVDhIkS~F{yz7@h2ac}yovX*ft&BQ`;BMZ=ikHq_f}zyK~{d} ziaBJfa^uGCz#lmxXyA(XuYZ5e_Xm9M0Lt+BJwwc`Kll*ZfX;`6VW;AXyCZ^{UReNb z)R-8f$~^kt6$9WGTNC_Lk*l~yfRQLja0Jp6Dklx)zyt96?%CV#Y6uD@F53wQK;9mN z;R`Fw2x$-PP;PN3mL8DHmMNezCXo!HJi!hWSMm{J;Y}kT-H3!< z4N5zFocW@LO7BBWw)YZ?wE0N0aP}!4jfnK>B_Nueju;e$n$ifL2%4g2)mPzl@pbi8 zI$ZOt&Mof)Bry`pvF*8B!LuT$a0ZpzVBWEN_0aRyaj^>aRm1I2lr7_fc9gZ6%0vU> zgSuSu%u4>pB`24v;2@cCtFiWBWiwJqtFi`hiN{Nty+l~bA3K$~srib*KqEZ7+f$yX z^I&g_Z~p5M{MHxG4qx~J%Q1aN?trN`_w)o#aLGGm2Tu_kbN;TtJ?VoCJ%QcbI>5t` zhqPtqC)GEG;?KczP zZ3L-%0eT9}V8mF6S3xfPg_oi*yd=h7yUfWy!aRB&DuAR|FRft;j4@PUrSmHfi;n$c!hQ9??XbBu5FxSbiTmJeCe2ad+i?nwx8>+Cjj9DkK68{g>Dn-F<-Yz z@ExA|bzjqE0Nm%Z{l!4*rRnzjMIg6o&SAY4e}}IC@s=NlmVfwrj=8+H-8=K)?_Qq| z&pydtK0VF@*6^z+5N79-ju3?qVQ?04U2EfdtY`1X{r(kJO6w!4DHU zHf16c38DHlD0ql=RgZztD`054{B93OW|dT@Y-qW$@OO*>(97@;=OnS)2fPDVgsuro zULz7l03QL=Fc|!mBbIZ87Wy}dU==$Z5;&sZrZomCwm2XvcOra5**fn=xFyjbwZ0TU z&me#;ZwFfJ5BiD*a5G~X84~SMd8JE>XbkUS&MjAX6f}jW1j&Ox-x8}c0OEFgsbDo0 z9^xsi9ltnHwDe1QG&~e%@YUzct%B~PBs(`6Zl5gEgQHx~8jE9XZH>cE(K0U4OPa>p zVc-R(U#CRe;;@Z<7;^ANf$+|!vFr~Yh@f@cQlvtB$O#BgQR<=1`G)Ul=B;1dd*=#S znX#%@X9|>`;;wwo05Z2O4qV91Ubd_fC~?k_C|Hpx-(zc#&xW@Lc^sUE*k=#wU{6n= z4);80%q>V5k?opa^l9^`NAUL?`t5R`{}29vmwvcSXi(-~e`9Yr!^!`7#ELJ8N5W2^ z@EQX}UXk(Gr~aHc0OM53Py%z+r(7MIdE1~St?G~9S8lEiJPiq@^sh`yytipwX)KVl z@);qU>+iTyqulvp5Axm#g%J@3ziS4(aQUk+a>A{JZEmAf40?u<$Xx@Cg@yt{kkvoJ z)XG8(3_(K64X0ctG1*{GpDKAKe>55;G&u`!I->jzSp_$)+mSI4nS%~f+lLqpaY1e- z!f}TgWaFKvRL-J%cUM9+Mu8yCYHD6Lm06Dqi9p2@P_Xa_+O{BWbzn3YwspH89*OdD z66Ak~BJm5{tqiJ2$e9xhvGfv`H7n;&RSVOdn9G z;ge_6>LaTHMo67^=@GBAit`LV8VsMhwVF1ao;l?+w}H-Yo97Ms&vF;L=rF{48x0`hAR5r zf|u&AxBRw{;|=t|yOcF|5(0y4NaS24ICrM0OO@i_93Ej%B-V!fT@ZPz9I6*WH9B+R zY+3<;Kwpupn6eN|r5`d-fmLQfg;Qu;jZ#LeQ2>7gRphK7fpe>%L|G4xx#tObAH2+A zpV^j(%RY$9NP>^f^+w`CiWDJnOW;c0J&Bm%7y^xhlIn_&uqiR7LyW>l8{PgWJ^e_J z9RncxzN9Ej5$=^1;=`R&T91EJF)hGt+DCi5|>j6+3t#q2i6y(w2b2fGsm z1^_||g^C^F6b69wK{a%RZs+F=zzF*6G_e7fJ72VM{xtg3Wg+09n=BA|d`cjzx+{Bl zPV8R_0)V{REIhFo0QdPSI*K1JpbP>60IYLupByAYW8sp6%n|YuHp)-r$3GlWTefZh z`l_#YCWH0JybZ~`ab;_O0l0Eycer-_&hRh3GVr#aY>`8Tz2VCH^Wne!*E!D(@S;28 z*@AB;;5+XRWq7j2TbwiQ2}Z%mEBA{~*i@&?r*n~cE8Z{Q9(_vouMfVY2ccoC{FRIF zSQ^7n`CdG)Leo}yylFcHGy(_1t>aR;%P7DM3ZrAXs+7mQJdLt?P^bx2idAyCA_8&P zL1KPv;~WBJ^_1Vz6R&ZdgLFaY(qD`io71ICFwBuJ=WUKR~JU9iXz>l#I=M4DZ=G%KS7J#|?`xx$8 z?dwG{8n^k$-60Uxd}{1L7{lN^+g_rC#}F`=rd*@*`7pcy%nP}iuNdPnSA#5bReHSx zwgrj(TLaG3ofv>;pBYecz!lk!vVc&xX@jYBn>Q{rSg9gAu6ZjcdPWMl4%4hl4(wSKM zwcMZ}7@TZj;6N19;&1{c*sFLI2HL7~R%dsCxtx1o=xRgz+=Hf_Oo~w259zsE5(QQ_ z6WE!niw#^|Gy(`&&J@ILnTTxEvxznCxFfG;^}X01eDg zltHG%BB{)1rI*@CS>J1_X(ec^_6#-$clz*g-|1sq$!U6Gjm5F+`N=dpIK@LE?HpyDe~JcWqT z`_hj-L_P<`?ZU?%yT_}>HdhYl3mhK!z45p6;W-}neeN;HMsGIRcAOyg4gk&K_HWQ< z)-kZFP|+unS>+*R^ak|EXd6!~Tk4Q&t0N0?bS1#1Vekn|l^O0iW_cH7m(Q;9GC@9c z3|aXLURZ@M?GzsW3rivg8?Fk%>lzZWGB_s)gnu)Bwv(w!-?pumM8ZgmOfz-`gR?pK zW?wmjq)KbIP;lDIniGbQZUWPcuZ~OXRY05IzC^!v8B#iVpaP!Wi zY=Y;re)7dUMprco@?T@^oXcLl66e{M_1uB+)E#$ac>~uN7|$_`FK{_;q1icd9yHqC zP0^x&m`<|BJ3k&SXV4k|+5zQl=~{7XP^His0tOb>$$8S68ap@seE}aS1_lN9@#Ib7 zIb(c|mH&r78@6X$Xk$I?lpaANJ4Nl$q;2%Jdr$RUh3KUoNR8D4i zOpnFuf;H_tQJj-b2Q3aSnp9h27#mtCk5O?Y5X6DoUV&@4B4k$DzzaO_6sXUFi(aExZk7h>j@d&coNWYiHhAl>DagXXbgYIhUDBA@FnH2;?`@De=5sHg|0jG_4MF43kipR zAaZW(pw4{SoRKS6T8}~RfU#wu&;WGiA}c!mWN;2d#W%+25W5B2z+mU7iS|HZ3@`%l z(yh$%&kw_Y{_}f$tO(2w000@ENklGPcSI}T9r7(p%_9A9FJAyE0LGw;)m zp@n?yGyrst?LG#9SpGYgUcQHydfF<~M;PSf`oP|%ui#PG7y(BJxWeUV4H^SA!3iQ* z%2cF0MuQ$=1gLf_GX;kBHi@y20vBMSDkRkf%DN_Ku%ZN4956ND?nUjNkiMWT`$_3@ zHEIGFFGYIKfXs)p6)c|5jLYiekgvNGx|;4Q>5IXqPl(khRF4XU1aMK1G{4s6`FRD) zy*xscTW8h;lyX+`nR|PbUEx;YhZ|IG6YB-!dlclg`WS||{|bTIArJQ~kGpPraFLJg zy$M`STl@ciH{Q)fqah_El{87wOi40C0~(Y$!yy$Ssi+jml$j)zGzgJGlN6#T3Pp1v zG|y@MKKrhlj_)}*&-eVF@AJI=XTM(Wv-aNizSsI(>$|}> zUvzke`J;fdr-yS4t7sc3GK1rw$NuP=#N7F3C&f#MPV{oUwbMkWCT~)UcysxLnbn2dRKG5Er-O1e|VP^ZW)Y;tp`jSGG86n$a zTDQ#Q3aeFE7rmpebzT^ePh?qLo;Q}hM`d`COU5+4S9sx6C}KyKcxWj9q{eaOI{B+? zV^2&;3M<;sXtDk|Ez$jp_^4*vAuZL{1tzXIcR5a5N=Ngv-~Dp8@P_tz&DB?%hWIJT zE7(2O^Ky&NQk^chM)7UtX3>cgy`7(LUVM+Xez79Y$jK|!L^nonuo}JR`Sf8y-aYrU z;qO=7>D(D6+(CHdeeJT_4p3KJArFYng)9r?ajK9G5^ry{T0)khB=XQ!FxtM zidFk`BG0wTgrU6 zF0{t1w`I|Amb)}PMai0|vz+=3eo^nP8Lk~UQmrMzFkhMdeei|m%OekF58GBBvYTr} z*YI)9PiDR`AI)p~VzIrOSmaB2!vrrGPL{rvLFOkbuJ5W_p0DK)e>CG{Z;o_xKzidu zQ$f9*-N9#P472DGS#+>Y(6d0+_{<$Mwyk;Yt?VJ*8prj`ubK^W3)Y+wR9xB1A-V4U zSu@!Lt3}OoSFtaP4momV+0g9U9Eo#A?4bES8f7Oh?Z>GkYG-Z7VYx|hx6_SfM{0NN zF6;)v_;MWClF>Fn73bomERE zZ~Ysg(ySdc*}(Yuua28eSbA$lXiw8lGOB{bIAe$akE-~g*N^<8@&p}>Vz&9#%{;@k zPFt+&{R=)Xm$;Hq9tWN|Oyl?4(4}{Kme!r%{V%;8-it!$8(poTA!$5{>hFkd*D+@>Yo?y3f z)pZ3kYLA$-K0cJatz|0DoR4Y-9%2c1b2$=RvhJ*{b}N}o8__6hY+*6?l%G|xeN}wL zE$=fYvJYNV2-@9pYtGx`V!7qpmL;AE9m9tojyr~(G22pbONM=JY}d`plO(cf*S4!U zS>*Uyl|Mf#acJls6FW_Q-Lc9xS|JNr4hrAg(inNW!@ykjm`o6FoR6%6sT!Y(1lO^h zGdm5(xckoOmA{o(<+Q@6`DwtR95$hw8^tYTWT)Ei&Yop3EuT+Q%&B!`M(%;<(i3+q zOnl0R4=KO3FQuH!l0qgNucC|UH&oH(pZE_G#|w~b6t)F?0G0uQxI$!r&*YG1K5 zHmR$o&)vEG;?k-7Pl8M(4r*O^T4}5mJt|O8YpGA@@J-e|bC%cnsW-6kpDu`EX-%-2 z9#FYaIn;c;gQY{rV$Z1?4bgmqo?V$n{QZt{^2M~ z&F8eox(CgLo{1!jNU4f!3%NeQgDYIFG*WYS1?qzYr`fv z`>U;fH#sDCqZ1$d$--+Am+dOnST3KyU2;i6ewKqxtfFgpw12JS@Q|gWa;J;Fb@!R_ zc68%G*U0hbReWcv#BQH6e0I{jZES3Q4#ze~YFi!-5%JaIhXzrBeA3I zE!yM!tn*E+OSKcLX+>R?l^huo-VY|YTsf_`b@uVy)0T-!ZC9IO{#(J^b2}AE>@x(z zO565cJv1*bqNcs7Qd&2cCBJl`hlRn-IQ|wvIX{~CUb#z0YG*hJtxz|2K77mnXw&i$ zj<;kIcWzd!3(Sol;_Q1fFHuz9f^*|Bk9&?IrzRd#QBpo8d((8bLWVF)Ax(W{@PgZ~ zb7<;IHc!!)XtsT37b4Z+QoA~=b!=&>iLhy?uv3rqq8jh3!tyKyYj$z%l)c;#WNB8& z!@_zxO1_QVmc`aUWXpJ)jruj?bqa+yMLgqwe((XW-E96qJEu$MC#ox$G|xI7s%vs1 z!K7{I65QIEK3k=D_2y=Wd9Po_PdxtReW|9wOP-LS8zX^-^(j z_FIaa7IoDYx;SJd&z!Q?7te0uIjnGp^McF$yKxG5PkLEUaHf%J;Jl-%z6Ki(y)+x^ z{;1a>P*}%0S=3?AgdKW?Jf=#rZ{xh2_*omr#U|GDZL-}SsOZul<@snw*Pii0EK(;& zJ3bF`Kg?~Zw0@rDGzH%&&&7E>R?bqr^(y<|2PdxIY%>q5a?STjeR(DC8DG?_{i0%; zpQ0MK1h&_CC7sVtY7QHE&2Haz3xsE%E-fcRhP#Uagc~ZJ22@>44R|Sv2vq6~S_@=1X^{W<^AvTD#`) z35zByWZBNN=COBbY#$N-pfb$lUSU&2 z)`4aFKgP6;Xz*#ib#h{4TI~7QN-gi3yW*c-@me$1!WB=Bs}}efa}~&C^|08V;y*S^ z!C-YdTjBovkdp!VZ`eewd~2VMkJ%l6&L_U6m`m;*mwxHC<|cNLJBgF3=kwB5?!P{_ zHQ-^S;z$)W!*OqnLymDQZsT8=;vrQzZsxe!dM@v~#wT~x8rh7sk_x)&H?4~QLWf10 zu2qlvrqGL4)63Hur9UamJnWFK)9M=Z@M_VyQ=7S)7l@TlAH{cgUTkaA#YOMkkBqpo z-_!L=fKJZImYGvkrG`5{ON#mY<%si;hkH$IR);F4t&?%MsB<^U~d2J=F!w zjLzjJnB^;}7e0+U!5h)~Ax<;t(rJn@+mt$ zg$Ii^O`jfW=FS=2HL?7hjalb(s zOp9OEpBG@gc*Qwz#-984pXDsJm?7mNlo@6@|5eLmA5Dpdg-uGwAALUSn)Es<>`n2? zopui!#yRp_m3W@vot?3gr{Gf7KV?ort0Qn#G_jCIJHRFMNW(5ym}qdxgqzug2KYJjlFIPEScrN@i0)Rx;n>U^|E+RkDGQ=ue}KSC_h<` z^(s%?n`!=*+c{IzR;#CYpVwMCE&YMm;;a0zGqrENSkoDnnB%Z*zgJsgiE;Wy6@j|k zoJEq|0`4o{^i*ws)|;RFCO;sQ^9W}->%=@4t*yGZV!WHUvb*%IkDWAGo`*Y9;o#w! z@v%FvC~jPHX7@tDHCh%=Qq$a5;x9Um8RGcq#KqW%`zwc@Q@pv;Xb0cgr5TnU0jtW+ zmFzlq<@{MKKG%44*33*cQLWt_^zBunHPckBSH-+geO$iHp;t0qA@N1-W)q)>yNc;8 z3)auiUmtxyoli_^@uGD!TQ|bHM}EfK$RvA9)0~35I8~bHo6TuC7aE;tvBw2v+OOHJ z6thka7#=cIL~wJ+>S5(lV#g=6oBKsI%EeyGR4scYobU8#KY!-!!=gtMt2yU?@Gz`r z4RrIlyLCTz=J|CE>)z)bcXglZVpx$b-FZr%XWhwk3FTo&pG41IzhmmPd7*RNyk5zB zO*cBJB2iy;ZGB-aWAi`dvZ?9%PdT%C$5?^S z3mn-4NBKuLz0g;PwRfMn_hriAA>zE++|6|vPA3zWl!*(~WNBGgm8O&gw{jJW59#{Q zx$d3;Y3xzYbUu9Vs@kop5qWHx*TSms~8Lh(hR^>epH;qST?(H3BKE_^pk|!F@b$0Z2N}Xt(ZvEc(TJ`;B4h=q40>W-* z7cK7*2;YAER(?cFMFh*1(sM}?&-vYD(yEt+9L6ta+Ohmg1sAW2(e?C|Uo5z`XrqU| zjOe2q6$g3txn&gl-FtN0TX45ltVi-E|BFV?Cf82a-xYURYVA8gj@}1;(N`DqOJu#s zj9yWhp5$IZzgV1O8T^^UCGvWxXX=$#Xas%!>pF| zTusxxwUbt!P~a@PBy-9A!>5k*oElenVzSlVeV+P9b1cRPZW;BF-;{RPdyI@dyPDM! zB^~;NEqCT*`-m*+)616na>w&5f37F~YR`$sJ>9|l#qnKPFE(H5Yc6@m6>8Ekyhq`1 zcBbLe@*{_;v+t!V6>|%%FuJ`sLqYv*)ZKBDYtzS1sS6I)Rk2Op?yJ#!^k(|16Z>QM z<1!K+^5(B!Hptu1%Ve^~5WvbFW0{H5yp%ugl!euvIXO&+z% z?sl-v$+A;d((OBAr@fh=EibU&G^jBK*Kkd*aa68<{pE6Q{Dn@=5Ym)Wtk4*uz!BcO zPO->$$SS)U|D$n}Y4j40su5)`ty`aL^gQA*Ea10&MVYSCF8Gd(^^Lw9+_tgKAkOYy zW80NoJIl7Ew#9AylsoUFf1SRV!>OI0)-5e5?wnTEm6v+wB;9+lQ)`UeyWMMdk|Vpm zY-~4g+O0>fN3OIh@v8_Iba+YO!H%_op3xQeL~b2fD0nV*eB6G+qO4-1~C zRPnAdE~iUwcG{Ou8}&?GgZYjtIUBBS9+TF0a#MN)x{V`%%A-wt(~CbytAr^$2ATtW548)@6={I}YB=}WeJ zI89FwTeW^c_$|H1T)j=R_xE1Ty7)2pH=b$hZigpZIp02JWq8dj9mG&n16rxsiHR`{4c?1*02WPsS8_-U>E_fo*YT_Cp<1uQDrvor8}k{Jr+NO6OzK?6zTxQPsP~D}gI-R1Ew=TMfXI=!QGt<}Z@V|$DU!_%&Wanq`N@XV zqIrkTK5mv|*(a{OHX-a{fx@-5X+dZo| zOiNw=Sg`10R#ENxb?f%&-MJU)RDNNk*&SZ}l=<0Pj*brM3V*)!x>L;JS5;!WPrTkO zofy5UI(m+c(6S`%_T;3x!cyJ*yR%MJ8HhH{ z>y)+_+ne4uw^H6z?3i2`7FwhB%yo9Y^zeI&jx8{uo&F*&DCShgeQ?i#c|Knh5_^ND zrW`W9T9D@2bY{E1i^z+amjnfhl^+dHO+4-}+hs}0n$zL}`X85OHC?G3?hzUO&UNfg zxqZ%i^FPNOW;;DO-=%NH6eFXk+!nhsm-3XIJGOeZw4c3e*C+D%v(he~9;J;cdjus{ zr+ktecfI+#pzG3A9IXjHY;m8<${bCKj!C5}K0bBf#++UEeaCAwbg7VhUA|%K_|vzN zk7Xpr-#|5E?#L6Gjq5VJ{qbl2>{V!_gWUbHPUUdG-T*dX`hjz7v-_%^ZPjQ~c6O*t zzambTWoxXTEG0ZynC=-paue^tF$c;>^X#!Je7&8)O_QpYk9Ae^WmI~CO}=N>nw_1mFH7xKZMU@3yK`*EQu(`6TJ_#6Ybk7} z$(lJEGH;i^d8H%J_ z1lG`w1*Ko=JrJYdZoN&%=iE(C9$~tyfJd*^(;)pR?8{R}(EQh=TX2*-nq$P>U%w17o8y2%5)y|RYK?zk2gXH?H~T>gMVV+zcU7q)hvJm@B;i?`yUMt^s#}jV-9vH?V?~DkpER!X)Frt zEUb!uC%@447+f<1urc#xo9kwyy?eaLzk>g6FY_^!If4knZkoh7H|aU8D<8Hg$G&lFrV4IyyT@M@I+ad`Cw+ zX>b2VTU#6XN^2WwWzb4mTKl2uYH4X9&497r+)SE5Q*#q(Zfa(nYiepDjez>Rsi~1P zHumrTlK!6VLHfJD>4)~N0sWL6gZ1~@(7~{y4YqvMKVVBMv@`jpzh7%}OTYf+@AOkP zeAN#dsQq8jPhIz)%Fpz3(0T|5I}qq0oZ{Vtb7VK+7z0$m{gwGZAT|z z4ecQ8w>k*hZEy(tbJ_`qcst?bM@efNpn`a?RH>G4`K7^CT#mqp6n*~J9>cn4X>m*ZvDsn-xy@T);LwgKt@oOh6E7}R`$~MAk(?(ckqXaCAP`bi~uvYx* z>=q)09GC>u5dTtu2e7|~_UtA?Ki?l;e@TBxFX6n?L-?Ne5V6PD6j)I*uxep?Qi$y~MVshq!^g(0v&^ z043dBqzc*_z~J$yKc72EE404{b+Drbd0f@jPHI6N_G^&K70~+%6oFFk4!j4o&|V1L zAt>h}pT!#BhqP~F5i^&67C(~EZ&Ke&+P~%YlSi~&b+P{sdt!>m;M2)Ld*@CeY<0^DFfDCB&MQH{M?P%`EQ^!-;Gu-`s-Zh#+{s zLx2BMCHfz<53-?+(fn$hE(_=2sRAXPVN7!|C7G-lFz+gNH4TA_^Q3X z|G)X5-$`1@*pe%#_YyX1&GU)%p z)Xpe-V8=ilQR@n7ZXTGQskH@_4^&?C=ft=51(ge(j98*#i0OxZ?TlPt4(7Z} zmCRiD1RJsd)#udOg5p>Dzw^r%@&z{ZqGbA@2f5tKfYMK`jRxlerF}p@`o2G(yGRG+ zhk;zC{Lmju{cEH)^#9j5qWYbY&)?#R@&%R4*#r9f*Gj*p{|iGuY+%F?v!wJ7_+UUk z+HJvdup52|f%a1%0%X93 zy039Wfg5rm6#C1lTxP^jzYYC%Fm3pDuRzVsL4b-KD*jtA9{o!G_Mz`7 zm~q7H|KE>E-|~UV}{dy>Q3$RAL(@l69x(F|9;DLT_=;r|f&^`=ys6e|lY&ZlzJcbP|1F^)Mn?J*b zOR&Lop#Le|On#QXmZXndf%ay~2fy>fKu&+n1NZ>@+0eWN7+^dSg&)`-Lw_XJ*hO80 zs{=qk7qrtEWe4^F^m7AA=wArJp}!8ATR|}g`*^?!IA8;_-F0hB{v3&VzX zXf6c#u;UT5r$hS*@EcePy{mvTI0hSV4@bojo?3%aEUp-=52bPrJ3N3@`S8`uSAfuWca=qPzn@Vn zyN_^e=p!OsUx*?4e?ByiLCJxV4((jf%#D&8KH$MVA45OxKat0rxaZ_V3~|Ol??!-o ze@5 zelZ@5fOcgt9oiQoeq2#nLbEz-7>hm^0K9+$;Q7V)@p42?PL9aR%KnmmE(x^FN$DT3 zfr}6>GQ7AOl81|Il_aVZwy3_iVosKkOVw2?s|Rp>shO)&BzM|GgNK8vBSS^h*F? z=p6~qy3nl* zra`+t&}%1(ii!;V)H>-`^wU@-5LVh&!p4$JIO)}dJ_6&4ULWDv2;%z)KkhFnJH|t^ zHZTRo&^;G+*dZ5|V1EwcNDVfq02$c93mfQw3v&b46>ti1wHdnCAa<6cw1+LTfCjWH zA&w@aoPrWDB`+_}KyLi_U(&CprcTt<^ua1JSz{lWJpDY;m=-}MYhNIf4I{{u#ZhF+ z+Dl~0=1W9tXEf2-8%+!jM3d>k(PRe783%C;^bSQ6U6k5D6HEz;CK|4n$mCVP7Ayc} zQDpKglry7_?LTtde2N6=!1XWGy9fT-;Xiq9#%ljoz#0e{QoAXwx~9lZHr-_djEr3L;X9T z+M?Rz+~>E)+t=H(<6m9p1p4hJ`vd$)@csZ29OzH>`TJtcg7PU58To;T%xWMaM_P%<<#r-^vV%xC<9XPu-@kY8efyjWgs`t7gf#%=G3x%F z5P>v8gmVZPSxg9S1Ia>o!W<|y5h8wv5TOIO#sj4bSWSqaD>y@lbTuKmxXuJj0NkCZ z^AQ%s4Bz&b-?z^aLI{5;Aqr?`b~hnT_+BuG07(EJk#^kUwt*MezYZ>eivuO(l5lVV z+ysT-HHZQ;02ee5_U-rW^TiWl)JVu-Tnnk>1NhSo_tU?+p;>Yk;L*$v+n@D-kWkqD zXYEqY-kBTqeEqL%Rk%0|{K)=O?S#DlNu`Y6z+n4eEkF6n*N-a(+NVxXI==6J%2)qi zZmp>NNA`dD3yo9W|0~y1Rlfs2YM;91SGGD_#Ef++PG5o=@S}*Jv_1v@+xDq?(t#yV z2G(E=*b3r61NgJ;89t!er#7nm-v4hIpZxegNDmSNG%-eSej-E+f=1z3222KP0hRky z9DnbhdpP$a`?ulqV(@4ENM#>}LgEO-&;V;PG}PmHG>$m{JD~Q(fC;z+sN6@|lP6#a z_)+^)aN$Z^69uSP8N5-kdk0XTYk=`>gh;{>Lm`+4okE8mI+C0d4q$=dR4+?|9l#q< z-(drP)_$Pho_3v+gy>_Coq@jHj%%??n!$5`VV=wfQvp?%3OZvF95xBTCx;71UBNsN z04=zXD-k;IMIKxy0vHc-pqB#yNVQLGR5{rHRQvimgv?w94SNXDL8FugYHZ&Cs5UA8 zYJq73$12dNT!OjiE+G?Pq@o$-nmL4wSx$)5WkQBwz~O(4e!+ymwFxD@{3H7fbm2El z6vhUG7;GeDP9q`CXbaVnDFf|N?Nd<4>Oc*4s^&unG*80!lps#Y68q@*Nk^b-J$$8) z_#92h2vN+9f`Wvbo13t+v;PnK4QJ<(S+mgx)8PXnLQG!~g6?3 zK&1;hV5h1VbSwcY0M))HwAe!fzBm!KO~jX}=jIgDbN|8pkM(D}k+C_MV}6RvHG4-) z=b|sdVLRfRvfms~S{#7`SPkreDS+8TqYwTmN1q_*r<_I~g`qqL&@Yp*rci^XDR3n9 z+?(1I6cm2f{(-=~?Q`eMB370QfGb&OT}b9TG?Te*c-QY@7co!kCQI_V$#T3mxTXxh z>6dqt6%{xK7J!++5WlPGpY0^mgF1<^PbZnN18fG%I*B2E6ESk^WVBCdp!#6Ie#ZKD zUx0sK?c0~6toRvu`!_>9^Q7whz8q+uvHm}_Kfr@J{&zy%b08lW_djq6?H~T{`T&0T z|Mf;aCy@ZuzsdW*d`^Pqsb>Ln@OM6kpz5OPWY$gn#_@MPXQ1k$>ZBhI3JgAeIGFsM z`0U&fHlUZ6su%lzD+6^ho&zxJr{;)1+o<;cY-4^lxcsB~|4tjeub-VIm#~f~CN%jM zgru1FxkUx_Ud91tUV1C|!b&x;i-<#-^TfncIkWG~UYcm(Dxz@iSc*moEUFn0*M}Wch ze_#KQ=>B!|LtKX?(6^1c=fry{{m)&#ogTc0r3eWGKk9!MtP?5*e`#Q!dheJaM zexyGLpZ`%CZ8*OjaYTRHzkcV#u{faCe^|aQdvDM+flwK@> z30ofS1>hu(R_xcHE;P)7^ETiRpw{|7>K}Gpe10DH9UuCi0a1N`r7htefC~XaFMth* zV@^kaMLfr2+yfvu*=zCLl>Yjeee`|&Q}4J?@9NNSFQE*L%9I{J-9J(HckC2s8?TfQ zj!~#z66dkTrTgJn5Afn1P)v*n2?;UY5Bk1-4uNfi&iamU@Z0M+MI z-_t*%?!&;k|Ney=c~4gavdDeBe?e{I@&3j4_4Dy^;@zZ)L}2K3!e{u7@E@utlF9W% z`N>D3RR9V<64@6YiRi0(!gJ>X;dOschO7lP?}?!9J0hs@o>4!wMyKu*2I~L%oS6Ar z{$DMb?*R-hpXKH->u1bg#||CXN458NLd}WrHDmromr<_#uLXAeM{U%)O$bPXAFbQ| z4u7JF-;F!JddzH_y8ip^`*Y0W!R6rZQ|JFG%*hR|x;SI5J{gJQ=kmfpBSr zA)iBtm`xm!J()(h7suh*|CZmi!Tdh=8bUT>tW1LuDt?Bx4n`?=Vx2nW4{2xVd1h52Jp4>jKM;JbX7uy|$=!YhNd)!6huZ2wor byTM}{bv<>=)c?OJA@jd>%%ZgaZ@2#kNH-22 literal 0 HcmV?d00001 diff --git a/font.h b/font.h new file mode 100755 index 000000000..1eb1b54cf --- /dev/null +++ b/font.h @@ -0,0 +1,27 @@ +/** + * Powder Toy - Font Data + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ +#define FONT_H 10 +char font_data[] = { + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x31, 0x0c, 0x02, 0x70, 0x04, 0x00, 0x00, 0x05, 0xcc, 0x74, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x19, 0xcc, 0xe0, 0x3f, 0xcc, 0xf0, 0x2f, 0xcc, 0x90, 0x09, 0x00, 0x00, 0x00, 0x06, 0x30, 0xd0, 0x3f, 0x33, 0xe1, 0x07, 0xf4, 0x12, 0x33, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x2d, 0xce, 0xcc, 0xe1, 0x1d, 0xc0, 0x03, 0x74, 0x4b, 0x33, 0xb3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7d, 0x30, 0x0c, 0x13, 0xd0, 0x32, 0xb3, 0x33, 0x1c, 0x7d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x34, 0x1d, 0x07, 0x03, 0x07, 0x1d, 0x34, 0x00, 0x00, 0x00, 0x04, 0x07, 0x1d, 0x34, 0x30, 0x34, 0x1d, 0x07, 0x00, 0x00, 0x00, 0x06, 0x44, 0xd0, 0x1c, 0x64, 0xf0, 0x3f, 0x64, 0xd0, 0x1c, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x30, 0xe0, 0x2f, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x06, 0x80, 0x02, 0x0c, 0xa0, 0x00, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf8, 0xe0, 0x39, 0x07, 0x33, 0x32, 0x03, 0xb3, 0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x30, 0xf0, 0x60, 0x03, 0x0c, 0x30, 0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x41, 0x03, 0x0a, 0x2c, 0x70, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0x71, 0x34, 0x01, 0x03, 0x1e, 0x00, 0x33, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc0, 0x03, 0x37, 0x1c, 0x73, 0x34, 0xbf, 0x03, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x00, 0x57, 0xe0, 0x2f, 0x00, 0x13, 0x30, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd3, 0x00, 0x07, 0xf0, 0x1f, 0x03, 0x33, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x07, 0x34, 0x80, 0x03, 0x0e, 0x38, 0xd0, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xd3, 0x1f, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x34, 0x03, 0xc3, 0x3f, 0x40, 0x23, 0x30, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x04, 0x40, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x0c, 0x0d, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x0b, 0x1b, 0xc0, 0x0b, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x0f, 0x90, 0x83, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfd, 0x71, 0x30, 0x81, 0x03, 0x0e, 0x34, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x0f, 0x1d, 0x30, 0xe7, 0x37, 0x73, 0x1c, 0xe3, 0x2f, 0x07, 0x00, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x74, 0xd0, 0x1d, 0x47, 0x33, 0x30, 0xff, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0x30, 0x38, 0x43, 0xf3, 0x1f, 0x43, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x33, 0x30, 0x03, 0x33, 0x34, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x32, 0x00, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x33, 0x10, 0x03, 0xf0, 0x0b, 0x03, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf4, 0xd1, 0x34, 0x03, 0x30, 0x3e, 0x03, 0x73, 0x34, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x47, 0x33, 0x30, 0x03, 0xf3, 0x3f, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x06, 0xd0, 0x01, 0x0c, 0xc0, 0x00, 0x0c, 0xc0, 0x10, 0x0d, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x47, 0xc3, 0x34, 0x70, 0x03, 0xbc, 0x00, 0xb3, 0xc0, 0xb0, 0x70, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x10, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x1f, 0x3d, 0x7b, 0x3b, 0xe3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0xcd, 0x03, 0x73, 0xc3, 0x8c, 0x32, 0xc3, 0xcd, 0xc0, 0x33, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xc7, 0x71, 0xd0, 0x0c, 0x30, 0x03, 0xcd, 0xd1, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x30, 0x1d, 0x43, 0x73, 0x34, 0xff, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x41, 0xd3, 0x71, 0xd0, 0x0c, 0x30, 0xc3, 0xcd, 0xd1, 0xd1, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x31, 0x34, 0x03, 0xf3, 0x0f, 0xd7, 0x30, 0x34, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfc, 0xb1, 0x31, 0x07, 0xd0, 0x0f, 0x90, 0x23, 0x34, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xcc, 0x00, 0x33, 0xc0, 0x0c, 0x30, 0x03, 0xcd, 0xd2, 0xd1, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x33, 0x30, 0x03, 0xb3, 0x38, 0xcd, 0xc1, 0x0d, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x30, 0x43, 0x30, 0xc7, 0x34, 0xcd, 0x1c, 0xed, 0x1e, 0x2c, 0x0e, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x4c, 0xc3, 0x81, 0x3b, 0xd0, 0x03, 0xdc, 0x42, 0xc3, 0x31, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xb3, 0x38, 0xdc, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x0f, 0xd0, 0x02, 0x2c, 0xc0, 0x02, 0x2d, 0xc0, 0x06, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x03, 0x28, 0xc0, 0x00, 0x0a, 0x30, 0x80, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x47, 0x30, 0xfc, 0x0c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x0c, 0xf0, 0xc7, 0x35, 0xc3, 0x0c, 0xf3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc3, 0x25, 0x03, 0x4c, 0xd2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0xd0, 0x00, 0x83, 0x8f, 0x33, 0xc3, 0x1c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xbf, 0x0c, 0xd0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3d, 0x07, 0x03, 0x2f, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xcb, 0x32, 0xc3, 0xf4, 0x03, 0x4c, 0x30, 0x7e, 0x00, 0x00, 0x05, 0x03, 0x0c, 0xf0, 0xc7, 0x39, 0xc3, 0x0c, 0x73, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x1c, 0x00, 0x0d, 0x0c, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1e, 0x00, 0x05, 0x03, 0x0c, 0x31, 0xce, 0x0e, 0x1f, 0xcc, 0x31, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x47, 0x3d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9b, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x0c, 0x33, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x31, 0xc3, 0x4c, 0xd3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xc7, 0x31, 0xc3, 0x4c, 0xf3, 0xc7, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xdf, 0x31, 0xc3, 0x4c, 0xd3, 0x0f, 0x30, 0xc0, 0x00, 0x05, 0x03, 0x00, 0x30, 0x7f, 0xc7, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xc0, 0xc7, 0x10, 0x3c, 0x04, 0xf3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x0c, 0x3f, 0x0c, 0x0c, 0x1c, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x70, 0xdc, 0x30, 0xc3, 0x4c, 0xd3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xd3, 0xdc, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x32, 0x33, 0x73, 0x37, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcd, 0x32, 0x7d, 0x8c, 0x73, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x30, 0xcc, 0x30, 0xc7, 0x74, 0x43, 0x07, 0x0c, 0x1f, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x4f, 0x2c, 0x2c, 0x2c, 0xf1, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x04, 0x38, 0x0c, 0x0c, 0x03, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, 0x02, 0x32, 0x33, 0x33, 0x13, 0x00, 0x04, 0x0b, 0x0c, 0x0c, 0x30, 0x0c, 0x0c, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, 0x72, 0x37, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1f, 0x00, 0x7f, 0x00, 0xff, 0x01, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x7f, 0xff, 0x1b, 0xbf, 0x01, 0x1b, 0x00, 0x0c, 0x00, 0x40, 0xff, 0x00, 0x00, 0xf8, 0xf0, 0x3f, 0xee, 0x2c, 0x30, 0xcb, 0x0b, 0x30, 0x42, 0xc3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xf3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xff, 0x3f, 0x00, 0x0c, 0xc2, 0x00, 0x00, 0xcb, 0x00, 0x00, 0xee, 0xc0, 0xff, 0xf8, 0xb0, 0xc0, 0xff, 0x2c, 0xc0, 0x00, 0x0c, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xcc, 0xcf, 0x00, 0x0c, 0xc0, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x70, 0x00, 0x00, 0xf3, 0xff, 0xd3, 0x03, 0xe0, 0x3c, 0x3f, 0x38, 0x03, 0xd0, 0x33, 0xff, 0x38, 0x03, 0xe0, 0xf0, 0xff, 0x03, 0x0c, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x8b, 0xf7, 0x0c, 0x13, 0x9f, 0x3b, 0x37, 0x00, 0xc0, 0x23, 0xff, 0xff, 0x8b, 0x03, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x00, 0x37, 0x00, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x00, 0xdc, 0x00, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xf0, 0xff, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0xff, 0x0f, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0xf0, 0xc0, 0xc3, 0x3a, 0x3c, 0x0b, 0xce, 0x2b, 0x80, 0x7e, 0x00, 0xd0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0x03, 0x2c, 0x0d, 0x0f, 0x37, 0xf0, 0xc0, 0xf3, 0xff, 0x3c, 0xff, 0xcf, 0x03, 0x0f, 0xdc, 0xf0, 0x70, 0x38, 0xc0, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x1f, 0x00, 0xad, 0x07, 0xb0, 0xc5, 0x00, 0x17, 0x0c, 0x70, 0xd0, 0x00, 0x0c, 0x03, 0xbc, 0xef, 0xb3, 0x11, 0xe0, 0x07, 0x05, 0x3c, 0x52, 0xc8, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x3f, 0x00, 0xfc, 0x03, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0xc0, 0x30, 0xc0, 0xff, 0x3f, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0xfc, 0xff, 0x3f, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb8, 0xe0, 0x2f, 0xff, 0xe3, 0x2f, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd0, 0x7f, 0x80, 0xff, 0x2f, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xf8, 0xff, 0x02, 0xfd, 0x07, 0x0a, 0x40, 0x01, 0x00, 0x02, 0x00, 0xc8, 0x07, 0x10, 0xc3, 0x00, 0x31, 0x0d, 0x00, 0xfd, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x0a, 0x40, 0x05, 0x80, 0xff, 0x8b, 0x1e, 0xd0, 0x2e, 0x00, 0xf0, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0x0f, 0x00, 0xb8, 0x03, 0xb0, 0xe2, 0xff, 0x02, 0x50, 0x01, 0x08, 0xff, 0x07, 0x03, 0x1e, 0x03, 0x73, 0x03, 0xef, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0x2f, 0xe0, 0x1b, 0x0c, 0x1d, 0x00, 0xff, 0x03, 0xbe, 0xf0, 0xc1, 0x01, 0xad, 0x34, 0xc0, 0x36, 0x0b, 0x30, 0xdc, 0xe4, 0x07, 0xfd, 0x1b, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, 0xa0, 0xaa, 0x00, 0xa8, 0xc2, 0x0f, 0x2a, 0xff, 0x03, 0xca, 0x3f, 0x80, 0xfc, 0x0f, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0xaa, 0xea, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xaa, 0xea, 0x1f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x03, 0x00, 0xd0, 0x03, 0x00, 0xf4, 0xab, 0xaa, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0xab, 0xaa, 0xd0, 0x03, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x09, 0xfe, 0xff, 0xe3, 0xff, 0x0f, 0xaa, 0x3e, 0x0a, 0xf8, 0x2e, 0xe0, 0xbf, 0x80, 0xff, 0xaa, 0xfe, 0xff, 0xe2, 0xff, 0x02, 0x02, 0x00, 0x00, 0x09, 0x00, 0x80, 0x04, 0xd0, 0xe2, 0xff, 0x02, 0x00, 0x00, 0xff, 0x6f, 0x00, 0x40, 0xe6, 0xaf, 0x50, 0x00, 0x09, 0x00, 0x20, 0x00, 0x64, 0x00, 0x09, 0xe0, 0x3f, 0x70, 0x60, 0x63, 0xc0, 0xe4, 0x80, 0xc2, 0x03, 0x07, 0x0f, 0x1e, 0x6c, 0xff, 0x27, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x09, 0x44, 0x44, 0x00, 0x12, 0x41, 0x88, 0x04, 0x21, 0x21, 0x84, 0x48, 0x20, 0x23, 0xc2, 0xcc, 0x08, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x78, 0x00, 0xb4, 0x07, 0xf0, 0x2f, 0xc0, 0xfb, 0x00, 0xbe, 0x02, 0xf4, 0x07, 0xfd, 0xff, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0x00, 0x19, 0x00, 0xa8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x00, 0xf0, 0xdc, 0xcb, 0x03, 0x00, 0xff, 0xff, 0x4f, 0x07, 0x40, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0xff, 0x3f, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x07, 0x00, 0xbd, 0x02, 0xe8, 0xb3, 0xe0, 0x3c, 0xac, 0xc3, 0x03, 0x0f, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x0b, 0xc0, 0xc8, 0xc0, 0x91, 0x1b, 0xcd, 0x36, 0xe7, 0x00, 0x47, 0x03, 0xa7, 0x80, 0x36, 0xfd, 0xff, 0xc1, 0x9b, 0xf9, 0xb8, 0xb8, 0xb8, 0xb7, 0x99, 0xf7, 0xff, 0xff, 0x0f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x03, 0x00, 0xfc, 0x00, 0xc0, 0xff, 0x00, 0xf0, 0x3f, 0x00, 0xff, 0x3f, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0xcf, 0xff, 0xff, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x1f, 0xcb, 0x30, 0xc3, 0x3f, 0xc7, 0x00, 0x7e, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xfc, 0xff, 0xc3, 0xff, 0x3f, 0x0c, 0x00, 0xc3, 0xfc, 0x33, 0x0c, 0x24, 0xc3, 0xc0, 0x31, 0x0c, 0x06, 0xc3, 0x30, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0xff, 0x3f, 0x30, 0x00, 0x03, 0xc3, 0x30, 0x30, 0x3f, 0xff, 0xff, 0x3f, 0x3c, 0x00, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0xc3, 0xc0, 0x00, 0x0c, 0xfc, 0xff, 0x0a, 0x00, 0x00, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0xf0, 0x3f, 0x00, 0xff, 0x03, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xb8, 0xec, 0x9b, 0xf9, 0xbf, 0xf8, 0xbf, 0x99, 0xef, 0xb8, 0x2c, 0xff, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x87, 0x87, 0xc3, 0x30, 0x0c, 0xe3, 0xde, 0x01, 0x03, 0x74, 0xbb, 0x0c, 0xc3, 0x30, 0x2c, 0x2d, 0x0d, 0x05, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x34, 0xc3, 0x0c, 0x73, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x39, 0xc0, 0x00, 0x43, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0x60, 0x60, 0x60, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0x87, 0x30, 0xb8, 0x00, 0x23, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0e, 0x36, 0xc6, 0xfc, 0x03, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xcb, 0x00, 0x7f, 0x40, 0x13, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xcb, 0x10, 0x2f, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf0, 0x0f, 0x30, 0x60, 0x60, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0x7d, 0x4c, 0x33, 0x4c, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xd0, 0xc7, 0x30, 0xc6, 0xe0, 0x03, 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xc0, 0xf0, 0x3c, 0xcf, 0xf3, 0x3c, 0x03, 0x00, 0x03, 0x00, 0xcc, 0xf3, 0x3c, 0xcf, 0xf3, 0x30, 0x00, 0x05, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x30, 0xc0, 0x0f, 0x30, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xd0, 0x7f, 0x40, 0xff, 0x1f, 0xfc, 0xff, 0x43, 0xff, 0x1f, 0x40, 0x15, 0x00, 0x00, 0x00, 0x0a, 0xe4, 0x06, 0x90, 0x91, 0x01, 0x06, 0x24, 0x30, 0x90, 0x1b, 0x46, 0x6e, 0x96, 0xb9, 0x91, 0xe4, 0x06, 0x0c, 0x18, 0x90, 0x40, 0x46, 0x06, 0x90, 0x1b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x02, 0xc2, 0xab, 0xaa, 0x3e, 0x20, 0xe0, 0xab, 0xaa, 0x3e, 0x02, 0xc2, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x02, 0xc0, 0x30, 0x00, 0x0c, 0x03, 0xf0, 0xff, 0x00, 0xfe, 0x0b, 0xd0, 0x7f, 0x00, 0xa4, 0x01, 0x00, 0x0a, 0x00, 0xa0, 0x00, 0x0a, 0x00, 0x80, 0x00, 0x81, 0x24, 0x10, 0x85, 0x00, 0x20, 0x66, 0x40, 0x15, 0x45, 0x62, 0x90, 0x4d, 0xd0, 0xf1, 0x23, 0x01, 0xfd, 0x41, 0x41, 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x00, 0xf8, 0x02, 0xd0, 0x7f, 0x00, 0xfe, 0x0b, 0xf0, 0xff, 0x00, 0xff, 0x0f, 0xd0, 0x7f, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xd4, 0x01, 0xd0, 0x06, 0x40, 0x7f, 0x00, 0xfd, 0x01, 0xf4, 0x07, 0xd0, 0x1f, 0x00, 0x7f, 0x00, 0xd0, 0x01, 0x00, 0x0a, 0x40, 0x15, 0x00, 0xfe, 0x0b, 0x88, 0x2f, 0x52, 0xf0, 0x50, 0x01, 0x0a, 0xd4, 0xaf, 0x7f, 0xfd, 0xf5, 0xc7, 0x0b, 0x3e, 0x70, 0xd0, 0x00, 0xa4, 0x01, 0x0a, 0x80, 0x2f, 0x80, 0x5f, 0x2f, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x01, 0x34, 0x34, 0xc0, 0x01, 0x07, 0x0d, 0xd0, 0x75, 0x00, 0xf4, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xf4, 0x01, 0xc0, 0x3f, 0x00, 0xf0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xe0, 0xef, 0x00, 0xbb, 0x0b, 0xa0, 0xaa, 0x00, 0xaa, 0x0a, 0x80, 0x19, 0x00, 0x64, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x2d, 0x80, 0xe7, 0x0b, 0xbe, 0xf8, 0xfa, 0x02, 0xfe, 0x0b, 0x80, 0x2f, 0x00, 0x50, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xf8, 0x02, 0xe0, 0xbf, 0x80, 0xaf, 0x2f, 0xbe, 0xe0, 0xdb, 0x02, 0x78, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x05, 0x00, 0xa0, 0x00, 0x40, 0x1f, 0x50, 0xfe, 0x5b, 0xfd, 0xff, 0x47, 0xff, 0x1f, 0xe0, 0xbf, 0x00, 0xfe, 0x0b, 0xf0, 0xf5, 0x40, 0x01, 0x14, 0x0a, 0x40, 0x1a, 0x00, 0x09, 0x06, 0x20, 0x80, 0x00, 0x02, 0x08, 0xfc, 0xff, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0x00, 0x30, 0x0c, 0x00, 0xc3, 0xff, 0x3f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0xaa, 0x0a, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x2f, 0xf0, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe1, 0xdf, 0xe1, 0x2f, 0xe1, 0xef, 0xe2, 0x2f, 0xef, 0x3f, 0xe0, 0x2f, 0x00, 0x00, 0x00, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, 0x06, 0x74, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0xdc, 0xc0, 0x0c, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07, +}; +short font_ptrs[] = { + 0x0000, 0x000e, 0x001c, 0x002a, 0x0038, 0x0046, 0x0054, 0x0062, 0x0070, 0x007e, 0x008c, 0x009a, 0x00a8, 0x00b6, 0x00c4, 0x00d2, 0x00e0, 0x00ee, 0x00fc, 0x010a, 0x0118, 0x0126, 0x0134, 0x0142, 0x0150, 0x015e, 0x016c, 0x017a, 0x0188, 0x0196, 0x01a4, 0x01b2, 0x01c0, 0x01ce, 0x01d7, 0x01e5, 0x01f5, 0x0205, 0x0218, 0x0228, 0x0231, 0x023c, 0x0247, 0x0257, 0x0267, 0x0272, 0x0280, 0x0289, 0x0299, 0x02a9, 0x02b7, 0x02c7, 0x02d7, 0x02e7, 0x02f7, 0x0307, 0x0317, 0x0327, 0x0337, 0x0340, 0x034b, 0x035b, 0x036b, 0x037b, 0x038b, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03e0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x042b, 0x043b, 0x044e, 0x045e, 0x0473, 0x0486, 0x0499, 0x04a9, 0x04bc, 0x04cc, 0x04dc, 0x04ec, 0x04ff, 0x050f, 0x0524, 0x0537, 0x0547, 0x055a, 0x0565, 0x0573, 0x057e, 0x0589, 0x0599, 0x05a2, 0x05b0, 0x05be, 0x05cc, 0x05da, 0x05e8, 0x05f3, 0x0601, 0x060f, 0x061a, 0x0625, 0x0633, 0x063e, 0x064e, 0x065c, 0x066a, 0x0678, 0x0686, 0x068f, 0x069d, 0x06a8, 0x06b6, 0x06c4, 0x06d4, 0x06e2, 0x06f0, 0x06fe, 0x0709, 0x070f, 0x071a, 0x072a, 0x0735, 0x074a, 0x0769, 0x0788, 0x07a2, 0x07c1, 0x07db, 0x07f5, 0x080f, 0x0829, 0x0843, 0x085d, 0x0877, 0x0896, 0x08a6, 0x08c0, 0x08da, 0x08f4, 0x090e, 0x0923, 0x0940, 0x095d, 0x097c, 0x099b, 0x09b3, 0x09cb, 0x09e3, 0x09fb, 0x0a13, 0x0a2b, 0x0a43, 0x0a5b, 0x0a73, 0x0a8b, 0x0aa3, 0x0abd, 0x0ada, 0x0af7, 0x0b0c, 0x0b26, 0x0b40, 0x0b5a, 0x0b74, 0x0b8c, 0x0b97, 0x0ba0, 0x0ba9, 0x0bb7, 0x0bc5, 0x0bd3, 0x0be1, 0x0bef, 0x0bfd, 0x0c0b, 0x0c19, 0x0c27, 0x0c35, 0x0c43, 0x0c4e, 0x0c57, 0x0c60, 0x0c6e, 0x0c7e, 0x0c8e, 0x0ca8, 0x0cc2, 0x0cdc, 0x0cf6, 0x0d10, 0x0d2a, 0x0d44, 0x0d5e, 0x0d78, 0x0d92, 0x0dac, 0x0dc6, 0x0de0, 0x0dfa, 0x0e14, 0x0e2e, 0x0e46, 0x0e56, 0x0e66, 0x0e76, 0x0e86, 0x0e96, 0x0ea6, 0x0eb6, 0x0ec6, 0x0ed6, 0x0ee6, 0x0ef6, 0x0f06, 0x0f16, 0x0f26, 0x0f36, 0x0f46, 0x0f56, 0x0f66, 0x0f76, 0x0f86, 0x0f96, 0x0fa6, 0x0fb6, 0x0fc6, 0x0fd6, 0x0fe6, 0x0ff6, 0x1006, 0x1016, 0x1026, 0x1036, 0x1046, 0x1056, 0x1066, 0x1076, 0x1086, 0x1096, 0x10a6, 0x10b6, 0x10c6, 0x10d6, 0x10e6, 0x10f6, 0x1106, 0x1116, 0x1126, 0x1136, +}; \ No newline at end of file diff --git a/hmap.h b/hmap.h new file mode 100755 index 000000000..a356fd205 --- /dev/null +++ b/hmap.h @@ -0,0 +1,21 @@ +/** + * Powder Toy - Heatmap Data + * + * Copyright (c) 2010 Simon Robertshaw + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ +unsigned char color_data[] = {0xD9,0xFF,0xFE,0xD4,0xFB,0xFC,0xCF,0xF6,0xF9,0xC9,0xF1,0xF6,0xC2,0xEB,0xF4,0xBB,0xE5,0xF0,0xB3,0xDE,0xED,0xAA,0xD6,0xE9,0xA1,0xCF,0xE5,0x98,0xC7,0xE2,0x8E,0xBF,0xDD,0x85,0xB6,0xD9,0x7B,0xAD,0xD5,0x71,0xA5,0xD0,0x67,0x9C,0xCC,0x5D,0x93,0xC7,0x53,0x8A,0xC3,0x4A,0x82,0xBE,0x41,0x79,0xB9,0x38,0x71,0xB5,0x30,0x69,0xB0,0x28,0x61,0xAC,0x21,0x5A,0xA8,0x1B,0x53,0xA3,0x16,0x4D,0x9F,0x12,0x47,0x9B,0x0F,0x42,0x98,0x0F,0x3D,0x94,0x0F,0x39,0x90,0x0F,0x34,0x8C,0x0F,0x30,0x89,0x0F,0x2C,0x85,0x0F,0x28,0x81,0x0F,0x24,0x7D,0x0F,0x20,0x7A,0x0F,0x1D,0x76,0x0F,0x1A,0x72,0x0F,0x16,0x6F,0x0F,0x13,0x6B,0x0F,0x11,0x67,0x10,0x0E,0x64,0x12,0x0C,0x60,0x15,0x0A,0x5D,0x18,0x08,0x59,0x1B,0x06,0x56,0x1D,0x04,0x53,0x20,0x03,0x4F,0x23,0x02,0x4C,0x26,0x01,0x49,0x29,0x01,0x46,0x2C,0x00,0x43,0x2F,0x00,0x40,0x30,0x00,0x3F,0x31,0x00,0x3F,0x31,0x00,0x3E,0x32,0x00,0x3E,0x32,0x00,0x3D,0x33,0x00,0x3D,0x33,0x00,0x3C,0x34,0x00,0x3C,0x34,0x00,0x3B,0x35,0x01,0x3B,0x36,0x01,0x3B,0x36,0x01,0x3A,0x37,0x01,0x3A,0x37,0x01,0x39,0x38,0x01,0x39,0x39,0x01,0x38,0x39,0x02,0x38,0x3A,0x02,0x37,0x3B,0x02,0x37,0x3B,0x02,0x36,0x3C,0x02,0x36,0x3C,0x03,0x35,0x3D,0x03,0x35,0x3E,0x03,0x34,0x3F,0x03,0x34,0x3F,0x04,0x34,0x40,0x04,0x33,0x41,0x04,0x33,0x41,0x04,0x32,0x42,0x05,0x32,0x43,0x05,0x31,0x43,0x05,0x31,0x44,0x06,0x30,0x45,0x06,0x30,0x46,0x06,0x30,0x46,0x07,0x2F,0x47,0x07,0x2F,0x48,0x08,0x2E,0x49,0x08,0x2E,0x49,0x08,0x2E,0x4A,0x09,0x2D,0x4B,0x09,0x2D,0x4C,0x09,0x2C,0x4C,0x0A,0x2C,0x4D,0x0A,0x2B,0x4E,0x0B,0x2B,0x4F,0x0B,0x2B,0x4F,0x0C,0x2A,0x50,0x0C,0x2A,0x51,0x0D,0x29,0x52,0x0D,0x29,0x53,0x0D,0x29,0x53,0x0E,0x28,0x54,0x0E,0x28,0x55,0x0F,0x27,0x56,0x0F,0x27,0x57,0x10,0x27,0x58,0x10,0x26,0x58,0x11,0x26,0x59,0x11,0x26,0x5A,0x12,0x25,0x5B,0x13,0x25,0x5C,0x13,0x24,0x5D,0x14,0x24,0x5D,0x14,0x24,0x5E,0x15,0x23,0x5F,0x15,0x23,0x60,0x16,0x23,0x61,0x16,0x22,0x62,0x17,0x22,0x62,0x18,0x22,0x63,0x18,0x21,0x64,0x19,0x21,0x65,0x19,0x21,0x66,0x1A,0x20,0x67,0x1B,0x20,0x67,0x1B,0x20,0x68,0x1C,0x1F,0x69,0x1C,0x1F,0x6A,0x1D,0x1F,0x6B,0x1E,0x1E,0x6C,0x1E,0x1E,0x6D,0x1F,0x1E,0x6D,0x1F,0x1D,0x6E,0x20,0x1D,0x6F,0x21,0x1D,0x70,0x21,0x1C,0x71,0x22,0x1C,0x72,0x23,0x1C,0x73,0x23,0x1B,0x73,0x24,0x1B,0x74,0x25,0x1B,0x75,0x25,0x1A,0x76,0x26,0x1A,0x77,0x27,0x1A,0x78,0x27,0x1A,0x78,0x28,0x19,0x79,0x29,0x19,0x7A,0x29,0x19,0x7B,0x2A,0x18,0x7C,0x2B,0x18,0x7D,0x2B,0x18,0x7E,0x2C,0x18,0x7E,0x2D,0x17,0x7F,0x2D,0x17,0x80,0x2E,0x17,0x81,0x2F,0x16,0x82,0x2F,0x16,0x82,0x30,0x16,0x83,0x31,0x16,0x84,0x31,0x15,0x85,0x32,0x15,0x86,0x33,0x15,0x87,0x33,0x15,0x87,0x34,0x14,0x88,0x35,0x14,0x89,0x36,0x14,0x8A,0x36,0x14,0x8A,0x37,0x13,0x8B,0x38,0x13,0x8C,0x38,0x13,0x8D,0x39,0x13,0x8E,0x3A,0x13,0x8E,0x3A,0x12,0x8F,0x3B,0x12,0x90,0x3C,0x12,0x91,0x3C,0x12,0x91,0x3D,0x11,0x92,0x3E,0x11,0x93,0x3E,0x11,0x94,0x3F,0x11,0x94,0x40,0x11,0x95,0x40,0x10,0x96,0x41,0x10,0x97,0x42,0x10,0x97,0x42,0x10,0x98,0x43,0x10,0x99,0x44,0x0F,0x99,0x44,0x0F,0x9A,0x45,0x0F,0x9A,0x45,0x0F,0x9B,0x46,0x0F,0x9C,0x47,0x0F,0x9C,0x47,0x0E,0x9D,0x48,0x0E,0x9D,0x48,0x0E,0x9E,0x49,0x0E,0x9E,0x49,0x0E,0x9F,0x4A,0x0D,0xA0,0x4B,0x0D,0xA0,0x4B,0x0D,0xA1,0x4C,0x0D,0xA1,0x4C,0x0D,0xA2,0x4D,0x0C,0xA2,0x4E,0x0C,0xA3,0x4E,0x0C,0xA4,0x4F,0x0C,0xA4,0x4F,0x0C,0xA5,0x50,0x0C,0xA5,0x51,0x0C,0xA6,0x51,0x0C,0xA7,0x52,0x0C,0xA7,0x53,0x0C,0xA8,0x53,0x0C,0xA8,0x54,0x0C,0xA9,0x55,0x0C,0xAA,0x55,0x0C,0xAA,0x56,0x0C,0xAB,0x57,0x0C,0xAB,0x57,0x0C,0xAC,0x58,0x0C,0xAC,0x59,0x0C,0xAD,0x59,0x0C,0xAE,0x5A,0x0C,0xAE,0x5B,0x0C,0xAF,0x5B,0x0C,0xAF,0x5C,0x0C,0xB0,0x5D,0x0C,0xB1,0x5D,0x0C,0xB1,0x5E,0x0C,0xB2,0x5F,0x0C,0xB2,0x5F,0x0C,0xB3,0x60,0x0C,0xB4,0x61,0x0C,0xB4,0x61,0x0C,0xB5,0x62,0x0C,0xB5,0x63,0x0C,0xB6,0x64,0x0C,0xB6,0x64,0x0C,0xB7,0x65,0x0C,0xB8,0x66,0x0C,0xB8,0x66,0x0C,0xB9,0x67,0x0C,0xB9,0x68,0x0C,0xBA,0x69,0x0C,0xBB,0x69,0x0C,0xBB,0x6A,0x0C,0xBC,0x6B,0x0C,0xBC,0x6B,0x0C,0xBD,0x6C,0x0C,0xBD,0x6D,0x0C,0xBE,0x6E,0x0C,0xBF,0x6E,0x0C,0xBF,0x6F,0x0C,0xC0,0x70,0x0C,0xC0,0x71,0x0C,0xC1,0x71,0x0C,0xC2,0x72,0x0C,0xC2,0x73,0x0C,0xC3,0x74,0x0C,0xC3,0x74,0x0C,0xC4,0x75,0x0C,0xC4,0x76,0x0C,0xC5,0x76,0x0C,0xC5,0x77,0x0C,0xC6,0x78,0x0C,0xC7,0x79,0x0C,0xC7,0x79,0x0C,0xC8,0x7A,0x0C,0xC8,0x7B,0x0C,0xC9,0x7C,0x0C,0xC9,0x7C,0x0C,0xCA,0x7D,0x0C,0xCB,0x7E,0x0C,0xCB,0x7F,0x0C,0xCC,0x7F,0x0C,0xCC,0x80,0x0C,0xCD,0x81,0x0C,0xCD,0x82,0x0C,0xCE,0x82,0x0C,0xCE,0x83,0x0C,0xCF,0x84,0x0C,0xCF,0x85,0x0C,0xD0,0x85,0x0C,0xD0,0x86,0x0C,0xD1,0x87,0x0C,0xD2,0x88,0x0C,0xD2,0x88,0x0C,0xD3,0x89,0x0C,0xD3,0x8A,0x0C,0xD4,0x8B,0x0C,0xD4,0x8B,0x0C,0xD5,0x8C,0x0C,0xD5,0x8D,0x0C,0xD6,0x8D,0x0C,0xD6,0x8E,0x0C,0xD7,0x8F,0x0C,0xD7,0x90,0x0C,0xD8,0x90,0x0C,0xD8,0x91,0x0C,0xD9,0x92,0x0C,0xD9,0x93,0x0C,0xDA,0x93,0x0C,0xDA,0x94,0x0C,0xDB,0x95,0x0C,0xDB,0x95,0x0C,0xDC,0x96,0x0C,0xDC,0x97,0x0C,0xDD,0x98,0x0C,0xDD,0x98,0x0C,0xDE,0x99,0x0C,0xDE,0x9A,0x0C,0xDE,0x9A,0x0C,0xDF,0x9B,0x0C,0xDF,0x9C,0x0C,0xE0,0x9D,0x0C,0xE0,0x9D,0x0C,0xE1,0x9E,0x0C,0xE1,0x9F,0x0C,0xE2,0x9F,0x0C,0xE2,0xA0,0x0C,0xE3,0xA1,0x0C,0xE3,0xA1,0x0C,0xE3,0xA2,0x0C,0xE4,0xA3,0x0C,0xE4,0xA3,0x0C,0xE5,0xA4,0x0C,0xE5,0xA5,0x0C,0xE5,0xA5,0x0C,0xE6,0xA6,0x0C,0xE6,0xA7,0x0C,0xE7,0xA7,0x0C,0xE7,0xA8,0x0C,0xE8,0xA9,0x0C,0xE8,0xA9,0x0C,0xE8,0xAA,0x0C,0xE9,0xAB,0x0C,0xE9,0xAB,0x0C,0xE9,0xAC,0x0C,0xEA,0xAC,0x0C,0xEA,0xAD,0x0C,0xEB,0xAE,0x0C,0xEB,0xAE,0x0C,0xEB,0xAF,0x0C,0xEC,0xB0,0x0C,0xEC,0xB0,0x0C,0xEC,0xB1,0x0C,0xED,0xB1,0x0C,0xED,0xB2,0x0C,0xED,0xB3,0x0C,0xEE,0xB3,0x0C,0xEE,0xB4,0x0C,0xEE,0xB4,0x0C,0xEF,0xB5,0x0C,0xEF,0xB5,0x0C,0xEF,0xB6,0x0C,0xF0,0xB7,0x0C,0xF0,0xB7,0x0C,0xF0,0xB8,0x0D,0xF1,0xB8,0x0E,0xF1,0xB9,0x0F,0xF1,0xBA,0x10,0xF1,0xBA,0x11,0xF2,0xBB,0x12,0xF2,0xBB,0x13,0xF2,0xBC,0x14,0xF3,0xBD,0x15,0xF3,0xBD,0x16,0xF3,0xBE,0x17,0xF3,0xBE,0x18,0xF4,0xBF,0x19,0xF4,0xC0,0x1B,0xF4,0xC0,0x1C,0xF4,0xC1,0x1D,0xF5,0xC1,0x1E,0xF5,0xC2,0x1F,0xF5,0xC3,0x21,0xF5,0xC3,0x22,0xF6,0xC4,0x23,0xF6,0xC4,0x25,0xF6,0xC5,0x26,0xF6,0xC6,0x28,0xF7,0xC6,0x29,0xF7,0xC7,0x2A,0xF7,0xC7,0x2C,0xF7,0xC8,0x2D,0xF7,0xC8,0x2F,0xF8,0xC9,0x31,0xF8,0xCA,0x32,0xF8,0xCA,0x34,0xF8,0xCB,0x35,0xF8,0xCB,0x37,0xF8,0xCC,0x38,0xF9,0xCC,0x3A,0xF9,0xCD,0x3C,0xF9,0xCE,0x3D,0xF9,0xCE,0x3F,0xF9,0xCF,0x41,0xF9,0xCF,0x43,0xFA,0xD0,0x44,0xFA,0xD0,0x46,0xFA,0xD1,0x48,0xFA,0xD2,0x4A,0xFA,0xD2,0x4B,0xFA,0xD3,0x4D,0xFA,0xD3,0x4F,0xFA,0xD4,0x51,0xFB,0xD4,0x53,0xFB,0xD5,0x54,0xFB,0xD5,0x56,0xFB,0xD6,0x58,0xFB,0xD7,0x5A,0xFB,0xD7,0x5C,0xFB,0xD8,0x5E,0xFB,0xD8,0x60,0xFB,0xD9,0x62,0xFC,0xD9,0x64,0xFC,0xDA,0x65,0xFC,0xDA,0x67,0xFC,0xDB,0x69,0xFC,0xDB,0x6B,0xFC,0xDC,0x6D,0xFC,0xDC,0x6F,0xFC,0xDD,0x71,0xFC,0xDD,0x73,0xFC,0xDE,0x75,0xFC,0xDE,0x77,0xFC,0xDF,0x79,0xFC,0xDF,0x7B,0xFD,0xE0,0x7D,0xFD,0xE0,0x7F,0xFD,0xE1,0x81,0xFD,0xE1,0x83,0xFD,0xE2,0x85,0xFD,0xE2,0x87,0xFD,0xE3,0x89,0xFD,0xE3,0x8B,0xFD,0xE4,0x8D,0xFD,0xE4,0x8F,0xFD,0xE5,0x91,0xFD,0xE5,0x93,0xFD,0xE6,0x95,0xFD,0xE6,0x97,0xFD,0xE7,0x99,0xFD,0xE7,0x9B,0xFD,0xE8,0x9C,0xFD,0xE8,0x9E,0xFD,0xE9,0xA0,0xFD,0xE9,0xA2,0xFD,0xEA,0xA4,0xFD,0xEA,0xA6,0xFD,0xEA,0xA8,0xFE,0xEB,0xAA,0xFE,0xEB,0xAC,0xFE,0xEC,0xAE,0xFE,0xEC,0xB0,0xFE,0xED,0xB2,0xFE,0xED,0xB3,0xFE,0xED,0xB5,0xFE,0xEE,0xB7,0xFE,0xEE,0xB9,0xFE,0xEF,0xBB,0xFE,0xEF,0xBD,0xFE,0xF0,0xBE,0xFE,0xF0,0xC0,0xFE,0xF0,0xC2,0xFE,0xF1,0xC4,0xFE,0xF1,0xC6,0xFE,0xF2,0xC7,0xFE,0xF2,0xC9,0xFE,0xF2,0xCB,0xFE,0xF3,0xCD,0xFE,0xF3,0xCE,0xFE,0xF4,0xD0,0xFE,0xF4,0xD2,0xFE,0xF4,0xD3,0xFE,0xF5,0xD5,0xFE,0xF5,0xD6,0xFE,0xF5,0xD8,0xFE,0xF6,0xDA,0xFE,0xF6,0xDB,0xFE,0xF6,0xDD,0xFE,0xF7,0xDE,0xFE,0xF7,0xE0,0xFE,0xF7,0xE1,0xFE,0xF8,0xE3,0xFE,0xF8,0xE4,0xFE,0xF8,0xE5,0xFE,0xF9,0xE7,0xFE,0xF9,0xE8,0xFE,0xF9,0xE9,0xFE,0xFA,0xEB,0xFE,0xFA,0xEC,0xFE,0xFA,0xED,0xFE,0xFB,0xEF,0xFE,0xFB,0xF0,0xFE,0xFB,0xF1,0xFE,0xFC,0xF2,0xFF,0xFC,0xF3,0xFF,0xFC,0xF5,0xFF,0xFC,0xF6,0xFF,0xFD,0xF7,0xFF,0xFD,0xF8,0xFF,0xFD,0xF9,0xFF,0xFE,0xFA,0xFF,0xFE,0xFB,0xFF,0xFE,0xFC,0xFF,0xFE,0xFC,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE}; +unsigned char plasma_data[] = {0x00,0x00,0x00,0x03,0x00,0x00,0x05,0x00,0x00,0x09,0x00,0x00,0x0E,0x00,0x00,0x12,0x00,0x00,0x17,0x00,0x00,0x1C,0x00,0x00,0x22,0x00,0x00,0x27,0x00,0x00,0x2C,0x00,0x00,0x32,0x00,0x00,0x37,0x00,0x00,0x3C,0x00,0x00,0x41,0x00,0x00,0x45,0x00,0x00,0x4A,0x00,0x00,0x4D,0x00,0x00,0x51,0x00,0x00,0x53,0x00,0x00,0x55,0x00,0x00,0x55,0x00,0x02,0x55,0x02,0x03,0x55,0x03,0x06,0x55,0x03,0x07,0x55,0x05,0x09,0x55,0x06,0x0C,0x55,0x06,0x0F,0x55,0x07,0x10,0x55,0x09,0x13,0x55,0x0A,0x16,0x55,0x0C,0x1A,0x55,0x0C,0x1D,0x54,0x0E,0x20,0x53,0x10,0x23,0x54,0x11,0x26,0x53,0x13,0x2A,0x52,0x14,0x2E,0x51,0x15,0x31,0x50,0x17,0x35,0x50,0x19,0x38,0x4E,0x1A,0x3D,0x4D,0x1C,0x40,0x4D,0x1D,0x44,0x4C,0x1F,0x47,0x4B,0x21,0x4C,0x4A,0x23,0x4F,0x49,0x24,0x54,0x48,0x25,0x57,0x47,0x28,0x5B,0x46,0x29,0x5F,0x45,0x2B,0x62,0x44,0x2D,0x66,0x44,0x2E,0x6A,0x43,0x30,0x6E,0x42,0x32,0x72,0x41,0x33,0x76,0x40,0x35,0x79,0x3F,0x38,0x7C,0x3F,0x39,0x7F,0x3E,0x3B,0x83,0x3D,0x3D,0x86,0x3C,0x3F,0x8A,0x3B,0x40,0x8C,0x3B,0x43,0x8F,0x3B,0x44,0x92,0x3A,0x46,0x95,0x39,0x48,0x98,0x39,0x4A,0x9B,0x39,0x4C,0x9C,0x39,0x4E,0x9F,0x3A,0x4F,0xA1,0x39,0x51,0xA3,0x39,0x52,0xA4,0x39,0x54,0xA6,0x39,0x56,0xA7,0x39,0x57,0xA8,0x39,0x58,0xA8,0x3A,0x5A,0xA9,0x3A,0x5C,0xA8,0x3A,0x5D,0xA8,0x3B,0x5F,0xA8,0x3C,0x61,0xA8,0x3D,0x62,0xA8,0x3D,0x64,0xA9,0x3E,0x66,0xA8,0x3E,0x67,0xA9,0x3F,0x68,0xA8,0x40,0x6A,0xA8,0x41,0x6C,0xA8,0x42,0x6E,0xA8,0x42,0x70,0xA8,0x43,0x71,0xA8,0x44,0x73,0xA8,0x45,0x74,0xA9,0x46,0x76,0xA8,0x48,0x79,0xA8,0x49,0x7A,0xA7,0x4A,0x7C,0xA6,0x4A,0x7D,0xA5,0x4C,0x7F,0xA4,0x4D,0x81,0xA3,0x4E,0x83,0xA2,0x4E,0x85,0xA1,0x50,0x86,0xA0,0x51,0x88,0x9F,0x52,0x8A,0x9D,0x53,0x8B,0x9D,0x55,0x8D,0x9B,0x56,0x8F,0x9A,0x57,0x91,0x98,0x58,0x92,0x98,0x5A,0x94,0x97,0x5B,0x96,0x95,0x5C,0x97,0x94,0x5E,0x99,0x93,0x5F,0x9A,0x91,0x60,0x9C,0x90,0x61,0x9D,0x90,0x62,0x9F,0x8E,0x64,0xA1,0x8D,0x65,0xA2,0x8C,0x67,0xA3,0x8B,0x68,0xA5,0x8A,0x6A,0xA6,0x89,0x6A,0xA7,0x88,0x6B,0xA9,0x87,0x6D,0xAB,0x86,0x6E,0xAB,0x86,0x6F,0xAE,0x85,0x71,0xAE,0x85,0x72,0xAF,0x85,0x73,0xB0,0x84,0x75,0xB2,0x83,0x75,0xB2,0x83,0x77,0xB4,0x83,0x77,0xB5,0x83,0x79,0xB6,0x83,0x7A,0xB6,0x83,0x7B,0xB8,0x83,0x7D,0xB9,0x84,0x7E,0xB9,0x83,0x7F,0xBA,0x84,0x7F,0xBB,0x85,0x82,0xBC,0x85,0x83,0xBD,0x86,0x84,0xBD,0x87,0x85,0xBD,0x87,0x86,0xBE,0x88,0x88,0xBF,0x88,0x89,0xBF,0x89,0x8A,0xC0,0x8B,0x8B,0xC0,0x8C,0x8D,0xC1,0x8D,0x8F,0xC1,0x8E,0x90,0xC2,0x8F,0x91,0xC1,0x90,0x92,0xC2,0x91,0x94,0xC3,0x93,0x95,0xC3,0x93,0x97,0xC3,0x95,0x98,0xC3,0x96,0x99,0xC3,0x98,0x9B,0xC4,0x99,0x9C,0xC3,0x9A,0x9E,0xC4,0x9B,0x9F,0xC4,0x9D,0xA0,0xC4,0x9E,0xA2,0xC4,0x9F,0xA4,0xC4,0xA0,0xA5,0xC4,0xA2,0xA6,0xC4,0xA4,0xA8,0xC4,0xA5,0xA9,0xC5,0xA6,0xAA,0xC5,0xA8,0xAB,0xC4,0xA9,0xAC,0xC4,0xAA,0xAE,0xC4,0xAC,0xAF,0xC4,0xAD,0xB0,0xC4,0xAE,0xB2,0xC4,0xB0,0xB3,0xC4,0xB1,0xB4,0xC4,0xB3,0xB5,0xC5,0xB4,0xB6,0xC4,0xB6,0xB7,0xC4,0xB7,0xB8,0xC4,0xB7,0xBA,0xC4,0xB9,0xBA,0xC4,0xBA,0xBC,0xC4,0xBB,0xBC,0xC4,0xBC,0xBE,0xC4,0xBD,0xBF,0xC4,0xBE,0xBF,0xC4,0xBF,0xC0,0xC4,0xC0,0xC1,0xC4,0xC1,0xC2,0xC4,0xC2,0xC2,0xC4,0xC3,0xC4,0xC4,0xC3,0xC4,0xC4,0xC4}; \ No newline at end of file diff --git a/http.c b/http.c new file mode 100755 index 000000000..74bafa29c --- /dev/null +++ b/http.c @@ -0,0 +1,913 @@ +/** + * Powder Toy - HTTP Library + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + + +#include +#include +#include +#ifndef MACOSX +#include +#endif +#include +#ifdef WIN32 +#define _WIN32_WINNT 0x0501 +//#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +#include +#endif + +#include "version.h" +#include "http.h" +#include "md5.h" + +#ifdef WIN32 +#define PERROR SOCKET_ERROR +#define PERRNO WSAGetLastError() +#define PEAGAIN WSAEWOULDBLOCK +#define PEINTR WSAEINTR +#define PEINPROGRESS WSAEINPROGRESS +#define PEALREADY WSAEALREADY +#define PCLOSE closesocket +#else +#define PERROR -1 +#define PERRNO errno +#define PEAGAIN EAGAIN +#define PEINTR EINTR +#define PEINPROGRESS EINPROGRESS +#define PEALREADY EALREADY +#define PCLOSE close +#endif + +static int http_up = 0; +static long http_timeout = 15; +static int http_use_proxy = 0; +static struct sockaddr_in http_proxy; + +static char *mystrdup(char *s) +{ + char *x; + if(s) { + x = malloc(strlen(s)+1); + strcpy(x, s); + return x; + } + return s; +} + +static int splituri(char *uri, char **host, char **path) +{ + char *p=uri,*q,*x,*y; + if(!strncmp(p, "http://", 7)) + p += 7; + q = strchr(p, '/'); + if(!q) + q = p + strlen(p); + x = malloc(q-p+1); + if(*q) + y = mystrdup(q); + else + y = mystrdup("/"); + strncpy(x, p, q-p); + x[q-p] = 0; + if(q==p || x[q-p-1]==':') { + free(x); + free(y); + return 1; + } + *host = x; + *path = y; + return 0; +} + +static char *getserv(char *host) +{ + char *q, *x = mystrdup(host); + q = strchr(x, ':'); + if(q) + *q = 0; + return x; +} + +static char *getport(char *host) +{ + char *p, *q; + q = strchr(host, ':'); + if(q) + p = mystrdup(q+1); + else + p = mystrdup("80"); + return p; +} + +static int resolve(char *dns, char *srv, struct sockaddr_in *addr) +{ + struct addrinfo hnt, *res = 0; + if(http_use_proxy) { + memcpy(addr, &http_proxy, sizeof(struct sockaddr_in)); + return 0; + } + memset(&hnt, 0, sizeof(hnt)); + hnt.ai_family = AF_INET; + hnt.ai_socktype = SOCK_STREAM; + if(getaddrinfo(dns, srv, &hnt, &res)) + return 1; + if(res) { + if(res->ai_family != AF_INET) { + freeaddrinfo(res); + return 1; + } + memcpy(addr, res->ai_addr, res->ai_addrlen); + freeaddrinfo(res); + return 0; + } + return 1; +} + +void http_init(char *proxy) +{ + char *host, *port; +#ifdef WIN32 + WSADATA wsadata; + if(!WSAStartup(MAKEWORD(2,2), &wsadata)) + http_up = 1; +#else + signal(SIGPIPE, SIG_IGN); + http_up = 1; +#endif + if(proxy) { + host = getserv(proxy); + port = getport(proxy); + if(resolve(host, port, &http_proxy)) + http_up = 0; + else + http_use_proxy = 1; + free(host); + free(port); + } +} + +void http_done(void) +{ +#ifdef WIN32 + WSACleanup(); +#endif + http_up = 0; +} + +#define CHUNK 4096 + +#define HTS_STRT 0 +#define HTS_RSLV 1 +#define HTS_CONN 2 +#define HTS_IDLE 3 +#define HTS_XMIT 4 +#define HTS_RECV 5 +#define HTS_DONE 6 +struct http_ctx { + int state; + time_t last; + int keep; + int ret; + char *host, *path; + char *thdr; + int thlen; + char *txd; + int txdl; + struct sockaddr_in addr; + char *tbuf; + int tlen, tptr; + char *hbuf; + int hlen, hptr; + char *rbuf; + int rlen, rptr; + int chunked, chunkhdr, rxtogo, contlen, cclose; + int fd; + char *fdhost; +}; +void *http_async_req_start(void *ctx, char *uri, char *data, int dlen, int keep) +{ + struct http_ctx *cx = ctx; + if(!ctx) { + ctx = calloc(1, sizeof(struct http_ctx)); + cx = ctx; + cx->fd = PERROR; + } + + if(!cx->hbuf) { + cx->hbuf = malloc(256); + cx->hlen = 256; + } + + if(!http_up) { + cx->ret = 604; + cx->state = HTS_DONE; + return ctx; + } + + if(cx->state!=HTS_STRT && cx->state!=HTS_IDLE) { + fprintf(stderr, "HTTP: unclean request restart state.\n"); + exit(1); + } + + cx->keep = keep; + cx->ret = 600; + if(splituri(uri, &cx->host, &cx->path)) { + cx->ret = 601; + cx->state = HTS_DONE; + return ctx; + } + if(http_use_proxy) { + free(cx->path); + cx->path = mystrdup(uri); + } + if(cx->fdhost && strcmp(cx->host, cx->fdhost)) { + free(cx->fdhost); + cx->fdhost = NULL; + PCLOSE(cx->fd); + cx->fd = PERROR; + cx->state = HTS_STRT; + } + if(data) { + if(!dlen) + dlen = strlen(data); + cx->txd = malloc(dlen); + memcpy(cx->txd, data, dlen); + cx->txdl = dlen; + } else + cx->txdl = 0; + + cx->contlen = 0; + cx->chunked = 0; + cx->chunkhdr = 0; + cx->rxtogo = 0; + cx->cclose = 0; + + cx->tptr = 0; + cx->tlen = 0; + + cx->last = time(NULL); + + return ctx; +} + +void http_async_add_header(void *ctx, char *name, char *data) +{ + struct http_ctx *cx = ctx; + cx->thdr = realloc(cx->thdr, cx->thlen + strlen(name) + strlen(data) + 4); + cx->thlen += sprintf(cx->thdr+cx->thlen, "%s: %s\n", name, data); +} + +static void process_header(struct http_ctx *cx, char *str) +{ + char *p; + if(cx->chunkhdr) { + p = strchr(str, ';'); + if(p) + *p = 0; + cx->rxtogo = strtoul(str, NULL, 16); + cx->chunkhdr = 0; + if(!cx->rxtogo) + cx->chunked = 0; + } + if(!str[0]) { + cx->rxtogo = cx->contlen; + cx->chunkhdr = cx->chunked; + if(!cx->contlen && !cx->chunked && cx->ret!=100) + cx->state = HTS_DONE; + return; + } + if(!strncmp(str, "HTTP/", 5)) { + p = strchr(str, ' '); + if(!p) { + cx->ret = 603; + cx->state = HTS_DONE; + return; + } + p++; + cx->ret = atoi(p); + return; + } + if(!strncmp(str, "Content-Length: ", 16)) { + cx->contlen = atoi(str+16); + return; + } + if(!strcmp(str, "Transfer-Encoding: chunked")) { + cx->chunked = 1; + return; + } + if(!strcmp(str, "Connection: close")) { + cx->cclose = 1; + return; + } +} + +static void process_byte(struct http_ctx *cx, char ch) +{ + if(cx->rxtogo) { + cx->rxtogo--; + + if(!cx->rbuf) { + cx->rbuf = malloc(256); + cx->rlen = 256; + } + if(cx->rptr >= cx->rlen-1) { + cx->rlen *= 2; + cx->rbuf = realloc(cx->rbuf, cx->rlen); + } + cx->rbuf[cx->rptr++] = ch; + + if(!cx->rxtogo && !cx->chunked) + cx->state = HTS_DONE; + } else { + if(ch == '\n') { + cx->hbuf[cx->hptr] = 0; + process_header(cx, cx->hbuf); + cx->hptr = 0; + } else if(ch != '\r') { + if(cx->hptr >= cx->hlen-1) { + cx->hlen *= 2; + cx->hbuf = realloc(cx->hbuf, cx->hlen); + } + cx->hbuf[cx->hptr++] = ch; + } + } +} + +int http_async_req_status(void *ctx) +{ + struct http_ctx *cx = ctx; + char *dns,*srv,buf[CHUNK]; + int tmp, i; + time_t now = time(NULL); +#ifdef WIN32 + unsigned long tmp2; +#endif + + switch(cx->state) { + case HTS_STRT: + dns = getserv(cx->host); + srv = getport(cx->host); + if(resolve(dns, srv, &cx->addr)) { + free(dns); + free(srv); + cx->state = HTS_DONE; + cx->ret = 602; + return 1; + } + free(dns); + free(srv); + cx->state = HTS_RSLV; + return 0; + case HTS_RSLV: + cx->state = HTS_CONN; + cx->last = now; + return 0; + case HTS_CONN: + if(cx->fd == PERROR) { + cx->fd = socket(AF_INET, SOCK_STREAM, 0); + if(cx->fd == PERROR) + goto fail; + cx->fdhost = mystrdup(cx->host); +#ifdef WIN32 + tmp2 = 1; + if(ioctlsocket(cx->fd, FIONBIO, &tmp2) == SOCKET_ERROR) + goto fail; +#else + tmp = fcntl(cx->fd, F_GETFL); + if(tmp < 0) + goto fail; + if(fcntl(cx->fd, F_SETFL, tmp|O_NONBLOCK) < 0) + goto fail; +#endif + } + if(!connect(cx->fd, (struct sockaddr *)&cx->addr, sizeof(cx->addr))) + cx->state = HTS_IDLE; +#ifdef WIN32 + else if(PERRNO==WSAEISCONN) + cx->state = HTS_IDLE; +#endif +#ifdef MACOSX + else if(PERRNO==EISCONN) + cx->state = HTS_IDLE; +#endif + else if(PERRNO!=PEINPROGRESS && PERRNO!=PEALREADY +#ifdef WIN32 + && PERRNO!=PEAGAIN && PERRNO!=WSAEINVAL +#endif + ) + goto fail; + if(now-cx->last>http_timeout) + goto timeout; + return 0; + case HTS_IDLE: + if(cx->txdl) { + // generate POST + cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 121 + cx->txdl + cx->thlen); + cx->tptr = 0; + cx->tlen = 0; + cx->tlen += sprintf(cx->tbuf+cx->tlen, "POST %s HTTP/1.1\n", cx->path); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host); + if(!cx->keep) + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n"); + if(cx->thdr) { + memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen); + cx->tlen += cx->thlen; + free(cx->thdr); + cx->thdr = NULL; + cx->thlen = 0; + } + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Content-Length: %d\n", cx->txdl); +#ifdef BETA + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); +#else + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); +#endif + cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n"); + memcpy(cx->tbuf+cx->tlen, cx->txd, cx->txdl); + cx->tlen += cx->txdl; + free(cx->txd); + cx->txd = NULL; + cx->txdl = 0; + } else { + // generate GET + cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 89 + cx->thlen); + cx->tptr = 0; + cx->tlen = 0; + cx->tlen += sprintf(cx->tbuf+cx->tlen, "GET %s HTTP/1.1\n", cx->path); + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host); + if(cx->thdr) { + memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen); + cx->tlen += cx->thlen; + free(cx->thdr); + cx->thdr = NULL; + cx->thlen = 0; + } + if(!cx->keep) + cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n"); +#ifdef BETA + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); +#else + cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION); +#endif + cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n"); + } + cx->state = HTS_XMIT; + cx->last = now; + return 0; + case HTS_XMIT: + tmp = send(cx->fd, cx->tbuf+cx->tptr, cx->tlen-cx->tptr, 0); + if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR) + goto fail; + if(tmp!=PERROR) { + cx->tptr += tmp; + if(cx->tptr == cx->tlen) { + cx->tptr = 0; + cx->tlen = 0; + if(cx->tbuf) + free(cx->tbuf); + cx->state = HTS_RECV; + } + cx->last = now; + } + if(now-cx->last>http_timeout) + goto timeout; + return 0; + case HTS_RECV: + tmp = recv(cx->fd, buf, CHUNK, 0); + if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR) + goto fail; + if(tmp!=PERROR) { + for(i=0;istate == HTS_DONE) + return 1; + } + cx->last = now; + } + if(now-cx->last>http_timeout) + goto timeout; + return 0; + case HTS_DONE: + return 1; + } + return 0; + +fail: + cx->ret = 600; + cx->state = HTS_DONE; + return 1; + +timeout: + cx->ret = 605; + cx->state = HTS_DONE; + return 1; +} + +char *http_async_req_stop(void *ctx, int *ret, int *len) +{ + struct http_ctx *cx = ctx; + char *rxd; + + if(cx->state != HTS_DONE) + while(!http_async_req_status(ctx)) ; + + if(cx->host) { + free(cx->host); + cx->host = NULL; + } + if(cx->path) { + free(cx->path); + cx->path = NULL; + } + if(cx->txd) { + free(cx->txd); + cx->txd = NULL; + cx->txdl = 0; + } + if(cx->hbuf) { + free(cx->hbuf); + cx->hbuf = NULL; + } + if(cx->thdr) { + free(cx->thdr); + cx->thdr = NULL; + cx->thlen = 0; + } + + if(ret) + *ret = cx->ret; + if(len) + *len = cx->rptr; + if(cx->rbuf) + cx->rbuf[cx->rptr] = 0; + rxd = cx->rbuf; + cx->rbuf = NULL; + cx->rlen = 0; + cx->rptr = 0; + cx->contlen = 0; + + if(!cx->keep) + http_async_req_close(ctx); + else if(cx->cclose) { + PCLOSE(cx->fd); + cx->fd = PERROR; + if(cx->fdhost) { + free(cx->fdhost); + cx->fdhost = NULL; + } + cx->state = HTS_STRT; + } else + cx->state = HTS_IDLE; + + return rxd; +} + +void http_async_get_length(void *ctx, int *total, int *done) +{ + struct http_ctx *cx = ctx; + if(done) + *done = cx->rptr; + if(total) + *total = cx->contlen; +} + +void http_async_req_close(void *ctx) +{ + struct http_ctx *cx = ctx; + void *tmp; + if(cx->host) { + cx->keep = 1; + tmp = http_async_req_stop(ctx, NULL, NULL); + if(tmp) + free(tmp); + } + if(cx->fdhost) + free(cx->fdhost); + PCLOSE(cx->fd); + free(ctx); +} + +char *http_simple_get(char *uri, int *ret, int *len) +{ + void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0); + if(!ctx) { + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; + } + return http_async_req_stop(ctx, ret, len); +} +static char hex[] = "0123456789abcdef"; +void http_auth_headers(void *ctx, char *user, char *pass) +{ + char *tmp; + int i; + unsigned char hash[16]; + unsigned int m; + struct md5_context md5; + + if(user) { + http_async_add_header(ctx, "X-Auth-User", user); + if(pass) { + md5_init(&md5); + md5_update(&md5, (unsigned char *)user, strlen(user)); + md5_update(&md5, (unsigned char *)"-", 1); + m = 0; + + md5_update(&md5, (unsigned char *)pass, strlen(pass)); + md5_final(hash, &md5); + tmp = malloc(33); + for(i=0;i<16;i++) { + tmp[i*2] = hex[hash[i]>>4]; + tmp[i*2+1] = hex[hash[i]&15]; + } + tmp[32] = 0; + http_async_add_header(ctx, "X-Auth-Hash", tmp); + free(tmp); + } + } +} +char *http_auth_get(char *uri, char *user, char *pass, int *ret, int *len) +{ + void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0); + + if(!ctx) { + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; + } + return http_async_req_stop(ctx, ret, len); +} + +char *http_simple_post(char *uri, char *data, int dlen, int *ret, int *len) +{ + void *ctx = http_async_req_start(NULL, uri, data, dlen, 0); + if(!ctx) { + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; + } + return http_async_req_stop(ctx, ret, len); +} + +char *http_ret_text(int ret) +{ + switch(ret) { + case 100: return "Continue"; + case 101: return "Switching Protocols"; + case 102: return "Processing"; + + case 200: return "OK"; + case 201: return "Created"; + case 202: return "Accepted"; + case 203: return "Non-Authoritative Information"; + case 204: return "No Content"; + case 205: return "Reset Content"; + case 206: return "Partial Content"; + case 207: return "Multi-Status"; + + case 300: return "Multiple Choices"; + case 301: return "Moved Permanently"; + case 302: return "Found"; + case 303: return "See Other"; + case 304: return "Not Modified"; + case 305: return "Use Proxy"; + case 306: return "Switch Proxy"; + case 307: return "Temporary Redirect"; + + case 400: return "Bad Request"; + case 401: return "Unauthorized"; + case 402: return "Payment Required"; + case 403: return "Forbidden"; + case 404: return "Not Found"; + case 405: return "Method Not Allowed"; + case 406: return "Not Acceptable"; + case 407: return "Proxy Authentication Required"; + case 408: return "Request Timeout"; + case 409: return "Conflict"; + case 410: return "Gone"; + case 411: return "Length Required"; + case 412: return "Precondition Failed"; + case 413: return "Request Entity Too Large"; + case 414: return "Request URI Too Long"; + case 415: return "Unsupported Media Type"; + case 416: return "Requested Range Not Satisfiable"; + case 417: return "Expectation Failed"; + case 422: return "Unprocessable Entity"; + case 423: return "Locked"; + case 424: return "Failed Dependency"; + case 425: return "Unordered Collection"; + case 426: return "Upgrade Required"; + + case 500: return "Internal Server Error"; + case 501: return "Not Implemented"; + case 502: return "Bad Gateway"; + case 503: return "Service Unavailable"; + case 504: return "Gateway Timeout"; + case 505: return "HTTP Version Not Supported"; + case 506: return "Variant Also Negotiates"; + case 507: return "Insufficient Storage"; + case 509: return "Bandwidth Limit Exceeded"; + case 510: return "Not Extended"; + + case 600: return "Internal Client Error"; + case 601: return "Unsupported Protocol"; + case 602: return "Server Not Found"; + case 603: return "Malformed Response"; + case 604: return "Network Not Available"; + case 605: return "Request Timed Out"; + default: return "Unknown Status Code"; + } +} +char *http_multipart_post(char *uri, char **names, char **parts, int *plens, char *user, char *pass, int *ret, int *len) +{ + void *ctx; + char *data = NULL, *tmp, *p; + int dlen = 0, i, j; + unsigned char hash[16]; + unsigned char boundary[32], ch; + int blen = 0; + unsigned int map[62], m; + struct md5_context md5; + //struct md5_context md52; + int own_plen = 0; + + if(names) { + if(!plens) { + own_plen = 1; + for(i=0;names[i];i++) ; + plens = calloc(i, sizeof(int)); + for(i=0;names[i];i++) + plens[i] = strlen(parts[i]); + } + + retry: + if(blen >= 31) + goto fail; + memset(map, 0, 62*sizeof(int)); + for(i=0;names[i];i++) { + for(j=0;j='0' && ch<='9') + map[ch-'0']++; + else if(ch>='A' && ch<='Z') + map[ch-'A'+10]++; + else if(ch>='a' && ch<='z') + map[ch-'a'+36]++; + } + } + m = ~0; + j = 61; + for(i=0;i<62;i++) + if(map[i]>4]; + tmp[i*2+1] = hex[hash[i]&15]; + } + tmp[32] = 0; + http_async_add_header(ctx, "X-Auth-Hash", tmp); + free(tmp); + } + } + + if(data) { + tmp = malloc(32+strlen((char *)boundary)); + sprintf(tmp, "multipart/form-data, boundary=%s", boundary); + http_async_add_header(ctx, "Content-type", tmp); + free(tmp); + free(data); + } + + if(own_plen) + free(plens); + return http_async_req_stop(ctx, ret, len); + +fail: + if(data) + free(data); + if(own_plen) + free(plens); + if(ret) + *ret = 600; + if(len) + *len = 0; + return NULL; +} diff --git a/http.h b/http.h new file mode 100755 index 000000000..2ad7ccc28 --- /dev/null +++ b/http.h @@ -0,0 +1,43 @@ +/** + * Powder Toy - HTTP Library (Header) + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ +#ifndef HTTP_H +#define HTTP_H + +void http_init(char *proxy); +void http_done(void); + +char *http_simple_get(char *uri, int *ret, int *len); +char *http_auth_get(char *uri, char *user, char *pass, int *ret, int *len); +char *http_simple_post(char *uri, char *data, int dlen, int *ret, int *len); + +void http_auth_headers(void *ctx, char *user, char *pass); + +void *http_async_req_start(void *ctx, char *uri, char *data, int dlen, int keep); +void http_async_add_header(void *ctx, char *name, char *data); +int http_async_req_status(void *ctx); +void http_async_get_length(void *ctx, int *total, int *done); +char *http_async_req_stop(void *ctx, int *ret, int *len); +void http_async_req_close(void *ctx); + +char *http_multipart_post(char *uri, char **names, char **parts, int *plens, char *user, char *pass, int *ret, int *len); + +char *http_ret_text(int ret); + +#endif diff --git a/icon.h b/icon.h new file mode 100755 index 000000000..89b2c7f83 --- /dev/null +++ b/icon.h @@ -0,0 +1,22 @@ +/** + * Powder Toy - Main source + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ +static unsigned char app_icon[] = { 0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0xD3,0xD9,0xE0,0xFF,0x68,0x79,0x91,0xFF,0xD3,0xD9,0xE0,0xFF,0x68,0x79,0x91,0xFF,0xD3,0xD9,0xE0,0xFF,0x68,0x79,0x91,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x05,0x06,0x06,0xFF,0x09,0x09,0x0A,0xFF,0x2F,0x08,0x08,0xFF,0x56,0x06,0x07,0xFF,0x23,0x06,0x06,0xFF,0x85,0x02,0x06,0xFF,0xE5,0x02,0x07,0xFF,0xF2,0x1E,0x08,0xFF,0xED,0x0A,0x08,0xFF,0x60,0x07,0x08,0xFF,0x5F,0x08,0x08,0xFF,0x68,0x08,0x08,0xFF,0x18,0x07,0x08,0xFF,0x05,0x04,0x04,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xB6,0x00,0x00,0xFF,0xD3,0x00,0x00,0xFF,0xEE,0x00,0x00,0xFF,0xF9,0x00,0x00,0xFF,0x91,0x00,0x00,0xFF,0xDD,0x15,0x00,0xFF,0xFF,0x74,0x00,0xFF,0xFF,0xBF,0x00,0xFF,0xFC,0x37,0x00,0xFF,0xAE,0x00,0x00,0xFF,0xD7,0x00,0x00,0xFF,0xFA,0x00,0x00,0xFF,0xE5,0x01,0x00,0xFF,0xB3,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xF9,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE9,0x00,0x00,0xFF,0xFA,0x90,0x02,0xFF,0xFF,0xFF,0x1A,0xFF,0xFF,0xFF,0x19,0xFF,0xFF,0xA4,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xF6,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xE8,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xB7,0x2E,0xFF,0xFF,0xFF,0xA1,0xFF,0xFF,0xFF,0x8A,0xFF,0xFF,0xFA,0x3E,0xFF,0xFF,0x63,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE3,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xE4,0x00,0x00,0xFF,0xFF,0x21,0x00,0xFF,0xFF,0x61,0x00,0xFF,0xFF,0x94,0x00,0xFF,0xFF,0x8C,0x00,0xFF,0xFF,0xE1,0x5C,0xFF,0xFF,0xFF,0xCD,0xFF,0xFF,0xFF,0xAE,0xFF,0xFF,0xFF,0x6F,0xFF,0xFF,0xF9,0x1D,0xFF,0xFF,0xC3,0x00,0xFF,0xFF,0x99,0x00,0xFF,0xFF,0x48,0x00,0xFF,0xDF,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xC5,0x00,0x00,0xFF,0xFF,0x64,0x00,0xFF,0xFF,0xEF,0x09,0xFF,0xFF,0xFF,0x46,0xFF,0xFF,0xFF,0x84,0xFF,0xFF,0xFF,0xD3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBC,0xFF,0xFF,0xFF,0x86,0xFF,0xFF,0xFF,0x69,0xFF,0xFF,0xFF,0x19,0xFF,0xFF,0x81,0x00,0xFF,0xD0,0x01,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0xB1,0x00,0x00,0xFF,0xEC,0x14,0x00,0xFF,0xFF,0x90,0x13,0xFF,0xFF,0xF9,0x8E,0xFF,0xFF,0xFF,0xE6,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF,0xF2,0xC9,0xFF,0xFF,0xFA,0xBD,0xFF,0xFF,0xFF,0xA8,0xFF,0xFF,0xFC,0x9A,0xFF,0xFF,0xA4,0x2A,0xFF,0xFD,0x15,0x00,0xFF,0xEB,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x00,0x00,0x00,0xFF,0x47,0x14,0x14,0xFF,0x47,0x14,0x14,0xFF,0x00,0x00,0x00,0xFF,0x1F,0x30,0xD5,0xFF,0x1F,0x30,0xD5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x79,0x79,0x79,0xFF,0x79,0x79,0x79,0xFF,0x00,0x00,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF,0x8F,0x92,0x97,0xFF }; +static unsigned char app_icon_w32[] = { 0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x44,0x47,0x49,0x00,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x44,0x46,0x48,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x86,0x88,0x8A,0xFF,0xD8,0xDE,0xE6,0xFF,0xD1,0xD7,0xDF,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0xD1,0xD7,0xDE,0xFF,0x68,0x79,0x91,0xFF,0xD1,0xD7,0xDE,0xFF,0x68,0x79,0x91,0xFF,0xD1,0xD7,0xDE,0xFF,0x68,0x79,0x91,0xFF,0xD1,0xD7,0xDE,0xFF,0x81,0x84,0x88,0xFF,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x83,0x85,0x89,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1E,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x14,0x00,0x00,0xFF,0xE1,0x01,0x00,0xFF,0xF4,0x03,0x00,0xFF,0x24,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x86,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFF,0x05,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x36,0x01,0x00,0xFF,0x06,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1A,0x00,0x00,0xFF,0xE7,0x0A,0x01,0xFF,0xFF,0x07,0x01,0xFF,0x41,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1A,0x00,0x00,0xFF,0x16,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x0B,0x00,0x00,0xFF,0x55,0x02,0x00,0xFF,0x04,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x39,0x00,0x00,0xFF,0xF8,0x1B,0x02,0xFF,0xFF,0x2F,0x03,0xFF,0x52,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1C,0x00,0x00,0xFF,0x5C,0x01,0x00,0xFF,0x09,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x36,0x01,0x00,0xFF,0xAE,0x04,0x01,0xFF,0x02,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x50,0x00,0x00,0xFF,0xFE,0x44,0x02,0xFF,0xFF,0x5C,0x03,0xFF,0x60,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x12,0x00,0x00,0xFF,0x9F,0x02,0x00,0xFF,0x49,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x73,0x04,0x00,0xFF,0xEC,0x09,0x01,0xFF,0x2B,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x13,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x04,0x00,0x00,0xFF,0x04,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x4E,0x06,0x00,0xFF,0xFF,0xC1,0x08,0xFF,0xFD,0x9A,0x07,0xFF,0x49,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x7F,0x81,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8B,0x01,0x00,0xFF,0xD5,0x03,0x00,0xFF,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0xB7,0x0D,0x01,0xFF,0xFF,0x0F,0x02,0xFF,0xDE,0x00,0x00,0xFF,0xAB,0x00,0x00,0xFF,0xA5,0x01,0x00,0xFF,0x3D,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8B,0x35,0x03,0xFF,0xFF,0xF0,0x0E,0xFF,0xDF,0x4B,0x01,0xFF,0x14,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x55,0x00,0x00,0xFF,0xFF,0x05,0x01,0xFF,0x73,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1B,0x00,0x00,0xFF,0xE5,0x0F,0x01,0xFF,0xFF,0x0D,0x02,0xFF,0xFF,0x04,0x01,0xFF,0xFF,0x03,0x00,0xFF,0xFF,0x01,0x00,0xFF,0x8F,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1B,0x00,0x00,0xFF,0xD9,0x47,0x03,0xFF,0xFF,0x92,0x06,0xFF,0xAF,0x12,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x20,0x00,0x00,0xFF,0xE5,0x08,0x01,0xFF,0xD1,0x04,0x01,0xFF,0x0E,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x30,0x01,0x00,0xFF,0xF6,0x47,0x04,0xFF,0xFF,0x1F,0x02,0xFF,0xFF,0x03,0x01,0xFF,0xFF,0x06,0x01,0xFF,0xFF,0x03,0x00,0xFF,0xC7,0x01,0x00,0xFF,0x1F,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x06,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x38,0x02,0x00,0xFF,0xFB,0x72,0x07,0xFF,0xFF,0x5A,0x03,0xFF,0x73,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xA1,0x02,0x00,0xFF,0xFF,0x0C,0x03,0xFF,0x7B,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x3B,0x06,0x00,0xFF,0xFF,0xBB,0x0C,0xFF,0xFF,0x56,0x04,0xFF,0xFF,0x00,0x01,0xFF,0xFF,0x10,0x03,0xFF,0xFF,0x02,0x01,0xFF,0xDE,0x01,0x00,0xFF,0x34,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x05,0x01,0x00,0xFF,0x00,0x00,0x00,0xFF,0x3B,0x03,0x00,0xFF,0xFC,0x83,0x06,0xFF,0xFF,0x71,0x03,0xFF,0x83,0x05,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFB,0x18,0x03,0xFF,0xFF,0x0E,0x02,0xFF,0xB9,0x00,0x00,0xFF,0x06,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x21,0x01,0x00,0xFF,0xE8,0xB9,0x0F,0xFF,0xFF,0x8F,0x0C,0xFF,0xFF,0x02,0x00,0xFF,0xFF,0x3C,0x04,0xFF,0xFF,0x16,0x02,0xFF,0xFD,0x00,0x00,0xFF,0x63,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x40,0x0B,0x00,0xFF,0xFE,0xAD,0x06,0xFF,0xFF,0xC9,0x06,0xFF,0xCC,0x45,0x02,0xFF,0x08,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFF,0x49,0x03,0xFF,0xFF,0x7E,0x03,0xFF,0xFF,0x45,0x01,0xFF,0x67,0x05,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x09,0x00,0x00,0xFF,0xCC,0xA0,0x08,0xFF,0xFB,0xAA,0x0A,0xFF,0xC9,0x00,0x00,0xFF,0xFE,0x6B,0x03,0xFF,0xFF,0x79,0x02,0xFF,0xF9,0x0A,0x00,0xFF,0x4C,0x00,0x00,0xFF,0x02,0x00,0x00,0xFF,0x08,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x3F,0x14,0x00,0xFF,0xFC,0xDF,0x10,0xFF,0xFF,0xFF,0x10,0xFF,0xFA,0xCD,0x14,0xFF,0x46,0x0C,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFF,0x7F,0x03,0xFF,0xFF,0xFF,0x06,0xFF,0xFF,0xE7,0x03,0xFF,0xD5,0x39,0x01,0xFF,0x0E,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x1A,0x06,0x00,0xFF,0xEA,0xCF,0x17,0xFF,0xE2,0xA6,0x10,0xFF,0x32,0x00,0x00,0xFF,0xCB,0x80,0x06,0xFF,0xFF,0xF4,0x09,0xFF,0xD8,0x44,0x00,0xFF,0x10,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x44,0x21,0x00,0xFF,0xFD,0xE9,0x1C,0xFF,0xFF,0xD6,0x09,0xFF,0xFF,0xFF,0x28,0xFF,0xB4,0x75,0x04,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xFF,0x8D,0x03,0xFF,0xFF,0xFF,0x41,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0x7E,0x01,0xFF,0x4C,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x49,0x30,0x04,0xFF,0xFF,0xFC,0x5A,0xFF,0xB0,0x7E,0x14,0xFF,0x00,0x00,0x00,0xFF,0x89,0x66,0x0F,0xFF,0xFF,0xFF,0x6B,0xFF,0xE6,0xA7,0x1E,0xFF,0x1E,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x6F,0x5A,0x18,0xFF,0xFF,0xFE,0x70,0xFF,0xCD,0x6C,0x04,0xFF,0xE8,0xB5,0x27,0xFF,0xFE,0xF3,0x60,0xFF,0x6E,0x3D,0x08,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xDB,0x8A,0x26,0xFF,0xFF,0xFF,0xD5,0xFF,0xFF,0xFF,0xD8,0xFF,0xFF,0xCF,0x3A,0xFF,0x94,0x12,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x15,0x0A,0x01,0xFF,0xBF,0xAC,0x7E,0xFF,0xFF,0xFF,0xDE,0xFF,0x82,0x5F,0x20,0xFF,0x00,0x00,0x00,0xFF,0x67,0x5B,0x28,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xF1,0xAA,0xFF,0x5D,0x2E,0x07,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x18,0x0D,0x02,0xFF,0xD0,0xC0,0x90,0xFF,0xFF,0xFF,0xF4,0xFF,0x92,0x61,0x27,0xFF,0x72,0x3F,0x0F,0xFF,0xFF,0xFF,0xE2,0xFF,0xFA,0xE5,0xAE,0xFF,0x80,0x4B,0x19,0xFF,0x02,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xC9,0xA1,0x64,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xB2,0xFF,0xA1,0x33,0x03,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x96,0x7E,0x5E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7E,0x6A,0x41,0xFF,0x00,0x00,0x00,0xFF,0x7F,0x75,0x56,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA9,0x8D,0x54,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x8C,0x69,0x4F,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x93,0x82,0x58,0xFF,0x16,0x05,0x00,0xFF,0xEB,0xDB,0xB8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF2,0xBD,0xFF,0x62,0x42,0x14,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0xA3,0x7F,0x47,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xDD,0xA4,0xFF,0x51,0x19,0x02,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x04,0x00,0x00,0xFF,0xD0,0xB6,0x88,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x6A,0x5A,0x39,0xFF,0x00,0x00,0x00,0xFF,0x85,0x7D,0x4E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB4,0xA5,0x73,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0xB5,0x9B,0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8B,0x78,0x4E,0xFF,0x00,0x00,0x00,0xFF,0xCC,0xAE,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8F,0x74,0x38,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x24,0x14,0x03,0xFF,0x8C,0x7E,0x44,0xFF,0xA2,0x8E,0x5D,0xFF,0x5B,0x37,0x17,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x71,0x46,0x1E,0xFF,0xCB,0xA4,0x71,0xFF,0xAC,0x93,0x66,0xFF,0x17,0x0E,0x04,0xFF,0x00,0x00,0x00,0xFF,0x30,0x23,0x0A,0xFF,0xBF,0xA4,0x60,0xFF,0xC4,0xAC,0x78,0xFF,0x43,0x34,0x1A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x5C,0x3D,0x18,0xFF,0xC9,0xA9,0x6F,0xFF,0xB8,0x94,0x63,0xFF,0x2A,0x19,0x07,0xFF,0x00,0x00,0x00,0xFF,0x53,0x3B,0x16,0xFF,0xC7,0xB6,0x70,0xFF,0xBD,0xA2,0x66,0xFF,0x2C,0x1C,0x09,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x47,0x14,0x14,0xFF,0x47,0x14,0x14,0xFF,0x00,0x00,0x00,0xFF,0x1F,0x30,0xD6,0xFF,0x1F,0x30,0xD6,0xFF,0x00,0x00,0x00,0xFF,0xF7,0x0F,0x00,0xFF,0xF7,0x0F,0x00,0xFF,0x00,0x00,0x00,0xFF,0xC8,0x47,0x0E,0xFF,0xC8,0x47,0x0E,0xFF,0x00,0x00,0x00,0xFF,0x20,0xE6,0x0F,0xFF,0x20,0xE6,0x0F,0xFF,0x00,0x00,0x00,0xFF,0xEB,0xF5,0x22,0xFF,0xEB,0xF5,0x22,0xFF,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0xFF,0x79,0x79,0x79,0xFF,0x00,0x00,0x00,0xFF,0x79,0x79,0x79,0xFF,0x79,0x79,0x79,0xFF,0x00,0x00,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0xD7,0xF1,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x81,0x84,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x81,0x84,0x88,0xFF,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x44,0x46,0x48,0x00,0x7A,0x7D,0x81,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x83,0x86,0x8A,0xFF,0x86,0x89,0x8C,0xFF,0x89,0x8C,0x8F,0xFF,0x87,0x8A,0x8F,0xFF,0x85,0x87,0x8B,0xFF,0x82,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x81,0x84,0x88,0xFF,0x44,0x46,0x48,0x00,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x04,0x03,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00,0x03,0x05,0x04,0x00 }; \ No newline at end of file diff --git a/md5.c b/md5.c new file mode 100755 index 000000000..874d2c147 --- /dev/null +++ b/md5.c @@ -0,0 +1,224 @@ +// based on public-domain code from Colin Plumb (1993) +#include +#include "md5.h" + +static unsigned getu32(const unsigned char *addr) +{ + return (((((unsigned long)addr[3] << 8) | addr[2]) << 8) | addr[1]) << 8 | addr[0]; +} + +static void putu32(unsigned data, unsigned char *addr) +{ + addr[0] = (unsigned char)data; + addr[1] = (unsigned char)(data >> 8); + addr[2] = (unsigned char)(data >> 16); + addr[3] = (unsigned char)(data >> 24); +} + +void md5_init(struct md5_context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; +} + +void md5_update(struct md5_context *ctx, unsigned char const *buf, unsigned len) +{ + unsigned t; + + // update bit count + t = ctx->bits[0]; + if((ctx->bits[0] = (t + ((unsigned)len << 3)) & 0xffffffff) < t) + ctx->bits[1]++; // carry + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; + + // use leading data to top up the buffer + + if(t) { + unsigned char *p = ctx->in + t; + + t = 64-t; + if (len < t) { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + md5_transform(ctx->buf, ctx->in); + buf += t; + len -= t; + } + + // following 64-byte chunks + + while(len >= 64) { + memcpy(ctx->in, buf, 64); + md5_transform(ctx->buf, ctx->in); + buf += 64; + len -= 64; + } + + // save rest of bytes for later + + memcpy(ctx->in, buf, len); +} + +void md5_final(unsigned char digest[16], struct md5_context *ctx) +{ + unsigned count; + unsigned char *p; + + // #bytes mod64 + count = (ctx->bits[0] >> 3) & 0x3F; + + // first char of padding = 0x80 + p = ctx->in + count; + *p++ = 0x80; + + // calculate # of bytes to pad + count = 64 - 1 - count; + + // Pad out to 56 mod 64 + if(count < 8) { + // we need to finish a whole block before padding + memset(p, 0, count); + md5_transform(ctx->buf, ctx->in); + memset(ctx->in, 0, 56); + } else { + // just pad to 56 bytes + memset(p, 0, count-8); + } + + // append length & final transform + putu32(ctx->bits[0], ctx->in + 56); + putu32(ctx->bits[1], ctx->in + 60); + + md5_transform(ctx->buf, ctx->in); + putu32(ctx->buf[0], digest); + putu32(ctx->buf[1], digest + 4); + putu32(ctx->buf[2], digest + 8); + putu32(ctx->buf[3], digest + 12); + memset(ctx, 0, sizeof(ctx)); +} + +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w &= 0xffffffff, w = w<>(32-s), w += x ) + +void md5_transform(unsigned buf[4], const unsigned char inraw[64]) +{ + unsigned a, b, c, d; + unsigned in[16]; + int i; + + for (i = 0; i < 16; ++i) + in[i] = getu32 (inraw + 4 * i); + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[ 0]+0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[ 1]+0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[ 2]+0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[ 3]+0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[ 4]+0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[ 5]+0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[ 6]+0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[ 7]+0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[ 8]+0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[ 9]+0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10]+0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11]+0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12]+0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13]+0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14]+0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15]+0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[ 1]+0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[ 6]+0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11]+0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[ 0]+0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[ 5]+0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10]+0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15]+0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[ 4]+0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[ 9]+0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14]+0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[ 3]+0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[ 8]+0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13]+0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[ 2]+0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[ 7]+0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12]+0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[ 5]+0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[ 8]+0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11]+0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14]+0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[ 1]+0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[ 4]+0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[ 7]+0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10]+0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13]+0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[ 0]+0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[ 3]+0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[ 6]+0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[ 9]+0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12]+0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15]+0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[ 2]+0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[ 0]+0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[ 7]+0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14]+0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[ 5]+0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12]+0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[ 3]+0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10]+0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[ 1]+0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[ 8]+0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15]+0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[ 6]+0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13]+0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[ 4]+0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11]+0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[ 2]+0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[ 9]+0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + +static char hex[] = "0123456789abcdef"; +void md5_ascii(char *result, unsigned char const *buf, unsigned len) +{ + struct md5_context md5; + unsigned char hash[16]; + int i; + + if(len==0) + len = strlen((char *)buf); + + md5_init(&md5); + md5_update(&md5, buf, len); + md5_final(hash, &md5); + + for(i=0;i<16;i++) { + result[i*2] = hex[(hash[i]>>4)&0xF]; + result[i*2+1] = hex[hash[i]&0x0F]; + } + result[32] = 0; +} diff --git a/md5.h b/md5.h new file mode 100755 index 000000000..3f675d62a --- /dev/null +++ b/md5.h @@ -0,0 +1,17 @@ +#ifndef MD5_H +#define MD5_H + +struct md5_context { + unsigned buf[4]; + unsigned bits[2]; + unsigned char in[64]; +}; + +void md5_init(struct md5_context *context); +void md5_update(struct md5_context *context, unsigned char const *buf, unsigned len); +void md5_final(unsigned char digest[16], struct md5_context *context); +void md5_transform(unsigned buf[4], const unsigned char in[64]); + +void md5_ascii(char *result, unsigned char const *buf, unsigned len); + +#endif diff --git a/powder.c b/powder.c new file mode 100755 index 000000000..3102a8f70 --- /dev/null +++ b/powder.c @@ -0,0 +1,8429 @@ +/** + * Powder Toy - Main source + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * Copyright (c) 2010 Simon Robertshaw + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#ifdef OCL +#include +#endif +//#include +#ifdef MT +#include +#include +#endif + +#ifdef WIN32 +#include +#else +#include +#include +#endif + + +#include "version.h" +#include "http.h" +#include "md5.h" +#include "update.h" + +#define SERVER "powder.hardwired.org.uk" + +#undef PLOSS + +#ifdef MENUV3 +#define MENUSIZE 40 +#else +#define MENUSIZE 20 +#endif +#define BARSIZE 14 +#define XRES 612 +#define YRES 384 +#define NPART XRES*YRES + +#define ZSIZE_D 16 +#define ZFACTOR_D 8 +unsigned char ZFACTOR = 256/ZSIZE_D;//ZFACTOR_D; +unsigned char ZSIZE = ZSIZE_D; + +#define CELL 4 +#define ISTP (CELL/2) +#define CFDS (4.0f/CELL) + +typedef unsigned char uint8; + +#ifdef HEAT_ENABLE +#include "hmap.h" +#endif + +#ifdef PIX16 +#define PIXELSIZE 2 +typedef unsigned short pixel; +#define PIXPACK(x) ((((x)>>8)&0xF800)|(((x)>>5)&0x07E0)|(((x)>>3)&0x001F)) +#define PIXRGB(r,g,b) ((((r)<<8)&0xF800)|(((g)<<3)&0x07E0)|(((b)>>3)&0x001F)) +#define PIXR(x) (((x)>>8)&0xF8) +#define PIXG(x) (((x)>>3)&0xFC) +#define PIXB(x) (((x)<<3)&0xF8) +#else +#define PIXELSIZE 4 +typedef unsigned int pixel; +#ifdef PIX32BGR +#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) +#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) +#define PIXR(x) ((x)&0xFF) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)>>16) +#else +#ifdef PIX32BGRA +#define PIXPACK(x) ((((x)>>8)&0x0000FF00)|(((x)<<8)&0x00FF0000)|(((x)<<24)&0xFF000000)) +#define PIXRGB(r,g,b) (((b)<<24)|((g)<<16)|((r)<<8)) +#define PIXR(x) (((x)>>8)&0xFF) +#define PIXG(x) (((x)>>16)&0xFF) +#define PIXB(x) (((x)>>24)) +#else +#define PIXPACK(x) (x) +#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) +#define PIXR(x) ((x)>>16) +#define PIXG(x) (((x)>>8)&0xFF) +#define PIXB(x) ((x)&0xFF) +#endif +#endif +#endif + +char *it_msg = +"\brThe Powder Toy\n" +"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n" +"\n" +"\bgTo choose a material, hover over once of the icons on the right, it will show a selection of elements in that group.\n" +"\bgPick your material from the menu using mouse left/right buttons.\n" +"Draw freeform lines by dragging your mouse left/right button across the drawing area.\n" +"Shift+drag will create straight lines of particles.\n" +"Ctrl+drag will result in filled rectangles.\n" +"Ctrl+Shift+click will flood-fill a closed area.\n" +"Middle click or Alt+Click to \"sample\" the particles.\n" +"\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength\n" +"Use 'S' to save parts of the window as 'stamps'.\n" +"'L' will load the most recent stamp, 'K' shows a library of stamps you saved.\n" +"'C' will cycle the display mode (Fire, Blob, Velocity and Pressure). The numbers 1 to 6 will do the same\n" +"Use the mouse scroll wheel to change the tool size for particles.\n" +"'Q' will quit the application.\n" +"The spacebar can be used to pause physics.\n" +"'P' will take a screenshot and save it into the current directory.\n" +"\n" +"\brhttp://powder.hardwired.org.uk/\n" +"\bgCopyright (c) 2008-10 Stanislaw K Skowronek (\brhttp://powder.unaligned.org\bg, \bbirc.unaligned.org #wtf\bg)\n" +"\bgCopyright (c) 2010 Simon Robertshaw (\brhttp://powder.hardwired.org.uk\bg)\n" +"\n" +"\bgSpecial thanks to Brian Ledbetter for maintaining ports & server development in the past." +"\nand CW for hosting the original server.\n" +#ifdef WIN32 +"\nThanks to Akuryo for Windows icons.\n" +#endif +"\n" +"\bgTo use online features such as saving, you need to register at: http://powder.hardwired.org.uk/Register.html" +; + +typedef struct { + int start, inc; + pixel *vid; +} upstruc; + +#ifdef BETA +char *old_ver_msg_beta = "A new beta is available - click here!"; +#endif +char *old_ver_msg = "A new version is available - click here!"; +#ifdef HEAT_ENABLE +float mheat = 0.0f; +#endif + +int do_open = 0; +int sys_pause = 0; +int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. + +int amd = 0; + +unsigned char fire_r[YRES/CELL][XRES/CELL]; +unsigned char fire_g[YRES/CELL][XRES/CELL]; +unsigned char fire_b[YRES/CELL][XRES/CELL]; + +#define MAXSIGNS 16 + +struct sign { + int x,y,ju; + char text[256]; +} signs[MAXSIGNS]; + +/*********************************************************** + * AIR FLOW SIMULATOR * + ***********************************************************/ + +unsigned char bmap[YRES/CELL][XRES/CELL]; +unsigned char emap[YRES/CELL][XRES/CELL]; +unsigned cmode = 3; + +float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; +float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; +float pv[YRES/CELL][XRES/CELL], opv[YRES/CELL][XRES/CELL]; +float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; +#define TSTEPP 0.3f +#define TSTEPV 0.4f +#define VADV 0.3f +#define VLOSS 0.999f +#define PLOSS 0.9999f +int numCores = 1; +float kernel[9]; +void make_kernel(void) +{ + int i, j; + float s = 0.0f; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) { + kernel[(i+1)+3*(j+1)] = expf(-2.0f*(i*i+j*j)); + s += kernel[(i+1)+3*(j+1)]; + } + s = 1.0f / s; + for(j=-1; j<2; j++) + for(i=-1; i<2; i++) + kernel[(i+1)+3*(j+1)] *= s; +} + +int core_count(){ + int numCPU = 1; +#ifdef MT +#ifdef WIN32 + SYSTEM_INFO sysinfo; + GetSystemInfo( &sysinfo ); + numCPU = sysinfo.dwNumberOfProcessors; +#else +#ifdef MACOSX + numCPU = 4; +#else + numCPU = sysconf( _SC_NPROCESSORS_ONLN ); +#endif +#endif + + printf("Cpus: %d\n", numCPU); + if(numCPU>1) + printf("Multithreading enabled\n"); + else + printf("Multithreading disabled\n"); +#endif + return numCPU; +} + +void update_air(void) +{ + int x, y, i, j; + float dp, dx, dy, f, tx, ty; + + for(y=1; y0 && y+j0 && x+i=2 && i=2 && j 256.0f) dp = 256.0f; + if(dp < -256.0f) dp = -256.0f; + if(dx > 256.0f) dx = 256.0f; + if(dx < -256.0f) dx = -256.0f; + if(dy > 256.0f) dy = 256.0f; + if(dy < -256.0f) dy = -256.0f; + + ovx[y][x] = dx; + ovy[y][x] = dy; + opv[y][x] = dp; + } + memcpy(vx, ovx, sizeof(vx)); + memcpy(vy, ovy, sizeof(vy)); + memcpy(pv, opv, sizeof(pv)); +} + +void *update_air_th(void *arg) +{ + update_air(); + return NULL; +} + +unsigned clamp_flt(float f, float min, float max) +{ + if(fmax) + return 255; + return (int)(255.0f*(f-min)/(max-min)); +} + +float restrict_flt(float f, float min, float max){ + if(fmax) + return max; + return f; +} + +void draw_air(pixel *vid) +{ + int x, y, i, j; + pixel c; + + if(cmode == 2) + return; + + for(y=0; y 0.0f) + c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); + else + c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); + } else + c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), + clamp_flt(pv[y][x], 0.0f, 8.0f), + clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); + for(j=0; j=XRES || ny>=YRES) + return 0; + if(x==nx && y==ny) + return 1; + r = pmap[ny][nx]; + if(r && (r>>8)>8].type; + + if(parts[i].type==PT_PHOT&&((r&0xFF)==PT_GLAS||(r&0xFF)==PT_PHOT||(r&0xFF)==PT_CLNE)){ + return 1; + } + + if((r&0xFF)==PT_VOID){ + parts[i].type=PT_NONE; + return 0; + } + if((r&0xFF)==PT_BHOL){ + parts[i].type=PT_NONE; +#ifdef HEAT_ENABLE + if(!legacy_enable){ + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+parts[i].temp/2, MIN_TEMP, MAX_TEMP);//3.0f; + } +#endif + return 0; + } + + if(bmap[ny/CELL][nx/CELL]==12 && !emap[y/CELL][x/CELL]){ + return 1; + } + if(bmap[ny/CELL][nx/CELL]==13 && ptypes[parts[i].type].falldown!=0 && parts[i].type!=PT_FIRE){ + return 0; + } + if((bmap[y/CELL][x/CELL]==12 && !emap[y/CELL][x/CELL]) && (bmap[ny/CELL][nx/CELL]!=12 && !emap[ny/CELL][nx/CELL])){ + return 0; + } + + if(ptypes[parts[i].type].falldown!=2 && bmap[ny/CELL][nx/CELL]==3) + return 0; + if((parts[i].type==PT_NEUT ||parts[i].type==PT_PHOT) && bmap[ny/CELL][nx/CELL]==7 && !emap[ny/CELL][nx/CELL]) + return 0; + if(r && (r>>8)= PT_NUM || !can_move[parts[i].type][(r&0xFF)])) + return 0; + + if(parts[i].type==PT_CNCT && y>8)>= 8; + parts[r].x += x-nx; + parts[r].y += y-ny; + } + + return 1; +} + +void kill_part(int i) +{ + int x, y; + parts[i].type = PT_NONE; + + x = (int)(parts[i].x+0.5f); + y = (int)(parts[i].y+0.5f); + + if(x>=0 && y>=0 && x=XRES || y>=YRES) + return -1; + +#ifdef HEAT_ENABLE + if(t==SPC_HEAT||t==SPC_COOL){ + if((pmap[y][x]&0xFF)!=PT_NONE&&(pmap[y][x]&0xFF)>8].temp>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp + 4.0f, MIN_TEMP, MAX_TEMP); + } + if(t==SPC_COOL&&parts[pmap[y][x]>>8].temp>MIN_TEMP){ + parts[pmap[y][x]>>8].temp = restrict_flt(parts[pmap[y][x]>>8].temp - 4.0f, MIN_TEMP, MAX_TEMP); + } + return pmap[y][x]>>8; + } else { + return -1; + } + } +#endif + if(t==SPC_AIR){ + pv[y/CELL][x/CELL] += 0.03f; + if(y+CELL>8].type = PT_SPRK; + parts[pmap[y][x]>>8].life = 4; + parts[pmap[y][x]>>8].ctype = pmap[y][x]&0xFF; + pmap[y][x] = (pmap[y][x]&~0xFF) | PT_SPRK; + return pmap[y][x]>>8; + } + + if(p==-1) { + if(pmap[y][x]) + return -1; + if(pfree == -1) + return -1; + i = pfree; + pfree = parts[i].life; + } else + i = p; + + parts[i].x = (float)x; + parts[i].y = (float)y; + parts[i].type = t; + parts[i].vx = 0; + parts[i].vy = 0; + parts[i].life = 0; + parts[i].ctype = 0; +#ifdef HEAT_ENABLE + parts[i].temp = ptypes[t].heat; +#endif + if(t==PT_ACID){ + parts[i].life = 75; + } + //Testing + /*if(t==PT_WOOD){ + parts[i].life = 150; + }*/ + //End Testing + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + if(t==PT_PLSM) + parts[i].life = rand()%150+50; + if(t==PT_LAVA) + parts[i].life = rand()%120+240; + if(t==PT_NEUT) { + float r = (rand()%128+128)/127.0f; + float a = (rand()%360)*3.14159f/180.0f; + parts[i].life = rand()%480+480; + parts[i].vx = r*cosf(a); + parts[i].vy = r*sinf(a); + } + if(t==PT_PHOT) { + float r = (rand()%3-1)*3; + float a = (rand()%3-1)*3; + parts[i].life = 680; + if(a==0.0f&&r==0.0f){ + parts[i].life = 0; + parts[i].type = PT_NONE; + return -1; + } else { + parts[i].vx = a; + parts[i].vy = r; + } + //} else { + // parts[i].life = 0; + // parts[i].type = PT_NONE; + //} + } + + pmap[y][x] = t|(i<<8); + + return i; +} + +void delete_part(int x, int y) +{ + unsigned i; + + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + i = pmap[y][x]; + if(!i || (i>>8)>=NPART) + return; + + kill_part(i>>8); + pmap[y][x] = 0; // just in case +} + +void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + if(a!=255) { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) +{ + pixel t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + 255*PIXR(t)) >> 8; + g = (a*g + 255*PIXG(t)) >> 8; + b = (a*b + 255*PIXB(t)) >> 8; + if(r>255) + r = 255; + if(g>255) + g = 255; + if(b>255) + b = 255; + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a); + +int is_wire(int x, int y) +{ + return bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12; +} +int is_wire_off(int x, int y) +{ + return (bmap[y][x]==6 || bmap[y][x]==7 || bmap[y][x]==3 || bmap[y][x]==8 || bmap[y][x]==11 || bmap[y][x]==12) && emap[y][x]<8; +} + +void set_emap(int x, int y) +{ + int x1, x2; + + if(!is_wire_off(x, y)) + return; + + // go left as far as possible + x1 = x2 = x; + while(x1>0) { + if(!is_wire_off(x1-1, y)) + break; + x1--; + } + while(x21 && x1==x2 && + is_wire(x1-1, y-1) && is_wire(x1, y-1) && is_wire(x1+1, y-1) && + !is_wire(x1-1, y-2) && is_wire(x1, y-2) && !is_wire(x1+1, y-2)) + set_emap(x1, y-2); + else if(y>0) + for(x=x1; x<=x2; x++) + if(is_wire_off(x, y-1)) { + if(x==x1 || x==x2 || y>=YRES/CELL-1 || + is_wire(x-1, y-1) || is_wire(x+1, y-1) || + is_wire(x-1, y+1) || !is_wire(x, y+1) || is_wire(x+1, y+1)) + set_emap(x, y-1); + } + + if(y=XRES || y>=YRES || + bmap[y/CELL][x/CELL]==1 || + bmap[y/CELL][x/CELL]==8 || + bmap[y/CELL][x/CELL]==9 || + (bmap[y/CELL][x/CELL]==2) || + (bmap[y/CELL][x/CELL]==3 && ptypes[t].falldown!=2) || + (bmap[y/CELL][x/CELL]==10 && ptypes[t].falldown!=1) || + (bmap[y/CELL][x/CELL]==6 && (t==PT_WIRE || t==PT_SPRK)) || + (bmap[y/CELL][x/CELL]==7 && !emap[y/CELL][x/CELL])) { + kill_part(i); + continue; + } + + vx[y/CELL][x/CELL] *= ptypes[t].airloss; + vy[y/CELL][x/CELL] *= ptypes[t].airloss; + vx[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vx; + vy[y/CELL][x/CELL] += ptypes[t].airdrag*parts[i].vy; + if(t==PT_GASS) { + if(pv[y/CELL][x/CELL]<3.5f) + pv[y/CELL][x/CELL] += ptypes[t].hotair*(3.5f-pv[y/CELL][x/CELL]); + if(y+CELL2.5f) { + parts[i].life = rand()%80+180; + rt = parts[i].type = PT_FIRE; +#ifdef HEAT_ENABLE + parts[i].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); +#endif + pv[y/CELL][x/CELL] += 0.25f * CFDS; + t = PT_FIRE; + } + + parts[i].vx *= ptypes[t].loss; + parts[i].vy *= ptypes[t].loss; + + if(t==PT_DFRM && !parts[i].life) { + if(pv[y/CELL][x/CELL]>1.0f) { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL]; + parts[i].life = rand()%80+300; + } + } else { + parts[i].vx += ptypes[t].advection*vx[y/CELL][x/CELL]; + parts[i].vy += ptypes[t].advection*vy[y/CELL][x/CELL] + ptypes[t].gravity; + } + + if(ptypes[t].diffusion) { + parts[i].vx += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + parts[i].vy += ptypes[t].diffusion*(rand()/(0.5f*RAND_MAX)-1.0f); + } + + // interpolator +#ifdef WIN32 + mv = max(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#else + mv = fmaxf(fabsf(parts[i].vx), fabsf(parts[i].vy)); +#endif + if(mv < ISTP) { + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + } else { + dx = parts[i].vx*ISTP/mv; + dy = parts[i].vy*ISTP/mv; + ix = parts[i].x; + iy = parts[i].y; + while(1) { + mv -= ISTP; + if(mv <= 0.0f) { + // nothing found + parts[i].x += parts[i].vx; + parts[i].y += parts[i].vy; + ix = parts[i].x; + iy = parts[i].y; + break; + } + ix += dx; + iy += dy; + nx = (int)(ix+0.5f); + ny = (int)(iy+0.5f); + if(nx<0 || ny<0 || nx>=XRES || ny>=YRES || pmap[ny][nx] || (bmap[ny/CELL][nx/CELL] && bmap[ny/CELL][nx/CELL]!=5)) { + parts[i].x = ix; + parts[i].y = iy; + break; + } + } + } + + a = nt = 0; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx4.0f) + t = parts[i].type = PT_DSTW; + if(t==PT_GASS && pv[y/CELL][x/CELL]>4.0f) + t = parts[i].type = PT_OILL; + if(t==PT_OILL && pv[y/CELL][x/CELL]<-4.0f) + t = parts[i].type = PT_GASS; +#ifdef HEAT_ENABLE + } +#endif + if(t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) + t = parts[i].type = PT_BRMT; + if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) + t = parts[i].type = PT_BGLA; + if(t==PT_ICEI && pv[y/CELL][x/CELL]>0.8f) + t = parts[i].type = PT_SNOW; + if(t==PT_PLUT && 1>rand()%100 && ((int)(5.0f*pv[y/CELL][x/CELL]))>(rand()%1000)) { + t = PT_NEUT; + create_part(i, x, y, t); + } + + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==1){ + nearp = nearest_part(i, PT_ETRD); + if(nearp!=-1){ + create_line((int)parts[i].x, (int)parts[i].y, (int)parts[nearp].x, (int)parts[nearp].y, 0, PT_PLSM); + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[nearp].type = PT_SPRK; + parts[nearp].life = 9; + parts[nearp].ctype = PT_ETRD; + } + } + +#ifdef HEAT_ENABLE + if(!legacy_enable){ + int ctemp = pv[y/CELL][x/CELL]*2; + c_heat = 0.0f; + h_count = 0; + if(ptypes[t].hconduct>(rand()%250)){ + for(nx=-1; nx<2; nx++) { + for(ny=-1; ny<2; ny++) { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE){ + h_count++; + c_heat += parts[r>>8].temp; + } + } + } + } + pt = parts[i].temp = (c_heat+parts[i].temp)/(h_count+1); + for(nx=-1; nx<2; nx++) { + for(ny=-1; ny<2; ny++) { + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if(parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE){ + parts[r>>8].temp = parts[i].temp; + } + } + } + } + if(pt>=pstates[t].btemp&&pstates[t].burn) { + t = parts[i].type = pstates[t].burn; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + } + else if((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid){ + if(t==PT_LAVA&&parts[i].ctype){ + parts[i].life = 0; + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } else if(pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp){ + parts[i].ctype = parts[i].type; + t = parts[i].type = PT_ICEI; + } else { + parts[i].life = 0; + t = parts[i].type = pstates[t].solid; + } + } else if((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)){ + if(pstates[t].liquid==PT_LAVA){ + parts[i].life = rand()%120+240; + parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; + parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; + parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; + t = parts[i].type = pstates[t].liquid; + } else if(t==PT_ICEI&&parts[i].ctype){ + t = parts[i].type = parts[i].ctype; + parts[i].ctype = PT_NONE; + } else { + t = parts[i].type = pstates[t].liquid; + } + }else if(pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS){ + t = parts[i].type = pstates[t].liquid; + }else if(pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)){ + if(t==PT_SLTW&&1>rand()%6){ + t = parts[i].type = PT_SALT; + } else { + t = parts[i].type = pstates[t].gas; + pv[y/CELL][x/CELL] += 0.50f; + if(t==PT_FIRE) + parts[i].life = rand()%50+120; + } + } + if(t==PT_URAN && pv[y/CELL][x/CELL]>0.0f){ + float atemp = parts[i].temp + (-MIN_TEMP); + pt = parts[i].temp = (atemp*(1+(pv[y/CELL][x/CELL]/2000)))+MIN_TEMP; + } + if(t==PT_LAVA){ + parts[i].life = restrict_flt((pt-700)/7, 0.0f, 400.0f); + } + pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); + } + } + if(t==PT_CSCN&&parts[i].temp>24.0f){ + pt = parts[i].temp -= 2.5f; + } + if(t==PT_HSCN&&parts[i].temp>24.0f){ + pt = parts[i].temp -= 2.5f; + } + #endif + + if(t==PT_WATR || t==PT_ETRD || t==PT_SLTW || t==PT_WIRE || t==PT_RBDM || t==PT_LRBD || t==PT_BRMT || t==PT_PSCN || t==PT_NSCN || t==PT_HSCN || t==PT_CSCN || t==PT_BMTL || t==PT_SPRK) { + nx = x % CELL; + if(nx == 0) + nx = x/CELL - 1; + else if(nx == CELL-1) + nx = x/CELL + 1; + else + nx = x/CELL; + ny = y % CELL; + if(ny == 0) + ny = y/CELL - 1; + else if(ny == CELL-1) + ny = y/CELL + 1; + else + ny = y/CELL; + if(nx>=0 && ny>=0 && nx0){ + int ttx = (rand()%3)-1; + r = pmap[y-1][x+ttx]; + if(parts[i].life>50){ + if((pmap[y-1][x+ttx]&0xFF)==PT_NONE){ + create_part(-1, x+ttx, y-1, PT_WOOD); + parts[pmap[y-1][x+ttx]>>8].life = parts[i].life-1; + parts[pmap[y-1][x+ttx]>>8].vx = ttx; + } + if((pmap[y-1][x+ttx-1]&0xFF)==PT_NONE){ + create_part(-1, x+ttx-1, y-1, PT_WOOD); + parts[pmap[y-1][x+ttx-1]>>8].life = 0; + } + if((pmap[y-1][x+ttx+1]&0xFF)==PT_NONE){ + create_part(-1, x+ttx+1, y-1, PT_WOOD); + parts[pmap[y-1][x+ttx+1]>>8].life = 0; + } + parts[i].life = 0; + } else if(parts[i].life>10) { + //int ttx = (rand()%3)-parts[i].vx; + //create_part(-1, x+ttx, y-1, PT_WOOD); + //r = pmap[y-1][x+ttx]; + //parts[r>>8].life = parts[i].life-1; + //parts[i].life = 0; + } + } else*/ + if(t==PT_THDR){ + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_WIRE || (r&0xFF)==PT_ETRD || (r&0xFF)==PT_PSCN || (r&0xFF)==PT_NSCN || (r&0xFF)==PT_HSCN || (r&0xFF)==PT_CSCN || (r&0xFF)==PT_BMTL || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD || (r&0xFF)==PT_BRMT) && parts[r>>8].ctype!=PT_SPRK ){ + t = parts[i].type = PT_NONE; + parts[r>>8].ctype = parts[r>>8].type; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + } else if((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT&&(r&0xFF)) { + pv[y/CELL][x/CELL] += 100.0f; + if(legacy_enable&&1>(rand()%200)){ + parts[i].life = rand()%50+120; + t = parts[i].type = PT_FIRE; + } else { + t = parts[i].type = PT_NONE; + } + } + } + } else if(t==PT_ICEI || t==PT_SNOW) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } +#ifndef HEAT_ENABLE + if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) { + t = parts[i].type = PT_ICEI; + parts[r>>8].type = PT_ICEI; + } + if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) + t = parts[i].type = PT_WATR; +#else + if(legacy_enable){ + if(((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 1>(rand()%1000)) { + t = parts[i].type = PT_ICEI; + parts[r>>8].type = PT_ICEI; + } + if(t==PT_SNOW && ((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW) && 15>(rand()%1000)) + t = parts[i].type = PT_WATR; + } +#endif + } + } + else if(t==PT_HSCN||t==PT_CSCN) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_SPRK && parts[r>>8].ctype==PT_WIRE) { + parts[i].temp = 200.0f; + } + } + } + //PLANT + else if(t==PT_PLNT) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR && 1>(rand()%250)) { + t = parts[i].type = PT_PLNT; + parts[r>>8].type = PT_PLNT; + } else if((r&0xFF)==PT_LAVA && 1>(rand()%250)){ + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_WATR||t==PT_DSTW) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10)) { +#ifndef HEAT_ENABLE + t = parts[i].type = PT_WTRV; + //parts[r>>8].type = PT_WTRV; +#else + if(legacy_enable){ + t = parts[i].type = PT_WTRV; + } +#endif + } else if((r&0xFF)==PT_SALT && 1>(rand()%250)) { + t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } + if((((r&0xFF)==PT_WATR||(r&0xFF)==PT_SLTW)&&t==PT_DSTW) && 1>(rand()%500)){ + t = parts[i].type = PT_WATR; + } + if(((r&0xFF)==PT_SLTW&&t==PT_DSTW) && 1>(rand()%500)){ + t = parts[i].type = PT_SLTW; + } +#ifdef HEAT_ENABLE + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && (legacy_enable||pt>12.0f) && 1>(rand()%500)){ +#else + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ +#endif + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_SLTW) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(((r&0xFF)==PT_FIRE || (r&0xFF)==PT_LAVA) && 1>(rand()%10)) { +#ifndef HEAT_ENABLE + t = parts[i].type = PT_SALT; + parts[r>>8].type = PT_WTRV; +#else + if(legacy_enable){ + t = parts[i].type = PT_SALT; + parts[r>>8].type = PT_WTRV; + } +#endif + } else if((r&0xFF)==PT_SALT && 1>(rand()%10000)) { + //t = parts[i].type = PT_SLTW; + parts[r>>8].type = PT_SLTW; + } +#ifdef HEAT_ENABLE + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)){ +#else + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ +#endif + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + //if(t==PT_SNOW && (r&0xFF)==PT_WATR && 15>(rand()%1000)) + //t = parts[i].type = PT_WATR; + } + } + else if(t==PT_WTRV) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; +#ifdef HEAT_ENABLE + if(legacy_enable){ +#endif + if(((r&0xFF)==PT_WATR||(r&0xFF)==PT_DSTW||(r&0xFF)==PT_SLTW) && 1>(rand()%1000)) { + t = parts[i].type = PT_WATR; + parts[r>>8].type = PT_WATR; + } +#ifdef HEAT_ENABLE + } +#endif + +#ifdef HEAT_ENABLE + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && pt>12.0f && 1>(rand()%500)){ +#else + if(((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && 1>(rand()%500)){ +#endif + parts[i].life = 4; + t = parts[i].type = PT_FIRE; + + } + if(((r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) && 1>(rand()%1000)) { +#ifndef HEAT_ENABLE + t = parts[i].type = PT_WATR; + if(1>(rand()%1000)) + parts[r>>8].type = PT_WATR; +#else + if(legacy_enable){ + t = parts[i].type = PT_WATR; + if(1>(rand()%1000)) + parts[r>>8].type = PT_WATR; + } +#endif + } + } + } + // END PLANT + // ACID + else if(t==PT_ACID) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)!=PT_ACID){ + if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD){ + t = parts[i].type = PT_FIRE; + parts[i].life = 4; + parts[r>>8].type = PT_FIRE; + parts[r>>8].life = 4; + } else if(((r&0xFF)!=PT_CLNE && ptypes[parts[r>>8].type].hardness>(rand()%1000))&&parts[i].life>=50) { + parts[i].life--; + parts[r>>8].type = PT_NONE; + } else if (parts[i].life==50){ + parts[i].life = 0; + t = parts[i].type = PT_NONE; + } + } + } + } + //END ACID :D + else if(t==PT_NEUT) { + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + if((r&0xFF)==PT_PLUT && rt>(rand()%1000)) { + if(33>rand()%100) { + create_part(r>>8, x+nx, y+ny, rand()%2 ? PT_LAVA : PT_URAN); + } else { + create_part(r>>8, x+nx, y+ny, PT_NEUT); + parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; + parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; + } + pv[y/CELL][x/CELL] += 10.00f * CFDS; //Used to be 2, some people said nukes weren't powerful enough + fe ++; + } + if((r&0xFF)==PT_GUNP && 15>(rand()%1000)) + parts[r>>8].type = PT_DUST; + if((r&0xFF)==PT_WATR && 15>(rand()%100)) + parts[r>>8].type = PT_DSTW; + if((r&0xFF)==PT_PLEX && 15>(rand()%1000)) + parts[r>>8].type = PT_DFRM; + if((r&0xFF)==PT_NITR && 15>(rand()%1000)) + parts[r>>8].type = PT_OILL; + if((r&0xFF)==PT_OILL && 5>(rand()%1000)) + parts[r>>8].type = PT_GASS; + if((r&0xFF)==PT_PLNT && 5>(rand()%100)) + parts[r>>8].type = PT_WOOD; + } + } + else if(t==PT_PHOT){ + rt = 3 + (int)pv[y/CELL][x/CELL]; + for(nx=0; nx<1; nx++) + for(ny=0; ny<1; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if((r&0xFF)==PT_WATR || (r&0xFF)==PT_ICEI || (r&0xFF)==PT_SNOW) { + parts[i].vx *= 0.995; + parts[i].vy *= 0.995; + } + // } else if(((r&0xFF)!=PT_PHOT&&(r&0xFF)!=PT_NONE&&(r&0xFF)!=PT_CLNE)) { + // parts[i].life = 0; + // parts[i].type = PT_NONE; + // }// else if((r&0xFF)!=PT_PLEX){ + // parts[i].life = 4; + // parts[i].type = PT_FIRE + //} + } + } + if(t==PT_FIRE || t==PT_PLSM || t==PT_LAVA || t==PT_SPRK || fe || (t==PT_PHOT&&(1>rand()%10))) { + for(nx=-2; nx<3; nx++) + for(ny=-2; ny<3; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx>8)>=NPART || !r) + continue; + if(bmap[(y+ny)/CELL][(x+nx)/CELL] && bmap[(y+ny)/CELL][(x+nx)/CELL]!=5) + continue; + rt = parts[r>>8].type; + if((a || ptypes[rt].explosive) && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && + (t!=PT_LAVA || parts[i].life>0 || (rt!=PT_METL && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_BMTL && rt!=PT_BRMT)) && + ptypes[rt].flammable && (ptypes[rt].flammable + (int)(pv[(y+ny)/CELL][(x+nx)/CELL]*10.0f))>(rand()%1000)) { + parts[r>>8].type = PT_FIRE; +#ifdef HEAT_ENABLE + parts[r>>8].temp = ptypes[PT_FIRE].heat + (ptypes[rt].flammable/2); +#endif + parts[r>>8].life = rand()%80+180; + if(ptypes[rt].explosive) + pv[y/CELL][x/CELL] += 0.25f * CFDS; //LOL + continue; + } + lpv = (int)pv[(y+ny)/CELL][(x+nx)/CELL]; + if(lpv < 1) lpv = 1; +#ifndef HEAT_ENABLE + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && (t!=PT_FIRE || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && + ptypes[rt].meltable*lpv>(rand()%1000)) { + if(t!=PT_LAVA || parts[i].life>0) { + parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; + parts[r>>8].type = PT_LAVA; + parts[r>>8].life = rand()%120+240; + } else { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) { + parts[r>>8].type = PT_WATR; + if(t==PT_FIRE) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) { + parts[i].life = 0; + t = parts[i].type = PT_METL; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) { + kill_part(r>>8); + if(t==PT_FIRE) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + //t = parts[i].type = PT_METL; + goto killed; + } + } +#else + if(legacy_enable){ + if(t!=PT_SPRK && ptypes[rt].meltable && ((rt!=PT_RBDM && rt!=PT_LRBD) || t!=PT_SPRK) && ((t!=PT_FIRE&&t!=PT_PLSM) || (rt!=PT_WIRE && rt!=PT_ETRD && rt!=PT_PSCN && rt!=PT_NSCN && rt!=PT_HSCN && rt!=PT_CSCN && rt!=PT_BMTL && rt!=PT_BRMT && rt!=PT_SALT)) && + ptypes[rt].meltable*lpv>(rand()%1000)) { + if(t!=PT_LAVA || parts[i].life>0) { + parts[r>>8].ctype = (parts[r>>8].type==PT_BRMT)?PT_BMTL:parts[r>>8].type; + parts[r>>8].ctype = (parts[r>>8].ctype==PT_SAND)?PT_GLAS:parts[r>>8].ctype; + parts[r>>8].type = PT_LAVA; + parts[r>>8].life = rand()%120+240; + } else { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_ICEI || rt==PT_SNOW)) { + parts[r>>8].type = PT_WATR; + if(t==PT_FIRE) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) { + parts[i].life = 0; + t = parts[i].type = PT_METL; + goto killed; + } + } + if(t!=PT_SPRK && (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW)) { + kill_part(r>>8); + if(t==PT_FIRE) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + goto killed; + } + if(t==PT_LAVA) { + parts[i].life = 0; + t = parts[i].type = (parts[i].ctype)?parts[i].ctype:PT_METL; + parts[i].ctype = PT_NONE;//rt; + //t = parts[i].type = PT_METL; + goto killed; + } + } + } +#endif + //Bitches now know about my semi-conductor :( + if(t==PT_SPRK && (rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN) && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)=100.0f)&&parts[i].ctype==PT_HSCN)&&!(rt!=PT_PSCN&&!(rt==PT_NSCN&&parts[i].temp<=100.0f)&&parts[i].ctype==PT_CSCN)){ + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; +#ifdef HEAT_ENABLE + if(parts[r>>8].temp+10.0f<400.0f&&!legacy_enable&&!(rt==PT_LRBD||rt==PT_RBDM||rt==PT_HSCN||rt==PT_CSCN)) + parts[r>>8].temp = parts[r>>8].temp+10.0f; +#endif + } + } + if(t==PT_SPRK && rt==PT_HSCN && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp>100.0f)){ + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_CSCN && parts[r>>8].life==0 && + (parts[i].life<3 || ((r>>8)>8].temp<100.0f)){ + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + if(t==PT_SPRK && rt==PT_WATR && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 6; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK && rt==PT_SLTW && parts[r>>8].life==0 && + (parts[i].life<2 || ((r>>8)>8].type = PT_SPRK; + parts[r>>8].life = 5; + parts[r>>8].ctype = rt; + } + if(t==PT_SPRK&&parts[i].ctype==PT_ETRD&&parts[i].life==5){ + if(rt==PT_WIRE||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN){ + t = parts[i].type = PT_ETRD; + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[r>>8].type = PT_SPRK; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + } + } + } + killed: + if(parts[i].type == PT_NONE) + continue; + } + + if(t==PT_CLNE) { + if(!parts[i].ctype) { + for(nx=-1; nx<2; nx++) + for(ny=-1; ny<2; ny++) + if(x+nx>=0 && y+ny>0 && + x+nx=XRES-CELL || + ny=YRES-CELL) { + parts[i].x = lx; + parts[i].y = ly; + kill_part(i); + continue; + } + + rt = parts[i].flags & FLAG_STAGNANT; + parts[i].flags &= ~FLAG_STAGNANT; + if(!try_move(i, x, y, nx, ny)) { + parts[i].x = lx; + parts[i].y = ly; + if(ptypes[t].falldown) { + if(nx!=x && try_move(i, x, y, nx, y)) { + parts[i].x = ix; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(ny!=y && try_move(i, x, y, x, ny)) { + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else { + r = (rand()%2)*2-1; + if(ny!=y && try_move(i, x, y, x+r, ny)) { + parts[i].x += r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(ny!=y && try_move(i, x, y, x-r, ny)) { + parts[i].x -= r; + parts[i].y = iy; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(nx!=x && try_move(i, x, y, nx, y+r)) { + parts[i].x = ix; + parts[i].y += r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(nx!=x && try_move(i, x, y, nx, y-r)) { + parts[i].x = ix; + parts[i].y -= r; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else if(ptypes[t].falldown>1 && parts[i].vy>fabs(parts[i].vx)) { + s = 0; + if(!rt || nt) + rt = 50; + else + rt = 10; + for(j=x+r; j>=0 && j>=x-rt && j0) + r = 1; + else + r = -1; + if(s) + for(j=y+r; j>=0 && j=y-rt && jx+ISTP) nx=x+ISTP; + if(nxy+ISTP) ny=y+ISTP; + if(ny(rand()%1000)) { + kill_part(i); + continue; + } else if(try_move(i, x, y, 2*x-nx, ny)) { + parts[i].x = (float)(2*x-nx); + parts[i].y = (float)iy; + parts[i].vx *= ptypes[t].collision; + } else if(try_move(i, x, y, nx, 2*y-ny)) { + parts[i].x = (float)ix; + parts[i].y = (float)(2*y-ny); + parts[i].vy *= ptypes[t].collision; + } else { + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } + } + } + + justdraw: + + nx = (int)(parts[i].x+0.5f); + ny = (int)(parts[i].y+0.5f); + + if(nx=XRES-CELL || + ny=YRES-CELL) { + kill_part(i); + continue; + } +#ifdef HEAT_ENABLE + if(cmode!=CM_HEAT){ + +#endif + if(t==PT_ACID) { + if(parts[i].life>255) parts[i].life = 255; + if(parts[i].life<47) parts[i].life = 48; + s = (255/((parts[i].life-46)*28));//if(parts[i].life<=49) parts[i].life = 50; + if(s==0) s = 1; + cr = PIXR(ptypes[t].pcolors)/s; + cg = PIXG(ptypes[t].pcolors)/s; + cb = PIXB(ptypes[t].pcolors)/s; + //vid[ny*(XRES+BARSIZE)+nx] = //(cr<<16)+(cb<<18)+cg;//ptypes[t].pcolors/-(parts[i].life-255); + blendpixel(vid, nx, ny, cr, cg, cb, 255);//(parts[i].life-46)*28 + if(cmode==4){ + blendpixel(vid, nx+1, ny, cr, cg, cb, 223); + blendpixel(vid, nx-1, ny, cr, cg, cb, 223); + blendpixel(vid, nx, ny+1, cr, cg, cb, 223); + blendpixel(vid, nx, ny-1, cr, cg, cb, 223); + + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112); + } + }else if(t==PT_NEUT) { + if(cmode == 3||cmode==4) { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 8; + cb = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } else { + cr = 0x20; + cg = 0xE0; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + }else if(t==PT_PHOT) { + if(cmode == 3||cmode==4) { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 12; + cb = 12; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } else { + cr = 0xFF; + cg = 0xFF; + cb = 0xFF; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_THDR) { + if(cmode == 3||cmode==4) { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + cg = 16; + cb = 20; + cr = 12; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } else { + cr = 0xFF; + cg = 0xFF; + cb = 0xA0; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_PLSM) { + float ttemp = parts[i].life; + int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + uint8 R = plasma_data[caddress]; + uint8 G = plasma_data[caddress+1]; + uint8 B = plasma_data[caddress+2]; + if(cmode == 3||cmode==4) { + cr = R/8; + cg = G/8; + cb = B/8; + x = nx/CELL; + y = ny/CELL; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + } else { + cr = R; + cg = G; + cb = B; + blendpixel(vid, nx, ny, cr, cg, cb, 192); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_FIRE && parts[i].life) { + if(cmode == 3||cmode==4) { + cr = parts[i].life / 4; + cg = parts[i].life / 16; + cb = parts[i].life / 32; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } else { + cr = parts[i].life * 8; + cg = parts[i].life * 2; + cb = parts[i].life; + if(cr>255) cr = 255; + if(cg>192) cg = 212; + if(cb>128) cb = 192; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 96); + blendpixel(vid, nx-1, ny, cr, cg, cb, 96); + blendpixel(vid, nx, ny+1, cr, cg, cb, 96); + blendpixel(vid, nx, ny-1, cr, cg, cb, 96); + blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32); + blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32); + } + } else if(t==PT_LAVA && parts[i].life) { + cr = parts[i].life * 2 + 0xE0; + cg = parts[i].life * 1 + 0x50; + cb = parts[i].life/2 + 0x10; + if(cr>255) cr = 255; + if(cg>192) cg = 192; + if(cb>128) cb = 128; + blendpixel(vid, nx, ny, cr, cg, cb, 255); + blendpixel(vid, nx+1, ny, cr, cg, cb, 64); + blendpixel(vid, nx-1, ny, cr, cg, cb, 64); + blendpixel(vid, nx, ny+1, cr, cg, cb, 64); + blendpixel(vid, nx, ny-1, cr, cg, cb, 64); + if(cmode == 3||cmode==4) { + cr /= 32; + cg /= 32; + cb /= 32; + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } else if(t==PT_LAVA || t==PT_SPRK) { + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; + if(cmode == 3 || cmode==4) { + if(t == PT_LAVA) { + cr = 3; + cg = i%2; + cb = 0; + } else { + cr = 8; + cg = 12; + cb = 16; + } + x = nx/CELL; + y = ny/CELL; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } else + vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors; +#ifdef HEAT_ENABLE + } else { + float ttemp = parts[i].temp+(-MIN_TEMP); + int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/512) ) *3, 0.0f, (512.0f*3)-3); + uint8 R = color_data[caddress]; + uint8 G = color_data[caddress+1]; + uint8 B = color_data[caddress+2]; + vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B); + //blendpixel(vid, nx+1, ny, R, G, B, 255); + } +#endif + if(cmode == 4&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_NONE&&t!=PT_ACID){ + uint8 R = PIXR(ptypes[t].pcolors); + uint8 G = PIXG(ptypes[t].pcolors); + uint8 B = PIXB(ptypes[t].pcolors); + + //if(vid[(ny-1)*YRES+(nx-1)]!=0){ + // blendpixel(vid, nx, ny-1, R, G, B, 46); + //} + + blendpixel(vid, nx+1, ny, R, G, B, 223); + blendpixel(vid, nx-1, ny, R, G, B, 223); + blendpixel(vid, nx, ny+1, R, G, B, 223); + blendpixel(vid, nx, ny-1, R, G, B, 223); + + blendpixel(vid, nx+1, ny-1, R, G, B, 112); + blendpixel(vid, nx-1, ny-1, R, G, B, 112); + blendpixel(vid, nx+1, ny+1, R, G, B, 112); + blendpixel(vid, nx-1, ny+1, R, G, B, 112); + } + + } + +} + +void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb){ + blendpixel(vid, x+1, y, cr, cg, cb, 112); + blendpixel(vid, x-1, y, cr, cg, cb, 112); + blendpixel(vid, x, y+1, cr, cg, cb, 112); + blendpixel(vid, x, y-1, cr, cg, cb, 112); + + blendpixel(vid, x+1, y-1, cr, cg, cb, 64); + blendpixel(vid, x-1, y-1, cr, cg, cb, 64); + blendpixel(vid, x+1, y+1, cr, cg, cb, 64); + blendpixel(vid, x-1, y+1, cr, cg, cb, 64); +} + +void update_particles_i_th(void *arg){ + upstruc *newup = (upstruc*)arg; + update_particles_i(newup[0].vid, newup[0].start, newup[0].inc); + return; +} + +void update_particles(pixel *vid) +{ + int i, j, x, y, t, nx, ny, r, cr,cg,cb, l = -1; + float lx, ly; +#ifdef MT + int pt = 0, pc = 0; + pthread_t *InterThreads; +#endif + + memset(pmap, 0, sizeof(pmap)); + r = rand()%2; + for(j=0; j=0 && y>=0 && x>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) { + if(emap[y][x]) { + cr = cg = cb = 128; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) { + for(j=0; j 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==13) { + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(emap[y][x] && !sys_pause) + emap[y][x] --; + } + } + } else { + for(y=0; y>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==4) + for(j=0; j>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==7) { + if(emap[y][x]) { + cr = cg = cb = 128; + cr += fire_r[y][x]; if(cr > 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + for(j=0; j 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==11) { + for(j=0; j 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(bmap[y][x]==9){ + for(j=0; j>1)&1; i>1)&1; i>1)&1; i 255) cr = 255; fire_r[y][x] = cr; + cg += fire_g[y][x]; if(cg > 255) cg = 255; fire_g[y][x] = cg; + cb += fire_b[y][x]; if(cb > 255) cb = 255; fire_b[y][x] = cb; + } + } + if(emap[y][x] && !sys_pause) + emap[y][x] --; + } + } + } + +#ifdef MT + if(numCores > 1) { + InterThreads = (pthread_t *)calloc(sizeof(pthread_t), numCores); + for(pc = 0; pc=XRES || ny<0 || ny>=YRES) + break; + addpixel(vid, nx, ny, 255, 255, 255, 64); + i = nx/CELL; + j = ny/CELL; + lx += vx[j][i]*0.125f; + ly += vy[j][i]*0.125f; + if(bmap[j][i]==5 && i!=x && j!=y) + break; + } + drawtext(vid, x*CELL, y*CELL-2, "\x8D", 255, 255, 255, 128); + } + +} + +void update_particles_th(void *arg) +{ + update_particles((pixel*)arg); + return; +} + +/*********************************************************** + * SDL OUTPUT * + ***********************************************************/ + +int sdl_scale = 1; +SDL_Surface *sdl_scrn; +SDLMod sdl_mod; +int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; + +#include "icon.h" +void sdl_seticon(void) +{ +#ifdef WIN32 + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else +#ifdef MACOSX + //SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon_w32, 32, 32, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + //SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#else + SDL_Surface *icon = SDL_CreateRGBSurfaceFrom(app_icon, 16, 16, 32, 128, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + SDL_WM_SetIcon(icon, NULL/*app_icon_mask*/); +#endif +#endif +} + +void sdl_open(void) +{ + if(SDL_Init(SDL_INIT_VIDEO)<0) { + fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); + exit(1); + } + atexit(SDL_Quit); +#ifdef PIX16 + sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_SWSURFACE); +#else + sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE); +#endif + if(!sdl_scrn) { + fprintf(stderr, "Creating window: %s\n", SDL_GetError()); + exit(1); + } + SDL_WM_SetCaption("The Powder Toy", "Powder Toy"); + sdl_seticon(); + SDL_EnableUNICODE(1); + //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); +} + +void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0;jpitch/PIXELSIZE; + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} + +void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) +{ + pixel *dst; + int j; + int i,k; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; + for(j=0;jpitch/PIXELSIZE; + } + src+=pitch; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} +void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) +{ + if(sdl_scale == 2) + sdl_blit_2(x, y, w, h, src, pitch); + else + sdl_blit_1(x, y, w, h, src, pitch); +} + +int frame_idx=0; +void dump_frame(pixel *src, int w, int h, int pitch) +{ + char frame_name[32]; + int j,i; + unsigned char c[3]; + FILE *f; + sprintf(frame_name,"frame%04d.ppm",frame_idx); + f=fopen(frame_name,"wb"); + fprintf(f,"P6\n%d %d\n255\n",w,h); + for(j=0;j=0 && x=0 && yPT_NUM) + return 2; + if(c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL) + return 3; + i = XRES*YRES; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0)) + return 1; + size = i; + } else + d = c; + + if(size < XRES*YRES) { + if(bzip2) + free(d); + return 1; + } + + sy = 0; + for(y=0;y+scl<=YRES;y+=scl) { + sx = 0; + for(x=0;x+scl<=XRES;x+=scl) { + a = 0; + r = g = b = 0; + for(j=0;j=PT_NUM) + goto corrupt; + r += PIXR(ptypes[t].pcolors); + g += PIXG(ptypes[t].pcolors); + b += PIXB(ptypes[t].pcolors); + a ++; + } + } + if(a) { + a = 256/a; + r = (r*a)>>8; + g = (g*a)>>8; + b = (b*a)>>8; + } + drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255); + sx++; + } + sy++; + } + + if(bzip2) + free(d); + return 0; + +corrupt: + if(bzip2) + free(d); + return 1; +} + +static char *mystrdup(char *s) +{ + char *x; + if(s) { + x = malloc(strlen(s)+1); + strcpy(x, s); + return x; + } + return s; +} + +void *build_save(int *size, int x0, int y0, int w, int h) +{ +#ifdef HEAT_ENABLE + unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*7+MAXSIGNS*262), *c; +#else + unsigned char *d=calloc(1,3*(XRES/CELL)*(YRES/CELL)+(XRES*YRES)*6+MAXSIGNS*262), *c; +#endif + int i,j,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)); + int bx0=x0/CELL, by0=y0/CELL, bw=(w+CELL-1)/CELL, bh=(h+CELL-1)/CELL; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + // save the required air state + for(y=by0; y255) i=255; + d[p++] = i; + } + for(y=by0; y255) i=255; + d[p++] = i; + } + + // save the particle map + for(i=0; i=x0 && x=y0 && y255) x=255; + if(y<0) y=0; + if(y>255) y=255; + d[p++] = x; + d[p++] = y; + } + } + for(j=0; j255) tttemp=255; + d[p++] = tttemp; + } + } +#endif + for(j=0; j=x0 && signs[i].x=y0 && signs[i].y=x0 && signs[i].x=y0 && signs[i].y>8; + d[p++] = (signs[i].y-y0); + d[p++] = (signs[i].y-y0)>>8; + d[p++] = signs[i].ju; + x = strlen(signs[i].text); + d[p++] = x; + memcpy(d+p, signs[i].text, x); + p+=x; + } + + i = (p*101+99)/100 + 612; + c = malloc(i); + c[0] = 0x66; + c[1] = 0x75; + c[2] = 0x43; + c[3] = legacy_enable; + c[4] = SAVE_VERSION; + c[5] = CELL; + c[6] = bw; + c[7] = bh; + c[8] = p; + c[9] = p >> 8; + c[10] = p >> 16; + c[11] = p >> 24; + + i -= 12; + + if(BZ2_bzBuffToBuffCompress((char *)(c+12), (unsigned *)&i, (char *)d, p, 9, 0, 0) != BZ_OK) { + free(d); + free(c); + return NULL; + } + free(d); + + *size = i+12; + return c; +} + +int parse_save(void *save, int size, int replace, int x0, int y0) +{ + unsigned char *d,*c=save; + int i,j,k,x,y,p=0,*m=calloc(XRES*YRES, sizeof(int)), ver, pty, ty, legacy_beta=0; + int bx0=x0/CELL, by0=y0/CELL, bw, bh, w, h; + int fp[NPART], nf=0; + + if(size<16) + return 1; + if(c[2]!=0x43 || c[1]!=0x75 || c[0]!=0x66) + return 1; + if(c[4]>SAVE_VERSION) + return 2; + ver = c[4]; + +#ifdef HEAT_ENABLE + if(ver<34){ + legacy_enable = 1; + } else { + if(c[3]==1||c[3]==0) + legacy_enable = c[3]; + else + legacy_beta = 1; + } +#endif + + bw = c[6]; + bh = c[7]; + if(bx0+bw > XRES/CELL) + bx0 = XRES/CELL - bw; + if(by0+bh > YRES/CELL) + by0 = YRES/CELL - bh; + if(bx0 < 0) + bx0 = 0; + if(by0 < 0) + by0 = 0; + + if(c[5]!=CELL || bx0+bw>XRES/CELL || by0+bh>YRES/CELL) + return 3; + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return 1; + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + return 1; + size = i; + + if(size < bw*bh) + return 1; + + // normalize coordinates + x0 = bx0*CELL; + y0 = by0*CELL; + w = bw *CELL; + h = bh *CELL; + + if(replace) { + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(signs, 0, sizeof(signs)); + memset(parts, 0, sizeof(particle)*NPART); + memset(pmap, 0, sizeof(pmap)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(pv, 0, sizeof(pv)); + } + + // make a catalog of free parts + memset(pmap, 0, sizeof(pmap)); + for(i=0; i= size) + goto corrupt; + fvx[y][x] = (d[p++]-127.0f)/64.0f; + } + for(y=by0; y= size) + goto corrupt; + fvy[y][x] = (d[p++]-127.0f)/64.0f; + } + + // load the particle map + i = 0; + pty = p; + for(y=y0;y= size) + goto corrupt; + j=d[p++]; + if(j >= PT_NUM) + goto corrupt; + if(j) { + if(pmap[y][x]) { + k = pmap[y][x]>>8; + parts[k].type = j; + parts[k].x = (float)x; + parts[k].y = (float)y; + m[(x-x0)+(y-y0)*w] = k+1; + } else if(i < nf) { + parts[fp[i]].type = j; + parts[fp[i]].x = (float)x; + parts[fp[i]].y = (float)y; + m[(x-x0)+(y-y0)*w] = fp[i]+1; + i++; + } else + m[(x-x0)+(y-y0)*w] = NPART+1; + } + } + + // load particle properties + for(j=0; j= size) + goto corrupt; + if(i < NPART) { + parts[i].vx = (d[p++]-127.0f)/16.0f; + parts[i].vy = (d[p++]-127.0f)/16.0f; + } else + p += 2; + } + } + for(j=0; j= size) + goto corrupt; + if(i <= NPART) + parts[i-1].life = d[p++]*4; + else + p++; + } + } +#ifdef HEAT_ENABLE + for(j=0; j=34&&legacy_beta==0){ + if(p >= size){ + goto corrupt; + } + if(i <= NPART) { + parts[i-1].temp = (d[p++]*((MAX_TEMP+(-MIN_TEMP))/255))+MIN_TEMP; + } else { + p++; + } + } else { + parts[i-1].temp = ptypes[parts[i-1].type].heat; + } + } + } +#endif + for(j=0; j=21) || (ty==PT_LAVA && ver>=34))) { + if(p >= size) + goto corrupt; + if(i <= NPART) + parts[i-1].ctype = d[p++]; + else + p++; + } + } + + if(p >= size) + goto version1; + j = d[p++]; + for(i=0; i size) + goto corrupt; + for(k=0; k size) + goto corrupt; + if(kSAVE_VERSION) + return NULL; + + bw = c[6]; + bh = c[7]; + w = bw*CELL; + h = bh*CELL; + + if(c[5]!=CELL) + return NULL; + + i = (unsigned)c[8]; + i |= ((unsigned)c[9])<<8; + i |= ((unsigned)c[10])<<16; + i |= ((unsigned)c[11])<<24; + d = malloc(i); + if(!d) + return NULL; + fb = calloc(w*h, PIXELSIZE); + if(!fb) { + free(d); + return NULL; + } + + if(BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+12), size-12, 0, 0)) + goto corrupt; + size = i; + + if(size < bw*bh) + goto corrupt; + + k = 0; + for(y=0; y>1)&1; i>1)&1; i>1)&1; i=size) + goto corrupt; + + for(y=0;y= size) + goto corrupt; + j=d[p++]; + if(j0) + fb[y*w+x] = ptypes[j].pcolors; + } + + free(d); + *width = w; + *height = h; + return fb; + +corrupt: + free(d); + free(fb); + return NULL; +} + +/* NO, I DON'T THINK SO + #include "fbi.h" + + pixel *render_packed_rgb(void *image, int width, int height, int cmp_size) + { + unsigned char *tmp; + pixel *res; + int i; + + tmp = malloc(width*height*3); + if(!tmp) + return NULL; + res = malloc(width*height*PIXELSIZE); + if(!res) { + free(tmp); + return NULL; + } + + i = width*height*3; + if(BZ2_bzBuffToBuffDecompress((char *)tmp, (unsigned *)&i, (char *)image, cmp_size, 0, 0)) { + free(res); + free(tmp); + return NULL; + } + + for(i=0; i1) { + r = (r+c/2)/c; + g = (g+c/2)/c; + b = (b+c/2)/c; + } + q[y*w+x] = PIXRGB(r, g, b); + } + *qw = w; + *qh = h; + return q; +} + +#define GRID_X 5 +#define GRID_Y 4 +#define GRID_P 3 +#define GRID_S 6 +#define GRID_Z 3 + +void stamp_gen_thumb(int i) +{ + char fn[64]; + void *data; + int size, factor_x, factor_y; + pixel *tmp; + + if(stamps[i].thumb) { + free(stamps[i].thumb); + stamps[i].thumb = NULL; + } + + sprintf(fn, "stamps" PATH_SEP "%s.stm", stamps[i].name); + data = file_load(fn, &size); + + if(data) { + stamps[i].thumb = prerender_save(data, size, &(stamps[i].thumb_w), &(stamps[i].thumb_h)); + if(stamps[i].thumb && (stamps[i].thumb_w>XRES/GRID_S || stamps[i].thumb_h>YRES/GRID_S)) { + factor_x = ceil((float)stamps[i].thumb_w/(float)(XRES/GRID_S)); + factor_y = ceil((float)stamps[i].thumb_h/(float)(YRES/GRID_S)); + if(factor_y > factor_x) + factor_x = factor_y; + tmp = rescale_img(stamps[i].thumb, stamps[i].thumb_w, stamps[i].thumb_h, &(stamps[i].thumb_w), &(stamps[i].thumb_h), factor_x); + free(stamps[i].thumb); + stamps[i].thumb = tmp; + } + } + + free(data); +} + +void stamp_save(int x, int y, int w, int h) +{ + FILE *f; + int n; + char fn[64], sn[16]; + void *s=build_save(&n, x, y, w, h); + +#ifdef WIN32 + _mkdir("stamps"); +#else + mkdir("stamps", 0755); +#endif + + stamp_gen_name(sn); + sprintf(fn, "stamps" PATH_SEP "%s.stm", sn); + + f = fopen(fn, "wb"); + if(!f) + return; + fwrite(s, n, 1, f); + fclose(f); + + free(s); + + if(stamps[STAMP_MAX-1].thumb) + free(stamps[STAMP_MAX-1].thumb); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*(STAMP_MAX-1)); + memset(stamps, 0, sizeof(struct stamp_info)); + if(stamp_count0) { + memcpy(&tmp, stamps+i, sizeof(struct stamp_info)); + memmove(stamps+1, stamps, sizeof(struct stamp_info)*i); + memcpy(stamps, &tmp, sizeof(struct stamp_info)); + + stamp_update(); + } + + return data; +} + +void stamp_init(void) +{ + int i; + FILE *f; + + memset(stamps, 0, sizeof(stamps)); + + f=fopen("stamps" PATH_SEP "stamps.def", "rb"); + if(!f) + return; + for(i=0; i=XRES+BARSIZE || y>=YRES+MENUSIZE) + return; + if(a!=255) { + t = vid[y*(XRES+BARSIZE)+x]; + r = (a*r + (255-a)*PIXR(t)) >> 8; + g = (a*g + (255-a)*PIXG(t)) >> 8; + b = (a*b + (255-a)*PIXB(t)) >> 8; + } + vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); +} + +int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) +{ + int i, j, w, bn = 0, ba = 0; + char *rp = font_data + font_ptrs[c]; + w = *(rp++); + for(j=0; j>= 2; + bn -= 2; + } + return x + w; +} + +int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) +{ + int sx = x; + for(;*s;s++) { + if(*s == '\n') { + x = sx; + y += FONT_H+2; + } else if(*s == '\b') { + switch(s[1]) { + case 'w': + r = g = b = 255; + break; + case 'g': + r = g = b = 192; + break; + case 'o': + r = 255; + g = 216; + b = 32; + break; + case 'r': + r = 255; + g = b = 0; + break; + case 'b': + r = g = 0; + b = 255; + break; + } + s++; + } else + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + return x; +} + +void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) +{ + int i; + for(i=0; i<=w; i++) { + drawpixel(vid, x+i, y, r, g, b, a); + drawpixel(vid, x+i, y+h, r, g, b, a); + } + for(i=1; i=w && x+textwidth(s)>=w+5) + break; + x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); + } + if(*s) + for(i=0; i<3; i++) + x = drawchar(vid, x, y, '.', r, g, b, a); + return x; +} + +int textnwidth(char *s, int n) +{ + int x = 0; + for(;*s;s++) { + if(!n) + break; + x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + n--; + } + return x-1; +} +int textwidthx(char *s, int w) +{ + int x=0,n=0,cw; + for(;*s;s++) { + cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; + if(x+(cw/2) >= w) + break; + x += cw; + n++; + } + return n; +} + +/*********************************************************** + * MAIN PROGRAM * + ***********************************************************/ + +void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) +{ + int x, y, i, j, c; + int bo = b; + if(iswall==1){ + b = b-100; + x = (2+32*((b-22)/1)); + y = YRES+2+40; + switch(b){ + case WL_WALLELEC: + for(j=1; j<15; j++){ + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } else { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) { + for(i=1; i<6+j; i++) { + if(!(i&j&1)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) { + if(i&j&1) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<13; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) { + for(i=14; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + default: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) { + for(j=4; j<12; j++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } else { + x = 2+32*(b/2); + y = YRES+2+20*(b%2); + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) { + for(j=4; j<12; j++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + if(bo==sl || bo==sr) { + c = 0; + if(bo==sl) + c |= PIXPACK(0xFF0000); + if(bo==sr) + c |= PIXPACK(0x0000FF); + for(i=0; i<30; i++) { + vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; + } + for(j=0; j<18; j++) { + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; + vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; + } + } +} + +int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) +{ + int i, j, c; + if(b>=121){ + b = b-100; + //x = (2+32*((b-22)/1)); + //y = YRES+2+40; + switch(b){ + case WL_WALLELEC: + for(j=1; j<15; j++){ + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } else { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); + } + } + } + break; + case 23: + for(j=1; j<15; j++) { + for(i=1; i<6+j; i++) { + if(!(i&j&1)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(; i<27; i++) { + if(i&j&1) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 24: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 25: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); + } + } + for(i=9; i<27; i++) { + drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); + } + break; + case 26: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); + } + } + drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); + break; + case 27: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 28: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 29: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 30: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<13; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + for(j=1; j<15; j++) { + for(i=14; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 32: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 33: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + case 34: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + if(!(i%2) && !(j%2)) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + break; + case 36: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); + break; + case 37: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); + break; + case 38: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); + break; + case 39: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); + break; + case 40: + for(j=1; j<15; j+=2) { + for(i=1+(1&(j>>1)); i<27; i+=2) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + break; + default: + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + } + if(b==30) { + for(j=4; j<12; j++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + } else { + //x = 2+32*(b/2); + //y = YRES+2+20*(b%2); + for(j=1; j<15; j++) { + for(i=1; i<27; i++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; + } + } + if(b==0) { + for(j=4; j<12; j++) { + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); + vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); + } + } + c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); + if(c<544) { + c = 255; + } else { + c = 0; + } + drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); + } + return 26; +} + +void draw_menu(pixel *vid_buf, int i, int hover){ + + //drawtext(vid_buf, XRES+1, /*(12*i)+2*/((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2), msections[i].icon, 255, 255, 255, 255); +#ifdef MENUV3 + drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + if(hover==i){ + fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); + } else { + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); + } +#else + drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); +#endif +} + +void menu_ui(pixel *vid_buf, int i, int *sl, int *sr){ + int b=1,bq,mx,my,h,x,y,n=0,height,width,sy,rows=0; + pixel *old_vid=(pixel *)calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); + fillrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE, 0, 0, 0, 192); + memcpy(old_vid, vid_buf, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + rows = ceil((float)msections[i].itemcount/16.0f); + height = (ceil((float)msections[i].itemcount/16.0f)*18); + width = restrict_flt(msections[i].itemcount*31, 0, 16*31); + //clearrect(vid_buf, -1, -1, XRES+1, YRES+MENUSIZE+1); + h = -1; + x = XRES-BARSIZE-26; + y = (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-(height/2)+(FONT_H/2)+1; + sy = y; + //clearrect(vid_buf, (XRES-BARSIZE-width)+1, y-4, width+4, height+4+rows); + fillrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 0, 0, 0, 100); + drawrect(vid_buf, (XRES-BARSIZE-width)-7, y-10, width+16, height+16+rows, 255, 255, 255, 255); + fillrect(vid_buf, (XRES-BARSIZE)+11, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 15, FONT_H+3, 0, 0, 0, 100); + drawrect(vid_buf, (XRES-BARSIZE)+10, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-2, 16, FONT_H+3, 255, 255, 255, 255); + drawrect(vid_buf, (XRES-BARSIZE)+9, (((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2))-1, 1, FONT_H+1, 0, 0, 0, 255); + if(i==SC_WALL){ + for(n = 122; n<122+UI_WALLCOUNT; n++){ + if(n!=SPC_AIR&&n!=SPC_HEAT&&n!=SPC_COOL&&n!=SPC_VACUUM){ + if(x-26<=60){ + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } else if(i==SC_SPECIAL){ + for(n = 122; n<122+UI_WALLCOUNT; n++){ + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM){ + if(x-26<=60){ + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(mx>=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } else { + for(n = 0; n=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1){ + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy+height+10, (char *)msections[i].name, 255, 255, 255, 255); + } else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy+height+10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } else { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy+height+10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + memcpy(vid_buf, old_vid, ((XRES+BARSIZE)*(YRES+MENUSIZE))*PIXELSIZE); + if(!(mx>=(XRES-BARSIZE-width)-7 && my>=sy-10 && my=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } else if(i==SC_SPECIAL){ + for(n = 122; n<122+UI_WALLCOUNT; n++){ + if(n==SPC_AIR||n==SPC_HEAT||n==SPC_COOL||n==SPC_VACUUM){ + if(x-26<=20){ + x = XRES-BARSIZE-26; + y += 19; + } + x -= draw_tool_xy(vid_buf, x, y, n, mwalls[n-122].colour)+5; + if(!bq && mx>=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + for(n = 0; n=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } else { + for(n = 0; n=x+32 && mx=y && my< y+15){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + h = n; + } else if(n==*sl){ + drawrect(vid_buf, x+30, y-1, 29, 17, 255, 0, 0, 255); + } else if(n==*sr){ + drawrect(vid_buf, x+30, y-1, 29, 17, 0, 0, 255, 255); + } + } + } + } + + if(h==-1){ + drawtext(vid_buf, XRES-textwidth((char *)msections[i].name)-BARSIZE, sy-10, (char *)msections[i].name, 255, 255, 255, 255); + } else if(i==SC_WALL||(i==SC_SPECIAL&&h>=122)) { + drawtext(vid_buf, XRES-textwidth((char *)mwalls[h-122].descs)-BARSIZE, sy-10, (char *)mwalls[h-122].descs, 255, 255, 255, 255); + } else { + drawtext(vid_buf, XRES-textwidth((char *)ptypes[h].descs)-BARSIZE, sy-10, (char *)ptypes[h].descs, 255, 255, 255, 255); + } + + if(b==1&&h!=-1){ + *sl = h; + } + if(b==4&&h!=-1){ + *sr = h; + } + } + +int create_parts(int x, int y, int r, int c) +{ + int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0; //n; + + if(c == 125) { + i = x / CELL; + j = y / CELL; + for(v=-1;v<2;v++) + for(u=-1;u<2;u++) + if(i+u>=0 && i+u=0 && j+v=0&&ox=0&&oyabs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) { + y += sy; + if(c==135 || c==140 || c==134 || c==133 || c==132 || c==131 || c==129 || c==128 || c==127 || c==125 || c==124 || c==123 || c==122 || !r) { + if(cp) + create_parts(y, x, r, c); + else + create_parts(x, y, r, c); + } + e -= 1.0f; + } + } +} + +void create_box(int x1, int y1, int x2, int y2, int c) +{ + int i, j; + if(x1>x2) { + i = x2; + x2 = x1; + x1 = i; + } + if(y1>y2) { + j = y2; + y2 = y1; + y1 = j; + } + for(j=y1; j<=y2; j++) + for(i=x1; i<=x2; i++) + create_parts(i, j, 1, c); +} + +int flood_parts(int x, int y, int c, int cm, int bm) +{ + int x1, x2, dy = (c=122&&c<=122+UI_WALLCOUNT){ + c = c-100; + } + if(cm==-1) { + if(c==0) { + cm = pmap[y][x]&0xFF; + if(!cm) + return 0; + } else + cm = 0; + } + if(bm==-1) { + if(c==30) { + bm = bmap[y/CELL][x/CELL]; + if(!bm) + return 0; + if(bm==1) + cm = 0xFF; + } else + bm = 0; + } + + if((pmap[y][x]&0xFF)!=cm || bmap[y/CELL][x/CELL]!=bm) + return 1; + + // go left as far as possible + x1 = x2 = x; + while(x1>=CELL) { + if((pmap[y][x1-1]&0xFF)!=cm || bmap[y/CELL][(x1-1)/CELL]!=bm) + break; + x1--; + } + while(x2=CELL+dy) + for(x=x1; x<=x2; x++) + if((pmap[y-dy][x]&0xFF)==cm && bmap[(y-dy)/CELL][x/CELL]==bm) + if(!flood_parts(x, y-dy, co, cm, bm)) + return 0; + if(y=XRES || y>=YRES) + return; + c = vid[y*(XRES+BARSIZE)+x]; + c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); + if(c<512) + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); + else + vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); +} + +void xor_line(int x1, int y1, int x2, int y2, pixel *vid) +{ + int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + if(dx) + de = dy/(float)dx; + else + de = 0.0f; + y = y1; + sy = (y1= 0.5f) { + y += sy; + e -= 1.0f; + } + } +} + +void draw_svf_ui(pixel *vid_buf) +{ + int c; + + drawtext(vid_buf, 4, YRES+(MENUSIZE-14), "\x81", 255, 255, 255, 255); + drawrect(vid_buf, 1, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + c = svf_open ? 255 : 128; + drawtext(vid_buf, 23, YRES+(MENUSIZE-14), "\x91", c, c, c, 255); + drawrect(vid_buf, 19, YRES+(MENUSIZE-16), 16, 14, c, c, c, 255); + + c = svf_login ? 255 : 128; + drawtext(vid_buf, 40, YRES+(MENUSIZE-14), "\x82", c, c, c, 255); + if(svf_open) + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), svf_name, c, c, c, 255); + else + drawtext(vid_buf, 58, YRES+(MENUSIZE-12), "[untitled simulation]", c, c, c, 255); + drawrect(vid_buf, 37, YRES+(MENUSIZE-16), 150, 14, c, c, c, 255); + if(svf_open && svf_own) + drawdots(vid_buf, 55, YRES+(MENUSIZE-15), 12, c, c, c, 255); + + c = (svf_login && svf_open) ? 255 : 128; + + drawrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + drawrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, c, c, c, 255); + + if(svf_myvote==1 && (svf_login && svf_open)){ + fillrect(vid_buf, 189, YRES+(MENUSIZE-16), 14, 14, 0, 108, 10, 255); + } else if(svf_myvote==-1 && (svf_login && svf_open)){ + fillrect(vid_buf, 203, YRES+(MENUSIZE-16), 14, 14, 108, 10, 0, 255); + } + + drawtext(vid_buf, 192, YRES+(MENUSIZE-12), "\xCB", 0, 187, 18, c); + drawtext(vid_buf, 205, YRES+(MENUSIZE-14), "\xCA", 187, 40, 0, c); + + drawtext(vid_buf, 222, YRES+(MENUSIZE-15), "\x83", c, c, c, 255); + if(svf_tags[0]) + drawtextmax(vid_buf, 240, YRES+(MENUSIZE-12), 154, svf_tags, c, c, c, 255); + else + drawtext(vid_buf, 240, YRES+(MENUSIZE-12), "[no tags set]", c, c, c, 255); + +#ifdef HEAT_ENABLE + drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-380, 14, c, c, c, 255); +#else + drawrect(vid_buf, 219, YRES+(MENUSIZE-16), XRES+BARSIZE-364, 14, c, c, c, 255); +#endif + + drawtext(vid_buf, XRES-139+BARSIZE/*371*/, YRES+(MENUSIZE-14), "\x92", 255, 255, 255, 255); + drawrect(vid_buf, XRES-143+BARSIZE/*367*/, YRES+(MENUSIZE-16), 16, 14, 255, 255, 255, 255); + + drawtext(vid_buf, XRES-122+BARSIZE/*388*/, YRES+(MENUSIZE-13), "\x84", 255, 255, 255, 255); + if(svf_login) + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), svf_user, 255, 255, 255, 255); + else + drawtext(vid_buf, XRES-104+BARSIZE/*406*/, YRES+(MENUSIZE-12), "[sign in]", 255, 255, 255, 255); + drawrect(vid_buf, XRES-125+BARSIZE/*385*/, YRES+(MENUSIZE-16), 91, 14, 255, 255, 255, 255); + + if(sys_pause) { + fillrect(vid_buf, XRES-17+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 0, 0, 0, 255); + } else { + drawtext(vid_buf, XRES-14+BARSIZE/*496*/, YRES+(MENUSIZE-14), "\x90", 255, 255, 255, 255); + drawrect(vid_buf, XRES-16+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } + +#ifdef HEAT_ENABLE + if(!legacy_enable) { + fillrect(vid_buf, XRES-160+BARSIZE/*493*/, YRES+(MENUSIZE-17), 16, 16, 255, 255, 255, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 0, 0, 0, 255); + } else { + drawtext(vid_buf, XRES-154+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + drawrect(vid_buf, XRES-159+BARSIZE/*494*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + } +#endif + + switch(cmode) { + case 0: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x98", 128, 160, 255, 255); + break; + case 1: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x99", 255, 212, 32, 255); + break; + case 2: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9A", 212, 212, 212, 255); + break; + case 3: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9B", 255, 0, 0, 255); + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\x9C", 255, 255, 64, 255); + break; + case 4: + drawtext(vid_buf, XRES-29+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBF", 55, 255, 55, 255); + break; +#ifdef HEAT_ENABLE + case 5: + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBE", 255, 0, 0, 255); + drawtext(vid_buf, XRES-27+BARSIZE/*481*/, YRES+(MENUSIZE-13), "\xBD", 255, 255, 255, 255); + break; +#endif + } + drawrect(vid_buf, XRES-32+BARSIZE/*478*/, YRES+(MENUSIZE-16), 14, 14, 255, 255, 255, 255); + + if(svf_admin) { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 232, 127, 35, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC8", 255, 255, 255, 255); + } else if(svf_mod) { + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC9", 35, 127, 232, 255); + drawtext(vid_buf, XRES-45+BARSIZE/*463*/, YRES+(MENUSIZE-14), "\xC7", 255, 255, 255, 255); + }//else if(amd) + // drawtext(vid_buf, XRES-45/*465*/, YRES+(MENUSIZE-15), "\x97", 0, 230, 153, 255); Why is this here? +} + +typedef struct ui_edit { + int x, y, w, nx; + char str[256],*def; + int focus, cursor, hide; +} ui_edit; +void ui_edit_draw(pixel *vid_buf, ui_edit *ed) +{ + int cx, i; + char echo[256], *str; + + if(ed->hide) { + for(i=0;ed->str[i];i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } else + str = ed->str; + + if(ed->str[0]) { + drawtext(vid_buf, ed->x, ed->y, str, 255, 255, 255, 255); + drawtext(vid_buf, ed->x+ed->w-11, ed->y-1, "\xAA", 128, 128, 128, 255); + } else if(!ed->focus) + drawtext(vid_buf, ed->x, ed->y, ed->def, 128, 128, 128, 255); + if(ed->focus) { + cx = textnwidth(str, ed->cursor); + for(i=-3; i<9; i++) + drawpixel(vid_buf, ed->x+cx, ed->y+i, 255, 255, 255, 255); + } +} +char *shift_0="`1234567890-=[]\\;',./"; +char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; +void ui_edit_process(int mx, int my, int mb, ui_edit *ed) +{ + char ch, ts[2], echo[256], *str; + int l, i; +#ifdef RAWINPUT + char *p; +#endif + + if(mb) { + if(ed->hide) { + for(i=0;ed->str[i];i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } else + str = ed->str; + + if(mx>=ed->x+ed->w-11 && mxx+ed->w && my>=ed->y-5 && myy+11) { + ed->focus = 1; + ed->cursor = 0; + ed->str[0] = 0; + } else if(mx>=ed->x-ed->nx && mxx+ed->w && my>=ed->y-5 && myy+11) { + ed->focus = 1; + ed->cursor = textwidthx(str, mx-ed->x); + } else + ed->focus = 0; + } + if(ed->focus && sdl_key) { + if(ed->hide) { + for(i=0;ed->str[i];i++) + echo[i] = 0x8D; + echo[i] = 0; + str = echo; + } else + str = ed->str; + + l = strlen(ed->str); + switch(sdl_key) { + case SDLK_HOME: + ed->cursor = 0; + break; + case SDLK_END: + ed->cursor = l; + break; + case SDLK_LEFT: + if(ed->cursor > 0) + ed->cursor --; + break; + case SDLK_RIGHT: + if(ed->cursor < l) + ed->cursor ++; + break; + case SDLK_DELETE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) + ed->str[ed->cursor] = 0; + else if(ed->cursor < l) + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + break; + case SDLK_BACKSPACE: + if(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL)) { + if(ed->cursor > 0) + memmove(ed->str, ed->str+ed->cursor, l-ed->cursor+1); + ed->cursor = 0; + } else if(ed->cursor > 0) { + ed->cursor--; + memmove(ed->str+ed->cursor, ed->str+ed->cursor+1, l-ed->cursor); + } + break; + default: +#ifdef RAWINPUT + if(sdl_key>=SDLK_SPACE && sdl_key<=SDLK_z && l<255) { + ch = sdl_key; + if((sdl_mod & (KMOD_LSHIFT|KMOD_RSHIFT|KMOD_CAPS))) { + if(ch>='a' && ch<='z') + ch &= ~0x20; + p = strchr(shift_0, ch); + if(p) + ch = shift_1[p-shift_0]; + } + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#else + if(sdl_ascii>=' ' && sdl_ascii<127) { + ch = sdl_ascii; + ts[0]=ed->hide?0x8D:ch; + ts[1]=0; + if(textwidth(str)+textwidth(ts) > ed->w-14) + break; + memmove(ed->str+ed->cursor+1, ed->str+ed->cursor, l+1-ed->cursor); + ed->str[ed->cursor] = ch; + ed->cursor++; + } +#endif + break; + } + } +} + typedef struct ui_checkbox { + int x, y; + int focus, checked; + } ui_checkbox; + void ui_checkbox_draw(pixel *vid_buf, ui_checkbox *ed) + { + int w = 12; + if(ed->checked) { + drawtext(vid_buf, ed->x+2, ed->y+2, "\xCF", 128, 128, 128, 255); + } + if(ed->focus){ + drawrect(vid_buf, ed->x, ed->y, w, w, 255, 255, 255, 255); + } else { + drawrect(vid_buf, ed->x, ed->y, w, w, 128, 128, 128, 255); + } + } + void ui_checkbox_process(int mx, int my, int mb, int mbq, ui_checkbox *ed) + { + int w = 12; + + if(mb && !mbq) { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w){ + ed->checked = (ed->checked)?0:1; + } + } else { + if(mx>=ed->x && mx<=ed->x+w && my>=ed->y && my<=ed->y+w){ + ed->focus = 1; + } else { + ed->focus = 0; + } + } + } + +void error_ui(pixel *vid_buf, int err, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + char *msg; + + msg = malloc(strlen(txt)+16); + if(err) + sprintf(msg, "%03d %s", err, txt); + else + sprintf(msg, "%s", txt); + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + if(err) + drawtext(vid_buf, x0+8, y0+8, "HTTP error:", 255, 64, 32, 255); + else + drawtext(vid_buf, x0+8, y0+8, "Error:", 255, 64, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Dismiss", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + free(msg); + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_ui(pixel *vid_buf, char *top, char *txt) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 160, 160, 255, 255); + drawtext(vid_buf, x0+8, y0+26, txt, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+44, 240, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } +} + +void info_box(pixel *vid_buf, char *msg) +{ + int w = textwidth(msg)+16; + int x0=(XRES-w)/2,y0=(YRES-24)/2; + + clearrect(vid_buf, x0-2, y0-2, w+4, 28); + drawrect(vid_buf, x0, y0, w, 24, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, msg, 192, 192, 240, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); +} + +int confirm_ui(pixel *vid_buf, char *top, char *msg, char *btn) +{ + int x0=(XRES-240)/2,y0=(YRES-MENUSIZE)/2,b=1,bq,mx,my; + int ret = 0; + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + clearrect(vid_buf, x0-2, y0-2, 244, 64); + drawrect(vid_buf, x0, y0, 240, 60, 192, 192, 192, 255); + drawtext(vid_buf, x0+8, y0+8, top, 255, 216, 32, 255); + drawtext(vid_buf, x0+8, y0+26, msg, 255, 255, 255, 255); + drawtext(vid_buf, x0+5, y0+49, "Cancel", 255, 255, 255, 255); + drawtext(vid_buf, x0+165, y0+49, btn, 255, 216, 32, 255); + drawrect(vid_buf, x0, y0+44, 160, 16, 192, 192, 192, 255); + drawrect(vid_buf, x0+160, y0+44, 80, 16, 192, 192, 192, 255); + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + if(b && !bq && mx>=x0+160 && mx=y0+44 && my<=y0+60) { + ret = 1; + break; + } + if(b && !bq && mx>=x0 && mx=y0+44 && my<=y0+60) + break; + + if(sdl_key==SDLK_RETURN) { + ret = 1; + break; + } + if(sdl_key==SDLK_ESCAPE) + break; + } + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + return ret; +} + +int execute_tagop(pixel *vid_buf, char *op, char *tag) +{ + int status; + char *result; + + char *names[] = {"ID", "Tag", NULL}; + char *parts[2]; + + char *uri = malloc(strlen(SERVER)+strlen(op)+36); + sprintf(uri, "http://" SERVER "/Tag.api?Op=%s", op); + + parts[0] = svf_id; + parts[1] = tag; + + result = http_multipart_post( + uri, + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + free(uri); + + if(status!=200) { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 1; + } + if(result && strncmp(result, "OK", 2)) { + error_ui(vid_buf, 0, result); + free(result); + return 1; + } + + if(result[2]) { + strncpy(svf_tags, result+3, 255); + svf_id[15] = 0; + } + + if(result) + free(result); + + return 0; +} + +struct strlist { + char *str; + struct strlist *next; +}; +void strlist_add(struct strlist **list, char *str) +{ + struct strlist *item = malloc(sizeof(struct strlist)); + item->str = mystrdup(str); + item->next = *list; + *list = item; +} +int strlist_find(struct strlist **list, char *str) +{ + struct strlist *item; + for(item=*list;item;item=item->next) + if(!strcmp(item->str, str)) + return 1; + return 0; +} +void strlist_free(struct strlist **list) +{ + struct strlist *item; + while(*list) { + item = *list; + *list = (*list)->next; + free(item); + } +} + +void tag_list_ui(pixel *vid_buf) +{ + int y,d,x0=(XRES-192)/2,y0=(YRES-256)/2,b=1,bq,mx,my,vp,vn; + char *p,*q,s; + char *tag=NULL, *op=NULL; + ui_edit ed; + struct strlist *vote=NULL,*down=NULL; + + ed.x = x0+25; + ed.y = y0+221; + ed.w = 158; + ed.nx = 1; + ed.def = "[new tag]"; + ed.focus = 0; + ed.hide = 0; + ed.cursor = 0; + strcpy(ed.str, ""); + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + op = tag = NULL; + + drawrect(vid_buf, x0, y0, 192, 256, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 256); + drawtext(vid_buf, x0+8, y0+8, "Current tags:", 255, 255, 255, 255); + p = svf_tags; + s = svf_tags[0] ? ' ' : 0; + y = 36 + y0; + while(s) { + q = strchr(p, ' '); + if(!q) + q = p+strlen(p); + s = *q; + *q = 0; + if(svf_own || svf_admin || svf_mod) { + drawtext(vid_buf, x0+20, y-1, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+20, y-1, "\x85", 255, 255, 255, 255); + d = 14; + if(b && !bq && mx>=x0+18 && mx=y-2 && my=x0+d+18 && mx=y-2 && my=x0+d+32 && mx=y-2 && my=x0 && mx<=x0+192 && my>=y0+240 && my=x0+9 && mx=y0+218 && my=x0+9 && mx=y0+22 && my=x0 && mx=y0+74+YRES/4 && my=x0+9 && mx=y0+22 && my=x0+9 && mx=y0+42 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(sdl_key==SDLK_RETURN || sdl_key==SDLK_TAB) { + if(!ed1.focus) + break; + ed1.focus = 0; + ed2.focus = 1; + } + if(sdl_key==SDLK_ESCAPE) { + if(!ed1.focus && !ed2.focus) + return; + ed1.focus = 0; + ed2.focus = 0; + } + } + + strcpy(svf_user, ed1.str); + md5_ascii(svf_pass, (unsigned char *)ed2.str, 0); + + res = http_multipart_post( + "http://" SERVER "/Login.api", + NULL, NULL, NULL, + svf_user, svf_pass, + &err, NULL); + if(err != 200) { + error_ui(vid_buf, err, http_ret_text(err)); + if(res) + free(res); + goto fail; + } + if(res && !strncmp(res, "OK", 2)) { + if(!strcmp(res, "OK ADMIN")){ + svf_admin = 1; + svf_mod = 0; + } else if(!strcmp(res, "OK MOD")){ + svf_admin = 0; + svf_mod = 1; + } else { + svf_admin = 0; + svf_mod = 0; + } + free(res); + svf_login = 1; + return; + } + if(!res) + res = mystrdup("Unspecified Error"); + error_ui(vid_buf, 0, res); + free(res); + +fail: + strcpy(svf_user, ""); + strcpy(svf_pass, ""); + svf_login = 0; + svf_own = 0; + svf_admin = 0; + svf_mod = 0; +} + +void execute_delete(pixel *vid_buf, char *id) +{ + int status; + char *result; + + char *names[] = {"ID", NULL}; + char *parts[1]; + + parts[0] = id; + + result = http_multipart_post( + "http://" SERVER "/Delete.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return; + } + if(result && strncmp(result, "OK", 2)) { + error_ui(vid_buf, 0, result); + free(result); + return; + } + + if(result) + free(result); +} + +int execute_vote(pixel *vid_buf, char *id, char *action) +{ + int status; + char *result; + + char *names[] = {"ID", "Action", NULL}; + char *parts[2]; + + parts[0] = id; + parts[1] = action; + + result = http_multipart_post( + "http://" SERVER "/Vote.api", + names, parts, NULL, + svf_user, svf_pass, + &status, NULL); + + if(status!=200) { + error_ui(vid_buf, status, http_ret_text(status)); + if(result) + free(result); + return 0; + } + if(result && strncmp(result, "OK", 2)) { + error_ui(vid_buf, 0, result); + free(result); + return 0; + } + + if(result) + free(result); + return 1; +} + +static char hex[] = "0123456789ABCDEF"; +void strcaturl(char *dst, char *src) +{ + char *d; + unsigned char *s; + + for(d=dst; *d; d++) ; + + for(s=(unsigned char *)src; *s; s++) { + if((*s>='0' && *s<='9') || + (*s>='a' && *s<='z') || + (*s>='A' && *s<='Z')) + *(d++) = *s; + else { + *(d++) = '%'; + *(d++) = hex[*s>>4]; + *(d++) = hex[*s&15]; + } + } + *d = 0; +} + +#define THUMB_CACHE_SIZE 256 + +char *thumb_cache_id[THUMB_CACHE_SIZE]; +void *thumb_cache_data[THUMB_CACHE_SIZE]; +int thumb_cache_size[THUMB_CACHE_SIZE]; +int thumb_cache_lru[THUMB_CACHE_SIZE]; + +void thumb_cache_inval(char *id) +{ + int i,j; + for(i=0;i= THUMB_CACHE_SIZE) + return; + free(thumb_cache_id[i]); + free(thumb_cache_data[i]); + thumb_cache_id[i] = NULL; + for(j=0;j thumb_cache_lru[i]) + thumb_cache_lru[j]--; +} +void thumb_cache_add(char *id, void *thumb, int size) +{ + int i,m=-1,j=-1; + thumb_cache_inval(id); + for(i=0;i m) { + m = thumb_cache_lru[i]; + j = i; + } + } + if(i >= THUMB_CACHE_SIZE) { + thumb_cache_inval(thumb_cache_id[j]); + i = j; + } + for(j=0;j= THUMB_CACHE_SIZE) + return 0; + for(j=0;j=GRID_X*GRID_Y) + break; + if(votes) { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } else { + pu = strchr(str+5, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str+5); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } else if(!strncmp(str, "TAG ", 4)) { + if(j >= TAG_MAX) { + str = p; + continue; + } + q = strchr(str+4, ' '); + if(!q) { + str = p; + continue; + } + *(q++) = 0; + tag_names[j] = mystrdup(str+4); + tag_votes[j] = atoi(q); + j++; + } else { + if(i>=GRID_X*GRID_Y) + break; + if(votes) { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + s = strchr(pu, ' '); + if(!s) + return i; + *(s++) = 0; + vu = strchr(s, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } else { + pu = strchr(str, ' '); + if(!pu) + return i; + *(pu++) = 0; + vu = strchr(pu, ' '); + if(!vu) + return i; + *(vu++) = 0; + vd = strchr(vu, ' '); + if(!vd) + return i; + *(vd++) = 0; + q = strchr(vd, ' '); + } + if(!q) + return i; + *(q++) = 0; + r = strchr(q, ' '); + if(!r) + return i; + *(r++) = 0; + search_ids[i] = mystrdup(str); + + search_publish[i] = atoi(pu); + search_scoreup[i] = atoi(vu); + search_scoredown[i] = atoi(vd); + + search_owners[i] = mystrdup(q); + search_names[i] = mystrdup(r); + + if(s) + search_votes[i] = atoi(s); + thumb_cache_find(str, search_thumbs+i, search_thsizes+i); + i++; + } + str = p; + } + if(*str) + i++; + return i; +} + +#define IMGCONNS 3 +#define TIMEOUT 100 +#define HTTP_TIMEOUT 10 + +int search_own = 0; +int search_date = 0; +int search_page = 0; +char search_expr[256] = ""; + +int search_ui(pixel *vid_buf) +{ + int uih=0,nyu,nyd,b=1,bq,mx=0,my=0,mxq=0,myq=0,mmt=0,gi,gj,gx,gy,pos,i,mp,dp,own,last_own=search_own,page_count=0,last_page=0,last_date=0,j,w,h,st=0,lv; + int is_p1=0, exp_res=GRID_X*GRID_Y, tp, view_own=0; + float ry; + time_t http_last_use=HTTP_TIMEOUT; + ui_edit ed; + + + void *http = NULL; + int active = 0; + char *last = NULL; + int search = 0; + int lasttime = TIMEOUT; + char *uri; + int status; + char *results; + char *tmp, ts[64]; + + void *img_http[IMGCONNS]; + char *img_id[IMGCONNS]; + void *thumb, *data; + int thlen, dlen; + + memset(img_http, 0, sizeof(img_http)); + memset(img_id, 0, sizeof(img_id)); + + memset(search_ids, 0, sizeof(search_ids)); + memset(search_names, 0, sizeof(search_names)); + memset(search_scoreup, 0, sizeof(search_scoreup)); + memset(search_scoredown, 0, sizeof(search_scoredown)); + memset(search_publish, 0, sizeof(search_publish)); + memset(search_owners, 0, sizeof(search_owners)); + memset(search_thumbs, 0, sizeof(search_thumbs)); + memset(search_thsizes, 0, sizeof(search_thsizes)); + + do_open = 0; + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = 65; + ed.y = 13; + ed.w = XRES-200; + ed.nx = 1; + ed.def = "[search terms]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(search_expr); + strcpy(ed.str, search_expr); + + sdl_wheel = 0; + + while(!sdl_poll()) { + uih = 0; + bq = b; + mxq = mx; + myq = my; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + if(mx!=mxq || my!=myq || sdl_wheel || b) + mmt = 0; + else if(mmt 9) { + drawtext(vid_buf, XRES-15, YRES+MENUSIZE-16, "\x95", 255, 255, 255, 255); + drawrect(vid_buf, XRES-18, YRES+MENUSIZE-20, 16, 16, 255, 255, 255, 255); + } + + ui_edit_draw(vid_buf, &ed); + + if((b && !bq && mx>=1 && mx<=17 && my>=YRES+MENUSIZE-20 && my0) { + if(search_page) { + search_page --; + lasttime = TIMEOUT; + } + sdl_wheel = 0; + uih = 1; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-20 && myexp_res) { + lasttime = TIMEOUT; + search_page ++; + page_count = exp_res; + } + sdl_wheel = 0; + uih = 1; + } + + tp = -1; + if(is_p1) { + drawtext(vid_buf, (XRES-textwidth("Popular tags:"))/2, 31, "Popular tags:", 255, 192, 64, 255); + for(gj=0;gj<((GRID_Y-GRID_P)*YRES)/(GRID_Y*14);gj++) + for(gi=0;giTAG_MAX || !tag_names[pos]) + break; + if(tag_votes[0]) + i = 127+(128*tag_votes[pos])/tag_votes[0]; + else + i = 192; + w = textwidth(tag_names[pos]); + if(w>XRES/GRID_X-5) + w = XRES/GRID_X-5; + gx = (XRES/GRID_X)*gi; + gy = gj*14 + 46; + if(mx>=gx && mx=gy && my XRES/GRID_X-10) { + tmp = malloc(strlen(search_names[pos])+4); + strcpy(tmp, search_names[pos]); + j = textwidthx(tmp, XRES/GRID_X-15); + strcpy(tmp+j, "..."); + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(tmp)/2, gy+YRES/GRID_S+7, tmp, 192, 192, 192, 255); + free(tmp); + } else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-textwidth(search_names[pos])/2, gy+YRES/GRID_S+7, search_names[pos], 192, 192, 192, 255); + j = textwidth(search_owners[pos]); + if(mx>=gx+XRES/(GRID_S*2)-j/2 && mx<=gx+XRES/(GRID_S*2)+j/2 && + my>=gy+YRES/GRID_S+18 && my<=gy+YRES/GRID_S+31) { + st = 1; + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 160, 255); + } else + drawtext(vid_buf, gx+XRES/(GRID_S*2)-j/2, gy+YRES/GRID_S+20, search_owners[pos], 128, 128, 128, 255); + if(search_thumbs[pos]) + render_thumb(search_thumbs[pos], search_thsizes[pos], 1, vid_buf, gx, gy, GRID_S); + own = svf_login && (!strcmp(svf_user, search_owners[pos]) || svf_admin || svf_mod); + if(mx>=gx-2 && mx<=gx+XRES/GRID_S+3 && my>=gy-2 && my<=gy+YRES/GRID_S+30) + mp = pos; + if(own) { + if(mx>=gx+XRES/GRID_S-4 && mx<=gx+XRES/GRID_S+6 && my>=gy-6 && my<=gy+4) { + mp = -1; + dp = pos; + } + } + if(mp==pos && !st) + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 160, 160, 192, 255); + else + drawrect(vid_buf, gx-2, gy-2, XRES/GRID_S+3, YRES/GRID_S+3, 128, 128, 128, 255); + if(own) { + if(dp == pos) + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 255, 48, 32, 255); + else + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, gx+XRES/GRID_S-4, gy-6, "\x85", 255, 255, 255, 255); + } + if(!search_publish[pos]){ + drawtext(vid_buf, gx-6, gy-6, "\xCD", 255, 255, 255, 255); + drawtext(vid_buf, gx-6, gy-6, "\xCE", 212, 151, 81, 255); + } + if(view_own || svf_admin || svf_mod) { + sprintf(ts+1, "%d", search_votes[pos]); + ts[0] = 0xBB; + for(j=1; ts[j]; j++) + ts[j] = 0xBC; + ts[j-1] = 0xB9; + ts[j] = 0xBA; + ts[j+1] = 0; + w = gx+XRES/GRID_S-2-textwidth(ts); + h = gy+YRES/GRID_S-11; + drawtext(vid_buf, w, h, ts, 16, 72, 16, 255); + for(j=0; ts[j]; j++) + ts[j] -= 14; + drawtext(vid_buf, w, h, ts, 192, 192, 192, 255); + sprintf(ts, "%d", search_votes[pos]); + for(j=0; ts[j]; j++) + ts[j] += 127; + drawtext(vid_buf, w+3, h, ts, 255, 255, 255, 255); + } + if(search_scoreup[pos]>0||search_scoredown[pos]>0){ + lv = (search_scoreup[pos]>search_scoredown[pos]?search_scoreup[pos]:search_scoredown[pos]); + + if(((YRES/GRID_S+3)/2)>lv){ + ry = ((float)((YRES/GRID_S+3)/2)/(float)lv); + if(lv<8){ + ry = ry/(8-lv); + } + nyu = search_scoreup[pos]*ry; + nyd = search_scoredown[pos]*ry; + } else { + ry = ((float)lv/(float)((YRES/GRID_S+3)/2)); + nyu = search_scoreup[pos]/ry; + nyd = search_scoredown[pos]/ry; + } + + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 187, 40, 255); + fillrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 187, 40, 0, 255); + + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)-nyu, 4, nyu, 0, 107, 10, 255); + drawrect(vid_buf, gx-2+(XRES/GRID_S)+5, gy-2+((YRES/GRID_S+3)/2)+1, 4, nyd, 107, 10, 0, 255); + } + } + + if(mp!=-1 && mmt>=TIMEOUT/5 && !st) { + gi = mp % GRID_X; + gj = mp / GRID_X; + if(is_p1) + gj += GRID_Y-GRID_P; + gx = ((XRES/GRID_X)*gi) + (XRES/GRID_X-XRES/GRID_S)/2; + gy = (((YRES+15)/GRID_Y)*gj) + (YRES/GRID_Y-YRES/GRID_S+10)/2 + 18; + i = w = textwidth(search_names[mp]); + h = YRES/GRID_Z+30; + if(w=XRES-2) gx=XRES-3-w; + if(gy<32) gy=32; + if(gy+h>=YRES+(MENUSIZE-2)) gy=YRES+(MENUSIZE-3)-h; + clearrect(vid_buf, gx-2, gy-3, w+4, h); + drawrect(vid_buf, gx-2, gy-3, w+4, h, 160, 160, 192, 255); + if(search_thumbs[mp]) + render_thumb(search_thumbs[mp], search_thsizes[mp], 1, vid_buf, gx+(w-(XRES/GRID_Z))/2, gy, GRID_Z); + drawtext(vid_buf, gx+(w-i)/2, gy+YRES/GRID_Z+4, search_names[mp], 192, 192, 192, 255); + drawtext(vid_buf, gx+(w-textwidth(search_owners[mp]))/2, gy+YRES/GRID_Z+16, search_owners[mp], 128, 128, 128, 255); + } + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(sdl_key==SDLK_RETURN) { + if(!last || (!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page))) + lasttime = TIMEOUT; + else if(search_ids[0] && !search_ids[1]) { + bq = 0; + b = 1; + mp = 0; + } + } + if(sdl_key==SDLK_ESCAPE) + goto finish; + + if(b && !bq && mx>=XRES-64 && mx<=XRES-8 && my>=8 && my<=24 && svf_login) { + search_own = !search_own; + lasttime = TIMEOUT; + } + if(b && !bq && mx>=XRES-129 && mx<=XRES-65 && my>=8 && my<=24) { + search_date = !search_date; + lasttime = TIMEOUT; + } + + if(b && !bq && dp!=-1) + if(confirm_ui(vid_buf, "Do you want to delete?", search_names[dp], "Delete")) { + execute_delete(vid_buf, search_ids[dp]); + lasttime = TIMEOUT; + if(last) { + free(last); + last = NULL; + } + } + + if(b && !bq && tp!=-1) { + strncpy(ed.str, tag_names[tp], 255); + lasttime = TIMEOUT; + } + + if(b && !bq && mp!=-1 && st) { + sprintf(ed.str, "user:%s", search_owners[mp]); + lasttime = TIMEOUT; + } + + if(do_open==1){ + mp = 0; + } + + if((b && !bq && mp!=-1 && !st && !uih) || do_open==1) { + fillrect(vid_buf, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, 0, 0, 0, 255); + info_box(vid_buf, "Loading..."); + + uri = malloc(strlen(search_ids[mp])*3+strlen(SERVER)+64); + strcpy(uri, "http://" SERVER "/Get.api?Op=save&ID="); + strcaturl(uri, search_ids[mp]); + data = http_simple_get(uri, &status, &dlen); + free(uri); + + if(status == 200) { + status = parse_save(data, dlen, 1, 0, 0); + switch(status) { + case 1: + error_ui(vid_buf, 0, "Simulation corrupted"); + break; + case 2: + error_ui(vid_buf, 0, "Simulation from a newer version"); + break; + case 3: + error_ui(vid_buf, 0, "Simulation on a too large grid"); + break; + } + if(!status) { + char *tnames[] = {"ID", NULL}; + char *tparts[1]; + int tplens[1]; + if(svf_last) + free(svf_last); + svf_last = data; + svf_lsize = dlen; + + tparts[0] = search_ids[mp]; + tplens[0] = strlen(search_ids[mp]); + data = http_multipart_post("http://" SERVER "/Tags.api", tnames, tparts, tplens, svf_user, svf_pass, &status, NULL); + + svf_open = 1; + svf_own = svf_login && !strcmp(search_owners[mp], svf_user); + svf_publish = search_publish[mp] && svf_login && !strcmp(search_owners[mp], svf_user); + + strcpy(svf_id, search_ids[mp]); + strcpy(svf_name, search_names[mp]); + if(status == 200) { + if(data) { + strncpy(svf_tags, data, 255); + svf_tags[255] = 0; + } else + svf_tags[0] = 0; + } else { + svf_tags[0] = 0; + } + + if(svf_login){ + char *names[] = {"ID", NULL}; + char *parts[1]; + parts[0] = search_ids[mp]; + data = http_multipart_post("http://" SERVER "/Vote.api", names, parts, NULL, svf_user, svf_pass, &status, NULL); + if(status == 200){ + if(data){ + if(!strcmp(data, "Up")){ + svf_myvote = 1; + } else if(!strcmp(data, "Down")){ + svf_myvote = -1; + } else { + svf_myvote = 0; + } + } else { + svf_myvote = 0; + } + } else { + svf_myvote = 0; + } + } + } else { + svf_open = 0; + svf_publish = 0; + svf_own = 0; + svf_myvote = 0; + svf_id[0] = 0; + svf_name[0] = 0; + svf_tags[0] = 0; + if(svf_last) + free(svf_last); + svf_last = NULL; + } + } else + error_ui(vid_buf, status, http_ret_text(status)); + + if(data) + free(data); + goto finish; + } + + if(!last) + search = 1; + else if(!active && (strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date || last_page!=search_page)) { + search = 1; + if(strcmp(last, ed.str) || last_own!=search_own || last_date!=search_date) { + search_page = 0; + page_count = 0; + } + free(last); + last = NULL; + } else + search = 0; + + if(search && lasttime>=TIMEOUT) { + lasttime = 0; + last = mystrdup(ed.str); + last_own = search_own; + last_date = search_date; + last_page = search_page; + active = 1; + uri = malloc(strlen(last)*3+80+strlen(SERVER)+strlen(svf_user)); + if(search_own || svf_admin || svf_mod) + tmp = "&ShowVotes=true"; + else + tmp = ""; + if(!search_own && !search_date && !*last) { + if(search_page) { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", (search_page-1)*GRID_X*GRID_Y+GRID_X*GRID_P, exp_res+1, tmp); + } else { + exp_res = GRID_X*GRID_P; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d&t=%d%s&Query=", 0, exp_res+1, ((GRID_Y-GRID_P)*YRES)/(GRID_Y*14)*GRID_X, tmp); + } + } else { + exp_res = GRID_X*GRID_Y; + sprintf(uri, "http://" SERVER "/Search.api?Start=%d&Count=%d%s&Query=", search_page*GRID_X*GRID_Y, exp_res+1, tmp); + } + strcaturl(uri, last); + if(search_own) { + strcaturl(uri, " user:"); + strcaturl(uri, svf_user); + } + if(search_date) + strcaturl(uri, " sort:date"); + http = http_async_req_start(http, uri, NULL, 0, 1); + if(svf_login){ + http_auth_headers(http, svf_user, svf_pass); + } + http_last_use = time(NULL); + free(uri); + } + + if(active && http_async_req_status(http)) { + http_last_use = time(NULL); + results = http_async_req_stop(http, &status, NULL); + view_own = last_own; + if(status == 200) + page_count = search_results(results, last_own||svf_admin||svf_mod); + is_p1 = (exp_res < GRID_X*GRID_Y); + free(results); + active = 0; + } + + if(http && !active && (time(NULL)>http_last_use+HTTP_TIMEOUT)) { + http_async_req_close(http); + http = NULL; + } + + for(i=0;i=gx+XRES/GRID_S-4 && mx<(gx+XRES/GRID_S)+6 && my>=gy-6 && my=gx && mx=gy && my=1 && mx<=17 && my>=YRES+MENUSIZE-18 && my0) { + if(stamp_page) { + stamp_page --; + } + sdl_wheel = 0; + } + if((b && !bq && mx>=XRES-18 && mx<=XRES-1 && my>=YRES+MENUSIZE-18 && my 18) ? signs[i].y - 18 : signs[i].y + 4; +} + +void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) +{ + char t[2]; + t[0] = ch; + t[1] = 0; + if(flag) { + fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); + } else { + drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); + drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); + } +} + +void render_signs(pixel *vid_buf) +{ + int i, j, x, y, w, h, dx, dy; + for(i=0; i 18) ? -1 : 1; + for(j=0; j<4; j++) { + drawpixel(vid_buf, x, y, 192, 192, 192, 255); + x+=dx; + y+=dy; + } + } +} + +void add_sign_ui(pixel *vid_buf, int mx, int my) +{ + int i, w, h, x, y, nm=0, ju; + int x0=(XRES-192)/2,y0=(YRES-80)/2,b=1,bq; + ui_edit ed; + + // check if it is an existing sign + for(i=0; i=x && mx<=x+w && my>=y && my<=y+h) + break; + } + // else look for empty spot + if(i >= MAXSIGNS) { + nm = 1; + for(i=0; i= MAXSIGNS) + return; + + if(nm) { + signs[i].x = mx; + signs[i].y = my; + signs[i].ju = 1; + } + + while(!sdl_poll()) { + b = SDL_GetMouseState(&mx, &my); + if(!b) + break; + } + + ed.x = x0+25; + ed.y = y0+25; + ed.w = 158; + ed.nx = 1; + ed.def = "[message]"; + ed.focus = 1; + ed.hide = 0; + ed.cursor = strlen(signs[i].text); + strcpy(ed.str, signs[i].text); + ju = signs[i].ju; + + fillrect(vid_buf, -1, -1, XRES, YRES+MENUSIZE, 0, 0, 0, 192); + while(!sdl_poll()) { + bq = b; + b = SDL_GetMouseState(&mx, &my); + mx /= sdl_scale; + my /= sdl_scale; + + drawrect(vid_buf, x0, y0, 192, 80, 192, 192, 192, 255); + clearrect(vid_buf, x0, y0, 192, 80); + drawtext(vid_buf, x0+8, y0+8, nm ? "New sign:" : "Edit sign:", 255, 255, 255, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA1", 32, 64, 128, 255); + drawtext(vid_buf, x0+12, y0+23, "\xA0", 255, 255, 255, 255); + drawrect(vid_buf, x0+8, y0+20, 176, 16, 192, 192, 192, 255); + ui_edit_draw(vid_buf, &ed); + drawtext(vid_buf, x0+8, y0+46, "Justify:", 255, 255, 255, 255); + draw_icon(vid_buf, x0+50, y0+42, 0x9D, ju == 0); + draw_icon(vid_buf, x0+68, y0+42, 0x9E, ju == 1); + draw_icon(vid_buf, x0+86, y0+42, 0x9F, ju == 2); + + if(!nm) { + drawtext(vid_buf, x0+138, y0+45, "\x86", 160, 48, 32, 255); + drawtext(vid_buf, x0+138, y0+45, "\x85", 255, 255, 255, 255); + drawtext(vid_buf, x0+152, y0+46, "Delete", 255, 255, 255, 255); + drawrect(vid_buf, x0+134, y0+42, 50, 15, 255, 255, 255, 255); + } + + drawtext(vid_buf, x0+5, y0+69, "OK", 255, 255, 255, 255); + drawrect(vid_buf, x0, y0+64, 192, 16, 192, 192, 192, 255); + + sdl_blit(0, 0, (XRES+BARSIZE), YRES+MENUSIZE, vid_buf, (XRES+BARSIZE)); + + ui_edit_process(mx, my, b, &ed); + + if(b && !bq && mx>=x0+50 && mx<=x0+67 && my>=y0+42 && my<=y0+59) + ju = 0; + if(b && !bq && mx>=x0+68 && mx<=x0+85 && my>=y0+42 && my<=y0+59) + ju = 1; + if(b && !bq && mx>=x0+86 && mx<=x0+103 && my>=y0+42 && my<=y0+59) + ju = 2; + + if(b && !bq && mx>=x0+9 && mx=y0+22 && my=x0 && mx=y0+64 && my<=y0+80) + break; + + if(!nm && b && !bq && mx>=x0+134 && my>=y0+42 && mx<=x0+184 && my<=y0+59) { + signs[i].text[0] = 0; + return; + } + + if(sdl_key==SDLK_RETURN) + break; + if(sdl_key==SDLK_ESCAPE) { + if(!ed.focus) + return; + ed.focus = 0; + } + } + + strcpy(signs[i].text, ed.str); + signs[i].ju = ju; +} + +/*********************************************************** + * CONFIG FILE * + ***********************************************************/ + +char http_proxy[256] = ""; + +void save_string(FILE *f, char *str) +{ + int li = strlen(str); + unsigned char lb[2]; + lb[0] = li; + lb[1] = li >> 8; + fwrite(lb, 2, 1, f); + fwrite(str, li, 1, f); +} + +int load_string(FILE *f, char *str, int max) +{ + int li; + unsigned char lb[2]; + fread(lb, 2, 1, f); + li = lb[0] | (lb[1] << 8); + if(li > max) { + str[0] = 0; + return 1; + } + fread(str, li, 1, f); + str[li] = 0; + return 0; +} + +unsigned char last_major=0, last_minor=0, update_flag=0; + +void save_presets(int do_update) +{ + FILE *f=fopen("powder.def", "wb"); + unsigned char sig[4] = {0x50, 0x44, 0x65, 0x66}; + unsigned char tmp = sdl_scale; + if(!f) + return; + fwrite(sig, 1, 4, f); + save_string(f, svf_user); + save_string(f, svf_pass); + fwrite(&tmp, 1, 1, f); + tmp = cmode; + fwrite(&tmp, 1, 1, f); + tmp = svf_admin; + fwrite(&tmp, 1, 1, f); + tmp = svf_mod; + fwrite(&tmp, 1, 1, f); + save_string(f, http_proxy); + tmp = SAVE_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = MINOR_VERSION; + fwrite(&tmp, 1, 1, f); + tmp = do_update; + fwrite(&tmp, 1, 1, f); + fclose(f); +} + +void load_presets(void) +{ + FILE *f=fopen("powder.def", "rb"); + unsigned char sig[4], tmp; + if(!f) + return; + fread(sig, 1, 4, f); + if(sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65 || sig[3]!=0x66){ + if(sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F){ + if(fseek(f, -3, SEEK_END)){ + remove("powder.def"); + return; + } + if(fread(sig, 1, 3, f) != 3){ + remove("powder.def"); + goto fail; + } + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; + } + fclose(f); + remove("powder.def"); + return; + } + if(load_string(f, svf_user, 63)) + goto fail; + if(load_string(f, svf_pass, 63)) + goto fail; + svf_login = !!svf_user[0]; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + sdl_scale = (tmp == 2) ? 2 : 1; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; +#ifdef HEAT_ENABLE + cmode = tmp%6; +#else + cmode = tmp%5; +#endif + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_admin = tmp; + if(fread(&tmp, 1, 1, f) != 1) + goto fail; + svf_mod = tmp; + if(load_string(f, http_proxy, 255)) + goto fail; + if(fread(sig, 1, 3, f) != 3) + goto fail; + last_major = sig[0]; + last_minor = sig[1]; + update_flag = sig[2]; +fail: + fclose(f); +} + +void dim_copy(pixel *dst, pixel *src) +{ + int i,r,g,b; + for(i=0;i0) + r--; + if(g>0) + g--; + if(b>0) + b--; + dst[i] = PIXRGB(r,g,b); + } +} + +unsigned int fire_alpha[CELL*3][CELL*3]; +void prepare_alpha(void) +{ + int x,y,i,j; + float temp[CELL*3][CELL*3]; + memset(temp, 0, sizeof(temp)); + for(x=0; x=0 && j+y>=0 && i+x4 ? r-4 : 0; + fire_g[j][i] = g>4 ? g-4 : 0; + fire_b[j][i] = b>4 ? b-4 : 0; + } +} + +int zoom_en = 0; +int zoom_x=(XRES-ZSIZE_D)/2, zoom_y=(YRES-ZSIZE_D)/2; +int zoom_wx=0, zoom_wy=0; +void render_zoom(pixel *img) +{ + int x, y, i, j; + pixel pix; + drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255); + drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255); + clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR); + for(j=0; jr*r || i*i+(j+1)*(j+1)>r*r)) { + xor_pixel(x+i, y+j, vid); + if(j) xor_pixel(x+i, y-j, vid); + if(i) xor_pixel(x-i, y+j, vid); + if(i&&j) xor_pixel(x-i, y-j, vid); + } + } else { + int tc; + c = (r/CELL) * CELL; + x = (x/CELL) * CELL; + y = (y/CELL) * CELL; + + tc = !((c%(CELL*2))==0); + + x -= c/2; + y -= c/2; + + x += tc*(CELL/2); + y += tc*(CELL/2); + + for(i=0; i2){ + pthread_t pth; + pthread_create(&pth,NULL,update_air_th,""); + } else { + update_air(); + } +#else + update_air(); +#endif + } + if(cmode==0 || cmode==1) { + draw_air(vid_buf); + } else if(cmode==2) { + memcpy(vid_buf, fire_bg, XRES*YRES*PIXELSIZE); + memset(vid_buf+(XRES*YRES), 0, ((XRES+BARSIZE)*YRES*PIXELSIZE)-(XRES*YRES*PIXELSIZE)); + } else { + memset(vid_buf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); + } + update_particles(vid_buf); + + if(cmode==2) { + if(!fire_fc) { + dim_copy(fire_bg, vid_buf); + } else { + memcpy(fire_bg, vid_buf, XRES*YRES*PIXELSIZE); + } + fire_fc = (fire_fc+1) % 3; + } + if(cmode==3||cmode==4) + render_fire(vid_buf); + + render_signs(vid_buf); + + //clearrect(vid_buf, 0, YRES, XRES, MENUSIZE); + memset(vid_buf+((XRES+BARSIZE)*YRES), 0, (PIXELSIZE*(XRES+BARSIZE))*MENUSIZE); + //memset(vid_buf+(x+1+(XRES+BARSIZE)*(y+i)), 0, PIXELSIZE*(w-1)); + clearrect(vid_buf, XRES-1, 0, BARSIZE+1, YRES); + + // Old Menu, you will be missed; but not forgotten :( + /* for(i=0; iSAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION) || (major==SAVE_VERSION && is_beta == 0)) + old_version = 1; +#else + if(sscanf(ver_data, "%d.%d", &major, &minor)==2) + if(major>SAVE_VERSION || (major==SAVE_VERSION && minor>MINOR_VERSION)) + old_version = 1; +#endif + free(ver_data); + } + http_ver_check = NULL; + } + do_check = (do_check+1) & 15; + } + + if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) + if(confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")){ + break; + } + //break; + if((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) { + if(load_mode) { + free(load_img); + free(load_data); + load_mode = 0; + load_data = NULL; + load_img = NULL; + } + if(it > 50) + it = 50; + if(sdl_key=='k' && stamps[1].name[0]) { + j = stamp_ui(vid_buf); + if(j>=0) + load_data = stamp_load(j, &load_size); + else + load_data = NULL; + } else + load_data = stamp_load(0, &load_size); + if(load_data) { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if(load_img) + load_mode = 1; + else + free(load_data); + } + } + if(sdl_key=='s') { + if(it > 50) + it = 50; + save_mode = 1; + } + if(sdl_key=='1'){ + set_cmode(0); + } + if(sdl_key=='2'){ + set_cmode(1); + } + if(sdl_key=='3'){ + set_cmode(2); + } + if(sdl_key=='4'){ + set_cmode(3); + } + if(sdl_key=='5'){ + set_cmode(4); + } + if(sdl_key=='6'){ + set_cmode(5); + } + if(sdl_key==SDLK_SPACE) + sys_pause = !sys_pause; + if(sdl_key=='p') + dump_frame(vid_buf, XRES, YRES, XRES); + if(sdl_key=='c') { +#ifdef HEAT_ENABLE + set_cmode((cmode+1) % 6); +#else + set_cmode((cmode+1) % 5); +#endif + if(it > 50) + it = 50; + } +#ifdef INTERNAL + if(sdl_key=='v') + vs = !vs; + if(vs) + dump_frame(vid_buf, XRES, YRES, XRES); +#endif + + if(sdl_wheel) { + if(sdl_zoom_trig==1){ + ZSIZE += sdl_wheel; + if(ZSIZE>32) + ZSIZE = 32; + if(ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + sdl_wheel = 0; + } else { + bs += sdl_wheel; + if(bs>16) + bs = 16; + if(bs<0) + bs = 0; + sdl_wheel = 0; + /*if(su >= PT_NUM) { + if(sl < PT_NUM) + su = sl; + if(sr < PT_NUM) + su = sr; + }*/ + } + } + + bq = b; + b = SDL_GetMouseState(&x, &y); + + for(i=0; i=sdl_scale*(XRES+1) && x= sdl_scale*(((YRES/SC_TOTAL)*i)+((YRES/SC_TOTAL)/2)-2) && y=sdl_scale*(XRES-2) && x= sdl_scale*((i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16)) && y=sdl_scale*zoom_wx && y>=sdl_scale*zoom_wy + && x0 && y0 && x>8)>=NPART || !cr)){ +#ifdef BETA + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C, Life: %d", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp, parts[cr>>8].life); +#else + sprintf(heattext, "%s, Pressure: %3.2f, Temp: %4.2f C", ptypes[cr&0xFF].name, pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL], parts[cr>>8].temp); +#endif + } else { + sprintf(heattext, "Empty, Pressure: %3.2f", pv[(y/sdl_scale)/CELL][(x/sdl_scale)/CELL]); + } + } +#endif + mx = x; + my = y; + if(update_flag) { + info_box(vid_buf, "Finalizing update..."); + if(last_major>SAVE_VERSION || (last_major==SAVE_VERSION && last_minor>=MINOR_VERSION)) { + update_cleanup(); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } else { + if(update_finish()) + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + else + info_ui(vid_buf, "Update success", "You have successfully updated the Powder Toy!"); + } + update_flag = 0; + } + + if(b && !bq && x>=(XRES-19-old_ver_len)*sdl_scale && + x<=(XRES-14)*sdl_scale && y>=(YRES-22)*sdl_scale && y<=(YRES-9)*sdl_scale && old_version) { + tmp = malloc(64); +#ifdef BETA + if(is_beta){ + sprintf(tmp, "Your version: %d (Beta %d), new version: %d (Beta %d).", SAVE_VERSION, MINOR_VERSION, major, minor); + } else { + sprintf(tmp, "Your version: %d (Beta %d), new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); + } +#else + sprintf(tmp, "Your version: %d.%d, new version: %d.%d.", SAVE_VERSION, MINOR_VERSION, major, minor); +#endif + if(confirm_ui(vid_buf, "Do you want to update The Powder Toy?", tmp, "Update")) { + free(tmp); + tmp = download_ui(vid_buf, my_uri, &i); + if(tmp) { + save_presets(1); + if(update_start(tmp, i)) { + update_cleanup(); + save_presets(0); + error_ui(vid_buf, 0, "Update failed - try downloading a new version."); + } else + return 0; + } + } else + free(tmp); + } + if(y>=sdl_scale*(YRES+(MENUSIZE-20))) { + if(x>=189*sdl_scale && x<=202*sdl_scale && svf_login && svf_open && svf_myvote==0){ + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } else if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0){ + db = svf_own ? 275 : 272; + if(da < 51) + da ++; + } else if(x>=189 && x<=217 && svf_login && svf_open && svf_myvote!=0){ + db = (svf_myvote==1) ? 273 : 274; + if(da < 51) + da ++; + } +#ifdef HEAT_ENABLE + else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-349))*sdl_scale) && svf_login && svf_open) { +#else + else if(x>=219*sdl_scale && x<=((XRES+BARSIZE-(510-365))*sdl_scale) && svf_login && svf_open) { +#endif + db = svf_own ? 257 : 256; + if(da < 51) + da ++; +#ifdef HEAT_ENABLE + } else if(x>=((XRES+BARSIZE-(510-351))*sdl_scale) && x<((XRES+BARSIZE-(510-366))*sdl_scale)) { + db = 270; + if(da < 51) + da ++; +#endif + } else if(x>=((XRES+BARSIZE-(510-367))*sdl_scale) && x<((XRES+BARSIZE-(510-383))*sdl_scale)) { + db = 266; + if(da < 51) + da ++; + } else if(x>=37*sdl_scale && x<=187*sdl_scale && svf_login) { + db = 259; + if(svf_open && svf_own && x<=55*sdl_scale) + db = 258; + if(da < 51) + da ++; + } else if(x>=((XRES+BARSIZE-(510-385))*sdl_scale) && x<=((XRES+BARSIZE-(510-476))*sdl_scale)) { + db = svf_login ? 261 : 260; + if(svf_admin) { + db = 268; + } else if(svf_mod) { + db = 271; + } + if(da < 51) + da ++; + } else if(x>=sdl_scale && x<=17*sdl_scale) { + db = 262; + if(da < 51) + da ++; + } else if(x>=((XRES+BARSIZE-(510-494))*sdl_scale) && x<=((XRES+BARSIZE-(510-509))*sdl_scale)) { + db = sys_pause ? 264 : 263; + if(da < 51) + da ++; + } else if(x>=((XRES+BARSIZE-(510-476))*sdl_scale) && x<=((XRES+BARSIZE-(510-491))*sdl_scale)) { + db = 267; + if(da < 51) + da ++; + } else if(x>=19*sdl_scale && x<=35*sdl_scale && svf_open) { + db = 265; + if(da < 51) + da ++; + } else if(da > 0) + da --; + } else + if(da > 0) + da --; + + if(!sdl_zoom_trig && zoom_en==1) + zoom_en = 0; + + if(sdl_key==Z_keysym && zoom_en==2) + zoom_en = 1; + + if(load_mode) { + load_x = CELL*((mx/sdl_scale-load_w/2+CELL/2)/CELL); + load_y = CELL*((my/sdl_scale-load_h/2+CELL/2)/CELL); + if(load_x+load_w>XRES) load_x=XRES-load_w; + if(load_y+load_h>YRES) load_y=YRES-load_h; + if(load_x<0) load_x=0; + if(load_y<0) load_y=0; + if(bq==1 && !b) { + parse_save(load_data, load_size, 0, load_x, load_y); + free(load_data); + free(load_img); + load_mode = 0; + } else if(bq==4 && !b) { + free(load_data); + free(load_img); + load_mode = 0; + } + } else if(save_mode==1) { + save_x = (mx/sdl_scale)/CELL; + save_y = (my/sdl_scale)/CELL; + if(save_x >= XRES/CELL) save_x = XRES/CELL-1; + if(save_y >= YRES/CELL) save_y = YRES/CELL-1; + save_w = 1; + save_h = 1; + if(b==1) + save_mode = 2; + else if(b==4) + save_mode = 0; + } else if(save_mode==2) { + save_w = (mx/sdl_scale+CELL/2)/CELL - save_x; + save_h = (my/sdl_scale+CELL/2)/CELL - save_y; + if(save_w>XRES/CELL) save_w = XRES/CELL; + if(save_h>YRES/CELL) save_h = YRES/CELL; + if(save_w<1) save_w = 1; + if(save_h<1) save_h = 1; + if(!b) { + stamp_save(save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + save_mode = 0; + } + } else if(sdl_zoom_trig && zoom_en<2) { + x /= sdl_scale; + y /= sdl_scale; + x -= ZSIZE/2; + y -= ZSIZE/2; + if(x<0) x=0; + if(y<0) y=0; + if(x>XRES-ZSIZE) x=XRES-ZSIZE; + if(y>YRES-ZSIZE) y=YRES-ZSIZE; + zoom_x = x; + zoom_y = y; + zoom_wx = (x 50) + it = 50; + x /= sdl_scale; + y /= sdl_scale; + if(y>=YRES+(MENUSIZE-20)) { + if(!lb) { + if(x>=189 && x<=202 && svf_login && svf_open && svf_myvote==0 && svf_own==0){ + if(execute_vote(vid_buf, svf_id, "Up")){ + svf_myvote = 1; + } + } + if(x>=204 && x<=217 && svf_login && svf_open && svf_myvote==0 && svf_own==0){ + if(execute_vote(vid_buf, svf_id, "Down")){ + svf_myvote = -1; + } + } +#ifdef HEAT_ENABLE + if(x>=219 && x<=(XRES+BARSIZE-(510-349)) && svf_login && svf_open) +#else + if(x>=219 && x<=(XRES+BARSIZE-(510-365)) && svf_login && svf_open) +#endif + tag_list_ui(vid_buf); +#ifdef HEAT_ENABLE + if(x>=(XRES+BARSIZE-(510-351)) && x<(XRES+BARSIZE-(510-366)) && !bq) { + legacy_enable = !legacy_enable; + } +#endif + if(x>=(XRES+BARSIZE-(510-367)) && x<=(XRES+BARSIZE-(510-383)) && !bq) { + memset(signs, 0, sizeof(signs)); + memset(pv, 0, sizeof(pv)); + memset(vx, 0, sizeof(vx)); + memset(vy, 0, sizeof(vy)); + memset(fvx, 0, sizeof(fvx)); + memset(fvy, 0, sizeof(fvy)); + memset(bmap, 0, sizeof(bmap)); + memset(emap, 0, sizeof(emap)); + memset(parts, 0, sizeof(particle)*NPART); + for(i=0; i=(XRES+BARSIZE-(510-385)) && x<=(XRES+BARSIZE-(510-476))) { + login_ui(vid_buf); + if(svf_login) + save_presets(0); + } + if(x>=37 && x<=187 && svf_login) { + if(!svf_open || !svf_own || x>51) { + if(save_name_ui(vid_buf)) + execute_save(vid_buf); + } else + execute_save(vid_buf); + while(!sdl_poll()) + if(!SDL_GetMouseState(&x, &y)) + break; + b = bq = 0; + } + if(x>=1 && x<=17) { + search_ui(vid_buf); + memset(fire_bg, 0, XRES*YRES*PIXELSIZE); + memset(fire_r, 0, sizeof(fire_r)); + memset(fire_g, 0, sizeof(fire_g)); + memset(fire_b, 0, sizeof(fire_b)); + } + if(x>=19 && x<=35 && svf_last && svf_open) + parse_save(svf_last, svf_lsize, 1, 0, 0); + if(x>=(XRES+BARSIZE-(510-476)) && x<=(XRES+BARSIZE-(510-491)) && !bq) { +#ifdef HEAT_ENABLE + if(b & SDL_BUTTON_LMASK) + set_cmode((cmode+1) % 6); + if(b & SDL_BUTTON_RMASK) + set_cmode((cmode+5) % 6); +#else + if(b & SDL_BUTTON_LMASK) + set_cmode((cmode+1) % 5); + if(b & SDL_BUTTON_RMASK) + set_cmode((cmode+4) % 5); +#endif + save_presets(0); + } + if(x>=(XRES+BARSIZE-(510-494)) && x<=(XRES+BARSIZE-(510-509)) && !bq) + sys_pause = !sys_pause; + lb = 0; + } + } else if(y=0 && ly>=0 && lx0 && y0 && x>8)>=NPART || !cr)){ + c = sl = cr&0xFF; + } else { + //Something + } + } + //create_parts(x, y, bs, SPC_AIR); + lx = x; + ly = y; + lb = 0; + lm = 0; + } else { + create_parts(x, y, bs, c); + lx = x; + ly = y; + lb = b; + lm = 0; + } + } + } + } else { + if(lb && lm) { + x /= sdl_scale; + y /= sdl_scale; + c = (lb&1) ? sl : sr; + su = c; + if(lm == 1) { + if(c!=127 || lx<0 || ly<0 || lx>=XRES || ly>=YRES || bmap[ly/CELL][lx/CELL]!=4) + create_line(lx, ly, x, y, bs, c); + } else + create_box(lx, ly, x, y, c); + lm = 0; + } + lb = 0; + } + + if(load_mode) { + draw_image(vid_buf, load_img, load_x, load_y, load_w, load_h, 128); + xor_rect(vid_buf, load_x, load_y, load_w, load_h); + } + + if(save_mode) { + xor_rect(vid_buf, save_x*CELL, save_y*CELL, save_w*CELL, save_h*CELL); + da = 51; + db = 269; + } + + if(zoom_en!=1 && !load_mode && !save_mode) + render_cursor(vid_buf, mx/sdl_scale, my/sdl_scale, su, bs); + + if(zoom_en) + render_zoom(vid_buf); + + if(da) + switch(db) { + case 256: + drawtext(vid_buf, 16, YRES-24, "Add simulation tags.", 255, 255, 255, da*5); + break; + case 257: + drawtext(vid_buf, 16, YRES-24, "Add and remove simulation tags.", 255, 255, 255, da*5); + break; + case 258: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under the current name.", 255, 255, 255, da*5); + break; + case 259: + drawtext(vid_buf, 16, YRES-24, "Save the simulation under a new name.", 255, 255, 255, da*5); + break; + case 260: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server.", 255, 255, 255, da*5); + break; + case 261: + drawtext(vid_buf, 16, YRES-24, "Sign into the Simulation Server under a new name.", 255, 255, 255, da*5); + break; + case 262: + drawtext(vid_buf, 16, YRES-24, "Find & open a simulation", 255, 255, 255, da*5); + break; + case 263: + drawtext(vid_buf, 16, YRES-24, "Pause the simulation", 255, 255, 255, da*5); + break; + case 264: + drawtext(vid_buf, 16, YRES-24, "Resume the simulation", 255, 255, 255, da*5); + break; + case 265: + drawtext(vid_buf, 16, YRES-24, "Reload the simulation", 255, 255, 255, da*5); + break; + case 266: + drawtext(vid_buf, 16, YRES-24, "Erase all particles and walls", 255, 255, 255, da*5); + break; + case 267: + drawtext(vid_buf, 16, YRES-24, "Change display mode", 255, 255, 255, da*5); + break; + case 268: + drawtext(vid_buf, 16, YRES-24, "Annuit C\245ptis", 255, 255, 255, da*5); + break; + case 269: + drawtext(vid_buf, 16, YRES-24, "Click-and-drag to specify a rectangle to copy (right click = cancel).", 255, 216, 32, da*5); + break; + case 270: + drawtext(vid_buf, 16, YRES-24, "Enable or disable compatability mode (disables heat simulation).", 255, 255, 255, da*5); + break; + case 271: + drawtext(vid_buf, 16, YRES-24, "You're a moderator", 255, 255, 255, da*5); + break; + case 272: + drawtext(vid_buf, 16, YRES-24, "Like/Dislike this save.", 255, 255, 255, da*5); + break; + case 273: + drawtext(vid_buf, 16, YRES-24, "You like this.", 255, 255, 255, da*5); + break; + case 274: + drawtext(vid_buf, 16, YRES-24, "You dislike this.", 255, 255, 255, da*5); + break; + case 275: + drawtext(vid_buf, 16, YRES-24, "You cannot vote on your own save.", 255, 255, 255, da*5); + break; + default: + drawtext(vid_buf, 16, YRES-24, (char *)ptypes[db].descs, 255, 255, 255, da*5); + } + if(itc) { + itc--; + drawtext(vid_buf, (XRES-textwidth(itc_msg))/2, ((YRES/2)-10), itc_msg, 255, 255, 255, itc>51?255:itc*5); + } + if(it) { + it--; + //if(fbi_img) + //draw_image(vid_buf, fbi_img, (XRES-FBI_W)/2, (YRES-FBI_H)/2+25, FBI_W, FBI_H, it>12?64:it*5); + drawtext(vid_buf, 16, 20, it_msg, 255, 255, 255, it>51?255:it*5); + } + + if(old_version) { + clearrect(vid_buf, XRES-21-old_ver_len, YRES-24, old_ver_len+9, 17); +#ifdef BETA + if(is_beta){ + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg_beta, 255, 216, 32, 255); + } else { + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); + } +#else + drawtext(vid_buf, XRES-16-old_ver_len, YRES-19, old_ver_msg, 255, 216, 32, 255); +#endif + drawrect(vid_buf, XRES-19-old_ver_len, YRES-22, old_ver_len+5, 13, 255, 216, 32, 255); + } + /*#ifdef MT + pthread_join(pth2,NULL); + #endif*/ + + if(hud_enable){ + currentTime = SDL_GetTicks(); + if(currentTime-past>=16) { + past = SDL_GetTicks(); + FPS++; + } + if(currentTime-pastFPS>=1000) { +#ifdef BETA + sprintf(uitext, "Version %d (Beta %d) FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#else + sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); +#endif + FPSB = FPS; + FPS = 0; + pastFPS = currentTime; + } +#ifdef HEAT_ENABLE + if(sdl_zoom_trig){ + if(x +#ifndef MACOSX +#include +#endif +#include + +#ifdef WIN32 +#include +#else +#include +#include +#endif +#ifdef MACOSX +#include +#include +#include +#endif + +#include "update.h" + +static char *exe_name(void) +{ +#if defined WIN32 + char *name= (char *)malloc(64), max=64, res; + while((res = (char)GetModuleFileName(NULL, name, max)) >= max) { +#elif defined MACOSX + char *fn=malloc(64),*name=malloc(PATH_MAX), max=64, res; + if(_NSGetExecutablePath(fn, &max) != 0) { + fn = realloc(fn, max); + _NSGetExecutablePath(fn, &max); + } + if(realpath(fn, name) == NULL) { + free(fn); + free(name); + return NULL; + } + res = 1; +#else + char fn[64], *name=malloc(64), max=64, res; + sprintf(fn, "/proc/self/exe"); + memset(name, 0, max); + while((res = readlink(fn, name, max)) >= max-1) { +#endif +#ifndef MACOSX + max *= 2; + name = realloc(name, max); + memset(name, 0, max); + } +#endif + if(res <= 0) { + free(name); + return NULL; + } + return name; +} + +int update_start(char *data, int len) +{ + char *self=exe_name(), *temp; +#ifdef WIN32 + char *p; +#endif + FILE *f; + int res = 1; + + if(!self) + return 1; + +#ifdef WIN32 + temp = malloc(strlen(self)+12); + strcpy(temp, self); + p = temp + strlen(temp) - 4; + if(_stricmp(p, ".exe")) + p += 4; + strcpy(p, "_update.exe"); + + if(!MoveFile(self, temp)) + goto fail; + + f = fopen(self, "wb"); + if(!f) + goto fail; + if(fwrite(data, 1, len, f) != len) { + fclose(f); + DeleteFile(self); + goto fail; + } + fclose(f); + + if((int)ShellExecute(NULL, "open", self, NULL, NULL, SW_SHOWNORMAL) <= 32) { + DeleteFile(self); + goto fail; + } + + return 0; +#else + temp = malloc(strlen(self)+8); + strcpy(temp, self); + strcat(temp, "-update"); + + f = fopen(temp, "w"); + if(!f) + goto fail; + if(fwrite(data, 1, len, f) != len) { + fclose(f); + unlink(temp); + goto fail; + } + fclose(f); + + if(chmod(temp, 0755)) { + unlink(temp); + goto fail; + } + + if(rename(temp, self)) { + unlink(temp); + goto fail; + } + + execl(self, "powder-update", NULL); +#endif + +fail: + free(temp); + free(self); + return res; +} + +int update_finish(void) +{ +#ifdef WIN32 + char *temp, *self=exe_name(), *p; + int timeout = 60, err; + + temp = malloc(strlen(self)+12); + strcpy(temp, self); + p = temp + strlen(temp) - 4; + if(_stricmp(p, ".exe")) + p += 4; + strcpy(p, "_update.exe"); + + while(!DeleteFile(temp)) { + err = GetLastError(); + if(err == ERROR_FILE_NOT_FOUND) { + // just as well, then + free(temp); + return 0; + } + Sleep(500); + timeout--; + if(timeout <= 0) { + free(temp); + return 1; + } + } + free(temp); +#endif + return 0; +} + +void update_cleanup(void) +{ +#ifdef WIN32 + update_finish(); +#endif +} diff --git a/update.h b/update.h new file mode 100755 index 000000000..6398d4d79 --- /dev/null +++ b/update.h @@ -0,0 +1,27 @@ +/** + * Powder Toy - Main source + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ +#ifndef UPDATE_H +#define UPDATE_H + +int update_start(char *data, int len); +int update_finish(void); +void update_cleanup(void); + +#endif diff --git a/version.h b/version.h new file mode 100755 index 000000000..64ce64e01 --- /dev/null +++ b/version.h @@ -0,0 +1,31 @@ +/** + * Powder Toy - Version (Header) + * + * Copyright (c) 2008 - 2010 Stanislaw Skowronek. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ +#ifndef VERSION_H +#define VERSION_H + +#define SAVE_VERSION 38 +#define MINOR_VERSION 0 +#define IDENT_VERSION "S" //Change this if you're not Simon! It should be a single letter. + +#define MENUV3 +//#define BETA +#define HEAT_ENABLE + +#endif