pax_global_header00006660000000000000000000000064132366037730014524gustar00rootroot0000000000000052 comment=68cbddecfd000458ca1bb28eb54a948f842ea6ba gmchess-0.29.6.3/000077500000000000000000000000001323660377300134145ustar00rootroot00000000000000gmchess-0.29.6.3/.gitignore000066400000000000000000000003661323660377300154110ustar00rootroot00000000000000*~ aclocal.m4 /autom4te.cache/* /po/*.mo /po/*.gmo /m4 *Makefile.in configure config.guess ltmain.sh depcomp install-sh compile missing config.sub config.status *Makefile config.h config.log stamp-h1 .deps libtool po/stamp-it po/POTFILES doc/*.6 gmchess-0.29.6.3/AUTHORS000066400000000000000000000001731323660377300144650ustar00rootroot00000000000000Main developer: lerosua@gmail.com xihes@gmail.com patch developer: aginobili@gmail.com gbreed@gmail.com 073plan@gmail.com gmchess-0.29.6.3/COPYING000066400000000000000000000431221323660377300144510ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, 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 Street, 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. gmchess-0.29.6.3/ChangeLog000066400000000000000000000077051323660377300151770ustar00rootroot000000000000002018-02-07 Boyuan Yang <073plan@gmail.com> * 清除所有 Autotools 产生的文件,编译时再生成。 * 转换部分 HTTP 链接为 HTTPS。 * 修复一个 cppcheck 发现的笔误,这可能修复了一个崩溃问题。 * 清理 cppcheck 发现的可能未初始化结构体。 * 准备 0.29.6.3 版本。 2018-01-30 Boyuan Yang <073plan@gmail.com> * 清理 lintian 提示,添加主窗口标题栏的翻译。 2018-01-29 Boyuan Yang <073plan@gmail.com> * 补充首选项的国际化和简体中文翻译。 * 修复某些原字符串表述不清晰的地方。 * 小型代码清理。 * 准备 0.29.6.2 版本。 2018-01-25 Boyuan Yang <073plan@gmail.com> * 添加 TODO 文件,记录后续需要做的事情。 * 刷新构建系统,添加所有先前应用的补丁。 * 清理默认构建时产生的所有warning。 * 从eleeye上游引擎代码处捡选一个补丁。 github.com/xqbase/eleeye/commit/f460861b1bff7a353d36f09f3610d4dd042d003e * 各类清理与语法错误修正。 * 准备 0.29.6.1 版本。 2010年 04月 08日 星期四 00:28:56 CST 网络走棋方式探讨: 先省略前面初始化等一大堆东西。想简单的,在棋面上选择完棋子,然后生成合法的走法mv 棋面走棋,然后发送mv给网络。网络得返回一个状态表示已经接受此走法,否则,此走法不成功。 如果是自己网络有问题,那么,数据发送不了,如果数据发送后才出问题,没收到检校,那可能会造成 还是已方问题,这是个bug,没有第三方监控。 自己发送数据不成功,一段时间内没有收到检校数据,则要重发数据。 对方收到已方走的棋,在棋面上走,并立即发送成功检校数据。然后又是棋面上走棋的流程。 2009年 10月 08日 星期四 11:55:56 CST 添加用户选择黑棋的功能,测试用。用反转棋盘的菜单打开。 2009年 10月 06日 星期二 19:24:42 CST 给首选项添加配置界面。 把配置目录改到 ~/.config/gmchess下面了 配置界面能保存大小,使用开局库,以及设置搜索深度了 尝试修正其它平台编译引擎的问题 2009年 08月 10日 星期一 20:14:27 CST 把libglade格式改成gtkbuilder格式,减少了libglademm的依赖 2009年 03月 27日 星期五 11:20:10 CST 发布了0.10,又再修补了几个bug,目前多兵的问题似乎解决了。还要等进一步测试 2009年 03月 24日 星期二 17:29:45 CST 修正一个炮位置的bug,增加了上/下一步时treeview的变化 添加了象眼软件里的转换棋谱函数,现在支持打开多种程序的棋谱格式,主要先将 它们转换成pgn再打开。看来这个月底可以发布一个版本,目前应该就是多兵的bug算是 严重的问题。 2009年 03月 22日 星期日 18:51:53 CST 继续修正着法的bug,刚修正马的着法的一个bug,po文件等基本准备好 2009年 03月 18日 星期三 22:44:12 CST 把eleeye引擎文件引进构建中 2009年 03月 17日 星期二 20:14:22 CST 把构建给搞定了,autoconf/automake 真是麻烦的东西 2009年 02月 26日 星期四 16:42:31 CST 中文纵线转iccs仍有bug,多兵在一纵线上没写,其它的士相的走也没测试。添加了界 面按钮,但获取最初界面那个也出了问题,问题一大堆啊 2009年 02月 25日 星期三 23:36:17 CST 很辛苦写的中文纵线转iccs,没完成不止,还出问题,特累人。而且可能还会有更多潜 在问题。哎。 2009年 02月 25日 星期三 11:44:00 CST 晕死,发现在中文纵线格式转化成iccs格式中特别麻烦,还要搞着法生成之类的, 因为要分清前中后的棋子类型,士相在同一位置中的辨别问题,马的走法问题等等。 2009年 02月 22日 星期日 01:36:08 CST 发现一个惊人的事实就是,memset设置内存的话,竟然有bug,出现过某位不为0的现象, 这是偶然还是啥?真是触目惊心啊。想想还是一个个给数组搞上0安全点 gmchess-0.29.6.3/Doxyfile000066400000000000000000001455101323660377300151300ustar00rootroot00000000000000# Doxyfile 1.5.2 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file that # follow. The default is UTF-8 which is also the encoding used for all text before # the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into # libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of # possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = gmchess # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 0.29.6.3 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = ./docs/ # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, # Italian, Japanese, Japanese-en (Japanese with English messages), Korean, # Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, # Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = Chinese # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to # include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ./src/ # This tag can be used to specify the character encoding of the source files that # doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default # input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. # See http://www.gnu.org/software/libiconv for the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py FILE_PATTERNS = *.cpp \ *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the output. # The symbol name can be a fully qualified name, a word, or if the wildcard * is used, # a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to # produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to # specify the directory where the mscgen tool resides. If left empty the tool is assumed to # be found in the default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a caller dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected # functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen will always # show the root nodes and its direct children regardless of this setting. DOT_GRAPH_MAX_NODES = 50 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO gmchess-0.29.6.3/INSTALL000066400000000000000000000366141323660377300144570ustar00rootroot00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell command './configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the 'README' file for instructions specific to this package. Some packages provide this 'INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The 'configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a 'Makefile' in each directory of the package. It may also create one or more '.h' files containing system-dependent definitions. Finally, it creates a shell script 'config.status' that you can run in the future to recreate the current configuration, and a file 'config.log' containing compiler output (useful mainly for debugging 'configure'). It can also use an optional file (typically called 'config.cache' and enabled with '--cache-file=config.cache' or simply '-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how 'configure' could check whether to do them, and mail diffs or instructions to the address given in the 'README' so they can be considered for the next release. If you are using the cache, and at some point 'config.cache' contains results you don't want to keep, you may remove or edit it. The file 'configure.ac' (or 'configure.in') is used to create 'configure' by a program called 'autoconf'. You need 'configure.ac' if you want to change it or regenerate 'configure' using a newer version of 'autoconf'. The simplest way to compile this package is: 1. 'cd' to the directory containing the package's source code and type './configure' to configure the package for your system. Running 'configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type 'make' to compile the package. 3. Optionally, type 'make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type 'make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the 'make install' phase executed with root privileges. 5. Optionally, type 'make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior 'make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing 'make clean'. To also remove the files that 'configure' created (so you can compile the package for a different kind of computer), type 'make distclean'. There is also a 'make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type 'make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide 'make distcheck', which can by used by developers to test that all other targets like 'make install' and 'make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the 'configure' script does not know about. Run './configure --help' for details on some of the pertinent environment variables. You can give 'configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU 'make'. 'cd' to the directory where you want the object files and executables to go and run the 'configure' script. 'configure' automatically checks for the source code in the directory that 'configure' is in and in '..'. This is known as a "VPATH" build. With a non-GNU 'make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use 'make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple '-arch' options to the compiler but only a single '-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the 'lipo' tool if you have problems. Installation Names ================== By default, 'make install' installs the package's commands under '/usr/local/bin', include files under '/usr/local/include', etc. You can specify an installation prefix other than '/usr/local' by giving 'configure' the option '--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option '--exec-prefix=PREFIX' to 'configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like '--bindir=DIR' to specify different values for particular kinds of files. Run 'configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of '${prefix}', so that specifying just '--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to 'configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the 'make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, 'make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of '${prefix}'. Any directories that were specified during 'configure', but not in terms of '${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the 'DESTDIR' variable. For example, 'make install DESTDIR=/alternate/directory' will prepend '/alternate/directory' before all installation names. The approach of 'DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of '${prefix}' at 'configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving 'configure' the option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. Some packages pay attention to '--enable-FEATURE' options to 'configure', where FEATURE indicates an optional part of the package. They may also pay attention to '--with-PACKAGE' options, where PACKAGE is something like 'gnu-as' or 'x' (for the X Window System). The 'README' should mention any '--enable-' and '--with-' options that the package recognizes. For packages that use the X Window System, 'configure' can usually find the X include and library files automatically, but if it doesn't, you can use the 'configure' options '--x-includes=DIR' and '--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of 'make' will be. For these packages, running './configure --enable-silent-rules' sets the default to minimal output, which can be overridden with 'make V=1'; while running './configure --disable-silent-rules' sets the default to verbose, which can be overridden with 'make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX 'make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as 'configure' are involved. Use GNU 'make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its '' header file. The option '-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put '/usr/ucb' early in your 'PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in '/usr/bin'. So, if you need '/usr/ucb' in your 'PATH', put it _after_ '/usr/bin'. On Haiku, software installed for all users goes in '/boot/common', not '/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features 'configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, 'configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the '--build=TYPE' option. TYPE can either be a short name for the system type, such as 'sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file 'config.sub' for the possible values of each field. If 'config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option '--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with '--host=TYPE'. Sharing Defaults ================ If you want to set default values for 'configure' scripts to share, you can create a site shell script called 'config.site' that gives default values for variables like 'CC', 'cache_file', and 'prefix'. 'configure' looks for 'PREFIX/share/config.site' if it exists, then 'PREFIX/etc/config.site' if it exists. Or, you can set the 'CONFIG_SITE' environment variable to the location of the site script. A warning: not all 'configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to 'configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the 'configure' command line, using 'VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified 'gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash 'configure' Invocation ====================== 'configure' recognizes the following options to control how it operates. '--help' '-h' Print a summary of all of the options to 'configure', and exit. '--help=short' '--help=recursive' Print a summary of the options unique to this package's 'configure', and exit. The 'short' variant lists options used only in the top level, while the 'recursive' variant lists options also present in any nested packages. '--version' '-V' Print the version of Autoconf used to generate the 'configure' script, and exit. '--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally 'config.cache'. FILE defaults to '/dev/null' to disable caching. '--config-cache' '-C' Alias for '--cache-file=config.cache'. '--quiet' '--silent' '-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to '/dev/null' (any error messages will still be shown). '--srcdir=DIR' Look for the package's source code in directory DIR. Usually 'configure' can determine that directory automatically. '--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. '--no-create' '-n' Run the configure checks, but stop before creating any output files. 'configure' also accepts some other, not widely useful, options. Run 'configure --help' for more details. gmchess-0.29.6.3/Makefile.am000066400000000000000000000005441323660377300154530ustar00rootroot00000000000000SUBDIRS =src data po doc ACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = \ Doxyfile \ ChangeLog \ intltool-extract.in \ intltool-merge.in \ intltool-update.in DISTCLEANFILES = \ intltool-extract \ intltool-merge \ intltool-update gmchess-0.29.6.3/NEWS000066400000000000000000000004471323660377300141200ustar00rootroot000000000000002018-02-08 gmchess 0.29.6.3 * Fix a typo that could lead to crashing. * Various clean-up. 2018-01-29 gmchess 0.29.6.2 =========================== * I18n and translation for preferences subpage. * Various clean-up. 2018-01-25 gmchess 0.29.6.1 =========================== * Various clean-up. gmchess-0.29.6.3/README000066400000000000000000000017171323660377300143020ustar00rootroot00000000000000Introduction ------------ GMChess program is write in gtkmm and c++. It is released under GPLv2. The chess engine is based on xqwizard, which can be found on https://sourceforge.net/projects/xqwizard/. xqwizard is also released under GPLv2. GMchess also copied some pictures and some files from that (for example, book.dat). The COPYING file provided in the source repository is a copy of GPLv2. Upstream maintenance status --------------------------- GMChess upstream dead together with the decay of Google Code platform. The original author migrated his code onto https://github.com/lerosua/gmchess but no development happened since. This version fo GMChess is from Debian Project and applied several patches and fixes based on the last release version 0.29.6. Were there any suggestions and bug reports, please visit Debian Package Tracker for gmchess: https://tracker.debian.org/pkg/gmchess -- Boyuan Yang <073plan@gmail.com> Thu, 25 Jan 2018 00:17:44 +0800 gmchess-0.29.6.3/TODO000066400000000000000000000005431323660377300141060ustar00rootroot00000000000000* Detect libglib2.0-dev via pkgconfig * Do not assume config files under ~/.config/ by hardcoding; should consider XDG standards. * Do not hardcode tmp files under /tmp/. Should use library functions. * The "Save As" function should set default file extension to "pgn" format. * "Settings" page is not i18n-ed at all. We need to fix that problem. gmchess-0.29.6.3/config.h.in000066400000000000000000000151041323660377300154400ustar00rootroot00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* always defined to indicate that i18n is enabled */ #undef ENABLE_NLS /* Gettext package */ #undef GETTEXT_PACKAGE /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the `bind_textdomain_codeset' function. */ #undef HAVE_BIND_TEXTDOMAIN_CODESET /* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define to 1 if you have the `dcgettext' function. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `dup2' function. */ #undef HAVE_DUP2 /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the `ftime' function. */ #undef HAVE_FTIME /* Define to 1 if you have the `gethostbyname' function. */ #undef HAVE_GETHOSTBYNAME /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the `memchr' function. */ #undef HAVE_MEMCHR /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIMEB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define for Solaris 2.5.1 so the uint8_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT8_T /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to the type of a signed integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef int16_t /* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef int32_t /* Define to the type of a signed integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef int64_t /* Define to the type of a signed integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef int8_t /* Define to `int' if does not define. */ #undef pid_t /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef uint16_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t /* Define to the type of an unsigned integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef uint8_t /* Define as `fork' if `vfork' does not work. */ #undef vfork gmchess-0.29.6.3/configure.ac000066400000000000000000000032301323660377300157000ustar00rootroot00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.63]) AC_INIT( [GMchess], [0.29.6.3], [lerosua@gmail.com], [gmchess], [https://salsa.debian.org/chinese-team/gmchess]) AC_CONFIG_SRCDIR([src/Pgnfile.cc]) AM_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIRS([m4]) AM_INIT_AUTOMAKE IT_PROG_INTLTOOL([0.35.0]) AC_PROG_LIBTOOL # Checks for programs. AC_PROG_CXX AC_PROG_CC AC_PROG_CPP # Checks for libraries. pkg_modules="gtkmm-2.4 >= 2.6.0" PKG_CHECK_MODULES(PACKAGE, $pkg_modules) AC_SUBST(PACKAGE_CFLAGS) AC_SUBST(PACKAGE_LIBS) # Checks for header files. AC_CHECK_HEADERS([arpa/inet.h libintl.h locale.h netdb.h netinet/in.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/timeb.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_C_INLINE AC_TYPE_INT16_T AC_TYPE_INT32_T AC_TYPE_INT64_T AC_TYPE_INT8_T AC_TYPE_SIZE_T AC_TYPE_UINT16_T AC_TYPE_UINT32_T AC_TYPE_UINT64_T AC_TYPE_UINT8_T # Checks for library functions. AC_FUNC_FORK AC_CHECK_FUNCS([dup2 ftime gethostbyname memchr memset select setlocale socket strchr strncasecmp strrchr]) GETTEXT_PACKAGE=gmchess AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package]) AM_GLIB_GNU_GETTEXT AC_CONFIG_FILES([Makefile src/Makefile src/engine/Makefile data/Makefile data/themes/Makefile data/themes/wood/Makefile data/themes/wood-small/Makefile data/themes/west/Makefile data/themes/west-small/Makefile data/sound/Makefile po/Makefile.in doc/Makefile doc/gmchess.6 doc/convert_pgn.6 doc/eleeye_engine.6 ]) AC_OUTPUT gmchess-0.29.6.3/data/000077500000000000000000000000001323660377300143255ustar00rootroot00000000000000gmchess-0.29.6.3/data/Makefile.am000066400000000000000000000010011323660377300163510ustar00rootroot00000000000000SUBDIRS=sound themes gmchess_ui = \ gmchess.glade \ confwin.glade \ p1.png \ p2.png \ book.dat \ play.png \ gmchess.png desktopdir = $(datadir)/applications desktop_in_files = gmchess.desktop.in desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) @INTLTOOL_DESKTOP_RULE@ pixmapsdir = $(datadir)/pixmaps pixmaps_DATA = gmchess.png gmchessuidir= $(pkgdatadir) gmchessui_DATA= $(gmchess_ui) EXTRA_DIST = \ $(gmchess_ui) \ $(desktop_in_files) gmchess-0.29.6.3/data/book.dat000066400000000000000000002746101323660377300157630ustar00rootroot00000000000000@2Ʒy9WyTyZ #'j'(+P,Fo3ʩFo3ʫ24[C4xm5csU6v.BHxIE8GIE4IE4Ih8LENgwQzt/'TEUigPaXTSZgZSC\Zl^bexbtSv\y/~Ygn.9WЌЌ!FeS3CSZ[ SeuSiyE:Yy]d]ܮ;:LܮZz$u ߡg%uG8>3tЖeu,Ff/y_dfXWzj"9Ww25W H8x7ZX1rZ[vY iLU4WudYzxBȷ|ʩuţ 5W tzxmu2Zz2Tʊ%ɧ#8G&O-cs2ZH36GM8':G7<gD;CE;:FviIK5WCMyN:Qgwp ViyG\G\3z^VW3z^iy_z`4S1aɧ4afd @+hH8lρqHXrtzs67 |tu}OO54F<8KF'H8;:쓍YX_7G"j :\y*CEǷJ;9vL:ƶJZWG5ƷZVGiyVã 7U4{aĥi>8G>Fv9i—ȷ.y}8G}4UݻWy)xyŧʩ8[ʩYHPŧ5gy̖O j O ʊd gw :J"i[YgW'8HG:Ybbz]&k{(y*34+n,SC,uv1/<1e4ɧwN7wN7ʩnV7Z39Fv39F39F ;g'Z=TUCyvfFuzOcPţ>R;:>RTSWdDXhfIZuWs[[bɧidʩ8 hĥIhuWkwvmF:s ̰vw5<~J~cs߮~ ó-Z[7F óGW$G7Wҝ0v_3C_4Ul%س|@KJ6GUt:YC!jC!ĥ:Yhde hdihjhģhĥȷ5Ʒ+z87?ið8t͛YX͛z͛dKYyȠʚ[;9ʘǷ[(UƷv8HtTU`8GWa 7 0eŧBZ[7hi$Es%ͣ%76 D',;:,6G,TS.j2go3ģo3ĥr;v?ʫ1ACGGFJIcs^$K9Wv0Mk{PdPPģSĥ)\4_(ayvaw acó(g~l;K~liyUo78eqzyzuKs|iy1euQ1@ɧʅZ+,Z9WVӋyӛӛ ӛӛó W":Z *;:g:de\ĥu(a;:ޫz v%jz98G}ʩ{ǷT)Ʒ4u|~CH#H#h##= H8YGnɫ@34Fxʩz8xfKED34D:Y59WǷk{;:d;9QUde}H9;:96Gx8Gk7j:M g%ݠ&d4ݠ&deC1'x'I9)Æ+u/76934^:eD;Zz=p<?C;9HCHH:[UI9iRZZ[`Z[HxEd9Yİg]k5Ek?m;:m.zyTd͸\8iy'iyT'ifvɖjex3ZJ/e4iyhUvm34w/zXZ[ߕZzҭ;:3Xx1^4TG6dt@,v4dPȷoJţ~ókkƷ97u;Yziyf de .;Ko~iyɫ4j4jIZzó֓ʩ 6G4ZXYF{$jV&"V&"V&ģV&V&ĥYV&%V&*V&V&V&ŧ7V&ɧ7V&*V&%V&V&ʩYV&ʫX+v3c5yv x6y7OAŧCvdEKGySKKKMUenNfeSPSɫoW:j[v3]Ff3]Fw^ufĥi{lg1mnuoĄQCpgw "reusatɧ7utxX*c}G7}4~E6G`8GihJQ^vxݛx;9Wʈhxy#0xŮĄZ]ʩDIOyiBӶ6G]@HXۼƶIY:j(9JDNr:Y,`ʺF ĄWWţ WƷ Zz)6G)Z[)Yx8G+ST5W#vǷ%G7WC.be|tKF0eu0TAiyv;gL aU4Jfx Z Y:w%~hƷ8!Ygm$FfK&K&'wc}(:[f+ޥ1 >x٧BgעDxq6HHKFH4UHeu)LYIyLʩ4MvOdgP873R]RӮRz2WU6ʍYe[8GЩ\mbcFD:Whiɫtvih; zeBz:z|óJRJRxĥxój u;K#eu(iǷܷ߁U]K3ZW34t9UE#FgW%dW%ʊ]ӹĺɹXĔLs|Ĵ\z:d<87FCfv9TW4ŧMJzMJZYL-ʺcAGXTW1X98G7GT8H.H YXDi93:9Z|IY l 34=!YxE#u %;KU'6F*CJW*u/CUD3hZ5edn7AɉMNjiG&PdG&Pŧ5Tw`6G`]cʩf$xg$xg$xgrjqIstUEjvxă}4d~34b;g;y8G47 rtti`Ŏ,Y8XT34b.SeƷtv8ce8aKHaUvpLdpLOa ̷tkeE3fjuSy78/ƷAWAjkA*gA*-:8eEV fE4 Z4 ʩvFu75?;%ĥ=##$&&{'f+j1y2:j 8vdN:';FZͮKEQT\hXS_TdbucUghy}mȷngR3qwgt4Uw7xC|:zR}}ĄȻ}9Wl ~­ 76wgxYystk{Nwvx`6Gq1zCHf&4FXJVWG'z[]FknȸȘ;K+UvTW"[J?oy[jZ{iOYi 0h ʊ1 tK Fy jRo ZX& Ʒb Ttb va  vL  *o gLx F ][ 4S f r% ZX% G7I1, 0 VFX2 `2 ge2 n3 tyC= vb@ TWA ӗJ ó/J JGJO dJO O 34{O m&P RT D4YV YV {W k)Z Z pv[ ʊpv[ \ 6Geb d -f kh h $Pk JTv { h | y? Ut\ 34+j ɧ+j  Ĕ pv ʩ{<  tː ő :Yjݙ Ó\ yxΛ ZX~ kw t4[ Ĵ_l Yx_l Yz̷ 4M˸  z :` d8 x 5Wx :Yf 1, 4t|  Yz ŕF Ĕ zau gk ŧv ĥx 34 ƶ#T g, hH' f  d! ȸui + dZ4 l ! b" b" ã ~" :;-& ( C+ 64d/ eu0 5Wu>1 f6 k6 8 ʚħ9 |; d < 6FD ĥI yI ŧzJ TUK fv0M d0M Ą0M 0M 0M ʩ0M ʫW ˻W iha :Ia wXkj ĥsj t#q 34w cr 9Z SC Wyh uC 4S Uv˓ j˓ zݔ ĥ$ ZXw ĥ xhSt  :9M ȷ. ZYYN 34 ŧ$ 8׫ 3C 8׫ 4U8׫ TVb8׫ Z[8׫ eu 8׫ iy 6F 8 ;:r r r ʩr ʫr ;nq x5 ó9I > yU9 ģY ʩ!< z  46> eug g ? " Vd 6GȞ xI Ƿ3q  G 4Uj  eu& v' ţI` i߭ 4r6 y  F ĥU~ c `# ty& ' $y4 df 9 y9 iy7> y> Z[> 4t> 4\@C ĥl D %F G :YI @GK da 5Wea 9W a ZW a :Yb "e zwye wg gAMk ģm n Gw r{ -ڇ :Y-ڇ :[  ;K; 5TN Ry 6G UvD vx Ƿӵ  ɹ V޹ % Tռ ĥw gw w ʩ dZ   xWՖ  Hxk` KE< ʩz Ƿ eNW vP ʩBt W - jiW ; E5ٞ ģ 56 ój 7Gr ʚt5 X n Ʒ s :Y 6G{ zf ќ( :Y( ( ( ʩ* ĶF- 0 w`d4 :Y`d4 euq5 Iy< = Ʒ@ WIJ Z[J 4tN VR gy{U [ gwe F6i tbj ˻k 35ţm et ʩu v igctx | 4U2| 9W| TW| TY| ZY| :[| eu9i i i ˻@ y} G8$1 < G7dD C zٖ :H uzn hVء ţ TD ó3  TW. H? Y gw.k  ó g  ģ ʩg Ʒ  ;2 ;: i2  @ Y vh=t IG jG n T< ɪS? ʊS? ') 4t 4t   YiM 6Gn jl wt xj ih l iy xzx C# % g& Y9, wv/ 1 SX: WuW; ;KB JjB JdDE WySOG H \K ZYfM 4D R :Y TDY 'H_ :Yq` :=a ó a Abc vEog {yEog i {i JQq ۾q gy { w uW| : ʈ eu :[?  e+ \  xK G7S ʩ1 ʺ G GV wm.  fF  gu 6Fje Ʒbg gUP % gd :Y0< tD3 4U : we 4 Ʒȷ:X)l˻r7eu_ji=8Gt7347:YB%WuD+Z[-.Zp1_3F_39ha<@{-BL8GD=;K A:zEyi=F-Mģ>Nĥ5QTX,s[.=_U_VU_vU_iySd5UoUgCF>ɧ>dDZ >dDĴ*GYxL;kaP~{SiHUqXq[[I];Kazhk9WkZmKFq\xjg4yWgszF}deYx1344Uȷ6CFOĴMZBlŧ6G2euZȷi[FEy>x9WxTiHe4UFSuSƷKIB7Gp34&s;KZYT XHdiy1 =ǷZzTZ7iJ9W   8G9 j9  9 +9 ʊ9 Ʒ7 G7"2$D#(Y9>/ji N04UR3dR3R364SPw9;6#';G;ȸG<4tPChfPCYF$yG3C$yG:[- LEMyXNpPd8QihQwgY;TU4[aa:[o4dr Wt&uxf2;:D̆ĥCHCIWuu˻tUg%ܚ6Yg{zj+:YEd/ĥӳ:jKhijeoST/MN˻I3Cȸk[%1 4Unsŧ:tGģlghuuQzkiĥqYiPYx55*sĄ_hWhk?3 j1 ;[ csUH8CH{7+:{7++.jʟ1ug2U64WV4yxV4ƶSFUvo H7HƷ>JJU45RYZ;:w]ih]g7Ghgll lyiK o3Ctófde)>feF;:U馏ʏʩ'fóJģJ˻J3Z[5hZ[B:Y/,JH8:[ҭtd䵰ĥ%ȸ7d7X˷UvO$$ʩoʩoŧMw:XJOYIAeuc+l;8]vIZ2;KDe z xB cdXde| Y9Ʒȷ n))4B*k{n0y1ó52:454Uo{58ZZ<yHB6GjFjFhH'HvfLgfGPji ~R3C\VgwXd[z]Ʒ_:_wkʩooYrwIt9[Pu34{x:Y{xk{czcz,|:8!ZX!:[!euŇYxE4U *bgqUvUrʩiFD22Q<UℳHI%-d 6pIefwt35Ʒ˻LN8Ghef>"9WNhg.y9-:[F8 ȷ v u 0ȸ˳Ih0W0W U6wx#U&&hW';[(óqr,3ŧW3$`4;KG4ZY-m8876?}GHTWHiyPKR7GSSc3 FYYg\9[7\\ji`"RcUt_cD fUEdlkK6pyPqUvhIstdeutNsJjyۣugkČyunWEl;:ʩefʱĥࡲóM676FĄSq555ãxw47ģWjW WģWĥŗgG7%sc ˻Usig_TVjhjz034qvVU}9W}Z[?wzUg j\wg8^8GH89Uv:YeuZ6G6G ǿJXʹĄ ʩPj5TS~ŧoJ#4{&ȸ\,deF04)1wq666E5>GHe@eġ@KBhHDtD:YIƶZĄZQ_5fI9nLxySFɫVŧVɧ;>Ovdd76&gk6K8G6KiyZ[:4U1:WƷU6ʡĥʡŧʡɧʡʫ'TUug:zc!>UgiUѫwv?yذde^Z[^euϱeZ"(;:;::zC:EXx3Ug Ʒ34)d34+:Y|]eujdEG7  5ODtSʩ%DIAMCH&ĥ&ɧʫB[;*1 ( u5J v;:..ʩxw>gk`tƶǻ;:df@stBEBEɫBEȷFd__óK$vhp+I9j,|.%53zJW7jR?u?ZY{H{H2{H{Hó+{H ?JjijvLĥRPx(QU5SHJ#VxfOZDE|ZbcEghu/i{4Hj/l*n34 pJ&qʩ0r0r0rŧ0rɧ0rʩv;Kviy*v:Yw[:5xtzߵ{u({:~ȷNĥĥw!ʊ(S3nhi,,,,˻ĥ6"sʺ ̤:r78w`Wy]YʩY=1iqjveuĴZ:EoGgUgv11˻`_quiy9W8G[FfH8 8Geu u  ;:{ :Y gA34k;KQZ6GH!@t1[z?deAy EVuPNZzRt4Tgwu6vuSjMz3|ĥڨ|GX:ˁy&8G&Hh&HntDE~WuSU0wz'YX|r|r[  lȷ{k^:Y/ŧ44S4S4UTV!ZV'5W9WZW TX ZX:Yeuiy4U4YgXlzvw#Ʒ#F4%6G )( )(ó0*,z*1ʫ92˻]2::<O??8G?;8KƳNihTZTZTZTZʩ9\i]beeJ'g35agʫPhHiʩgli݉wefj;Kvhj'#Ƿsĥ +[Kki,ĊYtywǷ-gh/k«TVIDxQc:YJHH4CZ[vc;:XG7#G34aeua9:D'D'Y67LtĔwgJYIl&gĴ ɫ +xpRpRʸģa8G2"td"F6+2-.ʩ///:Y'0t~2FI2 63d 63˫5CHF7Hy9TD:8G:Ʒ}@GV)fBytIǷaGN3UN|N fOCDORĶR\TʪViyWYx 4X9W4XZW4Xiy0a3CwbY9 mdLp34 xYk\$~U,Ť/ÖƷTe4S4S5W9WTX:Ylclc5,H;:H8:Y@v[hj˟t˟ȷ2 Ɋ J!+tdg{Eģ{E{EȷPʊPȷݥydEo3JPiIjf> j- YKi> DE/d/dɧ/dawshghiz{2v$F6A%c&ʊU,óO-˻w0T4 w0ZXn68VWB?eui@4UAAEAdEA!BmNCĥmNC G34IwIKKHO&Qeu&Q:Q6UsV:zԉZ5e%`/`;:eijģndvZYo34Ps'/tjxS?x9W%|};K3d]4UфurWy{naTĴ0jxcG7(87bȸŹ8Gܾvh#bvA:Beft ɧ4TKFAv5W5jhHTʩ%{Zt^es\cUC0?:'CD* R # ug #  J :[^  34# ;: U" U" ʩy# u' C) ʩn* i9* e- +H3 k{?4 d5 y9 C?; \; ZY%= |= xWT> Z[ťB ʊťB ĥ[E F6MI IizO dO 5WBP BP BP _yQ gFU QW J:yW ģVY VY A_ l5b i Em TFo TFo o gns H8s x9y WG{ yX| ʩ~ zy` ygY 43m zjdZ  Xw%x DJ%x Dt- G7 78f ȷ 8Y& 3 FY ;:Α  vxow Uvn Rl 4SRl 5W Q  Yx, 3C, :Y 34 WyEL gi v. CSݮ Yz,p YIH Tu 6G$ ʩ(G (G ʩ(G ;  5W!jZ1 !H8!2!e5T!Ue!e,!Ĕf!6Gf!:J&*!5W4!gw6!8HT:!34%C;!G8(;!y_;!j_;!_;!ʩZ=!c=!;K>!4U>!5W>!9W )C!de)C!˻ߙE!{zJ!ZXQ7V!b!;:b!CEd!ue!CHue!TW4h! m!4UTq!ĥ Tq!ʩPr!4UPr!5WYu!!!gw!ĥO!CFQ!u!?!zwoD!m!Ĕ+5!jJ+5!!!4!:`!7G!t!UG[!ʩ g!Fӿ!\!xg!87`!ZW!v9!6A!34 }! !34!3C!!!5W!ut2!{!!g/!ʩg/!"!ƶcK!6v!Ĥ=\!xjd2";kZ " "N "eW"HX":X"Yy;"yZ""i""x y""TS y""9W y"":Y%%"KJ*"t*"G8r/"F1"k{t6"F6"gh8"8"8"ó1F"ifG"yxg"J"US"H8S"ŅGZ"5 w["H4^"ob"Ʒ^c"CUc"ji>f"yrf"Zj h"ǹbIi"4Dk"ƶGo"6Gyp";:fr"ĥfr"~s"d~s"Ą|"ZY[H"ĥAX"AX"E#"r""W"C33w"ĥB":Y>p""dvB"4U"."zw"xwh"u'"iIڝ"Ut"c38"fv"eu "e_"G8)"ȷq"4TR","HGY"gY"ʩ Y"ʫY"f #ĥ``#{####ţx#z!4##ȧ$#ĥd&#;k(#G6J`*#J`*#a+#a+#ģ18# :#gWs<#nA#H8GC#GC#yC#?E#FH#dEO#eS#;U#4dV#WVY#ʩ^Y#T_[#g_#iy7 b#;d#ztJe#6Gf#f#]g#g#Hhk#t3l#r#xux#z#Jb #4TO#wxh#>#2#7GK#{N#ZJM#x~#jOT#Vv^%#${#es${#Q#gQ#ã#z#ȷ&[###m# # #ȷL#Ķ#eu^#Ʒѩ# +J#8H巾#ȸN#g7#7#ŧI##zW#TzW#T #w2#4U#Ʒ##Ĥu#9I; #d##ʩ#v#)#r#k###jfY#xh#4U #343##vUV#vUg#;Kg#eu$GE$Jj$Ju$$[:%^$$ģ|!$4d"$wvE+$ʫE+$,$,$,$ó00$Fh2$8G=p2$:82$:Y?$ ?$A$ʩH$8GH$tUK$^L$jYM$DJ{N$HQ$zQ$R$K;0T$H8V$4Z$)^$˨^$gwfa$˻e$g$e-i$x`Ol$l$zfn$G6+s$Ʒ+u$ZXwy${$9~$JE$ʩS$67L $UC$j$y$H9$Η$r$ZJj$Yz'$Yxu$SCL$ŧ$$TS $4D$s r$҉$k{2 $K$8G~$j~$tm$$W$ŧ!3$$sc$fFR$euHl$iYz$$Ƿ$34&$:&$3SX_$d~$$d\$$$Ye$/$j$$ %;:L2 %ó %hg.%g%4Uȿ%3%w*%s%Cd,%cE0%P3%6%CE/6%34N?% A%A%hxML%wpqN%7Q%347Q%ZR%ɧ29V%V%xSV%;:"{Y%:Y^%[Yf%g%TS|"r%ʫDVu%jg|%ţ13%ģ13%%Ą%b=%ZXB%TSpL%fg/Ր%9I5ؔ%:E%3%dS#%Ą%m%8Gww%Ĭ%R%4d%F%rDz%rDz%%yIQ%yK%s%Hx%%fxyO%]%2%y%ĥ%_B%hj %Tdm(%ʩ% &:Y8&J8&g& g&\&CHX&k(&34()&+&ʊ,&,&0&L2&TU!8&(:&ʩ\=&FED&35IG&:Z7AH&H&TWI&ij~MM&ȸ@,S&G7S&j2]&b&c&7GAh&i&:o&$q&hr&t2s&Rt&Z[+(x&̛|&KF̛|&Wyx&jȢ&^*&ʩՌ&Tt&}ː&͗&}&ɧ&hx&&ʩ&&fFۮ&ĥb&ʩ&&[&8H &9I&Wu&Ƿ}Q&tu&&!M&z&Ƿ&9WY&ʩ&z+&&:[&iyZ&&&w&4U&eum& &&ue&W&XYw&Z'ȸu'h'feE'Wy'SE''Z[<'TUpG'['j['ó'j'{ 'O0':E2'bv9'8H1};'d1};'˻A'jUB'y5E'ɪ_F'6GmL'TtO'ijBjQ'eWR'CF!AS'f'ŧk'34l'LOm'SC"1o'gUNs'Nt'v'{'t 'ƈ'ŵ'ȷ['ƶsL''ٕ'Ķ_'i\'dei\'i\'N'5W''äH'Ą#'3 '87'e6'B';: '4t';[݂'iy~'hH'6'43'q'tY''weQ'6'34 (5WJ%(1 ((csT[(j0F((4(G7((((((ʩ((ʫfa-(ó-(g0(4S $2(k;(;(@(ŧ!@( C(D(iy cG(vwuJ(6fP(76R(yi5GS(x[](6G1c(JH1c(iyaf(k;if(:JRi(j(q(iZ w(ikBsz(ʩkBsz(|(TFU((ȷ>(ó((8ę(:Y8ę(k{(z3(gW.(vu(ó(CJU(v(ɧ(wv?(U4胩(87 (ɫ(8GYϯ((t (ʩ(34qy(gw(a(@(˵(g((gw(ɧK(7G(4t((;9((V(G6H(Ą(ɧ(xO)ͥ )FC\):Y)ʺv%)a )eue!)")&)ve+)|L+)+)?,)cdQ-)hH0)2)H>) A)rF)XG)H)yK)DU)4U^Y)H8a)Susg)(g)yo)ʩ.qo))r)ʊs)ȸ0|)nЁ)eSb)^);:^)F=)iy)pզ)ŧ`)t)y)jJ)-)xX)ĥ)gwH)CH<&)ó~)iy;);:)xA)8{))x)ĥk);:k )ĥ 9`)Uc)hs})ds})r)d:)4))))2*Z[e *Ąe *g *5Wg *9Wg *TW g *ZW _*ga>*w,:)*O6*hiO6*hxG7*:*iW56=*Y:A*:)E*ʩ)E*F*GVG*WiM*N*P*Ʒ$Q*kS*YxT*zYW*4UOb*csg*8G* j*6Fn*IIq*9W Iq*:[Iq*Uv t*.{***d*yg*T3*x*:H^*g*4U***&*ģ*%*34<**W6u*D4"**a*a*óy**twc*4F**ֲ*ü**u*s*0*Ih:***Z?A+U+u+x +ĥ\+ɧ+e{9+VG+eue++wxb$+h+Yn+?!+ "+ȷ1$+ä^$+;:.%+a(+ĥ)+:Y /U1+CI* 5+iC@+C+UQ|D+hxJUG+de H+yz Q+[+i^+ŧ0e`+c+:YKf+H8g+t h+ h+˻h+Dh+w\m+3C\m+6G\m+5W\m+9WpTp+wyNu+̗v+ĥV-8G?-ΤA-WysD-4UF-5WG-UGJ-ĄL-TDBS/T/ma/yd/j8d/gw#Qd/eCm/:[~y/Ĝ/ģ/gw_/df_/dt/YGOȔ/5W/4U9/;:զ/Ĵ/k[e/dg/Yx}/G8$ݰ/(/X/ŧ /iw/ŧ µ/V//IES/>/=R/:Y~/Ĥ/f/f}//T/ /ŧ/8H /ĥ=/6/#W/://l0@0@0ĥ\0kil607G 06G 034 0ŵ 0iy00ZY000ɧ e0U4Y0DY0)!0Z!0h$0gcc&0YK#*08/0{e2040HJ90ŧCA:0A:0ȹ=0^C0 N0ʩMJO0ĶQ0?T0J?T0?T0ģ ?T0ĥ_?T0U0V@W0efBY0gfW[0]_0g0XTYl0m0ihv0v}x0&005W]0zjD0:Y0:Ywh0iY=ԏ0ţ#T03C#T04UDۓ0uL0zÂ0ȸB0DF008Gk!0di孪0Ą?00d5O05O0˻0xf0J0Wy0WX0iy00*06Gǀ0Z0Z0ih!0k{=30J09I~20\0sv0dTF00uWq1h1Z[#1HI 134L]1dC114T{L1xpG1vB 1G8!1/1f512!81;134SI>1J1dP1Q14UU1vY19^1KHPa1ؑe1Ʒi1DGq1pr1x}1U6G1:[Ȏ1jhjĐ15Wg1 14Sj81}(1ʘ1;:ў1ʊ>1ʩ91-1:!1dv1tx>1ĥ T1Ʒ1y1:&l1hgӸ13581ih16G`1vx^1SE&1iy1ZzK1V01D1u 11kJ1dgJ1Uv~1˫H1:H141ĥh132F2Y2euY2eu 2ʩY 2deE2234K2B2WyF&2u o|'25E '2Tt}+2}+2j/2TU\i0222eux82:Yâ;2˻;2;K<2ȸQ?2xni@234 sL2ʩRT25WV2vW2eY2ģY2ĥY2 Y2ŧY2ɧ Y2Y2˻a2H8\b24 c2c:h2 l2m2-n2hs23Chs2:[)t2z2-2zs2TS2ʩv229I+2^r2Hd22del՜2ģ2Z[B29W<2;:X2[2g2ɧ,U22Uͻ2152ZY2z42uUq2iZ2dE;^3ȷ`3ĥ, `3;8!ra3 d36f3WXf3y_g3i3Yzt3Ux3Ʒ(y3;"z3;"z3;"z3 O3ƶ3KI.3u&33Utn3dn3n3ó73fvm53iy3fgr 3>33ghT3xGğ3v3&T36FT3gw֨3֨3ó v3ʊo3L3Ąx3ȷ33jz3cs3ue39W3:zSs3wcV33T&3&33ʩɇ3eu387J3wx̐3d4 33dgq3gȹ4$4$4?4Fk4#4CFe4ʩe4ʫ4s`4g'T 45Wi 4a#4&4J(4Hx۝(4F*4:X+4ZXgx,43Cgx,46Ggx,45Wgx,49Wgx,4csCgx,4ZB.434OM444U;4Yx=<4t]<44PD478E4dyF4txG4gfM4N4hQ4nQ4R4zh[4Hxb40Be48H*g4Inr4?w4Vw4w{4ģ5;4óL4ih+44g܍4g4UB4ŧ=4T4Wy *F4W54wtY4ĥ4Y4Y4Y4?[4CJ#4y׳4׳4c4ʊY4:;:4d:4:446G04*4r}4K46FC4344$s4jK4\4d\4Ą\4a4eu54457G(5%{5i5de1n5y 5Y55TS g5b55vԉ57GEU5;K5#5z3j'534f5565CH65:Y65eu65iy85?95ƷD5>E5XW,E54F5gwH5TUu7K5'N5fS5eu4S5HKd5H:4xd5Ʒ k5t5;Xu576y5׊5W[5c3 ;5zB59In5œ55Ķ5Ʒtʱ5ʺ+(5ty+(5>5P5Ʒt5XSI5d5Ť$56G$55WiY5CHj5k95kU5VUt455W#5t5p5Ʒ5vut5Z59I5vy5ó}6?6ef]6z'6'6m 6m 6˻\6X_6P6j6;:j6;KQ6ĄR!6iyL%634c766ó c766˻ 86wWe;641<6Ƿz=6?6uƻ@6Xj A6Z D6ZzF6iF6zH6g|%I6iy;M6L}N6wxP6zXS6U6t\6YI^f6f]l6űo6wTp6ţt6:Yu6!6j6v6FV6dfB6TSB69W B6UvB6Z36d6Ʒd6D6YG65W(ܝ6óï6x4g6Sj6e'6ʊ6Ʒ*6Ą*6*6i6\6iH6dH 6o6:Y6V6Y6v6;K6j i6e×6ʩ×6ʫJU6668HH>6.6g.6ʊ.6\666:Y6Ʒ68GR67G6H7Y 776G7:7XHz7Ĵt7Ƿ 7v7ŧ]7ʩp7ʩ'!7ȷ#$7dY%7,7ie-71787cg` :7:Y` :7:[+E77F7ɧE{G74S6T74UsU7:Yc \7y\7xB_77GHc7f j7F6hk7eF{t7gwt74Ut7Tx7}7d}7 }7ʩC#7G74 7ʩ4 7`j7gM 7a7R75U7:7UG懕74Uߖ7g.7ĥ"78G%>7xh7{7,7Eu7z)7i7eg7:YI78G׋7ȷ7U467ȷs7[Y7hƇ7vzk7kx7[ 7{7Uvˇ76Gl7(j7ȷ748l8CF /8YgI 8gV$8;K:-8ygs6.8e0/8784183448n489:\:84SK!C8D8F84tH8 I85W I8TW I8iy I8: ߇O8: S8ɧXT8wgCV8dg%Y8ţY8gw|\8HZr'd81e8:z 1e8:bj8Ĥ5=l8aJr8G8y8e8}q85?8TS88T3>8Ƿԟ8ʩ8ʊr18UE{8z8Jz8Z8Ʒ&ҿ8!8!8O89W588[V-8Ƿ189w8Ʒk8Ĵ8e85Wl888GG8`8xM+ 99W^ 9Wz 96Fd9Ƿ9 9Ą99j 99W'9ģ)9UEf09W5959wv|P69jh69gcTM89:9;K=?9E9iF9:[M93CM94SM94UM9iykX9Lv[9fEod9:h9Z[#k9m9:[=p9r9ʫns9uty9vV6|9T4*9vFj9l98H9Z9Y:M9ef9cS<Ǥ9TW&d94Sg9Tnѯ978祳9ZV祳9ZXE9tŸ9WX9w39w9FM9ţJ98\9:z]?9jkC?9tT9Ug˷9#9؎95W؎99Wl9l99ɫ9934)299VW G9;: G94l934l9Uv::::Z:T:YZ :eu2Q :4UB:w:Tt::ZJ<:8G :y!:wD ":F%:u&:ji}&:u`*:]/:x>3:7G)V3:34)V3:cs)V3:Tt)V3:TvU5:4O5:%K:%K:[O:P:w5?V:4D[:34]:HD`:[ic:Wy(f:tvk:Ddtr:Ԧs:hs:FFx:m~:5S:P::s:w:ŧ:;:V:ʺ:T4:TT:34 :4 :ܴ:sF:ɫ:zy9:߷:VGm:m::;:*:::9:gij:uj:ZW:˻qv:eu͐: : ::9W1:csK:yLo::Yg:8Gi:D:zL:s<;k5;w ;KFo;9W ;KF ;jh. ;9W3;H{8;c3׆;;34C>;Tt q;:[;;45#;#;ĥ-+;ģ ~+;ʫ|+;4UU3;4;s4;ʺ38;34'lB;g `C;cGG;xW;ģ a`;ˈa;:[j;9W7Cm;34m;WUr;Z[r;dx;jhQy;8hCy;_0{;_0{;S;9WBV;gfo;wo;ʩTW;;scQ;Vޡ;ޡ;˻Wp;ɧ픴;H;ʊϼ;;M;E5޿;T(;6Gy;X;g;Vu;u;ĥ{;4;Z[);g|;fB;j:JL;;{z;3;P?=c?=TthD=9F=4S9F=:Y\=c`=gd=Ʒ\e=df͍v=ʊ ͍v=͍v=ów=sz=;K}=4D =;O=8GO=5=TS5=wC=?=T==Ff==k{hG===iy!=ŧ+=3==XR=ĥ=i#==zy$W=KF$W=4t=UvH8==iy==Ĕ=#=TS=9q=gW=j?=76=GH^?>>h>>˻U>Ʀ>ə5>~>>ƶP:>}#>:Y@;'>:Y@;'>TR)>C+>g+9><><>>>E>z/I>Ą J>ŧ5xL>6G5xL>euL>:YO>ieO>h>xl>87@><Ȋ>4D;>9;">x>4t}>vs>Z[>>ɧd>>˫>Ŷ>4FŶ>;K´>"->G7q>4U q>iy>gw>Ą>>>vd}>;x >ó6>D4ϒ>ϒ>>v}->S>:YS>TN?'?TFf ?WV?:Y?:[m? &?8G/-?ĥ1?;{J?L?ueM[Z?ƶ)p_?t3i?_$l?n?Ąn?n?n?n?ʩEn?ʫn?Ʒcq?(~?1?UE4?V6w?UY&W?xW?v?iw=Μ?t?C3|ӽ?k{?Ʒ?ȸ??˻r?67F?Fb?fgG?SC7?]T? G?j G?ʊ G?ó?TU?ZW@:pL@-< @H8@ x$@;:9%@td&@+@Ʒ0@34!0@Wwu3@6GJ;@gWw<@zw<@w<@Ʒw<@ȷeL@deL@ʩLV@ZY+X@Ƿ[@87yT\@dg6g@ƷVk@fC3CYEC;[;ECGCv^vIC6G^vIC3LCu3LC#LCNC:TCutYCvwpZCʊGaC8G dC:[lfC٭lCG7pCf&PvCjzCjzC2ЁC|C;:.΋C~CÓCv%C76ǝCZ[ǝCiy5jCTXCCĴsCtC3CC:YCiymCUv>)CًC43ᙲCCNbCGV}C:zC4UCHG}CzyC8HCWaCaC+CРC;:HCv]1CPBCdPBCPBCʊC4UCZ,C˫XCjDOD^D?D;:?D4SMD$DgWW"D5"Dʩ.#DKI!$D%D-Dd0D 3Defr3DfgH9Dĥt>DtdADKICDʩyNDD4TEDɫvNDhxtYDQ]Dȸ^DU42CiDy2CiDkDXwD5E zD:D/Dg D34 DƷ5DóDTUl4DeuTDŧPDD]DDv{.DʩD36 DDYz@D:J jDfeSD34DIK)Dt%3Dʚ-RDcD5WeD4D_DDHdDd4Di9uEuE MBEKHEiy1EUG E.[Ex~cEŵm Eť[ EEE8GEU4EjEĥ['Ewg8D3E5E n:E%E2AEZEEj:KEJu[E7G \EeE6FJfEgiE"oEioEpEk{tEde3uE3uE3uE˻$vE}Ede}Eʩ3)E?ESEtd–EWGgEuTҘEVGuEuz|ƢE5WQE{fEvEEU6XE5SEhIEgvEDvEX E&TEYz*BE4trE G>G@GAGwHGeնHGǷnPKGTG:[`GdiGjiG iGiGóiG˻BiGjeAuoGfUqG GZ[ Geu GT؏GMGdtGGgY GU4ܓGɹGG)DG6GGGyigGiI+GTVuGtf0GxwGjx$Gs3^GwDG9/GGjimGʚGĥG7G1aGDT(GĄHHH˻zH9W7HHHYzѤHihNHĥNHʩCH CHCHHH}Hȡ&HXx)/H0H4U1HTt1HT!1HZh3HvUBHƶr1CH1/FHŧGHKH:[xRHiyiXHZHU4[Hu _HcHĄcHb6eH5W]iH=(kHiysH:YsHCKsHK|Hwxj|H[i}HZ[Z HiyGHHYxH8HROHHŧHzH76HxtkHeHT8HtxH2Hd5HH H;9 HZJ HZz0HjHƷHwt&HʩGHH{H7HgFHt.HvHKFH[ifH6GHHjHĄUHyHHjzHjzHóh5Ih5Ih5Iʩ@I׿I I;: IYG I4)Ig )I I{jI+!I5WB)I34B)ITD,I-IUGE/Iji\4I:IvֶQ3JZj&5J˻=Ju>JCV@J8G@JAJ_CJVf`HJ-IJWgIJĄ6BMJ4dm1PJRPJZJVWdJʩReJgi9eJ9eJd|J34Jk J4U9‡Jȷ9‡JꄈJvlJ؏J1JKJ8GFJJUtXJKIXJHxXJk{ϷJNǷ NdtN }-NĄфNW N:ZN:Yn'Ny(N(Nó(N5S.NUuK1Nyz5N8G >;Nv&>NH?Nji AN5WAN[U]CNihINKj \NEfu_NUvbNZYOxnN tNƶwN;KzN4SzN4U~NZ[g9NyNEπNVW#N;:\NJE؇N⚉NʩNdN4NƶJNUT ߜNGVbnNN[ktJNVN{(N4DY\NziNXN8GZaNZaN5N9WNTUN5WWN.Nʩ NiIrNٟNyNjiNʩDN`!NvNNPOĄ{N O34?O;:'dO7GFO76FOY:G#OCI[%Oeu*O8G*O4 +Ow;/O U0O3s@`P:9ePCegP}iPE,}mPSUnPxf"IqPeuxP {PdgƜ}PgƜ}PƜ}PʩE&Sq3SŧASGS$GSgHSĥdNShPSdPSYPSPSóZSzJ:\S87y_Siy pSt|pSpSTt@tS@tSĥ@tS @tSɧm uS8GUySnyS8G.SSǑS8G^\SxSOdS4UOdSTWaOdSZWOdS:Y2S2SɧSSZWԞS{ZS SGUS1SHSvطS1SFSȸwSKF ST4SţS8HS8HSSdg$SeOQSG8@VSedLSĥLSʩS;9uSe?SSk$S$SFSfd`SUgnSʩr SaT&CTv TĄTUvJTZKTuR!Ty!T:;_)T.Ti5F.Tde!/TZ[0TWyX+;TãBTG7 U1?U7@Uy9AUeuEUe8SU %VUUvYUb[Uz^U6aUescUGeUJD 3$fU3$fUĥǣfUʩJhtUʩ{Uiyp|Uzj}U:YYUX:UyWu U;K$NUIjpU@UƷ@U U36ZUZYUŅ BUZ BU BU BUʩ BUʫ UUȸ.UU;U35U{XQUyz>U3CU(UU6FIUsUIiUVAVV34 V:Y$HVYV9[V6G%V(V8o*VƷ'\2V4r%9V˫0~:Vd0~:Vĥ >VZ[?V5W4-AVGEHVv nIV'JVy4PVT4RV4RVĥ[SVԒcVE|mV76tVeu|gwV^{V8GY{V{|Vĥw~VV$VǷrV<Vȸ2VəV˻ƝV4VuV8HDVVV SqVTV{zV:lVgV|ǽV5W4V~%VuVV;[}YVxu(V34NVVvVFtV34 Wiy)<Wu#Wz})Wz})W)+We2Wjg~9W9I;DWj"IWH"IWeKW͈KWgwALW}TWwv?aVW0XWs[[W4;\W]Wwx`W$mWwWy {WIYE}WEdWW35ʯWNWeuڹW|W3CoWWWedW^W,W7G~WtvNWduWh@WƷWigXĴ0Xy{SXXXĥXV6XHVYUXĥQK Xȸ#Xƶ$Xf|-Xڮ0Xue@Xĥ prEXEX6GEXZ[EXYzEXZzKXxLLXji MXfyNXƷQX˻0a]Xdf0a]X0a]Xd_X FcX"FcXFcXʩQFcXʫ iXiXójXdjXjXjXģkXqlXSEimX9Iy0qXfEbxXyX4XX78XdX:YX{w{Xhjd XLXLXŧOXYX]OXJ"XJ"XJ"XCX34X8G~\XXXf3XX&YXgUXi7XTS7X:z{3XH{3XYYóY˻mY!$Yv2YŧRYY{Yvc!Yʫ0%YHX+Y;K&1Y<9YT=YTVZ=YZ=Y=Yh>YH8B?Yʊ6EYMY6FOY4UOY9W|VYƷT]Y|!aYjhcYgHpcYĥ jYKGsrYTuY;:N0vY96}YpRYwtoYݖY࡜YY:Yw4YZPSY;:FY4Ug6YwچYYY:;5YHJoYcoY7`YeKYdY:YYv+YgeEYuZ9W Zxx. Z̒ZCEZ4ZzXZhqZG5ZST#Zĥ%ZHx(Zdz(Z;:k+Z#\,ZV1,Z1,Z8y0Z.1Z41/2ZfF5Z7Z:;8Z=Z4NAZj:FZȸh0KZg>OZ:pYZv R_Zxjl_ZeZgZƷ;lZ6G UxZZxZ9W7Zz瑄ZzZZCI"Z;KZ;8tZɧXڍZHhOZzxOZzGZihOZHZZ2ZUt:Z8G:Z4U:ZeuDZ%sZ%sZF ZZ[rZhjZ|Z8G?eZʩ.Z3CERZĤZ:[eZݙZTUZc@ZzwHZfsZ/Z34ZvFyZhl\Z;:l\ZiyZ4ZZZKHAZ4UjZ˻xZʫDa [ʫ F [yC [xX=Y[di![8H[܈[zuC1[dC1[ C1[m<8[ƶhA[k/B[GXfB[ŧ]C[:D[4SG[óoH[hJ[|)M[*][ghtug[TS'=r[6Gr[345Zu[5Zu[w[vw7w|[o[, [;:[HxX6[4d|[N[[u"C[w[[Ʒ>[CE[Ąœ[4[6u[d[t[Ą[Ou[Sen`[Tt9x[HZZ[[ ߭[Wym{[eur#[ [euZ[ji[ʩu%\]S\T\\\ >\ƶ\\7/\:zN\s \TU !\̵'\KF.\;:.\3CwN7\ȷ":\ft0=\?\ue2@\ĥMB\[KeH\4I\ymL\˛E|V\yttb\"|b\;kg\th\di\ȷlr\ZY|\;:P\WuR\s\k\g\y \:Y寡\%\G83\y\.Ȩ\:jƵ\:L\c\jc\v\Ʒ,w\ɉ<\\4F6\i \TS[\v\9iS\˻L \XG\\;: ]eu ]k{L]ɧ]ŧ]gw]Yx5]z]ih.]6];K6]5W6]ZW 6]:Y 6]iy7{!]wLJ#]LJ#]ó30]Ĵ,#3]ȷ9]4U[;]YkB]wD]KFH]y 0L]ó}T]5W}T]TWT]ei}U]X]ŧR]]ɧ6s]u;,v]{]Tt]:Y ]y]Dٔ]{>]8H]][i-]{g]]Fٱ]iI]l].]]d9 ]WY1]Z]H]ȸ%]fw]TV&]]]eu]qM]ʩ ]q^^n^87 ^^"^ʩ~3$^euX$^Ʒd*%^)J&^&^,q+^;K0^de 3^eu5^4S5^ZW|<^|<^Q>^;KQ>^Tt@>^ND^ D^Y:FP^i)V^;:W^ W^W^W^ŧW^ódXX^a^Zjc^Y:l^l^ep^ȸ7;q^Nlr^8|^fF8|^x I#^H8V^ZWT!^d4M^f^c^78Pi^w0^;8Xk^^Zz-^ihs^34^87~^^C^>^3^5Wz^˻^^n^Ve^Z[r?^9y^a^Z:l;^34^^[y_3C_ZV_9W_:Y_:[_Z/_(_z_T4ӵ_eu$_9W#_'_)_4Ub,_;:b,_3C 1_[YH3_uS=_=_ A_A_˻}HL_4tL_34EmO_y Y_a_ɧGNl_'n_Wwq_ʩdr_u\t_6Fku_ɧ*|_k{~_ɧw_5W_Zi_Ǒ_[:H\_Tt_ʩ #_TD_IyY_Hɧ_tF_Ʒ.!_4Uݞ_ü_@__ue_<_8_ytl_w_/i_Ķ[_tx_ɫ-__vK_34K_3CK_9WK_ZYK_:[B__4U۽``:` ` `8G `j0`Za`z:|`?`67"`6G "`5W/$`-`-`ĥ33`g?`;:C`D`1E`feI`J`uL`vQ`k{~V`:9~V`yjY`eOSb`Ue`˻be`ŧhuf`j`m`Zjm`48p`cy`~`ZG`y[K `YI``Ʒ9m`Z`iyF`V<`Pۦ`tx^`v`ɧ`[:!`58T`TU~"`~"`p`'`KI`ţ` `hE`JzT`ʩy`yx`1``;:`h`ó`Xw*`iyw*`:aJK aeiZ a3CZ ak{aYgaĥ aK%aGV[*a:['.aVl0a0a1aA3aƶ6aŦ6a@i7a34;at45 bUv kb:Y)bbus)?$bWu%bh1&b@-'b4U*b8H<.b:0bD`"Cbf`"Cbʊ|GboHbʩ>HbAJbG7Td@dHdKdWkNdeDOdU QdkRdsVddWd6F\dddxriidE5mdjޭsdƦ}dTd;:~duE^dUtP d&dȸPҌdTWd;dĄdkdó }dWd˙due\dtd675d;:}dGVC'd~rdhit$dY:0d4d}d9IddD2dd˻ d34 d:Yd8G (dãdH8dUd9:edddǷdwcRdJHdWTneǷ e#eeƶn exwe>eTt-(eu,e_A2ek{`3eV4eV4eV4eʩL7epDezx2IehdNeReZXX.ReKISe8WePceEC ehd e4%EeeTGeXY&e9:EeK;e36:e:KeɧAeeu;ee3S|eu+e5We`eexeeȷefglfƷ f\fDX+fu6jfdeJ%fB(fĔ(fW *f8H{+f;8.C2fxX4f{zچ:f*چ:fچ:fóچ:fd=CfeG^Lf{Of:[m_Sf:UfSuQdVfjNYfwv_fv |-afʩ8=gfFpgfU4GnfʊPrfsfsfLvf3S{fʩ|fólj|f fIHfftfɫvf{¶fc fJFޣfeuof67-uf6FfFfgZQfyWZfjfffĥfPffCFfu=f8H7ffȷfZJ#fSfZ[?fkcVfgǷg:Zͧg:Zr ggwgBggh#g.gug>g˻ؔ?gzGganHgʩX IgYxIgij3NgfgNgYZ_geS0_gxu`gih`ghxagTU ag5WagTWagZ[egegegog:gdg˫d[gZzgScgsguSgSgⷠg9Ig )g5CgGgwyg(g:Yg3C 1gVgǷ>/gŧg:Yvg;:ggTgwQg3g gUg4UgZ?gzYphgw  hhYhYh,hidOh:YH<"h"h5U)hKHvz*hd4~-h:H.h5WS5hTU%@h(QAhUHh6GHhk{HhDAFIh;KSLhgMhnXhKHIXh9@YhCDgh:Ykh5WBnh#phbwhg{hUg{h˻}hŧ?YhΙh78=Лht9hʩ9hʫhZJ8nh5S3ch4D˻hj: ˻hjihȸhZXhhIihĄ h87:hhh4UhɧhWkihjxni˻Q i:[iDti4UiF i6Flliwv\##iw#?i4DjEiƷJi6FLiihLSiXics [icso_ijiI!mi{ viiyn%yiTDQ|iVi_iţ_iʫ i9Wi6iiiݸis>iģ"/iYx8oiw[i:JiUvj i34 \i(i8izAiijiiyieuiiiGX$ixjyj0j jT jjʩ=jhjĴ8j2 j˻/jw6jutX6jǷ99jBjZYKj4tĠKj4TjMjJKOQjWndj!ejgk kjdkmjtjKFjjţ jj;K}j%jde&2j34Qjxjʸ%j3C(j6GdjZjZj.j{j&jݠj&j8G{jjjFI*jjwj+7j8Gjjj5jYz,kkhHa k4k9i"kykI:kɧkʊ 4kN4kN4kH;k;k;K;k:Y z>k @kgi2AkXTkTkgfg$Ykj:fkcfkxzhqk9WɸtkwkkzjBkóQk4\kvڈkyVk67#Ԓka\kux2ƞk2ƞk k4TpkӒkiy%kX8툸k6G*k6G*k4S̹kiykkjfkY:#kk;w k[Fkjǟk879kiyk3C k4URk:N kTVN kTfkg6kUWsoll8HUlŧlU4 lhlU4plzfl{l#l4Sn$lȷ*lʸ6.lŧS1l p3l:lˋ{>l->lZjDl340,Plje8lWGgXlg;4lަllĥolȽlY:l:Y_lclfTl[zslUv}lɫ lTUl34mmt mxt m0mĴm)"m /mzq9mXFm5WVxMmeѯMm)Vm)Vm>_WmHI\mYG_mZ`mã#VdmGIhmƷesmU5ymfeIm\smTW\ϑmx*Am35YǞmóTmdi6vmTSწmU)mŧmomiyҴm/GmDZm78%mSuɓmwt$mgw mhl mm:m+m n4Uhnnnep(nV2nw:nY:y;n"y;nĥ&y;ny;ny;n>nɧDCntSvCnZJݐUnvWnuY`n7jcn76hdnTWhdneu jnmnPsnʩ3wnH ~{nĥg~n)n3n76h[ny-nx+nTCnĥ'nTSv{n^nonKDdngfn5Knyn:Y onHKnG7oeu9Go76ox| ozYl o4o<o9Wjm(oyE-0o>e6oƷZ;okxAoGCoKog8OoPorzSoUQZo6bou6bo\loCF\lo;Koo:ood{ wo:xoDvo:o9o˻UocsUoUtUoUv6o4tzoso34ŝo'oo:YoZYoHooT7o4t3oĥ~joGgDo:zzboHtooHX{oǷDoƶ݄pH8pcNpd#Dp4U#Dp5W(p?,p?,pɧ K;pHg%=pJ%=pCpMp3CRpgfRpgSpUtfLVpcVp qHIqZzWq -q|4qgu6qyo9qgl@qhH{Aq*BqnEqZyNqĄNqƷ_QqxVqWq8GwXqĔ^qB _qu2aqH8wqyqtvyqtx(qqDqWG&,q78lq6qiy$quVH!qKIqeuqiy4Ѽq:Yvq:J vq:%u;Kx1u7GA;uPu4SPuPu"Vuc=U`u9yiu:YjuXkuIY]rsuãtuƷЂuۅukbusu8uUt uVWfu34!u;K!u4S!u4U!u5W!u9Wu;:uTUU\ujzTuTuƷ;u9W`(u:H(uxu!uĥӤuiy u]5uq-uʩ u:zvv ]YvKDv8GU vĥBPv6GBPv4Uv<vk{1vʩ1v;vFT >v;:DvʩDv IvLvSv:J[v34$!av9gvZJ9gvuhvmv@svTDsvtv~vAvdev87vv vXhjvjkv+vjf[vv~vSҰv4UGvzu/v9W/viyٱvT56vvVvwgv8H[Mv67_wkj"w"wbwʩ^ w>w6wfvwYI-#w+%w+w9WF/wF2wvuQ3wQ3wK,3wy9'7wx7w{k7wpBwzuDwLw s\w s\wţ s\wawFsbwcw}wv!wD\wwcuw˻wߜwfebwie*w˻}WwKFsw6Fw;wޘwޘw˻]wwYz Lwhi9wePXwʚmw-wywĥzw)w;:Rww޶wG7lwĴXxfxE3xeu xx5xȷxɧxxZY!x_"xWyS$%x5WS$%x9W_+xCH6x[:6x4SF;xj=xčFxʩ#KxIhE*MxaRxj|VxYx(_x?exhv ixkxK;c3nxgw,:xĥ,:xʩjxgxefԂxfVxuxtxx\rx%x˻\xceGxó  xĄLx45Lx;KBpxdeBpxxiyx9xx97*x`pxƷxCx9xiyvxKI.hxdfxUFx8Gx[X1&y1&y=y;:yuqyyyyV2(yf ()yŧ1y7y8ytyC9y9ye5Ϲ:yyi%=UyEZyƷ`ycyģcydy-eyǷly34tyY8luyhi<yfyȘyedȘyY yEFy:zyUvMyTymyiJKyWx޳y[z:2yʩ`gHaKHmvzeUA}ikJ64:熁kAӐEfK9[ښʩQW:Yrʦ̨%T}}ܺ˻jvtSuG˻YGcЧɧܹusFw:zxExEó:Y}(_:Y}zu{:ɧo sóݞ!!"ƶ##H'xf'v7,6FfXm834Xm8eu.>:uјeuSy94t344teu_Ч/ĥ"o`հFVȲeST:;3C4U„lÄ4U~ńR΄Y:ZЄՄYgM܄ymT鄓܎eu:8xy% u = KDzy$$ʫ~3 D{WG4)o\-ȷՑ78GJd4oZYIBG]gh_}e;:Xl1qSE:Y]j2yvi?3ChZ3hxĜseϠ*Åu4ÅT/.̅eIЅiyхޅʩ兩;9KQZ٦ĥ(ĥK`h-tv:Zf91 p5N56g;8Hq%6G>%Td^yϳvǶwxezćPćƷU͇ĥ_ӇģuӇkjf8߇Z߇4cĄUgʩ뇧gKJ 񇛋Qwg9Ww4U"e["ĥ["ʫ) %,42U;wtT0=>UvF7G'NUcdgwDh6Grĥqr8W~˫.0RG:Y\1D4HZJ/d9[ft8Uv҈CH8UE 툫6U6SeuCF>"H9;K H94UbA>wkCyDĶFCHLVWSxuXYzXuXjb]/i6G]/iFvuo:[s9W w(e}ubY:e󆛉U7ഢHhȸP!y{(ĥ\35T‰xщʩtډKFn4& ŵ(ZYihrL ŧ Ee4s ȸ#Q Z[%;K %:Yeuk{$TS&hi'8G+e(x!)jhF*Z[.iĄojuk9)n9)n 9)nĥ9)nʫY]ph$t˫vfȷYmji'ŠwgFFÊ8ȊUvO؊ɧڊ8Gڊ3SڊTV܊ihƆ|W8IgW5Uv75W="|%5W)efV-\0u1z:z:ʩ`:;8$A*PdtUtVXygbʩbhjixi`.~6F!76\. v,ȷgcfzg`Ʒ(deɧhi;:,fj(k5uohip0u;K{ZP|*KjH άZH=;úcd-;8ĽĽĽ)"fg7̌\c2ghdhquutugwÃܢ;K^+:[Iön%:HǍGՍʫGՍ ڍhBߍ:w4S"M䍪z7G_TV. ģ>hMGH(gh :!FeT"G&3g86Ug*6T:fKHvtOYg]Qʩ]Q-UĄ-U-U-U7[Ʒ?/`eYiKEYi5WyyUTZ9c(BJibĎ{g*Ҏ4OԎَ:8zYTS~ţtn6ĥI9+cTDcTó60F8GH;GV;ŧ.@TSgeʊ igcn8G@pKJ^tetzy}Y:f!~z8h34G7E)4+Zj,بţKÏ4UfKÏTWKÏeuKÏiytKÏZ'[Ïzuď4F͏ƷZӏY:őՏzYJȷZ DUS6GGXj:9A>ȷ t]M|@!ŧ̾&5uQ1Ut!:y>5=>ģ=>ĥ=>-@4U-@:YdCgk/bZb?cŧcd;KxGVw}asʊ5TS~͈5W)H8FXGCիYXģ YX'%}ːiy\ΐVАy Ґ:YCFِ87 ʩgCF񐤦WuxzLV'f óf  z+Y8TTʺ&*ITfKbYGzjȶkdWWYDtެȷ`^wg屑JIѹH8׷בģ;K6ĄHh5]jZ24dVuW=tu}i'+ʊa;Z=Kk-F34&NdfT:Zm(]ycţe34 sMgK^zBdP.صɫ_óLk2 NǒǷx͒dmђ6xZْʪ@䒸V34yFuw1gc/ tĶHfx[]"! ,X UXji8`dagltb[Y3.fʩNjZJkƷ@l5WpYXN::ޏ鵔xY QTt QyZjĥ(hkߞtsDH<ΐIJ`“DIœU4ГYxJKF/:瓅 pYgzu%CyigUd}gC5c4Fcy fSRx':Y=ZjA6FXCZYvEL˻fT:zȤ]fhI!lmUtnR"uwZX8Y.'E`G40'z,e” zҔTVԔ:;N䔤,~5Wi]k{9?g?gʩ7 ;8.BYx%ó-34/=/wveAʩʨATS[AvI3,PzT4T a34VfJK&tʫ46G3CZYo34:6GaKji5`ecZlִulִZlִZ•;:izƕ34DȕG60pʕYxwdѕCSc|ޕ8G ޕG8x{y__Ĵj 3Sy/+ :|[K>d5x~8uSo< BdGH+cTS+ceu+cYx5g@mzw)`oDq:ziqʊcu34_}:H]ɫ~8Hқ:9\\TdtGgyghz[tyM˖Rܖh`薗3CzxSV!+yV$,H85rz6H8*CTSE>Gv[˹a4FfaTSk[9vv:YvT:YeX76jhIU\3Ct4e⨗ģ⨗ĥ x-:zxF6~Rģ:ySt%de})te3$5E$VG*j/_6;K@WV|S;:8BUxY 8BUU34xuXgm\uwpcvyiytVMwgwɧ+87s跘{Ș8H2˘g.~՘d.~՘*ݘ78YIk4U_uʊ 4kQgd4;:vO"/ʚO4wg.7ʩF7gwp8r?IAaBfFaByaBR [=dEfj/iUizó884ϧ34dGH8ʰgU53ʊu#șeu%ԙؙH8I8HM@晙vꙉ')z[TU'ʩ HD76FɧF#Z[#/qr=gqr=ʩkBzw^DuSNzyOɧe8Gky q78L36 HgAysģᢚig":Hq˚uҚdc?ߚCFp8G(WVʫo'ĥ~'6G*cUa1yP5XH;DJGFJZXr]Uĥ_J6vjw}iY{^IJĔIJɧfEHCHC˻`gw"˰gj›5ƛh<ǛnқFvnқTk؛ĥxܛT5EKUvytdhdi^ƶG>򛔕>vz:Y78y`3" /8ʫvM=x.?6Gʧ@4DRCyZDHQMĥQMQ5WҘ_(`rxHnyzYWuѴE4S Ecs]134]13C]1ZW]1:Y#]1eu3<4F y#jhY6G^iY~nTS֜Uv~ל̻ܜ67蜤dAVFWdt ʊQ.d ..ʩ741QGTYILzQbZxv&[ &[ɧ^ju.G7(KEdhnYY!rݝGg 4vUtcfee+%TSvT&Yz*Ą7[3*5"E&ZIJzKajhzKajzeQhjpfeuLࣞpзaZjTƞHZXi؞ݞwgpݞTpߞ8HE H:yg?XSthdq;[xh:Jȸ^Q  Ķ<jzYz\R!ɧ'ʫN/7tv6qN^Rɧ`JbKIhipNv˫NvT>wdT>wyT>wĄjwYkG4UI釢Z?۱܉ŵ %uḟbB5˟iYҟxw ߟ<៩(៕YB%87Z[;8G s 9Y ]Kfȷf)6f)6QSDlnTFf?>[kJIvhi3||:atwv.5W.Keu" D⛠u𞠴9KˠWu%РFԠ9WaԠ34٠x}jtdkKʪ36CE?rɧxj/xj/˻xj/4əE"GʩĔHdeVQeuQȸQu$LRDTbS9I$WZiyb;Kb%vdr~mx{zhd9W_#gF+;:ʧIKO 8GjZTġʡtΡZH_ԡZX1ԡաgfvbءX>D١4UEJTg>E;:'k4F`TZhuZ&EFw2 2W=?8FhMʩSy!TwgkXiyPXȷZyP[e76jnY:poWqF&vYUF ʚȷX8GĄClceɢji>ɢʩ&ɢ5W>Т5W>ТբBբVdsڢGV,ߢeu'8GqiH8`[OvyY?"jY?"J1_k2r7)3?yH:YITDNó0P6Gansty\^vفÖ~jh~jz*4FУUCףg-ʊ G⣔裶6Gxiyz {zCCD^YzT(i)jcb0m1~5KFCIkZv*l pt p pMjUv1ɧə:zgw/f89m jm m ʫΤvdϤߤVUhᤗG[d褅uꤣ~ 4DM6u"'wO)ƷK4tQ5eu673:eUfF8GtI"M{;"M{wwPɧFJQUV-Q:beeo5Wq8Gy5qbzYWe+ tJģMΥ\ΥRХ35>ݥXZõJG(0iN)u.5W 5Ut9iE9IZYIeujLYvĄvJuzȷÙuWhe.i*7GyҾĥ ͦǷOܦOܦȷYxKeƶf.xHɧN%)''z1˫@g @^2GscIƷ^JֳKde\oy{WG tv2|4dkKFeu66ȷJcIȧǷۧ CH tDgf. VrTSrcsvx#ȷ>5UDuKgQVO=Uae[[\vUd7{ji%jɧ/3TU3TV58G!ĥ$ 1(ã/Ƿ/YP4%9:-Ej1HHIeSN݀NG9L Oĥ(ak{ ldri#-W5Wvf.Дĥ•tHIИƶӷkiCjgt[:F=Ʃ5Eʩd\ҩoשTsةg7کU4کcsAݩ8HA4UAZ[7G5Zzq'ih-gwgwZYKhnq2ZYeuh)okfV{tʊm{y8H;:[O囮;: +ڡǷţ:34:iyr94STHqĮ:ǮtخUt"ޮ87߮y:$;K$5W*ʊ ;:`4 ZX~CJ8D6G8Dt&xJ5ƶQʫQʸUCH^~HjEGj:Yj5es&giT ꧯD'hg[óƶ̯iyKϯԖׯu5n䯃3U5S,TD 57!:Y()gw)U8gy08E5qC6GUYi+lTUv{H7scIig'I4FͲjAjA%5Swdΰ8Heڰdz~ĥd:Y4U * 8G,L.deFWyV}XEGYʩaV@b4?k;:?kYx~nGXwiWÖ g/?ࢱ駱3C;:x:Yeɱdֱ:Yױţ5ڱYxR{۱~ޱtdyiT3_鱳uʩTteuj ;:] j @m><@;K<@4tƯH6GƯHZYƯHk{ IJlfz8y{5W\Ttsɹw36ɧƷ0yx ʊfIP F6pE0r9Ʒ??J;:S34gY1s_g 0j8H44ᐳʩĥʩ); Zz٬4kyǀRBdzzxȳ;̳γѳSuj{㳉/yw, CUv 8Gm%Hx-y-4SJ6tdSƷ/YwgBP·zOndfB 5WR`+5U(Բ"˴ȷϴ3CtԴ?ִ>ģ fdCIheuC_%ȷF&\(z;3euz;3iyXTY^7GNqyv*WuUgʁUe[ IƷ;:OOʩ&uԵhX$ֵ$ֵģ%صĥصSqٵ5W=8ڵ4U=8ڵ5WGܵN,;:N,iyhH赣cd赧ghi赩\ŧy,EY: TV1eu1feu1fxKJVZ[ciy!(!KF".78HAA:YEkEYɧmt̞t;9xfJxUTX:_˻NtE?g7'̶GX$ֶ;k$ֶ{޶uPnʩ} 3Cf 6GlyF|)355x1xsBCfgCfh%:HɉhXɧyxx􁷨傷QCde͖ۡdetC7·YG/Ƿ/Ƿʩ/ǷóϷ6෕]෻TW.L )}ʊpY:=oe.<==euIóٻPQQqg˻[}mpxy8GɔʩT͠xue֥TSNWy:[jJ^sv¸ZJҸyTܸy긛p븩7zxJWUoD gwogs#ZJ}%F'ȷ"SUIavhjjɫaw8j:?Q54R\wY67i˦J:JYTSgȹ:[ֹgĄН5W T^[8G+SI+g\!0j \!0\!0NDN~]dt"8HŭWy`ȷú,ȺYIcͺȸպպֺʩz&ٺE5ܺi[Jfʩx  0ȸco5Z[GI[PSyPSTh;:Th4Ut8H1{3C2|4U\}tBʩ& z5EJlJl ޓɧ9˻9cS!4羻ZWwɻzλdػtdOػ3CڻJ^ܻu߻;廆ﻤ5W|G74S5W9gS%ȷE-iYv/v/v/ʩw3:WE;:dVjb˻bmuz4HxI8AZ򘼗,N8X%ʼݼZ[G7|˻49W Pij,[d,56GɧLbj :euRJUҖ5W UҖ9WUҖsUҖtvuVn{R⟽v}HhZS4n8YmѽUv8սٽdTƷxZ  ߪ5WL#$CH$9W'p2d=WXCɹT+nW@;Yȸc4Fm{;S[:YϬwϬħi[/340HDI1MĤ,ǾxhM߾Yx[Kモ5eo}DGL;:@U[X(T[ȷ`˻)bftՆ\ȧ=diy cȷ[YG@ȨȸTDNɛrģM)əY54U`5ȷGsɅu# F6jɕ jʩjójĆ?GYKxFUudegɫWVKʸDux85\ʨxk[xʛ³ʛ Qݻtvi9u0F6j ģfˉy%Ut*"˘,ŧ,˪(734C]i_˶{efxXGhH˕i?kg4DL˥~34Uv!hitTge53̅ɧ0Q2̩H75WLQ5W2^4S8^m87nģnʩyiyTV ̗EyEI ؓY8̊!ZWr/G79lͪ9lͪ9lʩܯ34*͊e14ͅBFiBĴkpGχwKy(Wψgjϊ|ϩu>J̵8GGϙah tEI;nP5W[Ф[yY\fF`Јj̥vʊ^ywgJgfԟiy& ик'zjopEfT4t"uU7Ѧ>ѵF:ʮVѥDz^dDz^ĄDz^Levj4Fj4Sy۠ѥ1ʺiHfJHѴFeu#7jh?Svw5[҉yሂe5YÆ9iғO҅ҕҙĥ Ctvn;K )d)Ԫjg0ɧO2՗2hH՗2hxW8BԆe*JԷSf\ĥ^eԧ!8}Ą'lƎ8GԤdԤ:Ԇg7j7Ą7ȷwţ$ԚzLégcԴI{tzeLHFeLHxóԉc2 fԅuԛ2ճ13Z[dheuƶj0Ƿx [ջW{5S7:[Nյ]hՄ:ó'T(Շaje[ՆxX4UXZ[Xiy 9W+ĥ+ʩ(5֛ =vw֓R ZYm։էó0Dŧ{z;ֶT:Y5?ʩL]֙L]ʊש="ׅuu;״DFWjhFWח`ɹtיʘשjTS KF/t,Zjt,gw%e"CHE]تj}dؕ}dؙ}dĥ=e4Fhi؄'lk؄t5~gwdؤd%ةc3X8ةDĴhHɤ'UCY+٩A6;ٛҼxڷM>xɧy67:4FCڙlSuuuWOó۪jۣP-Z[~@[ZCF۪"6z۩ۚozLp۩u9Wە@ 4Lv 34Lv ZX< ܉y.ܗAYGCQZܧ:aafh(y'Ʒ܅5ܗu܅uQ3C#Q:HqO}WuZ;iYh$TDH&5e>,݅Uq-ݗ::[`hiqwgEݤݪ_{5W=Yxqާ"ުZǯ*tv61:Y'F6GL޷[QަZކe²剄>²啅LvW:8wƻ夥楆6k3Spdhfev/;牊btw:u祆 Zeu@H6GW6u9踹dOyx@WH8Qeš誩wT4OG'4DOG'8Gn=XZ=`r餦`l~t Z~6GWy38ʩXy"{KyZx뵶KFx몫︾4tn멷pvgţkuWGWó%ʩ zghSgn3L:KxO;:I/ ĥgmchess-0.29.6.3/data/confwin.glade000066400000000000000000000724301323660377300167740ustar00rootroot00000000000000 False True False True False 0 none True False 12 True False True False Size of Board True True 0 small board False True True False False True True False False 1 big board False True True False False True True s_radiobutton False False 2 True False True True False themes True True 0 True False True True 1 True False True True 2 True True 3 True False True True False trace line color True True 0 True False False True True True False #191989896464 True True 0 True True 1 True False True True 2 True True 4 True False <b>Aspect</b> True False False 0 True False 0 none True False 12 True False vertical True False True True False select Engine False True 0 True True default is eleeye_engine eleeye_engine False True 1 True False False True 2 True True 0 True False True use open book False True True False False 0 True False False 0 True False True True False Search Depth True True 0 True True 2 True 1 True True True True True 1 True True 1 True False True True False step time: True True 0 True True 3 240 True False False 1 True False sec True True 2 True True 2 True False True True False play time: True True 0 True True 2 40 True False False 1 True False min True True 2 True True 3 False True 1 True False <b>Engine</b> True True True 1 True False True False True True False True True 0 gtk-cancel False True True True False True False False 1 True False True True 2 gtk-ok False True True True False True False False 3 True False True True 4 False False 2 False False 2 gmchess-0.29.6.3/data/gmchess.desktop.in000066400000000000000000000005231323660377300177560ustar00rootroot00000000000000[Desktop Entry] Name=Chinese chess Name[zh_CN]=天书棋谈 Comment=Play the popular chinese chess game Comment[zh_CN]=玩流行的中国象棋游戏 Exec=gmchess Icon=gmchess Terminal=false Type=Application Keywords=Xiangqi;Chess;Chinese; Keywords[zh_CN]=Xiangqi;Chess;Chinese;象棋;中国象棋; Categories=GTK;Game; StartupNotify=true gmchess-0.29.6.3/data/gmchess.glade000066400000000000000000001753111323660377300167640ustar00rootroot00000000000000 True False chess 500 400 True False True False False True 0 True False True False True True False True False True False False False 0 True False True True 1 True False False False 2 True True 0 True False True False p1.png True True 0 True False True False nickname: False False 0 True False Computer False False 1 False False 1 True False True False step time: False False 0 True False False False 1 False False 2 True False True False play time: False False 0 True False False False 1 False False 3 True False True False play.png True True 0 True True 4 False False 1 True True 0 True False True True 1 True False True False True False False False 0 True False True True 1 True False False False 2 True True 0 True False True False p2.png True True 0 True False True False nickname: False False 0 True False Human False False 1 False False 1 True False True False step time: False False 0 True False center True True 1 False False 2 True False True False play time: False False 0 True False center True True 1 False False 3 True False True False play.png True True 0 True True 4 False False 1 False False 2 False False 0 True False True False True True False 1 False False 0 True False 2 False False 1 True False 3 False False 2 True False 4 False False 3 True False 5 False False 4 True False 6 False False 5 True False 7 False False 6 True False 8 False False 7 True False 9 False False 8 False True 0 True False Start False True True False begin a new game False True False False 0 Lost False True True False False True False False 1 Draw False True True False False True False False 2 Rue False True True False False True False False 3 False False end 1 True False True True False nine False False 0 True False eight False False 1 True False seven False False 2 True False six False False 3 True False five False False 4 True False four False False 5 True False three False False 6 True False two False False 7 True False one False False 8 False True end 3 True True 1 True True False True False True False Information True True True 0 True False True True True True 0 True False False True 1 True False False True True True start game with state False True False go-jump False False 0 True False False False 1 False True True False first station False True False gtk-media-rewind False False 2 False True True False preview move False True False gtk-go-back False False 3 False True True False next move False True False gtk-go-forward False False 4 False True True False last move False True False gtk-media-forward False False 5 False False 2 True True 1 True False 0 True False 12 True True True True True False <b>Comment</b> True True True 2 True False Board Information False True False True True True True 0 1 True False Book 1 False True False True False False False 0 True False False False 1 True False 0 none True False 12 True True in True True True False <b>Engine status</b> True True True 2 2 True False Engine 2 False False False 2 True True 1 True False False True end 2 gmchess-0.29.6.3/data/gmchess.png000066400000000000000000000075751323660377300165020ustar00rootroot00000000000000PNG  IHDR00WbKGDԂ pHYs oy vpAg00WIDAThk]Wuk󸏙{uǯ66 JJEI>BVV*SQ J>iI@ UUBB6xǘ<?3sg{{~w&6OeK[{g_^~1~1{ ky|B |> w, -_?^Q{?wヵ͛7Ia2{gӧ}p_eln}?s0ˆoGU?~o^< ܢ ,C=2:<9 әA< _zֿ1ۇJO6w}vggQU?~ <7@"d@}jԭT*bОEykkC@@$37̑##>qx=$[|;ԔJTtNn1߭NLK6mVx4OSg'&~,\ɓPZHS38$ Jjsy,Qmu1'M{ԩOz?Ho?&IB3s2mݭOLdBJlQDul."Cq _ uNQ IQD@8vPx 30`Z(DGh|< Ѿ^V .Ύݫ#"ڳƔ=j[[;<,}/JISSoz[7m7/6y~Wcߚ>xPPH|QLbL{^$!E*xccmd3yc?,[!5}V[1 {.8D!ZNT?Q,&oyuN'T݀-_XWLCZ ͙Z'@M,H=[-U焞K8@C#ধ 7;g(va]HGvg3BçpiO>9J},[-Z`9|8j/@~xVLM3BMd7_lf- Ew%fVk;1G{cH8?k[~~8=ݍ˧NYB@y0 \rû$/wͯspl =C, %0VSh (B3RF.X#f+vJ - pźg­[!е2|Uv .Rٵs[up6H"]Ah9RF-bYe ¢gh];H^8_(H{gRi˙qPumFW77yc?պNw{lT (KwgһoLm0fYgyF+xj ,N8&?yy$UDnf[?OBTLFka l/qGumg"vkK8 XK)fMIz$`(맟f(x/O,' yI/ [X+Z T#*Kl*qݛ;ϛa5 1{ g¨Mb{=WBuMM$&1aSK.y1Uͣ~^Ry5.xK=K_BYԷPe@ y|~ h=ZLB1HEjnSec̿Gd4!"7EQ4vzr#'vs奋x?CS0eB@(fQt]w J?t,]{mD^\Bxh˪:[*Ra>Ws/qX?YpS/*p' L.cķ.r|pӯnGD:#"^{mkٲynV#Sn͙h;dY!S\%_'JKȀXj z!z-+ˋqR#U&da~i߾}t:"c !";EdlUuHU9;")B $ !:5DZFQEQc1@SUO1U}^G9`9ױֆRmk|#9GA`h1GEd})K+EG?Um30?!ѣatt;ȹ`߾}8(cE$z嘬A?gs׉ 뮗~D<,%tEXtcreate-date2009-05-29T12:50:40+08:00m!%tEXtmodify-date2009-05-29T12:50:40+08:00WtEXtSoftwarewww.inkscape.org<IENDB`gmchess-0.29.6.3/data/p1.png000066400000000000000000000136171323660377300153630ustar00rootroot00000000000000PNG  IHDR@@iqbKGDԂ pHYs..*' vpAg@@`eIDATx՛ixTU@&+!vEAAAf`qguFpw@gqAT@EGP@DdO a ٻv餻otyz[uש:ߠ^=\UUcNHRx Eh?_S@c^/C6?vo :gVNk*'8ūQF@@X . Yvl R4jP/APB Lo|*48>/XRy/ Ǭ^/!Pz6m NFkUD೒= ').ؿu' WkjH\U7h+(}zt9^Xb毻aA?d|Pkh[;1tIGuPߠzĿ*42 ] jH;~{ ?Yw|mAsffvk'pqFDb蒎/Ga rlȯfфy1mw;[-z qA.`)=~}AA^o=vuxq"InV|k TWӭ]q(9H WӾf,z:zy{"9|謁鞉t \?Z"N'PUժ..xmSڢZA1 }iѠن!c+Xasb||BI%OM\#=LI|׏ͨc\">eSVԺ:W|4K ~Ut+s3r |6J+%x>pw=JMvKXIe]}HJysgIޕa`v3-GDbh% Ac6SxtrQɟ4.BĴ[avFDܑω(e"d!۶~[6s WHhWUAqی9[Fle444y^rL-w(h68ˈy1u'tEb_=˯w8bX u?$ PyJwjS[%!6ʊf|UU>x CPU%.x|۷7cyo;(w[pAi4t2DHЧOgɿ(2;cX>K9%edF  ;Y "ʐn7}8~43ǃ9EO?(7?0P+^~y^|~!-GjvfmSr#"l߾) _3HKKU]KǴXYVƆﶜP~?1^[*oo(,@1Oy.[DZL숕0[]1@l&B #RU-FWrRpzyC1iA/R^!3#Y3O?Hin""î#-|m¶$9$ә3xfEAD~`Y |2>~cmyixmأc1/~ ]-F)-oJﺓUD{*6=Aq+IzWTvQ.e#`5~DTUSW?^[̵cF5Ϗ7ߠ/zV6 6`pDr;ǎaFuƵ@xvʚo͊˨izۃnGӷ} ݖR* Cd'$.[d~۷m=73ɴDyÈ^\x~Ɠr4/OF]//k66#SoǤkq;צ BÁd^81qPFOExa`~M29z8IGV4n71aR=}B")< ؉d!0&dG[wH^8dp| eeet4 hڽmiS %N$e4dw n:& [>܊wPנ<:TU]?`(& 7j&S뛲1UU *'^GUUV,{V!';!7'ġo1bz0{EZ7PvΤx96t׋INN*RipYRr5W)7_ƎF:Ț/!WޗHIk2oR]]-""GsC#ED5C`CrJGMT91\f'K(BVcM&&# 1_dK8Ձi1`2^_&KCMuZD(up.yzOW-aM,Yidb!|̪Bmi7LS(jCjBqGvN[jf#nlpyEGOll5z _xo7n6dX0ŘA&3s(}vg)$wf oZ#sbc6[ʂ+DBJJt(X{$L;2h҉j+  .>ZwEvի7WkdU!>>6.?eyY]=M'\ kq#twVZ-:KTt4Y=zvs<NO߾t:N'm({ W_DͪPټ:/ Q<uI?hPQQLrwu.OEyy3\.ex61?ZQQ*y=L|=\.:&/$$&;mL %,lu(B ZNNB4xGcsjM5jMup,k P֎|gșr\rAFکa|Tt3EY=hNUUt|j! O~fc4tSp_rT5t;PQN7i~&#{Ypz?׍E竹w\^yJ^K+.;R+FBvFfPdOÕHG7A鿨u,\<Vb?S9hyu Yhv)hօ&hO|l!o.yu˫Zցz1So{YgPFW]6-S:QiRp:& T QY# sޛoPq@k"%#ՓYUG߾܅9اNΡ(-vr[Js~-еvd߮[KTL {/d!VQ~*ӁÇSutPR]CN!亜Cʬ.Uڃ]`IIZy.  izMl\F`bү'UhΪQogC&`³M?' ٬@W,L$疾H۵}bv|>p#//z?ͥf' 1`tI75g[|n}r*a:sj^ScTL&S0WTVg>( W w@-S߱%Q9R@kKux6ݎ>9GsWTGg/UT?#ONDŽ$$g7d PSb4Rݵy}lް>|+`Ek?(o/ *#!.W9q}WVTP]<9ze~AnTONh5mh4g\rR՗/-ij?N *HUO %F,Ca/7*[ty.EAUUNM]s;57G3 vWi%rysrQ|hls6 ge5kˬ ٺՊ!9I ԧ/;f3ւ^l?bcz6qpu(=ps)i]4=gTd!<>qq״4ҊWr3F02q&4ck$łz2jm-z`\)+m&QT={QyV뽈P]mmMpСگRa_L#}$XD53+x.rr9]kldɻK}IR^܋ Q[IF e dGD[Rм%+ɎX閖"""~_a//N)a}ii<|I'ɎXYɪV@|tdǤrK´lT(8rMZ223Q}Q}Y֛$;beХE6sr{-<@ f ft1L&w63oU$/sxWϷxaI}>:FcXS^y֮^3LƎ/٪\+d1n9_z~F6nrCcF?PQ@Fw|%DtEXtCreation Time05/26/09j|%tEXtdate:create2009-05-26T18:19:28+08:00$%tEXtdate:modify2009-05-26T18:19:28+08:00%tEXtSoftwareMacromedia Fireworks MX 2004vIENDB`gmchess-0.29.6.3/data/p2.png000066400000000000000000000122411323660377300153540ustar00rootroot00000000000000PNG  IHDR@@iqbKGDԂ pHYs..*' vpAg@@`wIDATx͛y|TUǿw;@$HWqDDEeFaFPy8e\y.gxn l* @"1HIz}Ѥ6 @{|r֪:Uu9)%.(83yna2RUX(t.^D*H<~$sHT2D Ļ3B"DJ|g2w{v~õSin ph]sӏa oeRYp%S^nNy ID&4`QAo{Xk_/JKKۻyD*_"x`fjKG/aA(/))?Tt6g3eQ7>^hQj_=O/|tm?]зoz֩ܙrD͈3,iQ +Z@Ct:y92lxsڮUHqXozp 8Zգ=[\E?]vEˊ7[AtE=fMkq nfV[jQo}H"m!R`۶q++9x+- @+Gcqj*b,z$MdGN܎#-@^9O.x q ݲhDGf,_mNN2o "B`L?Bee%cZcmHuXOCݒ3i /ńs)VwE:Uw ˍ!М}xB,tq<{&WRYΫ`+J\|qN o5ʮPQ,u:mMa>ӅֽP(H8#b_XH,@YTλf(J|ϽDߔ{h3(q_B`{j} z4M˸Sɨ ]c/8oMu\Sg~ިu@M1h4ȣ ,mSOtbߝw^l{qmsԭymSo]jaFu*;N"`xXa4:ŗ\jSƌm}̻}őѽ NY\ĩzcO;wb;b]mtƌeP6PB,X0_yty5{6%0*tX˒B?;QN.g`ahZԻ549G}),,86mւ=נj_'QxG1+0+-qoT$a5E,mn`ϞQ ر#k2qU,_B9&aТ(K|V%|~\"pql5L̼y(Ah$:-\Y,V'#̙3y'\rɥ[dxxM +U٧ɢEf%qwޝO,DkIQTU Htp+<$"vZAQr7\}$%IHlLΕ_adτR\ q .Q9\ndff$/!~QEEp ̬.""/A sމ=ĻE~;Xn+fLDDRRRaCrrrb5rNL_%Ю]7%{puyOiMN뮿EQxO撽{سgXFpmoT Xp!'NTPTTDtr,)}hؿog (!{K˫v+wֽI۶mKnn#'ws/0` 6l@vv6Z͸@JqĊ!f?$7tSlǓ¤IjD.5 y]ʃK\۸[2d˖Esm p蒕źukcu=z˯ --BHDcࡦhmлO_<`eXTR5tM4Mv;F8`\=%s:zyxHqktƍHDD5;Y#,_ؤx|WoY+;j̟?_[x9r$'"rɘђnIѮvSoc(A|{9G2e+rرX ?,'V)rX"]{GƬXBQUMoQ+w2;T7vOj'uh ""i)Qcs#.GB>N[VYo+}`>r.񤤊h0N-e˖(Œxf@DDYCW>KF6D EW8j%Xv5P):xwD*58.w 0Zvܗyѣ4-ni :n97?Qӱ!HUgyQn((?nЯ>"$l6+6KQOgE"y {"FE )))t~<.fHeձ%2Bg4ABݻw!; >`P,딖/gΜ`6)cl*=[b%}0r/+M*QKKiX3Be7cT%8AR8rhMH"%8sv'1G*Ÿv>p5p`yWUرU'Xl=b;5 P[5"yV>3ΞtG =ZCާ @8 y¾zX=si*#Bߡ=0*QRq`aǽYwlTu$%Ժ@\mWTx1C?uz?Y l qqVNW@77(kO7J'EסTm]XW{Y`h˚@x%`6}%8rKqKANMssA  /Buu ,5O>tKȄ6fWLB3O>,_ lM `| 9Vg&t!?a""y5uADp)wz!j'9%M%7eCm-FV|^t4-Z00O.cǎs~ Aj,Q)*֯bGNnq.iիw@Sp |rz e? Kw/Em-٭|1[Ouci_}Mjl\#f4Mt˩sh?A4!~Ĭk`Pܽ%/贴aP^iq L QBu:VՎi݁t`jjP]z ~iQ;ewMU|gMzᐁ?aF#ťP6&Dh֣:GOkQ2)Fu@(BBFB|ZMh NN,{9g".opT0D/>DT bԭǍA aJAo0f\{{haP8?pS o 𛯿ؙuU@vs8xbeI~ >YCD4!P.2XԦCb񗲝i0*΀x =!]. 2MuHҥ3[!0È?ⴣw<D@(F~5ҡ zkgLY*(|6J~ ¡0_:ѱ]\p6A~=s1Eiv;DTxu'BRuUUXab„[2_/¡P]E{JSfVm{ )q}~b!1We!7s׮i 9[ ZJs;ָK5b' %=#z!cl6+N yٺ}` <Ң&sڜj (SG|e2geo 10ז{dtEXtCreation Time05/26/09j|%tEXtdate:create2009-05-26T18:19:34+08:00NL%tEXtdate:modify2009-05-26T18:19:34+08:00%tEXtSoftwareMacromedia Fireworks MX 2004vIENDB`gmchess-0.29.6.3/data/play.png000066400000000000000000000015541323660377300160050ustar00rootroot00000000000000PNG  IHDRw=sRGBbKGD pHYs  #utIME/S uIDATHՕ[HQ?n2ulKa] /E3X]2!31%># C%F&%J]b9vq-X1WN;4@_5P4I?&ЩUAy<z (*#"ЩU&B|#Ҳ=! Л7yrU=KoB1޹Ma)؎H=]}dCw\㑺o?ĺ60M_-34b D& -E$E٥%_İ-Ɍ[JO{IYK0f,N*cyMuKLPHpη z5ϸf"O %7]9EuЈ.-{;}EVE˭ix{!M U(@-,ȏ'G ۻlB+fiIvpcVYE. DX& ˞~b_&H㎠ȭZʮGzMc4kz_N<bTlrmG >$8's/4{(<IENDB`gmchess-0.29.6.3/data/sound/000077500000000000000000000000001323660377300154555ustar00rootroot00000000000000gmchess-0.29.6.3/data/sound/0.wav000066400000000000000000003030561323660377300163420ustar00rootroot00000000000000RIFF&WAVEfmt DXdatadagqclZC[NAK*)(+2JP\p   ,, /Ndp|{t|yyriWB=`RS`I7UcVSVEHQ[V_oy{x}yhs_b_f~ZU=' qf}{kVUJBN`OORrr_=\ij`h[F8;Rluq}sIKli[_{bGHLXm~  1FWbh`gr{{|taTcvdtUXbjyh\`U8*    fbU[mqd~"OC3%:, '  =7@PWDI=.99B^lxv~{XNN::;>KR=>D6)(;>2)7*Aw~g^]P1#02 "2.2F=D< +\fD?OH%}zwc^tp\$ |o{ #89 # ()!/- 9?>;Yz{cik@/9P\AZc]^X87@EDMScHQuwvcJ<<@:8>8%<%,1-wqmov_nse]F=LW`ej|{^OUL - &56/Jm^[iE=]e89RfXMSfuz &Aoh_S6!#  /8Gknhv_gd`VXVllx"#-F?vvnQR\WYyw~c{b6$ (5<=X\/$sijky`c`cgyy{y'+ ,6EYynWc[?SwoeS-'40,C^hbv  }|~mgzjSIUD($%*Ofdhv{wYB4)EKakT60tdf}|ro/=H+ %E1'3<CAHa~fVaO<IABOO84BRid_fQ`wqo`boS&)&(E=.5;>@:9*eieJ9VhL1HY7,B91P\;GWT_y]io^huvuocQRclm_cH(6PA:`vpwto$NsxgVUo~sgZOC6&./7Ytc\{'~zrqglin`dgugdxw|`ZajigK.5]hqottfgUT`aeeqjZEB"  hqhht{njs}{o{W<4G $  0#"-NemfajtdkmeTR[P6(' )99\ZCRi`hodr "!)=NJ7/H,%Ghovdh}spy{~vcN*8ELCBX]^qjjLWi]>,/.*"++%?0:>WbLF\O&/9* (K^UIF?K;6!;>'$"/MWLZliid]LUagQUkxmi_B',Yu[L@H?/#  3);:9HE923:DCJcgcjqV;-$  +NYNE\r`IA>IWY<&') '62(eUWcb\D9Gag{x}tup{&)   -/BQ_\h^WbTGA>5  $-IecYR`omfn~u~uiZWL?FNj`/;\V/"E[h`EFRK<HPokHEHMox`}xpXQ^L3 !!qkhnngB$ %#1FKBKORJFXtqk[heJ6Ca\d\d@;X}$+C6%+" ,)WiZYd`TQNA<K]XjfaS\DMXXJLXny]E49:E? 2C'#3DBG2$+"+4:6+$/HD %0=) '   !+%"'(+;\pkk~xlYgfUEP17<=I[I8TTOR[gq}{wc`jZAB^Z9>G-0?% #*"*.AIHRen|}~|wtq\L0+GG//DE2FWTJD8.6-"63#  #0+!(     !3+*?aX' &    )%0IG7% =PC:F>951!=Yfgv_gv|cQ^aaXC=LH40==GXf|bGB=?E6,II:6F95&(5HJj}TKH9F8!8YUL]nT1@PW+ !:F*%1GQP;04z%)5AITS2yrpw  }{}~s}{idg`5!)6 5925Y|tXKZjw#48,64-'3*&3BLVVdtv`MJ?//[#wqooo|a=5> 44&$# 4;R|bAGTL3-* &&(2 )#  4! '&+/ 0//"wso_jf_FS`rqvpWannqywy}r_SOMAC``Xh|o~|uy  ,3-OFJ@=</  #   $//<?95F:8?B8:9'0BGH1$*(8JpjYG21IPI94CEVbrvkF,F[S50'5EPIIC3' ))%1&+*  zv~yl^iosfv}|snk}{aVOVPMEXd`cgi]hltsswgkkx $ &)?OPWTQZhadXHSJ% "BVijfnre@6%*APOQMNckqr{vykT[MGVt}x~qC3GM@/(3GQQOVH##(/ !3/*,4,!"2RTklrcZ?PgYW_aioQ)7LV_b{odicMCD7(""7T[s|nFE>0 zq[A02 ')7g 0@8SeaP`ZTbyxa^.!2  )-*PLDF:*!'%#*-2 &!  !   ,#)""% # "  1"0)@WT;)51!$$!7zpxr7+fvcj}zz~    9Gys~pkhWdt{jQQC;C^iplqztn=%*9D-%-*&LRLQN3DB0%1B--R{lF+,, :PEH]xn[^ryTMmqQVbQFA42@E85<B>>;.*QT ).$]\txlhuxgYny#3' ;BGB.1M9!!" 0.3<F5"' %#$(7LslVHOZ;*,)5H:7DR;  '/>2;:OURJay|wro\Zj|_B' (PQRO>Qwv[OD& 1*$IXU[ljSA>9/4SQ:9:0':(4APev`aXG1) *2!6G\GDN\B' dfua@,, .9!-C?=AKHIQ^ngi`ZU[dxgpqnehutLMcK82! 7RWVYgpzuM>'#A,"Cmfqt]d"3KXTarvtOEPZJ8!#42;HWqr|vsiXTN::8@LW>DTjoeU1 ( 9'"2:(0FHG%! !)>C:;MF@H\Vg}}lyhI1 7HCXpnz{jWOC<;B5+59;2.+,4+0+xV>A@A?2.?IZhTKVRK?Q]p\O_[R]H:Sm[EC52)051%=CGXk|v]N_Y@2@TUSKYo ! &,=SzhpS5<E$,739ANe~qtpK9*,8=Z`B?I@)0*8Dgw\Q< 0TaoqFH4*&'3CXLB)1/'"$$ .?2.6,0?D%%CKMKU_hF *:bjIMG4*-+\:5./0)&&:ZbZ\zqVFK81+$)82:6% )ASlsjW`~}\GHVLJfhp~vkHOV<+(4:GO]fI?apq<^tvqugM+$M("y}rg ,<SnnO.rbeYHUxef>+*C0-KYV]TOON[gdViglpvY?B8xqvq\[n|cYMG>HH)/REHjxabl|}kUaciG0(7:/QpX>>PRm{X0)%2Lbbf{Z400 (($5@@4=`mxueK0  %;<DIC)(-,.68BJLD1 /Kaz}n^aL@CF2?<@K?5.*9=VhjWMADCToqX\aI!(1A:$&,A:(*7AMM>8C.%@5 ! zyjjhhr<V8'|]<0?9+@qi~|{~wrkk",-'4,  (* =LSJ^lzxllhM@S{h|w]IRNSgwo]F>>7F[@5`yrs{rwqryoI"*5"$5HOUUE$ tlqq]VGSNMMH."+&:_cO;5$,)1Rr{d\~qco   $& 'CRC8CEB:,/+LcsmsbVHA<_|xz[JEYSNRagYNQ`|yWNfS4%6O[G>:75?G' !09xZ[s pZfjvh^\[\gs'1U_YIby}qr]C(.."<AAG@5NmnNC?A$',5^ycIG:+AJ[~x_hzsR1 ,S]S=--@E2/OYYK[[Q0  (HC##0 +#  (4,%$9T[Zj|{nW=F``F,,)-,DVfvvud;'0&8KH%/# )Prhqtcq^xwdZZjW:61G_uZCDXVYB#Alww~njiY.$9JCKktflrrfg}n^E27&<9(&rxx~x}{v~w  2105DM[|fZUYMIXVZXX[uwuxld_XLQ[W_]^P<AJ?2Cbg{oSMBD3&  vhoeD2,(91(@Yb\^^shUKjux{pnr}z|mI'!KkYDIF(AUQGXOMPL9$' 7O@5HRR]{{{$506_eW[bM0*,.$ )`vY??EIjzsp~gQSD&HZPKL4);F98EC1) %   nWToU-!CTJ]~QI_Q_:^^:,@HB.)GB4;/?Vyudt}}stsikF4+'(..:107<-1PHBa~|khbY=.42($x{~wZ5%,-3Imy},  9./* *BUR]xv   YL^ujF4!#8RAQ{wb_eTHRML8fUPgurmmc_zuudGNgoP2267KF-23*+!  '*%+?CACMOEZjv}&26;E- |hck~9Ip~ni^`lmeo~b>5+ .</1884*"|eo$.AK[[I4AL7".(*1M\g}utndaYC=Nigfi}eUH>5'!23!+&# >VYlpszbTZU4*+81:IA)$ |sWB8ZSHCXbc_hxz_HJ>Hmga}j_kpfVRMO=/")*(   ychkb[^^SNUaq!#$5:<Ao}P. %47>S}mG<:384S]VH3%';DC<2#0CNciT:Lt~[IJA;LK*''203+6..:;9TZ10..48+ #)?8/H[X@>Z[>*2- UWh`dO$(Lx)%4D>@IFQMOKC@C88jrW]R?/* *?Wpyygkvw8 7.3=< ;OU`OSI&,(QoG|QE6=5,0BH>@2>WPJg|v]q~kjdho@5koPc} #+1")8K`qnn||[M8*(=UK=,,<9Ca_Jf|g\KK\\_x}c[_b- "1,Vb^L`]ss $1-!4=E78+1FOO^o|viW{tE )=8GeMBSgffR?2-&"*$<EPVPJLTc^7  #!,FLhpEQcO16E$&& 3N\i|wvwhO;8   &2,/@?;%8T7  :L?/@ZfydMPD4-# 4:9L]\gmP*+B+ *015(Jt}~afdL3,( !7J9;1".,+4* 3#  dPUgP202:Iluv`bbgw}k`4#@CA>3!&6=:=Zcu$&AD-(3.+B(E\RUcYFBLE\U;6A" ;US^kWS{z[]vjAIF+ )&(%9ORPgtja``uomjeI@Mi~i`RO5+0+>K# @F/hdnV3'&IX89dykqzhQ4 0Qjf%8/!$.&#)4% 4.-a^C@Q9<XSP\bTB.*% y %@=-,&-D (5*&%/AC<F6B3$69JEC0>? $ 'BA;XrebvU=:B548:1(@D7   (4%=G3#$ ,<50(820=NDBCIciMPX`\Q=bxsvqbrh]K@7DGhrr|`YimXGG4(!1IOZouovnrybUQM0.9.59!.;SH82SfVKL;wv||1ThurtcO1 ($/FeaR[C2/  (:9Jt|sxe>;A425$"'.$*7/3DbbYRB%?C5EetdfqZ?8) 8F '2! eef[ix|fWVi^IB` &+&-,;C;*=G?;XaEEZU;IVG8ALMORB-48;?R]S::KB5>Skp[Ra_KA6'121BSRYeO+"-% ~vgYQ\_ggu~s| .&/.FZK>S^A%>CJXLKXyjYttfXyqriL9@B@Ovh\O6 (AE6&%,8GOC' 6GBN2 &3P=1$"0'"$&8B [^\LQ]N1#3,%   & ,I[WCl  /5, !MN4*`j0+%,GH;#//  #Ck^RIEDV_`s}ghpmsvY;&}z  $)+9 "!# &,@P:2BF7'0>A +)@;9N\ggmwjTK__jhW:6 )&'*/=LR/ DfighP>DG406: {[KQst_RT'BVQLIG[M=<>NR>1*!1$//6FZ_lcS<..(BMWY^urcYQQH%(0,80)+ %03('*4$/ +><$, + 4JE_obCBB>3;B3 &$#  +(+.B92:D:7B9-<?" .((%'! *9=U?3?7 iYix| &  !4IW_VI:43 xt.BP=/+1")169$)?J`fs[RTk]TigXp{z|ol_^hov{olCXcJ874695B. o|{zyrbsx_F<2*1 3H Ddvxx}qzpqmVUZINvx  #28  0 $*217F=A[hA3:($-=E3)^X.Ckmwxvq}N=6/.'#*3PZCA#  , (M\YUVT:88)&%39LgvvjXIW`vwj^[`vtuiTizjov{eJh`cPSI;>C*.N8)+"gZkZ1/tJ.#)3Je%'/0<~^F5{ o&T E$],_.l'_f0n}   = 7   ( 1 $ "   c4w0p1y:U(Nu>z\ K}.[eshXkp5\1m6s3++Ma\O>Oh{ *^$vc]R Ve4+>i\&q\Q  y R q * K %3Z bS`S;   ~ Y  w  y + E C ,@(=WR!#S2_ zJT85VumV$ f.XbJ\PZE):Q$],4HW|,MEVt}OH xTi # 7 b 7 C %\ -NE$:S}/ep,G#l\ ~ N  N i ! r  ;*6CY at"NXb/XpNHr(vs{1{!B 5 eb?v9g)~Q@/1aFAYe 4  F  !a_G@W <sGi{ Ug*|q>f~C ~ ` U   p-mCGgX3sb`gl pI[e<wuh>i$tDEGS!` D=<(|=FR c6%g e# P n ~  Z B <9lFhus <IW1sto:/9 A v 8 : a5O'zT}-G5 N3hKNNBIz&5:6R$Ie{&2J ~i"eO 7,8t\N-46n@     7 q [ jw LJHEyMf<g R>x]fA    C  b=WXqG-_S{>q o}vtP#<u[_WW'H=y5P|PU"R|9BLGrv>ufdZ: S x  m<R+ xd 1#)OkiE<uBDPt5??c9"~j _ *   m<)2 /x 6YrpLM[z`5;DpJjPhd;n'U+?DYT{#yqyj_| Qa4XpikBx I p | *  Y&X XSy.dy^ 5]b&W[aRm  * : y LR4okCj%)^g=LyY'Q\%PcId%e[* {|Y> m\`Y *?nj>$gtY@ 1  .  KYn]l9:_^DE9-33#l]q%> ,'~ p < Q <  z 2 uR;p>mEDuoC4{TrIs9 3Ah#Vy2 N(j|X)?$n 'yZEE|zI"Hh*8aE O ]  [ Y `  Ydd'h!>Eq v!%qp%2q6 s { r ( :  -fl'4K9YQn}y |'|'lPM6fc'M_\ 9k]f,Gy<I0c r q  W  * D Pl |cs~/x8^'*6}Ai F )   V0H/_Zr-WUH>*XN\3>n}6Kgu8W0 @aT<z ]`H<3Duci.hy_f!H|`Dr94 r W `   w d 'hr4S,QD)\4u5LyK+ h+9h !|#.] $ H  Q%Tu)PELc^Tz,={e=A 2O30Ta-MJQ : f P $KYPYw|qm{!dB!D"ކx[}d5~ޘyE*JdNOrRD"o@=5m!bVIm*FwP~6UdX \%F - lcP7R)wQ&sEi$]E[Hd`lIc$MJ ?  IP4Kd_s>fcX+"G/t: S}c1c@%@#yh c ^l 8 d1k z nzL$`wE|xd ^*@Z}T "   M z }]6HNP^<12?UBa; 9!y*164H/~?W4:wG tG-J_h&[*UQBC3x;[ Uf j [ t   }BhP*l>]AJv:u  ! H;n-)9[IH=f[tH%vh,;N9$Ze,";i&2UaJFSgmE khG48:o[lqjuRt J^0K ] $ 9n"[ ) , 7 Ox=CLY6ia+0= u r .fdB4HhI|( X2KjBD%kd^a %AV-m4)(0l.Q &  / B d  R =H u@2*mbDdx2( ? Iz3ly!u_o#uDxm=DFfD5WiLikYr8k  q@8b-CbFpd4Vw3k aa+))J1V@$ D J  , b,X~m"J\OS q O J;rB HmP RhdeJnT/ZTOQnNr!KaSl t1pl!$>clu!3Za JlJu$=T)b C O  Y8*R55)}`VqN`BrvE</ % 'yZrG3_5Y.C^4@rb#3xdKN; >iTemB>/'JzM~jqJ9{&|dW;K Y*'- L K gX C - n5  *F  t ZX1];$_(Yz=LTfkr3@t-+N3 ~l6)_C +cP la/<^w9 !u Lg 6Lr:]ac";mHm`aV !6ifq@0xS5iUCu\R|4 v P X  B U<x;17PY,mEK-ti\| 'z} ]I 3Yk{#1C ^o;xn3b9?z @h./7`deE +y,b ;8>[A#96 b"X - X U d @ o > du aG|>`VBTR4G   Yo2QE6A T @q ApjqO(e]o[ _ QX$?^ Y9~MG48%k|YKoj%Kgp ;F+p4|VM.z, Q  M m 4-t4q&&~/rB0z)gr~  detx"Fuu\e[b/S%Y|/:z v|D"r7,A,8Ygtf7dG>&j'9-J6-#p%,a7P }I5A  ] z^Mzp   Sfhf%$]|9Y|D  ~ + OU/K=/ #@YC{EVsko~E=q7-fq@*{7w(..4Ao%f;FX2F6PVZTU!xcV> \uZMO'gg  5 a C b\g( 0r<4pv# 2 y Y \VQhh]>$4 5@{\L<5X ,"XvPgb=<5 <@yi(KBc?ty>]C-ZA0qPJ*l" 03 O    a Q  x *5GY]Y!Yum&  r fR 6b}H\O8g]Q Z<bW:@% I߄)9d@G<:N 9D= *N~Ud 1{|Dc*m$M pm]15S#t  I H , : ; <W&`F2as9 c"g nL .dW} R- M k W xHZkaY"]}3Kbh L=s,qWZ-0jUJ|}Ng/LxA=#uL2orE'w|$YMc0,<)Bu~w-3+ma$F{Q I " HB I)?8 :r>  t | G\~Rw0 !{A8gL[L-zrTNM)@M)=2NDQ+`n<pwvF&>2T\mKURCt--p[E\c_Gi;!z  v ssna}(#M[mjpCEd8g c R ] 9 ij@I!1wGUci`Ja fbIk Lx#^{hQrEG+gU8@.PR_Xx =vnXR=~Hm<  Jl2BWu eHb { E *Mi+f:Wn&=ZM | DB " Z  O i Q o>P@~Uq2*.VQI m9_Y5psqU` \e f\l\Y' B f}F)8e|b-*Viztyq  6 ,zMH:S _+( o T e    !R) "3YjY3!H;Q+.mC8oo7L( ; gr1~^a\Oo r` ?+ @~CB|c=d@   V :R=}4Smk *  % _ mvp"[|o/;nLfW@`8te'_/IH -vlQ->RBEJN>x;@`6 WL'W]Mh p0`w~jL  8 z l$r +SRel(1<l8z4     * ]beQf8i_?fGV@Cg+dl6mGl= H.z@D_Dl=8LG6>8.U.b)f{B*+>x00F 4 c x-,sj } O K wpW\(qXh=i#NX"  T h  ]1dpPo^Oz Zw3&@x')3<ߠYtU+t.ygp/z  mUu<&.Xh3vi{<yor< m`6 ! S    KO+h,o HR&_/L  @ + < >V|m}^ `z+LBk&H-Lreߋhc1eE.wcHKBI.$V()*1Sfeh'aglE XY \z W " ' x+SDB}&G1^^S#O?HY f y + 6   P u t@=@y;za-CH~^5T  [R5# %C|4`-_8&c9!;FEB#!J0w:5`_e#lbbAi k +|4   L  O Xo>oNI-QF&-I*T: w :  { ): i mTNzZRK7%c7I )LD:S )2 51;% A`C0JHz0s4gX:lFpjO@F5g$V fSo* | P / T ` (1%D|T= [cX r@Jgwv|SU  :RWT'y'< %?C5 Z}_0"6Yy}4jQIQ{{rr, '  ~4ko CtYQuRPD&3F^./,HE P y   K  ' z#NtyX"T@@fq9P$V|. jZDXxkBj.q"&u*kYp7A""T ZM ?1B "O>|Bx ~ #F s* W X ' mKP ]C1OG6' v z   TC^&o((4s[`?859f#o (9?s9Ei6@9]4M 7|Na_u^ch/ayRaUd{6e}6 D h " { 0 H ~d/F + Y Zh0 (z&>Y%b   {  u h V _ 5 a1wc  L8t$KzAJ} '8/GeD,]>1xru :L=5,*c6E&onRAdF~7zJ]M+&W(P>!,^s?   c  R G ( K {QpN!"E} L w c N m9=1IC(Gu@|$M^WS! Q.@n1Q(`+Q 4f`7w\_}7]E #jI"\Z@j\09|y]`Lm` E  a  a P LYz  !A*fh0\4s [B P w |   ` x J T` <-*[x9 zY< hB1+s|[PSgw`;,;*B*6es[!J3,A%ho'<0*o A0Y | *   0 J 8  5 PQ:AaZyDj `QYT~M?e D P `  ` qM!V{{td0XR`oV(R{b-y H.v8~RYr4$X2TaKT XMS~ub~$[&/E9U/<gZ&s  (5 o ( z { 0F&Zrs?/>&hC u} Z  ) 6,?'5h~0>wZnT"q2YjRd tE8 JTR4Efm(H^jL:#LIc7o!o|FpI~ -YnT  H } D lUFaJ |K:[X3b C   ` &   5m,  {Xn.BzB;Fo5x;5{SD9&/s2IV![8 ]t@ FS`CKm! P#-Ur9W5y> lJ|a-XxS_  Y e  .  { Yr?7 <9.xRyW& CB   a f  % r f8VkF qw<z%JV&4bppsr#?t,t*JQgA WX,%r Vl8l0D*ct0V5eZ1CGxL*p4( _R/( ~  W A   E >o||d{ kj I$UbJ I1\j a c L  L y|u\%HH P fy'IUl"uxjmV4>=T}zPIh";MZ. 83/yS0es[:Zqtt8Wj k <D - l w AD J\%-nS }2 x  s c j  cd!X;HO,d0'LAa)y1spX3kgI0bSVx Rx\}{a[vs~ _d$.}=_9h$1Sl5ZQterS 2 V s  - ~ B ~G a V,0 ]q&]mBmoP 5mFXo [  u , M  x 2 y[EVn'x]/it4-j8>`4\MCUXWR771C5I^&LHGe `&+Tn3* Fa7iw.N}% ]  F4-  * > u ! \.st .(2( s i O \q [ b z 5  zi]|Nnj#RhBV7[sje&z#cq[mQR EUm)'%HbaE2x@@#SM 06 y&| J % +a R !,t atExX e  r  9  : $ r]9$7]5cm=e NP}zn~D\ept?X*E\BWeZ99 0'"-pab ?{R'Ob fF>T h] A r < H N AI`V n gK0Sjare y : A '  x y D */   DD$./2sMKYgSxkm{`|.eW.z}1S/L?R:J:zQ%(6X .82MY\ pCtZF-b&0B4^ r  U * !MmIAe  I (   e ?0}][lt umfzSZ%:S{Aoc$Mi P6pDG>1)P$pI W YHL k^dK1 pj|;bK2/ : : r  T ? a n Q sE ]x{TG&G". m ~ B 21. .:qAj=|[p xi{bXn@U 8eWeKtKexg"Kxq.Mjh(9K]|3DmK +0Xh Xp"7xg-N J f   1   p l e I2 *-`}n c o s  6Zq  9  }9.;7SVP&uJo v5 9#:+U3b\,9().M%6]^L5"j'C <UH 15UI!K0nI J 2  F< o  J X c:'5O#|cN H , 7C_w]"bUu=_:82|KDHd~S9(K^L~*+U#^iZO2LT^M+eJMGK 9m3Q " Lk? A o W Vn_#zA 5n_Sdn:*iP 5 A l  4 ; kIO VG =T5@[ t@kXP7Tlv.xu)Qn,L *?z$d>S UH/ua O1;n6ym}:' # +V 8 `YIZ - G5 $i sH!(Z VVfHuwY2+BurW - Z %3u^J|HlE :Lw  "mAMzq}"$0Xx1$V=(2gd??4@xhTweQ B2*s ?ua  H  > ~ FF Wb yI*;?EAe P%1k  Np2K@vbz%Z01ZJX.?# r[WaC * nxt-3I"s~x;b.g!q $?~1\:b-0*`.~v@o  6 U ~ ; &Q[;#_I"D+*O/N/Zs>|B  k5 C e ] j [Cl"V!pmHWo J`5/8UME=a1C`)[6Tn% z3`YJ&>TUa}!Lh T8) > # H T x~2hd&l8Zy@;px~2' Y FbDmENss 2V+$YR@AfV$ZkH(f3I!R^G8Ja_i^0Eu\3` h>Gk~:l5:=  0 ' R 9 + O y1 ?4 ["wW8ue.* ["aVZ % b i O~5lqORVh,  } aHn>+j>(9j+t?icQm %H0p^W `>Blw!>`s+ ?9sjX/5)&(zP- :2! z   dgo;v+G jnODgyK;aZs   b  P   tX-.iaAmZ/4K(wNPB8W/CUSck)4c;0aUe8`Muz\0 .]`+ f&ea#   P x 'OCw q|QvNLlWWLV+\k$P3N]e  & s 9 gfr 9?$f?R!e{9xD)'gX]NS)sDR< 6Eu=hAB[ : X   Y ciZ1^ /C(+(:v+Ys(=(+fcZ{!@ @ N&V !p1;s._pti`fX)XRm=#51y39P~Peg4gDIM. / { 7zqPbJ G7pBB\, - z h;}T 'kx-UCjr@[~@3h',d9-DJ\oT *<m=hJ9:nE>7gg&+r O =%|h)E<(HHxlscFx' -AU"  u@ qyHZXt:$F=fF|qT= J81vn4k .O k  @Y  1 UhA9r ;P.=*t66Z4$qq X qCNOLS]`\@z> 1^K8,!3!!"7! [!p t<<KN; ?1}aW U.#XMIst&;߈ XFn,5aqo _hbso:0X T G p:SXE-(_L T J_@VR"`+^Cz6USg8/uKdJj h>7;h NNA: evc#{C!6MS(w&Nw w m-R[^@Dbq~g&^F;ENb7!,MV " , NWHB9'xHGpxz(?n&'c.P M$us |E-+7,-_Kt|Ddo(6K toߍ4I /JHlQhq@QCNbR\_1 k ] = YkLQ/y>p`dPhe2N C+0 -r$  n3=l nFC'=zt w__30FmeWEoU)Bcݚrwސ;ZP~_.b}Jt)z0fl9Q q  c k "  qWpb,fx<aOa]Mj8Hh\V9 CT*DK4[N!7$BZR[~X xbqJeV%N,d y r @ 9 } MSONpG~I/3]aJx5 9Afv  L Luqey6WArdB];)'&*%h pk޻)3Uj-h0+D@NjdI2Kfc^ }  Pk_asX# 3;U%(L}/7\DeId-K9B  |K=\T{x25>af_R=;=D=lߗ߬]Bxݶ}wP"h L4CeE$Cwa   W  Y sJZ<0 &m4b2jU.l6bO4=+pu$ ( ]Ka Qhxw Sdq\+^ߦY߅ߊ~y^.۸ܨܣ=V6,!{(WXj7lyxV.   .^c->mJ16{={+kNNRN $x`S)f.d1 ".}BuNw_=*z/.Knd4odޯݖ%c1"ڧYܓu#.Mzc4yywS [/IZC/zGB<a ! !!!!4 Y ' 6m$Eb3;z\1O/X5 9 ?n8{kR%*gbf ^ 54e$l4bh\i/=ڛ زx՞ԟԢ ֡elԩVҔӈT֠׿נׇ-#<Vx'u]>4 v  lfte} "#$?%&h&&'''L(t( ))),)((I(l'&&b&U%$# #"! : n9ocRr $ 8mh) =WډۭRuc֓לט#؏Aݼ@`'52F5  }5=zDHK!"##)$$A%%)&&''&&&&%&2%%y%$##"T""P a 0 $x H q d@h!lz?[Hޝ,hߡޘq۬WٕNّP(BQޢHLA3 ;PY8BnH;] e @=,%h2:% !"U###|#b#"Q""##w#"""!8! `UQbU 2 e TK)=B[HW F&=c{'BS 7NܷܤV ދ\ިv9ޯ ?`#.?r`lc t % {  D*ri_r  ? P ; #<Y8KqP~ 7  kQwgxT`#|%|Vq\k.@6v` ~Z'd_:#n!Ic d_ ( $ -VO4HPU89h`%uLBV.;9 ( B Q H ^ 9HN_ QWGtA5jkjYI2T+NuL0 l,)hV{V8=+tp~eHxFaI$J ) \  z -%  j  % F 6 6M $'GfB*lyr% kq}q9,[*JGQu{vr6wjP.%spfq9oKD 5 X _  @ h  \ c #9haUV5SNvG_G@ $ C^=b8p=:{FOwtbU?:e{}(qx=ju( M Q f 8 0 V0dEC{WSn$KynM cVf,9#$d13J4$y,}gq8k Q pjqVQR ^ o l H o  = ^  } k * Ml?DzUo>CJI1{!x\%$ue3jWP'i5dZC'c:L9R |  v   y p ! ]  k ] <M%S % / = o d9"uwY\K_!X OPvCmCw?|+{% "H;fE3{=#|cEdU.   3 I b V F^=-L0DF o & pyONoR2FKJU(@vLzGFWLmB#DnAIGdja D))!M? z? [  h  L 5 8chq-s  R ISJT6RYx>iE#p2r\;Ch4+?f>u- q_#?|m!") K$'x(Lg-S X I 7 i;")Ok)IWH' \1]_#D_b86$g5Y`ZVI E O5(\{ ];,!Nd j ^ e P D J<jkO S* d$\ BtEyh!c8`7LS^EGy_nCZ`h@i8Z2k 5&'. 8 (  B _ X x c - Q W K}JU5/z;41(vx4KWrX76GN*-lwkQwl(!Ipf5%5CUY U 3 ^   @  ?+Z19ifu| N;]!H4FtLR7OqlX\!,PG{VyPypT'X`WGwwvG4{7  O ; J / [|;PZGkdh HEu%Vi% []-E^(F2@W`xA[S^m/C$;4))2g}'J: m[ #D[v]CWki_WWTx_4of _3{:W ^N vd.Mg^yikV:1Xnt .aJA@SH) L~9^k4y4K!W6gW> W-h O'H&(:g.P-Z r%~Gq<ZdP+F5L+TsS(" `k {Xt2 Qjcn4#}TX)^me&P!_\.*q>^S0w"K1`qfX\y8I  " m  -  #q)Yk [Cf:15k/z[ R" =.q4Ep=.h^@#fx6pm%5~20-TW37SaKGdYA E k/j6**| ]H]V@r& SW1l )jHTMD+E2IS\H"4|SCb)MR\V<% W}S9(PQVEw98IV.-<{j]]gwf*ds+`Yd_[)zx+2?ex:z\.i-2, +"]zH%?{U3?,CX uA3X%r_1IX.4o4VXauO0]/C"Bayg.4s`T~d>):.E\\OWmm<.IrGl3+|'@ Rbib>&`cAvQ@N]t0u qzIIwM98J^:.52QE&! +OP)8,Z(r F#lfj/ 6H}kt5ID1fu?<`L}])/;ke= mi\_kv#KYa`PI+)!vIh$"8DW> eGIz 1d2Hxl:X_bfR.!+("<}un L:?SR$%GyH)J8' )&=ztOpCih|e=U!^y]CS,1hB`|m@}yT%(|@@L &(E5\9bUIoFGIG0tZJSli(@bup_Bz'hkiuK?s4i \NL;) Hj:Q)xy54Bta=Nk7l)Y>%EE)Jtz~g EGP(R*$7.%F-;y="=IhI{.YKtoX>7Ih{U |7*  =&[&&JP@NohfF9#/ p "a^s "qPo O/1N)<  p"5H@ gJ?,4p.?tZq)>?  G:ioG ZfDz#LGP r3#SeQm'oSAr'n+ K&X(V=F3u#5O;EHa0]D|1q `g;.q/Q(E:1UayP?`DM; ,}wx :gQ&T~n|8b8NAVds 1<7iTUD(Z/~]N&Vx!-jQc,avk0.rCZ "-n/Dk:H-A!a3~JYMrhY4B<^$/3$abK2T7ZOoliomjawRM%xHX"6 AD^-Z5._1(HNy w]hXI(/"ukI <Xy,*Fm)`=%xjTwFz9!f|h1$ gh{39[Vc:QGX# ,AkN C%+UBk'&@\]9Ktf|^$sWGdrqd-;C,0Qy%\PIDp[TOeft?(_Dpy $ "26!FjiomkagQ@NWL*V+IX\*N fhyXvJ1a'#=]97~r>jPk-])7G%5.^}]fow <,T_FfcBe &A :MUfXt 0+ek/$uh"l2*.E^&,MTpR`l, & cqM_C4w~Jyv?/2\{utfilDZ?0$ dW$*6^nO HG~E9EjH4:$#F$*8]dAt/f-3~z 0\8;\('%SEJoTr(.([I9 ++;U<JmP?3+'i\/3Jon]vv 8= Mkvr, ]&efxy||D qf2DZGEixdosj5T}@oxX_@&&)7+~[=>=;'V_f[ZP2pgN/ $\ $((cuutCDyaK"(PeTXaUB`wuidK k"  ?+%Zmq{PprY\`fBqfVwSB[\[a_Rayph/ $';<  HfjhT%7I7 )Vr~3()E^^bp?.,*8$;\ORpXUeH0KODOwrfS: z_VB % ! EEUpJ5;;3PlnrhxER&%>4++1$=d^P-(-^caglpwlroU1 " }0/5=<B=JMX[]w{x[Mbp{uJWj`blmhfytlx;$( (*(::"=Q!hViBT>*5$%?5>[hwlgQSuzkgG86( (FQXmaNm{j_B' /A817=@BHHIC'#' - 'xwxv{ 2A7BP\utO)C8GU;@_K4@C- <O;&&;BE9@G*jsmj}v}..,@%* >Us_5#,)<F\P5F>6J!)5}!( tn O< GaeN@A $=SuyO9`ymu=%:&FiQ6DK2'',+'}df{pvWI>)A`k =<3# drwvuc|syH%  $ $;53398:HVYc? *8Fauy}y|bvyT4Buf=lyd^l`H7790$6=P6 , Diwf`td?Txh~pbWI7aya (TOL_o]F! -B?_oo>3E>"0. 2V]_^gZOVqP&'Zly{Q#&57!( Ty3 2 9@3"6IHLjl5NK!%0""quEILFPb>352?Ud:DUE @0UvK!(*) ]`3!#QjSKhV'.AC;$& #MnH++BB7*1'1):Bet|VHM793<88%5(>owdSPL@#!+?B /H|UW\jQ2Uu~~_KB^|' )QSRpnGH5}5Oq~yc>#zqeB7E40,"A>, $*!->E7*-19G& '" /JHG@("1# 4>A.8'&((-4:.1#1JE&)/+ -4Db|{e\YMaTBNJ9NzvV."=HTGAL:2KRJi{fP;     (*/22#* sL5<1#7[||tUVmxa]f19B% *AO=.BQWYC ..<Hifatr|bU7, 2RL;0$4@3"49-*K_H?EA>># wuuvwukdXF^~ndq}zrxZ@N^wr^nznjdibZaY:," %?M\VVT70#2Gvga]84GB@7' &$nfv{{ok $5AUP@1% %-)3BHLI0$*J_^`^D('(2") -?ENME?@=@QI37TM"+E<"  "0 . &<!HZPNB4" 0;1&?4 #)">/0KE(16-$0%{u qw%*277," 2niXxh]L* E[_{{zoozwnmQ:28JVt}n`{~XPM>LkW/#-7/)(8'/!!"'B]. :=42E6--to^@)0-85"2CE:^wyoteyzqz/A:G=?0..9IC'/AJD`TIF%~gcZFc&-\f}hC0-$*>Lvcf{zms{wwoM?B@/0RrlXdxotkefREK]?46BALNC?H<87." (5 x|vkXHW`[uxw\dq{+,50"%/&  42468& /E0"<[]irYwz]\mL3EHF_o{~lUB.  "-9RJCF< vhWmp|r*9BNFIGS^O351(!;kxlmp~xnY`Q/5BHOULizgSQGHjW%649j}tzI6132.1&{zzu{g^z~{}cKg}Qe}vgVKIh|jO>* 2*$?HVTW`aczvqvH) !/9Tkf%%3*#,,.1:) Jp~]J:HFRUTC98Raoxod[moO=3, *5'9LhO,%"# xsiyci  ,8F_?NeQ:KX[WB7I4%%,(,+(=TR^gqcl{~h?$#??*%/055:, "% %*"8WZ^N.%#(+ uiy{]fjP&HP:[or 4:01LZC97;IF",.) /JMLVdfg|mT<;C^ioohJ(/(9--/5HABMC wxN@6.OaH("AM8..?VT>:8MM' v|i%'  yx# 6LXSA;SU[[^[DGUTQY_fcljrjomf`RJZYWX[FE5$-@K<:88Lyw|iZDH5&". "13(2$   !#&#// '-'.8<M]xijnkrqoo[aU<7@FH@ &,LgwXY^O\_xq^dskjniKHC3'(+(!<@6*& %"  vq|glp !qpmgYXN)"$!$,3hjl{thq\YsvmYZ{xkPKIHA:BifdibRd vu{t(EJBPjl`_\OG2#.5  ,LNPKCXlneuyhi}jOB8F_qxsku}}y|}ka\J,+2,  ,Vjqwu~e\cmeP=B;,*;UjQ+2FF=<QaeY2*3  gmchess-0.29.6.3/data/sound/1.wav000066400000000000000000001705301323660377300163420ustar00rootroot00000000000000RIFFPWAVEfmt DXdata,u&'R1$tntX %2i}QK>P?O~Q:PYH[gmRr8yD@3*$tWe{d;;A36b~ws\'3TD(~ OJ=st%^8H~(.>M:($,"?sz}f]L@2EPis~^3`( R']  pbvex}}tJ1vA6\:FMTA' &(-oylf  |nurd0?!CkvK' `H5:5QXN@LZoR u{chq.;AK>.(AOPEBH`[SKWNAj_RCJq#/O^C?;B6cH=m{sciwcgP--:(^iYhhA;1 %FgGqtsnj?b&kxTczD $@^]O]mW/Adnkn|vre z^(;n1$P,"2jjPWL HPJU_K.wgr24! "|SXZ;3XL6LcA *)$* CB = %-:g:5zM)&h2[hBA6*d}|xD$*=c~&8R{[,6Sgp[E5NP:! xeaDU}xzt9>G `yvZB2 _$9T!OtaSSXSSyU$\H/-\/#10$5/-107W]jyU8KjVWXy (c@&&2%883CA 4)"! GozrCHErmTr.Zihlhb$$Cn -^Jh7 2?R%Ou]OD-~6(HBqb=yox'/17"CH=%"*K6Canpt< 2AWdhn(%Iutya? &6a:*NsLRqb-TGhBzwwF1&\@Orn:(>[;M779PE49LL~}!@9))y`s-9Rj]6&t{)OtiT9o[\a+AM@#Moz`1>PYWhe+1rcM%,Dc"&W=2*A` (DtwcH M. 3\q NooLy4 $DcJ .EPQ6>"21r:vqoB!ixUaaE'wbo1[kPu =q AcpR;"OH@;EVIBUltM:7]5`:dM~\0!9L=G.j}6t~hp %V jn]im9g\SES&,=F]jcQF:%b00Bm '$ )4-)%_vusZ+Pe}d8)|3i*E?_M\L+&;H?]st7V7@b3+^v_/qVUqz2ElgMSBT]X6ZtnG%M KE?_i:{p0GL}l/'?=v "=Rlh8,'#/6"{O. (GR[{r@+BF(>;6N8! -`bg SsYZN': #Gp 8heV,"x 1UiS40-((G<'$i7@|[Zvu[FPe ^9B4Fvy{"]O00-ISuD*;F06QEOsh0xejVKsr84,.1+5G=]]2IrtSCTlxs^F) )$/gc6,@^}sjH~ziWUOG[q\flvS,WyZ HMY :^cB!+?{[38,*=KM`qmkkbcM siwu8n "2I;|&0x7Uv6ll}WW)\6CZ$cspTP y3T^xf-1T|hmfN>p/84TPA6^ I-dm\@:G35@> x<I*4I3X_ rgjA  !D|X CdCh:/% !V~~uXCcA+=UTMlZ3%'U>S?1<9YR'EEMZ<)===JNNqjwu_cwfO`kYN]cIno8J6<@Tmp[J'b -r+mXTy)%1>+ @vf\=j9vPJkjtnEc5N/Qh)&)AG=Hxz{\=siMLiMHO| |@1Ys rw+i&( .q(P]n;vqpo{`hoyphm]<"$8.bTISfu!=K-rav&=_mUWuj0  JP4+  |bt7ZoL+yw_% Q;Aa!fs}6  @me7h{}Rrf35K \Nr3|HfmBwURV_eeKR~'djDE{C@JSr~t=sK/c|w_R<[NG- ?@'"#<}g<%Ag9BB;H9h0"c3JfoD51gA` '"gs /Uw_DaOk9q qJ@IA@h   kT5( 1Po],?f`tX@\]E;t3:b|D7Ow3Pt].E0!"'M_z}S:ND}Z] /Kt}SrB!!Bd}/KxLVu/21[iF=\^'b;7 M8l=aG6?|R-sY9XZt)#!l .JM8(*txbY{7. pe^ml&S3 z9'1!%Rkl.Zgy7ix`T$pq~ME!8ljW> !yytvzo}> ;HA n\H5Fae_4'==E?eA%(W}8lI47HwMw@f\{eBK296DZ/?8ZuFZETgUlZjunpUBFPH"tfea_ K#ytT 2# }jREOyBhu@E%1Cl WgYbfwwI}KWt/O~sK*7F3p'fEzg'MnouN' tfbj/TmP  0$"|p^5%DMSeyMwvA }</yi_PQLN[g{ -*8DL>;Tae`paIUKDTikJ.  Ghq|i@"-#'#;Qq7kC$FK]m1g21yzSl.7xSmms}X,wQ$'JX\VJ~.MnrAi)*   $f )Xw|D?H.v}:Dvr;(:Of 8+,Nxux}hdS&*<BV&'<B2f)"S{tK#a<%(R#[tuf_D>>(pbG::UOl+/}Zfg\/;Ymyt?m{_xzhC !+bzxPwyr~$3Ho}: '1>\b2r~aJ?3"&6V{ml~}~~e%/>"%tb-((! 2q z= 'X)PuoWStD!$Av>{$|9b/'N!O0jlT=z%7r F_X_X0c[caay:SD7OB/hR0%(Ei&c@"9-  PC<: k_K"&ic4.>Uo (%;DLB\bOrry_PJ51$ 2hk?Sv}'Ddf^E?7*u,,2/3Jxuv{|)w]Q3%Aru_'%a0](@U\^k;@1))H !F-J (G[RFBt!_G(`*!&MqA F@9.Ya@CnEAdB{0K.Au./ElOF3-/W#@WP6pp#1gyfeX-a?IZh0FSay3c-W{l CrK6;S'F8;'-}W-h];XCT}UQiKUI6gi?1Xq`MZn1u:Lp{)BJcje]T=){B %M6H98jOcm|[`?"IrYE50I8:-|hln.GY&i<-oVC96bWxmzE95i~ w;x5JzQ!gkbcGK4 )5T&rdSL>{?I<Lue5TZ,fW0. p7Uh|)(D]lR&_': l|EZ_3:WatH(4 "MOoxo |Wzyep4mEA8e~/lWq/WrkB9@nW%yCKh NC1jLKsrI>jIZ.1Qau4 Fz8_bH~ )+shg-O{}E]V7VN?hH2iYDpaCQBbhS[E #5P,K4 s#i*7$75F7<k PllD'e%n$*.V"E9+j QA`gf@D7"Mn%@ 1xG~8u,+ ulBKep1$iPQbv #p$*#.g8:zeTM$@ae 7S*3X{bYN}ru|dJxQNw:nLhjR\A7@Bh2F:NZbl  @c6UL^ V-?^?'0(9{|E/4znk*@(Yvk kt.wF{R4@  cB(VT_ih# Q8d$Ee60rt3 5kV:*#T-ba; e'"&hoT+ug5AUZE%\By% x;URSh~cd;LQ.bTKAI\z1 S' @:}| =3)dv93*h?P 6&-+XRz- H7eY~>DEl .'XPWacKO=Cr_(ouI:IKX$kMX6}fng<Q9K<qVs{tBhvT1"T \#G =`p$MK,4])lz7W98wA;ebx"u5SCeCms%x# /-H]1OoQT|bhpRT O(vz$AvD=/S?6~ " Ju&$O)C]~Lz"$vCh9O@Zkj;M @iSe?; r:lvd  Lg>7sZu&94uM(Rj z"rj>& t?;3H,9< (!^ 1]. v~{c R Il=[cx$/!p=:-"es +ZH1u%CE[$m abV S:fq=AdA Y A ~R * u B n5hWaJJ(=,I`Ll^ZOwxS^/{AJWN<: VI;68i1Z El, p  Y S   7 @<9v\]_i;hI{ sH'r2kYr\ {CdUIl>c$Ma W~@ $ZN+ a  s q G  0I{x vyxTs?dj:/V O8&f(bA&19Y'~=qlP/Q;<    [ iO":/,\,0s84&N3G(Zj;9D0+SWt8!%]YeEoR. }  ! z R L/Y w e@  Kk lNo ^sKgw9B&&e7hO=77" ?>~1Jju/}Gh%AsxL1[ * y I :t b 2 ? m  ms j /I(d17\&6RUhG(Zx ^56UIKU?K8,Kx|rV <l@,5 V  5 ~ 3eS }  A r w " ??e]=3j A$ic;btb`kJ|WgbRoroD8 p 8 |  > k ZB$ 4 > ) wNgd J 5 _ Hi M q \H jE05}G]"\N*x`e0#F<2 y Y HyVN  @ o  qx6<  lJ T> L fybsA 68& /* W[m&nRK-_$s@ENjSD@ %c! : 2  De 1 F pn7? g }TX+# K >u  ,,1 KWq= 2iXAv{kQAZ"N  2J\ r5|  o n E wXu KS V W ~ : x  I2j2_  IomNG!B :w;jTu "l4i o !kLc _ dE #  nNHWAg6v72Y ] z,?PJ5 vBn;J wBt vr)9)pXO9;Oo{x'4'2a=Ti0 U;  0 ~7 EV w gvD#a $  + ]fF  SY*v G?KMT] Fށwt d%d' GD5jGn;L3  >i sn`) Q kj!'zf  _'Q\% 0 <Jn  M1]F Ir}I \, DXS7S $ nTzx#^waL] &}!;;a ^)<la# s  2 d-4n Dl =O <V@ |y:]z"Y [N|]a[N6.!uiD4'}  l} r! .Xh X0 a [9rWwS b 8 U; HV C^ & p&H) hX DKr O P/C*qzm T  / ) Mt Z$2d P6 ]h% ?>T  K )߼?hk "sATo8B7^(y=5Ti4U<{AqV[ H Tv U PU d@ ^J-rm @  }6y T / !/; ` A/߻&e )U`lo+_37^B 4 v(E UP> 1<  hejP&yU{- ~  , =| A Wky! A*j4]  nKj`{Dz?x1@# Ab4 7 ]r I:Lq :2]z u  . rK68 v}ޕ, n3q'a(o %\R(M*Ia^cO>r6H L j5 `JX9Jz9bi R-r u/  W@Y,pQyK F g&Z`P@ c~5zu8B/+fpj p/- T(^  Y:6\fBo `fXC vd  0D) HhIi -#)q 0 ZFJ8(_Xw>1JLyU  D &3A  q[H &z W"nf3 X??Ar tz&]CQR?ؕFTI<5%p'dbo_O7)3D<#"\=safh {6Q# _&) 6 x pb]~C[ WLd2T Fj  uԹ ? }ڢ )S4;&uS=sag Gfo uS F 5onhP@ I=\J@$D H[ & q܀}q vk _ wF;RED>_@,4 ,0 *vHcwU2 D5 o DlH)F{  +#7O\O\-  G ݎ#<1q jd):Yk6@nM:c; Hs$;, O{x X_ ` W fJjFR5 c(!: 74  P^ $i ߑR92y1,N0\RD^MN<wHi]y q >I '9Bq Lbu hc Qpu ) G DTB s2(!O9D{U>FuNxXd > `CN d ? {Ut ; :\ .d CC.JDOyU H C u4d٘ޥS u2n.VV[Ru'mR8MPG*= m@-zb W >> !`iPG!zDie RQ: J[.>Tn +rF'~ :ٴރyJ Ge#6N}}kGu_CFjeU:v f FeYT y 1y9+yHz0#a9)C7 #  c"90~Cpm'e!e*#m Jrr|Lru5y BI K/s viPgUapa_3_Hl{a 9DQ؞z K ~r +:$`cS3}z'{4 r:!lO -  <; N%_^WVC  :bm %/+] A\V C~e^'?>bs<XKa;zq#_:2  D"|:  sv`gLy$N4 8-g t {73>*yg1tPM)A s"b[hq ;KWk! X  Srtl 'x$AQ"n.H!qR_Ggp.<@N޿.8~k}i+ R~ dZ(1=F .4 \a3 b W/q!@R }wO : udR4$ 3s S UYNJR+w> T9#n otc g< @X [-)*yAyQqBkqGq&%pZR iXp2 }EM x|W(!#aU4q4e Eoi [S^q7E q-bBt@YrcAFl{tk|tXҬo^ldI 8FJQMXIFJ KR;y  H on?i9xI~` MEvADN/u?NwNڑJU(83|qEWU&_V&c$MHj#| 43 -FeLUGb F .o|t;d $oBAKC5R$0:4F /wBk 9"H{+{<}YbC*X[  vr,$H%KR L4q ~`~pQRPn8!! *@E]<3F:k'$'`m>+)IMF+/m%mX}?~MAZYFA1GD׵ܭibUyiTFa6KrF0^ule8 (i *+FTi-1~`zAfs; (4  { ` -RIH5 '~#U$'BZN^E8i$>cY"waE0] >51 LJE6]0u HUy EO] z.v_RAz5 k* ۖ؃AE<o/hSUaIWSUCjZak~+ x0e1PiM50@.]?c"B8&kS T94.N)/v (6WnP('\02*`PAGkzi/"GIbK T`n  [yDVU<SN Hk, qQNl+g#2]N #aNob]k4 j{rLE}HkgH >r vGq["moBD<  TYo{;ہ^@DZ#K$d#S7\"KlJ\Ii=y+ C)={0Q 1D\)LNUT g '+/s;c}x8f D7E`1~+L ~e {L'iy b!S=x& hh %  OKb3 U7TT j z)[_ | cmY^o=v9QPzZ0f~!a 1$7m ME C0A 4 l2`|57]2F'A,& 0J@:o @{}mX w>*}FVN+WF3} ,f#[ " ,k W: A ^T  &zs8f-AuVS6ڞ<`]L  7A)iiX~GW&XHxm yW:x, bMI \R}4`,{p $U޲ۛs75(Gbp5 ^_mmc\ CUF *7 {^04 9U-0+FJ O'^ fb+d/1K0aa KA-;K0,t  @{ h v C?zTj_u& K!^etJcrF 7=krQs1o')&VP!4 BacU6ql>o  y +7n 8"s `U&1z`s{Oj)W$L7uo,OHy& BBP!!o(ox|P 1uL oD%(B\ F :Pjvn5tESD8Z.{d(m  Koc 87!K~}CEPme04pEb & %kM r) ] u)yN4PRAa VAC$\_|W/1KW!ZOJjRM_: iTF. zzAcfl 8Y 7 > Fi S /7I N'wZ>M%a} `~3<{ dUmpPirg p 3 gR+Ln eX ~k  Qff6 LmQf ,^H;'DO߈a_`%Ylz{F D< d/) 9%l lP #)"l[+ ]  c 3kG6D 0@z ?X_j<>`QZpgG#pS 81 -`Nc_~ FR &haR 1oN)# 0}ZcV3F L, WKga8LnOPumM3~%Cfo KxXCrUGZ [ u/x f6 , B  (@' ]u& Nw$nN5)sX%Tۦ<7.spG7}m/m _ ~ig"8Bm_=A   Uy 8!R v$ H)g",y 0uv !{kj݇ir7}6 >c :; z`P;Dz6|C h t jp@" $ f f3; cv4  HB V.};"6U7{r~ݏJ#HyI7m{  tg{= O'xT Jk_;c*Vd? ~-q | : Pv.z~M\I _ s- $=F})qlTJqVIX l6'|[% U =ZjB(T~ T X Q8C  ` 4x= L@ K)3n O0r܎U:){=*~+nTu V: 07Gn|;[I~ l;  r 5{Y N , =/yd5D u B 2 e6UmYMjk0HC :0Sk?)6r'I ,R>W`GPy.{' 9 V1@K4c ' 1 InL:6$ D Va 'mjqN:Ib p] JTY qU$ uRa-KXO#(0Z!O t? h Gc^  ) O{J X  pvvZz %zHh*o1[9t{t;q`O ah`vJ^q!` A /RM ` X Zl{Wi+' I7lEf!3 !>@v+l Ger\ G8 r+ ,E0#)  L J H\*phh_8)73j *k`M, WBzp=[rG M BG q u !J "  1 fp-6w\vjl 9nslCwAjSXfb ~,]2tO `Vv)P ! d %vW 'W - o x uKf3C'! P Cu ]kP@]_7EsJt=gYP6 !zKue  % S [E~q  Y} & $ @ bC1a _;2U i _|j)8}*pas "oah~\mb/(#1qb T Y [3&+%yl7  7 q` W9#In } r,z*os7[W|1i)~T~ O6%3`Q#X`X0{_  I \bU$m  5* l{vP- N 5R @ #-)_= $rt6<W9R'Tl k n P/  0Rr OD C j8Uu~o N U*exf/ae' 5s[;$5)& g23@@=Y=Pw? bq] $ 3 Z& r*  Y: mM CA@f ` a &S\u h^dYU"JP|PfJShiK2 L$# i G oK X. 2u^E S !-TC`SOQ4~Qc,'xxOgQD`WUj+ {0t/~- Q  h LJ58/ y v} H'$"2vL!o[a7~~5:;[H c~OLsX," 7v177> W,   Me\ wc(p_ @ EC'5sQx,)PjF3O/Qp6$&o05`o4! |0 = dM8X } > D   % UfZZ;gC?5AqU_AD ]2N/hU:<]\ju!f] J BZk IW D 3  $ f-?  wRP#d,|pmQ`~Iokje9 2N>PF5R{/l.tyjqNbAT< / ab q@  # m yX W-${VpF'E m%/&F87ym2pbACJ\+Ln)W\bo]6    A Y z & zVb oukdTKt~k=%*bbzoUO!+"=uq4CU] sldvR g >    o G O q  v\Wr3yq(2pF"zeI2''41t(  :+ee? < F V y R H ` 9 k &  p C E 1GfEKa}-|U@5gTa "Z2H&=}?6~1F9LRoEwg6 C \ ]  $ M    D :  I # 'WmG{coGaQDxUUs=]]P~q>2t<T{HJe6'^*GN&N0k  ,  A T  =   ]~2xTes>t?# ^}wc mwr@=2,2/G Mc]NMQ[ # I  #  _ 8ZMhVGL i'l|,G#a  5nq(& 6A pZ4!z'=Q, p]Oz M c ^< P o P    2B{k4n$*3|j4lk#Qr)PX~^}}T'/XD@F2CF3Jp  = Y u } D ? ) ngA1]'"6ZU0_)\| MD.S n>OwLN?+5p^97S=1d>"! (  ? { z  A e u 6  4 qf'Hl|pb0"@ m SUu `_Kj\t; X_j@e0s5J` d 3  a  r ! V]OZma?c8(KLrENNo,qV/3w?-^B6,M=#=CUxcohDc{p  P < (   EIe#TPW6e3fhyR~M0:C>W+M?TH_M oqJvW{nT5yCwje0a\>9{2G^(Gm.vLCL2|iL]$^:!6M~PO5f u1R!SXUvRE?Aj,U.P?AWYc jxuLjgG;/xqa! ~38`{J7A2+` "&T[MV@$g,^jl} W_AR-cfEy<>=XZ"{ jOaG8Q6zw09NTwPWZmXA?qTOgXs k51MVXs$#8z`Q9, cwOi'[zDDW,NQ:Lyr' L;U1?ygnw FPH- (TX 'n <v 1 Jxb&|nw)uRE&E]fTu,2VB bP-YL`T!;.2SFer;s4{oHU s3PxmT9H0thMy|k\x_M P(f^i peooR@hb~Ahv~tT0OzravF2X}F} .aSLP I(d .gL4|!"VOWxYUIire`m}jk3GMqw5skGrjS=iw8j #`L4C("|#kltaqL`xcbxi`rnq;61-)7>!Y,'C$3.&&_|PN{c9mzbA*%=ciD/)aa!#)Whqfj+C\~U@+6Vqm=$=EE. amD=>B7 ]^vxVO}~|scWk )FS@$wdj,04<KHyls{sl"#htn^\NKcq`m`9@JJM)DghKIQd'gf#+.l}^?!)I'!>`[@vkO8$*+>}z^=$7]uqW Jlx=Bt&+( 20- =t{b:)$E tfM97ViG* :mX !jvUCyh+In4Qeiqgc= "0Rd* 1f}eQD0 "=AB?P@#RtdT<#!%9/.xB!<{:L5 29 HVDP3%E`UJM=4<1#.5U{r_& 9aH=I`p\hNFhRw1GUisooXFcPN`YTv|rubguH+i{e6);E"W:Icp`J!$eN:h%TC617(@$Ay|svv\hd<(0!sK9Er.W_kPpw7\ZjUDl[Ytg6)<dj[TD=J}_RO697[n!!%N017AUb:,'}xpou|L2, .AR~tD((SzxoqrkecND/tYs^ %(EoZRj['" UR`S'  Qksvo{jD4/ +(DpqqiJTk[BbN,GVLm&AUhxhbYX,(*((28M+ =F  mbw3:poU-+Kmsgd2{uzzRQUQLYkhhapqU)Plx~m_dqy(\hPZdG9HC7953InufmaIDE&25%Z{is{bF<-RrAhgWG$$$*]eVitwpZ7)(.DVeuelykUbcDGKLf|cfnW9)/$46uxlT`ro  .5,RN999==) EKUplADB" J<7K_chtrzzwvZA:>OeeN]SD8F24;>CldRO>4A6 !#/Se^QPQGR}~sm`bH omyiokpMU)) _cc< CjkvWDSStzt~quxWL@.#>IFr Bgn[F<,.7CG4- /A0)9;fnXVks}sp|  wTB*8JdQ`{|xo@//'0DdjO-kFGQNX`kilnppeO(.PA#,+;ENW[PKS= #5]yn_  6_wK77o|femsJ0CYH(', ~kYL@KLLXpo{J008'D`oylJB3 :siG?_}|R@> &.(.L`TIH1wX.103utvr#,  $Ssf[eS<A'&A\D,@!:\jz[C.3GI66K\N@9. 8=8<PZYL& +<G]wxY.;XXR`QaU2=R@cgBL7&:cfK2+soonfxstwiaSbk`QB/*&>fqwc_fkr !J\OPbo^L/ (9=?&#,DpxjF!.)(".crPCL?/( %Bn}}eSD/3B0#2@7, ,E *- +/0<4#5G>0!5A89, _f~*5CBHSa;,)3) BaJ5!%68'(+<F,)#<lmI6# +"   $:FC~{{zphx{uwnctdGfwnNQSH?*/K_F6?EEP<-7Udba #)+<2/UeP]{z{'( sn|uip}_ZVNQMT`l}pI?2*) "9HGDLS8m!-AmpT,(  ,(FTWXN@=>#  /1#   )5H\TH> |rbZTPM[o~wllrkbuo]Zf\Vnzv{ePF99Q\a| +0&2/+2;;CJ[ZYSNHA(,06@/8Fib\J:#4CQWU[WZX]KBSejU4-(/I`lL@IA$09&<A *71$,.%/=4!!$ " &  1@0   )!++  . >SD-)9A?DC7#  )6MCFD>.# }nx~f4702=?AA70-1,Kc\C!&5WWMR^eoh[EPhtujZ_zlXJ)#9;6-,;G<0%%1SxtWaugP]fkefjzu~ykA103! "!)0)-5)2578-,)) tocQLj% '   ! +/IFQ^gl}]E>LY^FHU_OYVIBI9,.K_eQ>?FK>B+,4H$$);V\d]MNWG% ~xjWTVmkqqbeYb_MUqtczxp,0HODC^ZC83.!":A?LQ7)7>  *&*) $JWLS<$EJ9S{iKK<+6BZjiX\YR;Jg{ujJ5$#BOC:LU`k\>>:B7, "'A7&&3?, 72&5. ~kafufPMQYel  ';Mq~\XWWTUIH\\a^I-&4B<:K,6'#-42K`g{tfcN3.  $-6?NL=-(*0D8& #0IXP1)-' #)#,54=8+"/( >I=9[kWTNMMevtQ=BT^Y9)&&#0,+GB#)SO/'242?3%,%!&:CNgqgJK\_aqmaVQ(~oXbbpvP9BYoB60,1* D0   +!GTWmsU=7!vyoY^NA2<]vja{lfbkdPTSK4'/:P`ji})$( $ 2/@@:79;[hVRPL;.)/6=fw[OXx{zjVAOffNJ8 *?MJK`~tL714LM<($2*  %K]KDRZbmjYbZQB?NXT^a]POF>(wizzhh}hKThL=K]g\Ys$ "  wpdm}/3)=SR*wx{%;ivv`aWJXjP   4OoXMG. *SHBJbk}skpzwrfcktnk]PU^USSM65/(  &-?& *96#3Mdg^lffkcR.-HSU;($."-HXl}M>@.%14 FocOThmh_WLD>=DH3.A7$ynrqO4' 0(&9N[v{WYjz{VWnzscaXf*LI>H[A#!30 .@41 )! & 63A`nf}hbC)& )?GMT^mV\et{wougflbT:@;1$?\?*#18CPa~{R7)(-;NM56/-@@L^_ZmpoG,/  gh{okxwvwu9FGcuqQTieHOW^\[MV}zTA?4#-2,IaG6ARULhrwgsj_bv}v|jPMJIH=C\`ZV_VSQL<5BHIgvmry~lR2yja\~{j[ZA*$%AGHBBhjmz/<>FO@9QS>:FC8)('0JUQ>Vacsill@-7= $!'2-+<;()37Beg> *5)$/ &70!.$    GI  /3 vm~hHBmsfh1 8;-&) "*2(',77/"1<^hT1H\O@MZSUztZK4"  )+,>APQXK>Ebf]SNFQW]^de[Z]ag}kRLBFotp`O3 .-(3PM560,B2k^H,!JM\ +!-($    10$)?0 )// #/25@gvXj}`c\SMRJANW* /2'/;.2SRNUa}Vanff|v[]M9K`GOR14RP=J[aR]Wgh{~ksusitovrw]fbQQJ6;H; 7ELI&xaibQA88>IMD7,HRig}zhf^NHPLCDL:DMns|msyWNh}xpmgskz}}hM>?Pk{pv 8?'!   8JLiwtf]Z>$:XD*<:E]uythYK. =,.3.,#,3  @YRnxhsg`xcE6>]SOK5Lzh\fP0$-5( +9OD $#%ON3  (!$55."+=TZK7;,4}2Xu`PHY`R3*4B$2/ (! ?+ +9$z}uwrzr~{dW8/;NRq_6@R[md^iY9#=1?LS\a]ae^^ZBHdSiqE?auk1%/GGDWgqcJ6217+""#1A@^w{ upnw{e<*CQSIKTP9-  *0Kmy\' )$"giu| +;-(6#*&!7!eo} &%4Hfvg?&) ")  &5+ !+85G\fuvsyoyq_M%/H^mvyrkmboqhRGMQ)$0458<DH0+LB3>5-BCKM/+BI@E[`ezt`ekipqd?,?>p^U^hbNDP^`QNc_m "54&72/SSHSfSU^P# +&K`eEC@Ee_JQD3H[ )C0'#0<PX:Db_ug|vt}|{dT?)->LK;//AI?."~}dNDBUeQHIDIjxz gmchess-0.29.6.3/data/sound/10.wav000066400000000000000000002754501323660377300164310ustar00rootroot00000000000000RIFF {WAVEfmt DXdataz #% )2|cp  )! 7:>\qpvutskOBCSN90Xv`KVajyv{dN-$&$%'8>N[Z:*3 9Ldoih|qM#  )*2sq\f ~oyhlrpuwtm[A)/T<E*!>>Jc\QPTRdx|okOC6,-65-8<BPN@GUVITcj`o~W5((8AUfM30$+  ' pU/0*.[`LCC-*!;UShzb`H@1.=WYOUsqF6Qu &7OXH<GH\  SndzoJ>IBCK;! !(24* xjgkiab}tXEFHH('H`SYmr`^cTWlF~nufVt&\vl\jY2$.9VT>C/ v^ingr )d`xzlMTqlD05  *0>\lzsme`V_r~x]R^YOau  X{R?I:#  EJ?-  $&:MZbo|w[LGJNQVasjngop]ivhmmkzqDOd\5(:8(/CU>():EcpcFKPREPfnsocaa_HPegmm\SK(mI>AasweJ+ $!!   !=8N?*/G<,'5cx 2Hr{QB3, 1'.Sad~|_XP`~p_=0=IOI*%0EFEP\\dxyq1lXVirgac`Qb_]RE>Nj|y`NSB6$* 2IcfdYlqXMTB6?3,Otqchzx[B7-5W| ,5,%1528<BW[pmwn|\R]r}oev  "kpir~x\jT)!7GaUsXD8g*Fc_M0 |mg^gg\lrQA2'8NckjiaZfyreb_OMl_VcB).-'!-t)274) &*"(<NFMXa^[OGcr\A%$D<3Ro{y{xj;&1=,8eswbW_ACBLo|scNGHQ^H!  0"EPE>F77;'113:;CB#') $CTLN8 *@dykVH2' ($ejo`u,E;*$!   #*LVKd|ec:/# )3;D6CyruS$tc]ixpy~+OQKE+8K8"1OPD4 sq#J_`C9A(  w'".#+1NhDH<.K^D3#'*  JX\M74M<L  zwggqs{lyya0|eXzud~3CYJ&#$4)"&#(#3:Rb`Ygs[cfK0>1 wiLY7HUR'mjxb{& !3+A)%0 xaNDNaetrjnei 9PgcR-;H;1' *4F\erw\K+ !0-10@RJCenZ=!-KD'-|hyxmlff=- ;FWB4:IM_bODB;=61.@C\M8/B=8(?=LNO{f5$3/A\Rcps|bJLryfTN_dwq[_Xpyoqv]N[U@97-#1\z~oB+ *!%  bQP<3B$'csHRL-&BJT{{%Gy|cF59Li_N9:YI732%##;mxbTI/#&)MwqjN&-(%1<* "!IMG?EQ}rT>Vo_I\V^s=.5BSZefcj]B)<NaP>.   +@THCb;')1Lex/=PcnT6 & .PSlxA% #GedZOw~bIA<DF@F2%0*r1.1)02!0419CGMUXhkxxz|osu[(  4<1QoxlwkWNQ;F^_[fgBJRPB,!#Okupsw{ta\edZ^|mOSfQOs ")>WO6@_siYvp^B-^| )BLg~~vqqk]O7&%* kaeST^I?QshV=Ez{oUI:#pdh{XELfpplyxxefYdpyp{sl|a\W8   !6Ojz^]QYD/(#.V_\u ITQJ7'<KXuZ)'DOf]FB9B/,)&"H/+;RUludZPG=6:. qIc je}np|iiubO[m"#CeqeD59@0$<d "JTQZtg@~ri_eUTOLNrY/<F(3OzzevgD2 u`ZQk}VLN5#38CDXJ ~bgr}ttjCGUT__K3*R?4@B3 >HQ`_Rj||gW5"'BTdh'0Mk]WOL1% 24+"4QWMB "CZq    ueU[svTH6zeg{|dNWZXWjK')J_byc?% !"/Hh*49HXcx|psqbH(7BKr.;0B?30$-8=="9z|wmkdTosY2  a4yjgzLPHo~tL- 'q /4".%1/7OG0>-|(8++$ +$xb""&$);R_kX;8IViZ894$Eep{0~Zalzf_oX;+$GH5.! 7ROP\|xmO;KHOID:OjT$gQC3*2>2 AW[`p#, eC)8gs~lykl~oint|r{t}~jG/$qAOcljhqogRSQ( 4nrdXF9PD DS.?L\pbO6,0-31"3CWjkpprcX?M`ondcml{r 024/& *l{srh`g,+6KPO`vfRF7$,$  _ZcYUW/"AKJJL7'& -Oc[6)sB9Jeibuyjsx\FXVWsppYP4+ZaBS|d0%&(Kj=?`vwSq? 2Lfy~ltbPtz^z`+-JJ)!ApV OZ 7TV|g{qdcy]>KK(0LG2*d=QzfRYiP79]iehmcce]u{,=GWp[B8Z|moul=9FF3> 6JW`O$,?HLw|smVDmwU?O__NfvuL0#3DGKX[|qb[]OJE>e`FMkxssoWMSkW=;DPR7     _:'4?7@`x~wzg/!;9,OHBP]XMa$,/JcpbanvrpPjolRF<-*,NOVlYPbgR*3Tz~{~^XO4 $U A]huwrTXTq*6"5RQeI%%..+& 4ZxsNQC% #4, FmeQOJ2:_ejrxwbK("$>D43).@M2+3LT) $!   +*&% /! =IKSI|n^PRZS@&%8f$' z{suga|  0?0(/!"0C&&BlpX6(=<@+*5VZLGYJCIA/(  )Sd^RUNGM\zYOluoT1:E>Egubhyq`T-+>VT>ALbodHJksvxxnS=&"!! $=l{eltjW5  "+&;V[miRTk`SYG3#! x|oM70*2I>!+ !# *07IUUP]j\OIQE<:>ONTi 3.*F\Ph\[K(/Zo^b\H8D/?joh}|{vORH6!.0* +[t_JEKA.$)Ag}[[n~s^@6).BNK8!(>)(ieWQPB'!"'/CU];+QeE"  5Ne{{oippjZJUMME6&;F:/J|kr{[7&Nm[49Tp54RP]}?gG&$MepaZVBfi8XdfPIdh_syM=ZY9)1Kwtclkzmad|}vB&*.ADDBWY.# pG. 3LQEKo~d   $ $?@LHDnoqtukW1# 85  go &,BibVID4% $# ts}kOB31CPYsy|kmpk|| +\`]lscblcp |}}[9(NaW/(K]gz\4 opgPMX_t /IclU_Y:% $>mwkgaYee]ya6/<>3!$kL?~)208P\O9-1CZeqkL2<S99Uuk[PE@ 0Tv}b]mubW_fTN:-56/2'0 q|xkcC82ALRdnz|lWJ71@MPKHQe|cWYnlfmdTq 36&z]MD) $?Sk5PgpypmM+&.CY]laE#%*'5_w{hTPy #%.&yaN@=51    <[zpTH? }x|P4I@&Po~nD!?OvunqeH5?H<,1$$?KYhpV9&-HOYez|e]`y4CENktzrdP?:GHQQXNUaes ) }omnsfWM??0$$53-!  7PO4#," ALC>Vs^egt~~nt !-(4O\F!zI8Pd oV8 &5BaW? {rt {qvli}~ziF57KJWZF1=V^: 46>SprkjbQSUKUu}|p\Uesktofm~}zqk~ %!/FdsW6<Ygo{wu{gyW:&'<NSBKP=GwriK  2Jhr~stzyP $B.359MK<A9)L`cV4&7E4#oWF^tcicVRksvr[E#   % )*ETXboz`K;' %HIX|sgR$6@?:<:)) $ ,:K]rnO" $4<=]oz#PQREGLYicfX[*?;$9A4*!,BA+3:::2 &YR!}ggb[j~p[Xj^ tlyr^jdGO2Z{|]&<C1xkzo}y$Fdf=;M1$:HV|wmMH;! ((.' )0>g|ki]-^_^ZA=QvxexZ:<7 .#=>Fm9IQ?w~ 7< .K13h_->a2?SGT>6V9"" 9=`C$[lYd8  $4&@ZVG9 (.,: ~}y^zat^P$% HduPfN8FgvRL8  /S> 'Noztorl <96\wvW=XL79AF[q^yp\ukRqzPQQD:Ycjxn}!|C4D0+566RQGX|nP[^Gpo{vS&8gcvygsu|~~gj &0)*MTQgqzqZP[VLBJ@;:EMiyoc[kS9DG@%+Sn}yjz|k[z|]*EVaXdnI4:7##Tjqar~}V5gmeZsbexlcQGETi~tiigcUIVbxvidHCC)!.5JNA'GG:D(1@Ry||`LOaj0a}|U5!$&=: ,:Iasngm\O`{ej[m )(}ifuZ0  $BUUiiS3 70 }m/# (I}j[syqehWmoXO92$ &:\ZNb_jr\QsoP6 0GRrd5&*Ef[MWwPZk^kSIue],q #QxXgj)0=:Qt d]fTRL/, 9`t|Z],i;.n7+.YjnT2IdhzpDoy(;_mgU_]~xaYqw|)S3H>goetE-Z8hJAgA~D#es}@xIcJdX%NVCD1<umO,1{~A|mB gLH' "3=4VXgwKlu|ii&8~c A'?3X$z? PIn,*QIo_F50E r`>YLw3,eqseLE#9k@=KjQ -#ayz:Uv]Yi>yMW?)&N1  b.iBLg1sfMND\/e'Hl*) s8PMB{J26CU1:PW'B5JAZD9/=W5_W.j1WG}CIB)wH-e/YCx_0YAmwe4c[,s_c1M`l<}eS1[GfbO Y>7<In&^pLLT{lFl8 Hcz,)J['$oV5#1KR!]V,^Qk ia3Y\mn1 >G6 ip3 |.&J%CEu@0*Y2`;5I+DPZK'ehTU)+e:3uI;2 f#b [ 5ScBJ1[6aXhe(+Z,DQ[W/{W-Us=e'*l/P842U3\4ZCz0" O?U.c#'C]$JKJ2-5y__5N$Oe>?-]U;$0UA^z)eil(%ARQ(MJ.45Jw);yY:b5Vml, 8~x39r&'m$P~n49|3 V5zRA)R\D7tV2lTKv lwzG8*@#,a;"#_I,4q ~u0v+IS|L<&s`']1R9C2t>n+y9(MT/f4hQ'L%G?[uD,/wp?x]u|?lZ>3qJL'^4U606_hQ8<xw}(cPqh067<PaScTO/\^S`D/5U6~zDLb_/Sc Oa g#P9VciB SjI&f=xj4H} D$`Qd^\ 92+nf}o.bF_xc$`-b'cljI>9> \4?6_'HK1|LQOkAk1H^n4-A] cUG _B#QnQ/Gejl.vA.+jWbH{_/C@f{|m~]M!S.pmOibuCb`p40d:?G*z^GsN:t]`n=VR,AN$/nQp;'>3Z-u6LI1@?x^FJ;_cM:@n?a #mo_F S<D%} Ik_W6u9x`baSJx(p''v)b[ o B?5M0Qdm,-vp_T dgDfy_#Y50^,<8+cxokw-s $J4-5waou)!feypq{&O>9! ,}{ b@1)@fh/3Hz7r?1(s N6[8C]kM|5GK0*Jd"lBb`h] QM:6<>zK9>v>N^Y[ \CC`Lks x{&c{a/"cxZmYn%\r9a89Wz$]n E+ px vn[UObs$#x&2@a+fT\s?LBl!fxDVCzhOLzX9y{r2$-9ECy _Wz) VbQn% \Vy.#7<(]\ 2LeZ/s a)4x>b2 yGg<hS+ +v~NC{V+AK;g{ 1 CY? /2tLj<DmirxQ I+(cvb<>^hoYIL4?9P`AB=|l / @6 90uI  fc < # /H" R\q oC {f  cL &mo  ,eD-VpL*7 U'o XUW e Aqc WEk*p"#s\nkb]i KmJ-n&" N7ZJ 7 l3@ Hd;' w]aF D f 1Ao y[=FwB o :'m  8,mH! O/Py 4QI DyV~ s"g $Q (e^-[V{} Lqy  MTe,vnaw@ w?d Mk{zlgb%q<-UU rti2 - >CxDJEz [ R_]1 NK,,wFtGI~  sOhZC@h I>>g+te <MIg '~\ j Fvf72lgmHD3w q~uV5~*L_!$ 4  0}c3 UO72"V5/_Ee f:rS@ T|3! :sMK,M%54`  v  ,f`$ n}[Pt  h}:%m,  j # ptk4WHhe itQ1D&~/ u2E v4!;JgiT; 0ig ~ RD@du }"7y )\R\ "(x M5u4<0 m g/=gj , _ []}6LIyE PK#U:Z 'p> %jui M7`[ A ,'z Q  $ on2=+ %$ (.&  N bpr& cpQe R%:7*iEckYji $8   zh Bk{/"; ^^Z S @E  Ln9} TvV d' ?n@sELjM^) P ?-QU t. | `$ ex+ EaYAwS/3 <s ?qoOK32v =jp  |%i 8 J q?Ip 7,K:^)kBzojjJ-# qqROY |I' .8kg-g V&at*8@i Ou'S^Meo $3Fnu/lJH[  dGf(Q GcSy^|.($;l5(#  T F~TQ$ e<  8\ 3-A;W(& @] '   ]TG1 : go)ch YX$O JeN (5r d 8 >U Byu\SXlg 9x R(R  Vp $9& BhB x I|_*k> [Hy 6?,}i 1z,U:qa{"  .  N `Y0 ^ 8iTeq :#_  5-H~#^9bQJu- C7E  ?D0 qRt 2'++? :$ eQ1 T t^v B TK U/F g K 6iO 6 X7 CKi  > mM ޤ w]/2 98 -P8: _D=;Z)/ Zz *z  z 4$0b- >L}x'@s/ K [= O nAN   P9 M u f6wN -T+ }:A #;A sjQjzb6pim/@C 5}9/l 2 9OMYI{ o% t3 !l>:- /  D Hh9#\O I  5Rh~R YKafx WQx=. Q(>93 ; wx9  W  of  K, PRjZ )A\+|} A Gja4wuK1[xSq!7.tD 2j \ hn) r$Xk+yA #s%h obsm_ R #"w:$ !B'{Ztlxah?)zoQ436SkV^ Tt L) tc??6~+)L)[L,OsfV ":;`gR8E`PxRmm5^  )0gBo1sA@d^u QElcVj)D2?{f* 0QsaH< mu-htzXQgnHRW nYknjwgX!{h[Wqr`w-Z1o [$5,R'd/hb{/e*ju6 X@bX}\2 i3967|a99,u~;W7ct3HkX:%>G2\m4<}uzO*< U,uH;iH Bzo4CtGW ,SAgMbcS+<24hrHn@y}Ia=ysf}LhQ@&;$/3J S~)2C]8Hw~~C8/NncS#q]NR$\XD.}Ex?Jr,LV=%Rcy'K|J \@1Onw9D"dn I! F\X&P# 6x`D]4/DJGV~,>t9*7+G.1QJIwQ1vxEb 17"v 5ITr Wb&L,q%/ SYfKJQ[:DdRJw)8)KC.cy`%1h'B3Qs~ CUnKTT{/iw"q ^0@""tjYB}H`A 4bpA1?o@Tm RfrUbg,)U"s=owWg-/Fy:eYrpnj|0Dsg B2XgWj.bRQ\XD;1pqH- CI b;Rrw| a/"B{nCa""tu+JCo7`VLgBNaeM wG(7' nA S* Q 6q`/7 '*bw%n<'aYgR)qrjHITx &Mss$h 2~yN;Z['E!kMVfLvn{\F0g^w-Eq;}UJGe~G,})_{N `.G:nzg6At DT.:Fyncu).GO^4}j":HayyN)<P0-jZ|  Ol8 &C^hDslc8%wm )\P\6LQNhLkZ[uF0U1yShp yf1"_8_voo> #@ wK&nm]|Z9M])ic6HgIuTo) >%dOw@;>H<=l~E `"fjJ% R@5u+*U(K4zG7 3dm+NYmkq'9 CA?&m B%7Qy.dP?Xh^a_]1emptaSb-$_P#l$";^,+)0Lz8:R|`#z#UoV hSu "/[@l~*31S* +;Z&iEgK k:LQ@+Ms /]]+u S6R+s9vOBo&fL<)T<c;pW9 4/|7w 1/mWE;TU+~hFxCA,P>6f^Y3RbA9:?m;hQNj&C{V0\v,,.R[W?Y5pl:#`my_d1cagySS]Dbx\Z`XJOktRl,~F2^p^)(gBFq`M(]UU"K^/lHfv:DR^q ObcHWWbWP;T)cp(h=IU:GTa`.H~v~Lf8:E.+V jIw>dRnk-rVS-@WW/L{l*O7yzD_HUUJ'^Dm+g@y2@7GfB{F=mLs-)t0z!o^S_`?qg7(%s@Pp+c_d|Bk-xD8Te d <W? L  j/Fu}L  cM {. 8B8deR9W\"e-`zk`/qa+!tL8CH.eW GaK"D{0]|:h"Ye>_b[PF tQugOe]/_zjq6!_u;'s!(VVxF[H'MmX O s ? k - ,l, m =Pw*#  E( [ ~ 6 3  VZe 7|6s ZEK5g*g;E k H } '  V a R 7 5 \  ^ :  j  / ( H U Q EejHg8" q2Y 9X}G~Hzu+50 '  ? ` 8 G B  # d  N @ , f ~ 0 {LD^+ O.OJ]u3 Y/5hdy4Rh?*hPE7Kx7w8Ln>4Ld]>-U  7Wm_uI; 7 v f "  J   x w >   D | I n !  9 W C Y 3$,'BSf8)eb}ZT8q8~msMAp((arrJ2\6SvE)~(^.Cyp0"sdW 6 5  _ 5 = ; 6   !]<?NM(Dqw6b-p'5]cOZ 'QJ(0-bl,X!.:4GFu (.G`(d~;WgJ pee:r~9= ~ 2 o e  (  i R y 7 7U:| ) ' D 5 A0f:nrG^t`bZ$r#Eg(U]o"cxY Vx  \ #_ Mq6K0%2G} Xx""9Ro[UV$=(@aBl?U(a @4W>y!QU:J   $ : ' o N n q _  Y |  ]   c56 ) V = f Y % :/5tM Fi3amY8"JQ>-Cg_8j#waI(&6Gz yo|"89ZP^74 B "8 - r I  3  ~  PkO  z  5 $ iARw*rNcm1"JMBNFt+\F]&lJf".EMp6:nh}<{q<_{!D>OZ<D]&` T  iIh { A f g V 8% X M  k   5 6 nDf4JSew8O/R tU8zG"N7s4YJqz<{8aaa(lkIq[{uQq,; K @ Q V  : D W m `a)_d5 | | [  py X < Gv ?`AI"~8 Ji>X*<b ]'#vTWT   k 4 c c  r tlPV#?4  % Sn [ @Ea xV6\nk1JCtz0Sm rvw"O/* G M5(vi-p$U6|Iq(K[K/lrMcJw< l I X  v [WYqiUdM<tQq$ (/&r 7 1EUX2u }mT 4AHY :"35HrE.@w^pRDEvnnoS[E=" N@WaV35 0 s  L   s ] J  c [ 8k*G=_Y`0- L = (  + n 9 i;-\jo@i]s2)tO})VwQFAQ?wKy/^q_%WhtevWM2s-mQ<dv.jq4m2%#fMd.IYF5 = [  h LGd,!I|~1L  r 5 n "P(Ko2n18jFs+\xj@hM/EQy00Bz>|S_`Jl 2iA"@Tt|8 +j' [8Pq&dES,PKX4' r    &h4 7dm<Z-#  I=%Hl :xHG2[>^;n=mV@:$dmz'9BS:n!?[1WA5y{>)TPS4l7x[x0Z Xmf$29./(fiu I R K } @ktG{ HE;< 1K \qs zd(Wq(i aGr*>!?[h7; cs[#Yw?(NXdJ<*0ZtKfnWzIK_<] A P 0 ! K F 4 "2]$ Wvb44 GAw8 VOqxS6|)vB@ypRsXM MfShg4p$-OB,OxbMjF=rchIL u H K 9 D) -7B:TIr m, pQ b*Z-!``"\k ,n!wzMXJ"I!k<9E^}4{ C=f.],Y;> !n9 $?A hPA : }wV  ' s /il4'\_Rx.j<^:.r   ! !M|G=DX}_#a4b|fcsL4Li17 !@TVJ#tow{O@H TTc|pV  O#v{%?Eua v1>I<l@ w"5`Jga44gDzSy-5Pr 4`%`C%HmW7wZoxwpH*#Q] BuwQi1UE"S9H^AD)3w-uRbs'ij '  wBuK1y|;@B$0 6 d oRWnD!>meQ `gND_EB|Gk  S q 6 ttWSNJ9}RNh E{ME6| Z  g 5(d2Em:z<`Le]Mtx Rx }-<#RXY*7E{eC eWO>)^,@t.In#Sb0smJ Q  B=S4#dDp2!83m]sh [J 7:/,KSg)\W6O + s\D=5qTRk3X>u}DftpIrZ~NAsu l\dL_Cmn,]qB-5-q\A y " AE5q8.&S@ztz9!x \ K OBDn _?ޓ= Xr+ xd-$p~(T4%H B 2WzrrGt '/<@] VG4z_>@~ -](N   [_sSkI<Y2`1_Y{XAC = C (mZ \=G4e c0uOZ G޵tVsKt:qz=oPBgNn MBoTe+0:|tT?b;F5/  f ZN U7z#{H=:Wk==T[] ' b j W /5> bOV< o0߂I\s^faN:e]E%WQlrp0u=%HN]`6Mh*a-e1ob d !h$('Zo?-C4k E E"JZ;#'}p߂5Ii)-KP-S3/ag"O?y'7sl=pvnrE:6gBc1\>5m-kz^V ` Ap&`B"-E **y{a`JgcXsce v H Z @4l#XXGg$9"YlQZpp~N_=  D<)JS"| 8   03%KR$m XN]@w6W M**FG F d \8,2 l.wf|9=2%   % k`gC@zC" 0\޼ l}_4[l;? ROpzF^,( -L\Knc\ *!3y)?$g[6Xa$%Y(+ S v ,e [MF7KkX^Fjsh/f/ W s  'swT7Ii3!S@mte=Su G/jEzA q DLg/U 2\^ T:,+$1vOWQc =rY K 5<.Z uZ7t9 V0-4 " I2R:#/R2Xh0Ou0Wޝ 9d0Zooyu )9U e # wO,Nv@Q3]N(=?RevF1P[U'Y* v , g r@:@"'  V|,2A<pH: q   RC&;}AM>kjP 8S+'߫R|}B5${bjg ! = . \R~ p N,3b93T "Lb)_ptGbeRbx5u9 7 6 $9l~$ vC hjDsJD0 \ + iM<O|3|o? Nޅ> \9ޠ2t7z5)){TEKb j -eE~/.~[%ZD}=r1{!m j LJ,X*xl36./AS#`Gg' s D9(OrZ<?ܿtqc_!8pVB6dt   {]O f.(G+qdHR$'k r'v[[cA( j & X+G<BR%GT`wl&h-at : X L  $ *vom\=NmyU>E1{Vm!%-WemfU\=}y W_{Aqq?B oG&W!F.dy0CB {NW@&!hP5oG KEs=EMpn1wDyO6S8Z|H "K j s   Xa IQ;{~a;gd :8unw7 :19{ 9 a [ S{0yS[7nN?Hr#-Ess,pw    [4ynT "QD>KO/F K  VHUTR. `Z\.SM='+ Mt}A<]3'L + F dx'2r6M6|$Y@gV4Xw`[E0 zI  w 1 [ r/Fw}] Ls[*A+ 7 ) Nf070x65ߴnTD 4Dim 7kV{w[iQOMJi9E  E ~ = | IS~5Q `WDbklj!BYO,` m n;;[1a43[sULT-*2pC"luovr&'* XmYByck$pu*I8cE4yqP.t a W } 0  $ l#6\#E3Q<I;fyG [ * U L  @u3C߭?V/ddtL98'4 UQ4  W e>b CN>UVNMK?z7d|TS-#wq Q F 0on/6d2}Pn'.2< x  k ig=Y6. T4߭x47v-X!/&ZP9Forl\Uv # Y{1f?8aA~d92~79B2$Hn] f(ltfe o q D g Q ,/&btDoO[JfjWYsGYC n P 1 R $E@ ?h.BHYSO^DTvO )*dFs>Oj\)] S O  D$hp<0Qae^8z 1d]")hD0k U @ w  _4H=xO|d~tE}  .# Lxu&ov=^x5BS8G$Kp]X@84bf U EV(<o7=UR?Mg9D]%C=-8,;8$ R   3 tR*"#EeVo}#e*+]#*2 \  gv:9 N*?xط pnz1iq"pXiP'4_^68( ( 6 E7F\gowm-mAx?u)/*L;t#P696wO  ~ TT h b93pl=Nf$3rWQfrV5 .  AEgP7C_V# T,m.߂ CtAEjqH1oyh9;'PysZf`te<TD g   E &A C\8Gzq 1rMK~>Ork.c^RN4xF)lRE3 A  K ;~$wjWZjq7y(l  AM\a rWeOC7A8SܔX;U(;eqwn2n! + *  N  ~ q K $ o+)!^y5U$7]-~xN?SP+Uo  q Z (;H?=XW}b [r{""v c 6P-(`C+Jws~Q\~QXv/  < M  L X k .    RP5(pTO.lfCXpAD -qfbKkM#aYy; \ ) b YF kGCt0+O3G%p#zE9* Y} % c~aoZB#]OkdtfiyHoG }#O +  W 9 g <{SrR}u+> !-lDT3FBaOFHS{j|YS o 2 Y {R/7yA; ] i %Wp` Rg  p ctkޯL`fJMu%sCNiVLy-2%i3 U  R ) UUF.)LR%&!dz   aIR | g 4 HY|"zSyG8B]sz/8m5?Wr07:U/$ 6  e <\@)` '9+\ lJ xV  QtJݼ CF YօO;}6ky03:2&x5V H i  Q g +C+EDygD)dE_bTzc @ D ^ JRD2x=, Xd^(e<3/t k%e 9eKYܗ|ֶ BLUDqe   m sU(:  0= u THaZ}a$j)z"Pd+ [ X S  h9GFw*Z 0Q \ '$M(hxA:q_D{[ݺ'Q >_L'%7n  e b paI<R` F%\(hr81fr)}`| "bS %M P x 6V% C;Cp}$zHSoJ Nl VN#mzD4"ߟ}٧ْݭS XhGYZ=r:{> e q D He@ *U)(=45 ]G "iD\mnA?| Z q( I6WA}bHb MV )  J8q)`[ݢَAD@&I *_M_"K h " 8!a%bo %7EtHT;4y9Ae>q{ fL>yzCH|9k [j AO) Zo]W)EJ*v40THh'2 e'#0EE;M 1W  ^k">/]z !XT;Q E  -~3DNN(0F5*\H>2 Y ^!$ 0XDߏeD@$UR4 q?NY)\] ~ $>Z`xT{Z|ym%.E& N/(0X ;o]a?e B;:Y<Dz|En8 Li'zYerzf=xCA2G{+mu\"!c@\JtX H-{zyIe% x"Uwv-mV\) mw :"L^It1^fXmmTb+4|:$ E ~)s)4[{ad*>ok?cUP(*=]WjQq(HR.5 BR`v  ,uSp5Y`$#+,bZr0 vE/>-gVW13y^^"c3ieNjPF}%1d,kS 7\`%Bs>5&OjOg. -tNhRSgzW.   y f s[@D+mNq+7] I(c^ -Sf|Mp~aE%f(#_1_97Pwju0 JOegNq3od};&x1rU^ Pvk;#b @\j=MsY #V]ZRM}# T;a1 M g.R?;W*VDF]hbJ\+AEDn9[80kVS{l`y ^g 2$FKN*R2"Iw%5eL$I=R  p:x;@iOKsIw q89b*8(LlNj[G'C~0 G7fRiSo7iBCcOY"/l$c23#5ob}]*{[Z&s ? U   0SJJ' %Uld 3,+4nn'Hfm+,;_?mOyS:GX * cW5,wx}ao0(]?(`%1!He,hPS 3/&1DEn,  ^ /k g 2  i u  6OM^p vgNS1n Y<K{Cdo:1RZ0\Z&Ri=#4jOZ *]r.TU3}&9 W % n ^ 5qs%W <u]LSH53+i8gSFX2?@{gV*8pcSBy %PBV!x. I[u[|PA'. ;  $ 5 r > = j &5g/@D\ZWresHW(h!ZdRq nK  Wuq~)q    )A3 TAVTZv!M=^ K~M MfRT$ov&m$QfNS?(UG,*!3DncG#erOe4\)L2Hqmj]Z#(~  V aI Y  $ rA6P P . | 3 M 3 o  Q + 9 K  . " 'LRe/;A!]^bFzK-_su@}X%%[CS=kn {.   d iv5YH 9 . -(]k4$,n*`Q<n7}^\$>Z'0 toe%h^o'ZI6lkV\ } q V oI9X4M&2 ^ Z E Y p5>N%&Jz&'@_6 nEb5 Ei9ty"oL<s~i-R W : ~Vx=6b ^+-OdT o E!$ cCS c!dsCyNj$3"P+yd#qHat$rxz) : $g%UaM I < & *PfIa<jq n } # [6IfO!$B#PZ >(`[ JZ x c W < E >n&vgX!E">Z@v+m2 ZAPp/BrI3@.ZDyyj"ib X z h k AFos 0G, YB2 KnRzjgp"w}'>I+DJl0D[ u } g 0 {[}X n [ I  a : f D*_WD% mV]U2=Wc@?5 j ~ ` NZ*L*Sp{ |B!G e } k  A  I ]C  T  y c C92&yJV61QfF # ?2   I3_)q<>qB(+C]m   c  O h = B !,a&Gdfgj9t"g+8  X *Eg$4g9+KdaupDDS 8Znf07/&HT k (\ ,/j5kx E  a\+'!7!!Y=dEG5d l L w +So #L@1Re#b\YY:! 1 ail  5! ~R?=A8SGXC^ %> ?  t>h0d.Bp. I U3߹"Y6-M6z d%)BH  2 v{}\l&w%BT? c 5Q\ 96 a B*0#WY"6! XUD -0z H&"2[f79v* Fs:^qz!+$mCAU c   ah|  r Rap5>yk )u3:}OcBC  Y / 7@MEf@ r | R wU 1%oplBL jG,n  g  LRf ` V wn l%8|4=;WRW' 1T .@81 X 5 1gia YISvhYYX[i ` _ h]OU,M 5 >D|7811m jj#:nf9 :  "O$<N F 3NMXYSDW][KZEope  d 9 H q )Z1 @ #bka('WD ` gTy^1xj  =b%s3_m3H~?C +  r & q B5%`F^tF`*S^-x)R\ 7 p X = H E e 1 '<Prg:F66<puuwJCcNry=j;N?&m;H3zb*!\{1:`)Nw*zg(P j g &%:Se"jkm}~Od@ 7 1s>\O-P(d | BG=AXnodis?Kztk*nS uW<KGc0_Y?kiykTwMsAZFWy6T9>JMi=cdg4gVy$O*/NhfBf`sQ3O qt!DkrmFf3 $`/   |~(x5jWYpsx_P!e)&m3,={9s4q=?/+u{s J0cdFn4O|+!\RJ(/VbRB k/Rwy`hMLH%I(eZ%Dtf/q _JVSk98jU(pnYQ1W ^Y<'zOvdo_F2 J].j%~y XEU~@g?* $5!p]vl"i~8+IG0 ]P.8{\7- 50% r{MjGVd alwnFl9F^~$0l-!ZZZt,tdSJ)-&ks4gtmx}&Kxv}G]v"o&V(9U} 1sxr1E]LpODhBEmQU7cY,%KW@W+FMk>L}KLB`+3(K9)B7.\ GLv'Mf6k<`#Pn.)nr8*(8Zw0X.:.j0hd14Q>[DteHd N[lu2,ssg`.@l}b6^px#m@Aval]]>}PUyZL\QRtvQ[.M13 0 /_ p}B"' ) IH?j; [\P31QjfY(anJZWQ{d=ECp}.T=a=iWTM;i:f gkze,Zwr$r(sj*TpJ@^jfsvSYHgP()OTeyggaV^Cefd) sy%#3eaua/Mtt#X3u*e_rtmG,;WQlns[E]P&7.iyf?eqr)E&8CS`R' GNOwMUwD+ ]#.  %GoShF(J6zt =% Uka@Pkx\^e3*d~@b 8K fp>X2zps.MVXrb6.hP$de_UkN*mh(y oTe*<TER#Tq715:"=B= nEzuh|-&LC7^$S&BJfVk\ mq% @'?[r%ZE{Q_|M, oT}`Vn^G S5gC4<waY C1>|ypu8fI@%'QWG(`(ei~3&**;D6Dl8<oF?< AHr+<p+vBz|qO`/x__<cK0?SDZ#7XhKW|p/ juB/@x8?YF*J")/TFYZ 68.hq& 2FM'P 8-s6XI']< p!E gD]Y&. c$u=ra}egeL0 Nf$78.-=tR9U% Dm  sAK6,V,{tDHuoX]OBvOo{ !#bm1P/c([MB6vVwt,{+@ #/bjbUr qoYWic^QgyE/Qa2JJ9v7l;"K ze^ubvFw$g99XdeAS^;c#;;< p7Ke#@ 6  w}K8w%#ecy h%LKwQQ+S> @ 0 6v*(S}kTzjW7o}:g8[v>'42orW_w emOLxE%F>,i!,/oOK0>a#MTmMB,??]*#t&D7(#$'~{ gFX2;P`9 ,#!1N]xV?i tiJ"{k* *LR8a -vey_(1*^z$7 W"o"UuoC8Eh/Vb'g $w;fd()9T!NKq *i<_TQWbh}Gw,+Z( k.r c`.`fj8I9owP\4`:^,A:%Ipo0rieH)B~0+:-c']mr' 8[FxLcq$dFT?LT%4 q r? % mXd,f%u[*>N`~qRK7+ ,pLw;<"-W'88i;!DaO8D"Au_<)YxV3ESjWx<&Xz 6x]%)5" X nn~pp=?!Nnp]R4ZqD3xC|~y;KD9 1#jZLA V8z4;?hz d5TYG4Vz A+ u+=5fTL+{4nG*;D?$xBv9@~ci!NV|f^i^G{;'Q7;QE1*0zYpy9 rRt$!PnlY=3 eP:%|m$R_tehIw]<IEbiNGA=wMRoI,if^\l{jz&Psh}6bJ86rmJDI)'H1 4\Nn|KkwnHA98<N:  Uc5UUjxN>}xsTMJlu\< $;`mE -6.tgrlmj}NayP]oazQ8>4MX;"%4do]SU/49+1[kpH'SxUsKHB/A'&TJ|d`xzbU6/@p'1-LJ;<33? mKov .~peNSwqK0Khxs608.?N^fP8&+QuK [6_{([t[FYYZy}VJA *Uel]<8XZ> /q`L:55@A!}kz_M]}w1N^D1} ~~oZsq!1TQ F`M% :% )QWI6"4NWi|A=1 ))+ED0<[T5"8<0KlMSoc@SecYH/ke7 :T{|f^Nl ,IA ~>akyP2Umq|TP$%8MGS_sXA( 9_ !3?:*:{y{~S9H2&UZ.)%OgANpfYZIce< 2#7=(.IAV\]USAP8#+@C>6[qbpn2 ",2-h`ga"97&&:!O?}iF:)$cdhyfH64rur^m~, .@ewxun`Q5@Wpx]+ 4[nmn[[omb|d% f7Gs|ah^bjkw *G>':!%3*5HF   2LNX@ )4 ;B'<t2MlVWHZ_NIVRomP=,}rJ_acZ2   s'BT\u 8MHv}sxbmoU-)&#-0?Wcikop  " bB >Q~tigqg[be6.EowbP9&% 2/&@B[ +.(?; 8kcGFRGCqg?5mw #9[eQJVcwxM`JXA(tt[\UYVekQ8MwidoyqwzkT 8qmILOIPcSC=.iY?1<*4otn R?NX_zU& Ckf^\\XWfmR<)*) ;>Z_m_waer_Qe|a@FQOYfV69o|r~}pdL#  Ifv<ipvx[;;H<  6$&.>>0@U>0Hfx~Z3'++^\y(7-Lxu`fo~~R4-1\[qbfXL=5)<[jiumia^G,"&:>;/ '/<4+( +<?68+ 38>KSRV5#GKFY^ILP;# !+-{  un}ylYcP9921QgyxuVRDF*8i$>-/B& 1*-CSEPmXGM. 8H_kmzxusnjjrdQ=G\^SNNJI> &?sumzWPD/$0)9ty}e9=F.)G%,5IQ`ejuxYU?6Hemb1'6?@VSIB?* \D Arsjsvpf>"'+"uC%skmpkz^C%.;3M]fgnpyq+BP+$$*4A PZ) 30""1*)cwoVo *S[X3;RI-% ~{~xVD/0 #+1#xq >4 sNFO[adnjt|xlw~vy15ZMC@&rWL?8cqf- $YgC-<F/:VwALG)xbTebLjwvu~pP5#--$*}\@2*?[||m`XMCFbuw~}c:$27Us2 /L[ng^X.qVbww||z_I'2L_#37:<# "(*2@xzYFOH2=^[4*:\jshR<NvfVmja`7 ", pr@ #63-82/Cgt'' !43-D\c[^D *&8OPEQF. BGIMnxyvxkpfox^JNZI $" #;KdL4 ":i1|bPCUcktkf}w[Tpkhy`UI/4PSI2$"MLHX_PILo&  '6@Qzue[\K;J^VdzmU]lg_L^P[_l-B[rlUKNLTojGXdZs \Q_etD`VYSWy|lRSZPVi^;%kvOJT?Ybw %3YvkczQ# D6:EYZaA$&  #'#  (TG03")2"'  4a`S,&z|rf8:brzaIYxyfG*FQ`Scu||aTfjI7-,?D*1A@'* NQ@9B0 )+$ %%#%1$".-^hD85 ~up]CQbN   &=^l}|Im 5 ! Db`ci}}oYSNASRfYGA?NWJSn|yf\Q;(&Xst{sQI:8OM20.?nobcsyh94/*:KjschV7) #338eG+%  ",/=72$+Yy[Vba;;"mn 6Z`lr`J@ hplk eJ+ :arjZvoXNQ!9Mk{"tzu{~WD:6,3@R^N>PUF^rcmlQJHNA +dvR:+0:/=< 2\s~waS*!0:2. @TZdd>dQ~?X__tuxoqzg~zmZ $()/[^W8I9>at\X\UD"$9BNX_dzj8(4OI#"aAY`tVGpt~][f`V`c`u (1DPOP[qy}w~ .D]|g^Yy #3+<=PZE 2ECGpZ'&$"/#$( NE A=$%"kWPWVu|SVkk_T_bY^`Q7' sznRPUIK-5PIBLEE]S67: mbO_kbZmWWmkppcio~o~uxtqhw|r}kbct !BNN, 02%+8DquqbjmwZf     ^^_oW?CKCX} \8#JypZ^zR)94" (;7/46<53'% "&=GUI/z]EPSHHQNPWTdw^H8ILMXeid`ZfqjNEUbN=?NVVHA>&(/4LUXdh[=01/ 6HARw{}viujpys|(!%2/# <QOP=0,59(&)&)DD41E[D#VTaprp   +M\THQ6 |wt~or}i_TKYae[L67:  F4( 7[ozn_mvfbLJMZY64;@&+8@Vna1-LfZF6>9"Pa^RZC'"5Qw ' BrzN)@G3-?Tevlqymim[Zaef{taZOizzo]`v| }x !$ x^XgraWi+UmY;. 9Y3gmchess-0.29.6.3/data/sound/2.wav000066400000000000000000002542641323660377300163520ustar00rootroot00000000000000RIFFXWAVEfmt DXdataXD\B;DIJYTPSA4!"'7]mno~.&.AM76.*yjbsveUE436*(&[gfgKIIKC>HIRNC-@D0 |sugbXLY`Y]aj{+%"'2%    -37>D5;XkcY][ZGHjn=#*3/''8G`}|lN:CO\ltk{xj]hq_IK5$ '' BaY2! ~adpbUHT]_uut{yqVKL5#-7?9=d_>15* 6Nnihpo~i}kY]O:8  (#%W|rsxydSN^h`SKG63X[-1?YS_R_rd_R+$  4IGHQQ8]2$.JA)#7215GSXbjnyl[G5"3@2%AI6 Fx ~sktszs $4BTZ_E $$<^O58CRYLCFG_n|   #%,>I.0D_m]F[f^E525  $--$BEnnxQ<- *$8LG0thliQ@Vut\\`ZjlQ;I?5HUOF.'HXQF[aYLCJn{R3"  +F,'?N9'&66AUgbO;7;6)=LB(JYM)   z]YM>/%)&*-&:q~y}eSEC5'=WfskqkM'53  :.,CfV6++%-0.8HDKQD/P`UF\[N[9O<;/ 4I6Yxknvpwtfn)?YP1-QXD#&2>6*  &6"+! vt_[UirvvY4yVE6/ +# AUUUTMZlri|{eqkn&")."'d_b^NOWwlqqSB' %-4?MedVSJGf!+/'% ,72QKUgtaabryTOcldNe~c[i]NUwrJ00)xugZXU71@DNluXH@INQ:?RJ67hjfS`fgj^hkz %948Fem]9+ Rtu{uTJ=6& ,--3(!/67$+.A? 1@ak`BYm`Q\kwy}V5:A' .51Woh`aj\KXv[VSkw~rPHn}fik^j|siR:9FJ50++)=F@%,   ~fi}}     &%!40$$9=$*2GAzk| 4FA@K7$?Z_I46A?,<]N:DN%!! 3#/Vr{b=%*36EMG50.2$  q}%NLUpkk|aWVIFIE;/  3BC?:>I?=E81<%%+o~T4(*.6Ubs  (2-3A7)06.)5- &,.H]Z@HTE9MI1  +AVaUWqUJ5! ,<7.5/0UP/ " *"!.=(7) #-'<MW[cgaVT`dU<BF6##/,    7A_|xX>%'!)FMN_dergfq}zzyXVsuqdO]rvN3 atw{qnG6* 8AMVL7-lWdletvlytw]*!)+2ijN^a[d{yosojmvu#&$  t.B\dkUKXTO=!- &(C;.,20;CYYQKUc\XPi|~xf]wT=TeMLL5?T6-&,/?TjpukiZ[MJ$# !!.5KPBBCH\{}urw{wnqpa\N814 #+$ (EaUOI_ng[]}x]WI:*)324:96KUVY_tuhnw[8ES;&)0:82}`PNDMUXgsm{zwV]rtrvZD^R;D^]C8Cmx]Jb[hzbu|ti~ 2 0:SD) $%?TA&"=C4>XT * ! ,)/EAD[_D ,5'7N, &:?77, u  '7JFGINUS? "!(/%.1&09FF@?DVhb[WG%/K, <SG5Oj^Uvmtwqpwuiccwormo`RcurnC;* 1- D9ZO #Hqtlrcg^|||ou{b@@I[\\ajnr`D317DXe_WUs}m^m~jisa`%40=5$& '&$'CYd|{lR)# .KZmtWPL<'%3?0?c`S\8"25<AB-/@dPQRFBKigQKX: #) ' '/ '/09CEPJ:0:5AWt{nzyiW.*! % y}mZTcmjqWNESigLP^[ES\OCVkpviR\~he}v 4 ( 9VTHR^YccemNYuebhHV_Rcqp[`jU6,*%8=4$(# ~n{niut $%7SO* -1PT=JiumueKB<%$=;C^D>`]>C\J/%)* 4NA=`e_ccI* )A'"  $3+#<=;,,*:9++!%6MebRHRW?4!   suyrxMA41@KJkvmw&71-) 'B8 4H<Egz}tknx}xjFXsr}79# }j`a\[VFbwyzdS^[@%    .-2;E?92(+JVSVRS7- #((#~etj^{!5 qg}  &4( {p 55(':79(870I3"+ &!)-( .FoxukM=6152% &(:IRgzmgrvv\FJ;.14,;> 8UX]`bn|rTD?FF@20#4=ESbYX[PE=  %/  /,+9, 0(=M-SSf>Jz|y|aC-'"1HQ\WalpsR>$ Od|qm9jSECSlqZXoxr}b]lo_:%<_bi~qlyrZRY_uz;W9-HH(0: !6<79"9J0)N\VVhw_L? %$3?KObhN>4-,-:CD630;VdD(:[J0?W@ '/AXac{}|k^G7"!$ 5;'Twn`[HD.'! /QH4   ya\jE9@`gz=@CM?:@.! sncGRy~{oz ,<LM\ct_YdQOju\QA+KH) /0",LZF9U[P:/;Xg}oX]jsg_]jdK>G^{g`ncWTJPQZdJ*+,# 5><LVPJ`^H>?KYb}zYM* /&  ,-6-'1`y`^eZUPME6*&GjwwyeM^n`g]`[]F,,LF1=  &8_^Yhfnp}kEIW6 !8INVKZiO$"    .2),7:78?0$%!|fX}p|ylZ[isiZMau ).2<;C6 '7,+@C25//+% "689I>.7MD+.<1&.;?AB=EI<.$44CH7$10$BP;/JQGKN=>3,&" (+141&$.' .6/&9@=$  "@;9B<>>76ILF==B6+  "   "*1PaACdnW>@9rt!$#sp~z|odfF%5_WBEN:Ao|_@'$+77FJCE?<67 !-5*)LxtPDLKH@90LJB0JMS` '& "")U       )5@B1"52/5> xyfYF8& iRKKLWTUSXmE#74 $HWexx  ~p 2?POBPY< #   #849S\Rjzmg]Y`o~~{{zZ72+  #@fmp{lKG;6$z  W<:,)UdW|||q)#35/,:AGK6)!)#2>Ngswhen]\]YnocN=(-BB4F_pt~cL@J7)8B6/5 099>EP[bM>A@*y~s]bmj_fjwykqpxmabH<>?Os}~}{gko}~ztkdnrlcoqv|f`Zj{ ((# #%<IM931-,AI3:T^2 ,#1H^Va*29D4{~`h{xrm{rKFA8FM3 (DGUZaeJ5* |oV" ~ 'KvRDGWG:28=DXwo= ,A@. DXKJ}SZqS"=eX=+>JWoiUQaS4<`Z*,MbfaMD95C[?.CBK[qfmT(-9GC?OWesridSERF]epvfTI$!,% ( 9WD0&32-" ,<16G2rteusurW8):6,FcneWGR^enlnqzsl^HTEBBRZgtia`V>3197@KFJaotOQoydj&-,2]uWD>'jiCbg\o`_r}{n|xk]vnnwwZgdcfov}jyvT- '$ l!%?FKUrW !<(   ('"-<@;@WPZkv`Y?~{n&;6M{k`WL: %67 ,"8:;]DOoyjL1$0# !EhX!$57 1O'$^wm^gi}yhRQV:)4G, |bEQ &9' $3/& '5F> ! CO<GjkbL]hT3A+"3126@_SCW_w}pyePGE/"@;    8ottio}~~NAlq_}vzuyxYWvbo -/$I? 0ga?dT9?@Vv{uL *6n )B wqpc:DX"IHQPbq(9@!%aX]P' xUjbLQ</.5,N'7D?:@`aF^0*UXNkUn4'[)Z' , Gz o%2t w_{1!@swD69y:64 +NWK]p|wc4FaRQ#@)tj[|<tcG:<T9&0O#SmGhm|]<f$N >>P kuJQH 9&|+hOsxlX7F$S 70XAf4lpZ<Xp(,#D _1MBY}e^eL ="3t$Ad(IKjXMBBti'6z<) Cf MDX1|e%F4MQn03<  FNy+bqy ^^Q}a:w%ZFTtBWB 4ljoU( . FguL r5So^A}sI ai! .  IJ6XBZx.7F_* eCd;~, o ? D B  .&*QdjH()Q4;*V  BD4>  8/KAa!Pey3-| I # `n=V|l/UN4RU`3X 8  - 7:1 c Y #SvbhL}UFiW3TsS ! gn_ v /}sKZOݑۡesxy~ [[!@ ] . fX<PdL!C3w~ s * n  s ') 'ZC z J ' /9"Qa,ou C  $+.[00.+'#D" p nlݺERNѷ ۫d + +iA ^2ix,{K"m j 4! laq +3w +M8UKeiSg?My`8o2 l|5'q\>f0d LZ`!" ?"@!NO݃ٵբ żXcӣA$- >G@GJ!L9D??:3,' *dbF΢̶x6zĬJQ)x 0BhD$)'<&(&v*5މܒޑg{ xR_f@3 j.G_ Y]A T!c"!"#" @;jh4Zíջ?=yأI]RR&.^3@LN`NNIDA?9\.Y#2A/ 9ʛP&FO^1k kuM '1,@,",s)!#0Y9 ߉[T<T ^}>Xi *!$ $ '_)(.('"' @6JՕPѶƱ!TȁR-F2YQF1 @qEEMWWTSNDD>;5&=ATɑ־uD@mu#?((-.,)% 9 pH`܆Q7#jc]  ">!!!ktm dw YkY_ Ah"&$+.^.0h1}0s/(uN͘!oZ>cĿ֙ + (09H UXc[]X"ROJ=i.%# 1DúH%/D'46"&*/,--(IowV O39 Z!&/(()$^a$% 7(߾[ . x &*[0s566A64/+' |ߎҊFƐ3ѬߨPٷEE9&/@OVYN^x^XUUM?71c 6ʹ)¿vqL޲ʳf%\ @ #a"&'?(&)x;q`H] *NU#X&B%5&$o0v 7 Wd~W^K%T I!$*/2332N0(, )#<9[z[·+m(`LR"+1}BJNAUX@WT"S9NaC:e7-9(2o?+|Əʽ;ej @d5o` 1t0X> L1? -W)cNkF 5Q "9).n/.C,F'R m ?Mڹ5SŒ ;U&LHVQ+8*A.FKQSQNI4>3\1(sEhKž$qĘ^%3)5 D   xW-po\3 \q @ ( xT9u E><Mi"$$%9(Z*)>)(#=h$8^rrϑ̇2]۷Lˆ=д-@ $)(5BHILYONL~KE;'2,"C;SgMԯmɈÈ1<֒aT}yu W&$ 3 zjh 4 r 6~ eP;BY8rq%JK>~ !"#%$!r QqqͶʁ侠5s88 Ԧtx $.:?R0+2bӗ>QÌVSح\U "+6E>AC{G[H)FDDA"97/*$^^L׵QµˀWRo7[] w}^O&\jW]O~e mz.T3oWhrSJ ] p Bj}\J$ \  4Q=c"|DCֻ1%7~Q}!)5[=?1BEF F8ED?3,&'K_Kfϐv®/;O- UT "%$ #""< ! 4 z sENFixY g,&}p!!E 8  n~]nv`I װѼ͡OB5j5z!'e3=?B$G&IHHG@4+%(D6NCӔ=aLMey[ިE .hz$!%>&"'a%(&'W&&(&C$!JL "zeHPH0 % 3 L5Y"[%%%i#O6}:> F-Y'!T_tjy5VҁTzY?%*-/G:>D-GBINtQPON{F_7`,$l ֬>}5̬ )3 _."8)0G232G/.).*E+r,'$J#G ",iTnߦ_`79 X.lat"]##$" @}  Q4I45Sݛt<̆jS*/HK%)2I;=>8DIHI-JrMwGZ9.6%Do6ۉ6F,ʪMlА֣*&Va"f%)8/T0(10r/110v0+-:$@TKm(9c 9"$'&*r))*+-+*)_("'Y6MzQb`'Oj>;ũa#up3)25w@.K MMSXFYWTI8,#=n7FQMǢM§+'nљӭ*&i*.U72=>j<:90513b0% <L^ӛ7bФϋq4o؃ߌl G#%(,/35k3?1Z-'M"N S +:NMRuڈ^ǪǤƺ̢ӰӪݵB$_)3 D+IGOVXW[_Y'L>2% >ܒкfBy+J(;Ǥ̇+24f:A#D2BCED@BC>3*#")f֬+Ţ3ƾzŲ˚#q 4W'*-;4S8>8!:>;|7473D-#;c *uD4 _ :(EkAi ˷!ɽ|SՇK- "#8 DGLS>WW>[aa\VGh/B ј0ћԜ;W/j)+$!8-$4R@hG]HIKKLtMiLKH0>?37-"TBҙΊ߿ǽᾚ+yM"'F+4::=#A>;9:5,%!tK sx&T ( ( ; ub$7ʱ ]LjʭւN"5c7;F;MSPU[V`b c'^?K1t$LDLj׈Z-cftޭAYڟ# U &2sBaKL&OSU\USURKB:3Y%s'ўl% 黀bĂƏ~"h)2<@?AsC:A ACh>3p*" e e|Iv B , {- wfڵ︐{F,}=$*8BDEKU*[ ^ djc[TF@0A&Eߪǭ1kԤǜXC54'8@E:KEQTTlVVOJqF :"(' n&JYjPՆ}Zm(6;J>DUFEGTHD=@=G8)  MOWjH'veZ ) C 3 P[K1ɿɵ&5+ȉ+̞ͫS:M c3:;@WEJ2NR[akcfH^7B&|q ޖ#ɴ m략!fQQfo5,5C7PSoUnXZ~YVV?QB7[3(G[ͷRֶ6(;:r h&g/9n@AADIJI~JEH9.(u )oNf `kd= [_6ĵǻ?ѕAF %- 9{=\>@GQW[x`X#Eh:3]tŇN|}Fʪ̸gZfFjT(5(:@2GJNPZQ,OBIFPD6'y"jxoQDžӣ($,N/c5;m@:DHLNMG#A=6!Ol/nߪ,L U w H2Mz&R*ʈҦ'JVmI-32e4S9j?BAG?TXX[Q7&& mu΅iۮ=ŧ3O6h͜tAR]&h5AEGI KnLNPOL1CH?y=1B ('r߲%U-݋^b;.>7g  f "to7,Ϳ/ ~ёO M '6.3@C*ACDF=I>7*32J/E-'&, "+5Gz[  "d!# AryR)] ˉ|k #*;VEEK!MYKPQQYP&;5y, yψὧV%}θ ҙrv&p47;C<7-6$9&9U850/-s$ A[nդѓӰzڿ[& ))}1O3.125z0g.- 'c W ,z1D$$ >ű/о"1+59D"KJL PPPRUP@ /H#/K6ǿG|.Ϣ ߌ:2,n8:?=85C32.+(%p'L  Sc)޷܋e9ܽ;Z; U"$'+0.'&/$/nH ngZJa-!^+32(5l3,U%XI\D ϕƱ`Ԯ*^1`' #0?IKKMzPSO{K1O~WVPM>n$-nW+٧e1j.d+f(X138:8#765k3?.(&$lX_ߎׁ1ߒlWpN bl"&!h " 1xk Y Z}/<gZ (C/j.-,#L YHqWϡ'@hVүxyΧ(/>MJgLK&OiS]QOXRRRTQ?xk}>߳^ްA(ߦ3,󩂩@wy8~*09u?a=h<:@=5q2G.!( uY#$Zج\L?GRIy#"!!X% KC% 85 %)/?1v0,!LH (:%20W*:;+4"ٴ&g" 1"N{2LGfr 1drD["'+S-02s-"! :DƪR RhtZ#?>ZORQO0QNAKMSOVLUJFI<2 Z?Oi7 &+2t<:?A;9973.D(Vw emjI;oO=J" S3~(4K/t  !9 s%FXg$'j%&# M!~|ѳ{X( #6mDK"OKEEIXD>?@@A:& 9{S崰S޿+gL) N-+3497&9 7W0,,$nZ J$jZ'#?Xfix*z S 0 "C#!/t $!0UI7 M 0#* P mkea!;"p >ķ~̱G11F7M{F.CDC?%>9<:O;J><)-f(c'Ζ}Fe-)5†ǗܰJ3{%K(+54&5t24^2(" ?& g3g0x]u.%  $x!/2iB! M ZP  e{&=(Y&#uBF$AI<4`4Hɻ;X=ί\m E'3./M060.,&p q]Xxv[\  gG g U9Dt(*[-,"pbNḻHֶinm)4)};DHJIFFGFBBEB;8,%ݦ1dzϸdk@_ pO1 y)M5 997z.$|+C7 [Do~M"@u.E c].ka n E;^) c } F g2 eQ q#&%v!;G QBi޼ٴ3sӱӸXx0@,8-@(GKMHkB(EF7BYGKZ؉WxXYη޼ZT @ݝi a,\5<@>83+E$=!qD gN8_u.~C;563*@ +8UFq6` B K "' lY8 T B XNa 74y6 ,kP,\  կeGUR. ?EuFFrFEAAB/@{BCK6V!N ^Hf:Ϸ>"u v-48>$:s.P'W!-4 s6[1"# E  o  " 8 Gj2NO  @K ] Uey3 ""I< Z" # h ͫ9ĭ(Vڵ9ݺPY#2eDMJMEBOB_?7@6D@;I=;-^ܪϨUZܽsѸT#4u?ԩp4 !#,037+4(/ BRe[a)0F  S3  ! z ARY ~F 2 4  yP3 M 7"%"Dc"!*py9_$Цǻ§WսaT-J{M_ '!%$%L*c+-0R*fGӷa$LǷ&[^wǮ-'o *7BUGFB&=:<>AFEi@:14%HHǒ" ŷjgaOH #a6M?14>++[ܪO=^갅6H=EЅ7$:O n& /4u:5+&N' }8.fg"'FP 2R * ) 4Q t 5_: H$ Vl"F$7" Hb }pZHM) 5G϶e5նij,# 7A@@={>p>?=A@<>>o=>t?k='3%h ^ԩU) &c/ml$Ģ׸$hQ n&d,W01* +  }cbIUV-[z Y; en I qtWc  h0vlC-#<&l"S<8$r$R!w*61\աոԆǿߺF& d*q5dEB?A@?AvB C)C+EBI0xIΥɕǾڰtƭ~?񭦾΄IC -!&+/@.+(^ "X `1 mbO 1 L \ Y k[n N , L 1UF>Exr"$&!E ٽbF#fZSԯ.!'v5d@@z><<>>?QDCH>:".֋ͮɯⲪµBЬ0\"}!  N 7TVcRy, - k J xt2rg4 `  l )x=N M ;T 2 $kYO7!!(#K%"K"M#! !K-*Sئyӻ,μX-<@>?A@JBDB?>91,A %Ϲ%eź+݂l& "*+**\!5 &A ۪>|B}i7 v #p%sg VEzT  5^t fJs4<uv]Z tB/SV_Ǚ}\'^|k (+4<=:8#8M9;>R=Y5.):yԤ +ijAvYZ'Wveulf|n%,/a21//)-d$I+h)׿үϿjַ}|*X!"##I9ow @ u',X!"0k&4VI  Rx\(Ҙjѻ)ŨƽMFPۍv:@',6BFB=8?6.7e873,W'u.جʺqT"ذY-bP" mkI!9$,20o/T,,!%> @+WGf{Cޢ[SR\\ >sF  Us1;$U""J0e  }UсaZˬ^͆Tà17kޓ# -,=CF2LKFC>99:6+"v\ǔxջanoGƂ&  *,+(i#n 1 ' m 9 6X AKK='J% vTcr/:h2QS+ fv?-P$Wf(Q--ҏʩǰżMзˬ޴ιُXD!d3@=FuRWUS QN MIFA^1 7՗ȉ,|Ӣ֡飠1~E*5(dM P #(*&P# w" wJK!b2J|FI9r^v F>! v!T%#Y"_"WZQ-:!v )BR|)dΆOC kݬ*N%5'GPU[#_][9\ZS MI3<$AȆܰߦ8wء 5Ķ` ɘt. Cl7(B0244-i%+IIGL\Jn; / ZyL2J v3  U K[ rG@b&n $^ <h|n p\n^ f_ rDӰnY ﲛ7^ {3O?'FR\0aax_\[WTNn=("%xK#CN iv߰4 (H%p/2i464"/d+&)W5MktJ P   &P ebR-'SZ' !E!!]&****i'$ "yt h _, YwޔʀQVQ4ySl9(1>=N]a_dbc``(]PhD=1Oh hCG̙G9V 8 V&^*/9?; 8-3% ,E5yXQuyny OMV Gaa/ &C  GtT%+ -++,L-*(&a%"!e ,[lk}pkU }.Ukܰ jN.۴eQKwM]#,57CS^^`dYb^]Q[?36C.\Bv1ѧ{~VRpܘPz' !*,e0342- %Df {Xz ߪhI2ّܯ߲[ G Mz!!S#^$ 2_  DJX6_  r" $<$&(8''*(<&%!E'>/D q    1M}SѻCHsXQm è7 Q$v1NDRHXZ]aa`^lV_KF;U" E͞a׬cˢ[;ELf܌kV&/P2t0k/L,$Qysf#|8R w3[  9yCby|>"{o@)3Sz G @w  V  !i7 "MVygȍŠJC^.#$09ESO[]_a^]^3UDo92;!i'ܤT9xd[q찂ֵJ8G v d"&/2T/.\*  6 d8"GL  [  KR 6 F jy{3~   sWB Q #I2.h-Qj6`; l ' LO+a*fƼ1,A"+:FLQXWYXVVtPD>q:+*Sd.>mƫƬ7Ʉӛ܉_E |u#t* * )'v"W{ r 6qc#rEP8> n(ZO 1%<=] km3 3 0!"&`(7&%&#!() .4iN|GYҴφ*oRɐؘg %T(4;?DVIqJ.IH0FR@ 9.5. L߅ҳșs,RQ Wo =$&]&)(#!!K*|* 'Qw[BAFj 4e!ed) L'?yiM  YdtU.& w +cgq~-|a3 p I ^ l d&bVޑyO buU=1Y  !t,z47:)AFlG3GmIGA&?;H.2 Fw˝6!ȝs}sSJ 64#((#"F7 Dy0]W_$hMnAb&`\ &?b =!kBd, 5GsA!!$&$0$#(n X }2~y|Yl * NGـFB[ d06(X.36;><;<83C2+,o>FLص] IL Y#?*+/0+'=& ks<1LE^ߺI/ , w]Hf0Y&> : -  A \ '!t!tn1{& sAY OM, sa|o ިTTTz\@ "!% +S19?S@AC>S:7-hWe'R9W?شmm4R +Ju$&0*.q,<+L)Y %FcI80(BMߠܪzY޴$(0,#fp5JRf LJ_M{E% 6W]6.I H#$B()q'$"4![b  `x]Uh;5+k|A34DQQ-ثFX% g"D'N+H15K655V3N/l,)` \K/ѷŲhL`Ѵ9bk(!+.^0L1v.)%!s+ 5yظNCgzݣ){;ED N j Jt<BQ:p-N JJ}L=t79{hP% 6+8l %*$e#$ `zJ kHG%R I &BH}{wԁt! CD%+N5r=>J>@= 731,( zj~QJٷھ}4ҽ!XQ (P++,)#C  *&%2,|VfLdtGv:(,-" m}p\ ].[1u !1#c%(^( '&N%#!" I; z@<O\pa#٠!ӏ n X#),I2689-:-: 71.(( [ ߤܴڠ{ʻƝ آIG- %+++*$( _~K 50hll=[%x>J%1`2Wp`&n# > q 5MRTy-3+ 5 7C Q.S6 S 0;PoyVgw DrN tw6_ۍӹ dI+vw3'27t97=@@Z>/<33&&- 8+}}Y:̚=4t)bDMg; !$(,-"-x+'BV' O#{x ܅idAC-9>) Vw' bC7S7 >0`rBdn {5g } KF^ ok& u|rg/HH͂ʦYݗtg!)1C54$431x-+$q ە־Ч$*˪Lj:y EAp=^1 =  Nz*o>X 9&mQ)R %SQ|m-o z}ALn c ]@0t(qfHq Yq $$$$R#!""! wB gtP'  3~'* &e,@ۅs̼ʌ~Zo#<.8;=@An@>8/$*8fS֪ǥ4ܽ6j?AaH5N91+#$%5)*'8%` jNz37RnUl *d)-/48:;=< 5S.+$d c;Foܳ٪,<]T,&m)t. 3!200+U ^\<` qas oJ.=DIPVVrVU{K<71˪I_ i' {z0!)J5:< BC@=;5&|  oqO,ܵ $ i1yq 8 8;O4 1u 0#%!*.l133-&"wQ@Q߳\r 8 1$1(+278:;w7 3/-'yid ALށx~@|% O~ %+/0s1(.#V AuUՋZ/RV!{{_^J/%28?KSS)TTLUAU>8&^0яģ 䫾QaK.> T$$-/1~6:?;:W<{7;)ҹ}ׄ\9L[ ' l!5A`YPzI~ &-=/2164354#0\,/*$WWQ$"TxN s%X(+5167y896/-/,9" S )Pjݑݟ :=`0&2+*C+-$*$"!A Q׋ˑiJzhE-#g'0<C>EwHJGBTA;w+q.`c3SZ&pJ9V&)*-Q-))S(#wt! Y N``2I{L3UNVܒ:߹zBft e!|(++*+,+^'$$ q5 |Y`tfhk? @<T  u D50=e955Mt yKvp iq2e9Ӆ|6C  92&~" $d$%Q$!1  >6eRRzv6FXuT ]  - r)m0 \>MXgVg8?24gC w GT*  j R fN_6c`&_` V 8 ^ G ;wQ  f Z PO"_a  " B  Q   Y]Lej$ځ6~ٮ:H8!}%a(,;-+*)/${ SdU Fڃ٪ءMI[,{| 6 #8V Rv_1!-R{c tB- G{_)=*ydD 7 ; ^ -0mkq`+A  n|^v'Q,3 2 \ 1 s m e  r tQKLm&T3 p ' t>;dL  tGJzLi-r2a%ެt^:{EdU% !#u#("D" lSA_/l݆\e]etYg ,bw R X\vSB$-3)u'.G(.Yl7 M A&OHA`- z fPtM wBn QW`07mjN>!L & I3/3tl H $Ms!"""e" \PX eYzY)-l|$C߭~h8< [  r  7hg{N{jfj !8z  /A/I $WtO$!2w  r UP Lq,?6Wt|1 :I@pN  K : pvE p/&ZMJ. "36Z ?f X"###"7 |dv+$?jM1C6 CQkBH$ ni } f7sPg@)X&=i_\6xw B !0>J  & *x.&uy3o M{af&ll\ w i JG"HIV3 m O2|1 h|hPXP &_Qh[!n$$]#5# "7ve! d|I-߹ݬ,۟ۜgH~5sy Vvi ; UF  XB Ob, A 9Sb`ZN_rG+ba6SM| KXe@k Tn6cN $cP`rd 0 T 3 _L A7 ' Yc ] zZ_S/&h .T$jssnHM6 .NLl2V-]/Y5ZY X } n H Slh+fx[U=xx+[1zIf) C df>^O Gy.._]PwDsG )O GI! CaY\o W \  |  C S~m{f^. N _It04`c!w`_ ii *! ]A{|Cw9 _/RLA#PU-d(B06=elO  rJRu [  :-U|(we9B^E3 3  B   S|z 1[]3r)O & \ ; O Q 9 R M A?O>d EPx(}ibe($Yx1 P Bdn2` }9Jw#Y.r &S X 5  OK*f5JnN|9S>}P*!nU\T8.(}]Zm V]m]F r@6wUQ`[F 0?S.]  C@mlaRrz+* U @ =bB'2`p95AB{RM?K B   Ul"6>9yzxez&hN [N{LNU/9\Q$#rC?wPlgRr R Q 6hX<9 ' L j mCj@*JgYzN\E %  Zxg#@&5!A*pqaYvJaZ wX v ;h.Y_ 0i/{B=cX<0;{ 78Zv`(\f`g8c|qBx6[<Cd84  / " ! / e = B amg-Rt 3  X @  h \mYv&VhR3y53k N U  5 J *+fe|y& IvZ-jQu@P:VrN:;SlK,jHZf2npyV%" .e:g/DI2fn1b<J=i)YYyPCTn[<.00? @F"_\N z ~ J 5"omH u^V5ERV/gAQ+YH7ub_j-)}+l5]P  -w$KX* 9uty('8a,5\|~d9KK1>t:n81AS\.S,Ha?Y,9ut?Hg[ fm!rl@A=f<_y>kV9/;=}D5ovk%_VEnLT?hq Hwi`pem95}m{B-|y{s;Vj61 ]DB [z^cdYlx.E`G#dX18|n:rP@ dh&~3c/ijbU'3&#H<v=^ZMKjD,v^FJ9$-RUMbmy5c(=(hoEb{H;"`36HM(<`kli$'v\c>34(:z2;Zu ==1VE(m) ,Y9WJ]HXzk*op5arPE@2P?Y'K|sS.wQ $V*IW|5-u k0SI_8P!|+`!Ht\RR#|QO 6ogc,L> x a.f" }TzhZM)O"qg~>OTz8BlzQX\2D9.iDjm,u&C)2Sq`.a~Y4 v#0:;WWQ!<  rpUPC3@ 7=3{H$>"1Mm\IjRS+a>V8V|n-> y-xGF%PFYlrx'8\w"6@`eP,f%.  @HvQ;jlY~SDpMJ6E:y]Mpp^>w'+c?/sK8_N:ASX>> h(M6No`Q2o qz HYy On#!U&9&]2g8uYk`>wC2hl#(ZZLTgPFIL>QkgLnCDaoD5SD bd8M2-os26Qtx?2>g}MBEbts[O[eE5FF,=`X'LuhPw/(ux!!By    %Q m F}4Tc)0%pwjoF# @Y3(P? rG@?9N,@q]&*)SgD6-r/c:>!jHcnp,vniz:Y;|]|T{g, a1^&{ltS4%GuvX(!G-*MB<6 Z\#9piNKWi%HHOi}~yK sgk %!$#4CF=7,.?=4A28JG=8(&;+  51.Pq~phd`m|eLA:,$/62?csn\I?2 !-X]W/XA;(M^~|pX4 +27Xtvuurz Iu|l_F)1NZG,//!  #R`GX&30.ASK5AGDKSTYerWBLL-cH^^]TmE07Yxulmhn^UX`R2$lYwx0~aA7Bf9r{cR>8$ +594Jfwo|vK1':4/0LT`%7tb<bC))-EP5d(c% Z(`O?&I]gX3wys 5EWJ;>4wWE/ );/Ca}}x]Ufvs|!1(<RgusgWF4;/ wgjwxpo=~  !&oUSA&" 1\q~ `G44Va|PDKDAM4^^Z<9:7B]{ ~|nga{t\guVRu$-VeWcv^7$qJ>*+G|$#IHF>),EKC6741,"923'0,7c+#`N,}|U0>nb_~,22KQSQcWYXZ3!$,=NaZUhptR5#  &MMhKbXaof8}U/6[x  w=# IQ7Hv}0~}}}~ )D#~yh][4 %(*@g{- /3!u>!')Bboclsrp 2=' @\dzqwqcL6 !{~ ,1,0@1=/.' #0&":S]^dL9!   0INVhkkv@  0:?Old6!)/1Spi^c]\jpigzyG A&s`Wiw7GW|`FPYN"/(0  2>,'165AS_[RF0&$)=P5%   "#:<6,2-/?C."%%!''6CTVJDG>A=)")|$*! D[9,.CRHQl|w|ynbG & ,4-# &4?VYSX_]JMGM56%3?HN[cgd^lx|lNOH8IQ>:<>@@!AeRPmN+  ?IRuiYbZM.qkaVWE?# +;TaaME+1>.5G81?JScixkE=NP>00G=>>1"*X}zujaC& *3=NYFG\qdt~dG(#3=0"0-33L92Pvt`VmgJ66W]L3?MK]UhgeNbq{lK;Vf]E-==!&vm{  6){vr/,(+))!%2ELJFOH:%)Kg^A/#FO;%5?:('?) (>IO9/BafgoU67# su}tn` '6>>F0 %'.;<.'4. AmraX[^[RgzmVUH]vm]?&9PTBLHIHP9-DC3#107IjldpsxnRG;/$4q 2:@S8 |5 vse\;-+BVL6BJHIG3%&9UVV$!   *0632<WcLL\ZM_tsfjgaUnrq{xsP8,2  .*:HHFSfQ= 1N_C0&# mqnpenmqlvnWMB8.13=Qbcx  9e~qzx|r eaJ66IO<1KVjmb]Vh}b; dZD"#*'$%M]P=Ml`XGHD/6K[Q_X8'IPFOrutxj[v   #3C_~ph[| %2$xamphnv_KizjRJ?Bg}lA:EJ4(-R~S+I[J.)&~uV6&18ANL77]z$>DJG, $ rXVQ25GE36Io*D65837, 1E?/9:682({rxd_dk_u %AIIUuzlSH6,_Yk]j{gbmYS`quF.8?I+EXq~oen{nmN &&-(  /+  $;M-# 0SsO(!! :JXd|Vm`;'GNG9V\VNgywh]Uu[3zpfv ~}dtxBfIB]V.*& Xxpzyc7(-8GTUOSV$)=;# +3HHcvo}mNK-,82' #9}s>$@Cx=8_}-)FPUP4 )BYfs{nwrR ')) #OptoZX=>ggEOQ-  0% NH)6;.F7:A%1CZevooaG&wN68A/U:U' :xhVE hLPq]Sr{jiv/4$/VR>S{~x`8)$6J )'  05-BMW{gTH,#18,?`]ZxsGJ9 dEE#(/)?j(',A<1 S4* !41#?HSRXb[D;_]h 09D::'yR=@Cg`x@jnghLYh@.NnI374#1CopC#)3:eW@GIHipK9KC5[0#f0"01-)"H1 41#!0F<cU\?&0(5P oB79B85Dt282(L{}l_xqzktyG!EDRzmcS#,!   Faw{GJ=  !B\yoSauw^TWeJ"pj~08;F5 #6*&(0%w2UuvqV?#4. 0dk %,ct^lj0!MC 3T:/*"1B8 ~j@6Vjx & ~M?M[u1{rvy8W{2zy$"2RDQsT<#4"]B/8;0(=*XrIYzQ5.IfmIIkrxpj~gD'#!9Rq}|={hj|ygz72$7_aqqZJ$,<)'nTd!-jfLG[p}hnHKp 0 :I ;6<z`aQ;^fdyjfXjwc<h\=8S`liL9*=SY<L4"ify|U%z}0kggUA>?#+( zX. 3TH_ip`Fj}/3xt 0Qj}yky``M(9MFCf!pZ 7?F[C6evTOHS] '1$ 24'B*9MD,!(# eQ2!FLGv"; u9!}S6$&8{4('Uybk4R Kk\$Kd{jpW= -h9%JdMqVx|z$w}tr&"NmoS+:+)"  -TsG!<{aXqV jx&LC7 7QW^~g=,="*?Qb^L.k|CrgOZzZ.q;SWD.mFCje>^UN[ls{iL1$9N4Eo.)TQ;N<K_pm4.Rp(W.+e6c65eTK&;YgE6?2IJ2Oco{g9QycEhX W|luuNa=CxuFvUNdn^/lST5)9VOTv,B N(l c] ![6S>$1+,1k{LJ7 H^o"'Y "Zz]kdOE7 oftt _gA5*6qU<-1@VrjMBA& HO-,,.lY ]@qW1 tjrs_I$ q3Vbx[sgW>=p =UbwS- ' *2)@bagi^~g[D$fq_Qe\N=iSQ4  &igfxzy1P-"TA/g[Q_lv{Y0?o<zlI3b{xE'yU?$&_{ $"-oWY3+h|H1DlH<",>L@p(,  Bnx&-rv:Yb1eppR  %3#BW*r[*^YpHmSzRL3 %klVoj7pM'HhYxNZQW&>ZQ5 c#;51%/Y2a6)/1=r-;KSEWfKIJ' %}[$# "JtvT5 "`^IH 2 .L^M*|L6"   dtp +4a5Hro).3 ,B%>~TkL+1#&F.#R@8YRod~qqmdS?$ ,.$Zb_WXID%+ 4:HE:nwVE<7_{TVFAJ Qjg@\*#=D;innKwc;D3-+N~|g<@MI-ZPpX-^ipj#z;aSmR9Kr1W@Xx8eq~#NVa{sp_9\txzrBj`Un`I! $&05$ qb5qXwjVw^=c 04)2$V 3eptjRCE]igfsz%.+bh[?(.5 #@G@LQ`|o?0Sak_F7>m|^%0ft{mS>#BNQ(%'5 Y}U^&&=(4`~XTrb`u~m[@  $/!0'>uMFT9$3E"&GO=XW'(hZTEYsif%;1GK) ~*E)1*6YsgifM #1O*N&nEg:&zII{ {ZF,5xqimzKlw/,$&$  "!EE44 ;]V0Ptp p.?Sfuh(qpUk+ hcusY tx^%=hOOfx~ZC,"8bvo5,3EK:Ud: -%/Jmo|~{mO/5ZbH ^V?Ea}wU^* "59-srq&)zs~qL*} 9L^2I):#:fjy yULRC,-May&?brQXT"tW,.i.jv@- "Bmvh}bNWuy{~tile}wkrw9<VaTShiGQ~sV95YO[_^Mjvx|ODV6,^~uo@xad[z#KTZcqqshCP/ ?rrj  [K%JY';_gmzwpznuYPoj`[Vn'HO#B[]N]x\J619G: 9- Y\Z,"C\{c5 'Nccr1;qPoL# tU_x>^yubG@JA u\WKPfm /=8GdbN=mB,- $'<0:7A^owmVJ. '55R\xuK9+ ;@Hqx;jPRU7M 1&Lfqa eS%!.E@&}g}6^=xcujA"-EsmZTH1(2}Z1@CI_an#@GS\XGI1 \Wa6!Elq %7C;Lqxojzwz_)<`hJ <k|+dpHV.!v lrY#3fMN>MDPQ;OWLUngQr8wI8<$&t Uh|c<;A36`|tvY+/WB*| QH?qu$]7I}(-AI=& 0Cp|{hZO>4CRfv|[7],$M '[mfwevzvI1tD6\>AROF#  )'/owli  |mxnh|3;% DlvJ*`H6 84QYKDH^lS!vzdho09BK=0&;TMFCH\`ONVLCk_RCHu$/O]D>= A9_L:o}qdixbhN/,:*]i[dn< ;0 #GgFrtslm8a)kwTc{@ C\^PZqR5<glln{xoi}y^(<k 3"T)#5ihSUL  !HPJU]O+v}km-8 %|TWZ;3WN4Nb?/%#+ BF %: !/:e ;8 {O&!'e2ZhBB6(gzyC%-;d}&6V{^(4Tgp[E6MR7# wg^GRyzu:;K  azuVC3 a&6W QqdQSZOYtT%^N.+^+%/2#5/*.26Y[lv^.Tc[TZx %"]F!*-*594AB2,# Fo|nI FEtiYm.[hhmg_'$Bo+!ZO m1 2?R&Nv]OD,4 "O?sd;ypx'.35$AI>#"(L5D`pm}|x|=5@Wcin''Gxrvf9  (2 e8,KuLRo`.UIh A}wyD3%]?Ppl;(<_;>Pk'0 =!7KiwvW_{`EG Sx|i`~ 6%%WSdz6G"TtFL< Y LaS]`D,0"YMUv 1^v3DakeV*P+?s~yVXU9* $<PovgD~P.EZUa^Rl|5jipYOnJMS^:|`sMlw/"% __=O589OH0=IJ{$>:)(}[y +;Ri^3)u{)OskQ=sTdY3AO=$Lqxb/=PYXgg'!. rdL&*Fb+V>//?d 'FrtgCP* ._p~SknN w5 "GbJ +ILT6>"12u5vos>#h}Y]dC(vdl 5WoMr @m;ijV9"}RF@<~EUIDRppP89Y3a5i~O}[2:M:J1h|7t}kq %V jn]hn8lXUDS $19I\ieNI8'`2.Ei &% +10((\zqwV- Ohze7 %!6f,D?[QYM,$:I?\us7T9=d 0/Y{[2rUUrz1GihMQG Z]W5\smJ&PEI=_l5{o/IIp+*<"?p#<Sjj5&- $.7!xQ-'KM`vpD,AF+:@/P6# .`ai WtYZM*~: &Cv:fhR0 z{0TkQ41,)&I:)#j5Cy[Yxr]FPe\;?6Hs{z ^P-4)LRvC,7J.8PBVrg1vhgYHuq<.1,1-3H=\[3HssSCTk{p`E) *#0ee4*B\ztkF}zjVWLJXt{aaptR-WyY!LJ[~ 9^dB!'Ez\15.)>JLbplosZjI pltw;k #/M8~%4w5Xs3gm|WX'#X<C]+_spVR ~4U[}e*2UendO>q066QS?7[ J.dj_=9F62B>y9K)4K/ W_olf?  !D~V>f@g;/#[yz[@e@,ti[?h>qOKiktnDd3Q1Ph,%)AF= Ixzz^=thOJkQCTy#zA0Zr o|&c. .s+L`k>yultu`frvqfo[>"#8.=X`ot|tJ?JU HH@>bUHTfs?K,rcs%=ajWUvf5  LN5*|bu7[pJ0t{ ` #S?Calr~6 Alf9hxWqi46I YOp/Q|hkDuUTT`eeIVy"ilAH?ALPu{w:sL/c}tcO>_LH, A<+'<}f; (Ad7E?=H6"e6!b 2JgpB9-eDd)~is/VuaA[Ug:r oL>K@Ah  jR9 "'+So\, F`drZ=^XK6r !.@^vI ! gmchess-0.29.6.3/data/sound/3.wav000066400000000000000000002560461323660377300163530ustar00rootroot00000000000000RIFF\WAVEfmt DXdata[{VJ}aMIL>7 HGCFYZA/1GE=6=DBS_^DEUlhE';hmXIEFD9o +/(/% ," .PQ/5Yim\,OnbOG93, #0*7D_|{u}tmldfvw|m~hpD/IOJXbkty`YlzeVJ`y_;# t^Ubo{tb]^UUI<;A?yzp'%q\m   .N_URG^snlukHD:84B>E@7-3301.15GOYLM@3"4621+(=5% /SS[}~{qpop_PJFFReRN`nkjknbhaJ*5$  &&<Ni\,4$0..F;(1?LK1$#/,(5RQ>812RL 5==H,+45 &(58<;NVVfprcHMO1&(-Pm|mT[^P5#~} 8(26 *# @4&(/,$$ (9C9NXRB*  <E9,99D<, 1.4- /9/433KK:5NYQJ=AJWIKO9 1$ %yX*CEEMLHk{ntt^="1EB.>_^VBFRgdWR]{lbkinolhj_KLOU;4<>FL8(5;8<I_wobie]yzV;& )' mgxj~~`boido{|~jmtV^v"<JWp}m;+<ZULSMela/% ("3BU``qpfS36E/#0*'  +\dD31-0C( xcW`mxw|mdlnlqy~zz|sjpflrnYA."JR;B{mIETb]ap #62#"(('#"@LK<HKTn{ /#?axzlUD@?C%$&{bS\r_8/$#6DI@HgqX^wF x]Zkpin`G9b}_^myzm`VL..+ #7IE: '295ShkgZsubk~xqtdHLTbw~w{}x'2+;9@+!) $4+&&;?1.3AUqv~aPUad[QNXH*%#198'$6LSdqpxt^YZ`upvZ_pj`F0Q^QB+ '-2Obmvz}}jW7++ -52(  !.}u`AUPgfF2Iew{odXJRWF31?Ycd~VKV]RPMcz (   +6C8D;G:+7C""64-, 0?;CC>( "./8A??9;97<F8><F6   "#050)=Wi\`ewtGD8  ((BJ;8DX^@4,/*3=++(6D3 -F?:2/-"   ,&>jxe_J/"5WVRWVWR?CLNMH4EUSC/ ( 0E71I_>59;5F9);VC '0# -8/ '# % *0   # /3)   nn  n|novy| 240-?2%7P?$4]mvqmtswysc`XNMHA@!1:CI;MXYkbQDFBFH26FT_ktaKHE;   "<L;CV\oyuj~wigvqaZgKFkyWO|xkbs }jcof`q|qJ3)(& 0+6N:=Absu_Jdy\@`qcaZ[_aXRA4"175' 5&(" #=7"-D,$+')36!(GJE'*|ox{{thH:/ '10@o{hib_pYNbju &963PR#%*(5PTRUWTkup|y`[XA6ARLGXjnyoW5,(>6<HB3 2.3;7 #$,*-:2;\a[TUWijjdiVMERMC=I</(-2#  ! (B^i|uksZ) s  tzvuswft#7NS<,=@?GY< :MD83MW[QadW<.-(EMVfwbNH> ,E\ihQ?*,()_nwO8&   "%Bs]IJXC2  !% !"#"3MX\lJ  +671 "((}mlrhs{aEEC; 4M^pyuywvozwuh|&. &' 6degiu~fZbVKE4  )#7")+ %+:<9BCLj^SWQCAVXU=3<ABN@0%*  3'/8)=OAJ]7%#  754!;WRE04&  +@=P\G#)/0   $* (?>41Xqnu[;4> "*+Lhmzuwlu[][UR?8! g{U@K`{{lX_lzgj  4DBfke~_>4utvq3NVV>'<B ;i_Wo_6/VptUKM`ZSOT_^RNLCSe[Iryg_Yp{p}jioyowjZUqliYalhN6(0&$9+ ,BLbwl_ib|shD)183E< !&0-, (&".&2!!fQ`ctajpXJ+:eYRXSqdcft{qUizYL\mUT[Bmo[tjrcQXM?Umy  ,L\MRkhyv^bz{z *$6SJC8^jE" }gZBmr\XyuzsXaL()-12%{rxyvxicWn~mTJb}vlovxht{j^XTv ?IQCLsmV`swvT-%;!% 3).838">?*!:JM*0G9!5MaggzclztTzN *5-Kh<V1zozssvlRFbjP3C9(+33<ELT>-N[^hQ/ .240,AK@(%)*80(1,njinu}$ 33;:$0 "!!!;! ,|jhUJa`fzrgn !,GXs|uoI<_gl  bQ7 %2!%4! z\zZczrhu{a=**,%8Q`fxkoxNK:6GQ6 >H@IZG+2RJ=7-;aeIO\VZ^T\{u^MQW8. $3C*%   3^ZL?=FPNRG/!Ag_Wus^^libvu^L\b_o~|~paM@?'4KCDG;&% 092,Ow|~pGK7 14HC9E[_pmD5177;2)%9QafpqoeN]_D=N4% 6Hjwtuno{g_gH  4-0CCO`F&3<! ``mWawanlXQnw^Op  ,?714*--79GFAMO'3=UwvtvlQiv^17MN* wi}roojq]hi~pC;g]Rcw~.9J989N7  #$)  '2&0,<^J9NL?0 9R-Gqypp]b[A<^\FQebgwhu|vc]iaWRI'>)PDK4-4-/@9-7D@1(KW> *#)7"3+ Ckrf  WT.H_hXLA[N! ctaw|wq`yafUn{goecj@S:AtrRK^hie`ldl }jt !1 <mfz|^wLSDy.:-L7=barQ??1ME3ANcwxJ{"HK"RUn (qi}MMuDj|%@Z9LuyMhy3{P ;,<w2 (0cAj9zE $<$44;,2Ja'8}m5<84a:}gt6: |(~_f"7m*|q< >iV hp.|P%Lv 4Yq+;aZmt7|z$~~w/7>%DnXqGV".YCA9 $Z0:3RbPV!d@ `_=@~loIo87mfe3m\!x 5"wh-6uFhZnUFl=G,?2j\6/=4Y/ExLvDg )zH?QvI@>Tffw~[H;[i ~=(nY@E>RR7/?7eL0\w+Nw  biOpy.,gmyoF>xT('5g2'E4*\zk*JAomOd e+{$}tv$!b5:;IgQ[X7Rp)H x"oA.l_1T2REbpU~Ha-[0U\m#F;^t'z+Flaov_}^ `"2kVy4A2 gS8a`lt(%@<kpju!ZF\ +}Z XgYfXiht{0_'`|}C4DHOrtMW~[di$m !}] Qylu]= S5*Cl)3a6?{g> pHn VdiJ !!K78}Fiw-(8MYs'l6C{U H29JZs2oG^K.r|AuT{[FA7*OcYX;6x F  R8.}va}# J$fK:J kgpC>8Tnh#~Jb  wrO;gk|& ^s|0T!<Q/E_" nKC2)xJ9X76)<PD=rbm  J\g[+ndq0ckB+QfE~  -~ =~#}rG-IyW "irF__0o}3mZ$xrsw)U2vM(7$ya#\"StUV^8OELf5' X#YVwpx;J7r)N(  3PpFCrG&{]=0J;HavYy9}"08[!SKA\Lj>/z}-qVCdPIH=w(fT~(\3[$HF |] jmb-OtlqXH3Dn{"dQ6%Jue zV@wl> ^B3@]7VV\/q-`T|Cy+YrZ5-b2\:x$A,B)0 Uj MJ&dU`} Yb J[he`1:k+)vBKUuA}#'nn}i@CCOoSl!vBv\.1\X9sSr/5mT9Yxh&RrN$Qsb yP{?Cf\m&v1+V)t">  IoV-*LHuZ})vMxkJ-lOU ` *x Vg2x#,|E/(HeF)E)=hF sz?zy50IG`#pFK[^<[ dEE^F*$M[;,qM N-,Nn TMEILX!|MbVV>1WQ([tX4PW(/o5h>rMi}^[r4?-mfh+Au|x"2jDc/ ;bxpMOZ5k_@h 'RIxl,&AUua7EOwv7u WD+/bH) j%3_'u'IwOf?FiOcEk{[yUkPo'F j;hQcNF]cDAFbC5aYF$-BH>+O "Q| Rdc%K F %6"w_iu O~9qgs<&yRei:[4,LNSLAS(8#D-p4RS,c;Zi>SrLQaz{ y`f!BS"L\)S(;m/B + m \;|g,nZ8ZGpR q_qzJZ|S0a9S^v9?!3CFi >);?/ `##k'}~ M)/1EZ3B'## |M yeMi',$5`nC3k vry)wg`O&hH>6*0;M VI%R~<1wrhr:88}m(U<V`2ZW4]Z|Wlu]yt9ffoq!] ,N#F6x^ GtI,u&tlJS8E~t2B'K9hQv$E<'`R%jJyL dpRM.O8!CA)kE]^v$d8 2S7;y6M`i:um0On<cx6QdQ@0:zI,wAL?LI6PHo #hF"rT$}bD#.@fTadS.qIlt=Nv<;|CXp8X& qM# n[~k&[T| JY>1#9sY u x9@Mx0SL'=+gs&h_A@6K$h,I|p-&77+;lN`j#W2TA _-=4e\- L8{nEak/?QyQjOKUMsffg`u!x ~O$a|ZNk c{dYT[F%XobClxy ]8a}8,&BoD:GB[4:OFwtU}ymD l^D16CYXWZrRkS%NZ -8~p 3)/^rf&sE&Paz@Q 2>Sid;@9YRLYVc'\C~.htIgyU]jpRT4,01\`+&|3w@f *%e@( @cjc@I-_Fo2C\nt 3dN83Mht7gTB~d{1dIO-H;cQ.5TAf(2h4_mB~[k{80T;NH(<% d2!)=gaW1tgenjO-s4k+  u8h7>Y%\<I *!'9[RysR9N(  ^A)Lk JK\KnEB)F.S})\JSOT-k]N- ?t '18TZ"jCd:+*9ixauHhSw .C ?)Ec1[}"dT3t$u$ ztz^2N"Y SqA>8 =ICcYo;M/kL]S/q'fh, -ML}H`e3z}:zTHgx-4V"cA!-} D Q7Z!<-[0LJCA<~ 2' @Xp5f_B/=c:2O 6 2#49'm("K&J5p_pDA3(Qsel|pUr'xgcUx;7!{1t :eh,$KM +8Ia:{)|zjB*x9{Cs{>Br=6 %X.o>U&'S[!XGVb~;yJ@87ce^.cGw\:6B`;S8;?<` <Q,q=_bs.gS.mI{+DW)U8w|eWMEu=6T&arag]!83U' uc@cupN'DDdX\nphDBEJx"mV]$I2auO*D ZW$+@GL?!_SlNgH-'G.zFoaCfX}*3z5xv<MMMm T-yoM"M[\+bo|{[z h  hUS -0eox+"Cfx~5|B>zQCZJY2SoB9mi S7\&<y(7@0sV.S tSa>J X{PI a|!(h3cp!x?22^aFUdFJ0gm2_$k!:b"){U/&yF@#F|5*/o7=J^ _|_s+ \(bg.3! ~-7&uRWX@SlgJ=?&M7~Zt>g c 1v N#r"[-FR3VOAzpp(<, 0  #U|2Ne5b7}vo i0qEjwL ` mc((nLfD]{k|.SOZ NTR:HpNTQ}sJMfbpO/1EZ!~!FpE:%{y KPZ U!Oq,Gs _wyx:DZ^vh'dWL$8!U* $<!? Xh4h'O Rc<VX/5Z.X6 .|1bbU,/Jx 9 `rwcn%8w,qqI'd:52%E&/^"HbW"R. E0^mJB0S;NgYjbI\_XO+p[cs>?g?Q ZA8el\6Q}>9c5 u.@5RQegbs,atI ~ErSP$B2s7>x {X/R%@9xV_eC-:?b(t+Ocq R;S2S'P^_Ym--}+1DCZ }a Z$&#02Sm OCqFto@7`c+*[<1R#U'\CNdJ-.2&'IrY'+%Nxof FO E%IB'K \9Pvd DoGhqV[Tz\.n [Js]s(Sj#2SBbehq? i~}(W@xPM<j^63 Y 7 jb  ); \etDi0 a>O, 9/^0R]& W AS2) i80R$XlmRS8X?UkT'oE#:mAQfAm ' p B }iK  5S|MEhNg(|_ehgKp!`P T!~   $?{")^yJMO;n{(jG^ bmcAe ~oDM7 & %g,4Gm}a,x,_ *6m /  ""y9o  MYz^;[/Cxx )xNZ3# ( RA^toڑ4"Z7S? Q2^b-]N   *m  [3_0n^q^GllbwH_&7u9K 5.  ;1QNs !"1": x?[a'΀ݖp}t)%MX  JB ]?} 5Y.[p6mxۇ8-}BG G ES  h kT c5k!e$## L# &##d$N rb d,>0Ṁ|ž{׭ڱ41G Gb <z ddB#&" " \;=l1 s^٠hIkZ9;3 @ F .CTO a !"#%&7&%%$#!eY5oYٸ˃.ʊX\uث({c`xoFnQ|7y$!42\ @[0֭wFg.9KyM\r~  *FxfSl JExa ""]$$"n##">"P ^*z g  C]DٲͲɣƺG+km9W01f!%! &"C$v##AA`w?z xq̟ʶʼsćx2 t[$F&%W&#qyk}"#("!| 0YCw*dl,GZ˟ } c11h0*0&x!+..,"Lf tmIÙӿmƇ>]޺Te"])0T23/-&c3!!$qnpym=s 'N!Tw$&оpT {!)@=EB?6+'{$&/_2.-$P N= e/ SZ߭Kۏع j2ǺO:+)+I/+.v((+-0k65}3i2|(XRg j"9C !4FJmxluEOŷvcQ8zζ--!" t%18zDDH.C>0=&@!##$Db&q+,'0׋ԨAkoİkzDXmCc.7p=@7.+m).322-MRPO a x2 - L5Bc+V"Wӧ̞oێ&p 5 !{t(8i0 Rs ! #ԩBNгSeeժ#;R#8%u$##7ED`GNG3* #o% $@֋,пKEœ GABh R"<27^>A8}2<0*+('&+*f#u 6@ _tj? l 5`kIrUߓ^ͿƏL"ӪСes@`1  $0B8DOG2>?6"!X H$9a7G#э)Ԋ,ʝƫB%ߏ*jn !)1>>>7t4,#"!!#y"!, :j  N65-hgXߟ>ǓϘ?QRՉn82*!&1FQMJ8Jz" OJ" Ejٻ1 Qѽ˞TNֱ5c# *=:=~>;+N!d slO6p3< T I}F+Ǵ¨˱[NYDŬӽ&e&9bM  A rY ''?S /Uphiqx  Y XR@ . +ߥٻ>/$ˈ$j Ta(17VK"j%!H%k;=/&n7i >`qUwzp 5 X | lRͰ>ĴR )Kƙ+ݎI+?TCGRME"@t+|jYrf˘ѓNd5Hg` e(2P@""3c 6p=*{va C t g :md0[t1 &   ) N -ŴŐ)ŗ߼|vS )M$.~7?HУx)@.?8ClINGPsPXPD3,# t8}'۾ӻ0x3v~Et 1/&3${!M@[REW!>( h _{{~ O X 3]3ѡTŖxVtf5̹߰sh**0v# ,/p̂; ((K%5n?n}ca gB\5{#<"f` ]" >r{  m h dTwOb S O :m1K> 3ҽrl{Ÿc# +04q@MSQTJVK?7*!  7fЬéپIlYB8g$= n]$" ! r 9j  S(92hE*  ZRb}I$λ> )Cv -."11<.KR ST+THQOE9/=ASI_5ƬU*0~;/tY < )5 [ 4n`+  C Tp9]C h ] +h3d9:@v~‰8=WP+#(d/U;EJ5OS SR RC.$;!  BȧDÄ09F ^M$/ _ = EB  ~PP h &Z)T {b "`p#zzUԷ1PSҝ~'J37=FO1TSqSSJ<3P)uG xܤ$ɾ[=,zj݌15E-H 6 O ) n.3:uE Z Y RH_ |k/RL?hl.h 2gisڊB"涆x -ŕX'P-!, 6FP>STKTSPJ9%?' .pQ8˘o36{8_oG<.^C FQ* * i 5 jD PPW E^<Q)Rm 3MR&t#O/-BF-Ͱ"x',`9DJ'Q VTS0VN9B(#o ξ8VßͼnO_zJ sV3 B4 -gmxA +<]h# hl Zd[5~]ƼuUUO:WKS v&/6=KVQPTL;3+ T*Qm3 yvʤB0Qym G Em  9 a1CN(Y  {aSi | [TA{10$)/j8&H7RPQTOhF<,){JTbٿ̾wڨn'AN0[x-;   2O ] VOA &37 ! "=#6"xAhJ m-ί_>+=S۶="+7CLPQRRkNx>+ #* gFؓ.̝fŇ=}-':.,z7DyTz$ ,   o4=q 6;"!"#G$# B/ !$_թ볫7.^*RIѕ  !\.6=I 0 Q .x{&q>Q d 7qB/Kz = ~== !!"R" x~Q̾-&*w3#:?SF KKxKHz9`(!^lnLʥ*k>t_ # ^z.L_ E  1 @  oFPn W)?}.) *lb 2:It0š8b1 l?X J*-91,:+A ]Yҕy@6W d Us/ };  @%Au7 Mf e ;!G ,[f6ՓϽ׾K &v u'Z/9>?4FHEC<)RSw}axʳ̙рjgG- @;6:sr!0w    ADeK [1\V!zFX ¬A^PŐƚGk)/73:DJJ4LDK^>H0*V! @/\ݻيЇ`Qۈ&!8 8 t r9wt}1Oc Lv sl*% 6* \{J]3'*w֐7 R **.D:LEGHM\I=D8/x EN ÑSµ h6&;O ( ' [ F jULy }nST  $MtV+dÄ|ƴ̻:l `%<'/7=DEJ"PLFB35!$ U.˓rćo1LTiHAG<{ I h d u %A+3 i . )ET\y !;"Fę$;tFź^' \(32v9H=CM4PNLD3(# sPR ܞוr$&g]S#,le \KP]ye^Z g8_$je2 _ mq t.Ӝ佼9Î9r 5(H-0@8CyK/MOM>C:}4) _?"o ɃRFݮ hK7g 4V*/ rch W $ P  S &W8 ?B!_pDZ %!<#BÊh÷Ox֙59$-e.3z@JMPoR{LC>4d$,W?LTGE!ƦΔBbX^+"|@XCr4_ f)qbI 8 d bo*{b H~0^p0PE̾Ǿ5.봠3`jȦL $m*4U@GJNIOJF[?/" *w[]˔ѫӴv?L6v1b>Jv8MK: E   B,/%pE Oxc 8vը#s;VüazʹKZ9+5k=CuJtO,OMI;,'" 1sֈҿ{#Иzv5e/Pno R^;I  jTr# MJb$q+ $pH h)l3úntÏɾ^~' 3!,3 8@JLALL:E6.*~T =h<Ƀ#;V7 ^NJR$Jzs c hU ; m-e {^[rDl nw ivӃt bD!T5$*-5AH=HJHF>5/&&2O b **;ɋH<߫fE X V N N T# 8 $ . q ]- Su!"" τɂš=ƶb3S}? ()0?GJIIUIC;5)GOW :zXiސɮL$k@ h o w O  2 vNIguG g *0v 6!"1".1 s-xFZƒ$Fn۸"U'2?ZBBGF?>f7$PQ&H)0`۸ <ԛۤ+l EF! r~*Y-:0@ 7  i3; A$j'!!" 0  MPl8BIuܙ!h-7<@@D*FC@?9))G3&g 'uҪ)}nI ? % n eM0"Q1v  `! D[s 4)y L5 !"h  ]&hV۽+4IX؏۱ NT(358M;BE.BBu@1G"*3 '֝/ȭO%>u ]1 9P W 4 ; ( No]yHnx 8R jW - 6 nzՐBuXűr҆mݖ3k2)16;$BEqCB`AC5z& 6* m9ȨǩSgԠx`/Hq +  rr}9 ? Jnx U(^@*TEo 1EbRHXw l _"iFG仙YĀ[ϊHڔt FC$.26>3EB@B:)#O vL[e٤`%pIk2Y _ LU)D} L yl-@ R ~et+ > ,@. s Vai+; "ZW(C8$p-0`6`? EE EyEi?2*%Z [݅ȑ8sVl> U R]nlih/ Gw  A H=>+t> _?-on - p~=AǯƶƹTĠˢՀK3R &+b09NC'ECEuB7.*]u\>͊:ob ?<;Q@c m#!#3yF@E.S V;D a r|kk Wb!Q$ /%5xCۻῢu٬k*I )v+[0:9B]D[EkFB80+ 38IbaKwofزRy rP ? _=  U 6 (<"%%j pZA9Dc P?Bd 8U̵9]mtpBBCBU8/+M8;&ۋд≯̩^u#}\qk?e\wkj UnBn  ;@sMl }1J "  "$t6Ņм?Faa* '+.Y7T@BhAB B6-*ol_*4ҡ$ iAJFu;zs;GTa4 TI ' 9]]8fbh ?dcf j ?%.RʬҔ& %h)~0u8<=>>6-* dr;K !֠=zDo\P  5OP rbH ^ 9}-  `ORrVN:o"!  Mi '"\<(Ԧ.H et#*R/5=A@A?6[,'p 'H_"α̵xΩ+Xrh  q I D2UX $ HN; # v 3  N)[!?<{ W')v!nJ 8 Clw{2.ɽHdͦԫszZ%2,c06<>>h?3<|1w'e">l >mv܈а>Rty  c!U A@+>> 6EX s L  `72׾BvĶř'T} iB#=*0v6:m==>;0&u! +}h)ީې&rP~ R 6{4V @;,+ el*z/Xku Bj[K*v I : –3-Xdyξذ޴g(1%7:D>l?>=*99- U-+$آԵ:N)MWi|,c  H)?/ mRCzz -VS*z& $x 9 >ܡ\@ƇQ+Rݳ#*26%9<<:@;7&*S!M1ٳ֣Cθӈأ۝h N vo57i# V2pNA 'ztuwK_ X}= "'"_H 0{ivժ Ux.ǩ0@&#-47y;=:760!|X: 0XՌ2G-te7H@^D3E; L`ygz *@1OR ?"e 8!zn StaCП 6ڂ1 b$!5#j*3#:=@Ay<51))* z6XMы*єONQ  ` ^ 0~=>&"h'f^] }(y (Nl!!!` m!ԆͺKػfl@ƛߺnk $'(-43;=r=>L90+#T  !\ѱ!ډS4U0> z3sh C5eI 1w[q6| &)V6i!0"$! @ TnƲ%XѵݢDYM  '*t@, !/>u8}z U_Q1ZgW& aYm]7""% a; D*ÆOhՒ&  p#+.29`95v807)O4ۀփӧۤ3pF c % =h2 4Tv u. V s J" s p1wAc"ăua^> p2+468<96R70Q"_+ר{w  R a, + QZ\})!&B\d: n^ me~ {a]Zdv9! 'c} qqѠHpƒ+l+)"F/>6y567*3.f+'#B D+[Iޯ֖ծٚ}6EB D ? \ _T8 !/Z #wl  ^kA V! s.* -܉~$Pʿ264XQe0!&(0x88R785-($( ('pp^&6E > K *  -VSZy +[ DAjG lCn ] ko{ <ʼn¾˾z#b7,*3j6\:;8c7T6.-$eO6r tgۋU~ D h L E 'Nb7{G A DFy Uv! z fZ)2I c/HՇ÷ؽ$U\'c/_]V)X7;{99%72.9*"E, 4cyB:S׀$yJ' YI eTPF0:ne!! &  ; i=Y *wC8Z>Z l7iοO^‚ĢԦr \#*-M5Q9642-n'! .y\9dٻ!tߢG } J \ 8,`aUK9" PO g;u ~ a?w4E h4:~Jͺ١s"06 6l654S0.,$i GQ4ڝZ6/qM-   q;s'kiq > %uK?3 ]>hz^oO ;kx=܁цʳÀDĚhܳ>~"&F06i5W3$3-0n)$!d /f/z<~&-4+  8s Mx6a9O 1+8  ? ] B^J taQ)k7 [V̑:Ä#'̈́iC '!#/454@420-% rܮn8I5^\j  C  D gfdN={3 @Wc N  'vIAAPT Z| QUYI4F˦JŸy56gp37Q{(&/d>J .9Uq . LR?p e V! ^,uVWEҚr̳Q,ƿȞM  &(,2n333/&   EWeR'^gJbJ|n f)_  (5)E%Rf5 4 ?  VX %bɺSѨ՜5QX #)F/f0N12b/(?&#55=UyEIt GMAvb'Q->pE Dc7Z \/ 0 v  lD}\N۫<. kγٲ,h ta" *'--&/.E+'&#\Y efZ~} zT8t_n/] !fs,  9C<){ ]> 3 r`SҷI.S]dx I!*b. .T01, )?(V# dNSjMPw ttwkq S 5 2 %96K)ͧm#\E%; kx'd)+:.u. ,*("8 \rJi{1~bJ1XqFp^bK 0nv' H ,.#w 2  R 5Oe3(ЩjUD`ڎD'KO t?[%&(6+*';'%aT,nP9(/q_qL h_zM; |973l^ 'jvOF)D\   % }>Hݐ?=qe@j5  `Yc!"%](2'@%$!7E *c,{1STaU'7qup; z< 2 != $ 0@KSHً!1 ::OLn h[! "$m&$"[";p E=Q!;o!6M|jAF E5)    lk&>} ,-@< MCSܽ5޵ Y n  M!d ?- Dma;U{=9P!/a  % Dg<0d = {@+'>eW ~IZMb Y eT]; DsokYphK7M}`g!k " VwV 1 DY/j*dC]]nZGfݝR*>g ])[( _n8wQT d2Ck|4V * l ] W ? 7 0"E+UZ ;@0E/ViAYut ~9J$h/ O xuq(cxU&?epQ2M>r d )  c Y 1X9y ege=G^޵Q0 .n# 7 k(B$1sXFZ[:I]\ARe. n   8 v 0 3i_k%r5>)NF~;g [ fIa&W E? m\W DJ\S^,Wr8(=%Q ;  + # c F E ~. } y ; q4/_ N~gk5= JB A =vB$.a]})'>D-YQ+Uy) {  2 R#5* 4 3 E ( \x~|hLSgZK( \ p\1Q y- H2MA3} %p"p{N@    ]"< G K L C*w5f8:p`xUqv sV.q{v I{[> {|6su/[8bp}& dXm/x`Uy7  q _ # 9  IP@"=_ߕF]=-4 05Cp'@(4 KZ"d@ )B2 V  v 7 ( l1W? # M   !rC޸'J[r; W^| $8 r . ~K|9KG7/W8QUG  % ] YvOEI5 : b bark.vV&(މ u4oG- +)ZYQ!. :R F}IF5/+SFLKH]>9hce + N $ " , Y6D~O5Kbx"Ez *B  '_ rzd[fG 9+(YF[kl+&Kbz $fSP{L re ( nRm-9}n3s3e@%K4  , + ;`xKRh: WUL0=+w G| xR]j  muAo_Ql[45) [3pPRQXBgq g1 ; +l<{AlWaz)OZA zH 3 ~;@EEO^4]?G*i;PfAduLYe;B}_5["HYsG)Z ,N7l"Iq B "0`H Va^68j^_"tS }Eiz[ 68<PLCo"d[HF+xb/-P i  b V h h  x _ =  Zb6y[7~i+W,y^AG,@.-H6>A[) e'TxQq@:3~d%)>F z U`G42Q,S;@^D ZB`C=Ljp$Gccik <}N]im,ibWq^ ruDXgTe6Xl> r `xJ+Bm``(FSE@ l$A6.[B~~{r0s8I*#n/eZkiZH zOpB]z0T"-Cbqr;U JPC3m/[gT:BjK pi 7UXpVOtbafekv wNsE{ X9AjaM6q2VOa:VV"(95f:WcX+A[0Pr[g d|i Tvz;1A97*xVs%ypo,Z:GGKCIVEOc1 ;jYHvDV1wJ<k<wL-:dQ?H!y ,./N94Lq~!HMGH( N&1PyMbtQ-bt8j$+a7ltzvyDZaiVGbyX~rDIcSfwmp`B 3ZC5`XSBsbWoenY{eNe zZ<t22_o2O\%UOmjF6PV=&;ANpR-z\j(g5)!m/|vY6p" Ii~rgQZeaG:#tWJp[G|vA{|Bb!!R~ <^=8ciN$X 0ct3Kz}zt;mdFPSI$1b2B7YQAXi_Z\@QK9DGR2Y[s}duCL-$ G}|~D @Zo 3_[.{>x__) HdkhE>V [kV%9:VR/6=$_ QQJS*./yzJ2l]pjd+u,Zva~dOXO@4TjbWQQ9."lI8?6<~- = ?S"#5'  a!w3w"u<*HuhakeA~lwihzfFb__y{U.:I?) &IeC QkmB)]wU.l@e>', )\}'2pshkMI("2)0:1pbUEZ3)-0J`\`  918B% ]>i:'AIj>@V 5n[:9! txQ=1;/qrZ]2p  wtYN^mo4 9w9[=GB+wr;1g`NgnSHA&PQ^hK@A712;QinZ]idP<( # .jZ1%''67 GSa[< g>>QYg?wZQ?BRVLl,@N\xU*o1(4EU} +WS _<=*ovm.?</"a#]Se <^%h<1! %V2RsPEn _A?6{_]d70{u/l iDI?GMK]npn~)A1G_? C?QI,@ZxurhSOUVT,zznT25BQV9 ?y#Pb<JrswbOa-hvlo,pwTC7 '4Ojlh_TKZ^N2FFS9Yx "/[x_=  8FFQXPD)| %ueY>,F?Roy5>><,(I^wB&( MP75NOEH<>IZKHjbauyrlokg[,zlamkXbw!21*JUa3 qk]``\g(NPGSmscV*0++).4-.98%:C@.-#-462BN]fbhyhVGHWM81;;*z}y#VpwX1+=Sau`Q1:9'R'#7;MZ< #GpzkVH$ 38^{I'?9+*(6MQD.,c1!$zjqYP^gvPf[hhkwV6. +<RgmVlFG(#B. UE!$&/QQ?LR<(MlpF?.w`9Y[]sprxS"_XU+(2XGPXq^2sk!6IZmH$T"G(_qQ0:7;Mhl]ma3 >TPA#@D<;6Ce|pQE=-"wB  B\V`j4I[qcjaQ;RyrZyoSKTQX<SGD,'H\vzzY- >Snpdks{qMrUX_p&;VX95Tl]LLXT[gk_copV77KH<WuuiO7*BQ?+1VW]`}dOGWe\WPA3+'$,9&'-9UYkooza]@9Icwk{x]@sYcdgyrF Fom .RisnxkJ) 8HA<;B+*+OpkxfutU" zK\y_=)& (2/XtRATrw~ZSdy~zx_dr|ci{u +$.479SZUgsbbyeID@AFPCHPT9''<BR_d_Q[xvjwzWQT]x!,>?aH-   4j|tpZ7&- #88076% !zx3PSaYIEMZUUZX?482  !;JbcJ21#SbsnH1'52;C?-+:-|~  -IVH4(rl_Pk|o6!1436ZG :PPv~lMMi}pHP %!  3533+/J_^bl 2pfqtxU4$6Mex[WUG4+2<:9BH-,!*LEEffB#+QA2F`cUZQE@- ;PMD58NXF?^T1KFBOkmF8GK;JRG m_ikve`dhcbhotwkN:KOINkoL>>-)"2SAOcpnXLJOB5E\|mtkJCXnn ;:09CDSS$1+&1fp]f %;HJ8CMOFD<(|d~veL;>DC@9VsxfOFA+/J_~cm|krxngudJ8+&6PWJ[`o} aHSZB6TH>X|{54:6,^c}}ees:8}_UXgyoVCR "?H]mS>3B?8(% (!EctoUHV[="'<PUMX`>) )=]q]:"& 0WMIjylMMTJ39Gkwbbi~sqbG7& 0MPplj\8,+ &VpwqgR%}x  #5lRE>mET^idw}}rsfprt}hhse^{dYSC/;6OjnvMN8;FLKTXL49V2 5=Jcgl`gepvvjyhdwdgjts+VYMCsNA0!J[cr}WB; zk]X`juQ$'0'!*1b^XZ_Yksf^Y]|o^o 5/FWKK>KIB/22HbcOUeX= 2Q{$FF<0- f5)<5=F8=Q`g^PXkwn\cxwweGEXF(&>@( zfPSabJ!  `6JH"yxkss   CYpoKK[WM+#/'$0! *GPTbw}_J "4?8326DF720;8 2.#3+&Gfjfjs]GBevzjMIT61G^ddi\>1>L4-HF413>"'-)''* &#Nnjivp=## 2J;;O5  ~mZi{lqcC5FN2AXP/.I_{xn^P?-Mg^961=9FLfhruqzxxYQYR=(&@Z]`xtjP\fsfcw)4*.:kxC'!'D=9Rd[e\B=Q^aciflrgor~umoWE'|6Gc|uh^QBIHA8-.XfUKTLJ<0jjXRISU:$# $B/%-$ $)2;CKaqpc</@, nPN,/4#$,Cgwr  )6%*<dop^PLH>33=WWI;6,47:8QKPTcuttK  !.9. 4'}f`hhbN@WlfLCKYWQFA, ?ceEJYFBUc^gX9+-A7+@E?-5./3Oi]lz{q}cC/>^n{zv**%,0Ew&xgq&@KRW^T8/655OB03<?G50$ w|kb 3:AUYXI5    {w`io]-)'7LZXYLUh\IQVJc}}iYPE=?}n}~vt~r}uWi}_g (/9@<-$ oVR]imW[`\U^\Wlzzz% #+")?M-  (3"!"?ijO8DNQ7)! +K[IKn~^U5   2V]LYfS?<C@ )" 7WM;WstnYA<" ';P_pqt{lmpUZ;C@, ).4SldeowyYKPQ# lLI53-1%&7>TmH&)C=,BigIN_^erui_UMB&"8Yz*~D9Ud_PBVji]n*,,&4?90/1+:@BGRI%55$11"3G@9F_hidDA.AmorrZD<G8%MkVQmi4"+E^p|eOKezfM616<Zq~pcOA)7a za[_{qTWSQFGO\fni_H(  (7C>^pplmdR:96 iigece52&/DG5zymaqv|tl_Tjhgep|jZhwuyu'=E)(")!':?E389QDAMcejszmfPPDYincgnfbelhs}}fS9*0&5PR@HbZb`qz{lYCA^[WK>)/6 /'eZG<>OPWr\F6?;# $.4Fdpvxjm_. -FFLZUA76AL]R]sqPTk_6 %#7][fkVNZU:65 )" .Nj}}wg_p# t_VXnz&" &(*>\STS[KMhr|vmc[ekltkapwpzx|vmnbd|es|r~vNJ\{\4*EJ/':=EK8E`pQ3%8>@JXQXdvyrx|wF0# .I:@byrsf;5tnq"Inn_`qoc^fS?2+ 3?YZG( */:GPSB&$GM1 !+6<O]npxb_hR|_bnn|'//#v<#2HZuxnYC-Edwo$6E:*+"$(  yu*G_wrU)Pf}[2& y||zzzolw~q_: -,# 0Pktm[[xsr~wgYu~{yq`P]^Zj}  zw.Yfmu~oQ>ZfG3:N`jfjxS@: #-BIQ`~vgZWoc8###-NYPhxdx}\+1D|zl[>33" ,>P\cezqjywU?=8+ .LH5!9(   Fs|iQ?CM@ &' hnscWgkkjvq|\^}_KobXms7CPC(V~tR"-b U?=1+CHf.B0{s|_4 xmpU>.FTJ*:THLM]dxzkL5,??7Rjj}roZ<*& 3RwlZBl`LWgh~ (8Ui`TrweR[" (6(!2GHR='@Xr767?@9. #  2EI13Tu^QV`XB<GUMI6hTXx~zxy](###&4\}xv|~U!ifXSv{jl{{ifO5)X`bL3.A73==::9Z]<0Je[IXttQ74BJXs-01 "+2 "4:N_Xj~i3!#&/174,%nY_C% )+#JMJ\u x~oPVcN&/SD&1ENMR_`sw|r`S, !":]  8UUMWV '6awk{iU[u     u`[TO9"  ~~[YZvzgZS^]V_gcDO]dQBsmL^zps7)NgiyQcgutwP?>^\[dstt{}wl^YM9/(  $1`tMVktZ\kcSfxZ08G?49=" X!Aj}l[XQJ@>*'0IMMOJHISWb{okx%HTjwfmv~te   {<Zsrs}z]C5&1Or{vMmX2$)=IWcreU03CSXQLM?NMYgiU6* &8;0:62 kBA=)0- .''/!L|~l7~'/S{}gTLI<) "BPK]#=+#&*>GOE:?EEWpt^B7$3LgK dWw.PO&- xt}8G\oIT[QBcztrcs}mI?HI;GEE73'EdrI)&1;He,:B,g+0@TPHM_ZA)szvm_iv~horyt|vgaWRh}kRl &:RrwxppjF    # =A-*+  >[jH) * ")8HGXWgi{l\6*BTF04EXVC,!-;C8%$,+$"/3.&2;.'GLPYnle]U@!z 1B6 !&  *<Pnwzya;).&-TVOPstqgXD7(" 25FUP:BSoxiO9$  "xS5-D;+,E`}tcf^B8*(*6.8@T`{dQZhn } !63DA+ yj~1TfpX=:7+KAAajZKB,7D:.1P_ii{fnziW:3>KK53IXR_wfj^`ZYuujwz|w^8(  -&wo[iuhKX57U/t{fggrx"%  # -4HQPKNTK- #=IWRme<1N/ (4?VfbKIPQZE JA;RU58B,&alN#$""!)MWG# y}  0AD&#6 .+9(!6<*!/&%-9MWa~ninpcJOuwP<WVQ]p{}~uli|18-xOIL< 0Mc=;# >IBaobA|tqqWTT`R@2114.'>C+(- '.)*1'A3,L_fUqowpG6AP0- (40GL[i{`M]s+$1A/ *OmyzkL>- J_[ahS3EYilXB61C>>=9/'BPE9<:14'"6.;RM=;GFEA41." ',3 $ "EN?LOMT]H!,&  '%4<Wgp^ilE."!$SxsptuhfL*  !=JXl_*$"366:EJRLQF9".(  />;YnO.LloubM4xu`NFLvzwvjj{{z|kQTgS0@TaRJSpv\`u 1G6)52EknX~[E/ &:KM;!"#225HZI88E0"+%$HT?EZ_UP?1 7TY\dkfjgp\QJRLEWj]M\ccixn_VQKkaOC4 +.3AW[l}nsgO3C.=SMD<49=CR[b[daVYftnsmo]D1CMYV^HCMYQMPEFOaW=*&DBLLbf* |`]djjxr]IWy|pm}zcN>GYP0,5 !!  !2?@:IUVO`WLLDJ3" *TdDMn 6MQfpmsvlE5860(Kgs|oo}xs xr}xw]C,6*    %@WNVbjmfu}rn[BM|~jMIRSLUYnigdltoe[Zxx|}tbN.&.0\66QU4!1?UHB8:8KSet{rmgd^HA?:E6 CdsowZZglZ;F`dL:N`SOabe|gmchess-0.29.6.3/data/sound/4.wav000066400000000000000000002313161323660377300163450ustar00rootroot00000000000000RIFF2WAVEfmt DXdata2sz3@SR@7A85;;?*7GZfQI[ft}fLKYctpnr{{\LJ\kgjdu~paabdUO_pmcpwzqXL0 $DF<Po~~makN'" +`(1N{d]U<'/4*3L.#+))""0EXiYZo|xdLI8)B_ddry';B2!4@JO`pur~`xwbQ(1f}qygK@12R{~}mj`_I4  0IH98'  qv 17$ |tWiyONZijZL[qw <? .=5 +?C3' "6E%)6.(-0,F\hdbnubMD@5)=KCLdF/;LNNP:;H_\UNlkdeBD]W\ZLPcidJ+DdecTFNlcd|g`H'"+)!%{rrnXmrIBGVGV^sp!<F;9dutqWEQYB * !9O]TMHbtnw}mcV=?B%) I;' Pebqz]Z]k{n0%O`4(,'MJA:7-B4wj^{{nx{|dWWU5#);B8!5=N7 9BFbym[c_[dz{hVm <9.4.1HQV_N'/_qw{wll`H9.09FA.YYMq~w|e7$6@;%BbkmV50#~t~zypjR'RiR`]jzqW\LImv\LPblugQ<4-)1C@Qw'+$'(}hi^MLB6,;anTPatxtedfcyyTJhAXNPQMI^nuY^`M(+GHEAIcvPE_i~~sGEnliabl{vkcMXC+0aj?(*(!-% '7:3<^[V>EP upc[=.,W%( (3.")2%!:I47@-!.(.@9   AIZfs|yaabYUgmD027=ADcmjxxcM:5 &3CW]IEIFCTK|vaR2 ,BD>HS[by  1('*':OKJO;06Zt|n_^S2$!DF."5?10Lov`fjgsyY' *578J`tz][mqxwXK@   &$&8HP4 ($ 4uzpvY^zsofHGE[S38dmsz (8C69YewlgSUvimlzwzvaNLVQ>176$&7:4Id]PIJTbZJBRG1(4C:% {MM^cjvsss{3J4 ~588+-   0RqXaodN@CSPE/ #;JjkqyROPPMCHJUh]:E[kg]^gr|y~wr~wogwpbVbSV_jn|xwL1)+" ~xi`c^^x|twgZjsrieYfqO_pWbc`V\\ZgcibYEE86AHNc{(E`fqi_T@,))6]uovw?0/4)!&-6AJ=Qms|{saUghmzqMSUVXVRG610'+AKAEfsZ`C!*BD$**:EPLP^\A w_^fq[@@\xfbj 4YHRxzE+'4A7&6@ ~v!-/{p^VG8BNWV[a|*) zpguoqn|(Oc]F2!*:@9#" Xw|~ofq}S;L<"/_X>O\X?LMI2;PTCB=*#.FW\^gYJDFDMar|pRI=3<IC    #627HH, 9:!4:<//1~c\~ srnbd+8CY[(-GJa|u`H(/.% ~tIZ\ctjWTCERN% '+~ %$0,+0#:= 5,+bscpcKI1&9UtuNhlJ=cuoP08<JThuqC<D=QiUmj~r R/CL05!!vG,;J 'Q_FGTUG;YztyN(- (U3 BWFUfjhK8r}~g2L>6@8WjQGYYKB730+4G22,!6v> .|yJt_-A6{ZfxV..T5 .:'3s\ VP9Q^XX]{cY7@<3!$>;w[_j^)#7/FMA_iU1-/fc%vxC0 5T>@+_I;x}J!)P"YbYqg@yL1-7 AlT?s`K 0)o6[aM#k6HT (?ZXbt-&HaNHlg 'OUK{+^~0TV Wj;ZQZYg5j_F\P|"kb_1,'RM,>%k?,Hxv~p81M#3!' %]>N < ,@J7,L10P6Ou:FXc`ePxyQ=Ug*k|BhKRP_~W,4 1D^kX=mD>#\YCKGf)lS$4\lWU ty['HRQ|f]J:/ x#rNH8o NV$G )\;y}m j@.U$hE?Pwl=ca}$)Y{|_[j,;[d .ylS*(&4Zw#9ywytWg_xjEMmG=~) JzcUB2!py$xWu77g6:9>[H#n@6Utpu(G"U^_D!jI<`2A(S5_p~Vt W4zjhfg5&-2~xh _#p40"`<E*RwY@}>1D9Y"@?=lIX>xTRs0^'Lo/Z7,&/@1/T >`B \|p@X.g G%A} Uu=7NZOB>GvNp2 a[ YU%{Z^8Ajsm= s!-K&{V&c.',qi[PY#F[XXY5mT%f->jFp=4;NH67VYedXMF6(2~*e "z0DG*M;TT"s\ i9B#z/hh45cK,x.g\ [x2  O c8TH o~F<S@C%S!)rIQRX Y(/P!` ?+=Y?"[eY:]fB \6&2zB<kv:2SfrTd[z~2>ZEoBKKcatAz0E[.d9)-I3Vvjs>t+KBlV^D~w7z,%r&Hv7i3bEG 1S/u~IW^^Vqi> ZCFWznMx(rrywPu#*b c j &4 5lI@ $VIe{P oz NSQ"p`+%7y#@KqOL-49Ur!s8HvW+@bxJqk:[&3n%ZNJ"@@ ?S6xoD[=yP -Ljy/s0+2YmCU{ ^4}q1 @xf_t\IJ#[$Sb9MU{H`IkK6% 'oRjI~k,m=E_9H/KJvO3f@yx7YRfE5OGi6nI<TZ)'?k|ZvxB6#gmfUzihR|-N )QbtRD+=K4|dg<q@q+]P`j$1}B3>H.- !g]JQ]m;I74I5#6kV.#a'-)-2Hj;:dZ=swdrB<czz*At@ u}L!f1r { l|Ls26+y_A&S6wE5=B n7<0^FC,k>~p8 g{jfT*4:Re< .Ec<]*!4?JE<9+u2/mgQ~R!k^a"`~2:[PS`  ;'X%txJN06DovtBUG62zFmOYs(A0  M+9> 3sNwUbER_X>$XTlcYfN0GxnG4W,hR{X?fCVDOtXyu-uetqA3j$k%OIa_[3 $JX Na(/t&T8nlP/*OAXr;],Tv+>G(<xO8]#Ug4#&@Muu=HN|DZe:r b"O33o2pY?BZ5k~owjl"*}My >>Jz38_x-e 9WPK$Yf4nqdG$] fc;yh+sIY$>T (U%+WuFSU-{zl&w_[1s1329]XXgi$5~ZFeC=Z(] T+d] =G`(!)&?cnye< i~O"J%b^\ZGrX4#'x+'J;3z{]eICE"L_vNun'GKkbDOk %xo`3  }9lCk'_;Ugt3ru0IJ!F&1A+4un0,o #yE9qDuHf%A[}I[udR _g(tdWtK-y 5kn"uo+PO=k][^:WRs9Ti8f \.GiBG>Z~4(2gQdDx8TnEa$= dw~|GFH$NY%ixS iU(5 W_WX i<@P)@$GDa.^M`& zdoZ#5>!hc~/%(~%&JdmuYEE:8q.rn;`Ln LZ)cGr,VU`7elOk8%.JikUCyN|nY2{HYC36,N#Z^r<ht.w /o;wb[7KVJ'q^N r3WJns="kzc0 gSlfYAIQv=eo>Ci@OCll QFQpc:avFaSeqHdHPo (V $nTI*qi=)q@!Hz7Uk&9BlgC.A*|wc;gpCU;=n-"v CQPP1)0U+v `e c"??1z;)KXgA"EV*VF{=m,Kcj\\PainaVL9`)?x;_sztxQS][#G{Q{0HQ PM^<;Yp/4f?W%d_O*LkLt,8XX4hXx /6af#y }IVHBu)c h^wf]TV-[gvI>l|nhzGdzm`P&7h D&)K:M7(AZ] vBCk|x(>j/V-rHw_A=UR~^BlQ1Qo<Eo39XW{xrml eV Y=e,*BTzx+ly]`GmH H6vJ {CR.c-d>9wMIS#vH*0& \vjF7V%GmT'b S&sQ}=]o6N3^- ]G +T%)Gs{ebh5kD&ILjB,Y0LV%nvaw(BM75;R\1%U!Bi( 9d#Y<a3GH. RVk(Me(? \wpL;m Nq@ZK )4e|Vl AFd;:qpKzy lE*jLo8-oGDiq==e?V2*:Na*#Z cdA}o3GY1#:SY: F|eamn}vG%/hV( sh^Ig;dQ0 +f8m^ G$w$G\E+TYh]$nSLm1DuQ4sETOs @m]w'8'\<BMV=-4<[^ "~L )QDt;J d)"?PfjbAp F.8STQQ(w9A"/-/^<U~N P/8 )hZ]CY}  @?-loj7z9s"n3b>H3 q6B,b =z3u;3%l]gm*;','G4#2UT ,l|8&+Ig8}!{Gur2@ow%)#S _k1{:,SMv*Oe8.;f0}R+.VV{0>&#[!%fm4nzVGXE9  x+5[b|n^:q ~:H9;I}tp\m{Vvuc=tqP3^Nmn!rzTiZc,dzdOG+bzq@!nDgqD5 k9J'6?'JCcxGb5I z%IcK}`5^>/(ZI2.9J$.VzG-w(3`@3 - b@O\3Kx9+}cow~:3e2 #PWZ hw`Ky{=b! Z>GZ,)9Gk,u#9Uw Hj/Be0D^t Yv|7~1FQRPU}HCM aWni MUV> h:v v?dIDWWYXSUy ;mUWX/quz_I* ;*xsM}U'GeLP_TS_REQKeR(M(gTR.{;*J zjG=s3)SH "H4Jgg`c5`G ~l>gQ~j}yaVL] 6 X`>3[ 7#1:c ei hYdT ?KhD!t1_ aoe+>.Bl*02?P^aS71kt>66 _=mno xEK&:Di28fe4*qE @@+)skSL#^#zNAODIundZ:R^jsb*v;g)}4  RFJL:u[A?/sVxeNO'v^: `3 ?_Qw+UjhLr l@tcPGb y@DBJ[HV5;5FLm m0 #M?04bD3]Mp2[e_^p U$++UqP40cY <U#"IF:`<9r>w F fbPA2OHQFS2RNEk_N7@ydf'JP/2ZP4VM:D~J!UApy }.{b;I4xvSG'LB"9zxv? A3Z|*fMj A.)wRZd7 8Hhy"+-YS..a:+vX(ei~LxiI7cV2BB"_<i7P  "=,0W 'W-'-+6b"3MRGb#U Wi5CYa 2%ixN,E FmFWVRD=k;SMt [RRKK/nINX+dJd* m{h/*- \ UHXHjO2ozTI?X>2 />6:.X D4@1'SzQl-2_1)"}sr/qw;a~'b-*d ""/,2MC drnFduwwVfs1 AE+a j%$?Go^d< u = R0f`Q l $?*M5a|?T@RX?i=Osj(jc"PBUmA,I^rc<ZIuVq5PAQfp8q^kjD aH: l7K`:osHajF>{&W_Iz:-EE8 eOO[{R99=F0{zX-z %yk:O3#ti#-'*q_0x |w$:tgR"=hm<;6mO,G|3&k}PW) Y zco`L$Ua/"dmooG u2v[ #$@gL@= VN#AY  K 5/Owe_P[+fA]<*5Gn.ZJ$41B?tgEI0@ j;Y`#yV\S 0=k(iZ]%|nh~q8}xEK@"2c`9"1OY?}A"  NpV)?J, |k6SHm=xD&<yoUse:(]J[Jl.VbCNuk<ONKT_t_iQ`y6!/yf _wueczLnrGF4F*-\6v< e6zjy C:^s*~hvef/Lw!I6/>`x`UX$Yy^UkEtzP:-eLI99|-Aa>qZXHlD m'dn;!/r"d p>Gw(666q^a _:DI}/Q(zRk/{n-5FRRHOg(\vO)q(|AX I>`=6&"!?.%/At| QE^o&v HfGt\8dRn4&A)37MC Y0k $3%b <YsR(TWA#ULFiLh2BGp w987CCoqh@y\[U K Ax"fN0m&gh0lJAV3rk-iiO2Kr[XDU" =HB"Aa_|y~`6um_@Wor`k :Ew F#p2fkL)`:DDQpX f-?PS6=a]B7a67!aU$@6Ni|h#H$"_sS[m5|skNQeS F3e[KV$SZ9FS>;8 EE!9R +VPn;;a6?8BbrERk7} cwQ];{3 ,lWFCVL5<>814>yy3GzOXTu6\Z!C[_L%s9AIP2w+3BHlG:Ey6Gt>[t,/b:T s||eRIJ/x-"  O ,  "   A <4mdw.J~5pU_y17j4u)#:KJ#Qsa4=x* v$iQ7V,o&F+uxb!4WGq2_" >VfrCt  qyc`L"yTS1EI`j?+RY)Xj{/ = KVF au 8 UowvizqH1HsuK{*<@ qyt <^*OX|(}+VZ [g' ;v:u^?VV}u=@dC8n! , 0`K+ < iS7% ''$S+X.Y:/M*-HvJv}iBJ9d[ Xr @ Pg/ D cl2\:\sCz))rN3  F4A(XO4QKBE!dQpVXD /UB|PIi(aWugj.@?C?C2$ 4d `++r& E&LL0W`2@K\tB"^f^n7,J>L%C1^nII+.} "r`:f^\&_o3alEo*)Zif+] pW~qgVMWHcjBUh;nE)Eann YLiujOfpI0B HU2r*+O,?@7k e(xIl\dE2 m ~ !' O) \/$rfVJaA.QW" t "v_"le?r(A$ Uj;+'"17uV6|K3UhY $}ACi"\z2|FHrW6 \LHZ"(>7UeCZC}~)u ;OaqK5;#pCG)`ZH3q<na|onh-_r\XYGSofo#H7 *l=PE U{?kXKo^1#GpY\lvEXTj|Z#lfq]C +*OYn!;QHO!'e'{ #Y# A & } 55WBj~[^sZ!S`'xcQiB{;%d~6 t7*Gb QM!ZUoSE $ O w>^d?D+) dBi 5 d 3 Y4y8|) 6suSVQz> c(yeR vnJE=N$z3~ew!c>ST&+ Dm$xwnM2>i"/ N6n t * s  ( l8/KaINJ?Ru uhQ?eik@A MF|5 ">Utv'fY& A}3Z_.e_(g6XN3'j  @ - M ! t% OJAXE|d|o1*7T 0d"fad4gN+r. DgbMDr =BY "vi^m>.RR}VNoW*"InY+Pr~ fj Y K)>%afA#/w2#!7*in@3 GK-@+ +%9h2 c/M c# ck1ZP>0?)\ s3 gV 4 ! Yh x 5 m%(O .w :Dq +,.g}C.@%a;g86v/T j>,cf{2jhRv#^nfm |G6W\+#x"A4 >F = V p( " :  S`;aQI@Ji =0M\MB73G"95|,S:2[Q!oz .3w" <4A5bqyNfGkH {/FloVXxYr #&-{83o"FSC+8;'- N ZtAigl 00 H@Y[}cre^ocKJT-Vv |" B> V 9 k( ^V9g @G#m+6oFi/v|hTz:tY/k:VcpGiiBTPkM;Y<U 5>W&,4 !FS|ZlD&3#V*;(T4=JE#aKoe215F8B1$Fnu-Ix|b9z 6t&:) Kd{Uh9[)xE]V aT]4zV99 d  Lc7?GJB/ ,ApoQff rb[p3tk(4?e0-  b?Nl"_  GUjv  -HeWJP Q6 f BRI f  d#@`Vow:^! 3jy#/(S-t~U0GT%Ln8%X&")Q$@ 42)v!(( sT>1:/HGe4B;#3_{de a t { I +Q~#$Ce-.Xb[N d8SWdF_O|'E;~/UgL\A K:\Vj1vPlR $  ~q*)_ttQ/@oKv] 2 j  3 k 8R;Yh&Ci QGve3OE+qo!a y8lpwZvZYR~F@}gp#G(m o 0 8 \[XMu) (*y/   t" @T * 4 - _ k P R8/ v?iXRj`n+1%Diiu_ )gYX4O]zYP8 a * 0  |  w  >%i|\4#,8 Dx>AtK"]o[ZhIx-boQFM{\uQ] bT xg{9f}6J1% @={ZIiJ  * J:2(+BIt;k+#H/*jv|6  mX :c  HNO(c%#$2[ > ;`)gqD K 8'x>TO,W4W5~@ w ' |D[RE"m `e*eMp-%]YU ! r paX JK'gvD}6F\1?p3Njat-i_0Z1c7%|%Zzh Y Z  hyn(c&Z Kq SZ9uy? P u\R0/HJubp ;.*; 8g#SFqR6h-{5).6 ]gN k e @ R d   !Dl0mLW\d7c)$8  h    CA`MQC#t !3Jxbs(TRBBOf|wBVmI!.ADbt k/g83D|r . z H  5 Y x)?(9`B N uy&1%J U U p C  *Y%ue {+sQL!_b@' ML.2l[T1[1%~;J   ;< x  S1Vh@27*IYIY +7dZC  *  #R+  dNMj2pt jV]c3Bg64Y<zA$[p8P(dMY( ]|:eh6^Y=.guyj<3wx & H  ] _ crU'\M6^IX z 8 > 4** o6c  - x( gYV-dr>$i'SJ<0\hBcf\F<>tH2Q<vRK9f4./ E [ * d dq_' oA { h 6  4(Iw F s w  <'u&pM V2:_+w#OU![6uw&XiX+:A5R0, jTNI>kj8?jDuFgS# 0 F q  [4'W ]  r Wf)X  6 w :W z8YCQ { i/)3c0,,O&~$e(wl>BK]{};Hf0A%*'"r  WW    5ZS$4}DI > A A C  g }3 b J g ~yLDAA| 6 R/qnG, qA#rs1mr2XCDsUo[M. u)S\hrp3um ' vmk>~7-TO* | | n 3 \   > e(a60h T " T 9X )Y_0s U "3!3&uh`RD5DV4S&Y0Id"\#=DN P2(-l,7 1uT9QvM  Q ~WzL  ,-OQG-' h6~ .^ h m@h `Pxq:aSG /PHO.RsFX7.[~!Xd:1Hf}$[fx&+}-h3=&M0 d >7bnJr8aw!Wi =E IJ;U<a3 C  %j, 2PA 5} sO~=7)wD+rbL5w%sK3/f _]t0cou>R%! zTt^Fh'>bix$% u + b I 0S^!\gsv jO72}G7Jr_LgIA["[7dVPyQ/_*q8bg3%3(??^=<fBzQ8@_B9au z m 6,1O't eBvGD20MU. +E"7MLSeES<270Bq99qAWvih%+~p;j9X%|yP)i'G 1 IK2' g % 532(2b7)? ! -O5I  Du@ .}K MXq u,u nyE Z H-]_yH@%)merP0+['h6<f0 # s rHd.-1  f:>|BO-sG;\RNkEޞޒߛ"wrݾ݂ۧz.}sZ u  l  _ Itj{Cq6} I K^m<7k6tPX M  N FhH  9_w:Z20 LN 9.v[. q; L'TM6F1{i*ߧt!$<3}9i*  v  - O,O R  Ud|+N>TPf1&dAY] m CljVnx` , ~'3B o.J97TK^ QTW7'dkJW1?Սnۈ݃߉}&2$*iVc !2[2 `q S : B  yg`Qwr R7 W3t'{<l9 q\:LOXhH}Ly}]k;$  }.7$bcQ߭\@aۉCv l|L%5:9;` %5nzY/ %  tV4@ " fu s11r&<j_h4ZGmr $$L []QIb7K5SI Wy*]V Y34T+v1;m7iuN+ !$'I fe M X )o N o R 4I.W*8z U\D11^A% , D~$b{1+M YYa` C<~=S fM)T=# UKt33Jx,Weof v ! ; D   H 5  #|! ^iR;KX+4|li;RQ3 ~ %&dod3<[%?f0VY G  y O,R -v5D4 X!*dh5 ?li7"#@ UD3W\M , N  = r |<VQCf9 *'v0bQ<2" u_ - ~0u0%L[?v-XN$ I ~Q_bp{S~$V%sf28O.$Ykls~n ].{sBbo@9-`u2(WuF8w'YPu;nk n { 331Z 2X*>i Q[<<f~or p  Q t}e<mJ0\]} az .M0#@d?,*\21u g 9^{X&\03yC#)1={h0VDv@C^'1D=N?(./?flq Hf j I 2 , w+62j[H:_ - -4 Ufm/MIyW& 1j22UXs)&FU1Y 9mk{#F:%~ RSMCTxbU @e + xwKq[<I O % B{ 4 u ( J t & Jl P E ; <Z3s J 7  {  V  'v! $/Pedc6>_&U -q^5/t% A]W/CC2u xlozD?zf=yq|MEk^;YbSOlQ uNPfre2Au}{G - D  5 j X _ * L  )#s 5  | B & o n  < >8 0 F 2Vy? H 3uq+* mg (,cC9XK`Q G`N*.3}&cU=t,Z"f}\~,Ht~gK\!H*q8&'kAbS|m-j4e_B!qxVjy  Y M r| m S   0 _ N ` o =l*vtxMrWEBLX+y9Q@#4tpafa[K0(%:V==4ui D4>4\')d;b,fNY_0 f'Lof7K)mF}])m^1u{Kq,GC] h 4 m / S f  H  Hg < C j h M 4 ~KMF?MH ub9> G}g 7&'bprNe 57@Xgc!Z`+&Bzo]rNQU%R K&g9>D\ 7,?^H % L0l&:& u n p Oa5@J8IgPim9)lJnsA2 w*) B,wVFW[O=P*2EMQ^H"SXc~P97KUArGs`FP*wsYd`> nK- f Ne0;rdtAQ;Wcd .INg ExZ}@=' ga<%8'\! /' BGAtw}/@Dn!8(iD$ixef6}\(NYb. RW/% +8o5;ou)jy \G)*Rr LFkV`FMRGKFxIYYGU_+:>_/#N*iEFf8Lcg!(N ytJI1&hXIT-]Cziuge;LDuVnwl0cPZcD7;{]`9V &sjl>JwDvB{S[MF7}wg.? <S|0$F,XNfyT8!T 0Y6m#CDPHl-$ v P^Mb/lv*ea&&2$OO7$Ghcp`O0c1|S^np  X,Y+%HM_'<> 3@nWL@MBPJYvo2~lW^mU]n}Y>$kBf|vYrnn'|EcaiI-#-A-5GI_yqavdJ@F@Xmq= F|00<3Pu?M]! &0MhprNBT( 5>  cTWE5Vj^]hrpgGP_X</#  nU@9$43 V3/KSP'Rx{gPf_T~u?   3Z[y~!I21SYSH:/9Qo`y 91UlB6k2 ?LeuS' lV9#Ci8xR[cE 0_'=Xq1Txb}1Spd3('X CTTwW?O@)\~YKZB2Uhu`etCo;E(` `  !.O Wfok~Gi m{2 1RO>XZE28\aos]Q ~V2DejKA?*1X\E/"F}{vgucN*'mjNZPC6Bl*7FM1+0{QR*1G@'|QS<*%fCH5VP:K[1Ro:494 =MMXxu\OO*k_`SJFO>Cr=1uINk^ayZAI9t)-ik|lJ)4I4f1,{~@RA`H|"XDXB /Y~g]j~^fv~ux`T|z'EYa.'0(:Y]/8R8@fZIL70G@9({\zezuOI9BH$@A(Sc[aT jU\47^TE;?@1~ukB/3]xwX|{:B+ ]),s`RkB{h^c,,Vx_fqs'2.3N4Q "pgd%pUDwuVW~oB/&:eL7?} o|K'%tdgGL8DP qN>D]t )Jv]k|aM=4IPE|T\PP&.!4gM`^LK'R6%#PPYG805 /@QmecfJ9G${egPPWMj&#6OYF_#Gngjxq^w/U;;ixE7]6!=fggz@90=2c`c\w Qm)3 jJOT-"L~s0I:5A,<#)>'(p :{K!Dj_?8V0YQN ~v{k|s8aU:Cnjd~Tr>ebSJnp1]!GrlYL"UwK%*&K`WV$&}H.P$]m~<_p=2 F{1:oqr5 g1/.Q"Tz>hXW=P63%v{tnF$7~YnaD /v\3YK.(w 0@_RLD5AIfRHTRE[WI 0A* *Pjt-hoNUN*\-(>PT^YBQPvUS[p[YRO82/50:&7VSD!=)";.3uvh]VV/z&7'cQLY{ tT("6AD9(/@LPM74BM;=E@8! ?ltSP;>klme7aS>5=TZie 1T>Z3  $]33( R/!)D[4,\E,V{^i`5#3TduoC"\l| F!.%>UYlkM/8^t4{s}m-(Bf}oatrm{nZlb:4D[*0$}=9F0.M}Wk\\V)wq O[L@Fv}UDX8 RsmwhE=srA#$141=GXmnk_hjVQjn\QNk~k9KGA4 C;!$7' DX_dqmKQY+  +>rM&D@B_0J3_CQYGGwouENqQIPOQY?4-5=IMk2G8CINg]: X  /p`fTuzBwpX)0s }dVRQ| "raj/|smvbS`|gkgzL>C w+&$Kb4 Hu/A)g^\4# -@+)c "&=9 x~e5BKSu{gr!P^H8 x "/=UJ)#0 $1=i1EEPtyi|q_^U0v~qpR^M=;PklmSu{pjaA7Ji[IDOcR&B1r3{yaJ bC. 6n v=5s91SeEP?* 69NRagP1 %;,)`zz]??( +@Q_lH 8DW\9"'-2.> $4* 3+&@5,409E?$XLgx"7OuwO+kVN0SvsYK:0(=p%S{wU=)<bK/ <3"2J`nV(D.:S{l2 l\TVw,=O*x>96)c{k]b~ztY 6XBxUgq^ow^_]^XZFGfT<)/\x$ U<#%,B]l{p]lP3)2C]`Uczwj]e}|w`fvlo)='"2' 1-"%%$8PcqhJNS? 1DG69^sdqf[Uf}mB:VA##,ERif\wwa@C\bslQC@5Lnc3;ICSkT$"8X5xlnW)8lpfaA1O;-KD9'`wvtulnR4!"DQUa|X-$,N "DYDPc]KDLSwJ3@>8popxw{sdK+=PUmufZGFLEgtpn_H\toF$$22-E$ef{wsx_@(+ 'Kllj_D>U`jdz>.=: DMK$leiEG "/ 6V^J0*me_VLWTUulws}36+^@ +`iy P4+ 2CRhQU\wUKYG29: >F70$8:?QPtPQF()8VdL`N<3>ZH'*@M@D;9FD.5/7nYabRdtbL/ $'QeP  3]oyth]' -KJ:4F6* zZ[JFdldwipsZC8PhWaoo#NkL3,(-=@. +e#28>+ !iG/$#'2|sqbcV>U`: "0]cMO4;_bDBA78Kb_ohR__fOJ9 .0373Ip|m$,EB|sli|a%6] )3 ) -_`h~p]^=$=psvuVrRTmnt:O3,+sjH>Y[abUgU\|rdhhX\bY^,(,1R!kCWyc[`iwy%@WqR$ BG7So~|vyV_lW?Cu|N2,50&  2D(Cn~zxzyC*4CO[e\G>7qrvmn\Q[hn} *;<CA8+C_X> ".F0{yxymai{#%# 1, ")>MWakbZajk{sxbTSVJ/18J97TX?EUE0%$?K;K>EKB<I5*)%5UF3' 22@VQ2'=N^|hT3$;.*+!"AILG9=A'/<NQM[eC7/&/CSZNZoqB<Vc`KMB5,4+.$(Ye<0,7++&0s)3/.8NUJ<nYGKiz )   ".7dnqU7 :VM= 93Em~vgS;)&1:W`K0>ZdmtWP`kcRO[Q5(" nO<-"?Qi}^S\U3!BYtlmv}2DJ13?/4P\M_fpyhqoO:,  xjF;,OLH&$# slZ[^(!;3z{h^s#&Ci`_M#FT6 "!*2A>*8HT^]7<98L]oxVVaroWA !?!bTNQ_ztfr}v\fvrx|fGERJ;GBJF77<$ -*@miE4Ojpuw]wvaUcYZP@IkzkOazW[:+CTMXxxuqnf`O5!;F9SlobksaHE/#p{zTHR>D2;I]b~{ujrp`Wp{w /MUTTF923T[RO:)-!+2(2-1'*)Bsyocop{SUS85@^}[CbwKKn|{xrJ;2 %0;OQJD#'uxtqwpKN]|#! ,Edr[PYfPA86 *=0-7<85* #%(#13HYTHWohn}yTI?9(- #2-02;7))LO\\F+-%.6HOLG=11#'FcW76GYkthpfH88Kz{gPH2!1 +;VdXL;/UB ,;  +/8A>:B3 "2)DLF_V69XinjX}zzsjfahe^]M2") $DP\um]^dQBJQJ.pzOH^qp}&+1>: D_efNL@:=?A^y]?KZZgzrcThX>:,,Q[H5'(]~utZSdt@  $PX&BQeiSNGa_IL^N/' ~gT_rYyoiwc\jkuwhaZruZXe`anXMnvhZALWA)' 'BZww{~{ $ $6;$(GTKsqdzb>Rmz^tuyyqpC  nqk6 /E=Sx~pR\v^Ztpzdn`35?@AUE/4:W`]t"@9-%#   , ,;6D]mr^TYacn_g_Y^nyXRcXJ@,)" DA?F&/4+*%w" )-!'$ {lm]\w 4#& '&% zxdN95Kdxxz!   " (2%"8FT@A':5+)7! &HOL@SLGHSSWQ:"" *3-jfM;CZe1?3F`qsynJ<+9,5SXHRX>&9=<+  uqy^[OF`mt{howsK.7Ynot}vt~h[_n 4?SJDUTK.1.,/=ZuyUOVqwnq}{gB5B+!%'=ewqrwu47sa[J=%"-*AXodZT\^@  jaNFQ7Dqzsue`'/ (<=:0)-!.958M=5OQ^WC.3,%#  cf\1&AI^crgf~cSpzlhgN/>Xu)H@B]P=1$*.LIC\cWXg`R\~}`TKPWXF %7AQzZXN'# $5UneVIVa_G2&#z'2 &6GG>Q{`dS>$%.D0   'B<13>8Whti#=B5HZSBD-(*# :S?IjonnE '3,! gmchess-0.29.6.3/data/sound/5.wav000066400000000000000000002134761323660377300163550ustar00rootroot00000000000000RIFF6WAVEfmt DXdataVGa4;Z>Ht_IGdlv{ndmqrysxpfzwia\j~~~)23&}k .*,'!  3KdtwrqS(4=1  $!".UocX_P* -.".A=D52@HO^a?2DR=0$*#0SXMVnpidXYM& 0+%)PZS_yw`[bbORqq[YZ]hnt[\jg]TAJdJ3LB:8>79-+1/F"t#v{o~vZI1,/JNjr_d|sl`PPGBPXOV\wwp)IB55){jo1EOmwsaUQWXarpq|eelmwvh^S6:JNVpWD78 $%N|bXloWTJB5"!.JN@Xo=dPPRg $)y~jhg~wq|[H;.=C;Giy|kmp}}qw~gs|\Zb\Tl lpg^yrx^HNVR^~x3.2H=$57?DPB00M[QO[nx{~m^rnU@FNV\OUL=6[ka]nwczrfVNIHR^vxsyU6=KFD365/4WnXISU79SG@=;&-# x^aq  jgfTJG2'%%!&6=6N^iniZ^^I8IF.Dn{sokvz}ps{w^]RGDRL_ $38897*"0D2&-478IRWJSsyw|qin~ykH9JACdw^\phISYZityorzziU%2Rcbb[]^_BBJFOEEs|xjQ<!# (()B;%43 " 0;/  6C1,:69MNIfogfU6%39)!)) % *) 7K:5E/'..Mgg^SQSG Ck]Qeplmo|zl`FKZeX@<IC4321:@#$ ->Oi}zc& <ahWK8)(5YeUF<F(.* + *$0DG=<@||!.+,-()3:-% .2 4%  /<  #BV[glQMRVgvd:<GB=80Ta[[BB;.2A0 ** @RH]jjmprjogaG-!5@3&!-13\8.3EbstvsuXIYXOVa{lk~GksZLEFL]eWA-#2F>3-/GOAG;1  $NmzzmUE^gI#, !6#$)>565684+DndTfvlc^BH<-*3.=YohfT=6%  '( ( zcV`hgLZcZpyv""$5;CGFUyzh:;]xykfnw|y_NH@>@Wt~vlfylW2)  +<CD\hmfRI+ D6*CENW^O1 |J'Mkurr  f;'!"*FH:?OXX^V[a^Tftzzzscv|U*)*!*),##=##/#''>JRci_A, -ZuxH8F6  ?fPCKX`\PF>4HeldiW4yqvFEWZO40OhWHI[ik_js|x|y[Zkz`HDA-3]b~  5?coibns`D4KY[^YREGgsVO<'">7Jh~xwbj~aN9*%,# #GfmbYaR4/%/$6#//%55$"(/(,xnmitj,  !O]vnuzlt#*44-' #7. +)&2@@GND* EPFY]L5(9EC;SYO;1,$(=XX]UB50<J-KlkuqnteTDACD>4IZ;0DT0 *H>+@`wV"&52*198>3,$   ,9 q0FTde;7;7HhtaSJD7D&2.-%6."+22;]}okheszsue_ovru`of^D[^T206<}ndkeM[|}rt !:GQLIMALagH0Q{q_T_QC]cUdtqs{qvbfUALka<*%(    +:7J_B(C:!2A4+ wXGL<&%]}.>iEELPTMAX %yegu =>;cmsqsdhZJc~j\^rqaHFHPXugexlqxscReldsb_^hV1 &-DFN87'@J=40.&:4;V\XL;:&mZe_D3DSOTTekq60mQJPf"# (/ nw{zdZ[|pkqrmmvdp|x||wwz&$8XW74-)33:65 %'>JOBNXG!&.&&(;\hbmtyl]YG2,9-3 4[J.@^l~yjU^qgCANVj  vvpZi mdn_C(&3, ~i`SPA8DQXc`ED861-=LTKHVmhHQ`Wdqxiyzuu /9;1:3 ! &77<Nb~ifxoOIJV^WWcgbmxgR1-$%8?GLFUBq~z|yqwiugfdxwwgnao    -3,#63>#  /@<(% $ uh  yfno}    'SrcWSN9=UV;$(-AMN>BSY?HW`ic@%$&,3<?=1 %%  /8AN? (6K@:@;<NQKC.))$'6SGIOQHTfdR`dGK]JH=% 2F07FMZ[QbvcciiTaJ35]mmlw\VRL2F\pgdkRHYO+(83(2868;AH<"<]XGOUdgUMVV\l|o~{Yg]OYV;"-#*:PGIXAEZbRbk^VnyimjcfjQRD/-995$1-AYsV7,zZ:6GVipsw_u|VP\bjrgyr{bG+  ;F87a)>WXF@F@LHJ`qY: +[pcC"Bah\ee|xv|rkalic`A2/%&19HYZcdaL<ETL0~lbnyn\; !%4B:*:AAM_ZK^JDDd} $*+,!5==2F<)G[<%7Jbwxny~]ZOSX_VTICTO-CuvvnOLTRAGAB-$'$0G. -HS3)1/LagpfU3|{rgzxtueUmvBiYEHGB;) 0-) taPLWv8IB0-'(84%) +JZ;=2 "-Gmy{mSNPSMVT^mZ; !;G\]ihp~{cPAD>)0lufppnR>9B^bP1 ()$9iqQMciX\I'O<>c{XPVWD-& #% */#3?;.#@Ukw{eVH/"1)0MXcfota>1784HH,,,%;8{\O<5@RfpuP?0*'3 3BcjJ9OQ. '+2!$2@Sp|x2Vmf`A# 2csn~l~nggpyfZozgjemmWW[iwggcH=\pol`kk[[}xef|l[K?$   #+.,1-%.*!   6D>&  /2%zqa\x o]lyzoz/'!$#BZb]VWL\u}hofTLPKCT[]NKffej\FQdxr ppEv`C&5P[>Kg_:+8?2'6:=HRMO_s &,;DBJepl[Wfr{zkraHD^yy{G-+&%090"@XSVUB/)&1@SUa~cH7 }o~}{hnprfisnW`B '!$&*Ioq\XJ2$#"%1(>`we,I4: !V|z[\cH.' '512593,1905MD66'wXCHE+vL,vfL8?0)=ktN/02 ~:& !999/0Wp~+;b_lkz#:FR_m%@TLPd{~~/  zZqYB1}|_3~QH5"1ren Eg38BM`a\e{5,"@qpSDf|zf<MPi 3)62(0:nKoH( wZT@m0(MLwIV] AUK|e;@D% 668\RA HPna0]lBD["hx^+X&2GujU3&'^I)f7~=^@{L*b$]5~m[,HwN%, m pm [< oXn=k}~5eT9k=Og[CY|=:>G1\) l 5  I j  | \  8 ; > gc|Nf|LW [')i ygp=3YS%0s3`C_ ociY=9.,fi>.2gl%wM.pA$mhY+/w,amx$ f  3 r ( N mLsF=,\ x U A  d  g  `%OOCPj/!{t&2{ez;$:j^ /$? 3 #'!i("6mt `K_Wk{qnh5+E|G$E!9H g F 4 Y p ,YvXP8<`T9 /NSRYNRcmfo!k U g  iTUie@%IEnE9z(dWOM qT4x7=9'@z__WO|Hhc}}tQh0kfp 'F  P  A x :IA987/0"3 "tl,\(8~ I  f5\60,gPZN vBU9B@ &>p u;1eGL]43;|q@4ih^iu\K@_ E z Z  )|PXpwvSu s|i1P7g  b  :Sh5 HDj"qyHUQ}WDdP-7x)I_ &$\M4:fubtmGuE+ b O 6  .[V3x6f`Z|Yb9HR$E{OAl/v+*JF$f]D  E w  } ION^r tv h[r o=qAC  TC..bdBA|$as[LP:6VVq#+ <7IPE#c % ~ L X:/S_yDFX(Qgh4jnj4 oH}>=* {( ;   I'NA6VZk$dI0FMo' ` a)$g`N)*c},  , ADmf8Kq}x*|jS)1`P'tuaTD#u ;C H g < (8%uR6_ `ArYG73mB"Ux5  Y _ k Im-yll'b V _rK4G 2iVB$UU!b{'@a<\Cu =|ISiB{@szp    \ $L24}[)\R6 R[[;6j&S`\] 1 y (  H[=S5W9q RT @fM4H>blA&-|>T?i;]J_Mo74cR{&Cc{Pu17>^7?\z U X ) (`'Jkt^a+y[NWz BO$=++_H{$|6  >  {>/?R"HpJn g[Nr# f 5VzH31yV {S00]Q1c\]YsXoAulk k 4  V 8Q>oQudO9JsT3UdNkx) *9 /  $ q &"oWx2LX!w4;.ub93Kn+9Yo= JN][ C =d2@S5a}O5J!?^lo_7 PB7 j : t ,XJ%{2~D_q 9HVt rC@x &~    xcR}SLJ+wWP"iZ--\x)U4#6f{*j< ">VD>a5Sw+/=Vm yU L , f_xVT+ %"ShLKw:$7 kHc>  N 3 V VrQ_a  tZaTZC II +vc@cgF)x| Zy\CR%K@{^lV F?HoHpE BJy v " Z $T&XadZ6Rf>'c<~  p  ?  tox[7;IQye~VE{9";`82{7.iv[O&kdiw=\X+%qH/5I77w 3  # P z.h3,_( Fg= Vv !><JW `e+n \ Y ( ' 2 c ?;#BI< H]FkaEmm+&<,BP31W[7hC0o7X1j|Wz$jreLI5o, JC p & 5  G?2c ~Y&TdO[dR|{ \]CsZ, A &z? y [Yj`hzRzAgZ{GhI-$ 7=kh_TuLzW+l.I?t 69igV!A/ I  s  e _}G=`IQUQfb[~Veg=  d ' Y @ ; NByw} J%* 5tn4`4[lE1U?`B3Gew%8;&*}>w*2?9& #_MyGi 0NxdVCC 2  f  ,0gblnYqf|UdbCC[5M)djgT3731 2  e . {BnQY 65{B^8 dPOkI@>ir `2k-*(d%\a' ^kE$0JWl^: ^t# -;Z(g P # y @[%Pnn4 E   5pguENvL ;  6 "\D zrI@wtP,gbrTkxY!o| &T>D?F *M @>b%GGT8+j-Q^a a)<-X.I 1 7 : d REO*^N<E F7 4tK;Y4 ) s    {aW8Y%XaCB87wS4.} &8N}i$vvY1&Gqaj/,$*bkyB 7 G/Rq <K1;j 9*'\[~PbghO | 7    t n =_Hv? 7mW=XoZO  R  0 f V%Lv:H[j jU,i,r)xKT?q#a${U-"}$M3SLNI>8!0y 2  S x(Ug9)[VB}hq4P5@\N"QI!HaL9:cIVh!==cx?mCM)` ~I^a.s@2HbP%S8,16U 9 E p  a y"&~ T   r } f <   J 9 Ya9VK:&]t8>fr<iBzJ znp0({}G"2=HGnSrQn,tP(xw ] (^IWHAFUhQr7EP(\.XR $ G  + ^ % f ) ` * o = B     2 ) nhcCWi9_6@5LTjLvJv!^57&!MgfGF >kh1za2)yT 4 D.B :x65G)$  sfUho,z ) U  R | x T 3  _ Q n n ` > $ ~r[jP6Gx<-grMhI/WrQreTgi{9((^b. Y%XrAB?n H3J rB<L`jI1*9J$x|0.yL  g { t m   cg>' ac9v3hbv*5'jqR#@yh3 q| U/\MFzkE ;& aO_D=iX ;Qiztv3h.0+}[: >>F9WZ%S I7%J)4B$#M>O`B}pXKx~W^  |i<"*6JBamY@bkA] {rULnlkyTLy XTaeW%OcM|0\ j| Q1.W(, |zk^M(tiEfV:{(<FGdM`493 5 ,  % 1 Z #   ] m m { A A | 0 Y  6 8 bH _/fq*K",L=@yQ%X|J&,)iGyg3W:[M _WSln%[TepCZtHKNF53{DsX*Vi~3H yiC=xD h d E  y H G } p ) - C  D " T X1Ynaq!,g8~Cnf k6^i\/wx(&ZI/jn@Pl{z]E)uH3bZSy>KgY#)z~E,/Owqx :/!\pvY/} d+ .)n   ? x J ^ E  ' t o l 9  gj2s0:Y>,\&Hb9!6g[]FNXT(nkqN#"$fk+n*c~ <6h86MW\hD`C}-IuC"g)gRoj uS`!<EC  8 2 E m h y ] x g D P K . /  > M &  .   XJ`p$yPcepYmv7O!M9B_fT[A @z}bYuHT2:XCR"^]!z Q\]S u}QdrXS;L (*3Li<8q"!H1"(0 rg>#HbL 5ASvqFihG hZ|lo'u+Kb 5aEqM]Jj  N + = s  8 -   s [ !  #  T*W@.AFr RmWgKyVtpP+ugb_?3,z2U6@Yg6-0%P1wf s  / r { g z o J < y q )   {sC=a\P9Q$IH.z9_Wt,&uq)Tq) 'iZCZlkSK'='K'zB+z3%RT4yn?y<_ uhS`xyZB.2*d]w)i(SxCjJGZ < Q F S O M G . - I I < H d [   ) l i H 7 B /  ! 0g \a&2Lf(rGU?[#5 1 F e  > k | B @ W H   z T L  rATH"Dv' ampRyE,b5}%q un*%hy:=2 v q!^:jmR! "l1Wy[5t4/!,(f0%R5D\o[*=@ -L{>?\:F6~Dlm A x  v o p b @ %  pejc`O@)Hk=^&,3C>&Q] &lM,.aIz8utpkFkJ=DsJ+4QmKN<&"^I2e?Ix>, .,'$-+% 3TUJ^} |6Z&4C}d*uq-P`8D:!l7uC ]e9Hk1 zX~=T! 7ri]1rCjasSe<=1nHs(8yL9-r< >RT4/O)Mdsj_@HXAc{;a $!D~ &   . l{NLG3xgN%2! :!, _  txY -\<pc_ZC%q|%A6o'#2?Gtwmy(nQp!l]uutyymF'3F|XlRZR 2>@Z]_pXW@jb V$ wBw     * / %  r[LCE2_2*UoK$d)C nc 5c#|S^ACgqHnEAZy?,k|P@]#4^2gfhHs:{X5|3(Jh\JLrx` #p=-gjk_89j+>FIQ^{@"|=='6PLOV<>3xbR''AC68k r:p^@%'`wr]W{lO)zog50eE.DBXN&q_Udb4WWv OiPZ>OF3]ZmATtT=&{l/0{G#!#hM\z|z\5* Wy -{mv+*qiN3P!/2T[+ !wL9/l, }rU0aN.fLx&]<0i&dtRN3dA w1T5qK9Iqy*=6_Eh{@!v2;~Y6uhzJ.d[i/$| Lv|}g_XK3 )wQ8 N& ["h$f$%G="0,3XO; /xO.W*qQ@ug{!,=qwcJ\sZv~Dywnynm(iEEBI;gX@:37MX9>=)r9u3pX|!u@-V7SB,zqDuz!@% tYBg0p*xxv D{gEb(drd b@?,r$Q"uQ;K_E4 zZ,^^% 2B)T$j}YcP7<_ I~xub@X"Cy]"Om9@|_+|RV[C(U]w4oR[?woy`_zdG8 abrSag\j &Wt]? YE9x  }lZMp'c }Y%wZ2oM- #% !">vnXS2A}0tKj+'sf{LM0 _4+4R$~2H"Sqq?sZj@i~z$td:<?j[rn?+19mtpY5$6BvCr4@Y|X*~@wcI4@,!! j^=Rb(r8'8>5<<Pym&N>.>We#j+p N,wvpnz6fj8 .*Vac5r G&4&lM(vh)"{ZFCDHMuyr=x= }_< [ '@<L5LmRQP' #A\aH _/mL8(|AVKy@>4h/d$lG#kKkyY.k6+9jDfG91bO)'qm< 6M%a:r\<]j.~q}]VLNN.%706k7^~LNIQmN0(Y }a]FPM@ooJ&b;=MI63G[k_QwL iiT+_wn%=m1@xH+B4:d!J@fe'[[pw0 z{`8sPS#b}wx4|-Mzm0clH YJ;W6RN {^O2m.s(Lkbo528`a o!M@9I: WL/+"O/S=R|B'@. n^`_RRK@J?;{;%MMf JY*0)C2s/ ltT/O[5!aDholq40_Zz/#R%M#& S9:3Bl8n-4#m01/'6{`e)Q;8c4!p$zfHe0h?WN=`O}Z%HEKsQ:h,|Df[gO-p$m~Y_a8M@NW!1jU|aBT3]`3rsX U2"pboH(4R\$pVAUB\fE=#K Iz.3A9zmSLY6m3^jRU{~cA8ih> [tT$`#wpxRCT:v(bm \57#P' GBEh)_Q;}@A;=i(z'zC ZHI[oo|yM.>:3_gCQ(Z](X`i(;'%*7c^fR[tJWyr^hsB-iR> -@}kOa1sxYp(~]Km\lbE:\< D~R ."-p,SVsDcd._KEF5:= b /6{t3V&"-UD6@, 4T|6ZT@PFH y#U9= km+* e1{\:lp[B8=_+@. su)%lKY@ N0z,hB2|ZC3h0~a7-< 5DS.X0q~KIA!.g-OR!u@fch7` c0|zFp,[_SH[>Q"ql`B-&-/o@A& u5VRYqw^/3$TIx,Wy%|w1Nzk7%%ojcc {BOu&o @^F+ICDp:~tmpNC)y0f>/Mey7 y& fJr?{|FPI%,(/.\6@bO`?7s0~}UOR ] r;>6BO XbQ l4kJ xBvjN@6N*fo-;*Q>oau!z8uQ + {"AQ W"cGu)VsD* > J v k G T \ u ? F X   "   vHV-#n(Q{F1/>A1o_/y;o,'v K>D&R]u%,W @1U9==EEe9^UH_RMwujL "Bc-7R_<?P'._!x>LoRWQ j  7 d m ~ " _ m O , 0 _ ;  rH:M0O6IIYEB#>_k@l{8 eEZzaqR /h  $Zo-;~! VQpK+)$ w^E5nD{DVxPkq!j8pNf>k{7E F   = F 7 ; O % ~ 2  W   iA2<dn'NZ%fU`TV a92jvW^yr>/SHP_H)k=(F*6Xn}IK\,M{ml6"=vwgxlg&PSd)A;C)I$c b S 1   G g Y X r N  c Q H ;  ? q x j h k U L W ~B7@T m+l[,#IC@w4`I"-uaueYtnxgL>C}m|42*m  aO?_F 5vk)NOWZGXomUYt?dy+:e!A$Bi\ a  X a  z $ e { a V V 0 G  1 c *  Zu+[$g[2U`+vack ox|hD=r{- m+>zY3zy4uO:YF 102FbGAP=Z\g[aj,x*Etwq!x ~ M   H T U { R #   } 8  7 F\-i[4z <\>mY< &>Q(~%~WA<$Qk]\_M|!pDvV92Zv-f XnM,twi{k+ N!%,YO_)X6 8gG={\J z / 1  > e A  z } v 2 1 D S o E m > * - gO-}9soqIb>IS5s&W0$ywz9c3;HV"XEIjF:TYKi 9W !CtICG LViK&t*6~ h  2 G Z J  0 N Y  } J ' q 5  " vFQ]!rC!`c8@fuo+Avl`Y j}pS<5 J >dTS,oC0nB,V8P[XRKg`yl(4bkqPLEg|>~<>PDFi!iWD 9 O {    O o \ f \ V { z t _ g - z 4 . A=Q b |Nr5A7(81]J`$x_?%1W> mLmy^0hCnAymNU(xO<: &\dKYP7=zjLT/Ln B I & ` v  X { s *  <  { u o _ 6 S~R"w9j$y|O,;Z^')cd s2"|)9>_sV|'v~)dk+ mm]7PeANPTrW`wikn;47 272A4!Jnw @2)Mj!cCL <Ed X ; ] d ^ W Q + p Z G q t  5g)  |g[|zX&Yj"QJ\p\.8pIDh&D^"P^i_(/7l@/''B1x8]83)0fkS|-:M? m $ ; { ~ f " w D j . 4  V@2i~eEeZNIMz8xt72ifR&sY8b8HnKx_ O0}!unfpeC4;PlMBS%59F'l#7V#~' Pp w } c X  P ? I o  ^ N U  { R  J   '  3K%has*?FwoTX< @^tgni]d] IAB^)RLA|ICz'^i4VvJ*>&5AZw<in}MhRa  b ,  $  1 $  5 W  -  S  !    zCt1r4 \5|o%doOza1RK/FEv_'y /[M:JkjD'Dnj=I|jw<4 R5%j;f?RW}47d:  + s b @ ' / + A E R T  +qa9rE%/:N>1#Si.s}l(vrVbL+|0sqV!Hbo9<'W:Up8bEUEae[NV5 J*~'%G4Mn' 6  < \ v | 5 @ ; + B  6 j V <  9/N[@w}%COR {O#{qyE@yHl &s4tJUhqQ96w.%wU ]Cplj7YRn~dJ3 hdE%!<,H}5:7k0U$Hj%{2 s ]    # * 4 E $  ! U> |9hG8ZCz"J8j.JUB! u%_liq5;jZgkaLcLE}Rwj@`k/Ut/XkH &2w9 bvr@l![~Xo$wB m   A b % m I  cXBG!2' 0 s) gV`?3'[1 oXiVlG4 n(d3@g8*o+^F8RXp(p L{.a5<r />.0 YI hJUS5PTK-]^6$ 6 P   { 7 #  _@y)>Sa2U1?|'T w GT*3BrRHfJ)[3SStsRs%JI)P'TRJ4>0tjeje1NKwk\Ow_WvWnel[8L@7"+#l4)c-te6dj\4 E ] m  W $ X,B#rR;h::t?zn?7h60 D*[:U>ocWj+QN#~ub:NH&P|Hf iyxmwI#o(Ap ~fL4crude{|Ob|[ouPi8CQ.&vEswR `XuVLc| X {5o#,#f vXh \qVX)'$FIK';Sm!P:X"Z`Q2yXWE )1^OWn_rmdY4_y$;+V#8i#?WP56@3~`{fK%sCJS/9C]-:D\[0 kG{6\CE%md> 42mB:@G|W!y"Fr"{K^ZG @HvJ=@QA3vA *5oiL5/d;Jm'dFqGKP?PJ\hZh=r*Eb T8?;s>s#"<66\nP`v:-(|P**q{mbkg;75 0\|sD^8f>jKq[;G#k0ZsSdiXM3xg? tZxfxpD~t@EEn)g)&'Mao!j'd4Z{?_~ "Srxgkyh-j|~tz\o;w#""wLF5avD~^]""G p/)hE0mo#V _6[jwr- IfV~{;DHUdyG`W *S&-5|vf4?Kw@X;'9oQ~\lU'KzoE;T~lMZ~[74A=`MWa"Ih%S=>]|a&=x"4xfp :lnjw.6M\Fmz[)r9D_*I!(n Of^[qX])W?vXLn}hgK (O[_{kl g{-Zp 9 hmct|}_,';O/1"]EK>AUnn78H'(HOO9i} )dd ^Fw|t>%/Q+l:IF?J9s3;:JO :O&nFFQky9cFO>%X",.b$W 4@g2a\}c]JKJP_9cmn@V=Lx; *U"9b71qjo}Q%~xk @Be=~|c!3e}eC9rB;2)i_iznM2 5R6.OT.>XYRv-mZwNVK&"J , LnB"V( pX1d/#yR ~N$49b5  (*1d'.{#alZ5i4dS`iAe6)N2?Er&.:BHA*x{gB-'0}O3|])fB ygQ;'&,sqog>3:TYAd7+S}L|Eb1O!& K,v(gy /\fT{k/I *Y\APYB5etX2#/. -*! fG@N2*(p\5Pd`d,;fof& :$taFvRfl3O{W#N]OQe}pa)=,<\drFh`i!cwy;B4AZJ?2,M&ML!![=c6SWAs9x t^/qN# u<vZY$"Lo.' :af1TV W+ Dw i){gT8.hzsZ.:[QHL= !GK*-! 6t&v /T}T,Hrx\\CwoW\J/*wUC2 rUG"{ eX2U xN)ohfXqodZMXF8m>9[NHOXi` ipuWO="kbjRQy~qQAWSDbirxpt{~zvyeGIP,.KH>TYx;^YP]r`^~ :XTy6F]v 8Y_\"Xcl)FFFXUdopg\O8)3?$_kn@2==:57IA3,:)iq|qZB*wstpU1 kL'%>`WF[bI<  *;/)0/% 6B6-PI8Oxsf[U[nuTEA9*/>R[v  (:, !-9JfaTh ^\aJ[J$),=OE;6'%/.86!5_T[`H3PjsiQ,#*7DA_wwg+#9%#<L>)10 +:BAB81KqphbOW[A4>&v|vgG'.F;')).F\SWUJVp~q~lWgdVY~ ?CAZhb\t891  '*,3]U$?;(8_NQb^g|zelT@0  {wu_cuhouG HW9-:1! *12GOglgy}rdQJ@.1ZLGfsv 8CNVShuaPT/ }'-.#&Blxt}om! wrr`cziXS]`dnhXJDA0" &+&!N[N\tnccY1rpkP776))DC1 *%  **+(;Tkauq`MZh0Yn{ssowpZemh}wxl`8/@>!#!(OegZicTI:&"BmkWI?od]SS8!'5BRZZg`EKXF:BLeXSNBVt~wzI8CYXQRi (O\h}iE;B=GadF8*yODWhw~!$.=GRLYgfX>"-'+ 5,<GZ_WTa_S]_RBN`J50(" >[sxgH.%?>5)7EQG:DXzxR=--&(#"6INE2 4FIPp}( vip_B9?;3/3?FKF6=RPE2jkpfVLMC$("*BW]VPR@-  @V[[OI75 ",/@IG^hox{m`]r 8MZkpdaZYhligolgynjhty~|zwkt}q}v}czpafntv~{wy|\6/2,,*(# 3/  !vkw *6='?_KJbeZPLKYLcprphgV1(<QUH>5*&% :@LYJ"-87LXM6#0?4/(8>EHRS;'*$-<@#  `PQ\kv|  3_usvtaYF6*&   ,&$(3CTtm[VF+ B,"EYrrnm~uhbYC<1425;< 3C>csieaePMN\SSg\AATL@50"  &, 4<H:'(/D\yx_Q]WC>6( &?WTYubx||^8h_dy{yQ% 69  ' HZ??P[`_VVY]LI[t|oggh~x'NQ_mdU51FI&3CQd{   !>98E6'!)66D[_PhkQE  (4+,."#72tWI@B;;@4*43|cb}tXYfdVL/ "?5RbjbZ>5HL'(-/++$!)1@t 249;C@IncZ]eo}nM:EBCNF%& &$7KF101?1%=]n{gkh[Yfnwi^[YZiV==<>PJJZaU`r[J:;JGLRC  +AF)  $9#!4@KRK[^]YlorpQITN8,)&!1/*=&  ;B>2),OQNK5.,&,9>/#;:91'.:5Cjn\D ##!/0$4E>/# t]fhOI@++<822VaB04Hk}mKUkXdhZRceM5?F(*! }h[eZL<-)<4/=QZNQhbNBPOM6'!$/&$AUbtn[haLKT7'Ccx'?IOGDVdbuwXO`loevK>?IXn  -#!/ ( qr[0  ! {rpgjto^J`}eq{I1:G9* +((@,'++ %MTYfaPik_bq}sTi}  #<A0@%8L1 /I:-)"06$&BBAWs^\UF%/04987N^Z^a[c\DGlxiggM:9<146WhJ,3) 'LSEUqrgaXZxeo}~V;]O:@D=[gQ3"./(DSV6~{a" 'IB%)#& .(?JH7.*#"A]O3.=R\ghtwyz}|';)52weM11.4D_RELHJLP`gij^B"n[gr~MThbXbN=P_Q=>)+$8HACDA1JPbsx~{rz=+ *=;0)   =Gl}yw !+8*& ^I5)F[^oj^jA11K3"F4 .- @RWQH1) ,2#),H>>O\OHFM,}~gPbyquzWYP>(+0-   4[hflqTIbmVGRTL2+#,&2ESIOghbNkwy{{p 2F\nyhnuponuv{{h{  )1  #bTml`QQC?FGPje`^ks|{xeOkrePPOD/'.'"!-"*C1 ) '*&  /%oU4$7NhkttS% '0?Wm{bR_{rdB ynpt%=>=ENH90@B@ 8cmUUeep!   -W~}Z/#0DJv &9T^S) -*ortqqmdx)2*v^<27"0C0*9@,{rvR.9aq|U>>-11#'2Rv"6FOKJYT|+GU]Za< zg\u!4[}ul}vPFKCANZM3!) 1>0;S4!-4,'34XQ#%:2',%&2;ERNA/'!17=Ic^@ ;OPNC*  '*9C0<`t{QUogK#;[QOZU*! ?tkaUB&/SSL8;=C@" 5 +:?19AN[bSDM`Y4 xf`nup gmchess-0.29.6.3/data/sound/6.wav000066400000000000000000002542641323660377300163560ustar00rootroot00000000000000RIFFXWAVEfmt DXdataXml]t[dzzbDLRKD9 79%"KR]ilhiL  yomrcK03OZisu&5\xp8 'ND>Kkzzq{|zk\_g}}jR6**%#AcmK1  v^QG3(1@_o |kcmulm$HXoZVd<->NYM& !6Q]Y`{YX[H4=Wtmly]VhfGEQQmw\ytgL)1</#*D7 823Pc[Z]bZ]TB+,4.82*".5/'k9$5?Y}au{dkvrjXX\KbpscX)CIFGZQQNN_M5F<;GL4>[_hudV>#%8Q^uuZdZVSoynwkXQB6AFB0'" ;WI;489F]J8 {kv}oklhf{p~j[\^\KOB18Ohk||n`y{z{qQZ :H\X0*#7=@8KFGRmtefmYOIA*yoebV`t}jqpYNF6KXOCOK=2"!(,73'3&(:dh\E38IQB6339%3/ |uqrz||r^N(77NV+ +*/;/:JC9+)54MXD&FmxX[`ZX]l{*$Ibd_OSVB7DL=C=4Dfg_`YD5EXKJMFIjneb[_~~klxhi{}GOD #)/#(, {<% ]COF<=khSM!|{7b{rjqkoT_v|{^OXgTEC@=Kh}m]WJNdm{leN[r "  [i~- # $ %"  ">CYre018KI"1LYww}{x(8Xa\UXX?'5&$dipfwqm~uG (#=I $)A0.0);FCM< s|w~uO>TT9;.'=WZVsx``Sdnj|1=\Y?0&   %* &*64,#0Hj <(yvj73TWRg}nXnnWNO1$)?=)5=BHk 5A\fof@gRC9 @u olvP4( .E]\i|e]ja))B$)/:RLLQagUPTNF5 5&#)<aecOcn}yhZ^T=8 )   :Q94OQDvv (@,*# sf^fJ/)" ;VRtygZUn~[+"/7I<.BH.'56;_uig^MKNKThV>Hb`eXU]l %$) %H]bq}g_mso|DBE[`J_nbhyl`kT(6W_u}`823zw`}{k>G]_\WI0,OGLr{[@5qS:7$0KeZJYesrodGC\~zwvkxlZnvqu^SJ71AE?@/7F;33A;B;F]WU~~upP=HA$01+//*6C=Wlb[`D/;9}v{|}onXJRYLIjulUPefS%Aod4/9Q_s~kX4*(5VSNkcL>/%- Myyy!-   Dck^_^F?HHDOQ=01>FIMYrninuomy%!#!no]ETC)',&)!)((%,:gkpxqsm|\=/ {pfahqsn\f]kuztahw]mz>UZptifmP+v| ) 5NuklhCNdVE0>Obwn\MMJ<&1* 62*BC3<4]^drja/=1  , #2I^hjhn{upaltvtuzlONVH'&G]ba\W^]^ZN;43AFD<GW`{~^S>+7<, {JPRezkgoM=DaYd #G\h^D.c{zgT`[Q\YJ60(+_lhwq`qrJ'n`SBJUZe +HUB &/?TTe|WI:" %("0IU70   gTbuic[TSdrxszm[ZJ9./ *]ys^JD(.0+Qr~u}y`jFZOS`NM?56Ffkp jkl^;93EdolxsxI'!/$,?94$'9%u}~}n`\isjkvou~|tcK++/U]RPgjkjyy"HhT507=UR.Nsusl`P\`H!'AKbquosbE9((-82**:EOi`iuQQQF4#MSQamoUTfmg^KA'/=7@Q2 ~hI& >Ih} 7@MYgpqaff`a~|xoSML;Icu   -6$bT: "%MdZZq^<9?~uzmUIG20:>FDHZ{~}t{voT, .C]mhp}wmZQS=%);\{{hac"2/GWdk}nbcfaxh\I/ 5D^{y\G;2'+-&7=3*.<0)$#*+%(,5Kg~{gX<#&050,=2,!( "H?%"4* *5AE8# {r 'kE(AVLX{|c_nye\E-('6DKXfq~hsjYPfrXNUvXG-'/QM_v$:=:/,Ic[Ydsuwinpz~smf^WIKM\imio~wu-IO* #4JG4QMETY5sua`gso~tZ\]2  XAHP_gvxw?39HH^V2">;& 5L?";WhqzmG  !,&DfO>Ka^||'' "0-16VYWOJDGLKC?7_}RIap,+"3/2,,-$"w~xeV=  "tWff^tlZny[WcgYXRGG:' !";=:5>5(5% + /9K^^^sspw~/D528BSdeG(4:B6$32-;@E=<=DFe||wy|zytfD>NZ62;12GD9P\skUWamxk_ps\LZfqIP\__\E=ZeS?,",6L]ygFFVJ#sH%"(Cff *'~ (2399,&!  $,FE?XeUZ~\PD/7]ZV[[XWqsq{|n`W_olQ>ydbkrko~eTkd]R99;86J]J:CA7DYUcrQ+ *Kkn_5451-V\V_iWk$AVdhO;8HKA,1-B9ECLNP`iZB'#%3CbtcidUIPCFE:4CZxql}eQSMFLdJ=A4 "AXL$/7?"&5+$'&  "BC9"02""%',96# 36GgtaUVJ'"46:4/zo}x %20GW_foeTOJHL0#*6%0/1=?2/: %C]^S_{{nihwRG7  *Jn{[Z_j^didbZDZyyx{mZnurxpF3=C#"'1znv|  A_YP]K  ,@7$(;?-=@'&$ $/8/ /J<$7D* 3.*8<A**().0$% rjghp\RPO6.F5$7D_wxsqq`VapkxD51JXc{|0OR_fWO[^iy|ZCKXdtnfhz{~{jb`6)(?isUPeknc[XaeorswzdTNTLb_OXkaU\XTSmfG, ?^[PU`ZjxcPKFE<?<#qdefiktxvzkrud_:$Mdacn|{rvlgt}}t`ZQibeYEA\`P@=LGS]j yks  !".8." ?@HW]`g^YXabkuzrlkvxs}wodcedny}f^KUVA%-MieRUbH\ps\eeA)$8@2' jSe "<:"!$,/48=7 LRJc{vgPOueE<((8I959IO_SIbs]D7,(A?D6#$9?,  '@Z>/NPMcry|eJ>F867>S^J$212;C1+"AECReaqthQ>ITC?;C5-:>)!!   $0D wsgJCW}vt`\]Q?*&'#"),7C[\N;/4PL@Weldar<KTYR7+$%2%%BDIf{jw|ol^v$-+vmfca%/Om|sg@(%- )+"1%zqkTHB7-.%) !.:DA+(A. $%##:0+1?Oez~zweF=CJFVk'3.C[WLJBYxwlmx|jH3JR[oX=# #*853;Xixpk_I<Tf`XFA5HXlzu_`ov~}o  o~sEhro_D9CTtynlvm\gv~oNg|M".?^i}zehty{o]`ghzw|lUn|  +Qd_aH*(B_jsw "'0\VXd{po]:szMHA4vL.%*026)  28Hrkrwm|~wly(LB*70&,( '9* 7ISbiH*  vz |'TiokzW;1) '+9Rk~rb|j|j-/VbIWdnzuZS)  sgo}wmqsyoXOGB<*"":EFLdyjtz:fuaO?&'+?xmibbkrnx{OXmb%  ukUXni768YA$5 F.@p- 1+z0>;k"5F/;%:8_gW:xW|QPGSf#4k'%SR08%/-+Y.Z*.CI ^7Ou[*1%]F[O=q|4j$;l;}e*NBKL/Ow6 LScNFMW5n{ D0E 5Jt ->B=3~["<YItkIi6*^w8r6Km+FHpQq-KJZE-8YJ1m%`U0sq_'m<!xuL9pv,{+831%P9&  G>;lqp/e]aa +"N}5Ovv ZHCU[z:rXtcB:E)r7_z]}TJ.uzt/{C6 I?}DFKM+AA}&3 3C"#>p7<7,&JRIMV'z:" *%# .U hK|;69ib}V  F4'zd &4Z!(SDLW\} wiGgE+7hT)?F jm?T4/O\x3T-}]d H4@k  T Q H }c +7e|y]vPP`f&ZxAF,W84zh;vHdz<,s3pa JC*;^"._gU~i|K(''\hqrTQuXmk c@uG6 ( _7=s#tU:5R,a(,jmy]o|Jg[d % J Q I!"2CVC:\_.c2[_ MR.d,T,4Axw8Vq9|vF'5#` I o 0 M w R 1XK`28@Pf'd|& z[q1Qph/H^9=z Mv"G

0f5 &V / R # (  o z F  c\nGh+8% ]f[{rbXTXQNiRx /9:x/!U,;bOd8u8m $I~  O t s ` p  H4O'x,#p Mv|ICxH\(?%GqbV'UvCvruaIKi!=Xqw2  ( } " ` WUL v ) ta -k WaYQ7%2iKjR:hr|<" u.a!wS =^2DO8 qCTa %cPr  " |    _ o 0 wEU`q+S2N+- m:1*IZ!p< ] 3s J{EGuQnF&WKS <f fy \" A] , Y etL,CNC#:%Akmm85it`Lrx;N*,T&ND P3 X]v`vN X ? A } u ok  <#nLzN#  zTZ^i&q "cebH6Ltm%OF&0j"> P)D-\)S 70  ` W  xW-Yn-  | ?l: 3# o Kf}x[ DC9P -AC}"#36t>U? f<` C 6 j:" ; Y / Xp] c ` | { D]J1eRWd>uu6 ? JF$JR>,/o,SlmJ^Pd_ ? + t 3 ny5 5  o /)  I " G  ' -o P-u x N"y`d@P;s\WvkviPGqWy _v _'w25 Z c:;B# VII uUv  ch_ .av TZi9_=53&T`xB7 "AHw%:UA7 rkj% uXmm\w  ! 4 B/wG hL-k e b ] fGi;|  FreSzz_La )8^ H#G^k $|R9jA' a E+3 j R7 z H V e ]"^ x  |  fuRjn @ ]> B2_VXEy #. @xWX_5],4(Fb   ,AMi B 8 h =dG 6a 8 :  Pi72B \gXM_@NaPo0,Z{Um` rKB 2iA ) E`$q. O ` b %2@ ! xNU + < [ K2) usA: =t =m@ Xz  3egOIhk g AfdXGK  (  ~-+ N<4/ # {,W Wc W#D4g # TE} 'b%v<}B'te O &!I `Z  ` D  > K F z h K7/ { <^{B6 wci%`cjl.xQ`_6=Z} Y~* g0  9 [ X  9 #  H 4 1Jhbo8iUTS GB1m'b^':\#L8Q-nQ0YzTn7bE~ e % uA  } 7 \Aj l b  ( %Kv , VlvU |0KMkWE] [s1rkRJo$ !Hpcc \r! h2 6 \a6B= n i { W F b & Q dSl=J5d2 bL `4 MRIW(G`ykz~w C %0 1sXHV4 42n h q  t$@ Cn.:>sl `9'6 =8Y$`P5k-UU4 6mM?o>@i7 0N g m" B7 < + m / h  S4_\ \ ulbdRsU:y5 w=gZ}R+f-c6CIk _ A/[ZbnaZ  d QNl/ < 0(n igW} a T e XIR 3c 0 SeDvD@RV6+!+` >t`^Gv%W>)?$ IQo` #l~W f TP   :<sr AU5$?7M3k4 >\[u)!I;z#h<bUkOeIt5PL cK Lm i  {A | 1 Ou  SNXX4SZlz l) ],E*' N^~]ruQ E aD7 7+\ N '  " by N0^#  < W X7 @ g 8Dy8V8zW3U  Agr,aH$_X H_e2Q?;M9GC S ;4N# F ab D $ ? k ,* 8 8~am o 0ml>Y   A9 ܢ<nd8Wy30 _!8x^A?#U* c ,o|9RC[0u{ >G/ 5f4 M lxt ]<I r ;}" =NM܂]U> E7k@ #=e$dMgTO+. ;UR' 1 - Vr:&e@LZ xY^F9J h  `d8' K $ c7HA ;](x6ܥG=s K= la<I e- g & 4 e G"" q  $QR`  T  HCD9 | 6)-:@Kq5*c0M[Vc  2?\.8p] n.`^%d]J W!8Sk , z  3 \ +P A + 5.+XwB[% ah1x1"OF }30ctbwbUU*  5;7HN"+lz xC ^  v  ("#4 g %,pmRH Ru B3X P1 /Kiz#p iK [ aT.bM  rH0R&7oe, >KE %  XN G v  8KF' y  +G24+/;1 -xG/m3!)^ ?#[U@ h IR }5?]_Ay (0  z )  Da) - #XU}d 8v.`j[` % Q]j~_~6  Yi bX /#u RN<Di S_Z K v f3~A0aHm= > \~Z#kfk|pYa>BI  @ lS*Ps- Gx ? F Ph1u `   Ed R %Bz \qmoo{5 !p`;c]O Uk^p'C s oeK j^ |  yq Qr w=K bOx \K _W AgG ?*P{U qz? F(& 9<.ϳ5  g9 #Xn \ k IC. j9M5M: K F 7 T  )^Y Qޠݺ.4\^[KMآʡܠ  @2 D D "b} Y}J" \*(Q*;2-'$m9J h|3 $ui 3 2 QTZ 'H < 4 }Lݥ cF5,5b  3X X yAV ?D)mq[- Q@  X X"2Xb v (> HJX 5 Z#  j 8hgܨa2TbZ֮z}$y˭ޔ6o&}:R׳W޲ͱүH% 8   (#k+Ih"C]e w A?mIGmg{41;,l   -p{we/)%='8)~*$ $Y "e i|Pˀ˜?!ߎ|Pϱե#% J$m'+=&o i" v%cb} H1$V {  D]S%H()*n&O"!7 Q[UGNˣnڸАШ(*9B^ٲxqHi %+2-'"!$]W% ` rj~]U)[V 2Y r!1'&)/( O\:kF^HFˁa\߄ۦЕёԉ"T׭*U ,\QKw &0+.I+$g#$de \(N[rs!/%ݔ݋ڲCc1B3 f: V( P&IGf"u")$&-(%l=kQa8AYJބ υtu[ߩL  Q? (./(%%UlY 1 X^>3|UlE{"' X P s!>w" +&x&|DQQ? G_X̮#%@۩}͚Η$enjtJ )B })4|-%' @E }nx< @:LY3`ߍ܋EOJx0X a`k<   5 + ;8,J! "X  EgƁ;֌'ח{bֺOhpry}  f^U%37s10/*!4]Y{-Kq&7 g[z>U  >\(" | XA -k? OԚfg~[.V@+ : p(5 /024++%& ggi {%\jnP}M, S+Ak u$L$'$`.4')'I > lOf( ໢{Ư̤wrʻ]]y]% f!\!++/6*j(#E޶7RjOU4N!8UrB>#*)Z&$ $]!pkd  @  _ B L , ƁȨ5,ɽF ͭV3 * $,(   BDD'G)&N*&2:& M ݲlѢhͧ}5;~Ui< V' C f>&2'e)|-K*%]$B"/ pKp E 3W'iv  mɤzͤЮmkLj\ VY #09222.# a < 6 K>΅MŜmm9ɫ^ @ M$Z,e g : Q[ $"7""U#E!-"ng\6$ICLGrJ?QASгӌb=ʐþҮE4&Ja#/640)Xr! a <c> -#!̉Ȳǹ|өV2'v 1e$ c>fOFU] ^+7 / iWCn\F+|J6վxuL1  |!I)+5r:4%/B&yq#C 8$N8\_ވTimvcоؾZL#g'&~*%#<wUdL ` k#/>>Vc۪6Jrֈ::٭\W2 "(,3j1' H x X 7N/*ۗݎ|͕נZb G W(((}'r 1 x ;``Z <}\#t{?pPd<,o"b?@ D$'+1-&, qqP!7O7zlwܮ wPɸX܄|/$_('A)>$=RuSRM JLJ#! ? vv A 4 :>:v$T1Ee/e >G K"fO U?7#_/2.),"yY 7:9"P޵G8+۹։'#+6 b((+g,5(%&$Q!P  |,ZL 5 \)Z < t  < @ R_  !:/ ;Kz2d8uGb"eVhS R'+)(Q" b_GF^( )Z[o/<'YE_"g)(+'&#{ P.  oin%   ) E8l4MU3$kdi IY!!)'  qz[L!30Aoףط  i& &&(&6"2  u2H-*vM&A  , cETtW;$YJH-cڔ:D $@0,("Tw ?SXrY(J Zo^ށ&r;C!'% %$!!!  NL+8 WS s (cqg X Hf!Dl ߻ l:w~W& &#Y b $[!h+("ba; Z[޾Pu "$&$ #I>JFPs0RH,K~Bu 8M 5  j n4%U RAEeC8?U&p@ #gxn U%%!?uWKPtxc&w =_.1a6 6  +[goFJj9]t  m  O LiY Y \ j]~zlG&1۠yT#^ ys> HijDzjWM]XTC G _yepz $X= &<k(}0*z  oph8wOZz{2IO `-Q N.[M%1OM'FtzH v B p sBR e w5_KR5ANF f\j S ` J  hR&;|woߔݘِ;Q &{M/+Ae ^_Q Z_!w%N#Z Zv z~H1 nx,&4e  t 1m܍ٜ߬Oڍۓߊ' 5 B$%D% [~aY )3qzruWgD-~ e3D  M ##Z AYD7  < ) !$[ ' *  'f^ܢUl(i9Q :x F&'&~$[{WA @ [KS!QtL"MJ5wO 6 "  xj|%Wdn9S$9c 3b Fdb?.a :l G ) yXvbh: ދ9}7q $0!L$!ne q5, gEi ;(UH=c^8pI*JFR  fn\utl Ue Sx>V^gVc m V 2vY t  ~-z? an8C$%1Fz0 T{X1-W,~y@r o |+ 3{ 04Aqrz+[K v, t+TK`xqKCAb Nc!9,w ms1rk`:f$SUTJqm 7e{ gY ,"W F@ J 3:  9 ?{-bp֓w+U},o | {& ;# Q7lnSpZ t; DiyMVj I $! BLxIfC A$vY.@ x.W?jEw*z')-)%'# w+ #?vOe(*||C>*'3 [i,~ fk+Gd E E0!: GR&:'+"N$&))'&H#p z"p K ´#v͚Ex>$)1a2/-z*(('&" k%w7T }i#.Q]{'u)J=8 A n8^ l"u 5} $<8p`9CpT`E Y$%.0..D,'&7$0 I+;p0ԶͩļyȪQ}CAY$,C0/0442B5 5C-&!Ohm$/BiTppxf}L4*{[QX%TS n P StC3Nq  2Frqgjkp  5$ ) ,`./N0.,,*8&KI*kXkΏŁ-ڮ0K E&-..&/=/001/3(=!Zayw;j~Pعoewl|iA 9 Ts3CnO% : 1*dD ;*C`IY U #!g"$((.'0(H)F(z&I& %G -@w..ńgiEk6 C%(E(*-F-R/2}30 ,2'X &  ޞݖ77zLZ&G QWs)S|U.o7!a : &srND  <89 + ZC*"k%$&(''((H%dy^y܅Bv8ÆvBؚ^vK$#&')$,g,,.V+X#"(aL$kPm!`0a1u0Q DKsPkB M 3/pS4 P,YMv 6"=b ezk"%'c((P)'%() "~K1ވ׎Ϭw%P]] { "%'&;&]'(%!s0 w6xOE+|Y:occxLX9x m#`+/on G<aS dcGJSr+ ( &'&(')'(('&0!Gv7q@{?׊ν6Ϟ ܱ7gXm-I9 & "!C : h$^gD bC+1x1AEp*q[\p0q Z , i|/s@Ybn %P(4q/1u6: /!"%{&d')))'&%s dnb q8K:2.׌tU;$U1]x{"$Y%%!OybJ DgyKJMZd "lq P9L Ob_jz  9Cu+; { u M"&|('()\*)('&$  ! yPMجѷЋi8%Ax  & ,#$U&B%@ bKlH%:tvfD08 @K ImYQ,u4 (i0w fH+MG68i c7( !S&`,--..t)0&y%<"[ fI {34iݎfRʗYɷ 3 %wO Vke6 %(*@,Z)$!2BgyK ^+!),~iCݏݪPM(H6U #<! s;}($/CeS!mBRji',:,-/d-,+g)''%'%"6;N -kPG^` sl0(R o !0"H! =E 1 ) Am Rau/3_THGz,;|fMQ e-  d8XV]DaZ >z+9V #(u*@*E)'!%#" Uw =5ٓ׊FڽwQ*, 0cR8 hh J 5{qS]3>ji_:6kv+dl8Nq O+B b|<`/s(W# "8 !"i$' +*H()d($#!qn, #u.m[,CV [B(4 _L>D$( +,#-,=+'3#=_, N{@#N=]ژ;$yj,\.|@J_!s d; O   !KPI.4EFLu + \q$'+/346X77.8764Z2//,&"R[x- %4dfm޵qwvΗϏף!߲ =nD !$)#,-!2432/(_"A a ' 0β̧'EDܭ4~ GL   x  " &#&Fe<.a9b 2nM@#G*.2Q7;v==>r>=;:9f7 3 0|-'M( Z+=d՞Zͻ̚a! y!kۡޥ\s= kF"&)S+/s34y553/-(v"Y ']p@ Ղ>G,@ČaWR}L q93dIA > '72(QP)j } e)<{W kP| 1#*/27:<=>>?AA@@>?p;86R3=.)'#O(P )p4w&%޼Dfȗ˙c;.C8#' .49:7mj|C:$HSZi$)-41(7: ;89V50.,($`!*0 y2neߓ4rƦE~ܸ޼cƙǧܲeit8"Z*2#7>9->K>M@>;;::6+2/-) #vu 6[߀۩A +q۾ ʯϩ)ܰ H!Y+025:z=<:850.- '(%/ ^&~:=lT鶱A VÊhRbg's_q $} | su5!D1sb5N#J >{bc#'p)+j0l457K::8 8730.O,(#=  yET0Lݫ,V6HXJ tҎ Vn{''0^34/9<;s751,B+O*%C rPiԐͰyƴ۵!3+/>0f5;<985d1.5,i)#es #ܡۣVϕ.,ȸZ;f'ՔbۘHp  #TI%Ii# 0!!!a0= )%s%tC Xu* b!"Y%),-k/U1292 1Y0.I+z))% yuR } OUpz^~>{7ե[R[iϾխxw N (o/258o98t5430;-E++&  h`֘Ԍ(~U7"MN\Ն02 -?,=!#$8%$V#! Z+})<e D<qC0p\i5 #&%)+p--8--.e,+c,Z+.(%$!>a' ih&gBOI֭yϫrʟ1qQ,Օlި  ("(-01565#4r2.Q)S'%!E c.w7ST=đ9ʔ2٧5 .K!o""$[&$##XN= a *b`NTE Q }!#%(`*+**e+)'K'&%E$"!w!RH$ [ 4o&{-5Y>ܡܝ;ϱlu}yk W!&*,Z-/./#,*1($`|p-' : c3`¿ qňC̶5#xH %`@"###0%$D%%" X4Hi| 7N,]R5H Bq S J"""V#4$$#Z$#!OC6>"K . a_hCxFj$!M2n7h}wlIvj="=%%#f"4 aW' 7`'ʼ< % WlJ;S] Z %n^nEcV+ @+gU ] r i,O3e.omk8KN$ YDx1#+0v>[S1N% D|o  z He#$ڹԹ Y=߽iJ X  22 N LM_\FLU9,6UbA ; `=UhtM SpOE$o<!u=,q%.@oy)#6W9,L%/NniL<xQX] 5 y+L'#M 8>*P4#Yqܨ6R`co&H=hU+F   th~~RB@G'mh rKY&eX O g -86+)wAIVjbPl   v Q N .   J q > B2$f+Tek^u t <P S '|V^9w_߭%#3٭y+F,ݝ?{d,XwURj0  6e.Ywz['yMb@u t uni;R=! ?$cxQ3mr- ` J [  y ( [p\ ) S G 'w[g)Hq@VF=1PtOr.% 7 Qs.g8*NQ n,Sc_\>(Mݟ2ܙ$9߲zBOl&6e K z  { AsAR'')]PWr:9^9 9 mV y=8  X & x  y + [ ?   *  [>n#AB %g8A9 wFJn  z 1 ^4NeFcGT*)ߜݮ ܍ݖݼ`aZFLx?. ( (   Q$ srt~DN[#MZ0B  . I(V Y_o:l : : s   %@t_Q%]U7) biRK<g3 ] kT@__ O.^0B$%ݕSTݯg 'mPg h0: i s p\MA$CX :B*])nz M vnc?q,[4?f9Y+ ] ` } :Qd<B]F*^f5=Q  / , ek qUB{"|_l1gUJ _  i w s\;Sk PTb>;dZg|Cp[HxfCrXY%Wb+OxE Z i K\C)Y|f[~r R  ] `  [&i"PE ' f #  .Y w H  ]q8oS4+߅:4DPfSp u i Xe)6v_ Y> mCZ2K rQ{  ( \ } t  oc `,nid2.6Y E) y   5+u}2H<dC%SJ - pt{f/VGq%2V%-m7:W!^M1H}j1 <dY s86"(NjD"MJ\I;@:iOzS S  6TS*WU< )j1 2 l WpjIYMh^  -G`Pz! $ * = b 1 A R ^  3 2 t >[0c<#htp;s_S8;eD0 M . t * y s X r` sr+*\EY6X?Hk9w N   I P7}}*gDGp+g b aNK7} $ U7* R3e# ] : - } 7 :3% @d;NznXb9;p ]{; _' f * } 4 E m %fD4A?n6~ >ZY'J2JxN^/Lif873 M   - V 'k>t#d+4g5D'nxJ Tn JnnU6 x K  K|L%2,L:  0  B A(P J+8/16ilpg0H_TKMK I>Oj""]LUOY=B4+rL261`9?7@ MSU%`L [ jnl't / b ()6/X  b s 8Q|qfN(ltM@G~m  V 7F!y'0eNk5A*~Td/ZZovTLU~ .  0 B "xe#ePl]w 3vP\KDQ@@up3Po0 cY,JR V s 7N } + Z { 2 s 0o^Lr?-A)Yd* #   k 2 Y% Tx75XEGk dZn)T@?wk9oP8 C 9 $ 1 $ ARF'l2e$HUhoa0X~AEr : r WqbwO{n7 Hf&<'=x< \  1 xK2w/ E r jxZ` :/c`rV"(.{f  A " Z } = h a NFGtSsPX!fpy%r 02'B E9FN)R: | & R 8 Z;f[e?KKm\]5d%uo i   Z 1  O[ 9L0mpaQ'8^ 5 W|@^>G B }k5%"le6ku$9^9  $|  g 6.o=  9 I ~|Xr%IP)7Y  N C  p e / b xU>'eF/78uc(-F;hbeHC0 iogPJ+(zP3-7:?< z bo5l^v\  + _c:N@8SDB#n O U 2V(32 Y +]4Jc- /`JUg5K]UsjP'"1ZR;g v  8 G d u)ITnZIMhVxJ&*rHnQ&d[4:F i?M@ROy}0Q r ` t* 5=I G C w j  E,B;%O\zmXW[XR{  m ,M ]$x&,t W 0(MWV>_Js@7en)C3;Sd(MqxIY|YP44+@K f1agNo265wWv% x'Mn-e M 8?pw!xB A F y dk3/)h\R/0:,Wgqk+ vxvG w  wX&?'=)!Pa L?hueH[+W) 7<T+g/8 K\dtS+ivI;%IZ:=DB9-~aI4UI97'@C7"X+Yf\z+rlqMU4{ye+Z> -pp?`\O XlXLZh x  p cJ K f ,to%1Y2hai# yl/box)#BIy}{N^oX< rC X7 +u>2ctXlQ??M50({H6 oE>T3v'97Wu|SHTx/!_*>iVf*~0- d ] &   YJ0vVj [u=* 99'I&1Cm!rsbK|pq@=Wcu=.>'V}q@rk"q^7Fq.P*-2aP*NuINbTPCdy0SxGU_ZGVs<t`]+<J%xBhx`uS^MPVX&94>\F pc!'sJq~sh!lhOh v3C*U8Z$ .N,-Vfi7oI4^C5Eqc_4fRus*M*! =R"$UnjUi8s_hzNXD: zkT0=dr1:|Ihm )g.3)dEH}QThBB :[lY|wVsQW/QZ9k88Z|Rq\ZP9v2#:L#[`p trEs8-jxDt]rs\dQA}|u:)taHxo 8BWV4 Ov[On.^(']+;fgpWN=%2~^R=" 4Je}eD(A' &(jy|=4s@z2[=&:m(u?]>/GH*Yv[dbPV4S6G_keuI1Yoka$Fl-%l # L;(` q>Z@KE]1>:x4 r<ww=yU|P}W U)xc6 3kKm 4AO/OA?c;C:IB9I$=!.4LJv:=thx Do'55z+oidfnxw~ $ \RAv6Jn%$bq&b\_DLk 0KLj'bTdrz5Uf!>Owj6~%7c4&Fn/E!Bb1cSC`gZx_b2iyB44+ +7PL77<(".&g1u32A|PN>-(n]9sBM1-h6`@`L{}sU5ZE^ {o~@Q8H<ehZaZ <U@KFhs;ah FGqx8939I@+OcN--yUyDwkW"tdVUB+ $1-*1,R.j/dHo%dugU5%xp`> %+RN=6;# |+niyPXChbIhk k!DGk3Yuwj9E@O^jUqxwRCYc}?[m}F>(73+=>]<A1D22y$_G2z5U$z. wX f_OX wD:bON: -. 33()++%. b\Nq/@BrOri:o f (Bi[?nL==tQLf_o}vhT> x<_n6hYS1z^5 v\_2vXc9C_;&* (EI"%/zPgydZ~7g/, F|/dBF`r*QX,Zz 8UZes +EJYy{Y2^~|`9$16&3H[D'lF|`XPL4Tr[[ICA6wYBxH;0 s7vcl|-/4MJ:XJSfK[$R8 /.:r^EM<)#0%-1 Gv~%Lk>r ?Vz6UOrf_rrktot 5+ L_fuQQYsnNi\ vkW~qGSj]JF1Qc: !VQqC2,]1 }kgR%"C8&"#;?GaxnF;+ ! ,1Rv|j~`_szWV#)AQhztfO?GU^:Hmwlggu!,LYa[dZG@[T="vyyqo`G<No[fr{zXRi{^^N  Rsxp]DJ/.3$#97:1-6{P@*'/9<26itZJEoxy d>FaW>4%&$ !( >Q^fhv~  =:} Rssmi.+<aN&-@&XSLB$5ScO424\T5K^qrimuj`ndg``w|njaP-y~m:*?QQ@N`ttk@793&!-*,!)DN=Z   "+Q^ktxbl^YKPL* AJB29*)?Za^rrS>4R{tRJ?,2Hca]``. d9(//!25"32&7#!HW>5ARROZkX_n 3?6)0  )<ktpt|zms{aI9-%:aqkpswrwrRILZ^]ilSXZ?.0+5A;0?? "&*?glzskeg[^Z=AThnnP; yhl[AKhD"%;Ztr{j>-59,(F( Gb} #1Q%6Pjp{uB +<IBBN]| %(3&     xLAO;/1$xpw &@W\eU87(rXLF$ +UQ95#$$Ojalu~|kT3%&+!0@:Ow}^dtpa`xjm|yV671 )9I`xb@XV3"2Ecub9-  &|rq')*: !)%1() <IA3ARcltZ?7I=( "# #C91!/LR?27FE7:A<Nv]KinSWspc]t{zoQ<)5=?=? 9E&#8R_}oOQ@'rg|jNTbI++*Qoov{} .=;1>L:!<KLULZ`BGY1#"(NZ`d}R<5, .@V`_c}PHQPK\lr|jhi#~~zyk-%!  9B>MLRYUACE4?_h]`UXI><.%0 ~rgx}| =, svw\V '7;;CVI% .NJGNMWfvn{p{tF5"AKGPbwkv|i[N<&&.%:=7:MB=4b|hfre\OJjid\_LAJEAapQ=F=+.BUTu'9>>DCCA5;SQEPa[o{lyxr_G6M`hrubziYWcz43*1KTbzp= kL3$3* %<c{[B}O9B|wrpvmU^W^hv~# -ESy&:I[j~  "JP61<<+'4F_lqXB4+fNPEIM8)+9=.9G50F`c\NJJ\[XD/#>F4' ~pujdoy{lQO_knq{zXHPib[g =eb@6*whXOj|gUuoG+8)!+Zlztkpjpf $.:9*,35/3- '&%!2?Rn}vzY><MQVj0S`sN34;8:. olbF&#jYW@;70(',BDQL=;621MRQ\a\`|}zgOMII@PPMLGKE=&+1$/^z{}bqmlneLV~1POQ[H=?)+0C[tg[aUJV^G8O]^qWH4-! %TifbgR>1"}rR:+/) 2-*%/@P5#!'#%Citymw?wbZA49GG[ "#@ML@<T?08N8&(&!py`#9 v`gR9  F_RXq}m^erzrlw#C[PQ:+>7!Nqq]bY?6KN?@dkpi '!{i smV#0"+ +(rbcorZ@=Ga`F9CO\hfl2) JmuoqQMcq]U_dDC\icbD0/=@EC6?B 0DME6MuuPHLF@4, (^hSG<(&DVBEWTCX_M(")9?5DX{hgQ( %)(H?&7/*4-&^GIR@OqZB(  2RhhYHD`t 6A%(@WeiXDE[ltt}&6898)kB).#)5.:_|us_?A. rZGFB48EQk|}~}m]UW[]eNGC]}}O(1O]UJ."#4-1FB4EQW^YTe"QnnppeSI=$9Zgc`iZINx~ru~{zofeT@HRNNj|v~}jw]QN72@>Yuyuq@-7B@/'*7=C Pldmi\cf@$'*3)<?KghZC9 <A%(82"""4v[fkplmaxzYJ_kjqiTNimiajZSE_em^_^mxi]Zbfhp|pc*;9"+>- "5@iyz kbjjVNYD=E`abkoaWPA.'+5<;+ $ |t{   )4 -@" )!Ig]dmsvu{pUMNB1!'5FOOZW^poX1,& #$ 29!&(rwrfSZa]^bitlUcxqlnoszh:.CJBCA99;>8514>^nvO=CFH\ 9IS^aiaUQVks~gszYu BB5($ z}{wP?7'.?8(-F\Zb[B,?= i-6RXW^XP[_Y5 +$+?HE9C=9,Bhog\`YTYf3=F1'!0AUpqZ[S&4H=Jfql">IQHRZI$*6%  ygn 'SXEJl}bVWD!2:ASWNY^XN__WKJ: 5(  /:'#5CJSfoheqqu{rVKH?V~^B/7Rf{q}]KPQ2%9UaB&% $0HZU_L ")# xeRQtwy|*468E7!59-/H\i]`aisz? (55Zi7%<C 358<5$Son[asv|}ysbVF/9;+ FZe{{ySIBB7( ,3AD7 +)& |f^N)%@U& ;MM=DKTO1  pdbiu|wdK8JaVs{w$78@.)3__FJV\aplepzz~{ufQ5$)7*/>D550!%FbaWN<"/6Wlc\/  0>>>38.  />4Kkw~RWT2:+ -7.:7/.OU5-E.!!,# zv}%+)"# 4I.)EY_gG:0(' :OHR}mJ:R\\jn`szl~vwrr{o_[OX^SSedpcAESKXT/\G/#-806,  Cyy{tlChM;J;#/2"'+ $.@Q81(& '212+!<R]mw|qORP[nrS@MSObhezdbzsgfb_Pbo]S_UA5S~xxgEIB5f8*'#Aor_WVM5AVbglukG?DQZdWLY[)-8=L=!Z.;CGYNE-7SA%*!' 2<?+F_uz~U8452**5LpWCNeimkLYtkOKA%%(F<>Yule[aWH9".$   ~y&0% GMTfnU5*( "64',CMAB_hPKE?Lrqw}{ wQYUU[L 378HB;K[MFXB(,.IfW6/*$?. }bd{jrzvZ9  #=5 $)/@KCE0  (2BZcZqu`E>?GMIPkwmfUerxar|ulR=Psvo(6?3<NADu}nekj__Xi|vkmgH9FC#9BAAUnlm`GBF^|lUFF1+/AH[heba\YJ5*#*)9N_XK964:8+ znal*3&DWLESJ7* (x GjhgYKlr@:;<) #!mysbu\FIsm3E?EI9!9 %/" 3/ .?Z_E67 7@fzOQP0';7$W|zzwpcL3JKB@9+! ;)<M@5SaTMqf=;JIJNYRUhxr]RXn~hci}|rmcKLP3ytO=%9HZij57NeQ9.zaScO?7;9Jc\n~~rr{Z?AXNQX]j|s{qdbsvgxzz|-H[E/.FLOK7<0 !" &:WzsXYB' !)F8*,#>HC]ZFQ@*!6KPGXfcMH]K* $): *%5?MaX1 $(-&5MNYSH7G_US\PIA %?1.!3:SdaTZj[.)(@OXiotl[7otvbiupger}sJ363MR:#/1>HXYS\kkh~s!&#(:^_]Q`ago{d;%")Fku{Y+>V5')6B'C}rdt~p[VQL^K(.::X}{oy{xq_ZspdotH* %$D][fysnwjR<0?RZTH.-rb}lYbtx  @;69(_l^UWq9qzja0 )3;;/,- )8"5L[U@64/(3 ("7) 8A86=?C(*+@/%"#$%)&-HT77PIB7 !8qohu_[FKKG4GkrfW6'57:[vgR34.2=E$.^hQqkMUF1cac{mEbg?NSE'111!):,5I7O], 39%/ 12>Skn_:=90}n {|}u[Z|n)XyPJwqR`}\Vys-!YWCrVDTSc{mih[rr`\HqtyVNbD ,khWorXp4 I}MItwlvmF>A)1SB8Up7%[jOYkOINRqsohhoaL6* $)8cccXKnJ'U: G,JfT&:}qwz^nIiO(*<E2joiP'Q"k!ntA))/Q %sscxxrN# Ck_hE7  md3;f|r}t]O)  19RD/=a^U`HEb]Y 2!<MLcziN 0#(vW\66:-'{@W CkDrA3=\S;f+|yVnR,|4*3 TqAFq^V^fR^p <9@lQ2 $L5' &,HbQRSD$5lvuY:1 MLNP[MCGZ[74Z[>=Ya}}0 %  6  tv 2J25ftW>&?20%{.>CC= *~^o}zxb`zokkglqA/ CdrveURJVus_k}~oX^nT7,7?Z_tz|_FI4 )9[ZWjfc~ )UiURc^?-)cecZbxj}z^P`S!$@$/1(4[hNMc]JRN;/$zjKYbIK\O9339D=CVTaxA,,3;F$XrWBURIJBA:# CNDYj}whZ^d^WaeaYJG=+ .VkcX[\[UE`qqd]E  $6NZhSRUF pfjYF@LTen`|1LRP=8/ */3FLOSUYeoiVC8+7102ML,6%  # __fmqu# ( z}CQKjZRV9x{0FEE0#oHHMMRn0eus}~cK/ 3FJIY^W^}cKE?25J94F]^`U8- :6(:PKD^qva]feVV]K57K?7B6$,*'.>' "9DGEaw~qrwX5Fa^wrA  n[N6&@MMAXo~wu{|\D9:,$768Es{bY[uxehslVD5"Gs`$%! 5fmS[yoI5<<!-"+R[Y]^Wj{`ud6Ds st| ":( &&'(   uD7@&@RU~maZ?xxx|mhtVGNp|v1 qJSZchayvnlO18VheBLK;DMJXSWqry{w`egS[gSSb\ZVTXY<% '.$,8Xp|bF0*% 1at}{xkHBLOLeiR1*AK%&CMZqqxda_[A:G@#%AB ! (Mnhz_dZ8"# bn~`EB?'+ gmchess-0.29.6.3/data/sound/7.wav000066400000000000000000002331001323660377300163410ustar00rootroot00000000000000RIFF86WAVEfmt DXdata6rx+6mB1CS^VOVd^^VB,"Q-AWdjz{"CPVrlIHP;8DD&#)?>MJPi|{VU^eg\JVi}tPT^o}kE3 v 5DJ^  *) "Sws_MA* .Udt~xu~w}~T><( 34# |wkYA37#!$6KN6 jBjR;(4HPCFL^t 3='  '77E^_^[ #! ,XwxioW9K@*=c`Rcv^j\/$-(* '9MS^bpfi_xtI4/102258,0?N@Tz~bk~uT),ZrhVc]; %GfnjulNJTA1254).$ +%! &7! 7<5$*1' @_bmy{~P-6J7x\cS<=Y_V[bw|a;/+9050 *OacsV3)8-(#(8CWY^_da`iZ\xwp@Jjpfox{nek[[hdao}^@  CPK[zpYD<,08CBOHQ8(34(+-!)9AJQ`ehtkyoo\HJ?-%/H{mP>CX^ROVYE9AA8,"i`MLQ[a^mxnTZl\c^N:U^>""05B6)#,,,;FGKBI]kjcD6/ *Ufa_bXPF%3N|vn~  >nrO4LXlpuvobmtec\F;:(#-PkwtemrybllcV&(GGgzdTTZT50&4D<!1T[i_G 49$ A7[|jYbVQ]]QFPSXsw| xWdoiZ<$*9=>78$&$@:LyuckhU\[; ~)*92)}wj\]h|lpUHHNi\?23& E7.A+ Mv}~coGM_s^V|vplU7FJI;3EgpTHgy~py2JHOAyf\fo]DIkieotpwsZH$yaE"9CKj} ", 73BVe}^RKI5"#<Pezveou}H(.!& 5IOjoueA//B78@@*-w|a>) :F_sqvpXSG::?0 <]j8Yb[0]80Xy *#B;ADHP_UB."7enp~fPR_eL?1,.":S[WB=4MOI4,MgfqsiqlOQFLKB3DJ5 )1$ !-$ t_//Ck1"%/,?7$+1,3:IHQ;  %,/,%)-4Wwu|R:&   j}u4  7Mpuf^`VH& (HIGB)3%&)Nq  2)(^~tjVG38"6CGevjspjYVOK\s]MKTFF0(+1  'OI[pv}xu[^g^?2/=SVUY|xhhkB 3@E3$7L2{nWFTFBXicz }mriy+Noq3 &/9`yyn]SZnVE@E. $<=uy*t`S=- 9B@8MmwsG7',8W]| .8,  $').6,>KCFZggj]GIG<68Qbiynposyro( $-DKE@G6}stvffye``K2&/3xp^` ~nK(+'7QUSZy~xsqvbphXE7KHHKc]\c}rxusynkox~hQFH>1  &>96Q~yga]_ffaR8221%()0FB66QaWTbs_;@^hbV>># #%:BNQcu 0B3,@% %AaliygWkwudbnnv 8A:AW>7QD ~jRLWJ 7FMwqZlf]cvivpzoXb_`RVB#@KP\lz}uZ`dQFL'0TZgvqR )+11 3H(1V/ pXP^TN^jjx|ttuvrimlWTN6- 2AHH`b?7KR;1&6?9'*+MQcytJADRX}vi5>4EA&sPb^zkd"KIEW_JBh~hUp~vhT,kXU=5a1E>}ur{zy|}_GB88407:+' ((! 087PUL23 mm]C\ )1:MD55;-7/ tdi^MUOAYM>6-2EPHgX=1OVQ_o{icYNERX:/BV?*.6CgkX< #GfghyuXa]QWL)+=XT)BcjUZstvh`JI?K9(SNk|ti80! :Ga}[`LOisb_icji_``GCL?! $Bim^cN51-<kzbi4/CmrZRijK9EMPB=@2%#"76QspYcr`C   %IjlqedfqofSYb]O#*GB?X^B7-  (:""!BsekxO>>*p[[#IOS?IdxqG>AUC5% ( "@da>@~w]MYT=JoN/! /Tvxe?,<D`yboyuom`[\M<4=!+XobH/D5 +>9?Vhh`YzxG7PdG)4@<..!}ysuztwrQ* >GZz ,"-  "HQ>#))   "5~yzCPNPF[tw|xIFD$ 2/#" KrfUE&8>A7.71PV>//4/*2$% "@eZ<'*.6B+5 ' 'KST[]rwS02?CnK<ecB.<?56UAvcdWZuF oaiGD L_UYxx{qflv'H? $@~V`{ L-X\$bti=G!{^\o7)! )$'://-g~OPFPT1J$;[8(" 0tL]W#4HnA`=hlxMej~8CS. y17WVYgA:(lfKVxc T Rsj8xD jj < /R^Hyfwo]K`/( -56|t5%IH`_3N A&4 tpZYu]4!45D*~ *~'k,=jD1yIi~>bW!c.Gk xq .^+7$:0L_7Ye4{-|2m+>=\i bPHrV zMK~!.fnmbG?oJI1l_$m5 ,|an,& ;&J\;l!}& ka e/ WH/~D1BLmDj a$sf@8#"y BX?w ? (Fz1iPN]hvPbo`CvG]X/[PX ;L+|^UD6ElT(qXBdHP[s)(Fo{rKf2h5^{4&8IEh K>o3Rw+B`7TP $)y/uZApNzsTS*Tu\M/Y/%+K97I=;{?P^Mmatb<]|\ -js>d%ig~pw \[uhdE`Lh}RCCe>_W#hj\`pH4|" Z8@nEoYm:VpP);y;R# Y4iv-Q$xN_fnF}N8RNAOB+q2 NfCdS8A @A!"{spR!mt%mZSCee(8SNC+FUvRI7KN&62lZb*}E VJJt[b@0CuK)C15?V2U*ixSRDs~ #<mzKHr4!6SDHVO?W7P/<)Db"vPf_JDm. j W;yGj#+d466qwY)#7#rDxQ R_|bM=nM3/~y#InkdW7e0rQZ hNM2DodYaPxk;i $ZcOe Iw^ 5z81| yfh%`FxB aCfybr@}fHtMAp<>zny r['m&8i@B87souVl +r|6d%&&1`KyxXMh F<PkN}I a2f#_s7`) -m}g&1s$nl4;P^w}M > zZGG+E$FfO8?N 6p Y|8vKuOf!S$R|gG`=c|R~V?QPJ"b @ rnIiN/6=/ \+a5 y8"hS3F EM v1~/{ HQ>7O p`%]87!5,' M>.s:)$  ;2_' Oln%ri,r0?aB|Na`\Ib' M5j 6 d\'-3-N}  ^c #S ,j`_ @Z t[< BI"g%I,Y/~H G<0lBbE 1DoJ(8 QjI$^}++7{X7 kc=U3&{|Q3#?_(6qnurWwQ4J tPS+'@@ - HgO6 7TVGC>-281)u @!) C??g,WA^" R' og% %5tpC8)_\I*TKKE$.{*I   ^), &};AF<}(O7  kLG W ` |j{S:F ,+:T 5 ( @Q XQE4 d'g L"Uvs T l Qg k5A j `% l# 7M$"o, WBUqo9<#M3zY#}  AJ%? #thF+q^nUU|; &/m])6# do3on5E27%xG'/8(D&d o:Njh<04kXa=_A t/@Fr& -OB}:BZ FI$Sf)V8 U] 9ZD`1vrK6^q#sRm C=B ?; -$W\jY|f9Y  146[u?y7V/e &6 JUL a9/!W;*uZx; Pgk{ aU8 GgCe )'5*P!gb:^Olq #o<VJwp9lk@Ua3 )HyZU) sF= 4  w/r%&Hm25B6 "tygbQC  "ke t _?RMn ""  's.USL f(( ..mz @/@R SE59Q g` < hbt|S7g[1r /fGm< y yv.M :%y!Qu[IK W@2J %4 Z9 L/a4~T Q*za( RxP  %) }hOm k &BO*zK(9a@0D!p4 ] 7+{CUJad uU19C[f 6Bi+K~c=>^^YYOP-24XUg>< @$ K"( 'rs <A'"6rfs& T ?"q6MlTa~,+PW1y xFtu',5buA<6_w5rP| '3*joFn gDL8eAX0'sQ:=B[cot VD8vL ^?zr6D x ~D w -l 6 lH)-YrCA6s "%MmtI-|6 ljti5/_'og.WnVvmD' M&|{IJE wtk}}!<0s-xFe& mf`(E29$[6DT5 +h+EO@ 5MRT [ m $:e 0"Pu-!V\4Z 1; ,yOc dO}CT4xx|\q ,]WG($`.[i\6h-v]a6I2eJ8otVO Ktg},Ml}gJ b9>s]  H|[C#5m @h \A-GEfZ3 mg`I Ex'Z 8 Fv@Y l~ n k{iP0^9M7R] E,~ I {KF5t=- [ Hhdr7[c 6 xsP 3JyJ9#q ?~|?)b1}^+1f4Xv}1J5T<5J;9-Y(>Q{ %IRJN1XU7vSryFUn %KY_* +!W =C$ C Nr8A^5QW$DV&O  n2y:Jng&' ^y#SZ^.gec2{"rCi(K,7\M )nT}F `16  K'Z*u/h>5# -{vO*,F R3bZ gsVv&0td+!=?"(Y8 >CzpoWtqG6 {@cna-+Ts QNvL4zM|*oEXk-52 ^J+^[5H W<9p;z `Q ^b`H+O7 _0VA' R,bM8? AGqpS sT'R]i . nqY: 6@0r (zGm,C$DE}S|{8K_ao 7 !&1m6B+a pUL si%G \ [9< Hp>kX+O;[Z6YFmcg <lc 'umyN0Lv#$[5ZlL kE!r)5(zG&\Y[Gu [[ TsgNkd '<vy{H z DALPp3B];V/o{H ,x LH <[  >)X@!*y c.#m! Be#K o9;Pgd$i_h L9+Rfi +Y :@@mdD j V) f%2 =Kz|R=.6*2E! $s SDZ&o\ } KRx9f$p g'B7qUjh8 , Wn(luk1LqF= 2}" u8 z[aUEJjf? {+HbG/h  B=\b$ 2F0"K 6 # V"'c h2n?(~Z9-${|[ C xd bu=z|"x F2 ` ftW{  { ' 4 | x4FoeV|2/Yf0mnE|*y-A]beg(ojfU)} RV {7=\<Wz "I O+2}^ "Phs N?)[.P> pjD'bvA>0t uJx jN=pg ,*2adUF>>v Z[>-{h;0:@ .^ za}R`Ojr~B.b)W 1(YfL~  w xN 90i W.e)f$NGldiR *};P|*=!*w^84Mbzl%}|+Cz:+t(]#@C%$6Z@ 8 F9Ik,DTFB(*ILJ'_? Y u$i}n\'Z=?kuv\7Qmh -=0`O ?J*A_3I57XlSK_axmVQnw(2 8$o[xN&" Po-CfO*@ d/gWB*Ujd 2ZepL=zPiXw7OOz-?]4h _.$d bsc9kfXpM{.X ( n JT{0=2|*uR}ILN9y6YH- JSpkJK[yPi:w?L}{9q9-inp-GZ5z7w'PJ["5o)qwZz  |)JN^:Q^_h\CMOa`b XK,/s0tn8GR xjiu3aT0 vONyF6]#| N%^k[{u2 muH HIoH) UNfmiH$J ``):@Wz'!4QR%WXl2BIryv4N? jga~[\(OHJ,T@goM)hAJD c6j#2)cUeX{UkL)XmeMa'"f0sgKOIDYZ!nqQ3LzAD%0"JECI3)<l{`?^!cwuI/vtAr8bk +H\9,N~dxv5fJvB38(1,xH 9jP`=!;E+T*/.iM0~kDK_ P?WVBN{Y",q4$C&CdyBG3yTa'&3"hK4 2;K"fxXQz/f]5;e 2OYe4C3n6! ?zSskP.\g(8A FmZ!cc"#E(?*w6i,5\|)T&)"Kogf3]Nm` |]HM@NG+m/Ez`9\6?"_)U5{i?< k*F@C>jg-XM!9!n _D]CDP(^9pfZL$HEB>uP-{PSM~SP~nD_`8!-k{UMAg [=)~~ 7'g#SRUIB}'*8Nvp~d~m v)z] v^q/>m*:ERH<="a@;PFl's (_+}\'6:T}p K`,HxjAi8X`(]",X;j{ZM5x-/G%F&\}ZClr}nkRu{=j)Au3l.R2_rP7/(924 tl!12{'U"{.ffPy h.+4)3q X^nqI"hYf%,=  8  , %5:7@ q Ftf5n$Y[qy0tk/cogdouo(-?/f5`q8Zn/Sh R > 1 Q i >  Z xc"+i87>=z"u9>q4AjKi 4)%b; ] '  E E aQm  ( 5 A u j ^:KMNhhgX nb= J_"%%o/LD/Mx{E)iq?FkNP@^F]! = r y   z/qZ 8 x . 3 f[MNt":Bm'm {k[D w\n;6^I9do~~*P47n 6 - Q w @ a d & wb y 7 ihy+^!gj rX%o{df5'; kv@R`4h(@_+b0 K p g Py= (W4R $  q  ]? lBAXaRF}|(31eBpiivp:m72IDKXN xUc^jd')'Y 5  t R +~ L  k x  *5`sV5f"43ztPR`^4Jswi%D@%.6q`kt.tDe  n } Wx+ W$ a)I 0 ]Aj/_L6Np=r]%]p /L /*Jk/ " { ^Y9 g`C  [[Bl`d/d&!%$A.#mmm>T B |-W ` o] X&gK?=PRlKd)\28*U  #] %  /  $1v ! u l.E8;Q!HF,mTw :b^;v~_ALk[C0ZfwR "  V >]1 b |)qn x|x5C|h&3(<[j QiP9m[(9.Exxt:q[d~ b\ B K , yN5,t> ;" Y FG?>&)@xQ>D9:+LaKB]"m.u i xr 9%3JM) )n6 ' ){ 3 ! U #4ez6 ?/ h Ut{ST yTPna $!BJ5Dxadf`@=k U_1P"ZA   P'# > v .F7Xi0_ n ~w T%C<;WOr0kDM+F"&~K9Vtn+y'#, q }e g`j-Q4bDyZ  RK! G-#^Fpr"m {f-Pz?\8cgp wJ=hZ6+ Vk f $9  } r xJ'!jT 3 ^lH9 d00 Uwb4}S9+`FH+/_g5[PH\1NDdll8M~Ha\GlFR  }; $S&~>sq<`Z^ K.O glVX,xI1o&uevwN'&T&@gQ && 3 1  B wS5j P)' KZ# UZj|5K7Dm#,#VN=?JNF+Sq1=9UWm.> PG Ii ~{ L [>  E* +H 5.Q=7)fR^C`%'oqL_Hd`P" |qG*R/x\;| | VRx d]]bBH (f$b  |\:y z h/.0pa}A ?&##fRj5y *jm{shw^I c W#( - 4a 8 OM|t C B YDj4{ ]=Y45m-0jb58b(gC'\Gj%i 6 Cb_z2M? F q h kJ b  , @ 0!'# 7?7"p5zQYkL-[qqK. px1Tx;W b : cz Nl { q H ?{CWeW~ ?`| P$Z`c)2*B(N{ 02>5X=%xj%bJ_cG= | 'r6 < k l;) 8 z( u RCV ~ p   n tL@  '% j Dh@jBQQ~7Dc&D,:Im-&M|[yQ A#amM b X a 0{-ga5,,w+  } &s C +*HOq Y aF2r7IZ*O0WXSvx)kt6U;Hi [ >x ^GL $T8^ WlGF KboJ`qNJ &lNNx3-Am$)`!D ?t:h~ U"$j'!,%9_=w o d< H~[ VxH7d(Cn\   x # 0cl#_9[,B-iEOdkU/[S&nHFTS   679 8 IFPO{ `aP & !ZeS>T@JN a/apVlT]21mp_,-j} ;X*/#A yg> > l>+PbI x O .$mb=9 t!>#2IARJ9 U7DZ31D,5x,;+H]UW -PPT's=Hq C;D  o 1  ^  gn_wiv?5K?JuJQ cQHTf]?+d7s'iu=2#pi*Rf? XO*-O   [t| B_U {N9 Lln < $Cb? YlC o'"i"[1; DyI.e E#qK `& =EfG T   t #c `Hot A 4ޓ _hMg# MUMko$ opos8 OW E  q U@+ . / VRh7/RAnCijWS.T' 1%27ZpFm  ZCQ'Uevv | 60sH83&fXxq3]8k49L (mQaqk? x{;z0gD1dW$<t}(P6tk :S7' (Wh- k \"R ? E 9c^Z) )7VF i)MBedI?: pnyYp?AQj>%0AEMe6?UW5%G! D   u 2  SVo{ fF rpXoaJ\ /܄xv C^tf~8~_5G I ?7DUHx !- T SS. ); Uczi b O }A6 W L(^%')?!,S}2* GURFQ|K< $LN& n 3  3 n  L  { e_JRd`7e-M?;+ A )XO;XBn)5)\}D :\Ik A @ s - _  [  p   fSqE ]yUB8ROmޙnF6q~#Ax#i"(.Ox^p P} NR A4 N I g eDb *yN n Ivm 7 fT8ri"\%N `_b~CI&2C;M)R gSLcU](   # um\ ;yt.^F*FUM:"uA) ySaO 'D ^D# /V=-Myt!nLn# W C /    P c I /m / kVSa L $ (2m`;x S[޺naZst ,:<^ < i  "rCP = X9BwZY) ;IA>wO`+;"SYi%n;w\Ca  ( o = 7d \j K DRC SVLjQgB" 2@#i], 0Z/K?C#*Gfywbq r X[ V3 CT oq h  +7'Q @d/$7  8B!n: s D8jyGCw2,Ex WHW?4Sc?WB CI In^ @ V r& I y p  # e @Y  1gVZW]K> *Kb.epZq?w(G4WV~op)GVq56}8M1d# 1> j Y  J .v  C 2obI I K{o (W*SAFc  (HG@h3N tQc;Wa0_#w?$L~u$`   @'Fi 5 C ~ 6@ g i Tx ` C[V 0>Zk#wy,dMq}]WWQ >yI?ifo i?w X> A | 3 7 J  ]&wJ&Z8S8: r8`z Oa%=u?Vy] ]H[ ; |i on&\ K $ * f (xnL ( c#,t% g V :~k&RFh 1qDDa;(.ioFBzz j{9  D d F m B+]8 V-XuY  (%\,=(%y& lZ Cߴ ixIS\CV#"DP&!Bx>{Q*n{Av gAX& 2Q z       O'1 `N$P j:7%cUx^ x{5 9VJ! />OkG( W7P Y>@ 2 x > ( b U 6 J % HX9] Z2{'Y\|, @uYt  6-4AH~}lenV4kvEC.q AX yYe {H  \ 3   l ' _ s(o (-3V& | .@1g LE^i5vsr7`1n[UO:{F_R]A{<:[ g 6 7\ ;(+ ) v e n O Q Z S  , 9~$& wZM' .pd:d7Bt<O56B`if2b tw  ^P cW][ C x g  e : abzQ! L79Ufdz(f 0_~2?  * D\cbo2-*r_O*lv6;c>jty x. p .  3 r B ?   V|s= B3-6dB.  # yy &C77 '-4"4VOFmrK$:202 L%:*kS   ^   9 j G  _ Z  /   jr*hKh1R AN z v,}}4}8s_hq,#C~J{,vv ys 4 m" B  %  ~ 9 wt  g 8 gsfb~fY 5V]2 ! z2w8 PV V]')T%* < )9<  Z ~ ` 2  , g X\ % bG? !|X9a<<}l{Nx lI-<4KK<'OHNIp?p,   ( "{4P 8  ( : BI  jn5 K k4  g{1 :.}Z LO qUQ;\%}2M?/rB~m  V  -} _ B D v  Q A ; C H 3Yvlm]_ 0 V  t)y  b_s uMZ9-L^,3d=NY,WHHq / :er Cx  l @ 1S b  i*e Mc S*#JK(buNyTY:k7**J  ^ | $ j + U ) ^ i*@ h F v /bRIHy + T | >X)X i8fMzR0`]cJc_ \l+L{c)n % 31~k l  / _ N = Y 7 V u Ju \ztF&{m?" GE C & O SfM DYg{'#xY(*pa ? 30  ? J % o  h q s hYY$ ua6ng  @# |-5 j$@Y(PwQ+['  c }f}SW#f K s  , U i | Z4 Ne R|BD_ y{Q@_89T*^4X0 |w8D> 0 F . t ( R @ @ d R    M BQE< q k:V P-)X@mk>"adhpSYmY$I~'&K?Z^YA9F Ns I k v K < D 3  g ^;;  { H) yJau~% <XC2,*Eq|2;YvY  "n d I H 1   5 t C * *Y s `rkrIe;$X~{**vu{z U3CdG G^ <3C?<6>_9?4au 'fjOK  s      \ ? 4 T| 98n`& OTw0``3 #- a8zSz& C"=z@} /nudRcLO, rre3   } n " %  d . ~  l : V N f k \  o i  [ F Q  } @ ; _ H3Z 8L<57w,9n|O^#4^PQiU%>|%oy:\ I - j m % n W  } 9- B B /  mL, R[-f)r{k-hKG&?v|ob,Z3cfdS DJG0niH R mb. n M M'& L  ] D K   | R hWO Fcp!K .9)jV5"I&U*V}McPbwGf|&s@%2ZL HIE= 5 f  w  k } a W r Ve  @tYC x<&a1 s-"&\@l4A%rx Gz|[ s ?   f 96gi  % T o . [ :\(i"/=V}Ti[9-G*~@[f=f"H3GJB9I>K?".% /<Wu^* ?C y ' T iYL}edf |{gPbeEj.0@a4<!mV, fN'q  jw Cc{ l y Z  @ V $ {64o- 6 %\bOj=u"j`_>&`M] 2`Zg$Q9r Og,w3g5\PXi O h  -    N  \ _y'kXI6 8d$PIiNk(Kz|m1(>4 +s"f ; l@: > oV  x P &dI*   u X  F  Iqw={YUY.e6 4Vvh8^? Q l ! P % 7 -Pm`OR=JO 'IahOI`Pj ]rq6z n~2IKJ6wQrDvk ? Zr) r7 C 4 Y t%Bb p)~?@x FM#a_Fvz;Xq`a(WCsg#CrW^Uo_ R # (h ' M K HF!CSfU*D(n}:+~T2#iBxN)XOczkf38Ze: w [ VCu K C = 7 X d |C% uJx%]]wlsZ >g7_oO5D(I1z)^T!BwOsb`-ul;!**D@K  o y  s ^0r`kMq=m["^g_XV+1vHAC6D-L$Ze0R?g i l w O /sk   7 a 3I(a!q5B3] t6c8.\~9-0{ zhDr&g87  /  E    % 9F{Z  > J q3 5P;Nk;7e wAKSqd'pz 8-?|!xrI/v,YnZ : O `&<9 }  OwY4cQNEg[<(#&6F5(:{4qqkqK CM4b_FEX.*rUI(:480Q'b A V U? H  3o}7g^ <O9 CG$A6N}u!(0D'Pg  m q8D+h= "sgEwNhd  N ; l P h  3 cH/x;eZtrtBH|t:~`m):)Bj)[i+xYe$3t/Pk+  d@ % = } -d,\M:M`ro+q3AP?F 4W_0 ZqK-Y"v@| hSiYe :q8N{Rg{!x  A x  o#]K}ym6D* 3 ~_Z gp-x& "IWK~OZxQQS #h K F <9z) Hz1[cX;M+b4kIq`#*O3D:T3%_p/|Si(gdAB-Pru_i*9LY B ) 7 E a-neM .v)M5/lgoV!ODYK:m|=c';&kmZv!K- r|sYE_iM%bP6fx{"[p\fj2[ NPmNr<4J=Y VID6H{*Nr@|Sjro1?6H6c71CqcW `E[X/SA-%x0/}N$/fSh8Vl}TN`oMI3Q5XRdMA)E;BU/"d EF \n[n60R{w~TL`Av?S^kFK;uw9 VaZl2L ka7QWA:R}e/ U.Y%( ;/=u=9T=ttXZzANE3X\^6 81_#oJ+}!P&UA/]c/HDK14/eJirc8HAY'kNc]q#{)'rAV`vF& "T8zEmmx%sZ)kaZm$rf?RH%?AT2:bid,7=SQx.qte&U[~Z'G?~KAj;R~zdwu kfuEMs<SuS0,w{QI|z uJ~Ri{s ^) Dq$C =Nt/Bs_;te2d /f_kw(<(1 g|_Tkd]Lx]uv#e'(C  +roe,YsTnuX^)JW@?=5/K' 7=3jSluaT B9> mY zH$ MXj-?;YuHDIN.`Ui#flf2z$We ta)eT<]xynCB_0$pRqQr+nbX,"myPV$ O\VWWuz5WN8UZMV|AwcZfKw`n [33E2zPgyxLZYcjs J0#vW\",<.]#,H%if4`k6z}7fAc[jmk'-yi/2L3FF,x^HS}H1av"-&(K<:q,hRE!3v^7-hib<|8[oS\`dkvgQ#M9Gc B$7+k+>^^o 3%Z4 %R3LXvaAR9rh[d!!X3S]f4;ecWV~Ft x+=M?[0@L88PN_S3La JD}B MKoW2_e|;riZmH 9@$)#~0dAytCA72pshR4 >qWtpI}3IA*Ll_H6bd}.Lb!V>BY `T5<(@!p3 w_SZIw,;|Qfu !czmobL~k`&*G2^tZ#jc{~#)=gFs SvF'".{h(O"2BRL1 8wB"|I>K/?>p 8s= CrV 6=Syzq@-$'#$> 2\CFeueE NY/7t0u^S~~U.- @@,KSQ$ (+me0@xWBAKdM:FN[hR0B' 8K9Dr]c2$ kKXxorS.  &GWc]HXWDTPOpy_X~*Nvlp~}*B>'-}\E;CB .Zup{l_vh>!, r{dOk p: 5DB7/4< $2G. *H;FMO|y^rXRX\a}{prkiC " _l3ozu7D?3N9ZM"Syf,.UQEoxNKbG??59(lmtj[OF@Pruooh/H;5Cbw[ 3>149%y)$CN$ ;33D)&##"#Llo{tq[F3M<1X\Yg_q~aJYQ8>\rot zV^TCMmjBtp 9H,.@( !!hu $#"&4*-5;;!{\7/DHZjWNTNTaIHo{aJ9<&">dumUjobC(Emtr*WxsbF#@Pc~rQ. Ow{jraF*Pw}uQ*3ivdu6Gc[#!7B<&dYwwf;)_7 CezXBhrtfTQx0,AijpgO@c`L{29F:% 57E@9 EanWYH$ BMPZ^QQ^J7-@- AM4+6/-$4.'#BT?@[aqtZv}xqr`K`iF@RND@! :-<cm|ik;B9FP.DGRofIGSRE<:3 &?Ur~eZYQ@=6aiT( 5Ziu~S408((*"504609>ZR.z~{| 0)`(2Jj.3[fcg^E,-YO* /;ok[lg:-$ Gvw~bF8 id~!bwgA3/3MdU9 5ECH6!08@9:bX/ (2@MRSN, EmgF  '" oQMYcoxj6Za`fT?"7>53/14!2\uX5!,1- @^ss^C  T{x`-1:1+$1z~%I\r^0~{st2hQCd{eMhqtdj|q[VSbssL0 6Iow}$%'6">HEYTQOKM\NWc{|p{|rYwv{dyuvTQB 2!P5=P_z|uwfX^]YNO82O{m^Qb|g\A>k{MGXVH;N]qbH5LWVEdjxzmqnZfutl}jXc:.'!C`b}{'#  ?0'=KHA,f|z]jxp{okC(FXGFTU@>@5:AVf|gZE71@P]k{c4 +%%!sdB' 33,F+ ';WgsiT>4)!*&1 /#+>RYYMFy +/ET]JOI=&94"722(# # 9F- 9Lj|pS?>2+'&BOXSJ#?QJ]hT/  *9+,+5% {ieZ@Z| 8Pp\@)BjxgQXp||g{xHCOAxZLS][OAXM?WZDFjmmaO=A\^yvU>! 5#*1 5[Xuf3+6(6N<3;S^]?.88, 2HRU[fZLFKNKPC/%9F>F[uqgmqnkb\] '6FFOasvsun]^z~), #,,(&!1ELKC$rZt|yf_jS*.<fnp{zsz{d^m]IKXCGNLFQgmme\ujhtdWI  4RXlk^YI8,>MNdVP7))/&DI]hF zqV5/ :Sbsux|1EE64#  '<1*,+$ 4<0CZm[:CJ9@nwx!,7LWC_Xqg|zrgeXXC8/$& {lgdvI%.J}{oa@CbU36BG^A%0* B}v~jh}~rUO% B[_WRTL-9B<@@(,0>]ghnp_K0+4+  - $"   ( "#wNPG8Ro~_<8uu\B-&=[A&07DieD2/\ "? Emn\D;&)-.! )]xuLK>( El\cj`Vs77npjKiz^q~yZ@98;_tu__iMIWF#  jUO4-@PINM?3 +GfO:>6 (9MXQ^b\91,- 6LD* 3IFD?$&Edc\dwvt{jpee<A2 .=_lfM9,' !@p|s\GLB<CE`pjL=+ ?PLCP[T1  1JXk{oZ_^9(>Oyn]M  8QgtuS6"%HiseR/ %Efv^)+jyv k9$3SyqZWaPNQUV6)2! qg%=oqS>1}edef[RP8,3RV\bM?4;D^dPDPlqjkkfdSHa|zXNA;;EZ.`cZ~jW]: -DF9754Dl~J,?h!<A.&$gMR>%-PewwcWA:%*1!FwiJ, (87G^ju[C&/FYfz~sf^mdIKXUA).6A>ONEP3KYTS_gjq{gprkszaTLQk~"388#+/CLA>8bI*&D^1B1"LE!)9UTMLF1JlyyVNJCFN7&-$ %Aoyeku[J?BC@EL=(  #&4;8GKH-te5SA(;E=$;GTo{iE/!wrfabqoz%;$ T"!7^v5tgg{zgq7+ %TyzTU@-Se[gtgcH.1- ;=BO>/ +C`}]?('M[(-3'Sl!.z_aiQ0-Qqc\XKF+ ,'yz xnh_j}^cj[GIUp"64(4bj_g_JF>=/- >_ryfTW`g`S@1>IAGNFNofSA+19AGZbaN=) '&#)!8`p_VaheUA) ~~sN898CN;77 "AHRv  !%,*$4>)*& 2Nayv~}~jp{~wzmZGDB@=[z}}uut^QD*z{)MPMSTEH8 {aP:3(*05;PMRX__Y9*) ?^gjUA +F{]?:;Wlthr23**1 '"*(%AXU9(+ /TXSX_NOhjhtw]MSh`anmENjiamtdgtuahz]D5! '/*$-76/50$3443HRE(!Ur -vM? 08"$H4    {tmP@C,'BUn} }|T3.Md{2`xompV;8KOKUQE-1>SltS)Kfv ]==66yhKL1UAD6! 7U{ 3)  *?CQjy}W5"'  "($EstfbzwumD*8@07NSdxWSWVX^@4:6%B1$Cg`cdiu|e`vp_D/AFA^xdcgmo}p\@ -K=*8RimcWUH[^6 igipXUrga[PMA=HXORt{`hpMG8/6WSKJdr~_`zqWEYyhJ2(DSqvllmnjb_{>Fkrpn_XORPCLm}~ 2)0Xi]MG=F;2.?]txw]NWwh=06:A>+'.9Ho%(vxgdXfVL[zfj& qsi`<"- ,>L=WKVH3& +>KcapqkgB ()'PH3!*0$#(<Y^=?CLAEF8%1?*" $(HSFVZ\o{cDVoyi]KUapc=::&:BWo|F53#&' BC-!1.*)@C'"667;F?: #:URDD>(+Yru|aKK9((%4X|09PpuPF5tzO=<<1*2NXrnta" 0M[]IxWKLCK;:WvQLD/@MW]fe@@i{\HOOH:!*:Hh\I+/8@7>>=KVMPm{  !@ctdXGRJ4.3>d}`;*'BZV[zlptf?IeJ9Swf_WSK4(%(24Mz`;#ytz"$12  &,+&*;S\I,$IpeZA (411( ^CGH;Lamn}yNPJK<.M^e|~H0%$".64>95 #"#*7Iq{i8 by}&0+7>@B>'3Sjxsjap~ tXEJI\f\K]gkyV?Pz|L9->^erzweK !.MUVN_o`]rjf{xL-%1;<.zSEOe'A^da`OF?4  yl|td'9SIYNfcWK&Bt45E5 0#+'99N]jilxu}g_hg]hqqnyoXH%Tna@' -!5%123(8PZdF+.6-)1&$38-xk[UyEG=+jH"!9mxI78@EPg|}'/ (&MYT=ElyekkrT=`|yyYRH! `y}pH3=RraSVz!@iqKAHHh[mgZZUHA6EQXOPSPYR8*5&,?CB`w{ay{ 002KaWQjplm{|xnWC96GBB990Pu{tf`WOHWevtcW0 =E%!)/$*4HLUpvt~Y"! g~q[d{{ 6<&(A/0$"JqmRA/20!0[oJ<UZT`}}mQ.-2F[oyeH?UN=#*$q$;:(B]xc;9,1J>4.(-5CLnq]MM[yzlWL- !56|ca\KGTRjUGPi01iSYjYDCH6B^LPjmc{  .) 2?66BOE7'?HNVPNkza/ Epr`61*! 7_jxsV8 xc]LSRgvhx'"$-,%- (5?HN?!wu3JGgmchess-0.29.6.3/data/sound/8.wav000066400000000000000000002117141323660377300163510ustar00rootroot00000000000000RIFFWAVEfmt DXdata/9( & (*+'s]^G2$ '?X[Uiske{u^gmacluvxfejck-NgiS3%*+7=TR]f[OPE-<7Ipym{}dWvkOewfBEc~uteu~~nQ[WU3&7\my`?<>F;) F=EijVN6YzwK(lKZhdecN^\E #0\jtoOFA8/-h|~j_SA4A#%71Qc| o? %<;a/9(+>=7@_}_A>7-&6G<)=b} !.9=DCE<414((oPINF! E`bSZaP$ 0, :RA. vbPSVeh@:;)%Zwt#&**& rnnx 1-3Xc`_roF &+.Fa]N>::)7?@8<L]\OM;#:BKbj]INc`r~yhfN ?`q}{PjD'6Iv{WB:>)2:DPf{*5 &;A;PpwccoXRrjNTk[J- +LV^  R #5IRUijT=HOM4F`_Tcnov|c^^IMMH)*) wa?*-AHABZZNI=BP]\\PX{n[[XCD]| )!{uX/   .PazSDEBI>*4:LONbg):Bd~xR?2) *'(8Wf|^<7aoX@8HVUb:2)*52  PO@ZtkS'  qH6:VS.rNp{E iC&Vh 2Rk|qA99&/A/ Ktsz{jLTQ=8MV?-0=515'9Zra9) (RZgn- 2I309Fw`i|i@/FJ6&(&Q8:O7<0#&,U`nxiqgN6  #Dy{ooji|rP>7HMdiDPVbcROYS'*AE[|"5C..1( Ie~|j0-2-$DYWXBQ(zw}[XanaR=Tj]@=$.J;4>8  #??A?+Ae}NSs5JQE)$5\~}gRd~r\O+,>CM< 4YxgZ5  <71,B_^KM. AYH_zC=Em~i]L=twuj%U[<)QLUbpLEoaQJR+$Fj{cgxc`O08PQZ~qp`{n} 0RU7=G(&% *;.754$+ - !1J\v|{rfbnn{pgqemymy~~c?db:!/=EE)WMVn5@\bHF^UE8 3J14MU'v^& 3f JchSMGB85.Tvxuwg_E:&.;bx /|lrrsgD% ?ZbPF?RX[IGAVpsdwYzhh4NU4l: CRslmy[%&3) '.."0A:#"7@EWz 18/,CUP!u_~>_brxrhcB7INC?FXP98("=bxxo_Y^TA78 2D<8=NRT>I`bbzcE7 0Mmx`MbgkbekhZHQT9->O( 6@<#zw}xvYF  0?b}?XsoB$K$&Nf}{w{\:3Wsldpyhda^n}$ .Vqsj{nlnV!% mci{y"$(<IWRdoU>?QL<BQO::?=EYdVhtc=BH>ENF792#2B; j+*ZmljG(/.$+7>?@`{^POA-;40BHJKS^lvxqlQMS_\^L.!.6.-:=L[aZH`SA15&C[Z`egp{\1 -9Vwx{}g`B4- , ~olU;% .GSfy-DekK"2DjpeteZVE0;& /Z^UxU8-  %JQOTWK?</07  sI=8>3! 5PZ{uq~~vw8VBBPm`TFb}xO5091]`^cn_A3!!HkpubE 5R`o.(HO<)1 (%;. 8>CjrB:|C\Umlbyke5NjwD$NbH>2AC|Y?HC@[a]^jeuid20>Bxm]QB<(1Mc_] BRB+Ck^. X>Njgcs+%+3QdF(21# "6@F\_`uyiG) *EHZ{ukq{rdUdG1L`90 ,FcoI+Zzb0Ej8 $6NPWL6 to )alT%IiV_<U8@)" 2+4(Z{~o,P\O=fS jORADPRy3{.L?/,epPEFQmt)4366;If":YzNTC}a5#gQV BNd_Axw|`R}c^N""V^'4?P[r sWllymTQU5zkui)L1'`HNAFJT~Y={&\`HlMDSL969 vJA o4WM$>, T[Y=rcpm)@k8gq #? v%np3}Q5%#a@f)%1M,Dj'68Wj7eo 6Jw@'=[44_G'{V$puoOSXYQ6lq;8%'=2mouF x{~@ 6Zb3r_M>wKftKTeb=t])_T9#II  8l'FP.#.:FHO8CjrH U ~ q G#alKmD<tQ,7L{sjs(p(g;wb& qB3 Wc )D^|4/]Fk2/ C  l P _ Ueb\afnQ?gihO 6ST~Hf /8"#"!\T C3JAF AH?2$9fWW z < \ w X i i;|w\}2p:\jF7L t O ~?!">!C`Z d>hL{G0D3CdEq J " 6 jhD`NVc`[osae9o[NcDE{0^"$%H%t#Ah P2T@,@rdmE^WD1X 6 v t ? vZgQ|O qvdgNyQO6r& )SL!%_&''$" I &+KBo]YYqCB}5J.E@b d l@ Q z0Q0s_B#3)uo) =U2 s l $L%#"+AV dJRm\G:Hi`^Y|CkUv a x z!C  ny5 2bs4-6p B-\ inBs ^K%X&&&J#ZI,  yze&ߤ sAn(~K R O~o O v 1d V 1Y_w'Y -H8FvH#5 S+F0+b Ut < !#&G(%#}!W&_ 9^R߱ޫ]DPY < 6 W F  !UsiN[d  ' Y5laY+Wyl]Sm ! I'( ;c& '(';'# G/ީ\vݣݟ!n>SdV|wRL EI D*Pb{L @aFLQ M)<>E [x9Lc/G ~qsa.7!p%&8)+($)#Yq: ^X߽gߙ:gE" g{R.Q*'~8)7 g#~Zn L Ty*a+)=Hm!GzwE.jc} = U!"(,+1+X) #A ?ܤ\ލަ5VI!aG `PI9:/*x}  ?kBpU 73{<R\1*ߜjnP% .['*s+ -*%" >; /WH܄6`C( [" x2Zc6@|0 " 2:^ T :h/rG /n 3 rPC- ?#%)\.[.f,+U&L #9f.V]Fr8k!Uy/%b+7ga7A [Db}lc Ec|?m9J`4|orOD^-U8 -x!'+I,,(,t'v"  @oD]މ$.7h|uP[?QO:f Kyd4X g AMK2zL:bs ަ~>3Y-bjC,\#'),e.+)6(!H z?t+6`߰`GB<e! id izJ  m V9vP% 9 |;`^~|4-"0>-}7_I1T8 &9"&+-.--O*#g ,zet@ݵz6} >KVMjLc "   H']8 t B[P .nnV߲LܪjQ(&+,./k,)'B" r,SqߛSf{d@` > q&XFv n Htz   ~e Vx0!iir [+n!1{ڻٿٯ8ٗ. #&-)-.J-,N)n!6 Zi0{1^jn z | `I#nnRE8 c dBiO |  ;F2OWb6B)YK% H 2R_C9`3[ KPu")>-H./C/*$!"Df 8qo\hm2"w vC3^H5 lu*p V #v `n t " 2 a &yBރm4 ْרqrz C"B) ,-/.*=(l%n@ VJEKo߯1Lw  T V  Z8d_f%y [ f BD6  b   v & 1 Q c:[QW\֤0 !|%c'+-4-,p*$\]n ,HCG[w aY=vi$ t >*jQ,oCbel h@3 `gtH;8F& %  S f ju@rO؃%؅׾AKs `!$f)-1/. .)9"!7 J ܷ{- IU  fu}2Pr4cV| @Pw=i 5Iug<_  i 6 %  c@F`liۂܞ!S 8  (`RQg ]=(GwX /ghmS6I<(  } & C~&-az fRuA)֦H~2]$-2345u1Z,*,%> >#1i |WX U ` eQpEwts GK<sae pPPo P/ 8 k  Ԟ,d΂ё"ԝ]8 3 *K12{4@63i/1-(?AHc޶D7T41,\c$; q 0l@n"79Q<# *1Ns 0 /  R: z ?xL Pt߽ѢϠҌLԛjU# 4p&~.02f541.,+!" "߽޲ܼC q g `D~V2{p P- 5\k  Z!6X;. B v?:щ;I!(wKL  )-/W23b0v.)+"oX xJMLH l>V:* ]t a y 8&F~J DxhU~ e 4/ۯSW"iͦIо9ԫ@|y W *S.04=641_.& Q 'mN6-{b299j )9 d U hm7  pr  nt vs\iq8 &D ] }܍7ѿ>2bcLN/q k e*!/14641.%-P VD<܊غ׀)nY[IB +` & f+_}dO`GC CcQBZ< f j[*S?0J Q |Dqz ]I#|ї=(\ڌ  )./26D4#1.'jR Ej&m`jj.T" % ogM{N H; Bz ~w'{ fR  9 ( eF{iμ5V+6 ~&+.25"5!306*I 5M6qWs)ڻ0ݩޯ(s D Y I O j z17h# t~W w T{6GM0K T!G ׾Б˨I΀v߅dT&,.373742,"t4v`֤J,޽2 C`  J t<%9 2w=). z  -0o ] /,f Y !&k'*]yeoiy V%+.+3I87\65j/h%d\rdB'~^H אֿtܵWi.>Fz m Y E}/4rc_ S ie0 s!#*s 9'>~N / DѐʰzͰV[ F'-0X5G::8K72( ;& {qڤUޛj*3g X x9=T}+% z|X ^jGRזE܃ / k 21!9ZHY & 3\kkI  9 x )2H _Kޜ"UȻCŅMˆ'ЖuM 2! -5s8:a=I;63."B'if{4}E?d׷ޓ3u[s w  z c$fC <] > z (-B + FKn|s [Fas  L /f( -8 $R 22MDM Ȳ] GZ|)b %@067^9N:6/0,m'}L B 3a}[Ҟ|rNިRI  "f@E\c ^=8"a ( 7Gz1b f7% 5 6ڨSB(ɦ̈U:DQB!%g,5z;<<>='8=1w-c'm 4OSӉk}s_D d h) 5DwyN3 t. { [P^H< V%0 J MЖ~cǟ41~P؊X #'q-6W;DN~oQ %j*08>>>a=6-k(# ݙ3-*{) N t c Mq oE| ,)D g.lUG8Yt$ ) 2=  z +ŭHɟvL]"T \S"u,O1S6<@?k>;3\*x%k  8` [T.ӟu^B*F/3]C :sb 20i X"/ `j[-KKV  FqjeʷȢĸ`/ ln&&/37=8>c;:6+3!^ ]%շШ> I3s>~@   n379,_<& ew / G=pp=Y M.W  3 mv wԘʹǑ!Žƿyӹ')F*4c8J;s?L>d9Q728&16Lcڃ 8ޞWB`- a  i-j7= "oP*!# ^ "v 1uK / ݹΌǯ{Yn ιϕR!^>!n'2?;=>A=Y74t/h"T5 .-|Ш/ޥEU# @f 3yt ZmZOyQ b\ oHeYs 9Kaq m ((7Ô)XҺ+gD94#',D6D=>>>91-'Z ؙqͮeԁ?SK^  G CRkcao GeZjl` $/n(  1=δvx;Y%W$*.3j52,2(D"A0 nth:M/(-۵3" &C ( K=":}a\n 3_dD JY (Ty  KUy f #e؉jX2ǩɢ طyBY(36:V@@;r63,W` _A Ӆqg` ~ D AF?rR#6[(kFSiA lCw>,3DM` `Y@RC]D?::S7y/ o! |% ARСBn   }[Jb2E- ]9,OBL BOXq 9Jm7 = XKxۯ̨./ʎаڐjz#+,/5?>AMAA?6W.*4"{$ `mٮ̋NEW\6 - m$eE;X0tWX/2.i0RCQF* -*M 0<2V_e=D5 U#$19<ADB?T>r7V* ; \qH*֜ўU!|߯J hl "  KN4^ q|~ `PF)S` 04=rD =Rkٟ% ĺ4ΆϾӼB @y#D'_0F;?@HBZA:|63)Q Φ>Ϥw N;: %  uVOJ7? -kP`in +}u@ ,E \[ q_`Sɽ1od 7+26MAh;P0)%QvqBߥR@;dsX(5-  %Oy"+r>L G 6$  .^w/ p - 5a>E< ٷ,*7=F@0CB><8.h!|dss̴Ja =.CpwAO 7  40Jdp Nw n RIB}^9b ccjY y  " ȹ/vVfa y6h#r).E9>ABBB.Ւn͐d֕ٔS$: [J~ UttI_ 9fi' GE s[]K|X  z  mYZSĞZƦlͲKs { :X%}1i:=?A8?R950;$s/9oя H   U  Pqc V 4G_zj  ZFDFT f7 " 7 [ 3ԍhŻǨ˲ נpo( ).5->BB!CA89E/*$x [ |ϫކt6>8G  di; @`5EE# .(x2M\?  uUME\uY' f R 6 _V [Ƒƹ%Ț[> !b0;>AEE?<6)? :ؑUDDD@?8)  b Z͌gIn5# AJ  vE I.P&[@ $ 2Z&{{L{ M"9PzZ86E K ' :Շ͌?gЀkOlw$.9R@`ABC<621)L ` Z:vϐ&JZfO  u7F iIyYh~y A<jA:  f5 /D<Ƅ -58>oEnF{DB;-!% 0 b&3a׽tjH?F7)K ~\T'<|[Zz%W -?, };u}Ro,? +#Sj =_ޭeѲƭEru'T+U9>@CC=R94Z)  oΑ͐ k@BHv5Zjl f r48`*tJ ^ ?S=W q 1}3   {&E~ɑ90 `ט Z()0u4<EF1FD;0*%E6Hj٢va ғ nuQ I!wA DV#%mq,j\I|'T i?>tq:(W I ;e C/%kڍ½JDH# 9 Un"/;*A(CGnGB;@;,3 kB͑̃ >R  h_M O(]Q 57x A! V;& .\P(" efY 9 " XXʃÜ<(dǔξ^׵  *#0A6@GHI2H=C2..(V ,Ԛl-Дт( n Dk L AcP$"x ylV_ * tU]151dj j (}ޢ؅‡߾< ΄;i ^!/:>$BG!GC&A>9)}& sy^>&wM qvE& 8fPza q 9L<%. =dW M @!g*L Q  ?T[|ʮ(#Ќ%G])~-4@G9H J!HV>!61Z((P ,z_һʳ w G lh 6+>(M;| y,ese xa($FD  g  )}?ڀͪţě3ml|a  !.7x9L>DDBm@=7)"$neֈ`߁3AZn  ]h  }7<: |BP&V" q[0B6 - <(f{ӅϊCΓum &*3= C^DFD;50F%tV bޤˣ;{7 k~(  B u 0xTjCD/d :k(%X  ! my5n(jĐ`8DǦ8 T|!}.68`>EwDEBUA7)#0< zԋQйr. "&!uwSU34{[ \ hf~Pe D-G~ hb1 C3Rߨ%ƕĽ1kɸ^ϘnP!&60;?3AElE">Y94(xH yI73Ϩ0fv 2, j25PM N )T~  #Z* Z  Zpʁc­-m)za'.J2:TBCC-C;.!(" ,S{ޗڑ }we-hj  x [NITR)4O t~|Z*A q0 8c}>i&3 Q (w <'ģÃ6+jx. !Q-V8?<>DEAJ=7+^ -z1-&ӡjcpk6` b |Bdr#NoI1 G 'h}Ej Y upk7r [M X P XԎ!id a Զ &+1Y;iABCC;2,;&#Ii *eΌJW60 l R Cp9`?yImk]}|3c } 8u N 7 Y~M O QcUL۫{h•Hl>)36:=AA,><5(p = iRA ݩ6$'  " S 0H#Kx~IUt ;h L <A;16 MO}(q2ìuɒ֫,n u"&.K9?W@BB;84 /'3 VJ?;j3,(Y ( l<ӭ؞PR3 a 1 x>[ s)+ l!\R \ | g `%M|;  r k ,,nOH*BФʾz<7O W 'n/27[=/=;:E2&a!mB |A;х`MKY < 5 _( |.3s ?iu(C ! 1 q  3  V k 1dǣȾ/U3Z T9#)P5k:;?Y?951 'N EN^S\@ՠަ3fo >\ W: gMT[M ! LC\z 4XL t wpGmb% V C U ia1S(М̯L&{̩؛g|M& +4 >l5} +- m`z! M 3 rVr8ZqlA   j //\ޛ~eVЋӔ 4wx ?#.'h+25"5+53-&# 0o5{Fޡxm; TL4@ n"zfy+ ]4B3.'5 0 lOn,?V Biq^߱r̼ϊoҞu~ *$-0i371854/&KA zmHZ0`>$*LeC @P++>6A  R Lvrfv@ ZK%<h&  1A}V/V{z9B(ΟͳϾt՝'z2 {$.040567P4>/:,' 0~6IxP_~S U Awnx7Wn /:<yD j 'J+ Me|CVvO\<֖϶aгA%ud2#&,3556h43-c&""x 3BcrUG 1 " 1_!7qw(gj E F  N1<%Q}7c%| sGOίqR^ g`r ? )',HD[nF@ud;<8s/Љ= Tݤvvx"d&[,356 7<5!.j(%   l0ݳJ:MuNL 7 qt7U P/GKf #WONo j Sn 6:*b(3уVu{+) K !F( +/45@4i4/%a -eC_bpR3?~RW  ^OT;^W3~ y/ZbtKPe 4jx k^y"  bJ}/1 A>Ѡ+m֍ߏr":,s1D2u46w4N1/f)'[{-^jpFz6Oh 9 { RYc VON;Jn; LYnoBY:=6D`ԲׄنmA m&l.12W44/+9))"Esn%Bߏc8}t$T7U(;S K$$lfa 8 Tz,"~b '?pv _>qs֞sJq%6uw##',24451*$*"p @y0ݮWi F-X1q Y\N2 uB 57rT_t#\6ՉiO&1Ր   R$)z+/3P3/21+"Y/ XXdYBgHsrp7(:w))$J ;Cg6  9 .p fGwj9қѱ ,a,~s0 !'*H./_341/-&A 8$4eIEAk4tp ]i&*-1321'0X)4 %nI4{^2nnj%/'XyH| lUp&d~D C+1(_eXQ߂ҭ3ү֛ؤ[R_u%,/0>32.,*) ߣ)39%\=G][VgV &=8 1} j ` D=Tr\]۹O ՏfԻX=(b!$W+#1123%0)<&e"{ VC\h$RoUlY686\xua sd X} {^\AYz/1}7l=ڈpӆ;8<*W #'Q*#/L210.'t\\ހNZle][493RJnt{T {\( XQ  $BB,]Pc1P( 4/I؅' ׉MGS #*,.0/-*&orrT h.)SdDx]u,0eM @HBy8htk  <S0<#/nL6,5K0܆[ֹՓթձ܏ [C u#{*.2//l/ +%"} d(yc?N8I0i$5 y1&" @ Z5w%,95[:xsUQbH۲M1ևՁܷ֮x*. ` .#&)-_/G.q-*#9 I}gR1 %-Q3,uahe[( g j,6%3d V;\?5FA|YE*%%ߝ<׎r2^Iڄ N Y%+Y,#./B-)+(#9 flE~-&;YVeu*'<'HbTXl =AyvL 1 .o-7V:45)t\o=#'Ր}(;MQ oP!y%p+-,T-+d%? SX %SQZ]-@J/ -H*x7EIK: L~UYCT  0L=2n3G4>-a֎T;> !&P(*,+J) (H#Bd^":6[((!#@$pv ' [-9b.Z8{Jpt 'ٖJ;o> /'-)!)):(#  H <Z"]j;rl+.U"Q e_q%  . gdtfxAyZ@Jkb@k؊וڱݘd& Z L#$'*)('#f ^ ,- 6+u//ngXp{$| s pt9Y2 x8ryA$nN?R,=3+;عسWݟPQ+}T#%v&j'~&#!Mij. MTz9RFvUtmVL*bq[m` %3hdJ j WE% 9_85&Z>ݹAڈ4S\$fk) $(I(''-#W f;OS SwF_DfJ-};wZX%( xQ z L NXO<*^ Fm\{_re5ܠ(P-< !#$&&$#!zZ ~i\FK6uA ^?9e| I" vFdG26 C $BLvHO;m:C2Iڔ;|*R*v` $$$u$e!-j r KJIj`LF-Y g'#c l b|(`  q&xA/U;FL2]zܫ[ߵy6N. 7 w##v"!lb 9A! ?G? M -q x F7CD @ *q YMp}*d?P}J lޙݓMvI\9!#$#`#V V  !}qRs[x pAt Zt+jIf 5 q //6f<5rYA~toi*t+ ~o! Q6\XP ]/Z-T+&UNFKRb- FE^J O  9[Ey y { k$5vf3YaW4-pD{>S7*$u $} MEt  =g,m5H z~/H^(<@ f #  Pu01O]Y!bVH , W . Mtd ^+Zza KN!r=#Bw.6Yo r kT  S > ll[ L$6A2G vj; *BJ;ve0 )!r8NuwP( 2_w  ;  e `KE {I\end n Ud"u2u l;K?  Ig%u`}U1#DHotrNrE5b > R ~3"_*MUhPU-)^BPp0Ow _  +JX1= v O5PJn|cyizrFP$>ug`_) K B  (vnrE} <&&Jl t <? 5$G1 7 <_2'I s[Y;`]WC(%A53 6 D  ' # ^ B 3 s]VP/fVi[%a eiy+l } 0'.d ~ h Fav3&P0o#re7 '^iC~ k / /i6_SMXM @g2!W^A/b] e<7^)/ ; etdi)E ;s)!exJHe?b1PwaO++{3r-noSQ_8y9rikDAt PBA  y 7EEpE&:)"jj(_P:X7 <X@clQU7x[D.}^JU.mI!B-r(Al | A & X S r vGze  qvX8Kggee!GR(#\@vh@n.@^Gl8&>1   G 1 R  o@MsS FF/!:V3;mLnKuy_C$NWb:B<O7Q L?W} +l T" t0jp`mU{E&J*c E3W4r~'gf1  ).Uc?N-#F;2KWXv{T3OAK}JX^=Lh*\1C,.D;w|8GtkWS]Q-Ewqya`aT[RYE&0)vWHR! :i#Arl'6wLG#iooJ`wfh{sO~b |"`U=4>zaOMj]pFO>:^wrk|dSqw4jkyZ0NvOH{|7|j@&lG= 4 66\B*G[E+ !*s9^\LFCdSbjL;G -u0U7aYY}uhx dZiV-Z@G9!o QhX6qjxCIOVr}w/w )/QO%;Mn+} +B2:2+I0jl HGfI%{zuf,r tt~h@]!>X'*WM/(&Efvxk%%Gmra0cI*gZ}$o/-UB49pd.pqkwYChy2@98NJ5,FXB'$(hI&4? I)f0 mH/Ca>_OlxL 8F%p: Z}h&zxr>;*!G :bdd'5F3f3{F >LgP_EZ 60 -Xtm 5]=WXA9Ollsq]T+j!j [!@*cw9~N)OB3(Arxr_3^IlD./*"# o'lBAH^~u5le8f4cA%1RJO|Je7 ?NP.2CLPkI l u8xcT#J ] '_b92CUTAMW^WSp\cMQLIS\KV>Ii !a}2'._^OVpdD.`8 eGe`!u(/LHtp02MilVkX3upYbtaF6Qm&c~2H_}|n }d4!2AOFH1(,! |84[UcTq'1=0j7 87IUJ,  6]twg@DU7zdyj+|qlY^K UWKw[`]vnh?] 18=6%8{-0( #@BY 3>Jy7$0o9*jZxP'Gy{4Ivx~"#(TwpP7s?*GE rdku$iRb}Lu5r,~Y184z`C&6T>XRr!`)UBHXw ;Kb!6p'%!;<*8@(MiY]=(Jm9hC_=lsN=s*roMSS;4AGj @e_ydkRGOm;\QO4 hNYp"O!Ojc}oz~D"z@sMLK>+*/98e$,JyucsBx (Uh wD#*%05'Iu#.:Ok.8mv_4,>?P| :n\z&{?{2 )0l82A{ EP[,pRu, uzJtbG:JP`Y@^4ZgT.4$sg{ FRC^+S Z0c<$_bXw} nJ/RBw X'*8UFj2"F>+8Z uPPjs|mpnD Py $3b2o=$7/ 0M^VfdqZG+"jb} 7}5An{]]b,y>.6*!. @MCX 77($7G/%*tZf )Gx}p8^eF\\\PhBw]gl^JTO;3`\6HB. ,??@L[F# 2\7VSBEQ2l%}`dtuz h *7#8^GQF8Qdq2gxeR:&/S~h&~_r|kw\Kato !1K'6?G67)-GXd-fPM3Mccak|vv~n 5Nill~o[$ H^qvCAl AFnM@{q|nfW/.2:8Of  $U"zwhVr1a|vjN6 h7,2L `zdk|s_H4 7~vjx-\zzmQLex2<BC}na7/??*6;Ni-Vri>@O\_Km @oX4!sUN5 #- "#&8<%+awxnYmr}XJbxn=-"7wmm[D.], FjxW4 GxXO\YOXfwseI.4^tdhzw\DAXnaS@(j_o'sY]b[w9[pqL0=F),3EH7  )+Yw|{Z1 6$:b /B[sS1{ovtr~n{~P&%5;@D)|h8b5 $;Y =o^Y]`[@ $)&1\u|}t 6G\|sT61Eavwykld~pC3. -MocYB95'fjh^t{uupA%%TL4Fte@/$%Lgzh>8JC&4:,1/8Ogig|5;KqvkB! #" KpwtaWYckyxwurujgtvhh wZOA59</ zR.*!Mf PD/))S1+ /+AZtr]96(3Ng^O=.(7H=Ba^: (vcZP7:Wl_ /*(.@>,'`0>]o&@KYsxu~y`\bVQYE  5TQ@&-$~~lVh *4=FC2ERC3C8# !2HJJQ^dUONV<3?DZ'EC'#|jcn~wp]XZexzxnWZR<(% .#{uy[XNOYs|f^ehth][> & .==^syl}cFD<''57JqrnmidxmR/ "#:IOQxwvxw~3]hW3$$lukF21;S>EB0?8-%,,'2 "IfxqSKQ:.@\[IBLPX]SU^eequuogk Fmu wA"sm|Xgv^BANKK[heK0 - -2nJI" =Sh yB*$|`s&#?S__~}@X<43-,Ay\WYT:IS( ') '9W@Ce{oZPQabbf[D?H00<HW,JUK1r:1WfaTD&5D'&LV_ld@9N6 26)42:W_\gaE-/ksokxfkpp_ZPJND<>Uoqyqwmod^[ofMNjlpkQcnp|}~  If}|iPSZOR[L* 28$.KGT_Ye]JGU>.;S`>"  #;D\nxkUF0<@  5CF0vfano~&;Qlp&{ut|vsi~ ><<LN87.4A"jH5>Q^z (<I@/F?7IgmcjZ@*%GO`\M27/ $E1*29+4[^_\dq5`jVG:)$- ]JNSC:A3%44?Z[GCO[R`s&.=4 ug`S?DbJ c6% /8:;_ =!,( BPC. vh]A" $Ik~kmqkdxcuvmLG;+%-:>FC) n] a!5?R>, (&,Uf 0&hbc\Wlz,(!'* &8 xfmlb\iwcb\J,35*.zpO/%=3**.L_wS?*uiaKL*)2(+KenungE=[p,W ->/%ikbwjucv*69NKF@GJB!"0+lMW_<**)Dtq}s[XKJYD &4I=@ag\ftG, lG.#Eq/EE'",HTE-XxhZroFJhUJjW#5RPDE9& 1!5I3&62 8=KC.)(ocP0  -=]zzYPWO@NUMXw|nj[aZmZXMXOIYf^bpfmRiassrtaTB;& lA%#-4v)&veX5>8dnwZwzq}>A/.?3*;ld?"@:=HIC\r`OW]UPdpgr}\PXiV;FYJ;4%'' 3s fe9 nP4105K\|Z?(1H$A[TAJexghteN4sk (IVZKJy|anZ\U=# =HU|NRYjx+.5BCF@ObejxJ5@1(<805^eR886 T]Q[xf^I11% 0B4 P|oT| vQ+#=) O}g[QF>V{hqbYldZXOQ`RQh\CS_Fd!,)6 #?L9$L62$!(&=lo_`ryn_bad{y{qZ9,1KM2Xw],uiU8*.>LO8'#%K_8'7GXrgixllswcevrz  ?f[MC= (^,7 wUH8)$!%DhfP2 3:<Yn[X[A ,</&p;&)3f  KE2?.Poi@+=`v  yxmc^>9C<zv_\Q=(&%.6'':Wly||zQ2&4IPebrta_i:;':SR?0F[`hts  $7  ylf6   /@! ->1"#s]z %?2 kZethV3+9C73Oye@@YWOe" ERI^f "~~egz\QH)2<Nqs[5|`ff]hgUV^pneW\^`dktX^c^WA3415Vz{iW='Vf!>H6*++0 $-Idq{ueY7%79@Vj^F%Hb]b~}dgyyY@& KP]g}d?F/$Dwv\%)?UVYfyi^`[biWE5%+CFVyz\WX_A/' 667@:?SL=?DABI?3yjnWbqtznfp|jhL9?CO_]avnwzqYwsrmUg|gNI[Xkwmozyle^qulc[P?2?QUXfa\?%+* /JRt vnuSqr~xUV\kY7,4i{ksZ6.7;UGMYo{ %QO;/*  ggoseE "VqZ45IL/&F9)".)+)) /UYkkI() ;ZWQWYPFgnUIz|kjk`ieU2/#yM" )Ft,833 "?Qgc<'% veL93B]yv} oU@.#1+/V':  ,.(HhS<flgqI:J;BYmnjZ9@QA>QZv~tvo{^n~wfk|r[_^MHRG9>=.'*;6 ?# A\jzvxg[J<1/ &$8p~fP;1ljjkgqN=SraLdutm|y{|w`+?juTjvWe";8/ $6Wbv^O%!:\ri\O9,% 5D:;, %C]mx qQIWprj~jJ[olb`F4"<4?ELXhquE2~oW@X|xe|nbU.VxjY))6.%7=9D@?V]) 8cxeJKSB0# >/1GLQhy|gHG.!,$%hPWX} "5bwumfku`@)!4C8/?O\~xyfD<"{r)*(, EJ^jbJ^d`Ss^MEOA8Kg[C4 "6T^W\fng_;.=?+ -$#. {uH $HUf;m{|x~jQUB+(#  :TnaYXNPlnk|   uh_URWS=$/Z^]Q\]R-,-sj{_H2 &;F[vpfejyrI8lu&zs}qp ,-6WkldPM_ZUX;1TtkwbP;3E`q'=AIYP4'!+UWGE@641 ()~vS..# [' 'I]SM9 %#,DTly`Rhz{}!-$+6'# ! 4:A/$ $$FM  0=@70+Bdqcf}\94*5HM;9;HH7@ZxueojEGdkn{rinlsy}yT7__M2.KXm"T}dF=% hA&'IfgcyrO12  C^ar~y/>=Lt{dez|ihjQLA(%2:.0KVcgea^<(&>GTOceMBboNUcT4+?bomL//<%Y{\WrnI[xryrsigdN>." 0(;PHYifUT< fh~%32" "0\e<.*&nUE[`amy>JO[`]Yeun8 $?9DYtg\[MStY2-#!$Ikkaoxmnm:05%.3  "8KR<8Gao~hL?5$ ro s]RVau ZQeifx +@_mgetwzt}`VG6$Ceoe^bsetpkd`U@)EL[pmgui80#$)%"APQH81$pB)!'4W -8=QA+{iYej|rdtwrmZ_x}nn~jE9#&,!Rztplbnzh|V6BC738?Qn  '&2A* %A/CQF1$*:5?`d`mvsvzjQLVjrpquoK=CI%} '5+;QH)58+0?1!#2HR]ntp[Xgq{~dQEGYq?[h}}p94,   {jdED=0 r}{s~pSA<gmchess-0.29.6.3/data/sound/9.wav000066400000000000000000002420101323660377300163430ustar00rootroot00000000000000RIFFDWAVEfmt DXdataC~| /%!);LD" !,57)29$+6DKjttHED%  Fgok|rsbKazsqTF?FKpkdXPOJ^ymhvjV;-$1EJGSN=4MNE<IE8OOLfQf@FIUxiS]oqrfdaH&/Iue^`P>;>$2E\_pw}lYlvj  <XhmYNNceR>/ .St_KGVwgRQmwmF'??1Jki{jaJ"(1@CN]f|ZALZjw~]RQ`}bZ^3Y07$$)BMfgZ[[HMdv}fN+ %"&5`{lltYB# DTBAUmi)EB+T9MXA$psjME@0BD20WuM 1FNZbS116 !":M=<N;33/ agz6lc6&' qe[L3E]\e{ZYq zahkqu|+-&64.=XeRGQ;8T[>.!Br~yuX/ )Ddkiv~jY1'3?JVD*:OT>7]vkYA''+%;V|[ 50 iM_`I1!,$ 6 yeX>H]pnn_iw  %SZs]MUNQJ0'Bjzsu|bXE%0 ##&(1%@* DWCJA~pCKijf]qikcdu~\H^\LYI9Ym  *ALJD;]Yr>`R=><(*-*QpM84 )<avZmos0(49akimM(ezVTrmXkoQ`{jIjzld{a0 $9.$ !%~WQjX]F) (G~x{bIlp\emnkR&%!/H\Q51376]{<0'"' 1a1>gH!Rpgm|lktyXS> .),+/;@2Ei 0( E25`O /lyxJ= 8Phkvs]aV/ $|nmKTwI1%,2/$ +QRZr~qdbq~|k7)3%^e0 -6Um{R(02Wt^SScwc.Rwlu6#5'6IGLdRV 0hocbkwgbXQp^60GHAZpg@90*% 2(3WRKS[Qb]M8Jk`JJI:$*/@guyujs`9, 7>99A[V_mfbr|hrmpo~wpycZob}cfXO61hurSFI5(&~sC,5684 *=Wi}{yre}1D8*/( #  IHFq|*}tVM5!<\SD5#!5M=?QQbrgq>  % %$*WZdo\iT#''6G<EG2@=*";@@)NvY\W(6:DZ_C8=5 .#7-/XWK:7?A41U<-S}q^M;0:[d`^aVPWI. #  %3 0?L: /)~rgqoZheNVrA%(4V|ncScwa]~'"# M5:Og_wa4 "+ #=h}aKD@djoX & "*3B=Q10!8V9 ^WvQslnl`?%7J92(#b zZXsxlv]`1/.55WV-,=%.E^benknp^ae15Q\N2RaXicah>IC "06MXFZbV_gbTDWTOwW=AP7( #* !w=I~xZsyUV2'ul\b`|rd[sbvpL4H?3aa$-Wk,B?#1`qwxM7V\ey{o}}sX]q|mnPMUxxV'#3.$/,A? $_%*Cqm t\z |ffslN:QbN/ qzl % $4pbQkt"  bwDACG{5{:6 }d(V(5Ev+h]f_zreL4tqh7@ 4.A[L G@;' @8$MJ@6+@b`8 IQ1(Li~uNE{/%.5#,/9-$52"H70 _T(YV7@EFD+);#<= '#{}q "  2d{|IL</79& (yv^\cP^h]mmZ(#P{{lyz|fF#Gm\VbdnnJNWy}rB@M- -C 00!1$"1Yhza/II 9<&<?|jqm]bY_DOu^5Jm{oskax}~1B,<8Wje{w]z& .Diya>Sj;B_+*-/#"H01H<$KV+%24RZC-,A@CjDAswR{vTV:7 "MitzuwUvrEWu$6 /)x}`[{G?SeC5n!^oyn,^":gMZ!. S+)!'Tfjh+1 rvh7\pH2^;F@8K4c'_U/C"esWor[:#p=jy*Bs U@pU`d~jx#Z|D1$= =~Vp#Sv9.ml`'Gc+ay-&yFJ& d}kuES[ #T^S,1m4dJ{g1J_*NiDnFSGJ"uVM[$4_A0EBJLt49NAOm3sE_PN+_SZ-C>MClNB<T,J7UnCvXu~fwGssK@I1r>z\fTc2!~F2v+ z^ rchWq[P,td_V@lyP!@jyp@{a_ EA?(jqMEj/ FEz(V.T|hCB,X{sp 7L:jNwN9FL_#|OC?92$P/lsync5qB^ ]ku{Rh &S~,heZ*<8~ T'"qc&StTHNd}XF$ c2Zkg>.\F6)!lrAjH[.8Z`IL#VBkYSeAL/;C:&z^GB@}A"Hb: M25%7Z"n#J%w(\Uo ym< MiG{pGrL _23~V%9pa{4-N=8Zlv1Bp  PqX prph.QX]5)N Wf3]0L(L8y)1/2&9r #EozjQYG}EWP+'jqn/z xoRK:HD Z}"SZ2)7*~YjO9ds(EZs+7t5\68q26LDsk8T Mce~tzH 3l>'{ !Xb"? i\4q41*9scb%HV0 o75kUF7]ma7GBOkx}imU@Qn!2{jk>j>"~7z]Z lg d49@NV= %wD^S_nsK me#AEA9>4~Q:,]vJ0Y(/ahz4o <}-G*ZG, coA"QXo0:?l yrWh 8{:" M e>= !.h&=.!T(Pq6%^MVe@]7je0/@1b b+)jVAP~tCCx-|c =Upv5Six.&  (sdLs:zOuamf3J7Wj*!in1NnGseOg |`9:0 Q'!]wGo9`kND YfbCJf_xy (X{CQ8xA3+I|9Dh)I2k!AqjOBwI?Nf]KCrMN9'<0I0~hE'vG E*=T<f m/@<r(jBj 5+pPd%(CGQ~fJ9 Br]Gb}:kT)}Y"?0C/@UlgstpQ+\!6E1]`uYM03on t+5R191e;;;gt7@HL[FoSE]2ot/vc]~:l|z<?-FKetp n\ce3[ddbWL*%pj9\%KxBeo i!Us+NoHQNqyyw=YPC,"mFZI1Q.aX96  C&daL*845)r_W F o0<|B6XJ};?t$; ]>+nPBjs9%u\?hs*QQpAp; ZA>k-9\F2jJQ0PDc< pyu&V9I@k#o_!>bYwt leWVvegB\xm3wzpI[Y?)xUZLZco&%wH%:\93IvX:=!{U=<}U^C%A/Em=j^|V&[Fgr%;4KsUS^go!, [~Z*"'!Gkz 7c~ Y#>8uMR!v<wFz 8%,s7F'`:!j rpOBieN]=!:OW~wi+lv)zDj%tNd}Y\4 }i5OS1ZDp&ARkkCik& wcg80;)@V(=pp]jJ? x(w/:gzF|zF2 Ob7} k s"+6L"`4sN'|t]}rXKi7 wQ@'d;`?S%bo)jj cUgG-%7<qF= oZS} 0MX?kYcbn'tquue$&j#wVMT(KvvP0,59wioUG0egd;?OLU_VK!nv7*qUUXMP}MtPXJw@c6x3=Q >]2}'7\x@J: Y!=aBrXOUE~Ye\|dvWut{RqM 7pQ;" #m[np] B/d7Gp{E }N(!rC 7p\{!GkL+} $=&44? b%# oX6d#c{@:61c'F+=o - GLhUFtN0KuZ~|8X3q=WC]+uh $c]H A/ R~%UQr`n dm\:o0J$s'W_y4Cu?e\[127209 *F rc,{wGG1`cy4&CA4o `'b47?'>^(ak3,Usw{\S 'Qv*hW#t[uw,7 * \m;?0uj6;j8,.)fA+v~\{y! 8W, 2I2 O}7'8){L)&^/6 SKj % qNT  O C S IWc2RQ$l`$"JkHO}|+g1z )lSuAM{7:{dJ)*G1JB|}Pngcc+/_' "ra W ? a 9G_ `     3 2- L%Mu.29 yapV S 4--"Ym5&ex5 9 LsdoRzk3%m#3;Et +]83w C(# W0 *k z   d =D #:%5n 3bJNQe$ 01\ TY s&7IauvUM0WAH!EXW*n7RF')^[TZ{]l 9_u2oUR "nxs 4 "G 5G" H K wW,9mA^Xpnk-qb G [zj  R YIg/dz|OZtA?  7W@ s % p ) |9 6 ` 7 v  %  ' z    ; |\<E f q cQ+*P' ^ 34M//_cUXh&W -7X5e:G8tFwiQpSE7A[ݷbڥqݷׯE|Cg?)t# 2d: - 1R7s&fuF;;6`c'Oq~L'i-tr0 = t ~ M Bo"$`#D##us+?8 !!m~ : y n '<D 0re=9*{*wڰ׵ҝzriDQS݇Wm,pG"A@s}WrN/  5Kl@ \N/Eua & { B ^rvbPf:/fZ)>rkKGrw~$CI  h \ml!%>'&)*>($" 8vu[A<  ;z#heZIgtS@zۯo PN/  u]:_B  (  |VlY#g;-]_ݣݭ0 D>CPp1y7 C `\ <@>l;!&A%$#!FZ50! - P!k' * 0 N'.F  #eCn ]Aa>Qg7,,UZ"R9 +*)htA+R:c:6L(^m$[q*00g}ߩp2=S<v^Ul G |j4wXF/ gF+T=!]e g A/swWw  8 ; : Y #a46zrg:ie yK!/a0,]cWYeUe9'|OQe':fYI6"OBbrzx)&BV Q u`xib9SI+ K3c)S { ' R+i   t  ~  L 4F{ctxE"d^~O6;68IK:- #MkriodrPR!@i/lwjcvRvgA.7 k w^6Bhz*s(wdKGTf\{  F! g G  J 3r)<}cmj'39srH Fh,bQM e : B K ^`P - * Ou v   GLMA GI  | \   Y M  j _ W  !]r'o)oV^6D&eP%:kmuen;%h HO\3P*$8!hC>iFY w<^A  \z [ } :8u ZO c @ LKV  ? $d c j V k 2 3G+#{/   Vk}|LsTG !2 ,i\;jv[ߒ,} wpRV 3)T4s-|MXeHy * C%-2g$Z`7 g ?dl];^{rjx% ] R D:>,   i !o | h'?>wZ  sp;EyZ: , _]7z}BRZKdM4gi]f9 Xatk,IT$i<&d5V}]H6-!qUOt1F>kPBc,'K%jV$eh gf8 q f( * a Z  p U a ! b~fd~m 't:\ar]r mދ.dMvl$CI;(}.00xWl0AM?2466y(A_U6 o43`%0=~i16'"n`AWIj  PzV ) {[(gcG4  ` i  3 '"_j\   +n~XA]N?1 y h X s $  : {SP'H:c%=Uz4zAa5[&1V$<R46k @XZ_N/nHaE5I[=V4  w#L \z-tTBb*p&EZ  ( J5_DO G <+Xr.6F ^ny*vY}g)qM [ h H U 9 Y@hr$ܑAڰ\ܖl#ez}! Y T .tKGS^u9/X`yQfE1qO xZ  . ) mP+  \U@f O r?g6,j@ P|vHc#xH1 6  [pUw9a. e d 9 R  rHI4J.ZEM^~ڷݦEx" > Y 2 W 5dSi5.Pt|Lm=l==YL(  E#  ! c3P|DJt\z)m8  u')5L6j%7 }dpIS97D'R[:Q)yuq r E ^  O ,  <:R*r܍Eֻ@z];/o ej5Q9V~ j&LscpvQr;?Sp#><9F$ uWR#>` R { J.5Z8 %K2[Dco!%mHx}^`{5 g I&R+V6w.7+ M k f5E+('=e 9 ]Qsict { tsVo{% Kݝo׉לۭ6LK)  i }G1 ~d]QJvR_W|a49J8'&EG$}E #G K $Qr;I QzaA97!*ET_&1,Rn : ^GK=n)W * u 5 S8={=\`@G9_<v"$, 3 ^Jykd  9 <  [cfmTVی9مE-;Z r_)Q \~9cN lbE a 0 o Q+S n| G~'- S6k Z'?imkyMu@  y)rxAPVrb  ky%!ki H= >h#>Yߧݙ02ڋ? @/P r v6&&DM q,fj:(qUw72O B r' cdK2 C'42|h vV`iC) - =  NOaS X r }c4)<"/z$KC-OiY/? 5 O\ \$ 4]Tqk,/"Vu۸Z[ 8q  q m ` lB} anA'G5-!^B]$H}^%VEg ~;_ { @PQK.Re$v,7]?  v . 1nqz8F  ww0;BV]@O7` ? y:Mhd _ 9rnnN12)pm6b&fWYJ%ln<;hF ^.'cH}3 A = Qun1Scl  d=99B{JHv _ *  m $L?"kd*'qQ'2  # nC#ep  D R>{{)ܔڦ}٤0,,j$  6DJom/uep '(LxM:C;cRdqGm"u2zn# 1 <Rk =iS$ C$|DuJ4rVg`{l  Lap4 ; j5tdZ+<:(_g^-nU t +KzH:v 1 oha'o j#}=d߆Qڏ۬P:X~6MQ=gPMJ{!8h  R){_T|-)) 0 r & shRA<7| 8qqKo7rr^ U< !  L @ + 2 %N@ X&[U)\?kUXr# +E]bk ~=X h hi_hj|ٙKFҗ_Dnۇݶ,j# T1+y7*ygtXE&NGuN*n}30G 3mL D>]%av;G@,T*xM\c0 4 / n  _}slTy rys9\M: Q X'  |3)\q  $ T SPj|{BE"y5$--ږnLk - !h""h#4%$j$#Uz^7(*xKCi@!t-d E>}&w  BS A N\fA6 z hB/0.]UW& ^t>K>e:_ {V"bCk+ 9 , f g]I"DD1>Y7O+}6$1sw\ 1%[/+ dd@ n bjzE[%@8-  QpA"KWxKPiVb,~ q L  } v EA;$OT{~[ܚB  Y)OmS  N4"^`[< rjA!a:u]v RK- - P T{lhk  h(gL3sA#Obw sDi]/.@I~ (\Ol{aZC Yxf?+I}O V (8   TxR!RB;ܕ &>W.o3 l h1* u]2&$Vqs0O78' PD"r w 66:9K& &$y-X5Oi1f ;\.s Bg v^D&)YZ 5 ^jY ! G %^%3,lݮW6.ٔU3VaK k )#++2Pb ^n_} d:g+l ; x+( , fdx6uP6% T~ q  | AQ[Qp/d;u8C-|5e `(%E7 p)n4N Rshu~4^ mݚJl/F3^!S y aF  | 0 = #= ,h2"yI>!NG&)|z0R  4 6 T 8 PgV>Ryuo {MWN+! s\HxGqj ? / pu:hsi{;8* C Ae$  , @cg = /N~)[A$SQ Gx=) *@X?Q(L.#~ 6n-I!%#"Ruf0Ef;x'DV=P  r hH,D#B60Jf1~1  s !"Vt 9  Yk;ZB05dvj>NVU#y  x N %Ui   / `u[E@kp:Sv aRC- dq"TNe(?oHAzHx gY1=LQ,C G  ' x Q j M 7<e~Kg bS[s0 ]p W4pPX/ B 02IuunFg]O8 (pG!h b 2 # 5 %  " ?  I {kwS_0av$3qP|2Lk[ 0F_ ^Zno #H4a\;Vq o),F[`F OG e ] ? v a _|=72GN]aW]MN1RbO l'k~b_ll #e>qm C1POr S?GaV ~  N ` * 'h ;(HdDkZ_BN KYZ^h= k$2V}s]ZRd*&R|Np\aIkwq$zJJI 4g/YF8 K v /-  D :Gl">"$m'$U@ X,a{W9$*. , @  !  * o | dL)2tZT@;%NbF@!U52 #zt-kuF]Qb q'#27>.N:aGLr-w  }Kwqx%'qeLvv^^/FZw <E CF @MN _ Z|Rf nrr DV4 r m u _  { , H n l D/]->d7R>dem}184 p'$ Lm_xI q&qaRaTFJ%`; [Po O >0*T_IkG/!du" A;b" 1lc I^3zF |$mo7dx$tjt I Y l8mB=zGK*   n:Z lt"T1 Rn$> 8 :e0gvR@ A/|86W%aE\ p2r.>IC,.1?ex 4 n M c w c  ) VTBShk3~=]p2\   ('.i /\:f^(eg:a5t0A G +ZI/1r[-)Qi 8 - ]*HO:2W@gD<.6_r g~~c_ _zYCzCilS~lJG2sp/R| Tr3 . * 0@ M  PZd^b_dh $LI!2P] R`I  g1(cr\>1\vEV2Ag7yr  f xkB?C-@0 O "fYjhB<> zlަޤ*KVc-_Pe R$Dw #9r$Pd:c8m/ ^K|P%p#R " e%3 ;ICp}\37vX j=o P+`{t0C 5"0ixV U" $s19SF7" 3 : eT P deaq GDcގ'܈ܱLz\G q9 # iO\zlpEb cLNQ+9]B" z z- {  Mz 6;tWVY  O7^VS, ) Z u mr?"$gqie\u~\/S:H* ' k y _ tkc U%  : l!iUO4uq1= R>zfrko7 W }G6|A k1N86CiYr! Yzg Ri  ) $ DSwQt$}x;{z8`}P=N l-"7M*3b y syO M -2_0'b)Cc#}T>`JxP1 *#WSc@)'ub 1 "*P"8E6Rx35b"K}Re  WHK|F 2.{ wF|} ^Ssoc0R5AA r W n T ?OtJ"C b/p1&  s5Dh  % 7_v&QzQB]<?H $ [ d x T,?J F Irj 9d<\Hi" v}(# R B`AA(NV0xOE_' F)ONx]'LBl".!`SX,<  -   )S%:r>mTs&-GtShG Y<F&k ;` 7e +_z"@E;2pP[L Q /S*:l aS&ILFs^H MZM.K '.A.3HtPi>07qv-!y%?Ah  ; D 9@" TRm/] b!k 4+1 a0Yf y"yyf'9*\sT*Ip  q  YD|&TpD ^M lE3ߧݒ.??J&ܓ| 7<2%E(J*TO 0Gk' E$, k+[GO8A?p5~$F ?6  c [i`},2 '  ,wUEhI{{kB@@<'q IEL!"""! 0#L  CnS5eT*xmEe#wL{r 8E7=%  !9'ld` } rcIܾٻuvר(.(] ,@!2 . 6 { 1ju_&]xg^VkU-G VU#w7 %pAVe/w- e .4!;  y  U0WHD KO x F' #$$$}#!(! 6 .HeU)6)K"a}nZ:m<OKB 1 0Oq+t?= ,  0 ܝX؂kִSA0ز݀g?X Am!!!X","."!  X }{0Oa#4J_22WfSa_qZ@p]Y' s`1PZ ;Vog)y5vGk G>5) ~ * }!f!q ^K5p*/>`l7O7d"Up ^7 f?B`_e zz;_q^/bQ@Ϛ Ѝ4_@ig + z!("";#$%%S$! 4zN%W\c)2Gn8Im78{/_Mq. 1QZVsH/aC$, a!lߜ ޮ:RI* 6|=!#x#$T$7!x:r 2W5S+DfBI47"k@<0 ? ;%5 O)  /yZ.ڵ`ow٘NtX&' i _i 4"Q"!!?" , *>,go)a:`cWjB;" v[? A l h~  K iM n#+$ pUT uqj !B##i#!$"!N " ;g&3K O&JT(_w* i [   >  Pv#<M 2 A_ p5%oq#M`&QQگqEuj "6## $7%:&&N&"#r 8b3jJXoEM1_uza0$WF!w#Up` !  n _ydJ V/;5aSu/$B` %/^!")$% &&&$!a  }pt9 YUNfJ&"f]n# 1 ] t$\Wm+GW< 9iaݨ٩&gzPn31iVX |9"E#C$&(H)))*^(# ( CziNrh^:e|0Dz{ #( J` v B }='vd"LE;q{u 9nqM!n#%%&q'&$% $!{* rz _g[JO_?fP  dO9:Pz 0 nd rSH0xOaOt TaE!#<%8':*+)'D#L N]U1 HJ5;-m%^a_ AqATKZ |M@%5 3 =RvLjwlq z_" x}"!!##;$U$#$# n ) lqyh(/st-Ddk?%a7d%V%Q   u :Hz 1dkAگ֞sӅωqݼEX2c qrX, @!$$(())#.K  o\0)Vc ?69#s+eOknHpP [ 8 J\: G~(Z@ aa&x|Hc b 0"I####"!!5) f KtE0jPm\F[#8d",.% Q JhMfz @Znߖx9R|٠ߖ0;` wg"5&'1)+*!'$vT kdj2LY,@y_bU:T.~U3J[IN  M O R AVh $  C6Gm#y7d 9_ p!#$$$Z$Q"6jho O&kVLa ]v  H"!KR {  #  Z >+Z  x[[ݢi٧%bԆdCEf! (=("#`&*,* *%O ANbs/=6#q0JAkOpzK)o&W,Xiz T  L |0 z= 'IFd@kMJ0  WG"#$%g% $"!ylU (c&Wz$JYL/]]l  } \ p  N D 4 E P ~ < 6< l Fb?ww lEN%}9 u"|(N*!*8*&G!>  /5l +Gݮi<=tK6WlZ ww-I e  x  _  5 3 Rn-o.6XCAmoOBiLBk s R!"O$i$##u"xG<F, .C@%8;xA7SW_Q"! d  Q 'M U V Y - T T h % %.iyE{zoځ9ւ֟yvS T &'=(R(#$K 'GN45 Gd4]vvXAY)ݙ&x +*}y"o = H3Gbegi9~$c}%B6.S &B9;,1l}& xYd1dF NeSD0x8^Y tnT6  k 1 +"KaZVj1j-4)#Sf dw M8@aM`   > D J U R t  Q = SV6k#ZSl$߸P ]b tQw `56f O*5vB[4,G<<7g{=*2 w 1 ? S - )/e!&ggk 6jc0c3m0r a&z<Q>+Vb b|"  -1a\! q X<Q3@  }     ? q  a Nb$ rXu=Yi/#ie`WyU /lNEbx.- ;kE-P9 )yl>Pys@n/ 0qU  j E K L})ek.sUgA3m+0v; +FQ$cYV_ 8 9i- JYEq/Z%)$ q    ;  [ X t  PQSu: ) i%XXxa&3 )L?v;<V# .!+x]Lmg*348OD>XF."1  h t j<@s^X[%G)<S  Bp7H};[, ui kDe2?  PYb 3   7W KPHt]D%@4 (faN "}sW$Bi ^15&"yu ?R3DEj-yZ 5 u I En>i'v@M3v 6#S4kHN{Q nVZ,:|1` * m E9S<6 1WA v @r{  P_xC \    wS%w{2yNt6f;^p ?oE.~WQ9 `s8^g,")LJ /#`$h?,K zBYkJP/I,b Y  G^ dnsfn;vZG-#"7pOxyG!S 7 F 3[|At Q  Ryt\W>H!vx~KD/r[ D K { T ; ] G E S  NI_q D[ub"{/e H&8e`C7ef p<#oG R^ch o+jjk l* +T kmkowpC".D rU@.re cZ7  s / j  5aZ F  ay L2"a@6Kw+\h)Q-  = x B I ' I 2 )^O&4/p}tk.5#\2]PB D l y0 4:(  [m |68p{}o$Bd3i#-T8joClMkls9;8Vh(h15!A6 "x# k  /   djaf'La<4b(u~Z!4"] ; , 5 A :  n  +Hu%7E=;H8B Pa"MFH  ] L ) l % sNT@h!r)VGUMa,u83Pic|U[d//vnl5{o '<iSv<~u ^ " qUPABX< A &%A; }O EcJyO hg0kF<T![ Z+bl^E[AwE,mViIk  S [&Qj$N`e Uby;+UMAZ Z&%d+`lN%X~[D/#T`^mLI-<%x+30KnK n :B~S(yt)),pS9anr & ~?K(+Q5%j,,a^/L[/Om=F3h&o]Rsv/:Bl-@] uZ>b9~jYh~Ay,6nQcRcO7,rk+4YN/X,3+:6%78 FtZa<HQhfAC(wpX"u7 &6oScKXw:CXKI0   o`-g( XP?qY|I2:Z y @LH+;w]qpM!t"gM"JuSdJ{C>"]Q&$?f~Ge[!(>H 01) #B u+M?)<Y9UFQHv}v)De>)QU6/--XI] *\~5DRD aO+~Gytop[yU:DMfd1]H?z^ R8\m13 IJ*;KSKRc Cdb]b>8 Jcl6=5,G7j0dH=hY`&XD}mYjK>? =<sEsb^\ u} Zy%!n`1iozC(VyAw8=N v& 1H1yFwwiU_EE5.4/,|e5Xb-|5cy/i\pb>ecD:DiZx}1'sH2j~wv1:*@MQ@YD*r-U#j~(\Wp_o[C34U far7"Z(JBn_'[]A=Se*R~~@D Zc_@rN>ac!!?LLaX9 |E%6Hso<)EgmS_ZB:9"/: "96a j7NK93 J=,d\=>DG6 SVgUf t>&(!3ob|/Tbsp.I@a=^{m]Bjk^D2m]I_SeZo?/g}r_|N; Q$$26qdC0>%(`.q~tm?J- mXv905c>ck Lis^N#IZ:{^?x3,t{tcm/R+NTd@SJ]_BppR t$e6SkzE.51kl`9Pe5 $zH!OB8\ZCImi  5 3 G wFF 7F< Y/_prfG-oOwg? Qg{>0bbBBNu e)KzkEW Cvr 2&.,q~q d 6(8P.7Z )#5]'>*q \(a;t9LH*tfUq_Ye6 &-Ld  !_'/|Bv:J= S'N&'0[j+9? -<2/9e(h1kKMHq]Kh0LUkd ^HnO= +J\cE&s-Jo` Mz6ecv\Ld0?DmdNKX^' *MM1?)H+|jg_e2SL>5P'D>,QY~}! 'Zq)r jbO WD0 [_CU8v qq;UPIFo/Y-I[j~a(s>eu2Q>u~#t(lMzC2#Q%?o2botXSRE_u,n&Ba* ,OqZD#*K\I~?# KrAc2/]#Mjn"xeq_ycZ:bsq$_sT\K= kOiK?Ax%  ]m8H"Mr i[Az#"O }\ awrp [nO1_hPRV.d< @~~'-||dyQNBv ` z>bFsWU 6\qjV(P`el_koas$cF }41SWPe!x:{B:`>`f}e`[RTY))2n Iz'<prSK&b04"MJe[ m X ,Hn~mCz  B[yyO,H}EX(lobYfsn"|V'k_mmLxQ =3&}g:PjV?LyX(J=VeYPE_M72J (m'[ oh8+LE TB @ l[Gnnzy^Pbd#[ O"7=ilnwuM.V5lD%%!\ u?)_7);G<31(cg"jfQ*au&OTo\rf7B{ ]"kK(^ ;("S|`|{(|c"x,/$P5D60NIz c|!+NuBel -NX]u9r OE 'P O q N @'1!f$`Q]L>FQAgVVZI[1|}B)-pB\ a*a{P.*44&dLoG9-pvv40jAKM=Lvw'9P|G=5t [%X #!83Bjh} * EnK{Gw$/k<guf$2}xE<3e+rKFK$0.:Ns_D-lS(T1K`PK/I$R MLk,e1/8k~ODfqlkA:#24x (J~t(Ar!.I8_~H0H>,"GjhTR]cLN \gA. v\7aPA3 #.6/'2c]7-O[Rjo6[9A(1I$gE_eSd; D0 +BGT<.?eK0$ BG20;*"Dp -TK|,g1GwCwpeGR\o4,([~Wx{*J/|B*. tj^NrmD`_3?q=vG/ xN*!xokb_P2g.%) zdT0 &"7Rgel -7lN0"A""opWu8cV`qK+IkE!9 S*=\ArnnE=xIv[=kq|b1xfO "%Eyu=^vE>$^IX3 qwmhi^JB)2?LL/2D?30/"#9bms@P?` +Ho(<=rmRn58h!CZs&A)(# ~}"#$- zdA  < vZdqa[NF> %q`7nVmX/N3RlT)LC/aw}]>;JL4 *&*:J;Hh(%F`2Ro#7f2]?m|R+_s\1)SVv{pda&TuV7;>55e;mrk`a(  a@Sh)y`< ~?xrjk ("M{pyh^(:S^H, +I^T:5 J#=HU`ahL.L~$<[qMtI 6K6-DUU^t.M7#G3+Q}aO=,+,* QTSyn]Ht|nS-vcl|nH0 zQ(rH fU0 vxsnabgUaZ@*%31%.C>?>KXU5:AC^*@dlp/>,&Y 3CAMYy6r}"!KL%;TI^uwrvqz`&6$@O%>V^cv{nsr`I@1O^afosje{{qqmc<%!rbX2);,\3"")5,(;CP0 eAFIpv1\zjn ?q?UtePkUMf%PniqH,K]J4M:! #D^n|bI{whF.  j^= a9 vkZ_jH.* &PTXkXEUY6#upsf_z&6DCK* %Pm| -<pv#*&:62CovO%   ,  yig^NGAQskinp|^8;."rn~^f 'Fqb\eZNA9./+385 />5$ ryzxW5)"fm_z+9[I#9Ef,4):" wyorZK] +Y_IYm{~}\jwsvkQT[8=<PvtQKH $  o]ckvx{xh^caNap`=7&-RsiC-LYJ"z_^u__f_bhUG!?EQZT/ O)* TtqdP?YrZTZ`Tk~z   (:h 6Uykgm|z MmOI\y -*7315:A[o}hJ(\,[JJK@I7;ch> dvZB,)"T6>8%GN0  }~=5A;Tz!Wis :) ' 'AI>:X'5?JW70?>33+: 43O\~oo`7 {cWWOA83qcH +OP1eE..1?P]EL(=2$)!  +(.9>>JVj}~}{}v{ve^~"/3F. 8NA*@WG;/<X_ZO_Q?VlR9DI1* ,9407%0FO9."694:20@?CKA:DE;64JVijfoec\Y_kktyz[^mps{_J=/,RcwuU3:'oZZcH19J. (>Mb{upwpvoh|}tYFQ_{ Fc\Mp "% zlcroZ[lN>NYp|ui7}aMGq"-& $(M" 2QZKMH4 uqic}7\{vusN?FB9A+(>DKklpSGUVp6Fn:FM6 7Pqoa=:=blwq_X/gD:APTalxhjL*!<9RbkiuPD5slaS-  D;<=:\u &@Rbs`5 ;9?D7-[ PbV/ 0$ 2MS\o}jRS>?Ru~eHYaEI>"!69V~ll"3=B'xkVaeVC &$%:?6.?>HHE6*)Ap u' ) hB" !@OM*o ]22<8%=Rw}eS]i`cktWEU]`]Xey ylcdm5RD544;dz{y}n~X)=8 6Q^Xh@~~tH' ,;A=" #  z<$-;B?UycLEROB% 4Ua]iyyaQ: 1DDF]Tb~|eP?:>@:=JGQ[ji "'++"%8^d|gqs[A,"It#.#sOc_I1/+" mjtrqS,,<NWMF>.0YjN'h<,:Sf~}kX.4GHG`tv4=?9&tv!98Vu}aQ/9<&-,'<2+ 81"232I<??gtj\D (,&/]xwryiLbgUFTTUVC$ZBF_^h{m_GFVra?')4HYtz}ohfUC7;F)7KIA1MZq|zc^g[P!<QJ6*L[]yXbbb|rZH6#.DQimhpjyx{laV+ +@FPP=3FP:4KNHNaP<AY_WeaS/ 18>2><,  alESV:/Ww|^MOhq # tWGH,&OTOK[ZSR]@qxwuuT/6!!@GhwaC6'.* 'RbttrWM[WVB7Hduqtyx](%.:[e\cx{N';8&/9E:?Ih~wwpd][:%RizodtqqgJ=DJ^zeMB ,2 *44&)0;A7Lhhcy{bO4"!&3=-7MWR[bXPPK9&/349)/ /%(MM@PiZLND. )##,B@&  43 6L9!  w\^t|}xn]SksU(7OH5+52. 13$ /BDTXA"&#%+Rjj| AUH,/,(68GE:*%74BGE*$/6WqtvyujWWk!-'/(kbhbZtaZWr3E$  Y0+985%eDG`B(!)E_ep YM]J2"1e'!!;8=QE638EafaiwZPK91+#+$CSIO\L@TTK45<=?7+DD +{J$ %,:>P]spr {m 0HC,(LF:Jcmu|qcX',BNA$"#!-I-  <QZdpsvg^D %@Ukzxks|9 "80*% 2 "+& .4:2  !"<RffYV[px{zhU[VUgyv`_s~ebsxxfA$ ~p{fbdk^YM7-8?3:Tno}xmrb[aS7+/4 (C& 8W[gqqJ +-P`nm_txbhgWVgvz{{rI8T~yh^L?AW_f}$+?4GhyrngW@0Yho(@9,   /RyzbLA.nb?7Jeecf\ZarroVG??+ *7*6TN@QbJ/ ~yiJCQQn~pq  +LAKk~}xMI/2;<  (+ 5COJE43?N@-9doL:69! yr}#/9O[Q`c3 ' n_G/,)Lww_czvopT@YsV8OdmgU..Ibe||pmcS?78Nj*)|vWToGn}xuYHg~eZzpMD3%3KSioyx /2/  # 6UU?5., rf_ogQEJCAFIQC,&)?DSN.wy|{nZWrzeigI  '5FPTbo~zA&6LOL%&.1($0*.<8*)&]`ISE((Vt}pir_ftsp6I\]m{}~~l_i~nvva[Vbqrb@:Wt}nK"0 %:4-AQW`UB1zc_vy 0-6HRG 8]|}xhY50M>%<RMSmleeqdINpY)6SOOfaIHiltVC! @ekbVCoXNW_`P9.>Oekonyt^`gm~zQHPL[~x' )50==! }z~?WXjbQAJ8.1DC- +18G_vhRLM45MP9RlYb|S5K[E&4KE;`lTCPgmvpvgchxu]^|xXQhxrnfY0#  |jYU]    ('(74.%3LLww~ &<531=0 8,)?5+UmUXc`VIPYVVRI7)& /Xv;lbY^xhx -T3.. 9Vy}khc\g}{iezr[a|z~r^vNH<<a{\\aWUm{khM1@lqokjaOY&( pXD <</AKK]mns|Q(3;N,/,GuU=4$}ouwhchyp~zssqjVJ>)#&()KbcVY[gzqr   $)>@94-$X}yiZ[UMR>50'&$6T]^N(#$xs(RwqR+{v Wx}kIBA@GF]~~D*0.#@F4"89FB' 0OVUW^x^BJ=2D_NKc  i\FDI8)BD<MYWGBCO7/3Wqtjswqrwa_o~w_A' }vv|zqL,8?3#46?|usyNJb^1'%03?NoxjNQfZ>%$-#*5BGZ^?(036.3ID40!BW@67??WYUC:77*;?/4btm{q[lTB=Te}wh]svij$^|l_cf: '@PJ=<29/#3HR[t    $58* ! '&&  {vtdQCR]i{ms|}S+  277"{xjYRLE?16Xj_a{pX=4&1E\^IG;FdutynkcODTWVO5$*2Rlmi~iTXjuoxli| $'@8/AY]]L8/;NWjvAgmchess-0.29.6.3/data/sound/Makefile.am000066400000000000000000000005411323660377300175110ustar00rootroot00000000000000 gmchess_sounddir= $(pkgdatadir)/sound gmchess_sound_DATA= \ check.wav \ move.wav \ choose.wav \ eat.wav \ win.wav \ loss.wav \ 0.wav \ 1.wav \ 2.wav \ 3.wav \ 4.wav \ 5.wav \ 6.wav \ 7.wav \ 8.wav \ 9.wav \ 10.wav EXTRA_DIST= $(gmchess_sound_DATA) gmchess-0.29.6.3/data/sound/check.wav000066400000000000000000001377341323660377300172700ustar00rootroot00000000000000RIFFԿWAVEfmt "VXdataD̝8H=,3ɀ@UXbΩɰ΍erɘjSxnzVχaTɣdɰ_l_g[}6Ϡ ϤɨξɖηΑz,1}*t΁6gNȃφCϩȺȜȣγȿΏrάȺw rɯ=*Kqɻ|nNRȖεZΌ2ΜuΙ[Ϊ9G<nɳ HΠ ϦX9`GiAx9[U!F}r7ɂlɹϑɐɑϗɚώsϝɚϏɥ|cx@ГGд koJ&  1:5( Sʫɰɑ ʔZʂЅʸp[(ш[_ю)ʑЪ%ʟЖ)ɕEʩ/ʚ ʾʈɨ Fϵ/#ЁR,Qȱȃ!'bςgK\ɲϷ:r5%j1X ЀEɑʕʹQйѲʵНʽt6{ʾʘSЮѕОeЏN)ʮ? vrȍO/e1WX'HȄȚ8oIG(PPCȟbrcȝhȏWȞ8Ȑ;ȔLlȇ{ȓ͘{PNh(H)'DǾǭǿǸljǾȊqȻEiI6F͟glzǒͫJmsͷ͐0ΖXέDž7 ǎ͢ Ψ"y#,$KWͺMǴ̭ǟ̄nq"~&}͡$ͯǗu͎ljͷǩǠȠ*rȑǴǓ/7LJ:N΁Q3tD ;KuO_#Ȣ#(/;[Ȇfȉw͍BqQWlȤ͞hȥAPE?6:ɀ ɼȨȊɭɶ$ɸιȮΙe^μf΍GR^Ȭ]Vgnj Ȫȿ!ǝ)ȹ0ȝ]|w_ΈȐβȒΥȃ΅fh*bwcT/'PȎ6iΦ!':QiɘϘɄG!/"Z%/YhT^cOE,ʈsϟɒGJ Ѓ")]#LM9\CʵkЎʢЍqДZX4зJТɳ \ʕTuqʓV _5рѿ з~aʚHʡ+ʤiʗЋf"i[@<ʗ*ʚ~Koɦ>YhiʅѻL Jʈ˄9wv]"!'5 *]jnё_Ѥiѝ>ѝѰѝ ћћqnВ˦ГІШF˓Ѻ˗ѳ˹Ѥё˝ѐ˒|ˀэUќg˰Gˍ9ˣ?˩D˂;˲HV˺k˟Ђ˨u;"#ʏЯxЊʄЛЕ"uѝѸПʸШЖЛѷ;ѱfcʁ:#ѷ8iUEZʹЎ.q I-gGZR!ʌɼVТɮ϶@ЋɧɹmR_ʕ_:Vʺ6QO3?(ɴɀWɁdɷнкɽЦɹϺϥϤ'о(<*`mБχʩayʓɛ9ʒkʪόϝbʿYϵϞΔɳ<ɣH"ͩȅ͘t͙ȸ̈́} ΝͬͼȡRqțͳș͙Ȫvȶvhsț͒dl4΍}ΗtξSί ΒΕQsK΁CγVξ0~Ȉ:ȑ"Ȇ3iS ͯ[ XX́kͳZ& lͫǚ͖(0ȲTȆ_ȼpzȶahW'Ȭǚ͵fwn$ȋ }Ȗ*Ȱ>ȋ2T,Θq _}ǵǀCKPX"Rͨ;ͅǔ]ǗN=Dz+du=_ f %xƔ Ǻ 11(r̅/`ǝnǠ{ǀpẃ ͉͋̂B͆Ǐ͟Ǒ͹TͰ!Ͳ̠ ͘yʹǃǦȝǾ̱̚Ǥ̔ǍZ^*qKu=~}ͦǗb8.ebZZE--ǭoDZ,B4͕HͲȉȜȎͺlͰ%͘ ͛̌cOȺ,Ȩ0Ȱ><Q̓,ʹȇȬȞHTɬFɹN00 d>d΋ɆάIΤ1ΦVδQYξoq{ɫθ΢Χκνκλ!ɡɏsg$-+CAL)BCDB1?4scwB7P.1RcϿNϗΊΈηεhɠXɖ]ɜ2Ɇ2ɯUU_ɵPɥ7ɿ>2F$x=Ϧϛ~cϬP,ɕqΫɉΈ΂ρIϝɔaKQ2vϾɑɏʐ YYvə#$'!4!BV<'891&6501ʉ"ʚϻϨɢɘϿɛɄɀɥF'9W!Q\W>fʉpjʋLUɛСЦɫЬxеɋеДЛѤѹɓд%u J*L-z1ЗR$Т'|vгpɍʠʇ oHkɓTNi5/+B1O ϔqɵbkK>7)3%c΄r9ldn*σ3ϹζΝΖ+Qb}cZ-ȿȖȶ Ϩ7υϟέȪζȐȪɷɀ6ɑKsZɯa@ɪ:ɻ=ɕWɘn=* ,ɲHA)X "Bvΐϯ9Axlɯγɧ|Ɍ?ɝTΦ#αFΪJΕ!ΐΠdΛλYYRZwfΪptpnmwȏtȨ΀ȷΠȫΪȁγȖΫȰ΅ȶΏϨH R΂ΐϑ>ϷTϴS5ϊz\RtM϶&ϝDϢDϧz4ȚȲκΥȔηwΛȨξYl6{GψCEPS-nR*DH:v%z"aaSωϊ΃(o8D)ZC>6NalFLW?6κȾΣȕΙțtȊR3Β",*G|ȴΘȒΑUΰ"ή·GZv:ȏ9ZL&B!1,W`ΆȗΘȠΆo·[tI * E6M @ <.D)<$:3m:decWvuȇΑdxmδȚlμIAΝ΍j]_΃/=)i13`iΑcζȉR\ɛȦηΤΜέȤvTΚNjΩrȮί ϲ !Y'VClɑωɡσϲ7\#ɡrUPNωA\VOTr`j~.Qʏ(i%ʜ[lɼзp}?йСϢχlϤϡπP"7*tɩЂɳzfО%ЖQj=H!rX~НϻϙɟτɽύЋLйɆɛɁMlɅpxХU}АϢϝɴϿϺϸ/}ɘɬu[$b%@hгɍTyPЇ1НkɽEGɺ*+ɲ8jFbEo0d5y4\GXHɂɆ)),hБςϋ}]ɓ;-9VVb#ϐk^8= :+W|΀΅Ή`'PrX>QeCE2s0ϠβȠάȴΘΟζΆϨq"7@y ϩ$'i Ɉ`.B6kϑϺXɶAʴh{φʘϠϙCsʀzʓkUC=QɑлN4ʊ/`,p#ʳ&%71TjEб-ШЍ?дEjɷɬвɹиɔɨʈ)@ &ɶϲɯɝϘɆ@K2_ Ɏȷȵȭm,Qɑ4@6a_wɃ|Ʉjɷ$',ɸɈɃ"ɐDɌL@Vrɮw^Qɶ> >ϒ϶ 1,ϘϋɴυɬϊɹϩsϵɀZI]NɷʿϲɿϪɉϕɒϓɕϭɆϧɆϽɍɖɈɨɾ}'s2D+2ϡ"ϳϺ7)2 qɊ{;ϯ`ϙvnjRV{.g"":YoiϒVϫ,nɂɼψϓɁϩɢπqϰLϔ4ϛΟD'ȝWμDέS΋{oȣ~ȚsȢδȘζȻJɥɚΝκȏ( υoΟgɭ|/ɮȨɯ!ɮΔ"ϡ>ώ'5Z`.AΩ\hXϷϑɵɖmɣMS%@,dȭhȤYw>ɛ3-?3pɨ-ɶɵ !#Ɋ+5y*9όGφɏ^ɔe$ABD9E$,hB)*/cy]Iϴ+ϷϘΉ4G1K85\%t}ϋRχ~ij2<nɕ+ɿZ|ЈɮϔɋϒnɅ]D,O*"4ghvZ_#%6["B&ɥ uS?ɵ-ɋɭEɢ*;ρɴXu]ɺϢ,ГϹ9нZCM"Aʁ"ɓCϻ&ϱɜu΅ɤσɛQoϓɭϙϓhɷϘɯqrʏBʋɔ9нɻϒϒbxUɖpɰ =иudoЗ#НJqmɡ;%IЧ5o &ʔЏ[,Uѭ˸ѓDwo&U)ʘШ$ѤDzО~Ѻɵ!Uи75ʟBʤt!хʇ@ZϹ;КdѯΕhѺDЁecгʘXGʯeʙϗ ɘsʠ"jѫɌЗFɼMʏ\ϒKʑ'ͅ ϜȥɥCͩȄjϿjɖpU'ɗn@[ʵ@ʻІʣQlʼʓϏ  is-WΔϥɭB-ɁBʌG͛ |)v<ϫͅϢΑ!ϛ\tΨO@μɃȅvu3hȭ0Ȥ͗4΅Ζ ͒>ͬAS w>ȸ @пǿq=fYV>Κ͞9 CΙȐϪΣ W]Io̴HȴНINВΟPΠM7$n/|7ȹ>ʄЃ" ʪ+RσV:YѣД?nχў 7 ʬXЦ?NʸEΕʊ@g3>ɯ 5+˿-}UBwǸʤkɧk&;5 rauЪ,]ѸORНȭ\ ɻ@'Ux4Lv4Tѿ4J v3X}r! c7˥8RβҜȤEɒcǼ қNwʔЮm(tmEJɕ:ZSuЃǯɮdǗR(%ȟ9}ȍ{ c[ zg͠ˍ'ńRR$ɝKɋdH˧yǀ͵j?[tDMϞHЅ/Щjǽw; ɜ΋2awɡL ˮǖ9ӵˢȺoUˢr>ʗ[aԚ v͕Ȱͫ˳)ỵ̵̄R7ow҃ȩǀ͓Ӌ[S-'`hԔ˫ːpϹh!&țSVFLE7PʼpĤǏGė-1]ˑZdAxɹ ѷHΉ|&͊Ѥ 4ɳԯK6u 1˺ҢRɄ҇ό ɇҿϖXJɋ`g5Њׄ%URª+;!c7i"p;Fh̵VDz%ŤȄ6ṷaʋǑΟҭʙrˌΰ9ɀ0fB7 xu͕o#ӿFpHCͣuȻ5kvϱȫ҈ƶs·ЩɚѭЌ̓ʴdbԳWʒD(aѭOΔlУ4pɗmp̫:f_TȭxwDċɧͻ`Ȣ) Mˌ0΂ "J"aɸ l˙u Ӌi8 -rɘ'a;XɚIȗVͅ#}ţX˴UK-=O$są˪7bRqѲ̆,ʐ˲;dZs&ѻԞ̳u@1r,m ;p+ԉɹg`SʾIdžPSӁhВ8ȿCq D +>IѐPXЉ^͛N@1γ(̀H!ǯ'-;^}ɄmёKϒ˥7;WҟʞB̢ȓ+W˼o5Q2Dʜϩ΀K:0ʡɀ5Jgˣȃ̇#̑֙ȟlȣ*O* ǧ1T;rԡȋл3̋UՓƠ̇̄?̿Qҥɹ3IB4\ɓ˅l]uɕR˝1ѻc͞< ʰ'ȯB|O1 2i^0fϮưɰ̓Ј4ln)^kʈҌzG:qȵbYt n~8&ʾѕ$̆Y%E̓ \cȇxͲИɔ~*Ϙ.1 ѤHo6dSǃ6Nj]˭̳uxɜЈbx 1W=9W%m̫%W6ӷϷȵmγmѾɢKζ~tP{el≯͔N Ŗͳ_0C0eAɬtLĀ=ďQ6LʌƢ;ͣ:ͯȚhͨKΖ̵(\yȿǿȜͫ \hGg̦BюGQӉF8ZμZ@Ӎzрͤi$*ϐXչˍ2G 68μZwEgˢTİ˛ ɑu.,*iGw~rƜn©%ȒQ©GÛE~vĕ̌nǯљɕҰ _̓5G?VծлGwԎ/Swݤppf9($Gg>r~|ɋκXg͋ʧϳdž@CiǶgu .İmͻ[{5 wgZ eƒc #<ȧ=lsϼ"Cǣѓ^ϒp?.uתМ;ϊ$׷Ձр؜ۿۓ@ظv׹>ٞߍzޚɳfɠ@cЙ+}wP̊clj˝9ɛ=Q{ K8ksVuħħm̳ȓɵș̪j =fȖAȥɥ˥xӠ[Bo9 ƴ́pί/Mם΂̬O՛ї-2/PؚlLko΃՘ח eO Ǧ-g}±õjzťL2#džǺΚzѢ Rɪɼ,J3,щHɴ˫N`գ.׈Ѷǒ[ɝN9xӊLWxT$ͭ|՛\]"3]ӃXcGװ6؍GزgtݼlvS9ÿԜ-;FŸWă(5ϝcgΆ(ѿq*4PM_҃|Ȁ'lsTQ[g~̎Nj8 ̦a+կdɩ˽lºa*ǃΆDžǞƚġ_a>VGn¢nʝ<Ϥ5rɪ v:*\kʺWʽc͓%y+ܒنܰܰټժݞvݯ9ºҮ *ԲYU⇾Y"?̆ ɺ=ü~ř̈q)"a IͽďW.PpƖd97HBaN$Ŀl«‘f̧È_5ϡm!AƙXPǀaϹD̽ՄI ̻δ_ژܖwa ி M6$BÌ̸6FĴ V<й(ȾAgNm˾Kђo˯ʰĞɁo8u0ǰB)G_=P0:EKſҼ}5I-jΦA$ϮeλןF _خ>ݥ܅ܚެ4]zw̾df̰֝҆ʧCӹ1ڷ6ɀx<9Bbµ'21ѥͮɀ$ڟ˪ОDƽ;ʟYhǴħǽ}ͨ~fƋĐÎE“׼C4c02͑O Om6eݹZF6[Jďn?^â3ѩUMVаe4۠8!6qP~lmWz㴸9wR۱@M׈[~ Wnf:MEǾ^Ř7D՛_)dӄWAifƠw9ˇΨv4yÓ.#S͍ξϙpŘM̦:Bۭؖe=؋JtiW+Ko%0Vjem{R ɮݻ ͷ}}CUʻqʽÍ.R1 ڳ-QAv_g:ƀϭڏ ʷ>U`@ƻF}}ȶ WzROY BXqwr#rݤ]E +~_qZ@S˹.,'жeɐ {'?|a]췣8ʡ ͨ¸IqЌn̟۾7=ȥj59N'~ǸƽI<WX<C4ȝÅ\Je"Tϱр(T y$`ڃOd`k/ԁdױ˹ޢL|x`b eط ƺeīw/Ʉb g:i?ږOͧqfɂϺ˞R;b?|ɽ}ƔDQ: kY7򾚼½1dƒsR÷,l@я۸G!]ߠ+ޘ"Zaۣ߹8߹$zfi8ȚK&ѹ30ĀSŸ^šòս`_?ۏIɽDϿ`tt!ˆajޠ4/]Z!ηijjHབྷÒJrɷѫ;B&׾-Jvވjk6A1))-8sڊ&TteF߽̫AV`ĝK;d0ǜLW=\ K u]'uͽwݶC_+{QM,2ZFCXvlDvK6Ǫ(8`aҗq:xNֿ4܆ Bjڟ5> V>ObUc=1N|qλ ¡>Į. ˾ĎΊ޲ ^ϫp~Աx юʦڒ||/9.ɴ!İq"ldq$¢LŨ34!Oџ1ƅɈ;qфk? UӞաm=Xދ8bwzFw2#HB)Xnt徭潧0sY°׸xżoã/«dW(f׬N.Da:ʭӦ.οٝ=ӫʂDw\!@|0iɯѕ{ ?1d̾SUzx$9ҵ{p>5ظ2 .JԪ>,ξщ݁ӭzӑ8C_7ڐ.ںO\R/?[`| ӴH&יû0MqīKLե&Icֲ{] d6lEcԧmʾSΩjʬ#ħžuⴙȸ;ڽu+ɶ̊[ˣְɻF0H ݠ$u`40wْ_}qۚLՐUe̵%Wݻfk_E_@4Տ4dрR xGZsJžLT[zŲ,!޾+g澆ȿ>ǬQbDHg٬ɚһ*)ˌۻ2ڡډӍҞѡ"un֌ԫ2PākHӼ3KջWYǣΊTjԤ/qϒCcʘ֎LϋͰUK^.14 fGĵ4iӼmg -!/naЇӲgޟ21?7( idžæżsqӒqg!ƧzǴ nPa׮dקνω ғi{|]пWåÓȵȰ!C{7lGdV ȭ ,9} wҔ١Ϊnޣ& Jg!ԳԕHTsDZ0ǿu4aҸґE*/yoɺIA׶'@H3_QZѡI l(_#ԻM΂Ƣ{l[S95ɾKTKl]ŌɕyɶS6ϑʟ ڀ&T*=t߀o=XՕݾx9g+:(ՏqLFJ‘D͞V ʴ#ʃaO: 8@/ًz|R0!uƆǤiQaʿH2V"/+^5DahȄ&Q30Ͳή$ǥ՜jֵQ׿ۣ4Ъޗщ6ӓmQJ&ۑjR'ڌ͝3#ws:nX5Ŀ" ƥʱOBh;ΓoC 4dzъc GȢ#R&w ʽA>Nܾ8#Ʋ'pʄgϤr΍jƘ^]գ/֬ίֿΐ܋`|MӿNhm!wԥ%Ѣ*Q كėpחزϮ+ۙϢ]֎"P݋j]ۚ;,Ð4D l˵_E9){€=RЧc ш=es") Љ|6Ϊqϐ˚˃Лx̸дp͗ĆIbāqdH†¶.pq{ϾxʪHa4̀˥ٲ[ٿΕكҠ՞ը߅ r܅ʨ|S~ըQb7k!ɾ`ƮῠIɄŊ9dGi WƣƼ ;Ծbщi̠4/WTLvYgŐŹ̃ȣƚŐcĤ ɭu^aŦ͗W͇DhuՑ˥ن͕Dڽ8xԥ[ܩkAǬݯ֞cʨZ$ϐ) }vT‹nKaǗP˩[4Ȳ2ɞ!͆ϳ"˜m]͂Эѯrϖ̲It`Δơ1nζx(>>ƫƯ :]&ņ_7ʩQ˝M\EɁ|Q$bUփnϾ%r2=ҬڤϮ˞ɮسqԻ;Ѫ ˊɣOΩy2͂6̊}rβǛ̲iɜ6Uk'wɽVɆ,WζA4͡h}ʰ̉țVX] 0ʮBBɪǥŸA '(r̦|ƵλǗp0Ǚ(bSȮuXgQrvf$aˇx˧Ե̚ǡf*}a9˓РʢZ91{mks'͔-̲ʅɶltͦZ}Ů 'V(ġͅȤTj.}ɀ'%|RSmš FU<͝ZŰfJȺ* Rȧ^v3ʲΎ%'ν*ə ӶbmjJzgͺױdͤ1 JFK7β6ΒrҲ#:GԖvЌk4Zʴ͡ȓȖ7͕ǿΏΌp͆D22ē6F @nĹŬŮf˖ŪorǗ/ + $Ы#ϖ`QАɢkLˌԯ{Tav7uכ΅s͗q͍̈́Yhj)қρ5'Ԡvʆyʨ [ʢ[aϯ3rȬPMƘ?ODŽɨ̻ʙ˛Ƌz~ĄoƬ.#Y{qFõ!^˪'lȉ{O0˜rDIɜv6xΈоP$ֶ&̃٦ή֭ί֛D\.t̑J)-׸feSIҷ͕]͟͵ȠwϬ"lΞ$Ș(X:ɰ\ [̬͆ɽ<\ƑQËoƿZEŭMUƯʲ ˳_ȕǸ Ɉ ɓ%~й*x3o̅ϻC׻̮4̵ͻUd KɌր#|9u͐Z-iOcǮpl4 n\Cpz6Ͱ1fMńzƂƉ*VˊZǍ˰nCƏ6ʳȞl>gMЬ˾?6LYy<)VYcֳx|T^Ӷԕɯֱ:Ne{ZȂ\1ѻʊ1Њϓ>r!o!̵?ƹBlb BQljƜʯqǟaňYŪʲʴ6ƾʞ};P8Ȑp*'ҶvR;37̒ӗҁZIӦҖn _>ɍөӌȘ̈_i 0j.`ʼnB=Hcʜ#IQfōù'aI}OvdU]ʒ[rGʠZAʿ˞LžTƶwaЊȒ d#h2+8Դ@մטb'֫X-Ԭ+Iӣvie"ռˏև˸75ȳ'-΋-gɕmMm/DͯdEǻDŽx OčgUuQutŞvĊ76C+ɳȞf t͡"\7seNJëL'é+¿cŘ[Ɖ Gfư_dΉ~U$̇ёοϩh%Ξ-;Θ΍ӿ]ք̗bP͒lnsTCV2̫һ;ҝPṖH>.&QˠTɣg#Y"[Ė*eVljHUygNǃ]wH}s,.þǕKC6̤r͝" ϿȱϮȖNҮ͒ցͼyׇ͛͡3}̇ԉ}Ԑs˝Jˮ+˘%KX̛.RԚxԗӌzcaKvњιaȪWΘNjH$+xɒF`àHØ{/ÚǐCdž Û/¬ œț!̾n <Ȯ͋ȫΖȅʽl`"bԂӒbB͉ӪDGA>ե=ӦҸX1Ԋ̶̧k,Zԧxn͏)ηѱhPΊγ͸Χpi4Ax ='EđǰĆL5s~SS¾a5O#k{͇g!HjѸTӔ)ʭ%7ϲjTQ2ѰgҢ"[ ̺;Ӻͥmgԛ6G|җV@jԼϖhπКϘk)%̚FR\0& ȚJȓZ Ǔ vę.~†lTŔ;ƶ—7Úy˵Ķm~ZvC͊IyiW-Ɓ%ƒψΎǴκAǢ1Жȕ 'aˎḭRsҞ7z,m֏яU^(ԟѺ҈ђWѾ4mՍ*ӲP1ͷЦ oEЀкOƣS+$ )ʼ_^\!Uj?f͡Y.C<*7ΆL9e͛)-̟DϜζDzέψбƉдƝylЊ$Ф/Л7ПZϤ]Էs3ϏӹTӹσϤ=SJͅ7a4hG̭ktɸ0[ǫh0s ʃ ̪=ƶ,YƀW/Q=϶Ƿ .IFȹ^L3@Bй>Lt͋ ,̼ȶLkƎЋDZЛzȣɗ3Ψ n&Ї_.RxTrZQ}lt xʂi^Ή͔(;ʀɝ" #4u9WȅW'_ͩ$`E@7Py1ʹѮɻɈ ;щyl%l:ZȇҺ %8wвghɽʤϞ^yζv$ș~Ȍqп*LI`̃șSͷSǎ{ǝ͆Dž,heS&`ʏvʟh Ɵ^z95}hd@(XQoHѣ6 ѨMVcяˊ9ɈMӧЫ/W<ɦЊ]Pˍ`]B̸ 5e˅0L?.pɄ<͖ȓ>:Ϩ X<NJ͝!lX1t%+Hɷ.z`ɅĤ1Źn˨4c` nʐϐ!lE6ʶu5 Ѩp\ЬɆɖ;АʜХc4΁Ί [9 'Uy>ϋˉF<пʲdɞЏDʺoϥɃ'\.ɹΞT͈zwXGaǧ"ˁM pV[ȯ͛{ȗ.ɯȝќe}[_Ќq̯F˯>Vҭ#Ҁѷ*B. ˥ϨʪElme{ȱϥ}IЏɿϏZLʈW=ɬφF{ɎRcɓВWt/ɵȿͼ΃ ϼȩa~Ya`ƈƖ̅8̥ǐ̖%sy̙χj?fɸiMC3Ҝһ; ̌^PRПʄ҄ˍ҅ʚ:όj)u8 J7*Ϧt ʵϯ(CΨ VW=ʝРqϊ?2iɝnwK93aΪȑϲ϶Ȧb]̒Eˋ2dˍ˿FͮƷu[˴nǢȥ+Lɤ7AҩK˿˂(ʢcҕFρF92ɷtɮ ɍM@mH%Ϗ`aɜn0Э=bg+}еˡ˴ʧI~Ej0oɅϮɺ~jX̊ȫyHƳg"^5\ŠɎŋsRAȅǡϲ +Q{}ɵHгуʋu|=8mPϤFxʫ(h6ЮʏY!*~˴-̤{̾=vШˡvʭ[NЊϩȶNɤdžƲǜƤ9̚v̨̀p̙GŁ˭\;WϝOώW=sȥoWʎhFѡM3̲Ҳ0ʛђZ+XˤН:Ϫ ˼7Ϩ}20˯/$N"В1Fej-ʈcϤ/ʦq{DɾAȟȉgq.͉Ȭ̈́ȑ?cJƓ!ƛǦ̪Ʊ+#X1LqHsɧӝ31˸Qll(Ққ<8f̞@H{ъ{Ṙϣ̥˵*я yʍKхʵυ@~(WϷW΁1Ȧcκ: hŀK%NJĂQǯD̪ͨJJR;ʸJdŞͰsВgжRӶ661qфΑ1֗xК+ԺiwкN DUόύ_ʎw̹к ?Ηjɑ(F͖%[їolͩ!l0)΀f6c ѼӘ̳Λɜ$)Βե˟ ϭ1ɲ$G3N.Y בC&ūV2Ƭv"Әj7ʅLő,"aB4z4Lʕ/ˬՂT".bM?Ҡrԇ189w3ȡӢX-%&ͱa!Cqˋ2}ʢ@hEyJA8j5Ȩ:wMƼĿ˅̝.AT+ƂTȴʌ> .vgȈMʼug.QMʝ>͟@ա,,:ɎQΈήevВ̍ў@O+ o6rC^TxӸͯA̝v)]˟QYЅy"ʨСfMh3sNбF75əȐ8#=kǠ TBNPc@~'z̃=˗TehʕUυw T͞Ə̇ˡУɗ`ȯ{##U˃I~E7QˇѬϳԓoWʗ ҕ͇^}ˣ մ~h"S3ϑoMȺˏ2ϯ|Ҳ~ȴՈ?kɩdɓZˮrȪW3 c˓b+ҤF%Ҵȏɽ?Fɋ̹?u%ϛD4ɞI ]ѤAL+͉yN4 ~)?7̪e 0θmQ++F\qO s3ȝ`Ǯη|PUͭAϼǂvȶ=шY[kȳ|tӁuɀҵQcɚnɝMfʽϜOU`x̤ȹ4rȋɀ'Dͩ|/E9Ρќ˖Ш Δίʑ8̚VʵIUϯү%υΟQǰy Lȃ ɬ9N̽Jбẇkȳ6ub&k**~ӗ@ϥ\эȲɘ`ds81Йw-Hϒ sϡCNaQ*|KGѫ˵\̫zew|ΙҢ1ˡ+Ҫ-}cѽ˖%ǢSg̽=ϵǫ ]ƭ{!̇^7erB Fygc ~sG=ŽH9>τcˏ4͌ΞGOeUͭȵ&ΩȄuϬTdug͐ц͢ն &Ο:/yύBzPL TxnxȄi9 ɺɬ-X(sʉoTÙ ĉ2GNʯ+hxʴ\Lj&g ΀/|sp?ċ̬ŰJQŝSʼ8ˡXQΩӺϟnьО֜C zշѫ ͎I̡h˅̜҅̆͞θ(ЃJHaȄaǯPĹsDǧïTɦqͷB|xʼn)6TəpV!?eC,qRF9'Ħс ͌ɦʆIղk)́34KRӻ/ܰ_`ټΞѤ2͚ Kmˇ̅Wk·k]ˀ6׼-êɕѲϦ+_k9ʷ@1Ǜ×DZ2=2uͼ̴%ʾpɬ(v\ƒIDUP4̃ϔˠ52m5eԵ(>ټ҂sd!{<ߥQˢ<ʔl-ׯ͝,"ɨԵw˷ͥͻ-ΥЉS+GԏKȱ޶rɥz@@lϊĦUx_NǢ^̏'ϾτLOt=PɺŴE4JґțʖITɞeo>ͰЖAcTӵϴmOͧ·ѩ-ӣ4SٯBY؟Ƞ)H*7CߟEɗȯS7ϲΠB̏MTvHgBk|7[}+}ے̔ňBѾ.Xɴ]ɹ?I̮(*)ۿRƧ&0я 0›:|L(CɓҩȣȬqѸːnՙW|'M9۫qnГե?6[GȊ,ϗy@"ʟCΈ j64+.ΟȦ#(Ryǽ˚Byxi˒΂˻˂0T΂ʚxQɺQä9YǼSD#]ȕ}Гz= 0XӍɬՄv"*b%^E nԸӦػk5 ߕIo ֪jbt +)ȼˍǩˏ3fD⼊Ӑ>b4TA:R" ŲiXsΟ[˨ v_Ȉ}?˽~]aB}=f:Ҷ(ΞBQZFzNҸ3}Dznҥuԭڿߴ Y4/և ʆ ۆf[cΊ6ȴ&B۽!^hζ@ӡп@ʾk(ɮ/ 7З WЯsMoɧ^Xk]ē-<{Œҳ)%}ɾUFDmV}9! ,џ*6gtЀCduǧuǚ ؃̐Sg+ΛʯbIԝɋF Mֺħ殱/åͺj֠NĿyPu>Ũz$lڋ}įäڝƆǚØ`̨%zcǻԲŴ@ϼI^pԎU+ͼ$҄BDъ0Nܑ’Cɰ'VYݫwƾźǯWVɬkK` #$^qձzӽH{ϹuàNv=^:Ȍ1W֡ʼnَu3\IٿYկB޸(xh ϓ6=9ǣҞƈ΢^ԏ,̫܋Oպ9[Ѝn@3 *dž)׍qfjEŭHŕ̕5~ovзuȯ|ʕG ]λhԓɒхdtaٌĘ̛Ͽd1{ƬjMŴRȭ̪‚˩LK8d-@v.TGԓ#RN= ѳɰ}Lݫrφ}$'Dpŷi5rʴ7uṭH%f 1[ȏD҂͸ =ʵҿͪ:x8˒bZ=f68Yѩ/JͤĔͰ:+ٍʗWȧn͹*l} zlȜ ҙǓa+Ѳ|ΡujJÐROƼ[sɸwȓƯ+” IΤ)Mʡ̆ʈM~̒ԃt*_ʻʾ ɬV&ؐɝ:aб6 ̬V'@ԁӘ˱Ѯ(B̈ЫqՀXxՀε":؄.EmCNZбû)f@4FlȢђ.~ Ҙqx:F ,ɾc? 8<<Ǐkjpˤ aӬE?ʝɼv0n,ίӨ+άKѬԵՖҋ6ʑgŹwƖſeƱq25ƜɡºŦ(ʆķʫ̂{ӟZlEɛBdQڋŻ;ͫǥ͋NWճIlz 5ird5Ƥʋts#s̗>ʦǶəͰy7 dQ"nшrՋшqЇ2ѥtсتӆ=ӹ_%90;d̘ύCRoUŘƥϝ~nnˋHzɉҀƻhїƏvooAŹƟ̭zĴʦ%gAϽӯͺaŌmȗz,˰ѯȺSضɨ:-c˖ĉ\$Gfͮ6ΨɵF.q̊͵ѝ-։Ҫ֎y·־Oʐ,ǘsFjgÝƪŚ ʧ3s#Hϥy;k4/ĵܙ;ʩk ҏϷˬ)ȫ_ǀu^MâԚ%9BXŶͤ]>ϧ^cÌmÿ*x;2ޘōkP»"՟rTͅ:n'TZІGPͲɇԭǟqzЏv-]ˊ*˦ҋлHѵӷͶerר׵Q/ήÌ8v=11i M.)f3ɍVҔtϤ*tEBKήŮZ$eo m] ήВԈ G]_ʿrS`͞+5ŎҖȎп49gΤpӚhK6RН̜Ђ̦ԞiGjQӖ5ƻrɣ֕Áʋ ^;e͐trŎvÚs|]ƾ|[Ͽ{ƨUWœPbHȓGSϦɸȮɖǕɯͽpϴLφDŽҞȵrxͰӑ9&WRС8ћQԵӉՙ{č˲{'Ķׄ8IƢrö>5,͵ƒƋʗJѿɑ&ɑÛԗMȅɒWӷ9 ɭО^`!͡ʁ&ʁ͝c̍˕ΠɒȿӢɔѹ˸̮]M̆ըKԌΝpϜ7Ӵ: Нjå։IbmGǑЀ„hƑG$ʫϖlʹơ:Hٿ͞8JĎǓzlV njơ!ɉ“Ө)*4 !d? Έɘx=y"BȼS~ӓˤͰ$͢өʆ/UX͹78muϡnѼՎ}Tŏлͅ(sցO8ǙØup]}K=MȺρŽ ɳʼnEӥed~0;ҕ4&b-y=`LJcCS:_σJύxd1nϧ̾ӵpSЬ 6 ֥π؃DB.!Ңóر$тŰwYǢƖÕDûѠA,O:ͰỎv͕ lս~ ͬqͺk#aTt{ƾ/W9Pˑ>< * <ĐȳXdQ˹0^iȐ˝dSrmGʔuzHWfpȟϑɲrʫzϺ Mӆ˹ ̃\e3M6YҎZͅX͌qaջ#RDՅoвl˳AƺӼύ+ %иx ѯωD˗NJ0ƕ+CŖŮɃ8F]8ki$"6xth[k86KBʚɡҁʓҚbҕ@Ӵ:ыQd&̼ԗ ͔VcεAԕg\˴$K(ѺYBʘ\ȯ%ȿJɿΖbϠƄ_̟˥7ϒ+V`ƪZʖByǂMˣ ʠs,Ȥ̨Ƅ͋Ɠ/Ȼ5x ʹLJsȧGxc"ȋκȅX? 54ґ`{+Ғ]лл]vʹFf5˜F"Ʉv{ ϱnRɹϒ#ϳǮ/LJri΢qϡǗExTʤBƄx ˫ ͟Jˇ9s˿ǨΚDb̜{Ȇ,ȼύaʕTɊ}w(-΢}ʯϡм&R!Ϲ7Ӳ̚ӝ95˵У4рʅEvrϛ@ƈ͔UƐ"vˈƋ=dǹi]ͩ jz|@TȤͅȈ~͉}-΢xAϡ$χaț\Ϙ$N,ͽ;̷ԴʣN˥ˊʍBwFsTΥǻ=%ο!k.cƐ˗ƣʁƇ-˕ǖ`_$|PflemǸ̹ZLǼhŖv.ë́hͩKM"WYǸ̖%ΚȪkl,$s=QNxg [z*ҦpʇЋ>lK*ʲ7!ǔ?cϳțM<6ςǿlͲ+`dz̩ˣKƇYLȤXṳ̑˰ OO̊)6ȆǀFǦ`ƔuJO<͎:έϱljiNxU>a+6MZɾ};~ -U*=S̲Ҵ2ӿ,w=˴3БɊȅSЧ]t)ϠP?̍Ƨ˓˛C˲F̛G3ȼPǟBǾ.{σɒΊOzUͲD<6ʈΖryπHwPRμ% ΚS{Љѻ̱ҌOA}ՆӉEӘ~Қ^eIҴȓш^ǃPwƭ"ƟhXeepw̎Ź,L&(NȺGqVͨ2UɯG~Mͨɤȫ(ǝUƁ4ǻʊ>o_7[Dǭǰ)ǂ˂˔ǡerSÒʊ˺ћ҆Tr̸ӑ1ʲҶʎRʔsCцǀ9~Ϧz.eIŞ̂˒ŀŦNʙAɮ0Rv@eȹX ȂEqK# .̭͢ȗǂHǙRK>̛ȁIDB=bɲ"̀ȗ͈c}ɕ͙3˥ ̋$r#{S3 jr˩|?v#Ȁc^Rf#М9πś$ 0"Ƴư^|&HL vgBMϏL ɋϊ,T ɠZɞ͛:y@w2 ?ΨzpοiϞ)1Al˨!h#Zӧ-!$Ԩίͮԙ̄4Bʧm:ҥɋѰȆОǢмϋ͔ƥ̐r̒ƃ|4ƷlƆͮ8]͡Ǵ {ΰйϚϢ πɩβ$Ό 3ɿDq>&ο*(\ϝ)EJηʐGU]ʭΣΕ!͸"Βц#ӶӗUIPήSp+ ˯f/pC&Ύ΅xƉ̞Ɵ̖cTgr;9ɅУɂU%m}-ʺhBʿʘYеʟ˲ʽʴ6P˾j-}H ̘p~ѝ %jԮͭΡh2)}԰ӿtK1ʶ҇(uЦǔЭǃƄΖ9~IȎ2"Εȉ̓.WϕzCФɚΡ@rϗdH atɳȰ,HɟϠd5zG\;&g~ɱI.bEMϔжѕЈєQDЈyo/˕ϿʘϢ:ˇˌϾ ЉˤX%f4@-2ѻҭ2ʕɠt`^ȱ+@Ϋ ƻfƇrƎPm; Ϯ.,̀/Ǔǹ`ϋϞȍ@Sș͔{Й;qκȜ ψw-5nʭϲw &CʋQϬl˚ж˪90ћYs^Јˑ9|? ]r]΁ȗ4Ђ1PƑͤPƋ+f̞k}Ƹ"Wu#iM[:͂0I(ɽ`]ϵȲυȯL ;wȗύ;ϵ56p qbϩɔJ*Uɢϓ%ϝZ΂ʑ.dG Sп̾˪&(ː-˨Ѹdʭ'ɫox ΒK̶vl˹Ť˵ů=Ɨ ǣ~`xǔs͆IHlt^ȿo`ȅGȏn[%N Έȧ?ȹιDZΦǔVȅΤTȿE(:^ɋwή˝ˎ1Tˆк&ϢHɣА(GP Ə]͚̆ƪGpLJǼeǼβgz+͵4ίȈȥSLy#Њ3Ϧ(Ώɬ/ɶϸ5[nr*Js_Jv>КɢZ8ɞʲKʀbsqʬϷB˹Hlх˷юѼ,LMЧ}kp,a8";xȍK<#jȲoiG1GBȆuǸdzqΉRVȀj>9*Ș,}.`PK:fΩ'πϢ2oϛCȖ]Ќɡ kϑЃɵбб4A+w q54;_BѲѢ˼ʆϼ_KˢUɶȚ,2Nȏδ+μȂ̈́ȅ͡@͔ ͇/*0ɎȘ~c8ΊȪgΛlJrH)ȍh #ZϠ gX ^Ȧaɲϗz;/M ɚ~ʝЄʬ&ZY^% ʚUPTg|^džX\ X`7C)͉q/ɇ̾Ȏ)ɢ"N2ɦ7ɴ6ͩΛmt8qε=Bψ ψiyȏg?!C`b%ЅaɮJϴ,TʯзS*iȔή5ΧsƉ$!GtDŽ̐̐4^eȇ ͇Λν0Κȍͯ̚Ȣ̤ȹ̊&β{ΦRιȅsϠ^!Д'=ʅWʘ(ʃA]0BʰX#ѓˋ=G˅ЖHʅlbʰʗ$f˶/gњʡОj/Bv: ΝQͲ{Pzδ8ɫʑPJ\X>7Аɛ϶ȀόȂnr`6`̿[̀^RͭȻ$ɍΜΏ*@WD&΃qy2ͤȻͿpi4 ΊYΧBe/rVM i# =:ɈxzʦiʤНuʿУʆгG4ҍ@кʽϧɏȅt7l8cͻȈBo{ȿΥxȓΠɞes J*̵ɻXɠKΘͩȕɝW:FɨϽSϥuϢTɕ4 ʂϏɍUЧKЯS_ʣѯʱ ʠЖлFЬʋ-/Xp5ϵȰ·ȨNo͗Ikȩ́ym?Ά^5}ϨA͵\x~I1ȆΔȊz8^}ɺVπ`4ТF^ɋiSʡE@5uɐsaFn^ʳb=tNѕ\gm jMsDDɼιȕȞ1Ɏlɶr(}l;ʿϮGv 9TtAȻ͙a$~5Ζί*ɊΩZjWχIЧȔU5 ϼϖɨЇљ ɪʏisаУʣɁ[ ;ɶɏI=ʑѺ5[ʋКɼИέoTɴȽb1]4Ɍ-6ϟνɫ@Oϲ(ɣhgHȳȂΦ fϴqbΛRoɼFrЩkм5Ж}Zʗ?9K>RHRє)WʲtтK+Зʇc.n ЈQYϐ4}νȀȵd ɟOλEʈ,76Om9ϏϭTʡ/|ɴZ9ɗRɿjbɚϵo%ɊpπDGh0Tx.ʚ 4Qʫ}ʠ1@3ɀEQ71C.+8UR/л˷WЦʿVDL?OEvMУvϙ3ϳ(ϗJȄ{ȫwɅ6i ͬȢgqΆJΥlͷȴ,ΒȺ,Z?ɫɡϿYɴ@6m.дQϵ#w-%w[ϵϠ0Ϣj(Cɛ6RKDrɢϥɱ>ЪV-˟<&YuDʬk>˧ϮVʄ`-P)ϲNϥ(JMG@CEɮbIɾYΘw:ȈHȟvɋo[ϴ!e\\wϪ-ψ{a ȝWȧ?s1Ɍjɷ/0D!'AʧR7˽O˟:RʀнɯSeʸ ʌωɒȈȥ,6Kd6n ɏlȄs}͚ǷV&ǡ́ ,ƀ_F~ɺ+e NmȥϠc _ϩȴdȞJ-1δ5Oǁ8g UMȌ͂ȷ,ȶWA΅P^ ϫ͇j}2ɠ7(vRϭɏɛϪ$ɚΎȸΡk ɲ23?ɯcΐf0D mȀȺ ɷG{7j7ɖ< 4gCd:'UНeʊ&ʨU *$Z!Ͽ<ТЄjϔϤϚJЏɆcq|*І!xTЌɅЦq%;ЁKɵ?#'ɷJL?ɫ}G;/5RNɄ2BbxAΡ7ΧlΫɆνBɲɇ1J=X 8"jɟϕΥs/$>uЦТPЁϟɽϿ\UNП_ɂz1#nϠ@пѼ}H[ ЅEeʍдf9Ы АwϮmʄRd\Уˤ&N ˈ7^/+ Хrph\^[Ϟ`Ϝ .:wAɜK A#ɍ>ɵωɖϥкɳəNМMʵ ˬʇэʙѰYˠk6Y˦ˀPvGʁ<5_5\ʸa7fʫ,waʂЏϨyy {4XFˈQ6E ,˘ϽRW39-rϤɇ3G 9 Pvɒyɗxk3Ȭ< f΅3=ΑUq5ЉȔb(ɍ =ϐȍEϮGSaɡ/Hl\dkɏϡHɕi0)3΁*3ʺiJd2Aʗ: E^?ʎOʶNEϕɒ$ζr9<3ΰǤvn;oM͙ǐ͖Z*.ǙW`#ȼ!gxwjȷTȈОȓ<>Є{}Xoіɬn% K HnɏLp 4ɽlqf]ɜ}d[[\΢1gmchess-0.29.6.3/data/sound/choose.wav000066400000000000000000000035041323660377300174560ustar00rootroot00000000000000RIFF<WAVEfmt "V"Vfact data ~}~~~vsQoQfxuzbK{Oqo]Zn_{qP{|eoY{co~Esr_G{sv}~hy|qyjuvo]yz}gntooigc|ntpp{rpjNveiz~w}kqsuz}yivsrtgmqgort}ztwlw{{|{}xpu|~{vjgo}~fr{{n}lhvxp{yx|uu|v{rwuvzpormorwprx~{~||z{ss{{wrqnp|{x{rz{xqv}}}~y}s|uvtswv{vntw{ytx|}~|z~~|v|z}zrv}}}{s{yx|{zxx{z~~~~~z~z}zz}~zuvy~~{x}~~~~z~|||z||zw|~{yz~~}|}{xx}}||}}~~|{z~}||~~}|}|~}|}}z{z||~~}}~~{{~y|~~}|~~~~~|zy|~|{yzyy}~||~}}}{|~zzzz||{~}{z~}}~}|{|}|~~|{{z{|~}~~~}~}~}{zz|{~~~}|~~~~~~|{{|~}||~~}}~~~~~~~}~}}~}}{|~~}~~~~~}}~}|}~~~~~|~~~~~~~}}~~}~~~~~}}~~~~~}~~~}}~~~}~~}~~}~}}~~~~~}}~~}}~~~~~~~~~~~}~~~~~~~~~~}~~~~~~~~~~~}}~~~~}~~}}~~~~~~~~~~~~~~~gmchess-0.29.6.3/data/sound/eat.wav000066400000000000000000000041621323660377300167500ustar00rootroot00000000000000RIFFjWAVEfmt ++fact7data7rpmoux~~{xytrtv}}~tpsvxz~~yz|zvrv||zy~zzx||w||x}|zvtrpxxvxzxz}}{|urtz|~||~~}~~}~|x|{y~~zu{}xyuvtw~zuwzyxx}wwyyy{{uw}{rsy}}}{}{wuy}}wstqquyy}}}}{wy}}ysu{wu{}}{|}wuy}}}wqpqw}ylikkkow{qsytwx}~}{ytx~}{{}~vntxvxvzz{~|rnqw{zy|~~usrtvz|vpnptuz||~~y}zxxzzxkkox~|llipz}{yrnglqw~~tiintuvtssxzyvzznswy||xvw~|}zmik{a}{u}|kYsqmL_m{}{y}us]Rt~vywpw}yy\~}}yoyz}xywJ{z}{{xsu{cxgw{{Ys~yw~rw{}uo~}~pvyouryq`u}}w||[kND^~TjuN`1px_38Q.ru~82i=|VFk_?<}_GdY<<{R2?c}CrMcMi5,|C<41p<CjBGe~MQdLgJq|E+29_~*0)k/9/m4uC|6{T`MlErQgRvA~g}]tVFjzPxa]zHyYnJ6T]v~Mwlo}}wtrswy}}zywwuxwxvu}}wwyy{{wwy}~~|}wsquy{}}}}zywx{wqlorwy}}|{ywzvpjjklnrwyzxw|~xx}|}wwsqnjpollhflkmjhsnrwu}yyz|yprk}^oxjnJf{Q\c[_VBrJiZy|^~ywykq`>WPHNO[PJwy|`m_JNKMENYUZllkw°sykUHVFMLSDXf]rgmH[DAUTAcVC~owđvoZROANHUXDO~–ӬmdTl?VF`FNUx~{iR]WP1[cXaƭrbwZ|^"yCkzke[XX?Icryqi\OFCIXcqsg[JABBUfwyk_LEDJWixshXEGFPeyyo`L@BOXhòrgMFNBLxқfPUA8es}έme[5@^P}¯{gERLGu}»iSTO`o|k]M:+!!,:DHJF>3(!%2DZo|Ƴ~hTB-!#-571" )?T]emyοm[F2""-1.$ "-6?KYjy¿ķybI4%")-*  #0ATeqxz}ºnWD6-*,14-($   -@Scpx|ù~eN=568850-*&"  $5I[jrx{r[KB=;94-*)($ ,=M^jty~Ⱦp]MB<:3*$#%&&!   .@Q^ipw~ȽsaRH>4) %+,(   '1=L\js{¶~sbL9-"#-2/&  #*07BUgt|Ǿ}q\?&$(.0/!  #*18@J]ly~zxusohK3$""!   &4>==;:=DNZhw}zwspmida`_[SI=3)" "'-220/03699::;?DO\iw}wsnjfeefaZRG=2*" !&-//---/2577778>>@CIQYcnyƿ{uroib\XVVWXXZZ\[ZYVSMHB<7435>BGOV[[YTMGEFJPYcq~ytoidaabffffffhiiihfedc`ZSMHFGKQVZ[ZUQMGDDJS^it¸~xqkigffhhhhhjihhiihhhhgd]VOKIJNTYZYWSKD@AFMU_ju{tolljiihhhiifb_\\\_bgmqqqojc\TLKNPRRRRSUUWY[aipw~ysmjghjllnnmnkieddegiiijnswz{}}{ulcZUSSTVXZ\_`aejptwxyyz~|zyvtssqrqqrrtttttttsstuwwy|~vnid_ZVUUY\^_bfloqqqqtv{{xyxxwwyz|~}{yvuttx|}vng`YVUUUUWZ_cgijmoooopu}|zzz{{||~~|xxtsqqqsuwyz|~}xqkc]WQPV]chmrvyzzyxxy{|~{zyxxz}~|zzzz{{{}}}}}~}{xwyzyvqlhefeghkptuwwutsstvwwwx{~~~~zvsqoljgggghiiijjkjiikkklosvy{~~~|{{{{{|~~}||||yvplhfffhhijkjjijjhhgiknqsw|}|||{|zywuuuvz~ug^YZ]afkrwxwrliijjjjjkms{~}}|}~~~{qhb`]\]_djmmje`[XXWXXZ]bkt|}|||~wplje_YUTUZ_ba]XRQPRVY[]cksw{~~|z{~}zwrmg_YUVY]_`]XURSTWWX[^bgmry{yy|~~|{vng`[XWY]^][XUSSTTUWZ\_cgmt{~~~~~~~{z}|wqkd^XQLHHJOSVX[\]]\ZZZ]aiqz|zyxy{~~}yri_YSQONNNQTWWWXXZ[[[[\`elt|~~}||}}}{yy{}}{uphb\UPNOQSSUVWXZ\\[[[\_cgmt}~}||{zyy{}}yvuvz}~}|yxtng`YSQQQPRRSUVXYZYZZ\]_chow~}{zyyz|~}{{yyxwvtspnlkkmmmkhc[RNLNRVZ_dhklkihknpty~|zz{}~zunidecccehjmprqohaZUROORW_houwvvtsrtx|~||{|{zyy{|yxy|}|zxurnjfda`ceghkotwwsmga\WUU[ahnrvzzzxwwwxxy||{ywwwy}~|{|}~~~{ytpkffeddccekptutsrnjd_[XY[agpvyyyywwwvuwy}}zwwxz}{z{~~~~~~|xsomigdcccgkmnqtuusoid^[Z]bfkosuwxzywwvuvy||ywuttvz}~}~}|||~{xusrpmllmprrrqponnnortvyzywtrommmmoquxy{|||{ywwww|~}}}~|||||}}~~}{z{z{wsolkknppprsssrqponnpqqsuz~{xvuttuvy{}~}~|zwvvvvx|~~~~~~~~~}}{xtrppppqqqrrrrrrrrsrqppqsy}~{wurssuvxz|||zyyxwuuvwz~}|||}}~~~~}~}{wtqqqqqqrrrrrrrsrsrqoopptw{|ywwwvuwwy{||{zyzwvuuuwz~~~~~~~~~~}yvsqrrrqqqqqqqqppppppqrrsvxxyyzz|~zvuvz~{{||~|zwwtsqpopprssrrsrpnmmmnqtvxy{~~~~}}}{xwxwyz}|yxxz|~}}||~~{zwvusrpqpoooqrtuusrqqqtvvwy|}}}~}{xvuuv{~}{yyyz{{{}~}}~~}{yvtrrqppppqsssrrrsrqsssuxz||}~}}}|xvuvy|}{zzz{}~}{yuurqppqqqsssuuutssssuuwwwy{~zyxxy|}|||||||~}||xwurpnonooqrqrqqppprsuwwy{}}}}~}}||{|{{{|}}}}|{zzzz{}~|xustttssrsrqppooooqqrrsttvvwy{}~}||||||||{zyyxwwwy|~|{xxwwvuvutsqpqpqqqqqqqqqsuxzzzz{|~}||}|{zyyz{{{xvtttwz|~|zwwvvvwvuusrqqrrrrrrrssuuuwy{{||||~~|{z{z{{{{zzyywwwxz}~~}{{zxwwvvvvvuvtssssstttttvwyzzz{{}}}}}}|||}|{{yxwwwxy{}|zzzzzxwwuvuttssstsrrrstuuvvvwyz|}}}}{{{{{{{zyyxxxxz{}}}}~~}}{z{yxxxxxxxwutttuvvvvwwwxxyyz{{{{||}~}~}|{||||||||{|{zz|}}}}{{{||{yxxxyyyxwvvvwxxxxxxyyyz{{||||~}|}||}}}}}}|{{{{|||||||}~|zzzzzzzyxwwwxwwwwwxxxxxyyyyz{{||||}}~~}}}}}}}|||||||||||||||}}~~}||||{|{zyyxyxxxxxxxxxxyz{||||||}~~}}}}~~~}~}||||||||||~~~|zzzzzzzyxxxxxxxxxyyyyyyz{{{{{|||||}~~~~~~~~}}~~}{{{{{}}||}}|||||||||||||||}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~|}||||||||||||||}}|||}}}|||||}}}}}}}~~~~}}}~~~}}}~~~~~}}}}}}}}}}}}}~~~~~~}}}}~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~gmchess-0.29.6.3/data/sound/move.wav000066400000000000000000000042061323660377300171440ustar00rootroot00000000000000RIFF~WAVEfmt ++dataY||~~|z~t|t|~vrttb~^|pnbd|`phjtpxlnzx|vzxx~xx|xv~xvzv|zzp~vrtxz~|~~|||~zp~vv|z~zz|zz~~|||zzx~|x|~zt~0N.HTT>hvdjbtlp|zxppt~v||x~vvrr~pr~~xfnnhhlrlrrvrjrpprxx|x|~~tzzz|x|~x~zxxxrztp~bzhjnhrpfrdjl^dfnnf`lhlnprrttvztzz|||trtxrjlljhhdbfbbd^\^`^\`\`fd`hjjjlrnttnrxrxz|~~xztxzzxvpnrphlhlllhljjnnlpnjnljjnprttvxz|||~~zzzxxtvvtvttttrntprnprnlpppplnnvrtrttxvtxxzzz~z|z|||~~~~zz~|||~|zxzzzxzxvvtxzzzxxzz|||zzzz||z||~~|~~~~~|~~~~~~~~~~~~~~~~~~~~||~||||||z|zzzzz|z~|z~||z||||||~~~~~~~~~~~~~~~~~~|~~||||~|zz|z||z|||z||||||||z|z|~z|||z|~||||||~z~||~|~||~~|~~~~~~~~~~~~~~~~~~~~~~~~~~|~~||||~||zz|z|||||||z|~||||||z||||~~~~~~~~~~~||~||||~~||~~~~|~|~|~|~~~||~|~~~~~~~~~~~~~~~|~~|~~||||||||||z|zz~|||z~~|~~~~~~~~~~~~|||~~~~~|~~~~~~~~~~~~~~~~~~~~~~~|~~||~|||||||||||||||||||zzzz|||||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~||||~||||~|||||||||~|||~~~|~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~||||||||||||||~~~~~||~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~||~|~||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~|~~~~~~~~~~~~|px~xzxv~rv~xtz~~zx|~||~xzx~x~zz~|||~~pxvz|~~|tr~t|r|~rhtt|p~fjphrv||~pxv|v~~x|~z|z|~xzv~t~~z||~|x~~x~px|rz~~t~xzz~v|xz||z~|~~z~~~~z||~|~z~~|~~|~|~z||z~z||~~|~~|~||z~z|~~~||z|zz|zz||z|||||~~~~~~|~~||z|||~|~~~~~~|~|~|~~~~~~~~~~~~~~~~~~~||~|~~~~~|~~|||||||x||||||~~|~||||||zzz|z~~z~~~|~~~|~~~~~~~~~~~~~~~~||~~~~~~~~~~~~~~~~~~~~~~~||~|||||||~~~~~~|zz~|z||||~|~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~gmchess-0.29.6.3/data/sound/win.wav000066400000000000000000000257601323660377300170030ustar00rootroot00000000000000RIFF+WAVEfmt ++fact+data+~~}}}}}~~~zyzzz{|}|vtwxyzz~}vruvxxux}|uqqqtwwy|z}upu|yyvs||qqzxvi^l{}tovzx|\\du~yr|hej}~~{rn{kyelwovuau~di~~ms^n{ytZ`qgXWmJaxZoVIqzsyl_]gwtdmzMVp}mp~k_mzrv][iu~sYru^gyyTauusmsYIrup{b^wsHY~fvzglkOizqfok|xT\~xzTUtdYi~{}tqn_w|ctoow~ufjx>V}|iYu`CrŽx`v~|yxYfĦ^HubUjuyrPZHGw}q\YujYqdStqskqЧr_xOLxxh^kWc~uopxr{q]tA_h^dvj^q;k{[Ww~sXnfj~\cyZPx:^cUodmo>s}WRtvxzj]xpiXY~w`\L=caxaTѥE[xeZmy{}{tmāR\[}smVYśNTlnfdӉ1^ze]bgqk^grګg`XVteiddՃ7Eztoy}xıhAv`jgGSwۏTZ~Z[il`Tdq{>;z}}vjqȆJBvdsa27mrSnw__miSIls[_lmw|p^fBCmj{zN9YXq˓`_ZNBJvڲrpw~Ifs]Tug>Rnt}{hMZħddp`gTGB[ӑz|~`pbY\hF@\}z{qui^nȀX{cZ\PHMqؾnxtny`Vc}mFkp}yqsrothbeh^]elzc}{qldr~VTrpxzw}wmpnh|hffgnjuiz~tpz~`Zmk~unz~jmyw|mrmtxjqnpuwlky`hmp}vqpgyn~zwpxnfqgxxkn{zppjotpkk{twzyjiwvox{z}zfqwurn|qvvmty|}vio~|rtyxvn{|yxtox}ywvxqy|uz}xknyzttwx}{py~{{wo{|wy|uu~y{zwpt{|xxxyxxv}||ztuzy}{y{zy{}~{rswyxwz{{|||{yvvx{x|}z|~|~yuuwvw{|}}}}~}~~{ywuxyw~{{|{xvvwxz|{|}}~}}}zzyxxxy|{|~~}~yxxxy|||~~~~|~|z{{{ww{|||~}zyww{~~|}~~~~}~|{{{yvx|||||||{zxy}}}~}}~zz||yx|~~~}|~{z{z|}{~~}}|{~~{yz~|}~~~}{|{zz}}|~~~}}~{z}~|z{~~~~|{|~}zz}{z~~~~||~||~~}z{~}}~|}z~}{{{~|{~}||}}z}~}||~}~zz}|{|~~}~}~|{~||}|{}}{}}{{|}|}}~||}~~}}}}||~~~~~{{~|{{~||}|~}{|~~}||}{~~~z}}{{}}||~|~|{|}||}|}~~~z|~{z}}}}|z{~|z~~~~|{}|yy|}||}}~{z}|zwwxz|}|{|}yxxzzwvxzzz{|{zyxtsuxyyxy}|||{xwz{zxwz~vrruvutw~tpqtwwwy~~{tqv~|zwtmkosptxsuzy|wcany{|{}}uhkt|zrqxyzvntyu}xl{ww{uztbk{~~sdn|nu~omrs~{gWk~r~v_Plulfi|rynrqv}mXXl~xx`bw|ujjuzrwwzusw{udgw|zytajwxt^_nsvztkznx~eTkxnr}x^_|s_eixti}srkysireO^pdpePfVHhv}mygb}nb}eOLq{VWqnFQxa>Kr}^bsVXsc]>Q}Ǩg\zP8ZeMW`yiQd|}\^_W~S(F|wyvua7?tyV-Bմk7WɁalklPxgNYb}ba(0[RGÜ\Fo~g_emw_M[m~eyM(Lpql\JjpvV^Xbs{sk_|J/Cg|w~rqAQxt_gWnaeevrbfi=C]wws{`D^w\Y_pyÒtXewxrnd~=8\y~`j|s̄@MvdVdlbTivt}9A`qap{wVt_CT^v_3Eepf}j3>i}fVctg^?J\mWD«c8{oxr9B|ud`dkvNCy҅r>LyJ`Ztz~{tjc[aoW8dҐupR}eD^_|{nyimhcgZ3yoq|KF˒dZh|hg~]avzZ,j̠d}otG9ڵobUZhwӀMY`qcK\kp~pMN̊scOjmoÏWHPiZg|zfneUqȓuXPqtocTQjm\winrhbriaʜ|SN{bgSQoSՔslelmqk˨{EGvtjXNQw]׸oL_tupi¥z@8pqoJ2a{ncۮZ"apyuƏZ+PОtpJ Cubռo"Fzpmb:BץgU(jDž?KWbfzh{zEqh-*X{޿KLUed~pvB_yS(LyPCG[Ze\@pE2hoͭtKEYUgu6_w}Z0bkӲME[U~u7Ounyl0]lhѳL@XP|@VymTҹQ?^QyP/ujmRVsuNʵ[DcPkZ$x{hfb^g|xNvǸeHhZaa!Vjb{hmkrMϧTOr`fD'hxefsu\rvVˮYSwnaR,\}giVeuY}]Yp`_9WgdvR\ugy\Ux]r|}iIUymkŎi~bLolp^W{^m~okUYruhȘgtpKoxv`X]eci]Zm|{nǝgitKe|{bX`cZaedg{}o{}]n_UuwUu[nq\`gew~r{ZdjTozS||`jr^bjq{twZWvViWzihx][gt{~bX`i]vlg{e^cu|z|eV}inaoo`ue^e}shWpkjjcyg}{bhd|o_TgztfplcfVmih]Wso{}~teweumTsmhZSgux|}p}bnrUsol[T`{r|ysdduUtszmXT^e|{yea}wTx|yoVX`gxiYrwQu{|oNUcl}wiQaxGi~{OMRrywt~{bI^Q{}ycKOjyozcH{eDmzqOOaxnxueOvrIiw}yTOUuvwtiQhzPhwy|~XTSsjxvv~oX\Vbtu_VUlfwx{~xaWt[cwyd[S`fu}w~m[_{[awzwm`[]azr|tlZ]wUe|~rm^[bf~b{{scXw[X~}k{b\Vzlk{~neNsgR|~jtmcSlpvqy{ujKmxXw}rktiP^zn}|um|mD[wfv~Ɇi~zpNQhyluDHvos~{˟mz|TJzs|ypP:pwr{~ŠszhAM{i|:Qxwkv~|ěrso>=yhCKzkr}{īuhu>-tucOAopkx}zbyA'hy^W=eydpˆ]A!_|ZdC}~lt_D`rzwyw}pB@zyjn{kI_sxxxqtrH@tčvnqxzN[sqxxlkuTDnҟu}ysorriPkkw~xn^lhPV͊v{xqqumvQdlr|pYbhZWyՕq~}rluxmZ_mm|oTVdeZs٠mvpeuwl{f[yrl~oTM_n^nݭjj~pav|mqs[vxkrXHXwhi߽k]ymZrrk]p{jynYBO|zmuWwpQjvb_jnvleR?[z]WxePvte}Ztzo|pbT:O~cNriUt{`]o{p{t]T5ClIkj\sb|dmrxz`Z7;rB^d^rhwrnwxy^[:4zwAQacroqt|xvz_^B1rz@G^fvtm}}xo{^]J1lB@Yfyzk{}zk}YXN/aѸ¥_=ParkkuymzgS]=:Ţc9Nbqshm{rxfM\B4Ӧg:Pesudf~~z{mM]J4wݧh:Ujt|a^w||oL]T; GfYU*k-ݯr[3".] @w twDI$43&3J9vd`ERk̘gTd|!$HUGV&"f5ffwU,Ow0_ Uatnwa8Œ^h8 >aF2s]~6@2nkw<ÏJG)S;T5^d Y ܆)^..d'leJ@U)"!3~w ?T*nf10#N3nv>ZvKG#7tάicQQH/wm֦ D\?"Jmw.w#g͜u`Dsnx#BjzTybLGǻP@ ;qGU9W5eU::xܜ #3;| _O %tEXtcreate-date2009-02-21T13:55:18+00:00jDO%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERtEXtjpeg:colorspace2,uU tEXtjpeg:sampling-factor2x2,1x1,1x1I%tEXtmodify-date2009-02-21T13:55:18+00:0059IENDB`gmchess-0.29.6.3/data/themes/west-small/black_advisor.png000066400000000000000000000040041323660377300232110ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME  YIDATHǝyP?{H4z]v'#nC|d5nr Rzi14BC𷪛b],ηT{ ͋E"e~Fٵ;¤I#I\,gw~شw& &s+NSmx&O5)ma]2:"6:\Lyoxwb4x6 ~VgbǛ؞ʹ 5Mu*&M)ݡ5s2v.ea8)PJy7 wB|Eɕ*#} #-Rtj,qК9AcS2ŬI> .N6,ɌRġ5st8ZLs(RLjɉ@)M Nq_1jPoڷ z$mFr): Ҳ{z#:ge^>2(;5JN"}`+7#:g |5VjR!ES$;6*,u[f:x{Ӊ>qIIH'/QXTK3V"_&ť׳?ed?iT,H]ڎǣc6k{'k}lb酟zh~ _%$FCuVe#pLR_564R<4,҅{9{Wju9{[V $[P?K.`ip9N8?L@ wi3!7rXt݂ U7OpVQ.R' 6 .Oz6XiUW넮IÉ쁦IΕVp~Maʙ*[XEIhUS"c9lX99ls!-1lTuy7o_^F}m_AaԨ&eR+Bs o-ƴ;Rda!T@?qV.ʄ4 )zw4|Co蝑'~Y1݆m!R kl+<5S0@lWwZ*{ʸweբbf ! !a*Eq+ ̠~ ߷=VT˛(ȅ q">.B̞6)%J)L5T\kz5XϐI2}&jeڥ̞L>ؿX$tLng$=#7-o$seP[@@>ܺzqr-~pOXpw-|Q}2B`G mNx(V?zONW;M68`wޱRl|0V>>i[Ed̜ lx{.T?:YK;QmNkLK'/<2Jɲ%LgG9m"B?~h v-HG9AtG|} JŜdV!@JuYyBz@~+Tcժaoexb6W+לLLXolfHB?$k(tJmh UgdbW`/3coh[פb ?/3nAG]o&G+q)O؉B?)ILp<2k Uboqh`a5I-TѤif89Ƅs ӎRfȟ8"gKN.//lh'^bWh&0LQw%-œG'wTq_RI r E'ou!2i0j#^7G1<1 ?RT1$>GZw:lBX5JaslLtr'gMνNQBrMػW潬[m aPddo)],#7 BX$U',уRB`5W烀K;kbƒ^ΠOSⓘ. |j5 OGJmN7 NƄ7]-QeSzB9rʮ0#!v8r3*$`?m(pZ~'V yƖBN$8JA}șJ΍?w0~Udo6 _.l r@20 nݝ޷3BZ)CYʚT_(Zo\ؑ buδA>q󟷜Tl4Mw8[V*kҮCof5-kpi+ÿ fKTܗ+Hl]f^p/A_L %+;㹅U ׅ19(l]H;uU&!2!dH rĹehBDeD}jW*?o[c#i-ԯ704!n\oS\RE_rA:cr DYeMk wU74rX,=< Z l >+:ecm5FZ4*}K2ǩ'$IENDB`gmchess-0.29.6.3/data/themes/west-small/black_cannon.png000066400000000000000000000040221323660377300230160ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME ,YIDATHǥkTes8\DJg#(W& b7J\V2uokBm$rteV$AC@(pC9wgoI $Y,_sIj^CrbK`+༓1q^@}bƧD`xu&Аts/ҊB[npU-ý߲#˶PuV4- ahǪyظSƲ_}[Y[ "դ HnָH-L2ee9y) f5]5n#wZH;nVW)zw[-2R]TީƲ i v[W1~RJ~H)C#\cNzM.HKu-֔ !Ek*fVD4Jv.Pcr 0OF!%h!R,>Ɇٴ +K&IPm:Qill=}~ HM rSWz~,I d?N`/N sGԜgĠ^̟410,7f5o<áҊq& }A 4 2_mC_{ԵTFv pȈ|_VMrRѓ5ψĩ3'8|ӥS_ՉGq_9BjR uE7/`NԢzäzSsp;ϿيlCa$)#ҭsB@HФl WsZ\,yN_y/s[Mhta=2{d .ᤢ鞙GȚ[@jKUr]kg]U<` Vp6lfBV&fcyJNHՖ#a8&W5^*yh_D4߃ @Es=,-؃F$%Փ//RDޖ ^'1]}lڵ{1ovzw`@\4 = ᤸJ_˨!앢L>}/ ?'&1I\o15B;633PTZZv _%$ _v5y]f2^;zIENDB`gmchess-0.29.6.3/data/themes/west-small/black_king.png000066400000000000000000000041341323660377300224760ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME 9;OIDATHǝipU{ݳrSHGTh-hƎUDVTAPvl,!DrM@=I=02>3,6ťQ p 04=.Gmu`;u1f"?=W3,9A:Pa$'sKSszbVmq/ؼhԣަ2 M?F2T;qϭ3X܏>Yr3x,5lKodۊ6v՝htBQ? ]Yn)͒e=.З[u^1"{/?P\ܜ d9vW"VNR&%އm([1./37,zMiyT+>K^{>2n9{$P.Ϯ] @f͘$(L^}^y]+@,қ w WP[)c5 |\y?o؂R0ʟJ"Tml /`xYb@AQKdܜtuk Km}!v֚N㲑irӗćo˟[*yV(9 ;qÀJ)bԂ'9B|5q"-^[5|}R&޸1sRP3gsUh rT5[}m"dCbdzrȦ5EjK#NU㔒G0_R3azzNx&~uḦ́kK\NZՋ26[:wx&;7: LNy#BhݿUm bLTV" lQl!{+k.rM=Kw~9m3?,ʪ>5]8^wm"̺6w=. <_2)!w{<'iSn l/Ǫ9}n+2 C脘y05AJCajlsFlas[Yd⌞[v>yK +ߊ @[?c(-]T'ޞ)2ˉ֊Xmk'͟40|ԈyxwLqVg 76;C,Y& nH]Y|ՕI@F?=IF%IfZHM̴$IM8IID"+s[˘27=6pW}ϞƲȜ[[Xi]46[v|B])4HM/L>uY}̨blu" ocv@oW(מpgށgΓEb CYXc xxuUIGWKi9OL/OB Ǻ-HBJRi >;>SH|^T\f͘ĴrV Ne^Lv~zbc䊼"1!.WSYѯYU8Lۊ6L+'dϻ)$Hgwjn$p8 D&ߴ7GeU`_C׊MtY6ö e*.e_OIENDB`gmchess-0.29.6.3/data/themes/west-small/black_king_die.png000066400000000000000000000041341323660377300233170ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME 9;OIDATHǝipU{ݳrSHGTh-hƎUDVTAPvl,!DrM@=I=02>3,6ťQ p 04=.Gmu`;u1f"?=W3,9A:Pa$'sKSszbVmq/ؼhԣަ2 M?F2T;qϭ3X܏>Yr3x,5lKodۊ6v՝htBQ? ]Yn)͒e=.З[u^1"{/?P\ܜ d9vW"VNR&%އm([1./37,zMiyT+>K^{>2n9{$P.Ϯ] @f͘$(L^}^y]+@,қ w WP[)c5 |\y?o؂R0ʟJ"Tml /`xYb@AQKdܜtuk Km}!v֚N㲑irӗćo˟[*yV(9 ;qÀJ)bԂ'9B|5q"-^[5|}R&޸1sRP3gsUh rT5[}m"dCbdzrȦ5EjK#NU㔒G0_R3azzNx&~uḦ́kK\NZՋ26[:wx&;7: LNy#BhݿUm bLTV" lQl!{+k.rM=Kw~9m3?,ʪ>5]8^wm"̺6w=. <_2)!w{<'iSn l/Ǫ9}n+2 C脘y05AJCajlsFlas[Yd⌞[v>yK +ߊ @[?c(-]T'ޞ)2ˉ֊Xmk'͟40|ԈyxwLqVg 76;C,Y& nH]Y|ՕI@F?=IF%IfZHM̴$IM8IID"+s[˘27=6pW}ϞƲȜ[[Xi]46[v|B])4HM/L>uY}̨blu" ocv@oW(מpgށgΓEb CYXc xxuUIGWKi9OL/OB Ǻ-HBJRi >;>SH|^T\f͘ĴrV Ne^Lv~zbc䊼"1!.WSYѯYU8Lۊ6L+'dϻ)$Hgwjn$p8 D&ߴ7GeU`_C׊MtY6ö e*.e_OIENDB`gmchess-0.29.6.3/data/themes/west-small/black_knight.png000066400000000000000000000040251323660377300230310ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME IDATHǝyPTWYm BDѨ@+jU[LF5(.L$eMDPS5z VNխ{~s#x6 &)eZЫu2[?| jx@K ѩS|M9jNWlmLpU|{oK?? ^1ỾX$b)~[4ILdG"C4%;V(>>X7qؓ^{ "դ ̉1bʂ\/΢iPĨ ߔRH?3XY1%}'9Y\rMܲ\d]7jZդ RJ]=c-;'ؘp+gF!J)R fVV. B 'c^WJ+TI6s=!EDS`T7 Gv,M(L)v}sMzzpEQ MjQ$o;=uHGv,}KȜ8o`E$1=e0hYu.+9Rх#bƤWm^jqc{>7.&\ƄCR>^&[\$O3>\ЗxcSVm@JɌdwD|."6:, kg\39~2c:pWۣ3f@ wNo*+g0>9?Dv#iZ[. юIXX> @kj]7f!|7'OPTRμ_#I<@PeJa1.tqi&O?dT ]^o`!㻢~-#ؗg- I Rx~`Z`Hء =#lj){`ADw@ 0aD?M0 F@0O_4iV .{Db1%U׸߭WJ_?\|hM=[H]:cuBB`yЍZM/J?s{E54B Qqח'R0l`!sBZ̾BLN9BjRk늶=N=x㵗Q v~!چ Mj6}MT9w \3 '6 G7Vz. e(vdqkU4nS޾m0E˚yz]ABڅ;j 2 _Ȃ{)vZ޸-XFh`.OtB؎3Au6:g(ܷ/5LĨByh6# *{|3J!p{}+gbc9u n{qO5 |[U}GvxNNP]O39% yGx<, tqijɚ k*!L~ɖXy heɚW~ 4~+.:BI>YD޺wpyh8 _CeI%j]; 3_䷋2nX+6s~#(15\{^"=W(x^o)x fS}2 > 7)T.olJwtə9bKv^i @3؝w<_ĴXb{w>ѽkG6ǨqW-v&!P +9X~?̝^_)jM#)"FlĠjDD469l?- yG;,䁱j̬uv!EdjY#H-{5XFabF髦,7rD$DM7Nٔ%T9xtfж ƭ{b? (,֠/ұ,3j1kIVKIjm~=޳ ́geaOͨ/IENDB`gmchess-0.29.6.3/data/themes/west-small/black_pawn.png000066400000000000000000000035701323660377300225160ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME $}IDATHǝ}PTeP4FK`5m1HD?&jb4f(vTXEc`~Ǝ!D@? " .K@P{{=9 `c2&xzC :k6G{M{V\-r&E cRe~Wx._Z[mӥa4,?_*|$Su(YG0 a!C DUVrt8e-%+=1@TUMKק  oɖDVJVÉ?I)Q:S)~Gny*c5MoybPUQ|N#<,H^bC()%Bt<nuIҊlWݕ+2&A5]/;^JxoQػ]V[4!HIK4ؠ3;Fnr]-N4js}ʜiԹ"q+@ݳR^izheY?+ 6v'9'ŒS/Vrf_%Gqn=K濆]LYtu2 ֣d~  *=B[VT(wl[&;իu訑4ڄhxI0 K|ݐo9=M;G[4; Zahs2e0"= 0;6~/3bD'>f;aL%,c\*&7s9?!>&1]xnfN`}Vu@ꇝe$_˾bmrS_G+keeu/=kC%g|f|l4!\voožsxCݱ,;5RJ67krƲ- BOH-BK7L{E9cx?ۡ7#J[sO#'0#v<1dV E6[J}9   K)vf8檝.Xs #:ʒhҩ]f0dT'xMEs#Yt]]oTnIENDB`gmchess-0.29.6.3/data/themes/west-small/black_rook.png000066400000000000000000000034421323660377300225210ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME -#yuIDATHǵmPU}ν DJڑmM6T&62MtNTH~ &D%IM5iT Ah^#"%㊂dg:݊{3;$M7.>g_Q тQ ~,sI2JwGw7Zt _]SrxNA$1=.bϡ/ģyኲqQ㉊G58jTGyer1JGw8{T4a'sR"e\nx0{Qꖛ[!0J6\{%k9uy]4 }ǤEǻ6Tt{PBD$X)fM`}XSة498ջ7F用/`*YV!{S)oϕ ĎsR{sצ%(]4\!,$O7hiūDNGSK+u .`)?`c*Okݾ30BʋsdUzH;b-qԘ ladHHMڎ.J!,TBڎ.!6JKe djgϿY"؉LM@|g95Q~ i%8Ye8\[.i?̞%Kjy[|Rf`I >:TKa^&3lEHOotY FGwXn/UҬ،Mv D2(*ڏt%U'WJ[=nAC)D)_AP/oJ7QMn4?(E\v`WqavAoEˬ)L/T??Kbf R LL ک=`#Fl  5.lHM1!>-,$tM Ӹ늎nt]aFu 9b Ŏ>FsIxX0^_0ޡ4fdR(O<Wh"Cxw)n P}7iƾ>QJ, kKY[p9.v*8PVu4٥Vd$BS<8)|!4nCznnIke/Tރ[LǻMn6#+aǻ8- 7<>-6T4~RGi@XT!` szzuQ0MV>$_\I4/.l?u|Y%ު JwOj5Zu| bkQj7~wV ˤz-/ڢcM㚧qmFϣIENDB`gmchess-0.29.6.3/data/themes/west-small/null.png000066400000000000000000000003621323660377300213630ustar00rootroot00000000000000PNG  IHDRbKGD#2 pHYsHHFk> vpAgUPIDAT8c@.`"[QZGjJp=9.;%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/west-small/red_advisor.png000066400000000000000000000037261323660377300227210ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME ::VIDATHǥ{pUsy@B" ! 6XNKQ bibiZҎҦ1U3c!`^@ B"IH}>٫{f3s^kF"p'p,pP^mήPFkx(e;g ]y=3 ,AԚIe8l(yQVS`x5bJxS~toKryH`)XMlW ejQϬ]dd ]5 R7o 3g5Wt<}n[sp2dz fZy^F9ɸ7~M+ -sk^'|OLD]qѳ=!0/[#"qE^8 t0̤wJUqB@M/iP{!XYsc$!͏{ *;!rϾ›= H:N?F%wkjٞZ68h֔5E7AR( Mҵ9V`u{fjyHN-8(K'w8+ F˫ngI${~|vs4x+q?y/rB|e(Hc+Q`YTCGG8k Wި? ewOאBu'K"=PgJ"Ώ+psw 1 tG}Hck'$Ng-mgv8{њ@"q`[vdrCa1MG;?1kvW#%i'FMsfv$fAlĶ@ aP$5 #њīip; ߎA ]=FW543Zʸw*j= ϱ݊R(Ck>!v<67."0hRNϣl[z.NPS h|t0LݬLހr9ϯ*Z*~aOQ3maQJ&e>xwy}_a]àjR&]5[3p5CK ^ sl6n.{}OKiF\Sw2t7D9M0G2 DSDj󛊃*W_uv'qk??[h!i:ʫgΡ؝12'b//y%Oc #D5sCۛ͝9ňe 9Ɣ,G=4C&03WH^S?^7ϑK!o~y?;=7,LtSlݧ)0XgZiJÌKmwKf󺥌,p$q•xFÑj$Av;Uʟ]ժ_<[0ndge$3g&qђaCIiezt`WdneʀM߷PwIENDB`gmchess-0.29.6.3/data/themes/west-small/red_bishop.png000066400000000000000000000041241323660377300225270ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME  v TIDATHǝ{PT?Ab"JL_QLڴN2q&&1ӈL>N46SkV QKa@daw=cG9s{~^{6 jYS41LF)p8K1YKZ0)q*#7; Q4DO[ŻG>\YU 0;Mx<TvŚc"S8# wTr[ȍi*7HTT5kTafE&"^)q[L) =Jy?Ykx^pɑaTҡv|%X&µnB RwBLtDPQU/fmBwk=g]R\^Hܸ%SP# qJZFK)7@=5@jz[4#)Y,bL챨 ZP > 3-d""m}@8OLE,p7hGY%/EX.ָ0uIM\۴v? vۅ3~cDqe_v+egދb\} f'&3WaC70[N^GD 5|ߐ]Xb+223EeX&ǘԎcOƌf#-%-R%BJ#Q V0)X/ach!ҫ3sUEI`S?/EȠs}~BʠۊHFO_{!R#,[0`rsb ]`FJA{g|~N;} 4ibV1RPy? SfxXӒ/ZӤf{Rn䂢 ލ ͝JtWcҫ\-48*7ӧBBGX1fMց==%Rr-wr0I~e5f!*s(kM4"~<"G#l=ed[5ɢIi3")}~cnvܑK_3LιaO=='9βjN1&i>vlhRi5,/`K@י = 4M*A)UshԿi4?=栋ouiY>=&*S]%f$#ab缀fpdŞ>KHAs~*3Ơ7]oځ־ 'cLE@)EץZ<Ó{:6DSV-0+ʢEʆ~ܥW_=[Tdԅ?S>y-BHN'fZ6w#B"aݏ `PHwY5Ʀ)]J'-B\p?%> fAFF-o(Owzs;5E^Hz(=*ep+M vԎc3`Y8˷ $x|R#>܊ex*`ZBh{MיuvGr+*D PbQ"8)4kQAFb6;\rƩTiYA(G KMŸ>+: 3W&tL@X@J~%sIjEdl+ڕ\~_j(zWp<., *nJ'B^n>l@&7YwUԩjC͉= E-͹/sFҋ9|]rҴ#_ZF50[9ұݿ`|LHnPB5oRHan!Egި3!C%LLb.#d6m HLb.ӳc[R)޶F 8u^v#shFn{:]k(HTV a#B ?7wV ^lV ?&Ҳÿ׊wE4Um hRs=p.t9 wq8tIENDB`gmchess-0.29.6.3/data/themes/west-small/red_cannon.png000066400000000000000000000037361323660377300225270ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME  %4̎^IDATHǥ{lS96!IpI1*%5T`F5k5V6(Ж"R Z NeAĥIl>!@V}==}30(0 cvMZCpH+G]&}fXv^.Ę68ج +?:|x*GKą`cbtUKW?ΦwQ!awLJcK#VU\zUUkؤW\_\!%RE 0X%-ehdLxiW("9ZX$" 3QGfנrUR$N-\ԙUK-WFEgwh_)臩O_<Jgf>Z:%"af>BQ1&(?à~"#R +mÌbDC)?]evQ-݊BbmٓWT6,;a% "._%~Ei~'jFT:**d(n~QxM*f^[>&/k $a<3zi視q6_Qe@2x{?˳D̼_ @A^7 K)QLF*穽ftQ"f$k&"^?nNe=΂ܛ]bH&?)ɐч>T7Ԯҹ<MXsӉ4hW%{ :J[ٷ\g$K܄+Tzh4 SL1Fۆ%+҈h`PA¹"g`I@֡T{`mÚNg=!x#_AF4,)8na2UQ&M}(n"uH9^Ð;8u59g?%sӘzǁnITEu4]k ¡:S"WV@qO c1ᅥ Ca<rh=!^@M"wOoCHh5-={ uOϣ/5`5g?G7:I Ԟ6Tc^0 nEcLpMđv+:nBp!7Z̓Aw"YQ48I=03;sD7[j!qOw;+ɀSC G Z;_1!bLTNZ`spe#5oާbBoHlf :ALYn8X̄/^^mؐc$j\TK.: i3Y==7L\)F4G՝:'Btuu{-fN+$z=;=HsX6/%e+hS^NҘ\m.) 89Oo޺ݖ \#r<{v;uOOB 僑r5BTؖKo^*[4m?1#ېT,Y)NǝN{*}M)?G**U5M@ѓ(w~aQrJ?(05F W垚w~哮ѻ4`Ѩ̦UQup]2r/*" 0IENDB`gmchess-0.29.6.3/data/themes/west-small/red_king.png000066400000000000000000000040751323660377300222000ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME  2jIIIDATHǝ{p}f.pɆ$H@0δᦃciQk@ 3E)V-hteZuP *:`v$$*hICB6dw;yssΫnWX`7z@Nu~% ~1c"gΞVz󒫘7>"ބ w`:.i56V/9{M33 T3{]Z@Zq>f8ıf1-d^مsl]jhjʿu_,¨"1 zx~ nͩ/0O{aK]׋#uHDN۱>2r7faTWŋ'PZ!"P ehp:z(OС4Nm:#u˹ǺV#7vR<7C-mpz.dYd ApBI`FVݿf5 0|*Ԡ_JxC ڰ>'۸pv=Ąׂ ~/BZ| -9X0x @e (VK磴ExBO?E틱`fI4#dњq tU4-( 5rMoȀR yn{' $:;1B!"`qZ}2(% 4w~PJJ+xhjwQ Y$">332d~Ҫ?O(`ţoj+( Sq[$'tYAJA2=[ 1MU\/E2e |R o&4hoBY9WV^fW|R(I~օLpa '팪,U*c31|\G(@)EpF>=V6HKu2Jpx"C/"LҙA|`h#]N '1e؉$=>H4F;1&s'( }$ ]:9`tɠX60LP"*5ɏ[Hak{L~EI5= X[ )U\mx5јJl#71E"^5= i`:}T!|u ߱%U]D.ڑEehڷ1s 1dOs] ^sUK9dptzUKH+XCN(G9%Cv&-E O֐z)/`ϐ5sˍ8]۟ ~"ɑ7y,hV*A}Jd!|L߇ #Fϻ {?LF2l7lnyɴG.z`hZ6cכ&JF$R)Qo$;V2y2P_=K΢fmMc8nӫWj93$cX"nE0 >{uLXq6^Y~"_'عޫ #״K0aweimHˋr{.};{'^qo੗1uS^ד*_n'WmEZҸz\;V#gQw=/ʽGw^9K PSƹ_ʙ5.3bt|"&ҹ ٥,öΐ~,iKSEӲkˤGT۳{r ]V@8#74UKhTQcm@gNee7\ ,Ŷ Ǥ&Tˇ %ǾbYfв_oh#zn@{g=,ƐŪIENDB`gmchess-0.29.6.3/data/themes/west-small/red_king_die.png000066400000000000000000000040751323660377300230210ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME  2jIIIDATHǝ{p}f.pɆ$H@0δᦃciQk@ 3E)V-hteZuP *:`v$$*hICB6dw;yssΫnWX`7z@Nu~% ~1c"gΞVz󒫘7>"ބ w`:.i56V/9{M33 T3{]Z@Zq>f8ıf1-d^مsl]jhjʿu_,¨"1 zx~ nͩ/0O{aK]׋#uHDN۱>2r7faTWŋ'PZ!"P ehp:z(OС4Nm:#u˹ǺV#7vR<7C-mpz.dYd ApBI`FVݿf5 0|*Ԡ_JxC ڰ>'۸pv=Ąׂ ~/BZ| -9X0x @e (VK磴ExBO?E틱`fI4#dњq tU4-( 5rMoȀR yn{' $:;1B!"`qZ}2(% 4w~PJJ+xhjwQ Y$">332d~Ҫ?O(`ţoj+( Sq[$'tYAJA2=[ 1MU\/E2e |R o&4hoBY9WV^fW|R(I~օLpa '팪,U*c31|\G(@)EpF>=V6HKu2Jpx"C/"LҙA|`h#]N '1e؉$=>H4F;1&s'( }$ ]:9`tɠX60LP"*5ɏ[Hak{L~EI5= X[ )U\mx5јJl#71E"^5= i`:}T!|u ߱%U]D.ڑEehڷ1s 1dOs] ^sUK9dptzUKH+XCN(G9%Cv&-E O֐z)/`ϐ5sˍ8]۟ ~"ɑ7y,hV*A}Jd!|L߇ #Fϻ {?LF2l7lnyɴG.z`hZ6cכ&JF$R)Qo$;V2y2P_=K΢fmMc8nӫWj93$cX"nE0 >{uLXq6^Y~"_'عޫ #״K0aweimHˋr{.};{'^qo੗1uS^ד*_n'WmEZҸz\;V#gQw=/ʽGw^9K PSƹ_ʙ5.3bt|"&ҹ ٥,öΐ~,iKSEӲkˤGT۳{r ]V@8#74UKhTQcm@gNee7\ ,Ŷ Ǥ&Tˇ %ǾbYfв_oh#zn@{g=,ƐŪIENDB`gmchess-0.29.6.3/data/themes/west-small/red_knight.png000066400000000000000000000037751323660377300225420ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME  #{}IDATHǝ{PT?ܽ˲ hh+$:i;8љMm2(ƙMlt"DIDUm#ZT0 " ˲{ ̙{wGh ,fVMOѤmFk&eTǁCa|ޚӘR >܆%hhFQiW<⣲3wW++cTŠ԰~'8SLIӎj ^w5kį\@ì*X\+ Ti y 7J$_ΰչ{R(@tpi^w>$(Mۻj6 A5)J{׺Fb RVaz})PJ& Kl4Ҧ#@ ƪ";`s^"H ,y|W\v{"yi=*)h~ysf$GŐ"Qw0̋rs񆼅84+ctziv%n;w>&X! h={@}3h;xμI颤{J=k\žoɷK1}T qnmi^xSH/݈%uad{BF9f3R`pNI[2 1=! BP·j0v N褳 }e6&dTh#i2 b¸ wS_~i?aX R|,u<}vF t-ç1A a`!% r]J`!1cmR E͚f|zU]+R}bK2>'BH 4i>| 7ת4ҍc&ķ^%nLTx$ؗ¢q~Ɲ׶THGq8$H{C΍"Tm+YH2F )^閚}ST¬K1NM=gJpEҸs$Ϟd9?Z-HP Oۑ_=_ ?qAԿ[s\*4KG+S?)tu/V?ۭssMePJh1]3(O4OP.VWZ.ݚI-0 3P we._*uY!UIENDB`gmchess-0.29.6.3/data/themes/west-small/red_pawn.png000066400000000000000000000035301323660377300222100ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME  *!7IDATHǝmPy]V/qɲƌbL+3qj 3m$8դӚѩNS$L11qNjDY#uQHQYwYyn?"j @TjOqtUWȗ*H. zSҗjN1lxj\D?Xr6Fq;?>ZzZ"0!Hɨg0Om߿}j&Rr!o #؋x(.&`?KǎoAv>,@ 0g=3>3̉ !z0{,"ʋipdoAul&ƒ3;%c<nB 5oҾ!|RBo-q ,P4 cϛ<,H$ =XWf1!<6"1q M3R-3;-=S=Ѓ-{2p?:dO[^ϰA٦Il\if]!U iKsUIIa%:QU`Z5F ЕT]|/DTޭD#6B!M$@X4җ0Ͼ&} 6$8)%F1)Dñ6%׷ʠNjb[JQ[q}C!2Ӽz+I38 zX,^u_vErج !@o5|}L{ܷ'] ڬĚEgN >+/;pYqj·#﫽(R@G8{S-/~:GXxLyma5A#i )# j(h>Dhb29@{Zk@?a2ڿ{:6QOjLwOop~mdXȌx;rKM(YIW)1s]Sq3 *K[q_hdc7py8p%U-NLsw\6/0ؾ7w},Ԭd.H0Y)eF*Bݢd|;E52hFP(|! fr6HS}IdECySfL>3M.vPDCkWN#;SEޣh9.yQv |I1@-ގ*I~_\?!=av7Ӊi*1} Tg83{GeI>+2Kfi#/}U͞tIENDB`gmchess-0.29.6.3/data/themes/west-small/red_rook.png000066400000000000000000000034241323660377300222170ustar00rootroot00000000000000PNG  IHDRVgsRGBbKGD pHYs  tIME  IDATHǵLU?9{\~X- آTeb,Z-Mө(e]:2%jjm mUW8 jGDTTPZ.*Ѐ^{9@ĊI'}yQܞybs ]-ꍄ#~3b@p`j3f\t> %/._:t#]=5G9^\ ]3,+IT0r$&'GB,ў>B ~>Eȟ#+Թ @uMZ}zsRT}ii?ɤB aM&"h.rK*~@׵YeT4\8{SjRTF`)Ddp`b 7 X߈ocޭ46OlJK*.W/!iB$jlwNWaZ_KWE|_[Vl.^ŕ@MX:/v |{;Gb'oq&O r5Xb<+o#&`R$\V, n~O}"r:^zC+X 'b$B|oʉ,<$3i`wHvV9ANs} DZ:S~9;=]"n9Ҙw_ƼH-yrD%g2jWJh T8ܬ>~I`hM{\;I?4ގ6n&fW/,byGYVM=ht\]{\s[Ŗ֢5olS;ԕ> ;brv׾hrhdϦrS$\`-5ǻMq@S'3uFh$7-He^41\#iÝ-*M=vϼ?B. *2F5kuc{BR~2C{zOi*jۑ\RUV"Po`d᝝''=ы=Ki_#YUZ|@(*'DIP ]0-LCgܠ?٭> vpAgUPmIDATH д]& ;LJXDi`IgY#,-׳cB *T誵1;˾3߳ :j@Q&76h %tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/west/000077500000000000000000000000001323660377300165745ustar00rootroot00000000000000gmchess-0.29.6.3/data/themes/west/Makefile.am000066400000000000000000000010011323660377300206200ustar00rootroot00000000000000 gmchessimagedir= $(pkgdatadir)/themes/west gmchessimage_DATA= \ bg.png \ select.png \ null.png \ red_king.png \ red_king_die.png \ black_king.png \ black_king_die.png \ red_advisor.png \ black_advisor.png \ red_bishop.png \ black_bishop.png \ red_knight.png \ black_knight.png \ red_rook.png \ black_rook.png \ red_cannon.png \ black_cannon.png \ red_pawn.png \ black_pawn.png EXTRA_DIST= $(gmchessimage_DATA) gmchess-0.29.6.3/data/themes/west/bg.png000066400000000000000000000031201323660377300176660ustar00rootroot00000000000000PNG  IHDR00`n pHYs  ~ vpAg00WBIDATXÕYQ8,.}4mG>|U8[@8cZlv1Wjwc܃fRߴ4JDP8ݒV繅mSkV0divtқcl9hQD$]u(^U~:5Ƿ~c JgC-a3r^8&"t{kͯaD9I]U;VU|> sN7L=*.t5zbߏ$B,9D/קh`rn\H{arP7IUvhj hաd|e}bp∊ h7F4Yy)}V4;w&[͋tBsƿk}A۷)1Z:1.Ql['"T&N*,"2`03{%oD/)iVZV#U1mtx8v;gw!M%Ejt kɁjwURa˕VײK]IC/-ҵWK @N&lYuW>tLR IVR^;+^1)J J3z 7 ˺+cHeBreu;NmL{ EA13X!̌7OD+U_½jBT޳)R9T"n]9nY`n< H#"eBz2i.=ӳkt?&/Qڀiheɤ@P]~ٚ ?ܜ:&_ (*刈 U:3$@$J`E5&"9T&TИAyU!(˄L@klFD F3D ZCB"8Ռ9+le&{N6(3s5c.. DGz6(o4qn}UsY3SW_փC"9z|>jWauq/,T˫%/}Jd9⺨ihuz c9:t/C_1ư6|>۶}~~237z<1=gOț LM3[ Pu_T92rI3W%iEA1TT^)b3.q\>Pj<f xyz9pED?W%tEXtcreate-date2009-02-21T13:55:18+00:00jDOtEXtjpeg:colorspace2,uU tEXtjpeg:sampling-factor2x2,1x1,1x1I%tEXtmodify-date2009-02-21T13:55:18+00:0059IENDB`gmchess-0.29.6.3/data/themes/west/black_advisor.png000066400000000000000000000131111323660377300221020ustar00rootroot00000000000000PNG  IHDR99sRGBbKGD pHYs  tIME 6,?uIDATh͛ytU?z%{ %A &* 0 " DFdFID@@Vþ'l$@H!k?,ie{N{~KpoX+h $uJ@ q  ˼WwjC@բ A9m,bTa:E%)(r d Áǀ@ZI8ciVbp8X4EhH)i CzJ)5i!M(=SQLyե`nL_բҠvUN-6 0R"SPTR+99z*Wڐn{.9fWRvt`4` tuDao Z7]! W,,[̴yku4 wt>aܶ[/+ύ=n1 `K=1.ƍjoųnaG?$,mGb#p3"Z>oGߒ||Ϗ˽|V4JnZ4LXBfжE=˂U۹̷n"@Z*s@@k@Wu3h D~)}Z9]Ztd|qзA LkײĈŪ ֮1n4rT4q>AT,JneP;ruێp);O$H¥܇8DltmcvA9vW]˺l^64oﶣRJĘ,NJ&4Ӊ4rU?3-3~t~q);Է1eA 3jQ7MJ("(¢!NG gqR2jŒ_yI|_" U񥗛>ɲY/4!3*ɣJ|k Уe p{,*Ph=|Sb#8A^^U%"*a"ؕqS)2cc բF\ 4QV^ҕ<*Gp)%v֩ku f(N"5-*p8zs[272:?(Ŋ{0tX %&*&Ӻqq#'.In^! KœwӤHüuxƼ8c|Ňaۉ|38X=?ӵ/UZlA옦yڏĹfX0v[X4Gg0"3*x &Z9IԪ\q{;̷A]1 r3+dv>M9r7d0УJLorŒjQ=AA? PJ_9.xu30D~B.z7Y8{CSBⓏШN5fds.3 ;?քɣfˢqӋxY5Ə| [4oi]h*g,z<$7d孿3Hթ K $`I9}Pv&1͟py4]*naEcᢍ$ xN,*п=Eج4GNfm&n~)ltX+vkD_ 0;Cf2Μ>Ų{oRR7d r#)4 jTM˺810]5am>0\2ea`vo,vk P8ԍ#6:&2,#_aBWgXzW~q*u)^FPNj6pEIjWKҳsKC+tnVq':&Ԯ|q&#?uzn]y%+W wlޙʁt;p$o#>.tBz)%J8{!"!>cVFӄ8K^JDS@^A [)Q,/OBUP4ݫ۝g9U !@7ޱ) K8x<֯բ@s hv\ ͏o4̀::5㡦5m)?MjQB(ibhH %?sѦY퀺itx>{ s5`鰑uQmZoHzbI>FPEA"ńM))eo ,BYBf5*8;\+ju6,ƕ|ժ <~NgAج!(u{0Lk`ܔLӤ-tVn>g.gכdW1TPVcT*8h@%EC/rѰN\4u4E.@횱 %T ;*gLr)rع9~j#ZlFs.3!6PI4?n gal1DW7q!h xaٗ}'L 4:Ɨ *DGqg I 'n/h abhxuM 4LF6# q&lc+6LațR֢ A~A1՛`AJ +r*2Ҕbi  MSຮ%,˭#)%Y,X-4Lџ@/)(.EJI͘KX:]Z2Ϝ Uč p&()bT<^"5H70)%6EAlt.RX"bYSx!zA1ANW Xb;x'>i[@aq) KhRzĘ6 辅+PlGGJMJ^; sr+M}Ӭb 1Q* $4O݅p%:g_eZN^GhӔ=:@/r:1CI= Ȁ2UUp}\n/[@DQAh q7LnFDEOn[렪J@y$iD%' MlLY9MfhmsHȹ㑒;*(?99|whJ\RFGPrS \:E5ؼ+rDɥe#Xv?ɀџz:gʻEwaՆԬML0 acɸ|>][r-e n"ʌ .g,~w_MҜW /%Q$yIzcI9BW²u^XBp)C,<_e*rH) | kno_Q"˜&XmX,֯)i,OJnJ)N;} ӞWf|O\=z1S fadXXTU_`]qAB`<גoń=kgk(+d?SZ%z:)Ay؊\Pn ek}^`K=o~s+17/GJ)}7ś0!h*S~ۣ|Gg>K`x󔺽|0' ,ڝs>Y=}uCLZd\FMZ//Ityۗ^Lv Uc~e_&Sk 6/z C7Lt3 u)gXr&#QUBG( F@9>MoN[*?']}^[5||EJZ V!SkTgJ'nH rd!Sز8z!} @$.F=߫-|k=b~Qڷ˲F;o |z X:sB16:FljѸnNpح,XUj+8S3a^9t>7kՂ:i'|ħK6q*ڇ']o.L,W²񄿲}53 D(۬%uJGf%=^J:v[rILT(lT∎ f!16vK|PR t8֨u_f q.e{[fcfV>=XemiK⊻. 3qes0g7}_ﺮn! `D P@Pd@p>͚I n:{,-0)2E6Ayr;.G6dp7a5kL%a5O,#l@!lQu]Cɉ8Efvp]kM> :EGZF%A;[/(2O/$K/L͎`2ʘ A"jBfiK!zޅ"m=,\s%v`XV`.pWXqI Awy*<_xHУxӵ<{F@F1Lz/I"L xTtUCu0U d'k8r,n x~L/aoD@ k.sr;Mϑgв!ύIRߎ^8Vɻ`_W>}} V-SUokqÀ@]rc⛵;Q/~,\nWI#hѼGNR5V=ݣːhe}j:o!*Hm7 CNW-c]j\UbwFIb3Je+;\b!:`>#K֯2wq, c:$!̠*? bD veW&eV^HV.VQ7Y+=|2bk`YXc?%2{3_|BKP2(-rYF5r{$%ޘOYGVh7&FӴBl-/ o<71))NJJ 2 X4wHˠ:[đ?kLBP5I/-25 HNMyaLoZ&Ƣ4M'x.__ġ3<daT L V)I=wKN,&7y8cM),BۛO@+wOE/qw\y_m@2*7dEM `(u#[}_L~ڍ;< 96VS[?)UP$ 4pP}B^^!|˜<4sӀMFZxg9sǫ .QgVV.-+SQUIr+<_nxqyvu&fg()-r t&=UX6zBx5 0eXCX>`A|v'jIh;=@;h""YJtԽ!A~,[FL0Z4HSF\(,9g x[k$FB`;Y.Lxba((+'kne*/Å|A0W-dlDfltH{ndnEb(U Vk sy َ 5ڟ~'K71qj6VF-{;GUY^^sVܿ<*}ⲭGкi}l@@ b#XzwODWk}z > Ds4JJ+9wa}:qW&gi YW}5n=jqOǦI>7STRVZLSvf\H|A lgt)x<=9uF<ЙyyOG[-E]cO7JylI"N5ɉŤ^+bffJʛ@Մ"\TJB\4Q ?\$CzuV.p"Ih>PM҅@7⛏&l@pЬq Y9$@ʎ#r``{ ⢹xE6g54:FEF(-R,n-`Ar*q<ԧ8ʊ|΢FPSU4m#\V ^+@ H5IC(U"BN֫Ȟ`5gcwf43 1㓵t&{1"#,F$kl 8JzddQ^頬4䞻DVUk=`VN7@ ˲"hXLUV2H-۩C;\lEK~ 5;h2cN{[^ c#h(h4$!."zSF?y>7X nQe@ \x`ۃ"K؝ %K6QXlcΔȠ~oVѾ=OT; (N-"ry[ v ((*g/->"NFLRإbCYy%f拱@ \h]_,’:IUB,g]?!8Џܦ1nY"BKH%6^-iYԅ7'&'"3>Y=S3 StU`+*ƙeTT:PU- ' 3o%X4P Yvg+CD ˭&ܺ' d螌%9|cD`ߎ&5H Xi?VZ&c_)\nUJ ؘGd~L8ߥCB! v7qhW2X^t$كjL0GO ,3.x2~.߮╩tmL݋b[1@X‰gf'BXv^(bPvVbowI6}q** ߶ys8 G{Lp8|hF yʀIaņ4.*Գ=/q( 2%T;W[~zX7&al =+G6Vk@٨Bb*.,f#yuF;yM q [E%߉9 S.)J:Y`Wɩ(?=dd瑼v'M{5Rr a*q\cTdF3vq:¤lv2N]Q }AV >\T6`չKi6.Ipqxo8uIA4o\\+5啓,)+bBkO$I\p{T^y&Ij6qr%]<g`A@&@mXn7w}ޯ(D(c1GU)߽-Vou-Ğ9 <U2'ZdÀOѲ`c yIY0K%66Siw!I:]+ N+1UU  K B﮷(J'=E"-UODzu+7hz[#]^'!.͋K@H\>-xT 7t+PWb0g5p g~SS9Iwﶱ`6i^L#`PdU"c6)XLJo劶ݍD1o/9q0 o(pT=۟R V"27`_zCuߌ.3ߙsl;8|m?e~ ؐNjZކrKU$AIi=ǼMʎ HtFl=LUU1wHz6̤YbUhuWvg/ vļ%x?4 h@vŢR1# g4ߍ[0X3zf# f/p?}d@OoWwYa;3w(c''X.1qtOF,I)λױ'=Mk(>}'G`Vg_z>ѢI>b6mJǪg!Aʞ0*nbĄx&^(Ōlޝ?OQ)*>>foһL$9+żx*~]oݭک)fU:$ݤ`޴eȲveڸ$]UUWln|kIkϋ`N~u[ Wmcٺ4rr (yp@*휻ջyZp3G;F< WmYIYҗ> ӢުcOs{d`a_*ΰp._X8\nNfSrJD Ci׼-b  ^(-ĂT|d{Oyo: a1khr c-1beUJ˭Rprd"#;CYgվpV M iejT @+V~V3&lPdǃGp|oT:(q{)} j> ((Bv}_9-auҭ(IENDB`gmchess-0.29.6.3/data/themes/west/black_cannon.png000066400000000000000000000132761323660377300217230ustar00rootroot00000000000000PNG  IHDR99sRGBbKGD pHYs  tIME 7QOI>IDATh͛wtUsk:ФKG!JRlE􉊈((Ew)J`- %tsǽABq3Isךky4Q@-<y@18~5(TZ}F"}-0z=E˭*;E l8]n l+@? 2x ZƲԎ zTFD(G'BEۭ"DJpݔxÉHJIH%lvgFo9 ZLLm +!=#W$$]$>>&HKRJ*ײP5<}5gh6\4k596`'p 0ْ#g_,߉j W؈vM0DcfWlfxrQu`Ҙ)8`yӀWBwצyw*=uk3nDObo0"U )%BcJ/:Phv'k~)_lę+\*/НbӖ\X@} zgvjE6#ynl቎uG`wl2j/Dѳԫ^j51jBS»^;<7X<ߧL.m< yspT&a!4_έz)/tjDEEпK3ls+&, {Zds4R]7H=/MZ(>fhX;%H14/3&jҶi$'γx^3rV5q !%$J x>m_dѳĺmB]wPts=+\HjF6A> JŲcϊoƾ-!LFv}㧯pe,,ƿɊ7Z-Ʋ="#TUc7面3(xEk|S,/\bb2Pds`wx&j1RjkUqݪDV@ T4phv޻#E2nx{޾lr69pJҷ~Ԋ ,$[%&HF~ܑkS%)%vjbl4PbwPls[ȩs$Mc^QS:thQ2p!];N.boFP7-iP SSǨ/]ɠofF4Pq'lvGGN򷽎t.g`1oC ehը&{Sn4UjRЈu⹖'qHJGZ jf.k~{Q @wAa4uҮ|n٠ N'+z,&#A~TL5ֿCl'>ͷ3gVӲVo=Bxr)5KUX>Щ]4P#"_}(>0XgNKի-}KBp;vaoI"?Mh #'/rP(Dz\.ЧZ#ϿN.oH7v>2;],)%RТzD~f Pnjb"Z`6)`Pش]~=I0yVn|?#*hdd_l'}7g1D֬TUZ5Uz% +6. Mr!5!QJΨpy͙|wvoӓ*72}f$^`Q4jX^G-ӳ%gN_aDvL]GXz"+ӧK3F @p/ p%gcPX5Ѡ ٨Y.rlāՄp8<\S 2ӿqɤ]b 7/FS?2C^ǨɋXy!M~5UFplřW?boB _L @ypk#U}z=&#ӾD+5'-ՠ|a?]gŬY5{ ZD݆t:k3=ed O*݉Fu٘ti]N^kpEdPp5,&Vimz_;}-fSP 1;SӗҌ^7a3q(yR^{ٶsoM $nX\nAAQ: K6aR9q{SHg>"+縞Opfn<՚]iRxntnUe?$';5&lg/]EAx[_s) 'و(0(z.7n EnU Rb2)(*y BAF.#BO<Ϣ5{[r\NFD(F?+ZFDEO8'"98/_DVnYdS<.fR/'(^պɀ&%n(P ]IJL~=ySsjpܷપ|6/U"=ߍ=Z0eml'>V'1N'בWQ˗pj - |CԭJVuW2e|rҮgE$OPE6GCMh|CٳٝLb' 􀔚jfY4V\m`w)f3U`O UBnȗ:'.sl2_2o|?"0  F(M~7 7lTFEVUKb;62v?c'/sT,b RTPFХM=>r/mGrJ{+7f>IdTp9^%)r^΃I т;>Sޔ<.2  )CAd8sMV땻DM;\dҤC8}n&_Nq$MB@0>՚CɴϾ9Ke|&juy[!;еu}=1@_izuOض?qU lq s}gaII㧯0h\F6.K!ObƄ!D9h޲.#̅[yrg|;EiW+wq$"BhtbH|+ܙ#Kl4mq@?+ԮKwt*8)* UCm|iw:*W,r5Cل`P a^ԉ.]Bf;!$^{=bBTN7bٝ83& )^6'ZBʤTl܊ׄHNWfӷ[3d9ѻk3>}{ЭW=RB ?,>fdB/DU>06M#Yno}@?+d^3<թ1 4yQ4Yv/y%֜Y=y `,[m#ˍx 'a45Cpy\K\NBUae Kµ0h N=xSڗj|uD%ej61yto'^s L.+19~ C| ?)%U~q-3?~[,<4O^?I+R84x)=ѬBf3T&$][gOI;6j1-`K rl۟HVuY0e|%bÎ>ܫ1bKuUUs&is 8DݚA_Z`HHas8x,l7Ss,{vhƁbCe8VlEYw~#zf#XQr53c1~D4|DlΞ<;@聮@, D? (Jlt]}&@`40PD ?#f4ӅpRRfFQ)@P 2zF*5ud8&MSq:]H)N'e8t)9y՞l6;z6 c߇a}cd:dd'ΓtKYd])؂fwbk:LBI˖K`X Xo3-K)-8MazADnDDXf~~JKmYωtr  0Ѽq}F;Tz>1Z Iw#zH) M ?ܙn_hF Q,(xXmNv?z["yh”1XRoX1^6[Aja!̛>N& *XYCSiߺ13 ]8]H)%B\ UMmxm&'px<@_~_>.4;@~QrDq)/,4wlS?:6Gjln>/G[0 <2{iGWaݺ ~])b}rҳ Ŝyob:s<Rz^C4z\}u˫ʿtMtt$w%8]DBhվe7CIWyKŪMХ}sޟ5n[}]Nv8ɅK9(^Na6=p]*)<:gI? _(~Qw_x)w n=`e£m{3{4N#$kϚn5ʄc뮺E£v'07fa!/,!wy{'^Y!>[3|֚]bWY*6nK$_ ?,QbUJfl%  Å-7H^U{o2ꙔЗcgٺe.fgjCHtDXg#rƛkD(vz龱,?1tvGEk*Gfɺ] z ɝ;GUA1) ˮ7},sz""n[:A}cg8ΩK\9Yrqmpޑ=UL?fN-Mnwx[P,r{W7UF`9j4jB `Iwc ]d0n˼ś9ƌGЭc>ESDb4x(Z5 cᬉ+?/qn׻U{`@Ǵo鋼w,xa!~f/99gZX.p%܂h֨>Cv`~Cr_m̘21-d{#Y}jgփxa9꡷Ō\|TEU!LN(7:Mrq#q5,n8:EGrЦyʇܒة4kƏc[ ~=0R&EnDB!(F=nw#Ede0t<ҳ| hF hQr6-}R+,D5AhO7P۝vhALT$AZ|%''sqnJ5966nK$JnGR: its[>x# KLc`Nh}nE]J;k{63&;O?GcO}7sSG0zh,f7:=+ |3>y ?&?4r_UxN#ub9y횳뽪&ZG۱AC:_YtFGbk4M- 76K9*~MUXm̚3e PUMU ,2 '$ҧl RiF3b6HʣAhFVLh*>vhױ'ƌ!n nI6M ghpK{Up8ƴ]F|ns$dV/?{*hjݶe#.T< oQ0 K,4 nt5N֞IuˮUQjT>KETᏈ B`k_SUlvUd$nl^a A* "j<.!H;R+\K}f6O*@kAp1m|ffc+E7?䟼S1zfӅ^y9X NO]B)Xl*K]nBDZf3A(*rZQ¢RnzBː@ՁNS;@J<^`STRV倅p/ԋ9z(ƍܲZiݓ2Ofvu+k nY1J0t Hv'Rzg"xߺiJjܠ[^&oVҹ2~,-ݴk\*t93nfwd+ Ix NkY-]s6K'*g*kPr> YW<`ðH$9NxhN2+i8QRjb^+Xm*l(DS0b682YYA_o, |3s<}rU:!V""PjQY'IXH>Eع6Q'sאXL r@Y8vKBUK]; l&% ᔇ1:MVs֯ȿ ;U!ԛӲʴ<~s@ Щo-MeCض)I;\.7ۓRi"7m¬Jty/5VOxlvG۪JYk/ބV{"1;/6 @hVXMS?']XmloG,?4`49u@RYy_jJ)j">\ <%:k^+ONCԫgԳpރ;k7%)9cSUt[RgM0 :UtiɏKggR X)6E N Hxh ~&Qf:2 !CRJǤ9{* {ē,6V ?ɗKrRUL]-oi֠ܢGCIיOY%_n מ-/PA{G"sW9[r cZUfOg =3ҶECLF=VL۝UNgf % Q :6'D5q# -eRFUoo>$[5 }-V[ t4Ma0+Vo@M)+^`7`]dH|td{yUtj;Wdj2]St!ƭ=ݿ3}jOzr*[v!7=U ?Փu+`kzW&OOOP\jŠXqwmWO5c{&e@k#٧Kwn"9^qb#KfY6Rd\ Iw?;R~}ܟ }eO݃{% :BnI H?4ɨT'Hyn)+eod( ˂ß')8f?4`0(Ȝebƽtn׌gM{V>%TfX_[JJJ̒؝;̣/-Ջ&ʹ ? :K5-_u_B~n<|_ѨиA :M ;0(Uۙx3'pB?xu6XLQRmvPXӥ _$ˬ6%;}-yz0F:#KXq/lT:D5e49m271`0 +Y!#7ELT\0k0,z%񇃄h"դ^ }> We“eSٹd%7cfsc׳7}{wޟ9(Gtz$G:1g;Wn%`/Il~ov MS:vK% no%Yq4>ͳspvR/f o"Hq .{]s|M¸kh,NU{Ŝ(*yG?n~հ~ A6nPBqʥyd]) ݁h(\6DDXO]m$aueZf.:*M敂2<˼]7vYИ&DjmёҼf)C(z^y;\Ym9s$sVodn|1 :U 7o6g6bkhNp88]nlveV-8mJ\~7cKekbHIENDB`gmchess-0.29.6.3/data/themes/west/black_king_die.png000066400000000000000000000130561323660377300222140ustar00rootroot00000000000000PNG  IHDR99sRGBbKGD pHYs  tIME 88ّIDATh͛w|TǿsٚB UB@"EAP|U^D+ ,(UQ@CBK -! !my͒@"zN>lΞ<;@聮@, D? (Jlt]}&@`40PD ?#f4ӅpRRfFQ)@P 2zF*5ud8&MSq:]H)N'e8t)9y՞l6;z6 c߇a}cd:dd'ΓtKYd])؂fwbk:LBI˖K`X Xo3-K)-8MazADnDDXf~~JKmYωtr  0Ѽq}F;Tz>1Z Iw#zH) M ?ܙn_hF Q,(xXmNv?z["yh”1XRoX1^6[Aja!̛>N& *XYCSiߺ13 ]8]H)%B\ UMmxm&'px<@_~_>.4;@~QrDq)/,4wlS?:6Gjln>/G[0 <2{iGWaݺ ~])b}rҳ Ŝyob:s<Rz^C4z\}u˫ʿtMtt$w%8]DBhվe7CIWyKŪMХ}sޟ5n[}]Nv8ɅK9(^Na6=p]*)<:gI? _(~Qw_x)w n=`e£m{3{4N#$kϚn5ʄc뮺E£v'07fa!/,!wy{'^Y!>[3|֚]bWY*6nK$_ ?,QbUJfl%  Å-7H^U{o2ꙔЗcgٺe.fgjCHtDXg#rƛkD(vz龱,?1tvGEk*Gfɺ] z ɝ;GUA1) ˮ7},sz""n[:A}cg8ΩK\9Yrqmpޑ=UL?fN-Mnwx[P,r{W7UF`9j4jB `Iwc ]d0n˼ś9ƌGЭc>ESDb4x(Z5 cᬉ+?/qn׻U{`@Ǵo鋼w,xa!~f/99gZX.p%܂h֨>Cv`~Cr_m̘21-d{#Y}jgփxa9꡷Ō\|TEU!LN(7:Mrq#q5,n8:EGrЦyʇܒة4kƏc[ ~=0R&EnDB!(F=nw#Ede0t<ҳ| hF hQr6-}R+,D5AhO7P۝vhALT$AZ|%''sqnJ5966nK$JnGR: its[>x# KLc`Nh}nE]J;k{63&;O?GcO}7sSG0zh,f7:=+ |3>y ?&?4r_UxN#ub9y횳뽪&ZG۱AC:_YtFGbk4M- 76K9*~MUXm̚3e PUMU ,2 '$ҧl RiF3b6HʣAhFVLh*>vhױ'ƌ!n nI6M ghpK{Up8ƴ]F|ns$dV/?{*hjݶe#.T< oQ0 K,4 nt5N֞IuˮUQjT>KETᏈ B`k_SUlvUd$nl^a A* "j<.!H;R+\K}f6O*@kAp1m|ffc+E7?䟼S1zfӅ^y9X NO]B)Xl*K]nBDZf3A(*rZQ¢RnzBː@ՁNS;@J<^`STRV倅p/ԋ9z(ƍܲZiݓ2Ofvu+k nY1J0t Hv'Rzg"xߺiJjܠ[^&oVҹ2~,-ݴk\*t93nfwd+ Ix NkY-]s6K'*g*kPr> YW<`ðH$9NxhN2+i8QRjb^+Xm*l(DS0b682YYA_o, |3s<}rU:!V""PjQY'IXH>Eع6Q'sאXL r@Y8vKBUK]; l&% ᔇ1:MVs֯ȿ ;U!ԛӲʴ<~s@ Щo-MeCض)I;\.7ۓRi"7m¬Jty/5VOxlvG۪JYk/ބV{"1;/6 @hVXMS?']XmloG,?4`49u@RYy_jJ)j">\ <%:k^+ONCԫgԳpރ;k7%)9cSUt[RgM0 :UtiɏKggR X)6E N Hxh ~&Qf:2 !CRJǤ9{* {ē,6V ?ɗKrRUL]-oi֠ܢGCIיOY%_n מ-/PA{G"sW9[r cZUfOg =3ҶECLF=VL۝UNgf % Q :6'D5q# -eRFUoo>$[5 }-V[ t4Ma0+Vo@M)+^`7`]dH|td{yUtj;Wdj2]St!ƭ=ݿ3}jOzr*[v!7=U ?Փu+`kzW&OOOP\jŠXqwmWO5c{&e@k#٧Kwn"9^qb#KfY6Rd\ Iw?;R~}ܟ }eO݃{% :BnI H?4ɨT'Hyn)+eod( ˂ß')8f?4`0(Ȝebƽtn׌gM{V>%TfX_[JJJ̒؝;̣/-Ջ&ʹ ? :K5-_u_B~n<|_ѨиA :M ;0(Uۙx3'pB?xu6XLQRmvPXӥ _$ˬ6%;}-yz0F:#KXq/lT:D5e49m271`0 +Y!#7ELT\0k0,z%񇃄h"դ^ }> We“eSٹd%7cfsc׳7}{wޟ9(Gtz$G:1g;Wn%`/Il~ov MS:vK% no%Yq4>ͳspvR/f o"Hq .{]s|M¸kh,NU{Ŝ(*yG?n~հ~ A6nPBqʥyd]) ݁h(\6DDXO]m$aueZf.:*M敂2<˼]7vYИ&DjmёҼf)C(z^y;\Ym9s$sVodn|1 :U 7o6g6bkhNp88]nlveV-8mJ\~7cKekbHIENDB`gmchess-0.29.6.3/data/themes/west/black_knight.png000066400000000000000000000127261323660377300217320ustar00rootroot00000000000000PNG  IHDR99sRGBbKGD pHYs  tIME 9! VIDATh͛w|TUǿΝI#!B A@ªJPpU)ʮuYP""D"eBh -$J$v@h{>O2;g~yS~wwv(0@DA@P! Hvݩ/%.@ɨ{͌٨b00븽.Jܔ:x5 5pA ej"&ѴkGX&EMӑR"%x4r'ٝu\<V < tWux}Wg EfI2s&E;=^ Il2lv0ksO8&RVͻȪMe8SP6[ "ַF'1Og4 99[@ @횡$4GtT86+AAf8ʝ/$;' [d`N F ML8KeNg%d` `ү+'gtG ?Ԟ~=ѽCXFHvdbn~HRq0rP&IRJ1E|r p; Rc™'^??ӗa2h4_Gf#h:R!Dk/SaP@5sy~. =׫+s}i߈Ӂ~'@ IÅ7qi:݄WMR.~븽pO w5wf33jx}u#y@ҳwg[c1a(mZ7t`%P SbuRAG:bcu~}|SR1{j4 D[i>|_|iբmX}gɨj7b0(@}?xF1 el6ҵ]3МY|P>-39POR*͸ `Go<-Q⓷QqlB+v=c1Mep$+It#'#ffƄjg0حhn/,&+'SO |N7E2VmCfqJv+쏺W\4"^_^#֊>b6<{ S'v~"#BhSnת.çy{67QH|Y_Gu LHT (̠c DIzbQIC2WCF:=躏K4I0rJ\m(JNrDvxݔR^HxhKWS'6 P1F%@:LhZC{醬(lf^4'8?uJl,f#3'˩/P3Mlc9;+T!PRZl'%-QG'?{’2("nU?ZIlm5C|hZ4K\\]4?u(*jW8s`> TP֣iԮ;\XTJ&WP7;|>a0}]YMԍ Np&ҩM#mߜFu9uwf`T tlݨK(Գsri딕@vi Mt|[n3_s/wz(vSfXeqFzю؜qQOP2ٜqj&j܅[c!țB\n/KAӍ2KKJ==ذ#6qx)wZp*'8q5S~{3ODwҒ''gs _6PJ &,-uWׁ] eRV |.5Wq{4,&c̏B=))ul^Gj:A:HG9;rK!%u7DQfH4% BX)N]d`\*.cٚkc@AFuڶ);`rȲ59ػC%tyqؽ S>]j~M $wlDף-97|sُO [PȊrXerF*_xY9$4U,f#E[.uЦEUU$|f#KSu4` 7 d@ʙB璕Ip:P 0&bԉ DJեu|Vkɥ>b^M1Ir"|Q9Cػ (WwhڋI!Ңq=vJJlL?H#QVGwѻ{dܼTTCLljg^LT!ՁlnYkI_.{x6,~UL-@}Y Ȁ~(<;lL??I-egryE!l1(s ɕ| 2^f֫ng*R*?@A禑537z~;uB xs>!֤'-=aIAQq_X\F禒5b?Fȱ-+g͹Yz񞃧Z.fM&Ϝ+g~[6 hEB-3'b_xݘ?e|g⓯|-`ԵҀ2sX,}(av[;j^K t[[L8Jʘ` &/ |1S"zQdE3'9& .1aJ֍lo$v a^|R@4e [h߀F*Gؒq`10t;,'Oy &>VΜ8TX-& R$ؖ][@CvMԭYXwSTR*DO&NZ;T%u3#& &N.”,]α_ (vopdD MzW 2R'gGx }^E.L"ޚ=%@8 ȽrVSILagOZ˘:_({bc9w;q{srFZDGՠcFiKTDc䪔bʼu؁߀N}U^H)gwT+zŷsXf=|P!Rp3l~%^aĀLy5QJ)i+X~2`w?RzC`lDX&>+vo#>X;sb4h\?I#{ح dT5qi/t uheNpm\*絗zzA߈9s (@V.bIVlgK8u5a=H d`^'~IHVQS=G  su7X$י/gߤI/NW!4kZέznT(9@+[bɷG9y8{1P}KHקyɿMY*>rh0Bm1h.C#&-DhgC[ @ !H.6L7@3O$o;Jv,OZ\W=!LϥWR}B jކ'/aG*gdNn8?/ ٝbSmGٹ?,h_=!.[3iWp? (XF>Sغ7ro> \q=p" "B>%V}@~9.ԤOV^C^[ 7pMd*`=MvX -r>Б݇βa1B3ܸ=UJzˁ.y7`geQ)։6MӱHM ۭl~ʮv*:zVn܇jޫRJvb˜b愁0ϓCQ't0LK>Ŋ_^T5J)4qmDxx%!Тgs 7mTL|0c;C+ٜ \N͓!'o=Ϭ)>I{Ѷy=s29j\*HY5,6M,\n+]z>iNGobC zt7]S$"%9ki۬.#u$y)}J;dϸʜ"h}gkZ7gA;t3 Fx%䔹ѠcK=GӴ yF˜b [w$ߞ!jmNr)%}75M# $ z`^5m~&}hN8]n4IbH3g}1u"3֋x)%Cٹ#4iTtБFkh\.U$y;YRY-=;7KAU5&Ue*DM|v7O%ĭj̚8}'3o1w4L}9ƌ(+s?}߃;RWd҈gPUͤlrNf@("Bv!BIֺ^B mG4ɚyymToBJwrZJ!Lz55S7o/! BpHGHk"Z(bjb t_[zS cUT²Y#Ъ݁jw5o!˜tjY# c҇ߐ[5)Y$tmɥk9d*"A6<ӵx; UX.^iRx 5Iu9a\bG|*poAgҪQmhqGs%lT+9],X#Oul3]Z^-.9_ntU~UkF>uzQa(@#?3V4ujBWA{8OuLJn7MeQQT\d@)@FJMfO&:JA~l{"Ey<( Els!<*'3o`EdygvNA5çd.j62l}ȓHy{N16;Jb̅ «VUJJ)2vȾUH]a#t nGtj>kT/._Y]AOCS|"'J< PQWiݸ6?<9aԮ/'y3γd<I3ȼ/'PVo+Am_m,lvC prԴ4"(@m_Io׈q t- 7 h3}a29!בV7Ѵ8] Q'=Bիڑa|(ZŒ)9ucY:>ү{Zgס ;/!t `v'ێQVᕃ !9~*׳r#n=0p)%C$ˁ ̘0Ӽch ѡu4gH@Qs{86`2v! lіk7<=p*xTe[vC{wBS;49wF%'>~} 'Q)؟I#aG/ur({wEs|8^a_:iIQpQrغl 9+i2XTr9+b7Ad9+8w'M}[y6 5RJI;At:tn^\u6 93'߾bʘDr|&l'w7>snsⅤnh&A~tBҟ1 ood{W/6rL}5QذOd*(⺃\ E`jfVw_NͪHǹWDs-\'/2c|nUL6)~ˆZUC[x{N2q*:o{42cO[%E<r $/G綱i:GkFǰY"+.8 |u{39wG ȞIyiLl R:o" zl0J0KKd$ tZ5&O/}O,+~4bH^8 tG4Ip="KGkf>u1X:a4|r!>eѪ\e|1s8?L/X x",/oeot;}0BQ׋v{T -yK ;4 :{$]lۗذE #3eLTUU5[5HuDt ZI乄R佬|r(yડ]-a+yӣwnԩFq N˓S篧^G>,:Vl}tJBq"*O^$fٷ )p(s1ʕV«Vuh0@y=+MN-"}@*l,&"iEհZLcwtͻ_.2\"52i28~o?MgfQ.#xA o5g5c2 z=.pz&(-fay!M/}W`ZyA<|; 91N|px>{IENDB`gmchess-0.29.6.3/data/themes/west/black_rook.png000066400000000000000000000114461323660377300214160ustar00rootroot00000000000000PNG  IHDR99sRGBbKGD pHYs  tIME :fIDATh՛ytTU[c2e&"B%PQhnYx@; @HA H2  S5[q+|{~bon;ˁ% oGvB4 Eޟپ0Nr9J<|~UfvIbBD$jFɼgXb悯9_6] owDc7\˳)/ 5"HnX(Naa6|{8vy,( :qdhcoǢrb{ 9[T=A~:0qTry_bA#}m֊.m5D2\Pbx}:e,ZEeh>]LRg_͜/6x>!7 5`ؽx{R>qVJud/iY@7F)%B\z UM%mv.|ktf9p4}&IТy=n)*>'u I7p'+6bg_̈́E|H3a(WHOsɿBl &#-VF0_ˁ,thՈm}afemx~!2@FPlm ~5  z3?G>4=f;wKfhpCB讓 o|:5cx{~r2z?S$vud:N&rCc3E֚vȋحWT=@8V>ؙr.srxA{`'pJOCb|m̑|~9S% ?y1}ťœ66<^?_-rqحy|kˁj;}3凹[d'Ɖ=Z@9L+:4ˊ/V ZW$"Z7 x|L%m"ТMN,ύdPU;S@%gϕro1?16Q#MlsPb(BD9O|+ XO=ҍ;QTUBn vBoj;9fBa88W`0X5aMH J6q9mx*th 2 ~]rܦ1h*ҰK\{76 rX4ѓ~ieHg(s_u?}IuI \=(PB ˽Lg7[:x|o?{d|UN!1m1oO;ƴ݁:>-dvNFj[ea9y7 SEDuΕV}^:4SE=".C{)Z;Zw3WzZIQ|"HFb@ OITxy3`VX\F@7z "f2E6@&7 -Ttܰ6'NCGɸ7n%_?:q|'}EO3"] %Mb tG^rcDuXIڊ59yHnȷ;s hmhLNb羟(.гkKeuNԶEA+4tm3[w⑞p),m786NflvVitcMԫW~uF7d)%?.Px}!T \"5MfA6폌B@7Z443&D*9]7MӑP(h*n/8a&l6+ťQcYJn Hi ЖYq7^ivZ4 Wx,ٻ !)&1>2 ..p瓴nv}5]UI*XQ0(Q*X'K6s^Ue#䛜4kX,A9"} Ua7{hӼĬ"fk6@9{~Odt!`r_MqR^31&`,Rd]_e' Ge7[SYnn'6~?`6 kU+6JT'^,ZUYTlc/O af^UXTSS"ԭC7K% B`xdAI) ` k";3dH&cʭd9}Zq0(AaΌe?g_Une+)'G[~9^wb?bQ~[,! PJb$6 ||f-CQCh7j=})LFx}|LE(dVk=]>pW1}ޗ,\eMŪlFlV35;vuh6ƃ&Q#/%VȀQyVgmb<|U ʊvAE/z~Y. .EQ*ߛʦ؛GLJfi]fconvU PQ(>[;-'}&]^8q\9(RK` NCz3YKWn(|=gIq>\P|Z:n:u:~7_@ 1vB0"Mp]X\Wg;2elޚѮE+2 */Oc.;fnO+9 oO_J&7T8O9Y"TW ud^iڬ9|Gj,Y3WRTZg^&+u~8tbߡ<SVUZqQ`yy\.OH2/`{(;̎b:ޅ #keAĉs@oy{<0kLhsbOQf-}Ň/!7p*{?{wbp2A?şT9yxA%Lz1'r.6d'[+.p~Ec8|;6cƛC䳯K倩3ߚr5u@43 CL@8Vf-H֚dJTQVs@sNX-ϖ~ˀgu=q7_ࣷ~~Mr˯"^bQ"1s1uZtTIukE;[ҭmI^R%`7{Xv\q93<]!;+SqB$!6hRףE$cgXw"sBd{#/LUd2k*4nmѤ. *9F7a6r=:Aǁ'{rnBJ`q:+z wȍۆXG7EU]N\NaN;6*X4A|з ʽx5sofbj,m!~/ą)*J-P9=s{-IENDB`gmchess-0.29.6.3/data/themes/west/null.png000066400000000000000000000002451323660377300202550ustar00rootroot00000000000000PNG  IHDR99&KbKGD) pHYsHHFk> vpAg998#f4IDATX1 gm譴JRT*JRT*JRT*?OUqzIENDB`gmchess-0.29.6.3/data/themes/west/red_advisor.png000066400000000000000000000124621323660377300216100ustar00rootroot00000000000000PNG  IHDR99sRGBbKGD pHYs  tIME *0GIDATh͛w|UUǿsMnz#BMPRTЧ{A:*}t28 ASQt,*RJ(!@z&IyoIZ{^kmm `lh`0ɀt^(V?R( .N,$]\Ni*Bqx\'CB\K hOi&aaP)%Y"f!KSqvUAAX Kh j1vշu+Ŗm{ذV_ h9I19n,N%YD*mEhs;F0! bحX3<زRqy\?ڋe?ĒebQUo_3K6[ǒ?;Z?pM@Ga6~PҒQ]vB;k ؋v+R 'e2<+M`B7T{ rP|%~M ?DqKZ2N3a!4ŜCt,\M? E@ɽ,Gϗ0X:H!@J&ڬZ]7L":o)Uu ȽR&Td\C"D;E Tofg|o6H. ym9DkvEGU 75yyٴ}׀BN&~a_Ȣf /wE9 zz?:ӦAٶj=?ܘj7xq~+Ohw$ܛϣph! Kzr(,Q7w1JKeYneמ3|x0/9{dbC8/AeQv 9(kx)_QNGKHq+MbwM,?RÁUE|?QYZTN5̀<HaVtR'wim WMR~ lMCa?Ւ>{X FD3JgGcBJmIi*f|u.Z?joMGQ7G /.ݗ0([lI7}r.9UzG۞9tpg)UU{qͥ(x/tR [ |2A?sLI9x]+l{)(N>$$4ovliIDQݎQۮU.8l8}*Z[ϸȽ>ns1|˼E{ߐ}ro/dLz *}n߬!}/zaѰd lVP 3Q|2?KrbM?Tal oP^5XSּtT揗ku K/T}0;|rfN:u\sud`c!(m9lh,Y5Xsu/+Ahb9m~OӠOh^[v."XS;7詛p`WL}jZ-SŴ&г7 96ql;30dբ (H]c!V_(Pֶnj 4  |;{QvlYĚad44 ~/f+bЗϠش+PiM%ZHߐzlOO]۴8Pxt©C\w_4FzMOL~ҊN:;ǯ'N;Rd'z LW|` 5?ķ@ױ}ItΥS7n c/\dl"e`LAC}3Gʸ.W7O0QV=I#TʆOEqSn$V F4 [Kn)aUt*Ky8J3 hφ7wY%oL!v¼tIǗRW$_aOh*מEW#,ɋq"}}ef$:{d8"Q.DE(|Fd8ҥ?5$ұ4/XMIV s0ȾЫMߪm$2-sxDɼ|)}DcqЍ> A+ȺjAE]!Fm&%Ow0|ijEu\ (Ⰴ- Dڹ']#sүS4+81I {NM_q K(,Ȣ5h)K I'83 09OKǟߊ-'`+1c`%ed';?S-R;B-`듋 uRb+sl_v=5ϼPBSQ\C T4˙wC9N:*x:? 2ōE01FӇM `ZRTH]b/}@uڰԴ$$'21}_fufT7 Kvn씶%/w0!@Vbo%wA duijshV:D!FbI#2amg}M~BiCRwwKV*ZMy$i Z:l ă257$Òn:h 3kSoǿzI' F(V B[ֵu`WLv[$4߲8z IǖwQQ34nn_[}y\#PV4.Tto$&ZvDgê" hi(N[_9W>qB*4r*>cI [Qd8PpOck`{5$& QlF5VDZfz(|:zcDÊ1#=٘ _h$%#iu[t@X=' Gk 84-X,`hx3y>~=N0&,e-5 Ţ@ Qd\GMv:ױ%}{4kX)>F@vBH GiiMC{ۅx1|A`b`Y%Ish~=W;(tIÝԁ]{j _@UzēɣE2Ff(-@&G:^ wBpc%68lI!Vt9m;kZiDzgF蕁P:buSR9euI$ c_#ae? MY3qm9O Kزm@cg~SIU"1F "fJ΀Dcu f; [%B5= "at[~B.bjc%@ ֶu]݀ě omR!q *^G벍t,h5*v:oB9hVxFf '_~ '`nD;5e;H?.y1~Ee-mYJIp}+F052:Xuy0{2,9i$M[:0N3nIS([[\' bR& 9J)AJđm@o|^`a`ɞ5Ƚj"u;m{ؽ(T_ $ڳ̗3nafREgoFFbEhxG9H?sM߲[%K%M'YMӻ Lpب{iȸ`4Y7L:0 ރLVT# n`NۡYhxNOwʸyryP `?leu-2h`Y%BUo(Dh-CӐ'`9S'4?M}Ch.rJxg- NVkNy0y#r(T F8PBgˉַRֳ4 pbroZ4r۟~/k9\Vk+%e,kL$E$jp:m>K˰椑2s9.4i$v,Ρ}Ȯz3ӹBt FP+_g! gs! "qG/!=։ qK%c j裵-73nvV 'Ck_UNziz(WP8Q'յ-Aџg,5ow5 i2>J`nU727Ȑo׈7.&Qд'I,!9i0tJ{kvѺjX}[*;Ⱁ}ӹG@Flq+(yfǀ`83e0WUDqO^[{^BMuGFX-pN75Ӊ5Sq͟n&sן#O\ |r$)9듯WϽq,P(ڿYK˜Ec땑8 e,Jޱ&w1~IVMל%4Xl݅h gtح(Mo}Ió0!>t5 O=S,^Q.(VZlii3:[ӧNM4}2Tо&BՂYz ;saǐbu[NrN=Qlw6K)x}!ɩYEh_/W%Gi¢]Jk$;._7k^յ-C_n5r`1x[藕*g|,ߚL"?$m*jDj=^*nyM_L~ 3˭-eqݔdiG{]8JQSQUA;fkE VY?ȏ>A {GPKqiI/cҜ42[Edc%Dڈ4w`]TnA۰d$'* q+ KYdxs"vV7F% ~_HaDFB<Ú5lPo/dbٯ0[,dk*ytФDTַ+f zK?|_<%va&8 6ӎex=n$nCCQ!nCnԩƒ)x/$%/qཐU %G^X̍߫IENDB`gmchess-0.29.6.3/data/themes/west/red_bishop.png000066400000000000000000000134331323660377300214240ustar00rootroot00000000000000PNG  IHDR99sRGBbKGD pHYs  tIME :787IDATh͛y?o-=3=0þz EE *{䪘\MI^EkbQ% 6vOOUaQM~zzyz}uN=|K `0 Yh"@P lVkTM:^0 \5qev5TUETL²,)H4N$5#2%xXBAW܆` =[QLA RPg%صM[۫œM 7ʊ\7L< *Q%Q ؂a'SIš8tT ggq.Sz 0W:/6W   qͼk"W!})"x5P 0 r0墸]YNH;#U ^UK)h^Fy.=ϡES+?K_LWWn'yͥHFw9A(vdWG&\Ek1P8B(R{k.} Lɸ Rft-N^7n8>[NW3vSGX6RJ82WbǓ?> vʢldoϫ}%8x X?Ȃ{N9w9{MbP8_"SPt^1$D;}`|>"q7~ |9r;Dƫh߱n>0gn+G({"eL#kH48JoR\ ȉ 6Xg(OR9mFi+;뫨94> +t-^{"U y`wz'~gsU<0ƱE( xh=P<8gwQ<5=H \@5SGZ6f(H"B׎|@mz>s7AN'c3~"x,9 +Gq~TĨ(PJPDLY(Y.ˁPUCTЪm4[N/U֠8J sSVm XyhرmU~`7\\ϘmBڧޡ(u<ز*VkG^!@ GQ.YCzc[!e/`$]<iR8|JgLAvo!j{'äx F>Ͱ 'syKϒ)2He5לKşN76/"1n|Ȧ 9{bsݣ L/+;7Քvj:g1pp7h+r/ORzDJ>ܱ0z,)3 gBÁQ:n]7ؖ?[sZ?N=׍6.Z7^,|#'2$!xnz4)\o9WD~T"w8s=x;5E^F?݉g@xyi;1 InU\ JȽl\}h|} %n\q@y[tUnNw!-ۯHsѣlLhz$[[Ҋei^,'zBd gb~s=v"š'F8N'~9Ҳ1.Q(m=)CTз(h>9cf+* m/XSiu>h=Sؒܫ37o$JXQ"op, Wӧ$!iJ42 "~Egn#%| +g[J"1_Xev9K7 1k MEswk(hltL1dP}9^Q;R~KX;Qj;{׍kK,Z>gޥE&@9cN EW3tpOgjl>ń_ x ]Pr/LuU m3AfIɻ|:60w=[ p}chxGBx=́0 ePrc8F(dCsP4͓/$$jQ]yDh* YӀ{pO6{Q琨meu%Z4C:SYMO6hOрYn'EF)ѻ 6{}bG'~iYTmeJ禃"#q\9͚J-8|4}zt``B$wɦ EmS.]# Ћr;iy2ޥ]>O|/+&Q2æL+j"tSFd>(BS -ߌ^qݫTQGz. QU؉$} ٓR";(ni{B }l؍ЏDLkJGMTTc`wU8:b,:/ Pv(z\C7vChj{GQ:q)1UI,,mT}/ R{ Yd~H.K?B`B[WWeyΘB>;r٣NA{ ɀ ;Wִd ^}e_u#S3udjfӡ5 Q^ѳW Ξ{#7%NQ^&Ba V"E< jp]uJO 6|M@pV8Nq,QOU $QӀ4-\}Pů)Ǣ?sšQB!} Ȥ]Ӳt5s F2d"N |BhV;&V)SnںmPEpc?BdzNh>/YC{9וnj՘j^|ѽwW C7hxs<v$.4DMտz xF Dh*%мnԁٸuɔe_+@X\iѲh-v[.T7ݯ!ӳi˧7&Ҳ)>~TEԽ)M]FM Erx'nbE0T;j!i{57wp`O֤7M%n'2 w(H~p3A]r/(2BQulvxH7S0|d4qbid5f(JgP+ZFe2O6.|cሩ!|> o٠*kL ϙӬ^KޏKB%\CބWբ8ue8}kS 4Q,}e%R ElKAO[Fk/$VUK`J0V$(PPUAyH]է %ɾ438u$kPUʼ/>jϳ!`@lއ+E]ߏVj`Øfk3 ǎV8ra+GEtO#2clӢWÍ-Q6yl|)]̨89u ũ{5,@ݷ94kE 9iB14ࢵ|5˅ѫ+q$utB[8td$`?KKHnx6^R7/Y"m菭<썟\6'=\sHDd޵!Mg~6F2E(jcc$zDskZVD޸ḯM7)~̻cL}K_\>#9=s!oI>MAaUVڴDdc3E&SX թ!:׍0gQ!VАV.Q2ox9(>r 34jpЍ}2~=K(q9ѠJ].OY'ص0M't]sX!PtF`Pl>󇚔#k1V&]9mX-i*n`N(%OX j \ L.wڭكѧWA<Vr5؄82&% HV^MeU[+jD`U*vӀyJ/`W^&ٍ>O|z6@3(V jAu;xyqV\DsW>ꏷx dw`pQx|F)]ki`#ѺF@gg`]%׋t0B1pDhUf?  ;9ni/MS傥_>V(j 'o֩G#7R?@4ihix.=sp)FkG9v4yƌ6Ŀ VlBBΔ1,R LI RfuApq|]w!ywL$!(6 R70R"ķsTh?>%Dvb& ~~-y6g%5dv*=Oy'8ѿYȽeމ#@%NDoɧ4u{p)oni'uWTV |s( yۅs駲? gR4LӍ$GqC;i_|Dan&SQԷZQ3i^J+ϮO^].(]xChȄ}XfuNCޱEP}\47L~sU_@[' ^3~>E6x^Vl=/ߏ[Hyکy`!ŷj3"["QSY <=zh?9_ȸp0>bEUJTG޾(>1ᩔm˓Y=sH{_~i]3;~Y*w2(`5&e:&.[ JѼ.i)4 dkuw8Msk&;yt])Xi*@ 2ahl#ЦJe崯Itw-C(f$L((6 BUcO%m Gqw>܈L+ M_vMZ*Ýk%C0ɻ}4=QFt=-ŷlè!lH 3@l+]ps`=c떋0Md"ck|I7s(h|~H4> Rm~EҺ|#Ee0RJ>?E7`+KZ01H =Lûcuذꂳ;#1-/b dB?KB c < Ex5q$ucÖkRSId7Ft#+i8o%ȽuP]պ4L#`{5a8n_p HKa#Vߊ='Ŧ}g-!Ѿf iӱP(Ѻ|#tlE N??dF8 /8=Lۊ-@x>="U;aðcDh4Qll[rij@4\M~Fp SkB3@#J)Q9zrowP&4 |l.vvoh:BUȜ8̉#~YKr+h_kIء0B"Q@Oth@'E%9޷IjŞL3Cq@Pp_z=uξ]ir+7װ5 G߮T5z4;Y.Ri~ԧ̉_O`S%uO#{yh^W^BuMj:)KUUlQ]*?RJ0L\C?Ct1V^YFxw-wL}Nog̦eI{1{&gpO/#uoAجG1*qNvh2FPPˉK`MUi*MM;9JK=BTԆTd8N˒2{&SRo;v(Σ(||:6Mro5+$Z:(!)A$;5-+=Z,xM  )Ș~r0v% $ZT-턶Eos2ݏɺjޱC0t80K% 4̤a# zk;?b&a*f4T ]74 h'&%͊ ΉoV.VBhyoȸKC耽( GDDJT} Np>]r[id/N2At_ ڎ@oj#XDzGɶn(6 Q) ]q (2}":;3WǪ04/.#gg:2 #qIQ$/`HN(G7%ϼs&@-# 5݉c`ѧ+jH$ >4)uF ήuҳ3V88/-mdHS7ȝz OD0J {>mDwLɗJtG5 r2pJ9;&a-AX-( aQV ª!l[- J HUuh4 (}g(p$FN^&v`tT%GlE=WgR4/8,9^H -U%oo63Y $ijh_ #Ⱦ$\zh-dZP$F0 \6#_ȁ=Px.=OvWJcpE " ={W"Yo 3|ηOe ,H(YJAT\ Oܢ*Qw@0Q>'tZh^v_q0qd8JZjxa`"U%RyHA֕S4NH ȁXBw3t.2.L;kW!H,r%iOmM^r.29%RJMſ 47x05 9+텹mŦPtƭEÒ1;aFb )|l:Hh]{8\Ⰱi`u*h8_F#Ӑh2xJ Ӷ riʪ:t-eB݇[8sPmږo{P cT!)AQ`^JnPMe'H@s'FK%Qx.9HSzV| סdƖClU0k)ŧhiG[sO;4̫FaEsTq| s2~<^W^U'z5[dNy;#z`ϭh/+'g(w^M(*\l:/ρC[L~twV 7"T/Nt=r2Hn3|C,]OjXf`0ǧK'|6t'>A/ڱL$L?Chr(6 'vI&Ӷ HP4KȟQ* Cי|CGv];:)Lu=n\=i& Z.w=Јcn#׋rٓ'5Ҟ;w%8Eȷ}"~5=ڃpjxPwJ{S;w8]=/${gƮkh%GFLG%(Ě-7hhJO:?*^_^Fy<{6Œbpnԯ+}{2>=wؾAh*#tICP4}V^ͮ:!~,N-g&?ВN0_X-rtڱZ54UA4t]G7L("Ukzʃ`M>W| )9&]~"[IENDB`gmchess-0.29.6.3/data/themes/west/red_king.png000066400000000000000000000130141323660377300210630ustar00rootroot00000000000000PNG  IHDR99sRGBbKGD pHYs  tIME ;WIDATh͛y|Uǿ9!!%H "V XZQpcZSmjq~*b7*KuDQFQ@ (Țs;:rly+f8'0T@o! {]o@ƾojS &8y]8i*n`N,$KMX|" Y0fD)gc +-IY))Huj)*ױc!UU#$F]-`-u|Yrɔ18>LdARu-Bf:QӁ*U?j0ZE)AYYĺv_[`9ASzs<.<]i~w zHpp+QDzP}.X 3 SBdc{?mTb&Г+h:I3WOsɓR-^!^Y4LK#0\*PZ2'&0S:ͻ FhVp )^w w͒R{YKooHjԀE<9rDU|k(ϰjCq9!~U4?EfƠ'R<:/Y޻询 ীM,)S,* 49ۦz"H) p9hykǟ~_=?#~5]^?2}֪M'W=źY~"{]IOA߻fQpC,pamݴSC84Z-5*`ڞSQJqzi]Ex 9{7~& _Y돿+L<(Dp6U!0: ;lI|;wde5#u8QZ*.9瞅p_~s<6L@<{|w 1Who ~jZnHyRՔI۟pgB8Ai^}核'Y!Q "[`Kwzxmǒ<>e|\ECD.CٲP.*aw!tRCD^>Rn:QU^y(-b/nUi| R~wy=_Ns`Cݻ2їhz#pDe/M`b{g(oEi 5x@@?`䊇 ʳjx\_S))+I;J_ymay10Jd3f(_by){mYbpϫ_.}h߼ȡмb=88Tz̙oP^*LɶD;3J=3/Cht`4;Hk PioH0id1_\Cknf$N)Iiښ&ZOmP4ůΘ(D+ΜL^F 3?'"Sn@(Ec 2[H=N` u9?DžW*}{UR%Nj3!U#C$*͟U] EÇPɻ|<ۉLKQdC|yc뚳6Pkp JX=mUQ{%+0H|a2a xZ']߂iEt40 Y& _ر28|n;Ӳn{vw5WG'L5sDd~b{`++ƃaۦnzs1#|cc`|nb";b  D2C#Ϡ> x|(N;R.Tr.9X6m&SY7}=.Ru͸ (.CJl~a;r޳,MB)xbS M \]5@&1Cq+AѿLˁ T]3}nrnQ 0uQiø U!Uݐ݄0s݋'!H0w0)[n Sx-g)@oC#GM( aXZLf2eIgơskj,4EAH!p:5 *.!0SioWlJpCͦXN\U/Ō%J_c h yphHDn6e=]߂ڣ i-|ڊ۪:y uLFGh 2wzgm"]Lp%M)X'm5[cԠ?kM!T2!u6x,N1H }8=G8e%MNت&i뭻IU79Ga;)$DVԧ:Qi3[lF'VfD?ݗ大@x\'gG0iLJRJ"(}!щ[ HZ " 侪jՀMs&G7э2V#m\L|ʉr1C>TCY6# A8]ip}Zu[i P X,uPZ% @h%Y.y}7/ā|jq[>rȭs/~/ +7s{oYA4܈Z*tLY#=d1P4{e#[Ho&kօV֖ Aòiz}%\K|'Hu$6B{Yyq4{1e])Y0?~ >7!}"X*ӕ[vCdZzS7HAJpɻ<Úזbt{%uKW-Hmӹ$Iāe@doӗ/aP_ZBٳv{#vjMawl@O*Ҕ2 ^AJr/g~PEQRj8,;P-owBfy og|e,ʥ3_ h`UzڂPlL~YCdnX]:3enEGlptH9Dm}( os8:N!P fFw?<USا.{.e0c VzHp]V(A1bIhq5jzq("x3WVn/yh"nwէ|`wY\зww)\|h9O/ {Ȏ7nGt#4Ӂ, *?zڈR{Z~._چPs9+ |7v Y8|3աݡd=dʃuU{iwA<}3ooLu:T57Njutjhi躎n IZ# 2V5xm[m:u MQ-@ l1>(9o_VIENDB`gmchess-0.29.6.3/data/themes/west/red_king_die.png000066400000000000000000000130141323660377300217040ustar00rootroot00000000000000PNG  IHDR99sRGBbKGD pHYs  tIME ;WIDATh͛y|Uǿ9!!%H "V XZQpcZSmjq~*b7*KuDQFQ@ (Țs;:rly+f8'0T@o! {]o@ƾojS &8y]8i*n`N,$KMX|" Y0fD)gc +-IY))Huj)*ױc!UU#$F]-`-u|Yrɔ18>LdARu-Bf:QӁ*U?j0ZE)AYYĺv_[`9ASzs<.<]i~w zHpp+QDzP}.X 3 SBdc{?mTb&Г+h:I3WOsɓR-^!^Y4LK#0\*PZ2'&0S:ͻ FhVp )^w w͒R{YKooHjԀE<9rDU|k(ϰjCq9!~U4?EfƠ'R<:/Y޻询 ীM,)S,* 49ۦz"H) p9hykǟ~_=?#~5]^?2}֪M'W=źY~"{]IOA߻fQpC,pamݴSC84Z-5*`ڞSQJqzi]Ex 9{7~& _Y돿+L<(Dp6U!0: ;lI|;wde5#u8QZ*.9瞅p_~s<6L@<{|w 1Who ~jZnHyRՔI۟pgB8Ai^}核'Y!Q "[`Kwzxmǒ<>e|\ECD.CٲP.*aw!tRCD^>Rn:QU^y(-b/nUi| R~wy=_Ns`Cݻ2їhz#pDe/M`b{g(oEi 5x@@?`䊇 ʳjx\_S))+I;J_ymay10Jd3f(_by){mYbpϫ_.}h߼ȡмb=88Tz̙oP^*LɶD;3J=3/Cht`4;Hk PioH0id1_\Cknf$N)Iiښ&ZOmP4ůΘ(D+ΜL^F 3?'"Sn@(Ec 2[H=N` u9?DžW*}{UR%Nj3!U#C$*͟U] EÇPɻ|<ۉLKQdC|yc뚳6Pkp JX=mUQ{%+0H|a2a xZ']߂iEt40 Y& _ر28|n;Ӳn{vw5WG'L5sDd~b{`++ƃaۦnzs1#|cc`|nb";b  D2C#Ϡ> x|(N;R.Tr.9X6m&SY7}=.Ru͸ (.CJl~a;r޳,MB)xbS M \]5@&1Cq+AѿLˁ T]3}nrnQ 0uQiø U!Uݐ݄0s݋'!H0w0)[n Sx-g)@oC#GM( aXZLf2eIgơskj,4EAH!p:5 *.!0SioWlJpCͦXN\U/Ō%J_c h yphHDn6e=]߂ڣ i-|ڊ۪:y uLFGh 2wzgm"]Lp%M)X'm5[cԠ?kM!T2!u6x,N1H }8=G8e%MNت&i뭻IU79Ga;)$DVԧ:Qi3[lF'VfD?ݗ大@x\'gG0iLJRJ"(}!щ[ HZ " 侪jՀMs&G7э2V#m\L|ʉr1C>TCY6# A8]ip}Zu[i P X,uPZ% @h%Y.y}7/ā|jq[>rȭs/~/ +7s{oYA4܈Z*tLY#=d1P4{e#[Ho&kօV֖ Aòiz}%\K|'Hu$6B{Yyq4{1e])Y0?~ >7!}"X*ӕ[vCdZzS7HAJpɻ<Úזbt{%uKW-Hmӹ$Iāe@doӗ/aP_ZBٳv{#vjMawl@O*Ҕ2 ^AJr/g~PEQRj8,;P-owBfy og|e,ʥ3_ h`UzڂPlL~YCdnX]:3enEGlptH9Dm}( os8:N!P fFw?<USا.{.e0c VzHp]V(A1bIhq5jzq("x3WVn/yh"nwէ|`wY\зww)\|h9O/ {Ȏ7nGt#4Ӂ, *?zڈR{Z~._چPs9+ |7v Y8|3աݡd=dʃuU{iwA<}3ooLu:T57Njutjhi躎n IZ# 2V5xm[m:u MQ-@ l1>(9o_VIENDB`gmchess-0.29.6.3/data/themes/west/red_knight.png000066400000000000000000000125211323660377300214210ustar00rootroot00000000000000PNG  IHDR99sRGBbKGD pHYs  tIME ;,IgfIDATh͛y|TǿϽwd/$ PpqEĂ@qkZEmmWꫭ*Jb]P[VR6 fNȞL&{ D}d2{ys~#8K,\xV 4FS ̳uS, Z4vrq9mX-i*n`N(%OX kd`n~N z1|H)%8i*! 2&% uNm$F:8j:D$o>V9)t̘v W^:\g΃v'V#؊`qŪX-/ H=ˋe8.F(&G4{q.W_k%j\loECNS-fRfh|c50]xq3b0];1?MŌ6Ŀr3+6CM!+ɟ=MH)t?XOY$o0B.XgF8ʋ$Ǐ@Y!U8'Ry3aPtuϚknsE42;_:r|oD#-#ɘ4$XY𽿎>$u/ŜYp# eſWh>YKL?=qp.['}A0(=5_n$oRz lViB;{cp ޫFbIsҶf;oLn͢]>{ ϙ.[Y(j^Y.PɘxEC&RX4 ޤiJC߄N`H4,@m1eL7L~K@Hv>=4pm/VVl3j0܏O>H٭kf!^n}O&. X NAx>|<(y۲/Ru* O]:r\ o&/NX-O'@Zh][~FJe}XӺvvJjK oߏv-Rᚦg=YW^{3rez̯f_wtJMP=Y.AzO9bw[[WnPt *eB{6Mrp0¡.a(42@aՈVVsWPnc %~ 5ͅv"VENӤ8po34O?@o~{ cԒhmh9!Sv Tuqo|q{ֱ8|9w&32܎_,#Ry7: nJdNpff3z2# -Lտ%)ӆ%Nj8]<RJkxw\C̼s-4ْ=FeEj|ޟy37~ +bھD4S8g:\ //{0JCL#~ֽ7&YS/Eh)=17h~wNtkB`kV8`rQ~cQ7KbQɛ5-Í4Sl *oz΃d|ez L%_9!Dzp/{f~ǾK%5M _m1}hYu?Og 3śEq1i429߲uZV_.xxm p[:P =9GJHpd *\tqc 2&_WMbK& `a;se5H$II.E+7qG/Z?;MXKGy1(3c~VZ?\wP,='ɻH$n..vkpd> ZoDI)(DX4"gQp#: gZik٘H ; mm!^ӌ$]ٚ#],HYA!Պ(ӸEd7EHޯ_bUB?rk`BO2Im\IL-[<ʟ;iѱ~͙Nd_ z5PnJ)QVWOpٍb`Y/q /Z4 .Au=!:*.hՄ'cx'DǕMlj%{\BdLtN{Ppd3ezk[Bn><@c!)jTBvPVO`~Ls`0 E`Fb4,^4LM5A !׌Ĩ~54׌"wx|qOI:P` !@`>J#4`ea#Vׂ='u^LK+6&s1{jީKF0JMT} JC쥅.e{eki U.vWjTA,8fR8g:jyhPN~oɿ 7TN; ȵZ4{w0IԵھgq.=&].$ni#'s4'2w7QV5~`/G''(ּ BՍjr5*6!0cqTΏ(kVV9e,¢r=H>iIީ3 ;1zk~@(n'f,]4UHSX,R76TI $[p_8gJSQl゗(͚H$[3AH]';$^huDBGh 2zu4VPN4S\ T?$VlJR/-3@h* 4lBY1.A7%Vrݝm#ſz |q#EX5Tt(]b{&_ k3FYJnmEAl'}NhL "iN[Kb;ZnJq녽!P!# bki;Hx$`JqAv"tt{]qha[>`#4of囈!3U[2d{u^9!DvP,*W_L'hU5%4p` FbgT9fLGJ+$&>͚H {}-+7X9 ; < 3@=lcvbeBXXsyDb whƶ`ʃuZ'6 NJU9 q fVdL!W{x<5g9i  yU!v ֏FW»}aE֏7d]}_4}!7RY G㍫UE /IIf,~\ƌG2'^D,%yv2T`BSp^;&"DCJQ"Mqxђ5Z4sD-[w5 @78[K(WAOwzlŖ$ZYM΍|u'putң Ȓ։{I3aP}D'cØ80z.R3rjV nn2DyHX>"J30q}g{"^F`SI={-Ē޿*nAn{ؾ}g,W-o@T!Ff?~y.lc9?K8{/ 9O+ 7?J`nJ| Wmh Ω~`G aGUqBklŷr Ȝ<&i39E;.E5;ș:]2ŮSM=x4jh 0uޭRy@l'q7GuN*W9۫ctm/Jw{H,[_U uס1U*>[ຝ8c-:o$*yg{ɹbS>ܻ+ t&(_j`]_\ә{4-߈o4bg liqyd!F?\{WċW,IB+V ԟouhϪ{UrѢ=ɪ~.4$i?_ŷ,'zw+fO>3p7r&,piM"gPLح4[&Z)ˁ_/X :jA&t|s*}?m-AfHZ0|6u7S~5xg3TY;H=w>Wg̐dS[drٺr3UI(wl2 ßʛ7{ *NE+{ɣeFI@ea/+šv$yo(O]cmIqD{<2'9e,"XOgߡ- {ꯘuO{ݜ\\u֥\q0Y^Ev_ضX} F?z '0b:MCX-h'֜tlyxC;r[ūK֐"H"OZJLѨ 5gؠ ,+fPAh* >aPQm;mMփҙ YY_aZT5tڱZ54UA4t]G7LԷ QnԹo0Hi,)НN|@؜j9 Wਲ਼vIENDB`gmchess-0.29.6.3/data/themes/west/red_pawn.png000066400000000000000000000116531323660377300211070ustar00rootroot00000000000000PNG  IHDR99sRGBbKGD pHYs  tIME +IDATh͛ytU?zAن` ( 68AEx\P'2 C@"a d!N{UGwf@:'']U~{%8X+0=6  Pʁ2`3O湚8Gd`բ ˎijPUMSu0u`0.UF0 vk^^%tڎ~;ӭ"M#6!JI@BS@-; Gb g`uvS)9)~d}Bu@yZcM0f,QՂq`VOgޚF|Cu|NK/sݎGfNbedࢵx?+#R]cLc)Fq:P]6`3&^#RYMh6䌹ğӤr %ȉBz!<)dI)k,_4LLYq!.3Ů0̉0:MJ- BSȿj$wM^)Ŭ'`pUҍ)H x]A6V^;zyu)GŢVLmȼd͂ 0Lqa*MŌ5s{3n||I{hy^8 y=KL-a*zwq+ǐ=n0H Y-@=)w亯W 4s3 L_S rmD?NշKn$&)..%Iڝp׉Zݒ7t6 -kY˓Rz'\8{Pd_v1EC*6 ЃзU/^ZcCSe0m=Bĕ*7^9J|AVn3.ޱL}i*fIR~!DwZKv÷zb#dm_$-I|>6OVn!:s !o=G|[P\읊UD[ɽb8UD*9ta0 ]* K+<7CmG\.<{?) ,qo3~ 5//hn#~;PgP)ݚ Z5gPZ*JVa7\"&mL =>1][Ş gNt;$ -uwWQJ'NNᝓȾ"L fO`C9 +;nhӳD~r8/uO r*0C,6NT,2ӷc/)J{]盱 %'Wer' CITN;-ߌwF=@7T7d< 5nW2CԾ)?4 3iS yd$%q;kF&&&eZI@[P#DFb']cFb-!T!-qYw(\}ϣUUН#߾01Av"XT n -ۍ4͔x0"1jXAh~h}Ī|w]J\Ǔ\*/T4MlǠh*5s>W,۶r&?ω ;LFV\_[1# %1p`.*.=5WvR]X~8pŏ{Z6F 4'{Pslj↘2q8h5(8z~7Y"T;/R94|%g(~t##LU%cDr\e^]mMilMEu}V3ǃkHo᲍.]7;Z9,[A6ehYn2/(e+^Ӵr ~Gb:p'3&e0& l e)k_vzu)̺d Z 2ҷgGTEINztkO1'WحiXbmM[q_3E)+IDFb[Ѳ\}=ⵍi!a%kDՓwI`T+ȋ%a2GOMbxm$|Yqv3/n%>]hw5j}50SϝAFAբE 00kI!UR0RgX#shFdZ^CDdAԿ37&ع%xv a#ZŞbRi$cpoDLJ(! i i'YeiQ.M#~^{ P 5۰8KK 5(,N;5 T%T`?=?3Z4049sAt KaҔ)Sy4ME(.;jP{ =-VFܪb3Cu;fL4;ߡz\(VxCSzČƱ  i*MMKwV1ѳ 4QneNhޱ b4 Kt Mʔػ Fz'3b"`뼘(mLYf$Tq=4)@a$&%˓IưBwMiT»HLǩ0[B(6 ) Yc1u-龨Lv76#PF?kw`v㾰Gږ뢇92{!EdPaFDp4%\ʚ[=POg i[[ nOӞDҚ '(}<-U!ު-a2:h%hU[޺17OґhԾz<{1wz/SWoE8Q{ud{~bqVjOe5 ^\@-Xꔇܹ_$PVAș8,eJYyA7eT"o@URfp[w,!/KX JRi$g@t6ˏZvS5cm*̝wÿ4L+hwd*1݉m3A,4(Cs1m`1bC(;5aBU~T-=fJrLkMbhYn n5%܎sw8tcԾ)8/š/vp4^OBQ"[a`Ekih2+-pZk E`uxLc7;~"ȓ`a?v7@a)V+zEdo5׌§E_H:G}E6™7{St_]ج}=UGɿWO3&r^y*f,NKɻz}G9{Ń7> $?d9>N:\^{Exw%Ӱ`?.*wd= X;x=ኃ'ֱ&cgMA7/.ZbЛ`x)e,}u) 7뿩d ~ =4~ 4Gi BS MŻ+=&޹-t{:ʩ,]]X cŀцA"{QOJBQ]]ڡ8#c::jAu|K7Ұp5FϚLnMMjkyZ$,JNu_=vq 9"k_H[ 'U. sDͣo`D|d$?Xf \.w=Ta ]c-Fq;P]v`%L.w66'N =a4|W?%J3괷.ڶMs[Q.y ~a>H`>u^b2Lj6 ayX3W  ۋ֒,oH2Ihݚ߷gzt-oi ;Q䰝Ah*tI]h$ުvgwe5;v$W$ә9Jמ_ejۉicjhi躎nbɯ Ba 6xerݗk pa߅I|@ ' ؚcbioH:jIENDB`gmchess-0.29.6.3/data/themes/west/red_rook.png000066400000000000000000000112271323660377300211110ustar00rootroot00000000000000PNG  IHDR99sRGBbKGD pHYs  tIME ~IDATh՛yt?5&YH DvVPPRVXK߯X֊PV*" UP*; @ !\3s;yˁ_M71CIdJ)'j,G&ZF?Ծw_0:;,@0BSȝ0Kdf1_kbW0M<O>pydQ"<Mյ!Q6na"Do͉UL;GkGr !vW9.6 ߘ AƓkp𿷆cOp^݊W̔+-R^kL7x( W'Ek_$ ]Bɤd !E{g1WqV*,&>ty@T x(g{nG_],S/bӐI oDzJj??:%_/Cљ¿t=ẆP6M7s=8PDuD'b+J_XΡMb`w)Vc5z9#gϯ䍅bӤquoOW@KOkPmԼus?FUT[v:A`>WmER3#{aN&ia`Nq_#8 (&0d{RzwziѲ>x3iwFhRȭ:!=aE ;GnCgfA4 {AJIZ.q OEÓh61<x|ݒWCM)'ϼogrnnmR) bIGyѲAQە;i 뿯 ~Kdsd<ecIG֧3Kʇ=`XʢM -r=HV=;O(6Gyd&hJV]h*]ǞAlo Ϝ?'QJ@+Aa8Nw1*qr] 3vjV[!F(_I0X_$ܲ_uX͐t!f"u(F(#ƍe#8  ۅq5DINS n@Q/7H$e+IgQhX4+܆?^@4aaJo2Xc&}p&Ӿhpvȣ6'S.R@װDs?PڰHyf4갣:p1q"6UmcS7(D]ZT4D)\M*ˁ<3Gߦvv)y?T7QL8ڵႂjjUN㦵K oG} K- ,cx}r1N>XGK\ڍ]*2 +?q|؊#E>V m,E{t L`4<"8]r+0h[ᮝ D܏ o;KQc0#1p30pulo\ yu޿0s \ms?݊-MNOI3C&":4O>t3n{RTV7D-O#,viwp=Y_E}o--D!Q{oNF\{SZT7E=@档냌{Rq@Vl%n#6EIWo'chor|,t#X:=-=@;=R9ҍխ{AWo6s oKuCyNŋpP g˻WuLF/^nl8ajf.#3Ix?˔ggۅ1Ai~,i{Tΰ_-,?M?ۉvYldpBS_C+qvlEr3ĿJ78#jI; ,<ZlQ,G~Pv$t= ~٩J:nC&u>Ru7 %_/G ˂pg3M1{ 驓RYwE͛ːzJ%9W~^(ͫ$Woa#JL)!~k]w݈hqz(ŮӦ𣱃/iP5z0 8qv)ĞCPӜf(J☥w5Zzt7yda4`ޥ1ûM[;n m&=Gse}dׂlrju}ďՓ #D#:4݆ucO' N˟l[AllU\Fb,0ў]ӳn (p9hmJ]r,ip4l%[`Wy[v$fK,p݃2)75MU=nn'v*hI" 1%iU:C&8% ؀KRO.ă%!~ؐ*$g`e IENDB`gmchess-0.29.6.3/data/themes/west/select.png000066400000000000000000000017261323660377300205670ustar00rootroot00000000000000PNG  IHDR99sPLTEjL0tRNS@fbKGD pHYsHHFk> vpAg998#fMIDATH1 0?IB+!NhaSWQ>/glSKb@C:QoFk}{)j\6gRG8IENDB`gmchess-0.29.6.3/data/themes/wood-small/000077500000000000000000000000001323660377300176705ustar00rootroot00000000000000gmchess-0.29.6.3/data/themes/wood-small/Makefile.am000066400000000000000000000010071323660377300217220ustar00rootroot00000000000000 gmchessimagedir= $(pkgdatadir)/themes/wood-small gmchessimage_DATA= \ bg.png \ select.png \ null.png \ red_king.png \ red_king_die.png \ black_king.png \ black_king_die.png \ red_advisor.png \ black_advisor.png \ red_bishop.png \ black_bishop.png \ red_knight.png \ black_knight.png \ red_rook.png \ black_rook.png \ red_cannon.png \ black_cannon.png \ red_pawn.png \ black_pawn.png EXTRA_DIST= $(gmchessimage_DATA) gmchess-0.29.6.3/data/themes/wood-small/bg.png000066400000000000000000000015761323660377300207770ustar00rootroot00000000000000PNG  IHDRo pHYs  d_ vpAgxLIDAT8uUQ0C;K16>; GfYU*k-ݯr[3".] @w twDI$43&3J9vd`ERk̘gTd|!$HUGV&"f5ffwU,Ow0_ Uatnwa8Œ^h8 >aF2s]~6@2nkw<ÏJG)S;T5^d Y ܆)^..d'leJ@U)"!3~w ?T*nf10#N3nv>ZvKG#7tάicQQH/wm֦ D\?"Jmw.w#g͜u`Dsnx#BjzTybLGǻP@ ;qGU9W5eU::xܜ #3;| _O %tEXtcreate-date2009-02-21T13:55:18+00:00jDO%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERtEXtjpeg:colorspace2,uU tEXtjpeg:sampling-factor2x2,1x1,1x1I%tEXtmodify-date2009-02-21T13:55:18+00:0059IENDB`gmchess-0.29.6.3/data/themes/wood-small/black_advisor.png000066400000000000000000000030051323660377300231770ustar00rootroot00000000000000PNG  IHDRVgbKGDC pHYsHHFk> vpAgUP.IDATHǽOh$U?^_*.(D3x00V(L 2 2"̊0,X{!qă0 =BCɫS׼a塪Sdg\4]}oޛ+?:tk}1}n?wJl 3 39ރqpXX/s.#ނKp@k\䙵Bo}w^ BqiDE p&%bE{H7o.R%LL! izqgr2#D1<>ue@gAaPXHT@j~YDJY\r'cOJ$j,Eg΅UZMpTG DpT1rJ)͔_ޭ,YV=@˩PX(LJRp9ΤK-\Dcrc,&Kf!Z(UNTJ1pq&|w)Ew;c//u$@DZQ ˹ZҦIe]h9RX~'IE?FȕxvkkX[[+\л1ҙxz:t0C P$Gue C,! :D!8/,7,ʲ|\;δb!nt!lXŒA9p%~ C4ySE7াtn$d!%)*y`BnYf-ċIa*ڢT@v?# +ETtt`fѰܮPwXQ+z#{#%3vě5u?V0Am$萨b$<.˥a xRsXT:"$)bR*SϬ]"&/ ƵAZ_‹+`;!:/M#h+z^EVkKOйap3%R ~ .r5__mFҊb!Ao򿿟'ۥ}fmg? ĵc!f mi5cI8#嬁nt_@g9Z!™1L9F,5 ItwQթZMrgo? ,.Bʵҹ 2\@J].RhVYGJѽeZgD$)_|;$f+!+χF}?w[[[EIKG49N㏯u`TR1 $b7xRlooYܬsĽSa{ƯɅ#/I%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood-small/black_bishop.png000066400000000000000000000033011323660377300230130ustar00rootroot00000000000000PNG  IHDRVgbKGDC pHYsHHFk> vpAgUPIDATHǽAh\;W'=eZE6 ŊJ1ZȺ"a#dD&A$E Rjk1CDjX-&>8f, ٙNW%V~*~;<~Nux/ A!%n+Ƙ9jk FGH%78;ΩOc).,>嚫X&C9t vpAgUPIDATHǽAh?P4 C # ;l#eama,CEe7U,, X6"DHͰJm4L>XU:i4w.,?o6=o}OzxS/*7 K}cal_kZΐ\;"ygdA?.)A`;E-R3hc,C-7~1Ơ~t5S2$gAp&\^b$)KX,a&[[-?_~yoY# N@r t/:Cj˫[O˧_r4.^DGryMpޢKuv2yrv"苵d ho U %֎w ePU(52}4[뵾þtO')bs1rݞZry Q;E ŀsQܡR.H/cZC.8K=ʭV-f8sYT* WF]/; qbٶʫ#Ra*C<7{3_-UןLK096Os)a(ٮdɂ0"Yyh{DܨmKĉc*7w4t2(%@<ν$Lbws[ܯ[+%j-˒_I̝/E-.;z8qBBowdTs~%1)Iir݁h!$NwzpMHAGyP(yE G\Kq\h<^7]-J= EZ[<q{SpQ .ʍB78(-ݢ"K=ԑ4wIW2b ^o1=WGk'mZ $/B{)Y!LXqr棴{!:^<&n-`zo3)Zm"Z`ws݇3wi"gaU!$NQnRykmoHS-nibL3Py-'4~L T/]@')Zw3:S,1V8nQ[OPC'~~l|Jn vpAgUPIDATHǽAh 9>N;dɇ CL# RF)L  |JAePH20s;9{7ZYRciwz;f~od0s?u={yHv{t'9c B҇D\_#3`O=0@hc:az*t?`c, v"I6&9}~uea䵡. ! ڂ>2nc?C3Bܤ~N0wk G^ =xvq`tN"TP)ݙ03 ղG{;b{+b_?8=V?<,rtFЏ\OvzT'+WGQ .ufRT>0 Bb]VWِ>Nƍ.-νע:P.oߩy_ TPcڛX";P֚G:FY%?,LL֮1=z lX$Jꓘ%壂:k-O!hq~&H%209ւRn jvcO,JG`SZ_β21ewyyŚ$-݈OXo{4ۆGo~ $RkWH&&ђdH8c[nxHk,78UO4eX{c1| G G </FDt}LUCɑd|b}@y{$GPQC414\X|SV![iڸUAqQuAJIfH e _^9uN7(9 yc 39\[|4Z53JA{?++D⠵1 ÖHE<9lȱI kBuPr<ĵ"<jm#nTu pFVL];iFiv1qu@ cMNIbmP!VG.}Pftc];>eX+2QE#7 ~0YXX!PnrtBBxDDHRe=l)槀IBUp95Oy (,G LNyQ4M 8RV=x`-.ٳ>|psGf`U69J}]I49\BJ1B8JRR(o.b~j W'=_@JϵTJ{41Ob ~|ו޽w'M<\ c'{t|.$ h_PE*𿆾OI$fأYR( p6i7%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood-small/black_king_die.png000066400000000000000000000017541323660377300233120ustar00rootroot00000000000000PNG  IHDRbKGD#2 pHYsHHFk> vpAgUPIDAT8˝_heo9gbZH% AH$]eBXeQAM7]!Yօʹ4j(3Lam36y~s.t~}[]57?::T# (I Npu@ # (oM¯3|(kQ6,1"2"1 MT>yqٰKょMA;Bz78D 2 "C..%NZi$Q,LoDYo,wChnݡMK6ۺWl2d=gUJ)(*fVP1R5˪=TuhPR=b9!MDCIɨvj5O]/8L&VP0 Qco,[M=SrTOl2G,;PGb, Su*mqcךU8Ҥ"hN/Z>ȫ*aZe13ר^%69ks"!W,?QN}"I-^J5Bē!FzQg>W"%]2m:qFpX5٦GYtj<KR('2Mg֯FͲSBmZdtLWrY{5\k6~;fhFYI$HXջ.)ZkѤ),( *("ҨE 5X{0\FjOH)Iw= flm ]J-bi57@pE4Xno= fFMSxt?G% %tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood-small/black_knight.png000066400000000000000000000031741323660377300230230ustar00rootroot00000000000000PNG  IHDRVgbKGDC pHYsHHFk> vpAgUPIDATHǽOh?[{s|Zv`(.P/9H=tR\XE R!8*A/F* a h׮iU  k +C SF{sazV+˱SJifx}~7JYo}"] Kt}e>ݨgog}caj x!gHȗµ-rz7χ?fJvy bFLDN!Ԗ۟>-4\ɤ*68`^ř$,~%]{,ݏ3 '@N=$~0C)Z` |QG_ \_IН#Lq\jѱen~ZyDوҧ z(?p^vXB ]Z{O1T{?/TDhcAko:pBy֍W/tm'=zLgj^|Rµ҈/:LTyQ+8iTT?, m$J8nPR?nA%_`\:MLz+gx:*02EԫCY,ׂ;,ٯ^cGΡ4< o.<Ӽ(eAzE~tkqqp{;wziLQ+I-5c-&q (sQb˫8Õݑv. L}R@:7 u@l11 E+yt'9?} 88B2JyH)y*^CiayNAb9;`?LX[y k>&&䛻4Z!,E(Ԙ|PCL+}"[&X;#GED ZSˣn>Z.3gYp7䣫2swH\s/}`ѼR20O<~g; =(FBR=%`@ >,?̤AI$WrāWE8)%9xp ll"L ׹y҈R @gH-B̲y@x!-j1۽g2xFxɔzcOq5C0ᙪu aJe@ejPs}}y@qtl1@RZZz"S˗/=`7w5ӨSLO <\Z4O ʼ%ko٣ZG&NRg#'_}7lm{Qۧ PY)%l6_6x89MSTdlCsa vpAgUPxIDATHǽOh?[{s|Zv` ,Z/)HnTP qn&Rb0 \D-HD6hIʶ;3ewwar֒b ;;}V<}YtUpd~U+OV#f:9U~닏M_>#Cwk 86 ]“  Y$.U Xڐ8õTsʠ~~Fea!_ i>AgGG}n<bm4jf]%КGBYԠ(山->$Gf jX}x\$ -f~`Ta)@Oη'TDiIjh-wgc"GtX;'҆3'&2:'sѻtZ,(Q/'%\~ǟU&z]^ uzw"͵UN1??{kh Jz6_>wQyU:.ؘ*n7ό{$ݻͳovIzmD.U߯nnn0 ϞL 8W(xJQ $XH txHe@zivX8?`! ܻ">d}wQBsctڟj B Xmx8 .W ģ»]»~rJ9 L,6ʣl6 @-)ӒKN:BzFb#`Nv^#%zMR>V.r /c>ƬШO`yž"/n]Fj5ðܽ}ڠ$)=Z\wMڸ#[_a>gc})PwޢToW^~*R-M&I ZP"GM6Ĕs bM|?ܹs|VV巭Yց(=@zꨗBV۸Jnjx` 7c}=m3O* -)%;64ͰvS8^ԔRa?<^fN4%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood-small/black_rook.png000066400000000000000000000031541323660377300225070ustar00rootroot00000000000000PNG  IHDRVgbKGDC pHYsHHFk> vpAgUPIDATHǽQh[9Idpyx0 J 8Y;BA0 t!o- Š(Y C~.#=]sCn,GvҤc=|O4Ma!?E瞗飻ѓ884//=}<2oq&xz"RO}fys@/BH;cbm٣s~RdHV@w36DQa^\q3HX|3أb<4;}W{۩r jf8;cs) m-}I<2Zu,^1@ OIyXW)/L0`R%PK+ُ$ y20ؿ\ ym5$R%lֿ=Qә*9@۩|  LBum>mvqaj- JB y1rLiZ-aEpcfa͎`(T Bc@.3q ɜIP#\؛X."y:^,g)ACgnooJ%w"7.n$\^IhwZ;.<0%%xн=r2,G'!$0cV7h @l@`%3N 8f s#Gبg6ll5&_}pqqD;GqJb (`.YVϰ<> 9wDVsه=}&ȣEa?#EE~n 3ˏ ,? (!QS$@[=d/Ԥ5\>utоwBh7נwګ 6PM^OY bvx;DQ8%GTdofNw.x ݢgJ l r4' [|Hfwox3Q|G>B]h׳>zsYefQ xq-S&-31˿+2J@i&z A>3Q!c}Quy.{>UQZ㭷}#GI}pmXBiw\6RH eBk;(_! \pA?֮#DVau"y"c A<8%q. Th֮ q;3+ zdnL{t5)*Q*B(*PTAl6JX§}k} P_ɿ%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood-small/null.png000066400000000000000000000010511323660377300213450ustar00rootroot00000000000000PNG  IHDR w&sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATMAkAwfvCLƃ!-b^BP{77iRXP/ JaOj$EԿ<b^bCHqG"f6y.n5}ri-nn pC _?]TgWų{z-< WSLZ'jUaK Jo-,d&6&j~ wNVp WZD^ft 2kpIgymq6eH(K^:f`@mݺ1_^ [3H&?hhk8?(}#yo7 'IENDB`gmchess-0.29.6.3/data/themes/wood-small/red_advisor.png000066400000000000000000000031731323660377300227030ustar00rootroot00000000000000PNG  IHDRVgbKGDC pHYsHHFk> vpAgUPIDATHǽAh21; AKw 1 T6BU͡;`lBr- NiPRz0ŵ. jauY d:(r] ޛ70=J['J>޼~79x~/򤿋N%?8]@g闟}{ e":h %XA?[KlC 1O}($ʀ?kr;>L\p[ D!C4`l Dm~HA/,q^4slЧ˩΃]:#$.SֱTNA+IIRgCѭ6;Q,/swg 39T[" XIzi4ev]X? 艩g9)`C 8L%$0,\lh6Xav2FP\Bj e2M%QHK2ahV 痰ll+~0}qeeLBY/ɝ;9/$\@IY A .8,6Z/a~%*lyZj2eIlVn͖Y}sukAi^ח$R$[sJ ?LFo!X{{zz?,YzUQ҅e ™QtwNJuXǕqzڤh{EX`.9(P{eknP/ 5Q?42]H[K ]J!ζ%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood-small/red_bishop.png000066400000000000000000000031431323660377300225150ustar00rootroot00000000000000PNG  IHDRVgbKGDC pHYsHHFk> vpAgUPIDATHǽ]h[Zayji]"=$L_84 =Ĵ8$2*bc )bC/Bj&ih ++Dv0݇̎v, LxIK|{Be:pw~RąWpE Hxv,/VOeh$0z1㇐&1]2.~4ާ72;\ #"h V_"^_}[x`G/e%< u=0`]uPƤvz}!(U-rAn?OG0hm c9l n1G$f4*e:]^`g_e?7@@ l`yĹJE݀N0epa!;ʩ sAZ 9*ԌP2j9~A痹 0`'tHG}<{UAt67[kI`6BNH_x)IPӼ&^bbAՌC3.P+w2Uu:L*2YZfj3,n(b zIQʱjatT6xzbƴC0"Il$qk؋u:ʱ#OeJ@ dU3wÙȞ[zfҥǎZfTHױ4[[4Q3U_rnHļ̴/bR!%Ru K:WK%Jzy3ql:퓊Uدl7m>\%P* pˁ7^][Adt4?ovstͣ<m?hG/`WxC޺q#[tS3? vg16::{H_Ҿ6j ѨYQ˿K(@Be/OPQK2]Ǯ8<:=AW)1 Ұʚ'%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood-small/red_cannon.png000066400000000000000000000032211323660377300225020ustar00rootroot00000000000000PNG  IHDRVgbKGDC pHYsHHFk> vpAgUPIDATHǽOh*f/siZmbD{Xh2 HPi !I*ԁD ZlJl⃧. dZ"-ފ2z9, L:i郁7}7W%o1ytGJ/V h2 X+WkW/8ь85Pi)| :+14yt|AmW1R0K0QO F#~/7x ))"ZpFC280/G<Ov` ypڌeDf^oI(Fp(u00 [8\wli;c|.z=xmieB1N<ܚ=,H++].xrL?} )$;6 pY,o\<\42i7+wOE*fEYm:ͽJۏ"Ɖ'p=җ)0,xh( PP0FR3tÐ`eC.GN#܉Z<Ti;vϛJ&r=%.}z?`y C{zg\&/z6cS<2m1s5X@nE @.G4:&yom(a:O*xrP9A$K `y::6g _iE}%8b5V؎p(B]`Bs 2G XBxeV"M nk/0b` Pf6z 4_PK7҄< %-.}z<( C؃ш,mx<!o#=g:T@>My9PHp;ba QCX,E nVnh2I PhA58`3P5cSDVƐǕO&Z :4/7ɇ+ǒM `4sF:Y.1 Y%`;oܰN.%6_|Gȓr$q u\BUp`ǷpCJI xJx{T3U^,-SI2Tx$oO ~Y*)O})ɕro5~_rD5wvYCz`Eu4}2JjD?ro0+mHM?V|K{>$Qh}l공4S-h!crw:VbIw*l8Pkq |4 zul;@޼q(GXN%XmU gW~=nnۤݚ?`(y Չ|<|In7Oӆ+fUA? Уq[Aa=s;C >m|S` 3-ǡ&=oHjHJ%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood-small/red_king.png000066400000000000000000000032531323660377300221630ustar00rootroot00000000000000PNG  IHDRVgbKGDC pHYsHHFk> vpAgUPIDATHǽOh?vfa4;=h{-8{YcXҪ=\baL$PRZ_\|݋0, H6t'Pv tv4sxofazxc%˼y~{4M~FI,Z@sgow @5_B kLN|.FZ`b@cS}%%XI 8߼2[Q?v @Hf(x^b72/,\ܙ߹R3F} UZ Da \,-ǒ(wk%`U:&"(=XUvw7HR*%|סM lQ0zY U2RB}Kq&Iz!1& !(_Yl€q(@$c)(*0р(ZI Oロpm-<@m@ L@Т5,+L:0a^Ws"ޣK^$Sv6tsǝ\?r8z3&xK%'I"UM+$R]Q%`{C*LG XWIb~Ԣ;ct0N `<A0Ǥfo"Ult}\~!m2_]_% ^@A3E Ԟh JAV.y!QVN:ÍWn>l^xȏ%:d$Pde`eD#v-㮮7 nߚ~=|_+eZJt20 %4@2y/7\9=H6~2wꋟᙠt![oMG^KhSg Pgʴf"׮^}/-4{`%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood-small/red_king_die.png000066400000000000000000000017241323660377300230050ustar00rootroot00000000000000PNG  IHDRbKGD#2 pHYsHHFk> vpAgUPIDAT8˝Oh\eߛ3IPZ 1ժT!X ЕJtY+Q]1".M f#24idb2N3A]<޽{=HVqLUh34z!\TAAIբ~vae -'HZՠ~l؁\Jk{*ZE fj yϜ)}/IXϸ]4Qhcδ{ʫ j"dY~Mhnʂz3Iiv˺_tz=~;x}XVwFn$" zhr~ {p\4_Ңtx#nƂ7bv$qmg7f2PDքoMF !m:e6C i5AO+Z@%,Chx!jk:0oX x EKȨpLB2ΕmʂfIW<_2VfyX75 JY,,(X6mPL8juS4g9F_YG|I{nCvM{]%dtzyG )A%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood-small/red_knight.png000066400000000000000000000033221323660377300225140ustar00rootroot00000000000000PNG  IHDRVgbKGDC pHYsHHFk> vpAgUPIDATHǽOh?YΞvRXA KT6Ҫ)%Ȉ GV=Zb;X`e-N tj`}3K ÌWڸP^vfo}ob8|6 ;đ`GK:q_{wh9/!1G¥~vЃ{7Y!a!H q Yb[AҐbrcVAwz@xF"tK^ŏ.N!P0Y&@Qs"t# zR0<ؠy e. O>xiH *tzxUq  ѡ0K(r촶|K?g' O09{ؕ*qǥ$ђHA@$$ v).Q43kKLbWx[ 3Ot.:sM2{Nr\:|e)ww2,P9.cIgfd yoҫ(f8p풭)Z @pJ zi)ͪ@H? fYm8ᬭT9kc*}cR'k5tHpJb4~ԉSd;. Fi͟ՙN(Lo}LIl34o[ǽwV#2iBchHw[CL21e=4KR|[āLטwV/,NꜪ=L ` (a⛀)|&\V}gA&H å+});] 3H=p4Mqio48*jK/(-T0pw\,MgM,2j?y"TI^'l}LyF;xxG=UEqm%siJ(#&×kuVywQ4oLsdT x]NHApXįrKbM;=ʅq$GT4}iO\$@ZG`-MϸR8w84Ȫ`7ujb=|ŗSQR*b wM"vz(̃A$քv EfM bMB 5٤Ϟ` t3m(h;.DIc-^%i{FAR章hI&~kP_~/>7o ?][EaViR dH{=v6pTȨ`-L͐_7^RSƍM#kt dž/+oz-`%tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood-small/red_pawn.png000066400000000000000000000032271323660377300222010ustar00rootroot00000000000000PNG  IHDRVgbKGDC pHYsHHFk> vpAgUPIDATHǽO?*-Ax.Q^Pb KƥGƨQjڵlp4Sb(&I%lؤ5ea]B.h #K00deIKif~>8m [>v6nZ`sQāgn6p$RR =q;,sq#/ Bbdp->' OOOG&SK tY*="= a@Q0sVF/ k,%4o#(5hH`a03uQ}u׮ԦS=~c! c=bM;8Qtg5KgʀC/`3I_Ey.` @>O 3ߝI?hl7p|5GKޯw復"m^Ka 3 < EORE&^kD#j;>N70v4BpZl-yuR} E7.i!_RSx$ ޸\E g:_'_]"k8-=d@$2LpZzQ:[3Ȉkĉ9t,CGQ0UA4*" yi!u$$ U@(qdٜLjIT D@Zih&E;k8'\?(.W1s3 iy6&vc*+kdPv%SX6R\^z{rQaEƳQ//^ /پCJL[(-@g A`z. *; {}2/̐zqd+}He@Z7`/%VAQp< hD]{ ,.Wz5FcMh,lHNT xGK"WX rIjTs)_ h(BcdeC|e$^a٫imL B&LyQrKTlh^k\͍TǿRV/ITd)Qb=dv]ʥ3}>n&@s Ya9'_?,eM?R8d~FQ&x.P)h@:W kbҾӳd4) S7K؝ϛ %tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood-small/red_rook.png000066400000000000000000000032541323660377300222060ustar00rootroot00000000000000PNG  IHDRVgbKGDC pHYsHHFk> vpAgUPIDATHǽAh[faFC;]@E:Dk]"%.Pbp"H搃C $9XS V |va ;0qüyK ìVR]a潙y}/$ oޫ%iWme<=Z_d:Ġd0•p޿25$H 'c@vBIOFJ6~y%_J(:rPL.E;M2"?;b{yʵK>d)8C}L_Bv*n9z@ җUC×2.M慠?Pʗ}q9M*>jD.r1OMzaVs'X`͠.QL*PH=H/])M leي.L/v.ĂߤRCA˃g}٥G \߃0X 9"6avl=<ΥRCyۤ_hO,Τa7#xa$#rto~ {O>zj+Π&%+^#G2p|ۙL@U@V xF,s$KIn@`8Ј8 VqvX5ݣ_o>*ǤjC3LzQNm&X A/ @ B`_]FS/ݭ欕j}U ;^q{ݣ@OND袀:)|V{eruK~z/QD7LFb@ Ppϓ_\y3sHk $dNUфW޸zS}AIpA,JrPRyQ^ףVB.Ȉ,}zvH&RѷA;էdt jW voaW8 DX{q⋴tjdI <^aߡTM4[2!N2K: WlA+aJ4@p#1%ncvPRhj ̣[Έ E1_ wFTO8: vpAgUPmIDATH д]& ;LJXDi`IgY#,-׳cB *T誵1;˾3߳ :j@Q&76h %tEXtdate:create2009-08-21T20:13:08+08:00-%tEXtdate:modify2009-08-21T20:13:08+08:00pERIENDB`gmchess-0.29.6.3/data/themes/wood/000077500000000000000000000000001323660377300165625ustar00rootroot00000000000000gmchess-0.29.6.3/data/themes/wood/Makefile.am000066400000000000000000000010011323660377300206060ustar00rootroot00000000000000 gmchessimagedir= $(pkgdatadir)/themes/wood gmchessimage_DATA= \ bg.png \ select.png \ null.png \ red_king.png \ red_king_die.png \ black_king.png \ black_king_die.png \ red_advisor.png \ black_advisor.png \ red_bishop.png \ black_bishop.png \ red_knight.png \ black_knight.png \ red_rook.png \ black_rook.png \ red_cannon.png \ black_cannon.png \ red_pawn.png \ black_pawn.png EXTRA_DIST= $(gmchessimage_DATA) gmchess-0.29.6.3/data/themes/wood/bg.png000066400000000000000000000031201323660377300176540ustar00rootroot00000000000000PNG  IHDR00`n pHYs  ~ vpAg00WBIDATXÕYQ8,.}4mG>|U8[@8cZlv1Wjwc܃fRߴ4JDP8ݒV繅mSkV0divtқcl9hQD$]u(^U~:5Ƿ~c JgC-a3r^8&"t{kͯaD9I]U;VU|> sN7L=*.t5zbߏ$B,9D/קh`rn\H{arP7IUvhj hաd|e}bp∊ h7F4Yy)}V4;w&[͋tBsƿk}A۷)1Z:1.Ql['"T&N*,"2`03{%oD/)iVZV#U1mtx8v;gw!M%Ejt kɁjwURa˕VײK]IC/-ҵWK @N&lYuW>tLR IVR^;+^1)J J3z 7 ˺+cHeBreu;NmL{ EA13X!̌7OD+U_½jBT޳)R9T"n]9nY`n< H#"eBz2i.=ӳkt?&/Qڀiheɤ@P]~ٚ ?ܜ:&_ (*刈 U:3$@$J`E5&"9T&TИAyU!(˄L@klFD F3D ZCB"8Ռ9+le&{N6(3s5c.. DGz6(o4qn}UsY3SW_փC"9z|>jWauq/,T˫%/}Jd9⺨ihuz c9:t/C_1ư6|>۶}~~237z<1=gOț LM3[ Pu_T92rI3W%iEA1TT^)b3.q\>Pj<f xyz9pED?W%tEXtcreate-date2009-02-21T13:55:18+00:00jDOtEXtjpeg:colorspace2,uU tEXtjpeg:sampling-factor2x2,1x1,1x1I%tEXtmodify-date2009-02-21T13:55:18+00:0059IENDB`gmchess-0.29.6.3/data/themes/wood/black_advisor.png000066400000000000000000000052271323660377300221010ustar00rootroot00000000000000PNG  IHDR99sPLTE:''''$:1$:1/DMD'M'W1W:a1a:j:D:$D:/tD}DtM}MMD$DD/WD$WD/WM:jD$jM$aM/jM/aM:tW:aWDjWDtaDtaOtjOtjZ}jZ}tottz}}zMMWWajjjjW$a/a/j:j:t:t$t$}$t}}}$jDtDtD}O}Z}Dtd}o}d}o/ʇԇʇ$/ʇ/ݑ$ԑ/::ݚ:$$:ݤ:$$/:::::ODOzdozzʑDʚOʚZݤDݤOʤZԤZDOODDODOZZZݭoݷozzʭzԭzݷzddoDOZdooozzz}}ʏʄʏԄ݄ԏԚݚʯԤݤݯz(KtRNSbKGD pHYsHHFk> vpAg998#fIDATHǵ׏_tV$uqmEZL$YJ7!I`s񫅍,wy:lRqy>wm}ŋ׽<<{rqEr?䣵SЅ G}R_`ymxci453>x Ik/Nv)3a\w8y߫˲,+};˕qUWyPkziؐ⧺_ A.?H٬a\)Ŷ`Txh;u{Eyd⑞p(|Kn[]{JEXĈOZQ^ͧGFak` 1 cxWpۇV!RXiYe4L*c-rtV7*Z:"^02)0z^Mrm(ߨUo}\-HEZXi?0E`\iN\3 HEoS<,>\Se* 4!>kNCrɲ!F'P{n5%+-cl5#(r( ӂ(ƒ2Ts[C3Ζ5"\)]d L^n 뮞dF5uA=s0Rs#$ܿˋ3et03<\/x}/ȶC^>klKQC 5Ut=vݶ`I-Ö+ѡa,d񻍳v ~;shWoS9Cd~r~h [~9'g?]VY[TUSIIҴ#Q"Q''^%7Y9)~\Iin[QR U V(MJGu+#sLߒ-{.(gUSrYV붎rJ֓4!tM^BeUv'YE2"%q6*A}8'+1L} rU+4Dd#O b5 =V=ro8$JD.)Я:pOECM Cv.?,iiq]HIqEvG~Ҳ^ů&H,-wdL>r֖o}W&dF27#ڀyo=X悐yx&{dݾ %x?}?[Bp)I~vWtz^nr" u) NϟYW](z[ a;j*)dϞ|zWWR򝲚޴8g..}l a>PY/v;#Lzt@XԸ`vQ#Wؤ({Ya& T lCtdaO,kX񑚬U'4`D>ɻd7l΅rɬ<%O&v=w4t*`RH %Ҫ(v14@ݞ 7=T4D>J%bJUs2Ynz6|O5 $ʫ**đ@j=꿱@6?JbJKSHSEn=ޮ aش(s&{NQvQcp ?D`B>edy3lÚqˑgȭ៾nlq;CHtRNS`bKGD pHYsHHFk> vpAg998#f`IDATHǵ׏_ {>|yy.XAɃOS၁ ΟvlA1888PmoG? 15: xurbϋMAߜs$̓ZX_KQY/s zhyq>/K /ӂ,LvLf4/sl2I%ȍ IE3SEK>T Zt*4ta{HO o6T$)d2 {ǟc^No P^$v"G9)JzYV,˒,I  ą+YyIO-dԿdAZR^C(djP幂H{a/_n \(g4e/s 녂O#dŰ.|0lOF@>g+TsBAp55˲ syiJVaŨVլ_9՜lLar|6d`P.JQ>)d!-aXЂl=qӯ)($&=0ɩ;^tFL'p#n)挜TJ3 P3Mmzzzi6@,p}! xpEn$֫Lo)7IQeTHvR8 ;4e#(w_*NԂ:so];Yii 1 u?![1{"U8jD |@CPκe-.YBV7w蠅٪tfUR,T%M^q\zsW`cktc3 % cqӮ~)%ڙ ?گr`Вh≢F*oN]'?>R1jYah)n>$ ]$!Xuxa PD@;GR]VBr8ńX՜n:؏b `Q;Ź:bu+ǃxUõuι b#^H y$X)b2vwizWi:ZWjZ??iC];}5`0v`}7+6܋Yv{ w*5L _KCUld%q"6RdASSqb_xN`qc3p NFڌH,p;w aY8E)rxmvC{@zv8Qᇻ=J%A e[`wA{mG=vنeKƗVkʴ{7ha[+Ϛ˖H@Z.wAv,Y 6pe5C>HF i-{ Zw5iw (b+oˠXڎu/:wN5IENDB`gmchess-0.29.6.3/data/themes/wood/black_cannon.png000066400000000000000000000054541323660377300217100ustar00rootroot00000000000000PNG  IHDR99sPLTE:''''$:1/DMD'M'W'M1W1W:a1a:j:D:$D:/tD}DtM}MMD$DD/DD:WM:jD$jM$aM/jM/aM:tW:}W:}a/}j:aWDtaDtaOtjO}jOttdtto}tottz}}zMMWWajjjjW$a/j:j:t:t:t$}$}:t}}}$tDtD}D}Z}D}Dtd}o}d}oʇԇʇ$/ʇ/ݑ$ԑ/:ݚ:$$:ݤ:$$//:::::DDOdzoozoDʑDʚOZݤDݤOʤZԤZDOODDODOZZZzzԭzݷzddoDDOZZoddozz}}ʭʷԷʏʄʏԄԏԚʯݤݯݺNtRNSMbKGD pHYsHHFk> vpAg998#fVIDATHǵ_AblP<ũT1{s!Ŷ1vM7Z[w!iZ =76I@@v{G>_$EC|6:4tz_{y7kco2mo"C͌¹`ݿw2c%If~qu}nT6QW^˫ 7zqNjbvP,E ʲ*}7Hb6(>/|f.Hp7 J}r4`a빦[ӋxU9UN'HwVQ▎yUUx$.\r?|MnW53_ nDǢ$ 4]tR^㜒+-y9lA *\,WL6 έi,N$"qIr:eWEucKW0cmY%rJ;YOEUt-?csj (@+A2W;e=Gnqٍ9~^yeRBwĴ,6JIEz+oqJ!N GD(դj[Oimt;a;Iە}c|N4dU1Z֊HfZ_ʹcR~]t}=W«OJ =J_3,TKIԣiŢ~ 'SeYE讆gd vdʼl$͋"_g5BȰa<\ US~)xͪ•=3L2x$aCÜI(E ?+{kU`N6xKW+Jth0R9743eNh%AUoRabl(C IYSX †Z>] -7JɶjtP@ b3."V yK ,+W`ZAܙeLai b 2kV {R.L)&xI.Ҹ Á8ܖ.o 9ǭD zB|^z[`!21EQdͲ!'Bj4c /r dy&H7=e)v^T=i<,OambbZbvN&] %N;E5gM*}.3z!mAܔV @ WZ,x)i,i߱TqR2h*mi*Xi|v,}eǗT߀Pv{/;Mv|4ٖ)3N43(VgF"nVS=@h2;0<݈v|Xf%mc@T(Np043N猅2 lgƣSSB{ >q.@޸=a+X>y2*wu0'A+`$ $jLUc[`C]ff68hמVNC6|+ #j.wϚ+ pGʉ}8Krc-aJ8TW}_+}V>j5O4GKK  $|/:Ow= IENDB`gmchess-0.29.6.3/data/themes/wood/black_king.png000066400000000000000000000055001323660377300213540ustar00rootroot00000000000000PNG  IHDR99sPLTE:''1'''$:1/DMD'M'W'M1W1W:a1a:j:M:$D:/tD}DtM}MMD$DD/WD/DD:WD:WM:jD$aM/tW/aM:jW:}W:}a/}a:aWDtaDtaOtjOtto}tottz}}zMMWWajjjjW$j$t/j:t$t$}/}$}:}:t}}}$}/jDtDtD}DtO}Ztd}dʇԇʇ$/ʇ/ݑ$ԑ/:ݚ:$$:ݤ:$$/:::::ODOZddzoozDʑDʚOԚDʚZݤDݤOԤZDOODDODOZZZoݭozʭzԭzdodoDDOZZddozzz}}ʭʷԷʏʄʏԄԏԚʯݤݯݺBNtRNSMbKGD pHYsHHFk> vpAg998#fjIDATHǵ_O-AW$Z-J$YʶقU01ƷUH0.נɝq98]K/*c\bm#O^%-ן>]O'CW\qfOsøOȧGF'{_kvvVQ~rq{,n]hjj~v22^OdIN,K3Mz='_EfZYVSD*HDURn<349u֫h$"j`q>F_@w9Cr&V隦]^Y )log\vA,„C4tQ;ߐ#{#X1t}[В(J*? +鮓{ɡt{VJdr^Ft_|EjkBeo uů?i=DÜ`d岢vRQWo|zټpoϵQfyl674RMymWz<:-ւlEVq;$vS^V4CRjJPy.lAh1t#I/+ÊU ]FmP.hj B"B bgٸ.BfmWXpSu}!; SRߢ ]D)f˫ SfX.KO;AJ&Vo\|Vk+WMC$YO@?Xqg%Xʶ:rE]\13275p i(8ό^VdRn7sQrL'.r*RQQ]1oT7bf2ƒ$.Y9yMߨT g5aMQEK]֒ UR6t?,m33Qnf<2uzڼtO*_͛]13,q0>4!L\`a.E櫊+b܇Ly$QZou '}'%?@^לDx<Ӣ'4ݱ`w; oSsXRVLea  rUu?v_MED#,D'VabL,FV 2.W o3N9P·W1#$F.3Ͻׯ2Aڇ2YcyߑdY q|(_M|.'FGl+6+Bݙi8#KmvꤻU&Lj1a{ԑ¹6n2a&b vpAg998#f \IDATXý[l}RE$tJIŮ-[ "\/M(j }꫃Q @[}EMҴqb8[,")KK.WRӇ,F/G+'̥" nױs !6n~[k;п55Pi64XGP-o Ûg?S ]54=n@\aWJ vӶE^ >246.Q%R+BA&HOnXn͗ >h:91R]*ߌvB/UG]"4cRQ;wn[슚SF,9xS ȟmD$֬h5i!4XMK";nASb9K -eȸ֕LjM65MuXغ Z`Ydյ1,@(oMbm3BKqg6HCcF iifVrf][[ٷ$VtI=آⒿ:ciV]&kNu+޵n˦lou5]0ɹ}#JuMUvذU5.[杲?񻮨a^UPt&ci ]"vK>c7cݔ#1*[PݎWҧs1bUM6-,;.b=~nPTYqcJ9zF( V'tl!c6R:JW6!7{){=^yofWpgIJ-uDߵټĊcA)73=t5 <岪*r@ۈEyʺ~fn aӑXply3pИآr#PFjB42qQ.O[u\K;|^*(DϜSjYO4m܊Slא F[]=+NK~ي:jrM umM )98nUU|0{o Օ5aᦇϫ F3ߟ:/R]]CC0"@Ŭ5<딪{d^ڃ}HBs}ţNJ{G`H+_iRO(h;d[14=TMSI r)E -k.\&O5gߟHs=A()YfdKD"]@ќ gϲb)ad`\х@PS[ U]FDzu ]q#_wyKiXV̬K>{E`D-<54uU=l il`yj4ChjJRuX-R'41X`TrVtM}vԜ7aʒ ۃ([]!0(pT̈́e3LH^|2ؕywLY0Je~bNdi8*AقQVÆkĒMbE~G*E2؄+{^u]E+&&TP{9Pw+B<ꂆF);-8o]Q]դB?wI7Ap3fӦ؏4tNEb )tګ$J ȑz?pNk4!;CGmHmժK>aB\uyF{2]VrPѪz9%=ަ*C$t.&oޗnׯ{҄XUb&_i_rpKMӸcJ~U 8i_y^l҆9 vpAg998#f'IDATHǵ[p5@bXB`lX)sf{.#c)R6/VoMY#XBRV!dB-iVӱeΕ@]=;^]X-!_n>O˵7_.2~,Nڞ?D<1[kASLM=o<<;nY i^#j|P]Sy͔ wdl25VC o|\ŮŚZx}Z2d "8NVfl 0UMb_rq{ 8Ȩd(RM -/ 9!$Uͼw}d° D&Z 0aOYeKD%H xvU&cH*gBjU)@Bu>))@A3s!$Wy!vk\lXM30_naߠ444trFAf#{nV/eYp=dak(ؖ?XuYZ>m>\B)DD#o_7 ,j kQU*ZteMa5_DG^@*\6n(=Eγ,7x%tex vpAg998#f IDATHǵ׍Wp+qB6(I`es&[`)6;cY!BHV(4mI[Ҵn;e}I۰?j?<|ҥ3O 7m糟#őALGy;z}3fggEQ!;/yf7 jnm-/USevreYqVYBVYAʒδq&?C fe$/3x2+I**J~& 3wc4qw?־(h<7t$IQEc7cY]vrm`ۼ7tb-=Mr/2=ʲNdI|VnF(q ;S۫M1RHE&Ei'MX7tYu w*$GEb""mZAyMT-f)b)D`$&$a}q\DMY^z L) sR^Ms7^:²#~q0cҰhⶣWW^]et3YO{EuUHkB!bi󫏖uN Bҫ$YZWEMp&f> u uJ{k&i ) $ ϡ/Jt9˳ F0 _2W] q\[TCJUƐ( u3q7>'k`,|gi$Blٰ?9.Kj&#~gqpKeNJfǡJ4W Ǝ u!gPBq:gi̫u+0WԴ '%Cv]x'~1/qIH˥> g͢!;%,ta7j+5ġ(4a^>q |k -;_W6| `7xۙ>)9%d#=?)9WWN& ;I?n<TWtM@j4H wZzeap'M5 |v*>=Sא Xs5`[AS(6#D$ CQ8 8@Q [mf5t, Fߙ8el +<$<'tC ˎ ==8P989b1Ȉc'J|V>lvVkK 1,Z4f}KGʍ!#՞9nϚ# iqvGf0`Qi8’'¼m<3nK !ͩS(bK?El."5lIENDB`gmchess-0.29.6.3/data/themes/wood/black_rook.png000066400000000000000000000053101323660377300213750ustar00rootroot00000000000000PNG  IHDR99sPLTE:''''$:1/DMD'M'M1W1j:t:M:$D:/tD}MaDjMMD$DD/WD/WM:aM/tM$jW/aM:jW:tW:}a:WMDaWDjWDtaD}jDtaOtjO}jOtto}tottz}}zMWWajjja/j:j:t:t$t$}/}$}:}:}:t}}}$tDtOtZtd}o}d/ԇݑʇ$/ʇ/ݑ$ԑ/ݚ/:ԑ:ݚ:$$:ݤ:$$/:::::DDOZdzoozzDʑDOʚOԚOZݤDݤOʤZԤZݭZDOODDODOZZZdʭoݷozzݷzddoDDOZZoddozzz}}ʭʷݷʏʄʏԄԏʚԚʯʤݤݯԺݺHbGtRNSǜVobKGD pHYsHHFk> vpAg998#fIDATHǵ[pJ%&mFFYhv t$[!%Y8,1(aIkfbcEBR{*$+VHBʨi^+IȺ1<?{dSCCΝ=;[c,HqPs〇P'՛Z "7:u]_+=~>P*H ̝7)c 2Q2ǫHD<+H"#?@W%o dYQEqAܮVv0~+[X.MӢj&=qNV - sk&8獿BXҔrE16nWr?70PՂ=خhArIn'*pyTRxN9p`k7fV@{}*.H;a۷Ek wΊm71N4u v2{vT!;W5nʳc T*VwʓU,^°+rAb͵qnLT)j)E7;8sI|:2A}vC557 zuiVi  qCCDI Z 5kA68NXϽC "`[ldF%j$*H|\\1TOnn-ON ׬̙Cc!(˗E]ixjM,p Ðh`/|ncϽ=EjaG{@?6BD)^5*Vf{^:Qyİ4͆12_6eBR$IrДMa?΁$؉3E ͘킝4yBO54?rmpp0iN\,V$$6lڔ^U955LYX2CA0 Yoo!Crܤ%gg+g 00Vyg'IPE 6N^)Ñk!fH8Nɦ|f'6ND&L20-NGi}=lFn>˞v;T480RɐbfINF+r˓wS?4b.G8J81 -6yFٯt$8EA+QfF;ޫF"A?|љ4$X =U6(mTy:EQqR4!ǽ+AV=ek9p(]$E$ƧVAdώ>ւ`m&>޷XSi٪-q>쬁24,4Pewen2!HZs pDpyiypLq!pr;iem9r!E;~X^mc/jqIENDB`gmchess-0.29.6.3/data/themes/wood/null.png000066400000000000000000000010511323660377300202370ustar00rootroot00000000000000PNG  IHDR w&sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATMAkAwfvCLƃ!-b^BP{77iRXP/ JaOj$EԿ<b^bCHqG"f6y.n5}ri-nn pC _?]TgWų{z-< WSLZ'jUaK Jo-,d&6&j~ wNVp WZD^ft 2kpIgymq6eH(K^:f`@mݺ1_^ [3H&?hhk8?(}#yo7 'IENDB`gmchess-0.29.6.3/data/themes/wood/red_advisor.png000066400000000000000000000054241323660377300215760ustar00rootroot00000000000000PNG  IHDR99sPLTEJQ'Y'Q'a'h'a'a1h1h1h:p1x1p1p:x::a:Y:$a:$h:$DhD$D$M/aD:hM:pM:xM:hMDhWDpWDpaOpaZxjZxjox}z}z::'1::DMMMMDWWM$M$W$W/M:D$D$M/W$a/j/a$a:j:j:j:t:W/W:j/j/t/t/t/a:a:t:t:}:t$}/}:aDjDjDtDtOtOtD}DtO}O}OaDjD}D}O}D:::Zdoz͇OԇO܇OŇZԇZ͑ZԑZܑZDDODDOZZZDOOZZԇdődőoܑdܚdܑoԚoܚzddozܤzdodoodozzzo}Ԥܭܷ뭄䭏ԷԚʤʤʯʯԤݤԯݯʺԺIftRNS5bKGD pHYsHHFk> vpAg998#f&IDATHǭ׍Wp!aw[-$mS60'N ]XKg 6PE)zREdpl,ª2vtkI%ɺ]|8s}O /=;vŋ{O}~=~ɖ?}>c{~7177;;777 b %{=M&qezJ.gl6Z&_:z<~yPmUUQ>ՏRӼ$ɭ &xAVxY< MMnmn⬮TO4VS"xO>5n岩r [%v7:ɝWW~'%{`jRٔAj((jGq]\!7 麮i0?ʲHHIuW;95rNN]kY!+t8l{$Ժۻ%oL4lU e"ErWH9yuquwW1ɚ`mJ@caxTrY_qHF$NRK%IRa *ji@,LW Wٗf Of UeI%n7xKIJ:CSdAK╙*3>ZAJoYY)FlAݕ/]fP> 9L#f ]3 RrQR8k|&xQT# i ١AVEXP 2 2aÝQ6|^UA0{:X NxB M`:0cudqS>8 RF]C kYas5ٗudWbAxE,ˠ j]eO6%.B ^M8()KsKBR`a^^J3vQỎ=(3p=,ŢC0H /O$.ZIQcL==|[Dth(J 0piWNVnFQY^ W(m9+R䓵C[pvMghQGEO)R֟uuv:0z+d,m=NF=r8kfJlYLyzf!rt#]{c5.pkчJH^s|2鮯7J;6ub`ټ}dkfәÞ:vWQ IENDB`gmchess-0.29.6.3/data/themes/wood/red_bishop.png000066400000000000000000000054231323660377300214120ustar00rootroot00000000000000PNG  IHDR99sPLTEJQ'Y'Q'a'h'a'a1h1h1h:p1x1p1p:x:a:Y:$a:$h:$DhD$D$M/aD:hM:pM:xM:hWDpWDpWOpaOpaZxaZxjZx}z}z::'1::DMMDDWWM$M$W$W/M:D$M/W$a/j/a$j/a:j:j:j:t:M/j$j/t/t/}/a:a:t:t:}:}:t$}/}:aDjDtDtOtD}DtO}O}OaD}D}D}Z:::Zdoz͇OԇO܇OŇZԇZ͑ZԑZܑZDDODDOZZZDOOZZԇdőd͑dŚo͚oܑdܚdܑoܚo͚zܚzdozܤzdodoodozzzo}ͭԤܭܷܷ뭄䭏ԷԚʤʤʯʯԤݤԯݯʺԺ"atRNSo1bKGD pHYsHHFk> vpAg998#f*IDATHǵ׋[p!aw-[Ӵ1ڀڄ Y2't 1A6mV}!2( ͽ@Ll{lWD];Mu۷>s o?/?/g6}SoKnox1ww-G[G3s\ 36m~O{jaᯟzȄdrEcJGONV;gR"״&lnL#:v#JA6wtH1~kQ^C+IYE5 2wo˓-]D"jdC7U~ÂlMf Z)؛Aq2 }` ϷttTsjLM2R{b9X?;ze kƦΦ:(Şhj /)Y} 9\z[ΨrTV4#H&Ψy# DDvq?<^ ET:6 vXF|kT<+Evz. &B Aj™Aۘnk>=1$$V*r j]uiucmqNnzEBBZP U*-߂lst-mMԞ$'T{Gh2|CJaP hmHi2\xŏ$W0+dv7c9؋0M Q El*iicC eGW1.XγN38 „HNx^xm*_\t+c"z#J2h#G>Yl,`Oe%]aq,+dEFFOIbr-z=Ol* (&DI_K>cч)w3庽lH!27 M) i./vZ6 WJrB/B/ 04m"*'vX}1^qmgw[[:76Ix{?kT%%P6 j)2\Rn!O?./}^!֖nߪtma+k{=VʼXǰ_ǿkۣ" vpAg998#f8IDATHǵ׋[pQ7l#Bc kC(4lJ: 4Z m rSfi)̹HuCV O e&Ε X};>;{uum a?n?O>r/,WGGG3}^"aY艮#^wRw.oӇ?ON]nF&I&7{Hކ~rm R j\UUu^Q|OP}OA׳ xl6&hPC}YԻ6T5jn^]Uj쑆2շw]߼ss}=L$$07dPr>Gzyz&$0Hc"c_}vx[02뺦`UQ0'"8+sR{dxʂ꬙5@eK\&`(Wv]ҪM5}D&zT,aNvI[QZ\ɐPLh"۞!o^ZXK+U5 NrÌC@w*!wJL9C\0/uTյw{^d[B)mMN/XOoKQ;]1N6m˟NjT~9"a!ږ4'UxYP%iP> m韜ΨR<1PXVڪ]EZ%0Ydž/UrΜ(M1!Ƴ Tf5Ԙ<@Ϡd%wgaOaΚ3lD^6h%vۑYvk:j"QBrOӖl SxF0S[I!IEVNk9CdgoEx*SV`Be!dMSS|ĉ(<0E%SU .6c!Be>{z$0YyNbv %dž N{ }0'=rJ"MO EH#C!o 9KVX Qs#HVCa('a"'CFSHԊ٬9/"j]XQDZ>q&vǯzA3|ZlS:+&KP-]ees, aGA->X-CE.(DY!ꮜ>.,0->W|8dbp 4S4zmQZ)Tca<ʢ((ln& *>"r[F:pQ^1HnGeQv)? B"\,8#>'mS幔;޼6[I1'HXHB hi;N )ї9 . ?}/ 6t ۽{N;?/ʢ??>ӘC|&@I4,"8l!r*HSL<#9%׳aXI 4; `)At-7k=rsԎfyG5;m~=DS)ܕrRˡr:.#V?Eص=,~qZ;Ot*dE>,|'-0IENDB`gmchess-0.29.6.3/data/themes/wood/red_king.png000066400000000000000000000054401323660377300210550ustar00rootroot00000000000000PNG  IHDR99sPLTEJQ'Y'Q'a'h'a'a1h1h1p1x1p1p:x:a:Y:$h:$a:/DhD$hD/M/aD:hM:pM:xM:hMDhWDpWDpaOpaZxjZxjox}z}z:'1:DMMMDW$W/W/M:M/W$W$a/a/a$j:j:t:M/W/j$a/j/t/t/t/a:j:t:t:}:t$}/}:aDjDjDtDtOtOtD}DtO}O}OaDjDjOjD}DtO}D:::Zdoz͇OԇO܇OŇZԇZ͑ZԑZܑZDDODDOZZZDOOZZԇdőd͑dőoܚdܑoܚoܚzddozԤzdodoodozzzz}ͭԤܭ뭄䭏ԷԚʤʤʯԤݤԯݯʺԺ1!^tRNS.&bKGD pHYsHHFk> vpAg998#f:IDATHǭ׏_p!;.~BQf أBҙʶȾ!2(l"9 s eŠ KnNu/ݻAG_?7b/^<Ͼ#1_Tߝ&1NyIٹ3׮B^:?}s ˛ƦQ,sKӞWly|v6/=,rK9Jo\2ivکO[/&3mBirŜIjx\P@QC=%g|aH̢麮iPEQ3E;ut95MmT4EḂgu6M-m04FJ`ƢH=u6zBN^[Iٓ00%a2Ra[!Ʈ-l>{ܸ:B>H'l^y}O$TGѫ2N;s?u 3K"duRm u,+^$*z,,-Y/R͝u+N)GlEǮRJ%Cm/=1&SO)'c{g*f5 y|#&gU ~Khb/m0\3̲MeSep?UTUUKK.AgjھtT%S b809MS 7L.%)DN)fJ2H]X&4M_䥞=i16S2MCӠP%"$|-.XYX4{:̺#vIh!m73"{YDWx'^efɪZu ,6a5 +뻧7=J,DayOb,ls_{ͧL<-&8 r½deq qxdXN{sq:g14E1 J 89hqit8CPi !89`%$:cYo\xw6^&br:-x78+-ŢaZ\dMFnoK*J2M-F:'>HڇipW}lmɌ0D'PHi>`l6~7;/EA'bRpò,Ha cc [) pҴ=$'A0XoN";U0K {'?/i!><|+4[ ü\9p7Y}5M$ Ipɀ Cipv]uRNtb:娂O-R<</qWEƃoQc׽r5ޭO5 lU>p09oQzs%ͯOtU}I;+vZ~FnVXg}(+VÞ:~˛0.NIENDB`gmchess-0.29.6.3/data/themes/wood/red_king_die.png000066400000000000000000000045751323660377300217060ustar00rootroot00000000000000PNG  IHDR99&KbKGD#2 pHYsHHFk> vpAg998#f IDATXý]\yߙY̙J[ɑdVd%kڽhL P0 E u/^% Z׭-ۊe*û;̙9j4$J89p8/R~-nX\s'2CBג} P_eId]&?m7ޕ;H1 hy}&!Pd*v__!%cЎ]/zt_﫨LԐd Whؒ"1Եew{bݜCb5Z*A]ULd'6%R ?Rt?(j*j11 LERZ#78K7Y1jue"~A)P+7tش.[30ԲeEj:v4uP[KCYܳ)Uf%Z-<=y964UsԎ zjrh\ڈ-mhi{7A+j"Ć֬aڶgPؓHe"dzzXr _0=UEUUMÔM"hY[Pd pg_^<=uGjYWB/f(kj8m e"%TTY-%n Խq{//*8$iFo+ #$X4eӂԌZW9n^i{lj7lر]{]CSS>iũ@xŌ Wq mc&ȷl:MpLUO7o \bɊ~%-}_=啢)d- G~vضkIg\Pľ-VV(,WE__bA*C6=>Uu$: d.t2?vIgJƏ7VSv|Oqu9$նਚZ{|1' eaX;7El/pʂeNX7(d¦E.? /`h-U[װ_v-gQOf2cr=YEjrXYi8Π/3@pςLɼUTAtPxx9 kaH[C]ZjrW$LTP:>MK!%ĺ2{ %pa<HO A괊 *0 Jx.]H u{enZ GA7NT/-uKqW"FP &EGa6+wPu՜qV7iϞʸ*>ߏ`ϳ=SY3VeH~bg?N޸ p %=%L`~HHRS۵eEX?CnbLّ "cyXnZ"|@>8RUuu*Q ~#jT ~ƺV\I_؝Pۮap mUS~B4OKtڴ]GG1gD- /H\J >vLlkS ^UZa^ٞܪ=uB ePjۍyY}Գ9YUkO+zbqUӋָ$Fs~b|9k2‚\uRM]˲ 1%=^opȌ+>y|bu405@WOàE]*x^.6͘]]})`b=m.sTdݮAsӠ>mlĚ̊|l J*p=]DjR:б+2C;Qq9[]![:%/hɭxSגYMS k^X34BPܓ M)Ÿg}IYKGӴ95^P_EhTMm' WeK_1X>V,jҔQW +Q!- SwAԒ'* ?W6"QR@=pPBIvB;nOG3HnW[ԝeMYLO )s"u3 uLĞE1Am Fwgs:rFM%\b([Gm!v7cu9z,YҴ+Bja;BKIӖV$6um:֧,qKkŪha}%U3̝?aGSi3Y$]CjmG.~EY%uFhT95XZQ-j-b^OEǶgf=BwC06,gvߐ[VւIENDB`gmchess-0.29.6.3/data/themes/wood/red_knight.png000066400000000000000000000054341323660377300214140ustar00rootroot00000000000000PNG  IHDR99sPLTEJQ'Y'Q'a'h'a'a1h1h1p1x1p1p:x:a:Y:$h:$a:/DhD$hD/M/aD:hM:pM:xM:hMDhWDpWDpaOpaZxjZxjox}z}z:'1:DMMMDW$W/W/M:D$M/W$W$a/a/a$j:j:j:t:W:j$j/t/t/t/a:a:j:t:}:t$}/}:aDjDjDtDtOtOtD}DtO}O}OaDjDjOjD}D}O}D:::Zdoz͇OԇO܇OŇZԇZ͑ZԑZܑZDDODDOZZDOOZZԇdődőoܑdܚdܑoܚoܚzddozܤzdodoodozzzo}ͭԤܭ뭄䭏ԷԚʤʤʯʯԤݤԯݯʺԺdo^tRNS.&bKGD pHYsHHFk> vpAg998#f6IDATHǭ[DžLBQ`'\L]B mѡe[d0G;?7bYeJ1U?Jrޑk5n'wVWK&_ʫyHRWU'[< rrvqtmt0 ](*_#5ԑGșhi٭[E*srE9DB+cK=1MSw,2T_"C՝]Gw"$~435hjy%{ܞh}jG$AK!:sMAt32 fz'ncu@oMU mbzٶa dGX`hƃ]l"}2{2K g|퇃mˉhX#_1_*I9PρDS7ـ =oHM-9#^ٶ [6 Jw<VoVEChԴ3&p;{e/@6SpU%p"N$8ì$gRIIi3ۆCycQ<&IFܷG54IlPG|_s4pEi4MR yohdz}h*Oy>벑`5O?ߐL+dٳ3'T 'ƊI0* 'eCcH)[DF|ES[΅ui 9Cz.@B&L1/BLf&hiYu;L@$ٰMo\aA/dG٦[a O9𴴜d pR`&l0454M_Px ֲ, P?g ֮$ꮫN=t|)#Y_f vOntYt0KȂ xW̭SX@/k\^'d#YvwT<ҼP3C3):C5x7˾M\"L4 )v,v\.~7/A$Kbr4aY,,.6H)E}[.Aː$e9 %9Z^h> d+, Hht/nIbz> ۇzry+9r7Y#ʪ}9CW$,t-y{p} K30IjyP쬧 VE/6'y/D>ue Wt{os[Qr/zwO5Gت*(y3B㏪/{[+l?š]ETiZaȱn(߽ݕ78oba}Bq܉?!{?۩=IENDB`gmchess-0.29.6.3/data/themes/wood/red_pawn.png000066400000000000000000000053641323660377300210770ustar00rootroot00000000000000PNG  IHDR99sPLTEJQ'Y'Q'a'h'a'a1h1h1p1x1p1p:x:a:Y:$h:$a:/DhD$hD/M/aD:hM:pM:xM:hMDhWDpWDpaOpaZxjZxjox}z}z:'1:DMMMDW$W/W/M:M/W$W$a/a/a$j:j:j:t:M/W/W:j$a/j/t/t/t/a:j:t:}:t$}/}:aDjDjDtDtOtOtD}DtO}O}OaDjDjO}DtO}D:::Zdoz͇OԇO܇OŇZԇZ͑ZԑZܑZDDODDOZZDOOZZԇdődőoܑdܚdܑoԚoܚzddoܤododoodozzzo}ͭԤܭܷ뭄䭏ԷԚʤʤʯʯԤݤԯݯʺԺ1D^tRNS.&bKGD pHYsHHFk> vpAg998#fIDATHǵ_DžL{Bq `ㄇG %.3ɰ $F\^2@L؃EXUHt\^ɺϹwι&U|϶S[W^}'_`ߝeߑ{33333sXoA\m?~[Sӳ3s+iFT/+o_޳ss@[.Ȫ @=/~ R]\Y5nj(ݔrFr*J[͞%9xbhȄtMdXI՘vsr>X}ŎKCXfIt]4!5CHaQ!+S44Q)L${S" a+S> ϱ,dY lEEȉۋ;;_il?Pn9qUGn^4?ץMtwEm$A)هIpGi, ݟ'VE3j#of $ni"^xC, [놡gX舦 #嫷fWLU6JRUcCZG/RaaE.Ri!װ._iu i03IyjRKe4xԠ4In+7ropbQeeT5W,*?l@  P?v|@@2Laq$Q\X*r^1F2rg}-5 EDI7IZM.8i3`ٽ ێ\A)4 4MR 7dr<} 0R4iËX4tS!ɢM^} Ex?Ơ\zۧ袌)>EQlUh"Ol޴)hoIWЀ,{ayK:吿 ƐAvs7ܸ[VS% T;Mo!!f4C~lI)C,?+%3|(].!{5#"jp\ X "_9pe8e؁!Vhso?nj9 N!q7挭_&?~P*ZvÒ%n? P.ukMe)*J.9shOn_p{ ЛB.EI6UK#5ԙ=2^EE$EyI.p0a BDc)>쮩.iY"aJt& ntY HL 'QT,%c#ry&OznK#.2̦˰ Qe&].W[:'&~6xFbw2rZ''/A@'7 KRZx, i4HrS{,aH¥FCr$ Jd$!yk N~YXVLjd$v8J%I穀"ɗv vpAg998#fIDATHǵ[Dž wX].BKk;1`Vm})o"G"P$sGnlh?mG@ <`s?>|9WDw >|%Y-Е˯;}Iu```p^:m{ao!F5,WZ[~H񉉉IحzZ'"nONO]\XȦ8enɩ/se9!1k-s:TG'.[)RK1!qqYk-%H*S 6*ra',*B4xY 8,554 d?\zNV>{xc1OjoHHd$>~zo?!^n1#I(R$ B$9khx]xG_nEUUE$I%Iލd3Mȑѻ(dJ+P K%1H GHuai/''fJ: 2UZHg3$Rn #K;ɦLVa^fs hC)COT>fcNz³ $Aȍ4/l cF-Tjɋ}@V@͏duM3̴⊒ѴF?[O)uslﲐI{<]u5B@_/be} '5N$N* @'ۆoe.1;_T݂ wȶx=On]UQmd7pn.$cͨ x\Dɇm@LHq[28 bHnj^K }[]iA6%²,\#ItӦf0U-DuwCU3T1{'1y.O^jkrBfdeqN V0y5A̳_k7ը%k=eOb@Rduuu sag7 ʜ'a[E9ʡgJM4KFC*dnG eU|{u"h{__S[TBnۙmPaa0cmSj>YjŴvNU"cXwGƖɀfHz4~<rvbK!1@ˌAytMB 0ep8qd,.T%tI⻽b8ာ0}K(L4 wT(B8sXui\4BOYE8X-lu.kfYۓ}hlHn/bYN7jx-舷q(:eyfoe/!"rCjv8Zз>Q:iPFVW>y PJճs|w*F~]Q(Ja! d=;/r7B]]w vpAg998#fMIDATH1 0?IB+!NhaSWQ>/glSKb@C:QoFk}{)j\6gRG8IENDB`gmchess-0.29.6.3/debian/000077500000000000000000000000001323660377300146365ustar00rootroot00000000000000gmchess-0.29.6.3/debian/changelog000066400000000000000000000135571323660377300165230ustar00rootroot00000000000000gmchess (0.29.6.3-1) unstable; urgency=medium * New release (2018-02-08). + Fix some crashes. + Various clean-ups. -- Boyuan Yang <073plan@gmail.com> Wed, 07 Feb 2018 17:43:11 +0800 gmchess (0.29.6.2-1) unstable; urgency=medium * New release (2018-01-29). + I18n and translation for preferences subpage. + Various clean-ups. * d/control: Update homepage field and package descriptions. * d/rules: Remove generation of xpm icons, prefer png icons. * d/rules: Add "dh_missing --fail-missing". * d/copyright: Update information. -- Boyuan Yang <073plan@gmail.com> Mon, 29 Jan 2018 20:17:39 +0800 gmchess (0.29.6.1-1) unstable; urgency=medium * New release (2018-01-25). + Developing under Debian Salsa platform as upstream already dead. + Complete zh_CN translation. + Various clean-up and bugfixes. * Drop dependency against libglademm, no longer used. * Bump Standards-Version to 4.1.3. * Bump debhelper compat version to v11. * d/menu: File already dropped, thus closes: #776771. * d/control: Remove homepage field, upstream already dead. * d/control: Add Vcs fields. * d/patches: Remove all patches, we are acting as the de fecto upstream. * d/copyright: Rewrite in machine-readable format. * d/watch: Removed, upstream dead. * d/rules: Modernize usage of dh sequencer. -- Boyuan Yang <073plan@gmail.com> Thu, 25 Jan 2018 23:36:13 +0800 gmchess (0.29.6-3) unstable; urgency=medium * Team Upload. * Add myself into uploaders list. * Ack previous NMU. Thanks Adrian! * Drop debian/menu file (should not coexist with desktop file). * Bump debhelper compat to v10. + Drop dep autotools-dev, not needed. * Update Standards-Version to 4.1.0. * Add patch to fix FTBFS with gcc-7. Closes: #853423 -- Boyuan Yang <073plan@gmail.com> Wed, 23 Aug 2017 14:06:43 +0800 gmchess (0.29.6-2.1) unstable; urgency=medium * Non-maintainer upload. * autoreconf to fix FTBFS on arm64. (Closes: #727872) -- Adrian Bunk Sat, 04 Mar 2017 17:39:45 +0200 gmchess (0.29.6-2) unstable; urgency=low * Fix build on kfreebsd-* -- Aron Xu Sun, 01 Jan 2012 23:49:28 +0800 gmchess (0.29.6-1) unstable; urgency=low * New upstream release. -- Aron Xu Sun, 25 Dec 2011 21:10:37 +0800 gmchess (0.29.4-1) unstable; urgency=low * New upstream release. * Move to Debian Chinese Team. -- Aron Xu Fri, 21 Oct 2011 23:32:08 +0800 gmchess (0.29.3-5) unstable; urgency=low * Fix FTBFS by modifying debian/rules (Closes: #638351). -- Aron Xu Fri, 19 Aug 2011 10:52:04 +0800 gmchess (0.29.3-4) unstable; urgency=low * Use my @debian.org address. * Use dh compat 8. * Enable -O3 by default, now build on ia64. while LTO only success when gold is present, not enabling. * Use new dh rules.tiny style. * Add a patch to workaround FTBFS -- Aron Xu Fri, 19 Aug 2011 01:21:44 +0800 gmchess (0.29.3-3) unstable; urgency=low * debian/control: - Remove useless ${shlibs:Depends}. + Bump std-ver: 3.9.2. * debian/libeval0-dev.install: - Wipe out dependency_libs from .la files, per Policy 10.2 (Closes: #621278). * debian/clean: - Remove useless gmchess.desktop during clean. -- Aron Xu Sat, 09 Apr 2011 14:42:01 +0800 gmchess (0.29.3-2) unstable; urgency=low * debian/control: + Correct Conflicts and Provides for libeval0-dev. * debian/clean: + Add ./output to remove it. * debian/patches: - Remove debian-changes caused by the build-time ./output file. -- Aron Xu Fri, 18 Feb 2011 22:00:00 +0800 gmchess (0.29.3-1) unstable; urgency=low * New upstream release. * debian/patch/0001-fix-the-warning-from-cppcheck.patch: - Upstream patch to fix warnings from cppcheck. -- Aron Xu Fri, 03 Dec 2010 19:24:21 +0800 gmchess (0.29.2-1) unstable; urgency=low * New upstream release: Search libeval0.so.0 instead of libeval0.so. -- Aron Xu Mon, 04 Oct 2010 19:04:43 +0800 gmchess (0.29.1-1) unstable; urgency=low * New upstream release: Add network game support. * debian/control: Bump std-ver to 3.9.1; Remove duplicate section info from binaries: gmchess, eleeye. -- Aron Xu Sun, 19 Sep 2010 18:34:12 +0800 gmchess (0.20.6-1) unstable; urgency=low * New upstream release. * debian/control: Change section of eleeye from comm to games, Raise Standards-Version from 3.8.3 to 3.8.4. * debian/source/format: using `3.0 (quilt)' format. -- Aron Xu Tue, 06 Apr 2010 18:43:48 +0800 gmchess (0.20.4-2) unstable; urgency=low * Correct location of eleeye_engine and convert_png. -- Aron Xu Mon, 14 Dec 2009 15:14:56 +0800 gmchess (0.20.4-1) unstable; urgency=low * New upstream release. -- Aron Xu Tue, 08 Dec 2009 13:38:13 +0800 gmchess (0.20.3-2) unstable; urgency=low * Add src/engine/mips.h to debian/copyrigh * Add "Replaces" section for convert-pgn, eleeye, libeval0 (closes: bug#550696). -- Aron Xu Mon, 12 Oct 2009 19:07:30 +0800 gmchess (0.20.3-1) unstable; urgency=low * New upstream release. * Split gmchess into separate packages. * Solve cross platform issue (closes: bug#544757). -- Aron Xu Fri, 9 Oct 2009 22:05:33 +0800 gmchess (0.20.2-3) unstable; urgency=low * Added menu items. (closes: bug#544510) -- Aron Xu Tue, 1 Sep 2009 21:50:25 +0800 gmchess (0.20.2-2) unstable; urgency=low * Fixed locale path. -- Aron Xu Sat, 22 Aug 2009 22:27:25 +0800 gmchess (0.20.2-1) unstable; urgency=low * Initial release (closes: bug#527040) -- Aron Xu Sat, 22 Aug 2009 21:40:25 +0800 gmchess-0.29.6.3/debian/clean000066400000000000000000000000251323660377300156400ustar00rootroot00000000000000data/gmchess.desktop gmchess-0.29.6.3/debian/compat000066400000000000000000000000031323660377300160350ustar00rootroot0000000000000011 gmchess-0.29.6.3/debian/control000066400000000000000000000055671323660377300162560ustar00rootroot00000000000000Source: gmchess Section: games Priority: optional Maintainer: Debian Chinese Team Uploaders: Aron Xu , Boyuan Yang <073plan@gmail.com>, Build-Depends: debhelper (>= 11), gettext, imagemagick, intltool, libglib2.0-dev, libgtkmm-2.4-dev, libtool, libxml2, perl, Standards-Version: 4.1.3 Homepage: https://github.com/lerosua/gmchess Vcs-Git: https://salsa.debian.org/chinese-team/gmchess.git Vcs-Browser: https://salsa.debian.org/chinese-team/gmchess.git Package: convert-pgn Section: utils Architecture: any Replaces: gmchess (<< 0.20.3-2), Depends: ${misc:Depends}, ${shlibs:Depends}, Description: chess book format converter Convert format of given chess book from one format to PGN, the Portable Game Notation format. . PGN is an XML-like computer-processible format for recording chess games (both the moves and related data). . Supported source chess book formats: ccm, che, chn, mxq, xqf Package: eleeye Architecture: any Replaces: gmchess (<< 0.20.3-2), Depends: libeval0, ${misc:Depends}, ${shlibs:Depends}, Description: Chinese Chess (Xiangqi) engine elephant eye (eleeye) is a Chinese chess (Xiangqi) engine providing a set of functions for developing Xiangqi games using the Universal Chess Interface, which is an open communication protocol that enables a chess program engine to communicate with its user interface. . Chinese chess (Xiangqi) is one of the most popular chess games to have originated in China. Package: gmchess Architecture: any Depends: convert-pgn, eleeye, ${misc:Depends}, ${shlibs:Depends}, Description: Chinese Chess (Xiangqi) game gmchess enables you to play Chinese chess (Xiangqi) against a human opponent or the computer, read many chess manuals and improve your skills. . Chinese chess (Xiangqi) is one of the most popular chess games to have originated in China. Package: libeval0 Section: libs Architecture: any Replaces: gmchess (<< 0.20.3-1), Depends: ${misc:Depends}, ${shlibs:Depends}, Description: support library for eleeye elephant eye (eleeye) is a Chinese chess (Xiangqi) engine providing a set of functions for developing Xiangqi games. . This package provide library that eleeye engine used to keep algorithm's balance. . Chinese chess (Xiangqi) is one of the most popular chess games to have originated in China. Package: libeval0-dev Section: libdevel Architecture: any Provides: libeval-dev, Conflicts: libeval-dev, Depends: libeval0 (= ${binary:Version}), ${misc:Depends}, Description: support library for eleeye - development file elephant eye (eleeye) is a Chinese chess (Xiangqi) engine providing a set of functions for developing Xiangqi games. . This package provide development file for library that eleeye engine used to keep algorithm's balance. . Chinese chess (Xiangqi) is one of the most popular chess games to have originated in China. gmchess-0.29.6.3/debian/convert-pgn.install000066400000000000000000000000771323660377300204740ustar00rootroot00000000000000usr/games/convert_pgn usr/bin/ usr/share/man/man6/convert_pgn* gmchess-0.29.6.3/debian/copyright000066400000000000000000000063671323660377300166050ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: GMChess Source: https://salsa.debian.org/chinese-team/gmchess Files: * Copyright: 2009-2012 lerosua 2009-2012 xihes 2018 Boyuan Yang <073plan@gmail.com> License: GPL-2+ Comments: An inactive upstream can be found at GitHub: https://github.com/lerosua/gmchess . Files: debian/* Copyright: 2009, Aron Xu 2018, Boyuan Yang <073plan@gmail.com> License: GPL-2+ Files: data/gmchess.png Copyright: 2009 TG License: GPL-2+ Files: data/p1.png data/p2.png Copyright: 2009 李祥 License: GPL-2+ Files: data/book.dat data/themes/wood/* data/sound/* src/engine/* Copyright: 2008, 黄晨 License: LGPL-2.1 Files: src/engine/mips.h Copyright: 2009 HjjHjj License: GPL-3+ License: LGPL-2.1 This package is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation and appearing in the file LICENSE.LGPL included in the packaging of this file. . This package 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, see . On Debian systems, the complete text of the GNU General Lesser Public License version 32.1 can be found in "/usr/share/common-licenses/LGPL-2.1". License: GPL-2+ This package 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 package 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, see . On Debian systems, the complete text of the GNU General Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". License: GPL-3+ This package 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 3 of the License, or (at your option) any later version. . This package 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, see . On Debian systems, the complete text of the GNU General Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". gmchess-0.29.6.3/debian/dirs000066400000000000000000000001101323660377300155120ustar00rootroot00000000000000usr usr/share usr/share/pixmaps usr/share/icons usr/share/icons/hicolor gmchess-0.29.6.3/debian/docs000066400000000000000000000000141323660377300155040ustar00rootroot00000000000000NEWS README gmchess-0.29.6.3/debian/eleeye.install000066400000000000000000000000721323660377300174750ustar00rootroot00000000000000usr/games/eleeye_engine usr/share/man/man6/eleeye_engine* gmchess-0.29.6.3/debian/gmchess.install000066400000000000000000000002241323660377300176550ustar00rootroot00000000000000usr/games/gmchess usr/share/applications/* usr/share/gmchess/* usr/share/locale/* usr/share/man/man6/gmchess* usr/share/pixmaps/* usr/share/icons/* gmchess-0.29.6.3/debian/libeval0-dev.install000066400000000000000000000000431323660377300204750ustar00rootroot00000000000000usr/lib/*/*.a usr/lib/*/libeval.so gmchess-0.29.6.3/debian/libeval0.install000066400000000000000000000000301323660377300177150ustar00rootroot00000000000000usr/lib/*/libeval.so.0* gmchess-0.29.6.3/debian/rules000077500000000000000000000015221323660377300157160ustar00rootroot00000000000000#!/usr/bin/make -f # -*- makefile -*- # Uncomment this to turn on verbose mode. # export DH_VERBOSE=1 # see FEATURE AREAS in dpkg-buildflags(1) export DEB_BUILD_MAINT_OPTIONS = hardening=+all export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed TMPDIR=debian/tmp %: dh $@ override_dh_auto_configure: dh_auto_configure -- \ --prefix=/usr \ --bindir=/usr/games \ --datarootdir=/usr/share override_dh_auto_install: dh_auto_install find debian/ -name '*.la' -delete for size in 16 24 32 48; do \ mkdir -p $(TMPDIR)/usr/share/icons/hicolor/$${size}x$${size}/apps || exit 1; \ convert $(CURDIR)/data/gmchess.png -resize $${size} \ $(TMPDIR)/usr/share/icons/hicolor/$${size}x$${size}/apps/gmchess.png || exit 1; \ done rm -f $(TMPDIR)/usr/share/man/man6/*.6.6.gz override_dh_missing: dh_missing --fail-missing gmchess-0.29.6.3/debian/source/000077500000000000000000000000001323660377300161365ustar00rootroot00000000000000gmchess-0.29.6.3/debian/source/format000066400000000000000000000000141323660377300173440ustar00rootroot000000000000003.0 (quilt) gmchess-0.29.6.3/debian/upstream/000077500000000000000000000000001323660377300164765ustar00rootroot00000000000000gmchess-0.29.6.3/debian/upstream/metadata000066400000000000000000000002561323660377300202040ustar00rootroot00000000000000--- Repository: https://github.com/lerosua/gmchess.git Repository-Browse: https://github.com/lerosua/gmchess Bug-Submit: https://salsa.debian.org/chinese-team/gmchess/issues gmchess-0.29.6.3/doc/000077500000000000000000000000001323660377300141615ustar00rootroot00000000000000gmchess-0.29.6.3/doc/Makefile.am000066400000000000000000000002051323660377300162120ustar00rootroot00000000000000man_MANS=gmchess.6 convert_pgn.6 eleeye_engine.6 EXTRA_DIST= \ gmchess.6.in \ convert_pgn.6.in \ eleeye_engine.6.in gmchess-0.29.6.3/doc/convert_pgn.6.in000066400000000000000000000020741323660377300172040ustar00rootroot00000000000000.TH convert_pgn 6 "16 july 2009" "" "" .RE .RE .PP .SH NAME \fBconvert_pgn \fP- Convert format of given chess book from one format to another \fB .RE \fB .SH SYNOPSIS .nf .fam C \fBconvert_pgn\fP \fIinput-file\fP [\fIoutput-file\fP] .fam T .fi .fam T .fi .SH DESCRIPTION The \fBconvert_pgn\fP program converts the format of characters in \fIinput-file\fP, from one formatted character set to another. The result is written to default file "/tmp/gmchess.pgn" unless otherwise specified by the \fIoutput-file\fP option. .RE .PP .SH FORMATS The following table lists the formats supported by \fBconvert_pgn\fP: .IP \(bu 3 ccm .IP \(bu 3 che .IP \(bu 3 chn .IP \(bu 3 mxq .IP \(bu 3 xqf .RE .PP .SH AUTHOR Written by wind , lerosua . MANUAL by Vern Sun .RE .PP .SH RESOURCES Main website: .br Debian source code repository: https://salsa.debian.org/chinese-team/gmchess .RE .PP .SH COPYING Free use of this software is granted under the terms of the GNU General Public License (GPL). .PP gmchess-0.29.6.3/doc/eleeye_engine.6.in000066400000000000000000000036501323660377300174560ustar00rootroot00000000000000.TH eleeye_engine 6 "16 July 2009" "" "" .RS .RE .RE .PP .SH NAME \fBeleeye_engine \fP- a chess program engine to communicate with its user interface \fB .RE \fB .SH SYNOPSIS .nf .fam C eleeye_engine is a command-line client for UCCI (based on \fIUCI\fP) protocol. It provides full support of basic \fIUCI\fP \fIcommand\fP, such as \fIposition\fP, \fIgo\fP, banmoves or bestmove and much more. .fam T .fi .fam T .fi .SH DESCRIPTION The Universal Chess Interface (\fIUCI\fP) is an open communication protocol that enables a chess program engine to communicate with its user interface. .PP It was designed and released by Rudolf Huber and Stefan Meyer-Kahlen, the author of Shredder, in November 2000, and can be seen as a rival to the older XBoard/WinBoard Communication protocol. Like the latter, it is free to use without license fees. .PP Customarily, \fIUCI\fP assigns some tasks to the user interface that have traditionally been handled by the engine itself. Most notably, the opening book is usually expected to be handled by the interface, by simply selecting moves to play until it is out of book, and only then starting up the engine for calculation in the resulting \fIposition\fP. (\fIUCI\fP does not specify any on-disk format for the opening book; different UIs -- user interfaces -- usually have their own, proprietary formats.) Also, the user interface may handle endgame tablebases if the engine does not support it itself, although this is often better handled in the engine, as having tablebase information can be useful to consider a possible future \fIposition\fP. .RE .PP .SH AUTHOR Written by www.elephantbase.net .RE .PP .SH RESOURCES Universal Chess Interface Protocol: .PP Universal Chinese Chess Interface Protocol: .SH COPYING Free use of this software is granted under the terms of the GNU General Public License (GPL). gmchess-0.29.6.3/doc/gmchess.6.in000066400000000000000000000013751323660377300163140ustar00rootroot00000000000000.TH GMCHESS 6 "8 February 2018" "gmchess 0.29.6.3" .RS .RE .RE .PP .SH NAME \fBgmchess \fP- a Chinese Chess game \fB .RE \fB .SH SYNOPSIS .nf .fam C \fBgmchess\fP .fam T .fi .fam T .fi .SH DESCRIPTION \fBgmchess\fP is a game of traditional Chinese chess. While AI isn't wonderful, it provides a challenging enough game to all but the most skilled players. .RE .PP .SH USAGE \fBgmchess\fP .RE .PP .SH AUTHOR Written by wind and lerosua . .RE .PP .SH RESOURCES Placeholder GitHub repository: https://github.com/lerosua/gmchess .br Debian source code repository: https://salsa.debian.org/chinese-team/gmchess .RE .PP .SH COPYING Free use of this software is granted under the terms of the GNU General Public License (GPL). gmchess-0.29.6.3/intltool-extract.in000066400000000000000000000000001323660377300172460ustar00rootroot00000000000000gmchess-0.29.6.3/intltool-merge.in000066400000000000000000000000001323660377300166730ustar00rootroot00000000000000gmchess-0.29.6.3/intltool-update.in000066400000000000000000000000001323660377300170560ustar00rootroot00000000000000gmchess-0.29.6.3/m4/000077500000000000000000000000001323660377300137345ustar00rootroot00000000000000gmchess-0.29.6.3/m4/.placeholder000066400000000000000000000000001323660377300162050ustar00rootroot00000000000000gmchess-0.29.6.3/po/000077500000000000000000000000001323660377300140325ustar00rootroot00000000000000gmchess-0.29.6.3/po/ChangeLog000066400000000000000000000000001323660377300155720ustar00rootroot00000000000000gmchess-0.29.6.3/po/LINGUAS000066400000000000000000000000741323660377300150600ustar00rootroot00000000000000# please keep this list sorted alphabetically # en ru zh_CN gmchess-0.29.6.3/po/Makefile.in.in000066400000000000000000000153771323660377300165210ustar00rootroot00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ DATADIRNAME = @DATADIRNAME@ itlocaledir = $(prefix)/$(DATADIRNAME)/locale subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(MSGFMT) -o $@ $< .po.gmo: file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmchess-0.29.6.3/po/POTFILES.in000066400000000000000000000001421323660377300156040ustar00rootroot00000000000000src/MainWindow.cc src/Board.cc src/Engine.cc src/Pgnfile.cc data/gmchess.glade data/confwin.glade gmchess-0.29.6.3/po/POTFILES.skip000066400000000000000000000001721323660377300161470ustar00rootroot00000000000000data/gmchess.desktop.in src/BookView.cc data/confwin.glade .pc/0001-fix-the-warning-from-cppcheck.patch/src/MainWindow.cc gmchess-0.29.6.3/po/en.po000066400000000000000000000231271323660377300150010ustar00rootroot00000000000000# US English translations for gmchess package. # Copyright (C) 2009 THE gmchess'S COPYRIGHT HOLDER # This file is distributed under the same license as the gmchess package. # , 2009. # , 2009. # msgid "" msgstr "" "Project-Id-Version: gmchess 0.20.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-29 20:47+0800\n" "PO-Revision-Date: 2009-10-09 19:21+0700\n" "Last-Translator: Graham Breed \n" "Language-Team: English\n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/MainWindow.cc:115 #, fuzzy msgid "GMChess" msgstr "chess" #: ../src/MainWindow.cc:132 msgid "Turn" msgstr "" #: ../src/MainWindow.cc:134 msgid "Move" msgstr "" #. File menu: #: ../src/MainWindow.cc:399 msgid "_File" msgstr "_File" #: ../src/MainWindow.cc:401 msgid "Open file" msgstr "_Open file" #: ../src/MainWindow.cc:402 msgid "Open chessman File" msgstr "Open _Chessman file" #: ../src/MainWindow.cc:405 msgid "Save as" msgstr "Save _As" #: ../src/MainWindow.cc:406 msgid "Save as a chess pgn file" msgstr "Save game as a _PGN file" #: ../src/MainWindow.cc:409 #, fuzzy msgid "Save Board" msgstr "Save _As" #: ../src/MainWindow.cc:410 #, fuzzy msgid "Save board to a png file" msgstr "Save game as a _PGN file" #. View menu: #: ../src/MainWindow.cc:418 msgid "_View" msgstr "_View" #. Game menu: #: ../src/MainWindow.cc:425 msgid "_Game" msgstr "_Game" #: ../src/MainWindow.cc:426 msgid "_Fight to AI" msgstr "_Computer opponent" #: ../src/MainWindow.cc:428 msgid "Free Play" msgstr "_Human opponent" #: ../src/MainWindow.cc:430 msgid "_Switch colour" msgstr "_Switch colour" #. Help menu: #: ../src/MainWindow.cc:433 msgid "_Help" msgstr "_Help" #: ../src/MainWindow.cc:457 msgid "Save File" msgstr "Save file" #: ../src/MainWindow.cc:547 msgid "Choose File" msgstr "Choose file" #: ../src/MainWindow.cc:590 msgid "All Files" msgstr "All Files" #: ../src/MainWindow.cc:606 msgid "AI Warn" msgstr "AI warn" #: ../src/MainWindow.cc:609 #, fuzzy msgid "Open book view will close the AI game. Are you sure?" msgstr "Opening book view will close the game. Are you sure?" #: ../src/MainWindow.cc:653 msgid "the file maybe not right format for chess" msgstr "File format not recognized" #: ../src/MainWindow.cc:700 ../src/MainWindow.cc:1103 ../src/MainWindow.cc:1123 #: ../src/MainWindow.cc:1135 msgid "Warning" msgstr "Warning" #: ../src/MainWindow.cc:703 msgid "Are you sure to close the network game?" msgstr "" #: ../src/MainWindow.cc:758 msgid "Function not implemented yet" msgstr "" #: ../src/MainWindow.cc:777 #, fuzzy msgid "GMChess is a Chinese chess game written in gtkmm." msgstr "GMChess is a Chinese chess game written by gtkmm" #: ../src/MainWindow.cc:779 msgid "" "This program is licensed under GNU General Public Licence (GPL) version 2." msgstr "" "This program is licensed under the GNU General Public Licence (GPL) version " "2." #: ../src/MainWindow.cc:798 msgid "Black" msgstr "Black" #: ../src/MainWindow.cc:801 msgid "Red" msgstr "Red" #: ../src/MainWindow.cc:864 msgid "Game: " msgstr "Game: " #: ../src/MainWindow.cc:865 msgid "Time: " msgstr "Time: " #: ../src/MainWindow.cc:866 msgid "Site: " msgstr "Site: " #: ../src/MainWindow.cc:867 msgid "Result: " msgstr "Result: " #: ../src/MainWindow.cc:868 msgid "Opening: " msgstr "Opening: " #: ../src/MainWindow.cc:869 msgid "Variation: " msgstr "Variation: " #: ../src/MainWindow.cc:945 ../src/MainWindow.cc:992 msgid "new game" msgstr "New game" #: ../src/MainWindow.cc:948 ../src/MainWindow.cc:995 #, fuzzy msgid "Will you start a new game?" msgstr "Start a new game?" #: ../src/MainWindow.cc:970 ../src/MainWindow.cc:1017 ../src/MainWindow.cc:1071 #: ../data/gmchess.glade.h:33 msgid "Information" msgstr "Information" #: ../src/MainWindow.cc:971 msgid "You are play online, Please end this game first!" msgstr "" #: ../src/MainWindow.cc:1018 msgid "You are playing online, Please end this game first!" msgstr "" #: ../src/MainWindow.cc:1034 ../src/MainWindow.cc:1062 msgid "be lose" msgstr "" #: ../src/MainWindow.cc:1037 ../src/MainWindow.cc:1065 #, fuzzy msgid "Will you resign in this game?" msgstr "End this game?" #: ../src/MainWindow.cc:1072 msgid "You lose the game!" msgstr "" #: ../src/MainWindow.cc:1104 #, fuzzy msgid "" "You may only take a back move when it's your turn. Please wait a minute!" msgstr "You can only take back a move on your turn!" #: ../src/MainWindow.cc:1124 ../src/MainWindow.cc:1136 #, fuzzy msgid "" "You can only take a back move when it's your turn. Please wait a minute!" msgstr "You can only take back a move on your turn!" #. robot win #: ../src/MainWindow.cc:1151 #, fuzzy msgid "" "You Lose!\n" "Do you want to start a new game?" msgstr "" "You lost! \n" " Do you want to start a new game?" #. robot lose #: ../src/MainWindow.cc:1156 #, fuzzy msgid "" "Congratuations, YOU WIN!\n" "To start a new game, click OK" msgstr "" "Congratulations! YOU WON!\n" " Click OK to start a new game" #. robot want to draw #: ../src/MainWindow.cc:1161 msgid "Draw Game!" msgstr "" #. robot overload time,lose #: ../src/MainWindow.cc:1165 msgid "The opponent used up their time. You Win!" msgstr "" #: ../src/MainWindow.cc:1169 msgid "You used up your time. You Lose!" msgstr "" #: ../src/MainWindow.cc:1175 #, fuzzy msgid "Game Over" msgstr "Game: " #: ../data/gmchess.glade.h:1 msgid "chess" msgstr "chess" #: ../data/gmchess.glade.h:2 ../data/confwin.glade.h:21 msgid " " msgstr " " #: ../data/gmchess.glade.h:3 msgid "nickname:" msgstr "name: " #: ../data/gmchess.glade.h:4 msgid " Computer " msgstr " Computer " #: ../data/gmchess.glade.h:5 msgid "step time: " msgstr "step time: " #: ../data/gmchess.glade.h:6 msgid "play time: " msgstr "play time: " #: ../data/gmchess.glade.h:7 msgid " " msgstr " " #: ../data/gmchess.glade.h:8 msgid "nickname: " msgstr "name: " #: ../data/gmchess.glade.h:9 msgid " Human " msgstr " Human " #: ../data/gmchess.glade.h:10 msgid "1" msgstr "1" #: ../data/gmchess.glade.h:11 msgid "2" msgstr "2" #: ../data/gmchess.glade.h:12 msgid "3" msgstr "3" #: ../data/gmchess.glade.h:13 msgid "4" msgstr "4" #: ../data/gmchess.glade.h:14 msgid "5" msgstr "5" #: ../data/gmchess.glade.h:15 msgid "6" msgstr "6" #: ../data/gmchess.glade.h:16 msgid "7" msgstr "7" #: ../data/gmchess.glade.h:17 msgid "8" msgstr "8" #: ../data/gmchess.glade.h:18 msgid "9" msgstr "9" #: ../data/gmchess.glade.h:19 msgid "Start" msgstr "Start" #: ../data/gmchess.glade.h:20 #, fuzzy msgid "begin a new game" msgstr "New game" #: ../data/gmchess.glade.h:21 msgid "Lost" msgstr "Resign" #: ../data/gmchess.glade.h:22 msgid "Draw" msgstr "Draw" #: ../data/gmchess.glade.h:23 msgid "Rue" msgstr "Take back" #: ../data/gmchess.glade.h:24 msgid "nine" msgstr "9" #: ../data/gmchess.glade.h:25 msgid "eight" msgstr "8" #: ../data/gmchess.glade.h:26 msgid "seven" msgstr "7" #: ../data/gmchess.glade.h:27 msgid "six" msgstr "6" #: ../data/gmchess.glade.h:28 msgid "five" msgstr "5" #: ../data/gmchess.glade.h:29 msgid "four" msgstr "4" #: ../data/gmchess.glade.h:30 msgid "three" msgstr "3" #: ../data/gmchess.glade.h:31 msgid "two" msgstr "2" #: ../data/gmchess.glade.h:32 msgid "one" msgstr "1" #: ../data/gmchess.glade.h:34 msgid "start game with state" msgstr "" #: ../data/gmchess.glade.h:35 msgid "first station" msgstr "first station" #: ../data/gmchess.glade.h:36 msgid "preview move" msgstr "preview move" #: ../data/gmchess.glade.h:37 msgid "next move" msgstr "next move" #: ../data/gmchess.glade.h:38 msgid "last move" msgstr "previous move" #: ../data/gmchess.glade.h:39 msgid "Comment" msgstr "Comment" #: ../data/gmchess.glade.h:40 msgid "Board Information" msgstr "Board Information" #: ../data/gmchess.glade.h:41 msgid "Book" msgstr "Book" #: ../data/gmchess.glade.h:42 ../data/confwin.glade.h:6 #, fuzzy msgid " " msgstr " " #: ../data/gmchess.glade.h:43 msgid "Engine status" msgstr "Engine status" #: ../data/gmchess.glade.h:44 msgid "Engine" msgstr "Engine" #: ../data/confwin.glade.h:1 #, fuzzy msgid "Size of Board\n" msgstr "Save _As" #: ../data/confwin.glade.h:3 msgid "small board" msgstr "" #: ../data/confwin.glade.h:4 msgid "big board" msgstr "" #: ../data/confwin.glade.h:5 msgid "themes" msgstr "" #: ../data/confwin.glade.h:7 msgid "trace line color" msgstr "" #: ../data/confwin.glade.h:8 #, fuzzy msgid "Aspect" msgstr "Comment" #: ../data/confwin.glade.h:9 #, fuzzy msgid "select Engine" msgstr "Engine" #: ../data/confwin.glade.h:10 msgid "default is eleeye_engine" msgstr "" #: ../data/confwin.glade.h:11 msgid "eleeye_engine" msgstr "" #: ../data/confwin.glade.h:12 msgid "use open book" msgstr "" #: ../data/confwin.glade.h:13 msgid "Search Depth" msgstr "" #: ../data/confwin.glade.h:14 #, fuzzy msgid "step time:" msgstr "step time: " #: ../data/confwin.glade.h:15 msgid "240" msgstr "" #: ../data/confwin.glade.h:16 msgid "sec" msgstr "" #: ../data/confwin.glade.h:17 #, fuzzy msgid "play time:" msgstr "play time: " #: ../data/confwin.glade.h:18 #, fuzzy msgid "40" msgstr "4" #: ../data/confwin.glade.h:19 msgid "min" msgstr "" #: ../data/confwin.glade.h:20 #, fuzzy msgid "Engine" msgstr "Engine status" #~ msgid "bout" #~ msgstr "Turn" #~ msgid "step" #~ msgstr "Move" #, fuzzy #~ msgid "Only rue game when you are going,so wait a minute!" #~ msgstr "You can only take back a move on your turn!" #~ msgid "Game End" #~ msgstr "Game Over " #~ msgid "hui" #~ msgstr "悔棋" #~ msgid "huo" #~ msgstr "和棋" #~ msgid "end game" #~ msgstr "End game" #~ msgid "Computer want to draw with you, are you agree?" #~ msgstr "The computer offers a draw. Do you agree?" gmchess-0.29.6.3/po/ru.po000066400000000000000000000261721323660377300150300ustar00rootroot00000000000000# US English translations for gmchess package. # Copyright (C) 2009 THE gmchess'S COPYRIGHT HOLDER # This file is distributed under the same license as the gmchess package. # , 2009. # , 2009. # Graham Breed , 2010. # msgid "" msgstr "" "Project-Id-Version: gmchess 0.20.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-29 20:47+0800\n" "PO-Revision-Date: 2010-10-23 23:05+0300\n" "Last-Translator: Sadovnikov Dmitry \n" "Language-Team: English\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/MainWindow.cc:115 #, fuzzy msgid "GMChess" msgstr "шахматы" #: ../src/MainWindow.cc:132 msgid "Turn" msgstr "" #: ../src/MainWindow.cc:134 msgid "Move" msgstr "" #. File menu: #: ../src/MainWindow.cc:399 msgid "_File" msgstr "_Файл" #: ../src/MainWindow.cc:401 msgid "Open file" msgstr "_Открыть файл" #: ../src/MainWindow.cc:402 msgid "Open chessman File" msgstr "Открыть шахматный файл" #: ../src/MainWindow.cc:405 msgid "Save as" msgstr "_Сохранить как" #: ../src/MainWindow.cc:406 msgid "Save as a chess pgn file" msgstr "Сохранить в шахматном файле pgn" #: ../src/MainWindow.cc:409 #, fuzzy msgid "Save Board" msgstr "_Сохранить как" #: ../src/MainWindow.cc:410 #, fuzzy msgid "Save board to a png file" msgstr "Сохранить в шахматном файле pgn" #. View menu: #: ../src/MainWindow.cc:418 msgid "_View" msgstr "_Вид" #. Game menu: #: ../src/MainWindow.cc:425 msgid "_Game" msgstr "_Игра" #: ../src/MainWindow.cc:426 msgid "_Fight to AI" msgstr "Игра с _компьютером" #: ../src/MainWindow.cc:428 msgid "Free Play" msgstr "Игра с _человеком" #: ../src/MainWindow.cc:430 msgid "_Switch colour" msgstr "" #. Help menu: #: ../src/MainWindow.cc:433 msgid "_Help" msgstr "_Помощь" #: ../src/MainWindow.cc:457 msgid "Save File" msgstr "Сохранить файл" #: ../src/MainWindow.cc:547 msgid "Choose File" msgstr "Выбрать файл" #: ../src/MainWindow.cc:590 msgid "All Files" msgstr "Все файлы" #: ../src/MainWindow.cc:606 msgid "AI Warn" msgstr "Предупреждение ИИ" #: ../src/MainWindow.cc:609 #, fuzzy msgid "Open book view will close the AI game. Are you sure?" msgstr "Открытие книги дебютов закончит игру с ИИ. Уверены?" #: ../src/MainWindow.cc:653 msgid "the file maybe not right format for chess" msgstr "Неизвестный формат" #: ../src/MainWindow.cc:700 ../src/MainWindow.cc:1103 ../src/MainWindow.cc:1123 #: ../src/MainWindow.cc:1135 msgid "Warning" msgstr "Внимание" #: ../src/MainWindow.cc:703 msgid "Are you sure to close the network game?" msgstr "Точно закончить сетевую игру?" #: ../src/MainWindow.cc:758 msgid "Function not implemented yet" msgstr "" #: ../src/MainWindow.cc:777 #, fuzzy msgid "GMChess is a Chinese chess game written in gtkmm." msgstr "GMChess - китайские шахматы на gtkmm." #: ../src/MainWindow.cc:779 msgid "" "This program is licensed under GNU General Public Licence (GPL) version 2." msgstr "Лицензия GNU GPL 2ая версия." #: ../src/MainWindow.cc:798 msgid "Black" msgstr "Чёрные" #: ../src/MainWindow.cc:801 msgid "Red" msgstr "Красные" #: ../src/MainWindow.cc:864 msgid "Game: " msgstr "Игра: " #: ../src/MainWindow.cc:865 msgid "Time: " msgstr "Время: " #: ../src/MainWindow.cc:866 msgid "Site: " msgstr "Сторона: " #: ../src/MainWindow.cc:867 msgid "Result: " msgstr "Результат: " #: ../src/MainWindow.cc:868 msgid "Opening: " msgstr "Начало: " #: ../src/MainWindow.cc:869 msgid "Variation: " msgstr "Вариация: " #: ../src/MainWindow.cc:945 ../src/MainWindow.cc:992 msgid "new game" msgstr "Новая игра" #: ../src/MainWindow.cc:948 ../src/MainWindow.cc:995 #, fuzzy msgid "Will you start a new game?" msgstr "Начать новую игру?" #: ../src/MainWindow.cc:970 ../src/MainWindow.cc:1017 ../src/MainWindow.cc:1071 #: ../data/gmchess.glade.h:33 msgid "Information" msgstr "Информация" #: ../src/MainWindow.cc:971 #, fuzzy msgid "You are play online, Please end this game first!" msgstr "Вы уже играете по сети. Пожалуйста, сначал закройте начатую партию." #: ../src/MainWindow.cc:1018 #, fuzzy msgid "You are playing online, Please end this game first!" msgstr "Вы уже играете по сети. Пожалуйста, сначал закройте начатую партию." #: ../src/MainWindow.cc:1034 ../src/MainWindow.cc:1062 msgid "be lose" msgstr "поражение" #: ../src/MainWindow.cc:1037 ../src/MainWindow.cc:1065 msgid "Will you resign in this game?" msgstr "Сдаётесь?" #: ../src/MainWindow.cc:1072 msgid "You lose the game!" msgstr "Вы проиграли эту партию!" #: ../src/MainWindow.cc:1104 #, fuzzy msgid "" "You may only take a back move when it's your turn. Please wait a minute!" msgstr "Ход можно отменить, когда Ваша очередь ходить!" #: ../src/MainWindow.cc:1124 ../src/MainWindow.cc:1136 #, fuzzy msgid "" "You can only take a back move when it's your turn. Please wait a minute!" msgstr "Ход можно отменить, когда Ваша очередь ходить!" #. robot win #: ../src/MainWindow.cc:1151 #, fuzzy msgid "" "You Lose!\n" "Do you want to start a new game?" msgstr "" "Вы проиграли!\n" "Хотите начать новую игру?" #. robot lose #: ../src/MainWindow.cc:1156 #, fuzzy msgid "" "Congratuations, YOU WIN!\n" "To start a new game, click OK" msgstr "" "Поздравления! ВЫ ПОБЕДИТЕЛЬ!\n" "Чтобы сыграть ещё нажмите ОК." #. robot want to draw #: ../src/MainWindow.cc:1161 msgid "Draw Game!" msgstr "Ничья!" #. robot overload time,lose #: ../src/MainWindow.cc:1165 #, fuzzy msgid "The opponent used up their time. You Win!" msgstr "У противника вышло время! Вы выиграли!" #: ../src/MainWindow.cc:1169 #, fuzzy msgid "You used up your time. You Lose!" msgstr "Время вышло! Вы проиграли!" #: ../src/MainWindow.cc:1175 #, fuzzy msgid "Game Over" msgstr "Игра: " #: ../data/gmchess.glade.h:1 msgid "chess" msgstr "шахматы" #: ../data/gmchess.glade.h:2 ../data/confwin.glade.h:21 msgid " " msgstr " " #: ../data/gmchess.glade.h:3 msgid "nickname:" msgstr "имя: " #: ../data/gmchess.glade.h:4 msgid " Computer " msgstr "Компьютер" #: ../data/gmchess.glade.h:5 msgid "step time: " msgstr "время на ход: " #: ../data/gmchess.glade.h:6 msgid "play time: " msgstr "время на партию: " #: ../data/gmchess.glade.h:7 msgid " " msgstr " " #: ../data/gmchess.glade.h:8 msgid "nickname: " msgstr "имя: " #: ../data/gmchess.glade.h:9 msgid " Human " msgstr "Человек" #: ../data/gmchess.glade.h:10 msgid "1" msgstr "1" #: ../data/gmchess.glade.h:11 msgid "2" msgstr "2" #: ../data/gmchess.glade.h:12 msgid "3" msgstr "3" #: ../data/gmchess.glade.h:13 msgid "4" msgstr "4" #: ../data/gmchess.glade.h:14 msgid "5" msgstr "5" #: ../data/gmchess.glade.h:15 msgid "6" msgstr "6" #: ../data/gmchess.glade.h:16 msgid "7" msgstr "7" #: ../data/gmchess.glade.h:17 msgid "8" msgstr "8" #: ../data/gmchess.glade.h:18 msgid "9" msgstr "9" #: ../data/gmchess.glade.h:19 msgid "Start" msgstr "Начать" #: ../data/gmchess.glade.h:20 #, fuzzy msgid "begin a new game" msgstr "Новая игра" #: ../data/gmchess.glade.h:21 msgid "Lost" msgstr "Поражение" #: ../data/gmchess.glade.h:22 msgid "Draw" msgstr "Ничья" #: ../data/gmchess.glade.h:23 msgid "Rue" msgstr "Отменить ход" #: ../data/gmchess.glade.h:24 msgid "nine" msgstr "9" #: ../data/gmchess.glade.h:25 msgid "eight" msgstr "8" #: ../data/gmchess.glade.h:26 msgid "seven" msgstr "7" #: ../data/gmchess.glade.h:27 msgid "six" msgstr "6" #: ../data/gmchess.glade.h:28 msgid "five" msgstr "5" #: ../data/gmchess.glade.h:29 msgid "four" msgstr "4" #: ../data/gmchess.glade.h:30 msgid "three" msgstr "3" #: ../data/gmchess.glade.h:31 msgid "two" msgstr "2" #: ../data/gmchess.glade.h:32 msgid "one" msgstr "1" #: ../data/gmchess.glade.h:34 msgid "start game with state" msgstr "" #: ../data/gmchess.glade.h:35 msgid "first station" msgstr "начальное положение" #: ../data/gmchess.glade.h:36 msgid "preview move" msgstr "посмотреть ход" #: ../data/gmchess.glade.h:37 msgid "next move" msgstr "следующий ход" #: ../data/gmchess.glade.h:38 msgid "last move" msgstr "предыдущий ход" #: ../data/gmchess.glade.h:39 msgid "Comment" msgstr "Комментарий" #: ../data/gmchess.glade.h:40 msgid "Board Information" msgstr "Информация о доске" #: ../data/gmchess.glade.h:41 msgid "Book" msgstr "Книга" #: ../data/gmchess.glade.h:42 ../data/confwin.glade.h:6 #, fuzzy msgid " " msgstr " " #: ../data/gmchess.glade.h:43 msgid "Engine status" msgstr "Состояние движка" #: ../data/gmchess.glade.h:44 msgid "Engine" msgstr "Движок" #: ../data/confwin.glade.h:1 #, fuzzy msgid "Size of Board\n" msgstr "_Сохранить как" #: ../data/confwin.glade.h:3 msgid "small board" msgstr "" #: ../data/confwin.glade.h:4 msgid "big board" msgstr "" #: ../data/confwin.glade.h:5 msgid "themes" msgstr "" #: ../data/confwin.glade.h:7 msgid "trace line color" msgstr "" #: ../data/confwin.glade.h:8 #, fuzzy msgid "Aspect" msgstr "Комментарий" #: ../data/confwin.glade.h:9 #, fuzzy msgid "select Engine" msgstr "Движок" #: ../data/confwin.glade.h:10 msgid "default is eleeye_engine" msgstr "" #: ../data/confwin.glade.h:11 msgid "eleeye_engine" msgstr "" #: ../data/confwin.glade.h:12 msgid "use open book" msgstr "" #: ../data/confwin.glade.h:13 msgid "Search Depth" msgstr "" #: ../data/confwin.glade.h:14 #, fuzzy msgid "step time:" msgstr "время на ход: " #: ../data/confwin.glade.h:15 msgid "240" msgstr "" #: ../data/confwin.glade.h:16 msgid "sec" msgstr "" #: ../data/confwin.glade.h:17 #, fuzzy msgid "play time:" msgstr "время на партию: " #: ../data/confwin.glade.h:18 #, fuzzy msgid "40" msgstr "4" #: ../data/confwin.glade.h:19 msgid "min" msgstr "" #: ../data/confwin.glade.h:20 #, fuzzy msgid "Engine" msgstr "Состояние движка" #~ msgid "bout" #~ msgstr "Очередь" #~ msgid "step" #~ msgstr "Ход" #~ msgid "Change Side" #~ msgstr "Поменяться сторонами" #~ msgid "Only rue game when you are going,so wait a minute!" #~ msgstr "Ход можно отменить, когда Ваша очередь ходить!" #~ msgid "Game End" #~ msgstr "Игра закончена." #~ msgid "hui" #~ msgstr "悔棋" #~ msgid "huo" #~ msgstr "和棋" #~ msgid "end game" #~ msgstr "End game" #~ msgid "Computer want to draw with you, are you agree?" #~ msgstr "The computer offers a draw. Do you agree?" gmchess-0.29.6.3/po/zh_CN.po000066400000000000000000000236221323660377300154000ustar00rootroot00000000000000# Chinese translations for gmchess package. # Copyright (C) 2009 THE gmchess'S COPYRIGHT HOLDER # This file is distributed under the same license as the gmchess package. # lerosua , 2009. # Boyuan Yang <073plan@gmail.com>, 2018. # msgid "" msgstr "" "Project-Id-Version: gmchess 0.29.6.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-29 20:47+0800\n" "PO-Revision-Date: 2018-01-29 20:47+0800\n" "Last-Translator: Boyuan Yang <073plan@gmail.com>\n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.6\n" #: ../src/MainWindow.cc:115 msgid "GMChess" msgstr "天书棋谈" #: ../src/MainWindow.cc:132 msgid "Turn" msgstr "回合" #: ../src/MainWindow.cc:134 msgid "Move" msgstr "着法" #. File menu: #: ../src/MainWindow.cc:399 msgid "_File" msgstr "文件(_F)" #: ../src/MainWindow.cc:401 msgid "Open file" msgstr "打开文件" #: ../src/MainWindow.cc:402 msgid "Open chessman File" msgstr "打开棋谱文件" #: ../src/MainWindow.cc:405 msgid "Save as" msgstr "另存为" #: ../src/MainWindow.cc:406 msgid "Save as a chess pgn file" msgstr "保存为PGN棋谱" #: ../src/MainWindow.cc:409 msgid "Save Board" msgstr "保存棋盘" #: ../src/MainWindow.cc:410 msgid "Save board to a png file" msgstr "将棋盘保存为 png 文件" #. View menu: #: ../src/MainWindow.cc:418 msgid "_View" msgstr "查看(_V)" #. Game menu: #: ../src/MainWindow.cc:425 msgid "_Game" msgstr "游戏(_G)" #: ../src/MainWindow.cc:426 msgid "_Fight to AI" msgstr "与电脑对战(_F)" #: ../src/MainWindow.cc:428 msgid "Free Play" msgstr "摆棋" #: ../src/MainWindow.cc:430 msgid "_Switch colour" msgstr "交换棋色(_S)" #. Help menu: #: ../src/MainWindow.cc:433 msgid "_Help" msgstr "帮助(_H)" #: ../src/MainWindow.cc:457 msgid "Save File" msgstr "保存文件" #: ../src/MainWindow.cc:547 msgid "Choose File" msgstr "选择文件" #: ../src/MainWindow.cc:590 msgid "All Files" msgstr "所有文件" #: ../src/MainWindow.cc:606 msgid "AI Warn" msgstr "AI警告" #: ../src/MainWindow.cc:609 msgid "Open book view will close the AI game. Are you sure?" msgstr "打开棋谱会停止对战,是否继续?" #: ../src/MainWindow.cc:653 msgid "the file maybe not right format for chess" msgstr "未支持的棋谱格式" #: ../src/MainWindow.cc:700 ../src/MainWindow.cc:1103 ../src/MainWindow.cc:1123 #: ../src/MainWindow.cc:1135 msgid "Warning" msgstr "警告" #: ../src/MainWindow.cc:703 msgid "Are you sure to close the network game?" msgstr "您确认要停止网络对战吗?" #: ../src/MainWindow.cc:758 msgid "Function not implemented yet" msgstr "功能尚未实现" #: ../src/MainWindow.cc:777 msgid "GMChess is a Chinese chess game written in gtkmm." msgstr "GMChess 是一款用 Gtkmm 库写成的中国象棋软件。" #: ../src/MainWindow.cc:779 msgid "This program is licensed under GNU General Public Licence (GPL) version 2." msgstr "此程序在 GNU 通用公共许可证第二版下发布。" #: ../src/MainWindow.cc:798 msgid "Black" msgstr "黑" #: ../src/MainWindow.cc:801 msgid "Red" msgstr "红" #: ../src/MainWindow.cc:864 msgid "Game: " msgstr "游戏: " #: ../src/MainWindow.cc:865 msgid "Time: " msgstr "时间: " #: ../src/MainWindow.cc:866 msgid "Site: " msgstr "地点: " #: ../src/MainWindow.cc:867 msgid "Result: " msgstr "结果: " #: ../src/MainWindow.cc:868 msgid "Opening: " msgstr "开局信息: " #: ../src/MainWindow.cc:869 msgid "Variation: " msgstr "变着: " #: ../src/MainWindow.cc:945 ../src/MainWindow.cc:992 msgid "new game" msgstr "新游戏" #: ../src/MainWindow.cc:948 ../src/MainWindow.cc:995 msgid "Will you start a new game?" msgstr "您确定要开始新游戏吗?" #: ../src/MainWindow.cc:970 ../src/MainWindow.cc:1017 ../src/MainWindow.cc:1071 #: ../data/gmchess.glade.h:33 msgid "Information" msgstr "信息" #: ../src/MainWindow.cc:971 msgid "You are play online, Please end this game first!" msgstr "您正在进行网络对战,请先结束该局比赛!" #: ../src/MainWindow.cc:1018 msgid "You are playing online, Please end this game first!" msgstr "您正在进行网络对战,请先结束该局比赛!" #: ../src/MainWindow.cc:1034 ../src/MainWindow.cc:1062 msgid "be lose" msgstr "输了" #: ../src/MainWindow.cc:1037 ../src/MainWindow.cc:1065 msgid "Will you resign in this game?" msgstr "您确定要认输吗?" #: ../src/MainWindow.cc:1072 msgid "You lose the game!" msgstr "您输了这局!" #: ../src/MainWindow.cc:1104 msgid "You may only take a back move when it's your turn. Please wait a minute!" msgstr "只有在您走的时候才能悔棋,请稍等!" #: ../src/MainWindow.cc:1124 ../src/MainWindow.cc:1136 msgid "You can only take a back move when it's your turn. Please wait a minute!" msgstr "只有在您走的时候才能悔棋。请稍等!" #. robot win #: ../src/MainWindow.cc:1151 msgid "" "You Lose!\n" "Do you want to start a new game?" msgstr "" "您输了!\n" "您确定要开始新游戏吗?" #. robot lose #: ../src/MainWindow.cc:1156 msgid "" "Congratuations, YOU WIN!\n" "To start a new game, click OK" msgstr "" "恭喜,您赢了!\n" "开始新游戏请点确定" #. robot want to draw #: ../src/MainWindow.cc:1161 msgid "Draw Game!" msgstr "和棋!" #. robot overload time,lose #: ../src/MainWindow.cc:1165 msgid "The opponent used up their time. You Win!" msgstr "对方超时。您赢得了比赛!" #: ../src/MainWindow.cc:1169 msgid "You used up your time. You Lose!" msgstr "您超时了。您输了!" #: ../src/MainWindow.cc:1175 msgid "Game Over" msgstr "游戏结束" #: ../data/gmchess.glade.h:1 msgid "chess" msgstr "象棋" #: ../data/gmchess.glade.h:2 ../data/confwin.glade.h:21 msgid " " msgstr " " #: ../data/gmchess.glade.h:3 msgid "nickname:" msgstr "昵称:" #: ../data/gmchess.glade.h:4 msgid " Computer " msgstr " 电脑 " #: ../data/gmchess.glade.h:5 msgid "step time: " msgstr "步时: " #: ../data/gmchess.glade.h:6 msgid "play time: " msgstr "局时: " #: ../data/gmchess.glade.h:7 msgid " " msgstr " " #: ../data/gmchess.glade.h:8 msgid "nickname: " msgstr "昵称:" #: ../data/gmchess.glade.h:9 msgid " Human " msgstr " 真人 " #: ../data/gmchess.glade.h:10 msgid "1" msgstr "1" #: ../data/gmchess.glade.h:11 msgid "2" msgstr "2" #: ../data/gmchess.glade.h:12 msgid "3" msgstr "3" #: ../data/gmchess.glade.h:13 msgid "4" msgstr "4" #: ../data/gmchess.glade.h:14 msgid "5" msgstr "5" #: ../data/gmchess.glade.h:15 msgid "6" msgstr "6" #: ../data/gmchess.glade.h:16 msgid "7" msgstr "7" #: ../data/gmchess.glade.h:17 msgid "8" msgstr "8" #: ../data/gmchess.glade.h:18 msgid "9" msgstr "9" #: ../data/gmchess.glade.h:19 msgid "Start" msgstr "开始" #: ../data/gmchess.glade.h:20 msgid "begin a new game" msgstr "开始新游戏" #: ../data/gmchess.glade.h:21 msgid "Lost" msgstr "认输" #: ../data/gmchess.glade.h:22 msgid "Draw" msgstr "和棋" #: ../data/gmchess.glade.h:23 msgid "Rue" msgstr "悔棋" #: ../data/gmchess.glade.h:24 msgid "nine" msgstr "九" #: ../data/gmchess.glade.h:25 msgid "eight" msgstr "八" #: ../data/gmchess.glade.h:26 msgid "seven" msgstr "七" #: ../data/gmchess.glade.h:27 msgid "six" msgstr "六" #: ../data/gmchess.glade.h:28 msgid "five" msgstr "五" #: ../data/gmchess.glade.h:29 msgid "four" msgstr "四" #: ../data/gmchess.glade.h:30 msgid "three" msgstr "三" #: ../data/gmchess.glade.h:31 msgid "two" msgstr "二" #: ../data/gmchess.glade.h:32 msgid "one" msgstr "一" #: ../data/gmchess.glade.h:34 msgid "start game with state" msgstr "以对应状态开始游戏" #: ../data/gmchess.glade.h:35 msgid "first station" msgstr "初始局面" #: ../data/gmchess.glade.h:36 msgid "preview move" msgstr "前一着法" #: ../data/gmchess.glade.h:37 msgid "next move" msgstr "下一着法" #: ../data/gmchess.glade.h:38 msgid "last move" msgstr "最后一着法" #: ../data/gmchess.glade.h:39 msgid "Comment" msgstr "注释" #: ../data/gmchess.glade.h:40 msgid "Board Information" msgstr "棋盘信息" #: ../data/gmchess.glade.h:41 msgid "Book" msgstr "棋书" #: ../data/gmchess.glade.h:42 ../data/confwin.glade.h:6 msgid " " msgstr " " #: ../data/gmchess.glade.h:43 msgid "Engine status" msgstr "引擎状态" #: ../data/gmchess.glade.h:44 msgid "Engine" msgstr "引擎" #: ../data/confwin.glade.h:1 msgid "Size of Board\n" msgstr "棋盘大小\n" #: ../data/confwin.glade.h:3 msgid "small board" msgstr "小棋盘" #: ../data/confwin.glade.h:4 msgid "big board" msgstr "大棋盘" #: ../data/confwin.glade.h:5 msgid "themes" msgstr "主题" #: ../data/confwin.glade.h:7 msgid "trace line color" msgstr "轨迹颜色" #: ../data/confwin.glade.h:8 msgid "Aspect" msgstr "界面" #: ../data/confwin.glade.h:9 msgid "select Engine" msgstr "选择引擎" #: ../data/confwin.glade.h:10 msgid "default is eleeye_engine" msgstr "默认为 eleeye_engine" #: ../data/confwin.glade.h:11 msgid "eleeye_engine" msgstr "eleeye_engine" #: ../data/confwin.glade.h:12 msgid "use open book" msgstr "" #: ../data/confwin.glade.h:13 msgid "Search Depth" msgstr "搜索深度" #: ../data/confwin.glade.h:14 msgid "step time:" msgstr "步时: " #: ../data/confwin.glade.h:15 msgid "240" msgstr "240" #: ../data/confwin.glade.h:16 msgid "sec" msgstr "秒" #: ../data/confwin.glade.h:17 msgid "play time:" msgstr "局时: " #: ../data/confwin.glade.h:18 msgid "40" msgstr "40" #: ../data/confwin.glade.h:19 msgid "min" msgstr "分" #: ../data/confwin.glade.h:20 msgid "Engine" msgstr "引擎" #~ msgid "Only rue game when you are going,so wait a minute!" #~ msgstr "只有在您走的时候才能悔棋,请等会!" #~ msgid "Game End" #~ msgstr "游戏结束" #~ msgid "end game" #~ msgstr "结束游戏" #~ msgid "Computer want to draw with you, are you agree?" #~ msgstr "计算机想和您和棋,同意吗?" #~ msgid "hui" #~ msgstr "悔棋" #~ msgid "huo" #~ msgstr "和棋" gmchess-0.29.6.3/src/000077500000000000000000000000001323660377300142035ustar00rootroot00000000000000gmchess-0.29.6.3/src/Board.cc000066400000000000000000001103711323660377300155440ustar00rootroot00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Board.h * Copyright (C) wind 2009 * */ #include "Board.h" #include #include #include #include #include #include #include #include #include "Engine.h" #include "MainWindow.h" #include "Sound.h" #include "ec_throw.h" /** 边界的宽度*/ /** width of border */ const int border_width = 32; /** 棋子的宽度*/ /** width of chessman */ //const int chessman_width = 57; //const int chessman_width = 29; #define PLACE_LEFT 0x01 #define PLACE_RIGHT 0x02 #define PIECE_START 16 //棋子开始数字 start number of chessman #define PIECE_END 48 //棋子结束数字 end number of chessman #define PLACE_ALL PLACE_LEFT | PLACE_RIGHT #define IMGAGE_DIR DATA_DIR"/themes/west/" #define IMGAGE_SMALL_DIR DATA_DIR"/themes/west-small/" #define HEX_ESCAPE '%' int hex_to_int (gchar c) { return c >= '0' && c <= '9' ? c - '0' : c >= 'A' && c <= 'F' ? c - 'A' + 10 : c >= 'a' && c <= 'f' ? c - 'a' + 10 : -1; } int unescape_character (const char *scanner) { int first_digit; int second_digit; first_digit = hex_to_int (*scanner++); if (first_digit < 0) { return -1; } second_digit = hex_to_int (*scanner++); if (second_digit < 0) { return -1; } return (first_digit << 4) | second_digit; } /** 用于在拖放时得到的文件名的转码*/ /** get the code of when drag the filename*/ std::string wind_unescape_string (const char *escaped_string, const gchar *illegal_characters) { const char *in; char *out; int character; if (escaped_string == NULL) { return std::string(); } //result = g_malloc (strlen (escaped_string) + 1); char result[strlen (escaped_string) + 1]; out = result; for (in = escaped_string; *in != '\0'; in++) { character = *in; if (*in == HEX_ESCAPE) { character = unescape_character (in + 1); /* Check for an illegal character. We consider '\0' illegal here. */ if (character <= 0 || (illegal_characters != NULL && strchr (illegal_characters, (char)character) != NULL)) { return std::string(); } in += 2; } *out++ = (char)character; } *out = '\0'; assert (out - result <= strlen (escaped_string)); return std::string(result); } Board::Board(MainWindow& win) : selected_x(-1), selected_y(-1), m_step(0), m_status(FREE_STATUS), ui_pixmap(NULL), p_pgnfile(NULL), fd_recv_skt(-1), fd_send_skt(-1), selected_chessman(-1) ,postion_str("position fen ") ,parent(win) ,red_time(2400) ,black_time(2400) ,play_time(40) ,step_time(240) ,count_time(0) ,limit_count_time(240) ,chessman_width(29) ,is_small_board(true) ,is_rev_board(false) ,m_search_depth(8) ,m_usebook(true) ,m_human_black(false) ,theme("wood") ,color("#198964") { std::list listTargets; listTargets.push_back(Gtk::TargetEntry("STRING")); listTargets.push_back(Gtk::TargetEntry("text/plain")); this->set_size_request(221,277); this->drag_dest_set(listTargets); this->signal_drag_data_received().connect( sigc::mem_fun(*this, &Board::on_drog_data_received)); /** 加载所需要图片进内存*/ load_images(); p_pgnfile=new Pgnfile(m_engine); m_engine.init_snapshot(start_fen); m_robot.set_out_slot(sigc::mem_fun(*this, &Board::robot_log)); this->set_events(Gdk::BUTTON_PRESS_MASK|Gdk::EXPOSURE_MASK); this->show_all(); } Board::~Board() { if(timer.connected()) timer.disconnect(); m_robot.send_ctrl_command("quit\n"); m_robot.stop(); } void Board::set_trace_color(const std::string& color_) { color = color_; } void Board::set_themes(const std::string& themes_) { theme = themes_; /** 加载所需要图片进内存*/ load_images(); redraw(); } Glib::RefPtr Board::get_pic(const std::string& name_) { const std::string path = \ std::string(DATA_DIR) + \ "/themes/" + theme + "/" + name_; return Gdk::Pixbuf::create_from_file(path); } Glib::RefPtr Board::get_spic(const std::string& name_) { const std::string path = \ std::string(DATA_DIR) + \ "/themes/" + theme + "-small/" + name_; return Gdk::Pixbuf::create_from_file(path); } void Board::load_images() { bg_image = get_pic("bg.png"); if(is_small_board){ chessman_images[BLACK_ADVISOR] = get_spic("black_advisor.png"); chessman_images[BLACK_BISHOP] = get_spic("black_bishop.png"); chessman_images[BLACK_CANNON] = get_spic("black_cannon.png"); chessman_images[BLACK_KING] = get_spic("black_king.png"); chessman_images[BLACK_KING_DIE] = get_spic("black_king_die.png"); chessman_images[BLACK_KNIGHT] = get_spic("black_knight.png"); chessman_images[BLACK_PAWN] = get_spic("black_pawn.png"); chessman_images[BLACK_ROOK] = get_spic("black_rook.png"); chessman_images[RED_ADVISOR] = get_spic("red_advisor.png"); chessman_images[RED_BISHOP] = get_spic("red_bishop.png"); chessman_images[RED_CANNON] = get_spic("red_cannon.png"); chessman_images[RED_KING] = get_spic("red_king.png"); chessman_images[RED_KING_DIE] = get_spic("red_king_die.png"); chessman_images[RED_KNIGHT] = get_spic("red_knight.png"); chessman_images[RED_PAWN] = get_spic("red_pawn.png"); chessman_images[RED_ROOK] = get_spic("red_rook.png"); chessman_images[SELECTED_CHESSMAN] = get_spic("select.png"); chessman_images[PROPMT] = get_spic("null.png"); } else{ chessman_images[BLACK_ADVISOR] = get_pic("black_advisor.png"); chessman_images[BLACK_BISHOP] = get_pic("black_bishop.png"); chessman_images[BLACK_CANNON] = get_pic("black_cannon.png"); chessman_images[BLACK_KING] = get_pic("black_king.png"); chessman_images[BLACK_KING_DIE] = get_pic("black_king_die.png"); chessman_images[BLACK_KNIGHT] = get_pic("black_knight.png"); chessman_images[BLACK_PAWN] = get_pic("black_pawn.png"); chessman_images[BLACK_ROOK] = get_pic("black_rook.png"); chessman_images[RED_ADVISOR] = get_pic("red_advisor.png"); chessman_images[RED_BISHOP] = get_pic("red_bishop.png"); chessman_images[RED_CANNON] = get_pic("red_cannon.png"); chessman_images[RED_KING] = get_pic("red_king.png"); chessman_images[RED_KING_DIE] = get_pic("red_king_die.png"); chessman_images[RED_KNIGHT] = get_pic("red_knight.png"); chessman_images[RED_PAWN] = get_pic("red_pawn.png"); chessman_images[RED_ROOK] = get_pic("red_rook.png"); chessman_images[SELECTED_CHESSMAN] = get_pic("select.png"); chessman_images[PROPMT] = get_pic("null.png"); } } void Board::configure_board(int _width) { if(is_small_board && _width >=521){ is_small_board=false; chessman_width=57; load_images(); redraw(); } if(!is_small_board && _width<521){ is_small_board=true; chessman_width=29; load_images(); redraw(); } } void Board::get_grid_size(int& width, int& height) { width = (get_width() - border_width * 2) / 8; height = (get_height() - border_width * 2) / 9; } Gdk::Point Board::get_coordinate(int pos_x, int pos_y) { int grid_width; int grid_height; get_grid_size(grid_width, grid_height); pos_x = pos_x * grid_width + border_width; pos_y = pos_y * grid_height + border_width; return Gdk::Point(pos_x, pos_y); } Gdk::Point Board::get_position(int pos_x, int pos_y) { int grid_width; int grid_height; get_grid_size(grid_width, grid_height); pos_x -= border_width; pos_y -= border_width; pos_x += grid_width / 2; pos_y += grid_height / 2; int x = pos_x / grid_width; int y = pos_y / grid_height; int offset_x = pos_x - x * grid_width; int offset_y = pos_y - y * grid_height; if ((offset_x > chessman_width ) || (offset_y > chessman_width )) return Gdk::Point(-1, -1); return Gdk::Point(x, y); } void Board::on_map() { Gtk::DrawingArea::on_map(); selected_chessman_image = Gdk::Image::create (Gdk::IMAGE_SHARED, get_window()->get_visual(), chessman_width, chessman_width); } bool Board::on_configure_event(GdkEventConfigure* ev) { //if(ui_pixmap) // return true; ui_pixmap = Gdk::Pixmap::create(this->get_window(),get_width(),get_height()); redraw(); } bool Board::on_expose_event(GdkEventExpose* ev) { this->get_window()->draw_drawable(this->get_style()->get_black_gc(),ui_pixmap, ev->area.x,ev->area.y, ev->area.x,ev->area.y, ev->area.width,ev->area.height); return true; } void Board::redraw() { draw_bg(); draw_board(); int x,y; ui_pixmap->get_size(x,y); this->get_window()->draw_drawable(this->get_style()->get_black_gc(),ui_pixmap, 0,0, 0,0, x,y); } void Board::redraw_with_line(int mv,bool select) { draw_bg(); draw_trace(mv); draw_board(); int x,y; ui_pixmap->get_size(x,y); this->get_window()->draw_drawable(this->get_style()->get_black_gc(),ui_pixmap, 0,0, 0,0, x,y); draw_select_frame(select); } /**处理点击事件, handle the click events*/ bool Board::on_button_press_event(GdkEventButton* ev) { /** 对战状态下,电脑走棋时就不响应鼠标事件了*/ /** if fight with AI, the compute doesn't handle the events */ if(is_fight_to_robot()||is_network_game()){ if(!is_human_player()) return true; } if(ev->type == GDK_BUTTON_PRESS&& ev->button == 1) { redraw(); Gdk::Point p = get_position(ev->x, ev->y); selected_x = p.get_x(); selected_y = p.get_y(); if(selected_chessman == -1){ /** 之前没选中棋子,现在选择 */ /** there is not select chessman,now select*/ CSound::play(SND_CHOOSE); if (selected_x != -1) { selected_chessman = m_engine.get_piece(selected_x, selected_y,is_rev_board); if(selected_chessman==0){ /** 仍然没选中, still not select */ selected_chessman = -1; printf("still no select chessman\n"); return true; } /** 对战状态中,选了对方棋子无效*/ /** choose the enemy chessman is useless on war */ if(is_fight_to_robot()||is_network_game()){ if((m_human_black && (selected_chessman <32))||((!m_human_black)&&(selected_chessman>31))){ printf("choose black %d\n",selected_chessman); selected_chessman =-1; return true; } } draw_select_frame(true); draw_show_can_move(); } } else{ /** 之前已经选中棋子,现在是生成着法或取消*/ /** there has a selecter, now buider the moves or canel */ int dst_chessman = m_engine.get_piece(selected_x,selected_y,is_rev_board); if( (dst_chessman!=0) && ((selected_chessman &16)==(dst_chessman&16))){ /** 之前所选及现在选是同一色棋子, 变更棋子选择 */ /** change the select */ selected_chessman = dst_chessman; draw_select_frame(true); draw_show_can_move(); CSound::play(SND_CHOOSE); } //else if(dst_chessman == 0){ else{ /** 目标地点没有棋子可以直接生成着法,当然还需要检测一下从源地点到终点是否是合法的着法,交由下面着法生成函数负责*/ /** 目标地点有对方棋子,其实也可以给着法生成函数搞啊*/ try_move(selected_x,selected_y); } } } else if(ev->type == GDK_BUTTON_PRESS&& ev->button == 3){ /** 右键取消选择*/ /** the right click canel the choose*/ selected_chessman = -1; //draw_select_frame(false); redraw(); } return true; } void Board::draw_bg() { Gdk::Point p1= get_coordinate(0, 0); Gdk::Point p2= get_coordinate(8, 9); int width = p2.get_x() - p1.get_x(); int height = p2.get_y() - p1.get_y(); int bg_width = bg_image->get_width(); int bg_height = bg_image->get_height(); int count_w = get_width() / bg_width + 1; int count_h = get_height() / bg_height + 1; for (int i = 0; i < count_w; i++) { for (int j = 0; j < count_h; j++) { ui_pixmap->draw_pixbuf(get_style()->get_black_gc(), bg_image, 0, 0, i * bg_width, j * bg_height, bg_width, bg_height, Gdk::RGB_DITHER_NONE, 0, 0); } } Glib::RefPtr gc = this->get_style()->get_black_gc(); gc->set_line_attributes(4, Gdk::LINE_SOLID, Gdk::CAP_NOT_LAST, Gdk::JOIN_ROUND); ui_pixmap->draw_rectangle(gc, false, p1.get_x() - 8, p1.get_y() - 8, width + 8 * 2, height + 8 * 2); gc->set_line_attributes(2, Gdk::LINE_SOLID, Gdk::CAP_NOT_LAST, Gdk::JOIN_ROUND); ui_pixmap->draw_rectangle(gc, false, p1.get_x(), p1.get_y(), width, height); gc->set_line_attributes(1, Gdk::LINE_SOLID, Gdk::CAP_NOT_LAST, Gdk::JOIN_ROUND); int grid_width; int grid_height; get_grid_size(grid_width, grid_height); GdkSegment seg[9]; for (int i = 0; i < 9; i++) { p1 = get_coordinate(0, i); p2 = get_coordinate(8, i); seg[i].x1 = p1.get_x(); seg[i].y1 = p1.get_y(); seg[i].x2 = p2.get_x(); seg[i].y2 = p2.get_y(); } ui_pixmap->draw_segments(gc, seg, 9); for (int i = 0; i < 8; i++) { p1 = get_coordinate(i, 0); p2 = get_coordinate(i, 4); seg[i].x1 = p1.get_x(); seg[i].y1 = p1.get_y(); seg[i].x2 = p2.get_x(); seg[i].y2 = p2.get_y(); } ui_pixmap->draw_segments(gc, seg, 8); for (int i = 0; i < 8; i++) { p1 = get_coordinate(i, 5); p2 = get_coordinate(i, 9); seg[i].x1 = p1.get_x(); seg[i].y1 = p1.get_y(); seg[i].x2 = p2.get_x(); seg[i].y2 = p2.get_y(); } ui_pixmap->draw_segments(gc, seg, 8); gc->set_line_attributes(2, Gdk::LINE_SOLID, Gdk::CAP_NOT_LAST, Gdk::JOIN_ROUND ); draw_localize(gc, 0, 3, PLACE_LEFT); draw_localize(gc, 8, 3, PLACE_RIGHT); for (int i = 0; i < 3; i++) { draw_localize(gc, i * 2 + 2, 3, PLACE_ALL); } draw_localize(gc, 1, 2, PLACE_ALL); draw_localize(gc, 7, 2, PLACE_ALL); draw_localize(gc, 0, 6, PLACE_LEFT); draw_localize(gc, 8, 6, PLACE_RIGHT); for (int i = 0; i < 3; i++) { draw_localize(gc, i * 2 + 2, 6, PLACE_ALL); } draw_localize(gc, 1, 7, PLACE_ALL); draw_localize(gc, 7, 7, PLACE_ALL); gc->set_line_attributes(1, Gdk::LINE_SOLID, Gdk::CAP_NOT_LAST, Gdk::JOIN_BEVEL ); draw_palace(gc, 4, 1); draw_palace(gc, 4, 8); } void Board::draw_localize(Glib::RefPtr& gc, int x, int y, int place) { int width; int height; get_grid_size(width, height); width /= 5; height /= 5; Gdk::Point p = get_coordinate(x, y); if (place & PLACE_LEFT) { std::vector poss; poss.push_back(Gdk::Point(p.get_x() + 5, p.get_y() - height - 4)); poss.push_back(Gdk::Point(p.get_x() + 5, p.get_y() - 4)); poss.push_back(Gdk::Point(p.get_x() + 5 + width, p.get_y() - 4)); ui_pixmap->draw_lines(gc, poss); poss.clear(); poss.push_back(Gdk::Point(p.get_x() + 5 + width, p.get_y() + 5)); poss.push_back(Gdk::Point(p.get_x() + 5, p.get_y() + 5)); poss.push_back(Gdk::Point(p.get_x() + 5 , p.get_y() + 5 + height)); ui_pixmap->draw_lines(gc, poss); } if (place & PLACE_RIGHT) { std::vector poss; poss.push_back(Gdk::Point(p.get_x() - 4 - width, p.get_y() - 4)); poss.push_back(Gdk::Point(p.get_x() - 4 , p.get_y() - 4)); poss.push_back(Gdk::Point(p.get_x() - 4 , p.get_y() - 4 - height)); ui_pixmap->draw_lines(gc, poss); poss.clear(); poss.push_back(Gdk::Point(p.get_x() - 4 - width, p.get_y() + 5)); poss.push_back(Gdk::Point(p.get_x() - 4 , p.get_y() + 5)); poss.push_back(Gdk::Point(p.get_x() - 4 , p.get_y() + 5 + height)); ui_pixmap->draw_lines(gc, poss); } } void Board::draw_palace(Glib::RefPtr& gc, int x, int y) { int width; int height; get_grid_size(width, height); Gdk::Point p = get_coordinate(x, y); ui_pixmap->draw_line(gc, p.get_x() - width, p.get_y() - height, p.get_x() + width, p.get_y() + height); ui_pixmap->draw_line(gc, p.get_x() + width, p.get_y() - height, p.get_x() - width, p.get_y() + height); } void Board::draw_chessman(int x, int y, int chessman) { //if(chessman<16|| chessman>47) // return; int chess_type = m_engine.get_chessman_type(chessman); if(chess_type<0||chess_type>13) return; Gdk::Point p = get_coordinate(x, y); int px = p.get_x() - chessman_width / 2; int py = p.get_y() - chessman_width / 2; ui_pixmap->draw_pixbuf(get_style()->get_black_gc(),chessman_images[chess_type], 0, 0, px, py, chessman_images[chess_type]->get_width(), chessman_images[chess_type]->get_height(), Gdk::RGB_DITHER_NONE, 0, 0); } void Board::draw_show_can_move() { if(!is_fight_to_robot()&& !is_network_game()) return; if (selected_chessman < 0 ) return; std::vector points; m_engine.gen_which_can_move(points, selected_chessman, is_rev_board); std::vector::iterator iter = points.begin(); for(;iter != points.end(); ++iter){ Gdk::Point p = get_coordinate(iter->get_x(), iter->get_y()); draw_phonily_point(p); } } void Board::draw_phonily_point(Gdk::Point& p) { int px = p.get_x() - 11 / 2; int py = p.get_y() - 11 / 2; //int px = p.get_x() - chessman_width / 2; //int py = p.get_y() - chessman_width / 2; //ui_pixmap->copy_to_image(selected_chessman_image, px, py, 0, 0, chessman_width, chessman_width); //ui_pixmap->draw_pixbuf(get_style()->get_black_gc(),chessman_images[SELECTED_CHESSMAN], // 0, 0, px, py, chessman_images[SELECTED_CHESSMAN]->get_width(), chessman_images[SELECTED_CHESSMAN]->get_height(), // Gdk::RGB_DITHER_NONE, 0, 0); ui_pixmap->copy_to_image(selected_chessman_image, px, py, 0, 0, 11, 11); ui_pixmap->draw_pixbuf(get_style()->get_black_gc(),chessman_images[PROPMT], 0, 0, px, py, chessman_images[PROPMT]->get_width(), chessman_images[PROPMT]->get_height(), Gdk::RGB_DITHER_NONE, 0, 0); int x,y; ui_pixmap->get_size(x,y); this->get_window()->draw_drawable(this->get_style()->get_black_gc(),ui_pixmap, 0,0, 0,0, x,y); } void Board::draw_select_frame(bool selected) { if (selected_chessman < 0 || selected_x == -1 || selected_y == -1) return; /** 目前要做的是根据棋子代号,获取它所在的棋盘9x10坐标*/ //Gdk::Point p = get_coordinate(selected_x, selected_y); int sx,sy; m_engine.get_xy_from_chess(selected_chessman,sx,sy,is_rev_board); Gdk::Point p = get_coordinate(sx, sy); int px = p.get_x() - chessman_width / 2; int py = p.get_y() - chessman_width / 2; if (selected) { ui_pixmap->copy_to_image(selected_chessman_image, px, py, 0, 0, chessman_width, chessman_width); ui_pixmap->draw_pixbuf(get_style()->get_black_gc(),chessman_images[SELECTED_CHESSMAN], 0, 0, px, py, chessman_images[SELECTED_CHESSMAN]->get_width(), chessman_images[SELECTED_CHESSMAN]->get_height(), Gdk::RGB_DITHER_NONE, 0, 0); } else { ui_pixmap->draw_image (get_style()->get_black_gc(), selected_chessman_image, 0, 0, px, py, -1, -1); } int x,y; ui_pixmap->get_size(x,y); this->get_window()->draw_drawable(this->get_style()->get_black_gc(),ui_pixmap, 0,0, 0,0, x,y); } void Board::draw_board() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 10; j++) { draw_chessman(i, j, m_engine.get_piece(i, j,is_rev_board)); } } } void Board::draw_trace(int mv) { int src = m_engine.get_move_src(mv); int dst = m_engine.get_move_dst(mv); Glib::RefPtr gc = this->get_style()->get_white_gc(); gc->set_rgb_fg_color(Gdk::Color(color)); Gdk::Point s1 =get_coordinate(m_engine.RANK_X(src)-3,m_engine.RANK_Y(src)-3); Gdk::Point s2 =get_coordinate(m_engine.RANK_X(dst)-3,m_engine.RANK_Y(dst)-3); gc->set_line_attributes(4,Gdk::LINE_SOLID, Gdk::CAP_NOT_LAST, Gdk::JOIN_BEVEL); std::vector poss; poss.push_back(s1); poss.push_back(s2); ui_pixmap->draw_lines(gc, poss); } void Board::first_move() { m_step = 0; m_engine.get_snapshot(m_step); /** 设置此步的注释*/ /** set the comment of this move*/ std::string* str=m_engine.get_comment(m_step); if(str != NULL){ parent.set_comment(*str); } else parent.set_comment(" "); CSound::play(SND_MOVE); redraw(); } void Board::last_move() { m_step = m_engine.how_step(); m_engine.get_snapshot(m_step); /** 设置此步的注释*/ /** set the comment of this move*/ std::string* str=m_engine.get_comment(m_step); if(str != NULL){ parent.set_comment(*str); } else parent.set_comment(" "); CSound::play(SND_MOVE); redraw(); } void Board::next_move() { m_step++; int all_step = m_engine.how_step(); if(m_step> all_step) m_step = all_step; m_engine.get_snapshot(m_step); /** 设置此步的注释*/ /** set the comment of this move*/ std::string* str=m_engine.get_comment(m_step); if(str != NULL){ parent.set_comment(*str); } else parent.set_comment(" "); CSound::play(SND_MOVE); redraw(); } void Board::back_move() { m_step--; if(m_step<0) m_step =0; m_engine.get_snapshot(m_step); DLOG("m_step = %d\n",m_step); /** 设置此步的注释*/ /** set the comment of this move*/ std::string* str=m_engine.get_comment(m_step); if(str != NULL){ parent.set_comment(*str); } else parent.set_comment(" "); CSound::play(SND_MOVE); redraw(); } void Board::get_board_by_move(int f_step) { //m_step = (num+1)*2; int all_step = m_engine.how_step(); if(f_step> all_step) f_step = all_step; DLOG("m_step = %d\n",f_step); m_engine.get_snapshot(f_step); m_step = f_step; /** 设置此步的注释*/ /** set the comment of this move*/ std::string* str=m_engine.get_comment(f_step); if(str != NULL){ parent.set_comment(*str); } else parent.set_comment(" "); redraw(); } int Board::try_move(int dst_x,int dst_y) { int dst = m_engine.get_dst_xy(dst_x,dst_y,is_rev_board); int src = m_engine.get_chessman_xy(selected_chessman); int mv = m_engine.get_move(src,dst); return try_move(mv); } int Board::try_move(int mv) { int eat = m_engine.get_move_eat(mv); int dst= m_engine.get_move_dst(mv); /** 对着法进行逻辑检测*/ /** check the logic of the move */ if(m_engine.make_move(mv)){ /** 执行着法*/ //m_engine.do_move(mv); /** 将着法中文表示加到treeview中*/ /** and the chinese moves to treeview */ Glib::ustring mv_chin = m_engine.get_chinese_last_move(); int num = m_engine.how_step(); parent.add_step_line(num,mv_chin); if(eat) CSound::play(SND_EAT); else CSound::play(SND_MOVE); redraw_with_line(mv,true); selected_chessman = m_engine.get_piece(dst); printf("move = %d finish move and redraw now\n",mv); selected_chessman=-1; std::string iccs_str=m_engine.move_to_iccs_str(mv); /** 对战时的处理*/ if(is_fight_to_robot()){ if(eat){ moves_lines.clear(); moves_lines =postion_str+ m_engine.get_last_fen_from_snapshot()+std::string(" -- 0 1 "); } else{ size_t pos = moves_lines.find("moves"); if(pos == std::string::npos){ moves_lines=moves_lines + " -- 0 1 moves "+iccs_str; }else{ moves_lines=moves_lines + " "+iccs_str; } } /** then send the moves_lines to ucci engine(robot)*/ std::cout<<"moves_lines = "<read(filename)<0){ /** open fail */ return -1; } m_step = m_engine.how_step(); m_status = READ_STATUS ; redraw(); return 0; } void Board::on_drog_data_received(const Glib::RefPtr& context, int, int, const Gtk::SelectionData& selection_data, guint,guint f_time) { if((selection_data.get_length() >= 0)&&(selection_data.get_format()== 8)) { context->drag_finish(false,false,f_time); std::string filename = wind_unescape_string(selection_data.get_text().c_str(), NULL); size_t pos = filename.find('\r'); if (std::string::npos != pos) filename = filename.substr(7, pos-7); parent.open_file(filename); } } void Board::free_game(bool redraw_) { if(timer.connected()) timer.disconnect(); m_robot.send_ctrl_command("quit\n"); m_robot.stop(); m_status = FREE_STATUS; is_rev_board=false; m_human_black=false; if(redraw_){ m_engine.init_snapshot(start_fen); redraw(); } } void Board::rev_game() { is_rev_board=1-is_rev_board; m_human_black=1-m_human_black; redraw(); } void Board::start_robot(bool new_) { m_status = FIGHT_STATUS; m_robot.set_engine(engine_name); m_robot.start(); m_robot.send_ctrl_command("ucci\n"); if(new_) new_game(m_status); else chanju_game(m_status); } void Board::set_level_config(int _depth,int _idle,int _style,int _knowledge,int _pruning,int _randomness,bool _usebook) { m_search_depth = _depth; m_usebook = _usebook; } void Board::set_time(int _step_time, int _play_time) { step_time = _step_time; play_time = _play_time; } void Board::set_war_time(int _step_time,int _play_time) { limit_count_time = _step_time; red_time = _play_time*60; black_time = _play_time* 60; } void Board::set_level() { /** test simple*/ m_robot.send_ctrl_command("setoption idle large\n"); m_robot.send_ctrl_command("setoption style risky\n"); m_robot.send_ctrl_command("setoption knowledge none\n"); m_robot.send_ctrl_command("setoption pruning large\n"); m_robot.send_ctrl_command("setoption randomness large\n"); if(m_usebook) m_robot.send_ctrl_command("setoption usebook false\n"); else m_robot.send_ctrl_command("setoption usebook true\n"); } void Board::start_network() { set_war_time(300,30); new_game(NETWORK_STATUS); } void Board::chanju_game(BOARD_STATUS _status) { m_status = _status; std::string cur_fen = m_engine.get_current_snapshot(); m_engine.init_snapshot(cur_fen.c_str()); if(m_status == FIGHT_STATUS){ set_war_time(step_time,play_time); m_robot.send_ctrl_command("setoption newgame\n"); set_level(); } DLOG("current fen = %s\n", cur_fen.c_str()); moves_lines.clear(); moves_lines = postion_str + cur_fen; redraw(); parent.textview_engine_log_clear(); parent.change_play(is_human_player()); timer=Glib::signal_timeout().connect(sigc::mem_fun(*this,&Board::go_time),1000); /**如果是用户选择黑方,则电脑先走棋 -- if user choose black,the robot go moves first*/ if(m_human_black){ if(m_status == FIGHT_STATUS){ moves_lines =moves_lines +std::string(" -- 0 1 "); m_robot.send_ctrl_command(moves_lines.c_str()); m_robot.send_ctrl_command("\n"); char str_cmd[256]; sprintf(str_cmd,"go depth %d \n",m_search_depth); m_robot.send_ctrl_command(str_cmd); }else if(m_status == NETWORK_STATUS){ } } parent.set_red_war_time(to_time_ustring(red_time),to_time_ustring(0)); parent.set_black_war_time(to_time_ustring(black_time),to_time_ustring(0)); } void Board::new_game(BOARD_STATUS _status) { m_status = _status; m_engine.init_snapshot(start_fen); if(m_status == FIGHT_STATUS){ set_war_time(step_time,play_time); m_robot.send_ctrl_command("setoption newgame\n"); set_level(); } moves_lines.clear(); moves_lines = postion_str + std::string(start_fen); redraw(); parent.textview_engine_log_clear(); parent.change_play(is_human_player()); timer=Glib::signal_timeout().connect(sigc::mem_fun(*this,&Board::go_time),1000); /**如果是用户选择黑方,则电脑先走棋 -- if user choose black,the robot go moves first*/ if(m_human_black){ if(m_status == FIGHT_STATUS){ moves_lines =moves_lines +std::string(" -- 0 1 "); m_robot.send_ctrl_command(moves_lines.c_str()); m_robot.send_ctrl_command("\n"); char str_cmd[256]; sprintf(str_cmd,"go depth %d \n",m_search_depth); m_robot.send_ctrl_command(str_cmd); }else if(m_status == NETWORK_STATUS){ } } parent.set_red_war_time(to_time_ustring(red_time),to_time_ustring(0)); parent.set_black_war_time(to_time_ustring(black_time),to_time_ustring(0)); } bool Board::robot_log(const Glib::IOCondition& condition) { /*for testing,delete me*/ char buf[1024] = {0}; int buf_len = 1024; char* p = buf; for (; buf_len > 0; ) { int len = m_robot.get_robot_log(p, buf_len); if (len <= 0) break; p += len; buf_len -= len; } if (buf_len > 0) { *p = 0; printf("%s", buf); std::string str_buf(buf); parent.show_textview_engine_log(str_buf); size_t pos_=str_buf.find("draw"); if(pos_ != std::string::npos){ printf("计算机同意和棋\n"); if (parent.on_end_game(ROBOT_DRAW)) { if(timer.connected()) timer.disconnect(); return 1; } } pos_=str_buf.find("resign"); if(pos_ != std::string::npos){ if(timer.connected()) timer.disconnect(); parent.on_end_game(ROBOT_LOSE); return true; } pos_=str_buf.find("nobestmove"); if(pos_ != std::string::npos){ if(timer.connected()) timer.disconnect(); parent.on_end_game(ROBOT_LOSE); return true; } size_t pos=str_buf.find("bestmove"); if(pos != std::string::npos){ std::string t_mv=str_buf.substr(pos+9,4); std::cout<<"get robot mv = "<limit_count_time-10 && count_time<= limit_count_time){ printf("time out,you less time: %d\n",limit_count_time-count_time); reckon_time_sound(limit_count_time-count_time); } else if(count_time > limit_count_time || red_time<0 ){ printf(" time limit ,you lose\n"); if(timer.connected()) timer.disconnect(); parent.on_end_game(HUMAN_OVER_TIME); count_time =0; if(is_network_game()) send_to_socket("timeout"); } } else{ black_time--; count_time++; parent.set_black_war_time(to_time_ustring(black_time),to_time_ustring(count_time)); //printf("black_time: %d\n",black_time); if(count_time>limit_count_time-10 && count_time<=limit_count_time){ printf("time out,bot waster much time\n"); m_robot.send_ctrl_command("stop\n"); } else if(count_time >limit_count_time || black_time<0 ){ printf(" time limit ,robot lose\n"); if(timer.connected()) timer.disconnect(); parent.on_end_game(ROBOT_OVER_TIME); count_time =0; if(is_network_game()) send_to_socket("timeout"); } } return true; } void Board::set_board_size(BOARDSIZE sizemode) { switch(sizemode){ case BIG_BOARD: is_small_board=false; this->set_size_request(521,577); break; case SMALL_BOARD: is_small_board=true; this->set_size_request(221,277); break; default: g_warn_if_reached(); break; } } void Board::reckon_time_sound(int time_) { switch(time_){ case 0: CSound::play(SND_0); break; case 1: CSound::play(SND_1); break; case 2: CSound::play(SND_2); break; case 3: CSound::play(SND_3); break; case 4: CSound::play(SND_4); break; case 5: CSound::play(SND_5); break; case 6: CSound::play(SND_6); break; case 7: CSound::play(SND_7); break; case 8: CSound::play(SND_8); break; case 9: CSound::play(SND_9); break; case 10: CSound::play(SND_10); break; default: break; } } void Board::watch_socket(int fd) { fd_recv_skt=fd; Glib::signal_io().connect(sigc::mem_fun(*this,&Board::on_network_io), fd_recv_skt, Glib::IO_IN); } bool Board::on_network_io(const Glib::IOCondition& ) { int fd_cli = -1; EC_THROW(-1 == (fd_cli = accept(fd_recv_skt, NULL, 0))); char buf[1024] = {0}; size_t len = read(fd_cli, &buf[0], 1023); buf[len]=0; if (len > 0) { std::string str_buf(buf); size_t pos; //size_t pos_=str_buf.find("network-game-red"); if((pos = str_buf.find("moves:")) != std::string::npos){ std::string t_mv=str_buf.substr(pos+6,4); std::cout<<"get robot mv = "<0){ close(fd_send_skt); fd_send_skt=-1; } } void Board::save_board_to_file(const std::string& filename) { int w,h; ui_pixmap->get_size(w, h); Glib::RefPtr png = Gdk::Pixbuf::create((Glib::RefPtr) ui_pixmap, 0, 0, w, h); png->save(filename, "png"); } gmchess-0.29.6.3/src/Board.h000066400000000000000000000210241323660377300154020ustar00rootroot00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Board.h * Copyright (C) wind 2009 * */ #ifndef _BOARD_H_ #define _BOARD_H_ #include #include #include #include "gmchess.h" #include "Engine.h" #include "Pgnfile.h" #include "robot.h" //#include "pidgin.h" class MainWindow; /** * @brief 棋盘类 * 负责棋盘和棋子的绘画 * 棋盘9x10坐标是由左上角开始0x0- 9x10 * * describe the chess board * draw the board and chess, the board is 9x10 * start with 0x0 ,and with 9x10 */ class Board : public Gtk::DrawingArea { public: Board(MainWindow& win); ~Board(); const Board_info& get_board_info(){ return p_pgnfile->get_board_info() ;} void watch_socket(int fd); bool on_network_io(const Glib::IOCondition&); int init_send_socket(); void close_send_socket(); void send_to_socket(const std::string& cmd_); void set_themes(const std::string& themes_); void set_trace_color(const std::string& color_); protected: void on_map(); bool on_expose_event(GdkEventExpose* ev); bool on_configure_event(GdkEventConfigure* ev); bool on_button_press_event(GdkEventButton* ev); Glib::RefPtr get_pic(const std::string& name_); Glib::RefPtr get_spic(const std::string& name_); /** 由棋盘9x10坐标得到棋盘真实坐标*/ /** get the true coordinate from 9x10 position*/ Gdk::Point get_coordinate(int pos_x, int pos_y); /** 由棋盘真实坐标得到棋盘9x10坐标*/ /** get the 9x10 position from the true coordinate*/ Gdk::Point get_position(int pos_x, int pos_y); /** 获取棋盘格子的长与宽*/ /** get the length and height with a chess grid */ void get_grid_size(int& width, int& height); /** * @brief 画棋盘背景 * draw the background of board */ void draw_bg(); /** * @brief 画棋子 坐标为棋盘9x10坐标 * draw the chess * @param x x坐标 * @param y y坐标 * @param chess_type 棋子的类型,the type of chess */ void draw_chessman(int x, int y, int chess_type); /** * @brief 根据棋盘数组画出对局 * draw the station of board from chess array */ void draw_board(); /** 画选择棋子边框 */ /** draw the frame of chess */ void draw_select_frame(bool selected = true); /** show which can move in by select chess */ void draw_show_can_move(); /** draw prompt move point */ void draw_phonily_point(Gdk::Point& p); void draw_localize(Glib::RefPtr& gc, int x, int y, int place); void draw_palace(Glib::RefPtr& gc, int x, int y); /** 处理拖文件事件*/ /** handle the event of drog */ void on_drog_data_received(const Glib::RefPtr& context, int,int,const Gtk::SelectionData& selection_data, guint,guint time); public: void set_engine(const std::string& name){engine_name = name; } /** 启动AI对战,将会启动引擎进程*/ /** start the AI engine*/ void start_robot(bool new_ = true); /** 开启新游戏,即在引擎已启动的情况下重新游戏*/ /** start a new game,with the presence engine*/ void new_game(BOARD_STATUS _status = FIGHT_STATUS); void chanju_game(BOARD_STATUS _status = FIGHT_STATUS); /** 自由模式,即摆棋*/ /** free game mode*/ /** @param redraw 为真则重画棋盘,假则保留棋盘现状*/ void free_game(bool redraw=true); /** 网络对战初始化*/ /** network play game initial*/ void start_network(); /** 读取AI的输出,并根据输出的着法走棋*/ /** read the output of AI,then go chess*/ bool robot_log(const Glib::IOCondition& condition); /** 回到最初局面*/ /** return the first station*/ void first_move(); /** 去到最后的局面*/ /** go to the last station */ void last_move(); /** 读谱状态下走下一步棋*/ /** go next on reading chessbook*/ void next_move(); /** 读谱状态下走上一步棋*/ /** go previous on reading chessbook */ void back_move(); /** 重画棋盘界面*/ /** redraw the board*/ void redraw(); /** redraw the board with move trace*/ void redraw_with_line(int mv,bool select); /** 根据treeview的棋局着法获得棋盘局面*/ /** get the board station from chess move */ void get_board_by_move(int num); /** * 根据x,y坐标(棋盘9x10坐标)获取到达的坐标,与选择的棋子达成着法 * 进行尝试性走棋 */ /** try to go move,(x,y) is the 9x10 position */ int try_move(int x,int y); /** * 直接根据着法尝试性走棋 */ /** try to go move, mv is chess move*/ int try_move(int mv); /** 悔棋*/ /** go rue move*/ void rue_move(); /** 和棋处理*/ /** go draw move*/ void draw_move(); /** 打开棋谱文件*/ /** open the chessbook */ int open_file(const std::string& filename); /** 返回中文着法表达示快照集*/ /** return the snapshot which chinese moves*/ const std::vector& get_move_chinese_snapshot() {return m_engine.get_move_chinese_snapshot();}; /** 返回程序棋盘状态:读谱,与电脑对战,网络对战,自由摆棋*/ /** return the mode: reading,AI war,net war,free game*/ int get_status(){ return m_status; } int get_step(){ return m_step; } /** 标识是否与电脑AI对战*/ /** check is fight to AI */ bool is_fight_to_robot(){ return m_status == FIGHT_STATUS;} /** 标识是否网络对战中*/ /** check is fight on network */ bool is_network_game() { return m_status == NETWORK_STATUS; } /** 检测是不是当前用户走棋 -- check if the human user going to move */ bool is_human_player(){ return m_engine.red_player()-m_human_black ; } bool is_rev_game() { return is_rev_board;} /** 走时函数*/ /** check go time*/ bool go_time(); /** 将数字转成时间显示*/ /** digit convert to time show */ Glib::ustring to_time_ustring(int); /** 将秒转成毫秒的string显示*/ /** convert second to msecond show*/ Glib::ustring to_msec_ustring(int); /** 设置AI等级*/ /** set the level of AI */ void set_level(); void configure_board(int _width); /** 反转棋盘*/ void rev_game(); void set_board_size(BOARDSIZE sizemode); /** 设置引擎搜索深度*/ void set_level_config(int _depth,int _idle,int _style,int _knowledge,int _pruning,int _randomness,bool _usebook); /** 设置对战时的走棋时间和总局时间*/ void set_war_time(int _step_time,int _play_time); /** 设置保存的走棋时间和总局时间*/ void set_time(int _step_time,int _play_time); /** 倒计时的声音*/ void reckon_time_sound(int time_); /** 测试保存棋盘局面为图像文件*/ void save_board_to_file(const std::string& filename); void draw_trace(int mv); private: /** 加载所需要图片进内存*/ /** load all images in memory */ void load_images(); private: MainWindow& parent; /** 着法引擎 */ Engine m_engine; /** UCCI engine interface*/ Robot m_robot; /** 读PGN文件类*/ Pgnfile* p_pgnfile; /** 传递给AI的着法状态*/ std::string moves_lines; /** 着法状态开头序列,potions fen xxx*/ const std::string postion_str; std::string engine_name; /** 所使用的主题*/ std::string theme; std::string color; /** 背景图像 */ Glib::RefPtr bg_image; Glib::RefPtr ui_pixmap; /** 棋子图像 */ Glib::RefPtr chessman_images[18]; /** 选中图像*/ Glib::RefPtr selected_chessman_image; /** 选中的棋盘9x10坐标*/ int selected_x; int selected_y; /** 选中的棋子,值为代号,16-31红,32-47黑*/ int selected_chessman; /** 步时 */ int m_step; /** 棋局状态*/ BOARD_STATUS m_status; /** 红方的局时*/ int red_time; /** 黑方的局时*/ int black_time; /** 用以保存和电脑下棋的局时和步时*/ int play_time; int step_time; /** 计时,走秒*/ int count_time; /** 每步时的极限秒数*/ int limit_count_time; /** 接受命令的socket*/ int fd_recv_skt; /** 发送命令的socket*/ int fd_send_skt; sigc::connection timer; /** 对战状态中标识是否用户走棋,true是用户,false是AI*/ //bool user_player; /** 棋子的宽度,大的57,小的29*/ /** width of chessman */ int chessman_width ; /** 是否小棋盘*/ bool is_small_board; /** 是否反转棋盘*/ bool is_rev_board; /** 搜索深度-- search depth */ int m_search_depth; /** 是否使用开局库 -- use open book*/ bool m_usebook; /** 用户选择黑方棋子 -- the human choose the black player*/ bool m_human_black; }; #endif // _BOARD_H_ gmchess-0.29.6.3/src/BookView.cc000066400000000000000000000116271323660377300162460ustar00rootroot00000000000000/* * ===================================================================================== * * Filename: BookView.cpp * * Description: * * Version: 0.11 * Created: 2009年03月31日 13时55分18秒 * Revision: none * Compiler: g++ * * Author: lerosua@gmail.com * Company: cyclone * * ===================================================================================== */ #include "MainWindow.h" #include "BookView.h" #include #include #include #include #include BookView::BookView(MainWindow* parent):m_parent(parent) { this->set_flags(Gtk::CAN_FOCUS); this->set_rules_hint(false); m_refTreeModel = Gtk::TreeStore::create(m_columns); this->set_model( m_refTreeModel); this->append_column(_("Book"), m_columns.title); this->show(); } BookView::~BookView() { } Gtk::TreeModel::iterator BookView::add_group(const Glib::ustring& group) { Gtk::TreeModel::iterator iter = m_refTreeModel->append(); (*iter)[m_columns.title]=group; (*iter)[m_columns.type] = GROUP; return iter; } Gtk::TreeModel::iterator BookView::add_group(const Glib::ustring& g_parent,const Glib::ustring& group) { if(g_parent=="book"){ return add_group(group); } Gtk::TreeModel::Children children = m_refTreeModel->children(); Gtk::TreeModel::iterator listiter; listiter = getListIter(children,g_parent); if(listiter == children.end()) listiter = add_group(g_parent); Gtk::TreeModel::iterator iter = m_refTreeModel->append(listiter->children()); (*iter)[m_columns.title]=group; (*iter)[m_columns.type] = GROUP; return iter; } void BookView::add_line(const Glib::ustring& groupname,const Glib::ustring& f_line,const Glib::ustring& f_path) { Gtk::TreeModel::Children children = m_refTreeModel->children(); Gtk::TreeModel::iterator listiter; listiter = getListIter(children,groupname); if(listiter == children.end()){ //listiter = add_group(groupname); Gtk::TreeModel::iterator t_iter=children.begin(); Gtk::TreeModel::Children grandson= (*t_iter)->children(); do{ listiter = getListIter(grandson,groupname); if(listiter != grandson.end()) break; t_iter++; grandson= (*t_iter)->children(); }while(t_iter!=children.end()); if(listiter == grandson.end()) return; } Gtk::TreeModel::iterator iter = m_refTreeModel->append(listiter->children()); (*iter)[m_columns.title] = f_line; (*iter)[m_columns.type] = MEMBER; (*iter)[m_columns.path]= f_path; } Gtk::TreeModel::iterator BookView::getListIter(Gtk::TreeModel:: Children children, const std::string& groupname) { return find_if(children.begin(), children.end(), bind2nd(Compare(m_columns),groupname)); } bool BookView::on_button_press_event(GdkEventButton * ev) { bool result = Gtk::TreeView::on_button_press_event(ev); Glib::RefPtr < Gtk::TreeSelection > selection = this->get_selection(); Gtk::TreeModel::iterator iter = selection->get_selected(); if (!selection->count_selected_rows()) return result; Gtk::TreeModel::Path path(iter); Gtk::TreeViewColumn * tvc; int cx, cy; /** get_path_at_pos() 是为确认鼠标是否在选择行上点击的*/ if (!this-> get_path_at_pos((int) ev->x, (int) ev->y, path, tvc, cx, cy)) return false; if ((ev->type == GDK_2BUTTON_PRESS || ev->type == GDK_3BUTTON_PRESS) && ev->button != 3) { if(GROUP != (*iter)[m_columns.type]){ Glib::ustring t_file = (*iter)[m_columns.path]; DLOG("open file %s \n",t_file.c_str()); m_parent->open_file(t_file.c_str()); } else { if(this->row_expanded(path)) this->collapse_row(path); else{ this->expand_row(path,false); this->scroll_to_row(path); } } } else if ((ev->type == GDK_BUTTON_PRESS) && (ev->button == 3)) { /* if(GROUP_CHANNEL == (*iter)[m_columns.type]) return false; Gtk::Menu* pop_menu = parent->get_channels_pop_menu(); if (pop_menu) pop_menu->popup(ev->button, ev->time); return true; */ } return false; } int BookView::load_book_dir(const char* Path) { DIR *dirp; struct dirent * node; char cPath[1024]; struct stat pStat; if(mkdir(Path, 0755)==-1 && errno != EEXIST) { printf("Unable to create folder %s\n", Path); return -1; } if((dirp= opendir(Path))==NULL){ printf("Could not read folder %s\n",Path); return -1; } while(( node = readdir(dirp))!= NULL){ if((strcmp(node->d_name, ".") ==0) || (strcmp(node->d_name, "..") == 0)) continue; strcpy(cPath,Path); strcat(cPath,"/"); strcat(cPath,node->d_name); //stat(node->d_name, &pStat); stat(cPath, &pStat); if(S_ISDIR(pStat.st_mode)){ //printf(" dir = %s \n",cPath); /** 是目录,继续打开读*/ /** it is a directory,continue read */ add_group(basename((char*)Path),basename(cPath)); load_book_dir(cPath); }else{ //printf(" add file = %s\n",basename(node->d_name)); add_line(basename((char*)Path),node->d_name,cPath); } } closedir(dirp); return 0; } gmchess-0.29.6.3/src/BookView.h000066400000000000000000000040371323660377300161050ustar00rootroot00000000000000/* * ===================================================================================== * * Filename: BookView.h * * Description: 棋书目录管理 * * Version: 0.11 * Created: 2009年03月31日 13时55分18秒 * Revision: none * Compiler: g++ * * Author: lerosua@gmail.com * Company: cyclone * * ===================================================================================== */ #ifndef _BOOK_VIEW_H_ #define _BOOK_VIEW_H_ #include #include #include #include #include enum{ GROUP,MEMBER}; class MainWindow; class BookView: public Gtk::TreeView { public: BookView(MainWindow* parent); ~BookView(); Gtk::TreeModel::iterator getListIter(Gtk::TreeModel:: Children children, const std::string& groupname); /** 添加组*/ /** add group */ Gtk::TreeModel::iterator add_group(const Glib::ustring& group); Gtk::TreeModel::iterator add_group(const Glib::ustring& g_parent,const Glib::ustring& group); /** 添加行内容*/ /** add line context */ void add_line(const Glib::ustring& groupname,const Glib::ustring& f_line,const Glib::ustring& f_path); bool on_button_press_event(GdkEventButton *); int load_book_dir(const char* path); protected: class Columns:public Gtk::TreeModel::ColumnRecord { public: Columns() { add(title); add(path); add(type); } Gtk::TreeModelColumn title; Gtk::TreeModelColumn path; Gtk::TreeModelColumn type; }; Columns m_columns; Glib::RefPtr m_refTreeModel; MainWindow* m_parent; private: struct Compare:public std::binary_function < Gtk::TreeModel::Row, const Glib::ustring,bool >{ explicit Compare(const Columns& column_):column(column_) {} bool operator () (const Gtk::TreeRow& lhs, const Glib::ustring& var) const { return lhs[column.title] == var; } const Columns& column; }; }; #endif gmchess-0.29.6.3/src/ConfWindow.cc000066400000000000000000000072701323660377300165750ustar00rootroot00000000000000/* * ===================================================================================== * * Filename: ConfWindow.cc * * Description: * * Version: 1.0 * Created: 2009年06月19日 21时41分51秒 CST * Revision: none * Compiler: gcc * * Author: lerosua (), lerosua@gmail.com * Company: Cyclone * * ===================================================================================== */ #include "ConfWindow.h" #include "MainWindow.h" ConfWindow::ConfWindow(MainWindow * parent_):parent(parent_) ,m_size_big(true) ,m_depth("10") ,m_step_time("240") ,m_play_time("40") { vbox_xml = Gtk::Builder::create_from_file(conf_ui,"conf_vbox"); if(!vbox_xml) exit(271); Gtk::VBox * vBox = 0; vbox_xml->get_widget("conf_vbox", vBox); Gtk::SpinButton* spinbt =0; vbox_xml->get_widget("sb_depth",spinbt); Gtk::Adjustment* adjust = spinbt->get_adjustment(); adjust->set_lower(1.0); adjust->set_upper(15.0); adjust->set_step_increment(1.0); Gtk::Button* bt = 0; vbox_xml->get_widget("button_ok", bt); bt->signal_clicked().connect(sigc::mem_fun(*this,&ConfWindow::on_button_save)); bt = 0; vbox_xml->get_widget("button_cancel", bt); bt->signal_clicked().connect(sigc::mem_fun(*this,&ConfWindow::on_button_cancel)); vbox_xml->get_widget("colorbutton",colorBt); colorBt->signal_color_set().connect(sigc::mem_fun(*this, &ConfWindow::on_button_color_set)); m_line_color = GMConf["line_color"]; colorBt->set_color(Gdk::Color(m_line_color)); std::string& size_big = GMConf["desktop_size"]; m_size_big = (!size_big.empty())&&(size_big[0]=='1'); std::string& use_book = GMConf["usebook"]; m_usebook = (!use_book.empty()) && (use_book[0] == '1'); m_depth = GMConf["engine_depth"] ; if(!GMConf["step_time"].empty()) m_step_time = GMConf["step_time"] ; if(!GMConf["play_time"].empty()) m_play_time = GMConf["play_time"] ; m_theme = GMConf["themes"]; m_engine_name = GMConf["engine_name"]; Gtk::HBox* hbox = 0; vbox_xml->get_widget("hbox_theme", hbox); cbtheme = Gtk::manage(new Gtk::ComboBoxText); cbtheme->append_text("wood"); cbtheme->append_text("west"); if(m_theme == "wood") cbtheme->set_active_text("wood"); else cbtheme->set_active_text("west"); hbox->pack_start(*cbtheme); m_pVariablesMap = new VariablesMap(vbox_xml); m_pVariablesMap->connect_widget("b_radiobutton",m_size_big); m_pVariablesMap->connect_widget("cb_book",m_usebook); m_pVariablesMap->connect_widget("sb_depth",m_depth); m_pVariablesMap->connect_widget("entry_step_time",m_step_time); m_pVariablesMap->connect_widget("entry_play_time",m_play_time); m_pVariablesMap->connect_widget("entry_engine_name", m_engine_name); m_pVariablesMap->transfer_variables_to_widgets(); this->add(*vBox); this->set_transient_for(*parent); show_all(); } ConfWindow::~ConfWindow() { delete m_pVariablesMap; } void ConfWindow::on_button_save() { write_to_GMConf(); signal_quit_.emit(); on_button_cancel(); } void ConfWindow::on_button_cancel() { parent->on_conf_window_close(); } void ConfWindow::on_button_color_set() { Gdk::Color _color = colorBt->get_color(); m_line_color = _color.to_string(); } bool ConfWindow::on_delete_event(GdkEventAny*) { on_button_cancel(); } void ConfWindow::write_to_GMConf() { m_pVariablesMap->transfer_widgets_to_variables(); GMConf["usebook"] = m_usebook? "1":"0"; GMConf["desktop_size"] = m_size_big?"1":"0"; GMConf["engine_depth"] = m_depth; GMConf["step_time"] = m_step_time; GMConf["play_time"] = m_play_time; GMConf["engine_name"] = m_engine_name; GMConf["line_color"] = m_line_color; if(cbtheme->get_active_text() == "wood") GMConf["themes"] = "wood"; else GMConf["themes"] = "west"; } gmchess-0.29.6.3/src/ConfWindow.h000066400000000000000000000030141323660377300164270ustar00rootroot00000000000000/* * ===================================================================================== * * Filename: ConfWindow.h * * Description: config window class * * Version: 1.0 * Created: 2009年06月19日 21时40分28秒 CST * Revision: none * Compiler: gcc * * Author: lerosua (), lerosua@gmail.com * Company: Cyclone * * ===================================================================================== */ #ifndef CONFWINDOW_FILE_HEADER_INC #define CONFWINDOW_FILE_HEADER_INC #include #include "variablesmap.h" #define conf_ui DATA_DIR"/confwin.glade" class MainWindow; class ConfWindow: public Gtk::Window { public: ConfWindow(MainWindow* parent_); ~ConfWindow(); void on_button_save(); void on_button_cancel(); void on_button_color_set(); bool on_delete_event(GdkEventAny*); typedef sigc::signal type_signal_quit; type_signal_quit signal_quit() { return signal_quit_; } void write_to_GMConf(); private: typedef Glib::RefPtr < Gtk::Builder> GBuilderXML; GBuilderXML vbox_xml; MainWindow* parent; type_signal_quit signal_quit_; VariablesMap* m_pVariablesMap; Gtk::ComboBoxText* cbtheme; Gtk::ColorButton* colorBt; Glib::ustring m_depth; Glib::ustring m_step_time; Glib::ustring m_play_time; Glib::ustring m_theme; Glib::ustring m_engine_name; Glib::ustring m_line_color; bool m_size_big; bool m_usebook; }; #endif /* ----- #ifndef CONFWINDOW_FILE_HEADER_INC ----- */ gmchess-0.29.6.3/src/Engine.cc000066400000000000000000001446761323660377300157410ustar00rootroot00000000000000/* * ===================================================================================== * * Filename: Engine.cc * * Description: * * Version: 1.0 * Created: 2009年02月14日 16时58分36秒 CST * Revision: none * Compiler: gcc * * Author: lerosua (), lerosua@gmail.com * Company: Cyclone * * ===================================================================================== */ #include "Engine.h" #include #include Engine::Engine():black_player(0) ,m_checked(0) { memset(chessboard, 0 , sizeof(chessboard)); memset(revchessboard, 0, sizeof(revchessboard)); memset(chessmans, 0, sizeof(chessmans)); clean_board(); } Engine::~Engine() {} void Engine::clean_board() { int i,j; for(i=0;i<16;i++) for(j=0;j<16;j++){ chessboard[i*16+j] =0; revchessboard[i*16+j] =0; } for(i=0;i<3;i++) for(j=0;j<16;j++) chessmans[i*16 + j]=0; } void Engine::reset() { clean_board(); black_player = 0; m_checked=0; fen_snapshots.clear(); move_snapshots.clear(); move_chinese.clear(); move_comment.clear(); } void Engine::add_piece(int sq,int pc) { chessboard[sq]=pc; chessmans[pc]=sq; } void Engine::add_comment(const std::string& str) { int step=how_step(); /** 直接赋值据说性能比较差*/ //move_comment[step] = str; move_comment.insert(std::map::value_type(step,str)); } std::string* Engine::get_comment(int f_step) { std::map::iterator iter = move_comment.find(f_step); if(iter == move_comment.end()){ /** 没找到 */ return NULL; } else{ return &(iter->second); } } void Engine::from_fens(const char *szFen) { int i, j, k; int pcRed[7]; int pcBlack[7]; const char *lpFen; // FEN串的识别包括以下几个步骤: // 1. 初始化,清空棋盘 pcRed[0] = side_tag(0) + KING_FROM; pcRed[1] = side_tag(0) + ADVISOR_FROM; pcRed[2] = side_tag(0) + BISHOP_FROM; pcRed[3] = side_tag(0) + KNIGHT_FROM; pcRed[4] = side_tag(0) + ROOK_FROM; pcRed[5] = side_tag(0) + CANNON_FROM; pcRed[6] = side_tag(0) + PAWN_FROM; for (i = 0; i < 7; i ++) { pcBlack[i] = pcRed[i] + 16; } /* 数组"pcRed[7]"和"pcBlack[7]"分别代表红方和黑方每个兵种即将占有的序号, * 以"pcRed[7]"为例,由于棋子16到31依次代表“帅仕仕相相马马车车炮炮兵兵兵兵兵”, * 所以最初应该是"pcRed[7] = {16, 17, 19, 21, 23, 25, 27}",每添加一个棋子,该项就增加1, * 这种做法允许添加多余的棋子(例如添加第二个帅,就变成仕了),但添加前要做边界检测 */ // ClearBoard(); lpFen = szFen; if (*lpFen == '\0') { // SetIrrev(); return; } // 2. 读取棋盘上的棋子 i = RANK_TOP; j = FILE_LEFT; while (*lpFen != ' ') { if (*lpFen == '/') { j = FILE_LEFT; i ++; if (i > RANK_BOTTOM) { break; } } else if (*lpFen >= '1' && *lpFen <= '9') { for (k = 0; k < (*lpFen - '0'); k ++) { if (j >= FILE_RIGHT) { break; } j ++; } } else if (*lpFen >= 'A' && *lpFen <= 'Z') { if (j <= FILE_RIGHT) { k = fen_to_piece(*lpFen); if (k < 7) { if (pcRed[k] < 32) { //if (this->ucsqchessmans[pcRed[k]] == 0) { add_piece(get_coord(j, i), pcRed[k]); pcRed[k] ++; //} } } j ++; } } else if (*lpFen >= 'a' && *lpFen <= 'z') { if (j <= FILE_RIGHT) { k = fen_to_piece(*lpFen); if ((k>6)&&(k < 14)) { if (pcBlack[k-7] < 48) { //printf("pcBlack[%d-7] = %d \n",k,pcBlack[k-7]); if (chessmans[pcBlack[k-7]] == 0) { add_piece(get_coord(j, i), pcBlack[k-7]); pcBlack[k-7] ++; } } } j ++; } } lpFen ++; if (*lpFen == '\0') { //SetIrrev(); return; } } lpFen ++; // 3. 确定轮到哪方走 if (this->black_player == (*lpFen == 'b' ? 0 : 1)) { change_side(); } // // 4. 把局面设成“不可逆” // SetIrrev(); } void Engine::to_fens(char *szFen) { int i, j, k, pc; char *lpFen; lpFen = szFen; for (i = RANK_TOP; i <= RANK_BOTTOM; i ++) { k = 0; for (j = FILE_LEFT; j <= FILE_RIGHT; j ++) { pc = chessboard[get_coord(j, i)]; if (pc != 0) { if (k > 0) { *lpFen = k + '0'; lpFen ++; k = 0; } *lpFen = piece_to_fen(get_chessman_type(pc)); lpFen ++; } else { k ++; } } if (k > 0) { *lpFen = k + '0'; lpFen ++; } *lpFen = '/'; lpFen ++; } *(lpFen - 1) = ' '; // 把最后一个'/'替换成' ' *lpFen = (this->black_player == 0 ? 'w' : 'b'); lpFen ++; *lpFen = '\0'; } void Engine::init_snapshot(const char* fen) { reset(); from_fens(fen); fen_snapshots.push_back(std::string(fen)); move_snapshots.push_back(0); sync_board(); } void Engine::get_snapshot(int num) { std::string fens = fen_snapshots[num]; //DLOG("get_snapshot = %s\n",fens.c_str()); clean_board(); from_fens(fens.c_str()); current_fen_snapshots = fens; sync_board(); } int Engine::get_piece(int rx,int ry,bool rev) { int site=0; site = get_coord(rx + 3,ry + 3); if(rev) return revchessboard[site]; else return chessboard[site]; } int Engine::get_rev_piece(int rx,int ry) { int site=0; site = get_coord(rx + 3,ry + 3); return revchessboard[site]; } int Engine::get_dst_xy(int rx, int ry,bool rev) { if(rev) return get_coord(11-rx,12-ry); else return get_coord(rx+3,ry+3); } void Engine::get_xy_from_chess(int f_chess,int& x,int& y,bool rev) { int xy=get_chessman_xy(f_chess); if(rev){ x=11-RANK_X(xy); y=12-RANK_Y(xy); }else{ x=RANK_X(xy)-3; y=RANK_Y(xy)-3; } } char Engine::get_iccs_y(int nArg) { int tmp = (nArg&240)>>4; switch(tmp){ case 3: return '9'; case 4: return '8'; case 5: return '7'; case 6: return '6'; case 7: return '5'; case 8: return '4'; case 9: return '3'; case 10: return '2'; case 11: return '1'; case 12: return '0'; default: return -1; }; } char Engine::get_iccs_x(int nArg) { return (nArg&15)+94; } /** iccs中的x坐标转成中文纵线的x坐标(红黑方坐标相反)*/ char Engine::alpha_to_digit(int nArg) { if(black_player){ return nArg-48; } else{ switch(nArg){ case 'i': return '1'; case 'h': return '2'; case 'g': return '3'; case 'f': return '4'; case 'e': return '5'; case 'd': return '6'; case 'c': return '7'; case 'b': return '8'; case 'a': return '9'; default: return -1; } } } char Engine::digit_to_alpha(int nArg) { if(!black_player){ switch(nArg){ case '1': return 'i'; case '2': return 'h'; case '3': return 'g'; case '4': return 'f'; case '5': return 'e'; case '6': return 'd'; case '7': return 'c'; case '8': return 'b'; case '9': return 'a'; default: return -1; } } else{ switch(nArg){ case '1': return 'a'; case '2': return 'b'; case '3': return 'c'; case '4': return 'd'; case '5': return 'e'; case '6': return 'f'; case '7': return 'g'; case '8': return 'h'; case '9': return 'i'; default: return -1; } } } /** * FEN串中棋子类型标识 */ int Engine::fen_to_piece(int nArg) { switch (nArg) { case 'K': return 0; case 'G': case 'A': return 1; case 'B': case 'E': return 2; case 'N': case 'H': return 3; case 'R': return 4; case 'C': return 5; case 'P': return 6; case 'k': return 7; case 'g': case 'a': return 8; case 'b': case 'e': return 9; case 'h': case 'n': return 10; case 'r': return 11; case 'c': return 12; case 'p': return 13; default: return 14; } } int Engine::knight_cmp(int y,int x) { if((x-y)<0) return x+1; else return x-1; } int Engine::get_knight_leg(int f_src, int f_dst) { int a=knight_cmp(RANK_Y(f_src),RANK_Y(f_dst)); int b=knight_cmp(RANK_X(f_src),RANK_X(f_dst)); return a*16+b; } /** * @brief Check if the player could mitigate checkmate status * 目前所有棋子的着法,检测走后是否能解除将军状态,如果都不行,则死棋 * 死棋检测耗资源巨大,最好设定一个将军标识,在被将军状态下再检测 * 这是在将军前提下检测死棋,没子走的情况暂不检测,公头被困死应该只剩下一个 * 公的状态下,这种状态另外搞吧,应该很简单。 * * 如果被将死,返回 false。 */ bool Engine::mate() { /** 没被将军,那就没事,有棋,bug是将/帅被困死 */ /** FIXME: 实现将帅被困死的情况,目前存在 bug */ m_checked = checked_by(); if(!m_checked) { return false; } /** * 轮到黑方走,则生成黑方所有的着法,并一一检测,如果都不能通过, * 则死棋,如果遇到一个能通过的,则马上返回false吧 */ DLOG("Checkmate evaluation started\n"); int src; int i; int dst; for (i = KING_FROM; i <= PAWN_TO; i++) { src = chessmans[side_tag(black_player) + i]; if (src) { int chess_t = get_chessman_type(get_piece(src)); switch (chess_t) { case RED_KING: case BLACK_KING: for (int k = 0; k < 4; k++) { dst = src + KingMoveTab[k]; if(in_fort(dst)){ int mv = get_move(src,dst); if(make_move(mv)){ undo_move(mv); return false; } } } break; case RED_ADVISOR: case BLACK_ADVISOR: for(int k=0;k<4;k++){ dst=src+AdvisorMoveTab[k]; if(in_fort(dst)){ int mv = get_move(src,dst); if(make_move(mv)){ undo_move(mv); return false; } } } break; case RED_BISHOP: case BLACK_BISHOP: for(int k=0;i<4;i++){ dst=src+BishopMoveTab[k]; if(in_board(dst)){ int mv = get_move(src,dst); if(make_move(mv)){ undo_move(mv); return false; } } } break; case RED_KNIGHT: case BLACK_KNIGHT: for(int k=0;k<8;k++){ dst=src+ KnightMoveTab[k]; if(in_board(dst)){ int mv = get_move(src,dst); if(make_move(mv)){ undo_move(mv); return false; } } } break; case RED_ROOK: case BLACK_ROOK: case RED_CANNON: case BLACK_CANNON: /** 向右移动*/ dst=src+1; while(in_board(dst)){ int mv = get_move(src,dst); if(make_move(mv)){ undo_move(mv); return false; } dst++; } /** 向左移动*/ dst=src-1; while(in_board(dst)){ int mv = get_move(src,dst); if(make_move(mv)){ undo_move(mv); return false; } dst--; } /** 向下移动*/ dst=src+16; while(in_board(dst)){ int mv = get_move(src,dst); if(make_move(mv)){ undo_move(mv); return false; } dst=dst+16; } /** 向上移动*/ dst=src-16; while(in_board(dst)){ int mv = get_move(src,dst); if(make_move(mv)){ undo_move(mv); return false; } dst=dst-16; } break; case RED_PAWN: case BLACK_PAWN: /** 兵的移动借助了将/帅的走法*/ for(int k=0;k<4;k++){ dst=src+KingMoveTab[k]; if(in_board(dst)){ int mv = get_move(src,dst); if(make_move(mv)){ undo_move(mv); return false; } } } break; default: break; }; } } return true; } /**检测当前局面是否有将军出现,并设置相应的状态位*/ int Engine::checked_by(void) { return checked_by(black_player); } /** * 将对方棋子连接到帅/将上的着法依次做逻辑检测,如果通过则说明将军 * @param player false 表示红方,即检测红是否被黑将车,true表示红将军黑 * @return 返回true即被将军,false即没事 */ int Engine::checked_by(bool player) { /** 获取本方的将/帅*/ int dst= chessmans[side_tag(player)+KING_FROM]; int src; int i; for (i = KNIGHT_FROM; i <= PAWN_TO; i ++) { if(src = chessmans[side_tag(1-player)+i]){ int mv = get_move(src,dst); if(logic_move(mv)){ DLOG("将军\n"); return 1; } } } return 0; } /** 目前只做基本检测,将军之类的走棋暂不考虑 * 着法的合法化有两种, * 一是先根据棋子生成合法的着法,然后检测目标着法是否 * 匹配,如果不匹配则为非法的着法。 * 二是只判断目标着法是否合法的着法即可,以下函数目前使用此方法 * * 还要考虑将帅碰头的情景,即此着法会造成将帅面对面不 **/ bool Engine::logic_move(int mv) { int src = get_move_src(mv); int dst = get_move_dst(mv); int eated = get_move_eat(mv); if(!in_board(dst)) return false; /** 检测是否同为红方的笨办法 */ //if((chessboard[src]&16) && (chessboard[eated]&16)) if((chessboard[src]&16) && (chessboard[dst]&16)) return false; /** 检测是否同为黑方的笨办法 */ //if((chessboard[src]&32) && (chessboard[eated]&32)) if((chessboard[src]&32) && (chessboard[dst]&32)) return false; /** 判断是否过河的方法,dst & 0x80,在下方是非0, 上方是0 */ /** 获取要移动棋子的类型*/ int chess_t = get_chessman_type(chessboard[src]); DLOG("逻辑判断棋子chessboard[src] = %d %d\n",chessboard[src],chess_t); switch(chess_t){ /** 将/帅的着法,同一纵线或横线,移动只一个单位,在九宫内*/ case RED_KING: case BLACK_KING: DLOG("帅走\n"); if(in_fort(dst)){ if((1==abs(RANK_X(src)-RANK_X(dst))) || (1==abs(RANK_Y(src)-RANK_Y(dst)))){ if((RANK_X(src) == RANK_X(dst)) || (RANK_Y(src)==RANK_Y(dst))){ return true; } } } break; /** 士的着法也是绝对值检测,但相差1即可,还需要检测 * 是否在九宫格内*/ case RED_ADVISOR: case BLACK_ADVISOR: if(in_fort(dst) && (1==abs(RANK_X(src)-RANK_X(dst))) && (1==abs(RANK_Y(src)-RANK_Y(dst)))){ DLOG("可走,返回真\n"); return true; } break; /** 相的着法初级只需要检测目标及起点x,y绝对值是否相 * 差2即可,还需要注意不能过河,及阻象脚 */ case RED_BISHOP: if((dst&0x80) != 0){ if((2==abs(RANK_X(src)-RANK_X(dst))) && (2==abs(RANK_Y(src)-RANK_Y(dst)))){ int leg=get_bishop_leg(src,dst); if(chessboard[leg]==0) return true; } } break; case BLACK_BISHOP: DLOG("相走\n"); if((dst&0x80) == 0){ DLOG("进来了吗相走\n"); if((2==abs(RANK_X(src)-RANK_X(dst))) && (2==abs(RANK_Y(src)-RANK_Y(dst)))){ int leg=get_bishop_leg(src,dst); if(chessboard[leg]==0) return true; } } break; /** 马的着法,目标及起点绝对值相差1-2或2-1 * 判断绊马脚搞定 */ case RED_KNIGHT: case BLACK_KNIGHT: DLOG("马走\n"); if(((1==abs(RANK_X(src)-RANK_X(dst))) && (2==abs(RANK_Y(src)-RANK_Y(dst))))|| ((2==abs(RANK_X(src)-RANK_X(dst))) && (1==abs(RANK_Y(src)-RANK_Y(dst))))){ int leg=get_knight_leg(src,dst); if(chessboard[leg]==0) return true; } break; /** 炮和车合法着法的特点是同一横线或同一纵线, * 初级只需要检测是否同一横线或纵线即可 * 但往下还需要检测是否跨子,跨子检测搞定*/ case RED_ROOK: case BLACK_ROOK: DLOG("车走\n"); if((RANK_X(src) == RANK_X(dst))){ int min_t = src c_iccs.word[3]){ if(black_player) c_hanzi.word[2]='+'; else c_hanzi.word[2]='-'; c_hanzi.word[3]='1'; } else{ if(black_player) c_hanzi.word[2]='-'; else c_hanzi.word[2]='+'; c_hanzi.word[3]='1'; } break; /** 士相只有和进退,所以同一纵线上能退的肯定是前面那个*/ case RED_ADVISOR: case BLACK_ADVISOR: case RED_BISHOP: case BLACK_BISHOP: c_hanzi.word[1] = alpha_to_digit(c_iccs.word[0]); if(c_iccs.word[1] > c_iccs.word[3]){ if(black_player) c_hanzi.word[2]='+'; else c_hanzi.word[2]='-'; } else{ if(black_player) c_hanzi.word[2]='-'; else c_hanzi.word[2]='+'; } c_hanzi.word[3]= alpha_to_digit(c_iccs.word[2]); break; /** 马和士相情况类似,但要区分前后*/ case RED_KNIGHT: case BLACK_KNIGHT: a1_x = get_iccs_x(chessmans[side_tag(black_player)+KNIGHT_FROM]); a2_x = get_iccs_x(chessmans[side_tag(black_player)+KNIGHT_TO]); if(a1_x==a2_x){ int a1_y = get_iccs_y(chessmans[side_tag(black_player)+KNIGHT_FROM]); int a2_y = get_iccs_y(chessmans[side_tag(black_player)+KNIGHT_TO]); if(a1_y > a2_y){ if(a1_y== c_iccs.word[1]){ if(black_player) c_hanzi.word[1]='b'; else c_hanzi.word[1]='a'; } else{ if(black_player) c_hanzi.word[1]='a'; else c_hanzi.word[1]='b'; } } else{ if(a1_y== c_iccs.word[1]){ if(black_player) c_hanzi.word[1]='a'; else c_hanzi.word[1]='b'; } else{ if(black_player) c_hanzi.word[1]='b'; else c_hanzi.word[1]='a'; } } } else c_hanzi.word[1] = alpha_to_digit(c_iccs.word[0]); if(c_iccs.word[1] > c_iccs.word[3]){ if(black_player) c_hanzi.word[2]='+'; else c_hanzi.word[2]='-'; } else{ if(black_player) c_hanzi.word[2]='-'; else c_hanzi.word[2]='+'; } c_hanzi.word[3]= alpha_to_digit(c_iccs.word[2]); break; /**车和炮情况雷同*/ case RED_ROOK: case BLACK_ROOK: a1_x = get_iccs_x(chessmans[side_tag(black_player)+ROOK_FROM]); a2_x = get_iccs_x(chessmans[side_tag(black_player)+ROOK_TO]); if(a1_x==a2_x){ int a1_y = get_iccs_y(chessmans[side_tag(black_player)+ROOK_FROM]); int a2_y = get_iccs_y(chessmans[side_tag(black_player)+ROOK_TO]); if(a1_y > a2_y){ if(a1_y== c_iccs.word[1]){ if(black_player) c_hanzi.word[1]='b'; else c_hanzi.word[1]='a'; } else{ if(black_player) c_hanzi.word[1]='a'; else c_hanzi.word[1]='b'; } } else{ if(a1_y== c_iccs.word[1]){ if(black_player) c_hanzi.word[1]='a'; else c_hanzi.word[1]='b'; } else{ if(black_player) c_hanzi.word[1]='b'; else c_hanzi.word[1]='a'; } } } else c_hanzi.word[1] = alpha_to_digit(c_iccs.word[0]); if(c_iccs.word[1]==c_iccs.word[3]){ c_hanzi.word[2]='.'; /** alpha_to_digit 解决了红黑方方位表示的问题*/ c_hanzi.word[3]= alpha_to_digit(c_iccs.word[2]); } else if(c_iccs.word[1] > c_iccs.word[3]){ if(black_player) c_hanzi.word[2]='+'; else c_hanzi.word[2]='-'; c_hanzi.word[3]=c_iccs.word[1]-c_iccs.word[3]+48; } else{ if(black_player) c_hanzi.word[2]='-'; else c_hanzi.word[2]='+'; c_hanzi.word[3]=c_iccs.word[3]-c_iccs.word[1]+48; } break; case RED_CANNON: case BLACK_CANNON: a1_x = get_iccs_x(chessmans[side_tag(black_player)+CANNON_FROM]); a2_x = get_iccs_x(chessmans[side_tag(black_player)+CANNON_TO]); if(a1_x==a2_x){ int a1_y = get_iccs_y(chessmans[side_tag(black_player)+CANNON_FROM]); int a2_y = get_iccs_y(chessmans[side_tag(black_player)+CANNON_TO]); if(a1_y > a2_y){ if(a1_y== c_iccs.word[1]){ if(black_player) c_hanzi.word[1]='b'; else c_hanzi.word[1]='a'; } else{ if(black_player) c_hanzi.word[1]='a'; else c_hanzi.word[1]='b'; } } else{ if(a1_y== c_iccs.word[1]){ if(black_player) c_hanzi.word[1]='a'; else c_hanzi.word[1]='b'; } else{ if(black_player) c_hanzi.word[1]='b'; else c_hanzi.word[1]='a'; } } } else c_hanzi.word[1] = alpha_to_digit(c_iccs.word[0]); if(c_iccs.word[1]==c_iccs.word[3]){ c_hanzi.word[2]='.'; /** alpha_to_digit 解决了红黑方方位表示的问题*/ c_hanzi.word[3]= alpha_to_digit(c_iccs.word[2]); } else if(c_iccs.word[1] > c_iccs.word[3]){ if(black_player) c_hanzi.word[2]='+'; else c_hanzi.word[2]='-'; c_hanzi.word[3]=c_iccs.word[1]-c_iccs.word[3]+48; } else{ if(black_player) c_hanzi.word[2]='-'; else c_hanzi.word[2]='+'; c_hanzi.word[3]=c_iccs.word[3]-c_iccs.word[1]+48; } break; case RED_PAWN: case BLACK_PAWN: /** fixed it */ c_hanzi.word[1] = alpha_to_digit(c_iccs.word[0]); #if 1 { int isblack; if(black_player) isblack=16; else isblack=0; int a_x[5]={0}; int a_y[5]={0}; for(int i=0;i<5;i++){ a_x[i] = get_iccs_x(chessmans[i+27+isblack]); a_y[i] = get_iccs_y(chessmans[i+27+isblack]); } int mark=0; for(int i=0;i<5;i++){ DLOG("c_iccs.word[0]=%c , a_x[%d] = %c\n",c_iccs.word[0],i,a_x[i]); if(a_x[i]==c_iccs.word[0]) mark++; } /** 这表明处于多兵中*/ if(mark>1){ int i; int x_rand[9]={0}; int p1_line[5]={0}; for(i=0;i<5;i++) p1_line[i]=10; /** 五个兵,分好纵线*/ for(i=0;i<5;i++){ int n = a_x[i] -'a'; if(n>=0){ x_rand[n]++; DLOG("ax[%d]=%c x_rand[%d]=%d\n",i,a_x[i],n,x_rand[n]); } } int n=0; int start=0; if(!black_player){ for(i=8;i>=0;i--){ DLOG("x_rand[%d]=%d\n",i,x_rand[i]); if(x_rand[i]>1){ /**此纵线上有两个以上兵*/ for(int j=0;j<5;j++){ DLOG("i = %d\n",i); if(i == (a_x[j]-'a')){ p1_line[n]=j; n++; } } DLOG("此纵线有两兵以上n=%d\n",n); /** 为纵线上的棋子排序*/ for(int k=start;k=k;j--){ if(a_y[p1_line[j]]1){ /**此纵线上有两个以上兵*/ DLOG("此纵线有两兵以上\n"); for(int j=0;j<5;j++){ DLOG("i = %d\n",i); if(i == (a_x[j]-'a')){ p1_line[n]=j; n++; printf("xx------p1_line[%d]=%d\n",n,p1_line[n-1]); } } /** 为纵线上的棋子排序*/ for(int k=start;k=k;j--){ if(a_y[p1_line[j]]>a_y[ p1_line[j+1] ]){ int tmp=p1_line[j]; p1_line[j]=p1_line[j+1]; p1_line[j+1]=tmp; } } start=n; } } } char c='c'; for(int i=0;i<5;i++){ if(a_y[p1_line[i]]==c_iccs.word[1]) c_hanzi.word[1]=c; c++; } /** 转换成前中后或前后 */ if(start==2){ if(c_hanzi.word[1]=='c') c_hanzi.word[1]='q'; else c_hanzi.word[1]='h'; } else if(start==3){ if(c_hanzi.word[1]=='c') c_hanzi.word[1]='q'; else if(c_hanzi.word[1]=='d') c_hanzi.word[1]='z'; else c_hanzi.word[1]='h'; } } } #endif if(c_iccs.word[1]==c_iccs.word[3]){ c_hanzi.word[2]='.'; /** alpha_to_digit 解决了红黑方方位表示的问题*/ c_hanzi.word[3]= alpha_to_digit(c_iccs.word[2]); } else if(c_iccs.word[1] > c_iccs.word[3]){ if(black_player) c_hanzi.word[2]='+'; else c_hanzi.word[2]='-'; c_hanzi.word[3]='1'; } else{ if(black_player) c_hanzi.word[2]='-'; else c_hanzi.word[2]='+'; c_hanzi.word[3]='1'; } break; default: return 0; break; }; DLOG("%s : %c%c%c%c\n",__FUNCTION__,c_iccs.word[0],c_iccs.word[1],c_iccs.word[2],c_iccs.word[3]); DLOG("%s : %c%c%c%c\n",__FUNCTION__,c_hanzi.word[0],c_hanzi.word[1],c_hanzi.word[2],c_hanzi.word[3]); return c_hanzi.digit; } Glib::ustring Engine::hanzi_to_move_chinese(uint32_t f_hanzi) { //Glib::ustring tmp_t; union Hanzi c_hanzi; c_hanzi.digit = f_hanzi; if(c_hanzi.word[1]>='a'){ return digit_to_word(c_hanzi.word[1]) +code_to_word(c_hanzi.word[0]) +action_to_word(c_hanzi.word[2]) +digit_to_word(c_hanzi.word[3]) ; } else{ //tmp_t=code_to_word(c_hanzi.word[0]) return code_to_word(c_hanzi.word[0]) +digit_to_word(c_hanzi.word[1]) +action_to_word(c_hanzi.word[2]) +digit_to_word(c_hanzi.word[3]) ; } } Glib::ustring Engine::digit_to_word(char digit) { DLOG("digit = %c",digit); if(black_player){ switch(digit){ case '1': return Glib::ustring("1"); break; case '2': return Glib::ustring("2"); break; case '3': return Glib::ustring("3"); break; case '4': return Glib::ustring("4"); break; case '5': return Glib::ustring("5"); break; case '6': return Glib::ustring("6"); break; case '7': return Glib::ustring("7"); break; case '8': return Glib::ustring("8"); break; case '9': return Glib::ustring("9"); break; case 'a': return Glib::ustring("前"); break; case 'b': return Glib::ustring("后"); break; case 'c': return Glib::ustring("一"); break; case 'd': return Glib::ustring("二"); break; case 'e': return Glib::ustring("三"); break; case 'f': return Glib::ustring("四"); break; case 'g': return Glib::ustring("五"); break; case 'q': return Glib::ustring("前"); break; case 'z': return Glib::ustring("中"); break; case 'h': return Glib::ustring("后"); break; default: break; }; } else{ switch(digit){ case '1': return Glib::ustring("一"); break; case '2': return Glib::ustring("二"); break; case '3': return Glib::ustring("三"); break; case '4': return Glib::ustring("四"); break; case '5': return Glib::ustring("五"); break; case '6': return Glib::ustring("六"); break; case '7': return Glib::ustring("七"); break; case '8': return Glib::ustring("八"); break; case '9': return Glib::ustring("九"); break; case 'a': return Glib::ustring("前"); break; case 'b': return Glib::ustring("后"); break; case 'c': return Glib::ustring("一"); break; case 'd': return Glib::ustring("二"); break; case 'e': return Glib::ustring("三"); break; case 'f': return Glib::ustring("四"); break; case 'g': return Glib::ustring("五"); break; case 'q': return Glib::ustring("前"); break; case 'z': return Glib::ustring("中"); break; case 'h': return Glib::ustring("后"); break; default: break; }; } return Glib::ustring("NULL"); } Glib::ustring Engine::action_to_word(char action) { DLOG(" action = %c\n",action); switch(action){ case '.': return Glib::ustring("平"); break; case '+': return Glib::ustring("进"); break; case '-': return Glib::ustring("退"); break; default: break; }; return Glib::ustring("NULL"); } Glib::ustring Engine::code_to_word(char code) { DLOG("code = %c\n",code); switch(code){ case 'K': return Glib::ustring("帅"); break; case 'A': return Glib::ustring("仕"); break; case 'B': return Glib::ustring("相"); break; case 'N': case 'n': return Glib::ustring("马"); break; case 'C': case 'c': return Glib::ustring("炮"); case 'R': case 'r': return Glib::ustring("车"); break; case 'P': return Glib::ustring("兵"); break; case 'k': return Glib::ustring("将"); break; case 'a': return Glib::ustring("士"); break; case 'b': return Glib::ustring("象"); break; case 'p': return Glib::ustring("卒"); break; default: break; }; return Glib::ustring("NULL"); } uint32_t Engine::hanzi_to_iccs(uint32_t f_hanzi) { /** hazi中文纵线表示方式中,hanzi的四个字符依次是: 炮二平五(C2.5) */ union Hanzi c_hanzi; union Hanzi c_iccs; c_hanzi.digit = f_hanzi; DLOG("hazi[0...3] = %c%c%c%c\n",c_hanzi.word[0],c_hanzi.word[1],c_hanzi.word[2],c_hanzi.word[3]); /** cman_type 是棋子类型*/ int cman_type = fen_to_piece(c_hanzi.word[0]); //int src_x,src_y,dst_x,dst_y; int src_x = 0; int src_y = 0; int dst_x = 0; int dst_y = 0; int num =0; DLOG("who is going black=%d\n",black_player); num += 16*black_player; /* if(black_player) num = 16; else num= 0; */ g_log("Engine",G_LOG_LEVEL_INFO,"num = %d\n",num); if(0 == cman_type ){ /** 处理帅将的源地址*/ src_x = get_iccs_x(chessmans[16+num]); src_y = get_iccs_y(chessmans[16+num]); DLOG("chessmans[%d]=%x\n",16+num,chessmans[16+num]); DLOG("src_x = %c , src_y = %c\n",src_x,src_y); if(c_hanzi.word[2] == '+'){ dst_x = src_x; if(!black_player) dst_y = src_y+1; else dst_y = src_y-1; } else if(c_hanzi.word[2] == '-'){ dst_x = src_x; if(!black_player) dst_y = src_y-1; else dst_y = src_y+1; } else if(c_hanzi.word[2] == '.'){ dst_x = digit_to_alpha(c_hanzi.word[3]); dst_y = src_y; } c_iccs.word[0] = src_x; c_iccs.word[1] = src_y; c_iccs.word[2] = dst_x; c_iccs.word[3] = dst_y; DLOG("hazi[0...3] = %c%c%c%c\n",c_iccs.word[0],c_iccs.word[1],c_iccs.word[2],c_iccs.word[3]); return c_iccs.digit; } else if(1 == cman_type){ /** 处理士的源及目标地址*/ /** 士与相没有前后之分,能进则是后面那个,能退则是前面那个*/ src_x = digit_to_alpha(c_hanzi.word[1]); c_iccs.word[0] = src_x; dst_x = digit_to_alpha(c_hanzi.word[3]); int a1_x = get_iccs_x(chessmans[17+num]); int a2_x = get_iccs_x(chessmans[18+num]); if(a1_x == a2_x){ /** 士在同一纵线上*/ int a1_y = get_iccs_y(chessmans[17+num]); int a2_y = get_iccs_y(chessmans[18+num]); if(c_hanzi.word[2] == '+'){ if(!black_player){ src_y = a1_ya2_y?a1_y:a2_y; dst_y = src_y-1; } } else if(c_hanzi.word[2] == '-'){ if(!black_player){ src_y = a1_y>a2_y?a1_y:a2_y; dst_y = src_y-1; } else{ src_y = a1_ya2_y?a1_y:a2_y; dst_y = src_y-2; } } else if(c_hanzi.word[2] == '-'){ if(!black_player){ src_y = a1_y>a2_y?a1_y:a2_y; dst_y = src_y-2; } else{ src_y = a1_ya2_y?a1_y:a2_y; else src_y = a1_ya2_y?a1_y:a2_y; } src_x=a1_x; } else{ DLOG("a1_x = %c , a2_x = %c , src_x = %c\n",a1_x,a2_x,src_x); DLOG("chessmans[%d]=%x\n",type_num+num,chessmans[type_num+num]); DLOG("chessmans[%d]=%x\n",type_num+1+num,chessmans[type_num+1+num]); if(a1_x == src_x){ src_y = get_iccs_y(chessmans[type_num+num]); } else if(a2_x == src_x){ src_y = get_iccs_y(chessmans[type_num+1+num]); } else{ DLOG("马的匹配位置出现问题\n"); goto error_out; } DLOG("src_y = %c\n",src_y); } if(c_hanzi.word[2] == '+'){ if(abs(dst_x-src_x)== 1){ if(!black_player) dst_y = src_y +2; else dst_y = src_y -2; } else{ if(!black_player) dst_y = src_y +1; else dst_y=src_y-1; } } else if(c_hanzi.word[2] == '-'){ if(abs(dst_x-src_x)== 1){ if(!black_player) dst_y = src_y -2; else dst_y = src_y +2; }else{ if(!black_player) dst_y = src_y -1; else dst_y = src_y +1; } } c_iccs.word[0]=src_x; c_iccs.word[1]=src_y; c_iccs.word[2] =dst_x; c_iccs.word[3] =dst_y; DLOG("hazi[0...3] = %c%c%c%c\n",c_iccs.word[0],c_iccs.word[1],c_iccs.word[2],c_iccs.word[3]); return c_iccs.digit; } else if(4==cman_type||5==cman_type){ /** 车炮的目标坐标生成*/ int type_num=0; if(cman_type==4) type_num = 23; else if(5==cman_type) type_num=25; src_x = digit_to_alpha(c_hanzi.word[1]); int a1_x = get_iccs_x(chessmans[type_num+num]); int a2_x = get_iccs_x(chessmans[type_num+1+num]); if(src_x<0){ /** 同一纵线上有两个车或炮 */ int a1_y = get_iccs_y(chessmans[type_num+num]); int a2_y = get_iccs_y(chessmans[type_num+1+num]); if(c_hanzi.word[1] == 'a'){ if(!black_player) src_y = a1_y>a2_y?a1_y:a2_y; else src_y = a1_ya2_y?a1_y:a2_y; } src_x= a1_x; } else { DLOG("a1_x = %c , a2_x = %c , src_x = %c\n",a1_x,a2_x,src_x); DLOG("chessmans[%d]=%x\n",type_num+num,chessmans[type_num+num]); DLOG("chessmans[%d]=%x\n",type_num+1+num,chessmans[type_num+1+num]); if(a1_x == src_x){ src_y = get_iccs_y(chessmans[type_num+num]); } else if(a2_x == src_x){ src_y = get_iccs_y(chessmans[type_num+1+num]); } else{ DLOG("车炮的匹配位置出现问题\n"); goto error_out; } } char c= c_hanzi.word[3]; //DLOG("src_y=%c, c=%c src_y-c=%c\n",src_y,c,src_y-c); if(c_hanzi.word[2] == '+'){ dst_x = src_x; if(!black_player) dst_y = src_y + c-48; else dst_y = src_y - c+48; } else if(c_hanzi.word[2] == '-'){ dst_x = src_x; if(!black_player) dst_y = src_y - c+48; else dst_y = src_y + c-48; } else if(c_hanzi.word[2] == '.'){ dst_x = digit_to_alpha(c_hanzi.word[3]); dst_y = src_y; } c_iccs.word[0]=src_x; c_iccs.word[1]=src_y; c_iccs.word[2] =dst_x; c_iccs.word[3] =dst_y; DLOG("hazi[0...3] = %c%c%c%c\n",c_iccs.word[0],c_iccs.word[1],c_iccs.word[2],c_iccs.word[3]); return c_iccs.digit; } else if(6==cman_type){ /** 兵的步法生成*/ src_x = digit_to_alpha(c_hanzi.word[1]); /** a_x,a_y 分别代表五个兵现在的坐标,已经取得当前色彩的兵*/ int a_x[5]={0}; int a_y[5]={0}; int i; for(i=0;i<5;i++){ a_x[i] = get_iccs_x(chessmans[i+27+num]); a_y[i] = get_iccs_y(chessmans[i+27+num]); DLOG("a_x[%d]=%c,a_y[%d]=%c\n",i,a_x[i],i,a_y[i]); } if(src_x<0){ /** x_rand[9]代表九条纵线*/ int x_rand[9]={0}; /** p1_line[5] 用来装兵的位置的,分别是(前,后)(前,中,后)(一,二,三,四),值应该是五个兵的标识第几个兵之类,从而可以用a_x[p1_line[0]]取得前兵的x坐标 */ int p1_line[5]={0}; int i; int p_max=0; /** 一条线上最多兵的数值,主要用于区分"后"是两个还是三个的情况 */ for(i=0;i<5;i++) p1_line[i]=10; /** 五个兵,分好纵线*/ for(i=0;i<5;i++){ int n = a_x[i] -'a'; if(n>=0){ x_rand[n]++; DLOG("ax[%d]=%c x_rand[%d]=%d\n",i,a_x[i],n,x_rand[n]); } } /** 取得纵线中最多兵的数值*/ for(i=0;i<9;i++){ if(x_rand[i]>p_max) p_max=x_rand[i]; } int n=0; int start=0; if(!black_player){ for(i=8;i>=0;i--){ DLOG("x_rand[%d]=%d\n",i,x_rand[i]); if(x_rand[i]>1){ /**此纵线上有两个以上兵*/ DLOG("此纵线有两红兵以上\n"); for(int j=0;j<5;j++){ DLOG("i = %d\n",i); if(i == (a_x[j]-'a')){ p1_line[n]=j; n++; } } /** 为纵线上的棋子排序*/ for(int k=start;k=k;j--){ if(a_y[p1_line[j]]1){ /**此纵线上有两个以上兵*/ DLOG("此纵线有两黑卒以上\n"); n=0; for(int j=0;j<5;j++){ DLOG("i = %d\n",i); if(i == (a_x[j]-'a')){ p1_line[n]=j; printf("xx------p1_line[%d]=%d\n",n,p1_line[n]); n++; } } DLOG(" n=%d\n", n); /** 为纵线上的棋子排序*/ for(int k=start;k=k;j--){ if(a_y[p1_line[j]]>a_y[ p1_line[j+1] ]){ int tmp=p1_line[j]; p1_line[j]=p1_line[j+1]; p1_line[j+1]=tmp; } } start=n; n=0; } } } DLOG("start= %d\n",start); for(i=0;i<5;i++) printf("p1_line[%d]=%d\n",i,p1_line[i]); /** 处理纵线上多兵的问题,还要考虑黑方位置问题,未解决*/ if(c_hanzi.word[1] == 'a'){ src_x=a_x[p1_line[0]]; src_y=a_y[p1_line[0]]; DLOG("前兵走: p1_line[0]=%d,src_y=%c\n",p1_line[0],src_y); DLOG("前兵走: p1_line[1]=%d,other_y=%c\n",p1_line[1],a_y[p1_line[1]]); } else if(c_hanzi.word[1] == 'b'){ src_x=a_x[p1_line[1]]; src_y=a_y[p1_line[1]]; } else if(c_hanzi.word[1] == 'c'){ if(p_max==2){ src_x=a_x[p1_line[1]]; src_y=a_y[p1_line[1]]; DLOG("两兵 p1_line[1]=%d,src_x=%c,src_y=%c\n",p1_line[1],src_x,src_y); }else{ src_x=a_x[p1_line[2]]; src_y=a_y[p1_line[2]]; DLOG("三兵 src_x=%c,src_y=%c\n",src_x,src_y); } } else if(c_hanzi.word[1] == 'd'){ src_x=a_x[p1_line[3]]; src_y=a_y[p1_line[3]]; } else if(c_hanzi.word[1] == 'e'){ src_x=a_x[p1_line[4]]; src_y=a_y[p1_line[4]]; } } else{ for(int i=0;i<5;i++){ if(a_x[i] == src_x) src_y = a_y[i]; } } if(c_hanzi.word[2] == '+'){ //char c= c_hanzi.word[3]; dst_x = src_x; if(!black_player) dst_y = src_y + 1; else dst_y = src_y - 1; } else if(c_hanzi.word[2] == '-'){ //char c= c_hanzi.word[3]; dst_x = src_x; if(!black_player) dst_y = src_y - 1; else dst_y = src_y + 1; } else if(c_hanzi.word[2] == '.'){ dst_x = digit_to_alpha(c_hanzi.word[3]); dst_y = src_y; } c_iccs.word[0]=src_x; c_iccs.word[1]=src_y; c_iccs.word[2] =dst_x; c_iccs.word[3] =dst_y; DLOG("hazi[0...3] = %c%c%c%c\n",c_iccs.word[0],c_iccs.word[1],c_iccs.word[2],c_iccs.word[3]); return c_iccs.digit; } error_out: printf(" %s error\n",__FUNCTION__); return 0; } void Engine::sync_board() { int i; for(i=0;i<255;i++) revchessboard[i]=chessboard[254-i]; revchessboard[255]=0; } void Engine::gen_which_can_move(std::vector& points, int chess_, bool rev) { int sx,sy; get_xy_from_chess(chess_,sx,sy,rev); int chess_t = get_chessman_type(chess_); int src = get_chessman_xy(chess_); switch(chess_t){ /** 将/帅的着法,同一纵线或横线,移动只一个单位,在九宫内*/ case RED_PAWN: case BLACK_PAWN: case RED_KING: case BLACK_KING: { //计算合法的能走的点再加入potins中 int dst = get_dst_xy(sx+1,sy, rev); int mv = get_move(src, dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx+1, sy)); dst = get_dst_xy(sx-1,sy, rev); mv = get_move(src, dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx-1, sy)); dst = get_dst_xy(sx,sy+1, rev); mv = get_move(src, dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx, sy+1)); dst = get_dst_xy(sx,sy-1, rev); mv = get_move(src, dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx, sy-1)); } break; case RED_ADVISOR: case BLACK_ADVISOR: { int dst = get_dst_xy(sx+1,sy+1, rev); int mv = get_move(src, dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx+1, sy+1)); dst = get_dst_xy(sx+1,sy-1, rev); mv = get_move(src, dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx+1, sy-1)); dst = get_dst_xy(sx-1,sy-1, rev); mv = get_move(src, dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx-1, sy-1)); dst = get_dst_xy(sx-1,sy+1, rev); mv = get_move(src, dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx-1, sy+1)); } break; case RED_BISHOP: case BLACK_BISHOP: { int dst = get_dst_xy(sx+2,sy+2,rev); int mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx+2,sy+2)); dst = get_dst_xy(sx+2, sy-2, rev); mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx+2,sy-2)); dst = get_dst_xy(sx-2, sy+2, rev); mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx-2,sy+2)); dst = get_dst_xy(sx-2, sy-2, rev); mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx-2,sy-2)); } break; case RED_KNIGHT: case BLACK_KNIGHT: { int dst = get_dst_xy(sx+1,sy+2,rev); int mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx+1,sy+2)); dst = get_dst_xy(sx+1, sy-2, rev); mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx+1,sy-2)); dst = get_dst_xy(sx-1, sy-2, rev); mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx-1,sy-2)); dst = get_dst_xy(sx-1, sy+2, rev); mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx-1,sy+2)); dst = get_dst_xy(sx-2, sy+1, rev); mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx-2,sy+1)); dst = get_dst_xy(sx-2, sy-1, rev); mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx-2,sy-1)); dst = get_dst_xy(sx+2, sy+1, rev); mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx+2,sy+1)); dst = get_dst_xy(sx+2, sy-1, rev); mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx+2,sy-1)); } break; case RED_ROOK: case BLACK_ROOK: case RED_CANNON: case BLACK_CANNON: { for(int i = -9; i<9; ++i){ int dst = get_dst_xy(sx,sy+i); int mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx,sy+i)); dst = get_dst_xy(sx+i, sy); mv = get_move(src,dst); if(logic_move(mv)) points.push_back(Gdk::Point(sx+i,sy)); } } break; } } gmchess-0.29.6.3/src/Engine.h000066400000000000000000000255061323660377300155710ustar00rootroot00000000000000/* * ===================================================================================== * * Filename: Engine.h * * Description: 处理棋盘信息--伪引擎 * * Version: 1.0 * Created: 2009年02月14日 16时43分59秒 CST * Revision: none * Compiler: gcc * * Author: lerosua (), lerosua@gmail.com * Company: Cyclone * * ===================================================================================== */ #ifndef ENGINE_FILE_HEADER_INC #define ENGINE_FILE_HEADER_INC #include #include "gmchess.h" #include #include #include #include #include /** * @brief 处理棋盘数据结构 * 暂时来说是保存FEN串为历史局面,把当前局面保存到棋盘数组并输出 * 此处的x,y坐标相对于棋盘数组chessboard[256]来说,而这个数组中有效位置见 * 棋盘区域表chessInBoard[256]. * 获取的x,y坐标是数组序号的两个十六进制位,比如0xa3,x坐标是3,y坐标是a * 而它的9x10棋盘坐标就是0,7 * * save the FEN array for the history station. * this way x,y crood is in chessboard[256],and the valid bit you can see * chessInBoardp256]. */ class Engine { public: Engine(); ~Engine(); /** * @brief 初始化棋局快照,设置开始的局面 * initial the first board station * @param fen 局面FEN串 */ void init_snapshot(const char* fen); /** * @brief 得到某步时的快照 * get the snapshot of some moves. * @param num 某一步时 */ void get_snapshot(int num); std::string get_current_snapshot(){ return current_fen_snapshots; } /** 添加中文表达着法 */ /** add the chinese moves */ void add_move_chinese(Glib::ustring f_line){ move_chinese.push_back(f_line); }; /** 返回中文着法表达示快照集*/ /** return the snapshot of chinese moves*/ const std::vector& get_move_chinese_snapshot() {return move_chinese;}; const Glib::ustring& get_chinese_last_move(){ return move_chinese.back(); } /** * @brief 棋盘数组生成Fen串 * the board array convert to fen array * @param szFen 生成的Fen串 */ void to_fens(char* szFen); /** * @brief 添加棋子信息 * add a chess * @param sq 棋盘数组的序号 * @param pc 棋子的类型 */ void add_piece(int sq, int pc); /** * @brief FEN串转成棋子标识数字, * FEN array convert to chess number * @param nArg FEN串字母 * @return 返回棋子类型标识 */ int fen_to_piece(int nArg); /** 由棋盘数组的值获取iccs坐标,纵线(x轴)为a-i,横线(y轴)为9-0*/ /** get iccs crood from board array*/ char get_iccs_x(int nArg); char get_iccs_y(int nArg); /** 数字转换成iccs坐标的横坐标 */ /** digit convert to x of iccs */ char digit_to_alpha(int nArg); char alpha_to_digit(int nArg); /** 由x,y位置获得棋盘数组中的序号(它所在的位置)*/ int get_coord(int x,int y){ return x+(y<<4);}; /** 由棋子代号获取9x10棋盘坐标的x,y, rev 标识是否反转棋盘*/ void get_xy_from_chess(int f_chess,int& x,int& y,bool rev=false); /** 获取y坐标位*/ inline int RANK_Y(int sq) { return sq >> 4;}; /**获取x坐标位*/ inline int RANK_X(int sq) { return sq & 15; } inline int side_tag(int sd) { int pc = 16 + (sd << 4); // 16 + (sd * 16); return pc; } /** 棋子类型转成FEN串字符 */ /** chess type convert to FEN character */ inline char piece_to_fen(int pt) { return chessman_bytes[pt]; } /** 由棋子代号转成棋子的类型 */ int get_chessman_type(int pc) { if(pc<16||pc>47) return -1; else return PieceTypes[pc]; } /** 测试位置sq是否在棋盘内 */ /** check sq is in board */ bool in_board(int sq) {return chessInBoard[sq] ; } /** 测试位置sq是否在九宫格内 */ /** check sq is in fort */ bool in_fort(int sq) { return chessInFort[sq]; } /** 交换走棋方*/ /** change player go*/ inline void change_side(){black_player = 1-black_player;} /** 是否红方走棋 */ /** check is red player going*/ inline bool red_player() { return 1-black_player ; } /** 引擎重置 reset the engine */ void reset(); /** @brief 返回x,y位置上的棋子 为9x10棋盘的坐标, * return the chess of 9x10 by (x,y) * @param rx x 坐标 * @param ry y 坐标 * @param rev 标识是否反转棋盘,默认是false,true表示返回反转棋盘中的棋子 * @return 返回棋子代号,如果0表示没有棋子 */ int get_piece(int rx,int ry,bool rev=false); /** @brief 返回反转棋盘的棋子 * return the reverse board chess * other like get_piece */ int get_rev_piece(int rx,int ry); /** * @brief 由棋盘数组里的位置返回棋子代号 */ int get_piece(int site){ return chessboard[site];} /**着法中的位置坐标全是在棋盘数组里的位置,0x33-0xcb以内*/ /** * @brief 由起点和终点生成着法 * @param p_src 棋子的起点 * @param p_dst 棋子的终点 * @return 返回着法,着法表示:高位是终点,低位是起点 */ int get_move(int p_src,int p_dst){ return p_src + (p_dst<<8)+ (chessboard[p_dst] <<16);} /** 从棋盘9x10坐标(rx,ry)返回棋盘数组里的序号,通常用于获取着法的落点 rev 表示当前反转棋盘*/ /** get the location of chess by 9x10(rx,ry) */ int get_dst_xy(int rx, int ry,bool rev=false); /** 返回棋子所在棋盘数组里的坐标(序号) */ inline int get_chessman_xy(int f_chess){return chessmans[f_chess] ; } /** 得到着法的起点 */ /** get the moves start position*/ int get_move_src(int mv){ return (int)mv & 255 ;} /** 得到着法的终点 */ /** get the moves end position */ int get_move_dst(int mv){ return (int) (mv >>8)&255 ; } /** 把着法转成ICCS坐标格式,比如 h2e2(炮二平五)*/ /** convert moves to iccs format h2e2(炮二平五)*/ uint32_t move_to_iccs(int mv); std::string move_to_iccs_str(int mv); int iccs_str_to_move(const std::string& iccs_str); /** 把ICCS坐标格式转成着法*/ /** convert iccs format to moves */ int iccs_to_move(uint32_t iccs); /** ICCS坐标格式转成中文纵线表达方式 */ /** convert iccs format to hanzi format */ uint32_t iccs_to_hanzi(uint32_t iccs); uint32_t hanzi_to_iccs(uint32_t hanzi); Glib::ustring hanzi_to_move_chinese(uint32_t hanzi); Glib::ustring digit_to_word(char digit); Glib::ustring action_to_word(char action); Glib::ustring code_to_word(char code); /** * @brief 高级着法执行,被外部调用,本身调用do_move及logic_move * the high level do move, it call do_move and logic_move * @param mv 着法 * @return 真即执行着法成功,false 执行失败 * return true means success. false means fail. */ bool make_move(int mv); /** 无检测执行着法 */ /** just do moves */ int do_move(int mv); /** 检测着法是否合逻辑(合法)--基本着法检测*/ /** check the moves is valid */ bool logic_move(int mv); /** 将帅碰面检测*/ /** the king meet */ bool king_meet(); /** * @brief 将军检测 is checked * @param player true表示检测红方是否被将,false表示检测黑方是否被将 * @return 返回0即没被将,非0则将军,不用bool是为了以后检测多重将军作扩展*/ int checked_by(bool player); /** * @brief 同将军检测 * 默认根据black_player的值来检测 */ int checked_by(void); /** * @brief 检测是否被将死 check is mate. */ bool mate(); /** * @brief 撤消此着法 undo the moves. * @param mv 着法,已包含了被吃子信息 * */ void undo_move(int mv); /** * @brief 获取被吃的棋子 * get the eated chessman. * @param mv 着法 * @return 棋子代号 */ int get_move_eat(int mv){ return (int)(mv >>16)&255; } /** 给着法加入被吃子信息*/ /** add the eated chessman to moves */ int set_move_eat(int mv,int eated) { return mv + (eated <<16) ;} /** 由目标及起点获得绊相角的位置坐标 */ /** get the bishop leg from target and start position */ int get_bishop_leg(int f_src,int f_dst) { return f_src + (f_dst-f_src)/2;} /** 绊马脚用到的比较函数*/ /** compare the knight leg */ int knight_cmp(int x,int y); /** 由目标及起点获得绊马脚的位置坐标 */ /** get the knight_ leg from target and start position */ int get_knight_leg(int f_src,int f_dst) ; /** 清理棋盘及棋子数组*/ /** clean all the chessman of board */ void clean_board(); /** 返回棋局走了多少步*/ /** return how moves gone */ int how_step(){ return fen_snapshots.empty()?0:fen_snapshots.size()-1;} /** 获取最后一个着法的镜像,悔棋用*/ /** get the last snapshot for rue game */ int get_last_move_from_snapshot(){return move_snapshots.back(); } const std::string& get_last_fen_from_snapshot(){ return fen_snapshots.back(); } /** 添加着法注释*/ void add_comment(const std::string& str); /** 获取某着法的注释,如果有的话*/ std::string* get_comment(int f_step); /** 返回将军标识,最好是在mate()调用后使用*/ /** return the identify of checkby */ inline bool get_checkby(){ return m_checked;} /**生成合法的步法着点集合*/ void gen_which_can_move(std::vector& points, int chess_, bool rev); private: /** * @brief 从Fen串生成棋盘数组 * Fen array to board array * @param szFen Fen串 */ void from_fens(const char *szFen); /** 同步棋盘与反转棋盘*/ /** sync revchessboard[] to chessboard[] */ void sync_board(); private: /** 当前局面的棋盘数组 current board array*/ int chessboard[256]; /** 反转的棋盘数组,黑棋在下 reverse board array,the black chess down*/ int revchessboard[256]; /** 当前局面的棋子数组,相应棋子的值为棋盘上的坐标,0表示被吃了 * 16-31表示红方棋子 32-47 表示黑方棋子 **/ /** current chessman array, 16-31 is red chessman, 32-47 is black chessman */ int chessmans[48]; /** 用于保存所有历史局面的FEN串数组*/ /** save the all history station FEN array */ std::vector fen_snapshots; /** save the current FEN array for run chanju game*/ std::string current_fen_snapshots; /** 用于保存所有的着法 */ /** save all history moves */ std::vector move_snapshots; /** 着法的中文表达式*/ /** save all chinese moves */ std::vector move_chinese; /** 着法的注释*/ /** save all comment of moves */ std::map move_comment; /** * @brief 谁走子的信息 * 0 是红方走,1是黑方走 */ bool black_player; bool m_checked; }; #endif /* ----- #ifndef ENGINE_FILE_HEADER_INC ----- */ gmchess-0.29.6.3/src/MainWindow.cc000066400000000000000000001011261323660377300165670ustar00rootroot00000000000000/* * ===================================================================================== * * Filename: MainWindow.cc * * Description: * * Version: 1.0 * Created: 2009年02月14日 07时52分14秒 CST * Revision: none * Compiler: gcc * * Author: lerosua (), lerosua@gmail.com * Company: Cyclone * * ===================================================================================== */ #include "MainWindow.h" #include #include #include #include #include #include #include #include "BookView.h" #include "ConfWindow.h" #include "gmchess.h" #include "Sound.h" #ifndef VERSION #define version "0.29.6.3" #else #define version VERSION #endif Glib::ustring ui_info = "" " " "

" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; MainWindow::MainWindow():menubar(NULL) ,confwindow(NULL) { ui_xml = Gtk::Builder::create_from_file(main_ui,"main_window"); if(!ui_xml) exit(271); Gtk::VBox* main_window =0; Gtk::VBox* box_board=0; ui_xml->get_widget("main_window",main_window); ui_xml->get_widget("vbox_board",box_board); ui_xml->get_widget("hbuttonbox_war",buttonbox_war); ui_xml->get_widget("textview_comment",text_comment); ui_xml->get_widget("textview_engine_log",text_engine_log); ui_xml->get_widget("notebook",m_notebook); ui_xml->get_widget("button_start",btn_start); ui_xml->get_widget("button_end",btn_end); ui_xml->get_widget("button_prev",btn_prev); ui_xml->get_widget("button_next",btn_next); ui_xml->get_widget("button_chanju", btn_chanjue); ui_xml->get_widget("button_begin",btn_begin); ui_xml->get_widget("button_lose",btn_lose); ui_xml->get_widget("button_draw",btn_draw); ui_xml->get_widget("button_rue",btn_rue); btn_start->signal_clicked().connect( sigc::mem_fun(*this,&MainWindow::on_first_move)); btn_end->signal_clicked().connect( sigc::mem_fun(*this,&MainWindow::on_last_move)); btn_prev->signal_clicked().connect( sigc::mem_fun(*this,&MainWindow::on_back_move)); btn_next->signal_clicked().connect( sigc::mem_fun(*this,&MainWindow::on_next_move)); btn_begin->signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_begin_game)); btn_lose->signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_lose_game)); btn_draw->signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_draw_game)); btn_rue->signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_rue_game)); btn_chanjue->signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_chanju_game)); board = Gtk::manage(new Board(*this)); box_board->pack_start(*board); this->add(*main_window); this->set_title(_("GMChess")); ui_logo = Gdk::Pixbuf::create_from_file(DATA_DIR"/gmchess.png"); this->set_icon(ui_logo); /** 设置菜单, set the menu*/ init_ui_manager(); menubar = ui_manager->get_widget("/MenuBar"); Gtk::VBox* menu_tool_box=0; ui_xml->get_widget("box_menu_toolbar",menu_tool_box); menu_tool_box->pack_start(*menubar,true,true); /** 设置Treeview区, set the treeview*/ Gtk::ScrolledWindow* scrolwin= 0; ui_xml->get_widget("scrolledwindow",scrolwin); m_refTreeModel = Gtk::ListStore::create(m_columns); m_treeview.set_model( m_refTreeModel); scrolwin->add(m_treeview); m_treeview.append_column(_("Turn"),m_columns.step_bout); m_treeview.append_column(" ",m_columns.player); m_treeview.append_column(_("Move"),m_columns.step_line); m_treeview.set_events(Gdk::BUTTON_PRESS_MASK); m_treeview.signal_button_press_event().connect(sigc::mem_fun(*this, &MainWindow::on_treeview_click),false); set_status(); Gtk::ScrolledWindow* scroll_book=0; ui_xml->get_widget("scrolledwin_book",scroll_book); m_bookview= new BookView(this); scroll_book->add(*m_bookview); ui_xml->get_widget("image_p1",p1_image); ui_xml->get_widget("image_p2",p2_image); ui_xml->get_widget("P1_war_time",p1_war_time); ui_xml->get_widget("P2_war_time",p2_war_time); ui_xml->get_widget("P1_step_time",p1_step_time); ui_xml->get_widget("P2_step_time",p2_step_time); ui_xml->get_widget("P1_name",p1_name); ui_xml->get_widget("P2_name",p2_name); init_conf(); this->signal_check_resize().connect( sigc::mem_fun(*this,&MainWindow::on_size_change)); #ifdef __linux__ /** test for rgba , it not work in mac osx*/ Glib::RefPtr colormap_ = this->get_screen()->get_rgba_colormap(); this->set_default_colormap(colormap_); #endif show_all(); p1_image->hide(); p2_image->hide(); if(atoi(GMConf["desktop_size"].c_str()) == 1) board->set_board_size(BIG_BOARD); else board->set_board_size(SMALL_BOARD); int _depth = atoi(GMConf["engine_depth"].c_str()); g_log("Mainwindow",G_LOG_LEVEL_INFO,"depth %d",_depth); board->set_level_config(_depth,0,0,0,0,0,atoi(GMConf["usebook"].c_str())); std::string tmp = GMConf["step_time"]; if(tmp.empty()) tmp = "240"; //int _step_time= atoi(GMConf["step_time"].c_str()); int _step_time= atoi(tmp.c_str()); tmp = GMConf["play_time"]; if(tmp.empty()) tmp="60"; //int _play_time= atoi(GMConf["play_time"].c_str()); int _play_time= atoi(tmp.c_str()); if(_step_time>0&&_step_time<600 && _play_time>0) board->set_time(_step_time,_play_time); std::string theme_ = GMConf["themes"]; std::string engine_name = GMConf["engine_name"]; std::string color_ = GMConf["line_color"]; if(engine_name.empty()) engine_name = "eleeye_engine"; if(theme_.empty()) theme_ = "wood"; board->set_themes(theme_); board->set_engine(engine_name); board->set_trace_color(color_.c_str()); } MainWindow::~MainWindow() { this->pop_colormap(); } void MainWindow::on_size_change() { int _wid = board->get_width(); board->configure_board(_wid); } void MainWindow::change_play(bool player) { if(player){ p1_image->hide(); p2_image->show(); } else{ p2_image->hide(); p1_image->show(); } } void MainWindow::save_conf() { char buf[512]; // FIXME: Do not use char buffer array std::string homedir = Glib::get_user_config_dir(); snprintf(buf, 512,"%s/gmchess/config",homedir.c_str()); std::ofstream file(buf); std::string line; std::map::iterator iter=GMConf.begin(); for(;iter != GMConf.end(); ++iter) { line = iter->first + "\t=\t" + iter->second; file << line << std::endl; } file.close(); } void MainWindow::init_conf() { char buf[512]; char book_dir[512]; char file_dir[512]; std::string homedir=Glib::get_user_config_dir(); snprintf(book_dir, 512,"%s/gmchess/book",homedir.c_str()); m_bookview->load_book_dir(book_dir); snprintf(buf,512,"%s/gmchess/config",homedir.c_str()); std::ifstream file(buf); if(!file){ #ifdef __APPLE__ mkdir(homedir.c_str(),S_IRUSR|S_IWUSR|S_IXUSR); #endif char homepath[512]; snprintf(homepath,512,"%s/gmchess/",homedir.c_str()); mkdir(homepath,S_IRUSR|S_IWUSR|S_IXUSR); GMConf["usebook"]="1"; GMConf["desktop_size"] = "1"; //0--small,1--big GMConf["engine_depth"] ="5"; GMConf["themes"]="wood"; GMConf["engine_name"] = "eleeye_engine"; GMConf["line_color"] = "#198964"; save_conf(); snprintf(file_dir,512,"%s/gmchess/files",homedir.c_str()); mkdir(file_dir,S_IRUSR|S_IWUSR|S_IXUSR); return; } std::string line; std::string name; std::string key; if(file){ while(std::getline(file,line)){ size_t pos= line.find_first_of("="); if(pos==std::string::npos) continue; name = line.substr(0,pos); key = line.substr(pos+1,std::string::npos); // 下面这2个把所有的空格都去掉了 //key.erase(std::remove_if(key.begin(), key.end(), IsBlank()), key.end()); //name.erase(std::remove_if(name.begin(), name.end(), IsBlank()), name.end()); size_t pos1 = 0; size_t pos2 = 0; size_t len = 0; pos1 = name.find_first_not_of(" \t"); pos2 = name.find_last_not_of(" \t"); if (pos1 == std::string::npos || pos2 == std::string::npos) continue; len = pos2 - pos1 + 1; name = name.substr(pos1, len); pos1 = key.find_first_not_of(" \t"); pos2 = key.find_last_not_of(" \t"); if (pos1 == std::string::npos || pos2 == std::string::npos) continue; len = pos2 - pos1 + 1; key = key.substr(pos1, len); GMConf.insert(std::pair(name,key)); } } file.close(); } void MainWindow::set_comment(const std::string& f_comment) { text_comment->set_wrap_mode(Gtk::WRAP_WORD); Glib::RefPtr buffer = text_comment->get_buffer(); buffer->set_text(f_comment); } void MainWindow::show_textview_engine_log(const std::string& f_text) { text_engine_log->set_wrap_mode(Gtk::WRAP_WORD); Glib::RefPtr buffer_ = text_engine_log->get_buffer(); Gtk::TextBuffer::iterator end_ = buffer_->end(); Gdk::Rectangle rect_; text_engine_log->get_visible_rect(rect_); int y=-1; int height = -1; text_engine_log->get_line_yrange(end_,y,height); buffer_->place_cursor(buffer_->insert(end_,f_text)); if(yscroll_to_mark(buffer_->get_insert(),0); } void MainWindow::textview_engine_log_clear() { Glib::RefPtr buffer_ = text_engine_log->get_buffer(); Gtk::TextBuffer::iterator end_ , start_ ; buffer_->get_bounds(start_,end_); buffer_->erase(start_,end_); } void MainWindow::show_treeview_step() { Glib::RefPtr model= m_treeview.get_model(); model->foreach_iter(sigc::mem_fun(*this, &MainWindow::on_foreach_iter)); } bool MainWindow::on_foreach_iter(const Gtk::TreeModel::iterator iter) { int n_step = (*iter)[m_columns.step_num]; int m_step = board->get_step(); if(n_step == m_step){ Glib::RefPtr sel = m_treeview.get_selection(); Gtk::TreeModel::Path path(iter); m_treeview.scroll_to_row(path); sel->select(iter); return true; } return false; } void MainWindow::on_next_move() { board->next_move(); show_treeview_step(); } void MainWindow::on_back_move() { board->back_move(); show_treeview_step(); } void MainWindow::on_first_move() { board->first_move(); m_treeview.scroll_to_point(1,1); } void MainWindow::on_last_move() { board->last_move(); show_treeview_step(); } void MainWindow::init_ui_manager() { if (!action_group) action_group = Gtk::ActionGroup::create(); Glib::RefPtr action ; //File menu: action_group->add(Gtk::Action::create("FileMenu", _("_File"))); action = Gtk::Action::create("OpenFile", Gtk::Stock::OPEN,_("Open file")); action->set_tooltip(_("Open chessman File")); action_group->add(action, sigc::mem_fun(*this, &MainWindow::on_menu_open_file)); action = Gtk::Action::create("SaveAs",Gtk::Stock::SAVE,_("Save as")); action->set_tooltip(_("Save as a chess pgn file")); action_group->add(action, sigc::mem_fun(*this,&MainWindow::on_menu_save_file)); action = Gtk::Action::create("SaveBoard", Gtk::Stock::SAVE, _("Save Board")); action->set_tooltip(_("Save board to a png file")); action_group->add(action, sigc::mem_fun(*this, &MainWindow::on_menu_save_board_to_png)); action_group->add(Gtk::Action::create("FileQuit", Gtk::Stock::QUIT), sigc::mem_fun(*this, &MainWindow::on_menu_file_quit)); //View menu: action_group->add(Gtk::Action::create("ViewMenu", _("_View"))); action_group->add(Gtk::Action::create("ViewPreferences", Gtk::Stock::PREFERENCES), sigc::mem_fun(*this, &MainWindow::on_menu_view_preferences)); //Game menu: action_group->add(Gtk::Action::create("GameMenu",_("_Game"))); action_group->add(Gtk::Action::create("WarAI",Gtk::Stock::MEDIA_PLAY,_("_Fight to AI")), sigc::mem_fun(*this, &MainWindow::on_menu_war_to_ai)); action_group->add(Gtk::Action::create("FreePlay",Gtk::Stock::MEDIA_PLAY,_("Free Play")), sigc::mem_fun(*this, &MainWindow::on_menu_free_play)); action_group->add(Gtk::Action::create("RevPlay",Gtk::Stock::MEDIA_PLAY,_("_Switch colour")), sigc::mem_fun(*this, &MainWindow::on_menu_rev_play)); //Help menu: action_group->add(Gtk::Action::create("HelpMenu", _("_Help"))); action_group->add(Gtk::Action::create("Help", Gtk::Stock::HELP), sigc::mem_fun(*this, &MainWindow::on_menu_help)); action_group->add(Gtk::Action::create("About", Gtk::Stock::ABOUT), sigc::mem_fun(*this, &MainWindow::on_menu_about)); if (!ui_manager) ui_manager = Gtk::UIManager::create(); ui_manager->insert_action_group(action_group); add_accel_group(ui_manager->get_accel_group()); ui_manager->add_ui_from_string(ui_info); } void MainWindow::on_menu_save_board_to_png() { board->save_board_to_file("/tmp/1.png"); } void MainWindow::on_menu_save_file() { Gtk::FileChooserDialog dlg(*this, _("Save File"), Gtk::FILE_CHOOSER_ACTION_SAVE); dlg.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dlg.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); std::string filename ; if (Gtk::RESPONSE_OK == dlg.run()) { filename = dlg.get_filename(); } if (filename.empty()) return; std::ofstream file; file.open(filename.c_str()); if(!file){ DLOG("open %s file error\n",filename.c_str()); return ; } Gtk::TreeModel::Children children = m_refTreeModel->children(); Gtk::TreeModel::iterator iter ; for(iter = children.begin();iter!= children.end();iter++){ file<<(*iter)[m_columns.step_bout] <<". "<<(*iter)[m_columns.step_line] ; iter++; if(iter!=children.end()) file<<" "<<(*iter)[m_columns.step_line]<get_text()+"-"+p2_name->get_text()+".pgn"; std::string filename = homedir + std::string(time1) + name; std::ofstream file; file.open(filename.c_str()); if(!file){ DLOG("open %s file error\n",filename.c_str()); return ; } file<<"[Game \"Chese chess Play by GMChess\"]"<get_text()<<"\"]"<get_text()<<"\"]"<children(); Gtk::TreeModel::iterator iter ; for(iter = children.begin();iter!= children.end();iter++){ file<<(*iter)[m_columns.step_bout] <<". "<<(*iter)[m_columns.step_line] ; iter++; if(iter!=children.end()) file<<" "<<(*iter)[m_columns.step_line]<is_fight_to_robot()) { Gtk::MessageDialog dialog(*this, _("AI Warn"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); Glib::ustring msg =_("Open book view will close the AI game. Are you sure?"); dialog.set_secondary_text(msg); int result = dialog.run(); switch (result) { case (Gtk::RESPONSE_OK): { board->free_game(); break; } case (Gtk::RESPONSE_CANCEL): { return; break; } default: { return; break; } } /* switch */ } /* if */ /** 获取文件后先它将它转换成pgn文件才能打开*/ /** get the file, convert it to pgn file */ int out; std::string::size_type const pos = filename.find(".pgn"); if (pos == std::string::npos) { /* Not a pgn file, we should convert it */ std::string const convert_cmdline = \ "convert_pgn \"" + \ filename + \ "\""; if (system(convert_cmdline.c_str()) < 0) { DLOG("convert pgn file error\n"); return; // XXX: study this } out = board->open_file("/tmp/gmchess.pgn"); } else { out = board->open_file( filename); } if (out < 0) { DLOG("open file: %s error\n",filename.c_str()); Gtk::MessageDialog dialog("Error", false, Gtk::MESSAGE_INFO); dialog.set_secondary_text(_("the file maybe not right format for chess")); dialog.run(); } else { init_move_treeview(); set_information(); m_notebook->set_current_page(0); } } void MainWindow::info_window(const std::string& info) { Gtk::MessageDialog dialog("Info",false, Gtk::MESSAGE_INFO); dialog.set_secondary_text(info); dialog.run(); } void MainWindow::on_menu_war_to_ai() { on_begin_game(); } void MainWindow::on_menu_free_play() { board->free_game(); m_refTreeModel->clear(); set_status(); } void MainWindow::on_menu_rev_play() { board->rev_game(); } void MainWindow::on_menu_file_quit() { if(board->get_status() == NETWORK_STATUS){ board->send_to_socket("close"); } Gtk::Main::quit(); } bool MainWindow::on_delete_event(GdkEventAny* event) { if(board->get_status() == NETWORK_STATUS){ Gtk::MessageDialog dialog(*this, _("Warning"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); Glib::ustring msg =_("Are you sure to close the network game?"); dialog.set_secondary_text(msg); int result = dialog.run(); switch (result) { case (Gtk::RESPONSE_OK): { board->send_to_socket("close"); break; } case (Gtk::RESPONSE_CANCEL): { return true; break; } default: { return true; break; } } } return Gtk::Window::on_delete_event(event); } void MainWindow::on_menu_view_preferences() { if(NULL == confwindow){ confwindow = new ConfWindow(this); confwindow->signal_quit().connect(sigc::mem_fun(*this, &MainWindow::on_conf_window_quit)); confwindow->raise(); }else confwindow->raise(); } void MainWindow::on_conf_window_quit() { save_conf(); if(atoi(GMConf["desktop_size"].c_str()) == 1) board->set_board_size(BIG_BOARD); else board->set_board_size(SMALL_BOARD); board->set_themes(GMConf["themes"]); } void MainWindow::on_conf_window_close() { if(NULL !=confwindow){ delete confwindow; confwindow=NULL; } } void MainWindow::on_menu_help() { Gtk::MessageDialog dialog(*this, _("Function not implemented yet")); dialog.run(); } void MainWindow::on_menu_about() { static Gtk::AboutDialog* about(0); if(about == 0){ std::vector authors; authors.push_back("lerosua@gmail.com "); authors.push_back("wind(xihels@gmail.com)"); about = new Gtk::AboutDialog ; about->set_logo(ui_logo); if(GTKMM_MAJOR_VERSION==2 && GTKMM_MINOR_VERSION>=12) about->set_program_name("GMChess"); about->set_version(version); about->set_website("https://lerosua.github.io"); about->set_copyright("Copyright (c) 2009 - 2011 lerosua"); about->set_comments(_("GMChess is a Chinese chess game written in gtkmm.")); about->set_authors(authors); about->set_license (_("This program is licensed under GNU General Public Licence (GPL) version 2.")); Glib::ustring transer = "zh_CN lerosua@gmail.com\nru Sadovnikov Dmitry "; about->set_translator_credits(transer); } about->run(); delete about; about=0; } void MainWindow::add_step_line(int num,const Glib::ustring& f_line) { Gtk::TreeModel::iterator iter = m_refTreeModel->append(); (*iter)[m_columns.step_line] = f_line; (*iter)[m_columns.step_num] = num; (*iter)[m_columns.step_bout] = (int)((num+1)/2); if((num%2) ==0){ (*iter)[m_columns.player] = _("Black"); } else{ (*iter)[m_columns.player] = _("Red"); } Gtk::TreeModel::Path path(iter); m_treeview.scroll_to_row(path); } void MainWindow::del_step_last_line() { Gtk::TreeModel::iterator iter = m_refTreeModel->children().end(); iter--; m_refTreeModel->erase(*iter); } void MainWindow::init_move_treeview() { m_refTreeModel->clear(); const std::vector& move_chinese = board->get_move_chinese_snapshot(); std::vector::const_iterator iter; iter = move_chinese.begin(); for(int i=1;iter != move_chinese.end(); iter++,i++) add_step_line(i,*iter); } bool MainWindow::on_treeview_click(GdkEventButton* ev) { if(board->is_fight_to_robot()) return true; Glib::RefPtr selection = m_treeview.get_selection(); Gtk::TreeModel::iterator iter = selection->get_selected(); if(!selection->count_selected_rows()) return false; Gtk::TreeModel::Path path(iter); Gtk::TreeViewColumn* tvc; int cx, cy; if(!m_treeview.get_path_at_pos((int) ev->x, (int) ev->y, path, tvc, cx, cy)) return false;; if(ev->type == GDK_2BUTTON_PRESS){ // TODO: alias to GDK_DOUBLE_BUTTON_PRESS int num = (*iter)[m_columns.step_num]; board->get_board_by_move(num); return true; } return false; } void MainWindow::set_information() { Gtk::Label* info = 0;ui_xml->get_widget("info_label",info); const Board_info& board_info = board->get_board_info(); p1_name->set_label(board_info.black); p2_name->set_label(board_info.red); Glib::ustring text = Glib::ustring(_("Game: ")) +board_info.event+"\n"; text = text + _("Time: ")+board_info.date+"\n"; text = text + _("Site: ")+board_info.site+"\n"; text = text + _("Result: ")+board_info.result+"\n"; text = text + _("Opening: ")+board_info.opening+"\n"; text = text + _("Variation: ")+board_info.variation+"\n"; info->set_label(text); info->set_ellipsize(Pango::ELLIPSIZE_END); set_status(); } void MainWindow::set_status() { int f_status = board->get_status(); bool f_use=1; switch(f_status){ case READ_STATUS: btn_next->set_sensitive(f_use); btn_prev->set_sensitive(f_use); btn_start->set_sensitive(f_use); btn_end->set_sensitive(f_use); btn_begin->set_sensitive(f_use); btn_lose->set_sensitive(1-f_use); btn_draw->set_sensitive(1-f_use); btn_rue->set_sensitive(1-f_use); break; case FIGHT_STATUS: case NETWORK_STATUS: btn_next->set_sensitive(1-f_use); btn_prev->set_sensitive(1-f_use); btn_start->set_sensitive(1-f_use); btn_end->set_sensitive(1-f_use); btn_begin->set_sensitive(1-f_use); btn_lose->set_sensitive(f_use); btn_draw->set_sensitive(f_use); btn_rue->set_sensitive(f_use); break; case FREE_STATUS: btn_next->set_sensitive(f_use); btn_prev->set_sensitive(f_use); btn_start->set_sensitive(f_use); btn_end->set_sensitive(f_use); btn_begin->set_sensitive(f_use); btn_lose->set_sensitive(1-f_use); btn_draw->set_sensitive(1-f_use); btn_rue->set_sensitive(1-f_use); break; default: break; }; } void MainWindow::on_network_game(const std::string& me_name,const std::string& enemy_name,bool role_red_) { p1_name->set_text(enemy_name); p2_name->set_text(me_name); if(!role_red_){ board->rev_game(); } m_refTreeModel->clear(); board->start_network(); set_status(); btn_begin->set_sensitive(false); } void MainWindow::on_chanju_game() { /** 已经在对战中,则询问是否开始新游戏*/ /** ask if start new game */ if(board->is_fight_to_robot()){ Gtk::MessageDialog dialog(*this, _("new game"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); Glib::ustring msg =_("Will you start a new game?"); dialog.set_secondary_text(msg); int result = dialog.run(); switch (result) { case (Gtk::RESPONSE_OK): { m_refTreeModel->clear(); board->chanju_game(); break; } case (Gtk::RESPONSE_CANCEL): { break; } default: { break; } } return; } else if(board->is_network_game()){ Gtk::MessageDialog dialog_info(*this, _("Information"), false); Glib::ustring msg =_("You are play online, Please end this game first!"); dialog_info.set_secondary_text(msg); dialog_info.run(); return ; } m_refTreeModel->clear(); board->start_robot(false); set_status(); btn_begin->set_sensitive(false); //btn_chanjue->set_sensitive(false); } void MainWindow::on_begin_game() { /** 已经在对战中,则询问是否开始新游戏*/ /** ask if start new game */ if(board->is_fight_to_robot()){ Gtk::MessageDialog dialog(*this, _("new game"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); Glib::ustring msg =_("Will you start a new game?"); dialog.set_secondary_text(msg); int result = dialog.run(); switch (result) { case (Gtk::RESPONSE_OK): { m_refTreeModel->clear(); board->new_game(); break; } case (Gtk::RESPONSE_CANCEL): { break; } default: { break; } } return; } else if(board->is_network_game()){ Gtk::MessageDialog dialog_info(*this, _("Information"), false); Glib::ustring msg =_("You are playing online, Please end this game first!"); dialog_info.set_secondary_text(msg); dialog_info.run(); return ; } m_refTreeModel->clear(); board->start_robot(); set_status(); btn_begin->set_sensitive(false); } void MainWindow::on_lose_game() { if(board->is_fight_to_robot()){ Gtk::MessageDialog dialog(*this, _("be lose"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); Glib::ustring msg =_("Will you resign in this game?"); dialog.set_secondary_text(msg); int result =dialog.run(); switch (result) { case (Gtk::RESPONSE_OK): { //m_refTreeModel->clear(); board->free_game(); set_status(); break; } case (Gtk::RESPONSE_CANCEL): { //board->free_game(false); //set_status(); break; } default: { break; } } return; } else if(board->is_network_game()){ Gtk::MessageDialog dialog(*this, _("be lose"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); Glib::ustring msg =_("Will you resign in this game?"); dialog.set_secondary_text(msg); int result =dialog.run(); switch (result) { case (Gtk::RESPONSE_OK): { board->send_to_socket("resign"); Gtk::MessageDialog dialog_info(*this, _("Information"), false); Glib::ustring msg =_("You lose the game!"); dialog_info.set_secondary_text(msg); dialog_info.run(); board->free_game(); set_status(); break; } case (Gtk::RESPONSE_CANCEL): { //board->free_game(false); //set_status(); break; } default: { break; } } } } /** draw 是打平局面的意思*/ void MainWindow::on_draw_game() { if(board->is_fight_to_robot()){ board->draw_move(); } else if(board->is_network_game()){ if(board->is_human_player()){ board->send_to_socket("draw"); }else{ Gtk::MessageDialog dialog(*this, _("Warning"), false); Glib::ustring msg =_("You may only take a back move when it's your turn. Please wait a minute!"); dialog.set_secondary_text(msg); dialog.run(); } } } void MainWindow::on_rue_game() { /** 如果是网络对战,则需要确认信息*/ /** 设置成只有用户走时才能悔棋,一次撤销两步,即ai的一步,用户的一步,再次轮到用户走 * 这么做是为了防止ai在思考中撤销着法会产生冲突*/ if(board->is_fight_to_robot()){ if(board->is_human_player()){ board->rue_move(); board->rue_move(); }else{ Gtk::MessageDialog dialog(*this, _("Warning"), false); Glib::ustring msg =_("You can only take a back move when it's your turn. Please wait a minute!"); dialog.set_secondary_text(msg); dialog.run(); } } else if(board->is_network_game()){ if(board->is_human_player()){ /** 发送了悔棋指令,此时界面不应该能操作,直到对方返回应答,yes/no */ board->send_to_socket("rue"); }else{ Gtk::MessageDialog dialog(*this, _("Warning"), false); Glib::ustring msg =_("You can only take a back move when it's your turn. Please wait a minute!"); dialog.set_secondary_text(msg); dialog.run(); } } } bool MainWindow::on_end_game(OVERSTATUS _over) { Glib::ustring msg ; switch(_over){ case ROBOT_WIN: //robot win msg=_("You Lose!\nDo you want to start a new game?"); CSound::play(SND_LOSS); break; case ROBOT_LOSE: //robot lose msg=_("Congratuations, YOU WIN!\nTo start a new game, click OK"); CSound::play(SND_WIN); break; case ROBOT_DRAW: //robot want to draw msg=_("Draw Game!"); break; case ROBOT_OVER_TIME: // robot overload time,lose msg = _("The opponent used up their time. You Win!"); CSound::play(SND_WIN); break; case HUMAN_OVER_TIME: msg = _("You used up your time. You Lose!"); CSound::play(SND_LOSS); default: break; } Gtk::MessageDialog dialog_info(*this, _("Game Over"), false); dialog_info.set_secondary_text(msg); dialog_info.run(); if(board->is_network_game()) auto_save_chess_file(); board->free_game(false); set_status(); } void MainWindow::set_red_war_time(const Glib::ustring& f_time,const Glib::ustring& c_time) { p2_war_time->set_text(f_time); p2_step_time->set_text(c_time); } void MainWindow::set_black_war_time(const Glib::ustring& f_time,const Glib::ustring& c_time) { p1_war_time->set_text(f_time); p1_step_time->set_text(c_time); } void MainWindow::watch_socket(int fd) { board->watch_socket(fd); } void MainWindow::start_with(const std::string& param) { if((param.find("network-game-red,"))!= std::string::npos){ //start network game with red player std::string enemy_name,my_name; size_t pos_s,pos_e,pos_m; pos_s= param.find("enemy_name:"); pos_e= param.find(",my_name:"); pos_m= param.find_first_of("@"); enemy_name = param.substr(pos_s+11,pos_m-pos_s-11); pos_m = param.find_last_of("@"); my_name = param.substr(pos_e+9,pos_m-pos_e-9); on_network_game(enemy_name,my_name,true); }else if((param.find("network-game-black,")) != std::string::npos){ //start network game with black player std::string enemy_name,my_name; size_t pos_s,pos_e,pos_m; pos_s= param.find("enemy_name:"); pos_e= param.find(",my_name:"); pos_m= param.find_first_of("@"); enemy_name = param.substr(pos_s+11,pos_m-pos_s-11); pos_m = param.find_last_of("@"); my_name = param.substr(pos_e+9,pos_m-pos_e-9); on_network_game(my_name,enemy_name,false); } else{ if(!param.empty()) open_file(param); } } gmchess-0.29.6.3/src/MainWindow.h000066400000000000000000000116721323660377300164370ustar00rootroot00000000000000/* * ===================================================================================== * * Filename: MainWindow.h * * Description: 主窗口 * * Version: 1.0 * Created: 2009年02月14日 07时49分10秒 CST * Revision: none * Compiler: gcc * * Author: lerosua (), lerosua@gmail.com * Company: Cyclone * * ===================================================================================== */ #ifndef GMCHESS_MAINWINDOW_FILE_HEADER_INC #define GMCHESS_MAINWINDOW_FILE_HEADER_INC #include #include #include #include #include "Board.h" #define main_ui DATA_DIR"/gmchess.glade" class Board; class BookView; class ConfWindow; class MainWindow:public Gtk::Window { public: MainWindow(); ~MainWindow(); /** 回到最初局面*/ void on_first_move(); /** 去到最后的局面*/ void on_last_move(); /** 执行下一步*/ void on_next_move(); /** 执行上一步*/ void on_back_move(); /** 开始AI对战*/ void on_begin_game(); /** start chanhue game*/ void on_chanju_game(); /** 开始网络对战*/ /** * @param me_ 已方名字 * @param enemy_ 对方名字 * @param role_red_ 已方角色 */ void on_network_game(const std::string& me_,const std::string& enemy_,bool role_red_=true); /** gmchess最开始运行带的参数解释函数*/ void start_with(const std::string& param); /** 认输*/ void on_lose_game(); /** 求和*/ void on_draw_game(); /** 悔棋*/ void on_rue_game(); /** 结束对局,跳出对话框*/ bool on_end_game(OVERSTATUS _over); /** treeview 双击事件回调*/ bool on_treeview_click(GdkEventButton* ev); void set_comment(const std::string& f_comment); /** 将引擎的返回显示到相关textview里 */ void show_textview_engine_log(const std::string& f_text); /** 清空引擎textview里的内容*/ void textview_engine_log_clear(); /** 添加treeview数据*/ void add_step_line(int num,const Glib::ustring& f_line); /** 删除treeview的最后一行,悔棋用的*/ void del_step_last_line(); /** 显示出当前步时位置*/ void show_treeview_step(); bool on_foreach_iter(const Gtk::TreeModel::iterator iter); void open_file(const std::string& filename); void change_play(bool player); void set_red_war_time(const Glib::ustring& f_time,const Glib::ustring& c_time); void set_black_war_time(const Glib::ustring& f_time,const Glib::ustring& c_time); void on_conf_window_close(); void on_conf_window_quit(); /** 根据大小调整棋盘*/ /** resize the chess by board*/ void on_size_change(); void save_conf(); void watch_socket(int fd); bool on_delete_event(GdkEventAny* event); void info_window(const std::string& info); /** 用于网络对战自动保存棋谱*/ void auto_save_chess_file(); protected: /** 初始化配置文件*/ void init_conf(); void init_ui_manager(); void on_menu_open_file(); void on_menu_save_file(); void on_menu_save_board_to_png(); void on_menu_file_quit(); void on_menu_view_preferences(); void on_menu_war_to_ai(); void on_menu_free_play(); void on_menu_rev_play(); void on_menu_help(); void on_menu_about(); /** 初始化着法treeview */ void init_move_treeview(); /** 设置棋盘相关信息*/ void set_information(); /**各种模式转换 --- 设置着法按钮可见性*/ void set_status(); public: class Columns:public Gtk::TreeModel::ColumnRecord { public: Columns() { add(step_num); add(step_bout); add(player); add(step_line); } Gtk::TreeModelColumn step_num; /** 着法回合,红黑各一着为一回合*/ Gtk::TreeModelColumn step_bout; Gtk::TreeModelColumn player; Gtk::TreeModelColumn step_line; }; Columns m_columns; Glib::RefPtr m_refTreeModel; private: typedef Glib::RefPtr < Gtk::Builder> GBuilderXML; Board* board; GBuilderXML ui_xml; Glib::RefPtr ui_manager; Glib::RefPtr action_group; Gtk::Widget* menubar; Gtk::TreeView m_treeview; BookView* m_bookview; Gtk::ButtonBox* buttonbox_war; Gtk::TextView* text_comment; Gtk::TextView* text_engine_log; Gtk::Notebook* m_notebook; ConfWindow* confwindow; Glib::RefPtr ui_logo ; Gtk::Image* p1_image; Gtk::Image* p2_image; Gtk::Label* p1_step_time; Gtk::Label* p2_step_time; Gtk::Label* p1_war_time; Gtk::Label* p2_war_time; Gtk::Label* p1_name; Gtk::Label* p2_name; /** 读谱时着法的按钮*/ Gtk::Button* btn_start; Gtk::Button* btn_end ; Gtk::Button* btn_prev; Gtk::Button* btn_next; Gtk::Button* btn_chanjue; /** 对战按钮*/ Gtk::Button* btn_begin; Gtk::Button* btn_lose; Gtk::Button* btn_draw; Gtk::Button* btn_rue; }; #endif /* ----- #ifndef GMCHESS_MAINWINDOW_FILE_HEADER_INC ----- */ gmchess-0.29.6.3/src/Makefile.am000066400000000000000000000022211323660377300162340ustar00rootroot00000000000000SUBDIRS =engine # See https://developer.gnome.org/gtk3/stable/gtk-migrating-2-to-3.html AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(srcdir) \ -g \ -DDATA_DIR=\""${datadir}/gmchess"\" \ -DGMCHESS_LOCALEDIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ -DGTK_DISABLE_SINGLE_INCLUDES \ -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED \ -DGSEAL_ENABLE \ @PACKAGE_CFLAGS@ bin_PROGRAMS=gmchess gmchess_SOURCES= \ main.cc \ Board.cc \ Engine.cc \ Pgnfile.cc \ BookView.cc \ Sound.cc \ robot.cc \ ec_throw.cpp \ ConfWindow.cc \ variablesmap.cc \ MainWindow.cc noinst_HEADERS = \ Board.h \ gmchess.h \ Engine.h \ define.h \ Pgnfile.h \ BookView.h \ Sound.h \ robot.h \ ec_throw.h \ ConfWindow.h \ variablesmap.h \ MainWindow.h gmchess_LDFLAGS = gmchess_LDADD = @LIBS@ @PACKAGE_LIBS@ gmchess-0.29.6.3/src/Pgnfile.cc000066400000000000000000000126471323660377300161100ustar00rootroot00000000000000/* * Pgnfile.h * Copyright (C) lerosua 2009 * */ #include #include #include #include #include "gmchess.h" #include "Pgnfile.h" #include "Engine.h" Pgnfile::Pgnfile(Engine& f_engine):m_engine(f_engine) { } Pgnfile::~Pgnfile() { } char Pgnfile::word_to_pos(const Glib::ustring& word) { if(false){ } else if(word == "一" || word == "前") return 'a'; else if(word == "二" || word == "中") return 'b'; else if(word == "三" || word == "后") return 'c'; else if(word == "四" ) return 'd'; else if(word == "五" ) return 'e'; else return -1; } char Pgnfile::word_to_digit(const Glib::ustring& word) { if(false){ } else if(word == "一" || word == "1") return '1'; else if(word == "二" || word == "2") return '2'; else if(word == "三" || word == "3") return '3'; else if(word == "四" || word == "4") return '4'; else if(word == "五" || word == "5") return '5'; else if(word == "六" || word == "6") return '6'; else if(word == "七" || word == "7") return '7'; else if(word == "八" || word == "8") return '8'; else if(word == "九" || word == "9") return '9'; else return -1; } char Pgnfile::word_to_action(const Glib::ustring& word) { if(false){ } else if(word == "平") return '.'; else if(word == "进") return '+'; else if(word == "退") return '-'; else return -1; } char Pgnfile::word_to_code(const Glib::ustring& word) { if(false){ } else if(word == "帅"|| word == "将") return 'K'; else if(word == "仕" || word == "士") return 'A'; else if(word == "相" || word == "象") return 'B'; else if(word == "马") return 'N'; else if(word == "车") return 'R'; else if(word == "炮") return 'C'; else if(word == "兵" || word == "卒") return 'P'; else if(word == "一" || word == "前") return 'a'; else if(word == "二" || word == "中") return 'b'; else if(word == "三" || word == "后") return 'c'; else if(word == "四" ) return 'd'; else if(word == "五" ) return 'e'; else return -1; } bool Pgnfile::get_label(Glib::ustring& dst_str, const Glib::ustring& line_str, const Glib::ustring& name) { size_t pos = line_str.find(name); if(pos == std::string::npos) return false; pos = line_str.find_first_of("\""); if(pos == std::string::npos) return false; Glib::ustring tmp = line_str.substr(pos+1,std::string::npos); size_t end_pos = tmp.find_first_of("\""); dst_str = tmp.substr(0,end_pos); return true; } int Pgnfile::read(const std::string & filename) { std::fstream file; file.open(filename.c_str(),std::ios_base::in); if(!file){ DLOG("open %s file error\n",filename.c_str()); return -1; } m_engine.init_snapshot(start_fen); std::string line; Glib::ustring startFen; bool comment=false; std::string comment_str; while(std::getline(file,line)){ size_t pos = line.find_first_of("["); if(pos != std::string::npos){ get_label(board_info.event,line,"Event"); get_label(board_info.date ,line,"Date"); get_label(board_info.red ,line,"Red "); get_label(board_info.black,line,"Black "); get_label(board_info.site, line, "Site"); get_label(board_info.result,line,"Result"); get_label(board_info.ecco, line, "ECCO"); get_label(board_info.opening,line, "Opening"); get_label(board_info.variation,line, "Variation"); if(get_label(startFen,line, "FEN")){ DLOG("get FEN %s\n",startFen.c_str()); m_engine.init_snapshot(startFen.c_str()); } continue; } /**暂时过滤象眼的信息*/ pos = line.find_first_of("="); if(pos != std::string::npos) continue; /**暂时过滤棋步注释*/ pos = line.find_first_of("{"); if(pos != std::string::npos){ comment = true; /** 注释在一行内结束*/ /** the comment will end in one line*/ size_t s_pos = line.find_last_of("}"); if(s_pos != std::string::npos){ comment_str += line; m_engine.add_comment(comment_str); comment = false; comment_str.clear(); continue; } /** 注释有多行*/ /** the comment has multi line*/ comment_str += line; continue; } pos = line.find_last_of("}"); if(pos != std::string::npos){ comment_str += line; m_engine.add_comment(comment_str); comment = false; comment_str.clear(); continue; } if(comment){ comment_str += line; continue; } Glib::ustring uline(line); int i=0; do{ Glib::ustring word; word.assign(1,uline[i]); i++; int c = word_to_code(word); if(c == -1) continue; Glib::ustring word2; Glib::ustring word3; Glib::ustring word4; word2.assign(1,uline[i++]); word3.assign(1,uline[i++]); word4.assign(1,uline[i++]); std::cout << word<<" "; std::cout << word2<<" "; std::cout << word3<<" "; std::cout << word4<<" "; union Hanzi c_hanzi; /** 如果读到的c是位置,则第二个则是棋子,否则是位置*/ if(c>96){ c_hanzi.word[0] =word_to_code(word2); c_hanzi.word[1] =c; } else { c_hanzi.word[0] =c; c_hanzi.word[1] =word_to_digit(word2); } c_hanzi.word[2] =word_to_action(word3); c_hanzi.word[3] =word_to_digit(word4); std::cout< #include #include using namespace std; void CSound::play (SOUND_EVENTS event) { const char *filename; switch (event) { case SND_MOVE: filename = SOUND_DIR"move.wav"; break; case SND_CHOOSE: filename = SOUND_DIR"choose.wav"; break; case SND_CHECK: filename = SOUND_DIR"check.wav"; break; case SND_EAT: filename = SOUND_DIR"eat.wav"; break; case SND_WIN: filename = SOUND_DIR"win.wav"; break; case SND_LOSS: filename = SOUND_DIR"loss.wav"; break; case SND_10: filename = SOUND_DIR"10.wav"; break; case SND_9: filename = SOUND_DIR"9.wav"; break; case SND_8: filename = SOUND_DIR"8.wav"; break; case SND_7: filename = SOUND_DIR"7.wav"; break; case SND_6: filename = SOUND_DIR"6.wav"; break; case SND_5: filename = SOUND_DIR"5.wav"; break; case SND_4: filename = SOUND_DIR"4.wav"; break; case SND_3: filename = SOUND_DIR"3.wav"; break; case SND_2: filename = SOUND_DIR"2.wav"; break; case SND_1: filename = SOUND_DIR"1.wav"; break; case SND_0: filename = SOUND_DIR"0.wav"; break; default: filename = SOUND_DIR""; break; } play_file(filename); } void CSound::play_file(const char* filename) { gchar* argv[3]; /* storing the program name in std::string */ #ifdef __APPLE__ const std::string const_pname = "afplay"; #else const std::string const_pname = "aplay"; #endif std::vector pname(const_pname.begin(), const_pname.end()); pname.push_back('\0'); argv[0] = &*pname.begin(); // retrieve non-const gchar * argv[1] = (gchar *)filename; argv[2] = NULL; GError* err; GSpawnFlags flas = (GSpawnFlags)(G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL); g_spawn_async(NULL, argv, NULL, flas, NULL, NULL, NULL, &err); } gmchess-0.29.6.3/src/Sound.h000066400000000000000000000007031323660377300154440ustar00rootroot00000000000000/* * Sound.h * Copyright (C) lerosua 2009 * */ #ifndef __GM_SOUND_H__ #define __GM_SOUND_H__ #define SOUND_DIR DATA_DIR"/sound/" enum SOUND_EVENTS { SND_NULL, SND_EAT, SND_CHECK, SND_MOVE, SND_CHOOSE, SND_WIN, SND_LOSS, SND_10, SND_9, SND_8, SND_7, SND_6, SND_5, SND_4, SND_3, SND_2, SND_1, SND_0 }; namespace CSound { void play (SOUND_EVENTS event); void play_file(const char* filename); }; #endif gmchess-0.29.6.3/src/define.h000066400000000000000000000035431323660377300156130ustar00rootroot00000000000000/* * ===================================================================================== * * Filename: define.h * * Description: * * Version: 1.0 * Created: 2009年02月16日 16时08分04秒 * Revision: none * Compiler: g++ * * Author: lerosua@gmail.com * Company: cyclone * * ===================================================================================== */ #ifndef __DEFINE_HH_ #ifdef __DEBUG_D #define DLOG(fmt, ...) \ { \ char buffer[36] = {0}; \ time_t t = time(NULL); \ strftime(buffer, 36, "%F %T ", localtime(&t)); \ fprintf(stderr, "%s %s|%d| " fmt, \ buffer, __FILE__, __LINE__, ##__VA_ARGS__); \ } #define RLOG(fmt, ...) \ { \ char buffer[36] = {0}; \ time_t t = time(NULL); \ strftime(buffer, 36, "%F %T ", localtime(&t)); \ fprintf(stderr, "%s %s|%d| " fmt, \ buffer, __FILE__, __LINE__, ##__VA_ARGS__); \ } #elif __RELEASE_D #define DLOG(fmt, ...) \ ; #define RLOG(fmt, ...) \ { \ char buffer[36] = {0}; \ time_t t = time(NULL); \ strftime(buffer, 36, "%F %T ", localtime(&t)); \ fprintf(stdout, "%s " fmt, buffer, ##__VA_ARGS__); \ } #else // by default: __RELEASE_D and __DEBUG_D are not present in compilation #define DLOG(fmt, ...) \ { \ char buffer[36] = {0}; \ time_t t = time(NULL); \ strftime(buffer, 36, "%F %T ", localtime(&t)); \ fprintf(stderr, "%s %s|%d| " fmt, \ buffer, __FILE__, __LINE__, ##__VA_ARGS__); \ } #define RLOG(fmt, ...) \ { \ char buffer[36] = {0}; \ time_t t = time(NULL); \ strftime(buffer, 36, "%F %T ", localtime(&t)); \ fprintf(stdout, "%s " fmt, buffer, ##__VA_ARGS__); \ } #endif #endif gmchess-0.29.6.3/src/ec_throw.cpp000066400000000000000000000020331323660377300165170ustar00rootroot00000000000000/* * ===================================================================================== * * Filename: ec_throw.cpp * * Description: 检查一个系统调用,如果有错误,抛出一个异常。 * check error when throw * * Version: 1.0 * Created: 2007年11月28日 20时30分02秒 CST * Revision: none * Compiler: gcc * * Author: wind (xihe), xihels@gmail.com * Company: cyclone * * Copyright (C) wind 2009 * ===================================================================================== */ #include "ec_throw.h" std::runtime_error throw_except(const char* func, const char* file, long line, const char* var) { std::stringstream stream; stream << "File: " << file << std::endl; stream << "Function: " << func << std::endl; stream << "Expression:" << std::endl << line << ":\t" << var << std::endl; stream << "Errno: " << errno << std::endl; stream << strerror(errno) << std::endl; return std::runtime_error(stream.str()); } gmchess-0.29.6.3/src/ec_throw.h000066400000000000000000000017441323660377300161740ustar00rootroot00000000000000/* * ===================================================================================== * * Filename: ec_throw.h * * Description: 检查一个系统调用,如果有错误,抛出一个异常。 * * Version: 1.0 * Created: 2007年08月12日 12时53分55秒 CST * Revision: none * Compiler: gcc * * Author: wind (xihe), xihels@gmail.com * Company: cyclone * * Copyright (C) wind 2009 * * ===================================================================================== */ #ifndef _EC_THROW_H_ #define _EC_THROW_H_ #include #include #include #include std::runtime_error throw_except(const char* func, const char* file, long line, const char* var); #define EC_THROW(VAR) if ((VAR)) throw throw_except(__func__, __FILE__, __LINE__, #VAR) #endif // _EC_THROW_H_ //void test() //{ // int f; // EC_THROW( -1 == (f = open("noexist", O_RDONLY))); //} gmchess-0.29.6.3/src/engine/000077500000000000000000000000001323660377300154505ustar00rootroot00000000000000gmchess-0.29.6.3/src/engine/CodeConverter.h000066400000000000000000000046131323660377300203670ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005 by xihe * * xihels@gmail.com * * * * 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., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ // 代码转换操作类 #ifndef CODE_CONVERTER_H #define CODE_CONVERTER_H #include #include #include using std::runtime_error; using std::string; class CodeConverter { private: iconv_t cd; public: // 构造 CodeConverter(const char *from_charset,const char *to_charset) { cd = iconv_open(to_charset,from_charset); } // 析构 ~CodeConverter() { iconv_close(cd); } // 转换输出 string convert(const string& inbuf) { return convert(inbuf.c_str(), inbuf.size()); } string convert(const char* inbuf, size_t inlen) { size_t outlen = inlen * 3; char *pin = (char*)inbuf; char outbuf[outlen]; char *pout = &outbuf[0]; //bzero(pout, outbuf); size_t oldoutlen = outlen; if(-1 == iconv(cd,&pin,(size_t *)&inlen , &pout,(size_t *)&outlen) ) { return string(); } else { outlen = oldoutlen - outlen; outbuf[outlen] = '\0'; return string(outbuf, outbuf + outlen); } } }; #endif //CODE_CONVERTER_H gmchess-0.29.6.3/src/engine/Makefile.am000066400000000000000000000020211323660377300174770ustar00rootroot00000000000000bin_PROGRAMS= eleeye_engine convert_pgn lib_LTLIBRARIES = libeval.la eleeye_engine_CXXFLAGS= $(AM_CPPFLAGS) convert_pgn_CXXFLAGS= $(AM_CPPFLAGS) eleeye_engine_SOURCES= \ book.cpp \ eleeye.cpp \ genmoves.cpp \ hash.cpp \ movesort.cpp \ pipe.cpp \ position.cpp \ pregen.cpp \ search.cpp \ ucci.cpp convert_pgn_SOURCES = \ convert_pgn.cpp \ pregen.cpp \ position.cpp \ genmoves.cpp \ cchess.cpp \ pgnfile.cpp libeval_la_SOURCES = \ preeval.cpp \ genmoves.cpp \ pregen.cpp \ position.cpp \ evaluate.cpp noinst_HEADERS = \ base2.h \ base.h \ book.h \ cchess.h \ CodeConverter.h \ ecco.h \ hash.h \ movesort.h \ parse.h \ pgnfile.h \ pipe.h \ position.h \ pregen.h \ rc4prng.h \ search.h \ ucci.h \ x86asm.h \ mips.h \ preeval.h \ xqffile.h eleeye_engine_LDFLAGS= -ldl convert_pgn_LDFLAGS= -ldl #libeval_so_LDFLAGS= -fPIC -shared AM_CPPFLAGS = EXTRA_DIST = $(noinst_HEADERS) gmchess-0.29.6.3/src/engine/base.h000066400000000000000000000041461323660377300165400ustar00rootroot00000000000000#include #include #ifndef BASE_H #define BASE_H #ifdef _MSC_VER typedef signed __int64 int64_t; // ll typedef unsigned __int64 uint64_t; // qw typedef signed __int32 int32_t; // l typedef unsigned __int32 uint32_t; // dw typedef signed __int16 int16_t; // s typedef unsigned __int16 uint16_t; // w typedef signed __int8 int8_t; // c typedef unsigned __int8 uint8_t; // uc #define FORMAT_I64 "I64" #else #include #define FORMAT_I64 "ll" #endif #define __ASSERT(a) assert(a) #define __ASSERT_BOUND(a, b, c) assert((a) <= (b) && (b) <= (c)) #define __ASSERT_BOUND_2(a, b, c, d) assert((a) <= (b) && (b) <= (c) && (c) <= (d)) inline bool EQV(bool bArg1, bool bArg2) { return bArg1 ? bArg2 : !bArg2; } inline bool XOR(bool bArg1, bool bArg2) { return bArg1 ? !bArg2 : bArg2; } template inline T MIN(T Arg1, T Arg2) { return Arg1 < Arg2 ? Arg1 : Arg2; } template inline T MAX(T Arg1, T Arg2) { return Arg1 > Arg2 ? Arg1 : Arg2; } template inline T ABS(T Arg) { return Arg < 0 ? -Arg : Arg; } template inline T SQR(T Arg) { return Arg * Arg; } template inline void SWAP(T &Arg1, T &Arg2) { T Temp; Temp = Arg1; Arg1 = Arg2; Arg2 = Temp; } inline int PopCnt8(uint8_t uc) { int n; n = ((uc >> 1) & 0x55) + (uc & 0x55); n = ((n >> 2) & 0x33) + (n & 0x33); return (n >> 4) + (n & 0x0f); } inline int PopCnt16(uint16_t w) { int n; n = ((w >> 1) & 0x5555) + (w & 0x5555); n = ((n >> 2) & 0x3333) + (n & 0x3333); n = ((n >> 4) & 0x0f0f) + (n & 0x0f0f); return (n >> 8) + (n & 0x00ff); } inline int PopCnt32(uint32_t dw) { int n; n = ((dw >> 1) & 0x55555555) + (dw & 0x55555555); n = ((n >> 2) & 0x33333333) + (n & 0x33333333); n = ((n >> 4) & 0x0f0f0f0f) + (n & 0x0f0f0f0f); n = ((n >> 8) & 0x00ff00ff) + (n & 0x00ff00ff); return (n >> 16) + (n & 0x0000ffff); } inline int64_t GetTime() { timeb tb; ftime(&tb); return (int64_t) tb.time * 1000 + tb.millitm; } #endif gmchess-0.29.6.3/src/engine/base2.h000066400000000000000000000033701323660377300166200ustar00rootroot00000000000000#ifdef _WIN32 #include #else #include #include #include #endif #include #include "base.h" #ifndef BASE2_H #define BASE2_H const int PATH_MAX_CHAR = 1024; #ifdef _WIN32 inline void Idle(void) { Sleep(1); } const int PATH_SEPERATOR = '\\'; inline bool AbsolutePath(const char *sz) { return sz[0] == '\\' || (((sz[0] >= 'A' && sz[0] <= 'Z') || (sz[0] >= 'a' && sz[0] <= 'z')) && sz[1] == ':'); } inline void GetSelfExe(char *szDst) { GetModuleFileName(NULL, szDst, PATH_MAX_CHAR); } inline void StartThread(void *ThreadEntry(void *), void *lpParameter) { DWORD dwThreadId; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadEntry, (LPVOID) lpParameter, 0, &dwThreadId); } #else inline void Idle(void) { usleep(1000); } const int PATH_SEPERATOR = '/'; inline bool AbsolutePath(const char *sz) { return sz[0] == '/' || (sz[0] == '~' && sz[1] == '/'); } // XXX: not portable inline void GetSelfExe(char *szDst) { readlink("/proc/self/exe", szDst, PATH_MAX_CHAR); } inline void StartThread(void *ThreadEntry(void *), void *lpParameter) { pthread_t pthread; pthread_attr_t pthread_attr; pthread_attr_init(&pthread_attr); pthread_attr_setscope(&pthread_attr, PTHREAD_SCOPE_SYSTEM); pthread_create(&pthread, &pthread_attr, ThreadEntry, lpParameter); } #endif inline void LocatePath(char *szDst, const char *szSrc) { char *lpSeperator; if (AbsolutePath(szSrc)) { strcpy(szDst, szSrc); } else { GetSelfExe(szDst); lpSeperator = strrchr(szDst, PATH_SEPERATOR); if (lpSeperator == NULL) { strcpy(szDst, szSrc); } else { strcpy(lpSeperator + 1, szSrc); } } } #endif gmchess-0.29.6.3/src/engine/book.cpp000066400000000000000000000060541323660377300171130ustar00rootroot00000000000000/* book.h/book.cpp - Source Code for ElephantEye, Part VI ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.1, Last Modified: Nov. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, see . */ #include "position.h" #include "book.h" // TODO: Delete GCC-specific pragmas #pragma GCC push_option #pragma GCC optimize("00") int GetBookMoves(const PositionStruct &pos, const char *szBookFile, MoveStruct *lpmvs) { BookFileStruct BookFile; PositionStruct posScan; BookStruct bk; int nScan, nLow, nHigh, nPtr; int i, j, nMoves; // 从开局库中搜索着法的例程,有以下几个步骤: // 1. 打开开局库,如果打开失败,则返回空值; if (!BookFile.Open(szBookFile)) { return 0; // TODO: Deal with return value } // 2. 用拆半查找法搜索局面; posScan = pos; for (nScan = 0; nScan < 2; nScan ++) { nPtr = nLow = 0; nHigh = BookFile.nLen - 1; while (nLow <= nHigh) { nPtr = (nLow + nHigh) / 2; BookFile.Read(bk, nPtr); if (BOOK_POS_CMP(bk, posScan) < 0) { nLow = nPtr + 1; } else if (BOOK_POS_CMP(bk, posScan) > 0) { nHigh = nPtr - 1; } else { break; } } if (nLow <= nHigh) { break; } // 原局面和镜像局面各搜索一趟 posScan.Mirror(); } // 3. 如果不到局面,则返回空着; if (nScan == 2) { BookFile.Close(); return 0; } __ASSERT_BOUND(0, nPtr, BookFile.nLen - 1); // 4. 如果找到局面,则向前查找第一个着法; for (nPtr --; nPtr >= 0; nPtr --) { BookFile.Read(bk, nPtr); if (BOOK_POS_CMP(bk, posScan) < 0) { break; } } // 5. 向后依次读入属于该局面的每个着法; nMoves = 0; for (nPtr ++; nPtr < BookFile.nLen; nPtr ++) { BookFile.Read(bk, nPtr); if (BOOK_POS_CMP(bk, posScan) > 0) { break; } if (posScan.LegalMove(bk.wmv)) { // 如果局面是第二趟搜索到的,则着法必须做镜像 lpmvs[nMoves].wmv = (nScan == 0 ? bk.wmv : MOVE_MIRROR(bk.wmv)); lpmvs[nMoves].wvl = bk.wvl; nMoves ++; if (nMoves == MAX_GEN_MOVES) { break; } } } BookFile.Close(); // 6. 对着法按分值排序 for (i = 0; i < nMoves - 1; i ++) { for (j = nMoves - 1; j > i; j --) { if (lpmvs[j - 1].wvl < lpmvs[j].wvl) { SWAP(lpmvs[j - 1], lpmvs[j]); } } } return nMoves; } #pragma GCC pop_option gmchess-0.29.6.3/src/engine/book.h000066400000000000000000000035141323660377300165560ustar00rootroot00000000000000/* book.h/book.cpp - Source Code for ElephantEye, Part VI ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.1, Last Modified: Nov. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, see . */ #ifndef ELEEYE_BOOK_H #define ELEEYE_BOOK_H #include #include "base.h" #include "position.h" struct BookStruct { uint32_t dwZobristLock; uint16_t wmv, wvl; }; // bk inline int BOOK_POS_CMP(const BookStruct &bk, const PositionStruct &pos) { return bk.dwZobristLock < pos.zobr.dwLock1 ? -1 : bk.dwZobristLock > pos.zobr.dwLock1 ? 1 : 0; } struct BookFileStruct { FILE *fp = NULL; int nLen = -1; bool Open(const char *szFileName) { fp = fopen(szFileName, "rb"); if (fp == NULL) { return false; } else { fseek(fp, 0, SEEK_END); nLen = ftell(fp) / sizeof(BookStruct); return true; } } void Close(void) const { fclose(fp); } void Read(BookStruct &bk, int nPtr) const { fseek(fp, nPtr * sizeof(BookStruct), SEEK_SET); fread(&bk, sizeof(BookStruct), 1, fp); } }; /** * @brief 获取开局库着法 */ int GetBookMoves(const PositionStruct &pos, const char *szBookFile, MoveStruct *lpmvs); #endif /* ELEEYE_BOOK_H */ gmchess-0.29.6.3/src/engine/cchess.cpp000066400000000000000000001126121323660377300174270ustar00rootroot00000000000000/* cchess.h/cchess.cpp - Source Code for ElephantEye, Additional Part ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.13, Last Modified: Jun. 2008 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "base.h" #include "position.h" #include "cchess.h" /* 本程序是ElephantEye源程序的附加模块,作用是将ElephantEye的源程序应用到其他软件中。 * 本程序的一个主要应用是中国象棋规则驱动程序,在编译时定义"CCHESS_DLL"后,即可编译成"CCHESS.DLL"。 * 目前该驱动程序已经成为《象棋巫师》的一部分,这也使得《象棋巫师》在中国象棋规则处理上的核心代码公开化了。 */ #ifdef CCHESS_DLL #include extern "C" __declspec(dllexport) LPCSTR WINAPI CchessVersion(VOID); extern "C" __declspec(dllexport) VOID WINAPI CchessInit(BOOL bTraditional); extern "C" __declspec(dllexport) VOID WINAPI CchessPromotion(BOOL bPromotion); extern "C" __declspec(dllexport) VOID WINAPI CchessAddPiece(PositionStruct *lppos, LONG sq, LONG pc, BOOL bDel); extern "C" __declspec(dllexport) BOOL WINAPI CchessCanPromote(PositionStruct *lppos, LONG sq); extern "C" __declspec(dllexport) BOOL WINAPI CchessTryMove(PositionStruct *lppos, LPLONG lpStatus, LONG mv); extern "C" __declspec(dllexport) VOID WINAPI CchessUndoMove(PositionStruct *lppos); extern "C" __declspec(dllexport) BOOL WINAPI CchessTryNull(PositionStruct *lppos); extern "C" __declspec(dllexport) VOID WINAPI CchessUndoNull(PositionStruct *lppos); extern "C" __declspec(dllexport) LONG WINAPI CchessGenMoves(PositionStruct *lppos, LPLONG lpmv); extern "C" __declspec(dllexport) VOID WINAPI CchessSetIrrev(PositionStruct *lppos); extern "C" __declspec(dllexport) VOID WINAPI CchessClearBoard(PositionStruct *lppos); extern "C" __declspec(dllexport) VOID WINAPI CchessBoardMirror(PositionStruct *lppos); extern "C" __declspec(dllexport) VOID WINAPI CchessExchangeSide(PositionStruct *lppos); extern "C" __declspec(dllexport) VOID WINAPI CchessFlipBoard(PositionStruct *lppos); extern "C" __declspec(dllexport) LPSTR WINAPI CchessBoardText(const PositionStruct *lppos, BOOL bAnsi); extern "C" __declspec(dllexport) LPSTR WINAPI CchessBoard2Fen(const PositionStruct *lppos); extern "C" __declspec(dllexport) VOID WINAPI CchessFen2Board(PositionStruct *lppos, LPCSTR szFen); extern "C" __declspec(dllexport) LPSTR WINAPI CchessFenMirror(LPCSTR szFenSrc); extern "C" __declspec(dllexport) LONG WINAPI CchessFileMirror(LONG dwFileStr); extern "C" __declspec(dllexport) LONG WINAPI CchessChin2File(LONGLONG qwChinStr); extern "C" __declspec(dllexport) LONGLONG WINAPI CchessFile2Chin(LONG dwFileStr, LONG sd); extern "C" __declspec(dllexport) LONG WINAPI CchessFile2Move(LONG dwFileStr, const PositionStruct *lppos); extern "C" __declspec(dllexport) LONG WINAPI CchessMove2File(LONG mv, const PositionStruct *lppos); // 驱动程序的版本号,在《象棋巫师》中使用“关于规则”功能可以看到。 static const char *const cszCchessVersion = "Chinese Chess Driver 3.13"; LPCSTR WINAPI CchessVersion(VOID) { return cszCchessVersion; } VOID WINAPI CchessInit(BOOL bTraditional) { PreGenInit(); ChineseInit(bTraditional != FALSE); } VOID WINAPI CchessPromotion(BOOL bPromotion) { PreEval.bPromotion = bPromotion != FALSE; } VOID WINAPI CchessAddPiece(PositionStruct *lppos, LONG sq, LONG pc, BOOL bDel) { lppos->AddPiece(sq, pc, bDel != FALSE); } BOOL WINAPI CchessCanPromote(PositionStruct *lppos, LONG sq) { int pt; if (PreEval.bPromotion && lppos->CanPromote() && CAN_PROMOTE(sq)) { pt = PIECE_TYPE(lppos->ucpcSquares[sq]); return pt == ADVISOR_TYPE || pt == BISHOP_TYPE; } return FALSE; } BOOL WINAPI CchessTryMove(PositionStruct *lppos, LPLONG lpStatus, LONG mv) { return TryMove(*lppos, *(int *) lpStatus, mv); } VOID WINAPI CchessUndoMove(PositionStruct *lppos) { lppos->UndoMakeMove(); } // 执行“空着”,该功能目前仅用在“搜索树分析器”中 BOOL WINAPI CchessTryNull(PositionStruct *lppos) { if (lppos->LastMove().ChkChs > 0) { return FALSE; } else { lppos->NullMove(); return TRUE; } } // 撤消“空着”,该功能目前仅用在“搜索树分析器”中 VOID WINAPI CchessUndoNull(PositionStruct *lppos) { lppos->UndoNullMove(); } // 生成全部合理着法 LONG WINAPI CchessGenMoves(PositionStruct *lppos, LPLONG lpmv) { int i, nTotal, nLegal; MoveStruct mvs[MAX_GEN_MOVES]; nTotal = lppos->GenAllMoves(mvs); nLegal = 0; for (i = 0; i < nTotal; i ++) { if (lppos->MakeMove(mvs[i].wmv)) { lppos->UndoMakeMove(); lpmv[nLegal] = mvs[i].wmv; nLegal ++; } } return nLegal; } VOID WINAPI CchessSetIrrev(PositionStruct *lppos) { lppos->SetIrrev(); } VOID WINAPI CchessClearBoard(PositionStruct *lppos) { lppos->ClearBoard(); } VOID WINAPI CchessStartBoard(PositionStruct *lppos) { lppos->FromFen(cszStartFen); } VOID WINAPI CchessBoardMirror(PositionStruct *lppos) { lppos->Mirror(); } VOID WINAPI CchessExchangeSide(PositionStruct *lppos) { ExchangeSide(*lppos); } VOID WINAPI CchessFlipBoard(PositionStruct *lppos) { FlipBoard(*lppos); } LPSTR WINAPI CchessBoardText(const PositionStruct *lppos, BOOL bAnsi) { static char szBoard[2048]; BoardText(szBoard, *lppos, bAnsi != FALSE); return szBoard; } LPSTR WINAPI CchessBoard2Fen(const PositionStruct *lppos) { static char szFen[128]; lppos->ToFen(szFen); return szFen; } VOID WINAPI CchessFen2Board(PositionStruct *lppos, LPCSTR szFen) { lppos->FromFen(szFen); } LPSTR WINAPI CchessFenMirror(LPCSTR szFenSrc) { static char szFenDst[128]; FenMirror(szFenDst, szFenSrc); return szFenDst; } LONG WINAPI CchessFileMirror(LONG dwFileStr) { return FileMirror(dwFileStr); } LONG WINAPI CchessChin2File(LONGLONG qwChinStr) { return Chin2File(qwChinStr); } LONGLONG WINAPI CchessFile2Chin(LONG dwFileStr, LONG sd) { return File2Chin(dwFileStr, sd); } LONG WINAPI CchessFile2Move(LONG dwFileStr, const PositionStruct *lppos) { return File2Move(dwFileStr, *lppos); } LONG WINAPI CchessMove2File(LONG mv, const PositionStruct *lppos) { return Move2File(mv, *lppos); } #endif /* ElephantEye源程序使用的匈牙利记号约定: * * sq: 格子序号(整数,从0到255,参阅"pregen.cpp") * pc: 棋子序号(整数,从0到47,参阅"position.cpp") * pt: 棋子类型序号(整数,从0到6,参阅"position.cpp") * mv: 着法(整数,从0到65535,参阅"position.cpp") * sd: 走子方(整数,0代表红方,1代表黑方) * vl: 局面价值(整数,从"-MATE_VALUE"到"MATE_VALUE",参阅"position.cpp") * (注:以上五个记号可与uc、dw等代表整数的记号配合使用) * pos: 局面(PositionStruct类型,参阅"position.h") * sms: 位行和位列的着法生成预置结构(参阅"pregen.h") * smv: 位行和位列的着法判断预置结构(参阅"pregen.h") */ /* 以下常量规定了着法表示使用的数字、棋子、方向(进平退)、位置(前后)等的最大个数。 * * 表示位置的符号共有8个,除了“前中后”以外还有“一二三四五”,参考 * 《中国象棋电脑应用规范(二):着法表示》(简称《规范》),即以下网页: *   http://www.elephantbase.net/protocol/cchess_move.htm * 由于“前中后”被安排在“一二三四五”以后,但又和“进平退”在符号上一致,因此要加减"DIRECT_TO_POS"作转换。 * 另外,由于仕(士)相(象)的着法表示的纵线形式和坐标形式有一一对应的关系(固定纵线表示), * 因此可以使用数组"cdwFixFile"和"cucFixMove"对两者进行转换,总共有28种对应关系。 */ const int MAX_DIGIT = 9; const int MAX_PIECE = 7; const int MAX_DIRECT = 3; const int MAX_POS = 8; const int DIRECT_TO_POS = 5; const int MAX_FIX_FILE = 28; /* 以下是数字、棋子、方向和位置编码对应的符号和汉字。 * * 数组长度至少要比这些符号的个数多1,以"ccDirect2Byte"为例,当发现没有方向跟某个符号对应时, * 该方向编号为"MAX_DIRECT",还原成符号时保证数组不越界,并以空格表示。 * 汉字数组有简体(GBK码)和繁体(BIG5码)两套,以"cwDirect2Word..."为例,后缀"-Simp"表示简体,"-Trad"表示繁体。 * 数组在使用前,必须用"lpcwDirect2Word"指针来定位,参阅函数"ChineseInit()"。 */ static const char ccDirect2Byte[4] = { '+', '.', '-', ' ' }; static const char ccPos2Byte[12] = { 'a', 'b', 'c', 'd', 'e', '+', '.', '-', ' ', ' ', ' ', ' ' }; static const uint16_t cwDigit2WordSimp[2][10] = { { 0xbbd2/*一*/, 0xfeb6/*二*/, 0xfdc8/*三*/, 0xc4cb/*四*/, 0xe5ce/*五*/, 0xf9c1/*六*/, 0xdfc6/*七*/, 0xcbb0/*八*/, 0xc5be/*九*/, 0xa1a1/* */ }, { 0xb1a3/*1*/, 0xb2a3/*2*/, 0xb3a3/*3*/, 0xb4a3/*4*/, 0xb5a3/*5*/, 0xb6a3/*6*/, 0xb7a3/*7*/, 0xb8a3/*8*/, 0xb9a3/*9*/, 0xa1a1/* */ } }; static const uint16_t cwPiece2WordSimp[2][8] = { { 0xa7cb/*帅*/, 0xcbca/*仕*/, 0xe0cf/*相*/, 0xedc2/*马*/, 0xb5b3/*车*/, 0xdac5/*炮*/, 0xf8b1/*兵*/, 0xa1a1/* */ }, { 0xabbd/*将*/, 0xbfca/*士*/, 0xf3cf/*象*/, 0xedc2/*马*/, 0xb5b3/*车*/, 0xdac5/*炮*/, 0xe4d7/*卒*/, 0xa1a1/* */ } }; static const uint16_t cwDirect2WordSimp[4] = { 0xf8bd/*进*/, 0xbdc6/*平*/, 0xcbcd/*退*/, 0xa1a1/* */ }; static const uint16_t cwPos2WordSimp[10] = { 0xbbd2/*一*/, 0xfeb6/*二*/, 0xfdc8/*三*/, 0xc4cb/*四*/, 0xe5ce/*五*/, 0xb0c7/*前*/, 0xd0d6/*中*/, 0xf3ba/*后*/, 0xa1a1/* */, 0xa1a1/* */ }; static const uint16_t cwDigit2WordTrad[2][10] = { { 0x40a4/*[一]*/, 0x47a4/*[二]*/, 0x54a4/*[三]*/, 0x7ca5/*[四]*/, 0xada4/*き[五]*/, 0xbba4/*せ[六]*/, 0x43a4/*[七]*/, 0x4ba4/*[八]*/, 0x45a4/*[九]*/, 0x40a1/**/ }, { 0xb0a2/*[1]*/, 0xb1a2/*⒈[2]*/, 0xb2a2/*⒉[3]*/, 0xb3a2/*⒊[4]*/, 0xb4a2/*⒋[5]*/, 0xb5a2/*⒌[6]*/, 0xb6a2/*⒍[7]*/, 0xb7a2/*⒎[8]*/, 0xb8a2/*⒏[9]*/, 0x40a1/**/ } }; static const uint16_t cwPiece2WordTrad[2][8] = { { 0xd3ab/*[帥]*/, 0x4ba5/*[仕]*/, 0xdbac/*[相]*/, 0xa8b0/*皑[馬]*/, 0xaea8/*ó[車]*/, 0xb6ac/*[炮]*/, 0x4ca7/*[兵]*/, 0x40a1/**/ }, { 0x4eb1/*盢[將]*/, 0x68a4/*[士]*/, 0x48b6/*禜[象]*/, 0xa8b0/*皑[馬]*/, 0xaea8/*ó[車]*/, 0xb6ac/*[炮]*/, 0xf2a8/*[卒]*/, 0x40a1/**/ } }; static const uint16_t cwDirect2WordTrad[4] = { 0x69b6/*秈[進]*/, 0xada5/*キ[平]*/, 0x68b0/*癶[退]*/, 0x40a1/**/ }; static const uint16_t cwPos2WordTrad[10] = { 0x40a4/*[一]*/, 0x47a4/*[二]*/, 0x54a4/*[三]*/, 0x7ca5/*[四]*/, 0xada4/*き[五]*/, 0x65ab/*玡[前]*/, 0xa4a4/*い[中]*/, 0xe1ab/*[後]*/, 0x40a1/**/, 0x40a1/**/ }; // 固定纵线表示的纵线数组 static const uint32_t cdwFixFile[28] = { 0x352d3441/*A4-5*/, 0x352b3441/*A4+5*/, 0x342d3541/*A5-4*/, 0x342b3541/*A5+4*/, 0x362d3541/*A5-6*/, 0x362b3541/*A5+6*/, 0x352d3641/*A6-5*/, 0x352b3641/*A6+5*/, 0x332d3142/*B1-3*/, 0x332b3142/*B1+3*/, 0x312d3342/*B3-1*/, 0x312b3342/*B3+1*/, 0x352d3342/*B3-5*/, 0x352b3342/*B3+5*/, 0x332d3542/*B5-3*/, 0x332b3542/*B5+3*/, 0x372d3542/*B5-7*/, 0x372b3542/*B5+7*/, 0x352d3742/*B7-5*/, 0x352b3742/*B7+5*/, 0x392d3742/*B7-9*/, 0x392b3742/*B7+9*/, 0x372d3942/*B9-7*/, 0x372b3942/*B9+7*/, 0x503d3441/*A4=P*/, 0x503d3641/*A6=P*/, 0x503d3342/*B3=P*/, 0x503d3742/*B7=P*/ }; // 固定纵线表示的坐标数组 static const uint8_t cucFixMove[28][2] = { {0xa8, 0xb7}, {0xc8, 0xb7}, {0xb7, 0xc8}, {0xb7, 0xa8}, {0xb7, 0xc6}, {0xb7, 0xa6}, {0xa6, 0xb7}, {0xc6, 0xb7}, {0xab, 0xc9}, {0xab, 0x89}, {0x89, 0xab}, {0xc9, 0xab}, {0x89, 0xa7}, {0xc9, 0xa7}, {0xa7, 0xc9}, {0xa7, 0x89}, {0xa7, 0xc5}, {0xa7, 0x85}, {0x85, 0xa7}, {0xc5, 0xa7}, {0x85, 0xa3}, {0xc5, 0xa3}, {0xa3, 0xc5}, {0xa3, 0x85}, {0xc8, 0xc8}, {0xc6, 0xc6}, {0xc9, 0xc9}, {0xc5, 0xc5} }; // 简体文本棋盘的棋盘字符 static const char *cszBoardStrSimp[19] = { " ┌--┬--┬--┬--┬--┬--┬--┬--┐ ", " │ │ │ │\│/│ │ │ │ ", " ├--┼--┼--┼--※--┼--┼--┼--┤ ", " │ │ │ │/│\│ │ │ │ ", " ├--┼--┼--┼--┼--┼--┼--┼--┤ ", " │ │ │ │ │ │ │ │ │ ", " ├--┼--┼--┼--┼--┼--┼--┼--┤ ", " │ │ │ │ │ │ │ │ │ ", " ├--┴--┴--┴--┴--┴--┴--┴--┤ ", " │ │ ", " ├--┬--┬--┬--┬--┬--┬--┬--┤ ", " │ │ │ │ │ │ │ │ │ ", " ├--┼--┼--┼--┼--┼--┼--┼--┤ ", " │ │ │ │ │ │ │ │ │ ", " ├--┼--┼--┼--┼--┼--┼--┼--┤ ", " │ │ │ │\│/│ │ │ │ ", " ├--┼--┼--┼--※--┼--┼--┼--┤ ", " │ │ │ │/│\│ │ │ │ ", " └--┴--┴--┴--┴--┴--┴--┴--┘ " }; // 繁体文本棋盘的棋盘字符 static const char *cszBoardStrTrad[19] = { " ---------------- ", "    〓    ", " --------“-------- ", "    〓    ", " ---------------- ", "          ", " ---------------- ", "          ", " ---------------- ", "   ", " ---------------- ", "          ", " ---------------- ", "          ", " ---------------- ", "    〓    ", " --------“-------- ", "    〓    ", " ---------------- " }; /* 以下两个数组实现了内部棋盘坐标(Square)和纵线优先坐标(FileSq)的转换。 * * 内部棋盘坐标是有3层边界的16x16冗余数组(参阅"pregen.cpp"),为方便转换成纵线格式, * 要对它们重新编号,即按列优先从右到左,相同的列再从前到后的顺序(参阅《规范》)。 * 转换后的坐标仍然是16x16的冗余数组,整除16后就是列号(右边线是0),对16取余就是行号(上边线是0)。 */ static const uint8_t cucSquare2FileSq[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x70, 0x60, 0x50, 0x40, 0x30, 0x20, 0x10, 0x00, 0, 0, 0, 0, 0, 0, 0, 0x81, 0x71, 0x61, 0x51, 0x41, 0x31, 0x21, 0x11, 0x01, 0, 0, 0, 0, 0, 0, 0, 0x82, 0x72, 0x62, 0x52, 0x42, 0x32, 0x22, 0x12, 0x02, 0, 0, 0, 0, 0, 0, 0, 0x83, 0x73, 0x63, 0x53, 0x43, 0x33, 0x23, 0x13, 0x03, 0, 0, 0, 0, 0, 0, 0, 0x84, 0x74, 0x64, 0x54, 0x44, 0x34, 0x24, 0x14, 0x04, 0, 0, 0, 0, 0, 0, 0, 0x85, 0x75, 0x65, 0x55, 0x45, 0x35, 0x25, 0x15, 0x05, 0, 0, 0, 0, 0, 0, 0, 0x86, 0x76, 0x66, 0x56, 0x46, 0x36, 0x26, 0x16, 0x06, 0, 0, 0, 0, 0, 0, 0, 0x87, 0x77, 0x67, 0x57, 0x47, 0x37, 0x27, 0x17, 0x07, 0, 0, 0, 0, 0, 0, 0, 0x88, 0x78, 0x68, 0x58, 0x48, 0x38, 0x28, 0x18, 0x08, 0, 0, 0, 0, 0, 0, 0, 0x89, 0x79, 0x69, 0x59, 0x49, 0x39, 0x29, 0x19, 0x09, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const uint8_t cucFileSq2Square[256] = { 0x3b, 0x4b, 0x5b, 0x6b, 0x7b, 0x8b, 0x9b, 0xab, 0xbb, 0xcb, 0, 0, 0, 0, 0, 0, 0x3a, 0x4a, 0x5a, 0x6a, 0x7a, 0x8a, 0x9a, 0xaa, 0xba, 0xca, 0, 0, 0, 0, 0, 0, 0x39, 0x49, 0x59, 0x69, 0x79, 0x89, 0x99, 0xa9, 0xb9, 0xc9, 0, 0, 0, 0, 0, 0, 0x38, 0x48, 0x58, 0x68, 0x78, 0x88, 0x98, 0xa8, 0xb8, 0xc8, 0, 0, 0, 0, 0, 0, 0x37, 0x47, 0x57, 0x67, 0x77, 0x87, 0x97, 0xa7, 0xb7, 0xc7, 0, 0, 0, 0, 0, 0, 0x36, 0x46, 0x56, 0x66, 0x76, 0x86, 0x96, 0xa6, 0xb6, 0xc6, 0, 0, 0, 0, 0, 0, 0x35, 0x45, 0x55, 0x65, 0x75, 0x85, 0x95, 0xa5, 0xb5, 0xc5, 0, 0, 0, 0, 0, 0, 0x34, 0x44, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb4, 0xc4, 0, 0, 0, 0, 0, 0, 0x33, 0x43, 0x53, 0x63, 0x73, 0x83, 0x93, 0xa3, 0xb3, 0xc3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 汉字符号的指针,即规定了简体还是繁体,由"ChineseInit()"进行赋值 static const uint16_t (*lpcwDigit2Word)[10], (*lpcwPiece2Word)[8], *lpcwDirect2Word, *lpcwPos2Word; static const char **lpcszBoardStr; static uint16_t wPromote; inline uint8_t SQUARE_FILESQ(int sq) { return cucSquare2FileSq[sq]; } inline uint8_t FILESQ_SQUARE(int sq) { return cucFileSq2Square[sq]; } inline int FILESQ_RANK_Y(int sq) { return sq & 15; } inline int FILESQ_FILE_X(int sq) { return sq >> 4; } inline int FILESQ_COORD_XY(int x, int y) { return (x << 4) + y; } // 获得某个棋子对于本方视角的纵线优先坐标,棋子编号从0到15 inline int FILESQ_SIDE_PIECE(const PositionStruct &pos, int nPieceNum) { int sq; sq = pos.ucsqPieces[SIDE_TAG(pos.sdPlayer) + nPieceNum]; return (sq == 0 ? -1 : pos.sdPlayer == 0 ? SQUARE_FILESQ(sq) : SQUARE_FILESQ(SQUARE_FLIP(sq))); } // 根据子力类型获得棋子的编号 inline int FIRST_PIECE(int pt, int pc) { return pt * 2 - 1 + pc; } /* 以下函数实现了数字、棋子、方向和位置的编码和符号、编码和汉字之间的转换 * * 部分符号编码转换的代码,利用了"position.cpp"中的"PIECE_BYTE"数组和"FenPiece()"函数。 * 从汉字转换为编码是难点,无论处于简体状态还是繁体状态,转换时既考虑了简体、繁体和异体,也考虑了GBK码和BIG5码, * 因此除了依次比较汉字数组外,还增加了对GBK码繁体字和异体字的识别。 */ inline int Digit2Byte(int nArg) { return nArg + '1'; } inline int Byte2Digit(int nArg) { return (nArg >= '1' && nArg <= '9' ? nArg - '1' : MAX_DIGIT); } inline int Piece2Byte(int nArg) { return PIECE_BYTE(nArg); } inline int Byte2Piece(int nArg) { return (nArg >= '1' && nArg <= '7' ? nArg - '1' : nArg >= 'A' && nArg <= 'Z' ? FenPiece(nArg) : nArg >= 'a' && nArg <= 'z' ? FenPiece(nArg - 'a' + 'A') : MAX_PIECE); } inline int Byte2Direct(int nArg) { return (nArg == '+' ? 0 : nArg == '.' || nArg == '=' ? 1 : nArg == '-' ? 2 : 3); } inline int Byte2Pos(int nArg) { return (nArg >= 'a' && nArg <= 'e' ? nArg - 'a' : Byte2Direct(nArg) + DIRECT_TO_POS); } static int Word2Digit(int nArg) { int i; for (i = 0; i < MAX_DIGIT; i ++) { if (nArg == cwDigit2WordSimp[0][i] || nArg == cwDigit2WordSimp[1][i] || nArg == cwDigit2WordTrad[0][i] || nArg == cwDigit2WordTrad[1][i]) { break; } } return i; } static int Word2Piece(int nArg) { int i; if (false) { } else if (nArg == 0x9b8e/*帥*/ || nArg == 0xa28c/*將*/) { return 0; } else if (nArg == 0x52f1/*馬*/ || nArg == 0xd882/*傌*/ || nArg == 0x58d8/*豖[傌]*/) { return 3; } else if (nArg == 0x87dc/*車*/ || nArg == 0x8cb3/*硨*/ || nArg == 0xcfda/*谙[硨]*/ || nArg == 0x6582 /*俥*/) { return 4; } else if (nArg == 0xfcb0/*包*/ || nArg == 0x5da5/*[包]*/ || nArg == 0x68b3/*砲*/ || nArg == 0xa5af/*[砲]*/) { return 5; } else { for (i = 0; i < MAX_PIECE; i ++) { if (nArg == cwPiece2WordSimp[0][i] || nArg == cwPiece2WordSimp[1][i] || nArg == cwPiece2WordTrad[0][i] || nArg == cwPiece2WordTrad[1][i]) { break; } } return i; } } static int Word2Direct(int nArg) { int i; if (nArg == 0x4ddf/*進*/) { return 0; } else { for (i = 0; i < MAX_DIRECT; i ++) { if (nArg == cwDirect2WordSimp[i] || nArg == cwDirect2WordTrad[i]) { break; } } return i; } } static int Word2Pos(int nArg) { int i; if (nArg == 0xe1e1/*後*/ || nArg == 0x5aa6/*[后]*/) { return 2 + DIRECT_TO_POS; } else { for (i = 0; i < MAX_POS; i ++) { if (nArg == cwPos2WordSimp[i] || nArg == cwPos2WordTrad[i]) { break; } } return i; } } // 确定使用简体汉字和繁体汉字 void ChineseInit(bool bTraditional) { if (bTraditional) { lpcwDigit2Word = cwDigit2WordTrad; lpcwPiece2Word = cwPiece2WordTrad; lpcwDirect2Word = cwDirect2WordTrad; lpcwPos2Word = cwPos2WordTrad; lpcszBoardStr = cszBoardStrTrad; wPromote = 0xdcc5/*跑*/; } else { lpcwDigit2Word = cwDigit2WordSimp; lpcwPiece2Word = cwPiece2WordSimp; lpcwDirect2Word = cwDirect2WordSimp; lpcwPos2Word = cwPos2WordSimp; lpcszBoardStr = cszBoardStrSimp; wPromote = 0xe4b1/*变*/; } } // 尝试某个着法,并返回着法状态,参阅"cchess.h" bool TryMove(PositionStruct &pos, int &nStatus, int mv) { if (!pos.LegalMove(mv)) { nStatus = MOVE_ILLEGAL; return false; } if (!pos.MakeMove(mv)) { nStatus = MOVE_INCHECK; return false; } nStatus = 0; nStatus += (pos.LastMove().CptDrw > 0 ? MOVE_CAPTURE : 0); nStatus += (pos.LastMove().ChkChs > 0 ? MOVE_CHECK : 0); nStatus += (pos.IsMate() ? MOVE_MATE : 0); nStatus += pos.RepStatus(3) * MOVE_PERPETUAL; // 提示:参阅"position.cpp"中的"IsRep()"函数 nStatus += (pos.IsDraw() ? MOVE_DRAW : 0); return true; } // 局面镜像 // 红黑互换 void ExchangeSide(PositionStruct &pos) { int i, sq; uint8_t ucsqList[32]; for (i = 16; i < 48; i ++) { sq = pos.ucsqPieces[i]; ucsqList[i - 16] = sq; if (sq != 0) { pos.AddPiece(sq, i, DEL_PIECE); } } for (i = 16; i < 48; i ++) { sq = ucsqList[i < 32 ? i : i - 32]; // 这行不同于FlipBoard if (sq != 0) { pos.AddPiece(SQUARE_FLIP(sq), i); } } pos.ChangeSide(); // 这行不同于FlipBoard } // 翻转棋盘 void FlipBoard(PositionStruct &pos) { int i, sq; uint8_t ucsqList[32]; for (i = 16; i < 48; i ++) { sq = pos.ucsqPieces[i]; ucsqList[i - 16] = sq; if (sq != 0) { pos.AddPiece(sq, i, DEL_PIECE); } } for (i = 16; i < 48; i ++) { sq = ucsqList[i - 16]; // 这行不同于ExchangeSide if (sq != 0) { pos.AddPiece(SQUARE_FLIP(sq), i); } } } // 生成文本棋盘(红子用()表示,黑子用[]表示) void BoardText(char *szBoard, const PositionStruct &pos, bool bAnsi) { char *lpBoard; int i, j, pc; lpBoard = szBoard; if (bAnsi) { lpBoard += sprintf(lpBoard, "\33[0m"); } for (i = 0; i < 19; i ++) { if (i % 2 == 0) { for (j = FILE_LEFT; j <= FILE_RIGHT; j ++) { pc = pos.ucpcSquares[COORD_XY(j, i / 2 + RANK_TOP)]; if ((pc & SIDE_TAG(0)) != 0) { lpBoard += sprintf(lpBoard, bAnsi ? "(\33[1;31m%.2s\33[0m)" : "(%.2s)", (const char *) &lpcwPiece2Word[0][PIECE_TYPE(pc)]); } else if ((pc & SIDE_TAG(1)) != 0) { lpBoard += sprintf(lpBoard, bAnsi ? "[\33[1;32m%.2s\33[0m]" : "[%.2s]", (const char *) &lpcwPiece2Word[1][PIECE_TYPE(pc)]); } else { lpBoard += sprintf(lpBoard, "%.4s", lpcszBoardStr[i] + (j - FILE_LEFT) * 4); } } lpBoard += sprintf(lpBoard, "\r\n"); } else { lpBoard += sprintf(lpBoard, "%s\r\n", lpcszBoardStr[i]); } } } // 对FEN串作镜像(只要识别行分隔符"/",行内字符串顺序颠倒即可) void FenMirror(char *szFenDst, const char *szFenSrc) { int i, j; const char *lpSrc; char *lpDst, *lpDstLimit; char szTempStr[128]; lpSrc = szFenSrc; lpDst = szFenDst; lpDstLimit = lpDst + 127; if (*lpSrc == '\0') { *lpDst = '\0'; return; } while (*lpSrc == ' ') { lpSrc ++; if (*lpSrc == '\0') { *lpDst = '\0'; return; } } i = 0; while(lpDst < lpDstLimit && i < 127) { if (*lpSrc == '/' || *lpSrc == ' ' || *lpSrc == '\0') { for (j = 0; j < i; j ++) { *lpDst = szTempStr[i - j - 1]; lpDst ++; if (lpDst == lpDstLimit) { break; } } i = 0; if (*lpSrc == '/') { *lpDst = '/'; lpDst ++; } else { break; } } else { szTempStr[i] = *lpSrc; i ++; } lpSrc ++; }; while(lpSrc && lpDst < lpDstLimit) { *lpDst = *lpSrc; lpSrc ++; lpDst ++; } *lpDst = '\0'; return; } union C4dwStruct { char c[4]; uint32_t dw; }; /* 函数"FileMirror()"对着法的纵线表示作镜像。 * * 纵线的符号表示基本类似于汉字表示,但当出现类似“前炮退二”这样的表示时,符号表示就会有不同的情况。 * 按照《规范》的建议,表示成"C+-2"最容易被识别,但是也有表示成"+C-2"的,即符号和汉字完全对应,因此本函数也会考虑这种形式。 * 对一般着法而言,纵线表示的镜像是唯一的,但是对于“两条的纵线上有多个兵(卒)”的罕见情况, * 本函数只能考虑最不罕见的一种特例,即两条纵线上各有两个兵(卒),这样,"Paxx"和"Pbxx"分别跟"Pcxx"和"Pdxx"镜像, * 而对于其他情况则无法作出正确转换。 * 注意:符号表示由4个字节构成,所以可以用一个"uint32_t"类型作快速传输(同理,汉字表示用"uint64_t")。 */ uint32_t FileMirror(uint32_t dwFileStr) { int nPos, nFile, pt; C4dwStruct Ret; Ret.dw = dwFileStr; nPos = Byte2Direct(Ret.c[0]); if (nPos == MAX_DIRECT) { pt = Byte2Piece(Ret.c[0]); nFile = Byte2Digit(Ret.c[1]); if (nFile == MAX_DIGIT) { switch (Ret.c[1]) { case 'a': Ret.c[1] = 'c'; break; case 'b': Ret.c[1] = 'd'; break; case 'c': Ret.c[1] = 'a'; break; case 'd': Ret.c[1] = 'b'; break; default: break; } } else { Ret.c[1] = Digit2Byte(8 - nFile); } } else { pt = Byte2Piece(Ret.c[1]); } if ((pt >= ADVISOR_TYPE && pt <= KNIGHT_TYPE) || Byte2Direct(Ret.c[2]) == 1) { Ret.c[3] = Digit2Byte(8 - Byte2Digit(Ret.c[3])); } return Ret.dw; } // 将汉字表示转换为符号表示 uint32_t Chin2File(uint64_t qwChinStr) { int nPos; uint16_t *lpwArg; C4dwStruct Ret; lpwArg = (uint16_t *) (void *) &qwChinStr; nPos = Word2Pos(lpwArg[0]); Ret.c[0] = PIECE_BYTE(Word2Piece(nPos == MAX_POS ? lpwArg[0] : lpwArg[1])); Ret.c[1] = (nPos == MAX_POS ? Digit2Byte(Word2Digit(lpwArg[1])) : ccPos2Byte[nPos]); if ((lpwArg[2] == 0xe4b1/*变*/ || lpwArg[2] == 0xdcc5/*跑*/ || lpwArg[2] == 0x83d7/*變*/) && Word2Piece(lpwArg[3]) == 6) { Ret.c[2] = '='; Ret.c[3] = 'P'; } else { Ret.c[2] = ccDirect2Byte[Word2Direct(lpwArg[2])]; Ret.c[3] = Digit2Byte(Word2Digit(lpwArg[3])); } return Ret.dw; } // 将符号表示转换为汉字表示 uint64_t File2Chin(uint32_t dwFileStr, int sdPlayer) { int nPos; char *lpArg; union { uint16_t w[4]; uint64_t qw; } Ret; lpArg = (char *) &dwFileStr; nPos = Byte2Direct(lpArg[0]); if (nPos == MAX_DIRECT) { nPos = Byte2Pos(lpArg[1]); Ret.w[0] = (nPos == MAX_POS ? lpcwPiece2Word[sdPlayer][Byte2Piece(lpArg[0])] : lpcwPos2Word[nPos]); Ret.w[1] = (nPos == MAX_POS ? lpcwDigit2Word[sdPlayer][Byte2Digit(lpArg[1])] : lpcwPiece2Word[sdPlayer][Byte2Piece(lpArg[0])]); } else { Ret.w[0] = lpcwPos2Word[nPos + DIRECT_TO_POS]; Ret.w[1] = lpcwPiece2Word[sdPlayer][Byte2Piece(lpArg[1])]; } if (lpArg[2] == '=' && Byte2Piece(lpArg[3]) == 6) { Ret.w[2] = wPromote; Ret.w[3] = lpcwPiece2Word[sdPlayer][6]; } else { Ret.w[2] = lpcwDirect2Word[Byte2Direct(lpArg[2])]; Ret.w[3] = lpcwDigit2Word[sdPlayer][Byte2Digit(lpArg[3])]; } return Ret.qw; } /* "File2Move()"函数将纵线符号表示转换为内部着法表示。 * * 这个函数以及后面的"Move2File()"函数是本模块最难处理的两个函数,特别是在处理“两条的纵线上有多个兵(卒)”的问题上。 * 在棋谱的快速时,允许只使用数字键盘,因此1到7依次代表帅(将)到兵(卒)这七种棋子,"File2Move()"函数也考虑到了这个问题。 */ int File2Move(uint32_t dwFileStr, const PositionStruct &pos) { int i, j, nPos, pt, sq, nPieceNum; int xSrc, ySrc, xDst, yDst; C4dwStruct FileStr; int nFileList[9], nPieceList[5]; // 纵线符号表示转换为内部着法表示,通常分为以下几个步骤: // 1. 检查纵线符号是否是仕(士)相(象)的28种固定纵线表示,在这之前首先必须把数字、小写等不统一的格式转换为统一格式; FileStr.dw = dwFileStr; switch (FileStr.c[0]) { case '2': case 'a': FileStr.c[0] = 'A'; break; case '3': case 'b': case 'E': case 'e': FileStr.c[0] = 'B'; break; default: break; } if (FileStr.c[3] == 'p') { FileStr.c[3] = 'P'; } for (i = 0; i < MAX_FIX_FILE; i ++) { if (FileStr.dw == cdwFixFile[i]) { if (pos.sdPlayer == 0) { return MOVE(cucFixMove[i][0], cucFixMove[i][1]); } else { return MOVE(SQUARE_FLIP(cucFixMove[i][0]), SQUARE_FLIP(cucFixMove[i][1])); } } } // 2. 如果不是这28种固定纵线表示,那么把棋子、位置和纵线序号(列号)解析出来 nPos = Byte2Direct(FileStr.c[0]); if (nPos == MAX_DIRECT) { pt = Byte2Piece(FileStr.c[0]); nPos = Byte2Pos(FileStr.c[1]); } else { pt = Byte2Piece(FileStr.c[1]); nPos += DIRECT_TO_POS; } if (nPos == MAX_POS) { // 3. 如果棋子是用列号表示的,那么可以直接根据纵线来找到棋子序号; xSrc = Byte2Digit(FileStr.c[1]); if (pt == KING_TYPE) { sq = FILESQ_SIDE_PIECE(pos, 0); } else if (pt >= KNIGHT_TYPE && pt <= PAWN_TYPE) { j = (pt == PAWN_TYPE ? 5 : 2); for (i = 0; i < j; i ++) { sq = FILESQ_SIDE_PIECE(pos, FIRST_PIECE(pt, i)); if (sq != -1) { if (FILESQ_FILE_X(sq) == xSrc) { break; } } } sq = (i == j ? -1 : sq); } else { sq = -1; } } else { // 4. 如果棋子是用位置表示的,那么必须挑选出含有多个该种棋子的所有纵线,这是本函数最难处理的地方; if (pt >= KNIGHT_TYPE && pt <= PAWN_TYPE) { for (i = 0; i < 9; i ++) { nFileList[i] = 0; } j = (pt == PAWN_TYPE ? 5 : 2); for (i = 0; i < j; i ++) { sq = FILESQ_SIDE_PIECE(pos, FIRST_PIECE(pt, i)); if (sq != -1) { nFileList[FILESQ_FILE_X(sq)] ++; } } nPieceNum = 0; for (i = 0; i < j; i ++) { sq = FILESQ_SIDE_PIECE(pos, FIRST_PIECE(pt, i)); if (sq != -1) { if (nFileList[FILESQ_FILE_X(sq)] > 1) { nPieceList[nPieceNum] = FIRST_PIECE(pt, i); nPieceNum ++; } } } // 5. 找到这些纵线以后,对这些纵线上的棋子进行排序,然后根据位置来确定棋子序号; for (i = 0; i < nPieceNum - 1; i ++) { for (j = nPieceNum - 1; j > i; j --) { if (FILESQ_SIDE_PIECE(pos, nPieceList[j - 1]) > FILESQ_SIDE_PIECE(pos, nPieceList[j])) { SWAP(nPieceList[j - 1], nPieceList[j]); } } } // 提示:如果只有两个棋子,那么“后”表示第二个棋子,如果有多个棋子, // 那么“一二三四五”依次代表第一个到第五个棋子,“前中后”依次代表第一个到第三个棋子。 if (nPieceNum == 2 && nPos == 2 + DIRECT_TO_POS) { sq = FILESQ_SIDE_PIECE(pos, nPieceList[1]); } else { nPos -= (nPos >= DIRECT_TO_POS ? DIRECT_TO_POS : 0); sq = (nPos >= nPieceNum ? -1 : FILESQ_SIDE_PIECE(pos, nPieceList[nPos])); } } else { sq = -1; } } if (sq == -1) { return 0; } // 6. 现在已知了着法的起点,就可以根据纵线表示的后两个符号来确定着法的终点; xSrc = FILESQ_FILE_X(sq); ySrc = FILESQ_RANK_Y(sq); if (pt == KNIGHT_TYPE) { // 提示:马的进退处理比较特殊。 xDst = Byte2Digit(FileStr.c[3]); if (FileStr.c[2] == '+') { yDst = ySrc - 3 + ABS(xDst - xSrc); } else { yDst = ySrc + 3 - ABS(xDst - xSrc); } } else { if (FileStr.c[2] == '+') { xDst = xSrc; yDst = ySrc - Byte2Digit(FileStr.c[3]) - 1; } else if (FileStr.c[2] == '-') { xDst = xSrc; yDst = ySrc + Byte2Digit(FileStr.c[3]) + 1; } else { xDst = Byte2Digit(FileStr.c[3]); yDst = ySrc; } } // 注意:yDst有可能超过范围! if (yDst < 0 || yDst > 9) { return 0; } // 7. 把相对走子方的坐标转换为固定坐标,得到着法的起点和终点。 if (pos.sdPlayer == 0) { return MOVE(FILESQ_SQUARE(FILESQ_COORD_XY(xSrc, ySrc)), FILESQ_SQUARE(FILESQ_COORD_XY(xDst, yDst))); } else { return MOVE(SQUARE_FLIP(FILESQ_SQUARE(FILESQ_COORD_XY(xSrc, ySrc))), SQUARE_FLIP(FILESQ_SQUARE(FILESQ_COORD_XY(xDst, yDst)))); } } // 将内部着法表示转换为纵线符号 uint32_t Move2File(int mv, const PositionStruct &pos) { int i, j, sq, pc, pt, nPieceNum; int xSrc, ySrc, xDst, yDst; int nFileList[9], nPieceList[5]; C4dwStruct Ret; if (SRC(mv) == 0 || DST(mv) == 0) { return 0x20202020; } pc = pos.ucpcSquares[SRC(mv)]; if (pc == 0) { return 0x20202020; } pt = PIECE_TYPE(pc); Ret.c[0] = PIECE_BYTE(pt); if (pos.sdPlayer == 0) { xSrc = FILESQ_FILE_X(SQUARE_FILESQ(SRC(mv))); ySrc = FILESQ_RANK_Y(SQUARE_FILESQ(SRC(mv))); xDst = FILESQ_FILE_X(SQUARE_FILESQ(DST(mv))); yDst = FILESQ_RANK_Y(SQUARE_FILESQ(DST(mv))); } else { xSrc = FILESQ_FILE_X(SQUARE_FILESQ(SQUARE_FLIP(SRC(mv)))); ySrc = FILESQ_RANK_Y(SQUARE_FILESQ(SQUARE_FLIP(SRC(mv)))); xDst = FILESQ_FILE_X(SQUARE_FILESQ(SQUARE_FLIP(DST(mv)))); yDst = FILESQ_RANK_Y(SQUARE_FILESQ(SQUARE_FLIP(DST(mv)))); } if (pt >= KING_TYPE && pt <= BISHOP_TYPE) { Ret.c[1] = Digit2Byte(xSrc); } else { for (i = 0; i < 9; i ++) { nFileList[i] = 0; } j = (pt == PAWN_TYPE ? 5 : 2); for (i = 0; i < j; i ++) { sq = FILESQ_SIDE_PIECE(pos, FIRST_PIECE(pt, i)); if (sq != -1) { nFileList[FILESQ_FILE_X(sq)] ++; } } // 提示:处理“两条的纵线上有多个兵(卒)”的问题上,可参阅"File2Move()"函数。 if (nFileList[xSrc] > 1) { nPieceNum = 0; for (i = 0; i < j; i ++) { sq = FILESQ_SIDE_PIECE(pos, FIRST_PIECE(pt, i)); if (sq != -1) { if (nFileList[FILESQ_FILE_X(sq)] > 1) { nPieceList[nPieceNum] = FIRST_PIECE(pt, i); nPieceNum ++; } } } for (i = 0; i < nPieceNum - 1; i ++) { for (j = nPieceNum - 1; j > i; j --) { if (FILESQ_SIDE_PIECE(pos, nPieceList[j - 1]) > FILESQ_SIDE_PIECE(pos, nPieceList[j])) { SWAP(nPieceList[j - 1], nPieceList[j]); } } } sq = FILESQ_COORD_XY(xSrc, ySrc); for (i = 0; i < nPieceNum; i ++) { if (FILESQ_SIDE_PIECE(pos, nPieceList[i]) == sq) { break; } } Ret.c[1] = (nPieceNum == 2 && i == 1 ? ccPos2Byte[2 + DIRECT_TO_POS] : ccPos2Byte[nPieceNum > 3 ? i : i + DIRECT_TO_POS]); } else { Ret.c[1] = Digit2Byte(xSrc); } } if (pt >= ADVISOR_TYPE && pt <= KNIGHT_TYPE) { if (SRC(mv) == DST(mv)) { Ret.c[2] = '='; Ret.c[3] = 'P'; } else { Ret.c[2] = (yDst > ySrc ? '-' : '+'); Ret.c[3] = Digit2Byte(xDst); } } else { Ret.c[2] = (yDst == ySrc ? '.' : yDst > ySrc ? '-' : '+'); Ret.c[3] = (yDst == ySrc ? Digit2Byte(xDst) : Digit2Byte(ABS(ySrc - yDst) - 1)); } return Ret.dw; } gmchess-0.29.6.3/src/engine/cchess.h000066400000000000000000000041771323660377300171020ustar00rootroot00000000000000/* cchess.h/cchess.cpp - Source Code for ElephantEye, Additional Part ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 2.2, Last Modified: Apr. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "base.h" #include "position.h" #ifndef CCHESS_H #define CCHESS_H void ChineseInit(bool bTraditional = false); bool TryMove(PositionStruct &pos, int &nStatus, int mv); void ExchangeSide(PositionStruct &pos); void FlipBoard(PositionStruct &pos); void BoardText(char *szBoard, const PositionStruct &pos, bool bAnsi = false); void FenMirror(char *szFenDst, const char *szFenSrc); uint32_t FileMirror(uint32_t dwFileStr); uint32_t Chin2File(uint64_t qwChinStr); uint64_t File2Chin(uint32_t dwFileStr, int sdPlayer); int File2Move(uint32_t dwFileStr, const PositionStruct &pos); uint32_t Move2File(int mv, const PositionStruct &pos); // ³涨"TryMove()"ķ״̬ const int MOVE_ILLEGAL = 256; // Ϸŷ const int MOVE_INCHECK = 128; // 򽫾Ϸŷ const int MOVE_DRAW = 64; // ŷ(ԱΪϷģͬ) const int MOVE_PERPETUAL_LOSS = 32; // ظŷ const int MOVE_PERPETUAL_WIN = 16; // Էظŷ const int MOVE_PERPETUAL = 8; // ظεŷ const int MOVE_MATE = 4; // () const int MOVE_CHECK = 2; // const int MOVE_CAPTURE = 1; // #endif gmchess-0.29.6.3/src/engine/convert_pgn.cpp000066400000000000000000000455421323660377300205120ustar00rootroot00000000000000/* CCM->PGN Converter - a Chinese Chess Score Conversion Program Designed by Morning Yellow, Version: 3.14, Last Modified: Jun. 2008 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #ifdef _WIN32 #include #else /* */ #include #endif /* */ #include #include #include "base2.h" #include "parse.h" #include "position.h" #include "cchess.h" #include "ecco.h" #include "pgnfile.h" #include "xqffile.h" #include "CodeConverter.h" static const int _ERROR_OPEN = -2; static const int _ERROR_CREATE = -1; static const int _OK = 0; static const int XQF2PGN_ERROR_OPEN = -3; static const int XQF2PGN_ERROR_FORMAT = -2; /** 中游象棋格式*/ int Ccm2Pgn(const char *szCcmFile, const char *szPgnFile, const EccoApiStruct & EccoApi) { int mv, nStatus; bool bRead, bFlip; PgnFileStruct pgn; PositionStruct pos; char cCcm[8]; FILE * fp; uint32_t dwEccoIndex, dwFileMove[20]; fp = fopen(szCcmFile, "rb"); if (fp == NULL) { return _ERROR_OPEN; } pgn.posStart.FromFen(cszStartFen); pos = pgn.posStart; bRead = bFlip = false; while (fread(&cCcm, 7, 1, fp) > 0) { if (!bRead) { bRead = true; if (cCcm[5] < 5) { bFlip = true; } } if (bFlip) { cCcm[3] = 8 - cCcm[3]; cCcm[5] = 9 - cCcm[5]; cCcm[4] = 8 - cCcm[4]; cCcm[6] = 9 - cCcm[6]; } mv = MOVE(COORD_XY(cCcm[3] + FILE_LEFT, cCcm[5] + RANK_TOP), COORD_XY(cCcm[4] + FILE_LEFT, cCcm[6] + RANK_TOP)); mv &= 0xffff; // 防止TryMove时数组越界 pgn.nMaxMove++; if (pgn.nMaxMove <= 20) { dwFileMove[pgn.nMaxMove - 1] = Move2File(mv, pos); } // 中游可能允许把将吃掉,但ElephantEye不允许,所以跳过非法着法 if (TryMove(pos, nStatus, mv)) { pgn.wmvMoveTable[pgn.nMaxMove] = mv; } else { pgn.nMaxMove--; } if (pos.nMoveNum == MAX_MOVE_NUM) { pos.SetIrrev(); } } if (pgn.nMaxMove < 20) { dwFileMove[pgn.nMaxMove] = 0; } if (EccoApi.Available()) { dwEccoIndex = EccoApi.EccoIndex((const char *) dwFileMove); strcpy(pgn.szEcco, (const char *) &dwEccoIndex); strcpy(pgn.szOpen, EccoApi.EccoOpening(dwEccoIndex)); strcpy(pgn.szVar, EccoApi.EccoVariation(dwEccoIndex)); } fclose(fp); return (pgn.Write(szPgnFile) ? _OK : _ERROR_CREATE); } /** QQ象棋格式*/ static int ReadInt(FILE * fp) { int nResult, n; nResult = 0; n = fgetc(fp) - '0'; while (n >= 0 && n <= 9) { nResult *= 10; nResult += n; n = fgetc(fp) - '0'; } return nResult; } int Che2Pgn(const char *szCheFile, const char *szPgnFile, const EccoApiStruct & EccoApi) { int i, nMoveNum, mv, nStatus; int xSrc, ySrc, xDst, yDst; PgnFileStruct pgn; PositionStruct pos; FILE * fp; uint32_t dwEccoIndex, dwFileMove[20]; fp = fopen(szCheFile, "rb"); if (fp == NULL) { return _ERROR_OPEN; } pgn.posStart.FromFen(cszStartFen); pos = pgn.posStart; ReadInt(fp); nMoveNum = ReadInt(fp); for (i = 0; i < nMoveNum; i++) { ReadInt(fp); ReadInt(fp); ReadInt(fp); ySrc = 12 - ReadInt(fp); xSrc = ReadInt(fp) + 3; yDst = 12 - ReadInt(fp); xDst = ReadInt(fp) + 3; ReadInt(fp); ReadInt(fp); ReadInt(fp); mv = MOVE(COORD_XY(xSrc, ySrc), COORD_XY(xDst, yDst)); mv &= 0xffff; // 防止TryMove时数组越界 pgn.nMaxMove++; if (pgn.nMaxMove <= 20) { dwFileMove[pgn.nMaxMove - 1] = Move2File(mv, pos); } // QQ象棋允许把将吃掉,但ElephantEye不允许,所以跳过非法着法 if (TryMove(pos, nStatus, mv)) { pgn.wmvMoveTable[pgn.nMaxMove] = mv; } else { pgn.nMaxMove--; } if (pos.nMoveNum == MAX_MOVE_NUM) { pos.SetIrrev(); } } if (pgn.nMaxMove < 20) { dwFileMove[pgn.nMaxMove] = 0; } if (EccoApi.Available()) { dwEccoIndex = EccoApi.EccoIndex((const char *) dwFileMove); strcpy(pgn.szEcco, (const char *) &dwEccoIndex); strcpy(pgn.szOpen, EccoApi.EccoOpening(dwEccoIndex)); strcpy(pgn.szVar, EccoApi.EccoVariation(dwEccoIndex)); } fclose(fp); return (pgn.Write(szPgnFile) ? _OK : _ERROR_CREATE); } /** 联众象棋格式*/ struct ChnRecord { uint16_t wReserved1[2]; uint16_t wxSrc, wySrc, wxDst, wyDst; uint16_t wReserved2[10]; }; int Chn2Pgn(const char *szChnFile, const char *szPgnFile, const EccoApiStruct & EccoApi) { int mv, nStatus; bool bRead, bFlip; PgnFileStruct pgn; PositionStruct pos; ChnRecord Chn; FILE * fp; uint32_t dwEccoIndex, dwFileMove[20]; fp = fopen(szChnFile, "rb"); if (fp == NULL) { return _ERROR_OPEN; } pgn.posStart.FromFen(cszStartFen); pos = pgn.posStart; bRead = bFlip = false; fseek(fp, 188, SEEK_SET); while (fread(&Chn, sizeof(ChnRecord), 1, fp) > 0) { if (!bRead) { bRead = true; if (Chn.wySrc < 5) { bFlip = true; } } if (bFlip) { Chn.wxSrc = 8 - Chn.wxSrc; Chn.wySrc = 9 - Chn.wySrc; Chn.wxDst = 8 - Chn.wxDst; Chn.wyDst = 9 - Chn.wyDst; } mv = MOVE(COORD_XY (Chn.wxSrc + FILE_LEFT, Chn.wySrc + RANK_TOP), COORD_XY(Chn.wxDst + FILE_LEFT, Chn.wyDst + RANK_TOP)); mv &= 0xffff; // 防止TryMove时数组越界 pgn.nMaxMove++; if (pgn.nMaxMove <= 20) { dwFileMove[pgn.nMaxMove - 1] = Move2File(mv, pos); } // 联众可能允许把将吃掉,但ElephantEye不允许,所以跳过非法着法 if (TryMove(pos, nStatus, mv)) { pgn.wmvMoveTable[pgn.nMaxMove] = mv; } else { pgn.nMaxMove--; } if (pos.nMoveNum == MAX_MOVE_NUM) { pos.SetIrrev(); } } if (pgn.nMaxMove < 20) { dwFileMove[pgn.nMaxMove] = 0; } if (EccoApi.Available()) { dwEccoIndex = EccoApi.EccoIndex((const char *) dwFileMove); strcpy(pgn.szEcco, (const char *) &dwEccoIndex); strcpy(pgn.szOpen, EccoApi.EccoOpening(dwEccoIndex)); strcpy(pgn.szVar, EccoApi.EccoVariation(dwEccoIndex)); } fclose(fp); return (pgn.Write(szPgnFile) ? _OK : _ERROR_CREATE); } inline void ReadRecord(FILE * fp, char *sz) { uint8_t ucLen; fread(&ucLen, 1, 1, fp); fread(sz, 1, ucLen, fp); sz[ucLen] = '\0'; } /** 弈天象棋软件格式*/ int Mxq2Pgn(const char *szMxqFile, const char *szPgnFile, const EccoApiStruct & EccoApi) { int i, mv, nStatus; char *lpEvent; char szRecord[256], szComment[256]; PgnFileStruct pgn; PositionStruct pos; FILE * fp; uint32_t dwEccoIndex, dwFileMove[20]; fp = fopen(szMxqFile, "rb"); if (fp == NULL) { return _ERROR_OPEN; } ReadRecord(fp, pgn.szSite); ReadRecord(fp, pgn.szDate); ReadRecord(fp, pgn.szEvent); lpEvent = pgn.szEvent; if (false) { } else if (StrScanSkip(lpEvent, "-胜-")) { pgn.nResult = 1; } else if (StrScanSkip(lpEvent, "-衊-")) { pgn.nResult = 1; } else if (StrScanSkip(lpEvent, "-和-")) { pgn.nResult = 2; } else if (StrScanSkip(lpEvent, "-㎝-")) { pgn.nResult = 2; } else if (StrScanSkip(lpEvent, "-负-")) { pgn.nResult = 3; } else if (StrScanSkip(lpEvent, "-璽-")) { pgn.nResult = 3; } else if (StrScanSkip(lpEvent, "-負-")) { pgn.nResult = 3; } else { pgn.nResult = 0; } if (pgn.nResult != 0) { strcpy(pgn.szRed, pgn.szEvent); *(pgn.szRed + (lpEvent - pgn.szEvent - 4)) = '\0'; strcpy(pgn.szBlack, lpEvent); } ReadRecord(fp, pgn.szRedElo); ReadRecord(fp, pgn.szBlackElo); for (i = 0; i < 5; i++) { ReadRecord(fp, szRecord); } ReadRecord(fp, szComment); ReadRecord(fp, szRecord); pgn.posStart.FromFen(cszStartFen); pos = pgn.posStart; ReadRecord(fp, szRecord); while (!StrEqv(szRecord, "Ends") && pgn.nMaxMove < MAX_MOVE_LEN - 1) { mv = MOVE(COORD_XY (szRecord[0] - '0' + 3, 'J' - szRecord[1] + 3), COORD_XY(szRecord[3] - '0' + 3, 'J' - szRecord[4] + 3)); mv &= 0xffff; // 防止TryMove时数组越界 pgn.nMaxMove++; if (pgn.nMaxMove <= 20) { dwFileMove[pgn.nMaxMove - 1] = Move2File(mv, pos); } // 弈天可能允许把将吃掉,但ElephantEye不允许,所以跳过非法着法 if (TryMove(pos, nStatus, mv)) { pgn.wmvMoveTable[pgn.nMaxMove] = mv; } else { pgn.nMaxMove--; } if (pos.nMoveNum == MAX_MOVE_NUM) { pos.SetIrrev(); } ReadRecord(fp, szRecord); } pgn.szCommentTable[pgn.nMaxMove] = new char[256]; strcpy(pgn.szCommentTable[pgn.nMaxMove], szComment); if (pgn.nMaxMove < 20) { dwFileMove[pgn.nMaxMove] = 0; } if (EccoApi.Available()) { dwEccoIndex = EccoApi.EccoIndex((const char *) dwFileMove); strcpy(pgn.szEcco, (const char *) &dwEccoIndex); strcpy(pgn.szOpen, EccoApi.EccoOpening(dwEccoIndex)); strcpy(pgn.szVar, EccoApi.EccoVariation(dwEccoIndex)); } fclose(fp); return (pgn.Write(szPgnFile) ? _OK : _ERROR_CREATE); } /** 象棋演播室软件格式*/ static const int cnResultTrans[4] = { 0, 1, 3, 2 }; static const unsigned char cucsqXqf2Square[96] = { 0xc3, 0xb3, 0xa3, 0x93, 0x83, 0x73, 0x63, 0x53, 0x43, 0x33, 0xc4, 0xb4, 0xa4, 0x94, 0x84, 0x74, 0x64, 0x54, 0x44, 0x34, 0xc5, 0xb5, 0xa5, 0x95, 0x85, 0x75, 0x65, 0x55, 0x45, 0x35, 0xc6, 0xb6, 0xa6, 0x96, 0x86, 0x76, 0x66, 0x56, 0x46, 0x36, 0xc7, 0xb7, 0xa7, 0x97, 0x87, 0x77, 0x67, 0x57, 0x47, 0x37, 0xc8, 0xb8, 0xa8, 0x98, 0x88, 0x78, 0x68, 0x58, 0x48, 0x38, 0xc9, 0xb9, 0xa9, 0x99, 0x89, 0x79, 0x69, 0x59, 0x49, 0x39, 0xca, 0xba, 0xaa, 0x9a, 0x8a, 0x7a, 0x6a, 0x5a, 0x4a, 0x3a, 0xcb, 0xbb, 0xab, 0x9b, 0x8b, 0x7b, 0x6b, 0x5b, 0x4b, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const int cpcXqf2Piece[32] = { 23, 21, 19, 17, 16, 18, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31, 39, 37, 35, 33, 32, 34, 36, 38, 40, 41, 42, 43, 44, 45, 46, 47 }; // 密钥流掩码 static const char *const cszEncStreamMask = "[(C) Copyright Mr. Dong Shiwei.]"; inline int Square54Plus221(int x) { return x * x * 54 + 221; } inline void ReadAndDecrypt(FILE * fp, void *lp, int nLen, const int *nEncStream, int &nEncIndex) { int i; fread(lp, nLen, 1, fp); for (i = 0; i < nLen; i++) { ((uint8_t *) lp)[i] -= nEncStream[nEncIndex]; nEncIndex = (nEncIndex + 1) % 32; } } inline void GetXqfString(char *szPgn, const char *szXqf) { strncpy(szPgn, szXqf + 1, szXqf[0]); szPgn[szXqf[0]] = '\0'; } int Xqf2Pgn(const char *szXqfFile, const char *szPgnFile, const EccoApiStruct & EccoApi) { int i, nArg0, nArgs[4]; int nCommentLen, mv, nStatus; bool bHasNext; PgnFileStruct pgn; PositionStruct pos; FILE * fp; XqfHeaderStruct xqfhd; XqfMoveStruct xqfmv; // 版本号和加密偏移值 int nXqfVer, nPieceOff, nSrcOff, nDstOff, nCommentOff; // 密钥流 int nEncStream[32]; // 密钥流索引号 int nEncIndex; // 局面初始位置 int nPiecePos[32]; uint32_t dwEccoIndex, dwFileMove[20]; fp = fopen(szXqfFile, "rb"); if (fp == NULL) { return XQF2PGN_ERROR_OPEN; } fread(&xqfhd, sizeof(xqfhd), 1, fp); fseek(fp, sizeof(xqfhd), SEEK_CUR); if (xqfhd.szTag[0] == 'X' && xqfhd.szTag[1] == 'Q') { // PGN文件可以打开,现在正式解析XQF文件 nXqfVer = xqfhd.szTag[2]; if (nXqfVer < 11) { nPieceOff = nSrcOff = nDstOff = nCommentOff = 0; for (i = 0; i < 32; i++) { nEncStream[i] = 0; } } else { // 局面初始位置的加密偏移值 nPieceOff = (uint8_t) (Square54Plus221 ((uint8_t) xqfhd.szTag[13]) * (uint8_t) xqfhd.szTag[13]); // 着法起点的加密偏移值 nSrcOff = (uint8_t) (Square54Plus221 ((uint8_t) xqfhd.szTag[14]) * nPieceOff); // 着法终点的加密偏移值 nDstOff = (uint8_t) (Square54Plus221 ((uint8_t) xqfhd.szTag[15]) * nSrcOff); // 注释的加密偏移值 nCommentOff = ((uint8_t) xqfhd.szTag[12] * 256 + (uint8_t) xqfhd.szTag[13]) % 32000 + 767; // 基本掩码 nArg0 = xqfhd.szTag[3]; // 密钥 = 前段密钥 | (后段密钥 & 基本掩码) for (i = 0; i < 4; i++) { nArgs[i] = xqfhd.szTag[8 + i] | (xqfhd.szTag[12 + i] & nArg0); } // 密钥流 = 密钥 & 密钥流掩码 for (i = 0; i < 32; i++) { nEncStream[i] = (uint8_t) (nArgs[i % 4] & cszEncStreamMask[i]); } } nEncIndex = 0; // 记录棋谱信息 if (xqfhd.szEvent[0] == 0) { GetXqfString(pgn.szEvent, xqfhd.szTitle); } else { GetXqfString(pgn.szEvent, xqfhd.szEvent); } GetXqfString(pgn.szDate, xqfhd.szDate); GetXqfString(pgn.szSite, xqfhd.szSite); GetXqfString(pgn.szRed, xqfhd.szRed); GetXqfString(pgn.szBlack, xqfhd.szBlack); pgn.nResult = cnResultTrans[(int) xqfhd.szResult[3]]; if (xqfhd.szSetUp[0] < 2) { // 如果是开局或者全局,那么直接设置起始局面 pgn.posStart.FromFen(cszStartFen); } else { // 如果是中局或者排局,那么根据"xqfhd.szPiecePos[32]"的内容摆放局面 // 当版本号达到12时,还要进一步解密局面初始位置 if (nXqfVer < 12) { for (i = 0; i < 32; i++) { nPiecePos[i] = (uint8_t) (xqfhd. szPiecePos[i] - nPieceOff); } } else { for (i = 0; i < 32; i++) { nPiecePos[(nPieceOff + 1 + i) % 32] = (uint8_t) (xqfhd. szPiecePos[i] - nPieceOff); } } // 把"nPiecePos[32]"的数据放到"PositionStruct"中 pgn.posStart.ClearBoard(); for (i = 0; i < 32; i++) { if (nPiecePos[i] < 90) { pgn.posStart. AddPiece(cucsqXqf2Square [nPiecePos[i]], cpcXqf2Piece[i]); } } pgn.posStart.SetIrrev(); } pos = pgn.posStart; bHasNext = true; while (bHasNext && pgn.nMaxMove < MAX_MOVE_LEN) { // 读取着法记录 if (nXqfVer < 11) { fread(&xqfmv, sizeof(xqfmv), 1, fp); fread(&nCommentLen, sizeof(int), 1, fp); if ((xqfmv.ucTag & 0xf0) == 0) { bHasNext = false; } } else { ReadAndDecrypt(fp, &xqfmv, sizeof(xqfmv), nEncStream, nEncIndex); if ((xqfmv.ucTag & 0x20) != 0) { ReadAndDecrypt(fp, &nCommentLen, sizeof(int), nEncStream, nEncIndex); nCommentLen -= nCommentOff; } else { nCommentLen = 0; } if ((xqfmv.ucTag & 0x80) == 0) { bHasNext = false; } } if (pgn.nMaxMove > 0) { // 记录着法 mv = MOVE(cucsqXqf2Square[(uint8_t) (xqfmv.ucSrc - 24 - nSrcOff)], cucsqXqf2Square[(uint8_t) (xqfmv.ucDst - 32 - nDstOff)]); if (pgn.nMaxMove == 1) { if ((pgn.posStart. ucpcSquares[SRC(mv)] & 32) != 0) { pgn.posStart.ChangeSide(); pos.ChangeSide(); } } if (xqfhd.szSetUp[0] < 2 && pgn.nMaxMove <= 20) { dwFileMove[pgn.nMaxMove - 1] = Move2File(mv, pos); } TryMove(pos, nStatus, mv); pgn.wmvMoveTable[pgn.nMaxMove] = mv; if (pos.nMoveNum == MAX_MOVE_NUM) { pos.SetIrrev(); } } if (nCommentLen > 0) { pgn.szCommentTable[pgn.nMaxMove] = new char[nCommentLen + 1]; ReadAndDecrypt(fp, pgn.szCommentTable[pgn. nMaxMove], nCommentLen, nEncStream, nEncIndex); pgn.szCommentTable[pgn. nMaxMove][nCommentLen] = '\0'; } pgn.nMaxMove++; } pgn.nMaxMove--; // 解析ECCO if (xqfhd.szSetUp[0] < 2) { if (pgn.nMaxMove < 20) { dwFileMove[pgn.nMaxMove] = 0; } if (EccoApi.Available()) { dwEccoIndex = EccoApi. EccoIndex((const char *) dwFileMove); strcpy(pgn.szEcco, (const char *) &dwEccoIndex); strcpy(pgn.szOpen, EccoApi.EccoOpening(dwEccoIndex)); strcpy(pgn.szVar, EccoApi. EccoVariation(dwEccoIndex)); } } fclose(fp); return (pgn.Write(szPgnFile) ? _OK : _ERROR_CREATE); } else { fclose(fp); return XQF2PGN_ERROR_FORMAT; } } /** 只是将大写的PGN后缀文件copy一下 */ int Pgn2Pgn(const char *szFile, const char *szPgnFile, const EccoApiStruct & EccoApi) { FILE * infp; FILE * outfp; char c; infp = fopen(szFile, "rb"); if (infp == NULL) { return _ERROR_OPEN; } if((outfp=fopen(szPgnFile,"wb"))==NULL) { fclose(infp); return _ERROR_OPEN; } while(!feof(infp)){ c=fgetc(infp); fputc(c,outfp); } fclose(infp); fclose(outfp); return 0; } /** * CCM=中国游戏中心象棋 * CHE=QQ象棋 * CHN=联众象棋 * MXQ=弈天象棋 * XQF=象棋演播室 */ enum { PGN,CCM, CHE, CHN, MXQ, XQF, ERR }; int format(char *filename) { if ((strstr(filename, ".pgn") != NULL) || strstr(filename, ".PGN") != NULL) { return PGN; }else if ((strstr(filename, ".ccm") != NULL) || strstr(filename, ".CCM") != NULL) { return CCM; } else if ((strstr(filename, ".che") != NULL) || strstr(filename, ".CHE") != NULL) { return CHE; } else if ((strstr(filename, ".chn") != NULL) || strstr(filename, ".CHN")) { return CHN; } else if ((strstr(filename, ".xqf") != NULL) || strstr(filename, ".XQF")) { return XQF; } else return ERR; } int file_gbk_to_utf8(const std::string& f_infile,const std::string& f_outfile) { CodeConverter g2u("gbk","utf-8"); std::fstream infile; infile.open(f_infile.c_str(),std::ios_base::in); if(!infile){ printf("open %s file error\n",f_infile.c_str()); return -1; } std::fstream outfile; outfile.open(f_outfile.c_str(),std::ios_base::out); if(!outfile){ printf("open write file error\n"); return -1; } std::string line; while(std::getline(infile,line)){ std::string uline= g2u.convert(line); outfile< #include "base.h" const char *const cszLibEccoFile = "ECCO.DLL"; struct EccoApiStruct { HMODULE hModule; VOID (WINAPI *EccoInitOpenVar)(LONG); LONG (WINAPI *EccoIndex)(LPCSTR); LPCSTR (WINAPI *EccoOpening)(LONG); LPCSTR (WINAPI *EccoVariation)(LONG); bool Startup(const char *szLibEccoPath, bool bTrad = false) { hModule = LoadLibrary(szLibEccoPath); if (hModule != NULL) { EccoInitOpenVar = (VOID (WINAPI *)(LONG)) GetProcAddress(hModule, "_EccoInitOpenVar@4"); EccoIndex = (LONG (WINAPI *)(LPCSTR)) GetProcAddress(hModule, "_EccoIndex@4"); EccoOpening = (LPCSTR (WINAPI *)(LONG)) GetProcAddress(hModule, "_EccoOpening@4"); EccoVariation = (LPCSTR (WINAPI *)(LONG)) GetProcAddress(hModule, "_EccoVariation@4"); EccoInitOpenVar(false); return true; } else { return false; } } bool Available(void) const { return hModule != NULL; } void Shutdown(void) { if (hModule != NULL) { FreeLibrary(hModule); } } }; #else #include #include "base.h" const char *const cszLibEccoFile = "libecco.so"; struct EccoApiStruct { void *hModule; void (*EccoInitOpenVar)(int); uint32_t (*EccoIndex)(const char *); const char *(*EccoOpening)(uint32_t); const char *(*EccoVariation)(uint32_t); bool Startup(const char *szLibEccoPath, bool bTrad = false) { hModule = dlopen(szLibEccoPath, RTLD_LAZY); if (hModule != NULL) { EccoInitOpenVar = (void (*)(int)) dlsym(hModule, "EccoInitOpenVar"); EccoIndex = (uint32_t (*)(const char *)) dlsym(hModule, "EccoIndex"); EccoOpening = (const char *(*)(uint32_t)) dlsym(hModule, "EccoOpening"); EccoVariation = (const char *(*)(uint32_t)) dlsym(hModule, "EccoVariation"); EccoInitOpenVar(false); return true; } else { return false; } } bool Available(void) const { return hModule != NULL; } void Shutdown(void) { if (hModule != NULL) { dlclose(hModule); } } }; #endif #endif gmchess-0.29.6.3/src/engine/eleeye.cpp000066400000000000000000000262061323660377300174320ustar00rootroot00000000000000/* eleeye.cpp - Source Code for ElephantEye, Part IX ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.15, Last Modified: Jul. 2008 Copyright (C) 2004-2008 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "base2.h" #include "parse.h" #include "ucci.h" #include "pregen.h" #include "position.h" #include "hash.h" #include "search.h" #ifdef _WIN32 #include const char *const cszLibEvalFile = "EVALUATE.DLL"; #elif __APPLE__ #include const char *const cszLibEvalFile = "/usr/local/lib/libeval.0.dylib"; #else //for __linux__ and freebsd #include #define WINAPI const char *const cszLibEvalFile = "../lib/libeval.so.0"; #endif const int INTERRUPT_COUNT = 4096; // 搜索若干结点后调用中断 static const char *WINAPI GetEngineName(void) { return NULL; } static void WINAPI PreEvaluate(PositionStruct *lppos, PreEvalStruct *lpPreEval) { // 缺省的局面预评价过程,什么都不做 } static int WINAPI Evaluate(const PositionStruct *lppos, int vlAlpha, int vlBeta) { // 缺省的局面评价过程,只返回子力价值 return lppos->Material(); } #ifdef _WIN32 inline HMODULE LoadEvalApi(const char *szLibEvalFile) { HMODULE hModule; hModule = LoadLibrary(szLibEvalFile); if (hModule == NULL) { Search.GetEngineName = GetEngineName; Search.PreEvaluate = PreEvaluate; Search.Evaluate = Evaluate; } else { Search.GetEngineName = (const char *(WINAPI *)(void)) GetProcAddress(hModule, "_GetEngineName@0"); Search.PreEvaluate = (void (WINAPI *)(PositionStruct *, PreEvalStruct *)) GetProcAddress(hModule, "_PreEvaluate@8"); Search.Evaluate = (int (WINAPI *)(const PositionStruct *, int, int)) GetProcAddress(hModule, "_Evaluate@12"); } return hModule; } inline void FreeEvalApi(HMODULE hModule) { if (hModule != NULL) { FreeLibrary(hModule); } } #else inline void *LoadEvalApi(const char *szLibEvalFile) { void *hModule; hModule = dlopen(szLibEvalFile, RTLD_LAZY); if (hModule == NULL) { Search.GetEngineName = GetEngineName; Search.PreEvaluate = PreEvaluate; Search.Evaluate = Evaluate; } else { Search.GetEngineName = (const char *(*)(void)) dlsym(hModule, "GetEngineName"); Search.PreEvaluate = (void (*)(PositionStruct *, PreEvalStruct *)) dlsym(hModule, "PreEvaluate"); Search.Evaluate = (int (*)(const PositionStruct *, int, int)) dlsym(hModule, "Evaluate"); } return hModule; } inline void FreeEvalApi(void *hModule) { if (hModule != NULL) { dlclose(hModule); } } #endif inline void PrintLn(const char *sz) { printf("%s\n", sz); fflush(stdout); } int main(void) { int i; bool bPonderTime; UcciCommStruct UcciComm; char szLibEvalFile[1024]; const char *szEngineName; PositionStruct posProbe; #ifdef _WIN32 HMODULE hModule; #else void *hModule; #endif if (BootLine() != UCCI_COMM_UCCI) { return 0; } LocatePath(Search.szBookFile, "../share/gmchess/book.dat"); //LocatePath(Search.szBookFile, "book.dat"); LocatePath(szLibEvalFile, cszLibEvalFile); hModule = LoadEvalApi(szLibEvalFile); bPonderTime = false; PreGenInit(); NewHash(24); // 24=16MB, 25=32MB, 26=64MB, ... Search.pos.FromFen("rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1"); Search.pos.nDistance = 0; Search.PreEvaluate(&Search.pos, &PreEval); Search.nBanMoves = 0; Search.bQuit = Search.bBatch = Search.bDebug = Search.bAlwaysCheck = false; Search.bUseHash = Search.bUseBook = Search.bNullMove = Search.bKnowledge = true; Search.bIdle = false; Search.nCountMask = INTERRUPT_COUNT - 1; Search.nRandomMask = 0; Search.rc4Random.InitRand(); szEngineName = Search.GetEngineName(); if (szEngineName == NULL) { PrintLn("id name ElephantEye"); } else { printf("id name %s / ElephantEye\n", szEngineName); fflush(stdout); } PrintLn("id version 3.15"); PrintLn("id copyright 2004-2008 www.elephantbase.net"); PrintLn("id author Morning Yellow"); PrintLn("id user ElephantEye Test Team"); PrintLn("option usemillisec type check default true"); PrintLn("option promotion type check default false"); PrintLn("option batch type check default false"); PrintLn("option debug type check default false"); PrintLn("option ponder type check default false"); PrintLn("option alwayscheck type check default false"); PrintLn("option usehash type check default true"); PrintLn("option usebook type check default true"); printf("option bookfiles type string default %s\n", Search.szBookFile); fflush(stdout); printf("option evalapi type string default %s\n", szLibEvalFile); fflush(stdout); PrintLn("option hashsize type spin min 16 max 1024 default 16"); PrintLn("option idle type combo var none var small var medium var large default none"); PrintLn("option pruning type combo var none var small var medium var large default large"); PrintLn("option knowledge type combo var none var small var medium var large default large"); PrintLn("option randomness type combo var none var small var medium var large default none"); PrintLn("option newgame type button"); PrintLn("ucciok"); // 以下是接收指令和提供对策的循环体 while (!Search.bQuit) { switch (IdleLine(UcciComm, Search.bDebug)) { case UCCI_COMM_ISREADY: PrintLn("readyok"); break; case UCCI_COMM_STOP: PrintLn("nobestmove"); break; case UCCI_COMM_POSITION: BuildPos(Search.pos, UcciComm); Search.pos.nDistance = 0; Search.PreEvaluate(&Search.pos, &PreEval); Search.nBanMoves = 0; break; case UCCI_COMM_BANMOVES: Search.nBanMoves = UcciComm.nBanMoveNum; for (i = 0; i < UcciComm.nBanMoveNum; i ++) { Search.wmvBanList[i] = COORD_MOVE(UcciComm.lpdwBanMovesCoord[i]); } break; case UCCI_COMM_SETOPTION: switch (UcciComm.Option) { case UCCI_OPTION_PROMOTION: PreEval.bPromotion = UcciComm.bCheck; break; case UCCI_OPTION_BATCH: Search.bBatch = UcciComm.bCheck; break; case UCCI_OPTION_DEBUG: Search.bDebug = UcciComm.bCheck; break; case UCCI_OPTION_PONDER: bPonderTime = UcciComm.bCheck; break; case UCCI_OPTION_ALWAYSCHECK: Search.bAlwaysCheck = UcciComm.bCheck; break; case UCCI_OPTION_USEHASH: Search.bUseHash = UcciComm.bCheck; break; case UCCI_OPTION_USEBOOK: Search.bUseBook = UcciComm.bCheck; break; case UCCI_OPTION_BOOKFILES: if (AbsolutePath(UcciComm.szOption)) { strcpy(Search.szBookFile, UcciComm.szOption); } else { LocatePath(Search.szBookFile, UcciComm.szOption); } break; case UCCI_OPTION_EVALAPI: if (AbsolutePath(UcciComm.szOption)) { strcpy(szLibEvalFile, UcciComm.szOption); } else { LocatePath(szLibEvalFile, UcciComm.szOption); } FreeEvalApi(hModule); hModule = LoadEvalApi(szLibEvalFile); break; case UCCI_OPTION_HASHSIZE: DelHash(); i = 19; // 小于1,分配0.5M置换表 while (UcciComm.nSpin > 0) { UcciComm.nSpin /= 2; i ++; } NewHash(MAX(i, 24)); // 最小的置换表设为16M break; case UCCI_OPTION_IDLE: switch (UcciComm.Grade) { case UCCI_GRADE_NONE: Search.bIdle = false; Search.nCountMask = INTERRUPT_COUNT - 1; break; case UCCI_GRADE_SMALL: Search.bIdle = true; Search.nCountMask = INTERRUPT_COUNT / 4 - 1; break; case UCCI_GRADE_MEDIUM: Search.bIdle = true; Search.nCountMask = INTERRUPT_COUNT / 16 - 1; break; case UCCI_GRADE_LARGE: Search.bIdle = true; Search.nCountMask = INTERRUPT_COUNT / 64 - 1; break; default: break; } break; case UCCI_OPTION_PRUNING: Search.bNullMove = (UcciComm.Grade != UCCI_GRADE_NONE); break; case UCCI_OPTION_KNOWLEDGE: Search.bKnowledge = (UcciComm.Grade != UCCI_GRADE_NONE); break; case UCCI_OPTION_RANDOMNESS: switch (UcciComm.Grade) { case UCCI_GRADE_NONE: Search.nRandomMask = 0; break; case UCCI_GRADE_SMALL: Search.nRandomMask = 1; break; case UCCI_GRADE_MEDIUM: Search.nRandomMask = 3; break; case UCCI_GRADE_LARGE: Search.nRandomMask = 7; break; default: break; } break; default: break; } break; case UCCI_COMM_GO: Search.bPonder = UcciComm.bPonder; Search.bDraw = UcciComm.bDraw; switch (UcciComm.Go) { case UCCI_GO_DEPTH: Search.nGoMode = GO_MODE_INFINITY; Search.nNodes = 0; SearchMain(UcciComm.nDepth); break; case UCCI_GO_NODES: Search.nGoMode = GO_MODE_NODES; Search.nNodes = UcciComm.nNodes; SearchMain(UCCI_MAX_DEPTH); break; case UCCI_GO_TIME_MOVESTOGO: case UCCI_GO_TIME_INCREMENT: Search.nGoMode = GO_MODE_TIMER; if (UcciComm.Go == UCCI_GO_TIME_MOVESTOGO) { // 对于时段制,把剩余时间平均分配到每一步,作为适当时限。 // 剩余步数从1到5,最大时限依次是剩余时间的100%、90%、80%、70%和60%,5以上都是50% Search.nProperTimer = UcciComm.nTime / UcciComm.nMovesToGo; Search.nMaxTimer = UcciComm.nTime * MAX(5, 11 - UcciComm.nMovesToGo) / 10; } else { // 对于加时制,假设棋局会在20回合内结束,算出平均每一步的适当时限,最大时限是剩余时间的一半 Search.nProperTimer = UcciComm.nTime / 20 + UcciComm.nIncrement; Search.nMaxTimer = UcciComm.nTime / 2; } // 如果是后台思考的时间分配策略,那么适当时限设为原来的1.25倍 Search.nProperTimer += (bPonderTime ? Search.nProperTimer / 4 : 0); Search.nMaxTimer = MIN(Search.nMaxTimer, Search.nProperTimer * 10); SearchMain(UCCI_MAX_DEPTH); break; default: break; } break; case UCCI_COMM_PROBE: BuildPos(posProbe, UcciComm); if (!PopHash(posProbe)) { PopLeaf(posProbe); } break; case UCCI_COMM_QUIT: Search.bQuit = true; break; default: break; } } DelHash(); FreeEvalApi(hModule); PrintLn("bye"); return 0; } gmchess-0.29.6.3/src/engine/evaluate.cpp000066400000000000000000000626771323660377300200040ustar00rootroot00000000000000/* evaluate.cpp - Source Code for ElephantEye, Part XI ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 2.34, Last Modified: Oct. 2006 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "base.h" #include "pregen.h" #include "position.h" #include "preeval.h" #if _WIN32 #include extern "C" __declspec(dllexport) int WINAPI Evaluate(const PositionStruct *lppos, int vlAlpha, int vlBeta); extern "C" __declspec(dllexport) const char *WINAPI GetEngineName(void); #else #define WINAPI extern "C" int Evaluate(const PositionStruct *lppos, int vlAlpha, int vlBeta); extern "C" const char *GetEngineName(void); #endif /* ElephantEyeԴʹõǺԼ * * sq: (0255"pregen.cpp") * pc: (047"position.cpp") * pt: (06"position.cpp") * mv: ŷ(065535"position.cpp") * sd: ӷ(0췽1ڷ) * vl: ֵ("-MATE_VALUE""MATE_VALUE""position.cpp") * (עǺſucdwȴļǺʹ) * pos: (PositionStructͣ"position.h") * sms: λкλеŷԤýṹ("pregen.h") * smv: λкλеŷжԤýṹ("pregen.h") */ // ͵۵ı߽ const int EVAL_MARGIN1 = 160; const int EVAL_MARGIN2 = 80; const int EVAL_MARGIN3 = 40; const int EVAL_MARGIN4 = 20; // ģֻ漰"PositionStruct"е"sdPlayer""ucpcSquares""ucsqPieces""wBitPiece"ĸԱʡǰ"this->" /* ElephantEyeľݹ44 * 1. (ʿ)йص͵ۣ"AdvisorShape()" * 2. ǣ˧()򳵵͵ۣ"StringHold()" * 3. Եۣ"RookMobility()" * 4. ܵ谭ۣ"KnightTrap()" */ // ǵһ֣͵ /* (ʿ)״ھۣرжϿͷڡڵشãΪElephantEye״ * 1. ˧()ԭλ˫(ʿ)ڵߣΪ1ţҪжϿͷں * 2. ˧()ԭλ˫(ʿ)߰Χ˧()Ϊ2ţҪжұߵijںͳұߵ˧()ţ * 3. ˧()ԭλ˫(ʿ)ұ߰Χ˧()Ϊ3ţҪжߵijںͳߵ˧()ţ * 4. ˧()ԭλȱ(ʿ)0 * עԡºϡ̶̷λ涨ҡ */ const int WHITE_KING_BITFILE = 1 << (RANK_BOTTOM - RANK_TOP); const int BLACK_KING_BITFILE = 1 << (RANK_TOP - RANK_TOP); const int KING_BITRANK = 1 << (FILE_CENTER - FILE_LEFT); const int SHAPE_NONE = 0; const int SHAPE_CENTER = 1; const int SHAPE_LEFT = 2; const int SHAPE_RIGHT = 3; int AdvisorShape(const PositionStruct *lppos) { int pcCannon, pcRook, sq, sqAdv1, sqAdv2, x, y, nShape; int vlWhitePenalty, vlBlackPenalty; SlideMaskStruct *lpsms; vlWhitePenalty = vlBlackPenalty = 0; if ((lppos->wBitPiece[0] & ADVISOR_BITPIECE) == ADVISOR_BITPIECE) { if (lppos->ucsqPieces[SIDE_TAG(0) + KING_FROM] == 0xc7) { sqAdv1 = lppos->ucsqPieces[SIDE_TAG(0) + ADVISOR_FROM]; sqAdv2 = lppos->ucsqPieces[SIDE_TAG(0) + ADVISOR_TO]; if (false) { } else if (sqAdv1 == 0xc6) { // 췽һ nShape = (sqAdv2 == 0xc8 ? SHAPE_CENTER : sqAdv2 == 0xb7 ? SHAPE_LEFT : SHAPE_NONE); } else if (sqAdv1 == 0xc8) { // 췽һҲ nShape = (sqAdv2 == 0xc6 ? SHAPE_CENTER : sqAdv2 == 0xb7 ? SHAPE_RIGHT : SHAPE_NONE); } else if (sqAdv1 == 0xb7) { // 췽һڻ nShape = (sqAdv2 == 0xc6 ? SHAPE_LEFT : sqAdv2 == 0xc8 ? SHAPE_RIGHT : SHAPE_NONE); } else { nShape = SHAPE_NONE; } switch (nShape) { case SHAPE_NONE: break; case SHAPE_CENTER: for (pcCannon = SIDE_TAG(1) + CANNON_FROM; pcCannon <= SIDE_TAG(1) + CANNON_TO; pcCannon ++) { sq = lppos->ucsqPieces[pcCannon]; if (sq != 0) { x = FILE_X(sq); if (x == FILE_CENTER) { y = RANK_Y(sq); lpsms = lppos->FileMaskPtr(x, y); if ((lpsms->wRookCap & WHITE_KING_BITFILE) != 0) { // ͷڵв vlWhitePenalty += PreEvalEx.vlHollowThreat[RANK_FLIP(y)]; } else if ((lpsms->wSuperCap & WHITE_KING_BITFILE) != 0 && (lppos->ucpcSquares[0xb7] == 21 || lppos->ucpcSquares[0xb7] == 22)) { // в vlWhitePenalty += PreEvalEx.vlCentralThreat[RANK_FLIP(y)]; } } } } break; case SHAPE_LEFT: case SHAPE_RIGHT: for (pcCannon = SIDE_TAG(1) + CANNON_FROM; pcCannon <= SIDE_TAG(1) + CANNON_TO; pcCannon ++) { sq = lppos->ucsqPieces[pcCannon]; if (sq != 0) { x = FILE_X(sq); y = RANK_Y(sq); if (x == FILE_CENTER) { if ((lppos->FileMaskPtr(x, y)->wSuperCap & WHITE_KING_BITFILE) != 0) { // һڵв˧()űԷƵĻжⷣ vlWhitePenalty += (PreEvalEx.vlCentralThreat[RANK_FLIP(y)] >> 2) + (lppos->Protected(1, nShape == SHAPE_LEFT ? 0xc8 : 0xc6) ? 20 : 0); // ڵ߱˧()ķ֣ for (pcRook = SIDE_TAG(0) + ROOK_FROM; pcRook <= SIDE_TAG(0) + ROOK_TO; pcRook ++) { sq = lppos->ucsqPieces[pcRook]; if (sq != 0) { y = RANK_Y(sq); if (y == RANK_BOTTOM) { x = FILE_X(sq); if ((lppos->RankMaskPtr(x, y)->wRookCap & KING_BITRANK) != 0) { vlWhitePenalty += 80; } } } } } } else if (y == RANK_BOTTOM) { if ((lppos->RankMaskPtr(x, y)->wRookCap & KING_BITRANK) != 0) { // ڵв vlWhitePenalty += PreEvalEx.vlWhiteBottomThreat[x]; } } } } break; default: break; } } else if (lppos->ucsqPieces[SIDE_TAG(0) + KING_FROM] == 0xb7) { // ˫(ʿ)ı˧()ռ죬Ҫ vlWhitePenalty += 20; } } else { if ((lppos->wBitPiece[1] & ROOK_BITPIECE) == ROOK_BITPIECE) { // ȱ(ʿ)˫з vlWhitePenalty += PreEvalEx.vlWhiteAdvisorLeakage; } } if ((lppos->wBitPiece[1] & ADVISOR_BITPIECE) == ADVISOR_BITPIECE) { if (lppos->ucsqPieces[SIDE_TAG(1) + KING_FROM] == 0x37) { sqAdv1 = lppos->ucsqPieces[SIDE_TAG(1) + ADVISOR_FROM]; sqAdv2 = lppos->ucsqPieces[SIDE_TAG(1) + ADVISOR_TO]; if (false) { } else if (sqAdv1 == 0x36) { // ڷһʿ nShape = (sqAdv2 == 0x38 ? SHAPE_CENTER : sqAdv2 == 0x47 ? SHAPE_LEFT : SHAPE_NONE); } else if (sqAdv1 == 0x38) { // ڷһʿҲ nShape = (sqAdv2 == 0x36 ? SHAPE_CENTER : sqAdv2 == 0x47 ? SHAPE_RIGHT : SHAPE_NONE); } else if (sqAdv1 == 0x47) { // ڷһʿڻ nShape = (sqAdv2 == 0x36 ? SHAPE_LEFT : sqAdv2 == 0x38 ? SHAPE_RIGHT : SHAPE_NONE); } else { nShape = SHAPE_NONE; } switch (nShape) { case SHAPE_NONE: break; case SHAPE_CENTER: for (pcCannon = SIDE_TAG(0) + CANNON_FROM; pcCannon <= SIDE_TAG(0) + CANNON_TO; pcCannon ++) { sq = lppos->ucsqPieces[pcCannon]; if (sq != 0) { x = FILE_X(sq); if (x == FILE_CENTER) { y = RANK_Y(sq); lpsms = lppos->FileMaskPtr(x, y); if ((lpsms->wRookCap & BLACK_KING_BITFILE) != 0) { // ͷڵв vlBlackPenalty += PreEvalEx.vlHollowThreat[y]; } else if ((lpsms->wSuperCap & BLACK_KING_BITFILE) != 0 && (lppos->ucpcSquares[0x47] == 37 || lppos->ucpcSquares[0x47] == 38)) { // в vlBlackPenalty += PreEvalEx.vlCentralThreat[y]; } } } } break; case SHAPE_LEFT: case SHAPE_RIGHT: for (pcCannon = SIDE_TAG(0) + CANNON_FROM; pcCannon <= SIDE_TAG(0) + CANNON_TO; pcCannon ++) { sq = lppos->ucsqPieces[pcCannon]; if (sq != 0) { x = FILE_X(sq); y = RANK_Y(sq); if (x == FILE_CENTER) { if ((lppos->FileMaskPtr(x, y)->wSuperCap & BLACK_KING_BITFILE) != 0) { // һڵв˧()űԷƵĻжⷣ vlBlackPenalty += (PreEvalEx.vlCentralThreat[y] >> 2) + (lppos->Protected(0, nShape == SHAPE_LEFT ? 0x38 : 0x36) ? 20 : 0); // ڵ߱˧()ķ֣ for (pcRook = SIDE_TAG(1) + ROOK_FROM; pcRook <= SIDE_TAG(1) + ROOK_TO; pcRook ++) { sq = lppos->ucsqPieces[pcRook]; if (sq != 0) { y = RANK_Y(sq); if (y == RANK_TOP) { x = FILE_X(sq); if ((lppos->RankMaskPtr(x, y)->wRookCap & KING_BITRANK) != 0) { vlBlackPenalty += 80; } } } } } } else if (y == RANK_TOP) { if ((lppos->RankMaskPtr(x, y)->wRookCap & KING_BITRANK) != 0) { // ڵв vlBlackPenalty += PreEvalEx.vlBlackBottomThreat[x]; } } } } break; default: break; } } else if (lppos->ucsqPieces[SIDE_TAG(1) + KING_FROM] == 0x47) { // ˫(ʿ)ı˧()ռ죬Ҫ vlBlackPenalty += 20; } } else { if ((lppos->wBitPiece[0] & ROOK_BITPIECE) == ROOK_BITPIECE) { // ȱ(ʿ)˫з vlBlackPenalty += PreEvalEx.vlBlackAdvisorLeakage; } } return SIDE_VALUE(lppos->sdPlayer, vlBlackPenalty - vlWhitePenalty); } // ǵһ֣͵ // ǵڶ֣ǣƵ // "cnValuableStringPieces"жǣǷмֵ // 0Ƕڳ˵ģǣ(ǣ)мֵ1Ƕ˵ֻǣмֵ static const int cnValuableStringPieces[48] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0 }; // "ccvlStringValueTab""KNIGHT_PIN_TAB"ij("pregen.h")ǣƼֵ // мӺͱǣӵľԽǣƵļֵԽ static const char ccvlStringValueTab[512] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 12, 16, 20, 24, 28, 32, 36, 0, 36, 32, 28, 24, 20, 16, 12, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // ǣ˧()򳵵͵ int StringHold(const PositionStruct *lppos) { int sd, i, j, nDir, sqSrc, sqDst, sqStr; int x, y, nSideTag, nOppSideTag; int vlString[2]; SlideMoveStruct *lpsmv; for (sd = 0; sd < 2; sd ++) { vlString[sd] = 0; nSideTag = SIDE_TAG(sd); nOppSideTag = OPP_SIDE_TAG(sd); // óǣƵ for (i = ROOK_FROM; i <= ROOK_TO; i ++) { sqSrc = lppos->ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); // ǣĿ˧() sqDst = lppos->ucsqPieces[nOppSideTag + KING_FROM]; if (sqDst != 0) { __ASSERT_SQUARE(sqDst); x = FILE_X(sqSrc); y = RANK_Y(sqSrc); if (x == FILE_X(sqDst)) { lpsmv = lppos->FileMovePtr(x, y); nDir = (sqSrc < sqDst ? 0 : 1); // ڵijԷ(óڵŷ)ܳԵĿ"sqDst"ǣƾͳˣͬ if (sqDst == lpsmv->ucCannonCap[nDir] + FILE_DISP(x)) { // ǣ"sqStr"dz()ܳԵӣͬ sqStr = lpsmv->ucRookCap[nDir] + FILE_DISP(x); __ASSERT_SQUARE(sqStr); // ǣӱǶԷӣͬ if ((lppos->ucpcSquares[sqStr] & nOppSideTag) != 0) { // ǣмֵģұǣûб(Ŀӱ)ôǣмֵģͬ if (cnValuableStringPieces[lppos->ucpcSquares[sqStr]] > 0 && !lppos->Protected(OPP_SIDE(sd), sqStr, sqDst)) { vlString[sd] += ccvlStringValueTab[sqDst - sqStr + 256]; } } } } else if (y == RANK_Y(sqDst)) { lpsmv = lppos->RankMovePtr(x, y); nDir = (sqSrc < sqDst ? 0 : 1); if (sqDst == lpsmv->ucCannonCap[nDir] + RANK_DISP(y)) { sqStr = lpsmv->ucRookCap[nDir] + RANK_DISP(y); __ASSERT_SQUARE(sqStr); if ((lppos->ucpcSquares[sqStr] & nOppSideTag) != 0) { if (cnValuableStringPieces[lppos->ucpcSquares[sqStr]] > 0 && !lppos->Protected(OPP_SIDE(sd), sqStr, sqDst)) { vlString[sd] += ccvlStringValueTab[sqDst - sqStr + 256]; } } } } } // ǣĿdz for (j = ROOK_FROM; j <= ROOK_TO; j ++) { sqDst = lppos->ucsqPieces[nOppSideTag + j]; if (sqDst != 0) { __ASSERT_SQUARE(sqDst); x = FILE_X(sqSrc); y = RANK_Y(sqSrc); if (x == FILE_X(sqDst)) { lpsmv = lppos->FileMovePtr(x, y); nDir = (sqSrc < sqDst ? 0 : 1); if (sqDst == lpsmv->ucCannonCap[nDir] + FILE_DISP(x)) { sqStr = lpsmv->ucRookCap[nDir] + FILE_DISP(x); __ASSERT_SQUARE(sqStr); if ((lppos->ucpcSquares[sqStr] & nOppSideTag) != 0) { // Ŀdzͬ˧()ҪҲûбʱǣƼֵͬ if (cnValuableStringPieces[lppos->ucpcSquares[sqStr]] > 0 && !lppos->Protected(OPP_SIDE(sd), sqDst) && !lppos->Protected(OPP_SIDE(sd), sqStr, sqDst)) { vlString[sd] += ccvlStringValueTab[sqDst - sqStr + 256]; } } } } else if (y == RANK_Y(sqDst)) { lpsmv = lppos->RankMovePtr(x, y); nDir = (sqSrc < sqDst ? 0 : 1); if (sqDst == lpsmv->ucCannonCap[nDir] + RANK_DISP(y)) { sqStr = lpsmv->ucRookCap[nDir] + RANK_DISP(y); __ASSERT_SQUARE(sqStr); if ((lppos->ucpcSquares[sqStr] & nOppSideTag) != 0) { if (cnValuableStringPieces[lppos->ucpcSquares[sqStr]] > 0 && !lppos->Protected(OPP_SIDE(sd), sqDst) && !lppos->Protected(OPP_SIDE(sd), sqStr, sqDst)) { vlString[sd] += ccvlStringValueTab[sqDst - sqStr + 256]; } } } } } } } } // ǣƵ for (i = CANNON_FROM; i <= CANNON_TO; i ++) { sqSrc = lppos->ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); // ǣĿ˧() sqDst = lppos->ucsqPieces[nOppSideTag + KING_FROM]; if (sqDst != 0) { __ASSERT_SQUARE(sqDst); x = FILE_X(sqSrc); y = RANK_Y(sqSrc); if (x == FILE_X(sqDst)) { lpsmv = lppos->FileMovePtr(x, y); nDir = (sqSrc < sqDst ? 0 : 1); if (sqDst == lpsmv->ucSuperCap[nDir] + FILE_DISP(x)) { sqStr = lpsmv->ucCannonCap[nDir] + FILE_DISP(x); __ASSERT_SQUARE(sqStr); if ((lppos->ucpcSquares[sqStr] & nOppSideTag) != 0) { if (cnValuableStringPieces[lppos->ucpcSquares[sqStr]] > 1 && !lppos->Protected(OPP_SIDE(sd), sqStr, sqDst)) { vlString[sd] += ccvlStringValueTab[sqDst - sqStr + 256]; } } } } else if (y == RANK_Y(sqDst)) { lpsmv = lppos->RankMovePtr(x, y); nDir = (sqSrc < sqDst ? 0 : 1); if (sqDst == lpsmv->ucSuperCap[nDir] + RANK_DISP(y)) { sqStr = lpsmv->ucCannonCap[nDir] + RANK_DISP(y); __ASSERT_SQUARE(sqStr); if ((lppos->ucpcSquares[sqStr] & nOppSideTag) != 0) { if (cnValuableStringPieces[lppos->ucpcSquares[sqStr]] > 1 && !lppos->Protected(OPP_SIDE(sd), sqStr, sqDst)) { vlString[sd] += ccvlStringValueTab[sqDst - sqStr + 256]; } } } } } // ǣĿdz for (j = ROOK_FROM; j <= ROOK_TO; j ++) { sqDst = lppos->ucsqPieces[nOppSideTag + j]; if (sqDst != 0) { __ASSERT_SQUARE(sqDst); x = FILE_X(sqSrc); y = RANK_Y(sqSrc); if (x == FILE_X(sqDst)) { lpsmv = lppos->FileMovePtr(x, y); nDir = (sqSrc < sqDst ? 0 : 1); if (sqDst == lpsmv->ucSuperCap[nDir] + FILE_DISP(x)) { sqStr = lpsmv->ucCannonCap[nDir] + FILE_DISP(x); __ASSERT_SQUARE(sqStr); if ((lppos->ucpcSquares[sqStr] & nOppSideTag) != 0) { if (cnValuableStringPieces[lppos->ucpcSquares[sqStr]] > 1 && !lppos->Protected(OPP_SIDE(sd), sqStr, sqDst)) { vlString[sd] += ccvlStringValueTab[sqDst - sqStr + 256]; } } } } else if (y == RANK_Y(sqDst)) { lpsmv = lppos->RankMovePtr(x, y); nDir = (sqSrc < sqDst ? 0 : 1); if (sqDst == lpsmv->ucSuperCap[nDir] + RANK_DISP(y)) { sqStr = lpsmv->ucCannonCap[nDir] + RANK_DISP(y); __ASSERT_SQUARE(sqStr); if ((lppos->ucpcSquares[sqStr] & nOppSideTag) != 0) { if (cnValuableStringPieces[lppos->ucpcSquares[sqStr]] > 1 && !lppos->Protected(OPP_SIDE(sd), sqStr, sqDst)) { vlString[sd] += ccvlStringValueTab[sqDst - sqStr + 256]; } } } } } } } } } return SIDE_VALUE(lppos->sdPlayer, vlString[0] - vlString[1]); } // ǵڶ֣ǣƵ // ǵ֣Ե int RookMobility(const PositionStruct *lppos) { int sd, i, sqSrc, nSideTag, x, y; int vlRookMobility[2]; for (sd = 0; sd < 2; sd ++) { vlRookMobility[sd] = 0; nSideTag = SIDE_TAG(sd); for (i = ROOK_FROM; i <= ROOK_TO; i ++) { sqSrc = lppos->ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); x = FILE_X(sqSrc); y = RANK_Y(sqSrc); vlRookMobility[sd] += PreEvalEx.cPopCnt16[lppos->RankMaskPtr(x, y)->wNonCap] + PreEvalEx.cPopCnt16[lppos->FileMaskPtr(x, y)->wNonCap]; } } __ASSERT(vlRookMobility[sd] <= 34); } return SIDE_VALUE(lppos->sdPlayer, vlRookMobility[0] - vlRookMobility[1]) >> 1; } // ǵ֣Ե // ǵIJ֣ܵ谭 // "cbcEdgeSquares"˲λã̱Եλõǻ static const bool cbcEdgeSquares[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int KnightTrap(const PositionStruct *lppos) { int sd, i, sqSrc, sqDst, nSideTag, nMovable; uint8_t *lpucsqDst, *lpucsqPin; int vlKnightTraps[2]; for (sd = 0; sd < 2; sd ++) { vlKnightTraps[sd] = 0; nSideTag = SIDE_TAG(sd); // ߵλãߵ̱ԵϣߵԷĿƸ񣬶ų for (i = KNIGHT_FROM; i <= KNIGHT_TO; i ++) { sqSrc = lppos->ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); nMovable = 0; lpucsqDst = PreGen.ucsqKnightMoves[sqSrc]; lpucsqPin = PreGen.ucsqKnightPins[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); // µж"genmoves.cpp"еŷųߵ̱ԵߵԷƸŷ if (!cbcEdgeSquares[sqDst] && lppos->ucpcSquares[sqDst] == 0 && lppos->ucpcSquares[*lpucsqPin] == 0 && !lppos->Protected(OPP_SIDE(sd), sqDst)) { nMovable ++; if (nMovable > 1) { break; } } lpucsqDst ++; sqDst = *lpucsqDst; lpucsqPin ++; } // ûкõŷ10ַֻ֣һõŷ5ַ if (nMovable == 0) { vlKnightTraps[sd] += 10; } else if (nMovable == 1) { vlKnightTraps[sd] += 5; } } __ASSERT(vlKnightTraps[sd] <= 20); } } return SIDE_VALUE(lppos->sdPlayer, vlKnightTraps[1] - vlKnightTraps[0]); } // ǵIJ֣ܵ谭 // ۹ int WINAPI Evaluate(const PositionStruct *lppos, int vlAlpha, int vlBeta) { int vl; // ͵ľۺ¼Σ // 1. ļ͵(͵)ֻƽ⣻ vl = lppos->Material(); if (vl + EVAL_MARGIN1 <= vlAlpha) { return vl + EVAL_MARGIN1; } else if (vl - EVAL_MARGIN1 >= vlBeta) { return vl - EVAL_MARGIN1; } // 2. ͵ۣͣ vl += AdvisorShape(lppos); if (vl + EVAL_MARGIN2 <= vlAlpha) { return vl + EVAL_MARGIN2; } else if (vl - EVAL_MARGIN2 >= vlBeta) { return vl - EVAL_MARGIN2; } // 3. ͵ۣǣƣ vl += StringHold(lppos); if (vl + EVAL_MARGIN3 <= vlAlpha) { return vl + EVAL_MARGIN3; } else if (vl - EVAL_MARGIN3 >= vlBeta) { return vl - EVAL_MARGIN3; } // 4. һ͵ۣԣ vl += RookMobility(lppos); if (vl + EVAL_MARGIN4 <= vlAlpha) { return vl + EVAL_MARGIN4; } else if (vl - EVAL_MARGIN4 >= vlBeta) { return vl - EVAL_MARGIN4; } // 5. 㼶͵(ȫ)谭 return vl + KnightTrap(lppos); } const char *WINAPI GetEngineName(void) { return NULL; } gmchess-0.29.6.3/src/engine/genmoves.cpp000066400000000000000000000657171323660377300200170ustar00rootroot00000000000000/* genmoves.cpp - Source Code for ElephantEye, Part IV ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.0, Last Modified: Nov. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "base.h" #include "pregen.h" #include "position.h" /* ElephantEyeԴʹõǺԼ * * sq: (0255"pregen.cpp") * pc: (047"position.cpp") * pt: (06"position.cpp") * mv: ŷ(065535"position.cpp") * sd: ӷ(0췽1ڷ) * vl: ֵ("-MATE_VALUE""MATE_VALUE""position.cpp") * (עĸǺſucdwȴļǺʹ) * pos: (PositionStructͣ"position.h") * sms: λкλеŷԤýṹ("pregen.h") * smv: λкλеŷжԤýṹ("pregen.h") */ // ģֻ漰"PositionStruct"е"sdPlayer""ucpcSquares""ucsqPieces"Աʡǰ"this->" // ӱж bool PositionStruct::Protected(int sd, int sqSrc, int sqExcept) const { // "sqExcept"ʾų(ָӱ)DZǣӵıʱҪųǣĿӵı int i, sqDst, sqPin, pc, x, y, nSideTag; SlideMaskStruct *lpsmsRank, *lpsmsFile; // ӱжϰ¼裺 __ASSERT_SQUARE(sqSrc); nSideTag = SIDE_TAG(sd); if (HOME_HALF(sqSrc, sd)) { if (IN_FORT(sqSrc)) { // 1. жܵ˧()ı sqDst = ucsqPieces[nSideTag + KING_FROM]; if (sqDst != 0 && sqDst != sqExcept) { __ASSERT_SQUARE(sqDst); if (KING_SPAN(sqSrc, sqDst)) { return true; } } // 2. жܵ(ʿ)ı for (i = ADVISOR_FROM; i <= ADVISOR_TO; i ++) { sqDst = ucsqPieces[nSideTag + i]; if (sqDst != 0 && sqDst != sqExcept) { __ASSERT_SQUARE(sqDst); if (ADVISOR_SPAN(sqSrc, sqDst)) { return true; } } } } // 3. жܵ()ı for (i = BISHOP_FROM; i <= BISHOP_TO; i ++) { sqDst = ucsqPieces[nSideTag + i]; if (sqDst != 0 && sqDst != sqExcept) { __ASSERT_SQUARE(sqDst); if (BISHOP_SPAN(sqSrc, sqDst) && ucpcSquares[BISHOP_PIN(sqSrc, sqDst)] == 0) { return true; } } } } else { // 4. жܵӱ()ı for (sqDst = sqSrc - 1; sqDst <= sqSrc + 1; sqDst += 2) { // ڱߣôԲ // __ASSERT_SQUARE(sqDst); if (sqDst != sqExcept) { pc = ucpcSquares[sqDst]; if ((pc & nSideTag) != 0 && PIECE_INDEX(pc) >= PAWN_FROM) { return true; } } } } // 5. жܵ()ı sqDst = SQUARE_BACKWARD(sqSrc, sd); // ڵߣôԲ // __ASSERT_SQUARE(sqDst); if (sqDst != sqExcept) { pc = ucpcSquares[sqDst]; if ((pc & nSideTag) != 0 && PIECE_INDEX(pc) >= PAWN_FROM) { return true; } } // 6. жܵı for (i = KNIGHT_FROM; i <= KNIGHT_TO; i ++) { sqDst = ucsqPieces[nSideTag + i]; if (sqDst != 0 && sqDst != sqExcept) { __ASSERT_SQUARE(sqDst); sqPin = KNIGHT_PIN(sqDst, sqSrc); // ע⣬sqSrcsqDstǷģ if (sqPin != sqDst && ucpcSquares[sqPin] == 0) { return true; } } } x = FILE_X(sqSrc); y = RANK_Y(sqSrc); lpsmsRank = RankMaskPtr(x, y); lpsmsFile = FileMaskPtr(x, y); // 7. жܵı"position.cpp""CheckedBy()" for (i = ROOK_FROM; i <= ROOK_TO; i ++) { sqDst = ucsqPieces[nSideTag + i]; if (sqDst != 0 && sqDst != sqSrc && sqDst != sqExcept) { if (x == FILE_X(sqDst)) { if ((lpsmsFile->wRookCap & PreGen.wBitFileMask[sqDst]) != 0) { return true; } } else if (y == RANK_Y(sqDst)) { if ((lpsmsRank->wRookCap & PreGen.wBitRankMask[sqDst]) != 0) { return true; } } } } // 8. жܵڵı"position.cpp""CheckedBy()" for (i = CANNON_FROM; i <= CANNON_TO; i ++) { sqDst = ucsqPieces[nSideTag + i]; if (sqDst && sqDst != sqSrc && sqDst != sqExcept) { if (x == FILE_X(sqDst)) { if ((lpsmsFile->wCannonCap & PreGen.wBitFileMask[sqDst]) != 0) { return true; } } else if (y == RANK_Y(sqDst)) { if ((lpsmsRank->wCannonCap & PreGen.wBitRankMask[sqDst]) != 0) { return true; } } } } return false; } /* MVV(LVA)ֵĺ * * MVV(LVA)ָǣޱôȡֵMVVȡֵMVV-LVA * ElephantEyeMVV(LVA)ֵڼϺټ1ǣ¼ֺ壺 * a. MVV(LVA)1˵Ӽֵڹ(׬)ֳӽ̬Ҳֳӣ * b. MVV(LVA)1˵һֵ(ԳڻԹӱ䣬ǿģҲֵһ)̬Ҳֳӣ * c. MVV(LVA)0˵ûмֳֵ̬ӡ * * MVVֵ"SIMPLE_VALUE"ǰ˧()=5=4=3()=2(ʿ)()=1趨ģ * LVAֱֵڳŷС */ int PositionStruct::MvvLva(int sqDst, int pcCaptured, int nLva) const { int nMvv, nLvaAdjust; nMvv = SIMPLE_VALUE(pcCaptured); nLvaAdjust = (Protected(OPP_SIDE(sdPlayer), sqDst) ? nLva : 0); if (nMvv >= nLvaAdjust) { return nMvv - nLvaAdjust + 1; } else { return (nMvv >= 3 || HOME_HALF(sqDst, sdPlayer)) ? 1 : 0; } } // ŷMVV(LVA)趨ֵ int PositionStruct::GenCapMoves(MoveStruct *lpmvs) const { int i, sqSrc, sqDst, pcCaptured; int x, y, nSideTag, nOppSideTag; bool bCanPromote; SlideMoveStruct *lpsmv; uint8_t *lpucsqDst, *lpucsqPin; MoveStruct *lpmvsCurr; // ɳŷĹ̰¼裺 lpmvsCurr = lpmvs; nSideTag = SIDE_TAG(sdPlayer); nOppSideTag = OPP_SIDE_TAG(sdPlayer); bCanPromote = PreEval.bPromotion && CanPromote(); // 1. ˧()ŷ sqSrc = ucsqPieces[nSideTag + KING_FROM]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqKingMoves[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); // ҵһŷжϳԵǷǶԷӣ"nOppSideTag"ı־(1632ߵ) // ǶԷӣ򱣴MVV(LVA)ֵޱֻMVVMVV-LVA(MVV>LVAĻ) pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 5); // ˧()ļֵ5 lpmvsCurr ++; } lpucsqDst ++; sqDst = *lpucsqDst; } } // 2. (ʿ)ŷ for (i = ADVISOR_FROM; i <= ADVISOR_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqAdvisorMoves[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 1); // (ʿ)ļֵ1 lpmvsCurr ++; } lpucsqDst ++; sqDst = *lpucsqDst; } if (bCanPromote && CAN_PROMOTE(sqSrc)) { lpmvsCurr->wmv = MOVE(sqSrc, sqSrc); lpmvsCurr->wvl = 0; lpmvsCurr ++; } } } // 3. ()ŷ for (i = BISHOP_FROM; i <= BISHOP_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqBishopMoves[sqSrc]; lpucsqPin = PreGen.ucsqBishopPins[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); if (ucpcSquares[*lpucsqPin] == 0) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 1); // ()ļֵ1 lpmvsCurr ++; } } lpucsqDst ++; sqDst = *lpucsqDst; lpucsqPin ++; } if (bCanPromote && CAN_PROMOTE(sqSrc)) { lpmvsCurr->wmv = MOVE(sqSrc, sqSrc); lpmvsCurr->wvl = 0; lpmvsCurr ++; } } } // 4. ŷ for (i = KNIGHT_FROM; i <= KNIGHT_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqKnightMoves[sqSrc]; lpucsqPin = PreGen.ucsqKnightPins[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); if (ucpcSquares[*lpucsqPin] == 0) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 3); // ļֵ3 lpmvsCurr ++; } } lpucsqDst ++; sqDst = *lpucsqDst; lpucsqPin ++; } } } // 5. ɳŷ for (i = ROOK_FROM; i <= ROOK_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); x = FILE_X(sqSrc); y = RANK_Y(sqSrc); lpsmv = RankMovePtr(x, y); sqDst = lpsmv->ucRookCap[0] + RANK_DISP(y); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 4); // ļֵ4 lpmvsCurr ++; } } sqDst = lpsmv->ucRookCap[1] + RANK_DISP(y); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 4); // ļֵ4 lpmvsCurr ++; } } lpsmv = FileMovePtr(x, y); sqDst = lpsmv->ucRookCap[0] + FILE_DISP(x); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 4); // ļֵ4 lpmvsCurr ++; } } sqDst = lpsmv->ucRookCap[1] + FILE_DISP(x); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 4); // ļֵ4 lpmvsCurr ++; } } } } // 6. ڵŷ for (i = CANNON_FROM; i <= CANNON_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); x = FILE_X(sqSrc); y = RANK_Y(sqSrc); lpsmv = RankMovePtr(x, y); sqDst = lpsmv->ucCannonCap[0] + RANK_DISP(y); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 3); // ڵļֵ3 lpmvsCurr ++; } } sqDst = lpsmv->ucCannonCap[1] + RANK_DISP(y); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 3); // ڵļֵ3 lpmvsCurr ++; } } lpsmv = FileMovePtr(x, y); sqDst = lpsmv->ucCannonCap[0] + FILE_DISP(x); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 3); // ڵļֵ3 lpmvsCurr ++; } } sqDst = lpsmv->ucCannonCap[1] + FILE_DISP(x); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 3); // ڵļֵ3 lpmvsCurr ++; } } } } // 7. ɱ()ŷ for (i = PAWN_FROM; i <= PAWN_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqPawnMoves[sdPlayer][sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 2); // ()ļֵ2 lpmvsCurr ++; } lpucsqDst ++; sqDst = *lpucsqDst; } } } return lpmvsCurr - lpmvs; } // ŷ int PositionStruct::GenNonCapMoves(MoveStruct *lpmvs) const { int i, sqSrc, sqDst, x, y, nSideTag; SlideMoveStruct *lpsmv; uint8_t *lpucsqDst, *lpucsqPin; MoveStruct *lpmvsCurr; // ɲŷĹ̰¼裺 lpmvsCurr = lpmvs; nSideTag = SIDE_TAG(sdPlayer); // 1. ˧()ŷ sqSrc = ucsqPieces[nSideTag + KING_FROM]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqKingMoves[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); // ҵһŷжǷԵ if (ucpcSquares[sqDst] == 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->dwmv = MOVE(sqSrc, sqDst); lpmvsCurr ++; } lpucsqDst ++; sqDst = *lpucsqDst; } } // 2. (ʿ)ŷ for (i = ADVISOR_FROM; i <= ADVISOR_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqAdvisorMoves[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); if (ucpcSquares[sqDst] == 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->dwmv = MOVE(sqSrc, sqDst); lpmvsCurr ++; } lpucsqDst ++; sqDst = *lpucsqDst; } } } // 3. ()ŷ for (i = BISHOP_FROM; i <= BISHOP_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqBishopMoves[sqSrc]; lpucsqPin = PreGen.ucsqBishopPins[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); if (ucpcSquares[*lpucsqPin] == 0 && ucpcSquares[sqDst] == 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->dwmv = MOVE(sqSrc, sqDst); lpmvsCurr ++; } lpucsqDst ++; sqDst = *lpucsqDst; lpucsqPin ++; } } } // 4. ŷ for (i = KNIGHT_FROM; i <= KNIGHT_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqKnightMoves[sqSrc]; lpucsqPin = PreGen.ucsqKnightPins[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); if (ucpcSquares[*lpucsqPin] == 0 && ucpcSquares[sqDst] == 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->dwmv = MOVE(sqSrc, sqDst); lpmvsCurr ++; } lpucsqDst ++; sqDst = *lpucsqDst; lpucsqPin ++; } } } // 5. ɳڵŷûбҪжǷԵ for (i = ROOK_FROM; i <= CANNON_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); x = FILE_X(sqSrc); y = RANK_Y(sqSrc); lpsmv = RankMovePtr(x, y); sqDst = lpsmv->ucNonCap[0] + RANK_DISP(y); __ASSERT_SQUARE(sqDst); while (sqDst != sqSrc) { __ASSERT(ucpcSquares[sqDst] == 0); __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->dwmv = MOVE(sqSrc, sqDst); lpmvsCurr ++; sqDst --; } sqDst = lpsmv->ucNonCap[1] + RANK_DISP(y); __ASSERT_SQUARE(sqDst); while (sqDst != sqSrc) { __ASSERT(ucpcSquares[sqDst] == 0); __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->dwmv = MOVE(sqSrc, sqDst); lpmvsCurr ++; sqDst ++; } lpsmv = FileMovePtr(x, y); sqDst = lpsmv->ucNonCap[0] + FILE_DISP(x); __ASSERT_SQUARE(sqDst); while (sqDst != sqSrc) { __ASSERT(ucpcSquares[sqDst] == 0); __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->dwmv = MOVE(sqSrc, sqDst); lpmvsCurr ++; sqDst -= 16; } sqDst = lpsmv->ucNonCap[1] + FILE_DISP(x); __ASSERT_SQUARE(sqDst); while (sqDst != sqSrc) { __ASSERT(ucpcSquares[sqDst] == 0); __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->dwmv = MOVE(sqSrc, sqDst); lpmvsCurr ++; sqDst += 16; } } } // 6. ɱ()ŷ for (i = PAWN_FROM; i <= PAWN_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqPawnMoves[sdPlayer][sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); if (ucpcSquares[sqDst] == 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->dwmv = MOVE(sqSrc, sqDst); lpmvsCurr ++; } lpucsqDst ++; sqDst = *lpucsqDst; } } } return lpmvsCurr - lpmvs; } // ׽ļ int PositionStruct::ChasedBy(int mv) const { int i, nSideTag, pcMoved, pcCaptured; int sqSrc, sqDst, x, y; uint8_t *lpucsqDst, *lpucsqPin; SlideMoveStruct *lpsmv; sqSrc = DST(mv); pcMoved = this->ucpcSquares[sqSrc]; nSideTag = SIDE_TAG(this->sdPlayer); __ASSERT_SQUARE(sqSrc); __ASSERT_PIECE(pcMoved); __ASSERT_BOUND(0, pcMoved - OPP_SIDE_TAG(this->sdPlayer), 15); // ׽жϰ¼ݣ switch (pcMoved - OPP_SIDE_TAG(this->sdPlayer)) { // 1. жǷ׽׽иڱ() case KNIGHT_FROM: case KNIGHT_TO: // һȵİ˸λ lpucsqDst = PreGen.ucsqKnightMoves[sqSrc]; lpucsqPin = PreGen.ucsqKnightPins[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); if (ucpcSquares[*lpucsqPin] == 0) { pcCaptured = this->ucpcSquares[sqDst]; if ((pcCaptured & nSideTag) != 0) { pcCaptured -= nSideTag; __ASSERT_BOUND(0, pcCaptured, 15); // ɣŻжϵķ֦ if (pcCaptured <= ROOK_TO) { // ׽(ʿ)()迼 if (pcCaptured >= ROOK_FROM) { // ׽˳ return pcCaptured; } } else { if (pcCaptured <= CANNON_TO) { // ׽ڣҪжǷܱ if (!Protected(this->sdPlayer, sqDst)) { return pcCaptured; } } else { // ׽˱()Ҫжϱ()ǷӲܱ if (AWAY_HALF(sqDst, sdPlayer) && !Protected(this->sdPlayer, sqDst)) { return pcCaptured; } } } } } lpucsqDst ++; sqDst = *lpucsqDst; lpucsqPin ++; } break; // 2. ˳жǷ׽иڱ() case ROOK_FROM: case ROOK_TO: x = FILE_X(sqSrc); y = RANK_Y(sqSrc); if (((SRC(mv) ^ sqSrc) & 0xf) == 0) { // ƶˣжϳԵ lpsmv = RankMovePtr(x, y); for (i = 0; i < 2; i ++) { sqDst = lpsmv->ucRookCap[i] + RANK_DISP(y); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = this->ucpcSquares[sqDst]; if ((pcCaptured & nSideTag) != 0) { pcCaptured -= nSideTag; __ASSERT_BOUND(0, pcCaptured, 15); // ɣŻжϵķ֦ if (pcCaptured <= ROOK_TO) { // ׽(ʿ)()迼 if (pcCaptured >= KNIGHT_FROM) { if (pcCaptured <= KNIGHT_TO) { // ׽ҪжǷܱ if (!Protected(this->sdPlayer, sqDst)) { return pcCaptured; } } // ׽迼 } } else { if (pcCaptured <= CANNON_TO) { // ׽ڣҪжǷܱ if (!Protected(this->sdPlayer, sqDst)) { return pcCaptured; } } else { // ׽˱()Ҫжϱ()ǷӲܱ if (AWAY_HALF(sqDst, sdPlayer) && !Protected(this->sdPlayer, sqDst)) { return pcCaptured; } } } } } } } else { // ƶˣжϳԵ lpsmv = FileMovePtr(x, y); for (i = 0; i < 2; i ++) { sqDst = lpsmv->ucRookCap[i] + FILE_DISP(x); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = this->ucpcSquares[sqDst]; if ((pcCaptured & nSideTag) != 0) { pcCaptured -= nSideTag; __ASSERT_BOUND(0, pcCaptured, 15); // ɣŻжϵķ֦ if (pcCaptured <= ROOK_TO) { // ׽(ʿ)()迼 if (pcCaptured >= KNIGHT_FROM) { if (pcCaptured <= KNIGHT_TO) { // ׽ҪжǷܱ if (!Protected(this->sdPlayer, sqDst)) { return pcCaptured; } } // ׽迼 } } else { if (pcCaptured <= CANNON_TO) { // ׽ڣҪжǷܱ if (!Protected(this->sdPlayer, sqDst)) { return pcCaptured; } } else { // ׽˱()Ҫжϱ()ǷӲܱ if (AWAY_HALF(sqDst, sdPlayer) && !Protected(this->sdPlayer, sqDst)) { return pcCaptured; } } } } } } } break; // 3. ڣжǷ׽׽и() case CANNON_FROM: case CANNON_TO: x = FILE_X(sqSrc); y = RANK_Y(sqSrc); if (((SRC(mv) ^ sqSrc) & 0xf) == 0) { // ƶˣжںԵ lpsmv = RankMovePtr(x, y); for (i = 0; i < 2; i ++) { sqDst = lpsmv->ucCannonCap[i] + RANK_DISP(y); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = this->ucpcSquares[sqDst]; if ((pcCaptured & nSideTag) != 0) { pcCaptured -= nSideTag; __ASSERT_BOUND(0, pcCaptured, 15); // ɣŻжϵķ֦ if (pcCaptured <= ROOK_TO) { // ׽(ʿ)()迼 if (pcCaptured >= KNIGHT_FROM) { if (pcCaptured <= KNIGHT_TO) { // ׽ҪжǷܱ if (!Protected(this->sdPlayer, sqDst)) { return pcCaptured; } } else { // ׽˳ return pcCaptured; } } } else { // ׽ڵ迼 if (pcCaptured >= PAWN_FROM) { // ׽˱()Ҫжϱ()ǷӲܱ if (AWAY_HALF(sqDst, sdPlayer) && !Protected(this->sdPlayer, sqDst)) { return pcCaptured; } } } } } } } else { // ںƶˣжԵ lpsmv = FileMovePtr(x, y); for (i = 0; i < 2; i ++) { sqDst = lpsmv->ucCannonCap[i] + FILE_DISP(x); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = this->ucpcSquares[sqDst]; if ((pcCaptured & nSideTag) != 0) { pcCaptured -= nSideTag; __ASSERT_BOUND(0, pcCaptured, 15); // ɣŻжϵķ֦ if (pcCaptured <= ROOK_TO) { // ׽(ʿ)()迼 if (pcCaptured >= KNIGHT_FROM) { if (pcCaptured <= KNIGHT_TO) { // ׽ҪжǷܱ if (!Protected(this->sdPlayer, sqDst)) { return pcCaptured; } } else { // ׽˳ return pcCaptured; } } } else { // ׽ڵ迼 if (pcCaptured >= PAWN_FROM) { // ׽˱()Ҫжϱ()ǷӲܱ if (AWAY_HALF(sqDst, sdPlayer) && !Protected(this->sdPlayer, sqDst)) { return pcCaptured; } } } } } } } break; } return 0; } gmchess-0.29.6.3/src/engine/hash.cpp000066400000000000000000000225011323660377300170770ustar00rootroot00000000000000/* hash.h/hash.cpp - Source Code for ElephantEye, Part V ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.12, Last Modified: Dec. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "base.h" #include "position.h" #include "hash.h" int nHashMask; HashStruct *hshItems; #ifdef HASH_QUIESC HashStruct *hshItemsQ; #endif // 洢ûϢ void RecordHash(const PositionStruct &pos, int nFlag, int vl, int nDepth, int mv) { HashStruct hsh; int i, nHashDepth, nMinDepth, nMinLayer; // 洢ûϢĹ̰¼裺 // 1. Էֵɱ岽 __ASSERT_BOUND(1 - MATE_VALUE, vl, MATE_VALUE - 1); __ASSERT(mv == 0 || pos.LegalMove(mv)); if (vl > WIN_VALUE) { if (mv == 0 && vl <= BAN_VALUE) { return; // ³ľ(ûü)ŷҲûУôûбҪдû } vl += pos.nDistance; } else if (vl < -WIN_VALUE) { if (mv == 0 && vl >= -BAN_VALUE) { return; // ͬ } vl -= pos.nDistance; } else if (vl == pos.DrawValue() && mv == 0) { return; // ͬ } // 2. ̽û nMinDepth = 512; nMinLayer = 0; for (i = 0; i < HASH_LAYERS; i ++) { hsh = HASH_ITEM(pos, i); // 3. ̽һľ棬ôûϢɣ if (HASH_POS_EQUAL(hsh, pos)) { // ȸ߽߱Сɸûֵ if ((nFlag & HASH_ALPHA) != 0 && (hsh.ucAlphaDepth <= nDepth || hsh.svlAlpha >= vl)) { hsh.ucAlphaDepth = nDepth; hsh.svlAlpha = vl; } // BetaҪע⣺ҪNull-MoveĽ㸲Ľ if ((nFlag & HASH_BETA) != 0 && (hsh.ucBetaDepth <= nDepth || hsh.svlBeta <= vl) && (mv != 0 || hsh.wmv == 0)) { hsh.ucBetaDepth = nDepth; hsh.svlBeta = vl; } // ŷʼոǵ if (mv != 0) { hsh.wmv = mv; } HASH_ITEM(pos, i) = hsh; return; } // 4. һľ棬ôСû nHashDepth = MAX((hsh.ucAlphaDepth == 0 ? 0 : hsh.ucAlphaDepth + 256), (hsh.wmv == 0 ? hsh.ucBetaDepth : hsh.ucBetaDepth + 256)); __ASSERT(nHashDepth < 512); if (nHashDepth < nMinDepth) { nMinDepth = nHashDepth; nMinLayer = i; } } // 5. ¼û hsh.dwZobristLock0 = pos.zobr.dwLock0; hsh.dwZobristLock1 = pos.zobr.dwLock1; hsh.wmv = mv; hsh.ucAlphaDepth = hsh.ucBetaDepth = 0; hsh.svlAlpha = hsh.svlBeta = 0; if ((nFlag & HASH_ALPHA) != 0) { hsh.ucAlphaDepth = nDepth; hsh.svlAlpha = vl; } if ((nFlag & HASH_BETA) != 0) { hsh.ucBetaDepth = nDepth; hsh.svlBeta = vl; } HASH_ITEM(pos, nMinLayer) = hsh; } /* жϻȡûҪЩûķֵĸͬвͬĴ * һֵ"WIN_VALUE"("-WIN_VALUE""WIN_VALUE"֮䣬ͬ)ֻȡҪľ棻 * ֵ"WIN_VALUE""BAN_VALUE"֮䣬ܻȡûеֵ(ֻܻȡŷο)ĿǷֹڳµġûIJȶԡ * ֵ"BAN_VALUE"⣬ȡʱؿҪΪЩѾ֤ɱˣ * ġֵ"DrawValue()"(ǵһ)ܻȡûеֵ(ԭڶͬ) * ע⣺ڵҪɱ岽е */ inline int ValueAdjust(const PositionStruct &pos, bool &bBanNode, bool &bMateNode, int vl) { bBanNode = bMateNode = false; if (vl > WIN_VALUE) { if (vl <= BAN_VALUE) { bBanNode = true; } else { bMateNode = true; vl -= pos.nDistance; } } else if (vl < -WIN_VALUE) { if (vl >= -BAN_VALUE) { bBanNode = true; } else { bMateNode = true; vl += pos.nDistance; } } else if (vl == pos.DrawValue()) { bBanNode = true; } return vl; } // һŷǷȶڼûIJȶ inline bool MoveStable(PositionStruct &pos, int mv) { // жһŷǷȶǣ // 1. ûкŷٶȶģ if (mv == 0) { return true; } // 2. ŷȶģ __ASSERT(pos.LegalMove(mv)); if (pos.ucpcSquares[DST(mv)] != 0) { return true; } // 3. û·Ǩƣʹ·߳"MAX_MOVE_NUM"ʱӦֹ·ߣٶȶġ if (!pos.MakeMove(mv)) { return true; } return false; } // ·Ƿȶ(ѭ·)ڼûIJȶ static bool PosStable(const PositionStruct &pos, int mv) { HashStruct hsh; int i, nMoveNum; bool bStable; // pos·߱仯ջỹԭԱΪ"const""posMutable"е"const"Ľɫ PositionStruct &posMutable = (PositionStruct &) pos; __ASSERT(mv != 0); nMoveNum = 0; bStable = true; while (!MoveStable(posMutable, mv)) { nMoveNum ++; // "!MoveStable()"ѾִһŷԺҪ // ִŷѭôֹ·ߣȷϸ·߲ȶ if (posMutable.RepStatus() > 0) { bStable = false; break; } // ȡûͬ"ProbeHash()" for (i = 0; i < HASH_LAYERS; i ++) { hsh = HASH_ITEM(posMutable, i); if (HASH_POS_EQUAL(hsh, posMutable)) { break; } } mv = (i == HASH_LAYERS ? 0 : hsh.wmv); } // ǰִйŷ for (i = 0; i < nMoveNum; i ++) { posMutable.UndoMakeMove(); } return bStable; } // ȡûϢ(ûʱ"-MATE_VALUE") int ProbeHash(const PositionStruct &pos, int vlAlpha, int vlBeta, int nDepth, bool bNoNull, int &mv) { HashStruct hsh; int i, vl; bool bBanNode, bMateNode; // ȡûϢĹ̰¼裺 // 1. ȡû mv = 0; for (i = 0; i < HASH_LAYERS; i ++) { hsh = HASH_ITEM(pos, i); if (HASH_POS_EQUAL(hsh, pos)) { mv = hsh.wmv; __ASSERT(mv == 0 || pos.LegalMove(mv)); break; } } if (i == HASH_LAYERS) { return -MATE_VALUE; } // 2. жǷBeta߽ if (hsh.ucBetaDepth > 0) { vl = ValueAdjust(pos, bBanNode, bMateNode, hsh.svlBeta); if (!bBanNode && !(hsh.wmv == 0 && bNoNull) && (hsh.ucBetaDepth >= nDepth || bMateNode) && vl >= vlBeta) { __ASSERT_BOUND(1 - MATE_VALUE, vl, MATE_VALUE - 1); if (hsh.wmv == 0 || PosStable(pos, hsh.wmv)) { return vl; } } } // 3. жǷAlpha߽ if (hsh.ucAlphaDepth > 0) { vl = ValueAdjust(pos, bBanNode, bMateNode, hsh.svlAlpha); if (!bBanNode && (hsh.ucAlphaDepth >= nDepth || bMateNode) && vl <= vlAlpha) { __ASSERT_BOUND(1 - MATE_VALUE, vl, MATE_VALUE - 1); if (hsh.wmv == 0 || PosStable(pos, hsh.wmv)) { return vl; } } } return -MATE_VALUE; } #ifdef HASH_QUIESC // 洢ûϢ(̬) void RecordHashQ(const PositionStruct &pos, int vlBeta, int vlAlpha) { volatile HashStruct *lphsh; __ASSERT((vlBeta > -WIN_VALUE && vlBeta < WIN_VALUE) || (vlAlpha > -WIN_VALUE && vlAlpha < WIN_VALUE)); lphsh = hshItemsQ + (pos.zobr.dwKey & nHashMask); lphsh->dwZobristLock0 = pos.zobr.dwLock0; lphsh->svlAlpha = vlAlpha; lphsh->svlBeta = vlBeta; lphsh->dwZobristLock1 = pos.zobr.dwLock1; } // ȡûϢ(̬) int ProbeHashQ(const PositionStruct &pos, int vlAlpha, int vlBeta) { volatile HashStruct *lphsh; int vlHashAlpha, vlHashBeta; lphsh = hshItemsQ + (pos.zobr.dwKey & nHashMask); if (lphsh->dwZobristLock0 == pos.zobr.dwLock0) { vlHashAlpha = lphsh->svlAlpha; vlHashBeta = lphsh->svlBeta; if (lphsh->dwZobristLock1 == pos.zobr.dwLock1) { if (vlHashBeta >= vlBeta) { __ASSERT(vlHashBeta > -WIN_VALUE && vlHashBeta < WIN_VALUE); return vlHashBeta; } if (vlHashAlpha <= vlAlpha) { __ASSERT(vlHashAlpha > -WIN_VALUE && vlHashAlpha < WIN_VALUE); return vlHashAlpha; } } } return -MATE_VALUE; } #endif // UCCI֧ - HashеľϢ bool PopHash(const PositionStruct &pos) { HashStruct hsh; uint32_t dwMoveStr; int i; for (i = 0; i < HASH_LAYERS; i ++) { hsh = HASH_ITEM(pos, i); if (HASH_POS_EQUAL(hsh, pos)) { printf("pophash"); if (hsh.wmv != 0) { __ASSERT(pos.LegalMove(hsh.wmv)); dwMoveStr = MOVE_COORD(hsh.wmv); printf(" bestmove %.4s", (const char *) &dwMoveStr); } if (hsh.ucBetaDepth > 0) { printf(" lowerbound %d depth %d", hsh.svlBeta, hsh.ucBetaDepth); } if (hsh.ucAlphaDepth > 0) { printf(" upperbound %d depth %d", hsh.svlAlpha, hsh.ucAlphaDepth); } printf("\n"); fflush(stdout); return true; } } return false; } gmchess-0.29.6.3/src/engine/hash.h000066400000000000000000000067351323660377300165570ustar00rootroot00000000000000/* hash.h/hash.cpp - Source Code for ElephantEye, Part V ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.12, Last Modified: Dec. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "base.h" #include "position.h" #ifndef HASH_H #define HASH_H // û־ֻ"RecordHash()" const int HASH_BETA = 1; const int HASH_ALPHA = 2; const int HASH_PV = HASH_ALPHA | HASH_BETA; const int HASH_LAYERS = 2; // ûIJ const int NULL_DEPTH = 2; // Ųü // ûṹûϢZobristУм䣬Էֹȡͻ struct HashStruct { uint32_t dwZobristLock0; // ZobristУһ uint16_t wmv; // ŷ uint8_t ucAlphaDepth, ucBetaDepth; // (ϱ߽±߽) int16_t svlAlpha, svlBeta; // ֵ(ϱ߽±߽) uint32_t dwZobristLock1; // ZobristУڶ }; // hsh // ûϢ extern int nHashMask; // ûĴС extern HashStruct *hshItems; // ûָ룬ElephantEyeöû #ifdef HASH_QUIESC extern HashStruct *hshItemsQ; #endif inline void ClearHash(void) { // û memset(hshItems, 0, (nHashMask + 1) * sizeof(HashStruct)); #ifdef HASH_QUIESC memset(hshItemsQ, 0, (nHashMask + 1) * sizeof(HashStruct)); #endif } inline void NewHash(int nHashScale) { // ûС 2^nHashScale ֽ nHashMask = ((1 << nHashScale) / sizeof(HashStruct)) - 1; hshItems = new HashStruct[nHashMask + 1]; #ifdef HASH_QUIESC hshItemsQ = new HashStruct[nHashMask + 1]; #endif ClearHash(); } inline void DelHash(void) { // ͷû delete[] hshItems; #ifdef HASH_QUIESC delete[] hshItemsQ; #endif } // жûǷϾ(ZobristǷ) inline bool HASH_POS_EQUAL(const HashStruct &hsh, const PositionStruct &pos) { return hsh.dwZobristLock0 == pos.zobr.dwLock0 && hsh.dwZobristLock1 == pos.zobr.dwLock1; } // Ͳȡû(һãԶ丳ֵ) inline HashStruct &HASH_ITEM(const PositionStruct &pos, int nLayer) { return hshItems[(pos.zobr.dwKey + nLayer) & nHashMask]; } // ûĹ void RecordHash(const PositionStruct &pos, int nFlag, int vl, int nDepth, int mv); // 洢ûϢ int ProbeHash(const PositionStruct &pos, int vlAlpha, int vlBeta, int nDepth, bool bNoNull, int &mv); // ȡûϢ #ifdef HASH_QUIESC void RecordHashQ(const PositionStruct &pos, int vlBeta, int vlAlpha); // 洢ûϢ(̬) int ProbeHashQ(const PositionStruct &pos, int vlAlpha, int vlBeta); // ȡûϢ(̬) #endif // UCCI֧ - HashеľϢ bool PopHash(const PositionStruct &pos); #endif gmchess-0.29.6.3/src/engine/mips.h000066400000000000000000000044041323660377300165730ustar00rootroot00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * mips.h * Copyright (C) HjjHjj * * mips.h 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 3 of the License, or * (at your option) any later version. * * mips.h 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, see . */ #ifndef HJJHJJ_MIPS_H #define HJJHJJ_MIPS_H #include "base.h" /* inline uint64_t MAKE_LONG_LONG(uint32_t LowLong, uint32_t HighLong) { return (uint64_t) LowLong | ((uint64_t) HighLong << 32); } */ static __inline__ int Bsf(uint32_t Operand) { /* Use gcc __buildin function instead of asm */ if (Operand==0) return 0; return __builtin_ctzl(Operand); /* int eax; asm __volatile__ ( "bsfl %0, %0" "\n\t" : "=a" (eax) : "0" (Operand) ); return eax; */ } static __inline__ int Bsr(uint32_t Operand) { /* Use gcc __buildin function instead of asm */ if (Operand==0) return 0; return 31 - __builtin_clzl(Operand); /* int eax; asm __volatile__ ( "bsrl %0, %0" "\n\t" : "=a" (eax) : "0" (Operand) ); return eax; */ } //#ifdef linux //#include //#include //#include #include #include //#endif static __inline__ uint64_t TimeStampCounter(void) { int fd = -1; fd = open("/dev/urandom", O_RDONLY); if (fd == -1) { return 0x12345678; } uint64_t random; read(fd, &random, sizeof(random)); close(fd); return random; /* uint32_t eax, edx; asm __volatile__ ( "rdtsc" "\n\t" : "=a" (eax), "=d" (edx) : ); return MAKE_LONG_LONG(eax, edx); */ } #endif gmchess-0.29.6.3/src/engine/movesort.cpp000066400000000000000000000142221323660377300200330ustar00rootroot00000000000000/* movesort.h/movesort.cpp - Source Code for ElephantEye, Part VII ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.11, Last Modified: Dec. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "base.h" #if defined (__i386__) #include "x86asm.h" #elif defined (__mips__) #include "mips.h" #else #include "mips.h" //#error "what's your plantform?" #endif #include "position.h" #include "movesort.h" int nHistory[65536]; // ʷ // ʷŷбֵ void MoveSortStruct::SetHistory(void) { int i, j, vl, nShift, nNewShift; nShift = 0; for (i = nMoveIndex; i < nMoveNum; i ++) { // ŷķֵ65536ͱŷķֵʹǶ65536 vl = nHistory[mvs[i].wmv] >> nShift; if (vl > 65535) { nNewShift = Bsr(vl) - 15; for (j = nMoveIndex; j < i; j ++) { mvs[j].wvl >>= nNewShift; } vl >>= nNewShift; __ASSERT_BOUND(32768, vl, 65535); nShift += nNewShift; } mvs[i].wvl = vl; } } // 򷨣"1, 4, 13, 40 ..."УҪ"1, 2, 4, 8, ..." static const int cnShellStep[8] = {0, 1, 4, 13, 40, 121, 364, 1093}; void MoveSortStruct::ShellSort(void) { int i, j, nStep, nStepLevel; MoveStruct mvsBest; nStepLevel = 1; while (cnShellStep[nStepLevel] < nMoveNum - nMoveIndex) { nStepLevel ++; } nStepLevel --; while (nStepLevel > 0) { nStep = cnShellStep[nStepLevel]; for (i = nMoveIndex + nStep; i < nMoveNum; i ++) { mvsBest = mvs[i]; j = i - nStep; while (j >= nMoveIndex && mvsBest.wvl > mvs[j].wvl) { mvs[j + nStep] = mvs[j]; j -= nStep; } mvs[j + nStep] = mvsBest; } nStepLevel --; } } /* ɽ⽫ŷΨһӦŷ(жӦŷ򷵻) * * ⽫ŷ˳£ * 1. ûŷ(SORT_VALUE_MAX) * 2. ɱŷ(SORT_VALUE_MAX - 12) * 3. ŷʷ(1SORT_VALUE_MAX - 3) * 4. ܽ⽫ŷ(0)Щŷ˵ */ int MoveSortStruct::InitEvade(PositionStruct &pos, int mv, const uint16_t *lpwmvKiller) { int i, nLegal; nPhase = PHASE_REST; nMoveIndex = 0; nMoveNum = pos.GenAllMoves(mvs); SetHistory(); nLegal = 0; for (i = nMoveIndex; i < nMoveNum; i ++) { if (mvs[i].wmv == mv) { nLegal ++; mvs[i].wvl = SORT_VALUE_MAX; } else if (pos.MakeMove(mvs[i].wmv)) { pos.UndoMakeMove(); nLegal ++; if (mvs[i].wmv == lpwmvKiller[0]) { mvs[i].wvl = SORT_VALUE_MAX - 1; } else if (mvs[i].wmv == lpwmvKiller[1]) { mvs[i].wvl = SORT_VALUE_MAX - 2; } else { mvs[i].wvl = MIN(mvs[i].wvl + 1, SORT_VALUE_MAX - 3); } } else { mvs[i].wvl = 0; } } ShellSort(); nMoveNum = nMoveIndex + nLegal; return (nLegal == 1 ? mvs[0].wmv : 0); } // һŷ int MoveSortStruct::NextFull(const PositionStruct &pos) { switch (nPhase) { // "nPhase"ʾŷɽ׶ΣΪ // 0. ûŷɺһ׶Σ case PHASE_HASH: nPhase = PHASE_GEN_CAP; if (mvHash != 0) { __ASSERT(pos.LegalMove(mvHash)); return mvHash; } // ɣû"break"ʾ"switch"һ"case"ִһ"case"ͬ // 1. гŷɺһ׶Σ case PHASE_GEN_CAP: nPhase = PHASE_GOODCAP; nMoveIndex = 0; nMoveNum = pos.GenCapMoves(mvs); ShellSort(); // 2. MVV(LVA)ҪѭɴΣ case PHASE_GOODCAP: if (nMoveIndex < nMoveNum && mvs[nMoveIndex].wvl > 1) { // ע⣺MVV(LVA)ֵ1˵ӲֱܻƵģЩŷԺ nMoveIndex ++; __ASSERT_PIECE(pos.ucpcSquares[DST(mvs[nMoveIndex - 1].wmv)]); return mvs[nMoveIndex - 1].wmv; } // 3. ɱŷ(һɱŷ)ɺһ׶Σ case PHASE_KILLER1: nPhase = PHASE_KILLER2; if (mvKiller1 != 0 && pos.LegalMove(mvKiller1)) { // ע⣺ɱŷŷԣͬ return mvKiller1; } // 4. ɱŷ(ڶɱŷ)ɺһ׶Σ case PHASE_KILLER2: nPhase = PHASE_GEN_NONCAP; if (mvKiller2 != 0 && pos.LegalMove(mvKiller2)) { return mvKiller2; } // 5. вŷɺһ׶Σ case PHASE_GEN_NONCAP: nPhase = PHASE_REST; nMoveNum += pos.GenNonCapMoves(mvs + nMoveNum); SetHistory(); ShellSort(); // 6. ʣŷʷ(ؽ⽫ŷ) case PHASE_REST: if (nMoveIndex < nMoveNum) { nMoveIndex ++; return mvs[nMoveIndex - 1].wmv; } // 7. ûŷˣ㡣 default: return 0; } } // ɸŷ void MoveSortStruct::InitRoot(const PositionStruct &pos, int nBanMoves, const uint16_t *lpwmvBanList) { int i, j, nBanned; nMoveIndex = 0; nMoveNum = pos.GenAllMoves(mvs); nBanned = 0; for (i = 0; i < nMoveNum; i ++) { mvs[i].wvl = 1; for (j = 0; j < nBanMoves; j ++) { if (mvs[i].wmv == lpwmvBanList[j]) { mvs[i].wvl = 0; nBanned ++; break; } } } ShellSort(); nMoveNum -= nBanned; } // ¸ŷб void MoveSortStruct::UpdateRoot(int mv) { int i; for (i = 0; i < nMoveNum; i ++) { if (mvs[i].wmv == mv) { mvs[i].wvl = SORT_VALUE_MAX; } else if (mvs[i].wvl > 0) { mvs[i].wvl --; } } } gmchess-0.29.6.3/src/engine/movesort.h000066400000000000000000000107371323660377300175070ustar00rootroot00000000000000/* movesort.h/movesort.cpp - Source Code for ElephantEye, Part VII ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.11, Last Modified: Dec. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef MOVESORT_H #define MOVESORT_H #include #include "base.h" #include "position.h" const int LIMIT_DEPTH = 64; // 搜索的极限深度 const int SORT_VALUE_MAX = 65535; // 着法序列最大值 extern const int FIBONACCI_LIST[32]; // "nHistory"只在"movesort.cpp"一个模块中使用 extern int nHistory[65536]; // 历史表 // 着法顺序的若干阶段(参阅"NextFull()"函数) const int PHASE_HASH = 0; const int PHASE_GEN_CAP = 1; const int PHASE_GOODCAP = 2; const int PHASE_KILLER1 = 3; const int PHASE_KILLER2 = 4; const int PHASE_GEN_NONCAP = 5; const int PHASE_REST = 6; const bool NEXT_ALL = true; // 着法顺序函数"MoveSortStruct::NextQuiesc()"选项 const bool ROOT_UNIQUE = true; // 着法顺序函数"MoveSortStruct::ResetRoot()"选项 // 着法序列结构 struct MoveSortStruct { int nPhase, nMoveIndex, nMoveNum; int mvHash, mvKiller1, mvKiller2; MoveStruct mvs[MAX_GEN_MOVES]; void SetHistory(void); // 根据历史表对着法列表赋值 void ShellSort(void); // 着法排序过程 // 好的吃子着法(包括没有着法,都不更新历史表和杀手着法表) bool GoodCap(const PositionStruct &pos, int mv) { return mv == 0 || nPhase == PHASE_GOODCAP || (nPhase < PHASE_GOODCAP && pos.GoodCap(mv)); } // 静态搜索的着法顺序控制 void InitAll(const PositionStruct &pos) { nMoveIndex = 0; nMoveNum = pos.GenAllMoves(mvs); SetHistory(); ShellSort(); } void InitQuiesc(const PositionStruct &pos) { nMoveIndex = 0; nMoveNum = pos.GenCapMoves(mvs); ShellSort(); } void InitQuiesc2(const PositionStruct &pos) { nMoveNum += pos.GenNonCapMoves(mvs); SetHistory(); ShellSort(); } int NextQuiesc(bool bNextAll = false) { if (nMoveIndex < nMoveNum && (bNextAll || mvs[nMoveIndex].wvl > 0)) { nMoveIndex ++; return mvs[nMoveIndex - 1].wmv; } else { return 0; } } // 完全搜索的着法顺序控制 void InitFull(const PositionStruct &pos, int mv, const uint16_t *lpwmvKiller) { nPhase = PHASE_HASH; mvHash = mv; mvKiller1 = lpwmvKiller[0]; mvKiller2 = lpwmvKiller[1]; } int InitEvade(PositionStruct &pos, int mv, const uint16_t *lpwmvKiller); int NextFull(const PositionStruct &pos); // 根结点着法顺序控制 void InitRoot(const PositionStruct &pos, int nBanMoves, const uint16_t *lpwmvBanList); void ResetRoot(bool bUnique = false) { nMoveIndex = 0; ShellSort(); nMoveIndex = (bUnique ? 1 : 0); } int NextRoot(void) { if (nMoveIndex < nMoveNum) { nMoveIndex ++; return mvs[nMoveIndex - 1].wmv; } else { return 0; } } void UpdateRoot(int mv); }; // 清空历史表 inline void ClearHistory(void) { memset(nHistory, 0, sizeof(int[65536])); } // 清空杀手着法表 inline void ClearKiller(uint16_t (*lpwmvKiller)[2]) { memset(lpwmvKiller, 0, LIMIT_DEPTH * sizeof(uint16_t[2])); } // 复制杀手着法表 inline void CopyKiller(uint16_t (*lpwmvDst)[2], const uint16_t (*lpwmvSrc)[2]) { memcpy(lpwmvDst, lpwmvSrc, LIMIT_DEPTH * sizeof(uint16_t[2])); } /* 找到最佳着法时采取的措施 * * 历史表的深度相关增量有以下几种选择: * 1. 平方关系(n^2); * 2. 指数关系(2^n); * 3. Fibonacci数列; * 4. 以上几种情况的组合,例如:n^2 + 2^n,等等。 * ElephantEye使用最传统的平方关系。 */ inline void SetBestMove(int mv, int nDepth, uint16_t *lpwmvKiller) { nHistory[mv] += SQR(nDepth); if (lpwmvKiller[0] != mv) { lpwmvKiller[1] = lpwmvKiller[0]; lpwmvKiller[0] = mv; } } #endif gmchess-0.29.6.3/src/engine/parse.h000066400000000000000000000052411323660377300167350ustar00rootroot00000000000000#include #include #ifndef PARSE_H #define PARSE_H #ifdef _WIN32 #include #include inline char *strcasestr(const char *sz1, const char *sz2) { return StrStrI(sz1, sz2); } #endif #ifdef _MSC_VER inline int strncasecmp(const char *sz1, const char *sz2, size_t n) { return strnicmp(sz1, sz2, n); } #endif inline void StrCutCrLf(char *sz) { char *lpsz; lpsz = strchr(sz, '\r'); if (lpsz != NULL) { *lpsz = '\0'; } lpsz = strchr(sz, '\n'); if (lpsz != NULL) { *lpsz = '\0'; } } inline bool StrEqv(const char *sz1, const char *sz2) { return strncasecmp(sz1, sz2, strlen(sz2)) == 0; } inline bool StrEqvSkip(const char *&sz1, const char *sz2) { if (strncasecmp(sz1, sz2, strlen(sz2)) == 0) { sz1 += strlen(sz2); return true; } else { return false; } } inline bool StrEqvSkip(char *&sz1, const char *sz2) { if (strncasecmp(sz1, sz2, strlen(sz2)) == 0) { sz1 += strlen(sz2); return true; } else { return false; } } inline bool StrScan(const char *sz1, const char *sz2) { return strcasestr(sz1, sz2) != NULL; } inline bool StrScanSkip(const char *&sz1, const char *sz2) { const char *lpsz; lpsz = strcasestr(sz1, sz2); if (lpsz == NULL) { return false; } else { sz1 = lpsz + strlen(sz2); return true; } } inline bool StrScanSkip(char *&sz1, const char *sz2) { char *lpsz; lpsz = strcasestr(sz1, sz2); if (lpsz == NULL) { return false; } else { sz1 = lpsz + strlen(sz2); return true; } } inline bool StrSplitSkip(const char *&szSrc, int nSeperator, char *szDst = NULL) { const char *lpsz; lpsz = strchr(szSrc, nSeperator); if (lpsz == NULL) { if (szDst != NULL) { strcpy(szDst, szSrc); } szSrc += strlen(szSrc); return false; } else { if (szDst != NULL) { strncpy(szDst, szSrc, lpsz - szSrc); szDst[lpsz - szSrc] = '\0'; } szSrc = lpsz + 1; return true; } } inline bool StrSplitSkip(char *&szSrc, int nSeperator, char *szDst = NULL) { char *lpsz; lpsz = strchr(szSrc, nSeperator); if (lpsz == NULL) { if (szDst != NULL) { strcpy(szDst, szSrc); } szSrc += strlen(szSrc); return false; } else { if (szDst != NULL) { strncpy(szDst, szSrc, lpsz - szSrc); szDst[lpsz - szSrc] = '\0'; } szSrc = lpsz + 1; return true; } } inline int Str2Digit(const char *sz, int nMin, int nMax) { int nRet; if (sscanf(sz, "%d", &nRet) > 0) { return MIN(MAX(nRet, nMin), nMax); } else { return nMin; } } #endif gmchess-0.29.6.3/src/engine/pgnfile.cpp000066400000000000000000000303341323660377300176030ustar00rootroot00000000000000/* PGN->XQF - a Chinese Chess Score Conversion Program Designed by Morning Yellow, Version: 2.1, Last Modified: Jun. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "base.h" #include "parse.h" #include "position.h" #include "cchess.h" #include "pgnfile.h" static const char *const cszResult[4] = { "*", "1-0", "1/2-1/2", "0-1" }; void PgnFileStruct::Init(void) { int i; szEvent[0] = szRound[0] = szDate[0] = szSite[0] = '\0'; szRedTeam[0] = szRed[0] = szRedElo[0] = '\0'; szBlackTeam[0] = szBlack[0] = szBlackElo[0] = '\0'; szEcco[0] = szOpen[0] = szVar[0] = '\0'; nMaxMove = nResult = 0; posStart.ClearBoard(); posStart.SetIrrev(); for (i = 0; i < MAX_MOVE_LEN; i ++) { szCommentTable[i] = NULL; } } PgnFileStruct::~PgnFileStruct(void) { int i; for (i = 0; i < MAX_MOVE_LEN; i ++) { if (szCommentTable[i] != NULL) { delete[] szCommentTable[i]; } } } static bool GetLabel(char *szDestStr, const char *szLineStr, const char *szLabelName) { int nValueLen; const char *lpLabelEnd; char szTempLabel[MAX_STR_LEN]; strcpy(szTempLabel, "["); strcat(szTempLabel, szLabelName); strcat(szTempLabel, " \""); if (StrEqvSkip(szLineStr, szTempLabel)) { lpLabelEnd = strchr(szLineStr, '\"'); if (lpLabelEnd == NULL) { nValueLen = strlen(szLineStr) - 1; } else { nValueLen = lpLabelEnd - szLineStr; } if (nValueLen >= MAX_STR_LEN) { nValueLen = MAX_STR_LEN - 1; } strncpy(szDestStr, szLineStr, nValueLen); szDestStr[nValueLen] = '\0'; return true; } else { return false; } } static void AppendStr(char *&szDst, const char *szSrc) { int nDstLen; if (szDst == NULL) { szDst = new char[MAX_REM_LEN]; szDst[0] = '\0'; } nDstLen = strlen(szDst); strncpy(szDst + nDstLen, szSrc, MAX_REM_LEN - nDstLen - 1); szDst[MAX_REM_LEN - 1] = '\0'; } inline int ICCS_MOVE(const char *szIccsStr) { int sqSrc, sqDst; sqSrc = COORD_XY(szIccsStr[0] - 'A' + FILE_LEFT, '9' + RANK_TOP - szIccsStr[1]); sqDst = COORD_XY(szIccsStr[3] - 'A' + FILE_LEFT, '9' + RANK_TOP - szIccsStr[4]); return MOVE(sqSrc, sqDst); } static const char *const cszAdvertStr = "\r\n" "=============================\r\n" "= ӭʡٿȫ=\r\n" "= Ƽáʦ=\r\n" "=http://www.elephantbase.net=\r\n"; bool PgnFileStruct::Read(const char *szFileName, bool bNoAdvert) { FILE *fp; int nRemLevel, nRemLen; bool bReturned, bDetail, bEndFor; int nNotation, nCounter, nStatus, mv; const char *lpLineChar; char szLineStr[MAX_STR_LEN], szRem[MAX_REM_LEN]; PositionStruct pos; Reset(); fp = fopen(szFileName, "rb"); if (fp == NULL) { return false; } posStart.FromFen("rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1"); bReturned = true; bDetail = false; nRemLevel = 0; nRemLen = 0; nNotation = 0; nCounter = 1; pos = posStart; lpLineChar = NULL; while (!(feof(fp) && bReturned)) { if (bReturned) { fgets(szLineStr, 256, fp); lpLineChar = szLineStr; bReturned = false; } if (bDetail) { if (nRemLevel > 0) { bEndFor = true; while (*lpLineChar != '\0' && *lpLineChar != '\r' && *lpLineChar != '\n') { nRemLevel += (*lpLineChar == '(' || *lpLineChar == '{' ? 1 : *lpLineChar == ')' || *lpLineChar == '}' ? -1 : 0); if (nRemLevel == 0) { szRem[nRemLen] = '\0'; AppendStr(szCommentTable[nMaxMove], szRem); nRemLen = 0; bEndFor = false; lpLineChar ++; break; } else { if (nRemLen < MAX_STR_LEN) { szRem[nRemLen] = *lpLineChar; nRemLen ++; } } lpLineChar ++; } if (bEndFor) { szRem[nRemLen] = '\0'; AppendStr(szCommentTable[nMaxMove], szRem); nRemLen = 0; if (*lpLineChar == '\r' || *lpLineChar == '\n') { AppendStr(szCommentTable[nMaxMove], "\r\n"); } bReturned = true; } } else { bEndFor = true; while (*lpLineChar != '\0' && *lpLineChar != '\r' && *lpLineChar != '\n') { switch (*lpLineChar) { case '(': case '{': nRemLevel ++; bEndFor = false; break; case '0': if (strncmp(lpLineChar, "0-1", 3) == 0) { if (!bNoAdvert) { AppendStr(szCommentTable[nMaxMove], cszAdvertStr); } fclose(fp); return true; } break; case '1': if (strncmp(lpLineChar, "1-0", 3) == 0 || strncmp(lpLineChar, "1/2-1/2", 7) == 0) { if (!bNoAdvert) { AppendStr(szCommentTable[nMaxMove], cszAdvertStr); } fclose(fp); return true; } break; case '*': if (!bNoAdvert) { AppendStr(szCommentTable[nMaxMove], cszAdvertStr); } fclose(fp); return true; break; default: if (nNotation > 0) { if ((*lpLineChar >= 'A' && *lpLineChar <= 'Z') || (*lpLineChar >= 'a' && *lpLineChar <= 'z') || *lpLineChar == '+' || *lpLineChar == '-' || *lpLineChar == '=') { if (nNotation == 1) { mv = File2Move(*(long *) lpLineChar, pos); } else { mv = ICCS_MOVE(lpLineChar); } if (TryMove(pos, nStatus, mv)) { if (pos.nMoveNum == MAX_MOVE_NUM) { pos.SetIrrev(); } if (nCounter < MAX_COUNTER) { if (pos.sdPlayer == 0) { nCounter ++; } nMaxMove ++; wmvMoveTable[nMaxMove] = mv; if (nNotation == 1) { lpLineChar += 3; } else { lpLineChar += 5; } } } bEndFor = false; break; } } else { if (*lpLineChar < 0) { mv = File2Move(Chin2File(*(uint64_t *) lpLineChar), pos); if (TryMove(pos, nStatus, mv)) { if (pos.nMoveNum == MAX_MOVE_NUM) { pos.SetIrrev(); } if (nCounter < MAX_COUNTER) { if (pos.sdPlayer == 0) { nCounter ++; } nMaxMove ++; wmvMoveTable[nMaxMove] = mv; lpLineChar += 7; } } } } break; } lpLineChar ++; if (!bEndFor) { break; } } if (bEndFor) { bReturned = true; } } } else { if (szLineStr[0] == '\0') { bReturned = true; } else if (szLineStr[0] == '[') { if (false) { } else if (GetLabel(szEvent, szLineStr, "EVENT")) { } else if (GetLabel(szRound, szLineStr, "ROUND")) { } else if (GetLabel(szDate, szLineStr, "DATE")) { } else if (GetLabel(szSite, szLineStr, "SITE")) { } else if (GetLabel(szRedTeam, szLineStr, "REDTEAM")) { } else if (GetLabel(szRed, szLineStr, "RED")) { } else if (GetLabel(szRedElo, szLineStr, "REDELO")) { } else if (GetLabel(szBlackTeam, szLineStr, "BLACKTEAM")) { } else if (GetLabel(szBlack, szLineStr, "BLACK")) { } else if (GetLabel(szBlackElo, szLineStr, "BLACKELO")) { } else if (GetLabel(szRem, szLineStr, "RESULT")) { if (false) { } else if (strcmp(szRem, "*") == 0) { nResult = 0; } else if (strcmp(szRem, "1-0") == 0) { nResult = 1; } else if (strcmp(szRem, "1/2-1/2") == 0) { nResult = 2; } else if (strcmp(szRem, "0-1") == 0) { nResult = 3; } else { nResult = 0; } } else if (GetLabel(szEcco, szLineStr, "ECCO")) { } else if (GetLabel(szOpen, szLineStr, "OPENING")) { } else if (GetLabel(szVar, szLineStr, "VARIATION")) { } else if (GetLabel(szRem, szLineStr, "FORMAT")) { if (StrEqv(szRem, "WXF")) { nNotation = 1; } else if (StrEqv(szRem, "ICCS")) { nNotation = 2; } else { nNotation = 0; } } else if (GetLabel(szRem, szLineStr, "FEN")) { posStart.FromFen(szRem); lpLineChar = strchr(szRem, '-'); pos = posStart; nCounter = 1; } bReturned = true; } else { bDetail = true; } } } if (!bNoAdvert) { AppendStr(szCommentTable[nMaxMove], cszAdvertStr); } fclose(fp); return true; } inline void PrintLabel(FILE *fp, const char *szTag, const char *szValue) { if (szValue[0] != '\0') { fprintf(fp, "[%s \"%s\"]\r\n", szTag, szValue); } } bool PgnFileStruct::Write(const char *szFileName, bool bNoAdvert) const { int i, nCounter, nStatus; bool bReturned; uint64_t dqChinMove; char szFen[128]; FILE *fp; PositionStruct pos; fp = fopen(szFileName, "wb"); if (fp == NULL) { return false; } PrintLabel(fp, "Game", "Chinese Chess"); PrintLabel(fp, "Event", szEvent); PrintLabel(fp, "Round", szRound); PrintLabel(fp, "Date", szDate); PrintLabel(fp, "Site", szSite); PrintLabel(fp, "RedTeam", szRedTeam); PrintLabel(fp, "Red", szRed); PrintLabel(fp, "RedElo", szRedElo); PrintLabel(fp, "BlackTeam", szBlackTeam); PrintLabel(fp, "Black", szBlack); PrintLabel(fp, "BlackElo", szBlackElo); PrintLabel(fp, "Result", cszResult[nResult]); PrintLabel(fp, "ECCO", szEcco); PrintLabel(fp, "Opening", szOpen); PrintLabel(fp, "Variation", szVar); posStart.ToFen(szFen); if (strcmp(szFen, "rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w") != 0) { fprintf(fp, "[FEN \"%s - - 0 1\"]\r\n", szFen); } if (szCommentTable[0] != NULL) { fprintf(fp, "{%s}\r\n", szCommentTable[0]); } pos = posStart; bReturned = true; nCounter = 1; for (i = 1; i <= nMaxMove; i ++) { if (bReturned) { fprintf(fp, "%3d. ", nCounter); if (pos.sdPlayer == 1) { fprintf(fp, " "); } } dqChinMove = File2Chin(Move2File(wmvMoveTable[i], pos), pos.sdPlayer); if (pos.sdPlayer == 0) { fprintf(fp, "%.8s", (const char *) &dqChinMove); bReturned = false; } else { fprintf(fp, " %.8s\r\n", (const char *) &dqChinMove); bReturned = true; } if (szCommentTable[i] != NULL) { if (!bReturned) { fprintf(fp, "\r\n"); } fprintf(fp, "{%s}\r\n", szCommentTable[i]); bReturned = true; } TryMove(pos, nStatus, wmvMoveTable[i]); if (pos.nMoveNum == MAX_MOVE_NUM) { pos.SetIrrev(); } if (pos.sdPlayer == 0) { nCounter ++; if (nCounter == MAX_COUNTER) { break; } } } fprintf(fp, " %s%s", cszResult[nResult], bNoAdvert ? "" : cszAdvertStr); fclose(fp); return true; } gmchess-0.29.6.3/src/engine/pgnfile.h000066400000000000000000000035711323660377300172530ustar00rootroot00000000000000/* PGN->XQF - a Chinese Chess Score Conversion Program Designed by Morning Yellow, Version: 2.1, Last Modified: Jun. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "cchess.h" #ifndef PGNFILE_H #define PGNFILE_H const int MAX_STR_LEN = 256; const int MAX_MOVE_LEN = 1999; const int MAX_COUNTER = 1000; const int MAX_REM_LEN = 4096; const bool NO_ADVERT = true; struct PgnFileStruct { char szEvent[MAX_STR_LEN], szRound[MAX_STR_LEN], szDate[MAX_STR_LEN], szSite[MAX_STR_LEN]; char szRedTeam[MAX_STR_LEN], szRed[MAX_STR_LEN], szRedElo[MAX_STR_LEN]; char szBlackTeam[MAX_STR_LEN], szBlack[MAX_STR_LEN], szBlackElo[MAX_STR_LEN]; char szEcco[MAX_STR_LEN], szOpen[MAX_STR_LEN], szVar[MAX_STR_LEN]; int nMaxMove, nResult; PositionStruct posStart; unsigned short wmvMoveTable[MAX_MOVE_LEN]; char *szCommentTable[MAX_MOVE_LEN]; void Init(void); PgnFileStruct(void) { Init(); }; ~PgnFileStruct(void); void Reset(void) { this->~PgnFileStruct(); Init(); } bool Read(const char *szFileName, bool bNoAdvert = false); bool Write(const char *szFileName, bool bNoAdvert = false) const; }; // pgn #endif gmchess-0.29.6.3/src/engine/pipe.cpp000066400000000000000000000156701323660377300171220ustar00rootroot00000000000000#include #ifdef _WIN32 #include #else #include #endif #include "base2.h" #include "pipe.h" inline void ParsePath(char *szDir, char *szFile, const char *szPath) { char *lpSeperator; strcpy(szDir, szPath); lpSeperator = strrchr(szDir, PATH_SEPERATOR); if (lpSeperator == NULL) { szDir[0] = '\0'; strcpy(szFile, szPath); } else { *lpSeperator = '\0'; strcpy(szFile, lpSeperator + 1); } } #ifdef _WIN32 #ifdef PIPE_DLL extern "C" __declspec(dllexport) VOID WINAPI PipeOpen(PipeStruct *lppipe, LPCSTR szProcFile); extern "C" __declspec(dllexport) VOID WINAPI PipeClose(PipeStruct *lppipe); extern "C" __declspec(dllexport) LPSTR WINAPI PipeLineInput(PipeStruct *lppipe); extern "C" __declspec(dllexport) VOID WINAPI PipeLineOutput(PipeStruct *lppipe, LPCSTR szLineStr); VOID WINAPI PipeOpen(PipeStruct *lppipe, LPCSTR szProcFile) { lppipe->Open(szProcFile); } VOID WINAPI PipeClose(PipeStruct *lppipe) { lppipe->Close(); } LPSTR WINAPI PipeLineInput(PipeStruct *lppipe) { static char szBuffer[LINE_INPUT_MAX_CHAR]; if (lppipe->LineInput(szBuffer)) { return szBuffer; } else { return NULL; } } VOID WINAPI PipeLineOutput(PipeStruct *lppipe, LPCSTR szLineStr) { lppipe->LineOutput(szLineStr); } #endif void PipeStruct::Open(const char *szProcFile) { DWORD dwMode; HANDLE hStdinRead, hStdinWrite, hStdoutRead, hStdoutWrite; SECURITY_ATTRIBUTES sa; STARTUPINFO si; PROCESS_INFORMATION pi; char szFileDir[PATH_MAX_CHAR], szFileName[PATH_MAX_CHAR], szCurDir[PATH_MAX_CHAR]; if (szProcFile == NULL) { hInput = GetStdHandle(STD_INPUT_HANDLE); hOutput = GetStdHandle(STD_OUTPUT_HANDLE); bConsole = GetConsoleMode(hInput, &dwMode); } else { GetCurrentDirectory(PATH_MAX_CHAR, szCurDir); ParsePath(szFileDir, szFileName, szProcFile); SetCurrentDirectory(szFileDir); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; CreatePipe(&hStdinRead, &hStdinWrite, &sa, 0); CreatePipe(&hStdoutRead, &hStdoutWrite, &sa, 0); si.cb = sizeof(STARTUPINFO); si.lpReserved = si.lpDesktop = si.lpTitle = NULL; si.dwFlags = STARTF_USESTDHANDLES; si.cbReserved2 = 0; si.lpReserved2 = NULL; si.hStdInput = hStdinRead; si.hStdOutput = hStdoutWrite; si.hStdError = hStdoutWrite; CreateProcess(NULL, (LPSTR) szFileName, NULL, NULL, TRUE, DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP | IDLE_PRIORITY_CLASS, NULL, NULL, &si, &pi); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); CloseHandle(hStdinRead); CloseHandle(hStdoutWrite); hInput = hStdoutRead; hOutput = hStdinWrite; bConsole = FALSE; SetCurrentDirectory(szCurDir); } if (bConsole) { SetConsoleMode(hInput, dwMode & ~(ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT)); FlushConsoleInputBuffer(hInput); } nBytesLeft = 0; nReadEnd = 0; } void PipeStruct::Close(void) const { CloseHandle(hInput); CloseHandle(hOutput); } void PipeStruct::ReadInput(void) { DWORD dwBytes; ReadFile(hInput, szBuffer + nReadEnd, LINE_INPUT_MAX_CHAR - nReadEnd, &dwBytes, NULL); nReadEnd += dwBytes; if (nBytesLeft > 0) { nBytesLeft -= dwBytes; } } bool PipeStruct::CheckInput(void) { DWORD dwEvents, dwBytes; if (bConsole) { // a tty, or an un-redirected handle GetNumberOfConsoleInputEvents(hInput, &dwEvents); return dwEvents > 1; } else if (nBytesLeft > 0) { // a pipe with remainder data return true; } else if (PeekNamedPipe(hInput, NULL, 0, NULL, &dwBytes, NULL)) { // a pipe without remainder data nBytesLeft = dwBytes; return nBytesLeft > 0; } else { // a file, always true return true; } } void PipeStruct::LineOutput(const char *szLineStr) const { DWORD dwBytes; int nStrLen; char szWriteBuffer[LINE_INPUT_MAX_CHAR]; nStrLen = strlen(szLineStr); memcpy(szWriteBuffer, szLineStr, nStrLen); szWriteBuffer[nStrLen] = '\r'; szWriteBuffer[nStrLen + 1] = '\n'; WriteFile(hOutput, szWriteBuffer, nStrLen + 2, &dwBytes, NULL); } #else #include #include #include #include #include void PipeStruct::Open(const char *szProcFile) { int nStdinPipe[2], nStdoutPipe[2]; char szFileDir[PATH_MAX_CHAR], szFileName[PATH_MAX_CHAR]; if (szProcFile == NULL) { nInput = STDIN_FILENO; nOutput = STDOUT_FILENO; } else { pipe(nStdinPipe); pipe(nStdoutPipe); if (fork() == 0) { close(nStdinPipe[1]); close(nStdoutPipe[0]); dup2(nStdinPipe[0], STDIN_FILENO); close(nStdinPipe[0]); dup2(nStdoutPipe[1], STDOUT_FILENO); dup2(nStdoutPipe[1], STDERR_FILENO); close(nStdoutPipe[1]); ParsePath(szFileDir, szFileName, szProcFile); chdir(szFileDir); nice(20); execl(szFileName, szFileName, NULL); exit(EXIT_FAILURE); } close(nStdinPipe[0]); close(nStdoutPipe[1]); nInput = nStdoutPipe[0]; nOutput = nStdinPipe[1]; } nReadEnd = 0; } void PipeStruct::Close(void) const { close(nInput); close(nOutput); } void PipeStruct::ReadInput(void) { nReadEnd += read(nInput, szBuffer + nReadEnd, LINE_INPUT_MAX_CHAR - nReadEnd); } bool PipeStruct::CheckInput(void) { fd_set set; timeval tv; int val; FD_ZERO(&set); FD_SET(nInput, &set); tv.tv_sec = 0; tv.tv_usec = 0; val = select(nInput + 1, &set, NULL, NULL, &tv); return (val > 0 && FD_ISSET(nInput, &set) > 0); } void PipeStruct::LineOutput(const char *szLineStr) const { int nStrLen; char szWriteBuffer[LINE_INPUT_MAX_CHAR]; nStrLen = strlen(szLineStr); memcpy(szWriteBuffer, szLineStr, nStrLen); szWriteBuffer[nStrLen] = '\n'; write(nOutput, szWriteBuffer, nStrLen + 1); } #endif bool PipeStruct::GetBuffer(char *szLineStr) { char *lpFeedEnd; int nFeedEnd; lpFeedEnd = (char *) memchr(szBuffer, '\n', nReadEnd); if (lpFeedEnd == NULL) { return false; } else { nFeedEnd = lpFeedEnd - szBuffer; memcpy(szLineStr, szBuffer, nFeedEnd); szLineStr[nFeedEnd] = '\0'; nFeedEnd ++; nReadEnd -= nFeedEnd; memcpy(szBuffer, szBuffer + nFeedEnd, nReadEnd); lpFeedEnd = (char *) strchr(szLineStr, '\r'); if (lpFeedEnd != NULL) { *lpFeedEnd = '\0'; } return true; } } bool PipeStruct::LineInput(char *szLineStr) { if (GetBuffer(szLineStr)) { return true; } else if (CheckInput()) { ReadInput(); if (GetBuffer(szLineStr)) { return true; } else if (nReadEnd == LINE_INPUT_MAX_CHAR) { memcpy(szLineStr, szBuffer, LINE_INPUT_MAX_CHAR - 1); szLineStr[LINE_INPUT_MAX_CHAR - 1] = '\0'; szBuffer[0] = szBuffer[LINE_INPUT_MAX_CHAR - 1]; nReadEnd = 1; return true; } else { return false; } } else { return false; } } gmchess-0.29.6.3/src/engine/pipe.h000066400000000000000000000011361323660377300165570ustar00rootroot00000000000000#ifdef _WIN32 #include #endif #include "base.h" #ifndef PIPE_H #define PIPE_H const int LINE_INPUT_MAX_CHAR = 4096; struct PipeStruct { #ifdef _WIN32 HANDLE hInput, hOutput; BOOL bConsole; int nBytesLeft; #else int nInput, nOutput; #endif int nReadEnd; char szBuffer[LINE_INPUT_MAX_CHAR]; void Open(const char *szExecFile = NULL); void Close(void) const; void ReadInput(void); bool CheckInput(void); bool GetBuffer(char *szLineStr); bool LineInput(char *szLineStr); void LineOutput(const char *szLineStr) const; }; // pipe #endif gmchess-0.29.6.3/src/engine/position.cpp000066400000000000000000000705171323660377300200320ustar00rootroot00000000000000/* position.h/position.cpp - Source Code for ElephantEye, Part III ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.0, Last Modified: Nov. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "base.h" #if defined (__i386__) #include "x86asm.h" #elif defined (__mips__) #include "mips.h" #else #include "mips.h" //#error "what's your plantform?" #endif #include "pregen.h" #include "position.h" /* ElephantEye源程序使用的匈牙利记号约定: * * sq: 格子序号(整数,从0到255,参阅"pregen.cpp") * pc: 棋子序号(整数,从0到47,参阅"position.cpp") * pt: 棋子类型序号(整数,从0到6,参阅"position.cpp") * mv: 着法(整数,从0到65535,参阅"position.cpp") * sd: 走子方(整数,0代表红方,1代表黑方) * vl: 局面价值(整数,从"-MATE_VALUE"到"MATE_VALUE",参阅"position.cpp") * (注:以上五个记号可与uc、dw等代表整数的记号配合使用) * pos: 局面(PositionStruct类型,参阅"position.h") * sms: 位行和位列的着法生成预置结构(参阅"pregen.h") * smv: 位行和位列的着法判断预置结构(参阅"pregen.h") */ // 本模块涉及多个"PositionStruct"的成员,用"this->"标记出来以方便辨认 // 起始局面的FEN串 const char *const cszStartFen = "rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w"; // 棋子类型对应的棋子符号 const char *const cszPieceBytes = "KABNRCP"; /* 棋子序号对应的棋子类型 * * ElephantEye的棋子序号从0到47,其中0到15不用,16到31表示红子,32到47表示黑子。 * 每方的棋子顺序依次是:帅仕仕相相马马车车炮炮兵兵兵兵兵(将士士象象马马车车炮炮卒卒卒卒卒) * 提示:判断棋子是红子用"pc < 32",黑子用"pc >= 32" */ const int cnPieceTypes[48] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6 }; // 棋子的简单分值,只在简单比较时作参考 const int cnSimpleValues[48] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 1, 1, 3, 3, 4, 4, 3, 3, 2, 2, 2, 2, 2, 5, 1, 1, 1, 1, 3, 3, 4, 4, 3, 3, 2, 2, 2, 2, 2, }; // 该数组很方便地实现了坐标的镜像(左右对称) const uint8_t cucsqMirrorTab[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0, 0, 0, 0, 0, 0, 0, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0, 0, 0, 0, 0, 0, 0, 0x5b, 0x5a, 0x59, 0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0, 0, 0, 0, 0, 0, 0, 0x6b, 0x6a, 0x69, 0x68, 0x67, 0x66, 0x65, 0x64, 0x63, 0, 0, 0, 0, 0, 0, 0, 0x7b, 0x7a, 0x79, 0x78, 0x77, 0x76, 0x75, 0x74, 0x73, 0, 0, 0, 0, 0, 0, 0, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85, 0x84, 0x83, 0, 0, 0, 0, 0, 0, 0, 0x9b, 0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0, 0, 0, 0, 0, 0, 0, 0xab, 0xaa, 0xa9, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0, 0, 0, 0, 0, 0, 0, 0xbb, 0xba, 0xb9, 0xb8, 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0, 0, 0, 0, 0, 0, 0, 0xcb, 0xca, 0xc9, 0xc8, 0xc7, 0xc6, 0xc5, 0xc4, 0xc3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; // FEN串中棋子标识,注意这个函数只能识别大写字母,因此用小写字母时,首先必须转换为大写 int FenPiece(int nArg) { switch (nArg) { case 'K': return 0; case 'A': return 1; case 'B': case 'E': return 2; case 'N': case 'H': return 3; case 'R': return 4; case 'C': return 5; case 'P': return 6; default: return 7; } } // 以下是一些棋盘处理过程 // 棋盘上增加棋子 void PositionStruct::AddPiece(int sq, int pc, bool bDel) { int pt; __ASSERT_SQUARE(sq); __ASSERT_PIECE(pc); if (bDel) { this->ucpcSquares[sq] = 0; this->ucsqPieces[pc] = 0; } else { this->ucpcSquares[sq] = pc; this->ucsqPieces[pc] = sq; } this->wBitRanks[RANK_Y(sq)] ^= PreGen.wBitRankMask[sq]; this->wBitFiles[FILE_X(sq)] ^= PreGen.wBitFileMask[sq]; __ASSERT_BITRANK(this->wBitRanks[RANK_Y(sq)]); __ASSERT_BITFILE(this->wBitRanks[FILE_X(sq)]); this->dwBitPiece ^= BIT_PIECE(pc); pt = PIECE_TYPE(pc); if (pc < 32) { if (bDel) { this->vlWhite -= PreEval.ucvlWhitePieces[pt][sq]; } else { this->vlWhite += PreEval.ucvlWhitePieces[pt][sq]; } } else { if (bDel) { this->vlBlack -= PreEval.ucvlBlackPieces[pt][sq]; } else { this->vlBlack += PreEval.ucvlBlackPieces[pt][sq]; } pt += 7; } __ASSERT_BOUND(0, pt, 13); this->zobr.Xor(PreGen.zobrTable[pt][sq]); } // 移动棋子 int PositionStruct::MovePiece(int mv) { int sqSrc, sqDst, pcMoved, pcCaptured, pt; uint8_t *lpucvl; // 移动棋子包括以下几个步骤: // 1. 得到移动的棋子序号和被吃的棋子序号; sqSrc = SRC(mv); sqDst = DST(mv); pcMoved = this->ucpcSquares[sqSrc]; __ASSERT_SQUARE(sqSrc); __ASSERT_SQUARE(sqDst); __ASSERT_PIECE(pcMoved); pcCaptured = this->ucpcSquares[sqDst]; if (pcCaptured == 0) { // 2. 如果没有被吃的棋子,那么更新目标格的位行和位列。 // 换句话说,有被吃的棋子,目标格的位行和位列就不必更新了。 this->wBitRanks[RANK_Y(sqDst)] ^= PreGen.wBitRankMask[sqDst]; this->wBitFiles[FILE_X(sqDst)] ^= PreGen.wBitFileMask[sqDst]; __ASSERT_BITRANK(this->wBitRanks[RANK_Y(sqDst)]); __ASSERT_BITFILE(this->wBitRanks[FILE_X(sqDst)]); } else { __ASSERT_PIECE(pcCaptured); // 3. 如果有被吃的棋子,那么更新棋子位,从"ucsqPieces"数组中清除被吃棋子 // 同时更新子力价值、位行位列、Zobrist键值和校验锁 this->ucsqPieces[pcCaptured] = 0; this->dwBitPiece ^= BIT_PIECE(pcCaptured); pt = PIECE_TYPE(pcCaptured); if (pcCaptured < 32) { this->vlWhite -= PreEval.ucvlWhitePieces[pt][sqDst]; } else { this->vlBlack -= PreEval.ucvlBlackPieces[pt][sqDst]; pt += 7; } __ASSERT_BOUND(0, pt, 13); this->zobr.Xor(PreGen.zobrTable[pt][sqDst]); } // 4. 从"ucpcSquares"和"ucsqPieces"数组中移动棋子,注意“格子-棋子联系数组”移动棋子的方法 // 同时更新位行、位列、子力价值、位行位列、Zobrist键值和校验锁 this->ucpcSquares[sqSrc] = 0; this->ucpcSquares[sqDst] = pcMoved; this->ucsqPieces[pcMoved] = sqDst; this->wBitRanks[RANK_Y(sqSrc)] ^= PreGen.wBitRankMask[sqSrc]; this->wBitFiles[FILE_X(sqSrc)] ^= PreGen.wBitFileMask[sqSrc]; __ASSERT_BITRANK(this->wBitRanks[RANK_Y(sqSrc)]); __ASSERT_BITFILE(this->wBitRanks[FILE_X(sqSrc)]); pt = PIECE_TYPE(pcMoved); if (pcMoved < 32) { lpucvl = PreEval.ucvlWhitePieces[pt]; this->vlWhite += lpucvl[sqDst] - lpucvl[sqSrc]; } else { lpucvl = PreEval.ucvlBlackPieces[pt]; this->vlBlack += lpucvl[sqDst] - lpucvl[sqSrc]; pt += 7; } __ASSERT_BOUND(0, pt, 13); this->zobr.Xor(PreGen.zobrTable[pt][sqDst], PreGen.zobrTable[pt][sqSrc]); return pcCaptured; } // 撤消移动棋子 void PositionStruct::UndoMovePiece(int mv, int pcCaptured) { int sqSrc, sqDst, pcMoved; sqSrc = SRC(mv); sqDst = DST(mv); pcMoved = this->ucpcSquares[sqDst]; __ASSERT_SQUARE(sqSrc); __ASSERT_SQUARE(sqDst); __ASSERT_PIECE(pcMoved); this->ucpcSquares[sqSrc] = pcMoved; this->ucsqPieces[pcMoved] = sqSrc; this->wBitRanks[RANK_Y(sqSrc)] ^= PreGen.wBitRankMask[sqSrc]; this->wBitFiles[FILE_X(sqSrc)] ^= PreGen.wBitFileMask[sqSrc]; __ASSERT_BITRANK(this->wBitRanks[RANK_Y(sqSrc)]); __ASSERT_BITFILE(this->wBitRanks[FILE_X(sqSrc)]); if (pcCaptured > 0) { __ASSERT_PIECE(pcCaptured); this->ucpcSquares[sqDst] = pcCaptured; this->ucsqPieces[pcCaptured] = sqDst; this->dwBitPiece ^= BIT_PIECE(pcCaptured); } else { this->ucpcSquares[sqDst] = 0; this->wBitRanks[RANK_Y(sqDst)] ^= PreGen.wBitRankMask[sqDst]; this->wBitFiles[FILE_X(sqDst)] ^= PreGen.wBitFileMask[sqDst]; __ASSERT_BITRANK(this->wBitRanks[RANK_Y(sqDst)]); __ASSERT_BITFILE(this->wBitRanks[FILE_X(sqDst)]); } } #include // 升变 int PositionStruct::Promote(int sq) { int pcCaptured, pcPromoted, pt; // 升变包括以下几个步骤: // 1. 得到升变前棋子的序号; __ASSERT_SQUARE(sq); __ASSERT(CanPromote()); __ASSERT(CAN_PROMOTE(sq)); pcCaptured = this->ucpcSquares[sq]; __ASSERT_PIECE(pcCaptured); pcPromoted = SIDE_TAG(this->sdPlayer) + Bsf(~this->wBitPiece[this->sdPlayer] & PAWN_BITPIECE); __ASSERT_PIECE(pcPromoted); __ASSERT(this->ucsqPieces[pcPromoted] == 0); // 2. 去掉升变前棋子,同时更新子力价值、Zobrist键值和校验锁 this->dwBitPiece ^= BIT_PIECE(pcPromoted) ^ BIT_PIECE(pcCaptured); this->ucsqPieces[pcCaptured] = 0; pt = PIECE_TYPE(pcCaptured); if (pcCaptured < 32) { this->vlWhite -= PreEval.ucvlWhitePieces[pt][sq]; } else { this->vlBlack -= PreEval.ucvlBlackPieces[pt][sq]; pt += 7; } __ASSERT_BOUND(0, pt, 13); this->zobr.Xor(PreGen.zobrTable[pt][sq]); // 3. 加上升变后棋子,同时更新子力价值、Zobrist键值和校验锁 this->ucpcSquares[sq] = pcPromoted; this->ucsqPieces[pcPromoted] = sq; pt = PIECE_TYPE(pcPromoted); if (pcPromoted < 32) { this->vlWhite += PreEval.ucvlWhitePieces[pt][sq]; } else { this->vlBlack += PreEval.ucvlBlackPieces[pt][sq]; pt += 7; } __ASSERT_BOUND(0, pt, 13); this->zobr.Xor(PreGen.zobrTable[pt][sq]); return pcCaptured; } // 撤消升变 void PositionStruct::UndoPromote(int sq, int pcCaptured) { int pcPromoted; __ASSERT_SQUARE(sq); __ASSERT_PIECE(pcCaptured); pcPromoted = this->ucpcSquares[sq]; __ASSERT(PIECE_TYPE(pcPromoted) == 6); this->ucsqPieces[pcPromoted] = 0; this->ucpcSquares[sq] = pcCaptured; this->ucsqPieces[pcCaptured] = sq; this->dwBitPiece ^= BIT_PIECE(pcPromoted) ^ BIT_PIECE(pcCaptured); } // 以上是一些棋盘处理过程 // 以下是一些着法处理过程 // 执行一个着法 bool PositionStruct::MakeMove(int mv) { int sq, pcCaptured; uint32_t dwOldZobristKey; RollbackStruct *lprbs; // 如果达到最大着法数,那么判定为非法着法 if (this->nMoveNum == MAX_MOVE_NUM) { return false; } __ASSERT(this->nMoveNum < MAX_MOVE_NUM); // 执行一个着法要包括以下几个步骤: // 1. 保存原来的Zobrist键值 dwOldZobristKey = this->zobr.dwKey; SaveStatus(); // 2. 移动棋子,记住吃掉的子(如果有的话) sq = SRC(mv); if (sq == DST(mv)) { pcCaptured = Promote(sq); } else { pcCaptured = MovePiece(mv); // 3. 如果移动后被将军了,那么着法是非法的,撤消该着法 if (CheckedBy(CHECK_LAZY) > 0) { UndoMovePiece(mv, pcCaptured); Rollback(); return false; } } // 4. 交换走子方 ChangeSide(); // 5. 把原来的Zobrist键值记录到检测重复的迷你置换表中 if (this->ucRepHash[dwOldZobristKey & REP_HASH_MASK] == 0) { this->ucRepHash[dwOldZobristKey & REP_HASH_MASK] = this->nMoveNum; } // 6. 把着法保存到历史着法列表中,并记住吃掉的子和将军状态 lprbs = this->rbsList + this->nMoveNum; lprbs->mvs.wmv = mv; lprbs->mvs.ChkChs = CheckedBy(); // 7. 设置和棋着法数(将军和应将不计入) if (pcCaptured == 0) { if (lprbs->mvs.ChkChs == 0) { lprbs->mvs.ChkChs = -ChasedBy(mv); } if (LastMove().CptDrw == -100) { lprbs->mvs.CptDrw = -100; } else { lprbs->mvs.CptDrw = MIN((int) LastMove().CptDrw, 0) - (lprbs->mvs.ChkChs > 0 || LastMove().ChkChs > 0 ? 0 : 1); } __ASSERT_BOUND(-100, lprbs->mvs.CptDrw, 0); } else { lprbs->mvs.CptDrw = pcCaptured; __ASSERT_PIECE(pcCaptured); } this->nMoveNum ++; this->nDistance ++; return true; } // 撤消一个着法 void PositionStruct::UndoMakeMove(void) { int sq; RollbackStruct *lprbs; this->nMoveNum --; this->nDistance --; lprbs = this->rbsList + this->nMoveNum; sq = SRC(lprbs->mvs.wmv); if (sq == DST(lprbs->mvs.wmv)) { __ASSERT_BOUND(ADVISOR_TYPE, PIECE_TYPE(lprbs->mvs.CptDrw), BISHOP_TYPE); UndoPromote(sq, lprbs->mvs.CptDrw); } else { UndoMovePiece(lprbs->mvs.wmv, lprbs->mvs.CptDrw); } this->sdPlayer = OPP_SIDE(this->sdPlayer); Rollback(); if (this->ucRepHash[this->zobr.dwKey & REP_HASH_MASK] == this->nMoveNum) { this->ucRepHash[this->zobr.dwKey & REP_HASH_MASK] = 0; } __ASSERT(this->nMoveNum > 0); } // 执行一个空着 void PositionStruct::NullMove(void) { __ASSERT(this->nMoveNum < MAX_MOVE_NUM); if (this->ucRepHash[this->zobr.dwKey & REP_HASH_MASK] == 0) { this->ucRepHash[this->zobr.dwKey & REP_HASH_MASK] = this->nMoveNum; } SaveStatus(); ChangeSide(); this->rbsList[nMoveNum].mvs.dwmv = 0; // wmv, Chk, CptDrw, ChkChs = 0 this->nMoveNum ++; this->nDistance ++; } // 撤消一个空着 void PositionStruct::UndoNullMove(void) { this->nMoveNum --; this->nDistance --; this->sdPlayer = OPP_SIDE(this->sdPlayer); Rollback(); if (this->ucRepHash[this->zobr.dwKey & REP_HASH_MASK] == this->nMoveNum) { this->ucRepHash[this->zobr.dwKey & REP_HASH_MASK] = 0; } __ASSERT(this->nMoveNum > 0); } // 以上是一些着法处理过程 // 以下是一些局面处理过程 // FEN串识别 void PositionStruct::FromFen(const char *szFen) { int i, j, k; int pcWhite[7]; int pcBlack[7]; const char *lpFen; // FEN串的识别包括以下几个步骤: // 1. 初始化,清空棋盘 pcWhite[0] = SIDE_TAG(0) + KING_FROM; pcWhite[1] = SIDE_TAG(0) + ADVISOR_FROM; pcWhite[2] = SIDE_TAG(0) + BISHOP_FROM; pcWhite[3] = SIDE_TAG(0) + KNIGHT_FROM; pcWhite[4] = SIDE_TAG(0) + ROOK_FROM; pcWhite[5] = SIDE_TAG(0) + CANNON_FROM; pcWhite[6] = SIDE_TAG(0) + PAWN_FROM; for (i = 0; i < 7; i ++) { pcBlack[i] = pcWhite[i] + 16; } /* 数组"pcWhite[7]"和"pcBlack[7]"分别代表红方和黑方每个兵种即将占有的序号, * 以"pcWhite[7]"为例,由于棋子16到31依次代表“帅仕仕相相马马车车炮炮兵兵兵兵兵”, * 所以最初应该是"pcWhite[7] = {16, 17, 19, 21, 23, 25, 27}",每添加一个棋子,该项就增加1, * 这种做法允许添加多余的棋子(例如添加第二个帅,就变成仕了),但添加前要做边界检测 */ ClearBoard(); lpFen = szFen; if (*lpFen == '\0') { SetIrrev(); return; } // 2. 读取棋盘上的棋子 i = RANK_TOP; j = FILE_LEFT; while (*lpFen != ' ') { if (*lpFen == '/') { j = FILE_LEFT; i ++; if (i > RANK_BOTTOM) { break; } } else if (*lpFen >= '1' && *lpFen <= '9') { /* https://github.com/xqbase/eleeye/commit/ * f460861b1bff7a353d36f09f3610d4dd042d003e */ j += (*lpFen - '0'); } else if (*lpFen >= 'A' && *lpFen <= 'Z') { if (j <= FILE_RIGHT) { k = FenPiece(*lpFen); if (k < 7) { if (pcWhite[k] < 32) { if (this->ucsqPieces[pcWhite[k]] == 0) { AddPiece(COORD_XY(j, i), pcWhite[k]); pcWhite[k] ++; } } } j ++; } } else if (*lpFen >= 'a' && *lpFen <= 'z') { if (j <= FILE_RIGHT) { k = FenPiece(*lpFen + 'A' - 'a'); if (k < 7) { if (pcBlack[k] < 48) { if (this->ucsqPieces[pcBlack[k]] == 0) { AddPiece(COORD_XY(j, i), pcBlack[k]); pcBlack[k] ++; } } } j ++; } } lpFen ++; if (*lpFen == '\0') { SetIrrev(); return; } } lpFen ++; // 3. 确定轮到哪方走 if (this->sdPlayer == (*lpFen == 'b' ? 0 : 1)) { ChangeSide(); } // 4. 把局面设成“不可逆” SetIrrev(); } // 生成FEN串 void PositionStruct::ToFen(char *szFen) const { int i, j, k, pc; char *lpFen; lpFen = szFen; for (i = RANK_TOP; i <= RANK_BOTTOM; i ++) { k = 0; for (j = FILE_LEFT; j <= FILE_RIGHT; j ++) { pc = this->ucpcSquares[COORD_XY(j, i)]; if (pc != 0) { if (k > 0) { *lpFen = k + '0'; lpFen ++; k = 0; } *lpFen = PIECE_BYTE(PIECE_TYPE(pc)) + (pc < 32 ? 0 : 'a' - 'A'); lpFen ++; } else { k ++; } } if (k > 0) { *lpFen = k + '0'; lpFen ++; } *lpFen = '/'; lpFen ++; } *(lpFen - 1) = ' '; // 把最后一个'/'替换成' ' *lpFen = (this->sdPlayer == 0 ? 'w' : 'b'); lpFen ++; *lpFen = '\0'; } // 局面镜像 void PositionStruct::Mirror(void) { int i, sq, nMoveNumSave; uint16_t wmvList[MAX_MOVE_NUM]; uint8_t ucsqList[32]; // 局面镜像需要按以下步骤依次进行: // 1. 记录所有历史着法 nMoveNumSave = this->nMoveNum; for (i = 1; i < nMoveNumSave; i ++) { wmvList[i] = this->rbsList[i].mvs.wmv; } // 2. 撤消所有着法 for (i = 1; i < nMoveNumSave; i ++) { UndoMakeMove(); } // 3. 把所有棋子从棋盘上拿走,位置记录到"ucsqList"数组; for (i = 16; i < 48; i ++) { sq = this->ucsqPieces[i]; ucsqList[i - 16] = sq; if (sq != 0) { AddPiece(sq, i, DEL_PIECE); } } // 4. 把拿走的棋子按照镜像位置重新放到棋盘上; for (i = 16; i < 48; i ++) { sq = ucsqList[i - 16]; if (sq != 0) { AddPiece(SQUARE_MIRROR(sq), i); } } // 6. 还原镜像着法 SetIrrev(); for (i = 1; i < nMoveNumSave; i ++) { MakeMove(MOVE_MIRROR(wmvList[i])); } } // 以上是一些局面处理过程 // 以下是一些着法检测过程 // 着法合理性检测,仅用在“杀手着法”的检测中 bool PositionStruct::LegalMove(int mv) const { int sqSrc, sqDst, sqPin, pcMoved, pcCaptured, x, y, nSideTag; // 着法合理性检测包括以下几个步骤: // 1. 检查要走的子是否存在 nSideTag = SIDE_TAG(this->sdPlayer); sqSrc = SRC(mv); sqDst = DST(mv); pcMoved = this->ucpcSquares[sqSrc]; if ((pcMoved & nSideTag) == 0) { return false; } __ASSERT_SQUARE(sqSrc); __ASSERT_SQUARE(sqDst); __ASSERT_PIECE(pcMoved); // 2. 检查吃到的子是否为对方棋子(如果有吃子并且没有升变的话) pcCaptured = this->ucpcSquares[sqDst]; if (sqSrc != sqDst && (pcCaptured & nSideTag) != 0) { return false; } __ASSERT_BOUND(0, PIECE_INDEX(pcMoved), 15); switch (PIECE_INDEX(pcMoved)) { // 3. 如果是帅(将)或仕(士),则先看是否在九宫内,再看是否是合理位移 case KING_FROM: return IN_FORT(sqDst) && KING_SPAN(sqSrc, sqDst); case ADVISOR_FROM: case ADVISOR_TO: if (sqSrc == sqDst) { // 考虑升变,在底线并且兵(卒)不全时,才可升变 return CAN_PROMOTE(sqSrc) && CanPromote(); } else { return IN_FORT(sqDst) && ADVISOR_SPAN(sqSrc, sqDst); } // 4. 如果是相(象),则先看是否过河,再看是否是合理位移,最后看有没有被塞象眼 case BISHOP_FROM: case BISHOP_TO: if (sqSrc == sqDst) { // 考虑升变,在底线并且兵(卒)不全时,才可升变 return CAN_PROMOTE(sqSrc) && CanPromote(); } else { return SAME_HALF(sqSrc, sqDst) && BISHOP_SPAN(sqSrc, sqDst) && this->ucpcSquares[BISHOP_PIN(sqSrc, sqDst)] == 0; } // 5. 如果是马,则先看看是否是合理位移,再看有没有被蹩马腿 case KNIGHT_FROM: case KNIGHT_TO: sqPin = KNIGHT_PIN(sqSrc, sqDst); return sqPin != sqSrc && this->ucpcSquares[sqPin] == 0; // 6. 如果是车,则先看是横向移动还是纵向移动,再读取位行或位列的着法预生成数组 case ROOK_FROM: case ROOK_TO: x = FILE_X(sqSrc); y = RANK_Y(sqSrc); if (x == FILE_X(sqDst)) { if (pcCaptured == 0) { return (FileMaskPtr(x, y)->wNonCap & PreGen.wBitFileMask[sqDst]) != 0; } else { return (FileMaskPtr(x, y)->wRookCap & PreGen.wBitFileMask[sqDst]) != 0; } } else if (y == RANK_Y(sqDst)) { if (pcCaptured == 0) { return (RankMaskPtr(x, y)->wNonCap & PreGen.wBitRankMask[sqDst]) != 0; } else { return (RankMaskPtr(x, y)->wRookCap & PreGen.wBitRankMask[sqDst]) != 0; } } else { return false; } // 7. 如果是炮,判断起来和车一样 case CANNON_FROM: case CANNON_TO: x = FILE_X(sqSrc); y = RANK_Y(sqSrc); if (x == FILE_X(sqDst)) { if (pcCaptured == 0) { return (FileMaskPtr(x, y)->wNonCap & PreGen.wBitFileMask[sqDst]) != 0; } else { return (FileMaskPtr(x, y)->wCannonCap & PreGen.wBitFileMask[sqDst]) != 0; } } else if (y == RANK_Y(sqDst)) { if (pcCaptured == 0) { return (RankMaskPtr(x, y)->wNonCap & PreGen.wBitRankMask[sqDst]) != 0; } else { return (RankMaskPtr(x, y)->wCannonCap & PreGen.wBitRankMask[sqDst]) != 0; } } else { return false; } // 8. 如果是兵(卒),则按红方和黑方分情况讨论 default: if (AWAY_HALF(sqDst, this->sdPlayer) && (sqDst == sqSrc - 1 || sqDst == sqSrc + 1)) { return true; } else { return sqDst == SQUARE_FORWARD(sqSrc, this->sdPlayer); } } } // 将军检测 int PositionStruct::CheckedBy(bool bLazy) const { int pcCheckedBy, i, sqSrc, sqDst, sqPin, pc, x, y, nOppSideTag; SlideMaskStruct *lpsmsRank, *lpsmsFile; pcCheckedBy = 0; nOppSideTag = OPP_SIDE_TAG(this->sdPlayer); // 将军判断包括以下几部分内容: // 1. 判断帅(将)是否在棋盘上 sqSrc = this->ucsqPieces[SIDE_TAG(this->sdPlayer)]; if (sqSrc == 0) { return 0; } __ASSERT_SQUARE(sqSrc); // 2. 获得帅(将)所在格子的位行和位列 x = FILE_X(sqSrc); y = RANK_Y(sqSrc); lpsmsRank = RankMaskPtr(x, y); lpsmsFile = FileMaskPtr(x, y); // 3. 判断是否将帅对脸 sqDst = this->ucsqPieces[nOppSideTag + KING_FROM]; if (sqDst != 0) { __ASSERT_SQUARE(sqDst); if (x == FILE_X(sqDst) && (lpsmsFile->wRookCap & PreGen.wBitFileMask[sqDst]) != 0) { return CHECK_MULTI; } } // 4. 判断是否被马将军 for (i = KNIGHT_FROM; i <= KNIGHT_TO; i ++) { sqDst = this->ucsqPieces[nOppSideTag + i]; if (sqDst != 0) { __ASSERT_SQUARE(sqDst); sqPin = KNIGHT_PIN(sqDst, sqSrc); // 注意,sqSrc和sqDst是反的! if (sqPin != sqDst && this->ucpcSquares[sqPin] == 0) { if (bLazy || pcCheckedBy > 0) { return CHECK_MULTI; } pcCheckedBy = nOppSideTag + i; __ASSERT_PIECE(pcCheckedBy); } } } // 5. 判断是否被车将军或将帅对脸 for (i = ROOK_FROM; i <= ROOK_TO; i ++) { sqDst = this->ucsqPieces[nOppSideTag + i]; if (sqDst != 0) { __ASSERT_SQUARE(sqDst); if (x == FILE_X(sqDst)) { if ((lpsmsFile->wRookCap & PreGen.wBitFileMask[sqDst]) != 0) { if (bLazy || pcCheckedBy > 0) { return CHECK_MULTI; } pcCheckedBy = nOppSideTag + i; __ASSERT_PIECE(pcCheckedBy); } } else if (y == RANK_Y(sqDst)) { if ((lpsmsRank->wRookCap & PreGen.wBitRankMask[sqDst]) != 0) { if (bLazy || pcCheckedBy > 0) { return CHECK_MULTI; } pcCheckedBy = nOppSideTag + i; __ASSERT_PIECE(pcCheckedBy); } } } } // 6. 判断是否被炮将军 for (i = CANNON_FROM; i <= CANNON_TO; i ++) { sqDst = this->ucsqPieces[nOppSideTag + i]; if (sqDst != 0) { __ASSERT_SQUARE(sqDst); if (x == FILE_X(sqDst)) { if ((lpsmsFile->wCannonCap & PreGen.wBitFileMask[sqDst]) != 0) { if (bLazy || pcCheckedBy > 0) { return CHECK_MULTI; } pcCheckedBy = nOppSideTag + i; __ASSERT_PIECE(pcCheckedBy); } } else if (y == RANK_Y(sqDst)) { if ((lpsmsRank->wCannonCap & PreGen.wBitRankMask[sqDst]) != 0) { if (bLazy || pcCheckedBy > 0) { return CHECK_MULTI; } pcCheckedBy = nOppSideTag + i; __ASSERT_PIECE(pcCheckedBy); } } } } // 7. 判断是否被兵(卒)将军 for (sqDst = sqSrc - 1; sqDst <= sqSrc + 1; sqDst += 2) { // 如果帅(将)在边线(ElephantEye允许),那么断言不成立 // __ASSERT_SQUARE(sqDst); pc = this->ucpcSquares[sqDst]; if ((pc & nOppSideTag) != 0 && PIECE_INDEX(pc) >= PAWN_FROM) { if (bLazy || pcCheckedBy > 0) { return CHECK_MULTI; } pcCheckedBy = nOppSideTag + i; __ASSERT_PIECE(pcCheckedBy); } } pc = this->ucpcSquares[SQUARE_FORWARD(sqSrc, this->sdPlayer)]; if ((pc & nOppSideTag) != 0 && PIECE_INDEX(pc) >= PAWN_FROM) { if (bLazy || pcCheckedBy > 0) { return CHECK_MULTI; } pcCheckedBy = nOppSideTag + i; __ASSERT_PIECE(pcCheckedBy); } return pcCheckedBy; } // 判断是否被将死 bool PositionStruct::IsMate(void) { int i, nGenNum; MoveStruct mvsGen[MAX_GEN_MOVES]; nGenNum = GenCapMoves(mvsGen); for (i = 0; i < nGenNum; i ++) { if (MakeMove(mvsGen[i].wmv)) { UndoMakeMove(); return false; } } // 着法生成分两部分做,这样可以节约时间 nGenNum = GenNonCapMoves(mvsGen); for (i = 0; i < nGenNum; i ++) { if (MakeMove(mvsGen[i].wmv)) { UndoMakeMove(); return false; } } return true; } // 设置将军状态位 inline void SetPerpCheck(uint32_t &dwPerpCheck, int nChkChs) { if (nChkChs == 0) { dwPerpCheck = 0; } else if (nChkChs > 0) { dwPerpCheck &= 0x10000; } else { dwPerpCheck &= (1 << -nChkChs); } } // 重复局面检测 int PositionStruct::RepStatus(int nRecur) const { // 参数"nRecur"指重复次数,在搜索中取1以提高搜索效率(默认值),根结点处取3以适应规则 int sd; uint32_t dwPerpCheck, dwOppPerpCheck; const RollbackStruct *lprbs; /* 重复局面检测包括以下几个步骤: * * 1. 首先判断检测重复的迷你置换表中是否可能有当前局面,如果没有可能,就用不着判断了 * 置换表"ucRepHash"是ElephantEye的一个特色,局面每执行一个着法时,就会在置换表项中记录下当前的"nMoveNum" * 如果置换表项已经填有其他局面,就不必覆盖了,参阅"MakeMove()"函数 * 因此撤消着法时,只要查找置换表项的值是否等于当前的"nMoveNum",如果相等则清空该项 * 如果不等于当前的"nMoveNum",则说明之前还有局面占有这个置换表项,不必清空该项,参阅"position.h"中的"UndoMakeMove()"函数 */ if (this->ucRepHash[this->zobr.dwKey & REP_HASH_MASK] == 0) { return 0; } // 2. 初始化 sd = OPP_SIDE(this->sdPlayer); dwPerpCheck = dwOppPerpCheck = 0x1ffff; lprbs = this->rbsList + this->nMoveNum - 1; // 3. 检查上一个着法,如果是空着或吃子着法,就不可能有重复了 while (lprbs->mvs.wmv != 0 && lprbs->mvs.CptDrw <= 0) { __ASSERT(lprbs >= this->rbsList); // 4. 判断双方的长打级别,0表示无长打,0xffff表示长捉,0x10000表示长将 if (sd == this->sdPlayer) { SetPerpCheck(dwPerpCheck, lprbs->mvs.ChkChs); // 5. 寻找重复局面,如果重复次数达到预定次数,则返回重复记号 if (lprbs->zobr.dwLock0 == this->zobr.dwLock0 && lprbs->zobr.dwLock1 == this->zobr.dwLock1) { nRecur --; if (nRecur == 0) { dwPerpCheck = ((dwPerpCheck & 0xffff) == 0 ? dwPerpCheck : 0xffff); dwOppPerpCheck = ((dwOppPerpCheck & 0xffff) == 0 ? dwOppPerpCheck : 0xffff); return dwPerpCheck > dwOppPerpCheck ? REP_LOSS : dwPerpCheck < dwOppPerpCheck ? REP_WIN : REP_DRAW; } } } else { SetPerpCheck(dwOppPerpCheck, lprbs->mvs.ChkChs); } sd = OPP_SIDE(sd); lprbs --; } return REP_NONE; } // 以上是一些着法检测过程 gmchess-0.29.6.3/src/engine/position.h000066400000000000000000000324351323660377300174740ustar00rootroot00000000000000/* position.h/position.cpp - Source Code for ElephantEye, Part III ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.12, Last Modified: Dec. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "base.h" #include "pregen.h" /* ElephantEyeԴʹõǺԼ * * sq: (0255"pregen.cpp") * pc: (047"position.cpp") * pt: (06"position.cpp") * mv: ŷ(065535"position.cpp") * sd: ӷ(0췽1ڷ) * vl: ֵ("-MATE_VALUE""MATE_VALUE""position.cpp") * (עĸǺſucdwȴļǺʹ) * pos: (PositionStructͣ"position.h") * sms: λкλеŷԤýṹ("pregen.h") * smv: λкλеŷжԤýṹ("pregen.h") */ #ifndef POSITION_H #define POSITION_H const int MAX_MOVE_NUM = 256; // ɵĻعŷ const int MAX_GEN_MOVES = 128; // ŷйκξ涼ᳬ120ŷ const int DRAW_MOVES = 100; // ĬϵĺŷElephantEye趨50غϼ100Ӧ const int REP_HASH_MASK = 1023; // жظûȣ1024 const int MATE_VALUE = 10000; // ߷ֵķֵ const int BAN_VALUE = MATE_VALUE - 100; // иķֵڸֵдû("hash.cpp") const int WIN_VALUE = MATE_VALUE - 200; // ʤķֵޣֵ˵Ѿɱ const int NULLOKAY_MARGIN = 200; // ŲüԲֵ߽ const int NULLSAFE_MARGIN = 400; // ʹÿŲüֵ߽ const int DRAW_VALUE = 20; // ʱصķ(ȡֵ) const bool CHECK_LAZY = true; // ͵⽫ const int CHECK_MULTI = 48; // ӽ // ÿͱ const int KING_TYPE = 0; const int ADVISOR_TYPE = 1; const int BISHOP_TYPE = 2; const int KNIGHT_TYPE = 3; const int ROOK_TYPE = 4; const int CANNON_TYPE = 5; const int PAWN_TYPE = 6; // ÿĿʼźͽ const int KING_FROM = 0; const int ADVISOR_FROM = 1; const int ADVISOR_TO = 2; const int BISHOP_FROM = 3; const int BISHOP_TO = 4; const int KNIGHT_FROM = 5; const int KNIGHT_TO = 6; const int ROOK_FROM = 7; const int ROOK_TO = 8; const int CANNON_FROM = 9; const int CANNON_TO = 10; const int PAWN_FROM = 11; const int PAWN_TO = 15; // λ const int KING_BITPIECE = 1 << KING_FROM; const int ADVISOR_BITPIECE = (1 << ADVISOR_FROM) | (1 << ADVISOR_TO); const int BISHOP_BITPIECE = (1 << BISHOP_FROM) | (1 << BISHOP_TO); const int KNIGHT_BITPIECE = (1 << KNIGHT_FROM) | (1 << KNIGHT_TO); const int ROOK_BITPIECE = (1 << ROOK_FROM) | (1 << ROOK_TO); const int CANNON_BITPIECE = (1 << CANNON_FROM) | (1 << CANNON_TO); const int PAWN_BITPIECE = (1 << PAWN_FROM) | (1 << (PAWN_FROM + 1)) | (1 << (PAWN_FROM + 2)) | (1 << (PAWN_FROM + 3)) | (1 << PAWN_TO); const int ATTACK_BITPIECE = KNIGHT_BITPIECE | ROOK_BITPIECE | CANNON_BITPIECE | PAWN_BITPIECE; inline uint32_t BIT_PIECE(int pc) { return 1 << (pc - 16); } inline uint32_t WHITE_BITPIECE(int nBitPiece) { return nBitPiece; } inline uint32_t BLACK_BITPIECE(int nBitPiece) { return nBitPiece << 16; } inline uint32_t BOTH_BITPIECE(int nBitPiece) { return nBitPiece + (nBitPiece << 16); } // "RepStatus()"صظλ const int REP_NONE = 0; const int REP_DRAW = 1; const int REP_LOSS = 3; const int REP_WIN = 5; /* ElephantEyeĺܶжõ"SIDE_TAG()"췽Ϊ16ڷΪ32 * "SIDE_TAG() + i"Էѡӵͣ"i"015ǣ * ˧ڱ(ʿʿ) * "i"ȡ"KNIGHT_FROM""KNIGHT_TO"ʾμλ */ inline int SIDE_TAG(int sd) { int pc = 16 + (sd << 4); return pc; } inline int OPP_SIDE_TAG(int sd) { int pc = 32 - (sd << 4); return pc; } inline int SIDE_VALUE(int sd, int vl) { return (sd == 0 ? vl : -vl); } inline int PIECE_INDEX(int pc) { return pc & 15; } extern const char *const cszStartFen; // ʼFEN extern const char *const cszPieceBytes; // ͶӦӷ extern const int cnPieceTypes[48]; // ŶӦ extern const int cnSimpleValues[48]; // ӵļ򵥷ֵ extern const uint8_t cucsqMirrorTab[256]; // ľ(ҶԳ) inline char PIECE_BYTE(int pt) { return cszPieceBytes[pt]; } inline int PIECE_TYPE(int pc) { return cnPieceTypes[pc]; } inline int SIMPLE_VALUE(int pc) { return cnSimpleValues[pc]; } inline uint8_t SQUARE_MIRROR(int sq) { return cucsqMirrorTab[sq]; } // FENӱʶ int FenPiece(int Arg); // ŷṹ union MoveStruct { uint32_t dwmv; // ṹ struct { uint16_t wmv, wvl; // ŷͷֵ }; struct { uint8_t Src, Dst; // ʼĿ int8_t CptDrw, ChkChs; // (+)/ŷ(-)(+)/׽(-) }; }; // mvs // ŷṹ inline int SRC(int mv) { // õŷ int sq = mv & 255; return sq; } inline int DST(int mv) { // õŷյ int sq = mv >> 8; return sq; } inline int MOVE(int sqSrc, int sqDst) { // յõŷ return sqSrc + (sqDst << 8); } inline uint32_t MOVE_COORD(int mv) { // ŷתַ union { char c[4]; uint32_t dw; } Ret; Ret.c[0] = FILE_X(SRC(mv)) - FILE_LEFT + 'a'; Ret.c[1] = '9' - RANK_Y(SRC(mv)) + RANK_TOP; Ret.c[2] = FILE_X(DST(mv)) - FILE_LEFT + 'a'; Ret.c[3] = '9' - RANK_Y(DST(mv)) + RANK_TOP; // ŷĺ __ASSERT_BOUND('a', Ret.c[0], 'i'); __ASSERT_BOUND('0', Ret.c[1], '9'); __ASSERT_BOUND('a', Ret.c[2], 'i'); __ASSERT_BOUND('0', Ret.c[3], '9'); return Ret.dw; } inline int COORD_MOVE(uint32_t dwMoveStr) { // ַתŷ int sqSrc, sqDst; char *lpArgPtr; lpArgPtr = (char *) &dwMoveStr; sqSrc = COORD_XY(lpArgPtr[0] - 'a' + FILE_LEFT, '9' - lpArgPtr[1] + RANK_TOP); sqDst = COORD_XY(lpArgPtr[2] - 'a' + FILE_LEFT, '9' - lpArgPtr[3] + RANK_TOP); // ŷĺԲ // __ASSERT_SQUARE(sqSrc); // __ASSERT_SQUARE(sqDst); return (IN_BOARD(sqSrc) && IN_BOARD(sqDst) ? MOVE(sqSrc, sqDst) : 0); } inline int MOVE_MIRROR(int mv) { // ŷ return MOVE(SQUARE_MIRROR(SRC(mv)), SQUARE_MIRROR(DST(mv))); } // عṹ struct RollbackStruct { ZobristStruct zobr; // Zobrist int vlWhite, vlBlack; // 췽ͺڷֵ MoveStruct mvs; // ŷ }; // rbs const bool DEL_PIECE = true; // "PositionStruct::AddPiece()"ѡ // ṹ struct PositionStruct { // Ա int sdPlayer; // ֵķߣ0ʾ췽1ʾڷ uint8_t ucpcSquares[256]; // ÿӷŵӣ0ʾû uint8_t ucsqPieces[48]; // ÿӷŵλã0ʾ ZobristStruct zobr; // Zobrist // λṹԱǿ̵Ĵ union { uint32_t dwBitPiece; // 32λλ031λαʾΪ1647Ƿ uint16_t wBitPiece[2]; // ֳ }; uint16_t wBitRanks[16]; // λ飬ע÷"wBitRanks[RANK_Y(sq)]" uint16_t wBitFiles[16]; // λ飬ע÷"wBitFiles[FILE_X(sq)]" // int vlWhite, vlBlack; // 췽ͺڷֵ // عŷѭ int nMoveNum, nDistance; // عŷ RollbackStruct rbsList[MAX_MOVE_NUM]; // عб uint8_t ucRepHash[REP_HASH_MASK + 1]; // жظû // ȡŷԤϢ SlideMoveStruct *RankMovePtr(int x, int y) const { return PreGen.smvRankMoveTab[x - FILE_LEFT] + wBitRanks[y]; } SlideMoveStruct *FileMovePtr(int x, int y) const { return PreGen.smvFileMoveTab[y - RANK_TOP] + wBitFiles[x]; } SlideMaskStruct *RankMaskPtr(int x, int y) const { return PreGen.smsRankMaskTab[x - FILE_LEFT] + wBitRanks[y]; } SlideMaskStruct *FileMaskPtr(int x, int y) const { return PreGen.smsFileMaskTab[y - RANK_TOP] + wBitFiles[x]; } // ̴ void ClearBoard(void) { // ̳ʼ sdPlayer = 0; memset(ucpcSquares, 0, 256); memset(ucsqPieces, 0, 48); zobr.InitZero(); dwBitPiece = 0; memset(wBitRanks, 0, 16 * sizeof(uint16_t)); memset(wBitFiles, 0, 16 * sizeof(uint16_t)); vlWhite = vlBlack = 0; // "ClearBoard()""SetIrrev()"ʼԱ } void ChangeSide(void) { // 巽 sdPlayer = OPP_SIDE(sdPlayer); zobr.Xor(PreGen.zobrPlayer); } void SaveStatus(void) { // ״̬ RollbackStruct *lprbs; lprbs = rbsList + nMoveNum; lprbs->zobr = zobr; lprbs->vlWhite = vlWhite; lprbs->vlBlack = vlBlack; } void Rollback(void) { // ع RollbackStruct *lprbs; lprbs = rbsList + nMoveNum; zobr = lprbs->zobr; vlWhite = lprbs->vlWhite; vlBlack = lprbs->vlBlack; } void AddPiece(int sq, int pc, bool bDel = false); // int MovePiece(int mv); // ƶ void UndoMovePiece(int mv, int pcCaptured); // ƶ int Promote(int sq); // void UndoPromote(int sq, int pcCaptured); // // ŷ bool MakeMove(int mv); // ִһŷ void UndoMakeMove(void); // һŷ void NullMove(void); // ִһ void UndoNullMove(void); // һ void SetIrrev(void) { // Ѿɡ桱عŷ rbsList[0].mvs.dwmv = 0; // wmv, Chk, CptDrw, ChkChs = 0 rbsList[0].mvs.ChkChs = CheckedBy(); nMoveNum = 1; nDistance = 0; memset(ucRepHash, 0, REP_HASH_MASK + 1); } // 洦 void FromFen(const char *szFen); // FENʶ void ToFen(char *szFen) const; // FEN void Mirror(void); // 澵 // ŷ bool GoodCap(int mv) const { // õijŷ⣬ŷ¼ʷɱŷ int pcMoved, pcCaptured; pcCaptured = ucpcSquares[DST(mv)]; if (pcCaptured == 0) { return false; } if (!Protected(OPP_SIDE(sdPlayer), DST(mv))) { return true; } pcMoved = ucpcSquares[SRC(mv)]; return SIMPLE_VALUE(pcCaptured) > SIMPLE_VALUE(pcMoved); } bool LegalMove(int mv) const; // ŷԼ⣬ڡɱŷļ int CheckedBy(bool bLazy = false) const; // ĸӽ bool IsMate(void); // жѱ MoveStruct LastMove(void) const { // ǰһŷŷ˾Ľ״̬ return rbsList[nMoveNum - 1].mvs; } bool CanPromote(void) const { // жǷ return (wBitPiece[sdPlayer] & PAWN_BITPIECE) != PAWN_BITPIECE && LastMove().ChkChs <= 0; } bool NullOkay(void) const { // ʹÿŲü return (sdPlayer == 0 ? vlWhite : vlBlack) > NULLOKAY_MARGIN; } bool NullSafe(void) const { // ŲüԲ return (sdPlayer == 0 ? vlWhite : vlBlack) > NULLSAFE_MARGIN; } bool IsDraw(void) const { // ж return (!PreEval.bPromotion && (dwBitPiece & BOTH_BITPIECE(ATTACK_BITPIECE)) == 0) || -LastMove().CptDrw >= DRAW_MOVES || nMoveNum == MAX_MOVE_NUM; } int RepStatus(int nRecur = 1) const; // ظ int DrawValue(void) const { // ķֵ return (nDistance & 1) == 0 ? -DRAW_VALUE : DRAW_VALUE; } int RepValue(int vlRep) const { // ظķֵ // return vlRep == REP_LOSS ? nDistance - MATE_VALUE : vlRep == REP_WIN ? MATE_VALUE - nDistance : DrawValue(); // иķֵBAN_VALUEдû("hash.cpp") return vlRep == REP_LOSS ? nDistance - BAN_VALUE : vlRep == REP_WIN ? BAN_VALUE - nDistance : DrawValue(); } int Material(void) const { // ƽ⣬Ȩ return SIDE_VALUE(sdPlayer, vlWhite - vlBlack) + PreEval.vlAdvanced; } // ŷɹ̣Щ̴ر԰Ƕ"genmoves.cpp" bool Protected(int sd, int sqSrc, int sqExcept = 0) const; // ӱж int ChasedBy(int mv) const; // ׽ĸ int MvvLva(int sqDst, int pcCaptured, int nLva) const; // MVV(LVA)ֵ int GenCapMoves(MoveStruct *lpmvs) const; // ŷ int GenNonCapMoves(MoveStruct *lpmvs) const; // ŷ int GenAllMoves(MoveStruct *lpmvs) const { // ȫŷ int nCapNum; nCapNum = GenCapMoves(lpmvs); return nCapNum + GenNonCapMoves(lpmvs + nCapNum); } }; // pos #endif gmchess-0.29.6.3/src/engine/preeval.cpp000066400000000000000000000642351323660377300176240ustar00rootroot00000000000000/* preeval.h/preeval.cpp - Source Code for ElephantEye, Part X ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.0, Last Modified: Nov. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "base.h" #include "pregen.h" #include "position.h" #include "preeval.h" #if _WIN32 #include extern "C" __declspec(dllexport) void WINAPI PreEvaluate(PositionStruct *lppos, PreEvalStruct *lpPreEval); #else #define WINAPI extern "C" void WINAPI PreEvaluate(PositionStruct *lppos, PreEvalStruct *lpPreEval); #endif /* ElephantEyeԴʹõǺԼ * * sq: (0255"pregen.cpp") * pc: (047"position.cpp") * pt: (06"position.cpp") * mv: ŷ(065535"position.cpp") * sd: ӷ(0췽1ڷ) * vl: ֵ("-MATE_VALUE""MATE_VALUE""position.cpp") * (עǺſucdwȴļǺʹ) * pos: (PositionStructͣ"position.h") * sms: λкλеŷԤýṹ("pregen.h") * smv: λкλеŷжԤýṹ("pregen.h") */ /* λüֵ * ElephantEyeλüֵԾ۵ĵ˺ܴãڲա񵰡Ļϣ¸Ķ * 1. ֺλطһڿ㣻 * 2. һ·ı()Ѳλ÷ֵ5֣ԼäĿ߱() * 3. ӱ()(߳)10֣Լٹӱ()äĿ(ʿ)() * 4. һ·ںᳵλ÷ֵ5֣Լ(ʿ)ʱĺᳵ */ // 1. о֡н˧()ͱ()ա񵰡 static const uint8_t cucvlKingPawnMidgameAttacking[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 11, 13, 11, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 39, 49, 69, 84, 89, 84, 69, 49, 39, 0, 0, 0, 0, 0, 0, 0, 39, 49, 64, 74, 74, 74, 64, 49, 39, 0, 0, 0, 0, 0, 0, 0, 39, 46, 54, 59, 61, 59, 54, 46, 39, 0, 0, 0, 0, 0, 0, 0, 29, 37, 41, 54, 59, 54, 41, 37, 29, 0, 0, 0, 0, 0, 0, 0, 7, 0, 13, 0, 16, 0, 13, 0, 7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 15, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 15, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 2. о֡ûн˧()ͱ() static const uint8_t cucvlKingPawnMidgameAttackless[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 11, 13, 11, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 19, 24, 34, 42, 44, 42, 34, 24, 19, 0, 0, 0, 0, 0, 0, 0, 19, 24, 32, 37, 37, 37, 32, 24, 19, 0, 0, 0, 0, 0, 0, 0, 19, 23, 27, 29, 30, 29, 27, 23, 19, 0, 0, 0, 0, 0, 0, 0, 14, 18, 20, 27, 29, 27, 20, 18, 14, 0, 0, 0, 0, 0, 0, 0, 7, 0, 13, 0, 16, 0, 13, 0, 7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 15, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 15, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 3. о֡н˧()ͱ() static const uint8_t cucvlKingPawnEndgameAttacking[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 15, 15, 15, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 50, 55, 60, 85,100, 85, 60, 55, 50, 0, 0, 0, 0, 0, 0, 0, 65, 70, 70, 75, 75, 75, 70, 70, 65, 0, 0, 0, 0, 0, 0, 0, 75, 80, 80, 80, 80, 80, 80, 80, 75, 0, 0, 0, 0, 0, 0, 0, 70, 70, 65, 70, 70, 70, 65, 70, 70, 0, 0, 0, 0, 0, 0, 0, 45, 0, 40, 45, 45, 45, 40, 0, 45, 0, 0, 0, 0, 0, 0, 0, 40, 0, 35, 40, 40, 40, 35, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 15, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 13, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 11, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 4. о֡ûн˧()ͱ() static const uint8_t cucvlKingPawnEndgameAttackless[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 15, 15, 15, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 10, 15, 20, 45, 60, 45, 20, 15, 10, 0, 0, 0, 0, 0, 0, 0, 25, 30, 30, 35, 35, 35, 30, 30, 25, 0, 0, 0, 0, 0, 0, 0, 35, 40, 40, 45, 45, 45, 40, 40, 35, 0, 0, 0, 0, 0, 0, 0, 25, 30, 30, 35, 35, 35, 30, 30, 25, 0, 0, 0, 0, 0, 0, 0, 25, 0, 25, 25, 25, 25, 25, 0, 25, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 20, 20, 20, 20, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 13, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 12, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 11, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 5. ûв(ʿ)() static const uint8_t cucvlAdvisorBishopThreatless[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 20, 23, 20, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 0, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 5'. ģûв(ʿ)() static const uint8_t cucvlAdvisorBishopPromotionThreatless[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 30, 33, 30, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 0, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 6. ܵв(ʿ)()ա񵰡 static const uint8_t cucvlAdvisorBishopThreatened[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 40, 43, 40, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 0, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 7. оֵա񵰡 static const uint8_t cucvlKnightMidgame[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 90, 90, 96, 90, 96, 90, 90, 90, 0, 0, 0, 0, 0, 0, 0, 90, 96,103, 97, 94, 97,103, 96, 90, 0, 0, 0, 0, 0, 0, 0, 92, 98, 99,103, 99,103, 99, 98, 92, 0, 0, 0, 0, 0, 0, 0, 93,108,100,107,100,107,100,108, 93, 0, 0, 0, 0, 0, 0, 0, 90,100, 99,103,104,103, 99,100, 90, 0, 0, 0, 0, 0, 0, 0, 90, 98,101,102,103,102,101, 98, 90, 0, 0, 0, 0, 0, 0, 0, 92, 94, 98, 95, 98, 95, 98, 94, 92, 0, 0, 0, 0, 0, 0, 0, 93, 92, 94, 95, 92, 95, 94, 92, 93, 0, 0, 0, 0, 0, 0, 0, 85, 90, 92, 93, 78, 93, 92, 90, 85, 0, 0, 0, 0, 0, 0, 0, 88, 85, 90, 88, 90, 88, 90, 85, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 8. оֵ static const uint8_t cucvlKnightEndgame[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 94, 96, 96, 96, 96, 96, 94, 92, 0, 0, 0, 0, 0, 0, 0, 94, 96, 98, 98, 98, 98, 98, 96, 94, 0, 0, 0, 0, 0, 0, 0, 96, 98,100,100,100,100,100, 98, 96, 0, 0, 0, 0, 0, 0, 0, 96, 98,100,100,100,100,100, 98, 96, 0, 0, 0, 0, 0, 0, 0, 96, 98,100,100,100,100,100, 98, 96, 0, 0, 0, 0, 0, 0, 0, 94, 96, 98, 98, 98, 98, 98, 96, 94, 0, 0, 0, 0, 0, 0, 0, 94, 96, 98, 98, 98, 98, 98, 96, 94, 0, 0, 0, 0, 0, 0, 0, 92, 94, 96, 96, 96, 96, 96, 94, 92, 0, 0, 0, 0, 0, 0, 0, 90, 92, 94, 92, 92, 92, 94, 92, 90, 0, 0, 0, 0, 0, 0, 0, 88, 90, 92, 90, 90, 90, 92, 90, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 9. оֵijա񵰡 static const uint8_t cucvlRookMidgame[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,206,208,207,213,214,213,207,208,206, 0, 0, 0, 0, 0, 0, 0,206,212,209,216,233,216,209,212,206, 0, 0, 0, 0, 0, 0, 0,206,208,207,214,216,214,207,208,206, 0, 0, 0, 0, 0, 0, 0,206,213,213,216,216,216,213,213,206, 0, 0, 0, 0, 0, 0, 0,208,211,211,214,215,214,211,211,208, 0, 0, 0, 0, 0, 0, 0,208,212,212,214,215,214,212,212,208, 0, 0, 0, 0, 0, 0, 0,204,209,204,212,214,212,204,209,204, 0, 0, 0, 0, 0, 0, 0,198,208,204,212,212,212,204,208,198, 0, 0, 0, 0, 0, 0, 0,200,208,206,212,200,212,206,208,200, 0, 0, 0, 0, 0, 0, 0,194,206,204,212,200,212,204,206,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 10. оֵij static const uint8_t cucvlRookEndgame[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182,182,182,184,186,184,182,182,182, 0, 0, 0, 0, 0, 0, 0,184,184,184,186,190,186,184,184,184, 0, 0, 0, 0, 0, 0, 0,182,182,182,184,186,184,182,182,182, 0, 0, 0, 0, 0, 0, 0,180,180,180,182,184,182,180,180,180, 0, 0, 0, 0, 0, 0, 0,180,180,180,182,184,182,180,180,180, 0, 0, 0, 0, 0, 0, 0,180,180,180,182,184,182,180,180,180, 0, 0, 0, 0, 0, 0, 0,180,180,180,182,184,182,180,180,180, 0, 0, 0, 0, 0, 0, 0,180,180,180,182,184,182,180,180,180, 0, 0, 0, 0, 0, 0, 0,180,180,180,182,184,182,180,180,180, 0, 0, 0, 0, 0, 0, 0,180,180,180,182,184,182,180,180,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 11. оֵڣա񵰡 static const uint8_t cucvlCannonMidgame[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,100, 96, 91, 90, 91, 96,100,100, 0, 0, 0, 0, 0, 0, 0, 98, 98, 96, 92, 89, 92, 96, 98, 98, 0, 0, 0, 0, 0, 0, 0, 97, 97, 96, 91, 92, 91, 96, 97, 97, 0, 0, 0, 0, 0, 0, 0, 96, 99, 99, 98,100, 98, 99, 99, 96, 0, 0, 0, 0, 0, 0, 0, 96, 96, 96, 96,100, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, 95, 96, 99, 96,100, 96, 99, 96, 95, 0, 0, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, 97, 96,100, 99,101, 99,100, 96, 97, 0, 0, 0, 0, 0, 0, 0, 96, 97, 98, 98, 98, 98, 98, 97, 96, 0, 0, 0, 0, 0, 0, 0, 96, 96, 97, 99, 99, 99, 97, 96, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 12. оֵ static const uint8_t cucvlCannonEndgame[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,100,100,100,100,100,100, 0, 0, 0, 0, 0, 0, 0,100,100,100,100,100,100,100,100,100, 0, 0, 0, 0, 0, 0, 0,100,100,100,100,100,100,100,100,100, 0, 0, 0, 0, 0, 0, 0,100,100,100,102,104,102,100,100,100, 0, 0, 0, 0, 0, 0, 0,100,100,100,102,104,102,100,100,100, 0, 0, 0, 0, 0, 0, 0,100,100,100,102,104,102,100,100,100, 0, 0, 0, 0, 0, 0, 0,100,100,100,102,104,102,100,100,100, 0, 0, 0, 0, 0, 0, 0,100,100,100,102,104,102,100,100,100, 0, 0, 0, 0, 0, 0, 0,100,100,100,104,106,104,100,100,100, 0, 0, 0, 0, 0, 0, 0,100,100,100,104,106,104,100,100,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // ͷڵвֵָǶԺ췽˵к(ڷҪ15ȥ)ϿͷλԽвԽ󡣽оʱֵҪӦ١ static const int cvlHollowThreat[16] = { 0, 0, 0, 0, 0, 0, 60, 65, 70, 75, 80, 80, 80, 0, 0, 0 }; // вֵָͬϣϸ߶ԽвԽûʱȡķ֮һоʱȡֵƺӦ仯 static const int cvlCentralThreat[16] = { 0, 0, 0, 0, 0, 0, 50, 45, 40, 35, 30, 30, 30, 0, 0, 0 }; // ڵвֵָкţԽвԽвʱֵҪӦ١ static const int cvlBottomThreat[16] = { 0, 0, 0, 40, 30, 0, 0, 0, 0, 0, 30, 40, 0, 0, 0, 0 }; // ģֻ漰"PositionStruct"е"ucsqPieces""dwBitPiece/wBitPiece""vlWhite""vlBlack"ĸԱʡǰ"this->" /* Ԥ۾dzʼԤ(PreEvalPreEvalEx)Ĺ̡ * ElephantEyeľԤҪ棺 * 1. жϾƴڿоֻDzоֽ׶Σ * 2. жÿһǷԶԷγв */ const int ROOK_MIDGAME_VALUE = 6; const int KNIGHT_CANNON_MIDGAME_VALUE = 3; const int OTHER_MIDGAME_VALUE = 1; const int TOTAL_MIDGAME_VALUE = ROOK_MIDGAME_VALUE * 4 + KNIGHT_CANNON_MIDGAME_VALUE * 8 + OTHER_MIDGAME_VALUE * 18; const int TOTAL_ADVANCED_VALUE = 4; const int TOTAL_ATTACK_VALUE = 8; const int ADVISOR_BISHOP_ATTACKLESS_VALUE = 80; const int TOTAL_ADVISOR_LEAKAGE = 80; static bool bInit = false; PreEvalStructEx PreEvalEx; void WINAPI PreEvaluate(PositionStruct *lppos, PreEvalStruct *lpPreEval) { int i, sq, nMidgameValue, nWhiteAttacks, nBlackAttacks, nWhiteSimpleValue, nBlackSimpleValue; uint8_t ucvlPawnPiecesAttacking[256], ucvlPawnPiecesAttackless[256]; if (!bInit) { bInit = true; // ʼ"PreEvalEx.cPopCnt16"飬ֻҪʼһ for (i = 0; i < 65536; i ++) { PreEvalEx.cPopCnt16[i] = PopCnt16(i); } // ע⣺;APIӵͬPreGenʵ PreGenInit(); } PreEval.bPromotion = lpPreEval->bPromotion; // жϾƴڿоֻDzоֽ׶ΣǼӵճ=6=3=1ӡ nMidgameValue = PopCnt32(lppos->dwBitPiece & BOTH_BITPIECE(ADVISOR_BITPIECE | BISHOP_BITPIECE | PAWN_BITPIECE)) * OTHER_MIDGAME_VALUE; nMidgameValue += PopCnt32(lppos->dwBitPiece & BOTH_BITPIECE(KNIGHT_BITPIECE | CANNON_BITPIECE)) * KNIGHT_CANNON_MIDGAME_VALUE; nMidgameValue += PopCnt32(lppos->dwBitPiece & BOTH_BITPIECE(ROOK_BITPIECE)) * ROOK_MIDGAME_VALUE; // ʹöκʱΪӽо nMidgameValue = (2 * TOTAL_MIDGAME_VALUE - nMidgameValue) * nMidgameValue / TOTAL_MIDGAME_VALUE; __ASSERT_BOUND(0, nMidgameValue, TOTAL_MIDGAME_VALUE); PreEval.vlAdvanced = (TOTAL_ADVANCED_VALUE * nMidgameValue + TOTAL_ADVANCED_VALUE / 2) / TOTAL_MIDGAME_VALUE; __ASSERT_BOUND(0, PreEval.vlAdvanced, TOTAL_ADVANCED_VALUE); for (sq = 0; sq < 256; sq ++) { if (IN_BOARD(sq)) { PreEval.ucvlWhitePieces[0][sq] = PreEval.ucvlBlackPieces[0][SQUARE_FLIP(sq)] = (uint8_t) ((cucvlKingPawnMidgameAttacking[sq] * nMidgameValue + cucvlKingPawnEndgameAttacking[sq] * (TOTAL_MIDGAME_VALUE - nMidgameValue)) / TOTAL_MIDGAME_VALUE); PreEval.ucvlWhitePieces[3][sq] = PreEval.ucvlBlackPieces[3][SQUARE_FLIP(sq)] = (uint8_t) ((cucvlKnightMidgame[sq] * nMidgameValue + cucvlKnightEndgame[sq] * (TOTAL_MIDGAME_VALUE - nMidgameValue)) / TOTAL_MIDGAME_VALUE); PreEval.ucvlWhitePieces[4][sq] = PreEval.ucvlBlackPieces[4][SQUARE_FLIP(sq)] = (uint8_t) ((cucvlRookMidgame[sq] * nMidgameValue + cucvlRookEndgame[sq] * (TOTAL_MIDGAME_VALUE - nMidgameValue)) / TOTAL_MIDGAME_VALUE); PreEval.ucvlWhitePieces[5][sq] = PreEval.ucvlBlackPieces[5][SQUARE_FLIP(sq)] = (uint8_t) ((cucvlCannonMidgame[sq] * nMidgameValue + cucvlCannonEndgame[sq] * (TOTAL_MIDGAME_VALUE - nMidgameValue)) / TOTAL_MIDGAME_VALUE); ucvlPawnPiecesAttacking[sq] = PreEval.ucvlWhitePieces[0][sq]; ucvlPawnPiecesAttackless[sq] = (uint8_t) ((cucvlKingPawnMidgameAttackless[sq] * nMidgameValue + cucvlKingPawnEndgameAttackless[sq] * (TOTAL_MIDGAME_VALUE - nMidgameValue)) / TOTAL_MIDGAME_VALUE); } } for (i = 0; i < 16; i ++) { PreEvalEx.vlHollowThreat[i] = cvlHollowThreat[i] * (nMidgameValue + TOTAL_MIDGAME_VALUE) / (TOTAL_MIDGAME_VALUE * 2); __ASSERT_BOUND(0, PreEvalEx.vlHollowThreat[i], cvlHollowThreat[i]); PreEvalEx.vlCentralThreat[i] = cvlCentralThreat[i]; } // ȻжϸǷڽ״̬Ǽֹӵճ2ڱ1ӡ nWhiteAttacks = nBlackAttacks = 0; for (i = SIDE_TAG(0) + KNIGHT_FROM; i <= SIDE_TAG(0) + ROOK_TO; i ++) { if (lppos->ucsqPieces[i] != 0 && BLACK_HALF(lppos->ucsqPieces[i])) { nWhiteAttacks += 2; } } for (i = SIDE_TAG(0) + CANNON_FROM; i <= SIDE_TAG(0) + PAWN_TO; i ++) { if (lppos->ucsqPieces[i] != 0 && BLACK_HALF(lppos->ucsqPieces[i])) { nWhiteAttacks ++; } } for (i = SIDE_TAG(1) + KNIGHT_FROM; i <= SIDE_TAG(1) + ROOK_TO; i ++) { if (lppos->ucsqPieces[i] != 0 && WHITE_HALF(lppos->ucsqPieces[i])) { nBlackAttacks += 2; } } for (i = SIDE_TAG(1) + CANNON_FROM; i <= SIDE_TAG(1) + PAWN_TO; i ++) { if (lppos->ucsqPieces[i] != 0 && WHITE_HALF(lppos->ucsqPieces[i])) { nBlackAttacks ++; } } // ȶԷ࣬ôÿһ(2)вֵ2вֵ಻8 nWhiteSimpleValue = PopCnt16(lppos->wBitPiece[0] & ROOK_BITPIECE) * 2 + PopCnt16(lppos->wBitPiece[0] & (KNIGHT_BITPIECE | CANNON_BITPIECE)); nBlackSimpleValue = PopCnt16(lppos->wBitPiece[1] & ROOK_BITPIECE) * 2 + PopCnt16(lppos->wBitPiece[1] & (KNIGHT_BITPIECE | CANNON_BITPIECE)); if (nWhiteSimpleValue > nBlackSimpleValue) { nWhiteAttacks += (nWhiteSimpleValue - nBlackSimpleValue) * 2; } else { nBlackAttacks += (nBlackSimpleValue - nWhiteSimpleValue) * 2; } nWhiteAttacks = MIN(nWhiteAttacks, TOTAL_ATTACK_VALUE); nBlackAttacks = MIN(nBlackAttacks, TOTAL_ATTACK_VALUE); PreEvalEx.vlBlackAdvisorLeakage = TOTAL_ADVISOR_LEAKAGE * nWhiteAttacks / TOTAL_ATTACK_VALUE; PreEvalEx.vlWhiteAdvisorLeakage = TOTAL_ADVISOR_LEAKAGE * nBlackAttacks / TOTAL_ATTACK_VALUE; __ASSERT_BOUND(0, nWhiteAttacks, TOTAL_ATTACK_VALUE); __ASSERT_BOUND(0, nBlackAttacks, TOTAL_ATTACK_VALUE); __ASSERT_BOUND(0, PreEvalEx.vlBlackAdvisorLeakage, TOTAL_ADVISOR_LEAKAGE); __ASSERT_BOUND(0, PreEvalEx.vlBlackAdvisorLeakage, TOTAL_ADVISOR_LEAKAGE); for (sq = 0; sq < 256; sq ++) { if (IN_BOARD(sq)) { PreEval.ucvlWhitePieces[1][sq] = PreEval.ucvlWhitePieces[2][sq] = (uint8_t) ((cucvlAdvisorBishopThreatened[sq] * nBlackAttacks + (PreEval.bPromotion ? cucvlAdvisorBishopPromotionThreatless[sq] : cucvlAdvisorBishopThreatless[sq]) * (TOTAL_ATTACK_VALUE - nBlackAttacks)) / TOTAL_ATTACK_VALUE); PreEval.ucvlBlackPieces[1][sq] = PreEval.ucvlBlackPieces[2][sq] = (uint8_t) ((cucvlAdvisorBishopThreatened[SQUARE_FLIP(sq)] * nWhiteAttacks + (PreEval.bPromotion ? cucvlAdvisorBishopPromotionThreatless[SQUARE_FLIP(sq)] : cucvlAdvisorBishopThreatless[SQUARE_FLIP(sq)]) * (TOTAL_ATTACK_VALUE - nWhiteAttacks)) / TOTAL_ATTACK_VALUE); PreEval.ucvlWhitePieces[6][sq] = (uint8_t) ((ucvlPawnPiecesAttacking[sq] * nWhiteAttacks + ucvlPawnPiecesAttackless[sq] * (TOTAL_ATTACK_VALUE - nWhiteAttacks)) / TOTAL_ATTACK_VALUE); PreEval.ucvlBlackPieces[6][sq] = (uint8_t) ((ucvlPawnPiecesAttacking[SQUARE_FLIP(sq)] * nBlackAttacks + ucvlPawnPiecesAttackless[SQUARE_FLIP(sq)] * (TOTAL_ATTACK_VALUE - nBlackAttacks)) / TOTAL_ATTACK_VALUE); } } for (i = 0; i < 16; i ++) { PreEvalEx.vlWhiteBottomThreat[i] = cvlBottomThreat[i] * nBlackAttacks / TOTAL_ATTACK_VALUE; PreEvalEx.vlBlackBottomThreat[i] = cvlBottomThreat[i] * nWhiteAttacks / TOTAL_ATTACK_VALUE; } // ԤǷԳ #ifndef NDEBUG for (sq = 0; sq < 256; sq ++) { if (IN_BOARD(sq)) { for (i = 0; i < 7; i ++) { __ASSERT(PreEval.ucvlWhitePieces[i][sq] == PreEval.ucvlWhitePieces[i][SQUARE_MIRROR(sq)]); __ASSERT(PreEval.ucvlBlackPieces[i][sq] == PreEval.ucvlBlackPieces[i][SQUARE_MIRROR(sq)]); } } } for (i = FILE_LEFT; i <= FILE_RIGHT; i ++) { __ASSERT(PreEvalEx.vlWhiteBottomThreat[i] == PreEvalEx.vlWhiteBottomThreat[FILE_FLIP(i)]); __ASSERT(PreEvalEx.vlBlackBottomThreat[i] == PreEvalEx.vlBlackBottomThreat[FILE_FLIP(i)]); } #endif // вٵ(ʿ)()ֵ lppos->vlWhite = ADVISOR_BISHOP_ATTACKLESS_VALUE * (TOTAL_ATTACK_VALUE - nBlackAttacks) / TOTAL_ATTACK_VALUE; lppos->vlBlack = ADVISOR_BISHOP_ATTACKLESS_VALUE * (TOTAL_ATTACK_VALUE - nWhiteAttacks) / TOTAL_ATTACK_VALUE; // 䣬ôв(ʿ)()ֵһ if (PreEval.bPromotion) { lppos->vlWhite /= 2; lppos->vlBlack /= 2; } // ¼λ÷ for (i = 16; i < 32; i ++) { sq = lppos->ucsqPieces[i]; if (sq != 0) { __ASSERT_SQUARE(sq); lppos->vlWhite += PreEval.ucvlWhitePieces[PIECE_TYPE(i)][sq]; } } for (i = 32; i < 48; i ++) { sq = lppos->ucsqPieces[i]; if (sq != 0) { __ASSERT_SQUARE(sq); lppos->vlBlack += PreEval.ucvlBlackPieces[PIECE_TYPE(i)][sq]; } } // ע⣺;APIӵͬPreEvalʵ *lpPreEval = PreEval; } gmchess-0.29.6.3/src/engine/preeval.h000066400000000000000000000024301323660377300172560ustar00rootroot00000000000000/* preeval.h/preeval.cpp - Source Code for ElephantEye, Part X ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 2.1, Last Modified: May 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PREEVAL_H #define PREEVAL_H // չľԤ۽ṹ extern struct PreEvalStructEx { int vlBlackAdvisorLeakage, vlWhiteAdvisorLeakage; int vlHollowThreat[16], vlCentralThreat[16]; int vlWhiteBottomThreat[16], vlBlackBottomThreat[16]; char cPopCnt16[65536]; // PopCnt16飬ֻҪʼһ } PreEvalEx; #endif gmchess-0.29.6.3/src/engine/pregen.cpp000066400000000000000000000401311323660377300174330ustar00rootroot00000000000000/* pregen.h/pregen.cpp - Source Code for ElephantEye, Part II ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.0, Last Modified: Nov. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "base.h" #include "pregen.h" const bool cbcInBoard[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const bool cbcInFort[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const bool cbcCanPromote[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const int8_t ccLegalSpanTab[512] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const int8_t ccKnightPinTab[512] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-16, 0,-16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; PreGenStruct PreGen; PreEvalStruct PreEval; // ĸжӵӷΪǣsqDst = sqSrc + cnKnightMoveTab[i] static const int cnKingMoveTab[4] = {-0x10, -0x01, +0x01, +0x10}; static const int cnAdvisorMoveTab[4] = {-0x11, -0x0f, +0x0f, +0x11}; static const int cnBishopMoveTab[4] = {-0x22, -0x1e, +0x1e, +0x22}; static const int cnKnightMoveTab[8] = {-0x21, -0x1f, -0x12, -0x0e, +0x0e, +0x12, +0x1f, +0x21}; void PreGenInit(void) { int i, j, k, n, sqSrc, sqDst; RC4Struct rc4; SlideMoveStruct smv; SlideMaskStruct sms; // ȳʼZobristֵ rc4.InitZero(); PreGen.zobrPlayer.InitRC4(rc4); for (i = 0; i < 14; i ++) { for (j = 0; j < 256; j ++) { PreGen.zobrTable[i][j].InitRC4(rc4); } } // Ȼʼλкλ // עλкλвλԾͻƵʹ"+/- RANK_TOP/FILE_LEFT" for (sqSrc = 0; sqSrc < 256; sqSrc ++) { if (IN_BOARD(sqSrc)) { PreGen.wBitRankMask[sqSrc] = 1 << (FILE_X(sqSrc) - FILE_LEFT); PreGen.wBitFileMask[sqSrc] = 1 << (RANK_Y(sqSrc) - RANK_TOP); } else { PreGen.wBitRankMask[sqSrc] = 0; PreGen.wBitFileMask[sqSrc] = 0; } } // ȻɳںԤ(Ӧò"pregen.h") for (i = 0; i < 9; i ++) { for (j = 0; j < 512; j ++) { // ʼڡλСijڵŷԤ飬¼裺 // 1. ʼʱ"SlideMoveTab"ûŷʼ smv.ucNonCap[0] = smv.ucNonCap[1] = smv.ucRookCap[0] = smv.ucRookCap[1] = smv.ucCannonCap[0] = smv.ucCannonCap[1] = smv.ucSuperCap[0] = smv.ucSuperCap[1] = i + FILE_LEFT; sms.wNonCap = sms.wRookCap = sms.wCannonCap = sms.wSuperCap = 0; // ʾ"pregen.h"...[0]ʾһƶƶ[0]֮Ȼ // 2. ƶĿ...[0] for (k = i + 1; k <= 8; k ++) { if ((j & (1 << k)) != 0) { smv.ucRookCap[0] = FILE_DISP(k + FILE_LEFT); sms.wRookCap |= 1 << k; break; } smv.ucNonCap[0] = FILE_DISP(k + FILE_LEFT); sms.wNonCap |= 1 << k; } for (k ++; k <= 8; k ++) { if ((j & (1 << k)) != 0) { smv.ucCannonCap[0] = FILE_DISP(k + FILE_LEFT); sms.wCannonCap |= 1 << k; break; } } for (k ++; k <= 8; k ++) { if ((j & (1 << k)) != 0) { smv.ucSuperCap[0] = FILE_DISP(k + FILE_LEFT); sms.wSuperCap |= 1 << k; break; } } // 3. ƶĿ...[1] for (k = i - 1; k >= 0; k --) { if ((j & (1 << k)) != 0) { smv.ucRookCap[1] = FILE_DISP(k + FILE_LEFT); sms.wRookCap |= 1 << k; break; } smv.ucNonCap[1] = FILE_DISP(k + FILE_LEFT); sms.wNonCap |= 1 << k; } for (k --; k >= 0; k --) { if ((j & (1 << k)) != 0) { smv.ucCannonCap[1] = FILE_DISP(k + FILE_LEFT); sms.wCannonCap |= 1 << k; break; } } for (k --; k >= 0; k --) { if ((j & (1 << k)) != 0) { smv.ucSuperCap[1] = FILE_DISP(k + FILE_LEFT); sms.wSuperCap |= 1 << k; break; } } // 4. Ϊ"smv""sms"ֵ __ASSERT_BOUND_2(3, smv.ucNonCap[1], smv.ucNonCap[0], 11); __ASSERT_BOUND_2(3, smv.ucRookCap[1], smv.ucRookCap[0], 11); __ASSERT_BOUND_2(3, smv.ucCannonCap[1], smv.ucCannonCap[0], 11); __ASSERT_BOUND_2(3, smv.ucSuperCap[1], smv.ucSuperCap[0], 11); __ASSERT_BITRANK(sms.wNonCap); __ASSERT_BITRANK(sms.wRookCap); __ASSERT_BITRANK(sms.wCannonCap); __ASSERT_BITRANK(sms.wSuperCap); // 5. ʱ"smv""sms"ŷԤ PreGen.smvRankMoveTab[i][j] = smv; PreGen.smsRankMaskTab[i][j] = sms; } } // ȻɳԤ(Ӧò"pregen.h") for (i = 0; i < 10; i ++) { for (j = 0; j < 1024; j ++) { // ʼڡλСijڵŷԤ飬¼裺 // 1. ʼʱ"smv"ûŷʼ smv.ucNonCap[0] = smv.ucNonCap[1] = smv.ucRookCap[0] = smv.ucRookCap[1] = smv.ucCannonCap[0] = smv.ucCannonCap[1] = smv.ucSuperCap[0] = smv.ucSuperCap[1] = (i + RANK_TOP) * 16; sms.wNonCap = sms.wRookCap = sms.wCannonCap = sms.wSuperCap = 0; // 2. ƶĿ...[0] for (k = i + 1; k <= 9; k ++) { if ((j & (1 << k)) != 0) { smv.ucRookCap[0] = RANK_DISP(k + RANK_TOP); sms.wRookCap |= 1 << k; break; } smv.ucNonCap[0] = RANK_DISP(k + RANK_TOP); sms.wNonCap |= 1 << k; } for (k ++; k <= 9; k ++) { if ((j & (1 << k)) != 0) { smv.ucCannonCap[0] = RANK_DISP(k + RANK_TOP); sms.wCannonCap |= 1 << k; break; } } for (k ++; k <= 9; k ++) { if ((j & (1 << k)) != 0) { smv.ucSuperCap[0] = RANK_DISP(k + RANK_TOP); sms.wSuperCap |= 1 << k; break; } } // 3. ƶĿ...[1] for (k = i - 1; k >= 0; k --) { if ((j & (1 << k)) != 0) { smv.ucRookCap[1] = RANK_DISP(k + RANK_TOP); sms.wRookCap |= 1 << k; break; } smv.ucNonCap[1] = RANK_DISP(k + RANK_TOP); sms.wNonCap |= 1 << k; } for (k --; k >= 0; k --) { if ((j & (1 << k)) != 0) { smv.ucCannonCap[1] = RANK_DISP(k + RANK_TOP); sms.wCannonCap |= 1 << k; break; } } for (k --; k >= 0; k --) { if ((j & (1 << k)) != 0) { smv.ucSuperCap[1] = RANK_DISP(k + RANK_TOP); sms.wSuperCap |= 1 << k; break; } } // 4. Ϊ"smv""sms"ֵ __ASSERT_BOUND_2(3, smv.ucNonCap[1] >> 4, smv.ucNonCap[0] >> 4, 12); __ASSERT_BOUND_2(3, smv.ucRookCap[1] >> 4, smv.ucRookCap[0] >> 4, 12); __ASSERT_BOUND_2(3, smv.ucCannonCap[1] >> 4, smv.ucCannonCap[0] >> 4, 12); __ASSERT_BOUND_2(3, smv.ucSuperCap[1] >> 4, smv.ucSuperCap[0] >> 4, 12); __ASSERT_BITFILE(sms.wNonCap); __ASSERT_BITFILE(sms.wRookCap); __ASSERT_BITFILE(sms.wCannonCap); __ASSERT_BITFILE(sms.wSuperCap); // 5. ʱ"smv""sms"ŷԤ PreGen.smvFileMoveTab[i][j] = smv; PreGen.smsFileMaskTab[i][j] = sms; } } // ŷԤ飬ͬԤ for (sqSrc = 0; sqSrc < 256; sqSrc ++) { if (IN_BOARD(sqSrc)) { // ˧()ŷԤ n = 0; for (i = 0; i < 4; i ++) { sqDst = sqSrc + cnKingMoveTab[i]; if (IN_FORT(sqDst)) { PreGen.ucsqKingMoves[sqSrc][n] = sqDst; n ++; } } __ASSERT(n <= 4); PreGen.ucsqKingMoves[sqSrc][n] = 0; // (ʿ)ŷԤ n = 0; for (i = 0; i < 4; i ++) { sqDst = sqSrc + cnAdvisorMoveTab[i]; if (IN_FORT(sqDst)) { PreGen.ucsqAdvisorMoves[sqSrc][n] = sqDst; n ++; } } __ASSERT(n <= 4); PreGen.ucsqAdvisorMoves[sqSrc][n] = 0; // ()ŷԤ飬 n = 0; for (i = 0; i < 4; i ++) { sqDst = sqSrc + cnBishopMoveTab[i]; if (IN_BOARD(sqDst) && SAME_HALF(sqSrc, sqDst)) { PreGen.ucsqBishopMoves[sqSrc][n] = sqDst; PreGen.ucsqBishopPins[sqSrc][n] = BISHOP_PIN(sqSrc, sqDst); n ++; } } __ASSERT(n <= 4); PreGen.ucsqBishopMoves[sqSrc][n] = 0; // ŷԤ飬 n = 0; for (i = 0; i < 8; i ++) { sqDst = sqSrc + cnKnightMoveTab[i]; if (IN_BOARD(sqDst)) { PreGen.ucsqKnightMoves[sqSrc][n] = sqDst; PreGen.ucsqKnightPins[sqSrc][n] = KNIGHT_PIN(sqSrc, sqDst); n ++; } } __ASSERT(n <= 8); PreGen.ucsqKnightMoves[sqSrc][n] = 0; // ɱ()ŷԤ for (i = 0; i < 2; i ++) { n = 0; sqDst = SQUARE_FORWARD(sqSrc, i); sqDst = sqSrc + (i == 0 ? -16 : 16); if (IN_BOARD(sqDst)) { PreGen.ucsqPawnMoves[i][sqSrc][n] = sqDst; n ++; } if (AWAY_HALF(sqSrc, i)) { for (j = -1; j <= 1; j += 2) { sqDst = sqSrc + j; if (IN_BOARD(sqDst)) { PreGen.ucsqPawnMoves[i][sqSrc][n] = sqDst; n ++; } } } __ASSERT(n <= 3); PreGen.ucsqPawnMoves[i][sqSrc][n] = 0; } } } // վԤ۽ṹ memset(&PreEval, 0, sizeof(PreEvalStruct)); PreEval.bPromotion = false; // ȱʡDz } gmchess-0.29.6.3/src/engine/pregen.h000066400000000000000000000157671323660377300171210ustar00rootroot00000000000000/* pregen.h/pregen.cpp - Source Code for ElephantEye, Part II ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.0, Last Modified: Nov. 2007 Copyright (C) 2004-2007 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "base.h" #include "rc4prng.h" #ifndef PREGEN_H #define PREGEN_H #define __ASSERT_PIECE(pc) __ASSERT((pc) >= 16 && (pc) <= 47) #define __ASSERT_SQUARE(sq) __ASSERT(IN_BOARD(sq)) #define __ASSERT_BITRANK(w) __ASSERT((w) < (1 << 9)) #define __ASSERT_BITFILE(w) __ASSERT((w) < (1 << 10)) const int RANK_TOP = 3; const int RANK_BOTTOM = 12; const int FILE_LEFT = 3; const int FILE_CENTER = 7; const int FILE_RIGHT = 11; extern const bool cbcInBoard[256]; // extern const bool cbcInFort[256]; // dz extern const bool cbcCanPromote[256]; // extern const int8_t ccLegalSpanTab[512]; // ŷȱ extern const int8_t ccKnightPinTab[512]; // ȱ inline bool IN_BOARD(int sq) { return cbcInBoard[sq]; } inline bool IN_FORT(int sq) { return cbcInFort[sq]; } inline bool CAN_PROMOTE(int sq) { return cbcCanPromote[sq]; } inline int8_t LEGAL_SPAN_TAB(int nDisp) { return ccLegalSpanTab[nDisp]; } inline int8_t KNIGHT_PIN_TAB(int nDisp) { return ccKnightPinTab[nDisp]; } inline int RANK_Y(int sq) { return sq >> 4; } inline int FILE_X(int sq) { return sq & 15; } inline int COORD_XY(int x, int y) { return x + (y << 4); } inline int SQUARE_FLIP(int sq) { return 254 - sq; } inline int FILE_FLIP(int x) { return 14 - x; } inline int RANK_FLIP(int y) { return 15 - y; } inline int OPP_SIDE(int sd) { return 1 - sd; } inline int SQUARE_FORWARD(int sq, int sd) { return sq - 16 + (sd << 5); } inline int SQUARE_BACKWARD(int sq, int sd) { return sq + 16 - (sd << 5); } inline bool KING_SPAN(int sqSrc, int sqDst) { return LEGAL_SPAN_TAB(sqDst - sqSrc + 256) == 1; } inline bool ADVISOR_SPAN(int sqSrc, int sqDst) { return LEGAL_SPAN_TAB(sqDst - sqSrc + 256) == 2; } inline bool BISHOP_SPAN(int sqSrc, int sqDst) { return LEGAL_SPAN_TAB(sqDst - sqSrc + 256) == 3; } inline int BISHOP_PIN(int sqSrc, int sqDst) { return (sqSrc + sqDst) >> 1; } inline int KNIGHT_PIN(int sqSrc, int sqDst) { return sqSrc + KNIGHT_PIN_TAB(sqDst - sqSrc + 256); } inline bool WHITE_HALF(int sq) { return (sq & 0x80) != 0; } inline bool BLACK_HALF(int sq) { return (sq & 0x80) == 0; } inline bool HOME_HALF(int sq, int sd) { return (sq & 0x80) != (sd << 7); } inline bool AWAY_HALF(int sq, int sd) { return (sq & 0x80) == (sd << 7); } inline bool SAME_HALF(int sqSrc, int sqDst) { return ((sqSrc ^ sqDst) & 0x80) == 0; } inline bool DIFF_HALF(int sqSrc, int sqDst) { return ((sqSrc ^ sqDst) & 0x80) != 0; } inline int RANK_DISP(int y) { return y << 4; } inline int FILE_DISP(int x) { return x; } // λС͡λСɳŷԤýṹ struct SlideMoveStruct { uint8_t ucNonCap[2]; // ߵһ/Сһ uint8_t ucRookCap[2]; // ߵһ/Сһ uint8_t ucCannonCap[2]; // ڳߵһ/Сһ uint8_t ucSuperCap[2]; // (ӳ)ߵһ/Сһ }; // smv // λС͡λСжϳŷԵԤýṹ struct SlideMaskStruct { uint16_t wNonCap, wRookCap, wCannonCap, wSuperCap; }; // sms struct ZobristStruct { uint32_t dwKey, dwLock0, dwLock1; void InitZero(void) { dwKey = dwLock0 = dwLock1 = 0; } void InitRC4(RC4Struct &rc4) { dwKey = rc4.NextLong(); dwLock0 = rc4.NextLong(); dwLock1 = rc4.NextLong(); } void Xor(const ZobristStruct &zobr) { dwKey ^= zobr.dwKey; dwLock0 ^= zobr.dwLock0; dwLock1 ^= zobr.dwLock1; } void Xor(const ZobristStruct &zobr1, const ZobristStruct &zobr2) { dwKey ^= zobr1.dwKey ^ zobr2.dwKey; dwLock0 ^= zobr1.dwLock0 ^ zobr2.dwLock0; dwLock1 ^= zobr1.dwLock1 ^ zobr2.dwLock1; } }; // zobr extern struct PreGenStruct { // ZobristֵZobristֵZobristУ ZobristStruct zobrPlayer; ZobristStruct zobrTable[14][256]; uint16_t wBitRankMask[256]; // ÿӵλеλ uint16_t wBitFileMask[256]; // ÿӵλеλ /* λС͡λСɳŷжϳŷԵԤ * * λС͡λСElephantEyeĺļڵŷɡжϺ; * Գʼ췽ұߵڸежΪȱ֪еġλС"1010000101b" * ElephantEyeԤ飬"...MoveTab""...MaskTab"÷ֱǣ * һҪ֪ǰӵĿ(ʼ2Ŀ9)ôϣ֪ӣ * Ԥһ"FileMoveTab_CannonCap[10][1024]"ʹ"FileMoveTab_CannonCap[2][1010000101b] == 9"Ϳˡ * ҪжϸܷԵĿ(ͬʼ2Ŀ9Ϊ)ôҪ֪ĿλУ"0000000001b" * ֻҪ"...MoveTab"ĸԡλʽ¼"...MaskTab"Ϳˣá롱жܷԵĿ * ͨһ"...MaskTab"ԪλжܷԵͬлͬеijʱֻҪһжϾͿˡ */ SlideMoveStruct smvRankMoveTab[9][512]; // 36,864 ֽ SlideMoveStruct smvFileMoveTab[10][1024]; // 81,920 ֽ SlideMaskStruct smsRankMaskTab[9][512]; // 36,864 ֽ SlideMaskStruct smsFileMaskTab[10][1024]; // 81,920 ֽ // : 237,568 ֽ /* (ʺáλС͡λС)ŷԤ * * ⲿϵġŷԤɡ飬ԸijӵʼֱӲ飬õеĿ * ʹʱԸʼȷһָ"g_...Moves[Square]"ָָһϵĿ0 * Ϊ˶ַ[256][n]n4ıұn(Ϊ˽ʶ0)ۺ顣 */ uint8_t ucsqKingMoves[256][8]; uint8_t ucsqAdvisorMoves[256][8]; uint8_t ucsqBishopMoves[256][8]; uint8_t ucsqBishopPins[256][4]; uint8_t ucsqKnightMoves[256][12]; uint8_t ucsqKnightPins[256][8]; uint8_t ucsqPawnMoves[2][256][4]; } PreGen; // Ԥ۽ṹ extern struct PreEvalStruct { bool bPromotion; int vlAdvanced; uint8_t ucvlWhitePieces[7][256]; uint8_t ucvlBlackPieces[7][256]; } PreEval; void PreGenInit(void); #endif gmchess-0.29.6.3/src/engine/rc4prng.h000066400000000000000000000023631323660377300172040ustar00rootroot00000000000000#include "base.h" #if defined (__i386__) #include "x86asm.h" #elif defined (__mips__) #include "mips.h" #else #include "mips.h" /*#error "what's your plantform?"*/ #endif #ifndef RC4PRNG_H #define RC4PRNG_H struct RC4Struct { uint8_t s[256]; int x, y; void Init(void *lpKey, int nKeyLen) { int i, j; x = y = j = 0; for (i = 0; i < 256; i ++) { s[i] = i; } for (i = 0; i < 256; i ++) { j = (j + s[i] + ((uint8_t *) lpKey)[i % nKeyLen]) & 255; SWAP(s[i], s[j]); } } void InitZero(void) { uint32_t dwKey; dwKey = 0; Init(&dwKey, 4); } void InitRand(void) { union { uint32_t dw[2]; uint64_t qw; } Seed; timeb tb; ftime(&tb); Seed.qw = TimeStampCounter(); Seed.dw[1] ^= (uint32_t) GetTime(); Init(&Seed, 8); } uint8_t NextByte(void) { x = (x + 1) & 255; y = (y + s[x]) & 255; SWAP(s[x], s[y]); return s[(s[x] + s[y]) & 255]; } uint32_t NextLong(void) { union { uint8_t uc[4]; uint32_t dw; } Ret; Ret.uc[0] = NextByte(); Ret.uc[1] = NextByte(); Ret.uc[2] = NextByte(); Ret.uc[3] = NextByte(); return Ret.dw; } }; #endif gmchess-0.29.6.3/src/engine/search.cpp000066400000000000000000000610731323660377300174300ustar00rootroot00000000000000/* search.h/search.cpp - Source Code for ElephantEye, Part VIII ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.15, Last Modified: Jul. 2008 Copyright (C) 2004-2008 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "base2.h" #include "ucci.h" #include "pregen.h" #include "position.h" #include "hash.h" #include "book.h" #include "movesort.h" #include "search.h" const int IID_DEPTH = 2; // ڲ const int SMP_DEPTH = 6; // const int UNCHANGED_DEPTH = 4; // δıŷ const int DROPDOWN_VALUE = 20; // ķֵ const int RESIGN_VALUE = 300; // ķֵ const int DRAW_OFFER_VALUE = 40; // ͵ķֵ SearchStruct Search; // ϢǷװģڲ static struct { int64_t llTime; // ʱ bool bStop, bPonderStop; // ֹźźͺ̨˼Ϊֹź bool bPopPv, bPopCurrMove; // Ƿpvcurrmove int nPopDepth, vlPopValue; // Ⱥͷֵ int nAllNodes, nMainNodes; // ܽĽ int nUnchanged; // δıŷ uint16_t wmvPvLine[MAX_MOVE_NUM]; // Ҫ·ϵŷб uint16_t wmvKiller[LIMIT_DEPTH][2]; // ɱŷ MoveSortStruct MoveSort; // ŷ } Search2; void BuildPos(PositionStruct &pos, const UcciCommStruct &UcciComm) { int i, mv; pos.FromFen(UcciComm.szFenStr); for (i = 0; i < UcciComm.nMoveNum; i ++) { mv = COORD_MOVE(UcciComm.lpdwMovesCoord[i]); if (mv == 0) { break; } if (pos.ucpcSquares[SRC(mv)] == 0) { break; } pos.MakeMove(mv); } } // ж static bool Interrupt(void) { UcciCommStruct UcciComm; PositionStruct posProbe; if (Search.bIdle) { Idle(); } switch (Search.nGoMode) { case GO_MODE_NODES: if (Search2.nAllNodes > Search.nNodes) { Search2.bStop = true; return true; } break; case GO_MODE_TIMER: if (!Search.bPonder && (int) (GetTime() - Search2.llTime) > Search.nMaxTimer) { Search2.bStop = true; return true; } break; default: break; } if (Search.bBatch) { return false; } // ģʽôȵUCCIͳжǷֹ switch (BusyLine(UcciComm, Search.bDebug)) { case UCCI_COMM_ISREADY: // "isready"ָʵû printf("readyok\n"); fflush(stdout); return false; case UCCI_COMM_PONDERHIT: // "ponderhit"ָʱܣ"SearchMain()"ΪѾ㹻ʱ䣬 ôֹź if (Search2.bPonderStop) { Search2.bStop = true; return true; } else { Search.bPonder = false; return false; } case UCCI_COMM_PONDERHIT_DRAW: // "ponderhit draw"ָʱܣͱ־ Search.bDraw = true; if (Search2.bPonderStop) { Search2.bStop = true; return true; } else { Search.bPonder = false; return false; } case UCCI_COMM_STOP: // "stop"ָֹź Search2.bStop = true; return true; case UCCI_COMM_PROBE: // "probe"ָHashϢ BuildPos(posProbe, UcciComm); PopHash(posProbe); return false; case UCCI_COMM_QUIT: // "quit"ָ˳ź Search.bQuit = Search2.bStop = true; return true; default: return false; } } // Ҫ static void PopPvLine(int nDepth = 0, int vl = 0) { uint16_t *lpwmv; uint32_t dwMoveStr; // δﵽҪȣô¼ȺͷֵԺ if (nDepth > 0 && !Search2.bPopPv && !Search.bDebug) { Search2.nPopDepth = nDepth; Search2.vlPopValue = vl; return; } // ʱ printf("info time %d nodes %d\n", (int) (GetTime() - Search2.llTime), Search2.nAllNodes); fflush(stdout); if (nDepth == 0) { // Ѿô if (Search2.nPopDepth == 0) { return; } // ȡǰûȺͷֵ nDepth = Search2.nPopDepth; vl = Search2.vlPopValue; } else { // ﵽҪȣôԺ󲻱 Search2.nPopDepth = Search2.vlPopValue = 0; } printf("info depth %d score %d pv", nDepth, vl); lpwmv = Search2.wmvPvLine; while (*lpwmv != 0) { dwMoveStr = MOVE_COORD(*lpwmv); printf(" %.4s", (const char *) &dwMoveStr); lpwmv ++; } printf("\n"); fflush(stdout); } // ޺ü static int HarmlessPruning(const PositionStruct &pos, int vlBeta) { int vl, vlRep; // 1. ɱ岽ü vl = pos.nDistance - MATE_VALUE; if (vl >= vlBeta) { return vl; } // 2. ü if (pos.IsDraw()) { return 0; // ȫﲻ"pos.DrawValue()"; } // 3. ظü vlRep = pos.RepStatus(); if (vlRep > 0) { return pos.RepValue(vlRep); } return -MATE_VALUE; } // ;ۺ inline int Evaluate(const PositionStruct &pos, int vlAlpha, int vlBeta) { int vl; vl = Search.bKnowledge ? Search.Evaluate(&pos, vlAlpha, vlBeta) : pos.Material(); return vl == pos.DrawValue() ? vl - 1 : vl; } // ̬ static int SearchQuiesc(PositionStruct &pos, int vlAlpha, int vlBeta) { int vlBest, vl, mv; bool bInCheck; MoveSortStruct MoveSort; // ̬̰¼裺 Search2.nAllNodes ++; // 1. ޺ü vl = HarmlessPruning(pos, vlBeta); if (vl > -MATE_VALUE) { return vl; } #ifdef HASH_QUIESC // 3. ûü vl = ProbeHashQ(pos, vlAlpha, vlBeta); if (Search.bUseHash && vl > -MATE_VALUE) { return vl; } #endif // 3-a. ɱ(ûһûԷ򷵻ʤֵ) if (Search.bAlwaysCheck && pos.LastMove().ChkChs <= 0 && pos.rbsList[pos.nMoveNum - 2].mvs.ChkChs <= 0) { return MATE_VALUE - pos.nDistance; } // 4. ﵽȣֱӷֵ if (pos.nDistance == LIMIT_DEPTH) { return Evaluate(pos, vlAlpha, vlBeta); } __ASSERT(Search.pos.nDistance < LIMIT_DEPTH); // 5. ʼ vlBest = -MATE_VALUE; bInCheck = (pos.LastMove().ChkChs > 0); // 6. ڱľ棬ȫŷ if (bInCheck) { MoveSort.InitAll(pos); } else { // 7. δľ棬ŷǰȳԿ()Ծۣ vl = Evaluate(pos, vlAlpha, vlBeta); __ASSERT_BOUND(1 - WIN_VALUE, vl, WIN_VALUE - 1); __ASSERT(vl > vlBest); if (vl >= vlBeta) { #ifdef HASH_QUIESC RecordHashQ(pos, vl, MATE_VALUE); #endif return vl; } vlBest = vl; vlAlpha = MAX(vl, vlAlpha); // 8. δľ棬ɲгŷ(MVV(LVA)) MoveSort.InitQuiesc(pos); } // 9. Alpha-Beta㷨Щŷ while ((mv = MoveSort.NextQuiesc(bInCheck)) != 0) { __ASSERT(bInCheck || pos.ucpcSquares[DST(mv)] > 0); if (pos.MakeMove(mv)) { vl = -SearchQuiesc(pos, -vlBeta, -vlAlpha); pos.UndoMakeMove(); if (vl > vlBest) { if (vl >= vlBeta) { #ifdef HASH_QUIESC if (vl > -WIN_VALUE && vl < WIN_VALUE) { RecordHashQ(pos, vl, MATE_VALUE); } #endif return vl; } vlBest = vl; vlAlpha = MAX(vl, vlAlpha); } } } // 10. طֵ if (vlBest == -MATE_VALUE) { __ASSERT(pos.IsMate()); return pos.nDistance - MATE_VALUE; } else { #ifdef HASH_QUIESC if (vlBest > -WIN_VALUE && vlBest < WIN_VALUE) { RecordHashQ(pos, vlBest > vlAlpha ? vlBest : -MATE_VALUE, vlBest); } #endif return vlBest; } } // UCCI֧ - ҶӽľϢ void PopLeaf(PositionStruct &pos) { int vl; Search2.nAllNodes = 0; vl = SearchQuiesc(pos, -MATE_VALUE, MATE_VALUE); printf("pophash lowerbound %d depth 0 upperbound %d depth 0\n", vl, vl); fflush(stdout); } const bool NO_NULL = true; // "SearchCut()"IJǷֹŲü // 㴰ȫ static int SearchCut(int vlBeta, int nDepth, bool bNoNull = false) { int nNewDepth, vlBest, vl; int mvHash, mv, mvEvade; MoveSortStruct MoveSort; // ȫ̰¼裺 // 1. Ҷӽ㴦þ̬ if (nDepth <= 0) { __ASSERT(nDepth >= -NULL_DEPTH); return SearchQuiesc(Search.pos, vlBeta - 1, vlBeta); } Search2.nAllNodes ++; // 2. ޺ü vl = HarmlessPruning(Search.pos, vlBeta); if (vl > -MATE_VALUE) { return vl; } // 3. ûü vl = ProbeHash(Search.pos, vlBeta - 1, vlBeta, nDepth, bNoNull, mvHash); if (Search.bUseHash && vl > -MATE_VALUE) { return vl; } // 3-a. ɱ(ûһûԷ򷵻ʤֵ) if (Search.bAlwaysCheck && Search.pos.LastMove().ChkChs <= 0 && Search.pos.rbsList[Search.pos.nMoveNum - 2].mvs.ChkChs <= 0) { return MATE_VALUE - Search.pos.nDistance; } // 4. ﵽȣֱӷֵ if (Search.pos.nDistance == LIMIT_DEPTH) { return Evaluate(Search.pos, vlBeta - 1, vlBeta); } __ASSERT(Search.pos.nDistance < LIMIT_DEPTH); // 5. жϵã Search2.nMainNodes ++; vlBest = -MATE_VALUE; if ((Search2.nMainNodes & Search.nCountMask) == 0 && Interrupt()) { return vlBest; } // 6. ԿŲü if (Search.bNullMove && !bNoNull && Search.pos.LastMove().ChkChs <= 0 && Search.pos.NullOkay()) { Search.pos.NullMove(); vl = -SearchCut(1 - vlBeta, nDepth - NULL_DEPTH - 1, NO_NULL); Search.pos.UndoNullMove(); if (vl >= vlBeta) { if (Search.pos.NullSafe()) { // a. Ųü飬ô¼Ϊ(NULL_DEPTH + 1) RecordHash(Search.pos, HASH_BETA, vl, MAX(nDepth, NULL_DEPTH + 1), 0); return vl; } else if (SearchCut(vlBeta, nDepth - NULL_DEPTH, NO_NULL) >= vlBeta) { // b. Ųü飬ô¼Ϊ(NULL_DEPTH) RecordHash(Search.pos, HASH_BETA, vl, MAX(nDepth, NULL_DEPTH), 0); return vl; } } } // 7. ʼ if (Search.pos.LastMove().ChkChs > 0) { // ǽ棬ôӦŷ mvEvade = MoveSort.InitEvade(Search.pos, mvHash, Search2.wmvKiller[Search.pos.nDistance]); } else { // ǽ棬ôʹŷб MoveSort.InitFull(Search.pos, mvHash, Search2.wmvKiller[Search.pos.nDistance]); mvEvade = 0; } // 8. "MoveSortStruct::NextFull()"̵ŷ˳һ while ((mv = MoveSort.NextFull(Search.pos)) != 0) { if (Search.pos.MakeMove(mv)) { // 9. ѡ죻 nNewDepth = (Search.pos.LastMove().ChkChs > 0 || mvEvade != 0 ? nDepth : nDepth - 1); // 10. 㴰 vl = -SearchCut(1 - vlBeta, nNewDepth); Search.pos.UndoMakeMove(); if (Search2.bStop) { return vlBest; } // 11. ضж if (vl > vlBest) { vlBest = vl; if (vl >= vlBeta) { RecordHash(Search.pos, HASH_BETA, vlBest, nDepth, mv); if (!MoveSort.GoodCap(Search.pos, mv)) { SetBestMove(mv, nDepth, Search2.wmvKiller[Search.pos.nDistance]); } return vlBest; } } } } // 12. ضϴʩ if (vlBest == -MATE_VALUE) { __ASSERT(Search.pos.IsMate()); return Search.pos.nDistance - MATE_VALUE; } else { RecordHash(Search.pos, HASH_ALPHA, vlBest, nDepth, mvEvade); return vlBest; } } // Ҫ static void AppendPvLine(uint16_t *lpwmvDst, uint16_t mv, const uint16_t *lpwmvSrc) { *lpwmvDst = mv; lpwmvDst ++; while (*lpwmvSrc != 0) { *lpwmvDst = *lpwmvSrc; lpwmvSrc ++; lpwmvDst ++; } *lpwmvDst = 0; } /* Ҫọ̈̄㴰ȫ¼㣺 * * 1. ڲ * 2. ʹиӰIJü * 3. Alpha-Beta߽жӣ * 4. PVҪȡҪ * 5. PV㴦ŷ */ static int SearchPV(int vlAlpha, int vlBeta, int nDepth, uint16_t *lpwmvPvLine) { int nNewDepth, nHashFlag, vlBest, vl; int mvBest, mvHash, mv, mvEvade; MoveSortStruct MoveSort; uint16_t wmvPvLine[LIMIT_DEPTH]; // ȫ̰¼裺 // 1. Ҷӽ㴦þ̬ *lpwmvPvLine = 0; if (nDepth <= 0) { __ASSERT(nDepth >= -NULL_DEPTH); return SearchQuiesc(Search.pos, vlAlpha, vlBeta); } Search2.nAllNodes ++; // 2. ޺ü vl = HarmlessPruning(Search.pos, vlBeta); if (vl > -MATE_VALUE) { return vl; } // 3. ûü vl = ProbeHash(Search.pos, vlAlpha, vlBeta, nDepth, NO_NULL, mvHash); if (Search.bUseHash && vl > -MATE_VALUE) { // PV㲻ûüԲᷢPV·жϵ return vl; } // 3-a. ɱ(ûһûԷ򷵻ʤֵ) if (Search.bAlwaysCheck && Search.pos.LastMove().ChkChs <= 0 && Search.pos.rbsList[Search.pos.nMoveNum - 2].mvs.ChkChs <= 0) { return MATE_VALUE - Search.pos.nDistance; } // 4. ﵽȣֱӷֵ __ASSERT(Search.pos.nDistance > 0); if (Search.pos.nDistance == LIMIT_DEPTH) { return Evaluate(Search.pos, vlAlpha, vlBeta); } __ASSERT(Search.pos.nDistance < LIMIT_DEPTH); // 5. жϵã Search2.nMainNodes ++; vlBest = -MATE_VALUE; if ((Search2.nMainNodes & Search.nCountMask) == 0 && Interrupt()) { return vlBest; } // 6. ڲ if (nDepth > IID_DEPTH && mvHash == 0) { __ASSERT(nDepth / 2 <= nDepth - IID_DEPTH); vl = SearchPV(vlAlpha, vlBeta, nDepth / 2, wmvPvLine); if (vl <= vlAlpha) { vl = SearchPV(-MATE_VALUE, vlBeta, nDepth / 2, wmvPvLine); } if (Search2.bStop) { return vlBest; } mvHash = wmvPvLine[0]; } // 7. ʼ mvBest = 0; nHashFlag = HASH_ALPHA; if (Search.pos.LastMove().ChkChs > 0) { // ǽ棬ôӦŷ mvEvade = MoveSort.InitEvade(Search.pos, mvHash, Search2.wmvKiller[Search.pos.nDistance]); } else { // ǽ棬ôʹŷб MoveSort.InitFull(Search.pos, mvHash, Search2.wmvKiller[Search.pos.nDistance]); mvEvade = 0; } // 8. "MoveSortStruct::NextFull()"̵ŷ˳һ while ((mv = MoveSort.NextFull(Search.pos)) != 0) { if (Search.pos.MakeMove(mv)) { // 9. ѡ죻 nNewDepth = (Search.pos.LastMove().ChkChs > 0 || mvEvade != 0 ? nDepth : nDepth - 1); // 10. Ҫ if (vlBest == -MATE_VALUE) { vl = -SearchPV(-vlBeta, -vlAlpha, nNewDepth, wmvPvLine); } else { vl = -SearchCut(-vlAlpha, nNewDepth); if (vl > vlAlpha && vl < vlBeta) { vl = -SearchPV(-vlBeta, -vlAlpha, nNewDepth, wmvPvLine); } } Search.pos.UndoMakeMove(); if (Search2.bStop) { return vlBest; } // 11. Alpha-Beta߽ж if (vl > vlBest) { vlBest = vl; if (vl >= vlBeta) { mvBest = mv; nHashFlag = HASH_BETA; break; } if (vl > vlAlpha) { vlAlpha = vl; mvBest = mv; nHashFlag = HASH_PV; AppendPvLine(lpwmvPvLine, mv, wmvPvLine); } } } } // 12. ûʷɱŷ if (vlBest == -MATE_VALUE) { __ASSERT(Search.pos.IsMate()); return Search.pos.nDistance - MATE_VALUE; } else { RecordHash(Search.pos, nHashFlag, vlBest, nDepth, mvEvade == 0 ? mvBest : mvEvade); if (mvBest != 0 && !MoveSort.GoodCap(Search.pos, mvBest)) { SetBestMove(mvBest, nDepth, Search2.wmvKiller[Search.pos.nDistance]); } return vlBest; } } /* ̣ȫ¼㣺 * * 1. ʡ޺ü(Ҳȡûŷ) * 2. ʹÿŲü * 3. ѡֻʹý죻 * 4. ˵ֹŷ * 5. ŷʱҪܶദ(¼Ҫ) * 6. ʷɱŷ */ static int SearchRoot(int nDepth) { int nNewDepth, vlBest, vl, mv; uint32_t dwMoveStr; uint16_t wmvPvLine[LIMIT_DEPTH]; // ̰¼裺 // 1. ʼ vlBest = -MATE_VALUE; Search2.MoveSort.ResetRoot(); // 2. һÿŷ(Ҫ˽ֹŷ) while ((mv = Search2.MoveSort.NextRoot()) != 0) { if (Search.pos.MakeMove(mv)) { if (Search2.bPopCurrMove || Search.bDebug) { dwMoveStr = MOVE_COORD(mv); printf("info currmove %.4s\n", (const char *) &dwMoveStr); fflush(stdout); } // 3. ѡ(ֻǽ) nNewDepth = (Search.pos.LastMove().ChkChs > 0 ? nDepth : nDepth - 1); // 4. Ҫ if (vlBest == -MATE_VALUE) { vl = -SearchPV(-MATE_VALUE, MATE_VALUE, nNewDepth, wmvPvLine); __ASSERT(vl > vlBest); } else { vl = -SearchCut(-vlBest, nNewDepth); if (vl > vlBest) { // ﲻҪ" && vl < MATE_VALUE" vl = -SearchPV(-MATE_VALUE, -vlBest, nNewDepth, wmvPvLine); } } Search.pos.UndoMakeMove(); if (Search2.bStop) { return vlBest; } // 5. Alpha-Beta߽ж("vlBest""SearchPV()"е"vlAlpha") if (vl > vlBest) { // 6. һŷô"δıŷ"ļ1 Search2.nUnchanged = (vlBest == -MATE_VALUE ? Search2.nUnchanged + 1 : 0); vlBest = vl; // 7. ŷʱ¼Ҫ AppendPvLine(Search2.wmvPvLine, mv, wmvPvLine); PopPvLine(nDepth, vl); // 8. ҪԣAlphaֵҪɱʱ if (vlBest > -WIN_VALUE && vlBest < WIN_VALUE) { vlBest += (Search.rc4Random.NextLong() & Search.nRandomMask) - (Search.rc4Random.NextLong() & Search.nRandomMask); vlBest = (vlBest == Search.pos.DrawValue() ? vlBest - 1 : vlBest); } // 9. ¸ŷб Search2.MoveSort.UpdateRoot(mv); } } } return vlBest; } // ΨһŷElephantEyeϵһɫжijȽеǷҵΨһŷ // ԭǰҵŷɽֹŷȻ(-WIN_VALUE, 1 - WIN_VALUE)Ĵ // ͳ߽˵ŷɱ static bool SearchUnique(int vlBeta, int nDepth) { int vl, mv; Search2.MoveSort.ResetRoot(ROOT_UNIQUE); // һŷ while ((mv = Search2.MoveSort.NextRoot()) != 0) { if (Search.pos.MakeMove(mv)) { vl = -SearchCut(1 - vlBeta, Search.pos.LastMove().ChkChs > 0 ? nDepth : nDepth - 1); Search.pos.UndoMakeMove(); if (Search2.bStop || vl >= vlBeta) { return false; } } } return true; } // void SearchMain(int nDepth) { int i, vl, vlLast, nBookMoves; int nCurrTimer, nLimitTimer; bool bUnique; uint32_t dwMoveStr; MoveStruct mvsBook[MAX_GEN_MOVES]; // ̰¼裺 // 1. ֱӷ if (Search.pos.IsDraw() || Search.pos.RepStatus(3) > 0) { printf("nobestmove\n"); fflush(stdout); return; } // 2. ӿֿŷ if (Search.bUseBook) { // a. ȡֿе߷ nBookMoves = GetBookMoves(Search.pos, Search.szBookFile, mvsBook); if (nBookMoves > 0) { vl = 0; for (i = 0; i < nBookMoves; i ++) { vl += mvsBook[i].wvl; dwMoveStr = MOVE_COORD(mvsBook[i].wmv); printf("info depth 0 score %d pv %.4s\n", mvsBook[i].wvl, (const char *) &dwMoveStr); fflush(stdout); } // b. Ȩѡһ߷ vl = Search.rc4Random.NextLong() % (uint32_t) vl; for (i = 0; i < nBookMoves; i ++) { vl -= mvsBook[i].wvl; if (vl < 0) { break; } } __ASSERT(vl < 0); __ASSERT(i < nBookMoves); // c. ֿеŷѭ棬ôŷ Search.pos.MakeMove(mvsBook[i].wmv); if (Search.pos.RepStatus(3) == 0) { dwMoveStr = MOVE_COORD(mvsBook[i].wmv); printf("bestmove %.4s", (const char *) &dwMoveStr); // d. ̨˼ŷ(ֿеһȨĺŷ) nBookMoves = GetBookMoves(Search.pos, Search.szBookFile, mvsBook); Search.pos.UndoMakeMove(); if (nBookMoves > 0) { dwMoveStr = MOVE_COORD(mvsBook[0].wmv); printf(" ponder %.4s", (const char *) &dwMoveStr); } printf("\n"); fflush(stdout); return; } Search.pos.UndoMakeMove(); } } // 3. Ϊ򷵻ؾֵ̬ if (nDepth == 0) { printf("info depth 0 score %d\n", SearchQuiesc(Search.pos, -MATE_VALUE, MATE_VALUE)); fflush(stdout); printf("nobestmove\n"); fflush(stdout); return; } // 4. ɸÿŷ Search2.MoveSort.InitRoot(Search.pos, Search.nBanMoves, Search.wmvBanList); // 5. ʼʱͼ Search2.bStop = Search2.bPonderStop = Search2.bPopPv = Search2.bPopCurrMove = false; Search2.nPopDepth = Search2.vlPopValue = 0; Search2.nAllNodes = Search2.nMainNodes = Search2.nUnchanged = 0; Search2.wmvPvLine[0] = 0; ClearKiller(Search2.wmvKiller); ClearHistory(); ClearHash(); // ClearHash() Ҫһʱ䣬ԼʱԺʼȽϺ Search2.llTime = GetTime(); vlLast = 0; // 10غŷôͣԺÿ8غһ if (Search.pos.nMoveNum > 5 && ((Search.pos.nMoveNum - 4) / 2) % 8 == 0) { Search.bDraw = true; } bUnique = false; nCurrTimer = 0; // 6. for (i = 1; i <= nDepth; i ++) { // ҪҪʱһ"info depth n"Dz if (Search2.bPopPv || Search.bDebug) { printf("info depth %d\n", i); fflush(stdout); } // 7. ʱǷҪҪ͵ǰ˼ŷ Search2.bPopPv = (nCurrTimer > 300); Search2.bPopCurrMove = (nCurrTimer > 3000); // 8. vl = SearchRoot(i); if (Search2.bStop) { if (vl > -MATE_VALUE) { vlLast = vl; // vlLastжͶҪһֵ } break; // û"vl"ǿɿֵ } nCurrTimer = (int) (GetTime() - Search2.llTime); // 9. ʱ䳬ʵʱޣֹ if (Search.nGoMode == GO_MODE_TIMER) { // a. ûʹÿŲüôʵʱ޼(Ϊ֦Ӽӱ) nLimitTimer = (Search.bNullMove ? Search.nProperTimer : Search.nProperTimer / 2); // b. ǰֵûǰһܶ࣬ôʵʱ޼ nLimitTimer = (vl + DROPDOWN_VALUE >= vlLast ? nLimitTimer / 2 : nLimitTimer); // c. ŷûб仯ôʵʱ޼ nLimitTimer = (Search2.nUnchanged >= UNCHANGED_DEPTH ? nLimitTimer / 2 : nLimitTimer); if (nCurrTimer > nLimitTimer) { if (Search.bPonder) { Search2.bPonderStop = true; // ں̨˼ģʽôֻں̨˼кֹ } else { vlLast = vl; break; // Ƿ"vlLast"Ѹ } } } vlLast = vl; // 10. ɱֹ if (vlLast > WIN_VALUE || vlLast < -WIN_VALUE) { break; } // 11. Ψһŷֹ if (SearchUnique(1 - WIN_VALUE, i)) { bUnique = true; break; } } // 12. ŷӦ(Ϊ̨˼IJ²ŷ) if (Search2.wmvPvLine[0] != 0) { PopPvLine(); dwMoveStr = MOVE_COORD(Search2.wmvPvLine[0]); printf("bestmove %.4s", (const char *) &dwMoveStr); if (Search2.wmvPvLine[1] != 0) { dwMoveStr = MOVE_COORD(Search2.wmvPvLine[1]); printf(" ponder %.4s", (const char *) &dwMoveStr); } // 13. жǷͣǾΨһŷIJʺ(ΪȲ) if (!bUnique) { if (vlLast > -WIN_VALUE && vlLast < -RESIGN_VALUE) { printf(" resign"); } else if (Search.bDraw && !Search.pos.NullSafe() && vlLast < DRAW_OFFER_VALUE * 2) { printf(" draw"); } } } else { printf("nobestmove"); } printf("\n"); fflush(stdout); } gmchess-0.29.6.3/src/engine/search.h000066400000000000000000000051621323660377300170720ustar00rootroot00000000000000/* search.h/search.cpp - Source Code for ElephantEye, Part VIII ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.15, Last Modified: Jul. 2008 Copyright (C) 2004-2008 www.elephantbase.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "base.h" #include "rc4prng.h" #include "ucci.h" #include "pregen.h" #include "position.h" #ifndef SEARCH_H #define SEARCH_H #ifdef _WIN32 #include #else #define WINAPI #endif // ģʽ const int GO_MODE_INFINITY = 0; const int GO_MODE_NODES = 1; const int GO_MODE_TIMER = 2; // ǰõȫֱָ struct SearchStruct { PositionStruct pos; // дľ bool bQuit, bPonder, bDraw; // Ƿյ˳ָ̨˼ģʽģʽ bool bBatch, bDebug; // Ƿģʽ͵ģʽ bool bUseHash, bUseBook; // ǷʹûüͿֿ bool bNullMove, bKnowledge; // ǷŲüʹþ֪ʶ bool bAlwaysCheck; // Ƿֻ(ɱž) bool bIdle; // Ƿ RC4Struct rc4Random; // int nGoMode, nNodes, nCountMask; // ģʽ int nProperTimer, nMaxTimer; // ƻʹʱ int nRandomMask, nBanMoves; // λͽ uint16_t wmvBanList[MAX_MOVE_NUM]; // б char szBookFile[1024]; // ֿ const char *(WINAPI *GetEngineName)(void); // APIָ void (WINAPI *PreEvaluate)(PositionStruct *, PreEvalStruct *); // ԤAPIָ int (WINAPI *Evaluate)(const PositionStruct *, int, int); // APIָ }; extern SearchStruct Search; // UCCI湹 void BuildPos(PositionStruct &pos, const UcciCommStruct &UcciComm); // UCCI֧ - ҶӽľϢ void PopLeaf(PositionStruct &pos); // void SearchMain(int nDepth); #endif gmchess-0.29.6.3/src/engine/ucci.cpp000066400000000000000000000317151323660377300171060ustar00rootroot00000000000000/* ucci.h/ucci.cpp - Source Code for ElephantEye, Part I ElephantEye - a Chinese Chess Program (UCCI Engine) Designed by Morning Yellow, Version: 3.15, Last Modified: Jul. 2008 Copyright (C) 2004-2008 www.elephantbase.net This part (ucci.h/ucci.cpp only) of codes is NOT published under LGPL, and can be used without restriction. */ #include #include #include #include "base2.h" #include "parse.h" #include "pipe.h" #include "ucci.h" /* UCCI指令分析模块由三各UCCI指令解释器组成。 * * 其中第一个解释器"BootLine()"最简单,只用来接收引擎启动后的第一行指令 * 输入"ucci"时就返回"UCCI_COMM_UCCI",否则一律返回"UCCI_COMM_UNKNOWN" * 前两个解释器都等待是否有输入,如果没有输入则执行待机指令"Idle()" * 而第三个解释器("BusyLine()",只用在引擎思考时)则在没有输入时直接返回"UCCI_COMM_UNKNOWN" */ static PipeStruct pipeStd; const int MAX_MOVE_NUM = 256; static char szFen[LINE_INPUT_MAX_CHAR]; static uint32_t dwCoordList[MAX_MOVE_NUM]; static bool ParsePos(UcciCommStruct &UcciComm, char *lp) { int i; // 首先判断是否指定了FEN串 if (StrEqvSkip(lp, "fen ")) { strcpy(szFen, lp); UcciComm.szFenStr = szFen; // 然后判断是否是startpos } else if (StrEqv(lp, "startpos")) { /* trying to workaround warning for ISO C++ about conversion from non-const * to const char*. */ const std::string fallback_szFenStr = "rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1"; std::vector tmp_szFenStr(fallback_szFenStr.begin(), fallback_szFenStr.end()); tmp_szFenStr.push_back('\0'); UcciComm.szFenStr = &*tmp_szFenStr.begin(); // 如果两者都不是,就立即返回 } else { return false; } // 然后寻找是否指定了后续着法,即是否有"moves"关键字 UcciComm.nMoveNum = 0; if (StrScanSkip(lp, " moves ")) { *(lp - strlen(" moves ")) = '\0'; UcciComm.nMoveNum = MIN((int) (strlen(lp) + 1) / 5, MAX_MOVE_NUM); // 提示:"moves"后面的每个着法都是1个空格和4个字符 for (i = 0; i < UcciComm.nMoveNum; i ++) { dwCoordList[i] = *(uint32_t *) lp; // 4个字符可转换为一个"uint32_t",存储和处理起来方便 lp += sizeof(uint32_t) + 1; } UcciComm.lpdwMovesCoord = dwCoordList; } return true; } UcciCommEnum BootLine(void) { char szLineStr[LINE_INPUT_MAX_CHAR]; pipeStd.Open(); while (!pipeStd.LineInput(szLineStr)) { Idle(); } if (StrEqv(szLineStr, "ucci")) { return UCCI_COMM_UCCI; } else { return UCCI_COMM_UNKNOWN; } } UcciCommEnum IdleLine(UcciCommStruct &UcciComm, bool bDebug) { char szLineStr[LINE_INPUT_MAX_CHAR]; char *lp; int i; bool bGoTime; while (!pipeStd.LineInput(szLineStr)) { Idle(); } lp = szLineStr; if (bDebug) { printf("info idleline [%s]\n", lp); fflush(stdout); } if (false) { // "IdleLine()"是最复杂的UCCI指令解释器,大多数的UCCI指令都由它来解释,包括: // 1. "isready"指令 } else if (StrEqv(lp, "isready")) { return UCCI_COMM_ISREADY; // 2. "setoption